@cuongtran001/kanna 0.70.0 → 0.71.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +90 -22
- package/bin/kanna +1 -1
- package/dist/client/assets/{arc-6rqObOmm.js → arc-D7roR3pL.js} +1 -1
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-CxkIpcjJ.js → architectureDiagram-3BPJPVTR-Nj1aflQv.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-CJbqABjR.js → blockDiagram-GPEHLZMM-BUMlypvO.js} +1 -1
- package/dist/{export-viewer/assets/c4Diagram-AAUBKEIU-CbfNoToa.js → client/assets/c4Diagram-AAUBKEIU-7YGD-8Es.js} +1 -1
- package/dist/client/assets/channel-DWvRUK2v.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-Bm-JOUOV.js → chunk-2J33WTMH-mHvOQgNj.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-DQihGVyX.js → chunk-4BX2VUAB-Dh4dMH-R.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-BcwxGwlw.js → chunk-55IACEB6-OtdEc6ft.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-BD89PJaR.js → chunk-727SXJPM-BWrMQqXE.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-FOUAdFUU.js → chunk-AQP2D5EJ-BK1XsDEQ.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-7PMDCBFl.js → chunk-FMBD7UC4-Bd3dWpXh.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-DSdsxJVy.js → chunk-ND2GUHAM-6YlumEMP.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-BYLw-ds9.js → chunk-QZHKN3VN-BIYzn9x4.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-DE5NCIih.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DE5NCIih.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-X-6eH_h6.js → cose-bilkent-S5V4N54A-DPIA-Ost.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-D8rEq6gy.js → dagre-BM42HDAG-DmOTzlE1.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-BQujBx9f.js → diagram-2AECGRRQ-UkywC8at.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-DrHLZWOZ.js → diagram-5GNKFQAL-CivkF07i.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-BlntbwXf.js → diagram-KO2AKTUF-DHHHacVZ.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-iA-sUyQL.js → diagram-LMA3HP47-DQK0OPVj.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-BMnuKMmb.js → diagram-OG6HWLK6-CWRZkWOw.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-Cv7NPRVR.js → erDiagram-TEJ5UH35-ujAll4KH.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-hJH2PIjt.js → flowDiagram-I6XJVG4X-CPWE1-gN.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-CYk6W-Y6.js → ganttDiagram-6RSMTGT7-CZELtuqi.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DwCJhBFL.js → gitGraphDiagram-PVQCEYII-Iu0Q_ujX.js} +1 -1
- package/dist/client/assets/{index-D4pnYQXQ.js → index-BezNusND.js} +1 -1
- package/dist/client/assets/index-CkllA-SX.css +32 -0
- package/dist/client/assets/{index-BQGcj0cU.js → index-DAZ0kBky.js} +228 -217
- package/dist/client/assets/{infoDiagram-5YYISTIA-oQ3cOa-K.js → infoDiagram-5YYISTIA-B6ATUFkf.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-Cb0BjmTp.js → ishikawaDiagram-YF4QCWOH-C22MyrvL.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-DbTrJRzi.js → journeyDiagram-JHISSGLW-BGXgKLtt.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-DX58KncR.js → kanban-definition-UN3LZRKU-COdoUY_x.js} +1 -1
- package/dist/client/assets/{linear-CCBU7Q26.js → linear-Ch4Ox0-n.js} +1 -1
- package/dist/client/assets/{mermaid.core-ioWoAQF9.js → mermaid.core-D-bvfjq-.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-GXdHusqW.js → mindmap-definition-RKZ34NQL-CyUl6CIT.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-DkFGt3Mh.js → pieDiagram-4H26LBE5-BMksdqi1.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-Hfbw4nnp.js → quadrantDiagram-W4KKPZXB-CTEWjiF6.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-oSrGpqoD.js → requirementDiagram-4Y6WPE33-DKC1s5F3.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-40tV6h8V.js → sankeyDiagram-5OEKKPKP-Njh6vEi3.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-BRZPlybu.js → sequenceDiagram-3UESZ5HK-DLgQaXbD.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-CoSPvljD.js → stateDiagram-AJRCARHV-B_tMvJ11.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-DooP1BtV.js +1 -0
- package/dist/client/assets/{timeline-definition-PNZ67QCA-BP1kVMMz.js → timeline-definition-PNZ67QCA-BKzu-j5r.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-D4LlJ7Uq.js → vennDiagram-CIIHVFJN-RWvN2c-p.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-weZ0vk2k.js → wardley-L42UT6IY-DG9t1AKi.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-CiVolfBJ.js → wardleyDiagram-YWT4CUSO-XSUvO3MG.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-DgWLAzyp.js → xychartDiagram-2RQKCTM6-CuVWviDF.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/export-viewer/assets/{arc-S6TIfKz1.js → arc-AHpMGWAu.js} +1 -1
- package/dist/export-viewer/assets/{architectureDiagram-3BPJPVTR-C51zckh6.js → architectureDiagram-3BPJPVTR-Bm987ZPC.js} +1 -1
- package/dist/export-viewer/assets/{blockDiagram-GPEHLZMM-CXJt6VQj.js → blockDiagram-GPEHLZMM-C3LMeBAO.js} +1 -1
- package/dist/{client/assets/c4Diagram-AAUBKEIU-Bxey9nZp.js → export-viewer/assets/c4Diagram-AAUBKEIU-aWhAjGxV.js} +1 -1
- package/dist/export-viewer/assets/channel-Dq_eeGxJ.js +1 -0
- package/dist/export-viewer/assets/{chunk-2J33WTMH-BB9QHA6x.js → chunk-2J33WTMH-GWoydUvj.js} +1 -1
- package/dist/export-viewer/assets/{chunk-4BX2VUAB-KxhUQ0X8.js → chunk-4BX2VUAB-Bx9M4wre.js} +1 -1
- package/dist/export-viewer/assets/{chunk-55IACEB6-D1uXHkui.js → chunk-55IACEB6-DyLWoNY4.js} +1 -1
- package/dist/export-viewer/assets/{chunk-727SXJPM-CCzWGHrz.js → chunk-727SXJPM-tBTU5bog.js} +1 -1
- package/dist/export-viewer/assets/{chunk-AQP2D5EJ-8BJgfNvf.js → chunk-AQP2D5EJ-D0p2uR3j.js} +1 -1
- package/dist/export-viewer/assets/{chunk-FMBD7UC4-BM4JJj1S.js → chunk-FMBD7UC4-Cc41SMP1.js} +1 -1
- package/dist/export-viewer/assets/{chunk-ND2GUHAM-D-rxq3vC.js → chunk-ND2GUHAM-DjVxgSON.js} +1 -1
- package/dist/export-viewer/assets/{chunk-QZHKN3VN-CIfSIK0Q.js → chunk-QZHKN3VN-BH3bTEYA.js} +1 -1
- package/dist/export-viewer/assets/classDiagram-4FO5ZUOK-tGNLWra8.js +1 -0
- package/dist/export-viewer/assets/classDiagram-v2-Q7XG4LA2-tGNLWra8.js +1 -0
- package/dist/export-viewer/assets/{cose-bilkent-S5V4N54A-BNjCeOhY.js → cose-bilkent-S5V4N54A-CKpY4J4V.js} +1 -1
- package/dist/export-viewer/assets/{dagre-BM42HDAG-my_xl-lk.js → dagre-BM42HDAG-CU2WJNBl.js} +1 -1
- package/dist/export-viewer/assets/{diagram-2AECGRRQ-D813Cl4i.js → diagram-2AECGRRQ-BjLNHrYm.js} +1 -1
- package/dist/export-viewer/assets/{diagram-5GNKFQAL-Ba5iLbIO.js → diagram-5GNKFQAL-tYXUfyFE.js} +1 -1
- package/dist/export-viewer/assets/{diagram-KO2AKTUF-BrZKHqxq.js → diagram-KO2AKTUF-Ddhb1bz0.js} +1 -1
- package/dist/export-viewer/assets/{diagram-LMA3HP47-CLswzePI.js → diagram-LMA3HP47-BRlB3ma4.js} +1 -1
- package/dist/export-viewer/assets/{diagram-OG6HWLK6-C5rARFQ5.js → diagram-OG6HWLK6-DiGkS5Km.js} +1 -1
- package/dist/export-viewer/assets/{erDiagram-TEJ5UH35-B0FhrToJ.js → erDiagram-TEJ5UH35-DdRXCTiI.js} +1 -1
- package/dist/export-viewer/assets/{flowDiagram-I6XJVG4X-ClZWyBvf.js → flowDiagram-I6XJVG4X-DKK6r3W7.js} +1 -1
- package/dist/export-viewer/assets/{ganttDiagram-6RSMTGT7-5tuQMCyT.js → ganttDiagram-6RSMTGT7-CWW_TxTP.js} +1 -1
- package/dist/export-viewer/assets/{gitGraphDiagram-PVQCEYII-Cx-jK2f4.js → gitGraphDiagram-PVQCEYII-3aHMAdBt.js} +1 -1
- package/dist/export-viewer/assets/index-CuioZH4K.css +1 -0
- package/dist/export-viewer/assets/{index-BwPxN87d.js → index-DLbBNTlW.js} +1 -1
- package/dist/export-viewer/assets/{index-crd4KOmB.js → index-Dva3VDAG.js} +1 -1
- package/dist/export-viewer/assets/{infoDiagram-5YYISTIA-D-nRIq5J.js → infoDiagram-5YYISTIA-Bo757kAG.js} +1 -1
- package/dist/export-viewer/assets/{ishikawaDiagram-YF4QCWOH-Cs-sSRJo.js → ishikawaDiagram-YF4QCWOH-BN3Rh-6r.js} +1 -1
- package/dist/export-viewer/assets/{journeyDiagram-JHISSGLW-DZtf--k6.js → journeyDiagram-JHISSGLW-DaJY_PCZ.js} +1 -1
- package/dist/export-viewer/assets/{kanban-definition-UN3LZRKU-DRHMhsOJ.js → kanban-definition-UN3LZRKU-vY7sVCki.js} +1 -1
- package/dist/export-viewer/assets/{linear-D9F76417.js → linear-Cu07CTX3.js} +1 -1
- package/dist/export-viewer/assets/{mermaid.core-k55hgfF1.js → mermaid.core-CgBhG13J.js} +4 -4
- package/dist/export-viewer/assets/{mindmap-definition-RKZ34NQL-wf9d75Gq.js → mindmap-definition-RKZ34NQL-_tvwVfbj.js} +1 -1
- package/dist/export-viewer/assets/{pieDiagram-4H26LBE5-DxWufFFD.js → pieDiagram-4H26LBE5-C97enhhq.js} +1 -1
- package/dist/export-viewer/assets/{quadrantDiagram-W4KKPZXB-YEPLDIym.js → quadrantDiagram-W4KKPZXB-CjfZqbvA.js} +1 -1
- package/dist/export-viewer/assets/{requirementDiagram-4Y6WPE33-B09Eu-Ps.js → requirementDiagram-4Y6WPE33-Bkfm-TmH.js} +1 -1
- package/dist/export-viewer/assets/{sankeyDiagram-5OEKKPKP-l5nktnFE.js → sankeyDiagram-5OEKKPKP-DrUy8bSr.js} +1 -1
- package/dist/export-viewer/assets/{sequenceDiagram-3UESZ5HK-chhJjDkx.js → sequenceDiagram-3UESZ5HK-BCnXlJII.js} +1 -1
- package/dist/export-viewer/assets/{stateDiagram-AJRCARHV-qkIskKBR.js → stateDiagram-AJRCARHV-pRL5VGqX.js} +1 -1
- package/dist/export-viewer/assets/stateDiagram-v2-BHNVJYJU-BVUttRak.js +1 -0
- package/dist/export-viewer/assets/{timeline-definition-PNZ67QCA-DKKJQIoh.js → timeline-definition-PNZ67QCA-DAZAtsms.js} +1 -1
- package/dist/export-viewer/assets/{vennDiagram-CIIHVFJN-C44KNZ3C.js → vennDiagram-CIIHVFJN-BSGxUJZy.js} +1 -1
- package/dist/export-viewer/assets/{wardley-L42UT6IY-BTqJ1Ndp.js → wardley-L42UT6IY-CzsqaT3N.js} +1 -1
- package/dist/export-viewer/assets/{wardleyDiagram-YWT4CUSO-BMHDP9f0.js → wardleyDiagram-YWT4CUSO-BXQ12a7x.js} +1 -1
- package/dist/export-viewer/assets/{xychartDiagram-2RQKCTM6-Bv8p0lYf.js → xychartDiagram-2RQKCTM6-Be3Qx7xK.js} +1 -1
- package/dist/export-viewer/index.html +2 -2
- package/package.json +1 -1
- package/src/server/agent.test.ts +65 -1
- package/src/server/agent.ts +54 -3
- package/src/server/app-settings-io.adapter.ts +21 -0
- package/src/server/app-settings.test.ts +296 -0
- package/src/server/app-settings.ts +296 -48
- package/src/server/auth-session-store.test.ts +1 -1
- package/src/server/auth.ts +1 -1
- package/src/server/background-tasks.ts +3 -9
- package/src/server/claude-pty/claude-session-registry.test.ts +1 -1
- package/src/server/claude-pty/driver.test.ts +132 -3
- package/src/server/claude-pty/driver.ts +20 -14
- package/src/server/claude-pty/jsonl-path.test.ts +1 -1
- package/src/server/claude-pty/parity-matrix.test.ts +1 -1
- package/src/server/claude-pty/pid-registry.test.ts +1 -1
- package/src/server/claude-pty/preflight/binary-fingerprint.test.ts +1 -1
- package/src/server/claude-pty/pty-process.test.ts +1 -1
- package/src/server/claude-pty/resolve-binary.test.ts +1 -1
- package/src/server/claude-pty/runtime-dir.adapter.ts +19 -0
- package/src/server/claude-pty/sandbox/detect.test.ts +1 -1
- package/src/server/claude-pty/sandbox/platform.test.ts +1 -1
- package/src/server/claude-pty/sandbox/platform.ts +1 -1
- package/src/server/claude-pty/sandbox/preflight-io.adapter.ts +14 -0
- package/src/server/claude-pty/sandbox/preflight.ts +4 -13
- package/src/server/claude-pty/sandbox/profile-linux.test.ts +1 -1
- package/src/server/claude-pty/sandbox/profile-macos.test.ts +1 -1
- package/src/server/claude-pty/sandbox/{wrap.ts → wrap.adapter.ts} +2 -2
- package/src/server/claude-pty/sandbox/wrap.test.ts +1 -1
- package/src/server/claude-pty/settings-writer.test.ts +1 -1
- package/src/server/claude-pty/smoke-test-io.adapter.ts +28 -0
- package/src/server/claude-pty/smoke-test.ts +19 -14
- package/src/server/claude-pty/tui-control.test.ts +1 -1
- package/src/server/claude-pty/tui-control.ts +1 -1
- package/src/server/claude-pty/{tui-source.test.ts → tui-source.adapter.test.ts} +2 -2
- package/src/server/claude-pty/{tui-source.ts → tui-source.adapter.ts} +2 -2
- package/src/server/{claude-session-importer.ts → claude-session-importer.adapter.ts} +1 -1
- package/src/server/claude-session-importer.test.ts +1 -1
- package/src/server/claude-session-parser.test.ts +1 -1
- package/src/server/{claude-session-scanner.ts → claude-session-scanner.adapter.ts} +1 -1
- package/src/server/claude-session-scanner.test.ts +1 -1
- package/src/server/cli-bootstrap.adapter.ts +8 -0
- package/src/server/cli-runtime.ts +3 -8
- package/src/server/cli.ts +3 -4
- package/src/server/cloudflare-tunnel/e2e.test.ts +1 -1
- package/src/server/cloudflare-tunnel/gateway.ts +1 -1
- package/src/server/cloudflare-tunnel/tunnel-manager.test.ts +1 -1
- package/src/server/codex-app-server.ts +5 -10
- package/src/server/codex-spawn.adapter.ts +9 -0
- package/src/server/diff-store-io.adapter.ts +72 -0
- package/src/server/diff-store.ts +30 -51
- package/src/server/discovery.test.ts +1 -1
- package/src/server/event-store.ts +2 -2
- package/src/server/external-open.ts +3 -3
- package/src/server/fs-stat.adapter.ts +8 -0
- package/src/server/http-server.adapter.ts +33 -0
- package/src/server/kanna-mcp-http.test.ts +90 -0
- package/src/server/kanna-mcp-http.ts +45 -23
- package/src/server/kanna-mcp-tools/bash.test.ts +1 -1
- package/src/server/kanna-mcp-tools/edit.test.ts +1 -1
- package/src/server/kanna-mcp-tools/glob.test.ts +1 -1
- package/src/server/kanna-mcp-tools/grep.test.ts +1 -1
- package/src/server/kanna-mcp-tools/read.test.ts +1 -1
- package/src/server/kanna-mcp-tools/write.test.ts +1 -1
- package/src/server/kanna-mcp.ts +9 -11
- package/src/server/keybindings-store.adapter.ts +58 -0
- package/src/server/keybindings.ts +25 -31
- package/src/server/llm-provider-store.adapter.ts +42 -0
- package/src/server/llm-provider.ts +6 -37
- package/src/server/mcp-validator.test.ts +87 -0
- package/src/server/mcp-validator.ts +129 -0
- package/src/server/orphan-persistence.test.ts +1 -1
- package/src/server/paths.ts +0 -11
- package/src/server/{process-utils.ts → process-utils.adapter.ts} +41 -0
- package/src/server/process-utils.test.ts +1 -1
- package/src/server/project-directory.adapter.ts +11 -0
- package/src/server/project-directory.test.ts +42 -0
- package/src/server/project-paths-io.adapter.ts +38 -0
- package/src/server/project-paths.ts +15 -23
- package/src/{shared → server}/projectFileRelocation.test.ts +1 -1
- package/src/server/push/push-manager.ts +1 -1
- package/src/server/push/vapid.test.ts +1 -1
- package/src/server/server-io.adapter.ts +19 -0
- package/src/server/server.test.ts +94 -0
- package/src/server/server.ts +48 -23
- package/src/server/share-defaults.adapter.ts +6 -0
- package/src/server/share.ts +9 -5
- package/src/server/{standalone-export.test.ts → standalone-export.adapter.test.ts} +1 -1
- package/src/server/storage/backend.test.ts +1 -1
- package/src/server/subagent-entry-cap.test.ts +1 -1
- package/src/server/terminal-manager-io.adapter.ts +18 -0
- package/src/server/terminal-manager.test.ts +1 -1
- package/src/server/terminal-manager.ts +6 -5
- package/src/server/terminal-pid-registry.test.ts +1 -1
- package/src/server/update-strategy.ts +2 -6
- package/src/server/uploads.adapter.ts +98 -0
- package/src/server/uploads.ts +3 -96
- package/src/server/worktree-store.test.ts +1 -1
- package/src/server/ws-router-io.adapter.ts +30 -0
- package/src/server/ws-router.test.ts +445 -1
- package/src/server/ws-router.ts +91 -21
- package/src/shared/protocol.ts +1 -0
- package/src/shared/types.ts +74 -0
- package/dist/client/assets/channel-DUy_5WJV.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-lyJ_PIfS.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-lyJ_PIfS.js +0 -1
- package/dist/client/assets/index-DCneYjil.css +0 -32
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-DxV4Qrt6.js +0 -1
- package/dist/export-viewer/assets/channel-BDCq6Ftz.js +0 -1
- package/dist/export-viewer/assets/classDiagram-4FO5ZUOK-23fnSvv-.js +0 -1
- package/dist/export-viewer/assets/classDiagram-v2-Q7XG4LA2-23fnSvv-.js +0 -1
- package/dist/export-viewer/assets/index-57n7ZNMI.css +0 -1
- package/dist/export-viewer/assets/stateDiagram-v2-BHNVJYJU-E9I_iXW-.js +0 -1
- /package/src/server/{auth-session-store.ts → auth-session-store.adapter.ts} +0 -0
- /package/src/server/claude-pty/{claude-session-registry.ts → claude-session-registry.adapter.ts} +0 -0
- /package/src/server/claude-pty/{jsonl-path.ts → jsonl-path.adapter.ts} +0 -0
- /package/src/server/claude-pty/{pid-registry.ts → pid-registry.adapter.ts} +0 -0
- /package/src/server/claude-pty/preflight/{binary-fingerprint.ts → binary-fingerprint.adapter.ts} +0 -0
- /package/src/server/claude-pty/{pty-process.ts → pty-process.adapter.ts} +0 -0
- /package/src/server/claude-pty/{resolve-binary.ts → resolve-binary.adapter.ts} +0 -0
- /package/src/server/claude-pty/sandbox/{detect.ts → detect.adapter.ts} +0 -0
- /package/src/server/claude-pty/sandbox/{profile-linux.ts → profile-linux.adapter.ts} +0 -0
- /package/src/server/claude-pty/sandbox/{profile-macos.ts → profile-macos.adapter.ts} +0 -0
- /package/src/server/claude-pty/{settings-writer.ts → settings-writer.adapter.ts} +0 -0
- /package/src/server/{claude-session-parser.ts → claude-session-parser.adapter.ts} +0 -0
- /package/src/server/{cli-supervisor.ts → cli-supervisor.adapter.ts} +0 -0
- /package/src/server/cloudflare-tunnel/{tunnel-manager.ts → tunnel-manager.adapter.ts} +0 -0
- /package/src/server/{discovery.ts → discovery.adapter.ts} +0 -0
- /package/src/server/kanna-mcp-tools/{bash.ts → bash.adapter.ts} +0 -0
- /package/src/server/kanna-mcp-tools/{edit.ts → edit.adapter.ts} +0 -0
- /package/src/server/kanna-mcp-tools/{glob.ts → glob.adapter.ts} +0 -0
- /package/src/server/kanna-mcp-tools/{grep.ts → grep.adapter.ts} +0 -0
- /package/src/server/kanna-mcp-tools/{read.ts → read.adapter.ts} +0 -0
- /package/src/server/kanna-mcp-tools/{write.ts → write.adapter.ts} +0 -0
- /package/src/server/{machine-name.ts → machine-name.adapter.ts} +0 -0
- /package/src/server/{orphan-persistence.ts → orphan-persistence.adapter.ts} +0 -0
- /package/src/{shared/projectFileRelocation.ts → server/projectFileRelocation.adapter.ts} +0 -0
- /package/src/server/push/{vapid.ts → vapid.adapter.ts} +0 -0
- /package/src/server/{standalone-export.ts → standalone-export.adapter.ts} +0 -0
- /package/src/server/storage/{fs-storage.ts → fs-storage.adapter.ts} +0 -0
- /package/src/server/{subagent-entry-cap.ts → subagent-entry-cap.adapter.ts} +0 -0
- /package/src/server/{terminal-pid-registry.ts → terminal-pid-registry.adapter.ts} +0 -0
- /package/src/server/{worktree-store.ts → worktree-store.adapter.ts} +0 -0
package/README.md
CHANGED
|
@@ -122,32 +122,100 @@ That's it. Kanna opens in your browser at [`localhost:3210`](http://localhost:32
|
|
|
122
122
|
|
|
123
123
|
## Architecture
|
|
124
124
|
|
|
125
|
+
```mermaid
|
|
126
|
+
flowchart LR
|
|
127
|
+
Browser["Browser<br/>React + Zustand"]
|
|
128
|
+
|
|
129
|
+
subgraph Server["Bun Server (src/server/**)"]
|
|
130
|
+
direction TB
|
|
131
|
+
WS["WSRouter<br/>subscriptions + commands"]
|
|
132
|
+
Auth["Auth gate"]
|
|
133
|
+
Agent["AgentCoordinator<br/>multi-provider turns"]
|
|
134
|
+
ES["EventStore<br/>append-only JSONL + snapshots"]
|
|
135
|
+
RM["ReadModels<br/>derived views"]
|
|
136
|
+
Diff["DiffStore"]
|
|
137
|
+
Term["TerminalManager"]
|
|
138
|
+
Up["Uploads"]
|
|
139
|
+
Disc["Discovery"]
|
|
140
|
+
Push["Push"]
|
|
141
|
+
Tun["Share / Tunnel"]
|
|
142
|
+
Upd["UpdateManager"]
|
|
143
|
+
|
|
144
|
+
subgraph Adapters["*.adapter.ts (IO seal exempt)"]
|
|
145
|
+
direction LR
|
|
146
|
+
FsA["fs / chokidar"]
|
|
147
|
+
DbA["bun:sqlite / pg"]
|
|
148
|
+
SpA["Bun.spawn / child_process"]
|
|
149
|
+
HtA["node:http / fetch"]
|
|
150
|
+
PtyA["Bun.Terminal (PTY)"]
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
WS --> Agent
|
|
154
|
+
WS --> ES
|
|
155
|
+
WS --> RM
|
|
156
|
+
Agent --> ES
|
|
157
|
+
Agent -.spawn.-> SpA
|
|
158
|
+
Agent -.spawn.-> PtyA
|
|
159
|
+
ES -.fs.-> FsA
|
|
160
|
+
Diff -.fs+spawn.-> SpA
|
|
161
|
+
Diff -.fs.-> FsA
|
|
162
|
+
Term -.pty.-> PtyA
|
|
163
|
+
Up -.fs.-> FsA
|
|
164
|
+
Disc -.fs.-> FsA
|
|
165
|
+
Tun -.spawn+http.-> SpA
|
|
166
|
+
Tun -.http.-> HtA
|
|
167
|
+
Upd -.spawn.-> SpA
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
subgraph Shared["src/shared/** (pure)"]
|
|
171
|
+
Proto["protocol types"]
|
|
172
|
+
Types["domain types"]
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
subgraph External["External processes"]
|
|
176
|
+
CC["Claude Agent SDK / claude CLI (PTY)"]
|
|
177
|
+
CX["Codex App Server"]
|
|
178
|
+
FS["Local FS<br/>~/.kanna/data/, project dirs"]
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
Browser <-->|WebSocket| WS
|
|
182
|
+
Browser -.types.-> Shared
|
|
183
|
+
Server -.types.-> Shared
|
|
184
|
+
|
|
185
|
+
SpA --> CC
|
|
186
|
+
SpA --> CX
|
|
187
|
+
PtyA --> CC
|
|
188
|
+
FsA --> FS
|
|
125
189
|
```
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
├── ProviderCatalog ── provider/model/effort normalization
|
|
133
|
-
├── QuickResponse ──── structured queries with provider fallback
|
|
134
|
-
├── EventStore ─────── append-only JSONL + snapshot compaction
|
|
135
|
-
├── ReadModels ─────── derived views (sidebar, chat, projects)
|
|
136
|
-
├── DiffStore ──────── per-chat diff hydration
|
|
137
|
-
├── TerminalManager ── PTY sessions for the embedded terminal
|
|
138
|
-
├── Uploads ────────── drag-drop attachment intake
|
|
139
|
-
├── Discovery ──────── scan Claude/Codex local history
|
|
140
|
-
├── Push ───────────── web-push notifications
|
|
141
|
-
├── Share / Tunnel ─── trycloudflare + cloudflared
|
|
142
|
-
└── UpdateManager ──── self-update + reload strategy
|
|
143
|
-
↕ stdio / PTY
|
|
144
|
-
Claude Agent SDK · Claude CLI (PTY) · Codex App Server
|
|
145
|
-
↕
|
|
146
|
-
Local File System (~/.kanna/data/, project dirs)
|
|
147
|
-
```
|
|
190
|
+
|
|
191
|
+
**Layer rules (lint-enforced, see [CLAUDE.md](./CLAUDE.md#side-effect-lint-ports-and-adapters-seal)):**
|
|
192
|
+
|
|
193
|
+
- `src/shared/**` + `src/client/**` — pure. ESLint `no-restricted-imports` errors on `node:fs`, `bun:sqlite`, `node:child_process`, `node:http`, `Bun.spawn`, `Bun.file`, `Bun.serve`, …
|
|
194
|
+
- `src/server/**` production — also sealed at `error`. Side-effect call sites only allowed inside files matching `**/*.adapter.ts` (or the legacy `src/server/adapters/**` dir).
|
|
195
|
+
- Mixed-concern modules extract their IO into a sibling `*-io.adapter.ts` and import through it.
|
|
148
196
|
|
|
149
197
|
**Key patterns:** Event sourcing for all state mutations. CQRS with separate write (event log) and read (derived snapshots) paths. Reactive broadcasting — subscribers get pushed fresh snapshots on every state change. Multi-provider agent coordination with tool gating for user-approval flows. Provider-agnostic transcript hydration for unified rendering.
|
|
150
198
|
|
|
199
|
+
### Workflow: adding code that touches IO
|
|
200
|
+
|
|
201
|
+
```mermaid
|
|
202
|
+
flowchart TD
|
|
203
|
+
Start(["You need fs / spawn / http / DB / Bun globals"]) --> Layer{"Which layer?"}
|
|
204
|
+
Layer -->|src/shared or src/client| Reject["ESLint errors at CI"]
|
|
205
|
+
Reject --> Move["Move the module to src/server/**<br/>or inject through a typed parameter"]
|
|
206
|
+
Move --> Server
|
|
207
|
+
Layer -->|src/server| Server{"File responsibility?"}
|
|
208
|
+
Server -->|leaf IO wrapper| RenameAdapter["Name it foo.adapter.ts<br/>(exempt from seal)"]
|
|
209
|
+
Server -->|mixed domain + IO| SiblingAdapter["Extract calls into foo-io.adapter.ts<br/>keep domain logic in foo.ts<br/>import helpers from the adapter"]
|
|
210
|
+
Server -->|domain only| Port["Take a typed port parameter<br/>provided by caller's adapter"]
|
|
211
|
+
RenameAdapter --> Lint["bun run lint"]
|
|
212
|
+
SiblingAdapter --> Lint
|
|
213
|
+
Port --> Lint
|
|
214
|
+
Lint --> CI(["CI: lint + tests + build"])
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
For the longer story (90 → 0 burndown, ratchet pipeline retired in PR #303) see the **Side-Effect Lint** section of `CLAUDE.md`.
|
|
218
|
+
|
|
151
219
|
## Requirements
|
|
152
220
|
|
|
153
221
|
- [Bun](https://bun.sh) v1.3.11+
|
package/bin/kanna
CHANGED
|
@@ -5,5 +5,5 @@ import { CLI_CHILD_MODE, CLI_CHILD_MODE_ENV_VAR } from "../src/server/restart"
|
|
|
5
5
|
if (process.env[CLI_CHILD_MODE_ENV_VAR] === CLI_CHILD_MODE) {
|
|
6
6
|
await import("../src/server/cli.ts")
|
|
7
7
|
} else {
|
|
8
|
-
await import("../src/server/cli-supervisor.ts")
|
|
8
|
+
await import("../src/server/cli-supervisor.adapter.ts")
|
|
9
9
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{M as ln,N as an,O as Y,P as O,Q,R as un,S as y,T as tn,V as j,W as _,X as rn,Y as o,Z as on,$ as sn,a0 as fn}from"./mermaid.core-
|
|
1
|
+
import{M as ln,N as an,O as Y,P as O,Q,R as un,S as y,T as tn,V as j,W as _,X as rn,Y as o,Z as on,$ as sn,a0 as fn}from"./mermaid.core-D-bvfjq-.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,D,S,v,R,V,a){var E=D-l,i=S-h,n=V-v,d=a-R,u=d*E-n*i;if(!(u*u<y))return u=(n*(h-R)-d*(l-v))/u,[l+u*E,h+u*i]}function H(l,h,D,S,v,R,V){var a=l-D,E=h-S,i=(V?R:-R)/j(a*a+E*E),n=i*E,d=-i*a,u=l+n,s=h+d,f=D+n,c=S+d,W=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,A=m*m+g*g,T=v-R,P=u*c-f*s,I=(g<0?-1:1)*j(on(0,T*T*A-P*P)),M=(P*g-m*I)/A,N=(-P*m-g*I)/A,w=(P*g+m*I)/A,p=(-P*m+g*I)/A,x=M-W,e=N-t,r=w-W,X=p-t;return x*x+e*e>r*r+X*X&&(M=w,N=p),{cx:M,cy:N,x01:-n,y01:-d,x11:M*(v/T-1),y11:N*(v/T-1)}}function hn(){var l=cn,h=yn,D=Q(0),S=null,v=gn,R=dn,V=mn,a=null,E=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-un,c=R.apply(this,arguments)-un,W=rn(c-f),t=c>f;if(a||(a=n=E()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(W>tn-y)a.moveTo(s*Y(f),s*O(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*Y(c),u*O(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,A=f,T=c,P=W,I=W,M=V.apply(this,arguments)/2,N=M>y&&(S?+S.apply(this,arguments):j(u*u+s*s)),w=_(rn(s-u)/2,+D.apply(this,arguments)),p=w,x=w,e,r;if(N>y){var X=sn(N/u*O(M)),z=sn(N/s*O(M));(P-=X*2)>y?(X*=t?1:-1,A+=X,T-=X):(P=0,A=T=(f+c)/2),(I-=z*2)>y?(z*=t?1:-1,m+=z,g-=z):(I=0,m=g=(f+c)/2)}var Z=s*Y(m),$=s*O(m),B=u*Y(T),C=u*O(T);if(w>y){var F=s*Y(g),G=s*O(g),J=u*Y(A),K=u*O(A),q;if(W<an)if(q=pn(Z,$,J,K,F,G,B,C)){var L=Z-q[0],U=$-q[1],k=F-q[0],b=G-q[1],nn=1/O(fn((L*k+U*b)/(j(L*L+U*U)*j(k*k+b*b)))/2),en=j(q[0]*q[0]+q[1]*q[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}I>y?x>y?(e=H(J,K,Z,$,s,x,t),r=H(F,G,B,C,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(Z,$),a.arc(0,0,s,m,g,!t)):a.moveTo(Z,$),!(u>y)||!(P>y)?a.lineTo(B,C):p>y?(e=H(B,C,F,G,u,-p,t),r=H(Z,$,J,K,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,A,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +R.apply(this,arguments))/2-an/2;return[Y(d)*n,O(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:Q(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:Q(+n),i):h},i.cornerRadius=function(n){return arguments.length?(D=typeof n=="function"?n:Q(+n),i):D},i.padRadius=function(n){return arguments.length?(S=n==null?null:typeof n=="function"?n:Q(+n),i):S},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:Q(+n),i):v},i.endAngle=function(n){return arguments.length?(R=typeof n=="function"?n:Q(+n),i):R},i.padAngle=function(n){return arguments.length?(V=typeof n=="function"?n:Q(+n),i):V},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};
|