@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
@@ -1,9 +1,8 @@
1
1
  import { Skeleton } from "@/components/ui/skeleton";
2
- import { cn } from "@/lib/utils";
3
2
 
4
3
  /**
5
4
  * Loading placeholder for the design editor. Mirrors the real editor chrome
6
- * (toolbar + dot-grid canvas with a faux design frame) so the load reads as
5
+ * (side rails + canvas with a faux design frame) so the load reads as
7
6
  * "a design is coming" instead of a bare spinner on a black void.
8
7
  */
9
8
  export function DesignEditorSkeleton({
@@ -12,43 +11,37 @@ export function DesignEditorSkeleton({
12
11
  embedded?: boolean;
13
12
  }) {
14
13
  return (
15
- <div className="h-full flex flex-col overflow-hidden bg-background">
16
- {/* Toolbar */}
17
- <header
18
- className={cn(
19
- "shrink-0 border-b border-border",
20
- embedded ? "h-10" : "h-12",
21
- )}
22
- >
23
- <div className="flex h-full items-center gap-2 px-3">
24
- <Skeleton className="h-5 w-5 rounded" />
25
- <Skeleton className="h-5 w-40 rounded" />
26
- <Skeleton className="h-4 w-16 rounded-full" />
27
- <div className="ml-auto flex items-center gap-1.5">
28
- {!embedded && <Skeleton className="h-7 w-44 rounded-md" />}
29
- <Skeleton className="h-7 w-7 rounded-md" />
30
- {!embedded && (
31
- <>
32
- <Skeleton className="h-7 w-16 rounded-md" />
33
- <Skeleton className="h-7 w-14 rounded-md" />
34
- <Skeleton className="h-7 w-16 rounded-md" />
35
- </>
36
- )}
14
+ <div className="flex h-full overflow-hidden bg-background">
15
+ {!embedded && (
16
+ <aside className="hidden w-64 shrink-0 flex-col border-r border-border bg-[var(--design-editor-panel-bg)] lg:flex">
17
+ <div className="flex h-11 shrink-0 items-center gap-2 border-b border-border px-2">
18
+ <Skeleton className="size-8 rounded-md" />
19
+ <Skeleton className="h-5 min-w-0 flex-1 rounded" />
37
20
  </div>
38
- </div>
39
- </header>
21
+ <div className="shrink-0 border-b border-border p-2">
22
+ <div className="mb-2 flex items-center justify-between">
23
+ <Skeleton className="h-3 w-16 rounded" />
24
+ <div className="flex gap-1">
25
+ <Skeleton className="size-6 rounded-sm" />
26
+ <Skeleton className="size-6 rounded-sm" />
27
+ </div>
28
+ </div>
29
+ <Skeleton className="h-7 w-full rounded-sm" />
30
+ </div>
31
+ <div className="shrink-0 border-b border-border p-2">
32
+ <Skeleton className="h-7 w-full rounded-sm" />
33
+ </div>
34
+ <div className="flex-1 space-y-1 p-2">
35
+ <Skeleton className="h-6 w-full rounded-sm" />
36
+ <Skeleton className="h-6 w-11/12 rounded-sm" />
37
+ <Skeleton className="h-6 w-4/5 rounded-sm" />
38
+ <Skeleton className="h-6 w-2/3 rounded-sm" />
39
+ </div>
40
+ </aside>
41
+ )}
40
42
 
41
- {/* Canvas */}
42
- <div className="relative flex-1 overflow-hidden">
43
- <div
44
- className="absolute inset-0"
45
- style={{
46
- backgroundImage:
47
- "radial-gradient(circle, hsl(var(--border)) 1px, transparent 1px)",
48
- backgroundSize: "24px 24px",
49
- }}
50
- />
51
- <div className="relative flex h-full items-center justify-center p-8">
43
+ <main className="relative min-w-0 flex-1 overflow-hidden bg-[var(--design-editor-canvas-bg)]">
44
+ <div className="flex h-full items-center justify-center p-8">
52
45
  <div className="w-full max-w-4xl overflow-hidden rounded-xl border border-border bg-card shadow-2xl">
53
46
  {/* Faux browser bar */}
54
47
  <div className="flex items-center gap-2 border-b border-border px-4 py-3">
@@ -72,7 +65,50 @@ export function DesignEditorSkeleton({
72
65
  </div>
73
66
  </div>
74
67
  </div>
75
- </div>
68
+
69
+ {!embedded && (
70
+ <div className="absolute bottom-4 left-1/2 z-[70] flex -translate-x-1/2 items-center gap-2 rounded-2xl border border-white/10 bg-[#2c2c2c]/95 p-2 shadow-[0_22px_55px_-24px_rgba(0,0,0,0.9)]">
71
+ <div className="flex gap-1">
72
+ {Array.from({ length: 6 }).map((_, index) => (
73
+ <Skeleton key={index} className="h-11 w-16 rounded-md" />
74
+ ))}
75
+ </div>
76
+ <Skeleton className="h-12 w-px rounded-none bg-white/15" />
77
+ <div className="flex gap-1 rounded-lg bg-white/10 p-1">
78
+ {Array.from({ length: 4 }).map((_, index) => (
79
+ <Skeleton key={index} className="size-10 rounded-md" />
80
+ ))}
81
+ </div>
82
+ </div>
83
+ )}
84
+ </main>
85
+
86
+ {!embedded && (
87
+ <aside className="hidden w-64 shrink-0 flex-col border-l border-border bg-[var(--design-editor-panel-bg)] lg:flex">
88
+ <div className="shrink-0 border-b border-border p-2">
89
+ <div className="flex flex-wrap justify-end gap-1">
90
+ <Skeleton className="h-7 w-12 rounded-md" />
91
+ <Skeleton className="h-7 w-14 rounded-md" />
92
+ <Skeleton className="h-7 w-16 rounded-md" />
93
+ <Skeleton className="size-7 rounded-md" />
94
+ </div>
95
+ </div>
96
+ <div className="flex h-11 shrink-0 items-center justify-between border-b border-border px-3">
97
+ <div className="flex gap-1">
98
+ <Skeleton className="h-7 w-16 rounded-md" />
99
+ <Skeleton className="h-7 w-16 rounded-md" />
100
+ </div>
101
+ <Skeleton className="h-7 w-12 rounded-md" />
102
+ </div>
103
+ <div className="space-y-3 p-3">
104
+ <Skeleton className="h-4 w-24 rounded" />
105
+ <Skeleton className="h-7 w-full rounded-md" />
106
+ <Skeleton className="h-7 w-full rounded-md" />
107
+ <Skeleton className="h-4 w-20 rounded" />
108
+ <Skeleton className="h-24 w-full rounded-md" />
109
+ </div>
110
+ </aside>
111
+ )}
76
112
  </div>
77
113
  );
78
114
  }
@@ -0,0 +1,401 @@
1
+ import {
2
+ PromptComposer,
3
+ agentNativePath,
4
+ sendToAgentChat,
5
+ useChangeVersions,
6
+ useT,
7
+ type PromptComposerProps,
8
+ type PromptComposerSubmitOptions,
9
+ } from "@agent-native/core/client";
10
+ import { EmbeddedExtension } from "@agent-native/core/client/extensions";
11
+ import {
12
+ IconExternalLink,
13
+ IconPlus,
14
+ IconPuzzle,
15
+ IconSparkles,
16
+ } from "@tabler/icons-react";
17
+ import { useQuery, useQueryClient } from "@tanstack/react-query";
18
+ import { useMemo, useState } from "react";
19
+
20
+ import { Button } from "@/components/ui/button";
21
+ import {
22
+ Popover,
23
+ PopoverContent,
24
+ PopoverTrigger,
25
+ } from "@/components/ui/popover";
26
+ import { Skeleton } from "@/components/ui/skeleton";
27
+ import {
28
+ Tooltip,
29
+ TooltipContent,
30
+ TooltipTrigger,
31
+ } from "@/components/ui/tooltip";
32
+ import { cn } from "@/lib/utils";
33
+
34
+ import type { ElementInfo } from "./types";
35
+
36
+ export const DESIGN_EDITOR_EXTENSION_SLOT_ID = "design.editor.inspector";
37
+
38
+ interface SlotInstall {
39
+ installId: string;
40
+ extensionId: string;
41
+ name: string;
42
+ description: string;
43
+ icon: string | null;
44
+ updatedAt: string;
45
+ position: number;
46
+ config: string | null;
47
+ }
48
+
49
+ interface AvailableExtension {
50
+ extensionId: string;
51
+ name: string;
52
+ description: string;
53
+ icon: string | null;
54
+ config: string | null;
55
+ }
56
+
57
+ export interface DesignExtensionSlotContext extends Record<string, unknown> {
58
+ designId: string;
59
+ designTitle: string | null;
60
+ activeFileId: string | null;
61
+ activeFilename: string | null;
62
+ viewMode: "single" | "overview";
63
+ zoom: number;
64
+ screens: Array<{
65
+ id: string;
66
+ filename: string;
67
+ fileType?: string | null;
68
+ }>;
69
+ selectedScreenIds: string[];
70
+ selectedElement: ElementInfo | null;
71
+ mode: string;
72
+ activeTool: string;
73
+ tweakValues: Record<string, string | number | boolean>;
74
+ }
75
+
76
+ interface DesignExtensionsPanelProps {
77
+ context: DesignExtensionSlotContext;
78
+ className?: string;
79
+ }
80
+
81
+ type PromptComposerSubmitHandler = PromptComposerProps["onSubmit"];
82
+
83
+ function buildExtensionCreateContext(
84
+ prompt: string,
85
+ context: DesignExtensionSlotContext,
86
+ ): string {
87
+ const selectedElement = context.selectedElement
88
+ ? JSON.stringify(context.selectedElement, null, 2)
89
+ : "No element is currently selected.";
90
+ return [
91
+ `The user is in the Design editor Extensions inspector for design id "${context.designId}"${context.designTitle ? ` (title: "${context.designTitle}")` : ""}.`,
92
+ context.activeFileId
93
+ ? `Active screen: "${context.activeFilename ?? context.activeFileId}" (file id: "${context.activeFileId}").`
94
+ : "There is no active screen yet.",
95
+ `Create a persisted extension for the Design editor inspector slot "${DESIGN_EDITOR_EXTENSION_SLOT_ID}".`,
96
+ `User request: "${prompt}"`,
97
+ "",
98
+ "After create-extension succeeds, call add-extension-slot-target with this slot id, then install-extension with this slot id so the extension appears in the editor panel immediately.",
99
+ 'If create-extension opens the standalone extension editor, call navigate with view "editor", the current design id, and inspectorTab "extensions" after install so the user returns to this inline panel.',
100
+ "",
101
+ "The extension will receive window.slotContext and onSlotContext updates with the current design selection:",
102
+ JSON.stringify(
103
+ {
104
+ designId: context.designId,
105
+ designTitle: context.designTitle,
106
+ activeFileId: context.activeFileId,
107
+ activeFilename: context.activeFilename,
108
+ viewMode: context.viewMode,
109
+ zoom: context.zoom,
110
+ screens: context.screens,
111
+ selectedScreenIds: context.selectedScreenIds,
112
+ mode: context.mode,
113
+ activeTool: context.activeTool,
114
+ tweakValues: context.tweakValues,
115
+ },
116
+ null,
117
+ 2,
118
+ ),
119
+ "",
120
+ "Current selected element:",
121
+ selectedElement,
122
+ "",
123
+ "Design extension behavior guidelines:",
124
+ "- Use appAction() for reads and deterministic app actions when appropriate.",
125
+ "- Use agentNative.chat.send(message, { context }) for AI-driven style, copy, layout, or artboard changes.",
126
+ "- When sending a prompt to the agent, include designId, activeFileId or activeFilename, selectedElement.selector, selectedElement.sourceId, and the requested change.",
127
+ "- Tell the agent to call view-screen first, then prefer apply-visual-edit for selected element style/class/text/move changes.",
128
+ "- Use update-design or generate-design with canvasFrames for overview artboard placement changes.",
129
+ "- Keep the extension compact enough for a right-side inspector panel and use semantic Tailwind colors.",
130
+ ].join("\n");
131
+ }
132
+
133
+ function useSlotInstalls(slotId: string) {
134
+ const versions = useChangeVersions(["action"]);
135
+ return useQuery<SlotInstall[]>({
136
+ queryKey: ["design-editor-extension-slot", slotId, versions],
137
+ queryFn: async () => {
138
+ const res = await fetch(
139
+ agentNativePath(
140
+ `/_agent-native/slots/${encodeURIComponent(slotId)}/installs`,
141
+ ),
142
+ );
143
+ if (!res.ok) return [];
144
+ return res.json();
145
+ },
146
+ placeholderData: (prev) => prev,
147
+ });
148
+ }
149
+
150
+ function useAvailableExtensions(slotId: string) {
151
+ const versions = useChangeVersions(["action"]);
152
+ return useQuery<AvailableExtension[]>({
153
+ queryKey: ["design-editor-extension-slot-available", slotId, versions],
154
+ queryFn: async () => {
155
+ const res = await fetch(
156
+ agentNativePath(
157
+ `/_agent-native/slots/${encodeURIComponent(slotId)}/available`,
158
+ ),
159
+ );
160
+ if (!res.ok) return [];
161
+ return res.json();
162
+ },
163
+ placeholderData: (prev) => prev,
164
+ });
165
+ }
166
+
167
+ export function DesignExtensionsPanel({
168
+ context,
169
+ className,
170
+ }: DesignExtensionsPanelProps) {
171
+ const t = useT();
172
+ const queryClient = useQueryClient();
173
+ const [createOpen, setCreateOpen] = useState(false);
174
+ const [installingId, setInstallingId] = useState<string | null>(null);
175
+ const slotId = DESIGN_EDITOR_EXTENSION_SLOT_ID;
176
+ const { data: installs = [], isLoading } = useSlotInstalls(slotId);
177
+ const { data: available = [] } = useAvailableExtensions(slotId);
178
+ const installedIds = useMemo(
179
+ () => new Set(installs.map((install) => install.extensionId)),
180
+ [installs],
181
+ );
182
+ const installable = available.filter(
183
+ (extension) => !installedIds.has(extension.extensionId),
184
+ );
185
+
186
+ const submitCreatePrompt: PromptComposerSubmitHandler = (
187
+ text: string,
188
+ _files,
189
+ _references,
190
+ options: PromptComposerSubmitOptions,
191
+ ) => {
192
+ const trimmed = text.trim();
193
+ if (!trimmed) return;
194
+ sendToAgentChat({
195
+ message: `Create a Design extension: ${trimmed}`,
196
+ context: buildExtensionCreateContext(trimmed, context),
197
+ submit: true,
198
+ openSidebar: true,
199
+ newTab: true,
200
+ model: options.model,
201
+ engine: options.engine,
202
+ effort: options.effort,
203
+ });
204
+ setCreateOpen(false);
205
+ };
206
+
207
+ const installExtension = async (extensionId: string) => {
208
+ setInstallingId(extensionId);
209
+ try {
210
+ await fetch(
211
+ agentNativePath(
212
+ `/_agent-native/slots/${encodeURIComponent(slotId)}/install`,
213
+ ),
214
+ {
215
+ method: "POST",
216
+ headers: { "Content-Type": "application/json" },
217
+ body: JSON.stringify({ extensionId }),
218
+ },
219
+ );
220
+ } finally {
221
+ setInstallingId(null);
222
+ queryClient.invalidateQueries({
223
+ queryKey: ["design-editor-extension-slot"],
224
+ });
225
+ queryClient.invalidateQueries({
226
+ queryKey: ["design-editor-extension-slot-available"],
227
+ });
228
+ }
229
+ };
230
+
231
+ return (
232
+ <div className={cn("flex min-h-0 flex-1 flex-col", className)}>
233
+ {/* Section header — 32 px tall, matches PanelSection / Figma inspector headers */}
234
+ <div className="flex min-h-8 shrink-0 items-center gap-1.5 border-b border-border/60 px-3">
235
+ <h3 className="min-w-0 flex-1 truncate text-xs font-semibold text-foreground">
236
+ {t("designEditor.extensions")}
237
+ </h3>
238
+ <Tooltip>
239
+ <TooltipTrigger asChild>
240
+ <a
241
+ href="https://www.agent-native.com/docs/extensions"
242
+ target="_blank"
243
+ rel="noreferrer"
244
+ className="inline-flex size-6 cursor-pointer items-center justify-center rounded text-muted-foreground transition-colors hover:bg-accent hover:text-foreground"
245
+ aria-label={t("designEditor.extensionsDocs")}
246
+ >
247
+ <IconExternalLink className="size-3.5" />
248
+ </a>
249
+ </TooltipTrigger>
250
+ <TooltipContent>{t("designEditor.extensionsDocs")}</TooltipContent>
251
+ </Tooltip>
252
+ <CreateExtensionPopover
253
+ open={createOpen}
254
+ onOpenChange={setCreateOpen}
255
+ onSubmit={submitCreatePrompt}
256
+ />
257
+ </div>
258
+
259
+ <div className="design-inspector-scroll min-h-0 flex-1 overflow-y-auto overscroll-contain px-3 pb-2 pt-1.5">
260
+ {isLoading ? (
261
+ <div className="space-y-1.5">
262
+ <Skeleton className="h-24 rounded" />
263
+ <Skeleton className="h-32 rounded" />
264
+ </div>
265
+ ) : installs.length === 0 ? (
266
+ /* Empty state — compact, matches TweaksPanel empty style */
267
+ <div className="flex flex-col items-center gap-2 py-6 text-center">
268
+ <div className="flex size-8 items-center justify-center rounded-lg bg-muted/60">
269
+ <IconPuzzle className="size-4 text-muted-foreground/70" />
270
+ </div>
271
+ <div>
272
+ <p className="text-[11px] font-medium text-foreground">
273
+ {t("designEditor.extensionsEmptyTitle")}
274
+ </p>
275
+ <p className="mt-0.5 text-[11px] leading-snug text-muted-foreground">
276
+ {t("designEditor.extensionsEmptyDescription")}
277
+ </p>
278
+ </div>
279
+ <div className="flex flex-wrap items-center justify-center gap-1.5">
280
+ <Button
281
+ type="button"
282
+ size="sm"
283
+ className="h-6 cursor-pointer px-2.5 text-[11px]"
284
+ onClick={() => setCreateOpen(true)}
285
+ >
286
+ <IconPlus className="size-3" />
287
+ {t("designEditor.addExtension")}
288
+ </Button>
289
+ <Button
290
+ asChild
291
+ type="button"
292
+ variant="outline"
293
+ size="sm"
294
+ className="h-6 cursor-pointer px-2.5 text-[11px]"
295
+ >
296
+ <a
297
+ href="https://www.agent-native.com/docs/extensions"
298
+ target="_blank"
299
+ rel="noreferrer"
300
+ >
301
+ {t("designEditor.extensionsDocs")}
302
+ </a>
303
+ </Button>
304
+ </div>
305
+ </div>
306
+ ) : (
307
+ <div className="space-y-1.5">
308
+ {installs.map((install) => (
309
+ <EmbeddedExtension
310
+ key={install.installId}
311
+ extensionId={install.extensionId}
312
+ slotId={slotId}
313
+ context={context}
314
+ initialHeight={180}
315
+ className="overflow-hidden rounded border border-border bg-background"
316
+ />
317
+ ))}
318
+ </div>
319
+ )}
320
+
321
+ {installable.length > 0 ? (
322
+ <div className="mt-3 border-t border-border/60 pt-1.5">
323
+ <p className="mb-1 text-[11px] font-medium uppercase tracking-wide text-muted-foreground">
324
+ {t("designEditor.extensionsAvailable")}
325
+ </p>
326
+ <div className="space-y-px">
327
+ {installable.map((extension) => (
328
+ <button
329
+ key={extension.extensionId}
330
+ type="button"
331
+ disabled={installingId === extension.extensionId}
332
+ onClick={() => installExtension(extension.extensionId)}
333
+ className="flex h-6 w-full cursor-pointer items-center gap-1.5 rounded px-2 text-left transition-colors hover:bg-accent active:bg-accent/80 disabled:cursor-default disabled:opacity-50"
334
+ >
335
+ <IconSparkles className="size-3 shrink-0 text-muted-foreground" />
336
+ <span className="min-w-0 flex-1 truncate text-[11px] font-medium text-foreground">
337
+ {extension.name}
338
+ </span>
339
+ {extension.description ? (
340
+ <span className="hidden truncate text-[11px] text-muted-foreground sm:block">
341
+ {extension.description}
342
+ </span>
343
+ ) : null}
344
+ <span className="shrink-0 text-[11px] text-muted-foreground">
345
+ {t("designEditor.extensionsInstall")}
346
+ </span>
347
+ </button>
348
+ ))}
349
+ </div>
350
+ </div>
351
+ ) : null}
352
+ </div>
353
+ </div>
354
+ );
355
+ }
356
+
357
+ function CreateExtensionPopover({
358
+ open,
359
+ onOpenChange,
360
+ onSubmit,
361
+ }: {
362
+ open: boolean;
363
+ onOpenChange: (open: boolean) => void;
364
+ onSubmit: PromptComposerSubmitHandler;
365
+ }) {
366
+ const t = useT();
367
+ return (
368
+ <Popover open={open} onOpenChange={onOpenChange}>
369
+ <Tooltip>
370
+ <TooltipTrigger asChild>
371
+ <PopoverTrigger asChild>
372
+ <Button
373
+ type="button"
374
+ variant="ghost"
375
+ size="icon"
376
+ className="size-6 rounded text-muted-foreground transition-colors hover:bg-accent hover:text-foreground"
377
+ aria-label={t("designEditor.addExtension")}
378
+ >
379
+ <IconPlus className="size-3.5" />
380
+ </Button>
381
+ </PopoverTrigger>
382
+ </TooltipTrigger>
383
+ <TooltipContent>{t("designEditor.addExtension")}</TooltipContent>
384
+ </Tooltip>
385
+ <PopoverContent align="end" sideOffset={6} className="w-80 p-3">
386
+ <p className="px-1 pb-2 text-sm font-semibold text-foreground">
387
+ {t("designEditor.extensionsPromptTitle")}
388
+ </p>
389
+ <PromptComposer
390
+ autoFocus
391
+ attachmentsEnabled={false}
392
+ plusMenuMode="hidden"
393
+ layoutVariant="compact"
394
+ draftScope="design:editor-extension-create"
395
+ placeholder={t("designEditor.extensionsPlaceholder")}
396
+ onSubmit={onSubmit}
397
+ />
398
+ </PopoverContent>
399
+ </Popover>
400
+ );
401
+ }