Commit graph

411 commits

Author SHA1 Message Date
Yun Chan
5ca3709b32 feat: add mobile shell and unified search
Some checks failed
ci / 정본·보안·린트·타입·테스트 (push) Failing after 50s
ci / 워크스페이스 빌드 검증 (push) Has been skipped
ci / Supabase Edge Functions + Cloudflare Worker (push) Successful in 20s
ci / .NET API 서버 테스트 (push) Successful in 12s
deploy-site / deploy (push) Successful in 39s
ci / 모바일 린트·타입·Jest (push) Failing after 3h10m31s
2026-09-28 23:23:36 +09:00
Yun Chan
f505a03d34 fix(ci): point release-metadata checks at the relocated update and publish guards
Some checks are pending
ci / 정본·보안·린트·타입·테스트 (push) Waiting to run
ci / 워크스페이스 빌드 검증 (push) Blocked by required conditions
ci / 모바일 린트·타입·Jest (push) Waiting to run
ci / Supabase Edge Functions + Cloudflare Worker (push) Waiting to run
ci / .NET API 서버 테스트 (push) Waiting to run
deploy-site / deploy (push) Waiting to run
CI run 121 failed at "버전·계약 정본 대조": earlier refactors moved update
gating from UpdateService into update-policy.ts (evaluateUpdateOffer ties
decideUpdate + isWithinRollout), the differential-download switch into
update-adapters.ts, and the Forgejo re-release guard into
lib/immutable-package-guard.mjs (sha256 comparison, abort on conflict).
The checks still looked for the old markers in the old files. They now
verify the same guarantees where the code lives, and the self-test's
negative case targets assertNoImmutableConflicts.

Also clears the lint gate: a control-character regex in Keycap (range now
starts at U+0020) and unused helpers in two red-team tests.
2026-09-28 20:55:11 +09:00
Yun Chan
171be8f4e8 docs: record design overhaul waves 2-3 and update feature map
Some checks failed
deploy-site / deploy (push) Waiting to run
ci / 정본·보안·린트·타입·테스트 (push) Failing after 20s
ci / 워크스페이스 빌드 검증 (push) Has been skipped
ci / Supabase Edge Functions + Cloudflare Worker (push) Successful in 29s
ci / .NET API 서버 테스트 (push) Successful in 13s
ci / 모바일 린트·타입·Jest (push) Failing after 3h12m39s
design.md gains the wave 2 (desktop IA) and wave 3 (popups) decisions and
what was deliberately not done. Feature catalog: SHELL-01 settings route,
new SHELL-13 IA, SHELL-14 home, SHELL-15 design system v4. Backlog:
GAP-I18N-02 rows resolved; GAP-UX-01..07 capture the backend follow-ups
reported during the overhaul (meeting notes sync, record query filters,
summary-to-transcript citations, mobile IA, unified search, main-side
cleanups, remaining locales).
2026-09-28 20:46:24 +09:00
Yun Chan
7b1210b5d1 feat(desktop): honest, unified dictation popups with Esc to cancel
Wave 3 of the 2026-09-28 design overhaul.

- Esc (no modifiers) cancels an in-progress dictation, recording or
  processing: VoiceModeService.requestEscape() queues the dead 'escape'
  action. Clicking the capsule cancels only while recording, so a stray
  click during processing no longer throws the text away.
- Errors show in the user's language: bootstrap now passes error.code to
  the tip (the translated branch never ran), and one core classifier
  (voice-error-message) feeds both the tip and the main-window alert.
- Capsule: bars stay flat without input (no fake "alive" wobble before the
  mic opens), an indeterminate bar replaces the made-up percentage, the
  partial transcript stays visible while processing, an Esc hint, and a
  brief "Inserted" state so success is visible.
- All six popups share popups/_shared (Pretendard, one panel radius,
  selection, kbd hints, reduced motion). History/command popups get
  titles, listbox roles and window sizes from popup-list-geometry (empty
  states were clipped); the command popup's "0" key is registered;
  result popup explains why it appeared and can be closed; captions keep
  a theme-independent dark backing on purpose.
