@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
@@ -14,10 +14,10 @@ import { useSessionIds } from '../../providers/session-ids.js';
14
14
  import { useUiComponents } from '../../providers/ui-provider.js';
15
15
  import { Fragment, useCallback, useEffect, useMemo, useState } from 'react';
16
16
  import { ModelSearchEmpty } from './model-search-empty.js';
17
- import { isRunnableModel, resolveAvailableSelectedModel, unavailableModelConnection, } from './model-availability.js';
17
+ import { resolveAvailableSelectedModel, unavailableModelConnection, } from './model-availability.js';
18
18
  import { isPickerGroupOpen, modelItemValue, pickerGroupId, pickerGroupLabel, buildPickerSections, splitModelLabel, } from './model-grouping.js';
19
19
  import { modelInDefaultView } from '@kortix/sdk';
20
- import { isSubscriptionModel, pickerModelName, shouldShowFreeTag } from './model-tags.js';
20
+ import { isClaudeSubscriptionModel, isSubscriptionModel, pickerModelName, shouldShowFreeTag } from './model-tags.js';
21
21
  import { useModelConnectionGate } from './use-model-connection-gate.js';
22
22
  // Re-export for consumers
23
23
  export { Tag };
@@ -199,6 +199,9 @@ export function ModelSelector({ models, selectedModel, onSelect, defaultControls
199
199
  const q = search.toLowerCase();
200
200
  return models
201
201
  .filter((m) => m.enabled !== false &&
202
+ // Claude subscription models appear once the member signed in to Claude
203
+ // (Customize → Models → Anthropic), like ChatGPT subscription models.
204
+ !(isClaudeSubscriptionModel(m) && m.available === false) &&
202
205
  (!q ||
203
206
  (m.modelName || '').toLowerCase().includes(q) ||
204
207
  (m.modelID || '').toLowerCase().includes(q) ||
@@ -213,10 +216,7 @@ export function ModelSelector({ models, selectedModel, onSelect, defaultControls
213
216
  /** Is there anything to pick AT ALL, ignoring the search box? The empty
214
217
  * state below branches on this: "no models match your search" and "you have
215
218
  * no models" are different problems with different ways out. */
216
- const hasAnyModel = useMemo(() => models.some((m) => m.enabled !== false), [models]);
217
- /** Does this member already have ChatGPT subscription models? Then the row
218
- * manages their accounts instead of offering to connect one. */
219
- const hasChatGptModels = useMemo(() => models.some((m) => isRunnableModel(m) && pickerGroupId(m) === 'codex'), [models]);
219
+ const hasAnyModel = useMemo(() => models.some((m) => m.enabled !== false && !(isClaudeSubscriptionModel(m) && m.available === false)), [models]);
220
220
  const grouped = useMemo(() => {
221
221
  const groups = new Map();
222
222
  for (const m of visibleModels) {
@@ -295,7 +295,8 @@ export function ModelSelector({ models, selectedModel, onSelect, defaultControls
295
295
  const connect = unavailableModelConnection(model, { chatGptAvailable });
296
296
  if (connect === 'chatgpt')
297
297
  return handleOpenChatGpt();
298
- if (connect === 'provider')
298
+ // A Claude model signs in under Anthropic, in the provider list.
299
+ if (connect === 'claude' || connect === 'provider')
299
300
  return handleOpenProviderModal('providers');
300
301
  onSelect({ providerID: model.providerID, modelID: model.modelID });
301
302
  setOpen(false);
@@ -327,15 +328,13 @@ export function ModelSelector({ models, selectedModel, onSelect, defaultControls
327
328
  section.models.map((model) => (_jsx(ModelRow, { model: model, groupProviderID: section.providerID, groupProviderName: section.label, isSelected: availableSelectedModel?.providerID === model.providerID &&
328
329
  availableSelectedModel?.modelID === model.modelID, isAccountDefault: defaultControls?.accountDefault?.providerID === model.providerID &&
329
330
  defaultControls?.accountDefault?.modelID === model.modelID, defaultControls: rowDefaultControls, onSelect: handleSelect, connectLabel: tPooled('connect'), scope: "model", showSubscriptionTag: false }, `${section.id}:${model.providerID}:${model.modelID}`)))] })] }, section.id));
330
- }), chatGptAvailable && !searching && (_jsxs(_Fragment, { children: [_jsx(CommandSeparator, {}), _jsx(CommandGroup, { forceMount: true, children: _jsxs(CommandItem, { value: "chatgpt-subscription", onSelect: handleOpenChatGpt, className: "cursor-pointer", children: [_jsx(ProviderLogo, { providerID: "codex", name: "ChatGPT", size: "small", className: "size-4 rounded-none bg-transparent" }), _jsx("span", { className: "text-foreground min-w-0 flex-1 truncate text-sm font-medium", children: hasChatGptModels
331
- ? tPooled('manageChatGptAccounts')
332
- : tPooled('useYourChatGpt') }), !hasChatGptModels && (_jsx("span", { className: "text-muted-foreground text-xs", children: tPooled('connect') }))] }) })] }))] })) : hasAnyModel ? (
331
+ })] })) : hasAnyModel ? (
333
332
  /* Models ARE connected — the SEARCH matched none of them.
334
333
  `grouped` is built from `visibleModels`, which is already
335
334
  filtered by `search`, so the branch below could not tell the
336
335
  two apart: typing "zzz" with 40 models connected showed
337
336
  "No models available" and a Connect-provider CTA. */
338
- _jsx(ModelSearchEmpty, { search: search, modelCount: models.filter((model) => model.enabled !== false).length, onClear: () => setSearch(''), onUpgrade: showUpgradeOption ? handleUpgrade : undefined })) : (_jsxs("div", { className: "px-3 py-5 text-center", children: [_jsx("div", { className: "text-foreground text-sm font-medium", children: tModel('empty.title') }), _jsx("p", { className: "text-muted-foreground mx-auto mt-1 max-w-[220px] text-xs leading-5", children: showUpgradeOption
337
+ _jsx(ModelSearchEmpty, { search: search, modelCount: models.filter((model) => model.enabled !== false && !(isClaudeSubscriptionModel(model) && model.available === false)).length, onClear: () => setSearch(''), onUpgrade: showUpgradeOption ? handleUpgrade : undefined })) : (_jsxs("div", { className: "px-3 py-5 text-center", children: [_jsx("div", { className: "text-foreground text-sm font-medium", children: tModel('empty.title') }), _jsx("p", { className: "text-muted-foreground mx-auto mt-1 max-w-[220px] text-xs leading-5", children: showUpgradeOption
339
338
  ? tModel('empty.upgradeDescription')
340
- : tModel('empty.description') }), _jsxs("div", { className: "mt-4 flex items-center justify-center gap-2", children: [showUpgradeOption && (_jsxs(Button, { type: "button", size: "xs", onClick: handleUpgrade, children: [_jsx(CreditCard, { className: "size-3.5" }), tModel('upgrade')] })), canConnectProvider && (_jsxs(Button, { type: "button", size: "xs", variant: showUpgradeOption ? 'outline' : 'default', onClick: () => handleOpenProviderModal('providers'), children: [_jsx(KeyRound, { className: "size-3.5" }), tModel('connectProvider')] })), chatGptAvailable && (_jsx(Button, { type: "button", size: "xs", variant: "outline", onClick: handleOpenChatGpt, children: tPooled('connectChatGpt') }))] })] })) })] }) })] })] }));
339
+ : tModel('empty.description') }), _jsxs("div", { className: "mt-4 flex items-center justify-center gap-2", children: [showUpgradeOption && (_jsxs(Button, { type: "button", size: "xs", onClick: handleUpgrade, children: [_jsx(CreditCard, { className: "size-3.5" }), tModel('upgrade')] })), canConnectProvider && (_jsxs(Button, { type: "button", size: "xs", variant: showUpgradeOption ? 'outline' : 'default', onClick: () => handleOpenProviderModal('providers'), children: [_jsx(KeyRound, { className: "size-3.5" }), tModel('connectProvider')] }))] })] })) })] }) })] })] }));
341
340
  }
