@kortix/ui 0.14.12 → 0.14.14

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 (438) hide show
  1. package/README.md +1 -1
  2. package/dist/_vendor/kortix-shared.js +521 -7045
  3. package/dist/_vendor/shared/app-config.d.ts +8 -0
  4. package/dist/_vendor/shared/artifact-annotations.d.ts +708 -0
  5. package/dist/_vendor/shared/artifact-comments.d.ts +327 -0
  6. package/dist/_vendor/shared/index.d.ts +3 -1
  7. package/dist/_vendor/shared/my-kortix-agent.d.ts +40 -0
  8. package/dist/_vendor/shared/peer-message-prompt.d.ts +35 -0
  9. package/dist/_vendor/shared/pixel-mark.d.ts +11 -0
  10. package/dist/_vendor/shared/prompt-attachments.d.ts +1 -0
  11. package/dist/_vendor/shared/reminder-prompt.d.ts +8 -2
  12. package/dist/_vendor/shared/runtime-versions.d.ts +8 -0
  13. package/dist/artifacts/artifact-frame.d.ts +1 -0
  14. package/dist/artifacts/artifact-frame.js +18 -5
  15. package/dist/artifacts/frame-policy.d.ts +1 -1
  16. package/dist/artifacts/frame-policy.js +10 -5
  17. package/dist/customize/agents/agent-access-text.d.ts +16 -0
  18. package/dist/customize/agents/agent-access-text.js +54 -0
  19. package/dist/customize/agents/agent-approval-rules.d.ts +8 -0
  20. package/dist/customize/agents/agent-approval-rules.js +26 -0
  21. package/dist/customize/agents/agent-authority-card.js +4 -1
  22. package/dist/customize/agents/agent-cover-card.d.ts +4 -1
  23. package/dist/customize/agents/agent-cover-card.js +2 -2
  24. package/dist/customize/agents/agent-detail-aside.d.ts +1 -2
  25. package/dist/customize/agents/agent-detail-aside.js +8 -11
  26. package/dist/customize/agents/agent-drives-section.d.ts +23 -7
  27. package/dist/customize/agents/agent-drives-section.js +107 -41
  28. package/dist/customize/agents/agent-instructions.d.ts +11 -0
  29. package/dist/customize/agents/agent-instructions.js +114 -0
  30. package/dist/customize/agents/agent-model-view.d.ts +17 -0
  31. package/dist/customize/agents/agent-model-view.js +67 -0
  32. package/dist/customize/agents/agent-overview.d.ts +53 -0
  33. package/dist/customize/agents/agent-overview.js +242 -0
  34. package/dist/customize/agents/agent-page-chrome.d.ts +128 -0
  35. package/dist/customize/agents/agent-page-chrome.js +145 -0
  36. package/dist/customize/agents/agent-page.d.ts +13 -1
  37. package/dist/customize/agents/agent-page.js +478 -367
  38. package/dist/customize/agents/agent-pin-button.d.ts +10 -0
  39. package/dist/customize/agents/agent-pin-button.js +20 -0
  40. package/dist/customize/agents/agent-policy-sets-section.d.ts +16 -0
  41. package/dist/customize/agents/agent-policy-sets-section.js +80 -0
  42. package/dist/customize/agents/agent-policy-sets.js +1 -1
  43. package/dist/customize/agents/agent-section-rail.d.ts +21 -0
  44. package/dist/customize/agents/agent-section-rail.js +23 -0
  45. package/dist/customize/agents/agent-share-control.d.ts +4 -3
  46. package/dist/customize/agents/agent-share-control.js +15 -16
  47. package/dist/customize/agents/{agent-people-section.d.ts → agent-share-dialog.d.ts} +3 -1
  48. package/dist/customize/agents/{agent-people-section.js → agent-share-dialog.js} +21 -21
  49. package/dist/customize/agents/agent-tabs.d.ts +95 -0
  50. package/dist/customize/agents/agent-tabs.js +199 -0
  51. package/dist/customize/agents/agents-page.d.ts +0 -21
  52. package/dist/customize/agents/agents-page.js +104 -118
  53. package/dist/customize/agents/connectors-required.d.ts +16 -0
  54. package/dist/customize/agents/connectors-required.js +19 -0
  55. package/dist/customize/agents/create-agent-modal.d.ts +19 -0
  56. package/dist/customize/agents/create-agent-modal.js +94 -0
  57. package/dist/customize/connectors/agent-access.d.ts +4 -4
  58. package/dist/customize/connectors/agent-access.js +7 -10
  59. package/dist/customize/connectors/connector-identity.d.ts +12 -0
  60. package/dist/customize/connectors/connector-identity.js +15 -2
  61. package/dist/customize/connectors/connector-routes.js +2 -2
  62. package/dist/customize/connectors/connectors-page.d.ts +14 -1
  63. package/dist/customize/connectors/connectors-page.js +101 -32
  64. package/dist/customize/connectors/detail/app-page.js +1 -1
  65. package/dist/customize/connectors/detail/connector-agents.js +0 -3
  66. package/dist/customize/connectors/detail/connector-page.d.ts +1 -1
  67. package/dist/customize/connectors/detail/connector-page.js +5 -2
  68. package/dist/customize/connectors/detail/connector-policy-sets.js +1 -1
  69. package/dist/customize/connectors/detail/connector-triggers.js +2 -2
  70. package/dist/customize/connectors/use-agent-access.d.ts +7 -5
  71. package/dist/customize/connectors/use-agent-access.js +2 -6
  72. package/dist/customize/models/models-page.d.ts +7 -1
  73. package/dist/customize/models/models-page.js +2 -2
  74. package/dist/customize/project-settings/project-admin-sections.d.ts +63 -0
  75. package/dist/customize/project-settings/project-admin-sections.js +80 -0
  76. package/dist/customize/project-settings/project-settings-page.d.ts +1 -1
  77. package/dist/customize/project-settings/project-settings-page.js +4 -13
  78. package/dist/customize/project-settings/project-settings-sections.d.ts +5 -5
  79. package/dist/customize/project-settings/project-settings-sections.js +6 -20
  80. package/dist/customize/providers/provider-accordion.js +29 -17
  81. package/dist/customize/providers/provider-connect.js +1 -1
  82. package/dist/customize/providers/provider-sheet.d.ts +4 -1
  83. package/dist/customize/providers/provider-sheet.js +15 -5
  84. package/dist/customize/secrets/secrets-page.d.ts +5 -1
  85. package/dist/customize/secrets/secrets-page.js +2 -2
  86. package/dist/customize/sections/gateway-view.d.ts +10 -2
  87. package/dist/customize/sections/gateway-view.js +16 -4
  88. package/dist/customize/sections/llm-provider/chatgpt-subscription-connect.d.ts +12 -5
  89. package/dist/customize/sections/llm-provider/chatgpt-subscription-connect.js +131 -8
  90. package/dist/customize/sections/llm-provider/claude-code-step.d.ts +10 -0
  91. package/dist/customize/sections/llm-provider/claude-code-step.js +32 -0
  92. package/dist/customize/sections/llm-provider/models-tab.js +5 -1
  93. package/dist/customize/sections/view/account-secret-resources-panel.d.ts +5 -3
  94. package/dist/customize/sections/view/account-secret-resources-panel.js +122 -19
  95. package/dist/customize/sections/view/agent-editor-access-fields.d.ts +1 -1
  96. package/dist/customize/sections/view/agent-editor-access-fields.js +8 -4
  97. package/dist/customize/sections/view/agent-editor-basics-fields.d.ts +4 -1
  98. package/dist/customize/sections/view/agent-editor-basics-fields.js +33 -4
  99. package/dist/customize/sections/view/agent-editor-catalog.d.ts +2 -2
  100. package/dist/customize/sections/view/agent-editor-catalog.js +10 -12
  101. package/dist/customize/sections/view/agent-editor-primitives.d.ts +1 -1
  102. package/dist/customize/sections/view/agent-editor-primitives.js +4 -4
  103. package/dist/customize/sections/view/agent-editor.d.ts +37 -26
  104. package/dist/customize/sections/view/agent-editor.js +19 -19
  105. package/dist/customize/sections/view/grant-mode-field.d.ts +8 -20
  106. package/dist/customize/sections/view/grant-mode-field.js +31 -57
  107. package/dist/customize/sections/view/permission-editor.d.ts +3 -1
  108. package/dist/customize/sections/view/permission-editor.js +19 -10
  109. package/dist/customize/sections/view/review-view.d.ts +8 -0
  110. package/dist/customize/sections/view/review-view.js +12 -1
  111. package/dist/customize/sections/view/secret-delivery.js +1 -4
  112. package/dist/customize/sections/view/secrets-view.d.ts +7 -1
  113. package/dist/customize/sections/view/secrets-view.js +42 -6
  114. package/dist/customize/settings/rail.js +2 -8
  115. package/dist/customize/settings/settings-tabs.d.ts +2 -2
  116. package/dist/customize/settings/settings-tabs.js +17 -19
  117. package/dist/customize/settings/tabs/experimental-tab.d.ts +3 -0
  118. package/dist/customize/settings/tabs/experimental-tab.js +6 -1
  119. package/dist/customize/settings/tabs/sandbox-tab.d.ts +4 -6
  120. package/dist/customize/settings/tabs/sandbox-tab.js +9 -9
  121. package/dist/customize/shared/access-list.d.ts +39 -0
  122. package/dist/customize/shared/access-list.js +62 -0
  123. package/dist/customize/shared/agent-resource-scope.d.ts +87 -0
  124. package/dist/customize/shared/agent-resource-scope.js +123 -0
  125. package/dist/customize/shared/capability-library.d.ts +41 -0
  126. package/dist/customize/shared/capability-library.js +271 -0
  127. package/dist/customize/shared/capability-page-shell.d.ts +18 -1
  128. package/dist/customize/shared/capability-page-shell.js +21 -1
  129. package/dist/customize/shared/catalog/catalog-space-tabs.d.ts +14 -0
  130. package/dist/customize/shared/catalog/catalog-space-tabs.js +20 -0
  131. package/dist/customize/shared/customize-tab-bar.d.ts +13 -0
  132. package/dist/customize/shared/customize-tab-bar.js +95 -0
  133. package/dist/customize/shared/entity/entity-modal.d.ts +17 -1
  134. package/dist/customize/shared/entity/entity-modal.js +10 -9
  135. package/dist/customize/shared/leave-guard.d.ts +23 -0
  136. package/dist/customize/shared/leave-guard.js +87 -0
  137. package/dist/customize/shared/standalone-settings-nav.js +4 -1
  138. package/dist/customize/shared/tool-rules.d.ts +11 -0
  139. package/dist/customize/shared/tool-rules.js +29 -0
  140. package/dist/customize/skills/builtin-skill-modal.d.ts +6 -0
  141. package/dist/customize/skills/builtin-skill-modal.js +41 -0
  142. package/dist/customize/skills/skills-page.d.ts +21 -18
  143. package/dist/customize/skills/skills-page.js +16 -110
  144. package/dist/customize/triggers/runtime-triggers.d.ts +17 -0
  145. package/dist/customize/triggers/runtime-triggers.js +57 -0
  146. package/dist/customize/triggers/schedule/event-trigger-copy.js +2 -2
  147. package/dist/customize/triggers/schedule/post-to-field.js +2 -2
  148. package/dist/customize/triggers/schedule/schedule-copy.d.ts +11 -6
  149. package/dist/customize/triggers/schedule/schedule-copy.js +29 -8
  150. package/dist/customize/triggers/schedule/schedule-detail-sheet.js +7 -3
  151. package/dist/customize/triggers/schedule/trigger-composer-logic.d.ts +26 -1
  152. package/dist/customize/triggers/schedule/trigger-composer-logic.js +64 -3
  153. package/dist/customize/triggers/schedule/trigger-composer.js +57 -20
  154. package/dist/customize/triggers/schedule/trigger-edit-logic.js +18 -5
  155. package/dist/customize/triggers/schedule/trigger-filter.d.ts +10 -0
  156. package/dist/customize/triggers/schedule/trigger-filter.js +16 -0
  157. package/dist/customize/triggers/schedule/trigger-runs-panel.js +1 -0
  158. package/dist/customize/triggers/schedule/trigger-toast.js +2 -1
  159. package/dist/customize/triggers/schedule/use-trigger-mutations.d.ts +1 -1
  160. package/dist/customize/triggers/schedule/use-trigger-mutations.js +1 -1
  161. package/dist/customize/triggers/schedule/when-app.d.ts +15 -0
  162. package/dist/customize/triggers/schedule/when-app.js +21 -0
  163. package/dist/customize/triggers/schedule/when-change-request.d.ts +10 -0
  164. package/dist/customize/triggers/schedule/when-change-request.js +15 -0
  165. package/dist/customize/triggers/schedule-view.d.ts +17 -3
  166. package/dist/customize/triggers/schedule-view.js +46 -16
  167. package/dist/customize/triggers/triggers-page.d.ts +3 -3
  168. package/dist/customize/triggers/triggers-page.js +2 -2
  169. package/dist/customize/use-configure-thread.d.ts +8 -2
  170. package/dist/customize/use-configure-thread.js +30 -18
  171. package/dist/files/project/components/change-request-detail-dialog.js +2 -3
  172. package/dist/files/project/components/drive-explorer.js +6 -5
  173. package/dist/files/project/explorer-source.d.ts +3 -0
  174. package/dist/files/project/upload-batch.d.ts +3 -3
  175. package/dist/files/project/upload-batch.js +7 -6
  176. package/dist/files/runtime/sandbox-explorer-source.js +3 -3
  177. package/dist/i18n/en.d.ts +1330 -53
  178. package/dist/i18n/en.js +1422 -145
  179. package/dist/i18n/ui-catalog/remaining-ui-translation-keys.generated.js +16 -7
  180. package/dist/internal/auth/auth-primitives.d.ts +1 -3
  181. package/dist/internal/auth/auth-primitives.js +2 -2
  182. package/dist/internal/billing/session-cost-format.d.ts +1 -0
  183. package/dist/internal/billing/session-cost-format.js +11 -0
  184. package/dist/internal/components/agent-mark.d.ts +12 -1
  185. package/dist/internal/components/agent-mark.js +34 -11
  186. package/dist/internal/components/nav-rail.d.ts +22 -0
  187. package/dist/internal/components/nav-rail.js +16 -0
  188. package/dist/internal/components/repository-disconnected.js +2 -2
  189. package/dist/internal/goals/goal-meta.d.ts +15 -1
  190. package/dist/internal/goals/goal-meta.js +42 -2
  191. package/dist/internal/hooks/projects/use-agent-config.d.ts +11 -7
  192. package/dist/internal/hooks/projects/use-agent-config.js +28 -11
  193. package/dist/internal/hooks/use-slash-focus.d.ts +7 -1
  194. package/dist/internal/hooks/use-slash-focus.js +9 -3
  195. package/dist/internal/layout/project-capability-nav.d.ts +24 -0
  196. package/dist/internal/layout/project-capability-nav.js +86 -0
  197. package/dist/internal/layout/project-page-header.d.ts +1 -1
  198. package/dist/internal/layout/project-page-header.js +1 -1
  199. package/dist/internal/layout/project-settings-nav.d.ts +3 -2
  200. package/dist/internal/layout/project-settings-nav.js +5 -3
  201. package/dist/internal/lib/browser-noise/rules/old-browsers.js +1 -1
  202. package/dist/internal/lib/capability-tab-routes.d.ts +34 -3
  203. package/dist/internal/lib/capability-tab-routes.js +76 -8
  204. package/dist/internal/lib/manifest-health.d.ts +10 -0
  205. package/dist/internal/lib/manifest-health.js +20 -0
  206. package/dist/internal/lib/pixel-mark.d.ts +4 -1
  207. package/dist/internal/lib/pixel-mark.js +33 -6
  208. package/dist/internal/lib/project-actions.d.ts +1 -1
  209. package/dist/internal/lib/project-actions.js +0 -4
  210. package/dist/internal/lib/provider-branding.js +2 -0
  211. package/dist/internal/lib/space-scope.d.ts +29 -0
  212. package/dist/internal/lib/space-scope.js +28 -0
  213. package/dist/internal/lib/use-project-feature-flags.js +3 -3
  214. package/dist/internal/lib/web-notifications.d.ts +74 -8
  215. package/dist/internal/lib/web-notifications.js +243 -117
  216. package/dist/internal/notifications/notification-rows.d.ts +14 -7
  217. package/dist/internal/notifications/notification-rows.js +21 -14
  218. package/dist/internal/notifications/session-toast-cards.d.ts +2 -2
  219. package/dist/internal/reminders/reminder-format.d.ts +6 -2
  220. package/dist/internal/reminders/reminder-format.js +7 -1
  221. package/dist/internal/stores/active-space-store.d.ts +35 -0
  222. package/dist/internal/stores/active-space-store.js +29 -0
  223. package/dist/internal/stores/kortix-computer-store.js +13 -4
  224. package/dist/internal/stores/pinned-agents-store.d.ts +26 -0
  225. package/dist/internal/stores/pinned-agents-store.js +20 -0
  226. package/dist/internal/stores/session-panel-memory-store.js +3 -0
  227. package/dist/internal/stores/turn-attention-store.d.ts +5 -4
  228. package/dist/lib/routes.d.ts +16 -1
  229. package/dist/lib/routes.js +15 -3
  230. package/dist/markdown/doc-editor/doc-embed.d.ts +31 -0
  231. package/dist/markdown/doc-editor/doc-embed.js +168 -0
  232. package/dist/markdown/doc-editor/doc-extensions.d.ts +26 -0
  233. package/dist/markdown/doc-editor/doc-extensions.js +149 -0
  234. package/dist/markdown/doc-editor/doc-menus.d.ts +9 -0
  235. package/dist/markdown/doc-editor/doc-menus.js +56 -0
  236. package/dist/markdown/doc-editor/markdown.d.ts +12 -0
  237. package/dist/markdown/doc-editor/markdown.js +140 -0
  238. package/dist/markdown/genui/components/inline.d.ts +1 -1
  239. package/dist/primitives/badge.d.ts +1 -1
  240. package/dist/primitives/button.d.ts +1 -1
  241. package/dist/primitives/pixel-kortix-mark.d.ts +5 -4
  242. package/dist/primitives/pixel-kortix-mark.js +5 -15
  243. package/dist/primitives/tag.d.ts +1 -1
  244. package/dist/primitives/textarea.js +14 -0
  245. package/dist/primitives/toast.d.ts +2 -0
  246. package/dist/primitives/toast.js +4 -2
  247. package/dist/providers/ui-provider.d.ts +16 -0
  248. package/dist/session/actions/session-label.d.ts +1 -1
  249. package/dist/session/actions/session-label.js +3 -3
  250. package/dist/session/agents/agent-model.d.ts +92 -0
  251. package/dist/session/agents/agent-model.js +123 -0
  252. package/dist/session/agents/agent-state-mark.d.ts +10 -0
  253. package/dist/session/agents/agent-state-mark.js +22 -0
  254. package/dist/session/agents/agent-strip.d.ts +58 -0
  255. package/dist/session/agents/agent-strip.js +259 -0
  256. package/dist/session/agents/held-messages.d.ts +33 -0
  257. package/dist/session/agents/held-messages.js +50 -0
  258. package/dist/session/agents/legacy-subagent-chat.d.ts +11 -0
  259. package/dist/session/agents/legacy-subagent-chat.js +19 -0
  260. package/dist/session/agents/session-peek.d.ts +20 -0
  261. package/dist/session/agents/session-peek.js +67 -0
  262. package/dist/session/agents/session-prompt.d.ts +13 -0
  263. package/dist/session/agents/session-prompt.js +18 -0
  264. package/dist/session/agents/steer-session.d.ts +13 -0
  265. package/dist/session/agents/steer-session.js +29 -0
  266. package/dist/session/agents/subagent-dialog-content.d.ts +11 -0
  267. package/dist/session/agents/subagent-dialog-content.js +115 -0
  268. package/dist/session/agents/subagent-view.d.ts +8 -0
  269. package/dist/session/agents/subagent-view.js +18 -0
  270. package/dist/session/agents/tasks-panel.d.ts +13 -0
  271. package/dist/session/agents/tasks-panel.js +41 -0
  272. package/dist/session/agents/workflow-run-controls.d.ts +43 -0
  273. package/dist/session/agents/workflow-run-controls.js +141 -0
  274. package/dist/session/composer/ComposerCard.d.ts +1 -1
  275. package/dist/session/composer/ComposerCard.js +3 -3
  276. package/dist/session/composer/agent-selector.js +13 -19
  277. package/dist/session/composer/composer-underbar.d.ts +3 -1
  278. package/dist/session/composer/composer-underbar.js +2 -2
  279. package/dist/session/composer/composer.d.ts +5 -0
  280. package/dist/session/composer/composer.js +16 -10
  281. package/dist/session/composer/editor/composer-editor.js +19 -8
  282. package/dist/session/composer/editor/ultracode.d.ts +34 -0
  283. package/dist/session/composer/editor/ultracode.js +127 -0
  284. package/dist/session/composer/send-blockers.d.ts +1 -11
  285. package/dist/session/composer/send-blockers.js +1 -11
  286. package/dist/session/composer/session-composer-readiness.d.ts +1 -28
  287. package/dist/session/composer/session-composer-readiness.js +5 -16
  288. package/dist/session/header/reminder-parts.d.ts +1 -1
  289. package/dist/session/header/session-site-header.js +6 -3
  290. package/dist/session/header/subagent-hover-card.d.ts +0 -2
  291. package/dist/session/header/subagent-hover-card.js +1 -4
  292. package/dist/session/models/claude-connection-slot.d.ts +11 -0
  293. package/dist/session/models/claude-connection-slot.js +30 -0
  294. package/dist/session/models/model-availability.d.ts +3 -1
  295. package/dist/session/models/model-availability.js +3 -0
  296. package/dist/session/models/model-selector.js +11 -12
  297. package/dist/session/models/model-tags.d.ts +9 -0
  298. package/dist/session/models/model-tags.js +8 -0
  299. package/dist/session/panel/easy/easy-panel.js +1 -1
  300. package/dist/session/panel/easy/step-icon.js +5 -1
  301. package/dist/session/panel/mobile-tool-drawer.js +1 -1
  302. package/dist/session/panel/session-action-panel-column.js +1 -1
  303. package/dist/session/panel/session-desktop.js +41 -14
  304. package/dist/session/panel/session-panel-provider.d.ts +1 -1
  305. package/dist/session/panel/session-panel-provider.js +7 -11
  306. package/dist/session/prompts/question-prompt.js +3 -1
  307. package/dist/session/status/session-error-banner.js +4 -1
  308. package/dist/session/thread/session-chat.js +286 -296
  309. package/dist/session/thread/session-context-modal.js +29 -10
  310. package/dist/session/thread/session-context-spawned-sessions.d.ts +13 -0
  311. package/dist/session/thread/session-context-spawned-sessions.js +44 -0
  312. package/dist/session/thread/session-context-sub-sessions.js +3 -8
  313. package/dist/session/thread/transcript.d.ts +3 -0
  314. package/dist/session/thread/transcript.js +32 -8
  315. package/dist/session/tool/shared/full-view-action.d.ts +29 -0
  316. package/dist/session/tool/shared/full-view-action.js +43 -0
  317. package/dist/session/tool/tool-part-renderer.js +10 -2
  318. package/dist/session/tool/tools/agent-message-tool.js +2 -2
  319. package/dist/session/tool/tools/agent-spawn-tool.js +2 -2
  320. package/dist/session/tool/tools/agent-status-tool.js +2 -2
  321. package/dist/session/tool/tools/kortix-action-tool.d.ts +2 -0
  322. package/dist/session/tool/tools/kortix-action-tool.js +148 -0
  323. package/dist/session/tool/tools/kortix-tool-card.d.ts +83 -0
  324. package/dist/session/tool/tools/kortix-tool-card.js +186 -0
  325. package/dist/session/tool/tools/multi-agent-tool-bodies.d.ts +11 -0
  326. package/dist/session/tool/tools/multi-agent-tool-bodies.js +141 -0
  327. package/dist/session/tool/tools/multi-agent-tool-data.d.ts +63 -0
  328. package/dist/session/tool/tools/multi-agent-tool-data.js +118 -0
  329. package/dist/session/tool/tools/multi-agent-tools.d.ts +9 -0
  330. package/dist/session/tool/tools/multi-agent-tools.js +38 -0
  331. package/dist/session/tool/tools/question-tool.js +1 -1
  332. package/dist/session/tool/tools/register.d.ts +3 -0
  333. package/dist/session/tool/tools/register.js +3 -0
  334. package/dist/session/tool/tools/session-spawn-tool.js +2 -2
  335. package/dist/session/tool/tools/task-tool.d.ts +1 -1
  336. package/dist/session/tool/tools/task-tool.js +29 -41
  337. package/dist/session/tool/tools/workflow-progress.d.ts +34 -0
  338. package/dist/session/tool/tools/workflow-progress.js +186 -0
  339. package/dist/session/tool/tools/workflow-run.d.ts +128 -0
  340. package/dist/session/tool/tools/workflow-run.js +251 -0
  341. package/dist/session/tool/tools/workflow-tool.d.ts +9 -0
  342. package/dist/session/tool/tools/workflow-tool.js +253 -0
  343. package/dist/session/turn/notice-batch-group.d.ts +12 -0
  344. package/dist/session/turn/notice-batch-group.js +17 -0
  345. package/dist/session/turn/peer-message-row.d.ts +14 -0
  346. package/dist/session/turn/peer-message-row.js +57 -0
  347. package/dist/session/turn/subagent-notice-row.d.ts +4 -0
  348. package/dist/session/turn/subagent-notice-row.js +50 -0
  349. package/dist/session/turn/subagent-notice.d.ts +58 -0
  350. package/dist/session/turn/subagent-notice.js +111 -0
  351. package/dist/session/turn/user-message.js +24 -5
  352. package/dist/styles/tokens.css +2 -0
  353. package/dist/styles.css +1 -1
  354. package/dist/terminal/session-terminal-connect-bar.js +1 -1
  355. package/dist/workspace/admin/project-admin-dashboard.d.ts +53 -0
  356. package/dist/workspace/admin/project-admin-dashboard.js +252 -0
  357. package/dist/workspace/admin/project-admin-nav.d.ts +20 -0
  358. package/dist/workspace/admin/project-admin-nav.js +41 -0
  359. package/dist/workspace/home/welcome-body.js +25 -3
  360. package/dist/workspace/index.d.ts +6 -2
  361. package/dist/workspace/index.js +12 -2
  362. package/dist/workspace/layout/new-session-create.js +3 -3
  363. package/dist/workspace/layout/project-home.js +3 -3
  364. package/dist/workspace/memory/memory-labels.js +5 -0
  365. package/dist/workspace/repository-disconnected.js +2 -2
  366. package/dist/workspace/sessions/board-dispatch.d.ts +52 -0
  367. package/dist/workspace/sessions/board-dispatch.js +110 -0
  368. package/dist/workspace/sessions/board-grouping.d.ts +63 -0
  369. package/dist/workspace/sessions/board-grouping.js +141 -0
  370. package/dist/workspace/sessions/board-peek.d.ts +15 -0
  371. package/dist/workspace/sessions/board-peek.js +54 -0
  372. package/dist/workspace/sessions/board-state-mark.d.ts +15 -0
  373. package/dist/workspace/sessions/board-state-mark.js +24 -0
  374. package/dist/workspace/sessions/project-sessions-view.js +42 -31
  375. package/dist/workspace/sessions/sessions-board.d.ts +12 -0
  376. package/dist/workspace/sessions/sessions-board.js +214 -0
  377. package/dist/workspace/sidebar/footer/project-manifest-issues-alert.d.ts +46 -0
  378. package/dist/workspace/sidebar/footer/project-manifest-issues-alert.js +85 -0
  379. package/dist/workspace/sidebar/footer/sidebar-alert.js +1 -1
  380. package/dist/workspace/sidebar/new-agent-modal-provider.d.ts +12 -0
  381. package/dist/workspace/sidebar/new-agent-modal-provider.js +19 -0
  382. package/dist/workspace/sidebar/project-nav-items.d.ts +3 -1
  383. package/dist/workspace/sidebar/project-nav-items.js +53 -5
  384. package/dist/workspace/sidebar/project-session-list.js +35 -12
  385. package/dist/workspace/sidebar/project-sidebar.js +6 -3
  386. package/dist/workspace/sidebar/session-filter-menu.js +2 -1
  387. package/dist/workspace/space/space-blocks.d.ts +25 -0
  388. package/dist/workspace/space/space-blocks.js +124 -0
  389. package/dist/workspace/space/space-filter-tabs.d.ts +17 -0
  390. package/dist/workspace/space/space-filter-tabs.js +31 -0
  391. package/dist/workspace/space/space-page.d.ts +24 -0
  392. package/dist/workspace/space/space-page.js +157 -0
  393. package/dist/workspace/space/space-room.d.ts +20 -0
  394. package/dist/workspace/space/space-room.js +27 -0
  395. package/dist/workspace/space/space-tab-menu.d.ts +14 -0
  396. package/dist/workspace/space/space-tab-menu.js +127 -0
  397. package/dist/workspace/space/space-tab-panels.d.ts +9 -0
  398. package/dist/workspace/space/space-tab-panels.js +203 -0
  399. package/dist/workspace/space/space-templates.d.ts +34 -0
  400. package/dist/workspace/space/space-templates.js +71 -0
  401. package/dist/workspace/space/use-space-filter.d.ts +10 -0
  402. package/dist/workspace/space/use-space-filter.js +40 -0
  403. package/dist/workspace/space/use-space-manifest.d.ts +8 -0
  404. package/dist/workspace/space/use-space-manifest.js +27 -0
  405. package/dist/workspace/spaces/space-timeline.js +2 -2
  406. package/package.json +56 -53
  407. package/skills/kortix-ui/SKILL.md +1 -1
  408. package/skills/kortix-ui/references/custom-dashboard.md +10 -4
  409. package/skills/kortix-ui/references/modules.md +10 -8
  410. package/dist/_vendor/shared/meta-agent.d.ts +0 -7
  411. package/dist/customize/agents/agent-grant-pages.d.ts +0 -37
  412. package/dist/customize/agents/agent-grant-pages.js +0 -226
  413. package/dist/customize/agents/agent-triggers-section.d.ts +0 -17
  414. package/dist/customize/agents/agent-triggers-section.js +0 -109
  415. package/dist/customize/migrate-to-v2/index.d.ts +0 -5
  416. package/dist/customize/migrate-to-v2/index.js +0 -5
  417. package/dist/customize/migrate-to-v2/migration-prompt.d.ts +0 -16
  418. package/dist/customize/migrate-to-v2/migration-prompt.js +0 -59
  419. package/dist/customize/migrate-to-v2/upgrade-defs.d.ts +0 -30
  420. package/dist/customize/migrate-to-v2/upgrade-defs.js +0 -43
  421. package/dist/customize/migrate-to-v2/upgrade-view.d.ts +0 -32
  422. package/dist/customize/migrate-to-v2/upgrade-view.js +0 -152
  423. package/dist/customize/migrate-to-v2/use-run-upgrade.d.ts +0 -18
  424. package/dist/customize/migrate-to-v2/use-run-upgrade.js +0 -16
  425. package/dist/customize/shared/capability-tabs.d.ts +0 -3
  426. package/dist/customize/shared/capability-tabs.js +0 -137
  427. package/dist/customize/skills/skill-scope.d.ts +0 -14
  428. package/dist/customize/skills/skill-scope.js +0 -18
  429. package/dist/internal/lib/manifest-version.d.ts +0 -21
  430. package/dist/internal/lib/manifest-version.js +0 -55
  431. package/dist/session/composer/hooks/use-composer-escape-stop.d.ts +0 -6
  432. package/dist/session/composer/hooks/use-composer-escape-stop.js +0 -28
  433. package/dist/session/thread/sub-session-modal-content.d.ts +0 -8
  434. package/dist/session/thread/sub-session-modal-content.js +0 -23
  435. package/dist/session/thread/sub-session-modal.d.ts +0 -2
  436. package/dist/session/thread/sub-session-modal.js +0 -14
  437. package/dist/workspace/sidebar/footer/project-manifest-upgrade-alert.d.ts +0 -13
  438. package/dist/workspace/sidebar/footer/project-manifest-upgrade-alert.js +0 -48