- Popup themes follow the OS when set to system and the document lang
  follows the app language.
- Site hero demo mirrors the new capsule (done state, indeterminate bar,
  Esc hint; 10 locales).
2026-09-28 20:46:24 +09:00
Yun Chan
f064c93197 feat(desktop): information architecture overhaul — home, records, meetings first
Wave 2 of the 2026-09-28 design overhaul ("records are the main
character, a quiet instrument"). Decisions: design.md.

- Shell: sidebar with primary Home / Records / Meetings (Ctrl+1..3) and a
  secondary "Tools" group; every item is a button with aria-current.
  The status bar is removed — its "100% LOCAL PRIVACY · ZERO CLOUD SYNC"
  claim contradicted device sync; the sidebar shows only queried state.
- Navigation context (routes, params, back, useRouteRequest) so Home can
  open a specific meeting or record.
- Home replaces the dashboard: dictation key, start actions, only real
  problems, one-line summary, recent records and meetings, file
  transcription, free-tier limits.
- Settings become a full-screen route with vertical tabs (tabs no longer
  clip) and a shared row grammar; long-standing bugs fixed: team and
  enterprise tiers crashed the license tab (currentTier undefined),
  first-run onboarding could not be left, Pro+ saw "upgrade to Pro+".
- Records: date-grouped single list with in-place expansion, search and
  tags together, mode/favorite filters, load more past 50, undoable
  delete. Meetings: list with search/rename/delete, summary-first detail
  (summary | transcript | documents | my notes), notes persisted locally
  instead of being lost. Tools pages cleaned up; stale-closure example
  chips and a 1550x mouse-distance bug fixed.
- Shared pieces: PageHeader, EmptyStateCard, SearchInput ("/" works),
  ConfirmDialog, notify with undo; display-labels maps domain values to
  typed i18n keys so missing keys fail to compile.
- Mono font stack falls back to Pretendard for Hangul (Korean labels no
  longer render spaced out).
- i18n: new ko/en keys via scripts/i18n-add-keys.mjs (one read-merge-
  write so parallel editors cannot clobber locale files).

Some renderer files also carried pre-existing in-flight changes (error
recovery deep links, meeting document hooks); they are included as-is.
2026-09-28 20:46:08 +09:00
Yun Chan
ba9ef9741e fix: red-team round 3 hardening across desktop, mobile, core and server
Batch of red-team r3 fixes that were in the working tree before the
2026-09-28 design overhaul, committed as one unit with their tests.

- desktop main: STT timeouts and sidecar, voice recording store, sync
  (credentials, audio, knowledge reindex, push gates), runtime
  provisioner, update policy, AltGr keybindings, voice-command policy,
  dictionary file codec/limits, meeting transcript condensing and a
  local recording ledger so interrupted-session recovery only closes
  meetings this device recorded (a phone's live meeting is left alone).
- mobile: login CSRF via implicit token callbacks rejected, account
  deletion/retention, durable queue retention, knowledge realtime
  without unfiltered DELETE, meeting re-record failure paths, cloud STT
  client, preferences store/resync.
- core: text chunking splits long unbroken transcripts to fit, template
  field policy, dictionary limits, meeting markdown inline handling.
- server: payple webhook policy and cancellation order scope, meeting
  document generation quota, team RPC null-role guard, unified LLM
  quota in-flight accounting, knowledge chunk vector index, meeting
  re-record failure paths (migrations 20260929*).
- ci: portable/runtime feed gates, update-policy schema, Forgejo file
  delete and alias planning.

Four older tests are updated to the new contracts rather than the old
behavior: token-pair auth callbacks are rejected, knowledge realtime no
longer subscribes to DELETE, long transcript lines are split, and
meeting recovery requires the local recording ledger for empty rows.
2026-09-28 20:45:52 +09:00
Yun Chan
2428ede03d feat(ui): flat "quiet instrument" token v4 with a single raw-value SSOT
- Add theme-raw.ts (no MUI/DOM deps) as the one source of theme values.
  Each theme declares only surfaces, 3-tier text, borders, accent and
  overlay shadow; legacy glass/gradient/glow/crt keys are derived as
  flat values so existing call sites lose effects without edits.
- Tertiary text now clears 4.5:1 on every surface in all six themes
  (label/inactive/dimLabel/muted alias it). Filled buttons use
  accent.solid + accent.ink (5.17:1 on dark/light, was 3.68:1).
- theme-vars.ts derives popup CSS from the same raw values instead of a
  hand copy, and defines the previously undefined --d3-overlay-strong
  and --d3-accent-glow-dim.
- MUI: no ripple, global focus-visible ring and reduced-motion rule,
  flat Card, status colors per theme, shape radius 16 -> 6.
- DS: flatten MetalCard/DoubleBezelCard/ScreenPanel/TiltCard, tone-based
  PhysicalButton (500 weight, no lift), TactileBadge with zero tracking
  and keyboard support, glow-free Led/StatRing, idle wave amplitude 0.
- PhosphorText drops mono/uppercase variants: mono has no Hangul glyphs,
  which spaced out Korean labels.
- design.md: record the 2026-09-28 redesign brief, audit, IA and tokens.
2026-09-28 18:26:03 +09:00
Yun Chan
c3367bc611 refactor(api-client): publish only the shared contract from the root barrel 2026-09-28 02:16:27 +09:00
Yun Chan
6533084a0d fix(ollama): stop pull spinner on failure and only activate pulled models 2026-09-28 02:16:25 +09:00
Yun Chan
ed8b585804 fix(history): call memo tag API with params objects, render stored summary, and cancel stale audio playback 2026-09-28 02:16:25 +09:00
Yun Chan
6347115ae7 fix(meeting): stop transcript view toggle from overwriting edits and repair notes enhancement 2026-09-28 02:16:25 +09:00
Yun Chan
ae2d923b9c fix(mobile-history): keep loaded pages on background refresh and drop stale loadMore pages 2026-09-28 02:16:24 +09:00
Yun Chan
9a5333c617 fix(mobile): replay cold-start notification taps after auth bootstrap 2026-09-28 02:16:24 +09:00
Yun Chan
7a8e1e3e25 fix(mobile-templates): discard the generation idempotency key once the server gives a final answer 2026-09-28 02:16:24 +09:00
Yun Chan
65320288d5 fix(mobile): purge uploaded audio when deleting history or meetings 2026-09-28 02:16:24 +09:00
Yun Chan
5b1621d314 fix(mobile-recording): never lose a meeting capture on offline stop, oversize, or re-record 2026-09-28 02:16:24 +09:00
Yun Chan
80538c0f23 fix(supabase): drop legacy JWT-role admin write policies on subscriptions 2026-09-28 02:16:24 +09:00
Yun Chan
824ee42f1e fix(supabase): end the auth session when a device is revoked 2026-09-28 02:16:22 +09:00
Yun Chan
ed790e672b fix(storage): purge raw audio when its history entry or meeting is deleted 2026-09-28 02:16:22 +09:00
Yun Chan
4807a5283d fix(db): allow deleting meeting templates that past meetings reference 2026-09-28 02:16:21 +09:00
Yun Chan
f04a7f9944 fix(portability): restore compares existing rows through the v1 archive projection 2026-09-28 02:16:21 +09:00
Yun Chan
63bc0ebe69 fix(db): lock increment_daily_usage and admin analytics RPCs to service_role 2026-09-28 02:16:21 +09:00
Yun Chan
e69fe0335d fix(payple): reject checkout while a paid Payple period is still active 2026-09-28 02:16:21 +09:00
Yun Chan
f456d737c4 fix(billing): stop back-office edits from changing Payple renewal charges 2026-09-28 02:16:21 +09:00
Yun Chan
957e136789 fix(iap): acknowledge Google Play purchases only after the entitlement is persisted 2026-09-28 02:16:20 +09:00
Yun Chan
1eb22af1f3 fix(stt-proxy): stop paid fan-out on empty transcripts and redact provider errors 2026-09-28 02:16:19 +09:00
Yun Chan
1a4c39cb94 fix(keybinding): stop stealing chords on Windows, release mouse holds, keep cleared actions 2026-09-28 02:16:19 +09:00
Yun Chan
115e8488ac fix(templates): route dictation results into active template sessions 2026-09-28 02:16:19 +09:00
Yun Chan
11bf995409 fix(runtime): release engine file holders right before swapping a reinstalled runtime 2026-09-28 02:16:19 +09:00
Yun Chan
e015f43de1 fix(release): stop overwriting immutable Forgejo version assets on re-run 2026-09-28 02:16:18 +09:00
Yun Chan
5f12ab4772 fix(release): keep portable/runtime version packages immutable and guard latest aliases against rollback 2026-09-28 02:16:18 +09:00
Yun Chan
88f3dbcd69 fix(update): re-evaluate policy on every update transition and skip NSIS updater on portable installs 2026-09-28 02:16:18 +09:00
Yun Chan
a4acb42573 fix(desktop): align runtime AppUserModelId with electron-builder appId 2026-09-28 02:16:18 +09:00
Yun Chan
5322d981cc fix(security): trust file: URLs only inside the app renderer directory 2026-09-28 02:16:18 +09:00
Yun Chan
b306034bfc fix(llm-proxy): reserve quota before the provider call and stop cutting off long streams 2026-09-28 02:16:17 +09:00
Yun Chan
2f94d24c99 fix(voice): stop mic-test ref stealing, unblock action queue, keep tail audio, and move context/LLM routing behind ports and pure policies 2026-09-28 02:16:16 +09:00
Yun Chan
2cd462333f fix(stt): gate local fallback on installed engine and extract SidecarSupervisor 2026-09-28 02:16:16 +09:00
Yun Chan
4588b65dfa fix(sidecar): fall back to CPU when the CUDA runtime is unusable 2026-09-28 02:16:15 +09:00
Yun Chan
96b24e279c fix(text-insert): drop nut-js 300ms key delay and send paste as one chord 2026-09-28 02:16:15 +09:00
Yun Chan
9e5b94ced2 fix(suggestion): place overlay in DIPs, size it to content, and harden suggestion sessions 2026-09-28 02:16:15 +09:00
Yun Chan
75e053d72f fix(sync): keep desktop-only language and preset command across settings pulls 2026-09-28 02:16:15 +09:00
Yun Chan
ddc78546f0 fix(desktop): harden session, meeting, caption and LLM lifecycles; route LLM calls through the gateway 2026-09-28 02:16:15 +09:00
Yun Chan
3a46437f28 fix(sync,rag): keep restored rows, reconcile after tombstone pruning, reject partial knowledge docs, surface RAG indexing failures 2026-09-28 02:16:14 +09:00
Yun Chan
bbaf1e0a99 fix(core): extract personal-graph terms from any script 2026-09-28 00:54:04 +09:00
Yun Chan
102f3ef934 fix(quota): spend overage credits against the weekly window and count 7 days, not 8 2026-09-28 00:54:03 +09:00
Yun Chan
f4f9653361 fix(conversation): make realtime sessions cancellable and recoverable 2026-09-28 00:54:03 +09:00
Yun Chan
a85b24d385 fix(meeting): persist transcript segment edits, restore live recording view, and route settings deep links by tab id 2026-09-28 00:54:03 +09:00
Yun Chan
a8983c583a fix(history): require confirmation before clearing all history 2026-09-28 00:54:02 +09:00
Yun Chan
819bc9d789 fix(support): stop faking refund approvals and ticket submissions in the support modal 2026-09-28 00:54:02 +09:00
Yun Chan
e243e5282c fix(mobile-history): drop history cache writes that outlive the auth scope 2026-09-28 00:54:01 +09:00