@@ -9,6 +9,15 @@ export declare function shouldShowFreeTag(model: Pick<FlatModel, 'free' | 'model
9
9
  export declare function isSubscriptionModel(model: Pick<FlatModel, 'modelID'> & {
10
10
  provider?: string | null;
11
11
  }): boolean;
12
+ /**
13
+ * A model that runs through Claude Code on the caller's own Claude Pro or Max
14
+ * plan (`claude-agent/<id>`, `@kortix/api-contract/claude-agent`). It never
15
+ * reaches the LLM gateway.
16
+ */
17
+ export declare function isClaudeSubscriptionModel(model: {
18
+ provider?: string | null;
19
+ providerID?: string;
20
+ }): boolean;
12
21
  /**
13
22
  * What the picker prints for a model.
14
23
  *
@@ -13,6 +13,14 @@ export function shouldShowFreeTag(model) {
13
13
  export function isSubscriptionModel(model) {
14
14
  return model.provider === 'codex' || model.modelID.startsWith('codex/');
15
15
  }
16
+ /**
17
+ * A model that runs through Claude Code on the caller's own Claude Pro or Max
18
+ * plan (`claude-agent/<id>`, `@kortix/api-contract/claude-agent`). It never
19
+ * reaches the LLM gateway.
20
+ */
21
+ export function isClaudeSubscriptionModel(model) {
22
+ return model.providerID === 'claude-agent' || model.provider === 'claude-agent';
23
+ }
16
24
  /**
17
25
  * What the picker prints for a model.
18
26
  *
@@ -22,6 +22,7 @@ import { ButtonGroup } from '../../../primitives/button-group.js';
22
22
  import { Drawer, DrawerContent, DrawerHeader, DrawerTitle } from '../../../primitives/drawer.js';
23
23
  import { isPlanWriteTool } from '../../turn/plan-anchor.js';
24
24
  import { cn } from '../../../lib/utils.js';
25
+ import { hasOpenFloatingLayer } from '../../../lib/z-stack.js';
25
26
  import { focusWithoutScroll } from '../../../internal/lib/utils/focus-without-scroll.js';
26
27
  import { CaretLeftIcon as ChevronLeft, CaretRightIcon as ChevronRight, } from '@phosphor-icons/react';
27
28
  import { AnimatePresence, m, useReducedMotion, } from 'motion/react';
@@ -116,6 +117,12 @@ function useDetailKeyboard(detail, isMobile, onBack, detailRef) {
116
117
  if (isTypingTarget(event.target))
117
118
  return;
118
119
  if (event.key === 'Escape') {
120
+ if (event.defaultPrevented || hasOpenFloatingLayer())
121
+ return;
122
+ const dialog = detailRef.current;
123
+ const coveringDialog = Array.from(document.querySelectorAll('[role="dialog"][data-state="open"],[role="alertdialog"][data-state="open"]')).some((layer) => !dialog || !layer.contains(dialog));
124
+ if (coveringDialog)
125
+ return;
119
126
  // Mark the press consumed: the page-wide triple-ESC-to-stop
120
127
  // (`session-chat.tsx`) skips a `defaultPrevented` Escape. Without it,
121
128
  // closing three full-screen images in a row stopped a running turn.
@@ -47,7 +47,7 @@ export function EasyPanel() {
47
47
  // with `session-chat.tsx` so the two cannot disagree.
48
48
  const planInChat = usePlanInChat();
49
49
  // Null outside a `SessionPanelProvider` — `SessionChat` also renders
50
- // read-only inside `sub-session-modal.tsx`, which has no panel at all.
50
+ // read-only inside `legacy-subagent-chat.tsx`, which has no panel at all.
51
51
  if (!panel)
52
52
  return null;
53
53
  const { files, context, apps, outputsDefaultOpen, sessionId, handleOpenOutput, openDetail } = panel;
@@ -11,7 +11,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
11
11
  * "what is it?".
12
12
  */
13
13
  import { cn } from '../../../lib/utils.js';
14
- import { ArchiveIcon as Archive, RobotIcon as Bot, BrainIcon as Brain, CodeIcon as Code, QuestionIcon as CircleHelp, NotePencilIcon as FilePen, FolderOpenIcon as FolderOpen, GlobeIcon as Globe, ClockCounterClockwiseIcon as History, ListChecksIcon as ListChecks, PlugIcon as Plug, MagnifyingGlassIcon as Search, SparkleIcon as Sparkles, TerminalIcon as Terminal, MagicWandIcon as Wand2, WrenchIcon as Wrench, LightningIcon as Zap, } from '@phosphor-icons/react';
14
+ import { ArchiveIcon as Archive, RobotIcon as Bot, BrainIcon as Brain, CodeIcon as Code, QuestionIcon as CircleHelp, NotePencilIcon as FilePen, FlowArrowIcon as FlowArrow, FolderOpenIcon as FolderOpen, GlobeIcon as Globe, ClockCounterClockwiseIcon as History, ListChecksIcon as ListChecks, PlugIcon as Plug, MagnifyingGlassIcon as Search, SlidersHorizontalIcon as Sliders, SparkleIcon as Sparkles, TerminalIcon as Terminal, MagicWandIcon as Wand2, WrenchIcon as Wrench, LightningIcon as Zap, } from '@phosphor-icons/react';
15
15
  const FAMILY_ICON = {
16
16
  explore: Search,
17
17
  edit: FilePen,
@@ -23,6 +23,10 @@ const FAMILY_ICON = {
23
23
  create: Sparkles,
24
24
  plan: ListChecks,
25
25
  delegate: Bot,
26
+ // pi's workflow: several agents on one run.
27
+ workflow: FlowArrow,
28
+ // My Kortix's platform tools: settings of the project (agents, schedules, members, …).
29
+ platform: Sliders,
26
30
  sessions: History,
27
31
  memory: Brain,
28
32
  connectors: Plug,
@@ -19,6 +19,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
19
19
  */
20
20
  import { Drawer, DrawerContent, DrawerHeader, DrawerTitle } from '../../primitives/drawer.js';
21
21
  import { BrowserPanel } from '../../browser/browser-panel.js';
22
+ import { ArtifactPanelPreview } from '../../artifacts/artifact-session.js';
23
+ import { parseArtifactUrl } from '../../artifacts/frame-policy.js';
22
24
  import { CloseButton } from './easy/detail-view.js';
23
25
  import { SessionAuditPanel } from './session-audit-panel.js';
24
26
  import { SessionRemindersPanel } from './session-reminders-panel.js';
@@ -36,17 +38,19 @@ const TOOL_META = {
36
38
  browser: { label: 'Browser', Icon: GlobeIcon },
37
39
  files: { label: 'Files', Icon: FolderOpenIcon },
38
40
  audit: { label: 'Audit', Icon: ScrollIcon },
39
- reminders: { label: 'Reminders', Icon: AlarmIcon },
41
+ reminders: { label: 'Loops', Icon: AlarmIcon },
40
42
  desktop: { label: 'Desktop', Icon: MonitorIcon },
41
43
  };
42
44
  export function MobileToolDrawer({ sessionId, projectId, projectSessionId, }) {
43
45
  const view = useKortixComputerStore((s) => s.mobileToolView);
46
+ const target = useKortixComputerStore((s) => s.mobileToolTarget);
44
47
  const closeMobileTool = useKortixComputerStore((s) => s.closeMobileTool);
45
48
  const toolMeta = useLocalizedUiCatalog(TOOL_META);
46
49
  const meta = view ? toolMeta[view] : null;
50
+ const artifactUrl = view === 'browser' && target?.url && parseArtifactUrl(target.url) ? target.url : null;
47
51
  // Terminal, Browser and Files need the computer: while it boots, the drawer
48
52
  // shows the wake status in their place.
49
- const booting = !!useOptionalSessionPanel()?.booting &&
53
+ const booting = !!useOptionalSessionPanel()?.booting && !artifactUrl &&
50
54
  (view === 'terminal' || view === 'browser' || view === 'files' || view === 'desktop');
51
- return (_jsx(Drawer, { open: view !== null, onOpenChange: (next) => !next && closeMobileTool(), children: _jsxs(DrawerContent, { className: "flex h-[95dvh] max-h-[95dvh] min-h-[95dvh] flex-col overflow-hidden p-0", children: [_jsx(DrawerHeader, { className: "shrink-0 px-4 py-3 text-left", children: _jsxs(DrawerTitle, { className: "flex items-center justify-between gap-2 text-base", children: [_jsxs("span", { className: "flex items-center gap-2.5", children: [meta && _jsx(meta.Icon, { className: "text-muted-foreground size-4 shrink-0" }), meta?.label] }), _jsx(CloseButton, { onClose: closeMobileTool, variant: "ghost" })] }) }), _jsxs("div", { className: "min-h-0 flex-1 overflow-hidden", children: [booting && _jsx(SessionBootStatus, { projectId: projectId, sessionId: projectSessionId }), !booting && view === 'terminal' && (_jsx(SessionTerminalPanel, { sessionId: sessionId, projectId: projectId, projectSessionId: projectSessionId })), !booting && view === 'browser' && (_jsx(BrowserPanel, { tabId: sessionPreviewTabId(sessionId), projectId: projectId, projectSessionId: projectSessionId })), !booting && view === 'files' && (_jsx(SessionFilesExplorer, { chatSessionId: sessionId, projectId: projectId, projectSessionId: projectSessionId })), !booting && view === 'desktop' && (_jsx(SessionDesktop, { projectId: projectId, projectSessionId: projectSessionId, onClose: closeMobileTool })), view === 'audit' && (_jsx(SessionAuditPanel, { projectId: projectId, projectSessionId: projectSessionId })), view === 'reminders' && (_jsx("div", { className: "h-full overflow-y-auto p-4", children: _jsx(SessionRemindersPanel, { projectId: projectId, projectSessionId: projectSessionId }) }))] })] }) }));
55
+ return (_jsx(Drawer, { open: view !== null, onOpenChange: (next) => !next && closeMobileTool(), children: _jsxs(DrawerContent, { className: "flex h-[95dvh] max-h-[95dvh] min-h-[95dvh] flex-col overflow-hidden p-0", children: [_jsx(DrawerHeader, { className: "shrink-0 px-4 py-3 text-left", children: _jsxs(DrawerTitle, { className: "flex items-center justify-between gap-2 text-base", children: [_jsxs("span", { className: "flex items-center gap-2.5", children: [meta && _jsx(meta.Icon, { className: "text-muted-foreground size-4 shrink-0" }), meta?.label] }), _jsx(CloseButton, { onClose: closeMobileTool, variant: "ghost" })] }) }), _jsxs("div", { className: "min-h-0 flex-1 overflow-hidden", children: [booting && _jsx(SessionBootStatus, { projectId: projectId, sessionId: projectSessionId }), !booting && view === 'terminal' && (_jsx(SessionTerminalPanel, { sessionId: sessionId, projectId: projectId, projectSessionId: projectSessionId })), artifactUrl && _jsx(ArtifactPanelPreview, { url: artifactUrl, onClose: closeMobileTool }, artifactUrl), !booting && view === 'browser' && !artifactUrl && (_jsx(BrowserPanel, { tabId: sessionPreviewTabId(sessionId), projectId: projectId, projectSessionId: projectSessionId, targetUrl: target?.url })), !booting && view === 'files' && (_jsx(SessionFilesExplorer, { chatSessionId: sessionId, projectId: projectId, projectSessionId: projectSessionId })), !booting && view === 'desktop' && (_jsx(SessionDesktop, { projectId: projectId, projectSessionId: projectSessionId, onClose: closeMobileTool })), view === 'audit' && (_jsx(SessionAuditPanel, { projectId: projectId, projectSessionId: projectSessionId })), view === 'reminders' && (_jsx("div", { className: "h-full overflow-y-auto p-4", children: _jsx(SessionRemindersPanel, { projectId: projectId, projectSessionId: projectSessionId }) }))] })] }) }));
52
56
  }
@@ -43,7 +43,7 @@ target) {
43
43
  // for behind the close button. The panel toggle still opens the panel;
44
44
  // this path is only the "show me this one tool" intent.
45
45
  if (isMobileViewport()) {
46
- useKortixComputerStore.getState().openMobileTool(view);
46
+ useKortixComputerStore.getState().openMobileTool(view, target);
47
47
  track('panel_opened', { source, surface: 'mobile-tool', view });
48
48
  return;
49
49
  }
@@ -134,7 +134,7 @@ hotkey = true, } = {}) {
134
134
  };
135
135
  }, [shouldHandleHotkey, toggleRight]);
