@kortix/ui 0.14.7 → 0.14.9

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 (576) hide show
  1. package/README.md +2 -2
  2. package/dist/_vendor/kortix-shared.js +64 -4
  3. package/dist/_vendor/shared/app-config.d.ts +175 -0
  4. package/dist/_vendor/shared/channel-message.d.ts +34 -5
  5. package/dist/_vendor/shared/index.d.ts +1 -0
  6. package/dist/_vendor/shared/runtime-versions.d.ts +4 -0
  7. package/dist/_vendor/shared/space-slug.d.ts +37 -0
  8. package/dist/access/access/access-detail-shell.js +1 -1
  9. package/dist/access/access/access-dialog-share.js +4 -7
  10. package/dist/access/access/access-dialog.js +2 -1
  11. package/dist/access/access/principal-picker.d.ts +11 -0
  12. package/dist/access/access/principal-picker.js +9 -7
  13. package/dist/apps/app-preview-pool.d.ts +7 -2
  14. package/dist/apps/app-preview-pool.js +11 -5
  15. package/dist/apps/app-shared.d.ts +22 -15
  16. package/dist/apps/app-shared.js +37 -19
  17. package/dist/apps/index.d.ts +2 -2
  18. package/dist/apps/index.js +2 -2
  19. package/dist/artifacts/artifact-frame.d.ts +16 -0
  20. package/dist/artifacts/artifact-frame.js +51 -0
  21. package/dist/artifacts/artifact-session.d.ts +18 -0
  22. package/dist/artifacts/artifact-session.js +101 -0
  23. package/dist/artifacts/frame-policy.d.ts +30 -0
  24. package/dist/artifacts/frame-policy.js +61 -0
  25. package/dist/artifacts/index.d.ts +3 -0
  26. package/dist/artifacts/index.js +5 -0
  27. package/dist/browser/sandbox-browser-chrome.d.ts +4 -1
  28. package/dist/browser/sandbox-browser-chrome.js +2 -2
  29. package/dist/customize/agents/agent-cover-card.d.ts +17 -0
  30. package/dist/customize/agents/agent-cover-card.js +13 -0
  31. package/dist/customize/agents/agent-grant-pages.d.ts +5 -1
  32. package/dist/customize/agents/agent-grant-pages.js +30 -4
  33. package/dist/customize/agents/agent-page.js +8 -33
  34. package/dist/customize/agents/agent-policy-sets.d.ts +43 -0
  35. package/dist/customize/agents/agent-policy-sets.js +72 -0
  36. package/dist/customize/agents/agent-triggers-section.js +2 -1
  37. package/dist/customize/agents/agents-page.js +43 -49
  38. package/dist/customize/connectors/add-mcp/add-mcp-server-dialog.d.ts +6 -1
  39. package/dist/customize/connectors/add-mcp/add-mcp-server-dialog.js +10 -4
  40. package/dist/customize/connectors/agent-access.d.ts +35 -0
  41. package/dist/customize/connectors/agent-access.js +77 -0
  42. package/dist/customize/connectors/catalog/browse-sections.d.ts +2 -29
  43. package/dist/customize/connectors/catalog/browse-sections.js +7 -74
  44. package/dist/customize/connectors/catalog/catalog-entry.d.ts +18 -37
  45. package/dist/customize/connectors/catalog/catalog-entry.js +28 -40
  46. package/dist/customize/connectors/catalog/connector-browse.d.ts +3 -32
  47. package/dist/customize/connectors/catalog/connector-browse.js +19 -50
  48. package/dist/customize/connectors/catalog/use-catalog.d.ts +20 -59
  49. package/dist/customize/connectors/catalog/use-catalog.js +48 -175
  50. package/dist/customize/connectors/connector-identity.d.ts +9 -11
  51. package/dist/customize/connectors/connector-identity.js +13 -42
  52. package/dist/customize/connectors/connector-moves-banner.d.ts +2 -1
  53. package/dist/customize/connectors/connector-moves-banner.js +4 -6
  54. package/dist/customize/connectors/connector-routes.d.ts +21 -9
  55. package/dist/customize/connectors/connector-routes.js +29 -20
  56. package/dist/customize/connectors/connectors-page.js +53 -82
  57. package/dist/customize/connectors/detail/app-page.js +226 -98
  58. package/dist/customize/connectors/detail/computer-app-page.d.ts +16 -0
  59. package/dist/customize/connectors/detail/computer-app-page.js +39 -0
  60. package/dist/customize/connectors/detail/connector-accounts.js +3 -1
  61. package/dist/customize/connectors/detail/connector-advanced-tools.d.ts +4 -1
  62. package/dist/customize/connectors/detail/connector-advanced-tools.js +2 -2
  63. package/dist/customize/connectors/detail/connector-agents.d.ts +14 -0
  64. package/dist/customize/connectors/detail/connector-agents.js +69 -0
  65. package/dist/customize/connectors/detail/connector-detail-tabs.js +2 -1
  66. package/dist/customize/connectors/detail/connector-move-row.d.ts +8 -5
  67. package/dist/customize/connectors/detail/connector-move-row.js +23 -14
  68. package/dist/customize/connectors/detail/connector-page.d.ts +4 -1
  69. package/dist/customize/connectors/detail/connector-page.js +14 -10
  70. package/dist/customize/connectors/detail/connector-policy-sets.d.ts +28 -0
  71. package/dist/customize/connectors/detail/connector-policy-sets.js +203 -0
  72. package/dist/customize/connectors/detail/connector-settings.d.ts +4 -1
  73. package/dist/customize/connectors/detail/connector-settings.js +7 -3
  74. package/dist/customize/connectors/detail/connector-status.d.ts +19 -6
  75. package/dist/customize/connectors/detail/connector-status.js +34 -10
  76. package/dist/customize/connectors/detail/connector-tabs.d.ts +4 -1
  77. package/dist/customize/connectors/detail/connector-tabs.js +8 -2
  78. package/dist/customize/connectors/detail/connector-tools.d.ts +3 -3
  79. package/dist/customize/connectors/detail/connector-tools.js +105 -48
  80. package/dist/customize/connectors/detail/email-inboxes.d.ts +43 -0
  81. package/dist/customize/connectors/detail/email-inboxes.js +184 -0
  82. package/dist/customize/connectors/detail/provider-info.d.ts +1 -1
  83. package/dist/customize/connectors/detail/provider-info.js +2 -2
  84. package/dist/customize/connectors/detail/status-badge.d.ts +1 -1
  85. package/dist/customize/connectors/detail/status-badge.js +4 -5
  86. package/dist/customize/connectors/detail/use-connector-detail.d.ts +6 -0
  87. package/dist/customize/connectors/detail/use-connector-detail.js +14 -4
  88. package/dist/customize/connectors/install/install-dialog.d.ts +23 -0
  89. package/dist/customize/connectors/install/install-dialog.js +40 -0
  90. package/dist/customize/connectors/install/install.d.ts +13 -2
  91. package/dist/customize/connectors/install/install.js +9 -4
  92. package/dist/customize/connectors/install/use-install.d.ts +19 -2
  93. package/dist/customize/connectors/install/use-install.js +65 -37
  94. package/dist/customize/connectors/install/way-kind.d.ts +5 -0
  95. package/dist/customize/connectors/install/way-kind.js +16 -0
  96. package/dist/customize/connectors/provider-label.d.ts +2 -1
  97. package/dist/customize/connectors/provider-label.js +13 -3
  98. package/dist/customize/connectors/tools/pattern-rule-draft.d.ts +4 -0
  99. package/dist/customize/connectors/tools/pattern-rule-draft.js +12 -3
  100. package/dist/customize/connectors/tools/policy-sets.d.ts +27 -0
  101. package/dist/customize/connectors/tools/policy-sets.js +41 -0
  102. package/dist/customize/connectors/tools/tool-groups.d.ts +32 -9
  103. package/dist/customize/connectors/tools/tool-groups.js +78 -16
  104. package/dist/customize/connectors/tools/tool-policy-control.d.ts +11 -10
  105. package/dist/customize/connectors/tools/tool-policy-control.js +15 -16
  106. package/dist/customize/connectors/tools/tool-policy-labels.d.ts +6 -5
  107. package/dist/customize/connectors/tools/tool-policy-labels.js +17 -16
  108. package/dist/customize/connectors/tools/tool-policy.d.ts +50 -4
  109. package/dist/customize/connectors/tools/tool-policy.js +74 -8
  110. package/dist/customize/connectors/use-agent-access.d.ts +85 -0
  111. package/dist/customize/connectors/use-agent-access.js +72 -0
  112. package/dist/customize/migrate-to-v2/index.d.ts +1 -2
  113. package/dist/customize/migrate-to-v2/index.js +1 -2
  114. package/dist/customize/migrate-to-v2/migration-prompt.d.ts +12 -24
  115. package/dist/customize/migrate-to-v2/migration-prompt.js +34 -235
  116. package/dist/customize/migrate-to-v2/upgrade-defs.d.ts +1 -1
  117. package/dist/customize/migrate-to-v2/upgrade-defs.js +7 -6
  118. package/dist/customize/migrate-to-v2/upgrade-view.js +7 -7
  119. package/dist/customize/migrate-to-v2/use-run-upgrade.d.ts +3 -3
  120. package/dist/customize/providers/provider-accordion.js +17 -2
  121. package/dist/customize/sections/component/channel-access-panel.d.ts +16 -0
  122. package/dist/customize/sections/component/channel-access-panel.js +146 -0
  123. package/dist/customize/sections/component/channel-connect-hero.d.ts +3 -2
  124. package/dist/customize/sections/component/channel-connect-hero.js +3 -2
  125. package/dist/customize/sections/component/channel-hero-frame.d.ts +31 -0
  126. package/dist/customize/sections/component/channel-hero-frame.js +40 -0
  127. package/dist/customize/sections/component/channel-mocks.d.ts +6 -0
  128. package/dist/customize/sections/component/channel-mocks.js +46 -0
  129. package/dist/customize/sections/component/channel-row.d.ts +13 -3
  130. package/dist/customize/sections/component/channel-row.js +10 -4
  131. package/dist/customize/sections/component/email-connect-form.d.ts +27 -0
  132. package/dist/customize/sections/component/email-connect-form.js +183 -0
  133. package/dist/customize/sections/component/slack-connect-card.d.ts +7 -0
  134. package/dist/customize/sections/component/slack-connect-card.js +2 -3
  135. package/dist/customize/sections/component/teams-connect-card.d.ts +7 -0
  136. package/dist/customize/sections/component/teams-connect-card.js +2 -3
  137. package/dist/customize/sections/component/telegram-channel-row.js +16 -25
  138. package/dist/customize/sections/connectors-view.d.ts +1 -15
  139. package/dist/customize/sections/connectors-view.js +81 -314
  140. package/dist/customize/sections/view/agent-editor-catalog.js +5 -0
  141. package/dist/customize/sections/view/channels-view.d.ts +5 -1
  142. package/dist/customize/sections/view/channels-view.js +63 -81
  143. package/dist/customize/sections/view/gateway/gateway-overview.js +10 -2
  144. package/dist/customize/settings/tabs/experimental-tab.js +35 -16
  145. package/dist/customize/shared/catalog/catalog-empty-state.d.ts +1 -12
  146. package/dist/customize/shared/catalog/catalog-empty-state.js +3 -3
  147. package/dist/customize/shared/channels-switch-dialog.d.ts +18 -0
  148. package/dist/customize/shared/channels-switch-dialog.js +30 -0
  149. package/dist/customize/shared/feature-gate-screen.js +27 -9
  150. package/dist/customize/shared/new-entity-menu.js +4 -1
  151. package/dist/customize/shared/use-customize-prefetch.d.ts +2 -3
  152. package/dist/customize/shared/use-customize-prefetch.js +9 -27
  153. package/dist/customize/skills/skills-page.js +4 -5
  154. package/dist/customize/triggers/schedule/post-to-field.d.ts +18 -0
  155. package/dist/customize/triggers/schedule/post-to-field.js +49 -0
  156. package/dist/customize/triggers/schedule/schedule-copy.d.ts +10 -6
  157. package/dist/customize/triggers/schedule/schedule-copy.js +42 -11
  158. package/dist/customize/triggers/schedule/schedule-detail-sheet.js +2 -1
  159. package/dist/customize/triggers/schedule/then-fields.js +1 -5
  160. package/dist/customize/triggers/schedule/trigger-composer-logic.d.ts +22 -0
  161. package/dist/customize/triggers/schedule/trigger-composer-logic.js +25 -0
  162. package/dist/customize/triggers/schedule/trigger-composer.d.ts +5 -0
  163. package/dist/customize/triggers/schedule/trigger-composer.js +23 -14
  164. package/dist/customize/triggers/schedule/trigger-edit-logic.js +3 -0
  165. package/dist/customize/triggers/schedule/trigger-filter.js +1 -1
  166. package/dist/customize/triggers/schedule/trigger-runs-logic.d.ts +2 -2
  167. package/dist/customize/triggers/schedule/trigger-runs-panel.js +1 -0
  168. package/dist/customize/triggers/schedule/trigger-toast.js +2 -1
  169. package/dist/customize/triggers/schedule-view.js +9 -4
  170. package/dist/files/index.d.ts +1 -0
  171. package/dist/files/index.js +1 -0
  172. package/dist/files/project/change-request-recovery.d.ts +1 -26
  173. package/dist/files/project/change-request-recovery.js +1 -59
  174. package/dist/files/project/components/change-request-detail-dialog.js +13 -3
  175. package/dist/files/project/components/drive-explorer.js +15 -15
  176. package/dist/files/project/components/drive-toolbar.d.ts +16 -2
  177. package/dist/files/project/components/drive-toolbar.js +14 -5
  178. package/dist/files/project/hooks/use-change-request-recovery.js +3 -19
  179. package/dist/files/project/hooks/use-change-requests.d.ts +1 -0
  180. package/dist/files/project/hooks/use-change-requests.js +11 -2
  181. package/dist/files/renderers/image-frame.d.ts +46 -0
  182. package/dist/files/renderers/image-frame.js +59 -0
  183. package/dist/files/renderers/image-renderer.d.ts +11 -1
  184. package/dist/files/renderers/image-renderer.js +13 -3
  185. package/dist/files/renderers/pdf/pdf-clipboard.d.ts +2 -0
  186. package/dist/files/renderers/pdf/pdf-clipboard.js +21 -0
  187. package/dist/files/renderers/pdf/pdf-viewer.js +4 -2
  188. package/dist/files/renderers/show-content-renderer.d.ts +9 -1
  189. package/dist/files/renderers/show-content-renderer.js +56 -14
  190. package/dist/files/runtime/file-source.js +2 -0
  191. package/dist/files/runtime/hooks/use-binary-blob.d.ts +10 -1
  192. package/dist/files/runtime/hooks/use-binary-blob.js +10 -4
  193. package/dist/files/runtime/hooks/use-shared-image.d.ts +41 -0
  194. package/dist/files/runtime/hooks/use-shared-image.js +177 -0
  195. package/dist/files/viewer/file-content-renderer.d.ts +22 -1
  196. package/dist/files/viewer/file-content-renderer.js +50 -7
  197. package/dist/files/viewer/file-header.d.ts +7 -3
  198. package/dist/files/viewer/file-header.js +20 -11
  199. package/dist/files/viewer/file-preview-modal.d.ts +1 -1
  200. package/dist/files/viewer/file-preview-modal.js +10 -22
  201. package/dist/files/viewer/file-source.d.ts +13 -0
  202. package/dist/files/viewer/use-file-content-state.d.ts +2 -0
  203. package/dist/files/viewer/use-file-content-state.js +28 -10
  204. package/dist/files/viewer/viewer-actions.d.ts +3 -1
  205. package/dist/files/viewer/viewer-actions.js +2 -2
  206. package/dist/hooks/use-media-query.d.ts +1 -0
  207. package/dist/hooks/use-mobile.d.ts +5 -0
  208. package/dist/hooks/use-mobile.js +8 -0
  209. package/dist/i18n/en.d.ts +906 -70
  210. package/dist/i18n/en.js +924 -88
  211. package/dist/i18n/ui-catalog/localize-ui-catalog.js +4 -0
  212. package/dist/i18n/ui-catalog/remaining-ui-translation-keys.generated.js +15 -3
  213. package/dist/index.d.ts +2 -2
  214. package/dist/index.js +2 -2
  215. package/dist/internal/account-hub/account-settings-sidebar.js +1 -1
  216. package/dist/internal/account-hub/hub-sheet.d.ts +9 -1
  217. package/dist/internal/account-hub/hub-sheet.js +21 -5
  218. package/dist/internal/account-hub/sections.d.ts +1 -1
  219. package/dist/internal/account-hub/sections.js +2 -1
  220. package/dist/internal/auth/auth-card-shell.js +3 -3
  221. package/dist/internal/components/agent-mark.d.ts +38 -0
  222. package/dist/internal/components/agent-mark.js +41 -0
  223. package/dist/internal/connector-logo/connector-logo-source.d.ts +63 -0
  224. package/dist/internal/connector-logo/connector-logo-source.js +48 -0
  225. package/dist/internal/connector-logo/connector-logo.d.ts +39 -0
  226. package/dist/internal/connector-logo/connector-logo.js +56 -0
  227. package/dist/internal/connector-logo/connector-mark-files.d.ts +11 -0
  228. package/dist/internal/connector-logo/connector-mark-files.js +35 -0
  229. package/dist/internal/files/file-read-retry.d.ts +13 -0
  230. package/dist/internal/files/file-read-retry.js +23 -3
  231. package/dist/internal/files/session-drive-files.d.ts +5 -1
  232. package/dist/internal/files/session-drive-files.js +7 -2
  233. package/dist/internal/hooks/channels/use-channels-installations.d.ts +32 -5
  234. package/dist/internal/hooks/channels/use-channels-installations.js +55 -7
  235. package/dist/internal/hooks/channels/use-email-inboxes.d.ts +19 -0
  236. package/dist/internal/hooks/channels/use-email-inboxes.js +48 -0
  237. package/dist/internal/hooks/connectors/use-add-account.js +1 -1
  238. package/dist/internal/hooks/index.d.ts +1 -1
  239. package/dist/internal/hooks/index.js +1 -1
  240. package/dist/internal/hooks/projects/use-new-project-session.d.ts +9 -0
  241. package/dist/internal/hooks/projects/use-new-project-session.js +28 -12
  242. package/dist/internal/hooks/use-auto-scroll.d.ts +8 -1
  243. package/dist/internal/hooks/use-auto-scroll.js +4 -4
  244. package/dist/internal/icons/telegram.d.ts +5 -0
  245. package/dist/internal/icons/telegram.js +6 -1
  246. package/dist/internal/layout/nav-hover-card.d.ts +35 -0
  247. package/dist/internal/layout/nav-hover-card.js +84 -0
  248. package/dist/internal/layout/project-nav-row.d.ts +3 -1
  249. package/dist/internal/layout/project-nav-row.js +3 -2
  250. package/dist/internal/layout/project-page-header.d.ts +4 -2
  251. package/dist/internal/layout/project-page-header.js +4 -3
  252. package/dist/internal/layout/project-settings-nav.js +59 -2
  253. package/dist/internal/lib/browser-error-noise.d.ts +1 -1
  254. package/dist/internal/lib/browser-error-noise.js +1 -1
  255. package/dist/internal/lib/browser-noise/rules/injected-scripts.d.ts +7 -0
  256. package/dist/internal/lib/browser-noise/rules/injected-scripts.js +15 -0
  257. package/dist/internal/lib/manifest-version.d.ts +1 -1
  258. package/dist/internal/lib/manifest-version.js +2 -2
  259. package/dist/internal/lib/memory-href.d.ts +16 -0
  260. package/dist/internal/lib/memory-href.js +46 -0
  261. package/dist/internal/lib/pixel-mark.d.ts +33 -0
  262. package/dist/internal/lib/pixel-mark.js +152 -0
  263. package/dist/internal/lib/use-project-feature-flags.js +11 -11
  264. package/dist/internal/lib/utils/heic-convert.d.ts +1 -1
  265. package/dist/internal/lib/utils/heic-convert.js +3 -4
  266. package/dist/internal/lib/web-notifications.d.ts +20 -0
  267. package/dist/internal/lib/web-notifications.js +48 -4
  268. package/dist/internal/notifications/notification-bell.d.ts +4 -1
  269. package/dist/internal/notifications/notification-bell.js +2 -2
  270. package/dist/internal/selection/selection-bar.d.ts +2 -1
  271. package/dist/internal/selection/selection-bar.js +1 -1
  272. package/dist/internal/stores/file-preview-store.d.ts +29 -2
  273. package/dist/internal/stores/file-preview-store.js +19 -1
  274. package/dist/internal/stores/kortix-computer-store.js +3 -0
  275. package/dist/internal/stores/sidebar-nav-store.d.ts +1 -1
  276. package/dist/internal/stores/sidebar-nav-store.js +3 -1
  277. package/dist/lib/routes.d.ts +13 -1
  278. package/dist/lib/routes.js +13 -0
  279. package/dist/markdown/genui/components/inline.d.ts +1 -1
  280. package/dist/markdown/index.d.ts +2 -1
  281. package/dist/markdown/index.js +2 -1
  282. package/dist/markdown/setup-links/approval-decision.d.ts +1 -0
  283. package/dist/markdown/setup-links/approval-decision.js +6 -2
  284. package/dist/markdown/setup-links/connector-handshake.d.ts +3 -1
  285. package/dist/markdown/setup-links/connector-handshake.js +12 -10
  286. package/dist/markdown/setup-links/show-connect-hero.d.ts +28 -0
  287. package/dist/markdown/setup-links/show-connect-hero.js +91 -0
  288. package/dist/markdown/unified-markdown.js +5 -5
  289. package/dist/primitives/badge.d.ts +1 -1
  290. package/dist/primitives/badge.js +2 -0
  291. package/dist/primitives/disclosure.js +14 -2
  292. package/dist/primitives/empty-art.d.ts +12 -0
  293. package/dist/primitives/empty-art.js +11 -0
  294. package/dist/primitives/entity-avatar.d.ts +4 -1
  295. package/dist/primitives/entity-avatar.js +4 -2
  296. package/dist/primitives/mermaid-renderer.d.ts +2 -0
  297. package/dist/primitives/mermaid-renderer.js +21 -15
  298. package/dist/primitives/resizable.js +6 -1
  299. package/dist/primitives/resize-seam.d.ts +11 -0
  300. package/dist/primitives/resize-seam.js +12 -0
  301. package/dist/primitives/sidebar-panel.js +4 -7
  302. package/dist/primitives/tabs.d.ts +14 -1
  303. package/dist/primitives/tabs.js +1 -1
  304. package/dist/primitives/user-avatar.d.ts +3 -1
  305. package/dist/primitives/user-avatar.js +4 -2
  306. package/dist/providers/ui-provider.d.ts +10 -1
  307. package/dist/session/composer/ComposerAboveCard.d.ts +1 -1
  308. package/dist/session/composer/ComposerAboveCard.js +2 -2
  309. package/dist/session/composer/ComposerCard.d.ts +1 -1
  310. package/dist/session/composer/ComposerCard.js +3 -3
  311. package/dist/session/composer/agent-selector.d.ts +19 -1
  312. package/dist/session/composer/agent-selector.js +42 -12
  313. package/dist/session/composer/composer-agent-access.d.ts +15 -0
  314. package/dist/session/composer/composer-agent-access.js +27 -0
  315. package/dist/session/composer/composer-chat-input.d.ts +8 -2
  316. package/dist/session/composer/composer-chat-input.js +8 -6
  317. package/dist/session/composer/composer-logic.d.ts +16 -0
  318. package/dist/session/composer/composer-logic.js +12 -0
  319. package/dist/session/composer/composer-underbar.d.ts +3 -1
  320. package/dist/session/composer/composer-underbar.js +4 -3
  321. package/dist/session/composer/composer.d.ts +15 -1
  322. package/dist/session/composer/composer.js +19 -1
  323. package/dist/session/composer/context-usage.d.ts +5 -0
  324. package/dist/session/composer/context-usage.js +6 -1
  325. package/dist/session/composer/draft/composer-draft.d.ts +6 -2
  326. package/dist/session/composer/draft/composer-draft.js +5 -1
  327. package/dist/session/composer/reasoning-effort-selector.js +1 -1
  328. package/dist/session/composer/token-progress.js +4 -4
  329. package/dist/session/header/export-transcript-modal.d.ts +3 -2
  330. package/dist/session/header/export-transcript-modal.js +6 -3
  331. package/dist/session/models/chatgpt-connection-button.d.ts +11 -0
  332. package/dist/session/models/chatgpt-connection-button.js +54 -0
  333. package/dist/session/models/model-selector.d.ts +3 -1
  334. package/dist/session/models/model-selector.js +7 -3
  335. package/dist/session/models/use-model-connection-gate.d.ts +5 -5
  336. package/dist/session/models/use-model-connection-gate.js +5 -5
  337. package/dist/session/outcomes/jump-to-outcome.d.ts +10 -0
  338. package/dist/session/outcomes/jump-to-outcome.js +11 -0
  339. package/dist/session/outcomes/session-outcomes-bridge.d.ts +14 -0
  340. package/dist/session/outcomes/session-outcomes-bridge.js +12 -0
  341. package/dist/session/outcomes/session-outcomes-provider.d.ts +3 -1
  342. package/dist/session/outcomes/session-outcomes-provider.js +33 -3
  343. package/dist/session/panel/easy/app-preview.d.ts +10 -0
  344. package/dist/session/panel/easy/app-preview.js +31 -12
  345. package/dist/session/panel/easy/change-requests-card.d.ts +7 -0
  346. package/dist/session/panel/easy/change-requests-card.js +17 -0
  347. package/dist/session/panel/easy/easy-panel-logic.js +7 -1
  348. package/dist/session/panel/easy/easy-panel.js +5 -2
  349. package/dist/session/panel/easy/file-preview.js +1 -1
  350. package/dist/session/panel/easy/outputs-card.d.ts +2 -1
  351. package/dist/session/panel/easy/outputs-card.js +3 -2
  352. package/dist/session/panel/easy/plan-card.d.ts +2 -0
  353. package/dist/session/panel/easy/plan-card.js +2 -0
  354. package/dist/session/panel/mobile-tool-drawer.js +7 -1
  355. package/dist/session/panel/session-audit-panel.js +9 -2
  356. package/dist/session/panel/session-detail-panel.js +9 -3
  357. package/dist/session/panel/session-files-explorer.d.ts +9 -0
  358. package/dist/session/panel/session-files-explorer.js +12 -3
  359. package/dist/session/panel/session-panel-provider.d.ts +15 -1
  360. package/dist/session/panel/session-panel-provider.js +32 -7
  361. package/dist/session/panel/shared/derive-panels.d.ts +8 -1
  362. package/dist/session/panel/shared/derive-panels.js +12 -2
  363. package/dist/session/panel/shared/output-priority.js +2 -0
  364. package/dist/session/participants/session-participants.d.ts +5 -1
  365. package/dist/session/participants/session-participants.js +9 -2
  366. package/dist/session/prompts/approval-request.d.ts +5 -0
  367. package/dist/session/prompts/approval-request.js +7 -1
  368. package/dist/session/prompts/session-approval-review.d.ts +9 -0
  369. package/dist/session/prompts/session-approval-review.js +18 -0
  370. package/dist/session/status/session-error-banner.js +2 -49
  371. package/dist/session/status/session-starting-loader.d.ts +14 -2
  372. package/dist/session/status/session-starting-loader.js +16 -4
  373. package/dist/session/thread/after-first-prompt.d.ts +7 -0
  374. package/dist/session/thread/after-first-prompt.js +8 -0
  375. package/dist/session/thread/detect-command.d.ts +12 -0
  376. package/dist/session/thread/detect-command.js +20 -0
  377. package/dist/session/thread/plan-surface.d.ts +1 -0
  378. package/dist/session/thread/plan-surface.js +1 -0
  379. package/dist/session/thread/session-chat.d.ts +3 -1
  380. package/dist/session/thread/session-chat.js +377 -252
  381. package/dist/session/thread/session-context-metrics.d.ts +15 -0
  382. package/dist/session/thread/session-context-metrics.js +10 -1
  383. package/dist/session/thread/session-context-modal.d.ts +4 -2
  384. package/dist/session/thread/session-context-modal.js +16 -9
  385. package/dist/session/thread/session-thread.d.ts +3 -1
  386. package/dist/session/thread/session-thread.js +9 -2
  387. package/dist/session/thread/thread-boot-rows.d.ts +36 -0
  388. package/dist/session/thread/thread-boot-rows.js +89 -0
  389. package/dist/session/thread/transcript-rows.d.ts +31 -0
  390. package/dist/session/thread/transcript-rows.js +3 -0
  391. package/dist/session/thread/transcript.d.ts +4 -9
  392. package/dist/session/thread/transcript.js +119 -21
  393. package/dist/session/thread/turn-share.d.ts +16 -0
  394. package/dist/session/thread/turn-share.js +162 -0
  395. package/dist/session/tool/shared/infrastructure-contexts.d.ts +28 -0
  396. package/dist/session/tool/shared/infrastructure-contexts.js +31 -3
  397. package/dist/session/tool/tool-part-renderer.d.ts +5 -4
  398. package/dist/session/tool/tool-part-renderer.js +8 -3
  399. package/dist/session/tool/tools/apply-patch-tool.d.ts +1 -0
  400. package/dist/session/tool/tools/apply-patch-tool.js +1 -0
  401. package/dist/session/tool/tools/bash-tool.js +7 -6
  402. package/dist/session/tool/tools/channel-send-card.d.ts +1 -2
  403. package/dist/session/tool/tools/channel-send.d.ts +2 -1
  404. package/dist/session/tool/tools/codemode-tool.js +1 -1
  405. package/dist/session/tool/tools/connector-tools.js +1 -1
  406. package/dist/session/tool/tools/image-gen-tool.d.ts +1 -1
  407. package/dist/session/tool/tools/image-gen-tool.js +240 -53
  408. package/dist/session/tool/tools/pty-kill-tool.d.ts +1 -0
  409. package/dist/session/tool/tools/pty-kill-tool.js +1 -0
  410. package/dist/session/tool/tools/pty-read-tool.d.ts +2 -0
  411. package/dist/session/tool/tools/pty-read-tool.js +2 -0
  412. package/dist/session/tool/tools/pty-spawn-tool.d.ts +1 -0
  413. package/dist/session/tool/tools/pty-spawn-tool.js +1 -0
  414. package/dist/session/tool/tools/pty-write-tool.d.ts +1 -0
  415. package/dist/session/tool/tools/pty-write-tool.js +1 -0
  416. package/dist/session/tool/tools/show-tool.js +19 -8
  417. package/dist/session/tool/tools/todo-write-tool.d.ts +1 -0
  418. package/dist/session/tool/tools/todo-write-tool.js +1 -0
  419. package/dist/session/turn/channel-brand.d.ts +8 -3
  420. package/dist/session/turn/channel-brand.js +20 -4
  421. package/dist/session/turn/message-author-label.js +6 -2
  422. package/dist/session/turn/message-author.d.ts +8 -0
  423. package/dist/session/turn/message-author.js +24 -0
  424. package/dist/session/turn/message-row.d.ts +52 -0
  425. package/dist/session/turn/message-row.js +44 -0
  426. package/dist/session/turn/plan-anchor.d.ts +4 -1
  427. package/dist/session/turn/plan-anchor.js +4 -1
  428. package/dist/session/turn/plan-card.d.ts +7 -0
  429. package/dist/session/turn/plan-card.js +7 -0
  430. package/dist/session/turn/user-message.d.ts +7 -1
  431. package/dist/session/turn/user-message.js +21 -7
  432. package/dist/styles.css +1 -1
  433. package/dist/terminal/session-terminal-connect-bar.js +2 -1
  434. package/dist/workspace/home/access-requests-bell.d.ts +9 -2
  435. package/dist/workspace/home/access-requests-bell.js +20 -6
  436. package/dist/workspace/home/first-chat.d.ts +8 -21
  437. package/dist/workspace/home/first-chat.js +22 -72
  438. package/dist/workspace/index.d.ts +6 -0
  439. package/dist/workspace/index.js +6 -0
  440. package/dist/workspace/layout/project-home.d.ts +14 -2
  441. package/dist/workspace/layout/project-home.js +60 -21
  442. package/dist/workspace/layout/use-project-home-send.d.ts +9 -1
  443. package/dist/workspace/layout/use-project-home-send.js +82 -3
  444. package/dist/workspace/memory/body-doc.d.ts +17 -0
  445. package/dist/workspace/memory/body-doc.js +208 -0
  446. package/dist/workspace/memory/body-extensions.d.ts +38 -0
  447. package/dist/workspace/memory/body-extensions.js +103 -0
  448. package/dist/workspace/memory/company-memory-page.d.ts +8 -0
  449. package/dist/workspace/memory/company-memory-page.js +16 -0
  450. package/dist/workspace/memory/memory-all.d.ts +20 -0
  451. package/dist/workspace/memory/memory-all.js +27 -0
  452. package/dist/workspace/memory/memory-body.d.ts +19 -0
  453. package/dist/workspace/memory/memory-body.js +139 -0
  454. package/dist/workspace/memory/memory-empty.d.ts +13 -0
  455. package/dist/workspace/memory/memory-empty.js +28 -0
  456. package/dist/workspace/memory/memory-history.d.ts +27 -0
  457. package/dist/workspace/memory/memory-history.js +108 -0
  458. package/dist/workspace/memory/memory-labels.d.ts +16 -0
  459. package/dist/workspace/memory/memory-labels.js +47 -0
  460. package/dist/workspace/memory/memory-page-list.d.ts +34 -0
  461. package/dist/workspace/memory/memory-page-list.js +156 -0
  462. package/dist/workspace/memory/memory-reader.d.ts +58 -0
  463. package/dist/workspace/memory/memory-reader.js +123 -0
  464. package/dist/workspace/memory/memory-view.d.ts +21 -0
  465. package/dist/workspace/memory/memory-view.js +124 -0
  466. package/dist/workspace/memory/remember-popover.d.ts +19 -0
  467. package/dist/workspace/memory/remember-popover.js +61 -0
  468. package/dist/workspace/memory/remember-this.d.ts +12 -0
  469. package/dist/workspace/memory/remember-this.js +89 -0
  470. package/dist/workspace/memory/source-mark.d.ts +18 -0
  471. package/dist/workspace/memory/source-mark.js +79 -0
  472. package/dist/workspace/memory/used-memory-chip.d.ts +14 -0
  473. package/dist/workspace/memory/used-memory-chip.js +61 -0
  474. package/dist/workspace/new/advanced-fields.d.ts +2 -1
  475. package/dist/workspace/new/advanced-fields.js +2 -2
  476. package/dist/workspace/new/source-param.d.ts +1 -1
  477. package/dist/workspace/new/source-param.js +3 -1
  478. package/dist/workspace/new/use-create-workspace.d.ts +8 -10
  479. package/dist/workspace/new/use-create-workspace.js +3 -3
  480. package/dist/workspace/projects/onboarding/app-logo.d.ts +7 -2
  481. package/dist/workspace/projects/onboarding/app-logo.js +6 -13
  482. package/dist/workspace/projects/policies-panel.js +5 -3
  483. package/dist/workspace/review/review-actions.d.ts +4 -2
  484. package/dist/workspace/review/review-actions.js +8 -2
  485. package/dist/workspace/review/review-center.js +11 -7
  486. package/dist/workspace/review/review-detail.d.ts +10 -0
  487. package/dist/workspace/review/review-detail.js +101 -13
  488. package/dist/workspace/saved-session-skeleton.d.ts +2 -2
  489. package/dist/workspace/saved-session-skeleton.js +3 -3
  490. package/dist/workspace/session-workspace.js +15 -13
  491. package/dist/workspace/sessions/project-sessions-view.js +3 -2
  492. package/dist/workspace/sessions/sessions-toolbar.d.ts +3 -1
  493. package/dist/workspace/sessions/sessions-toolbar.js +2 -2
  494. package/dist/workspace/sidebar/footer/project-apps-nav.d.ts +5 -0
  495. package/dist/workspace/sidebar/footer/project-apps-nav.js +41 -2
  496. package/dist/workspace/sidebar/footer/project-artifacts-nav.d.ts +6 -0
  497. package/dist/workspace/sidebar/footer/project-artifacts-nav.js +22 -0
  498. package/dist/workspace/sidebar/footer/project-manifest-upgrade-alert.js +13 -13
  499. package/dist/workspace/sidebar/footer/project-memory-nav.d.ts +7 -0
  500. package/dist/workspace/sidebar/footer/project-memory-nav.js +19 -0
  501. package/dist/workspace/sidebar/nav-row-meta.js +14 -2
  502. package/dist/workspace/sidebar/project-nav-items.js +3 -0
  503. package/dist/workspace/sidebar/project-session-list.js +68 -56
  504. package/dist/workspace/sidebar/project-sidebar.js +9 -2
  505. package/dist/workspace/sidebar/project-spaces-nav.d.ts +8 -0
  506. package/dist/workspace/sidebar/project-spaces-nav.js +69 -0
  507. package/dist/workspace/sidebar/session-brief-hover-card.js +28 -1
  508. package/dist/workspace/sidebar/session-group-order.d.ts +9 -0
  509. package/dist/workspace/sidebar/session-group-order.js +25 -0
  510. package/dist/workspace/sidebar/session-group-sections.d.ts +62 -0
  511. package/dist/workspace/sidebar/session-group-sections.js +267 -0
  512. package/dist/workspace/sidebar/session-list-chrome.d.ts +28 -0
  513. package/dist/workspace/sidebar/session-list-chrome.js +50 -0
  514. package/dist/workspace/spaces/channel-glyph.d.ts +5 -0
  515. package/dist/workspace/spaces/channel-glyph.js +6 -0
  516. package/dist/workspace/spaces/channel-setup.d.ts +16 -0
  517. package/dist/workspace/spaces/channel-setup.js +105 -0
  518. package/dist/workspace/spaces/channels-onboarding.d.ts +13 -0
  519. package/dist/workspace/spaces/channels-onboarding.js +37 -0
  520. package/dist/workspace/spaces/create-channel-dialog.d.ts +16 -0
  521. package/dist/workspace/spaces/create-channel-dialog.js +158 -0
  522. package/dist/workspace/spaces/private-channels-not-in.d.ts +9 -0
  523. package/dist/workspace/spaces/private-channels-not-in.js +69 -0
  524. package/dist/workspace/spaces/space-agents.d.ts +10 -0
  525. package/dist/workspace/spaces/space-agents.js +10 -0
  526. package/dist/workspace/spaces/space-details-dialog.d.ts +20 -0
  527. package/dist/workspace/spaces/space-details-dialog.js +176 -0
  528. package/dist/workspace/spaces/space-link-label.d.ts +49 -0
  529. package/dist/workspace/spaces/space-link-label.js +73 -0
  530. package/dist/workspace/spaces/space-links.d.ts +19 -0
  531. package/dist/workspace/spaces/space-links.js +230 -0
  532. package/dist/workspace/spaces/space-members.d.ts +46 -0
  533. package/dist/workspace/spaces/space-members.js +182 -0
  534. package/dist/workspace/spaces/space-roster.d.ts +15 -0
  535. package/dist/workspace/spaces/space-roster.js +44 -0
  536. package/dist/workspace/spaces/space-threads-tab.d.ts +56 -0
  537. package/dist/workspace/spaces/space-threads-tab.js +156 -0
  538. package/dist/workspace/spaces/space-timeline-view.d.ts +254 -0
  539. package/dist/workspace/spaces/space-timeline-view.js +235 -0
  540. package/dist/workspace/spaces/space-timeline.d.ts +106 -0
  541. package/dist/workspace/spaces/space-timeline.js +183 -0
  542. package/dist/workspace/spaces/space-triggers.d.ts +13 -0
  543. package/dist/workspace/spaces/space-triggers.js +78 -0
  544. package/dist/workspace/spaces/space-view.d.ts +37 -0
  545. package/dist/workspace/spaces/space-view.js +436 -0
  546. package/package.json +31 -32
  547. package/skills/kortix-ui/SKILL.md +3 -3
  548. package/skills/kortix-ui/references/custom-dashboard.md +3 -3
  549. package/skills/kortix-ui/references/modules.md +28 -4
  550. package/skills/kortix-ui/references/theming.md +1 -1
  551. package/dist/customize/agents/agent-nav.prototype.d.ts +0 -35
  552. package/dist/customize/agents/agent-nav.prototype.js +0 -95
  553. package/dist/customize/connectors/catalog/merge-search.d.ts +0 -10
  554. package/dist/customize/connectors/catalog/merge-search.js +0 -26
  555. package/dist/customize/connectors/detail/find-easy-connect-app.d.ts +0 -29
  556. package/dist/customize/connectors/detail/find-easy-connect-app.js +0 -22
  557. package/dist/customize/migrate-to-v2/use-migrate-to-v2.d.ts +0 -9
  558. package/dist/customize/migrate-to-v2/use-migrate-to-v2.js +0 -24
  559. package/dist/customize/sections/connector-connection-header.d.ts +0 -36
  560. package/dist/customize/sections/connector-connection-header.js +0 -33
  561. package/dist/customize/sections/connector-connection-modal.d.ts +0 -34
  562. package/dist/customize/sections/connector-connection-modal.js +0 -72
  563. package/dist/customize/sections/discover-catalogue-card.d.ts +0 -19
  564. package/dist/customize/sections/discover-catalogue-card.js +0 -26
  565. package/dist/customize/sections/discover-catalogue-detail.d.ts +0 -15
  566. package/dist/customize/sections/discover-catalogue-detail.js +0 -24
  567. package/dist/customize/sections/discover-catalogue.d.ts +0 -17
  568. package/dist/customize/sections/discover-catalogue.js +0 -132
  569. package/dist/customize/sections/llm-provider/provider-access-menu.d.ts +0 -10
  570. package/dist/customize/sections/llm-provider/provider-access-menu.js +0 -23
  571. package/dist/files/project/components/drive-empty-art.d.ts +0 -2
  572. package/dist/files/project/components/drive-empty-art.js +0 -5
  573. package/dist/internal/hooks/use-media-query.d.ts +0 -2
  574. package/dist/internal/share/public-share-link-button.d.ts +0 -14
  575. package/dist/internal/share/public-share-link-button.js +0 -17
  576. /package/dist/{internal/hooks → hooks}/use-media-query.js +0 -0
