@kortix/ui 0.14.8 → 0.14.10

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 (567) hide show
  1. package/README.md +2 -2
  2. package/dist/_vendor/kortix-shared.js +116 -3
  3. package/dist/_vendor/shared/app-config.d.ts +175 -0
  4. package/dist/_vendor/shared/artifact-comments.d.ts +235 -0
  5. package/dist/_vendor/shared/channel-descriptors.d.ts +96 -0
  6. package/dist/_vendor/shared/channel-message.d.ts +45 -5
  7. package/dist/_vendor/shared/index.d.ts +2 -0
  8. package/dist/_vendor/shared/space-slug.d.ts +37 -0
  9. package/dist/access/access/access-detail-shell.js +1 -1
  10. package/dist/access/access/principal-picker.d.ts +11 -0
  11. package/dist/access/access/principal-picker.js +3 -2
  12. package/dist/apps/app-preview-pool.d.ts +7 -2
  13. package/dist/apps/app-preview-pool.js +30 -7
  14. package/dist/apps/app-shared.d.ts +22 -15
  15. package/dist/apps/app-shared.js +37 -19
  16. package/dist/apps/index.d.ts +2 -2
  17. package/dist/apps/index.js +2 -2
  18. package/dist/artifacts/artifact-frame.d.ts +16 -0
  19. package/dist/artifacts/artifact-frame.js +55 -0
  20. package/dist/artifacts/artifact-session.d.ts +18 -0
  21. package/dist/artifacts/artifact-session.js +101 -0
  22. package/dist/artifacts/frame-policy.d.ts +30 -0
  23. package/dist/artifacts/frame-policy.js +61 -0
  24. package/dist/artifacts/index.d.ts +3 -0
  25. package/dist/artifacts/index.js +5 -0
  26. package/dist/browser/sandbox-browser-chrome.d.ts +4 -1
  27. package/dist/browser/sandbox-browser-chrome.js +2 -2
  28. package/dist/customize/agents/agent-grant-pages.d.ts +5 -1
  29. package/dist/customize/agents/agent-grant-pages.js +30 -4
  30. package/dist/customize/agents/agent-page.js +3 -1
  31. package/dist/customize/agents/agent-policy-sets.d.ts +43 -0
  32. package/dist/customize/agents/agent-policy-sets.js +72 -0
  33. package/dist/customize/agents/agent-triggers-section.js +2 -1
  34. package/dist/customize/connectors/add-mcp/add-mcp-server-dialog.d.ts +6 -1
  35. package/dist/customize/connectors/add-mcp/add-mcp-server-dialog.js +10 -4
  36. package/dist/customize/connectors/agent-access.d.ts +35 -0
  37. package/dist/customize/connectors/agent-access.js +77 -0
  38. package/dist/customize/connectors/catalog/browse-sections.d.ts +2 -29
  39. package/dist/customize/connectors/catalog/browse-sections.js +7 -74
  40. package/dist/customize/connectors/catalog/catalog-entry.d.ts +18 -37
  41. package/dist/customize/connectors/catalog/catalog-entry.js +28 -40
  42. package/dist/customize/connectors/catalog/connector-browse.d.ts +3 -32
  43. package/dist/customize/connectors/catalog/connector-browse.js +19 -50
  44. package/dist/customize/connectors/catalog/use-catalog.d.ts +20 -59
  45. package/dist/customize/connectors/catalog/use-catalog.js +48 -175
  46. package/dist/customize/connectors/connector-identity.d.ts +9 -11
  47. package/dist/customize/connectors/connector-identity.js +13 -42
  48. package/dist/customize/connectors/connector-moves-banner.d.ts +2 -1
  49. package/dist/customize/connectors/connector-moves-banner.js +4 -6
  50. package/dist/customize/connectors/connector-routes.d.ts +21 -9
  51. package/dist/customize/connectors/connector-routes.js +29 -20
  52. package/dist/customize/connectors/connectors-page.js +53 -82
  53. package/dist/customize/connectors/detail/app-page.js +226 -98
  54. package/dist/customize/connectors/detail/computer-app-page.d.ts +16 -0
  55. package/dist/customize/connectors/detail/computer-app-page.js +39 -0
  56. package/dist/customize/connectors/detail/connector-accounts.js +3 -1
  57. package/dist/customize/connectors/detail/connector-advanced-tools.d.ts +4 -1
  58. package/dist/customize/connectors/detail/connector-advanced-tools.js +2 -2
  59. package/dist/customize/connectors/detail/connector-agents.d.ts +14 -0
  60. package/dist/customize/connectors/detail/connector-agents.js +69 -0
  61. package/dist/customize/connectors/detail/connector-detail-tabs.js +2 -1
  62. package/dist/customize/connectors/detail/connector-move-row.d.ts +8 -5
  63. package/dist/customize/connectors/detail/connector-move-row.js +23 -14
  64. package/dist/customize/connectors/detail/connector-page.d.ts +4 -1
  65. package/dist/customize/connectors/detail/connector-page.js +14 -10
  66. package/dist/customize/connectors/detail/connector-policy-sets.d.ts +28 -0
  67. package/dist/customize/connectors/detail/connector-policy-sets.js +203 -0
  68. package/dist/customize/connectors/detail/connector-settings.d.ts +4 -1
  69. package/dist/customize/connectors/detail/connector-settings.js +7 -3
  70. package/dist/customize/connectors/detail/connector-status.d.ts +19 -6
  71. package/dist/customize/connectors/detail/connector-status.js +34 -10
  72. package/dist/customize/connectors/detail/connector-tabs.d.ts +4 -1
  73. package/dist/customize/connectors/detail/connector-tabs.js +8 -2
  74. package/dist/customize/connectors/detail/connector-tools.d.ts +3 -3
  75. package/dist/customize/connectors/detail/connector-tools.js +105 -48
  76. package/dist/customize/connectors/detail/email-inboxes.d.ts +43 -0
  77. package/dist/customize/connectors/detail/email-inboxes.js +184 -0
  78. package/dist/customize/connectors/detail/provider-info.d.ts +1 -1
  79. package/dist/customize/connectors/detail/provider-info.js +2 -2
  80. package/dist/customize/connectors/detail/status-badge.d.ts +1 -1
  81. package/dist/customize/connectors/detail/status-badge.js +4 -5
  82. package/dist/customize/connectors/detail/use-connector-detail.d.ts +6 -0
  83. package/dist/customize/connectors/detail/use-connector-detail.js +14 -4
  84. package/dist/customize/connectors/install/install-dialog.d.ts +23 -0
  85. package/dist/customize/connectors/install/install-dialog.js +40 -0
  86. package/dist/customize/connectors/install/install.d.ts +13 -2
  87. package/dist/customize/connectors/install/install.js +9 -4
  88. package/dist/customize/connectors/install/use-install.d.ts +19 -2
  89. package/dist/customize/connectors/install/use-install.js +65 -37
  90. package/dist/customize/connectors/install/way-kind.d.ts +5 -0
  91. package/dist/customize/connectors/install/way-kind.js +16 -0
  92. package/dist/customize/connectors/provider-label.d.ts +2 -1
  93. package/dist/customize/connectors/provider-label.js +13 -3
  94. package/dist/customize/connectors/tools/pattern-rule-draft.d.ts +4 -0
  95. package/dist/customize/connectors/tools/pattern-rule-draft.js +12 -3
  96. package/dist/customize/connectors/tools/policy-sets.d.ts +27 -0
  97. package/dist/customize/connectors/tools/policy-sets.js +41 -0
  98. package/dist/customize/connectors/tools/tool-groups.d.ts +32 -9
  99. package/dist/customize/connectors/tools/tool-groups.js +78 -16
  100. package/dist/customize/connectors/tools/tool-policy-control.d.ts +11 -10
  101. package/dist/customize/connectors/tools/tool-policy-control.js +15 -16
  102. package/dist/customize/connectors/tools/tool-policy-labels.d.ts +6 -5
  103. package/dist/customize/connectors/tools/tool-policy-labels.js +17 -16
  104. package/dist/customize/connectors/tools/tool-policy.d.ts +50 -4
  105. package/dist/customize/connectors/tools/tool-policy.js +74 -8
  106. package/dist/customize/connectors/use-agent-access.d.ts +85 -0
  107. package/dist/customize/connectors/use-agent-access.js +72 -0
  108. package/dist/customize/migrate-to-v2/index.d.ts +1 -2
  109. package/dist/customize/migrate-to-v2/index.js +1 -2
  110. package/dist/customize/migrate-to-v2/migration-prompt.d.ts +12 -25
  111. package/dist/customize/migrate-to-v2/migration-prompt.js +34 -236
  112. package/dist/customize/migrate-to-v2/upgrade-defs.d.ts +1 -1
  113. package/dist/customize/migrate-to-v2/upgrade-defs.js +7 -6
  114. package/dist/customize/migrate-to-v2/upgrade-view.js +7 -7
  115. package/dist/customize/migrate-to-v2/use-run-upgrade.d.ts +3 -3
  116. package/dist/customize/providers/provider-accordion.js +17 -2
  117. package/dist/customize/sections/component/channel-access-panel.d.ts +16 -0
  118. package/dist/customize/sections/component/channel-access-panel.js +146 -0
  119. package/dist/customize/sections/component/channel-connect-hero.d.ts +3 -2
  120. package/dist/customize/sections/component/channel-connect-hero.js +3 -2
  121. package/dist/customize/sections/component/channel-hero-frame.d.ts +31 -0
  122. package/dist/customize/sections/component/channel-hero-frame.js +40 -0
  123. package/dist/customize/sections/component/channel-mocks.d.ts +6 -0
  124. package/dist/customize/sections/component/channel-mocks.js +46 -0
  125. package/dist/customize/sections/component/channel-row.d.ts +13 -3
  126. package/dist/customize/sections/component/channel-row.js +10 -4
  127. package/dist/customize/sections/component/email-connect-form.d.ts +27 -0
  128. package/dist/customize/sections/component/email-connect-form.js +183 -0
  129. package/dist/customize/sections/component/slack-connect-card.d.ts +7 -0
  130. package/dist/customize/sections/component/slack-connect-card.js +2 -3
  131. package/dist/customize/sections/component/teams-connect-card.d.ts +7 -0
  132. package/dist/customize/sections/component/teams-connect-card.js +2 -3
  133. package/dist/customize/sections/component/telegram-channel-row.js +21 -28
  134. package/dist/customize/sections/connectors-view.d.ts +1 -15
  135. package/dist/customize/sections/connectors-view.js +81 -314
  136. package/dist/customize/sections/view/agent-editor-catalog.js +10 -0
  137. package/dist/customize/sections/view/channels-view.d.ts +6 -1
  138. package/dist/customize/sections/view/channels-view.js +72 -81
  139. package/dist/customize/sections/view/gateway/gateway-overview.js +10 -2
  140. package/dist/customize/settings/rail.js +9 -0
  141. package/dist/customize/settings/settings-tabs.d.ts +1 -1
  142. package/dist/customize/settings/settings-tabs.js +1 -0
  143. package/dist/customize/settings/tabs/chrome-connections-tab.d.ts +6 -0
  144. package/dist/customize/settings/tabs/chrome-connections-tab.js +99 -0
  145. package/dist/customize/settings/tabs/experimental-tab.js +35 -16
  146. package/dist/customize/shared/catalog/catalog-empty-state.d.ts +4 -15
  147. package/dist/customize/shared/catalog/catalog-empty-state.js +9 -7
  148. package/dist/customize/shared/channels-switch-dialog.d.ts +18 -0
  149. package/dist/customize/shared/channels-switch-dialog.js +30 -0
  150. package/dist/customize/shared/feature-gate-screen.js +27 -9
  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/triggers/schedule/post-to-field.d.ts +18 -0
  154. package/dist/customize/triggers/schedule/post-to-field.js +49 -0
  155. package/dist/customize/triggers/schedule/schedule-copy.d.ts +10 -6
  156. package/dist/customize/triggers/schedule/schedule-copy.js +42 -11
  157. package/dist/customize/triggers/schedule/schedule-detail-sheet.js +2 -1
  158. package/dist/customize/triggers/schedule/trigger-composer-logic.d.ts +22 -0
  159. package/dist/customize/triggers/schedule/trigger-composer-logic.js +25 -0
  160. package/dist/customize/triggers/schedule/trigger-composer.d.ts +5 -0
  161. package/dist/customize/triggers/schedule/trigger-composer.js +23 -14
  162. package/dist/customize/triggers/schedule/trigger-edit-logic.js +3 -0
  163. package/dist/customize/triggers/schedule/trigger-filter.js +1 -1
  164. package/dist/customize/triggers/schedule/trigger-runs-logic.d.ts +2 -2
  165. package/dist/customize/triggers/schedule/trigger-runs-panel.js +1 -0
  166. package/dist/customize/triggers/schedule/trigger-toast.js +2 -1
  167. package/dist/customize/triggers/schedule-view.js +5 -2
  168. package/dist/files/index.d.ts +1 -0
  169. package/dist/files/index.js +1 -0
  170. package/dist/files/project/change-request-recovery.d.ts +1 -26
  171. package/dist/files/project/change-request-recovery.js +1 -59
  172. package/dist/files/project/components/change-request-detail-dialog.js +13 -3
  173. package/dist/files/project/components/drive-explorer.js +15 -15
  174. package/dist/files/project/components/drive-toolbar.d.ts +16 -2
  175. package/dist/files/project/components/drive-toolbar.js +14 -5
  176. package/dist/files/project/hooks/use-change-request-recovery.js +3 -19
  177. package/dist/files/project/hooks/use-change-requests.d.ts +1 -0
  178. package/dist/files/project/hooks/use-change-requests.js +11 -2
  179. package/dist/files/renderers/image-frame.d.ts +48 -0
  180. package/dist/files/renderers/image-frame.js +59 -0
  181. package/dist/files/renderers/image-renderer.d.ts +11 -1
  182. package/dist/files/renderers/image-renderer.js +13 -3
  183. package/dist/files/renderers/pdf/pdf-clipboard.d.ts +2 -0
  184. package/dist/files/renderers/pdf/pdf-clipboard.js +21 -0
  185. package/dist/files/renderers/pdf/pdf-viewer.js +4 -2
  186. package/dist/files/renderers/show-content-renderer.d.ts +9 -1
  187. package/dist/files/renderers/show-content-renderer.js +56 -14
  188. package/dist/files/runtime/file-source.js +2 -0
  189. package/dist/files/runtime/hooks/use-binary-blob.d.ts +10 -1
  190. package/dist/files/runtime/hooks/use-binary-blob.js +10 -4
  191. package/dist/files/runtime/hooks/use-shared-image.d.ts +41 -0
  192. package/dist/files/runtime/hooks/use-shared-image.js +177 -0
  193. package/dist/files/viewer/file-content-renderer.d.ts +22 -1
  194. package/dist/files/viewer/file-content-renderer.js +50 -7
  195. package/dist/files/viewer/file-header.d.ts +7 -3
  196. package/dist/files/viewer/file-header.js +20 -11
  197. package/dist/files/viewer/file-preview-modal.d.ts +1 -1
  198. package/dist/files/viewer/file-preview-modal.js +10 -22
  199. package/dist/files/viewer/file-source.d.ts +13 -0
  200. package/dist/files/viewer/use-file-content-state.d.ts +2 -0
  201. package/dist/files/viewer/use-file-content-state.js +28 -10
  202. package/dist/files/viewer/viewer-actions.d.ts +3 -1
  203. package/dist/files/viewer/viewer-actions.js +2 -2
  204. package/dist/hooks/use-media-query.d.ts +1 -0
  205. package/dist/hooks/use-mobile.d.ts +5 -0
  206. package/dist/hooks/use-mobile.js +8 -0
  207. package/dist/i18n/en.d.ts +1062 -85
  208. package/dist/i18n/en.js +1078 -101
  209. package/dist/i18n/ui-catalog/localize-ui-catalog.js +4 -0
  210. package/dist/i18n/ui-catalog/remaining-ui-translation-keys.generated.js +15 -3
  211. package/dist/index.d.ts +2 -2
  212. package/dist/index.js +2 -2
  213. package/dist/internal/account-hub/account-settings-sidebar.js +1 -1
  214. package/dist/internal/account-hub/hub-sheet.d.ts +9 -1
  215. package/dist/internal/account-hub/hub-sheet.js +21 -5
  216. package/dist/internal/account-hub/sections.d.ts +1 -1
  217. package/dist/internal/account-hub/sections.js +2 -1
  218. package/dist/internal/apps-and-extensions/apps-modal.d.ts +9 -0
  219. package/dist/internal/apps-and-extensions/apps-modal.js +107 -0
  220. package/dist/internal/auth/auth-card-shell.js +3 -3
  221. package/dist/internal/chrome/browser-icon.d.ts +24 -0
  222. package/dist/internal/chrome/browser-icon.js +58 -0
  223. package/dist/internal/chrome/chrome-card-state.d.ts +16 -0
  224. package/dist/internal/chrome/chrome-card-state.js +9 -0
  225. package/dist/internal/chrome/chrome-connect.d.ts +69 -0
  226. package/dist/internal/chrome/chrome-connect.js +178 -0
  227. package/dist/internal/chrome/chrome-mock.d.ts +4 -0
  228. package/dist/internal/chrome/chrome-mock.js +15 -0
  229. package/dist/internal/chrome/chrome-names.d.ts +15 -0
  230. package/dist/internal/chrome/chrome-names.js +35 -0
  231. package/dist/internal/chrome/extension.d.ts +47 -0
  232. package/dist/internal/chrome/extension.js +91 -0
  233. package/dist/internal/chrome/use-chrome-offered.d.ts +11 -0
  234. package/dist/internal/chrome/use-chrome-offered.js +22 -0
  235. package/dist/internal/components/agent-mark.js +5 -2
  236. package/dist/internal/connector-logo/connector-logo-source.d.ts +64 -0
  237. package/dist/internal/connector-logo/connector-logo-source.js +49 -0
  238. package/dist/internal/connector-logo/connector-logo.d.ts +39 -0
  239. package/dist/internal/connector-logo/connector-logo.js +56 -0
  240. package/dist/internal/connector-logo/connector-mark-files.d.ts +11 -0
  241. package/dist/internal/connector-logo/connector-mark-files.js +35 -0
  242. package/dist/internal/files/file-read-retry.d.ts +13 -0
  243. package/dist/internal/files/file-read-retry.js +23 -3
  244. package/dist/internal/files/session-drive-files.d.ts +5 -1
  245. package/dist/internal/files/session-drive-files.js +7 -2
  246. package/dist/internal/hooks/channels/use-channels-installations.d.ts +32 -5
  247. package/dist/internal/hooks/channels/use-channels-installations.js +55 -7
  248. package/dist/internal/hooks/channels/use-email-inboxes.d.ts +19 -0
  249. package/dist/internal/hooks/channels/use-email-inboxes.js +48 -0
  250. package/dist/internal/hooks/connectors/use-add-account.js +1 -1
  251. package/dist/internal/hooks/index.d.ts +1 -1
  252. package/dist/internal/hooks/index.js +1 -1
  253. package/dist/internal/hooks/projects/use-new-project-session.d.ts +9 -0
  254. package/dist/internal/hooks/projects/use-new-project-session.js +28 -12
  255. package/dist/internal/hooks/use-auto-scroll.d.ts +8 -1
  256. package/dist/internal/hooks/use-auto-scroll.js +4 -4
  257. package/dist/internal/icons/edge.d.ts +5 -0
  258. package/dist/internal/icons/edge.js +10 -0
  259. package/dist/internal/icons/telegram.d.ts +5 -0
  260. package/dist/internal/icons/telegram.js +6 -1
  261. package/dist/internal/layout/nav-hover-card.d.ts +35 -0
  262. package/dist/internal/layout/nav-hover-card.js +84 -0
  263. package/dist/internal/layout/project-nav-row.d.ts +3 -1
  264. package/dist/internal/layout/project-nav-row.js +3 -2
  265. package/dist/internal/layout/project-page-header.d.ts +4 -2
  266. package/dist/internal/layout/project-page-header.js +4 -3
  267. package/dist/internal/layout/project-settings-nav.js +59 -2
  268. package/dist/internal/lib/browser-error-noise.d.ts +1 -1
  269. package/dist/internal/lib/browser-error-noise.js +1 -1
  270. package/dist/internal/lib/browser-noise/rules/extensions.js +17 -3
  271. package/dist/internal/lib/browser-noise/rules/injected-scripts.d.ts +7 -0
  272. package/dist/internal/lib/browser-noise/rules/injected-scripts.js +15 -0
  273. package/dist/internal/lib/detect-os.d.ts +43 -0
  274. package/dist/internal/lib/detect-os.js +70 -0
  275. package/dist/internal/lib/manifest-version.d.ts +1 -1
  276. package/dist/internal/lib/manifest-version.js +2 -2
  277. package/dist/internal/lib/memory-href.d.ts +16 -0
  278. package/dist/internal/lib/memory-href.js +46 -0
  279. package/dist/internal/lib/use-project-feature-flags.js +13 -9
  280. package/dist/internal/lib/utils/heic-convert.d.ts +1 -1
  281. package/dist/internal/lib/utils/heic-convert.js +3 -4
  282. package/dist/internal/lib/web-notifications.d.ts +20 -0
  283. package/dist/internal/lib/web-notifications.js +48 -4
  284. package/dist/internal/notifications/notification-bell.d.ts +4 -1
  285. package/dist/internal/notifications/notification-bell.js +2 -2
  286. package/dist/internal/selection/selection-bar.d.ts +2 -1
  287. package/dist/internal/selection/selection-bar.js +1 -1
  288. package/dist/internal/stores/apps-modal-store.d.ts +8 -0
  289. package/dist/internal/stores/apps-modal-store.js +6 -0
  290. package/dist/internal/stores/composer-prefill-store.d.ts +12 -5
  291. package/dist/internal/stores/file-preview-store.d.ts +29 -2
  292. package/dist/internal/stores/file-preview-store.js +19 -1
  293. package/dist/internal/stores/kortix-computer-store.js +3 -0
  294. package/dist/internal/stores/sidebar-nav-store.d.ts +1 -1
  295. package/dist/internal/stores/sidebar-nav-store.js +3 -1
  296. package/dist/lib/routes.d.ts +13 -1
  297. package/dist/lib/routes.js +13 -0
  298. package/dist/markdown/index.d.ts +2 -1
  299. package/dist/markdown/index.js +2 -1
  300. package/dist/markdown/setup-links/approval-decision.d.ts +1 -0
  301. package/dist/markdown/setup-links/approval-decision.js +9 -3
  302. package/dist/markdown/setup-links/connector-handshake.d.ts +3 -1
  303. package/dist/markdown/setup-links/connector-handshake.js +12 -10
  304. package/dist/markdown/setup-links/secret-intake-form.d.ts +0 -10
  305. package/dist/markdown/setup-links/secret-intake-form.js +1 -1
  306. package/dist/markdown/setup-links/show-connect-hero.d.ts +28 -0
  307. package/dist/markdown/setup-links/show-connect-hero.js +91 -0
  308. package/dist/markdown/unified-markdown.js +5 -5
  309. package/dist/primitives/badge.d.ts +1 -1
  310. package/dist/primitives/badge.js +2 -0
  311. package/dist/primitives/disclosure.js +14 -2
  312. package/dist/primitives/empty-art.d.ts +12 -0
  313. package/dist/primitives/empty-art.js +11 -0
  314. package/dist/primitives/empty-state.d.ts +2 -2
  315. package/dist/primitives/empty-state.js +6 -5
  316. package/dist/primitives/mermaid-renderer.d.ts +2 -0
  317. package/dist/primitives/mermaid-renderer.js +21 -15
  318. package/dist/primitives/resizable.js +6 -1
  319. package/dist/primitives/resize-seam.d.ts +11 -0
  320. package/dist/primitives/resize-seam.js +12 -0
  321. package/dist/primitives/sidebar-panel.js +4 -7
  322. package/dist/primitives/tabs.d.ts +14 -1
  323. package/dist/primitives/tabs.js +1 -1
  324. package/dist/providers/ui-provider.d.ts +9 -0
  325. package/dist/session/composer/ComposerAboveCard.d.ts +1 -1
  326. package/dist/session/composer/ComposerAboveCard.js +2 -2
  327. package/dist/session/composer/ComposerCard.d.ts +1 -1
  328. package/dist/session/composer/ComposerCard.js +3 -3
  329. package/dist/session/composer/agent-selector.d.ts +13 -1
  330. package/dist/session/composer/agent-selector.js +25 -5
  331. package/dist/session/composer/composer-agent-access.d.ts +15 -0
  332. package/dist/session/composer/composer-agent-access.js +27 -0
  333. package/dist/session/composer/composer-chat-input.d.ts +8 -2
  334. package/dist/session/composer/composer-chat-input.js +8 -6
  335. package/dist/session/composer/composer-logic.d.ts +16 -0
  336. package/dist/session/composer/composer-logic.js +12 -0
  337. package/dist/session/composer/composer-underbar.d.ts +3 -1
  338. package/dist/session/composer/composer-underbar.js +4 -3
  339. package/dist/session/composer/composer.d.ts +15 -1
  340. package/dist/session/composer/composer.js +19 -1
  341. package/dist/session/composer/draft/composer-draft.d.ts +6 -2
  342. package/dist/session/composer/draft/composer-draft.js +5 -1
  343. package/dist/session/composer/reasoning-effort-selector.js +1 -1
  344. package/dist/session/models/chatgpt-connection-button.d.ts +11 -0
  345. package/dist/session/models/chatgpt-connection-button.js +54 -0
  346. package/dist/session/models/model-selector.js +5 -2
  347. package/dist/session/models/use-model-connection-gate.d.ts +5 -5
  348. package/dist/session/models/use-model-connection-gate.js +5 -5
  349. package/dist/session/outcomes/jump-to-outcome.d.ts +10 -0
  350. package/dist/session/outcomes/jump-to-outcome.js +11 -0
  351. package/dist/session/outcomes/session-outcomes-bridge.d.ts +14 -0
  352. package/dist/session/outcomes/session-outcomes-bridge.js +12 -0
  353. package/dist/session/outcomes/session-outcomes-provider.d.ts +3 -1
  354. package/dist/session/outcomes/session-outcomes-provider.js +33 -3
  355. package/dist/session/panel/easy/app-preview.d.ts +10 -0
  356. package/dist/session/panel/easy/app-preview.js +31 -12
  357. package/dist/session/panel/easy/change-requests-card.d.ts +7 -0
  358. package/dist/session/panel/easy/change-requests-card.js +17 -0
  359. package/dist/session/panel/easy/easy-panel-logic.js +7 -1
  360. package/dist/session/panel/easy/easy-panel.js +5 -2
  361. package/dist/session/panel/easy/file-preview.js +1 -1
  362. package/dist/session/panel/easy/outputs-card.d.ts +2 -1
  363. package/dist/session/panel/easy/outputs-card.js +3 -2
  364. package/dist/session/panel/mobile-tool-drawer.js +7 -1
  365. package/dist/session/panel/session-audit-panel.js +9 -2
  366. package/dist/session/panel/session-audit-shared.js +3 -1
  367. package/dist/session/panel/session-detail-panel.js +9 -3
  368. package/dist/session/panel/session-files-explorer.d.ts +9 -0
  369. package/dist/session/panel/session-files-explorer.js +12 -3
  370. package/dist/session/panel/session-panel-provider.d.ts +15 -1
  371. package/dist/session/panel/session-panel-provider.js +32 -7
  372. package/dist/session/panel/shared/derive-panels.d.ts +8 -1
  373. package/dist/session/panel/shared/derive-panels.js +12 -2
  374. package/dist/session/panel/shared/output-priority.js +2 -0
  375. package/dist/session/participants/session-participants.d.ts +8 -2
  376. package/dist/session/participants/session-participants.js +11 -4
  377. package/dist/session/prompts/approval-request.d.ts +5 -0
  378. package/dist/session/prompts/approval-request.js +9 -1
  379. package/dist/session/prompts/session-approval-review.d.ts +9 -0
  380. package/dist/session/prompts/session-approval-review.js +18 -0
  381. package/dist/session/status/session-error-banner.js +2 -49
  382. package/dist/session/status/session-starting-loader.d.ts +14 -2
  383. package/dist/session/status/session-starting-loader.js +16 -4
  384. package/dist/session/thread/after-first-prompt.d.ts +7 -0
  385. package/dist/session/thread/after-first-prompt.js +8 -0
  386. package/dist/session/thread/detect-command.d.ts +12 -0
  387. package/dist/session/thread/detect-command.js +20 -0
  388. package/dist/session/thread/session-chat.d.ts +3 -1
  389. package/dist/session/thread/session-chat.js +377 -252
  390. package/dist/session/thread/session-thread.d.ts +15 -1
  391. package/dist/session/thread/session-thread.js +20 -3
  392. package/dist/session/thread/session-transcript-class.d.ts +5 -1
  393. package/dist/session/thread/session-transcript-class.js +5 -1
  394. package/dist/session/thread/thread-boot-rows.d.ts +36 -0
  395. package/dist/session/thread/thread-boot-rows.js +89 -0
  396. package/dist/session/thread/transcript-rows.d.ts +31 -0
  397. package/dist/session/thread/transcript-rows.js +3 -0
  398. package/dist/session/thread/transcript.d.ts +0 -9
  399. package/dist/session/thread/transcript.js +104 -19
  400. package/dist/session/tool/shared/infrastructure-contexts.d.ts +28 -0
  401. package/dist/session/tool/shared/infrastructure-contexts.js +31 -3
  402. package/dist/session/tool/tool-part-renderer.d.ts +5 -4
  403. package/dist/session/tool/tool-part-renderer.js +8 -3
  404. package/dist/session/tool/tools/bash-tool.js +7 -6
  405. package/dist/session/tool/tools/channel-send-card.d.ts +1 -2
  406. package/dist/session/tool/tools/channel-send.d.ts +2 -1
  407. package/dist/session/tool/tools/codemode-tool.js +1 -1
  408. package/dist/session/tool/tools/connector-tools.js +1 -1
  409. package/dist/session/tool/tools/image-gen-tool.d.ts +1 -1
  410. package/dist/session/tool/tools/image-gen-tool.js +241 -53
  411. package/dist/session/tool/tools/show-tool.js +19 -8
  412. package/dist/session/turn/channel-brand.d.ts +8 -3
  413. package/dist/session/turn/channel-brand.js +20 -4
  414. package/dist/session/turn/message-author.d.ts +8 -0
  415. package/dist/session/turn/message-author.js +24 -0
  416. package/dist/session/turn/message-row.d.ts +52 -0
  417. package/dist/session/turn/message-row.js +44 -0
  418. package/dist/session/turn/plan-anchor.d.ts +1 -1
  419. package/dist/session/turn/plan-anchor.js +1 -1
  420. package/dist/session/turn/user-message.d.ts +14 -6
  421. package/dist/session/turn/user-message.js +35 -15
  422. package/dist/styles.css +1 -1
  423. package/dist/workspace/home/access-requests-bell.d.ts +9 -2
  424. package/dist/workspace/home/access-requests-bell.js +20 -6
  425. package/dist/workspace/home/first-chat.d.ts +8 -21
  426. package/dist/workspace/home/first-chat.js +22 -72
  427. package/dist/workspace/index.d.ts +6 -0
  428. package/dist/workspace/index.js +6 -0
  429. package/dist/workspace/layout/project-home.d.ts +14 -2
  430. package/dist/workspace/layout/project-home.js +60 -21
  431. package/dist/workspace/layout/use-project-home-send.d.ts +9 -1
  432. package/dist/workspace/layout/use-project-home-send.js +82 -3
  433. package/dist/workspace/memory/body-doc.d.ts +17 -0
  434. package/dist/workspace/memory/body-doc.js +208 -0
  435. package/dist/workspace/memory/body-extensions.d.ts +38 -0
  436. package/dist/workspace/memory/body-extensions.js +103 -0
  437. package/dist/workspace/memory/company-memory-page.d.ts +8 -0
  438. package/dist/workspace/memory/company-memory-page.js +16 -0
  439. package/dist/workspace/memory/memory-all.d.ts +20 -0
  440. package/dist/workspace/memory/memory-all.js +27 -0
  441. package/dist/workspace/memory/memory-body.d.ts +19 -0
  442. package/dist/workspace/memory/memory-body.js +139 -0
  443. package/dist/workspace/memory/memory-empty.d.ts +13 -0
  444. package/dist/workspace/memory/memory-empty.js +28 -0
  445. package/dist/workspace/memory/memory-history.d.ts +27 -0
  446. package/dist/workspace/memory/memory-history.js +108 -0
  447. package/dist/workspace/memory/memory-labels.d.ts +16 -0
  448. package/dist/workspace/memory/memory-labels.js +47 -0
  449. package/dist/workspace/memory/memory-page-list.d.ts +34 -0
  450. package/dist/workspace/memory/memory-page-list.js +156 -0
  451. package/dist/workspace/memory/memory-reader.d.ts +58 -0
  452. package/dist/workspace/memory/memory-reader.js +123 -0
  453. package/dist/workspace/memory/memory-view.d.ts +21 -0
  454. package/dist/workspace/memory/memory-view.js +124 -0
  455. package/dist/workspace/memory/remember-popover.d.ts +19 -0
  456. package/dist/workspace/memory/remember-popover.js +61 -0
  457. package/dist/workspace/memory/remember-this.d.ts +12 -0
  458. package/dist/workspace/memory/remember-this.js +89 -0
  459. package/dist/workspace/memory/source-mark.d.ts +18 -0
  460. package/dist/workspace/memory/source-mark.js +79 -0
  461. package/dist/workspace/memory/used-memory-chip.d.ts +14 -0
  462. package/dist/workspace/memory/used-memory-chip.js +61 -0
  463. package/dist/workspace/new/advanced-fields.d.ts +2 -1
  464. package/dist/workspace/new/advanced-fields.js +2 -2
  465. package/dist/workspace/new/source-param.d.ts +1 -1
  466. package/dist/workspace/new/source-param.js +3 -1
  467. package/dist/workspace/new/use-create-workspace.d.ts +8 -10
  468. package/dist/workspace/new/use-create-workspace.js +3 -3
  469. package/dist/workspace/projects/onboarding/app-logo.d.ts +7 -2
  470. package/dist/workspace/projects/onboarding/app-logo.js +6 -13
  471. package/dist/workspace/projects/policies-panel.js +5 -3
  472. package/dist/workspace/review/review-actions.d.ts +4 -2
  473. package/dist/workspace/review/review-actions.js +8 -2
  474. package/dist/workspace/review/review-center.js +11 -7
  475. package/dist/workspace/review/review-detail.d.ts +10 -0
  476. package/dist/workspace/review/review-detail.js +101 -13
  477. package/dist/workspace/saved-session-skeleton.d.ts +2 -2
  478. package/dist/workspace/saved-session-skeleton.js +3 -3
  479. package/dist/workspace/session-workspace.js +15 -13
  480. package/dist/workspace/sessions/project-sessions-view.js +3 -2
  481. package/dist/workspace/sessions/session-label-badges.js +2 -1
  482. package/dist/workspace/sessions/sessions-toolbar.d.ts +3 -1
  483. package/dist/workspace/sessions/sessions-toolbar.js +2 -2
  484. package/dist/workspace/sidebar/footer/project-apps-nav.d.ts +5 -0
  485. package/dist/workspace/sidebar/footer/project-apps-nav.js +41 -2
  486. package/dist/workspace/sidebar/footer/project-artifacts-nav.d.ts +6 -0
  487. package/dist/workspace/sidebar/footer/project-artifacts-nav.js +22 -0
  488. package/dist/workspace/sidebar/footer/project-chrome-nav.d.ts +10 -0
  489. package/dist/workspace/sidebar/footer/project-chrome-nav.js +56 -0
  490. package/dist/workspace/sidebar/footer/project-manifest-upgrade-alert.js +13 -13
  491. package/dist/workspace/sidebar/footer/project-memory-nav.d.ts +7 -0
  492. package/dist/workspace/sidebar/footer/project-memory-nav.js +19 -0
  493. package/dist/workspace/sidebar/nav-row-meta.js +14 -2
  494. package/dist/workspace/sidebar/project-nav-items.js +3 -0
  495. package/dist/workspace/sidebar/project-session-list.js +68 -56
  496. package/dist/workspace/sidebar/project-sidebar.js +13 -2
  497. package/dist/workspace/sidebar/project-spaces-nav.d.ts +8 -0
  498. package/dist/workspace/sidebar/project-spaces-nav.js +69 -0
  499. package/dist/workspace/sidebar/session-group-order.d.ts +9 -0
  500. package/dist/workspace/sidebar/session-group-order.js +25 -0
  501. package/dist/workspace/sidebar/session-group-sections.d.ts +62 -0
  502. package/dist/workspace/sidebar/session-group-sections.js +267 -0
  503. package/dist/workspace/sidebar/session-list-chrome.d.ts +28 -0
  504. package/dist/workspace/sidebar/session-list-chrome.js +50 -0
  505. package/dist/workspace/spaces/channel-glyph.d.ts +5 -0
  506. package/dist/workspace/spaces/channel-glyph.js +6 -0
  507. package/dist/workspace/spaces/channel-setup.d.ts +16 -0
  508. package/dist/workspace/spaces/channel-setup.js +105 -0
  509. package/dist/workspace/spaces/channels-onboarding.d.ts +13 -0
  510. package/dist/workspace/spaces/channels-onboarding.js +37 -0
  511. package/dist/workspace/spaces/create-channel-dialog.d.ts +16 -0
  512. package/dist/workspace/spaces/create-channel-dialog.js +158 -0
  513. package/dist/workspace/spaces/private-channels-not-in.d.ts +9 -0
  514. package/dist/workspace/spaces/private-channels-not-in.js +69 -0
  515. package/dist/workspace/spaces/space-agents.d.ts +10 -0
  516. package/dist/workspace/spaces/space-agents.js +10 -0
  517. package/dist/workspace/spaces/space-details-dialog.d.ts +20 -0
  518. package/dist/workspace/spaces/space-details-dialog.js +176 -0
  519. package/dist/workspace/spaces/space-link-label.d.ts +49 -0
  520. package/dist/workspace/spaces/space-link-label.js +73 -0
  521. package/dist/workspace/spaces/space-links.d.ts +19 -0
  522. package/dist/workspace/spaces/space-links.js +230 -0
  523. package/dist/workspace/spaces/space-members.d.ts +46 -0
  524. package/dist/workspace/spaces/space-members.js +182 -0
  525. package/dist/workspace/spaces/space-roster.d.ts +15 -0
  526. package/dist/workspace/spaces/space-roster.js +44 -0
  527. package/dist/workspace/spaces/space-threads-tab.d.ts +56 -0
  528. package/dist/workspace/spaces/space-threads-tab.js +156 -0
  529. package/dist/workspace/spaces/space-timeline-view.d.ts +254 -0
  530. package/dist/workspace/spaces/space-timeline-view.js +235 -0
  531. package/dist/workspace/spaces/space-timeline.d.ts +106 -0
  532. package/dist/workspace/spaces/space-timeline.js +183 -0
  533. package/dist/workspace/spaces/space-triggers.d.ts +13 -0
  534. package/dist/workspace/spaces/space-triggers.js +78 -0
  535. package/dist/workspace/spaces/space-view.d.ts +37 -0
  536. package/dist/workspace/spaces/space-view.js +436 -0
  537. package/package.json +67 -36
  538. package/skills/kortix-ui/SKILL.md +3 -3
  539. package/skills/kortix-ui/references/custom-dashboard.md +3 -3
  540. package/skills/kortix-ui/references/modules.md +29 -5
  541. package/skills/kortix-ui/references/theming.md +1 -1
  542. package/dist/customize/connectors/catalog/merge-search.d.ts +0 -10
  543. package/dist/customize/connectors/catalog/merge-search.js +0 -26
  544. package/dist/customize/connectors/detail/find-easy-connect-app.d.ts +0 -29
  545. package/dist/customize/connectors/detail/find-easy-connect-app.js +0 -22
  546. package/dist/customize/migrate-to-v2/use-migrate-to-v2.d.ts +0 -9
  547. package/dist/customize/migrate-to-v2/use-migrate-to-v2.js +0 -24
  548. package/dist/customize/sections/connector-connection-header.d.ts +0 -36
  549. package/dist/customize/sections/connector-connection-header.js +0 -33
  550. package/dist/customize/sections/connector-connection-modal.d.ts +0 -34
  551. package/dist/customize/sections/connector-connection-modal.js +0 -72
  552. package/dist/customize/sections/discover-catalogue-card.d.ts +0 -19
  553. package/dist/customize/sections/discover-catalogue-card.js +0 -26
  554. package/dist/customize/sections/discover-catalogue-detail.d.ts +0 -15
  555. package/dist/customize/sections/discover-catalogue-detail.js +0 -24
  556. package/dist/customize/sections/discover-catalogue.d.ts +0 -17
  557. package/dist/customize/sections/discover-catalogue.js +0 -132
  558. package/dist/customize/sections/llm-provider/provider-access-menu.d.ts +0 -10
  559. package/dist/customize/sections/llm-provider/provider-access-menu.js +0 -23
  560. package/dist/files/project/components/drive-empty-art.d.ts +0 -2
  561. package/dist/files/project/components/drive-empty-art.js +0 -5
  562. package/dist/internal/hooks/use-media-query.d.ts +0 -2
  563. package/dist/internal/share/public-share-link-button.d.ts +0 -14
  564. package/dist/internal/share/public-share-link-button.js +0 -17
  565. package/dist/markdown/setup-links/app-credentials-form.d.ts +0 -12
  566. package/dist/markdown/setup-links/app-credentials-form.js +0 -115
  567. /package/dist/{internal/hooks → hooks}/use-media-query.js +0 -0
