@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
@@ -40,6 +40,7 @@ export interface SaveImportedDesignFilesInput {
40
40
  files: ImportedDesignFile[];
41
41
  sourceType: string;
42
42
  warnings?: string[];
43
+ preserveExactContent?: boolean;
43
44
  }
44
45
 
45
46
  export interface SavedImportedDesignFile {
@@ -231,14 +232,11 @@ export async function saveImportedDesignFiles(
231
232
  usedFilenames,
232
233
  );
233
234
  const fileId = nanoid();
234
- // Stamp missing data-agent-native-node-id attributes before persisting
235
- // so imported screens are fully addressable by id-keyed editor
236
- // operations immediately, instead of depending on a client-side
237
- // backfill the first time someone opens the imported screen.
238
- const annotatedContent = annotateScreenHtmlForPersist(
239
- file.content,
240
- file.fileType,
241
- );
235
+ // Exact native clones are immutable source evidence. Other imports are
236
+ // annotated before persistence so editor operations can address nodes.
237
+ const annotatedContent = input.preserveExactContent
238
+ ? file.content
239
+ : annotateScreenHtmlForPersist(file.content, file.fileType);
242
240
  await tx.insert(schema.designFiles).values({
243
241
  id: fileId,
244
242
  designId,
@@ -0,0 +1,31 @@
1
+ import { registerOnboardingStep } from "@agent-native/core/onboarding";
2
+ import { setupCreativeContext } from "@agent-native/creative-context/server";
3
+ import { listContextSources } from "@agent-native/creative-context/store";
4
+
5
+ registerOnboardingStep({
6
+ id: "creative-context-library",
7
+ order: 18,
8
+ required: false,
9
+ title: "Connect your creative library",
10
+ description:
11
+ "Connect prior work and reference sources so agents can reuse approved creative context.",
12
+ methods: [
13
+ {
14
+ id: "library",
15
+ kind: "link",
16
+ primary: true,
17
+ label: "Open Library",
18
+ payload: { url: "/agent#library", external: false },
19
+ },
20
+ ],
21
+ isComplete: async () => {
22
+ try {
23
+ const result = await listContextSources({ limit: 1 });
24
+ return result.sources.length > 0;
25
+ } catch {
26
+ return false;
27
+ }
28
+ },
29
+ });
30
+
31
+ export default setupCreativeContext({ appId: "design" });
@@ -1,3 +1,5 @@
1
+ import type { CreativeContextReuseLabel } from "@agent-native/creative-context";
2
+
1
3
  import type { AssignedCanvasRegion } from "./canvas-math";
2
4
 
3
5
  export type DesignGenerationSessionStatus =
@@ -37,6 +39,11 @@ export interface DesignGenerationSession {
37
39
  designSystemId?: string;
38
40
  prompt: string;
39
41
  contextRefs: string[];
42
+ creativeContext?: {
43
+ contextMode: "off" | "auto" | "pinned";
44
+ contextPackId: string | null;
45
+ reuseLabels: CreativeContextReuseLabel[];
46
+ };
40
47
  frames: DesignGenerationFrame[];
41
48
  startedAt: string;
42
49
  }
@@ -37,10 +37,10 @@ const enUS = {
37
37
  deliveryDescription:
38
38
  "Manage message destinations and check the outbound delivery queue.",
39
39
  openDelivery: "Open delivery",
40
- agentTitle: "Agent settings",
40
+ agentTitle: "Agent workspace",
41
41
  agentDescription:
42
- "Open the agent sidebar settings for model, API keys, voice, and other agent controls. Use the Automations page for scheduled and event-triggered jobs.",
43
- openAgentSettings: "Open agent settings",
42
+ "Open the agent workspace for model, API keys, voice, and other agent controls. Use the Automations page for scheduled and event-triggered jobs.",
43
+ openAgentSettings: "Open agent workspace",
44
44
  },
45
45
  integrations: {
46
46
  title: "Integrations",
@@ -34,10 +34,10 @@ const messages = {
34
34
  "Manage team members, organization access, and shared workspace preferences.",
35
35
  openTeamSettings: "Open team settings",
36
36
  openResourceSettings: "Open resource settings",
37
- agentTitle: "Agent settings",
37
+ agentTitle: "Agent workspace",
38
38
  agentDescription:
39
- "Open the agent sidebar settings for model, API keys, automations, voice, and other agent controls.",
40
- openAgentSettings: "Open agent settings",
39
+ "Open the agent workspace for model, API keys, automations, voice, and other agent controls.",
40
+ openAgentSettings: "Open agent workspace",
41
41
  },
42
42
  agent: {
43
43
  emptyState: "Ask me anything about your forms",
@@ -30,10 +30,10 @@ const messages = {
30
30
  "Manage team members, organization access, and shared workspace preferences.",
31
31
  openTeamSettings: "Open team settings",
32
32
  openResourceSettings: "Open resource settings",
33
- agentTitle: "Agent settings",
33
+ agentTitle: "Agent workspace",
34
34
  agentDescription:
35
- "Open the agent sidebar settings for model, API keys, automations, voice, and other agent controls.",
36
- openAgentSettings: "Open agent settings",
35
+ "Open the agent workspace for model, API keys, automations, voice, and other agent controls.",
36
+ openAgentSettings: "Open agent workspace",
37
37
  },
38
38
  agent: {
39
39
  emptyState: "Just tell me what you ate — I'll estimate the macros",
@@ -2544,6 +2544,29 @@ function sanitizeEmailHtml(html: string): SanitizedEmailHtml {
2544
2544
  };
2545
2545
  }
2546
2546
 
2547
+ function measureEmailDocumentHeight(doc: Document): number {
2548
+ const body = doc.body;
2549
+ const root = doc.documentElement;
2550
+ if (!body || !root) return 0;
2551
+
2552
+ const bodyTop = body.getBoundingClientRect().top;
2553
+ let contentBottom = body.getBoundingClientRect().bottom - bodyTop;
2554
+ for (const element of body.querySelectorAll<HTMLElement>("*")) {
2555
+ const rect = element.getBoundingClientRect();
2556
+ contentBottom = Math.max(contentBottom, rect.bottom - bodyTop);
2557
+ }
2558
+
2559
+ return Math.ceil(
2560
+ Math.max(
2561
+ body.scrollHeight,
2562
+ body.offsetHeight,
2563
+ root.scrollHeight,
2564
+ root.offsetHeight,
2565
+ contentBottom,
2566
+ ),
2567
+ );
2568
+ }
2569
+
2547
2570
  function HtmlEmailBody({
2548
2571
  html,
2549
2572
  senderEmail,
@@ -2709,10 +2732,8 @@ function HtmlEmailBody({
2709
2732
  doc.head.appendChild(themeStyle);
2710
2733
 
2711
2734
  const resize = () => {
2712
- if (doc.body) {
2713
- const h = doc.body.scrollHeight;
2714
- if (h > 0) setHeight(h);
2715
- }
2735
+ const h = measureEmailDocumentHeight(doc);
2736
+ if (h > 0) setHeight((current) => (current === h ? current : h));
2716
2737
  };
2717
2738
 
2718
2739
  const normalizeText = (value: string | null | undefined) =>
@@ -3187,6 +3208,12 @@ function HtmlEmailBody({
3187
3208
  const images = doc.querySelectorAll("img");
3188
3209
  images.forEach((img) => img.addEventListener("load", resize));
3189
3210
 
3211
+ const resizeObserver =
3212
+ typeof ResizeObserver !== "undefined" ? new ResizeObserver(resize) : null;
3213
+ resizeObserver?.observe(doc.documentElement);
3214
+ if (doc.body) resizeObserver?.observe(doc.body);
3215
+ window.addEventListener("resize", resize);
3216
+
3190
3217
  resize();
3191
3218
  const timer = setTimeout(resize, 100);
3192
3219
  const timer2 = setTimeout(resize, 500);
@@ -3198,6 +3225,8 @@ function HtmlEmailBody({
3198
3225
  clearTimeout(timer);
3199
3226
  clearTimeout(timer2);
3200
3227
  images.forEach((img) => img.removeEventListener("load", resize));
3228
+ resizeObserver?.disconnect();
3229
+ window.removeEventListener("resize", resize);
3201
3230
  themeStyle.remove();
3202
3231
  };
3203
3232
  }, [
@@ -3266,7 +3295,7 @@ function HtmlEmailBody({
3266
3295
  }
3267
3296
 
3268
3297
  // Recalculate height after injecting marks
3269
- const h = doc.body.scrollHeight;
3298
+ const h = measureEmailDocumentHeight(doc);
3270
3299
  if (h > 0) setHeight(h);
3271
3300
  };
3272
3301
 
@@ -3338,6 +3367,7 @@ function HtmlEmailBody({
3338
3367
  data-agent-native-session-replay=""
3339
3368
  srcDoc={iframeDocument}
3340
3369
  sandbox="allow-same-origin allow-popups allow-popups-to-escape-sandbox"
3370
+ scrolling="no"
3341
3371
  style={{
3342
3372
  width: "100%",
3343
3373
  height: `${height}px`,
@@ -438,10 +438,10 @@ const messages = {
438
438
  suggestionWidget: "Build me a custom widget for my inbox",
439
439
  },
440
440
  settings: {
441
- openAgentSettings: "Open agent settings",
441
+ openAgentSettings: "Open agent workspace",
442
442
  agentDescription:
443
- "Open the agent sidebar settings for model, API keys, automations, voice, and other agent controls.",
444
- agentTitle: "Agent settings",
443
+ "Open the agent workspace for model, API keys, automations, voice, and other agent controls.",
444
+ agentTitle: "Agent workspace",
445
445
  aliasName: "Alias name",
446
446
  aliasNamePlaceholder: "e.g. Design team",
447
447
  recipientsOnePerLine: "Recipients (one email per line)",
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-16
4
+ ---
5
+
6
+ Mail previews now expand to show the full message without an inner scrollbar
@@ -191,12 +191,22 @@ forward only the code-research and plan-composition guidance here.
191
191
  targeted `contentPatches`.
192
192
  Treat the top-level `content` payload as a full replacement, not a merge; do
193
193
  not send a partial `content` object to add a canvas or one block. If a full
194
- replacement is unavoidable, first read the complete plan source/content, carry
195
- forward every existing block and visual surface, and verify the source/export
196
- afterward so the document body was not truncated. When the user wants
197
- source-control friendly edits, use `patch-visual-plan-source` against the MDX
198
- files instead of regenerating the plan.
199
- 7. For hosted plans, export with `export-visual-plan` only when the user wants a
194
+ replacement or `replace-blocks` is unavoidable, call `get-visual-plan`
195
+ immediately before the write, pass its `plan.updatedAt` as
196
+ `expectedUpdatedAt`, and carry forward every existing block and visual
197
+ surface. Never reuse a revision from an earlier read or feedback payload.
198
+ For source-control friendly edits, use granular `patch-visual-plan-source`
199
+ operations against the MDX files instead of regenerating the plan;
200
+ `replace-file` is also destructive and requires the same fresh
201
+ `expectedUpdatedAt` fence.
202
+ 7. After every hosted-plan write, call `get-visual-plan` again and compare the
203
+ persisted text, block IDs/counts, canvas frames, and prototype with the
204
+ intended result. A successful mutation response is not proof that unrelated
205
+ content survived. If the edit addressed agent-targeted feedback, only after
206
+ this verification call `resolve-plan-comment` for the thread and
207
+ `consume-plan-feedback` for its comments; do both so addressed feedback is
208
+ neither visibly open nor returned as pending work.
209
+ 8. For hosted plans, export with `export-visual-plan` only when the user wants a
200
210
  shareable receipt or repo-check-in artifacts.
201
211
 
202
212
  ## Self-Review Before Handoff
@@ -345,14 +355,20 @@ directory before authoring a plan.
345
355
  - `create-visual-questions`: use only when the user explicitly asks for a visual
346
356
  intake questionnaire, not as `/visual-plan` preflight.
347
357
  - `update-visual-plan`: revise content, status, or comments with targeted
348
- `contentPatches` (see Core Workflow step 6).
358
+ `contentPatches` (see Core Workflow steps 6-7). `replace-blocks` and full
359
+ `content` replacement require `expectedUpdatedAt` from a fresh
360
+ `get-visual-plan` call.
349
361
  - `read-visual-plan-source`: read the normalized plan as `plan.mdx`,
350
362
  optional `canvas.mdx`, optional `.plan-state.json`, and JSON.
351
363
  - `patch-visual-plan-source`: apply granular MDX AST patches by stable block,
352
- artboard, annotation, component, or wireframe-node id.
364
+ artboard, annotation, component, or wireframe-node id. Prefer those targeted
365
+ operations; `replace-file` requires `expectedUpdatedAt` from a fresh
366
+ `get-visual-plan` call.
353
367
  - `import-visual-plan-source`: create or replace a plan from an MDX folder.
354
- - `get-visual-plan`: read the current structured plan, exported HTML, and
355
- annotations; it also returns the MDX folder for source workflows.
368
+ - `get-visual-plan`: read the current structured plan, exported HTML,
369
+ annotations, and `plan.updatedAt`; it also returns the MDX folder for source
370
+ workflows. Re-read immediately before a destructive write for its concurrency
371
+ fence and again after every write to verify persisted state.
356
372
  - `get-plan-feedback`: read unconsumed human feedback. Use it frequently; it
357
373
  returns grouped threads, exact anchor details, expected resolver, and recent
358
374
  review-event payloads so agents can act only on the comments meant for them.
@@ -411,7 +427,10 @@ local bridge check/serve/verify command, and report the new local URL.
411
427
  - **Two-axis state.** Mark every ingested comment as consumed
412
428
  (`consumedCommentIds` on `update-visual-plan`). Set `status=resolved` only on
413
429
  agent-targeted comments you actually addressed; leave human-targeted comments
414
- open.
430
+ open. When an edit addresses feedback, first re-read the persisted plan and
431
+ verify the requested change. Only then call `resolve-plan-comment` for the
432
+ addressed thread and `consume-plan-feedback` for its comments; never mark
433
+ addressed feedback along only one axis.
415
434
 
416
435
  ## Visibility & Sharing
417
436
 
@@ -40,6 +40,17 @@ review before code changes happen.
40
40
  - Surface material assumptions only when they change behavior, data, security,
41
41
  tests, deployment, or definition of done.
42
42
  - Before edits, read pending feedback with `get-plan-feedback`.
43
+ - Before any destructive hosted-plan write (`replace-blocks`, a top-level
44
+ `content` replacement, or a source `replace-file`), call `get-visual-plan`
45
+ immediately before the write and pass its `plan.updatedAt` as
46
+ `expectedUpdatedAt`. Never reuse a revision from an earlier read. Prefer
47
+ targeted content or source patches whenever they can express the edit.
48
+ - After every hosted-plan write, call `get-visual-plan` again and verify the
49
+ persisted text, blocks, canvas, and prototype before claiming success. If the
50
+ write addressed agent-targeted feedback, call `resolve-plan-comment` and
51
+ `consume-plan-feedback` only after this verification; addressed feedback must
52
+ be both resolved and consumed so it neither remains visibly open nor returns
53
+ as pending work.
43
54
 
44
55
  ## Application State
45
56
 
@@ -185,6 +196,11 @@ sync-guarded skills (not just one stored plan) so the improvement sticks.
185
196
  persists the runtime model. Prefer this over regenerating a whole plan when the
186
197
  requested change is a few lines, one annotation, one artboard, or one
187
198
  wireframe node.
199
+ - `replace-file` is a destructive source operation. Use it only when targeted
200
+ source patches cannot express the edit, after a fresh `get-visual-plan`, and
201
+ pass that read's `plan.updatedAt` as `expectedUpdatedAt`. Re-read the plan
202
+ after the patch and verify that unrelated MDX files and visual surfaces were
203
+ preserved.
188
204
  - In Agent Native Desktop, the Plan menu can link a user-chosen local folder for
189
205
  the current plan, write the exported MDX files to it, import local edits back
190
206
  through `import-visual-plan-source`, and optionally auto-export whenever the
@@ -263,7 +279,11 @@ elementId, styles }]`. Elements must have `data-design-id` or
263
279
  reconcile, never drop. Act on `resolutionTarget=agent`; treat `human` as
264
280
  context only; `@mentions` are notification signals, not routing. Mark ingested
265
281
  comments consumed (`consumedCommentIds`); set `status=resolved` only on
266
- agent-targeted comments you actually addressed.
282
+ agent-targeted comments you actually addressed. When a plan write addresses
283
+ feedback, do not resolve or consume it until a post-write `get-visual-plan`
284
+ confirms the requested change persisted. Then do both: call
285
+ `resolve-plan-comment` for the addressed thread and `consume-plan-feedback`
286
+ for its comments.
267
287
  - New human comments send best-effort transactional email when email is
268
288
  configured: root comments and replies notify the plan owner, @mentioned
269
289
  members, and replies also notify prior human participants in that thread.
@@ -20,7 +20,7 @@ const queryBooleanSchema = z.preprocess((value) => {
20
20
 
21
21
  export default defineAction({
22
22
  description:
23
- "Get an Agent-Native Plan bundle, including structured editable content with stable block IDs, source-control friendly MDX, exported HTML, sections, comments, and recent activity. Call this before targeted contentPatches, source patches, or resolving feedback on a specific plan.",
23
+ "Get an Agent-Native Plan bundle, including structured editable content with stable block IDs, source-control friendly MDX, exported HTML, sections, comments, and recent activity. Call this before targeted contentPatches, source patches, or resolving feedback on a specific plan. For full content replacement, replace-blocks, or replace-file, pass the returned plan.updatedAt exactly as expectedUpdatedAt and reread after the write.",
24
24
  schema: z.object({
25
25
  id: z.string().describe("Plan ID"),
26
26
  includeMdx: queryBooleanSchema
@@ -1,3 +1,5 @@
1
+ import { createHash } from "node:crypto";
2
+
1
3
  import { defineAction } from "@agent-native/core";
2
4
  import { agentTouchDocument } from "@agent-native/core/collab";
3
5
  import { and, eq } from "drizzle-orm";
@@ -24,12 +26,137 @@ import {
24
26
  planPath,
25
27
  writeEvent,
26
28
  } from "../server/plans.js";
29
+ import type { PlanContent } from "../shared/plan-content.js";
30
+
31
+ type PlanSurfaceCounts = {
32
+ blocks: number;
33
+ canvasFrames: number;
34
+ prototypeScreens: number;
35
+ };
36
+
37
+ function planSurfaceCounts(content: PlanContent | null | undefined) {
38
+ return {
39
+ blocks: content?.blocks.length ?? 0,
40
+ canvasFrames: content?.canvas?.frames.length ?? 0,
41
+ prototypeScreens: content?.prototype?.screens.length ?? 0,
42
+ } satisfies PlanSurfaceCounts;
43
+ }
44
+
45
+ function stableJson(value: unknown): string {
46
+ if (value === null) return "null";
47
+ if (value === undefined) return "undefined";
48
+ if (Array.isArray(value)) {
49
+ return `[${value
50
+ .map((item) => (item === undefined ? "null" : stableJson(item)))
51
+ .join(",")}]`;
52
+ }
53
+ if (typeof value === "object") {
54
+ const record = value as Record<string, unknown>;
55
+ const pairs = Object.keys(record)
56
+ .filter((key) => record[key] !== undefined)
57
+ .sort()
58
+ .map((key) => `${JSON.stringify(key)}:${stableJson(record[key])}`);
59
+ return `{${pairs.join(",")}}`;
60
+ }
61
+ return JSON.stringify(value) ?? "null";
62
+ }
63
+
64
+ function stableContentHash(content: PlanContent | null | undefined) {
65
+ return `sha256:${createHash("sha256")
66
+ .update(stableJson(content ?? null))
67
+ .digest("hex")}`;
68
+ }
69
+
70
+ function sanitizeAuditIdentifier(value: string) {
71
+ return (
72
+ value
73
+ .trim()
74
+ .replace(/[^a-zA-Z0-9._:-]+/g, "_")
75
+ .slice(0, 120) || "unknown"
76
+ );
77
+ }
78
+
79
+ function sourcePatchAuditTarget(
80
+ patch: z.infer<typeof planMdxSourcePatchesSchema>[number],
81
+ ) {
82
+ switch (patch.op) {
83
+ case "replace-file":
84
+ return { op: patch.op, file: patch.file };
85
+ case "replace-markdown-block":
86
+ return {
87
+ op: patch.op,
88
+ target: sanitizeAuditIdentifier(patch.blockId),
89
+ };
90
+ case "update-component-prop":
91
+ return {
92
+ op: patch.op,
93
+ file: patch.file,
94
+ target: sanitizeAuditIdentifier(patch.componentId),
95
+ prop: sanitizeAuditIdentifier(patch.prop),
96
+ };
97
+ case "update-wireframe-node":
98
+ return {
99
+ op: patch.op,
100
+ target: sanitizeAuditIdentifier(patch.nodeId),
101
+ };
102
+ case "update-annotation":
103
+ return {
104
+ op: patch.op,
105
+ target: sanitizeAuditIdentifier(patch.annotationId),
106
+ };
107
+ case "replace-artboard":
108
+ return {
109
+ op: patch.op,
110
+ target: sanitizeAuditIdentifier(patch.artboardId),
111
+ };
112
+ }
113
+ }
114
+
115
+ function assertNoUnexpectedSurfaceCollapse(
116
+ before: PlanSurfaceCounts,
117
+ after: PlanSurfaceCounts,
118
+ allowDestructive: boolean,
119
+ ) {
120
+ if (allowDestructive) return;
121
+
122
+ const candidates: Array<[label: string, before: number, after: number]> = [
123
+ ["blocks", before.blocks, after.blocks],
124
+ ["canvas frames", before.canvasFrames, after.canvasFrames],
125
+ ["prototype screens", before.prototypeScreens, after.prototypeScreens],
126
+ ];
127
+ const collapsed = candidates
128
+ .filter(
129
+ ([, beforeCount, afterCount]) => beforeCount > 0 && afterCount === 0,
130
+ )
131
+ .map(([label, beforeCount]) => `${label} (${beforeCount} to 0)`);
132
+
133
+ if (collapsed.length === 0) return;
134
+ throw new Error(
135
+ `Source patch blocked because it would unexpectedly remove all ${collapsed.join(
136
+ ", ",
137
+ )}. Reload the plan and use granular patches, or retry with allowDestructive: true if clearing those surfaces is intentional.`,
138
+ );
139
+ }
27
140
 
28
141
  export default defineAction({
29
142
  description:
30
143
  "Patch the MDX source for an Agent-Native Plan by stable semantic IDs, then normalize it back into runtime JSON. Use ONLY when working with exported MDX source files (repo check-in workflows); for live plans prefer update-visual-plan with contentPatches. Suitable for tiny source-control friendly diffs: one markdown block, one artboard, one annotation, or one wireframe node.",
31
144
  schema: z.object({
32
145
  planId: z.string().describe("Plan ID"),
146
+ expectedUpdatedAt: z
147
+ .string()
148
+ .min(1)
149
+ .optional()
150
+ .describe(
151
+ "Revision from the latest plan read. Required for replace-file and checked before source patching so stale full-file replacements cannot overwrite newer work.",
152
+ ),
153
+ allowDestructive: z
154
+ .boolean()
155
+ .optional()
156
+ .default(false)
157
+ .describe(
158
+ "Allow an intentional nonempty-to-empty collapse of plan blocks, canvas frames, or prototype screens. Defaults to false.",
159
+ ),
33
160
  patches: planMdxSourcePatchesSchema.describe(
34
161
  "AST-backed MDX source patches. Prefer targeted ops over replace-file whenever possible so diffs stay small.",
35
162
  ),
@@ -52,6 +179,22 @@ export default defineAction({
52
179
  await assertPlanEditor(args.planId);
53
180
  const bundle = await loadPlanBundle(args.planId);
54
181
  const versionAtLoad = bundle.plan.updatedAt;
182
+ const hasReplaceFile = args.patches.some(
183
+ (patch) => patch.op === "replace-file",
184
+ );
185
+ if (hasReplaceFile && !args.expectedUpdatedAt) {
186
+ throw new Error(
187
+ "replace-file requires expectedUpdatedAt from the latest plan read. Reload the plan and retry with its current updatedAt value.",
188
+ );
189
+ }
190
+ if (
191
+ args.expectedUpdatedAt &&
192
+ args.expectedUpdatedAt !== bundle.plan.updatedAt
193
+ ) {
194
+ throw new Error(
195
+ "Plan changed since the source was read. Reload the plan and retry against its current updatedAt value.",
196
+ );
197
+ }
55
198
  const referencedBlockIds = referencedBlockIdsForPlanComments(
56
199
  bundle.comments,
57
200
  );
@@ -70,6 +213,15 @@ export default defineAction({
70
213
  });
71
214
  const nextMdx = await applyPlanMdxSourcePatches(currentMdx, args.patches);
72
215
  const nextContent = await parsePlanMdxFolder(nextMdx);
216
+ const beforeCounts = planSurfaceCounts(bundle.plan.content);
217
+ const afterCounts = planSurfaceCounts(nextContent);
218
+ assertNoUnexpectedSurfaceCollapse(
219
+ beforeCounts,
220
+ afterCounts,
221
+ args.allowDestructive ?? false,
222
+ );
223
+ const beforeContentHash = stableContentHash(bundle.plan.content);
224
+ const afterContentHash = stableContentHash(nextContent);
73
225
  const now = nowIso();
74
226
  await createPlanVersionSnapshot(args.planId, {
75
227
  force: true,
@@ -108,6 +260,15 @@ export default defineAction({
108
260
  `Applied ${args.patches.length} visual plan source patch(es).`,
109
261
  payload: {
110
262
  patchOps: args.patches.map((patch) => patch.op),
263
+ targets: args.patches.map(sourcePatchAuditTarget),
264
+ counts: {
265
+ before: beforeCounts,
266
+ after: afterCounts,
267
+ },
268
+ contentHashes: {
269
+ before: beforeContentHash,
270
+ after: afterContentHash,
271
+ },
111
272
  },
112
273
  createdBy: "agent",
113
274
  });
@@ -9,7 +9,7 @@ import { loadPlanBundle, planDeepLink, planPath } from "../server/plans.js";
9
9
 
10
10
  export default defineAction({
11
11
  description:
12
- "Read an Agent-Native Plan as source-control friendly MDX files. Returns plan.mdx, canvas.mdx when the plan has a board, optional .plan-state.json, and the normalized JSON runtime model.",
12
+ "Read an Agent-Native Plan as source-control friendly MDX files. Returns plan.mdx, canvas.mdx when the plan has a board, optional .plan-state.json, the normalized JSON runtime model, and plan.updatedAt. Pass plan.updatedAt exactly as expectedUpdatedAt for replace-file, then reread to verify the write.",
13
13
  schema: z.object({
14
14
  planId: z.string().describe("Plan ID"),
15
15
  }),