@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
|
@@ -149,6 +149,8 @@ const messages = {
|
|
|
149
149
|
"已從 Google Calendar 同步 {{count}} 個事件",
|
|
150
150
|
},
|
|
151
151
|
sidebar: {
|
|
152
|
+
collapseSidebar: "收合側邊欄",
|
|
153
|
+
expandSidebar: "展開側邊欄",
|
|
152
154
|
addGoogleAccount: "新增 Google 帳號",
|
|
153
155
|
colorByMeetingType: "按會議型別著色(外部、內部、一對一、小組等)",
|
|
154
156
|
googleCalendarSettings: "Google Calendar 設定",
|
|
@@ -161,6 +161,8 @@ const enUS = {
|
|
|
161
161
|
"Synced {{count}} events from Google Calendar",
|
|
162
162
|
},
|
|
163
163
|
sidebar: {
|
|
164
|
+
collapseSidebar: "Collapse sidebar",
|
|
165
|
+
expandSidebar: "Expand sidebar",
|
|
164
166
|
addGoogleAccount: "Add Google account",
|
|
165
167
|
colorByMeetingType:
|
|
166
168
|
"Color by meeting type (external, internal, 1:1, group, etc.)",
|
|
@@ -6133,6 +6135,8 @@ const translatedCalendarRemainingRaw = {
|
|
|
6133
6135
|
"已从 Google Calendar 同步 {{count}} 个事件",
|
|
6134
6136
|
},
|
|
6135
6137
|
sidebar: {
|
|
6138
|
+
collapseSidebar: "折叠侧边栏",
|
|
6139
|
+
expandSidebar: "展开侧边栏",
|
|
6136
6140
|
addGoogleAccount: "添加 Google 账号",
|
|
6137
6141
|
colorByMeetingType: "按会议类型着色(外部、内部、一对一、小组等)",
|
|
6138
6142
|
googleCalendarSettings: "Google Calendar 设置",
|
|
@@ -6254,6 +6258,8 @@ const translatedCalendarRemainingRaw = {
|
|
|
6254
6258
|
"{{count}} eventos sincronizados desde Google Calendar",
|
|
6255
6259
|
},
|
|
6256
6260
|
sidebar: {
|
|
6261
|
+
collapseSidebar: "Contraer barra lateral",
|
|
6262
|
+
expandSidebar: "Expandir barra lateral",
|
|
6257
6263
|
addGoogleAccount: "Añadir cuenta de Google",
|
|
6258
6264
|
colorByMeetingType:
|
|
6259
6265
|
"Color por tipo de reunión (externa, interna, 1:1, grupo, etc.)",
|
|
@@ -6592,6 +6598,8 @@ const translatedCalendarExactCleanup = {
|
|
|
6592
6598
|
"{{count}} événements synchronisés depuis Google Calendar",
|
|
6593
6599
|
},
|
|
6594
6600
|
sidebar: {
|
|
6601
|
+
collapseSidebar: "Réduire la barre latérale",
|
|
6602
|
+
expandSidebar: "Développer la barre latérale",
|
|
6595
6603
|
addGoogleAccount: "Ajouter un compte Google",
|
|
6596
6604
|
colorByMeetingType:
|
|
6597
6605
|
"Couleur par type de réunion (externe, interne, 1:1, groupe, etc.)",
|
|
@@ -6772,6 +6780,8 @@ const translatedCalendarExactCleanup = {
|
|
|
6772
6780
|
"{{count}} Termine aus Google Calendar synchronisiert",
|
|
6773
6781
|
},
|
|
6774
6782
|
sidebar: {
|
|
6783
|
+
collapseSidebar: "Seitenleiste einklappen",
|
|
6784
|
+
expandSidebar: "Seitenleiste erweitern",
|
|
6775
6785
|
addGoogleAccount: "Google-Konto hinzufügen",
|
|
6776
6786
|
colorByMeetingType:
|
|
6777
6787
|
"Nach Meetingtyp einfärben (extern, intern, 1:1, Gruppe usw.)",
|
|
@@ -6941,6 +6951,8 @@ const translatedCalendarExactCleanup = {
|
|
|
6941
6951
|
"Google Calendar から {{count}} 件の予定を同期しました",
|
|
6942
6952
|
},
|
|
6943
6953
|
sidebar: {
|
|
6954
|
+
collapseSidebar: "サイドバーを折りたたむ",
|
|
6955
|
+
expandSidebar: "サイドバーを展開",
|
|
6944
6956
|
addGoogleAccount: "Google アカウントを追加",
|
|
6945
6957
|
colorByMeetingType:
|
|
6946
6958
|
"会議タイプ別に色分け (外部、内部、1:1、グループなど)",
|
|
@@ -7106,6 +7118,8 @@ const translatedCalendarExactCleanup = {
|
|
|
7106
7118
|
"Google Calendar에서 이벤트 {{count}}개 동기화됨",
|
|
7107
7119
|
},
|
|
7108
7120
|
sidebar: {
|
|
7121
|
+
collapseSidebar: "사이드바 접기",
|
|
7122
|
+
expandSidebar: "사이드바 펼치기",
|
|
7109
7123
|
addGoogleAccount: "Google 계정 추가",
|
|
7110
7124
|
colorByMeetingType: "회의 유형별 색상 지정(외부, 내부, 1:1, 그룹 등)",
|
|
7111
7125
|
googleCalendarSettings: "Google Calendar 설정",
|
|
@@ -7285,6 +7299,8 @@ const translatedCalendarExactCleanup = {
|
|
|
7285
7299
|
"{{count}} eventos sincronizados do Google Calendar",
|
|
7286
7300
|
},
|
|
7287
7301
|
sidebar: {
|
|
7302
|
+
collapseSidebar: "Recolher barra lateral",
|
|
7303
|
+
expandSidebar: "Expandir barra lateral",
|
|
7288
7304
|
addGoogleAccount: "Adicionar conta Google",
|
|
7289
7305
|
colorByMeetingType:
|
|
7290
7306
|
"Colorir por tipo de reunião (externa, interna, 1:1, grupo etc.)",
|
|
@@ -7452,6 +7468,8 @@ const translatedCalendarExactCleanup = {
|
|
|
7452
7468
|
syncedFromGoogleCalendar_other: "Google Calendar से {{count}} इवेंट सिंक हुए",
|
|
7453
7469
|
},
|
|
7454
7470
|
sidebar: {
|
|
7471
|
+
collapseSidebar: "साइडबार समेटें",
|
|
7472
|
+
expandSidebar: "साइडबार फैलाएं",
|
|
7455
7473
|
addGoogleAccount: "Google खाता जोड़ें",
|
|
7456
7474
|
colorByMeetingType: "मीटिंग प्रकार से रंग दें (बाहरी, आंतरिक, 1:1, समूह आदि)",
|
|
7457
7475
|
googleCalendarSettings: "Google Calendar सेटिंग",
|
|
@@ -7634,6 +7652,8 @@ const translatedCalendarExactCleanup = {
|
|
|
7634
7652
|
"تمت مزامنة {{count}} حدث من Google Calendar",
|
|
7635
7653
|
},
|
|
7636
7654
|
sidebar: {
|
|
7655
|
+
collapseSidebar: "طي الشريط الجانبي",
|
|
7656
|
+
expandSidebar: "توسيع الشريط الجانبي",
|
|
7637
7657
|
addGoogleAccount: "إضافة حساب Google",
|
|
7638
7658
|
colorByMeetingType:
|
|
7639
7659
|
"التلوين حسب نوع الاجتماع (خارجي، داخلي، 1:1، مجموعة، إلخ)",
|
|
@@ -442,7 +442,7 @@ export function Sidebar({
|
|
|
442
442
|
<aside
|
|
443
443
|
data-collapsed={collapsed ? "true" : "false"}
|
|
444
444
|
className={cn(
|
|
445
|
-
"flex h-full min-w-0 shrink-0 flex-col overflow-hidden border-e border-sidebar-border bg-sidebar text-sidebar-foreground transition-[width] duration-
|
|
445
|
+
"flex h-full min-w-0 shrink-0 flex-col overflow-hidden border-e border-sidebar-border bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out",
|
|
446
446
|
collapsed ? "w-12" : "w-60",
|
|
447
447
|
)}
|
|
448
448
|
>
|
|
@@ -540,25 +540,14 @@ export function Sidebar({
|
|
|
540
540
|
</div>
|
|
541
541
|
</nav>
|
|
542
542
|
|
|
543
|
-
<div
|
|
544
|
-
className={cn(
|
|
545
|
-
"mt-auto shrink-0",
|
|
546
|
-
collapsed && "border-t border-sidebar-border py-2",
|
|
547
|
-
)}
|
|
548
|
-
>
|
|
543
|
+
<div className={cn("mt-auto shrink-0", collapsed && "py-2")}>
|
|
549
544
|
{!collapsed ? (
|
|
550
|
-
<div className="
|
|
545
|
+
<div className="px-2 py-1">
|
|
551
546
|
<ExtensionsSidebarSection />
|
|
552
547
|
</div>
|
|
553
548
|
) : null}
|
|
554
549
|
|
|
555
|
-
<div
|
|
556
|
-
className={cn(
|
|
557
|
-
collapsed
|
|
558
|
-
? "px-1 py-1"
|
|
559
|
-
: "border-t border-sidebar-border px-3 py-2",
|
|
560
|
-
)}
|
|
561
|
-
>
|
|
550
|
+
<div className={cn(collapsed ? "px-1 py-1" : "px-3 py-2")}>
|
|
562
551
|
<OrgSwitcher
|
|
563
552
|
reserveSpace
|
|
564
553
|
className={
|
|
@@ -571,9 +560,7 @@ export function Sidebar({
|
|
|
571
560
|
|
|
572
561
|
<div
|
|
573
562
|
className={cn(
|
|
574
|
-
collapsed
|
|
575
|
-
? "flex justify-center px-1 py-1"
|
|
576
|
-
: "border-t border-sidebar-border px-3 py-2",
|
|
563
|
+
collapsed ? "flex justify-center px-1 py-1" : "px-3 py-2",
|
|
577
564
|
)}
|
|
578
565
|
>
|
|
579
566
|
<FeedbackButton
|
|
@@ -588,7 +575,7 @@ export function Sidebar({
|
|
|
588
575
|
className={cn(
|
|
589
576
|
collapsed
|
|
590
577
|
? "flex justify-center px-1 py-1"
|
|
591
|
-
: "flex justify-end
|
|
578
|
+
: "flex justify-end px-3 py-2",
|
|
592
579
|
)}
|
|
593
580
|
>
|
|
594
581
|
{collapseButton}
|
|
@@ -25,6 +25,10 @@ Detailed media, meeting, dictation, editing, and sharing rules live in
|
|
|
25
25
|
download the original from Loom and use "Upload video".
|
|
26
26
|
- Native transcript first. Cleanup and title generation can run in the
|
|
27
27
|
background; do not hide a usable native transcript behind a failed cleanup.
|
|
28
|
+
- Dictation cleanup, Clip title/cleanup, and meeting summaries should pass
|
|
29
|
+
bounded `voiceContext` to the shared cleanup/transcription path when active
|
|
30
|
+
app context, learned vocabulary, user notes, or AGENTS.md preferences are
|
|
31
|
+
available.
|
|
28
32
|
- Cloud transcription is fallback-only for Clips recordings and should use the
|
|
29
33
|
configured Builder/Gemini or Groq paths, not OpenAI.
|
|
30
34
|
- AI setup must be visible and paid-account-backed: lead with Builder.io Connect
|
|
@@ -31,6 +31,11 @@ import {
|
|
|
31
31
|
resolveSecret,
|
|
32
32
|
FeatureNotConfiguredError,
|
|
33
33
|
} from "@agent-native/core/server";
|
|
34
|
+
import {
|
|
35
|
+
applyVoiceContextReplacements,
|
|
36
|
+
formatVoiceContextPackForPrompt,
|
|
37
|
+
type VoiceContextPack,
|
|
38
|
+
} from "@agent-native/core/voice";
|
|
34
39
|
import { z } from "zod";
|
|
35
40
|
|
|
36
41
|
import { isBuilderCreditsExhaustedMessage } from "../shared/builder-credits.js";
|
|
@@ -90,6 +95,12 @@ export default defineAction({
|
|
|
90
95
|
.describe(
|
|
91
96
|
"Optional surrounding context (e.g. meeting title, attendees, previous notes) to ground the cleanup pass.",
|
|
92
97
|
),
|
|
98
|
+
contextPack: z
|
|
99
|
+
.unknown()
|
|
100
|
+
.optional()
|
|
101
|
+
.describe(
|
|
102
|
+
"Optional structured voice context: snippets, vocabulary replacements, and metadata.",
|
|
103
|
+
),
|
|
93
104
|
language: z
|
|
94
105
|
.string()
|
|
95
106
|
.optional()
|
|
@@ -97,10 +108,12 @@ export default defineAction({
|
|
|
97
108
|
}),
|
|
98
109
|
run: async (args): Promise<CleanupResult> => {
|
|
99
110
|
const transcript = args.transcript.slice(0, MAX_INPUT_CHARS);
|
|
111
|
+
const contextPack = args.contextPack as VoiceContextPack | undefined;
|
|
100
112
|
const prompt = buildPrompt({
|
|
101
113
|
task: args.task,
|
|
102
114
|
transcript,
|
|
103
115
|
context: args.context,
|
|
116
|
+
contextPack,
|
|
104
117
|
language: args.language,
|
|
105
118
|
});
|
|
106
119
|
const wantJson = args.task === "summary";
|
|
@@ -124,7 +137,7 @@ export default defineAction({
|
|
|
124
137
|
});
|
|
125
138
|
if (text.trim()) {
|
|
126
139
|
await clearBuilderCreditsExhausted();
|
|
127
|
-
return shapeResult(args.task, text, "builder");
|
|
140
|
+
return shapeResult(args.task, text, "builder", contextPack);
|
|
128
141
|
}
|
|
129
142
|
builderReturnedEmpty = true;
|
|
130
143
|
console.warn("[cleanup-transcript] Builder path returned empty text");
|
|
@@ -157,7 +170,7 @@ export default defineAction({
|
|
|
157
170
|
prompt,
|
|
158
171
|
wantJson,
|
|
159
172
|
});
|
|
160
|
-
return shapeResult(args.task, text, "gemini-byok");
|
|
173
|
+
return shapeResult(args.task, text, "gemini-byok", contextPack);
|
|
161
174
|
}
|
|
162
175
|
|
|
163
176
|
throw buildCleanupConfigurationError({
|
|
@@ -317,13 +330,16 @@ function shapeResult(
|
|
|
317
330
|
task: "cleanup" | "title" | "summary",
|
|
318
331
|
raw: string,
|
|
319
332
|
provider: "builder" | "gemini-byok",
|
|
333
|
+
contextPack?: VoiceContextPack,
|
|
320
334
|
): CleanupResult {
|
|
321
335
|
const stripped = stripEnvelope(raw);
|
|
336
|
+
const applyContext = (value: string) =>
|
|
337
|
+
applyVoiceContextReplacements(value, contextPack).trim();
|
|
322
338
|
if (task === "title") {
|
|
323
|
-
return { task, title: stripped.slice(0, 120), provider };
|
|
339
|
+
return { task, title: applyContext(stripped).slice(0, 120), provider };
|
|
324
340
|
}
|
|
325
341
|
if (task === "cleanup") {
|
|
326
|
-
return { task, cleanedText: stripped, provider };
|
|
342
|
+
return { task, cleanedText: applyContext(stripped), provider };
|
|
327
343
|
}
|
|
328
344
|
// task === 'summary' — expect JSON.
|
|
329
345
|
try {
|
|
@@ -338,11 +354,16 @@ function shapeResult(
|
|
|
338
354
|
};
|
|
339
355
|
return {
|
|
340
356
|
task,
|
|
341
|
-
summaryMd:
|
|
357
|
+
summaryMd:
|
|
358
|
+
typeof parsed.summaryMd === "string"
|
|
359
|
+
? applyContext(parsed.summaryMd)
|
|
360
|
+
: "",
|
|
342
361
|
bullets: Array.isArray(parsed.bullets)
|
|
343
362
|
? parsed.bullets
|
|
344
363
|
.map((b) =>
|
|
345
|
-
typeof b === "string"
|
|
364
|
+
typeof b === "string"
|
|
365
|
+
? { text: applyContext(b) }
|
|
366
|
+
: { text: applyContext(b.text ?? "") },
|
|
346
367
|
)
|
|
347
368
|
.filter((b) => b.text)
|
|
348
369
|
: [],
|
|
@@ -359,7 +380,7 @@ function shapeResult(
|
|
|
359
380
|
: "";
|
|
360
381
|
const isEmail = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(rawEmail);
|
|
361
382
|
return {
|
|
362
|
-
text: (a.text ?? "")
|
|
383
|
+
text: applyContext(a.text ?? ""),
|
|
363
384
|
...(isEmail ? { assigneeEmail: rawEmail } : {}),
|
|
364
385
|
...(a.dueDate ? { dueDate: a.dueDate } : {}),
|
|
365
386
|
};
|
|
@@ -371,7 +392,7 @@ function shapeResult(
|
|
|
371
392
|
// Provider didn't return JSON — fall back to raw markdown summary.
|
|
372
393
|
return {
|
|
373
394
|
task,
|
|
374
|
-
summaryMd: stripped,
|
|
395
|
+
summaryMd: applyContext(stripped),
|
|
375
396
|
bullets: [],
|
|
376
397
|
actionItems: [],
|
|
377
398
|
provider,
|
|
@@ -391,15 +412,24 @@ function buildPrompt({
|
|
|
391
412
|
task,
|
|
392
413
|
transcript,
|
|
393
414
|
context,
|
|
415
|
+
contextPack,
|
|
394
416
|
language,
|
|
395
417
|
}: {
|
|
396
418
|
task: "cleanup" | "title" | "summary";
|
|
397
419
|
transcript: string;
|
|
398
420
|
context?: string;
|
|
421
|
+
contextPack?: VoiceContextPack;
|
|
399
422
|
language?: string;
|
|
400
423
|
}): { system: string; user: string } {
|
|
401
424
|
const langHint = language ? ` The transcript language is ${language}.` : "";
|
|
402
|
-
const
|
|
425
|
+
const voiceContext = formatVoiceContextPackForPrompt(contextPack);
|
|
426
|
+
const contextParts = [
|
|
427
|
+
context?.trim(),
|
|
428
|
+
voiceContext ? `Voice context:\n${voiceContext}` : "",
|
|
429
|
+
].filter(Boolean);
|
|
430
|
+
const ctxBlock = contextParts.length
|
|
431
|
+
? `\n\n<context>\n${contextParts.join("\n\n")}\n</context>`
|
|
432
|
+
: "";
|
|
403
433
|
|
|
404
434
|
if (task === "title") {
|
|
405
435
|
return {
|
|
@@ -13,12 +13,20 @@
|
|
|
13
13
|
import { defineAction } from "@agent-native/core";
|
|
14
14
|
import { writeAppState } from "@agent-native/core/application-state";
|
|
15
15
|
import { assertAccess } from "@agent-native/core/sharing";
|
|
16
|
+
import type { VoiceContextPack } from "@agent-native/core/voice";
|
|
16
17
|
import { eq } from "drizzle-orm";
|
|
17
18
|
import { z } from "zod";
|
|
18
19
|
|
|
19
20
|
import { getDb, schema } from "../server/db/index.js";
|
|
20
21
|
import { nanoid } from "../server/lib/recordings.js";
|
|
21
22
|
import cleanupTranscript, { CleanupResult } from "./cleanup-transcript.js";
|
|
23
|
+
import { loadAgentsMdContext } from "./lib/agents-md-context.js";
|
|
24
|
+
|
|
25
|
+
function trimContextValue(value: string, maxChars: number): string {
|
|
26
|
+
const trimmed = value.replace(/\0/g, "").trim();
|
|
27
|
+
if (trimmed.length <= maxChars) return trimmed;
|
|
28
|
+
return `${trimmed.slice(0, maxChars).trimEnd()}\n[truncated]`;
|
|
29
|
+
}
|
|
22
30
|
|
|
23
31
|
export default defineAction({
|
|
24
32
|
description:
|
|
@@ -72,29 +80,90 @@ export default defineAction({
|
|
|
72
80
|
.set({ transcriptStatus: "pending", updatedAt: nowIso })
|
|
73
81
|
.where(eq(schema.meetings.id, args.meetingId));
|
|
74
82
|
|
|
75
|
-
const participants = await
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
83
|
+
const [participants, recordingRows, agentsContext] = await Promise.all([
|
|
84
|
+
db
|
|
85
|
+
.select()
|
|
86
|
+
.from(schema.meetingParticipants)
|
|
87
|
+
.where(eq(schema.meetingParticipants.meetingId, args.meetingId)),
|
|
88
|
+
meeting.recordingId
|
|
89
|
+
? db
|
|
90
|
+
.select({
|
|
91
|
+
title: schema.recordings.title,
|
|
92
|
+
sourceAppName: schema.recordings.sourceAppName,
|
|
93
|
+
sourceWindowTitle: schema.recordings.sourceWindowTitle,
|
|
94
|
+
description: schema.recordings.description,
|
|
95
|
+
})
|
|
96
|
+
.from(schema.recordings)
|
|
97
|
+
.where(eq(schema.recordings.id, meeting.recordingId))
|
|
98
|
+
.limit(1)
|
|
99
|
+
: Promise.resolve([]),
|
|
100
|
+
loadAgentsMdContext({
|
|
101
|
+
ownerEmail: meeting.ownerEmail,
|
|
102
|
+
purpose: "summary",
|
|
103
|
+
}),
|
|
104
|
+
]);
|
|
105
|
+
const linkedRecording = recordingRows[0] ?? null;
|
|
79
106
|
|
|
80
|
-
|
|
81
|
-
|
|
107
|
+
// Build a single bounded context pack for the summary prompt. Avoid also
|
|
108
|
+
// emitting the same fields as a parallel plain-text `context` string: the
|
|
109
|
+
// cleanup prompt concatenates both into one <context> block, so passing
|
|
110
|
+
// both would duplicate every snippet (and the plain-text path was
|
|
111
|
+
// unbounded at ~20k chars per field).
|
|
112
|
+
const contextSnippets: NonNullable<VoiceContextPack["snippets"]> = [];
|
|
113
|
+
const addSnippet = (label: string, value: string, maxChars = 2_000) => {
|
|
114
|
+
const trimmed = trimContextValue(value, maxChars);
|
|
115
|
+
if (trimmed) contextSnippets.push({ label, value: trimmed });
|
|
116
|
+
};
|
|
117
|
+
if (meeting.title) addSnippet("Meeting title", meeting.title, 200);
|
|
82
118
|
if (meeting.scheduledStart)
|
|
83
|
-
|
|
119
|
+
addSnippet("Scheduled start", meeting.scheduledStart, 120);
|
|
84
120
|
if (participants.length) {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
121
|
+
addSnippet(
|
|
122
|
+
"Attendees",
|
|
123
|
+
participants.map((p) => `${p.name ?? p.email} <${p.email}>`).join(", "),
|
|
124
|
+
1800,
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
if (meeting.userNotesMd.trim()) {
|
|
128
|
+
addSnippet("User notes", meeting.userNotesMd, 3_000);
|
|
129
|
+
}
|
|
130
|
+
if (linkedRecording) {
|
|
131
|
+
addSnippet(
|
|
132
|
+
"Linked Clip",
|
|
133
|
+
[
|
|
134
|
+
linkedRecording.title,
|
|
135
|
+
linkedRecording.sourceAppName,
|
|
136
|
+
linkedRecording.sourceWindowTitle,
|
|
137
|
+
linkedRecording.description,
|
|
138
|
+
]
|
|
139
|
+
.filter(Boolean)
|
|
140
|
+
.join("\n"),
|
|
141
|
+
1800,
|
|
89
142
|
);
|
|
90
143
|
}
|
|
144
|
+
if (agentsContext)
|
|
145
|
+
addSnippet("AGENTS.md preferences", agentsContext, 3_000);
|
|
146
|
+
const contextPack: VoiceContextPack | undefined = contextSnippets.length
|
|
147
|
+
? {
|
|
148
|
+
surface: "clips-meeting",
|
|
149
|
+
mode: "summary",
|
|
150
|
+
snippets: contextSnippets,
|
|
151
|
+
metadata: {
|
|
152
|
+
meetingId: meeting.id,
|
|
153
|
+
recordingId: meeting.recordingId,
|
|
154
|
+
calendarEventId: meeting.calendarEventId,
|
|
155
|
+
source: meeting.source,
|
|
156
|
+
platform: meeting.platform,
|
|
157
|
+
},
|
|
158
|
+
}
|
|
159
|
+
: undefined;
|
|
91
160
|
|
|
92
161
|
let result: CleanupResult;
|
|
93
162
|
try {
|
|
94
163
|
result = await cleanupTranscript.run({
|
|
95
164
|
transcript: transcriptText,
|
|
96
165
|
task: "summary",
|
|
97
|
-
|
|
166
|
+
contextPack,
|
|
98
167
|
});
|
|
99
168
|
} catch (err) {
|
|
100
169
|
await db
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
|
|
6
6
|
const MAX_AGENTS_MD_CONTEXT_CHARS = 60_000;
|
|
7
7
|
|
|
8
|
-
type AgentsContextPurpose = "title" | "cleanup";
|
|
8
|
+
type AgentsContextPurpose = "title" | "cleanup" | "summary";
|
|
9
9
|
|
|
10
10
|
function trimAgentsMdContext(content: string): string {
|
|
11
11
|
const trimmed = content.trim();
|
|
@@ -31,6 +31,9 @@ function purposeInstruction(purpose: AgentsContextPurpose): string {
|
|
|
31
31
|
if (purpose === "cleanup") {
|
|
32
32
|
return "Use these AGENTS.md resources only for relevant transcript cleanup preferences: vocabulary, casing, punctuation style, formatting style, terminology, speaker voice, and team/personal conventions. If the personal and organization instructions conflict, prefer the personal instructions.";
|
|
33
33
|
}
|
|
34
|
+
if (purpose === "summary") {
|
|
35
|
+
return "Use these AGENTS.md resources only for relevant meeting-summary preferences: vocabulary, casing, terminology, action-item style, formatting style, and team/personal conventions. If the personal and organization instructions conflict, prefer the personal instructions.";
|
|
36
|
+
}
|
|
34
37
|
|
|
35
38
|
return "Use these AGENTS.md resources only for relevant Clip naming, terminology, style, and personal/team preferences. If the personal and organization instructions conflict, prefer the personal instructions.";
|
|
36
39
|
}
|
|
@@ -498,7 +498,7 @@ export function LibraryLayout({ children }: LibraryLayoutProps) {
|
|
|
498
498
|
|
|
499
499
|
{!showCollapsedSidebar && (
|
|
500
500
|
<>
|
|
501
|
-
<div className="shrink-0 space-y-1.5
|
|
501
|
+
<div className="shrink-0 space-y-1.5 px-2 py-1.5">
|
|
502
502
|
{shouldShowSidebarLink && (
|
|
503
503
|
<CaptureInstallInlineLink className="flex items-center gap-2 rounded px-2 py-1.5 text-xs text-foreground hover:bg-accent/60">
|
|
504
504
|
<IconAppWindow className="h-4 w-4" />
|
|
@@ -508,11 +508,11 @@ export function LibraryLayout({ children }: LibraryLayoutProps) {
|
|
|
508
508
|
<SearchBar />
|
|
509
509
|
</div>
|
|
510
510
|
|
|
511
|
-
<div className="shrink-0
|
|
511
|
+
<div className="shrink-0 px-1 py-1">
|
|
512
512
|
<ExtensionsSidebarSection />
|
|
513
513
|
</div>
|
|
514
514
|
|
|
515
|
-
<div className="shrink-0 space-y-2
|
|
515
|
+
<div className="shrink-0 space-y-2 px-3 py-2">
|
|
516
516
|
<OrgSwitcher settingsPath="/settings/organization" />
|
|
517
517
|
<DevDatabaseLink />
|
|
518
518
|
<FeedbackButton />
|
|
@@ -38,7 +38,7 @@ export function ShareMeetingPopover({
|
|
|
38
38
|
<PopoverTrigger asChild>{children}</PopoverTrigger>
|
|
39
39
|
<PopoverContent
|
|
40
40
|
align="end"
|
|
41
|
-
className="w-[440px] max-w-[calc(100vw-1rem)] overflow-hidden p-0"
|
|
41
|
+
className="w-[440px] max-w-[calc(100vw-1rem)] overflow-hidden border-border p-0"
|
|
42
42
|
>
|
|
43
43
|
<ShareMeetingContent
|
|
44
44
|
meetingId={meetingId}
|
|
@@ -91,7 +91,7 @@ export function ShareRecordingPopover({
|
|
|
91
91
|
<PopoverTrigger asChild>{children}</PopoverTrigger>
|
|
92
92
|
<PopoverContent
|
|
93
93
|
align="end"
|
|
94
|
-
className="w-[440px] max-w-[calc(100vw-1rem)] overflow-hidden p-0"
|
|
94
|
+
className="w-[440px] max-w-[calc(100vw-1rem)] overflow-hidden border-border p-0"
|
|
95
95
|
>
|
|
96
96
|
<ShareRecordingContent
|
|
97
97
|
recordingId={recordingId}
|
|
@@ -124,7 +124,7 @@ export function ShareRecordingDialog({
|
|
|
124
124
|
const t = useT();
|
|
125
125
|
return (
|
|
126
126
|
<Dialog open={open} onOpenChange={onOpenChange}>
|
|
127
|
-
<DialogContent className="w-[calc(100vw-2rem)] overflow-hidden p-0 sm:max-w-[440px]">
|
|
127
|
+
<DialogContent className="w-[calc(100vw-2rem)] overflow-hidden border-border p-0 sm:max-w-[440px]">
|
|
128
128
|
<DialogTitle className="sr-only">
|
|
129
129
|
{recordingTitle
|
|
130
130
|
? t("shareDialog.sharePlainTitle", { title: recordingTitle })
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
|
|
22
22
|
import { invoke } from "@tauri-apps/api/core";
|
|
23
23
|
|
|
24
|
-
interface VocabularyEntry {
|
|
24
|
+
export interface VocabularyEntry {
|
|
25
25
|
id: string;
|
|
26
26
|
term: string;
|
|
27
27
|
replacement: string;
|
|
@@ -37,13 +37,9 @@ export function configureVocabularyClient(url: string): void {
|
|
|
37
37
|
serverUrl = url.replace(/\/+$/, "");
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
* Fetch the current user's vocabulary from the server. Cached for 60s so
|
|
42
|
-
* the dictation start path stays snappy on rapid Fn re-presses.
|
|
43
|
-
*/
|
|
44
|
-
export async function loadVocabulary(): Promise<string[]> {
|
|
40
|
+
export async function loadVocabularyEntries(): Promise<VocabularyEntry[]> {
|
|
45
41
|
if (cachedVocabulary && Date.now() - cachedAt < 60_000) {
|
|
46
|
-
return cachedVocabulary
|
|
42
|
+
return cachedVocabulary;
|
|
47
43
|
}
|
|
48
44
|
if (!serverUrl) return [];
|
|
49
45
|
try {
|
|
@@ -55,13 +51,22 @@ export async function loadVocabulary(): Promise<string[]> {
|
|
|
55
51
|
const data = (await res.json()) as { vocabulary?: VocabularyEntry[] };
|
|
56
52
|
cachedVocabulary = data.vocabulary ?? [];
|
|
57
53
|
cachedAt = Date.now();
|
|
58
|
-
return cachedVocabulary
|
|
54
|
+
return cachedVocabulary;
|
|
59
55
|
} catch (err) {
|
|
60
56
|
console.warn("[personal-vocabulary] loadVocabulary failed:", err);
|
|
61
57
|
return [];
|
|
62
58
|
}
|
|
63
59
|
}
|
|
64
60
|
|
|
61
|
+
/**
|
|
62
|
+
* Fetch the current user's vocabulary from the server. Cached for 60s so
|
|
63
|
+
* the dictation start path stays snappy on rapid Fn re-presses.
|
|
64
|
+
*/
|
|
65
|
+
export async function loadVocabulary(): Promise<string[]> {
|
|
66
|
+
const vocabulary = await loadVocabularyEntries();
|
|
67
|
+
return vocabulary.map((v) => v.replacement);
|
|
68
|
+
}
|
|
69
|
+
|
|
65
70
|
/**
|
|
66
71
|
* Token-level diff between two short strings. Returns the first
|
|
67
72
|
* `{term, replacement}` pair where a single word changed and length didn't
|
|
@@ -2069,6 +2069,8 @@ async function startNativeFullscreenRecording(
|
|
|
2069
2069
|
.then(() => {
|
|
2070
2070
|
pausedAt = at;
|
|
2071
2071
|
emitState();
|
|
2072
|
+
console.log("[clips-recorder] native pause: pausing transcription");
|
|
2073
|
+
void transcriptionCapture?.pause().catch(() => {});
|
|
2072
2074
|
})
|
|
2073
2075
|
.catch((err) => {
|
|
2074
2076
|
console.warn("[clips-recorder] native pause failed:", err);
|
|
@@ -2076,6 +2078,8 @@ async function startNativeFullscreenRecording(
|
|
|
2076
2078
|
}),
|
|
2077
2079
|
listen("clips:recorder-resume", () => {
|
|
2078
2080
|
if (pausedAt == null) return;
|
|
2081
|
+
// Only resume transcription once the recorder actually resumed, so a
|
|
2082
|
+
// rejected IPC can't leave transcription running over a paused recording.
|
|
2079
2083
|
invoke("native_fullscreen_recording_resume")
|
|
2080
2084
|
.then(() => {
|
|
2081
2085
|
if (pausedAt != null) {
|
|
@@ -2083,6 +2087,8 @@ async function startNativeFullscreenRecording(
|
|
|
2083
2087
|
pausedAt = null;
|
|
2084
2088
|
}
|
|
2085
2089
|
emitState();
|
|
2090
|
+
console.log("[clips-recorder] native resume: resuming transcription");
|
|
2091
|
+
void transcriptionCapture?.resume().catch(() => {});
|
|
2086
2092
|
})
|
|
2087
2093
|
.catch((err) => {
|
|
2088
2094
|
console.warn("[clips-recorder] native resume failed:", err);
|
|
@@ -2125,6 +2131,12 @@ async function startNativeFullscreenRecording(
|
|
|
2125
2131
|
if (stopped && transcriptionCapture) {
|
|
2126
2132
|
void transcriptionCapture.cancel().catch(() => {});
|
|
2127
2133
|
transcriptionCapture = null;
|
|
2134
|
+
} else if (pausedAt != null && transcriptionCapture) {
|
|
2135
|
+
// The user paused while the engine was still starting; honor it now.
|
|
2136
|
+
console.log(
|
|
2137
|
+
"[clips-recorder] native: paused during startup, pausing transcription",
|
|
2138
|
+
);
|
|
2139
|
+
void transcriptionCapture.pause().catch(() => {});
|
|
2128
2140
|
} else if (
|
|
2129
2141
|
wantsAudio &&
|
|
2130
2142
|
!transcriptionCapture &&
|
|
@@ -2885,6 +2897,8 @@ async function startRecordingInner(
|
|
|
2885
2897
|
recorder.pause();
|
|
2886
2898
|
pausedAt = Date.now();
|
|
2887
2899
|
emitState(true);
|
|
2900
|
+
console.log("[clips-recorder] recorder pause: pausing transcription");
|
|
2901
|
+
void transcriptionCapture?.pause().catch(() => {});
|
|
2888
2902
|
} catch {
|
|
2889
2903
|
// ignore
|
|
2890
2904
|
}
|
|
@@ -2897,6 +2911,10 @@ async function startRecordingInner(
|
|
|
2897
2911
|
if (pausedAt) accumulatedPauseMs += Date.now() - pausedAt;
|
|
2898
2912
|
pausedAt = null;
|
|
2899
2913
|
emitState(false);
|
|
2914
|
+
console.log(
|
|
2915
|
+
"[clips-recorder] recorder resume: resuming transcription",
|
|
2916
|
+
);
|
|
2917
|
+
void transcriptionCapture?.resume().catch(() => {});
|
|
2900
2918
|
} catch {
|
|
2901
2919
|
// ignore
|
|
2902
2920
|
}
|
|
@@ -2951,6 +2969,12 @@ async function startRecordingInner(
|
|
|
2951
2969
|
if (stopped && transcriptionCapture) {
|
|
2952
2970
|
void transcriptionCapture.cancel().catch(() => {});
|
|
2953
2971
|
transcriptionCapture = null;
|
|
2972
|
+
} else if (pausedAt != null && transcriptionCapture) {
|
|
2973
|
+
// The user paused while the engine was still starting; honor it now.
|
|
2974
|
+
console.log(
|
|
2975
|
+
"[clips-recorder] recorder: paused during startup, pausing transcription",
|
|
2976
|
+
);
|
|
2977
|
+
void transcriptionCapture.pause().catch(() => {});
|
|
2954
2978
|
} else if (
|
|
2955
2979
|
wantsAudio &&
|
|
2956
2980
|
!transcriptionCapture &&
|