@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.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +34 -0
- package/corpus/core/docs/content/locales/ar-SA/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +55 -1
- package/corpus/core/docs/content/locales/de-DE/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/de-DE/template-design.mdx +66 -1
- package/corpus/core/docs/content/locales/es-ES/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/es-ES/template-design.mdx +65 -1
- package/corpus/core/docs/content/locales/fr-FR/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +64 -1
- package/corpus/core/docs/content/locales/hi-IN/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +59 -1
- package/corpus/core/docs/content/locales/ja-JP/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +62 -1
- package/corpus/core/docs/content/locales/ko-KR/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +58 -1
- package/corpus/core/docs/content/locales/pt-BR/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +62 -1
- package/corpus/core/docs/content/locales/zh-CN/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +50 -1
- package/corpus/core/docs/content/locales/zh-TW/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +52 -1
- package/corpus/core/docs/content/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/template-design.mdx +59 -1
- package/corpus/core/package.json +2 -1
- package/corpus/core/src/agent/engine/index.ts +1 -0
- package/corpus/core/src/agent/engine/registry.ts +40 -0
- package/corpus/core/src/agent/production-agent.ts +6 -2
- package/corpus/core/src/application-state/handlers.ts +1 -1
- package/corpus/core/src/brand-kit/index.ts +1 -1
- package/corpus/core/src/cli/design-connect.ts +490 -0
- package/corpus/core/src/cli/index.ts +16 -0
- package/corpus/core/src/cli/skills.ts +144 -3
- package/corpus/core/src/client/AgentPanel.tsx +1 -1
- package/corpus/core/src/client/AssistantChat.tsx +43 -7
- package/corpus/core/src/client/MultiTabAssistantChat.tsx +1 -1
- package/corpus/core/src/client/agent-chat.ts +27 -3
- package/corpus/core/src/client/blocks/library/MermaidBlock.tsx +1 -1
- package/corpus/core/src/client/blocks/library/diagram.tsx +2 -2
- package/corpus/core/src/client/blocks/library/wireframe.tsx +1 -1
- package/corpus/core/src/client/chat/message-components.tsx +1 -1
- package/corpus/core/src/client/chat-model-groups.ts +1 -2
- package/corpus/core/src/client/components/LiveCursorOverlay.tsx +33 -66
- package/corpus/core/src/client/composer/TiptapComposer.tsx +99 -24
- package/corpus/core/src/client/composer/useVoiceDictation.ts +429 -260
- package/corpus/core/src/client/extensions/portable-extension.ts +1 -1
- package/corpus/core/src/client/frame-protocol.ts +17 -2
- package/corpus/core/src/client/rich-markdown-editor/RegistryBlockNode.tsx +2 -2
- package/corpus/core/src/client/sharing/ShareButton.tsx +20 -15
- package/corpus/core/src/client/use-agent-engine-configured.ts +80 -28
- package/corpus/core/src/code-agents/transcript-normalizer.ts +1 -1
- package/corpus/core/src/extensions/path.ts +1 -4
- package/corpus/core/src/integrations/a2a-continuation-processor.ts +1 -1
- package/corpus/core/src/mcp/build-server.ts +1 -1
- package/corpus/core/src/org/handlers.ts +5 -5
- package/corpus/core/src/org/plugin.ts +2 -2
- package/corpus/core/src/scripts/call-agent.ts +1 -1
- package/corpus/core/src/scripts/db/safety.ts +1 -1
- package/corpus/core/src/server/auth.ts +3 -0
- package/corpus/core/src/server/builder-design-systems.ts +308 -0
- package/corpus/core/src/server/core-routes-plugin.ts +29 -3
- package/corpus/core/src/server/index.ts +8 -0
- package/corpus/core/src/server/transcribe-voice.ts +57 -22
- package/corpus/core/src/shared/mcp-embed-headers.ts +23 -1
- package/corpus/core/src/styles/agent-native.css +60 -4
- package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
- package/corpus/core/src/usage/store.ts +2 -2
- package/corpus/core/src/vite/client.ts +2 -0
- package/corpus/core/src/voice/index.ts +18 -0
- package/corpus/core/src/voice/voice-cleanup-prompt.ts +38 -0
- package/corpus/core/src/voice/voice-context.ts +217 -0
- package/corpus/core/src/voice/voice-replacements.ts +75 -0
- package/corpus/templates/analytics/AGENTS.md +4 -3
- package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +298 -15
- package/corpus/templates/analytics/actions/get-sql-dashboard.ts +9 -4
- package/corpus/templates/analytics/actions/list-session-recordings.ts +6 -1
- package/corpus/templates/analytics/actions/mutate-dashboard.ts +18 -2
- package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +12 -2
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +557 -400
- package/corpus/templates/analytics/app/global.css +0 -4
- package/corpus/templates/analytics/app/hooks/use-replay-storage-status.ts +66 -0
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +39 -0
- package/corpus/templates/analytics/app/i18n-data.ts +424 -0
- package/corpus/templates/analytics/app/pages/Settings.tsx +333 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +2 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/dashboard-layout.ts +121 -3
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +82 -34
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +7 -0
- package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +144 -36
- package/corpus/templates/analytics/changelog/2026-06-28-ask-tab-now-matches-the-darker-app-background.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-28-dashboard-email-reports-now-use-cleaner-light-mode-snapshots.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-28-sessions-now-show-only-signed-in-recordings-with-playable-re.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-analytics-agents-can-now-place-new-charts-into-requested-das.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-analytics-queries-now-report-failed-source-query-errors-inst.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-charts-can-now-be-dropped-between-full-dashboard-rows-to-cre.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-dashboard-email-reports-include-the-full-dashboard-image-wit.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-main-surface-border-reaches-the-top.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-session-replay-now-records-playable-sessions-in-production-a.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-set-up-session-replay-storage-from-settings-connect-builder-.md +6 -0
- package/corpus/templates/analytics/scripts/cleanup-empty-session-recordings.ts +102 -0
- package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +3 -3
- package/corpus/templates/analytics/server/lib/dashboard-report.ts +75 -30
- package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +5 -2
- package/corpus/templates/analytics/server/lib/real-data-actions.ts +81 -20
- package/corpus/templates/analytics/server/lib/replay-storage.ts +79 -0
- package/corpus/templates/analytics/server/lib/s3-upload-provider.ts +255 -0
- package/corpus/templates/analytics/server/lib/session-replay.ts +53 -12
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +11 -2
- package/corpus/templates/analytics/server/plugins/onboarding.ts +97 -0
- package/corpus/templates/assets/app/components/layout/Sidebar.tsx +4 -4
- package/corpus/templates/assets/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
- package/corpus/templates/brain/app/components/layout/Layout.tsx +29 -2
- package/corpus/templates/brain/app/components/layout/Sidebar.tsx +131 -42
- package/corpus/templates/brain/app/i18n/zh-TW.ts +2 -0
- package/corpus/templates/brain/app/i18n-data.ts +20 -0
- package/corpus/templates/brain/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
- package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +29 -1
- package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +417 -299
- package/corpus/templates/calendar/app/i18n/zh-TW.ts +2 -0
- package/corpus/templates/calendar/app/i18n-data.ts +20 -0
- package/corpus/templates/calendar/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
- package/corpus/templates/chat/app/components/layout/Sidebar.tsx +6 -19
- package/corpus/templates/chat/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
- package/corpus/templates/clips/AGENTS.md +4 -0
- package/corpus/templates/clips/actions/cleanup-transcript.ts +39 -9
- package/corpus/templates/clips/actions/finalize-meeting.ts +81 -12
- package/corpus/templates/clips/actions/lib/agents-md-context.ts +4 -1
- package/corpus/templates/clips/app/components/library/library-layout.tsx +3 -3
- package/corpus/templates/clips/app/components/meetings/share-meeting-dialog.tsx +1 -1
- package/corpus/templates/clips/app/components/player/share-dialog.tsx +2 -2
- package/corpus/templates/clips/changelog/2026-06-28-left-sidebar-footer-controls-use-less-divider-chrome.md +6 -0
- package/corpus/templates/clips/desktop/src/lib/personal-vocabulary.ts +13 -8
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +24 -0
- package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +105 -5
- package/corpus/templates/clips/desktop/src/lib/voice-dictation.ts +60 -1
- package/corpus/templates/content/actions/set-image-alt-text.ts +1 -1
- package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +1 -1
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +1 -1
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +5 -5
- package/corpus/templates/content/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
- package/corpus/templates/content/shared/document-export.ts +1 -1
- package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -18
- package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +154 -0
- package/corpus/templates/design/AGENTS.md +95 -5
- package/corpus/templates/design/DESIGN.md +82 -0
- package/corpus/templates/design/DEVELOPING.md +43 -0
- package/corpus/templates/design/actions/add-localhost-screens.ts +453 -0
- package/corpus/templates/design/actions/apply-shader.ts +277 -0
- package/corpus/templates/design/actions/apply-visual-edit.ts +303 -0
- package/corpus/templates/design/actions/connect-localhost.ts +183 -0
- package/corpus/templates/design/actions/edit-design.ts +195 -42
- package/corpus/templates/design/actions/generate-design.ts +71 -1
- package/corpus/templates/design/actions/generate-screens.ts +193 -0
- package/corpus/templates/design/actions/get-code-layer-projection.ts +191 -0
- package/corpus/templates/design/actions/get-shader.ts +119 -0
- package/corpus/templates/design/actions/index-design-system-with-builder.ts +259 -0
- package/corpus/templates/design/actions/list-localhost-connections.ts +95 -0
- package/corpus/templates/design/actions/navigate.ts +55 -2
- package/corpus/templates/design/actions/update-file.ts +9 -2
- package/corpus/templates/design/actions/view-screen.ts +68 -1
- package/corpus/templates/design/agent-native.app-skill.json +10 -0
- package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +719 -0
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +2120 -103
- package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +74 -38
- package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +401 -0
- package/corpus/templates/design/app/components/design/EditPanel.tsx +3966 -440
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +1473 -0
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +3940 -147
- package/corpus/templates/design/app/components/design/QuestionFlow.tsx +700 -13
- package/corpus/templates/design/app/components/design/TweaksPanel.tsx +105 -63
- package/corpus/templates/design/app/components/design/index.ts +0 -5
- package/corpus/templates/design/app/components/design/inspector/AlignmentMatrix.tsx +353 -0
- package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +1589 -0
- package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +511 -0
- package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +395 -0
- package/corpus/templates/design/app/components/design/inspector/FigmaColorPicker.tsx +2010 -0
- package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +601 -0
- package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +242 -0
- package/corpus/templates/design/app/components/design/inspector/SHADER_INTEGRATION.md +420 -0
- package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +238 -0
- package/corpus/templates/design/app/components/design/inspector/ShaderControls.stories.tsx +71 -0
- package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +575 -0
- package/corpus/templates/design/app/components/design/inspector/ShaderEffectRow.tsx +106 -0
- package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +423 -0
- package/corpus/templates/design/app/components/design/inspector/figma-icons.tsx +741 -0
- package/corpus/templates/design/app/components/design/inspector/index.ts +87 -0
- package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +201 -0
- package/corpus/templates/design/app/components/design/types.ts +23 -0
- package/corpus/templates/design/app/components/layout/Layout.tsx +24 -13
- package/corpus/templates/design/app/components/layout/Sidebar.tsx +4 -4
- package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +474 -36
- package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +22 -5
- package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +24 -11
- package/corpus/templates/design/app/global.css +149 -5
- package/corpus/templates/design/app/hooks/use-agent-generating.ts +4 -0
- package/corpus/templates/design/app/hooks/use-navigation-state.ts +130 -8
- package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +329 -0
- package/corpus/templates/design/app/i18n/zh-TW.ts +277 -0
- package/corpus/templates/design/app/i18n-data.ts +3028 -1
- package/corpus/templates/design/app/pages/DesignEditor.tsx +5831 -904
- package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +57 -221
- package/corpus/templates/design/changelog/2026-06-28-annotate-mode-now-combines-drawing-and-comment-pins-in-one-c.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-design-editor-panel-borders-are-cleaner-so-the-canvas-edge-s.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-drawing-prompts-now-reliably-open-and-submit-to-the-design-a.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-editor-app-menus-now-use-an-outline-agent-native-mark-with-b.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-figma-style-code-design-mode.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-layer-selection-now-updates-chat-context-without-opening-the.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-layer-selections-now-preserve-hidden-and-locked-canvas-state.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-live-cursors-now-keep-names-beside-a-cleaner-pointer-marker.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-mode-switching-now-lives-in-a-compact-bottom-right-icon-dock.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-screen-overview-now-handles-zooming-drawing-opening-and-dele.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-screen-overview-now-selects-screens-on-click-and-opens-them-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-screen-overview-zooms-into-the-active-screen-with-smoother-e.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-selected-element-chips-in-chat-are-shorter-and-easier-to-sca.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-the-design-editor-toolbar-is-more-compact-and-the-app-menu-m.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-tweaks-now-live-at-the-top-of-the-design-sidebar-instead-of-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-tweaks-now-live-in-the-right-inspector-beside-the-design-tab.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-active-sidebar-rows-use-soft-highlights.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-agents-can-now-open-screen-overview-focus-screens-and-add.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-canvas-selection-no-longer-flashes-broken-prototype-html-whe.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-command-menu-selections-are-clearer-in-dark-mode.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-design-agents-now-edit-broad-copy-changes-more-reliably.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-design-editor-extensions-now-run-inline-beside-the-artboard.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-design-mode-top-chrome-now-groups-collaborators-preview-shar.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-element-selection-now-stays-on-the-intended-layer-after-sele.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-screen-overview-full-view-controls-now-sit-above-frames-inst.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-screen-overview-tools-can-draw-shapes-create-screens-and-kee.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-sidebars-use-darker-chrome-and-chat-warns-immediately.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-the-pen-tool-now-creates-anchor-based-bezier-vectors-with-ha.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-visual-edit-can-open-localhost-routes-as-url-backed-screens.md +6 -0
- package/corpus/templates/design/package.json +1 -0
- package/corpus/templates/design/server/db/schema.ts +26 -0
- package/corpus/templates/design/server/handlers/import-figma-system.ts +38 -85
- package/corpus/templates/design/server/lib/design-snapshot.ts +9 -1
- package/corpus/templates/design/server/plugins/agent-chat.ts +3 -0
- package/corpus/templates/design/shared/api.ts +27 -0
- package/corpus/templates/design/shared/canvas-frames.ts +103 -0
- package/corpus/templates/design/shared/canvas-math.ts +1058 -0
- package/corpus/templates/design/shared/code-layer.ts +2412 -0
- package/corpus/templates/design/shared/color-utils.ts +180 -0
- package/corpus/templates/design/shared/generation-session.ts +61 -0
- package/corpus/templates/design/shared/html-content.ts +21 -0
- package/corpus/templates/design/shared/pen-path.ts +207 -0
- package/corpus/templates/design/shared/shader-presets.ts +782 -0
- package/corpus/templates/design/shared/shader-safety.ts +137 -0
- package/corpus/templates/design/shared/source-mode.ts +237 -0
- package/corpus/templates/forms/app/components/layout/Sidebar.tsx +149 -6
- package/corpus/templates/forms/app/i18n/ar-SA.ts +2 -0
- package/corpus/templates/forms/app/i18n/de-DE.ts +2 -0
- package/corpus/templates/forms/app/i18n/en-US.ts +2 -0
- package/corpus/templates/forms/app/i18n/es-ES.ts +2 -0
- package/corpus/templates/forms/app/i18n/fr-FR.ts +2 -0
- package/corpus/templates/forms/app/i18n/hi-IN.ts +2 -0
- package/corpus/templates/forms/app/i18n/ja-JP.ts +2 -0
- package/corpus/templates/forms/app/i18n/ko-KR.ts +2 -0
- package/corpus/templates/forms/app/i18n/pt-BR.ts +2 -0
- package/corpus/templates/forms/app/i18n/zh-CN.ts +2 -0
- package/corpus/templates/forms/app/i18n/zh-TW.ts +2 -0
- package/corpus/templates/forms/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
- package/corpus/templates/macros/app/components/layout/AppLayout.tsx +2 -2
- package/corpus/templates/macros/changelog/2026-06-28-left-sidebar-footer-controls-use-less-divider-chrome.md +6 -0
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +408 -247
- package/corpus/templates/mail/app/i18n/ar-SA.ts +4 -0
- package/corpus/templates/mail/app/i18n/de-DE.ts +4 -0
- package/corpus/templates/mail/app/i18n/en-US.ts +4 -0
- package/corpus/templates/mail/app/i18n/es-ES.ts +4 -0
- package/corpus/templates/mail/app/i18n/fr-FR.ts +4 -0
- package/corpus/templates/mail/app/i18n/hi-IN.ts +4 -0
- package/corpus/templates/mail/app/i18n/ja-JP.ts +4 -0
- package/corpus/templates/mail/app/i18n/ko-KR.ts +4 -0
- package/corpus/templates/mail/app/i18n/pt-BR.ts +4 -0
- package/corpus/templates/mail/app/i18n/zh-CN.ts +4 -0
- package/corpus/templates/mail/app/i18n/zh-TW.ts +4 -0
- package/corpus/templates/mail/app/lib/utils.ts +2 -2
- package/corpus/templates/mail/changelog/2026-06-28-pinned-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
- package/corpus/templates/plan/app/components/layout/Sidebar.tsx +6 -8
- package/corpus/templates/plan/app/components/plan/wireframe/Wireframe.tsx +1 -1
- package/corpus/templates/plan/app/global.css +61 -78
- package/corpus/templates/plan/app/pages/PlansPage.tsx +8 -0
- package/corpus/templates/plan/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
- package/corpus/templates/plan/changelog/2026-06-28-plans-use-the-shared-neutral-light-and-dark-theme.md +6 -0
- package/corpus/templates/plan/changelog/2026-06-28-sending-open-feedback-from-a-plan-now-opens-the-inline-plan-.md +6 -0
- package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +9 -10
- package/corpus/templates/slides/AGENTS.md +3 -2
- package/corpus/templates/slides/actions/import-file.ts +26 -17
- package/corpus/templates/slides/actions/index-design-system-with-builder.ts +259 -0
- package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +35 -167
- package/corpus/templates/slides/app/components/design-system/fig-import-response.ts +9 -13
- package/corpus/templates/slides/app/components/layout/Sidebar.tsx +5 -5
- package/corpus/templates/slides/app/context/DeckContext.tsx +1 -1
- package/corpus/templates/slides/app/i18n/ar-SA.ts +9 -37
- package/corpus/templates/slides/app/i18n/de-DE.ts +10 -25
- package/corpus/templates/slides/app/i18n/en-US.ts +9 -26
- package/corpus/templates/slides/app/i18n/es-ES.ts +10 -28
- package/corpus/templates/slides/app/i18n/fr-FR.ts +10 -28
- package/corpus/templates/slides/app/i18n/hi-IN.ts +9 -26
- package/corpus/templates/slides/app/i18n/ja-JP.ts +10 -22
- package/corpus/templates/slides/app/i18n/ko-KR.ts +9 -23
- package/corpus/templates/slides/app/i18n/pt-BR.ts +10 -28
- package/corpus/templates/slides/app/i18n/zh-CN.ts +9 -22
- package/corpus/templates/slides/app/i18n/zh-TW.ts +9 -22
- package/corpus/templates/slides/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
- package/corpus/templates/slides/server/handlers/import-figma-system.ts +44 -12
- package/corpus/templates/slides/server/lib/chat-attachments.ts +1 -1
- package/corpus/templates/videos/app/components/NewCompositionPopover.tsx +1 -1
- package/corpus/templates/videos/app/components/Sidebar.tsx +2 -2
- package/corpus/templates/videos/app/components/layout/Layout.tsx +29 -2
- package/corpus/templates/videos/app/components/layout/NavSidebar.tsx +113 -30
- package/corpus/templates/videos/app/i18n/ar-SA.ts +2 -0
- package/corpus/templates/videos/app/i18n/de-DE.ts +2 -0
- package/corpus/templates/videos/app/i18n/en-US.ts +2 -0
- package/corpus/templates/videos/app/i18n/es-ES.ts +2 -0
- package/corpus/templates/videos/app/i18n/fr-FR.ts +2 -0
- package/corpus/templates/videos/app/i18n/hi-IN.ts +2 -0
- package/corpus/templates/videos/app/i18n/ja-JP.ts +2 -0
- package/corpus/templates/videos/app/i18n/ko-KR.ts +2 -0
- package/corpus/templates/videos/app/i18n/pt-BR.ts +2 -0
- package/corpus/templates/videos/app/i18n/zh-CN.ts +2 -0
- package/corpus/templates/videos/app/i18n/zh-TW.ts +2 -0
- package/corpus/templates/videos/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
- package/dist/agent/engine/index.d.ts +1 -1
- package/dist/agent/engine/index.d.ts.map +1 -1
- package/dist/agent/engine/index.js +1 -1
- package/dist/agent/engine/index.js.map +1 -1
- package/dist/agent/engine/registry.d.ts +9 -0
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +37 -0
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +4 -3
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/application-state/handlers.js +1 -1
- package/dist/application-state/handlers.js.map +1 -1
- package/dist/brand-kit/index.d.ts +1 -1
- package/dist/brand-kit/index.js +1 -1
- package/dist/brand-kit/index.js.map +1 -1
- package/dist/cli/design-connect.d.ts +52 -0
- package/dist/cli/design-connect.d.ts.map +1 -0
- package/dist/cli/design-connect.js +409 -0
- package/dist/cli/design-connect.js.map +1 -0
- package/dist/cli/index.js +15 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/skills.d.ts +3 -0
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +139 -3
- package/dist/cli/skills.js.map +1 -1
- package/dist/client/AgentPanel.js +1 -1
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +38 -8
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +1 -1
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/agent-chat.d.ts +6 -0
- package/dist/client/agent-chat.d.ts.map +1 -1
- package/dist/client/agent-chat.js +17 -3
- package/dist/client/agent-chat.js.map +1 -1
- package/dist/client/blocks/library/MermaidBlock.js +1 -1
- package/dist/client/blocks/library/MermaidBlock.js.map +1 -1
- package/dist/client/blocks/library/diagram.js +1 -1
- package/dist/client/blocks/library/diagram.js.map +1 -1
- package/dist/client/blocks/library/wireframe.js +1 -1
- package/dist/client/blocks/library/wireframe.js.map +1 -1
- package/dist/client/chat/message-components.js +1 -1
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/chat-model-groups.d.ts.map +1 -1
- package/dist/client/chat-model-groups.js +1 -2
- package/dist/client/chat-model-groups.js.map +1 -1
- package/dist/client/components/LiveCursorOverlay.d.ts +1 -2
- package/dist/client/components/LiveCursorOverlay.d.ts.map +1 -1
- package/dist/client/components/LiveCursorOverlay.js +19 -40
- package/dist/client/components/LiveCursorOverlay.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts +3 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +86 -24
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/composer/useVoiceDictation.d.ts +9 -0
- package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
- package/dist/client/composer/useVoiceDictation.js +154 -32
- package/dist/client/composer/useVoiceDictation.js.map +1 -1
- package/dist/client/extensions/portable-extension.d.ts +1 -1
- package/dist/client/extensions/portable-extension.d.ts.map +1 -1
- package/dist/client/extensions/portable-extension.js.map +1 -1
- package/dist/client/frame-protocol.d.ts +17 -2
- package/dist/client/frame-protocol.d.ts.map +1 -1
- package/dist/client/frame-protocol.js.map +1 -1
- package/dist/client/rich-markdown-editor/RegistryBlockNode.js +2 -2
- package/dist/client/rich-markdown-editor/RegistryBlockNode.js.map +1 -1
- package/dist/client/sharing/ShareButton.d.ts +2 -0
- package/dist/client/sharing/ShareButton.d.ts.map +1 -1
- package/dist/client/sharing/ShareButton.js +7 -6
- package/dist/client/sharing/ShareButton.js.map +1 -1
- package/dist/client/use-agent-engine-configured.d.ts +5 -0
- package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
- package/dist/client/use-agent-engine-configured.js +51 -25
- package/dist/client/use-agent-engine-configured.js.map +1 -1
- package/dist/code-agents/transcript-normalizer.js +1 -1
- package/dist/code-agents/transcript-normalizer.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/extensions/path.d.ts +1 -1
- package/dist/extensions/path.d.ts.map +1 -1
- package/dist/extensions/path.js.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +2 -2
- package/dist/integrations/a2a-continuation-processor.js +1 -1
- package/dist/integrations/a2a-continuation-processor.js.map +1 -1
- package/dist/mcp/build-server.d.ts +1 -1
- package/dist/mcp/build-server.d.ts.map +1 -1
- package/dist/mcp/build-server.js.map +1 -1
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/observability/routes.d.ts +5 -5
- package/dist/org/handlers.js +5 -5
- package/dist/org/handlers.js.map +1 -1
- package/dist/org/plugin.js +2 -2
- package/dist/org/plugin.js.map +1 -1
- package/dist/scripts/call-agent.js +1 -1
- package/dist/scripts/call-agent.js.map +1 -1
- package/dist/scripts/db/safety.js +1 -1
- package/dist/scripts/db/safety.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +3 -0
- package/dist/server/auth.js.map +1 -1
- package/dist/server/builder-design-systems.d.ts +28 -0
- package/dist/server/builder-design-systems.d.ts.map +1 -0
- package/dist/server/builder-design-systems.js +217 -0
- package/dist/server/builder-design-systems.js.map +1 -0
- package/dist/server/core-routes-plugin.d.ts +1 -0
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +20 -3
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/server/transcribe-voice.d.ts.map +1 -1
- package/dist/server/transcribe-voice.js +40 -24
- package/dist/server/transcribe-voice.js.map +1 -1
- package/dist/shared/mcp-embed-headers.d.ts +1 -0
- package/dist/shared/mcp-embed-headers.d.ts.map +1 -1
- package/dist/shared/mcp-embed-headers.js +20 -1
- package/dist/shared/mcp-embed-headers.js.map +1 -1
- package/dist/styles/agent-native.css +60 -4
- package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
- package/dist/usage/store.js +2 -2
- package/dist/usage/store.js.map +1 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +2 -0
- package/dist/vite/client.js.map +1 -1
- package/dist/voice/index.d.ts +5 -0
- package/dist/voice/index.d.ts.map +1 -0
- package/dist/voice/index.js +4 -0
- package/dist/voice/index.js.map +1 -0
- package/dist/voice/voice-cleanup-prompt.d.ts +6 -0
- package/dist/voice/voice-cleanup-prompt.d.ts.map +1 -0
- package/dist/voice/voice-cleanup-prompt.js +26 -0
- package/dist/voice/voice-cleanup-prompt.js.map +1 -0
- package/dist/voice/voice-context.d.ts +25 -0
- package/dist/voice/voice-context.d.ts.map +1 -0
- package/dist/voice/voice-context.js +156 -0
- package/dist/voice/voice-context.js.map +1 -0
- package/dist/voice/voice-replacements.d.ts +4 -0
- package/dist/voice/voice-replacements.d.ts.map +1 -0
- package/dist/voice/voice-replacements.js +52 -0
- package/dist/voice/voice-replacements.js.map +1 -0
- package/docs/content/locales/ar-SA/skills-guide.mdx +5 -0
- package/docs/content/locales/ar-SA/template-design.mdx +55 -1
- package/docs/content/locales/de-DE/skills-guide.mdx +5 -0
- package/docs/content/locales/de-DE/template-design.mdx +66 -1
- package/docs/content/locales/es-ES/skills-guide.mdx +5 -0
- package/docs/content/locales/es-ES/template-design.mdx +65 -1
- package/docs/content/locales/fr-FR/skills-guide.mdx +5 -0
- package/docs/content/locales/fr-FR/template-design.mdx +64 -1
- package/docs/content/locales/hi-IN/skills-guide.mdx +5 -0
- package/docs/content/locales/hi-IN/template-design.mdx +59 -1
- package/docs/content/locales/ja-JP/skills-guide.mdx +5 -0
- package/docs/content/locales/ja-JP/template-design.mdx +62 -1
- package/docs/content/locales/ko-KR/skills-guide.mdx +5 -0
- package/docs/content/locales/ko-KR/template-design.mdx +58 -1
- package/docs/content/locales/pt-BR/skills-guide.mdx +5 -0
- package/docs/content/locales/pt-BR/template-design.mdx +62 -1
- package/docs/content/locales/zh-CN/skills-guide.mdx +5 -0
- package/docs/content/locales/zh-CN/template-design.mdx +50 -1
- package/docs/content/locales/zh-TW/skills-guide.mdx +5 -0
- package/docs/content/locales/zh-TW/template-design.mdx +52 -1
- package/docs/content/skills-guide.mdx +5 -0
- package/docs/content/template-design.mdx +59 -1
- package/package.json +2 -1
- package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
- package/corpus/templates/design/actions/import-figma-file.ts +0 -166
- package/corpus/templates/design/app/components/design/DesignToolbar.tsx +0 -339
- package/corpus/templates/design/app/components/design/PresentMode.tsx +0 -68
- package/corpus/templates/design/app/components/design/ViewportTabs.tsx +0 -149
- package/corpus/templates/design/app/components/design/ZoomControls.tsx +0 -157
- package/corpus/templates/slides/server/lib/fig-design-system.ts +0 -110
|
@@ -41,6 +41,10 @@ export interface CapturedTranscript {
|
|
|
41
41
|
export interface TranscriptionCapture {
|
|
42
42
|
stop(): Promise<CapturedTranscript>;
|
|
43
43
|
cancel(): Promise<void>;
|
|
44
|
+
/** Suspend the audio engine without discarding the captured transcript. */
|
|
45
|
+
pause(): Promise<void>;
|
|
46
|
+
/** Restart the audio engine after a `pause()`. */
|
|
47
|
+
resume(): Promise<void>;
|
|
44
48
|
}
|
|
45
49
|
|
|
46
50
|
interface SpeechRecognitionResultLike {
|
|
@@ -154,6 +158,7 @@ async function startBrowserTranscriptionCapture(): Promise<TranscriptionCapture
|
|
|
154
158
|
const recognition = new Ctor();
|
|
155
159
|
let disposed = false;
|
|
156
160
|
let stopped = false;
|
|
161
|
+
let paused = false;
|
|
157
162
|
const transcriptBuffer = createWebSpeechTranscriptBuffer();
|
|
158
163
|
let stopResolver: ((value: CapturedTranscript) => void) | null = null;
|
|
159
164
|
let settleTimer: ReturnType<typeof window.setTimeout> | null = null;
|
|
@@ -195,11 +200,13 @@ async function startBrowserTranscriptionCapture(): Promise<TranscriptionCapture
|
|
|
195
200
|
|
|
196
201
|
recognition.onend = () => {
|
|
197
202
|
if (disposed) return;
|
|
198
|
-
transcriptBuffer.commitSession({ preserveInterim: stopped });
|
|
203
|
+
transcriptBuffer.commitSession({ preserveInterim: stopped || paused });
|
|
199
204
|
if (stopped) {
|
|
200
205
|
settleStop();
|
|
201
206
|
return;
|
|
202
207
|
}
|
|
208
|
+
// While paused, keep the committed transcript but don't restart the engine.
|
|
209
|
+
if (paused) return;
|
|
203
210
|
try {
|
|
204
211
|
recognition.start();
|
|
205
212
|
} catch (err) {
|
|
@@ -245,6 +252,29 @@ async function startBrowserTranscriptionCapture(): Promise<TranscriptionCapture
|
|
|
245
252
|
// ignore
|
|
246
253
|
}
|
|
247
254
|
},
|
|
255
|
+
async pause() {
|
|
256
|
+
if (disposed || stopped || paused) return;
|
|
257
|
+
paused = true;
|
|
258
|
+
console.log("[clips-recorder] transcription paused (web-speech)");
|
|
259
|
+
try {
|
|
260
|
+
recognition.stop();
|
|
261
|
+
} catch {
|
|
262
|
+
// ignore
|
|
263
|
+
}
|
|
264
|
+
},
|
|
265
|
+
async resume() {
|
|
266
|
+
if (disposed || stopped || !paused) return;
|
|
267
|
+
paused = false;
|
|
268
|
+
console.log("[clips-recorder] transcription resumed (web-speech)");
|
|
269
|
+
try {
|
|
270
|
+
recognition.start();
|
|
271
|
+
} catch (err) {
|
|
272
|
+
console.warn(
|
|
273
|
+
"[clips-recorder] Web Speech transcription resume failed:",
|
|
274
|
+
err,
|
|
275
|
+
);
|
|
276
|
+
}
|
|
277
|
+
},
|
|
248
278
|
};
|
|
249
279
|
}
|
|
250
280
|
|
|
@@ -260,6 +290,13 @@ export async function startTranscriptionCapture(
|
|
|
260
290
|
const lines: string[] = [];
|
|
261
291
|
const segments: SourcedTranscriptSegment[] = [];
|
|
262
292
|
let disposed = false;
|
|
293
|
+
let paused = false;
|
|
294
|
+
let desiredPaused = false;
|
|
295
|
+
let transitioning = false;
|
|
296
|
+
// When a pause stops the engine, Whisper still flushes trailing finals
|
|
297
|
+
// asynchronously. Track when those are expected to have landed so a stop
|
|
298
|
+
// soon after a pause waits for them instead of dropping the last words.
|
|
299
|
+
let pauseFinalsSettleUntil = 0;
|
|
263
300
|
const unlistens: UnlistenFn[] = [];
|
|
264
301
|
|
|
265
302
|
const cleanup = () => {
|
|
@@ -299,8 +336,59 @@ export async function startTranscriptionCapture(
|
|
|
299
336
|
: null;
|
|
300
337
|
}
|
|
301
338
|
|
|
339
|
+
// Pause/resume run fire-and-forget from the recorder, so a quick
|
|
340
|
+
// pause→resume can arrive while a transition is still awaiting the engine.
|
|
341
|
+
// Track the desired state and re-apply once the in-flight transition settles
|
|
342
|
+
// so the last request always wins (instead of being dropped).
|
|
343
|
+
const applyAudioState = async () => {
|
|
344
|
+
if (transitioning || disposed || desiredPaused === paused) return;
|
|
345
|
+
transitioning = true;
|
|
346
|
+
try {
|
|
347
|
+
if (desiredPaused) {
|
|
348
|
+
await stopTranscriptionEngine(engine);
|
|
349
|
+
paused = true;
|
|
350
|
+
pauseFinalsSettleUntil = Date.now() + WHISPER_STOP_SETTLE_MS;
|
|
351
|
+
console.log(`[clips-recorder] transcription paused (${engine})`);
|
|
352
|
+
} else {
|
|
353
|
+
engine = await startTranscriptionEngine({ mic, captureSystem });
|
|
354
|
+
// stop()/cancel() can run during the await above; if it did, the new
|
|
355
|
+
// engine would leak (mic/system capture stays live). Tear it down.
|
|
356
|
+
if (disposed) {
|
|
357
|
+
await stopTranscriptionEngine(engine).catch(() => {});
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
paused = false;
|
|
361
|
+
console.log(`[clips-recorder] transcription resumed (${engine})`);
|
|
362
|
+
}
|
|
363
|
+
} catch (err) {
|
|
364
|
+
// Transition failed. Keep `desiredPaused` as the still-unmet intent (don't
|
|
365
|
+
// reset it) so the next pause/resume toggle retries and converges, and
|
|
366
|
+
// return early so we don't busy-loop re-applying a persistently failing
|
|
367
|
+
// transition. `paused` still reflects the real engine state.
|
|
368
|
+
console.warn(
|
|
369
|
+
`[clips-recorder] transcription ${desiredPaused ? "pause" : "resume"} failed; engine still ${paused ? "paused" : "live"}:`,
|
|
370
|
+
err,
|
|
371
|
+
);
|
|
372
|
+
// `finally` resets `transitioning`; returning skips the auto re-apply.
|
|
373
|
+
return;
|
|
374
|
+
} finally {
|
|
375
|
+
transitioning = false;
|
|
376
|
+
}
|
|
377
|
+
// Re-apply in case the desired state changed mid-transition.
|
|
378
|
+
void applyAudioState();
|
|
379
|
+
};
|
|
380
|
+
|
|
302
381
|
return {
|
|
303
382
|
async stop() {
|
|
383
|
+
// Already paused: the engine is stopped, but the pause-time flush may
|
|
384
|
+
// still be in flight. Wait out any remaining settle window so trailing
|
|
385
|
+
// finals land before we drop the listener.
|
|
386
|
+
if (paused) {
|
|
387
|
+
const remaining = pauseFinalsSettleUntil - Date.now();
|
|
388
|
+
if (remaining > 0) await wait(remaining);
|
|
389
|
+
cleanup();
|
|
390
|
+
return captured();
|
|
391
|
+
}
|
|
304
392
|
try {
|
|
305
393
|
await stopTranscriptionEngine(engine);
|
|
306
394
|
} catch (err) {
|
|
@@ -314,12 +402,24 @@ export async function startTranscriptionCapture(
|
|
|
314
402
|
return captured();
|
|
315
403
|
},
|
|
316
404
|
async cancel() {
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
405
|
+
if (!paused) {
|
|
406
|
+
try {
|
|
407
|
+
await stopTranscriptionEngine(engine);
|
|
408
|
+
} catch {
|
|
409
|
+
// ignore
|
|
410
|
+
}
|
|
321
411
|
}
|
|
322
412
|
cleanup();
|
|
323
413
|
},
|
|
414
|
+
async pause() {
|
|
415
|
+
if (disposed) return;
|
|
416
|
+
desiredPaused = true;
|
|
417
|
+
await applyAudioState();
|
|
418
|
+
},
|
|
419
|
+
async resume() {
|
|
420
|
+
if (disposed) return;
|
|
421
|
+
desiredPaused = false;
|
|
422
|
+
await applyAudioState();
|
|
423
|
+
},
|
|
324
424
|
};
|
|
325
425
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { VoiceContextPack } from "@agent-native/core/voice";
|
|
1
2
|
import { invoke } from "@tauri-apps/api/core";
|
|
2
3
|
import { emit, listen } from "@tauri-apps/api/event";
|
|
3
4
|
|
|
@@ -5,6 +6,7 @@ import { applyBacktrack } from "./backtrack";
|
|
|
5
6
|
import {
|
|
6
7
|
configureVocabularyClient,
|
|
7
8
|
loadVocabulary,
|
|
9
|
+
loadVocabularyEntries,
|
|
8
10
|
recordPasteForLearn,
|
|
9
11
|
} from "./personal-vocabulary";
|
|
10
12
|
import {
|
|
@@ -312,6 +314,7 @@ async function transcribe(
|
|
|
312
314
|
providerPref: ServerVoiceProvider,
|
|
313
315
|
controller: AbortController,
|
|
314
316
|
instructions?: string,
|
|
317
|
+
contextPack?: VoiceContextPack,
|
|
315
318
|
): Promise<string> {
|
|
316
319
|
const audioBlob = new Blob(chunks, { type: mimeType });
|
|
317
320
|
const form = new FormData();
|
|
@@ -329,6 +332,7 @@ async function transcribe(
|
|
|
329
332
|
if (trimmedInstructions) {
|
|
330
333
|
form.append("instructions", trimmedInstructions);
|
|
331
334
|
}
|
|
335
|
+
appendVoiceContext(form, contextPack);
|
|
332
336
|
// Aggressive timeout — short clips should transcribe in well under
|
|
333
337
|
// 2 seconds with Gemini Flash Lite or Whisper. If the server hasn't
|
|
334
338
|
// come back in 8s it's hanging; abort and let the bar dismiss with an
|
|
@@ -367,6 +371,7 @@ async function cleanupTranscript(
|
|
|
367
371
|
providerPref: ServerVoiceProvider,
|
|
368
372
|
controller: AbortController,
|
|
369
373
|
instructions?: string,
|
|
374
|
+
contextPack?: VoiceContextPack,
|
|
370
375
|
): Promise<string> {
|
|
371
376
|
const form = new FormData();
|
|
372
377
|
form.append("text", text);
|
|
@@ -375,6 +380,7 @@ async function cleanupTranscript(
|
|
|
375
380
|
if (trimmedInstructions) {
|
|
376
381
|
form.append("instructions", trimmedInstructions);
|
|
377
382
|
}
|
|
383
|
+
appendVoiceContext(form, contextPack);
|
|
378
384
|
|
|
379
385
|
const timeout = window.setTimeout(() => controller.abort(), 8_000);
|
|
380
386
|
try {
|
|
@@ -400,6 +406,18 @@ async function cleanupTranscript(
|
|
|
400
406
|
}
|
|
401
407
|
}
|
|
402
408
|
|
|
409
|
+
function appendVoiceContext(
|
|
410
|
+
form: FormData,
|
|
411
|
+
contextPack: VoiceContextPack | undefined,
|
|
412
|
+
): void {
|
|
413
|
+
if (!contextPack) return;
|
|
414
|
+
try {
|
|
415
|
+
form.append("voiceContext", JSON.stringify(contextPack));
|
|
416
|
+
} catch {
|
|
417
|
+
/* best effort */
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
|
|
403
421
|
export function installDesktopVoiceDictation(
|
|
404
422
|
options: DesktopVoiceDictationOptions,
|
|
405
423
|
): () => void {
|
|
@@ -640,6 +658,7 @@ export function installDesktopVoiceDictation(
|
|
|
640
658
|
const controller = new AbortController();
|
|
641
659
|
target.transcribeAbort = controller;
|
|
642
660
|
try {
|
|
661
|
+
const contextPack = await buildDesktopVoiceContextPack();
|
|
643
662
|
text =
|
|
644
663
|
(await cleanupTranscript(
|
|
645
664
|
serverUrl,
|
|
@@ -647,6 +666,7 @@ export function installDesktopVoiceDictation(
|
|
|
647
666
|
target.cleanupProvider,
|
|
648
667
|
controller,
|
|
649
668
|
instructions,
|
|
669
|
+
contextPack,
|
|
650
670
|
)) || original;
|
|
651
671
|
} catch (err) {
|
|
652
672
|
if ((err as { name?: string })?.name !== "AbortError") {
|
|
@@ -709,6 +729,42 @@ export function installDesktopVoiceDictation(
|
|
|
709
729
|
micDeviceLabel: micDeviceLabel || null,
|
|
710
730
|
});
|
|
711
731
|
|
|
732
|
+
const buildDesktopVoiceContextPack = async (): Promise<
|
|
733
|
+
VoiceContextPack | undefined
|
|
734
|
+
> => {
|
|
735
|
+
const vocabulary = await loadVocabularyEntries().catch(() => []);
|
|
736
|
+
const terms = vocabulary.map((entry) => ({
|
|
737
|
+
term: entry.term,
|
|
738
|
+
replacement: entry.replacement,
|
|
739
|
+
confidence: entry.confidence,
|
|
740
|
+
source: "learned-correction",
|
|
741
|
+
scope: "user",
|
|
742
|
+
}));
|
|
743
|
+
const snippets: NonNullable<VoiceContextPack["snippets"]> = [
|
|
744
|
+
{ label: "Target surface", value: "Desktop dictation paste" },
|
|
745
|
+
];
|
|
746
|
+
if (micDeviceLabel) {
|
|
747
|
+
snippets.push({ label: "Microphone", value: micDeviceLabel });
|
|
748
|
+
}
|
|
749
|
+
if (instructions.trim()) {
|
|
750
|
+
snippets.push({
|
|
751
|
+
label: "Saved voice instructions",
|
|
752
|
+
value: instructions.trim().slice(0, 1200),
|
|
753
|
+
});
|
|
754
|
+
}
|
|
755
|
+
return {
|
|
756
|
+
surface: "clips-desktop",
|
|
757
|
+
mode: "dictation",
|
|
758
|
+
snippets,
|
|
759
|
+
terms,
|
|
760
|
+
metadata: {
|
|
761
|
+
provider,
|
|
762
|
+
locale: navigator.language || "en-US",
|
|
763
|
+
micDeviceLabel: micDeviceLabel || null,
|
|
764
|
+
},
|
|
765
|
+
};
|
|
766
|
+
};
|
|
767
|
+
|
|
712
768
|
/**
|
|
713
769
|
* Server-path: capture audio with MediaRecorder, POST it to the
|
|
714
770
|
* transcribe-voice endpoint on Fn-up, paste the response text. The
|
|
@@ -790,6 +846,7 @@ export function installDesktopVoiceDictation(
|
|
|
790
846
|
const controller = new AbortController();
|
|
791
847
|
next.transcribeAbort = controller;
|
|
792
848
|
try {
|
|
849
|
+
const contextPack = await buildDesktopVoiceContextPack();
|
|
793
850
|
const text = await transcribe(
|
|
794
851
|
serverUrl,
|
|
795
852
|
next.chunks,
|
|
@@ -797,6 +854,7 @@ export function installDesktopVoiceDictation(
|
|
|
797
854
|
providerPref,
|
|
798
855
|
controller,
|
|
799
856
|
instructions,
|
|
857
|
+
contextPack,
|
|
800
858
|
);
|
|
801
859
|
if (next.cancelled) {
|
|
802
860
|
cleanup(next);
|
|
@@ -920,7 +978,8 @@ export function installDesktopVoiceDictation(
|
|
|
920
978
|
// metadata to `native_speech_start` without also carrying vocabulary.
|
|
921
979
|
// Best-effort — if the load failed we just stage an empty list and
|
|
922
980
|
// the recognizer behaves as before.
|
|
923
|
-
const
|
|
981
|
+
const vocabularyEntries = await loadVocabularyEntries().catch(() => []);
|
|
982
|
+
const contextualStrings = vocabularyEntries.map((v) => v.replacement);
|
|
924
983
|
await invoke("native_speech_set_vocabulary", {
|
|
925
984
|
strings: contextualStrings,
|
|
926
985
|
}).catch(() => {});
|
|
@@ -52,7 +52,7 @@ function imageAltCandidates({
|
|
|
52
52
|
const candidates: ImageAltCandidate[] = [];
|
|
53
53
|
|
|
54
54
|
const markdownImagePattern = new RegExp(
|
|
55
|
-
`!\\[[^\\]]*\\]\\((${escapedUrl})(\\s
|
|
55
|
+
`!\\[[^\\]]*\\]\\((${escapedUrl})(\\s+"[^"]*")?\\)`,
|
|
56
56
|
"g",
|
|
57
57
|
);
|
|
58
58
|
for (const match of content.matchAll(markdownImagePattern)) {
|
|
@@ -7824,7 +7824,7 @@ function DatabaseTimelineView({
|
|
|
7824
7824
|
<div
|
|
7825
7825
|
key={`${dateKey}-header`}
|
|
7826
7826
|
className={cn(
|
|
7827
|
-
"sticky top-0 z-10 grid gap-0.5 border-r border-b border-border bg-background
|
|
7827
|
+
"sticky top-0 z-10 grid gap-0.5 border-r border-b border-border bg-background px-2 py-2 last:border-r-0",
|
|
7828
7828
|
!inMonth && "bg-muted/70",
|
|
7829
7829
|
)}
|
|
7830
7830
|
style={{ gridColumn: index + 1, gridRow: 1 }}
|
|
@@ -7767,7 +7767,7 @@ function DatabaseTimelineView({
|
|
|
7767
7767
|
<div
|
|
7768
7768
|
key={`${dateKey}-header`}
|
|
7769
7769
|
className={cn(
|
|
7770
|
-
"sticky top-0 z-10 grid gap-0.5 border-r border-b border-border bg-background
|
|
7770
|
+
"sticky top-0 z-10 grid gap-0.5 border-r border-b border-border bg-background px-2 py-2 last:border-r-0",
|
|
7771
7771
|
!inMonth && "bg-muted/70",
|
|
7772
7772
|
)}
|
|
7773
7773
|
style={{ gridColumn: index + 1, gridRow: 1 }}
|
|
@@ -701,7 +701,7 @@ export function DocumentSidebar({
|
|
|
701
701
|
|
|
702
702
|
if (collapsed) {
|
|
703
703
|
return (
|
|
704
|
-
<div className="flex
|
|
704
|
+
<div className="flex h-full w-12 flex-col items-center gap-1 border-e border-border bg-muted/30 py-3 transition-[width] duration-200 ease-out">
|
|
705
705
|
<Tooltip>
|
|
706
706
|
<TooltipTrigger asChild>
|
|
707
707
|
<button
|
|
@@ -763,7 +763,7 @@ export function DocumentSidebar({
|
|
|
763
763
|
return (
|
|
764
764
|
<div
|
|
765
765
|
className={cn(
|
|
766
|
-
"agent-layout-left-drawer relative flex h-full min-h-0 flex-col border-e border-border bg-muted/30",
|
|
766
|
+
"agent-layout-left-drawer relative flex h-full min-h-0 flex-col border-e border-border bg-muted/30 transition-[width] duration-200 ease-out",
|
|
767
767
|
width === undefined && "w-full",
|
|
768
768
|
)}
|
|
769
769
|
style={width === undefined ? undefined : { width, flexShrink: 0 }}
|
|
@@ -962,14 +962,14 @@ export function DocumentSidebar({
|
|
|
962
962
|
</div>
|
|
963
963
|
</ScrollArea>
|
|
964
964
|
|
|
965
|
-
<div className="shrink-0
|
|
965
|
+
<div className="shrink-0 px-3 py-2">
|
|
966
966
|
<div className="space-y-1">
|
|
967
967
|
{renderLocalFilesNavButton()}
|
|
968
968
|
{renderSettingsNavButton()}
|
|
969
969
|
</div>
|
|
970
970
|
</div>
|
|
971
971
|
|
|
972
|
-
<div className="shrink-0
|
|
972
|
+
<div className="shrink-0">
|
|
973
973
|
<ExtensionSlot
|
|
974
974
|
id="content.sidebar.bottom"
|
|
975
975
|
context={{
|
|
@@ -985,7 +985,7 @@ export function DocumentSidebar({
|
|
|
985
985
|
</div>
|
|
986
986
|
|
|
987
987
|
{/* Footer */}
|
|
988
|
-
<div className="shrink-0 space-y-2
|
|
988
|
+
<div className="shrink-0 space-y-2 px-3 py-2">
|
|
989
989
|
<OrgSwitcher />
|
|
990
990
|
{isCodeMode ? <DevDatabaseLink /> : null}
|
|
991
991
|
<div className="flex items-center gap-1">
|
|
@@ -115,7 +115,7 @@ function inlineMarkdownToHtml(text: string): string {
|
|
|
115
115
|
.replace(/\*\*([^*]+)\*\*/g, "<strong>$1</strong>")
|
|
116
116
|
.replace(/__([^_]+)__/g, "<strong>$1</strong>")
|
|
117
117
|
.replace(/~~([^~]+)~~/g, "<s>$1</s>")
|
|
118
|
-
.replace(/(^|[
|
|
118
|
+
.replace(/(^|[^*])\*([^*]+)\*/g, "$1<em>$2</em>")
|
|
119
119
|
.replace(/(^|[^_])_([^_]+)_/g, "$1<em>$2</em>");
|
|
120
120
|
}
|
|
121
121
|
|
|
@@ -145,18 +145,18 @@ Returns CSS custom properties, colors, fonts, Google Fonts links, theme-color, O
|
|
|
145
145
|
### Source: GitHub Repository
|
|
146
146
|
|
|
147
147
|
```bash
|
|
148
|
-
pnpm action
|
|
148
|
+
pnpm action index-design-system-with-builder --githubRepoUrl "https://github.com/acme/ui"
|
|
149
149
|
```
|
|
150
150
|
|
|
151
|
-
|
|
151
|
+
Starts Builder design-system indexing for the repository. Builder is the source of truth for the indexed brand kit, generated docs, and usage guidance. If Builder is not connected, stop and ask the user to connect Builder.
|
|
152
152
|
|
|
153
153
|
### Source: Local Code Files
|
|
154
154
|
|
|
155
155
|
```bash
|
|
156
|
-
pnpm action
|
|
156
|
+
pnpm action index-design-system-with-builder --codeFiles '[{"filename":"globals.css","content":"..."}]'
|
|
157
157
|
```
|
|
158
158
|
|
|
159
|
-
|
|
159
|
+
Uploads code/design files to Builder and starts design-system indexing. Do not create a local design system from uploaded code files unless the user explicitly asks for a manual local fallback.
|
|
160
160
|
|
|
161
161
|
### Source: Documents (DOCX, PPTX, PDF)
|
|
162
162
|
|
|
@@ -192,20 +192,10 @@ effects to CSS box-shadow, and text styles to font tokens; snap spacing to a
|
|
|
192
192
|
4/8px scale. If no Figma MCP is connected, ask the user to paste the token
|
|
193
193
|
values or describe the file.
|
|
194
194
|
|
|
195
|
-
**When the user uploads a raw `.fig` file**,
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
pnpm action import-figma-file --fileBase64 "<base64 of the .fig>" # or --fileDataUrl
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
It decodes the binary `.fig`, returns `frames` (each Figma frame rendered to
|
|
203
|
-
HTML), an extracted `designSystem` (colors with assigned roles, typography,
|
|
204
|
-
spacing, radius, shadows — ready for `DesignSystemData`), and image metadata.
|
|
205
|
-
It's read-only/preview: review the result, then call `create-design-system`
|
|
206
|
-
with the `designSystem` and/or `create-design` + `generate-design` with the
|
|
207
|
-
`frames`. The full `palette` is returned too, so re-assign a color role if a
|
|
208
|
-
heuristic looks off.
|
|
195
|
+
**When the user uploads a raw `.fig` file**, send it to Builder design-system
|
|
196
|
+
indexing through the setup page upload route. Do not parse `.fig` files locally
|
|
197
|
+
and do not call `create-design-system` from raw `.fig` output; Builder owns the
|
|
198
|
+
indexed brand kit, generated docs, and usage guidance.
|
|
209
199
|
|
|
210
200
|
### Source: Brand Analysis (combines website + notes)
|
|
211
201
|
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: visual-edit
|
|
3
|
+
description: >-
|
|
4
|
+
Open a running local app in Design overview mode as URL-backed iframe screens
|
|
5
|
+
for visual editing, flow review, duplication, and route-state exploration.
|
|
6
|
+
metadata:
|
|
7
|
+
visibility: exported
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Visual Edit
|
|
11
|
+
|
|
12
|
+
Use `/visual-edit` when the user wants to inspect or edit a real local app
|
|
13
|
+
visually instead of generating standalone Alpine HTML. The source of truth is
|
|
14
|
+
the running localhost app plus its route URLs. Design shows those routes as
|
|
15
|
+
iframe-backed screens on the infinite canvas.
|
|
16
|
+
|
|
17
|
+
## Core Model
|
|
18
|
+
|
|
19
|
+
- Each screen is a URL-backed iframe, not copied HTML.
|
|
20
|
+
- Each screen keeps its own URL metadata: `connectionId`, `routeId`, `path`,
|
|
21
|
+
`url`, `bridgeUrl`, title, and viewport size.
|
|
22
|
+
- Start in Design's screen overview mode. The user can edit/select/drop on any
|
|
23
|
+
visible screen from the overview canvas.
|
|
24
|
+
- In overview, screens are static like Figma frames: no iframe scrolling or app
|
|
25
|
+
interaction. Full-screen focus is for scrolling and app interaction.
|
|
26
|
+
- Alt-drag duplicates a screen. For localhost screens, duplication copies the
|
|
27
|
+
iframe frame and URL metadata; change the copy's path/query when you need a
|
|
28
|
+
new flow state.
|
|
29
|
+
- Flow visualization is just multiple URL states: `/checkout?step=shipping`,
|
|
30
|
+
`/checkout?step=payment`, `/checkout?step=done`, etc.
|
|
31
|
+
- When the user gives a named flow or numbered screen list, preserve that order
|
|
32
|
+
and create one screen per URL/path. Shorthand like
|
|
33
|
+
`localhost:1234/onboarding/1` means `http://localhost:1234/onboarding/1`.
|
|
34
|
+
|
|
35
|
+
## Required Local Bridge
|
|
36
|
+
|
|
37
|
+
From the target app repo, make sure its dev server is running, then run the
|
|
38
|
+
Design bridge with `npx`:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npx @agent-native/core@latest design connect --url http://localhost:5173 --root .
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Use the app's real port. The command starts a local bridge on
|
|
45
|
+
`http://127.0.0.1:7331` by default and exposes:
|
|
46
|
+
|
|
47
|
+
- `GET /manifest.json` — dev server URL, bridge URL, discovered routes, root.
|
|
48
|
+
- `GET /routes.json` — route manifest only.
|
|
49
|
+
- `GET /health` — bridge liveness.
|
|
50
|
+
|
|
51
|
+
For one-shot agent setup, ask for JSON and keep the long-running bridge open in
|
|
52
|
+
a second terminal if the user needs live updates:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
npx @agent-native/core@latest design connect --url http://localhost:5173 --root . --json
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Action Flow
|
|
59
|
+
|
|
60
|
+
1. Register or refresh the bridge in Design:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
pnpm action connect-localhost '{
|
|
64
|
+
"devServerUrl": "http://localhost:5173",
|
|
65
|
+
"bridgeUrl": "http://127.0.0.1:7331",
|
|
66
|
+
"rootPath": ".",
|
|
67
|
+
"routeManifest": { "version": 1, "sourceType": "localhost", "routes": [] }
|
|
68
|
+
}'
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Prefer passing the actual `/manifest.json` result as `routeManifest` and
|
|
72
|
+
`capabilities`. Keep any local filesystem paths out of user-facing summaries
|
|
73
|
+
unless the user asks.
|
|
74
|
+
|
|
75
|
+
2. Create or reuse a Design project:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
pnpm action create-design --title "Local app visual edit" --projectType prototype
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
3. Place URL-backed screens on the overview canvas:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
pnpm action add-localhost-screens '{
|
|
85
|
+
"designId": "<design-id>",
|
|
86
|
+
"connectionId": "<connection-id>",
|
|
87
|
+
"routes": [
|
|
88
|
+
{ "path": "/", "title": "Home", "width": 1280, "height": 900 },
|
|
89
|
+
{ "path": "/pricing", "title": "Pricing", "width": 1280, "height": 900 },
|
|
90
|
+
{ "path": "/checkout?step=payment", "title": "Checkout payment", "width": 1280, "height": 900 }
|
|
91
|
+
],
|
|
92
|
+
"startX": 0,
|
|
93
|
+
"startY": 0,
|
|
94
|
+
"gap": 160
|
|
95
|
+
}'
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
For a numbered flow the user describes in chat, keep the labels and order:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
pnpm action add-localhost-screens '{
|
|
102
|
+
"designId": "<design-id>",
|
|
103
|
+
"connectionId": "<connection-id>",
|
|
104
|
+
"routes": [
|
|
105
|
+
{ "url": "localhost:1234/onboarding/1", "title": "Screen 1" },
|
|
106
|
+
{ "url": "localhost:1234/onboarding/2", "title": "Screen 2" },
|
|
107
|
+
{ "url": "localhost:1234/onboarding/3", "title": "Screen 3" }
|
|
108
|
+
]
|
|
109
|
+
}'
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
If no `routes` or `paths` are supplied, `add-localhost-screens` uses every route
|
|
113
|
+
from the latest localhost manifest. Use `paths` for a concise flow:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
pnpm action add-localhost-screens '{
|
|
117
|
+
"designId": "<design-id>",
|
|
118
|
+
"paths": ["/", "/pricing", "/checkout?step=payment"]
|
|
119
|
+
}'
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
4. Navigate the user to overview mode:
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
pnpm action navigate --view editor --designId "<design-id>" --editorView overview
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Editing URLs
|
|
129
|
+
|
|
130
|
+
To change a localhost screen's URL, update that screen through
|
|
131
|
+
`add-localhost-screens` again using the same route-derived filename/path or use
|
|
132
|
+
normal Design screen duplication followed by a route/path update. Keep the file
|
|
133
|
+
content as the absolute URL and keep `screenMetadata[fileId]` aligned:
|
|
134
|
+
|
|
135
|
+
```json
|
|
136
|
+
{
|
|
137
|
+
"sourceType": "localhost",
|
|
138
|
+
"previewState": "live",
|
|
139
|
+
"url": "http://localhost:5173/checkout?step=done",
|
|
140
|
+
"previewUrl": "http://localhost:5173/checkout?step=done",
|
|
141
|
+
"path": "/checkout?step=done"
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Do not replace localhost screens with copied `srcdoc` HTML unless the user
|
|
146
|
+
explicitly asks to freeze a snapshot.
|
|
147
|
+
|
|
148
|
+
## Verification
|
|
149
|
+
|
|
150
|
+
- `list-localhost-connections` returns the expected connection and routes.
|
|
151
|
+
- The Design editor opens in overview mode.
|
|
152
|
+
- Every requested screen renders the intended localhost URL.
|
|
153
|
+
- Alt-dragging a screen copies the URL-backed frame, not an inline HTML clone.
|
|
154
|
+
- A query/path edit changes only the target screen's URL metadata and iframe.
|