@agent-native/core 0.79.27 → 0.80.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +26 -0
  3. package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +41 -0
  4. package/corpus/core/docs/content/locales/de-DE/template-design.mdx +51 -0
  5. package/corpus/core/docs/content/locales/es-ES/template-design.mdx +50 -0
  6. package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +49 -0
  7. package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +44 -0
  8. package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +46 -0
  9. package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +44 -0
  10. package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +48 -0
  11. package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +36 -0
  12. package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +38 -0
  13. package/corpus/core/docs/content/template-design.mdx +45 -0
  14. package/corpus/core/package.json +2 -1
  15. package/corpus/core/src/agent/engine/index.ts +1 -0
  16. package/corpus/core/src/agent/engine/registry.ts +40 -0
  17. package/corpus/core/src/agent/production-agent.ts +6 -2
  18. package/corpus/core/src/cli/design-connect.ts +490 -0
  19. package/corpus/core/src/cli/index.ts +16 -0
  20. package/corpus/core/src/cli/skills.ts +126 -3
  21. package/corpus/core/src/client/AssistantChat.tsx +43 -7
  22. package/corpus/core/src/client/agent-chat.ts +27 -3
  23. package/corpus/core/src/client/blocks/library/MermaidBlock.tsx +1 -1
  24. package/corpus/core/src/client/blocks/library/diagram.tsx +2 -2
  25. package/corpus/core/src/client/blocks/library/wireframe.tsx +1 -1
  26. package/corpus/core/src/client/chat/message-components.tsx +1 -1
  27. package/corpus/core/src/client/chat-model-groups.ts +1 -2
  28. package/corpus/core/src/client/components/LiveCursorOverlay.tsx +33 -66
  29. package/corpus/core/src/client/composer/TiptapComposer.tsx +99 -24
  30. package/corpus/core/src/client/composer/useVoiceDictation.ts +429 -260
  31. package/corpus/core/src/client/frame-protocol.ts +17 -2
  32. package/corpus/core/src/client/rich-markdown-editor/RegistryBlockNode.tsx +2 -2
  33. package/corpus/core/src/client/sharing/ShareButton.tsx +20 -15
  34. package/corpus/core/src/client/use-agent-engine-configured.ts +80 -28
  35. package/corpus/core/src/server/transcribe-voice.ts +57 -22
  36. package/corpus/core/src/shared/mcp-embed-headers.ts +23 -1
  37. package/corpus/core/src/styles/agent-native.css +56 -7
  38. package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
  39. package/corpus/core/src/vite/client.ts +2 -0
  40. package/corpus/core/src/voice/index.ts +18 -0
  41. package/corpus/core/src/voice/voice-cleanup-prompt.ts +38 -0
  42. package/corpus/core/src/voice/voice-context.ts +217 -0
  43. package/corpus/core/src/voice/voice-replacements.ts +75 -0
  44. package/corpus/templates/analytics/AGENTS.md +4 -3
  45. package/corpus/templates/analytics/actions/list-session-recordings.ts +6 -1
  46. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +557 -400
  47. package/corpus/templates/analytics/app/global.css +0 -4
  48. package/corpus/templates/analytics/app/i18n/zh-TW.ts +2 -0
  49. package/corpus/templates/analytics/app/i18n-data.ts +20 -0
  50. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +33 -8
  51. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +7 -0
  52. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +7 -0
  53. package/corpus/templates/analytics/changelog/2026-06-28-ask-tab-now-matches-the-darker-app-background.md +6 -0
  54. package/corpus/templates/analytics/changelog/2026-06-28-dashboard-email-reports-now-use-cleaner-light-mode-snapshots.md +6 -0
  55. package/corpus/templates/analytics/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  56. package/corpus/templates/analytics/changelog/2026-06-28-sessions-now-show-only-signed-in-recordings-with-playable-re.md +6 -0
  57. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +3 -3
  58. package/corpus/templates/analytics/server/lib/dashboard-report.ts +29 -7
  59. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +5 -2
  60. package/corpus/templates/analytics/server/lib/session-replay.ts +24 -4
  61. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +4 -4
  62. package/corpus/templates/assets/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  63. package/corpus/templates/brain/app/components/layout/Layout.tsx +29 -2
  64. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +131 -42
  65. package/corpus/templates/brain/app/i18n/zh-TW.ts +2 -0
  66. package/corpus/templates/brain/app/i18n-data.ts +20 -0
  67. package/corpus/templates/brain/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  68. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +29 -1
  69. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +417 -299
  70. package/corpus/templates/calendar/app/i18n/zh-TW.ts +2 -0
  71. package/corpus/templates/calendar/app/i18n-data.ts +20 -0
  72. package/corpus/templates/calendar/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  73. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +6 -19
  74. package/corpus/templates/chat/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  75. package/corpus/templates/clips/AGENTS.md +4 -0
  76. package/corpus/templates/clips/actions/cleanup-transcript.ts +39 -9
  77. package/corpus/templates/clips/actions/finalize-meeting.ts +81 -12
  78. package/corpus/templates/clips/actions/lib/agents-md-context.ts +4 -1
  79. package/corpus/templates/clips/app/components/library/library-layout.tsx +3 -3
  80. package/corpus/templates/clips/app/components/meetings/share-meeting-dialog.tsx +1 -1
  81. package/corpus/templates/clips/app/components/player/share-dialog.tsx +2 -2
  82. package/corpus/templates/clips/changelog/2026-06-28-left-sidebar-footer-controls-use-less-divider-chrome.md +6 -0
  83. package/corpus/templates/clips/desktop/src/lib/personal-vocabulary.ts +13 -8
  84. package/corpus/templates/clips/desktop/src/lib/voice-dictation.ts +60 -1
  85. package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +1 -1
  86. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +1 -1
  87. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +5 -5
  88. package/corpus/templates/content/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  89. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +137 -0
  90. package/corpus/templates/design/AGENTS.md +95 -5
  91. package/corpus/templates/design/DESIGN.md +82 -0
  92. package/corpus/templates/design/DEVELOPING.md +43 -0
  93. package/corpus/templates/design/actions/add-localhost-screens.ts +426 -0
  94. package/corpus/templates/design/actions/apply-shader.ts +277 -0
  95. package/corpus/templates/design/actions/apply-visual-edit.ts +303 -0
  96. package/corpus/templates/design/actions/connect-localhost.ts +183 -0
  97. package/corpus/templates/design/actions/edit-design.ts +195 -42
  98. package/corpus/templates/design/actions/generate-design.ts +71 -1
  99. package/corpus/templates/design/actions/generate-screens.ts +193 -0
  100. package/corpus/templates/design/actions/get-code-layer-projection.ts +191 -0
  101. package/corpus/templates/design/actions/get-shader.ts +119 -0
  102. package/corpus/templates/design/actions/list-localhost-connections.ts +95 -0
  103. package/corpus/templates/design/actions/navigate.ts +55 -2
  104. package/corpus/templates/design/actions/view-screen.ts +68 -1
  105. package/corpus/templates/design/agent-native.app-skill.json +10 -0
  106. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +761 -0
  107. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +2057 -103
  108. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +74 -38
  109. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +399 -0
  110. package/corpus/templates/design/app/components/design/EditPanel.tsx +3185 -439
  111. package/corpus/templates/design/app/components/design/LayersPanel.tsx +1124 -0
  112. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +3116 -147
  113. package/corpus/templates/design/app/components/design/QuestionFlow.tsx +700 -13
  114. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +107 -63
  115. package/corpus/templates/design/app/components/design/index.ts +0 -5
  116. package/corpus/templates/design/app/components/design/inspector/AlignmentMatrix.tsx +286 -0
  117. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +699 -0
  118. package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +461 -0
  119. package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +166 -0
  120. package/corpus/templates/design/app/components/design/inspector/FigmaColorPicker.tsx +1420 -0
  121. package/corpus/templates/design/app/components/design/inspector/SHADER_INTEGRATION.md +420 -0
  122. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +215 -0
  123. package/corpus/templates/design/app/components/design/inspector/ShaderControls.stories.tsx +71 -0
  124. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +518 -0
  125. package/corpus/templates/design/app/components/design/inspector/ShaderEffectRow.tsx +106 -0
  126. package/corpus/templates/design/app/components/design/inspector/figma-icons.tsx +361 -0
  127. package/corpus/templates/design/app/components/design/inspector/index.ts +60 -0
  128. package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +201 -0
  129. package/corpus/templates/design/app/components/design/types.ts +23 -0
  130. package/corpus/templates/design/app/components/layout/Layout.tsx +24 -13
  131. package/corpus/templates/design/app/components/layout/Sidebar.tsx +4 -4
  132. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +474 -36
  133. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +22 -5
  134. package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +24 -11
  135. package/corpus/templates/design/app/global.css +121 -3
  136. package/corpus/templates/design/app/hooks/use-agent-generating.ts +4 -0
  137. package/corpus/templates/design/app/hooks/use-navigation-state.ts +130 -8
  138. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +329 -0
  139. package/corpus/templates/design/app/i18n/zh-TW.ts +264 -0
  140. package/corpus/templates/design/app/i18n-data.ts +2790 -1
  141. package/corpus/templates/design/app/pages/DesignEditor.tsx +5108 -851
  142. package/corpus/templates/design/changelog/2026-06-28-annotate-mode-now-combines-drawing-and-comment-pins-in-one-c.md +6 -0
  143. package/corpus/templates/design/changelog/2026-06-28-design-editor-panel-borders-are-cleaner-so-the-canvas-edge-s.md +6 -0
  144. package/corpus/templates/design/changelog/2026-06-28-drawing-prompts-now-reliably-open-and-submit-to-the-design-a.md +6 -0
  145. package/corpus/templates/design/changelog/2026-06-28-editor-app-menus-now-use-an-outline-agent-native-mark-with-b.md +6 -0
  146. package/corpus/templates/design/changelog/2026-06-28-figma-style-code-design-mode.md +6 -0
  147. package/corpus/templates/design/changelog/2026-06-28-layer-selection-now-updates-chat-context-without-opening-the.md +6 -0
  148. package/corpus/templates/design/changelog/2026-06-28-layer-selections-now-preserve-hidden-and-locked-canvas-state.md +6 -0
  149. package/corpus/templates/design/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  150. package/corpus/templates/design/changelog/2026-06-28-live-cursors-now-keep-names-beside-a-cleaner-pointer-marker.md +6 -0
  151. package/corpus/templates/design/changelog/2026-06-28-mode-switching-now-lives-in-a-compact-bottom-right-icon-dock.md +6 -0
  152. package/corpus/templates/design/changelog/2026-06-28-screen-overview-now-handles-zooming-drawing-opening-and-dele.md +6 -0
  153. package/corpus/templates/design/changelog/2026-06-28-screen-overview-now-selects-screens-on-click-and-opens-them-.md +6 -0
  154. package/corpus/templates/design/changelog/2026-06-28-screen-overview-zooms-into-the-active-screen-with-smoother-e.md +6 -0
  155. package/corpus/templates/design/changelog/2026-06-28-selected-element-chips-in-chat-are-shorter-and-easier-to-sca.md +6 -0
  156. package/corpus/templates/design/changelog/2026-06-28-the-design-editor-toolbar-is-more-compact-and-the-app-menu-m.md +6 -0
  157. package/corpus/templates/design/changelog/2026-06-28-tweaks-now-live-at-the-top-of-the-design-sidebar-instead-of-.md +6 -0
  158. package/corpus/templates/design/changelog/2026-06-28-tweaks-now-live-in-the-right-inspector-beside-the-design-tab.md +6 -0
  159. package/corpus/templates/design/changelog/2026-06-29-active-sidebar-rows-use-soft-highlights.md +6 -0
  160. package/corpus/templates/design/changelog/2026-06-29-agents-can-now-open-screen-overview-focus-screens-and-add.md +6 -0
  161. package/corpus/templates/design/changelog/2026-06-29-design-agents-now-edit-broad-copy-changes-more-reliably.md +6 -0
  162. package/corpus/templates/design/changelog/2026-06-29-design-editor-extensions-now-run-inline-beside-the-artboard.md +6 -0
  163. package/corpus/templates/design/changelog/2026-06-29-sidebars-use-darker-chrome-and-chat-warns-immediately.md +6 -0
  164. package/corpus/templates/design/changelog/2026-06-29-visual-edit-can-open-localhost-routes-as-url-backed-screens.md +6 -0
  165. package/corpus/templates/design/package.json +1 -0
  166. package/corpus/templates/design/server/db/schema.ts +26 -0
  167. package/corpus/templates/design/server/lib/design-snapshot.ts +1 -1
  168. package/corpus/templates/design/server/plugins/agent-chat.ts +3 -0
  169. package/corpus/templates/design/shared/api.ts +27 -0
  170. package/corpus/templates/design/shared/canvas-frames.ts +103 -0
  171. package/corpus/templates/design/shared/canvas-math.ts +1058 -0
  172. package/corpus/templates/design/shared/code-layer.ts +2212 -0
  173. package/corpus/templates/design/shared/color-utils.ts +180 -0
  174. package/corpus/templates/design/shared/generation-session.ts +61 -0
  175. package/corpus/templates/design/shared/shader-presets.ts +782 -0
  176. package/corpus/templates/design/shared/shader-safety.ts +137 -0
  177. package/corpus/templates/design/shared/source-mode.ts +237 -0
  178. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +149 -6
  179. package/corpus/templates/forms/app/i18n/ar-SA.ts +2 -0
  180. package/corpus/templates/forms/app/i18n/de-DE.ts +2 -0
  181. package/corpus/templates/forms/app/i18n/en-US.ts +2 -0
  182. package/corpus/templates/forms/app/i18n/es-ES.ts +2 -0
  183. package/corpus/templates/forms/app/i18n/fr-FR.ts +2 -0
  184. package/corpus/templates/forms/app/i18n/hi-IN.ts +2 -0
  185. package/corpus/templates/forms/app/i18n/ja-JP.ts +2 -0
  186. package/corpus/templates/forms/app/i18n/ko-KR.ts +2 -0
  187. package/corpus/templates/forms/app/i18n/pt-BR.ts +2 -0
  188. package/corpus/templates/forms/app/i18n/zh-CN.ts +2 -0
  189. package/corpus/templates/forms/app/i18n/zh-TW.ts +2 -0
  190. package/corpus/templates/forms/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  191. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +2 -2
  192. package/corpus/templates/macros/changelog/2026-06-28-left-sidebar-footer-controls-use-less-divider-chrome.md +6 -0
  193. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +408 -247
  194. package/corpus/templates/mail/app/i18n/ar-SA.ts +4 -0
  195. package/corpus/templates/mail/app/i18n/de-DE.ts +4 -0
  196. package/corpus/templates/mail/app/i18n/en-US.ts +4 -0
  197. package/corpus/templates/mail/app/i18n/es-ES.ts +4 -0
  198. package/corpus/templates/mail/app/i18n/fr-FR.ts +4 -0
  199. package/corpus/templates/mail/app/i18n/hi-IN.ts +4 -0
  200. package/corpus/templates/mail/app/i18n/ja-JP.ts +4 -0
  201. package/corpus/templates/mail/app/i18n/ko-KR.ts +4 -0
  202. package/corpus/templates/mail/app/i18n/pt-BR.ts +4 -0
  203. package/corpus/templates/mail/app/i18n/zh-CN.ts +4 -0
  204. package/corpus/templates/mail/app/i18n/zh-TW.ts +4 -0
  205. package/corpus/templates/mail/changelog/2026-06-28-pinned-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  206. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +6 -8
  207. package/corpus/templates/plan/app/components/plan/wireframe/Wireframe.tsx +1 -1
  208. package/corpus/templates/plan/app/global.css +61 -78
  209. package/corpus/templates/plan/app/pages/PlansPage.tsx +8 -0
  210. package/corpus/templates/plan/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  211. package/corpus/templates/plan/changelog/2026-06-28-plans-use-the-shared-neutral-light-and-dark-theme.md +6 -0
  212. package/corpus/templates/plan/changelog/2026-06-28-sending-open-feedback-from-a-plan-now-opens-the-inline-plan-.md +6 -0
  213. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +5 -5
  214. package/corpus/templates/slides/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  215. package/corpus/templates/videos/app/components/Sidebar.tsx +2 -2
  216. package/corpus/templates/videos/app/components/layout/Layout.tsx +29 -2
  217. package/corpus/templates/videos/app/components/layout/NavSidebar.tsx +113 -30
  218. package/corpus/templates/videos/app/i18n/ar-SA.ts +2 -0
  219. package/corpus/templates/videos/app/i18n/de-DE.ts +2 -0
  220. package/corpus/templates/videos/app/i18n/en-US.ts +2 -0
  221. package/corpus/templates/videos/app/i18n/es-ES.ts +2 -0
  222. package/corpus/templates/videos/app/i18n/fr-FR.ts +2 -0
  223. package/corpus/templates/videos/app/i18n/hi-IN.ts +2 -0
  224. package/corpus/templates/videos/app/i18n/ja-JP.ts +2 -0
  225. package/corpus/templates/videos/app/i18n/ko-KR.ts +2 -0
  226. package/corpus/templates/videos/app/i18n/pt-BR.ts +2 -0
  227. package/corpus/templates/videos/app/i18n/zh-CN.ts +2 -0
  228. package/corpus/templates/videos/app/i18n/zh-TW.ts +2 -0
  229. package/corpus/templates/videos/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  230. package/dist/agent/engine/index.d.ts +1 -1
  231. package/dist/agent/engine/index.d.ts.map +1 -1
  232. package/dist/agent/engine/index.js +1 -1
  233. package/dist/agent/engine/index.js.map +1 -1
  234. package/dist/agent/engine/registry.d.ts +9 -0
  235. package/dist/agent/engine/registry.d.ts.map +1 -1
  236. package/dist/agent/engine/registry.js +37 -0
  237. package/dist/agent/engine/registry.js.map +1 -1
  238. package/dist/agent/production-agent.d.ts.map +1 -1
  239. package/dist/agent/production-agent.js +4 -3
  240. package/dist/agent/production-agent.js.map +1 -1
  241. package/dist/cli/design-connect.d.ts +52 -0
  242. package/dist/cli/design-connect.d.ts.map +1 -0
  243. package/dist/cli/design-connect.js +409 -0
  244. package/dist/cli/design-connect.js.map +1 -0
  245. package/dist/cli/index.js +15 -0
  246. package/dist/cli/index.js.map +1 -1
  247. package/dist/cli/skills.d.ts +3 -0
  248. package/dist/cli/skills.d.ts.map +1 -1
  249. package/dist/cli/skills.js +121 -3
  250. package/dist/cli/skills.js.map +1 -1
  251. package/dist/client/AssistantChat.d.ts.map +1 -1
  252. package/dist/client/AssistantChat.js +38 -8
  253. package/dist/client/AssistantChat.js.map +1 -1
  254. package/dist/client/agent-chat.d.ts +6 -0
  255. package/dist/client/agent-chat.d.ts.map +1 -1
  256. package/dist/client/agent-chat.js +17 -3
  257. package/dist/client/agent-chat.js.map +1 -1
  258. package/dist/client/blocks/library/MermaidBlock.js +1 -1
  259. package/dist/client/blocks/library/MermaidBlock.js.map +1 -1
  260. package/dist/client/blocks/library/diagram.js +1 -1
  261. package/dist/client/blocks/library/diagram.js.map +1 -1
  262. package/dist/client/blocks/library/wireframe.js +1 -1
  263. package/dist/client/blocks/library/wireframe.js.map +1 -1
  264. package/dist/client/chat/message-components.js +1 -1
  265. package/dist/client/chat/message-components.js.map +1 -1
  266. package/dist/client/chat-model-groups.d.ts.map +1 -1
  267. package/dist/client/chat-model-groups.js +1 -2
  268. package/dist/client/chat-model-groups.js.map +1 -1
  269. package/dist/client/components/LiveCursorOverlay.d.ts +1 -2
  270. package/dist/client/components/LiveCursorOverlay.d.ts.map +1 -1
  271. package/dist/client/components/LiveCursorOverlay.js +19 -40
  272. package/dist/client/components/LiveCursorOverlay.js.map +1 -1
  273. package/dist/client/composer/TiptapComposer.d.ts +3 -1
  274. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  275. package/dist/client/composer/TiptapComposer.js +86 -24
  276. package/dist/client/composer/TiptapComposer.js.map +1 -1
  277. package/dist/client/composer/useVoiceDictation.d.ts +9 -0
  278. package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
  279. package/dist/client/composer/useVoiceDictation.js +154 -32
  280. package/dist/client/composer/useVoiceDictation.js.map +1 -1
  281. package/dist/client/frame-protocol.d.ts +17 -2
  282. package/dist/client/frame-protocol.d.ts.map +1 -1
  283. package/dist/client/frame-protocol.js.map +1 -1
  284. package/dist/client/rich-markdown-editor/RegistryBlockNode.js +2 -2
  285. package/dist/client/rich-markdown-editor/RegistryBlockNode.js.map +1 -1
  286. package/dist/client/sharing/ShareButton.d.ts +2 -0
  287. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  288. package/dist/client/sharing/ShareButton.js +7 -6
  289. package/dist/client/sharing/ShareButton.js.map +1 -1
  290. package/dist/client/use-agent-engine-configured.d.ts +5 -0
  291. package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
  292. package/dist/client/use-agent-engine-configured.js +51 -25
  293. package/dist/client/use-agent-engine-configured.js.map +1 -1
  294. package/dist/collab/awareness.d.ts +2 -2
  295. package/dist/collab/awareness.d.ts.map +1 -1
  296. package/dist/collab/routes.d.ts +1 -1
  297. package/dist/file-upload/actions/upload-image.d.ts +2 -2
  298. package/dist/notifications/routes.d.ts +3 -3
  299. package/dist/observability/routes.d.ts +8 -8
  300. package/dist/progress/routes.d.ts +1 -1
  301. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  302. package/dist/server/transcribe-voice.d.ts.map +1 -1
  303. package/dist/server/transcribe-voice.js +40 -24
  304. package/dist/server/transcribe-voice.js.map +1 -1
  305. package/dist/shared/mcp-embed-headers.d.ts +1 -0
  306. package/dist/shared/mcp-embed-headers.d.ts.map +1 -1
  307. package/dist/shared/mcp-embed-headers.js +20 -1
  308. package/dist/shared/mcp-embed-headers.js.map +1 -1
  309. package/dist/styles/agent-native.css +56 -7
  310. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
  311. package/dist/vite/client.d.ts.map +1 -1
  312. package/dist/vite/client.js +2 -0
  313. package/dist/vite/client.js.map +1 -1
  314. package/dist/voice/index.d.ts +5 -0
  315. package/dist/voice/index.d.ts.map +1 -0
  316. package/dist/voice/index.js +4 -0
  317. package/dist/voice/index.js.map +1 -0
  318. package/dist/voice/voice-cleanup-prompt.d.ts +6 -0
  319. package/dist/voice/voice-cleanup-prompt.d.ts.map +1 -0
  320. package/dist/voice/voice-cleanup-prompt.js +26 -0
  321. package/dist/voice/voice-cleanup-prompt.js.map +1 -0
  322. package/dist/voice/voice-context.d.ts +25 -0
  323. package/dist/voice/voice-context.d.ts.map +1 -0
  324. package/dist/voice/voice-context.js +156 -0
  325. package/dist/voice/voice-context.js.map +1 -0
  326. package/dist/voice/voice-replacements.d.ts +4 -0
  327. package/dist/voice/voice-replacements.d.ts.map +1 -0
  328. package/dist/voice/voice-replacements.js +52 -0
  329. package/dist/voice/voice-replacements.js.map +1 -0
  330. package/docs/content/locales/ar-SA/template-design.mdx +41 -0
  331. package/docs/content/locales/de-DE/template-design.mdx +51 -0
  332. package/docs/content/locales/es-ES/template-design.mdx +50 -0
  333. package/docs/content/locales/fr-FR/template-design.mdx +49 -0
  334. package/docs/content/locales/hi-IN/template-design.mdx +44 -0
  335. package/docs/content/locales/ja-JP/template-design.mdx +46 -0
  336. package/docs/content/locales/ko-KR/template-design.mdx +44 -0
  337. package/docs/content/locales/pt-BR/template-design.mdx +48 -0
  338. package/docs/content/locales/zh-CN/template-design.mdx +36 -0
  339. package/docs/content/locales/zh-TW/template-design.mdx +38 -0
  340. package/docs/content/template-design.mdx +45 -0
  341. package/package.json +2 -1
  342. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
  343. package/corpus/templates/design/app/components/design/DesignToolbar.tsx +0 -339
  344. package/corpus/templates/design/app/components/design/PresentMode.tsx +0 -68
  345. package/corpus/templates/design/app/components/design/ViewportTabs.tsx +0 -149
  346. package/corpus/templates/design/app/components/design/ZoomControls.tsx +0 -157
