@kortix/ui 0.14.8 → 0.14.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. package/README.md +2 -2
  2. package/dist/_vendor/kortix-shared.js +63 -3
  3. package/dist/_vendor/shared/app-config.d.ts +175 -0
  4. package/dist/_vendor/shared/channel-message.d.ts +34 -5
  5. package/dist/_vendor/shared/index.d.ts +1 -0
  6. package/dist/_vendor/shared/space-slug.d.ts +37 -0
  7. package/dist/access/access/access-detail-shell.js +1 -1
  8. package/dist/access/access/principal-picker.d.ts +11 -0
  9. package/dist/access/access/principal-picker.js +3 -2
  10. package/dist/apps/app-preview-pool.d.ts +7 -2
  11. package/dist/apps/app-preview-pool.js +11 -5
  12. package/dist/apps/app-shared.d.ts +22 -15
  13. package/dist/apps/app-shared.js +37 -19
  14. package/dist/apps/index.d.ts +2 -2
  15. package/dist/apps/index.js +2 -2
  16. package/dist/artifacts/artifact-frame.d.ts +16 -0
  17. package/dist/artifacts/artifact-frame.js +51 -0
  18. package/dist/artifacts/artifact-session.d.ts +18 -0
  19. package/dist/artifacts/artifact-session.js +101 -0
  20. package/dist/artifacts/frame-policy.d.ts +30 -0
  21. package/dist/artifacts/frame-policy.js +61 -0
  22. package/dist/artifacts/index.d.ts +3 -0
  23. package/dist/artifacts/index.js +5 -0
  24. package/dist/browser/sandbox-browser-chrome.d.ts +4 -1
  25. package/dist/browser/sandbox-browser-chrome.js +2 -2
  26. package/dist/customize/agents/agent-grant-pages.d.ts +5 -1
  27. package/dist/customize/agents/agent-grant-pages.js +30 -4
  28. package/dist/customize/agents/agent-page.js +3 -1
  29. package/dist/customize/agents/agent-policy-sets.d.ts +43 -0
  30. package/dist/customize/agents/agent-policy-sets.js +72 -0
  31. package/dist/customize/agents/agent-triggers-section.js +2 -1
  32. package/dist/customize/connectors/add-mcp/add-mcp-server-dialog.d.ts +6 -1
  33. package/dist/customize/connectors/add-mcp/add-mcp-server-dialog.js +10 -4
  34. package/dist/customize/connectors/agent-access.d.ts +35 -0
  35. package/dist/customize/connectors/agent-access.js +77 -0
  36. package/dist/customize/connectors/catalog/browse-sections.d.ts +2 -29
  37. package/dist/customize/connectors/catalog/browse-sections.js +7 -74
  38. package/dist/customize/connectors/catalog/catalog-entry.d.ts +18 -37
  39. package/dist/customize/connectors/catalog/catalog-entry.js +28 -40
  40. package/dist/customize/connectors/catalog/connector-browse.d.ts +3 -32
  41. package/dist/customize/connectors/catalog/connector-browse.js +19 -50
  42. package/dist/customize/connectors/catalog/use-catalog.d.ts +20 -59
  43. package/dist/customize/connectors/catalog/use-catalog.js +48 -175
  44. package/dist/customize/connectors/connector-identity.d.ts +9 -11
  45. package/dist/customize/connectors/connector-identity.js +13 -42
  46. package/dist/customize/connectors/connector-moves-banner.d.ts +2 -1
  47. package/dist/customize/connectors/connector-moves-banner.js +4 -6
  48. package/dist/customize/connectors/connector-routes.d.ts +21 -9
  49. package/dist/customize/connectors/connector-routes.js +29 -20
  50. package/dist/customize/connectors/connectors-page.js +53 -82
  51. package/dist/customize/connectors/detail/app-page.js +226 -98
  52. package/dist/customize/connectors/detail/computer-app-page.d.ts +16 -0
  53. package/dist/customize/connectors/detail/computer-app-page.js +39 -0
  54. package/dist/customize/connectors/detail/connector-accounts.js +3 -1
  55. package/dist/customize/connectors/detail/connector-advanced-tools.d.ts +4 -1
  56. package/dist/customize/connectors/detail/connector-advanced-tools.js +2 -2
  57. package/dist/customize/connectors/detail/connector-agents.d.ts +14 -0
  58. package/dist/customize/connectors/detail/connector-agents.js +69 -0
  59. package/dist/customize/connectors/detail/connector-detail-tabs.js +2 -1
  60. package/dist/customize/connectors/detail/connector-move-row.d.ts +8 -5
  61. package/dist/customize/connectors/detail/connector-move-row.js +23 -14
  62. package/dist/customize/connectors/detail/connector-page.d.ts +4 -1
  63. package/dist/customize/connectors/detail/connector-page.js +14 -10
  64. package/dist/customize/connectors/detail/connector-policy-sets.d.ts +28 -0
  65. package/dist/customize/connectors/detail/connector-policy-sets.js +203 -0
  66. package/dist/customize/connectors/detail/connector-settings.d.ts +4 -1
  67. package/dist/customize/connectors/detail/connector-settings.js +7 -3
  68. package/dist/customize/connectors/detail/connector-status.d.ts +19 -6
  69. package/dist/customize/connectors/detail/connector-status.js +34 -10
  70. package/dist/customize/connectors/detail/connector-tabs.d.ts +4 -1
  71. package/dist/customize/connectors/detail/connector-tabs.js +8 -2
  72. package/dist/customize/connectors/detail/connector-tools.d.ts +3 -3
  73. package/dist/customize/connectors/detail/connector-tools.js +105 -48
  74. package/dist/customize/connectors/detail/email-inboxes.d.ts +43 -0
  75. package/dist/customize/connectors/detail/email-inboxes.js +184 -0
  76. package/dist/customize/connectors/detail/provider-info.d.ts +1 -1
  77. package/dist/customize/connectors/detail/provider-info.js +2 -2
  78. package/dist/customize/connectors/detail/status-badge.d.ts +1 -1
  79. package/dist/customize/connectors/detail/status-badge.js +4 -5
  80. package/dist/customize/connectors/detail/use-connector-detail.d.ts +6 -0
  81. package/dist/customize/connectors/detail/use-connector-detail.js +14 -4
  82. package/dist/customize/connectors/install/install-dialog.d.ts +23 -0
  83. package/dist/customize/connectors/install/install-dialog.js +40 -0
  84. package/dist/customize/connectors/install/install.d.ts +13 -2
  85. package/dist/customize/connectors/install/install.js +9 -4
  86. package/dist/customize/connectors/install/use-install.d.ts +19 -2
  87. package/dist/customize/connectors/install/use-install.js +65 -37
  88. package/dist/customize/connectors/install/way-kind.d.ts +5 -0
  89. package/dist/customize/connectors/install/way-kind.js +16 -0
  90. package/dist/customize/connectors/provider-label.d.ts +2 -1
  91. package/dist/customize/connectors/provider-label.js +13 -3
  92. package/dist/customize/connectors/tools/pattern-rule-draft.d.ts +4 -0
  93. package/dist/customize/connectors/tools/pattern-rule-draft.js +12 -3
  94. package/dist/customize/connectors/tools/policy-sets.d.ts +27 -0
  95. package/dist/customize/connectors/tools/policy-sets.js +41 -0
  96. package/dist/customize/connectors/tools/tool-groups.d.ts +32 -9
  97. package/dist/customize/connectors/tools/tool-groups.js +78 -16
  98. package/dist/customize/connectors/tools/tool-policy-control.d.ts +11 -10
  99. package/dist/customize/connectors/tools/tool-policy-control.js +15 -16
  100. package/dist/customize/connectors/tools/tool-policy-labels.d.ts +6 -5
  101. package/dist/customize/connectors/tools/tool-policy-labels.js +17 -16
  102. package/dist/customize/connectors/tools/tool-policy.d.ts +50 -4
  103. package/dist/customize/connectors/tools/tool-policy.js +74 -8
  104. package/dist/customize/connectors/use-agent-access.d.ts +85 -0
  105. package/dist/customize/connectors/use-agent-access.js +72 -0
  106. package/dist/customize/migrate-to-v2/index.d.ts +1 -2
  107. package/dist/customize/migrate-to-v2/index.js +1 -2
  108. package/dist/customize/migrate-to-v2/migration-prompt.d.ts +12 -25
  109. package/dist/customize/migrate-to-v2/migration-prompt.js +34 -236
  110. package/dist/customize/migrate-to-v2/upgrade-defs.d.ts +1 -1
  111. package/dist/customize/migrate-to-v2/upgrade-defs.js +7 -6
  112. package/dist/customize/migrate-to-v2/upgrade-view.js +7 -7
  113. package/dist/customize/migrate-to-v2/use-run-upgrade.d.ts +3 -3
  114. package/dist/customize/providers/provider-accordion.js +17 -2
  115. package/dist/customize/sections/component/channel-access-panel.d.ts +16 -0
  116. package/dist/customize/sections/component/channel-access-panel.js +146 -0
  117. package/dist/customize/sections/component/channel-connect-hero.d.ts +3 -2
  118. package/dist/customize/sections/component/channel-connect-hero.js +3 -2
  119. package/dist/customize/sections/component/channel-hero-frame.d.ts +31 -0
  120. package/dist/customize/sections/component/channel-hero-frame.js +40 -0
  121. package/dist/customize/sections/component/channel-mocks.d.ts +6 -0
  122. package/dist/customize/sections/component/channel-mocks.js +46 -0
  123. package/dist/customize/sections/component/channel-row.d.ts +13 -3
  124. package/dist/customize/sections/component/channel-row.js +10 -4
  125. package/dist/customize/sections/component/email-connect-form.d.ts +27 -0
  126. package/dist/customize/sections/component/email-connect-form.js +183 -0
  127. package/dist/customize/sections/component/slack-connect-card.d.ts +7 -0
  128. package/dist/customize/sections/component/slack-connect-card.js +2 -3
  129. package/dist/customize/sections/component/teams-connect-card.d.ts +7 -0
  130. package/dist/customize/sections/component/teams-connect-card.js +2 -3
  131. package/dist/customize/sections/component/telegram-channel-row.js +16 -25
  132. package/dist/customize/sections/connectors-view.d.ts +1 -15
  133. package/dist/customize/sections/connectors-view.js +81 -314
  134. package/dist/customize/sections/view/agent-editor-catalog.js +5 -0
  135. package/dist/customize/sections/view/channels-view.d.ts +5 -1
  136. package/dist/customize/sections/view/channels-view.js +61 -75
  137. package/dist/customize/sections/view/gateway/gateway-overview.js +10 -2
  138. package/dist/customize/settings/tabs/experimental-tab.js +35 -16
  139. package/dist/customize/shared/catalog/catalog-empty-state.d.ts +1 -12
  140. package/dist/customize/shared/catalog/catalog-empty-state.js +3 -3
  141. package/dist/customize/shared/channels-switch-dialog.d.ts +18 -0
  142. package/dist/customize/shared/channels-switch-dialog.js +30 -0
  143. package/dist/customize/shared/feature-gate-screen.js +27 -9
  144. package/dist/customize/shared/use-customize-prefetch.d.ts +2 -3
  145. package/dist/customize/shared/use-customize-prefetch.js +9 -27
  146. package/dist/customize/triggers/schedule/post-to-field.d.ts +18 -0
  147. package/dist/customize/triggers/schedule/post-to-field.js +49 -0
  148. package/dist/customize/triggers/schedule/schedule-copy.d.ts +10 -6
  149. package/dist/customize/triggers/schedule/schedule-copy.js +42 -11
  150. package/dist/customize/triggers/schedule/schedule-detail-sheet.js +2 -1
  151. package/dist/customize/triggers/schedule/trigger-composer-logic.d.ts +22 -0
  152. package/dist/customize/triggers/schedule/trigger-composer-logic.js +25 -0
  153. package/dist/customize/triggers/schedule/trigger-composer.d.ts +5 -0
  154. package/dist/customize/triggers/schedule/trigger-composer.js +23 -14
  155. package/dist/customize/triggers/schedule/trigger-edit-logic.js +3 -0
  156. package/dist/customize/triggers/schedule/trigger-filter.js +1 -1
  157. package/dist/customize/triggers/schedule/trigger-runs-logic.d.ts +2 -2
  158. package/dist/customize/triggers/schedule/trigger-runs-panel.js +1 -0
  159. package/dist/customize/triggers/schedule/trigger-toast.js +2 -1
  160. package/dist/customize/triggers/schedule-view.js +5 -2
  161. package/dist/files/index.d.ts +1 -0
  162. package/dist/files/index.js +1 -0
  163. package/dist/files/project/change-request-recovery.d.ts +1 -26
  164. package/dist/files/project/change-request-recovery.js +1 -59
  165. package/dist/files/project/components/change-request-detail-dialog.js +13 -3
  166. package/dist/files/project/components/drive-explorer.js +15 -15
  167. package/dist/files/project/components/drive-toolbar.d.ts +16 -2
  168. package/dist/files/project/components/drive-toolbar.js +14 -5
  169. package/dist/files/project/hooks/use-change-request-recovery.js +3 -19
  170. package/dist/files/project/hooks/use-change-requests.d.ts +1 -0
  171. package/dist/files/project/hooks/use-change-requests.js +11 -2
  172. package/dist/files/renderers/image-frame.d.ts +46 -0
  173. package/dist/files/renderers/image-frame.js +59 -0
  174. package/dist/files/renderers/image-renderer.d.ts +11 -1
  175. package/dist/files/renderers/image-renderer.js +13 -3
  176. package/dist/files/renderers/pdf/pdf-clipboard.d.ts +2 -0
  177. package/dist/files/renderers/pdf/pdf-clipboard.js +21 -0
  178. package/dist/files/renderers/pdf/pdf-viewer.js +4 -2
  179. package/dist/files/renderers/show-content-renderer.d.ts +9 -1
  180. package/dist/files/renderers/show-content-renderer.js +56 -14
  181. package/dist/files/runtime/file-source.js +2 -0
  182. package/dist/files/runtime/hooks/use-binary-blob.d.ts +10 -1
  183. package/dist/files/runtime/hooks/use-binary-blob.js +10 -4
  184. package/dist/files/runtime/hooks/use-shared-image.d.ts +41 -0
  185. package/dist/files/runtime/hooks/use-shared-image.js +177 -0
  186. package/dist/files/viewer/file-content-renderer.d.ts +22 -1
  187. package/dist/files/viewer/file-content-renderer.js +50 -7
  188. package/dist/files/viewer/file-header.d.ts +7 -3
  189. package/dist/files/viewer/file-header.js +20 -11
  190. package/dist/files/viewer/file-preview-modal.d.ts +1 -1
  191. package/dist/files/viewer/file-preview-modal.js +10 -22
  192. package/dist/files/viewer/file-source.d.ts +13 -0
  193. package/dist/files/viewer/use-file-content-state.d.ts +2 -0
  194. package/dist/files/viewer/use-file-content-state.js +28 -10
  195. package/dist/files/viewer/viewer-actions.d.ts +3 -1
  196. package/dist/files/viewer/viewer-actions.js +2 -2
  197. package/dist/hooks/use-media-query.d.ts +1 -0
  198. package/dist/hooks/use-mobile.d.ts +5 -0
  199. package/dist/hooks/use-mobile.js +8 -0
  200. package/dist/i18n/en.d.ts +873 -85
  201. package/dist/i18n/en.js +888 -100
  202. package/dist/i18n/ui-catalog/localize-ui-catalog.js +4 -0
  203. package/dist/i18n/ui-catalog/remaining-ui-translation-keys.generated.js +15 -3
  204. package/dist/index.d.ts +2 -2
  205. package/dist/index.js +2 -2
  206. package/dist/internal/account-hub/account-settings-sidebar.js +1 -1
  207. package/dist/internal/account-hub/hub-sheet.d.ts +9 -1
  208. package/dist/internal/account-hub/hub-sheet.js +21 -5
  209. package/dist/internal/account-hub/sections.d.ts +1 -1
  210. package/dist/internal/account-hub/sections.js +2 -1
  211. package/dist/internal/auth/auth-card-shell.js +3 -3
  212. package/dist/internal/components/agent-mark.js +5 -2
  213. package/dist/internal/connector-logo/connector-logo-source.d.ts +63 -0
  214. package/dist/internal/connector-logo/connector-logo-source.js +48 -0
  215. package/dist/internal/connector-logo/connector-logo.d.ts +39 -0
  216. package/dist/internal/connector-logo/connector-logo.js +56 -0
  217. package/dist/internal/connector-logo/connector-mark-files.d.ts +11 -0
  218. package/dist/internal/connector-logo/connector-mark-files.js +35 -0
  219. package/dist/internal/files/file-read-retry.d.ts +13 -0
  220. package/dist/internal/files/file-read-retry.js +23 -3
  221. package/dist/internal/files/session-drive-files.d.ts +5 -1
  222. package/dist/internal/files/session-drive-files.js +7 -2
  223. package/dist/internal/hooks/channels/use-channels-installations.d.ts +32 -5
  224. package/dist/internal/hooks/channels/use-channels-installations.js +55 -7
  225. package/dist/internal/hooks/channels/use-email-inboxes.d.ts +19 -0
  226. package/dist/internal/hooks/channels/use-email-inboxes.js +48 -0
  227. package/dist/internal/hooks/connectors/use-add-account.js +1 -1
  228. package/dist/internal/hooks/index.d.ts +1 -1
  229. package/dist/internal/hooks/index.js +1 -1
  230. package/dist/internal/hooks/projects/use-new-project-session.d.ts +9 -0
  231. package/dist/internal/hooks/projects/use-new-project-session.js +28 -12
  232. package/dist/internal/hooks/use-auto-scroll.d.ts +8 -1
  233. package/dist/internal/hooks/use-auto-scroll.js +4 -4
  234. package/dist/internal/icons/telegram.d.ts +5 -0
  235. package/dist/internal/icons/telegram.js +6 -1
  236. package/dist/internal/layout/nav-hover-card.d.ts +35 -0
  237. package/dist/internal/layout/nav-hover-card.js +84 -0
  238. package/dist/internal/layout/project-nav-row.d.ts +3 -1
  239. package/dist/internal/layout/project-nav-row.js +3 -2
  240. package/dist/internal/layout/project-page-header.d.ts +4 -2
  241. package/dist/internal/layout/project-page-header.js +4 -3
  242. package/dist/internal/layout/project-settings-nav.js +59 -2
  243. package/dist/internal/lib/browser-error-noise.d.ts +1 -1
  244. package/dist/internal/lib/browser-error-noise.js +1 -1
  245. package/dist/internal/lib/browser-noise/rules/injected-scripts.d.ts +7 -0
  246. package/dist/internal/lib/browser-noise/rules/injected-scripts.js +15 -0
  247. package/dist/internal/lib/manifest-version.d.ts +1 -1
  248. package/dist/internal/lib/manifest-version.js +2 -2
  249. package/dist/internal/lib/memory-href.d.ts +16 -0
  250. package/dist/internal/lib/memory-href.js +46 -0
  251. package/dist/internal/lib/use-project-feature-flags.js +9 -9
  252. package/dist/internal/lib/utils/heic-convert.d.ts +1 -1
  253. package/dist/internal/lib/utils/heic-convert.js +3 -4
  254. package/dist/internal/lib/web-notifications.d.ts +20 -0
  255. package/dist/internal/lib/web-notifications.js +48 -4
  256. package/dist/internal/notifications/notification-bell.d.ts +4 -1
  257. package/dist/internal/notifications/notification-bell.js +2 -2
  258. package/dist/internal/selection/selection-bar.d.ts +2 -1
  259. package/dist/internal/selection/selection-bar.js +1 -1
  260. package/dist/internal/stores/file-preview-store.d.ts +29 -2
  261. package/dist/internal/stores/file-preview-store.js +19 -1
  262. package/dist/internal/stores/kortix-computer-store.js +3 -0
  263. package/dist/internal/stores/sidebar-nav-store.d.ts +1 -1
  264. package/dist/internal/stores/sidebar-nav-store.js +3 -1
  265. package/dist/lib/routes.d.ts +13 -1
  266. package/dist/lib/routes.js +13 -0
  267. package/dist/markdown/index.d.ts +2 -1
  268. package/dist/markdown/index.js +2 -1
  269. package/dist/markdown/setup-links/approval-decision.d.ts +1 -0
  270. package/dist/markdown/setup-links/approval-decision.js +6 -2
  271. package/dist/markdown/setup-links/connector-handshake.d.ts +3 -1
  272. package/dist/markdown/setup-links/connector-handshake.js +12 -10
  273. package/dist/markdown/setup-links/secret-intake-form.d.ts +0 -10
  274. package/dist/markdown/setup-links/secret-intake-form.js +1 -1
  275. package/dist/markdown/setup-links/show-connect-hero.d.ts +28 -0
  276. package/dist/markdown/setup-links/show-connect-hero.js +91 -0
  277. package/dist/markdown/unified-markdown.js +5 -5
  278. package/dist/primitives/badge.d.ts +1 -1
  279. package/dist/primitives/badge.js +2 -0
  280. package/dist/primitives/disclosure.js +14 -2
  281. package/dist/primitives/empty-art.d.ts +12 -0
  282. package/dist/primitives/empty-art.js +11 -0
  283. package/dist/primitives/mermaid-renderer.d.ts +2 -0
  284. package/dist/primitives/mermaid-renderer.js +21 -15
  285. package/dist/primitives/resizable.js +6 -1
  286. package/dist/primitives/resize-seam.d.ts +11 -0
  287. package/dist/primitives/resize-seam.js +12 -0
  288. package/dist/primitives/sidebar-panel.js +4 -7
  289. package/dist/primitives/tabs.d.ts +14 -1
  290. package/dist/primitives/tabs.js +1 -1
  291. package/dist/providers/ui-provider.d.ts +9 -0
  292. package/dist/session/composer/ComposerAboveCard.d.ts +1 -1
  293. package/dist/session/composer/ComposerAboveCard.js +2 -2
  294. package/dist/session/composer/ComposerCard.d.ts +1 -1
  295. package/dist/session/composer/ComposerCard.js +3 -3
  296. package/dist/session/composer/agent-selector.d.ts +13 -1
  297. package/dist/session/composer/agent-selector.js +25 -5
  298. package/dist/session/composer/composer-agent-access.d.ts +15 -0
  299. package/dist/session/composer/composer-agent-access.js +27 -0
  300. package/dist/session/composer/composer-chat-input.d.ts +8 -2
  301. package/dist/session/composer/composer-chat-input.js +8 -6
  302. package/dist/session/composer/composer-logic.d.ts +16 -0
  303. package/dist/session/composer/composer-logic.js +12 -0
  304. package/dist/session/composer/composer-underbar.d.ts +3 -1
  305. package/dist/session/composer/composer-underbar.js +4 -3
  306. package/dist/session/composer/composer.d.ts +15 -1
  307. package/dist/session/composer/composer.js +19 -1
  308. package/dist/session/composer/draft/composer-draft.d.ts +6 -2
  309. package/dist/session/composer/draft/composer-draft.js +5 -1
  310. package/dist/session/composer/reasoning-effort-selector.js +1 -1
  311. package/dist/session/models/chatgpt-connection-button.d.ts +11 -0
  312. package/dist/session/models/chatgpt-connection-button.js +54 -0
  313. package/dist/session/models/model-selector.js +5 -2
  314. package/dist/session/models/use-model-connection-gate.d.ts +5 -5
  315. package/dist/session/models/use-model-connection-gate.js +5 -5
  316. package/dist/session/outcomes/jump-to-outcome.d.ts +10 -0
  317. package/dist/session/outcomes/jump-to-outcome.js +11 -0
  318. package/dist/session/outcomes/session-outcomes-bridge.d.ts +14 -0
  319. package/dist/session/outcomes/session-outcomes-bridge.js +12 -0
  320. package/dist/session/outcomes/session-outcomes-provider.d.ts +3 -1
  321. package/dist/session/outcomes/session-outcomes-provider.js +33 -3
  322. package/dist/session/panel/easy/app-preview.d.ts +10 -0
  323. package/dist/session/panel/easy/app-preview.js +31 -12
  324. package/dist/session/panel/easy/change-requests-card.d.ts +7 -0
  325. package/dist/session/panel/easy/change-requests-card.js +17 -0
  326. package/dist/session/panel/easy/easy-panel-logic.js +7 -1
  327. package/dist/session/panel/easy/easy-panel.js +5 -2
  328. package/dist/session/panel/easy/file-preview.js +1 -1
  329. package/dist/session/panel/easy/outputs-card.d.ts +2 -1
  330. package/dist/session/panel/easy/outputs-card.js +3 -2
  331. package/dist/session/panel/mobile-tool-drawer.js +7 -1
  332. package/dist/session/panel/session-audit-panel.js +9 -2
  333. package/dist/session/panel/session-detail-panel.js +9 -3
  334. package/dist/session/panel/session-files-explorer.d.ts +9 -0
  335. package/dist/session/panel/session-files-explorer.js +12 -3
  336. package/dist/session/panel/session-panel-provider.d.ts +15 -1
  337. package/dist/session/panel/session-panel-provider.js +32 -7
  338. package/dist/session/panel/shared/derive-panels.d.ts +8 -1
  339. package/dist/session/panel/shared/derive-panels.js +12 -2
  340. package/dist/session/panel/shared/output-priority.js +2 -0
  341. package/dist/session/participants/session-participants.d.ts +5 -1
  342. package/dist/session/participants/session-participants.js +9 -2
  343. package/dist/session/prompts/approval-request.d.ts +5 -0
  344. package/dist/session/prompts/approval-request.js +7 -1
  345. package/dist/session/prompts/session-approval-review.d.ts +9 -0
  346. package/dist/session/prompts/session-approval-review.js +18 -0
  347. package/dist/session/status/session-error-banner.js +2 -49
  348. package/dist/session/status/session-starting-loader.d.ts +14 -2
  349. package/dist/session/status/session-starting-loader.js +16 -4
  350. package/dist/session/thread/after-first-prompt.d.ts +7 -0
  351. package/dist/session/thread/after-first-prompt.js +8 -0
  352. package/dist/session/thread/detect-command.d.ts +12 -0
  353. package/dist/session/thread/detect-command.js +20 -0
  354. package/dist/session/thread/session-chat.d.ts +3 -1
  355. package/dist/session/thread/session-chat.js +377 -252
  356. package/dist/session/thread/session-thread.d.ts +3 -1
  357. package/dist/session/thread/session-thread.js +9 -2
  358. package/dist/session/thread/thread-boot-rows.d.ts +36 -0
  359. package/dist/session/thread/thread-boot-rows.js +89 -0
  360. package/dist/session/thread/transcript-rows.d.ts +31 -0
  361. package/dist/session/thread/transcript-rows.js +3 -0
  362. package/dist/session/thread/transcript.d.ts +0 -9
  363. package/dist/session/thread/transcript.js +104 -19
  364. package/dist/session/tool/shared/infrastructure-contexts.d.ts +28 -0
  365. package/dist/session/tool/shared/infrastructure-contexts.js +31 -3
  366. package/dist/session/tool/tool-part-renderer.d.ts +5 -4
  367. package/dist/session/tool/tool-part-renderer.js +8 -3
  368. package/dist/session/tool/tools/bash-tool.js +7 -6
  369. package/dist/session/tool/tools/channel-send-card.d.ts +1 -2
  370. package/dist/session/tool/tools/channel-send.d.ts +2 -1
  371. package/dist/session/tool/tools/codemode-tool.js +1 -1
  372. package/dist/session/tool/tools/connector-tools.js +1 -1
  373. package/dist/session/tool/tools/image-gen-tool.d.ts +1 -1
  374. package/dist/session/tool/tools/image-gen-tool.js +240 -53
  375. package/dist/session/tool/tools/show-tool.js +19 -8
  376. package/dist/session/turn/channel-brand.d.ts +8 -3
  377. package/dist/session/turn/channel-brand.js +20 -4
  378. package/dist/session/turn/message-author.d.ts +8 -0
  379. package/dist/session/turn/message-author.js +24 -0
  380. package/dist/session/turn/message-row.d.ts +52 -0
  381. package/dist/session/turn/message-row.js +44 -0
  382. package/dist/session/turn/plan-anchor.d.ts +1 -1
  383. package/dist/session/turn/plan-anchor.js +1 -1
  384. package/dist/session/turn/user-message.d.ts +7 -1
  385. package/dist/session/turn/user-message.js +21 -7
  386. package/dist/styles.css +1 -1
  387. package/dist/workspace/home/access-requests-bell.d.ts +9 -2
  388. package/dist/workspace/home/access-requests-bell.js +20 -6
  389. package/dist/workspace/home/first-chat.d.ts +8 -21
  390. package/dist/workspace/home/first-chat.js +22 -72
  391. package/dist/workspace/index.d.ts +6 -0
  392. package/dist/workspace/index.js +6 -0
  393. package/dist/workspace/layout/project-home.d.ts +14 -2
  394. package/dist/workspace/layout/project-home.js +60 -21
  395. package/dist/workspace/layout/use-project-home-send.d.ts +9 -1
  396. package/dist/workspace/layout/use-project-home-send.js +82 -3
  397. package/dist/workspace/memory/body-doc.d.ts +17 -0
  398. package/dist/workspace/memory/body-doc.js +208 -0
  399. package/dist/workspace/memory/body-extensions.d.ts +38 -0
  400. package/dist/workspace/memory/body-extensions.js +103 -0
  401. package/dist/workspace/memory/company-memory-page.d.ts +8 -0
  402. package/dist/workspace/memory/company-memory-page.js +16 -0
  403. package/dist/workspace/memory/memory-all.d.ts +20 -0
  404. package/dist/workspace/memory/memory-all.js +27 -0
  405. package/dist/workspace/memory/memory-body.d.ts +19 -0
  406. package/dist/workspace/memory/memory-body.js +139 -0
  407. package/dist/workspace/memory/memory-empty.d.ts +13 -0
  408. package/dist/workspace/memory/memory-empty.js +28 -0
  409. package/dist/workspace/memory/memory-history.d.ts +27 -0
  410. package/dist/workspace/memory/memory-history.js +108 -0
  411. package/dist/workspace/memory/memory-labels.d.ts +16 -0
  412. package/dist/workspace/memory/memory-labels.js +47 -0
  413. package/dist/workspace/memory/memory-page-list.d.ts +34 -0
  414. package/dist/workspace/memory/memory-page-list.js +156 -0
  415. package/dist/workspace/memory/memory-reader.d.ts +58 -0
  416. package/dist/workspace/memory/memory-reader.js +123 -0
  417. package/dist/workspace/memory/memory-view.d.ts +21 -0
  418. package/dist/workspace/memory/memory-view.js +124 -0
  419. package/dist/workspace/memory/remember-popover.d.ts +19 -0
  420. package/dist/workspace/memory/remember-popover.js +61 -0
  421. package/dist/workspace/memory/remember-this.d.ts +12 -0
  422. package/dist/workspace/memory/remember-this.js +89 -0
  423. package/dist/workspace/memory/source-mark.d.ts +18 -0
  424. package/dist/workspace/memory/source-mark.js +79 -0
  425. package/dist/workspace/memory/used-memory-chip.d.ts +14 -0
  426. package/dist/workspace/memory/used-memory-chip.js +61 -0
  427. package/dist/workspace/new/advanced-fields.d.ts +2 -1
  428. package/dist/workspace/new/advanced-fields.js +2 -2
  429. package/dist/workspace/new/source-param.d.ts +1 -1
  430. package/dist/workspace/new/source-param.js +3 -1
  431. package/dist/workspace/new/use-create-workspace.d.ts +8 -10
  432. package/dist/workspace/new/use-create-workspace.js +3 -3
  433. package/dist/workspace/projects/onboarding/app-logo.d.ts +7 -2
  434. package/dist/workspace/projects/onboarding/app-logo.js +6 -13
  435. package/dist/workspace/projects/policies-panel.js +5 -3
  436. package/dist/workspace/review/review-actions.d.ts +4 -2
  437. package/dist/workspace/review/review-actions.js +8 -2
  438. package/dist/workspace/review/review-center.js +11 -7
  439. package/dist/workspace/review/review-detail.d.ts +10 -0
  440. package/dist/workspace/review/review-detail.js +101 -13
  441. package/dist/workspace/saved-session-skeleton.d.ts +2 -2
  442. package/dist/workspace/saved-session-skeleton.js +3 -3
  443. package/dist/workspace/session-workspace.js +15 -13
  444. package/dist/workspace/sessions/project-sessions-view.js +3 -2
  445. package/dist/workspace/sessions/sessions-toolbar.d.ts +3 -1
  446. package/dist/workspace/sessions/sessions-toolbar.js +2 -2
  447. package/dist/workspace/sidebar/footer/project-apps-nav.d.ts +5 -0
  448. package/dist/workspace/sidebar/footer/project-apps-nav.js +41 -2
  449. package/dist/workspace/sidebar/footer/project-artifacts-nav.d.ts +6 -0
  450. package/dist/workspace/sidebar/footer/project-artifacts-nav.js +22 -0
  451. package/dist/workspace/sidebar/footer/project-manifest-upgrade-alert.js +13 -13
  452. package/dist/workspace/sidebar/footer/project-memory-nav.d.ts +7 -0
  453. package/dist/workspace/sidebar/footer/project-memory-nav.js +19 -0
  454. package/dist/workspace/sidebar/nav-row-meta.js +14 -2
  455. package/dist/workspace/sidebar/project-nav-items.js +3 -0
  456. package/dist/workspace/sidebar/project-session-list.js +68 -56
  457. package/dist/workspace/sidebar/project-sidebar.js +9 -2
  458. package/dist/workspace/sidebar/project-spaces-nav.d.ts +8 -0
  459. package/dist/workspace/sidebar/project-spaces-nav.js +69 -0
  460. package/dist/workspace/sidebar/session-group-order.d.ts +9 -0
  461. package/dist/workspace/sidebar/session-group-order.js +25 -0
  462. package/dist/workspace/sidebar/session-group-sections.d.ts +62 -0
  463. package/dist/workspace/sidebar/session-group-sections.js +267 -0
  464. package/dist/workspace/sidebar/session-list-chrome.d.ts +28 -0
  465. package/dist/workspace/sidebar/session-list-chrome.js +50 -0
  466. package/dist/workspace/spaces/channel-glyph.d.ts +5 -0
  467. package/dist/workspace/spaces/channel-glyph.js +6 -0
  468. package/dist/workspace/spaces/channel-setup.d.ts +16 -0
  469. package/dist/workspace/spaces/channel-setup.js +105 -0
  470. package/dist/workspace/spaces/channels-onboarding.d.ts +13 -0
  471. package/dist/workspace/spaces/channels-onboarding.js +37 -0
  472. package/dist/workspace/spaces/create-channel-dialog.d.ts +16 -0
  473. package/dist/workspace/spaces/create-channel-dialog.js +158 -0
  474. package/dist/workspace/spaces/private-channels-not-in.d.ts +9 -0
  475. package/dist/workspace/spaces/private-channels-not-in.js +69 -0
  476. package/dist/workspace/spaces/space-agents.d.ts +10 -0
  477. package/dist/workspace/spaces/space-agents.js +10 -0
  478. package/dist/workspace/spaces/space-details-dialog.d.ts +20 -0
  479. package/dist/workspace/spaces/space-details-dialog.js +176 -0
  480. package/dist/workspace/spaces/space-link-label.d.ts +49 -0
  481. package/dist/workspace/spaces/space-link-label.js +73 -0
  482. package/dist/workspace/spaces/space-links.d.ts +19 -0
  483. package/dist/workspace/spaces/space-links.js +230 -0
  484. package/dist/workspace/spaces/space-members.d.ts +46 -0
  485. package/dist/workspace/spaces/space-members.js +182 -0
  486. package/dist/workspace/spaces/space-roster.d.ts +15 -0
  487. package/dist/workspace/spaces/space-roster.js +44 -0
  488. package/dist/workspace/spaces/space-threads-tab.d.ts +56 -0
  489. package/dist/workspace/spaces/space-threads-tab.js +156 -0
  490. package/dist/workspace/spaces/space-timeline-view.d.ts +254 -0
  491. package/dist/workspace/spaces/space-timeline-view.js +235 -0
  492. package/dist/workspace/spaces/space-timeline.d.ts +106 -0
  493. package/dist/workspace/spaces/space-timeline.js +183 -0
  494. package/dist/workspace/spaces/space-triggers.d.ts +13 -0
  495. package/dist/workspace/spaces/space-triggers.js +78 -0
  496. package/dist/workspace/spaces/space-view.d.ts +37 -0
  497. package/dist/workspace/spaces/space-view.js +436 -0
  498. package/package.json +27 -36
  499. package/skills/kortix-ui/SKILL.md +3 -3
  500. package/skills/kortix-ui/references/custom-dashboard.md +3 -3
  501. package/skills/kortix-ui/references/modules.md +28 -4
  502. package/skills/kortix-ui/references/theming.md +1 -1
  503. package/dist/customize/connectors/catalog/merge-search.d.ts +0 -10
  504. package/dist/customize/connectors/catalog/merge-search.js +0 -26
  505. package/dist/customize/connectors/detail/find-easy-connect-app.d.ts +0 -29
  506. package/dist/customize/connectors/detail/find-easy-connect-app.js +0 -22
  507. package/dist/customize/migrate-to-v2/use-migrate-to-v2.d.ts +0 -9
  508. package/dist/customize/migrate-to-v2/use-migrate-to-v2.js +0 -24
  509. package/dist/customize/sections/connector-connection-header.d.ts +0 -36
  510. package/dist/customize/sections/connector-connection-header.js +0 -33
  511. package/dist/customize/sections/connector-connection-modal.d.ts +0 -34
  512. package/dist/customize/sections/connector-connection-modal.js +0 -72
  513. package/dist/customize/sections/discover-catalogue-card.d.ts +0 -19
  514. package/dist/customize/sections/discover-catalogue-card.js +0 -26
  515. package/dist/customize/sections/discover-catalogue-detail.d.ts +0 -15
  516. package/dist/customize/sections/discover-catalogue-detail.js +0 -24
  517. package/dist/customize/sections/discover-catalogue.d.ts +0 -17
  518. package/dist/customize/sections/discover-catalogue.js +0 -132
  519. package/dist/customize/sections/llm-provider/provider-access-menu.d.ts +0 -10
  520. package/dist/customize/sections/llm-provider/provider-access-menu.js +0 -23
  521. package/dist/files/project/components/drive-empty-art.d.ts +0 -2
  522. package/dist/files/project/components/drive-empty-art.js +0 -5
  523. package/dist/internal/hooks/use-media-query.d.ts +0 -2
  524. package/dist/internal/share/public-share-link-button.d.ts +0 -14
  525. package/dist/internal/share/public-share-link-button.js +0 -17
  526. package/dist/markdown/setup-links/app-credentials-form.d.ts +0 -12
  527. package/dist/markdown/setup-links/app-credentials-form.js +0 -115
  528. /package/dist/{internal/hooks → hooks}/use-media-query.js +0 -0
