@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
@@ -86,6 +86,7 @@ Default behavior:
86
86
  | `packages/core/src/client/transcription/use-live-transcription.ts` | Web Speech live-transcription hook for recordings |
87
87
  | `packages/core/src/server/transcribe-voice.ts` | Route handler (routes to Builder/Gemini/Groq/Whisper) |
88
88
  | `packages/core/src/transcription/builder-transcription.ts` | Builder proxy transcription client |
89
+ | `packages/core/src/voice/` | Shared voice context pack, prompt, and replacement helpers |
89
90
  | `packages/core/src/secrets/register-framework-secrets.ts` | Framework-level provider key registration |
90
91
 
91
92
  ## Key resolution (server)
@@ -114,6 +115,15 @@ provider. Gemini uses them in the transcription prompt, Builder receives them
114
115
  as transcription/cleanup instructions, and Whisper-compatible providers receive
115
116
  them as provider prompt/context.
116
117
 
118
+ Requests may also include a multipart `voiceContext` JSON field. Parse it with
119
+ `parseVoiceContextPack()` from `@agent-native/core/voice` and pass the resulting
120
+ context through `buildVoiceGuidanceBlock()`; do not hand-roll separate prompt
121
+ formats. The context pack is for bounded snippets, active references, route/page
122
+ metadata, and preferred vocabulary/replacements only. Browser-native and Google
123
+ realtime final text can POST `{ text, provider, instructions, voiceContext }` to
124
+ `/_agent-native/transcribe-voice` when AI cleanup is enabled; batch audio can
125
+ send the same `voiceContext` field with its audio upload.
126
+
117
127
  Never hardcode a shared key. Never log the value. Never echo it back to the
118
128
  client.
119
129
 
@@ -461,6 +461,7 @@ const CORE_CLIENT_SUBPATHS = [
461
461
  "@agent-native/core/client/notifications",
462
462
  "@agent-native/core/client/progress",
463
463
  "@agent-native/core/client/transcription/use-live-transcription",
464
+ "@agent-native/core/voice",
464
465
  ];
465
466
 
