@agent-native/core 0.103.0 → 0.104.0

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 (572) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +36 -0
  3. package/corpus/core/package.json +9 -2
  4. package/corpus/core/src/agent/engine/credential-errors.ts +2 -2
  5. package/corpus/core/src/agent/production-agent.ts +30 -0
  6. package/corpus/core/src/agent/run-store.ts +12 -2
  7. package/corpus/core/src/cli/create.ts +1 -0
  8. package/corpus/core/src/cli/skills-content/visual-plan-skill.ts +30 -11
  9. package/corpus/core/src/cli/templates-meta.ts +4 -3
  10. package/corpus/core/src/client/AgentAskPopover.tsx +89 -0
  11. package/corpus/core/src/client/AgentChatHome.tsx +4 -0
  12. package/corpus/core/src/client/AgentPanel.tsx +321 -223
  13. package/corpus/core/src/client/AssistantChat.tsx +6 -10
  14. package/corpus/core/src/client/MultiTabAssistantChat.tsx +53 -372
  15. package/corpus/core/src/client/agent-chat-adapter.ts +13 -1
  16. package/corpus/core/src/client/agent-page/AgentContextTab.tsx +133 -149
  17. package/corpus/core/src/client/agent-page/AgentEmptyState.tsx +44 -0
  18. package/corpus/core/src/client/agent-page/AgentJobsTab.tsx +153 -82
  19. package/corpus/core/src/client/agent-page/AgentTabFrame.tsx +39 -0
  20. package/corpus/core/src/client/agent-page/AgentTabsPage.tsx +368 -356
  21. package/corpus/core/src/client/agent-page/types.ts +1 -1
  22. package/corpus/core/src/client/analytics.ts +51 -5
  23. package/corpus/core/src/client/chat/run-recovery.tsx +12 -4
  24. package/corpus/core/src/client/composer/PromptComposer.tsx +5 -15
  25. package/corpus/core/src/client/composer/TiptapComposer.tsx +32 -3
  26. package/corpus/core/src/client/dynamic-suggestions.ts +3 -3
  27. package/corpus/core/src/client/index.ts +16 -1
  28. package/corpus/core/src/client/resources/ResourceTree.tsx +249 -38
  29. package/corpus/core/src/client/resources/ResourcesPanel.tsx +307 -140
  30. package/corpus/core/src/client/session-replay.ts +158 -5
  31. package/corpus/core/src/client/settings/AutomationsSection.tsx +30 -10
  32. package/corpus/core/src/client/settings/SettingsPanel.tsx +3 -2
  33. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +2 -0
  34. package/corpus/core/src/client/settings/agent-settings-search.ts +2 -2
  35. package/corpus/core/src/client/use-chat-threads.ts +2 -0
  36. package/corpus/core/src/connections/catalog.ts +49 -7
  37. package/corpus/core/src/db/index.ts +6 -1
  38. package/corpus/core/src/extensions/actions.ts +106 -16
  39. package/corpus/core/src/extensions/content-patch.ts +22 -0
  40. package/corpus/core/src/extensions/routes.ts +18 -0
  41. package/corpus/core/src/extensions/store.ts +8 -0
  42. package/corpus/core/src/index.ts +3 -0
  43. package/corpus/core/src/ingestion/docx.ts +158 -0
  44. package/corpus/core/src/ingestion/figma-node-to-html.ts +1860 -0
  45. package/corpus/core/src/ingestion/figma.ts +548 -0
  46. package/corpus/core/src/ingestion/index.ts +107 -0
  47. package/corpus/core/src/ingestion/media.ts +264 -0
  48. package/corpus/core/src/ingestion/notion.ts +121 -0
  49. package/corpus/core/src/ingestion/office.ts +214 -0
  50. package/corpus/core/src/ingestion/orchestration.ts +160 -0
  51. package/corpus/core/src/ingestion/pptx.ts +333 -0
  52. package/corpus/core/src/ingestion/selection.ts +81 -0
  53. package/corpus/core/src/ingestion/website.ts +151 -0
  54. package/corpus/core/src/integrations/plugin.ts +45 -37
  55. package/corpus/core/src/localization/default-messages.ts +35 -12
  56. package/corpus/core/src/observability/hosted-model-experiment.ts +118 -0
  57. package/corpus/core/src/observability/traces.ts +5 -3
  58. package/corpus/core/src/provider-api/index.ts +452 -8
  59. package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +18 -1
  60. package/corpus/core/src/search-utils/index.ts +112 -0
  61. package/corpus/core/src/secrets/register-framework-secrets.ts +61 -0
  62. package/corpus/core/src/server/action-discovery.ts +33 -8
  63. package/corpus/core/src/server/agent-chat/framework-prompts.ts +2 -2
  64. package/corpus/core/src/server/agent-chat/prompt-resources.ts +144 -0
  65. package/corpus/core/src/server/agent-chat-plugin.ts +6 -0
  66. package/corpus/core/src/server/core-routes-plugin.ts +12 -0
  67. package/corpus/core/src/server/index.ts +30 -0
  68. package/corpus/core/src/server/workspace-provider-oauth.ts +583 -0
  69. package/corpus/core/src/styles/agent-native.css +9 -0
  70. package/corpus/core/src/templates/default/app/i18n/en-US.ts +3 -3
  71. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  72. package/corpus/core/src/templates/workspace-root/.env.example +12 -0
  73. package/corpus/core/src/vite/client.ts +2 -0
  74. package/corpus/core/src/workspace-connections/index.ts +6 -0
  75. package/corpus/core/src/workspace-connections/lifecycle.ts +43 -0
  76. package/corpus/core/src/workspace-connections/store.ts +16 -0
  77. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +46 -3
  78. package/corpus/templates/analytics/AGENTS.md +9 -0
  79. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +120 -6
  80. package/corpus/templates/analytics/actions/mutate-dashboard.ts +92 -30
  81. package/corpus/templates/analytics/actions/update-dashboard.ts +5 -5
  82. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +313 -220
  83. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +2 -2
  84. package/corpus/templates/analytics/app/components/layout/Layout.tsx +9 -6
  85. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +90 -64
  86. package/corpus/templates/analytics/app/i18n-data.ts +3 -3
  87. package/corpus/templates/analytics/app/lib/dashboard-list-loading.ts +25 -0
  88. package/corpus/templates/analytics/app/lib/item-popularity.ts +13 -4
  89. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +1 -1
  90. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/pivot.ts +8 -3
  91. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +1 -0
  92. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +15 -3
  93. package/corpus/templates/analytics/changelog/2026-07-16-dashboard-filter-defaults-can-now-be-changed-reliably-withou.md +6 -0
  94. package/corpus/templates/analytics/changelog/2026-07-16-dashboard-lists-load-in-one-stable-order-without-popping-bet.md +6 -0
  95. package/corpus/templates/analytics/changelog/2026-07-16-fixed-dashboard-filter-dropdown-text-alignment.md +6 -0
  96. package/corpus/templates/analytics/changelog/2026-07-16-recurring-signed-in-users-can-now-be-viewed-as-weekly-bars-b.md +6 -0
  97. package/corpus/templates/analytics/changelog/2026-07-16-the-analytics-agent-can-now-duplicate-a-chart-and-place-the-.md +6 -0
  98. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +41 -1
  99. package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +1 -1
  100. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +47 -1
  101. package/corpus/templates/analytics/server/lib/session-replay.ts +68 -0
  102. package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -0
  103. package/corpus/templates/analytics/server/routes/sessions/lookup.get.ts +47 -0
  104. package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +16 -9
  105. package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +86 -0
  106. package/corpus/templates/assets/AGENTS.md +10 -0
  107. package/corpus/templates/assets/actions/create-generation-session.ts +59 -1
  108. package/corpus/templates/assets/actions/edit-image.ts +2 -0
  109. package/corpus/templates/assets/actions/generate-asset.ts +52 -0
  110. package/corpus/templates/assets/actions/generate-image-batch.ts +55 -0
  111. package/corpus/templates/assets/actions/generate-image.ts +219 -1
  112. package/corpus/templates/assets/actions/open-asset-picker.ts +14 -0
  113. package/corpus/templates/assets/actions/refine-image.ts +3 -0
  114. package/corpus/templates/assets/actions/restyle-image.ts +2 -0
  115. package/corpus/templates/assets/agent-native.app-skill.json +4 -0
  116. package/corpus/templates/assets/app/components/layout/Layout.tsx +2 -0
  117. package/corpus/templates/assets/app/i18n/zh-TW.ts +3 -0
  118. package/corpus/templates/assets/app/i18n-data.ts +29 -13
  119. package/corpus/templates/assets/app/routes/agent.tsx +7 -1
  120. package/corpus/templates/assets/app/routes/library.tsx +9 -0
  121. package/corpus/templates/assets/app/routes/settings.tsx +3 -0
  122. package/corpus/templates/assets/changelog/2026-07-16-creative-context-library.md +6 -0
  123. package/corpus/templates/assets/package.json +1 -0
  124. package/corpus/templates/assets/server/lib/image-processing.ts +1 -22
  125. package/corpus/templates/assets/server/plugins/creative-context.ts +205 -0
  126. package/corpus/templates/brain/app/i18n-data.ts +3 -3
  127. package/corpus/templates/brain/app/lib/brain.ts +1 -1
  128. package/corpus/templates/brain/server/lib/search.ts +17 -67
  129. package/corpus/templates/calendar/app/i18n-data.ts +3 -3
  130. package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +19 -18
  131. package/corpus/templates/chat/app/i18n/en-US.ts +3 -3
  132. package/corpus/templates/chat/app/lib/agent-page.tsx +10 -1
  133. package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +1 -1
  134. package/corpus/templates/clips/AGENTS.md +4 -0
  135. package/corpus/templates/clips/actions/cleanup-transcript.ts +35 -4
  136. package/corpus/templates/clips/actions/create-meeting.ts +6 -2
  137. package/corpus/templates/clips/actions/create-organization.ts +3 -2
  138. package/corpus/templates/clips/actions/create-recording.ts +4 -1
  139. package/corpus/templates/clips/actions/finalize-recording.ts +44 -7
  140. package/corpus/templates/clips/actions/import-loom-recording.ts +4 -1
  141. package/corpus/templates/clips/actions/lib/create-recording-schema.ts +2 -2
  142. package/corpus/templates/clips/actions/list-meetings.ts +23 -5
  143. package/corpus/templates/clips/actions/list-organization-state.ts +1 -1
  144. package/corpus/templates/clips/actions/remove-silences.ts +10 -1
  145. package/corpus/templates/clips/actions/request-transcript.ts +53 -11
  146. package/corpus/templates/clips/actions/search-recordings-utils.ts +7 -0
  147. package/corpus/templates/clips/actions/search-recordings.ts +5 -8
  148. package/corpus/templates/clips/actions/set-organization-branding.ts +2 -2
  149. package/corpus/templates/clips/actions/stitch-recordings.ts +10 -5
  150. package/corpus/templates/clips/actions/update-ai-request-status.ts +38 -0
  151. package/corpus/templates/clips/app/components/editor/editor-layout.tsx +3 -4
  152. package/corpus/templates/clips/app/components/editor/editor-selection.ts +19 -0
  153. package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +10 -10
  154. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +1 -2
  155. package/corpus/templates/clips/app/components/library/library-grid.tsx +101 -93
  156. package/corpus/templates/clips/app/components/player/video-player.tsx +11 -0
  157. package/corpus/templates/clips/app/components/workspace/branding-editor.tsx +53 -1
  158. package/corpus/templates/clips/app/i18n/ar-SA.ts +7 -1
  159. package/corpus/templates/clips/app/i18n/de-DE.ts +7 -1
  160. package/corpus/templates/clips/app/i18n/en-US.ts +10 -4
  161. package/corpus/templates/clips/app/i18n/es-ES.ts +7 -1
  162. package/corpus/templates/clips/app/i18n/fr-FR.ts +7 -1
  163. package/corpus/templates/clips/app/i18n/hi-IN.ts +7 -1
  164. package/corpus/templates/clips/app/i18n/ja-JP.ts +7 -1
  165. package/corpus/templates/clips/app/i18n/ko-KR.ts +7 -1
  166. package/corpus/templates/clips/app/i18n/pt-BR.ts +7 -1
  167. package/corpus/templates/clips/app/i18n/zh-CN.ts +6 -1
  168. package/corpus/templates/clips/app/i18n/zh-TW.ts +6 -1
  169. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +5 -9
  170. package/corpus/templates/clips/app/routes/_app.settings.organization.tsx +6 -2
  171. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +129 -27
  172. package/corpus/templates/clips/app/routes/record.tsx +23 -2
  173. package/corpus/templates/clips/app/routes/share.$shareId.tsx +6 -2
  174. package/corpus/templates/clips/changelog/2026-07-16-authorized-viewers-can-open-shared-private-clips-without-a-m.md +6 -0
  175. package/corpus/templates/clips/changelog/2026-07-16-camera-bubble-hover-controls-appear-above-the-face.md +6 -0
  176. package/corpus/templates/clips/changelog/2026-07-16-chrome-extension-recovers-stale-recorder-state.md +6 -0
  177. package/corpus/templates/clips/changelog/2026-07-16-clips-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
  178. package/corpus/templates/clips/changelog/2026-07-16-clips-search-now-matches-recording-content-without-requiring.md +6 -0
  179. package/corpus/templates/clips/changelog/2026-07-16-declined-meetings-no-longer-show-desktop-reminders.md +6 -0
  180. package/corpus/templates/clips/changelog/2026-07-16-failed-desktop-saves-now-show-their-local-recovery-copy.md +6 -0
  181. package/corpus/templates/clips/changelog/2026-07-16-long-desktop-clips-now-preserve-complete-playback-synced-aud.md +6 -0
  182. package/corpus/templates/clips/changelog/2026-07-16-long-recording-lists-keep-stitch-and-library-actions-visible.md +6 -0
  183. package/corpus/templates/clips/changelog/2026-07-16-organization-admins-can-choose-new-recording-visibility.md +6 -0
  184. package/corpus/templates/clips/changelog/2026-07-16-remove-silences-now-shows-queued-active-completed-and-failed.md +6 -0
  185. package/corpus/templates/clips/changelog/2026-07-16-settings-no-longer-repeats-the-builder-connection-status-in-.md +6 -0
  186. package/corpus/templates/clips/changelog/2026-07-16-transcripts-now-appear-from-native-browser-speech-sooner-wit.md +6 -0
  187. package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -1
  188. package/corpus/templates/clips/chrome-extension/src/background.ts +73 -1
  189. package/corpus/templates/clips/chrome-extension/src/native-recording-state.ts +32 -0
  190. package/corpus/templates/clips/chrome-extension/src/native-transcription.ts +248 -0
  191. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +106 -0
  192. package/corpus/templates/clips/desktop/src/app.tsx +66 -28
  193. package/corpus/templates/clips/desktop/src/lib/recorder.ts +335 -285
  194. package/corpus/templates/clips/desktop/src/lib/single-flight.ts +7 -0
  195. package/corpus/templates/clips/desktop/src/lib/upload-verification.ts +51 -0
  196. package/corpus/templates/clips/desktop/src/overlays/bubble.tsx +2 -2
  197. package/corpus/templates/clips/desktop/src/overlays/finalizing.tsx +10 -2
  198. package/corpus/templates/clips/desktop/src/styles.css +13 -11
  199. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +8 -9
  200. package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +1 -0
  201. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +88 -13
  202. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/live_upload.rs +13 -2
  203. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +241 -6
  204. package/corpus/templates/clips/server/db/schema.ts +2 -2
  205. package/corpus/templates/clips/server/lib/builder-media-compression.ts +64 -67
  206. package/corpus/templates/clips/server/lib/calendar-event-classification.ts +19 -0
  207. package/corpus/templates/clips/server/lib/google-calendar-client.ts +1 -0
  208. package/corpus/templates/clips/server/lib/recordings.ts +40 -1
  209. package/corpus/templates/clips/server/plugins/agent-chat.ts +1 -0
  210. package/corpus/templates/clips/server/plugins/db.ts +2 -2
  211. package/corpus/templates/clips/server/routes/api/auth/google-calendar.get.ts +1 -1
  212. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +14 -5
  213. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +51 -1
  214. package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +1 -64
  215. package/corpus/templates/clips/shared/media-worker-contract.ts +32 -15
  216. package/corpus/templates/content/.agents/skills/content/SKILL.md +16 -0
  217. package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +85 -0
  218. package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +8 -0
  219. package/corpus/templates/content/AGENTS.md +9 -0
  220. package/corpus/templates/content/actions/create-document.ts +94 -0
  221. package/corpus/templates/content/actions/edit-document.ts +144 -4
  222. package/corpus/templates/content/actions/update-document.ts +138 -0
  223. package/corpus/templates/content/agent-native.app-skill.json +4 -0
  224. package/corpus/templates/content/app/components/layout/Layout.tsx +2 -0
  225. package/corpus/templates/content/app/i18n/zh-TW.ts +3 -0
  226. package/corpus/templates/content/app/i18n-data.ts +13 -4
  227. package/corpus/templates/content/app/routes/_app.agent.tsx +2 -1
  228. package/corpus/templates/content/app/routes/_app.settings.tsx +3 -0
  229. package/corpus/templates/content/changelog/2026-07-16-creative-context-library.md +6 -0
  230. package/corpus/templates/content/package.json +1 -0
  231. package/corpus/templates/content/server/plugins/creative-context.ts +31 -0
  232. package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +116 -0
  233. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +16 -0
  234. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -0
  235. package/corpus/templates/design/AGENTS.md +6 -0
  236. package/corpus/templates/design/actions/clone-creative-context-design.ts +176 -0
  237. package/corpus/templates/design/actions/edit-design.ts +128 -0
  238. package/corpus/templates/design/actions/generate-design.ts +278 -14
  239. package/corpus/templates/design/actions/generate-screens.ts +42 -1
  240. package/corpus/templates/design/agent-native.app-skill.json +4 -0
  241. package/corpus/templates/design/app/components/layout/Layout.tsx +7 -3
  242. package/corpus/templates/design/app/i18n/zh-TW.ts +3 -0
  243. package/corpus/templates/design/app/i18n-data.ts +10 -4
  244. package/corpus/templates/design/app/routes/agent.tsx +2 -1
  245. package/corpus/templates/design/app/routes/settings.tsx +3 -0
  246. package/corpus/templates/design/changelog/2026-07-16-creative-context-library.md +6 -0
  247. package/corpus/templates/design/changelog/2026-07-16-design-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
  248. package/corpus/templates/design/package.json +1 -0
  249. package/corpus/templates/design/server/lib/figma-design-context.ts +5 -335
  250. package/corpus/templates/design/server/lib/figma-node-to-html.ts +1 -1859
  251. package/corpus/templates/design/server/lib/import-design-files.ts +6 -8
  252. package/corpus/templates/design/server/plugins/creative-context.ts +31 -0
  253. package/corpus/templates/design/shared/generation-session.ts +7 -0
  254. package/corpus/templates/dispatch/app/i18n-data.ts +3 -3
  255. package/corpus/templates/forms/app/i18n/en-US.ts +3 -3
  256. package/corpus/templates/macros/app/i18n/en-US.ts +3 -3
  257. package/corpus/templates/mail/app/components/email/EmailThread.tsx +35 -5
  258. package/corpus/templates/mail/app/i18n/en-US.ts +3 -3
  259. package/corpus/templates/mail/changelog/2026-07-16-mail-previews-now-expand-to-show-the-full-message-without-an.md +6 -0
  260. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +30 -11
  261. package/corpus/templates/plan/AGENTS.md +21 -1
  262. package/corpus/templates/plan/actions/get-visual-plan.ts +1 -1
  263. package/corpus/templates/plan/actions/patch-visual-plan-source.ts +161 -0
  264. package/corpus/templates/plan/actions/read-visual-plan-source.ts +1 -1
  265. package/corpus/templates/plan/actions/update-visual-plan.ts +126 -10
  266. package/corpus/templates/plan/app/hooks/use-plans.ts +2 -0
  267. package/corpus/templates/plan/app/i18n/en-US.ts +3 -3
  268. package/corpus/templates/plan/app/pages/PlansPage.tsx +65 -62
  269. package/corpus/templates/plan/changelog/2026-07-16-local-plan-previews-now-load-annotations-containing-html-lik.md +6 -0
  270. package/corpus/templates/plan/changelog/2026-07-16-plan-agents-now-prevent-stale-edits-from-overwriting-newer-p.md +6 -0
  271. package/corpus/templates/plan/server/plan-mdx.ts +75 -2
  272. package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +21 -4
  273. package/corpus/templates/slides/.agents/skills/creative-context/SKILL.md +122 -0
  274. package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +11 -0
  275. package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +12 -3
  276. package/corpus/templates/slides/AGENTS.md +6 -0
  277. package/corpus/templates/slides/actions/add-slide.ts +230 -14
  278. package/corpus/templates/slides/actions/clone-context-slide.ts +302 -0
  279. package/corpus/templates/slides/actions/create-deck.ts +130 -0
  280. package/corpus/templates/slides/actions/extract-pdf.ts +6 -2
  281. package/corpus/templates/slides/actions/import-file.ts +5 -4
  282. package/corpus/templates/slides/actions/patch-deck.ts +200 -10
  283. package/corpus/templates/slides/actions/update-slide.ts +208 -15
  284. package/corpus/templates/slides/app/components/layout/Layout.tsx +2 -0
  285. package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +16 -1
  286. package/corpus/templates/slides/app/i18n/ar-SA.ts +3 -0
  287. package/corpus/templates/slides/app/i18n/de-DE.ts +3 -0
  288. package/corpus/templates/slides/app/i18n/en-US.ts +6 -3
  289. package/corpus/templates/slides/app/i18n/es-ES.ts +3 -0
  290. package/corpus/templates/slides/app/i18n/fr-FR.ts +3 -0
  291. package/corpus/templates/slides/app/i18n/hi-IN.ts +3 -0
  292. package/corpus/templates/slides/app/i18n/ja-JP.ts +3 -0
  293. package/corpus/templates/slides/app/i18n/ko-KR.ts +3 -0
  294. package/corpus/templates/slides/app/i18n/pt-BR.ts +3 -0
  295. package/corpus/templates/slides/app/i18n/zh-CN.ts +3 -0
  296. package/corpus/templates/slides/app/i18n/zh-TW.ts +3 -0
  297. package/corpus/templates/slides/app/lib/validate-native-slide-html.ts +176 -0
  298. package/corpus/templates/slides/app/routes/agent.tsx +7 -1
  299. package/corpus/templates/slides/app/routes/settings.tsx +3 -0
  300. package/corpus/templates/slides/changelog/2026-07-16-creative-context-library.md +6 -0
  301. package/corpus/templates/slides/changelog/2026-07-16-google-slides-native-cloning.md +6 -0
  302. package/corpus/templates/slides/package.json +1 -0
  303. package/corpus/templates/slides/server/handlers/import/docx-parser.ts +4 -85
  304. package/corpus/templates/slides/server/handlers/import/pptx-parser.ts +7 -421
  305. package/corpus/templates/slides/server/plugins/creative-context.ts +166 -0
  306. package/dist/agent/engine/credential-errors.d.ts +1 -1
  307. package/dist/agent/engine/credential-errors.d.ts.map +1 -1
  308. package/dist/agent/engine/credential-errors.js +2 -2
  309. package/dist/agent/engine/credential-errors.js.map +1 -1
  310. package/dist/agent/production-agent.d.ts.map +1 -1
  311. package/dist/agent/production-agent.js +25 -0
  312. package/dist/agent/production-agent.js.map +1 -1
  313. package/dist/agent/run-store.d.ts.map +1 -1
  314. package/dist/agent/run-store.js +12 -2
  315. package/dist/agent/run-store.js.map +1 -1
  316. package/dist/cli/create.d.ts.map +1 -1
  317. package/dist/cli/create.js +1 -0
  318. package/dist/cli/create.js.map +1 -1
  319. package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
  320. package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -1
  321. package/dist/cli/skills-content/visual-plan-skill.js +30 -11
  322. package/dist/cli/skills-content/visual-plan-skill.js.map +1 -1
  323. package/dist/cli/templates-meta.d.ts.map +1 -1
  324. package/dist/cli/templates-meta.js +4 -3
  325. package/dist/cli/templates-meta.js.map +1 -1
  326. package/dist/client/AgentAskPopover.d.ts +11 -0
  327. package/dist/client/AgentAskPopover.d.ts.map +1 -0
  328. package/dist/client/AgentAskPopover.js +30 -0
  329. package/dist/client/AgentAskPopover.js.map +1 -0
  330. package/dist/client/AgentChatHome.d.ts +1 -1
  331. package/dist/client/AgentChatHome.d.ts.map +1 -1
  332. package/dist/client/AgentChatHome.js +2 -2
  333. package/dist/client/AgentChatHome.js.map +1 -1
  334. package/dist/client/AgentPanel.d.ts +9 -19
  335. package/dist/client/AgentPanel.d.ts.map +1 -1
  336. package/dist/client/AgentPanel.js +119 -80
  337. package/dist/client/AgentPanel.js.map +1 -1
  338. package/dist/client/AssistantChat.d.ts.map +1 -1
  339. package/dist/client/AssistantChat.js +4 -4
  340. package/dist/client/AssistantChat.js.map +1 -1
  341. package/dist/client/MultiTabAssistantChat.d.ts +3 -9
  342. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  343. package/dist/client/MultiTabAssistantChat.js +49 -189
  344. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  345. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  346. package/dist/client/agent-chat-adapter.js +12 -1
  347. package/dist/client/agent-chat-adapter.js.map +1 -1
  348. package/dist/client/agent-page/AgentContextTab.d.ts.map +1 -1
  349. package/dist/client/agent-page/AgentContextTab.js +26 -28
  350. package/dist/client/agent-page/AgentContextTab.js.map +1 -1
  351. package/dist/client/agent-page/AgentEmptyState.d.ts +13 -0
  352. package/dist/client/agent-page/AgentEmptyState.d.ts.map +1 -0
  353. package/dist/client/agent-page/AgentEmptyState.js +6 -0
  354. package/dist/client/agent-page/AgentEmptyState.js.map +1 -0
  355. package/dist/client/agent-page/AgentJobsTab.d.ts +1 -1
  356. package/dist/client/agent-page/AgentJobsTab.d.ts.map +1 -1
  357. package/dist/client/agent-page/AgentJobsTab.js +90 -58
  358. package/dist/client/agent-page/AgentJobsTab.js.map +1 -1
  359. package/dist/client/agent-page/AgentTabFrame.d.ts +12 -0
  360. package/dist/client/agent-page/AgentTabFrame.d.ts.map +1 -0
  361. package/dist/client/agent-page/AgentTabFrame.js +7 -0
  362. package/dist/client/agent-page/AgentTabFrame.js.map +1 -0
  363. package/dist/client/agent-page/AgentTabsPage.d.ts +9 -1
  364. package/dist/client/agent-page/AgentTabsPage.d.ts.map +1 -1
  365. package/dist/client/agent-page/AgentTabsPage.js +135 -99
  366. package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
  367. package/dist/client/agent-page/types.d.ts +1 -1
  368. package/dist/client/agent-page/types.d.ts.map +1 -1
  369. package/dist/client/agent-page/types.js.map +1 -1
  370. package/dist/client/analytics.d.ts +10 -3
  371. package/dist/client/analytics.d.ts.map +1 -1
  372. package/dist/client/analytics.js +37 -2
  373. package/dist/client/analytics.js.map +1 -1
  374. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  375. package/dist/client/chat/run-recovery.js +10 -3
  376. package/dist/client/chat/run-recovery.js.map +1 -1
  377. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  378. package/dist/client/composer/PromptComposer.js +2 -2
  379. package/dist/client/composer/PromptComposer.js.map +1 -1
  380. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  381. package/dist/client/composer/TiptapComposer.js +15 -3
  382. package/dist/client/composer/TiptapComposer.js.map +1 -1
  383. package/dist/client/dynamic-suggestions.js +3 -3
  384. package/dist/client/dynamic-suggestions.js.map +1 -1
  385. package/dist/client/index.d.ts +4 -3
  386. package/dist/client/index.d.ts.map +1 -1
  387. package/dist/client/index.js +3 -2
  388. package/dist/client/index.js.map +1 -1
  389. package/dist/client/resources/ResourceTree.d.ts +5 -1
  390. package/dist/client/resources/ResourceTree.d.ts.map +1 -1
  391. package/dist/client/resources/ResourceTree.js +74 -5
  392. package/dist/client/resources/ResourceTree.js.map +1 -1
  393. package/dist/client/resources/ResourcesPanel.d.ts +11 -2
  394. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  395. package/dist/client/resources/ResourcesPanel.js +105 -31
  396. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  397. package/dist/client/session-replay.d.ts +28 -0
  398. package/dist/client/session-replay.d.ts.map +1 -1
  399. package/dist/client/session-replay.js +122 -8
  400. package/dist/client/session-replay.js.map +1 -1
  401. package/dist/client/settings/AutomationsSection.d.ts +3 -1
  402. package/dist/client/settings/AutomationsSection.d.ts.map +1 -1
  403. package/dist/client/settings/AutomationsSection.js +16 -6
  404. package/dist/client/settings/AutomationsSection.js.map +1 -1
  405. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  406. package/dist/client/settings/SettingsPanel.js +3 -3
  407. package/dist/client/settings/SettingsPanel.js.map +1 -1
  408. package/dist/client/settings/SettingsTabsPage.d.ts +2 -0
  409. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  410. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  411. package/dist/client/settings/agent-settings-search.js +2 -2
  412. package/dist/client/settings/agent-settings-search.js.map +1 -1
  413. package/dist/client/use-chat-threads.d.ts +2 -0
  414. package/dist/client/use-chat-threads.d.ts.map +1 -1
  415. package/dist/client/use-chat-threads.js.map +1 -1
  416. package/dist/collab/awareness.d.ts +2 -2
  417. package/dist/collab/awareness.d.ts.map +1 -1
  418. package/dist/collab/routes.d.ts +1 -1
  419. package/dist/connections/catalog.d.ts +41 -7
  420. package/dist/connections/catalog.d.ts.map +1 -1
  421. package/dist/connections/catalog.js +40 -7
  422. package/dist/connections/catalog.js.map +1 -1
  423. package/dist/db/index.d.ts +2 -2
  424. package/dist/db/index.d.ts.map +1 -1
  425. package/dist/db/index.js +2 -2
  426. package/dist/db/index.js.map +1 -1
  427. package/dist/extensions/actions.d.ts.map +1 -1
  428. package/dist/extensions/actions.js +85 -15
  429. package/dist/extensions/actions.js.map +1 -1
  430. package/dist/extensions/content-patch.d.ts +4 -0
  431. package/dist/extensions/content-patch.d.ts.map +1 -1
  432. package/dist/extensions/content-patch.js +18 -0
  433. package/dist/extensions/content-patch.js.map +1 -1
  434. package/dist/extensions/routes.d.ts.map +1 -1
  435. package/dist/extensions/routes.js +14 -0
  436. package/dist/extensions/routes.js.map +1 -1
  437. package/dist/extensions/store.d.ts +1 -0
  438. package/dist/extensions/store.d.ts.map +1 -1
  439. package/dist/extensions/store.js +4 -1
  440. package/dist/extensions/store.js.map +1 -1
  441. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  442. package/dist/index.d.ts +1 -1
  443. package/dist/index.d.ts.map +1 -1
  444. package/dist/index.js +1 -1
  445. package/dist/index.js.map +1 -1
  446. package/dist/ingestion/docx.d.ts +16 -0
  447. package/dist/ingestion/docx.d.ts.map +1 -0
  448. package/dist/ingestion/docx.js +129 -0
  449. package/dist/ingestion/docx.js.map +1 -0
  450. package/dist/ingestion/figma-node-to-html.d.ts +304 -0
  451. package/dist/ingestion/figma-node-to-html.d.ts.map +1 -0
  452. package/dist/ingestion/figma-node-to-html.js +1292 -0
  453. package/dist/ingestion/figma-node-to-html.js.map +1 -0
  454. package/dist/ingestion/figma.d.ts +115 -0
  455. package/dist/ingestion/figma.d.ts.map +1 -0
  456. package/dist/ingestion/figma.js +399 -0
  457. package/dist/ingestion/figma.js.map +1 -0
  458. package/dist/ingestion/index.d.ts +11 -0
  459. package/dist/ingestion/index.d.ts.map +1 -0
  460. package/dist/ingestion/index.js +11 -0
  461. package/dist/ingestion/index.js.map +1 -0
  462. package/dist/ingestion/media.d.ts +36 -0
  463. package/dist/ingestion/media.d.ts.map +1 -0
  464. package/dist/ingestion/media.js +178 -0
  465. package/dist/ingestion/media.js.map +1 -0
  466. package/dist/ingestion/notion.d.ts +12 -0
  467. package/dist/ingestion/notion.d.ts.map +1 -0
  468. package/dist/ingestion/notion.js +104 -0
  469. package/dist/ingestion/notion.js.map +1 -0
  470. package/dist/ingestion/office.d.ts +45 -0
  471. package/dist/ingestion/office.d.ts.map +1 -0
  472. package/dist/ingestion/office.js +141 -0
  473. package/dist/ingestion/office.js.map +1 -0
  474. package/dist/ingestion/orchestration.d.ts +52 -0
  475. package/dist/ingestion/orchestration.d.ts.map +1 -0
  476. package/dist/ingestion/orchestration.js +89 -0
  477. package/dist/ingestion/orchestration.js.map +1 -0
  478. package/dist/ingestion/pptx.d.ts +28 -0
  479. package/dist/ingestion/pptx.d.ts.map +1 -0
  480. package/dist/ingestion/pptx.js +255 -0
  481. package/dist/ingestion/pptx.js.map +1 -0
  482. package/dist/ingestion/selection.d.ts +20 -0
  483. package/dist/ingestion/selection.d.ts.map +1 -0
  484. package/dist/ingestion/selection.js +52 -0
  485. package/dist/ingestion/selection.js.map +1 -0
  486. package/dist/ingestion/website.d.ts +27 -0
  487. package/dist/ingestion/website.d.ts.map +1 -0
  488. package/dist/ingestion/website.js +100 -0
  489. package/dist/ingestion/website.js.map +1 -0
  490. package/dist/integrations/plugin.d.ts.map +1 -1
  491. package/dist/integrations/plugin.js +32 -27
  492. package/dist/integrations/plugin.js.map +1 -1
  493. package/dist/localization/default-messages.d.ts +22 -0
  494. package/dist/localization/default-messages.d.ts.map +1 -1
  495. package/dist/localization/default-messages.js +31 -9
  496. package/dist/localization/default-messages.js.map +1 -1
  497. package/dist/observability/hosted-model-experiment.d.ts +39 -0
  498. package/dist/observability/hosted-model-experiment.d.ts.map +1 -0
  499. package/dist/observability/hosted-model-experiment.js +90 -0
  500. package/dist/observability/hosted-model-experiment.js.map +1 -0
  501. package/dist/observability/routes.d.ts +5 -5
  502. package/dist/observability/traces.d.ts.map +1 -1
  503. package/dist/observability/traces.js +5 -3
  504. package/dist/observability/traces.js.map +1 -1
  505. package/dist/progress/routes.d.ts +1 -1
  506. package/dist/provider-api/index.d.ts +35 -4
  507. package/dist/provider-api/index.d.ts.map +1 -1
  508. package/dist/provider-api/index.js +339 -8
  509. package/dist/provider-api/index.js.map +1 -1
  510. package/dist/resources/handlers.d.ts +1 -1
  511. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  512. package/dist/scripts/agent-engines/list-agent-engines.js +18 -1
  513. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  514. package/dist/search-utils/index.d.ts +12 -0
  515. package/dist/search-utils/index.d.ts.map +1 -0
  516. package/dist/search-utils/index.js +95 -0
  517. package/dist/search-utils/index.js.map +1 -0
  518. package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
  519. package/dist/secrets/register-framework-secrets.js +57 -0
  520. package/dist/secrets/register-framework-secrets.js.map +1 -1
  521. package/dist/secrets/routes.d.ts +9 -9
  522. package/dist/server/action-discovery.d.ts +8 -0
  523. package/dist/server/action-discovery.d.ts.map +1 -1
  524. package/dist/server/action-discovery.js +26 -9
  525. package/dist/server/action-discovery.js.map +1 -1
  526. package/dist/server/agent-chat/framework-prompts.js +2 -2
  527. package/dist/server/agent-chat/framework-prompts.js.map +1 -1
  528. package/dist/server/agent-chat/prompt-resources.d.ts +19 -0
  529. package/dist/server/agent-chat/prompt-resources.d.ts.map +1 -1
  530. package/dist/server/agent-chat/prompt-resources.js +95 -0
  531. package/dist/server/agent-chat/prompt-resources.js.map +1 -1
  532. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  533. package/dist/server/agent-chat-plugin.js +7 -0
  534. package/dist/server/agent-chat-plugin.js.map +1 -1
  535. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  536. package/dist/server/core-routes-plugin.js +5 -0
  537. package/dist/server/core-routes-plugin.js.map +1 -1
  538. package/dist/server/index.d.ts +5 -1
  539. package/dist/server/index.d.ts.map +1 -1
  540. package/dist/server/index.js +5 -1
  541. package/dist/server/index.js.map +1 -1
  542. package/dist/server/workspace-provider-oauth.d.ts +48 -0
  543. package/dist/server/workspace-provider-oauth.d.ts.map +1 -0
  544. package/dist/server/workspace-provider-oauth.js +415 -0
  545. package/dist/server/workspace-provider-oauth.js.map +1 -0
  546. package/dist/styles/agent-native.css +9 -0
  547. package/dist/templates/chat/app/i18n/en-US.ts +3 -3
  548. package/dist/templates/chat/app/lib/agent-page.tsx +10 -1
  549. package/dist/templates/default/app/i18n/en-US.ts +3 -3
  550. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  551. package/dist/templates/workspace-root/.env.example +12 -0
  552. package/dist/vite/client.d.ts.map +1 -1
  553. package/dist/vite/client.js +2 -0
  554. package/dist/vite/client.js.map +1 -1
  555. package/dist/workspace-connections/index.d.ts +1 -0
  556. package/dist/workspace-connections/index.d.ts.map +1 -1
  557. package/dist/workspace-connections/index.js +1 -0
  558. package/dist/workspace-connections/index.js.map +1 -1
  559. package/dist/workspace-connections/lifecycle.d.ts +16 -0
  560. package/dist/workspace-connections/lifecycle.d.ts.map +1 -0
  561. package/dist/workspace-connections/lifecycle.js +14 -0
  562. package/dist/workspace-connections/lifecycle.js.map +1 -0
  563. package/dist/workspace-connections/store.d.ts.map +1 -1
  564. package/dist/workspace-connections/store.js +16 -0
  565. package/dist/workspace-connections/store.js.map +1 -1
  566. package/package.json +10 -3
  567. package/src/templates/chat/app/i18n/en-US.ts +3 -3
  568. package/src/templates/chat/app/lib/agent-page.spec.tsx +10 -1
  569. package/src/templates/chat/app/lib/agent-page.tsx +10 -1
  570. package/src/templates/default/app/i18n/en-US.ts +3 -3
  571. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  572. package/src/templates/workspace-root/.env.example +12 -0