136
136
  // No provider means no panel to render: `SessionChat` also renders read-only
137
- // inside `sub-session-modal.tsx`, outside `SessionLayout`. Mobile has no
137
+ // inside `legacy-subagent-chat.tsx`, outside `SessionLayout`. Mobile has no
138
138
  // column either — at 375px a side column is the whole screen, so the cards
139
139
  // stay in the bottom drawer they have always used.
140
140
  if (!panel || isMobile)
@@ -17,6 +17,11 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
17
17
  * viewer to the slowest one, and a background tab stops acking frames, so a
18
18
  * forgotten tab would slow the stream for everyone watching. It reconnects,
19
19
  * on a fresh keyframe, when the tab is shown again.
20
+ *
21
+ * A computer without a desktop (a template on another base, or a computer
22
+ * that booted an image built before it had one) says so; the header does not offer the panel there. The
23
+ * control bar appears only once the desktop answers, never over the proxy's
24
+ * "not answering" page.
20
25
  */
21
26
  import { useTranslations } from '../../i18n/index.js';
22
27
  import { Button } from '../../primitives/button.js';
@@ -30,9 +35,17 @@ import { PanelWidthButton } from '../../files/viewer/viewer-actions.js';
30
35
  import { CloseButton, DetailSidebarToggle } from '../../files/viewer/viewer-chrome.js';
