@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
@@ -3,9 +3,10 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
3
3
  import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
4
4
  import { useCallback, useEffect, useRef, useState } from 'react';
5
5
  import { useTranslations } from '../../../i18n/index.js';
6
- import { ApiError, createAccountSecretResource, deleteAccountSecretResource, listAccountMembers, setAccountSecretResourceAccess, rotateAccountSecretResource, pollProjectProviderOAuth, startProjectProviderOAuth, } from '@kortix/sdk';
6
+ import { ApiError, createAccountSecretResource, deleteAccountSecretResource, listAccountMembers, setAccountSecretResourceAccess, rotateAccountSecretResource, pollProjectProviderOAuth, startProjectProviderOAuth, completeClaudeSubscriptionLogin, startClaudeSubscriptionLogin, } from '@kortix/sdk';
7
7
  import { refreshProjectProviderState, useAccountSecretResources } from '@kortix/sdk/react';
8
8
  import { ChatGptDeviceChallenge } from '../llm-provider/chatgpt-device-challenge.js';
9
+ import { ClaudeCodeStep } from '../llm-provider/claude-code-step.js';
9
10
  import { Button } from '../../../primitives/button.js';
10
11
  import { ConfirmDialog } from '../../../primitives/confirm-dialog.js';
11
12
  import { Field, FieldLabel } from '../../../primitives/field.js';
@@ -112,11 +113,103 @@ function useChatGptAuthorization(projectId) {
112
113
  }, [projectId]);
113
114
  return { challenge, waiting, finishing, error, authorize, cancel, reset };
114
115
  }
116
+ /**
117
+ * One Claude sign-in at a time, with the same contract as
118
+ * `useChatGptAuthorization`: `authorize` resolves once the account is stored,
119
+ * or with null. Between those, the server runs `claude setup-token`, claude.com
120
+ * opens in a tab, and the member pastes the code it shows (`submitCode`). The
121
+ * tab opens inside the click, so a popup blocker lets it through. A refused
122
+ * code ends the sign-in: the next try signs in again.
123
+ */
124
+ function useClaudeAuthorization(projectId) {
125
+ const generation = useRef(0);
126
+ useEffect(() => () => { generation.current++; }, []);
127
+ const [challenge, setChallenge] = useState(null);
128
+ const [waiting, setWaiting] = useState(false);
129
+ const [finishing, setFinishing] = useState(false);
130
+ const [checking, setChecking] = useState(false);
131
+ const [error, setError] = useState(null);
132
+ const pending = useRef(null);
133
+ const settle = (value) => {
134
+ pending.current?.resolve(value);
135
+ pending.current = null;
136
+ };
137
+ const cancel = useCallback(() => { generation.current++; settle(null); }, []);
138
+ const reset = useCallback(() => {
139
+ generation.current++;
140
+ settle(null);
141
+ setWaiting(false);
142
+ setFinishing(false);
143
+ setChecking(false);
144
+ setChallenge(null);
145
+ setError(null);
146
+ }, []);
147
+ const authorize = useCallback(async (input, messages) => {
148
+ if (!projectId)
149
+ return null;
150
+ settle(null);
151
+ const current = ++generation.current;
152
+ setWaiting(true);
153
+ setFinishing(false);
154
+ setChallenge(null);
155
+ setError(null);
156
+ const popup = typeof window === 'undefined' ? null : window.open('about:blank', '_blank');
157
+ try {
158
+ const started = await startClaudeSubscriptionLogin(projectId, input);
159
+ if (current !== generation.current) {
160
+ popup?.close();
161
+ return null;
162
+ }
163
+ setChallenge({ url: started.authorize_url, code: null });
164
+ if (popup && !popup.closed)
165
+ popup.location.href = started.authorize_url;
166
+ return await new Promise((resolve) => {
167
+ pending.current = { flowId: started.flow_id, generation: current, failed: messages.failed, resolve };
168
+ });
169
+ }
170
+ catch (err) {
171
+ popup?.close();
172
+ if (current === generation.current) {
173
+ setError(err instanceof Error && err.message ? err.message : messages.failed);
174
+ setWaiting(false);
175
+ setChallenge(null);
176
+ }
177
+ return null;
178
+ }
179
+ }, [projectId]);
180
+ const submitCode = useCallback(async (code) => {
181
+ const flow = pending.current;
182
+ if (!projectId || !flow || !code.trim())
183
+ return;
184
+ setChecking(true);
185
+ setError(null);
186
+ try {
187
+ const connected = await completeClaudeSubscriptionLogin(projectId, { flowId: flow.flowId, code: code.trim() });
188
+ if (flow.generation !== generation.current)
189
+ return;
190
+ setChallenge(null);
191
+ setFinishing(true);
192
+ settle(connected.secret_id);
193
+ }
194
+ catch (err) {
195
+ if (flow.generation !== generation.current)
196
+ return;
197
+ setError(err instanceof Error && err.message ? err.message : flow.failed);
198
+ setWaiting(false);
199
+ setChallenge(null);
200
+ settle(null);
201
+ }
202
+ finally {
203
+ setChecking(false);
204
+ }
205
+ }, [projectId]);
206
+ return { challenge, waiting, finishing, checking, error, authorize, cancel, reset, submitCode };
207
+ }
115
208
  /**
116
209
  * Provider keys live beside the provider they configure. The secret value stays
117
- * write-only. With `oauth`, the panel manages ChatGPT accounts: any project
118
- * member can connect their own subscription ("Only you"); sharing one with
119
- * others needs `project.secret.write`, the same rule the API enforces.
210
+ * write-only. With `oauth`, the panel manages ChatGPT or Claude accounts: any
211
+ * project member can connect their own subscription ("Only you"); sharing one
212
+ * with others needs `project.secret.write`, the same rule the API enforces.
120
213
  */
