@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
@@ -12,6 +12,8 @@ export declare function ensureFrame(key: string, url: string, attributes: {
12
12
  title: string;
13
13
  sandbox: string;
14
14
  allow: string;
15
+ testid?: string;
16
+ referrerPolicy?: ReferrerPolicy;
15
17
  }): void;
16
18
  /** Show the frame in `slot`. Returns the release: the frame goes back to the previous claim. */
17
19
  export declare function claimFrame(key: string, slot: HTMLElement, placement: FramePlacement): () => void;
@@ -19,8 +21,11 @@ export declare function claimFrame(key: string, slot: HTMLElement, placement: Fr
19
21
  export declare function restyleFrame(key: string, slot: HTMLElement, placement: FramePlacement): void;
20
22
  /** Load the App again from `url` (a fresh access session). */
21
23
  export declare function reloadFrame(key: string, url: string): void;
22
- /** Drop every frame whose key is not in `keep` (a new release, a deleted App, another project). */
23
- export declare function pruneFrames(keep: Set<string>): void;
24
+ /**
25
+ * Drop every frame whose key is not in `keep` (a new release, a deleted App,
26
+ * another project). `owns` limits the sweep to one kind of frame.
27
+ */
28
+ export declare function pruneFrames(keep: Set<string>, owns?: (key: string) => boolean): void;
24
29
  /** The frame's load status, or null before it exists. */
25
30
  export declare function frameStatus(key: string): FrameStatus | null;
26
31
  export declare function useFrameStatus(key: string): FrameStatus | null;
@@ -1,6 +1,7 @@
1
1
  'use client';
2
2
  /**
3
- * One live frame per App preview, kept for as long as the project is open.
3
+ * One live frame per App preview (and per artifact page), kept for as long as
4
+ * the project is open.
4
5
  *
5
6
  * A card thumbnail and the big view used to each own an `<iframe>`, so every
6
7
  * page switch and every open loaded the App again. Here a frame is created
@@ -76,7 +77,9 @@ export function ensureFrame(key, url, attributes) {
76
77
  frame.title = attributes.title;
77
78
  frame.setAttribute('sandbox', attributes.sandbox);
78
79
  frame.allow = attributes.allow;
79
- frame.dataset.testid = 'app-live-preview';
80
+ frame.dataset.testid = attributes.testid ?? 'app-live-preview';
81
+ if (attributes.referrerPolicy)
82
+ frame.referrerPolicy = attributes.referrerPolicy;
80
83
  frame.dataset.frameKey = key;
81
84
  const entry = { frame, status: 'loading', claims: [] };
82
85
  frame.addEventListener('load', () => {
@@ -127,11 +130,14 @@ export function reloadFrame(key, url) {
127
130
  entry.frame.src = url;
128
131
  notify();
129
132
  }
130
- /** Drop every frame whose key is not in `keep` (a new release, a deleted App, another project). */
131
- export function pruneFrames(keep) {
133
+ /**
134
+ * Drop every frame whose key is not in `keep` (a new release, a deleted App,
135
+ * another project). `owns` limits the sweep to one kind of frame.
136
+ */
137
+ export function pruneFrames(keep, owns = () => true) {
132
138
  let changed = false;
133
139
  for (const [key, entry] of entries) {
134
- if (keep.has(key) || entry.claims.length > 0)
140
+ if (!owns(key) || keep.has(key) || entry.claims.length > 0)
135
141
  continue;
136
142
  entry.frame.remove();
137
143
  entries.delete(key);
@@ -1,5 +1,5 @@
1
1
  import type { UiTranslator } from '../i18n/index.js';
2
- import { type App, type AppAccessMode, type AppCapability, type AppDeployment, type AppViewerTokenScope } from '@kortix/sdk';
2
+ import { type App, type AppAccessMode, type AppCapability, type AppDeployment, type AppViewerTokenScope, type ProjectTrigger } from '@kortix/sdk';
3
3
  type DeploymentTone = 'success' | 'destructive' | 'warning' | 'muted';
4
4
  /**
5
5
  * Every deployment status, in words a person who did not build this can read.
@@ -65,31 +65,39 @@ export declare function appStatus(app: App, tI18nComplete: UiTranslator): {
65
65
  label: string;
66
66
  dot: string;
67
67
  };
68
+ export { appAdminsOnly, gridApps } from '../_vendor/shared/app-config.js';
69
+ /** The Apps of the project that are neither a card nor a tab: the ones the page counts as hidden. */
70
+ export declare function hiddenApps(apps: App[], canAdmin?: boolean): App[];
68
71
  /**
69
- * Does this App offer `capability`? The ONE way the Apps UI branches between
70
- * Apps: the server lists what each App supports (`app.capabilities`), and a
71
- * control shows only for the Apps that support it.
72
+ * How an App is wired into the project's triggers: the ones that call it
73
+ * (`run: { app }`) and the ones its own events start (`on: { event, app }`).
72
74
  */
73
- /**
74
- * The Apps the grid shows as cards (`display`): not `listed: false`, and not a
75
- * tab of a parent that exists. A tab whose parent is gone stays reachable as a card.
76
- */
77
- export declare function gridApps(apps: App[], canAdmin?: boolean): App[];
75
+ export declare function appTriggers(app: App, triggers: ProjectTrigger[]): {
76
+ calledBy: ProjectTrigger[];
77
+ startsOn: ProjectTrigger[];
78
+ };
79
+ /** The one-line state of the Background list: how many Apps are up, asleep, not deployed, external. */
80
+ export declare function backgroundSummary(apps: App[]): {
81
+ running: number;
82
+ asleep: number;
83
+ undeployed: number;
84
+ external: number;
85
+ };
78
86
  /** The Apps `app`'s detail shows as tabs (their `display.parent` is its slug). */
79
87
  export declare function childApps(apps: App[], app: App, canAdmin?: boolean): App[];
80
- /**
81
- * Its primary service is `access: admins` (a backend's admin dashboard): only
82
- * project admins can open it, so nobody else is shown a card or tab for it.
83
- */
84
88
  /**
85
89
  * The App whose live preview a card shows: the App itself, or, when it hides
86
90
  * its own (`display.preview: none`), its first tab the viewer may open (a
87
91
  * backend's dashboard). Null: the card shows an icon.
88
92
  */
89
93
  export declare function cardPreviewApp(apps: App[], app: App, canAdmin?: boolean): App | null;
90
- export declare function appAdminsOnly(app: App): boolean;
91
94
  /** A tab's label: the App's name without its parent's slug ("crm-data-dashboard" → "Dashboard"). */
92
95
  export declare function appTabLabel(child: App, parent: App): string;
96
+ /**
97
+ * Does this App offer `capability`? The ONE way the Apps UI branches between
98
+ * Apps: the server lists what each App supports (`app.capabilities`), and a
99
+ * control shows only for the Apps that support it.
100
+ */
93
101
  export declare function appCan(app: App, capability: AppCapability): boolean;
94
102
  /** "2 vCPU · 4 GB · 20 GB": the machine size of an App. */
95
103
  export declare function appSizeLabel(app: App, t: UiTranslator): string;
@@ -151,4 +159,3 @@ export declare function localizedAppCopy(tI18nComplete: UiTranslator): {
151
159
  desc: string;
152
160
  }>;
153
161
  };
154
- export {};
@@ -3,6 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { CopyButton } from '../markdown/copy-button.js';
4
4
  import { localizeUiCatalog, translateUiCatalogText } from '../i18n/ui-catalog/localize-ui-catalog.js';
5
5
  import { PRODUCT_CATALOG_TRANSLATION_KEYS } from '../i18n/ui-catalog/product-catalog-translation-keys.generated.js';
6
+ import { appAdminsOnly } from '../_vendor/kortix-shared.js';
6
7
  import { cn } from '../lib/utils.js';
7
8
  import { stripTrailingSlashes } from '@kortix/sdk';
8
9
  /**
@@ -50,7 +51,7 @@ export function deployNotice(latest, tI18nComplete) {
50
51
  return { label: tI18nComplete.raw('text0b5260e1b405'), tone: 'warning' };
51
52
  }
52
53
  export function appCommand(app) {
53
- return `kortix apps deploy . --app ${app.app_id}`;
54
+ return `kortix apps deploy . --app ${app.slug}`;
54
55
  }
55
56
  /**
56
57
  * The hostname a person reads an App by.
@@ -93,29 +94,44 @@ export function appStatus(app, tI18nComplete) {
93
94
  dot: live ? 'bg-kortix-green' : deployed ? 'bg-muted-foreground/50' : 'bg-muted-foreground/25',
94
95
  };
95
96
  }
96
- /**
97
- * Does this App offer `capability`? The ONE way the Apps UI branches between
98
- * Apps: the server lists what each App supports (`app.capabilities`), and a
99
- * control shows only for the Apps that support it.
100
- */
101
- /**
102
- * The Apps the grid shows as cards (`display`): not `listed: false`, and not a
103
- * tab of a parent that exists. A tab whose parent is gone stays reachable as a card.
104
- */
105
- export function gridApps(apps, canAdmin = true) {
97
+ // The grid rule is shared with the API's channel Apps count (`@kortix/shared/app-config`).
98
+ export { appAdminsOnly, gridApps } from '../_vendor/kortix-shared.js';
99
+ /** The Apps of the project that are neither a card nor a tab: the ones the page counts as hidden. */
100
+ export function hiddenApps(apps, canAdmin = true) {
106
101
  const slugs = new Set(apps.map((app) => app.slug));
107
- return apps.filter((app) => app.display?.listed !== false
102
+ return apps.filter((app) => app.display?.listed !== true
108
103
  && !(app.display?.parent && slugs.has(app.display.parent))
109
104
  && (canAdmin || !appAdminsOnly(app)));
110
105
  }
106
+ /**
107
+ * How an App is wired into the project's triggers: the ones that call it
108
+ * (`run: { app }`) and the ones its own events start (`on: { event, app }`).
109
+ */
110
+ export function appTriggers(app, triggers) {
111
+ return {
112
+ calledBy: triggers.filter((row) => row.target?.app === app.slug),
113
+ startsOn: triggers.filter((row) => row.type === 'app' && row.app === app.slug),
114
+ };
115
+ }
116
+ /** The one-line state of the Background list: how many Apps are up, asleep, not deployed, external. */
117
+ export function backgroundSummary(apps) {
118
+ const out = { running: 0, asleep: 0, undeployed: 0, external: 0 };
119
+ for (const row of apps) {
120
+ if (row.external_url)
121
+ out.external += 1;
122
+ else if (!row.active_deployment_id)
123
+ out.undeployed += 1;
124
+ else if (row.desired_state === 'running' || row.hosting_type === 'static')
125
+ out.running += 1;
126
+ else
127
+ out.asleep += 1;
128
+ }
129
+ return out;
130
+ }
111
131
  /** The Apps `app`'s detail shows as tabs (their `display.parent` is its slug). */
112
132
  export function childApps(apps, app, canAdmin = true) {
113
133
  return apps.filter((row) => row.display?.parent === app.slug && (canAdmin || !appAdminsOnly(row)));
114
134
  }
115
- /**
116
- * Its primary service is `access: admins` (a backend's admin dashboard): only
117
- * project admins can open it, so nobody else is shown a card or tab for it.
118
- */
119
135
  /**
120
136
  * The App whose live preview a card shows: the App itself, or, when it hides
121
137
  * its own (`display.preview: none`), its first tab the viewer may open (a
@@ -127,14 +143,16 @@ export function cardPreviewApp(apps, app, canAdmin = true) {
127
143
  const first = childApps(apps, app, canAdmin)[0];
128
144
  return first && appCan(first, 'preview') && first.viewer_can_access !== false ? first : null;
129
145
  }
130
- export function appAdminsOnly(app) {
131
- return app.services?.find((service) => service.name === 'http')?.access === 'admins';
132
- }
133
146
  /** A tab's label: the App's name without its parent's slug ("crm-data-dashboard" → "Dashboard"). */
134
147
  export function appTabLabel(child, parent) {
135
148
  const name = child.name.startsWith(`${parent.slug}-`) ? child.name.slice(parent.slug.length + 1) : child.name;
136
149
  return name.charAt(0).toUpperCase() + name.slice(1);
137
150
  }
151
+ /**
152
+ * Does this App offer `capability`? The ONE way the Apps UI branches between
153
+ * Apps: the server lists what each App supports (`app.capabilities`), and a
154
+ * control shows only for the Apps that support it.
155
+ */
138
156
  export function appCan(app, capability) {
139
157
  return app.capabilities?.includes(capability) ?? false;
140
158
  }
@@ -2,6 +2,6 @@
2
2
  * @kortix/ui/apps — Live App frames, the frame pool and the App view model.
3
3
  */
4
4
  export { AppPreview, AppPreviewOverlay, PREVIEW_SPINNER_DELAY_MS, PREVIEW_TILE_ASPECT, PREVIEW_VIEWPORT_HEIGHT, PREVIEW_VIEWPORT_WIDTH, framePlacement, previewScale, scheduleSlowPreview, } from './app-preview.js';
5
- export { ensureFrame, frameKey, framesKeepAlive, pruneFrames, reloadFrame, } from './app-preview-pool.js';
6
- export { ANONYMOUS_MODES, DEPLOYMENT_COPY, appCan, appCommand, appHost, appStatus, appTabLabel, cardPreviewApp, childApps, deployNotice, gridApps, localizedAppCopy, } from './app-shared.js';
5
+ export { claimFrame, ensureFrame, frameKey, framesKeepAlive, pruneFrames, reloadFrame, restyleFrame, useFrameStatus, type FramePlacement, } from './app-preview-pool.js';
6
+ export { ANONYMOUS_MODES, DEPLOYMENT_COPY, appCan, appCommand, appHost, appSizeLabel, DeployCommand, appStatus, appTabLabel, cardPreviewApp, childApps, deployNotice, gridApps, hiddenApps, appTriggers, backgroundSummary, localizedAppCopy, } from './app-shared.js';
7
7
  export { isKortixAppUrl } from './kortix-app-url.js';
@@ -2,6 +2,6 @@
2
2
  * @kortix/ui/apps — Live App frames, the frame pool and the App view model.
3
3
  */
4
4
  export { AppPreview, AppPreviewOverlay, PREVIEW_SPINNER_DELAY_MS, PREVIEW_TILE_ASPECT, PREVIEW_VIEWPORT_HEIGHT, PREVIEW_VIEWPORT_WIDTH, framePlacement, previewScale, scheduleSlowPreview, } from './app-preview.js';
5
- export { ensureFrame, frameKey, framesKeepAlive, pruneFrames, reloadFrame, } from './app-preview-pool.js';
6
- export { ANONYMOUS_MODES, DEPLOYMENT_COPY, appCan, appCommand, appHost, appStatus, appTabLabel, cardPreviewApp, childApps, deployNotice, gridApps, localizedAppCopy, } from './app-shared.js';
5
+ export { claimFrame, ensureFrame, frameKey, framesKeepAlive, pruneFrames, reloadFrame, restyleFrame, useFrameStatus, } from './app-preview-pool.js';
6
+ export { ANONYMOUS_MODES, DEPLOYMENT_COPY, appCan, appCommand, appHost, appSizeLabel, DeployCommand, appStatus, appTabLabel, cardPreviewApp, childApps, deployNotice, gridApps, hiddenApps, appTriggers, backgroundSummary, localizedAppCopy, } from './app-shared.js';
7
7
  export { isKortixAppUrl } from './kortix-app-url.js';
@@ -0,0 +1,16 @@
1
+ /**
2
+ * An artifact page. The frame lives in the project's frame pool
3
+ * (`@kortix/ui/apps`, shared with App previews): it loads once, in the
4
+ * background or on first show, and moves between the gallery card and the
5
+ * viewer without reloading. `frameKey` changes after a save, so an edit loads
6
+ * the new page. The ref is the slot (the viewer's full screen target).
7
+ */
8
+ export declare const ArtifactFrame: import("react").ForwardRefExoticComponent<{
9
+ frameKey: string;
10
+ src: string;
11
+ title: string;
12
+ className?: string;
13
+ preview?: boolean;
14
+ } & import("react").RefAttributes<HTMLDivElement>>;
15
+ /** Create (and park) the pooled frame for an artifact page; a no-op when it exists. */
16
+ export declare function ensureArtifactFrame(key: string, src: string, title: string): void;
@@ -0,0 +1,51 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { forwardRef, useLayoutEffect, useState } from 'react';
4
+ import { claimFrame, ensureFrame } from '../apps/app-preview-pool.js';
5
+ import { ARTIFACT_FRAME_ALLOW, ARTIFACT_IFRAME_SANDBOX } from './frame-policy.js';
6
+ /**
7
+ * The frame's canvas: a third-party page with no background of its own reads
8
+ * as a white page, as it would in a browser tab, in both themes.
9
+ */
10
+ const ARTIFACT_CANVAS = 'bg-white';
11
+ /**
12
+ * An artifact page. The frame lives in the project's frame pool
13
+ * (`@kortix/ui/apps`, shared with App previews): it loads once, in the
14
+ * background or on first show, and moves between the gallery card and the
15
+ * viewer without reloading. `frameKey` changes after a save, so an edit loads
16
+ * the new page. The ref is the slot (the viewer's full screen target).
17
+ */
18
+ export const ArtifactFrame = forwardRef(function ArtifactFrame({ frameKey, src, title, className, preview }, ref) {
19
+ const [slot, setSlot] = useState(null);
20
+ const interactive = !preview;
21
+ const frameClass = `${className ?? ''} ${ARTIFACT_CANVAS}`;
22
+ useLayoutEffect(() => {
23
+ if (!slot)
24
+ return;
25
+ ensureArtifactFrame(frameKey, src, title);
26
+ const release = claimFrame(frameKey, slot, { className: frameClass, style: {}, interactive });
27
+ // The viewer hands the keyboard to the page, so a deck's arrow keys work at once.
28
+ if (interactive)
29
+ slot.querySelector('iframe')?.focus({ preventScroll: true });
30
+ return release;
31
+ // The URL is read once per key: a refetch must not reload the page.
32
+ // eslint-disable-next-line react-hooks/exhaustive-deps
33
+ }, [frameKey, slot, interactive, frameClass]);
34
+ return (_jsx("div", { ref: (node) => {
35
+ setSlot(node);
36
+ if (typeof ref === 'function')
37
+ ref(node);
38
+ else if (ref)
39
+ ref.current = node;
40
+ }, className: "absolute inset-0" }));
41
+ });
42
+ /** Create (and park) the pooled frame for an artifact page; a no-op when it exists. */
43
+ export function ensureArtifactFrame(key, src, title) {
44
+ ensureFrame(key, src, {
45
+ title,
46
+ sandbox: ARTIFACT_IFRAME_SANDBOX,
47
+ allow: ARTIFACT_FRAME_ALLOW,
48
+ testid: 'artifact-frame',
49
+ referrerPolicy: 'no-referrer',
50
+ });
51
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * An artifact in a chat: what the agent `show`ed when it handed one over. A
3
+ * live preview, its title and type. It is a link: on a session page the web
4
+ * app's link interceptor opens it in the session panel, like a Kortix App. A link
5
+ * the viewer cannot open (no access, flag off) renders `fallback` instead.
6
+ */
7
+ export declare function ShowArtifactCard({ url, fallback }: {
8
+ url: string;
9
+ fallback: React.ReactNode;
10
+ }): import("react").JSX.Element;
11
+ /**
12
+ * An artifact in the session panel: the page itself (a doc read as its page),
13
+ * with its title, a way to the full viewer (where a doc is edited) and close.
14
+ */
15
+ export declare function ArtifactPanelPreview({ url, onClose }: {
16
+ url: string;
17
+ onClose: () => void;
18
+ }): import("react").JSX.Element;
@@ -0,0 +1,101 @@
1
+ 'use client';
2
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { getPublicArtifact } from '@kortix/sdk';
4
+ import { useArtifact } from '@kortix/sdk/react';
5
+ import { ArrowSquareOut, BrowserIcon, FileTextIcon, X } from '@phosphor-icons/react';
6
+ import { useEffect, useState } from 'react';
7
+ import { useLocalizedUiCatalog } from '../i18n/ui-catalog/use-localized-ui-catalog.js';
8
+ import { Button } from '../primitives/button.js';
9
+ import Hint from '../primitives/hint.js';
10
+ import { useUiComponents, useUiRouter } from '../providers/ui-provider.js';
11
+ import { ArtifactFrame } from './artifact-frame.js';
12
+ import { artifactFrameKey, parseArtifactUrl } from './frame-policy.js';
13
+ const COPY = {
14
+ open: 'Open',
15
+ openArtifact: 'Open in Artifacts',
16
+ close: 'Close',
17
+ doc: 'Doc',
18
+ page: 'Page',
19
+ unavailable: 'This artifact is not available to you.',
20
+ };
21
+ const TYPE_ICON = { doc: FileTextIcon, html: BrowserIcon };
22
+ /** The artifact a URL names, as the caller may see it: a project artifact, or a public one. */
23
+ function useShownArtifact(url) {
24
+ const ref = parseArtifactUrl(url);
25
+ const inProject = useArtifact(ref?.projectId ?? null, ref?.projectId ? ref.artifactId : null);
26
+ const [shared, setShared] = useState({ artifact: null, failed: false });
27
+ const publicId = ref && !ref.projectId ? ref.artifactId : null;
28
+ useEffect(() => {
29
+ if (!publicId)
30
+ return;
31
+ let live = true;
32
+ getPublicArtifact(publicId)
33
+ .then((a) => {
34
+ if (!live)
35
+ return;
36
+ if (!a)
37
+ return setShared({ artifact: null, failed: true });
38
+ setShared({
39
+ artifact: { title: a.title, type: a.type, src: a.content_url, frameKey: `artifact:${a.artifact_id}:${a.updated_at}`, href: null },
40
+ failed: false,
41
+ });
42
+ })
43
+ .catch(() => live && setShared({ artifact: null, failed: true }));
44
+ return () => {
45
+ live = false;
46
+ };
47
+ }, [publicId]);
48
+ if (!ref)
49
+ return { artifact: null, failed: true };
50
+ if (publicId)
51
+ return shared;
52
+ const detail = inProject.data;
53
+ if (!detail)
54
+ return { artifact: null, failed: inProject.isError };
55
+ return {
56
+ artifact: {
57
+ title: detail.title,
58
+ type: detail.type,
59
+ src: detail.version.view_url,
60
+ frameKey: artifactFrameKey(detail),
61
+ href: `/projects/${detail.project_id}/artifacts/${detail.artifact_id}`,
62
+ },
63
+ failed: false,
64
+ };
65
+ }
66
+ /**
67
+ * An artifact in a chat: what the agent `show`ed when it handed one over. A
68
+ * live preview, its title and type. It is a link: on a session page the web
69
+ * app's link interceptor opens it in the session panel, like a Kortix App. A link
70
+ * the viewer cannot open (no access, flag off) renders `fallback` instead.
71
+ */
72
+ export function ShowArtifactCard({ url, fallback }) {
73
+ const copy = useLocalizedUiCatalog(COPY);
74
+ const { artifact, failed } = useShownArtifact(url);
75
+ if (failed)
76
+ return _jsx(_Fragment, { children: fallback });
77
+ const Icon = artifact ? TYPE_ICON[artifact.type] : FileTextIcon;
78
+ return (_jsxs("a", { href: url, target: "_blank", rel: "noopener noreferrer", "data-testid": "show-artifact-card", className: "group border-border bg-card hover:border-foreground/20 flex w-full max-w-xl flex-col overflow-hidden rounded-lg border text-left transition-colors", children: [_jsx("span", { className: "bg-muted relative block aspect-[16/9] w-full overflow-hidden border-b", children: artifact ? (_jsx(ArtifactFrame, { preview: true,
79
+ // Its own frame: the chat card keeps its preview while the panel shows the artifact.
80
+ frameKey: `${artifact.frameKey}:chat`, src: artifact.src, title: artifact.title, className: "pointer-events-none absolute top-0 left-0 h-[400%] w-[400%] origin-top-left scale-25 border-0" })) : null }), _jsxs("span", { className: "flex items-center gap-3 p-3", children: [_jsx("span", { className: "bg-muted flex size-8 shrink-0 items-center justify-center rounded-md", children: _jsx(Icon, { className: "text-muted-foreground size-4" }) }), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsx("span", { className: "text-foreground block truncate text-sm font-medium", children: artifact?.title ?? ' ' }), _jsx("span", { className: "text-muted-foreground block text-xs", children: artifact ? (artifact.type === 'doc' ? copy.doc : copy.page) : ' ' })] }), _jsx("span", { className: "text-muted-foreground group-hover:text-foreground shrink-0 text-xs font-medium transition-colors", children: copy.open })] })] }));
81
+ }
82
+ /**
83
+ * An artifact in the session panel: the page itself (a doc read as its page),
84
+ * with its title, a way to the full viewer (where a doc is edited) and close.
85
+ */
86
+ export function ArtifactPanelPreview({ url, onClose }) {
87
+ // The host's full viewer (apps/web: the Artifacts viewer) for a project artifact.
88
+ const { ArtifactViewer } = useUiComponents();
89
+ const ref = parseArtifactUrl(url);
90
+ if (ArtifactViewer && ref?.projectId)
91
+ return _jsx(ArtifactViewer, { projectId: ref.projectId, artifactId: ref.artifactId, onClose: onClose });
92
+ return _jsx(ArtifactPagePreview, { url: url, onClose: onClose });
93
+ }
94
+ /** A public artifact, or a host without the viewer: the page itself, read-only. */
95
+ function ArtifactPagePreview({ url, onClose }) {
96
+ const copy = useLocalizedUiCatalog(COPY);
97
+ const router = useUiRouter();
98
+ const { artifact, failed } = useShownArtifact(url);
99
+ const Icon = artifact ? TYPE_ICON[artifact.type] : FileTextIcon;
100
+ return (_jsxs("div", { className: "flex h-full min-h-0 flex-col", children: [_jsxs("div", { className: "flex h-10 shrink-0 items-center gap-2 border-b pr-1 pl-3", children: [_jsx(Icon, { className: "text-muted-foreground size-4 shrink-0", "aria-hidden": true }), _jsx("span", { className: "text-foreground min-w-0 flex-1 truncate text-sm font-medium", children: artifact?.title ?? '' }), artifact?.href ? (_jsx(Hint, { label: copy.openArtifact, side: "bottom", children: _jsx(Button, { size: "icon-sm", variant: "ghost", "aria-label": copy.openArtifact, onClick: () => router.push(artifact.href), children: _jsx(ArrowSquareOut, { className: "size-3.5" }) }) })) : null, _jsx(Hint, { label: copy.close, side: "bottom", children: _jsx(Button, { size: "icon-sm", variant: "ghost", "aria-label": copy.close, onClick: onClose, children: _jsx(X, { className: "size-3.5" }) }) })] }), _jsx("div", { className: "bg-muted relative min-h-0 flex-1", children: artifact ? (_jsx(ArtifactFrame, { frameKey: artifact.frameKey, src: artifact.src, title: artifact.title, className: "absolute inset-0 size-full border-0" })) : failed ? (_jsx("p", { className: "text-muted-foreground p-6 text-sm", children: copy.unavailable })) : null })] }));
101
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * The iframe sandbox. It allows same-origin; the content server's CSP sandbox
3
+ * decides: an opaque origin on the API host, the page's own origin on the
4
+ * dedicated content host (ARTIFACT_CONTENT_URL), where embedded players work.
5
+ */
6
+ export declare const ARTIFACT_IFRAME_SANDBOX = "allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox allow-modals allow-downloads";
7
+ /** Features an embedded player in the page may use. */
8
+ export declare const ARTIFACT_FRAME_ALLOW = "fullscreen; clipboard-write; autoplay; encrypted-media; picture-in-picture";
9
+ /** Artifact frames share the Apps frame pool (`@kortix/ui/apps`); their keys start with this. */
10
+ export declare const ARTIFACT_FRAME_PREFIX = "artifact:";
11
+ /** One pooled frame per artifact state: a save (`updated_at`) or an old version gets its own. */
12
+ export declare function artifactFrameKey(artifact: {
13
+ artifact_id: string;
14
+ updated_at: string;
15
+ }, version?: string | null): string;
16
+ /**
17
+ * Print a doc to PDF without leaving the page: its print view (`?print=1`)
18
+ * loads in a hidden frame and opens the print dialog for that frame alone. The
19
+ * page posts `artifact-printed` after the dialog closes; the frame then goes.
20
+ */
21
+ export declare function printArtifact(viewUrl: string): void;
22
+ /**
23
+ * The artifact an app link names: `/projects/<project>/artifacts/<artifact>`
24
+ * (the app viewer, on any Kortix host) or `/share/artifact/<artifact>` (a
25
+ * public link, no project). Null for any other URL.
26
+ */
27
+ export declare function parseArtifactUrl(url: string): {
28
+ projectId: string | null;
29
+ artifactId: string;
30
+ } | null;
@@ -0,0 +1,61 @@
1
+ /**
2
+ * The iframe sandbox. It allows same-origin; the content server's CSP sandbox
3
+ * decides: an opaque origin on the API host, the page's own origin on the
4
+ * dedicated content host (ARTIFACT_CONTENT_URL), where embedded players work.
5
+ */
6
+ export const ARTIFACT_IFRAME_SANDBOX = 'allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox allow-modals allow-downloads';
7
+ /** Features an embedded player in the page may use. */
8
+ export const ARTIFACT_FRAME_ALLOW = 'fullscreen; clipboard-write; autoplay; encrypted-media; picture-in-picture';
9
+ /** Artifact frames share the Apps frame pool (`@kortix/ui/apps`); their keys start with this. */
10
+ export const ARTIFACT_FRAME_PREFIX = 'artifact:';
11
+ /** One pooled frame per artifact state: a save (`updated_at`) or an old version gets its own. */
12
+ export function artifactFrameKey(artifact, version) {
13
+ return `${ARTIFACT_FRAME_PREFIX}${artifact.artifact_id}:${version ?? artifact.updated_at}`;
14
+ }
15
+ /**
16
+ * Print a doc to PDF without leaving the page: its print view (`?print=1`)
17
+ * loads in a hidden frame and opens the print dialog for that frame alone. The
18
+ * page posts `artifact-printed` after the dialog closes; the frame then goes.
19
+ */
20
+ export function printArtifact(viewUrl) {
21
+ const frame = document.createElement('iframe');
22
+ frame.setAttribute('sandbox', ARTIFACT_IFRAME_SANDBOX);
23
+ frame.setAttribute('aria-hidden', 'true');
24
+ frame.tabIndex = -1;
25
+ frame.style.cssText = 'position:fixed;right:0;bottom:0;width:1px;height:1px;border:0;opacity:0;pointer-events:none';
26
+ const cleanup = () => {
27
+ window.removeEventListener('message', onMessage);
28
+ frame.remove();
29
+ };
30
+ const onMessage = (event) => {
31
+ if (event.source === frame.contentWindow && event.data?.kortix === 'artifact-printed')
32
+ cleanup();
33
+ };
34
+ window.addEventListener('message', onMessage);
35
+ // A dialog left open past this still prints; the frame is only cleanup.
36
+ window.setTimeout(cleanup, 10 * 60_000);
37
+ frame.src = `${viewUrl}?print=1`;
38
+ document.body.appendChild(frame);
39
+ }
40
+ const UUID = '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}';
41
+ const IN_PROJECT = new RegExp(`/projects/(${UUID})/artifacts/(${UUID})/?$`, 'i');
42
+ const PUBLIC = new RegExp(`/share/artifact/(${UUID})/?$`, 'i');
43
+ /**
44
+ * The artifact an app link names: `/projects/<project>/artifacts/<artifact>`
45
+ * (the app viewer, on any Kortix host) or `/share/artifact/<artifact>` (a
46
+ * public link, no project). Null for any other URL.
47
+ */
48
+ export function parseArtifactUrl(url) {
49
+ let path;
50
+ try {
51
+ path = new URL(url, 'http://localhost').pathname;
52
+ }
53
+ catch {
54
+ return null;
55
+ }
56
+ const inProject = IN_PROJECT.exec(path);
57
+ if (inProject)
58
+ return { projectId: inProject[1].toLowerCase(), artifactId: inProject[2].toLowerCase() };
59
+ const shared = PUBLIC.exec(path);
60
+ return shared ? { projectId: null, artifactId: shared[1].toLowerCase() } : null;
61
+ }
@@ -0,0 +1,3 @@
1
+ export { ARTIFACT_FRAME_ALLOW, ARTIFACT_FRAME_PREFIX, ARTIFACT_IFRAME_SANDBOX, artifactFrameKey, parseArtifactUrl, printArtifact, } from './frame-policy.js';
2
+ export { ArtifactFrame, ensureArtifactFrame } from './artifact-frame.js';
3
+ export { ArtifactPanelPreview, ShowArtifactCard } from './artifact-session.js';
@@ -0,0 +1,5 @@
1
+ // Kortix Artifacts in any host: the frame policy and link parsing (server-safe),
2
+ // the pooled page frame, and the session views (chat card, panel preview).
3
+ export { ARTIFACT_FRAME_ALLOW, ARTIFACT_FRAME_PREFIX, ARTIFACT_IFRAME_SANDBOX, artifactFrameKey, parseArtifactUrl, printArtifact, } from './frame-policy.js';
4
+ export { ArtifactFrame, ensureArtifactFrame } from './artifact-frame.js';
5
+ export { ArtifactPanelPreview, ShowArtifactCard } from './artifact-session.js';
@@ -27,7 +27,7 @@ export declare function parseAddressInput(value: string): string | null;
27
27
  * controls around it (`BrowserPanel`'s overflow menu, `AppPreview`'s viewer
28
28
  * actions and close) — the component is a fragment, so it slots between them.
29
29
  */
30
- export declare function SandboxAddressBar({ displayValue, hasPreview, isLoading, canGoBack, canGoForward, onBack, onForward, onReload, onHome, onNavigate, suggestions, placeholder, ariaLabel, inputRef, resetOnEscape, trailing, }: {
30
+ export declare function SandboxAddressBar({ displayValue, hasPreview, isLoading, canGoBack, canGoForward, onBack, onForward, onReload, onHome, onNavigate, suggestions, placeholder, ariaLabel, inputRef, resetOnEscape, trailing, disabled, }: {
31
31
  /** The URL the bar shows at rest — the surface's current address. */
32
32
  displayValue: string;
33
33
  hasPreview: boolean;
@@ -58,6 +58,9 @@ export declare function SandboxAddressBar({ displayValue, hasPreview, isLoading,
58
58
  /** Actions on the open page, rendered at the address's trailing edge —
59
59
  * `AppPreview` puts `Copy link` here. */
60
60
  trailing?: ReactNode;
61
+ /** The address takes no input (the session's computer is booting). Pair it
62
+ * with `hasPreview={false}`, which disables the buttons. */
63
+ disabled?: boolean;
61
64
  }): import("react").JSX.Element;
62
65
  /**
63
66
  * The "still loading" overlay both preview surfaces paint over the iframe.
@@ -89,7 +89,7 @@ const NO_SUGGESTIONS = [];
89
89
  * controls around it (`BrowserPanel`'s overflow menu, `AppPreview`'s viewer
90
90
  * actions and close) — the component is a fragment, so it slots between them.
91
91
  */
92
- export function SandboxAddressBar({ displayValue, hasPreview, isLoading, canGoBack, canGoForward, onBack, onForward, onReload, onHome, onNavigate, suggestions = NO_SUGGESTIONS, placeholder, ariaLabel, inputRef, resetOnEscape = true, trailing, }) {
92
+ export function SandboxAddressBar({ displayValue, hasPreview, isLoading, canGoBack, canGoForward, onBack, onForward, onReload, onHome, onNavigate, suggestions = NO_SUGGESTIONS, placeholder, ariaLabel, inputRef, resetOnEscape = true, trailing, disabled, }) {
93
93
  const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
94
94
  const [addressValue, setAddressValue] = useState(displayValue);
95
95
  const [isEditing, setIsEditing] = useState(false);
@@ -121,7 +121,7 @@ export function SandboxAddressBar({ displayValue, hasPreview, isLoading, canGoBa
121
121
  onNavigate(internal);
122
122
  }, [addressValue, onNavigate, suggestions]);
123
123
  const suggestionsId = useId();
124
- return (_jsxs(_Fragment, { children: [_jsxs(ButtonGroup, { className: "shrink-0", children: [_jsx(Hint, { label: tI18nComplete.raw('text76900f1bfd16'), side: "bottom", children: _jsx(Button, { variant: "secondary", size: "icon", onClick: onBack, disabled: !hasPreview || !canGoBack, children: _jsx(ArrowLeft, { className: "size-4" }) }) }), _jsx(Hint, { label: tI18nComplete.raw('textf1c65e14817e'), side: "bottom", children: _jsx(Button, { variant: "secondary", size: "icon", onClick: onForward, disabled: !hasPreview || !canGoForward, children: _jsx(ArrowRight, { className: "size-4" }) }) })] }), _jsx("form", { onSubmit: handleAddressSubmit, className: "flex min-w-0 flex-1 items-center px-1", children: _jsxs(ButtonGroup, { className: "w-full min-w-0", children: [_jsx(Hint, { label: tI18nComplete.raw('text3a78695388b3'), side: "bottom", children: _jsx(Button, { type: "button", variant: "secondary", size: "icon", onClick: onHome, disabled: !hasPreview, "aria-label": tI18nComplete.raw('text3a78695388b3'), children: _jsx(Home, { className: "size-3.5" }) }) }), _jsxs("div", { className: cn('bg-muted flex h-7 min-w-0 flex-1 items-center gap-1 rounded-md border border-transparent px-2 text-xs tracking-tight transition-colors', addressError && 'border-kortix-red/60 focus-within:border-kortix-red/60 animate-shake'), children: [_jsxs("div", { className: "group/address relative flex h-full min-w-0 flex-1 items-center", children: [_jsx(Input, { ref: inputRef, type: "text", size: "xs", value: urlParts ? displayValue : addressValue, "aria-label": ariaLabel, list: suggestions.length ? suggestionsId : undefined, onChange: (e) => {
124
+ return (_jsxs(_Fragment, { children: [_jsxs(ButtonGroup, { className: "shrink-0", children: [_jsx(Hint, { label: tI18nComplete.raw('text76900f1bfd16'), side: "bottom", children: _jsx(Button, { variant: "secondary", size: "icon", onClick: onBack, disabled: !hasPreview || !canGoBack, children: _jsx(ArrowLeft, { className: "size-4" }) }) }), _jsx(Hint, { label: tI18nComplete.raw('textf1c65e14817e'), side: "bottom", children: _jsx(Button, { variant: "secondary", size: "icon", onClick: onForward, disabled: !hasPreview || !canGoForward, children: _jsx(ArrowRight, { className: "size-4" }) }) })] }), _jsx("form", { onSubmit: handleAddressSubmit, className: "flex min-w-0 flex-1 items-center px-1", children: _jsxs(ButtonGroup, { className: "w-full min-w-0", children: [_jsx(Hint, { label: tI18nComplete.raw('text3a78695388b3'), side: "bottom", children: _jsx(Button, { type: "button", variant: "secondary", size: "icon", onClick: onHome, disabled: !hasPreview, "aria-label": tI18nComplete.raw('text3a78695388b3'), children: _jsx(Home, { className: "size-3.5" }) }) }), _jsxs("div", { className: cn('bg-muted flex h-7 min-w-0 flex-1 items-center gap-1 rounded-md border border-transparent px-2 text-xs tracking-tight transition-colors', addressError && 'border-kortix-red/60 focus-within:border-kortix-red/60 animate-shake'), children: [_jsxs("div", { className: "group/address relative flex h-full min-w-0 flex-1 items-center", children: [_jsx(Input, { ref: inputRef, type: "text", size: "xs", disabled: disabled, value: urlParts ? displayValue : addressValue, "aria-label": ariaLabel, list: suggestions.length ? suggestionsId : undefined, onChange: (e) => {
125
125
  setAddressValue(e.target.value);
126
126
  if (addressError)
127
127
  setAddressError(false);
@@ -0,0 +1,17 @@
1
+ import type { ReactNode } from 'react';
2
+ /**
3
+ * An Agents-page card led by the agent's pixel-mark cover. The cover gives
4
+ * every agent a face that is the same wherever the agent appears, so a long
5
+ * list is scanned by shape and tone before names are read.
6
+ */
7
+ export declare function AgentCoverCard({ slug, href, onIntent, title, description, badges, meta, coverLabel, }: {
8
+ slug: string;
9
+ href: string;
10
+ onIntent?: () => void;
11
+ title: ReactNode;
12
+ description?: string | null;
13
+ badges?: ReactNode;
14
+ meta?: ReactNode;
15
+ /** A short pill on the cover's top-left corner — "Default". */
16
+ coverLabel?: string;
17
+ }): import("react").JSX.Element;
@@ -0,0 +1,13 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { UiLink as Link } from '../../providers/ui-provider.js';
4
+ import { AgentMarkGlyph, agentMarkVars } from '../../internal/components/agent-mark.js';
5
+ import { cn } from '../../internal/lib/utils.js';
6
+ /**
7
+ * An Agents-page card led by the agent's pixel-mark cover. The cover gives
8
+ * every agent a face that is the same wherever the agent appears, so a long
9
+ * list is scanned by shape and tone before names are read.
10
+ */
11
+ export function AgentCoverCard({ slug, href, onIntent, title, description, badges, meta, coverLabel, }) {
12
+ return (_jsxs(Link, { href: href, prefetch: true, onPointerEnter: onIntent, onFocus: onIntent, style: agentMarkVars(slug), className: cn('group bg-card border-border/60 flex flex-col overflow-hidden rounded-md border text-left', 'hover:border-border transition-[border-color] duration-(--duration-normal) ease-out', 'focus-visible:ring-ring/50 focus-visible:ring-2 focus-visible:outline-none'), children: [_jsxs("span", { className: "relative flex h-31 items-center justify-center bg-(--mark-tile)", children: [_jsx(AgentMarkGlyph, { slug: slug, size: 56 }), coverLabel ? (_jsx("span", { className: "bg-background/20 absolute top-2.5 left-2.5 rounded-sm px-2 py-0.5 text-xs font-medium text-(--mark-ink) backdrop-blur-sm", children: coverLabel })) : null] }), _jsxs("span", { className: "flex min-w-0 flex-1 flex-col gap-1 px-3.5 pt-3 pb-3.5", children: [_jsxs("span", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-foreground truncate text-sm font-medium", children: title }), badges] }), description ? (_jsx("span", { className: "text-muted-foreground line-clamp-2 text-xs text-pretty", children: description })) : null, meta ? (_jsx("span", { className: "text-muted-foreground mt-auto flex flex-wrap items-center gap-x-2 gap-y-0.5 pt-1.5 text-xs", children: meta })) : null] })] }));
13
+ }