@kortix/ui 0.14.11 → 0.14.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (447) hide show
  1. package/README.md +1 -1
  2. package/dist/_vendor/kortix-shared.js +521 -7045
  3. package/dist/_vendor/shared/app-config.d.ts +8 -0
  4. package/dist/_vendor/shared/artifact-annotations.d.ts +708 -0
  5. package/dist/_vendor/shared/artifact-comments.d.ts +327 -0
  6. package/dist/_vendor/shared/index.d.ts +3 -1
  7. package/dist/_vendor/shared/my-kortix-agent.d.ts +40 -0
  8. package/dist/_vendor/shared/peer-message-prompt.d.ts +35 -0
  9. package/dist/_vendor/shared/pixel-mark.d.ts +11 -0
  10. package/dist/_vendor/shared/prompt-attachments.d.ts +1 -0
  11. package/dist/_vendor/shared/reminder-prompt.d.ts +8 -2
  12. package/dist/_vendor/shared/runtime-versions.d.ts +8 -0
  13. package/dist/artifacts/artifact-frame.d.ts +1 -0
  14. package/dist/artifacts/artifact-frame.js +18 -5
  15. package/dist/artifacts/frame-policy.d.ts +1 -1
  16. package/dist/artifacts/frame-policy.js +10 -5
  17. package/dist/browser/browser-panel.d.ts +2 -1
  18. package/dist/browser/browser-panel.js +12 -2
  19. package/dist/customize/agents/agent-access-text.d.ts +16 -0
  20. package/dist/customize/agents/agent-access-text.js +54 -0
  21. package/dist/customize/agents/agent-approval-rules.d.ts +8 -0
  22. package/dist/customize/agents/agent-approval-rules.js +26 -0
  23. package/dist/customize/agents/agent-authority-card.js +4 -1
  24. package/dist/customize/agents/agent-cover-card.d.ts +4 -1
  25. package/dist/customize/agents/agent-cover-card.js +2 -2
  26. package/dist/customize/agents/agent-detail-aside.d.ts +1 -2
  27. package/dist/customize/agents/agent-detail-aside.js +8 -11
  28. package/dist/customize/agents/agent-drives-section.d.ts +23 -7
  29. package/dist/customize/agents/agent-drives-section.js +107 -41
  30. package/dist/customize/agents/agent-instructions.d.ts +11 -0
  31. package/dist/customize/agents/agent-instructions.js +114 -0
  32. package/dist/customize/agents/agent-model-view.d.ts +17 -0
  33. package/dist/customize/agents/agent-model-view.js +67 -0
  34. package/dist/customize/agents/agent-overview.d.ts +53 -0
  35. package/dist/customize/agents/agent-overview.js +242 -0
  36. package/dist/customize/agents/agent-page-chrome.d.ts +128 -0
  37. package/dist/customize/agents/agent-page-chrome.js +145 -0
  38. package/dist/customize/agents/agent-page.d.ts +13 -1
  39. package/dist/customize/agents/agent-page.js +478 -367
  40. package/dist/customize/agents/agent-pin-button.d.ts +10 -0
  41. package/dist/customize/agents/agent-pin-button.js +20 -0
  42. package/dist/customize/agents/agent-policy-sets-section.d.ts +16 -0
  43. package/dist/customize/agents/agent-policy-sets-section.js +80 -0
  44. package/dist/customize/agents/agent-policy-sets.js +1 -1
  45. package/dist/customize/agents/agent-section-rail.d.ts +21 -0
  46. package/dist/customize/agents/agent-section-rail.js +23 -0
  47. package/dist/customize/agents/agent-share-control.d.ts +4 -3
  48. package/dist/customize/agents/agent-share-control.js +15 -16
  49. package/dist/customize/agents/{agent-people-section.d.ts → agent-share-dialog.d.ts} +3 -1
  50. package/dist/customize/agents/{agent-people-section.js → agent-share-dialog.js} +21 -21
  51. package/dist/customize/agents/agent-tabs.d.ts +95 -0
  52. package/dist/customize/agents/agent-tabs.js +199 -0
  53. package/dist/customize/agents/agents-page.d.ts +0 -21
  54. package/dist/customize/agents/agents-page.js +104 -118
  55. package/dist/customize/agents/connectors-required.d.ts +16 -0
  56. package/dist/customize/agents/connectors-required.js +19 -0
  57. package/dist/customize/agents/create-agent-modal.d.ts +19 -0
  58. package/dist/customize/agents/create-agent-modal.js +94 -0
  59. package/dist/customize/connectors/agent-access.d.ts +4 -4
  60. package/dist/customize/connectors/agent-access.js +7 -10
  61. package/dist/customize/connectors/connector-identity.d.ts +12 -0
  62. package/dist/customize/connectors/connector-identity.js +15 -2
  63. package/dist/customize/connectors/connector-routes.js +2 -2
  64. package/dist/customize/connectors/connectors-page.d.ts +14 -1
  65. package/dist/customize/connectors/connectors-page.js +101 -32
  66. package/dist/customize/connectors/detail/app-page.js +1 -1
  67. package/dist/customize/connectors/detail/connector-agents.js +0 -3
  68. package/dist/customize/connectors/detail/connector-page.d.ts +1 -1
  69. package/dist/customize/connectors/detail/connector-page.js +5 -2
  70. package/dist/customize/connectors/detail/connector-policy-sets.js +1 -1
  71. package/dist/customize/connectors/detail/connector-triggers.js +2 -2
  72. package/dist/customize/connectors/use-agent-access.d.ts +7 -5
  73. package/dist/customize/connectors/use-agent-access.js +2 -6
  74. package/dist/customize/models/models-page.d.ts +7 -1
  75. package/dist/customize/models/models-page.js +2 -2
  76. package/dist/customize/project-settings/project-admin-sections.d.ts +63 -0
  77. package/dist/customize/project-settings/project-admin-sections.js +80 -0
  78. package/dist/customize/project-settings/project-settings-page.d.ts +1 -1
  79. package/dist/customize/project-settings/project-settings-page.js +4 -13
  80. package/dist/customize/project-settings/project-settings-sections.d.ts +5 -5
  81. package/dist/customize/project-settings/project-settings-sections.js +6 -20
  82. package/dist/customize/providers/provider-accordion.js +29 -17
  83. package/dist/customize/providers/provider-connect.js +1 -1
  84. package/dist/customize/providers/provider-sheet.d.ts +4 -1
  85. package/dist/customize/providers/provider-sheet.js +15 -5
  86. package/dist/customize/secrets/secrets-page.d.ts +5 -1
  87. package/dist/customize/secrets/secrets-page.js +2 -2
  88. package/dist/customize/sections/gateway-view.d.ts +10 -2
  89. package/dist/customize/sections/gateway-view.js +16 -4
  90. package/dist/customize/sections/llm-provider/chatgpt-subscription-connect.d.ts +12 -5
  91. package/dist/customize/sections/llm-provider/chatgpt-subscription-connect.js +131 -8
  92. package/dist/customize/sections/llm-provider/claude-code-step.d.ts +10 -0
  93. package/dist/customize/sections/llm-provider/claude-code-step.js +32 -0
  94. package/dist/customize/sections/llm-provider/models-tab.js +5 -1
  95. package/dist/customize/sections/view/account-secret-resources-panel.d.ts +5 -3
  96. package/dist/customize/sections/view/account-secret-resources-panel.js +122 -19
  97. package/dist/customize/sections/view/agent-editor-access-fields.d.ts +1 -1
  98. package/dist/customize/sections/view/agent-editor-access-fields.js +8 -4
  99. package/dist/customize/sections/view/agent-editor-basics-fields.d.ts +4 -1
  100. package/dist/customize/sections/view/agent-editor-basics-fields.js +33 -4
  101. package/dist/customize/sections/view/agent-editor-catalog.d.ts +2 -2
  102. package/dist/customize/sections/view/agent-editor-catalog.js +10 -12
  103. package/dist/customize/sections/view/agent-editor-primitives.d.ts +1 -1
  104. package/dist/customize/sections/view/agent-editor-primitives.js +4 -4
  105. package/dist/customize/sections/view/agent-editor.d.ts +37 -26
  106. package/dist/customize/sections/view/agent-editor.js +19 -19
  107. package/dist/customize/sections/view/grant-mode-field.d.ts +8 -20
  108. package/dist/customize/sections/view/grant-mode-field.js +31 -57
  109. package/dist/customize/sections/view/permission-editor.d.ts +3 -1
  110. package/dist/customize/sections/view/permission-editor.js +19 -10
  111. package/dist/customize/sections/view/review-view.d.ts +8 -0
  112. package/dist/customize/sections/view/review-view.js +12 -1
  113. package/dist/customize/sections/view/secret-delivery.js +1 -4
  114. package/dist/customize/sections/view/secrets-view.d.ts +7 -1
  115. package/dist/customize/sections/view/secrets-view.js +42 -6
  116. package/dist/customize/settings/rail.js +2 -8
  117. package/dist/customize/settings/settings-tabs.d.ts +2 -2
  118. package/dist/customize/settings/settings-tabs.js +17 -19
  119. package/dist/customize/settings/tabs/experimental-tab.d.ts +3 -0
  120. package/dist/customize/settings/tabs/experimental-tab.js +6 -1
  121. package/dist/customize/settings/tabs/sandbox-tab.d.ts +4 -6
  122. package/dist/customize/settings/tabs/sandbox-tab.js +9 -9
  123. package/dist/customize/shared/access-list.d.ts +39 -0
  124. package/dist/customize/shared/access-list.js +62 -0
  125. package/dist/customize/shared/agent-resource-scope.d.ts +87 -0
  126. package/dist/customize/shared/agent-resource-scope.js +123 -0
  127. package/dist/customize/shared/capability-library.d.ts +41 -0
  128. package/dist/customize/shared/capability-library.js +271 -0
  129. package/dist/customize/shared/capability-page-shell.d.ts +18 -1
  130. package/dist/customize/shared/capability-page-shell.js +21 -1
  131. package/dist/customize/shared/catalog/catalog-space-tabs.d.ts +14 -0
  132. package/dist/customize/shared/catalog/catalog-space-tabs.js +20 -0
  133. package/dist/customize/shared/customize-tab-bar.d.ts +13 -0
  134. package/dist/customize/shared/customize-tab-bar.js +95 -0
  135. package/dist/customize/shared/entity/entity-modal.d.ts +17 -1
  136. package/dist/customize/shared/entity/entity-modal.js +10 -9
  137. package/dist/customize/shared/leave-guard.d.ts +23 -0
  138. package/dist/customize/shared/leave-guard.js +87 -0
  139. package/dist/customize/shared/standalone-settings-nav.js +4 -1
  140. package/dist/customize/shared/tool-rules.d.ts +11 -0
  141. package/dist/customize/shared/tool-rules.js +29 -0
  142. package/dist/customize/skills/builtin-skill-modal.d.ts +6 -0
  143. package/dist/customize/skills/builtin-skill-modal.js +41 -0
  144. package/dist/customize/skills/skills-page.d.ts +21 -18
  145. package/dist/customize/skills/skills-page.js +16 -110
  146. package/dist/customize/triggers/runtime-triggers.d.ts +17 -0
  147. package/dist/customize/triggers/runtime-triggers.js +57 -0
  148. package/dist/customize/triggers/schedule/event-trigger-copy.js +2 -2
  149. package/dist/customize/triggers/schedule/post-to-field.js +2 -2
  150. package/dist/customize/triggers/schedule/schedule-copy.d.ts +11 -6
  151. package/dist/customize/triggers/schedule/schedule-copy.js +29 -8
  152. package/dist/customize/triggers/schedule/schedule-detail-sheet.js +7 -3
  153. package/dist/customize/triggers/schedule/trigger-composer-logic.d.ts +26 -1
  154. package/dist/customize/triggers/schedule/trigger-composer-logic.js +64 -3
  155. package/dist/customize/triggers/schedule/trigger-composer.js +57 -20
  156. package/dist/customize/triggers/schedule/trigger-edit-logic.js +18 -5
  157. package/dist/customize/triggers/schedule/trigger-filter.d.ts +10 -0
  158. package/dist/customize/triggers/schedule/trigger-filter.js +16 -0
  159. package/dist/customize/triggers/schedule/trigger-runs-panel.js +1 -0
  160. package/dist/customize/triggers/schedule/trigger-toast.js +2 -1
  161. package/dist/customize/triggers/schedule/use-trigger-mutations.d.ts +1 -1
  162. package/dist/customize/triggers/schedule/use-trigger-mutations.js +1 -1
  163. package/dist/customize/triggers/schedule/when-app.d.ts +15 -0
  164. package/dist/customize/triggers/schedule/when-app.js +21 -0
  165. package/dist/customize/triggers/schedule/when-change-request.d.ts +10 -0
  166. package/dist/customize/triggers/schedule/when-change-request.js +15 -0
  167. package/dist/customize/triggers/schedule-view.d.ts +17 -3
  168. package/dist/customize/triggers/schedule-view.js +46 -16
  169. package/dist/customize/triggers/triggers-page.d.ts +3 -3
  170. package/dist/customize/triggers/triggers-page.js +2 -2
  171. package/dist/customize/use-configure-thread.d.ts +8 -2
  172. package/dist/customize/use-configure-thread.js +30 -18
  173. package/dist/files/project/components/change-request-detail-dialog.js +2 -3
  174. package/dist/files/project/components/drive-explorer.js +6 -5
  175. package/dist/files/project/explorer-source.d.ts +3 -0
  176. package/dist/files/project/upload-batch.d.ts +3 -3
  177. package/dist/files/project/upload-batch.js +7 -6
  178. package/dist/files/runtime/sandbox-explorer-source.js +3 -3
  179. package/dist/i18n/en.d.ts +1331 -53
  180. package/dist/i18n/en.js +1423 -145
  181. package/dist/i18n/ui-catalog/remaining-ui-translation-keys.generated.js +16 -7
  182. package/dist/internal/auth/auth-primitives.d.ts +1 -3
  183. package/dist/internal/auth/auth-primitives.js +2 -2
  184. package/dist/internal/billing/session-cost-format.d.ts +1 -0
  185. package/dist/internal/billing/session-cost-format.js +11 -0
  186. package/dist/internal/components/agent-mark.d.ts +12 -1
  187. package/dist/internal/components/agent-mark.js +34 -11
  188. package/dist/internal/components/nav-rail.d.ts +22 -0
  189. package/dist/internal/components/nav-rail.js +16 -0
  190. package/dist/internal/components/repository-disconnected.js +2 -2
  191. package/dist/internal/goals/goal-meta.d.ts +15 -1
  192. package/dist/internal/goals/goal-meta.js +42 -2
  193. package/dist/internal/hooks/projects/use-agent-config.d.ts +11 -7
  194. package/dist/internal/hooks/projects/use-agent-config.js +28 -11
  195. package/dist/internal/hooks/use-slash-focus.d.ts +7 -1
  196. package/dist/internal/hooks/use-slash-focus.js +9 -3
  197. package/dist/internal/layout/project-capability-nav.d.ts +24 -0
  198. package/dist/internal/layout/project-capability-nav.js +86 -0
  199. package/dist/internal/layout/project-page-header.d.ts +1 -1
  200. package/dist/internal/layout/project-page-header.js +1 -1
  201. package/dist/internal/layout/project-settings-nav.d.ts +3 -2
  202. package/dist/internal/layout/project-settings-nav.js +5 -3
  203. package/dist/internal/lib/browser-noise/rules/extensions.js +3 -0
  204. package/dist/internal/lib/browser-noise/rules/old-browsers.js +1 -1
  205. package/dist/internal/lib/capability-tab-routes.d.ts +34 -3
  206. package/dist/internal/lib/capability-tab-routes.js +76 -8
  207. package/dist/internal/lib/manifest-health.d.ts +10 -0
  208. package/dist/internal/lib/manifest-health.js +20 -0
  209. package/dist/internal/lib/pixel-mark.d.ts +4 -1
  210. package/dist/internal/lib/pixel-mark.js +33 -6
  211. package/dist/internal/lib/project-actions.d.ts +1 -1
  212. package/dist/internal/lib/project-actions.js +0 -4
  213. package/dist/internal/lib/provider-branding.js +2 -0
  214. package/dist/internal/lib/space-scope.d.ts +29 -0
  215. package/dist/internal/lib/space-scope.js +28 -0
  216. package/dist/internal/lib/use-project-feature-flags.js +3 -3
  217. package/dist/internal/lib/web-notifications.d.ts +74 -8
  218. package/dist/internal/lib/web-notifications.js +243 -117
  219. package/dist/internal/notifications/notification-rows.d.ts +14 -7
  220. package/dist/internal/notifications/notification-rows.js +21 -14
  221. package/dist/internal/notifications/session-toast-cards.d.ts +2 -2
  222. package/dist/internal/reminders/reminder-format.d.ts +6 -2
  223. package/dist/internal/reminders/reminder-format.js +7 -1
  224. package/dist/internal/stores/active-space-store.d.ts +35 -0
  225. package/dist/internal/stores/active-space-store.js +29 -0
  226. package/dist/internal/stores/kortix-computer-store.d.ts +2 -1
  227. package/dist/internal/stores/kortix-computer-store.js +18 -7
  228. package/dist/internal/stores/pinned-agents-store.d.ts +26 -0
  229. package/dist/internal/stores/pinned-agents-store.js +20 -0
  230. package/dist/internal/stores/session-panel-memory-store.js +3 -0
  231. package/dist/internal/stores/turn-attention-store.d.ts +5 -4
  232. package/dist/lib/routes.d.ts +16 -1
  233. package/dist/lib/routes.js +15 -3
  234. package/dist/markdown/doc-editor/doc-embed.d.ts +31 -0
  235. package/dist/markdown/doc-editor/doc-embed.js +168 -0
  236. package/dist/markdown/doc-editor/doc-extensions.d.ts +26 -0
  237. package/dist/markdown/doc-editor/doc-extensions.js +149 -0
  238. package/dist/markdown/doc-editor/doc-menus.d.ts +9 -0
  239. package/dist/markdown/doc-editor/doc-menus.js +56 -0
  240. package/dist/markdown/doc-editor/markdown.d.ts +12 -0
  241. package/dist/markdown/doc-editor/markdown.js +140 -0
  242. package/dist/markdown/genui/components/inline.d.ts +1 -1
  243. package/dist/primitives/badge.d.ts +1 -1
  244. package/dist/primitives/button.d.ts +1 -1
  245. package/dist/primitives/pixel-kortix-mark.d.ts +5 -4
  246. package/dist/primitives/pixel-kortix-mark.js +5 -15
  247. package/dist/primitives/tag.d.ts +1 -1
  248. package/dist/primitives/textarea.js +14 -0
  249. package/dist/primitives/toast.d.ts +2 -0
  250. package/dist/primitives/toast.js +4 -2
  251. package/dist/providers/ui-provider.d.ts +16 -0
  252. package/dist/session/actions/session-label.d.ts +1 -1
  253. package/dist/session/actions/session-label.js +3 -3
  254. package/dist/session/agents/agent-model.d.ts +92 -0
  255. package/dist/session/agents/agent-model.js +123 -0
  256. package/dist/session/agents/agent-state-mark.d.ts +10 -0
  257. package/dist/session/agents/agent-state-mark.js +22 -0
  258. package/dist/session/agents/agent-strip.d.ts +58 -0
  259. package/dist/session/agents/agent-strip.js +259 -0
  260. package/dist/session/agents/held-messages.d.ts +33 -0
  261. package/dist/session/agents/held-messages.js +50 -0
  262. package/dist/session/agents/legacy-subagent-chat.d.ts +11 -0
  263. package/dist/session/agents/legacy-subagent-chat.js +19 -0
  264. package/dist/session/agents/session-peek.d.ts +20 -0
  265. package/dist/session/agents/session-peek.js +67 -0
  266. package/dist/session/agents/session-prompt.d.ts +13 -0
  267. package/dist/session/agents/session-prompt.js +18 -0
  268. package/dist/session/agents/steer-session.d.ts +13 -0
  269. package/dist/session/agents/steer-session.js +29 -0
  270. package/dist/session/agents/subagent-dialog-content.d.ts +11 -0
  271. package/dist/session/agents/subagent-dialog-content.js +115 -0
  272. package/dist/session/agents/subagent-view.d.ts +8 -0
  273. package/dist/session/agents/subagent-view.js +18 -0
  274. package/dist/session/agents/tasks-panel.d.ts +13 -0
  275. package/dist/session/agents/tasks-panel.js +41 -0
  276. package/dist/session/agents/workflow-run-controls.d.ts +43 -0
  277. package/dist/session/agents/workflow-run-controls.js +141 -0
  278. package/dist/session/composer/ComposerCard.d.ts +1 -1
  279. package/dist/session/composer/ComposerCard.js +3 -3
  280. package/dist/session/composer/agent-selector.js +13 -19
  281. package/dist/session/composer/composer-underbar.d.ts +3 -1
  282. package/dist/session/composer/composer-underbar.js +2 -2
  283. package/dist/session/composer/composer.d.ts +5 -0
  284. package/dist/session/composer/composer.js +16 -10
  285. package/dist/session/composer/editor/composer-editor.js +19 -8
  286. package/dist/session/composer/editor/ultracode.d.ts +34 -0
  287. package/dist/session/composer/editor/ultracode.js +127 -0
  288. package/dist/session/composer/index.d.ts +1 -0
  289. package/dist/session/composer/index.js +1 -0
  290. package/dist/session/composer/send-blockers.d.ts +1 -11
  291. package/dist/session/composer/send-blockers.js +1 -11
  292. package/dist/session/composer/session-composer-readiness.d.ts +1 -28
  293. package/dist/session/composer/session-composer-readiness.js +5 -16
  294. package/dist/session/header/reminder-parts.d.ts +1 -1
  295. package/dist/session/header/session-site-header.js +6 -3
  296. package/dist/session/header/subagent-hover-card.d.ts +0 -2
  297. package/dist/session/header/subagent-hover-card.js +1 -4
  298. package/dist/session/models/claude-connection-slot.d.ts +11 -0
  299. package/dist/session/models/claude-connection-slot.js +30 -0
  300. package/dist/session/models/model-availability.d.ts +3 -1
  301. package/dist/session/models/model-availability.js +3 -0
  302. package/dist/session/models/model-selector.js +11 -12
  303. package/dist/session/models/model-tags.d.ts +9 -0
  304. package/dist/session/models/model-tags.js +8 -0
  305. package/dist/session/panel/easy/detail-view.js +7 -0
  306. package/dist/session/panel/easy/easy-panel.js +1 -1
  307. package/dist/session/panel/easy/step-icon.js +5 -1
  308. package/dist/session/panel/mobile-tool-drawer.js +7 -3
  309. package/dist/session/panel/open-session-quick-view.js +1 -1
  310. package/dist/session/panel/session-action-panel-column.js +1 -1
  311. package/dist/session/panel/session-desktop.js +41 -14
  312. package/dist/session/panel/session-panel-provider.d.ts +1 -1
  313. package/dist/session/panel/session-panel-provider.js +7 -11
  314. package/dist/session/prompts/question-prompt.js +3 -1
  315. package/dist/session/status/session-error-banner.js +4 -1
  316. package/dist/session/thread/session-chat.js +286 -296
  317. package/dist/session/thread/session-context-modal.js +29 -10
  318. package/dist/session/thread/session-context-spawned-sessions.d.ts +13 -0
  319. package/dist/session/thread/session-context-spawned-sessions.js +44 -0
  320. package/dist/session/thread/session-context-sub-sessions.js +3 -8
  321. package/dist/session/thread/transcript.d.ts +3 -0
  322. package/dist/session/thread/transcript.js +32 -8
  323. package/dist/session/tool/shared/full-view-action.d.ts +29 -0
  324. package/dist/session/tool/shared/full-view-action.js +43 -0
  325. package/dist/session/tool/tool-part-renderer.js +10 -2
  326. package/dist/session/tool/tools/agent-message-tool.js +2 -2
  327. package/dist/session/tool/tools/agent-spawn-tool.js +2 -2
  328. package/dist/session/tool/tools/agent-status-tool.js +2 -2
  329. package/dist/session/tool/tools/kortix-action-tool.d.ts +2 -0
  330. package/dist/session/tool/tools/kortix-action-tool.js +148 -0
  331. package/dist/session/tool/tools/kortix-tool-card.d.ts +83 -0
  332. package/dist/session/tool/tools/kortix-tool-card.js +186 -0
  333. package/dist/session/tool/tools/multi-agent-tool-bodies.d.ts +11 -0
  334. package/dist/session/tool/tools/multi-agent-tool-bodies.js +141 -0
  335. package/dist/session/tool/tools/multi-agent-tool-data.d.ts +63 -0
  336. package/dist/session/tool/tools/multi-agent-tool-data.js +118 -0
  337. package/dist/session/tool/tools/multi-agent-tools.d.ts +9 -0
  338. package/dist/session/tool/tools/multi-agent-tools.js +38 -0
  339. package/dist/session/tool/tools/question-tool.js +1 -1
  340. package/dist/session/tool/tools/register.d.ts +3 -0
  341. package/dist/session/tool/tools/register.js +3 -0
  342. package/dist/session/tool/tools/session-spawn-tool.js +2 -2
  343. package/dist/session/tool/tools/task-tool.d.ts +1 -1
  344. package/dist/session/tool/tools/task-tool.js +29 -41
  345. package/dist/session/tool/tools/workflow-progress.d.ts +34 -0
  346. package/dist/session/tool/tools/workflow-progress.js +186 -0
  347. package/dist/session/tool/tools/workflow-run.d.ts +128 -0
  348. package/dist/session/tool/tools/workflow-run.js +251 -0
  349. package/dist/session/tool/tools/workflow-tool.d.ts +9 -0
  350. package/dist/session/tool/tools/workflow-tool.js +253 -0
  351. package/dist/session/turn/notice-batch-group.d.ts +12 -0
  352. package/dist/session/turn/notice-batch-group.js +17 -0
  353. package/dist/session/turn/peer-message-row.d.ts +14 -0
  354. package/dist/session/turn/peer-message-row.js +57 -0
  355. package/dist/session/turn/subagent-notice-row.d.ts +4 -0
  356. package/dist/session/turn/subagent-notice-row.js +50 -0
  357. package/dist/session/turn/subagent-notice.d.ts +58 -0
  358. package/dist/session/turn/subagent-notice.js +111 -0
  359. package/dist/session/turn/user-message.d.ts +5 -4
  360. package/dist/session/turn/user-message.js +31 -10
  361. package/dist/styles/tokens.css +2 -0
  362. package/dist/styles.css +1 -1
  363. package/dist/terminal/session-terminal-connect-bar.js +1 -1
  364. package/dist/workspace/admin/project-admin-dashboard.d.ts +53 -0
  365. package/dist/workspace/admin/project-admin-dashboard.js +252 -0
  366. package/dist/workspace/admin/project-admin-nav.d.ts +20 -0
  367. package/dist/workspace/admin/project-admin-nav.js +41 -0
  368. package/dist/workspace/home/welcome-body.js +25 -3
  369. package/dist/workspace/index.d.ts +6 -2
  370. package/dist/workspace/index.js +12 -2
  371. package/dist/workspace/layout/new-session-create.js +3 -3
  372. package/dist/workspace/layout/project-home.js +3 -3
  373. package/dist/workspace/memory/memory-labels.js +5 -0
  374. package/dist/workspace/repository-disconnected.js +2 -2
  375. package/dist/workspace/sessions/board-dispatch.d.ts +52 -0
  376. package/dist/workspace/sessions/board-dispatch.js +110 -0
  377. package/dist/workspace/sessions/board-grouping.d.ts +63 -0
  378. package/dist/workspace/sessions/board-grouping.js +141 -0
  379. package/dist/workspace/sessions/board-peek.d.ts +15 -0
  380. package/dist/workspace/sessions/board-peek.js +54 -0
  381. package/dist/workspace/sessions/board-state-mark.d.ts +15 -0
  382. package/dist/workspace/sessions/board-state-mark.js +24 -0
  383. package/dist/workspace/sessions/project-sessions-view.js +42 -31
  384. package/dist/workspace/sessions/sessions-board.d.ts +12 -0
  385. package/dist/workspace/sessions/sessions-board.js +214 -0
  386. package/dist/workspace/sidebar/footer/project-manifest-issues-alert.d.ts +46 -0
  387. package/dist/workspace/sidebar/footer/project-manifest-issues-alert.js +85 -0
  388. package/dist/workspace/sidebar/footer/sidebar-alert.js +1 -1
  389. package/dist/workspace/sidebar/new-agent-modal-provider.d.ts +12 -0
  390. package/dist/workspace/sidebar/new-agent-modal-provider.js +19 -0
  391. package/dist/workspace/sidebar/project-nav-items.d.ts +3 -1
  392. package/dist/workspace/sidebar/project-nav-items.js +53 -5
  393. package/dist/workspace/sidebar/project-session-list.js +35 -12
  394. package/dist/workspace/sidebar/project-sidebar.js +6 -3
  395. package/dist/workspace/sidebar/session-filter-menu.js +2 -1
  396. package/dist/workspace/space/space-blocks.d.ts +25 -0
  397. package/dist/workspace/space/space-blocks.js +124 -0
  398. package/dist/workspace/space/space-filter-tabs.d.ts +17 -0
  399. package/dist/workspace/space/space-filter-tabs.js +31 -0
  400. package/dist/workspace/space/space-page.d.ts +24 -0
  401. package/dist/workspace/space/space-page.js +157 -0
  402. package/dist/workspace/space/space-room.d.ts +20 -0
  403. package/dist/workspace/space/space-room.js +27 -0
  404. package/dist/workspace/space/space-tab-menu.d.ts +14 -0
  405. package/dist/workspace/space/space-tab-menu.js +127 -0
  406. package/dist/workspace/space/space-tab-panels.d.ts +9 -0
  407. package/dist/workspace/space/space-tab-panels.js +203 -0
  408. package/dist/workspace/space/space-templates.d.ts +34 -0
  409. package/dist/workspace/space/space-templates.js +71 -0
  410. package/dist/workspace/space/use-space-filter.d.ts +10 -0
  411. package/dist/workspace/space/use-space-filter.js +40 -0
  412. package/dist/workspace/space/use-space-manifest.d.ts +8 -0
  413. package/dist/workspace/space/use-space-manifest.js +27 -0
  414. package/dist/workspace/spaces/space-timeline.js +2 -2
  415. package/package.json +56 -53
  416. package/skills/kortix-ui/SKILL.md +1 -1
  417. package/skills/kortix-ui/references/custom-dashboard.md +10 -4
  418. package/skills/kortix-ui/references/modules.md +11 -9
  419. package/dist/_vendor/shared/meta-agent.d.ts +0 -7
  420. package/dist/customize/agents/agent-grant-pages.d.ts +0 -37
  421. package/dist/customize/agents/agent-grant-pages.js +0 -226
  422. package/dist/customize/agents/agent-triggers-section.d.ts +0 -17
  423. package/dist/customize/agents/agent-triggers-section.js +0 -109
  424. package/dist/customize/migrate-to-v2/index.d.ts +0 -5
  425. package/dist/customize/migrate-to-v2/index.js +0 -5
  426. package/dist/customize/migrate-to-v2/migration-prompt.d.ts +0 -16
  427. package/dist/customize/migrate-to-v2/migration-prompt.js +0 -59
  428. package/dist/customize/migrate-to-v2/upgrade-defs.d.ts +0 -30
  429. package/dist/customize/migrate-to-v2/upgrade-defs.js +0 -43
  430. package/dist/customize/migrate-to-v2/upgrade-view.d.ts +0 -32
  431. package/dist/customize/migrate-to-v2/upgrade-view.js +0 -152
  432. package/dist/customize/migrate-to-v2/use-run-upgrade.d.ts +0 -18
  433. package/dist/customize/migrate-to-v2/use-run-upgrade.js +0 -16
  434. package/dist/customize/shared/capability-tabs.d.ts +0 -3
  435. package/dist/customize/shared/capability-tabs.js +0 -137
  436. package/dist/customize/skills/skill-scope.d.ts +0 -14
  437. package/dist/customize/skills/skill-scope.js +0 -18
  438. package/dist/internal/lib/manifest-version.d.ts +0 -21
  439. package/dist/internal/lib/manifest-version.js +0 -55
  440. package/dist/session/composer/hooks/use-composer-escape-stop.d.ts +0 -6
  441. package/dist/session/composer/hooks/use-composer-escape-stop.js +0 -28
  442. package/dist/session/thread/sub-session-modal-content.d.ts +0 -8
  443. package/dist/session/thread/sub-session-modal-content.js +0 -23
  444. package/dist/session/thread/sub-session-modal.d.ts +0 -2
  445. package/dist/session/thread/sub-session-modal.js +0 -14
  446. package/dist/workspace/sidebar/footer/project-manifest-upgrade-alert.d.ts +0 -13
  447. package/dist/workspace/sidebar/footer/project-manifest-upgrade-alert.js +0 -48
