@agent-native/core 0.131.4 → 0.131.6

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 (330) hide show
  1. package/corpus/README.md +3 -3
  2. package/corpus/core/CHANGELOG.md +69 -0
  3. package/corpus/core/docs/content/agent-native-toolkit.mdx +13 -6
  4. package/corpus/core/docs/content/cloneable-saas.mdx +5 -5
  5. package/corpus/core/docs/content/creating-templates.mdx +9 -0
  6. package/corpus/core/docs/content/deployment.mdx +14 -10
  7. package/corpus/core/docs/content/docs-components.mdx +491 -0
  8. package/corpus/core/docs/content/doctor.mdx +8 -1
  9. package/corpus/core/docs/content/drop-in-agent.mdx +1 -1
  10. package/corpus/core/docs/content/extensions.mdx +18 -18
  11. package/corpus/core/docs/content/faq.mdx +4 -4
  12. package/corpus/core/docs/content/key-concepts.mdx +30 -21
  13. package/corpus/core/docs/content/template-brain-developers.mdx +4 -1
  14. package/corpus/core/docs/content/template-mail-developers.mdx +4 -1
  15. package/corpus/core/docs/content/what-is-agent-native.mdx +6 -6
  16. package/corpus/core/package.json +1 -1
  17. package/corpus/core/src/a2a/client.ts +449 -66
  18. package/corpus/core/src/a2a/correlation.ts +31 -0
  19. package/corpus/core/src/a2a/types.ts +4 -0
  20. package/corpus/core/src/action.ts +3 -0
  21. package/corpus/core/src/agent/engine/registry.ts +45 -5
  22. package/corpus/core/src/agent/production-agent.ts +151 -18
  23. package/corpus/core/src/agent/run-loop-with-resume.ts +190 -3
  24. package/corpus/core/src/agent/run-manager.ts +117 -41
  25. package/corpus/core/src/agent/thread-debug-history.ts +86 -0
  26. package/corpus/core/src/agent/types.ts +3 -1
  27. package/corpus/core/src/cli/create.ts +11 -1
  28. package/corpus/core/src/cli/templates-meta.ts +2 -2
  29. package/corpus/core/src/client/agent-chat-adapter.ts +91 -13
  30. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +11 -9
  31. package/corpus/core/src/client/sse-event-processor.ts +17 -3
  32. package/corpus/core/src/db/client.ts +57 -17
  33. package/corpus/core/src/integrations/adapters/slack.ts +8 -3
  34. package/corpus/core/src/localization/default-messages.ts +44 -0
  35. package/corpus/core/src/observability/traces.ts +78 -5
  36. package/corpus/core/src/scripts/call-agent.ts +290 -9
  37. package/corpus/core/src/scripts/describe-workspace-apps.ts +2 -2
  38. package/corpus/core/src/secrets/crypto.ts +126 -34
  39. package/corpus/core/src/secrets/storage.ts +61 -25
  40. package/corpus/core/src/server/agent-capabilities.ts +1 -1
  41. package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +111 -7
  42. package/corpus/core/src/server/agent-chat/context-tools.ts +2 -0
  43. package/corpus/core/src/server/agent-chat/plugin-options.ts +34 -1
  44. package/corpus/core/src/server/agent-chat/prompt-resources.ts +1 -1
  45. package/corpus/core/src/server/agent-chat-plugin.ts +91 -59
  46. package/corpus/core/src/templates/default/.agents/skills/secrets/SKILL.md +14 -7
  47. package/corpus/core/src/templates/headless/.agents/skills/secrets/SKILL.md +14 -7
  48. package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +18 -7
  49. package/corpus/core/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +15 -14
  50. package/corpus/core/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +14 -7
  51. package/corpus/core/src/vite/client.ts +1 -0
  52. package/corpus/templates/analytics/.agents/skills/dashboard-ops/SKILL.md +5 -4
  53. package/corpus/templates/analytics/.agents/skills/gong/SKILL.md +6 -4
  54. package/corpus/templates/analytics/AGENTS.md +6 -4
  55. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +4 -3
  56. package/corpus/templates/analytics/changelog/2026-07-30-scheduled-dashboard-emails-complete-every-panel-without-pool.md +6 -0
  57. package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +28 -1
  58. package/corpus/templates/analytics/server/jobs/dashboard-report.ts +18 -11
  59. package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +4 -4
  60. package/corpus/templates/analytics/server/lib/canonical-first-party-dashboard-repair.ts +9 -5
  61. package/corpus/templates/analytics/server/lib/dashboard-panel-query.ts +6 -2
  62. package/corpus/templates/analytics/server/lib/dashboard-panel-source-resolver.ts +11 -4
  63. package/corpus/templates/analytics/server/lib/dashboard-report-render.ts +49 -31
  64. package/corpus/templates/analytics/server/lib/first-party-analytics.ts +16 -8
  65. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +9 -3
  66. package/corpus/templates/analytics/server/lib/production-serverless-runtime.ts +11 -0
  67. package/corpus/templates/analytics/server/plugins/agent-chat.ts +3 -2
  68. package/corpus/templates/analytics/server/plugins/analytics-alert-jobs.ts +2 -1
  69. package/corpus/templates/analytics/server/plugins/dashboard-report-jobs.ts +2 -1
  70. package/corpus/templates/analytics/server/plugins/uptime-monitor-jobs.ts +1 -12
  71. package/corpus/templates/brain/.agents/skills/brain/RUNBOOK.md +54 -6
  72. package/corpus/templates/brain/.agents/skills/brain/SKILL.md +20 -9
  73. package/corpus/templates/brain/.agents/skills/ingestion-and-connectors/SKILL.md +33 -1
  74. package/corpus/templates/brain/AGENTS.md +3 -1
  75. package/corpus/templates/brain/README.md +4 -1
  76. package/corpus/templates/brain/actions/_schemas.ts +30 -8
  77. package/corpus/templates/brain/actions/ask-brain.ts +124 -14
  78. package/corpus/templates/brain/actions/create-source.ts +18 -2
  79. package/corpus/templates/brain/actions/enqueue-captures-distillation.ts +8 -123
  80. package/corpus/templates/brain/actions/enqueue-distillation.ts +6 -127
  81. package/corpus/templates/brain/actions/import-capture.ts +17 -5
  82. package/corpus/templates/brain/actions/import-transcript.ts +17 -5
  83. package/corpus/templates/brain/actions/update-source.ts +25 -5
  84. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +1 -1
  85. package/corpus/templates/brain/changelog/2026-07-30-blessed-resources-can-feed-cited-company-answers.md +6 -0
  86. package/corpus/templates/brain/changelog/2026-07-30-the-left-sidebar-no-longer-shows-a-blank-organization-placeh.md +6 -0
  87. package/corpus/templates/brain/server/lib/brain.ts +49 -19
  88. package/corpus/templates/brain/server/lib/distillation-queue.ts +147 -0
  89. package/corpus/templates/brain/server/lib/source-policy.ts +264 -0
  90. package/corpus/templates/brain/server/plugins/agent-chat.ts +3 -2
  91. package/corpus/templates/brain/server/routes/api/_agent-native/brain/ingest.post.ts +116 -19
  92. package/corpus/templates/clips/app/components/meetings/google-oauth-identity-notice.tsx +51 -0
  93. package/corpus/templates/clips/app/i18n/en-US.ts +4 -0
  94. package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +3 -1
  95. package/corpus/templates/clips/changelog/2026-07-30-google-calendar-warning.md +6 -0
  96. package/corpus/templates/content/.agents/skills/content-product-development/SKILL.md +47 -0
  97. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +72 -8
  98. package/corpus/templates/content/changelog/2026-07-30-the-slash-command-hint-now-stays-on-only-the-active-empty-li.md +6 -0
  99. package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +506 -11
  100. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +148 -17
  101. package/corpus/templates/design/app/components/design/canvas-interactions/design-canvas-interactions.ts +357 -0
  102. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +7 -466
  103. package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +15 -311
  104. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +19 -997
  105. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +8 -1216
  106. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +31 -38
  107. package/corpus/templates/design/package.json +0 -1
  108. package/corpus/templates/dispatch/AGENTS.md +8 -0
  109. package/corpus/templates/dispatch/DEVELOPING.md +29 -0
  110. package/corpus/templates/dispatch/actions/view-screen.ts +34 -2
  111. package/corpus/templates/dispatch/app/i18n-data.ts +457 -0
  112. package/corpus/templates/dispatch/changelog/2026-07-30-delegated-dispatch-work-continues-reliably-in-the-background.md +6 -0
  113. package/corpus/templates/dispatch/changelog/2026-07-30-find-failed-runs-across-apps.md +6 -0
  114. package/corpus/templates/dispatch/netlify.toml +3 -0
  115. package/corpus/templates/slides/.agents/skills/analytics-data-for-decks/SKILL.md +8 -12
  116. package/corpus/templates/slides/AGENTS.md +4 -4
  117. package/corpus/templates/slides/actions/duplicate-deck.ts +19 -4
  118. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +2 -10
  119. package/corpus/templates/slides/app/components/deck/MermaidRenderer.tsx +12 -1
  120. package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +30 -13
  121. package/corpus/templates/slides/app/components/editor/DeckEditorSkeleton.tsx +35 -0
  122. package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +63 -56
  123. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +21 -76
  124. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +1110 -292
  125. package/corpus/templates/slides/app/components/editor/SlideOverflowWarning.tsx +53 -0
  126. package/corpus/templates/slides/app/components/editor/SlideStyleInspector.tsx +235 -18
  127. package/corpus/templates/slides/app/components/editor/SpeakerNotesPanel.tsx +4 -1
  128. package/corpus/templates/slides/app/components/editor/canvas-interactions/index.ts +11 -0
  129. package/corpus/templates/slides/app/components/editor/canvas-interactions/slides-canvas-adapter.ts +129 -0
  130. package/corpus/templates/slides/app/components/editor/selection-overlay-measurement.ts +70 -0
  131. package/corpus/templates/slides/app/components/editor/slide-object-interactions.ts +519 -65
  132. package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +36 -426
  133. package/corpus/templates/slides/app/components/visual-editor/DrawOverlay.tsx +19 -458
  134. package/corpus/templates/slides/app/context/DeckContext.tsx +179 -72
  135. package/corpus/templates/slides/app/global.css +105 -0
  136. package/corpus/templates/slides/app/i18n/en-US.ts +8 -0
  137. package/corpus/templates/slides/app/lib/deck-editor-loading.ts +26 -0
  138. package/corpus/templates/slides/app/lib/mermaid-blocks.ts +27 -0
  139. package/corpus/templates/slides/app/pages/DeckEditor.tsx +71 -38
  140. package/corpus/templates/slides/app/pages/Index.tsx +98 -41
  141. package/corpus/templates/slides/changelog/2026-07-30-deck-loading-no-longer-flashes-an-unavailable-message.md +6 -0
  142. package/corpus/templates/slides/changelog/2026-07-30-duplicating-a-deck-from-the-deck-list-now-opens-the-copy-imm.md +6 -0
  143. package/corpus/templates/slides/changelog/2026-07-30-layout-overflow-warning-is-readable-and-dismissible.md +6 -0
  144. package/corpus/templates/slides/changelog/2026-07-30-shared-canvas-annotations.md +6 -0
  145. package/corpus/templates/slides/changelog/2026-07-30-slide-objects-can-be-moved-as-a-group-copied-and-pasted-with.md +6 -0
  146. package/corpus/templates/slides/changelog/2026-07-30-slide-text-editing-and-object-controls-now-match-google-slides.md +6 -0
  147. package/corpus/templates/slides/changelog/2026-07-30-style-panel-now-scrolls-with-speaker-notes-open-shows-the-sl.md +6 -0
  148. package/corpus/templates/slides/changelog/2026-07-30-top-toolbar-controls-now-use-consistent-sizing-with-undo-and.md +6 -0
  149. package/corpus/templates/slides/netlify.toml +3 -1
  150. package/corpus/templates/slides/package.json +0 -1
  151. package/corpus/templates/slides/server/lib/chat-attachments.ts +18 -0
  152. package/corpus/templates/slides/server/plugins/agent-chat.ts +5 -0
  153. package/corpus/templates/slides/vite.config.ts +0 -1
  154. package/corpus/toolkit/CHANGELOG.md +13 -0
  155. package/corpus/toolkit/README.md +19 -0
  156. package/corpus/toolkit/agent-native.eject.json +38 -0
  157. package/corpus/toolkit/package.json +29 -1
  158. package/corpus/toolkit/src/canvas-annotations/CanvasCommentPins.tsx +861 -0
  159. package/corpus/toolkit/src/canvas-annotations/DrawOverlay.tsx +1233 -0
  160. package/corpus/toolkit/src/canvas-annotations/index.ts +15 -0
  161. package/corpus/toolkit/src/canvas-annotations/types.ts +14 -0
  162. package/corpus/toolkit/src/canvas-interactions/canvas-interactions.ts +933 -0
  163. package/corpus/toolkit/src/canvas-interactions/index.ts +67 -0
  164. package/corpus/toolkit/src/design-tweaks/scrub-input-utils.ts +311 -0
  165. package/corpus/toolkit/src/design-tweaks/scrub-input.tsx +491 -0
  166. package/corpus/toolkit/src/design-tweaks/visual-style-controls.tsx +26 -171
  167. package/corpus/toolkit/src/index.ts +1 -0
  168. package/dist/a2a/client.d.ts +23 -0
  169. package/dist/a2a/client.d.ts.map +1 -1
  170. package/dist/a2a/client.js +309 -44
  171. package/dist/a2a/client.js.map +1 -1
  172. package/dist/a2a/correlation.d.ts +1 -0
  173. package/dist/a2a/correlation.d.ts.map +1 -1
  174. package/dist/a2a/correlation.js +27 -0
  175. package/dist/a2a/correlation.js.map +1 -1
  176. package/dist/a2a/types.d.ts +4 -0
  177. package/dist/a2a/types.d.ts.map +1 -1
  178. package/dist/a2a/types.js.map +1 -1
  179. package/dist/action.d.ts +3 -0
  180. package/dist/action.d.ts.map +1 -1
  181. package/dist/action.js.map +1 -1
  182. package/dist/agent/engine/registry.d.ts.map +1 -1
  183. package/dist/agent/engine/registry.js +34 -7
  184. package/dist/agent/engine/registry.js.map +1 -1
  185. package/dist/agent/production-agent.d.ts +40 -1
  186. package/dist/agent/production-agent.d.ts.map +1 -1
  187. package/dist/agent/production-agent.js +113 -15
  188. package/dist/agent/production-agent.js.map +1 -1
  189. package/dist/agent/run-loop-with-resume.d.ts +21 -0
  190. package/dist/agent/run-loop-with-resume.d.ts.map +1 -1
  191. package/dist/agent/run-loop-with-resume.js +163 -4
  192. package/dist/agent/run-loop-with-resume.js.map +1 -1
  193. package/dist/agent/run-manager.d.ts +16 -9
  194. package/dist/agent/run-manager.d.ts.map +1 -1
  195. package/dist/agent/run-manager.js +93 -42
  196. package/dist/agent/run-manager.js.map +1 -1
  197. package/dist/agent/thread-debug-history.d.ts +10 -0
  198. package/dist/agent/thread-debug-history.d.ts.map +1 -0
  199. package/dist/agent/thread-debug-history.js +68 -0
  200. package/dist/agent/thread-debug-history.js.map +1 -0
  201. package/dist/agent/types.d.ts +3 -1
  202. package/dist/agent/types.d.ts.map +1 -1
  203. package/dist/agent/types.js.map +1 -1
  204. package/dist/cli/create.d.ts.map +1 -1
  205. package/dist/cli/create.js +6 -1
  206. package/dist/cli/create.js.map +1 -1
  207. package/dist/cli/templates-meta.js +2 -2
  208. package/dist/cli/templates-meta.js.map +1 -1
  209. package/dist/client/agent-chat-adapter.d.ts +1 -1
  210. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  211. package/dist/client/agent-chat-adapter.js +76 -13
  212. package/dist/client/agent-chat-adapter.js.map +1 -1
  213. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  214. package/dist/client/resources/McpIntegrationDialog.js +1 -1
  215. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  216. package/dist/client/sse-event-processor.d.ts.map +1 -1
  217. package/dist/client/sse-event-processor.js +12 -3
  218. package/dist/client/sse-event-processor.js.map +1 -1
  219. package/dist/collab/awareness.d.ts +2 -2
  220. package/dist/collab/awareness.d.ts.map +1 -1
  221. package/dist/db/client.d.ts.map +1 -1
  222. package/dist/db/client.js +48 -17
  223. package/dist/db/client.js.map +1 -1
  224. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  225. package/dist/integrations/adapters/slack.js +7 -3
  226. package/dist/integrations/adapters/slack.js.map +1 -1
  227. package/dist/localization/default-messages.d.ts +43 -0
  228. package/dist/localization/default-messages.d.ts.map +1 -1
  229. package/dist/localization/default-messages.js +43 -0
  230. package/dist/localization/default-messages.js.map +1 -1
  231. package/dist/notifications/routes.d.ts +2 -2
  232. package/dist/observability/traces.d.ts +3 -1
  233. package/dist/observability/traces.d.ts.map +1 -1
  234. package/dist/observability/traces.js +73 -4
  235. package/dist/observability/traces.js.map +1 -1
  236. package/dist/progress/routes.d.ts +1 -1
  237. package/dist/provider-api/actions/custom-provider-registration.d.ts +12 -12
  238. package/dist/provider-api/actions/provider-api.d.ts +13 -13
  239. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  240. package/dist/resources/handlers.d.ts +1 -1
  241. package/dist/scripts/call-agent.d.ts.map +1 -1
  242. package/dist/scripts/call-agent.js +233 -10
  243. package/dist/scripts/call-agent.js.map +1 -1
  244. package/dist/scripts/describe-workspace-apps.js +2 -2
  245. package/dist/scripts/describe-workspace-apps.js.map +1 -1
  246. package/dist/secrets/crypto.d.ts +31 -21
  247. package/dist/secrets/crypto.d.ts.map +1 -1
  248. package/dist/secrets/crypto.js +108 -33
  249. package/dist/secrets/crypto.js.map +1 -1
  250. package/dist/secrets/storage.d.ts +3 -5
  251. package/dist/secrets/storage.d.ts.map +1 -1
  252. package/dist/secrets/storage.js +40 -25
  253. package/dist/secrets/storage.js.map +1 -1
  254. package/dist/server/agent-capabilities.js +1 -1
  255. package/dist/server/agent-capabilities.js.map +1 -1
  256. package/dist/server/agent-chat/action-filters-a2a.d.ts +17 -3
  257. package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -1
  258. package/dist/server/agent-chat/action-filters-a2a.js +92 -3
  259. package/dist/server/agent-chat/action-filters-a2a.js.map +1 -1
  260. package/dist/server/agent-chat/context-tools.d.ts.map +1 -1
  261. package/dist/server/agent-chat/context-tools.js +2 -0
  262. package/dist/server/agent-chat/context-tools.js.map +1 -1
  263. package/dist/server/agent-chat/plugin-options.d.ts +23 -0
  264. package/dist/server/agent-chat/plugin-options.d.ts.map +1 -1
  265. package/dist/server/agent-chat/plugin-options.js +4 -1
  266. package/dist/server/agent-chat/plugin-options.js.map +1 -1
  267. package/dist/server/agent-chat/prompt-resources.js +1 -1
  268. package/dist/server/agent-chat/prompt-resources.js.map +1 -1
  269. package/dist/server/agent-chat-plugin.d.ts +2 -1
  270. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  271. package/dist/server/agent-chat-plugin.js +79 -56
  272. package/dist/server/agent-chat-plugin.js.map +1 -1
  273. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  274. package/dist/templates/default/.agents/skills/secrets/SKILL.md +14 -7
  275. package/dist/templates/headless/.agents/skills/secrets/SKILL.md +14 -7
  276. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +18 -7
  277. package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +15 -14
  278. package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +14 -7
  279. package/dist/vite/client.d.ts.map +1 -1
  280. package/dist/vite/client.js +1 -0
  281. package/dist/vite/client.js.map +1 -1
  282. package/docs/content/agent-native-toolkit.mdx +13 -6
  283. package/docs/content/cloneable-saas.mdx +5 -5
  284. package/docs/content/creating-templates.mdx +9 -0
  285. package/docs/content/deployment.mdx +14 -10
  286. package/docs/content/docs-components.mdx +491 -0
  287. package/docs/content/doctor.mdx +8 -1
  288. package/docs/content/drop-in-agent.mdx +1 -1
  289. package/docs/content/extensions.mdx +18 -18
  290. package/docs/content/faq.mdx +4 -4
  291. package/docs/content/key-concepts.mdx +30 -21
  292. package/docs/content/template-brain-developers.mdx +4 -1
  293. package/docs/content/template-mail-developers.mdx +4 -1
  294. package/docs/content/what-is-agent-native.mdx +6 -6
  295. package/package.json +2 -2
  296. package/src/a2a/client.ts +449 -66
  297. package/src/a2a/correlation.ts +31 -0
  298. package/src/a2a/types.ts +4 -0
  299. package/src/action.ts +3 -0
  300. package/src/agent/engine/registry.ts +45 -5
  301. package/src/agent/production-agent.ts +151 -18
  302. package/src/agent/run-loop-with-resume.ts +190 -3
  303. package/src/agent/run-manager.ts +117 -41
  304. package/src/agent/thread-debug-history.ts +86 -0
  305. package/src/agent/types.ts +3 -1
  306. package/src/cli/create.ts +11 -1
  307. package/src/cli/templates-meta.ts +2 -2
  308. package/src/client/agent-chat-adapter.ts +91 -13
  309. package/src/client/resources/McpIntegrationDialog.tsx +11 -9
  310. package/src/client/sse-event-processor.ts +17 -3
  311. package/src/db/client.ts +57 -17
  312. package/src/integrations/adapters/slack.ts +8 -3
  313. package/src/localization/default-messages.ts +44 -0
  314. package/src/observability/traces.ts +78 -5
  315. package/src/scripts/call-agent.ts +290 -9
  316. package/src/scripts/describe-workspace-apps.ts +2 -2
  317. package/src/secrets/crypto.ts +126 -34
  318. package/src/secrets/storage.ts +61 -25
  319. package/src/server/agent-capabilities.ts +1 -1
  320. package/src/server/agent-chat/action-filters-a2a.ts +111 -7
  321. package/src/server/agent-chat/context-tools.ts +2 -0
  322. package/src/server/agent-chat/plugin-options.ts +34 -1
  323. package/src/server/agent-chat/prompt-resources.ts +1 -1
  324. package/src/server/agent-chat-plugin.ts +91 -59
  325. package/src/templates/default/.agents/skills/secrets/SKILL.md +14 -7
  326. package/src/templates/headless/.agents/skills/secrets/SKILL.md +14 -7
  327. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +18 -7
  328. package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +15 -14
  329. package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +14 -7
  330. package/src/vite/client.ts +1 -0