31
36
  import { cn } from '../../lib/utils.js';
32
37
  import { probePreviewPort } from '@kortix/sdk';
38
+ import { useHasSessionDesktop } from '@kortix/sdk/react';
33
39
  import { ArrowSquareOutIcon, MonitorIcon } from '@phosphor-icons/react';
34
40
  import { useEffect, useRef, useState, useSyncExternalStore } from 'react';
35
41
  export const DESKTOP_URL = 'http://localhost:6901/';
42
+ /** How often the panel asks again until the desktop answers. */
43
+ const PROBE_INTERVAL_MS = 3_000;
44
+ /**
45
+ * The proxy answers 502 for a stopped desktop only after ~5 s (measured 4.8 s:
46
+ * it retries the port first). The probe's 3 s default reads that as `unknown`.
47
+ */
48
+ const PROBE_TIMEOUT_MS = 10_000;
36
49
  const subscribeVisibility = (onChange) => {
37
50
  document.addEventListener('visibilitychange', onChange);
38
51
  return () => document.removeEventListener('visibilitychange', onChange);
@@ -48,27 +61,41 @@ export function SessionDesktop({ projectId, projectSessionId, onClose, }) {
48
61
  }).url;
49
62
  const frameRef = useRef(null);
50
63
  const [control, setControl] = useState(false);
