@kortix/ui 0.14.8 → 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 (528) hide show
  1. package/README.md +2 -2
  2. package/dist/_vendor/kortix-shared.js +63 -3
  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/space-slug.d.ts +37 -0
  7. package/dist/access/access/access-detail-shell.js +1 -1
  8. package/dist/access/access/principal-picker.d.ts +11 -0
  9. package/dist/access/access/principal-picker.js +3 -2
  10. package/dist/apps/app-preview-pool.d.ts +7 -2
  11. package/dist/apps/app-preview-pool.js +11 -5
  12. package/dist/apps/app-shared.d.ts +22 -15
  13. package/dist/apps/app-shared.js +37 -19
  14. package/dist/apps/index.d.ts +2 -2
  15. package/dist/apps/index.js +2 -2
  16. package/dist/artifacts/artifact-frame.d.ts +16 -0
  17. package/dist/artifacts/artifact-frame.js +51 -0
  18. package/dist/artifacts/artifact-session.d.ts +18 -0
  19. package/dist/artifacts/artifact-session.js +101 -0
  20. package/dist/artifacts/frame-policy.d.ts +30 -0
  21. package/dist/artifacts/frame-policy.js +61 -0
  22. package/dist/artifacts/index.d.ts +3 -0
  23. package/dist/artifacts/index.js +5 -0
  24. package/dist/browser/sandbox-browser-chrome.d.ts +4 -1
  25. package/dist/browser/sandbox-browser-chrome.js +2 -2
  26. package/dist/customize/agents/agent-grant-pages.d.ts +5 -1
  27. package/dist/customize/agents/agent-grant-pages.js +30 -4
  28. package/dist/customize/agents/agent-page.js +3 -1
  29. package/dist/customize/agents/agent-policy-sets.d.ts +43 -0
  30. package/dist/customize/agents/agent-policy-sets.js +72 -0
  31. package/dist/customize/agents/agent-triggers-section.js +2 -1
  32. package/dist/customize/connectors/add-mcp/add-mcp-server-dialog.d.ts +6 -1
  33. package/dist/customize/connectors/add-mcp/add-mcp-server-dialog.js +10 -4
  34. package/dist/customize/connectors/agent-access.d.ts +35 -0
  35. package/dist/customize/connectors/agent-access.js +77 -0
  36. package/dist/customize/connectors/catalog/browse-sections.d.ts +2 -29
  37. package/dist/customize/connectors/catalog/browse-sections.js +7 -74
  38. package/dist/customize/connectors/catalog/catalog-entry.d.ts +18 -37
  39. package/dist/customize/connectors/catalog/catalog-entry.js +28 -40
  40. package/dist/customize/connectors/catalog/connector-browse.d.ts +3 -32
  41. package/dist/customize/connectors/catalog/connector-browse.js +19 -50
  42. package/dist/customize/connectors/catalog/use-catalog.d.ts +20 -59
  43. package/dist/customize/connectors/catalog/use-catalog.js +48 -175
  44. package/dist/customize/connectors/connector-identity.d.ts +9 -11
  45. package/dist/customize/connectors/connector-identity.js +13 -42
  46. package/dist/customize/connectors/connector-moves-banner.d.ts +2 -1
  47. package/dist/customize/connectors/connector-moves-banner.js +4 -6
  48. package/dist/customize/connectors/connector-routes.d.ts +21 -9
  49. package/dist/customize/connectors/connector-routes.js +29 -20
  50. package/dist/customize/connectors/connectors-page.js +53 -82
  51. package/dist/customize/connectors/detail/app-page.js +226 -98
  52. package/dist/customize/connectors/detail/computer-app-page.d.ts +16 -0
  53. package/dist/customize/connectors/detail/computer-app-page.js +39 -0
  54. package/dist/customize/connectors/detail/connector-accounts.js +3 -1
  55. package/dist/customize/connectors/detail/connector-advanced-tools.d.ts +4 -1
  56. package/dist/customize/connectors/detail/connector-advanced-tools.js +2 -2
  57. package/dist/customize/connectors/detail/connector-agents.d.ts +14 -0
  58. package/dist/customize/connectors/detail/connector-agents.js +69 -0
  59. package/dist/customize/connectors/detail/connector-detail-tabs.js +2 -1
  60. package/dist/customize/connectors/detail/connector-move-row.d.ts +8 -5
  61. package/dist/customize/connectors/detail/connector-move-row.js +23 -14
  62. package/dist/customize/connectors/detail/connector-page.d.ts +4 -1
  63. package/dist/customize/connectors/detail/connector-page.js +14 -10
  64. package/dist/customize/connectors/detail/connector-policy-sets.d.ts +28 -0
  65. package/dist/customize/connectors/detail/connector-policy-sets.js +203 -0
  66. package/dist/customize/connectors/detail/connector-settings.d.ts +4 -1
  67. package/dist/customize/connectors/detail/connector-settings.js +7 -3
  68. package/dist/customize/connectors/detail/connector-status.d.ts +19 -6
  69. package/dist/customize/connectors/detail/connector-status.js +34 -10
  70. package/dist/customize/connectors/detail/connector-tabs.d.ts +4 -1
  71. package/dist/customize/connectors/detail/connector-tabs.js +8 -2
  72. package/dist/customize/connectors/detail/connector-tools.d.ts +3 -3
  73. package/dist/customize/connectors/detail/connector-tools.js +105 -48
  74. package/dist/customize/connectors/detail/email-inboxes.d.ts +43 -0
  75. package/dist/customize/connectors/detail/email-inboxes.js +184 -0
  76. package/dist/customize/connectors/detail/provider-info.d.ts +1 -1
  77. package/dist/customize/connectors/detail/provider-info.js +2 -2
  78. package/dist/customize/connectors/detail/status-badge.d.ts +1 -1
  79. package/dist/customize/connectors/detail/status-badge.js +4 -5
  80. package/dist/customize/connectors/detail/use-connector-detail.d.ts +6 -0
  81. package/dist/customize/connectors/detail/use-connector-detail.js +14 -4
  82. package/dist/customize/connectors/install/install-dialog.d.ts +23 -0
  83. package/dist/customize/connectors/install/install-dialog.js +40 -0
  84. package/dist/customize/connectors/install/install.d.ts +13 -2
  85. package/dist/customize/connectors/install/install.js +9 -4
  86. package/dist/customize/connectors/install/use-install.d.ts +19 -2
  87. package/dist/customize/connectors/install/use-install.js +65 -37
  88. package/dist/customize/connectors/install/way-kind.d.ts +5 -0
  89. package/dist/customize/connectors/install/way-kind.js +16 -0
  90. package/dist/customize/connectors/provider-label.d.ts +2 -1
  91. package/dist/customize/connectors/provider-label.js +13 -3
  92. package/dist/customize/connectors/tools/pattern-rule-draft.d.ts +4 -0
  93. package/dist/customize/connectors/tools/pattern-rule-draft.js +12 -3
  94. package/dist/customize/connectors/tools/policy-sets.d.ts +27 -0
  95. package/dist/customize/connectors/tools/policy-sets.js +41 -0
  96. package/dist/customize/connectors/tools/tool-groups.d.ts +32 -9
  97. package/dist/customize/connectors/tools/tool-groups.js +78 -16
  98. package/dist/customize/connectors/tools/tool-policy-control.d.ts +11 -10
  99. package/dist/customize/connectors/tools/tool-policy-control.js +15 -16
  100. package/dist/customize/connectors/tools/tool-policy-labels.d.ts +6 -5
  101. package/dist/customize/connectors/tools/tool-policy-labels.js +17 -16
  102. package/dist/customize/connectors/tools/tool-policy.d.ts +50 -4
  103. package/dist/customize/connectors/tools/tool-policy.js +74 -8
  104. package/dist/customize/connectors/use-agent-access.d.ts +85 -0
  105. package/dist/customize/connectors/use-agent-access.js +72 -0
  106. package/dist/customize/migrate-to-v2/index.d.ts +1 -2
  107. package/dist/customize/migrate-to-v2/index.js +1 -2
  108. package/dist/customize/migrate-to-v2/migration-prompt.d.ts +12 -25
  109. package/dist/customize/migrate-to-v2/migration-prompt.js +34 -236
  110. package/dist/customize/migrate-to-v2/upgrade-defs.d.ts +1 -1
  111. package/dist/customize/migrate-to-v2/upgrade-defs.js +7 -6
  112. package/dist/customize/migrate-to-v2/upgrade-view.js +7 -7
  113. package/dist/customize/migrate-to-v2/use-run-upgrade.d.ts +3 -3
  114. package/dist/customize/providers/provider-accordion.js +17 -2
  115. package/dist/customize/sections/component/channel-access-panel.d.ts +16 -0
  116. package/dist/customize/sections/component/channel-access-panel.js +146 -0
  117. package/dist/customize/sections/component/channel-connect-hero.d.ts +3 -2
  118. package/dist/customize/sections/component/channel-connect-hero.js +3 -2
  119. package/dist/customize/sections/component/channel-hero-frame.d.ts +31 -0
  120. package/dist/customize/sections/component/channel-hero-frame.js +40 -0
  121. package/dist/customize/sections/component/channel-mocks.d.ts +6 -0
  122. package/dist/customize/sections/component/channel-mocks.js +46 -0
  123. package/dist/customize/sections/component/channel-row.d.ts +13 -3
  124. package/dist/customize/sections/component/channel-row.js +10 -4
  125. package/dist/customize/sections/component/email-connect-form.d.ts +27 -0
  126. package/dist/customize/sections/component/email-connect-form.js +183 -0
  127. package/dist/customize/sections/component/slack-connect-card.d.ts +7 -0
  128. package/dist/customize/sections/component/slack-connect-card.js +2 -3
  129. package/dist/customize/sections/component/teams-connect-card.d.ts +7 -0
  130. package/dist/customize/sections/component/teams-connect-card.js +2 -3
  131. package/dist/customize/sections/component/telegram-channel-row.js +16 -25
  132. package/dist/customize/sections/connectors-view.d.ts +1 -15
  133. package/dist/customize/sections/connectors-view.js +81 -314
  134. package/dist/customize/sections/view/agent-editor-catalog.js +5 -0
  135. package/dist/customize/sections/view/channels-view.d.ts +5 -1
  136. package/dist/customize/sections/view/channels-view.js +61 -75
  137. package/dist/customize/sections/view/gateway/gateway-overview.js +10 -2
  138. package/dist/customize/settings/tabs/experimental-tab.js +35 -16
  139. package/dist/customize/shared/catalog/catalog-empty-state.d.ts +1 -12
  140. package/dist/customize/shared/catalog/catalog-empty-state.js +3 -3
  141. package/dist/customize/shared/channels-switch-dialog.d.ts +18 -0
  142. package/dist/customize/shared/channels-switch-dialog.js +30 -0
  143. package/dist/customize/shared/feature-gate-screen.js +27 -9
  144. package/dist/customize/shared/use-customize-prefetch.d.ts +2 -3
  145. package/dist/customize/shared/use-customize-prefetch.js +9 -27
  146. package/dist/customize/triggers/schedule/post-to-field.d.ts +18 -0
  147. package/dist/customize/triggers/schedule/post-to-field.js +49 -0
  148. package/dist/customize/triggers/schedule/schedule-copy.d.ts +10 -6
  149. package/dist/customize/triggers/schedule/schedule-copy.js +42 -11
  150. package/dist/customize/triggers/schedule/schedule-detail-sheet.js +2 -1
  151. package/dist/customize/triggers/schedule/trigger-composer-logic.d.ts +22 -0
  152. package/dist/customize/triggers/schedule/trigger-composer-logic.js +25 -0
  153. package/dist/customize/triggers/schedule/trigger-composer.d.ts +5 -0
  154. package/dist/customize/triggers/schedule/trigger-composer.js +23 -14
  155. package/dist/customize/triggers/schedule/trigger-edit-logic.js +3 -0
  156. package/dist/customize/triggers/schedule/trigger-filter.js +1 -1
  157. package/dist/customize/triggers/schedule/trigger-runs-logic.d.ts +2 -2
  158. package/dist/customize/triggers/schedule/trigger-runs-panel.js +1 -0
  159. package/dist/customize/triggers/schedule/trigger-toast.js +2 -1
  160. package/dist/customize/triggers/schedule-view.js +5 -2
  161. package/dist/files/index.d.ts +1 -0
  162. package/dist/files/index.js +1 -0
  163. package/dist/files/project/change-request-recovery.d.ts +1 -26
  164. package/dist/files/project/change-request-recovery.js +1 -59
  165. package/dist/files/project/components/change-request-detail-dialog.js +13 -3
  166. package/dist/files/project/components/drive-explorer.js +15 -15
  167. package/dist/files/project/components/drive-toolbar.d.ts +16 -2
  168. package/dist/files/project/components/drive-toolbar.js +14 -5
  169. package/dist/files/project/hooks/use-change-request-recovery.js +3 -19
  170. package/dist/files/project/hooks/use-change-requests.d.ts +1 -0
  171. package/dist/files/project/hooks/use-change-requests.js +11 -2
  172. package/dist/files/renderers/image-frame.d.ts +46 -0
  173. package/dist/files/renderers/image-frame.js +59 -0
  174. package/dist/files/renderers/image-renderer.d.ts +11 -1
  175. package/dist/files/renderers/image-renderer.js +13 -3
  176. package/dist/files/renderers/pdf/pdf-clipboard.d.ts +2 -0
  177. package/dist/files/renderers/pdf/pdf-clipboard.js +21 -0
  178. package/dist/files/renderers/pdf/pdf-viewer.js +4 -2
  179. package/dist/files/renderers/show-content-renderer.d.ts +9 -1
  180. package/dist/files/renderers/show-content-renderer.js +56 -14
  181. package/dist/files/runtime/file-source.js +2 -0
  182. package/dist/files/runtime/hooks/use-binary-blob.d.ts +10 -1
  183. package/dist/files/runtime/hooks/use-binary-blob.js +10 -4
  184. package/dist/files/runtime/hooks/use-shared-image.d.ts +41 -0
  185. package/dist/files/runtime/hooks/use-shared-image.js +177 -0
  186. package/dist/files/viewer/file-content-renderer.d.ts +22 -1
  187. package/dist/files/viewer/file-content-renderer.js +50 -7
  188. package/dist/files/viewer/file-header.d.ts +7 -3
  189. package/dist/files/viewer/file-header.js +20 -11
  190. package/dist/files/viewer/file-preview-modal.d.ts +1 -1
  191. package/dist/files/viewer/file-preview-modal.js +10 -22
  192. package/dist/files/viewer/file-source.d.ts +13 -0
  193. package/dist/files/viewer/use-file-content-state.d.ts +2 -0
  194. package/dist/files/viewer/use-file-content-state.js +28 -10
  195. package/dist/files/viewer/viewer-actions.d.ts +3 -1
  196. package/dist/files/viewer/viewer-actions.js +2 -2
  197. package/dist/hooks/use-media-query.d.ts +1 -0
  198. package/dist/hooks/use-mobile.d.ts +5 -0
  199. package/dist/hooks/use-mobile.js +8 -0
  200. package/dist/i18n/en.d.ts +873 -85
  201. package/dist/i18n/en.js +888 -100
  202. package/dist/i18n/ui-catalog/localize-ui-catalog.js +4 -0
  203. package/dist/i18n/ui-catalog/remaining-ui-translation-keys.generated.js +15 -3
  204. package/dist/index.d.ts +2 -2
  205. package/dist/index.js +2 -2
  206. package/dist/internal/account-hub/account-settings-sidebar.js +1 -1
  207. package/dist/internal/account-hub/hub-sheet.d.ts +9 -1
  208. package/dist/internal/account-hub/hub-sheet.js +21 -5
  209. package/dist/internal/account-hub/sections.d.ts +1 -1
  210. package/dist/internal/account-hub/sections.js +2 -1
  211. package/dist/internal/auth/auth-card-shell.js +3 -3
  212. package/dist/internal/components/agent-mark.js +5 -2
  213. package/dist/internal/connector-logo/connector-logo-source.d.ts +63 -0
  214. package/dist/internal/connector-logo/connector-logo-source.js +48 -0
  215. package/dist/internal/connector-logo/connector-logo.d.ts +39 -0
  216. package/dist/internal/connector-logo/connector-logo.js +56 -0
  217. package/dist/internal/connector-logo/connector-mark-files.d.ts +11 -0
  218. package/dist/internal/connector-logo/connector-mark-files.js +35 -0
  219. package/dist/internal/files/file-read-retry.d.ts +13 -0
  220. package/dist/internal/files/file-read-retry.js +23 -3
  221. package/dist/internal/files/session-drive-files.d.ts +5 -1
  222. package/dist/internal/files/session-drive-files.js +7 -2
  223. package/dist/internal/hooks/channels/use-channels-installations.d.ts +32 -5
  224. package/dist/internal/hooks/channels/use-channels-installations.js +55 -7
  225. package/dist/internal/hooks/channels/use-email-inboxes.d.ts +19 -0
  226. package/dist/internal/hooks/channels/use-email-inboxes.js +48 -0
  227. package/dist/internal/hooks/connectors/use-add-account.js +1 -1
  228. package/dist/internal/hooks/index.d.ts +1 -1
  229. package/dist/internal/hooks/index.js +1 -1
  230. package/dist/internal/hooks/projects/use-new-project-session.d.ts +9 -0
  231. package/dist/internal/hooks/projects/use-new-project-session.js +28 -12
  232. package/dist/internal/hooks/use-auto-scroll.d.ts +8 -1
  233. package/dist/internal/hooks/use-auto-scroll.js +4 -4
  234. package/dist/internal/icons/telegram.d.ts +5 -0
  235. package/dist/internal/icons/telegram.js +6 -1
  236. package/dist/internal/layout/nav-hover-card.d.ts +35 -0
  237. package/dist/internal/layout/nav-hover-card.js +84 -0
  238. package/dist/internal/layout/project-nav-row.d.ts +3 -1
  239. package/dist/internal/layout/project-nav-row.js +3 -2
  240. package/dist/internal/layout/project-page-header.d.ts +4 -2
  241. package/dist/internal/layout/project-page-header.js +4 -3
  242. package/dist/internal/layout/project-settings-nav.js +59 -2
  243. package/dist/internal/lib/browser-error-noise.d.ts +1 -1
  244. package/dist/internal/lib/browser-error-noise.js +1 -1
  245. package/dist/internal/lib/browser-noise/rules/injected-scripts.d.ts +7 -0
  246. package/dist/internal/lib/browser-noise/rules/injected-scripts.js +15 -0
  247. package/dist/internal/lib/manifest-version.d.ts +1 -1
  248. package/dist/internal/lib/manifest-version.js +2 -2
  249. package/dist/internal/lib/memory-href.d.ts +16 -0
  250. package/dist/internal/lib/memory-href.js +46 -0
  251. package/dist/internal/lib/use-project-feature-flags.js +9 -9
  252. package/dist/internal/lib/utils/heic-convert.d.ts +1 -1
  253. package/dist/internal/lib/utils/heic-convert.js +3 -4
  254. package/dist/internal/lib/web-notifications.d.ts +20 -0
  255. package/dist/internal/lib/web-notifications.js +48 -4
  256. package/dist/internal/notifications/notification-bell.d.ts +4 -1
  257. package/dist/internal/notifications/notification-bell.js +2 -2
  258. package/dist/internal/selection/selection-bar.d.ts +2 -1
  259. package/dist/internal/selection/selection-bar.js +1 -1
  260. package/dist/internal/stores/file-preview-store.d.ts +29 -2
  261. package/dist/internal/stores/file-preview-store.js +19 -1
  262. package/dist/internal/stores/kortix-computer-store.js +3 -0
  263. package/dist/internal/stores/sidebar-nav-store.d.ts +1 -1
  264. package/dist/internal/stores/sidebar-nav-store.js +3 -1
  265. package/dist/lib/routes.d.ts +13 -1
  266. package/dist/lib/routes.js +13 -0
  267. package/dist/markdown/index.d.ts +2 -1
  268. package/dist/markdown/index.js +2 -1
  269. package/dist/markdown/setup-links/approval-decision.d.ts +1 -0
  270. package/dist/markdown/setup-links/approval-decision.js +6 -2
  271. package/dist/markdown/setup-links/connector-handshake.d.ts +3 -1
  272. package/dist/markdown/setup-links/connector-handshake.js +12 -10
  273. package/dist/markdown/setup-links/secret-intake-form.d.ts +0 -10
  274. package/dist/markdown/setup-links/secret-intake-form.js +1 -1
  275. package/dist/markdown/setup-links/show-connect-hero.d.ts +28 -0
  276. package/dist/markdown/setup-links/show-connect-hero.js +91 -0
  277. package/dist/markdown/unified-markdown.js +5 -5
  278. package/dist/primitives/badge.d.ts +1 -1
  279. package/dist/primitives/badge.js +2 -0
  280. package/dist/primitives/disclosure.js +14 -2
  281. package/dist/primitives/empty-art.d.ts +12 -0
  282. package/dist/primitives/empty-art.js +11 -0
  283. package/dist/primitives/mermaid-renderer.d.ts +2 -0
  284. package/dist/primitives/mermaid-renderer.js +21 -15
  285. package/dist/primitives/resizable.js +6 -1
  286. package/dist/primitives/resize-seam.d.ts +11 -0
  287. package/dist/primitives/resize-seam.js +12 -0
  288. package/dist/primitives/sidebar-panel.js +4 -7
  289. package/dist/primitives/tabs.d.ts +14 -1
  290. package/dist/primitives/tabs.js +1 -1
  291. package/dist/providers/ui-provider.d.ts +9 -0
  292. package/dist/session/composer/ComposerAboveCard.d.ts +1 -1
  293. package/dist/session/composer/ComposerAboveCard.js +2 -2
  294. package/dist/session/composer/ComposerCard.d.ts +1 -1
  295. package/dist/session/composer/ComposerCard.js +3 -3
  296. package/dist/session/composer/agent-selector.d.ts +13 -1
  297. package/dist/session/composer/agent-selector.js +25 -5
  298. package/dist/session/composer/composer-agent-access.d.ts +15 -0
  299. package/dist/session/composer/composer-agent-access.js +27 -0
  300. package/dist/session/composer/composer-chat-input.d.ts +8 -2
  301. package/dist/session/composer/composer-chat-input.js +8 -6
  302. package/dist/session/composer/composer-logic.d.ts +16 -0
  303. package/dist/session/composer/composer-logic.js +12 -0
  304. package/dist/session/composer/composer-underbar.d.ts +3 -1
  305. package/dist/session/composer/composer-underbar.js +4 -3
  306. package/dist/session/composer/composer.d.ts +15 -1
  307. package/dist/session/composer/composer.js +19 -1
  308. package/dist/session/composer/draft/composer-draft.d.ts +6 -2
  309. package/dist/session/composer/draft/composer-draft.js +5 -1
  310. package/dist/session/composer/reasoning-effort-selector.js +1 -1
  311. package/dist/session/models/chatgpt-connection-button.d.ts +11 -0
  312. package/dist/session/models/chatgpt-connection-button.js +54 -0
  313. package/dist/session/models/model-selector.js +5 -2
  314. package/dist/session/models/use-model-connection-gate.d.ts +5 -5
  315. package/dist/session/models/use-model-connection-gate.js +5 -5
  316. package/dist/session/outcomes/jump-to-outcome.d.ts +10 -0
  317. package/dist/session/outcomes/jump-to-outcome.js +11 -0
  318. package/dist/session/outcomes/session-outcomes-bridge.d.ts +14 -0
  319. package/dist/session/outcomes/session-outcomes-bridge.js +12 -0
  320. package/dist/session/outcomes/session-outcomes-provider.d.ts +3 -1
  321. package/dist/session/outcomes/session-outcomes-provider.js +33 -3
  322. package/dist/session/panel/easy/app-preview.d.ts +10 -0
  323. package/dist/session/panel/easy/app-preview.js +31 -12
  324. package/dist/session/panel/easy/change-requests-card.d.ts +7 -0
  325. package/dist/session/panel/easy/change-requests-card.js +17 -0
  326. package/dist/session/panel/easy/easy-panel-logic.js +7 -1
  327. package/dist/session/panel/easy/easy-panel.js +5 -2
  328. package/dist/session/panel/easy/file-preview.js +1 -1
  329. package/dist/session/panel/easy/outputs-card.d.ts +2 -1
  330. package/dist/session/panel/easy/outputs-card.js +3 -2
  331. package/dist/session/panel/mobile-tool-drawer.js +7 -1
  332. package/dist/session/panel/session-audit-panel.js +9 -2
  333. package/dist/session/panel/session-detail-panel.js +9 -3
  334. package/dist/session/panel/session-files-explorer.d.ts +9 -0
  335. package/dist/session/panel/session-files-explorer.js +12 -3
  336. package/dist/session/panel/session-panel-provider.d.ts +15 -1
  337. package/dist/session/panel/session-panel-provider.js +32 -7
  338. package/dist/session/panel/shared/derive-panels.d.ts +8 -1
  339. package/dist/session/panel/shared/derive-panels.js +12 -2
  340. package/dist/session/panel/shared/output-priority.js +2 -0
  341. package/dist/session/participants/session-participants.d.ts +5 -1
  342. package/dist/session/participants/session-participants.js +9 -2
  343. package/dist/session/prompts/approval-request.d.ts +5 -0
  344. package/dist/session/prompts/approval-request.js +7 -1
  345. package/dist/session/prompts/session-approval-review.d.ts +9 -0
  346. package/dist/session/prompts/session-approval-review.js +18 -0
  347. package/dist/session/status/session-error-banner.js +2 -49
  348. package/dist/session/status/session-starting-loader.d.ts +14 -2
  349. package/dist/session/status/session-starting-loader.js +16 -4
  350. package/dist/session/thread/after-first-prompt.d.ts +7 -0
  351. package/dist/session/thread/after-first-prompt.js +8 -0
  352. package/dist/session/thread/detect-command.d.ts +12 -0
  353. package/dist/session/thread/detect-command.js +20 -0
  354. package/dist/session/thread/session-chat.d.ts +3 -1
  355. package/dist/session/thread/session-chat.js +377 -252
  356. package/dist/session/thread/session-thread.d.ts +3 -1
  357. package/dist/session/thread/session-thread.js +9 -2
  358. package/dist/session/thread/thread-boot-rows.d.ts +36 -0
  359. package/dist/session/thread/thread-boot-rows.js +89 -0
  360. package/dist/session/thread/transcript-rows.d.ts +31 -0
  361. package/dist/session/thread/transcript-rows.js +3 -0
  362. package/dist/session/thread/transcript.d.ts +0 -9
  363. package/dist/session/thread/transcript.js +104 -19
  364. package/dist/session/tool/shared/infrastructure-contexts.d.ts +28 -0
  365. package/dist/session/tool/shared/infrastructure-contexts.js +31 -3
  366. package/dist/session/tool/tool-part-renderer.d.ts +5 -4
  367. package/dist/session/tool/tool-part-renderer.js +8 -3
  368. package/dist/session/tool/tools/bash-tool.js +7 -6
  369. package/dist/session/tool/tools/channel-send-card.d.ts +1 -2
  370. package/dist/session/tool/tools/channel-send.d.ts +2 -1
  371. package/dist/session/tool/tools/codemode-tool.js +1 -1
  372. package/dist/session/tool/tools/connector-tools.js +1 -1
  373. package/dist/session/tool/tools/image-gen-tool.d.ts +1 -1
  374. package/dist/session/tool/tools/image-gen-tool.js +240 -53
  375. package/dist/session/tool/tools/show-tool.js +19 -8
  376. package/dist/session/turn/channel-brand.d.ts +8 -3
  377. package/dist/session/turn/channel-brand.js +20 -4
  378. package/dist/session/turn/message-author.d.ts +8 -0
  379. package/dist/session/turn/message-author.js +24 -0
  380. package/dist/session/turn/message-row.d.ts +52 -0
  381. package/dist/session/turn/message-row.js +44 -0
  382. package/dist/session/turn/plan-anchor.d.ts +1 -1
  383. package/dist/session/turn/plan-anchor.js +1 -1
  384. package/dist/session/turn/user-message.d.ts +7 -1
  385. package/dist/session/turn/user-message.js +21 -7
  386. package/dist/styles.css +1 -1
  387. package/dist/workspace/home/access-requests-bell.d.ts +9 -2
  388. package/dist/workspace/home/access-requests-bell.js +20 -6
  389. package/dist/workspace/home/first-chat.d.ts +8 -21
  390. package/dist/workspace/home/first-chat.js +22 -72
  391. package/dist/workspace/index.d.ts +6 -0
  392. package/dist/workspace/index.js +6 -0
  393. package/dist/workspace/layout/project-home.d.ts +14 -2
  394. package/dist/workspace/layout/project-home.js +60 -21
  395. package/dist/workspace/layout/use-project-home-send.d.ts +9 -1
  396. package/dist/workspace/layout/use-project-home-send.js +82 -3
  397. package/dist/workspace/memory/body-doc.d.ts +17 -0
  398. package/dist/workspace/memory/body-doc.js +208 -0
  399. package/dist/workspace/memory/body-extensions.d.ts +38 -0
  400. package/dist/workspace/memory/body-extensions.js +103 -0
  401. package/dist/workspace/memory/company-memory-page.d.ts +8 -0
  402. package/dist/workspace/memory/company-memory-page.js +16 -0
  403. package/dist/workspace/memory/memory-all.d.ts +20 -0
  404. package/dist/workspace/memory/memory-all.js +27 -0
  405. package/dist/workspace/memory/memory-body.d.ts +19 -0
  406. package/dist/workspace/memory/memory-body.js +139 -0
  407. package/dist/workspace/memory/memory-empty.d.ts +13 -0
  408. package/dist/workspace/memory/memory-empty.js +28 -0
  409. package/dist/workspace/memory/memory-history.d.ts +27 -0
  410. package/dist/workspace/memory/memory-history.js +108 -0
  411. package/dist/workspace/memory/memory-labels.d.ts +16 -0
  412. package/dist/workspace/memory/memory-labels.js +47 -0
  413. package/dist/workspace/memory/memory-page-list.d.ts +34 -0
  414. package/dist/workspace/memory/memory-page-list.js +156 -0
  415. package/dist/workspace/memory/memory-reader.d.ts +58 -0
  416. package/dist/workspace/memory/memory-reader.js +123 -0
  417. package/dist/workspace/memory/memory-view.d.ts +21 -0
  418. package/dist/workspace/memory/memory-view.js +124 -0
  419. package/dist/workspace/memory/remember-popover.d.ts +19 -0
  420. package/dist/workspace/memory/remember-popover.js +61 -0
  421. package/dist/workspace/memory/remember-this.d.ts +12 -0
  422. package/dist/workspace/memory/remember-this.js +89 -0
  423. package/dist/workspace/memory/source-mark.d.ts +18 -0
  424. package/dist/workspace/memory/source-mark.js +79 -0
  425. package/dist/workspace/memory/used-memory-chip.d.ts +14 -0
  426. package/dist/workspace/memory/used-memory-chip.js +61 -0
  427. package/dist/workspace/new/advanced-fields.d.ts +2 -1
  428. package/dist/workspace/new/advanced-fields.js +2 -2
  429. package/dist/workspace/new/source-param.d.ts +1 -1
  430. package/dist/workspace/new/source-param.js +3 -1
  431. package/dist/workspace/new/use-create-workspace.d.ts +8 -10
  432. package/dist/workspace/new/use-create-workspace.js +3 -3
  433. package/dist/workspace/projects/onboarding/app-logo.d.ts +7 -2
  434. package/dist/workspace/projects/onboarding/app-logo.js +6 -13
  435. package/dist/workspace/projects/policies-panel.js +5 -3
  436. package/dist/workspace/review/review-actions.d.ts +4 -2
  437. package/dist/workspace/review/review-actions.js +8 -2
  438. package/dist/workspace/review/review-center.js +11 -7
  439. package/dist/workspace/review/review-detail.d.ts +10 -0
  440. package/dist/workspace/review/review-detail.js +101 -13
  441. package/dist/workspace/saved-session-skeleton.d.ts +2 -2
  442. package/dist/workspace/saved-session-skeleton.js +3 -3
  443. package/dist/workspace/session-workspace.js +15 -13
  444. package/dist/workspace/sessions/project-sessions-view.js +3 -2
  445. package/dist/workspace/sessions/sessions-toolbar.d.ts +3 -1
  446. package/dist/workspace/sessions/sessions-toolbar.js +2 -2
  447. package/dist/workspace/sidebar/footer/project-apps-nav.d.ts +5 -0
  448. package/dist/workspace/sidebar/footer/project-apps-nav.js +41 -2
  449. package/dist/workspace/sidebar/footer/project-artifacts-nav.d.ts +6 -0
  450. package/dist/workspace/sidebar/footer/project-artifacts-nav.js +22 -0
  451. package/dist/workspace/sidebar/footer/project-manifest-upgrade-alert.js +13 -13
  452. package/dist/workspace/sidebar/footer/project-memory-nav.d.ts +7 -0
  453. package/dist/workspace/sidebar/footer/project-memory-nav.js +19 -0
  454. package/dist/workspace/sidebar/nav-row-meta.js +14 -2
  455. package/dist/workspace/sidebar/project-nav-items.js +3 -0
  456. package/dist/workspace/sidebar/project-session-list.js +68 -56
  457. package/dist/workspace/sidebar/project-sidebar.js +9 -2
  458. package/dist/workspace/sidebar/project-spaces-nav.d.ts +8 -0
  459. package/dist/workspace/sidebar/project-spaces-nav.js +69 -0
  460. package/dist/workspace/sidebar/session-group-order.d.ts +9 -0
  461. package/dist/workspace/sidebar/session-group-order.js +25 -0
  462. package/dist/workspace/sidebar/session-group-sections.d.ts +62 -0
  463. package/dist/workspace/sidebar/session-group-sections.js +267 -0
  464. package/dist/workspace/sidebar/session-list-chrome.d.ts +28 -0
  465. package/dist/workspace/sidebar/session-list-chrome.js +50 -0
  466. package/dist/workspace/spaces/channel-glyph.d.ts +5 -0
  467. package/dist/workspace/spaces/channel-glyph.js +6 -0
  468. package/dist/workspace/spaces/channel-setup.d.ts +16 -0
  469. package/dist/workspace/spaces/channel-setup.js +105 -0
  470. package/dist/workspace/spaces/channels-onboarding.d.ts +13 -0
  471. package/dist/workspace/spaces/channels-onboarding.js +37 -0
  472. package/dist/workspace/spaces/create-channel-dialog.d.ts +16 -0
  473. package/dist/workspace/spaces/create-channel-dialog.js +158 -0
  474. package/dist/workspace/spaces/private-channels-not-in.d.ts +9 -0
  475. package/dist/workspace/spaces/private-channels-not-in.js +69 -0
  476. package/dist/workspace/spaces/space-agents.d.ts +10 -0
  477. package/dist/workspace/spaces/space-agents.js +10 -0
  478. package/dist/workspace/spaces/space-details-dialog.d.ts +20 -0
  479. package/dist/workspace/spaces/space-details-dialog.js +176 -0
  480. package/dist/workspace/spaces/space-link-label.d.ts +49 -0
  481. package/dist/workspace/spaces/space-link-label.js +73 -0
  482. package/dist/workspace/spaces/space-links.d.ts +19 -0
  483. package/dist/workspace/spaces/space-links.js +230 -0
  484. package/dist/workspace/spaces/space-members.d.ts +46 -0
  485. package/dist/workspace/spaces/space-members.js +182 -0
  486. package/dist/workspace/spaces/space-roster.d.ts +15 -0
  487. package/dist/workspace/spaces/space-roster.js +44 -0
  488. package/dist/workspace/spaces/space-threads-tab.d.ts +56 -0
  489. package/dist/workspace/spaces/space-threads-tab.js +156 -0
  490. package/dist/workspace/spaces/space-timeline-view.d.ts +254 -0
  491. package/dist/workspace/spaces/space-timeline-view.js +235 -0
  492. package/dist/workspace/spaces/space-timeline.d.ts +106 -0
  493. package/dist/workspace/spaces/space-timeline.js +183 -0
  494. package/dist/workspace/spaces/space-triggers.d.ts +13 -0
  495. package/dist/workspace/spaces/space-triggers.js +78 -0
  496. package/dist/workspace/spaces/space-view.d.ts +37 -0
  497. package/dist/workspace/spaces/space-view.js +436 -0
  498. package/package.json +27 -36
  499. package/skills/kortix-ui/SKILL.md +3 -3
  500. package/skills/kortix-ui/references/custom-dashboard.md +3 -3
  501. package/skills/kortix-ui/references/modules.md +28 -4
  502. package/skills/kortix-ui/references/theming.md +1 -1
  503. package/dist/customize/connectors/catalog/merge-search.d.ts +0 -10
  504. package/dist/customize/connectors/catalog/merge-search.js +0 -26
  505. package/dist/customize/connectors/detail/find-easy-connect-app.d.ts +0 -29
  506. package/dist/customize/connectors/detail/find-easy-connect-app.js +0 -22
  507. package/dist/customize/migrate-to-v2/use-migrate-to-v2.d.ts +0 -9
  508. package/dist/customize/migrate-to-v2/use-migrate-to-v2.js +0 -24
  509. package/dist/customize/sections/connector-connection-header.d.ts +0 -36
  510. package/dist/customize/sections/connector-connection-header.js +0 -33
  511. package/dist/customize/sections/connector-connection-modal.d.ts +0 -34
  512. package/dist/customize/sections/connector-connection-modal.js +0 -72
  513. package/dist/customize/sections/discover-catalogue-card.d.ts +0 -19
  514. package/dist/customize/sections/discover-catalogue-card.js +0 -26
  515. package/dist/customize/sections/discover-catalogue-detail.d.ts +0 -15
  516. package/dist/customize/sections/discover-catalogue-detail.js +0 -24
  517. package/dist/customize/sections/discover-catalogue.d.ts +0 -17
  518. package/dist/customize/sections/discover-catalogue.js +0 -132
  519. package/dist/customize/sections/llm-provider/provider-access-menu.d.ts +0 -10
  520. package/dist/customize/sections/llm-provider/provider-access-menu.js +0 -23
  521. package/dist/files/project/components/drive-empty-art.d.ts +0 -2
  522. package/dist/files/project/components/drive-empty-art.js +0 -5
  523. package/dist/internal/hooks/use-media-query.d.ts +0 -2
  524. package/dist/internal/share/public-share-link-button.d.ts +0 -14
  525. package/dist/internal/share/public-share-link-button.js +0 -17
  526. package/dist/markdown/setup-links/app-credentials-form.d.ts +0 -12
  527. package/dist/markdown/setup-links/app-credentials-form.js +0 -115
  528. /package/dist/{internal/hooks → hooks}/use-media-query.js +0 -0
