@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,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. */
@@ -1,6 +1,6 @@
1
1
  /** @internal Kortix apps only. No semver: it may change in any release. */
2
- import { type EmailInstallation, type EmailMode, type EmailSenderPolicy, type SlackInstallation, type SlackMode, type ConnectTelegramInput, type TelegramInstallation } from '@kortix/sdk';
3
- export type { EmailInstallation, EmailMode, EmailSenderPolicy, SlackInstallation, SlackMode, TelegramInstallation };
2
+ import { type EmailDomain, type EmailDomainList, type EmailDomainResult, type EmailInstallation, type EmailMode, type EmailSenderPolicy, type SlackInstallation, type SlackMode, type ConnectTelegramInput, type TelegramInstallation, type ChannelAccessList, type ChannelAccessPlatform, type ChannelUser } from '@kortix/sdk';
3
+ export type { EmailDomain, EmailDomainList, EmailDomainResult, EmailInstallation, EmailMode, EmailSenderPolicy, SlackInstallation, SlackMode, TelegramInstallation, ChannelAccessPlatform, ChannelUser, };
4
4
  export declare function useSlackInstall(projectId: string | null): import("@tanstack/react-query").UseQueryResult<SlackInstallation | null, Error>;
5
5
  interface ConnectInput {
6
6
  projectId: string;
@@ -25,6 +25,21 @@ interface ConnectEmailInput {
25
25
  sender_policy?: EmailSenderPolicy;
26
26
  }
27
27
  export declare function useConnectEmail(): import("@tanstack/react-query").UseMutationResult<EmailInstallation, Error, ConnectEmailInput, unknown>;
28
+ /** The domains an own Resend API key can create inboxes on. A mutation: it runs when the user enters a key. */
29
+ export declare function useListEmailDomains(): import("@tanstack/react-query").UseMutationResult<EmailDomainList, Error, {
30
+ projectId: string;
31
+ apiKey: string;
32
+ }, unknown>;
33
+ export declare function useAddEmailDomain(): import("@tanstack/react-query").UseMutationResult<EmailDomainResult, Error, {
34
+ projectId: string;
35
+ apiKey: string;
36
+ domain: string;
37
+ }, unknown>;
38
+ export declare function useVerifyEmailDomain(): import("@tanstack/react-query").UseMutationResult<EmailDomainResult, Error, {
39
+ projectId: string;
40
+ apiKey: string;
41
+ domainId: string;
42
+ }, unknown>;
28
43
  export declare function useDisconnectEmail(): import("@tanstack/react-query").UseMutationResult<{
29
44
  projectId: string;
30
45
  connectorSlug: string | null | undefined;
@@ -37,13 +52,25 @@ export declare function useUpdateEmailPolicy(): import("@tanstack/react-query").
37
52
  connectorSlug?: string | null;
38
53
  sender_policy: EmailSenderPolicy;
39
54
  }, unknown>;
40
- /** The project's Telegram bot (connectors_v2). Pass null to keep the query off. */
55
+ /** The project's Telegram bot. Pass null to keep the query off. */
41
56
  export declare function useTelegramInstall(projectId: string | null): import("@tanstack/react-query").UseQueryResult<TelegramInstallation | null, Error>;
42
57
  export declare function useConnectTelegram(): import("@tanstack/react-query").UseMutationResult<TelegramInstallation, Error, {
43
58
  projectId: string;
44
59
  } & ConnectTelegramInput, unknown>;
45
- export declare function useSetTelegramAllowedUsers(): import("@tanstack/react-query").UseMutationResult<TelegramInstallation, Error, {
60
+ /** Allowed users and access requests, with their names on the platform. Each fetch can call the platform, so enable it only on demand. */
61
+ export declare function useChannelUsers(projectId: string, platform: ChannelAccessPlatform, enabled: boolean): import("@tanstack/react-query").UseQueryResult<import("@kortix/sdk").ChannelUsers, Error>;
62
+ /** One user's profile photo. Off without a `version`: that user has no photo. */
63
+ export declare function useChannelUserPhoto(projectId: string, platform: ChannelAccessPlatform, userId: string, version: string | null, enabled: boolean): import("@tanstack/react-query").UseQueryResult<Blob | null, Error>;
64
+ export declare const useAllowChannelUser: (platform: ChannelAccessPlatform) => import("@tanstack/react-query").UseMutationResult<ChannelAccessList, Error, {
65
+ projectId: string;
66
+ userId: string;
67
+ }, unknown>;
68
+ export declare const useRemoveChannelUser: (platform: ChannelAccessPlatform) => import("@tanstack/react-query").UseMutationResult<ChannelAccessList, Error, {
69
+ projectId: string;
70
+ userId: string;
71
+ }, unknown>;
72
+ export declare const useDismissChannelAccessRequest: (platform: ChannelAccessPlatform) => import("@tanstack/react-query").UseMutationResult<ChannelAccessList, Error, {
46
73
  projectId: string;
47
- userIds: string[];
74
+ userId: string;
48
75
  }, unknown>;
49
76
  export declare function useDisconnectTelegram(): import("@tanstack/react-query").UseMutationResult<void, Error, string, unknown>;
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { connectEmail, connectSlack, connectTelegram, disconnectEmail, disconnectSlack, disconnectTelegram, getEmailInstallation, getEmailMode, getSlackInstallation, getSlackManifest, getSlackMode, getTelegramInstallation, setTelegramAllowedUsers, updateEmailPolicy, } from '@kortix/sdk';
2
+ import { addEmailDomain, connectEmail, listEmailDomains, verifyEmailDomain, connectSlack, connectTelegram, disconnectEmail, disconnectSlack, disconnectTelegram, getEmailInstallation, getEmailMode, getSlackInstallation, getSlackManifest, getSlackMode, getTelegramInstallation, getChannelUserPhoto, listChannelUsers, allowChannelUser, removeChannelUser, dismissChannelAccessRequest, updateEmailPolicy, } from '@kortix/sdk';
3
3
  import { qk } from '@kortix/sdk/react';
4
4
  import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
5
5
  const key = (projectId) => ['channels', 'slack-install', projectId ?? 'none'];
@@ -73,7 +73,7 @@ export function useEmailMode(projectId) {
73
73
  staleTime: 60_000,
74
74
  queryFn: () => projectId
75
75
  ? getEmailMode(projectId)
76
- : { provider: 'agentmail', managed_available: false },
76
+ : { provider: 'resend', managed_available: false },
77
77
  });
78
78
  }