51
- // 'off' = the proxy answered 502/503/504: nothing listens on 6901.
52
- const [state, setState] = useState('probing');
64
+ // `undefined` until the session's daemon answers its health probe.
65
+ const hasDesktop = useHasSessionDesktop();
66
+ // `unreachable` = the proxy answered 502/503/504: nothing listens on 6901.
67
+ const [probe, setProbe] = useState('unknown');
53
68
  const [attempt, setAttempt] = useState(0);
54
69
  const visible = useSyncExternalStore(subscribeVisibility, tabVisible, () => true);
55
- const live = !!src && state === 'on';
70
+ const live = probe === 'reachable';
71
+ // Ask until the desktop answers. The first answer is often `unknown`: the
72
+ // preview cookie arrives with the frame's first load. A stopped desktop
73
+ // answers `unreachable`, and the panel shows it again once it starts.
56
74
  useEffect(() => {
57
- if (!src)
75
+ if (!src || !hasDesktop || !visible)
58
76
  return;
59
77
  const abort = new AbortController();
60
- void probePreviewPort(src, { signal: abort.signal }).then((probe) => {
61
- if (!abort.signal.aborted)
62
- setState(probe === 'unreachable' ? 'off' : 'on');
63
- });
64
- return () => abort.abort();
65
- }, [src, attempt]);
78
+ let timer;
79
+ const ask = async () => {
80
+ const result = await probePreviewPort(src, { signal: abort.signal, timeoutMs: PROBE_TIMEOUT_MS });
81
+ if (abort.signal.aborted)
82
+ return;
83
+ setProbe(result);
84
+ if (result !== 'reachable')
85
+ timer = setTimeout(ask, PROBE_INTERVAL_MS);
86
+ };
87
+ void ask();
88
+ return () => {
89
+ abort.abort();
90
+ clearTimeout(timer);
91
+ };
92
+ }, [src, hasDesktop, visible, attempt]);
66
93
  const takeOver = () => {
67
94
  setControl(true);
68
95
  frameRef.current?.focus();
69
96
  };