@@ -25,6 +25,8 @@ const DISPLAY_PROPERTIES = new Set([
25
25
  'title',
26
26
  'tooltip',
27
27
  ]);
28
+ /** Structural keys: a discriminant or an address, never copy. Translating one breaks the shape (2026-10-28: Italian turned `kind: 'steps'` into 'passaggi' and the /it/slack build crashed). */
29
+ const STRUCTURAL_PROPERTIES = new Set(['kind', 'type', 'id', 'href', 'variant', 'icon', 'tone', 'status']);
28
30
  export function translateUiCatalogText(value, tI18nComplete, translationKeys) {
29
31
  if (value.length === 0)
30
32
  return value;
@@ -41,6 +43,8 @@ export function localizeUiCatalog(value, tI18nComplete, translationKeys) {
41
43
  if (!value || typeof value !== 'object' || '$$typeof' in value)
42
44
  return value;
43
45
  return Object.fromEntries(Object.entries(value).map(([key, entry]) => {
46
+ if (STRUCTURAL_PROPERTIES.has(key))
47
+ return [key, entry];
44
48
  if (typeof entry === 'string' && DISPLAY_PROPERTIES.has(key)) {
45
49
  return [key, translateUiCatalogText(entry, tI18nComplete, translationKeys)];
46
50
  }
@@ -1,5 +1,17 @@
1
1
  // Generated from the final user-visible i18n audit. Keys are SHA-256(message)[0:12].
2
2
  export const REMAINING_UI_TRANSLATION_KEYS = {
3
+ "Connector events": 'text0ba357fa63f8',
4
+ "Connector event": 'textca395c4d19b2',
5
+ "connector event": 'text6064256ee716',
6
+ "New connector event": 'text85a6c98e5584',
7
+ "Search connector events": 'text165d9237c163',
8
+ "No connector events yet": 'texta9caf7909165',
9
+ "Have an agent run when one of your Kortix Apps emits an event.": 'text451ef98453d2',
10
+ "App event": 'text5441e7146193',
11
+ "New App event": 'text064694999e1f',
12
+ "Search App events": 'text1934aa0740bb',
13
+ "No App events yet": 'text25db7e5609e5',
14
+ "An App starts agents by emitting events. Add a trigger with on: { event, app } in kortix.yaml.": 'text9f8f92588517',
3
15
  Drive: 'text6312b4b9baf1',
4
16
  Drives: 'text729fe0e7b138',
5
17
  '{label} has finished.': 'text27d628c8b427',
@@ -201,9 +213,9 @@ export const REMAINING_UI_TRANSLATION_KEYS = {
201
213
  'Every tool runs without asking. Only the rules below can stop one.': 'texta63fb2eebd02',
202
214
  'Everything an owner can do except deleting the account or transferring ownership. Also Manager on every project.': 'textc8ef36aed650',
203
215
  Expired: 'text424a2551d356',
204
- 'Converts the v1 kortix.toml into the governance-first kortix.yaml, refreshes platform-managed skills to the latest marketplace baseline, and opens a change request for review.': 'textc3d1545dd522',
216
+ 'Moves kortix.toml or a version 2 kortix.yaml to version 3: the project registers skills, tools, commands and extensions, and each agent enables them by name. Refreshes platform-managed skills and opens a change request for review.': 'text7823a1f3af93',
205
217
  Extensions: 'textfe3436af86b4',
206
- 'Migrate manifest to v2 (kortix.yaml)': 'textd85a383e851d',
218
+ 'Upgrade manifest to v3 (kortix.yaml)': 'text08edd5b6dcdc',
207
219
  Failed: 'text031a8f0f659d',
208
220
  Favicon: 'text4295528943df',
209
221
  'Fetching deals updated ≤ 7d': 'text5bae674104b6',
@@ -778,7 +790,7 @@ export const REMAINING_UI_TRANSLATION_KEYS = {
778
790
  'What does an agent actually run on?': 'text7b84ea95f8ae',
779
791
  'Its own machine. Every session boots an isolated Linux cloud computer with your repo and your tools already on it, on its own git branch — the session id, the sandbox id and the branch name are one and the same string. The agent can install, run and break anything inside it; only what it commits survives, because the machine is destroyed with everything on it.': 'text97bbd1c3b346',
780
792
  'What stops it doing something I did not want?': 'textc145665dd580',
781
- 'You set allow, ask or block per action, and a rule can match on a glob, a regular expression, or the arguments of the call itself. Be aware that nothing is switched on for you: a project with no policy declared runs every action, so this is a thing you configure rather than a thing you inherit. Session work reaches main through a change request, and merge is default-deny for an agent — an admin has to grant it in kortix.yaml, and that grant is itself an edit somebody else has to merge.': 'texta9fe46474f33',
793
+ 'You set allow, ask or block per action, and a rule can match on a glob, a regular expression, or the arguments of the call itself. Be aware that nothing is switched on for you: a project with no policy declared runs every action, so this is a thing you configure rather than a thing you inherit. Session work reaches main through a change request, and merge is default-deny for an agent unless an admin grants it.': 'texta9fe46474f33',
782
794
  'Can I see everything an agent did?': 'text3a8d0e57770e',
783
795
  'It is all recorded, on every plan. Recording is never gated — actions, approvals and the session transcript are captured whatever you pay. Reading, exporting and streaming that audit trail out to your own SIEM is an Enterprise entitlement, so on the lower plans the record exists but the export does not.': 'text36814e8d3c88',
784
796
  'Is my company data yours?': 'text618ad8d1c91a',
package/dist/index.d.ts CHANGED
@@ -25,11 +25,11 @@ export { Message, MessageAvatar, MessageContent, MessageFooter, MessageGroup, Me
25
25
  export { Marker, MarkerContent, MarkerIcon, markerVariants, } from './primitives/marker.js';
26
26
  export { useDebounce } from './hooks/use-debounce.js';
27
27
  export { useIsMobile } from './hooks/use-mobile.js';
28
- export { useMediaQuery } from './internal/hooks/use-media-query.js';
28
+ export { useMediaQuery } from './hooks/use-media-query.js';
29
29
  export { useSlashFocus } from './internal/hooks/use-slash-focus.js';
30
30
  export { faviconUrlForHostname } from './lib/favicon.js';
31
31
  export { setUiHostEnv } from './lib/host-env.js';
32
- export { defaultUiRoutes, setUiRoutes, uiRoutes, type UiRoutes } from './lib/routes.js';
32
+ export { decodeSpaceSegment, defaultUiRoutes, setUiRoutes, uiRoutes, type UiRoutes } from './lib/routes.js';
33
33
  export { DEFAULT_ICON_WEIGHT, ICON_WEIGHTS, SHIPPED_ICON_WEIGHTS } from './lib/icon-config.js';
34
34
  export { lazyClient } from './lib/lazy-client.js';
35
35
  export { spring } from './lib/springs.js';
package/dist/index.js CHANGED
@@ -34,11 +34,11 @@ export { Message, MessageAvatar, MessageContent, MessageFooter, MessageGroup, Me
34
34
  export { Marker, MarkerContent, MarkerIcon, markerVariants, } from './primitives/marker.js';
35
35
  export { useDebounce } from './hooks/use-debounce.js';
36
36
  export { useIsMobile } from './hooks/use-mobile.js';
37
- export { useMediaQuery } from './internal/hooks/use-media-query.js';
37
+ export { useMediaQuery } from './hooks/use-media-query.js';
38
38
  export { useSlashFocus } from './internal/hooks/use-slash-focus.js';
39
39
  export { faviconUrlForHostname } from './lib/favicon.js';
40
40
  export { setUiHostEnv } from './lib/host-env.js';
41
- export { defaultUiRoutes, setUiRoutes, uiRoutes } from './lib/routes.js';
41
+ export { decodeSpaceSegment, defaultUiRoutes, setUiRoutes, uiRoutes } from './lib/routes.js';
42
42
  export { DEFAULT_ICON_WEIGHT, ICON_WEIGHTS, SHIPPED_ICON_WEIGHTS } from './lib/icon-config.js';
43
43
  export { lazyClient } from './lib/lazy-client.js';
44
44
  export { spring } from './lib/springs.js';
@@ -47,7 +47,7 @@ const ROW_CLASS = 'text-sidebar-foreground/75 font-medium hover:bg-hover hover:t
47
47
  // stay put. Same two targets the user menu's Help group lists first.
48
48
  const FOOTER_LINKS = [
49
49
  { label: 'Docs', href: '/docs', icon: BookOpenIcon },
50
- { label: 'Support', href: '/support', icon: QuestionIcon },
50
+ { label: 'Support', href: '/contact', icon: QuestionIcon },
51
51
  ];
52
52
  function NavRow({ entry }) {
53
53
  const { isMobile, setOpenMobile } = useSidebar();
@@ -18,7 +18,8 @@
18
18
  * footer (`AccessDialog`) goes in `body` alone and draws its own sticky
19
19
  * footer: it reads `useInAccountHubSheetBody()`.
20
20
  */
21
- import { type ReactNode } from 'react';
21
+ import { type ComponentProps, type ReactNode } from 'react';
22
+ import { SelectionBar } from '../selection/selection-bar.js';
22
23
  export interface AccountHubSheetContent {
23
24
  title: ReactNode;
24
25
  description?: ReactNode;
@@ -29,6 +30,13 @@ export interface AccountHubSheet {
29
30
  open: (content: AccountHubSheetContent) => void;
30
31
  close: () => void;
31
32
  }
33
+ /**
34
+ * A pane's bulk-action bar: the shared `SelectionBar`, pinned to the bottom of
35
+ * the hub's page column. The column scrolls, so `sticky` would stop under a
36
+ * short list: this renders into a slot that overlays the column's bottom edge
37
+ * and never scrolls. Render it only while something is selected.
38
+ */
39
+ export declare function AccountHubSelectionBar(props: ComponentProps<typeof SelectionBar>): import("react").ReactPortal | null;
32
40
  /** True inside the hub sheet's body: a form there draws the sheet layout, not a modal. */
33
41
  export declare function useInAccountHubSheetBody(): boolean;
34
42
  /** Opens and closes the hub's split sheet. Throws outside the hub shell. */
@@ -19,10 +19,25 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
19
19
  * footer (`AccessDialog`) goes in `body` alone and draws its own sticky
20
20
  * footer: it reads `useInAccountHubSheetBody()`.
21
21
  */
22
- import { createContext, useCallback, useContext, useMemo, useState } from 'react';
22
+ import { createContext, useCallback, useContext, useMemo, useState, } from 'react';
23
+ import { createPortal } from 'react-dom';
24
+ import { SelectionBar } from '../selection/selection-bar.js';
23
25
  import { SplitSheet, SplitSheetBody, SplitSheetContent, SplitSheetDescription, SplitSheetFooter, SplitSheetHeader, SplitSheetMain, SplitSheetTitle, } from '../../primitives/split-sheet.js';
24
26
  const AccountHubSheetContext = createContext(null);
25
27
  const SheetBodyContext = createContext(false);
28
+ const BottomBarSlotContext = createContext(null);
29
+ /**
30
+ * A pane's bulk-action bar: the shared `SelectionBar`, pinned to the bottom of
31
+ * the hub's page column. The column scrolls, so `sticky` would stop under a
32
+ * short list: this renders into a slot that overlays the column's bottom edge
33
+ * and never scrolls. Render it only while something is selected.
34
+ */
35
+ export function AccountHubSelectionBar(props) {
36
+ const slot = useContext(BottomBarSlotContext);
37
+ if (!slot)
38
+ return null;
39
+ return createPortal(_jsx("div", { className: "pointer-events-auto w-full max-w-xl", children: _jsx(SelectionBar, { ...props }) }), slot);
40
+ }
26
41
  /** True inside the hub sheet's body: a form there draws the sheet layout, not a modal. */
27
42
  export function useInAccountHubSheetBody() {
28
43
  return useContext(SheetBodyContext);
@@ -39,8 +54,9 @@ export function AccountHubSheetProvider({ children }) {
39
54
  const [content, setContent] = useState(null);
40
55
  const close = useCallback(() => setContent(null), []);
41
56
  const sheet = useMemo(() => ({ open: setContent, close }), [close]);
42
- return (_jsx(AccountHubSheetContext.Provider, { value: sheet, children: _jsxs(SplitSheet, { open: content !== null, onOpenChange: (next) => {
43
- if (!next)
44
- close();
45
- }, size: "md", children: [_jsx(SplitSheetMain, { children: children }), content ? (_jsxs(SplitSheetContent, { children: [_jsxs(SplitSheetHeader, { children: [_jsx(SplitSheetTitle, { children: content.title }), content.description ? (_jsx(SplitSheetDescription, { children: content.description })) : null] }), _jsx(SplitSheetBody, { children: _jsx(SheetBodyContext.Provider, { value: true, children: content.body }) }), content.footer ? _jsx(SplitSheetFooter, { children: content.footer }) : null] })) : null] }) }));
57
+ const [barSlot, setBarSlot] = useState(null);
58
+ return (_jsx(AccountHubSheetContext.Provider, { value: sheet, children: _jsx(BottomBarSlotContext.Provider, { value: barSlot, children: _jsxs(SplitSheet, { open: content !== null, onOpenChange: (next) => {
59
+ if (!next)
60
+ close();
61
+ }, size: "md", children: [_jsx(SplitSheetMain, { children: children }), _jsx("div", { ref: setBarSlot, className: "pointer-events-none z-10 col-start-1 row-start-1 flex justify-center self-end px-4 pb-4 empty:hidden" }), content ? (_jsxs(SplitSheetContent, { children: [_jsxs(SplitSheetHeader, { children: [_jsx(SplitSheetTitle, { children: content.title }), content.description ? (_jsx(SplitSheetDescription, { children: content.description })) : null] }), _jsx(SplitSheetBody, { children: _jsx(SheetBodyContext.Provider, { value: true, children: content.body }) }), content.footer ? _jsx(SplitSheetFooter, { children: content.footer }) : null] })) : null] }) }) }));
46
62
  }
@@ -43,7 +43,7 @@ export declare function localizedAccountPaneMeta(tI18nComplete: UiTranslator): P
43
43
  * next step up, and the usage ledger needs the room a table with seven
44
44
  * columns takes.
45
45
  */
46
- /** `fluid`: the whole pane, Linear's members table — no centred column. */
46
+ /** `fluid`: the whole pane, for the members and project tables — no centred column. */
47
47
  export type AccountPaneWidth = 'default' | 'wide' | 'full' | 'fluid';
48
48
  export declare function paneWidth(section: AccountSection): AccountPaneWidth;
49
49
  /**
@@ -127,7 +127,6 @@ export function localizedAccountPaneMeta(tI18nComplete) {
127
127
  }
128
128
  const WIDE_SECTIONS = [
129
129
  'groups',
130
- 'access-projects',
131
130
  'roles',
132
131
  'identity',
133
132
  'help',
@@ -135,7 +134,9 @@ const WIDE_SECTIONS = [
135
134
  'billing',
136
135
  ];
137
136
  const PANE_WIDTH = {
137
+ // The Members table and the project tables share one width: the whole pane.
138
138
  members: 'fluid',
139
+ 'access-projects': 'fluid',
139
140
  ...Object.fromEntries(WIDE_SECTIONS.map((section) => [section, 'wide'])),
140
141
  transactions: 'full',
141
142
  };
@@ -23,9 +23,9 @@ export function AuthLegalFooter({ variant = 'default' }) {
23
23
  if (openExternalRoute(href))
24
24
  event.preventDefault();
25
25
  };
26
- const terms = (_jsx(Link, { href: "/legal/terms", onClick: (event) => onLegalClick(event, '/legal/terms'), className: "hover:text-muted-foreground transition-colors", children: t('termsOfService') }));
27
- const privacy = (_jsx(Link, { href: "/legal?tab=privacy", onClick: (event) => onLegalClick(event, '/legal?tab=privacy'), className: "hover:text-muted-foreground transition-colors", children: t('privacyPolicy') }));
28
- return (_jsx("footer", { className: "text-muted-foreground/60 mx-auto max-w-[380px] px-6 pb-10 text-center text-sm text-balance", children: variant === 'continue'
26
+ const terms = (_jsx(Link, { href: "/legal/terms", onClick: (event) => onLegalClick(event, '/legal/terms'), className: "hover:text-foreground transition-colors", children: t('termsOfService') }));
27
+ const privacy = (_jsx(Link, { href: "/legal?tab=privacy", onClick: (event) => onLegalClick(event, '/legal?tab=privacy'), className: "hover:text-foreground transition-colors", children: t('privacyPolicy') }));
28
+ return (_jsx("footer", { className: "text-muted-foreground mx-auto max-w-[380px] px-6 pb-10 text-center text-sm text-balance", children: variant === 'continue'
29
29
  ? t.rich('byContinuingYouAgree', {
30
30
  termsOfService: () => terms,
31
31
  privacyPolicy: () => privacy,
@@ -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,63 @@
1
+ /** @internal Kortix apps only. No semver: it may change in any release. */
2
+ /**
3
+ * Which logo a connector shows. ONE rule for every surface — catalogue card,
4
+ * app page, connector page, Connected list, account rows, pickers, channel
5
+ * heroes, approvals — so an app looks the same wherever it appears.
6
+ *
7
+ * 1. A Kortix-built connector (Slack, Teams, Email, Telegram, Computer) shows
8
+ * its banner mark: the Slack and Teams brand components, the Phosphor
9
+ * envelope, plane and monitor glyphs (`ConnectorLogo` draws them). The
10
+ * files under `apps/web/public/connector-icons/<app>.svg` are the same
11
+ * marks, for consumers that need a URL, so an icon URL pointing at one is
12
+ * read as that app too.
13
+ * 2. Else the app's own icon URL: the catalogue record's, or the one the API
14
+ * resolved for an installed connector (`AdminConnector.iconUrl`).
15
+ * 3. Else the favicon of a PUBLIC catalogue domain. Never of a connector's own
16
+ * URL: a custom MCP or API host may be private, and the favicon service
17
+ * would learn it (the API holds the same line, `connector-icon.ts`).
18
+ * 4. Else the neutral fallback glyph.
19
+ */
20
+ export type NativeConnectorApp = 'slack' | 'teams' | 'email' | 'telegram' | 'computer';
21
+ /** Whatever a surface knows about the connector; every field optional. */
22
+ export interface ConnectorLogoSource {
23
+ /** Connector slug (`kortix_email`, `computer`) or catalogue id (`native:email`). */
24
+ slug?: string | null;
25
+ /** `AdminConnector.provider`: `channel`, `computer`, `composio`, `mcp`, … */
26
+ provider?: string | null;
27
+ /** A channel connector's platform. */
28
+ platform?: string | null;
29
+ /** The Kortix app a catalogue record names (`DiscoverConnector.kortix.app`). */
30
+ nativeApp?: string | null;
31
+ /** The app's own icon URL, when the source has one. */
32
+ icon?: string | null;
33
+ /** A public catalogue domain (never a connector's own URL). */
34
+ domain?: string | null;
35
+ }
36
+ export type ConnectorLogoKind = {
37
+ kind: 'native';
38
+ app: NativeConnectorApp;
39
+ } | {
40
+ kind: 'image';
41
+ src: string;
42
+ } | {
43
+ kind: 'none';
44
+ };
45
+ export declare function nativeConnectorApp(source: ConnectorLogoSource): NativeConnectorApp | null;
46
+ export declare function resolveConnectorLogo(source: ConnectorLogoSource): ConnectorLogoKind;
47
+ /** A catalogue record (Discover) as a logo source. */
48
+ export declare function discoverLogoSource(connector: {
49
+ id?: string | null;
50
+ slug?: string | null;
51
+ icon?: string | null;
52
+ domain?: string | null;
53
+ kortix?: {
54
+ app?: string | null;
55
+ } | null;
56
+ }): ConnectorLogoSource;
57
+ /** An installed connector (`AdminConnector`) as a logo source. */
58
+ export declare function installedConnectorLogoSource(connector: {
59
+ slug: string;
60
+ provider?: string | null;
61
+ platform?: string | null;
62
+ iconUrl?: string | null;
63
+ }): ConnectorLogoSource;
@@ -0,0 +1,48 @@
1
+ import { faviconUrlForHostname } from '../../lib/favicon.js';
2
+ const NATIVE_APPS = ['slack', 'teams', 'email', 'telegram', 'computer'];
3
+ function isNative(value) {
4
+ return !!value && NATIVE_APPS.includes(value);
5
+ }
6
+ export function nativeConnectorApp(source) {
7
+ if (isNative(source.nativeApp))
8
+ return source.nativeApp;
9
+ if (source.provider === 'computer')
10
+ return 'computer';
11
+ if (source.provider === 'channel' && isNative(source.platform))
12
+ return source.platform;
13
+ const slug = (source.slug ?? '').toLowerCase();
14
+ const match = /^(?:native:|kortix_)(slack|teams|email|telegram|computer)$/.exec(slug);
15
+ if (match)
16
+ return match[1];
17
+ if (slug === 'computer' || slug === 'computers')
18
+ return 'computer';
19
+ const file = /\/connector-icons\/(slack|teams|email|telegram|computer)\.svg$/.exec(source.icon ?? '');
20
+ return file ? file[1] : null;
21
+ }
22
+ export function resolveConnectorLogo(source) {
23
+ const native = nativeConnectorApp(source);
24
+ if (native)
25
+ return { kind: 'native', app: native };
26
+ if (source.icon)
27
+ return { kind: 'image', src: source.icon };
28
+ const domain = source.domain?.trim();
29
+ return domain ? { kind: 'image', src: faviconUrlForHostname(domain) } : { kind: 'none' };
30
+ }
31
+ /** A catalogue record (Discover) as a logo source. */
32
+ export function discoverLogoSource(connector) {
33
+ return {
34
+ slug: connector.id ?? connector.slug,
35
+ nativeApp: connector.kortix?.app ?? null,
36
+ icon: connector.icon,
37
+ domain: connector.domain,
38
+ };
39
+ }
40
+ /** An installed connector (`AdminConnector`) as a logo source. */
41
+ export function installedConnectorLogoSource(connector) {
42
+ return {
43
+ slug: connector.slug,
44
+ provider: connector.provider,
45
+ platform: connector.platform,
46
+ icon: connector.iconUrl,
47
+ };
48
+ }
@@ -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;
@@ -0,0 +1,56 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { EnvelopeSimpleIcon, MonitorIcon, PlugIcon } from '@phosphor-icons/react';
4
+ import { useState } from 'react';
5
+ import { MicrosoftTeams } from '../icons/microsoft-teams.js';
6
+ import { Slack } from '../icons/slack.js';
7
+ import { Telegram } from '../icons/telegram.js';
8
+ import { cn } from '../lib/utils.js';
9
+ import { resolveConnectorLogo, } from './connector-logo-source.js';
10
+ const TILE = {
11
+ xs: 'size-5 rounded-sm',
12
+ sm: 'size-6 rounded-sm',
13
+ md: 'size-8 rounded-md',
14
+ lg: 'size-9 rounded-md',
15
+ xl: 'size-14 rounded-xl',
16
+ };
17
+ const MARK = { xs: 'size-3', sm: 'size-3.5', md: 'size-4', lg: 'size-5', xl: 'size-7' };
18
+ /**
19
+ * The marks of the Kortix-built connectors, as their channel banners draw
20
+ * them; brand marks keep their colours. `apps/web/public/connector-icons/<app>.svg`
21
+ * is this mark rendered on its tile (`connector-mark-files.tsx`), so the URL
22
+ * the API catalogue sends and this component are one image.
23
+ */
24
+ export const NATIVE_MARK = {
25
+ slack: { Mark: Slack, brand: true },
26
+ teams: { Mark: MicrosoftTeams, brand: true },
27
+ telegram: { Mark: Telegram, brand: true },
28
+ email: { Mark: EnvelopeSimpleIcon, brand: false },
29
+ computer: { Mark: MonitorIcon, brand: false },
30
+ };
31
+ /** The tile a mark sits on: the channel banner's (background, hairline border). */
32
+ function MarkTile({ size, className, children, }) {
33
+ return (_jsx("span", { "aria-hidden": true, className: cn('bg-background flex shrink-0 items-center justify-center border', TILE[size], className), children: children }));
34
+ }
35
+ /**
36
+ * A connector's logo — the only one. Every connector, app and account surface
37
+ * renders this, so the same app shows the same mark everywhere
38
+ * (`connector-logo-source.ts` holds the rule).
39
+ *
40
+ * Kortix-built connectors and connectors with no logo draw a mark on the
41
+ * banner tile. A catalogue logo is the bare image: its own shape is the edge.
42
+ * A URL that fails to load latches per URL (a swapped URL gets a fresh try)
43
+ * and shows the neutral fallback, so "missing" and "broken" look identical.
44
+ */
45
+ export function ConnectorLogo({ source, size = 'lg', className, }) {
46
+ const logo = resolveConnectorLogo(source);
47
+ const [failedUrl, setFailedUrl] = useState(null);
48
+ if (logo.kind === 'native') {
49
+ const { Mark, brand } = NATIVE_MARK[logo.app];
50
+ return (_jsx(MarkTile, { size: size, className: className, children: _jsx(Mark, { className: cn('shrink-0', MARK[size], !brand && 'text-muted-foreground') }) }));
51
+ }
52
+ if (logo.kind === 'none' || failedUrl === logo.src) {
53
+ return (_jsx(MarkTile, { size: size, className: className, children: _jsx(PlugIcon, { className: cn('text-muted-foreground shrink-0', MARK[size]) }) }));
54
+ }
55
+ return (_jsx("span", { "aria-hidden": true, className: cn('flex shrink-0 items-center justify-center overflow-hidden', TILE[size], className), children: _jsx("img", { src: logo.src, alt: "", loading: "lazy", decoding: "async", referrerPolicy: "no-referrer", draggable: false, className: cn('size-full object-contain select-none', TILE[size]), onError: () => setFailedUrl(logo.src) }) }));
56
+ }
@@ -0,0 +1,11 @@
1
+ /** @internal Kortix apps only. No semver: it may change in any release. */
2
+ import type { NativeConnectorApp } from './connector-logo-source.js';
3
+ /**
4
+ * The SVG file for a Kortix-built connector's logo
5
+ * (`apps/web/public/connector-icons/<app>.svg`): its `ConnectorLogo` mark on
6
+ * the tile, rendered from the same component. Written by
7
+ * `scripts/write-connector-marks.tsx`; `connector-mark-files.test.ts` fails
8
+ * when a committed file and this output differ.
9
+ */
10
+ export declare function nativeMarkFileSvg(app: NativeConnectorApp): string;
11
+ export declare const NATIVE_MARK_APPS: NativeConnectorApp[];
@@ -0,0 +1,35 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { renderToStaticMarkup } from 'react-dom/server';
3
+ import { NATIVE_MARK } from './connector-logo.js';
4
+ /** `MarkTile`'s look, as a file: white ground, hairline border, rounded corners. */
5
+ const TILE_FILL = '#FFFFFF';
6
+ const TILE_BORDER = '#E4E4E7';
7
+ /** `text-muted-foreground` on the light ground, for the glyph marks. */
8
+ const GLYPH_COLOR = '#71717A';
9
+ const LABEL = {
10
+ slack: 'Slack',
11
+ teams: 'Microsoft Teams',
12
+ telegram: 'Telegram',
13
+ email: 'Email',
14
+ computer: 'Computer',
15
+ };
16
+ /**
17
+ * The SVG file for a Kortix-built connector's logo
18
+ * (`apps/web/public/connector-icons/<app>.svg`): its `ConnectorLogo` mark on
19
+ * the tile, rendered from the same component. Written by
20
+ * `scripts/write-connector-marks.tsx`; `connector-mark-files.test.ts` fails
21
+ * when a committed file and this output differ.
22
+ */
23
+ export function nativeMarkFileSvg(app) {
24
+ const { Mark, brand } = NATIVE_MARK[app];
25
+ const markup = renderToStaticMarkup(_jsx(Mark, {}));
26
+ const open = markup.slice(0, markup.indexOf('>'));
27
+ // The mark's own size and class give way to its place on the tile.
28
+ const placed = open.replace(/ (?:class|width|height)="[^"]*"/g, '').replace(/^<svg/, '<svg x="8" y="8" width="20" height="20"');
29
+ const mark = (placed + markup.slice(open.length))
30
+ .replaceAll('currentColor', brand ? 'currentColor' : GLYPH_COLOR);
31
+ return (`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36" role="img" aria-label="${LABEL[app]}">` +
32
+ `<rect x="0.5" y="0.5" width="35" height="35" rx="7.5" fill="${TILE_FILL}" stroke="${TILE_BORDER}"/>` +
33
+ `${mark}</svg>\n`);
34
+ }
35
+ export const NATIVE_MARK_APPS = Object.keys(LABEL);
@@ -25,4 +25,17 @@ export declare const SANDBOX_PARKED_REFETCH_INTERVAL_MS = 30000;
25
25
  * the file appears on its own in seconds. A parked box takes the slow lane.
26
26
  */
27
27
  export declare function sandboxWakingRefetchInterval(error: unknown, parked: boolean): number | false;
28
+ /** The image wait's polls (R38): 1, 2, 4, 8 s, then every 10 s, about 2 min in all. */
29
+ export declare const IMAGE_WAKING_ATTEMPTS = 15;
30
+ /**
31
+ * The poll interval of an image read while the session runtime is still
32
+ * starting (`isRuntimeStartingError`), after its `failures`-th failed read:
33
+ * 1 s doubling to a 10 s cap; `false` (stop) after `IMAGE_WAKING_ATTEMPTS`,
34
+ * when the tile says the image is unavailable and offers Try again; `false`
35
+ * for any other error. A file viewer keeps `sandboxWakingRefetchInterval`
36
+ * (a parked box can take longer than an image tile should wait).
37
+ */
38
+ export declare function imageWakingRefetchInterval(error: unknown, failures: number): number | false;
39
+ /** True once an image read gave up waiting for the runtime (`imageWakingRefetchInterval`). */
40
+ export declare function imageWaitedOut(error: unknown, failures: number): boolean;
28
41
  export declare function shouldRetryFileRead(filePath: string | null | undefined, failureCount: number, error: unknown): boolean;
@@ -1,4 +1,4 @@
1
- import { isSandboxNotReadyError } from '@kortix/sdk';
1
+ import { isRuntimeStartingError } from '@kortix/sdk';
2
2
  export const UPLOADED_FILE_READ_RETRY_DELAY_MS = 2_000;
3
3
  export const UPLOADED_FILE_READ_RETRY_WINDOW_MS = 60_000;
4
4
  export const UPLOADED_FILE_READ_MAX_RETRIES = Math.ceil(UPLOADED_FILE_READ_RETRY_WINDOW_MS / UPLOADED_FILE_READ_RETRY_DELAY_MS);
@@ -87,16 +87,36 @@ export const SANDBOX_PARKED_REFETCH_INTERVAL_MS = 30_000;
87
87
  * the file appears on its own in seconds. A parked box takes the slow lane.
88
88
  */
89
89
  export function sandboxWakingRefetchInterval(error, parked) {
90
- if (!isSandboxNotReadyError(error))
90
+ // Also the runtime URL not pinned yet ("Server URL not ready"): it clears on its own too.
91
+ if (!isRuntimeStartingError(error))
91
92
  return false;
92
93
  return parked ? SANDBOX_PARKED_REFETCH_INTERVAL_MS : SANDBOX_WAKING_REFETCH_INTERVAL_MS;
93
94
  }
95
+ /** The image wait's polls (R38): 1, 2, 4, 8 s, then every 10 s, about 2 min in all. */
96
+ export const IMAGE_WAKING_ATTEMPTS = 15;
97
+ /**
98
+ * The poll interval of an image read while the session runtime is still
99
+ * starting (`isRuntimeStartingError`), after its `failures`-th failed read:
100
+ * 1 s doubling to a 10 s cap; `false` (stop) after `IMAGE_WAKING_ATTEMPTS`,
101
+ * when the tile says the image is unavailable and offers Try again; `false`
102
+ * for any other error. A file viewer keeps `sandboxWakingRefetchInterval`
103
+ * (a parked box can take longer than an image tile should wait).
104
+ */
105
+ export function imageWakingRefetchInterval(error, failures) {
106
+ if (!isRuntimeStartingError(error) || failures > IMAGE_WAKING_ATTEMPTS)
107
+ return false;
108
+ return Math.min(1000 * 2 ** Math.max(0, failures - 1), 10_000);
109
+ }
110
+ /** True once an image read gave up waiting for the runtime (`imageWakingRefetchInterval`). */
111
+ export function imageWaitedOut(error, failures) {
112
+ return isRuntimeStartingError(error) && failures > IMAGE_WAKING_ATTEMPTS;
113
+ }
94
114
  export function shouldRetryFileRead(filePath, failureCount, error) {
95
115
  // A parked/booting sandbox is not a failed read. Fail fast out of the inline
96
116
  // retry loop so the viewer can render its "waking up" state immediately; the
97
117
  // query-level poll (SANDBOX_WAKING_REFETCH_INTERVAL_MS) re-reads until the
98
118
  // sandbox is back.
99
- if (isSandboxNotReadyError(error))
119
+ if (isRuntimeStartingError(error))
100
120
  return false;
101
121
  if (isUploadedWorkspacePath(filePath)) {
102
122
  if (isPermanentFileReadFailure(error) && !isMissingFileReadFailure(error))
@@ -37,7 +37,11 @@ interface DriveFilesScope {
37
37
  sessionId: string;
38
38
  queryClient: QueryClient;
39
39
  }
40
- /** Make `next` the session drive paths resolve against; returns its undo. */
40
+ /**
41
+ * Make `next` the session drive paths resolve against; returns its undo. The
42
+ * undo restores the scope it replaced: a review item's files open over a
43
+ * session page, and closing them must not drop that page's scope.
44
+ */
41
45
  export declare function setSessionDriveFilesScope(next: DriveFilesScope): () => void;
42
46
  /** Make the open session's mounts the ones drive paths resolve against. */
43
47
  export declare function useSessionDriveFilesScope(projectId: string, sessionId: string): void;
@@ -38,12 +38,17 @@ export function resolveSessionDriveFile(filePath, mounts) {
38
38
  return { driveId: best.driveId, path: `${stripTrailingSlashes(best.subdir)}${rest}` || '/' };
39
39
  }
40
40
  let scope = null;
41
- /** Make `next` the session drive paths resolve against; returns its undo. */
41
+ /**
42
+ * Make `next` the session drive paths resolve against; returns its undo. The
43
+ * undo restores the scope it replaced: a review item's files open over a
44
+ * session page, and closing them must not drop that page's scope.
45
+ */
42
46
  export function setSessionDriveFilesScope(next) {
47
+ const previous = scope;
43
48
  scope = next;
44
49
  return () => {
45
50
  if (scope === next)
46
- scope = null;
51
+ scope = previous;
47
52
  };
48
53
  }
49
54
  /** Make the open session's mounts the ones drive paths resolve against. */