@cuongtran001/kanna 1.81.2 → 1.82.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 (297) hide show
  1. package/README.md +4 -0
  2. package/dist/client/assets/{BoardsPage-Cfb_jt-Y.js → BoardsPage-B9xFFF0S.js} +1 -1
  3. package/dist/client/assets/{BoardsRoutePage-B_d4kRR0.js → BoardsRoutePage-BAMuLZPW.js} +1 -1
  4. package/dist/client/assets/ChatPage-Dj8jBzSx.js +98 -0
  5. package/dist/client/assets/CronJobRow-DSZm4G9P.js +1 -0
  6. package/dist/client/assets/CronJobsPage-DUCVxrMN.js +1 -0
  7. package/dist/client/assets/{CronRunMessage-BQPSznt_.js → CronRunMessage-wW383xKt.js} +1 -1
  8. package/dist/client/assets/{FilePreviewSheet-D1gAxdym.js → FilePreviewSheet-BcjkXGjR.js} +5 -5
  9. package/dist/client/assets/{FlowSurface-BDtLBBQz.js → FlowSurface-BSWWe7_j.js} +1 -1
  10. package/dist/client/assets/{GenUIBlock-CRSpLaG3.js → GenUIBlock-DdnHqZEw.js} +2 -2
  11. package/dist/client/assets/InboxPage-BAPp-7vt.js +1 -0
  12. package/dist/client/assets/KannaSocketProvider-C6_KRKgQ.js +1 -0
  13. package/dist/client/assets/{LocalProjectsPage-BfOllBwY.js → LocalProjectsPage-GErKpJgL.js} +1 -1
  14. package/dist/client/assets/SettingsPage-BLJCwKb6.js +13 -0
  15. package/dist/client/assets/{StackBoardsRoutePage-CdDxImFn.js → StackBoardsRoutePage-CiTs7g4L.js} +1 -1
  16. package/dist/client/assets/{ToolCallMessage-DLUOJcwS.js → ToolCallMessage-DC1ZClpO.js} +1 -1
  17. package/dist/client/assets/VChartSurface-DeK5CfL0.js +11 -0
  18. package/dist/client/assets/WebhooksPage-agdStQOe.js +1 -0
  19. package/dist/client/assets/WorkflowsPage-32pjkIut.js +1 -0
  20. package/dist/client/assets/{WorkflowsSection-Cgy47BAw.js → WorkflowsSection-CyvEZQTu.js} +1 -1
  21. package/dist/client/assets/{abnfDiagram-YUKMZFIV-DqlELEwO.js → abnfDiagram-WEYOIA3C-DChOQNmH.js} +1 -1
  22. package/dist/client/assets/{architectureDiagram-47P4ROYG-B3ZR6jPX.js → architectureDiagram-ZHVYKT53-BtxTDfl1.js} +1 -1
  23. package/dist/client/assets/arrow-left-DJ8gZJl_.js +1 -0
  24. package/dist/client/assets/{blockDiagram-E7TT5TSB-B7lKKOZc.js → blockDiagram-RJAE7QA3-0GL2zmin.js} +1 -1
  25. package/dist/client/assets/{c4Diagram-CRA5TL53-Dkwq6lSm.js → c4Diagram-XDPPPE54-B-MMGLQq.js} +1 -1
  26. package/dist/client/assets/channel-CpH929lc.js +1 -0
  27. package/dist/client/assets/{chart-renderer-CKKt1ZSq.js → chart-renderer-4wpawUIb.js} +1 -1
  28. package/dist/client/assets/{chatFocusPolicy-kid_uU9k.js → chatFocusPolicy-keHCdv0s.js} +1 -1
  29. package/dist/client/assets/{chatSounds-mM-IrGWZ.js → chatSounds-D_xM4YFd.js} +1 -1
  30. package/dist/client/assets/chevron-down-DfJGnqOk.js +1 -0
  31. package/dist/client/assets/chevron-left-CgRL3mY0.js +1 -0
  32. package/dist/client/assets/{chunk-AW2ZBBNX-D-I1K33n.js → chunk-2E7WHVMD-C_bpaSFY.js} +1 -1
  33. package/dist/client/assets/{chunk-HTAEGDNF-BS3V_zBh.js → chunk-4EMNKR2T-COkhL9RD.js} +1 -1
  34. package/dist/client/assets/{chunk-7TKQ45FW-DUX4UImL.js → chunk-55XCU76K-BpX1F7QM.js} +1 -1
  35. package/dist/client/assets/{chunk-3YJQHVM4-Cok6S7CM.js → chunk-7S6XSTFO-CddfL1MG.js} +1 -1
  36. package/dist/client/assets/{chunk-E2ZNV5FY-2MK4llTd.js → chunk-AQDTSKZB-kaWiNStl.js} +1 -1
  37. package/dist/client/assets/{chunk-VPRB5NB3-C8Pw0EsB.js → chunk-DSNLSHJZ-ouwfoCtA.js} +1 -1
  38. package/dist/client/assets/{chunk-SVEVUXB4-pjOcktdf.js → chunk-EJLWFMJV-FBUhvkoF.js} +2 -2
  39. package/dist/client/assets/chunk-HAGFOTED-BQ9cYi7R.js +62 -0
  40. package/dist/client/assets/chunk-HNE4Q36P-LDnL_jpo.js +1 -0
  41. package/dist/client/assets/{chunk-EU5HNXII-BKqwprfc.js → chunk-NQOKRVIF-BArtr3wB.js} +1 -1
  42. package/dist/client/assets/{chunk-OB3PAWPO-DERdSR9u.js → chunk-OB3PAWPO-bMwGZcTr.js} +1 -1
  43. package/dist/client/assets/{chunk-Z6ETV63D-WA0exS0E.js → chunk-OYAV6JZA-DewdxI5x.js} +1 -1
  44. package/dist/client/assets/{chunk-4EA7E6EY-Bt6QpYgZ.js → chunk-UHW7PFBP-D1DW9Q0V.js} +1 -1
  45. package/dist/client/assets/{chunk-KQW6MTUR-D07c2A4L.js → chunk-VQ5W62QI-CqaqJLMX.js} +1 -1
  46. package/dist/client/assets/chunk-WQQL4CDK-BOMTT7im.js +10 -0
  47. package/dist/client/assets/{chunk-HJ2JQQFS-BO5jR7Xq.js → chunk-YZO67HFG-BbSMSuPs.js} +1 -1
  48. package/dist/client/assets/{chunk-DBDB3WZW-DVPUKLc6.js → chunk-ZAUX2LTX-Dglkxe4X.js} +1 -1
  49. package/dist/client/assets/{chunk-FVRAUYC3-hOKiJ4tp.js → chunk-ZCHMQSOR-B_ATM6zM.js} +1 -1
  50. package/dist/client/assets/{classDiagram-v2-K4WV4PDN-sKSxYURQ.js → classDiagram-v2-4MYWR3UA-BRbRL3D_.js} +1 -1
  51. package/dist/client/assets/{clipboard.adapter--u2D0EIm.js → clipboard.adapter-kyoisnPc.js} +1 -1
  52. package/dist/client/assets/{columnStyle-CdOwU1TW.js → columnStyle-DILPgsJm.js} +1 -1
  53. package/dist/client/assets/{contextWindow-DXudOo4j.js → contextWindow-xsnxghHb.js} +1 -1
  54. package/dist/client/assets/copyFeedbackStore-CO5FOMzX.js +1 -0
  55. package/dist/client/assets/{createScopedStore-DPOSjCxz.js → createScopedStore-Ce0KxaP9.js} +1 -1
  56. package/dist/client/assets/cronJobsStore-DYhW-AbN.js +1 -0
  57. package/dist/client/assets/{cynefinDiagram-3GCD6N5R-Dbu9EhE_.js → cynefinDiagram-WF24UDRP-D3fzsYkC.js} +1 -1
  58. package/dist/client/assets/{dagre-W4DXFKR2-FE1fZ0Ng.js → dagre-NK4GIZVX-DC-YWEzx.js} +1 -1
  59. package/dist/client/assets/{diagram-OVF4WLC6-BSWujIlb.js → diagram-CBK3MWTC-CJ5kUcAN.js} +1 -1
  60. package/dist/client/assets/{diagram-UMYRVEAY-DwbIMhe4.js → diagram-I5XIIV2D-PCeLB4SM.js} +1 -1
  61. package/dist/client/assets/{diagram-PFPMY2P6-CSfqm_pZ.js → diagram-ODIL2UCW-T_AH6X_v.js} +1 -1
  62. package/dist/client/assets/{diagram-ZIFT7M5P-BNNtTe5t.js → diagram-PFBEJUXE-BQfuaLMC.js} +1 -1
  63. package/dist/client/assets/{diagram-YEKJPTXX-Ce74Jlew.js → diagram-RJA3I4VV-BNGVOwMj.js} +1 -1
  64. package/dist/client/assets/{diagram-2UJZ2QOL-qnIJwEfX.js → diagram-TYUNFSNR-D-NQOX_C.js} +1 -1
  65. package/dist/client/assets/dist-Ba01u0Yg.js +1 -0
  66. package/dist/client/assets/{dist-Clqd7pyP.js → dist-C8wnV1mz.js} +1 -1
  67. package/dist/client/assets/{dist-BAj6nHrf.js → dist-HdfQrDcg.js} +1 -1
  68. package/dist/client/assets/{ebnfDiagram-VR2GEFS7-DLotSgDv.js → ebnfDiagram-V4P3TTPT-B8POjhwK.js} +1 -1
  69. package/dist/client/assets/elk-QONTBCTQ-m430bm1C.js +27 -0
  70. package/dist/client/assets/{ellipsis-jWgNb3MN.js → ellipsis-DLcAuU-n.js} +1 -1
  71. package/dist/client/assets/{erDiagram-O2IAPWRE-C17ESJNu.js → erDiagram-KYQIGQAA-DJi3cdwU.js} +1 -1
  72. package/dist/client/assets/external-link-DikBKMuA.js +1 -0
  73. package/dist/client/assets/{flow-kinds-u75rspfk.js → flow-kinds-BABqmm0s.js} +1 -1
  74. package/dist/client/assets/flowDiagram-IUGLLWBU-CwauCT7Y.js +1 -0
  75. package/dist/client/assets/{folder-D--ep2I3.js → folder-CYphsxUZ.js} +1 -1
  76. package/dist/client/assets/{ganttDiagram-R7TSEDQI-oxsZCme5.js → ganttDiagram-R7GPNTJY-C7bMAwEy.js} +1 -1
  77. package/dist/client/assets/genui-CzE_a-p-.js +68 -0
  78. package/dist/client/assets/{gitGraphDiagram-XJZIOB7I-CA_vzYO1.js → gitGraphDiagram-PDYL7XHY-C4FiavER.js} +1 -1
  79. package/dist/client/assets/{globe-DeA-n7T2.js → globe-I5bXOUvy.js} +1 -1
  80. package/dist/client/assets/{host-D8iGhzS1.js → host-DfVRZUwr.js} +1 -1
  81. package/dist/client/assets/inbox-Dt3Etn6f.js +1 -0
  82. package/dist/client/assets/inboxPresentation-Drn6X1s5.js +1 -0
  83. package/dist/client/assets/inboxStore-BT4dBe6b.js +1 -0
  84. package/dist/client/assets/index-B__CpRhd.js +26 -0
  85. package/dist/client/assets/index-Cs5MuUbJ.css +1 -0
  86. package/dist/client/assets/{info-DfVTFKU5.js → info-vCm1cKiT.js} +1 -1
  87. package/dist/client/assets/{infoDiagram-5W2HQ5XZ-DfSnayOY.js → infoDiagram-MVDRKAX5-C4-bqDJA.js} +1 -1
  88. package/dist/client/assets/{input-DdxLn_FI.js → input-DeYDCMFk.js} +1 -1
  89. package/dist/client/assets/{ishikawaDiagram-K3B6WC7H-B06v6mMO.js → ishikawaDiagram-HPEHV2GE-C-dSB7ML.js} +1 -1
  90. package/dist/client/assets/{journeyDiagram-COXZFDF6-B1THbOJJ.js → journeyDiagram-BOSHW7O7-D2gfz3l9.js} +1 -1
  91. package/dist/client/assets/{json-BSljrsMB.js → json-BUwJp2HW.js} +1 -1
  92. package/dist/client/assets/{kanban-definition-P3RFRI5V-rQDyHi5N.js → kanban-definition-FNSA4HC5-D8wI8zMt.js} +1 -1
  93. package/dist/client/assets/katex-7vI-Mmbq.js +257 -0
  94. package/dist/client/assets/{lexicalToReact-CT6WOLAg.js → lexicalToReact-CmUloFBV.js} +3 -3
  95. package/dist/client/assets/{line-BHMm317E.js → line-ClND-con.js} +1 -1
  96. package/dist/client/assets/{log-DSK7UH-F.js → log-DZs-caq4.js} +1 -1
  97. package/dist/client/assets/{mermaid.core-BnoEOeO5.js → mermaid.core-CS56ZyoX.js} +4 -4
  98. package/dist/client/assets/{mindmap-definition-LZFPQGKD-8f452qRN.js → mindmap-definition-6OY57UG3-BCpTg_vP.js} +11 -9
  99. package/dist/client/assets/{monitor-C11SgSAA.js → monitor-BnJUctGL.js} +1 -1
  100. package/dist/client/assets/{pegDiagram-BGZESJAR-AH1pGK39.js → pegDiagram-ECIUJNBX-D9yfHoPb.js} +1 -1
  101. package/dist/client/assets/{pencil-DbpZ4rYo.js → pencil-CmfzHqae.js} +1 -1
  102. package/dist/client/assets/{pendingActionsStore-BNNVaCDu.js → pendingActionsStore-DU8w95f8.js} +1 -1
  103. package/dist/client/assets/{pieDiagram-CAPJLFHJ-DSYWeu-m.js → pieDiagram-GNMPY74T-Os3LD3nT.js} +1 -1
  104. package/dist/client/assets/{play-VCUb4Qm_.js → play-TbCBLVhI.js} +1 -1
  105. package/dist/client/assets/{plus-D4pno440.js → plus-BvU1zO_X.js} +1 -1
  106. package/dist/client/assets/{popover-Pz8Sg6cQ.js → popover-PJKkayFD.js} +1 -1
  107. package/dist/client/assets/{pushClient-LMySL6ym.js → pushClient-CayuNrCW.js} +1 -1
  108. package/dist/client/assets/{quadrantDiagram-GDMTTRAM-D7TR6wt6.js → quadrantDiagram-D57K4MC3-m3-EDrn6.js} +1 -1
  109. package/dist/client/assets/{railroadDiagram-SM67HX2B-B4lLktF8.js → railroadDiagram-Y72NRBL7-Ct8UBrxl.js} +1 -1
  110. package/dist/client/assets/{react-PuijDaWl.js → react-CUxhxv_r.js} +1 -1
  111. package/dist/client/assets/{react-dom-CvX0TCLz.js → react-dom-Cqh0D36c.js} +1 -1
  112. package/dist/client/assets/{react-DiVRNtpo.js → react-eq8zrF0J.js} +1 -1
  113. package/dist/client/assets/{requirementDiagram-X7JNWC4A-4Uoq5QN_.js → requirementDiagram-EQYSW5RA-Ca63mR5O.js} +1 -1
  114. package/dist/client/assets/runDetached-B2VheLqS.js +1 -0
  115. package/dist/client/assets/{sankeyDiagram-UM26HJRW-CpcV_RWK.js → sankeyDiagram-SY24JHO5-BOcYPxP4.js} +1 -1
  116. package/dist/client/assets/{search-CZw8x3nu.js → search-BFgJOKB6.js} +1 -1
  117. package/dist/client/assets/searchable-select-DSpM36-Z.js +1 -0
  118. package/dist/client/assets/{segmented-control-yZ9HM0pF.js → segmented-control-85rMaYpU.js} +1 -1
  119. package/dist/client/assets/{select-ZT9bJGQ_.js → select-C4GB5kRQ.js} +1 -1
  120. package/dist/client/assets/{sequenceDiagram-ZO4K6R2Y-DJ-TEMpy.js → sequenceDiagram-BLEHNHQU-BJtiS4r4.js} +3 -3
  121. package/dist/client/assets/{settings-header-button-DTBZupci.js → settings-header-button-qwA6oDTR.js} +1 -1
  122. package/dist/client/assets/shellChrome-bmmKlcOk.js +1 -0
  123. package/dist/client/assets/{shim-DTZXyK8i.js → shim-CKOM012b.js} +1 -1
  124. package/dist/client/assets/{sidebarPendingActions-DAuJiDUe.js → sidebarPendingActions-DYyAdqP0.js} +1 -1
  125. package/dist/client/assets/{square-pen-sKxu3Az6.js → square-pen-BnBiZhcc.js} +1 -1
  126. package/dist/client/assets/{state-mark-DBBd7axV.js → state-mark-BwbPLiok.js} +1 -1
  127. package/dist/client/assets/{stateDiagram-v2-TBUQTH76-BI70-G69.js → stateDiagram-v2-A6IESKWZ-DFA37cju.js} +1 -1
  128. package/dist/client/assets/swimlanes-B3ENRKFQ-BKT3kBgx.js +1 -0
  129. package/dist/client/assets/swimlanesDiagram-AYQRV4AK-NscQFyWB.js +8 -0
  130. package/dist/client/assets/{terminal-DIfHu7NO.js → terminal-rpU4cJPq.js} +1 -1
  131. package/dist/client/assets/{timeline-definition-YOQAKGHF-DDs1Z2xv.js → timeline-definition-JXYKGLGB-RbZKhApy.js} +1 -1
  132. package/dist/client/assets/{timer.adapter-scI3Kb-r.js → timer.adapter-CwqmiNs2.js} +1 -1
  133. package/dist/client/assets/tools-DwFBZ__5.js +1 -0
  134. package/dist/client/assets/{triangle-alert-B6cjzFCe.js → triangle-alert-Dn-QkiH8.js} +1 -1
  135. package/dist/client/assets/types-C-hQn4rL.js +1 -0
  136. package/dist/client/assets/useAppGlobalState-Dk9XBEkq.js +1 -0
  137. package/dist/client/assets/useKannaState-DMYzJ90q.js +5 -0
  138. package/dist/client/assets/useProviderCatalog-BYvv2e_r.js +1 -0
  139. package/dist/client/assets/{useQuery-DSVLUkAU.js → useQuery-DehtkS98.js} +1 -1
  140. package/dist/client/assets/{useTheme-BrorkLCj.js → useTheme-CODfqobd.js} +1 -1
  141. package/dist/client/assets/{usecaseDiagram-VIAY4XPW-SmOkBrbs.js → usecaseDiagram-WPOLBNNX-BJ8hJHA4.js} +1 -1
  142. package/dist/client/assets/{vennDiagram-BLWOH2XV-D00EywZm.js → vennDiagram-Q3Y3IDCW-CGVVOsoY.js} +1 -1
  143. package/dist/client/assets/{wardleyDiagram-YMQ3BMBF-DT8gqDNH.js → wardleyDiagram-IVAIDKWA-D6wfiSSc.js} +1 -1
  144. package/dist/client/assets/webhookPresentation-Dk3-aoQa.js +3 -0
  145. package/dist/client/assets/webhooksStore-DJlp3XXC.js +1 -0
  146. package/dist/client/assets/{xychartDiagram-TAQBALBS-BzxKjvXg.js → xychartDiagram-4URNHDU4-DvoGxEw-.js} +1 -1
  147. package/dist/client/index.html +53 -47
  148. package/dist/client/sw.js +3 -1
  149. package/package.json +10 -10
  150. package/src/server/agent-coordinator-types.ts +1 -0
  151. package/src/server/agent-coordinator.ts +4 -0
  152. package/src/server/board-sync.test.ts +28 -0
  153. package/src/server/board-sync.ts +1 -1
  154. package/src/server/claude-send-command.test.ts +29 -2
  155. package/src/server/claude-send-command.ts +5 -0
  156. package/src/server/claude-session-spawner.ts +3 -0
  157. package/src/server/claude-session-start.ts +3 -0
  158. package/src/server/claude-steer-log.ts +2 -0
  159. package/src/server/claude-turn-starter-types.ts +2 -0
  160. package/src/server/claude-turn-starter.test.ts +23 -0
  161. package/src/server/claude-turn-starter.ts +1 -0
  162. package/src/server/command-origin-stamp.ts +8 -0
  163. package/src/server/event-store.ts +3 -3
  164. package/src/server/http-dispatcher.ts +1 -1
  165. package/src/server/inbound/deliver-inbound.test.ts +102 -0
  166. package/src/server/inbound/deliver-inbound.ts +166 -0
  167. package/src/server/inbound/inbox-reply.test.ts +77 -0
  168. package/src/server/inbound/inbox-reply.ts +94 -0
  169. package/src/server/inbox/inbox-boot.test.ts +46 -0
  170. package/src/server/inbox/inbox-boot.ts +42 -0
  171. package/src/server/inbox/inbox-log.adapter.test.ts +42 -0
  172. package/src/server/inbox/inbox-log.adapter.ts +42 -0
  173. package/src/server/inbox/inbox-projection.ts +198 -0
  174. package/src/server/inbox/inbox-registry.test.ts +222 -0
  175. package/src/server/inbox/inbox-registry.ts +336 -0
  176. package/src/server/kanna-mcp-boards.ts +2 -7
  177. package/src/server/kanna-mcp-inbox.test.ts +70 -0
  178. package/src/server/kanna-mcp-inbox.ts +45 -0
  179. package/src/server/kanna-mcp-tool.ts +8 -0
  180. package/src/server/kanna-mcp.ts +4 -0
  181. package/src/server/observability.ts +6 -0
  182. package/src/server/push/push-manager.test.ts +59 -0
  183. package/src/server/push/push-manager.ts +23 -5
  184. package/src/server/remote-mcp/remote-mcp-audit-log.test.ts +79 -0
  185. package/src/server/remote-mcp/remote-mcp-audit-log.ts +39 -0
  186. package/src/server/remote-mcp/remote-mcp-audit.ts +67 -0
  187. package/src/server/remote-mcp/remote-mcp-bearer.ts +1 -1
  188. package/src/server/remote-mcp/remote-mcp-boot.ts +34 -6
  189. package/src/server/remote-mcp/remote-mcp-call-scope.ts +12 -0
  190. package/src/server/remote-mcp/remote-mcp-dedupe.ts +89 -0
  191. package/src/server/remote-mcp/remote-mcp-follow-view.test.ts +95 -0
  192. package/src/server/remote-mcp/remote-mcp-follow-view.ts +85 -0
  193. package/src/server/remote-mcp/remote-mcp-follow.ts +103 -0
  194. package/src/server/remote-mcp/remote-mcp-http-routes.test.ts +61 -2
  195. package/src/server/remote-mcp/remote-mcp-http-routes.ts +5 -1
  196. package/src/server/remote-mcp/remote-mcp-instructions.ts +19 -0
  197. package/src/server/remote-mcp/remote-mcp-send-guard.test.ts +157 -0
  198. package/src/server/remote-mcp/remote-mcp-send-guard.ts +47 -0
  199. package/src/server/remote-mcp/remote-mcp-server.ts +21 -12
  200. package/src/server/remote-mcp/remote-mcp-tool-registrar.ts +133 -0
  201. package/src/server/remote-mcp/remote-mcp-tools-boards.ts +8 -8
  202. package/src/server/remote-mcp/remote-mcp-tools-chat.ts +90 -40
  203. package/src/server/remote-mcp/remote-mcp-tools-cron.ts +7 -6
  204. package/src/server/remote-mcp/remote-mcp-tools-files.ts +4 -4
  205. package/src/server/remote-mcp/remote-mcp-tools-generic.ts +20 -8
  206. package/src/server/remote-mcp/remote-mcp-tools-git.ts +7 -7
  207. package/src/server/remote-mcp/remote-mcp-tools-observability.ts +6 -6
  208. package/src/server/remote-mcp/remote-mcp-tools-projects.ts +9 -8
  209. package/src/server/remote-mcp/remote-mcp-tools-settings.ts +11 -7
  210. package/src/server/remote-mcp/remote-mcp-tools-system.ts +7 -4
  211. package/src/server/remote-mcp/remote-mcp-tools.test.ts +122 -1
  212. package/src/server/remote-mcp/remote-mcp-views.ts +13 -3
  213. package/src/server/remote-mcp/send-and-wait.test.ts +133 -132
  214. package/src/server/remote-mcp/send-and-wait.ts +136 -37
  215. package/src/server/remote-mcp/test-helpers/chat-snapshots.ts +107 -0
  216. package/src/server/remote-mcp/topics.test.ts +1 -0
  217. package/src/server/server.ts +15 -3
  218. package/src/server/service-bus/event-store-tap.test.ts +91 -0
  219. package/src/server/service-bus/event-store-tap.ts +71 -0
  220. package/src/server/service-bus/in-memory-service-bus.test.ts +87 -0
  221. package/src/server/service-bus/in-memory-service-bus.ts +50 -0
  222. package/src/server/service-bus/service-bus.ts +12 -0
  223. package/src/server/service-bus/store-event-subjects.test.ts +33 -0
  224. package/src/server/service-bus/store-event-subjects.ts +157 -0
  225. package/src/server/session-share/snapshot-builder.test.ts +2 -0
  226. package/src/server/test-helpers/inbox-harness.ts +33 -0
  227. package/src/server/test-helpers/webhook-harness.ts +8 -2
  228. package/src/server/webhooks/webhook-boot.ts +5 -1
  229. package/src/server/webhooks/webhook-delivery.test.ts +14 -12
  230. package/src/server/webhooks/webhook-delivery.ts +40 -54
  231. package/src/server/webhooks/webhook-service.ts +5 -1
  232. package/src/server/ws-router-boards.test.ts +34 -0
  233. package/src/server/ws-router-boards.ts +12 -8
  234. package/src/server/ws-router-broadcast.ts +5 -1
  235. package/src/server/ws-router-envelope.ts +12 -0
  236. package/src/server/ws-router-inbox.ts +90 -0
  237. package/src/server/ws-router-utils.ts +2 -0
  238. package/src/server/ws-router.test.ts +78 -0
  239. package/src/server/ws-router.ts +18 -3
  240. package/src/shared/boards/actor.ts +13 -0
  241. package/src/shared/boards/decode.ts +7 -0
  242. package/src/shared/boards/types.ts +1 -0
  243. package/src/shared/command-origin.ts +29 -0
  244. package/src/shared/inbound/handler.ts +35 -0
  245. package/src/shared/inbound/reply-prompt.test.ts +47 -0
  246. package/src/shared/inbound/reply-prompt.ts +50 -0
  247. package/src/shared/inbound/template.test.ts +17 -0
  248. package/src/shared/inbound/template.ts +79 -0
  249. package/src/shared/inbox/describe.test.ts +41 -0
  250. package/src/shared/inbox/describe.ts +69 -0
  251. package/src/shared/inbox/events.ts +202 -0
  252. package/src/shared/inbox/policy.test.ts +68 -0
  253. package/src/shared/inbox/policy.ts +28 -0
  254. package/src/shared/inbox/types.ts +96 -0
  255. package/src/shared/protocol.ts +12 -0
  256. package/src/shared/remote-mcp/command-catalog.ts +6 -0
  257. package/src/shared/remote-mcp/topics.ts +1 -0
  258. package/src/shared/service-bus/envelope.test.ts +51 -0
  259. package/src/shared/service-bus/envelope.ts +56 -0
  260. package/src/shared/tools.ts +1 -0
  261. package/src/shared/transcript-types.ts +17 -1
  262. package/src/shared/types.ts +4 -1
  263. package/src/shared/webhooks/template.ts +15 -47
  264. package/src/shared/webhooks/types.ts +15 -3
  265. package/src/shared/webhooks/validate.ts +12 -6
  266. package/dist/client/assets/ChatPage-C-Spi82_.js +0 -98
  267. package/dist/client/assets/CronJobRow-DwPY6RmE.js +0 -1
  268. package/dist/client/assets/CronJobsPage-1RqHloIN.js +0 -1
  269. package/dist/client/assets/KannaSocketProvider-DOF_2gly.js +0 -1
  270. package/dist/client/assets/SettingsPage-DWglAJB-.js +0 -13
  271. package/dist/client/assets/VChartSurface-BY9LJeJ1.js +0 -11
  272. package/dist/client/assets/WebhooksPage-FM9I4XtW.js +0 -1
  273. package/dist/client/assets/WorkflowsPage-CkpwT93u.js +0 -1
  274. package/dist/client/assets/channel-DAApoL90.js +0 -1
  275. package/dist/client/assets/chevron-down-Boq845C_.js +0 -1
  276. package/dist/client/assets/chevron-left-Dx0NwF7E.js +0 -1
  277. package/dist/client/assets/chunk-2BW5OAIV-QbnmmR6v.js +0 -10
  278. package/dist/client/assets/chunk-NTY3LDVX-DwtscyP6.js +0 -1
  279. package/dist/client/assets/chunk-XC4XBNZT-BfEA2zYv.js +0 -62
  280. package/dist/client/assets/copyFeedbackStore-C2aMwbVc.js +0 -1
  281. package/dist/client/assets/cronJobsStore-cbjQ2-7z.js +0 -1
  282. package/dist/client/assets/dist-BSDp4hXz.js +0 -1
  283. package/dist/client/assets/elk-IJKZMXRS-Bn14FyZV.js +0 -27
  284. package/dist/client/assets/flowDiagram-OXPTDLAJ-BPucv135.js +0 -1
  285. package/dist/client/assets/genui-DtAhxIJO.js +0 -122
  286. package/dist/client/assets/index-C4_yu_Eu.css +0 -1
  287. package/dist/client/assets/index-LcrFwDds.js +0 -26
  288. package/dist/client/assets/katex-ZlcWpGUi.js +0 -257
  289. package/dist/client/assets/runDetached-Bp5gRqF4.js +0 -1
  290. package/dist/client/assets/swimlanes-N4OXWK64-BlDDp9tW.js +0 -1
  291. package/dist/client/assets/swimlanesDiagram-K3J5GTZL-DeTCwNIB.js +0 -8
  292. package/dist/client/assets/tools-BEDGBlaN.js +0 -1
  293. package/dist/client/assets/useAppGlobalState-C0jWovkG.js +0 -1
  294. package/dist/client/assets/useKannaState-D2SnZHN0.js +0 -5
  295. package/dist/client/assets/useProviderCatalog-DUqqjjGJ.js +0 -1
  296. package/dist/client/assets/webhookPresentation-X6Pav0Os.js +0 -3
  297. package/dist/client/assets/webhooksStore-DLUPYjnx.js +0 -1
