@agent-native/core 0.79.27 → 0.80.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (497) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +34 -0
  3. package/corpus/core/docs/content/locales/ar-SA/skills-guide.mdx +5 -0
  4. package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +55 -1
  5. package/corpus/core/docs/content/locales/de-DE/skills-guide.mdx +5 -0
  6. package/corpus/core/docs/content/locales/de-DE/template-design.mdx +66 -1
  7. package/corpus/core/docs/content/locales/es-ES/skills-guide.mdx +5 -0
  8. package/corpus/core/docs/content/locales/es-ES/template-design.mdx +65 -1
  9. package/corpus/core/docs/content/locales/fr-FR/skills-guide.mdx +5 -0
  10. package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +64 -1
  11. package/corpus/core/docs/content/locales/hi-IN/skills-guide.mdx +5 -0
  12. package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +59 -1
  13. package/corpus/core/docs/content/locales/ja-JP/skills-guide.mdx +5 -0
  14. package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +62 -1
  15. package/corpus/core/docs/content/locales/ko-KR/skills-guide.mdx +5 -0
  16. package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +58 -1
  17. package/corpus/core/docs/content/locales/pt-BR/skills-guide.mdx +5 -0
  18. package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +62 -1
  19. package/corpus/core/docs/content/locales/zh-CN/skills-guide.mdx +5 -0
  20. package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +50 -1
  21. package/corpus/core/docs/content/locales/zh-TW/skills-guide.mdx +5 -0
  22. package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +52 -1
  23. package/corpus/core/docs/content/skills-guide.mdx +5 -0
  24. package/corpus/core/docs/content/template-design.mdx +59 -1
  25. package/corpus/core/package.json +2 -1
  26. package/corpus/core/src/agent/engine/index.ts +1 -0
  27. package/corpus/core/src/agent/engine/registry.ts +40 -0
  28. package/corpus/core/src/agent/production-agent.ts +6 -2
  29. package/corpus/core/src/application-state/handlers.ts +1 -1
  30. package/corpus/core/src/brand-kit/index.ts +1 -1
  31. package/corpus/core/src/cli/design-connect.ts +490 -0
  32. package/corpus/core/src/cli/index.ts +16 -0
  33. package/corpus/core/src/cli/skills.ts +144 -3
  34. package/corpus/core/src/client/AgentPanel.tsx +1 -1
  35. package/corpus/core/src/client/AssistantChat.tsx +43 -7
  36. package/corpus/core/src/client/MultiTabAssistantChat.tsx +1 -1
  37. package/corpus/core/src/client/agent-chat.ts +27 -3
  38. package/corpus/core/src/client/blocks/library/MermaidBlock.tsx +1 -1
  39. package/corpus/core/src/client/blocks/library/diagram.tsx +2 -2
  40. package/corpus/core/src/client/blocks/library/wireframe.tsx +1 -1
  41. package/corpus/core/src/client/chat/message-components.tsx +1 -1
  42. package/corpus/core/src/client/chat-model-groups.ts +1 -2
  43. package/corpus/core/src/client/components/LiveCursorOverlay.tsx +33 -66
  44. package/corpus/core/src/client/composer/TiptapComposer.tsx +99 -24
  45. package/corpus/core/src/client/composer/useVoiceDictation.ts +429 -260
  46. package/corpus/core/src/client/extensions/portable-extension.ts +1 -1
  47. package/corpus/core/src/client/frame-protocol.ts +17 -2
  48. package/corpus/core/src/client/rich-markdown-editor/RegistryBlockNode.tsx +2 -2
  49. package/corpus/core/src/client/sharing/ShareButton.tsx +20 -15
  50. package/corpus/core/src/client/use-agent-engine-configured.ts +80 -28
  51. package/corpus/core/src/code-agents/transcript-normalizer.ts +1 -1
  52. package/corpus/core/src/extensions/path.ts +1 -4
  53. package/corpus/core/src/integrations/a2a-continuation-processor.ts +1 -1
  54. package/corpus/core/src/mcp/build-server.ts +1 -1
  55. package/corpus/core/src/org/handlers.ts +5 -5
  56. package/corpus/core/src/org/plugin.ts +2 -2
  57. package/corpus/core/src/scripts/call-agent.ts +1 -1
  58. package/corpus/core/src/scripts/db/safety.ts +1 -1
  59. package/corpus/core/src/server/auth.ts +3 -0
  60. package/corpus/core/src/server/builder-design-systems.ts +308 -0
  61. package/corpus/core/src/server/core-routes-plugin.ts +29 -3
  62. package/corpus/core/src/server/index.ts +8 -0
  63. package/corpus/core/src/server/transcribe-voice.ts +57 -22
  64. package/corpus/core/src/shared/mcp-embed-headers.ts +23 -1
  65. package/corpus/core/src/styles/agent-native.css +60 -4
  66. package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
  67. package/corpus/core/src/usage/store.ts +2 -2
  68. package/corpus/core/src/vite/client.ts +2 -0
  69. package/corpus/core/src/voice/index.ts +18 -0
  70. package/corpus/core/src/voice/voice-cleanup-prompt.ts +38 -0
  71. package/corpus/core/src/voice/voice-context.ts +217 -0
  72. package/corpus/core/src/voice/voice-replacements.ts +75 -0
  73. package/corpus/templates/analytics/AGENTS.md +4 -3
  74. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +298 -15
  75. package/corpus/templates/analytics/actions/get-sql-dashboard.ts +9 -4
  76. package/corpus/templates/analytics/actions/list-session-recordings.ts +6 -1
  77. package/corpus/templates/analytics/actions/mutate-dashboard.ts +18 -2
  78. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +12 -2
  79. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +557 -400
  80. package/corpus/templates/analytics/app/global.css +0 -4
  81. package/corpus/templates/analytics/app/hooks/use-replay-storage-status.ts +66 -0
  82. package/corpus/templates/analytics/app/i18n/zh-TW.ts +39 -0
  83. package/corpus/templates/analytics/app/i18n-data.ts +424 -0
  84. package/corpus/templates/analytics/app/pages/Settings.tsx +333 -0
  85. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +2 -1
  86. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/dashboard-layout.ts +121 -3
  87. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +82 -34
  88. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +7 -0
  89. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +144 -36
  90. package/corpus/templates/analytics/changelog/2026-06-28-ask-tab-now-matches-the-darker-app-background.md +6 -0
  91. package/corpus/templates/analytics/changelog/2026-06-28-dashboard-email-reports-now-use-cleaner-light-mode-snapshots.md +6 -0
  92. package/corpus/templates/analytics/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  93. package/corpus/templates/analytics/changelog/2026-06-28-sessions-now-show-only-signed-in-recordings-with-playable-re.md +6 -0
  94. package/corpus/templates/analytics/changelog/2026-06-29-analytics-agents-can-now-place-new-charts-into-requested-das.md +6 -0
  95. package/corpus/templates/analytics/changelog/2026-06-29-analytics-queries-now-report-failed-source-query-errors-inst.md +6 -0
  96. package/corpus/templates/analytics/changelog/2026-06-29-charts-can-now-be-dropped-between-full-dashboard-rows-to-cre.md +6 -0
  97. package/corpus/templates/analytics/changelog/2026-06-29-dashboard-email-reports-include-the-full-dashboard-image-wit.md +6 -0
  98. package/corpus/templates/analytics/changelog/2026-06-29-main-surface-border-reaches-the-top.md +6 -0
  99. package/corpus/templates/analytics/changelog/2026-06-29-session-replay-now-records-playable-sessions-in-production-a.md +6 -0
  100. package/corpus/templates/analytics/changelog/2026-06-29-set-up-session-replay-storage-from-settings-connect-builder-.md +6 -0
  101. package/corpus/templates/analytics/scripts/cleanup-empty-session-recordings.ts +102 -0
  102. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +3 -3
  103. package/corpus/templates/analytics/server/lib/dashboard-report.ts +75 -30
  104. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +5 -2
  105. package/corpus/templates/analytics/server/lib/real-data-actions.ts +81 -20
  106. package/corpus/templates/analytics/server/lib/replay-storage.ts +79 -0
  107. package/corpus/templates/analytics/server/lib/s3-upload-provider.ts +255 -0
  108. package/corpus/templates/analytics/server/lib/session-replay.ts +53 -12
  109. package/corpus/templates/analytics/server/plugins/agent-chat.ts +11 -2
  110. package/corpus/templates/analytics/server/plugins/onboarding.ts +97 -0
  111. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +4 -4
  112. package/corpus/templates/assets/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  113. package/corpus/templates/brain/app/components/layout/Layout.tsx +29 -2
  114. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +131 -42
  115. package/corpus/templates/brain/app/i18n/zh-TW.ts +2 -0
  116. package/corpus/templates/brain/app/i18n-data.ts +20 -0
  117. package/corpus/templates/brain/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  118. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +29 -1
  119. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +417 -299
  120. package/corpus/templates/calendar/app/i18n/zh-TW.ts +2 -0
  121. package/corpus/templates/calendar/app/i18n-data.ts +20 -0
  122. package/corpus/templates/calendar/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  123. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +6 -19
  124. package/corpus/templates/chat/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  125. package/corpus/templates/clips/AGENTS.md +4 -0
  126. package/corpus/templates/clips/actions/cleanup-transcript.ts +39 -9
  127. package/corpus/templates/clips/actions/finalize-meeting.ts +81 -12
  128. package/corpus/templates/clips/actions/lib/agents-md-context.ts +4 -1
  129. package/corpus/templates/clips/app/components/library/library-layout.tsx +3 -3
  130. package/corpus/templates/clips/app/components/meetings/share-meeting-dialog.tsx +1 -1
  131. package/corpus/templates/clips/app/components/player/share-dialog.tsx +2 -2
  132. package/corpus/templates/clips/changelog/2026-06-28-left-sidebar-footer-controls-use-less-divider-chrome.md +6 -0
  133. package/corpus/templates/clips/desktop/src/lib/personal-vocabulary.ts +13 -8
  134. package/corpus/templates/clips/desktop/src/lib/recorder.ts +24 -0
  135. package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +105 -5
  136. package/corpus/templates/clips/desktop/src/lib/voice-dictation.ts +60 -1
  137. package/corpus/templates/content/actions/set-image-alt-text.ts +1 -1
  138. package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +1 -1
  139. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +1 -1
  140. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +5 -5
  141. package/corpus/templates/content/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  142. package/corpus/templates/content/shared/document-export.ts +1 -1
  143. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -18
  144. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +154 -0
  145. package/corpus/templates/design/AGENTS.md +95 -5
  146. package/corpus/templates/design/DESIGN.md +82 -0
  147. package/corpus/templates/design/DEVELOPING.md +43 -0
  148. package/corpus/templates/design/actions/add-localhost-screens.ts +453 -0
  149. package/corpus/templates/design/actions/apply-shader.ts +277 -0
  150. package/corpus/templates/design/actions/apply-visual-edit.ts +303 -0
  151. package/corpus/templates/design/actions/connect-localhost.ts +183 -0
  152. package/corpus/templates/design/actions/edit-design.ts +195 -42
  153. package/corpus/templates/design/actions/generate-design.ts +71 -1
  154. package/corpus/templates/design/actions/generate-screens.ts +193 -0
  155. package/corpus/templates/design/actions/get-code-layer-projection.ts +191 -0
  156. package/corpus/templates/design/actions/get-shader.ts +119 -0
  157. package/corpus/templates/design/actions/index-design-system-with-builder.ts +259 -0
  158. package/corpus/templates/design/actions/list-localhost-connections.ts +95 -0
  159. package/corpus/templates/design/actions/navigate.ts +55 -2
  160. package/corpus/templates/design/actions/update-file.ts +9 -2
  161. package/corpus/templates/design/actions/view-screen.ts +68 -1
  162. package/corpus/templates/design/agent-native.app-skill.json +10 -0
  163. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +719 -0
  164. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +2120 -103
  165. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +74 -38
  166. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +401 -0
  167. package/corpus/templates/design/app/components/design/EditPanel.tsx +3966 -440
  168. package/corpus/templates/design/app/components/design/LayersPanel.tsx +1473 -0
  169. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +3940 -147
  170. package/corpus/templates/design/app/components/design/QuestionFlow.tsx +700 -13
  171. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +105 -63
  172. package/corpus/templates/design/app/components/design/index.ts +0 -5
  173. package/corpus/templates/design/app/components/design/inspector/AlignmentMatrix.tsx +353 -0
  174. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +1589 -0
  175. package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +511 -0
  176. package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +395 -0
  177. package/corpus/templates/design/app/components/design/inspector/FigmaColorPicker.tsx +2010 -0
  178. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +601 -0
  179. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +242 -0
  180. package/corpus/templates/design/app/components/design/inspector/SHADER_INTEGRATION.md +420 -0
  181. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +238 -0
  182. package/corpus/templates/design/app/components/design/inspector/ShaderControls.stories.tsx +71 -0
  183. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +575 -0
  184. package/corpus/templates/design/app/components/design/inspector/ShaderEffectRow.tsx +106 -0
  185. package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +423 -0
  186. package/corpus/templates/design/app/components/design/inspector/figma-icons.tsx +741 -0
  187. package/corpus/templates/design/app/components/design/inspector/index.ts +87 -0
  188. package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +201 -0
  189. package/corpus/templates/design/app/components/design/types.ts +23 -0
  190. package/corpus/templates/design/app/components/layout/Layout.tsx +24 -13
  191. package/corpus/templates/design/app/components/layout/Sidebar.tsx +4 -4
  192. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +474 -36
  193. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +22 -5
  194. package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +24 -11
  195. package/corpus/templates/design/app/global.css +149 -5
  196. package/corpus/templates/design/app/hooks/use-agent-generating.ts +4 -0
  197. package/corpus/templates/design/app/hooks/use-navigation-state.ts +130 -8
  198. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +329 -0
  199. package/corpus/templates/design/app/i18n/zh-TW.ts +277 -0
  200. package/corpus/templates/design/app/i18n-data.ts +3028 -1
  201. package/corpus/templates/design/app/pages/DesignEditor.tsx +5831 -904
  202. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +57 -221
  203. package/corpus/templates/design/changelog/2026-06-28-annotate-mode-now-combines-drawing-and-comment-pins-in-one-c.md +6 -0
  204. package/corpus/templates/design/changelog/2026-06-28-design-editor-panel-borders-are-cleaner-so-the-canvas-edge-s.md +6 -0
  205. package/corpus/templates/design/changelog/2026-06-28-drawing-prompts-now-reliably-open-and-submit-to-the-design-a.md +6 -0
  206. package/corpus/templates/design/changelog/2026-06-28-editor-app-menus-now-use-an-outline-agent-native-mark-with-b.md +6 -0
  207. package/corpus/templates/design/changelog/2026-06-28-figma-style-code-design-mode.md +6 -0
  208. package/corpus/templates/design/changelog/2026-06-28-layer-selection-now-updates-chat-context-without-opening-the.md +6 -0
  209. package/corpus/templates/design/changelog/2026-06-28-layer-selections-now-preserve-hidden-and-locked-canvas-state.md +6 -0
  210. package/corpus/templates/design/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  211. package/corpus/templates/design/changelog/2026-06-28-live-cursors-now-keep-names-beside-a-cleaner-pointer-marker.md +6 -0
  212. package/corpus/templates/design/changelog/2026-06-28-mode-switching-now-lives-in-a-compact-bottom-right-icon-dock.md +6 -0
  213. package/corpus/templates/design/changelog/2026-06-28-screen-overview-now-handles-zooming-drawing-opening-and-dele.md +6 -0
  214. package/corpus/templates/design/changelog/2026-06-28-screen-overview-now-selects-screens-on-click-and-opens-them-.md +6 -0
  215. package/corpus/templates/design/changelog/2026-06-28-screen-overview-zooms-into-the-active-screen-with-smoother-e.md +6 -0
  216. package/corpus/templates/design/changelog/2026-06-28-selected-element-chips-in-chat-are-shorter-and-easier-to-sca.md +6 -0
  217. package/corpus/templates/design/changelog/2026-06-28-the-design-editor-toolbar-is-more-compact-and-the-app-menu-m.md +6 -0
  218. package/corpus/templates/design/changelog/2026-06-28-tweaks-now-live-at-the-top-of-the-design-sidebar-instead-of-.md +6 -0
  219. package/corpus/templates/design/changelog/2026-06-28-tweaks-now-live-in-the-right-inspector-beside-the-design-tab.md +6 -0
  220. package/corpus/templates/design/changelog/2026-06-29-active-sidebar-rows-use-soft-highlights.md +6 -0
  221. package/corpus/templates/design/changelog/2026-06-29-agents-can-now-open-screen-overview-focus-screens-and-add.md +6 -0
  222. package/corpus/templates/design/changelog/2026-06-29-canvas-selection-no-longer-flashes-broken-prototype-html-whe.md +6 -0
  223. package/corpus/templates/design/changelog/2026-06-29-command-menu-selections-are-clearer-in-dark-mode.md +6 -0
  224. package/corpus/templates/design/changelog/2026-06-29-design-agents-now-edit-broad-copy-changes-more-reliably.md +6 -0
  225. package/corpus/templates/design/changelog/2026-06-29-design-editor-extensions-now-run-inline-beside-the-artboard.md +6 -0
  226. package/corpus/templates/design/changelog/2026-06-29-design-mode-top-chrome-now-groups-collaborators-preview-shar.md +6 -0
  227. package/corpus/templates/design/changelog/2026-06-29-element-selection-now-stays-on-the-intended-layer-after-sele.md +6 -0
  228. package/corpus/templates/design/changelog/2026-06-29-screen-overview-full-view-controls-now-sit-above-frames-inst.md +6 -0
  229. package/corpus/templates/design/changelog/2026-06-29-screen-overview-tools-can-draw-shapes-create-screens-and-kee.md +6 -0
  230. package/corpus/templates/design/changelog/2026-06-29-sidebars-use-darker-chrome-and-chat-warns-immediately.md +6 -0
  231. package/corpus/templates/design/changelog/2026-06-29-the-pen-tool-now-creates-anchor-based-bezier-vectors-with-ha.md +6 -0
  232. package/corpus/templates/design/changelog/2026-06-29-visual-edit-can-open-localhost-routes-as-url-backed-screens.md +6 -0
  233. package/corpus/templates/design/package.json +1 -0
  234. package/corpus/templates/design/server/db/schema.ts +26 -0
  235. package/corpus/templates/design/server/handlers/import-figma-system.ts +38 -85
  236. package/corpus/templates/design/server/lib/design-snapshot.ts +9 -1
  237. package/corpus/templates/design/server/plugins/agent-chat.ts +3 -0
  238. package/corpus/templates/design/shared/api.ts +27 -0
  239. package/corpus/templates/design/shared/canvas-frames.ts +103 -0
  240. package/corpus/templates/design/shared/canvas-math.ts +1058 -0
  241. package/corpus/templates/design/shared/code-layer.ts +2412 -0
  242. package/corpus/templates/design/shared/color-utils.ts +180 -0
  243. package/corpus/templates/design/shared/generation-session.ts +61 -0
  244. package/corpus/templates/design/shared/html-content.ts +21 -0
  245. package/corpus/templates/design/shared/pen-path.ts +207 -0
  246. package/corpus/templates/design/shared/shader-presets.ts +782 -0
  247. package/corpus/templates/design/shared/shader-safety.ts +137 -0
  248. package/corpus/templates/design/shared/source-mode.ts +237 -0
  249. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +149 -6
  250. package/corpus/templates/forms/app/i18n/ar-SA.ts +2 -0
  251. package/corpus/templates/forms/app/i18n/de-DE.ts +2 -0
  252. package/corpus/templates/forms/app/i18n/en-US.ts +2 -0
  253. package/corpus/templates/forms/app/i18n/es-ES.ts +2 -0
  254. package/corpus/templates/forms/app/i18n/fr-FR.ts +2 -0
  255. package/corpus/templates/forms/app/i18n/hi-IN.ts +2 -0
  256. package/corpus/templates/forms/app/i18n/ja-JP.ts +2 -0
  257. package/corpus/templates/forms/app/i18n/ko-KR.ts +2 -0
  258. package/corpus/templates/forms/app/i18n/pt-BR.ts +2 -0
  259. package/corpus/templates/forms/app/i18n/zh-CN.ts +2 -0
  260. package/corpus/templates/forms/app/i18n/zh-TW.ts +2 -0
  261. package/corpus/templates/forms/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  262. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +2 -2
  263. package/corpus/templates/macros/changelog/2026-06-28-left-sidebar-footer-controls-use-less-divider-chrome.md +6 -0
  264. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +408 -247
  265. package/corpus/templates/mail/app/i18n/ar-SA.ts +4 -0
  266. package/corpus/templates/mail/app/i18n/de-DE.ts +4 -0
  267. package/corpus/templates/mail/app/i18n/en-US.ts +4 -0
  268. package/corpus/templates/mail/app/i18n/es-ES.ts +4 -0
  269. package/corpus/templates/mail/app/i18n/fr-FR.ts +4 -0
  270. package/corpus/templates/mail/app/i18n/hi-IN.ts +4 -0
  271. package/corpus/templates/mail/app/i18n/ja-JP.ts +4 -0
  272. package/corpus/templates/mail/app/i18n/ko-KR.ts +4 -0
  273. package/corpus/templates/mail/app/i18n/pt-BR.ts +4 -0
  274. package/corpus/templates/mail/app/i18n/zh-CN.ts +4 -0
  275. package/corpus/templates/mail/app/i18n/zh-TW.ts +4 -0
  276. package/corpus/templates/mail/app/lib/utils.ts +2 -2
  277. package/corpus/templates/mail/changelog/2026-06-28-pinned-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  278. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +6 -8
  279. package/corpus/templates/plan/app/components/plan/wireframe/Wireframe.tsx +1 -1
  280. package/corpus/templates/plan/app/global.css +61 -78
  281. package/corpus/templates/plan/app/pages/PlansPage.tsx +8 -0
  282. package/corpus/templates/plan/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  283. package/corpus/templates/plan/changelog/2026-06-28-plans-use-the-shared-neutral-light-and-dark-theme.md +6 -0
  284. package/corpus/templates/plan/changelog/2026-06-28-sending-open-feedback-from-a-plan-now-opens-the-inline-plan-.md +6 -0
  285. package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +9 -10
  286. package/corpus/templates/slides/AGENTS.md +3 -2
  287. package/corpus/templates/slides/actions/import-file.ts +26 -17
  288. package/corpus/templates/slides/actions/index-design-system-with-builder.ts +259 -0
  289. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +35 -167
  290. package/corpus/templates/slides/app/components/design-system/fig-import-response.ts +9 -13
  291. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +5 -5
  292. package/corpus/templates/slides/app/context/DeckContext.tsx +1 -1
  293. package/corpus/templates/slides/app/i18n/ar-SA.ts +9 -37
  294. package/corpus/templates/slides/app/i18n/de-DE.ts +10 -25
  295. package/corpus/templates/slides/app/i18n/en-US.ts +9 -26
  296. package/corpus/templates/slides/app/i18n/es-ES.ts +10 -28
  297. package/corpus/templates/slides/app/i18n/fr-FR.ts +10 -28
  298. package/corpus/templates/slides/app/i18n/hi-IN.ts +9 -26
  299. package/corpus/templates/slides/app/i18n/ja-JP.ts +10 -22
  300. package/corpus/templates/slides/app/i18n/ko-KR.ts +9 -23
  301. package/corpus/templates/slides/app/i18n/pt-BR.ts +10 -28
  302. package/corpus/templates/slides/app/i18n/zh-CN.ts +9 -22
  303. package/corpus/templates/slides/app/i18n/zh-TW.ts +9 -22
  304. package/corpus/templates/slides/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  305. package/corpus/templates/slides/server/handlers/import-figma-system.ts +44 -12
  306. package/corpus/templates/slides/server/lib/chat-attachments.ts +1 -1
  307. package/corpus/templates/videos/app/components/NewCompositionPopover.tsx +1 -1
  308. package/corpus/templates/videos/app/components/Sidebar.tsx +2 -2
  309. package/corpus/templates/videos/app/components/layout/Layout.tsx +29 -2
  310. package/corpus/templates/videos/app/components/layout/NavSidebar.tsx +113 -30
  311. package/corpus/templates/videos/app/i18n/ar-SA.ts +2 -0
  312. package/corpus/templates/videos/app/i18n/de-DE.ts +2 -0
  313. package/corpus/templates/videos/app/i18n/en-US.ts +2 -0
  314. package/corpus/templates/videos/app/i18n/es-ES.ts +2 -0
  315. package/corpus/templates/videos/app/i18n/fr-FR.ts +2 -0
  316. package/corpus/templates/videos/app/i18n/hi-IN.ts +2 -0
  317. package/corpus/templates/videos/app/i18n/ja-JP.ts +2 -0
  318. package/corpus/templates/videos/app/i18n/ko-KR.ts +2 -0
  319. package/corpus/templates/videos/app/i18n/pt-BR.ts +2 -0
  320. package/corpus/templates/videos/app/i18n/zh-CN.ts +2 -0
  321. package/corpus/templates/videos/app/i18n/zh-TW.ts +2 -0
  322. package/corpus/templates/videos/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  323. package/dist/agent/engine/index.d.ts +1 -1
  324. package/dist/agent/engine/index.d.ts.map +1 -1
  325. package/dist/agent/engine/index.js +1 -1
  326. package/dist/agent/engine/index.js.map +1 -1
  327. package/dist/agent/engine/registry.d.ts +9 -0
  328. package/dist/agent/engine/registry.d.ts.map +1 -1
  329. package/dist/agent/engine/registry.js +37 -0
  330. package/dist/agent/engine/registry.js.map +1 -1
  331. package/dist/agent/production-agent.d.ts.map +1 -1
  332. package/dist/agent/production-agent.js +4 -3
  333. package/dist/agent/production-agent.js.map +1 -1
  334. package/dist/application-state/handlers.js +1 -1
  335. package/dist/application-state/handlers.js.map +1 -1
  336. package/dist/brand-kit/index.d.ts +1 -1
  337. package/dist/brand-kit/index.js +1 -1
  338. package/dist/brand-kit/index.js.map +1 -1
  339. package/dist/cli/design-connect.d.ts +52 -0
  340. package/dist/cli/design-connect.d.ts.map +1 -0
  341. package/dist/cli/design-connect.js +409 -0
  342. package/dist/cli/design-connect.js.map +1 -0
  343. package/dist/cli/index.js +15 -0
  344. package/dist/cli/index.js.map +1 -1
  345. package/dist/cli/skills.d.ts +3 -0
  346. package/dist/cli/skills.d.ts.map +1 -1
  347. package/dist/cli/skills.js +139 -3
  348. package/dist/cli/skills.js.map +1 -1
  349. package/dist/client/AgentPanel.js +1 -1
  350. package/dist/client/AgentPanel.js.map +1 -1
  351. package/dist/client/AssistantChat.d.ts.map +1 -1
  352. package/dist/client/AssistantChat.js +38 -8
  353. package/dist/client/AssistantChat.js.map +1 -1
  354. package/dist/client/MultiTabAssistantChat.js +1 -1
  355. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  356. package/dist/client/agent-chat.d.ts +6 -0
  357. package/dist/client/agent-chat.d.ts.map +1 -1
  358. package/dist/client/agent-chat.js +17 -3
  359. package/dist/client/agent-chat.js.map +1 -1
  360. package/dist/client/blocks/library/MermaidBlock.js +1 -1
  361. package/dist/client/blocks/library/MermaidBlock.js.map +1 -1
  362. package/dist/client/blocks/library/diagram.js +1 -1
  363. package/dist/client/blocks/library/diagram.js.map +1 -1
  364. package/dist/client/blocks/library/wireframe.js +1 -1
  365. package/dist/client/blocks/library/wireframe.js.map +1 -1
  366. package/dist/client/chat/message-components.js +1 -1
  367. package/dist/client/chat/message-components.js.map +1 -1
  368. package/dist/client/chat-model-groups.d.ts.map +1 -1
  369. package/dist/client/chat-model-groups.js +1 -2
  370. package/dist/client/chat-model-groups.js.map +1 -1
  371. package/dist/client/components/LiveCursorOverlay.d.ts +1 -2
  372. package/dist/client/components/LiveCursorOverlay.d.ts.map +1 -1
  373. package/dist/client/components/LiveCursorOverlay.js +19 -40
  374. package/dist/client/components/LiveCursorOverlay.js.map +1 -1
  375. package/dist/client/composer/TiptapComposer.d.ts +3 -1
  376. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  377. package/dist/client/composer/TiptapComposer.js +86 -24
  378. package/dist/client/composer/TiptapComposer.js.map +1 -1
  379. package/dist/client/composer/useVoiceDictation.d.ts +9 -0
  380. package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
  381. package/dist/client/composer/useVoiceDictation.js +154 -32
  382. package/dist/client/composer/useVoiceDictation.js.map +1 -1
  383. package/dist/client/extensions/portable-extension.d.ts +1 -1
  384. package/dist/client/extensions/portable-extension.d.ts.map +1 -1
  385. package/dist/client/extensions/portable-extension.js.map +1 -1
  386. package/dist/client/frame-protocol.d.ts +17 -2
  387. package/dist/client/frame-protocol.d.ts.map +1 -1
  388. package/dist/client/frame-protocol.js.map +1 -1
  389. package/dist/client/rich-markdown-editor/RegistryBlockNode.js +2 -2
  390. package/dist/client/rich-markdown-editor/RegistryBlockNode.js.map +1 -1
  391. package/dist/client/sharing/ShareButton.d.ts +2 -0
  392. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  393. package/dist/client/sharing/ShareButton.js +7 -6
  394. package/dist/client/sharing/ShareButton.js.map +1 -1
  395. package/dist/client/use-agent-engine-configured.d.ts +5 -0
  396. package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
  397. package/dist/client/use-agent-engine-configured.js +51 -25
  398. package/dist/client/use-agent-engine-configured.js.map +1 -1
  399. package/dist/code-agents/transcript-normalizer.js +1 -1
  400. package/dist/code-agents/transcript-normalizer.js.map +1 -1
  401. package/dist/collab/routes.d.ts +1 -1
  402. package/dist/extensions/path.d.ts +1 -1
  403. package/dist/extensions/path.d.ts.map +1 -1
  404. package/dist/extensions/path.js.map +1 -1
  405. package/dist/file-upload/actions/upload-image.d.ts +2 -2
  406. package/dist/integrations/a2a-continuation-processor.js +1 -1
  407. package/dist/integrations/a2a-continuation-processor.js.map +1 -1
  408. package/dist/mcp/build-server.d.ts +1 -1
  409. package/dist/mcp/build-server.d.ts.map +1 -1
  410. package/dist/mcp/build-server.js.map +1 -1
  411. package/dist/notifications/routes.d.ts +3 -3
  412. package/dist/observability/routes.d.ts +5 -5
  413. package/dist/org/handlers.js +5 -5
  414. package/dist/org/handlers.js.map +1 -1
  415. package/dist/org/plugin.js +2 -2
  416. package/dist/org/plugin.js.map +1 -1
  417. package/dist/scripts/call-agent.js +1 -1
  418. package/dist/scripts/call-agent.js.map +1 -1
  419. package/dist/scripts/db/safety.js +1 -1
  420. package/dist/scripts/db/safety.js.map +1 -1
  421. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  422. package/dist/server/auth.d.ts.map +1 -1
  423. package/dist/server/auth.js +3 -0
  424. package/dist/server/auth.js.map +1 -1
  425. package/dist/server/builder-design-systems.d.ts +28 -0
  426. package/dist/server/builder-design-systems.d.ts.map +1 -0
  427. package/dist/server/builder-design-systems.js +217 -0
  428. package/dist/server/builder-design-systems.js.map +1 -0
  429. package/dist/server/core-routes-plugin.d.ts +1 -0
  430. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  431. package/dist/server/core-routes-plugin.js +20 -3
  432. package/dist/server/core-routes-plugin.js.map +1 -1
  433. package/dist/server/index.d.ts +1 -0
  434. package/dist/server/index.d.ts.map +1 -1
  435. package/dist/server/index.js +1 -0
  436. package/dist/server/index.js.map +1 -1
  437. package/dist/server/transcribe-voice.d.ts +1 -1
  438. package/dist/server/transcribe-voice.d.ts.map +1 -1
  439. package/dist/server/transcribe-voice.js +40 -24
  440. package/dist/server/transcribe-voice.js.map +1 -1
  441. package/dist/shared/mcp-embed-headers.d.ts +1 -0
  442. package/dist/shared/mcp-embed-headers.d.ts.map +1 -1
  443. package/dist/shared/mcp-embed-headers.js +20 -1
  444. package/dist/shared/mcp-embed-headers.js.map +1 -1
  445. package/dist/styles/agent-native.css +60 -4
  446. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
  447. package/dist/usage/store.js +2 -2
  448. package/dist/usage/store.js.map +1 -1
  449. package/dist/vite/client.d.ts.map +1 -1
  450. package/dist/vite/client.js +2 -0
  451. package/dist/vite/client.js.map +1 -1
  452. package/dist/voice/index.d.ts +5 -0
  453. package/dist/voice/index.d.ts.map +1 -0
  454. package/dist/voice/index.js +4 -0
  455. package/dist/voice/index.js.map +1 -0
  456. package/dist/voice/voice-cleanup-prompt.d.ts +6 -0
  457. package/dist/voice/voice-cleanup-prompt.d.ts.map +1 -0
  458. package/dist/voice/voice-cleanup-prompt.js +26 -0
  459. package/dist/voice/voice-cleanup-prompt.js.map +1 -0
  460. package/dist/voice/voice-context.d.ts +25 -0
  461. package/dist/voice/voice-context.d.ts.map +1 -0
  462. package/dist/voice/voice-context.js +156 -0
  463. package/dist/voice/voice-context.js.map +1 -0
  464. package/dist/voice/voice-replacements.d.ts +4 -0
  465. package/dist/voice/voice-replacements.d.ts.map +1 -0
  466. package/dist/voice/voice-replacements.js +52 -0
  467. package/dist/voice/voice-replacements.js.map +1 -0
  468. package/docs/content/locales/ar-SA/skills-guide.mdx +5 -0
  469. package/docs/content/locales/ar-SA/template-design.mdx +55 -1
  470. package/docs/content/locales/de-DE/skills-guide.mdx +5 -0
  471. package/docs/content/locales/de-DE/template-design.mdx +66 -1
  472. package/docs/content/locales/es-ES/skills-guide.mdx +5 -0
  473. package/docs/content/locales/es-ES/template-design.mdx +65 -1
  474. package/docs/content/locales/fr-FR/skills-guide.mdx +5 -0
  475. package/docs/content/locales/fr-FR/template-design.mdx +64 -1
  476. package/docs/content/locales/hi-IN/skills-guide.mdx +5 -0
  477. package/docs/content/locales/hi-IN/template-design.mdx +59 -1
  478. package/docs/content/locales/ja-JP/skills-guide.mdx +5 -0
  479. package/docs/content/locales/ja-JP/template-design.mdx +62 -1
  480. package/docs/content/locales/ko-KR/skills-guide.mdx +5 -0
  481. package/docs/content/locales/ko-KR/template-design.mdx +58 -1
  482. package/docs/content/locales/pt-BR/skills-guide.mdx +5 -0
  483. package/docs/content/locales/pt-BR/template-design.mdx +62 -1
  484. package/docs/content/locales/zh-CN/skills-guide.mdx +5 -0
  485. package/docs/content/locales/zh-CN/template-design.mdx +50 -1
  486. package/docs/content/locales/zh-TW/skills-guide.mdx +5 -0
  487. package/docs/content/locales/zh-TW/template-design.mdx +52 -1
  488. package/docs/content/skills-guide.mdx +5 -0
  489. package/docs/content/template-design.mdx +59 -1
  490. package/package.json +2 -1
  491. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
  492. package/corpus/templates/design/actions/import-figma-file.ts +0 -166
  493. package/corpus/templates/design/app/components/design/DesignToolbar.tsx +0 -339
  494. package/corpus/templates/design/app/components/design/PresentMode.tsx +0 -68
  495. package/corpus/templates/design/app/components/design/ViewportTabs.tsx +0 -149
  496. package/corpus/templates/design/app/components/design/ZoomControls.tsx +0 -157
  497. package/corpus/templates/slides/server/lib/fig-design-system.ts +0 -110