@@ -0,0 +1,110 @@
1
+ /** Claude Code rejects a dispatch under 4 characters with "Too short". */
2
+ export const DISPATCH_MIN_CHARS = 4;
3
+ const STATE_WORDS = {
4
+ working: ['working'],
5
+ needs_input: ['needs_input'],
6
+ input: ['needs_input'],
7
+ blocked: ['needs_input'],
8
+ idle: ['idle'],
9
+ completed: ['completed'],
10
+ done: ['completed'],
11
+ failed: ['failed'],
12
+ stopped: ['stopped'],
13
+ ended: ['failed', 'stopped'],
14
+ };
15
+ /** Split the leading `s:` / `a:` filter tokens off the input. An unknown state word is prompt text. */
16
+ export function parseBoardInput(input) {
17
+ const states = [];
18
+ const agents = [];
19
+ const words = input.trimStart().split(/(\s+)/);
20
+ let index = 0;
21
+ for (; index < words.length; index += 2) {
22
+ const word = words[index] ?? '';
23
+ const state = /^s:(\S+)$/i.exec(word)?.[1]?.toLowerCase();
24
+ const agent = /^a:(\S+)$/i.exec(word)?.[1];
25
+ if (state && STATE_WORDS[state]) {
26
+ for (const value of STATE_WORDS[state])
27
+ if (!states.includes(value))
28
+ states.push(value);
29
+ }
30
+ else if (agent) {
31
+ if (!agents.includes(agent))
32
+ agents.push(agent);
33
+ }
34
+ else
35
+ break;
36
+ }
37
+ return { states, agents, rest: words.slice(index).join('').trim() };
38
+ }
39
+ /**
40
+ * What Enter does with the prompt part of the input. `agents` is the project's
41
+ * agent names; a match is case-insensitive and returns the agent's own spelling.
42
+ */
43
+ export function parseDispatch(text, agents) {
44
+ const trimmed = text.trim();
45
+ if (!trimmed)
46
+ return { kind: 'empty' };
47
+ if (trimmed.length < DISPATCH_MIN_CHARS)
48
+ return { kind: 'too_short' };
49
+ const [first = '', ...more] = trimmed.split(/\s+/);
50
+ const named = first.startsWith('@') ? first.slice(1) : first;
51
+ const agent = agents.find((name) => name.toLowerCase() === named.toLowerCase());
52
+ const rest = trimmed.slice(first.length).trim();
53
+ if (agent && more.length > 0) {
54
+ // The prompt the agent gets must stand on its own: "@reviewer hi" is still too short.
55
+ if (rest.length < DISPATCH_MIN_CHARS)
56
+ return { kind: 'too_short' };
57
+ return { kind: 'dispatch', prompt: rest, agent };
58
+ }
59
+ return { kind: 'dispatch', prompt: trimmed };
60
+ }
61
+ /**
62
+ * The board's keys when the list has focus: ↑/↓ move, Space opens or closes the
63
+ * peek, Enter opens the session, x stops it, Escape closes the peek. A key typed
64
+ * into a field, or with a modifier, belongs to the field or the browser.
65
+ */
66
+ export function boardKeyAction(event, target) {
67
+ if (event.altKey || event.ctrlKey || event.metaKey)
68
+ return null;
69
+ const tag = target?.tagName ?? '';
70
+ if (target?.isContentEditable || tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT')
71
+ return null;
72
+ // A focused button or link inside a row answers Enter and Space itself.
73
+ if ((tag === 'BUTTON' || tag === 'A') && (event.key === 'Enter' || event.key === ' '))
74
+ return null;
75
+ switch (event.key) {
76
+ case 'ArrowUp':
77
+ return 'up';
78
+ case 'ArrowDown':
79
+ return 'down';
80
+ case ' ':
81
+ return 'peek';
82
+ case 'Enter':
83
+ return 'open';
84
+ case 'x':
85
+ return event.shiftKey ? null : 'stop';
86
+ case 'Escape':
87
+ return 'close';
88
+ default:
89
+ return null;
90
+ }
91
+ }
92
+ /** The row the selection moves to; it stays inside the list. */
93
+ export function moveBoardSelection(order, current, step) {
94
+ if (order.length === 0)
95
+ return null;
96
+ const index = current ? order.indexOf(current) : -1;
97
+ if (index === -1)
98
+ return step === 1 ? order[0] : order[order.length - 1];
99
+ return order[Math.min(order.length - 1, Math.max(0, index + step))];
100
+ }
101
+ export const sessionsLayoutOf = (view) => (view === 'board' ? 'board' : 'list');
102
+ /** The query string after the List/Board toggle: `view=board`, or no `view` for the list. */
103
+ export function withSessionsLayout(search, layout) {
104
+ const params = new URLSearchParams(search);
105
+ if (layout === 'board')
106
+ params.set('view', 'board');
107
+ else if (params.get('view') === 'board')
108
+ params.delete('view');
109
+ return params.toString();
110
+ }
@@ -0,0 +1,63 @@
1
+ import type { ProjectSession, SessionBoardState } from '@kortix/sdk';
2
+ /** The board's groups, top to bottom. */
3
+ export declare const BOARD_GROUPS: readonly ["pinned", "needs_input", "working", "review", "completed", "ended"];
4
+ export type BoardGroupId = (typeof BOARD_GROUPS)[number];
5
+ /** Rows a folding group shows before "… N more". */
6
+ export declare const BOARD_FOLD_LIMIT = 5;
7
+ /**
8
+ * A session's board state: the API's `board_state`, else derived from the row
9
+ * an older API serves. `needs_input` wins when the session waits on its person
10
+ * (`attention`) or the review inbox holds an item for it.
11
+ */
12
+ export declare function boardStateOf(session: ProjectSession, needsYouCount?: number): SessionBoardState;
13
+ /**
14
+ * The group a session sits in.
15
+ *
16
+ * "Ready for review": Claude Code puts a session there when it opened a pull
17
+ * request. A Kortix session row carries no change request, so the rule here is
18
+ * the closest fact the row has: the session is idle (its turn ended, it waits
19
+ * for the next prompt) and it left an answer (`result_excerpt`). That is a
20
+ * result for the person to read. An idle session with no answer is finished
21
+ * work with nothing to read: Completed.
22
+ */
23
+ export declare function boardGroupOf(session: ProjectSession, needsYouCount?: number): BoardGroupId;
24
+ /** When the session last did something, for the row's age and the sort. */
25
+ export declare function boardActivityAt(session: ProjectSession): string;
26
+ export interface BoardFilters {
27
+ /** Board states to keep; empty keeps every state. */
28
+ states?: readonly SessionBoardState[];
29
+ /** Agent names or handles to keep; empty keeps every agent. */
30
+ agents?: readonly string[];
31
+ /** Case-insensitive text the title or result must contain. */
32
+ text?: string;
33
+ }
34
+ /** The agent a row names: the handle an agent gave it, else the agent it runs. */
35
+ export declare function boardAgentOf(session: ProjectSession): string | null;
36
+ /** The agent a row shows: the handle an agent gave it, else the agent it runs as a person reads it ("My Kortix"). */
37
+ export declare function boardAgentLabel(session: ProjectSession): string | null;
38
+ export declare function matchesBoardFilters(session: ProjectSession, filters: BoardFilters, title: string, needsYouCount?: number): boolean;
39
+ export interface BoardGroup {
40
+ id: BoardGroupId;
41
+ /** The rows shown. */
42
+ sessions: ProjectSession[];
43
+ /** Rows past the fold ("… N more"); 0 when the group shows every row. */
44
+ hidden: number;
45
+ total: number;
46
+ }
47
+ export interface GroupBoardOptions {
48
+ needsYouBySession?: Record<string, number>;
49
+ /** Groups the person unfolded with "… N more". */
50
+ expanded?: ReadonlySet<BoardGroupId>;
51
+ /** A filter is active: every group shows every match, as Claude's filters expand collapsed groups. */
52
+ filtering?: boolean;
53
+ foldLimit?: number;
54
+ }
55
+ /**
56
+ * The sessions in board order: groups in `BOARD_GROUPS` order, newest activity
57
+ * first inside a group, empty groups dropped, a long finished group folded.
58
+ */
59
+ export declare function groupBoard(sessions: readonly ProjectSession[], options?: GroupBoardOptions): BoardGroup[];
60
+ /** The rows the keyboard walks, top to bottom: every shown row of every group. */
61
+ export declare function boardRowOrder(groups: readonly BoardGroup[]): string[];
62
+ /** The row's age as Claude Code prints it: `now`, `3m`, `2h`, `4d`. */
63
+ export declare function compactAge(fromIso: string, nowMs: number): string;
@@ -0,0 +1,141 @@
1
+ /**
2
+ * The agent board (`/projects/<id>/sessions?view=board`): every session of the
3
+ * project grouped by what it needs from the person, as Claude Code's agent view
4
+ * groups background sessions. Pure functions; the board component renders them.
5
+ */
6
+ import { agentDisplayName } from '../../internal/components/agent-mark.js';
7
+ /** The board's groups, top to bottom. */
8
+ export const BOARD_GROUPS = ['pinned', 'needs_input', 'working', 'review', 'completed', 'ended'];
9
+ /** Rows a folding group shows before "… N more". */
10
+ export const BOARD_FOLD_LIMIT = 5;
11
+ /** Groups that fold: they collect finished sessions and grow without bound. */
12
+ const FOLDING_GROUPS = new Set(['completed', 'ended']);
13
+ /**
14
+ * A session's board state: the API's `board_state`, else derived from the row
15
+ * an older API serves. `needs_input` wins when the session waits on its person
16
+ * (`attention`) or the review inbox holds an item for it.
17
+ */
18
+ export function boardStateOf(session, needsYouCount = 0) {
19
+ if (session.attention || needsYouCount > 0)
20
+ return 'needs_input';
21
+ if (session.board_state)
22
+ return session.board_state;
23
+ switch (session.status) {
24
+ case 'completed':
25
+ return 'completed';
26
+ case 'failed':
27
+ return 'failed';
28
+ case 'stopped':
29
+ return 'stopped';
30
+ case 'running':
31
+ return session.working?.state === 'idle' ? 'idle' : 'working';
32
+ default:
33
+ // queued, branching, provisioning: the session is starting, which is work in progress.
34
+ return 'working';
35
+ }
36
+ }
37
+ /**
38
+ * The group a session sits in.
39
+ *
40
+ * "Ready for review": Claude Code puts a session there when it opened a pull
41
+ * request. A Kortix session row carries no change request, so the rule here is
42
+ * the closest fact the row has: the session is idle (its turn ended, it waits
43
+ * for the next prompt) and it left an answer (`result_excerpt`). That is a
44
+ * result for the person to read. An idle session with no answer is finished
45
+ * work with nothing to read: Completed.
46
+ */
47
+ export function boardGroupOf(session, needsYouCount = 0) {
48
+ if (session.pinned_at)
49
+ return 'pinned';
50
+ const state = boardStateOf(session, needsYouCount);
51
+ switch (state) {
52
+ case 'needs_input':
53
+ return 'needs_input';
54
+ case 'working':
55
+ return 'working';
56
+ case 'idle':
57
+ return session.result_excerpt?.trim() ? 'review' : 'completed';
58
+ case 'completed':
59
+ return 'completed';
60
+ case 'failed':
61
+ case 'stopped':
62
+ return 'ended';
63
+ }
64
+ }
65
+ /** When the session last did something, for the row's age and the sort. */
66
+ export function boardActivityAt(session) {
67
+ return session.last_activity_at || session.updated_at || session.created_at;
68
+ }
69
+ /** The agent a row names: the handle an agent gave it, else the agent it runs. */
70
+ export function boardAgentOf(session) {
71
+ return session.agent_handle || session.agent_name || null;
72
+ }
73
+ /** The agent a row shows: the handle an agent gave it, else the agent it runs as a person reads it ("My Kortix"). */
74
+ export function boardAgentLabel(session) {
75
+ if (session.agent_handle)
76
+ return session.agent_handle;
77
+ return session.agent_name ? agentDisplayName(session.agent_name) : null;
78
+ }
79
+ export function matchesBoardFilters(session, filters, title, needsYouCount = 0) {
80
+ if (filters.states?.length && !filters.states.includes(boardStateOf(session, needsYouCount)))
81
+ return false;
82
+ if (filters.agents?.length) {
83
+ const names = [session.agent_handle, session.agent_name].filter((name) => !!name);
84
+ if (!filters.agents.some((agent) => names.some((name) => name.toLowerCase() === agent.toLowerCase())))
85
+ return false;
86
+ }
87
+ const text = filters.text?.trim().toLowerCase();
88
+ if (text && !`${title}\n${session.result_excerpt ?? ''}`.toLowerCase().includes(text))
89
+ return false;
90
+ return true;
91
+ }
92
+ /**
93
+ * The sessions in board order: groups in `BOARD_GROUPS` order, newest activity
94
+ * first inside a group, empty groups dropped, a long finished group folded.
95
+ */
96
+ export function groupBoard(sessions, options = {}) {
97
+ const limit = options.foldLimit ?? BOARD_FOLD_LIMIT;
98
+ const byGroup = new Map();
99
+ for (const session of sessions) {
100
+ const group = boardGroupOf(session, options.needsYouBySession?.[session.session_id] ?? 0);
101
+ const list = byGroup.get(group);
102
+ if (list)
103
+ list.push(session);
104
+ else
105
+ byGroup.set(group, [session]);
106
+ }
107
+ const groups = [];
108
+ for (const id of BOARD_GROUPS) {
109
+ const list = byGroup.get(id);
110
+ if (!list?.length)
111
+ continue;
112
+ list.sort((a, b) => Date.parse(boardActivityAt(b)) - Date.parse(boardActivityAt(a)));
113
+ const fold = FOLDING_GROUPS.has(id) && !options.filtering && !options.expanded?.has(id) && list.length > limit + 1;
114
+ groups.push({
115
+ id,
116
+ sessions: fold ? list.slice(0, limit) : list,
117
+ hidden: fold ? list.length - limit : 0,
118
+ total: list.length,
119
+ });
120
+ }
121
+ return groups;
122
+ }
123
+ /** The rows the keyboard walks, top to bottom: every shown row of every group. */
124
+ export function boardRowOrder(groups) {
125
+ return groups.flatMap((group) => group.sessions.map((session) => session.session_id));
126
+ }
127
+ /** The row's age as Claude Code prints it: `now`, `3m`, `2h`, `4d`. */
128
+ export function compactAge(fromIso, nowMs) {
129
+ const then = Date.parse(fromIso);
130
+ if (!Number.isFinite(then))
131
+ return '';
132
+ const minutes = Math.floor(Math.max(0, nowMs - then) / 60_000);
133
+ if (minutes < 1)
134
+ return 'now';
135
+ if (minutes < 60)
136
+ return `${minutes}m`;
137
+ const hours = Math.floor(minutes / 60);
138
+ if (hours < 24)
139
+ return `${hours}h`;
140
+ return `${Math.floor(hours / 24)}d`;
141
+ }
@@ -0,0 +1,15 @@
1
+ import type { ProjectSession } from '@kortix/sdk';
2
+ /**
3
+ * The board's peek (Claude Code's `Space`): a side sheet with the session's
4
+ * transcript, live, read from the API (`SessionPeek`): a preview wakes no
5
+ * computer and never moves the app's runtime. One reply input steers the
6
+ * running turn. ↑/↓ outside the input move the peek to the next row.
7
+ */
8
+ export declare function BoardPeek({ projectId, session, title, needsYouCount, onClose, onMove, }: {
9
+ projectId: string;
10
+ session: ProjectSession | null;
11
+ title: string;
12
+ needsYouCount: number;
13
+ onClose: () => void;
14
+ onMove: (step: 1 | -1) => void;
15
+ }): import("react").JSX.Element;
@@ -0,0 +1,54 @@
1
+ 'use client';
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { ArrowSquareOutIcon, PaperPlaneRightIcon } from '@phosphor-icons/react';
4
+ import { useState } from 'react';
5
+ import { useTranslations } from '../../i18n/index.js';
6
+ import { uiRoutes } from '../../lib/routes.js';
7
+ import { Button } from '../../primitives/button.js';
8
+ import { Input } from '../../primitives/input.js';
9
+ import Loading from '../../primitives/loading.js';
10
+ import { Sheet, SheetContent, SheetDescription, SheetTitle } from '../../primitives/sheet.js';
11
+ import { errorToast, successToast } from '../../primitives/toast.js';
12
+ import { UiLink } from '../../providers/ui-provider.js';
13
+ import { SessionPeek } from '../../session/agents/session-peek.js';
14
+ import { useSteerSession } from '../../session/agents/steer-session.js';
15
+ import { boardAgentLabel, boardStateOf } from './board-grouping.js';
16
+ import { BoardStateMark } from './board-state-mark.js';
17
+ /**
18
+ * The board's peek (Claude Code's `Space`): a side sheet with the session's
19
+ * transcript, live, read from the API (`SessionPeek`): a preview wakes no
20
+ * computer and never moves the app's runtime. One reply input steers the
21
+ * running turn. ↑/↓ outside the input move the peek to the next row.
22
+ */
23
+ export function BoardPeek({ projectId, session, title, needsYouCount, onClose, onMove, }) {
24
+ const t = useTranslations('multiAgent.board');
25
+ const [reply, setReply] = useState('');
26
+ const send = useSteerSession(projectId, {
27
+ onSent: () => {
28
+ setReply('');
29
+ successToast(t('replySent'));
30
+ },
31
+ onError: (error) => errorToast(t('replyFailed'), { description: error instanceof Error ? error.message : undefined }),
32
+ });
33
+ const submit = () => {
34
+ const text = reply.trim();
35
+ if (!session || !text || send.isPending)
36
+ return;
37
+ send.mutate({ sessionId: session.session_id, text });
38
+ };
39
+ const onKeyDown = (event) => {
40
+ const target = event.target;
41
+ if (target.tagName === 'INPUT' || target.isContentEditable)
42
+ return;
43
+ if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {
44
+ event.preventDefault();
45
+ onMove(event.key === 'ArrowDown' ? 1 : -1);
46
+ }
47
+ };
48
+ const state = session ? boardStateOf(session, needsYouCount) : null;
49
+ const agent = session ? boardAgentLabel(session) : null;
50
+ return (_jsx(Sheet, { open: !!session, onOpenChange: (open) => !open && onClose(), children: _jsx(SheetContent, { side: "right", className: "w-full gap-0 p-0 sm:max-w-xl", overlayClassName: "bg-transparent", onKeyDown: onKeyDown, "aria-describedby": undefined, children: session && state ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "border-border flex shrink-0 items-start gap-3 border-b px-4 py-3 pr-14", children: [_jsxs("div", { className: "min-w-0 flex-1 space-y-1", children: [_jsx(SheetTitle, { className: "text-foreground truncate text-sm font-medium", children: title }), _jsx(SheetDescription, { asChild: true, children: _jsxs("div", { className: "text-muted-foreground flex min-w-0 items-center gap-1.5 text-xs", children: [_jsx(BoardStateMark, { state: state }), agent ? (_jsxs(_Fragment, { children: [_jsx("span", { "aria-hidden": true, children: "\u00B7" }), _jsx("span", { className: "truncate", children: agent })] })) : null] }) })] }), _jsx(Button, { asChild: true, variant: "outline", size: "sm", className: "shrink-0 gap-1.5", children: _jsxs(UiLink, { href: uiRoutes().session(projectId, session.session_id), children: [_jsx(ArrowSquareOutIcon, { className: "size-3.5 shrink-0" }), t('openSession')] }) })] }), _jsx("div", { className: "flex min-h-0 flex-1 flex-col", children: _jsx(SessionPeek, { projectId: projectId, sessionId: session.session_id, working: state === 'working', density: "compact" }, session.session_id) }), _jsxs("form", { className: "border-border flex shrink-0 items-center gap-2 border-t px-4 py-3", onSubmit: (event) => {
51
+ event.preventDefault();
52
+ submit();
53
+ }, children: [_jsx(Input, { value: reply, onChange: (event) => setReply(event.target.value), placeholder: t('replyPlaceholder'), "aria-label": t('replyLabel', { title }), disabled: send.isPending, className: "min-w-0 flex-1" }), _jsxs(Button, { type: "submit", size: "sm", className: "shrink-0 gap-1.5", disabled: !reply.trim() || send.isPending, children: [send.isPending ? (_jsx(Loading, { className: "size-3.5 shrink-0" })) : (_jsx(PaperPlaneRightIcon, { className: "size-3.5 shrink-0" })), t('sendReply')] })] })] })) : null }) }));
54
+ }
@@ -0,0 +1,15 @@
1
+ import type { SessionBoardState } from '@kortix/sdk';
2
+ import { type StatusTone } from '../../primitives/status.js';
3
+ /**
4
+ * One hue per state (color.md, D5): working is live (green), needs input asks
5
+ * for attention (orange), completed succeeded (green), failed broke (red);
6
+ * idle and stopped carry no hue. The word beside the dot says the state, so
7
+ * the color is never the only carrier.
8
+ */
9
+ export declare const BOARD_STATE_TONE: Record<SessionBoardState, StatusTone>;
10
+ /** The state dot and its word. A working dot pulses: it is the one state that changes while you watch. */
11
+ export declare function BoardStateMark({ state, showLabel, className, }: {
12
+ state: SessionBoardState;
13
+ showLabel?: boolean;
14
+ className?: string;
15
+ }): import("react").JSX.Element;
@@ -0,0 +1,24 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useTranslations } from '../../i18n/index.js';
4
+ import { cn } from '../../lib/utils.js';
5
+ import { StatusDot } from '../../primitives/status.js';
6
+ /**
7
+ * One hue per state (color.md, D5): working is live (green), needs input asks
8
+ * for attention (orange), completed succeeded (green), failed broke (red);
9
+ * idle and stopped carry no hue. The word beside the dot says the state, so
10
+ * the color is never the only carrier.
11
+ */
12
+ export const BOARD_STATE_TONE = {
13
+ working: 'success',
14
+ needs_input: 'warning',
15
+ idle: 'neutral',
16
+ completed: 'success',
17
+ failed: 'destructive',
18
+ stopped: 'neutral',
19
+ };
20
+ /** The state dot and its word. A working dot pulses: it is the one state that changes while you watch. */
21
+ export function BoardStateMark({ state, showLabel = true, className, }) {
22
+ const t = useTranslations('multiAgent.board.state');
23
+ return (_jsxs("span", { className: cn('inline-flex shrink-0 items-center gap-1.5', className), "data-board-state": state, children: [_jsx(StatusDot, { tone: BOARD_STATE_TONE[state], pulse: state === 'working', className: "motion-reduce:animate-none" }), _jsx("span", { className: cn(showLabel ? 'text-muted-foreground text-xs' : 'sr-only'), children: t(state) })] }));
24
+ }
@@ -7,7 +7,7 @@ import { Button } from '../../primitives/button.js';
7
7
  import { Disclosure, DisclosureContent, DisclosureTrigger } from '../../primitives/disclosure.js';
