@kortix/ui 0.14.11 → 0.14.13

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 (447) 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/browser/browser-panel.d.ts +2 -1
  18. package/dist/browser/browser-panel.js +12 -2
  19. package/dist/customize/agents/agent-access-text.d.ts +16 -0
  20. package/dist/customize/agents/agent-access-text.js +54 -0
  21. package/dist/customize/agents/agent-approval-rules.d.ts +8 -0
  22. package/dist/customize/agents/agent-approval-rules.js +26 -0
  23. package/dist/customize/agents/agent-authority-card.js +4 -1
  24. package/dist/customize/agents/agent-cover-card.d.ts +4 -1
  25. package/dist/customize/agents/agent-cover-card.js +2 -2
  26. package/dist/customize/agents/agent-detail-aside.d.ts +1 -2
  27. package/dist/customize/agents/agent-detail-aside.js +8 -11
  28. package/dist/customize/agents/agent-drives-section.d.ts +23 -7
  29. package/dist/customize/agents/agent-drives-section.js +107 -41
  30. package/dist/customize/agents/agent-instructions.d.ts +11 -0
  31. package/dist/customize/agents/agent-instructions.js +114 -0
  32. package/dist/customize/agents/agent-model-view.d.ts +17 -0
  33. package/dist/customize/agents/agent-model-view.js +67 -0
  34. package/dist/customize/agents/agent-overview.d.ts +53 -0
  35. package/dist/customize/agents/agent-overview.js +242 -0
  36. package/dist/customize/agents/agent-page-chrome.d.ts +128 -0
  37. package/dist/customize/agents/agent-page-chrome.js +145 -0
  38. package/dist/customize/agents/agent-page.d.ts +13 -1
  39. package/dist/customize/agents/agent-page.js +478 -367
  40. package/dist/customize/agents/agent-pin-button.d.ts +10 -0
  41. package/dist/customize/agents/agent-pin-button.js +20 -0
  42. package/dist/customize/agents/agent-policy-sets-section.d.ts +16 -0
  43. package/dist/customize/agents/agent-policy-sets-section.js +80 -0
  44. package/dist/customize/agents/agent-policy-sets.js +1 -1
  45. package/dist/customize/agents/agent-section-rail.d.ts +21 -0
  46. package/dist/customize/agents/agent-section-rail.js +23 -0
  47. package/dist/customize/agents/agent-share-control.d.ts +4 -3
  48. package/dist/customize/agents/agent-share-control.js +15 -16
  49. package/dist/customize/agents/{agent-people-section.d.ts → agent-share-dialog.d.ts} +3 -1
  50. package/dist/customize/agents/{agent-people-section.js → agent-share-dialog.js} +21 -21
  51. package/dist/customize/agents/agent-tabs.d.ts +95 -0
  52. package/dist/customize/agents/agent-tabs.js +199 -0
  53. package/dist/customize/agents/agents-page.d.ts +0 -21
  54. package/dist/customize/agents/agents-page.js +104 -118
  55. package/dist/customize/agents/connectors-required.d.ts +16 -0
  56. package/dist/customize/agents/connectors-required.js +19 -0
  57. package/dist/customize/agents/create-agent-modal.d.ts +19 -0
  58. package/dist/customize/agents/create-agent-modal.js +94 -0
  59. package/dist/customize/connectors/agent-access.d.ts +4 -4
  60. package/dist/customize/connectors/agent-access.js +7 -10
  61. package/dist/customize/connectors/connector-identity.d.ts +12 -0
  62. package/dist/customize/connectors/connector-identity.js +15 -2
  63. package/dist/customize/connectors/connector-routes.js +2 -2
  64. package/dist/customize/connectors/connectors-page.d.ts +14 -1
  65. package/dist/customize/connectors/connectors-page.js +101 -32
  66. package/dist/customize/connectors/detail/app-page.js +1 -1
  67. package/dist/customize/connectors/detail/connector-agents.js +0 -3
  68. package/dist/customize/connectors/detail/connector-page.d.ts +1 -1
  69. package/dist/customize/connectors/detail/connector-page.js +5 -2
  70. package/dist/customize/connectors/detail/connector-policy-sets.js +1 -1
  71. package/dist/customize/connectors/detail/connector-triggers.js +2 -2
  72. package/dist/customize/connectors/use-agent-access.d.ts +7 -5
  73. package/dist/customize/connectors/use-agent-access.js +2 -6
  74. package/dist/customize/models/models-page.d.ts +7 -1
  75. package/dist/customize/models/models-page.js +2 -2
  76. package/dist/customize/project-settings/project-admin-sections.d.ts +63 -0
  77. package/dist/customize/project-settings/project-admin-sections.js +80 -0
  78. package/dist/customize/project-settings/project-settings-page.d.ts +1 -1
  79. package/dist/customize/project-settings/project-settings-page.js +4 -13
  80. package/dist/customize/project-settings/project-settings-sections.d.ts +5 -5
  81. package/dist/customize/project-settings/project-settings-sections.js +6 -20
  82. package/dist/customize/providers/provider-accordion.js +29 -17
  83. package/dist/customize/providers/provider-connect.js +1 -1
  84. package/dist/customize/providers/provider-sheet.d.ts +4 -1
  85. package/dist/customize/providers/provider-sheet.js +15 -5
  86. package/dist/customize/secrets/secrets-page.d.ts +5 -1
  87. package/dist/customize/secrets/secrets-page.js +2 -2
  88. package/dist/customize/sections/gateway-view.d.ts +10 -2
  89. package/dist/customize/sections/gateway-view.js +16 -4
  90. package/dist/customize/sections/llm-provider/chatgpt-subscription-connect.d.ts +12 -5
  91. package/dist/customize/sections/llm-provider/chatgpt-subscription-connect.js +131 -8
  92. package/dist/customize/sections/llm-provider/claude-code-step.d.ts +10 -0
  93. package/dist/customize/sections/llm-provider/claude-code-step.js +32 -0
  94. package/dist/customize/sections/llm-provider/models-tab.js +5 -1
  95. package/dist/customize/sections/view/account-secret-resources-panel.d.ts +5 -3
  96. package/dist/customize/sections/view/account-secret-resources-panel.js +122 -19
  97. package/dist/customize/sections/view/agent-editor-access-fields.d.ts +1 -1
  98. package/dist/customize/sections/view/agent-editor-access-fields.js +8 -4
  99. package/dist/customize/sections/view/agent-editor-basics-fields.d.ts +4 -1
  100. package/dist/customize/sections/view/agent-editor-basics-fields.js +33 -4
  101. package/dist/customize/sections/view/agent-editor-catalog.d.ts +2 -2
  102. package/dist/customize/sections/view/agent-editor-catalog.js +10 -12
  103. package/dist/customize/sections/view/agent-editor-primitives.d.ts +1 -1
  104. package/dist/customize/sections/view/agent-editor-primitives.js +4 -4
  105. package/dist/customize/sections/view/agent-editor.d.ts +37 -26
  106. package/dist/customize/sections/view/agent-editor.js +19 -19
  107. package/dist/customize/sections/view/grant-mode-field.d.ts +8 -20
  108. package/dist/customize/sections/view/grant-mode-field.js +31 -57
  109. package/dist/customize/sections/view/permission-editor.d.ts +3 -1
  110. package/dist/customize/sections/view/permission-editor.js +19 -10
  111. package/dist/customize/sections/view/review-view.d.ts +8 -0
  112. package/dist/customize/sections/view/review-view.js +12 -1
  113. package/dist/customize/sections/view/secret-delivery.js +1 -4
  114. package/dist/customize/sections/view/secrets-view.d.ts +7 -1
  115. package/dist/customize/sections/view/secrets-view.js +42 -6
  116. package/dist/customize/settings/rail.js +2 -8
  117. package/dist/customize/settings/settings-tabs.d.ts +2 -2
  118. package/dist/customize/settings/settings-tabs.js +17 -19
  119. package/dist/customize/settings/tabs/experimental-tab.d.ts +3 -0
  120. package/dist/customize/settings/tabs/experimental-tab.js +6 -1
  121. package/dist/customize/settings/tabs/sandbox-tab.d.ts +4 -6
  122. package/dist/customize/settings/tabs/sandbox-tab.js +9 -9
  123. package/dist/customize/shared/access-list.d.ts +39 -0
  124. package/dist/customize/shared/access-list.js +62 -0
  125. package/dist/customize/shared/agent-resource-scope.d.ts +87 -0
  126. package/dist/customize/shared/agent-resource-scope.js +123 -0
  127. package/dist/customize/shared/capability-library.d.ts +41 -0
  128. package/dist/customize/shared/capability-library.js +271 -0
  129. package/dist/customize/shared/capability-page-shell.d.ts +18 -1
  130. package/dist/customize/shared/capability-page-shell.js +21 -1
  131. package/dist/customize/shared/catalog/catalog-space-tabs.d.ts +14 -0
  132. package/dist/customize/shared/catalog/catalog-space-tabs.js +20 -0
  133. package/dist/customize/shared/customize-tab-bar.d.ts +13 -0
  134. package/dist/customize/shared/customize-tab-bar.js +95 -0
  135. package/dist/customize/shared/entity/entity-modal.d.ts +17 -1
  136. package/dist/customize/shared/entity/entity-modal.js +10 -9
  137. package/dist/customize/shared/leave-guard.d.ts +23 -0
  138. package/dist/customize/shared/leave-guard.js +87 -0
  139. package/dist/customize/shared/standalone-settings-nav.js +4 -1
  140. package/dist/customize/shared/tool-rules.d.ts +11 -0
  141. package/dist/customize/shared/tool-rules.js +29 -0
  142. package/dist/customize/skills/builtin-skill-modal.d.ts +6 -0
  143. package/dist/customize/skills/builtin-skill-modal.js +41 -0
  144. package/dist/customize/skills/skills-page.d.ts +21 -18
  145. package/dist/customize/skills/skills-page.js +16 -110
  146. package/dist/customize/triggers/runtime-triggers.d.ts +17 -0
  147. package/dist/customize/triggers/runtime-triggers.js +57 -0
  148. package/dist/customize/triggers/schedule/event-trigger-copy.js +2 -2
  149. package/dist/customize/triggers/schedule/post-to-field.js +2 -2
  150. package/dist/customize/triggers/schedule/schedule-copy.d.ts +11 -6
  151. package/dist/customize/triggers/schedule/schedule-copy.js +29 -8
  152. package/dist/customize/triggers/schedule/schedule-detail-sheet.js +7 -3
  153. package/dist/customize/triggers/schedule/trigger-composer-logic.d.ts +26 -1
  154. package/dist/customize/triggers/schedule/trigger-composer-logic.js +64 -3
  155. package/dist/customize/triggers/schedule/trigger-composer.js +57 -20
  156. package/dist/customize/triggers/schedule/trigger-edit-logic.js +18 -5
  157. package/dist/customize/triggers/schedule/trigger-filter.d.ts +10 -0
  158. package/dist/customize/triggers/schedule/trigger-filter.js +16 -0
  159. package/dist/customize/triggers/schedule/trigger-runs-panel.js +1 -0
  160. package/dist/customize/triggers/schedule/trigger-toast.js +2 -1
  161. package/dist/customize/triggers/schedule/use-trigger-mutations.d.ts +1 -1
  162. package/dist/customize/triggers/schedule/use-trigger-mutations.js +1 -1
  163. package/dist/customize/triggers/schedule/when-app.d.ts +15 -0
  164. package/dist/customize/triggers/schedule/when-app.js +21 -0
  165. package/dist/customize/triggers/schedule/when-change-request.d.ts +10 -0
  166. package/dist/customize/triggers/schedule/when-change-request.js +15 -0
  167. package/dist/customize/triggers/schedule-view.d.ts +17 -3
  168. package/dist/customize/triggers/schedule-view.js +46 -16
  169. package/dist/customize/triggers/triggers-page.d.ts +3 -3
  170. package/dist/customize/triggers/triggers-page.js +2 -2
  171. package/dist/customize/use-configure-thread.d.ts +8 -2
  172. package/dist/customize/use-configure-thread.js +30 -18
  173. package/dist/files/project/components/change-request-detail-dialog.js +2 -3
  174. package/dist/files/project/components/drive-explorer.js +6 -5
  175. package/dist/files/project/explorer-source.d.ts +3 -0
  176. package/dist/files/project/upload-batch.d.ts +3 -3
  177. package/dist/files/project/upload-batch.js +7 -6
  178. package/dist/files/runtime/sandbox-explorer-source.js +3 -3
  179. package/dist/i18n/en.d.ts +1331 -53
  180. package/dist/i18n/en.js +1423 -145
  181. package/dist/i18n/ui-catalog/remaining-ui-translation-keys.generated.js +16 -7
  182. package/dist/internal/auth/auth-primitives.d.ts +1 -3
  183. package/dist/internal/auth/auth-primitives.js +2 -2
  184. package/dist/internal/billing/session-cost-format.d.ts +1 -0
  185. package/dist/internal/billing/session-cost-format.js +11 -0
  186. package/dist/internal/components/agent-mark.d.ts +12 -1
  187. package/dist/internal/components/agent-mark.js +34 -11
  188. package/dist/internal/components/nav-rail.d.ts +22 -0
  189. package/dist/internal/components/nav-rail.js +16 -0
  190. package/dist/internal/components/repository-disconnected.js +2 -2
  191. package/dist/internal/goals/goal-meta.d.ts +15 -1
  192. package/dist/internal/goals/goal-meta.js +42 -2
  193. package/dist/internal/hooks/projects/use-agent-config.d.ts +11 -7
  194. package/dist/internal/hooks/projects/use-agent-config.js +28 -11
  195. package/dist/internal/hooks/use-slash-focus.d.ts +7 -1
  196. package/dist/internal/hooks/use-slash-focus.js +9 -3
  197. package/dist/internal/layout/project-capability-nav.d.ts +24 -0
  198. package/dist/internal/layout/project-capability-nav.js +86 -0
  199. package/dist/internal/layout/project-page-header.d.ts +1 -1
  200. package/dist/internal/layout/project-page-header.js +1 -1
  201. package/dist/internal/layout/project-settings-nav.d.ts +3 -2
  202. package/dist/internal/layout/project-settings-nav.js +5 -3
  203. package/dist/internal/lib/browser-noise/rules/extensions.js +3 -0
  204. package/dist/internal/lib/browser-noise/rules/old-browsers.js +1 -1
  205. package/dist/internal/lib/capability-tab-routes.d.ts +34 -3
  206. package/dist/internal/lib/capability-tab-routes.js +76 -8
  207. package/dist/internal/lib/manifest-health.d.ts +10 -0
  208. package/dist/internal/lib/manifest-health.js +20 -0
  209. package/dist/internal/lib/pixel-mark.d.ts +4 -1
  210. package/dist/internal/lib/pixel-mark.js +33 -6
  211. package/dist/internal/lib/project-actions.d.ts +1 -1
  212. package/dist/internal/lib/project-actions.js +0 -4
  213. package/dist/internal/lib/provider-branding.js +2 -0
  214. package/dist/internal/lib/space-scope.d.ts +29 -0
  215. package/dist/internal/lib/space-scope.js +28 -0
  216. package/dist/internal/lib/use-project-feature-flags.js +3 -3
  217. package/dist/internal/lib/web-notifications.d.ts +74 -8
  218. package/dist/internal/lib/web-notifications.js +243 -117
  219. package/dist/internal/notifications/notification-rows.d.ts +14 -7
  220. package/dist/internal/notifications/notification-rows.js +21 -14
  221. package/dist/internal/notifications/session-toast-cards.d.ts +2 -2
  222. package/dist/internal/reminders/reminder-format.d.ts +6 -2
  223. package/dist/internal/reminders/reminder-format.js +7 -1
  224. package/dist/internal/stores/active-space-store.d.ts +35 -0
  225. package/dist/internal/stores/active-space-store.js +29 -0
  226. package/dist/internal/stores/kortix-computer-store.d.ts +2 -1
  227. package/dist/internal/stores/kortix-computer-store.js +18 -7
  228. package/dist/internal/stores/pinned-agents-store.d.ts +26 -0
  229. package/dist/internal/stores/pinned-agents-store.js +20 -0
  230. package/dist/internal/stores/session-panel-memory-store.js +3 -0
  231. package/dist/internal/stores/turn-attention-store.d.ts +5 -4
  232. package/dist/lib/routes.d.ts +16 -1
  233. package/dist/lib/routes.js +15 -3
  234. package/dist/markdown/doc-editor/doc-embed.d.ts +31 -0
  235. package/dist/markdown/doc-editor/doc-embed.js +168 -0
  236. package/dist/markdown/doc-editor/doc-extensions.d.ts +26 -0
  237. package/dist/markdown/doc-editor/doc-extensions.js +149 -0
  238. package/dist/markdown/doc-editor/doc-menus.d.ts +9 -0
  239. package/dist/markdown/doc-editor/doc-menus.js +56 -0
  240. package/dist/markdown/doc-editor/markdown.d.ts +12 -0
  241. package/dist/markdown/doc-editor/markdown.js +140 -0
  242. package/dist/markdown/genui/components/inline.d.ts +1 -1
  243. package/dist/primitives/badge.d.ts +1 -1
  244. package/dist/primitives/button.d.ts +1 -1
  245. package/dist/primitives/pixel-kortix-mark.d.ts +5 -4
  246. package/dist/primitives/pixel-kortix-mark.js +5 -15
  247. package/dist/primitives/tag.d.ts +1 -1
  248. package/dist/primitives/textarea.js +14 -0
  249. package/dist/primitives/toast.d.ts +2 -0
  250. package/dist/primitives/toast.js +4 -2
  251. package/dist/providers/ui-provider.d.ts +16 -0
  252. package/dist/session/actions/session-label.d.ts +1 -1
  253. package/dist/session/actions/session-label.js +3 -3
  254. package/dist/session/agents/agent-model.d.ts +92 -0
  255. package/dist/session/agents/agent-model.js +123 -0
  256. package/dist/session/agents/agent-state-mark.d.ts +10 -0
  257. package/dist/session/agents/agent-state-mark.js +22 -0
  258. package/dist/session/agents/agent-strip.d.ts +58 -0
  259. package/dist/session/agents/agent-strip.js +259 -0
  260. package/dist/session/agents/held-messages.d.ts +33 -0
  261. package/dist/session/agents/held-messages.js +50 -0
  262. package/dist/session/agents/legacy-subagent-chat.d.ts +11 -0
  263. package/dist/session/agents/legacy-subagent-chat.js +19 -0
  264. package/dist/session/agents/session-peek.d.ts +20 -0
  265. package/dist/session/agents/session-peek.js +67 -0
  266. package/dist/session/agents/session-prompt.d.ts +13 -0
  267. package/dist/session/agents/session-prompt.js +18 -0
  268. package/dist/session/agents/steer-session.d.ts +13 -0
  269. package/dist/session/agents/steer-session.js +29 -0
  270. package/dist/session/agents/subagent-dialog-content.d.ts +11 -0
  271. package/dist/session/agents/subagent-dialog-content.js +115 -0
  272. package/dist/session/agents/subagent-view.d.ts +8 -0
  273. package/dist/session/agents/subagent-view.js +18 -0
  274. package/dist/session/agents/tasks-panel.d.ts +13 -0
  275. package/dist/session/agents/tasks-panel.js +41 -0
  276. package/dist/session/agents/workflow-run-controls.d.ts +43 -0
  277. package/dist/session/agents/workflow-run-controls.js +141 -0
  278. package/dist/session/composer/ComposerCard.d.ts +1 -1
  279. package/dist/session/composer/ComposerCard.js +3 -3
  280. package/dist/session/composer/agent-selector.js +13 -19
  281. package/dist/session/composer/composer-underbar.d.ts +3 -1
  282. package/dist/session/composer/composer-underbar.js +2 -2
  283. package/dist/session/composer/composer.d.ts +5 -0
  284. package/dist/session/composer/composer.js +16 -10
  285. package/dist/session/composer/editor/composer-editor.js +19 -8
  286. package/dist/session/composer/editor/ultracode.d.ts +34 -0
  287. package/dist/session/composer/editor/ultracode.js +127 -0
  288. package/dist/session/composer/index.d.ts +1 -0
  289. package/dist/session/composer/index.js +1 -0
  290. package/dist/session/composer/send-blockers.d.ts +1 -11
  291. package/dist/session/composer/send-blockers.js +1 -11
  292. package/dist/session/composer/session-composer-readiness.d.ts +1 -28
  293. package/dist/session/composer/session-composer-readiness.js +5 -16
  294. package/dist/session/header/reminder-parts.d.ts +1 -1
  295. package/dist/session/header/session-site-header.js +6 -3
  296. package/dist/session/header/subagent-hover-card.d.ts +0 -2
  297. package/dist/session/header/subagent-hover-card.js +1 -4
  298. package/dist/session/models/claude-connection-slot.d.ts +11 -0
  299. package/dist/session/models/claude-connection-slot.js +30 -0
  300. package/dist/session/models/model-availability.d.ts +3 -1
  301. package/dist/session/models/model-availability.js +3 -0
  302. package/dist/session/models/model-selector.js +11 -12
  303. package/dist/session/models/model-tags.d.ts +9 -0
  304. package/dist/session/models/model-tags.js +8 -0
  305. package/dist/session/panel/easy/detail-view.js +7 -0
  306. package/dist/session/panel/easy/easy-panel.js +1 -1
  307. package/dist/session/panel/easy/step-icon.js +5 -1
  308. package/dist/session/panel/mobile-tool-drawer.js +7 -3
  309. package/dist/session/panel/open-session-quick-view.js +1 -1
  310. package/dist/session/panel/session-action-panel-column.js +1 -1
  311. package/dist/session/panel/session-desktop.js +41 -14
  312. package/dist/session/panel/session-panel-provider.d.ts +1 -1
  313. package/dist/session/panel/session-panel-provider.js +7 -11
  314. package/dist/session/prompts/question-prompt.js +3 -1
  315. package/dist/session/status/session-error-banner.js +4 -1
  316. package/dist/session/thread/session-chat.js +286 -296
  317. package/dist/session/thread/session-context-modal.js +29 -10
  318. package/dist/session/thread/session-context-spawned-sessions.d.ts +13 -0
  319. package/dist/session/thread/session-context-spawned-sessions.js +44 -0
  320. package/dist/session/thread/session-context-sub-sessions.js +3 -8
  321. package/dist/session/thread/transcript.d.ts +3 -0
  322. package/dist/session/thread/transcript.js +32 -8
  323. package/dist/session/tool/shared/full-view-action.d.ts +29 -0
  324. package/dist/session/tool/shared/full-view-action.js +43 -0
  325. package/dist/session/tool/tool-part-renderer.js +10 -2
  326. package/dist/session/tool/tools/agent-message-tool.js +2 -2
  327. package/dist/session/tool/tools/agent-spawn-tool.js +2 -2
  328. package/dist/session/tool/tools/agent-status-tool.js +2 -2
  329. package/dist/session/tool/tools/kortix-action-tool.d.ts +2 -0
  330. package/dist/session/tool/tools/kortix-action-tool.js +148 -0
  331. package/dist/session/tool/tools/kortix-tool-card.d.ts +83 -0
  332. package/dist/session/tool/tools/kortix-tool-card.js +186 -0
  333. package/dist/session/tool/tools/multi-agent-tool-bodies.d.ts +11 -0
  334. package/dist/session/tool/tools/multi-agent-tool-bodies.js +141 -0
  335. package/dist/session/tool/tools/multi-agent-tool-data.d.ts +63 -0
  336. package/dist/session/tool/tools/multi-agent-tool-data.js +118 -0
  337. package/dist/session/tool/tools/multi-agent-tools.d.ts +9 -0
  338. package/dist/session/tool/tools/multi-agent-tools.js +38 -0
  339. package/dist/session/tool/tools/question-tool.js +1 -1
  340. package/dist/session/tool/tools/register.d.ts +3 -0
  341. package/dist/session/tool/tools/register.js +3 -0
  342. package/dist/session/tool/tools/session-spawn-tool.js +2 -2
  343. package/dist/session/tool/tools/task-tool.d.ts +1 -1
  344. package/dist/session/tool/tools/task-tool.js +29 -41
  345. package/dist/session/tool/tools/workflow-progress.d.ts +34 -0
  346. package/dist/session/tool/tools/workflow-progress.js +186 -0
  347. package/dist/session/tool/tools/workflow-run.d.ts +128 -0
  348. package/dist/session/tool/tools/workflow-run.js +251 -0
  349. package/dist/session/tool/tools/workflow-tool.d.ts +9 -0
  350. package/dist/session/tool/tools/workflow-tool.js +253 -0
  351. package/dist/session/turn/notice-batch-group.d.ts +12 -0
  352. package/dist/session/turn/notice-batch-group.js +17 -0
  353. package/dist/session/turn/peer-message-row.d.ts +14 -0
  354. package/dist/session/turn/peer-message-row.js +57 -0
  355. package/dist/session/turn/subagent-notice-row.d.ts +4 -0
  356. package/dist/session/turn/subagent-notice-row.js +50 -0
  357. package/dist/session/turn/subagent-notice.d.ts +58 -0
  358. package/dist/session/turn/subagent-notice.js +111 -0
  359. package/dist/session/turn/user-message.d.ts +5 -4
  360. package/dist/session/turn/user-message.js +31 -10
  361. package/dist/styles/tokens.css +2 -0
  362. package/dist/styles.css +1 -1
  363. package/dist/terminal/session-terminal-connect-bar.js +1 -1
  364. package/dist/workspace/admin/project-admin-dashboard.d.ts +53 -0
  365. package/dist/workspace/admin/project-admin-dashboard.js +252 -0
  366. package/dist/workspace/admin/project-admin-nav.d.ts +20 -0
  367. package/dist/workspace/admin/project-admin-nav.js +41 -0
  368. package/dist/workspace/home/welcome-body.js +25 -3
  369. package/dist/workspace/index.d.ts +6 -2
  370. package/dist/workspace/index.js +12 -2
  371. package/dist/workspace/layout/new-session-create.js +3 -3
  372. package/dist/workspace/layout/project-home.js +3 -3
  373. package/dist/workspace/memory/memory-labels.js +5 -0
  374. package/dist/workspace/repository-disconnected.js +2 -2
  375. package/dist/workspace/sessions/board-dispatch.d.ts +52 -0
  376. package/dist/workspace/sessions/board-dispatch.js +110 -0
  377. package/dist/workspace/sessions/board-grouping.d.ts +63 -0
  378. package/dist/workspace/sessions/board-grouping.js +141 -0
  379. package/dist/workspace/sessions/board-peek.d.ts +15 -0
  380. package/dist/workspace/sessions/board-peek.js +54 -0
  381. package/dist/workspace/sessions/board-state-mark.d.ts +15 -0
  382. package/dist/workspace/sessions/board-state-mark.js +24 -0
  383. package/dist/workspace/sessions/project-sessions-view.js +42 -31
  384. package/dist/workspace/sessions/sessions-board.d.ts +12 -0
  385. package/dist/workspace/sessions/sessions-board.js +214 -0
  386. package/dist/workspace/sidebar/footer/project-manifest-issues-alert.d.ts +46 -0
  387. package/dist/workspace/sidebar/footer/project-manifest-issues-alert.js +85 -0
  388. package/dist/workspace/sidebar/footer/sidebar-alert.js +1 -1
  389. package/dist/workspace/sidebar/new-agent-modal-provider.d.ts +12 -0
  390. package/dist/workspace/sidebar/new-agent-modal-provider.js +19 -0
  391. package/dist/workspace/sidebar/project-nav-items.d.ts +3 -1
  392. package/dist/workspace/sidebar/project-nav-items.js +53 -5
  393. package/dist/workspace/sidebar/project-session-list.js +35 -12
  394. package/dist/workspace/sidebar/project-sidebar.js +6 -3
  395. package/dist/workspace/sidebar/session-filter-menu.js +2 -1
  396. package/dist/workspace/space/space-blocks.d.ts +25 -0
  397. package/dist/workspace/space/space-blocks.js +124 -0
  398. package/dist/workspace/space/space-filter-tabs.d.ts +17 -0
  399. package/dist/workspace/space/space-filter-tabs.js +31 -0
  400. package/dist/workspace/space/space-page.d.ts +24 -0
  401. package/dist/workspace/space/space-page.js +157 -0
  402. package/dist/workspace/space/space-room.d.ts +20 -0
  403. package/dist/workspace/space/space-room.js +27 -0
  404. package/dist/workspace/space/space-tab-menu.d.ts +14 -0
  405. package/dist/workspace/space/space-tab-menu.js +127 -0
  406. package/dist/workspace/space/space-tab-panels.d.ts +9 -0
  407. package/dist/workspace/space/space-tab-panels.js +203 -0
  408. package/dist/workspace/space/space-templates.d.ts +34 -0
  409. package/dist/workspace/space/space-templates.js +71 -0
  410. package/dist/workspace/space/use-space-filter.d.ts +10 -0
  411. package/dist/workspace/space/use-space-filter.js +40 -0
  412. package/dist/workspace/space/use-space-manifest.d.ts +8 -0
  413. package/dist/workspace/space/use-space-manifest.js +27 -0
  414. package/dist/workspace/spaces/space-timeline.js +2 -2
  415. package/package.json +56 -53
  416. package/skills/kortix-ui/SKILL.md +1 -1
  417. package/skills/kortix-ui/references/custom-dashboard.md +10 -4
  418. package/skills/kortix-ui/references/modules.md +11 -9
  419. package/dist/_vendor/shared/meta-agent.d.ts +0 -7
  420. package/dist/customize/agents/agent-grant-pages.d.ts +0 -37
  421. package/dist/customize/agents/agent-grant-pages.js +0 -226
  422. package/dist/customize/agents/agent-triggers-section.d.ts +0 -17
  423. package/dist/customize/agents/agent-triggers-section.js +0 -109
  424. package/dist/customize/migrate-to-v2/index.d.ts +0 -5
  425. package/dist/customize/migrate-to-v2/index.js +0 -5
  426. package/dist/customize/migrate-to-v2/migration-prompt.d.ts +0 -16
  427. package/dist/customize/migrate-to-v2/migration-prompt.js +0 -59
  428. package/dist/customize/migrate-to-v2/upgrade-defs.d.ts +0 -30
  429. package/dist/customize/migrate-to-v2/upgrade-defs.js +0 -43
  430. package/dist/customize/migrate-to-v2/upgrade-view.d.ts +0 -32
  431. package/dist/customize/migrate-to-v2/upgrade-view.js +0 -152
  432. package/dist/customize/migrate-to-v2/use-run-upgrade.d.ts +0 -18
  433. package/dist/customize/migrate-to-v2/use-run-upgrade.js +0 -16
  434. package/dist/customize/shared/capability-tabs.d.ts +0 -3
  435. package/dist/customize/shared/capability-tabs.js +0 -137
  436. package/dist/customize/skills/skill-scope.d.ts +0 -14
  437. package/dist/customize/skills/skill-scope.js +0 -18
  438. package/dist/internal/lib/manifest-version.d.ts +0 -21
  439. package/dist/internal/lib/manifest-version.js +0 -55
  440. package/dist/session/composer/hooks/use-composer-escape-stop.d.ts +0 -6
  441. package/dist/session/composer/hooks/use-composer-escape-stop.js +0 -28
  442. package/dist/session/thread/sub-session-modal-content.d.ts +0 -8
  443. package/dist/session/thread/sub-session-modal-content.js +0 -23
  444. package/dist/session/thread/sub-session-modal.d.ts +0 -2
  445. package/dist/session/thread/sub-session-modal.js +0 -14
  446. package/dist/workspace/sidebar/footer/project-manifest-upgrade-alert.d.ts +0 -13
  447. package/dist/workspace/sidebar/footer/project-manifest-upgrade-alert.js +0 -48
