@kortix/ui 0.14.7 → 0.14.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (576) hide show
  1. package/README.md +2 -2
  2. package/dist/_vendor/kortix-shared.js +64 -4
  3. package/dist/_vendor/shared/app-config.d.ts +175 -0
  4. package/dist/_vendor/shared/channel-message.d.ts +34 -5
  5. package/dist/_vendor/shared/index.d.ts +1 -0
  6. package/dist/_vendor/shared/runtime-versions.d.ts +4 -0
  7. package/dist/_vendor/shared/space-slug.d.ts +37 -0
  8. package/dist/access/access/access-detail-shell.js +1 -1
  9. package/dist/access/access/access-dialog-share.js +4 -7
  10. package/dist/access/access/access-dialog.js +2 -1
  11. package/dist/access/access/principal-picker.d.ts +11 -0
  12. package/dist/access/access/principal-picker.js +9 -7
  13. package/dist/apps/app-preview-pool.d.ts +7 -2
  14. package/dist/apps/app-preview-pool.js +11 -5
  15. package/dist/apps/app-shared.d.ts +22 -15
  16. package/dist/apps/app-shared.js +37 -19
  17. package/dist/apps/index.d.ts +2 -2
  18. package/dist/apps/index.js +2 -2
  19. package/dist/artifacts/artifact-frame.d.ts +16 -0
  20. package/dist/artifacts/artifact-frame.js +51 -0
  21. package/dist/artifacts/artifact-session.d.ts +18 -0
  22. package/dist/artifacts/artifact-session.js +101 -0
  23. package/dist/artifacts/frame-policy.d.ts +30 -0
  24. package/dist/artifacts/frame-policy.js +61 -0
  25. package/dist/artifacts/index.d.ts +3 -0
  26. package/dist/artifacts/index.js +5 -0
  27. package/dist/browser/sandbox-browser-chrome.d.ts +4 -1
  28. package/dist/browser/sandbox-browser-chrome.js +2 -2
  29. package/dist/customize/agents/agent-cover-card.d.ts +17 -0
  30. package/dist/customize/agents/agent-cover-card.js +13 -0
  31. package/dist/customize/agents/agent-grant-pages.d.ts +5 -1
  32. package/dist/customize/agents/agent-grant-pages.js +30 -4
  33. package/dist/customize/agents/agent-page.js +8 -33
  34. package/dist/customize/agents/agent-policy-sets.d.ts +43 -0
  35. package/dist/customize/agents/agent-policy-sets.js +72 -0
  36. package/dist/customize/agents/agent-triggers-section.js +2 -1
  37. package/dist/customize/agents/agents-page.js +43 -49
  38. package/dist/customize/connectors/add-mcp/add-mcp-server-dialog.d.ts +6 -1
  39. package/dist/customize/connectors/add-mcp/add-mcp-server-dialog.js +10 -4
  40. package/dist/customize/connectors/agent-access.d.ts +35 -0
  41. package/dist/customize/connectors/agent-access.js +77 -0
  42. package/dist/customize/connectors/catalog/browse-sections.d.ts +2 -29
  43. package/dist/customize/connectors/catalog/browse-sections.js +7 -74
  44. package/dist/customize/connectors/catalog/catalog-entry.d.ts +18 -37
  45. package/dist/customize/connectors/catalog/catalog-entry.js +28 -40
  46. package/dist/customize/connectors/catalog/connector-browse.d.ts +3 -32
  47. package/dist/customize/connectors/catalog/connector-browse.js +19 -50
  48. package/dist/customize/connectors/catalog/use-catalog.d.ts +20 -59
  49. package/dist/customize/connectors/catalog/use-catalog.js +48 -175
  50. package/dist/customize/connectors/connector-identity.d.ts +9 -11
  51. package/dist/customize/connectors/connector-identity.js +13 -42
  52. package/dist/customize/connectors/connector-moves-banner.d.ts +2 -1
  53. package/dist/customize/connectors/connector-moves-banner.js +4 -6
  54. package/dist/customize/connectors/connector-routes.d.ts +21 -9
  55. package/dist/customize/connectors/connector-routes.js +29 -20
  56. package/dist/customize/connectors/connectors-page.js +53 -82
  57. package/dist/customize/connectors/detail/app-page.js +226 -98
  58. package/dist/customize/connectors/detail/computer-app-page.d.ts +16 -0
  59. package/dist/customize/connectors/detail/computer-app-page.js +39 -0
  60. package/dist/customize/connectors/detail/connector-accounts.js +3 -1
  61. package/dist/customize/connectors/detail/connector-advanced-tools.d.ts +4 -1
  62. package/dist/customize/connectors/detail/connector-advanced-tools.js +2 -2
  63. package/dist/customize/connectors/detail/connector-agents.d.ts +14 -0
  64. package/dist/customize/connectors/detail/connector-agents.js +69 -0
  65. package/dist/customize/connectors/detail/connector-detail-tabs.js +2 -1
  66. package/dist/customize/connectors/detail/connector-move-row.d.ts +8 -5
  67. package/dist/customize/connectors/detail/connector-move-row.js +23 -14
  68. package/dist/customize/connectors/detail/connector-page.d.ts +4 -1
  69. package/dist/customize/connectors/detail/connector-page.js +14 -10
  70. package/dist/customize/connectors/detail/connector-policy-sets.d.ts +28 -0
  71. package/dist/customize/connectors/detail/connector-policy-sets.js +203 -0
  72. package/dist/customize/connectors/detail/connector-settings.d.ts +4 -1
  73. package/dist/customize/connectors/detail/connector-settings.js +7 -3
  74. package/dist/customize/connectors/detail/connector-status.d.ts +19 -6
  75. package/dist/customize/connectors/detail/connector-status.js +34 -10
  76. package/dist/customize/connectors/detail/connector-tabs.d.ts +4 -1
  77. package/dist/customize/connectors/detail/connector-tabs.js +8 -2
  78. package/dist/customize/connectors/detail/connector-tools.d.ts +3 -3
  79. package/dist/customize/connectors/detail/connector-tools.js +105 -48
  80. package/dist/customize/connectors/detail/email-inboxes.d.ts +43 -0
  81. package/dist/customize/connectors/detail/email-inboxes.js +184 -0
  82. package/dist/customize/connectors/detail/provider-info.d.ts +1 -1
  83. package/dist/customize/connectors/detail/provider-info.js +2 -2
  84. package/dist/customize/connectors/detail/status-badge.d.ts +1 -1
  85. package/dist/customize/connectors/detail/status-badge.js +4 -5
  86. package/dist/customize/connectors/detail/use-connector-detail.d.ts +6 -0
  87. package/dist/customize/connectors/detail/use-connector-detail.js +14 -4
  88. package/dist/customize/connectors/install/install-dialog.d.ts +23 -0
  89. package/dist/customize/connectors/install/install-dialog.js +40 -0
  90. package/dist/customize/connectors/install/install.d.ts +13 -2
  91. package/dist/customize/connectors/install/install.js +9 -4
  92. package/dist/customize/connectors/install/use-install.d.ts +19 -2
  93. package/dist/customize/connectors/install/use-install.js +65 -37
  94. package/dist/customize/connectors/install/way-kind.d.ts +5 -0
  95. package/dist/customize/connectors/install/way-kind.js +16 -0
  96. package/dist/customize/connectors/provider-label.d.ts +2 -1
  97. package/dist/customize/connectors/provider-label.js +13 -3
  98. package/dist/customize/connectors/tools/pattern-rule-draft.d.ts +4 -0
  99. package/dist/customize/connectors/tools/pattern-rule-draft.js +12 -3
  100. package/dist/customize/connectors/tools/policy-sets.d.ts +27 -0
  101. package/dist/customize/connectors/tools/policy-sets.js +41 -0
  102. package/dist/customize/connectors/tools/tool-groups.d.ts +32 -9
  103. package/dist/customize/connectors/tools/tool-groups.js +78 -16
  104. package/dist/customize/connectors/tools/tool-policy-control.d.ts +11 -10
  105. package/dist/customize/connectors/tools/tool-policy-control.js +15 -16
  106. package/dist/customize/connectors/tools/tool-policy-labels.d.ts +6 -5
  107. package/dist/customize/connectors/tools/tool-policy-labels.js +17 -16
  108. package/dist/customize/connectors/tools/tool-policy.d.ts +50 -4
  109. package/dist/customize/connectors/tools/tool-policy.js +74 -8
  110. package/dist/customize/connectors/use-agent-access.d.ts +85 -0
  111. package/dist/customize/connectors/use-agent-access.js +72 -0
  112. package/dist/customize/migrate-to-v2/index.d.ts +1 -2
  113. package/dist/customize/migrate-to-v2/index.js +1 -2
  114. package/dist/customize/migrate-to-v2/migration-prompt.d.ts +12 -24
  115. package/dist/customize/migrate-to-v2/migration-prompt.js +34 -235
  116. package/dist/customize/migrate-to-v2/upgrade-defs.d.ts +1 -1
  117. package/dist/customize/migrate-to-v2/upgrade-defs.js +7 -6
  118. package/dist/customize/migrate-to-v2/upgrade-view.js +7 -7
  119. package/dist/customize/migrate-to-v2/use-run-upgrade.d.ts +3 -3
  120. package/dist/customize/providers/provider-accordion.js +17 -2
  121. package/dist/customize/sections/component/channel-access-panel.d.ts +16 -0
  122. package/dist/customize/sections/component/channel-access-panel.js +146 -0
  123. package/dist/customize/sections/component/channel-connect-hero.d.ts +3 -2
  124. package/dist/customize/sections/component/channel-connect-hero.js +3 -2
  125. package/dist/customize/sections/component/channel-hero-frame.d.ts +31 -0
  126. package/dist/customize/sections/component/channel-hero-frame.js +40 -0
  127. package/dist/customize/sections/component/channel-mocks.d.ts +6 -0
  128. package/dist/customize/sections/component/channel-mocks.js +46 -0
  129. package/dist/customize/sections/component/channel-row.d.ts +13 -3
  130. package/dist/customize/sections/component/channel-row.js +10 -4
  131. package/dist/customize/sections/component/email-connect-form.d.ts +27 -0
  132. package/dist/customize/sections/component/email-connect-form.js +183 -0
  133. package/dist/customize/sections/component/slack-connect-card.d.ts +7 -0
  134. package/dist/customize/sections/component/slack-connect-card.js +2 -3
  135. package/dist/customize/sections/component/teams-connect-card.d.ts +7 -0
  136. package/dist/customize/sections/component/teams-connect-card.js +2 -3
  137. package/dist/customize/sections/component/telegram-channel-row.js +16 -25
  138. package/dist/customize/sections/connectors-view.d.ts +1 -15
  139. package/dist/customize/sections/connectors-view.js +81 -314
  140. package/dist/customize/sections/view/agent-editor-catalog.js +5 -0
  141. package/dist/customize/sections/view/channels-view.d.ts +5 -1
  142. package/dist/customize/sections/view/channels-view.js +63 -81
  143. package/dist/customize/sections/view/gateway/gateway-overview.js +10 -2
  144. package/dist/customize/settings/tabs/experimental-tab.js +35 -16
  145. package/dist/customize/shared/catalog/catalog-empty-state.d.ts +1 -12
  146. package/dist/customize/shared/catalog/catalog-empty-state.js +3 -3
  147. package/dist/customize/shared/channels-switch-dialog.d.ts +18 -0
  148. package/dist/customize/shared/channels-switch-dialog.js +30 -0
  149. package/dist/customize/shared/feature-gate-screen.js +27 -9
  150. package/dist/customize/shared/new-entity-menu.js +4 -1
  151. package/dist/customize/shared/use-customize-prefetch.d.ts +2 -3
  152. package/dist/customize/shared/use-customize-prefetch.js +9 -27
  153. package/dist/customize/skills/skills-page.js +4 -5
  154. package/dist/customize/triggers/schedule/post-to-field.d.ts +18 -0
  155. package/dist/customize/triggers/schedule/post-to-field.js +49 -0
  156. package/dist/customize/triggers/schedule/schedule-copy.d.ts +10 -6
  157. package/dist/customize/triggers/schedule/schedule-copy.js +42 -11
  158. package/dist/customize/triggers/schedule/schedule-detail-sheet.js +2 -1
  159. package/dist/customize/triggers/schedule/then-fields.js +1 -5
  160. package/dist/customize/triggers/schedule/trigger-composer-logic.d.ts +22 -0
  161. package/dist/customize/triggers/schedule/trigger-composer-logic.js +25 -0
  162. package/dist/customize/triggers/schedule/trigger-composer.d.ts +5 -0
  163. package/dist/customize/triggers/schedule/trigger-composer.js +23 -14
  164. package/dist/customize/triggers/schedule/trigger-edit-logic.js +3 -0
  165. package/dist/customize/triggers/schedule/trigger-filter.js +1 -1
  166. package/dist/customize/triggers/schedule/trigger-runs-logic.d.ts +2 -2
  167. package/dist/customize/triggers/schedule/trigger-runs-panel.js +1 -0
  168. package/dist/customize/triggers/schedule/trigger-toast.js +2 -1
  169. package/dist/customize/triggers/schedule-view.js +9 -4
  170. package/dist/files/index.d.ts +1 -0
  171. package/dist/files/index.js +1 -0
  172. package/dist/files/project/change-request-recovery.d.ts +1 -26
  173. package/dist/files/project/change-request-recovery.js +1 -59
  174. package/dist/files/project/components/change-request-detail-dialog.js +13 -3
  175. package/dist/files/project/components/drive-explorer.js +15 -15
  176. package/dist/files/project/components/drive-toolbar.d.ts +16 -2
  177. package/dist/files/project/components/drive-toolbar.js +14 -5
  178. package/dist/files/project/hooks/use-change-request-recovery.js +3 -19
  179. package/dist/files/project/hooks/use-change-requests.d.ts +1 -0
  180. package/dist/files/project/hooks/use-change-requests.js +11 -2
  181. package/dist/files/renderers/image-frame.d.ts +46 -0
  182. package/dist/files/renderers/image-frame.js +59 -0
  183. package/dist/files/renderers/image-renderer.d.ts +11 -1
  184. package/dist/files/renderers/image-renderer.js +13 -3
  185. package/dist/files/renderers/pdf/pdf-clipboard.d.ts +2 -0
  186. package/dist/files/renderers/pdf/pdf-clipboard.js +21 -0
  187. package/dist/files/renderers/pdf/pdf-viewer.js +4 -2
  188. package/dist/files/renderers/show-content-renderer.d.ts +9 -1
  189. package/dist/files/renderers/show-content-renderer.js +56 -14
  190. package/dist/files/runtime/file-source.js +2 -0
  191. package/dist/files/runtime/hooks/use-binary-blob.d.ts +10 -1
  192. package/dist/files/runtime/hooks/use-binary-blob.js +10 -4
  193. package/dist/files/runtime/hooks/use-shared-image.d.ts +41 -0
  194. package/dist/files/runtime/hooks/use-shared-image.js +177 -0
  195. package/dist/files/viewer/file-content-renderer.d.ts +22 -1
  196. package/dist/files/viewer/file-content-renderer.js +50 -7
  197. package/dist/files/viewer/file-header.d.ts +7 -3
  198. package/dist/files/viewer/file-header.js +20 -11
  199. package/dist/files/viewer/file-preview-modal.d.ts +1 -1
  200. package/dist/files/viewer/file-preview-modal.js +10 -22
  201. package/dist/files/viewer/file-source.d.ts +13 -0
  202. package/dist/files/viewer/use-file-content-state.d.ts +2 -0
  203. package/dist/files/viewer/use-file-content-state.js +28 -10
  204. package/dist/files/viewer/viewer-actions.d.ts +3 -1
  205. package/dist/files/viewer/viewer-actions.js +2 -2
  206. package/dist/hooks/use-media-query.d.ts +1 -0
  207. package/dist/hooks/use-mobile.d.ts +5 -0
  208. package/dist/hooks/use-mobile.js +8 -0
  209. package/dist/i18n/en.d.ts +906 -70
  210. package/dist/i18n/en.js +924 -88
  211. package/dist/i18n/ui-catalog/localize-ui-catalog.js +4 -0
  212. package/dist/i18n/ui-catalog/remaining-ui-translation-keys.generated.js +15 -3
  213. package/dist/index.d.ts +2 -2
  214. package/dist/index.js +2 -2
  215. package/dist/internal/account-hub/account-settings-sidebar.js +1 -1
  216. package/dist/internal/account-hub/hub-sheet.d.ts +9 -1
  217. package/dist/internal/account-hub/hub-sheet.js +21 -5
  218. package/dist/internal/account-hub/sections.d.ts +1 -1
  219. package/dist/internal/account-hub/sections.js +2 -1
  220. package/dist/internal/auth/auth-card-shell.js +3 -3
  221. package/dist/internal/components/agent-mark.d.ts +38 -0
  222. package/dist/internal/components/agent-mark.js +41 -0
  223. package/dist/internal/connector-logo/connector-logo-source.d.ts +63 -0
  224. package/dist/internal/connector-logo/connector-logo-source.js +48 -0
  225. package/dist/internal/connector-logo/connector-logo.d.ts +39 -0
  226. package/dist/internal/connector-logo/connector-logo.js +56 -0
  227. package/dist/internal/connector-logo/connector-mark-files.d.ts +11 -0
  228. package/dist/internal/connector-logo/connector-mark-files.js +35 -0
  229. package/dist/internal/files/file-read-retry.d.ts +13 -0
  230. package/dist/internal/files/file-read-retry.js +23 -3
  231. package/dist/internal/files/session-drive-files.d.ts +5 -1
  232. package/dist/internal/files/session-drive-files.js +7 -2
  233. package/dist/internal/hooks/channels/use-channels-installations.d.ts +32 -5
  234. package/dist/internal/hooks/channels/use-channels-installations.js +55 -7
  235. package/dist/internal/hooks/channels/use-email-inboxes.d.ts +19 -0
  236. package/dist/internal/hooks/channels/use-email-inboxes.js +48 -0
  237. package/dist/internal/hooks/connectors/use-add-account.js +1 -1
  238. package/dist/internal/hooks/index.d.ts +1 -1
  239. package/dist/internal/hooks/index.js +1 -1
  240. package/dist/internal/hooks/projects/use-new-project-session.d.ts +9 -0
  241. package/dist/internal/hooks/projects/use-new-project-session.js +28 -12
  242. package/dist/internal/hooks/use-auto-scroll.d.ts +8 -1
  243. package/dist/internal/hooks/use-auto-scroll.js +4 -4
  244. package/dist/internal/icons/telegram.d.ts +5 -0
  245. package/dist/internal/icons/telegram.js +6 -1
  246. package/dist/internal/layout/nav-hover-card.d.ts +35 -0
  247. package/dist/internal/layout/nav-hover-card.js +84 -0
  248. package/dist/internal/layout/project-nav-row.d.ts +3 -1
  249. package/dist/internal/layout/project-nav-row.js +3 -2
  250. package/dist/internal/layout/project-page-header.d.ts +4 -2
  251. package/dist/internal/layout/project-page-header.js +4 -3
  252. package/dist/internal/layout/project-settings-nav.js +59 -2
  253. package/dist/internal/lib/browser-error-noise.d.ts +1 -1
  254. package/dist/internal/lib/browser-error-noise.js +1 -1
  255. package/dist/internal/lib/browser-noise/rules/injected-scripts.d.ts +7 -0
  256. package/dist/internal/lib/browser-noise/rules/injected-scripts.js +15 -0
  257. package/dist/internal/lib/manifest-version.d.ts +1 -1
  258. package/dist/internal/lib/manifest-version.js +2 -2
  259. package/dist/internal/lib/memory-href.d.ts +16 -0
  260. package/dist/internal/lib/memory-href.js +46 -0
  261. package/dist/internal/lib/pixel-mark.d.ts +33 -0
  262. package/dist/internal/lib/pixel-mark.js +152 -0
  263. package/dist/internal/lib/use-project-feature-flags.js +11 -11
  264. package/dist/internal/lib/utils/heic-convert.d.ts +1 -1
  265. package/dist/internal/lib/utils/heic-convert.js +3 -4
  266. package/dist/internal/lib/web-notifications.d.ts +20 -0
  267. package/dist/internal/lib/web-notifications.js +48 -4
  268. package/dist/internal/notifications/notification-bell.d.ts +4 -1
  269. package/dist/internal/notifications/notification-bell.js +2 -2
  270. package/dist/internal/selection/selection-bar.d.ts +2 -1
  271. package/dist/internal/selection/selection-bar.js +1 -1
  272. package/dist/internal/stores/file-preview-store.d.ts +29 -2
  273. package/dist/internal/stores/file-preview-store.js +19 -1
  274. package/dist/internal/stores/kortix-computer-store.js +3 -0
  275. package/dist/internal/stores/sidebar-nav-store.d.ts +1 -1
  276. package/dist/internal/stores/sidebar-nav-store.js +3 -1
  277. package/dist/lib/routes.d.ts +13 -1
  278. package/dist/lib/routes.js +13 -0
  279. package/dist/markdown/genui/components/inline.d.ts +1 -1
  280. package/dist/markdown/index.d.ts +2 -1
  281. package/dist/markdown/index.js +2 -1
  282. package/dist/markdown/setup-links/approval-decision.d.ts +1 -0
  283. package/dist/markdown/setup-links/approval-decision.js +6 -2
  284. package/dist/markdown/setup-links/connector-handshake.d.ts +3 -1
  285. package/dist/markdown/setup-links/connector-handshake.js +12 -10
  286. package/dist/markdown/setup-links/show-connect-hero.d.ts +28 -0
  287. package/dist/markdown/setup-links/show-connect-hero.js +91 -0
  288. package/dist/markdown/unified-markdown.js +5 -5
  289. package/dist/primitives/badge.d.ts +1 -1
  290. package/dist/primitives/badge.js +2 -0
  291. package/dist/primitives/disclosure.js +14 -2
  292. package/dist/primitives/empty-art.d.ts +12 -0
  293. package/dist/primitives/empty-art.js +11 -0
  294. package/dist/primitives/entity-avatar.d.ts +4 -1
  295. package/dist/primitives/entity-avatar.js +4 -2
  296. package/dist/primitives/mermaid-renderer.d.ts +2 -0
  297. package/dist/primitives/mermaid-renderer.js +21 -15
  298. package/dist/primitives/resizable.js +6 -1
  299. package/dist/primitives/resize-seam.d.ts +11 -0
  300. package/dist/primitives/resize-seam.js +12 -0
  301. package/dist/primitives/sidebar-panel.js +4 -7
  302. package/dist/primitives/tabs.d.ts +14 -1
  303. package/dist/primitives/tabs.js +1 -1
  304. package/dist/primitives/user-avatar.d.ts +3 -1
  305. package/dist/primitives/user-avatar.js +4 -2
  306. package/dist/providers/ui-provider.d.ts +10 -1
  307. package/dist/session/composer/ComposerAboveCard.d.ts +1 -1
  308. package/dist/session/composer/ComposerAboveCard.js +2 -2
  309. package/dist/session/composer/ComposerCard.d.ts +1 -1
  310. package/dist/session/composer/ComposerCard.js +3 -3
  311. package/dist/session/composer/agent-selector.d.ts +19 -1
  312. package/dist/session/composer/agent-selector.js +42 -12
  313. package/dist/session/composer/composer-agent-access.d.ts +15 -0
  314. package/dist/session/composer/composer-agent-access.js +27 -0
  315. package/dist/session/composer/composer-chat-input.d.ts +8 -2
  316. package/dist/session/composer/composer-chat-input.js +8 -6
  317. package/dist/session/composer/composer-logic.d.ts +16 -0
  318. package/dist/session/composer/composer-logic.js +12 -0
  319. package/dist/session/composer/composer-underbar.d.ts +3 -1
  320. package/dist/session/composer/composer-underbar.js +4 -3
  321. package/dist/session/composer/composer.d.ts +15 -1
  322. package/dist/session/composer/composer.js +19 -1
  323. package/dist/session/composer/context-usage.d.ts +5 -0
  324. package/dist/session/composer/context-usage.js +6 -1
  325. package/dist/session/composer/draft/composer-draft.d.ts +6 -2
  326. package/dist/session/composer/draft/composer-draft.js +5 -1
  327. package/dist/session/composer/reasoning-effort-selector.js +1 -1
  328. package/dist/session/composer/token-progress.js +4 -4
  329. package/dist/session/header/export-transcript-modal.d.ts +3 -2
  330. package/dist/session/header/export-transcript-modal.js +6 -3
  331. package/dist/session/models/chatgpt-connection-button.d.ts +11 -0
  332. package/dist/session/models/chatgpt-connection-button.js +54 -0
  333. package/dist/session/models/model-selector.d.ts +3 -1
  334. package/dist/session/models/model-selector.js +7 -3
  335. package/dist/session/models/use-model-connection-gate.d.ts +5 -5
  336. package/dist/session/models/use-model-connection-gate.js +5 -5
  337. package/dist/session/outcomes/jump-to-outcome.d.ts +10 -0
  338. package/dist/session/outcomes/jump-to-outcome.js +11 -0
  339. package/dist/session/outcomes/session-outcomes-bridge.d.ts +14 -0
  340. package/dist/session/outcomes/session-outcomes-bridge.js +12 -0
  341. package/dist/session/outcomes/session-outcomes-provider.d.ts +3 -1
  342. package/dist/session/outcomes/session-outcomes-provider.js +33 -3
  343. package/dist/session/panel/easy/app-preview.d.ts +10 -0
  344. package/dist/session/panel/easy/app-preview.js +31 -12
  345. package/dist/session/panel/easy/change-requests-card.d.ts +7 -0
  346. package/dist/session/panel/easy/change-requests-card.js +17 -0
  347. package/dist/session/panel/easy/easy-panel-logic.js +7 -1
  348. package/dist/session/panel/easy/easy-panel.js +5 -2
  349. package/dist/session/panel/easy/file-preview.js +1 -1
  350. package/dist/session/panel/easy/outputs-card.d.ts +2 -1
  351. package/dist/session/panel/easy/outputs-card.js +3 -2
  352. package/dist/session/panel/easy/plan-card.d.ts +2 -0
  353. package/dist/session/panel/easy/plan-card.js +2 -0
  354. package/dist/session/panel/mobile-tool-drawer.js +7 -1
  355. package/dist/session/panel/session-audit-panel.js +9 -2
  356. package/dist/session/panel/session-detail-panel.js +9 -3
  357. package/dist/session/panel/session-files-explorer.d.ts +9 -0
  358. package/dist/session/panel/session-files-explorer.js +12 -3
  359. package/dist/session/panel/session-panel-provider.d.ts +15 -1
  360. package/dist/session/panel/session-panel-provider.js +32 -7
  361. package/dist/session/panel/shared/derive-panels.d.ts +8 -1
  362. package/dist/session/panel/shared/derive-panels.js +12 -2
  363. package/dist/session/panel/shared/output-priority.js +2 -0
  364. package/dist/session/participants/session-participants.d.ts +5 -1
  365. package/dist/session/participants/session-participants.js +9 -2
  366. package/dist/session/prompts/approval-request.d.ts +5 -0
  367. package/dist/session/prompts/approval-request.js +7 -1
  368. package/dist/session/prompts/session-approval-review.d.ts +9 -0
  369. package/dist/session/prompts/session-approval-review.js +18 -0
  370. package/dist/session/status/session-error-banner.js +2 -49
  371. package/dist/session/status/session-starting-loader.d.ts +14 -2
  372. package/dist/session/status/session-starting-loader.js +16 -4
  373. package/dist/session/thread/after-first-prompt.d.ts +7 -0
  374. package/dist/session/thread/after-first-prompt.js +8 -0
  375. package/dist/session/thread/detect-command.d.ts +12 -0
  376. package/dist/session/thread/detect-command.js +20 -0
  377. package/dist/session/thread/plan-surface.d.ts +1 -0
  378. package/dist/session/thread/plan-surface.js +1 -0
  379. package/dist/session/thread/session-chat.d.ts +3 -1
  380. package/dist/session/thread/session-chat.js +377 -252
  381. package/dist/session/thread/session-context-metrics.d.ts +15 -0
  382. package/dist/session/thread/session-context-metrics.js +10 -1
  383. package/dist/session/thread/session-context-modal.d.ts +4 -2
  384. package/dist/session/thread/session-context-modal.js +16 -9
  385. package/dist/session/thread/session-thread.d.ts +3 -1
  386. package/dist/session/thread/session-thread.js +9 -2
  387. package/dist/session/thread/thread-boot-rows.d.ts +36 -0
  388. package/dist/session/thread/thread-boot-rows.js +89 -0
  389. package/dist/session/thread/transcript-rows.d.ts +31 -0
  390. package/dist/session/thread/transcript-rows.js +3 -0
  391. package/dist/session/thread/transcript.d.ts +4 -9
  392. package/dist/session/thread/transcript.js +119 -21
  393. package/dist/session/thread/turn-share.d.ts +16 -0
  394. package/dist/session/thread/turn-share.js +162 -0
  395. package/dist/session/tool/shared/infrastructure-contexts.d.ts +28 -0
  396. package/dist/session/tool/shared/infrastructure-contexts.js +31 -3
  397. package/dist/session/tool/tool-part-renderer.d.ts +5 -4
  398. package/dist/session/tool/tool-part-renderer.js +8 -3
  399. package/dist/session/tool/tools/apply-patch-tool.d.ts +1 -0
  400. package/dist/session/tool/tools/apply-patch-tool.js +1 -0
  401. package/dist/session/tool/tools/bash-tool.js +7 -6
  402. package/dist/session/tool/tools/channel-send-card.d.ts +1 -2
  403. package/dist/session/tool/tools/channel-send.d.ts +2 -1
  404. package/dist/session/tool/tools/codemode-tool.js +1 -1
  405. package/dist/session/tool/tools/connector-tools.js +1 -1
  406. package/dist/session/tool/tools/image-gen-tool.d.ts +1 -1
  407. package/dist/session/tool/tools/image-gen-tool.js +240 -53
  408. package/dist/session/tool/tools/pty-kill-tool.d.ts +1 -0
  409. package/dist/session/tool/tools/pty-kill-tool.js +1 -0
  410. package/dist/session/tool/tools/pty-read-tool.d.ts +2 -0
  411. package/dist/session/tool/tools/pty-read-tool.js +2 -0
  412. package/dist/session/tool/tools/pty-spawn-tool.d.ts +1 -0
  413. package/dist/session/tool/tools/pty-spawn-tool.js +1 -0
  414. package/dist/session/tool/tools/pty-write-tool.d.ts +1 -0
  415. package/dist/session/tool/tools/pty-write-tool.js +1 -0
  416. package/dist/session/tool/tools/show-tool.js +19 -8
  417. package/dist/session/tool/tools/todo-write-tool.d.ts +1 -0
  418. package/dist/session/tool/tools/todo-write-tool.js +1 -0
  419. package/dist/session/turn/channel-brand.d.ts +8 -3
  420. package/dist/session/turn/channel-brand.js +20 -4
  421. package/dist/session/turn/message-author-label.js +6 -2
  422. package/dist/session/turn/message-author.d.ts +8 -0
  423. package/dist/session/turn/message-author.js +24 -0
  424. package/dist/session/turn/message-row.d.ts +52 -0
  425. package/dist/session/turn/message-row.js +44 -0
  426. package/dist/session/turn/plan-anchor.d.ts +4 -1
  427. package/dist/session/turn/plan-anchor.js +4 -1
  428. package/dist/session/turn/plan-card.d.ts +7 -0
  429. package/dist/session/turn/plan-card.js +7 -0
  430. package/dist/session/turn/user-message.d.ts +7 -1
  431. package/dist/session/turn/user-message.js +21 -7
  432. package/dist/styles.css +1 -1
  433. package/dist/terminal/session-terminal-connect-bar.js +2 -1
  434. package/dist/workspace/home/access-requests-bell.d.ts +9 -2
  435. package/dist/workspace/home/access-requests-bell.js +20 -6
  436. package/dist/workspace/home/first-chat.d.ts +8 -21
  437. package/dist/workspace/home/first-chat.js +22 -72
  438. package/dist/workspace/index.d.ts +6 -0
  439. package/dist/workspace/index.js +6 -0
  440. package/dist/workspace/layout/project-home.d.ts +14 -2
  441. package/dist/workspace/layout/project-home.js +60 -21
  442. package/dist/workspace/layout/use-project-home-send.d.ts +9 -1
  443. package/dist/workspace/layout/use-project-home-send.js +82 -3
  444. package/dist/workspace/memory/body-doc.d.ts +17 -0
  445. package/dist/workspace/memory/body-doc.js +208 -0
  446. package/dist/workspace/memory/body-extensions.d.ts +38 -0
  447. package/dist/workspace/memory/body-extensions.js +103 -0
  448. package/dist/workspace/memory/company-memory-page.d.ts +8 -0
  449. package/dist/workspace/memory/company-memory-page.js +16 -0
  450. package/dist/workspace/memory/memory-all.d.ts +20 -0
  451. package/dist/workspace/memory/memory-all.js +27 -0
  452. package/dist/workspace/memory/memory-body.d.ts +19 -0
  453. package/dist/workspace/memory/memory-body.js +139 -0
  454. package/dist/workspace/memory/memory-empty.d.ts +13 -0
  455. package/dist/workspace/memory/memory-empty.js +28 -0
  456. package/dist/workspace/memory/memory-history.d.ts +27 -0
  457. package/dist/workspace/memory/memory-history.js +108 -0
  458. package/dist/workspace/memory/memory-labels.d.ts +16 -0
  459. package/dist/workspace/memory/memory-labels.js +47 -0
  460. package/dist/workspace/memory/memory-page-list.d.ts +34 -0
  461. package/dist/workspace/memory/memory-page-list.js +156 -0
  462. package/dist/workspace/memory/memory-reader.d.ts +58 -0
  463. package/dist/workspace/memory/memory-reader.js +123 -0
  464. package/dist/workspace/memory/memory-view.d.ts +21 -0
  465. package/dist/workspace/memory/memory-view.js +124 -0
  466. package/dist/workspace/memory/remember-popover.d.ts +19 -0
  467. package/dist/workspace/memory/remember-popover.js +61 -0
  468. package/dist/workspace/memory/remember-this.d.ts +12 -0
  469. package/dist/workspace/memory/remember-this.js +89 -0
  470. package/dist/workspace/memory/source-mark.d.ts +18 -0
  471. package/dist/workspace/memory/source-mark.js +79 -0
  472. package/dist/workspace/memory/used-memory-chip.d.ts +14 -0
  473. package/dist/workspace/memory/used-memory-chip.js +61 -0
  474. package/dist/workspace/new/advanced-fields.d.ts +2 -1
  475. package/dist/workspace/new/advanced-fields.js +2 -2
  476. package/dist/workspace/new/source-param.d.ts +1 -1
  477. package/dist/workspace/new/source-param.js +3 -1
  478. package/dist/workspace/new/use-create-workspace.d.ts +8 -10
  479. package/dist/workspace/new/use-create-workspace.js +3 -3
  480. package/dist/workspace/projects/onboarding/app-logo.d.ts +7 -2
  481. package/dist/workspace/projects/onboarding/app-logo.js +6 -13
  482. package/dist/workspace/projects/policies-panel.js +5 -3
  483. package/dist/workspace/review/review-actions.d.ts +4 -2
  484. package/dist/workspace/review/review-actions.js +8 -2
  485. package/dist/workspace/review/review-center.js +11 -7
  486. package/dist/workspace/review/review-detail.d.ts +10 -0
  487. package/dist/workspace/review/review-detail.js +101 -13
  488. package/dist/workspace/saved-session-skeleton.d.ts +2 -2
  489. package/dist/workspace/saved-session-skeleton.js +3 -3
  490. package/dist/workspace/session-workspace.js +15 -13
  491. package/dist/workspace/sessions/project-sessions-view.js +3 -2
  492. package/dist/workspace/sessions/sessions-toolbar.d.ts +3 -1
  493. package/dist/workspace/sessions/sessions-toolbar.js +2 -2
  494. package/dist/workspace/sidebar/footer/project-apps-nav.d.ts +5 -0
  495. package/dist/workspace/sidebar/footer/project-apps-nav.js +41 -2
  496. package/dist/workspace/sidebar/footer/project-artifacts-nav.d.ts +6 -0
  497. package/dist/workspace/sidebar/footer/project-artifacts-nav.js +22 -0
  498. package/dist/workspace/sidebar/footer/project-manifest-upgrade-alert.js +13 -13
  499. package/dist/workspace/sidebar/footer/project-memory-nav.d.ts +7 -0
  500. package/dist/workspace/sidebar/footer/project-memory-nav.js +19 -0
  501. package/dist/workspace/sidebar/nav-row-meta.js +14 -2
  502. package/dist/workspace/sidebar/project-nav-items.js +3 -0
  503. package/dist/workspace/sidebar/project-session-list.js +68 -56
  504. package/dist/workspace/sidebar/project-sidebar.js +9 -2
  505. package/dist/workspace/sidebar/project-spaces-nav.d.ts +8 -0
  506. package/dist/workspace/sidebar/project-spaces-nav.js +69 -0
  507. package/dist/workspace/sidebar/session-brief-hover-card.js +28 -1
  508. package/dist/workspace/sidebar/session-group-order.d.ts +9 -0
  509. package/dist/workspace/sidebar/session-group-order.js +25 -0
  510. package/dist/workspace/sidebar/session-group-sections.d.ts +62 -0
  511. package/dist/workspace/sidebar/session-group-sections.js +267 -0
  512. package/dist/workspace/sidebar/session-list-chrome.d.ts +28 -0
  513. package/dist/workspace/sidebar/session-list-chrome.js +50 -0
  514. package/dist/workspace/spaces/channel-glyph.d.ts +5 -0
  515. package/dist/workspace/spaces/channel-glyph.js +6 -0
  516. package/dist/workspace/spaces/channel-setup.d.ts +16 -0
  517. package/dist/workspace/spaces/channel-setup.js +105 -0
  518. package/dist/workspace/spaces/channels-onboarding.d.ts +13 -0
  519. package/dist/workspace/spaces/channels-onboarding.js +37 -0
  520. package/dist/workspace/spaces/create-channel-dialog.d.ts +16 -0
  521. package/dist/workspace/spaces/create-channel-dialog.js +158 -0
  522. package/dist/workspace/spaces/private-channels-not-in.d.ts +9 -0
  523. package/dist/workspace/spaces/private-channels-not-in.js +69 -0
  524. package/dist/workspace/spaces/space-agents.d.ts +10 -0
  525. package/dist/workspace/spaces/space-agents.js +10 -0
  526. package/dist/workspace/spaces/space-details-dialog.d.ts +20 -0
  527. package/dist/workspace/spaces/space-details-dialog.js +176 -0
  528. package/dist/workspace/spaces/space-link-label.d.ts +49 -0
  529. package/dist/workspace/spaces/space-link-label.js +73 -0
  530. package/dist/workspace/spaces/space-links.d.ts +19 -0
  531. package/dist/workspace/spaces/space-links.js +230 -0
  532. package/dist/workspace/spaces/space-members.d.ts +46 -0
  533. package/dist/workspace/spaces/space-members.js +182 -0
  534. package/dist/workspace/spaces/space-roster.d.ts +15 -0
  535. package/dist/workspace/spaces/space-roster.js +44 -0
  536. package/dist/workspace/spaces/space-threads-tab.d.ts +56 -0
  537. package/dist/workspace/spaces/space-threads-tab.js +156 -0
  538. package/dist/workspace/spaces/space-timeline-view.d.ts +254 -0
  539. package/dist/workspace/spaces/space-timeline-view.js +235 -0
  540. package/dist/workspace/spaces/space-timeline.d.ts +106 -0
  541. package/dist/workspace/spaces/space-timeline.js +183 -0
  542. package/dist/workspace/spaces/space-triggers.d.ts +13 -0
  543. package/dist/workspace/spaces/space-triggers.js +78 -0
  544. package/dist/workspace/spaces/space-view.d.ts +37 -0
  545. package/dist/workspace/spaces/space-view.js +436 -0
  546. package/package.json +31 -32
  547. package/skills/kortix-ui/SKILL.md +3 -3
  548. package/skills/kortix-ui/references/custom-dashboard.md +3 -3
  549. package/skills/kortix-ui/references/modules.md +28 -4
  550. package/skills/kortix-ui/references/theming.md +1 -1
  551. package/dist/customize/agents/agent-nav.prototype.d.ts +0 -35
  552. package/dist/customize/agents/agent-nav.prototype.js +0 -95
  553. package/dist/customize/connectors/catalog/merge-search.d.ts +0 -10
  554. package/dist/customize/connectors/catalog/merge-search.js +0 -26
  555. package/dist/customize/connectors/detail/find-easy-connect-app.d.ts +0 -29
  556. package/dist/customize/connectors/detail/find-easy-connect-app.js +0 -22
  557. package/dist/customize/migrate-to-v2/use-migrate-to-v2.d.ts +0 -9
  558. package/dist/customize/migrate-to-v2/use-migrate-to-v2.js +0 -24
  559. package/dist/customize/sections/connector-connection-header.d.ts +0 -36
  560. package/dist/customize/sections/connector-connection-header.js +0 -33
  561. package/dist/customize/sections/connector-connection-modal.d.ts +0 -34
  562. package/dist/customize/sections/connector-connection-modal.js +0 -72
  563. package/dist/customize/sections/discover-catalogue-card.d.ts +0 -19
  564. package/dist/customize/sections/discover-catalogue-card.js +0 -26
  565. package/dist/customize/sections/discover-catalogue-detail.d.ts +0 -15
  566. package/dist/customize/sections/discover-catalogue-detail.js +0 -24
  567. package/dist/customize/sections/discover-catalogue.d.ts +0 -17
  568. package/dist/customize/sections/discover-catalogue.js +0 -132
  569. package/dist/customize/sections/llm-provider/provider-access-menu.d.ts +0 -10
  570. package/dist/customize/sections/llm-provider/provider-access-menu.js +0 -23
  571. package/dist/files/project/components/drive-empty-art.d.ts +0 -2
  572. package/dist/files/project/components/drive-empty-art.js +0 -5
  573. package/dist/internal/hooks/use-media-query.d.ts +0 -2
  574. package/dist/internal/share/public-share-link-button.d.ts +0 -14
  575. package/dist/internal/share/public-share-link-button.js +0 -17
  576. /package/dist/{internal/hooks → hooks}/use-media-query.js +0 -0
