@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,92 @@
1
+ /**
2
+ * The agents line's model: which child sessions it lists, in which group and
3
+ * in which order, and what the one line under the composer says. Pure, so the
4
+ * rules are tested without a render tree.
5
+ *
6
+ * Claude Code's agent panel lists the agents a session started (subagents and
7
+ * teammates) under the prompt; Kortix lists the child sessions of this session.
8
+ * A teammate (`team_lead_session_id` = this session) goes under "Team". The
9
+ * sessions a workflow run started are that run's agents, so they stay out of
10
+ * the agent rows: the "Workflows" group shows the run instead.
11
+ */
12
+ import type { ProjectSession, SessionBoardState } from '@kortix/sdk';
13
+ /** The states a row draws, Claude's agent view states. */
14
+ export type AgentRowState = SessionBoardState;
15
+ export interface AgentRow {
16
+ sessionId: string;
17
+ /**
18
+ * What the line calls it: the agent handle, else the session name, else the
19
+ * agent's display name (`kortix` → "Kortix"), never a raw slug.
20
+ */
21
+ handle: string;
22
+ /** The project agent slug it runs as. */
23
+ agent: string | null;
24
+ /** The handle is a name of its own (a handle or a session name), so "runs as <agent>" adds something. */
25
+ named: boolean;
26
+ state: AgentRowState;
27
+ /** What it waits for, when `needs_input`. */
28
+ attention: 'question' | 'approval' | null;
29
+ /** One line: the result excerpt, else the session title. */
30
+ line: string | null;
31
+ /** Epoch ms of its newest activity, for the order inside a state. */
32
+ activityMs: number;
33
+ /** Epoch ms its current turn started, while it works and the API says when. */
34
+ workingSinceMs: number | null;
35
+ }
36
+ /** A child older than this that has settled is no longer "recent": it leaves the line. */
37
+ export declare const RECENT_MS: number;
38
+ /** The popover lists at most this many agent rows per group. */
39
+ export declare const MAX_ROWS = 20;
40
+ /** Board state of a session row: the API's `board_state`, else derived from the older fields. */
41
+ export declare function boardStateOf(session: ProjectSession): AgentRowState;
42
+ /** True while a row works or waits on its person: it can be stopped. */
43
+ export declare function isActive(state: AgentRowState): boolean;
44
+ /**
45
+ * A spawned session's own title. pi named a child `<description> (@agent
46
+ * subagent)` until 2026-10-31, and those rows keep the name: every surface shows
47
+ * the agent apart (`agent_name`), never in the title.
48
+ */
49
+ export declare function subagentTitle(name: string): string;
50
+ export declare function agentRowOf(session: ProjectSession): AgentRow;
51
+ export interface StripGroups {
52
+ agents: AgentRow[];
53
+ team: AgentRow[];
54
+ }
55
+ /**
56
+ * The agent rows of a session: its children and its teammates, each once.
57
+ * `exclude` holds the sessions a workflow run owns (its agents and its runner).
58
+ * A settled row older than {@link RECENT_MS} leaves the line.
59
+ */
60
+ export declare function stripGroups(input: {
61
+ leadSessionId: string;
62
+ children: readonly ProjectSession[];
63
+ teammates: readonly ProjectSession[];
64
+ exclude: ReadonlySet<string>;
65
+ now: number;
66
+ }): StripGroups;
67
+ export interface StripCounts {
68
+ agents: number;
69
+ working: number;
70
+ needsInput: number;
71
+ }
72
+ export declare function stripCounts(rows: readonly AgentRow[]): StripCounts;
73
+ /**
74
+ * The one mark at the head of the agents line: needs you (an agent waits on the
75
+ * person), working (an agent or a workflow run works), failed (the newest agent
76
+ * did not finish), done (everything else: every agent ended its turn).
77
+ */
78
+ export type LineMark = 'needs_input' | 'working' | 'failed' | 'done';
79
+ export interface LineSummary extends StripCounts {
80
+ mark: LineMark;
81
+ /** Workflow runs listed, and how many of them run. */
82
+ runs: number;
83
+ runningRuns: number;
84
+ /** The agent with the newest activity, named on the line while nothing works. */
85
+ newest: AgentRow | null;
86
+ }
87
+ /** What the agents line says: `2 agents · 1 working`, `2 agents · poet done`, `1 workflow running`. */
88
+ export declare function lineSummary(rows: readonly AgentRow[], runs: readonly {
89
+ status: string;
90
+ }[]): LineSummary;
91
+ /** `12s`, `4m`, `2h`: the short elapsed time of a working row. */
92
+ export declare function shortElapsed(ms: number): string;
@@ -0,0 +1,123 @@
1
+ import { agentDisplayName } from '../../internal/components/agent-mark.js';
2
+ /** A child older than this that has settled is no longer "recent": it leaves the line. */
3
+ export const RECENT_MS = 60 * 60_000;
4
+ /** The popover lists at most this many agent rows per group. */
5
+ export const MAX_ROWS = 20;
6
+ const STATE_ORDER = {
7
+ needs_input: 0,
8
+ working: 1,
9
+ failed: 2,
10
+ idle: 3,
11
+ completed: 4,
12
+ stopped: 5,
13
+ };
14
+ /** Board state of a session row: the API's `board_state`, else derived from the older fields. */
15
+ export function boardStateOf(session) {
16
+ if (session.board_state)
17
+ return session.board_state;
18
+ if (session.attention)
19
+ return 'needs_input';
20
+ switch (session.status) {
21
+ case 'failed':
22
+ return 'failed';
23
+ case 'completed':
24
+ return 'completed';
25
+ case 'stopped':
26
+ return 'stopped';
27
+ case 'queued':
28
+ case 'branching':
29
+ case 'provisioning':
30
+ return 'working';
31
+ default:
32
+ return session.working?.state === 'working' ? 'working' : 'idle';
33
+ }
34
+ }
35
+ /** True while a row works or waits on its person: it can be stopped. */
36
+ export function isActive(state) {
37
+ return state === 'working' || state === 'needs_input';
38
+ }
39
+ /**
40
+ * A spawned session's own title. pi named a child `<description> (@agent
41
+ * subagent)` until 2026-10-31, and those rows keep the name: every surface shows
42
+ * the agent apart (`agent_name`), never in the title.
43
+ */
44
+ export function subagentTitle(name) {
45
+ return name.replace(/\s*\(@[^)]*\)\s*$/, '').trim();
46
+ }
47
+ export function agentRowOf(session) {
48
+ const name = session.name ? subagentTitle(session.name) : '';
49
+ const own = session.agent_handle?.trim() || name;
50
+ const agent = session.agent_name?.trim() || null;
51
+ const handle = own || (agent ? agentDisplayName(agent) : session.session_id.slice(0, 8));
52
+ const excerpt = session.result_excerpt?.replace(/\s+/g, ' ').trim() || null;
53
+ const activity = Date.parse(session.last_activity_at ?? session.updated_at ?? session.created_at);
54
+ const state = boardStateOf(session);
55
+ const since = state === 'working' && session.working?.since ? Date.parse(session.working.since) : NaN;
56
+ return {
57
+ sessionId: session.session_id,
58
+ handle,
59
+ agent,
60
+ named: !!own,
61
+ state,
62
+ attention: session.attention ?? null,
63
+ line: excerpt ?? (name && name !== handle ? name : null),
64
+ activityMs: Number.isFinite(activity) ? activity : 0,
65
+ workingSinceMs: Number.isFinite(since) ? since : null,
66
+ };
67
+ }
68
+ /**
69
+ * The agent rows of a session: its children and its teammates, each once.
70
+ * `exclude` holds the sessions a workflow run owns (its agents and its runner).
71
+ * A settled row older than {@link RECENT_MS} leaves the line.
72
+ */
73
+ export function stripGroups(input) {
74
+ const seen = new Set();
75
+ const agents = [];
76
+ const team = [];
77
+ for (const session of [...input.teammates, ...input.children]) {
78
+ if (seen.has(session.session_id) || input.exclude.has(session.session_id))
79
+ continue;
80
+ if (session.session_id === input.leadSessionId)
81
+ continue;
82
+ seen.add(session.session_id);
83
+ const row = agentRowOf(session);
84
+ if (!isActive(row.state) && row.state !== 'idle' && input.now - row.activityMs > RECENT_MS)
85
+ continue;
86
+ const isTeammate = session.team_lead_session_id === input.leadSessionId || input.teammates.includes(session);
87
+ (isTeammate ? team : agents).push(row);
88
+ }
89
+ const order = (a, b) => STATE_ORDER[a.state] - STATE_ORDER[b.state] || b.activityMs - a.activityMs;
90
+ return { agents: agents.sort(order).slice(0, MAX_ROWS), team: team.sort(order).slice(0, MAX_ROWS) };
91
+ }
92
+ export function stripCounts(rows) {
93
+ return {
94
+ agents: rows.length,
95
+ working: rows.filter((row) => row.state === 'working').length,
96
+ needsInput: rows.filter((row) => row.state === 'needs_input').length,
97
+ };
98
+ }
99
+ /** What the agents line says: `2 agents · 1 working`, `2 agents · poet done`, `1 workflow running`. */
100
+ export function lineSummary(rows, runs) {
101
+ const counts = stripCounts(rows);
102
+ const runningRuns = runs.filter((run) => run.status === 'running').length;
103
+ let newest = null;
104
+ for (const row of rows)
105
+ if (!newest || row.activityMs > newest.activityMs)
106
+ newest = row;
107
+ const mark = counts.needsInput > 0
108
+ ? 'needs_input'
109
+ : counts.working > 0 || runningRuns > 0
110
+ ? 'working'
111
+ : newest?.state === 'failed'
112
+ ? 'failed'
113
+ : 'done';
114
+ return { ...counts, mark, runs: runs.length, runningRuns, newest };
115
+ }
116
+ /** `12s`, `4m`, `2h`: the short elapsed time of a working row. */
117
+ export function shortElapsed(ms) {
118
+ const seconds = Math.max(0, Math.floor(ms / 1000));
119
+ if (seconds < 60)
120
+ return `${seconds}s`;
121
+ const minutes = Math.floor(seconds / 60);
122
+ return minutes < 60 ? `${minutes}m` : `${Math.floor(minutes / 60)}h`;
123
+ }
@@ -0,0 +1,10 @@
1
+ import type { AgentRowState } from './agent-model.js';
2
+ /**
3
+ * The state mark of an agent row: the live dot while it works, the attention
4
+ * dot while it waits on the person, a check once its turn ended. The words
5
+ * beside it say the state; the mark repeats it. The agents line and the
6
+ * multi-agent tool cards draw the same mark.
7
+ */
8
+ export declare function AgentStateMark({ state }: {
9
+ state: AgentRowState;
10
+ }): import("react").JSX.Element;
@@ -0,0 +1,22 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { CheckIcon } from '@phosphor-icons/react';
4
+ import { StatusDot } from '../../primitives/status.js';
5
+ import { useTranslations } from '../../i18n/index.js';
6
+ import { cn } from '../../lib/utils.js';
7
+ const DOT_TONE = {
8
+ working: 'success',
9
+ needs_input: 'warning',
10
+ failed: 'destructive',
11
+ stopped: 'neutral',
12
+ };
13
+ /**
14
+ * The state mark of an agent row: the live dot while it works, the attention
15
+ * dot while it waits on the person, a check once its turn ended. The words
16
+ * beside it say the state; the mark repeats it. The agents line and the
17
+ * multi-agent tool cards draw the same mark.
18
+ */
19
+ export function AgentStateMark({ state }) {
20
+ const t = useTranslations('multiAgent.strip');
21
+ return (_jsxs("span", { className: "flex size-3 shrink-0 items-center justify-center", children: [state === 'idle' || state === 'completed' ? (_jsx(CheckIcon, { "aria-hidden": true, weight: "bold", className: "text-kortix-green size-3" })) : (_jsx(StatusDot, { tone: DOT_TONE[state], pulse: state === 'working', className: cn(state === 'working' && 'motion-reduce:animate-none') })), _jsx("span", { className: "sr-only", children: t(`state.${state}`) })] }));
22
+ }
@@ -0,0 +1,58 @@
1
+ import { type SessionTask, type WorkflowRunMetadata } from '@kortix/sdk';
2
+ import { type WorkflowRun } from '../tool/tools/workflow-run.js';
3
+ import { type AgentRow } from './agent-model.js';
4
+ /** The runs the line lists: running ones, and ones that ended in the last hour; newest first. */
5
+ export declare function stripRuns(runs: readonly WorkflowRunMetadata[], now: number): WorkflowRun[];
6
+ /** Every session a run owns: its runner and its agents. They show under the run, not as agent rows. */
7
+ export declare function runSessionIds(runs: readonly WorkflowRun[]): Set<string>;
8
+ export type OpenTarget = {
9
+ sessionId: string;
10
+ title: string;
11
+ };
12
+ export interface AgentsLineViewProps {
13
+ projectId: string | undefined;
14
+ sessionId: string | undefined;
15
+ agents: AgentRow[];
16
+ team: AgentRow[];
17
+ runs: WorkflowRun[];
18
+ /** The team's tasks; `null` when this session leads no team (or `agent_teams` is off). */
19
+ tasks: SessionTask[] | null;
20
+ onOpen: (target: OpenTarget) => void;
21
+ onStop: (row: AgentRow) => void;
22
+ stopping: ReadonlySet<string>;
23
+ /** The line shows the mark and the count only: a narrow toolbar (a channel's thread panel). */
24
+ compact?: boolean;
25
+ /** First render state of the popover (tests). */
26
+ defaultOpen?: boolean;
27
+ }
28
+ export declare function AgentsLineView({ projectId, sessionId, agents, team, runs, tasks, onOpen, onStop, stopping, compact, defaultOpen, }: AgentsLineViewProps): import("react").JSX.Element | null;
29
+ export interface AgentsPanelProps extends Omit<AgentsLineViewProps, 'compact' | 'defaultOpen'> {
30
+ /** The popover is open: a working row's elapsed time ticks. */
31
+ live: boolean;
32
+ }
33
+ /** The popover body: Agents, Team, Workflows, and a Tasks tab when this session leads a team. */
34
+ export declare function AgentsPanel({ projectId, sessionId, agents, team, runs, tasks, onOpen, onStop, stopping, live }: AgentsPanelProps): import("react").JSX.Element;
35
+ /**
36
+ * The agents of one session, read live: its children (polled every 5 s), its
37
+ * teammates and team tasks (flag `agent_teams`) and its workflow runs; and the
38
+ * stop of one agent.
39
+ */
40
+ export declare function useAgentsLine(projectId: string | undefined, sessionId: string | undefined): {
41
+ ready: boolean;
42
+ agents: AgentRow[];
43
+ team: AgentRow[];
44
+ runs: WorkflowRun[];
45
+ tasks: SessionTask[] | null;
46
+ stopping: ReadonlySet<string>;
47
+ stop: (row: AgentRow) => void;
48
+ };
49
+ /**
50
+ * The agents line of one session, for the composer's under-row
51
+ * (`SessionChatInputProps.underbarSlot`). Nothing renders while the session
52
+ * started no agent and no workflow run.
53
+ */
54
+ export declare function AgentsLine({ projectId, sessionId, compact, }: {
55
+ projectId: string | undefined;
56
+ sessionId: string | undefined;
57
+ compact?: boolean;
58
+ }): import("react").JSX.Element | null;
@@ -0,0 +1,259 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { Badge } from '../../primitives/badge.js';
4
+ import { Button } from '../../primitives/button.js';
5
+ import { CountBadge } from '../../primitives/count-badge.js';
6
+ import { Hint } from '../../primitives/hint.js';
7
+ import Loading from '../../primitives/loading.js';
8
+ import { Popover, PopoverContent, PopoverTrigger } from '../../primitives/popover.js';
9
+ import { Tabs, TabsContent, TabsListCompact, TabsTriggerCompact } from '../../primitives/tabs.js';
10
+ import { errorToast } from '../../primitives/toast.js';
11
+ import { useTranslations } from '../../i18n/index.js';
12
+ import { agentDisplayName } from '../../internal/components/agent-mark.js';
13
+ import { cn } from '../../lib/utils.js';
14
+ import { AgentStateMark } from './agent-state-mark.js';
15
+ import { SubagentDialog } from './subagent-view.js';
16
+ import { ArrowUpRightIcon, CaretUpIcon, SquareIcon } from '@phosphor-icons/react';
17
+ import { useMemo, useState } from 'react';
18
+ import { useMutation, useQueryClient } from '@tanstack/react-query';
19
+ import { stopProjectSession } from '@kortix/sdk';
20
+ import { qk, useFeatureFlag, useSessionChildren, useSessionWorkflows, useTeamTasks, useTeammates, } from '@kortix/sdk/react';
21
+ import { countAgents, parseWorkflowRun } from '../tool/tools/workflow-run.js';
22
+ import { WorkflowProgress } from '../tool/tools/workflow-progress.js';
23
+ import { isActive, lineSummary, shortElapsed, stripGroups, } from './agent-model.js';
24
+ import { TasksPanel } from './tasks-panel.js';
25
+ import { isLargeRun, LargeRunBadge, useLiveWorkflowRun, useNow, useRestartAgent, WorkflowRunControls, } from './workflow-run-controls.js';
26
+ /**
27
+ * The agents line: one muted control in the composer's under-row, right of the
28
+ * agent picker (Claude Code's agent panel, folded to one line).
29
+ *
30
+ * ● 2 agents · 1 working ⌃ ✓ 2 agents · poet done ⌃
31
+ *
32
+ * It names the state of what this session started (its child sessions, the
33
+ * teammates of a team it leads, its workflow runs) and opens a popover above
34
+ * the line with one row per agent: open its session, stop it while it works,
35
+ * and the Tasks tab of a team it leads. It renders nothing while the session
36
+ * started nothing, and it never holds the composer: the agents run in their own
37
+ * sessions, and the person keeps talking to this one.
38
+ */
39
+ /** How often the child list polls while the line is mounted. */
40
+ const CHILDREN_POLL_MS = 5_000;
41
+ /** A finished workflow run stays listed this long after it ended. */
42
+ const RECENT_RUN_MS = 60 * 60_000;
43
+ /** The popover lists at most this many runs. */
44
+ const MAX_RUNS = 5;
45
+ const LINE_STATE = {
46
+ needs_input: 'needs_input',
47
+ working: 'working',
48
+ failed: 'failed',
49
+ done: 'completed',
50
+ };
51
+ /** The runs the line lists: running ones, and ones that ended in the last hour; newest first. */
52
+ export function stripRuns(runs, now) {
53
+ const out = [];
54
+ for (const raw of runs) {
55
+ const run = parseWorkflowRun(raw);
56
+ if (!run)
57
+ continue;
58
+ if (run.status !== 'running' && (run.endedAt === undefined || now - run.endedAt > RECENT_RUN_MS))
59
+ continue;
60
+ out.push(run);
61
+ if (out.length >= MAX_RUNS)
62
+ break;
63
+ }
64
+ return out;
65
+ }
66
+ /** Every session a run owns: its runner and its agents. They show under the run, not as agent rows. */
67
+ export function runSessionIds(runs) {
68
+ const ids = new Set();
69
+ for (const run of runs) {
70
+ if (run.background)
71
+ ids.add(run.background.sessionId);
72
+ for (const agent of run.agents)
73
+ if (agent.sessionId)
74
+ ids.add(agent.sessionId);
75
+ }
76
+ return ids;
77
+ }
78
+ /** The text of the line: `2 agents · 1 working`, `2 agents · poet done`, `1 workflow running`. */
79
+ function useLineText(rows, runs, compact) {
80
+ const t = useTranslations('multiAgent.strip');
81
+ const summary = lineSummary(rows, runs);
82
+ const parts = [];
83
+ if (summary.agents > 0)
84
+ parts.push(t('agents', { count: summary.agents }));
85
+ if (summary.runs > 0) {
86
+ parts.push(summary.runningRuns > 0
87
+ ? t('workflowsRunning', { count: summary.runningRuns })
88
+ : t('workflows', { count: summary.runs }));
89
+ }
90
+ if (!compact && summary.agents > 0) {
91
+ if (summary.needsInput > 0)
92
+ parts.push(t('state.needs_input'));
93
+ else if (summary.working > 0)
94
+ parts.push(t('working', { count: summary.working }));
95
+ else if (summary.newest)
96
+ parts.push(t('newest', { name: summary.newest.handle, state: t(`state.${summary.newest.state}`) }));
97
+ }
98
+ return { summary, text: parts.join(' · ') };
99
+ }
100
+ export function AgentsLineView({ projectId, sessionId, agents, team, runs, tasks, onOpen, onStop, stopping, compact = false, defaultOpen = false, }) {
101
+ const t = useTranslations('multiAgent.strip');
102
+ const [open, setOpen] = useState(defaultOpen);
103
+ const rows = useMemo(() => [...agents, ...team], [agents, team]);
104
+ const { summary, text } = useLineText(rows, runs, compact);
105
+ if (rows.length === 0 && runs.length === 0)
106
+ return null;
107
+ return (_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs(Button, { type: "button", variant: "ghost", size: "sm", "data-testid": "agents-line", "aria-label": compact ? `${t('label')}: ${text}` : undefined, className: "text-muted-foreground hit-area-y-3 min-w-0 shrink gap-1.5 rounded-lg px-2 text-xs font-normal tabular-nums", children: [_jsx(AgentStateMark, { state: LINE_STATE[summary.mark] }), _jsx("span", { className: "max-w-64 min-w-0 truncate", children: text }), _jsx(CaretUpIcon, { "aria-hidden": true, className: cn('size-3 shrink-0', open && 'rotate-180') })] }) }), _jsx(PopoverContent, { side: "top", align: "start", sideOffset: 8, "aria-label": t('label'), "data-testid": "agents-line-popover", tabIndex: -1,
108
+ // Focus the panel, not its first row action: a focused action opens its
109
+ // tooltip, and the first Escape would close the tooltip, not the popover.
110
+ onOpenAutoFocus: (event) => {
111
+ event.preventDefault();
112
+ event.currentTarget?.focus();
113
+ }, className: "flex w-[min(360px,calc(100vw-1.5rem))] flex-col p-0", children: _jsx(AgentsPanel, { projectId: projectId, sessionId: sessionId, agents: agents, team: team, runs: runs, tasks: tasks, onOpen: (target) => {
114
+ setOpen(false);
115
+ onOpen(target);
116
+ }, onStop: onStop, stopping: stopping, live: open }) })] }));
117
+ }
118
+ /** The popover body: Agents, Team, Workflows, and a Tasks tab when this session leads a team. */
119
+ export function AgentsPanel({ projectId, sessionId, agents, team, runs, tasks, onOpen, onStop, stopping, live }) {
120
+ const t = useTranslations('multiAgent.strip');
121
+ const anyWorking = live && [...agents, ...team].some((row) => row.state === 'working');
122
+ const now = useNow(anyWorking);
123
+ const sections = [agents.length > 0, team.length > 0, runs.length > 0].filter(Boolean).length;
124
+ const renderRows = (list, teammate) => (_jsx("ul", { children: list.map((row) => (_jsx(AgentLineRow, { row: row, teammate: teammate, now: now, stopping: stopping.has(row.sessionId), onOpen: () => onOpen({ sessionId: row.sessionId, title: row.handle }), onStop: () => onStop(row) }, row.sessionId))) }));
125
+ const list = (_jsxs("div", { className: "max-h-96 overflow-y-auto p-1", children: [agents.length > 0 && (_jsxs("section", { "aria-label": t('label'), children: [sections > 1 && _jsx(GroupLabel, { children: t('label') }), renderRows(agents, false)] })), team.length > 0 && (_jsxs("section", { "aria-label": t('team'), children: [_jsx(GroupLabel, { children: t('team') }), renderRows(team, true)] })), runs.length > 0 && (_jsxs("section", { "aria-label": t('workflowsGroup'), children: [_jsx(GroupLabel, { children: t('workflowsGroup') }), _jsx("ul", { children: runs.map((run) => (_jsx(WorkflowLineRow, { projectId: projectId, sessionId: sessionId, run: run, onOpen: onOpen }, run.runId || run.title))) })] }))] }));
126
+ if (tasks === null)
127
+ return list;
128
+ const openTasks = tasks.filter((task) => task.status !== 'completed').length;
129
+ return (_jsxs(Tabs, { defaultValue: "agents", className: "gap-0", children: [_jsx(TabsContent, { value: "agents", children: list }), _jsx(TabsContent, { value: "tasks", className: "max-h-96 overflow-y-auto p-1", children: _jsx(TasksPanel, { tasks: tasks }) }), _jsx("div", { className: "border-t p-1", children: _jsxs(TabsListCompact, { animate: "none", className: "w-full", children: [_jsx(TabsTriggerCompact, { value: "agents", children: t('label') }), _jsxs(TabsTriggerCompact, { value: "tasks", className: "gap-1.5", children: [t('tasks'), openTasks > 0 && _jsx(CountBadge, { count: openTasks })] })] }) })] }));
130
+ }
131
+ function GroupLabel({ children }) {
132
+ return _jsx("div", { className: "text-muted-foreground px-2 pt-1.5 pb-0.5 text-xs font-medium", children: children });
133
+ }
134
+ /** Row actions: shown on hover and on keyboard focus, always on a touch screen. */
135
+ const ROW_ACTIONS = 'flex shrink-0 items-center opacity-0 group-hover/row:opacity-100 group-focus-within/row:opacity-100 [@media(hover:none)]:opacity-100';
136
+ /** The short state of a row: `working · 1m`, `done`, `needs you`, `failed`. */
137
+ function rowState(row, now, t) {
138
+ if (row.state === 'working' && row.workingSinceMs !== null) {
139
+ return t('workingFor', { elapsed: shortElapsed(now - row.workingSinceMs) });
140
+ }
141
+ return t(`state.${row.state}`);
142
+ }
143
+ function AgentLineRow({ row, teammate, now, stopping, onOpen, onStop, }) {
144
+ const t = useTranslations('multiAgent.strip');
145
+ // The result, or what it waits for: one line on hover, never inline.
146
+ const detail = row.state === 'needs_input' ? (row.line ?? t(`attention.${row.attention ?? 'question'}`)) : row.line;
147
+ const handle = (_jsx("span", { className: "text-foreground min-w-0 truncate font-medium", title: teammate ? undefined : row.handle, children: row.handle }));
148
+ const state = (_jsx("span", { className: "text-muted-foreground shrink-0 tabular-nums", children: rowState(row, now, t) }));
149
+ return (_jsxs("li", { "data-testid": "agents-line-row", "data-agent-row": row.sessionId, className: "group/row hover:bg-hover focus-within:bg-hover flex min-w-0 items-center gap-1 rounded-sm", children: [_jsxs("div", { onClick: onOpen, className: "flex min-w-0 flex-1 cursor-pointer items-center gap-2 py-1.5 pl-2 text-xs", children: [_jsx(AgentStateMark, { state: row.state }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex min-w-0 items-baseline gap-2", children: [teammate ? (_jsx(Hint, { label: t('teamRole'), side: "top", children: handle })) : (handle), detail ? (_jsx(Hint, { label: _jsx("span", { className: "block max-w-72 truncate", children: detail }), side: "top", children: state })) : (state)] }), row.named && row.agent && (_jsx("p", { className: "text-muted-foreground truncate", children: t('runsAs', { agent: agentDisplayName(row.agent) }) }))] })] }), _jsxs("div", { className: cn(ROW_ACTIONS, 'pr-1', stopping && 'opacity-100'), children: [_jsx(Hint, { label: t('openAgent', { name: row.handle }), side: "top", children: _jsx(Button, { type: "button", variant: "ghost", size: "icon-xs", "aria-label": t('openAgent', { name: row.handle }), onClick: onOpen, className: "text-muted-foreground hover:text-foreground", children: _jsx(ArrowUpRightIcon, { className: "size-3.5 shrink-0" }) }) }), stopping ? (_jsx("span", { className: "flex size-6 items-center justify-center", children: _jsx(Loading, { className: "text-muted-foreground size-3" }) })) : isActive(row.state) ? (_jsx(Hint, { label: t('stopHint'), side: "top", children: _jsx(Button, { type: "button", variant: "ghost", size: "icon-xs", "aria-label": t('stopAgent', { name: row.handle }), onClick: onStop, className: "text-muted-foreground hover:text-foreground", children: _jsx(SquareIcon, { weight: "fill", className: "size-2.5" }) }) })) : null] })] }));
150
+ }
151
+ const RUN_STATE = {
152
+ running: 'working',
153
+ done: 'completed',
154
+ failed: 'failed',
155
+ stopped: 'stopped',
156
+ };
157
+ /** One workflow run: its live progress and controls; it unfolds into its agents. */
158
+ function WorkflowLineRow({ projectId, sessionId, run: listed, onOpen, }) {
159
+ const t = useTranslations('multiAgent.strip');
160
+ const tw = useTranslations('multiAgent.workflow');
161
+ const [open, setOpen] = useState(false);
162
+ // A background run's progress is read from its runner, so it keeps moving after this turn ended.
163
+ const { run, controlSessionId } = useLiveWorkflowRun(projectId, sessionId, listed);
164
+ const now = useNow(open && run?.status === 'running');
165
+ const restart = useRestartAgent(projectId, controlSessionId, run);
166
+ const queryClient = useQueryClient();
167
+ const stopAgent = useMutation({
168
+ mutationFn: (agent) => stopProjectSession(projectId, agent.sessionId),
169
+ onSuccess: () => projectId && queryClient.invalidateQueries({ queryKey: qk.project.sessionsScope(projectId) }),
170
+ onError: (error) => errorToast(t('stopFailed'), { description: error instanceof Error ? error.message : undefined }),
171
+ });
172
+ if (!run)
173
+ return null;
174
+ const counts = countAgents(run.agents);
175
+ const progress = counts.total > 0 ? t('runProgress', { done: counts.done, total: counts.total }) : undefined;
176
+ const line = (run.status === 'running'
177
+ ? [run.paused ? tw('paused') : run.background ? t('runBackground') : t('runRunning'), progress]
178
+ : [progress])
179
+ .filter(Boolean)
180
+ .join(' · ');
181
+ const live = run.status === 'running';
182
+ const stop = {
183
+ enabled: !!projectId,
184
+ pending: new Set(stopAgent.isPending && stopAgent.variables?.sessionId ? [stopAgent.variables.sessionId] : []),
185
+ stop: (agent) => agent.sessionId && stopAgent.mutate(agent),
186
+ ...(restart.enabled ? { restart: { pending: restart.restarting, run: restart.restart } } : {}),
187
+ };
188
+ const title = run.title || run.name || t('runFallback');
189
+ return (_jsxs("li", { "data-testid": "agents-line-row", "data-workflow-run": run.runId, children: [_jsxs("div", { className: "group/row hover:bg-hover focus-within:bg-hover flex min-w-0 items-center gap-1 rounded-sm", children: [_jsxs("button", { type: "button", "aria-expanded": open, onClick: () => setOpen((value) => !value), className: "flex min-w-0 flex-1 cursor-pointer items-center gap-2 py-1.5 pl-2 text-left text-xs outline-none", children: [_jsx(AgentStateMark, { state: RUN_STATE[run.status] }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex min-w-0 items-baseline gap-2", children: [_jsx("span", { className: "text-foreground min-w-0 truncate font-medium", title: title, children: title }), _jsx("span", { className: "text-muted-foreground shrink-0", children: t(`state.${RUN_STATE[run.status]}`) })] }), line && _jsx("p", { className: "text-muted-foreground truncate tabular-nums", children: line })] })] }), isLargeRun(run) && _jsx(LargeRunBadge, {}), _jsxs("div", { className: cn(ROW_ACTIONS, 'pr-1'), children: [run.background && (_jsx(Hint, { label: t('openRun'), side: "top", children: _jsx(Button, { type: "button", variant: "ghost", size: "icon-xs", "aria-label": t('openRun'), onClick: () => onOpen({ sessionId: run.background.sessionId, title }), className: "text-muted-foreground hover:text-foreground", children: _jsx(ArrowUpRightIcon, { className: "size-3.5 shrink-0" }) }) })), _jsx(WorkflowRunControls, { projectId: projectId, controlSessionId: live ? controlSessionId : undefined, ownerSessionId: sessionId, run: run })] })] }), open && run.agents.length > 0 && (_jsx("div", { className: "pl-5", children: _jsx(WorkflowProgress, { run: run, live: live, now: now, onOpen: (agent) => agent.sessionId && onOpen({ sessionId: agent.sessionId, title: agent.agent ? `${agent.label} · ${agent.agent}` : agent.label }), stop: stop }) })), open && run.agents.length === 0 && (_jsx(Badge, { variant: "muted", size: "sm", className: "ml-7", children: t('runNoAgents') }))] }));
190
+ }
191
+ /**
192
+ * The agents of one session, read live: its children (polled every 5 s), its
193
+ * teammates and team tasks (flag `agent_teams`) and its workflow runs; and the
194
+ * stop of one agent.
195
+ */
196
+ export function useAgentsLine(projectId, sessionId) {
197
+ const t = useTranslations('multiAgent.strip');
198
+ const pid = projectId ?? '';
199
+ const sid = sessionId ?? '';
200
+ const ready = !!projectId && !!sessionId;
201
+ const teams = useFeatureFlag(projectId, 'agent_teams').enabled;
202
+ const childList = useSessionChildren(pid, sid, { enabled: ready, refetchInterval: CHILDREN_POLL_MS, limit: 50 });
203
+ const children = childList.sessions;
204
+ const { data: teammates, dataUpdatedAt: teammatesAt } = useTeammates(projectId, sessionId, { enabled: ready && teams });
205
+ const { data: tasks } = useTeamTasks(projectId, sessionId, { enabled: ready && teams });
206
+ const { data: runData, dataUpdatedAt: runsAt } = useSessionWorkflows(projectId, sessionId, { enabled: ready });
207
+ const [stopping, setStopping] = useState(() => new Set());
208
+ const queryClient = useQueryClient();
209
+ const stopMutation = useMutation({
210
+ mutationFn: (row) => stopProjectSession(pid, row.sessionId),
211
+ onSettled: (_data, _error, row) => {
212
+ setStopping((previous) => {
213
+ const next = new Set(previous);
214
+ next.delete(row.sessionId);
215
+ return next;
216
+ });
217
+ void queryClient.invalidateQueries({ queryKey: qk.project.sessionsScope(pid) });
218
+ },
219
+ onError: (error, row) => errorToast(t('stopAgentFailed', { name: row.handle }), { description: error instanceof Error ? error.message : undefined }),
220
+ });
221
+ // "Recent" is measured at the newest answer, not at each render: the lists re-derive when data arrives.
222
+ const now = Math.max(childList.dataUpdatedAt, teammatesAt, runsAt);
223
+ const runs = useMemo(() => stripRuns(runData ?? [], now), [runData, now]);
224
+ const groups = useMemo(() => stripGroups({
225
+ leadSessionId: sid,
226
+ children,
227
+ teammates: teammates ?? [],
228
+ exclude: runSessionIds(runs),
229
+ now,
230
+ }), [sid, children, teammates, runs, now]);
231
+ const leadsTeam = teams && ((teammates?.length ?? 0) > 0 || (tasks?.length ?? 0) > 0);
232
+ return {
233
+ ready,
234
+ agents: groups.agents,
235
+ team: groups.team,
236
+ runs,
237
+ tasks: leadsTeam ? (tasks ?? []) : null,
238
+ stopping,
239
+ stop: (row) => {
240
+ setStopping((previous) => new Set(previous).add(row.sessionId));
241
+ stopMutation.mutate(row);
242
+ },
243
+ };
244
+ }
245
+ /**
246
+ * The agents line of one session, for the composer's under-row
247
+ * (`SessionChatInputProps.underbarSlot`). Nothing renders while the session
248
+ * started no agent and no workflow run.
249
+ */
250
+ export function AgentsLine({ projectId, sessionId, compact = false, }) {
251
+ const line = useAgentsLine(projectId, sessionId);
252
+ const [open, setOpen] = useState(null);
253
+ if (!line.ready)
254
+ return null;
255
+ return (_jsxs(_Fragment, { children: [_jsx(AgentsLineView, { projectId: projectId, sessionId: sessionId, agents: line.agents, team: line.team, runs: line.runs, tasks: line.tasks, onOpen: setOpen, onStop: line.stop, stopping: line.stopping, compact: compact }), open && (_jsx(SubagentDialog, { open: true, onOpenChange: (next) => {
256
+ if (!next)
257
+ setOpen(null);
258
+ }, projectId: projectId, sessionId: open.sessionId, title: open.title }))] }));
259
+ }
@@ -0,0 +1,33 @@
1
+ import type { PeerMessage } from '@kortix/sdk';
2
+ import { usePeerMessages } from '@kortix/sdk/react';
3
+ /**
4
+ * Messages from other sessions that wait for the person (`inbound: hold`, or a
5
+ * session the person asked to approve first). Claude Code opens an approval
6
+ * dialog with the sender and a preview; Kortix shows one card per message above
7
+ * the agent strip. "Approve message" delivers it, "Deny" drops it. A message
8
+ * nobody decides expires after 5 minutes on the server.
9
+ */
10
+ /** The preview line: the sender's summary, else the message's first line. */
11
+ export declare function heldPreview(message: Pick<PeerMessage, 'summary' | 'message'>): string;
12
+ export interface HeldMessageCardProps {
13
+ message: PeerMessage;
14
+ pending: 'approve' | 'deny' | null;
15
+ onApprove: () => void;
16
+ onDeny: () => void;
17
+ }
18
+ export declare function HeldMessageCard({ message, pending, onApprove, onDeny }: HeldMessageCardProps): import("react").JSX.Element;
19
+ type PeerMessagesQuery = ReturnType<typeof usePeerMessages>;
20
+ /** The held messages of `usePeerMessages(…, 'in')`, one card each; nothing when none waits. */
21
+ export declare function HeldMessageList({ messages, approve, deny, }: {
22
+ messages: readonly PeerMessage[] | undefined;
23
+ approve: PeerMessagesQuery['approve'];
24
+ deny: PeerMessagesQuery['deny'];
25
+ }): import("react").JSX.Element | null;
26
+ /** The messages that wait for the person, oldest first (the order they arrived). */
27
+ export declare function heldMessages(messages: readonly PeerMessage[] | undefined): PeerMessage[];
28
+ /** A session's held messages, read on their own (for a host without the agent strip). */
29
+ export declare function HeldMessages({ projectId, sessionId }: {
30
+ projectId: string | undefined;
31
+ sessionId: string | undefined;
32
+ }): import("react").JSX.Element;
33
+ export {};