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