@agent-native/core 0.79.27 → 0.80.1

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 (497) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +34 -0
  3. package/corpus/core/docs/content/locales/ar-SA/skills-guide.mdx +5 -0
  4. package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +55 -1
  5. package/corpus/core/docs/content/locales/de-DE/skills-guide.mdx +5 -0
  6. package/corpus/core/docs/content/locales/de-DE/template-design.mdx +66 -1
  7. package/corpus/core/docs/content/locales/es-ES/skills-guide.mdx +5 -0
  8. package/corpus/core/docs/content/locales/es-ES/template-design.mdx +65 -1
  9. package/corpus/core/docs/content/locales/fr-FR/skills-guide.mdx +5 -0
  10. package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +64 -1
  11. package/corpus/core/docs/content/locales/hi-IN/skills-guide.mdx +5 -0
  12. package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +59 -1
  13. package/corpus/core/docs/content/locales/ja-JP/skills-guide.mdx +5 -0
  14. package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +62 -1
  15. package/corpus/core/docs/content/locales/ko-KR/skills-guide.mdx +5 -0
  16. package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +58 -1
  17. package/corpus/core/docs/content/locales/pt-BR/skills-guide.mdx +5 -0
  18. package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +62 -1
  19. package/corpus/core/docs/content/locales/zh-CN/skills-guide.mdx +5 -0
  20. package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +50 -1
  21. package/corpus/core/docs/content/locales/zh-TW/skills-guide.mdx +5 -0
  22. package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +52 -1
  23. package/corpus/core/docs/content/skills-guide.mdx +5 -0
  24. package/corpus/core/docs/content/template-design.mdx +59 -1
  25. package/corpus/core/package.json +2 -1
  26. package/corpus/core/src/agent/engine/index.ts +1 -0
  27. package/corpus/core/src/agent/engine/registry.ts +40 -0
  28. package/corpus/core/src/agent/production-agent.ts +6 -2
  29. package/corpus/core/src/application-state/handlers.ts +1 -1
  30. package/corpus/core/src/brand-kit/index.ts +1 -1
  31. package/corpus/core/src/cli/design-connect.ts +490 -0
  32. package/corpus/core/src/cli/index.ts +16 -0
  33. package/corpus/core/src/cli/skills.ts +144 -3
  34. package/corpus/core/src/client/AgentPanel.tsx +1 -1
  35. package/corpus/core/src/client/AssistantChat.tsx +43 -7
  36. package/corpus/core/src/client/MultiTabAssistantChat.tsx +1 -1
  37. package/corpus/core/src/client/agent-chat.ts +27 -3
  38. package/corpus/core/src/client/blocks/library/MermaidBlock.tsx +1 -1
  39. package/corpus/core/src/client/blocks/library/diagram.tsx +2 -2
  40. package/corpus/core/src/client/blocks/library/wireframe.tsx +1 -1
  41. package/corpus/core/src/client/chat/message-components.tsx +1 -1
  42. package/corpus/core/src/client/chat-model-groups.ts +1 -2
  43. package/corpus/core/src/client/components/LiveCursorOverlay.tsx +33 -66
  44. package/corpus/core/src/client/composer/TiptapComposer.tsx +99 -24
  45. package/corpus/core/src/client/composer/useVoiceDictation.ts +429 -260
  46. package/corpus/core/src/client/extensions/portable-extension.ts +1 -1
  47. package/corpus/core/src/client/frame-protocol.ts +17 -2
  48. package/corpus/core/src/client/rich-markdown-editor/RegistryBlockNode.tsx +2 -2
  49. package/corpus/core/src/client/sharing/ShareButton.tsx +20 -15
  50. package/corpus/core/src/client/use-agent-engine-configured.ts +80 -28
  51. package/corpus/core/src/code-agents/transcript-normalizer.ts +1 -1
  52. package/corpus/core/src/extensions/path.ts +1 -4
  53. package/corpus/core/src/integrations/a2a-continuation-processor.ts +1 -1
  54. package/corpus/core/src/mcp/build-server.ts +1 -1
  55. package/corpus/core/src/org/handlers.ts +5 -5
  56. package/corpus/core/src/org/plugin.ts +2 -2
  57. package/corpus/core/src/scripts/call-agent.ts +1 -1
  58. package/corpus/core/src/scripts/db/safety.ts +1 -1
  59. package/corpus/core/src/server/auth.ts +3 -0
  60. package/corpus/core/src/server/builder-design-systems.ts +308 -0
  61. package/corpus/core/src/server/core-routes-plugin.ts +29 -3
  62. package/corpus/core/src/server/index.ts +8 -0
  63. package/corpus/core/src/server/transcribe-voice.ts +57 -22
  64. package/corpus/core/src/shared/mcp-embed-headers.ts +23 -1
  65. package/corpus/core/src/styles/agent-native.css +60 -4
  66. package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
  67. package/corpus/core/src/usage/store.ts +2 -2
  68. package/corpus/core/src/vite/client.ts +2 -0
  69. package/corpus/core/src/voice/index.ts +18 -0
  70. package/corpus/core/src/voice/voice-cleanup-prompt.ts +38 -0
  71. package/corpus/core/src/voice/voice-context.ts +217 -0
  72. package/corpus/core/src/voice/voice-replacements.ts +75 -0
  73. package/corpus/templates/analytics/AGENTS.md +4 -3
  74. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +298 -15
  75. package/corpus/templates/analytics/actions/get-sql-dashboard.ts +9 -4
  76. package/corpus/templates/analytics/actions/list-session-recordings.ts +6 -1
  77. package/corpus/templates/analytics/actions/mutate-dashboard.ts +18 -2
  78. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +12 -2
  79. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +557 -400
  80. package/corpus/templates/analytics/app/global.css +0 -4
  81. package/corpus/templates/analytics/app/hooks/use-replay-storage-status.ts +66 -0
  82. package/corpus/templates/analytics/app/i18n/zh-TW.ts +39 -0
  83. package/corpus/templates/analytics/app/i18n-data.ts +424 -0
  84. package/corpus/templates/analytics/app/pages/Settings.tsx +333 -0
  85. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +2 -1
  86. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/dashboard-layout.ts +121 -3
  87. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +82 -34
  88. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +7 -0
  89. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +144 -36
  90. package/corpus/templates/analytics/changelog/2026-06-28-ask-tab-now-matches-the-darker-app-background.md +6 -0
  91. package/corpus/templates/analytics/changelog/2026-06-28-dashboard-email-reports-now-use-cleaner-light-mode-snapshots.md +6 -0
  92. package/corpus/templates/analytics/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  93. package/corpus/templates/analytics/changelog/2026-06-28-sessions-now-show-only-signed-in-recordings-with-playable-re.md +6 -0
  94. package/corpus/templates/analytics/changelog/2026-06-29-analytics-agents-can-now-place-new-charts-into-requested-das.md +6 -0
  95. package/corpus/templates/analytics/changelog/2026-06-29-analytics-queries-now-report-failed-source-query-errors-inst.md +6 -0
  96. package/corpus/templates/analytics/changelog/2026-06-29-charts-can-now-be-dropped-between-full-dashboard-rows-to-cre.md +6 -0
  97. package/corpus/templates/analytics/changelog/2026-06-29-dashboard-email-reports-include-the-full-dashboard-image-wit.md +6 -0
  98. package/corpus/templates/analytics/changelog/2026-06-29-main-surface-border-reaches-the-top.md +6 -0
  99. package/corpus/templates/analytics/changelog/2026-06-29-session-replay-now-records-playable-sessions-in-production-a.md +6 -0
  100. package/corpus/templates/analytics/changelog/2026-06-29-set-up-session-replay-storage-from-settings-connect-builder-.md +6 -0
  101. package/corpus/templates/analytics/scripts/cleanup-empty-session-recordings.ts +102 -0
  102. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +3 -3
  103. package/corpus/templates/analytics/server/lib/dashboard-report.ts +75 -30
  104. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +5 -2
  105. package/corpus/templates/analytics/server/lib/real-data-actions.ts +81 -20
  106. package/corpus/templates/analytics/server/lib/replay-storage.ts +79 -0
  107. package/corpus/templates/analytics/server/lib/s3-upload-provider.ts +255 -0
  108. package/corpus/templates/analytics/server/lib/session-replay.ts +53 -12
  109. package/corpus/templates/analytics/server/plugins/agent-chat.ts +11 -2
  110. package/corpus/templates/analytics/server/plugins/onboarding.ts +97 -0
  111. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +4 -4
  112. package/corpus/templates/assets/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  113. package/corpus/templates/brain/app/components/layout/Layout.tsx +29 -2
  114. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +131 -42
  115. package/corpus/templates/brain/app/i18n/zh-TW.ts +2 -0
  116. package/corpus/templates/brain/app/i18n-data.ts +20 -0
  117. package/corpus/templates/brain/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  118. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +29 -1
  119. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +417 -299
  120. package/corpus/templates/calendar/app/i18n/zh-TW.ts +2 -0
  121. package/corpus/templates/calendar/app/i18n-data.ts +20 -0
  122. package/corpus/templates/calendar/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  123. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +6 -19
  124. package/corpus/templates/chat/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  125. package/corpus/templates/clips/AGENTS.md +4 -0
  126. package/corpus/templates/clips/actions/cleanup-transcript.ts +39 -9
  127. package/corpus/templates/clips/actions/finalize-meeting.ts +81 -12
  128. package/corpus/templates/clips/actions/lib/agents-md-context.ts +4 -1
  129. package/corpus/templates/clips/app/components/library/library-layout.tsx +3 -3
  130. package/corpus/templates/clips/app/components/meetings/share-meeting-dialog.tsx +1 -1
  131. package/corpus/templates/clips/app/components/player/share-dialog.tsx +2 -2
  132. package/corpus/templates/clips/changelog/2026-06-28-left-sidebar-footer-controls-use-less-divider-chrome.md +6 -0
  133. package/corpus/templates/clips/desktop/src/lib/personal-vocabulary.ts +13 -8
  134. package/corpus/templates/clips/desktop/src/lib/recorder.ts +24 -0
  135. package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +105 -5
  136. package/corpus/templates/clips/desktop/src/lib/voice-dictation.ts +60 -1
  137. package/corpus/templates/content/actions/set-image-alt-text.ts +1 -1
  138. package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +1 -1
  139. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +1 -1
  140. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +5 -5
  141. package/corpus/templates/content/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  142. package/corpus/templates/content/shared/document-export.ts +1 -1
  143. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -18
  144. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +154 -0
  145. package/corpus/templates/design/AGENTS.md +95 -5
  146. package/corpus/templates/design/DESIGN.md +82 -0
  147. package/corpus/templates/design/DEVELOPING.md +43 -0
  148. package/corpus/templates/design/actions/add-localhost-screens.ts +453 -0
  149. package/corpus/templates/design/actions/apply-shader.ts +277 -0
  150. package/corpus/templates/design/actions/apply-visual-edit.ts +303 -0
  151. package/corpus/templates/design/actions/connect-localhost.ts +183 -0
  152. package/corpus/templates/design/actions/edit-design.ts +195 -42
  153. package/corpus/templates/design/actions/generate-design.ts +71 -1
  154. package/corpus/templates/design/actions/generate-screens.ts +193 -0
  155. package/corpus/templates/design/actions/get-code-layer-projection.ts +191 -0
  156. package/corpus/templates/design/actions/get-shader.ts +119 -0
  157. package/corpus/templates/design/actions/index-design-system-with-builder.ts +259 -0
  158. package/corpus/templates/design/actions/list-localhost-connections.ts +95 -0
  159. package/corpus/templates/design/actions/navigate.ts +55 -2
  160. package/corpus/templates/design/actions/update-file.ts +9 -2
  161. package/corpus/templates/design/actions/view-screen.ts +68 -1
  162. package/corpus/templates/design/agent-native.app-skill.json +10 -0
  163. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +719 -0
  164. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +2120 -103
  165. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +74 -38
  166. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +401 -0
  167. package/corpus/templates/design/app/components/design/EditPanel.tsx +3966 -440
  168. package/corpus/templates/design/app/components/design/LayersPanel.tsx +1473 -0
  169. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +3940 -147
  170. package/corpus/templates/design/app/components/design/QuestionFlow.tsx +700 -13
  171. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +105 -63
  172. package/corpus/templates/design/app/components/design/index.ts +0 -5
  173. package/corpus/templates/design/app/components/design/inspector/AlignmentMatrix.tsx +353 -0
  174. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +1589 -0
  175. package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +511 -0
  176. package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +395 -0
  177. package/corpus/templates/design/app/components/design/inspector/FigmaColorPicker.tsx +2010 -0
  178. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +601 -0
  179. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +242 -0
  180. package/corpus/templates/design/app/components/design/inspector/SHADER_INTEGRATION.md +420 -0
  181. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +238 -0
  182. package/corpus/templates/design/app/components/design/inspector/ShaderControls.stories.tsx +71 -0
  183. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +575 -0
  184. package/corpus/templates/design/app/components/design/inspector/ShaderEffectRow.tsx +106 -0
  185. package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +423 -0
  186. package/corpus/templates/design/app/components/design/inspector/figma-icons.tsx +741 -0
  187. package/corpus/templates/design/app/components/design/inspector/index.ts +87 -0
  188. package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +201 -0
  189. package/corpus/templates/design/app/components/design/types.ts +23 -0
  190. package/corpus/templates/design/app/components/layout/Layout.tsx +24 -13
  191. package/corpus/templates/design/app/components/layout/Sidebar.tsx +4 -4
  192. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +474 -36
  193. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +22 -5
  194. package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +24 -11
  195. package/corpus/templates/design/app/global.css +149 -5
  196. package/corpus/templates/design/app/hooks/use-agent-generating.ts +4 -0
  197. package/corpus/templates/design/app/hooks/use-navigation-state.ts +130 -8
  198. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +329 -0
  199. package/corpus/templates/design/app/i18n/zh-TW.ts +277 -0
  200. package/corpus/templates/design/app/i18n-data.ts +3028 -1
  201. package/corpus/templates/design/app/pages/DesignEditor.tsx +5831 -904
  202. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +57 -221
  203. package/corpus/templates/design/changelog/2026-06-28-annotate-mode-now-combines-drawing-and-comment-pins-in-one-c.md +6 -0
  204. package/corpus/templates/design/changelog/2026-06-28-design-editor-panel-borders-are-cleaner-so-the-canvas-edge-s.md +6 -0
  205. package/corpus/templates/design/changelog/2026-06-28-drawing-prompts-now-reliably-open-and-submit-to-the-design-a.md +6 -0
  206. package/corpus/templates/design/changelog/2026-06-28-editor-app-menus-now-use-an-outline-agent-native-mark-with-b.md +6 -0
  207. package/corpus/templates/design/changelog/2026-06-28-figma-style-code-design-mode.md +6 -0
  208. package/corpus/templates/design/changelog/2026-06-28-layer-selection-now-updates-chat-context-without-opening-the.md +6 -0
  209. package/corpus/templates/design/changelog/2026-06-28-layer-selections-now-preserve-hidden-and-locked-canvas-state.md +6 -0
  210. package/corpus/templates/design/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  211. package/corpus/templates/design/changelog/2026-06-28-live-cursors-now-keep-names-beside-a-cleaner-pointer-marker.md +6 -0
  212. package/corpus/templates/design/changelog/2026-06-28-mode-switching-now-lives-in-a-compact-bottom-right-icon-dock.md +6 -0
  213. package/corpus/templates/design/changelog/2026-06-28-screen-overview-now-handles-zooming-drawing-opening-and-dele.md +6 -0
  214. package/corpus/templates/design/changelog/2026-06-28-screen-overview-now-selects-screens-on-click-and-opens-them-.md +6 -0
  215. package/corpus/templates/design/changelog/2026-06-28-screen-overview-zooms-into-the-active-screen-with-smoother-e.md +6 -0
  216. package/corpus/templates/design/changelog/2026-06-28-selected-element-chips-in-chat-are-shorter-and-easier-to-sca.md +6 -0
  217. package/corpus/templates/design/changelog/2026-06-28-the-design-editor-toolbar-is-more-compact-and-the-app-menu-m.md +6 -0
  218. package/corpus/templates/design/changelog/2026-06-28-tweaks-now-live-at-the-top-of-the-design-sidebar-instead-of-.md +6 -0
  219. package/corpus/templates/design/changelog/2026-06-28-tweaks-now-live-in-the-right-inspector-beside-the-design-tab.md +6 -0
  220. package/corpus/templates/design/changelog/2026-06-29-active-sidebar-rows-use-soft-highlights.md +6 -0
  221. package/corpus/templates/design/changelog/2026-06-29-agents-can-now-open-screen-overview-focus-screens-and-add.md +6 -0
  222. package/corpus/templates/design/changelog/2026-06-29-canvas-selection-no-longer-flashes-broken-prototype-html-whe.md +6 -0
  223. package/corpus/templates/design/changelog/2026-06-29-command-menu-selections-are-clearer-in-dark-mode.md +6 -0
  224. package/corpus/templates/design/changelog/2026-06-29-design-agents-now-edit-broad-copy-changes-more-reliably.md +6 -0
  225. package/corpus/templates/design/changelog/2026-06-29-design-editor-extensions-now-run-inline-beside-the-artboard.md +6 -0
  226. package/corpus/templates/design/changelog/2026-06-29-design-mode-top-chrome-now-groups-collaborators-preview-shar.md +6 -0
  227. package/corpus/templates/design/changelog/2026-06-29-element-selection-now-stays-on-the-intended-layer-after-sele.md +6 -0
  228. package/corpus/templates/design/changelog/2026-06-29-screen-overview-full-view-controls-now-sit-above-frames-inst.md +6 -0
  229. package/corpus/templates/design/changelog/2026-06-29-screen-overview-tools-can-draw-shapes-create-screens-and-kee.md +6 -0
  230. package/corpus/templates/design/changelog/2026-06-29-sidebars-use-darker-chrome-and-chat-warns-immediately.md +6 -0
  231. package/corpus/templates/design/changelog/2026-06-29-the-pen-tool-now-creates-anchor-based-bezier-vectors-with-ha.md +6 -0
  232. package/corpus/templates/design/changelog/2026-06-29-visual-edit-can-open-localhost-routes-as-url-backed-screens.md +6 -0
  233. package/corpus/templates/design/package.json +1 -0
  234. package/corpus/templates/design/server/db/schema.ts +26 -0
  235. package/corpus/templates/design/server/handlers/import-figma-system.ts +38 -85
  236. package/corpus/templates/design/server/lib/design-snapshot.ts +9 -1
  237. package/corpus/templates/design/server/plugins/agent-chat.ts +3 -0
  238. package/corpus/templates/design/shared/api.ts +27 -0
  239. package/corpus/templates/design/shared/canvas-frames.ts +103 -0
  240. package/corpus/templates/design/shared/canvas-math.ts +1058 -0
  241. package/corpus/templates/design/shared/code-layer.ts +2412 -0
  242. package/corpus/templates/design/shared/color-utils.ts +180 -0
  243. package/corpus/templates/design/shared/generation-session.ts +61 -0
  244. package/corpus/templates/design/shared/html-content.ts +21 -0
  245. package/corpus/templates/design/shared/pen-path.ts +207 -0
  246. package/corpus/templates/design/shared/shader-presets.ts +782 -0
  247. package/corpus/templates/design/shared/shader-safety.ts +137 -0
  248. package/corpus/templates/design/shared/source-mode.ts +237 -0
  249. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +149 -6
  250. package/corpus/templates/forms/app/i18n/ar-SA.ts +2 -0
  251. package/corpus/templates/forms/app/i18n/de-DE.ts +2 -0
  252. package/corpus/templates/forms/app/i18n/en-US.ts +2 -0
  253. package/corpus/templates/forms/app/i18n/es-ES.ts +2 -0
  254. package/corpus/templates/forms/app/i18n/fr-FR.ts +2 -0
  255. package/corpus/templates/forms/app/i18n/hi-IN.ts +2 -0
  256. package/corpus/templates/forms/app/i18n/ja-JP.ts +2 -0
  257. package/corpus/templates/forms/app/i18n/ko-KR.ts +2 -0
  258. package/corpus/templates/forms/app/i18n/pt-BR.ts +2 -0
  259. package/corpus/templates/forms/app/i18n/zh-CN.ts +2 -0
  260. package/corpus/templates/forms/app/i18n/zh-TW.ts +2 -0
  261. package/corpus/templates/forms/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  262. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +2 -2
  263. package/corpus/templates/macros/changelog/2026-06-28-left-sidebar-footer-controls-use-less-divider-chrome.md +6 -0
  264. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +408 -247
  265. package/corpus/templates/mail/app/i18n/ar-SA.ts +4 -0
  266. package/corpus/templates/mail/app/i18n/de-DE.ts +4 -0
  267. package/corpus/templates/mail/app/i18n/en-US.ts +4 -0
  268. package/corpus/templates/mail/app/i18n/es-ES.ts +4 -0
  269. package/corpus/templates/mail/app/i18n/fr-FR.ts +4 -0
  270. package/corpus/templates/mail/app/i18n/hi-IN.ts +4 -0
  271. package/corpus/templates/mail/app/i18n/ja-JP.ts +4 -0
  272. package/corpus/templates/mail/app/i18n/ko-KR.ts +4 -0
  273. package/corpus/templates/mail/app/i18n/pt-BR.ts +4 -0
  274. package/corpus/templates/mail/app/i18n/zh-CN.ts +4 -0
  275. package/corpus/templates/mail/app/i18n/zh-TW.ts +4 -0
  276. package/corpus/templates/mail/app/lib/utils.ts +2 -2
  277. package/corpus/templates/mail/changelog/2026-06-28-pinned-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  278. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +6 -8
  279. package/corpus/templates/plan/app/components/plan/wireframe/Wireframe.tsx +1 -1
  280. package/corpus/templates/plan/app/global.css +61 -78
  281. package/corpus/templates/plan/app/pages/PlansPage.tsx +8 -0
  282. package/corpus/templates/plan/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  283. package/corpus/templates/plan/changelog/2026-06-28-plans-use-the-shared-neutral-light-and-dark-theme.md +6 -0
  284. package/corpus/templates/plan/changelog/2026-06-28-sending-open-feedback-from-a-plan-now-opens-the-inline-plan-.md +6 -0
  285. package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +9 -10
  286. package/corpus/templates/slides/AGENTS.md +3 -2
  287. package/corpus/templates/slides/actions/import-file.ts +26 -17
  288. package/corpus/templates/slides/actions/index-design-system-with-builder.ts +259 -0
  289. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +35 -167
  290. package/corpus/templates/slides/app/components/design-system/fig-import-response.ts +9 -13
  291. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +5 -5
  292. package/corpus/templates/slides/app/context/DeckContext.tsx +1 -1
  293. package/corpus/templates/slides/app/i18n/ar-SA.ts +9 -37
  294. package/corpus/templates/slides/app/i18n/de-DE.ts +10 -25
  295. package/corpus/templates/slides/app/i18n/en-US.ts +9 -26
  296. package/corpus/templates/slides/app/i18n/es-ES.ts +10 -28
  297. package/corpus/templates/slides/app/i18n/fr-FR.ts +10 -28
  298. package/corpus/templates/slides/app/i18n/hi-IN.ts +9 -26
  299. package/corpus/templates/slides/app/i18n/ja-JP.ts +10 -22
  300. package/corpus/templates/slides/app/i18n/ko-KR.ts +9 -23
  301. package/corpus/templates/slides/app/i18n/pt-BR.ts +10 -28
  302. package/corpus/templates/slides/app/i18n/zh-CN.ts +9 -22
  303. package/corpus/templates/slides/app/i18n/zh-TW.ts +9 -22
  304. package/corpus/templates/slides/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  305. package/corpus/templates/slides/server/handlers/import-figma-system.ts +44 -12
  306. package/corpus/templates/slides/server/lib/chat-attachments.ts +1 -1
  307. package/corpus/templates/videos/app/components/NewCompositionPopover.tsx +1 -1
  308. package/corpus/templates/videos/app/components/Sidebar.tsx +2 -2
  309. package/corpus/templates/videos/app/components/layout/Layout.tsx +29 -2
  310. package/corpus/templates/videos/app/components/layout/NavSidebar.tsx +113 -30
  311. package/corpus/templates/videos/app/i18n/ar-SA.ts +2 -0
  312. package/corpus/templates/videos/app/i18n/de-DE.ts +2 -0
  313. package/corpus/templates/videos/app/i18n/en-US.ts +2 -0
  314. package/corpus/templates/videos/app/i18n/es-ES.ts +2 -0
  315. package/corpus/templates/videos/app/i18n/fr-FR.ts +2 -0
  316. package/corpus/templates/videos/app/i18n/hi-IN.ts +2 -0
  317. package/corpus/templates/videos/app/i18n/ja-JP.ts +2 -0
  318. package/corpus/templates/videos/app/i18n/ko-KR.ts +2 -0
  319. package/corpus/templates/videos/app/i18n/pt-BR.ts +2 -0
  320. package/corpus/templates/videos/app/i18n/zh-CN.ts +2 -0
  321. package/corpus/templates/videos/app/i18n/zh-TW.ts +2 -0
  322. package/corpus/templates/videos/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  323. package/dist/agent/engine/index.d.ts +1 -1
  324. package/dist/agent/engine/index.d.ts.map +1 -1
  325. package/dist/agent/engine/index.js +1 -1
  326. package/dist/agent/engine/index.js.map +1 -1
  327. package/dist/agent/engine/registry.d.ts +9 -0
  328. package/dist/agent/engine/registry.d.ts.map +1 -1
  329. package/dist/agent/engine/registry.js +37 -0
  330. package/dist/agent/engine/registry.js.map +1 -1
  331. package/dist/agent/production-agent.d.ts.map +1 -1
  332. package/dist/agent/production-agent.js +4 -3
  333. package/dist/agent/production-agent.js.map +1 -1
  334. package/dist/application-state/handlers.js +1 -1
  335. package/dist/application-state/handlers.js.map +1 -1
  336. package/dist/brand-kit/index.d.ts +1 -1
  337. package/dist/brand-kit/index.js +1 -1
  338. package/dist/brand-kit/index.js.map +1 -1
  339. package/dist/cli/design-connect.d.ts +52 -0
  340. package/dist/cli/design-connect.d.ts.map +1 -0
  341. package/dist/cli/design-connect.js +409 -0
  342. package/dist/cli/design-connect.js.map +1 -0
  343. package/dist/cli/index.js +15 -0
  344. package/dist/cli/index.js.map +1 -1
  345. package/dist/cli/skills.d.ts +3 -0
  346. package/dist/cli/skills.d.ts.map +1 -1
  347. package/dist/cli/skills.js +139 -3
  348. package/dist/cli/skills.js.map +1 -1
  349. package/dist/client/AgentPanel.js +1 -1
  350. package/dist/client/AgentPanel.js.map +1 -1
  351. package/dist/client/AssistantChat.d.ts.map +1 -1
  352. package/dist/client/AssistantChat.js +38 -8
  353. package/dist/client/AssistantChat.js.map +1 -1
  354. package/dist/client/MultiTabAssistantChat.js +1 -1
  355. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  356. package/dist/client/agent-chat.d.ts +6 -0
  357. package/dist/client/agent-chat.d.ts.map +1 -1
  358. package/dist/client/agent-chat.js +17 -3
  359. package/dist/client/agent-chat.js.map +1 -1
  360. package/dist/client/blocks/library/MermaidBlock.js +1 -1
  361. package/dist/client/blocks/library/MermaidBlock.js.map +1 -1
  362. package/dist/client/blocks/library/diagram.js +1 -1
  363. package/dist/client/blocks/library/diagram.js.map +1 -1
  364. package/dist/client/blocks/library/wireframe.js +1 -1
  365. package/dist/client/blocks/library/wireframe.js.map +1 -1
  366. package/dist/client/chat/message-components.js +1 -1
  367. package/dist/client/chat/message-components.js.map +1 -1
  368. package/dist/client/chat-model-groups.d.ts.map +1 -1
  369. package/dist/client/chat-model-groups.js +1 -2
  370. package/dist/client/chat-model-groups.js.map +1 -1
  371. package/dist/client/components/LiveCursorOverlay.d.ts +1 -2
  372. package/dist/client/components/LiveCursorOverlay.d.ts.map +1 -1
  373. package/dist/client/components/LiveCursorOverlay.js +19 -40
  374. package/dist/client/components/LiveCursorOverlay.js.map +1 -1
  375. package/dist/client/composer/TiptapComposer.d.ts +3 -1
  376. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  377. package/dist/client/composer/TiptapComposer.js +86 -24
  378. package/dist/client/composer/TiptapComposer.js.map +1 -1
  379. package/dist/client/composer/useVoiceDictation.d.ts +9 -0
  380. package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
  381. package/dist/client/composer/useVoiceDictation.js +154 -32
  382. package/dist/client/composer/useVoiceDictation.js.map +1 -1
  383. package/dist/client/extensions/portable-extension.d.ts +1 -1
  384. package/dist/client/extensions/portable-extension.d.ts.map +1 -1
  385. package/dist/client/extensions/portable-extension.js.map +1 -1
  386. package/dist/client/frame-protocol.d.ts +17 -2
  387. package/dist/client/frame-protocol.d.ts.map +1 -1
  388. package/dist/client/frame-protocol.js.map +1 -1
  389. package/dist/client/rich-markdown-editor/RegistryBlockNode.js +2 -2
  390. package/dist/client/rich-markdown-editor/RegistryBlockNode.js.map +1 -1
  391. package/dist/client/sharing/ShareButton.d.ts +2 -0
  392. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  393. package/dist/client/sharing/ShareButton.js +7 -6
  394. package/dist/client/sharing/ShareButton.js.map +1 -1
  395. package/dist/client/use-agent-engine-configured.d.ts +5 -0
  396. package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
  397. package/dist/client/use-agent-engine-configured.js +51 -25
  398. package/dist/client/use-agent-engine-configured.js.map +1 -1
  399. package/dist/code-agents/transcript-normalizer.js +1 -1
  400. package/dist/code-agents/transcript-normalizer.js.map +1 -1
  401. package/dist/collab/routes.d.ts +1 -1
  402. package/dist/extensions/path.d.ts +1 -1
  403. package/dist/extensions/path.d.ts.map +1 -1
  404. package/dist/extensions/path.js.map +1 -1
  405. package/dist/file-upload/actions/upload-image.d.ts +2 -2
  406. package/dist/integrations/a2a-continuation-processor.js +1 -1
  407. package/dist/integrations/a2a-continuation-processor.js.map +1 -1
  408. package/dist/mcp/build-server.d.ts +1 -1
  409. package/dist/mcp/build-server.d.ts.map +1 -1
  410. package/dist/mcp/build-server.js.map +1 -1
  411. package/dist/notifications/routes.d.ts +3 -3
  412. package/dist/observability/routes.d.ts +5 -5
  413. package/dist/org/handlers.js +5 -5
  414. package/dist/org/handlers.js.map +1 -1
  415. package/dist/org/plugin.js +2 -2
  416. package/dist/org/plugin.js.map +1 -1
  417. package/dist/scripts/call-agent.js +1 -1
  418. package/dist/scripts/call-agent.js.map +1 -1
  419. package/dist/scripts/db/safety.js +1 -1
  420. package/dist/scripts/db/safety.js.map +1 -1
  421. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  422. package/dist/server/auth.d.ts.map +1 -1
  423. package/dist/server/auth.js +3 -0
  424. package/dist/server/auth.js.map +1 -1
  425. package/dist/server/builder-design-systems.d.ts +28 -0
  426. package/dist/server/builder-design-systems.d.ts.map +1 -0
  427. package/dist/server/builder-design-systems.js +217 -0
  428. package/dist/server/builder-design-systems.js.map +1 -0
  429. package/dist/server/core-routes-plugin.d.ts +1 -0
  430. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  431. package/dist/server/core-routes-plugin.js +20 -3
  432. package/dist/server/core-routes-plugin.js.map +1 -1
  433. package/dist/server/index.d.ts +1 -0
  434. package/dist/server/index.d.ts.map +1 -1
  435. package/dist/server/index.js +1 -0
  436. package/dist/server/index.js.map +1 -1
  437. package/dist/server/transcribe-voice.d.ts +1 -1
  438. package/dist/server/transcribe-voice.d.ts.map +1 -1
  439. package/dist/server/transcribe-voice.js +40 -24
  440. package/dist/server/transcribe-voice.js.map +1 -1
  441. package/dist/shared/mcp-embed-headers.d.ts +1 -0
  442. package/dist/shared/mcp-embed-headers.d.ts.map +1 -1
  443. package/dist/shared/mcp-embed-headers.js +20 -1
  444. package/dist/shared/mcp-embed-headers.js.map +1 -1
  445. package/dist/styles/agent-native.css +60 -4
  446. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
  447. package/dist/usage/store.js +2 -2
  448. package/dist/usage/store.js.map +1 -1
  449. package/dist/vite/client.d.ts.map +1 -1
  450. package/dist/vite/client.js +2 -0
  451. package/dist/vite/client.js.map +1 -1
  452. package/dist/voice/index.d.ts +5 -0
  453. package/dist/voice/index.d.ts.map +1 -0
  454. package/dist/voice/index.js +4 -0
  455. package/dist/voice/index.js.map +1 -0
  456. package/dist/voice/voice-cleanup-prompt.d.ts +6 -0
  457. package/dist/voice/voice-cleanup-prompt.d.ts.map +1 -0
  458. package/dist/voice/voice-cleanup-prompt.js +26 -0
  459. package/dist/voice/voice-cleanup-prompt.js.map +1 -0
  460. package/dist/voice/voice-context.d.ts +25 -0
  461. package/dist/voice/voice-context.d.ts.map +1 -0
  462. package/dist/voice/voice-context.js +156 -0
  463. package/dist/voice/voice-context.js.map +1 -0
  464. package/dist/voice/voice-replacements.d.ts +4 -0
  465. package/dist/voice/voice-replacements.d.ts.map +1 -0
  466. package/dist/voice/voice-replacements.js +52 -0
  467. package/dist/voice/voice-replacements.js.map +1 -0
  468. package/docs/content/locales/ar-SA/skills-guide.mdx +5 -0
  469. package/docs/content/locales/ar-SA/template-design.mdx +55 -1
  470. package/docs/content/locales/de-DE/skills-guide.mdx +5 -0
  471. package/docs/content/locales/de-DE/template-design.mdx +66 -1
  472. package/docs/content/locales/es-ES/skills-guide.mdx +5 -0
  473. package/docs/content/locales/es-ES/template-design.mdx +65 -1
  474. package/docs/content/locales/fr-FR/skills-guide.mdx +5 -0
  475. package/docs/content/locales/fr-FR/template-design.mdx +64 -1
  476. package/docs/content/locales/hi-IN/skills-guide.mdx +5 -0
  477. package/docs/content/locales/hi-IN/template-design.mdx +59 -1
  478. package/docs/content/locales/ja-JP/skills-guide.mdx +5 -0
  479. package/docs/content/locales/ja-JP/template-design.mdx +62 -1
  480. package/docs/content/locales/ko-KR/skills-guide.mdx +5 -0
  481. package/docs/content/locales/ko-KR/template-design.mdx +58 -1
  482. package/docs/content/locales/pt-BR/skills-guide.mdx +5 -0
  483. package/docs/content/locales/pt-BR/template-design.mdx +62 -1
  484. package/docs/content/locales/zh-CN/skills-guide.mdx +5 -0
  485. package/docs/content/locales/zh-CN/template-design.mdx +50 -1
  486. package/docs/content/locales/zh-TW/skills-guide.mdx +5 -0
  487. package/docs/content/locales/zh-TW/template-design.mdx +52 -1
  488. package/docs/content/skills-guide.mdx +5 -0
  489. package/docs/content/template-design.mdx +59 -1
  490. package/package.json +2 -1
  491. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
  492. package/corpus/templates/design/actions/import-figma-file.ts +0 -166
  493. package/corpus/templates/design/app/components/design/DesignToolbar.tsx +0 -339
  494. package/corpus/templates/design/app/components/design/PresentMode.tsx +0 -68
  495. package/corpus/templates/design/app/components/design/ViewportTabs.tsx +0 -149
  496. package/corpus/templates/design/app/components/design/ZoomControls.tsx +0 -157
  497. package/corpus/templates/slides/server/lib/fig-design-system.ts +0 -110