@@ -3,9 +3,6 @@ import { type AgentGrants } from './agent-access.js';
3
3
  * The project's agents and their connector grants and rule sets, plus the two
4
4
  * writes: give or take a connector, and pick an agent's rule set on it. Both
5
5
  * commit kortix.yaml through `PUT …/agents/{name}/scope`.
6
- *
7
- * `supported` is false on a v1 manifest: its agents are a TOML overlay this
8
- * reader does not parse, and rule sets need v2.
9
6
  */
10
7
  export declare function useAgentAccess(projectId: string): {
11
8
  isPending: boolean;
@@ -17,8 +14,12 @@ export declare function useAgentAccess(projectId: string): {
17
14
  is_kortix_repo: boolean;
18
15
  signals: Record<string, boolean>;
19
16
  manifest_raw: string | null;
17
+ manifest_health?: import("@kortix/sdk").ProjectManifestHealth;
20
18
  open_code_raw: string | null;
21
19
  open_code_default_agent: string | null;
20
+ builtin_agents?: {
21
+ my_kortix: boolean;
22
+ };
22
23
  agent_discovery: "opencode" | "declarative";
23
24
  agents: Array<{
24
25
  name: string;
@@ -27,10 +28,11 @@ export declare function useAgentAccess(projectId: string): {
27
28
  mode: string | null;
28
29
  hidden?: boolean;
29
30
  model?: string | null;
30
- source?: "opencode" | "kortix.toml";
31
+ source?: "opencode" | "kortix.yaml" | "kortix.toml";
31
32
  enabled?: boolean;
32
33
  platform?: boolean;
33
34
  sandbox?: string | null;
35
+ space?: string | null;
34
36
  scope?: {
35
37
  env: string[] | "all";
36
38
  connectors: string[] | "all";
@@ -53,13 +55,13 @@ export declare function useAgentAccess(projectId: string): {
53
55
  required: string[];
54
56
  optional: string[];
55
57
  };
58
+ spaces?: import("@kortix/sdk").ManifestSpace[];
56
59
  };
57
60
  project: import("@kortix/sdk").KortixProject;
58
61
  git_connection?: import("@kortix/sdk").ProjectGitConnection | null;
59
62
  file_count: number;
60
63
  files: import("@kortix/sdk").ProjectFileEntry[];
61
64
  }, Error>>;
62
- supported: boolean;
63
65
  canEdit: boolean;
64
66
  agents: string[];
65
67
  grantsOf: (agent: string) => AgentGrants | undefined;
@@ -12,9 +12,6 @@ const ACTIONS = [PROJECT_ACTIONS.PROJECT_AGENT_WRITE, PROJECT_ACTIONS.PROJECT_CO
12
12
  * The project's agents and their connector grants and rule sets, plus the two
13
13
  * writes: give or take a connector, and pick an agent's rule set on it. Both
14
14
  * commit kortix.yaml through `PUT …/agents/{name}/scope`.
15
- *
16
- * `supported` is false on a v1 manifest: its agents are a TOML overlay this
17
- * reader does not parse, and rule sets need v2.
18
15
  */
19
16
  export function useAgentAccess(projectId) {
20
17
  const queryClient = useQueryClient();
@@ -30,7 +27,7 @@ export function useAgentAccess(projectId) {
30
27
  const config = projectQuery.data?.config;
31
28
  const grants = useMemo(() => manifestAgentGrants(config?.manifest_raw), [config?.manifest_raw]);
32
29
  const agents = useMemo(() => {
33
- const names = new Set(Object.keys(grants ?? {}));
30
+ const names = new Set(Object.keys(grants));
34
31
  for (const agent of config?.agents ?? [])
35
32
  if (!agent.hidden)
36
33
  names.add(agent.name);
@@ -44,13 +41,12 @@ export function useAgentAccess(projectId) {
44
41
  void queryClient.invalidateQueries({ queryKey: ['connector-policy-sets', projectId] });
45
42
  },
46
43
  });
47
- const grantsOf = (agent) => grants?.[agent];
44
+ const grantsOf = (agent) => grants[agent];
48
45
  return {
49
46
  isPending: projectQuery.isPending,
50
47
  isError: projectQuery.isError,
51
48
  error: projectQuery.error,
52
49
  refetch: projectQuery.refetch,
53
- supported: grants !== null,
54
50
  canEdit,
55
51
  agents,
56
52
  grantsOf,
@@ -1,3 +1,5 @@
1
+ import type { ResourceScope } from '../shared/agent-resource-scope.js';
2
+ import type { ReactNode } from 'react';
1
3
  /**
2
4
  * The page body for /projects/[id]/models — Models graduated out of the
3
5
  * project Settings sub-nav into its own top-level Customize tab, alongside
@@ -23,6 +25,10 @@
23
25
  * `useStandaloneCapabilityNav` is that provider's value for a page that is
24
26
  * not the overlay or `/config`.
25
27
  */
26
- export declare function ModelsPage({ projectId }: {
28
+ export declare function ModelsPage({ projectId, surface, agentSettings, }: {
27
29
  projectId: string;
30
+ /** `agent` renders the same page on one agent's editor (`agent-page.tsx`),
31
+ * with `agentSettings` as its leading "This agent" tab. */
32
+ surface?: ResourceScope;
33
+ agentSettings?: ReactNode;
28
34
  }): import("react").JSX.Element;
@@ -29,7 +29,7 @@ import { AppReturnBar } from './app-return-bar.js';
29
29
  * `useStandaloneCapabilityNav` is that provider's value for a page that is
30
30
  * not the overlay or `/config`.
31
31
  */
32
- export function ModelsPage({ projectId }) {
32
+ export function ModelsPage({ projectId, surface, agentSettings, }) {
33
33
  const settingsNav = useStandaloneCapabilityNav(projectId, 'models');
34
- return (_jsxs(SettingsNavProvider, { value: settingsNav, children: [_jsx(LlmManagementView, { projectId: projectId }), _jsx(AppReturnBar, { projectId: projectId })] }));
34
+ return (_jsxs(SettingsNavProvider, { value: settingsNav, children: [_jsx(LlmManagementView, { projectId: projectId, surface: surface, agentSettings: agentSettings }), _jsx(AppReturnBar, { projectId: projectId })] }));
35
35
  }
@@ -0,0 +1,63 @@
1
+ import { type Icon } from '@phosphor-icons/react';
2
+ import type { CapabilityTab } from '../../internal/lib/capability-tab-routes.js';
3
+ import { type ProjectSettingsSectionKey } from './project-settings-sections.js';
4
+ /**
5
+ * The sections of Project admin (`/projects/<id>/admin`).
6
+ *
7
+ * Customize is agent-first: each agent's page configures what THAT agent draws
8
+ * on. Project admin is the other view: the project-wide libraries an agent is
9
+ * granted from, plus every project setting. Two rail groups:
10
+ *
11
+ * 1. **Project resources** — the global variant of each library page.
12
+ * 2. **Settings** — the sections of `project-settings-sections.ts`, unchanged.
13
+ *
14
+ * A key IS its URL segment (`/admin/<key>`), so renaming one breaks live links. The
15
+ * settings keys are the Settings page's own keys, so `?section=git` means the
16
+ * same section on both surfaces.
17
+ */
18
+ export type ProjectAdminResourceKey = 'connectors' | 'skills' | 'tools' | 'extensions' | 'triggers' | 'models' | 'secrets' | 'apps' | 'drives' | 'repo';
19
+ /**
20
+ * The Settings sections this page lists. Review is not one: it is its own
21
+ * standalone surface, and `projectSettingsSections` never lists it.
22
+ */
23
+ export type ProjectAdminSettingsKey = Exclude<ProjectSettingsSectionKey, 'review'>;
24
+ export type ProjectAdminSectionKey = ProjectAdminResourceKey | ProjectAdminSettingsKey;
25
+ export interface ProjectAdminResource {
26
+ key: ProjectAdminResourceKey;
27
+ icon: Icon;
28
+ /**
29
+ * The Customize tab whose access rule (`capabilityAccess`) decides whether
30
+ * the row shows. Null: the page gates itself (Apps reads `useProjectCan`).
31
+ */
32
+ capability: CapabilityTab['key'] | null;
33
+ /**
34
+ * The page lives in the host app, not in `@kortix/ui`: the host passes it
35
+ * through `hostSections`, and the row hides when it does not.
36
+ */
37
+ host: boolean;
38
+ /**
39
+ * The flag the row needs. Repo is a library only with `drives` on; with it
40
+ * off, the sidebar's Files row is the repo browser (`projectNavRows`).
41
+ */
42
+ flag?: 'drives';
43
+ }
44
+ /** Rail order. Icons match the agent editor's tabs (`agent-page.tsx`). */
45
+ export declare const PROJECT_ADMIN_RESOURCES: readonly ProjectAdminResource[];
46
+ /** `/projects/<id>/admin` with no section opens the first resource. */
47
+ export declare const DEFAULT_PROJECT_ADMIN_SECTION: ProjectAdminSectionKey;
48
+ export declare function isProjectAdminResource(key: ProjectAdminSectionKey): key is ProjectAdminResourceKey;
49
+ export declare function parseProjectAdminSection(raw: string | null | undefined): ProjectAdminSectionKey | null;
50
+ /**
51
+ * The link to one section: `/projects/<id>/admin/<section>`. `extra` adds page
52
+ * params (`scope=channels` for the Connectors page's Channels scope).
53
+ */
54
+ export declare function projectAdminHref(projectId: string, key?: ProjectAdminSectionKey, extra?: Record<string, string>): string;
55
+ /**
56
+ * The section a legacy settings-nav id names. Panes still call
57
+ * `navigate('llm-providers')`, `navigate('experimental')` or
58
+ * `navigate('channels')` in the overlay's vocabulary; inside Project admin
59
+ * each of those lands on a section of this page. Null: the id is not a
60
+ * section here (`members`, `review`, a personal overlay tab).
61
+ */
62
+ export declare function projectAdminNavTarget(tab: string): ProjectAdminSectionKey | null;
63
+ export declare const RESOURCE_LABEL_KEYS: Partial<Record<ProjectAdminResourceKey, string>>;
@@ -0,0 +1,80 @@
1
+ import { AppWindowIcon, BookOpenTextIcon, CpuIcon, FoldersIcon, HardDrivesIcon, KeyIcon, PlugsConnectedIcon, PuzzlePieceIcon, TimerIcon, WrenchIcon, } from '@phosphor-icons/react';
2
+ import { adminPath } from '../../lib/routes.js';
3
+ import { parseProjectSettingsSection, } from './project-settings-sections.js';
4
+ /** Rail order. Icons match the agent editor's tabs (`agent-page.tsx`). */
5
+ export const PROJECT_ADMIN_RESOURCES = [
6
+ { key: 'connectors', icon: PlugsConnectedIcon, capability: 'connectors', host: false },
7
+ { key: 'secrets', icon: KeyIcon, capability: 'secrets', host: false },
8
+ { key: 'skills', icon: BookOpenTextIcon, capability: 'skills', host: false },
9
+ { key: 'tools', icon: WrenchIcon, capability: 'agent', host: false },
10
+ { key: 'extensions', icon: PuzzlePieceIcon, capability: 'agent', host: false },
11
+ { key: 'drives', icon: HardDrivesIcon, capability: null, host: false, flag: 'drives' },
12
+ { key: 'apps', icon: AppWindowIcon, capability: null, host: true },
13
+ // Triggers: kortix.yaml triggers and runtime triggers (loops) on one page.
14
+ // The key stays `triggers`: it is the URL segment, and live links name it.
15
+ { key: 'triggers', icon: TimerIcon, capability: 'triggers', host: false },
16
+ { key: 'models', icon: CpuIcon, capability: 'models', host: false },
17
+ { key: 'repo', icon: FoldersIcon, capability: 'files', host: false, flag: 'drives' },
18
+ ];
19
+ /** `/projects/<id>/admin` with no section opens the first resource. */
20
+ export const DEFAULT_PROJECT_ADMIN_SECTION = 'connectors';
21
+ export function isProjectAdminResource(key) {
22
+ return PROJECT_ADMIN_RESOURCES.some((r) => r.key === key);
23
+ }
24
+ export function parseProjectAdminSection(raw) {
25
+ if (!raw)
26
+ return null;
27
+ // `/admin/loops` was the Loops page until 2026-10-28: loops are triggers now.
28
+ if (raw === 'loops')
29
+ return 'triggers';
30
+ const resource = PROJECT_ADMIN_RESOURCES.find((r) => r.key === raw);
31
+ if (resource)
32
+ return resource.key;
33
+ const setting = parseProjectSettingsSection(raw);
34
+ return setting === 'review' ? null : setting;
35
+ }
36
+ /**
37
+ * The link to one section: `/projects/<id>/admin/<section>`. `extra` adds page
38
+ * params (`scope=channels` for the Connectors page's Channels scope).
39
+ */
40
+ export function projectAdminHref(projectId, key = DEFAULT_PROJECT_ADMIN_SECTION, extra) {
41
+ const query = new URLSearchParams(extra).toString();
42
+ return `${adminPath(projectId, key)}${query ? `?${query}` : ''}`;
43
+ }
44
+ /**
45
+ * The section a legacy settings-nav id names. Panes still call
46
+ * `navigate('llm-providers')`, `navigate('experimental')` or
47
+ * `navigate('channels')` in the overlay's vocabulary; inside Project admin
48
+ * each of those lands on a section of this page. Null: the id is not a
49
+ * section here (`members`, `review`, a personal overlay tab).
50
+ */
51
+ export function projectAdminNavTarget(tab) {
52
+ const direct = parseProjectAdminSection(tab);
53
+ if (direct)
54
+ return direct;
55
+ if (tab.startsWith('llm-'))
56
+ return 'models';
57
+ if (tab === 'channels')
58
+ return 'connectors';
59
+ if (tab === 'reminders')
60
+ return 'triggers';
61
+ if (tab === 'settings' || tab === 'workspace')
62
+ return 'general';
63
+ if (tab === 'experimental')
64
+ return 'feature-flags';
65
+ if (tab === 'snapshots')
66
+ return 'sandbox';
67
+ return null;
68
+ }
69
+ /* Rail labels, keyed by section: the `hardcodedUi.i18nComplete` strings the
70
+ Customize bar and the sidebar already show for these libraries. */
71
+ export const RESOURCE_LABEL_KEYS = {
72
+ connectors: 'textc3d2e79ebdd0',
73
+ skills: 'text66d0f523a379',
74
+ // "Triggers": kortix.yaml triggers and loops are one page (2026-10-28).
75
+ triggers: 'texte62f2148a64d',
76
+ models: 'textd17d2d78d76e',
77
+ secrets: 'textd8707d411d99',
78
+ apps: 'text89dd748442c1',
79
+ repo: 'text91dba14806eb',
80
+ };
@@ -8,7 +8,7 @@ import { type ProjectSettingsSectionKey } from './project-settings-sections.js';
8
8
  *
9
9
  * These six sections used to live in the Settings overlay behind the
10
10
  * sidebar's gear icon, in its `Workspace` and `Agent` rail groups plus the
11
- * pinned Upgrades row and the `experimental` row. They configure a project, and
11
+ * `experimental` row. They configure a project, and
12
12
  * the person allowed to change them is already the person who can open
13
13
  * Customize — a second overlay with a second rail and a second keyboard
14
14
  * shortcut was one surface too many. The overlay keeps what is genuinely
@@ -14,8 +14,6 @@ import { SettingsSectionHeader } from '../../primitives/settings-section-header.
14
14
  import { Tabs, TabsList, TabsTrigger } from '../../primitives/tabs.js';
15
15
  import { SETTINGS_SIDEBAR_WIDTH_PX } from '../../internal/account-hub/account-settings-shell.js';
16
16
  import { useReviewSessionSummary } from '../../internal/hooks/use-review-session-summary.js';
17
- import { detectManifestVersion } from '../../internal/lib/manifest-version.js';
18
- import { UpgradesView } from '../migrate-to-v2/upgrade-view.js';
19
17
  import { GitView } from '../sections/view/git-view.js';
20
18
  import { ReviewView } from '../sections/view/review-view.js';
21
19
  import { ACCOUNT_GRADUATED, isAccountGraduatedSection, parseSettingsTab, } from '../settings/settings-tabs.js';
@@ -37,7 +35,7 @@ import { DEFAULT_PROJECT_SETTINGS_SECTION, parseProjectSettingsSection, projectS
37
35
  *
38
36
  * These six sections used to live in the Settings overlay behind the
39
37
  * sidebar's gear icon, in its `Workspace` and `Agent` rail groups plus the
40
- * pinned Upgrades row and the `experimental` row. They configure a project, and
38
+ * `experimental` row. They configure a project, and
41
39
  * the person allowed to change them is already the person who can open
42
40
  * Customize — a second overlay with a second rail and a second keyboard
43
41
  * shortcut was one surface too many. The overlay keeps what is genuinely
@@ -114,11 +112,6 @@ export function ProjectSettingsPage({ projectId }) {
114
112
  (sections.some((s) => s.key === DEFAULT_PROJECT_SETTINGS_SECTION)
115
113
  ? DEFAULT_PROJECT_SETTINGS_SECTION
116
114
  : (sections[0]?.key ?? DEFAULT_PROJECT_SETTINGS_SECTION));
117
- // Pin Upgrades' attention dot only once the manifest read resolved to v1 —
118
- // while the detail query is in flight (or on a v2 project) the dot stays off.
119
- const upgradeAttention = detail.data
120
- ? detectManifestVersion(detail.data.config.manifest_raw) === 1
121
- : false;
122
115
  // "Needs you" count for the Review row — the SAME shared inbox summary the
123
116
  // sidebar Review pill and the per-session dots read, so they cannot drift.
124
117
  const reviewNeedsYou = useReviewSessionSummary(projectId).totalNeedsYou;
@@ -134,7 +127,7 @@ export function ProjectSettingsPage({ projectId }) {
134
127
  navigateTo,
135
128
  }), [projectId, active, membersTab, project?.account_id, navigateTo]);
136
129
  const activeSection = sections.find((s) => s.key === active);
137
- const sectionTriggers = (horizontal) => sections.map((section) => (_jsx(SectionTrigger, { projectId: projectId, section: section, horizontal: horizontal, count: section.key === 'review' ? reviewNeedsYou : undefined, attention: section.key === 'upgrades' && upgradeAttention }, section.key)));
130
+ const sectionTriggers = (horizontal) => sections.map((section) => (_jsx(SectionTrigger, { projectId: projectId, section: section, horizontal: horizontal, count: section.key === 'review' ? reviewNeedsYou : undefined }, section.key)));
138
131
  return (_jsx(SettingsNavProvider, { value: settingsNav, children: _jsxs("div", { className: cn('min-h-0 flex-1', isMobile ? 'flex flex-col overflow-hidden' : 'grid overflow-hidden'),
139
132
  // The Preferences overlay's rail width (`settings-panel.tsx`), so the
140
133
  // two settings surfaces a person meets are one shape (Marko,
@@ -160,7 +153,7 @@ export function ProjectSettingsPage({ projectId }) {
160
153
  * `onValueChange` push: the section is URL state, so it has to be a link a
161
154
  * person can middle-click, copy, and land on directly.
162
155
  */
163
- function SectionTrigger({ projectId, section, count, attention, horizontal = false, }) {
156
+ function SectionTrigger({ projectId, section, count, horizontal = false, }) {
164
157
  const Icon = section.icon;
165
158
  const showCount = count != null && count > 0;
166
159
  return (_jsx(TabsTrigger, { value: section.key, asChild: true, size: horizontal ? undefined : 'md', className: horizontal
@@ -169,7 +162,7 @@ function SectionTrigger({ projectId, section, count, attention, horizontal = fal
169
162
  // The Preferences overlay's exact rail-row dialect
170
163
  // (`settings-panel.tsx`'s `TabsTrigger` in its aside), so the
171
164
  // two rails are one component in two places.
172
- 'gap-2 px-2.5 py-1 font-normal transition-none has-[>svg]:px-2.5', 'text-foreground data-[state=inactive]:text-foreground hover:bg-hover hover:text-foreground', 'data-[state=active]:bg-active data-[state=active]:font-medium', '[&_svg]:text-muted-foreground data-[state=active]:[&_svg]:text-foreground'), children: _jsxs(Link, { href: projectSettingsSectionHref(projectId, section.key), prefetch: true, children: [_jsx(Icon, { className: "size-4 shrink-0" }), _jsx("span", { className: cn(!horizontal && 'truncate'), children: section.label }), showCount ? (_jsx(CountBadge, { count: count, className: cn(!horizontal && 'ml-auto') })) : attention ? (_jsx("span", { "aria-hidden": true, className: cn('bg-kortix-orange size-1.5 shrink-0 rounded-full', !horizontal && 'ml-auto') })) : null] }) }));
165
+ 'gap-2 px-2.5 py-1 font-normal transition-none has-[>svg]:px-2.5', 'text-foreground data-[state=inactive]:text-foreground hover:bg-hover hover:text-foreground', 'data-[state=active]:bg-active data-[state=active]:font-medium', '[&_svg]:text-muted-foreground data-[state=active]:[&_svg]:text-foreground'), children: _jsxs(Link, { href: projectSettingsSectionHref(projectId, section.key), prefetch: true, children: [_jsx(Icon, { className: "size-4 shrink-0" }), _jsx("span", { className: cn(!horizontal && 'truncate'), children: section.label }), showCount ? (_jsx(CountBadge, { count: count, className: cn(!horizontal && 'ml-auto') })) : null] }) }));
173
166
  }
174
167
  /**
175
168
  * The pane for the active section. Every component is mounted exactly as the
@@ -193,8 +186,6 @@ function ProjectSettingsSectionPane({ sectionKey, projectId, }) {
193
186
  return _jsx(ReviewView, { projectId: projectId });
194
187
  case 'feature-flags':
195
188
  return _jsx(ExperimentalTab, { projectId: projectId });
196
- case 'upgrades':
197
- return _jsx(UpgradesView, { projectId: projectId });
198
189
  }
199
190
  }
200
191
  /**
@@ -7,7 +7,7 @@ import type { CustomizeSection } from '../../internal/lib/project-actions.js';
7
7
  *
8
8
  * These six sections used to be part of the `Workspace` and `Agent` groups of
9
9
  * the Settings overlay's rail (`packages/ui/src/customize/settings/rail.ts`), plus
10
- * its pinned Upgrades row and its `experimental` row. All of them configure a
10
+ * its `experimental` row. All of them configure a
11
11
  * PROJECT, and every one of them is reachable by exactly the people who can
12
12
  * already see Customize — so they belong on the Customize bar, not behind a
13
13
  * separate gear icon with a separate rail. The overlay keeps only what is
@@ -33,11 +33,11 @@ import type { CustomizeSection } from '../../internal/lib/project-actions.js';
33
33
  * which is what the pane is called everywhere else in the codebase (it is
34
34
  * already the `CustomizeSection` id, see `packages/ui/src/internal/lib/project-actions.ts`).
35
35
  *
36
- * A `key` IS its `?section=` query value, so renaming one breaks live links.
36
+ * A `key` IS its Project admin segment (`/admin/<key>`), so renaming one breaks live links.
37
37
  * `settings-tabs.ts`'s `GRADUATED` map points every retired `SettingsTab` id
38
38
  * at the key below that replaced it.
39
39
  */
40
- export type ProjectSettingsSectionKey = 'general' | 'git' | 'sandbox' | 'review' | 'feature-flags' | 'upgrades';
40
+ export type ProjectSettingsSectionKey = 'general' | 'git' | 'sandbox' | 'review' | 'feature-flags';
41
41
  /**
42
42
  * **One flat list, no headings.** The sub-nav used to carry the rail's three
43
43
  * group labels — `Workspace`, `Agent`, `Advanced` — over six to eight rows.
@@ -64,7 +64,7 @@ export interface ProjectSettingsSection {
64
64
  gate: CustomizeSection;
65
65
  }
66
66
  /**
67
- * The sub-nav: the static sections, then Feature flags and Upgrades. No row is
67
+ * The sub-nav: the static sections, then Feature flags. No row is
68
68
  * flag-gated any more. Marketplace and Voice were removed from the product;
69
69
  * Review is a capability tab of its own and graduated out of the flag system.
70
70
  */
@@ -78,7 +78,7 @@ export declare const ALL_PROJECT_SETTINGS_SECTIONS: readonly ProjectSettingsSect
78
78
  */
79
79
  export declare const DEFAULT_PROJECT_SETTINGS_SECTION: ProjectSettingsSectionKey;
80
80
  export declare function parseProjectSettingsSection(raw: string | null | undefined): ProjectSettingsSectionKey | null;
81
- /** The canonical link to one section. The default section carries no query. */
81
+ /** The canonical link to one section: its Project admin page, `/admin/<key>`. Review is its own page. */
82
82
  export declare function projectSettingsSectionHref(projectId: string, key: ProjectSettingsSectionKey): string;
83
83
  /** The copy for one section, independent of any flag — used by pane headings. */
84
84
  export declare function projectSettingsSection(key: ProjectSettingsSectionKey): ProjectSettingsSection | undefined;
@@ -1,5 +1,6 @@
1
- import { ArrowCircleUpIcon as ArrowUpCircle, ShippingContainerIcon as Container, FlaskIcon as Flask, GitBranchIcon as GitBranch, GearSixIcon as Settings, } from '@phosphor-icons/react';
1
+ import { ShippingContainerIcon as Container, FlaskIcon as Flask, GitBranchIcon as GitBranch, GearSixIcon as Settings, } from '@phosphor-icons/react';
2
2
  import { capabilityTabHref } from '../../internal/lib/capability-tab-routes.js';
3
+ import { adminPath } from '../../lib/routes.js';
3
4
  import { localizeUiCatalog } from '../../i18n/ui-catalog/localize-ui-catalog.js';
4
5
  import { REMAINING_UI_TRANSLATION_KEYS } from '../../i18n/ui-catalog/remaining-ui-translation-keys.generated.js';
5
6
  /** The sections every project shows, in sub-nav order. */
@@ -40,25 +41,12 @@ const FEATURE_FLAGS_SECTION = {
40
41
  description: 'Features you can switch on before they are generally available.',
41
42
  gate: 'feature-flags',
42
43
  };
43
- /**
44
- * Upgrades — the agent-driven codebase upgrade runner. Not billing: it opens a
45
- * change request against this workspace's own repo. It sat pinned at the
46
- * bottom of the old rail and keeps that position here, last in the list.
47
- */
48
- const UPGRADES_SECTION = {
49
- key: 'upgrades',
50
- label: 'Upgrades',
51
- description: 'Changes an agent makes to this workspace. Every run opens a change request for you to review — nothing merges on its own.',
52
- icon: ArrowUpCircle,
53
- gate: 'upgrade',
54
- };
55
44
  const PROJECT_SETTINGS_SOURCE = {
56
45
  staticSections: STATIC_SECTIONS,
57
46
  featureFlagsSection: FEATURE_FLAGS_SECTION,
58
- upgradesSection: UPGRADES_SECTION,
59
47
  };
60
48
  /**
61
- * The sub-nav: the static sections, then Feature flags and Upgrades. No row is
49
+ * The sub-nav: the static sections, then Feature flags. No row is
62
50
  * flag-gated any more. Marketplace and Voice were removed from the product;
63
51
  * Review is a capability tab of its own and graduated out of the flag system.
64
52
  */
@@ -70,7 +58,7 @@ export function projectSettingsSections(tI18nComplete) {
70
58
  // Review is NOT a section here any more: it is a capability tab of its own
71
59
  // (`capability-tab-routes.ts`, 2026-09-02). Listing it twice — as a tab and
72
60
  // as a Settings section — was the leftover of restoring this page.
73
- sections.push(source.featureFlagsSection, source.upgradesSection);
61
+ sections.push(source.featureFlagsSection);
74
62
  return sections;
75
63
  }
76
64
  /** Every section — for copy lookups and tests. */
@@ -87,11 +75,9 @@ export function parseProjectSettingsSection(raw) {
87
75
  const hit = ALL_PROJECT_SETTINGS_SECTIONS.find((s) => s.key === raw);
88
76
  return hit ? hit.key : null;
89
77
  }
90
- /** The canonical link to one section. The default section carries no query. */
78
+ /** The canonical link to one section: its Project admin page, `/admin/<key>`. Review is its own page. */
91
79
  export function projectSettingsSectionHref(projectId, key) {
92
- return key === DEFAULT_PROJECT_SETTINGS_SECTION
93
- ? capabilityTabHref(projectId, 'config')
94
- : `${capabilityTabHref(projectId, 'config')}?section=${key}`;
80
+ return key === 'review' ? capabilityTabHref(projectId, 'review') : adminPath(projectId, key);
95
81
  }
96
82
  /** The copy for one section, independent of any flag — used by pane headings. */
97
83
  export function projectSettingsSection(key) {
@@ -37,7 +37,7 @@ import { errorToast, successToast } from '../../primitives/toast.js';
37
37
  import { EmptyState } from '../../primitives/empty-state.js';
38
38
  import { ErrorState } from '../../primitives/error-state.js';
39
39
  import { FIRST_CLASS_PROVIDER_IDS, PROVIDER_PAGE_SIZE, ProviderLogoStatus, connectedVia, providerMethod, supportsPooledProviderKey, useManagedProvider, usePooledProviderIds, useProviderMeta, } from './provider-connect.js';
40
- import { DeviceCode, ProviderKeyForm, RemoveKeyDialog, SUBSCRIPTION_BY_PROVIDER, useProviderKey, } from './provider-sheet.js';
40
+ import { ClaudeCodeStep, DeviceCode, ProviderKeyForm, RemoveKeyDialog, SUBSCRIPTION_BY_PROVIDER, useProviderKey, } from './provider-sheet.js';
41
41
  import { ChatGptSubscriptionConnect, useSubscriptionSignIn, } from '../sections/llm-provider/chatgpt-subscription-connect.js';
42
42
  import { useConnectedProviders } from '../sections/llm-provider/use-connected-providers.js';
43
43
  import { useLiveLlmProviderCatalog, useLlmProviderCatalogRevision, } from '../sections/llm-provider/use-live-catalog.js';
@@ -142,24 +142,30 @@ function SignInSubRows({ projectId, entry, canWrite, }) {
142
142
  const sign = useSubscriptionSignIn({ projectId, kind: sub.kind, onConnected: () => undefined });
143
143
  const [confirmDisconnect, setConfirmDisconnect] = useState(false);
144
144
  const waiting = sign.phase === 'waiting';
145
+ // A Claude login is the member's own: any member signs in. A shared login needs write access.
146
+ const canSignIn = canWrite || sign.pastesCode;
145
147
  const copyCode = () => {
146
148
  if (!sign.challenge?.code)
147
149
  return;
148
150
  void navigator.clipboard?.writeText(sign.challenge.code).then(() => successToast(t('codeCopied')));
149
151
  };
150
- return (_jsxs(_Fragment, { children: [_jsx(AccordionSubRow, { action: !canWrite ? null : waiting ? (_jsx(Button, { type: "button", size: "xs", variant: "ghost", onClick: sign.cancel, children: t('cancel') })) : sign.connected ? (_jsx(Button, { type: "button", size: "xs", variant: "ghost", className: "text-muted-foreground", disabled: sign.disconnect.isPending, onClick: () => setConfirmDisconnect(true), children: t('disconnect') })) : (_jsx(Button, { type: "button", size: "xs", variant: "secondary", onClick: () => void sign.start(), children: t('signInTitle', { name: sub.name }) })), children: sign.connected
152
+ return (_jsxs(_Fragment, { children: [_jsx(AccordionSubRow, { action: !canSignIn ? null : waiting ? (_jsx(Button, { type: "button", size: "xs", variant: "ghost", onClick: sign.cancel, children: t('cancel') })) : sign.connected ? (_jsx(Button, { type: "button", size: "xs", variant: "ghost", className: "text-muted-foreground", disabled: sign.disconnect.isPending, onClick: () => setConfirmDisconnect(true), children: t('disconnect') })) : (_jsx(Button, { type: "button", size: "xs", variant: "secondary", onClick: () => void sign.start(), children: t('signInTitle', { name: sub.name }) })), children: sign.connected
151
153
  ? `${t('subscription', { plan: sub.plan })} · ${t('signedIn')}`
152
154
  : waiting
153
155
  ? t('signingIn', { name: sub.name })
154
- : `${t('subscription', { plan: sub.plan })} · ${t('notConnected')}` }), waiting ? (_jsx("div", { className: "border-border border-t py-3", children: _jsx(DeviceCode, { name: sub.name, code: sign.challenge?.code ?? null, url: sign.challenge?.url ?? null, onCopy: copyCode }) })) : null, sign.error ? (_jsx("p", { role: "alert", className: "text-destructive pb-1.5 text-xs text-pretty", children: sign.error })) : null, _jsx(AlertDialog, { open: confirmDisconnect, onOpenChange: setConfirmDisconnect, children: _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: t('disconnectTitle', { plan: sub.plan }) }), _jsx(AlertDialogDescription, { children: t('disconnectBody') })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { children: t('cancel') }), _jsx(AlertDialogAction, { variant: "destructive", disabled: sign.disconnect.isPending, onClick: () => sign.disconnect.mutate(), children: t('disconnect') })] })] }) })] }));
156
+ : `${t('subscription', { plan: sub.plan })} · ${t('notConnected')}` }), waiting && sign.pastesCode ? (_jsx("div", { className: "border-border border-t py-3", children: _jsx(ClaudeCodeStep, { url: sign.challenge?.url ?? null, checking: sign.checking, onSubmit: (code) => void sign.submitCode(code) }) })) : waiting ? (_jsx("div", { className: "border-border border-t py-3", children: _jsx(DeviceCode, { name: sub.name, code: sign.challenge?.code ?? null, url: sign.challenge?.url ?? null, onCopy: copyCode }) })) : null, sign.error ? (_jsx("p", { role: "alert", className: "text-destructive pb-1.5 text-xs text-pretty", children: sign.error })) : null, _jsx(AlertDialog, { open: confirmDisconnect, onOpenChange: setConfirmDisconnect, children: _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: t('disconnectTitle', { plan: sub.plan }) }), _jsx(AlertDialogDescription, { children: t('disconnectBody') })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { children: t('cancel') }), _jsx(AlertDialogAction, { variant: "destructive", disabled: sign.disconnect.isPending, onClick: () => sign.disconnect.mutate(), children: t('disconnect') })] })] }) })] }));
155
157
  }
