@kortix/ui 0.14.12 → 0.14.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. package/README.md +1 -1
  2. package/dist/_vendor/kortix-shared.js +521 -7045
  3. package/dist/_vendor/shared/app-config.d.ts +8 -0
  4. package/dist/_vendor/shared/artifact-annotations.d.ts +708 -0
  5. package/dist/_vendor/shared/artifact-comments.d.ts +327 -0
  6. package/dist/_vendor/shared/index.d.ts +3 -1
  7. package/dist/_vendor/shared/my-kortix-agent.d.ts +40 -0
  8. package/dist/_vendor/shared/peer-message-prompt.d.ts +35 -0
  9. package/dist/_vendor/shared/pixel-mark.d.ts +11 -0
  10. package/dist/_vendor/shared/prompt-attachments.d.ts +1 -0
  11. package/dist/_vendor/shared/reminder-prompt.d.ts +8 -2
  12. package/dist/_vendor/shared/runtime-versions.d.ts +8 -0
  13. package/dist/artifacts/artifact-frame.d.ts +1 -0
  14. package/dist/artifacts/artifact-frame.js +18 -5
  15. package/dist/artifacts/frame-policy.d.ts +1 -1
  16. package/dist/artifacts/frame-policy.js +10 -5
  17. package/dist/customize/agents/agent-access-text.d.ts +16 -0
  18. package/dist/customize/agents/agent-access-text.js +54 -0
  19. package/dist/customize/agents/agent-approval-rules.d.ts +8 -0
  20. package/dist/customize/agents/agent-approval-rules.js +26 -0
  21. package/dist/customize/agents/agent-authority-card.js +4 -1
  22. package/dist/customize/agents/agent-cover-card.d.ts +4 -1
  23. package/dist/customize/agents/agent-cover-card.js +2 -2
  24. package/dist/customize/agents/agent-detail-aside.d.ts +1 -2
  25. package/dist/customize/agents/agent-detail-aside.js +8 -11
  26. package/dist/customize/agents/agent-drives-section.d.ts +23 -7
  27. package/dist/customize/agents/agent-drives-section.js +107 -41
  28. package/dist/customize/agents/agent-instructions.d.ts +11 -0
  29. package/dist/customize/agents/agent-instructions.js +114 -0
  30. package/dist/customize/agents/agent-model-view.d.ts +17 -0
  31. package/dist/customize/agents/agent-model-view.js +67 -0
  32. package/dist/customize/agents/agent-overview.d.ts +53 -0
  33. package/dist/customize/agents/agent-overview.js +242 -0
  34. package/dist/customize/agents/agent-page-chrome.d.ts +128 -0
  35. package/dist/customize/agents/agent-page-chrome.js +145 -0
  36. package/dist/customize/agents/agent-page.d.ts +13 -1
  37. package/dist/customize/agents/agent-page.js +478 -367
  38. package/dist/customize/agents/agent-pin-button.d.ts +10 -0
  39. package/dist/customize/agents/agent-pin-button.js +20 -0
  40. package/dist/customize/agents/agent-policy-sets-section.d.ts +16 -0
  41. package/dist/customize/agents/agent-policy-sets-section.js +80 -0
  42. package/dist/customize/agents/agent-policy-sets.js +1 -1
  43. package/dist/customize/agents/agent-section-rail.d.ts +21 -0
  44. package/dist/customize/agents/agent-section-rail.js +23 -0
  45. package/dist/customize/agents/agent-share-control.d.ts +4 -3
  46. package/dist/customize/agents/agent-share-control.js +15 -16
  47. package/dist/customize/agents/{agent-people-section.d.ts → agent-share-dialog.d.ts} +3 -1
  48. package/dist/customize/agents/{agent-people-section.js → agent-share-dialog.js} +21 -21
  49. package/dist/customize/agents/agent-tabs.d.ts +95 -0
  50. package/dist/customize/agents/agent-tabs.js +199 -0
  51. package/dist/customize/agents/agents-page.d.ts +0 -21
  52. package/dist/customize/agents/agents-page.js +104 -118
  53. package/dist/customize/agents/connectors-required.d.ts +16 -0
  54. package/dist/customize/agents/connectors-required.js +19 -0
  55. package/dist/customize/agents/create-agent-modal.d.ts +19 -0
  56. package/dist/customize/agents/create-agent-modal.js +94 -0
  57. package/dist/customize/connectors/agent-access.d.ts +4 -4
  58. package/dist/customize/connectors/agent-access.js +7 -10
  59. package/dist/customize/connectors/connector-identity.d.ts +12 -0
  60. package/dist/customize/connectors/connector-identity.js +15 -2
  61. package/dist/customize/connectors/connector-routes.js +2 -2
  62. package/dist/customize/connectors/connectors-page.d.ts +14 -1
  63. package/dist/customize/connectors/connectors-page.js +101 -32
  64. package/dist/customize/connectors/detail/app-page.js +1 -1
  65. package/dist/customize/connectors/detail/connector-agents.js +0 -3
  66. package/dist/customize/connectors/detail/connector-page.d.ts +1 -1
  67. package/dist/customize/connectors/detail/connector-page.js +5 -2
  68. package/dist/customize/connectors/detail/connector-policy-sets.js +1 -1
  69. package/dist/customize/connectors/detail/connector-triggers.js +2 -2
  70. package/dist/customize/connectors/use-agent-access.d.ts +7 -5
  71. package/dist/customize/connectors/use-agent-access.js +2 -6
  72. package/dist/customize/models/models-page.d.ts +7 -1
  73. package/dist/customize/models/models-page.js +2 -2
  74. package/dist/customize/project-settings/project-admin-sections.d.ts +63 -0
  75. package/dist/customize/project-settings/project-admin-sections.js +80 -0
  76. package/dist/customize/project-settings/project-settings-page.d.ts +1 -1
  77. package/dist/customize/project-settings/project-settings-page.js +4 -13
  78. package/dist/customize/project-settings/project-settings-sections.d.ts +5 -5
  79. package/dist/customize/project-settings/project-settings-sections.js +6 -20
  80. package/dist/customize/providers/provider-accordion.js +29 -17
  81. package/dist/customize/providers/provider-connect.js +1 -1
  82. package/dist/customize/providers/provider-sheet.d.ts +4 -1
  83. package/dist/customize/providers/provider-sheet.js +15 -5
  84. package/dist/customize/secrets/secrets-page.d.ts +5 -1
  85. package/dist/customize/secrets/secrets-page.js +2 -2
  86. package/dist/customize/sections/gateway-view.d.ts +10 -2
  87. package/dist/customize/sections/gateway-view.js +16 -4
  88. package/dist/customize/sections/llm-provider/chatgpt-subscription-connect.d.ts +12 -5
  89. package/dist/customize/sections/llm-provider/chatgpt-subscription-connect.js +131 -8
  90. package/dist/customize/sections/llm-provider/claude-code-step.d.ts +10 -0
  91. package/dist/customize/sections/llm-provider/claude-code-step.js +32 -0
  92. package/dist/customize/sections/llm-provider/models-tab.js +5 -1
  93. package/dist/customize/sections/view/account-secret-resources-panel.d.ts +5 -3
  94. package/dist/customize/sections/view/account-secret-resources-panel.js +122 -19
  95. package/dist/customize/sections/view/agent-editor-access-fields.d.ts +1 -1
  96. package/dist/customize/sections/view/agent-editor-access-fields.js +8 -4
  97. package/dist/customize/sections/view/agent-editor-basics-fields.d.ts +4 -1
  98. package/dist/customize/sections/view/agent-editor-basics-fields.js +33 -4
  99. package/dist/customize/sections/view/agent-editor-catalog.d.ts +2 -2
  100. package/dist/customize/sections/view/agent-editor-catalog.js +10 -12
  101. package/dist/customize/sections/view/agent-editor-primitives.d.ts +1 -1
  102. package/dist/customize/sections/view/agent-editor-primitives.js +4 -4
  103. package/dist/customize/sections/view/agent-editor.d.ts +37 -26
  104. package/dist/customize/sections/view/agent-editor.js +19 -19
  105. package/dist/customize/sections/view/grant-mode-field.d.ts +8 -20
  106. package/dist/customize/sections/view/grant-mode-field.js +31 -57
  107. package/dist/customize/sections/view/permission-editor.d.ts +3 -1
  108. package/dist/customize/sections/view/permission-editor.js +19 -10
  109. package/dist/customize/sections/view/review-view.d.ts +8 -0
  110. package/dist/customize/sections/view/review-view.js +12 -1
  111. package/dist/customize/sections/view/secret-delivery.js +1 -4
  112. package/dist/customize/sections/view/secrets-view.d.ts +7 -1
  113. package/dist/customize/sections/view/secrets-view.js +42 -6
  114. package/dist/customize/settings/rail.js +2 -8
  115. package/dist/customize/settings/settings-tabs.d.ts +2 -2
  116. package/dist/customize/settings/settings-tabs.js +17 -19
  117. package/dist/customize/settings/tabs/experimental-tab.d.ts +3 -0
  118. package/dist/customize/settings/tabs/experimental-tab.js +6 -1
  119. package/dist/customize/settings/tabs/sandbox-tab.d.ts +4 -6
  120. package/dist/customize/settings/tabs/sandbox-tab.js +9 -9
  121. package/dist/customize/shared/access-list.d.ts +39 -0
  122. package/dist/customize/shared/access-list.js +62 -0
  123. package/dist/customize/shared/agent-resource-scope.d.ts +87 -0
  124. package/dist/customize/shared/agent-resource-scope.js +123 -0
  125. package/dist/customize/shared/capability-library.d.ts +41 -0
  126. package/dist/customize/shared/capability-library.js +271 -0
  127. package/dist/customize/shared/capability-page-shell.d.ts +18 -1
  128. package/dist/customize/shared/capability-page-shell.js +21 -1
  129. package/dist/customize/shared/catalog/catalog-space-tabs.d.ts +14 -0
  130. package/dist/customize/shared/catalog/catalog-space-tabs.js +20 -0
  131. package/dist/customize/shared/customize-tab-bar.d.ts +13 -0
  132. package/dist/customize/shared/customize-tab-bar.js +95 -0
  133. package/dist/customize/shared/entity/entity-modal.d.ts +17 -1
  134. package/dist/customize/shared/entity/entity-modal.js +10 -9
  135. package/dist/customize/shared/leave-guard.d.ts +23 -0
  136. package/dist/customize/shared/leave-guard.js +87 -0
  137. package/dist/customize/shared/standalone-settings-nav.js +4 -1
  138. package/dist/customize/shared/tool-rules.d.ts +11 -0
  139. package/dist/customize/shared/tool-rules.js +29 -0
  140. package/dist/customize/skills/builtin-skill-modal.d.ts +6 -0
  141. package/dist/customize/skills/builtin-skill-modal.js +41 -0
  142. package/dist/customize/skills/skills-page.d.ts +21 -18
  143. package/dist/customize/skills/skills-page.js +16 -110
  144. package/dist/customize/triggers/runtime-triggers.d.ts +17 -0
  145. package/dist/customize/triggers/runtime-triggers.js +57 -0
  146. package/dist/customize/triggers/schedule/event-trigger-copy.js +2 -2
  147. package/dist/customize/triggers/schedule/post-to-field.js +2 -2
  148. package/dist/customize/triggers/schedule/schedule-copy.d.ts +11 -6
  149. package/dist/customize/triggers/schedule/schedule-copy.js +29 -8
  150. package/dist/customize/triggers/schedule/schedule-detail-sheet.js +7 -3
  151. package/dist/customize/triggers/schedule/trigger-composer-logic.d.ts +26 -1
  152. package/dist/customize/triggers/schedule/trigger-composer-logic.js +64 -3
  153. package/dist/customize/triggers/schedule/trigger-composer.js +57 -20
  154. package/dist/customize/triggers/schedule/trigger-edit-logic.js +18 -5
  155. package/dist/customize/triggers/schedule/trigger-filter.d.ts +10 -0
  156. package/dist/customize/triggers/schedule/trigger-filter.js +16 -0
  157. package/dist/customize/triggers/schedule/trigger-runs-panel.js +1 -0
  158. package/dist/customize/triggers/schedule/trigger-toast.js +2 -1
  159. package/dist/customize/triggers/schedule/use-trigger-mutations.d.ts +1 -1
  160. package/dist/customize/triggers/schedule/use-trigger-mutations.js +1 -1
  161. package/dist/customize/triggers/schedule/when-app.d.ts +15 -0
  162. package/dist/customize/triggers/schedule/when-app.js +21 -0
  163. package/dist/customize/triggers/schedule/when-change-request.d.ts +10 -0
  164. package/dist/customize/triggers/schedule/when-change-request.js +15 -0
  165. package/dist/customize/triggers/schedule-view.d.ts +17 -3
  166. package/dist/customize/triggers/schedule-view.js +46 -16
  167. package/dist/customize/triggers/triggers-page.d.ts +3 -3
  168. package/dist/customize/triggers/triggers-page.js +2 -2
  169. package/dist/customize/use-configure-thread.d.ts +8 -2
  170. package/dist/customize/use-configure-thread.js +30 -18
  171. package/dist/files/project/components/change-request-detail-dialog.js +2 -3
  172. package/dist/files/project/components/drive-explorer.js +6 -5
  173. package/dist/files/project/explorer-source.d.ts +3 -0
  174. package/dist/files/project/upload-batch.d.ts +3 -3
  175. package/dist/files/project/upload-batch.js +7 -6
  176. package/dist/files/runtime/sandbox-explorer-source.js +3 -3
  177. package/dist/i18n/en.d.ts +1330 -53
  178. package/dist/i18n/en.js +1422 -145
  179. package/dist/i18n/ui-catalog/remaining-ui-translation-keys.generated.js +16 -7
  180. package/dist/internal/auth/auth-primitives.d.ts +1 -3
  181. package/dist/internal/auth/auth-primitives.js +2 -2
  182. package/dist/internal/billing/session-cost-format.d.ts +1 -0
  183. package/dist/internal/billing/session-cost-format.js +11 -0
  184. package/dist/internal/components/agent-mark.d.ts +12 -1
  185. package/dist/internal/components/agent-mark.js +34 -11
  186. package/dist/internal/components/nav-rail.d.ts +22 -0
  187. package/dist/internal/components/nav-rail.js +16 -0
  188. package/dist/internal/components/repository-disconnected.js +2 -2
  189. package/dist/internal/goals/goal-meta.d.ts +15 -1
  190. package/dist/internal/goals/goal-meta.js +42 -2
  191. package/dist/internal/hooks/projects/use-agent-config.d.ts +11 -7
  192. package/dist/internal/hooks/projects/use-agent-config.js +28 -11
  193. package/dist/internal/hooks/use-slash-focus.d.ts +7 -1
  194. package/dist/internal/hooks/use-slash-focus.js +9 -3
  195. package/dist/internal/layout/project-capability-nav.d.ts +24 -0
  196. package/dist/internal/layout/project-capability-nav.js +86 -0
  197. package/dist/internal/layout/project-page-header.d.ts +1 -1
  198. package/dist/internal/layout/project-page-header.js +1 -1
  199. package/dist/internal/layout/project-settings-nav.d.ts +3 -2
  200. package/dist/internal/layout/project-settings-nav.js +5 -3
  201. package/dist/internal/lib/browser-noise/rules/old-browsers.js +1 -1
  202. package/dist/internal/lib/capability-tab-routes.d.ts +34 -3
  203. package/dist/internal/lib/capability-tab-routes.js +76 -8
  204. package/dist/internal/lib/manifest-health.d.ts +10 -0
  205. package/dist/internal/lib/manifest-health.js +20 -0
  206. package/dist/internal/lib/pixel-mark.d.ts +4 -1
  207. package/dist/internal/lib/pixel-mark.js +33 -6
  208. package/dist/internal/lib/project-actions.d.ts +1 -1
  209. package/dist/internal/lib/project-actions.js +0 -4
  210. package/dist/internal/lib/provider-branding.js +2 -0
  211. package/dist/internal/lib/space-scope.d.ts +29 -0
  212. package/dist/internal/lib/space-scope.js +28 -0
  213. package/dist/internal/lib/use-project-feature-flags.js +3 -3
  214. package/dist/internal/lib/web-notifications.d.ts +74 -8
  215. package/dist/internal/lib/web-notifications.js +243 -117
  216. package/dist/internal/notifications/notification-rows.d.ts +14 -7
  217. package/dist/internal/notifications/notification-rows.js +21 -14
  218. package/dist/internal/notifications/session-toast-cards.d.ts +2 -2
  219. package/dist/internal/reminders/reminder-format.d.ts +6 -2
  220. package/dist/internal/reminders/reminder-format.js +7 -1
  221. package/dist/internal/stores/active-space-store.d.ts +35 -0
  222. package/dist/internal/stores/active-space-store.js +29 -0
  223. package/dist/internal/stores/kortix-computer-store.js +13 -4
  224. package/dist/internal/stores/pinned-agents-store.d.ts +26 -0
  225. package/dist/internal/stores/pinned-agents-store.js +20 -0
  226. package/dist/internal/stores/session-panel-memory-store.js +3 -0
  227. package/dist/internal/stores/turn-attention-store.d.ts +5 -4
  228. package/dist/lib/routes.d.ts +16 -1
  229. package/dist/lib/routes.js +15 -3
  230. package/dist/markdown/doc-editor/doc-embed.d.ts +31 -0
  231. package/dist/markdown/doc-editor/doc-embed.js +168 -0
  232. package/dist/markdown/doc-editor/doc-extensions.d.ts +26 -0
  233. package/dist/markdown/doc-editor/doc-extensions.js +149 -0
  234. package/dist/markdown/doc-editor/doc-menus.d.ts +9 -0
  235. package/dist/markdown/doc-editor/doc-menus.js +56 -0
  236. package/dist/markdown/doc-editor/markdown.d.ts +12 -0
  237. package/dist/markdown/doc-editor/markdown.js +140 -0
  238. package/dist/markdown/genui/components/inline.d.ts +1 -1
  239. package/dist/primitives/badge.d.ts +1 -1
  240. package/dist/primitives/button.d.ts +1 -1
  241. package/dist/primitives/pixel-kortix-mark.d.ts +5 -4
  242. package/dist/primitives/pixel-kortix-mark.js +5 -15
  243. package/dist/primitives/tag.d.ts +1 -1
  244. package/dist/primitives/textarea.js +14 -0
  245. package/dist/primitives/toast.d.ts +2 -0
  246. package/dist/primitives/toast.js +4 -2
  247. package/dist/providers/ui-provider.d.ts +16 -0
  248. package/dist/session/actions/session-label.d.ts +1 -1
  249. package/dist/session/actions/session-label.js +3 -3
  250. package/dist/session/agents/agent-model.d.ts +92 -0
  251. package/dist/session/agents/agent-model.js +123 -0
  252. package/dist/session/agents/agent-state-mark.d.ts +10 -0
  253. package/dist/session/agents/agent-state-mark.js +22 -0
  254. package/dist/session/agents/agent-strip.d.ts +58 -0
  255. package/dist/session/agents/agent-strip.js +259 -0
  256. package/dist/session/agents/held-messages.d.ts +33 -0
  257. package/dist/session/agents/held-messages.js +50 -0
  258. package/dist/session/agents/legacy-subagent-chat.d.ts +11 -0
  259. package/dist/session/agents/legacy-subagent-chat.js +19 -0
  260. package/dist/session/agents/session-peek.d.ts +20 -0
  261. package/dist/session/agents/session-peek.js +67 -0
  262. package/dist/session/agents/session-prompt.d.ts +13 -0
  263. package/dist/session/agents/session-prompt.js +18 -0
  264. package/dist/session/agents/steer-session.d.ts +13 -0
  265. package/dist/session/agents/steer-session.js +29 -0
  266. package/dist/session/agents/subagent-dialog-content.d.ts +11 -0
  267. package/dist/session/agents/subagent-dialog-content.js +115 -0
  268. package/dist/session/agents/subagent-view.d.ts +8 -0
  269. package/dist/session/agents/subagent-view.js +18 -0
  270. package/dist/session/agents/tasks-panel.d.ts +13 -0
  271. package/dist/session/agents/tasks-panel.js +41 -0
  272. package/dist/session/agents/workflow-run-controls.d.ts +43 -0
  273. package/dist/session/agents/workflow-run-controls.js +141 -0
  274. package/dist/session/composer/ComposerCard.d.ts +1 -1
  275. package/dist/session/composer/ComposerCard.js +3 -3
  276. package/dist/session/composer/agent-selector.js +13 -19
  277. package/dist/session/composer/composer-underbar.d.ts +3 -1
  278. package/dist/session/composer/composer-underbar.js +2 -2
  279. package/dist/session/composer/composer.d.ts +5 -0
  280. package/dist/session/composer/composer.js +16 -10
  281. package/dist/session/composer/editor/composer-editor.js +19 -8
  282. package/dist/session/composer/editor/ultracode.d.ts +34 -0
  283. package/dist/session/composer/editor/ultracode.js +127 -0
  284. package/dist/session/composer/send-blockers.d.ts +1 -11
  285. package/dist/session/composer/send-blockers.js +1 -11
  286. package/dist/session/composer/session-composer-readiness.d.ts +1 -28
  287. package/dist/session/composer/session-composer-readiness.js +5 -16
  288. package/dist/session/header/reminder-parts.d.ts +1 -1
  289. package/dist/session/header/session-site-header.js +6 -3
  290. package/dist/session/header/subagent-hover-card.d.ts +0 -2
  291. package/dist/session/header/subagent-hover-card.js +1 -4
  292. package/dist/session/models/claude-connection-slot.d.ts +11 -0
  293. package/dist/session/models/claude-connection-slot.js +30 -0
  294. package/dist/session/models/model-availability.d.ts +3 -1
  295. package/dist/session/models/model-availability.js +3 -0
  296. package/dist/session/models/model-selector.js +11 -12
  297. package/dist/session/models/model-tags.d.ts +9 -0
  298. package/dist/session/models/model-tags.js +8 -0
  299. package/dist/session/panel/easy/easy-panel.js +1 -1
  300. package/dist/session/panel/easy/step-icon.js +5 -1
  301. package/dist/session/panel/mobile-tool-drawer.js +1 -1
  302. package/dist/session/panel/session-action-panel-column.js +1 -1
  303. package/dist/session/panel/session-desktop.js +41 -14
  304. package/dist/session/panel/session-panel-provider.d.ts +1 -1
  305. package/dist/session/panel/session-panel-provider.js +7 -11
  306. package/dist/session/prompts/question-prompt.js +3 -1
  307. package/dist/session/status/session-error-banner.js +4 -1
  308. package/dist/session/thread/session-chat.js +286 -296
  309. package/dist/session/thread/session-context-modal.js +29 -10
  310. package/dist/session/thread/session-context-spawned-sessions.d.ts +13 -0
  311. package/dist/session/thread/session-context-spawned-sessions.js +44 -0
  312. package/dist/session/thread/session-context-sub-sessions.js +3 -8
  313. package/dist/session/thread/transcript.d.ts +3 -0
  314. package/dist/session/thread/transcript.js +32 -8
  315. package/dist/session/tool/shared/full-view-action.d.ts +29 -0
  316. package/dist/session/tool/shared/full-view-action.js +43 -0
  317. package/dist/session/tool/tool-part-renderer.js +10 -2
  318. package/dist/session/tool/tools/agent-message-tool.js +2 -2
  319. package/dist/session/tool/tools/agent-spawn-tool.js +2 -2
  320. package/dist/session/tool/tools/agent-status-tool.js +2 -2
  321. package/dist/session/tool/tools/kortix-action-tool.d.ts +2 -0
  322. package/dist/session/tool/tools/kortix-action-tool.js +148 -0
  323. package/dist/session/tool/tools/kortix-tool-card.d.ts +83 -0
  324. package/dist/session/tool/tools/kortix-tool-card.js +186 -0
  325. package/dist/session/tool/tools/multi-agent-tool-bodies.d.ts +11 -0
  326. package/dist/session/tool/tools/multi-agent-tool-bodies.js +141 -0
  327. package/dist/session/tool/tools/multi-agent-tool-data.d.ts +63 -0
  328. package/dist/session/tool/tools/multi-agent-tool-data.js +118 -0
  329. package/dist/session/tool/tools/multi-agent-tools.d.ts +9 -0
  330. package/dist/session/tool/tools/multi-agent-tools.js +38 -0
  331. package/dist/session/tool/tools/question-tool.js +1 -1
  332. package/dist/session/tool/tools/register.d.ts +3 -0
  333. package/dist/session/tool/tools/register.js +3 -0
  334. package/dist/session/tool/tools/session-spawn-tool.js +2 -2
  335. package/dist/session/tool/tools/task-tool.d.ts +1 -1
  336. package/dist/session/tool/tools/task-tool.js +29 -41
  337. package/dist/session/tool/tools/workflow-progress.d.ts +34 -0
  338. package/dist/session/tool/tools/workflow-progress.js +186 -0
  339. package/dist/session/tool/tools/workflow-run.d.ts +128 -0
  340. package/dist/session/tool/tools/workflow-run.js +251 -0
  341. package/dist/session/tool/tools/workflow-tool.d.ts +9 -0
  342. package/dist/session/tool/tools/workflow-tool.js +253 -0
  343. package/dist/session/turn/notice-batch-group.d.ts +12 -0
  344. package/dist/session/turn/notice-batch-group.js +17 -0
  345. package/dist/session/turn/peer-message-row.d.ts +14 -0
  346. package/dist/session/turn/peer-message-row.js +57 -0
  347. package/dist/session/turn/subagent-notice-row.d.ts +4 -0
  348. package/dist/session/turn/subagent-notice-row.js +50 -0
  349. package/dist/session/turn/subagent-notice.d.ts +58 -0
  350. package/dist/session/turn/subagent-notice.js +111 -0
  351. package/dist/session/turn/user-message.js +24 -5
  352. package/dist/styles/tokens.css +2 -0
  353. package/dist/styles.css +1 -1
  354. package/dist/terminal/session-terminal-connect-bar.js +1 -1
  355. package/dist/workspace/admin/project-admin-dashboard.d.ts +53 -0
  356. package/dist/workspace/admin/project-admin-dashboard.js +252 -0
  357. package/dist/workspace/admin/project-admin-nav.d.ts +20 -0
  358. package/dist/workspace/admin/project-admin-nav.js +41 -0
  359. package/dist/workspace/home/welcome-body.js +25 -3
  360. package/dist/workspace/index.d.ts +6 -2
  361. package/dist/workspace/index.js +12 -2
  362. package/dist/workspace/layout/new-session-create.js +3 -3
  363. package/dist/workspace/layout/project-home.js +3 -3
  364. package/dist/workspace/memory/memory-labels.js +5 -0
  365. package/dist/workspace/repository-disconnected.js +2 -2
  366. package/dist/workspace/sessions/board-dispatch.d.ts +52 -0
  367. package/dist/workspace/sessions/board-dispatch.js +110 -0
  368. package/dist/workspace/sessions/board-grouping.d.ts +63 -0
  369. package/dist/workspace/sessions/board-grouping.js +141 -0
  370. package/dist/workspace/sessions/board-peek.d.ts +15 -0
  371. package/dist/workspace/sessions/board-peek.js +54 -0
  372. package/dist/workspace/sessions/board-state-mark.d.ts +15 -0
  373. package/dist/workspace/sessions/board-state-mark.js +24 -0
  374. package/dist/workspace/sessions/project-sessions-view.js +42 -31
  375. package/dist/workspace/sessions/sessions-board.d.ts +12 -0
  376. package/dist/workspace/sessions/sessions-board.js +214 -0
  377. package/dist/workspace/sidebar/footer/project-manifest-issues-alert.d.ts +46 -0
  378. package/dist/workspace/sidebar/footer/project-manifest-issues-alert.js +85 -0
  379. package/dist/workspace/sidebar/footer/sidebar-alert.js +1 -1
  380. package/dist/workspace/sidebar/new-agent-modal-provider.d.ts +12 -0
  381. package/dist/workspace/sidebar/new-agent-modal-provider.js +19 -0
  382. package/dist/workspace/sidebar/project-nav-items.d.ts +3 -1
  383. package/dist/workspace/sidebar/project-nav-items.js +53 -5
  384. package/dist/workspace/sidebar/project-session-list.js +35 -12
  385. package/dist/workspace/sidebar/project-sidebar.js +6 -3
  386. package/dist/workspace/sidebar/session-filter-menu.js +2 -1
  387. package/dist/workspace/space/space-blocks.d.ts +25 -0
  388. package/dist/workspace/space/space-blocks.js +124 -0
  389. package/dist/workspace/space/space-filter-tabs.d.ts +17 -0
  390. package/dist/workspace/space/space-filter-tabs.js +31 -0
  391. package/dist/workspace/space/space-page.d.ts +24 -0
  392. package/dist/workspace/space/space-page.js +157 -0
  393. package/dist/workspace/space/space-room.d.ts +20 -0
  394. package/dist/workspace/space/space-room.js +27 -0
  395. package/dist/workspace/space/space-tab-menu.d.ts +14 -0
  396. package/dist/workspace/space/space-tab-menu.js +127 -0
  397. package/dist/workspace/space/space-tab-panels.d.ts +9 -0
  398. package/dist/workspace/space/space-tab-panels.js +203 -0
  399. package/dist/workspace/space/space-templates.d.ts +34 -0
  400. package/dist/workspace/space/space-templates.js +71 -0
  401. package/dist/workspace/space/use-space-filter.d.ts +10 -0
  402. package/dist/workspace/space/use-space-filter.js +40 -0
  403. package/dist/workspace/space/use-space-manifest.d.ts +8 -0
  404. package/dist/workspace/space/use-space-manifest.js +27 -0
  405. package/dist/workspace/spaces/space-timeline.js +2 -2
  406. package/package.json +56 -53
  407. package/skills/kortix-ui/SKILL.md +1 -1
  408. package/skills/kortix-ui/references/custom-dashboard.md +10 -4
  409. package/skills/kortix-ui/references/modules.md +10 -8
  410. package/dist/_vendor/shared/meta-agent.d.ts +0 -7
  411. package/dist/customize/agents/agent-grant-pages.d.ts +0 -37
  412. package/dist/customize/agents/agent-grant-pages.js +0 -226
  413. package/dist/customize/agents/agent-triggers-section.d.ts +0 -17
  414. package/dist/customize/agents/agent-triggers-section.js +0 -109
  415. package/dist/customize/migrate-to-v2/index.d.ts +0 -5
  416. package/dist/customize/migrate-to-v2/index.js +0 -5
  417. package/dist/customize/migrate-to-v2/migration-prompt.d.ts +0 -16
  418. package/dist/customize/migrate-to-v2/migration-prompt.js +0 -59
  419. package/dist/customize/migrate-to-v2/upgrade-defs.d.ts +0 -30
  420. package/dist/customize/migrate-to-v2/upgrade-defs.js +0 -43
  421. package/dist/customize/migrate-to-v2/upgrade-view.d.ts +0 -32
  422. package/dist/customize/migrate-to-v2/upgrade-view.js +0 -152
  423. package/dist/customize/migrate-to-v2/use-run-upgrade.d.ts +0 -18
  424. package/dist/customize/migrate-to-v2/use-run-upgrade.js +0 -16
  425. package/dist/customize/shared/capability-tabs.d.ts +0 -3
  426. package/dist/customize/shared/capability-tabs.js +0 -137
  427. package/dist/customize/skills/skill-scope.d.ts +0 -14
  428. package/dist/customize/skills/skill-scope.js +0 -18
  429. package/dist/internal/lib/manifest-version.d.ts +0 -21
  430. package/dist/internal/lib/manifest-version.js +0 -55
  431. package/dist/session/composer/hooks/use-composer-escape-stop.d.ts +0 -6
  432. package/dist/session/composer/hooks/use-composer-escape-stop.js +0 -28
  433. package/dist/session/thread/sub-session-modal-content.d.ts +0 -8
  434. package/dist/session/thread/sub-session-modal-content.js +0 -23
  435. package/dist/session/thread/sub-session-modal.d.ts +0 -2
  436. package/dist/session/thread/sub-session-modal.js +0 -14
  437. package/dist/workspace/sidebar/footer/project-manifest-upgrade-alert.d.ts +0 -13
  438. package/dist/workspace/sidebar/footer/project-manifest-upgrade-alert.js +0 -48
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useTranslations } from '../../i18n/index.js';
4
4
  /**
5
5
  * Triggers — the single capability page at `/projects/<id>/triggers`,
@@ -46,7 +46,7 @@ import { newConfigPrompt, useConfigureThread, } from '../use-configure-thread.js
46
46
  import { useProjectFeatureFlags } from '../../internal/lib/use-project-feature-flags.js';
47
47
  import { hasOpenFloatingLayer } from '../../lib/z-stack.js';
48
48
  import { deleteProjectTrigger, fireProjectTrigger, listProjectTriggers, setProjectTriggersActivation, updateProjectTrigger, } from '@kortix/sdk';
49
- import { contract, qk, useProjectTriggerEventApps, useTriggerRuns } from '@kortix/sdk/react';
49
+ import { contract, qk, useProjectApps, useUnifiedTriggers, useProjectTriggerEventApps, useTriggerRuns, } from '@kortix/sdk/react';
50
50
  import { CheckSquareIcon, DotsThreeIcon, LightningIcon, PauseIcon, PlayIcon, PlusIcon, MagnifyingGlassIcon as SearchIcon, } from '@phosphor-icons/react';
51
51
  import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
52
52
  import { useUiPathname, useUiRouter, useUiSearchParams } from '../../providers/ui-provider.js';
@@ -57,9 +57,11 @@ import { EventAppsStrip } from './schedule/event-apps-strip.js';
57
57
  import { describeWhen, isCustomerTrigger, isTriggerKind, localizedKindCopy, localizedTriggersCopy, matchesQuery, triggerName, } from './schedule/schedule-copy.js';
58
58
  import { ScheduleDetailSplitContent } from './schedule/schedule-detail-sheet.js';
59
59
  import { TriggerComposer } from './schedule/trigger-composer.js';
60
+ import { eventSendingApps } from './schedule/trigger-composer-logic.js';
60
61
  import { useTriggerControls } from './schedule/trigger-controls.js';
61
- import { TRIGGER_FILTERS, filterTriggers, groupTriggersByApp, parseTriggerFilter, readTriggerSheet, triggerSheetHref, } from './schedule/trigger-filter.js';
62
+ import { TRIGGER_FILTERS, filterTriggers, groupTriggersByApp, parseTriggerFilter, readTriggerSheet, triggerSheetHref, triggersForAgent, } from './schedule/trigger-filter.js';
62
63
  import { TriggerList } from './schedule/trigger-list.js';
64
+ import { RuntimeTriggers, runtimeRowsFor } from './runtime-triggers.js';
63
65
  import { runsInFlight } from './schedule/trigger-runs-logic.js';
64
66
  import { runsOf } from './schedule/trigger-runs-panel.js';
65
67
  import { bulkTargets, runSequentially, selectAllShown, selectRange, toggleSlug, visibleSelection, } from './schedule/trigger-selection.js';
@@ -72,6 +74,7 @@ const FILTER_LABEL_KEY = {
72
74
  event: 'text0ba357fa63f8',
73
75
  app: 'text4b4847a6fb87',
74
76
  webhook: 'text45808d75bf89',
77
+ change_request: 'text5ffd973e20ed',
75
78
  };
76
79
  /**
77
80
  * Pure: no hooks, no data fetching. The toolbar's ⋯ menu (Paper C03 `6O9-0`
@@ -81,13 +84,15 @@ const FILTER_LABEL_KEY = {
81
84
  * {@link TriggerActivationMenu} so the gate renders under
82
85
  * `renderToStaticMarkup` without a QueryClient.
83
86
  */
