@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
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';
3
- import { OWN_SCROLL_MS, chevronVisible, isAtEnd, keyScrollIntentFor, pickAnchorIndex, prefersReducedMotion, roomUnderNewestTurn, settleMotion, shouldReleaseFollow, } from './use-auto-scroll-physics.js';
3
+ import { BOTTOM_GAP_PX, OWN_SCROLL_MS, chevronVisible, isAtEnd, keyScrollIntentFor, pickAnchorIndex, prefersReducedMotion, roomUnderNewestTurn, settleMotion, shouldReleaseFollow, } from './use-auto-scroll-physics.js';
4
4
  export { AT_END_PX, BOTTOM_GAP_PX, CHEVRON_PX, GLIDE_MIN_PX, OWN_SCROLL_MS, TURN_TOP_OFFSET, chevronVisible, classifyScrollKey, isAtEnd, isEditableTarget, isSpaceActivatedTarget, keyScrollIntentFor, pickAnchorIndex, roomUnderNewestTurn, settleMotion, shouldReleaseFollow, } from './use-auto-scroll-physics.js';
5
5
  /**
6
6
  * useAutoScroll — the session transcript's scroll physics, from first
@@ -75,7 +75,7 @@ const SEND_GLIDE_ARM_MS = 1000;
75
75
  function distanceFromEnd(el) {
76
76
  return el.scrollHeight - el.scrollTop - el.clientHeight;
77
77
  }
78
- export function useAutoScroll({ hasContent = false, } = {}) {
78
+ export function useAutoScroll({ hasContent = false, room = true, } = {}) {
79
79
  const scrollRef = useRef(null);
80
80
  const contentRef = useRef(null);
81
81
  const spacerElRef = useRef(null);
@@ -149,7 +149,7 @@ export function useAutoScroll({ hasContent = false, } = {}) {
149
149
  const span = anchor
150
150
  ? spacer.getBoundingClientRect().top - anchor.getBoundingClientRect().top
151
151
  : null;
152
- const h = roomUnderNewestTurn(el.clientHeight, span);
152
+ const h = room ? roomUnderNewestTurn(el.clientHeight, span) : BOTTOM_GAP_PX;
153
153
  if (spacer.style.height !== `${h}px`)
154
154
  spacer.style.height = `${h}px`;
155
155
  const anchorChanged = previous !== null && anchor !== previous.el;
@@ -161,7 +161,7 @@ export function useAutoScroll({ hasContent = false, } = {}) {
161
161
  }
162
162
  : null;
163
163
  return { room: h, anchorChanged };
164
- }, []);
164
+ }, [room]);
165
165
  const settleRef = useRef(null);
166
166
  const cancelGlide = useCallback(() => {
167
167
  const glide = glideRef.current;
@@ -0,0 +1,5 @@
1
+ /** @internal Kortix apps only. No semver: it may change in any release. */
2
+ /** Edge brand mark, full colour. Source: gilbarbara/logos (CC0), `logos:microsoft-edge`. */
3
+ export declare const Edge: ({ className }: {
4
+ className?: string;
5
+ }) => import("react").JSX.Element;
@@ -0,0 +1,10 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useId } from 'react';
4
+ import { cn } from '@kortix/ui';
5
+ /** Edge brand mark, full colour. Source: gilbarbara/logos (CC0), `logos:microsoft-edge`. */
6
+ export const Edge = ({ className }) => {
7
+ // Gradient ids are per instance, so two marks on one page never share a definition.
8
+ const uid = useId().replace(/[^a-zA-Z0-9_-]/g, '');
9
+ return (_jsxs("svg", { viewBox: "0 0 256 256", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", className: cn('size-4', className), children: [_jsxs("defs", { children: [_jsxs("radialGradient", { id: `${uid}SVGHFrboeCQ`, cx: "161.83", cy: "788.401", r: "95.38", gradientTransform: "matrix(.9999 0 0 .9498 -4.622 -570.387)", gradientUnits: "userSpaceOnUse", children: [_jsx("stop", { offset: ".72", stopOpacity: "0" }), _jsx("stop", { offset: ".95", stopOpacity: ".53" }), _jsx("stop", { offset: "1" })] }), _jsxs("radialGradient", { id: `${uid}SVGVG94vbPK`, cx: "-773.636", cy: "746.715", r: "143.24", gradientTransform: "matrix(.15 -.9898 .8 .12 -410.718 -656.341)", gradientUnits: "userSpaceOnUse", children: [_jsx("stop", { offset: ".76", stopOpacity: "0" }), _jsx("stop", { offset: ".95", stopOpacity: ".5" }), _jsx("stop", { offset: "1" })] }), _jsxs("radialGradient", { id: `${uid}SVGw2d8JdCl`, cx: "230.593", cy: "-106.038", r: "202.43", gradientTransform: "matrix(-.04 .9998 -2.1299 -.07998 -190.775 -191.635)", gradientUnits: "userSpaceOnUse", children: [_jsx("stop", { offset: "0", stopColor: "#35c1f1" }), _jsx("stop", { offset: ".11", stopColor: "#34c1ed" }), _jsx("stop", { offset: ".23", stopColor: "#2fc2df" }), _jsx("stop", { offset: ".31", stopColor: "#2bc3d2" }), _jsx("stop", { offset: ".67", stopColor: "#36c752" })] }), _jsxs("radialGradient", { id: `${uid}SVGIqWItcPR`, cx: "536.357", cy: "-117.703", r: "97.34", gradientTransform: "matrix(.28 .9598 -.78 .23 -1.928 -410.318)", gradientUnits: "userSpaceOnUse", children: [_jsx("stop", { offset: "0", stopColor: "#66eb6e" }), _jsx("stop", { offset: "1", stopColor: "#66eb6e", stopOpacity: "0" })] }), _jsxs("linearGradient", { id: `${uid}SVGktZSUcGK`, x1: "63.334", x2: "241.617", y1: "757.83", y2: "757.83", gradientTransform: "translate(-4.63 -580.81)", gradientUnits: "userSpaceOnUse", children: [_jsx("stop", { offset: "0", stopColor: "#0c59a4" }), _jsx("stop", { offset: "1", stopColor: "#114a8b" })] }), _jsxs("linearGradient", { id: `${uid}SVGaPqZBebW`, x1: "157.401", x2: "46.028", y1: "680.556", y2: "801.868", gradientTransform: "translate(-4.63 -580.81)", gradientUnits: "userSpaceOnUse", children: [_jsx("stop", { offset: "0", stopColor: "#1b9de2" }), _jsx("stop", { offset: ".16", stopColor: "#1595df" }), _jsx("stop", { offset: ".67", stopColor: "#0680d7" }), _jsx("stop", { offset: "1", stopColor: "#0078d4" })] })] }), _jsx("path", { fill: `url(#${uid}SVGktZSUcGK)`, d: "M231 190.5c-3.4 1.8-6.9 3.4-10.5 4.7c-11.5 4.3-23.6 6.5-35.9 6.5c-47.3 0-88.5-32.5-88.5-74.3c.1-11.4 6.4-21.9 16.4-27.3c-42.8 1.8-53.8 46.4-53.8 72.5c0 73.9 68.1 81.4 82.8 81.4c7.9 0 19.8-2.3 27-4.6l1.3-.4c27.6-9.5 51-28.1 66.6-52.8c1.2-1.9.6-4.3-1.2-5.5c-1.3-.8-2.9-.9-4.2-.2" }), _jsx("path", { fill: `url(#${uid}SVGHFrboeCQ)`, d: "M231 190.5c-3.4 1.8-6.9 3.4-10.5 4.7c-11.5 4.3-23.6 6.5-35.9 6.5c-47.3 0-88.5-32.5-88.5-74.3c.1-11.4 6.4-21.9 16.4-27.3c-42.8 1.8-53.8 46.4-53.8 72.5c0 73.9 68.1 81.4 82.8 81.4c7.9 0 19.8-2.3 27-4.6l1.3-.4c27.6-9.5 51-28.1 66.6-52.8c1.2-1.9.6-4.3-1.2-5.5c-1.3-.8-2.9-.9-4.2-.2", opacity: ".35" }), _jsx("path", { fill: `url(#${uid}SVGaPqZBebW)`, d: "M105.7 241.4c-8.9-5.5-16.6-12.8-22.7-21.3c-26.3-36-18.4-86.5 17.6-112.8c3.8-2.7 7.7-5.2 11.9-7.2c3.1-1.5 8.4-4.1 15.5-4c10.1.1 19.6 4.9 25.7 13c4 5.4 6.3 11.9 6.4 18.7c0-.2 24.5-79.6-80-79.6c-43.9 0-80 41.7-80 78.2c-.2 19.3 4 38.5 12.1 56c27.6 58.8 94.8 87.6 156.4 67.1c-21.1 6.6-44.1 3.7-62.9-8.1" }), _jsx("path", { fill: `url(#${uid}SVGVG94vbPK)`, d: "M105.7 241.4c-8.9-5.5-16.6-12.8-22.7-21.3c-26.3-36-18.4-86.5 17.6-112.8c3.8-2.7 7.7-5.2 11.9-7.2c3.1-1.5 8.4-4.1 15.5-4c10.1.1 19.6 4.9 25.7 13c4 5.4 6.3 11.9 6.4 18.7c0-.2 24.5-79.6-80-79.6c-43.9 0-80 41.7-80 78.2c-.2 19.3 4 38.5 12.1 56c27.6 58.8 94.8 87.6 156.4 67.1c-21.1 6.6-44.1 3.7-62.9-8.1", opacity: ".41" }), _jsx("path", { fill: `url(#${uid}SVGw2d8JdCl)`, d: "M152.3 148.9c-.8 1-3.3 2.5-3.3 5.7c0 2.6 1.7 5.1 4.7 7.2c14.4 10 41.5 8.7 41.6 8.7c10.7 0 21.1-2.9 30.3-8.3c18.8-11 30.4-31.1 30.4-52.9c.3-22.4-8-37.3-11.3-43.9C223.5 23.9 177.7 0 128 0C58 0 1 56.2 0 126.2c.5-36.5 36.8-66 80-66c3.5 0 23.5.3 42 10.1c16.3 8.6 24.9 18.9 30.8 29.2c6.2 10.7 7.3 24.1 7.3 29.5c0 5.3-2.7 13.3-7.8 19.9" }), _jsx("path", { fill: `url(#${uid}SVGIqWItcPR)`, d: "M152.3 148.9c-.8 1-3.3 2.5-3.3 5.7c0 2.6 1.7 5.1 4.7 7.2c14.4 10 41.5 8.7 41.6 8.7c10.7 0 21.1-2.9 30.3-8.3c18.8-11 30.4-31.1 30.4-52.9c.3-22.4-8-37.3-11.3-43.9C223.5 23.9 177.7 0 128 0C58 0 1 56.2 0 126.2c.5-36.5 36.8-66 80-66c3.5 0 23.5.3 42 10.1c16.3 8.6 24.9 18.9 30.8 29.2c6.2 10.7 7.3 24.1 7.3 29.5c0 5.3-2.7 13.3-7.8 19.9" })] }));
10
+ };
@@ -1,4 +1,9 @@
1
1
  /** @internal Kortix apps only. No semver: it may change in any release. */
2
+ /**
3
+ * The official Telegram logo (telegram.org brand mark): a blue gradient
4
+ * circle with a white paper plane. Static gradient id: the mark is identical
5
+ * wherever it sits, so a shared id resolves to the same fill.
6
+ */
2
7
  export declare const Telegram: ({ className }: {
3
8
  className?: string;
4
9
  }) => import("react").JSX.Element;
@@ -1,6 +1,11 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { cn } from '../lib/utils.js';
4
+ /**
5
+ * The official Telegram logo (telegram.org brand mark): a blue gradient
6
+ * circle with a white paper plane. Static gradient id: the mark is identical
7
+ * wherever it sits, so a shared id resolves to the same fill.
8
+ */
4
9
  export const Telegram = ({ className }) => {
5
- return (_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 240 240", className: cn('size-4', className), children: [_jsx("defs", { children: _jsxs("linearGradient", { id: "tg-a", x1: "0.667", x2: "0.417", y1: "0.167", y2: "0.75", children: [_jsx("stop", { offset: "0", stopColor: "#37aee2" }), _jsx("stop", { offset: "1", stopColor: "#1e96c8" })] }) }), _jsx("circle", { cx: "120", cy: "120", r: "120", fill: "url(#tg-a)" }), _jsx("path", { fill: "#c8daea", d: "M98 175c-3.888 0-3.227-1.468-4.568-5.17L82 132.207 170 80" }), _jsx("path", { fill: "#a9c9dd", d: "M98 175c3 0 4.325-1.372 6-3l16-15.558-19.958-12.035" }), _jsx("path", { fill: "#fff", d: "M100.04 144.41l48.36 35.729c5.519 3.045 9.501 1.468 10.876-5.123l19.685-92.763c2.015-8.08-3.08-11.746-8.36-9.349l-115.59 44.571c-7.89 3.165-7.844 7.567-1.438 9.528l29.663 9.259 68.673-43.325c3.242-1.966 6.218-.91 3.776 1.258" })] }));
10
+ return (_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 240 240", className: cn('size-4', className), children: [_jsx("defs", { children: _jsxs("linearGradient", { id: "kortix-telegram-logo", x1: "0.5", y1: "0", x2: "0.5", y2: "1", children: [_jsx("stop", { offset: "0", stopColor: "#2AABEE" }), _jsx("stop", { offset: "1", stopColor: "#229ED9" })] }) }), _jsx("circle", { cx: "120", cy: "120", r: "120", fill: "url(#kortix-telegram-logo)" }), _jsx("path", { fill: "#FFFFFF", d: "M54.3 118.8c35-15.2 58.3-25.3 70-30.2 33.3-13.9 40.3-16.3 44.8-16.4 1 0 3.2.2 4.7 1.4 1.2 1 1.5 2.3 1.7 3.3s.4 3.1.2 4.7c-1.8 19-9.6 65.1-13.6 86.3-1.7 9-5 12-8.2 12.3-7 .6-12.3-4.6-19-9-10.6-6.9-16.5-11.2-26.8-18-11.9-7.8-4.2-12.1 2.6-19.1 1.8-1.8 32.5-29.8 33.1-32.3.1-.3.1-1.5-.6-2.1-.7-.6-1.7-.4-2.5-.2-1.1.2-17.9 11.4-50.6 33.5-4.8 3.3-9.1 4.9-13 4.8-4.3-.1-12.5-2.4-18.7-4.4-7.5-2.4-13.5-3.7-13-7.9.3-2.2 3.3-4.4 8.9-6.7z" })] }));
6
11
  };
@@ -0,0 +1,35 @@
1
+ /** @internal Kortix apps only. No semver: it may change in any release. */
2
+ import { PopoverContent } from '../../primitives/popover.js';
3
+ import { type ComponentProps, type PointerEvent, type RefObject } from 'react';
4
+ /**
5
+ * The hover card of a sidebar nav row (Apps, Customize): a mouse that rests on
6
+ * the row opens a list of where the row leads, so one click lands on the
7
+ * thing instead of two. The row stays a plain link: the card is a Popover
8
+ * anchored to it (`anchorRef` as `PopoverAnchor virtualRef`), not a menu
9
+ * trigger, which would take Enter and Space for itself.
10
+ *
11
+ * It opens only where hover exists (the session list's gate) and only on the
12
+ * expanded sidebar: the collapsed rail shows the row's tooltip there.
13
+ * `holdRef` names an input that keeps the card open while it has focus.
14
+ */
15
+ export declare function useNavHoverCard({ enabled, holdRef, }: {
16
+ enabled: boolean;
17
+ holdRef?: RefObject<HTMLElement | null>;
18
+ }): {
19
+ open: boolean;
20
+ setOpen: import("react").Dispatch<import("react").SetStateAction<boolean>>;
21
+ anchorRef: RefObject<HTMLElement>;
22
+ rowProps: {
23
+ onPointerEnter: (event: PointerEvent<HTMLElement>) => void;
24
+ onPointerLeave: (event: PointerEvent<HTMLElement>) => void;
25
+ onClick: () => void;
26
+ };
27
+ contentProps: {
28
+ onPointerEnter: (event: PointerEvent<HTMLElement>) => void;
29
+ onPointerLeave: (event: PointerEvent<HTMLElement>) => void;
30
+ };
31
+ };
32
+ /** The card's panel: to the right of the row, top edges aligned, never taking focus. */
33
+ export declare function NavHoverCardContent({ className, ...props }: ComponentProps<typeof PopoverContent>): import("react").JSX.Element;
34
+ /** The card's list: the floating-list padding. A list that can grow long sets its own cap. */
35
+ export declare function NavHoverCardList({ className, ...props }: ComponentProps<'ul'>): import("react").JSX.Element;
@@ -0,0 +1,84 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useMediaQuery } from '../hooks/index.js';
4
+ import { PopoverContent } from '../../primitives/popover.js';
5
+ import { useSidebar } from '../../primitives/sidebar.js';
6
+ import { cn } from '../../lib/utils.js';
7
+ import { useEffect, useRef, useState, } from 'react';
8
+ /** Time the pointer rests on the row before the card opens, so passing over it does nothing. */
9
+ const HOVER_OPEN_DELAY_MS = 400;
10
+ /** Time to cross the gap between the row and its card before it closes. Same as the More row. */
11
+ const HOVER_CLOSE_DELAY_MS = 150;
12
+ /**
13
+ * The hover card of a sidebar nav row (Apps, Customize): a mouse that rests on
14
+ * the row opens a list of where the row leads, so one click lands on the
15
+ * thing instead of two. The row stays a plain link: the card is a Popover
16
+ * anchored to it (`anchorRef` as `PopoverAnchor virtualRef`), not a menu
17
+ * trigger, which would take Enter and Space for itself.
18
+ *
19
+ * It opens only where hover exists (the session list's gate) and only on the
20
+ * expanded sidebar: the collapsed rail shows the row's tooltip there.
21
+ * `holdRef` names an input that keeps the card open while it has focus.
22
+ */
23
+ export function useNavHoverCard({ enabled, holdRef, }) {
24
+ const canHover = useMediaQuery('(min-width: 768px) and (hover: hover) and (pointer: fine)');
25
+ const { state } = useSidebar();
26
+ const [open, setOpen] = useState(false);
27
+ const anchorRef = useRef(null);
28
+ const openTimer = useRef(undefined);
29
+ const closeTimer = useRef(undefined);
30
+ const active = enabled && canHover && state === 'expanded';
31
+ const cancelTimers = () => {
32
+ clearTimeout(openTimer.current);
33
+ clearTimeout(closeTimer.current);
34
+ };
35
+ useEffect(() => cancelTimers, []);
36
+ // An open card stays open while the pointer crosses between row and card;
37
+ // a closed one opens only after the pointer rests on the row.
38
+ const hoverOpen = (event) => {
39
+ if (event.pointerType !== 'mouse' || !active)
40
+ return;
41
+ cancelTimers();
42
+ if (open)
43
+ return;
44
+ openTimer.current = setTimeout(() => setOpen(true), HOVER_OPEN_DELAY_MS);
45
+ };
46
+ const hoverClose = (event) => {
47
+ if (event.pointerType !== 'mouse')
48
+ return;
49
+ cancelTimers();
50
+ closeTimer.current = setTimeout(() => {
51
+ // Typing in the card keeps it; a click outside or Escape closes it.
52
+ if (holdRef?.current && document.activeElement === holdRef.current)
53
+ return;
54
+ setOpen(false);
55
+ }, HOVER_CLOSE_DELAY_MS);
56
+ };
57
+ return {
58
+ open: open && active,
59
+ setOpen,
60
+ anchorRef: anchorRef,
61
+ rowProps: {
62
+ onPointerEnter: (event) => {
63
+ anchorRef.current = event.currentTarget;
64
+ hoverOpen(event);
65
+ },
66
+ onPointerLeave: hoverClose,
67
+ onClick: () => {
68
+ cancelTimers();
69
+ setOpen(false);
70
+ },
71
+ },
72
+ contentProps: { onPointerEnter: hoverOpen, onPointerLeave: hoverClose },
73
+ };
74
+ }
75
+ /** The card's panel: to the right of the row, top edges aligned, never taking focus. */
76
+ export function NavHoverCardContent({ className, ...props }) {
77
+ return (_jsx(PopoverContent, { side: "right", align: "start", sideOffset: 8, className: cn('w-60 overflow-hidden p-0', className),
78
+ // Hover must not move focus: the row keeps it, and so does the page.
79
+ onOpenAutoFocus: (event) => event.preventDefault(), onCloseAutoFocus: (event) => event.preventDefault(), ...props }));
80
+ }
81
+ /** The card's list: the floating-list padding. A list that can grow long sets its own cap. */
82
+ export function NavHoverCardList({ className, ...props }) {
83
+ return _jsx("ul", { className: cn('p-1', className), ...props });
84
+ }
@@ -2,8 +2,10 @@
2
2
  import { HoverPrefetchLink } from '../components/hover-prefetch-link.js';
3
3
  import type { ComponentProps, ReactNode } from 'react';
4
4
  /** Keep the anchor's intent handlers and the caller's active-route semantics. */
5
- export declare function ProjectNavRow({ active, label, children, ...link }: ComponentProps<typeof HoverPrefetchLink> & {
5
+ export declare function ProjectNavRow({ active, label, className, children, ...link }: ComponentProps<typeof HoverPrefetchLink> & {
6
6
  active: boolean;
7
7
  label: string;
8
+ /** Added to the row button's classes. */
9
+ className?: string;
8
10
  children: ReactNode;
9
11
  }): import("react").JSX.Element;
@@ -3,11 +3,12 @@ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { HoverPrefetchLink } from '../components/hover-prefetch-link.js';
4
4
  import { SidebarMenuButton, SidebarMenuItem, useSidebar } from '../../primitives/sidebar.js';
5
5
  import { useIsMobile } from '../hooks/index.js';
6
+ import { cn } from '../lib/utils.js';
6
7
  /** Keep the anchor's intent handlers and the caller's active-route semantics. */
7
- export function ProjectNavRow({ active, label, children, ...link }) {
8
+ export function ProjectNavRow({ active, label, className, children, ...link }) {
8
9
  const isMobile = useIsMobile();
9
10
  const { setOpenMobile } = useSidebar();
10
- return (_jsx(SidebarMenuItem, { children: _jsx(SidebarMenuButton, { asChild: true, isActive: active, tooltip: label, className: "group/menu-button text-sidebar-foreground relative", children: _jsx(HoverPrefetchLink, { ...link, onClick: (event) => {
11
+ return (_jsx(SidebarMenuItem, { children: _jsx(SidebarMenuButton, { asChild: true, isActive: active, tooltip: label, className: cn('group/menu-button text-sidebar-foreground relative', className), children: _jsx(HoverPrefetchLink, { ...link, onClick: (event) => {
11
12
  link.onClick?.(event);
12
13
  if (isMobile)
13
14
  setOpenMobile(false);
@@ -5,12 +5,14 @@
5
5
  * same title-bar classes as the Customize tab bar (`CapabilityTabs`), so it
6
6
  * has the same height and clears the desktop window controls the same way.
7
7
  * A page has one view, so the title is plain text, not a one-tab underline
8
- * bar. `children` sit at the trailing edge (page actions, a docs link).
8
+ * bar. `titleAccessory` sits right after the title (a docs link). `children`
9
+ * sit at the trailing edge (page actions).
9
10
  *
10
11
  * The e2e journey `18-apps-ui` finds the page by the
11
12
  * `<h1>`.
12
13
  */
13
- export declare function ProjectPageHeader({ title, children, }: {
14
+ export declare function ProjectPageHeader({ title, titleAccessory, children, }: {
14
15
  title: string;
16
+ titleAccessory?: React.ReactNode;
15
17
  children?: React.ReactNode;
16
18
  }): import("react").JSX.Element;
@@ -8,12 +8,13 @@ import { SidebarToggle } from './sidebar-toggle.js';
8
8
  * same title-bar classes as the Customize tab bar (`CapabilityTabs`), so it
9
9
  * has the same height and clears the desktop window controls the same way.
10
10
  * A page has one view, so the title is plain text, not a one-tab underline
11
- * bar. `children` sit at the trailing edge (page actions, a docs link).
11
+ * bar. `titleAccessory` sits right after the title (a docs link). `children`
12
+ * sit at the trailing edge (page actions).
12
13
  *
13
14
  * The e2e journey `18-apps-ui` finds the page by the
14
15
  * `<h1>`.
15
16
  */
16
- export function ProjectPageHeader({ title, children, }) {
17
+ export function ProjectPageHeader({ title, titleAccessory, children, }) {
17
18
  const sidebar = useOptionalSidebar();
18
- return (_jsxs("div", { className: "kx-titlebar-row kx-capability-titlebar relative flex shrink-0 items-center gap-1 border-b px-2", "data-sidebar-collapsed": sidebar?.state === 'collapsed' || undefined, children: [_jsx(SidebarToggle, {}), _jsx("div", { className: "kx-titlebar-tabs flex h-10 min-w-0 flex-1 items-center px-3", children: _jsx("h1", { className: "text-foreground truncate text-sm font-medium", children: title }) }), children ? _jsx("div", { className: "flex shrink-0 items-center gap-1", children: children }) : null] }));
19
+ return (_jsxs("div", { className: "kx-titlebar-row kx-capability-titlebar relative flex shrink-0 items-center gap-1 border-b px-2", "data-sidebar-collapsed": sidebar?.state === 'collapsed' || undefined, children: [_jsx(SidebarToggle, {}), _jsxs("div", { className: "kx-titlebar-tabs flex h-10 min-w-0 flex-1 items-center gap-1.5 px-3", children: [_jsx("h1", { className: "text-foreground truncate text-sm font-medium", children: title }), titleAccessory] }), children ? _jsx("div", { className: "flex shrink-0 items-center gap-1", children: children }) : null] }));
19
20
  }
@@ -7,11 +7,37 @@ export { CustomizeGlyph } from '../icons/customize.js';
7
7
  import { useTranslations } from '../../i18n/index.js';
8
8
  import { useUiPathname } from '../../providers/ui-provider.js';
9
9
  import { CountBadge } from '../../primitives/count-badge.js';
10
- import { activeCapabilityTab, capabilityTabHref, } from '../lib/capability-tab-routes.js';
10
+ import { cn } from '../lib/utils.js';
11
+ import { CAPABILITY_TABS, activeCapabilityTab, capabilityTabHref, } from '../lib/capability-tab-routes.js';
11
12
  import { PROJECT_ACTIONS } from '../lib/project-actions.js';
12
13
  import { useFeatureFlag } from '@kortix/sdk/react';
13
14
  import { useProjectPageCans } from '../lib/use-project-can.js';
14
15
  import { useReviewSessionSummary } from '../hooks/use-review-session-summary.js';
16
+ import { HubLink } from '../account-hub/account-hub-location.js';
17
+ import { hubTarget } from '../stores/account-panel-store.js';
18
+ import { HoverPrefetchLink } from '../components/hover-prefetch-link.js';
19
+ import { NavHoverCardContent, NavHoverCardList, useNavHoverCard } from './nav-hover-card.js';
20
+ import { useLocalizedUiCatalog } from '../../i18n/ui-catalog/use-localized-ui-catalog.js';
21
+ import { MENU_SEPARATOR, menuRow } from '../../primitives/menu-recipe.js';
22
+ import { Popover, PopoverAnchor } from '../../primitives/popover.js';
23
+ import { getProjectDetail } from '@kortix/sdk';
24
+ import { contract, qk } from '@kortix/sdk/react';
25
+ import { useQuery } from '@tanstack/react-query';
26
+ import { AlarmIcon, CalendarIcon, CpuIcon, GearSixIcon, GitBranchIcon, LockKeyIcon, PlugIcon, RobotIcon, SquaresFourIcon, TrayIcon, UsersIcon, } from '@phosphor-icons/react';
27
+ import { Fragment } from 'react';
28
+ /** Each tab's glyph: the one the command palette shows for the same page (`menu-registry.ts`). */
29
+ const TAB_ICONS = {
30
+ agent: RobotIcon,
31
+ skills: SquaresFourIcon,
32
+ connectors: PlugIcon,
33
+ triggers: AlarmIcon,
34
+ reminders: CalendarIcon,
35
+ models: CpuIcon,
36
+ secrets: LockKeyIcon,
37
+ files: GitBranchIcon,
38
+ review: TrayIcon,
39
+ config: GearSixIcon,
40
+ };
15
41
  /**
16
42
  * The one project-configuration entry in the sidebar:
17
43
  * ProjectCustomizeNavItem, top of the panel under New session, navigating to
@@ -197,10 +223,41 @@ export function ProjectCustomizeNavItem({ projectId }) {
197
223
  // Connectors or one agent's page, not just on the landing tab.
198
224
  const isActive = !!pathname &&
199
225
  (pathname === customizePath(projectId) || activeCapabilityTab(pathname) !== null);
226
+ const card = useNavHoverCard({ enabled: !!tab && !!projectId });
200
227
  if (!tab)
201
228
  return null;
202
229
  // No project id means no valid href, so there is nothing to render.
203
230
  if (!projectId)
204
231
  return null;
205
- return (_jsxs(ProjectNavRow, { active: isActive, label: t('customize'), href: capabilityTabHref(projectId, tab), prefetch: true, children: [_jsx("span", { className: "shrink-0", children: _jsx(CustomizeGlyph, {}) }), t('customize'), reviewCount > 0 ? (_jsx("span", { className: "ml-auto flex shrink-0 items-center gap-1", children: _jsx(CountBadge, { count: reviewCount, tone: "waiting" }) })) : null] }));
232
+ return (_jsxs(Popover, { open: card.open, onOpenChange: card.setOpen, children: [_jsx(PopoverAnchor, { virtualRef: card.anchorRef }), _jsxs(ProjectNavRow, { active: isActive, label: t('customize'), href: capabilityTabHref(projectId, tab), prefetch: true, ...card.rowProps, children: [_jsx("span", { className: "shrink-0", children: _jsx(CustomizeGlyph, {}) }), t('customize'), reviewCount > 0 ? (_jsx("span", { className: "ml-auto flex shrink-0 items-center gap-1", children: _jsx(CountBadge, { count: reviewCount, tone: "waiting" }) })) : null] }), _jsx(NavHoverCardContent, { ...card.contentProps, children: _jsx(CustomizeCardList, { projectId: projectId, tabs: access.tabs, reviewCount: reviewCount, onOpen: () => card.setOpen(false) }) })] }));
233
+ }
234
+ /**
235
+ * The Customize card: every tab the caller may open, in the tab bar's order
236
+ * and with its seams (Agents | the library | Members and Settings), so the
237
+ * card and the bar read as one list. Members is the bar's launcher into the
238
+ * Access hub, gated the same way (`project.members.read`).
239
+ */
240
+ function CustomizeCardList({ projectId, tabs, reviewCount, onOpen, }) {
241
+ const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
242
+ const allTabs = useLocalizedUiCatalog(CAPABILITY_TABS);
243
+ const { data } = useQuery({
244
+ queryKey: qk.project.detail(projectId),
245
+ queryFn: () => getProjectDetail(projectId),
246
+ ...contract('config'),
247
+ });
248
+ const canReadMembers = useProjectPageCans(projectId)[PROJECT_ACTIONS.PROJECT_MEMBERS_READ]?.allowed === true;
249
+ const accountId = data?.project?.account_id;
250
+ const allowed = new Set(tabs);
251
+ const shown = allTabs.filter((entry) => allowed.has(entry.key));
252
+ const rowClass = menuRow('sm', 'default', 'cursor-pointer');
253
+ const tabRow = (entry) => {
254
+ const TabIcon = TAB_ICONS[entry.key];
255
+ return (_jsx("li", { children: _jsxs(HoverPrefetchLink, { href: capabilityTabHref(projectId, entry.key), onClick: onOpen, className: rowClass, children: [_jsx(TabIcon, { "aria-hidden": true }), _jsx("span", { className: "min-w-0 flex-1 truncate", children: entry.label }), entry.key === 'review' && reviewCount > 0 ? _jsx(CountBadge, { count: reviewCount, tone: "waiting" }) : null] }) }, entry.key));
256
+ };
257
+ const primary = shown.filter((entry) => entry.key === 'agent');
258
+ const library = shown.filter((entry) => entry.key !== 'agent' && entry.key !== 'config');
259
+ const trailing = shown.filter((entry) => entry.key === 'config');
260
+ const members = canReadMembers && accountId ? (_jsx("li", { children: _jsxs(HubLink, { to: hubTarget(accountId, { tab: 'access-projects', project: projectId }), onClick: onOpen, className: rowClass, children: [_jsx(UsersIcon, { "aria-hidden": true }), _jsx("span", { className: "min-w-0 flex-1 truncate", children: tI18nComplete.raw('text1044a4c056d0') })] }) }, "members")) : null;
261
+ const groups = [primary.map(tabRow), library.map(tabRow), [members, ...trailing.map(tabRow)].filter(Boolean)].filter((group) => group.length > 0);
262
+ return (_jsx(NavHoverCardList, { children: groups.map((group, index) => (_jsxs(Fragment, { children: [index > 0 ? _jsx("li", { "aria-hidden": true, className: cn(MENU_SEPARATOR, '-mx-1') }) : null, group] }, index))) }));
206
263
  }
@@ -4,7 +4,7 @@ export { isEmptyMessageUnresolvedBrowserChunkNoise, isStaleWebpackRuntimeCallNoi
4
4
  export { isClientRequestTimeoutMessage, isExpectedBillingGateMessage, isExpectedCompactionNoModelMessage, isGitMirrorUnavailableNoiseMessage, isModelNotServableNoise, isRuntimeNotReadyNoiseMessage, isServerDeadlineNoiseMessage, } from './browser-noise/rules/expected-states.js';
5
5
  export { isCaptchaInterceptorNoise, isExtensionRejectedObjectNoise, isExtensionSource, isInjectedAppSource, isInjectedScriptSendMessageNoise, isInpageJsNoErrorMessageNoise, isInpageWalletStreamNoise, isTronLinkProxyNoise, isUserscriptManagerNoise, } from './browser-noise/rules/extensions.js';
6
6
  export { isCanvasImageDataOOMNoise, isPaperShaderImageUniformNoise, isPaperShaderNullContextNoise, isPaperShaderWebGLUnsupportedNoise, isSpoofedWebGLGetParameterNoise, } from './browser-noise/rules/graphics.js';
7
- export { isOneTrustJsonParseNoise, isRedefineInjectedWalletNoise, isRedefineWebdriverNoise, isVercelLiveFeedbackNoise, } from './browser-noise/rules/injected-scripts.js';
7
+ export { isGoogletagUndefinedNoise, isOneTrustJsonParseNoise, isRedefineInjectedWalletNoise, isRedefineWebdriverNoise, isVercelLiveFeedbackNoise, } from './browser-noise/rules/injected-scripts.js';
8
8
  export { isKnownBrowserNoiseMessage, isKnownTestNoiseMessage, } from './browser-noise/rules/messages.js';
9
9
  export { isConnectionClosedNoise, isFailedToSendMessageNoise, isFramelessNetworkErrorNoise, isSignalTimeoutNoise, } from './browser-noise/rules/network.js';
10
10
  export { isIosWebViewInjectedStackOverflowNoise, isOldBrowserDomNullDerefNoise, isFirefoxDeadObjectUnattributableNoise, isOldBrowserSyntaxParseError, isOldWebkitRegexNoiseMessage, isUndefinedVariableThirdPartyNoise, isUnresolvableStackOverflowNoise, } from './browser-noise/rules/old-browsers.js';
@@ -29,7 +29,7 @@ export { isEmptyMessageUnresolvedBrowserChunkNoise, isStaleWebpackRuntimeCallNoi
29
29
  export { isClientRequestTimeoutMessage, isExpectedBillingGateMessage, isExpectedCompactionNoModelMessage, isGitMirrorUnavailableNoiseMessage, isModelNotServableNoise, isRuntimeNotReadyNoiseMessage, isServerDeadlineNoiseMessage, } from './browser-noise/rules/expected-states.js';
30
30
  export { isCaptchaInterceptorNoise, isExtensionRejectedObjectNoise, isExtensionSource, isInjectedAppSource, isInjectedScriptSendMessageNoise, isInpageJsNoErrorMessageNoise, isInpageWalletStreamNoise, isTronLinkProxyNoise, isUserscriptManagerNoise, } from './browser-noise/rules/extensions.js';
31
31
  export { isCanvasImageDataOOMNoise, isPaperShaderImageUniformNoise, isPaperShaderNullContextNoise, isPaperShaderWebGLUnsupportedNoise, isSpoofedWebGLGetParameterNoise, } from './browser-noise/rules/graphics.js';
32
- export { isOneTrustJsonParseNoise, isRedefineInjectedWalletNoise, isRedefineWebdriverNoise, isVercelLiveFeedbackNoise, } from './browser-noise/rules/injected-scripts.js';
32
+ export { isGoogletagUndefinedNoise, isOneTrustJsonParseNoise, isRedefineInjectedWalletNoise, isRedefineWebdriverNoise, isVercelLiveFeedbackNoise, } from './browser-noise/rules/injected-scripts.js';
33
33
  export { isKnownBrowserNoiseMessage, isKnownTestNoiseMessage, } from './browser-noise/rules/messages.js';
34
34
  export { isConnectionClosedNoise, isFailedToSendMessageNoise, isFramelessNetworkErrorNoise, isSignalTimeoutNoise, } from './browser-noise/rules/network.js';
35
35
  export { isIosWebViewInjectedStackOverflowNoise, isOldBrowserDomNullDerefNoise, isFirefoxDeadObjectUnattributableNoise, isOldBrowserSyntaxParseError, isOldWebkitRegexNoiseMessage, isUndefinedVariableThirdPartyNoise, isUnresolvableStackOverflowNoise, } from './browser-noise/rules/old-browsers.js';
@@ -615,8 +615,9 @@ export function isCaptchaInterceptorNoise(input) {
615
615
  }
616
616
  /**
617
617
  * An injected wallet provider rejecting a pending request with the EIP-1474
618
- * default internal error, `{ code: -32603, message: 'Internal JSON-RPC error.' }`
619
- * (the wording of the wallet RPC error library). The rejected value is a plain
618
+ * default internal error, `{ code: -32603, message: 'Internal JSON-RPC error.' }`,
619
+ * or the exact missing-account error captured in KRTX-2150 (code 4001).
620
+ * Both use the wallet provider's own wording. The rejected value is a plain
620
621
  * object with no `stack`, so Sentry reports a frameless synthetic
621
622
  * "Object captured as promise rejection with keys: code, message" and the
622
623
  * extension-stack anchor above cannot see it. Better Stack, Kortix Frontend
@@ -633,7 +634,11 @@ function isWalletInternalRpcRejectionNoise(input) {
633
634
  const value = serialized;
634
635
  if (Object.keys(value).sort().join(',') !== 'code,message')
635
636
  return false;
636
- if (value.code !== -32603 || value.message !== 'Internal JSON-RPC error.')
637
+ // KRTX-2150 recurred with a second frameless wallet payload (2026-10-29).
638
+ // Match the exact pair, not EIP-1193 code 4001 alone (user rejection).
639
+ const internal = value.code === -32603 && value.message === 'Internal JSON-RPC error.';
640
+ const missingAccount = value.code === 4001 && value.message === 'wallet must has at least one account';
641
+ if (!internal && !missingAccount)
637
642
  return false;
638
643
  return !sourcesOf(input).some((source) => isBrowserBundleSource(source) || isFirstPartyResolvedSource(source));
639
644
  }
@@ -677,6 +682,15 @@ function isWalletProviderDisconnectedRejectionNoise(input) {
677
682
  return !sourcesOf(input).some((source) => isBrowserBundleSource(source) || isFirstPartyResolvedSource(source));
678
683
  }
679
684
  export const EXTENSION_RULES = [
685
+ {
686
+ // Talisman's injected page.js rejects before wallet onboarding (KRTX-3678).
687
+ // Require its exact message and response frame; page.js alone is ambiguous.
688
+ id: 'talisman-onboarding',
689
+ appliesTo: 'sentry',
690
+ match: ({ message, frames }) => normalizeString(message) === 'Talisman extension has not been configured yet. Please continue with onboarding.' &&
691
+ !frames.some((frame) => isFirstPartyResolvedSource(frame.filename)) &&
692
+ frames.some((frame) => frame.filename === 'app:///page.js' && frame.function === 'ne.handleResponse'),
693
+ },
680
694
  {
681
695
  id: 'injected-app-source',
682
696
  appliesTo: 'both',
@@ -70,6 +70,13 @@ export declare function isInjectedWalletProviderWriteNoise(input: {
70
70
  filename?: unknown;
71
71
  } | undefined>;
72
72
  }): boolean;
73
+ export declare function isGoogletagUndefinedNoise(input: {
74
+ message?: unknown;
75
+ filename?: unknown;
76
+ frames?: Array<{
77
+ filename?: unknown;
78
+ } | undefined>;
79
+ }): boolean;
73
80
  /** Vercel toolbar frames have a reserved source path outside app bundles. */
74
81
  export declare function isVercelLiveFeedbackNoise(input: {
75
82
  filename?: unknown;
@@ -213,6 +213,20 @@ export function isInjectedWalletProviderWriteNoise(input) {
213
213
  return (UNDEFINED_WALLET_PROVIDER_WRITE_MESSAGE.test(stripped) &&
214
214
  !sources.some((source) => isBrowserBundleSource(source) || isFirstPartyResolvedSource(source)));
215
215
  }
216
+ /**
217
+ * A tag that calls Google Publisher Tag (`googletag`) before its library
218
+ * loads: `googletag is not defined` (V8, Gecko) or `Can't find variable:
219
+ * googletag` (WebKit). Better Stack, Kortix Frontend prod, 2026-10-27
220
+ * (KRTX-3549): 71 events in 2 s from one `<anonymous>` frame, 0 users. Kortix
221
+ * never loads or calls `googletag`; its Google Tag Manager writes only to
222
+ * `dataLayer`. A frame in our bundles or resolved first-party source keeps
223
+ * reporting.
224
+ */
225
+ const GOOGLETAG_UNDEFINED_MESSAGE = /^(?:googletag is not defined|Can't find variable: googletag)$/;
226
+ export function isGoogletagUndefinedNoise(input) {
227
+ return (GOOGLETAG_UNDEFINED_MESSAGE.test(stripErrorWrappers(normalizeString(input.message))) &&
228
+ !sourcesOf(input).some((source) => isBrowserBundleSource(source) || isFirstPartyResolvedSource(source)));
229
+ }
216
230
  /** Vercel toolbar frames have a reserved source path outside app bundles. */
217
231
  export function isVercelLiveFeedbackNoise(input) {
218
232
  const sources = sourcesOf(input);
@@ -225,5 +239,6 @@ export const INJECTED_SCRIPT_RULES = [
225
239
  { id: 'redefine-webdriver', appliesTo: 'both', match: isRedefineWebdriverNoise },
226
240
  { id: 'redefine-wallet-provider', appliesTo: 'both', match: isRedefineInjectedWalletNoise },
227
241
  { id: 'wallet-provider-write', appliesTo: 'both', match: isInjectedWalletProviderWriteNoise },
242
+ { id: 'googletag-undefined', appliesTo: 'both', match: isGoogletagUndefinedNoise },
228
243
  { id: 'vercel-live-feedback', appliesTo: 'both', match: isVercelLiveFeedbackNoise },
229
244
  ];
@@ -0,0 +1,43 @@
1
+ /** @internal Kortix apps only. No semver: it may change in any release. */
2
+ /**
3
+ * Platform detection for the /download page and the per-platform redirect
4
+ * routes.
5
+ *
6
+ * Detection runs on the SERVER, from the request's user-agent header, so the
7
+ * page paints the correct filled button (and, on a phone, the mobile card
8
+ * first) on first render. A client-side `useEffect` swap would let a visitor click the wrong
9
+ * installer during the flash — the exact failure this page exists to prevent.
10
+ *
11
+ * Architecture is deliberately NOT detected: macOS ships a single universal
12
+ * .dmg, and macOS user agents misreport arch anyway (they always claim Intel).
13
+ */
14
+ export type DesktopOs = 'macos' | 'windows' | 'linux';
15
+ export type MobileOs = 'ios' | 'android';
16
+ export type Platform = DesktopOs | MobileOs;
17
+ /** Fixed row order. Detection never reorders rows; it only picks the filled button. */
18
+ export declare const DESKTOP_ORDER: readonly DesktopOs[];
19
+ export declare const MOBILE_ORDER: readonly MobileOs[];
20
+ /** Map an explicit `?platform=` value or `/download/<segment>` to a platform. */
21
+ export declare function normalizePlatform(raw: string | null | undefined): Platform | null;
22
+ /**
23
+ * Best-effort platform from a user-agent string.
24
+ *
25
+ * THE ORDER OF THESE CHECKS IS LOAD-BEARING. Two user agents carry another
26
+ * platform's token:
27
+ * iPad "Mozilla/5.0 (iPad; CPU OS 17_0 like Mac OS X)" contains "mac"
28
+ * Android "Mozilla/5.0 (Linux; Android 14; Pixel 8)" contains "linux"
29
+ * So iOS is tested before macOS, and Android before Linux. `detect-os.test.ts`
30
+ * pins both; if you reorder these lines, those tests fail.
31
+ *
32
+ * KNOWN LIMITATION: an iPad with "Request Desktop Website" enabled sends a UA
33
+ * byte-identical to a Mac's. No server can separate them — real detection needs
34
+ * `navigator.maxTouchPoints`, which is not in any request header. That visitor
35
+ * gets the Desktop card first; the Mobile card is still on the page, one tap
36
+ * away. Fixing it client-side would reintroduce the wrong-file-click window
37
+ * this module exists to close.
38
+ *
39
+ * Defaults to macOS: the largest desktop segment for this product, and every
40
+ * other platform stays one click away on the page.
41
+ */
42
+ export declare function detectPlatform(userAgent: string | null | undefined): Platform;
43
+ export declare function isMobilePlatform(platform: Platform): platform is MobileOs;
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Platform detection for the /download page and the per-platform redirect
3
+ * routes.
4
+ *
5
+ * Detection runs on the SERVER, from the request's user-agent header, so the
6
+ * page paints the correct filled button (and, on a phone, the mobile card
7
+ * first) on first render. A client-side `useEffect` swap would let a visitor click the wrong
8
+ * installer during the flash — the exact failure this page exists to prevent.
9
+ *
10
+ * Architecture is deliberately NOT detected: macOS ships a single universal
11
+ * .dmg, and macOS user agents misreport arch anyway (they always claim Intel).
12
+ */
13
+ /** Fixed row order. Detection never reorders rows; it only picks the filled button. */
14
+ export const DESKTOP_ORDER = ['macos', 'windows', 'linux'];
15
+ export const MOBILE_ORDER = ['ios', 'android'];
16
+ const PLATFORM_ALIASES = {
17
+ mac: 'macos',
18
+ macos: 'macos',
19
+ osx: 'macos',
20
+ darwin: 'macos',
21
+ apple: 'macos',
22
+ win: 'windows',
23
+ windows: 'windows',
24
+ linux: 'linux',
25
+ ios: 'ios',
26
+ iphone: 'ios',
27
+ ipad: 'ios',
28
+ android: 'android',
29
+ };
30
+ /** Map an explicit `?platform=` value or `/download/<segment>` to a platform. */
31
+ export function normalizePlatform(raw) {
32
+ return PLATFORM_ALIASES[(raw || '').toLowerCase()] ?? null;
33
+ }
34
+ /**
35
+ * Best-effort platform from a user-agent string.
36
+ *
37
+ * THE ORDER OF THESE CHECKS IS LOAD-BEARING. Two user agents carry another
38
+ * platform's token:
39
+ * iPad "Mozilla/5.0 (iPad; CPU OS 17_0 like Mac OS X)" contains "mac"
40
+ * Android "Mozilla/5.0 (Linux; Android 14; Pixel 8)" contains "linux"
41
+ * So iOS is tested before macOS, and Android before Linux. `detect-os.test.ts`
42
+ * pins both; if you reorder these lines, those tests fail.
43
+ *
44
+ * KNOWN LIMITATION: an iPad with "Request Desktop Website" enabled sends a UA
45
+ * byte-identical to a Mac's. No server can separate them — real detection needs
46
+ * `navigator.maxTouchPoints`, which is not in any request header. That visitor
47
+ * gets the Desktop card first; the Mobile card is still on the page, one tap
48
+ * away. Fixing it client-side would reintroduce the wrong-file-click window
49
+ * this module exists to close.
50
+ *
51
+ * Defaults to macOS: the largest desktop segment for this product, and every
52
+ * other platform stays one click away on the page.
53
+ */
54
+ export function detectPlatform(userAgent) {
55
+ const ua = (userAgent || '').toLowerCase();
56
+ if (ua.includes('iphone') || ua.includes('ipad') || ua.includes('ipod'))
57
+ return 'ios';
58
+ if (ua.includes('android'))
59
+ return 'android';
60
+ if (ua.includes('windows'))
61
+ return 'windows';
62
+ if (ua.includes('mac') || ua.includes('darwin'))
63
+ return 'macos';
64
+ if (ua.includes('linux'))
65
+ return 'linux';
66
+ return 'macos';
67
+ }
68
+ export function isMobilePlatform(platform) {
69
+ return platform === 'ios' || platform === 'android';
70
+ }
@@ -3,7 +3,7 @@ export type ManifestVersion = 1 | 2 | 3;
3
3
  export declare function detectManifestVersion(manifestRaw: string | null | undefined): ManifestVersion;
4
4
  /** The manifest file a version lives in. An unresolved read (`null`) reads as v1. */
5
5
  export declare function manifestFilename(version: number | null): 'kortix.toml' | 'kortix.yaml';
6
- /** Only a v1 project is offered an upgrade (to v2). v3 is opt-in and not offered yet. `null` (not read yet) is not. */
6
+ /** A v1 or v2 project is offered the upgrade to v3. `null` (not read yet) is not. */
7
7
  export declare function manifestNeedsUpgrade(version: ManifestVersion | null): boolean;
8
8
  export interface ProjectManifestVersionState {
9
9
  /** `null` while the project-detail fetch is still in flight — callers that
@@ -27,9 +27,9 @@ export function detectManifestVersion(manifestRaw) {
27
27
  export function manifestFilename(version) {
28
28
  return (version ?? 1) >= 2 ? 'kortix.yaml' : 'kortix.toml';
29
29
  }
30
- /** Only a v1 project is offered an upgrade (to v2). v3 is opt-in and not offered yet. `null` (not read yet) is not. */
30
+ /** A v1 or v2 project is offered the upgrade to v3. `null` (not read yet) is not. */
31
31
  export function manifestNeedsUpgrade(version) {
32
- return version === 1;
32
+ return version === 1 || version === 2;
33
33
  }
34
34
  /**
35
35
  * Reads the SAME `qk.project.detail(id)` query the rest of Customize already