@@ -32,7 +32,6 @@ interface DeckCardProps {
32
32
  onRename: (id: string, newTitle: string) => void;
33
33
  onDuplicate: (id: string) => void;
34
34
  onToggleStar: (id: string, starred: boolean) => void;
35
- isDuplicating?: boolean;
36
35
  designSystemTitle?: string | null;
37
36
  isWorkspaceDefault?: boolean;
38
37
  canSetWorkspaceDefault?: boolean;
@@ -45,7 +44,6 @@ export default function DeckCard({
45
44
  onRename,
46
45
  onDuplicate,
47
46
  onToggleStar,
48
- isDuplicating = false,
49
47
  designSystemTitle,
50
48
  isWorkspaceDefault = false,
51
49
  canSetWorkspaceDefault = false,
@@ -230,15 +228,9 @@ export default function DeckCard({
230
228
  <IconPencil className="w-3.5 h-3.5 me-2" />
231
229
  Rename
232
230
  </DropdownMenuItem>
233
- <DropdownMenuItem
234
- onSelect={() => {
235
- if (isDuplicating) return;
236
- onDuplicate(deck.id);
237
- }}
238
- disabled={isDuplicating}
239
- >
231
+ <DropdownMenuItem onSelect={() => onDuplicate(deck.id)}>
240
232
  <IconCopy className="w-3.5 h-3.5 me-2" />
241
- {isDuplicating ? "Duplicating..." : "Duplicate"}
233
+ Duplicate
242
234
  </DropdownMenuItem>
243
235
  <DropdownMenuItem
244
236
  onSelect={(event) => {
@@ -46,11 +46,13 @@ let idCounter = 0;
46
46
  interface MermaidRendererProps {
47
47
  definition: string;
48
48
  className?: string;
49
+ index?: number;
49
50
  }
50
51
 
51
52
  export function MermaidRenderer({
52
53
  definition,
53
54
  className,
55
+ index,
54
56
  }: MermaidRendererProps) {
55
57
  const containerRef = useRef<HTMLDivElement>(null);
56
58
  const [svg, setSvg] = useState<string>("");
@@ -98,6 +100,7 @@ export function MermaidRenderer({
98
100
  if (error) {
99
101
  return (
100
102
  <div
103
+ data-mermaid-index={index}
101
104
  className={`flex items-center justify-center p-4 text-xs text-red-400/70 ${className || ""}`}
102
105
  >
103
106
  <pre className="whitespace-pre-wrap">{error}</pre>
@@ -105,11 +108,19 @@ export function MermaidRenderer({
105
108
  );
106
109
  }
107
110
 
108
- if (!svg) return null;
111
+ if (!svg) {
112
+ // Mermaid's import + render is async, so this placeholder is the only
113
+ // thing in the DOM until it resolves. Without it, an edit to another
114
+ // element on the same slide made while the diagram is still loading
115
+ // would see zero `[data-mermaid-index]` nodes when serializing the
116
+ // slide, and silently drop the diagram from the saved content.
117
+ return <div data-mermaid-index={index} className={className} />;
118
+ }
109
119
 
110
120
  return (
111
121
  <div
112
122
  ref={containerRef}
123
+ data-mermaid-index={index}
113
124
  className={`flex items-center justify-center [&_svg]:max-w-full [&_svg]:max-h-full ${className || ""}`}
114
125
  dangerouslySetInnerHTML={{ __html: svg }}
115
126
  />
@@ -14,6 +14,7 @@ import rehypeRaw from "rehype-raw";
14
14
  import { Skeleton } from "@/components/ui/skeleton";
15
15
  import type { Slide } from "@/context/DeckContext";
16
16
  import { type AspectRatio, getAspectRatioDims } from "@/lib/aspect-ratios";
17
+ import { extractMermaidBlocks } from "@/lib/mermaid-blocks";
17
18
  import {
18
19
  sanitizeCssValue,
19
20
  sanitizeSlideHtml,
@@ -37,6 +38,8 @@ interface SlideRendererProps {
37
38
  * The renderer no longer shrinks slides for vertical overflow — instead the
38
39
  * editor surfaces this so the agent can rewrite the slide to fit. */
39
40
  onOverflowChange?: (info: SlideOverflowInfo) => void;
41
+ /** Fires after AutoFit has applied its final transform for this render. */
42
+ onAutofitSettled?: () => void;
40
43
  }
41
44
 
42
45
  export const layoutClasses: Record<string, string> = {
@@ -311,9 +314,12 @@ function useSlideAutofit(
311
314
  canvasHeight: number,
312
315
  fitKey: string,
313
316
  onOverflowChange?: (info: SlideOverflowInfo) => void,
317
+ onAutofitSettled?: () => void,
314
318
  ) {
315
319
  const overflowCallbackRef = useRef(onOverflowChange);
316
320
  overflowCallbackRef.current = onOverflowChange;
321
+ const autofitSettledRef = useRef(onAutofitSettled);
322
+ autofitSettledRef.current = onAutofitSettled;
317
323
 
318
324
  useIsomorphicLayoutEffect(() => {
319
325
  const root = ref.current;
@@ -395,6 +401,7 @@ function useSlideAutofit(
395
401
  viewportHeight: 0,
396
402
  },
397
403
  );
404
+ autofitSettledRef.current?.();
398
405
  }
399
406
  };
400
407
 
@@ -437,6 +444,7 @@ function AutoFitContent({
437
444
  className = "",
438
445
  children,
439
446
  onOverflowChange,
447
+ onAutofitSettled,
440
448
  }: {
441
449
  canvasWidth: number;
442
450
  canvasHeight: number;
@@ -444,9 +452,17 @@ function AutoFitContent({
444
452
  className?: string;
445
453
  children: ReactNode;
446
454
  onOverflowChange?: (info: SlideOverflowInfo) => void;
455
+ onAutofitSettled?: () => void;
447
456
  }) {
448
457
  const ref = useRef<HTMLDivElement>(null);
449
- useSlideAutofit(ref, canvasWidth, canvasHeight, fitKey, onOverflowChange);
458
+ useSlideAutofit(
459
+ ref,
460
+ canvasWidth,
461
+ canvasHeight,
462
+ fitKey,
463
+ onOverflowChange,
464
+ onAutofitSettled,
465
+ );
450
466
 
451
467
  return (
452
468
  <div
@@ -469,18 +485,9 @@ function BlankSlideContent({ content }: { content: string }) {
469
485
  // includes the per-block `contentEditable="true"` set by SlideEditor's
470
486
  // double-click-to-edit flow, which made inline text editing appear to do nothing.
471
487
  const { mermaidBlocks, htmlWithPlaceholders, dangerousHtml } = useMemo(() => {
472
- // Extract mermaid blocks BEFORE sanitization. The sanitizer round-trips
473
- // HTML through DOMParser + innerHTML, which HTML-escapes `>` in text
474
- // nodes to `&gt;` that mangles diagram arrows like `A --> B` into
475
- // `A --&gt; B` and breaks the mermaid parser.
476
- const blocks: string[] = [];
477
- const contentWithPlaceholders = content.replace(
478
- /<div\s+class="mermaid"[^>]*>([\s\S]*?)<\/div>/gi,
479
- (_, definition) => {
480
- blocks.push(String(definition).trim());
481
- return `<div data-mermaid-index="${blocks.length - 1}"></div>`;
482
- },
483
- );
488
+ // Extract mermaid blocks BEFORE sanitization see mermaid-blocks.ts for
489
+ // why (sanitizer HTML-escaping breaks the mermaid parser).
490
+ const { blocks, contentWithPlaceholders } = extractMermaidBlocks(content);
484
491
 
485
492
  // Apply white filter to all logo images (brandfetch, logo.dev, etc.) for dark backgrounds
486
493
  const processed = sanitizeSlideHtml(
@@ -547,6 +554,7 @@ function MermaidHtmlContent({
547
554
  <MermaidRenderer
548
555
  key={`mermaid-${i}`}
549
556
  definition={mermaidBlocks[idx]}
557
+ index={idx}
550
558
  className="my-4 w-full"
551
559
  />
552
560
  );
@@ -564,11 +572,13 @@ export function SlideInner({
564
572
  designSystem,
565
573
  aspectRatio,
566
574
  onOverflowChange,
575
+ onAutofitSettled,
567
576
  }: {
568
577
  slide: Slide;
569
578
  designSystem?: DesignSystemData;
570
579
  aspectRatio?: AspectRatio;
571
580
  onOverflowChange?: (info: SlideOverflowInfo) => void;
581
+ onAutofitSettled?: () => void;
572
582
  }) {
573
583
  const t = useT();
574
584
  const dims = getAspectRatioDims(aspectRatio);
@@ -651,6 +661,7 @@ export function SlideInner({
651
661
  fitKey={left}
652
662
  className="slide-content text-white/90"
653
663
  onOverflowChange={onOverflowChange}
664
+ onAutofitSettled={onAutofitSettled}
654
665
  >
655
666
  <ReactMarkdown
656
667
  components={markdownComponents}
@@ -664,6 +675,7 @@ export function SlideInner({
664
675
  canvasHeight={dims.height}
665
676
  fitKey={right}
666
677
  className="slide-content text-white/90"
678
+ onAutofitSettled={onAutofitSettled}
667
679
  >
668
680
  <ReactMarkdown
669
681
  components={markdownComponents}
@@ -689,6 +701,7 @@ export function SlideInner({
689
701
  fitKey={content}
690
702
  className="h-full w-full"
691
703
  onOverflowChange={onOverflowChange}
704
+ onAutofitSettled={onAutofitSettled}
692
705
  >
693
706
  <BlankSlideContent content={content} />
694
707
  </AutoFitContent>
@@ -714,6 +727,7 @@ export function SlideInner({
714
727
  fitKey={content}
715
728
  className="slide-content text-white/90 w-full"
716
729
  onOverflowChange={onOverflowChange}
730
+ onAutofitSettled={onAutofitSettled}
717
731
  >
718
732
  <ReactMarkdown
719
733
  components={markdownComponents}
@@ -733,6 +747,7 @@ export default function SlideRenderer({
733
747
  designSystem,
734
748
  aspectRatio,
735
749
  onOverflowChange,
750
+ onAutofitSettled,
736
751
  }: SlideRendererProps) {
737
752
  const dims = getAspectRatioDims(aspectRatio);
738
753
 
@@ -753,6 +768,7 @@ export default function SlideRenderer({
753
768
  designSystem={designSystem}
754
769
  aspectRatio={aspectRatio}
755
770
  onOverflowChange={onOverflowChange}
771
+ onAutofitSettled={onAutofitSettled}
756
772
  />
757
773
  </div>
758
774
  <ScaleHelper
@@ -783,6 +799,7 @@ export default function SlideRenderer({
783
799
  designSystem={designSystem}
784
800
  aspectRatio={aspectRatio}
785
801
  onOverflowChange={onOverflowChange}
802
+ onAutofitSettled={onAutofitSettled}
786
803
  />
787
804
  </div>
788
805
  <ScaleHelper targetWidth={dims.width} />
@@ -0,0 +1,35 @@
1
+ import { Skeleton } from "@/components/ui/skeleton";
2
+
3
+ export function DeckEditorSkeleton({ label }: { label: string }) {
4
+ return (
5
+ <div
6
+ className="flex h-full min-h-0 flex-1 flex-col overflow-hidden bg-background"
7
+ role="status"
8
+ aria-label={label}
9
+ data-testid="deck-editor-loading"
10
+ >
11
+ <div className="flex h-11 shrink-0 items-center gap-3 border-b border-border px-3">
12
+ <Skeleton className="size-8 rounded-md" />
13
+ <Skeleton className="h-5 w-36" />
14
+ <div className="ml-auto flex items-center gap-2">
15
+ <Skeleton className="h-8 w-20 rounded-md" />
16
+ <Skeleton className="size-8 rounded-md" />
17
+ <Skeleton className="size-8 rounded-md" />
18
+ </div>
19
+ </div>
20
+ <div className="flex min-h-0 flex-1">
21
+ <div className="hidden w-56 shrink-0 flex-col gap-4 border-r border-border p-4 sm:w-64 md:flex">
22
+ {[0, 1, 2].map((index) => (
23
+ <div key={index} className="flex gap-3">
24
+ <Skeleton className="h-4 w-4 shrink-0 rounded-sm" />
25
+ <Skeleton className="aspect-video flex-1 rounded-md" />
26
+ </div>
27
+ ))}
28
+ </div>
29
+ <div className="flex min-w-0 flex-1 items-center justify-center bg-muted/20 p-6">
30
+ <Skeleton className="aspect-video w-full max-w-4xl rounded-md shadow-sm" />
31
+ </div>
32
+ </div>
33
+ </div>
34
+ );
35
+ }
@@ -51,14 +51,14 @@ interface EditorSidebarProps {
51
51
  onDuplicateSlide: (id: string) => void;
52
52
  onDeleteSlide: (id: string) => void;
53
53
  onAddEmptySlide: () => void;
54
+ /** Viewer-role decks get thumbnails only: no add, duplicate, or delete. */
55
+ readOnly?: boolean;
54
56
  /** Presence map: slideId → list of users currently viewing that slide */
55
57
  slidePresence?: Map<string, CollabUser[]>;
56
58
  /** Lingering recent edits (e.g. agent edits) to highlight over thumbnails. */
57
59
  recentEdits?: AttributedRecentEdit[];
58
60
  /** Deck aspect ratio (defaults to 16:9 when omitted) */
59
61
  aspectRatio?: AspectRatio;
60
- /** True while a newly-created deck is being populated slide by slide. */
61
- deckGenerating?: boolean;
62
62
  }
63
63
 
64
64
  /** Extract the slide id from a `{kind:"paths",paths:["slides.<id>"]}` edit. */
@@ -183,6 +183,7 @@ function SortableSlideThumb({
183
183
  registerButtonRef,
184
184
  presenceUsers = [],
185
185
  aspectRatio,
186
+ readOnly = false,
186
187
  }: {
187
188
  slide: Slide;
188
189
  index: number;
@@ -190,6 +191,7 @@ function SortableSlideThumb({
190
191
  onSelect: () => void;
191
192
  onDuplicate: () => void;
192
193
  onDelete: () => void;
194
+ readOnly?: boolean;
193
195
  registerButtonRef: (slideId: string, node: HTMLButtonElement | null) => void;
194
196
  presenceUsers?: CollabUser[];
195
197
  aspectRatio?: AspectRatio;
@@ -204,6 +206,7 @@ function SortableSlideThumb({
204
206
  isDragging,
205
207
  } = useSortable({
206
208
  id: slide.id,
209
+ disabled: readOnly,
207
210
  });
208
211
 
209
212
  const style = {
@@ -270,38 +273,40 @@ function SortableSlideThumb({
270
273
  </button>
271
274
 
272
275
  {/* Actions - always visible on touch devices */}
273
- <div className="absolute top-2 right-2 flex gap-0.5 sm:opacity-0 sm:group-hover:opacity-100">
274
- <Tooltip>
275
- <TooltipTrigger asChild>
276
- <button
277
- onClick={(e) => {
278
- e.stopPropagation();
279
- onDuplicate();
280
- }}
281
- className="p-1.5 rounded bg-black/60 backdrop-blur-sm border border-white/10 hover:bg-black/80"
282
- aria-label={t("editorSidebar.duplicateSlide")}
283
- >
284
- <IconCopy className="w-3 h-3 text-white/60" />
285
- </button>
286
- </TooltipTrigger>
287
- <TooltipContent>{t("editorSidebar.duplicate")}</TooltipContent>
288
- </Tooltip>
289
- <Tooltip>
290
- <TooltipTrigger asChild>
291
- <button
292
- onClick={(e) => {
293
- e.stopPropagation();
294
- onDelete();
295
- }}
296
- className="p-1.5 rounded bg-black/60 backdrop-blur-sm border border-white/10 hover:bg-red-900/80"
297
- aria-label={t("editorSidebar.deleteSlide")}
298
- >
299
- <IconTrash className="w-3 h-3 text-white/60" />
300
- </button>
301
- </TooltipTrigger>
302
- <TooltipContent>{t("editorSidebar.delete")}</TooltipContent>
303
- </Tooltip>
304
- </div>
276
+ {!readOnly && (
277
+ <div className="absolute top-2 right-2 flex gap-0.5 sm:opacity-0 sm:group-hover:opacity-100">
278
+ <Tooltip>
279
+ <TooltipTrigger asChild>
280
+ <button
281
+ onClick={(e) => {
282
+ e.stopPropagation();
283
+ onDuplicate();
284
+ }}
285
+ className="p-1.5 rounded bg-black/60 backdrop-blur-sm border border-white/10 hover:bg-black/80"
286
+ aria-label={t("editorSidebar.duplicateSlide")}
287
+ >
288
+ <IconCopy className="w-3 h-3 text-white/60" />
289
+ </button>
290
+ </TooltipTrigger>
291
+ <TooltipContent>{t("editorSidebar.duplicate")}</TooltipContent>
292
+ </Tooltip>
293
+ <Tooltip>
294
+ <TooltipTrigger asChild>
295
+ <button
296
+ onClick={(e) => {
297
+ e.stopPropagation();
298
+ onDelete();
299
+ }}
300
+ className="p-1.5 rounded bg-black/60 backdrop-blur-sm border border-white/10 hover:bg-red-900/80"
301
+ aria-label={t("editorSidebar.deleteSlide")}
302
+ >
303
+ <IconTrash className="w-3 h-3 text-white/60" />
304
+ </button>
305
+ </TooltipTrigger>
306
+ <TooltipContent>{t("editorSidebar.delete")}</TooltipContent>
307
+ </Tooltip>
308
+ </div>
309
+ )}
305
310
  </div>
306
311
  );
307
312
  }
@@ -550,10 +555,10 @@ export default function EditorSidebar({
550
555
  onDuplicateSlide,
551
556
  onDeleteSlide,
552
557
  onAddEmptySlide,
558
+ readOnly = false,
553
559
  slidePresence,
554
560
  recentEdits,
555
561
  aspectRatio,
556
- deckGenerating = false,
557
562
  }: EditorSidebarProps) {
558
563
  const t = useT();
559
564
  const activeIndex = slides.findIndex((s) => s.id === activeSlideId);
@@ -577,7 +582,6 @@ export default function EditorSidebar({
577
582
  [],
578
583
  );
579
584
  const { generating, submit: agentSubmit } = useAgentGenerating();
580
- const showGeneratingSlide = deckGenerating || addSlideGenerating;
581
585
 
582
586
  const registerSlideButton = useCallback(
583
587
  (slideId: string, node: HTMLButtonElement | null) => {
@@ -638,7 +642,7 @@ export default function EditorSidebar({
638
642
  <span className="text-xs font-medium text-muted-foreground uppercase tracking-wider">
639
643
  {t("editorSidebar.slides")}
640
644
  </span>
641
- {showGeneratingSlide ? (
645
+ {readOnly ? null : addSlideGenerating ? (
642
646
  <IconLoader2 className="w-4 h-4 text-muted-foreground animate-spin" />
643
647
  ) : (
644
648
  <Tooltip>
@@ -674,13 +678,14 @@ export default function EditorSidebar({
674
678
  onSelect={() => onSelectSlide(slide.id)}
675
679
  onDuplicate={() => onDuplicateSlide(slide.id)}
676
680
  onDelete={() => onDeleteSlide(slide.id)}
681
+ readOnly={readOnly}
677
682
  registerButtonRef={registerSlideButton}
678
683
  presenceUsers={slidePresence?.get(slide.id) ?? []}
679
684
  aspectRatio={aspectRatio}
680
685
  />
681
686
  ))}
682
687
  </SortableContext>
683
- {showGeneratingSlide && (
688
+ {addSlideGenerating && (
684
689
  <GeneratingSlideSkeleton
685
690
  index={slides.length}
686
691
  aspectRatio={aspectRatio}
@@ -697,24 +702,26 @@ export default function EditorSidebar({
697
702
  )}
698
703
  </div>
699
704
 
700
- <AddSlidePopover
701
- open={addOpen}
702
- onOpenChange={setAddOpen}
703
- anchorRef={headerAddRef}
704
- deckId={deckId}
705
- deckTitle={deckTitle}
706
- activeSlideId={activeSlideId}
707
- slideCount={slides.length}
708
- activeSlideIndex={activeIndex >= 0 ? activeIndex : 0}
709
- agentSubmit={(msg, ctx) => {
710
- setAddSlideGenerating(true);
711
- agentSubmit(msg, ctx);
712
- }}
713
- onDuplicateCurrent={
714
- activeSlideId ? () => onDuplicateSlide(activeSlideId) : undefined
715
- }
716
- onAddEmpty={onAddEmptySlide}
717
- />
705
+ {!readOnly && (
706
+ <AddSlidePopover
707
+ open={addOpen}
708
+ onOpenChange={setAddOpen}
709
+ anchorRef={headerAddRef}
710
+ deckId={deckId}
711
+ deckTitle={deckTitle}
712
+ activeSlideId={activeSlideId}
713
+ slideCount={slides.length}
714
+ activeSlideIndex={activeIndex >= 0 ? activeIndex : 0}
715
+ agentSubmit={(msg, ctx) => {
716
+ setAddSlideGenerating(true);
717
+ agentSubmit(msg, ctx);
718
+ }}
719
+ onDuplicateCurrent={
720
+ activeSlideId ? () => onDuplicateSlide(activeSlideId) : undefined
721
+ }
722
+ onAddEmpty={onAddEmptySlide}
723
+ />
724
+ )}
718
725
  </div>
719
726
  );
720
727
  }