8
8
  import { FadedScrollArea } from '../../primitives/faded-scroll-area.js';
9
9
  import { Skeleton } from '../../primitives/skeleton.js';
10
- import { Tabs, TabsListCompact, TabsTriggerCompact } from '../../primitives/tabs.js';
10
+ import { Tabs, TabsList, TabsListCompact, TabsTrigger, TabsTriggerCompact } from '../../primitives/tabs.js';
11
11
  import { errorToast, successToast, warningToast } from '../../primitives/toast.js';
12
12
  import { EmptyState } from '../../primitives/empty-state.js';
13
13
  import { ErrorState } from '../../primitives/error-state.js';
@@ -27,7 +27,7 @@ import { selectExpandedIds, useSessionExpandedStore, } from '../../internal/stor
27
27
  import { selectCollapsedSections, selectGroupMode, selectHiddenSections, selectOrderMode, selectSourceFilters, selectLabelFilters, selectAccessFilters, selectOwnerFilters, selectStatusFilters, useSessionFilterStore, } from '../../internal/stores/session-filter-store.js';
28
28
  import { deleteProjectSession, restartProjectSession, setSessionArchived, stopProjectSession, } from '@kortix/sdk';
29
29
  import { qk, removeCachedProjectSession, useFeatureFlag, useProjectSessions, useSessionChildren, } from '@kortix/sdk/react';
