@agent-native/core 0.79.27 → 0.80.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +26 -0
- package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +41 -0
- package/corpus/core/docs/content/locales/de-DE/template-design.mdx +51 -0
- package/corpus/core/docs/content/locales/es-ES/template-design.mdx +50 -0
- package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +49 -0
- package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +44 -0
- package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +46 -0
- package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +44 -0
- package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +48 -0
- package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +36 -0
- package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +38 -0
- package/corpus/core/docs/content/template-design.mdx +45 -0
- 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/cli/design-connect.ts +490 -0
- package/corpus/core/src/cli/index.ts +16 -0
- package/corpus/core/src/cli/skills.ts +126 -3
- package/corpus/core/src/client/AssistantChat.tsx +43 -7
- 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/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/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 +56 -7
- package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
- 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/list-session-recordings.ts +6 -1
- 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/i18n/zh-TW.ts +2 -0
- package/corpus/templates/analytics/app/i18n-data.ts +20 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +33 -8
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +7 -0
- package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +7 -0
- 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/seeds/dashboards/agent-native-templates-first-party.json +3 -3
- package/corpus/templates/analytics/server/lib/dashboard-report.ts +29 -7
- package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +5 -2
- package/corpus/templates/analytics/server/lib/session-replay.ts +24 -4
- 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/voice-dictation.ts +60 -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/design/.agents/skills/visual-edit/SKILL.md +137 -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 +426 -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/list-localhost-connections.ts +95 -0
- package/corpus/templates/design/actions/navigate.ts +55 -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 +761 -0
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +2057 -103
- package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +74 -38
- package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +399 -0
- package/corpus/templates/design/app/components/design/EditPanel.tsx +3185 -439
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +1124 -0
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +3116 -147
- package/corpus/templates/design/app/components/design/QuestionFlow.tsx +700 -13
- package/corpus/templates/design/app/components/design/TweaksPanel.tsx +107 -63
- package/corpus/templates/design/app/components/design/index.ts +0 -5
- package/corpus/templates/design/app/components/design/inspector/AlignmentMatrix.tsx +286 -0
- package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +699 -0
- package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +461 -0
- package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +166 -0
- package/corpus/templates/design/app/components/design/inspector/FigmaColorPicker.tsx +1420 -0
- package/corpus/templates/design/app/components/design/inspector/SHADER_INTEGRATION.md +420 -0
- package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +215 -0
- package/corpus/templates/design/app/components/design/inspector/ShaderControls.stories.tsx +71 -0
- package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +518 -0
- package/corpus/templates/design/app/components/design/inspector/ShaderEffectRow.tsx +106 -0
- package/corpus/templates/design/app/components/design/inspector/figma-icons.tsx +361 -0
- package/corpus/templates/design/app/components/design/inspector/index.ts +60 -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 +121 -3
- 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 +264 -0
- package/corpus/templates/design/app/i18n-data.ts +2790 -1
- package/corpus/templates/design/app/pages/DesignEditor.tsx +5108 -851
- 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-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-sidebars-use-darker-chrome-and-chat-warns-immediately.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/lib/design-snapshot.ts +1 -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 +2212 -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/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/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/app/components/layout/Sidebar.tsx +5 -5
- package/corpus/templates/slides/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
- 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/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 +121 -3
- package/dist/cli/skills.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/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/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/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +2 -2
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/observability/routes.d.ts +8 -8
- package/dist/progress/routes.d.ts +1 -1
- package/dist/server/agent-engine-api-key-route.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 +56 -7
- package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
- 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/template-design.mdx +41 -0
- package/docs/content/locales/de-DE/template-design.mdx +51 -0
- package/docs/content/locales/es-ES/template-design.mdx +50 -0
- package/docs/content/locales/fr-FR/template-design.mdx +49 -0
- package/docs/content/locales/hi-IN/template-design.mdx +44 -0
- package/docs/content/locales/ja-JP/template-design.mdx +46 -0
- package/docs/content/locales/ko-KR/template-design.mdx +44 -0
- package/docs/content/locales/pt-BR/template-design.mdx +48 -0
- package/docs/content/locales/zh-CN/template-design.mdx +36 -0
- package/docs/content/locales/zh-TW/template-design.mdx +38 -0
- package/docs/content/template-design.mdx +45 -0
- package/package.json +2 -1
- package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
- 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
|
@@ -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
|