@@ -37,15 +37,16 @@ const HELP = `npx @agent-native/core@latest skills
37
37
 
38
38
  Usage:
39
39
  npx @agent-native/core@latest skills list
40
- npx @agent-native/core@latest skills status [assets|content|design-exploration|visual-plan|visual-recap|context-xray|scaffold] [--client codex|claude-code|pi|all] [--scope user|project] [--json]
41
- npx @agent-native/core@latest skills update [assets|content|design-exploration|visual-plan|visual-recap|context-xray|scaffold] [--client codex|claude-code|pi|all] [--scope user|project] [--dry-run] [--json]
42
- npx @agent-native/core@latest skills add assets|content|design-exploration|visual-plan|visual-recap|context-xray [--client codex|claude-code|cowork|cursor|opencode|github-copilot|all] [--scope user|project] [--mode hosted|local-files|self-hosted] [--mcp-url <url>] [--no-connect] [--with-github-action] [--yes] [--dry-run] [--json]
40
+ npx @agent-native/core@latest skills status [assets|content|design-exploration|visual-edit|visual-plan|visual-recap|context-xray|scaffold] [--client codex|claude-code|pi|all] [--scope user|project] [--json]
41
+ npx @agent-native/core@latest skills update [assets|content|design-exploration|visual-edit|visual-plan|visual-recap|context-xray|scaffold] [--client codex|claude-code|pi|all] [--scope user|project] [--dry-run] [--json]
42
+ npx @agent-native/core@latest skills add assets|content|design-exploration|visual-edit|visual-plan|visual-recap|context-xray [--client codex|claude-code|cowork|cursor|opencode|github-copilot|all] [--scope user|project] [--mode hosted|local-files|self-hosted] [--mcp-url <url>] [--no-connect] [--with-github-action] [--yes] [--dry-run] [--json]
43
43
  npx @agent-native/core@latest skills add <manifest-or-app-dir|skill-repo> [--skill <name>] [--client ...] [--yes]
44
44
 
45
45
  Examples:
46
46
  npx @agent-native/core@latest skills add assets
47
47
  npx @agent-native/core@latest skills add content --mode local-files
48
48
  npx @agent-native/core@latest skills add design-exploration
49
+ npx @agent-native/core@latest skills add visual-edit
49
50
  npx @agent-native/core@latest skills add visual-plan
50
51
  npx @agent-native/core@latest skills add visual-recap
51
52
  npx @agent-native/core@latest skills add visual-recap --with-github-action
@@ -376,6 +377,92 @@ iteration, or a human-in-the-loop choice among design directions.
376
377
  and token values. Never paste bearer tokens into chat or logs.
377
378
  `;