@@ -0,0 +1,5 @@
1
+ export type { VoiceContextMode, VoiceContextPack, VoiceContextSnippet, VoiceTerm, } from "./voice-context.js";
2
+ export { formatVoiceContextPackForPrompt, parseVoiceContextPack, sanitizeVoiceContextPack, voiceContextHasContent, voiceContextTermsOnly, } from "./voice-context.js";
3
+ export { buildVoiceGuidanceBlock } from "./voice-cleanup-prompt.js";
4
+ export { applyVoiceContextReplacements, applyVoiceTermReplacements, } from "./voice-replacements.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/voice/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,SAAS,GACV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,+BAA+B,EAC/B,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { formatVoiceContextPackForPrompt, parseVoiceContextPack, sanitizeVoiceContextPack, voiceContextHasContent, voiceContextTermsOnly, } from "./voice-context.js";
2
+ export { buildVoiceGuidanceBlock } from "./voice-cleanup-prompt.js";
3
+ export { applyVoiceContextReplacements, applyVoiceTermReplacements, } from "./voice-replacements.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/voice/index.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,+BAA+B,EAC/B,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,yBAAyB,CAAC","sourcesContent":["export type {\n VoiceContextMode,\n VoiceContextPack,\n VoiceContextSnippet,\n VoiceTerm,\n} from \"./voice-context.js\";\nexport {\n formatVoiceContextPackForPrompt,\n parseVoiceContextPack,\n sanitizeVoiceContextPack,\n voiceContextHasContent,\n voiceContextTermsOnly,\n} from \"./voice-context.js\";\nexport { buildVoiceGuidanceBlock } from \"./voice-cleanup-prompt.js\";\nexport {\n applyVoiceContextReplacements,\n applyVoiceTermReplacements,\n} from \"./voice-replacements.js\";\n"]}
@@ -0,0 +1,6 @@
1
+ import { type VoiceContextPack } from "./voice-context.js";
2
+ export declare function buildVoiceGuidanceBlock({ instructions, contextPack, }: {
3
+ instructions?: string;
4
+ contextPack?: VoiceContextPack | null;
5
+ }): string | undefined;
6
+ //# sourceMappingURL=voice-cleanup-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-cleanup-prompt.d.ts","sourceRoot":"","sources":["../../src/voice/voice-cleanup-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAC;AAU5B,wBAAgB,uBAAuB,CAAC,EACtC,YAAY,EACZ,WAAW,GACZ,EAAE;IACD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACvC,GAAG,MAAM,GAAG,SAAS,CAkBrB"}
@@ -0,0 +1,26 @@
1
+ import { formatVoiceContextPackForPrompt, } from "./voice-context.js";
2
+ const MAX_CUSTOM_INSTRUCTIONS_CHARS = 4_000;
3
+ function cleanInstructions(value) {
4
+ const trimmed = value?.replace(/\0/g, "").trim();
5
+ if (!trimmed)
6
+ return undefined;
7
+ return trimmed.slice(0, MAX_CUSTOM_INSTRUCTIONS_CHARS);
8
+ }
9
+ export function buildVoiceGuidanceBlock({ instructions, contextPack, }) {
10
+ const customInstructions = cleanInstructions(instructions);
11
+ const formattedContext = formatVoiceContextPackForPrompt(contextPack);
12
+ if (!customInstructions && !formattedContext)
13
+ return undefined;
14
+ const sections = [
15
+ "Use the following voice guidance only to improve transcription, cleanup, terminology, casing, punctuation, and formatting.",
16
+ "Never add facts or content that are not present in the audio or transcript.",
17
+ ];
18
+ if (customInstructions) {
19
+ sections.push(`User instructions:\n${customInstructions}`);
20
+ }
21
+ if (formattedContext) {
22
+ sections.push(`Voice context:\n${formattedContext}`);
23
+ }
24
+ return sections.join("\n\n");
25
+ }
26
+ //# sourceMappingURL=voice-cleanup-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-cleanup-prompt.js","sourceRoot":"","sources":["../../src/voice/voice-cleanup-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,GAEhC,MAAM,oBAAoB,CAAC;AAE5B,MAAM,6BAA6B,GAAG,KAAK,CAAC;AAE5C,SAAS,iBAAiB,CAAC,KAAyB;IAClD,MAAM,OAAO,GAAG,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,6BAA6B,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,EACtC,YAAY,EACZ,WAAW,GAIZ;IACC,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC3D,MAAM,gBAAgB,GAAG,+BAA+B,CAAC,WAAW,CAAC,CAAC;IACtE,IAAI,CAAC,kBAAkB,IAAI,CAAC,gBAAgB;QAAE,OAAO,SAAS,CAAC;IAE/D,MAAM,QAAQ,GAAG;QACf,4HAA4H;QAC5H,6EAA6E;KAC9E,CAAC;IAEF,IAAI,kBAAkB,EAAE,CAAC;QACvB,QAAQ,CAAC,IAAI,CAAC,uBAAuB,kBAAkB,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,gBAAgB,EAAE,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,mBAAmB,gBAAgB,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC","sourcesContent":["import {\n formatVoiceContextPackForPrompt,\n type VoiceContextPack,\n} from \"./voice-context.js\";\n\nconst MAX_CUSTOM_INSTRUCTIONS_CHARS = 4_000;\n\nfunction cleanInstructions(value: string | undefined): string | undefined {\n const trimmed = value?.replace(/\\0/g, \"\").trim();\n if (!trimmed) return undefined;\n return trimmed.slice(0, MAX_CUSTOM_INSTRUCTIONS_CHARS);\n}\n\nexport function buildVoiceGuidanceBlock({\n instructions,\n contextPack,\n}: {\n instructions?: string;\n contextPack?: VoiceContextPack | null;\n}): string | undefined {\n const customInstructions = cleanInstructions(instructions);\n const formattedContext = formatVoiceContextPackForPrompt(contextPack);\n if (!customInstructions && !formattedContext) return undefined;\n\n const sections = [\n \"Use the following voice guidance only to improve transcription, cleanup, terminology, casing, punctuation, and formatting.\",\n \"Never add facts or content that are not present in the audio or transcript.\",\n ];\n\n if (customInstructions) {\n sections.push(`User instructions:\\n${customInstructions}`);\n }\n if (formattedContext) {\n sections.push(`Voice context:\\n${formattedContext}`);\n }\n\n return sections.join(\"\\n\\n\");\n}\n"]}
@@ -0,0 +1,25 @@
1
+ export type VoiceContextMode = "dictation" | "cleanup" | "transcript" | "title" | "summary" | "meeting";
2
+ export interface VoiceContextSnippet {
3
+ label: string;
4
+ value: string;
5
+ }
6
+ export interface VoiceTerm {
7
+ term: string;
8
+ replacement?: string;
9
+ confidence?: number;
10
+ source?: string;
11
+ scope?: string;
12
+ }
13
+ export interface VoiceContextPack {
14
+ surface?: string;
15
+ mode?: VoiceContextMode | string;
16
+ snippets?: VoiceContextSnippet[];
17
+ terms?: VoiceTerm[];
18
+ metadata?: Record<string, string | number | boolean | null | undefined>;
19
+ }
20
+ export declare function sanitizeVoiceContextPack(input: unknown): VoiceContextPack | undefined;
21
+ export declare function parseVoiceContextPack(value: string): VoiceContextPack | undefined;
22
+ export declare function voiceContextHasContent(pack: VoiceContextPack | undefined): boolean;
23
+ export declare function voiceContextTermsOnly(input: unknown): VoiceContextPack | undefined;
24
+ export declare function formatVoiceContextPackForPrompt(input: unknown): string;
25
+ //# sourceMappingURL=voice-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-context.d.ts","sourceRoot":"","sources":["../../src/voice/voice-context.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GACxB,WAAW,GACX,SAAS,GACT,YAAY,GACZ,OAAO,GACP,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CACzE;AAsBD,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,GACb,gBAAgB,GAAG,SAAS,CAoF9B;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,GACZ,gBAAgB,GAAG,SAAS,CAQ9B;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,gBAAgB,GAAG,SAAS,GACjC,OAAO,CAQT;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,GACb,gBAAgB,GAAG,SAAS,CAI9B;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CA+CtE"}
@@ -0,0 +1,156 @@
1
+ const MAX_CONTEXT_PACK_CHARS = 64_000;
2
+ const MAX_SNIPPETS = 8;
3
+ const MAX_SNIPPET_VALUE_CHARS = 1_800;
4
+ const MAX_TERMS = 80;
5
+ const MAX_TERM_CHARS = 120;
6
+ const MAX_METADATA_KEYS = 12;
7
+ const MAX_METADATA_VALUE_CHARS = 160;
8
+ function cleanString(value, maxChars) {
9
+ if (typeof value !== "string")
10
+ return undefined;
11
+ const trimmed = value.replace(/\0/g, "").trim();
12
+ if (!trimmed)
13
+ return undefined;
14
+ return trimmed.slice(0, maxChars);
15
+ }
16
+ function cleanNumber(value) {
17
+ if (typeof value !== "number" || !Number.isFinite(value))
18
+ return undefined;
19
+ return Math.min(1, Math.max(0, value));
20
+ }
21
+ export function sanitizeVoiceContextPack(input) {
22
+ if (!input || typeof input !== "object" || Array.isArray(input)) {
23
+ return undefined;
24
+ }
25
+ const raw = input;
26
+ const surface = cleanString(raw.surface, 80);
27
+ const mode = cleanString(raw.mode, 40);
28
+ const snippets = Array.isArray(raw.snippets)
29
+ ? raw.snippets
30
+ .slice(0, MAX_SNIPPETS)
31
+ .map((snippet) => {
32
+ if (!snippet || typeof snippet !== "object")
33
+ return null;
34
+ const candidate = snippet;
35
+ const label = cleanString(candidate.label, 80);
36
+ const value = cleanString(candidate.value, MAX_SNIPPET_VALUE_CHARS);
37
+ return label && value ? { label, value } : null;
38
+ })
39
+ .filter((snippet) => snippet !== null)
40
+ : undefined;
41
+ const terms = Array.isArray(raw.terms)
42
+ ? raw.terms
43
+ .slice(0, MAX_TERMS)
44
+ .map((term) => {
45
+ if (!term || typeof term !== "object")
46
+ return null;
47
+ const candidate = term;
48
+ const rawTerm = cleanString(candidate.term, MAX_TERM_CHARS);
49
+ if (!rawTerm || rawTerm.length < 2)
50
+ return null;
51
+ const replacement = cleanString(candidate.replacement, MAX_TERM_CHARS);
52
+ const source = cleanString(candidate.source, 40);
53
+ const scope = cleanString(candidate.scope, 40);
54
+ const confidence = cleanNumber(candidate.confidence);
55
+ return {
56
+ term: rawTerm,
57
+ ...(replacement ? { replacement } : {}),
58
+ ...(confidence !== undefined ? { confidence } : {}),
59
+ ...(source ? { source } : {}),
60
+ ...(scope ? { scope } : {}),
61
+ };
62
+ })
63
+ .filter((term) => term !== null)
64
+ : undefined;
65
+ const metadata = raw.metadata &&
66
+ typeof raw.metadata === "object" &&
67
+ !Array.isArray(raw.metadata)
68
+ ? Object.fromEntries(Object.entries(raw.metadata)
69
+ .slice(0, MAX_METADATA_KEYS)
70
+ .flatMap(([key, value]) => {
71
+ const cleanKey = cleanString(key, 60);
72
+ if (!cleanKey)
73
+ return [];
74
+ if (typeof value === "string" ||
75
+ typeof value === "number" ||
76
+ typeof value === "boolean" ||
77
+ value === null) {
78
+ const cleanValue = typeof value === "string"
79
+ ? cleanString(value, MAX_METADATA_VALUE_CHARS)
80
+ : value;
81
+ return cleanValue === undefined ? [] : [[cleanKey, cleanValue]];
82
+ }
83
+ return [];
84
+ }))
85
+ : undefined;
86
+ const pack = {
87
+ ...(surface ? { surface } : {}),
88
+ ...(mode ? { mode } : {}),
89
+ ...(snippets?.length ? { snippets } : {}),
90
+ ...(terms?.length ? { terms } : {}),
91
+ ...(metadata && Object.keys(metadata).length > 0 ? { metadata } : {}),
92
+ };
93
+ return voiceContextHasContent(pack) ? pack : undefined;
94
+ }
95
+ export function parseVoiceContextPack(value) {
96
+ const trimmed = value.replace(/\0/g, "").trim();
97
+ if (!trimmed || trimmed.length > MAX_CONTEXT_PACK_CHARS)
98
+ return undefined;
99
+ try {
100
+ return sanitizeVoiceContextPack(JSON.parse(trimmed));
101
+ }
102
+ catch {
103
+ return undefined;
104
+ }
105
+ }
106
+ export function voiceContextHasContent(pack) {
107
+ return Boolean(pack?.surface ||
108
+ pack?.mode ||
109
+ pack?.snippets?.length ||
110
+ pack?.terms?.length ||
111
+ (pack?.metadata && Object.keys(pack.metadata).length > 0));
112
+ }
113
+ export function voiceContextTermsOnly(input) {
114
+ const pack = sanitizeVoiceContextPack(input);
115
+ if (!pack?.terms?.length)
116
+ return undefined;
117
+ return { terms: pack.terms };
118
+ }
119
+ export function formatVoiceContextPackForPrompt(input) {
120
+ const pack = sanitizeVoiceContextPack(input);
121
+ if (!pack)
122
+ return "";
123
+ const sections = [];
124
+ if (pack.surface)
125
+ sections.push(`Surface: ${pack.surface}`);
126
+ if (pack.mode)
127
+ sections.push(`Mode: ${pack.mode}`);
128
+ if (pack.snippets?.length) {
129
+ sections.push([
130
+ "Context snippets:",
131
+ ...pack.snippets.map((snippet) => `- ${snippet.label}: ${snippet.value}`),
132
+ ].join("\n"));
133
+ }
134
+ if (pack.terms?.length) {
135
+ sections.push([
136
+ "Preferred vocabulary and casing:",
137
+ ...pack.terms.map((term) => {
138
+ const replacement = term.replacement && term.replacement !== term.term
139
+ ? ` -> ${term.replacement}`
140
+ : "";
141
+ const source = term.source ? ` (${term.source})` : "";
142
+ return `- ${term.term}${replacement}${source}`;
143
+ }),
144
+ ].join("\n"));
145
+ }
146
+ if (pack.metadata && Object.keys(pack.metadata).length > 0) {
147
+ sections.push([
148
+ "Metadata:",
149
+ ...Object.entries(pack.metadata).map(([key, value]) => {
150
+ return `- ${key}: ${String(value)}`;
151
+ }),
152
+ ].join("\n"));
153
+ }
154
+ return sections.join("\n\n");
155
+ }
156
+ //# sourceMappingURL=voice-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-context.js","sourceRoot":"","sources":["../../src/voice/voice-context.ts"],"names":[],"mappings":"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","sourcesContent":["export type VoiceContextMode =\n | \"dictation\"\n | \"cleanup\"\n | \"transcript\"\n | \"title\"\n | \"summary\"\n | \"meeting\";\n\nexport interface VoiceContextSnippet {\n label: string;\n value: string;\n}\n\nexport interface VoiceTerm {\n term: string;\n replacement?: string;\n confidence?: number;\n source?: string;\n scope?: string;\n}\n\nexport interface VoiceContextPack {\n surface?: string;\n mode?: VoiceContextMode | string;\n snippets?: VoiceContextSnippet[];\n terms?: VoiceTerm[];\n metadata?: Record<string, string | number | boolean | null | undefined>;\n}\n\nconst MAX_CONTEXT_PACK_CHARS = 64_000;\nconst MAX_SNIPPETS = 8;\nconst MAX_SNIPPET_VALUE_CHARS = 1_800;\nconst MAX_TERMS = 80;\nconst MAX_TERM_CHARS = 120;\nconst MAX_METADATA_KEYS = 12;\nconst MAX_METADATA_VALUE_CHARS = 160;\n\nfunction cleanString(value: unknown, maxChars: number): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.replace(/\\0/g, \"\").trim();\n if (!trimmed) return undefined;\n return trimmed.slice(0, maxChars);\n}\n\nfunction cleanNumber(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return undefined;\n return Math.min(1, Math.max(0, value));\n}\n\nexport function sanitizeVoiceContextPack(\n input: unknown,\n): VoiceContextPack | undefined {\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\n return undefined;\n }\n\n const raw = input as VoiceContextPack;\n const surface = cleanString(raw.surface, 80);\n const mode = cleanString(raw.mode, 40);\n\n const snippets = Array.isArray(raw.snippets)\n ? raw.snippets\n .slice(0, MAX_SNIPPETS)\n .map((snippet) => {\n if (!snippet || typeof snippet !== \"object\") return null;\n const candidate = snippet as Partial<VoiceContextSnippet>;\n const label = cleanString(candidate.label, 80);\n const value = cleanString(candidate.value, MAX_SNIPPET_VALUE_CHARS);\n return label && value ? { label, value } : null;\n })\n .filter((snippet): snippet is VoiceContextSnippet => snippet !== null)\n : undefined;\n\n const terms = Array.isArray(raw.terms)\n ? raw.terms\n .slice(0, MAX_TERMS)\n .map((term) => {\n if (!term || typeof term !== \"object\") return null;\n const candidate = term as Partial<VoiceTerm>;\n const rawTerm = cleanString(candidate.term, MAX_TERM_CHARS);\n if (!rawTerm || rawTerm.length < 2) return null;\n const replacement = cleanString(\n candidate.replacement,\n MAX_TERM_CHARS,\n );\n const source = cleanString(candidate.source, 40);\n const scope = cleanString(candidate.scope, 40);\n const confidence = cleanNumber(candidate.confidence);\n return {\n term: rawTerm,\n ...(replacement ? { replacement } : {}),\n ...(confidence !== undefined ? { confidence } : {}),\n ...(source ? { source } : {}),\n ...(scope ? { scope } : {}),\n };\n })\n .filter((term): term is VoiceTerm => term !== null)\n : undefined;\n\n const metadata =\n raw.metadata &&\n typeof raw.metadata === \"object\" &&\n !Array.isArray(raw.metadata)\n ? Object.fromEntries(\n Object.entries(raw.metadata)\n .slice(0, MAX_METADATA_KEYS)\n .flatMap(([key, value]) => {\n const cleanKey = cleanString(key, 60);\n if (!cleanKey) return [];\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n value === null\n ) {\n const cleanValue =\n typeof value === \"string\"\n ? cleanString(value, MAX_METADATA_VALUE_CHARS)\n : value;\n return cleanValue === undefined ? [] : [[cleanKey, cleanValue]];\n }\n return [];\n }),\n )\n : undefined;\n\n const pack: VoiceContextPack = {\n ...(surface ? { surface } : {}),\n ...(mode ? { mode } : {}),\n ...(snippets?.length ? { snippets } : {}),\n ...(terms?.length ? { terms } : {}),\n ...(metadata && Object.keys(metadata).length > 0 ? { metadata } : {}),\n };\n\n return voiceContextHasContent(pack) ? pack : undefined;\n}\n\nexport function parseVoiceContextPack(\n value: string,\n): VoiceContextPack | undefined {\n const trimmed = value.replace(/\\0/g, \"\").trim();\n if (!trimmed || trimmed.length > MAX_CONTEXT_PACK_CHARS) return undefined;\n try {\n return sanitizeVoiceContextPack(JSON.parse(trimmed));\n } catch {\n return undefined;\n }\n}\n\nexport function voiceContextHasContent(\n pack: VoiceContextPack | undefined,\n): boolean {\n return Boolean(\n pack?.surface ||\n pack?.mode ||\n pack?.snippets?.length ||\n pack?.terms?.length ||\n (pack?.metadata && Object.keys(pack.metadata).length > 0),\n );\n}\n\nexport function voiceContextTermsOnly(\n input: unknown,\n): VoiceContextPack | undefined {\n const pack = sanitizeVoiceContextPack(input);\n if (!pack?.terms?.length) return undefined;\n return { terms: pack.terms };\n}\n\nexport function formatVoiceContextPackForPrompt(input: unknown): string {\n const pack = sanitizeVoiceContextPack(input);\n if (!pack) return \"\";\n\n const sections: string[] = [];\n if (pack.surface) sections.push(`Surface: ${pack.surface}`);\n if (pack.mode) sections.push(`Mode: ${pack.mode}`);\n\n if (pack.snippets?.length) {\n sections.push(\n [\n \"Context snippets:\",\n ...pack.snippets.map(\n (snippet) => `- ${snippet.label}: ${snippet.value}`,\n ),\n ].join(\"\\n\"),\n );\n }\n\n if (pack.terms?.length) {\n sections.push(\n [\n \"Preferred vocabulary and casing:\",\n ...pack.terms.map((term) => {\n const replacement =\n term.replacement && term.replacement !== term.term\n ? ` -> ${term.replacement}`\n : \"\";\n const source = term.source ? ` (${term.source})` : \"\";\n return `- ${term.term}${replacement}${source}`;\n }),\n ].join(\"\\n\"),\n );\n }\n\n if (pack.metadata && Object.keys(pack.metadata).length > 0) {\n sections.push(\n [\n \"Metadata:\",\n ...Object.entries(pack.metadata).map(([key, value]) => {\n return `- ${key}: ${String(value)}`;\n }),\n ].join(\"\\n\"),\n );\n }\n\n return sections.join(\"\\n\\n\");\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import { type VoiceContextPack, type VoiceTerm } from "./voice-context.js";
2
+ export declare function applyVoiceTermReplacements(text: string, terms: readonly VoiceTerm[] | undefined): string;
3
+ export declare function applyVoiceContextReplacements(text: string, contextPack: VoiceContextPack | undefined): string;
4
+ //# sourceMappingURL=voice-replacements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-replacements.d.ts","sourceRoot":"","sources":["../../src/voice/voice-replacements.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACf,MAAM,oBAAoB,CAAC;AA4B5B,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,GACtC,MAAM,CA+BR;AAED,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,gBAAgB,GAAG,SAAS,GACxC,MAAM,CAGR"}
@@ -0,0 +1,52 @@
1
+ import { sanitizeVoiceContextPack, } from "./voice-context.js";
2
+ function escapeRegExp(value) {
3
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
4
+ }
5
+ function isAlphaNumeric(value) {
6
+ return value != null && /[\p{L}\p{N}_]/u.test(value);
7
+ }
8
+ function isSafeVoiceReplacementBoundary(text, index, direction) {
9
+ const char = text[index];
10
+ if (char == null)
11
+ return true;
12
+ if (isAlphaNumeric(char))
13
+ return false;
14
+ if (char === "@" || char === "/" || char === "\\" || char === ":") {
15
+ return false;
16
+ }
17
+ if (char === "." || char === "-" || char === "+") {
18
+ const neighbor = direction === "before" ? text[index - 1] : text[index + 1];
19
+ return !isAlphaNumeric(neighbor);
20
+ }
21
+ return true;
22
+ }
23
+ export function applyVoiceTermReplacements(text, terms) {
24
+ if (!text || !terms?.length)
25
+ return text;
26
+ let next = text;
27
+ const replacements = terms
28
+ .filter((term) => term.term.trim().length >= 2 &&
29
+ term.replacement?.trim() &&
30
+ term.replacement.trim() !== term.term.trim())
31
+ .sort((a, b) => b.term.length - a.term.length);
32
+ for (const term of replacements) {
33
+ const source = escapeRegExp(term.term.trim());
34
+ const replacement = term.replacement?.trim() ?? "";
35
+ const pattern = new RegExp(source, "giu");
36
+ next = next.replace(pattern, (match, offset) => {
37
+ const start = offset;
38
+ const end = offset + match.length;
39
+ if (!isSafeVoiceReplacementBoundary(next, start - 1, "before") ||
40
+ !isSafeVoiceReplacementBoundary(next, end, "after")) {
41
+ return match;
42
+ }
43
+ return replacement;
44
+ });
45
+ }
46
+ return next;
47
+ }
48
+ export function applyVoiceContextReplacements(text, contextPack) {
49
+ const pack = sanitizeVoiceContextPack(contextPack);
50
+ return applyVoiceTermReplacements(text, pack?.terms);
51
+ }
52
+ //# sourceMappingURL=voice-replacements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-replacements.js","sourceRoot":"","sources":["../../src/voice/voice-replacements.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n sanitizeVoiceContextPack,\n type VoiceContextPack,\n type VoiceTerm,\n} from \"./voice-context.js\";\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction isAlphaNumeric(value: string | undefined): boolean {\n return value != null && /[\\p{L}\\p{N}_]/u.test(value);\n}\n\nfunction isSafeVoiceReplacementBoundary(\n text: string,\n index: number,\n direction: \"before\" | \"after\",\n): boolean {\n const char = text[index];\n if (char == null) return true;\n if (isAlphaNumeric(char)) return false;\n if (char === \"@\" || char === \"/\" || char === \"\\\\\" || char === \":\") {\n return false;\n }\n if (char === \".\" || char === \"-\" || char === \"+\") {\n const neighbor = direction === \"before\" ? text[index - 1] : text[index + 1];\n return !isAlphaNumeric(neighbor);\n }\n return true;\n}\n\nexport function applyVoiceTermReplacements(\n text: string,\n terms: readonly VoiceTerm[] | undefined,\n): string {\n if (!text || !terms?.length) return text;\n\n let next = text;\n const replacements = terms\n .filter(\n (term) =>\n term.term.trim().length >= 2 &&\n term.replacement?.trim() &&\n term.replacement.trim() !== term.term.trim(),\n )\n .sort((a, b) => b.term.length - a.term.length);\n\n for (const term of replacements) {\n const source = escapeRegExp(term.term.trim());\n const replacement = term.replacement?.trim() ?? \"\";\n const pattern = new RegExp(source, \"giu\");\n next = next.replace(pattern, (match, offset: number) => {\n const start = offset;\n const end = offset + match.length;\n if (\n !isSafeVoiceReplacementBoundary(next, start - 1, \"before\") ||\n !isSafeVoiceReplacementBoundary(next, end, \"after\")\n ) {\n return match;\n }\n return replacement;\n });\n }\n\n return next;\n}\n\nexport function applyVoiceContextReplacements(\n text: string,\n contextPack: VoiceContextPack | undefined,\n): string {\n const pack = sanitizeVoiceContextPack(contextPack);\n return applyVoiceTermReplacements(text, pack?.terms);\n}\n"]}
@@ -118,6 +118,10 @@ Skills موجود في `.agents/skills/<name>/SKILL.md` ويحتوي على إر
118
118
 