@@ -0,0 +1,178 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { platformConfig } from '@kortix/sdk';
4
+ import { useChromeConnections } from '@kortix/sdk/react';
5
+ import { AppWindowIcon, ArrowUpRightIcon, LinkSimpleIcon, PuzzlePieceIcon, SignInIcon, } from '@phosphor-icons/react';
6
+ import { useMutation, useQuery } from '@tanstack/react-query';
7
+ import { useState, useSyncExternalStore } from 'react';
8
+ import { Button } from '../../primitives/button.js';
9
+ import Loading from '../../primitives/loading.js';
10
+ import { Modal, ModalContent, ModalDescription, ModalTitle } from '../../primitives/modal.js';
11
+ import { BeamsShader } from '../../primitives/paper-wallpaper-shaders.js';
12
+ import { errorToast } from '../../primitives/toast.js';
13
+ import { SolidCheckIcon } from '../icons/solid-check-icon.js';
14
+ import { useCopy } from '../hooks/use-copy.js';
15
+ import { useTranslations } from '../../i18n/index.js';
16
+ import { isDesktop } from '../lib/desktop.js';
17
+ import { cn } from '../lib/utils.js';
18
+ import { BrowserIcon, BrowserLogoTile } from './browser-icon.js';
19
+ import { apiOrigin, CHROME_INSTALL_DOCS_PATH, CHROME_STORE_LISTED, chromeSettingsLink, connectExtension, isChromiumBrowser, KORTIX_EXTENSION_STORE_URL, pingExtension, } from './extension.js';
20
+ const subscribeNever = () => () => { };
21
+ function detectEnvironment() {
22
+ return isChromiumBrowser(navigator.userAgent) && !isDesktop() ? 'supported' : 'unsupported';
23
+ }
24
+ /**
25
+ * `fresh`: the person adds ANOTHER browser. This browser's own extension state
26
+ * does not count: no ping, and only a browser that was not in the list when the
27
+ * dialog opened completes it.
28
+ */
29
+ export function useChromeConnect({ fresh = false } = {}) {
30
+ const t = useTranslations('chrome');
31
+ const environment = useSyncExternalStore(subscribeNever, detectEnvironment, () => 'checking');
32
+ const ping = useQuery({
33
+ queryKey: ['chrome-extension-ping'],
34
+ queryFn: () => pingExtension(),
35
+ enabled: environment === 'supported' && !fresh,
36
+ refetchInterval: 2_000,
37
+ staleTime: 0,
38
+ gcTime: 0,
39
+ });
40
+ const connections = useChromeConnections({ refetchInterval: 3_000 });
41
+ // The browsers that existed when the steps appeared. A browser outside it is
42
+ // the one this person is connecting now.
43
+ const [baseline, setBaseline] = useState(null);
44
+ if (baseline === null && connections.isSuccess) {
45
+ setBaseline(new Set(connections.data.map((chrome) => chrome.id)));
46
+ }
47
+ const status = fresh ? null : (ping.data ?? null);
48
+ const connected = connections.data?.find((chrome) => baseline && !baseline.has(chrome.id)) ??
49
+ // The extension keeps its browser id after a sign-out: trust it only while signed in.
50
+ (status?.connected && status.chromeId
51
+ ? connections.data?.find((chrome) => chrome.id === status.chromeId && chrome.online)
52
+ : undefined);
53
+ const connect = useMutation({
54
+ // A retry would open the sign-in window again.
55
+ retry: false,
56
+ mutationFn: () => connectExtension(apiOrigin(platformConfig().backendUrl || '', window.location.origin)),
57
+ onSuccess: (result) => {
58
+ if (!result.ok) {
59
+ // `unavailable`: the page could not reach the extension.
60
+ errorToast(t(result.error === 'unavailable' ? 'extensionMissing' : 'connectFailed'));
61
+ }
62
+ void ping.refetch();
63
+ void connections.refetch();
64
+ },
65
+ });
66
+ return {
67
+ environment,
68
+ /** The first ping has not answered yet. */
69
+ checking: environment === 'checking' || (environment === 'supported' && !fresh && !ping.isFetched),
70
+ // A page opened before the install cannot reach the extension until it
71
+ // reloads. The extension's own tab finishes the sign-in, and the browser
72
+ // then shows up in the list, so a connected browser completes every step.
73
+ installed: status !== null || Boolean(connected),
74
+ signedIn: status?.connected === true || Boolean(connected),
75
+ connected,
76
+ connect,
77
+ };
78
+ }
79
+ /** The Chrome mark on a small white tile, for a button label. */
80
+ export function ChromeButtonMark() {
81
+ return _jsx(BrowserLogoTile, { brand: "chrome", className: "size-5 shrink-0 ring-0", iconClassName: "size-3.5" });
82
+ }
83
+ function StepTile({ done, icon: StepIcon, brand }) {
84
+ // The last step shows the connected browser's own mark.
85
+ if (done && brand)
86
+ return _jsx(BrowserLogoTile, { brand: brand, className: "size-10" });
87
+ return (_jsx("span", { className: cn('flex size-10 shrink-0 items-center justify-center rounded-sm', done ? 'bg-kortix-green/15' : 'bg-muted text-muted-foreground'), children: done ? _jsx(SolidCheckIcon, { className: "text-kortix-green size-5" }) : _jsx(StepIcon, { className: "size-5" }) }));
88
+ }
89
+ export function ChromeOnlineDot({ online, className }) {
90
+ const t = useTranslations('chrome');
91
+ return (_jsx("span", { role: "img", "aria-label": online ? t('online') : t('offline'), className: cn('inline-block size-2 shrink-0 rounded-full', online ? 'bg-kortix-green' : 'bg-muted-foreground', className) }));
92
+ }
93
+ /** Copies the link that opens Settings → Kortix in Chrome, for a browser that cannot run the extension. */
94
+ export function ChromeCopyLink({ size = 'sm', className }) {
95
+ const t = useTranslations('chrome');
96
+ const { copy, copied } = useCopy({ toast: false });
97
+ return (_jsxs(Button, { variant: "secondary", size: size, className: cn('gap-1.5', className), onClick: async () => {
98
+ if (!(await copy(chromeSettingsLink(window.location.origin))))
99
+ errorToast(t('copyFailed'));
100
+ }, children: [copied ? _jsx(SolidCheckIcon, { className: "size-3.5 shrink-0" }) : _jsx(LinkSimpleIcon, { className: "size-3.5 shrink-0" }), copied ? t('linkCopied') : t('copyLink')] }));
101
+ }
102
+ /**
103
+ * The action that moves this browser forward: Connect once the extension is
104
+ * there, otherwise Connect plus "How to install" (or "Add to Chrome" once the
105
+ * Web Store listing is public). Renders nothing for a connected browser.
106
+ */
107
+ export function ChromeInstallActions({ state, size = 'sm', className, showGuide = true, }) {
108
+ const t = useTranslations('chrome');
109
+ const { checking, installed, connected, connect } = state;
110
+ const [openedStore, setOpenedStore] = useState(false);
111
+ if (connected)
112
+ return null;
113
+ const full = size === 'lg' ? 'w-full' : '';
114
+ const connectButton = (_jsxs(Button, { size: size, className: full, disabled: connect.isPending, onClick: () => connect.mutate(), children: [connect.isPending ? _jsx(Loading, { className: "size-4 shrink-0" }) : null, connect.isPending ? t('connecting') : t('connect')] }));
115
+ if (installed)
116
+ return _jsx("div", { className: className, children: connectButton });
117
+ if (CHROME_STORE_LISTED) {
118
+ return (_jsxs("div", { className: cn('space-y-2', className), children: [_jsx(Button, { asChild: true, size: size, className: full, "aria-disabled": checking, children: _jsxs("a", { href: KORTIX_EXTENSION_STORE_URL, target: "_blank", rel: "noreferrer", onClick: () => setOpenedStore(true), children: [_jsx(ChromeButtonMark, {}), t('addToChrome')] }) }), openedStore ? (_jsx("p", { className: "text-muted-foreground text-center text-xs text-pretty", children: t('finishInChrome') })) : null] }));
119
+ }
120
+ return (_jsxs("div", { className: cn(size === 'lg' ? 'flex flex-col gap-2' : 'flex flex-wrap items-center gap-x-3 gap-y-2', className), children: [connectButton, showGuide ? (_jsx(Button, { asChild: true, variant: "ghost", size: size, className: cn('gap-1.5', size === 'sm' && 'text-muted-foreground'), children: _jsxs("a", { href: CHROME_INSTALL_DOCS_PATH, target: "_blank", rel: "noreferrer", children: [t('howToInstall'), _jsx(ArrowUpRightIcon, { className: "size-3.5 shrink-0" })] }) })) : null] }));
121
+ }
122
+ /**
123
+ * The three steps and the one action that moves them. Used in the connect
124
+ * dialog and, with no browser connected yet, inline in Settings → Kortix in
125
+ * Chrome (`showActions={false}`: the page header holds the action there).
126
+ */
127
+ export function ChromeConnectSteps({ state, onDone, showActions = true, }) {
128
+ const t = useTranslations('chrome');
129
+ const { environment, installed, signedIn, connected } = state;
130
+ if (environment === 'unsupported') {
131
+ return (_jsxs("div", { className: "mt-auto space-y-3", children: [_jsx("p", { className: "text-muted-foreground text-sm text-pretty", children: t('unsupported') }), showActions ? _jsx(ChromeCopyLink, { size: "lg", className: "w-full" }) : null] }));
132
+ }
133
+ const steps = [
134
+ {
135
+ key: 'install',
136
+ icon: PuzzlePieceIcon,
137
+ done: installed,
138
+ description: installed ? (t('steps.install.done')) : CHROME_STORE_LISTED ? (t('steps.install.description')) : (_jsxs(_Fragment, { children: [t('steps.install.descriptionUnlisted'), showActions ? null : (_jsxs(_Fragment, { children: [' ', _jsx("a", { href: CHROME_INSTALL_DOCS_PATH, target: "_blank", rel: "noreferrer", className: "text-foreground underline underline-offset-2", children: t('howToInstall') })] }))] })),
139
+ },
140
+ {
141
+ key: 'connect',
142
+ icon: SignInIcon,
143
+ done: signedIn,
144
+ description: t(signedIn ? 'steps.connect.done' : 'steps.connect.description'),
145
+ },
146
+ {
147
+ key: 'done',
148
+ icon: AppWindowIcon,
149
+ done: Boolean(connected),
150
+ brand: connected?.brand,
151
+ description: connected ? (_jsxs("span", { className: "flex min-w-0 items-center gap-1.5", children: [_jsx(ChromeOnlineDot, { online: connected.online }), _jsx("span", { className: "truncate", children: connected.name })] })) : (t('steps.done.description')),
152
+ },
153
+ ];
154
+ return (_jsxs(_Fragment, { children: [_jsx("ol", { className: "divide-border divide-y", children: steps.map(({ key, icon, done, brand, description }) => (_jsxs("li", { className: "flex items-center gap-3 py-3", children: [_jsx(StepTile, { done: done, icon: icon, brand: brand }), _jsxs("div", { className: "min-w-0 flex-1 space-y-0.5", children: [_jsx("p", { className: "text-sm font-medium", children: t(`steps.${key}.title`) }), _jsx("div", { className: "text-muted-foreground line-clamp-2 text-xs text-pretty", children: description })] })] }, key))) }), showActions || connected ? (_jsx("div", { className: "mt-auto space-y-2", children: connected ? (onDone ? (_jsx(Button, { size: "lg", className: "w-full", onClick: onDone, children: t('done') })) : null) : (_jsx(ChromeInstallActions, { state: state, size: "lg" })) })) : null] }));
155
+ }
156
+ /**
157
+ * "Add another browser": the other browser, or another Chrome profile, signs
158
+ * itself in. This page cannot do that for it, so the dialog says where to go
159
+ * and waits for the new browser to show up in the list.
160
+ */
161
+ function ChromeAddAnother({ onDone }) {
162
+ const t = useTranslations('chrome');
163
+ const { connected } = useChromeConnect({ fresh: true });
164
+ return (_jsxs(_Fragment, { children: [_jsx("ol", { className: "divide-border divide-y", children: _jsxs("li", { className: "flex items-center gap-3 py-3", children: [_jsx(StepTile, { done: Boolean(connected), icon: AppWindowIcon, brand: connected?.brand }), _jsxs("div", { className: "min-w-0 flex-1 space-y-0.5", children: [_jsx("p", { className: "text-sm font-medium", children: t('another.title') }), _jsx("div", { className: "text-muted-foreground line-clamp-2 text-xs text-pretty", children: connected ? (_jsxs("span", { className: "flex min-w-0 items-center gap-1.5", children: [_jsx(ChromeOnlineDot, { online: connected.online }), _jsx("span", { className: "truncate", children: connected.name })] })) : (t('another.waiting')) })] })] }) }), _jsx("div", { className: "mt-auto space-y-2", children: connected ? (onDone ? (_jsx(Button, { size: "lg", className: "w-full", onClick: onDone, children: t('done') })) : null) : (_jsx(ChromeCopyLink, { size: "lg", className: "w-full" })) })] }));
165
+ }
166
+ function ChromeConnectBody({ onDone }) {
167
+ const state = useChromeConnect();
168
+ return _jsx(ChromeConnectSteps, { state: state, onDone: onDone });
169
+ }
170
+ /**
171
+ * "Add Kortix to Chrome": add the Kortix extension to Chrome, sign it in, and
172
+ * watch the browser appear. `fresh`: add ANOTHER browser. Same frame as
173
+ * `ComputerConnectModal`.
174
+ */
175
+ export function ChromeConnectModal({ open, onOpenChange, fresh = false, }) {
176
+ const t = useTranslations('chrome');
177
+ return (_jsx(Modal, { open: open, onOpenChange: onOpenChange, children: _jsx(ModalContent, { className: "space-y-0 lg:max-w-3xl", closeClassName: "max-sm:bg-background border-0 overflow-hidden", children: _jsxs("div", { className: "grid sm:grid-cols-5 lg:min-h-128", children: [_jsxs("div", { "aria-hidden": "true", className: "dark bg-background relative isolate flex h-48 items-center justify-center overflow-hidden rounded-t-xl border-b sm:col-span-2 sm:h-auto sm:rounded-tr-none sm:border-r sm:border-b-0 lg:rounded-bl-xl", children: [_jsx(BeamsShader, {}), _jsxs("span", { className: "bg-foreground text-background relative flex items-center gap-2 rounded-full px-4 py-2 text-sm font-medium", children: [_jsx(BrowserIcon, { brand: "chrome", tone: "current", className: "size-4" }), t('pill')] })] }), _jsxs("div", { className: "flex min-w-0 flex-col gap-5 p-5 sm:col-span-3 lg:p-8", children: [_jsxs("header", { className: "space-y-1.5 pr-10", children: [_jsx(ModalTitle, { className: "text-lg font-medium text-balance", children: t('connectTitle') }), _jsx(ModalDescription, { className: "text-pretty", children: t(fresh ? 'another.description' : 'connectDescription') })] }), open ? (fresh ? (_jsx(ChromeAddAnother, { onDone: () => onOpenChange(false) })) : (_jsx(ChromeConnectBody, { onDone: () => onOpenChange(false) }))) : null] })] }) }) }));
178
+ }
@@ -0,0 +1,4 @@
1
+ /** @internal Kortix apps only. No semver: it may change in any release. */
2
+ export declare function ChromeMock({ className }: {
3
+ className?: string;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { CursorIcon } from '@phosphor-icons/react';
3
+ import { useTranslations } from '../../i18n/index.js';
4
+ import { cn } from '../lib/utils.js';
5
+ /**
6
+ * What the person sees while a session works in their chrome: the Kortix tab
7
+ * group, the page with a halo, the agent cursor and the control bar. Static,
8
+ * decorative, built from tokens. Blue marks agent state only. It mirrors the
9
+ * extension's welcome page (`apps/chrome-extension/src/pages/welcome.html`).
10
+ */
11
+ const MOCK_URL = 'shop.example.com/returns';
12
+ export function ChromeMock({ className }) {
13
+ const t = useTranslations('appsModal.mock');
14
+ return (_jsx("div", { "aria-hidden": "true", className: cn('bg-muted rounded-md p-3 sm:p-4', className), children: _jsxs("div", { className: "bg-background overflow-hidden rounded-sm border", children: [_jsx("div", { className: "bg-card flex items-center gap-2 border-b px-2 py-1.5", children: _jsxs("span", { className: "bg-kortix-base/15 flex min-w-0 items-center gap-1.5 rounded-sm px-2 py-0.5 text-xs", children: [_jsx("span", { className: "bg-kortix-base size-1.5 shrink-0 rounded-full" }), _jsx("span", { className: "truncate", children: t('group') })] }) }), _jsx("div", { className: "border-b px-2 py-1.5", children: _jsx("span", { className: "bg-muted text-muted-foreground block truncate rounded-sm px-2 py-0.5 font-mono text-xs", children: MOCK_URL }) }), _jsxs("div", { className: "relative space-y-3 px-3 pt-3 pb-14 sm:px-4 sm:pt-4", children: [_jsx("span", { className: "bg-muted block h-2 w-24 rounded-sm" }), _jsxs("div", { className: "flex items-center justify-between gap-3 rounded-sm border p-3", children: [_jsxs("span", { className: "space-y-1.5", children: [_jsx("span", { className: "bg-muted block h-2 w-20 rounded-sm" }), _jsx("span", { className: "bg-muted block h-2 w-12 rounded-sm" })] }), _jsxs("span", { className: "border-ring ring-ring/15 relative rounded-sm border px-2 py-1 text-xs ring-3", children: [t('button'), _jsxs("span", { className: "absolute top-full right-1 -mt-0.5 flex flex-col items-end", children: [_jsx(CursorIcon, { weight: "fill", className: "text-kortix-base size-4" }), _jsx("span", { className: "bg-popover -mt-0.5 rounded-sm border px-1.5 py-0.5 text-xs", children: "Kortix" })] })] })] }), _jsxs("span", { className: "bg-popover absolute bottom-3 left-1/2 flex -translate-x-1/2 items-center gap-2 rounded-full border px-3 py-1 text-xs whitespace-nowrap", children: [_jsx("span", { className: "bg-kortix-base size-1.5 rounded-full" }), t('working'), _jsx("span", { className: "text-muted-foreground", children: t('takeOver') }), _jsx("span", { className: "text-muted-foreground", children: t('stop') })] })] })] }) }));
15
+ }
@@ -0,0 +1,15 @@
1
+ /** @internal Kortix apps only. No semver: it may change in any release. */
2
+ import type { ChromeConnection } from '@kortix/sdk';
3
+ /**
4
+ * Two browsers can share a default name ("Chromium on macOS"). Where they do,
5
+ * the list tells them apart: the profile label when it has one, else a count
6
+ * in connection order. The stored name never changes; this is display only.
7
+ */
8
+ export declare function chromeDisplayNames(list: readonly ChromeConnection[]): Map<string, string>;
9
+ /** "N browsers · M online" for the Apps modal. */
10
+ export declare function chromeCounts(list: readonly ChromeConnection[]): {
11
+ count: number;
12
+ online: number;
13
+ };
14
+ /** Offline for longer than `thresholdMs`: only then is "last seen" worth saying. */
15
+ export declare function offlineLongerThan(lastSeenAt: string | null, thresholdMs: number, now?: number): boolean;
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Two browsers can share a default name ("Chromium on macOS"). Where they do,
3
+ * the list tells them apart: the profile label when it has one, else a count
4
+ * in connection order. The stored name never changes; this is display only.
5
+ */
6
+ export function chromeDisplayNames(list) {
7
+ const byName = new Map();
8
+ for (const chrome of list)
9
+ byName.set(chrome.name, [...(byName.get(chrome.name) ?? []), chrome]);
10
+ const out = new Map();
11
+ for (const chrome of list) {
12
+ const same = byName.get(chrome.name) ?? [];
13
+ if (same.length < 2) {
14
+ out.set(chrome.id, chrome.name);
15
+ }
16
+ else if (chrome.profileLabel && !chrome.name.includes(chrome.profileLabel)) {
17
+ out.set(chrome.id, `${chrome.name} · ${chrome.profileLabel}`);
18
+ }
19
+ else {
20
+ out.set(chrome.id, `${chrome.name} #${same.indexOf(chrome) + 1}`);
21
+ }
22
+ }
23
+ return out;
24
+ }
25
+ /** "N browsers · M online" for the Apps modal. */
26
+ export function chromeCounts(list) {
27
+ return { count: list.length, online: list.filter((chrome) => chrome.online).length };
28
+ }
29
+ /** Offline for longer than `thresholdMs`: only then is "last seen" worth saying. */
30
+ export function offlineLongerThan(lastSeenAt, thresholdMs, now = Date.now()) {
31
+ if (!lastSeenAt)
32
+ return false;
33
+ const seen = Date.parse(lastSeenAt);
34
+ return Number.isFinite(seen) && now - seen > thresholdMs;
35
+ }
@@ -0,0 +1,47 @@
1
+ /** @internal Kortix apps only. No semver: it may change in any release. */
2
+ /**
3
+ * The Kortix Chrome extension, seen from the web app.
4
+ *
5
+ * A page talks to the extension through `chrome.runtime.sendMessage(id, …)`
6
+ * (`externally_connectable`). Chrome exposes `chrome.runtime` to a page only
7
+ * when the extension is installed and lists the page's origin. Safari, Firefox
8
+ * and the desktop shell never expose it, so `pingExtension` answers `null`.
9
+ */
10
+ export declare const KORTIX_EXTENSION_ID: string;
11
+ export declare const KORTIX_EXTENSION_STORE_URL: string;
12
+ /**
13
+ * The Web Store listing is public. While `false`, no surface offers "Add to
14
+ * Chrome": each one shows "Connect" and a "How to install" link to the docs.
15
+ * Flip it with the listing, nothing else changes.
16
+ */
17
+ export declare const CHROME_STORE_LISTED = false;
18
+ /** Where "How to install" points: the docs page that explains Load unpacked. */
19
+ export declare const CHROME_INSTALL_DOCS_PATH = "/docs/connect/chrome";
20
+ /** Opens Settings → Kortix in Chrome. The link a person copies to open it in Chrome. */
21
+ export declare function chromeSettingsLink(origin: string): string;
22
+ export interface ExtensionStatus {
23
+ version: string;
24
+ /** The extension holds a Kortix sign-in and a browser id. */
25
+ connected: boolean;
26
+ apiUrl: string | null;
27
+ chromeId: string | null;
28
+ }
29
+ export type ExtensionConnectResult = {
30
+ ok: true;
31
+ chromeId: string;
32
+ } | {
33
+ ok: false;
34
+ error: string;
35
+ };
36
+ /** Chrome, Edge, Brave, Arc and Opera on a computer. Not Electron, not Chrome on iOS. */
37
+ export declare function isChromiumBrowser(userAgent: string): boolean;
38
+ /**
39
+ * The API origin the extension signs in to. The web app's backend URL can be
40
+ * root-relative (`/v1`, same-origin deployments), so resolve it against the
41
+ * page. The extension appends `/v1/...` itself. `''` when there is none.
42
+ */
43
+ export declare function apiOrigin(backendUrl: string, pageOrigin: string): string;
44
+ /** The extension's state, or `null`: not installed, not Chromium, or no answer in 1.5 s. */
45
+ export declare function pingExtension(timeoutMs?: number): Promise<ExtensionStatus | null>;
46
+ /** Starts the extension's Kortix sign-in. Resolves when the person finishes it. */
47
+ export declare function connectExtension(apiUrl: string): Promise<ExtensionConnectResult>;
@@ -0,0 +1,91 @@
1
+ /**
2
+ * The Kortix Chrome extension, seen from the web app.
3
+ *
4
+ * A page talks to the extension through `chrome.runtime.sendMessage(id, …)`
5
+ * (`externally_connectable`). Chrome exposes `chrome.runtime` to a page only
6
+ * when the extension is installed and lists the page's origin. Safari, Firefox
7
+ * and the desktop shell never expose it, so `pingExtension` answers `null`.
8
+ */
9
+ export const KORTIX_EXTENSION_ID = process.env.NEXT_PUBLIC_KORTIX_EXTENSION_ID || 'gefbbnjgoiljpbnalgafbhbfdhikgjek';
10
+ export const KORTIX_EXTENSION_STORE_URL = `https://chromewebstore.google.com/detail/${KORTIX_EXTENSION_ID}`;
11
+ /**
12
+ * The Web Store listing is public. While `false`, no surface offers "Add to
13
+ * Chrome": each one shows "Connect" and a "How to install" link to the docs.
14
+ * Flip it with the listing, nothing else changes.
15
+ */
16
+ export const CHROME_STORE_LISTED = false;
17
+ /** Where "How to install" points: the docs page that explains Load unpacked. */
18
+ export const CHROME_INSTALL_DOCS_PATH = '/docs/connect/chrome';
19
+ /** Opens Settings → Kortix in Chrome. The link a person copies to open it in Chrome. */
20
+ export function chromeSettingsLink(origin) {
21
+ return `${origin}/settings/chrome`;
22
+ }
23
+ const PING_TIMEOUT_MS = 1_500;
24
+ // Sign-in happens in a Chrome window the person must finish.
25
+ const CONNECT_TIMEOUT_MS = 120_000;
26
+ /** Chrome, Edge, Brave, Arc and Opera on a computer. Not Electron, not Chrome on iOS. */
27
+ export function isChromiumBrowser(userAgent) {
28
+ return /Chrome\/\d/.test(userAgent) && !/Electron\//.test(userAgent);
29
+ }
30
+ /**
31
+ * The API origin the extension signs in to. The web app's backend URL can be
32
+ * root-relative (`/v1`, same-origin deployments), so resolve it against the
33
+ * page. The extension appends `/v1/...` itself. `''` when there is none.
34
+ */
35
+ export function apiOrigin(backendUrl, pageOrigin) {
36
+ if (!backendUrl)
37
+ return '';
38
+ try {
39
+ return new URL(backendUrl, pageOrigin).origin;
40
+ }
41
+ catch {
42
+ return '';
43
+ }
44
+ }
45
+ function send(message, timeoutMs, parse) {
46
+ const runtime = globalThis.chrome?.runtime;
47
+ if (!runtime?.sendMessage)
48
+ return Promise.resolve(null);
49
+ return new Promise((resolve) => {
50
+ const timer = setTimeout(() => resolve(null), timeoutMs);
51
+ const done = (value) => {
52
+ clearTimeout(timer);
53
+ resolve(value);
54
+ };
55
+ try {
56
+ runtime.sendMessage(KORTIX_EXTENSION_ID, message, (response) => {
57
+ // Reading `lastError` marks it handled. Set when the extension is absent.
58
+ done(runtime.lastError ? null : parse(response));
59
+ });
60
+ }
61
+ catch {
62
+ done(null);
63
+ }
64
+ });
65
+ }
66
+ /** The extension's state, or `null`: not installed, not Chromium, or no answer in 1.5 s. */
67
+ export function pingExtension(timeoutMs = PING_TIMEOUT_MS) {
68
+ return send({ type: 'kortix.ping' }, timeoutMs, (response) => {
69
+ const r = response;
70
+ if (!r || r.ok !== true)
71
+ return null;
72
+ return {
73
+ version: String(r.version ?? ''),
74
+ connected: r.connected === true,
75
+ apiUrl: typeof r.apiUrl === 'string' ? r.apiUrl : null,
76
+ chromeId: typeof r.chromeId === 'string' ? r.chromeId : null,
77
+ };
78
+ });
79
+ }
80
+ /** Starts the extension's Kortix sign-in. Resolves when the person finishes it. */
81
+ export async function connectExtension(apiUrl) {
82
+ const result = await send({ type: 'kortix.connect', apiUrl }, CONNECT_TIMEOUT_MS, (response) => {
83
+ const r = response;
84
+ if (r?.ok === true)
85
+ return { ok: true, chromeId: String(r.chromeId ?? '') };
86
+ if (r)
87
+ return { ok: false, error: typeof r.error === 'string' ? r.error : 'failed' };
88
+ return null;
89
+ });
90
+ return result ?? { ok: false, error: 'unavailable' };
91
+ }
@@ -0,0 +1,11 @@
1
+ /** @internal Kortix apps only. No semver: it may change in any release. */
2
+ /**
3
+ * Whether this platform offers Kortix in Chrome at all. Until launch the API
4
+ * answers 404 on /v1/chrome/* where KORTIX_CHROME_ENABLED is off (staging,
5
+ * prod), so the account-level surfaces — Settings → Kortix in Chrome and its
6
+ * command-palette entry — show only once the browser list answers. Project
7
+ * surfaces read the project's `chrome` flag instead.
8
+ *
9
+ * `enabled`: ask only while the surface that needs the answer is open.
10
+ */
11
+ export declare function useChromeOffered(enabled?: boolean): boolean;
@@ -0,0 +1,22 @@
1
+ 'use client';
2
+ import { listChromeConnections } from '@kortix/sdk';
3
+ import { chromeKeys } from '@kortix/sdk/react';
4
+ import { useQuery } from '@tanstack/react-query';
5
+ /**
6
+ * Whether this platform offers Kortix in Chrome at all. Until launch the API
7
+ * answers 404 on /v1/chrome/* where KORTIX_CHROME_ENABLED is off (staging,
8
+ * prod), so the account-level surfaces — Settings → Kortix in Chrome and its
9
+ * command-palette entry — show only once the browser list answers. Project
10
+ * surfaces read the project's `chrome` flag instead.
11
+ *
12
+ * `enabled`: ask only while the surface that needs the answer is open.
13
+ */
14
+ export function useChromeOffered(enabled = true) {
15
+ return useQuery({
16
+ queryKey: chromeKeys.list(),
17
+ queryFn: listChromeConnections,
18
+ enabled,
19
+ staleTime: 60_000,
20
+ retry: false,
21
+ }).isSuccess;
22
+ }
@@ -22,7 +22,10 @@ export function agentMarkVars(slug) {
22
22
  }
23
23
  /** The bare pixel figure, painted with `--mark-ink` from an ancestor. */
24
24
  export function AgentMarkGlyph({ slug, size }) {
25
- return (_jsx("svg", { "aria-hidden": true, width: size, height: size, viewBox: `0 0 ${PIXEL_MARK_SIZE} ${PIXEL_MARK_SIZE}`, shapeRendering: "crispEdges", className: "shrink-0", children: _jsx("path", { d: pixelMark(slug).path, className: "fill-(--mark-ink)" }) }));
25
+ return (_jsx("svg", { "aria-hidden": true, width: size, height: size,
26
+ // Inline, so a host's `[&_svg]:size-4` default (menu rows) cannot rescale
27
+ // the 7-pixel grid off whole device pixels.
28
+ style: { width: size, height: size }, viewBox: `0 0 ${PIXEL_MARK_SIZE} ${PIXEL_MARK_SIZE}`, shapeRendering: "crispEdges", className: "shrink-0", children: _jsx("path", { d: pixelMark(slug).path, className: "fill-(--mark-ink)" }) }));
26
29
  }
27
30
  /**
28
31
  * An agent's pixel mark on its tile — the agent's face wherever it appears:
@@ -30,7 +33,7 @@ export function AgentMarkGlyph({ slug, size }) {
30
33
  */
31
34
  export function AgentMark({ slug, size = 14, tile = TILE[size], label, className, }) {
32
35
  // A mark is a face, not a name: the hover hint says whose face it is.
33
- const mark = (_jsx("span", { "aria-hidden": true, style: { ...agentMarkVars(slug), width: tile, height: tile }, className: cn('inline-flex shrink-0 items-center justify-center bg-(--mark-tile)', size >= 28 ? 'rounded-md' : 'rounded-sm', className), children: _jsx(AgentMarkGlyph, { slug: slug, size: size }) }));
36
+ const mark = (_jsx("span", { "aria-hidden": true, "data-slot": "agent-mark", style: { ...agentMarkVars(slug), width: tile, height: tile }, className: cn('inline-flex shrink-0 items-center justify-center bg-(--mark-tile)', size >= 28 ? 'rounded-md' : 'rounded-sm', className), children: _jsx(AgentMarkGlyph, { slug: slug, size: size }) }));
34
37
  return (_jsx(Hint, { side: "top", sideOffset: 6, alignOffset: 0, label: label ?? agentLabel(slug), children: mark }));
35
38
  }
36
39
  function agentLabel(slug) {
@@ -0,0 +1,64 @@
1
+ /** @internal Kortix apps only. No semver: it may change in any release. */
2
+ import { type ChannelPlatformId } from '../../_vendor/shared/channel-descriptors.js';
3
+ /**
4
+ * Which logo a connector shows. ONE rule for every surface — catalogue card,
5
+ * app page, connector page, Connected list, account rows, pickers, channel
6
+ * heroes, approvals — so an app looks the same wherever it appears.
7
+ *
8
+ * 1. A Kortix-built connector (Slack, Teams, Email, Telegram, Computer) shows
9
+ * its banner mark: the Slack and Teams brand components, the Phosphor
10
+ * envelope, plane and monitor glyphs (`ConnectorLogo` draws them). The
11
+ * files under `apps/web/public/connector-icons/<app>.svg` are the same
12
+ * marks, for consumers that need a URL, so an icon URL pointing at one is
13
+ * read as that app too.
14
+ * 2. Else the app's own icon URL: the catalogue record's, or the one the API
15
+ * resolved for an installed connector (`AdminConnector.iconUrl`).
16
+ * 3. Else the favicon of a PUBLIC catalogue domain. Never of a connector's own
17
+ * URL: a custom MCP or API host may be private, and the favicon service
18
+ * would learn it (the API holds the same line, `connector-icon.ts`).
19
+ * 4. Else the neutral fallback glyph.
20
+ */
21
+ export type NativeConnectorApp = ChannelPlatformId | 'computer';
22
+ /** Whatever a surface knows about the connector; every field optional. */
23
+ export interface ConnectorLogoSource {
24
+ /** Connector slug (`kortix_email`, `computer`) or catalogue id (`native:email`). */
25
+ slug?: string | null;
26
+ /** `AdminConnector.provider`: `channel`, `computer`, `composio`, `mcp`, … */
27
+ provider?: string | null;
28
+ /** A channel connector's platform. */
29
+ platform?: string | null;
30
+ /** The Kortix app a catalogue record names (`DiscoverConnector.kortix.app`). */
31
+ nativeApp?: string | null;
32
+ /** The app's own icon URL, when the source has one. */
33
+ icon?: string | null;
34
+ /** A public catalogue domain (never a connector's own URL). */
35
+ domain?: string | null;
36
+ }
37
+ export type ConnectorLogoKind = {
38
+ kind: 'native';
39
+ app: NativeConnectorApp;
40
+ } | {
41
+ kind: 'image';
42
+ src: string;
43
+ } | {
44
+ kind: 'none';
45
+ };
46
+ export declare function nativeConnectorApp(source: ConnectorLogoSource): NativeConnectorApp | null;
47
+ export declare function resolveConnectorLogo(source: ConnectorLogoSource): ConnectorLogoKind;
48
+ /** A catalogue record (Discover) as a logo source. */
49
+ export declare function discoverLogoSource(connector: {
50
+ id?: string | null;
51
+ slug?: string | null;
52
+ icon?: string | null;
53
+ domain?: string | null;
54
+ kortix?: {
55
+ app?: string | null;
56
+ } | null;
57
+ }): ConnectorLogoSource;
58
+ /** An installed connector (`AdminConnector`) as a logo source. */
59
+ export declare function installedConnectorLogoSource(connector: {
60
+ slug: string;
61
+ provider?: string | null;
62
+ platform?: string | null;
63
+ iconUrl?: string | null;
64
+ }): ConnectorLogoSource;
@@ -0,0 +1,49 @@
1
+ import { CHANNEL_PLATFORM_IDS } from '../../_vendor/kortix-shared.js';
2
+ import { faviconUrlForHostname } from '../../lib/favicon.js';
3
+ const NATIVE_APPS = [...CHANNEL_PLATFORM_IDS, 'computer'];
4
+ function isNative(value) {
5
+ return !!value && NATIVE_APPS.includes(value);
6
+ }
7
+ export function nativeConnectorApp(source) {
8
+ if (isNative(source.nativeApp))
9
+ return source.nativeApp;
10
+ if (source.provider === 'computer')
11
+ return 'computer';
12
+ if (source.provider === 'channel' && isNative(source.platform))
13
+ return source.platform;
14
+ const slug = (source.slug ?? '').toLowerCase();
15
+ const named = /^(?:native:|kortix_)([a-z]+)$/.exec(slug)?.[1];
16
+ if (isNative(named))
17
+ return named;
18
+ if (slug === 'computer' || slug === 'computers')
19
+ return 'computer';
20
+ const file = /\/connector-icons\/([a-z]+)\.svg$/.exec(source.icon ?? '')?.[1];
21
+ return isNative(file) ? file : null;
22
+ }
23
+ export function resolveConnectorLogo(source) {
24
+ const native = nativeConnectorApp(source);
25
+ if (native)
26
+ return { kind: 'native', app: native };
27
+ if (source.icon)
28
+ return { kind: 'image', src: source.icon };
29
+ const domain = source.domain?.trim();
30
+ return domain ? { kind: 'image', src: faviconUrlForHostname(domain) } : { kind: 'none' };
31
+ }
32
+ /** A catalogue record (Discover) as a logo source. */
33
+ export function discoverLogoSource(connector) {
34
+ return {
35
+ slug: connector.id ?? connector.slug,
36
+ nativeApp: connector.kortix?.app ?? null,
37
+ icon: connector.icon,
38
+ domain: connector.domain,
39
+ };
40
+ }
41
+ /** An installed connector (`AdminConnector`) as a logo source. */
42
+ export function installedConnectorLogoSource(connector) {
43
+ return {
44
+ slug: connector.slug,
45
+ provider: connector.provider,
46
+ platform: connector.platform,
47
+ icon: connector.iconUrl,
48
+ };
49
+ }
@@ -0,0 +1,39 @@
1
+ /** @internal Kortix apps only. No semver: it may change in any release. */
2
+ import { type ComponentType } from 'react';
3
+ import { type ConnectorLogoSource, type NativeConnectorApp } from './connector-logo-source.js';
4
+ export type { ConnectorLogoSource } from './connector-logo-source.js';
5
+ declare const TILE: {
6
+ readonly xs: "size-5 rounded-sm";
7
+ readonly sm: "size-6 rounded-sm";
8
+ readonly md: "size-8 rounded-md";
9
+ readonly lg: "size-9 rounded-md";
10
+ readonly xl: "size-14 rounded-xl";
11
+ };
12
+ export type ConnectorLogoSize = keyof typeof TILE;
13
+ /**
14
+ * The marks of the Kortix-built connectors, as their channel banners draw
15
+ * them; brand marks keep their colours. `apps/web/public/connector-icons/<app>.svg`
16
+ * is this mark rendered on its tile (`connector-mark-files.tsx`), so the URL
17
+ * the API catalogue sends and this component are one image.
18
+ */
19
+ export declare const NATIVE_MARK: Record<NativeConnectorApp, {
20
+ Mark: ComponentType<{
21
+ className?: string;
22
+ }>;
23
+ brand: boolean;
24
+ }>;
25
+ /**
26
+ * A connector's logo — the only one. Every connector, app and account surface
27
+ * renders this, so the same app shows the same mark everywhere
28
+ * (`connector-logo-source.ts` holds the rule).
29
+ *
30
+ * Kortix-built connectors and connectors with no logo draw a mark on the
31
+ * banner tile. A catalogue logo is the bare image: its own shape is the edge.
32
+ * A URL that fails to load latches per URL (a swapped URL gets a fresh try)
33
+ * and shows the neutral fallback, so "missing" and "broken" look identical.
34
+ */
35
+ export declare function ConnectorLogo({ source, size, className, }: {
36
+ source: ConnectorLogoSource;
37
+ size?: ConnectorLogoSize;
38
+ className?: string;
39
+ }): import("react").JSX.Element;