@@ -69,6 +69,7 @@ interface SessionReplayState {
69
69
  startGeneration: number;
70
70
  replayId: string | null;
71
71
  startedAtMs: number | null;
72
+ replayLinkBaseUrl: string | null;
72
73
  sequence: number;
73
74
  /** Pre-serialized + scrubbed event JSON strings, ready to splice at flush. */
74
75
  queue: QueuedReplayEvent[];
@@ -117,6 +118,7 @@ interface StoredReplaySession {
117
118
  replayId?: string;
118
119
  startedAtMs?: number;
119
120
  sequence?: number;
121
+ linkBaseUrl?: string;
120
122
  }
121
123
 
122
124
  /** Broadcast on `SESSION_REPLAY_BROADCAST_CHANNEL_NAME` by a tab resuming a
@@ -183,6 +185,8 @@ export interface SessionReplayOptions {
183
185
  shouldStart?: () => boolean;
184
186
  publicKey?: string;
185
187
  endpoint?: string;
188
+ /** Analytics app origin used to build timestamped replay links. */
189
+ linkBaseUrl?: string;
186
190
  requireSignedInUser?: boolean;
187
191
  sampleRate?: number;
188
192
  samplingSalt?: string;
@@ -234,6 +238,22 @@ export interface SessionReplayOptions {
234
238
  | (() => Record<string, unknown> | undefined);
235
239
  }
236
240
 
241
+ export interface SessionReplayContext {
242
+ replayId: string;
243
+ sessionId: string;
244
+ startedAtMs: number;
245
+ startedAt: string;
246
+ linkBaseUrl: string | null;
247
+ active: boolean;
248
+ }
249
+
250
+ export interface SessionReplayLinkOptions {
251
+ /** Event time to seek to when the replay link opens. */
252
+ at?: Date | number | string;
253
+ /** Overrides the configured Analytics app origin for this link. */
254
+ linkBaseUrl?: string;
255
+ }
256
+
237
257
  export interface SessionReplayStartResult {
238
258
  started: boolean;
239
259
  reason?:
@@ -255,6 +275,7 @@ export interface SessionReplayStartResult {
255
275
  interface NormalizedSessionReplayOptions {
256
276
  publicKey: string;
257
277
  endpoint: string;
278
+ linkBaseUrl: string | null;
258
279
  requireSignedInUser: boolean;
259
280
  sampleRate: number;
260
281
  samplingSalt: string;
@@ -439,6 +460,7 @@ function getState(): SessionReplayState {
439
460
  startGeneration: 0,
440
461
  replayId: null,
441
462
  startedAtMs: null,
463
+ replayLinkBaseUrl: null,
442
464
  sequence: 0,
443
465
  queue: [],
444
466
  queuedBytes: 0,
@@ -472,6 +494,7 @@ function getState(): SessionReplayState {
472
494
  state.pendingFlushWaiters ??= [];
473
495
  state.awaitingFullSnapshot ??= false;
474
496
  state.startGeneration ??= 0;
497
+ state.replayLinkBaseUrl ??= null;
475
498
  return state;
476
499
  }
477
500
 
@@ -579,10 +602,14 @@ function removeStoredReplaySession(replayId: string): void {
579
602
  * `sessionStorage` snapshot, which is what the `BroadcastChannel` claim
580
603
  * check in `startSessionReplayRecorder` guards against.
581
604
  */
582
- function getOrCreateReplaySession(sessionId: string): {
605
+ function getOrCreateReplaySession(
606
+ sessionId: string,
607
+ linkBaseUrl?: string | null,
608
+ ): {
583
609
  replayId: string;
584
610
  startedAtMs: number;
585
611
  sequence: number;
612
+ linkBaseUrl?: string;
586
613
  /** True when resuming a session found in this tab's `sessionStorage`
587
614
  * (e.g. a reload), as opposed to minting a brand-new id. Only the resumed
588
615
  * case needs the duplicated-tab claim check -- a fresh id can never
@@ -604,12 +631,34 @@ function getOrCreateReplaySession(sessionId: string): {
604
631
  parsed.sequence >= 0
605
632
  ? Math.floor(parsed.sequence)
606
633
  : 0;
607
- return { replayId: parsed.replayId, startedAtMs, sequence, resumed: true };
634
+ const resolvedLinkBaseUrl = linkBaseUrl ?? parsed.linkBaseUrl;
635
+ if (linkBaseUrl && parsed.linkBaseUrl !== linkBaseUrl) {
636
+ writeStoredReplaySession({ ...parsed, linkBaseUrl });
637
+ }
638
+ return {
639
+ replayId: parsed.replayId,
640
+ startedAtMs,
641
+ sequence,
642
+ ...(resolvedLinkBaseUrl ? { linkBaseUrl: resolvedLinkBaseUrl } : {}),
643
+ resumed: true,
644
+ };
608
645
  }
609
646
  const replayId = generateReplayId();
610
647
  const startedAtMs = Date.now();
611
- writeStoredReplaySession({ sessionId, replayId, startedAtMs, sequence: 0 });
612
- return { replayId, startedAtMs, sequence: 0, resumed: false };
648
+ writeStoredReplaySession({
649
+ sessionId,
650
+ replayId,
651
+ startedAtMs,
652
+ sequence: 0,
653
+ ...(linkBaseUrl ? { linkBaseUrl } : {}),
654
+ });
655
+ return {
656
+ replayId,
657
+ startedAtMs,
658
+ sequence: 0,
659
+ ...(linkBaseUrl ? { linkBaseUrl } : {}),
660
+ resumed: false,
661
+ };
613
662
  }
614
663
 
615
664
  /**
@@ -732,12 +781,17 @@ function persistReplaySequence(
732
781
  replayId: string,
733
782
  startedAtMs: number | null,
734
783
  sequence: number,
784
+ linkBaseUrl?: string | null,
735
785
  ): void {
786
+ const existing = readStoredReplaySession();
736
787
  writeStoredReplaySession({
737
788
  sessionId,
738
789
  replayId,
739
790
  startedAtMs: startedAtMs ?? Date.now(),
740
791
  sequence,
792
+ ...(linkBaseUrl || existing?.linkBaseUrl
793
+ ? { linkBaseUrl: linkBaseUrl ?? existing?.linkBaseUrl }
794
+ : {}),
741
795
  });
742
796
  }
743
797
 
@@ -820,6 +874,22 @@ function defaultReplayEndpoint(): string {
820
874
  : DEFAULT_REPLAY_PATH;
821
875
  }
822
876
 
877
+ function normalizeReplayLinkBaseUrl(value?: string): string | null {
878
+ const raw =
879
+ value?.trim() ||
880
+ readEnvString("VITE_AGENT_NATIVE_ANALYTICS_APP_URL") ||
881
+ (typeof window !== "undefined" ? window.location.origin : "");
882
+ if (!raw) return null;
883
+ try {
884
+ return new URL(
885
+ raw,
886
+ typeof window !== "undefined" ? window.location.href : undefined,
887
+ ).origin;
888
+ } catch {
889
+ return null;
890
+ }
891
+ }
892
+
823
893
  export function getSessionReplaySamplingScore(
824
894
  sessionId: string,
825
895
  salt = DEFAULT_SAMPLING_SALT,
@@ -886,6 +956,7 @@ function normalizeOptions(
886
956
  return {
887
957
  publicKey,
888
958
  endpoint,
959
+ linkBaseUrl: normalizeReplayLinkBaseUrl(options.linkBaseUrl),
889
960
  requireSignedInUser:
890
961
  options.requireSignedInUser ??
891
962
  readEnvBoolean("VITE_AGENT_NATIVE_SESSION_REPLAY_REQUIRE_AUTH") ??
@@ -1694,6 +1765,7 @@ function advanceReplaySequence(
1694
1765
  payload.replayId,
1695
1766
  state.startedAtMs,
1696
1767
  state.sequence,
1768
+ state.replayLinkBaseUrl,
1697
1769
  );
1698
1770
  }
1699
1771
 
@@ -1709,6 +1781,7 @@ function rollbackReplaySequenceReservation(
1709
1781
  payload.replayId,
1710
1782
  state.startedAtMs,
1711
1783
  state.sequence,
1784
+ state.replayLinkBaseUrl,
1712
1785
  );
1713
1786
  }
1714
1787
 
@@ -2988,7 +3061,10 @@ async function startSessionReplayRecorder(
2988
3061
  return { started: false, reason: "disabled", sessionId, sampled };
2989
3062
  }
2990
3063
 
2991
- let replaySession = getOrCreateReplaySession(sessionId);
3064
+ let replaySession = getOrCreateReplaySession(
3065
+ sessionId,
3066
+ normalized.linkBaseUrl,
3067
+ );
2992
3068
  const instanceNonce = generateReplayId();
2993
3069
  const { channel: replayChannel, probeClaim } = createReplayClaimChannel(
2994
3070
  state,
@@ -3007,11 +3083,17 @@ async function startSessionReplayRecorder(
3007
3083
  replayId: freshReplayId,
3008
3084
  startedAtMs: freshStartedAtMs,
3009
3085
  sequence: 0,
3086
+ ...(normalized.linkBaseUrl
3087
+ ? { linkBaseUrl: normalized.linkBaseUrl }
3088
+ : {}),
3010
3089
  });
3011
3090
  replaySession = {
3012
3091
  replayId: freshReplayId,
3013
3092
  startedAtMs: freshStartedAtMs,
3014
3093
  sequence: 0,
3094
+ ...(normalized.linkBaseUrl
3095
+ ? { linkBaseUrl: normalized.linkBaseUrl }
3096
+ : {}),
3015
3097
  resumed: false,
3016
3098
  };
3017
3099
  }
@@ -3033,6 +3115,8 @@ async function startSessionReplayRecorder(
3033
3115
  state.options = normalized;
3034
3116
  state.replayId = replaySession.replayId;
3035
3117
  state.startedAtMs = replaySession.startedAtMs;
3118
+ state.replayLinkBaseUrl =
3119
+ replaySession.linkBaseUrl ?? normalized.linkBaseUrl ?? null;
3036
3120
  state.sequence = replaySession.sequence;
3037
3121
  state.queue = [];
3038
3122
  state.queuedBytes = 0;
@@ -3195,6 +3279,75 @@ export function getSessionReplayId(): string | null {
3195
3279
  return stored?.replayId ?? null;
3196
3280
  }
3197
3281
 
3282
+ /**
3283
+ * Return the replay identity associated with this browser tab. The context is
3284
+ * intentionally small so it can be attached to analytics events without
3285
+ * exposing replay content or credentials.
3286
+ */
3287
+ export function getSessionReplayContext(): SessionReplayContext | null {
3288
+ const state = getState();
3289
+ if (state.active && state.replayId && state.startedAtMs) {
3290
+ const sessionId = getOrCreateAnalyticsSessionId();
3291
+ if (!sessionId) return null;
3292
+ return {
3293
+ replayId: state.replayId,
3294
+ sessionId,
3295
+ startedAtMs: state.startedAtMs,
3296
+ startedAt: new Date(state.startedAtMs).toISOString(),
3297
+ linkBaseUrl: state.replayLinkBaseUrl,
3298
+ active: true,
3299
+ };
3300
+ }
3301
+
3302
+ const stored = readStoredReplaySession();
3303
+ if (!stored?.replayId || !stored.sessionId || !stored.startedAtMs) {
3304
+ return null;
3305
+ }
3306
+ return {
3307
+ replayId: stored.replayId,
3308
+ sessionId: stored.sessionId,
3309
+ startedAtMs: stored.startedAtMs,
3310
+ startedAt: new Date(stored.startedAtMs).toISOString(),
3311
+ linkBaseUrl: stored.linkBaseUrl ?? null,
3312
+ active: false,
3313
+ };
3314
+ }
3315
+
3316
+ /**
3317
+ * Build a scoped Analytics replay lookup link. The Analytics server resolves
3318
+ * the client replay id to its server recording id and converts the event time
3319
+ * into the replay player's offset before redirecting to the detail page.
3320
+ */
3321
+ export function getSessionReplayUrl(
3322
+ options: SessionReplayLinkOptions = {},
3323
+ ): string | null {
3324
+ const context = getSessionReplayContext();
3325
+ if (!context) return null;
3326
+ const base = normalizeReplayLinkBaseUrl(
3327
+ options.linkBaseUrl ?? context.linkBaseUrl ?? undefined,
3328
+ );
3329
+ if (!base) return null;
3330
+
3331
+ try {
3332
+ const url = new URL("/sessions/lookup", base);
3333
+ url.searchParams.set("sessionId", context.sessionId);
3334
+ url.searchParams.set("replayId", context.replayId);
3335
+ const at = options.at === undefined ? Date.now() : options.at;
3336
+ const timestamp =
3337
+ typeof at === "number"
3338
+ ? new Date(at)
3339
+ : typeof at === "string"
3340
+ ? new Date(at)
3341
+ : at;
3342
+ if (!Number.isNaN(timestamp.getTime())) {
3343
+ url.searchParams.set("at", timestamp.toISOString());
3344
+ }
3345
+ return url.toString();
3346
+ } catch {
3347
+ return null;
3348
+ }
3349
+ }
3350
+
3198
3351
  /**
3199
3352
  * Surface a manually captured exception on the active session replay timeline
3200
3353
  * as an `agent-native.console` custom event, reusing the diagnostics contract
@@ -9,15 +9,17 @@ import {
9
9
  IconPlus,
10
10
  IconTrash,
11
11
  } from "@tabler/icons-react";
12
- import { useCallback, useState } from "react";
12
+ import { useCallback, useState, type ReactNode } from "react";
13
13
 
14
14
  import { sendToAgentChat } from "../agent-chat.js";
15
+ import { AgentEmptyState } from "../agent-page/AgentEmptyState.js";
15
16
  import {
16
17
  useAutomations,
17
18
  useManageAutomation,
18
19
  type Automation,
19
20
  type JobsScope,
20
21
  } from "../agent-page/use-jobs.js";
22
+ import { AgentAskPopover } from "../AgentAskPopover.js";
21
23
  import { agentNativePath } from "../api-path.js";
22
24
  import {
23
25
  Dialog,
@@ -39,6 +41,7 @@ export interface AutomationsListProps {
39
41
  scope?: JobsScope;
40
42
  compact?: boolean;
41
43
  emptyMessage?: string;
44
+ emptyState?: ReactNode;
42
45
  }
43
46
 
44
47
  export const AUTOMATION_CREATION_SCOPE = "personal" as const;
@@ -51,6 +54,7 @@ export function AutomationsList({
51
54
  scope = "user",
52
55
  compact = false,
53
56
  emptyMessage,
57
+ emptyState,
54
58
  }: AutomationsListProps) {
55
59
  const t = useT();
56
60
  const { formatDate } = useFormatters();
@@ -93,14 +97,31 @@ export function AutomationsList({
93
97
 
94
98
  const automations = query.data ?? [];
95
99
  if (automations.length === 0) {
100
+ if (emptyState) return emptyState;
96
101
  return (
97
- <p className="text-sm text-muted-foreground">
98
- {emptyMessage ??
99
- t("jobs.automationsEmpty", {
100
- defaultValue:
101
- "No automations yet. Ask the agent to set up an event-triggered or scheduled task.",
102
- })}
103
- </p>
102
+ <AgentEmptyState
103
+ icon={IconBolt}
104
+ title={t("jobs.automationsEmptyTitle", {
105
+ defaultValue: "No automations yet",
106
+ })}
107
+ description={
108
+ emptyMessage ??
109
+ t("jobs.automationsEmptyDescription", {
110
+ defaultValue: "Describe what should happen and when.",
111
+ })
112
+ }
113
+ action={
114
+ <AgentAskPopover
115
+ context={automationCreationContext()}
116
+ prompt={t("jobs.automationPrompt", {
117
+ defaultValue: "Create an automation that does this: ",
118
+ })}
119
+ title={t("jobs.automationsCreateTitle", {
120
+ defaultValue: "Create an automation",
121
+ })}
122
+ />
123
+ }
124
+ />
104
125
  );
105
126
  }
106
127
 
@@ -487,8 +508,7 @@ export function AutomationsSection() {
487
508
  scope="user"
488
509
  compact
489
510
  emptyMessage={t("jobs.automationsEmptySettings", {
490
- defaultValue:
491
- 'No automations yet. Click "New automation" or ask the agent to set one up.',
511
+ defaultValue: "Describe what should happen and when.",
492
512
  })}
493
513
  />
494
514
  </div>
@@ -5,6 +5,7 @@ import {
5
5
  IconCheck,
6
6
  IconExternalLink,
7
7
  IconBrain,
8
+ IconHierarchy2,
8
9
  IconBrowser,
9
10
  IconGitBranch,
10
11
  IconCloud,
@@ -3104,7 +3105,7 @@ export function useAgentSettingsTabs(): SettingsTabItem[] {
3104
3105
  id: "agent" | "connections" | "organization" | "workspace",
3105
3106
  ) => {
3106
3107
  const tab = searchTabs.find((candidate) => candidate.id === id);
3107
- if (!tab) throw new Error(`Missing agent settings tab: ${id}`);
3108
+ if (!tab) throw new Error(`Missing agent workspace tab: ${id}`);
3108
3109
  return tab;
3109
3110
  };
3110
3111
  const agent = searchTab("agent");
@@ -3114,7 +3115,7 @@ export function useAgentSettingsTabs(): SettingsTabItem[] {
3114
3115
  return [
3115
3116
  {
3116
3117
  ...agent,
3117
- icon: IconBrain,
3118
+ icon: IconHierarchy2,
3118
3119
  group: "agent",
3119
3120
  content: (
3120
3121
  <SettingsPanelContent
@@ -49,6 +49,8 @@ export interface SettingsTabItem {
49
49
  label: string;
50
50
  icon?: SettingsTabIcon;
51
51
  content: ReactNode;
52
+ /** Whether a parent surface may expose a personal/organization scope for this tab. */
53
+ scopeAware?: boolean;
52
54
  /**
53
55
  * Optional visual navigation group. Adjacent tabs with the same group render
54
56
  * together; a quiet divider separates each group on desktop while mobile
@@ -194,8 +194,8 @@ export function getAgentSettingsSearchTabs(): AgentSettingsSearchTab[] {
194
194
  return [
195
195
  {
196
196
  id: "agent",
197
- label: "Agent",
198
- keywords: "agent model llm limits voice automations",
197
+ label: "Agent workspace",
198
+ keywords: "agent workspace model llm limits voice automations",
199
199
  searchEntries: buildSectionSearchEntries(AGENT_SETTINGS_SECTIONS),
200
200
  },
201
201
  {
@@ -6,6 +6,8 @@ export interface ChatThreadScope {
6
6
  type: string;
7
7
  id: string;
8
8
  label?: string;
9
+ /** Composer context key used by ambient resource context adapters. */
10
+ contextKey?: string;
9
11
  }
10
12
 
11
13
  export interface ChatThreadSummary {
@@ -22,6 +22,7 @@ export type WorkspaceConnectionTemplateUse =
22
22
  export type WorkspaceConnectionProviderId =
23
23
  | "slack"
24
24
  | "github"
25
+ | "figma"
25
26
  | "notion"
26
27
  | "gmail"
27
28
  | "google_drive"
@@ -44,6 +45,13 @@ export interface WorkspaceConnectionProvider {
44
45
  credentialKeys: readonly WorkspaceConnectionCredentialKey[];
45
46
  capabilities: readonly WorkspaceConnectionCapability[];
46
47
  recommendedTemplateUses: readonly WorkspaceConnectionTemplateUse[];
48
+ oauth?: {
49
+ provider: string;
50
+ authorizationUrl: string;
51
+ tokenUrl: string;
52
+ refreshUrl?: string;
53
+ scopes: readonly string[];
54
+ };
47
55
  }
48
56
 
49
57
  export interface ListWorkspaceConnectionProvidersOptions {
@@ -93,19 +101,47 @@ export const WORKSPACE_CONNECTION_PROVIDERS = [
93
101
  recommendedTemplateUses: ["brain", "analytics", "dispatch"],
94
102
  }),
95
103
  defineWorkspaceConnectionProvider({
96
- id: "notion",
97
- label: "Notion",
104
+ id: "figma",
105
+ label: "Figma",
98
106
  description:
99
- "Workspace docs, wikis, pages, and databases for knowledge capture and search.",
107
+ "Design files, frames, components, rendered previews, and library context for creative workflows.",
100
108
  credentialKeys: [
101
109
  {
102
- key: "NOTION_API_KEY",
103
- label: "Notion API key",
110
+ key: "FIGMA_ACCESS_TOKEN",
111
+ label: "Figma personal access token (fallback)",
104
112
  description:
105
- "Integration secret with access to the pages or databases shared with the integration.",
106
- required: true,
113
+ "Optional fallback for local or individual use. Workspace OAuth is preferred.",
114
+ required: false,
107
115
  },
108
116
  ],
117
+ oauth: {
118
+ provider: "figma",
119
+ authorizationUrl: "https://www.figma.com/oauth",
120
+ tokenUrl: "https://api.figma.com/v1/oauth/token",
121
+ refreshUrl: "https://api.figma.com/v1/oauth/token",
122
+ scopes: [
123
+ "current_user:read",
124
+ "file_content:read",
125
+ "file_metadata:read",
126
+ "projects:read",
127
+ ],
128
+ },
129
+ capabilities: ["search", "import", "docs"],
130
+ recommendedTemplateUses: ["brain", "design", "slides", "content"],
131
+ }),
132
+ defineWorkspaceConnectionProvider({
133
+ id: "notion",
134
+ label: "Notion",
135
+ description:
136
+ "Workspace docs, wikis, pages, and databases for knowledge capture and search.",
137
+ credentialKeys: [],
138
+ oauth: {
139
+ provider: "notion",
140
+ authorizationUrl: "https://api.notion.com/v1/oauth/authorize",
141
+ tokenUrl: "https://api.notion.com/v1/oauth/token",
142
+ refreshUrl: "https://api.notion.com/v1/oauth/token",
143
+ scopes: [],
144
+ },
109
145
  capabilities: ["search", "import", "docs"],
110
146
  recommendedTemplateUses: ["brain", "content", "dispatch"],
111
147
  }),
@@ -148,6 +184,12 @@ export const WORKSPACE_CONNECTION_PROVIDERS = [
148
184
  ],
149
185
  capabilities: ["search", "import", "docs"],
150
186
  recommendedTemplateUses: ["brain", "content", "slides", "dispatch"],
187
+ oauth: {
188
+ provider: "google",
189
+ authorizationUrl: "https://accounts.google.com/o/oauth2/v2/auth",
190
+ tokenUrl: "https://oauth2.googleapis.com/token",
191
+ scopes: ["https://www.googleapis.com/auth/drive.file"],
192
+ },
151
193
  }),
152
194
  defineWorkspaceConnectionProvider({
153
195
  id: "hubspot",
@@ -31,11 +31,16 @@ export async function createDb(config: DbConfig) {
31
31
  export type DrizzleDb = Awaited<ReturnType<typeof createDb>>;
32
32
 
33
33
  export { createGetDb } from "./create-get-db.js";
34
- export { runMigrations } from "./migrations.js";
34
+ export {
35
+ runMigrations,
36
+ type MigrationEntry,
37
+ type MigrationSql,
38
+ } from "./migrations.js";
35
39
  export {
36
40
  getDbExec,
37
41
  createDbExec,
38
42
  getDialect,
43
+ isLocalDatabase,
39
44
  isPostgres,
40
45
  intType,
41
46
  closeDbExec,