84
- export function TriggerToolbarMenu({ canManage, paused, isPending, onToggle, onSelectMode, }) {
87
+ export function TriggerToolbarMenu({ canManage, paused, isPending, onToggle, onSelectMode, projectSwitch = true, }) {
85
88
  const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
86
89
  if (!canManage)
87
90
  return null;
91
+ if (!projectSwitch && !onSelectMode)
92
+ return null;
88
93
  return (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { variant: "secondary", size: "icon-base",
89
94
  // `size-9`: the New trigger button and the search input beside it are `h-9`.
90
- className: "size-9", disabled: isPending, "aria-label": tI18nComplete.raw('textd47d7cb0e4f8'), children: _jsx(DotsThreeIcon, { className: "text-muted-foreground size-4 shrink-0" }) }) }), _jsxs(DropdownMenuContent, { align: "end", className: "w-76", children: [_jsx(DropdownMenuItem, { className: RICH_ROW_CLASS, disabled: paused, onSelect: () => onToggle(true), children: _jsx(RichRowBody, { icon: PauseIcon, title: tI18nComplete.raw('text0b6258b50010'), description: tI18nComplete.raw('textdae75dce541f') }) }), _jsx(DropdownMenuItem, { className: RICH_ROW_CLASS, disabled: !paused, onSelect: () => onToggle(false), children: _jsx(RichRowBody, { icon: PlayIcon, title: tI18nComplete.raw('text43e673c5503d'), description: tI18nComplete.raw('textced57bebd466') }) }), onSelectMode ? (_jsxs(_Fragment, { children: [_jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuItem, { onSelect: onSelectMode, children: [_jsx(CheckSquareIcon, {}), tI18nComplete.raw('text2a78025de6aa')] })] })) : null] })] }));
95
+ className: "size-9", disabled: isPending, "aria-label": tI18nComplete.raw('textd47d7cb0e4f8'), children: _jsx(DotsThreeIcon, { className: "text-muted-foreground size-4 shrink-0" }) }) }), _jsxs(DropdownMenuContent, { align: "end", className: "w-76", children: [projectSwitch ? (_jsxs(_Fragment, { children: [_jsx(DropdownMenuItem, { className: RICH_ROW_CLASS, disabled: paused, onSelect: () => onToggle(true), children: _jsx(RichRowBody, { icon: PauseIcon, title: tI18nComplete.raw('text0b6258b50010'), description: tI18nComplete.raw('textdae75dce541f') }) }), _jsx(DropdownMenuItem, { className: RICH_ROW_CLASS, disabled: !paused, onSelect: () => onToggle(false), children: _jsx(RichRowBody, { icon: PlayIcon, title: tI18nComplete.raw('text43e673c5503d'), description: tI18nComplete.raw('textced57bebd466') }) })] })) : null, onSelectMode ? (_jsxs(_Fragment, { children: [projectSwitch ? _jsx(DropdownMenuSeparator, {}) : null, _jsxs(DropdownMenuItem, { onSelect: onSelectMode, children: [_jsx(CheckSquareIcon, {}), tI18nComplete.raw('text2a78025de6aa')] })] })) : null] })] }));
91
96
  }