30
- import { CaretRightIcon, MagnifyingGlassIcon } from '@phosphor-icons/react';
30
+ import { CaretRightIcon, KanbanIcon, ListIcon, MagnifyingGlassIcon } from '@phosphor-icons/react';
31
31
  import { useMutation, useQueryClient } from '@tanstack/react-query';
32
32
  import { format, formatDistanceToNowStrict } from 'date-fns';
33
33
  import { useUiPathname, useUiRouter, useUiSearchParams } from '../../providers/ui-provider.js';
@@ -41,6 +41,8 @@ import { SessionRow } from './session-row.js';
41
41
  import { SessionsEmptyState } from './sessions-empty-state.js';
42
42
  import { SessionsSelectionBar } from './sessions-selection-bar.js';
43
43
  import { SessionsToolbar } from './sessions-toolbar.js';
44
+ import { sessionsLayoutOf, withSessionsLayout } from './board-dispatch.js';
45
+ import { SessionsBoard } from './sessions-board.js';
44
46
  /**
45
47
  * This page's view state is its OWN — narrowing the manager inventory here must not
46
48
  * narrow the sidebar you navigate with. It still OPENS matching the sidebar:
@@ -136,6 +138,7 @@ export function ProjectSessionsView({ projectId }) {
136
138
  const tPinArchive = useTranslations('sidebar.pinArchive');
137
139
  const tDeleted = useTranslations('sidebar.recentlyDeleted');
138
140
  const tSessionDelete = useTranslations('sessionDelete');
141
+ const tBoard = useTranslations('multiAgent.board');
139
142
  const queryClient = useQueryClient();
140
143
  const router = useUiRouter();
141
144
  const pathname = useUiPathname();
@@ -157,6 +160,14 @@ export function ProjectSessionsView({ projectId }) {
157
160
  if (tab)
158
161
  setStartedBy(tab);
159
162
  }
163
+ // `?view=board` is the agent board (Claude Code's agent view); the toggle writes it.
164
+ const layout = sessionsLayoutOf(viewParam);
165
+ const selectLayout = (next) => {
166
+ if (next === layout)
167
+ return;
168
+ const query = withSessionsLayout(searchParams?.toString() ?? '', next);
169
+ router.replace(query ? `${pathname}?${query}` : pathname, { scroll: false });
170
+ };
160
171
  // A tab writes `?view=`: a reload keeps it, and the sidebar link opens the
161
172
  // view again after the viewer picked another tab.
162
173
  const selectTab = (tab) => {
@@ -535,35 +546,35 @@ export function ProjectSessionsView({ projectId }) {
535
546
  } })) : null }), childrenOpen ? (_jsx(SessionChildrenRows, { projectId: projectId, parentId: session.session_id, q: searching && session.search_match === 'child' ? searchQuery : undefined, renderRow: (child) => renderRow(child) })) : null] }, session.session_id));
536
547
  };
537
548
  const header = selectMode ? (_jsx(SessionsSelectionBar, { selectedCount: selectedCount, selectableCount: selectableSessions.length, allSelected: allSelected, onSelectAll: () => setSelected(new Set(selectableSessions.map((session) => session.session_id))), onClearSelection: () => setSelected(new Set()), onExit: exitSelectMode, onDelete: () => setBulkConfirmOpen(true), deleting: bulkDeleteMutation.isPending, onArchive: () => bulkArchiveMutation.mutate({ sessionIds: [...visibleSelection], archived: !archivedTab }), archiveLabel: tPinArchive(archivedTab ? 'bulkUnarchive' : 'bulkArchive'), archiving: bulkArchiveMutation.isPending })) : (_jsx(SessionsToolbar, { projectId: projectId, sessions: sessions, reviewCountBySession: needsYouBySession, search: search, onSearchChange: setSearch, searchOpen: searchOpen, onSearchOpenChange: setSearchOpen, onEnterSelectMode: () => setSelectMode(true), creatingSession: creatingSession, canSelect: sessions.length > 0 && !deletedTab, showNewSession: !channelsOn }));
538
- return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "relative flex h-full min-h-0 flex-col overflow-hidden", children: [_jsx(SidebarToggle, { placement: "floating" }), _jsxs("header", { className: cn('mx-auto w-full max-w-4xl shrink-0 px-4 pt-10 pb-5 lg:pt-20', 'flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between'), children: [_jsx("div", { className: "space-y-1", children: _jsx("h2", { className: "text-foreground text-xl font-medium", children: tI18nComplete.raw('text6fa3cbf451b2') }) }), _jsx("div", { className: "mt-2 shrink-0 sm:mt-0", children: header })] }), _jsxs("div", { className: cn('mx-auto flex min-h-0 w-full max-w-4xl flex-1 flex-col px-4 pb-4'), children: [_jsx(Tabs, { value: startedBy, onValueChange: (value) => selectTab(value), className: "shrink-0", children: _jsxs(TabsListCompact, { "aria-label": tSidebar('startedBy.label'), children: [STARTED_BY_FILTERS.map((value) => (_jsx(TabsTriggerCompact, { value: value, children: tSidebar(`startedBy.${value}`) }, value))), _jsx(TabsTriggerCompact, { value: "archived", children: tPinArchive('view') }), _jsx(TabsTriggerCompact, { value: "deleted", children: tDeleted('view') })] }) }), listState === 'loading' ? (_jsx(SessionListSkeleton, {})) : listState === 'error' ? (_jsx(ErrorState, { size: "sm", title: tI18nComplete.raw('textb6d85433a7ee'), description: sessionsQuery.error instanceof Error ? sessionsQuery.error.message : undefined, action: _jsx(Button, { variant: "outline", size: "sm", onClick: () => sessionsQuery.refetch(), children: tI18nComplete.raw('text942087cc2d41') }) })) : listState === 'more' ? (
539
- // No row the viewer can see on the pages read so far, and more
540
- // pages exist (KRTX-1727): offer them, never "No sessions yet".
541
- _jsx("div", { className: "pt-6", children: loadMoreButton })) : listState === 'empty' && !searching && archivedTab ? (_jsx(EmptyState, { size: "sm", title: tPinArchive('empty') })) : listState === 'empty' && !searching && deletedTab ? (_jsx(EmptyState, { size: "sm", title: tDeleted('empty', { days: RESTORE_DAYS }) })) : deletedTab && listState !== 'empty' ? (
542
- // Flat, newest first as the server pages it. No grouping or client
543
- // facets: these are the rows the restore route would still take.
544
- _jsx("div", { className: "relative min-h-0 flex-1", children: _jsx("div", { className: "absolute inset-0", children: _jsx(FadedScrollArea, { fadeColor: "from-background", className: "pt-4", children: _jsxs("div", { className: "space-y-2 pb-6", "aria-live": "polite", "data-recently-deleted": true, children: [sessions.map((session) => (_jsx(DeletedSessionRow, { session: session, restoring: restoreMutation.isPending &&
545
- restoreMutation.variables?.session_id === session.session_id, onRestore: restoreSession }, session.session_id))), sessionsQuery.hasNextPage && loadMoreButton] }) }) }) })) : listState === 'empty' && !searching && startedBy === 'all' ? (_jsx(SessionsEmptyState, { className: "flex-1 pb-24" })) : grouped.sections.length === 0 || listState === 'empty' ? (
546
- // Covers BOTH "the filters/search match nothing" and "every section
547
- // was hidden via the menu's Show list" — `visibleSessions.length`
548
- // alone cannot see the second, and the list would otherwise render
549
- // an empty scroll area with no explanation.
550
- _jsx(EmptyState, { size: "sm", icon: MagnifyingGlassIcon, title: tI18nComplete.raw('text2732406e3be5'), description: visibleSessions.length > 0
551
- ? tI18nComplete.raw('text67f2187d81d7')
552
- : tI18nComplete.raw('text2749b54ef956'), action: _jsx(Button, { variant: "outline", size: "sm", onClick: () => {
553
- resetFilters(projectId, SURFACE);
554
- setSearch('');
555
- selectTab('all');
556
- }, children: tI18nComplete.raw('text7179ea0035fc') }) })) : (
557
- /* The list gets a containing block whose height cannot depend on
558
- its children. `FadedScrollArea` sizes its outer element with
559
- `h-full`, and `height: 100%` only resolves against a definite
560
- height — inside a flex chain still being measured from content it
561
- resolves to `auto`, so the component grows to fit every row and
562
- the whole app shell scrolls instead of the list. An
563
- `absolute inset-0` layer is out of flow, so this parent
564
- contributes no content height and takes only what flexbox gives
565
- it, which makes the percentage definite. */
566
- _jsx("div", { className: "relative min-h-0 flex-1", children: _jsx("div", { className: "absolute inset-0", children: _jsx(FadedScrollArea, { fadeColor: "from-background", className: "pt-4", children: _jsxs("div", { className: "space-y-4 pb-6", "aria-live": "polite", children: [grouped.sections.map((section) => (_jsx(SessionsSection, { section: section, showHeader: grouped.showHeaders, open: !collapsedSectionSet.has(section.id), onOpenChange: () => toggleSectionCollapsed(projectId, section.id, SURFACE), children: section.sessions.map((session) => renderRow(session, true)) }, section.id))), sessionsQuery.hasNextPage && loadMoreButton] }) }) }) }))] })] }), _jsx(SessionsBulkDeleteDialog, { count: selectedCount, open: bulkConfirmOpen, isPending: bulkDeleteMutation.isPending, onOpenChange: setBulkConfirmOpen, onConfirm: () => bulkDeleteMutation.mutate([...visibleSelection]) }), _jsx(ShareSessionModal, { projectId: projectId, session: sessionToShare, open: !!sessionToShare, onOpenChange: (open) => !open && setSessionToShare(null), onSaved: invalidateSessions }), _jsx(SessionLabelsModal, { projectId: projectId, session: sessionToLabel, open: !!sessionToLabel, onOpenChange: (open) => !open && setSessionToLabel(null) }), _jsx(RenameSessionModal, { projectId: projectId, sessionId: sessionToRename?.id ?? null, currentName: sessionToRename?.name, open: !!sessionToRename, onOpenChange: (open) => !open && setSessionToRename(null) }), _jsx(SessionDeleteModal, { projectId: projectId, sessionId: sessionToDelete?.id ?? null, sessionLabel: sessionToDelete?.label, open: !!sessionToDelete, onOpenChange: (open) => !open && setSessionToDelete(null),
549
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "relative flex h-full min-h-0 flex-col overflow-hidden", children: [_jsx(SidebarToggle, { placement: "floating" }), _jsxs("header", { className: cn('mx-auto w-full max-w-4xl shrink-0 px-4 pt-10 pb-5 lg:pt-20', 'flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between'), children: [_jsx("div", { className: "space-y-1", children: _jsx("h2", { className: "text-foreground text-xl font-medium", children: tI18nComplete.raw('text6fa3cbf451b2') }) }), _jsxs("div", { className: "mt-2 flex shrink-0 items-center gap-2 sm:mt-0", children: [_jsx(Tabs, { value: layout, onValueChange: (value) => selectLayout(value), children: _jsxs(TabsList, { "aria-label": tBoard('layoutLabel'), children: [_jsxs(TabsTrigger, { value: "list", size: "sm", className: "gap-1.5", children: [_jsx(ListIcon, { className: "size-3.5" }), tBoard('layoutList')] }), _jsxs(TabsTrigger, { value: "board", size: "sm", className: "gap-1.5", children: [_jsx(KanbanIcon, { className: "size-3.5" }), tBoard('layoutBoard')] })] }) }), layout === 'list' ? header : null] })] }), _jsx("div", { className: cn('mx-auto flex min-h-0 w-full max-w-4xl flex-1 flex-col px-4 pb-4'), children: layout === 'board' ? (_jsx(SessionsBoard, { projectId: projectId })) : (_jsxs(_Fragment, { children: [_jsx(Tabs, { value: startedBy, onValueChange: (value) => selectTab(value), className: "shrink-0", children: _jsxs(TabsListCompact, { "aria-label": tSidebar('startedBy.label'), children: [STARTED_BY_FILTERS.map((value) => (_jsx(TabsTriggerCompact, { value: value, children: tSidebar(`startedBy.${value}`) }, value))), _jsx(TabsTriggerCompact, { value: "archived", children: tPinArchive('view') }), _jsx(TabsTriggerCompact, { value: "deleted", children: tDeleted('view') })] }) }), listState === 'loading' ? (_jsx(SessionListSkeleton, {})) : listState === 'error' ? (_jsx(ErrorState, { size: "sm", title: tI18nComplete.raw('textb6d85433a7ee'), description: sessionsQuery.error instanceof Error ? sessionsQuery.error.message : undefined, action: _jsx(Button, { variant: "outline", size: "sm", onClick: () => sessionsQuery.refetch(), children: tI18nComplete.raw('text942087cc2d41') }) })) : listState === 'more' ? (
550
+ // No row the viewer can see on the pages read so far, and more
551
+ // pages exist (KRTX-1727): offer them, never "No sessions yet".
552
+ _jsx("div", { className: "pt-6", children: loadMoreButton })) : listState === 'empty' && !searching && archivedTab ? (_jsx(EmptyState, { size: "sm", title: tPinArchive('empty') })) : listState === 'empty' && !searching && deletedTab ? (_jsx(EmptyState, { size: "sm", title: tDeleted('empty', { days: RESTORE_DAYS }) })) : deletedTab && listState !== 'empty' ? (
553
+ // Flat, newest first as the server pages it. No grouping or client
554
+ // facets: these are the rows the restore route would still take.
555
+ _jsx("div", { className: "relative min-h-0 flex-1", children: _jsx("div", { className: "absolute inset-0", children: _jsx(FadedScrollArea, { fadeColor: "from-background", className: "pt-4", children: _jsxs("div", { className: "space-y-2 pb-6", "aria-live": "polite", "data-recently-deleted": true, children: [sessions.map((session) => (_jsx(DeletedSessionRow, { session: session, restoring: restoreMutation.isPending &&
556
+ restoreMutation.variables?.session_id === session.session_id, onRestore: restoreSession }, session.session_id))), sessionsQuery.hasNextPage && loadMoreButton] }) }) }) })) : listState === 'empty' && !searching && startedBy === 'all' ? (_jsx(SessionsEmptyState, { className: "flex-1 pb-24" })) : grouped.sections.length === 0 || listState === 'empty' ? (
557
+ // Covers BOTH "the filters/search match nothing" and "every section
558
+ // was hidden via the menu's Show list" — `visibleSessions.length`
559
+ // alone cannot see the second, and the list would otherwise render
560
+ // an empty scroll area with no explanation.
561
+ _jsx(EmptyState, { size: "sm", icon: MagnifyingGlassIcon, title: tI18nComplete.raw('text2732406e3be5'), description: visibleSessions.length > 0
562
+ ? tI18nComplete.raw('text67f2187d81d7')
563
+ : tI18nComplete.raw('text2749b54ef956'), action: _jsx(Button, { variant: "outline", size: "sm", onClick: () => {
564
+ resetFilters(projectId, SURFACE);
565
+ setSearch('');
566
+ selectTab('all');
567
+ }, children: tI18nComplete.raw('text7179ea0035fc') }) })) : (
568
+ /* The list gets a containing block whose height cannot depend on
569
+ its children. `FadedScrollArea` sizes its outer element with
570
+ `h-full`, and `height: 100%` only resolves against a definite
571
+ height — inside a flex chain still being measured from content it
572
+ resolves to `auto`, so the component grows to fit every row and
573
+ the whole app shell scrolls instead of the list. An
574
+ `absolute inset-0` layer is out of flow, so this parent
575
+ contributes no content height and takes only what flexbox gives
576
+ it, which makes the percentage definite. */
577
+ _jsx("div", { className: "relative min-h-0 flex-1", children: _jsx("div", { className: "absolute inset-0", children: _jsx(FadedScrollArea, { fadeColor: "from-background", className: "pt-4", children: _jsxs("div", { className: "space-y-4 pb-6", "aria-live": "polite", children: [grouped.sections.map((section) => (_jsx(SessionsSection, { section: section, showHeader: grouped.showHeaders, open: !collapsedSectionSet.has(section.id), onOpenChange: () => toggleSectionCollapsed(projectId, section.id, SURFACE), children: section.sessions.map((session) => renderRow(session, true)) }, section.id))), sessionsQuery.hasNextPage && loadMoreButton] }) }) }) }))] })) })] }), _jsx(SessionsBulkDeleteDialog, { count: selectedCount, open: bulkConfirmOpen, isPending: bulkDeleteMutation.isPending, onOpenChange: setBulkConfirmOpen, onConfirm: () => bulkDeleteMutation.mutate([...visibleSelection]) }), _jsx(ShareSessionModal, { projectId: projectId, session: sessionToShare, open: !!sessionToShare, onOpenChange: (open) => !open && setSessionToShare(null), onSaved: invalidateSessions }), _jsx(SessionLabelsModal, { projectId: projectId, session: sessionToLabel, open: !!sessionToLabel, onOpenChange: (open) => !open && setSessionToLabel(null) }), _jsx(RenameSessionModal, { projectId: projectId, sessionId: sessionToRename?.id ?? null, currentName: sessionToRename?.name, open: !!sessionToRename, onOpenChange: (open) => !open && setSessionToRename(null) }), _jsx(SessionDeleteModal, { projectId: projectId, sessionId: sessionToDelete?.id ?? null, sessionLabel: sessionToDelete?.label, open: !!sessionToDelete, onOpenChange: (open) => !open && setSessionToDelete(null),
567
578
  // The modal's own onSuccess already invalidates qk.project.sessionsScope
568
579
  // — the prefix that reaches the 'project'-scoped key this view reads
569
580
  // — so this is a harmless duplicate, kept so the two do not silently
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The agent board (`/projects/<id>/sessions?view=board`), Claude Code's agent
3
+ * view in Kortix's own look: every session of the project, child sessions
4
+ * included, grouped by what it needs (Pinned, Needs input, Working, Ready for
5
+ * review, Completed, Failed · Stopped). One input on top starts a session
6
+ * (`@agent prompt` or a plain prompt) or filters the board (`s:working`,
7
+ * `a:reviewer`). The list owns the keys: ↑/↓ move, Space peeks, Enter opens,
8
+ * x stops.
9
+ */
10
+ export declare function SessionsBoard({ projectId }: {
11
+ projectId: string;
12
+ }): import("react").JSX.Element;