@@ -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';
@@ -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
  ];
@@ -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
@@ -0,0 +1,16 @@
1
+ /** @internal Kortix apps only. No semver: it may change in any release. */
2
+ import type { ProjectMemoryLayerScope } from '@kortix/sdk';
3
+ /** A memory layer as a link target: its scope and its key (`company` or the space id). */
4
+ export interface MemoryLayerRef {
5
+ scope: ProjectMemoryLayerScope;
6
+ key: string;
7
+ }
8
+ /**
9
+ * Where a memory page opens: the Company Memory page, or its channel's or DM's
10
+ * Memory tab, with `?page=` (`&history=1` opens its History too). A channel or
11
+ * DM the reader is on keeps its other params, so an open thread stays beside
12
+ * the tab. Null when the host serves no such page or the space is not loaded.
13
+ */
14
+ export declare function useMemoryPageHref(projectId: string | null | undefined, enabled?: boolean): (layer: MemoryLayerRef, pageId: string, options?: {
15
+ history?: boolean;
16
+ }) => string | null;
@@ -0,0 +1,46 @@
1
+ 'use client';
2
+ import { useProjectSpaces } from '@kortix/sdk/react';
3
+ import { useCallback } from 'react';
4
+ import { uiRoutes } from '../../lib/routes.js';
5
+ import { useUiPathname, useUiSearchParams } from '../../providers/ui-provider.js';
6
+ /**
7
+ * Where a memory page opens: the Company Memory page, or its channel's or DM's
8
+ * Memory tab, with `?page=` (`&history=1` opens its History too). A channel or
9
+ * DM the reader is on keeps its other params, so an open thread stays beside
10
+ * the tab. Null when the host serves no such page or the space is not loaded.
11
+ */
12
+ export function useMemoryPageHref(projectId, enabled = true) {
13
+ const pathname = useUiPathname();
14
+ const searchParams = useUiSearchParams();
15
+ const spaces = useProjectSpaces(projectId, { enabled }).data;
16
+ return useCallback((layer, pageId, options) => {
17
+ if (!projectId)
18
+ return null;
19
+ if (layer.scope === 'company') {
20
+ const memory = uiRoutes().memory(projectId);
21
+ if (!memory)
22
+ return null;
23
+ const params = new URLSearchParams({ page: pageId });
24
+ if (options?.history)
25
+ params.set('history', '1');
26
+ return `${memory}?${params.toString()}`;
27
+ }
28
+ const space = spaces?.find((candidate) => candidate.space_id === layer.key);
29
+ let path = null;
30
+ if (space?.kind === 'channel' && space.slug)
31
+ path = uiRoutes().channel(projectId, space.slug);
32
+ else if (space?.kind === 'dm' && space.dm_agent_name)
33
+ path = uiRoutes().dm(projectId, space.dm_agent_name);
34
+ if (!path)
35
+ return null;
36
+ const here = pathname === path || !!pathname?.endsWith(path);
37
+ const params = new URLSearchParams(here ? searchParams.toString() : '');
38
+ params.set('tab', 'memory');
39
+ params.set('page', pageId);
40
+ if (options?.history)
41
+ params.set('history', '1');
42
+ else
43
+ params.delete('history');
44
+ return `${here ? pathname : path}?${params.toString()}`;
45
+ }, [projectId, pathname, searchParams, spaces]);
46
+ }
@@ -0,0 +1,33 @@
1
+ /** @internal Kortix apps only. No semver: it may change in any release. */
2
+ /**
3
+ * An agent's pixel mark: a 7×7 mirrored pixel figure derived from its slug.
4
+ *
5
+ * Same slug, same mark, on every surface and every device. Nothing is stored:
6
+ * the slug is hashed (FNV-1a), the hash seeds a PRNG (mulberry32), the PRNG
7
+ * fills the left half of the grid against a density mask, and the half is
8
+ * mirrored. A draw that fails the quality gate is redrawn from a salted seed,
9
+ * so retries stay deterministic. The tone comes from a second hash.
10
+ *
11
+ * Changing SIZE, MASK, the gate or PALETTES changes every agent's mark — the
12
+ * golden test in `pixel-mark.test.ts` exists to make that a deliberate act.
13
+ */
14
+ export declare const PIXEL_MARK_SIZE = 7;
15
+ export interface PixelMarkTone {
16
+ name: string;
17
+ tile: string;
18
+ ink: string;
19
+ /** Dark theme: the pair inverts, so the tile stays visible on a dark page. */
20
+ tileDark: string;
21
+ inkDark: string;
22
+ }
23
+ export declare const PIXEL_MARK_TONES: readonly PixelMarkTone[];
24
+ type Grid = boolean[][];
25
+ export declare function fnv1a(input: string): number;
26
+ /** Readable at 14px, fills the frame, one connected body. */
27
+ export declare function passesPixelMarkGate(grid: Grid): boolean;
28
+ export declare function pixelMark(slug: string): {
29
+ grid: Grid;
30
+ path: string;
31
+ tone: PixelMarkTone;
32
+ };
33
+ export {};
@@ -0,0 +1,152 @@
1
+ /**
2
+ * An agent's pixel mark: a 7×7 mirrored pixel figure derived from its slug.
3
+ *
4
+ * Same slug, same mark, on every surface and every device. Nothing is stored:
5
+ * the slug is hashed (FNV-1a), the hash seeds a PRNG (mulberry32), the PRNG
6
+ * fills the left half of the grid against a density mask, and the half is
7
+ * mirrored. A draw that fails the quality gate is redrawn from a salted seed,
8
+ * so retries stay deterministic. The tone comes from a second hash.
9
+ *
10
+ * Changing SIZE, MASK, the gate or PALETTES changes every agent's mark — the
11
+ * golden test in `pixel-mark.test.ts` exists to make that a deliberate act.
12
+ */
13
+ export const PIXEL_MARK_SIZE = 7;
14
+ const HALF = 4;
15
+ const MAX_ATTEMPTS = 256;
16
+ // Fill chance per cell, outer edge → spine. Dense centre, sparse edges, so the
17
+ // mirrored result reads as one body.
18
+ const MASK = [
19
+ [0.15, 0.3, 0.45, 0.55],
20
+ [0.3, 0.5, 0.6, 0.7],
21
+ [0.4, 0.6, 0.65, 0.7],
22
+ [0.5, 0.65, 0.7, 0.75],
23
+ [0.4, 0.55, 0.6, 0.65],
24
+ [0.3, 0.45, 0.5, 0.5],
25
+ [0.2, 0.35, 0.4, 0.35],
26
+ ];
27
+ const tone = (name, tile, ink) => ({
28
+ name,
29
+ tile,
30
+ ink,
31
+ tileDark: ink,
32
+ inkDark: tile,
33
+ });
34
+ export const PIXEL_MARK_TONES = [
35
+ tone('graphite', '#EDEDED', '#191919'),
36
+ tone('sand', '#F1EBDD', '#6B5A3A'),
37
+ tone('moss', '#E6EDE0', '#3F5A33'),
38
+ tone('sea', '#E2ECF0', '#2E5566'),
39
+ tone('blue', '#E6EEFF', '#2457C5'),
40
+ tone('plum', '#EEE6F0', '#5E3A68'),
41
+ tone('clay', '#F3E6E0', '#7A4532'),
42
+ tone('slate', '#E4E7EC', '#3B4656'),
43
+ ];
44
+ /** The built-in agent and the platform's Meta agent keep the brand tile. */
45
+ const BRAND = {
46
+ name: 'brand',
47
+ tile: '#1F1F1F',
48
+ ink: '#FFFFFF',
49
+ tileDark: '#2C2C2C',
50
+ inkDark: '#FFFFFF',
51
+ };
52
+ const RESERVED = { kortix: BRAND, meta: BRAND };
53
+ export function fnv1a(input) {
54
+ let h = 0x811c9dc5;
55
+ for (let i = 0; i < input.length; i++) {
56
+ h ^= input.charCodeAt(i);
57
+ h = Math.imul(h, 0x01000193);
58
+ }
59
+ return h >>> 0;
60
+ }
61
+ function mulberry32(seed) {
62
+ let a = seed;
63
+ return () => {
64
+ a = (a + 0x6d2b79f5) | 0;
65
+ let t = Math.imul(a ^ (a >>> 15), 1 | a);
66
+ t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
67
+ return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
68
+ };
69
+ }
70
+ function draw(seed) {
71
+ const rand = mulberry32(seed);
72
+ return MASK.map((row) => {
73
+ const half = row.map((p) => rand() < p);
74
+ return [...half, half[2], half[1], half[0]];
75
+ });
76
+ }
77
+ function largestComponent(grid) {
78
+ const seen = grid.map((row) => row.map(() => false));
79
+ let best = 0;
80
+ for (let r = 0; r < PIXEL_MARK_SIZE; r++)
81
+ for (let c = 0; c < PIXEL_MARK_SIZE; c++) {
82
+ if (!grid[r][c] || seen[r][c])
83
+ continue;
84
+ let size = 0;
85
+ const stack = [[r, c]];
86
+ seen[r][c] = true;
87
+ while (stack.length) {
88
+ const [y, x] = stack.pop();
89
+ size++;
90
+ for (const [ny, nx] of [[y + 1, x], [y - 1, x], [y, x + 1], [y, x - 1]]) {
91
+ if (grid[ny]?.[nx] && !seen[ny][nx]) {
92
+ seen[ny][nx] = true;
93
+ stack.push([ny, nx]);
94
+ }
95
+ }
96
+ }
97
+ best = Math.max(best, size);
98
+ }
99
+ return best;
100
+ }
101
+ function hasIsolatedPixel(grid) {
102
+ return grid.some((row, r) => row.some((on, c) => {
103
+ if (!on)
104
+ return false;
105
+ for (let dy = -1; dy <= 1; dy++)
106
+ for (let dx = -1; dx <= 1; dx++)
107
+ if ((dy || dx) && grid[r + dy]?.[c + dx])
108
+ return false;
109
+ return true;
110
+ }));
111
+ }
112
+ /** Readable at 14px, fills the frame, one connected body. */
113
+ export function passesPixelMarkGate(grid) {
114
+ const filled = grid.flat().filter(Boolean).length;
115
+ if (filled < 18 || filled > 30)
116
+ return false;
117
+ const rows = grid.filter((row) => row.some(Boolean)).length;
118
+ const cols = grid[0].filter((_, c) => grid.some((row) => row[c])).length;
119
+ if (rows < 5 || cols < 5)
120
+ return false;
121
+ if (grid.filter((row) => row.every(Boolean)).length > 1)
122
+ return false;
123
+ if (grid.filter((row) => row[HALF - 1]).length < 3)
124
+ return false;
125
+ if (hasIsolatedPixel(grid))
126
+ return false;
127
+ return largestComponent(grid) >= Math.ceil(filled * 0.85);
128
+ }
129
+ /** One SVG path, horizontal runs merged. Render in `viewBox="0 0 7 7"`. */
130
+ function toPath(grid) {
131
+ let d = '';
132
+ grid.forEach((row, y) => {
133
+ for (let x = 0; x < PIXEL_MARK_SIZE;) {
134
+ if (!row[x]) {
135
+ x++;
136
+ continue;
137
+ }
138
+ const start = x;
139
+ while (x < PIXEL_MARK_SIZE && row[x])
140
+ x++;
141
+ d += `M${start} ${y}h${x - start}v1h-${x - start}z`;
142
+ }
143
+ });
144
+ return d;
145
+ }
146
+ export function pixelMark(slug) {
147
+ let grid = draw(fnv1a(slug));
148
+ for (let attempt = 1; !passesPixelMarkGate(grid) && attempt < MAX_ATTEMPTS; attempt++)
149
+ grid = draw(fnv1a(`${slug}:${attempt}`));
150
+ const tone = RESERVED[slug] ?? PIXEL_MARK_TONES[fnv1a(`${slug}#tone`) % PIXEL_MARK_TONES.length];
151
+ return { grid, path: toPath(grid), tone };
152
+ }
@@ -22,15 +22,11 @@ import { useFeatureFlag } from '@kortix/sdk/react';
22
22
  */
