@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
@@ -147,6 +147,49 @@ function affectedPlanBlockIds(
147
147
  return Array.from(ids).slice(0, 12);
148
148
  }
149
149
 
150
+ function collectPlanBlockIds(blocks: PlanBlock[], ids = new Set<string>()) {
151
+ for (const block of blocks) {
152
+ ids.add(block.id);
153
+ if (block.type === "tabs") {
154
+ for (const tab of block.data.tabs) {
155
+ collectPlanBlockIds(tab.blocks, ids);
156
+ }
157
+ }
158
+ }
159
+ return ids;
160
+ }
161
+
162
+ function destructiveStructuredReplacementWarnings(
163
+ before: PlanContent,
164
+ after: PlanContent,
165
+ ) {
166
+ const afterBlockIds = collectPlanBlockIds(after.blocks);
167
+ const removedBlockIds = Array.from(collectPlanBlockIds(before.blocks)).filter(
168
+ (id) => !afterBlockIds.has(id),
169
+ );
170
+ const warnings: string[] = [];
171
+ if (removedBlockIds.length > 0) {
172
+ const excerpt = removedBlockIds.slice(0, 8).join(", ");
173
+ const remaining = removedBlockIds.length - 8;
174
+ warnings.push(
175
+ `remove ${removedBlockIds.length} existing block ID${removedBlockIds.length === 1 ? "" : "s"} (${excerpt}${remaining > 0 ? `, and ${remaining} more` : ""})`,
176
+ );
177
+ }
178
+ if (
179
+ (before.canvas?.frames.length ?? 0) > 0 &&
180
+ (after.canvas?.frames.length ?? 0) === 0
181
+ ) {
182
+ warnings.push("collapse a nonempty canvas to zero frames");
183
+ }
184
+ if (
185
+ (before.prototype?.screens.length ?? 0) > 0 &&
186
+ (after.prototype?.screens.length ?? 0) === 0
187
+ ) {
188
+ warnings.push("collapse a nonempty prototype to zero screens");
189
+ }
190
+ return warnings;
191
+ }
192
+
150
193
  function isNewOpenHumanComment(comment: {
151
194
  id?: string;
152
195
  status: string;
@@ -406,9 +449,9 @@ function contentPatchDetails(input: {
406
449
  }
407
450
 
408
451
  const CONTENT_DESCRIPTION =
409
- "Full structured content replacement. Prefer contentPatches for targeted edits; use this only for broad restructuring.";
452
+ "Destructive full structured content replacement. Read the latest plan first and pass its updatedAt as expectedUpdatedAt. Prefer granular contentPatches for ordinary edits; use this only for intentional broad restructuring.";
410
453
  const CONTENT_PATCHES_DESCRIPTION =
411
- "Targeted structured content edits addressed by stable id. For live plans this is the preferred edit path; patch-visual-plan-source is only for exported MDX folders. Supported ops: set-metadata for title/brief, set-prototype / remove-prototype / update-prototype-screen / patch-prototype-html for live prototype surfaces; update-block / replace-block, update-rich-text, patch-wireframe-html, patch-diagram-html, update-wireframe-node, replace-wireframe-screen, update-canvas-frame, update-canvas-annotation / append-canvas-annotation, append-block / remove-block, update-custom-html.";
454
+ "Targeted structured content edits addressed by stable id. Prefer granular operations for live plans. The destructive replace-blocks operation requires expectedUpdatedAt from a fresh read. patch-visual-plan-source is only for exported MDX folders. Supported ops: set-metadata for title/brief, set-prototype / remove-prototype / update-prototype-screen / patch-prototype-html for live prototype surfaces; update-block / replace-block, update-rich-text, patch-wireframe-html, patch-diagram-html, update-wireframe-node, replace-wireframe-screen, update-canvas-frame, update-canvas-annotation / append-canvas-annotation, append-block / remove-block, update-custom-html.";
412
455
 
413
456
  // Named so `agentInputSchema` below can `.extend()` it with compact
414
457
  // `content`/`contentPatches` fields instead of duplicating every other key.
@@ -428,11 +471,24 @@ const updateVisualPlanSchema = z.object({
428
471
  .string()
429
472
  .optional()
430
473
  .describe("Current agent focus label shown in the review surface."),
474
+ expectedUpdatedAt: z
475
+ .string()
476
+ .optional()
477
+ .describe(
478
+ "Required optimistic-concurrency base revision for full content replacement and replace-blocks. Read the latest plan, copy plan.updatedAt exactly, and do not reuse a revision after another write succeeds. Granular patches do not require it.",
479
+ ),
480
+ allowDestructive: z
481
+ .boolean()
482
+ .optional()
483
+ .default(false)
484
+ .describe(
485
+ "Explicit confirmation for a full content replacement or replace-blocks call that removes existing block IDs, collapses a nonempty canvas to zero frames, or collapses a nonempty prototype to zero screens. Keep false for normal rewrites. Set true only after reviewing the latest plan and intentionally accepting those losses; expectedUpdatedAt is still required.",
486
+ ),
431
487
  html: z
432
488
  .string()
433
489
  .optional()
434
490
  .describe(
435
- "Legacy: a standalone HTML document. Setting this NULLS structured content blocks, contentPatches, inline editing, and MDX round-trip all stop working for this plan. Only for preserving a pre-existing HTML artifact; never author new plans this way.",
491
+ "Legacy-only standalone HTML. Allowed only while the current plan has no structured content. Structured plans reject this field because it would shadow blocks, inline editing, and MDX round-trip. Never use it for new plans.",
436
492
  ),
437
493
  content: planContentSchema.optional().describe(CONTENT_DESCRIPTION),
438
494
  contentPatches: planContentPatchesSchema
@@ -442,7 +498,9 @@ const updateVisualPlanSchema = z.object({
442
498
  markdown: z
443
499
  .string()
444
500
  .optional()
445
- .describe("Legacy markdown source. Prefer content blocks."),
501
+ .describe(
502
+ "Legacy-only markdown source. Allowed only while the current plan has no structured content. Structured plans reject explicit markdown, including calls that also carry contentPatches; structured edits generate their MDX projection automatically.",
503
+ ),
446
504
  sections: z
447
505
  .array(sectionInputSchema)
448
506
  .optional()
@@ -459,7 +517,9 @@ const updateVisualPlanSchema = z.object({
459
517
  .array(z.string())
460
518
  .optional()
461
519
  .default([])
462
- .describe("Prefer consume-plan-feedback for marking feedback consumed."),
520
+ .describe(
521
+ "Prefer consume-plan-feedback for marking feedback consumed. WARNING: consuming feedback does not resolve or hide its comments; after the requested change is verified, resolve handled comments with resolve-plan-comment.",
522
+ ),
463
523
  note: z
464
524
  .string()
465
525
  .optional()
@@ -577,24 +637,80 @@ export default defineAction({
577
637
  const db = getDb();
578
638
  const now = nowIso();
579
639
  const insertedCommentIds: string[] = [];
640
+ const hasReplaceBlocksPatch = args.contentPatches.some(
641
+ (patch) => patch.op === "replace-blocks",
642
+ );
643
+ const isDestructiveStructuredWrite =
644
+ args.content !== undefined || hasReplaceBlocksPatch;
580
645
  let nextContent =
581
646
  args.content !== undefined ? normalizePlanContent(args.content) : null;
582
647
  let versionAtLoad: string | null = null;
583
648
  let bundleAtLoad: Awaited<ReturnType<typeof loadPlanBundle>> | null = null;
649
+
650
+ if (
651
+ args.content !== undefined ||
652
+ args.contentPatches.length > 0 ||
653
+ args.html !== undefined ||
654
+ args.markdown !== undefined
655
+ ) {
656
+ bundleAtLoad = await loadPlanBundle(args.planId);
657
+ versionAtLoad = bundleAtLoad.plan.updatedAt;
658
+ }
659
+
660
+ if (
661
+ bundleAtLoad?.plan.content &&
662
+ (args.html !== undefined || args.markdown !== undefined)
663
+ ) {
664
+ const legacyFields = [
665
+ args.html !== undefined ? "html" : null,
666
+ args.markdown !== undefined ? "markdown" : null,
667
+ ].filter((field): field is string => Boolean(field));
668
+ throw new Error(
669
+ `Structured plans do not accept explicit legacy ${legacyFields.join(" or ")} writes. Use granular contentPatches; the structured content's markdown projection is generated automatically.`,
670
+ );
671
+ }
672
+
673
+ if (isDestructiveStructuredWrite) {
674
+ if (!args.expectedUpdatedAt) {
675
+ throw new Error(
676
+ "expectedUpdatedAt is required for full content replacement and replace-blocks. Read the latest plan, pass its plan.updatedAt, and retry.",
677
+ );
678
+ }
679
+ if (bundleAtLoad?.plan.updatedAt !== args.expectedUpdatedAt) {
680
+ throw new Error(
681
+ "This destructive update was prepared from an outdated plan revision. Reload the plan and retry with the latest expectedUpdatedAt.",
682
+ );
683
+ }
684
+ versionAtLoad = args.expectedUpdatedAt;
685
+ }
686
+
584
687
  if (args.content === undefined && args.contentPatches.length > 0) {
585
- const bundle = await loadPlanBundle(args.planId);
586
- bundleAtLoad = bundle;
587
- versionAtLoad = bundle.plan.updatedAt;
588
- if (!bundle.plan.content) {
688
+ if (!bundleAtLoad?.plan.content) {
589
689
  throw new Error(
590
690
  "Targeted content patches require a structured plan. Pass content for a full conversion, or html for legacy artifacts.",
591
691
  );
592
692
  }
593
693
  nextContent = applyPlanContentPatches(
594
- bundle.plan.content,
694
+ bundleAtLoad.plan.content,
595
695
  args.contentPatches,
596
696
  );
597
697
  }
698
+ if (
699
+ isDestructiveStructuredWrite &&
700
+ !args.allowDestructive &&
701
+ bundleAtLoad?.plan.content &&
702
+ nextContent
703
+ ) {
704
+ const warnings = destructiveStructuredReplacementWarnings(
705
+ bundleAtLoad.plan.content,
706
+ nextContent,
707
+ );
708
+ if (warnings.length > 0) {
709
+ throw new Error(
710
+ `Destructive structured replacement would ${warnings.join(" and ")}. Reload and review the latest plan, then pass allowDestructive: true with its expectedUpdatedAt only if those losses are intentional.`,
711
+ );
712
+ }
713
+ }
598
714
  const sourceBundleForMarkdown =
599
715
  nextContent && args.markdown === undefined
600
716
  ? (bundleAtLoad ?? (await loadPlanBundle(args.planId)))
@@ -135,6 +135,8 @@ export type VisualizePlanInput = {
135
135
 
136
136
  export type UpdatePlanInput = {
137
137
  planId: string;
138
+ expectedUpdatedAt?: string;
139
+ allowDestructive?: boolean;
138
140
  title?: string;
139
141
  brief?: string;
140
142
  status?: PlanStatus;
@@ -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
  editorTitle: "VS Code extension",
38
38
  editorDescription:
39
39
  "Open and review plans in a side panel inside VS Code instead of a separate browser tab.",
@@ -4050,6 +4050,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
4050
4050
  }
4051
4051
  await updatePlan.mutateAsync({
4052
4052
  planId: bundle.plan.id,
4053
+ expectedUpdatedAt: bundle.plan.updatedAt,
4053
4054
  content,
4054
4055
  note: "Updated structured visual plan content.",
4055
4056
  });
@@ -4081,6 +4082,9 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
4081
4082
  await updatePlan.mutateAsync(
4082
4083
  {
4083
4084
  planId: bundle.plan.id,
4085
+ ...(patch.op === "replace-blocks"
4086
+ ? { expectedUpdatedAt: bundle.plan.updatedAt }
4087
+ : {}),
4084
4088
  contentPatches: [patch],
4085
4089
  note:
4086
4090
  patch.op === "update-rich-text"
@@ -6800,6 +6804,7 @@ function PlanLoadError({
6800
6804
  }) {
6801
6805
  const t = useT();
6802
6806
  const [emailOpen, setEmailOpen] = useState(false);
6807
+ const [switchAccountOpen, setSwitchAccountOpen] = useState(false);
6803
6808
  const [emailMode, setEmailMode] = useState<"sign-in" | "create">("sign-in");
6804
6809
  const [email, setEmail] = useState("");
6805
6810
  const [password, setPassword] = useState("");
@@ -6934,11 +6939,9 @@ function PlanLoadError({
6934
6939
  : t("plansPage.loadError.maybeOtherOrgBody")
6935
6940
  : t("plansPage.loadError.privateBody")
6936
6941
  : message;
6937
- const reportMessage = `${body}${message && message !== body ? `\n${message}` : ""}`;
6938
-
6939
6942
  return (
6940
6943
  <div className="flex h-full flex-col items-center justify-center bg-background p-8">
6941
- <div className="w-full max-w-md rounded-lg border border-border bg-background p-5 text-start shadow-sm">
6944
+ <div className="w-full max-w-sm rounded-xl border border-border bg-background p-6 text-start shadow-sm">
6942
6945
  <div className={cn("flex items-start", !showAccessHelp && "gap-3")}>
6943
6946
  {!showAccessHelp && !planMissing && (
6944
6947
  <div className="flex size-10 shrink-0 items-center justify-center rounded-lg border border-amber-500/25 bg-amber-500/10 text-amber-600 dark:text-amber-300">
@@ -6946,14 +6949,14 @@ function PlanLoadError({
6946
6949
  </div>
6947
6950
  )}
6948
6951
  <div className="min-w-0">
6949
- <h2 className="text-base font-semibold tracking-tight">{title}</h2>
6950
- <p className="mt-1 text-sm leading-6 text-muted-foreground">
6952
+ <h2 className="text-lg font-semibold tracking-tight">{title}</h2>
6953
+ <p className="mt-2 text-sm leading-6 text-muted-foreground">
6951
6954
  {body}
6952
6955
  </p>
6953
6956
  {showAccessHelp && signedInEmail ? (
6954
- <div className="mt-3 flex items-center gap-2 rounded-md border border-border bg-muted/35 px-3 py-2 text-sm">
6955
- <IconAt className="size-4 shrink-0 text-muted-foreground" />
6956
- <span className="min-w-0 truncate text-muted-foreground">
6957
+ <div className="mt-3 flex min-w-0 items-center gap-1.5 text-sm text-muted-foreground">
6958
+ <IconAt className="size-4 shrink-0" />
6959
+ <span className="min-w-0 truncate">
6957
6960
  {t("plansPage.loadError.signedInAs")}{" "}
6958
6961
  <span className="font-medium text-foreground">
6959
6962
  {signedInEmail}
@@ -6975,7 +6978,7 @@ function PlanLoadError({
6975
6978
  </div>
6976
6979
 
6977
6980
  {showAccessHelp || !planMissing ? (
6978
- <div className="mt-5 flex flex-col gap-2">
6981
+ <div className="mt-6 flex flex-col gap-3">
6979
6982
  {showAccessHelp ? (
6980
6983
  <>
6981
6984
  {signedIn ? (
@@ -7002,24 +7005,57 @@ function PlanLoadError({
7002
7005
  </Button>
7003
7006
  )}
7004
7007
  {signedIn ? (
7005
- <div className="flex flex-wrap gap-2">
7006
- <Button
7007
- type="button"
7008
- variant="outline"
7009
- onClick={() => void startGoogle()}
7010
- disabled={googlePending}
7011
- >
7012
- <IconLogin2 className="size-4" />
7013
- {t("plansPage.loadError.switchAccount")}
7014
- </Button>
7015
- </div>
7008
+ <Collapsible
7009
+ open={switchAccountOpen}
7010
+ onOpenChange={setSwitchAccountOpen}
7011
+ >
7012
+ <CollapsibleTrigger asChild>
7013
+ <Button
7014
+ type="button"
7015
+ variant="ghost"
7016
+ size="sm"
7017
+ className="h-8 w-full justify-between px-1.5 text-muted-foreground hover:text-foreground"
7018
+ >
7019
+ <span className="inline-flex items-center gap-2">
7020
+ <IconLogin2 className="size-4" />
7021
+ {t("plansPage.loadError.switchAccount")}
7022
+ </span>
7023
+ <IconChevronDown
7024
+ className={cn(
7025
+ "size-4 transition-transform",
7026
+ switchAccountOpen ? "rotate-180" : "",
7027
+ )}
7028
+ />
7029
+ </Button>
7030
+ </CollapsibleTrigger>
7031
+ <CollapsibleContent className="pt-1">
7032
+ <Button
7033
+ type="button"
7034
+ onClick={() => void startGoogle()}
7035
+ disabled={googlePending}
7036
+ className="h-9 w-full gap-2.5 rounded-md bg-white px-2 text-sm font-medium text-black shadow-none hover:bg-[#e5e5e5] hover:text-black dark:bg-white dark:text-black dark:hover:bg-[#e5e5e5]"
7037
+ >
7038
+ {googlePending ? (
7039
+ <IconLoader2 className="size-[18px] animate-spin" />
7040
+ ) : (
7041
+ <GoogleLogoIcon className="size-[18px]" />
7042
+ )}
7043
+ {t("plansPage.loadError.continueWithGoogle")}
7044
+ </Button>
7045
+ </CollapsibleContent>
7046
+ </Collapsible>
7016
7047
  ) : null}
7017
- <Collapsible open={emailOpen} onOpenChange={setEmailOpen}>
7048
+ <Collapsible
7049
+ open={emailOpen}
7050
+ onOpenChange={setEmailOpen}
7051
+ className={cn(signedIn && !switchAccountOpen && "hidden")}
7052
+ >
7018
7053
  <CollapsibleTrigger asChild>
7019
7054
  <Button
7020
7055
  type="button"
7021
7056
  variant="ghost"
7022
- className="w-full justify-between px-2 text-muted-foreground"
7057
+ size="sm"
7058
+ className="w-full justify-between px-1.5 text-muted-foreground"
7023
7059
  >
7024
7060
  <span className="inline-flex items-center gap-2">
7025
7061
  <IconMail className="size-4" />
@@ -7035,7 +7071,7 @@ function PlanLoadError({
7035
7071
  </CollapsibleTrigger>
7036
7072
  <CollapsibleContent className="pt-2">
7037
7073
  <form
7038
- className="space-y-3 rounded-md border border-border bg-muted/20 p-3"
7074
+ className="space-y-3 rounded-lg border border-border bg-muted/20 p-3"
7039
7075
  onSubmit={submitEmailAuth}
7040
7076
  >
7041
7077
  <div className="space-y-1.5">
@@ -7120,45 +7156,7 @@ function PlanLoadError({
7120
7156
  )}
7121
7157
  </div>
7122
7158
  ) : null}
7123
- <div className="mt-4 border-t border-border/70 pt-3">
7124
- <PlanErrorFeedbackActions
7125
- title={title}
7126
- message={reportMessage}
7127
- status={status}
7128
- extraDebug={[
7129
- { label: "Plan id", value: planId }, // i18n-ignore debug label
7130
- accessStatus?.visibility
7131
- ? {
7132
- label: "Plan visibility", // i18n-ignore debug label
7133
- value: accessStatus.visibility,
7134
- }
7135
- : {
7136
- label: "Plan visibility", // i18n-ignore debug label
7137
- value: null,
7138
- },
7139
- accessStatus?.hasAccess !== undefined
7140
- ? {
7141
- label: "Has access", // i18n-ignore debug label
7142
- value: accessStatus.hasAccess,
7143
- }
7144
- : {
7145
- label: "Has access", // i18n-ignore debug label
7146
- value: null,
7147
- },
7148
- ]}
7149
- />
7150
- </div>
7151
7159
  </div>
7152
- <Button
7153
- type="button"
7154
- variant="ghost"
7155
- size="sm"
7156
- onClick={onRetry}
7157
- className="mt-3 gap-1.5 text-muted-foreground hover:text-foreground"
7158
- >
7159
- <IconRefresh className="size-3.5" />
7160
- {t("plansPage.loadError.retry")}
7161
- </Button>
7162
7160
  </div>
7163
7161
  );
7164
7162
  }
@@ -7243,7 +7241,12 @@ function SignedInPlanAccessActions({
7243
7241
  })}
7244
7242
  </div>
7245
7243
  ) : null}
7246
- <Button type="button" onClick={handleOrgAccess} disabled={disabled}>
7244
+ <Button
7245
+ type="button"
7246
+ className="w-full"
7247
+ onClick={handleOrgAccess}
7248
+ disabled={disabled}
7249
+ >
7247
7250
  {pending ? (
7248
7251
  <IconLoader2 className="size-4 animate-spin" />
7249
7252
  ) : orgAccessPrompt?.kind === "domain" ? (
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-16
4
+ ---
5
+
6
+ Local Plan previews now load annotations containing HTML-like text.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-16
4
+ ---
5
+
6
+ Plan agents now prevent stale edits from overwriting newer plan content
@@ -967,7 +967,7 @@ function serializeCanvas(content: PlanContent, visualUrl?: string): string {
967
967
  const annotations = annotationsSource
968
968
  .map(
969
969
  (annotation) =>
970
- ` <Annotation${prop("id", annotation.id)}${prop("type", annotation.type)}${prop("title", annotation.title)}${prop("points", annotation.points)}${prop("style", annotation.style)}${prop("targetId", annotation.targetId)}${prop("placement", annotation.placement)}${prop("x", annotation.x)}${prop("y", annotation.y)}>\n\n${annotation.text.trim()}\n\n </Annotation>`,
970
+ ` <Annotation${prop("id", annotation.id)}${prop("type", annotation.type)}${prop("title", annotation.title)}${prop("points", annotation.points)}${prop("style", annotation.style)}${prop("targetId", annotation.targetId)}${prop("placement", annotation.placement)}${prop("x", annotation.x)}${prop("y", annotation.y)}${prop("text", annotation.text.trim())} />`,
971
971
  )
972
972
  .join("\n\n");
973
973
  const connectors = (canvas.flow ?? [])
@@ -1015,6 +1015,79 @@ function parseMdx(source: string): MdxNode {
1015
1015
  return tree;
1016
1016
  }
1017
1017
 
1018
+ function findMdxTagEnd(source: string, start: number): number {
1019
+ let quote: '"' | "'" | "`" | null = null;
1020
+ let expressionDepth = 0;
1021
+ for (let index = start; index < source.length; index += 1) {
1022
+ const char = source[index];
1023
+ if (quote) {
1024
+ if (char === "\\") {
1025
+ index += 1;
1026
+ } else if (char === quote) {
1027
+ quote = null;
1028
+ }
1029
+ continue;
1030
+ }
1031
+ if (char === '"' || char === "'" || char === "`") {
1032
+ quote = char;
1033
+ continue;
1034
+ }
1035
+ if (char === "{") {
1036
+ expressionDepth += 1;
1037
+ continue;
1038
+ }
1039
+ if (char === "}" && expressionDepth > 0) {
1040
+ expressionDepth -= 1;
1041
+ continue;
1042
+ }
1043
+ if (char === ">" && expressionDepth === 0) return index;
1044
+ }
1045
+ return -1;
1046
+ }
1047
+
1048
+ function rewriteCanvasAnnotationBodies(source: string): string {
1049
+ const annotationStart = /<Annotation\b/g;
1050
+ let cursor = 0;
1051
+ let changed = false;
1052
+ let output = "";
1053
+ let match: RegExpExecArray | null;
1054
+
1055
+ while ((match = annotationStart.exec(source))) {
1056
+ const start = match.index;
1057
+ const openEnd = findMdxTagEnd(source, start + match[0].length);
1058
+ if (openEnd < 0) break;
1059
+ const openTag = source.slice(start, openEnd + 1);
1060
+ if (openTag.trimEnd().endsWith("/>") || openTag.includes(" text=")) {
1061
+ continue;
1062
+ }
1063
+ const closeStart = source.indexOf("</Annotation>", openEnd + 1);
1064
+ if (closeStart < 0) break;
1065
+ const closeEnd = closeStart + "</Annotation>".length;
1066
+ const text = source.slice(openEnd + 1, closeStart).trim();
1067
+ output += source.slice(cursor, start);
1068
+ output += `${openTag.slice(0, -1).trimEnd()}${prop("text", text)} />`;
1069
+ cursor = closeEnd;
1070
+ annotationStart.lastIndex = closeEnd;
1071
+ changed = true;
1072
+ }
1073
+
1074
+ return changed ? `${output}${source.slice(cursor)}` : source;
1075
+ }
1076
+
1077
+ function parseCanvasMdxFile(source: string): MdxNode {
1078
+ try {
1079
+ return parsePlanMdxFile("canvas.mdx", source);
1080
+ } catch (initialError) {
1081
+ const rewritten = rewriteCanvasAnnotationBodies(source);
1082
+ if (rewritten === source) throw initialError;
1083
+ try {
1084
+ return parsePlanMdxFile("canvas.mdx", rewritten);
1085
+ } catch {
1086
+ throw initialError;
1087
+ }
1088
+ }
1089
+ }
1090
+
1018
1091
  type MdxParseError = {
1019
1092
  column?: unknown;
1020
1093
  line?: unknown;
@@ -1774,7 +1847,7 @@ export async function parsePlanMdxFolder(
1774
1847
  });
1775
1848
 
1776
1849
  const canvas = files["canvas.mdx"]
1777
- ? parseCanvas(parsePlanMdxFile("canvas.mdx", files["canvas.mdx"]))
1850
+ ? parseCanvas(parseCanvasMdxFile(files["canvas.mdx"]))
1778
1851
  : undefined;
1779
1852
  const prototype = files["prototype.mdx"]
1780
1853
  ? parsePrototype(parsePlanMdxFile("prototype.mdx", files["prototype.mdx"]))
@@ -9,10 +9,27 @@ description: How to create a new deck with slides from scratch. Read this before
9
9
 
10
10
  ## Workflow
11
11
 
12
- 1. Plan the slides (title, section dividers, content slides)
13
- 2. Call `create-deck --title "..." --slides '[]'` to create an empty deck
14
- 3. Navigate to the new deck
15
- 4. Call `add-slide` once per slide in slide order, waiting for each result
12
+ 1. Read the `creative-context` skill and retrieve factual evidence separately
13
+ from presentation structure. Respect `contextMode: "off"`.
14
+ 2. Plan the slides (title, section dividers, content slides).
15
+ 3. Call `create-deck --title "..." --slides '[]'` to create an empty deck.
16
+ 4. Navigate to the new deck.
17
+ 5. Call `add-slide` once per slide in slide order, waiting for each result.
18
+
19
+ Follow the creative-context reuse ladder before inventing a slide language:
20
+ reuse an approved native template unchanged, compose approved pieces, lightly
21
+ adapt a real approved example, generate from narrowly retrieved references,
22
+ then go net-new only when the relevant corpus is empty. Retrieval is a separate
23
+ step from generation. Persist the immutable `contextPackId` and concise reuse
24
+ labels with the deck's generation provenance; never infer provenance later from
25
+ rendered slide HTML.
26
+
27
+ When creative context is available, pass the pre-generation search result's
28
+ `contextPackId` to `create-deck`, pass deck-wide `reuseLabels`, and add
29
+ `creativeContextReuseLabels` to each slide that reused a specific item/version.
30
+ Do not omit these fields and let the final write action search after the HTML
31
+ has already been authored; that would fabricate influence. With an empty
32
+ library, omit them. With Library mode Off, omit them and create normally.
16
33
  before adding the next slide
17
34
 
18
35
  Do not create multiple slides in parallel for the same deck. Do not spawn