121
214
  export function AccountSecretResourcesPanel({ accountId, projectId, providerId, providerName, envVar, canWrite, oauth }) {
122
215
  const t = useTranslations('pooledSecrets');
@@ -144,15 +237,23 @@ export function AccountSecretResourcesPanel({ accountId, projectId, providerId,
144
237
  const [sharingMode, setSharingMode] = useState('project');
145
238
  const [selectedMembers, setSelectedMembers] = useState(NO_MEMBERS);
146
239
  const [deleting, setDeleting] = useState(null);
147
- const authorization = useChatGptAuthorization(oauth?.projectId);
240
+ const claude = oauth?.kind === 'claude';
241
+ const chatGptAuthorization = useChatGptAuthorization(claude ? undefined : oauth?.projectId);
242
+ const claudeAuthorization = useClaudeAuthorization(claude ? oauth?.projectId : undefined);
243
+ const authorization = claude ? claudeAuthorization : chatGptAuthorization;
244
+ /** The ChatGPT string, or its Claude twin. */
245
+ const tAccount = (chatGptKey, claudeKey, values) => t(claude ? claudeKey : chatGptKey, values);
246
+ const signInStep = (challenge) => claude
247
+ ? _jsx(ClaudeCodeStep, { url: challenge?.url ?? null, checking: claudeAuthorization.checking, onSubmit: (code) => void claudeAuthorization.submitCode(code) })
248
+ : challenge && _jsx(ChatGptDeviceChallenge, { url: challenge.url, code: challenge.code });
148
249
  const members = useQuery({ queryKey: ['account-members', accountId], queryFn: () => listAccountMembers(accountId) });
149
250
  const actorRole = members.data?.find((member) => member.user_id === user?.id)?.account_role;
150
251
  const keys = (resources.data?.secrets ?? []).filter((secret) => secret.provider_id === providerId);
151
252
  const manageable = (secret) => secret.created_by === user?.id || actorRole === 'owner' || actorRole === 'admin';
152
- const authMessages = { expired: t('oauthExpired'), failed: t('connectFailed') };
253
+ const authMessages = { expired: t('oauthExpired'), failed: tAccount('connectFailed', 'claudeConnectFailed') };
153
254
  const defaultLabel = () => {
154
255
  const name = labelOwnerName(user && { email: user.email, user_metadata: user.metadata });
155
- return oauth && name ? t('defaultAccountLabel', { name }) : '';
256
+ return oauth && name ? tAccount('defaultAccountLabel', 'claudeDefaultAccountLabel', { name }) : '';
156
257
  };
157
258
  const closeCreate = () => {
158
259
  authorization.cancel();
@@ -173,7 +274,9 @@ export function AccountSecretResourcesPanel({ accountId, projectId, providerId,
173
274
  finally {
174
275
  refreshProjectProviderState(queryClient, projectId);
175
276
  void queryClient.invalidateQueries({ queryKey: ['session-provider-secret-pools'] });
176
- oauth?.onConnected('codex');
277
+ if (claude)
278
+ void queryClient.invalidateQueries({ queryKey: ['claude-subscription', projectId] });
279
+ oauth?.onConnected(claude ? 'claude-agent' : 'codex');
177
280
  }
178
281
  };
179
282
  const connectOAuth = async () => {
@@ -187,7 +290,7 @@ export function AccountSecretResourcesPanel({ accountId, projectId, providerId,
187
290
  return;
188
291
  await finishConnection().catch(() => { });
189
292
  setCreating(false);
190
- successToast(t('accountConnected'));
293
+ successToast(tAccount('accountConnected', 'claudeAccountConnected'));
191
294
  };
192
295
  const reconnectOAuth = async (secret) => {
193
296
  const credential = await authorization.authorize({ resourceId: secret.secret_id }, authMessages);
@@ -195,7 +298,7 @@ export function AccountSecretResourcesPanel({ accountId, projectId, providerId,
195
298
  return;
196
299
  await finishConnection().catch(() => { });
197
300
  setReconnecting(null);
198
- successToast(t('accountReconnected'));
301
+ successToast(tAccount('accountReconnected', 'claudeAccountReconnected'));
199
302
  };
200
303
  const openReconnect = (secret) => {
201
304
  authorization.reset();
@@ -269,8 +372,8 @@ export function AccountSecretResourcesPanel({ accountId, projectId, providerId,
269
372
  const busy = save.isPending || authorization.waiting;
270
373
  // Only a successful read can say "no accounts"; loading and errors say so themselves.
271
374
  const empty = Boolean(oauth) && resources.isSuccess && keys.length === 0;
272
- return (_jsxs("section", { className: "min-w-0 space-y-2", "aria-label": oauth ? t('chatGptAccounts') : t('providerKeysFor', { provider: providerName }), children: [_jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsx("p", { className: "text-muted-foreground text-xs", children: !resources.isSuccess ? null : empty ? t('noChatGptAccounts')
273
- : oauth ? t('accountCount', { count: keys.length }) : t('keyCount', { count: keys.length }) }), canWrite && _jsx(Button, { size: "sm", variant: empty ? 'default' : 'secondary', onClick: openCreate, children: empty ? t('connectChatGpt') : oauth ? t('addAccount') : t('addKey') })] }), resources.isLoading ? _jsx("div", { role: "status", "aria-label": t('loadingKeys'), children: _jsx(Loading, {}) }) : resources.isError ? (_jsx(ErrorState, { size: "sm", title: t('loadError'), action: _jsx(Button, { size: "sm", variant: "secondary", disabled: resources.isFetching, onClick: () => void resources.refetch(), children: common('retry') }) })) : keys.length ? (_jsx("ul", { className: "space-y-1", children: keys.map((secret) => {
375
+ return (_jsxs("section", { className: "min-w-0 space-y-2", "aria-label": oauth ? tAccount('chatGptAccounts', 'claudeAccounts') : t('providerKeysFor', { provider: providerName }), children: [_jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsx("p", { className: "text-muted-foreground text-xs", children: !resources.isSuccess ? null : empty ? tAccount('noChatGptAccounts', 'noClaudeAccounts')
376
+ : oauth ? t('accountCount', { count: keys.length }) : t('keyCount', { count: keys.length }) }), canWrite && _jsx(Button, { size: "sm", variant: empty ? 'default' : 'secondary', onClick: openCreate, children: empty ? tAccount('connectChatGpt', 'connectClaude') : oauth ? t('addAccount') : t('addKey') })] }), resources.isLoading ? _jsx("div", { role: "status", "aria-label": t('loadingKeys'), children: _jsx(Loading, {}) }) : resources.isError ? (_jsx(ErrorState, { size: "sm", title: t('loadError'), action: _jsx(Button, { size: "sm", variant: "secondary", disabled: resources.isFetching, onClick: () => void resources.refetch(), children: common('retry') }) })) : keys.length ? (_jsx("ul", { className: "space-y-1", children: keys.map((secret) => {
274
377
  const canManage = canWrite && manageable(secret);
275
378
  const canReconnect = Boolean(oauth) && canWrite && secret.created_by === user?.id;
276
379
  const canChangeAccess = canManage && canShare;
@@ -280,16 +383,16 @@ export function AccountSecretResourcesPanel({ accountId, projectId, providerId,
280
383
  const undecryptable = secret.status === 'undecryptable';
281
384
  return (_jsxs("li", { className: "border-border flex min-w-0 items-center gap-3 rounded-md border px-3 py-1.5", children: [_jsxs("span", { className: "text-foreground min-w-0 flex-1 text-sm font-medium", children: [_jsx("span", { className: "block break-words", children: secret.label }), _jsx("span", { className: "text-muted-foreground block text-xs font-normal", children: accessLine(secret) }), stale && (_jsx("span", { className: "text-muted-foreground block text-xs font-normal", children: t('needsReconnection') })), secret.cooldown_until && Date.parse(secret.cooldown_until) > resources.dataUpdatedAt && (_jsx("span", { className: "text-muted-foreground block text-xs font-normal", children: t('coolingDown') }))] }), undecryptable && _jsx(UndecryptableValue, { hint: tUndecryptable(oauth ? 'loginHint' : 'keyHint') }), (stale || undecryptable) && canReconnect && (_jsx(Button, { size: "sm", variant: "secondary", "aria-label": t('reconnectTitle', { label: secret.label }), onClick: () => openReconnect(secret), children: t('reconnectAccount') })), undecryptable && canManage && !oauth && (_jsx(Button, { size: "sm", variant: "secondary", onClick: () => { setValue(''); save.reset(); setRotating(secret); }, children: tUndecryptable('reenterKey') })), (canManage || canReconnect) && _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { size: "icon-sm", variant: "ghost", "aria-label": t('actionsFor', { label: secret.label }), children: _jsx(DotsThreeIcon, { className: "size-4" }) }) }), _jsxs(DropdownMenuContent, { align: "end", children: [canReconnect && _jsx(DropdownMenuItem, { onSelect: () => openReconnect(secret), children: t('reconnectAccount') }), canChangeAccess && _jsx(DropdownMenuItem, { onSelect: () => { changeGrant.reset(); setSharingMode(secret.access_mode); setSelectedMembers({ memberIds: secret.granted_user_ids, groupIds: [], inviteEmails: [] }); setSharing(secret); }, children: t('manageAccess') }), canManage && !oauth && _jsx(DropdownMenuItem, { onSelect: () => { setValue(''); save.reset(); setRotating(secret); }, children: t('rotateKey') }), canManage && _jsx(DropdownMenuItem, { onSelect: () => setDeleting(secret), children: oauth ? t('deleteAccount') : t('deleteKey') })] })] })] }, secret.secret_id));
282
385
  }) })) : null, _jsx(Modal, { open: creating || rotating !== null, onOpenChange: (open) => { if (!open && !save.isPending && !authorization.finishing)
283
- closeCreate(); }, children: _jsxs(ModalContent, { className: "lg:max-w-md", children: [_jsxs(ModalHeader, { children: [_jsx(ModalTitle, { children: rotating ? t('rotateLabel', { label: rotating.label }) : `${oauth ? t('addAccount') : t('addKey')} · ${providerName}` }), _jsx(ModalDescription, { children: t(rotating ? 'valueNeverShown' : oauth ? 'oauthCreationDescription' : 'creationDescription') })] }), _jsxs(ModalBody, { className: "max-h-[60vh] space-y-3 overflow-y-auto", children: [save.isError && _jsx("p", { role: "alert", className: "text-destructive text-sm", children: save.error instanceof Error ? save.error.message : t('saveError') }), oauth && authorization.error && _jsx("p", { role: "alert", className: "text-destructive text-sm", children: authorization.error }), !rotating && _jsx(_Fragment, { children: _jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: `provider-key-label-${providerId}`, children: t('label') }), _jsx(Input, { id: `provider-key-label-${providerId}`, value: label, disabled: busy, onChange: (event) => setLabel(event.target.value), placeholder: oauth ? t('accountLabelPlaceholder') : t('primaryKey'), maxLength: 100 })] }) }), oauth ? authorization.finishing ? _jsx(ChatGptSignInFinishing, { label: t('oauthFinishing') })
284
- : authorization.challenge && _jsx(ChatGptDeviceChallenge, { url: authorization.challenge.url, code: authorization.challenge.code }) :
285
- _jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: `provider-key-value-${providerId}`, children: t('apiKey') }), _jsx(Input, { id: `provider-key-value-${providerId}`, type: "password", value: value, disabled: save.isPending, onChange: (event) => setValue(event.target.value), autoComplete: "off" })] }), !rotating && !authorization.challenge && !authorization.finishing && _jsxs("div", { className: "space-y-2", children: [_jsx(FieldLabel, { children: t('whoCanUse') }), _jsxs(RadioGroup, { value: createMode, onValueChange: (next) => setCreateMode(next), className: "space-y-2", children: [_jsx(RadioGroupItem, { value: "private", id: `create-${providerId}-private`, label: t('onlyYou'), description: t('onlyYouDescription'), size: "lg", variant: "outline", disabled: busy }), _jsx(RadioGroupItem, { value: "project", id: `create-${providerId}-project`, label: t('everyoneInProject'), description: t('everyoneDescription'), size: "lg", variant: "outline", disabled: busy || !canShare }), _jsx(RadioGroupItem, { value: "members", id: `create-${providerId}-members`, label: t('specificMembers'), description: t('specificDescription'), size: "lg", variant: "outline", disabled: busy || !canShare })] }), !canShare && _jsx("p", { className: "text-muted-foreground text-xs", children: t('shareRequiresPermission') }), createMode === 'members' && _jsx(PrincipalPicker, { scope: { kind: 'project', projectId }, selection: "multi", kinds: ['member'], value: selectedMembers, onChange: setSelectedMembers, disabled: busy, autoFocus: false })] })] }), _jsxs(ModalFooter, { children: [_jsx(Button, { variant: "secondary", disabled: save.isPending || authorization.finishing, onClick: closeCreate, children: t('cancel') }), _jsx(Button, { disabled: oauth ? authorization.waiting || !label.trim() : save.isPending || !value.trim() || (!rotating && !label.trim()), onClick: () => oauth ? void connectOAuth() : save.mutate(), children: oauth ? authorization.finishing ? t('saving') : authorization.waiting ? t('oauthWaiting') : authorization.error ? common('retry') : t('connectAccount') : save.isPending ? t('saving') : t('saveKey') })] })] }) }), oauth && _jsx(Modal, { open: reconnecting !== null, onOpenChange: (open) => { if (!open && !authorization.finishing)
286
- closeReconnect(); }, children: _jsxs(ModalContent, { className: "lg:max-w-md", children: [_jsxs(ModalHeader, { children: [_jsx(ModalTitle, { children: t('reconnectTitle', { label: reconnectLabel }) }), _jsx(ModalDescription, { children: t('reconnectDescription') })] }), _jsxs(ModalBody, { className: "space-y-3", children: [authorization.error && _jsx("p", { role: "alert", className: "text-destructive text-sm", children: authorization.error }), authorization.finishing
386
+ closeCreate(); }, children: _jsxs(ModalContent, { className: "lg:max-w-md", children: [_jsxs(ModalHeader, { children: [_jsx(ModalTitle, { children: rotating ? t('rotateLabel', { label: rotating.label }) : `${oauth ? t('addAccount') : t('addKey')} · ${providerName}` }), _jsx(ModalDescription, { children: rotating ? t('valueNeverShown') : oauth ? tAccount('oauthCreationDescription', 'claudeOauthCreationDescription') : t('creationDescription') })] }), _jsxs(ModalBody, { className: "max-h-[60vh] space-y-3 overflow-y-auto", children: [save.isError && _jsx("p", { role: "alert", className: "text-destructive text-sm", children: save.error instanceof Error ? save.error.message : t('saveError') }), oauth && authorization.error && _jsx("p", { role: "alert", className: "text-destructive text-sm", children: authorization.error }), !rotating && _jsx(_Fragment, { children: _jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: `provider-key-label-${providerId}`, children: t('label') }), _jsx(Input, { id: `provider-key-label-${providerId}`, value: label, disabled: busy, onChange: (event) => setLabel(event.target.value), placeholder: oauth ? tAccount('accountLabelPlaceholder', 'claudeAccountLabelPlaceholder') : t('primaryKey'), maxLength: 100 })] }) }), oauth ? authorization.finishing ? _jsx(ChatGptSignInFinishing, { label: t('oauthFinishing') })
387
+ : (authorization.challenge || (claude && authorization.waiting)) && signInStep(authorization.challenge) :
388
+ _jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: `provider-key-value-${providerId}`, children: t('apiKey') }), _jsx(Input, { id: `provider-key-value-${providerId}`, type: "password", value: value, disabled: save.isPending, onChange: (event) => setValue(event.target.value), autoComplete: "off" })] }), !rotating && !authorization.challenge && !authorization.finishing && !(claude && authorization.waiting) && _jsxs("div", { className: "space-y-2", children: [_jsx(FieldLabel, { children: t('whoCanUse') }), _jsxs(RadioGroup, { value: createMode, onValueChange: (next) => setCreateMode(next), className: "space-y-2", children: [_jsx(RadioGroupItem, { value: "private", id: `create-${providerId}-private`, label: t('onlyYou'), description: t('onlyYouDescription'), size: "lg", variant: "outline", disabled: busy }), _jsx(RadioGroupItem, { value: "project", id: `create-${providerId}-project`, label: t('everyoneInProject'), description: t('everyoneDescription'), size: "lg", variant: "outline", disabled: busy || !canShare }), _jsx(RadioGroupItem, { value: "members", id: `create-${providerId}-members`, label: t('specificMembers'), description: t('specificDescription'), size: "lg", variant: "outline", disabled: busy || !canShare })] }), !canShare && _jsx("p", { className: "text-muted-foreground text-xs", children: t('shareRequiresPermission') }), createMode === 'members' && _jsx(PrincipalPicker, { scope: { kind: 'project', projectId }, selection: "multi", kinds: ['member'], value: selectedMembers, onChange: setSelectedMembers, disabled: busy, autoFocus: false })] })] }), _jsxs(ModalFooter, { children: [_jsx(Button, { variant: "secondary", disabled: save.isPending || authorization.finishing, onClick: closeCreate, children: t('cancel') }), _jsx(Button, { disabled: oauth ? authorization.waiting || !label.trim() : save.isPending || !value.trim() || (!rotating && !label.trim()), onClick: () => oauth ? void connectOAuth() : save.mutate(), children: oauth ? authorization.finishing ? t('saving') : authorization.waiting ? t('oauthWaiting') : authorization.error ? common('retry') : t('connectAccount') : save.isPending ? t('saving') : t('saveKey') })] })] }) }), oauth && _jsx(Modal, { open: reconnecting !== null, onOpenChange: (open) => { if (!open && !authorization.finishing)
389
+ closeReconnect(); }, children: _jsxs(ModalContent, { className: "lg:max-w-md", children: [_jsxs(ModalHeader, { children: [_jsx(ModalTitle, { children: t('reconnectTitle', { label: reconnectLabel }) }), _jsx(ModalDescription, { children: tAccount('reconnectDescription', 'claudeReconnectDescription') })] }), _jsxs(ModalBody, { className: "space-y-3", children: [authorization.error && _jsx("p", { role: "alert", className: "text-destructive text-sm", children: authorization.error }), authorization.finishing
287
390
  ? _jsx(ChatGptSignInFinishing, { label: t('oauthFinishing') })
288
- : authorization.challenge
289
- ? _jsx(ChatGptDeviceChallenge, { url: authorization.challenge.url, code: authorization.challenge.code })
391
+ : authorization.challenge || (claude && authorization.waiting)
392
+ ? signInStep(authorization.challenge)
290
393
  : authorization.waiting && _jsx("div", { role: "status", "aria-label": t('oauthWaiting'), children: _jsx(Loading, {}) })] }), _jsxs(ModalFooter, { children: [_jsx(Button, { variant: "secondary", disabled: authorization.finishing, onClick: closeReconnect, children: t('cancel') }), _jsx(Button, { disabled: authorization.waiting || !reconnecting, onClick: () => { if (reconnecting)
291
394
  void reconnectOAuth(reconnecting); }, children: authorization.finishing ? t('saving') : authorization.waiting ? t('oauthWaiting') : authorization.error ? common('retry') : t('reconnectAccount') })] })] }) }), _jsx(Modal, { open: sharing !== null, onOpenChange: (open) => { if (!open && !changeGrant.isPending)
292
395
  setSharing(null); }, children: _jsxs(ModalContent, { className: "lg:max-w-md", children: [_jsxs(ModalHeader, { children: [_jsx(ModalTitle, { children: t('accessTo', { label: sharing?.label ?? '' }) }), _jsx(ModalDescription, { children: t('accessDescription') })] }), _jsxs(ModalBody, { className: "max-h-[60vh] space-y-4 overflow-y-auto", children: [changeGrant.isError && _jsx("p", { role: "alert", className: "text-destructive text-sm", children: t('accessError') }), _jsxs(RadioGroup, { value: sharingMode, onValueChange: (next) => setSharingMode(next), className: "space-y-2", children: [_jsx(RadioGroupItem, { value: "project", id: `access-${providerId}-project`, label: t('everyoneInProject'), description: t('everyoneDescription'), size: "lg", variant: "outline", disabled: changeGrant.isPending }), _jsx(RadioGroupItem, { value: "members", id: `access-${providerId}-members`, label: t('specificMembers'), description: t('specificDescription'), size: "lg", variant: "outline", disabled: changeGrant.isPending })] }), sharingMode === 'members' && _jsx(Field, { className: "gap-1.5", children: _jsx(PrincipalPicker, { scope: { kind: 'project', projectId }, selection: "multi", kinds: ['member'], value: selectedMembers, onChange: setSelectedMembers, disabled: changeGrant.isPending, autoFocus: false }) })] }), _jsxs(ModalFooter, { className: "sm:justify-between", children: [_jsx(Button, { size: "sm", variant: "outline-ghost", disabled: changeGrant.isPending, onClick: () => setSharing(null), children: t('cancel') }), _jsx(Button, { size: "sm", disabled: changeGrant.isPending, onClick: () => changeGrant.mutate(), children: changeGrant.isPending ? t('saving') : t('done') })] })] }) }), _jsx(ConfirmDialog, { open: deleting !== null, onOpenChange: (open) => { if (!open)
293
- setDeleting(null); }, title: t(oauth ? 'deleteAccountConfirmTitle' : 'deleteConfirmTitle'), description: deleting ? t(oauth ? 'deleteAccountConfirmDescription' : 'deleteConfirmDescription', { label: deleting.label }) : '', confirmLabel: oauth ? t('deleteAccount') : t('deleteKey'), confirmVariant: "destructive", isPending: remove.isPending, onConfirm: () => { if (deleting)
396
+ setDeleting(null); }, title: oauth ? tAccount('deleteAccountConfirmTitle', 'claudeDeleteAccountConfirmTitle') : t('deleteConfirmTitle'), description: deleting ? t(oauth ? 'deleteAccountConfirmDescription' : 'deleteConfirmDescription', { label: deleting.label }) : '', confirmLabel: oauth ? t('deleteAccount') : t('deleteKey'), confirmVariant: "destructive", isPending: remove.isPending, onConfirm: () => { if (deleting)
294
397
  remove.mutate(deleting.secret_id); } })] }));