119
119
  ## skills المدعوم بالتطبيق {#app-backed-skills}
120
120
 
121
+ تشمل skills المدعومة بالتطبيق حاليا `visual-plan` و`visual-recap` من Plan،
122
+ و`visual-edit` من Design، و`assets` من Assets، و`content` لتحرير docs/blog/MDX
123
+ من المستودع.
124
+
121
125
  تحزم skills المدعومة بالتطبيق تطبيقًا أصليًا للوكيل باعتباره قطعة أثرية في سوق المهارات. يمكن أن تتضمن الحزمة تعليمات الوكيل، وبيانات تعريف موصل skills المصدرة، وتعليمات التشغيل المستضافة/المحلية، وأسطح UI مثل تطبيقات MCP.
122
126
 
123
127
  > **التفاصيل الكاملة أدناه:** يتم تغطية آليات skills المدعومة بالتطبيق (تنسيق البيان، وأوامر CLI، ومحولات السوق، وتجزئة التحديث التلقائي) في [App-backed skills — full details](#app-backed-skills-full).
@@ -328,6 +332,7 @@ scope: dev
328
332
  ```bash
329
333
  # المسار السعيد: التعليمات المصدرة بالإضافة إلى موصل MCP المستضاف.
330
334
  npx @agent-native/core@latest skills add visual-plan
335
+ npx @agent-native/core@latest skills add visual-edit
331
336
  npx @agent-native/core@latest skills add assets
332
337
 
333
338
  # تحرير Content docs/blog/MDX مع اعتبار الريبو مصدر الحقيقة.
@@ -340,7 +340,7 @@ pnpm dev
340
340
  - **التصميمات** — `create-design` (صدفة فارغة)، `generate-design` (كتابة محتوى HTML/JSX)، `update-design`، `get-design`، `list-designs`، `duplicate-design`، `delete-design`، و`apply-tweaks` لاستمرار مقبض القرص المباشر القيم (لون التمييز، والكثافة، وما إلى ذلك).
341
341
  - **الملفات** — `create-file`، `update-file`، `list-files`، `delete-file` للملفات الموجودة داخل مشروع التصميم.
342
342
  - **أنظمة التصميم** — `create-design-system`، و`update-design-system`، و`get-design-system`، و`list-design-systems`، و`delete-design-system`، و`set-default-design-system`، و`analyze-brand-assets` لجمع بيانات العلامة التجارية قبل التحليل.
343
- - **استيراد** — `import-code و`import-figma`، و`import-github`، و`import-from-url و`import-document` (DOCX/PPTX/PDF/XLSX)، و`import-design-project` لرفع نظام التصميم من مشروع حالي.
343
+ - **استيراد** — `index-design-system-with-builder` for Builder-backed code/GitHub design-system indexing, plus `import-figma`, `import-from-url`, `import-document` (DOCX/PPTX/PDF/XLSX), and `import-design-project` for other sources.
344
344
  - **التصدير والتسليم** — `export-html`، و`export-pdf`، و`export-svg`، و`export-zip`، و`export-coding-handoff` لتحويل التصميم إلى تسليم لأداة البرمجة.
345
345
  - **السياق والتنقل** — `view-screen` (التصميم الحالي، ملف مفتوح، عرض، سؤال معلق أو شبكة متغيرة)، `get-design-snapshot` (الحالة الحالية للوكيل الخارجي للمتابعة منها)، و`navigate`.
346
346
 
@@ -350,6 +350,60 @@ pnpm dev
350
350
 
351
351
  نظرًا لأن التصميم هو مجرد ملفات HTML/JSX مستقلة، يقوم الوكيل بتحرير نفس المصدر الذي يعرضه iframe ويأتي منه كل تصدير - لا يوجد تنسيق "AI mockup" منفصل لترجمته. يوفر نظام التصميم المرتبط الرموز المميزة ويكرم الوكيل `custom_instructions` في كل تذكرة جيل. حدد نصًا أو منطقة في المعاينة واضغط على Cmd+I لتركيز الوكيل على هذا الجزء بالضبط.
352
352
 
353
+ ### نموذج المحرر
354
+
355
+ يعتمد Design على النظرة العامة أولاً عند العمل على شاشات متعددة. بعد الإنشاء
356
+ أو التحديثات الواسعة، يفتح المحرر النظرة العامة للشاشات: لوحة لا نهائية تكون
357
+ فيها كل شاشة إطارًا ثابتًا يمكن تحديده أو نقله أو تغيير حجمه أو إسقاطه أو
358
+ تكراره. انقر نقرًا مزدوجًا على إطار للتركيز على شاشة واحدة.
359
+
360
+ وضع الشاشة الواحدة مخصص للتمرير، والتفاعل مع سلوك النموذج الأولي، وتحرير
361
+ طبقات DOM/الكود داخل ملف واحد معروض. تعكس لوحة الطبقات هذا التقسيم: الشاشات
362
+ إطارات من المستوى الأعلى، وتحت الشاشة النشطة تظهر طبقات DOM/الكود المتداخلة.
363
+
364
+ ثبّت `/visual-edit` عندما يحتاج وكيل البرمجة إلى فتح تطبيق محلي يعمل في
365
+ Design بدل إنشاء HTML نموذج أولي مستقل:
366
+
367
+ ```bash
368
+ npx @agent-native/core@latest skills add visual-edit
369
+ ```
370
+
371
+ بعد تشغيل خادم التطوير للتطبيق الهدف، يستخدم `/visual-edit`
372
+ `npx @agent-native/core@latest design connect` مع `add-localhost-screens` لوضع
373
+ كل مسار أو URL مطلوب كشاشة iframe منفصلة مدعومة بعنوان URL. تبقى التدفقات
374
+ المرقمة مثل `localhost:1234/onboarding/1` و`/onboarding/2` و`/onboarding/3`
375
+ كشاشات منفصلة ومرتبة في وضع النظرة العامة.
376
+
377
+ لأسماء طبقات مستقرة، أضف `data-agent-native-layer-name` إلى العناصر المهمة.
378
+ يستخدمه Design قبل البدائل الدلالية/النصية، ويمكنه حفظ إعادة تسمية الطبقات عبر
379
+ تحرير هذا السمة. يدعم HTML المضمن تحرير طبقات الكود محليًا للنصوص والأصناف
380
+ والأنماط والسمات وترتيب المصدر والتغييرات البنيوية الصغيرة؛ وتقتصر التعديلات
381
+ المرئية لطبقات الكود حاليًا على HTML. يستطيع وضع مصدر localhost تسجيل لوحات
382
+ عمل المسارات المحلية وحلها، لكن قراءة/كتابة الملفات المحلية تبقى عقد جسر إلى
383
+ أن يتم تعزيز عناصر التحكم الصريحة في الأذونات.
384
+
385
+ ### ملحقات محرر Design
386
+
387
+ يتضمن المحرر علامة تبويب المفتش **Extensions** بعد **Tweaks**. تعمل
388
+ كمسار إضافات خاص بـ Design: يمكن للمستخدمين النقر على **+ Extension** ليطلبوا
389
+ من الوكيل بناء ملحق، أو تثبيت ملحق يعلن فتحة `design.editor.inspector`.
390
+
391
+ تُعرض ملحقات Design مضمّنة بجانب لوحة العمل عبر صندوق رمل الملحقات القياسي.
392
+ يمرر المضيف تحديثات `window.slotContext` و`window.onSlotContext(...)` مع
393
+ `designId` الحالي، والملف النشط، وقائمة الشاشات، ومعرفات الشاشات المحددة،
394
+ وبيانات العنصر المحدد، ووضع العرض، والتكبير، والأداة النشطة، وقيم التعديلات.
395
+ يسمح ذلك للملحق بعرض معلومات عن التحديد الحالي، أو تقديم عناصر تحكم في النمط،
396
+ أو بناء تدفقات عمل صغيرة حول التصميم المفتوح.
397
+
398
+ للعمل الحتمي، يمكن للملحقات استدعاء إجراءات التطبيق من خلال جسر الملحقات.
399
+ وللتغييرات المدفوعة بالذكاء الاصطناعي، اجعل الملحق يستدعي
400
+ `agentNative.chat.send(...)` مع محدد العنصر/معرف المصدر والتغيير المطلوب. يجب
401
+ أن يستدعي الوكيل `view-screen` أولاً، ثم يستخدم `apply-visual-edit` لتغييرات
402
+ نمط العنصر أو الصنف أو النص أو الحركة، أو يستخدم `update-design` /
403
+ `generate-design` مع `canvasFrames` لتغييرات موضع لوحة العمل. راجع
404
+ [Extensions](/docs/extensions#what-an-extension-can-do) لمعرفة صندوق الرمل
405
+ والحالة المستمرة وواجهات جسر الملحقات.
406
+
353
407
  ### تخصيصه
354
408
 
355
409
  التصميم عبارة عن قالب كامل وقابل للاستنساخ. بعض الأفكار الإضافية العملية:
@@ -118,6 +118,10 @@ Domäne skills folgt demselben Format wie das Framework skills. Sie kodieren Mus
118
118
 
119
119
  ## App-gestütztes skills {#app-backed-skills}
120
120
 
121
+ Aktuelle appgestützte Skills sind `visual-plan` und `visual-recap` aus Plan,
122
+ `visual-edit` aus Design, `assets` aus Assets und `content` für repo-basiertes
123
+ Bearbeiten von docs/blog/MDX.
124
+
121
125
  App-gestütztes skills-Paket einer agentennativen App als Skill-Marktplatz-Artefakt. Das Paket kann Agentenanweisungen, exportierte skills-, MCP-Connector-Metadaten, gehostete/lokale Startanweisungen und UI-Oberflächen wie MCP-Apps enthalten.
122
126
 
123
127
  > **Vollständige Details unten:** Die Mechanismen des App-gestützten skills (Manifestformat, CLI-Befehle, Marktplatzadapter, automatisches Update-Hashing) werden in [App-backed skills — full details](#app-backed-skills-full) behandelt.
@@ -328,6 +332,7 @@ Offline-Arbeit oder datenschutzrelevante Nutzung.
328
332
  ```bash
329
333
  # Glücklicher Weg: exportierte Anweisungen plus gehosteter MCP-Connector.
330
334
  npx @agent-native/core@latest skills add visual-plan
335
+ npx @agent-native/core@latest skills add visual-edit
331
336
  npx @agent-native/core@latest skills add assets
332
337
 
333
338
  # Repo-first Content docs/blog/MDX Bearbeitung.
@@ -338,7 +338,7 @@ Jeder vom Agenten aufrufbare Vorgang ist eine TypeScript-Datei in `templates/des
338
338
  - **Designs** – `create-design` (leere Shell), `generate-design` (generierten HTML/JSX-Inhalt schreiben), `update-design`, `get-design`, `list-designs`, `duplicate-design`, `delete-design` und `apply-tweaks` zum Beibehalten von Live-Tweak-Knopf-Werten (Akzentfarbe, Dichte, usw.).
339
339
  - **Dateien** – `create-file`, `update-file`, `list-files`, `delete-file` für die Dateien in einem Designprojekt.
340
340
  - **Designsysteme** – `create-design-system`, `update-design-system`, `get-design-system`, `list-design-systems`, `delete-design-system`, `set-default-design-system` und `analyze-brand-assets` zum Sammeln von Markendaten vor der Analyse.
341
- - **Importieren** `import-code`, `import-figma`, `import-github`, `import-from-url`, `import-document` (DOCX/PPTX/PDF/XLSX) und `import-design-project`, um ein Designsystem aus einem vorhandenen Projekt zu entfernen.
341
+ - **Importieren** `index-design-system-with-builder` for Builder-backed code/GitHub design-system indexing, plus `import-figma`, `import-from-url`, `import-document` (DOCX/PPTX/PDF/XLSX), and `import-design-project` for other sources.
342
342
  - **Export & Übergabe** – `export-html`, `export-pdf`, `export-svg`, `export-zip` und `export-coding-handoff`, um ein Design in eine Codierungstool-Übergabe umzuwandeln.
343
343
  - **Kontext und Navigation** – `view-screen` (aktuelles Design, offene Datei, Ansicht, ausstehende Frage oder Variantenraster), `get-design-snapshot` (aktueller Status, von dem aus ein externer Agent fortfahren kann) und `navigate`.
344
344
 
@@ -348,6 +348,71 @@ Der Agent weiß immer, was Sie offen haben. Das aktuelle Design, die geöffnete
348
348
 
349
349
  Da es sich bei einem Design lediglich um eigenständige HTML/JSX-Dateien handelt, bearbeitet der Agent dieselbe Quelle, die der Iframe rendert, und jeder Export stammt aus – es gibt kein separates „AI-Mockup“-Format zum Übersetzen. Ein verknüpftes Designsystem liefert Token und `custom_instructions`, die der Agent bei jedem Generationsdurchlauf ehrt. Wählen Sie in der Vorschau Text oder einen Bereich aus und drücken Sie Befehl+I, um den Agenten genau auf diesen Teil zu konzentrieren.
350
350
 
351
+ ### Editor-Modell
352
+
353
+ Design ist bei Arbeit mit mehreren Bildschirmen übersichtsorientiert. Nach der
354
+ Generierung oder größeren Aktualisierungen öffnet der Editor die
355
+ Bildschirmübersicht: eine unendliche Arbeitsfläche, auf der jeder Bildschirm ein
356
+ statischer Rahmen ist, den Sie auswählen, verschieben, skalieren, ablegen oder
357
+ duplizieren können. Verwenden Sie die Vollansicht-Schaltfläche des Rahmens, wenn ein Bildschirm
358
+ fokussiertes Scrollen oder Prototypinteraktion benötigt.
359
+
360
+ Der Einzelbildschirmmodus ist für Scrollen, Interaktion mit Prototypverhalten
361
+ und Bearbeitung der DOM-/Code-Ebenen in einer gerenderten Datei gedacht. Das
362
+ Ebenenfenster spiegelt diese Trennung wider: Bildschirme sind Rahmen der
363
+ obersten Ebene, darunter liegen die DOM-/Code-Ebenen des aktiven Bildschirms.
364
+
365
+ Installiere `/visual-edit`, wenn ein Coding Agent eine laufende lokale App in
366
+ Design öffnen soll, statt eigenständiges Prototype-HTML zu generieren:
367
+
368
+ ```bash
369
+ npx @agent-native/core@latest skills add visual-edit
370
+ ```
371
+
372
+ Sobald der Dev-Server der Ziel-App läuft, nutzt `/visual-edit`
373
+ `npx @agent-native/core@latest design connect` plus `add-localhost-screens`, um
374
+ jeden angeforderten Pfad oder jede URL als eigenen URL-gestützten iframe-Screen
375
+ zu platzieren. Nummerierte Flows wie `localhost:1234/onboarding/1`,
376
+ `/onboarding/2` und `/onboarding/3` bleiben als getrennte, geordnete Screens im
377
+ Overview-Modus erhalten.
378
+
379
+ Für stabile Ebenennamen fügen Sie wichtigen Elementen
380
+ `data-agent-native-layer-name` hinzu. Design verwendet dies vor
381
+ semantischen/textbasierten Fallbacks und kann Umbenennungen durch Bearbeiten
382
+ dieses Attributs speichern. Inline-HTML unterstützt lokale Code-Ebenen-Edits
383
+ für Text, Klassen, Stile, Attribute, Quellreihenfolge und kleine strukturelle
384
+ Änderungen; visuelle Code-Ebenen-Edits sind heute HTML-only. Der
385
+ localhost-Quellmodus kann lokale Routen-Artboards registrieren und auflösen,
386
+ aber lokale Datei-Lese-/Schreibvorgänge bleiben ein Bridge-Vertrag, bis
387
+ explizite Berechtigungskontrollen gehärtet sind.
388
+
389
+ ### Erweiterungen im Design-Editor
390
+
391
+ Der Editor enthält nach **Tweaks** eine **Extensions**-Inspektorregisterkarte.
392
+ Sie funktioniert wie eine Design-spezifische Plugin-Spur: Benutzer können auf
393
+ **+ Extension** klicken, um den Agenten eine Erweiterung erstellen zu lassen,
394
+ oder eine Erweiterung installieren, die den Slot `design.editor.inspector`
395
+ deklariert.
396
+
397
+ Design-Erweiterungen werden über die Standard-Erweiterungssandbox inline neben
398
+ der Arbeitsfläche gerendert. Der Host übergibt `window.slotContext` und
399
+ `window.onSlotContext(...)`-Updates mit der aktuellen `designId`, der aktiven
400
+ Datei, der Bildschirmliste, ausgewählten Bildschirm-IDs, Metadaten des
401
+ ausgewählten Elements, Ansichtsmodus, Zoom, aktivem Werkzeug und Tweak-Werten.
402
+ So kann eine Erweiterung Informationen zur aktuellen Auswahl anzeigen,
403
+ Stilsteuerungen anbieten oder kompakte Workflows rund um das geöffnete Design
404
+ erstellen.
405
+
406
+ Für deterministische Arbeit können Erweiterungen App-Aktionen über die
407
+ Erweiterungsbrücke aufrufen. Für KI-gesteuerte Änderungen sollte die Erweiterung
408
+ `agentNative.chat.send(...)` mit dem Selektor/Quell-ID des ausgewählten Elements
409
+ und der gewünschten Änderung aufrufen. Der Agent sollte zuerst `view-screen`
410
+ aufrufen und dann `apply-visual-edit` für Stil-, Klassen-, Text- oder
411
+ Verschiebungsänderungen an Elementen verwenden, oder `update-design` /
412
+ `generate-design` mit `canvasFrames` für Änderungen an der Platzierung der
413
+ Arbeitsfläche. Siehe [Extensions](/docs/extensions#what-an-extension-can-do)
414
+ für Sandbox, persistente Daten und Bridge-APIs.
415
+
351
416
  ### Anpassen
352
417
 
353
418
  Design ist eine vollständige, klonbare Vorlage. Einige praktische Erweiterungsideen:
@@ -118,6 +118,10 @@ El dominio skills sigue el mismo formato que el marco skills. Codifican patrones
118
118
 
119
119
  ## skills respaldado por aplicación {#app-backed-skills}
120
120
 
121
+ Las skills respaldadas por apps actuales incluyen `visual-plan` y `visual-recap`
122
+ de Plan, `visual-edit` de Design, `assets` de Assets y `content` para editar
123
+ docs/blog/MDX desde el repositorio.
124
+
121
125
  skills, respaldado por una aplicación, empaqueta una aplicación nativa del agente como un artefacto del mercado de habilidades. El paquete puede incluir instrucciones del agente, skills exportado, metadatos del conector MCP, instrucciones de inicio alojadas/locales y superficies UI como aplicaciones MCP.
122
126
 
123
127
  > **Detalles completos a continuación:** la mecánica de skills respaldado por aplicaciones (formato de manifiesto, comandos CLI, adaptadores de mercado, hash de actualización automática) se tratan en [App-backed skills — full details](#app-backed-skills-full).
@@ -328,6 +332,7 @@ trabajo sin conexión o uso sensible a la privacidad.
328
332
  ```bash
329
333
  # Camino feliz: instrucciones exportadas más conector MCP alojado.
330
334
  npx @agent-native/core@latest skills add visual-plan
335
+ npx @agent-native/core@latest skills add visual-edit
331
336
  npx @agent-native/core@latest skills add assets
332
337
 
333
338
  # Edición de docs/blog/MDX con Content primero en el repositorio.