378
379
 
380
+ const DESIGN_VISUAL_EDIT_SKILL_MD = `---
381
+ name: visual-edit
382
+ description: >-
383
+ Open a running local app in Design overview mode as URL-backed iframe screens
384
+ for visual editing, flow review, duplication, and route-state exploration.
385
+ metadata:
386
+ visibility: exported
387
+ ---
388
+
389
+ # Visual Edit
390
+
391
+ Use \`/visual-edit\` when the user wants to inspect or edit a real local app
392
+ visually instead of generating standalone Alpine HTML. The source of truth is
393
+ the running localhost app plus its route URLs. Design shows those routes as
394
+ iframe-backed screens on the infinite canvas.
395
+
396
+ ## Core Model
397
+
398
+ - Each screen is a URL-backed iframe, not copied HTML.
399
+ - Each screen keeps URL metadata: \`connectionId\`, \`routeId\`, \`path\`,
400
+ \`url\`, \`bridgeUrl\`, title, and viewport size.
401
+ - Start in Design's screen overview mode. In overview, screens are static like
402
+ Figma frames; full-screen focus is for scrolling and app interaction.
403
+ - Alt-drag duplicates a screen. For localhost screens, duplication copies the
404
+ iframe frame and URL metadata; change the copy's path/query for a new state.
405
+ - Flow visualization is multiple URL states: \`/checkout?step=shipping\`,
406
+ \`/checkout?step=payment\`, \`/checkout?step=done\`, etc.
407
+
408
+ ## Required Local Bridge
409
+
410
+ From the target app repo, make sure its dev server is running, then run:
411
+
412
+ \`\`\`bash
413
+ npx @agent-native/core@latest design connect --url http://localhost:5173 --root .
414
+ \`\`\`
415
+
416
+ Use the app's real port. The command starts a local bridge on
417
+ \`http://127.0.0.1:7331\` by default and exposes \`/manifest.json\`,
418
+ \`/routes.json\`, and \`/health\`.
419
+
420
+ For one-shot agent setup, ask for JSON and keep the long-running bridge open in
421
+ a second terminal if the user needs live updates:
422
+
423
+ \`\`\`bash
424
+ npx @agent-native/core@latest design connect --url http://localhost:5173 --root . --json
425
+ \`\`\`
426
+
427
+ ## Action Flow
428
+
429
+ 1. Register or refresh the bridge with \`connect-localhost\`, passing the
430
+ \`/manifest.json\` result as \`routeManifest\` and \`capabilities\`.
431
+ 2. Create or reuse a Design project with \`create-design\`.
432
+ 3. Place URL-backed screens with \`add-localhost-screens\`:
433
+
434
+ \`\`\`bash
435
+ pnpm action add-localhost-screens '{
436
+ "designId": "<design-id>",
437
+ "connectionId": "<connection-id>",
438
+ "paths": ["/", "/pricing", "/checkout?step=payment"]
439
+ }'
440
+ \`\`\`
441
+
442
+ If no \`routes\` or \`paths\` are supplied, \`add-localhost-screens\` uses every
443
+ route from the latest localhost manifest.
444
+
445
+ 4. Navigate to overview mode:
446
+
447
+ \`\`\`bash
448
+ pnpm action navigate --view editor --designId "<design-id>" --editorView overview
449
+ \`\`\`
450
+
451
+ ## Editing URLs
452
+
453
+ Keep localhost screens as URL files plus \`screenMetadata[fileId]\`. Do not
454
+ replace them with copied \`srcdoc\` HTML unless the user explicitly asks for a
455
+ frozen snapshot. To change a state, rerun \`add-localhost-screens\` with the new
456
+ path/query or duplicate the screen and update the copy's URL metadata.
457
+
458
+ ## Verification
459
+
460
+ - \`list-localhost-connections\` returns the expected connection and routes.
461
+ - The Design editor opens in overview mode.
462
+ - Every requested screen renders the intended localhost URL.
463
+ - Alt-dragging a screen copies the URL-backed frame, not an inline HTML clone.
464
+ `;
465
+
379
466
  /**
380
467
  * Setup/auth block for the `/visual-plan` skill. Interpolated into
381
468
  * `VISUAL_PLANS_SKILL_MD` below so the install + one-step authenticate
@@ -2458,6 +2545,9 @@ export const BUILT_IN_APP_SKILLS = {
2458
2545
  },
2459
2546
  design: {
2460
2547
  skillName: "design-exploration",
2548
+ extraSkills: {
2549
+ "visual-edit": DESIGN_VISUAL_EDIT_SKILL_MD,
2550
+ },
2461
2551
  manifest: normalizeAppSkillManifest({
2462
2552
  schemaVersion: 1,
2463
2553
  id: "design",
@@ -2480,6 +2570,11 @@ export const BUILT_IN_APP_SKILLS = {
2480
2570
  action: "present-design-variants",
2481
2571
  path: "/design",
2482
2572
  },
2573
+ {
2574
+ id: "visual-edit",
2575
+ action: "add-localhost-screens",
2576
+ path: "/design",
2577
+ },
2483
2578
  ],
2484
2579
  skills: [
2485
2580
  {
@@ -2487,6 +2582,11 @@ export const BUILT_IN_APP_SKILLS = {
2487
2582
  visibility: "exported",
2488
2583
  exportAs: "design-exploration",
2489
2584
  },
2585
+ {
2586
+ path: "skills/visual-edit",
2587
+ visibility: "exported",
2588
+ exportAs: "visual-edit",
2589
+ },
2490
2590
  ],
2491
2591
  hostAdapters: [
2492
2592
  "codex-plugin",
@@ -2653,6 +2753,9 @@ const BUILT_IN_APP_SKILL_ALIASES = {
2653
2753
  "ui-design": "design",
2654
2754
  "ux-design": "design",
2655
2755
  "design-exploration": "design",
2756
+ "visual-edit": "design",
2757
+ "local-visual-edit": "design",
2758
+ "design-visual-edit": "design",
2656
2759
  "ux-exploration": "design",
2657
2760
  "agent-native-design": "design",
2658
2761
  "agent-native-design-exploration": "design",
@@ -2686,6 +2789,8 @@ const BUILT_IN_APP_SKILL_DISPLAY_ALIASES = {
2686
2789
  ],
2687
2790
  design: [
2688
2791
  "design-exploration",
2792
+ "visual-edit",
2793
+ "local-visual-edit",
2689
2794
  "ux-exploration",
2690
2795
  "agent-native-design-exploration",
2691
2796
  ],
@@ -3117,6 +3222,19 @@ function builtInOnlySkillNames(target: string): string[] | undefined {
3117
3222
  if (normalized === "visual-recap" || normalized === "visual-recaps") {
3118
3223
  return ["visual-recap"];
3119
3224
  }
3225
+ if (
3226
+ normalized === "design-exploration" ||
3227
+ normalized === "agent-native-design-exploration"
3228
+ ) {
3229
+ return ["design-exploration"];
3230
+ }
3231
+ if (
3232
+ normalized === "visual-edit" ||
3233
+ normalized === "local-visual-edit" ||
3234
+ normalized === "design-visual-edit"
3235
+ ) {
3236
+ return ["visual-edit"];
3237
+ }
3120
3238
  return undefined;
3121
3239
  }
3122
3240
 
@@ -4278,6 +4396,11 @@ const BUILT_IN_SKILL_PROMPT_OPTIONS: SkillsTargetPromptContext["options"] = [
4278
4396
  label: "design-exploration",
4279
4397
  hint: BUILT_IN_APP_SKILLS.design.manifest.description,
4280
4398
  },
4399
+ {
4400
+ value: "visual-edit",
4401
+ label: "visual-edit",
4402
+ hint: "Open a running local app in Design overview mode as URL-backed iframe screens.",
4403
+ },
4281
4404
  {
4282
4405
  value: "context-xray",
4283
4406
  label: "context-xray",
@@ -34,6 +34,7 @@ import React, {
34
34
  useImperativeHandle,
35
35
  } from "react";
36
36
 
37
+ import { LLM_MISSING_CREDENTIALS_MESSAGE } from "../agent/engine/credential-errors.js";
37
38
  import type { ReasoningEffort } from "../shared/reasoning-effort.js";
38
39
  import {
39
40
  getActiveRun,
@@ -48,9 +49,11 @@ import {
48
49
  import {
49
50
  appendAgentChatContextToMessage,
50
51
  formatAgentChatContextItemsForPrompt,
52
+ getAgentChatContextState,
51
53
  normalizeAgentChatContextItem,
52
54
  publishAgentChatContextItems,
53
55
  refreshAgentChatContext,
56
+ subscribeAgentChatContext,
54
57
  type AgentChatContextItem,
55
58
  } from "./agent-chat.js";
56
59
  import { captureError } from "./analytics.js";
@@ -147,7 +150,10 @@ import {
147
150
  readSSEStreamRaw,
148
151
  settleInterruptedToolCalls,
149
152
  } from "./sse-event-processor.js";
150
- import { useAgentEngineConfigured } from "./use-agent-engine-configured.js";
153
+ import {
154
+ fetchAgentEngineConfiguredState,
155
+ useAgentEngineConfigured,
156
+ } from "./use-agent-engine-configured.js";
151
157
  import type {
152
158
  ChatThreadScope,
153
159
  ChatThreadSnapshot,
@@ -223,6 +229,7 @@ function createUserMessageRunConfig(
223
229
  const PENDING_SELECTION_KEY = "pending-selection-context";
224
230
  const ACTIVE_RUN_CLEAR_TIMEOUT_MS = 5_000;
225
231
  const ACTIVE_RUN_POLL_INTERVAL_MS = 150;
232
+ const SUBMIT_ENGINE_STATUS_TIMEOUT_MS = 1000;
226
233
 
227
234
  type ActiveRunLookup = {
228
235
  active?: boolean;
@@ -1131,15 +1138,32 @@ const AssistantChatInner = forwardRef<
1131
1138
  }
1132
1139
  };
1133
1140
  }, [threadRuntime]);
1134
- const missingApiKey = useAgentEngineConfigured(
1141
+ const agentEngineConfigured = useAgentEngineConfigured(
1135
1142
  providerStatusChecksEnabled,
1136
- ).missing;
1143
+ );
1144
+ const missingApiKey = agentEngineConfigured.missing;
1137
1145
  const isComposerDisabled = missingApiKey || composerDisabled;
1138
1146
  const missingApiKeySetupAboveComposer =
1139
1147
  missingApiKeySetupLayout === "sidebar";
1140
1148
  // Increments each time the user tries to chat while no LLM is connected.
1141
1149
  // `BuilderSetupCard` watches this to replay a one-shot bounce.
1142
1150
  const [missingKeyBouncePulse, setMissingKeyBouncePulse] = useState(0);
1151
+ const ensureAgentEngineReadyForSubmit = useCallback(async () => {
1152
+ const state =
1153
+ agentEngineConfigured.state === "missing"
1154
+ ? "missing"
1155
+ : await fetchAgentEngineConfiguredState(providerStatusChecksEnabled, {
1156
+ timeoutMs: SUBMIT_ENGINE_STATUS_TIMEOUT_MS,
1157
+ });
1158
+ if (state !== "missing") return true;
1159
+
1160
+ setComposerError(LLM_MISSING_CREDENTIALS_MESSAGE);
1161
+ setMissingKeyBouncePulse((p) => p + 1);
1162
+ if (typeof window !== "undefined") {
1163
+ window.dispatchEvent(new Event("agent-chat:missing-api-key"));
1164
+ }
1165
+ return false;
1166
+ }, [agentEngineConfigured.state, providerStatusChecksEnabled]);
1143
1167
  const [authError, setAuthError] = useState<{
1144
1168
  sessionExpired?: boolean;
1145
1169
  } | null>(null);
@@ -1231,8 +1255,15 @@ const AssistantChatInner = forwardRef<
1231
1255
  composerContextItemsRef.current = state.items;
1232
1256
  setComposerContextItems(state.items);
1233
1257
  });
1258
+ const unsubscribe = subscribeAgentChatContext(() => {
1259
+ if (cancelled || !isActiveComposerRef.current) return;
1260
+ const state = getAgentChatContextState();
1261
+ composerContextItemsRef.current = state.items;
1262
+ setComposerContextItems(state.items);
1263
+ });
1234
1264
  return () => {
1235
1265
  cancelled = true;
1266
+ unsubscribe();
1236
1267
  };
1237
1268
  }, [isActiveComposer]);
1238
1269
  // Tracks the JSON of the last queue we successfully persisted so the
@@ -2152,9 +2183,9 @@ const AssistantChatInner = forwardRef<
2152
2183
  }, [tabId]);
2153
2184
 
2154
2185
  // Real activity means the next chunk has started — leave the auto-resume
2155
- // ("Resuming") state so the indicator settles back to "thinking". The
2186
+ // ("Resuming") state so the indicator settles back to "Thinking". The
2156
2187
  // activity label itself is intentionally not surfaced: the running
2157
- // indicator stays a steady "thinking" rather than flipping through
2188
+ // indicator stays a steady "Thinking" rather than flipping through
2158
2189
  // transient step labels.
2159
2190
  useEffect(() => {
2160
2191
  const handler = (e: Event) => {
@@ -2454,6 +2485,9 @@ const AssistantChatInner = forwardRef<
2454
2485
  includeComposerContext = false,
2455
2486
  trackInRunsTray = false,
2456
2487
  ) => {
2488
+ if (!(await ensureAgentEngineReadyForSubmit())) {
2489
+ return;
2490
+ }
2457
2491
  materializeFrozenReconnectContent();
2458
2492
  setShowContinue(false);
2459
2493
  setLoopLimitInfo(null);
@@ -2660,6 +2694,7 @@ const AssistantChatInner = forwardRef<
2660
2694
  [
2661
2695
  applyLocalQueuedMessages,
2662
2696
  buildComposerContextSubmission,
2697
+ ensureAgentEngineReadyForSubmit,
2663
2698
  execMode,
2664
2699
  isRunning,
2665
2700
  materializeFrozenReconnectContent,
@@ -3254,10 +3289,10 @@ const AssistantChatInner = forwardRef<
3254
3289
  ? "Reconnecting"
3255
3290
  : isAutoResuming
3256
3291
  ? "Resuming"
3257
- : // Keep a steady "thinking" while the model works —
3292
+ : // Keep a steady "Thinking" while the model works —
3258
3293
  // never flip through transient activity labels
3259
3294
  // (e.g. "Contacting model", "Preparing X action").
3260
- "thinking"
3295
+ "Thinking"
3261
3296
  }
3262
3297
  />
3263
3298
  )}
@@ -3439,6 +3474,7 @@ const AssistantChatInner = forwardRef<
3439
3474
  : undefined
3440
3475
  }
3441
3476
  onSlashCommand={onSlashCommand}
3477
+ onBeforeSubmit={ensureAgentEngineReadyForSubmit}
3442
3478
  execMode={execMode}
3443
3479
  onExecModeChange={onExecModeChange}
3444
3480
  planModeDisabled={planModeDisabled}
@@ -73,6 +73,12 @@ export interface AgentChatMessage {
73
73
  requestMode?: AgentChatRequestMode;
74
74
  /** Scoped system prompt additions for this sub-agent */
