@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.
Files changed (242) hide show
  1. package/README.md +90 -22
  2. package/bin/kanna +1 -1
  3. package/dist/client/assets/{arc-6rqObOmm.js → arc-D7roR3pL.js} +1 -1
  4. package/dist/client/assets/{architectureDiagram-3BPJPVTR-CxkIpcjJ.js → architectureDiagram-3BPJPVTR-Nj1aflQv.js} +1 -1
  5. package/dist/client/assets/{blockDiagram-GPEHLZMM-CJbqABjR.js → blockDiagram-GPEHLZMM-BUMlypvO.js} +1 -1
  6. package/dist/{export-viewer/assets/c4Diagram-AAUBKEIU-CbfNoToa.js → client/assets/c4Diagram-AAUBKEIU-7YGD-8Es.js} +1 -1
  7. package/dist/client/assets/channel-DWvRUK2v.js +1 -0
  8. package/dist/client/assets/{chunk-2J33WTMH-Bm-JOUOV.js → chunk-2J33WTMH-mHvOQgNj.js} +1 -1
  9. package/dist/client/assets/{chunk-4BX2VUAB-DQihGVyX.js → chunk-4BX2VUAB-Dh4dMH-R.js} +1 -1
  10. package/dist/client/assets/{chunk-55IACEB6-BcwxGwlw.js → chunk-55IACEB6-OtdEc6ft.js} +1 -1
  11. package/dist/client/assets/{chunk-727SXJPM-BD89PJaR.js → chunk-727SXJPM-BWrMQqXE.js} +1 -1
  12. package/dist/client/assets/{chunk-AQP2D5EJ-FOUAdFUU.js → chunk-AQP2D5EJ-BK1XsDEQ.js} +1 -1
  13. package/dist/client/assets/{chunk-FMBD7UC4-7PMDCBFl.js → chunk-FMBD7UC4-Bd3dWpXh.js} +1 -1
  14. package/dist/client/assets/{chunk-ND2GUHAM-DSdsxJVy.js → chunk-ND2GUHAM-6YlumEMP.js} +1 -1
  15. package/dist/client/assets/{chunk-QZHKN3VN-BYLw-ds9.js → chunk-QZHKN3VN-BIYzn9x4.js} +1 -1
  16. package/dist/client/assets/classDiagram-4FO5ZUOK-DE5NCIih.js +1 -0
  17. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DE5NCIih.js +1 -0
  18. package/dist/client/assets/{cose-bilkent-S5V4N54A-X-6eH_h6.js → cose-bilkent-S5V4N54A-DPIA-Ost.js} +1 -1
  19. package/dist/client/assets/{dagre-BM42HDAG-D8rEq6gy.js → dagre-BM42HDAG-DmOTzlE1.js} +1 -1
  20. package/dist/client/assets/{diagram-2AECGRRQ-BQujBx9f.js → diagram-2AECGRRQ-UkywC8at.js} +1 -1
  21. package/dist/client/assets/{diagram-5GNKFQAL-DrHLZWOZ.js → diagram-5GNKFQAL-CivkF07i.js} +1 -1
  22. package/dist/client/assets/{diagram-KO2AKTUF-BlntbwXf.js → diagram-KO2AKTUF-DHHHacVZ.js} +1 -1
  23. package/dist/client/assets/{diagram-LMA3HP47-iA-sUyQL.js → diagram-LMA3HP47-DQK0OPVj.js} +1 -1
  24. package/dist/client/assets/{diagram-OG6HWLK6-BMnuKMmb.js → diagram-OG6HWLK6-CWRZkWOw.js} +1 -1
  25. package/dist/client/assets/{erDiagram-TEJ5UH35-Cv7NPRVR.js → erDiagram-TEJ5UH35-ujAll4KH.js} +1 -1
  26. package/dist/client/assets/{flowDiagram-I6XJVG4X-hJH2PIjt.js → flowDiagram-I6XJVG4X-CPWE1-gN.js} +1 -1
  27. package/dist/client/assets/{ganttDiagram-6RSMTGT7-CYk6W-Y6.js → ganttDiagram-6RSMTGT7-CZELtuqi.js} +1 -1
  28. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DwCJhBFL.js → gitGraphDiagram-PVQCEYII-Iu0Q_ujX.js} +1 -1
  29. package/dist/client/assets/{index-D4pnYQXQ.js → index-BezNusND.js} +1 -1
  30. package/dist/client/assets/index-CkllA-SX.css +32 -0
  31. package/dist/client/assets/{index-BQGcj0cU.js → index-DAZ0kBky.js} +228 -217
  32. package/dist/client/assets/{infoDiagram-5YYISTIA-oQ3cOa-K.js → infoDiagram-5YYISTIA-B6ATUFkf.js} +1 -1
  33. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-Cb0BjmTp.js → ishikawaDiagram-YF4QCWOH-C22MyrvL.js} +1 -1
  34. package/dist/client/assets/{journeyDiagram-JHISSGLW-DbTrJRzi.js → journeyDiagram-JHISSGLW-BGXgKLtt.js} +1 -1
  35. package/dist/client/assets/{kanban-definition-UN3LZRKU-DX58KncR.js → kanban-definition-UN3LZRKU-COdoUY_x.js} +1 -1
  36. package/dist/client/assets/{linear-CCBU7Q26.js → linear-Ch4Ox0-n.js} +1 -1
  37. package/dist/client/assets/{mermaid.core-ioWoAQF9.js → mermaid.core-D-bvfjq-.js} +4 -4
  38. package/dist/client/assets/{mindmap-definition-RKZ34NQL-GXdHusqW.js → mindmap-definition-RKZ34NQL-CyUl6CIT.js} +1 -1
  39. package/dist/client/assets/{pieDiagram-4H26LBE5-DkFGt3Mh.js → pieDiagram-4H26LBE5-BMksdqi1.js} +1 -1
  40. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-Hfbw4nnp.js → quadrantDiagram-W4KKPZXB-CTEWjiF6.js} +1 -1
  41. package/dist/client/assets/{requirementDiagram-4Y6WPE33-oSrGpqoD.js → requirementDiagram-4Y6WPE33-DKC1s5F3.js} +1 -1
  42. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-40tV6h8V.js → sankeyDiagram-5OEKKPKP-Njh6vEi3.js} +1 -1
  43. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-BRZPlybu.js → sequenceDiagram-3UESZ5HK-DLgQaXbD.js} +1 -1
  44. package/dist/client/assets/{stateDiagram-AJRCARHV-CoSPvljD.js → stateDiagram-AJRCARHV-B_tMvJ11.js} +1 -1
  45. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-DooP1BtV.js +1 -0
  46. package/dist/client/assets/{timeline-definition-PNZ67QCA-BP1kVMMz.js → timeline-definition-PNZ67QCA-BKzu-j5r.js} +1 -1
  47. package/dist/client/assets/{vennDiagram-CIIHVFJN-D4LlJ7Uq.js → vennDiagram-CIIHVFJN-RWvN2c-p.js} +1 -1
  48. package/dist/client/assets/{wardley-L42UT6IY-weZ0vk2k.js → wardley-L42UT6IY-DG9t1AKi.js} +1 -1
  49. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-CiVolfBJ.js → wardleyDiagram-YWT4CUSO-XSUvO3MG.js} +1 -1
  50. package/dist/client/assets/{xychartDiagram-2RQKCTM6-DgWLAzyp.js → xychartDiagram-2RQKCTM6-CuVWviDF.js} +1 -1
  51. package/dist/client/index.html +2 -2
  52. package/dist/export-viewer/assets/{arc-S6TIfKz1.js → arc-AHpMGWAu.js} +1 -1
  53. package/dist/export-viewer/assets/{architectureDiagram-3BPJPVTR-C51zckh6.js → architectureDiagram-3BPJPVTR-Bm987ZPC.js} +1 -1
  54. package/dist/export-viewer/assets/{blockDiagram-GPEHLZMM-CXJt6VQj.js → blockDiagram-GPEHLZMM-C3LMeBAO.js} +1 -1
  55. package/dist/{client/assets/c4Diagram-AAUBKEIU-Bxey9nZp.js → export-viewer/assets/c4Diagram-AAUBKEIU-aWhAjGxV.js} +1 -1
  56. package/dist/export-viewer/assets/channel-Dq_eeGxJ.js +1 -0
  57. package/dist/export-viewer/assets/{chunk-2J33WTMH-BB9QHA6x.js → chunk-2J33WTMH-GWoydUvj.js} +1 -1
  58. package/dist/export-viewer/assets/{chunk-4BX2VUAB-KxhUQ0X8.js → chunk-4BX2VUAB-Bx9M4wre.js} +1 -1
  59. package/dist/export-viewer/assets/{chunk-55IACEB6-D1uXHkui.js → chunk-55IACEB6-DyLWoNY4.js} +1 -1
  60. package/dist/export-viewer/assets/{chunk-727SXJPM-CCzWGHrz.js → chunk-727SXJPM-tBTU5bog.js} +1 -1
  61. package/dist/export-viewer/assets/{chunk-AQP2D5EJ-8BJgfNvf.js → chunk-AQP2D5EJ-D0p2uR3j.js} +1 -1
  62. package/dist/export-viewer/assets/{chunk-FMBD7UC4-BM4JJj1S.js → chunk-FMBD7UC4-Cc41SMP1.js} +1 -1
  63. package/dist/export-viewer/assets/{chunk-ND2GUHAM-D-rxq3vC.js → chunk-ND2GUHAM-DjVxgSON.js} +1 -1
  64. package/dist/export-viewer/assets/{chunk-QZHKN3VN-CIfSIK0Q.js → chunk-QZHKN3VN-BH3bTEYA.js} +1 -1
  65. package/dist/export-viewer/assets/classDiagram-4FO5ZUOK-tGNLWra8.js +1 -0
  66. package/dist/export-viewer/assets/classDiagram-v2-Q7XG4LA2-tGNLWra8.js +1 -0
  67. package/dist/export-viewer/assets/{cose-bilkent-S5V4N54A-BNjCeOhY.js → cose-bilkent-S5V4N54A-CKpY4J4V.js} +1 -1
  68. package/dist/export-viewer/assets/{dagre-BM42HDAG-my_xl-lk.js → dagre-BM42HDAG-CU2WJNBl.js} +1 -1
  69. package/dist/export-viewer/assets/{diagram-2AECGRRQ-D813Cl4i.js → diagram-2AECGRRQ-BjLNHrYm.js} +1 -1
  70. package/dist/export-viewer/assets/{diagram-5GNKFQAL-Ba5iLbIO.js → diagram-5GNKFQAL-tYXUfyFE.js} +1 -1
  71. package/dist/export-viewer/assets/{diagram-KO2AKTUF-BrZKHqxq.js → diagram-KO2AKTUF-Ddhb1bz0.js} +1 -1
  72. package/dist/export-viewer/assets/{diagram-LMA3HP47-CLswzePI.js → diagram-LMA3HP47-BRlB3ma4.js} +1 -1
  73. package/dist/export-viewer/assets/{diagram-OG6HWLK6-C5rARFQ5.js → diagram-OG6HWLK6-DiGkS5Km.js} +1 -1
  74. package/dist/export-viewer/assets/{erDiagram-TEJ5UH35-B0FhrToJ.js → erDiagram-TEJ5UH35-DdRXCTiI.js} +1 -1
  75. package/dist/export-viewer/assets/{flowDiagram-I6XJVG4X-ClZWyBvf.js → flowDiagram-I6XJVG4X-DKK6r3W7.js} +1 -1
  76. package/dist/export-viewer/assets/{ganttDiagram-6RSMTGT7-5tuQMCyT.js → ganttDiagram-6RSMTGT7-CWW_TxTP.js} +1 -1
  77. package/dist/export-viewer/assets/{gitGraphDiagram-PVQCEYII-Cx-jK2f4.js → gitGraphDiagram-PVQCEYII-3aHMAdBt.js} +1 -1
  78. package/dist/export-viewer/assets/index-CuioZH4K.css +1 -0
  79. package/dist/export-viewer/assets/{index-BwPxN87d.js → index-DLbBNTlW.js} +1 -1
  80. package/dist/export-viewer/assets/{index-crd4KOmB.js → index-Dva3VDAG.js} +1 -1
  81. package/dist/export-viewer/assets/{infoDiagram-5YYISTIA-D-nRIq5J.js → infoDiagram-5YYISTIA-Bo757kAG.js} +1 -1
  82. package/dist/export-viewer/assets/{ishikawaDiagram-YF4QCWOH-Cs-sSRJo.js → ishikawaDiagram-YF4QCWOH-BN3Rh-6r.js} +1 -1
  83. package/dist/export-viewer/assets/{journeyDiagram-JHISSGLW-DZtf--k6.js → journeyDiagram-JHISSGLW-DaJY_PCZ.js} +1 -1
  84. package/dist/export-viewer/assets/{kanban-definition-UN3LZRKU-DRHMhsOJ.js → kanban-definition-UN3LZRKU-vY7sVCki.js} +1 -1
  85. package/dist/export-viewer/assets/{linear-D9F76417.js → linear-Cu07CTX3.js} +1 -1
  86. package/dist/export-viewer/assets/{mermaid.core-k55hgfF1.js → mermaid.core-CgBhG13J.js} +4 -4
  87. package/dist/export-viewer/assets/{mindmap-definition-RKZ34NQL-wf9d75Gq.js → mindmap-definition-RKZ34NQL-_tvwVfbj.js} +1 -1
  88. package/dist/export-viewer/assets/{pieDiagram-4H26LBE5-DxWufFFD.js → pieDiagram-4H26LBE5-C97enhhq.js} +1 -1
  89. package/dist/export-viewer/assets/{quadrantDiagram-W4KKPZXB-YEPLDIym.js → quadrantDiagram-W4KKPZXB-CjfZqbvA.js} +1 -1
  90. package/dist/export-viewer/assets/{requirementDiagram-4Y6WPE33-B09Eu-Ps.js → requirementDiagram-4Y6WPE33-Bkfm-TmH.js} +1 -1
  91. package/dist/export-viewer/assets/{sankeyDiagram-5OEKKPKP-l5nktnFE.js → sankeyDiagram-5OEKKPKP-DrUy8bSr.js} +1 -1
  92. package/dist/export-viewer/assets/{sequenceDiagram-3UESZ5HK-chhJjDkx.js → sequenceDiagram-3UESZ5HK-BCnXlJII.js} +1 -1
  93. package/dist/export-viewer/assets/{stateDiagram-AJRCARHV-qkIskKBR.js → stateDiagram-AJRCARHV-pRL5VGqX.js} +1 -1
  94. package/dist/export-viewer/assets/stateDiagram-v2-BHNVJYJU-BVUttRak.js +1 -0
  95. package/dist/export-viewer/assets/{timeline-definition-PNZ67QCA-DKKJQIoh.js → timeline-definition-PNZ67QCA-DAZAtsms.js} +1 -1
  96. package/dist/export-viewer/assets/{vennDiagram-CIIHVFJN-C44KNZ3C.js → vennDiagram-CIIHVFJN-BSGxUJZy.js} +1 -1
  97. package/dist/export-viewer/assets/{wardley-L42UT6IY-BTqJ1Ndp.js → wardley-L42UT6IY-CzsqaT3N.js} +1 -1
  98. package/dist/export-viewer/assets/{wardleyDiagram-YWT4CUSO-BMHDP9f0.js → wardleyDiagram-YWT4CUSO-BXQ12a7x.js} +1 -1
  99. package/dist/export-viewer/assets/{xychartDiagram-2RQKCTM6-Bv8p0lYf.js → xychartDiagram-2RQKCTM6-Be3Qx7xK.js} +1 -1
  100. package/dist/export-viewer/index.html +2 -2
  101. package/package.json +1 -1
  102. package/src/server/agent.test.ts +65 -1
  103. package/src/server/agent.ts +54 -3
  104. package/src/server/app-settings-io.adapter.ts +21 -0
  105. package/src/server/app-settings.test.ts +296 -0
  106. package/src/server/app-settings.ts +296 -48
  107. package/src/server/auth-session-store.test.ts +1 -1
  108. package/src/server/auth.ts +1 -1
  109. package/src/server/background-tasks.ts +3 -9
  110. package/src/server/claude-pty/claude-session-registry.test.ts +1 -1
  111. package/src/server/claude-pty/driver.test.ts +132 -3
  112. package/src/server/claude-pty/driver.ts +20 -14
  113. package/src/server/claude-pty/jsonl-path.test.ts +1 -1
  114. package/src/server/claude-pty/parity-matrix.test.ts +1 -1
  115. package/src/server/claude-pty/pid-registry.test.ts +1 -1
  116. package/src/server/claude-pty/preflight/binary-fingerprint.test.ts +1 -1
  117. package/src/server/claude-pty/pty-process.test.ts +1 -1
  118. package/src/server/claude-pty/resolve-binary.test.ts +1 -1
  119. package/src/server/claude-pty/runtime-dir.adapter.ts +19 -0
  120. package/src/server/claude-pty/sandbox/detect.test.ts +1 -1
  121. package/src/server/claude-pty/sandbox/platform.test.ts +1 -1
  122. package/src/server/claude-pty/sandbox/platform.ts +1 -1
  123. package/src/server/claude-pty/sandbox/preflight-io.adapter.ts +14 -0
  124. package/src/server/claude-pty/sandbox/preflight.ts +4 -13
  125. package/src/server/claude-pty/sandbox/profile-linux.test.ts +1 -1
  126. package/src/server/claude-pty/sandbox/profile-macos.test.ts +1 -1
  127. package/src/server/claude-pty/sandbox/{wrap.ts → wrap.adapter.ts} +2 -2
  128. package/src/server/claude-pty/sandbox/wrap.test.ts +1 -1
  129. package/src/server/claude-pty/settings-writer.test.ts +1 -1
  130. package/src/server/claude-pty/smoke-test-io.adapter.ts +28 -0
  131. package/src/server/claude-pty/smoke-test.ts +19 -14
  132. package/src/server/claude-pty/tui-control.test.ts +1 -1
  133. package/src/server/claude-pty/tui-control.ts +1 -1
  134. package/src/server/claude-pty/{tui-source.test.ts → tui-source.adapter.test.ts} +2 -2
  135. package/src/server/claude-pty/{tui-source.ts → tui-source.adapter.ts} +2 -2
  136. package/src/server/{claude-session-importer.ts → claude-session-importer.adapter.ts} +1 -1
  137. package/src/server/claude-session-importer.test.ts +1 -1
  138. package/src/server/claude-session-parser.test.ts +1 -1
  139. package/src/server/{claude-session-scanner.ts → claude-session-scanner.adapter.ts} +1 -1
  140. package/src/server/claude-session-scanner.test.ts +1 -1
  141. package/src/server/cli-bootstrap.adapter.ts +8 -0
  142. package/src/server/cli-runtime.ts +3 -8
  143. package/src/server/cli.ts +3 -4
  144. package/src/server/cloudflare-tunnel/e2e.test.ts +1 -1
  145. package/src/server/cloudflare-tunnel/gateway.ts +1 -1
  146. package/src/server/cloudflare-tunnel/tunnel-manager.test.ts +1 -1
  147. package/src/server/codex-app-server.ts +5 -10
  148. package/src/server/codex-spawn.adapter.ts +9 -0
  149. package/src/server/diff-store-io.adapter.ts +72 -0
  150. package/src/server/diff-store.ts +30 -51
  151. package/src/server/discovery.test.ts +1 -1
  152. package/src/server/event-store.ts +2 -2
  153. package/src/server/external-open.ts +3 -3
  154. package/src/server/fs-stat.adapter.ts +8 -0
  155. package/src/server/http-server.adapter.ts +33 -0
  156. package/src/server/kanna-mcp-http.test.ts +90 -0
  157. package/src/server/kanna-mcp-http.ts +45 -23
  158. package/src/server/kanna-mcp-tools/bash.test.ts +1 -1
  159. package/src/server/kanna-mcp-tools/edit.test.ts +1 -1
  160. package/src/server/kanna-mcp-tools/glob.test.ts +1 -1
  161. package/src/server/kanna-mcp-tools/grep.test.ts +1 -1
  162. package/src/server/kanna-mcp-tools/read.test.ts +1 -1
  163. package/src/server/kanna-mcp-tools/write.test.ts +1 -1
  164. package/src/server/kanna-mcp.ts +9 -11
  165. package/src/server/keybindings-store.adapter.ts +58 -0
  166. package/src/server/keybindings.ts +25 -31
  167. package/src/server/llm-provider-store.adapter.ts +42 -0
  168. package/src/server/llm-provider.ts +6 -37
  169. package/src/server/mcp-validator.test.ts +87 -0
  170. package/src/server/mcp-validator.ts +129 -0
  171. package/src/server/orphan-persistence.test.ts +1 -1
  172. package/src/server/paths.ts +0 -11
  173. package/src/server/{process-utils.ts → process-utils.adapter.ts} +41 -0
  174. package/src/server/process-utils.test.ts +1 -1
  175. package/src/server/project-directory.adapter.ts +11 -0
  176. package/src/server/project-directory.test.ts +42 -0
  177. package/src/server/project-paths-io.adapter.ts +38 -0
  178. package/src/server/project-paths.ts +15 -23
  179. package/src/{shared → server}/projectFileRelocation.test.ts +1 -1
  180. package/src/server/push/push-manager.ts +1 -1
  181. package/src/server/push/vapid.test.ts +1 -1
  182. package/src/server/server-io.adapter.ts +19 -0
  183. package/src/server/server.test.ts +94 -0
  184. package/src/server/server.ts +48 -23
  185. package/src/server/share-defaults.adapter.ts +6 -0
  186. package/src/server/share.ts +9 -5
  187. package/src/server/{standalone-export.test.ts → standalone-export.adapter.test.ts} +1 -1
  188. package/src/server/storage/backend.test.ts +1 -1
  189. package/src/server/subagent-entry-cap.test.ts +1 -1
  190. package/src/server/terminal-manager-io.adapter.ts +18 -0
  191. package/src/server/terminal-manager.test.ts +1 -1
  192. package/src/server/terminal-manager.ts +6 -5
  193. package/src/server/terminal-pid-registry.test.ts +1 -1
  194. package/src/server/update-strategy.ts +2 -6
  195. package/src/server/uploads.adapter.ts +98 -0
  196. package/src/server/uploads.ts +3 -96
  197. package/src/server/worktree-store.test.ts +1 -1
  198. package/src/server/ws-router-io.adapter.ts +30 -0
  199. package/src/server/ws-router.test.ts +445 -1
  200. package/src/server/ws-router.ts +91 -21
  201. package/src/shared/protocol.ts +1 -0
  202. package/src/shared/types.ts +74 -0
  203. package/dist/client/assets/channel-DUy_5WJV.js +0 -1
  204. package/dist/client/assets/classDiagram-4FO5ZUOK-lyJ_PIfS.js +0 -1
  205. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-lyJ_PIfS.js +0 -1
  206. package/dist/client/assets/index-DCneYjil.css +0 -32
  207. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-DxV4Qrt6.js +0 -1
  208. package/dist/export-viewer/assets/channel-BDCq6Ftz.js +0 -1
  209. package/dist/export-viewer/assets/classDiagram-4FO5ZUOK-23fnSvv-.js +0 -1
  210. package/dist/export-viewer/assets/classDiagram-v2-Q7XG4LA2-23fnSvv-.js +0 -1
  211. package/dist/export-viewer/assets/index-57n7ZNMI.css +0 -1
  212. package/dist/export-viewer/assets/stateDiagram-v2-BHNVJYJU-E9I_iXW-.js +0 -1
  213. /package/src/server/{auth-session-store.ts → auth-session-store.adapter.ts} +0 -0
  214. /package/src/server/claude-pty/{claude-session-registry.ts → claude-session-registry.adapter.ts} +0 -0
  215. /package/src/server/claude-pty/{jsonl-path.ts → jsonl-path.adapter.ts} +0 -0
  216. /package/src/server/claude-pty/{pid-registry.ts → pid-registry.adapter.ts} +0 -0
  217. /package/src/server/claude-pty/preflight/{binary-fingerprint.ts → binary-fingerprint.adapter.ts} +0 -0
  218. /package/src/server/claude-pty/{pty-process.ts → pty-process.adapter.ts} +0 -0
  219. /package/src/server/claude-pty/{resolve-binary.ts → resolve-binary.adapter.ts} +0 -0
  220. /package/src/server/claude-pty/sandbox/{detect.ts → detect.adapter.ts} +0 -0
  221. /package/src/server/claude-pty/sandbox/{profile-linux.ts → profile-linux.adapter.ts} +0 -0
  222. /package/src/server/claude-pty/sandbox/{profile-macos.ts → profile-macos.adapter.ts} +0 -0
  223. /package/src/server/claude-pty/{settings-writer.ts → settings-writer.adapter.ts} +0 -0
  224. /package/src/server/{claude-session-parser.ts → claude-session-parser.adapter.ts} +0 -0
  225. /package/src/server/{cli-supervisor.ts → cli-supervisor.adapter.ts} +0 -0
  226. /package/src/server/cloudflare-tunnel/{tunnel-manager.ts → tunnel-manager.adapter.ts} +0 -0
  227. /package/src/server/{discovery.ts → discovery.adapter.ts} +0 -0
  228. /package/src/server/kanna-mcp-tools/{bash.ts → bash.adapter.ts} +0 -0
  229. /package/src/server/kanna-mcp-tools/{edit.ts → edit.adapter.ts} +0 -0
  230. /package/src/server/kanna-mcp-tools/{glob.ts → glob.adapter.ts} +0 -0
  231. /package/src/server/kanna-mcp-tools/{grep.ts → grep.adapter.ts} +0 -0
  232. /package/src/server/kanna-mcp-tools/{read.ts → read.adapter.ts} +0 -0
  233. /package/src/server/kanna-mcp-tools/{write.ts → write.adapter.ts} +0 -0
  234. /package/src/server/{machine-name.ts → machine-name.adapter.ts} +0 -0
  235. /package/src/server/{orphan-persistence.ts → orphan-persistence.adapter.ts} +0 -0
  236. /package/src/{shared/projectFileRelocation.ts → server/projectFileRelocation.adapter.ts} +0 -0
  237. /package/src/server/push/{vapid.ts → vapid.adapter.ts} +0 -0
  238. /package/src/server/{standalone-export.ts → standalone-export.adapter.ts} +0 -0
  239. /package/src/server/storage/{fs-storage.ts → fs-storage.adapter.ts} +0 -0
  240. /package/src/server/{subagent-entry-cap.ts → subagent-entry-cap.adapter.ts} +0 -0
  241. /package/src/server/{terminal-pid-registry.ts → terminal-pid-registry.adapter.ts} +0 -0
  242. /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
- Browser (React + Zustand)
127
- ↕ WebSocket
128
- Bun Server (HTTP + WS)
129
- ├── Auth ───────────── optional password gate (HTTP/WS/API)
130
- ├── WSRouter ───────── subscription & command routing
131
- ├── AgentCoordinator multi-provider turn management
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-ioWoAQF9.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};
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};