@@ -0,0 +1,277 @@
1
+ import { defineAction } from "@agent-native/core";
2
+ import { z } from "zod";
3
+
4
+ import {
5
+ SHADER_PRESET_MAP,
6
+ type ShaderDescriptor,
7
+ type ShaderPresetName,
8
+ validateDescriptor,
9
+ } from "../shared/shader-presets.js";
10
+
11
+ // Zod v4 enum values must be an array
12
+ const PRESET_NAMES = Object.keys(SHADER_PRESET_MAP) as [
13
+ ShaderPresetName,
14
+ ...ShaderPresetName[],
15
+ ];
16
+
17
+ const sourceSchema = z.object({
18
+ kind: z.enum(["design-file", "inline-html"]).default("design-file"),
19
+ designId: z.string().optional(),
20
+ fileId: z.string().optional(),
21
+ html: z.string().optional(),
22
+ });
23
+
24
+ const targetSchema = z.object({
25
+ nodeId: z.string().optional(),
26
+ selector: z.string().optional(),
27
+ });
28
+
29
+ const descriptorSchema = z.object({
30
+ preset: z
31
+ .enum(PRESET_NAMES)
32
+ .describe(
33
+ "One of the 8 shader presets: MeshGradient, GrainGradient, Voronoi, Metaballs, Warp, GodRays, Dithering, PaperTexture.",
34
+ ),
35
+ params: z
36
+ .record(z.string(), z.union([z.number(), z.boolean(), z.string()]))
37
+ .optional()
38
+ .default({}),
39
+ colors: z.array(z.string()).optional(),
40
+ speed: z.number().optional(),
41
+ frame: z.number().optional(),
42
+ fit: z.enum(["none", "contain", "cover"]).optional(),
43
+ scale: z.number().optional(),
44
+ rotation: z.number().optional(),
45
+ offsetX: z.number().optional(),
46
+ offsetY: z.number().optional(),
47
+ });
48
+
49
+ /**
50
+ * Serialize a JSX prop value to a JSX-safe string.
51
+ * Strings become `"value"`, numbers and booleans become `{value}`.
52
+ */
53
+ function serializePropValue(val: number | boolean | string): string {
54
+ if (typeof val === "string") return `"${val}"`;
55
+ return `{${val}}`;
56
+ }
57
+
58
+ /**
59
+ * Build the JSX snippet + import line for a descriptor.
60
+ * The result is copy-pasteable into a React/JSX source file.
61
+ */
62
+ function buildJsxSnippet(
63
+ descriptor: ShaderDescriptor,
64
+ surface: "fill" | "effect",
65
+ ): { importLine: string; jsxSnippet: string } {
66
+ const presetDef = SHADER_PRESET_MAP[descriptor.preset];
67
+ const componentName = descriptor.preset;
68
+
69
+ const zIndex = surface === "fill" ? 0 : 2;
70
+ const pointerEvents = surface === "effect" ? "none" : undefined;
71
+
72
+ const styleEntries: string[] = [
73
+ `position: "absolute"`,
74
+ `inset: 0`,
75
+ `zIndex: ${zIndex}`,
76
+ `width: "100%"`,
77
+ `height: "100%"`,
78
+ ];
79
+ if (pointerEvents) {
80
+ styleEntries.push(`pointerEvents: "${pointerEvents}"`);
81
+ }
82
+ const styleStr = styleEntries.join(", ");
83
+
84
+ const propLines: string[] = [];
85
+
86
+ // Colors — use provided colors or fall back to preset defaults
87
+ if (descriptor.colors && descriptor.colors.length > 0) {
88
+ propLines.push(` colors={${JSON.stringify(descriptor.colors)}}`);
89
+ } else if (presetDef.defaultColors && presetDef.defaultColors.length > 0) {
90
+ propLines.push(` colors={${JSON.stringify(presetDef.defaultColors)}}`);
91
+ }
92
+
93
+ // Single-color params from preset defaults when not in colors array
94
+ if (presetDef.defaultColorBack && !presetDef.defaultColors) {
95
+ propLines.push(` colorBack="${presetDef.defaultColorBack}"`);
96
+ }
97
+ if (presetDef.defaultColorFront && !presetDef.defaultColors) {
98
+ propLines.push(` colorFront="${presetDef.defaultColorFront}"`);
99
+ }
100
+
101
+ // Shader-specific params — merge preset defaults with descriptor overrides.
102
+ // ParamDef.default can be string[] for "colors" kind params; skip those here.
103
+ const defaultParamValues = Object.fromEntries(
104
+ presetDef.params
105
+ .filter((p) => !Array.isArray(p.default))
106
+ .map((p) => [p.key, p.default as number | boolean | string]),
107
+ );
108
+ const mergedParams: Record<string, number | boolean | string> = {
109
+ ...defaultParamValues,
110
+ ...(descriptor.params ?? {}),
111
+ };
112
+
113
+ for (const [key, val] of Object.entries(mergedParams)) {
114
+ propLines.push(` ${key}=${serializePropValue(val)}`);
115
+ }
116
+
117
+ // Universal sizing/animation params from top-level descriptor fields
118
+ if (descriptor.speed !== undefined)
119
+ propLines.push(` speed={${descriptor.speed}}`);
120
+ if (descriptor.frame !== undefined)
121
+ propLines.push(` frame={${descriptor.frame}}`);
122
+ if (descriptor.fit !== undefined) propLines.push(` fit="${descriptor.fit}"`);
123
+ if (descriptor.scale !== undefined)
124
+ propLines.push(` scale={${descriptor.scale}}`);
125
+ if (descriptor.rotation !== undefined)
126
+ propLines.push(` rotation={${descriptor.rotation}}`);
127
+ if (descriptor.offsetX !== undefined)
128
+ propLines.push(` offsetX={${descriptor.offsetX}}`);
129
+ if (descriptor.offsetY !== undefined)
130
+ propLines.push(` offsetY={${descriptor.offsetY}}`);
131
+
132
+ propLines.push(` style={{ ${styleStr} }}`);
133
+
134
+ const jsxSnippet = `<${componentName}\n${propLines.join("\n")}\n/>`;
135
+ const importLine = `import { ${componentName} } from "@paper-design/shaders-react";`;
136
+
137
+ return { importLine, jsxSnippet };
138
+ }
139
+
140
+ /**
141
+ * Build the vanilla <canvas> data-shader element for inline HTML artboards.
142
+ * The design runtime reads `data-shader` and mounts the WebGL shader into the canvas.
143
+ */
144
+ function buildBridgeMount(
145
+ descriptor: ShaderDescriptor,
146
+ surface: "fill" | "effect",
147
+ ): string {
148
+ const zIndex = surface === "fill" ? 0 : 2;
149
+ const pointerEvents = surface === "effect" ? "none" : "auto";
150
+ // Escape single quotes in the JSON so the attribute is safe in single-quoted HTML
151
+ const dataShader = JSON.stringify(descriptor).replace(/'/g, "&#39;");
152
+
153
+ return (
154
+ `<canvas\n` +
155
+ ` data-shader='${dataShader}'\n` +
156
+ ` style="position:absolute;inset:0;width:100%;height:100%;` +
157
+ `z-index:${zIndex};pointer-events:${pointerEvents};"\n` +
158
+ `></canvas>`
159
+ );
160
+ }
161
+
162
+ export default defineAction({
163
+ description: `
164
+ Apply a GPU shader effect to a design element by validating params and returning the exact code
165
+ to insert. This is a planning/validation action — it does not write files itself; the agent
166
+ uses the returned snippets to make the actual edit via edit-design or apply-visual-edit.
167
+
168
+ Available presets (8 total):
169
+ - MeshGradient: Smooth flowing color spots with distortion + swirl. Best for hero/card fills. Accepts up to 10 colors.
170
+ - GrainGradient: Noisy gradient in 7 shape modes (wave, dots, truchet, corners, ripple, blob, sphere). Up to 7 colors + colorBack.
171
+ - Voronoi: Animated Voronoi cells with glow and gap colors. Good for geometric/abstract backgrounds.
172
+ - Metaballs: Organic blobs that merge and split. Playful, great for marketing backgrounds.
173
+ - Warp: Domain-warped distortion in several shape patterns (checks, cross, circle, star, waves, spiral). Abstract / high-energy.
174
+ - GodRays: Volumetric light rays from a configurable source. Dramatic lighting effects.
175
+ - Dithering: Ordered dithering overlay (composites over the layer beneath). Use surface="effect".
176
+ - PaperTexture: Procedural paper with grain, fiber, crumples, and folds. Static by default (no animation).
177
+
178
+ surface="fill" places the shader behind content (z-index 0, pointer-events auto).
179
+ surface="effect" places it in front (z-index 2, pointer-events none) — use for overlays like Dithering.
180
+
181
+ Framework artboards (React/JSX files): paste the returned importLine at the top and jsxSnippet
182
+ inside the container element. The agent should call edit-design with the exact text.
183
+
184
+ Inline/Alpine artboards (HTML files): inject the returned bridgeMount <canvas> element at the
185
+ top of the container. The design runtime automatically mounts the shader.
186
+ `.trim(),
187
+ schema: z.object({
188
+ source: sourceSchema
189
+ .optional()
190
+ .describe(
191
+ "Design source for context. kind=design-file uses the SQL-backed file; kind=inline-html operates on inline HTML.",
192
+ ),
193
+ target: targetSchema
194
+ .optional()
195
+ .describe(
196
+ "Target element by nodeId or CSS selector. When omitted, the shader targets the root artboard container.",
197
+ ),
198
+ surface: z
199
+ .enum(["fill", "effect"])
200
+ .default("fill")
201
+ .describe(
202
+ 'fill: shader sits behind content (z-index 0). effect: shader composites over content (z-index 2, pointer-events none). Use "effect" for Dithering.',
203
+ ),
204
+ descriptor: descriptorSchema.describe(
205
+ "Shader preset + params to apply. Use get-shader first to see available presets and current state.",
206
+ ),
207
+ }),
208
+ readOnly: true,
209
+ run: async ({ descriptor, surface, target }) => {
210
+ // Cast to ShaderDescriptor for the shared helpers
211
+ const desc: ShaderDescriptor = {
212
+ preset: descriptor.preset as ShaderPresetName,
213
+ params: descriptor.params ?? {},
214
+ colors: descriptor.colors,
215
+ speed: descriptor.speed,
216
+ frame: descriptor.frame,
217
+ fit: descriptor.fit,
218
+ scale: descriptor.scale,
219
+ rotation: descriptor.rotation,
220
+ offsetX: descriptor.offsetX,
221
+ offsetY: descriptor.offsetY,
222
+ };
223
+
224
+ const validation = validateDescriptor(desc);
225
+ if (!validation.valid) {
226
+ return {
227
+ ok: false,
228
+ errors: validation.errors,
229
+ descriptor: desc,
230
+ availablePresets: Object.keys(SHADER_PRESET_MAP),
231
+ };
232
+ }
233
+
234
+ const { importLine, jsxSnippet } = buildJsxSnippet(desc, surface);
235
+ const bridgeMount = buildBridgeMount(desc, surface);
236
+
237
+ const targetDescription = target?.nodeId
238
+ ? `node with id="${target.nodeId}"`
239
+ : target?.selector
240
+ ? `element matching selector "${target.selector}"`
241
+ : "the root artboard container element";
242
+
243
+ const instructions = [
244
+ `To apply the "${desc.preset}" shader as a ${surface} to ${targetDescription}:`,
245
+ "",
246
+ "== For React/JSX (framework artboard) ==",
247
+ `1. Add this import near the top of the component file (if not already present):`,
248
+ ` ${importLine}`,
249
+ `2. Inside ${targetDescription}, insert as the ${surface === "fill" ? "first" : "last"} child:`,
250
+ jsxSnippet
251
+ .split("\n")
252
+ .map((l) => ` ${l}`)
253
+ .join("\n"),
254
+ ` The parent element must have position:relative (or position:absolute/fixed) for the absolute positioning to work.`,
255
+ "",
256
+ "== For inline HTML artboard ==",
257
+ `1. Inside ${targetDescription}, insert as the ${surface === "fill" ? "first" : "last"} child:`,
258
+ bridgeMount
259
+ .split("\n")
260
+ .map((l) => ` ${l}`)
261
+ .join("\n"),
262
+ ` The parent element must have position:relative for the absolute positioning to work.`,
263
+ "",
264
+ "Use edit-design for JSX files (structural insert) or apply-visual-edit for inline HTML.",
265
+ ].join("\n");
266
+
267
+ return {
268
+ ok: true,
269
+ descriptor: desc,
270
+ surface,
271
+ importLine,
272
+ jsxSnippet,
273
+ bridgeMount,
274
+ instructions,
275
+ };
276
+ },
277
+ });
@@ -0,0 +1,303 @@
1
+ import { defineAction } from "@agent-native/core";
2
+ import {
3
+ agentEnterDocument,
4
+ agentLeaveDocument,
5
+ agentUpdateSelection,
6
+ applyText,
7
+ getText,
8
+ hasCollabState,
9
+ seedFromText,
10
+ } from "@agent-native/core/collab";
11
+ import { accessFilter, assertAccess } from "@agent-native/core/sharing";
12
+ import { and, eq } from "drizzle-orm";
13
+ import { z } from "zod";
14
+
15
+ import { getDb, schema } from "../server/db/index.js";
16
+ import {
17
+ applyVisualEdit,
18
+ type CodeLayerSource,
19
+ type EditIntent,
20
+ } from "../shared/code-layer.js";
21
+
22
+ type VisualEditActionSource = CodeLayerSource & { html?: string };
23
+
24
+ function parseJsonString(value: unknown): unknown {
25
+ if (typeof value !== "string") return value;
26
+ try {
27
+ return JSON.parse(value);
28
+ } catch {
29
+ return value;
30
+ }
31
+ }
32
+
33
+ const sourceSchema = z.preprocess(
34
+ parseJsonString,
35
+ z.object({
36
+ kind: z
37
+ .enum(["design-file", "inline-html", "local-file", "remote-url"])
38
+ .default("design-file"),
39
+ designId: z.string().optional(),
40
+ fileId: z.string().optional(),
41
+ filename: z.string().optional().default("index.html"),
42
+ path: z.string().optional(),
43
+ url: z.string().optional(),
44
+ revision: z.string().optional(),
45
+ html: z.string().optional(),
46
+ }),
47
+ );
48
+
49
+ const targetSchema = z.object({
50
+ nodeId: z.string().optional(),
51
+ selector: z.string().optional(),
52
+ });
53
+
54
+ const intentSchema = z.preprocess(
55
+ parseJsonString,
56
+ z.discriminatedUnion("kind", [
57
+ z.object({
58
+ kind: z.literal("style"),
59
+ target: targetSchema,
60
+ property: z
61
+ .string()
62
+ .describe(
63
+ "CSS property to set. Deterministic edits cover the visual editor's common layout, typography, fill, stroke, effect, transform, and spacing properties.",
64
+ ),
65
+ value: z.string().describe("CSS value to write into the inline style."),
66
+ }),
67
+ z.object({
68
+ kind: z.literal("class"),
69
+ target: targetSchema,
70
+ operation: z.enum(["add", "remove", "replace", "set"]),
71
+ className: z.string().optional(),
72
+ classNames: z.array(z.string()).optional(),
73
+ from: z.string().optional(),
74
+ to: z.string().optional(),
75
+ }),
76
+ z.object({
77
+ kind: z.literal("textContent"),
78
+ target: targetSchema,
79
+ value: z.string().describe("Text content for a leaf HTML element."),
80
+ html: z
81
+ .string()
82
+ .optional()
83
+ .describe(
84
+ "Optional sanitized inner HTML for preserving styled inline text runs.",
85
+ ),
86
+ }),
87
+ z.object({
88
+ kind: z.literal("moveNode"),
89
+ target: targetSchema,
90
+ anchor: targetSchema,
91
+ placement: z.enum(["before", "after", "inside"]),
92
+ }),
93
+ ]),
94
+ );
95
+
96
+ async function liveContent(
97
+ fileId: string,
98
+ storedContent: string,
99
+ ): Promise<string> {
100
+ try {
101
+ if (await hasCollabState(fileId)) {
102
+ const live = await getText(fileId, "content");
103
+ if (typeof live === "string") return live;
104
+ }
105
+ } catch {
106
+ // Collab reads are best-effort; SQL content remains the fallback.
107
+ }
108
+ return storedContent;
109
+ }
110
+
111
+ async function resolveEditableDesignFile(
112
+ source: VisualEditActionSource,
113
+ ): Promise<{
114
+ id: string;
115
+ designId: string;
116
+ filename: string;
117
+ content: string;
118
+ codeLayerSource: CodeLayerSource;
119
+ }> {
120
+ if (!source.fileId && !source.designId) {
121
+ throw new Error(
122
+ "source.designId or source.fileId is required for design-file.",
123
+ );
124
+ }
125
+
126
+ const db = getDb();
127
+ const conditions = [
128
+ accessFilter(schema.designs, schema.designShares),
129
+ source.fileId
130
+ ? eq(schema.designFiles.id, source.fileId)
131
+ : eq(schema.designFiles.designId, source.designId ?? ""),
132
+ ];
133
+ if (!source.fileId) {
134
+ conditions.push(
135
+ eq(schema.designFiles.filename, source.filename ?? "index.html"),
136
+ );
137
+ }
138
+
139
+ const [file] = await db
140
+ .select({
141
+ id: schema.designFiles.id,
142
+ designId: schema.designFiles.designId,
143
+ filename: schema.designFiles.filename,
144
+ fileType: schema.designFiles.fileType,
145
+ content: schema.designFiles.content,
146
+ })
147
+ .from(schema.designFiles)
148
+ .innerJoin(
149
+ schema.designs,
150
+ eq(schema.designFiles.designId, schema.designs.id),
151
+ )
152
+ .where(and(...conditions))
153
+ .limit(1);
154
+
155
+ if (!file) {
156
+ throw new Error("Design HTML file not found.");
157
+ }
158
+ if (file.fileType !== "html") {
159
+ throw new Error("Visual code-layer edits only support HTML files for now.");
160
+ }
161
+
162
+ await assertAccess("design", file.designId, "editor");
163
+
164
+ return {
165
+ id: file.id,
166
+ designId: file.designId,
167
+ filename: file.filename,
168
+ content: await liveContent(file.id, file.content ?? ""),
169
+ codeLayerSource: {
170
+ kind: "design-file",
171
+ designId: file.designId,
172
+ fileId: file.id,
173
+ filename: file.filename,
174
+ revision: source.revision,
175
+ },
176
+ };
177
+ }
178
+
179
+ async function persistDesignFileEdit(file: {
180
+ id: string;
181
+ designId: string;
182
+ content: string;
183
+ }): Promise<void> {
184
+ await assertAccess("design", file.designId, "editor");
185
+
186
+ const db = getDb();
187
+ const now = new Date().toISOString();
188
+
189
+ agentEnterDocument(file.id);
190
+ try {
191
+ await db
192
+ .update(schema.designFiles)
193
+ .set({ content: file.content, updatedAt: now })
194
+ .where(eq(schema.designFiles.id, file.id));
195
+
196
+ if (await hasCollabState(file.id)) {
197
+ await applyText(file.id, file.content, "content", "agent");
198
+ } else {
199
+ await seedFromText(file.id, file.content);
200
+ }
201
+
202
+ await db
203
+ .update(schema.designs)
204
+ .set({ updatedAt: now })
205
+ .where(eq(schema.designs.id, file.designId));
206
+ } finally {
207
+ agentLeaveDocument(file.id);
208
+ }
209
+ }
210
+
211
+ export default defineAction({
212
+ description:
213
+ "Apply one deterministic visual edit to a code-backed HTML design layer. " +
214
+ "Supports safe inline style, class, and leaf textContent edits on inline/SQL HTML files; escalates ambiguous or structural edits with PatchResult statuses.",
215
+ schema: z.object({
216
+ source: sourceSchema.describe(
217
+ "Edit source. Use kind=design-file with designId/filename or fileId to persist into SQL; kind=inline-html with html for a preview-only patch.",
218
+ ),
219
+ intent: intentSchema.describe(
220
+ "Visual edit intent targeting a CodeLayerProjection nodeId or selector.",
221
+ ),
222
+ includeContent: z
223
+ .boolean()
224
+ .optional()
225
+ .default(false)
226
+ .describe("Include patched HTML content in the response."),
227
+ }),
228
+ run: async ({ source, intent, includeContent }) => {
229
+ const actionSource = source as VisualEditActionSource;
230
+ const editIntent = intent as EditIntent;
231
+
232
+ if (actionSource.kind === "inline-html") {
233
+ const codeLayerSource: CodeLayerSource = {
234
+ kind: "inline-html",
235
+ filename: actionSource.filename,
236
+ revision: actionSource.revision,
237
+ };
238
+ const patch = applyVisualEdit(actionSource.html ?? "", editIntent, {
239
+ source: codeLayerSource,
240
+ });
241
+ return {
242
+ result: patch.result,
243
+ projection: patch.projection,
244
+ patchedContent: includeContent ? patch.content : undefined,
245
+ bytesBefore: (actionSource.html ?? "").length,
246
+ bytesAfter: patch.content.length,
247
+ };
248
+ }
249
+
250
+ if (actionSource.kind !== "design-file") {
251
+ const codeLayerSource: CodeLayerSource = {
252
+ kind: actionSource.kind,
253
+ path: actionSource.path,
254
+ url: actionSource.url,
255
+ filename: actionSource.filename,
256
+ revision: actionSource.revision,
257
+ };
258
+ const patch = applyVisualEdit("", editIntent, {
259
+ source: codeLayerSource,
260
+ });
261
+ return {
262
+ result: patch.result,
263
+ projection: patch.projection,
264
+ bytesBefore: 0,
265
+ bytesAfter: 0,
266
+ };
267
+ }
268
+
269
+ const file = await resolveEditableDesignFile(actionSource);
270
+ const patch = applyVisualEdit(file.content, editIntent, {
271
+ source: file.codeLayerSource,
272
+ });
273
+
274
+ if (patch.result.target) {
275
+ agentUpdateSelection(file.id, {
276
+ selection: patch.result.target.selector,
277
+ nodeId: patch.result.target.nodeId,
278
+ editingFile: file.filename,
279
+ designId: file.designId,
280
+ });
281
+ }
282
+
283
+ if (patch.result.status === "applied" && patch.result.changed) {
284
+ await persistDesignFileEdit({
285
+ id: file.id,
286
+ designId: file.designId,
287
+ content: patch.content,
288
+ });
289
+ }
290
+
291
+ return {
292
+ result: patch.result,
293
+ projection: patch.projection,
294
+ designId: file.designId,
295
+ fileId: file.id,
296
+ filename: file.filename,
297
+ persisted: patch.result.status === "applied" && patch.result.changed,
298
+ patchedContent: includeContent ? patch.content : undefined,
299
+ bytesBefore: file.content.length,
300
+ bytesAfter: patch.content.length,
301
+ };
302
+ },
303
+ });