75
75
  instructions?: string;
76
+ /**
77
+ * Message delivery target. Auto-submitted MCP App messages normally relay to
78
+ * the host chat; use "local" when a control explicitly targets this app's
79
+ * own AgentSidebar.
80
+ */
81
+ chatTarget?: "auto" | "local";
76
82
  /**
77
83
  * Whether to open the agent sidebar if it's currently hidden.
78
84
  * Defaults to true — submitting a chat should make the response visible.
@@ -527,7 +533,19 @@ function postAgentChatContextMessage(
527
533
  ): void {
528
534
  if (typeof window === "undefined") return;
529
535
 
530
- const payload = { type, data };
536
+ const shouldForwardOpenSidebar =
537
+ (type === AGENT_CHAT_SET_CONTEXT_MESSAGE_TYPE &&
538
+ options.openSidebar === false) ||
539
+ (type !== AGENT_CHAT_SET_CONTEXT_MESSAGE_TYPE &&
540
+ options.openSidebar === true);
541
+ const payloadData =
542
+ shouldForwardOpenSidebar && typeof data === "object" && data !== null
543
+ ? {
544
+ ...(data as Record<string, unknown>),
545
+ openSidebar: options.openSidebar,
546
+ }
547
+ : data;
548
+ const payload = { type, data: payloadData };
531
549
  const targetSelf = isInBuilderFrame() || isDirectMcpAppEmbedSession();
532
550
  const target = targetSelf
533
551
  ? window
@@ -728,6 +746,7 @@ function readStoredAgentChatRequestMode(): AgentChatRequestMode | undefined {
728
746
  export function sendToAgentChat(opts: AgentChatMessage): string {
729
747
  const tabId = opts.tabId ?? generateTabId();
730
748
  const isCodeRequest = opts.type === "code" || opts.requiresCode === true;
749
+ const localChatTarget = opts.chatTarget === "local";
731
750
  const requestMode =
732
751
  normalizeAgentChatRequestMode(opts.requestMode ?? opts.mode) ??
733
752
  readStoredAgentChatRequestMode();
@@ -752,7 +771,11 @@ export function sendToAgentChat(opts: AgentChatMessage): string {
752
771
  },
753
772
  };
754
773
 
755
- if (opts.submit !== false && isMcpAppChatBridgeEnabled()) {
774
+ if (
775
+ opts.submit !== false &&
776
+ !localChatTarget &&
777
+ isMcpAppChatBridgeEnabled()
778
+ ) {
756
779
  const directHostMessage = sendMcpAppHostMessage({
757
780
  message: opts.message,
758
781
  context: opts.context,
@@ -783,7 +806,8 @@ export function sendToAgentChat(opts: AgentChatMessage): string {
783
806
  const shouldOpenSidebar = opts.openSidebar !== false && !opts.background;
784
807
 
785
808
  const targetSelf =
786
- !isCodeRequest && (isInBuilderFrame() || isDirectMcpAppEmbedSession());
809
+ !isCodeRequest &&
810
+ (localChatTarget || isInBuilderFrame() || isDirectMcpAppEmbedSession());
787
811
  const target = targetSelf
788
812
  ? window
789
813
  : window.parent !== window
@@ -268,7 +268,7 @@ function MermaidDiagram({
268
268
  onClick={() => setExpanded(true)}
269
269
  aria-label={copy.expandDiagram}
270
270
  title={copy.expandDiagram}
271
- className="an-diagram-expand-trigger absolute right-2 top-2 z-10 flex size-7 items-center justify-center rounded-md border border-border/60 bg-background/90 text-muted-foreground opacity-0 shadow-sm backdrop-blur transition-[color,opacity] hover:text-foreground focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring group-hover/mermaid:opacity-100"
271
+ className="an-diagram-expand-trigger absolute right-2 top-2 z-10 flex size-7 items-center justify-center rounded-md border border-border/60 bg-background text-muted-foreground opacity-0 shadow-sm transition-[color,opacity] hover:text-foreground focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring group-hover/mermaid:opacity-100"
272
272
  >
273
273
  <IconArrowsMaximize className="size-4" />
274
274
  </button>
@@ -650,7 +650,7 @@ function ExpandableDiagramBody({
650
650
  onClick={() => toggleWireframeStyle()}
651
651
  aria-label={styleLabel}
652
652
  aria-pressed={sketchy}
653
- className="an-diagram-style-trigger flex size-7 items-center justify-center rounded-md border border-border/60 bg-background/90 text-muted-foreground opacity-0 shadow-sm backdrop-blur transition-[color,opacity] hover:text-foreground focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring group-hover/diagram:opacity-100"
653
+ className="an-diagram-style-trigger flex size-7 items-center justify-center rounded-md border border-border/60 bg-background text-muted-foreground opacity-0 shadow-sm transition-[color,opacity] hover:text-foreground focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring group-hover/diagram:opacity-100"
654
654
  >
655
655
  {sketchy ? (
656
656
  <IconScribble className="size-4" />
@@ -669,7 +669,7 @@ function ExpandableDiagramBody({
669
669
  data-plan-interactive
670
670
  onClick={() => setExpanded(true)}
671
671
  aria-label={copy.expandDiagram}
672
- className="an-diagram-expand-trigger flex size-7 items-center justify-center rounded-md border border-border/60 bg-background/90 text-muted-foreground opacity-0 shadow-sm backdrop-blur transition-[color,opacity] hover:text-foreground focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring group-hover/diagram:opacity-100"
672
+ className="an-diagram-expand-trigger flex size-7 items-center justify-center rounded-md border border-border/60 bg-background text-muted-foreground opacity-0 shadow-sm transition-[color,opacity] hover:text-foreground focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring group-hover/diagram:opacity-100"
673
673
  >
674
674
  <IconArrowsMaximize className="size-4" />
675
675
  </button>
@@ -313,7 +313,7 @@ function WireframeStyleToggleButton() {
313
313
  event.stopPropagation();
314
314
  toggleWireframeStyle();
315
315
  }}
316
- className="absolute right-2 top-2 z-30 inline-flex h-7 items-center gap-1 rounded-md border border-border/60 bg-background/90 px-2 text-xs font-medium text-muted-foreground opacity-0 shadow-sm backdrop-blur transition-[color,opacity] hover:text-foreground focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring group-hover/wireframe-artboard:opacity-100"
316
+ className="absolute right-2 top-2 z-30 inline-flex h-7 items-center gap-1 rounded-md border border-border/60 bg-background px-2 text-xs font-medium text-muted-foreground opacity-0 shadow-sm transition-[color,opacity] hover:text-foreground focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring group-hover/wireframe-artboard:opacity-100"
317
317
  >
318
318
  <IconPencil className="size-3.5" aria-hidden="true" />
319
319
  <span>{label}</span>
@@ -950,7 +950,7 @@ export function RunningActivityStatus({ label }: { label: string }) {
950
950
  }
951
951
 
952
952
  export function ThinkingIndicator({
953
- label = "thinking",
953
+ label = "Thinking",
954
954
  }: { label?: string } = {}) {
955
955
  return (
956
956
  <div
@@ -140,8 +140,7 @@ export function buildChatModelGroups({
140
140
  ),
141
141
  configured:
142
142
  requiredEnvVars.length === 0 ||
143
- requiredEnvVars.some((key) => configured.has(key)) ||
144
- engine.name === currentEngineName,
143
+ requiredEnvVars.some((key) => configured.has(key)),
145
144
  };
146
145
  })
147
146
  .filter((group) => group.models.length > 0);
@@ -7,13 +7,11 @@
7
7
  * correctly. Pass a `mapCoords` prop to handle non-identity transforms
8
8
  * (e.g. a zoomed canvas).
9
9
  *
10
- * The agent's cursor is styled distinctly with a sparkle variant + "AI"
11
- * label, consistent with AgentPresenceChip.
10
+ * The agent uses the same pointer shape with an "AI" label.
12
11
  *
13
12
  * Cursors fade out after 10 seconds of no movement.
14
13
  */
