Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
454 commits
Select commit Hold shift + click to select a range
99662fc
fix(oauth-pool): refuse spawn + rotate on 401 to stop keychain-fallba…
cuongtranba May 15, 2026
329798d
chore(oauth-pool): markError drops reservation, mirroring markLimited…
cuongtranba May 15, 2026
46ed38e
chore(main): release 0.53.0 (#118)
github-actions[bot] May 15, 2026
9239751
feat(claude-pty): session lifecycle + prompt-too-long recovery (P6) (…
cuongtranba May 15, 2026
4130ba9
fix(codex): surface image generation + unknown ThreadItems, suppress …
cuongtranba May 15, 2026
b38d32f
fix(tests): force NODE_ENV=test via bunfig preload to load React dev …
cuongtranba May 15, 2026
086d60d
fix(oauth-pool): release token reservation on turn end so idle chats …
cuongtranba May 15, 2026
824215a
chore(main): release 0.54.0 (#126)
github-actions[bot] May 15, 2026
8a0c867
fix(local-file-link): treat extension-less paths as editor links (#129)
cuongtranba May 15, 2026
1f7bc42
fix(compact): seed maxTokens from [1m] model id to stop premature com…
cuongtranba May 15, 2026
a9d4c39
fix(codex): render ImageGeneration inline with project URL and popula…
cuongtranba May 15, 2026
554b492
fix(useKannaState): drop optimistic user_prompt when chat.send acks q…
cuongtranba May 15, 2026
e1c0c73
fix(compact): protect queued message from accidental dequeue mid-comp…
cuongtranba May 15, 2026
5354454
fix(chat): server-authoritative routing kills duplicate queued bubble…
cuongtranba May 16, 2026
9019c50
fix(chat): seed composer provider from server snapshot on session rel…
cuongtranba May 16, 2026
1742ea7
feat(claude-pty): P7 — driver toggle, lifecycle, sidebar badges, per-…
cuongtranba May 16, 2026
81ed65b
fix(compact): persist proactive-compact circuit breaker + harden audi…
cuongtranba May 16, 2026
890ad71
fix(image-gen): tighten types, fix silent error, dedupe URL builder (…
cuongtranba May 16, 2026
86e6ff6
chore(main): release 0.55.0 (#130)
github-actions[bot] May 16, 2026
39ad0d7
ci: stop release-please publish hanging on bun test (#140)
cuongtranba May 16, 2026
4d83e9c
fix(ci:diag): capture stuck-process stack when bun test hangs (#141)
cuongtranba May 16, 2026
5586019
chore(main): release 0.55.1 (#142)
github-actions[bot] May 16, 2026
9b7c0be
fix(test): dispose AppSettingsManager FSWatchers via centralized afte…
cuongtranba May 16, 2026
9623e75
chore(main): release 0.55.2 (#145)
github-actions[bot] May 16, 2026
9460481
fix(server): dispose fs.watch managers before fallible shutdown await…
cuongtranba May 16, 2026
ea34529
chore(main): release 0.55.3 (#147)
github-actions[bot] May 16, 2026
181e60a
feat(file-preview): mobile-first universal file preview sheet (#143)
cuongtranba May 16, 2026
4114fc7
fix(agent): recreate activeTurn on late canUseTool from SDK self-resu…
cuongtranba May 16, 2026
ec9d080
docs(c3): drop unsupported _exclude block from code-map.yaml (#150)
cuongtranba May 16, 2026
d03f29a
chore(main): release 0.56.0 (#149)
github-actions[bot] May 16, 2026
ad7c3ac
fix(chat-preferences): refresh new-chat composer when settings change…
cuongtranba May 16, 2026
3007810
fix(compact): stop cumulative result.usage leaking into usedTokens (#…
cuongtranba May 16, 2026
97e6171
chore(main): release 0.56.1 (#153)
github-actions[bot] May 16, 2026
0468b96
chore(tsconfig): type-check all of src/, fix stale test fixtures (#154)
cuongtranba May 16, 2026
54aa3e0
fix(chat-preferences): persist composer state + use providerDefaults …
cuongtranba May 16, 2026
0f056a8
chore(main): release 0.56.2 (#156)
github-actions[bot] May 16, 2026
6ed1531
perf(transcript): stabilize markdown props + memoize message componen…
cuongtranba May 16, 2026
19865a1
chore(main): release 0.56.3 (#158)
github-actions[bot] May 16, 2026
22b273b
fix(chat): transcript not scrollable on mobile for long conversations…
cuongtranba May 16, 2026
9f4112c
chore(main): release 0.56.4 (#160)
github-actions[bot] May 16, 2026
a643f78
docs(claude-md): mandate /c3 skill pre-code query and post-code updat…
cuongtranba May 17, 2026
3781119
feat(pty): phase 1 parity wiring (B2 + B5) (#164)
cuongtranba May 17, 2026
f6df21a
feat(skills): add kanna-debug skill for transcript-driven debugging
cuongtranba May 17, 2026
0f094ab
feat(settings): subagent CRUD UI (#166)
cuongtranba May 17, 2026
61aa1de
fix(codex): serve absolute-path generated images via /api/local-file …
cuongtranba May 17, 2026
bf54888
docs(readme): sync feature list and project layout with current code
cuongtranba May 17, 2026
aa37c86
feat(pty): phase 2 — register kanna MCP server in PTY (B3 + B6) (#168)
cuongtranba May 17, 2026
f90384d
feat(pty): phase 3 — JSONL event parity (D1 + D2 + D3 + D4) (#169)
cuongtranba May 17, 2026
85a685d
feat(pty): phase 4 — failure handling parity (B4 + D5 + D7) (#170)
cuongtranba May 17, 2026
0fa777d
feat(pty): phase 5 — subagent routing + shared prompt + account (D6 +…
cuongtranba May 17, 2026
043d82c
feat(pty): phase 6 — SDK ↔ PTY equivalence matrix + doc sweep (#172)
cuongtranba May 17, 2026
6dc8f37
fix(pty): drop credentials.json requirement when OAuth-pool token sup…
cuongtranba May 17, 2026
f9ab062
feat(pty): D4 partial — runtime /plan enter via slash command (#174)
cuongtranba May 17, 2026
378797f
fix(pty/sandbox): symlink resolution, glob surfacing, injection + sig…
cuongtranba May 17, 2026
575011e
fix(pty/preflight): fail-closed on throw, real invalidateAll, contrac…
cuongtranba May 17, 2026
561e074
fix(oauth-pool): TOCTOU-safe hasUsable, ephemeral lease, pure read lo…
cuongtranba May 17, 2026
0404680
fix(pty/preflight): narrow TOCTOU window by re-verifying binary sha25…
cuongtranba May 17, 2026
102270c
fix(agent): preserve rotation reservation in closeClaudeSession (#179)
cuongtranba May 17, 2026
fa7c7af
test(pty): end-to-end PTY-driver OAuth rotation from JSONL rate-limit…
cuongtranba May 17, 2026
cf28ff0
fix(chat-ui): prevent iOS cursor-jump during hold-space cursor drag (…
cuongtranba May 17, 2026
6184a2a
chore(main): release 0.57.0 (#165)
github-actions[bot] May 17, 2026
2b55798
fix(chat-ui): clamp Selection back into textarea on iOS keyboard-trac…
cuongtranba May 17, 2026
d8cd8cd
fix(chat-input): prevent iOS Safari page-jump when tapping file picke…
cuongtranba May 17, 2026
ce112bf
chore(main): release 0.57.1 (#184)
github-actions[bot] May 17, 2026
bfa0c40
Revert "fix(chat-input): prevent iOS Safari page-jump when tapping fi…
cuongtranba May 17, 2026
cb0495a
revert: restore chat input + version to 0.57.0 state (#186)
cuongtranba May 17, 2026
aa2b285
chore(main): release 0.57.1 (#187)
github-actions[bot] May 17, 2026
477dce3
chore: bump version to 0.57.2 (#188)
cuongtranba May 17, 2026
5dd8b88
chore: release 0.57.3 to publish reverted baseline to npm (#190)
cuongtranba May 17, 2026
e33fbd2
chore(main): release 0.57.3 (#191)
github-actions[bot] May 17, 2026
e139eb8
fix(chat-input): prevent iOS Safari page-jump when tapping file picke…
cuongtranba May 17, 2026
55732e9
chore(main): release 0.57.4 (#193)
github-actions[bot] May 17, 2026
330f33a
fix(server): allow HEAD on /api/projects/:id/{files,uploads}/*/conten…
cuongtranba May 18, 2026
f50eb2c
chore(main): release 0.57.5 (#195)
github-actions[bot] May 18, 2026
0745f78
fix(subagent): forward user instruction + scan main reply for mention…
cuongtranba May 18, 2026
e581ab9
docs(subagent): end-to-end lifecycle diagram + known-bug table (#198)
cuongtranba May 18, 2026
0775d69
fix(subagent): close 5 P1 concurrency / routing bugs (B1–B5) (#199)
cuongtranba May 18, 2026
ca62112
feat(pty): switch to --print stream-json + trust claude as source of …
cuongtranba May 18, 2026
c090126
chore(main): release 0.58.0 (#197)
github-actions[bot] May 18, 2026
26a13b8
fix(pty): close mcp/tmp/tool-callbacks on every exit path (#201)
cuongtranba May 18, 2026
d1de740
refactor(pty): require OAuth-pool token, drop credentials.json fallba…
cuongtranba May 18, 2026
007ece2
fix(subagent): inherit parent chat's OAuth-pool reservation (#204)
cuongtranba May 18, 2026
47466dc
feat(subagent): main agent delegates via mcp__kanna__delegate_subagen…
cuongtranba May 18, 2026
b4ada0e
feat(ui): centralize app bootstrap loading state (#206)
cuongtranba May 18, 2026
d7181c0
chore(main): release 0.59.0 (#202)
github-actions[bot] May 18, 2026
c967cf2
feat(ui): full-app loading overlay during redeploy/update restart (#207)
cuongtranba May 18, 2026
8fd44e9
feat(update): install any release from changelog UI (#208)
cuongtranba May 18, 2026
82077ad
chore(main): release 0.60.0 (#209)
github-actions[bot] May 18, 2026
d1fb494
feat(codex): auto-relocate ImageGeneration outputs into project (#210)
cuongtranba May 18, 2026
55510cb
fix(settings/subagents): remove duplicate copy in empty state and lis…
cuongtranba May 18, 2026
4737d38
chore(main): release 0.61.0 (#211)
github-actions[bot] May 18, 2026
e2f0801
fix(update): instant overlay + per-button loading for install/rollbac…
cuongtranba May 18, 2026
2316725
fix(claude-pty): route AskUserQuestion/ExitPlanMode to UI under PTY (…
cuongtranba May 18, 2026
b599542
chore(main): release 0.61.1 (#214)
github-actions[bot] May 18, 2026
941f92f
fix(permission-gate): force ask for mcp__kanna__ask_user_question / e…
cuongtranba May 18, 2026
1001ea6
chore(main): release 0.61.2 (#218)
github-actions[bot] May 18, 2026
f5a76ff
fix(claude-pty): SIGINT on stop, drain queue after cancel (#220)
cuongtranba May 18, 2026
b11741d
fix(tools): normalize mcp__kanna__ask_user_question text→question fie…
cuongtranba May 18, 2026
b44ef4a
chore(main): release 0.61.3 (#221)
github-actions[bot] May 18, 2026
3610f9b
fix(ui): normalize mcp__kanna__ask_user_question text→question in pen…
cuongtranba May 18, 2026
8429673
chore(main): release 0.61.4 (#224)
github-actions[bot] May 18, 2026
fc106c1
fix(tools): peel MCP CallToolResult envelope when hydrating ask_user_…
cuongtranba May 19, 2026
5d4b513
chore(main): release 0.61.5 (#226)
github-actions[bot] May 19, 2026
024e09b
fix(oauth-pool): stop turn-end release from leaking the rotation pin;…
cuongtranba May 19, 2026
a565506
feat(ui): unify AskUserQuestion slide UI across native + pending path…
cuongtranba May 19, 2026
cd2c9ab
chore(main): release 0.62.0 (#228)
github-actions[bot] May 19, 2026
08a41a5
feat(subagent): reactive activity label from latest entries (#231)
cuongtranba May 19, 2026
ba3d6c6
docs(c3): re-author code-map.yaml through c3x; restore lookup/check (…
cuongtranba May 19, 2026
493ef87
feat(subagent): rich activity labels + MCP progress notifications (#234)
cuongtranba May 19, 2026
baa49ba
chore(main): release 0.63.0 (#233)
github-actions[bot] May 19, 2026
eef731b
feat(oauth-pool): name contested chat in token-unavailable refusal (#…
cuongtranba May 19, 2026
65969ed
feat(subagent): live UI broadcast + pending tool loading state (#237)
cuongtranba May 19, 2026
855b80d
fix(ui): align PTY driver banner with floating sidebar chrome (#239)
cuongtranba May 19, 2026
29d3aa9
chore(main): release 0.64.0 (#236)
github-actions[bot] May 19, 2026
17aa637
docs(c3): split oauth-token-pool into its own component (c3-224) (#240)
cuongtranba May 19, 2026
be2583a
docs(c3): chart claude-pty-driver, correct stdout-stream event source…
cuongtranba May 19, 2026
c606355
feat(messages): render mermaid diagrams in transcript markdown (#242)
cuongtranba May 19, 2026
21ea6e9
fix(event-store): decouple subagent live progress from global writeCh…
cuongtranba May 19, 2026
4a3a0a4
chore(main): release 0.65.0 (#243)
github-actions[bot] May 19, 2026
76d7b45
fix(client): include subagentRuns in chat-snapshot dedup compare (#245)
cuongtranba May 19, 2026
59aff37
docs(readme): introduce fork-vs-upstream framing and headline additio…
cuongtranba May 19, 2026
adbf02d
fix(oauth-pool): persist refusal as transcript result entry (#248)
cuongtranba May 19, 2026
158262f
chore(main): release 0.65.1 (#246)
github-actions[bot] May 19, 2026
f91722d
feat(client): render <thinking> blocks as collapsible disclosure (#250)
cuongtranba May 20, 2026
01a86a2
feat(wiki): Kanna documentation site at kanna-wiki.lowbit.link (#249)
cuongtranba May 20, 2026
17c744a
chore(main): release 0.66.0 (#251)
github-actions[bot] May 20, 2026
ed2acf3
fix(wiki): editorial home page, WCAG AA gray ramp, Starlight cascade …
cuongtranba May 20, 2026
402925e
chore(main): release 0.66.1 (#253)
github-actions[bot] May 20, 2026
e24ec3e
feat(messages): surface OAuth key in chat AccountInfoMessage (#254)
cuongtranba May 20, 2026
8b9803e
chore(main): release 0.67.0 (#255)
github-actions[bot] May 20, 2026
1d1539e
feat(notice-banner): extract reusable shell notice primitive (#256)
cuongtranba May 21, 2026
d91f880
feat(messages): mask OAuth key as primary AccountInfo identifier (#257)
cuongtranba May 21, 2026
f9310aa
refactor(event-store): extract StorageBackend interface (#238) (#259)
cuongtranba May 21, 2026
f700d08
feat(settings): add global prompt append for Claude + Codex turns (#260)
cuongtranba May 21, 2026
273386c
feat(claude-pty)!: Shannon-style TUI transport — drop --print, tail t…
cuongtranba May 21, 2026
5d941a5
feat(claude-pty): plan-mode exit via Shift+Tab (F1) + getSupportedCom…
cuongtranba May 21, 2026
57aa777
fix(claude-pty): TUI prompt submission, turn-end marker, deterministi…
cuongtranba May 21, 2026
d9d9052
fix(claude-pty): multi-line paste submit + mtime-floor JSONL discover…
cuongtranba May 21, 2026
0782da4
fix(claude-pty, subagent): adaptive paste-commit wait + clear stale c…
cuongtranba May 21, 2026
2dd5a16
fix(claude-pty): plug PTY resource leaks + harden graceful shutdown (…
cuongtranba May 21, 2026
1817cde
feat(claude-pty): on-disk pid registry to reap crash orphans on next …
cuongtranba May 21, 2026
b321973
fix(claude-pty): fail-close hung turns on stream-end + add lifecycle …
cuongtranba May 21, 2026
370c6ca
chore(main): release 0.68.0 (#258)
github-actions[bot] May 21, 2026
91d1415
fix(cli-supervisor): skip self-update after UI-triggered restart so r…
cuongtranba May 21, 2026
9b5bbf8
fix(claude-pty): PID registry JSONL discovery + cross-talk hardening …
cuongtranba May 21, 2026
6c1d050
docs(c3): sync topology to current code (#272)
cuongtranba May 21, 2026
b1fc623
chore(main): release 0.68.1 (#270)
github-actions[bot] May 21, 2026
b2b1585
feat(transcript): render Claude CLI synthetic API errors as dedicated…
cuongtranba May 22, 2026
9fdbfdd
feat(oauth-pool): per-token concurrency cap (share OAuth across chats…
cuongtranba May 22, 2026
8b84d6b
chore(main): release 0.69.0 (#274)
github-actions[bot] May 22, 2026
f966b56
feat(transcript): syntax-highlight fenced code blocks in chat message…
cuongtranba May 22, 2026
3cde1f1
chore(main): release 0.70.0 (#277)
github-actions[bot] May 22, 2026
4aa2aa8
fix(oauth-pool): keep "In use" badge on single line (#278)
cuongtranba May 22, 2026
37e9fbd
fix(settings): forward globalPromptAppend to agent spawn (#281)
cuongtranba May 23, 2026
996b732
feat: custom MCP servers in settings (SDK + PTY) (#282)
cuongtranba May 23, 2026
c5d6934
feat(lint): ban side-effect imports in src/shared and src/client (#283)
cuongtranba May 23, 2026
8977d83
feat(lint): catch DB construction, process.exit, process.env in pure …
cuongtranba May 23, 2026
2244bef
refactor(paths-config): extract IO into sibling helper, purify paths.…
cuongtranba May 23, 2026
9ec4c7e
feat(lint): ratchet side-effect call sites in src/server (warn + lowe…
cuongtranba May 23, 2026
dec5696
refactor(storage): rename fs-storage to .adapter.ts (ratchet 90→84) (…
cuongtranba May 23, 2026
720cecf
refactor: rename pty-process + machine-name to .adapter.ts (ratchet 8…
cuongtranba May 23, 2026
4454653
refactor: rename 5 leaf-IO modules to .adapter.ts (ratchet 80→75) (#290)
cuongtranba May 23, 2026
54270c6
fix(test): update dynamic import after terminal-pid-registry rename (…
cuongtranba May 23, 2026
556691d
docs(claude.md): document side-effect lint pipeline (pure-layer seal …
cuongtranba May 23, 2026
9821ceb
refactor: rename process-utils + exempt test-helpers (ratchet 75→72) …
cuongtranba May 23, 2026
1e477ed
refactor: rename 5 pty/push leaf-IO files to .adapter.ts (ratchet 72→…
cuongtranba May 23, 2026
be2bb1a
refactor: rename 6 kanna-mcp-tools + project-directory to .adapter.ts…
cuongtranba May 23, 2026
c24da21
refactor: rename 9 claude-pty/cloudflare/discovery/worktree leaf-IO f…
cuongtranba May 23, 2026
cb7d1bf
refactor: rename 4 more leaf-IO files to .adapter.ts (ratchet 50→46) …
cuongtranba May 23, 2026
9f61c77
refactor(keybindings): extract fs IO into keybindings-store.adapter.t…
cuongtranba May 23, 2026
cc69fdc
refactor: extract fs IO from share/uploads/llm-provider into adapters…
cuongtranba May 23, 2026
bd842b1
refactor: extract fs/spawn into adapters for 5 server files (ratchet …
cuongtranba May 23, 2026
601ff03
refactor: extract IO from 9 server files into adapters (ratchet 35→15…
cuongtranba May 23, 2026
047efd3
refactor: extract IO from server.ts/diff-store/terminal-manager (ratc…
cuongtranba May 23, 2026
b5dca9e
refactor: flip ratchet warn→error in eslint.config.js, delete ratchet…
cuongtranba May 23, 2026
35b2f5a
docs: mermaid architecture + IO workflow in README, add ref-side-effe…
cuongtranba May 23, 2026
c388e5a
fix(file-preview): restore scroll inside @-triggered file sheet (#305)
cuongtranba May 23, 2026
f41293e
chore(main): release 0.71.0 (#279)
github-actions[bot] May 23, 2026
3000d58
feat(mobile): swipe to open/close sidebar (#306)
cuongtranba May 23, 2026
c15f987
ci: add tsc --noEmit step; fix pre-existing TS errors (#308)
cuongtranba May 23, 2026
c376711
chore(main): release 0.72.0 (#307)
github-actions[bot] May 23, 2026
e077d7a
feat(pty): live status panel + cancel/kill actions (#309)
cuongtranba May 23, 2026
6a9fa74
chore(main): release 0.73.0 (#310)
github-actions[bot] May 23, 2026
e4b3bed
fix(pty): bound transcript poll + quiet-period TUI ready gate (#311)
cuongtranba May 23, 2026
20d2d37
chore(main): release 0.73.1 (#312)
github-actions[bot] May 23, 2026
2efb78e
feat(pty): hide exited instances from status panel + TTL prune (#313)
cuongtranba May 23, 2026
a59079c
feat: remove background tasks panel and related code (#315)
cuongtranba May 23, 2026
89f25c3
chore(main): release 0.74.0 (#314)
github-actions[bot] May 23, 2026
8148302
feat(pty): realtime memory tracking in live status panel (#316)
cuongtranba May 24, 2026
cc52787
chore(main): release 0.75.0 (#317)
github-actions[bot] May 24, 2026
c7a7245
feat(share): read-only public session share (#318)
cuongtranba May 24, 2026
ca237ae
chore(main): release 0.76.0 (#319)
github-actions[bot] May 25, 2026
46824a2
refactor(share): remove legacy upstream-upload share path (#320)
cuongtranba May 25, 2026
24599e9
feat(share): derive share URL from request origin, drop tunnel gate (…
cuongtranba May 25, 2026
0cf836e
chore(main): release 0.77.0 (#322)
github-actions[bot] May 25, 2026
a115854
fix(share): include kind discriminant in share.* ws responses (#323)
cuongtranba May 25, 2026
79fe0ac
chore(main): release 0.77.1 (#324)
github-actions[bot] May 25, 2026
fd896ff
fix(share): popover trigger + share-view rendering (#325)
cuongtranba May 25, 2026
55f72e3
chore(main): release 0.77.2 (#326)
github-actions[bot] May 25, 2026
3305bb3
fix(share): style share-view with Tailwind + shared markdown componen…
cuongtranba May 26, 2026
fd9acb4
fix(ui): surface question header + chosen option description in ask-u…
cuongtranba May 26, 2026
5d12c76
fix(file-preview): bound scroll region inside dialog for long content…
cuongtranba May 26, 2026
216392b
fix(pty): ignore sidechain + background auto-wake lines in transcript…
cuongtranba May 28, 2026
d543965
chore(main): release 0.77.3 (#328)
github-actions[bot] May 28, 2026
c38c1a4
test(file-preview): scope drag-handle query to container (fix flaky C…
cuongtranba May 28, 2026
8d36fdb
feat(models): add claude-opus-4-8 to provider catalog (#335)
cuongtranba May 29, 2026
ee669e4
chore(main): release 0.78.0 (#336)
github-actions[bot] May 29, 2026
c93afc3
fix(pty): deliver subagent prompt via MCP channel push (fail-fast) (#…
cuongtranba May 30, 2026
deb412b
feat(subagent): keep-alive multi-turn PTY sessions (#338)
cuongtranba May 30, 2026
04a44ac
chore(main): release 0.79.0 (#337)
github-actions[bot] May 30, 2026
a752c5d
[sidebar-collapse-all] feat(sidebar): add collapse/expand-all button …
hieplam May 31, 2026
8e5e445
feat(transcript): anchor subagent runs under their delegate_subagent …
cuongtranba May 31, 2026
d0bafda
chore(main): release 0.80.0 (#340)
github-actions[bot] May 31, 2026
23872d9
feat(chat-ui): show session token total pill in composer (#341)
cuongtranba Jun 1, 2026
0af2ff8
fix(tool-callback): live broadcast + stop cancel-on-rotation + drop a…
cuongtranba Jun 1, 2026
2f66f71
chore(main): release 0.81.0 (#342)
github-actions[bot] Jun 1, 2026
c387112
fix(pty): read assistant usage from nested message.usage (#344)
cuongtranba Jun 2, 2026
3f5b30e
fix(chat-ui): keep session token pill visible on mobile (#345)
cuongtranba Jun 2, 2026
40bc356
chore(main): release 0.81.1 (#346)
github-actions[bot] Jun 2, 2026
539b8e8
fix(share): make share page scroll on overflow (mobile-safe) (#347)
cuongtranba Jun 2, 2026
1b55900
chore(main): release 0.81.2 (#348)
github-actions[bot] Jun 2, 2026
53a8e98
fix(chat-ui): align session token readout with flat toolbar (#349)
cuongtranba Jun 2, 2026
22f8bec
fix(mcp): keep loopback MCP transport alive across idle gaps (#351)
cuongtranba Jun 3, 2026
4b3852e
fix(pty): cannot fork PTY-created conversations (session id collision…
cuongtranba Jun 3, 2026
7efa965
fix(mcp): forward customMcpServers through agent settings view (#353)
cuongtranba Jun 3, 2026
37e577c
chore(main): release 0.81.3 (#350)
github-actions[bot] Jun 3, 2026
1e429b6
fix(chat-ui): prevent composer toolbar / token readout overlap (#354)
cuongtranba Jun 3, 2026
51fd6fa
feat: Kanna-owned agent self-scheduled wake (ScheduleWakeup + pending…
cuongtranba Jun 3, 2026
abdb32b
fix(sidebar): pin collapse-all toggle above scroll list (#356)
cuongtranba Jun 3, 2026
1ab36a2
feat: workflow status panel (PTY disk-watch) (#358)
cuongtranba Jun 3, 2026
3a4d226
chore(main): release 0.82.0 (#355)
github-actions[bot] Jun 3, 2026
8e7af80
fix(agent): keep PTY session alive while a background workflow is run…
cuongtranba Jun 3, 2026
e763b14
chore(main): release 0.82.1 (#360)
github-actions[bot] Jun 3, 2026
9707062
fix(agent): real workflow liveness via live run dir (corrects #359 no…
cuongtranba Jun 3, 2026
f9ad251
chore(main): release 0.82.2 (#362)
github-actions[bot] Jun 3, 2026
be3933d
feat(workflow): show in-flight runs as running in the status panel (#…
cuongtranba Jun 3, 2026
7a4dbd5
chore(main): release 0.83.0 (#364)
github-actions[bot] Jun 3, 2026
243f8fd
fix(workflow): getRun returns synthetic running run (drill-in no long…
cuongtranba Jun 3, 2026
b4cb776
chore(main): release 0.83.1 (#366)
github-actions[bot] Jun 3, 2026
5ac6975
feat(workflow): live per-agent detail for running runs (journal.jsonl…
cuongtranba Jun 3, 2026
92cc071
fix(sidebar): make collapse-all chip a real affordance with semantic …
hieplam Jun 4, 2026
d1054a2
chore(main): release 0.84.0 (#368)
github-actions[bot] Jun 4, 2026
bef730e
fix(workflow): surface a live re-run that reused a crashed run's runI…
cuongtranba Jun 4, 2026
2c21ba5
chore(main): release 0.84.1 (#371)
github-actions[bot] Jun 4, 2026
8d27627
feat(workflow): richer per-agent journal detail in drill-in (#372)
cuongtranba Jun 4, 2026
6206239
fix(transcript): stop rendering benign synthetic turn-end markers as …
cuongtranba Jun 4, 2026
095aad2
chore(main): release 0.85.0 (#373)
github-actions[bot] Jun 4, 2026
a6fdbb0
fix(pty): stop re-spawn from leaking an invisible PTY child (#375)
cuongtranba Jun 4, 2026
bf0c602
chore(main): release 0.85.1 (#376)
github-actions[bot] Jun 4, 2026
c476fa3
fix: import Claude session titles
setnsail Jun 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
33 changes: 33 additions & 0 deletions .c3/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
---
id: c3-0
c3-version: 4
c3-seal: b5e913fe120829f2ba2c77e05e71abfbe5a23eed841b79c03e6c8b3025330589
title: Kanna
goal: ${GOAL}
summary: Bun+React web app that drives Claude Agent SDK and Codex App Server over WebSocket, persisting all state as append-only JSONL and rendering live transcripts with hydrated tool calls.
---

# ${PROJECT}

## Goal

${GOAL}

## Abstract Constraints

| Constraint | Rationale | Affected Containers |
| --- | --- | --- |
| Event sourcing for all state mutations | Replayable history, crash-safe, debuggable audit trail | c3-2 |
| CQRS: write path (events) decoupled from read path (derived models) | UI subscribes to fast snapshots without touching the log | c3-1, c3-2 |
| Reactive WebSocket broadcasting of snapshots on every state change | Multiple tabs and agents stay consistent in real time | c3-1, c3-2 |
| Local-first: all user data under ~/.kanna/data, default bind is localhost | Zero server infra, user owns their data, safe by default | c3-2 |
| Provider-agnostic agent coordination (Claude Agent SDK + Codex App Server) | Per-turn provider/model/effort picks without forking transcript model | c3-1, c3-2 |
| Strong TypeScript typing — no any/untyped shapes at boundaries | Shared types guarantee client+server agree on protocol + events | c3-1, c3-2, c3-3 |

## Containers

| ID | Name | Boundary | Status | Responsibilities | Goal Contribution |
| --- | --- | --- | --- | --- | --- |
| c3-1 | Client | app | implemented | Render transcript, accept chat input, manage sidebar + settings, subscribe to WebSocket pushes | Provides the browser UX that makes Claude/Codex usable through a beautiful chat view |
| c3-2 | Server | service | implemented | Host HTTP+WS on localhost, drive agents, persist events, derive read models | Single-binary local backend that coordinates providers and owns all state |
| c3-3 | Shared | library | implemented | Define protocol, types, tool normalization, ports, branding shared by client and server | Guarantees client + server agree on wire format and domain types |
477 changes: 477 additions & 0 deletions .c3/_index/structural.md

Large diffs are not rendered by default.

233 changes: 233 additions & 0 deletions .c3/adr/adr-20260420-c3-adoption.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,233 @@
---
id: adr-00000000-c3-adoption
c3-version: 4
c3-seal: 104ece0accbf901190d1aa57904ccb29db0e106f997949cdb7ed4739e498f66f
title: C3 Architecture Documentation Adoption
type: adr
goal: Adopt C3 methodology for kanna.
status: implemented
date: "2026-04-20"
affects:
- c3-0
---

# C3 Architecture Documentation Adoption

## Goal

Adopt C3 methodology for kanna.

## Workflow

```mermaid
flowchart TD
GOAL([Goal]) --> S0

subgraph S0["Stage 0: Inventory"]
S0_DISCOVER[Discover codebase] --> S0_ASK{Gaps?}
S0_ASK -->|Yes| S0_SOCRATIC[Socratic] --> S0_DISCOVER
S0_ASK -->|No| S0_LIST[List items + diagram]
end

S0_LIST --> G0{Inventory complete?}
G0 -->|No| S0_DISCOVER
G0 -->|Yes| S1

subgraph S1["Stage 1: Details"]
S1_CONTAINER[Per container] --> S1_INT[Internal comp]
S1_CONTAINER --> S1_LINK[Linkage comp]
S1_INT --> S1_REF[Extract refs]
S1_LINK --> S1_REF
S1_REF --> S1_ASK{Questions?}
S1_ASK -->|Yes| S1_SOCRATIC[Socratic] --> S1_CONTAINER
S1_ASK -->|No| S1_NEXT{More?}
S1_NEXT -->|Yes| S1_CONTAINER
end

S1_NEXT -->|No| G1{Fix inventory?}
G1 -->|Yes| S0_DISCOVER
G1 -->|No| S2

subgraph S2["Stage 2: Finalize"]
S2_CHECK[Integrity checks]
end

S2_CHECK --> G2{Issues?}
G2 -->|Inventory| S0_DISCOVER
G2 -->|Detail| S1_CONTAINER
G2 -->|None| DONE([Implemented])
```

## Stage 0: Inventory

### Context Discovery

| Arg | Value |
| --- | --- |
| PROJECT | Kanna |
| GOAL | Beautiful browser UI for Claude Code + Codex CLIs with project-first navigation, multi-provider agent coordination, and event-sourced local persistence |
| SUMMARY | Bun+React app driving Claude Agent SDK and Codex App Server over WebSocket, persisting state as append-only JSONL, rendering hydrated tool calls in real time |

### Abstract Constraints

| Constraint | Rationale | Affected Containers |
| --- | --- | --- |
| Event sourcing for all state mutations | Replayable history, crash-safe, debuggable audit trail | c3-2 |
| CQRS: write (events) decoupled from read (derived models) | UI subscribes to fast snapshots without touching the log | c3-1, c3-2 |
| Reactive WebSocket broadcasting on every state change | Multiple tabs and agents stay consistent in real time | c3-1, c3-2 |
| Local-first: data under ~/.kanna/data, default bind localhost | Zero server infra, user owns data, safe by default | c3-2 |
| Provider-agnostic agent coordination (Claude + Codex) | Per-turn provider/model/effort picks without forking transcript model | c3-1, c3-2 |
| Strong TypeScript typing — no any at boundaries | Client + server agree on protocol + events | c3-1, c3-2, c3-3 |

### Container Discovery

| N | CONTAINER_NAME | BOUNDARY | GOAL | SUMMARY |
| --- | --- | --- | --- | --- |
| 1 | client | app | Render chat, accept input, subscribe to WS pushes | React + Zustand SPA under src/client |
| 2 | server | service | Drive agents, persist events, broadcast snapshots | Bun HTTP+WS runtime under src/server |
| 3 | shared | library | Publish wire protocol + domain types used by both sides | Code under src/shared imported by client and server |

### Component Discovery (Brief)

| N | NN | COMPONENT_NAME | CATEGORY | GOAL | SUMMARY |
| --- | --- | --- | --- | --- | --- |
| 1 | 01 | socket-client | foundation | Connect WS, route messages, emit commands | src/client/app/socket.ts |
| 1 | 02 | state-stores | foundation | Zustand stores for chat/terminal/sidebar/prefs | src/client/stores/* |
| 1 | 03 | ui-primitives | foundation | Radix + shadcn primitives (button, dialog, popover...) | src/client/components/ui/* |
| 1 | 10 | app-shell | feature | Router, top-level page hookup, central state hook | src/client/app/App.tsx + useKannaState.ts |
| 1 | 11 | sidebar | feature | Project-first sidebar with drag ordering, jump shortcuts | src/client/app/KannaSidebar.tsx |
| 1 | 12 | chat-page | feature | Chat route shell: transcript viewport + input dock + terminal | src/client/app/ChatPage/* |
| 1 | 13 | transcript | feature | Render hydrated transcript entries | src/client/app/KannaTranscript.tsx |
| 1 | 14 | messages-renderer | feature | Render each transcript entry type (tool calls, text, diffs) | src/client/components/messages/* |
| 1 | 15 | chat-ui-chrome | feature | Input, composer controls, provider/model pickers | src/client/components/chat-ui/* |
| 1 | 16 | settings-page | feature | Settings dialogs and preferences | src/client/app/SettingsPage.tsx |
| 1 | 17 | local-projects-page | feature | List/open locally discovered projects | src/client/app/LocalProjectsPage.tsx |
| 1 | 18 | terminal-workspace | feature | Embedded xterm panel + layout animation | src/client/app/ChatPage/TerminalWorkspaceShell.tsx |
| 2 | 01 | cli-entry | foundation | CLI parsing, supervisor, runtime, browser launcher | src/server/cli*.ts |
| 2 | 02 | http-ws-server | foundation | HTTP + WebSocket server, static serving, auth hookup | src/server/server.ts |
| 2 | 03 | auth | foundation | Password gate + session cookie for API/WS | src/server/auth.ts |
| 2 | 04 | paths-config | foundation | Data paths, machine name, branding helpers | src/server/paths.ts + machine-name.ts |
| 2 | 05 | events-schema | foundation | Event type definitions for JSONL logs | src/server/events.ts |
| 2 | 06 | event-store | foundation | Append-only JSONL with replay + snapshot compaction | src/server/event-store.ts |
| 2 | 07 | read-models | foundation | Derive sidebar/chat/project views from event state | src/server/read-models.ts |
| 2 | 08 | ws-router | foundation | Subscribe/command routing over WebSocket | src/server/ws-router.ts |
| 2 | 09 | process-utils | foundation | Process spawning + lifecycle helpers | src/server/process-utils.ts |
| 2 | 10 | agent-coordinator | feature | Multi-provider turn management | src/server/agent.ts |
| 2 | 11 | codex-app-server | feature | JSON-RPC client for Codex App Server | src/server/codex-app-server*.ts |
| 2 | 12 | provider-catalog | feature | Provider/model/effort normalization | src/server/provider-catalog.ts |
| 2 | 13 | quick-response | feature | Structured Haiku queries with Codex fallback (titles, commits) | quick-response.ts + generate-title.ts + generate-commit-message.ts + llm-provider.ts |
| 2 | 14 | discovery | feature | Auto-discover Claude + Codex local projects | src/server/discovery.ts |
| 2 | 15 | diff-store | feature | Per-chat diff state for hydrated file-change UI | src/server/diff-store.ts |
| 2 | 16 | terminal-manager | feature | PTY sessions for embedded terminal | src/server/terminal-manager.ts |
| 2 | 17 | uploads | feature | File uploads + attachment handling | src/server/uploads.ts |
| 2 | 18 | share | feature | Cloudflare quick-tunnel + named tunnel + QR | src/server/share.ts |
| 2 | 19 | update-manager | feature | Self-update notifications | src/server/update-manager.ts |
| 2 | 20 | restart | feature | In-place restart flow | src/server/restart.ts |
| 2 | 21 | external-open | feature | Open URLs/files in external apps | src/server/external-open.ts |
| 2 | 22 | keybindings | feature | User keybinding persistence | src/server/keybindings.ts |
| 3 | 01 | types | foundation | Core domain types, provider catalog, transcript entry types | src/shared/types.ts |
| 3 | 02 | protocol | foundation | WebSocket wire protocol shapes | src/shared/protocol.ts |
| 3 | 03 | tools | foundation | Tool call normalization + hydration | src/shared/tools.ts |
| 3 | 04 | ports | foundation | Port allocation + dev-port helpers | src/shared/ports.ts + dev-ports.ts |
| 3 | 05 | branding | foundation | App name + data dir paths | src/shared/branding.ts |
| 3 | 06 | share-shared | foundation | Share feature types shared with client | src/shared/share.ts |

### Ref Discovery

| SLUG | TITLE | GOAL | Scope | Applies To |
| --- | --- | --- | --- | --- |
| ref-event-sourcing | Event Sourcing | All mutations go through append-only JSONL; readers replay | cross-container | c3-2 event-store, events-schema, read-models |
| ref-cqrs-read-models | CQRS Read Models | Derive view models from event state; broadcast diffs | cross-container | c3-1 state-stores, c3-2 read-models + ws-router |
| ref-ws-subscription | WebSocket Subscription | Single WS with typed subscribe/command envelope | cross-container | c3-1 socket-client, c3-2 ws-router, c3-3 protocol |
| ref-provider-adapter | Provider Adapter | Normalize Claude Agent SDK and Codex into one transcript model | cross-container | c3-2 agent-coordinator, provider-catalog, codex-app-server, quick-response |
| ref-zustand-store | Zustand Store Pattern | Per-concern store, persist via localStorage as needed | client | c3-1 state-stores |
| ref-colocated-bun-test | Colocated Bun Test | *.test.ts next to impl, runs under bun test | cross-container | all |
| ref-strong-typing | Strong Typing Policy | No any/unknown at boundaries; prefer shared types | cross-container | all |
| ref-local-first-data | Local-First Data | All persistence under ~/.kanna/data; localhost-default binding | server | c3-2 event-store, paths-config |
| ref-tool-hydration | Tool Call Hydration | Normalize provider tool calls into unified transcript entries | cross-container | c3-3 tools, c3-1 messages-renderer, c3-2 agent-coordinator |

### Overview Diagram

```mermaid
graph LR
User((User)) --> Browser
Browser[Browser<br/>React + Zustand<br/>c3-1] <-->|WebSocket| Server
Server[Bun Server<br/>HTTP + WS<br/>c3-2]
Server --> ClaudeSDK[Claude Agent SDK]
Server --> CodexRPC[Codex App Server]
Server --> FS[(~/.kanna/data/<br/>JSONL + snapshot)]
Server --> ProjFS[(Project Dirs)]
Browser -.-> Shared[src/shared/<br/>c3-3]
Server -.-> Shared
```

### Gate 0

- [x] Context args filled
- [x] Abstract Constraints identified
- [x] All containers identified with args (including BOUNDARY)
- [x] All components identified (brief) with args and category
- [x] Cross-cutting refs identified
- [x] Overview diagram generated

## Stage 1: Details

### Container: c3-1

**Created:** [ ] `.c3/c3-1-{slug}/README.md`

| Type | Component ID | Name | Category | Doc Created |
| --- | --- | --- | --- | --- |
| Internal | | | | [ ] |
| Linkage | | | | [ ] |

### Container: c3-N

_(repeat per container from Stage 0)_

### Refs Created

| Ref ID | Pattern | Doc Created |
| --- | --- | --- |
| | | [ ] |

### Gate 1

- [ ] All container README.md created
- [ ] All component docs created
- [ ] All refs documented
- [ ] No new items discovered (else -> Gate 0)

## Stage 2: Finalize

### Integrity Checks

| Check | Status |
| --- | --- |
| Context <-> Container (all containers listed in c3-0) | [ ] |
| Container <-> Component (all components listed in container README) | [ ] |
| Component <-> Component (linkages documented) | [ ] |
| * <-> Refs (refs cited correctly, Cited By updated) | [ ] |

### Gate 2

- [ ] All integrity checks pass
- [ ] Run audit

## Conflict Resolution

If later stage reveals earlier errors:

| Conflict | Found In | Affects | Resolution |
| --- | --- | --- | --- |
| | | | |

## Exit

When Gate 2 complete -> change frontmatter status to `implemented`

## Audit Record

| Phase | Date | Notes |
| --- | --- | --- |
| Adopted | 20260420 | Initial C3 structure created |
19 changes: 19 additions & 0 deletions .c3/adr/adr-20260420-import-button-mobile-visible.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
---
id: adr-20260420-import-button-mobile-visible
c3-seal: c38090e41e252fed5cde7b0dcd3a6cea8a24acfedd7faf88ef2ca20d77f8f73f
title: import-button-mobile-visible
type: adr
goal: --value
status: implemented
date: "2026-04-20"
---

# import-button-mobile-visible

## Goal

--value

## Work Breakdown

## Risks
53 changes: 53 additions & 0 deletions .c3/adr/adr-20260421-pm2-update-reloader.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
---
id: adr-20260421-pm2-update-reloader
c3-seal: 9b2b7a5c2ed2d6659771c633b243b4875c75ecbaea474b6edfb93c7c55168285
title: pm2-update-reloader
type: adr
goal: Replace macOS launchd supervision with pm2 for the dev deploy path, and wire the in-app Update button to trigger a pm2-reload pipeline (git pull → build → `pm2 reload`). Abstract the update mechanism so the existing npm/self-update path and the new git/pm2 path coexist and can be swapped without touching `UpdateManager` or server wiring.
status: implemented
date: "2026-04-21"
---

# pm2-update-reloader

## Goal

Replace macOS launchd supervision with pm2 for the dev deploy path, and wire the in-app Update button to trigger a pm2-reload pipeline (git pull → build → `pm2 reload`). Abstract the update mechanism so the existing npm/self-update path and the new git/pm2 path coexist and can be swapped without touching `UpdateManager` or server wiring.

## Decision

Introduced two interfaces in `src/server/update-strategy.ts`:

- `UpdateChecker.check()` — returns `{ latestVersion, updateAvailable }`
- `UpdateReloader.reload()` — performs install / reload, throws `UpdateInstallError` on failure

Shipped two implementations of each, wired by a factory `createUpdateStrategy` keyed on `KANNA_RELOADER`:

| Mode | Checker | Reloader | Default? |
| --- | --- | --- | --- |
| supervisor (or unset) | NpmChecker (npm registry) | SupervisorExitReloader (install → restart_pending → process exit 76 → parent respawn) | yes |
| pm2 | GitChecker (git fetch → HEAD vs origin/branch) | Pm2Reloader (git pull → cond. bun install → bun run build → pm2.reload) | opt-in |

`UpdateManager` depends only on the interfaces; no knowledge of npm/git/pm2.

## Env Vars

- `KANNA_RELOADER` — `supervisor` (default) or `pm2`
- `KANNA_REPO_DIR` — required when `KANNA_RELOADER=pm2`; absolute path to the git worktree pm2 runs from
- `KANNA_PM2_PROCESS_NAME` — optional; defaults to `kanna`; must match the `name:` field in the pm2 ecosystem config

## Ops

- `scripts/pm2.config.cjs.tmpl` — templated pm2 ecosystem file (envsubst renders `${REPO_DIR}` + `${PM2_NAME}` into `scripts/pm2.config.cjs`, which is gitignored)
- `scripts/deploy.sh` — now installs pm2 if missing, renders the config, and runs `pm2 reload` (or `pm2 start` on first run). Drops `launchctl kickstart`.

## Work Breakdown

Done across 11 tasks (see `docs/plans/2026-04-21-pm2-update-reloader.md`): interfaces + npm/supervisor impl → factory → UpdateManager refactor → server wiring → pm2 dep → GitChecker → Pm2Reloader → pm2 ecosystem template → deploy.sh rewrite → manual verification.

## Risks

- `detectLockfileChange` returns `true` on any git error (fresh clone, no `HEAD@{1}`) — conservatively over-installs rather than skipping a needed `bun install`.
- pm2 self-reload race: pm2 signals the current process immediately; `cli.ts` may exit with 0 instead of 76 if pm2's SIGTERM wins over the `restart_pending` listener. Harmless because `autorestart: true` restarts regardless of exit code.
- `branch: "main"` is hardcoded in the factory's `GitChecker` wiring; dev-only scope, low risk.
- pm2 is a `devDependency`, lazy-imported only in pm2 mode — end users on the supervisor path never pull it.
Loading