@@ -0,0 +1,123 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useDeleteProjectMemoryPage } from '@kortix/sdk/react';
4
+ import { CaretLeftIcon, ClockCounterClockwiseIcon, PencilSimpleIcon, TrashIcon } from '@phosphor-icons/react';
5
+ import { useEffect, useRef, useState } from 'react';
6
+ import { useLocale, useTranslations } from '../../i18n/index.js';
7
+ import { relativeTime } from '../../internal/lib/relative-time.js';
8
+ import { Button } from '../../primitives/button.js';
9
+ import { ConfirmDialog } from '../../primitives/confirm-dialog.js';
10
+ import { ErrorState } from '../../primitives/error-state.js';
11
+ import { Alert, AlertActions, AlertContent, AlertDescription, AlertMedia, AlertTitle } from '../../primitives/alert.js';
12
+ import { Skeleton } from '../../primitives/skeleton.js';
13
+ import { errorToast, successToast } from '../../primitives/toast.js';
14
+ import { cn } from '../../lib/utils.js';
15
+ import { hasOpenFloatingLayer } from '../../lib/z-stack.js';
16
+ import { hasMemoryAuthor, useMemoryAuthorName } from './memory-labels.js';
17
+ import { MemoryBody } from './memory-body.js';
18
+ import { useMemoryVersions, useRestoreMemoryVersion } from './memory-history.js';
19
+ import { SourceList } from './source-mark.js';
20
+ /** The reader's three quiet bordered buttons: Edit, History, Delete. */
21
+ const ACTION = 'text-muted-foreground hover:text-foreground font-normal';
22
+ /**
23
+ * One page, across the reader's width: the title and "Updated 2h ago by
24
+ * Writer" top left, Edit · History · Delete top right, then the body with its
25
+ * source numbers, the numbered sources and the related pages. `editor`
26
+ * replaces the body while it is edited (the buttons hide; Cancel and Save sit
27
+ * under it). Delete asks once and deletes for good. The header draws from
28
+ * the list's summary at once; the body arrives with the page. `previewId`
29
+ * (a version picked in History) shows that version instead, read-only, under
30
+ * a bar with "Restore this version" and "Back to current" (Esc). Where the
31
+ * History sheet covers the reader (a narrow container), Preview closes the
32
+ * sheet first, so the version shows here; History reopens it on that version.
33
+ */
34
+ export function MemoryReader({ projectId, summary, page, pageError, pages, editing, editorRun, onRetry, onSelectPage, onBack, onEdit, onHistory, onEditDone, onReload, onRemoved, previewId = null, previewFocus = false, onPreviewEnd, }) {
35
+ const t = useTranslations('spaces.memory');
36
+ const locale = useLocale();
37
+ const authorName = useMemoryAuthorName();
38
+ const remove = useDeleteProjectMemoryPage(projectId);
39
+ const [deleting, setDeleting] = useState(false);
40
+ const { versions } = useMemoryVersions(projectId, previewId && page ? page.page_id : undefined);
41
+ const preview = (previewId && versions.find((version) => version.version_id === previewId)) || null;
42
+ const historyRef = useRef(null);
43
+ const focusedPreview = useRef(false);
44
+ useEffect(() => {
45
+ if (preview && previewFocus)
46
+ focusedPreview.current = true;
47
+ else if (!preview && focusedPreview.current) {
48
+ focusedPreview.current = false;
49
+ historyRef.current?.focus({ preventScroll: true });
50
+ }
51
+ }, [preview, previewFocus]);
52
+ const confirmDelete = () => remove.mutate(summary.page_id, {
53
+ onSuccess: () => {
54
+ setDeleting(false);
55
+ onRemoved();
56
+ successToast(t('deleted'));
57
+ },
58
+ onError: () => errorToast(t('deleteFailed')),
59
+ });
60
+ return (_jsxs("div", { className: "@container/reader min-h-0 flex-1 overflow-y-auto", children: [_jsxs("article", { className: "flex flex-col px-6 py-8 @2xl/reader:px-16 @2xl/reader:py-10", children: [_jsxs(Button, { variant: "ghost", size: "toolbar", className: "text-muted-foreground mb-4 -ml-2 self-start @md/memory:hidden", onClick: onBack, children: [_jsx(CaretLeftIcon, { "aria-hidden": true }), t('allPages')] }), preview && page ? _jsx(PreviewBar, { projectId: projectId, page: page, version: preview, focus: previewFocus, onEnd: onPreviewEnd }) : null, _jsxs("header", { className: "flex flex-col items-start gap-3 @xl/reader:flex-row @xl/reader:justify-between @xl/reader:gap-6", children: [_jsxs("div", { className: "flex min-w-0 flex-col gap-1.5", children: [_jsx("h2", { className: "text-2xl leading-tight font-semibold tracking-tight text-balance [overflow-wrap:anywhere]", children: preview ? preview.snapshot.title : summary.title }), _jsx("p", { hidden: !!preview, className: "text-muted-foreground text-xs leading-snug", children: hasMemoryAuthor(summary.updated_by)
61
+ ? t('updated', { time: relativeTime(summary.updated_at, locale), author: authorName(summary.updated_by) })
62
+ : t('updatedAt', { time: relativeTime(summary.updated_at, locale) }) })] }), !page || preview ? null : (_jsxs("div", { className: cn('flex shrink-0 flex-wrap items-center gap-1.5 pt-0.5', editing && 'invisible'), "aria-hidden": editing || undefined, inert: editing || undefined, children: [page.can_edit ? (_jsxs(Button, { variant: "outline", size: "toolbar", className: ACTION, onClick: onEdit, children: [_jsx(PencilSimpleIcon, { "aria-hidden": true }), t('edit')] })) : null, _jsxs(Button, { ref: historyRef, variant: "outline", size: "toolbar", className: ACTION, onClick: onHistory, children: [_jsx(ClockCounterClockwiseIcon, { "aria-hidden": true }), t('history.title')] }), page.can_delete ? (_jsxs(Button, { variant: "outline", size: "toolbar", className: ACTION, onClick: () => setDeleting(true), children: [_jsx(TrashIcon, { "aria-hidden": true }), t('delete')] })) : null] }))] }), pageError && !page ? (_jsx("div", { className: "pt-8", children: _jsx(ErrorState, { size: "sm", title: t('pageLoadError'), action: _jsx(Button, { variant: "outline", size: "sm", onClick: onRetry, children: t('retry') }) }) })) : page && preview ? (_jsx(MemoryBody, { projectId: projectId, page: { ...page, body: preview.snapshot.body }, pages: pages, editing: false, onSelectPage: onSelectPage, onDone: () => { }, onReload: () => { } }, `preview:${preview.version_id}`)) : page ? (_jsxs(_Fragment, { children: [_jsx(MemoryBody, { projectId: projectId, page: page, pages: pages, editing: editing, onSelectPage: onSelectPage, onDone: onEditDone, onReload: onReload }, `${page.page_id}:${page.version_no}:${editorRun}`), _jsx(PageFooter, { projectId: projectId, page: page, onSelectPage: onSelectPage })] })) : (_jsx(DelayedBodySkeleton, {}))] }), _jsx(ConfirmDialog, { open: deleting, onOpenChange: setDeleting, title: t('deleteTitle', { title: summary.title }), description: t('deleteDescription'), confirmLabel: t('delete'), confirmVariant: "destructive", isPending: remove.isPending, onConfirm: confirmDelete })] }));
63
+ }
64
+ /**
65
+ * Above the title while a version is previewed: when and by whom, then
66
+ * "Restore this version" and "Back to current". Esc outside the History
67
+ * sheet also returns (the sheet handles its own Esc).
68
+ */
69
+ function PreviewBar({ projectId, page, version, focus, onEnd, }) {
70
+ const t = useTranslations('spaces.memory');
71
+ const locale = useLocale();
72
+ const authorName = useMemoryAuthorName();
73
+ const { restore, restoring } = useRestoreMemoryVersion(projectId, page, () => onEnd?.());
74
+ const backRef = useRef(null);
75
+ useEffect(() => {
76
+ if (focus)
77
+ backRef.current?.focus({ preventScroll: true });
78
+ }, [focus, version.version_id]);
79
+ useEffect(() => {
80
+ if (!onEnd)
81
+ return;
82
+ const onKey = (event) => {
83
+ if (event.key !== 'Escape' || event.defaultPrevented || hasOpenFloatingLayer())
84
+ return;
85
+ event.preventDefault();
86
+ onEnd();
87
+ };
88
+ document.addEventListener('keydown', onKey);
89
+ return () => document.removeEventListener('keydown', onKey);
90
+ }, [onEnd]);
91
+ // Narrow reader: the actions wrap under the text, to the right.
92
+ return (_jsxs(Alert, { className: "mb-6 flex-wrap", children: [_jsx(AlertMedia, { children: _jsx(ClockCounterClockwiseIcon, { className: "text-kortix-blue", "aria-hidden": true }) }), _jsxs(AlertContent, { className: "basis-40", children: [_jsx(AlertTitle, { children: t('history.viewing', { time: relativeTime(version.created_at, locale) }) }), hasMemoryAuthor(version.author) ? (_jsx(AlertDescription, { children: t('history.viewingBy', { author: authorName(version.author) }) })) : null] }), _jsxs(AlertActions, { className: "ml-auto", children: [_jsx(Button, { ref: backRef, variant: "ghost", size: "sm", onClick: onEnd, children: t('history.backToCurrent') }), page.can_edit ? (_jsx(Button, { variant: "outline", size: "sm", disabled: restoring, "aria-busy": restoring || undefined, onClick: () => restore(version), children: t('history.restore') })) : null] })] }));
93
+ }
94
+ /** A text line's placeholder inside the line box of `line` (its font size and line height), so the real line lands where it sat. */
95
+ export function Line({ line, className }) {
96
+ return (_jsx("div", { className: line, children: _jsx(Skeleton, { className: cn('inline-block rounded-sm py-0 align-middle', className) }) }));
97
+ }
98
+ /** The body's placeholder: three paragraphs at the body's type, line height and gap. */
99
+ function BodySkeleton() {
100
+ const BODY = 'text-base leading-relaxed';
101
+ return (_jsxs("div", { "aria-busy": true, className: "flex flex-col gap-4 pt-8", children: [_jsxs("div", { children: [_jsx(Line, { line: BODY, className: "h-3.5 w-full" }), _jsx(Line, { line: BODY, className: "h-3.5 w-1/2" })] }), _jsxs("div", { children: [_jsx(Line, { line: BODY, className: "h-3.5 w-full" }), _jsx(Line, { line: BODY, className: "h-3.5 w-2/3" })] }), _jsx(Line, { line: BODY, className: "h-3.5 w-5/6" })] }));
102
+ }
103
+ /** The body's placeholder after 150 ms: a page that loads faster shows none (no flash). */
104
+ function DelayedBodySkeleton() {
105
+ const [shown, setShown] = useState(false);
106
+ useEffect(() => {
107
+ const timer = setTimeout(() => setShown(true), 150);
108
+ return () => clearTimeout(timer);
109
+ }, []);
110
+ return shown ? _jsx(BodySkeleton, {}) : null;
111
+ }
112
+ /**
113
+ * The reader before the layer has loaded: the title's and "Updated …"'s line
114
+ * boxes, then the body. No Edit, History or Delete: they come with the page.
115
+ */
116
+ export function MemoryReaderSkeleton({ className }) {
117
+ return (_jsx("div", { className: cn('@container/reader min-h-0 flex-1 overflow-hidden', className), children: _jsxs("div", { className: "flex flex-col px-6 py-8 @2xl/reader:px-16 @2xl/reader:py-10", children: [_jsx("div", { className: "mb-4 h-7 @md/memory:hidden" }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Line, { line: "text-2xl leading-tight", className: "h-5 w-56" }), _jsx(Line, { line: "text-xs leading-snug", className: "h-2.5 w-36" })] }), _jsx(BodySkeleton, {})] }) }));
118
+ }
119
+ /** Under the body: the numbered sources and the related pages. */
120
+ function PageFooter({ projectId, page, onSelectPage, }) {
121
+ const t = useTranslations('spaces.memory');
122
+ return (_jsxs(_Fragment, { children: [page.sources.length > 0 ? _jsx(SourceList, { sources: page.sources, projectId: projectId }) : null, page.related.length > 0 ? (_jsxs("div", { className: "flex flex-col gap-2.5 pt-8", children: [_jsx("h3", { className: "text-muted-foreground text-xs leading-snug", children: t('relatedPages') }), _jsx("div", { className: "flex flex-wrap gap-2", children: page.related.map((related) => (_jsx(Button, { variant: "outline", size: "sm", className: "max-w-full px-3.5 text-xs font-normal", onClick: () => onSelectPage(related.page_id), children: _jsx("span", { className: "truncate", children: related.title }) }, related.page_id))) })] })) : null] }));
123
+ }
@@ -0,0 +1,21 @@
1
+ /** The open page, in the URL so a page can be linked (the thread's "Saved to memory · View" uses it). */
2
+ export declare const MEMORY_PAGE_PARAM = "page";
3
+ /** Set with `page`: the page opens with its History beside it. */
4
+ export declare const MEMORY_HISTORY_PARAM = "history";
5
+ /** `1`: "Remember this…" opens on arrival (#general's "Get started"); the view then drops it. */
6
+ export declare const MEMORY_REMEMBER_PARAM = "remember";
7
+ export interface MemoryViewProps {
8
+ projectId: string;
9
+ /** `company`, or the space id of a channel or DM. */
10
+ layerKey: string;
11
+ /** "#marketing", the DM's agent, or "Company": the copy's name for the layer. */
12
+ place: string;
13
+ }
14
+ /**
15
+ * A layer's memory: the flat page list
16
+ * on the left, the open page on the right (its History in a sheet beside
17
+ * it; its body edited in place). A layer with no pages says what memory is
18
+ * and offers "Remember this…". The same view serves a channel, a DM and the
19
+ * Company page.
20
+ */
21
+ export declare function MemoryView({ projectId, layerKey, place }: MemoryViewProps): import("react").JSX.Element;
@@ -0,0 +1,124 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useProjectMemoryLayer, useProjectMemoryPage, useProjectMemoryPages } from '@kortix/sdk/react';
4
+ import { SunDimIcon } from '@phosphor-icons/react';
5
+ import { useEffect, useMemo, useState } from 'react';
6
+ import { useTranslations } from '../../i18n/index.js';
7
+ import { cn } from '../../lib/utils.js';
8
+ import { Button } from '../../primitives/button.js';
9
+ import { ErrorState } from '../../primitives/error-state.js';
10
+ import { Skeleton } from '../../primitives/skeleton.js';
11
+ import { SplitSheet, SplitSheetMain } from '../../primitives/split-sheet.js';
12
+ import { useUiPathname, useUiRouter, useUiSearchParams } from '../../providers/ui-provider.js';
13
+ import { MemoryEmpty } from './memory-empty.js';
14
+ import { MemoryAll, MemoryAllSkeleton } from './memory-all.js';
15
+ import { MemoryHistory } from './memory-history.js';
16
+ import { MemoryPageList, sortMemoryPages } from './memory-page-list.js';
17
+ import { MemoryReader, MemoryReaderSkeleton } from './memory-reader.js';
18
+ import { RememberPopover } from './remember-popover.js';
19
+ /** The open page, in the URL so a page can be linked (the thread's "Saved to memory · View" uses it). */
20
+ export const MEMORY_PAGE_PARAM = 'page';
21
+ /** Set with `page`: the page opens with its History beside it. */
22
+ export const MEMORY_HISTORY_PARAM = 'history';
23
+ /** `1`: "Remember this…" opens on arrival (#general's "Get started"); the view then drops it. */
24
+ export const MEMORY_REMEMBER_PARAM = 'remember';
25
+ /**
26
+ * A layer's memory: the flat page list
27
+ * on the left, the open page on the right (its History in a sheet beside
28
+ * it; its body edited in place). A layer with no pages says what memory is
29
+ * and offers "Remember this…". The same view serves a channel, a DM and the
30
+ * Company page.
31
+ */
32
+ export function MemoryView({ projectId, layerKey, place }) {
33
+ const t = useTranslations('spaces.memory');
34
+ const router = useUiRouter();
35
+ const pathname = useUiPathname();
36
+ const searchParams = useUiSearchParams();
37
+ const layer = useProjectMemoryLayer(projectId, layerKey);
38
+ const list = useProjectMemoryPages(projectId, layerKey);
39
+ // `?remember=1` opens "Remember this…" once its trigger mounts.
40
+ const [remembering, setRemembering] = useState(() => searchParams.get(MEMORY_REMEMBER_PARAM) === '1');
41
+ const [editing, setEditing] = useState(false);
42
+ // Bumped by the editor's Reload: a fresh form on the newest version. Not the
43
+ // version itself: a save bumps it too, and a remount would drop the save's
44
+ // own onSuccess (TanStack skips call-time callbacks of an unmounted caller).
45
+ const [editorRun, setEditorRun] = useState(0);
46
+ // History: `versionId` is the version picked in it (null: the current page).
47
+ // `sheet`: the sheet is open and the reader previews `versionId`.
48
+ // `preview`: the sheet covered the reader (a narrow container), so Preview
49
+ // closed it; the reader shows `versionId` under its preview bar.
50
+ // `closed`: back to the current page from `preview`; History reopens on `versionId`.
51
+ // `?history=1` (the thread line's "open History") opens it on arrival.
52
+ const [history, setHistory] = useState(() => searchParams.get(MEMORY_HISTORY_PARAM) ? { versionId: null, mode: 'sheet' } : null);
53
+ // A page this view just deleted (or whose creation it undid) leaves the list
54
+ // at once, until the list refetches (an Undo may bring it back after that).
55
+ const [gone, setGone] = useState(null);
56
+ const pages = useMemo(() => {
57
+ const all = list.data ?? [];
58
+ return sortMemoryPages(gone && gone.list === list.data ? all.filter((page) => page.page_id !== gone.pageId) : all);
59
+ }, [list.data, gone]);
60
+ const requested = searchParams.get(MEMORY_PAGE_PARAM);
61
+ const explicit = pages.find((page) => page.page_id === requested);
62
+ // No page in the URL (or one that is gone): the All view.
63
+ const selected = explicit;
64
+ const page = useProjectMemoryPage(projectId, selected?.page_id);
65
+ const setPage = (pageId) => {
66
+ setEditing(false);
67
+ if (pageId !== selected?.page_id)
68
+ setHistory(null);
69
+ const params = new URLSearchParams(searchParams.toString());
70
+ if (pageId)
71
+ params.set(MEMORY_PAGE_PARAM, pageId);
72
+ else
73
+ params.delete(MEMORY_PAGE_PARAM);
74
+ params.delete(MEMORY_HISTORY_PARAM);
75
+ const query = params.toString();
76
+ router.replace(query ? `${pathname}?${query}` : pathname, {
77
+ scroll: false,
78
+ });
79
+ };
80
+ const focusRemember = searchParams.get(MEMORY_REMEMBER_PARAM) === '1';
81
+ const loaded = !!layer.data && !!list.data;
82
+ useEffect(() => {
83
+ if (!focusRemember || !loaded)
84
+ return;
85
+ const params = new URLSearchParams(searchParams.toString());
86
+ params.delete(MEMORY_REMEMBER_PARAM);
87
+ const query = params.toString();
88
+ router.replace(query ? `${pathname}?${query}` : pathname, {
89
+ scroll: false,
90
+ });
91
+ }, [focusRemember, loaded, pathname, router, searchParams]);
92
+ if ((layer.isError && !layer.data) || (list.isError && !list.data)) {
93
+ return (_jsx("div", { className: "flex min-h-0 flex-1 items-center justify-center px-5 py-16", children: _jsx(ErrorState, { size: "sm", title: t('loadError'), action: _jsx(Button, { variant: "outline", size: "sm", onClick: () => {
94
+ void layer.refetch();
95
+ void list.refetch();
96
+ }, children: t('retry') }) }) }));
97
+ }
98
+ if (!layer.data || !list.data) {
99
+ // First load: a ghost of the list and the reader at their real line boxes, so nothing moves when the data lands.
100
+ return (
101
+ // Shown after 150 ms: a load faster than that draws no skeleton at all.
102
+ _jsxs("div", { "aria-busy": true, className: "@container/memory animate-in fade-in-0 fill-mode-backwards flex min-h-0 w-full min-w-0 flex-1 delay-150 motion-reduce:animate-none", children: [_jsxs("div", { className: cn('flex w-72 shrink-0 flex-col border-r px-3.5 pt-5 pb-4 @max-md/memory:w-full', requested && '@max-md/memory:hidden'), children: [_jsxs("div", { className: "mb-1.5 flex h-8 shrink-0 items-center justify-between pr-1 pl-2", children: [_jsx("div", { className: "text-xs", children: _jsx(Skeleton, { className: "inline-block h-2.5 w-12 rounded-sm py-0 align-middle" }) }), _jsx("div", { className: "flex size-6 items-center justify-center", children: _jsx(Skeleton, { className: "size-3.5 rounded-sm py-0" }) })] }), ['w-3/5', 'w-4/5', 'w-1/2', 'w-2/3', 'w-2/5', 'w-3/4'].map((width, index) => (_jsx("div", { className: "flex h-8 shrink-0 items-center px-2 text-sm", children: _jsx(Skeleton, { className: cn('inline-block h-3 rounded-sm py-0', width) }) }, index)))] }), requested ? _jsx(MemoryReaderSkeleton, {}) : _jsx(MemoryAllSkeleton, { className: "@max-md/memory:hidden" })] }));
103
+ }
104
+ const canWrite = layer.data.can_write && !layer.data.read_only;
105
+ const kind = layer.data.scope;
106
+ const rememberProps = {
107
+ projectId,
108
+ layerKey,
109
+ place,
110
+ open: remembering,
111
+ onOpenChange: setRemembering,
112
+ };
113
+ if (pages.length === 0) {
114
+ return (_jsx("div", { className: "flex min-h-0 flex-1 flex-col overflow-y-auto", children: _jsx(MemoryEmpty, { projectId: projectId, kind: kind, place: place, action: canWrite ? (_jsx(RememberPopover, { ...rememberProps, children: _jsxs(Button, { variant: "outline", size: "sm", className: "gap-1.5", children: [_jsx(SunDimIcon, { className: "size-3.5 shrink-0" }), t('remember.open')] }) })) : undefined }) }));
115
+ }
116
+ return (_jsxs("div", { className: "@container/memory flex min-h-0 w-full min-w-0 flex-1", children: [_jsx(MemoryPageList, { projectId: projectId, layerKey: layerKey, pages: pages, selectedId: selected?.page_id ?? null, onSelect: setPage,
117
+ // `?remember=1` (#general's "Get started"): "Remember this…" opens under the header.
118
+ anchor: canWrite && remembering
119
+ ? (header) => (_jsx(RememberPopover, { ...rememberProps, anchor: true, children: header }))
120
+ : undefined, className: cn('@max-md/memory:w-full', explicit && '@max-md/memory:hidden') }), selected ? (_jsxs(SplitSheet, { size: "lg", open: history?.mode === 'sheet' && !!page.data, onOpenChange: (open) => !open && setHistory(null), className: cn('min-w-0 flex-1', !explicit && '@max-md/memory:hidden'), children: [_jsx(SplitSheetMain, { className: "flex flex-col", children: _jsx(MemoryReader, { projectId: projectId, summary: selected, page: page.data?.page_id === selected.page_id ? page.data : undefined, pageError: page.isError, pages: pages, editing: editing && !!page.data, editorRun: editorRun, onRetry: () => void page.refetch(), onSelectPage: setPage, onBack: () => setPage(null), onEdit: () => setEditing(true), onHistory: () => setHistory((open) => ({ versionId: open?.versionId ?? null, mode: 'sheet' })), onEditDone: () => setEditing(false), onReload: () => void page.refetch().then(() => setEditorRun((run) => run + 1)), onRemoved: () => {
121
+ setGone({ pageId: selected.page_id, list: list.data });
122
+ setPage(null);
123
+ }, previewId: history && history.mode !== 'closed' ? history.versionId : null, previewFocus: history?.mode === 'preview', onPreviewEnd: () => setHistory((open) => open?.mode === 'preview' ? { ...open, mode: 'closed' } : open && { versionId: null, mode: 'sheet' }) }) }), history?.mode === 'sheet' && page.data ? (_jsx(MemoryHistory, { projectId: projectId, page: page.data, previewId: history.versionId, onPreview: (versionId, covered) => setHistory({ versionId, mode: covered && versionId ? 'preview' : 'sheet' }), onRestored: () => setHistory({ versionId: null, mode: 'sheet' }) })) : null] })) : (_jsx(MemoryAll, { kind: kind, place: place, pages: pages, onSelect: setPage, className: "@max-md/memory:hidden" }))] }));
124
+ }
@@ -0,0 +1,19 @@
1
+ import { type ReactNode } from 'react';
2
+ /**
3
+ * "Remember this…": one sentence for the layer, saved as a page with the
4
+ * person as its source. Enter saves, Shift+Enter starts a new line. The host
5
+ * owns `open`, so a link (`?remember=1`, #general's "Get started") can open
6
+ * it on arrival. `anchor`: `children` is not a trigger, only where it opens.
7
+ */
8
+ export declare function RememberPopover({ projectId, layerKey, place, open, onOpenChange, anchor, children, }: {
9
+ projectId: string;
10
+ layerKey: string;
11
+ /** "#marketing", the DM's agent, or "Company". */
12
+ place: string;
13
+ open: boolean;
14
+ onOpenChange: (open: boolean) => void;
15
+ /** `children` only places it: the link is the one way to open it. */
16
+ anchor?: boolean;
17
+ /** The trigger, or the anchor. */
18
+ children: ReactNode;
19
+ }): import("react").JSX.Element;
@@ -0,0 +1,61 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { ApiError } from '@kortix/sdk';
4
+ import { useAddProjectMemoryNote } from '@kortix/sdk/react';
5
+ import { useId, useState } from 'react';
6
+ import { useTranslations } from '../../i18n/index.js';
7
+ import { Button } from '../../primitives/button.js';
8
+ import { Field, FieldDescription } from '../../primitives/field.js';
9
+ import Loading from '../../primitives/loading.js';
10
+ import { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from '../../primitives/popover.js';
11
+ import { Textarea } from '../../primitives/textarea.js';
12
+ import { successToast } from '../../primitives/toast.js';
13
+ /** The API's cap on a note (`MEMORY_LIMITS.note_chars`). */
14
+ const NOTE_MAX = 1000;
15
+ const FAILURE_BY_CODE = {
16
+ secret_detected: 'secret',
17
+ layer_read_only: 'readOnly',
18
+ };
19
+ /**
20
+ * "Remember this…": one sentence for the layer, saved as a page with the
21
+ * person as its source. Enter saves, Shift+Enter starts a new line. The host
22
+ * owns `open`, so a link (`?remember=1`, #general's "Get started") can open
23
+ * it on arrival. `anchor`: `children` is not a trigger, only where it opens.
24
+ */
25
+ export function RememberPopover({ projectId, layerKey, place, open, onOpenChange, anchor, children, }) {
26
+ const t = useTranslations('spaces.memory');
27
+ const id = useId();
28
+ const add = useAddProjectMemoryNote(projectId, layerKey);
29
+ const [text, setText] = useState('');
30
+ const [failure, setFailure] = useState(null);
31
+ const save = () => {
32
+ const note = text.trim();
33
+ if (!note || add.isPending)
34
+ return;
35
+ // `mutateAsync`, not `mutate`'s callbacks: the first note turns the empty
36
+ // state into the page list, which unmounts this popover, and TanStack drops
37
+ // the call-time callbacks of an unmounted caller. The popover then stayed
38
+ // open (an empty copy, under the list's header).
39
+ add.mutateAsync({ text: note }).then(() => {
40
+ setText('');
41
+ onOpenChange(false);
42
+ successToast(t('rememberThis.saved'));
43
+ }, (err) => setFailure((err instanceof ApiError && err.code && FAILURE_BY_CODE[err.code]) || 'failed'));
44
+ };
45
+ return (_jsxs(Popover, { open: open, onOpenChange: (next) => {
46
+ if (next)
47
+ setFailure(null);
48
+ onOpenChange(next);
49
+ }, children: [anchor ? _jsx(PopoverAnchor, { asChild: true, children: children }) : _jsx(PopoverTrigger, { asChild: true, children: children }), _jsx(PopoverContent, { align: "start", className: "w-96 p-4", children: _jsxs("form", { className: "flex flex-col gap-4", onSubmit: (event) => {
50
+ event.preventDefault();
51
+ save();
52
+ }, children: [_jsxs(Field, { className: "gap-1.5", children: [_jsx(Textarea, { value: text, maxLength: NOTE_MAX, minHeight: 80, maxHeight: 240, autoFocus: true, "aria-label": t('remember.label', { place }), placeholder: t('remember.placeholder', { place }), "aria-invalid": failure ? true : undefined, "aria-describedby": `${id}-hint`, onChange: (event) => {
53
+ setText(event.target.value);
54
+ setFailure(null);
55
+ }, onKeyDown: (event) => {
56
+ if (event.key === 'Enter' && !event.shiftKey && !event.nativeEvent.isComposing) {
57
+ event.preventDefault();
58
+ save();
59
+ }
60
+ } }), _jsx(FieldDescription, { id: `${id}-hint`, role: failure ? 'alert' : undefined, className: failure ? 'text-destructive' : undefined, children: failure ? t(`remember.status.${failure}`) : t('remember.hint') })] }), _jsxs("div", { className: "flex justify-end gap-2", children: [_jsx(Button, { type: "button", variant: "outline-ghost", size: "sm", onClick: () => onOpenChange(false), children: t('editor.cancel') }), _jsxs(Button, { type: "submit", size: "sm", disabled: !text.trim() || add.isPending, "aria-busy": add.isPending || undefined, children: [add.isPending ? _jsx(Loading, { className: "size-4 shrink-0" }) : null, t('remember.send')] })] })] }) })] }));
61
+ }
@@ -0,0 +1,12 @@
1
+ import { type ProjectSession, type ProjectSpace } from '@kortix/sdk';
2
+ /**
3
+ * "Remember this" in a thread's hover toolbar: the thread's first prompt,
4
+ * editable, saved as a note in this channel's (or DM's) memory or the
5
+ * Company's, with the thread as its source. Only layers the viewer may write
6
+ * are offered (`can_write`, not `read_only`: an archived channel never is);
7
+ * with none, there is no button. The button shows a check for 2 s after a save.
8
+ */
9
+ export declare function RememberThisButton({ session, space }: {
10
+ session: ProjectSession;
11
+ space: ProjectSpace;
12
+ }): import("react").JSX.Element | null;
@@ -0,0 +1,89 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { ApiError } from '@kortix/sdk';
4
+ import { useAddProjectMemoryNote, useProjectMemoryLayer } from '@kortix/sdk/react';
5
+ import { SunDimIcon } from '@phosphor-icons/react';
6
+ import { useEffect, useId, useState } from 'react';
7
+ import { useTranslations } from '../../i18n/index.js';
8
+ import { SolidCheckIcon } from '../../internal/icons/solid-check-icon.js';
9
+ import { Button } from '../../primitives/button.js';
10
+ import { Field, FieldDescription, FieldGroup, FieldLabel } from '../../primitives/field.js';
11
+ import Hint from '../../primitives/hint.js';
12
+ import Loading from '../../primitives/loading.js';
13
+ import { Popover, PopoverContent, PopoverTrigger } from '../../primitives/popover.js';
14
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../primitives/select.js';
15
+ import { Textarea } from '../../primitives/textarea.js';
16
+ import { agentLabel, threadMessageText } from '../spaces/space-timeline.js';
17
+ /** The API's cap on a note (`MEMORY_LIMITS.note_chars`). */
18
+ const NOTE_MAX = 1000;
19
+ /** How long the button shows its check after a save. */
20
+ const SAVED_MS = 2000;
21
+ const FAILURE_BY_CODE = {
22
+ secret_detected: 'secret',
23
+ layer_read_only: 'readOnly',
24
+ };
25
+ /**
26
+ * "Remember this" in a thread's hover toolbar: the thread's first prompt,
27
+ * editable, saved as a note in this channel's (or DM's) memory or the
28
+ * Company's, with the thread as its source. Only layers the viewer may write
29
+ * are offered (`can_write`, not `read_only`: an archived channel never is);
30
+ * with none, there is no button. The button shows a check for 2 s after a save.
31
+ */
32
+ export function RememberThisButton({ session, space }) {
33
+ const t = useTranslations('spaces.memory');
34
+ const id = useId();
35
+ const projectId = session.project_id;
36
+ const [open, setOpen] = useState(false);
37
+ const [text, setText] = useState('');
38
+ const [layer, setLayer] = useState('space');
39
+ const [failure, setFailure] = useState(null);
40
+ const [saved, setSaved] = useState(false);
41
+ // Same reads as the Memory tab and the Company page: shared cache entries.
42
+ const spaceLayer = useProjectMemoryLayer(projectId, space.space_id).data;
43
+ const companyLayer = useProjectMemoryLayer(projectId, 'company').data;
44
+ const writable = (data) => !!data && data.can_write && !data.read_only;
45
+ const targets = [...(writable(spaceLayer) ? ['space'] : []), ...(writable(companyLayer) ? ['company'] : [])];
46
+ const toSpace = useAddProjectMemoryNote(projectId, space.space_id);
47
+ const toCompany = useAddProjectMemoryNote(projectId, 'company');
48
+ const add = layer === 'company' ? toCompany : toSpace;
49
+ const place = space.kind === 'channel' ? `#${space.slug}` : t('rememberThis.dm', { agent: agentLabel(space.dm_agent_name ?? '') });
50
+ const label = saved ? t('rememberThis.saved') : t('rememberThis.label');
51
+ useEffect(() => {
52
+ if (!saved)
53
+ return;
54
+ const timer = setTimeout(() => setSaved(false), SAVED_MS);
55
+ return () => clearTimeout(timer);
56
+ }, [saved]);
57
+ const openChange = (next) => {
58
+ if (next) {
59
+ setText(threadMessageText(session).slice(0, NOTE_MAX));
60
+ setLayer(targets[0] ?? 'space');
61
+ setFailure(null);
62
+ }
63
+ setOpen(next);
64
+ };
65
+ const save = () => {
66
+ const note = text.trim();
67
+ if (!note || add.isPending)
68
+ return;
69
+ add.mutate({ text: note, source_session_id: session.session_id }, {
70
+ onSuccess: () => {
71
+ setOpen(false);
72
+ setSaved(true);
73
+ },
74
+ onError: (err) => setFailure((err instanceof ApiError && err.code && FAILURE_BY_CODE[err.code]) || 'failed'),
75
+ });
76
+ };
77
+ if (targets.length === 0)
78
+ return null;
79
+ return (_jsxs(Popover, { open: open, onOpenChange: openChange, children: [_jsx(Hint, { label: label, side: "top", children: _jsx(PopoverTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon-sm", "aria-label": label, children: saved ? _jsx(SolidCheckIcon, { className: "size-3.5 shrink-0" }) : _jsx(SunDimIcon, { className: "size-3.5 shrink-0" }) }) }) }), _jsx(PopoverContent, { align: "end", className: "w-96 p-4", children: _jsxs("form", { className: "flex flex-col gap-4", onSubmit: (event) => {
80
+ event.preventDefault();
81
+ save();
82
+ }, children: [_jsxs(FieldGroup, { className: "gap-4", children: [_jsxs(Field, { className: "gap-1.5", children: [_jsx(FieldLabel, { htmlFor: `${id}-text`, children: t('rememberThis.label') }), _jsx(Textarea, { id: `${id}-text`, value: text, maxLength: NOTE_MAX, minHeight: 80, maxHeight: 240, autoFocus: true, "aria-invalid": failure ? true : undefined, "aria-describedby": `${id}-hint`, onChange: (event) => {
83
+ setText(event.target.value);
84
+ setFailure(null);
85
+ } }), _jsx(FieldDescription, { id: `${id}-hint`, role: failure ? 'alert' : undefined, className: failure ? 'text-destructive' : undefined, children: failure ? t(`remember.status.${failure}`) : t('remember.hint') })] }), _jsxs(Field, { className: "gap-1.5", children: [_jsx(FieldLabel, { htmlFor: `${id}-layer`, children: t('rememberThis.saveTo') }), _jsxs(Select, { value: layer, onValueChange: (value) => {
86
+ setLayer(value);
87
+ setFailure(null);
88
+ }, children: [_jsx(SelectTrigger, { id: `${id}-layer`, className: "w-full cursor-pointer text-sm", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: targets.map((target) => (_jsx(SelectItem, { value: target, className: "cursor-pointer", children: target === 'space' ? place : t('used.company') }, target))) })] })] })] }), _jsxs("div", { className: "flex justify-end gap-2", children: [_jsx(Button, { type: "button", variant: "outline-ghost", size: "sm", onClick: () => setOpen(false), children: t('editor.cancel') }), _jsxs(Button, { type: "submit", size: "sm", disabled: !text.trim() || add.isPending, "aria-busy": add.isPending || undefined, children: [add.isPending ? _jsx(Loading, { className: "size-4 shrink-0" }) : null, t('editor.save')] })] })] }) }), _jsx("span", { id: `${id}-saved`, role: "status", "aria-live": "polite", className: "sr-only", children: saved ? t('rememberThis.saved') : '' })] }));
89
+ }
@@ -0,0 +1,18 @@
1
+ import type { ProjectMemorySource } from '@kortix/sdk';
2
+ /**
3
+ * The page's numbered sources under its text: "1 Launch plan · thread". A
4
+ * thread opens beside the page, an outside source opens its URL in a new
5
+ * tab; the others are text.
6
+ */
7
+ export declare function SourceList({ sources, projectId }: {
8
+ sources: readonly ProjectMemorySource[];
9
+ projectId: string;
10
+ }): import("react").JSX.Element;
11
+ /**
12
+ * A fact's ⟦n⟧ token: a small superscript number. Hover or focus names the
13
+ * source; a thread opens, an outside source opens its URL in a new tab.
14
+ */
15
+ export declare function SourceMark({ source, projectId }: {
16
+ source: ProjectMemorySource;
17
+ projectId: string;
18
+ }): import("react").JSX.Element;
@@ -0,0 +1,79 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { safeHttpUrl } from '../../_vendor/kortix-shared.js';
4
+ import { useTranslations } from '../../i18n/index.js';
5
+ import { uiRoutes } from '../../lib/routes.js';
6
+ import Hint from '../../primitives/hint.js';
7
+ import { UiLink as Link, useUiPathname, useUiSearchParams } from '../../providers/ui-provider.js';
8
+ import { participantLabel } from '../../session/participants/session-participants.js';
9
+ import { superscript } from './body-doc.js';
10
+ /** A source number as superscript digits in the text's colour; the padding widens its hit area without moving the text. */
11
+ const MARK = 'text-foreground hover:text-muted-foreground focus-visible:ring-ring -mx-0.5 -my-1 rounded-sm px-0.5 py-1 outline-none transition-colors duration-fast focus-visible:ring-2';
12
+ /** The API's name for a person without a display name (`apps/api/src/memory/serialize.ts`). */
13
+ const MEMBER_FALLBACK = 'A member';
14
+ /** The hint of a mark that opens nothing: a person, an import, a deleted thread, an outside source without a URL. */
15
+ const STATIC_HINT = { thread: 'threadGone', outside: 'outsideText', person: 'person', import: 'import' };
16
+ /**
17
+ * Where a source thread opens: its channel or DM with `?thread=`. A thread of
18
+ * the page the reader is on opens beside it and keeps the other params (the
19
+ * Memory tab stays open).
20
+ */
21
+ function useSourceThreadHref(projectId) {
22
+ const pathname = useUiPathname();
23
+ const searchParams = useUiSearchParams();
24
+ return (source) => {
25
+ const hint = source.thread_href_hint;
26
+ if (!source.session_id || !hint)
27
+ return null;
28
+ const path = hint.space_kind === 'channel' ? uiRoutes().channel(projectId, hint.slug) : uiRoutes().dm(projectId, hint.agent);
29
+ const here = pathname.endsWith(path);
30
+ const params = new URLSearchParams(here ? searchParams.toString() : '');
31
+ params.set('thread', source.session_id);
32
+ return `${here ? pathname : path}?${params.toString()}`;
33
+ };
34
+ }
35
+ /** A person source's name: the display name, or the API's neutral "A member" in the reader's language. */
36
+ function useSourceName() {
37
+ const t = useTranslations('spaces.memory');
38
+ return (source) => source.kind === 'person'
39
+ ? source.label === MEMBER_FALLBACK
40
+ ? t('author.unknown')
41
+ : participantLabel({ name: source.label, email: null })
42
+ : source.label;
43
+ }
44
+ /**
45
+ * The page's numbered sources under its text: "1 Launch plan · thread". A
46
+ * thread opens beside the page, an outside source opens its URL in a new
47
+ * tab; the others are text.
48
+ */
49
+ export function SourceList({ sources, projectId }) {
50
+ const t = useTranslations('spaces.memory.sourceKind');
51
+ const threadHref = useSourceThreadHref(projectId);
52
+ const name = useSourceName();
53
+ return (_jsx("ol", { className: "flex flex-col gap-2 pt-8", children: sources.map((source) => {
54
+ const text = `${name(source)} · ${t(source.kind)}`;
55
+ const href = threadHref(source);
56
+ const LINE = 'text-muted-foreground min-w-0 text-xs [overflow-wrap:anywhere]';
57
+ return (_jsxs("li", { className: "flex gap-2", children: [_jsx("span", { className: "text-muted-foreground w-3 shrink-0 text-xs tabular-nums", children: source.number }), href ? (_jsx(Link, { href: href, className: `${LINE} hover:text-foreground transition-colors duration-fast`, children: text })) : source.kind === 'outside' && source.url && safeHttpUrl(source.url) ? (_jsx("a", { href: source.url, target: "_blank", rel: "noopener noreferrer", className: `${LINE} hover:text-foreground transition-colors duration-fast`, children: text })) : (_jsx("span", { className: LINE, children: text }))] }, source.number));
58
+ }) }));
59
+ }
60
+ /**
61
+ * A fact's ⟦n⟧ token: a small superscript number. Hover or focus names the
62
+ * source; a thread opens, an outside source opens its URL in a new tab.
63
+ */
64
+ export function SourceMark({ source, projectId }) {
65
+ const t = useTranslations('spaces.memory');
66
+ const threadHref = useSourceThreadHref(projectId)(source);
67
+ const text = useSourceName()(source);
68
+ const number = superscript(source.number);
69
+ if (threadHref) {
70
+ const label = source.kind === 'person' ? t('source.person', { label: text }) : t('source.thread', { label: source.label });
71
+ return (_jsx(Hint, { side: "top", label: label, children: _jsx(Link, { href: threadHref, "aria-label": label, className: MARK, children: number }) }));
72
+ }
73
+ if (source.kind === 'outside' && source.url && safeHttpUrl(source.url)) {
74
+ const label = t('source.outside', { label: source.label });
75
+ return (_jsx(Hint, { side: "top", label: label, children: _jsx("a", { href: source.url, target: "_blank", rel: "noopener noreferrer", "aria-label": label, className: MARK, children: number }) }));
76
+ }
77
+ const label = t(`source.${STATIC_HINT[source.kind]}`, { label: text });
78
+ return (_jsx(Hint, { side: "top", label: label, children: _jsx("span", { tabIndex: 0, "aria-label": label, className: MARK, children: number }) }));
79
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * "Used #marketing memory · 3 pages ›" under a thread's first prompt: the
3
+ * pages its agent was given at the first turn. It reads the record only once
4
+ * `ready` (a turn has finished): before that the record is empty, and nothing
5
+ * polls it. A turn that ends while the record is still empty reads it again.
6
+ * Hidden when the thread loaded no page.
7
+ */
8
+ export declare function UsedMemoryChip({ projectId, sessionId, ready, className, }: {
9
+ projectId: string;
10
+ sessionId: string;
11
+ /** A turn of the thread has finished. */
12
+ ready: boolean;
13
+ className?: string;
14
+ }): import("react").JSX.Element | null;