156
- /** Opens the plan dialog. Nothing when billing is off: no plan to sell. */
157
- function ManagedUpgradeButton({ projectId }) {
158
+ /**
159
+ * Kortix with no servable model, as one static row: the logo, one line and
160
+ * Upgrade in the place of the chevron. Nothing to expand, so it says its line
161
+ * once. The caller renders it only where billing sells a plan: a self-hosted
162
+ * deployment has no Kortix-managed models, so the row would be a dead end.
163
+ */
164
+ function ManagedUpgradeRow({ projectId, row }) {
158
165
  const t = useTranslations('sessionUi.modelGate');
159
- const { openUpgrade, showUpgradeOption } = useModelConnectionGate(undefined, { projectId });
160
- if (!showUpgradeOption)
161
- return null;
162
- return (_jsxs(Button, { type: "button", size: "xs", className: "shrink-0", onClick: openUpgrade, children: [_jsx(CreditCardIcon, { className: "size-3.5 shrink-0" }), t('upgrade')] }));
166
+ const tAccess = useTranslations('modelAccess');
167
+ const { openUpgrade } = useModelConnectionGate(undefined, { projectId });
168
+ return (_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(ProviderLogoStatus, { providerId: row.id, label: row.label, status: row.status, size: "medium" }), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsx("span", { className: "text-foreground block truncate text-sm font-medium", children: row.label }), _jsx("span", { className: "text-muted-foreground block truncate text-xs", children: tAccess('managedRowHint') })] }), _jsxs(Button, { type: "button", size: "xs", className: "shrink-0", onClick: openUpgrade, children: [_jsx(CreditCardIcon, { className: "size-3.5 shrink-0" }), t('upgrade')] })] }));
163
169
  }
