Commit graph

409 commits

Author SHA1 Message Date
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
Yun Chan
2576f4af7b fix(mobile-queue): arm retries at the earliest deadline and stop losing or replaying queued audio 2026-09-28 00:54:01 +09:00
Yun Chan
ace946d5c7 fix(mobile-recorder): scope recorder control to its owner and keep Android recordings on stop failure 2026-09-28 00:54:01 +09:00