@@ -1,44 +1,23 @@
1
1
  'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
- import { useTranslations } from '../../i18n/index.js';
4
- import { CheckIcon, ChatIcon as MessageSquare, MonitorIcon as Monitor, } from '@phosphor-icons/react';
5
- import { UiImage as Image } from '../../providers/ui-provider.js';
6
- import { useState } from 'react';
7
- import { Badge } from '../../primitives/badge.js';
8
- import { EntityAvatar } from '../../primitives/entity-avatar.js';
9
- import { connectorSetupStatus } from '../sections/connector-connection-form.js';
3
+ import { CheckIcon, } from '@phosphor-icons/react';
4
+ import { connectorStatusTone } from './detail/connector-status.js';
5
+ import { ConnectorStatusBadge as ToneBadge } from './detail/status-badge.js';
10
6
  import { cn } from '../../internal/lib/utils.js';
11
7
  /**
12
- * How a connector presents itself — its icon tile and its status pill.
8
+ * How a connector presents its status — the connected mark and the status
9
+ * pill. Its logo is `ConnectorLogo` (`connector-logo.tsx`), shared by every
10
+ * connector surface.
13
11
  *
14
12
  * These two render once per card in the connectors grid, so they sit on the
15
13
  * hottest path of `/projects/[id]/connectors`. They used to live in
16
14
  * `customize/sections/connectors-view.tsx`, which is ~5,100 lines across 50
17
- * components and pulls `HighlightedCode`,
18
- * `PoliciesPanel`, `DiscoverCatalogue` and `ConnectorConnectionModal`. Importing
15
+ * components and pulls `HighlightedCode` and `PoliciesPanel`. Importing
19
16
  * two small components from there put that entire graph in this route's client
20
17
  * chunk — an ES module is all-or-nothing to the bundler.
21
18
  *
22
19
  * The tile-size helper came along because nothing else in the old file used it.
23
20
  */