164
170
  /** What an open card holds, by how the provider connects. */
165
171
  function ExpandedBody({ projectId, entry, status, keyConnected, canWrite, enabled, pooled, }) {
@@ -170,19 +176,17 @@ function ExpandedBody({ projectId, entry, status, keyConnected, canWrite, enable
170
176
  const enable = status !== 'none' ? (_jsx(EnableSubRow, { projectId: projectId, entry: entry, canWrite: canWrite, enabled: enabled })) : null;
171
177
  let content;
172
178
  if (method === 'included' || (entry.envVars.length === 0 && !SUBSCRIPTION_BY_PROVIDER[entry.id])) {
173
- content = (_jsx(AccordionSubRow
174
- // Kortix with no servable model is the upgrade story: the row says so,
175
- // so it carries the way out too.
176
- , {
177
- // Kortix with no servable model is the upgrade story: the row says so,
178
- // so it carries the way out too.
179
- action: entry.managed && entry.models.length === 0 ? _jsx(ManagedUpgradeButton, { projectId: projectId }) : null, children: entry.hint }));
179
+ content = (_jsx(AccordionSubRow, { children: entry.hint }));
180
180
  }
181
181
  else if (pooled.pooledSecretsEnabled && pooled.accountId && entry.id === 'openai') {
182
182
  content = (_jsxs("div", { className: "border-border space-y-3 border-t py-3", children: [_jsx("p", { className: "text-foreground text-xs font-medium", children: tPooled('chatGptAccounts') }), _jsx(AccountSecretResourcesPanel, { accountId: pooled.accountId, projectId: projectId, providerId: "codex", providerName: "ChatGPT Plus/Pro", envVar: "CODEX_AUTH_JSON", canWrite: true, oauth: { projectId, onConnected: () => undefined } }), _jsx(ChatGptSubscriptionConnect, { projectId: projectId, onConnected: () => undefined, legacyOnly: true })] }));
183
183
  }
184
+ else if (pooled.pooledSecretsEnabled && pooled.accountId && entry.id === 'anthropic') {
185
+ // Claude accounts, exactly as OpenAI lists ChatGPT accounts; Anthropic API keys below them.
186
+ content = (_jsxs(_Fragment, { children: [_jsxs("div", { className: "border-border space-y-3 border-t py-3", children: [_jsx("p", { className: "text-foreground text-xs font-medium", children: tPooled('claudeAccounts') }), _jsx(AccountSecretResourcesPanel, { accountId: pooled.accountId, projectId: projectId, providerId: "claude-agent", providerName: "Claude Pro/Max", envVar: "CLAUDE_CODE_OAUTH_TOKEN", canWrite: true, oauth: { projectId, onConnected: () => undefined, kind: 'claude' } })] }), _jsx("div", { className: "border-border border-t py-3", children: _jsx(AccountSecretResourcesPanel, { accountId: pooled.accountId, projectId: projectId, providerId: entry.id, providerName: entry.label, envVar: entry.envVars[0], canWrite: true }) })] }));
187
+ }
184
188
  else if (pooled.pooledSecretsEnabled && pooled.accountId && supportsPooledProviderKey(entry)) {
185
- content = (_jsx("div", { className: "border-border border-t py-3", children: _jsx(AccountSecretResourcesPanel, { accountId: pooled.accountId, projectId: projectId, providerId: entry.id, providerName: entry.label, envVar: entry.envVars[0], canWrite: true }) }));
189
+ content = (_jsxs(_Fragment, { children: [SUBSCRIPTION_BY_PROVIDER[entry.id] ? _jsx(SignInSubRows, { projectId: projectId, entry: entry, canWrite: canWrite }) : null, _jsx("div", { className: "border-border border-t py-3", children: _jsx(AccountSecretResourcesPanel, { accountId: pooled.accountId, projectId: projectId, providerId: entry.id, providerName: entry.label, envVar: entry.envVars[0], canWrite: true }) })] }));
186
190
  }
187
191
  else if (SUBSCRIPTION_BY_PROVIDER[entry.id]) {
188
192
  content = (_jsxs(_Fragment, { children: [_jsx(SignInSubRows, { projectId: projectId, entry: entry, canWrite: canWrite }), _jsx(KeySubRow, { projectId: projectId, entry: entry, saved: keyConnected, canWrite: canWrite })] }));
@@ -208,6 +212,9 @@ export function ProviderAccordion({ projectId, canWrite = false, enabled = true,
208
212
  const meta = useProviderMeta();
209
213
  const access = useModelAccess(enabled ? projectId : null);
210
214
  const managedProvider = useManagedProvider(enabled ? projectId : null);
215
+ // Where billing sells no plan (a self-hosted deployment) Kortix-managed
216
+ // models do not exist, so the managed row with no models is left out.
217
+ const { showUpgradeOption } = useModelConnectionGate(undefined, { projectId });
211
218
  const pooled = usePooledProviderIds(projectId, enabled);
212
219
  useLiveLlmProviderCatalog(projectId, enabled);
213
220
  const catalogRevision = useLlmProviderCatalogRevision();
@@ -278,6 +285,11 @@ export function ProviderAccordion({ projectId, canWrite = false, enabled = true,
278
285
  if (addingId === row.id && singleKey && canWrite) {
279
286
  return (_jsx(InlineAddKeyRow, { projectId: projectId, entry: entry, row: row, onDone: () => setAddingId(null) }, row.id));
280
287
  }
288
+ if (entry.managed && entry.models.length === 0) {
289
+ if (!showUpgradeOption)
290
+ return null;
291
+ return (_jsx(AccordionRowFrame, { expanded: false, children: _jsx("div", { className: "px-3.5 py-2.5", children: _jsx(ManagedUpgradeRow, { projectId: projectId, row: row }) }) }, row.id));
292
+ }
281
293
  const expanded = expandedId === row.id;
282
294
  // AK01: an available single-key row has nothing to show when opened
283
295
  // except a field — so it goes straight to the field.
@@ -44,7 +44,7 @@ import { useQuery } from '@tanstack/react-query';
44
44
  */
45
45
  export const FIRST_CLASS_PROVIDER_IDS = ['anthropic', 'openai', 'google'];
46
46
  /** Providers whose sheet offers a subscription sign-in beside the API key. */
47
- export const SUBSCRIPTION_PROVIDER_IDS = new Set(['openai', 'opencode-go']);
47
+ export const SUBSCRIPTION_PROVIDER_IDS = new Set(['openai', 'opencode-go', 'anthropic']);
48
48
  /**
49
49
  * How many Available providers render before `Show more`, and how many each
50
50
  * press adds. A query is a request for its matches — all of them — so a search
@@ -1,3 +1,5 @@
1
+ import { ClaudeCodeStep } from '../sections/llm-provider/claude-code-step.js';
2
+ export { ClaudeCodeStep };
1
3
  import { type SubscriptionKind } from '../sections/llm-provider/chatgpt-subscription-connect.js';
2
4
  import { type LlmProviderEntry, type LlmProviderModel } from '../../internal/lib/llm-providers.js';
3
5
  /** The subscription each two-way provider signs in with, and how it is named. */
@@ -51,7 +53,8 @@ export declare function ConnectChoice({ name, plan, providerLabel, onSignIn, onU
51
53
  plan: string;
52
54
  providerLabel: string;
53
55
  onSignIn: () => void;
54
- onUseKey: () => void;
56
+ /** Absent: the viewer can only sign in (a Claude login is the member's own; a key is a project secret). */
57
+ onUseKey?: () => void;
55
58
  }): import("react").JSX.Element;
56
59
  /** The device-grant step: the code, where to enter it, and that we are waiting. */
57
60
  export declare function DeviceCode({ name, code, url, onCopy, }: {