package/README.md CHANGED
@@ -153,6 +153,10 @@ Pages live in `wiki/src/content/docs/`. Change a page in the same PR as the beha
153
153
 
154
154
  The [GitHub Wiki](https://github.com/cuongtranba/kanna/wiki) is a generated mirror of the same pages, rewritten from `wiki/` on every push to `main` that touches it. Edit `wiki/`, never the GitHub Wiki: changes made there are overwritten on the next sync. To preview the mirror, run `bun run export:github-wiki <dir>` in `wiki/`.
155
155
 
156
+ ## Partners
157
+
158
+ [Undercroft](https://undercroft.lowbit.link) is an open-source, Vietnamese-first data platform (any REST source into an immutable raw lake, Postgres, dbt models and BI) whose MCP endpoint Kanna connects to as an MCP client over OAuth.
159
+
156
160
  ## Star History
157
161
 
158
162
  <a href="https://www.star-history.com/?repos=cuongtranba%2Fkanna&type=date&legend=top-left">
@@ -1 +1 @@
1
- import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{t}from"./react-DiVRNtpo.js";import{t as n}from"./jsx-runtime-BdxMnOeJ.js";import{c as r,i,m as a,t as o}from"./log-DSK7UH-F.js";import{a as s,c,i as l,n as u,r as d,s as f,t as p}from"./pendingActionsStore-BNNVaCDu.js";import{t as m}from"./ellipsis-jWgNb3MN.js";import{t as h}from"./plus-D4pno440.js";import{t as g}from"./input-DdxLn_FI.js";import{n as _,r as v,t as y}from"./popover-Pz8Sg6cQ.js";import{o as b,r as x,s as S,t as C}from"./columnStyle-CdOwU1TW.js";var w=e(t(),1),T=[],E=r()(e=>({templates:T,templatesStatus:`loading`,openMenuId:null,picking:!1,renamingId:null,error:null,setTemplates:t=>e({templates:Array.isArray(t)?t:[],templatesStatus:`ready`}),beginTemplatesLoad:()=>e({templatesStatus:`loading`}),failTemplatesLoad:()=>e({templatesStatus:`failed`}),openMenu:t=>e({openMenuId:t}),closeMenu:()=>e({openMenuId:null}),openPicker:()=>e({picking:!0,error:null}),closePicker:()=>e({picking:!1}),startRename:t=>e({renamingId:t,picking:!1,openMenuId:null}),stopRename:()=>e({renamingId:null}),setError:t=>e({error:t})}));function D(e){return e.templates}var O=e(n(),1),k=[`board.update`,`board.duplicate`,`board.saveAsTemplate`,`board.archive`];function A(e){return l(t=>k.some(n=>t.inFlight[p(n,e)]===!0))}function j({ownerKind:e,ownerId:t,ownerName:n,socket:r,onOpenBoard:c}){let l=x(e,t),f=S(b(l)),m=E(D),g=E(e=>e.picking),_=E(e=>e.renamingId),v=E(e=>e.error),y=E(e=>e.templatesStatus),C=p(`board.create`,l),T=d(C),{openPicker:k,closePicker:A,startRename:j,stopRename:N,setError:P,setTemplates:I}=E.getState();(0,w.useEffect)(()=>r.subscribe({type:`boards`,ownerKind:e,ownerId:t},e=>{S.getState().setBoards(x(e.ownerKind,e.ownerId),e.boards)}),[e,t,r]),(0,w.useEffect)(()=>{let e=!1,t=E.getState();return t.templatesStatus!==`ready`&&t.beginTemplatesLoad(),r.command({type:`board.templates.list`}).then(t=>{e||I(t)},a(t=>{o.error(i,`board.templates.list failed`,t),e||E.getState().failTemplatesLoad()})),()=>{e=!0}},[r,I]);let L=(0,w.useCallback)(async e=>{try{return await r.command(e),P(null),!0}catch(e){return P(e instanceof Error?e.message:`That did not work.`),!1}},[r,P]),R=(0,w.useCallback)(n=>{u(C,async()=>{await L({type:`board.create`,ownerKind:e,ownerId:t,title:n?n.name:`Untitled board`,templateId:n?.id??null})&&A()})},[A,C,e,t,L]),z=(0,w.useCallback)((e,t)=>{N();let n=t.trim();n!==``&&u(p(`board.update`,e),()=>L({type:`board.update`,boardId:e,title:n}))},[L,N]),B=g||f.length===0;return(0,O.jsxs)(`div`,{className:`flex min-h-0 min-w-0 flex-1 flex-col bg-background`,children:[(0,O.jsxs)(`header`,{className:`flex items-end justify-between gap-4 border-b border-border px-6 py-4`,children:[(0,O.jsxs)(`div`,{className:`min-w-0`,children:[(0,O.jsx)(`h1`,{className:`text-lg font-medium leading-tight tracking-[-0.01em] text-foreground`,children:`Boards`}),(0,O.jsxs)(`p`,{className:`truncate text-13 text-muted-foreground`,children:[n,f.length>0?(0,O.jsxs)(`span`,{className:`tabular-nums`,children:[` · `,f.length,` boards`]}):null]})]}),f.length>0?(0,O.jsxs)(s,{size:`sm`,onClick:k,pending:T,children:[(0,O.jsx)(h,{className:`size-3.5`}),`New board`]}):null]}),v?(0,O.jsx)(`p`,{className:`border-b border-border px-6 py-2 text-13 text-destructive-text`,children:v}):null,(0,O.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto`,children:[B?(0,O.jsx)(F,{templates:m,templatesStatus:y,creating:T,firstRun:f.length===0,onPick:R,onCancel:A}):null,f.length>0?(0,O.jsx)(`ul`,{className:`px-4 py-1`,children:f.map(e=>(0,O.jsx)(M,{board:e,renaming:_===e.id,onOpen:c,onStartRename:j,onRename:z,onCancelRename:N,onCommand:L},e.id))}):null]})]})}function M({board:e,renaming:t,onOpen:n,onStartRename:r,onRename:i,onCancelRename:a,onCommand:o}){let s=A(e.id),c=(0,w.useCallback)(()=>n(e.id),[e.id,n]),l=(0,w.useCallback)(t=>{t.key===`Enter`&&i(e.id,t.currentTarget.value),t.key===`Escape`&&a()},[e.id,a,i]),u=(0,w.useCallback)(t=>i(e.id,t.currentTarget.value),[e.id,i]);return(0,O.jsxs)(`li`,{"aria-busy":s||void 0,className:`group grid grid-cols-[1fr_auto_auto] items-center gap-5 border-b border-border px-3 py-3 last:border-b-0 hover:bg-secondary`,children:[(0,O.jsx)(`div`,{className:`min-w-0`,children:t?(0,O.jsx)(g,{autoFocus:!0,defaultValue:e.title,onKeyDown:l,onBlur:u,className:`h-7 max-w-sm`,"aria-label":`Board name`}):(0,O.jsxs)(`button`,{type:`button`,onClick:c,className:`block w-full text-left`,children:[(0,O.jsx)(`span`,{className:`block truncate text-15 font-semibold tracking-[-0.005em] text-foreground`,children:e.title}),e.description?(0,O.jsx)(`span`,{className:`mt-0.5 block truncate text-13 text-muted-foreground`,children:e.description}):null]})}),(0,O.jsxs)(`div`,{className:`flex items-center gap-4 text-xs text-muted-foreground`,children:[(0,O.jsxs)(`span`,{children:[(0,O.jsx)(`b`,{className:`font-medium tabular-nums text-foreground`,children:e.columnCount}),` columns`]}),(0,O.jsxs)(`span`,{children:[(0,O.jsx)(`b`,{className:`font-medium tabular-nums text-foreground`,children:e.cardCount}),` cards`]})]}),(0,O.jsx)(N,{board:e,pending:s,onStartRename:r,onCommand:o})]})}function N({board:e,pending:t,onStartRename:n,onCommand:r}){let i=E(t=>t.openMenuId===e.id),{openMenu:a,closeMenu:o}=E.getState(),s=(0,w.useCallback)(t=>{t?a(e.id):o()},[e.id,o,a]),l=(0,w.useCallback)(()=>{o(),n(e.id)},[e.id,o,n]),d=(0,w.useCallback)(()=>{o(),u(p(`board.duplicate`,e.id),()=>r({type:`board.duplicate`,boardId:e.id,title:`${e.title} copy`}))},[e.id,e.title,o,r]),h=(0,w.useCallback)(()=>{o(),u(p(`board.saveAsTemplate`,e.id),()=>r({type:`board.saveAsTemplate`,boardId:e.id,name:e.title}))},[e.id,e.title,o,r]),g=(0,w.useCallback)(()=>{o(),u(p(`board.archive`,e.id),()=>r({type:`board.archive`,boardId:e.id}))},[e.id,o,r]);return(0,O.jsxs)(y,{open:i,onOpenChange:s,children:[(0,O.jsx)(v,{asChild:!0,children:(0,O.jsx)(`button`,{type:`button`,"aria-label":`Actions for ${e.title}`,disabled:t,"aria-busy":t||void 0,className:c(`rounded-md px-1.5 py-1 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100 data-[state=open]:opacity-100`,t&&`opacity-100`),children:t?(0,O.jsx)(f,{className:`size-4`}):(0,O.jsx)(m,{className:`size-4`})})}),(0,O.jsxs)(_,{align:`end`,className:`w-56 p-1`,children:[(0,O.jsx)(P,{onClick:l,children:`Rename`}),(0,O.jsx)(P,{onClick:d,children:`Duplicate structure`}),(0,O.jsx)(P,{onClick:h,children:`Save as template`}),(0,O.jsx)(`div`,{className:`my-1 h-px bg-border`}),(0,O.jsx)(P,{onClick:g,tone:`destructive`,children:`Archive`})]})]})}function P({onClick:e,children:t,tone:n}){return(0,O.jsx)(`button`,{type:`button`,onClick:e,className:c(`flex w-full items-center rounded-sm px-2 py-1.5 text-left text-xs font-medium hover:bg-secondary`,n===`destructive`&&`text-destructive-text`),children:t})}function F({templates:e,templatesStatus:t,creating:n,firstRun:r,onPick:i,onCancel:a}){let o=(0,w.useCallback)(()=>i(null),[i]);return(0,O.jsxs)(`div`,{className:`px-6 py-8`,children:[r?(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(`h2`,{className:`text-15 font-semibold text-foreground`,children:`No boards yet.`}),(0,O.jsx)(`p`,{className:`mt-1 max-w-[58ch] text-sm text-muted-foreground`,children:`A board turns issues into work your agents can pick up. Start from a shape, or import an existing tracker.`})]}):(0,O.jsx)(`h2`,{className:`text-15 font-semibold text-foreground`,children:`Start from a shape`}),(0,O.jsxs)(`div`,{className:`mt-4 max-w-xl rounded-lg border border-border`,"aria-busy":n||void 0,children:[e.map(e=>(0,O.jsx)(I,{template:e,disabled:n,onPick:i},e.id)),t===`loading`?(0,O.jsxs)(`p`,{role:`status`,className:`flex items-center gap-2 px-3.5 py-2.5 text-xs text-muted-foreground`,children:[(0,O.jsx)(f,{}),`Loading templates…`]}):null,t===`failed`?(0,O.jsx)(`p`,{className:`px-3.5 py-2.5 text-xs text-muted-foreground`,children:`Couldn't load templates.`}):null,(0,O.jsx)(`button`,{type:`button`,onClick:o,disabled:n,className:`flex w-full items-center border-t border-border px-3.5 py-2.5 text-left hover:bg-secondary disabled:pointer-events-none disabled:opacity-60`,children:(0,O.jsxs)(`span`,{children:[(0,O.jsx)(`span`,{className:`block text-sm font-medium text-foreground`,children:`Empty board`}),(0,O.jsx)(`span`,{className:`block text-xs text-muted-foreground`,children:`Name your own columns`})]})})]}),n?(0,O.jsxs)(`p`,{role:`status`,className:`mt-3 flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,O.jsx)(f,{}),`Creating board…`]}):null,r?null:(0,O.jsx)(s,{variant:`ghost`,size:`sm`,className:`mt-3`,onClick:a,children:`Cancel`})]})}function I({template:e,disabled:t,onPick:n}){let r=(0,w.useCallback)(()=>n(e),[n,e]),i=e.definition.columns;return(0,O.jsxs)(`button`,{type:`button`,onClick:r,disabled:t,className:`flex w-full items-center gap-3 border-b border-border px-3.5 py-2.5 text-left last:border-b-0 hover:bg-secondary disabled:pointer-events-none disabled:opacity-60`,children:[(0,O.jsxs)(`span`,{className:`min-w-0`,children:[(0,O.jsx)(`span`,{className:`block text-sm font-medium text-foreground`,children:e.name}),(0,O.jsx)(`span`,{className:`block truncate text-xs text-muted-foreground`,children:i.map(e=>e.title).join(` · `)})]}),(0,O.jsx)(`span`,{"aria-hidden":!0,className:`ml-auto flex shrink-0 gap-1`,children:i.map((t,n)=>(0,O.jsx)(`span`,{className:c(`size-1.5 rounded-full`,t.colorToken?C[t.colorToken]:`bg-muted-icon`)},`${e.id}-${String(n)}`))})]})}export{j as t};
1
+ import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{t}from"./react-eq8zrF0J.js";import{t as n}from"./jsx-runtime-BdxMnOeJ.js";import{c as r,i,m as a,t as o}from"./log-DZs-caq4.js";import{a as s,c,i as l,n as u,r as d,s as f,t as p}from"./pendingActionsStore-DU8w95f8.js";import{t as m}from"./ellipsis-DLcAuU-n.js";import{t as h}from"./plus-BvU1zO_X.js";import{t as g}from"./input-DeYDCMFk.js";import{n as _,r as v,t as y}from"./popover-PJKkayFD.js";import{o as b,r as x,s as S,t as C}from"./columnStyle-DILPgsJm.js";var w=e(t(),1),T=[],E=r()(e=>({templates:T,templatesStatus:`loading`,openMenuId:null,picking:!1,renamingId:null,error:null,setTemplates:t=>e({templates:Array.isArray(t)?t:[],templatesStatus:`ready`}),beginTemplatesLoad:()=>e({templatesStatus:`loading`}),failTemplatesLoad:()=>e({templatesStatus:`failed`}),openMenu:t=>e({openMenuId:t}),closeMenu:()=>e({openMenuId:null}),openPicker:()=>e({picking:!0,error:null}),closePicker:()=>e({picking:!1}),startRename:t=>e({renamingId:t,picking:!1,openMenuId:null}),stopRename:()=>e({renamingId:null}),setError:t=>e({error:t})}));function D(e){return e.templates}var O=e(n(),1),k=[`board.update`,`board.duplicate`,`board.saveAsTemplate`,`board.archive`];function A(e){return l(t=>k.some(n=>t.inFlight[p(n,e)]===!0))}function j({ownerKind:e,ownerId:t,ownerName:n,socket:r,onOpenBoard:c}){let l=x(e,t),f=S(b(l)),m=E(D),g=E(e=>e.picking),_=E(e=>e.renamingId),v=E(e=>e.error),y=E(e=>e.templatesStatus),C=p(`board.create`,l),T=d(C),{openPicker:k,closePicker:A,startRename:j,stopRename:N,setError:P,setTemplates:I}=E.getState();(0,w.useEffect)(()=>r.subscribe({type:`boards`,ownerKind:e,ownerId:t},e=>{S.getState().setBoards(x(e.ownerKind,e.ownerId),e.boards)}),[e,t,r]),(0,w.useEffect)(()=>{let e=!1,t=E.getState();return t.templatesStatus!==`ready`&&t.beginTemplatesLoad(),r.command({type:`board.templates.list`}).then(t=>{e||I(t)},a(t=>{o.error(i,`board.templates.list failed`,t),e||E.getState().failTemplatesLoad()})),()=>{e=!0}},[r,I]);let L=(0,w.useCallback)(async e=>{try{return await r.command(e),P(null),!0}catch(e){return P(e instanceof Error?e.message:`That did not work.`),!1}},[r,P]),R=(0,w.useCallback)(n=>{u(C,async()=>{await L({type:`board.create`,ownerKind:e,ownerId:t,title:n?n.name:`Untitled board`,templateId:n?.id??null})&&A()})},[A,C,e,t,L]),z=(0,w.useCallback)((e,t)=>{N();let n=t.trim();n!==``&&u(p(`board.update`,e),()=>L({type:`board.update`,boardId:e,title:n}))},[L,N]),B=g||f.length===0;return(0,O.jsxs)(`div`,{className:`flex min-h-0 min-w-0 flex-1 flex-col bg-background`,children:[(0,O.jsxs)(`header`,{className:`flex items-end justify-between gap-4 border-b border-border px-6 py-4`,children:[(0,O.jsxs)(`div`,{className:`min-w-0`,children:[(0,O.jsx)(`h1`,{className:`text-lg font-medium leading-tight tracking-[-0.01em] text-foreground`,children:`Boards`}),(0,O.jsxs)(`p`,{className:`truncate text-13 text-muted-foreground`,children:[n,f.length>0?(0,O.jsxs)(`span`,{className:`tabular-nums`,children:[` · `,f.length,` boards`]}):null]})]}),f.length>0?(0,O.jsxs)(s,{size:`sm`,onClick:k,pending:T,children:[(0,O.jsx)(h,{className:`size-3.5`}),`New board`]}):null]}),v?(0,O.jsx)(`p`,{className:`border-b border-border px-6 py-2 text-13 text-destructive-text`,children:v}):null,(0,O.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto`,children:[B?(0,O.jsx)(F,{templates:m,templatesStatus:y,creating:T,firstRun:f.length===0,onPick:R,onCancel:A}):null,f.length>0?(0,O.jsx)(`ul`,{className:`px-4 py-1`,children:f.map(e=>(0,O.jsx)(M,{board:e,renaming:_===e.id,onOpen:c,onStartRename:j,onRename:z,onCancelRename:N,onCommand:L},e.id))}):null]})]})}function M({board:e,renaming:t,onOpen:n,onStartRename:r,onRename:i,onCancelRename:a,onCommand:o}){let s=A(e.id),c=(0,w.useCallback)(()=>n(e.id),[e.id,n]),l=(0,w.useCallback)(t=>{t.key===`Enter`&&i(e.id,t.currentTarget.value),t.key===`Escape`&&a()},[e.id,a,i]),u=(0,w.useCallback)(t=>i(e.id,t.currentTarget.value),[e.id,i]);return(0,O.jsxs)(`li`,{"aria-busy":s||void 0,className:`group grid grid-cols-[1fr_auto_auto] items-center gap-5 border-b border-border px-3 py-3 last:border-b-0 hover:bg-secondary`,children:[(0,O.jsx)(`div`,{className:`min-w-0`,children:t?(0,O.jsx)(g,{autoFocus:!0,defaultValue:e.title,onKeyDown:l,onBlur:u,className:`h-7 max-w-sm`,"aria-label":`Board name`}):(0,O.jsxs)(`button`,{type:`button`,onClick:c,className:`block w-full text-left`,children:[(0,O.jsx)(`span`,{className:`block truncate text-15 font-semibold tracking-[-0.005em] text-foreground`,children:e.title}),e.description?(0,O.jsx)(`span`,{className:`mt-0.5 block truncate text-13 text-muted-foreground`,children:e.description}):null]})}),(0,O.jsxs)(`div`,{className:`flex items-center gap-4 text-xs text-muted-foreground`,children:[(0,O.jsxs)(`span`,{children:[(0,O.jsx)(`b`,{className:`font-medium tabular-nums text-foreground`,children:e.columnCount}),` columns`]}),(0,O.jsxs)(`span`,{children:[(0,O.jsx)(`b`,{className:`font-medium tabular-nums text-foreground`,children:e.cardCount}),` cards`]})]}),(0,O.jsx)(N,{board:e,pending:s,onStartRename:r,onCommand:o})]})}function N({board:e,pending:t,onStartRename:n,onCommand:r}){let i=E(t=>t.openMenuId===e.id),{openMenu:a,closeMenu:o}=E.getState(),s=(0,w.useCallback)(t=>{t?a(e.id):o()},[e.id,o,a]),l=(0,w.useCallback)(()=>{o(),n(e.id)},[e.id,o,n]),d=(0,w.useCallback)(()=>{o(),u(p(`board.duplicate`,e.id),()=>r({type:`board.duplicate`,boardId:e.id,title:`${e.title} copy`}))},[e.id,e.title,o,r]),h=(0,w.useCallback)(()=>{o(),u(p(`board.saveAsTemplate`,e.id),()=>r({type:`board.saveAsTemplate`,boardId:e.id,name:e.title}))},[e.id,e.title,o,r]),g=(0,w.useCallback)(()=>{o(),u(p(`board.archive`,e.id),()=>r({type:`board.archive`,boardId:e.id}))},[e.id,o,r]);return(0,O.jsxs)(y,{open:i,onOpenChange:s,children:[(0,O.jsx)(v,{asChild:!0,children:(0,O.jsx)(`button`,{type:`button`,"aria-label":`Actions for ${e.title}`,disabled:t,"aria-busy":t||void 0,className:c(`rounded-md px-1.5 py-1 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100 data-[state=open]:opacity-100`,t&&`opacity-100`),children:t?(0,O.jsx)(f,{className:`size-4`}):(0,O.jsx)(m,{className:`size-4`})})}),(0,O.jsxs)(_,{align:`end`,className:`w-56 p-1`,children:[(0,O.jsx)(P,{onClick:l,children:`Rename`}),(0,O.jsx)(P,{onClick:d,children:`Duplicate structure`}),(0,O.jsx)(P,{onClick:h,children:`Save as template`}),(0,O.jsx)(`div`,{className:`my-1 h-px bg-border`}),(0,O.jsx)(P,{onClick:g,tone:`destructive`,children:`Archive`})]})]})}function P({onClick:e,children:t,tone:n}){return(0,O.jsx)(`button`,{type:`button`,onClick:e,className:c(`flex w-full items-center rounded-sm px-2 py-1.5 text-left text-xs font-medium hover:bg-secondary`,n===`destructive`&&`text-destructive-text`),children:t})}function F({templates:e,templatesStatus:t,creating:n,firstRun:r,onPick:i,onCancel:a}){let o=(0,w.useCallback)(()=>i(null),[i]);return(0,O.jsxs)(`div`,{className:`px-6 py-8`,children:[r?(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(`h2`,{className:`text-15 font-semibold text-foreground`,children:`No boards yet.`}),(0,O.jsx)(`p`,{className:`mt-1 max-w-[58ch] text-sm text-muted-foreground`,children:`A board turns issues into work your agents can pick up. Start from a shape, or import an existing tracker.`})]}):(0,O.jsx)(`h2`,{className:`text-15 font-semibold text-foreground`,children:`Start from a shape`}),(0,O.jsxs)(`div`,{className:`mt-4 max-w-xl rounded-lg border border-border`,"aria-busy":n||void 0,children:[e.map(e=>(0,O.jsx)(I,{template:e,disabled:n,onPick:i},e.id)),t===`loading`?(0,O.jsxs)(`p`,{role:`status`,className:`flex items-center gap-2 px-3.5 py-2.5 text-xs text-muted-foreground`,children:[(0,O.jsx)(f,{}),`Loading templates…`]}):null,t===`failed`?(0,O.jsx)(`p`,{className:`px-3.5 py-2.5 text-xs text-muted-foreground`,children:`Couldn't load templates.`}):null,(0,O.jsx)(`button`,{type:`button`,onClick:o,disabled:n,className:`flex w-full items-center border-t border-border px-3.5 py-2.5 text-left hover:bg-secondary disabled:pointer-events-none disabled:opacity-60`,children:(0,O.jsxs)(`span`,{children:[(0,O.jsx)(`span`,{className:`block text-sm font-medium text-foreground`,children:`Empty board`}),(0,O.jsx)(`span`,{className:`block text-xs text-muted-foreground`,children:`Name your own columns`})]})})]}),n?(0,O.jsxs)(`p`,{role:`status`,className:`mt-3 flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,O.jsx)(f,{}),`Creating board…`]}):null,r?null:(0,O.jsx)(s,{variant:`ghost`,size:`sm`,className:`mt-3`,onClick:a,children:`Cancel`})]})}function I({template:e,disabled:t,onPick:n}){let r=(0,w.useCallback)(()=>n(e),[n,e]),i=e.definition.columns;return(0,O.jsxs)(`button`,{type:`button`,onClick:r,disabled:t,className:`flex w-full items-center gap-3 border-b border-border px-3.5 py-2.5 text-left last:border-b-0 hover:bg-secondary disabled:pointer-events-none disabled:opacity-60`,children:[(0,O.jsxs)(`span`,{className:`min-w-0`,children:[(0,O.jsx)(`span`,{className:`block text-sm font-medium text-foreground`,children:e.name}),(0,O.jsx)(`span`,{className:`block truncate text-xs text-muted-foreground`,children:i.map(e=>e.title).join(` · `)})]}),(0,O.jsx)(`span`,{"aria-hidden":!0,className:`ml-auto flex shrink-0 gap-1`,children:i.map((t,n)=>(0,O.jsx)(`span`,{className:c(`size-1.5 rounded-full`,t.colorToken?C[t.colorToken]:`bg-muted-icon`)},`${e.id}-${String(n)}`))})]})}export{j as t};
@@ -1 +1 @@
1
- import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{t}from"./react-DiVRNtpo.js";import{l as n,u as r}from"./chunk-OB3PAWPO-DERdSR9u.js";import{t as i}from"./jsx-runtime-BdxMnOeJ.js";import{a}from"./formatters-BGORekd-.js";import{t as o}from"./BoardsPage-Cfb_jt-Y.js";var s=e(t(),1),c=e(i(),1);function l({projectId:e}){let t=r(),i=n(),l=[...t.sidebarData.starredProjectGroups,...t.sidebarData.projectGroups].find(t=>t.groupKey===e),u=l?a(l.localPath):`Project`,d=(0,s.useCallback)(t=>{i(`/boards/${e}/${t}`)},[i,e]);return(0,c.jsx)(`div`,{className:`relative flex min-h-0 min-w-0 flex-1 flex-col`,children:(0,c.jsx)(o,{ownerKind:`project`,ownerId:e,ownerName:u,socket:t.socket,onOpenBoard:d})})}export{l as BoardsRoutePage};
1
+ import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{t}from"./react-eq8zrF0J.js";import{l as n,u as r}from"./chunk-OB3PAWPO-bMwGZcTr.js";import{t as i}from"./jsx-runtime-BdxMnOeJ.js";import{a}from"./formatters-BGORekd-.js";import{t as o}from"./BoardsPage-B9xFFF0S.js";var s=e(t(),1),c=e(i(),1);function l({projectId:e}){let t=r(),i=n(),l=[...t.sidebarData.starredProjectGroups,...t.sidebarData.projectGroups].find(t=>t.groupKey===e),u=l?a(l.localPath):`Project`,d=(0,s.useCallback)(t=>{i(`/boards/${e}/${t}`)},[i,e]);return(0,c.jsx)(`div`,{className:`relative flex min-h-0 min-w-0 flex-1 flex-col`,children:(0,c.jsx)(o,{ownerKind:`project`,ownerId:e,ownerName:u,socket:t.socket,onOpenBoard:d})})}export{l as BoardsRoutePage};