@agent-native/core 0.117.2 → 0.118.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 +3 -3
- package/corpus/core/CHANGELOG.md +51 -0
- package/corpus/core/docs/content/custom-design-system.mdx +445 -0
- package/corpus/core/docs/content/toolkit-ui.mdx +16 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/a2a/client.ts +32 -10
- package/corpus/core/src/a2a/types.ts +1 -0
- package/corpus/core/src/agent/types.ts +1 -1
- package/corpus/core/src/cli/index.ts +18 -10
- package/corpus/core/src/cli/multi-frontier-runs.ts +5 -3
- package/corpus/core/src/cli/templates-meta.ts +0 -12
- package/corpus/core/src/cli/workspace-dev.ts +1 -1
- package/corpus/core/src/client/AgentPanel.tsx +99 -108
- package/corpus/core/src/client/AssistantChat.tsx +30 -13
- package/corpus/core/src/client/CommandMenu.tsx +68 -178
- package/corpus/core/src/client/RunStuckBanner.tsx +39 -47
- package/corpus/core/src/client/agent-chat-adapter.ts +3 -1
- package/corpus/core/src/client/app-providers.tsx +1 -1
- package/corpus/core/src/client/chat/action-chat-ui-surface.tsx +32 -0
- package/corpus/core/src/client/chat/message-components.tsx +169 -18
- package/corpus/core/src/client/chat/tool-call-display.tsx +50 -14
- package/corpus/core/src/client/chat/widgets/InlineExtensionWidget.tsx +13 -40
- package/corpus/core/src/client/chat/widgets/builtin-tool-renderers.tsx +7 -3
- package/corpus/core/src/client/components/ui/message-scroller.tsx +15 -1
- package/corpus/core/src/client/conversation/AgentConversation.tsx +12 -1
- package/corpus/core/src/client/error-capture.ts +2 -6
- package/corpus/core/src/client/i18n.tsx +22 -0
- package/corpus/core/src/client/index.ts +17 -0
- package/corpus/core/src/client/org/TeamPage.tsx +257 -153
- package/corpus/core/src/client/progress/RunsTray.tsx +89 -88
- package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +25 -16
- package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +34 -13
- package/corpus/core/src/client/resources/ResourcesPanel.tsx +5 -1
- package/corpus/core/src/client/resources/mcp-integration-catalog.ts +20 -17
- package/corpus/core/src/client/resources/mcp-integration-logos.ts +2 -2
- package/corpus/core/src/client/route-chunk-recovery.ts +5 -3
- package/corpus/core/src/client/session-replay.ts +3 -3
- package/corpus/core/src/client/settings/DemoModeSection.tsx +6 -18
- package/corpus/core/src/client/settings/SecretsSection.tsx +97 -52
- package/corpus/core/src/client/settings/SettingsPanel.tsx +217 -252
- package/corpus/core/src/client/settings/SettingsTabsPage.tsx +23 -2
- package/corpus/core/src/client/settings/VoiceTranscriptionSection.tsx +7 -18
- package/corpus/core/src/client/settings/index.ts +7 -0
- package/corpus/core/src/client/settings/useSettingsPanelController.ts +155 -0
- package/corpus/core/src/client/setup-connections/BuilderConnectCard.tsx +116 -51
- package/corpus/core/src/client/setup-connections/index.ts +10 -0
- package/corpus/core/src/client/setup-connections/useBuilderConnectCardController.ts +82 -0
- package/corpus/core/src/client/sharing/ShareButton.tsx +64 -586
- package/corpus/core/src/client/sharing/ShareDialog.tsx +299 -633
- package/corpus/core/src/client/sharing/index.ts +42 -0
- package/corpus/core/src/client/sharing/share-controller-helpers.ts +318 -0
- package/corpus/core/src/client/sharing/useShareButtonController.ts +600 -0
- package/corpus/core/src/client/sharing/useShareDialogController.ts +559 -0
- package/corpus/core/src/client/sse-event-processor.ts +23 -0
- package/corpus/core/src/client/tool-display.ts +71 -0
- package/corpus/core/src/client/transcription/use-live-transcription.ts +64 -45
- package/corpus/core/src/client/use-agent-engine-configured.ts +12 -19
- package/corpus/core/src/client/use-chat-threads.ts +33 -12
- package/corpus/core/src/deploy/build.ts +2 -1
- package/corpus/core/src/guards/db-tool-scoping.ts +1 -1
- package/corpus/core/src/integrations/adapters/slack.ts +84 -5
- package/corpus/core/src/integrations/index.ts +5 -1
- package/corpus/core/src/localization/default-messages.ts +6 -1
- package/corpus/core/src/mcp-client/oauth-routes.ts +61 -14
- package/corpus/core/src/scripts/call-agent.ts +5 -1
- package/corpus/core/src/server/realtime-voice.ts +5 -2
- package/corpus/core/src/styles/agent-native.css +0 -24
- package/corpus/core/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/corpus/core/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/core/src/templates/default/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/core/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/core/src/templates/default/app/components/ui/toolkit-provider.tsx +10 -0
- package/corpus/core/src/templates/default/app/design-system.ts +3 -0
- package/corpus/core/src/templates/default/app/root.tsx +5 -2
- package/corpus/core/src/templates/default/package.json +1 -0
- package/corpus/core/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/corpus/core/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/corpus/core/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/core/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/core/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
- package/corpus/core/src/terminal/cli-registry.ts +1 -1
- package/corpus/core/src/vite/client.ts +205 -1
- package/corpus/templates/analytics/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/corpus/templates/analytics/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/analytics/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/analytics/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/analytics/app/design-system.ts +3 -0
- package/corpus/templates/analytics/app/hooks/use-dashboard-views.ts +13 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewsMenu.tsx +10 -0
- package/corpus/templates/analytics/changelog/2026-07-22-show-a-useful-error-when-saving-a-dashboard-view-fails.md +6 -0
- package/corpus/templates/assets/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/corpus/templates/assets/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/assets/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/assets/app/components/ui/alert.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/assets/app/design-system.ts +3 -0
- package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +26 -30
- package/corpus/templates/brain/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/corpus/templates/brain/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/brain/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/brain/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/brain/app/design-system.ts +3 -0
- package/corpus/templates/brain/app/routes/sources.tsx +189 -122
- package/corpus/templates/calendar/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/corpus/templates/calendar/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/calendar/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/calendar/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/calendar/app/design-system.ts +3 -0
- package/corpus/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/corpus/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/chat/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/chat/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/chat/app/design-system.ts +3 -0
- package/corpus/templates/clips/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/corpus/templates/clips/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/clips/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/clips/AGENTS.md +8 -6
- package/corpus/templates/clips/actions/request-transcript.ts +90 -420
- package/corpus/templates/clips/actions/save-browser-transcript.ts +11 -28
- package/corpus/templates/clips/app/components/capture-install-options.tsx +5 -3
- package/corpus/templates/clips/app/components/player/transcript-panel.tsx +3 -136
- package/corpus/templates/clips/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/clips/app/design-system.ts +3 -0
- package/corpus/templates/clips/app/lib/capture-install-options.ts +15 -4
- package/corpus/templates/clips/app/routes/_app.library._index.tsx +1 -1
- package/corpus/templates/clips/app/routes/download.tsx +3 -2
- package/corpus/templates/clips/changelog/2026-07-22-fixed-an-intermittent-hydration-error-on-the-download-page.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-22-fixed-transcript-generation-when-native-speech-capture-retur.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-22-fixed-windows-recordings-aborting-during-the-countdown.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-22-permissions-and-rewind-controls-are-now-grouped-with-clearer.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-22-the-desktop-popover-opens-centered-under-the-menu-bar-icon-o.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-22-transcript-generation-now-retries-with-backup-speech-recogni.md +6 -0
- package/corpus/templates/clips/desktop/src/app.tsx +86 -82
- package/corpus/templates/clips/desktop/src/styles.css +13 -0
- package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +10 -1
- package/corpus/templates/clips/desktop/src-tauri/src/shortcuts.rs +37 -2
- package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +18 -0
- package/corpus/templates/clips/server/lib/public-agent-context.ts +2 -2
- package/corpus/templates/clips/server/register-secrets.ts +7 -6
- package/corpus/templates/content/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/corpus/templates/content/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/content/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +41 -59
- package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +16 -84
- package/corpus/templates/content/app/components/editor/VisualEditor.tsx +13 -7
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +41 -41
- package/corpus/templates/content/app/components/editor/database/GalleryView.tsx +2 -1
- package/corpus/templates/content/app/components/editor/database/ListView.tsx +2 -1
- package/corpus/templates/content/app/components/editor/database/TimelineView.tsx +9 -9
- package/corpus/templates/content/app/components/editor/database/sidebar.tsx +7 -7
- package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +11 -11
- package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +2 -2
- package/corpus/templates/content/app/components/ui/checkbox.tsx +1 -0
- package/corpus/templates/content/app/components/ui/collapsible.tsx +1 -0
- package/corpus/templates/content/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/content/app/design-system.ts +3 -0
- package/corpus/templates/content/app/global.css +29 -3
- package/corpus/templates/content/app/i18n-data.ts +10 -0
- package/corpus/templates/content/changelog/2026-07-22-page-actions-are-grouped-into-the-three-dots-menu-for-a-clea.md +6 -0
- package/corpus/templates/design/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/corpus/templates/design/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/design/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +8 -8
- package/corpus/templates/design/app/components/ui/command.tsx +1 -0
- package/corpus/templates/design/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/design/app/design-system.ts +3 -0
- package/corpus/templates/design/server/lib/fig-file-decoder.ts +1 -0
- package/corpus/templates/dispatch/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/corpus/templates/dispatch/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/dispatch/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/dispatch/app/components/ui/button.tsx +1 -0
- package/corpus/templates/dispatch/app/components/ui/toolkit-provider.tsx +17 -0
- package/corpus/templates/dispatch/app/design-system.ts +3 -0
- package/corpus/templates/dispatch/app/root.tsx +10 -7
- package/corpus/templates/dispatch/package.json +1 -0
- package/corpus/templates/forms/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/corpus/templates/forms/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/forms/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/forms/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/forms/app/design-system.ts +3 -0
- package/corpus/templates/macros/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/corpus/templates/macros/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/macros/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/macros/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/macros/app/design-system.ts +3 -0
- package/corpus/templates/mail/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/corpus/templates/mail/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/mail/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/mail/app/components/email/EmailThread.tsx +134 -93
- package/corpus/templates/mail/app/components/email/email-iframe-document.ts +8 -2
- package/corpus/templates/mail/app/components/ui/textarea.tsx +1 -21
- package/corpus/templates/mail/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/mail/app/design-system.ts +3 -0
- package/corpus/templates/mail/changelog/2026-07-22-email-messages-no-longer-flash-with-an-unstyled-page-while-l.md +6 -0
- package/corpus/templates/plan/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/corpus/templates/plan/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/plan/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/plan/app/components/plan/PlanContentRenderer.tsx +1 -1
- package/corpus/templates/plan/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/plan/app/design-system.ts +3 -0
- package/corpus/templates/plan/app/entry.client.tsx +3 -0
- package/corpus/templates/plan/changelog/2026-07-22-recover-stale-pages-after-a-deployment-refresh-automatically.md +6 -0
- package/corpus/templates/slides/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/corpus/templates/slides/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/slides/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/slides/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/slides/app/design-system.ts +3 -0
- package/corpus/templates/slides/app/hooks/use-agent-generating.ts +10 -3
- package/corpus/templates/slides/app/pages/Index.tsx +1 -0
- package/corpus/templates/slides/changelog/2026-07-22-new-deck-prompts-now-open-in-their-own-visible-chat-thread.md +6 -0
- package/corpus/templates/tasks/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/corpus/templates/tasks/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/tasks/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/tasks/app/components/ui/toolkit-provider.tsx +17 -0
- package/corpus/templates/tasks/app/design-system.ts +3 -0
- package/corpus/templates/tasks/app/root.tsx +5 -2
- package/corpus/toolkit/CHANGELOG.md +23 -0
- package/corpus/toolkit/agent-native.eject.json +71 -0
- package/corpus/toolkit/package.json +31 -1
- package/corpus/toolkit/src/chat-history/ChatHistoryRail.tsx +100 -39
- package/corpus/toolkit/src/chat-history/index.ts +9 -0
- package/corpus/toolkit/src/chat-history/useChatHistoryRailController.ts +76 -0
- package/corpus/toolkit/src/chat-history.css +2 -0
- package/corpus/toolkit/src/composer/ComposerPlusMenu.tsx +11 -8
- package/corpus/toolkit/src/composer/PromptComposer.tsx +32 -7
- package/corpus/toolkit/src/composer/RealtimeVoiceMode.tsx +119 -31
- package/corpus/toolkit/src/composer/useRealtimeVoiceMode.tsx +124 -9
- package/corpus/toolkit/src/conformance/__fixtures__/css-in-js-adapter.tsx +401 -0
- package/corpus/toolkit/src/conformance/index.ts +3 -0
- package/corpus/toolkit/src/conformance/runner.tsx +862 -0
- package/corpus/toolkit/src/conformance/types.ts +45 -0
- package/corpus/toolkit/src/conformance/version.ts +22 -0
- package/corpus/toolkit/src/design-system/components.tsx +146 -0
- package/corpus/toolkit/src/design-system/context.tsx +31 -0
- package/corpus/toolkit/src/design-system/default-adapter.tsx +915 -0
- package/corpus/toolkit/src/design-system/definition.ts +14 -0
- package/corpus/toolkit/src/design-system/error-boundary.tsx +37 -0
- package/corpus/toolkit/src/design-system/index.ts +7 -0
- package/corpus/toolkit/src/design-system/theme.ts +145 -0
- package/corpus/toolkit/src/design-system/types.ts +363 -0
- package/corpus/toolkit/src/editor/SharedRichEditor.tsx +13 -2
- package/corpus/toolkit/src/editor/SlashCommandMenu.tsx +20 -0
- package/corpus/toolkit/src/editor/index.ts +2 -0
- package/corpus/toolkit/src/provider.tsx +98 -5
- package/corpus/toolkit/src/styles.css +52 -23
- package/corpus/toolkit/src/ui/button.tsx +95 -6
- package/corpus/toolkit/src/ui/dialog.tsx +48 -23
- package/corpus/toolkit/src/ui/popover.tsx +16 -2
- package/corpus/toolkit/src/ui/select.tsx +7 -3
- package/corpus/toolkit/src/ui/sidebar.tsx +47 -48
- package/corpus/toolkit/src/ui/tooltip.tsx +7 -3
- package/dist/a2a/client.d.ts +3 -1
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +17 -12
- package/dist/a2a/client.js.map +1 -1
- package/dist/a2a/types.d.ts +1 -1
- package/dist/a2a/types.d.ts.map +1 -1
- package/dist/a2a/types.js.map +1 -1
- package/dist/agent/types.d.ts +1 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/cli/index.js +18 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/multi-frontier-runs.js +3 -3
- package/dist/cli/multi-frontier-runs.js.map +1 -1
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +0 -12
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/cli/workspace-dev.js +1 -1
- package/dist/cli/workspace-dev.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +18 -15
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +26 -15
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/CommandMenu.d.ts.map +1 -1
- package/dist/client/CommandMenu.js +18 -106
- package/dist/client/CommandMenu.js.map +1 -1
- package/dist/client/RunStuckBanner.d.ts +3 -5
- package/dist/client/RunStuckBanner.d.ts.map +1 -1
- package/dist/client/RunStuckBanner.js +17 -18
- package/dist/client/RunStuckBanner.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +2 -1
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/app-providers.d.ts.map +1 -1
- package/dist/client/app-providers.js +1 -1
- package/dist/client/app-providers.js.map +1 -1
- package/dist/client/chat/action-chat-ui-surface.d.ts +8 -0
- package/dist/client/chat/action-chat-ui-surface.d.ts.map +1 -0
- package/dist/client/chat/action-chat-ui-surface.js +10 -0
- package/dist/client/chat/action-chat-ui-surface.js.map +1 -0
- package/dist/client/chat/message-components.d.ts +12 -1
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +102 -14
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/chat/tool-call-display.d.ts +3 -1
- package/dist/client/chat/tool-call-display.d.ts.map +1 -1
- package/dist/client/chat/tool-call-display.js +33 -14
- package/dist/client/chat/tool-call-display.js.map +1 -1
- package/dist/client/chat/widgets/InlineExtensionWidget.d.ts.map +1 -1
- package/dist/client/chat/widgets/InlineExtensionWidget.js +9 -12
- package/dist/client/chat/widgets/InlineExtensionWidget.js.map +1 -1
- package/dist/client/chat/widgets/builtin-tool-renderers.d.ts.map +1 -1
- package/dist/client/chat/widgets/builtin-tool-renderers.js +5 -3
- package/dist/client/chat/widgets/builtin-tool-renderers.js.map +1 -1
- package/dist/client/components/ui/message-scroller.d.ts +1 -1
- package/dist/client/components/ui/message-scroller.d.ts.map +1 -1
- package/dist/client/components/ui/message-scroller.js +4 -3
- package/dist/client/components/ui/message-scroller.js.map +1 -1
- package/dist/client/conversation/AgentConversation.d.ts.map +1 -1
- package/dist/client/conversation/AgentConversation.js +3 -2
- package/dist/client/conversation/AgentConversation.js.map +1 -1
- package/dist/client/error-capture.d.ts.map +1 -1
- package/dist/client/error-capture.js +2 -2
- package/dist/client/error-capture.js.map +1 -1
- package/dist/client/i18n.d.ts.map +1 -1
- package/dist/client/i18n.js +9 -0
- package/dist/client/i18n.js.map +1 -1
- package/dist/client/index.d.ts +2 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +2 -2
- package/dist/client/index.js.map +1 -1
- package/dist/client/org/TeamPage.d.ts.map +1 -1
- package/dist/client/org/TeamPage.js +41 -33
- package/dist/client/org/TeamPage.js.map +1 -1
- package/dist/client/progress/RunsTray.d.ts.map +1 -1
- package/dist/client/progress/RunsTray.js +9 -10
- package/dist/client/progress/RunsTray.js.map +1 -1
- package/dist/client/resources/McpConnectionSuggestion.d.ts +1 -0
- package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -1
- package/dist/client/resources/McpConnectionSuggestion.js +14 -12
- package/dist/client/resources/McpConnectionSuggestion.js.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.js +10 -8
- package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +3 -1
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/resources/mcp-integration-catalog.d.ts +2 -0
- package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
- package/dist/client/resources/mcp-integration-catalog.js +17 -17
- package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
- package/dist/client/resources/mcp-integration-logos.js +2 -2
- package/dist/client/resources/mcp-integration-logos.js.map +1 -1
- package/dist/client/route-chunk-recovery.d.ts.map +1 -1
- package/dist/client/route-chunk-recovery.js +5 -3
- package/dist/client/route-chunk-recovery.js.map +1 -1
- package/dist/client/session-replay.js +3 -3
- package/dist/client/session-replay.js.map +1 -1
- package/dist/client/settings/DemoModeSection.d.ts.map +1 -1
- package/dist/client/settings/DemoModeSection.js +2 -5
- package/dist/client/settings/DemoModeSection.js.map +1 -1
- package/dist/client/settings/SecretsSection.d.ts.map +1 -1
- package/dist/client/settings/SecretsSection.js +18 -6
- package/dist/client/settings/SecretsSection.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +53 -118
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
- package/dist/client/settings/SettingsTabsPage.js +16 -1
- package/dist/client/settings/SettingsTabsPage.js.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.js +2 -5
- package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
- package/dist/client/settings/index.d.ts +1 -0
- package/dist/client/settings/index.d.ts.map +1 -1
- package/dist/client/settings/index.js +1 -0
- package/dist/client/settings/index.js.map +1 -1
- package/dist/client/settings/useSettingsPanelController.d.ts +22 -0
- package/dist/client/settings/useSettingsPanelController.d.ts.map +1 -0
- package/dist/client/settings/useSettingsPanelController.js +103 -0
- package/dist/client/settings/useSettingsPanelController.js.map +1 -0
- package/dist/client/setup-connections/BuilderConnectCard.d.ts +14 -6
- package/dist/client/setup-connections/BuilderConnectCard.d.ts.map +1 -1
- package/dist/client/setup-connections/BuilderConnectCard.js +24 -16
- package/dist/client/setup-connections/BuilderConnectCard.js.map +1 -1
- package/dist/client/setup-connections/index.d.ts +2 -1
- package/dist/client/setup-connections/index.d.ts.map +1 -1
- package/dist/client/setup-connections/index.js +2 -1
- package/dist/client/setup-connections/index.js.map +1 -1
- package/dist/client/setup-connections/useBuilderConnectCardController.d.ts +34 -0
- package/dist/client/setup-connections/useBuilderConnectCardController.d.ts.map +1 -0
- package/dist/client/setup-connections/useBuilderConnectCardController.js +39 -0
- package/dist/client/setup-connections/useBuilderConnectCardController.js.map +1 -0
- package/dist/client/sharing/ShareButton.d.ts +2 -1
- package/dist/client/sharing/ShareButton.d.ts.map +1 -1
- package/dist/client/sharing/ShareButton.js +17 -463
- package/dist/client/sharing/ShareButton.js.map +1 -1
- package/dist/client/sharing/ShareDialog.d.ts +6 -6
- package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
- package/dist/client/sharing/ShareDialog.js +69 -283
- package/dist/client/sharing/ShareDialog.js.map +1 -1
- package/dist/client/sharing/index.d.ts +3 -0
- package/dist/client/sharing/index.d.ts.map +1 -1
- package/dist/client/sharing/index.js +3 -0
- package/dist/client/sharing/index.js.map +1 -1
- package/dist/client/sharing/share-controller-helpers.d.ts +70 -0
- package/dist/client/sharing/share-controller-helpers.d.ts.map +1 -0
- package/dist/client/sharing/share-controller-helpers.js +224 -0
- package/dist/client/sharing/share-controller-helpers.js.map +1 -0
- package/dist/client/sharing/useShareButtonController.d.ts +91 -0
- package/dist/client/sharing/useShareButtonController.d.ts.map +1 -0
- package/dist/client/sharing/useShareButtonController.js +397 -0
- package/dist/client/sharing/useShareButtonController.js.map +1 -0
- package/dist/client/sharing/useShareDialogController.d.ts +109 -0
- package/dist/client/sharing/useShareDialogController.d.ts.map +1 -0
- package/dist/client/sharing/useShareDialogController.js +348 -0
- package/dist/client/sharing/useShareDialogController.js.map +1 -0
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +21 -0
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/client/tool-display.d.ts +16 -0
- package/dist/client/tool-display.d.ts.map +1 -1
- package/dist/client/tool-display.js +52 -0
- package/dist/client/tool-display.js.map +1 -1
- package/dist/client/transcription/use-live-transcription.d.ts +3 -3
- package/dist/client/transcription/use-live-transcription.d.ts.map +1 -1
- package/dist/client/transcription/use-live-transcription.js +22 -11
- package/dist/client/transcription/use-live-transcription.js.map +1 -1
- package/dist/client/use-agent-engine-configured.d.ts +3 -2
- package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
- package/dist/client/use-agent-engine-configured.js +7 -19
- package/dist/client/use-agent-engine-configured.js.map +1 -1
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js +21 -8
- package/dist/client/use-chat-threads.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +1 -1
- package/dist/deploy/build.js.map +1 -1
- package/dist/guards/db-tool-scoping.js +1 -1
- package/dist/guards/db-tool-scoping.js.map +1 -1
- package/dist/integrations/adapters/slack.d.ts +1 -0
- package/dist/integrations/adapters/slack.d.ts.map +1 -1
- package/dist/integrations/adapters/slack.js +61 -5
- package/dist/integrations/adapters/slack.js.map +1 -1
- package/dist/integrations/index.d.ts +1 -1
- package/dist/integrations/index.d.ts.map +1 -1
- package/dist/integrations/index.js +1 -1
- package/dist/integrations/index.js.map +1 -1
- package/dist/localization/default-messages.d.ts +4 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +5 -1
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/mcp-client/oauth-routes.d.ts +5 -0
- package/dist/mcp-client/oauth-routes.d.ts.map +1 -1
- package/dist/mcp-client/oauth-routes.js +53 -14
- package/dist/mcp-client/oauth-routes.js.map +1 -1
- package/dist/notifications/routes.d.ts +2 -2
- package/dist/observability/routes.d.ts +1 -1
- package/dist/provider-api/actions/custom-provider-registration.d.ts +12 -12
- package/dist/provider-api/actions/provider-api.d.ts +11 -11
- package/dist/scripts/call-agent.d.ts.map +1 -1
- package/dist/scripts/call-agent.js +5 -1
- package/dist/scripts/call-agent.js.map +1 -1
- package/dist/secrets/routes.d.ts +6 -6
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/realtime-voice.d.ts.map +1 -1
- package/dist/server/realtime-voice.js +2 -2
- package/dist/server/realtime-voice.js.map +1 -1
- package/dist/styles/agent-native.css +0 -24
- package/dist/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/dist/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +22 -2
- package/dist/templates/chat/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/dist/templates/chat/app/components/ui/toolkit-provider.tsx +6 -1
- package/dist/templates/chat/app/design-system.ts +3 -0
- package/dist/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/dist/templates/default/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +22 -2
- package/dist/templates/default/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/dist/templates/default/app/components/ui/toolkit-provider.tsx +10 -0
- package/dist/templates/default/app/design-system.ts +3 -0
- package/dist/templates/default/app/root.tsx +5 -2
- package/dist/templates/default/package.json +1 -0
- package/dist/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/dist/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/dist/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +22 -2
- package/dist/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
- package/dist/terminal/cli-registry.js +1 -1
- package/dist/terminal/cli-registry.js.map +1 -1
- package/dist/vite/client.d.ts +11 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +144 -2
- package/dist/vite/client.js.map +1 -1
- package/docs/content/custom-design-system.mdx +445 -0
- package/docs/content/toolkit-ui.mdx +16 -0
- package/package.json +2 -2
- package/src/a2a/client.ts +32 -10
- package/src/a2a/types.ts +1 -0
- package/src/agent/types.ts +1 -1
- package/src/cli/index.ts +18 -10
- package/src/cli/multi-frontier-runs.ts +5 -3
- package/src/cli/templates-meta.ts +0 -12
- package/src/cli/workspace-dev.ts +1 -1
- package/src/client/AgentPanel.tsx +99 -108
- package/src/client/AssistantChat.tsx +30 -13
- package/src/client/CommandMenu.tsx +68 -178
- package/src/client/RunStuckBanner.tsx +39 -47
- package/src/client/agent-chat-adapter.ts +3 -1
- package/src/client/app-providers.tsx +1 -1
- package/src/client/chat/action-chat-ui-surface.tsx +32 -0
- package/src/client/chat/message-components.tsx +169 -18
- package/src/client/chat/tool-call-display.tsx +50 -14
- package/src/client/chat/widgets/InlineExtensionWidget.tsx +13 -40
- package/src/client/chat/widgets/builtin-tool-renderers.tsx +7 -3
- package/src/client/components/ui/message-scroller.tsx +15 -1
- package/src/client/conversation/AgentConversation.tsx +12 -1
- package/src/client/error-capture.ts +2 -6
- package/src/client/i18n.tsx +22 -0
- package/src/client/index.ts +17 -0
- package/src/client/org/TeamPage.tsx +257 -153
- package/src/client/progress/RunsTray.tsx +89 -88
- package/src/client/resources/McpConnectionSuggestion.tsx +25 -16
- package/src/client/resources/McpIntegrationDialog.tsx +34 -13
- package/src/client/resources/ResourcesPanel.tsx +5 -1
- package/src/client/resources/mcp-integration-catalog.ts +20 -17
- package/src/client/resources/mcp-integration-logos.ts +2 -2
- package/src/client/route-chunk-recovery.ts +5 -3
- package/src/client/session-replay.ts +3 -3
- package/src/client/settings/DemoModeSection.tsx +6 -18
- package/src/client/settings/SecretsSection.tsx +97 -52
- package/src/client/settings/SettingsPanel.tsx +217 -252
- package/src/client/settings/SettingsTabsPage.tsx +23 -2
- package/src/client/settings/VoiceTranscriptionSection.tsx +7 -18
- package/src/client/settings/index.ts +7 -0
- package/src/client/settings/useSettingsPanelController.ts +155 -0
- package/src/client/setup-connections/BuilderConnectCard.tsx +116 -51
- package/src/client/setup-connections/index.ts +10 -0
- package/src/client/setup-connections/useBuilderConnectCardController.ts +82 -0
- package/src/client/sharing/ShareButton.tsx +64 -586
- package/src/client/sharing/ShareDialog.tsx +299 -633
- package/src/client/sharing/index.ts +42 -0
- package/src/client/sharing/share-controller-helpers.ts +318 -0
- package/src/client/sharing/useShareButtonController.ts +600 -0
- package/src/client/sharing/useShareDialogController.ts +559 -0
- package/src/client/sse-event-processor.ts +23 -0
- package/src/client/tool-display.ts +71 -0
- package/src/client/transcription/use-live-transcription.ts +64 -45
- package/src/client/use-agent-engine-configured.ts +12 -19
- package/src/client/use-chat-threads.ts +33 -12
- package/src/deploy/build.ts +2 -1
- package/src/guards/db-tool-scoping.ts +1 -1
- package/src/integrations/adapters/slack.ts +84 -5
- package/src/integrations/index.ts +5 -1
- package/src/localization/default-messages.ts +6 -1
- package/src/mcp-client/oauth-routes.ts +61 -14
- package/src/scripts/call-agent.ts +5 -1
- package/src/server/realtime-voice.ts +5 -2
- package/src/styles/agent-native.css +0 -24
- package/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/src/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +22 -2
- package/src/templates/chat/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/src/templates/chat/app/components/ui/toolkit-provider.tsx +6 -1
- package/src/templates/chat/app/design-system.ts +3 -0
- package/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/src/templates/default/.agents/skills/frontend-design/SKILL.md +22 -2
- package/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/src/templates/default/app/components/ui/toolkit-provider.tsx +10 -0
- package/src/templates/default/app/design-system.ts +3 -0
- package/src/templates/default/app/root.tsx +5 -2
- package/src/templates/default/package.json +1 -0
- package/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
- package/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +22 -2
- package/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
- package/src/terminal/cli-registry.ts +1 -1
- package/src/vite/client.ts +205 -1
- package/corpus/templates/analytics/app/components/ui/calendar.tsx +0 -70
- package/corpus/templates/analytics/app/components/ui/chart.tsx +0 -386
- package/corpus/templates/calendar/app/components/ui/sonner.tsx +0 -58
- package/corpus/templates/crm/.agents/skills/agent-native-docs/SKILL.md +0 -115
- package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +0 -142
- package/corpus/templates/crm/.agents/skills/crm/SKILL.md +0 -128
- package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +0 -145
- package/corpus/templates/crm/.agents/skills/feature-flags/SKILL.md +0 -169
- package/corpus/templates/crm/.agents/skills/upgrade-agent-native/SKILL.md +0 -100
- package/corpus/templates/crm/.env.example +0 -5
- package/corpus/templates/crm/AGENTS.md +0 -120
- package/corpus/templates/crm/CHANGELOG.md +0 -1
- package/corpus/templates/crm/DEVELOPING.md +0 -66
- package/corpus/templates/crm/README.md +0 -106
- package/corpus/templates/crm/_gitignore +0 -12
- package/corpus/templates/crm/actions/_crm-action-utils.ts +0 -87
- package/corpus/templates/crm/actions/_crm-dashboard.ts +0 -69
- package/corpus/templates/crm/actions/_crm-data-program-actions.ts +0 -15
- package/corpus/templates/crm/actions/_crm-signal-utils.ts +0 -79
- package/corpus/templates/crm/actions/apply-crm-proposals.ts +0 -203
- package/corpus/templates/crm/actions/attach-call-evidence.ts +0 -170
- package/corpus/templates/crm/actions/configure-crm-connection.ts +0 -126
- package/corpus/templates/crm/actions/configure-native-crm.ts +0 -44
- package/corpus/templates/crm/actions/create-crm-record.ts +0 -148
- package/corpus/templates/crm/actions/create-crm-signal-tracker.ts +0 -58
- package/corpus/templates/crm/actions/delete-staged-dataset.ts +0 -14
- package/corpus/templates/crm/actions/get-crm-automation-recipe.ts +0 -36
- package/corpus/templates/crm/actions/get-crm-dashboard-panel.ts +0 -35
- package/corpus/templates/crm/actions/get-crm-dashboard.ts +0 -14
- package/corpus/templates/crm/actions/get-crm-overview.ts +0 -13
- package/corpus/templates/crm/actions/get-crm-pipeline-data.ts +0 -61
- package/corpus/templates/crm/actions/get-crm-record.ts +0 -75
- package/corpus/templates/crm/actions/install-crm-pipeline-dashboard.ts +0 -81
- package/corpus/templates/crm/actions/list-crm-dashboard-revisions.ts +0 -15
- package/corpus/templates/crm/actions/list-crm-dashboards.ts +0 -15
- package/corpus/templates/crm/actions/list-crm-proposals.ts +0 -31
- package/corpus/templates/crm/actions/list-crm-records.ts +0 -79
- package/corpus/templates/crm/actions/list-crm-saved-views.ts +0 -15
- package/corpus/templates/crm/actions/list-crm-signal-hits.ts +0 -43
- package/corpus/templates/crm/actions/list-crm-signal-trackers.ts +0 -32
- package/corpus/templates/crm/actions/list-crm-tasks.ts +0 -22
- package/corpus/templates/crm/actions/list-staged-datasets.ts +0 -14
- package/corpus/templates/crm/actions/list-workspace-connections.ts +0 -47
- package/corpus/templates/crm/actions/manage-crm-signal-tracker.ts +0 -87
- package/corpus/templates/crm/actions/manage-crm-task.ts +0 -132
- package/corpus/templates/crm/actions/navigate.ts +0 -63
- package/corpus/templates/crm/actions/provider-api-catalog.ts +0 -22
- package/corpus/templates/crm/actions/provider-api-docs.ts +0 -54
- package/corpus/templates/crm/actions/provider-api-request.ts +0 -92
- package/corpus/templates/crm/actions/query-staged-dataset.ts +0 -44
- package/corpus/templates/crm/actions/record-crm-call-insight.ts +0 -160
- package/corpus/templates/crm/actions/record-crm-smart-signal.ts +0 -150
- package/corpus/templates/crm/actions/restore-crm-dashboard-revision.ts +0 -23
- package/corpus/templates/crm/actions/review-crm-signal.ts +0 -31
- package/corpus/templates/crm/actions/run-crm-saved-view-program.ts +0 -103
- package/corpus/templates/crm/actions/run-crm-signal-trackers.ts +0 -275
- package/corpus/templates/crm/actions/run.ts +0 -7
- package/corpus/templates/crm/actions/save-crm-dashboard.ts +0 -51
- package/corpus/templates/crm/actions/save-crm-saved-view.ts +0 -119
- package/corpus/templates/crm/actions/sync-crm.ts +0 -146
- package/corpus/templates/crm/actions/update-crm-record.ts +0 -510
- package/corpus/templates/crm/actions/view-screen.ts +0 -218
- package/corpus/templates/crm/agent-native.app-skill.json +0 -58
- package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +0 -158
- package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +0 -83
- package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +0 -225
- package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +0 -413
- package/corpus/templates/crm/app/components/crm/RecordActions.tsx +0 -510
- package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +0 -134
- package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +0 -367
- package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +0 -92
- package/corpus/templates/crm/app/components/crm/Surface.tsx +0 -96
- package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +0 -180
- package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +0 -112
- package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +0 -84
- package/corpus/templates/crm/app/entry.client.tsx +0 -16
- package/corpus/templates/crm/app/entry.server.tsx +0 -10
- package/corpus/templates/crm/app/global.css +0 -167
- package/corpus/templates/crm/app/hooks/use-navigation-state.ts +0 -60
- package/corpus/templates/crm/app/i18n/en-US.ts +0 -89
- package/corpus/templates/crm/app/i18n/index.ts +0 -34
- package/corpus/templates/crm/app/lib/dashboard.ts +0 -13
- package/corpus/templates/crm/app/lib/navigation.ts +0 -54
- package/corpus/templates/crm/app/lib/tab-id.ts +0 -1
- package/corpus/templates/crm/app/lib/types.ts +0 -172
- package/corpus/templates/crm/app/lib/utils.ts +0 -1
- package/corpus/templates/crm/app/root.tsx +0 -88
- package/corpus/templates/crm/app/routes/_index.tsx +0 -26
- package/corpus/templates/crm/app/routes/accounts.tsx +0 -41
- package/corpus/templates/crm/app/routes/agent.tsx +0 -5
- package/corpus/templates/crm/app/routes/ask.tsx +0 -53
- package/corpus/templates/crm/app/routes/dashboard.tsx +0 -118
- package/corpus/templates/crm/app/routes/opportunities.tsx +0 -41
- package/corpus/templates/crm/app/routes/people.tsx +0 -41
- package/corpus/templates/crm/app/routes/proposals.tsx +0 -266
- package/corpus/templates/crm/app/routes/records.$recordId.tsx +0 -35
- package/corpus/templates/crm/app/routes/settings.tsx +0 -63
- package/corpus/templates/crm/app/routes/setup.tsx +0 -308
- package/corpus/templates/crm/app/routes/tasks.tsx +0 -252
- package/corpus/templates/crm/app/routes/views.tsx +0 -333
- package/corpus/templates/crm/app/routes.ts +0 -17
- package/corpus/templates/crm/app/vite-env.d.ts +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-agent-native-crm.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-clips-call-evidence-review-recipe.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-find-and-review-evidence-grounded-call-signals-w.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-manage-keyword-and-smart-call-signal-trackers-fr.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-delegated-local-crm-automation.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-native-sql.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboard.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboards-now-install-correctly-from-the-crm-actio.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-salesforce-connection.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-22-crm-field-validation-now-explains-which-fields-cannot-be-edi.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-22-fixed-hubspot-contact-syncs-missing-records-updated-after-th.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-22-fixed-pipeline-dashboard-panels-so-their-opportunity-data-lo.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +0 -6
- package/corpus/templates/crm/components.json +0 -20
- package/corpus/templates/crm/docs/architecture/crm-contract.md +0 -180
- package/corpus/templates/crm/learnings.defaults.md +0 -5
- package/corpus/templates/crm/package.json +0 -59
- package/corpus/templates/crm/public/favicon.svg +0 -1
- package/corpus/templates/crm/public/icon-180.svg +0 -1
- package/corpus/templates/crm/public/manifest.json +0 -11
- package/corpus/templates/crm/react-router.config.ts +0 -7
- package/corpus/templates/crm/server/crm/adapter.ts +0 -32
- package/corpus/templates/crm/server/crm/crm-field-firewall.ts +0 -64
- package/corpus/templates/crm/server/crm/crm-mirror.ts +0 -711
- package/corpus/templates/crm/server/crm/hubspot-adapter.ts +0 -1146
- package/corpus/templates/crm/server/crm/native-adapter.ts +0 -1715
- package/corpus/templates/crm/server/crm/read-through.ts +0 -207
- package/corpus/templates/crm/server/crm/salesforce-adapter.ts +0 -1255
- package/corpus/templates/crm/server/db/crm-store.ts +0 -1170
- package/corpus/templates/crm/server/db/index.ts +0 -169
- package/corpus/templates/crm/server/db/schema.ts +0 -441
- package/corpus/templates/crm/server/lib/intelligence/default-detectors.ts +0 -65
- package/corpus/templates/crm/server/lib/intelligence/evidence.ts +0 -105
- package/corpus/templates/crm/server/lib/intelligence/keyword-detector.ts +0 -100
- package/corpus/templates/crm/server/lib/intelligence/smart-detector.ts +0 -144
- package/corpus/templates/crm/server/lib/intelligence/summary.ts +0 -141
- package/corpus/templates/crm/server/lib/provider-api.ts +0 -64
- package/corpus/templates/crm/server/middleware/auth.ts +0 -4
- package/corpus/templates/crm/server/plugins/agent-chat.ts +0 -68
- package/corpus/templates/crm/server/plugins/auth.ts +0 -14
- package/corpus/templates/crm/server/plugins/core-routes.ts +0 -17
- package/corpus/templates/crm/server/plugins/db.ts +0 -454
- package/corpus/templates/crm/server/routes/[...page].get.ts +0 -5
- package/corpus/templates/crm/shared/crm-automation-recipes.ts +0 -132
- package/corpus/templates/crm/shared/crm-contract.ts +0 -254
- package/corpus/templates/crm/shared/crm-sales-config.ts +0 -63
- package/corpus/templates/crm/ssr-entry.ts +0 -11
- package/corpus/templates/crm/tsconfig.json +0 -24
- package/corpus/templates/crm/vite.config.ts +0 -15
- package/corpus/templates/crm/vitest.config.ts +0 -5
- package/corpus/templates/forms/app/components/ui/calendar.tsx +0 -214
- package/corpus/templates/forms/app/components/ui/chart.tsx +0 -379
- package/corpus/templates/forms/app/components/ui/command.tsx +0 -153
- package/corpus/templates/forms/app/components/ui/context-menu.tsx +0 -198
- package/corpus/templates/forms/app/components/ui/menubar.tsx +0 -254
- package/corpus/templates/macros/app/components/ui/menubar.tsx +0 -238
- package/corpus/templates/macros/app/components/ui/progress.tsx +0 -26
- package/corpus/templates/mail/app/components/ui/calendar.tsx +0 -211
- package/corpus/templates/mail/app/components/ui/chart.tsx +0 -379
- package/corpus/templates/mail/app/components/ui/command.tsx +0 -153
- package/corpus/templates/mail/app/components/ui/context-menu.tsx +0 -198
- package/corpus/templates/mail/app/components/ui/menubar.tsx +0 -254
- package/corpus/templates/tasks/app/components/ui/accordion.tsx +0 -56
- package/corpus/templates/tasks/app/components/ui/aspect-ratio.tsx +0 -5
- package/corpus/templates/tasks/app/components/ui/breadcrumb.tsx +0 -115
- package/corpus/templates/tasks/app/components/ui/calendar.tsx +0 -70
- package/corpus/templates/tasks/app/components/ui/carousel.tsx +0 -260
- package/corpus/templates/tasks/app/components/ui/chart.tsx +0 -379
- package/corpus/templates/tasks/app/components/ui/form.tsx +0 -177
- package/corpus/templates/tasks/app/components/ui/hover-card.tsx +0 -27
- package/corpus/templates/tasks/app/components/ui/input-otp.tsx +0 -69
- package/corpus/templates/tasks/app/components/ui/menubar.tsx +0 -254
- package/corpus/templates/tasks/app/components/ui/navigation-menu.tsx +0 -128
- package/corpus/templates/tasks/app/components/ui/pagination.tsx +0 -121
- package/corpus/templates/tasks/app/components/ui/resizable.tsx +0 -43
- package/corpus/templates/tasks/app/components/ui/sidebar.tsx +0 -782
- package/corpus/templates/tasks/app/components/ui/toggle.tsx +0 -43
|
@@ -1,4 +1,20 @@
|
|
|
1
1
|
export declare function humanizeToolName(toolName: string | undefined): string;
|
|
2
2
|
export declare function runningToolLabel(toolName: string | undefined): string;
|
|
3
3
|
export declare function humanizeToolLabelText(label: string, toolName: string | undefined): string;
|
|
4
|
+
type ToolDisplayPart = {
|
|
5
|
+
type?: string;
|
|
6
|
+
toolCallId?: string;
|
|
7
|
+
toolName?: string;
|
|
8
|
+
argsText?: string;
|
|
9
|
+
args?: Record<string, unknown>;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* `call-agent` emits both its ordinary tool row and a richer `agent:<name>`
|
|
13
|
+
* progress row. Keep the ordinary part in message state for tool completion
|
|
14
|
+
* and history, but let presentation code suppress it once the richer row is
|
|
15
|
+
* available.
|
|
16
|
+
*/
|
|
17
|
+
export declare function isCallAgentToolCallShadowed(parts: readonly ToolDisplayPart[], index: number): boolean;
|
|
18
|
+
export declare function shadowedCallAgentToolCallIds(parts: readonly ToolDisplayPart[]): Set<string>;
|
|
19
|
+
export {};
|
|
4
20
|
//# sourceMappingURL=tool-display.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-display.d.ts","sourceRoot":"","sources":["../../src/client/tool-display.ts"],"names":[],"mappings":"AAMA,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAoBrE;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAErE;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,MAAM,CAKR"}
|
|
1
|
+
{"version":3,"file":"tool-display.d.ts","sourceRoot":"","sources":["../../src/client/tool-display.ts"],"names":[],"mappings":"AAMA,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAoBrE;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAErE;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,MAAM,CAKR;AAED,KAAK,eAAe,GAAG;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC,CAAC;AAqBF;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,SAAS,eAAe,EAAE,EACjC,KAAK,EAAE,MAAM,GACZ,OAAO,CAqBT;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,SAAS,eAAe,EAAE,GAChC,GAAG,CAAC,MAAM,CAAC,CAQb"}
|
|
@@ -33,4 +33,56 @@ export function humanizeToolLabelText(label, toolName) {
|
|
|
33
33
|
return text;
|
|
34
34
|
return text.split(tool).join(humanizeToolName(tool));
|
|
35
35
|
}
|
|
36
|
+
function normalizedAgentName(value) {
|
|
37
|
+
if (typeof value !== "string")
|
|
38
|
+
return null;
|
|
39
|
+
const name = value.trim().toLowerCase();
|
|
40
|
+
return name || null;
|
|
41
|
+
}
|
|
42
|
+
function callAgentTarget(part) {
|
|
43
|
+
const parsedTarget = normalizedAgentName(part.args?.agent);
|
|
44
|
+
if (parsedTarget)
|
|
45
|
+
return parsedTarget;
|
|
46
|
+
if (!part.argsText)
|
|
47
|
+
return null;
|
|
48
|
+
try {
|
|
49
|
+
const args = JSON.parse(part.argsText);
|
|
50
|
+
return normalizedAgentName(args.agent);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* `call-agent` emits both its ordinary tool row and a richer `agent:<name>`
|
|
58
|
+
* progress row. Keep the ordinary part in message state for tool completion
|
|
59
|
+
* and history, but let presentation code suppress it once the richer row is
|
|
60
|
+
* available.
|
|
61
|
+
*/
|
|
62
|
+
export function isCallAgentToolCallShadowed(parts, index) {
|
|
63
|
+
const part = parts[index];
|
|
64
|
+
if (part?.type !== "tool-call" || part.toolName !== "call-agent") {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
const agentRows = parts.filter((candidate) => {
|
|
68
|
+
if (candidate.type !== "tool-call" ||
|
|
69
|
+
!candidate.toolName?.startsWith("agent:")) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
return true;
|
|
73
|
+
});
|
|
74
|
+
const target = callAgentTarget(part);
|
|
75
|
+
if (!target)
|
|
76
|
+
return agentRows.length > 0;
|
|
77
|
+
return agentRows.some((candidate) => normalizedAgentName(candidate.toolName?.slice(6)) === target);
|
|
78
|
+
}
|
|
79
|
+
export function shadowedCallAgentToolCallIds(parts) {
|
|
80
|
+
const ids = new Set();
|
|
81
|
+
parts.forEach((part, index) => {
|
|
82
|
+
if (part.toolCallId && isCallAgentToolCallShadowed(parts, index)) {
|
|
83
|
+
ids.add(part.toolCallId);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
return ids;
|
|
87
|
+
}
|
|
36
88
|
//# sourceMappingURL=tool-display.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-display.js","sourceRoot":"","sources":["../../src/client/tool-display.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAA2B;IACjD,aAAa,EAAE,eAAe;IAC9B,qBAAqB,EAAE,qBAAqB;IAC5C,aAAa,EAAE,aAAa;CAC7B,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,QAA4B;IAC3D,MAAM,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,CAAC,GAAG;QAAE,OAAO,MAAM,CAAC;IACxB,MAAM,WAAW,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC;IAEpC,IAAI,IAAI,GAAG,GAAG,CAAC;IACf,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;IACzC,CAAC;IAED,IAAI,GAAG,IAAI;SACR,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClB,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;IAEV,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAA4B;IAC3D,OAAO,WAAW,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,KAAa,EACb,QAA4B;IAE5B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC1B,MAAM,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;AACvD,CAAC","sourcesContent":["const TOOL_DISPLAY_NAMES: Record<string, string> = {\n \"delete-file\": \"remove screen\",\n \"get-design-snapshot\": \"get screen snapshot\",\n \"edit-design\": \"edit screen\",\n};\n\nexport function humanizeToolName(toolName: string | undefined): string {\n const raw = (toolName ?? \"\").trim();\n if (!raw) return \"tool\";\n const displayName = TOOL_DISPLAY_NAMES[raw];\n if (displayName) return displayName;\n\n let name = raw;\n if (name.startsWith(\"mcp__\")) {\n const parts = name.split(\"__\").filter(Boolean);\n name = parts[parts.length - 1] ?? name;\n }\n\n name = name\n .replace(/^_+/, \"\")\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[-_]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n\n return (name || \"tool\").toLowerCase();\n}\n\nexport function runningToolLabel(toolName: string | undefined): string {\n return `Running ${humanizeToolName(toolName)}`;\n}\n\nexport function humanizeToolLabelText(\n label: string,\n toolName: string | undefined,\n): string {\n const text = label.trim();\n const tool = (toolName ?? \"\").trim();\n if (!tool) return text;\n return text.split(tool).join(humanizeToolName(tool));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tool-display.js","sourceRoot":"","sources":["../../src/client/tool-display.ts"],"names":[],"mappings":"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","sourcesContent":["const TOOL_DISPLAY_NAMES: Record<string, string> = {\n \"delete-file\": \"remove screen\",\n \"get-design-snapshot\": \"get screen snapshot\",\n \"edit-design\": \"edit screen\",\n};\n\nexport function humanizeToolName(toolName: string | undefined): string {\n const raw = (toolName ?? \"\").trim();\n if (!raw) return \"tool\";\n const displayName = TOOL_DISPLAY_NAMES[raw];\n if (displayName) return displayName;\n\n let name = raw;\n if (name.startsWith(\"mcp__\")) {\n const parts = name.split(\"__\").filter(Boolean);\n name = parts[parts.length - 1] ?? name;\n }\n\n name = name\n .replace(/^_+/, \"\")\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[-_]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n\n return (name || \"tool\").toLowerCase();\n}\n\nexport function runningToolLabel(toolName: string | undefined): string {\n return `Running ${humanizeToolName(toolName)}`;\n}\n\nexport function humanizeToolLabelText(\n label: string,\n toolName: string | undefined,\n): string {\n const text = label.trim();\n const tool = (toolName ?? \"\").trim();\n if (!tool) return text;\n return text.split(tool).join(humanizeToolName(tool));\n}\n\ntype ToolDisplayPart = {\n type?: string;\n toolCallId?: string;\n toolName?: string;\n argsText?: string;\n args?: Record<string, unknown>;\n};\n\nfunction normalizedAgentName(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const name = value.trim().toLowerCase();\n return name || null;\n}\n\nfunction callAgentTarget(part: ToolDisplayPart): string | null {\n const parsedTarget = normalizedAgentName(part.args?.agent);\n if (parsedTarget) return parsedTarget;\n if (!part.argsText) return null;\n\n try {\n const args = JSON.parse(part.argsText) as Record<string, unknown>;\n return normalizedAgentName(args.agent);\n } catch {\n return null;\n }\n}\n\n/**\n * `call-agent` emits both its ordinary tool row and a richer `agent:<name>`\n * progress row. Keep the ordinary part in message state for tool completion\n * and history, but let presentation code suppress it once the richer row is\n * available.\n */\nexport function isCallAgentToolCallShadowed(\n parts: readonly ToolDisplayPart[],\n index: number,\n): boolean {\n const part = parts[index];\n if (part?.type !== \"tool-call\" || part.toolName !== \"call-agent\") {\n return false;\n }\n\n const agentRows = parts.filter((candidate) => {\n if (\n candidate.type !== \"tool-call\" ||\n !candidate.toolName?.startsWith(\"agent:\")\n ) {\n return false;\n }\n return true;\n });\n const target = callAgentTarget(part);\n if (!target) return agentRows.length > 0;\n\n return agentRows.some(\n (candidate) => normalizedAgentName(candidate.toolName?.slice(6)) === target,\n );\n}\n\nexport function shadowedCallAgentToolCallIds(\n parts: readonly ToolDisplayPart[],\n): Set<string> {\n const ids = new Set<string>();\n parts.forEach((part, index) => {\n if (part.toolCallId && isCallAgentToolCallShadowed(parts, index)) {\n ids.add(part.toolCallId);\n }\n });\n return ids;\n}\n"]}
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
* stop when the user hits stop. The accumulated transcript is available
|
|
7
7
|
* immediately — no round-trip to Whisper needed.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* Builder can transcribe the original recording afterward if native capture
|
|
10
|
+
* produces no text, but this gives users something useful from second zero
|
|
11
|
+
* without a cloud transcription request.
|
|
12
12
|
*/
|
|
13
13
|
export interface UseLiveTranscriptionOptions {
|
|
14
14
|
lang?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-live-transcription.d.ts","sourceRoot":"","sources":["../../../src/client/transcription/use-live-transcription.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAiBH,MAAM,WAAW,2BAA2B;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,MAAM,CAAC;IACnB,WAAW,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,wBAAgB,oBAAoB,CAClC,OAAO,CAAC,EAAE,2BAA2B,GACpC,oBAAoB,
|
|
1
|
+
{"version":3,"file":"use-live-transcription.d.ts","sourceRoot":"","sources":["../../../src/client/transcription/use-live-transcription.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAiBH,MAAM,WAAW,2BAA2B;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,MAAM,CAAC;IACnB,WAAW,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,wBAAgB,oBAAoB,CAClC,OAAO,CAAC,EAAE,2BAA2B,GACpC,oBAAoB,CAsQtB"}
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
* stop when the user hits stop. The accumulated transcript is available
|
|
7
7
|
* immediately — no round-trip to Whisper needed.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* Builder can transcribe the original recording afterward if native capture
|
|
10
|
+
* produces no text, but this gives users something useful from second zero
|
|
11
|
+
* without a cloud transcription request.
|
|
12
12
|
*/
|
|
13
13
|
import { useCallback, useEffect, useRef, useState } from "react";
|
|
14
14
|
const NETWORK_RESTART_BASE_MS = 1_000;
|
|
@@ -30,11 +30,15 @@ export function useLiveTranscription(options) {
|
|
|
30
30
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
31
31
|
const recognitionRef = useRef(null);
|
|
32
32
|
const transcriptRef = useRef("");
|
|
33
|
+
const interimRef = useRef("");
|
|
33
34
|
const stoppedManuallyRef = useRef(false);
|
|
34
35
|
const stopWaiterRef = useRef(null);
|
|
35
36
|
const restartTimerRef = useRef(null);
|
|
36
37
|
const networkErrorCountRef = useRef(0);
|
|
37
38
|
const restartDelayRef = useRef(0);
|
|
39
|
+
const currentTranscript = useCallback(() => [transcriptRef.current.trim(), interimRef.current.trim()]
|
|
40
|
+
.filter(Boolean)
|
|
41
|
+
.join(" "), []);
|
|
38
42
|
const supported = !!getSpeechRecognitionCtor();
|
|
39
43
|
const start = useCallback(() => {
|
|
40
44
|
const Ctor = getSpeechRecognitionCtor();
|
|
@@ -59,6 +63,7 @@ export function useLiveTranscription(options) {
|
|
|
59
63
|
recognition.lang = lang;
|
|
60
64
|
recognitionRef.current = recognition;
|
|
61
65
|
transcriptRef.current = "";
|
|
66
|
+
interimRef.current = "";
|
|
62
67
|
stoppedManuallyRef.current = false;
|
|
63
68
|
networkErrorCountRef.current = 0;
|
|
64
69
|
restartDelayRef.current = 0;
|
|
@@ -77,6 +82,7 @@ export function useLiveTranscription(options) {
|
|
|
77
82
|
interim += text;
|
|
78
83
|
}
|
|
79
84
|
}
|
|
85
|
+
interimRef.current = interim;
|
|
80
86
|
setInterimText(interim);
|
|
81
87
|
if (event.results.length > 0) {
|
|
82
88
|
networkErrorCountRef.current = 0;
|
|
@@ -129,7 +135,7 @@ export function useLiveTranscription(options) {
|
|
|
129
135
|
}
|
|
130
136
|
setIsActive(false);
|
|
131
137
|
if (stopWaiterRef.current) {
|
|
132
|
-
stopWaiterRef.current(
|
|
138
|
+
stopWaiterRef.current(currentTranscript());
|
|
133
139
|
}
|
|
134
140
|
};
|
|
135
141
|
try {
|
|
@@ -139,13 +145,15 @@ export function useLiveTranscription(options) {
|
|
|
139
145
|
catch {
|
|
140
146
|
/* browser may block without user gesture */
|
|
141
147
|
}
|
|
142
|
-
}, [lang]);
|
|
148
|
+
}, [currentTranscript, lang]);
|
|
143
149
|
const stop = useCallback(() => {
|
|
150
|
+
const text = currentTranscript();
|
|
144
151
|
stoppedManuallyRef.current = true;
|
|
145
152
|
if (restartTimerRef.current !== null) {
|
|
146
153
|
window.clearTimeout(restartTimerRef.current);
|
|
147
154
|
restartTimerRef.current = null;
|
|
148
155
|
}
|
|
156
|
+
interimRef.current = "";
|
|
149
157
|
setInterimText("");
|
|
150
158
|
if (recognitionRef.current) {
|
|
151
159
|
try {
|
|
@@ -157,8 +165,8 @@ export function useLiveTranscription(options) {
|
|
|
157
165
|
recognitionRef.current = null;
|
|
158
166
|
}
|
|
159
167
|
setIsActive(false);
|
|
160
|
-
return
|
|
161
|
-
}, []);
|
|
168
|
+
return text;
|
|
169
|
+
}, [currentTranscript]);
|
|
162
170
|
const stopAndWait = useCallback((timeoutMs = 1200) => {
|
|
163
171
|
stoppedManuallyRef.current = true;
|
|
164
172
|
if (restartTimerRef.current !== null) {
|
|
@@ -168,8 +176,10 @@ export function useLiveTranscription(options) {
|
|
|
168
176
|
setInterimText("");
|
|
169
177
|
const recognition = recognitionRef.current;
|
|
170
178
|
if (!recognition) {
|
|
179
|
+
const text = currentTranscript();
|
|
180
|
+
interimRef.current = "";
|
|
171
181
|
setIsActive(false);
|
|
172
|
-
return Promise.resolve(
|
|
182
|
+
return Promise.resolve(text);
|
|
173
183
|
}
|
|
174
184
|
return new Promise((resolve) => {
|
|
175
185
|
let settled = false;
|
|
@@ -184,21 +194,22 @@ export function useLiveTranscription(options) {
|
|
|
184
194
|
if (recognitionRef.current === recognition) {
|
|
185
195
|
recognitionRef.current = null;
|
|
186
196
|
}
|
|
197
|
+
interimRef.current = "";
|
|
187
198
|
setIsActive(false);
|
|
188
199
|
resolve(text);
|
|
189
200
|
};
|
|
190
201
|
const timeout = window.setTimeout(() => {
|
|
191
|
-
finish(
|
|
202
|
+
finish(currentTranscript());
|
|
192
203
|
}, timeoutMs);
|
|
193
204
|
stopWaiterRef.current = finish;
|
|
194
205
|
try {
|
|
195
206
|
recognition.stop();
|
|
196
207
|
}
|
|
197
208
|
catch {
|
|
198
|
-
finish(
|
|
209
|
+
finish(currentTranscript());
|
|
199
210
|
}
|
|
200
211
|
});
|
|
201
|
-
}, []);
|
|
212
|
+
}, [currentTranscript]);
|
|
202
213
|
const pause = useCallback(() => {
|
|
203
214
|
if (!recognitionRef.current)
|
|
204
215
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-live-transcription.js","sourceRoot":"","sources":["../../../src/client/transcription/use-live-transcription.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjE,MAAM,uBAAuB,GAAG,KAAK,CAAC;AACtC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAEtC,8DAA8D;AAC9D,SAAS,wBAAwB;IAC/B,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAO,CACJ,MAAc,CAAC,iBAAiB;QAChC,MAAc,CAAC,uBAAuB;QACvC,IAAI,CACL,CAAC;AACJ,CAAC;AAoBD,MAAM,UAAU,oBAAoB,CAClC,OAAqC;IAErC,MAAM,IAAI,GACR,OAAO,EAAE,IAAI;QACb,CAAC,OAAO,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAEpE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEnD,8DAA8D;IAC9D,MAAM,cAAc,GAAG,MAAM,CAAM,IAAI,CAAC,CAAC;IACzC,MAAM,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IACjC,MAAM,kBAAkB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,aAAa,GAAG,MAAM,CAAkC,IAAI,CAAC,CAAC;IACpE,MAAM,eAAe,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IACpD,MAAM,oBAAoB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAElC,MAAM,SAAS,GAAG,CAAC,CAAC,wBAAwB,EAAE,CAAC;IAE/C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,MAAM,IAAI,GAAG,wBAAwB,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,8BAA8B;QAC9B,IAAI,eAAe,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACrC,MAAM,CAAC,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC7C,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;QACjC,CAAC;QACD,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;QAC/B,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC;QAC9B,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC;QAClC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC;QACxB,cAAc,CAAC,OAAO,GAAG,WAAW,CAAC;QACrC,aAAa,CAAC,OAAO,GAAG,EAAE,CAAC;QAC3B,kBAAkB,CAAC,OAAO,GAAG,KAAK,CAAC;QACnC,oBAAoB,CAAC,OAAO,GAAG,CAAC,CAAC;QACjC,eAAe,CAAC,OAAO,GAAG,CAAC,CAAC;QAC5B,aAAa,CAAC,EAAE,CAAC,CAAC;QAClB,cAAc,CAAC,EAAE,CAAC,CAAC;QAEnB,WAAW,CAAC,QAAQ,GAAG,CAAC,KAAU,EAAE,EAAE;YACpC,IAAI,OAAO,GAAG,EAAE,CAAC;YACjB,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC;gBACzC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,aAAa,CAAC,OAAO,IAAI,IAAI,CAAC;oBAC9B,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;gBACvC,CAAC;qBAAM,CAAC;oBACN,OAAO,IAAI,IAAI,CAAC;gBAClB,CAAC;YACH,CAAC;YACD,cAAc,CAAC,OAAO,CAAC,CAAC;YACxB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,oBAAoB,CAAC,OAAO,GAAG,CAAC,CAAC;gBACjC,eAAe,CAAC,OAAO,GAAG,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC,CAAC;QAEF,WAAW,CAAC,OAAO,GAAG,CAAC,KAAU,EAAE,EAAE;YACnC,IAAI,KAAK,CAAC,KAAK,KAAK,WAAW,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;gBAAE,OAAO;YACrE,IACE,KAAK,CAAC,KAAK,KAAK,aAAa;gBAC7B,KAAK,CAAC,KAAK,KAAK,qBAAqB;gBACrC,KAAK,CAAC,KAAK,KAAK,eAAe,EAC/B,CAAC;gBACD,kBAAkB,CAAC,OAAO,GAAG,IAAI,CAAC;gBAClC,WAAW,CAAC,KAAK,CAAC,CAAC;gBACnB,OAAO;YACT,CAAC;YACD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,EAAE,CAAC;gBAClD,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAChC,uBAAuB,GAAG,CAAC,IAAI,UAAU,EACzC,sBAAsB,CACvB,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,6BAA6B,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3D,CAAC,CAAC;QAEF,WAAW,CAAC,KAAK,GAAG,GAAG,EAAE;YACvB,kEAAkE;YAClE,kEAAkE;YAClE,IACE,CAAC,kBAAkB,CAAC,OAAO;gBAC3B,cAAc,CAAC,OAAO,KAAK,WAAW,EACtC,CAAC;gBACD,MAAM,OAAO,GAAG,GAAG,EAAE;oBACnB,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;oBAC/B,IACE,kBAAkB,CAAC,OAAO;wBAC1B,cAAc,CAAC,OAAO,KAAK,WAAW,EACtC,CAAC;wBACD,OAAO;oBACT,CAAC;oBACD,IAAI,CAAC;wBACH,WAAW,CAAC,KAAK,EAAE,CAAC;oBACtB,CAAC;oBAAC,MAAM,CAAC;wBACP,WAAW,CAAC,KAAK,CAAC,CAAC;oBACrB,CAAC;gBACH,CAAC,CAAC;gBACF,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC;gBACxC,eAAe,CAAC,OAAO,GAAG,CAAC,CAAC;gBAC5B,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;oBAChB,eAAe,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAChE,CAAC;qBAAM,CAAC;oBACN,OAAO,EAAE,CAAC;gBACZ,CAAC;gBACD,OAAO;YACT,CAAC;YACD,WAAW,CAAC,KAAK,CAAC,CAAC;YACnB,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;gBAC1B,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,CAAC;YACH,WAAW,CAAC,KAAK,EAAE,CAAC;YACpB,WAAW,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,4CAA4C;QAC9C,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,MAAM,IAAI,GAAG,WAAW,CAAC,GAAW,EAAE;QACpC,kBAAkB,CAAC,OAAO,GAAG,IAAI,CAAC;QAClC,IAAI,eAAe,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACrC,MAAM,CAAC,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC7C,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;QACjC,CAAC;QACD,cAAc,CAAC,EAAE,CAAC,CAAC;QACnB,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAChC,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;YACD,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC;QAChC,CAAC;QACD,WAAW,CAAC,KAAK,CAAC,CAAC;QACnB,OAAO,aAAa,CAAC,OAAO,CAAC;IAC/B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,SAAS,GAAG,IAAI,EAAmB,EAAE;QACpE,kBAAkB,CAAC,OAAO,GAAG,IAAI,CAAC;QAClC,IAAI,eAAe,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACrC,MAAM,CAAC,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC7C,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;QACjC,CAAC;QACD,cAAc,CAAC,EAAE,CAAC,CAAC;QAEnB,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC;QAC3C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,WAAW,CAAC,KAAK,CAAC,CAAC;YACnB,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE;gBAC9B,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBAC7B,IAAI,aAAa,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;oBACrC,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC;gBAC/B,CAAC;gBACD,IAAI,cAAc,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;oBAC3C,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC;gBAChC,CAAC;gBACD,WAAW,CAAC,KAAK,CAAC,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,CAAC;YAEF,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;gBACrC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC,EAAE,SAAS,CAAC,CAAC;YAEd,aAAa,CAAC,OAAO,GAAG,MAAM,CAAC;YAC/B,IAAI,CAAC;gBACH,WAAW,CAAC,IAAI,EAAE,CAAC;YACrB,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,IAAI,CAAC,cAAc,CAAC,OAAO;YAAE,OAAO;QACpC,kBAAkB,CAAC,OAAO,GAAG,IAAI,CAAC;QAClC,IAAI,eAAe,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACrC,MAAM,CAAC,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC7C,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;QACjC,CAAC;QACD,IAAI,CAAC;YACH,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE;QAC9B,IAAI,CAAC,cAAc,CAAC,OAAO;YAAE,OAAO;QACpC,kBAAkB,CAAC,OAAO,GAAG,KAAK,CAAC;QACnC,IAAI,CAAC;YACH,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC/B,WAAW,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,sBAAsB;IACtB,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;IACzB,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAEvB,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL,SAAS;QACT,QAAQ;QACR,UAAU;QACV,WAAW;QACX,KAAK;QACL,IAAI;QACJ,WAAW;QACX,KAAK;QACL,MAAM;KACP,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Live transcription hook — runs the browser's Web Speech API alongside\n * any recording to produce an instant transcript with no API key required.\n *\n * Designed to pair with a MediaRecorder: start when recording begins,\n * stop when the user hits stop. The accumulated transcript is available\n * immediately — no round-trip to Whisper needed.\n *\n * Higher-quality backends (Groq Whisper, OpenAI Whisper, Deepgram) can\n * refine the result afterward, but this gives users something useful\n * from second zero even without an API key.\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nconst NETWORK_RESTART_BASE_MS = 1_000;\nconst NETWORK_RESTART_MAX_MS = 30_000;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getSpeechRecognitionCtor(): any {\n if (typeof window === \"undefined\") return null;\n return (\n (window as any).SpeechRecognition ||\n (window as any).webkitSpeechRecognition ||\n null\n );\n}\n\nexport interface UseLiveTranscriptionOptions {\n lang?: string;\n}\n\nexport interface LiveTranscriptionApi {\n supported: boolean;\n isActive: boolean;\n /** Accumulated final transcript text so far. */\n transcript: string;\n /** Current interim (unconfirmed) text being spoken. */\n interimText: string;\n start: () => void;\n stop: () => string;\n stopAndWait: (timeoutMs?: number) => Promise<string>;\n pause: () => void;\n resume: () => void;\n}\n\nexport function useLiveTranscription(\n options?: UseLiveTranscriptionOptions,\n): LiveTranscriptionApi {\n const lang =\n options?.lang ??\n (typeof navigator !== \"undefined\" ? navigator.language : \"en-US\");\n\n const [isActive, setIsActive] = useState(false);\n const [transcript, setTranscript] = useState(\"\");\n const [interimText, setInterimText] = useState(\"\");\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const recognitionRef = useRef<any>(null);\n const transcriptRef = useRef(\"\");\n const stoppedManuallyRef = useRef(false);\n const stopWaiterRef = useRef<((text: string) => void) | null>(null);\n const restartTimerRef = useRef<number | null>(null);\n const networkErrorCountRef = useRef(0);\n const restartDelayRef = useRef(0);\n\n const supported = !!getSpeechRecognitionCtor();\n\n const start = useCallback(() => {\n const Ctor = getSpeechRecognitionCtor();\n if (!Ctor) return;\n\n // Clean up any prior session.\n if (restartTimerRef.current !== null) {\n window.clearTimeout(restartTimerRef.current);\n restartTimerRef.current = null;\n }\n if (recognitionRef.current) {\n try {\n recognitionRef.current.abort();\n } catch {\n /* ignore */\n }\n }\n\n const recognition = new Ctor();\n recognition.continuous = true;\n recognition.interimResults = true;\n recognition.lang = lang;\n recognitionRef.current = recognition;\n transcriptRef.current = \"\";\n stoppedManuallyRef.current = false;\n networkErrorCountRef.current = 0;\n restartDelayRef.current = 0;\n setTranscript(\"\");\n setInterimText(\"\");\n\n recognition.onresult = (event: any) => {\n let interim = \"\";\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const result = event.results[i];\n const text = result[0]?.transcript ?? \"\";\n if (result.isFinal) {\n transcriptRef.current += text;\n setTranscript(transcriptRef.current);\n } else {\n interim += text;\n }\n }\n setInterimText(interim);\n if (event.results.length > 0) {\n networkErrorCountRef.current = 0;\n restartDelayRef.current = 0;\n }\n };\n\n recognition.onerror = (event: any) => {\n if (event.error === \"no-speech\" || event.error === \"aborted\") return;\n if (\n event.error === \"not-allowed\" ||\n event.error === \"service-not-allowed\" ||\n event.error === \"audio-capture\"\n ) {\n stoppedManuallyRef.current = true;\n setIsActive(false);\n return;\n }\n if (event.error === \"network\") {\n const retryIndex = networkErrorCountRef.current++;\n restartDelayRef.current = Math.min(\n NETWORK_RESTART_BASE_MS * 2 ** retryIndex,\n NETWORK_RESTART_MAX_MS,\n );\n }\n console.warn(\"[live-transcription] error:\", event.error);\n };\n\n recognition.onend = () => {\n // Web Speech sometimes stops on its own (silence timeout, network\n // hiccup). Restart automatically unless we stopped intentionally.\n if (\n !stoppedManuallyRef.current &&\n recognitionRef.current === recognition\n ) {\n const restart = () => {\n restartTimerRef.current = null;\n if (\n stoppedManuallyRef.current ||\n recognitionRef.current !== recognition\n ) {\n return;\n }\n try {\n recognition.start();\n } catch {\n setIsActive(false);\n }\n };\n const delayMs = restartDelayRef.current;\n restartDelayRef.current = 0;\n if (delayMs > 0) {\n restartTimerRef.current = window.setTimeout(restart, delayMs);\n } else {\n restart();\n }\n return;\n }\n setIsActive(false);\n if (stopWaiterRef.current) {\n stopWaiterRef.current(transcriptRef.current);\n }\n };\n\n try {\n recognition.start();\n setIsActive(true);\n } catch {\n /* browser may block without user gesture */\n }\n }, [lang]);\n\n const stop = useCallback((): string => {\n stoppedManuallyRef.current = true;\n if (restartTimerRef.current !== null) {\n window.clearTimeout(restartTimerRef.current);\n restartTimerRef.current = null;\n }\n setInterimText(\"\");\n if (recognitionRef.current) {\n try {\n recognitionRef.current.stop();\n } catch {\n /* ignore */\n }\n recognitionRef.current = null;\n }\n setIsActive(false);\n return transcriptRef.current;\n }, []);\n\n const stopAndWait = useCallback((timeoutMs = 1200): Promise<string> => {\n stoppedManuallyRef.current = true;\n if (restartTimerRef.current !== null) {\n window.clearTimeout(restartTimerRef.current);\n restartTimerRef.current = null;\n }\n setInterimText(\"\");\n\n const recognition = recognitionRef.current;\n if (!recognition) {\n setIsActive(false);\n return Promise.resolve(transcriptRef.current);\n }\n\n return new Promise((resolve) => {\n let settled = false;\n const finish = (text: string) => {\n if (settled) return;\n settled = true;\n window.clearTimeout(timeout);\n if (stopWaiterRef.current === finish) {\n stopWaiterRef.current = null;\n }\n if (recognitionRef.current === recognition) {\n recognitionRef.current = null;\n }\n setIsActive(false);\n resolve(text);\n };\n\n const timeout = window.setTimeout(() => {\n finish(transcriptRef.current);\n }, timeoutMs);\n\n stopWaiterRef.current = finish;\n try {\n recognition.stop();\n } catch {\n finish(transcriptRef.current);\n }\n });\n }, []);\n\n const pause = useCallback(() => {\n if (!recognitionRef.current) return;\n stoppedManuallyRef.current = true;\n if (restartTimerRef.current !== null) {\n window.clearTimeout(restartTimerRef.current);\n restartTimerRef.current = null;\n }\n try {\n recognitionRef.current.stop();\n } catch {\n /* ignore */\n }\n }, []);\n\n const resume = useCallback(() => {\n if (!recognitionRef.current) return;\n stoppedManuallyRef.current = false;\n try {\n recognitionRef.current.start();\n setIsActive(true);\n } catch {\n /* ignore */\n }\n }, []);\n\n // Clean up on unmount\n const startRef = useRef(start);\n const stopRef = useRef(stop);\n startRef.current = start;\n stopRef.current = stop;\n\n useEffect(() => {\n return () => {\n stopRef.current();\n };\n }, []);\n\n return {\n supported,\n isActive,\n transcript,\n interimText,\n start,\n stop,\n stopAndWait,\n pause,\n resume,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"use-live-transcription.js","sourceRoot":"","sources":["../../../src/client/transcription/use-live-transcription.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjE,MAAM,uBAAuB,GAAG,KAAK,CAAC;AACtC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAEtC,8DAA8D;AAC9D,SAAS,wBAAwB;IAC/B,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAO,CACJ,MAAc,CAAC,iBAAiB;QAChC,MAAc,CAAC,uBAAuB;QACvC,IAAI,CACL,CAAC;AACJ,CAAC;AAoBD,MAAM,UAAU,oBAAoB,CAClC,OAAqC;IAErC,MAAM,IAAI,GACR,OAAO,EAAE,IAAI;QACb,CAAC,OAAO,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAEpE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEnD,8DAA8D;IAC9D,MAAM,cAAc,GAAG,MAAM,CAAM,IAAI,CAAC,CAAC;IACzC,MAAM,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IACjC,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9B,MAAM,kBAAkB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,aAAa,GAAG,MAAM,CAAkC,IAAI,CAAC,CAAC;IACpE,MAAM,eAAe,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IACpD,MAAM,oBAAoB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAElC,MAAM,iBAAiB,GAAG,WAAW,CACnC,GAAG,EAAE,CACH,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;SACtD,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,EACd,EAAE,CACH,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,CAAC,wBAAwB,EAAE,CAAC;IAE/C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,MAAM,IAAI,GAAG,wBAAwB,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,8BAA8B;QAC9B,IAAI,eAAe,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACrC,MAAM,CAAC,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC7C,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;QACjC,CAAC;QACD,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;QAC/B,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC;QAC9B,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC;QAClC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC;QACxB,cAAc,CAAC,OAAO,GAAG,WAAW,CAAC;QACrC,aAAa,CAAC,OAAO,GAAG,EAAE,CAAC;QAC3B,UAAU,CAAC,OAAO,GAAG,EAAE,CAAC;QACxB,kBAAkB,CAAC,OAAO,GAAG,KAAK,CAAC;QACnC,oBAAoB,CAAC,OAAO,GAAG,CAAC,CAAC;QACjC,eAAe,CAAC,OAAO,GAAG,CAAC,CAAC;QAC5B,aAAa,CAAC,EAAE,CAAC,CAAC;QAClB,cAAc,CAAC,EAAE,CAAC,CAAC;QAEnB,WAAW,CAAC,QAAQ,GAAG,CAAC,KAAU,EAAE,EAAE;YACpC,IAAI,OAAO,GAAG,EAAE,CAAC;YACjB,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC;gBACzC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,aAAa,CAAC,OAAO,IAAI,IAAI,CAAC;oBAC9B,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;gBACvC,CAAC;qBAAM,CAAC;oBACN,OAAO,IAAI,IAAI,CAAC;gBAClB,CAAC;YACH,CAAC;YACD,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;YAC7B,cAAc,CAAC,OAAO,CAAC,CAAC;YACxB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,oBAAoB,CAAC,OAAO,GAAG,CAAC,CAAC;gBACjC,eAAe,CAAC,OAAO,GAAG,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC,CAAC;QAEF,WAAW,CAAC,OAAO,GAAG,CAAC,KAAU,EAAE,EAAE;YACnC,IAAI,KAAK,CAAC,KAAK,KAAK,WAAW,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;gBAAE,OAAO;YACrE,IACE,KAAK,CAAC,KAAK,KAAK,aAAa;gBAC7B,KAAK,CAAC,KAAK,KAAK,qBAAqB;gBACrC,KAAK,CAAC,KAAK,KAAK,eAAe,EAC/B,CAAC;gBACD,kBAAkB,CAAC,OAAO,GAAG,IAAI,CAAC;gBAClC,WAAW,CAAC,KAAK,CAAC,CAAC;gBACnB,OAAO;YACT,CAAC;YACD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,EAAE,CAAC;gBAClD,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAChC,uBAAuB,GAAG,CAAC,IAAI,UAAU,EACzC,sBAAsB,CACvB,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,6BAA6B,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3D,CAAC,CAAC;QAEF,WAAW,CAAC,KAAK,GAAG,GAAG,EAAE;YACvB,kEAAkE;YAClE,kEAAkE;YAClE,IACE,CAAC,kBAAkB,CAAC,OAAO;gBAC3B,cAAc,CAAC,OAAO,KAAK,WAAW,EACtC,CAAC;gBACD,MAAM,OAAO,GAAG,GAAG,EAAE;oBACnB,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;oBAC/B,IACE,kBAAkB,CAAC,OAAO;wBAC1B,cAAc,CAAC,OAAO,KAAK,WAAW,EACtC,CAAC;wBACD,OAAO;oBACT,CAAC;oBACD,IAAI,CAAC;wBACH,WAAW,CAAC,KAAK,EAAE,CAAC;oBACtB,CAAC;oBAAC,MAAM,CAAC;wBACP,WAAW,CAAC,KAAK,CAAC,CAAC;oBACrB,CAAC;gBACH,CAAC,CAAC;gBACF,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC;gBACxC,eAAe,CAAC,OAAO,GAAG,CAAC,CAAC;gBAC5B,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;oBAChB,eAAe,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAChE,CAAC;qBAAM,CAAC;oBACN,OAAO,EAAE,CAAC;gBACZ,CAAC;gBACD,OAAO;YACT,CAAC;YACD,WAAW,CAAC,KAAK,CAAC,CAAC;YACnB,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;gBAC1B,aAAa,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,CAAC;YACH,WAAW,CAAC,KAAK,EAAE,CAAC;YACpB,WAAW,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,4CAA4C;QAC9C,CAAC;IACH,CAAC,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC,CAAC;IAE9B,MAAM,IAAI,GAAG,WAAW,CAAC,GAAW,EAAE;QACpC,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;QACjC,kBAAkB,CAAC,OAAO,GAAG,IAAI,CAAC;QAClC,IAAI,eAAe,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACrC,MAAM,CAAC,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC7C,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;QACjC,CAAC;QACD,UAAU,CAAC,OAAO,GAAG,EAAE,CAAC;QACxB,cAAc,CAAC,EAAE,CAAC,CAAC;QACnB,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAChC,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;YACD,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC;QAChC,CAAC;QACD,WAAW,CAAC,KAAK,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAExB,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,SAAS,GAAG,IAAI,EAAmB,EAAE;QACpC,kBAAkB,CAAC,OAAO,GAAG,IAAI,CAAC;QAClC,IAAI,eAAe,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACrC,MAAM,CAAC,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC7C,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;QACjC,CAAC;QACD,cAAc,CAAC,EAAE,CAAC,CAAC;QAEnB,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC;QAC3C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;YACjC,UAAU,CAAC,OAAO,GAAG,EAAE,CAAC;YACxB,WAAW,CAAC,KAAK,CAAC,CAAC;YACnB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE;gBAC9B,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBAC7B,IAAI,aAAa,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;oBACrC,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC;gBAC/B,CAAC;gBACD,IAAI,cAAc,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;oBAC3C,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC;gBAChC,CAAC;gBACD,UAAU,CAAC,OAAO,GAAG,EAAE,CAAC;gBACxB,WAAW,CAAC,KAAK,CAAC,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,CAAC;YAEF,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;gBACrC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC;YAC9B,CAAC,EAAE,SAAS,CAAC,CAAC;YAEd,aAAa,CAAC,OAAO,GAAG,MAAM,CAAC;YAC/B,IAAI,CAAC;gBACH,WAAW,CAAC,IAAI,EAAE,CAAC;YACrB,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,EACD,CAAC,iBAAiB,CAAC,CACpB,CAAC;IAEF,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,IAAI,CAAC,cAAc,CAAC,OAAO;YAAE,OAAO;QACpC,kBAAkB,CAAC,OAAO,GAAG,IAAI,CAAC;QAClC,IAAI,eAAe,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACrC,MAAM,CAAC,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC7C,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;QACjC,CAAC;QACD,IAAI,CAAC;YACH,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE;QAC9B,IAAI,CAAC,cAAc,CAAC,OAAO;YAAE,OAAO;QACpC,kBAAkB,CAAC,OAAO,GAAG,KAAK,CAAC;QACnC,IAAI,CAAC;YACH,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC/B,WAAW,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,sBAAsB;IACtB,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;IACzB,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAEvB,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL,SAAS;QACT,QAAQ;QACR,UAAU;QACV,WAAW;QACX,KAAK;QACL,IAAI;QACJ,WAAW;QACX,KAAK;QACL,MAAM;KACP,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Live transcription hook — runs the browser's Web Speech API alongside\n * any recording to produce an instant transcript with no API key required.\n *\n * Designed to pair with a MediaRecorder: start when recording begins,\n * stop when the user hits stop. The accumulated transcript is available\n * immediately — no round-trip to Whisper needed.\n *\n * Builder can transcribe the original recording afterward if native capture\n * produces no text, but this gives users something useful from second zero\n * without a cloud transcription request.\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nconst NETWORK_RESTART_BASE_MS = 1_000;\nconst NETWORK_RESTART_MAX_MS = 30_000;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getSpeechRecognitionCtor(): any {\n if (typeof window === \"undefined\") return null;\n return (\n (window as any).SpeechRecognition ||\n (window as any).webkitSpeechRecognition ||\n null\n );\n}\n\nexport interface UseLiveTranscriptionOptions {\n lang?: string;\n}\n\nexport interface LiveTranscriptionApi {\n supported: boolean;\n isActive: boolean;\n /** Accumulated final transcript text so far. */\n transcript: string;\n /** Current interim (unconfirmed) text being spoken. */\n interimText: string;\n start: () => void;\n stop: () => string;\n stopAndWait: (timeoutMs?: number) => Promise<string>;\n pause: () => void;\n resume: () => void;\n}\n\nexport function useLiveTranscription(\n options?: UseLiveTranscriptionOptions,\n): LiveTranscriptionApi {\n const lang =\n options?.lang ??\n (typeof navigator !== \"undefined\" ? navigator.language : \"en-US\");\n\n const [isActive, setIsActive] = useState(false);\n const [transcript, setTranscript] = useState(\"\");\n const [interimText, setInterimText] = useState(\"\");\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const recognitionRef = useRef<any>(null);\n const transcriptRef = useRef(\"\");\n const interimRef = useRef(\"\");\n const stoppedManuallyRef = useRef(false);\n const stopWaiterRef = useRef<((text: string) => void) | null>(null);\n const restartTimerRef = useRef<number | null>(null);\n const networkErrorCountRef = useRef(0);\n const restartDelayRef = useRef(0);\n\n const currentTranscript = useCallback(\n () =>\n [transcriptRef.current.trim(), interimRef.current.trim()]\n .filter(Boolean)\n .join(\" \"),\n [],\n );\n\n const supported = !!getSpeechRecognitionCtor();\n\n const start = useCallback(() => {\n const Ctor = getSpeechRecognitionCtor();\n if (!Ctor) return;\n\n // Clean up any prior session.\n if (restartTimerRef.current !== null) {\n window.clearTimeout(restartTimerRef.current);\n restartTimerRef.current = null;\n }\n if (recognitionRef.current) {\n try {\n recognitionRef.current.abort();\n } catch {\n /* ignore */\n }\n }\n\n const recognition = new Ctor();\n recognition.continuous = true;\n recognition.interimResults = true;\n recognition.lang = lang;\n recognitionRef.current = recognition;\n transcriptRef.current = \"\";\n interimRef.current = \"\";\n stoppedManuallyRef.current = false;\n networkErrorCountRef.current = 0;\n restartDelayRef.current = 0;\n setTranscript(\"\");\n setInterimText(\"\");\n\n recognition.onresult = (event: any) => {\n let interim = \"\";\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const result = event.results[i];\n const text = result[0]?.transcript ?? \"\";\n if (result.isFinal) {\n transcriptRef.current += text;\n setTranscript(transcriptRef.current);\n } else {\n interim += text;\n }\n }\n interimRef.current = interim;\n setInterimText(interim);\n if (event.results.length > 0) {\n networkErrorCountRef.current = 0;\n restartDelayRef.current = 0;\n }\n };\n\n recognition.onerror = (event: any) => {\n if (event.error === \"no-speech\" || event.error === \"aborted\") return;\n if (\n event.error === \"not-allowed\" ||\n event.error === \"service-not-allowed\" ||\n event.error === \"audio-capture\"\n ) {\n stoppedManuallyRef.current = true;\n setIsActive(false);\n return;\n }\n if (event.error === \"network\") {\n const retryIndex = networkErrorCountRef.current++;\n restartDelayRef.current = Math.min(\n NETWORK_RESTART_BASE_MS * 2 ** retryIndex,\n NETWORK_RESTART_MAX_MS,\n );\n }\n console.warn(\"[live-transcription] error:\", event.error);\n };\n\n recognition.onend = () => {\n // Web Speech sometimes stops on its own (silence timeout, network\n // hiccup). Restart automatically unless we stopped intentionally.\n if (\n !stoppedManuallyRef.current &&\n recognitionRef.current === recognition\n ) {\n const restart = () => {\n restartTimerRef.current = null;\n if (\n stoppedManuallyRef.current ||\n recognitionRef.current !== recognition\n ) {\n return;\n }\n try {\n recognition.start();\n } catch {\n setIsActive(false);\n }\n };\n const delayMs = restartDelayRef.current;\n restartDelayRef.current = 0;\n if (delayMs > 0) {\n restartTimerRef.current = window.setTimeout(restart, delayMs);\n } else {\n restart();\n }\n return;\n }\n setIsActive(false);\n if (stopWaiterRef.current) {\n stopWaiterRef.current(currentTranscript());\n }\n };\n\n try {\n recognition.start();\n setIsActive(true);\n } catch {\n /* browser may block without user gesture */\n }\n }, [currentTranscript, lang]);\n\n const stop = useCallback((): string => {\n const text = currentTranscript();\n stoppedManuallyRef.current = true;\n if (restartTimerRef.current !== null) {\n window.clearTimeout(restartTimerRef.current);\n restartTimerRef.current = null;\n }\n interimRef.current = \"\";\n setInterimText(\"\");\n if (recognitionRef.current) {\n try {\n recognitionRef.current.stop();\n } catch {\n /* ignore */\n }\n recognitionRef.current = null;\n }\n setIsActive(false);\n return text;\n }, [currentTranscript]);\n\n const stopAndWait = useCallback(\n (timeoutMs = 1200): Promise<string> => {\n stoppedManuallyRef.current = true;\n if (restartTimerRef.current !== null) {\n window.clearTimeout(restartTimerRef.current);\n restartTimerRef.current = null;\n }\n setInterimText(\"\");\n\n const recognition = recognitionRef.current;\n if (!recognition) {\n const text = currentTranscript();\n interimRef.current = \"\";\n setIsActive(false);\n return Promise.resolve(text);\n }\n\n return new Promise((resolve) => {\n let settled = false;\n const finish = (text: string) => {\n if (settled) return;\n settled = true;\n window.clearTimeout(timeout);\n if (stopWaiterRef.current === finish) {\n stopWaiterRef.current = null;\n }\n if (recognitionRef.current === recognition) {\n recognitionRef.current = null;\n }\n interimRef.current = \"\";\n setIsActive(false);\n resolve(text);\n };\n\n const timeout = window.setTimeout(() => {\n finish(currentTranscript());\n }, timeoutMs);\n\n stopWaiterRef.current = finish;\n try {\n recognition.stop();\n } catch {\n finish(currentTranscript());\n }\n });\n },\n [currentTranscript],\n );\n\n const pause = useCallback(() => {\n if (!recognitionRef.current) return;\n stoppedManuallyRef.current = true;\n if (restartTimerRef.current !== null) {\n window.clearTimeout(restartTimerRef.current);\n restartTimerRef.current = null;\n }\n try {\n recognitionRef.current.stop();\n } catch {\n /* ignore */\n }\n }, []);\n\n const resume = useCallback(() => {\n if (!recognitionRef.current) return;\n stoppedManuallyRef.current = false;\n try {\n recognitionRef.current.start();\n setIsActive(true);\n } catch {\n /* ignore */\n }\n }, []);\n\n // Clean up on unmount\n const startRef = useRef(start);\n const stopRef = useRef(stop);\n startRef.current = start;\n stopRef.current = stop;\n\n useEffect(() => {\n return () => {\n stopRef.current();\n };\n }, []);\n\n return {\n supported,\n isActive,\n transcript,\n interimText,\n start,\n stop,\n stopAndWait,\n pause,\n resume,\n };\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** `unknown` until the first check resolves, so callers don't flash the gate. */
|
|
2
|
-
export type AgentEngineConfiguredState = "unknown" | "configured" | "missing";
|
|
2
|
+
export type AgentEngineConfiguredState = "unknown" | "configured" | "missing" | "unavailable";
|
|
3
3
|
export interface UseAgentEngineConfiguredResult {
|
|
4
4
|
/** True once we know nothing can run the agent (no key / Builder / BYOK). */
|
|
5
5
|
missing: boolean;
|
|
@@ -24,7 +24,8 @@ export declare function fetchAgentEngineConfiguredState(enabled?: boolean, optio
|
|
|
24
24
|
* composer and app prompt boxes. Checks the env-key / Builder / BYOK status
|
|
25
25
|
* endpoints on mount, re-checks on `agent-engine:configured-changed`, and folds
|
|
26
26
|
* in the adapter's `agent-chat:missing-api-key` signal. Pass `enabled = false`
|
|
27
|
-
* to short-circuit to configured;
|
|
27
|
+
* to short-circuit to configured; unavailable checks can be retried by firing
|
|
28
|
+
* `agent-engine:configured-changed`.
|
|
28
29
|
*/
|
|
29
30
|
export declare function useAgentEngineConfigured(enabled?: boolean, options?: UseAgentEngineConfiguredOptions): UseAgentEngineConfiguredResult;
|
|
30
31
|
//# sourceMappingURL=use-agent-engine-configured.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-agent-engine-configured.d.ts","sourceRoot":"","sources":["../../src/client/use-agent-engine-configured.ts"],"names":[],"mappings":"AAOA,iFAAiF;AACjF,MAAM,MAAM,0BAA0B,
|
|
1
|
+
{"version":3,"file":"use-agent-engine-configured.d.ts","sourceRoot":"","sources":["../../src/client/use-agent-engine-configured.ts"],"names":[],"mappings":"AAOA,iFAAiF;AACjF,MAAM,MAAM,0BAA0B,GAClC,SAAS,GACT,YAAY,GACZ,SAAS,GACT,aAAa,CAAC;AAElB,MAAM,WAAW,8BAA8B;IAC7C,6EAA6E;IAC7E,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,0BAA0B,CAAC;CACnC;AAED,MAAM,WAAW,sCAAsC;IACrD;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,+BAA+B;IAC9C,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAgED,wBAAsB,+BAA+B,CACnD,OAAO,UAAO,EACd,OAAO,CAAC,EAAE,sCAAsC,GAC/C,OAAO,CAAC,0BAA0B,CAAC,CA2CrC;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,UAAO,EACd,OAAO,CAAC,EAAE,+BAA+B,GACxC,8BAA8B,CA+ChC"}
|
|
@@ -3,7 +3,6 @@ import { PROVIDER_ENV_VARS } from "../agent/engine/provider-env-vars.js";
|
|
|
3
3
|
import { agentNativePath } from "./api-path.js";
|
|
4
4
|
const PROVIDER_ENV_VAR_SET = new Set(PROVIDER_ENV_VARS);
|
|
5
5
|
const DEFAULT_STATUS_CHECK_TIMEOUT_MS = 2500;
|
|
6
|
-
const UNKNOWN_STATUS_RETRY_MS = 2000;
|
|
7
6
|
async function fetchStatusJson(path, timeoutMs) {
|
|
8
7
|
const controller = typeof AbortController !== "undefined" ? new AbortController() : null;
|
|
9
8
|
let timeoutId;
|
|
@@ -58,11 +57,10 @@ export async function fetchAgentEngineConfiguredState(enabled = true, options) {
|
|
|
58
57
|
fetchStatusJson("/_agent-native/builder/status", timeoutMs),
|
|
59
58
|
fetchStatusJson("/_agent-native/agent-engine/status", timeoutMs),
|
|
60
59
|
]);
|
|
61
|
-
// All three failed —
|
|
62
|
-
//
|
|
63
|
-
// setup without a fresh authoritative status response.
|
|
60
|
+
// All three failed — surface a retryable unavailable state instead of
|
|
61
|
+
// leaving the composer in an infinite checking loop.
|
|
64
62
|
if (envKeys == null && builderStatus == null && engineStatus == null) {
|
|
65
|
-
return "
|
|
63
|
+
return "unavailable";
|
|
66
64
|
}
|
|
67
65
|
const envKeysKnown = Array.isArray(envKeys);
|
|
68
66
|
const builderStatusKnown = hasConfiguredFlag(builderStatus);
|
|
@@ -83,39 +81,31 @@ export async function fetchAgentEngineConfiguredState(enabled = true, options) {
|
|
|
83
81
|
if (engineStatusKnown)
|
|
84
82
|
return "missing";
|
|
85
83
|
// Compatibility fallback for older hosts without the canonical route.
|
|
86
|
-
return envKeysKnown && builderStatusKnown ? "missing" : "
|
|
84
|
+
return envKeysKnown && builderStatusKnown ? "missing" : "unavailable";
|
|
87
85
|
}
|
|
88
86
|
/**
|
|
89
87
|
* Shared "can the agent run?" gate — the single source of truth for the sidebar
|
|
90
88
|
* composer and app prompt boxes. Checks the env-key / Builder / BYOK status
|
|
91
89
|
* endpoints on mount, re-checks on `agent-engine:configured-changed`, and folds
|
|
92
90
|
* in the adapter's `agent-chat:missing-api-key` signal. Pass `enabled = false`
|
|
93
|
-
* to short-circuit to configured;
|
|
91
|
+
* to short-circuit to configured; unavailable checks can be retried by firing
|
|
92
|
+
* `agent-engine:configured-changed`.
|
|
94
93
|
*/
|
|
95
94
|
export function useAgentEngineConfigured(enabled = true, options) {
|
|
96
95
|
const [state, setState] = useState("unknown");
|
|
97
96
|
useEffect(() => {
|
|
98
97
|
let cancelled = false;
|
|
99
|
-
let retryId;
|
|
100
98
|
// Monotonic call counter: overlapping checks (mount + a
|
|
101
99
|
// `agent-engine:configured-changed` fired right after a key is saved) can
|
|
102
100
|
// resolve out of order; only the latest call may write state, or a slow
|
|
103
101
|
// stale "missing" response would overwrite the fresh "configured" one.
|
|
104
102
|
let requestSeq = 0;
|
|
105
103
|
const check = async (options) => {
|
|
106
|
-
if (retryId !== undefined) {
|
|
107
|
-
clearTimeout(retryId);
|
|
108
|
-
retryId = undefined;
|
|
109
|
-
}
|
|
110
104
|
const seq = ++requestSeq;
|
|
111
105
|
const nextState = await fetchAgentEngineConfiguredState(enabled, options);
|
|
112
106
|
if (cancelled || seq !== requestSeq)
|
|
113
107
|
return;
|
|
114
|
-
|
|
115
|
-
retryId = setTimeout(() => void check(), UNKNOWN_STATUS_RETRY_MS);
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
setState(nextState);
|
|
108
|
+
setState(nextState === "unknown" ? "unavailable" : nextState);
|
|
119
109
|
};
|
|
120
110
|
const onConfiguredChanged = () => {
|
|
121
111
|
void check();
|
|
@@ -136,8 +126,6 @@ export function useAgentEngineConfigured(enabled = true, options) {
|
|
|
136
126
|
window.addEventListener("agent-chat:missing-api-key", onMissing);
|
|
137
127
|
return () => {
|
|
138
128
|
cancelled = true;
|
|
139
|
-
if (retryId !== undefined)
|
|
140
|
-
clearTimeout(retryId);
|
|
141
129
|
window.removeEventListener("agent-engine:configured-changed", onConfiguredChanged);
|
|
142
130
|
window.removeEventListener("agent-chat:missing-api-key", onMissing);
|
|
143
131
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-agent-engine-configured.js","sourceRoot":"","sources":["../../src/client/use-agent-engine-configured.ts"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useState } from \"react\";\n\nimport { PROVIDER_ENV_VARS } from \"../agent/engine/provider-env-vars.js\";\nimport { agentNativePath } from \"./api-path.js\";\n\nconst PROVIDER_ENV_VAR_SET = new Set(PROVIDER_ENV_VARS);\n\n/** `unknown` until the first check resolves, so callers don't flash the gate. */\nexport type AgentEngineConfiguredState = \"unknown\" | \"configured\" | \"missing\";\n\nexport interface UseAgentEngineConfiguredResult {\n /** True once we know nothing can run the agent (no key / Builder / BYOK). */\n missing: boolean;\n state: AgentEngineConfiguredState;\n}\n\nexport interface FetchAgentEngineConfiguredStateOptions {\n /**\n * Legacy hint from explicit missing-key stream events. Kept for API\n * compatibility, but missing state still requires authoritative status\n * responses so transient endpoint failures do not clobber connected state.\n */\n missingFallback?: boolean;\n timeoutMs?: number;\n}\n\nexport interface UseAgentEngineConfiguredOptions {\n tabId?: string | null;\n threadId?: string | null;\n}\n\nconst DEFAULT_STATUS_CHECK_TIMEOUT_MS = 2500;\nconst UNKNOWN_STATUS_RETRY_MS = 2000;\n\nasync function fetchStatusJson(\n path: string,\n timeoutMs: number,\n): Promise<unknown | null> {\n const controller =\n typeof AbortController !== \"undefined\" ? new AbortController() : null;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<null>((resolve) => {\n timeoutId = setTimeout(() => {\n controller?.abort();\n resolve(null);\n }, timeoutMs);\n });\n\n // Never serve a stale status from the HTTP cache: this is re-fetched right\n // after a provider connects, and a cached \"missing\" would keep the composer\n // gate and error banner pinned even though a provider is now configured.\n const request = fetch(agentNativePath(path), {\n cache: \"no-store\",\n ...(controller ? { signal: controller.signal } : {}),\n })\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null)\n .finally(() => {\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n });\n\n return Promise.race([request, timeout]);\n}\n\nfunction hasConfiguredFlag(value: unknown): value is { configured: boolean } {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"configured\" in value &&\n typeof (value as { configured?: unknown }).configured === \"boolean\"\n );\n}\n\nfunction missingKeyEventMatchesScope(\n event: Event,\n options: UseAgentEngineConfiguredOptions | undefined,\n): boolean {\n const detail = (event as CustomEvent).detail as\n | { tabId?: unknown; threadId?: unknown }\n | undefined;\n const eventTabId = typeof detail?.tabId === \"string\" ? detail.tabId : null;\n const eventThreadId =\n typeof detail?.threadId === \"string\" ? detail.threadId : null;\n if (!eventTabId && !eventThreadId) return true;\n\n const tabId = options?.tabId ?? null;\n const threadId = options?.threadId ?? null;\n if (!tabId && !threadId) return true;\n return (\n (eventTabId != null && eventTabId === tabId) ||\n (eventThreadId != null && eventThreadId === threadId)\n );\n}\n\nexport async function fetchAgentEngineConfiguredState(\n enabled = true,\n options?: FetchAgentEngineConfiguredStateOptions,\n): Promise<AgentEngineConfiguredState> {\n if (!enabled) return \"configured\";\n\n const timeoutMs =\n typeof options?.timeoutMs === \"number\" && options.timeoutMs > 0\n ? options.timeoutMs\n : DEFAULT_STATUS_CHECK_TIMEOUT_MS;\n const [envKeys, builderStatus, engineStatus] = await Promise.all([\n fetchStatusJson(\"/_agent-native/env-status\", timeoutMs),\n fetchStatusJson(\"/_agent-native/builder/status\", timeoutMs),\n fetchStatusJson(\"/_agent-native/agent-engine/status\", timeoutMs),\n ]);\n\n // All three failed — likely a flaky network; keep the caller in unknown.\n // Even an explicit missing-key stream event should not pin the composer into\n // setup without a fresh authoritative status response.\n if (envKeys == null && builderStatus == null && engineStatus == null) {\n return \"unknown\";\n }\n\n const envKeysKnown = Array.isArray(envKeys);\n const builderStatusKnown = hasConfiguredFlag(builderStatus);\n const engineStatusKnown = hasConfiguredFlag(engineStatus);\n const keys = envKeysKnown\n ? (envKeys as Array<{\n key: string;\n configured: boolean;\n }>)\n : [];\n const llmKeys = keys.filter((k) => PROVIDER_ENV_VAR_SET.has(k.key));\n const anyConfigured =\n llmKeys.some((k) => k.configured) ||\n (builderStatusKnown && builderStatus.configured) ||\n (engineStatusKnown && engineStatus.configured);\n if (anyConfigured) return \"configured\";\n\n // The engine status route is the canonical readiness check: it resolves\n // Builder, scoped BYOK secrets, deployment credentials, and custom engines.\n // Once it has answered `configured: false`, a slow legacy env/Builder status\n // request must not leave the composer permissively stuck in `unknown`.\n if (engineStatusKnown) return \"missing\";\n\n // Compatibility fallback for older hosts without the canonical route.\n return envKeysKnown && builderStatusKnown ? \"missing\" : \"unknown\";\n}\n\n/**\n * Shared \"can the agent run?\" gate — the single source of truth for the sidebar\n * composer and app prompt boxes. Checks the env-key / Builder / BYOK status\n * endpoints on mount, re-checks on `agent-engine:configured-changed`, and folds\n * in the adapter's `agent-chat:missing-api-key` signal. Pass `enabled = false`\n * to short-circuit to configured; flaky requests stay `unknown`.\n */\nexport function useAgentEngineConfigured(\n enabled = true,\n options?: UseAgentEngineConfiguredOptions,\n): UseAgentEngineConfiguredResult {\n const [state, setState] = useState<AgentEngineConfiguredState>(\"unknown\");\n\n useEffect(() => {\n let cancelled = false;\n let retryId: ReturnType<typeof setTimeout> | undefined;\n // Monotonic call counter: overlapping checks (mount + a\n // `agent-engine:configured-changed` fired right after a key is saved) can\n // resolve out of order; only the latest call may write state, or a slow\n // stale \"missing\" response would overwrite the fresh \"configured\" one.\n let requestSeq = 0;\n const check = async (options?: { missingFallback?: boolean }) => {\n if (retryId !== undefined) {\n clearTimeout(retryId);\n retryId = undefined;\n }\n const seq = ++requestSeq;\n const nextState = await fetchAgentEngineConfiguredState(enabled, options);\n if (cancelled || seq !== requestSeq) return;\n if (nextState === \"unknown\") {\n retryId = setTimeout(() => void check(), UNKNOWN_STATUS_RETRY_MS);\n return;\n }\n setState(nextState);\n };\n const onConfiguredChanged = () => {\n void check();\n };\n const onMissing = (event: Event) => {\n if (!missingKeyEventMatchesScope(event, options)) return;\n if (!enabled) {\n setState(\"configured\");\n return;\n }\n void check({ missingFallback: true });\n };\n\n void check();\n window.addEventListener(\n \"agent-engine:configured-changed\",\n onConfiguredChanged,\n );\n // A stale failed stream can arrive after a reconnect succeeds. Re-check the\n // current status before pinning the composer in setup.\n window.addEventListener(\"agent-chat:missing-api-key\", onMissing);\n return () => {\n cancelled = true;\n if (retryId !== undefined) clearTimeout(retryId);\n window.removeEventListener(\n \"agent-engine:configured-changed\",\n onConfiguredChanged,\n );\n window.removeEventListener(\"agent-chat:missing-api-key\", onMissing);\n };\n }, [enabled, options?.tabId, options?.threadId]);\n\n return { missing: state === \"missing\", state };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"use-agent-engine-configured.js","sourceRoot":"","sources":["../../src/client/use-agent-engine-configured.ts"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useState } from \"react\";\n\nimport { PROVIDER_ENV_VARS } from \"../agent/engine/provider-env-vars.js\";\nimport { agentNativePath } from \"./api-path.js\";\n\nconst PROVIDER_ENV_VAR_SET = new Set(PROVIDER_ENV_VARS);\n\n/** `unknown` until the first check resolves, so callers don't flash the gate. */\nexport type AgentEngineConfiguredState =\n | \"unknown\"\n | \"configured\"\n | \"missing\"\n | \"unavailable\";\n\nexport interface UseAgentEngineConfiguredResult {\n /** True once we know nothing can run the agent (no key / Builder / BYOK). */\n missing: boolean;\n state: AgentEngineConfiguredState;\n}\n\nexport interface FetchAgentEngineConfiguredStateOptions {\n /**\n * Legacy hint from explicit missing-key stream events. Kept for API\n * compatibility, but missing state still requires authoritative status\n * responses so transient endpoint failures do not clobber connected state.\n */\n missingFallback?: boolean;\n timeoutMs?: number;\n}\n\nexport interface UseAgentEngineConfiguredOptions {\n tabId?: string | null;\n threadId?: string | null;\n}\n\nconst DEFAULT_STATUS_CHECK_TIMEOUT_MS = 2500;\n\nasync function fetchStatusJson(\n path: string,\n timeoutMs: number,\n): Promise<unknown | null> {\n const controller =\n typeof AbortController !== \"undefined\" ? new AbortController() : null;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<null>((resolve) => {\n timeoutId = setTimeout(() => {\n controller?.abort();\n resolve(null);\n }, timeoutMs);\n });\n\n // Never serve a stale status from the HTTP cache: this is re-fetched right\n // after a provider connects, and a cached \"missing\" would keep the composer\n // gate and error banner pinned even though a provider is now configured.\n const request = fetch(agentNativePath(path), {\n cache: \"no-store\",\n ...(controller ? { signal: controller.signal } : {}),\n })\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null)\n .finally(() => {\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n });\n\n return Promise.race([request, timeout]);\n}\n\nfunction hasConfiguredFlag(value: unknown): value is { configured: boolean } {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"configured\" in value &&\n typeof (value as { configured?: unknown }).configured === \"boolean\"\n );\n}\n\nfunction missingKeyEventMatchesScope(\n event: Event,\n options: UseAgentEngineConfiguredOptions | undefined,\n): boolean {\n const detail = (event as CustomEvent).detail as\n | { tabId?: unknown; threadId?: unknown }\n | undefined;\n const eventTabId = typeof detail?.tabId === \"string\" ? detail.tabId : null;\n const eventThreadId =\n typeof detail?.threadId === \"string\" ? detail.threadId : null;\n if (!eventTabId && !eventThreadId) return true;\n\n const tabId = options?.tabId ?? null;\n const threadId = options?.threadId ?? null;\n if (!tabId && !threadId) return true;\n return (\n (eventTabId != null && eventTabId === tabId) ||\n (eventThreadId != null && eventThreadId === threadId)\n );\n}\n\nexport async function fetchAgentEngineConfiguredState(\n enabled = true,\n options?: FetchAgentEngineConfiguredStateOptions,\n): Promise<AgentEngineConfiguredState> {\n if (!enabled) return \"configured\";\n\n const timeoutMs =\n typeof options?.timeoutMs === \"number\" && options.timeoutMs > 0\n ? options.timeoutMs\n : DEFAULT_STATUS_CHECK_TIMEOUT_MS;\n const [envKeys, builderStatus, engineStatus] = await Promise.all([\n fetchStatusJson(\"/_agent-native/env-status\", timeoutMs),\n fetchStatusJson(\"/_agent-native/builder/status\", timeoutMs),\n fetchStatusJson(\"/_agent-native/agent-engine/status\", timeoutMs),\n ]);\n\n // All three failed — surface a retryable unavailable state instead of\n // leaving the composer in an infinite checking loop.\n if (envKeys == null && builderStatus == null && engineStatus == null) {\n return \"unavailable\";\n }\n\n const envKeysKnown = Array.isArray(envKeys);\n const builderStatusKnown = hasConfiguredFlag(builderStatus);\n const engineStatusKnown = hasConfiguredFlag(engineStatus);\n const keys = envKeysKnown\n ? (envKeys as Array<{\n key: string;\n configured: boolean;\n }>)\n : [];\n const llmKeys = keys.filter((k) => PROVIDER_ENV_VAR_SET.has(k.key));\n const anyConfigured =\n llmKeys.some((k) => k.configured) ||\n (builderStatusKnown && builderStatus.configured) ||\n (engineStatusKnown && engineStatus.configured);\n if (anyConfigured) return \"configured\";\n\n // The engine status route is the canonical readiness check: it resolves\n // Builder, scoped BYOK secrets, deployment credentials, and custom engines.\n // Once it has answered `configured: false`, a slow legacy env/Builder status\n // request must not leave the composer permissively stuck in `unknown`.\n if (engineStatusKnown) return \"missing\";\n\n // Compatibility fallback for older hosts without the canonical route.\n return envKeysKnown && builderStatusKnown ? \"missing\" : \"unavailable\";\n}\n\n/**\n * Shared \"can the agent run?\" gate — the single source of truth for the sidebar\n * composer and app prompt boxes. Checks the env-key / Builder / BYOK status\n * endpoints on mount, re-checks on `agent-engine:configured-changed`, and folds\n * in the adapter's `agent-chat:missing-api-key` signal. Pass `enabled = false`\n * to short-circuit to configured; unavailable checks can be retried by firing\n * `agent-engine:configured-changed`.\n */\nexport function useAgentEngineConfigured(\n enabled = true,\n options?: UseAgentEngineConfiguredOptions,\n): UseAgentEngineConfiguredResult {\n const [state, setState] = useState<AgentEngineConfiguredState>(\"unknown\");\n\n useEffect(() => {\n let cancelled = false;\n // Monotonic call counter: overlapping checks (mount + a\n // `agent-engine:configured-changed` fired right after a key is saved) can\n // resolve out of order; only the latest call may write state, or a slow\n // stale \"missing\" response would overwrite the fresh \"configured\" one.\n let requestSeq = 0;\n const check = async (options?: { missingFallback?: boolean }) => {\n const seq = ++requestSeq;\n const nextState = await fetchAgentEngineConfiguredState(enabled, options);\n if (cancelled || seq !== requestSeq) return;\n setState(nextState === \"unknown\" ? \"unavailable\" : nextState);\n };\n const onConfiguredChanged = () => {\n void check();\n };\n const onMissing = (event: Event) => {\n if (!missingKeyEventMatchesScope(event, options)) return;\n if (!enabled) {\n setState(\"configured\");\n return;\n }\n void check({ missingFallback: true });\n };\n\n void check();\n window.addEventListener(\n \"agent-engine:configured-changed\",\n onConfiguredChanged,\n );\n // A stale failed stream can arrive after a reconnect succeeds. Re-check the\n // current status before pinning the composer in setup.\n window.addEventListener(\"agent-chat:missing-api-key\", onMissing);\n return () => {\n cancelled = true;\n window.removeEventListener(\n \"agent-engine:configured-changed\",\n onConfiguredChanged,\n );\n window.removeEventListener(\"agent-chat:missing-api-key\", onMissing);\n };\n }, [enabled, options?.tabId, options?.threadId]);\n\n return { missing: state === \"missing\", state };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-chat-threads.d.ts","sourceRoot":"","sources":["../../src/client/use-chat-threads.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAoB,SAAQ,oBAAoB;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,KAAK,iBAAiB,GAAG,WAAW,GAAG,WAAW,CAAC;AAMnD,MAAM,WAAW,qBAAqB;IACpC,+EAA+E;IAC/E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qEAAqE;IACrE,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AA2FD,wBAAgB,cAAc,CAC5B,MAAM,SAA+C,EACrD,UAAU,CAAC,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,eAAe,GAAG,IAAI,EAC9B,OAAO,CAAC,EAAE,qBAAqB;;;;
|
|
1
|
+
{"version":3,"file":"use-chat-threads.d.ts","sourceRoot":"","sources":["../../src/client/use-chat-threads.ts"],"names":[],"mappings":"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"}
|
|
@@ -217,6 +217,17 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
|
|
|
217
217
|
const fetchedRef = useRef(false);
|
|
218
218
|
const activeThreadIdRef = useRef(activeThreadId);
|
|
219
219
|
activeThreadIdRef.current = activeThreadId;
|
|
220
|
+
const persistActiveThreadId = useCallback((id) => {
|
|
221
|
+
try {
|
|
222
|
+
const threadScope = readKnownThreadScope(id);
|
|
223
|
+
const targetKey = threadScope === undefined
|
|
224
|
+
? activeThreadKey
|
|
225
|
+
: activeThreadStorageKey(storageKey, threadScope);
|
|
226
|
+
localStorage.setItem(targetKey, id);
|
|
227
|
+
localStorage.setItem(activeThreadSeenStorageKey(targetKey), String(Date.now()));
|
|
228
|
+
}
|
|
229
|
+
catch { }
|
|
230
|
+
}, [activeThreadKey, readKnownThreadScope, storageKey]);
|
|
220
231
|
// Persist active thread ID — and rehydrate on scope flips. When the user
|
|
221
232
|
// navigates from deck A to deck B, `activeThreadKey` changes; we re-read B's
|
|
222
233
|
// scoped thread only if the currently visible chat is itself scoped to a
|
|
@@ -262,6 +273,9 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
|
|
|
262
273
|
setActiveThreadId(nextActiveThreadId);
|
|
263
274
|
return;
|
|
264
275
|
}
|
|
276
|
+
if (!activeThreadId && !restoreActiveThread && !routeControlsActiveThread) {
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
265
279
|
try {
|
|
266
280
|
if (routeControlsActiveThread && !routeThreadId) {
|
|
267
281
|
localStorage.removeItem(activeThreadKey);
|
|
@@ -269,12 +283,7 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
|
|
|
269
283
|
return;
|
|
270
284
|
}
|
|
271
285
|
if (activeThreadId) {
|
|
272
|
-
|
|
273
|
-
if (threadScope === undefined)
|
|
274
|
-
return;
|
|
275
|
-
const targetKey = activeThreadStorageKey(storageKey, threadScope);
|
|
276
|
-
localStorage.setItem(targetKey, activeThreadId);
|
|
277
|
-
localStorage.setItem(activeThreadSeenStorageKey(targetKey), String(Date.now()));
|
|
286
|
+
persistActiveThreadId(activeThreadId);
|
|
278
287
|
}
|
|
279
288
|
else {
|
|
280
289
|
localStorage.removeItem(activeThreadKey);
|
|
@@ -288,7 +297,9 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
|
|
|
288
297
|
activeThreadSeenKey,
|
|
289
298
|
addOptimisticThread,
|
|
290
299
|
autoCreate,
|
|
300
|
+
persistActiveThreadId,
|
|
291
301
|
readKnownThreadScope,
|
|
302
|
+
restoreActiveThread,
|
|
292
303
|
routeControlsActiveThread,
|
|
293
304
|
routeThreadId,
|
|
294
305
|
storageKey,
|
|
@@ -505,9 +516,10 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
|
|
|
505
516
|
const id = preferredId || createLocalThreadId();
|
|
506
517
|
newlyCreatedRef.current.add(id);
|
|
507
518
|
addOptimisticThread(id, scopeRef.current ?? null);
|
|
519
|
+
persistActiveThreadId(id);
|
|
508
520
|
setActiveThreadId(id);
|
|
509
521
|
return Promise.resolve(id);
|
|
510
|
-
}, [addOptimisticThread]);
|
|
522
|
+
}, [addOptimisticThread, persistActiveThreadId]);
|
|
511
523
|
useEffect(() => {
|
|
512
524
|
if (!routeControlsActiveThread)
|
|
513
525
|
return;
|
|
@@ -695,8 +707,9 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
|
|
|
695
707
|
}, [apiUrl, clearUserRenamedThread, fetchThreads, markUserRenamedThread]);
|
|
696
708
|
const isNewThread = useCallback((id) => newlyCreatedRef.current.has(id), []);
|
|
697
709
|
const switchThread = useCallback((id) => {
|
|
710
|
+
persistActiveThreadId(id);
|
|
698
711
|
setActiveThreadId(id);
|
|
699
|
-
}, []);
|
|
712
|
+
}, [persistActiveThreadId]);
|
|
700
713
|
const removeThread = useCallback(async (id) => {
|
|
701
714
|
try {
|
|
702
715
|
await fetch(`${apiUrl}/threads/${encodeURIComponent(id)}`, {
|