466
467
  function getDefaultOptimizeDeps(cwd: string): string[] {
@@ -769,6 +770,7 @@ function getCoreSourceAliases(
769
770
  coreSrc,
770
771
  "client/transcription/use-live-transcription.ts",
771
772
  ),
773
+ "@agent-native/core/voice": path.join(coreSrc, "voice/index.ts"),
772
774
  "@agent-native/core/db": path.join(coreSrc, "db/index.ts"),
773
775
  "@agent-native/core/db/schema": path.join(coreSrc, "db/schema.ts"),
774
776
  "@agent-native/core/shared": path.join(coreSrc, "shared/index.ts"),
@@ -0,0 +1,18 @@
1
+ export type {
2
+ VoiceContextMode,
3
+ VoiceContextPack,
4
+ VoiceContextSnippet,
5
+ VoiceTerm,
6
+ } from "./voice-context.js";
7
+ export {
8
+ formatVoiceContextPackForPrompt,
9
+ parseVoiceContextPack,
10
+ sanitizeVoiceContextPack,
11
+ voiceContextHasContent,
12
+ voiceContextTermsOnly,
13
+ } from "./voice-context.js";
14
+ export { buildVoiceGuidanceBlock } from "./voice-cleanup-prompt.js";
15
+ export {
16
+ applyVoiceContextReplacements,
17
+ applyVoiceTermReplacements,
18
+ } from "./voice-replacements.js";
@@ -0,0 +1,38 @@
1
+ import {
2
+ formatVoiceContextPackForPrompt,
3
+ type VoiceContextPack,
4
+ } from "./voice-context.js";
5
+
6
+ const MAX_CUSTOM_INSTRUCTIONS_CHARS = 4_000;
7
+
8
+ function cleanInstructions(value: string | undefined): string | undefined {
9
+ const trimmed = value?.replace(/\0/g, "").trim();
10
+ if (!trimmed) return undefined;
11
+ return trimmed.slice(0, MAX_CUSTOM_INSTRUCTIONS_CHARS);
12
+ }
13
+
14
+ export function buildVoiceGuidanceBlock({
15
+ instructions,
16
+ contextPack,
17
+ }: {
18
+ instructions?: string;
19
+ contextPack?: VoiceContextPack | null;
20
+ }): string | undefined {
21
+ const customInstructions = cleanInstructions(instructions);
22
+ const formattedContext = formatVoiceContextPackForPrompt(contextPack);
23
+ if (!customInstructions && !formattedContext) return undefined;
24
+
25
+ const sections = [
26
+ "Use the following voice guidance only to improve transcription, cleanup, terminology, casing, punctuation, and formatting.",
27
+ "Never add facts or content that are not present in the audio or transcript.",
28
+ ];
29
+
30
+ if (customInstructions) {
31
+ sections.push(`User instructions:\n${customInstructions}`);
32
+ }
33
+ if (formattedContext) {
34
+ sections.push(`Voice context:\n${formattedContext}`);
35
+ }
36
+
37
+ return sections.join("\n\n");
38
+ }
@@ -0,0 +1,217 @@
1
+ export type VoiceContextMode =
2
+ | "dictation"
3
+ | "cleanup"
4
+ | "transcript"
5
+ | "title"
6
+ | "summary"
7
+ | "meeting";
8
+
9
+ export interface VoiceContextSnippet {
10
+ label: string;
11
+ value: string;
12
+ }
13
+
14
+ export interface VoiceTerm {
15
+ term: string;
16
+ replacement?: string;
17
+ confidence?: number;
18
+ source?: string;
19
+ scope?: string;
20
+ }
21
+
22
+ export interface VoiceContextPack {
23
+ surface?: string;
24
+ mode?: VoiceContextMode | string;
25
+ snippets?: VoiceContextSnippet[];
26
+ terms?: VoiceTerm[];
27
+ metadata?: Record<string, string | number | boolean | null | undefined>;
28
+ }
29
+
30
+ const MAX_CONTEXT_PACK_CHARS = 64_000;
31
+ const MAX_SNIPPETS = 8;
32
+ const MAX_SNIPPET_VALUE_CHARS = 1_800;
33
+ const MAX_TERMS = 80;
34
+ const MAX_TERM_CHARS = 120;
35
+ const MAX_METADATA_KEYS = 12;
36
+ const MAX_METADATA_VALUE_CHARS = 160;
37
+
38
+ function cleanString(value: unknown, maxChars: number): string | undefined {
39
+ if (typeof value !== "string") return undefined;
40
+ const trimmed = value.replace(/\0/g, "").trim();
41
+ if (!trimmed) return undefined;
42
+ return trimmed.slice(0, maxChars);
43
+ }
44
+
45
+ function cleanNumber(value: unknown): number | undefined {
46
+ if (typeof value !== "number" || !Number.isFinite(value)) return undefined;
47
+ return Math.min(1, Math.max(0, value));
48
+ }
49
+
50
+ export function sanitizeVoiceContextPack(
51
+ input: unknown,
52
+ ): VoiceContextPack | undefined {
53
+ if (!input || typeof input !== "object" || Array.isArray(input)) {
54
+ return undefined;
55
+ }
56
+
57
+ const raw = input as VoiceContextPack;
58
+ const surface = cleanString(raw.surface, 80);
59
+ const mode = cleanString(raw.mode, 40);
60
+
61
+ const snippets = Array.isArray(raw.snippets)
62
+ ? raw.snippets
63
+ .slice(0, MAX_SNIPPETS)
64
+ .map((snippet) => {
65
+ if (!snippet || typeof snippet !== "object") return null;
66
+ const candidate = snippet as Partial<VoiceContextSnippet>;
67
+ const label = cleanString(candidate.label, 80);
68
+ const value = cleanString(candidate.value, MAX_SNIPPET_VALUE_CHARS);
69
+ return label && value ? { label, value } : null;
70
+ })
71
+ .filter((snippet): snippet is VoiceContextSnippet => snippet !== null)
72
+ : undefined;
73
+
74
+ const terms = Array.isArray(raw.terms)
75
+ ? raw.terms
76
+ .slice(0, MAX_TERMS)
77
+ .map((term) => {
78
+ if (!term || typeof term !== "object") return null;
79
+ const candidate = term as Partial<VoiceTerm>;
80
+ const rawTerm = cleanString(candidate.term, MAX_TERM_CHARS);
81
+ if (!rawTerm || rawTerm.length < 2) return null;
82
+ const replacement = cleanString(
83
+ candidate.replacement,
84
+ MAX_TERM_CHARS,
85
+ );
86
+ const source = cleanString(candidate.source, 40);
87
+ const scope = cleanString(candidate.scope, 40);
88
+ const confidence = cleanNumber(candidate.confidence);
89
+ return {
90
+ term: rawTerm,
91
+ ...(replacement ? { replacement } : {}),
92
+ ...(confidence !== undefined ? { confidence } : {}),
93
+ ...(source ? { source } : {}),
94
+ ...(scope ? { scope } : {}),
95
+ };
96
+ })
97
+ .filter((term): term is VoiceTerm => term !== null)
98
+ : undefined;
99
+
100
+ const metadata =
101
+ raw.metadata &&
102
+ typeof raw.metadata === "object" &&
103
+ !Array.isArray(raw.metadata)
104
+ ? Object.fromEntries(
105
+ Object.entries(raw.metadata)
106
+ .slice(0, MAX_METADATA_KEYS)
107
+ .flatMap(([key, value]) => {
108
+ const cleanKey = cleanString(key, 60);
109
+ if (!cleanKey) return [];
110
+ if (
111
+ typeof value === "string" ||
112
+ typeof value === "number" ||
113
+ typeof value === "boolean" ||
114
+ value === null
115
+ ) {
116
+ const cleanValue =
117
+ typeof value === "string"
118
+ ? cleanString(value, MAX_METADATA_VALUE_CHARS)
119
+ : value;
120
+ return cleanValue === undefined ? [] : [[cleanKey, cleanValue]];
121
+ }
122
+ return [];
123
+ }),
124
+ )
125
+ : undefined;
126
+
127
+ const pack: VoiceContextPack = {
128
+ ...(surface ? { surface } : {}),
129
+ ...(mode ? { mode } : {}),
130
+ ...(snippets?.length ? { snippets } : {}),
131
+ ...(terms?.length ? { terms } : {}),
132
+ ...(metadata && Object.keys(metadata).length > 0 ? { metadata } : {}),
133
+ };
134
+
135
+ return voiceContextHasContent(pack) ? pack : undefined;
136
+ }
137
+
138
+ export function parseVoiceContextPack(
139
+ value: string,
140
+ ): VoiceContextPack | undefined {
141
+ const trimmed = value.replace(/\0/g, "").trim();
142
+ if (!trimmed || trimmed.length > MAX_CONTEXT_PACK_CHARS) return undefined;
143
+ try {
144
+ return sanitizeVoiceContextPack(JSON.parse(trimmed));
145
+ } catch {
146
+ return undefined;
147
+ }
148
+ }
149
+
150
+ export function voiceContextHasContent(
151
+ pack: VoiceContextPack | undefined,
152
+ ): boolean {
153
+ return Boolean(
154
+ pack?.surface ||
155
+ pack?.mode ||
156
+ pack?.snippets?.length ||
157
+ pack?.terms?.length ||
158
+ (pack?.metadata && Object.keys(pack.metadata).length > 0),
159
+ );
160
+ }
161
+
162
+ export function voiceContextTermsOnly(
163
+ input: unknown,
164
+ ): VoiceContextPack | undefined {
165
+ const pack = sanitizeVoiceContextPack(input);
166
+ if (!pack?.terms?.length) return undefined;
167
+ return { terms: pack.terms };
168
+ }
169
+
170
+ export function formatVoiceContextPackForPrompt(input: unknown): string {
171
+ const pack = sanitizeVoiceContextPack(input);
172
+ if (!pack) return "";
173
+
174
+ const sections: string[] = [];
175
+ if (pack.surface) sections.push(`Surface: ${pack.surface}`);
176
+ if (pack.mode) sections.push(`Mode: ${pack.mode}`);
177
+
178
+ if (pack.snippets?.length) {
179
+ sections.push(
180
+ [
181
+ "Context snippets:",
182
+ ...pack.snippets.map(
183
+ (snippet) => `- ${snippet.label}: ${snippet.value}`,
184
+ ),
185
+ ].join("\n"),
186
+ );
187
+ }
188
+
189
+ if (pack.terms?.length) {
190
+ sections.push(
191
+ [
192
+ "Preferred vocabulary and casing:",
193
+ ...pack.terms.map((term) => {
194
+ const replacement =
195
+ term.replacement && term.replacement !== term.term
196
+ ? ` -> ${term.replacement}`
197
+ : "";
198
+ const source = term.source ? ` (${term.source})` : "";
199
+ return `- ${term.term}${replacement}${source}`;
200
+ }),
201
+ ].join("\n"),
202
+ );
203
+ }
204
+
205
+ if (pack.metadata && Object.keys(pack.metadata).length > 0) {
206
+ sections.push(
207
+ [
208
+ "Metadata:",
209
+ ...Object.entries(pack.metadata).map(([key, value]) => {
210
+ return `- ${key}: ${String(value)}`;
211
+ }),
212
+ ].join("\n"),
213
+ );
214
+ }
215
+
216
+ return sections.join("\n\n");
217
+ }
@@ -0,0 +1,75 @@
1
+ import {
2
+ sanitizeVoiceContextPack,
3
+ type VoiceContextPack,
4
+ type VoiceTerm,
5
+ } from "./voice-context.js";
6
+
7
+ function escapeRegExp(value: string): string {
8
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
9
+ }
10
+
11
+ function isAlphaNumeric(value: string | undefined): boolean {
12
+ return value != null && /[\p{L}\p{N}_]/u.test(value);
13
+ }
14
+
15
+ function isSafeVoiceReplacementBoundary(
16
+ text: string,
17
+ index: number,
18
+ direction: "before" | "after",
19
+ ): boolean {
20
+ const char = text[index];
21
+ if (char == null) return true;
22
+ if (isAlphaNumeric(char)) return false;
23
+ if (char === "@" || char === "/" || char === "\\" || char === ":") {
24
+ return false;
25
+ }
26
+ if (char === "." || char === "-" || char === "+") {
27
+ const neighbor = direction === "before" ? text[index - 1] : text[index + 1];
28
+ return !isAlphaNumeric(neighbor);
29
+ }
30
+ return true;
31
+ }
32
+
33
+ export function applyVoiceTermReplacements(
34
+ text: string,
35
+ terms: readonly VoiceTerm[] | undefined,
36
+ ): string {
37
+ if (!text || !terms?.length) return text;
38
+
39
+ let next = text;
40
+ const replacements = terms
41
+ .filter(
42
+ (term) =>
43
+ term.term.trim().length >= 2 &&
44
+ term.replacement?.trim() &&
45
+ term.replacement.trim() !== term.term.trim(),
46
+ )
47
+ .sort((a, b) => b.term.length - a.term.length);
48
+
49
+ for (const term of replacements) {
50
+ const source = escapeRegExp(term.term.trim());
51
+ const replacement = term.replacement?.trim() ?? "";
52
+ const pattern = new RegExp(source, "giu");
53
+ next = next.replace(pattern, (match, offset: number) => {
54
+ const start = offset;
55
+ const end = offset + match.length;
56
+ if (
57
+ !isSafeVoiceReplacementBoundary(next, start - 1, "before") ||
58
+ !isSafeVoiceReplacementBoundary(next, end, "after")
59
+ ) {
60
+ return match;
61
+ }
62
+ return replacement;
63
+ });
64
+ }
65
+
66
+ return next;
67
+ }
68
+
69
+ export function applyVoiceContextReplacements(
70
+ text: string,
71
+ contextPack: VoiceContextPack | undefined,
72
+ ): string {
73
+ const pack = sanitizeVoiceContextPack(contextPack);
74
+ return applyVoiceTermReplacements(text, pack?.terms);
75
+ }
@@ -113,9 +113,10 @@ details live in `.agents/skills/`.
113
113
 
114
114
  ## Session Replay
115
115
 
116
- - `/sessions` lists scoped first-party session recordings. Filters live in the
117
- URL (`range`, `app`, `q`) and are mirrored through application state so
118
- the agent sees the same list the user sees.
116
+ - `/sessions` lists scoped, signed-in first-party session recordings with an
117
+ email-backed visitor identity and playable replay events. Filters live in the
118
+ URL (`range`, `app`, `q`) and are mirrored through application state so the
119
+ agent sees the same list the user sees.
119
120
  - `/sessions/:recordingId` loads summary/timeline data through
120
121
  `get-session-replay-summary` and fetches rrweb payloads only through scoped
121
122
  chunk routes. Do not expose storage/provider URLs, raw chunk table access, or
@@ -27,7 +27,12 @@ export default defineAction({
27
27
  template: z.string().optional().describe("Optional template filter"),
28
28
  sessionId: z.string().optional().describe("Optional analytics session id"),
29
29
  userId: z.string().optional().describe("Optional signed-in user email"),
30
- anonymousId: z.string().optional().describe("Optional anonymous user id"),
30
+ anonymousId: z
31
+ .string()
32
+ .optional()
33
+ .describe(
34
+ "Optional secondary anonymous id filter for otherwise email-backed recordings",
35
+ ),
31
36
  path: z.string().optional().describe("Optional exact path filter"),
32
37
  from: z
33
38
  .string()