79
79
  export function useConnectEmail() {
@@ -87,6 +87,22 @@ export function useConnectEmail() {
87
87
  },
88
88
  });
89
89
  }
90
+ /** The domains an own Resend API key can create inboxes on. A mutation: it runs when the user enters a key. */
91
+ export function useListEmailDomains() {
92
+ return useMutation({
93
+ mutationFn: ({ projectId, apiKey }) => listEmailDomains(projectId, { apiKey }),
94
+ });
95
+ }
96
+ export function useAddEmailDomain() {
97
+ return useMutation({
98
+ mutationFn: ({ projectId, apiKey, domain }) => addEmailDomain(projectId, { apiKey, domain }),
99
+ });
100
+ }
101
+ export function useVerifyEmailDomain() {
102
+ return useMutation({
103
+ mutationFn: ({ projectId, apiKey, domainId }) => verifyEmailDomain(projectId, { apiKey, domainId }),
104
+ });
105
+ }
90
106
  export function useDisconnectEmail() {
91
107
  const qc = useQueryClient();
92
108
  return useMutation({
@@ -112,8 +128,11 @@ export function useUpdateEmailPolicy() {
112
128
  },
113
129
  });
114
130
  }
115
- const telegramKey = (projectId) => ['channels', 'telegram-install', projectId ?? 'none'];
116
- /** The project's Telegram bot (connectors_v2). Pass null to keep the query off. */
131
+ const installKey = (platform, projectId) => ['channels', `${platform}-install`, projectId ?? 'none'];
132
+ const usersKey = (platform, projectId) => ['channels', `${platform}-users`, projectId];
133
+ const telegramKey = (projectId) => installKey('telegram', projectId);
134
+ const telegramUsersKey = (projectId) => usersKey('telegram', projectId);
135
+ /** The project's Telegram bot. Pass null to keep the query off. */
117
136
  export function useTelegramInstall(projectId) {
118
137
  return useQuery({
119
138
  queryKey: telegramKey(projectId),
@@ -128,23 +147,52 @@ export function useConnectTelegram() {
128
147
  mutationFn: ({ projectId, ...body }) => connectTelegram(projectId, body),
129
148
  onSuccess: (_data, { projectId }) => {
130
149
  qc.invalidateQueries({ queryKey: telegramKey(projectId) });
150
+ // Another bot sees other users: never show the old bot's list.
151
+ qc.removeQueries({ queryKey: telegramUsersKey(projectId) });
131
152
  qc.invalidateQueries({ queryKey: qk.project.connectors(projectId) });
132
153
  },
133
154
  });
134
155
  }
135
- export function useSetTelegramAllowedUsers() {
156
+ /** Allowed users and access requests, with their names on the platform. Each fetch can call the platform, so enable it only on demand. */
157
+ export function useChannelUsers(projectId, platform, enabled) {
158
+ return useQuery({
159
+ queryKey: usersKey(platform, projectId),
160
+ enabled,
161
+ queryFn: () => listChannelUsers(projectId, platform),
162
+ });
163
+ }
164
+ /** One user's profile photo. Off without a `version`: that user has no photo. */
165
+ export function useChannelUserPhoto(projectId, platform, userId, version, enabled) {
166
+ return useQuery({
167
+ queryKey: ['channels', `${platform}-photo`, projectId, userId, version],
168
+ enabled: enabled && !!version,
169
+ // The version is in the key: a new photo is a new key.
170
+ staleTime: Infinity,
171
+ retry: false,
172
+ queryFn: ({ signal }) => getChannelUserPhoto(projectId, platform, userId, version, signal),
173
+ });
174
+ }
175
+ function useChannelUserMutation(platform, action) {
136
176
  const qc = useQueryClient();
137
177
  return useMutation({
138
- mutationFn: ({ projectId, userIds }) => setTelegramAllowedUsers(projectId, userIds),
139
- onSuccess: (_data, { projectId }) => qc.invalidateQueries({ queryKey: telegramKey(projectId) }),
178
+ mutationFn: ({ projectId, userId }) => action(projectId, platform, userId),
179
+ // Returned so the mutation stays pending until the list shows the change.
180
+ onSuccess: (_data, { projectId }) => Promise.all([
181
+ qc.invalidateQueries({ queryKey: installKey(platform, projectId) }),
182
+ qc.invalidateQueries({ queryKey: usersKey(platform, projectId) }),
183
+ ]),
140
184
  });
141
185
  }
186
+ export const useAllowChannelUser = (platform) => useChannelUserMutation(platform, allowChannelUser);
187
+ export const useRemoveChannelUser = (platform) => useChannelUserMutation(platform, removeChannelUser);
188
+ export const useDismissChannelAccessRequest = (platform) => useChannelUserMutation(platform, dismissChannelAccessRequest);
142
189
  export function useDisconnectTelegram() {
143
190
  const qc = useQueryClient();
144
191
  return useMutation({
145
192
  mutationFn: (projectId) => disconnectTelegram(projectId),
146
193
  onSuccess: (_data, projectId) => {
147
194
  qc.invalidateQueries({ queryKey: telegramKey(projectId) });
195
+ qc.removeQueries({ queryKey: telegramUsersKey(projectId) });
148
196
  qc.invalidateQueries({ queryKey: qk.project.connectors(projectId) });
149
197
  },
150
198
  });
@@ -0,0 +1,19 @@
1
+ /** @internal Kortix apps only. No semver: it may change in any release. */
2
+ import { type AddEmailInboxInput, type EmailInbox, type EmailSenderPolicy } from '@kortix/sdk';
3
+ export type { AddEmailInboxInput, EmailInbox };
4
+ /** The inboxes the viewer can use. Pass null to keep the query off (flag off). */
5
+ export declare function useEmailInboxes(projectId: string | null): import("@tanstack/react-query").UseQueryResult<EmailInbox[], Error>;
6
+ export declare function useAddEmailInbox(): import("@tanstack/react-query").UseMutationResult<EmailInbox, Error, AddEmailInboxInput & {
7
+ projectId: string;
8
+ }, unknown>;
9
+ export declare function useUpdateEmailInbox(): import("@tanstack/react-query").UseMutationResult<EmailInbox, Error, {
10
+ projectId: string;
11
+ connectionId: string;
12
+ sender_policy?: EmailSenderPolicy;
13
+ display_name?: string;
14
+ label?: string;
15
+ }, unknown>;
16
+ export declare function useRemoveEmailInbox(): import("@tanstack/react-query").UseMutationResult<import("@kortix/sdk").RemoveEmailInboxResult, Error, {
17
+ projectId: string;
18
+ connectionId: string;
19
+ }, unknown>;
@@ -0,0 +1,48 @@
1
+ 'use client';
2
+ import { addEmailInbox, listEmailInboxes, removeEmailInbox, updateEmailInbox, } from '@kortix/sdk';
3
+ import { qk } from '@kortix/sdk/react';
4
+ import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
5
+ /**
6
+ * The project's email inboxes. Each inbox is one ACCOUNT on the `kortix_email`
7
+ * connector profile, so the standard account surfaces (default, who can use
8
+ * it) apply to it; these hooks add what only email has: the Resend inbox
9
+ * behind the account, its address and who may email it.
10
+ */
11
+ const inboxesKey = (projectId) => ['channels', 'email-inboxes', projectId ?? 'none'];
12
+ /** Everything that shows an inbox: the inbox list, the account list, the connector page. */
13
+ function refreshInboxViews(qc, projectId) {
14
+ void qc.invalidateQueries({ queryKey: inboxesKey(projectId) });
15
+ void qc.invalidateQueries({ queryKey: ['connections', projectId] });
16
+ void qc.invalidateQueries({ queryKey: qk.project.connectors(projectId) });
17
+ void qc.invalidateQueries({ queryKey: ['channels', 'email-install'] });
18
+ }
19
+ /** The inboxes the viewer can use. Pass null to keep the query off (flag off). */
20
+ export function useEmailInboxes(projectId) {
21
+ return useQuery({
22
+ queryKey: inboxesKey(projectId),
23
+ enabled: !!projectId,
24
+ staleTime: 30_000,
25
+ queryFn: async () => (projectId ? listEmailInboxes(projectId) : []),
26
+ });
27
+ }
28
+ export function useAddEmailInbox() {
29
+ const qc = useQueryClient();
30
+ return useMutation({
31
+ mutationFn: ({ projectId, ...input }) => addEmailInbox(projectId, input),
32
+ onSuccess: (_inbox, { projectId }) => refreshInboxViews(qc, projectId),
33
+ });
34
+ }
35
+ export function useUpdateEmailInbox() {
36
+ const qc = useQueryClient();
37
+ return useMutation({
38
+ mutationFn: ({ projectId, connectionId, ...patch }) => updateEmailInbox(projectId, connectionId, patch),
39
+ onSuccess: (_inbox, { projectId }) => refreshInboxViews(qc, projectId),
40
+ });
41
+ }
42
+ export function useRemoveEmailInbox() {
43
+ const qc = useQueryClient();
44
+ return useMutation({
45
+ mutationFn: ({ projectId, connectionId }) => removeEmailInbox(projectId, connectionId),
46
+ onSuccess: (_result, { projectId }) => refreshInboxViews(qc, projectId),
47
+ });
48
+ }
@@ -33,7 +33,7 @@ export function useAddAccount({ projectId, connector, displayName, onAdded, onCr
33
33
  queryFn: () => listConnections(projectId),
34
34
  staleTime: 30_000,
35
35
  // A channel connector has no accounts: same guard as `useConnectorDetail`.
36
- enabled: connector.provider !== 'channel',
36
+ enabled: connector.provider !== 'channel' || connector.platform === 'email',
37
37
  });
38
38
  const addManaged = useAddManagedAccount(projectId, connector.slug, accountId, onAdded);
39
39
  // Direct providers: create the account, narrow it before it holds a
@@ -2,6 +2,6 @@
2
2
  /**
3
3
  * Utility Hooks
4
4
  */
5
- export { useMediaQuery } from './use-media-query.js';
5
+ export { useMediaQuery } from '../../hooks/use-media-query.js';
6
6
  export { useIsMobile } from '../../hooks/use-mobile.js';
7
7
  export { useSlashFocus } from './use-slash-focus.js';
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Utility Hooks
3
3
  */
4
- export { useMediaQuery } from './use-media-query.js';
4
+ export { useMediaQuery } from '../../hooks/use-media-query.js';
5
5
  export { useIsMobile } from '../../hooks/use-mobile.js';
6
6
  export { useSlashFocus } from './use-slash-focus.js';
@@ -40,6 +40,9 @@ import { type PendingSessionPrompt, type SessionConnectorBindingsInput } from '@
40
40
  */
41
41
  /**
42
42
  * Options for a new-session start.
43
+ * `create.space_id` files the session in a channel or DM (`project_channels`).
44
+ * It never claims a warm session, shows no toast, and does not navigate: the
45
+ * space view stays and `onNavigate(sessionId)` opens the thread beside it.
43
46
  * `agent_name` chooses the session's boot agent. Later prompts can name another
44
47
  * agent; the API re-scopes its grants before forwarding the prompt.
45
48
  * `connector_bindings` binds specific connections; `inherit_unbound`
@@ -52,11 +55,17 @@ import { type PendingSessionPrompt, type SessionConnectorBindingsInput } from '@
52
55
  */
53
56
  export type NewProjectSessionOpts = {
54
57
  onNavigate?: (sessionId: string) => void;
58
+ /**
59
+ * Runs with the client-minted id right before the create POST (never on the
60
+ * warm path). A space draws its optimistic thread row here; `onError` takes it back.
61
+ */
62
+ onCreating?: (sessionId: string) => void;
55
63
  onError?: () => void;
56
64
  scope?: SessionScopeCommit;
57
65
  create?: {
58
66
  sandbox_slug?: string;
59
67
  agent_name?: string;
68
+ space_id?: string;
60
69
  pending_prompt?: PendingSessionPrompt;
61
70
  connector_bindings?: SessionConnectorBindingsInput;
62
71
  inherit_unbound?: boolean;
@@ -25,11 +25,14 @@ function makeTakeOrCreateSession(projectId, opts, router, queryClient, onAdopt)
25
25
  // null whenever there is nothing suitable, so the create path below stays
26
26
  // the authority on billing and connector requirements.
27
27
  async function takeOrCreateSession() {
28
- const warm = takeWarmSessionEntry(projectId, {
29
- create: opts?.create,
30
- // Replenish after /start, not beside the claim and /start requests.
31
- replenish: false,
32
- });
28
+ // A space thread always creates: a warm session belongs to no space.
29
+ const warm = opts.create?.space_id
30
+ ? null
31
+ : takeWarmSessionEntry(projectId, {
32
+ create: opts?.create,
33
+ // Replenish after /start, not beside the claim and /start requests.
34
+ replenish: false,
35
+ });
33
36
  if (warm) {
34
37
  // The first prompt is a DURABLE inbox row, never a client-side
35
38
  // replay (the start stash carries picks only — see the producers).
@@ -61,7 +64,9 @@ function makeTakeOrCreateSession(projectId, opts, router, queryClient, onAdopt)
61
64
  }
62
65
  const sessionId = randomUUID();
63
66
  markSessionFresh(sessionId);
64
- router.prefetch(uiRoutes().session(projectId, sessionId));
67
+ opts.onCreating?.(sessionId);
68
+ if (!opts.create?.space_id)
69
+ router.prefetch(uiRoutes().session(projectId, sessionId));
65
70
  let created;
66
71
  try {
67
72
  created = await createProjectSession(projectId, {
@@ -92,6 +97,7 @@ function makeTakeOrCreateSession(projectId, opts, router, queryClient, onAdopt)
92
97
  }
93
98
  export function useNewProjectSession(projectId) {
94
99
  const t = useTranslations('threads');
100
+ const tSpaces = useTranslations('spaces.view');
95
101
  const router = useUiRouter();
96
102
  const pathname = useUiPathname();
97
103
  const queryClient = useQueryClient();
@@ -186,7 +192,8 @@ export function useNewProjectSession(projectId) {
186
192
  const takeOrCreateSession = makeTakeOrCreateSession(projectId, opts, router, queryClient, (session) => {
187
193
  adoptedWarmSession = session;
188
194
  });
189
- const createSession = () =>
195
+ // A space thread shows up in the timeline at once, so it gets no toast.
196
+ const inSpace = Boolean(opts.create?.space_id);
190
197
  // `threads.*`, not `hardcodedUi.i18nComplete.*`. The two
191
198
  // i18nComplete slots these used to read hold the literal strings
192
199
  // "startingSession" and "sessionStarted" in en, fr, de, pt, sr and
@@ -194,9 +201,11 @@ export function useNewProjectSession(projectId) {
194
201
  // rendered its own key name. `threads.startingSession` /
195
202
  // `threads.sessionStarted` are the canonical entries and are
196
203
  // correctly translated in all nine catalogs.
197
- loadingToast(t('startingSession'), takeOrCreateSession(), {
198
- success: t('sessionStarted'),
199
- });
204
+ const createSession = () => inSpace
205
+ ? takeOrCreateSession()
206
+ : loadingToast(t('startingSession'), takeOrCreateSession(), {
207
+ success: t('sessionStarted'),
208
+ });
200
209
  createScopedSession({
201
210
  create: createSession,
202
211
  draft: opts?.scope?.draft,
@@ -243,6 +252,11 @@ export function useNewProjectSession(projectId) {
243
252
  invalidate: () => queryClient.invalidateQueries({ queryKey: qk.project.sessionsScope(projectId) }),
244
253
  });
245
254
  opts?.onNavigate?.(sessionId);
255
+ // The space view stays on screen, so no navigation lands to release the claim.
256
+ if (inSpace) {
257
+ release();
258
+ return;
259
+ }
246
260
  // nav-contract: prefetch-only — the session id is minted or returned
247
261
  // by the create POST, so no anchor can name it. `takeOrCreateSession`
248
262
  // prefetches the route the moment the id exists.
@@ -251,6 +265,7 @@ export function useNewProjectSession(projectId) {
251
265
  }).catch((err) => {
252
266
  const code = err?.code;
253
267
  const action = resolveCreateFailure(code, err instanceof ApiError);
268
+ const failed = inSpace ? tSpaces('sendFailed') : t('failedToStartSession');
254
269
  if (action === 'upgrade') {
255
270
  openUpgradeDialog({ reason: 'subscription_required', accountId });
256
271
  }
@@ -264,11 +279,11 @@ export function useNewProjectSession(projectId) {
264
279
  });
265
280
  }
266
281
  else {
267
- errorToast(err instanceof Error ? err.message : t('failedToStartSession'));
282
+ errorToast(err instanceof Error ? err.message : failed);
268
283
  }
269
284
  }
270
285
  else if (action === 'toast') {
271
- errorToast(err instanceof Error ? err.message : t('failedToStartSession'));
286
+ errorToast(err instanceof Error ? err.message : failed);
272
287
  }
273
288
  // No navigation happened, so release the claim now — the user stays
274
289
  // where they are and must be able to try again immediately.
@@ -286,6 +301,7 @@ export function useNewProjectSession(projectId) {
286
301
  openUpgradeDialog,
287
302
  accountId,
288
303
  t,
304
+ tSpaces,
289
305
  queryClient,
290
306
  openConnectorGate,
291
307
  ]);
@@ -6,6 +6,13 @@ interface UseAutoScrollOptions {
6
6
  * until then (the area is conditionally rendered), so the observers and
7
7
  * listeners attach on this edge. */
8
8
  hasContent?: boolean;
9
+ /**
10
+ * FACT 1's room under the newest turn. False keeps only the bottom gap: the
11
+ * end is the end of the content, as in a chat thread (a channel's thread
12
+ * panel). A transcript shorter than the viewport then rests at the top,
13
+ * never below an empty screen. Default true.
14
+ */
15
+ room?: boolean;
9
16
  }
10
17
  interface UseAutoScrollReturn {
11
18
  scrollRef: React.RefObject<HTMLDivElement | null>;
@@ -27,4 +34,4 @@ interface UseAutoScrollReturn {
27
34
  * turns follow off until the reader comes to the end themselves. */
28
35
  startAtTop: () => void;
29
36
  }
30
- export declare function useAutoScroll({ hasContent, }?: UseAutoScrollOptions): UseAutoScrollReturn;
37
+ export declare function useAutoScroll({ hasContent, room, }?: UseAutoScrollOptions): UseAutoScrollReturn;