70
- return (_jsxs("div", { className: "bg-background flex h-full min-h-0 min-w-0 flex-col", children: [_jsxs("div", { className: "flex shrink-0 items-center gap-1 px-2 py-1", children: [_jsx(DetailSidebarToggle, { className: "size-7" }), _jsx(MonitorIcon, { className: "text-muted-foreground ml-1 size-3.5 shrink-0" }), _jsx("span", { className: "truncate text-sm font-medium", children: t('title') }), _jsx("div", { className: "flex-1" }), _jsxs(ButtonGroup, { className: "shrink-0", children: [_jsx(Button, { variant: "secondary", size: "icon", className: "size-7", disabled: !live, "aria-label": t('openTab'), onClick: () => src && window.open(src, '_blank', 'noopener,noreferrer'), children: _jsx(ArrowSquareOutIcon, { className: "size-3.5" }) }), _jsx(PanelWidthButton, { isMobile: isMobile }), _jsx(CloseButton, { onClose: onClose })] })] }), _jsxs("div", { className: "flex min-h-0 flex-1 flex-col gap-2 px-3 pb-3", children: [_jsx("div", { "data-slot": "desktop-screen", "data-control": control ? 'user' : 'agent', className: cn('bg-muted relative min-h-0 flex-1 overflow-hidden rounded-xl ring-1 ring-border transition-shadow', control && 'ring-2 ring-primary'), children: state === 'off' ? (_jsxs("div", { className: "text-muted-foreground flex h-full flex-col items-center justify-center gap-3 px-6 text-center text-sm", children: [_jsx(MonitorIcon, { className: "size-10 opacity-20" }), _jsx("p", { children: t('offline') }), _jsxs("p", { className: "text-xs", children: [t('start'), " ", _jsx("code", { children: "kortix-desktop start" }), "."] }), _jsx(Button, { variant: "secondary", size: "sm", onClick: () => {
71
- setState('probing');
72
- setAttempt((n) => n + 1);
73
- }, children: t('retry') })] })) : !live || !visible ? (_jsx("div", { className: "flex h-full items-center justify-center", children: _jsx(Loading, { className: "size-4" }) })) : (_jsxs(_Fragment, { children: [_jsx("iframe", { ref: frameRef, src: src, title: t('title'), className: "h-full w-full border-0", sandbox: framePolicy('app', src).sandbox, allow: "clipboard-read; clipboard-write; autoplay; fullscreen", tabIndex: control ? 0 : -1 }), !control && (_jsx("button", { type: "button", "aria-label": t('takeOver'), "data-slot": "desktop-shield", className: "absolute inset-0 cursor-pointer", onClick: takeOver }))] })) }), _jsx("div", { className: "flex h-9 shrink-0 items-center justify-center gap-3 text-sm", children: live && (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-muted-foreground", children: control ? t('userControl') : t('agentControl') }), _jsx(Button, { variant: control ? 'secondary' : 'default', size: "sm", className: "h-7 rounded-full px-3", "aria-pressed": control, onClick: control ? () => setControl(false) : takeOver, children: control ? t('returnControl') : t('takeOver') })] })) })] })] }));
97
+ return (_jsxs("div", { className: "bg-background flex h-full min-h-0 min-w-0 flex-col", children: [_jsxs("div", { className: "flex shrink-0 items-center gap-1 px-2 py-1", children: [_jsx(DetailSidebarToggle, { className: "size-7" }), _jsx(MonitorIcon, { className: "text-muted-foreground ml-1 size-3.5 shrink-0" }), _jsx("span", { className: "truncate text-sm font-medium", children: t('title') }), _jsx("div", { className: "flex-1" }), _jsxs(ButtonGroup, { className: "shrink-0", children: [_jsx(Button, { variant: "secondary", size: "icon", className: "size-7", disabled: !live, "aria-label": t('openTab'), onClick: () => src && window.open(src, '_blank', 'noopener,noreferrer'), children: _jsx(ArrowSquareOutIcon, { className: "size-3.5" }) }), _jsx(PanelWidthButton, { isMobile: isMobile }), _jsx(CloseButton, { onClose: onClose })] })] }), _jsxs("div", { className: "flex min-h-0 flex-1 flex-col gap-2 px-3 pb-3", children: [_jsx("div", { "data-slot": "desktop-screen", "data-control": control ? 'user' : 'agent', className: cn('bg-muted relative min-h-0 flex-1 overflow-hidden rounded-xl ring-1 ring-border transition-shadow', control && 'ring-2 ring-primary'), children: hasDesktop === false ? (_jsx(DesktopNotice, { title: t('noDesktop'), hint: t('noDesktopHint') })) : probe === 'unreachable' ? (_jsx(DesktopNotice, { title: t('offline'), hint: _jsxs(_Fragment, { children: [t('start'), " ", _jsx("code", { children: "kortix-desktop start" }), "."] }), children: _jsx(Button, { variant: "secondary", size: "sm", onClick: () => setAttempt((n) => n + 1), children: t('retry') }) })) : !hasDesktop || !src || !visible ? (_jsx("div", { className: "flex h-full items-center justify-center", children: _jsx(Loading, { className: "size-4" }) })) : (_jsxs(_Fragment, { children: [_jsx("iframe", { ref: frameRef, src: src, title: t('title'), className: "h-full w-full border-0", sandbox: framePolicy('app', src).sandbox, allow: "clipboard-read; clipboard-write; autoplay; fullscreen", tabIndex: control ? 0 : -1 }), !control && (_jsx("button", { type: "button", "aria-label": t('takeOver'), "data-slot": "desktop-shield", className: "absolute inset-0 cursor-pointer", onClick: takeOver }))] })) }), _jsx("div", { className: "flex h-9 shrink-0 items-center justify-center gap-3 text-sm", children: live && (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-muted-foreground", children: control ? t('userControl') : t('agentControl') }), _jsx(Button, { variant: control ? 'secondary' : 'default', size: "sm", className: "h-7 rounded-full px-3", "aria-pressed": control, onClick: control ? () => setControl(false) : takeOver, children: control ? t('returnControl') : t('takeOver') })] })) })] })] }));
98
+ }
99
+ function DesktopNotice({ title, hint, children }) {
100
+ return (_jsxs("div", { className: "text-muted-foreground flex h-full flex-col items-center justify-center gap-3 px-6 text-center text-sm", children: [_jsx(MonitorIcon, { className: "size-10 opacity-20" }), _jsx("p", { children: title }), _jsx("p", { className: "text-xs", children: hint }), children] }));
74
101
  }
@@ -45,7 +45,7 @@ export declare const SessionPanelContext: import("react").Context<SessionPanelVa
45
45
  * The panel value, or null outside a provider.
46
46
  *
47
47
  * Optional on purpose, exactly as `useOptionalSidebar` is: `SessionChat` has a
48
- * second call site in `sub-session-modal.tsx` that renders it read-only and
48
+ * second call site in `legacy-subagent-chat.tsx` that renders it read-only and
49
49
  * OUTSIDE `SessionLayout`. The floating overlay self-gates to null there rather
50
50
  * than every call site having to know which tree it is in.
51
51
  */
@@ -44,9 +44,7 @@ import { useSessionComposerPrefillStore } from '../composer/stores/session-compo
44
44
  import { panelToRestore, rememberedPanelOf, useSessionPanelMemoryStore, } from '../../internal/stores/session-panel-memory-store.js';
45
45
  import { useUserPreferencesStore } from '../../internal/stores/user-preferences-store.js';
46
46
  import { getProjectSession, SANDBOX_PORTS } from '@kortix/sdk';
47
- import { qk } from '@kortix/sdk/react';
48
47
  import { FileTextIcon as FileText } from '@phosphor-icons/react';
49
- import { useQueryClient } from '@tanstack/react-query';
50
48
  import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, } from 'react';
51
49
  import { AppPreview, AppPreviewBooting } from './easy/app-preview.js';
52
50
  import { isWideDeliverable, neighborOutputs, outputKey, quickBrowserOutput, } from './easy/easy-panel-logic.js';
@@ -67,7 +65,7 @@ export const SessionPanelContext = createContext(null);
67
65
  * The panel value, or null outside a provider.
68
66
  *
69
67
  * Optional on purpose, exactly as `useOptionalSidebar` is: `SessionChat` has a
70
- * second call site in `sub-session-modal.tsx` that renders it read-only and
68
+ * second call site in `legacy-subagent-chat.tsx` that renders it read-only and
71
69
  * OUTSIDE `SessionLayout`. The floating overlay self-gates to null there rather
72
70
  * than every call site having to know which tree it is in.
73
71
  */
@@ -479,7 +477,6 @@ export function SessionPanelProvider({ sessionId, isSessionBusy = false, project
479
477
  const sidePanelOpen = useKortixComputerStore((s) => s.isSidePanelOpen);
480
478
  const advancedPanel = useUserPreferencesStore((s) => s.preferences.panelMode === 'advanced');
481
479
  const isMobile = useIsMobile();
482
- const queryClient = useQueryClient();
483
480
  // Nothing is recorded before the arrival is decided: until then the panel is
484
481
  // closed by the arrival itself, not by the person.
485
482
  const [restoreSettled, setRestoreSettled] = useState(false);
@@ -497,12 +494,11 @@ export function SessionPanelProvider({ sessionId, isSessionBusy = false, project
497
494
  let alive = true;
498
495
  // A FRESH row, never the cached one: it can be 30 s old, and reopening a
499
496
  // Terminal on a session stopped since then wakes its computer (measured).
500
- void queryClient
501
- .fetchQuery({
502
- queryKey: qk.project.session(projectId, projectSessionId),
503
- queryFn: () => getProjectSession(projectId, projectSessionId, { showErrors: false }),
504
- staleTime: 0,
505
- })
497
+ // Its own request, not the query cache's: `fetchQuery` joins the page's
498
+ // in-flight fetch of the same row, a refetch on arrival cancels that
499
+ // (`CancelledError`), and the restore was dropped on about half the
500
+ // returns from another session (measured).
501
+ void getProjectSession(projectId, projectSessionId, { showErrors: false })
506
502
  .then((row) => {
507
503
  if (!alive)
508
504
  return;
@@ -531,7 +527,7 @@ export function SessionPanelProvider({ sessionId, isSessionBusy = false, project
531
527
  alive = false;
532
528
  setRestoreSettled(true);
533
529
  };
534
- }, [isActivePanel, memoryKey, isMobile, projectId, projectSessionId, queryClient, sessionId]);
530
+ }, [isActivePanel, memoryKey, isMobile, projectId, projectSessionId, sessionId]);
535
531
  // A file preview reopens once the transcript has derived its output, and only
536
532
  // if the person has not opened something else meanwhile.
537
533
  useEffect(() => {
@@ -21,7 +21,9 @@ import { Close } from '../../icons/close.js';
21
21
  // ---------------------------------------------------------------------------
22
22
  function QuestionMarkdown({ content, className }) {
23
23
  return (_jsx("div", { className: cn('question-md', className), children: _jsx(ReactMarkdown, { remarkPlugins: [remarkGfm], components: {
24
- p: ({ children }) => _jsx("p", { className: "my-1 leading-relaxed", children: children }),
24
+ // `pre-line`: a single newline is a line break. A question's lines (a workflow's
25
+ // title, phases and agent count) would otherwise run together as one paragraph.
26
+ p: ({ children }) => _jsx("p", { className: "my-1 leading-relaxed whitespace-pre-line", children: children }),
25
27
  strong: ({ children }) => (_jsx("strong", { className: "text-foreground font-semibold", children: children })),
26
28
  em: ({ children }) => _jsx("em", { className: "text-muted-foreground", children: children }),
27
29
  ul: ({ children }) => _jsx("ul", { className: "my-0.5 list-disc pl-4", children: children }),
@@ -5,6 +5,7 @@ import { useLocale, useTranslations } from '../../i18n/index.js';
5
5
  import { formatUsdAsCredits, parseBalanceUsd } from '../../_vendor/kortix-shared.js';
6
6
  import { chatGptConnectionAction } from '../models/chatgpt-connection-action.js';
7
7
  import { ChatGptConnectionSlot } from '../models/chatgpt-connection-button.js';
8
+ import { ClaudeConnectionSlot, claudeConnectionAction } from '../models/claude-connection-slot.js';
8
9
  import { AskOwnerForCreditsButton } from '../models/ask-owner-for-credits-button.js';
9
10
  import { Button } from '../../primitives/button.js';
10
11
  import { ChainOfThoughtStep } from '../../primitives/chain-of-thought.js';
@@ -264,8 +265,10 @@ export function TurnErrorDisplay({ errorText, errorDetails, errorRaw, defaultDet
264
265
  // A member's own ChatGPT login expired or is missing: the fix is theirs to
265
266
  // make, so the row carries it instead of leaving a dead end mid-session.
266
267
  const chatGpt = chatGptConnectionAction(gateway);
268
+ // The same for the member's own Claude subscription (Claude models run on it).
269
+ const claude = chatGpt ? null : claudeConnectionAction(text);
267
270
  // Real errors → a checkpoint row in the activity lane, not a boxed alert.
268
- return (_jsx(TurnErrorCheckpoint, { text: text, gateway: gateway, raw: errorRaw, defaultOpen: defaultDetailsOpen, action: chatGpt ? _jsx(ChatGptConnectionSlot, { action: chatGpt }) : undefined, modelOptions: modelOptions, className: className }));
271
+ return (_jsx(TurnErrorCheckpoint, { text: text, gateway: gateway, raw: errorRaw, defaultOpen: defaultDetailsOpen, action: chatGpt ? _jsx(ChatGptConnectionSlot, { action: chatGpt }) : claude ? _jsx(ClaudeConnectionSlot, { action: claude }) : undefined, modelOptions: modelOptions, className: className }));
269
272
  }
270
273
  export function SessionRetryDisplay({ message, attempt, secondsLeft, details, className, }) {
271
274
  if (!message)