24
- export function ConnectorAppIcon({ connector, size = 'lg', }) {
25
- const [broken, setBroken] = useState(false);
26
- const imgSrc = connector.iconUrl ?? null;
27
- if (imgSrc && !broken) {
28
- return (_jsx("span", {
29
- // The catalogue grid card's logo (`connector-browse.tsx`): the bare
30
- // image, no tile, so an app looks the same on every connector surface.
31
- className: cn('relative flex shrink-0 items-center justify-center overflow-hidden rounded-sm', size === 'lg' ? 'size-9' : 'size-6'), children: _jsx(Image, { src: imgSrc, alt: "", referrerPolicy: "no-referrer", fill: true, sizes: size === 'lg' ? '36px' : '24px', className: "object-contain", unoptimized: true, onError: () => setBroken(true) }) }));
32
- }
33
- // No logo: a channel or a computer keeps its own glyph, because that glyph
34
- // says what it is. An app shows its first letter. A plug says only "some app".
35
- const glyph = connector.provider === 'channel'
36
- ? MessageSquare
37
- : connector.provider === 'computer'
38
- ? Monitor
39
- : undefined;
40
- return _jsx(EntityAvatar, { icon: glyph, size: size, label: connector.name });
41
- }
42
21
  /**
43
22
  * Green `✓` for a healthy project connector — same glyph Discovery/All use in
44
23
  * the catalogue card's `trailing` slot. Not a badge: problem states keep the
@@ -49,19 +28,11 @@ export function ConnectorConnectedMark({ className } = {}) {
49
28
  return (_jsx(CheckIcon, { "aria-hidden": true, weight: "bold", className: cn('text-kortix-green size-4 shrink-0', className), "data-testid": "catalog-connected" }));
50
29
  }
51
30
  /**
52
- * Problem / setup pills for a project connector. Deliberately returns `null`
53
- * when status is `connected` — put {@link ConnectorConnectedMark} in the card's
54
- * `trailing` slot instead so Connected matches Discovery's `✓` affordance.
31
+ * The state pill for a project connector: Needs account or Error. Connected
32
+ * returns `null`: put {@link ConnectorConnectedMark} in the card's `trailing`
33
+ * slot instead, the catalogue's `✓`.
55
34
  */