295
398
  }
@@ -33,7 +33,7 @@ export declare function SkillsSection({ draft, set, options }: GrantSectionProps
33
33
  export declare function ConnectorsSection({ draft, set, options }: GrantSectionProps): import("react").JSX.Element;
34
34
  export declare function SecretsSection({ draft, set, options }: GrantSectionProps): import("react").JSX.Element;
35
35
  /**
36
- * A kortix_version 3 grant over a project registry: the declared subagents
36
+ * A grant over a project registry: the declared subagents
37
37
  * this agent may start, the registered commands it may run, the registered
38
38
  * extensions a session of it loads. One card, the same All · Pick · None
39
39
  * control as Skills.
@@ -20,6 +20,7 @@ import { CaretDownIcon, CubeIcon } from '@phosphor-icons/react';
20
20
  import { UiLink as Link } from '../../../providers/ui-provider.js';
21
21
  import { EditorSection, SettingRow } from './agent-editor-primitives.js';
22
22
  import { pruneRequiredConnectors } from './connectors-personal.js';
23
+ import { plainGrant } from '../../shared/agent-resource-scope.js';
23
24
  import { GrantSetField, KortixPermissionsField } from './grant-mode-field.js';
24
25
  /**
25
26
  * Marks one granted connector as required before session start.
@@ -60,7 +61,7 @@ export function ManageButton({ tab, href, }) {
60
61
  */
61
62
  export function SkillsSection({ draft, set, options }) {
62
63
  const tI18nComplete = useI18nTranslations('hardcodedUi.i18nComplete');
63
- return (_jsx(EditorSection, { title: tI18nComplete.raw('text66d0f523a379'), description: tI18nComplete.raw('textb27e54100c96'), trailing: _jsx(ManageButton, { tab: "skills" }), lead: true, bare: true, children: _jsx(GrantSetField, { value: draft.skills, onChange: (v) => set('skills', v), options: options, emptyLabel: tI18nComplete.raw('text66e36043ff7c') }) }));
64
+ return (_jsx(EditorSection, { title: tI18nComplete.raw('text66d0f523a379'), description: tI18nComplete.raw('textb27e54100c96'), trailing: _jsx(ManageButton, { tab: "skills" }), lead: true, bare: true, children: _jsx(GrantSetField, { value: plainGrant(draft.skills), onChange: (v) => set('skills', v), options: options, emptyLabel: tI18nComplete.raw('text66e36043ff7c') }) }));
64
65
  }
65
66
  export function ConnectorsSection({ draft, set, options }) {
66
67
  const tI18nComplete = useI18nTranslations('hardcodedUi.i18nComplete');
@@ -83,14 +84,14 @@ export function SecretsSection({ draft, set, options }) {
83
84
  return (_jsx(EditorSection, { title: tI18nComplete.raw('textd8707d411d99'), description: tI18nComplete.raw('text7f619d9e30a8'), trailing: _jsx(ManageButton, { tab: "secrets" }), lead: true, bare: true, children: _jsx(GrantSetField, { value: draft.secrets, onChange: (v) => set('secrets', v), options: options, emptyLabel: tI18nComplete.raw('text82a37b8c2266') }) }));
84
85
  }
85
86
  /**
86
- * A kortix_version 3 grant over a project registry: the declared subagents
87
+ * A grant over a project registry: the declared subagents
87
88
  * this agent may start, the registered commands it may run, the registered
88
89
  * extensions a session of it loads. One card, the same All · Pick · None
89
90
  * control as Skills.
90
91
  */
91
92
  export function RegistryGrantSection({ grant, draft, set, options, }) {
92
93
  const t = useI18nTranslations('agents.grants');
93
- return (_jsx(EditorSection, { title: t(`${grant}.title`), description: t(`${grant}.description`), lead: true, bare: true, children: _jsx(GrantSetField, { value: draft[grant], onChange: (v) => set(grant, v), options: options, emptyLabel: t(`${grant}.empty`) }) }));
94
+ return (_jsx(EditorSection, { title: t(`${grant}.title`), description: t(`${grant}.description`), lead: true, bare: true, children: _jsx(GrantSetField, { value: plainGrant(draft[grant]), onChange: (v) => set(grant, v), options: options, emptyLabel: t(`${grant}.empty`) }) }));
94
95
  }
95
96
  /** Kortix permissions (`kortix_permissions` in kortix.yaml): which project
96
97
  * operations the agent may perform, through any surface. A block read from a
@@ -107,6 +108,7 @@ export function ProjectActionsSection({ draft, set }) {
107
108
  export function WorkspaceSection({ draft, set, sandboxTemplates, defaultSandboxSlug, }) {
108
109
  const tI18nComplete = useI18nTranslations('hardcodedUi.i18nComplete');
109
110
  const tRepository = useI18nTranslations('repositoryAccess');
111
+ const tTabs = useI18nTranslations('agentEditor.tabs');
110
112
  const pinned = draft.sandbox ? sandboxTemplates.find((t) => t.slug === draft.sandbox) : undefined;
111
113
  const projectDefault = defaultSandboxSlug
112
114
  ? sandboxTemplates.find((t) => t.slug === defaultSandboxSlug)
@@ -125,5 +127,7 @@ export function WorkspaceSection({ draft, set, sandboxTemplates, defaultSandboxS
125
127
  : tI18nComplete.raw('text64f405e80a8d'), children: _jsx(SandboxTemplateMenu, { items: sandboxTemplates, selectedSlug: draft.sandbox ?? null, resolvedSlug: defaultSandboxSlug, inherit: {
126
128
  label: tI18nComplete.raw('texte8cb80e5c5cb'),
127
129
  description: tI18nComplete.raw('textb23625948eee'),
128
- }, onSelect: (slug) => set('sandbox', slug ?? undefined), align: "end", trigger: _jsxs(Button, { type: "button", variant: "outline", size: "sm", "aria-label": tI18nComplete.raw('text9e471951a1b4'), className: "w-full justify-between gap-2 font-normal", children: [_jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [_jsx(PinnedIcon, { className: "text-muted-foreground size-3.5 shrink-0" }), _jsx("span", { className: cn('truncate', stalePin && 'text-kortix-orange font-mono'), children: pinned ? pinned.name : (stalePin ?? tI18nComplete.raw('texte8cb80e5c5cb')) })] }), _jsx(CaretDownIcon, { className: "text-muted-foreground size-3.5 shrink-0" })] }) }) }), _jsx(SettingRow, { label: tRepository('label'), help: tRepository(draft.repository_access === false ? 'disabled' : 'enabled'), children: _jsx(Switch, { "aria-label": tRepository('label'), checked: draft.repository_access ?? true, onCheckedChange: (enabled) => set('repository_access', enabled) }) })] }));
130
+ }, onSelect: (slug) => set('sandbox', slug ?? undefined), align: "end", trigger: _jsxs(Button, { type: "button", variant: "outline", size: "sm", "aria-label": tI18nComplete.raw('text9e471951a1b4'), className: "w-full justify-between gap-2 font-normal", children: [_jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [_jsx(PinnedIcon, { className: "text-muted-foreground size-3.5 shrink-0" }), _jsx("span", { className: cn('truncate', stalePin && 'text-kortix-orange font-mono'), children: pinned ? pinned.name : (stalePin ?? tI18nComplete.raw('texte8cb80e5c5cb')) })] }), _jsx(CaretDownIcon, { className: "text-muted-foreground size-3.5 shrink-0" })] }) }) }), _jsx(SettingRow, { label: tRepository('label'), help: tRepository(draft.repository_access === false ? 'disabled' : 'enabled'), children: _jsx(Switch, { "aria-label": tRepository('label'), checked: draft.repository_access ?? true, onCheckedChange: (enabled) => set('repository_access', enabled) }) }), _jsx(SettingRow, { label: tTabs('networkEgress'), children: _jsx("span", { className: "text-muted-foreground text-sm text-pretty sm:text-right", children: draft.network_egress
131
+ ? tTabs('networkEgressDeclared')
132
+ : tTabs('networkEgressNone') }) })] }));
129
133
  }
@@ -10,12 +10,15 @@ export declare function BasicsSection({ draft, set, oc, setOc, showDescription,
10
10
  * instructions — pass `false` there so the field is not offered twice. */
11
11
  showDescription?: boolean;
12
12
  }): import("react").JSX.Element;