@@ -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 {};
@@ -0,0 +1,50 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Button } from '../../primitives/button.js';
4
+ import { SessionDotMatrix } from '../../primitives/dot-matrix/session-dot-matrix.js';
5
+ import { errorToast } from '../../primitives/toast.js';
6
+ import { useTranslations } from '../../i18n/index.js';
7
+ import { ChatCircleDotsIcon } from '@phosphor-icons/react';
8
+ import { peerHandleLabel } from '../../_vendor/kortix-shared.js';
9
+ import { usePeerMessages } from '@kortix/sdk/react';
10
+ /**
11
+ * Messages from other sessions that wait for the person (`inbound: hold`, or a
12
+ * session the person asked to approve first). Claude Code opens an approval
13
+ * dialog with the sender and a preview; Kortix shows one card per message above
14
+ * the agent strip. "Approve message" delivers it, "Deny" drops it. A message
15
+ * nobody decides expires after 5 minutes on the server.
16
+ */
17
+ /** The preview line: the sender's summary, else the message's first line. */
18
+ export function heldPreview(message) {
19
+ const summary = message.summary?.trim();
20
+ if (summary)
21
+ return summary;
22
+ const first = message.message.trim().split('\n')[0] ?? '';
23
+ return first.length > 200 ? `${first.slice(0, 200)}…` : first;
24
+ }
25
+ export function HeldMessageCard({ message, pending, onApprove, onDeny }) {
26
+ const t = useTranslations('multiAgent.held');
27
+ const kind = message.type === 'shutdown_request' ? 'titleShutdown' : 'title';
28
+ return (_jsxs("div", { "data-held-message": message.id, className: "bg-popover flex items-start gap-2.5 rounded-md border px-3 py-2.5 text-xs", children: [_jsx(ChatCircleDotsIcon, { "aria-hidden": true, className: "text-muted-foreground mt-0.5 size-4 shrink-0" }), _jsxs("div", { className: "min-w-0 flex-1 space-y-0.5", children: [_jsx("p", { className: "text-foreground text-sm font-medium", children: t(kind, { from: peerHandleLabel(message.from_handle) }) }), _jsx("p", { className: "text-foreground line-clamp-2 wrap-break-word", children: heldPreview(message) }), _jsx("p", { className: "text-muted-foreground", children: t('waiting') })] }), _jsxs("div", { className: "flex shrink-0 items-center gap-1.5", children: [_jsxs(Button, { type: "button", size: "xs", variant: "outline-ghost", disabled: pending !== null, onClick: onDeny, children: [pending === 'deny' ? _jsx(SessionDotMatrix, { size: 14, className: "shrink-0" }) : null, t('deny')] }), _jsxs(Button, { type: "button", size: "xs", disabled: pending !== null, onClick: onApprove, children: [pending === 'approve' ? _jsx(SessionDotMatrix, { size: 14, className: "shrink-0" }) : null, t('approve')] })] })] }));
29
+ }
30
+ /** The held messages of `usePeerMessages(…, 'in')`, one card each; nothing when none waits. */
31
+ export function HeldMessageList({ messages, approve, deny, }) {
32
+ const t = useTranslations('multiAgent.held');
33
+ const held = heldMessages(messages);
34
+ if (held.length === 0)
35
+ return null;
36
+ const pendingFor = (id) => approve.isPending && approve.variables === id ? 'approve' : deny.isPending && deny.variables === id ? 'deny' : null;
37
+ const fail = (key) => (error) => errorToast(t(key), { description: error instanceof Error ? error.message : undefined });
38
+ return (_jsx("div", { "aria-label": t('label'), role: "group", className: "space-y-1.5", children: held.map((message) => (_jsx(HeldMessageCard, { message: message, pending: pendingFor(message.id), onApprove: () => approve.mutate(message.id, { onError: fail('approveFailed') }), onDeny: () => deny.mutate(message.id, { onError: fail('denyFailed') }) }, message.id))) }));
39
+ }
40
+ /** The messages that wait for the person, oldest first (the order they arrived). */
41
+ export function heldMessages(messages) {
42
+ return (messages ?? [])
43
+ .filter((message) => message.status === 'held')
44
+ .sort((a, b) => Date.parse(a.created_at) - Date.parse(b.created_at));
45
+ }
46
+ /** A session's held messages, read on their own (for a host without the agent strip). */
47
+ export function HeldMessages({ projectId, sessionId }) {
48
+ const { data, approve, deny } = usePeerMessages(projectId, sessionId, 'in');
49
+ return _jsx(HeldMessageList, { messages: data, approve: approve, deny: deny });
50
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * The body of a sub-agent that is not a Kortix session of its own: an
3
+ * in-process child (`session: "same"`) or an old OpenCode subagent, whose
4
+ * transcript lives in its lead's computer and saved history. It mounts the
5
+ * read-only `SessionChat` of that child under the lead's saved-history scope,
6
+ * so it paints while the computer is off. Every child that is its own project
7
+ * session reads `SessionPeek` instead (`subagent-dialog-content.tsx`).
8
+ */
9
+ export declare function LegacySubagentChat({ sessionId }: {
10
+ sessionId: string;
11
+ }): import("react").JSX.Element;
@@ -0,0 +1,19 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { SessionChat } from '../thread/session-chat.js';
4
+ import { useSessionIds } from '../../providers/session-ids.js';
5
+ /**
6
+ * The body of a sub-agent that is not a Kortix session of its own: an
7
+ * in-process child (`session: "same"`) or an old OpenCode subagent, whose
8
+ * transcript lives in its lead's computer and saved history. It mounts the
9
+ * read-only `SessionChat` of that child under the lead's saved-history scope,
10
+ * so it paints while the computer is off. Every child that is its own project
11
+ * session reads `SessionPeek` instead (`subagent-dialog-content.tsx`).
12
+ */
13
+ export function LegacySubagentChat({ sessionId }) {
14
+ // The session page this sub-agent runs under. Its saved history holds the
15
+ // sub-agent's transcript too.
16
+ const ids = useSessionIds();
17
+ const savedHistoryScope = ids.projectId && ids.sessionId ? `${ids.projectId}/${ids.sessionId}` : undefined;
18
+ return _jsx(SessionChat, { sessionId: sessionId, hideHeader: true, readOnly: true, initialScrollTop: true, savedHistoryScope: savedHistoryScope });
19
+ }
@@ -0,0 +1,20 @@
1
+ import '../tool/tools/register.js';
2
+ /**
3
+ * The transcript of another session, read-only, from the API alone
4
+ * (`useSessionView`): its log and its stream. It never starts the session and
5
+ * never points the app's runtime at the session's box, so it can sit beside
6
+ * the session page that owns the runtime: a sub-agent's dialog over its lead's
7
+ * chat, the board's preview. Never blank: a skeleton while the log loads, an
8
+ * error with "Try again", "Nothing yet" for a session with no message.
9
+ */
10
+ export declare function SessionPeek({ projectId, sessionId, working, onActivity, density, className, }: {
11
+ projectId: string;
12
+ sessionId: string;
13
+ /** The session works now: its last turn shows the agent's busy row. */
14
+ working?: boolean;
15
+ /** Called when a message arrives or changes count: the host re-reads the session's state. */
16
+ onActivity?: () => void;
17
+ /** `compact`: the narrow gutters of a side sheet, as `SessionThread`'s density. */
18
+ density?: 'default' | 'compact';
19
+ className?: string;
20
+ }): import("react").JSX.Element;
@@ -0,0 +1,67 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { sessionLogTurns } from '@kortix/sdk';
4
+ import { useSessionView } from '@kortix/sdk/react';
5
+ import { ChatsCircleIcon } from '@phosphor-icons/react';
6
+ import { useEffect, useLayoutEffect, useMemo, useRef } from 'react';
7
+ import { useTranslations } from '../../i18n/index.js';
8
+ import { ProjectScope } from '../../internal/project-scope.js';
9
+ import { cn } from '../../lib/utils.js';
10
+ import { Button } from '../../primitives/button.js';
11
+ import { EmptyState } from '../../primitives/empty-state.js';
12
+ import { ErrorState } from '../../primitives/error-state.js';
13
+ import Loading from '../../primitives/loading.js';
14
+ import { Skeleton } from '../../primitives/skeleton.js';
15
+ import { SessionTurn } from '../thread/transcript.js';
16
+ import { SESSION_TRANSCRIPT_CLASS } from '../thread/session-transcript-class.js';
17
+ import '../tool/tools/register.js';
18
+ /** The live thread is read at most once per this window while a turn streams. */
19
+ const PEEK_THROTTLE_MS = 100;
20
+ const NO_REQUESTS = [];
21
+ const noop = () => { };
22
+ const noopAsync = async () => { };
23
+ /** A view rewinds nothing: every turn's history control stays off. */
24
+ const TURN_OUTCOME = {};
25
+ /**
26
+ * The transcript of another session, read-only, from the API alone
27
+ * (`useSessionView`): its log and its stream. It never starts the session and
28
+ * never points the app's runtime at the session's box, so it can sit beside
29
+ * the session page that owns the runtime: a sub-agent's dialog over its lead's
30
+ * chat, the board's preview. Never blank: a skeleton while the log loads, an
31
+ * error with "Try again", "Nothing yet" for a session with no message.
32
+ */
33
+ export function SessionPeek({ projectId, sessionId, working = false, onActivity, density = 'default', className, }) {
34
+ const t = useTranslations('multiAgent.subagent');
35
+ const view = useSessionView(projectId, sessionId, { throttleMs: PEEK_THROTTLE_MS });
36
+ const turns = useMemo(() => (view.thread ? sessionLogTurns(view.thread, { foldCompactions: true, busy: working }) : []), [view.thread, working]);
37
+ const scrollRef = useRef(null);
38
+ const pinned = useRef(true);
39
+ // Open at the newest message, and follow new ones while the reader sits at the bottom.
40
+ useLayoutEffect(() => {
41
+ const node = scrollRef.current;
42
+ if (node && pinned.current)
43
+ node.scrollTop = node.scrollHeight;
44
+ }, [turns]);
45
+ useEffect(() => {
46
+ pinned.current = true;
47
+ }, [sessionId]);
48
+ const count = view.thread?.messages.length ?? 0;
49
+ const activity = useRef(onActivity);
50
+ useEffect(() => {
51
+ activity.current = onActivity;
52
+ });
53
+ useEffect(() => {
54
+ if (count > 0)
55
+ activity.current?.();
56
+ }, [count]);
57
+ return (_jsx("div", { "data-testid": "session-peek", "data-status": view.status, "data-density": density, className: cn('group/thread flex min-h-0 flex-1 flex-col', className), children: view.status === 'loading' ? (_jsxs("div", { className: cn(SESSION_TRANSCRIPT_CLASS, 'space-y-4'), "aria-busy": "true", children: [_jsx(Skeleton, { className: "ml-auto h-9 w-2/5 rounded-xl" }), _jsx(Skeleton, { className: "h-4 w-4/5" }), _jsx(Skeleton, { className: "h-4 w-3/5" }), _jsx(Skeleton, { className: "h-4 w-2/3" })] })) : view.status === 'error' ? (_jsx("div", { className: "flex flex-1 items-center justify-center p-6", children: _jsx(ErrorState, { size: "sm", title: t('loadFailed'), action: _jsx(Button, { variant: "outline", size: "sm", onClick: view.retry, children: t('retry') }) }) })) : view.status === 'empty' ? (_jsx("div", { className: "flex flex-1 items-center justify-center p-6", children: _jsx(EmptyState, { size: "sm", icon: ChatsCircleIcon, title: t('emptyTitle'), description: t('emptyDescription') }) })) : (_jsx(ProjectScope, { projectId: projectId, sessionId: sessionId, children: _jsx("div", { ref: scrollRef, onScroll: (event) => {
58
+ const node = event.currentTarget;
59
+ pinned.current = node.scrollHeight - node.scrollTop - node.clientHeight < 48;
60
+ }, className: "min-h-0 flex-1 overflow-y-auto", children: _jsxs("div", { className: cn(SESSION_TRANSCRIPT_CLASS, 'pb-6'), children: [view.hasOlder && (_jsx("div", { className: "mb-4 flex justify-center", children: _jsxs(Button, { variant: "ghost", size: "xs", disabled: view.isLoadingOlder, onClick: () => {
61
+ pinned.current = false;
62
+ void view.loadOlder();
63
+ }, className: "text-muted-foreground", children: [view.isLoadingOlder && _jsx(Loading, { className: "size-3 shrink-0" }), t('loadOlder')] }) })), _jsx("div", { className: "space-y-6", children: turns.map((turn, index) => {
64
+ const last = index === turns.length - 1;
65
+ return (_jsx(SessionTurn, { turn: turn, turnOutcome: TURN_OUTCOME, sessionId: view.thread?.thread_id ?? sessionId, sessionStatus: undefined, isLast: last, ownsPlan: false, permissions: NO_REQUESTS, questions: NO_REQUESTS, isFirstTurn: index === 0, sessionWorking: working, isWorkingTurn: last && working, suppressBusyIndicator: false, awaitingUser: false, pending: false, disableToolNavigation: true, onPermissionReply: noopAsync, onRewind: noop, rewindDisabled: true }, turn.id));
66
+ }) })] }) }) })) }));
67
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Send a prompt into the open session from a control that is not the composer
3
+ * ("Save as workflow"). The session chat provides its own send path, so the
4
+ * prompt goes out exactly as a typed one: a running turn is steered, an idle
5
+ * session starts a turn, and the composer's draft is left alone.
6
+ */
7
+ export type SessionPromptSend = (text: string) => unknown;
8
+ export declare const SessionPromptContext: import("react").Context<SessionPromptSend | null>;
9
+ /**
10
+ * The session's own send, or, outside a session chat, the composer prefill: the
11
+ * text lands in the composer of `sessionId` for the person to send.
12
+ */
13
+ export declare function useSessionPromptSend(sessionId: string | undefined): SessionPromptSend | null;
@@ -0,0 +1,18 @@
1
+ 'use client';
2
+ import { createContext, useCallback, useContext } from 'react';
3
+ import { useSessionComposerPrefillStore } from '../composer/stores/session-composer-prefill-store.js';
4
+ export const SessionPromptContext = createContext(null);
5
+ /**
6
+ * The session's own send, or, outside a session chat, the composer prefill: the
7
+ * text lands in the composer of `sessionId` for the person to send.
8
+ */
9
+ export function useSessionPromptSend(sessionId) {
10
+ const send = useContext(SessionPromptContext);
11
+ const prefill = useCallback((text) => {
12
+ if (sessionId)
13
+ useSessionComposerPrefillStore.getState().setPrefill(sessionId, text);
14
+ }, [sessionId]);
15
+ if (send)
16
+ return send;
17
+ return sessionId ? prefill : null;
18
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Send a message to another session through the API's prompt route, as a steer:
3
+ * a running turn reads it at its next step, an idle session starts a turn. It
4
+ * needs no runtime of its own, so a host can message a sub-agent or a board row
5
+ * from beside the session that owns the app's runtime.
6
+ */
7
+ export declare function useSteerSession(projectId: string | undefined, options?: {
8
+ onSent?: () => void;
9
+ onError?: (error: unknown) => void;
10
+ }): import("@tanstack/react-query").UseMutationResult<import("@kortix/sdk").CreateSessionPromptResult, Error, {
11
+ sessionId: string;
12
+ text: string;
13
+ }, unknown>;
@@ -0,0 +1,29 @@
1
+ 'use client';
2
+ import { createSessionPrompt, mintWireMessageId } from '@kortix/sdk';
3
+ import { useMutation } from '@tanstack/react-query';
4
+ /**
5
+ * Send a message to another session through the API's prompt route, as a steer:
6
+ * a running turn reads it at its next step, an idle session starts a turn. It
7
+ * needs no runtime of its own, so a host can message a sub-agent or a board row
8
+ * from beside the session that owns the app's runtime.
9
+ */
10
+ export function useSteerSession(projectId, options = {}) {
11
+ return useMutation({
12
+ mutationFn: async ({ sessionId, text }) => {
13
+ if (!projectId)
14
+ throw new Error('No project');
15
+ // Minted with no transcript to place it against: the server places it at delivery.
16
+ const messageId = mintWireMessageId();
17
+ return createSessionPrompt(projectId, sessionId, {
18
+ clientMessageId: messageId,
19
+ messageId,
20
+ remintOnDelivery: true,
21
+ delivery: 'steer',
22
+ parts: [{ type: 'text', text }],
23
+ clientSentAtMs: Date.now(),
24
+ });
25
+ },
26
+ onSuccess: () => options.onSent?.(),
27
+ onError: (error) => options.onError?.(error),
28
+ });
29
+ }
@@ -0,0 +1,11 @@
1
+ export interface SubagentDialogProps {
2
+ open: boolean;
3
+ onOpenChange: (open: boolean) => void;
4
+ /** The child session: a Kortix project session, or an in-process child's runtime id. */
5
+ sessionId: string;
6
+ /** What the opener calls it; the session's own handle wins once its row loads. */
7
+ title?: string;
8
+ /** The project; default: the project of the session page the dialog opens over. */
9
+ projectId?: string;
10
+ }
11
+ export declare function SubagentDialogContent({ open, onOpenChange, sessionId, title, projectId: projectIdProp }: SubagentDialogProps): import("react").JSX.Element;