@cuongtran001/kanna 1.45.0 → 1.47.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 (173) hide show
  1. package/dist/client/assets/{BoardsPage-C0hi3Sxw.js → BoardsPage-D4n1jKrz.js} +1 -1
  2. package/dist/client/assets/BoardsRoutePage-DvnA8sgg.js +1 -0
  3. package/dist/client/assets/ChatPage-CaWwjZR4.js +80 -0
  4. package/dist/client/assets/CronJobRow-BNg3n_6B.js +1 -0
  5. package/dist/client/assets/CronJobsPage-DGPCpgi2.js +1 -0
  6. package/dist/client/assets/KannaSocketProvider-ls8_E7wV.js +1 -0
  7. package/dist/client/assets/LocalProjectsPage-DjkIU-CI.js +1 -0
  8. package/dist/client/assets/SettingsPage-BQdG2Gpn.js +9 -0
  9. package/dist/client/assets/StackBoardsRoutePage-DUlZUZ0f.js +1 -0
  10. package/dist/client/assets/WorkflowsPage-DuyAZ4os.js +1 -0
  11. package/dist/client/assets/WorkflowsSection-B21zGQbZ.js +15 -0
  12. package/dist/client/assets/auth-CkUMBgRL.js +1 -0
  13. package/dist/client/assets/branding-CxXZpUoc.js +1 -0
  14. package/dist/client/assets/chatFocusPolicy-DlNQnC-P.js +43 -0
  15. package/dist/client/assets/chatSounds-vvLzl8A_.js +1 -0
  16. package/dist/client/assets/chevron-right-CfYhmMd0.js +1 -0
  17. package/dist/client/assets/clipboard.adapter-oOX2ilg4.js +1 -0
  18. package/dist/client/assets/columnStyle-BFon0FD4.js +1 -0
  19. package/dist/client/assets/editor-icons-BYPupL7B.js +1 -0
  20. package/dist/client/assets/ellipsis-DxdBZfX2.js +1 -0
  21. package/dist/client/assets/external-link-Y8PeBHhL.js +1 -0
  22. package/dist/client/assets/folder-iHFIywEf.js +1 -0
  23. package/dist/client/assets/index-B7QF_u-n.js +68 -0
  24. package/dist/client/assets/index-BTYDMm-o.css +1 -0
  25. package/dist/client/assets/input-DKS4Wabz.js +1 -0
  26. package/dist/client/assets/lexicalToReact-CmBG3fG-.js +27 -0
  27. package/dist/client/assets/monitor-ZCVc54kx.js +1 -0
  28. package/dist/client/assets/plus-B-yZJldk.js +1 -0
  29. package/dist/client/assets/popover-Z9RcEVxM.js +1 -0
  30. package/dist/client/assets/pushClient-Bl0yS8dB.js +1 -0
  31. package/dist/client/assets/settings-header-button-D1jUydbh.js +1 -0
  32. package/dist/client/assets/square-pen-i4HSLucd.js +1 -0
  33. package/dist/client/assets/state-mark-BaDrojX-.js +1 -0
  34. package/dist/client/assets/status-pill-7oGKnp-A.js +1 -0
  35. package/dist/client/assets/statusLabel-CCBzc1NW.js +1 -0
  36. package/dist/client/assets/terminal-DN6RVlGE.js +1 -0
  37. package/dist/client/assets/timer.adapter-D4UNPu_T.js +1 -0
  38. package/dist/client/assets/useKannaState-VCszkCW6.js +5 -0
  39. package/dist/client/assets/workflowsStore-DIyxNBAq.js +1 -0
  40. package/dist/client/index.html +20 -22
  41. package/package.json +3 -3
  42. package/src/server/__fixtures__/plugins/hello/index.ts +5 -0
  43. package/src/server/agent.stack-spawn.test.ts +71 -2
  44. package/src/server/agent.ts +1 -0
  45. package/src/server/board-registry.test.ts +94 -0
  46. package/src/server/board-registry.ts +51 -2
  47. package/src/server/board-start-work.test.ts +90 -0
  48. package/src/server/board-start-work.ts +24 -8
  49. package/src/server/claude-loop-commands.test.ts +127 -0
  50. package/src/server/claude-loop-commands.ts +22 -6
  51. package/src/server/claude-plugin-update-checker.adapter.test.ts +2 -0
  52. package/src/server/claude-pty/driver.test.ts +32 -41
  53. package/src/server/claude-pty/driver.ts +12 -20
  54. package/src/server/claude-pty/env.test.ts +39 -0
  55. package/src/server/claude-pty/env.ts +31 -0
  56. package/src/server/claude-session-config.test.ts +1 -1
  57. package/src/server/claude-session-config.ts +52 -10
  58. package/src/server/claude-session-spawner.ts +8 -1
  59. package/src/server/claude-session-start.test.ts +28 -0
  60. package/src/server/claude-session-start.ts +8 -1
  61. package/src/server/claude-spawn-helpers.test.ts +42 -0
  62. package/src/server/claude-spawn-helpers.ts +32 -0
  63. package/src/server/claude-subagent-wiring.test.ts +3 -0
  64. package/src/server/claude-subagent-wiring.ts +15 -3
  65. package/src/server/claude-turn-starter.test.ts +35 -0
  66. package/src/server/claude-turn-starter.ts +28 -4
  67. package/src/server/cli-runtime.ts +19 -0
  68. package/src/server/codex-plugin-update-checker.adapter.test.ts +2 -0
  69. package/src/server/cron/commands.ts +2 -2
  70. package/src/server/cron/fire.ts +2 -2
  71. package/src/server/cron/read-model.test.ts +2 -2
  72. package/src/server/cron/read-model.ts +0 -9
  73. package/src/server/design/raw-ink-guard.test.ts +58 -0
  74. package/src/server/design/tone-pairings.test.ts +27 -1
  75. package/src/server/event-store-apply.ts +4 -2
  76. package/src/server/event-store-chat-lifecycle.ts +23 -0
  77. package/src/server/event-store-helpers.ts +2 -0
  78. package/src/server/event-store-write-ops.test.ts +75 -0
  79. package/src/server/event-store-write-ops.ts +54 -0
  80. package/src/server/event-store.stack-methods.test.ts +69 -0
  81. package/src/server/event-store.ts +12 -0
  82. package/src/server/events.ts +19 -0
  83. package/src/server/http-dispatcher.ts +9 -1
  84. package/src/server/kanna-mcp-http.ts +7 -2
  85. package/src/server/kanna-mcp.ts +1 -1
  86. package/src/server/package-update-manager.test.ts +37 -2
  87. package/src/server/package-update-manager.ts +4 -0
  88. package/src/server/plugin-cli-dispatch.test.ts +5 -1
  89. package/src/server/plugin-system-acceptance.test.tsx +97 -1
  90. package/src/server/plugins/installed-plugin-store.test.ts +87 -0
  91. package/src/server/plugins/installed-plugin-store.ts +47 -0
  92. package/src/server/plugins/plugin-child-entry.adapter.ts +8 -0
  93. package/src/server/plugins/plugin-rpc-protocol.ts +7 -4
  94. package/src/server/plugins/plugin-service-host.ts +20 -2
  95. package/src/server/plugins/plugin-service.ts +63 -5
  96. package/src/server/provider-catalog.test.ts +66 -0
  97. package/src/server/provider-catalog.ts +14 -3
  98. package/src/server/read-models.ts +45 -21
  99. package/src/server/skill-update-applier.adapter.test.ts +52 -0
  100. package/src/server/skill-update-applier.adapter.ts +82 -13
  101. package/src/server/skill-update-checker.adapter.test.ts +93 -58
  102. package/src/server/skill-update-checker.adapter.ts +59 -81
  103. package/src/server/subagent-provider-run.test.ts +35 -16
  104. package/src/server/subagent-provider-run.ts +33 -8
  105. package/src/server/ws-router-boards.test.ts +81 -0
  106. package/src/server/ws-router-boards.ts +15 -0
  107. package/src/server/ws-router-misc.test.ts +1 -0
  108. package/src/server/ws-router-misc.ts +14 -0
  109. package/src/server/ws-router-project.test.ts +1 -0
  110. package/src/server/ws-router-project.ts +8 -0
  111. package/src/shared/boards/dependencies.test.ts +149 -0
  112. package/src/shared/boards/dependencies.ts +180 -0
  113. package/src/shared/boards/types.ts +22 -2
  114. package/src/shared/boards/worktree-cleanup.ts +26 -0
  115. package/src/shared/cron/types.ts +17 -0
  116. package/src/shared/design/tone-pairings.ts +27 -10
  117. package/src/shared/kanna-system-prompt.test.ts +153 -7
  118. package/src/shared/kanna-system-prompt.ts +99 -9
  119. package/src/shared/packages/parse-claude-plugins.ts +2 -0
  120. package/src/shared/packages/parse-codex-plugins.ts +1 -0
  121. package/src/shared/packages/parse-skill-lock.test.ts +30 -0
  122. package/src/shared/packages/parse-skill-lock.ts +2 -0
  123. package/src/shared/packages/skill-update-classifier.test.ts +158 -45
  124. package/src/shared/packages/skill-update-classifier.ts +74 -16
  125. package/src/shared/packages/tag-order.test.ts +50 -0
  126. package/src/shared/packages/tag-order.ts +57 -0
  127. package/src/shared/packages/types.ts +20 -3
  128. package/src/shared/plugins/kanna-plugin.d.ts +29 -5
  129. package/src/shared/protocol.ts +12 -1
  130. package/src/shared/provider-model-types.ts +25 -1
  131. package/src/shared/stack-activity.test.ts +73 -0
  132. package/src/shared/stack-activity.ts +84 -0
  133. package/src/shared/types.test.ts +49 -0
  134. package/src/shared/types.ts +30 -0
  135. package/dist/client/assets/BoardsRoutePage-Ddnhf9zH.js +0 -1
  136. package/dist/client/assets/ChatPage-C7_AR38q.js +0 -80
  137. package/dist/client/assets/CronJobsPage-HABBKfLu.js +0 -1
  138. package/dist/client/assets/CronRunMessage-CGWtVJa8.js +0 -1
  139. package/dist/client/assets/KannaSocketProvider-D0Y5xmTk.js +0 -1
  140. package/dist/client/assets/LocalProjectsPage-DtRA9jAq.js +0 -1
  141. package/dist/client/assets/SettingsPage-CIHHL6H3.js +0 -9
  142. package/dist/client/assets/StackBoardsRoutePage-Bq78WpVq.js +0 -1
  143. package/dist/client/assets/WorkflowsPage-9I4_F1Bt.js +0 -1
  144. package/dist/client/assets/WorkflowsSection-CJLAqfQN.js +0 -15
  145. package/dist/client/assets/auth-Co6nHIYC.js +0 -1
  146. package/dist/client/assets/branding-BaaKwwlR.js +0 -1
  147. package/dist/client/assets/chatFocusPolicy-nCC4Nns_.js +0 -41
  148. package/dist/client/assets/chatSounds-Bo2g0RmW.js +0 -1
  149. package/dist/client/assets/chevron-right-DUHoKr5L.js +0 -1
  150. package/dist/client/assets/clipboard.adapter-B95KiOUK.js +0 -1
  151. package/dist/client/assets/columnStyle-D64DobJn.js +0 -1
  152. package/dist/client/assets/dist-CDCFUYZH.js +0 -1
  153. package/dist/client/assets/dist-CsAvKYg8.js +0 -3
  154. package/dist/client/assets/editor-icons-BFFe-sN1.js +0 -1
  155. package/dist/client/assets/ellipsis-nySniJCj.js +0 -1
  156. package/dist/client/assets/folder-BZjVKgoL.js +0 -1
  157. package/dist/client/assets/index-D-YkX4An.js +0 -17
  158. package/dist/client/assets/index-DTqYxC9D.css +0 -1
  159. package/dist/client/assets/input-De0renPj.js +0 -1
  160. package/dist/client/assets/lexicalToReact-BTTJwjtI.js +0 -27
  161. package/dist/client/assets/log-D4lO8wz-.js +0 -1
  162. package/dist/client/assets/monitor-mXvAjwNv.js +0 -1
  163. package/dist/client/assets/popover-CnKTPov4.js +0 -1
  164. package/dist/client/assets/pushClient-B-5DEoMe.js +0 -1
  165. package/dist/client/assets/segmented-control-B5eDmd-1.js +0 -1
  166. package/dist/client/assets/settings-header-button-_cu_QZqY.js +0 -1
  167. package/dist/client/assets/square-pen-QhvV0lju.js +0 -1
  168. package/dist/client/assets/status-pill-rsCMZKum.js +0 -1
  169. package/dist/client/assets/terminal-Dhxl9RY9.js +0 -1
  170. package/dist/client/assets/timer.adapter-CJOkHwYh.js +0 -1
  171. package/dist/client/assets/tone-pairings-BkfvUz5n.js +0 -1
  172. package/dist/client/assets/useKannaState-D7HjY5oE.js +0 -5
  173. package/dist/client/assets/workflowsStore-NMlIijj7.js +0 -1
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-CwJFpaho.js";import{g as n,x as r}from"./dist-CsAvKYg8.js";import{t as i}from"./jsx-runtime-NZYk81nU.js";import{t as a}from"./ellipsis-nySniJCj.js";import{d as o,p as s}from"./chatFocusPolicy-nCC4Nns_.js";import{t as c}from"./input-De0renPj.js";import{n as l,r as u,t as d}from"./popover-CnKTPov4.js";import{o as f,r as p,s as m,t as h}from"./columnStyle-D64DobJn.js";var g=e(t(),1),_=[],v=r()(e=>({templates:_,openMenuId:null,picking:!1,renamingId:null,error:null,setTemplates:t=>e({templates:Array.isArray(t)?t:[]}),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 y(e){return e.templates}var b=e(i(),1);function x({ownerKind:e,ownerId:t,ownerName:n,socket:r,onOpenBoard:i}){let a=p(e,t),c=m(f(a)),l=v(y),u=v(e=>e.picking),d=v(e=>e.renamingId),h=v(e=>e.error),{openPicker:_,closePicker:x,startRename:C,stopRename:w,setError:E,setTemplates:D}=v.getState();(0,g.useEffect)(()=>r.subscribe({type:`boards`,ownerKind:e,ownerId:t},e=>{m.getState().setBoards(p(e.ownerKind,e.ownerId),e.boards)}),[e,t,r]),(0,g.useEffect)(()=>{let e=!1;return r.command({type:`board.templates.list`}).then(t=>{e||D(t)}).catch(()=>{}),()=>{e=!0}},[r,D]);let O=(0,g.useCallback)(async e=>{try{await r.command(e),E(null)}catch(e){E(e instanceof Error?e.message:`That did not work.`)}},[r,E]),k=(0,g.useCallback)(n=>{x(),O({type:`board.create`,ownerKind:e,ownerId:t,title:n?n.name:`Untitled board`,templateId:n?.id??null})},[x,e,t,O]),A=(0,g.useCallback)((e,t)=>{w();let n=t.trim();n!==``&&O({type:`board.update`,boardId:e,title:n})},[O,w]),j=u||c.length===0;return(0,b.jsxs)(`div`,{className:`flex min-h-0 min-w-0 flex-1 flex-col bg-background`,children:[(0,b.jsxs)(`header`,{className:`flex items-end justify-between gap-4 border-b border-border px-6 py-4`,children:[(0,b.jsxs)(`div`,{className:`min-w-0`,children:[(0,b.jsx)(`h1`,{className:`text-lg font-medium leading-tight tracking-[-0.01em] text-foreground`,children:`Boards`}),(0,b.jsxs)(`p`,{className:`truncate text-13 text-muted-foreground`,children:[n,c.length>0?(0,b.jsxs)(`span`,{className:`tabular-nums`,children:[` · `,c.length,` boards`]}):null]})]}),c.length>0?(0,b.jsxs)(o,{size:`sm`,onClick:_,children:[(0,b.jsx)(s,{className:`size-3.5`}),`New board`]}):null]}),h?(0,b.jsx)(`p`,{className:`border-b border-border px-6 py-2 text-13 text-destructive-text`,children:h}):null,(0,b.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto`,children:[j?(0,b.jsx)(T,{templates:l,firstRun:c.length===0,onPick:k,onCancel:x}):null,c.length>0?(0,b.jsx)(`ul`,{className:`px-4 py-1`,children:c.map(e=>(0,b.jsx)(S,{board:e,renaming:d===e.id,onOpen:i,onStartRename:C,onRename:A,onCancelRename:w,onCommand:O},e.id))}):null]})]})}function S({board:e,renaming:t,onOpen:n,onStartRename:r,onRename:i,onCancelRename:a,onCommand:o}){let s=(0,g.useCallback)(()=>n(e.id),[e.id,n]),l=(0,g.useCallback)(t=>{t.key===`Enter`&&i(e.id,t.currentTarget.value),t.key===`Escape`&&a()},[e.id,a,i]),u=(0,g.useCallback)(t=>i(e.id,t.currentTarget.value),[e.id,i]);return(0,b.jsxs)(`li`,{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,b.jsx)(`div`,{className:`min-w-0`,children:t?(0,b.jsx)(c,{autoFocus:!0,defaultValue:e.title,onKeyDown:l,onBlur:u,className:`h-7 max-w-sm`,"aria-label":`Board name`}):(0,b.jsxs)(`button`,{type:`button`,onClick:s,className:`block w-full text-left`,children:[(0,b.jsx)(`span`,{className:`block truncate text-15 font-semibold tracking-[-0.005em] text-foreground`,children:e.title}),e.description?(0,b.jsx)(`span`,{className:`mt-0.5 block truncate text-13 text-muted-foreground`,children:e.description}):null]})}),(0,b.jsxs)(`div`,{className:`flex items-center gap-4 text-xs text-muted-foreground`,children:[(0,b.jsxs)(`span`,{children:[(0,b.jsx)(`b`,{className:`font-medium tabular-nums text-foreground`,children:e.columnCount}),` columns`]}),(0,b.jsxs)(`span`,{children:[(0,b.jsx)(`b`,{className:`font-medium tabular-nums text-foreground`,children:e.cardCount}),` cards`]})]}),(0,b.jsx)(C,{board:e,onStartRename:r,onCommand:o})]})}function C({board:e,onStartRename:t,onCommand:n}){let r=v(t=>t.openMenuId===e.id),{openMenu:i,closeMenu:o}=v.getState(),s=(0,g.useCallback)(t=>{t?i(e.id):o()},[e.id,o,i]),c=(0,g.useCallback)(()=>{o(),t(e.id)},[e.id,o,t]),f=(0,g.useCallback)(()=>{o(),n({type:`board.duplicate`,boardId:e.id,title:`${e.title} copy`})},[e.id,e.title,o,n]),p=(0,g.useCallback)(()=>{o(),n({type:`board.saveAsTemplate`,boardId:e.id,name:e.title})},[e.id,e.title,o,n]),m=(0,g.useCallback)(()=>{o(),n({type:`board.archive`,boardId:e.id})},[e.id,o,n]);return(0,b.jsxs)(d,{open:r,onOpenChange:s,children:[(0,b.jsx)(u,{asChild:!0,children:(0,b.jsx)(`button`,{type:`button`,"aria-label":`Actions for ${e.title}`,className:`rounded-md px-1.5 py-1 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100 data-[state=open]:opacity-100`,children:(0,b.jsx)(a,{className:`size-4`})})}),(0,b.jsxs)(l,{align:`end`,className:`w-56 p-1`,children:[(0,b.jsx)(w,{onClick:c,children:`Rename`}),(0,b.jsx)(w,{onClick:f,children:`Duplicate structure`}),(0,b.jsx)(w,{onClick:p,children:`Save as template`}),(0,b.jsx)(`div`,{className:`my-1 h-px bg-border`}),(0,b.jsx)(w,{onClick:m,tone:`destructive`,children:`Archive`})]})]})}function w({onClick:e,children:t,tone:r}){return(0,b.jsx)(`button`,{type:`button`,onClick:e,className:n(`flex w-full items-center rounded-sm px-2 py-1.5 text-left text-xs font-medium hover:bg-secondary`,r===`destructive`&&`text-destructive-text`),children:t})}function T({templates:e,firstRun:t,onPick:n,onCancel:r}){let i=(0,g.useCallback)(()=>n(null),[n]);return(0,b.jsxs)(`div`,{className:`px-6 py-8`,children:[t?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`h2`,{className:`text-15 font-semibold text-foreground`,children:`No boards yet.`}),(0,b.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,b.jsx)(`h2`,{className:`text-15 font-semibold text-foreground`,children:`Start from a shape`}),(0,b.jsxs)(`div`,{className:`mt-4 max-w-xl rounded-lg border border-border`,children:[e.map(e=>(0,b.jsx)(E,{template:e,onPick:n},e.id)),(0,b.jsx)(`button`,{type:`button`,onClick:i,className:`flex w-full items-center border-t border-border px-3.5 py-2.5 text-left hover:bg-secondary`,children:(0,b.jsxs)(`span`,{children:[(0,b.jsx)(`span`,{className:`block text-sm font-medium text-foreground`,children:`Empty board`}),(0,b.jsx)(`span`,{className:`block text-xs text-muted-foreground`,children:`Name your own columns`})]})})]}),t?null:(0,b.jsx)(o,{variant:`ghost`,size:`sm`,className:`mt-3`,onClick:r,children:`Cancel`})]})}function E({template:e,onPick:t}){let r=(0,g.useCallback)(()=>t(e),[t,e]),i=e.definition.columns;return(0,b.jsxs)(`button`,{type:`button`,onClick:r,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`,children:[(0,b.jsxs)(`span`,{className:`min-w-0`,children:[(0,b.jsx)(`span`,{className:`block text-sm font-medium text-foreground`,children:e.name}),(0,b.jsx)(`span`,{className:`block truncate text-xs text-muted-foreground`,children:i.map(e=>e.title).join(` · `)})]}),(0,b.jsx)(`span`,{"aria-hidden":!0,className:`ml-auto flex shrink-0 gap-1`,children:i.map((t,r)=>(0,b.jsx)(`span`,{className:n(`size-1.5 rounded-full`,t.colorToken?h[t.colorToken]:`bg-muted-icon`)},`${e.id}-${String(r)}`))})]})}export{x as t};
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-CwJFpaho.js";import{E as n,M as r,O as i}from"./chatFocusPolicy-DlNQnC-P.js";import{t as a}from"./jsx-runtime-NZYk81nU.js";import{t as o}from"./ellipsis-DxdBZfX2.js";import{t as s}from"./plus-B-yZJldk.js";import{t as c}from"./input-DKS4Wabz.js";import{n as l,r as u,t as d}from"./popover-Z9RcEVxM.js";import{o as f,r as p,s as m,t as h}from"./columnStyle-BFon0FD4.js";var g=e(t(),1),_=[],v=r()(e=>({templates:_,openMenuId:null,picking:!1,renamingId:null,error:null,setTemplates:t=>e({templates:Array.isArray(t)?t:[]}),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 y(e){return e.templates}var b=e(a(),1);function x({ownerKind:e,ownerId:t,ownerName:r,socket:i,onOpenBoard:a}){let o=p(e,t),c=m(f(o)),l=v(y),u=v(e=>e.picking),d=v(e=>e.renamingId),h=v(e=>e.error),{openPicker:_,closePicker:x,startRename:C,stopRename:w,setError:E,setTemplates:D}=v.getState();(0,g.useEffect)(()=>i.subscribe({type:`boards`,ownerKind:e,ownerId:t},e=>{m.getState().setBoards(p(e.ownerKind,e.ownerId),e.boards)}),[e,t,i]),(0,g.useEffect)(()=>{let e=!1;return i.command({type:`board.templates.list`}).then(t=>{e||D(t)}).catch(()=>{}),()=>{e=!0}},[i,D]);let O=(0,g.useCallback)(async e=>{try{await i.command(e),E(null)}catch(e){E(e instanceof Error?e.message:`That did not work.`)}},[i,E]),k=(0,g.useCallback)(n=>{x(),O({type:`board.create`,ownerKind:e,ownerId:t,title:n?n.name:`Untitled board`,templateId:n?.id??null})},[x,e,t,O]),A=(0,g.useCallback)((e,t)=>{w();let n=t.trim();n!==``&&O({type:`board.update`,boardId:e,title:n})},[O,w]),j=u||c.length===0;return(0,b.jsxs)(`div`,{className:`flex min-h-0 min-w-0 flex-1 flex-col bg-background`,children:[(0,b.jsxs)(`header`,{className:`flex items-end justify-between gap-4 border-b border-border px-6 py-4`,children:[(0,b.jsxs)(`div`,{className:`min-w-0`,children:[(0,b.jsx)(`h1`,{className:`text-lg font-medium leading-tight tracking-[-0.01em] text-foreground`,children:`Boards`}),(0,b.jsxs)(`p`,{className:`truncate text-13 text-muted-foreground`,children:[r,c.length>0?(0,b.jsxs)(`span`,{className:`tabular-nums`,children:[` · `,c.length,` boards`]}):null]})]}),c.length>0?(0,b.jsxs)(n,{size:`sm`,onClick:_,children:[(0,b.jsx)(s,{className:`size-3.5`}),`New board`]}):null]}),h?(0,b.jsx)(`p`,{className:`border-b border-border px-6 py-2 text-13 text-destructive-text`,children:h}):null,(0,b.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto`,children:[j?(0,b.jsx)(T,{templates:l,firstRun:c.length===0,onPick:k,onCancel:x}):null,c.length>0?(0,b.jsx)(`ul`,{className:`px-4 py-1`,children:c.map(e=>(0,b.jsx)(S,{board:e,renaming:d===e.id,onOpen:a,onStartRename:C,onRename:A,onCancelRename:w,onCommand:O},e.id))}):null]})]})}function S({board:e,renaming:t,onOpen:n,onStartRename:r,onRename:i,onCancelRename:a,onCommand:o}){let s=(0,g.useCallback)(()=>n(e.id),[e.id,n]),l=(0,g.useCallback)(t=>{t.key===`Enter`&&i(e.id,t.currentTarget.value),t.key===`Escape`&&a()},[e.id,a,i]),u=(0,g.useCallback)(t=>i(e.id,t.currentTarget.value),[e.id,i]);return(0,b.jsxs)(`li`,{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,b.jsx)(`div`,{className:`min-w-0`,children:t?(0,b.jsx)(c,{autoFocus:!0,defaultValue:e.title,onKeyDown:l,onBlur:u,className:`h-7 max-w-sm`,"aria-label":`Board name`}):(0,b.jsxs)(`button`,{type:`button`,onClick:s,className:`block w-full text-left`,children:[(0,b.jsx)(`span`,{className:`block truncate text-15 font-semibold tracking-[-0.005em] text-foreground`,children:e.title}),e.description?(0,b.jsx)(`span`,{className:`mt-0.5 block truncate text-13 text-muted-foreground`,children:e.description}):null]})}),(0,b.jsxs)(`div`,{className:`flex items-center gap-4 text-xs text-muted-foreground`,children:[(0,b.jsxs)(`span`,{children:[(0,b.jsx)(`b`,{className:`font-medium tabular-nums text-foreground`,children:e.columnCount}),` columns`]}),(0,b.jsxs)(`span`,{children:[(0,b.jsx)(`b`,{className:`font-medium tabular-nums text-foreground`,children:e.cardCount}),` cards`]})]}),(0,b.jsx)(C,{board:e,onStartRename:r,onCommand:o})]})}function C({board:e,onStartRename:t,onCommand:n}){let r=v(t=>t.openMenuId===e.id),{openMenu:i,closeMenu:a}=v.getState(),s=(0,g.useCallback)(t=>{t?i(e.id):a()},[e.id,a,i]),c=(0,g.useCallback)(()=>{a(),t(e.id)},[e.id,a,t]),f=(0,g.useCallback)(()=>{a(),n({type:`board.duplicate`,boardId:e.id,title:`${e.title} copy`})},[e.id,e.title,a,n]),p=(0,g.useCallback)(()=>{a(),n({type:`board.saveAsTemplate`,boardId:e.id,name:e.title})},[e.id,e.title,a,n]),m=(0,g.useCallback)(()=>{a(),n({type:`board.archive`,boardId:e.id})},[e.id,a,n]);return(0,b.jsxs)(d,{open:r,onOpenChange:s,children:[(0,b.jsx)(u,{asChild:!0,children:(0,b.jsx)(`button`,{type:`button`,"aria-label":`Actions for ${e.title}`,className:`rounded-md px-1.5 py-1 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100 data-[state=open]:opacity-100`,children:(0,b.jsx)(o,{className:`size-4`})})}),(0,b.jsxs)(l,{align:`end`,className:`w-56 p-1`,children:[(0,b.jsx)(w,{onClick:c,children:`Rename`}),(0,b.jsx)(w,{onClick:f,children:`Duplicate structure`}),(0,b.jsx)(w,{onClick:p,children:`Save as template`}),(0,b.jsx)(`div`,{className:`my-1 h-px bg-border`}),(0,b.jsx)(w,{onClick:m,tone:`destructive`,children:`Archive`})]})]})}function w({onClick:e,children:t,tone:n}){return(0,b.jsx)(`button`,{type:`button`,onClick:e,className:i(`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 T({templates:e,firstRun:t,onPick:r,onCancel:i}){let a=(0,g.useCallback)(()=>r(null),[r]);return(0,b.jsxs)(`div`,{className:`px-6 py-8`,children:[t?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`h2`,{className:`text-15 font-semibold text-foreground`,children:`No boards yet.`}),(0,b.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,b.jsx)(`h2`,{className:`text-15 font-semibold text-foreground`,children:`Start from a shape`}),(0,b.jsxs)(`div`,{className:`mt-4 max-w-xl rounded-lg border border-border`,children:[e.map(e=>(0,b.jsx)(E,{template:e,onPick:r},e.id)),(0,b.jsx)(`button`,{type:`button`,onClick:a,className:`flex w-full items-center border-t border-border px-3.5 py-2.5 text-left hover:bg-secondary`,children:(0,b.jsxs)(`span`,{children:[(0,b.jsx)(`span`,{className:`block text-sm font-medium text-foreground`,children:`Empty board`}),(0,b.jsx)(`span`,{className:`block text-xs text-muted-foreground`,children:`Name your own columns`})]})})]}),t?null:(0,b.jsx)(n,{variant:`ghost`,size:`sm`,className:`mt-3`,onClick:i,children:`Cancel`})]})}function E({template:e,onPick:t}){let n=(0,g.useCallback)(()=>t(e),[t,e]),r=e.definition.columns;return(0,b.jsxs)(`button`,{type:`button`,onClick:n,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`,children:[(0,b.jsxs)(`span`,{className:`min-w-0`,children:[(0,b.jsx)(`span`,{className:`block text-sm font-medium text-foreground`,children:e.name}),(0,b.jsx)(`span`,{className:`block truncate text-xs text-muted-foreground`,children:r.map(e=>e.title).join(` · `)})]}),(0,b.jsx)(`span`,{"aria-hidden":!0,className:`ml-auto flex shrink-0 gap-1`,children:r.map((t,n)=>(0,b.jsx)(`span`,{className:i(`size-1.5 rounded-full`,t.colorToken?h[t.colorToken]:`bg-muted-icon`)},`${e.id}-${String(n)}`))})]})}export{x as t};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-CwJFpaho.js";import{G as n,U as r,W as i}from"./chatFocusPolicy-DlNQnC-P.js";import{t as a}from"./jsx-runtime-NZYk81nU.js";import{o}from"./formatters-wSVyvDFZ.js";import{t as s}from"./BoardsPage-D4n1jKrz.js";var c=e(t(),1),l=e(a(),1);function u(){let e=i(),t=r(),{projectId:a=``}=n(),u=[...e.sidebarData.starredProjectGroups,...e.sidebarData.projectGroups].find(e=>e.groupKey===a),d=u?o(u.localPath):`Project`,f=(0,c.useCallback)(e=>{t(`/boards/${a}/${e}`)},[t,a]);return(0,l.jsx)(`div`,{className:`relative flex min-h-0 min-w-0 flex-1 flex-col`,children:(0,l.jsx)(s,{ownerKind:`project`,ownerId:a,ownerName:d,socket:e.socket,onOpenBoard:f})})}export{u as BoardsRoutePage};