@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
@@ -0,0 +1,86 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { adminPath } from '../../lib/routes.js';
4
+ import { useProjectConfig } from '@kortix/sdk/react';
5
+ import { CpuIcon, GearSixIcon, ListIcon, TrayIcon } from '@phosphor-icons/react';
6
+ import { createContext, useContext } from 'react';
7
+ import { useTranslations as useI18nTranslations } from '../../i18n/index.js';
8
+ import { AgentMark, agentDisplayName } from '../components/agent-mark.js';
9
+ import { CountBadge } from '../../primitives/count-badge.js';
10
+ import { cn } from '../../lib/utils.js';
11
+ import { SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, useSidebar, } from '../../primitives/sidebar.js';
12
+ import { UiLink as Link, useUiPathname } from '../../providers/ui-provider.js';
13
+ import { useIsMobile } from '../hooks/index.js';
14
+ import { activeCapabilityTab, agentHref, capabilityTabHref } from '../lib/capability-tab-routes.js';
15
+ import { useReviewSessionSummary } from '../hooks/use-review-session-summary.js';
16
+ import { usePinnedAgents } from '../stores/pinned-agents-store.js';
17
+ import { useCapabilityAccess } from './project-settings-nav.js';
18
+ /** Customize lists this many agents when none is pinned; All agents holds the rest. */
19
+ const SIDEBAR_AGENT_LIMIT = 5;
20
+ export const NewAgentContext = createContext(null);
21
+ /** Opens the New agent modal mounted beside the sidebar; null outside `NewAgentModalProvider`. */
22
+ export function useOpenNewAgent() {
23
+ return useContext(NewAgentContext);
24
+ }
25
+ /** Every agent by display name, hidden agents last. */
26
+ export function sortCustomizeAgents(agents) {
27
+ return [...agents].sort((a, b) => {
28
+ const hidden = Number(a.hidden === true) - Number(b.hidden === true);
29
+ return hidden || agentDisplayName(a.name).localeCompare(agentDisplayName(b.name));
30
+ });
31
+ }
32
+ /** Whether the pathname is a Project admin (Settings) page. The locale prefix
33
+ * the host may not strip is tolerated. */
34
+ export function isProjectAdminPath(pathname) {
35
+ return !!pathname && /\/projects\/[^/]+\/admin(?:[/?#]|$)/.test(pathname);
36
+ }
37
+ /** A row's glyph in a 20px box (literal px, as the sidebar's agent marks), so
38
+ * every label starts on one column. */
39
+ function RowGlyph({ children }) {
40
+ return (_jsx("span", { "aria-hidden": true, className: "text-muted-foreground flex shrink-0 items-center justify-center", style: { width: 20, height: 20 }, children: children }));
41
+ }
42
+ /**
43
+ * What Customize opens to, kept short on purpose: most configuration happens
44
+ * by asking an agent in a session, so the sidebar lists only the agents you
45
+ * pinned (none pinned: the first five) and All agents when more exist, then Review (with its "needs you" count), Models, and Settings
46
+ * (Project admin, whose top bar holds every library and Members).
47
+ * The header's + and All agents buttons sit on the Customize row itself.
48
+ */
49
+ export function ProjectCapabilityNav({ projectId }) {
50
+ const pathname = useUiPathname();
51
+ const config = useProjectConfig(projectId);
52
+ const access = useCapabilityAccess(projectId);
53
+ const needsYou = useReviewSessionSummary(projectId, { enabled: true }).totalNeedsYou;
54
+ const isMobile = useIsMobile();
55
+ const { setOpenMobile } = useSidebar();
56
+ const tTabs = useI18nTranslations('agentEditor.tabs');
57
+ const pinned = usePinnedAgents(projectId);
58
+ if (!access.settled)
59
+ return null;
60
+ const allAgents = access.tabs.includes('agent')
61
+ ? sortCustomizeAgents((config?.agents ?? []).filter((agent) => !agent.platform))
62
+ : [];
63
+ // The agents you pinned, in pin order; none pinned, the first few. A
64
+ // project with a hundred agents keeps a short sidebar either way.
65
+ const pinnedAgents = pinned.flatMap((name) => allAgents.filter((agent) => agent.name === name));
66
+ const agents = pinnedAgents.length > 0 ? pinnedAgents : allAgents.slice(0, SIDEBAR_AGENT_LIMIT);
67
+ const moreAgents = allAgents.length > agents.length;
68
+ const showReview = access.tabs.includes('review');
69
+ const onReview = pathname ? activeCapabilityTab(pathname) === 'review' : false;
70
+ const hasModels = access.tabs.includes('models');
71
+ const onModels = !!pathname && /\/admin\/models(\/|$)/.test(pathname);
72
+ const hasSettings = access.tabs.includes('config');
73
+ const close = () => {
74
+ if (isMobile)
75
+ setOpenMobile(false);
76
+ };
77
+ if (agents.length === 0 && !showReview && !hasModels && !hasSettings)
78
+ return null;
79
+ // `mr-0 pr-0`: the rows reach the sidebar's right edge like the rows above;
80
+ // the left indent and guide line stay.
81
+ return (_jsxs(SidebarMenuSub, { className: "mr-0 pr-0", children: [agents.map((agent) => {
82
+ const href = agentHref(projectId, agent.name);
83
+ const active = !!pathname && (pathname === href || pathname.startsWith(`${href}/`));
84
+ return (_jsx(SidebarMenuSubItem, { children: _jsx(SidebarMenuSubButton, { asChild: true, isActive: active, children: _jsxs(Link, { href: href, prefetch: false, onClick: close, children: [_jsx(RowGlyph, { children: _jsx(AgentMark, { slug: agent.name, size: 14 }) }), _jsx("span", { className: cn('truncate', agent.hidden && 'text-muted-foreground'), children: agentDisplayName(agent.name) })] }) }) }, agent.name));
85
+ }), moreAgents ? (_jsx(SidebarMenuSubItem, { children: _jsx(SidebarMenuSubButton, { asChild: true, isActive: !!pathname && pathname.endsWith('/customize/agents'), children: _jsxs(Link, { href: capabilityTabHref(projectId, 'agent'), prefetch: false, onClick: close, children: [_jsx(RowGlyph, { children: _jsx(ListIcon, { className: "size-3.5" }) }), _jsx("span", { className: "truncate", children: tTabs('allAgents') }), _jsx("span", { className: "text-muted-foreground ml-auto shrink-0 text-xs tabular-nums", children: allAgents.length })] }) }) })) : null, showReview ? (_jsx(SidebarMenuSubItem, { children: _jsx(SidebarMenuSubButton, { asChild: true, isActive: onReview, children: _jsxs(Link, { href: capabilityTabHref(projectId, 'review'), prefetch: false, onClick: close, children: [_jsx(RowGlyph, { children: _jsx(TrayIcon, { className: "size-3.5" }) }), _jsx("span", { className: "truncate", children: tTabs('review') }), needsYou > 0 ? (_jsx("span", { className: "ml-auto flex shrink-0 items-center", children: _jsx(CountBadge, { count: needsYou, tone: "waiting" }) })) : null] }) }) })) : null, hasModels ? (_jsx(SidebarMenuSubItem, { children: _jsx(SidebarMenuSubButton, { asChild: true, isActive: onModels, children: _jsxs(Link, { href: adminPath(projectId, 'models'), prefetch: false, onClick: close, children: [_jsx(RowGlyph, { children: _jsx(CpuIcon, { className: "size-3.5" }) }), _jsx("span", { className: "truncate", children: tTabs('models') })] }) }) })) : null, hasSettings ? (_jsx(SidebarMenuSubItem, { children: _jsx(SidebarMenuSubButton, { asChild: true, isActive: isProjectAdminPath(pathname) && !onModels, children: _jsxs(Link, { href: adminPath(projectId, 'general'), prefetch: false, onClick: close, children: [_jsx(RowGlyph, { children: _jsx(GearSixIcon, { className: "size-3.5" }) }), _jsx("span", { className: "truncate", children: tTabs('settings') })] }) }) })) : null] }));
86
+ }
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * The header of a standalone project page (Files, Apps):
4
4
  * the sidebar toggle, then the page title as the page's `<h1>`. It uses the
5
- * same title-bar classes as the Customize tab bar (`CapabilityTabs`), so it
5
+ * same title-bar classes as the agent identity header (`agent-page-chrome.tsx`), so it
6
6
  * has the same height and clears the desktop window controls the same way.
7
7
  * A page has one view, so the title is plain text, not a one-tab underline
8
8
  * bar. `titleAccessory` sits right after the title (a docs link). `children`
@@ -5,7 +5,7 @@ import { SidebarToggle } from './sidebar-toggle.js';
5
5
  /**
6
6
  * The header of a standalone project page (Files, Apps):
7
7
  * the sidebar toggle, then the page title as the page's `<h1>`. It uses the
8
- * same title-bar classes as the Customize tab bar (`CapabilityTabs`), so it
8
+ * same title-bar classes as the agent identity header (`agent-page-chrome.tsx`), so it
9
9
  * has the same height and clears the desktop window controls the same way.
10
10
  * A page has one view, so the title is plain text, not a one-tab underline
11
11
  * bar. `titleAccessory` sits right after the title (a docs link). `children`
@@ -5,8 +5,9 @@ import { type CanResult } from '../lib/use-project-can.js';
5
5
  /**
6
6
  * The one project-configuration entry in the sidebar:
7
7
  * ProjectCustomizeNavItem, top of the panel under New session, navigating to
8
- * the capability pages (Models / Connectors / Agents / Skills / Triggers /
9
- * Reminders / Secrets / Settings). Gated, because those pages can 403.
8
+ * the capability pages (Agents, Repo, Review, Settings — the libraries Skills /
9
+ * Connectors / Triggers / Reminders / Models / Secrets moved to `/admin`,
10
+ * `ADMIN_MANAGED_TABS`). Gated, because those pages can 403.
10
11
  *
11
12
  * The bottom-of-footer "Settings" row that used to sit beside it is gone
12
13
  * (Jay, 2026-08-17): it opened the same User Settings overlay a click on the
@@ -41,8 +41,9 @@ const TAB_ICONS = {
41
41
  /**
42
42
  * The one project-configuration entry in the sidebar:
43
43
  * ProjectCustomizeNavItem, top of the panel under New session, navigating to
44
- * the capability pages (Models / Connectors / Agents / Skills / Triggers /
45
- * Reminders / Secrets / Settings). Gated, because those pages can 403.
44
+ * the capability pages (Agents, Repo, Review, Settings — the libraries Skills /
45
+ * Connectors / Triggers / Reminders / Models / Secrets moved to `/admin`,
46
+ * `ADMIN_MANAGED_TABS`). Gated, because those pages can 403.
46
47
  *
47
48
  * The bottom-of-footer "Settings" row that used to sit beside it is gone
48
49
  * (Jay, 2026-08-17): it opened the same User Settings overlay a click on the
@@ -138,7 +139,7 @@ export const TAB_PREFERENCE = [
138
139
  action: PROJECT_ACTIONS.PROJECT_REVIEW_READ,
139
140
  manage: [PROJECT_ACTIONS.PROJECT_REVIEW_ACT],
140
141
  },
141
- // Settings (`/projects/<id>/customize/settings`) is configuration by
142
+ // Settings (`/projects/<id>/admin/general`) is configuration by
142
143
  // definition: its read leaf is already a write leaf.
143
144
  { key: 'config', action: PROJECT_ACTIONS.PROJECT_SETTINGS_WRITE },
144
145
  ];
@@ -222,6 +223,7 @@ export function ProjectCustomizeNavItem({ projectId }) {
222
223
  // redirects) AND on any capability tab — the row stays lit while browsing
223
224
  // Connectors or one agent's page, not just on the landing tab.
224
225
  const isActive = !!pathname &&
226
+ pathname.includes('/customize') &&
225
227
  (pathname === customizePath(projectId) || activeCapabilityTab(pathname) !== null);
226
228
  const card = useNavHoverCard({ enabled: !!tab && !!projectId });
227
229
  if (!tab)
@@ -555,7 +555,7 @@ export function isUndefinedVariableThirdPartyNoise(input) {
555
555
  // (Kortix Frontend prod, application_id 2346967, KRTX-2393): `TypeError`,
556
556
  // 39 occurrences / 0 identified users, ALL on 2026-10-14 17:05:37–17:05:39
557
557
  // UTC in ONE session (Firefox 140.0, Linux x86_64, release `1ecba158…`,
558
- // turbopack), on `/projects/<project_id>/customize/connectors/<app>/<connec
558
+ // turbopack), on `/projects/<project_id>/admin/connectors/<app>/<connec
559
559
  // tor>?src=apps` (the connector detail page, Tools tab), mechanism
560
560
  // `auto.browser.global_handlers.onerror` (UNCAUGHT, `handled:false`). The
561
561
  // stack is the deciding evidence: the ONLY frame is the page DOCUMENT itself
@@ -86,6 +86,30 @@ export declare const CAPABILITY_TABS: readonly CapabilityTab[];
86
86
  * hairline seam after it, and it is the landing tab.
87
87
  */
88
88
  export declare const PRIMARY_TABS: readonly CapabilityTab['key'][];
89
+ /**
90
+ * The capability libraries that moved to the account-level `/admin` dashboard
91
+ * (Marko, 2026-10-24: authorization is per-agent, so Customize is agent-
92
+ * centric — you add a connector, skill, trigger, reminder, model or secret TO
93
+ * an agent, never standalone). Customize no longer lists these as tabs or
94
+ * sidebar rows. It keeps Agents (the primary surface), Repo, Review and
95
+ * Settings; what an agent draws on is configured per agent, on the agent's own
96
+ * page.
97
+ *
98
+ * Their standalone pages still RESOLVE by URL — `capabilityAccess()` keeps the
99
+ * keys, so `CapabilityAccessGate` renders them and the `/customize` redirect
100
+ * still works. Only the two nav surfaces (`CapabilityTabs`,
101
+ * `ProjectCapabilityNav`) drop them, through `customizeNavTabs`.
102
+ */
103
+ export declare const ADMIN_MANAGED_TABS: readonly CapabilityTab['key'][];
104
+ /** Tabs that moved INTO Settings (Marko, 2026-10-24): Repo lives in the
105
+ * Settings rail (Repositories). Review is NOT here — it is its own standalone
106
+ * row in the Customize sidebar (Marko, 2026-10-24). */
107
+ export declare const SETTINGS_MANAGED_TABS: readonly CapabilityTab['key'][];
108
+ /** The capability tabs Customize still lists, in bar order: the caller's
109
+ * allowed tabs minus the libraries that moved to `/admin` and the ones that
110
+ * moved into Settings. Customize is agent-centric, so the bar leads with
111
+ * Agents; the rest is configured per agent or under `/admin` / Settings. */
112
+ export declare function customizeNavTabs(tabs: readonly CapabilityTab['key'][]): CapabilityTab['key'][];
89
113
  /**
90
114
  * A tab's URL segment. Keys are stable identifiers used across the app
91
115
  * (`TAB_PREFERENCE`, the palette, tests); segments are what a person reads in
@@ -99,12 +123,19 @@ export declare const CAPABILITY_SEGMENT: Record<CapabilityTab['key'], string>;
99
123
  /** The root every capability tab hangs off (Marko, 2026-09-03: "always
100
124
  * /customize/agents, /customize/skills"). */
101
125
  export declare function customizeHref(projectId: string): string;
102
- /** The tab's URL: the host's `customize` route (`setUiRoutes`) with the tab segment. */
126
+ /**
127
+ * The libraries and settings that live in Project admin (`/projects/<id>/admin/<section>`),
128
+ * by Customize key. Customize keeps only Agents and Review; every other tab is
129
+ * one place, Project admin (Marko, 2026-10-27: "no duplications").
130
+ */
131
+ export declare const ADMIN_SECTION: Partial<Record<CapabilityTab['key'], string>>;
132
+ /** The tab's URL: its Project admin section, else the host's `customize` route. */
103
133
  export declare function capabilityTabHref(projectId: string, key: CapabilityTab['key']): string;
104
134
  /**
105
135
  * A link to a capability tab from outside the customize pages (sidebar, session
106
136
  * header, hover cards). Null when the host serves no customize pages
107
- * (`setUiRoutes({ customize: () => null })`): the caller hides the link.
137
+ * (`setUiRoutes({ customize: () => null })`, or `admin` for a Project admin
138
+ * section): the caller hides the link.
108
139
  * `capabilityTabHref` is the customize pages' own tab URL and never null.
109
140
  */
110
141
  export declare function capabilityLinkHref(projectId: string, key: CapabilityTab['key']): string | null;
@@ -146,7 +177,7 @@ export declare function channelsHref(projectId: string): string;
146
177
  * shapes this group owns: `agentHref`'s `/projects/<id>/customize/agents/<name>`,
147
178
  * which lights the Agents tab (an agent's page is the Agents tab, opened on
148
179
  * one agent), and the app and connector pages under
149
- * `/projects/<id>/customize/connectors`, which light Connectors.
180
+ * `/projects/<id>/admin/connectors`, which light Connectors.
150
181
  *
151
182
  * The shape check is load-bearing, not defensive tidying. This used to match on
152
183
  * the LAST segment alone, which was harmless while every key was unique to this
@@ -1,4 +1,4 @@
1
- import { customizePath, uiRoutes } from '../../lib/routes.js';
1
+ import { adminPath, customizePath, uiRoutes } from '../../lib/routes.js';
2
2
  /**
3
3
  * This array is the tab order, the sidebar order, and — via the first entry
4
4
  * the caller may read — the landing tab. `TAB_PREFERENCE` in
@@ -47,7 +47,7 @@ export const CAPABILITY_TABS = [
47
47
  { key: 'skills', label: 'Skills' },
48
48
  { key: 'connectors', label: 'Connectors' },
49
49
  { key: 'triggers', label: 'Triggers' },
50
- { key: 'reminders', label: 'Reminders' },
50
+ { key: 'reminders', label: 'Loops' },
51
51
  { key: 'models', label: 'Models' },
52
52
  { key: 'secrets', label: 'Secrets' },
53
53
  { key: 'files', label: 'Repo' },
@@ -61,6 +61,39 @@ export const CAPABILITY_TABS = [
61
61
  * hairline seam after it, and it is the landing tab.
62
62
  */
63
63
  export const PRIMARY_TABS = ['agent'];
64
+ /**
65
+ * The capability libraries that moved to the account-level `/admin` dashboard
66
+ * (Marko, 2026-10-24: authorization is per-agent, so Customize is agent-
67
+ * centric — you add a connector, skill, trigger, reminder, model or secret TO
68
+ * an agent, never standalone). Customize no longer lists these as tabs or
69
+ * sidebar rows. It keeps Agents (the primary surface), Repo, Review and
70
+ * Settings; what an agent draws on is configured per agent, on the agent's own
71
+ * page.
72
+ *
73
+ * Their standalone pages still RESOLVE by URL — `capabilityAccess()` keeps the
74
+ * keys, so `CapabilityAccessGate` renders them and the `/customize` redirect
75
+ * still works. Only the two nav surfaces (`CapabilityTabs`,
76
+ * `ProjectCapabilityNav`) drop them, through `customizeNavTabs`.
77
+ */
78
+ export const ADMIN_MANAGED_TABS = [
79
+ 'skills',
80
+ 'connectors',
81
+ 'triggers',
82
+ 'reminders',
83
+ 'models',
84
+ 'secrets',
85
+ ];
86
+ /** Tabs that moved INTO Settings (Marko, 2026-10-24): Repo lives in the
87
+ * Settings rail (Repositories). Review is NOT here — it is its own standalone
88
+ * row in the Customize sidebar (Marko, 2026-10-24). */
89
+ export const SETTINGS_MANAGED_TABS = ['files'];
90
+ /** The capability tabs Customize still lists, in bar order: the caller's
91
+ * allowed tabs minus the libraries that moved to `/admin` and the ones that
92
+ * moved into Settings. Customize is agent-centric, so the bar leads with
93
+ * Agents; the rest is configured per agent or under `/admin` / Settings. */
94
+ export function customizeNavTabs(tabs) {
95
+ return tabs.filter((key) => !ADMIN_MANAGED_TABS.includes(key) && !SETTINGS_MANAGED_TABS.includes(key));
96
+ }
64
97
  /**
65
98
  * A tab's URL segment. Keys are stable identifiers used across the app
66
99
  * (`TAB_PREFERENCE`, the palette, tests); segments are what a person reads in
@@ -87,18 +120,37 @@ export const CAPABILITY_SEGMENT = {
87
120
  export function customizeHref(projectId) {
88
121
  return customizePath(projectId);
89
122
  }
90
- /** The tab's URL: the host's `customize` route (`setUiRoutes`) with the tab segment. */
123
+ /**
124
+ * The libraries and settings that live in Project admin (`/projects/<id>/admin/<section>`),
125
+ * by Customize key. Customize keeps only Agents and Review; every other tab is
126
+ * one place, Project admin (Marko, 2026-10-27: "no duplications").
127
+ */
128
+ export const ADMIN_SECTION = {
129
+ skills: 'skills',
130
+ connectors: 'connectors',
131
+ triggers: 'triggers',
132
+ // Loops are triggers: one page since 2026-10-28.
133
+ reminders: 'triggers',
134
+ models: 'models',
135
+ secrets: 'secrets',
136
+ files: 'repo',
137
+ config: 'general',
138
+ };
139
+ /** The tab's URL: its Project admin section, else the host's `customize` route. */
91
140
  export function capabilityTabHref(projectId, key) {
92
- return customizePath(projectId, CAPABILITY_SEGMENT[key]);
141
+ const section = ADMIN_SECTION[key];
142
+ return section ? adminPath(projectId, section) : customizePath(projectId, CAPABILITY_SEGMENT[key]);
93
143
  }
94
144
  /**
95
145
  * A link to a capability tab from outside the customize pages (sidebar, session
96
146
  * header, hover cards). Null when the host serves no customize pages
97
- * (`setUiRoutes({ customize: () => null })`): the caller hides the link.
147
+ * (`setUiRoutes({ customize: () => null })`, or `admin` for a Project admin
148
+ * section): the caller hides the link.
98
149
  * `capabilityTabHref` is the customize pages' own tab URL and never null.
99
150
  */
100
151
  export function capabilityLinkHref(projectId, key) {
101
- return uiRoutes().customize(projectId, CAPABILITY_SEGMENT[key]);
152
+ const section = ADMIN_SECTION[key];
153
+ return section ? uiRoutes().admin(projectId, section) : uiRoutes().customize(projectId, CAPABILITY_SEGMENT[key]);
102
154
  }
103
155
  /**
104
156
  * The Review Center: the Customize Review tab, or null when the host serves no
@@ -146,7 +198,7 @@ export function channelsHref(projectId) {
146
198
  * shapes this group owns: `agentHref`'s `/projects/<id>/customize/agents/<name>`,
147
199
  * which lights the Agents tab (an agent's page is the Agents tab, opened on
148
200
  * one agent), and the app and connector pages under
149
- * `/projects/<id>/customize/connectors`, which light Connectors.
201
+ * `/projects/<id>/admin/connectors`, which light Connectors.
150
202
  *
151
203
  * The shape check is load-bearing, not defensive tidying. This used to match on
152
204
  * the LAST segment alone, which was harmless while every key was unique to this
@@ -158,7 +210,23 @@ export function channelsHref(projectId) {
158
210
  * `agent`, never on the last one.
159
211
  */
160
212
  export function activeCapabilityTab(pathname) {
161
- const segments = pathname.split('/').filter(Boolean);
213
+ const all = pathname.split('/').filter(Boolean);
214
+ // Tolerate a leading locale segment (`/en/projects/…`): anchor on `projects`
215
+ // wherever it sits, so the match works whether the host strips the locale or
216
+ // not. A project id is never the literal `projects`, so the first hit is the
217
+ // route segment.
218
+ const start = all.indexOf('projects');
219
+ if (start === -1)
220
+ return null;
221
+ const segments = all.slice(start);
222
+ // A Project admin library (`/admin/<section>`, and below Connectors an app
223
+ // or a connector page) is that tab.
224
+ if (segments[0] === 'projects' && segments[2] === 'admin' && segments.length >= 4) {
225
+ const key = Object.keys(ADMIN_SECTION).find((k) => ADMIN_SECTION[k] === segments[3]);
226
+ if (!key)
227
+ return null;
228
+ return segments.length === 4 || (key === 'connectors' && segments.length <= 6) ? key : null;
229
+ }
162
230
  if (segments[0] !== 'projects' || segments[2] !== 'customize')
163
231
  return null;
164
232
  if (segments.length === 5 && segments[3] === CAPABILITY_SEGMENT.agent)
@@ -0,0 +1,10 @@
1
+ /** @internal Kortix apps only. No semver: it may change in any release. */
2
+ /**
3
+ * The project's `manifest_health`, read from the `qk.project.detail(id)` query
4
+ * the rest of Customize already shares: no second request. `undefined` while
5
+ * the read is in flight, and from an API that does not serve the field yet.
6
+ * The server reads and validates `kortix.yaml`; a client never parses it to
7
+ * decide what state it is in.
8
+ */
9
+ import { type ProjectManifestHealth } from '@kortix/sdk';
10
+ export declare function useProjectManifestHealth(projectId: string): ProjectManifestHealth | undefined;
@@ -0,0 +1,20 @@
1
+ 'use client';
2
+ /**
3
+ * The project's `manifest_health`, read from the `qk.project.detail(id)` query
4
+ * the rest of Customize already shares: no second request. `undefined` while
5
+ * the read is in flight, and from an API that does not serve the field yet.
6
+ * The server reads and validates `kortix.yaml`; a client never parses it to
7
+ * decide what state it is in.
8
+ */
9
+ import { getProjectDetail } from '@kortix/sdk';
10
+ import { contract, qk } from '@kortix/sdk/react';
11
+ import { useQuery } from '@tanstack/react-query';
12
+ export function useProjectManifestHealth(projectId) {
13
+ return useQuery({
14
+ queryKey: qk.project.detail(projectId),
15
+ queryFn: () => getProjectDetail(projectId),
16
+ select: (detail) => detail.config?.manifest_health,
17
+ enabled: !!projectId,
18
+ ...contract('config'),
19
+ }).data;
20
+ }
@@ -26,8 +26,11 @@ export declare function fnv1a(input: string): number;
26
26
  /** Readable at 14px, fills the frame, one connected body. */
27
27
  export declare function passesPixelMarkGate(grid: Grid): boolean;
28
28
  export declare function pixelMark(slug: string): {
29
- grid: Grid;
29
+ grid: boolean[][];
30
30
  path: string;
31
+ ditherPath: string;
32
+ width: number;
33
+ height: number;
31
34
  tone: PixelMarkTone;
32
35
  };
33
36
  export {};
@@ -10,6 +10,7 @@
10
10
  * Changing SIZE, MASK, the gate or PALETTES changes every agent's mark — the
11
11
  * golden test in `pixel-mark.test.ts` exists to make that a deliberate act.
12
12
  */
13
+ import { PIXEL_KORTIX_ROWS } from '../../primitives/pixel-kortix-mark.js';
13
14
  export const PIXEL_MARK_SIZE = 7;
14
15
  const HALF = 4;
15
16
  const MAX_ATTEMPTS = 256;
@@ -41,7 +42,7 @@ export const PIXEL_MARK_TONES = [
41
42
  tone('clay', '#F3E6E0', '#7A4532'),
42
43
  tone('slate', '#E4E7EC', '#3B4656'),
43
44
  ];
44
- /** The built-in agent and the platform's Meta agent keep the brand tile. */
45
+ /** The starter's `kortix` agent and My Kortix (slug `mykortix`) keep the brand tile. */
45
46
  const BRAND = {
46
47
  name: 'brand',
47
48
  tile: '#1F1F1F',
@@ -49,7 +50,11 @@ const BRAND = {
49
50
  tileDark: '#2C2C2C',
50
51
  inkDark: '#FFFFFF',
51
52
  };
52
- const RESERVED = { kortix: BRAND, meta: BRAND };
53
+ const RESERVED = { kortix: BRAND, mykortix: BRAND, meta: BRAND };
54
+ /** My Kortix (slug `mykortix`) wears the Kortix symbol itself, the same 12 × 10
55
+ * grid as `PixelKortixMark` and the merch chips. `+` cells are the dithered
56
+ * curve cells; at agent-mark sizes they paint at half ink. */
57
+ const RESERVED_ROWS = { mykortix: PIXEL_KORTIX_ROWS, meta: PIXEL_KORTIX_ROWS };
53
58
  export function fnv1a(input) {
54
59
  let h = 0x811c9dc5;
55
60
  for (let i = 0; i < input.length; i++) {
@@ -126,27 +131,49 @@ export function passesPixelMarkGate(grid) {
126
131
  return false;
127
132
  return largestComponent(grid) >= Math.ceil(filled * 0.85);
128
133
  }
129
- /** One SVG path, horizontal runs merged. Render in `viewBox="0 0 7 7"`. */
134
+ /** One SVG path, horizontal runs merged, in grid units. */
130
135
  function toPath(grid) {
131
136
  let d = '';
132
137
  grid.forEach((row, y) => {
133
- for (let x = 0; x < PIXEL_MARK_SIZE;) {
138
+ for (let x = 0; x < row.length;) {
134
139
  if (!row[x]) {
135
140
  x++;
136
141
  continue;
137
142
  }
138
143
  const start = x;
139
- while (x < PIXEL_MARK_SIZE && row[x])
144
+ while (x < row.length && row[x])
140
145
  x++;
141
146
  d += `M${start} ${y}h${x - start}v1h-${x - start}z`;
142
147
  }
143
148
  });
144
149
  return d;
145
150
  }
151
+ /** Runs of one cell character on one row, as an SVG path. */
152
+ function rowsToPath(rows, cell) {
153
+ return toPath(rows.map((row) => [...row].map((c) => c === cell)));
154
+ }
146
155
  export function pixelMark(slug) {
156
+ const rows = RESERVED_ROWS[slug];
157
+ if (rows) {
158
+ return {
159
+ grid: rows.map((row) => [...row].map((c) => c !== ' ')),
160
+ path: rowsToPath(rows, '#'),
161
+ ditherPath: rowsToPath(rows, '+'),
162
+ width: rows[0].length,
163
+ height: rows.length,
164
+ tone: RESERVED[slug] ?? BRAND,
165
+ };
166
+ }
147
167
  let grid = draw(fnv1a(slug));
148
168
  for (let attempt = 1; !passesPixelMarkGate(grid) && attempt < MAX_ATTEMPTS; attempt++)
149
169
  grid = draw(fnv1a(`${slug}:${attempt}`));
150
170
  const tone = RESERVED[slug] ?? PIXEL_MARK_TONES[fnv1a(`${slug}#tone`) % PIXEL_MARK_TONES.length];
151
- return { grid, path: toPath(grid), tone };
171
+ return {
172
+ grid,
173
+ path: toPath(grid),
174
+ ditherPath: '',
175
+ width: PIXEL_MARK_SIZE,
176
+ height: PIXEL_MARK_SIZE,
177
+ tone,
178
+ };
152
179
  }
@@ -28,7 +28,7 @@ export { PROJECT_ACTIONS, type ProjectAction };
28
28
  * maps a `SettingsTab` onto one of these ids to reuse the IAM read leaf below
29
29
  * — the ids themselves never reach the UI as tab names anymore.
30
30
  */
31
- export type CustomizeSection = 'git' | 'review' | 'commands' | 'marketplace' | 'secrets' | 'llm-management' | 'llm-overview' | 'llm-providers' | 'llm-logs' | 'llm-budgets' | 'llm-keys' | 'llm-api' | 'members' | 'schedules' | 'webhooks' | 'channels' | 'sandbox' | 'settings' | 'feature-flags' | 'upgrade';
31
+ export type CustomizeSection = 'git' | 'review' | 'commands' | 'marketplace' | 'secrets' | 'llm-management' | 'llm-overview' | 'llm-providers' | 'llm-logs' | 'llm-budgets' | 'llm-keys' | 'llm-api' | 'members' | 'schedules' | 'webhooks' | 'channels' | 'sandbox' | 'settings' | 'feature-flags';
32
32
  /**
33
33
  * Per-section gating leaves.
34
34
  *
@@ -102,10 +102,6 @@ export const CUSTOMIZE_SECTION_ACCESS = {
102
102
  read: PROJECT_ACTIONS.PROJECT_READ,
103
103
  write: PROJECT_ACTIONS.PROJECT_SETTINGS_WRITE,
104
104
  },
105
- // `upgrade` (migrate the manifest to v2) starts an agent session that edits the
106
- // repo and opens a CR — the session itself asserts the real leaves; visibility
107
- // follows settings.
108
- upgrade: { read: PROJECT_ACTIONS.PROJECT_READ, write: PROJECT_ACTIONS.PROJECT_WRITE },
109
105
  };
110
106
  /** The distinct read leaves used to gate section visibility — handy for a single
111
107
  * batched probe over every section the rail might show. */
@@ -38,6 +38,8 @@ const PROVIDER_ICON_MAP = {
38
38
  anthropic: { icon: 'anthropic', fallback: 'AN' },
39
39
  openai: { icon: 'openai', fallback: 'OA' },
40
40
  codex: { icon: 'openai', fallback: 'GPT' },
41
+ // Claude subscription models (`claude-agent/<id>`), run through Claude Code.
42
+ 'claude-agent': { icon: 'anthropic', fallback: 'CL' },
41
43
  opencode: { icon: 'opencode', fallback: 'OC' },
42
44
  'opencode-go': { icon: 'opencode', fallback: 'OC' },
43
45
  'github-copilot': { icon: 'github-copilot', fallback: 'GH' },
@@ -0,0 +1,29 @@
1
+ /** @internal Kortix apps only. No semver: it may change in any release. */
2
+ import { type ManifestSpace, type ResourceBinding, type SpaceGroup } from '@kortix/sdk';
3
+ /**
4
+ * Spaces are Work in progress. A space is a channel (`spaces:` in kortix.yaml,
5
+ * `agents.<name>.space`, a resource's `space` binding), so the `project_channels`
6
+ * flag gates them. Off (the default), no surface shows a space, a space
7
+ * filter, a space column or "Move to space"; the bindings stay in the files.
8
+ */
9
+ export declare const SPACES_FLAG: "project_channels";
10
+ /** True only while the project's `project_channels` flag is on. False while it loads. */
11
+ export declare function useSpacesEnabled(projectId: string | null | undefined): boolean;
12
+ type SpacesConfig = {
13
+ agents?: ReadonlyArray<{
14
+ name: string;
15
+ space?: string | null;
16
+ }>;
17
+ spaces?: ManifestSpace[];
18
+ };
19
+ /**
20
+ * The spaces a list page (Artifacts, Goals) offers, its groups, and the space
21
+ * of each item. Off: no spaces, and every item is project-wide, so the page
22
+ * shows no filter, no space chip and no "Move to space".
23
+ */
24
+ export declare function spaceScope<T>(items: readonly T[], config: SpacesConfig | null | undefined, enabled: boolean, bindingOf: (item: T) => ResourceBinding | null | undefined): {
25
+ spaces: ManifestSpace[];
26
+ groups: Array<SpaceGroup<T>>;
27
+ spaceOf: (item: T) => string;
28
+ };
29
+ export {};
@@ -0,0 +1,28 @@
1
+ 'use client';
2
+ import { PROJECT_WIDE_SPACE, bindingSpace, groupBySpace, listSpaces, } from '@kortix/sdk';
3
+ import { useFeatureFlag } from '@kortix/sdk/react';
4
+ /**
5
+ * Spaces are Work in progress. A space is a channel (`spaces:` in kortix.yaml,
6
+ * `agents.<name>.space`, a resource's `space` binding), so the `project_channels`
7
+ * flag gates them. Off (the default), no surface shows a space, a space
8
+ * filter, a space column or "Move to space"; the bindings stay in the files.
9
+ */
10
+ export const SPACES_FLAG = 'project_channels';
11
+ /** True only while the project's `project_channels` flag is on. False while it loads. */
12
+ export function useSpacesEnabled(projectId) {
13
+ return useFeatureFlag(projectId, SPACES_FLAG).enabled === true;
14
+ }
15
+ /**
16
+ * The spaces a list page (Artifacts, Goals) offers, its groups, and the space
17
+ * of each item. Off: no spaces, and every item is project-wide, so the page
18
+ * shows no filter, no space chip and no "Move to space".
19
+ */
20
+ export function spaceScope(items, config, enabled, bindingOf) {
21
+ const agents = config?.agents ?? [];
22
+ const spaceOf = (item) => (enabled ? (bindingSpace(bindingOf(item), agents) ?? PROJECT_WIDE_SPACE) : PROJECT_WIDE_SPACE);
23
+ return {
24
+ spaces: enabled ? listSpaces(config) : [],
25
+ groups: groupBySpace([...items], enabled ? config?.spaces : undefined, spaceOf),
26
+ spaceOf,
27
+ };
28
+ }
@@ -27,7 +27,6 @@ export function useProjectFeatureFlags(projectId) {
27
27
  const warmSessions = useFeatureFlag(projectId, 'warm_sessions');
28
28
  const secretsEgress = useFeatureFlag(projectId, 'secrets_egress');
29
29
  const pooledProviderSecrets = useFeatureFlag(projectId, 'pooled_provider_secrets');
30
- const genui = useFeatureFlag(projectId, 'genui');
31
30
  const usRegion = useFeatureFlag(projectId, 'us_region');
32
31
  const eventTriggers = useFeatureFlag(projectId, 'event_triggers');
33
32
  const notificationCenter = useFeatureFlag(projectId, 'notification_center');
@@ -44,6 +43,7 @@ export function useProjectFeatureFlags(projectId) {
44
43
  const workspaceVolume = useFeatureFlag(projectId, 'workspace_volume');
45
44
  const sessionGroups = useFeatureFlag(projectId, 'session_groups');
46
45
  const chrome = useFeatureFlag(projectId, 'chrome');
46
+ const agentTeams = useFeatureFlag(projectId, 'agent_teams');
47
47
  return {
48
48
  flags: {
49
49
  marketplace: marketplace.enabled,
@@ -52,7 +52,6 @@ export function useProjectFeatureFlags(projectId) {
52
52
  warm_sessions: warmSessions.enabled,
53
53
  secrets_egress: secretsEgress.enabled,
54
54
  pooled_provider_secrets: pooledProviderSecrets.enabled,
55
- genui: genui.enabled,
56
55
  us_region: usRegion.enabled,
57
56
  event_triggers: eventTriggers.enabled,
58
57
  notification_center: notificationCenter.enabled,
@@ -69,8 +68,9 @@ export function useProjectFeatureFlags(projectId) {
69
68
  workspace_volume: workspaceVolume.enabled,
70
69
  session_groups: sessionGroups.enabled,
71
70
  chrome: chrome.enabled,
71
+ agent_teams: agentTeams.enabled,
72
72
  },
73
73
  // The trailing hook's loading state — keep this on the LAST hook above.
74
- isLoading: chrome.isLoading,
74
+ isLoading: agentTeams.isLoading,
75
75
  };
76
76
  }