56
- export function ConnectorStatusBadge({ connector }) {
57
- const tI18nHardcoded = useTranslations('hardcodedUi');
58
- const tPages = useTranslations('connectorPages');
59
- const status = connectorSetupStatus(connector);
60
- if (status === 'pending')
61
- return (_jsx(Badge, { variant: "info", size: "sm", children: tPages('statusPending') }));
62
- if (status === 'error')
63
- return (_jsx(Badge, { variant: "destructive", size: "sm", children: tI18nHardcoded.raw('i18nComplete.text54a0e8c17ebb') }));
64
- if (status === 'needs_setup')
65
- return (_jsx(Badge, { variant: "info", size: "sm", children: tI18nHardcoded.raw('autoComponentsProjectsCustomizeSectionsConnectorsViewJsxTextNeedsSetupbefdbc49') }));
66
- return null;
35
+ export function ConnectorStatusBadge({ connector, accountCount, }) {
36
+ const tone = connectorStatusTone(connector, accountCount);
37
+ return tone === 'connected' ? null : _jsx(ToneBadge, { tone: tone });
67
38
  }
@@ -1,4 +1,5 @@
1
- /** The Pipedream and Composio connectors a `connectors_v2` project can move to Kortix apps, each linked to its page. */
1
+ /** The Pipedream connectors a project can move to Kortix apps, each linked to its page.
2
+ * Composio is a supported way to connect, not a retired one: it never shows here. */
2
3
  export declare function ConnectorMovesBanner({ projectId }: {
3
4
  projectId: string;
4
5
  }): import("react").JSX.Element | null;
@@ -1,7 +1,6 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { listConnectorMoves } from '@kortix/sdk';
4
- import { useFeatureFlag } from '@kortix/sdk/react';
5
4
  import { useQuery } from '@tanstack/react-query';
6
5
  import { UiLink as Link } from '../../providers/ui-provider.js';
7
6
  import { Fragment } from 'react';
@@ -9,17 +8,16 @@ import { InfoBanner } from '../../primitives/info-banner.js';
9
8
  import { useTranslations } from '../../i18n/index.js';
10
9
  import { connectorHref } from './connector-routes.js';
11
10
  import { connectorMovesQueryKey } from './detail/connector-move-row.js';
12
- /** The Pipedream and Composio connectors a `connectors_v2` project can move to Kortix apps, each linked to its page. */
11
+ /** The Pipedream connectors a project can move to Kortix apps, each linked to its page.
12
+ * Composio is a supported way to connect, not a retired one: it never shows here. */
13
13
  export function ConnectorMovesBanner({ projectId }) {
14
14
  const t = useTranslations('connectorPages');
15
- const enabled = useFeatureFlag(projectId, 'connectors_v2').enabled;
16
15
  const moves = useQuery({
17
16
  queryKey: connectorMovesQueryKey(projectId),
18
17
  queryFn: () => listConnectorMoves(projectId),
19
- enabled,
20
18
  });
21
- const movable = (moves.data ?? []).filter((move) => move.to);
22
- if (!enabled || movable.length === 0)
19
+ const movable = (moves.data ?? []).filter((move) => move.to && move.provider === 'pipedream');
20
+ if (movable.length === 0)
23
21
  return null;
24
22
  return (_jsx(InfoBanner, { tone: "info", title: t('movesBannerTitle', { count: movable.length }), children: _jsxs("p", { className: "text-muted-foreground text-xs text-pretty", children: [t('movesBannerBody'), ' ', movable.map((move, index) => (_jsxs(Fragment, { children: [index > 0 ? ', ' : null, _jsx(Link, { href: connectorHref(projectId, move.slug), className: "text-foreground underline-offset-2 hover:underline", children: move.name })] }, move.slug)))] }) }));
25
23
  }
@@ -1,28 +1,40 @@
1
1
  import type { CatalogEntry } from './catalog/catalog-entry.js';
2
+ import type { ConnectorScope } from './connector-filter.js';
2
3
  /**
3
4
  * The app segment of a connector reached without an app: the Connected tab, a
4
5
  * custom connector, a computer. Its back link goes to the Connected tab.
5
6
  */
6
7
  export declare const CONNECTED_APP_SEGMENT = "connected";
8
+ /** The id of the native Computer entry: it has its own page (`ComputerAppPage`). */
9
+ export declare const COMPUTER_APP_ID = "native:computer";
7
10
  /**
8
- * Which catalogue app a page belongs to, as the URL carries it. A Discover app
9
- * is fetched by `id` (`getDiscoverConnector`), so the id rides in the query;
10
- * a managed app is looked up by slug.
11
+ * Which catalogue app a page belongs to, as the URL carries it. The app is
12
+ * fetched by `id` (`getDiscoverConnector`), so the id rides in the query.
11
13
  */
12
14
  export type AppRef = {
13
15
  source: 'discover';
14
16
  slug: string;
15
17
  id: string;
16
- } | {
17
- source: 'easy-connect';
18
- slug: string;
19
18
  };
20
- export declare function connectorsHref(projectId: string, scope?: 'all' | 'connected' | 'channels'): string;
19
+ /** The Connectors page on one tab. */
20
+ export declare function connectorsHref(projectId: string, scope?: ConnectorScope): string;
21
+ /** The Connectors page with the project's approval rules open (`?rules=1`). */
22
+ export declare function rulesHref(projectId: string): string;
21
23
  export declare function connectorSearchFromParams(search: Pick<URLSearchParams, 'get'> | null | undefined): string;
22
24
  /** Sets `?q=` to the trimmed query, or removes it when the query is empty. */
23
25
  export declare function withConnectorSearch(params: URLSearchParams, query: string): URLSearchParams;
24
- export declare function appRefFromEntry(entry: CatalogEntry): AppRef | null;
25
- export declare function appHref(projectId: string, app: AppRef): string;
26
+ export declare function appRefFromEntry(entry: CatalogEntry): AppRef;
27
+ /**
28
+ * An app's page. Once the project has the app it redirects to the connector
29
+ * page; `ways` keeps it open, to install the app as another profile.
30
+ */
31
+ export declare function appHref(projectId: string, app: AppRef, options?: {
32
+ ways?: boolean;
33
+ }): string;
34
+ /** `?ways=1`: the app page stays open on an installed app, and Browse links there. */
35
+ export declare function waysFromParams(search: Pick<URLSearchParams, 'get'> | null | undefined): boolean;
36
+ /** Browse, searching for one app, with its cards opening the app page (`ways`). */
37
+ export declare function browseForAnotherProfileHref(projectId: string, name: string): string;
26
38
  export declare function appRefFromLocation(appSegment: string, search: URLSearchParams | null): AppRef | null;
27
39
  export declare function connectorHref(projectId: string, connectorSlug: string, options?: {
28
40
  app?: AppRef | null;
@@ -4,6 +4,8 @@ import { customizePath } from '../../lib/routes.js';
4
4
  * custom connector, a computer. Its back link goes to the Connected tab.
5
5
  */
6
6
  export const CONNECTED_APP_SEGMENT = 'connected';
7
+ /** The id of the native Computer entry: it has its own page (`ComputerAppPage`). */
8
+ export const COMPUTER_APP_ID = 'native:computer';
7
9
  function base(projectId) {
8
10
  return customizePath(encodeURIComponent(projectId), 'connectors');
9
11
  }
@@ -12,17 +14,16 @@ function withQuery(path, params) {
12
14
  return query ? `${path}?${query}` : path;
13
15
  }
14
16
  function appParams(app) {
15
- const params = new URLSearchParams();
16
- if (app.source === 'discover')
17
- params.set('id', app.id);
18
- else
19
- params.set('src', 'apps');
20
- return params;
17
+ return new URLSearchParams({ id: app.id });
21
18
  }
19
+ /** The Connectors page on one tab. */
22
20
  export function connectorsHref(projectId, scope) {
23
21
  return scope ? `${base(projectId)}?scope=${scope}` : base(projectId);
24
22
  }
25
- /** `null` for the computer entry: a computer has no app page. */
23
+ /** The Connectors page with the project's approval rules open (`?rules=1`). */
24
+ export function rulesHref(projectId) {
25
+ return `${base(projectId)}?rules=1`;
26
+ }
26
27
  /**
27
28
  * The catalogue search, held in `?q=`. Opening a connector is a route change
28
29
  * that unmounts the catalogue; a search kept only in state was gone on browser
@@ -42,25 +43,33 @@ export function withConnectorSearch(params, query) {
42
43
  return params;
43
44
  }
44
45
  export function appRefFromEntry(entry) {
45
- if (entry.source === 'discover') {
46
- return { source: 'discover', slug: entry.slug, id: entry.connector.id };
47
- }
48
- if (entry.source === 'easy-connect')
49
- return { source: 'easy-connect', slug: entry.slug };
50
- return null;
46
+ return { source: 'discover', slug: entry.slug, id: entry.connector.id };
47
+ }
48
+ /**
49
+ * An app's page. Once the project has the app it redirects to the connector
50
+ * page; `ways` keeps it open, to install the app as another profile.
51
+ */
52
+ export function appHref(projectId, app, options = {}) {
53
+ const params = appParams(app);
54
+ if (options.ways)
55
+ params.set(WAYS_PARAM, '1');
56
+ return withQuery(`${base(projectId)}/${encodeURIComponent(app.slug)}`, params);
57
+ }
58
+ const WAYS_PARAM = 'ways';
59
+ /** `?ways=1`: the app page stays open on an installed app, and Browse links there. */
60
+ export function waysFromParams(search) {
61
+ return search?.get(WAYS_PARAM) === '1';
51
62
  }
52
- export function appHref(projectId, app) {
53
- return withQuery(`${base(projectId)}/${encodeURIComponent(app.slug)}`, appParams(app));
63
+ /** Browse, searching for one app, with its cards opening the app page (`ways`). */
64
+ export function browseForAnotherProfileHref(projectId, name) {
65
+ const params = withConnectorSearch(new URLSearchParams({ scope: 'all', [WAYS_PARAM]: '1' }), name);
66
+ return withQuery(base(projectId), params);
54
67
  }
55
68
  export function appRefFromLocation(appSegment, search) {
56
69
  if (appSegment === CONNECTED_APP_SEGMENT)
57
70
  return null;
58
71
  const id = search?.get('id');
59
- if (id)
60
- return { source: 'discover', slug: appSegment, id };
61
- if (search?.get('src') === 'apps')
62
- return { source: 'easy-connect', slug: appSegment };
63
- return null;
72
+ return id ? { source: 'discover', slug: appSegment, id } : null;
64
73
  }
65
74
  export function connectorHref(projectId, connectorSlug, options = {}) {
66
75
  const segment = options.app ? options.app.slug : CONNECTED_APP_SEGMENT;
@@ -4,8 +4,8 @@ import { NewEntityMenu } from '../shared/new-entity-menu.js';
4
4
  import { newConfigPrompt, useConfigureThread, } from '../use-configure-thread.js';
5
5
  import { useTranslations as useI18nTranslations } from '../../i18n/index.js';
6
6
  import { getProjectDetail, listConnectors } from '@kortix/sdk';
7
- import { contract, FRESHNESS, qk, useFeatureFlag, useProjectAccountId } from '@kortix/sdk/react';
8
- import { MagnifyingGlassIcon, PlugIcon, PlugsConnectedIcon } from '@phosphor-icons/react';
7
+ import { contract, FRESHNESS, qk, useProjectAccountId } from '@kortix/sdk/react';
8
+ import { CaretDownIcon, MagnifyingGlassIcon, PlugIcon, PlugsConnectedIcon } from '@phosphor-icons/react';
9
9
  import { useQuery, useQueryClient } from '@tanstack/react-query';
10
10
  import { lazyClient } from '../../lib/lazy-client.js';
11
11
  import { useUiPathname, useUiRouter, useUiSearchParams, useUiShallowNavigate, } from '../../providers/ui-provider.js';
@@ -13,6 +13,9 @@ import { useDebounce } from '../../hooks/use-debounce.js';
13
13
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
14
14
  import { PoliciesPanel } from '../../workspace/projects/policies-panel.js';
15
15
  import { Button } from '../../primitives/button.js';
16
+ import { Switch } from '../../primitives/switch.js';
17
+ import { DropdownMenu, DropdownMenuContent, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuTrigger, } from '../../primitives/dropdown-menu.js';
18
+ import { cn } from '../../lib/utils.js';
16
19
  import { InputGroupSearch, InputGroupSearchIcon, InputGroupSearchInput, } from '../../primitives/input-group.js';
17
20
  import Loading from '../../primitives/loading.js';
18
21
  import { Modal, ModalBody, ModalContent, ModalDescription, ModalHeader, ModalTitle, } from '../../primitives/modal.js';
@@ -23,12 +26,13 @@ import { EmptyState } from '../../primitives/empty-state.js';
23
26
  import { connectorConnectionQueryKeys, connectorSetupStatus, } from '../sections/connector-connection-form.js';
24
27
  import { PROJECT_ACTIONS } from '../../internal/lib/project-actions.js';
25
28
  import { useProjectCan } from '../../internal/lib/use-project-can.js';
26
- import { ConnectorAppIcon, ConnectorConnectedMark, ConnectorStatusBadge, } from './connector-identity.js';
29
+ import { ConnectorConnectedMark, ConnectorStatusBadge } from './connector-identity.js';
30
+ import { ConnectorLogo } from '../../internal/connector-logo/connector-logo.js';
31
+ import { installedConnectorLogoSource } from '../../internal/connector-logo/connector-logo-source.js';
27
32
  import { providerLabel } from './provider-label.js';
28
- import { ComputerConnectModal } from '../../internal/tunnel/computer-connect.js';
29
33
  import { connectedCatalogKeys, } from './catalog/catalog-entry.js';
30
34
  import { ConnectorBrowse } from './catalog/connector-browse.js';
31
- import { useCatalog, useConnectProviderStatus, } from './catalog/use-catalog.js';
35
+ import { useCatalog } from './catalog/use-catalog.js';
32
36
  import { CapabilityPageShell } from '../shared/capability-page-shell.js';
33
37
  import { CatalogCard } from '../shared/catalog/catalog-card.js';
34
38
  import { catalogEmptyKind } from '../shared/catalog/catalog-empty.js';
@@ -40,13 +44,24 @@ import { connectorDisplayName, connectorSummary, filterConnectors, } from './con
40
44
  import { ConnectorMovesBanner } from './connector-moves-banner.js';
41
45
  import { appHref, appRefFromEntry, connectorHref, connectorSearchFromParams, legacyDetailRedirect, withConnectorSearch, } from './connector-routes.js';
42
46
  import { useInstall } from './install/use-install.js';
47
+ import { InstallDialog } from './install/install-dialog.js';
48
+ import { wayKindLabel } from './install/way-kind.js';
49
+ /** The catalogue's type filter: every app, or the apps that
50
+ * connect one way. REST covers OpenAPI documents. */
51
+ const CATALOG_KIND_FILTERS = {
52
+ all: [],
53
+ mcp: ['mcp'],
54
+ composio: ['composio'],
55
+ openapi: ['openapi'],
56
+ graphql: ['graphql'],
57
+ kortix: ['kortix'],
58
+ };
43
59
  /**
44
60
  * The click-gated Add form, split out of this route's initial chunk.
45
61
  *
46
62
  * It lives in `customize/sections/connectors-view.tsx` — 5,075 lines whose own
47
- * import list pulls `@pipedream/sdk/browser`, `HighlightedCode` (shiki),
48
- * `PoliciesPanel`, `DiscoverCatalogue` and `ConnectorConnectionModal`. An ES
49
- * module is all-or-nothing to the bundler, so one `import` line puts that
63
+ * import list pulls `@pipedream/sdk/browser`, `HighlightedCode` (shiki) and
64
+ * `PoliciesPanel`. An ES module is all-or-nothing to the bundler, so one `import` line puts that
50
65
  * entire graph in front of a page that paints a grid of cards.
51
66
  * `connector-identity.tsx` was lifted out of that file for exactly this
52
67
  * reason; a static import here is the edge that puts it straight back.
@@ -97,17 +112,13 @@ function ChannelsFallback() {
97
112
  * Channels sits LAST and outside that reasoning, because it is not a narrower
98
113
  * view of the same list — it is the other direction of the same job (who can
99
114
  * reach the agent, rather than what the agent can reach).
100
- *
101
- * All is dropped entirely on a deployment with no catalogue — see
102
- * `catalogueAvailable`. Without `connectors_api_discover` the catalogue is the
103
- * managed provider's, which answers `501` on every request unless it is
104
- * configured. The tab is removed rather than disabled: a disabled tab still
105
- * asserts that the feature exists. Connected and Channels stay either way.
106
115
  */
107
116
  const SCOPES = ['all', 'connected', 'channels'];
108
117
  const SCOPE_LABEL = {
109
118
  all: 'All',
110
119
  connected: 'Connected',
120
+ // The tab holds everything Kortix built (Slack, Teams, Email, Telegram and
121
+ // the computer). People call those channels; the catalog type stays "Kortix".
111
122
  channels: 'Channels',
112
123
  };
113
124
  /**
@@ -119,7 +130,7 @@ const SCOPE_LABEL = {
119
130
  const SCOPE_DESCRIPTION = {
120
131
  all: 'Give agents access to outside tools and data.',
121
132
  connected: 'Give agents access to outside tools and data.',
122
- channels: 'Talk to your agents from the apps your team uses.',
133
+ channels: 'Talk to your agents from the apps your team uses, and let them work on your computer.',
123
134
  };
124
135
  /** `?scope=` is user-editable text; anything that is not a scope is All. */
125
136
  function parseScope(value) {
@@ -182,7 +193,10 @@ export function ConnectorsPage({ projectId }) {
182
193
  // The catalogue app whose own MCP server the MCP dialog connects. Null for
183
194
  // a server the user pastes (New → MCP server).
184
195
  const [mcpApp, setMcpApp] = useState(null);
185
- const [computerOpen, setComputerOpen] = useState(false);
196
+ // The catalogue opens on the apps that connect in one click.
197
+ const [oneClick, setOneClick] = useState(true);
198
+ const [kindFilter, setKindFilter] = useState('all');
199
+ const kinds = useMemo(() => CATALOG_KIND_FILTERS[kindFilter], [kindFilter]);
186
200
  const tSharing = useI18nTranslations('accessSharing');
187
201
  const tPages = useI18nTranslations('connectorPages');
188
202
  const connectorsQuery = useQuery({
@@ -197,7 +211,7 @@ export function ConnectorsPage({ projectId }) {
197
211
  });
198
212
  const connectors = useMemo(() => connectorsQuery.data?.connectors ?? [], [connectorsQuery.data]);
199
213
  const connectedKeys = useMemo(() => connectedCatalogKeys(connectors), [connectors]);
200
- const { installEntry, pendingKey } = useInstall(projectId, {
214
+ const { installEntry, pendingKey, request: installRequest, setRequest: setInstallRequest, confirm: confirmInstall } = useInstall(projectId, {
201
215
  onMcpServer: (server) => {
202
216
  setMcpApp(server);
203
217
  setPanel('mcp');
@@ -214,19 +228,6 @@ export function ConnectorsPage({ projectId }) {
214
228
  // What the card actually shows, handed to the search so typing a word the
215
229
  // user can read on screen matches the card carrying it.
216
230
  const describeConnector = useCallback((connector) => connectorSummary(connector, providerLabel(connector.provider)), []);
217
- // The one gating primitive. `useFeatureFlag` reads the SAME
218
- // `qk.project.detail(projectId)` entry `projectQuery` above holds, so this is
219
- // the same fetch and the same fail-closed semantics — `projectQuery` stays
220
- // only to surface a load FAILURE and drive Retry (see `isError`/`retry`).
221
- // `connectors_v2`: the catalogue is Kortix's own MCP apps, on the Discover routes.
222
- const mcpApps = useFeatureFlag(projectId, 'connectors_v2').enabled;
223
- const discoverEnabled = useFeatureFlag(projectId, 'connectors_api_discover').enabled || mcpApps;
224
- const emailChannelEnabled = useFeatureFlag(projectId, 'agentmail_email').enabled;
225
- // One catalogue: managed apps for browsing, plus API/MCP apps in search
226
- // (`useCatalog`). The probe is independent of the active scope so an absent
227
- // provider cannot oscillate the catalogue between enabled and disabled.
228
- const connectStatus = useConnectProviderStatus(true);
229
- const catalogueAvailable = discoverEnabled || connectStatus.state !== 'absent';
230
231
  const authorizationQueryKeys = useMemo(() => connectorConnectionQueryKeys(projectId), [projectId]);
231
232
  const invalidate = useCallback(() => {
232
233
  for (const key of authorizationQueryKeys) {
@@ -236,9 +237,6 @@ export function ConnectorsPage({ projectId }) {
236
237
  // Both queries gate what this page can offer, so both have to be able to
237
238
  // report a failure and both have to be retried.
238
239
  //
239
- // `projectQuery` is the SAME cache entry `useFeatureFlag` reads, and every
240
- // flag read off it FAILS CLOSED: a 500 leaves `discoverEnabled` and
241
- // `emailChannelEnabled` false.
242
240
  // `settled` does not save us — react-query drops `isLoading` once a query
243
241
  // has exhausted its retries, so on failure the page rendered as fully loaded
244
242
  // with capabilities silently gone. Naming only `connectorsQuery` here also
@@ -263,17 +261,7 @@ export function ConnectorsPage({ projectId }) {
263
261
  // connector than reading the ones already there, and the ones already there
264
262
  // are one click away. It also made the landing tab depend on a query, so the
265
263
  // page could settle onto a different tab than it first rendered.
266
- //
267
- // Unless the requested scope needs a catalogue that is not there: `?scope=`
268
- // outlives the answer it was read under (a bookmark, a shared link).
269
- // Reading it blindly would strand the user on a tab the strip no longer
270
- // renders.
271
- // Connected and Channels never need the catalogue, so they are honored
272
- // either way.
273
- const requestedScope = parseScope(search?.get('scope') ?? null) ?? 'all';
274
- const scope = catalogueAvailable || requestedScope === 'connected' || requestedScope === 'channels'
275
- ? requestedScope
276
- : 'connected';
264
+ const scope = parseScope(search?.get('scope') ?? null) ?? 'all';
277
265
  const catalogActive = scope === 'all';
278
266
  // Channels replaces the connector list rather than narrowing it, so the
279
267
  // controls that only make sense over that list come off with it: the search
@@ -282,19 +270,14 @@ export function ConnectorsPage({ projectId }) {
282
270
  // it — so it needs neither, and leaving them on screen would offer to search
283
271
  // a list that is not there.
284
272
  const channelsActive = scope === 'channels';
285
- // The scopes the strip actually offers. Filters out All when
286
- // there is no catalogue to browse — see `catalogueAvailable` above and this
287
- // component's header comment. Connected and Channels are never filtered:
288
- // every deployment has its own connectors and its own inbound channels.
289
- const visibleScopes = catalogueAvailable ? SCOPES : SCOPES.filter((s) => s !== 'all');
290
273
  // The machine list answers 503 on a deployment with computers disabled, so
291
274
  // the Computer card shows only where a computer can be connected.
292
275
  const computersEnabled = useTunnelConnections({ refetchInterval: false }).isSuccess;
293
276
  const catalog = useCatalog(projectId, query, {
294
277
  enabled: catalogActive,
295
- discoverEnabled,
296
- mcpApps,
297
278
  computers: computersEnabled,
279
+ oneClick,
280
+ kinds,
298
281
  });
299
282
  const filtered = useMemo(() => filterConnectors(connectors, { query, describe: describeConnector }), [connectors, query, describeConnector]);
300
283
  // The All tab shows the project's own connectors too (KRTX-2531): a
@@ -306,19 +289,22 @@ export function ConnectorsPage({ projectId }) {
306
289
  const emptyKind = catalogEmptyKind(connectors.length, filtered.length);
307
290
  // One card shape for the project's own connectors: the Connected tab's grid
308
291
  // and the All tab's "Your connectors" section (KRTX-2531) render it alike.
309
- const ownConnectorCard = (connector) => (_jsx(CatalogCard, { variant: "plain", leading: _jsx(ConnectorAppIcon, { connector: connector, size: "lg" }), title: connectorDisplayName(connector), subtitle: _jsx("span", { className: "text-muted-foreground text-xs", children: describeConnector(connector) }), badges: _jsx(ConnectorStatusBadge, { connector: connector }), trailing: connectorSetupStatus(connector) === 'connected' ? _jsx(ConnectorConnectedMark, {}) : undefined, href: connectorHref(projectId, connector.slug) }, connector.slug));
310
- // The Computer card opens the existing computer connector once there is
311
- // one: adding a computer is adding an account to it.
312
- const computerConnector = connectors.find((connector) => connector.provider === 'computer');
313
- const catalogHref = useCallback((entry) => {
314
- const app = appRefFromEntry(entry);
315
- if (app)
316
- return appHref(projectId, app);
317
- return computerConnector ? connectorHref(projectId, computerConnector.slug) : null;
318
- }, [computerConnector, projectId]);
319
- // Stable, like `catalogHref`: the browse cards are `memo`'d, and an inline
320
- // arrow here would re-render every one of them on each page render.
321
- const openComputer = useCallback(() => setComputerOpen(true), []);
292
+ const ownConnectorCard = (connector) => (_jsx(CatalogCard, { variant: "plain", leading: _jsx(ConnectorLogo, { source: installedConnectorLogoSource(connector), size: "lg" }), title: connectorDisplayName(connector), subtitle: _jsx("span", { className: "text-muted-foreground text-xs", children: describeConnector(connector) }), badges: _jsx(ConnectorStatusBadge, { connector: connector }), trailing: connectorSetupStatus(connector) === 'connected' ? _jsx(ConnectorConnectedMark, {}) : undefined, href: connectorHref(projectId, connector.slug) }, connector.slug));
293
+ // Quiet on purpose: a filter, not a second tab strip.
294
+ const catalogFilters = (_jsxs("div", { className: "flex items-center gap-4", children: [_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(Button, { type: "button", variant: "text", size: "sm", className: cn('gap-1 px-0 transition-colors', kindFilter !== 'all' && 'text-foreground'), "aria-label": tPages('typeFilterLabel'), children: [kindFilter === 'all'
295
+ ? tPages('typeFilterAll')
296
+ : kindFilter === 'kortix'
297
+ ? tPages('typeFilterKortix')
298
+ : wayKindLabel(kindFilter), _jsx(CaretDownIcon, { className: "size-3 shrink-0" })] }) }), _jsx(DropdownMenuContent, { align: "end", className: "w-40",
299
+ // A pointer pick returns no focus ring to the quiet trigger.
300
+ onCloseAutoFocus: (event) => event.preventDefault(), children: _jsx(DropdownMenuRadioGroup, { value: kindFilter, onValueChange: (next) => setKindFilter(next), children: Object.keys(CATALOG_KIND_FILTERS).map((value) => (_jsx(DropdownMenuRadioItem, { value: value, children: value === 'all'
301
+ ? tPages('typeFilterAll')
302
+ : value === 'kortix'
303
+ ? tPages('typeFilterKortix')
304
+ : wayKindLabel(value) }, value))) }) })] }), _jsx(Switch, { label: tPages('oneClickOnly'), checked: oneClick, onCheckedChange: setOneClick, className: "px-0 py-0" })] }));
305
+ // Stable: the browse cards are `memo`'d, and an inline arrow here would
306
+ // re-render every one of them on each page render.
307
+ const catalogHref = useCallback((entry) => appHref(projectId, appRefFromEntry(entry)), [projectId]);
322
308
  // The search field is the page's main control: focused on arrival, and "/"
323
309
  // jumps back to it (`useSlashFocus`).
324
310
  const searchRef = useRef(null);
@@ -347,32 +333,17 @@ export function ConnectorsPage({ projectId }) {
347
333
  label: tI18nComplete.raw('text90ccaee30bdc'),
348
334
  description: tI18nComplete.raw('textb0fbe9dc1fcc'),
349
335
  onSelect: () => setPanel('custom'),
350
- } })) : undefined, filters:
351
- // A strip of one tab is not a choice, so it collapses to no strip at
352
- // all when only one scope is reachable — `CapabilityPageShell` drops
353
- // the whole row when this is `undefined`, which is why it must not be
354
- // a bare fragment. With Channels in the mix a catalogue-less
355
- // deployment still has two real destinations (Connected, Channels),
356
- // so the strip survives losing All; it only disappears
357
- // entirely for the narrower case of neither existing.
358
- visibleScopes.length > 1 ? (_jsxs(_Fragment, { children: [_jsx(Tabs, { value: scope, onValueChange: (value) => setScope(value), children: _jsx(TabsList, { children: visibleScopes.map((value) => (_jsx(TabsTrigger, { value: value, children: SCOPE_LABEL[value] }, value))) }) }), _jsx(Button, { type: "button", variant: "text", size: "sm", onClick: () => setRulesOpen(true), className: "ml-auto px-0 transition-colors", children: tI18nComplete.raw('text1d59a5e09714') })] })) : undefined, children: [channelsActive ? (
336
+ } })) : undefined, filters: (_jsxs(_Fragment, { children: [_jsx(Tabs, { value: scope, onValueChange: (value) => setScope(value), children: _jsx(TabsList, { children: SCOPES.map((value) => (_jsx(TabsTrigger, { value: value, children: SCOPE_LABEL[value] }, value))) }) }), _jsx(Button, { type: "button", variant: "text", size: "sm", onClick: () => setRulesOpen(true), className: "ml-auto px-0 transition-colors", children: tI18nComplete.raw('text1d59a5e09714') })] })), children: [channelsActive ? (
359
337
  /* The whole of what used to be `/projects/<id>/channels`, minus the
360
338
  shell it used to bring — this page's `CapabilityPageShell` is the
361
339
  one column, the one heading and the one scroll container now. */
362
- _jsx(ChannelsSection, { projectId: projectId })) : catalogActive ? (_jsxs(_Fragment, { children: [ownMatches.length > 0 ? (_jsxs("div", { className: "space-y-3", children: [_jsx("h2", { className: "text-sm font-medium", children: tPages('yourConnectors') }), _jsx(CatalogGrid, { dense: true, isLoading: false, isError: false, onRetry: retry, isEmpty: false, empty: null, children: ownMatches.map(ownConnectorCard) })] })) : null, _jsx(ConnectorBrowse, { state: catalog, connectedKeys: connectedKeys, hrefFor: catalogHref, onOpen: openComputer, install: catalogInstall, emptyTitle: tI18nComplete.raw('text3a63271cafc1'), emptyDescription: tI18nComplete.raw('textf652a621153e'),
340
+ _jsx(ChannelsSection, { projectId: projectId })) : catalogActive ? (_jsxs(_Fragment, { children: [ownMatches.length > 0 ? (_jsxs("div", { className: "space-y-3", children: [_jsx("h2", { className: "text-sm font-medium", children: tPages('yourConnectors') }), _jsx(CatalogGrid, { dense: true, isLoading: false, isError: false, onRetry: retry, isEmpty: false, empty: null, children: ownMatches.map(ownConnectorCard) })] })) : null, _jsxs("div", { className: "flex flex-wrap items-center justify-between gap-x-4 gap-y-2", children: [_jsx("h2", { className: "text-sm font-medium", children: tPages('allApps') }), catalogFilters] }), _jsx(ConnectorBrowse, { state: catalog, connectedKeys: connectedKeys, hrefFor: catalogHref, install: catalogInstall, emptyTitle: tI18nComplete.raw('text3a63271cafc1'), emptyDescription: tI18nComplete.raw('textf652a621153e'),
363
341
  // A slug search that only the project's own connector answers
364
342
  // must not ALSO read "No matches" under its card (KRTX-2531).
365
343
  suppressNoMatch: ownMatches.length > 0 })] })) : (_jsxs(_Fragment, { children: [_jsx(ConnectorMovesBanner, { projectId: projectId }), _jsx(CatalogGrid, { dense: true,
366
344
  // `!settled`, not `connectorsQuery.isLoading`: the empty state's
367
345
  // wording depends on `projectQuery` too. Same gate as the filter row.
368
- isLoading: !settled, isError: isError, error: connectorsQuery.error ?? projectQuery.error, onRetry: retry, isEmpty: emptyKind !== null, empty: emptyKind === 'no-match' ? (_jsx(CatalogNoMatch, { query: query })) : (_jsx(EmptyState, { icon: PlugIcon, size: "sm", title: tI18nComplete.raw('text51ae0a7e3783'), description: tI18nComplete.raw('texta3487dfc2132'),
369
- // The CTA goes with the tab it opens. With no catalogue on this
370
- // deployment it would be a button to a tab that is not there;
371
- // `+` is the remaining way in, and it is already in the header.
372
- action: catalogueAvailable ? (_jsx(Button, { size: "sm", variant: "secondary", onClick: () => setScope('all'), children: tI18nComplete.raw('text45bfe4f17af7') })) : undefined })), children: filtered.map(ownConnectorCard) })] })), _jsx(ComputerConnectModal, { projectId: projectId, open: computerOpen, onOpenChange: setComputerOpen, onConnected: (connection) => {
373
- invalidate();
374
- router.push(connectorHref(projectId, connection.connector_alias));
375
- } }), _jsx(AddMcpServerDialog, { projectId: projectId, app: mcpApp, open: panel === 'mcp', onOpenChange: (open) => setPanel(open ? 'mcp' : null), takenSlugs: connectors.map((connector) => connector.slug), onAdded: invalidate }, mcpApp?.url ?? 'paste'), _jsx(Modal, { open: panel === 'custom', onOpenChange: (open) => !open && setPanel(null), children: _jsxs(ModalContent, { className: "lg:max-w-3xl", children: [_jsxs(ModalHeader, { children: [_jsx(ModalTitle, { children: tI18nComplete.raw('text90ccaee30bdc') }), _jsx(ModalDescription, { children: tI18nComplete.raw('textd2f3be0047c4') })] }), _jsx(ModalBody, { className: "max-h-[75vh] overflow-y-auto", children: _jsx(CustomConnectorForm, { projectId: projectId, emailChannelEnabled: emailChannelEnabled, onAdded: (slug, { addAccount }) => {
346
+ isLoading: !settled, isError: isError, error: connectorsQuery.error ?? projectQuery.error, onRetry: retry, isEmpty: emptyKind !== null, empty: emptyKind === 'no-match' ? (_jsx(CatalogNoMatch, { query: query })) : (_jsx(EmptyState, { icon: PlugIcon, size: "sm", title: tI18nComplete.raw('text51ae0a7e3783'), description: tI18nComplete.raw('texta3487dfc2132'), action: _jsx(Button, { size: "sm", variant: "secondary", onClick: () => setScope('all'), children: tI18nComplete.raw('text45bfe4f17af7') }) })), children: filtered.map(ownConnectorCard) })] })), _jsx(AddMcpServerDialog, { projectId: projectId, app: mcpApp, open: panel === 'mcp', onOpenChange: (open) => setPanel(open ? 'mcp' : null), takenSlugs: connectors.map((connector) => connector.slug), onAdded: invalidate }, mcpApp?.url ?? 'paste'), installRequest ? (_jsx(InstallDialog, { appName: installRequest.target.appName, way: installRequest.way, open: true, pending: false, onOpenChange: (open) => !open && setInstallRequest(null), onConfirm: confirmInstall }, installRequest.target.appName)) : null, _jsx(Modal, { open: panel === 'custom', onOpenChange: (open) => !open && setPanel(null), children: _jsxs(ModalContent, { className: "lg:max-w-3xl", children: [_jsxs(ModalHeader, { children: [_jsx(ModalTitle, { children: tI18nComplete.raw('text90ccaee30bdc') }), _jsx(ModalDescription, { children: tI18nComplete.raw('textd2f3be0047c4') })] }), _jsx(ModalBody, { className: "max-h-[75vh] overflow-y-auto", children: _jsx(CustomConnectorForm, { projectId: projectId, onAdded: (slug, { addAccount }) => {
376
347
  invalidate();
377
348
  setPanel(null);
378
349
  router.push(connectorHref(projectId, slug, { addAccount }));