15
14
 
16
- import { IconSparkles } from "@tabler/icons-react";
17
15
  import { useState, useEffect, useRef, memo } from "react";
18
16
 
19
17
  import type { OtherPresence, NormalizedPoint } from "../../collab/presence.js";
@@ -48,50 +46,28 @@ export interface LiveCursorOverlayProps {
48
46
 
49
47
  const STALE_MS = 10_000; // Fade out cursors older than 10s
50
48
 
51
- const CURSOR_SVG = `
52
- <svg xmlns="http://www.w3.org/2000/svg" width="16" height="22" viewBox="0 0 16 22" fill="none">
53
- <path d="M0 0L0 18L4.5 13.5L7.5 20L9.5 19.5L6.5 13L12 13L0 0Z" fill="__COLOR__" stroke="white" stroke-width="1"/>
54
- </svg>
55
- `.trim();
56
-
57
- function CursorPointer({
58
- color,
59
- isAgent,
60
- }: {
61
- color: string;
62
- isAgent: boolean;
63
- }) {
64
- if (isAgent) {
65
- return (
66
- <div
67
- style={{
68
- display: "flex",
69
- alignItems: "center",
70
- justifyContent: "center",
71
- width: 22,
72
- height: 22,
73
- borderRadius: "50%",
74
- backgroundColor: color,
75
- color: "#fff",
76
- boxShadow: `0 0 0 2px #fff`,
77
- }}
78
- >
79
- <IconSparkles size={12} stroke={2} />
80
- </div>
81
- );
82
- }
83
-
84
- const svgSrc =
85
- "data:image/svg+xml;charset=utf-8," +
86
- encodeURIComponent(CURSOR_SVG.replace("__COLOR__", color));
87
-
49
+ function CursorPointer({ color }: { color: string }) {
88
50
  return (
89
- <img
90
- src={svgSrc}
91
- alt=""
51
+ <svg
52
+ xmlns="http://www.w3.org/2000/svg"
53
+ width="25"
54
+ height="29"
55
+ viewBox="0 0 25 29"
56
+ fill="none"
92
57
  aria-hidden
93
- style={{ width: 16, height: 22, display: "block", flexShrink: 0 }}
94
- />
58
+ style={{
59
+ display: "block",
60
+ filter: "drop-shadow(0 2px 3px rgba(15, 23, 42, 0.3))",
61
+ }}
62
+ >
63
+ <path
64
+ d="M2.5 2.5L21.5 11L12.6 14.1L8.3 24.5L2.5 2.5Z"
65
+ fill={color}
66
+ stroke="white"
67
+ strokeLinejoin="round"
68
+ strokeWidth="3"
69
+ />
70
+ </svg>
95
71
  );
96
72
  }
97
73
 
@@ -123,39 +99,30 @@ const CursorLabel = memo(function CursorLabel({
123
99
  transform: "translate(-2px, -2px)",
124
100
  zIndex: 9999,
125
101
  transition: "left 120ms linear, top 120ms linear",
126
- display: "flex",
127
- flexDirection: "column",
128
- alignItems: "flex-start",
129
- gap: 2,
102
+ width: 0,
103
+ height: 0,
130
104
  }}
131
105
  >
132
- <CursorPointer color={color} isAgent={other.isAgent} />
106
+ <CursorPointer color={color} />
133
107
  <div
134
108
  style={{
109
+ position: "absolute",
110
+ left: 31,
111
+ top: 31,
135
112
  backgroundColor: color,
136
113
  color: "#fff",
137
- fontSize: 11,
138
- fontWeight: 600,
139
- padding: "1px 5px",
140
- borderRadius: 4,
114
+ fontSize: 12,
115
+ fontWeight: 500,
116
+ lineHeight: "16px",
117
+ padding: "2px 7px",
118
+ borderRadius: 2,
141
119
  whiteSpace: "nowrap",
142
- marginLeft: other.isAgent ? 0 : 4,
143
- boxShadow: "0 1px 3px rgba(0,0,0,0.25)",
120
+ boxShadow: "0 5px 12px rgba(15, 23, 42, 0.16)",
144
121
  maxWidth: 120,
145
122
  overflow: "hidden",
146
123
  textOverflow: "ellipsis",
147
- display: "flex",
148
- alignItems: "center",
149
- gap: 3,
150
124
  }}
151
125
  >
152
- {other.isAgent && (
153
- <IconSparkles
154
- size={9}
155
- stroke={2}
156
- style={{ flexShrink: 0, opacity: 0.85 }}
157
- />
158
- )}
159
126
  {label}
160
127
  </div>
161
128
  </div>