23
23
  export function useProjectFeatureFlags(projectId) {
24
24
  const marketplace = useFeatureFlag(projectId, 'marketplace');
25
- const connectorsApiDiscover = useFeatureFlag(projectId, 'connectors_api_discover');
26
- const agentmailEmail = useFeatureFlag(projectId, 'agentmail_email');
27
25
  const metaAgent = useFeatureFlag(projectId, 'meta_agent');
28
- const monitors = useFeatureFlag(projectId, 'monitors');
29
26
  const reminders = useFeatureFlag(projectId, 'reminders');
30
27
  const warmSessions = useFeatureFlag(projectId, 'warm_sessions');
31
28
  const secretsEgress = useFeatureFlag(projectId, 'secrets_egress');
32
29
  const pooledProviderSecrets = useFeatureFlag(projectId, 'pooled_provider_secrets');
33
- const piHarness = useFeatureFlag(projectId, 'pi_harness');
34
30
  const genui = useFeatureFlag(projectId, 'genui');
35
31
  const usRegion = useFeatureFlag(projectId, 'us_region');
36
32
  const eventTriggers = useFeatureFlag(projectId, 'event_triggers');
@@ -39,21 +35,21 @@ export function useProjectFeatureFlags(projectId) {
39
35
  const drives = useFeatureFlag(projectId, 'drives');
40
36
  const sessionLog = useFeatureFlag(projectId, 'session_log');
41
37
  const sessionLogRestore = useFeatureFlag(projectId, 'session_log_restore');
42
- const connectorsV2 = useFeatureFlag(projectId, 'connectors_v2');
38
+ const projectChannels = useFeatureFlag(projectId, 'project_channels');
43
39
  const agentRooms = useFeatureFlag(projectId, 'agent_rooms');
44
40
  const goals = useFeatureFlag(projectId, 'goals');
41
+ const artifacts = useFeatureFlag(projectId, 'artifacts');
42
+ const emailChannel = useFeatureFlag(projectId, 'email_channel');
43
+ const workspaceVolume = useFeatureFlag(projectId, 'workspace_volume');
44
+ const sessionGroups = useFeatureFlag(projectId, 'session_groups');
45
45
  return {
46
46
  flags: {
47
47
  marketplace: marketplace.enabled,
48
- connectors_api_discover: connectorsApiDiscover.enabled,
49
- agentmail_email: agentmailEmail.enabled,
50
48
  meta_agent: metaAgent.enabled,
51
- monitors: monitors.enabled,
52
49
  reminders: reminders.enabled,
53
50
  warm_sessions: warmSessions.enabled,
54
51
  secrets_egress: secretsEgress.enabled,
55
52
  pooled_provider_secrets: pooledProviderSecrets.enabled,
56
- pi_harness: piHarness.enabled,
57
53
  genui: genui.enabled,
58
54
  us_region: usRegion.enabled,
59
55
  event_triggers: eventTriggers.enabled,
@@ -62,11 +58,15 @@ export function useProjectFeatureFlags(projectId) {
62
58
  drives: drives.enabled,
63
59
  session_log: sessionLog.enabled,
64
60
  session_log_restore: sessionLogRestore.enabled,
65
- connectors_v2: connectorsV2.enabled,
61
+ project_channels: projectChannels.enabled,
66
62
  agent_rooms: agentRooms.enabled,
67
63
  goals: goals.enabled,
64
+ artifacts: artifacts.enabled,
65
+ email_channel: emailChannel.enabled,
66
+ workspace_volume: workspaceVolume.enabled,
67
+ session_groups: sessionGroups.enabled,
68
68
  },
69
69
  // The trailing hook's loading state — keep this on the LAST hook above.
70
- isLoading: goals.isLoading,
70
+ isLoading: sessionGroups.isLoading,
71
71
  };
72
72
  }
@@ -1,7 +1,7 @@
1
1
  /** @internal Kortix apps only. No semver: it may change in any release. */
2
2
  /**
3
3
  * HEIC/HEIF → JPEG conversion.
4
- * heic2any is lazy-loaded — zero bundle cost when no HEIC files are opened.
4
+ * The CSP-safe decoder is lazy-loaded; production never permits unsafe-eval.
5
5
  */
6
6
  export declare function isHeicFile(filename: string): boolean;
7
7
  export declare function convertHeicBlobToJpeg(blob: Blob): Promise<Blob>;
@@ -1,13 +1,12 @@
1
1
  /**
2
2
  * HEIC/HEIF → JPEG conversion.
3
- * heic2any is lazy-loaded — zero bundle cost when no HEIC files are opened.
3
+ * The CSP-safe decoder is lazy-loaded; production never permits unsafe-eval.
4
4
  */
5
5
  const HEIC_EXT = new Set(['heic', 'heif']);
6
6
  export function isHeicFile(filename) {
7
7
  return HEIC_EXT.has(filename.split('.').pop()?.toLowerCase() || '');
8
8
  }
9
9
  export async function convertHeicBlobToJpeg(blob) {
10
- const heic2any = (await import('heic2any')).default;
11
- const result = await heic2any({ blob, toType: 'image/jpeg', quality: 0.92 });
12
- return Array.isArray(result) ? result[0] : result;
10
+ const { heicTo } = await import('heic-to/csp');
11
+ return heicTo({ blob, type: 'image/jpeg', quality: 0.92 });
13
12
  }
@@ -2,6 +2,7 @@
2
2
  import type { UiTranslator } from '../../i18n/index.js';
3
3
  import { type TurnCompleteMsg } from './turn-broadcast.js';
4
4
  import { type NotificationPreferences } from '@kortix/sdk';
5
+ import type { QueryClient } from '@tanstack/react-query';
5
6
  /** The push `type` of each inbox kind (`pushTypeOf` in `@kortix/shared/notification-kinds`). */
6
7
  export type WebNotificationType = 'completion' | 'error' | 'question' | 'permission' | 'shared' | 'automation_failed' | 'automation_recovered' | 'capture_device_down' | 'capture_device_recovered' | 'message';
7
8
  export interface WebNotificationPayload {
@@ -36,6 +37,11 @@ export interface WebNotificationPayload {
36
37
  preview?: string;
37
38
  /** Localized "Open session" for the finished-turn toast. */
38
39
  openSessionLabel?: string;
40
+ /**
41
+ * Set when the turn ended while a channel or DM page was on screen: its
42
+ * thread opens in that page's panel (`?thread=`), not on the session page.
43
+ */
44
+ threadHref?: string;
39
45
  /** The open change request the finished turn produced: the toast offers Review. */
40
46
  changeRequest?: {
41
47
  crId: string;
@@ -59,6 +65,20 @@ export declare function setServerPushPreferences(kinds: NotificationPreferences[
59
65
  * via Cmd+Tab / Alt+Tab (`!document.hasFocus()`).
60
66
  */
61
67
  export declare function isTabHidden(): boolean;
68
+ /**
69
+ * A finished turn opens in the thread panel of the channel or DM page on
70
+ * screen (`?thread=<id>`) only when it is one of that space's threads: the
71
+ * path's project is the session's, and the cached thread list of the space
72
+ * holds the session. Null otherwise, so any other session keeps its session
73
+ * page. Reads the query cache; never fetches.
74
+ */
75
+ export declare function spacesThreadHref(location: {
76
+ pathname: string;
77
+ search: string;
78
+ }, session: {
79
+ sessionId: string;
80
+ projectId: string | null | undefined;
81
+ }, cache: QueryClient): string | null;
62
82
  /**
63
83
  * Check if the user is currently viewing a specific session.
64
84
  * Checks the tab store (dashboard session tabs) and the current URL