13
- export declare function ModelSection({ oc, setOc, showPrompt, }: {
13
+ export declare function ModelSection({ oc, setOc, showPrompt, lead, }: {
14
14
  oc: RuntimeAgentConfig;
15
15
  setOc: SetRuntime;
16
16
  /** The agent page gives the system prompt the whole left column — pass
17
17
  * `false` there so the collapsed copy of it does not sit in this section. */
18
18
  showPrompt?: boolean;
19
+ /** `false` under a host that already titles the pane (the Models page's
20
+ * "This agent" tab): the first section then takes a subsection header. */
21
+ lead?: boolean;
19
22
  }): import("react").JSX.Element;
20
23
  /**
21
24
  * Whether a slider row is showing its default.
@@ -1,5 +1,6 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useState } from 'react';
3
4
  import { useTranslations as useI18nTranslations } from '../../../i18n/index.js';
4
5
  /**
5
6
  * The first two sections of the agent editor: what the agent IS (Basics) and
@@ -33,11 +34,12 @@ import { EditorSection, InlineAction, SettingBlock, SettingRow } from './agent-e
33
34
  const INHERIT = '__inherit__';
34
35
  export function BasicsSection({ draft, set, oc, setOc, showDescription = true, }) {
35
36
  const tI18nComplete = useI18nTranslations('hardcodedUi.i18nComplete');
37
+ const tSpace = useI18nTranslations('agentEditor.tabs');
36
38
  return (_jsxs(EditorSection, { title: tI18nComplete.raw('text8fdd2ee8475e'), description: tI18nComplete.raw('text4e420a5186f0'), lead: true, children: [_jsx(SettingRow, { label: tI18nComplete.raw('text92c1cdfdf4cb'), help: tI18nComplete.raw('textbe90a56d29da'), children: _jsx("div", { className: "flex sm:justify-end", children: _jsx(Switch, { "aria-label": tI18nComplete.raw('text92c1cdfdf4cb'), checked: draft.enabled !== false, onCheckedChange: (v) => set('enabled', v ? undefined : false) }) }) }), showDescription ? (_jsx(SettingBlock, { label: tI18nComplete.raw('text526e0087cc3f'), help: oc.mode === 'subagent'
37
39
  ? tI18nComplete.raw('text77e2bc11f6ab')
38
- : tI18nComplete.raw('text9965df7c3221'), children: _jsx(Textarea, { "aria-label": tI18nComplete.raw('text526e0087cc3f'), value: oc.description ?? '', placeholder: tI18nComplete.raw('text446f4eabf99f'), minHeight: 44, className: "text-sm", onChange: (e) => setOc('description', e.target.value) }) })) : null, _jsx(SettingRow, { label: tI18nComplete.raw('text12f67f8539c4'), help: oc.mode ? AGENT_MODE_HELP[oc.mode] : tI18nComplete.raw('text64f405e80a8d'), children: _jsxs(Select, { value: oc.mode ?? INHERIT, onValueChange: (value) => setOc('mode', value === INHERIT ? undefined : value), children: [_jsx(SelectTrigger, { "aria-label": tI18nComplete.raw('text12f67f8539c4'), className: "h-9 w-full", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: INHERIT, children: tI18nComplete.raw('texte8cb80e5c5cb') }), AGENT_MODES.map((mode) => (_jsx(SelectItem, { value: mode, children: AGENT_MODE_LABEL[mode] }, mode)))] })] }) }), _jsx(SettingRow, { label: tI18nComplete.raw('textc7bcb471c03d'), help: tI18nComplete.raw('textdd4971af3f91'), children: _jsx("div", { className: "flex sm:justify-end", children: _jsx(Switch, { "aria-label": tI18nComplete.raw('textc7bcb471c03d'), checked: !oc.hidden, onCheckedChange: (v) => setOc('hidden', v ? undefined : true) }) }) })] }));
40
+ : tI18nComplete.raw('text9965df7c3221'), children: _jsx(Textarea, { "aria-label": tI18nComplete.raw('text526e0087cc3f'), value: oc.description ?? '', placeholder: tI18nComplete.raw('text446f4eabf99f'), minHeight: 44, className: "text-sm", onChange: (e) => setOc('description', e.target.value) }) })) : null, _jsx(SettingRow, { label: tI18nComplete.raw('text12f67f8539c4'), help: oc.mode ? AGENT_MODE_HELP[oc.mode] : tI18nComplete.raw('text64f405e80a8d'), children: _jsxs(Select, { value: oc.mode ?? INHERIT, onValueChange: (value) => setOc('mode', value === INHERIT ? undefined : value), children: [_jsx(SelectTrigger, { "aria-label": tI18nComplete.raw('text12f67f8539c4'), className: "h-9 w-full", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: INHERIT, children: tI18nComplete.raw('texte8cb80e5c5cb') }), AGENT_MODES.map((mode) => (_jsx(SelectItem, { value: mode, children: AGENT_MODE_LABEL[mode] }, mode)))] })] }) }), _jsx(SettingRow, { label: tSpace('space'), help: tSpace('spaceHelp'), children: _jsx(Input, { "aria-label": tSpace('space'), className: "h-9 w-full sm:max-w-56", value: draft.space ?? '', placeholder: tSpace('spacePlaceholder'), onChange: (e) => set('space', e.target.value.toLowerCase() || undefined) }) }), _jsx(SettingRow, { label: tI18nComplete.raw('textc7bcb471c03d'), help: tI18nComplete.raw('textdd4971af3f91'), children: _jsx("div", { className: "flex sm:justify-end", children: _jsx(Switch, { "aria-label": tI18nComplete.raw('textc7bcb471c03d'), checked: !oc.hidden, onCheckedChange: (v) => setOc('hidden', v ? undefined : true) }) }) })] }));
39
41
  }
40
- export function ModelSection({ oc, setOc, showPrompt = true, }) {
42
+ export function ModelSection({ oc, setOc, showPrompt = true, lead = true, }) {
41
43
  const tI18nComplete = useI18nTranslations('hardcodedUi.i18nComplete');
42
44
  const { data: providers } = useRuntimeProviders();
43
45
  const models = flattenModels(providers, { providerMode: modelProviderMode(providers) });
@@ -50,11 +52,38 @@ export function ModelSection({ oc, setOc, showPrompt = true, }) {
50
52
  ? models.find((m) => m.providerID === selectedModelKey.providerID && m.modelID === selectedModelKey.modelID)
51
53
  : undefined;
52
54
  const variantChoices = selectedModel?.variants ? Object.keys(selectedModel.variants) : [];
53
- return (_jsxs(_Fragment, { children: [_jsxs(EditorSection, { title: tI18nComplete.raw('text5e2c614c23f0'), description: tI18nComplete.raw('text32398dbb68e2'), lead: true, children: [_jsx(SettingRow, { label: tI18nComplete.raw('text34455bf1d857'), help: oc.model ? (_jsx(InlineAction, { onClick: () => setOc('model', undefined), children: tI18nComplete.raw('text9db60344e984') })) : (tI18nComplete.raw('text64f405e80a8d')), children: _jsx("div", { className: "flex sm:justify-end", children: _jsx(ModelSelector, { models: models, providers: providers, selectedModel: selectedModelKey, unsetLabel: tI18nComplete.raw('texte8cb80e5c5cb'), onSelect: (m) => setOc('model', m ? modelKeyToWire(m) : undefined) }) }) }), variantChoices.length > 0 ? (_jsx(SettingRow, { label: tI18nComplete.raw('text264c28cbf01c'), help: oc.variant
55
+ return (_jsxs(_Fragment, { children: [_jsxs(EditorSection, { title: tI18nComplete.raw('text5e2c614c23f0'), description: tI18nComplete.raw('text32398dbb68e2'), lead: lead, children: [_jsx(SettingRow, { label: tI18nComplete.raw('text34455bf1d857'), help: oc.model ? (_jsx(InlineAction, { onClick: () => setOc('model', undefined), children: tI18nComplete.raw('text9db60344e984') })) : (tI18nComplete.raw('text64f405e80a8d')), children: _jsx("div", { className: "flex sm:justify-end", children: _jsx(ModelSelector, { models: models, providers: providers, selectedModel: selectedModelKey, unsetLabel: tI18nComplete.raw('texte8cb80e5c5cb'), onSelect: (m) => setOc('model', m ? modelKeyToWire(m) : undefined) }) }) }), variantChoices.length > 0 ? (_jsx(SettingRow, { label: tI18nComplete.raw('text264c28cbf01c'), help: oc.variant
54
56
  ? tI18nComplete.raw('text4dd21464c579')
55
57
  : tI18nComplete.raw('textf39c806f5724'), children: _jsx("div", { className: "flex sm:justify-end", children: _jsx(ReasoningEffortSelector, { variants: variantChoices, selectedVariant: oc.variant ?? null, onVariantChange: (v) => setOc('variant', v ?? undefined) }) }) })) : (_jsx(SettingRow, { label: tI18nComplete.raw('text3f19fe84a2de'), help: selectedModelKey
56
58
  ? tI18nComplete.raw('text0443f619cb33')
57
- : tI18nComplete.raw('text6376d74077c0'), children: _jsx(Input, { "aria-label": tI18nComplete.raw('text3f19fe84a2de'), value: oc.variant ?? '', placeholder: tI18nComplete.raw('text352a25678fb9'), variant: "popover", className: "h-9 w-full text-sm", onChange: (e) => setOc('variant', e.target.value) }) })), showPrompt ? (_jsx(SettingBlock, { label: tI18nComplete.raw('text561257c019e5'), help: tI18nComplete.raw('textad63817393a7'), children: _jsxs(Disclosure, { variant: "outline", className: "overflow-hidden rounded-md", children: [_jsx(DisclosureTrigger, { variant: "outline", children: _jsxs(Button, { variant: "popover", className: "flex w-full items-center justify-between gap-3 rounded-none text-sm font-normal", children: [_jsx("span", { className: "min-w-0 truncate", children: oc.prompt ? firstLine(oc.prompt) : tI18nComplete.raw('textdaaf5ab03267') }), _jsx("span", { className: "text-muted-foreground shrink-0 text-xs", children: oc.prompt ? 'Edit' : tI18nComplete.raw('text47f3fe537320') })] }) }), _jsx(DisclosureContent, { variant: "outline", contentClassName: "border-border border-t", children: _jsx(Textarea, { "aria-label": tI18nComplete.raw('text561257c019e5'), value: oc.prompt ?? '', placeholder: tI18nComplete.raw('text94a18ea1d428'), minHeight: 160, className: "rounded-none border-0 font-mono text-xs focus-visible:border-0 focus-visible:ring-0", onChange: (e) => setOc('prompt', e.target.value) }) })] }) })) : null] }), _jsxs(EditorSection, { title: tI18nComplete.raw('text6d06116595a9'), description: tI18nComplete.raw('text33439eb47c9a'), children: [_jsx(SliderRow, { label: tI18nComplete.raw('textb958ce8b871a'), help: tI18nComplete.raw('textd380d30f3d60'), value: oc.temperature, fallback: 0, min: 0, max: 2, step: 0.05, onChange: (v) => setOc('temperature', v) }), _jsx(SliderRow, { label: tI18nComplete.raw('text714db3dbb0b7'), help: tI18nComplete.raw('text4f370db531ba'), value: oc.top_p, fallback: 1, min: 0, max: 1, step: 0.01, onChange: (v) => setOc('top_p', v) }), _jsx(SettingRow, { label: tI18nComplete.raw('textfdc639c47624'), help: tI18nComplete.raw('textbf7ff92baea3'), children: _jsx(Input, { "aria-label": tI18nComplete.raw('textfdc639c47624'), type: "number", min: 1, value: oc.steps ?? '', placeholder: tI18nComplete.raw('textf7fcff0d8fea'), variant: "popover", className: "h-9 w-full text-sm tabular-nums", onChange: (e) => setOc('steps', e.target.value ? Math.max(1, Number(e.target.value)) : undefined) }) })] })] }));
59
+ : tI18nComplete.raw('text6376d74077c0'), children: _jsx(Input, { "aria-label": tI18nComplete.raw('text3f19fe84a2de'), value: oc.variant ?? '', placeholder: tI18nComplete.raw('text352a25678fb9'), variant: "popover", className: "h-9 w-full text-sm", onChange: (e) => setOc('variant', e.target.value) }) })), showPrompt ? (_jsx(SettingBlock, { label: tI18nComplete.raw('text561257c019e5'), help: tI18nComplete.raw('textad63817393a7'), children: _jsxs(Disclosure, { variant: "outline", className: "overflow-hidden rounded-md", children: [_jsx(DisclosureTrigger, { variant: "outline", children: _jsxs(Button, { variant: "popover", className: "flex w-full items-center justify-between gap-3 rounded-none text-sm font-normal", children: [_jsx("span", { className: "min-w-0 truncate", children: oc.prompt ? firstLine(oc.prompt) : tI18nComplete.raw('textdaaf5ab03267') }), _jsx("span", { className: "text-muted-foreground shrink-0 text-xs", children: oc.prompt ? 'Edit' : tI18nComplete.raw('text47f3fe537320') })] }) }), _jsx(DisclosureContent, { variant: "outline", contentClassName: "border-border border-t", children: _jsx(Textarea, { "aria-label": tI18nComplete.raw('text561257c019e5'), value: oc.prompt ?? '', placeholder: tI18nComplete.raw('text94a18ea1d428'), minHeight: 160, className: "rounded-none border-0 font-mono text-xs focus-visible:border-0 focus-visible:ring-0", onChange: (e) => setOc('prompt', e.target.value) }) })] }) })) : null] }), _jsxs(EditorSection, { title: tI18nComplete.raw('text6d06116595a9'), description: tI18nComplete.raw('text33439eb47c9a'), children: [_jsx(SliderRow, { label: tI18nComplete.raw('textb958ce8b871a'), help: tI18nComplete.raw('textd380d30f3d60'), value: oc.temperature, fallback: 0, min: 0, max: 2, step: 0.05, onChange: (v) => setOc('temperature', v) }), _jsx(SliderRow, { label: tI18nComplete.raw('text714db3dbb0b7'), help: tI18nComplete.raw('text4f370db531ba'), value: oc.top_p, fallback: 1, min: 0, max: 1, step: 0.01, onChange: (v) => setOc('top_p', v) }), _jsx(SettingRow, { label: tI18nComplete.raw('textfdc639c47624'), help: tI18nComplete.raw('textbf7ff92baea3'), children: _jsx(Input, { "aria-label": tI18nComplete.raw('textfdc639c47624'), type: "number", min: 1, value: oc.steps ?? '', placeholder: tI18nComplete.raw('textf7fcff0d8fea'), variant: "popover", className: "h-9 w-full text-sm tabular-nums", onChange: (e) => setOc('steps', e.target.value ? Math.max(1, Number(e.target.value)) : undefined) }) }), _jsx(ProviderOptionsRow, { value: oc.options, onChange: (next) => setOc('options', next) })] })] }));
60
+ }
61
+ /**
62
+ * `options` (kortix.yaml): free-form provider settings as JSON. The draft
63
+ * changes only when the text parses to an object; an empty field clears it.
64
+ */
65
+ function ProviderOptionsRow({ value, onChange, }) {
66
+ const t = useI18nTranslations('agentEditor.tabs');
67
+ const [text, setText] = useState(() => (value ? JSON.stringify(value, null, 2) : ''));
68
+ const [invalid, setInvalid] = useState(false);
69
+ const commit = (next) => {
70
+ setText(next);
71
+ if (!next.trim()) {
72
+ setInvalid(false);
73
+ return onChange(undefined);
74
+ }
75
+ try {
76
+ const parsed = JSON.parse(next);
77
+ const ok = !!parsed && typeof parsed === 'object' && !Array.isArray(parsed);
78
+ setInvalid(!ok);
79
+ if (ok)
80
+ onChange(parsed);
81
+ }
82
+ catch {
83
+ setInvalid(true);
84
+ }
85
+ };
86
+ return (_jsxs(SettingBlock, { label: t('providerOptions'), help: t('providerOptionsHelp'), children: [_jsx(Textarea, { "aria-label": t('providerOptions'), value: text, placeholder: JSON.stringify({ reasoning: 'high' }), className: "min-h-20 font-mono text-xs", "aria-invalid": invalid || undefined, onChange: (e) => commit(e.target.value) }), invalid ? _jsx("p", { className: "text-destructive text-xs", children: t('providerOptionsInvalid') }) : null] }));
58
87
  }
59
88
  /**
60
89
  * Whether a slider row is showing its default.
@@ -19,8 +19,8 @@ export declare const THEME_COLOR_SWATCH: Record<(typeof THEME_COLORS)[number], s
19
19
  export declare const PERMISSION_ACTIONS: readonly ["allow", "ask", "deny"];
20
20
  /** Display names — see AGENT_MODE_LABEL. */
21
21
  export declare const PERMISSION_ACTION_LABEL: Record<(typeof PERMISSION_ACTIONS)[number], string>;
22
- export declare const PERMISSION_RULE_KEYS: readonly ["read", "edit", "glob", "grep", "list", "bash", "task", "external_directory", "lsp"];
23
- export declare const PERMISSION_ACTION_ONLY_KEYS: readonly ["todowrite", "question", "webfetch", "websearch", "doom_loop"];
22
+ export declare const PERMISSION_RULE_KEYS: readonly ["read", "edit", "glob", "grep", "bash", "task", "skill", "external_directory"];
23
+ export declare const PERMISSION_ACTION_ONLY_KEYS: readonly ["question", "webfetch", "websearch"];
24
24
  export declare const PERMISSION_RULE_GROUPS: {
25
25
  label: string;
26
26
  keys: (typeof PERMISSION_RULE_KEYS)[number][];
@@ -50,28 +50,24 @@ export const PERMISSION_ACTION_LABEL = {
50
50
  // `skill` is intentionally EXCLUDED — the Skills governance control below owns
51
51
  // `permission.skill` (the compiler maps `skills:` onto it), so exposing it here
52
52
  // too would give two controls fighting over one key.
53
+ // The keys pi enforces (`harness/pi/interactions.ts`, `runtime.ts`): every new
54
+ // session runs pi. `list`, `lsp`, `todowrite` and `doom_loop` only ever meant
55
+ // something to OpenCode and are not offered; a manifest that sets one keeps it.
53
56
  export const PERMISSION_RULE_KEYS = [
54
57
  'read',
55
58
  'edit',
56
59
  'glob',
57
60
  'grep',
58
- 'list',
59
61
  'bash',
60
62
  'task',
63
+ 'skill',
61
64
  'external_directory',
62
- 'lsp',
63
65
  ];
64
66
  // Permission keys that only ever take a bare action (no glob-map form upstream).
65
- export const PERMISSION_ACTION_ONLY_KEYS = [
66
- 'todowrite',
67
- 'question',
68
- 'webfetch',
69
- 'websearch',
70
- 'doom_loop',
71
- ];
67
+ export const PERMISSION_ACTION_ONLY_KEYS = ['question', 'webfetch', 'websearch'];
72
68
  export const PERMISSION_RULE_GROUPS = [
73
- { label: 'Files and search', keys: ['read', 'edit', 'glob', 'grep', 'list'] },
74
- { label: 'Commands and tools', keys: ['bash', 'task', 'external_directory', 'lsp'] },
69
+ { label: 'Files and search', keys: ['read', 'edit', 'glob', 'grep'] },
70
+ { label: 'Commands and tools', keys: ['bash', 'task', 'skill', 'external_directory'] },
75
71
  ];
76
72
  /** The heading over the keys that take a bare action and never a path rule. */
77
73
  export const PERMISSION_ACTION_ONLY_GROUP_LABEL = 'Everything else';
@@ -91,6 +87,7 @@ export const PERMISSION_KEY_LABEL = {
91
87
  list: 'List folders',
92
88
  bash: 'Run shell commands',
93
89
  task: 'Hand work to a subagent',
90
+ skill: 'Load a skill',
94
91
  external_directory: 'Reach outside the project',
95
92
  lsp: 'Use the language server',
96
93
  todowrite: 'Keep a todo list',
@@ -106,7 +103,8 @@ export const PERMISSION_KEY_HELP = {
106
103
  grep: 'Search file contents by pattern.',
107
104
  list: 'List directory contents.',
108
105
  bash: 'Run shell commands.',
109
- task: 'Launch a subagent to run a task.',
106
+ task: 'Start a subagent (the agent tool). A pattern names the subagent.',
107
+ skill: 'Load a skill. A pattern names the skill.',
110
108
  external_directory: 'Access paths outside this project workspace.',
111
109
  lsp: 'Use language-server tooling — go-to-definition, diagnostics.',
112
110
  todowrite: "Maintain the session's todo list.",
@@ -24,7 +24,7 @@ import { type ReactNode } from 'react';
24
24
  * does not own their props — the shell sets the style once for everything
25
25
  * under it.
26
26
  */
27
- export type EditorSectionStyle = 'flat' | 'panel';
27
+ export type EditorSectionStyle = 'flat' | 'panel' | 'tab';
28
28
  export declare function EditorSectionStyleProvider({ value, children, }: {
29
29
  value: EditorSectionStyle;
30
30
  children: ReactNode;
@@ -24,8 +24,8 @@ export function EditorSectionStyleProvider({ value, children, }) {
24
24
  */
25
25
  export function EditorSection({ title, description, trailing, lead = false, bare = false, children, }) {
26
26
  const style = useContext(EditorSectionStyleContext);
27
- if (style === 'panel') {
28
- return (_jsxs("section", { className: lead ? 'space-y-6' : 'space-y-3', children: [lead ? (
27
+ if (style === 'panel' || style === 'tab') {
28
+ return (_jsxs("section", { className: lead ? (style === 'tab' ? 'space-y-5' : 'space-y-6') : 'space-y-3', children: [lead ? (
29
29
  // Headings stand alone (Jay, 2026-10-20): a sentence under every
30
30
  // title made the page read as prose.
31
31
  _jsx(SettingsSectionHeader, { title: title, action: trailing, className: "pb-1" })) : (_jsx(SettingsSubsectionHeader, { title: title, action: trailing })), bare ? children : _jsx(SettingsRowGroup, { children: children })] }));
@@ -50,7 +50,7 @@ export function EditorList({ className, ...props }) {
50
50
  */
51
51
  export function SettingRow({ label, help, children, }) {
52
52
  const style = useContext(EditorSectionStyleContext);
53
- return (_jsxs("div", { className: cn('flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between sm:gap-6', style === 'panel' ? 'px-4 py-3' : 'py-3.5'), children: [_jsx(SettingLabel, { label: label, help: help }), _jsx("div", { className: "w-full shrink-0 sm:w-52", children: children })] }));
53
+ return (_jsxs("div", { className: cn('flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between sm:gap-6', style === 'flat' ? 'py-3.5' : 'px-4 py-3'), children: [_jsx(SettingLabel, { label: label, help: help }), _jsx("div", { className: "w-full shrink-0 sm:w-52", children: children })] }));
54
54
  }
55
55
  /**
56
56
  * Label and help above a full-width control — for anything a row cannot hold:
@@ -58,7 +58,7 @@ export function SettingRow({ label, help, children, }) {
58
58
  */
59
59
  export function SettingBlock({ label, help, children, }) {
60
60
  const style = useContext(EditorSectionStyleContext);
61
- return (_jsxs("div", { className: cn('space-y-2.5', style === 'panel' ? 'px-4 py-3' : 'py-3.5'), children: [_jsx(SettingLabel, { label: label, help: help }), children] }));
61
+ return (_jsxs("div", { className: cn('space-y-2.5', style === 'flat' ? 'py-3.5' : 'px-4 py-3'), children: [_jsx(SettingLabel, { label: label, help: help }), children] }));
62
62
  }
63
63
  /**
64
64
  * The label pair. A plain `<span>`, not `<Label>`: none of these controls take