92
97
  /**
93
98
  * The project-wide pause switch (`PATCH /projects/:id/triggers/activation`):
@@ -132,7 +137,7 @@ export function useTriggersActivation(projectId) {
132
137
  *
133
138
  * Exported for `trigger-activation-menu.test.tsx`, which renders it per role.
134
139
  */
135
- export function TriggerActivationMenu({ projectId, onSelectMode, }) {
140
+ export function TriggerActivationMenu({ projectId, onSelectMode, projectSwitch, }) {
136
141
  const queryKey = qk.project.triggers(projectId);
137
142
  const triggersQuery = useQuery({
138
143
  queryKey,
@@ -145,13 +150,26 @@ export function TriggerActivationMenu({ projectId, onSelectMode, }) {
145
150
  // is the update control rather than `ScheduleView`'s create gate.
146
151
  const canManage = useTriggerControls(projectId).canUpdate;
147
152
  const mutation = useTriggersActivation(projectId);
148
- return (_jsx(TriggerToolbarMenu, { canManage: canManage, paused: paused, isPending: mutation.isPending || triggersQuery.isLoading, onToggle: (v) => mutation.mutate(v), onSelectMode: onSelectMode }));
153
+ return (_jsx(TriggerToolbarMenu, { canManage: canManage, paused: paused, isPending: mutation.isPending || triggersQuery.isLoading, onToggle: (v) => mutation.mutate(v), onSelectMode: onSelectMode, projectSwitch: projectSwitch }));
154
+ }
155
+ /**
156
+ * The seed prompt of New trigger → Chat. On one agent's page it names the
157
+ * agent, as the manual path preselects it (`initialAgent`).
158
+ */
159
+ function triggerChatPrompt(agentName) {
160
+ if (!agentName)
161
+ return newConfigPrompt('trigger');
162
+ return (`I want to set up a trigger that starts the "${agentName}" agent in this project. ` +
163
+ 'Ask me what it should do and on what schedule or event, then create it with the ' +
164
+ 'Kortix CLI and show me the result.');
149
165
  }
150
- export function ScheduleView({ projectId }) {
166
+ export function ScheduleView({ projectId, surface = { kind: 'global' }, defaultAgent, }) {
167
+ const agentName = surface.kind === 'agent' ? surface.agentName : null;
168
+ const tAgentScope = useTranslations('agentScope');
151
169
  const router = useUiRouter();
152
170
  const pathname = useUiPathname();
153
171
  const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
154
- const tAutomations = useTranslations('automationsPause');
172
+ const tPauseAll = useTranslations('automationsPause');
155
173
  const copy = localizedTriggersCopy(tI18nComplete);
156
174
  const kindCopy = localizedKindCopy(tI18nComplete);
157
175
  const queryClient = useQueryClient();
@@ -168,6 +186,8 @@ export function ScheduleView({ projectId }) {
168
186
  ...contract('config'),
169
187
  refetchInterval: 10_000,
170
188
  });
189
+ // Runtime triggers (loops included) list below the kortix.yaml ones (`RuntimeTriggers`).
190
+ const hasRuntime = runtimeRowsFor(useUnifiedTriggers(projectId).data?.triggers ?? [], agentName).length > 0;
171
191
  const [query, setQuery] = useState('');
172
192
  // The input shows every keystroke; the list filters 200 ms after the last one.
173
193
  const { debouncedValue: debouncedQuery } = useDebounce(query, 200);
@@ -189,9 +209,11 @@ export function ScheduleView({ projectId }) {
189
209
  // closed: until the flag resolves on, nothing that lists, browses or requests events renders.
190
210
  const featureFlags = useProjectFeatureFlags(projectId);
191
211
  const eventsOn = featureFlags.flags.event_triggers === true;
192
- // The App events tab shows once a project has one: most never will.
212
+ // The App events tab shows once the project has an App that sends events, or an App event trigger.
213
+ const hasKortixApps = eventSendingApps(useProjectApps(projectId).data).length > 0;
193
214
  const hasAppTriggers = (triggersQuery.data?.triggers ?? []).some((t) => t.type === 'app');
194
- const filters = useMemo(() => TRIGGER_FILTERS.filter((f) => (f !== 'event' || eventsOn) && (f !== 'app' || hasAppTriggers)), [eventsOn, hasAppTriggers]);
215
+ const showAppFilter = hasKortixApps || hasAppTriggers;
216
+ const filters = useMemo(() => TRIGGER_FILTERS.filter((f) => (f !== 'event' || eventsOn) && (f !== 'app' || showAppFilter)), [eventsOn, showAppFilter]);
195
217
  // `?type=cron|event|webhook` is the kind filter; anything else, and `event` while events are off, is all.
196
218
  const filter = parseTriggerFilter(searchParams?.get('type'), filters);
197
219
  const setFilter = (next) => {
@@ -250,7 +272,10 @@ export function ScheduleView({ projectId }) {
250
272
  // every new project: hiding it keeps the empty state reachable on a fresh
251
273
  // project without making the customer delete a trigger they never created.
252
274
  // It still schedules and fires — this is display only.
253
- const triggers = useMemo(() => (triggersQuery.data?.triggers ?? []).filter((t) => isTriggerKind(t.type) && isCustomerTrigger(t)), [triggersQuery.data]);
275
+ const triggers = useMemo(() => {
276
+ const shown = (triggersQuery.data?.triggers ?? []).filter((t) => isTriggerKind(t.type) && isCustomerTrigger(t));
277
+ return agentName ? triggersForAgent(shown, agentName, defaultAgent) : shown;
278
+ }, [triggersQuery.data, agentName, defaultAgent]);
254
279
  // The search only renders over a non-empty list; focus it once it does.
255
280
  const searchRef = useRef(null);
256
281
  useSlashFocus(searchRef, showContent && triggers.length > 0);
@@ -382,7 +407,7 @@ export function ScheduleView({ projectId }) {
382
407
  pane switched by `type`. It read the Settings rail while
383
408
  Schedules/Webhooks were overlay panes; a capability page has no rail
384
409
  entry, and a rail lookup that misses renders no heading at all. */
385
- title: copy.title, description: copy.description,
410
+ title: copy.title, description: agentName ? tAgentScope('triggersDescription') : copy.description,
386
411
  // Beside an open trigger the list is a 40% column: stack the header so
387
412
  // search, Pause all and New trigger share one full-width row.
388
413
  stacked: !!selected, search: showContent && triggers.length > 0 ? (_jsxs(InputGroupSearch, { children: [_jsx(InputGroupSearchIcon, { children: _jsx(SearchIcon, {}) }), _jsx(InputGroupSearchInput, { ref: searchRef, placeholder: copy.searchPlaceholder, value: query, onChange: (e) => setQuery(e.target.value), variant: "popover", size: "sm" }), _jsx(InputGroupSearchClear, { onClick: () => setQuery('') })] })) : undefined, filters: showFilter ? (_jsx(Tabs, { value: filter, onValueChange: (next) => setFilter(parseTriggerFilter(next, filters)), className: "max-w-full overflow-x-auto", children: _jsx(TabsList, { type: "underline", underlineSize: "md", size: "sm", "aria-label": tI18nComplete.raw('text51035b5b67dc'), className: "h-8 justify-start gap-5", children: filters.map((value) => (_jsx(TabsTrigger, { value: value, className: "flex-none px-0 text-xs font-medium", children: tI18nComplete.raw(FILTER_LABEL_KEY[value]) }, value))) }) })) : undefined, action:
@@ -393,9 +418,14 @@ export function ScheduleView({ projectId }) {
393
418
  on an error or a 403. */
394
419
  showContent ? (
395
420
  // Search, then one group: ⋯ and New trigger, both `secondary` at `h-9`, the search input's height.
396
- _jsxs(ButtonGroup, { children: [triggers.length > 0 || paused ? (_jsx(TriggerActivationMenu, { projectId: projectId, onSelectMode: triggers.length > 0 ? enterSelectMode : undefined })) : null, canWrite ? (_jsx(NewEntityMenu, { label: copy.createLabel, pending: configure.pending, onChat: () => configure.start(newConfigPrompt('trigger')), manual: { onSelect: () => openCreate() }, caret: false })) : null] })) : undefined, children: [_jsxs("div", { className: "space-y-4", children: [accountPaused && showContent && (_jsxs(Alert, { variant: "warning", children: [_jsx(AlertTitle, { children: tAutomations('bannerTitle') }), _jsx(AlertDescription, { children: tAutomations('bannerDescription') })] })), paused && showContent && (_jsxs(Alert, { variant: "warning", children: [_jsx(AlertTitle, { children: tI18nComplete.raw('textb18b93a52cd2') }), _jsx(AlertDescription, { children: tI18nComplete.raw('textc9e9d972eda2') }), controls.canUpdate ? (_jsx(AlertActions, { children: _jsxs(Button, { variant: "outline", size: "sm", disabled: resumeAll.isPending, onClick: () => resumeAll.mutate(false), children: [resumeAll.isPending ? _jsx(Loading, { className: "size-3.5 shrink-0" }) : null, tI18nComplete.raw('text43e673c5503d')] }) })) : null] })), triggersQuery.isLoading ? (_jsx("div", { className: "space-y-1", children: Array.from({ length: 5 }).map((_, i) => (
421
+ _jsxs(ButtonGroup, { children: [triggers.length > 0 || (paused && !agentName) ? (_jsx(TriggerActivationMenu, { projectId: projectId, onSelectMode: triggers.length > 0 ? enterSelectMode : undefined, projectSwitch: !agentName })) : null, canWrite ? (_jsx(NewEntityMenu, { label: copy.createLabel, pending: configure.pending, onChat: () => configure.start(triggerChatPrompt(agentName)), manual: { onSelect: () => openCreate() }, caret: false })) : null] })) : undefined, children: [_jsxs("div", { className: "space-y-4", children: [accountPaused && showContent && (_jsxs(Alert, { variant: "warning", children: [_jsx(AlertTitle, { children: tPauseAll('bannerTitle') }), _jsx(AlertDescription, { children: tPauseAll('bannerDescription') })] })), paused && showContent && (_jsxs(Alert, { variant: "warning", children: [_jsx(AlertTitle, { children: tI18nComplete.raw('textb18b93a52cd2') }), _jsx(AlertDescription, { children: agentName ? tAgentScope('projectPaused') : tI18nComplete.raw('textc9e9d972eda2') }), controls.canUpdate && !agentName ? (_jsx(AlertActions, { children: _jsxs(Button, { variant: "outline", size: "sm", disabled: resumeAll.isPending, onClick: () => resumeAll.mutate(false), children: [resumeAll.isPending ? _jsx(Loading, { className: "size-3.5 shrink-0" }) : null, tI18nComplete.raw('text43e673c5503d')] }) })) : null] })), triggersQuery.isLoading ? (_jsx("div", { className: "space-y-1", children: Array.from({ length: 5 }).map((_, i) => (
397
422
  // biome-ignore lint/suspicious/noArrayIndexKey: fixed-length placeholder
398
- _jsx(Skeleton, { className: "h-10 rounded-md" }, i))) })) : isForbidden ? (_jsxs(Alert, { variant: "warning", children: [_jsx(AlertTitle, { children: tI18nComplete.raw('textabb84be05cfa') }), _jsxs(AlertDescription, { children: [tI18nComplete.raw('text22cd1f210415'), " ", copy.noun, tI18nComplete.raw('text382584f2456e')] })] })) : triggersQuery.isError ? (_jsx(ErrorState, { size: "sm", title: tI18nComplete('text7ce02a51e3dd', { value0: copy.noun }), description: triggersQuery.error?.message ?? tI18nComplete.raw('text0c953ab32c60'), action: _jsx(Button, { variant: "outline", size: "sm", onClick: () => triggersQuery.refetch(), children: tI18nComplete.raw('textd8b8392e2c54') }) })) : filter !== 'all' && ofKind.length === 0 ? (_jsx(EmptyState, { size: "sm", title: kindCopy[filter].emptyTitle })) : triggers.length === 0 ? (_jsx(EmptyState, { icon: LightningIcon, title: copy.emptyTitle, description: copy.emptyBody, className: "py-12", action: canWrite ? (_jsxs(Button, { variant: "outline", size: "sm", className: "gap-1.5", onClick: () => openCreate(), children: [_jsx(PlusIcon, { className: "size-4 shrink-0" }), copy.createLabel] })) : undefined })) : filtered.length === 0 ? (_jsxs("p", { className: "text-muted-foreground px-3 py-6 text-center text-xs", children: [tI18nComplete.raw('text965b516df3ba'), ' ', _jsx("span", { className: "text-foreground font-medium", children: debouncedQuery }), "."] })) : (_jsx(TriggerList, { triggers: filtered, groups: appGroups, eventNames: eventNames, projectPaused: paused, selectedSlug: selected?.slug ?? null, runningSlug: run.isPending ? (run.variables?.slug ?? null) : liveSlug, onOpen: (t) => openTrigger(t.slug), selection: selectMode
423
+ _jsx(Skeleton, { className: "h-10 rounded-md" }, i))) })) : isForbidden ? (_jsxs(Alert, { variant: "warning", children: [_jsx(AlertTitle, { children: tI18nComplete.raw('textabb84be05cfa') }), _jsxs(AlertDescription, { children: [tI18nComplete.raw('text22cd1f210415'), " ", copy.noun, tI18nComplete.raw('text382584f2456e')] })] })) : triggersQuery.isError ? (_jsx(ErrorState, { size: "sm", title: tI18nComplete('text7ce02a51e3dd', { value0: copy.noun }), description: triggersQuery.error?.message ?? tI18nComplete.raw('text0c953ab32c60'), action: _jsx(Button, { variant: "outline", size: "sm", onClick: () => triggersQuery.refetch(), children: tI18nComplete.raw('textd8b8392e2c54') }) })) : filter === 'app' && ofKind.length === 0 ? (
424
+ // The App events tab can show before the first one exists: say what it is and offer one.
425
+ _jsx(EmptyState, { size: "sm", title: kindCopy.app.emptyTitle, description: kindCopy.app.emptyBody, action: canWrite ? (_jsxs(Button, { variant: "outline", size: "sm", className: "gap-1.5", onClick: () => openCreate('app'), children: [_jsx(PlusIcon, { className: "size-4 shrink-0" }), kindCopy.app.createLabel] })) : undefined })) : filter !== 'all' && ofKind.length === 0 ? (_jsx(EmptyState, { size: "sm", title: kindCopy[filter].emptyTitle })) : triggers.length === 0 && hasRuntime ? null : triggers.length === 0 && agentName ? (
426
+ // One muted line (brand: no icon tile). New trigger is already
427
+ // in the header, preselected to this agent.
428
+ _jsx(EmptyState, { size: "sm", title: tAgentScope('triggersEmpty') })) : triggers.length === 0 ? (_jsx(EmptyState, { icon: LightningIcon, title: copy.emptyTitle, description: copy.emptyBody, className: "py-12", action: canWrite ? (_jsxs(Button, { variant: "outline", size: "sm", className: "gap-1.5", onClick: () => openCreate(), children: [_jsx(PlusIcon, { className: "size-4 shrink-0" }), copy.createLabel] })) : undefined })) : filtered.length === 0 ? (_jsxs("p", { className: "text-muted-foreground px-3 py-6 text-center text-xs", children: [tI18nComplete.raw('text965b516df3ba'), ' ', _jsx("span", { className: "text-foreground font-medium", children: debouncedQuery }), "."] })) : (_jsx(TriggerList, { triggers: filtered, groups: appGroups, eventNames: eventNames, projectPaused: paused, selectedSlug: selected?.slug ?? null, runningSlug: run.isPending ? (run.variables?.slug ?? null) : liveSlug, onOpen: (t) => openTrigger(t.slug), selection: selectMode
399
429
  ? {
400
430
  selected: selectedSlugs,
401
431
  onToggle: (t, range) => {
@@ -405,7 +435,7 @@ export function ScheduleView({ projectId }) {
405
435
  setAnchorSlug(t.slug);
406
436
  },
407
437
  }
408
- : null })), showContent && eventsOn && filter === 'event' ? (_jsx(EventAppsStrip, { projectId: projectId, disabled: !canWrite, onPick: (app) => openCreate('event', { app: app.app, source: app.source, provider: app.provider }) })) : null, parseErrors.length > 0 && (_jsxs(Alert, { variant: "warning", children: [_jsx(AlertTitle, { children: tI18nComplete.raw('text5f6dc605ac36') }), _jsx(AlertDescription, { children: _jsx("ul", { className: "space-y-0.5 text-xs", children: parseErrors.map((err) => (_jsxs("li", { children: [_jsx("code", { className: "font-mono", children: err.path }), " \u2014 ", err.error] }, err.slug))) }) })] }))] }), _jsx(TriggerComposer, { projectId: projectId, open: createOpen, onOpenChange: setCreateOpen, initialKind: createKind, initialApp: createApp, onCreated: (slug) => {
438
+ : null })), showContent && filter === 'all' ? _jsx(RuntimeTriggers, { projectId: projectId, agentName: agentName }) : null, showContent && eventsOn && filter === 'event' ? (_jsx(EventAppsStrip, { projectId: projectId, disabled: !canWrite, onPick: (app) => openCreate('event', { app: app.app, source: app.source, provider: app.provider }) })) : null, parseErrors.length > 0 && (_jsxs(Alert, { variant: "warning", children: [_jsx(AlertTitle, { children: tI18nComplete.raw('text5f6dc605ac36') }), _jsx(AlertDescription, { children: _jsx("ul", { className: "space-y-0.5 text-xs", children: parseErrors.map((err) => (_jsxs("li", { children: [_jsx("code", { className: "font-mono", children: err.path }), " \u2014 ", err.error] }, err.slug))) }) })] }))] }), _jsx(TriggerComposer, { projectId: projectId, open: createOpen, onOpenChange: setCreateOpen, initialKind: createKind, initialApp: createApp, initialAgent: agentName, onCreated: (slug) => {
409
439
  setCreateOpen(false);
410
440
  invalidate();
411
441
  // Drop straight into the new entry so the address or the first run
@@ -1,3 +1,5 @@
1
+ import type { ComponentProps } from 'react';
2
+ import { ScheduleView } from './schedule-view.js';
1
3
  /**
2
4
  * The page body for /projects/[id]/triggers — the capability tab that
3
5
  * graduated out of the Settings overlay. A trigger is one resource with two
@@ -16,6 +18,4 @@
16
18
  * `max-w-2xl` heading — which is exactly what made this tab read as a
17
19
  * different product from the three beside it.
18
20
  */
19
- export declare function TriggersPage({ projectId }: {
20
- projectId: string;
21
- }): import("react").JSX.Element;
21
+ export declare function TriggersPage(props: ComponentProps<typeof ScheduleView>): import("react").JSX.Element;
@@ -19,6 +19,6 @@ import { ScheduleView } from './schedule-view.js';
19
19
  * `max-w-2xl` heading — which is exactly what made this tab read as a
20
20
  * different product from the three beside it.
21
21
  */
22
- export function TriggersPage({ projectId }) {
23
- return _jsx(ScheduleView, { projectId: projectId });
22
+ export function TriggersPage(props) {
23
+ return _jsx(ScheduleView, { ...props });
24
24
  }
@@ -3,7 +3,7 @@ export { editConfigPrompt, newConfigPrompt, type ConfigureKind } from '../_vendo
3
3
  export interface ConfigureThread {
4
4
  /** Spin up a configure session for `prompt`, then close Customize + navigate.
5
5
  * A bare string becomes the default durable payload; a `PendingSessionPrompt`
6
- * (see `pendingUpgradePrompt`) is passed through unchanged. */
6
+ * (an agent pick, as `ProjectManifestIssuesAlert` sends) is passed through unchanged. */
7
7
  start: (prompt: string | PendingSessionPrompt) => void;
8
8
  /**
9
9
  * True while a session is being created. Creating one is a network round-trip
@@ -12,4 +12,10 @@ export interface ConfigureThread {
12
12
  */
13
13
  pending: boolean;
14
14
  }
15
- export declare function useConfigureThread(projectId: string): ConfigureThread;
15
+ /**
16
+ * `resetOnNavigate`: free the button once the new session opens. For a control that
17
+ * stays on screen (the sidebar); an overlay closes instead, so it keeps `pending`.
18
+ */
19
+ export declare function useConfigureThread(projectId: string, { resetOnNavigate }?: {
20
+ resetOnNavigate?: boolean;
21
+ }): ConfigureThread;
@@ -14,34 +14,46 @@
14
14
  import { useCallback, useState } from 'react';
15
15
  import { useNewProjectSession } from '../internal/hooks/projects/use-new-project-session.js';
16
16
  import { useSettingsPanelStore } from '../internal/stores/settings-panel-store.js';
17
+ import { useGuardedLeave } from './shared/leave-guard.js';
17
18
  export { editConfigPrompt, newConfigPrompt } from '../_vendor/kortix-shared.js';
18
- export function useConfigureThread(projectId) {
19
+ /**
20
+ * `resetOnNavigate`: free the button once the new session opens. For a control that
21
+ * stays on screen (the sidebar); an overlay closes instead, so it keeps `pending`.
22
+ */
23
+ export function useConfigureThread(projectId, { resetOnNavigate = false } = {}) {
19
24
  const closeCustomize = useSettingsPanelStore((s) => s.close);
20
25
  const [pending, setPending] = useState(false);
21
26
  const newSession = useNewProjectSession(projectId);
27
+ const guardedLeave = useGuardedLeave();
22
28
  const start = useCallback((prompt) => {
23
29
  const pendingPrompt = typeof prompt === 'string' ? { text: prompt, agent: null, model: null, variant: null } : prompt;
24
30
  // Guard re-entry: ignore extra clicks while a session is being minted so
25
31
  // we don't fire two creates (two billed sessions for one click).
26
32
  if (pending)
27
33
  return;
28
- setPending(true);
29
- // Optimistic, identical to the project-home composer: mint the session,
30
- // stash the seed prompt, close the overlay, and drop into the instant shell
31
- // — which shows the prompt + inline boot status and auto-sends it once the
32
- // runtime is ready (the hook persists + bounces on a terminal failure).
33
- // Leave `pending` true: we're navigating away and the overlay is closing,
34
- // so flipping it back would only flash the idle button.
35
- newSession({
36
- // The prompt is a durable inbox row from the create itself — the API
37
- // converts `pending_prompt` inside the session-create transaction, so
38
- // a closed tab between here and the workbench cannot lose it. No
39
- // start-stash: there are no picks to hand off.
40
- create: { pending_prompt: pendingPrompt },
41
- onNavigate: () => {
42
- closeCustomize();
43
- },
34
+ // Under a page with unsaved edits (the agent editor), the new session
35
+ // waits until the person chooses to leave them.
36
+ guardedLeave(() => {
37
+ setPending(true);
38
+ // Optimistic, identical to the project-home composer: mint the session,
39
+ // stash the seed prompt, close the overlay, and drop into the instant shell
40
+ // — which shows the prompt + inline boot status and auto-sends it once the
41
+ // runtime is ready (the hook persists + bounces on a terminal failure).
42
+ // Leave `pending` true: we're navigating away and the overlay is closing,
43
+ // so flipping it back would only flash the idle button.
44
+ newSession({
45
+ // The prompt is a durable inbox row from the create itself — the API
46
+ // converts `pending_prompt` inside the session-create transaction, so
47
+ // a closed tab between here and the workbench cannot lose it. No
48
+ // start-stash: there are no picks to hand off.
49
+ create: { pending_prompt: pendingPrompt },
50
+ onNavigate: () => {
51
+ closeCustomize();
52
+ if (resetOnNavigate)
53
+ setPending(false);
54
+ },
55
+ });
44
56
  });
45
- }, [pending, newSession, closeCustomize]);
57
+ }, [pending, newSession, closeCustomize, guardedLeave, resetOnNavigate]);
46
58
  return { start, pending };
47
59
  }
@@ -26,7 +26,7 @@ import { Skeleton } from '../../../primitives/skeleton.js';
26
26
  import { errorToast, successToast } from '../../../primitives/toast.js';
27
27
  import { ChangeList, ChangeSummary, DiffLayoutToggle, ExpandAllButton, diffViewportClass, entryFromCommitFile, fileCount, proposedChangeTimeline, splitUnifiedPatch, useChangeExpansion, } from '../../../changes/index.js';
28
28
  import { EmptyState } from '../../../primitives/empty-state.js';
29
- import { manifestFilename, useProjectManifestVersion, } from '../../../internal/lib/manifest-version.js';
29
+ import { useProjectManifestHealth } from '../../../internal/lib/manifest-health.js';
30
30
  import { useProjectCans } from '../../../internal/lib/use-project-can.js';
31
31
  import { REVIEW_CONTROL_ACTIONS, changeRequestControlsFrom } from '@kortix/sdk';
32
32
  import { ArrowCounterClockwiseIcon, CheckIcon, FileDashedIcon, SparkleIcon, WarningIcon, XIcon, } from '@phosphor-icons/react';
@@ -55,8 +55,7 @@ export function ChangeRequestDetailDialog({ crId, onClose, onOpenChangeRequest }
55
55
  const projectContext = useProjectContext();
56
56
  const projectId = projectContext?.projectId ?? '';
57
57
  const defaultBranch = projectContext?.defaultBranch ?? 'main';
58
- const { version: manifestVersion } = useProjectManifestVersion(projectId);
59
- const manifestFile = manifestFilename(manifestVersion);
58
+ const manifestFile = useProjectManifestHealth(projectId)?.path ?? 'kortix.yaml';
60
59
  // Each decision shows only for a viewer who holds the leaves its route
61
60
  // asserts (KRTX-1720), the same mapping as the Review Center: Apply changes
62
61
  // merges (project.write + project.gitops.merge), Dismiss and Reopen close
@@ -19,7 +19,7 @@ import { useTranslations } from '../../../i18n/index.js';
19
19
  import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore, } from 'react';
20
20
  import { useFileExplorerSource } from '../explorer-source.js';
21
21
  import { buildGitStatusMap } from '../hooks/index.js';
22
- import { forEachLimit, partitionUploadBatch, resolveUploadTarget, UPLOAD_CONCURRENCY, } from '../upload-batch.js';
22
+ import { forEachLimit, MAX_UPLOAD_BYTES, partitionUploadBatch, resolveUploadTarget, UPLOAD_CONCURRENCY, } from '../upload-batch.js';
23
23
  import { droppedEntries, hasFolder, readDroppedTree, treeLevels, } from '../drop-tree.js';
24
24
  import { DriveCreateDialog, } from './drive-create-dialog.js';
25
25
  import { DriveGridView } from './drive-grid-view.js';
@@ -71,6 +71,7 @@ export function DriveExplorer({ embedded = false, shareContext, leading, trailin
71
71
  ? { ...source.capabilities, write: false, search: false }
72
72
  : source.capabilities;
73
73
  const canWrite = capabilities.write;
74
+ const uploadLimit = capabilities.maxUploadBytes === undefined ? MAX_UPLOAD_BYTES : capabilities.maxUploadBytes;
74
75
  const currentPath = useFilesStore((s) => s.currentPath);
75
76
  const navigateToPath = useFilesStore((s) => s.navigateToPath);
76
77
  const viewMode = useFilesStore((s) => s.viewMode);
@@ -461,7 +462,7 @@ export function DriveExplorer({ embedded = false, shareContext, leading, trailin
461
462
  * One failed file never stops the rest; its tray row offers Retry.
462
463
  */
463
464
  const handleUploadFiles = useCallback(async (fileList, targetDirPath) => {
464
- const { accepted, rejected } = partitionUploadBatch(Array.from(fileList));
465
+ const { accepted, rejected } = partitionUploadBatch(Array.from(fileList), uploadLimit);
465
466
  for (const { reason } of rejected)
466
467
  errorToast(reason);
467
468
  if (accepted.length === 0)
@@ -480,14 +481,14 @@ export function DriveExplorer({ embedded = false, shareContext, leading, trailin
480
481
  ]);
481
482
  }
482
483
  await startBatch(accepted.map((file) => ({ file, targetPath })), shownIn, targetDirPath ?? currentPath);
483
- }, [currentPath, isRootPath, pendingNode, startBatch]);
484
+ }, [currentPath, isRootPath, pendingNode, startBatch, uploadLimit]);
484
485
  /**
485
486
  * Upload a tree (a picked or dropped folder) into `base`: its folders are
486
487
  * made first, one depth at a time (a level in parallel), then its files go
487
488
  * up into them. Top folders landing in the folder in view show at once.
488
489
  */
489
490
  const uploadTree = useCallback(async (tree, base) => {
490
- const { accepted, rejected } = partitionUploadBatch(tree.map((t) => t.file));
491
+ const { accepted, rejected } = partitionUploadBatch(tree.map((t) => t.file), uploadLimit);
491
492
  for (const { reason } of rejected)
492
493
  errorToast(reason);
493
494
  const acceptedSet = new Set(accepted);
@@ -529,7 +530,7 @@ export function DriveExplorer({ embedded = false, shareContext, leading, trailin
529
530
  await startBatch(items.map(({ file, dir: rel }) => ({ file, targetPath: at(rel) || undefined })),
530
531
  // Loose files dropped beside the folders land in the view.
531
532
  inView ? currentPath : null, tops.length === 1 ? at(tops[0]) : root || '/');
532
- }, [currentPath, normalizedCurrentPath, pendingNode, settlePending, mkdirMutation, startBatch, tHardcodedUi]);
533
+ }, [currentPath, normalizedCurrentPath, pendingNode, settlePending, mkdirMutation, startBatch, tHardcodedUi, uploadLimit]);
533
534
  /** The folder picker (`webkitRelativePath` is `Picked/sub/file.png`). The browser already asked. */
534
535
  const handleUploadFolder = useCallback((fileList) => uploadTree(Array.from(fileList).map((file) => ({
535
536
  file,
@@ -37,6 +37,9 @@ export interface ExplorerCapabilities {
37
37
  /** True for a folder that holds the tree together (Files' `Company`, `Users`,
38
38
  * a person's own folder): no rename, cut or delete. Absent means none. */
39
39
  fixedAt?: (path: string) => boolean;
40
+ /** Largest file an upload takes, in bytes; null takes any size. Absent means
41
+ * `MAX_UPLOAD_BYTES` (50 MB), the limit of a sandbox's own upload. */
42
+ maxUploadBytes?: number | null;
40
43
  }
41
44
  export interface ExplorerQueryResult<T> {
42
45
  data: T | undefined;
@@ -38,9 +38,9 @@ export interface UploadBatchPartition<T extends UploadCandidate> {
38
38
  * can only surface "Upload failed (413): Request Entity Too Large", naming
39
39
  * neither the file nor a limit.
40
40
  */
41
- export declare function uploadRejectionReason(file: UploadCandidate): string | null;
42
- /** Split a batch into what will be sent and what is refused up front. */
43
- export declare function partitionUploadBatch<T extends UploadCandidate>(files: readonly T[]): UploadBatchPartition<T>;
41
+ export declare function uploadRejectionReason(file: UploadCandidate, limit?: number | null): string | null;
42
+ /** Split a batch into what will be sent and what is refused up front. `limit` null takes any size. */
43
+ export declare function partitionUploadBatch<T extends UploadCandidate>(files: readonly T[], limit?: number | null): UploadBatchPartition<T>;
44
44
  /**
45
45
  * Share of the run sent, 0-1, by bytes: a finished file counts whole, a failed
46
46
  * one drops out. An all-empty batch falls back to counting files.
@@ -25,17 +25,18 @@ export const MAX_UPLOAD_LABEL = `${UPLOAD_LIMITS.MAX_FILE_SIZE_MB} MB`;
25
25
  * can only surface "Upload failed (413): Request Entity Too Large", naming
26
26
  * neither the file nor a limit.
27
27
  */
28
- export function uploadRejectionReason(file) {
29
- if (file.size <= MAX_UPLOAD_BYTES)
28
+ export function uploadRejectionReason(file, limit = MAX_UPLOAD_BYTES) {
29
+ if (limit === null || file.size <= limit)
30
30
  return null;
31
- return `${file.name} is ${formatFileSize(file.size)} — the upload limit is ${MAX_UPLOAD_LABEL}`;
31
+ const label = limit === MAX_UPLOAD_BYTES ? MAX_UPLOAD_LABEL : formatFileSize(limit);
32
+ return `${file.name} is ${formatFileSize(file.size)} — the upload limit is ${label}`;
32
33
  }
33
- /** Split a batch into what will be sent and what is refused up front. */
34
- export function partitionUploadBatch(files) {
34
+ /** Split a batch into what will be sent and what is refused up front. `limit` null takes any size. */
35
+ export function partitionUploadBatch(files, limit = MAX_UPLOAD_BYTES) {
35
36
  const accepted = [];
36
37
  const rejected = [];
37
38
  for (const file of files) {
38
- const reason = uploadRejectionReason(file);
39
+ const reason = uploadRejectionReason(file, limit);
39
40
  if (reason)
40
41
  rejected.push({ file, reason });
41
42
  else
@@ -41,9 +41,9 @@ export const sandboxExplorerSource = {
41
41
  * parked Platinum box: the daemon answers `503 sandbox_not_ready` in 2ms
42
42
  * while the mirror returns the tree in 33ms.
43
43
  *
44
- * The mirror is best-effort — `createRemoteSessionBranch` pushes the branch in
45
- * the background and records a failure in session metadata — so it can come
46
- * back empty. `DriveExplorer` treats "parked and empty" as idle rather than as
44
+ * A session that never published has no branch of its own: the files
45
+ * routes then read its base branch, which is what the box checked out. A
46
+ * read can still fail and come back empty. `DriveExplorer` treats "parked and empty" as idle rather than as
47
47
  * an empty folder, which is the one case this must not state as fact.
48
48
  *
49
49
  * Both hooks run every render; only one is ever enabled.