@agent-native/core 0.7.81 → 0.7.83
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/dist/action.d.ts +8 -0
- package/dist/action.d.ts.map +1 -1
- package/dist/action.js +4 -0
- package/dist/action.js.map +1 -1
- package/dist/agent/production-agent.d.ts +12 -2
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +58 -20
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-manager.d.ts +8 -1
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +11 -12
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/thread-data-builder.d.ts.map +1 -1
- package/dist/agent/thread-data-builder.js +13 -17
- package/dist/agent/thread-data-builder.js.map +1 -1
- package/dist/agent/types.d.ts +4 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/application-state/handlers.d.ts.map +1 -1
- package/dist/application-state/handlers.js +3 -8
- package/dist/application-state/handlers.js.map +1 -1
- package/dist/application-state/script-helpers.d.ts +2 -4
- package/dist/application-state/script-helpers.d.ts.map +1 -1
- package/dist/application-state/script-helpers.js +10 -47
- package/dist/application-state/script-helpers.js.map +1 -1
- package/dist/cli/create.d.ts +1 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +35 -10
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/workspace-dev.js +78 -15
- package/dist/cli/workspace-dev.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +6 -2
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +0 -15
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +69 -57
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/ConnectBuilderCard.d.ts +7 -1
- package/dist/client/ConnectBuilderCard.d.ts.map +1 -1
- package/dist/client/ConnectBuilderCard.js +46 -5
- package/dist/client/ConnectBuilderCard.js.map +1 -1
- package/dist/client/ErrorBoundary.d.ts.map +1 -1
- package/dist/client/ErrorBoundary.js +20 -5
- package/dist/client/ErrorBoundary.js.map +1 -1
- package/dist/client/FeedbackButton.d.ts +3 -2
- package/dist/client/FeedbackButton.d.ts.map +1 -1
- package/dist/client/FeedbackButton.js +23 -15
- package/dist/client/FeedbackButton.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +303 -169
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/builder-frame.d.ts +36 -0
- package/dist/client/builder-frame.d.ts.map +1 -1
- package/dist/client/builder-frame.js +80 -9
- package/dist/client/builder-frame.js.map +1 -1
- package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -1
- package/dist/client/composer/ComposerPlusMenu.js +7 -2
- package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
- package/dist/client/composer/PastedTextChip.d.ts +9 -0
- package/dist/client/composer/PastedTextChip.d.ts.map +1 -0
- package/dist/client/composer/PastedTextChip.js +47 -0
- package/dist/client/composer/PastedTextChip.js.map +1 -0
- package/dist/client/composer/PromptComposer.d.ts +4 -2
- package/dist/client/composer/PromptComposer.d.ts.map +1 -1
- package/dist/client/composer/PromptComposer.js +33 -5
- package/dist/client/composer/PromptComposer.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts +13 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +61 -16
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/composer/VoiceButton.d.ts.map +1 -1
- package/dist/client/composer/VoiceButton.js +5 -1
- package/dist/client/composer/VoiceButton.js.map +1 -1
- package/dist/client/composer/pasted-text.d.ts +6 -0
- package/dist/client/composer/pasted-text.d.ts.map +1 -0
- package/dist/client/composer/pasted-text.js +49 -0
- package/dist/client/composer/pasted-text.js.map +1 -0
- package/dist/client/composer/useVoiceDictation.d.ts +1 -0
- package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
- package/dist/client/composer/useVoiceDictation.js +18 -0
- package/dist/client/composer/useVoiceDictation.js.map +1 -1
- package/dist/client/index.d.ts +0 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +0 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/integrations/IntegrationCard.d.ts.map +1 -1
- package/dist/client/integrations/IntegrationCard.js +14 -2
- package/dist/client/integrations/IntegrationCard.js.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.js +23 -4
- package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
- package/dist/client/notifications/NotificationsBell.d.ts.map +1 -1
- package/dist/client/notifications/NotificationsBell.js +4 -42
- package/dist/client/notifications/NotificationsBell.js.map +1 -1
- package/dist/client/org/OrgSwitcher.d.ts +4 -6
- package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
- package/dist/client/org/OrgSwitcher.js +84 -74
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/org/TeamPage.d.ts.map +1 -1
- package/dist/client/org/TeamPage.js +3 -154
- package/dist/client/org/TeamPage.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +13 -35
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/settings/SettingsPanel.js +1 -1
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/useBuilderStatus.d.ts +6 -0
- package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
- package/dist/client/settings/useBuilderStatus.js +3 -0
- package/dist/client/settings/useBuilderStatus.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts +15 -1
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +58 -54
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/client/tools/ToolEditor.d.ts.map +1 -1
- package/dist/client/tools/ToolEditor.js +34 -4
- package/dist/client/tools/ToolEditor.js.map +1 -1
- package/dist/client/tools/ToolViewer.d.ts.map +1 -1
- package/dist/client/tools/ToolViewer.js +20 -1
- package/dist/client/tools/ToolViewer.js.map +1 -1
- package/dist/client/tools/ToolsListPage.d.ts.map +1 -1
- package/dist/client/tools/ToolsListPage.js +2 -1
- package/dist/client/tools/ToolsListPage.js.map +1 -1
- package/dist/client/tools/ToolsSidebarSection.js +1 -1
- package/dist/client/tools/ToolsSidebarSection.js.map +1 -1
- package/dist/client/transcription/BuilderTranscriptionCta.js +1 -1
- package/dist/client/transcription/BuilderTranscriptionCta.js.map +1 -1
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js +7 -2
- package/dist/client/use-chat-threads.js.map +1 -1
- package/dist/collab/client.d.ts.map +1 -1
- package/dist/collab/client.js +26 -7
- package/dist/collab/client.js.map +1 -1
- package/dist/jobs/scheduler.js +0 -4
- package/dist/jobs/scheduler.js.map +1 -1
- package/dist/oauth-tokens/store.d.ts +0 -4
- package/dist/oauth-tokens/store.d.ts.map +1 -1
- package/dist/oauth-tokens/store.js +3 -24
- package/dist/oauth-tokens/store.js.map +1 -1
- package/dist/observability/routes.d.ts.map +1 -1
- package/dist/observability/routes.js +1 -9
- package/dist/observability/routes.js.map +1 -1
- package/dist/onboarding/default-steps.js +1 -1
- package/dist/onboarding/default-steps.js.map +1 -1
- package/dist/onboarding/plugin.d.ts.map +1 -1
- package/dist/onboarding/plugin.js +1 -8
- package/dist/onboarding/plugin.js.map +1 -1
- package/dist/org/accept-pending.d.ts.map +1 -1
- package/dist/org/accept-pending.js +1 -2
- package/dist/org/accept-pending.js.map +1 -1
- package/dist/org/context.d.ts +0 -2
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/context.js +0 -5
- package/dist/org/context.js.map +1 -1
- package/dist/resources/script-helpers.d.ts +3 -4
- package/dist/resources/script-helpers.d.ts.map +1 -1
- package/dist/resources/script-helpers.js +8 -15
- package/dist/resources/script-helpers.js.map +1 -1
- package/dist/scripts/chat/search-chats.d.ts.map +1 -1
- package/dist/scripts/chat/search-chats.js +4 -4
- package/dist/scripts/chat/search-chats.js.map +1 -1
- package/dist/scripts/manage-agent-loop-settings.js +2 -2
- package/dist/scripts/manage-agent-loop-settings.js.map +1 -1
- package/dist/scripts/resources/delete-memory.d.ts.map +1 -1
- package/dist/scripts/resources/delete-memory.js +4 -2
- package/dist/scripts/resources/delete-memory.js.map +1 -1
- package/dist/scripts/resources/delete.d.ts.map +1 -1
- package/dist/scripts/resources/delete.js +11 -4
- package/dist/scripts/resources/delete.js.map +1 -1
- package/dist/scripts/resources/list.d.ts.map +1 -1
- package/dist/scripts/resources/list.js +5 -3
- package/dist/scripts/resources/list.js.map +1 -1
- package/dist/scripts/resources/migrate-learnings.d.ts.map +1 -1
- package/dist/scripts/resources/migrate-learnings.js +5 -2
- package/dist/scripts/resources/migrate-learnings.js.map +1 -1
- package/dist/scripts/resources/read.d.ts.map +1 -1
- package/dist/scripts/resources/read.js +4 -2
- package/dist/scripts/resources/read.js.map +1 -1
- package/dist/scripts/resources/save-memory.d.ts.map +1 -1
- package/dist/scripts/resources/save-memory.js +4 -2
- package/dist/scripts/resources/save-memory.js.map +1 -1
- package/dist/scripts/resources/write.d.ts.map +1 -1
- package/dist/scripts/resources/write.js +11 -4
- package/dist/scripts/resources/write.js.map +1 -1
- package/dist/secrets/onboarding.d.ts.map +1 -1
- package/dist/secrets/onboarding.js +1 -9
- package/dist/secrets/onboarding.js.map +1 -1
- package/dist/secrets/routes.d.ts.map +1 -1
- package/dist/secrets/routes.js +2 -7
- package/dist/secrets/routes.js.map +1 -1
- package/dist/server/action-discovery.d.ts +15 -0
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +49 -0
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +5 -0
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +81 -20
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-discovery.d.ts.map +1 -1
- package/dist/server/agent-discovery.js +5 -7
- package/dist/server/agent-discovery.js.map +1 -1
- package/dist/server/auth.d.ts +16 -20
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +115 -333
- package/dist/server/auth.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +23 -16
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +1 -2
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/google-oauth.d.ts +14 -2
- package/dist/server/google-oauth.d.ts.map +1 -1
- package/dist/server/google-oauth.js +32 -10
- package/dist/server/google-oauth.js.map +1 -1
- package/dist/server/index.d.ts +3 -3
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/index.js.map +1 -1
- package/dist/server/oauth-helpers.d.ts +2 -4
- package/dist/server/oauth-helpers.d.ts.map +1 -1
- package/dist/server/oauth-helpers.js +2 -4
- package/dist/server/oauth-helpers.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts.map +1 -1
- package/dist/server/transcribe-voice.js +2 -4
- package/dist/server/transcribe-voice.js.map +1 -1
- package/dist/triggers/dispatcher.d.ts.map +1 -1
- package/dist/triggers/dispatcher.js +0 -3
- package/dist/triggers/dispatcher.js.map +1 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +13 -0
- package/dist/vite/client.js.map +1 -1
- package/docs/content/actions.md +1 -0
- package/docs/content/authentication.md +3 -20
- package/docs/content/creating-templates.md +1 -1
- package/docs/content/deployment.md +0 -1
- package/docs/content/security.md +0 -1
- package/docs/content/template-analytics.md +10 -0
- package/docs/content/template-calendar.md +10 -0
- package/docs/content/template-clips.md +10 -0
- package/docs/content/template-content.md +11 -1
- package/docs/content/template-dispatch.md +10 -0
- package/docs/content/template-forms.md +10 -0
- package/docs/content/template-mail.md +10 -0
- package/docs/content/template-slides.md +11 -1
- package/docs/content/template-starter.md +11 -1
- package/docs/content/template-video.md +10 -0
- package/package.json +1 -1
- package/dist/client/dev-mode.d.ts +0 -14
- package/dist/client/dev-mode.d.ts.map +0 -1
- package/dist/client/dev-mode.js +0 -14
- package/dist/client/dev-mode.js.map +0 -1
- package/dist/server/local-migration.d.ts +0 -41
- package/dist/server/local-migration.d.ts.map +0 -1
- package/dist/server/local-migration.js +0 -235
- package/dist/server/local-migration.js.map +0 -1
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// Pastes longer than this turn into a `Pasted text` attachment chip instead of
|
|
2
|
+
// being dumped into the editor. Mirrors Claude.ai / Claude Code's UX: anything
|
|
3
|
+
// that would visually drown the prompt becomes a clickable chip the user can
|
|
4
|
+
// remove or preview.
|
|
5
|
+
const PASTED_TEXT_MIN_CHARS = 1000;
|
|
6
|
+
const PASTED_TEXT_MIN_LINES = 6;
|
|
7
|
+
const PASTED_TEXT_FILENAME_PREFIX = "pasted-text-";
|
|
8
|
+
export function shouldConvertPasteToAttachment(text) {
|
|
9
|
+
if (!text)
|
|
10
|
+
return false;
|
|
11
|
+
if (text.length >= PASTED_TEXT_MIN_CHARS)
|
|
12
|
+
return true;
|
|
13
|
+
let lines = 1;
|
|
14
|
+
for (let i = 0; i < text.length; i++) {
|
|
15
|
+
if (text.charCodeAt(i) === 10) {
|
|
16
|
+
lines++;
|
|
17
|
+
if (lines >= PASTED_TEXT_MIN_LINES)
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
export function createPastedTextFile(text) {
|
|
24
|
+
const name = `${PASTED_TEXT_FILENAME_PREFIX}${Date.now()}-${Math.random()
|
|
25
|
+
.toString(36)
|
|
26
|
+
.slice(2, 8)}.txt`;
|
|
27
|
+
return new File([text], name, { type: "text/plain" });
|
|
28
|
+
}
|
|
29
|
+
export function isPastedTextAttachmentName(name) {
|
|
30
|
+
return !!name && name.startsWith(PASTED_TEXT_FILENAME_PREFIX);
|
|
31
|
+
}
|
|
32
|
+
// Strips the `<attachment name=...>\n` / `\n</attachment>` envelope that
|
|
33
|
+
// SimpleTextAttachmentAdapter wraps the file body in when sending. Returns the
|
|
34
|
+
// raw body for previewing.
|
|
35
|
+
export function unwrapAttachmentEnvelope(text) {
|
|
36
|
+
const match = text.match(/^<attachment name=[^>]+>\n([\s\S]*)\n<\/attachment>$/);
|
|
37
|
+
return match ? match[1] : text;
|
|
38
|
+
}
|
|
39
|
+
export function countLines(text) {
|
|
40
|
+
if (!text)
|
|
41
|
+
return 0;
|
|
42
|
+
let lines = 1;
|
|
43
|
+
for (let i = 0; i < text.length; i++) {
|
|
44
|
+
if (text.charCodeAt(i) === 10)
|
|
45
|
+
lines++;
|
|
46
|
+
}
|
|
47
|
+
return lines;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=pasted-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pasted-text.js","sourceRoot":"","sources":["../../../src/client/composer/pasted-text.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,+EAA+E;AAC/E,6EAA6E;AAC7E,qBAAqB;AACrB,MAAM,qBAAqB,GAAG,IAAI,CAAC;AACnC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEhC,MAAM,2BAA2B,GAAG,cAAc,CAAC;AAEnD,MAAM,UAAU,8BAA8B,CAAC,IAAY;IACzD,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,IAAI,IAAI,CAAC,MAAM,IAAI,qBAAqB;QAAE,OAAO,IAAI,CAAC;IACtD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;YAC9B,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,IAAI,qBAAqB;gBAAE,OAAO,IAAI,CAAC;QAClD,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,IAAI,GAAG,GAAG,2BAA2B,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE;SACtE,QAAQ,CAAC,EAAE,CAAC;SACZ,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;IACrB,OAAO,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAwB;IACjE,OAAO,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,2BAA2B,CAAC,CAAC;AAChE,CAAC;AAED,yEAAyE;AACzE,+EAA+E;AAC/E,2BAA2B;AAC3B,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CACtB,sDAAsD,CACvD,CAAC;IACF,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC;IACpB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE;YAAE,KAAK,EAAE,CAAC;IACzC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["// Pastes longer than this turn into a `Pasted text` attachment chip instead of\n// being dumped into the editor. Mirrors Claude.ai / Claude Code's UX: anything\n// that would visually drown the prompt becomes a clickable chip the user can\n// remove or preview.\nconst PASTED_TEXT_MIN_CHARS = 1000;\nconst PASTED_TEXT_MIN_LINES = 6;\n\nconst PASTED_TEXT_FILENAME_PREFIX = \"pasted-text-\";\n\nexport function shouldConvertPasteToAttachment(text: string): boolean {\n if (!text) return false;\n if (text.length >= PASTED_TEXT_MIN_CHARS) return true;\n let lines = 1;\n for (let i = 0; i < text.length; i++) {\n if (text.charCodeAt(i) === 10) {\n lines++;\n if (lines >= PASTED_TEXT_MIN_LINES) return true;\n }\n }\n return false;\n}\n\nexport function createPastedTextFile(text: string): File {\n const name = `${PASTED_TEXT_FILENAME_PREFIX}${Date.now()}-${Math.random()\n .toString(36)\n .slice(2, 8)}.txt`;\n return new File([text], name, { type: \"text/plain\" });\n}\n\nexport function isPastedTextAttachmentName(name: string | undefined): boolean {\n return !!name && name.startsWith(PASTED_TEXT_FILENAME_PREFIX);\n}\n\n// Strips the `<attachment name=...>\\n` / `\\n</attachment>` envelope that\n// SimpleTextAttachmentAdapter wraps the file body in when sending. Returns the\n// raw body for previewing.\nexport function unwrapAttachmentEnvelope(text: string): string {\n const match = text.match(\n /^<attachment name=[^>]+>\\n([\\s\\S]*)\\n<\\/attachment>$/,\n );\n return match ? match[1] : text;\n}\n\nexport function countLines(text: string): number {\n if (!text) return 0;\n let lines = 1;\n for (let i = 0; i < text.length; i++) {\n if (text.charCodeAt(i) === 10) lines++;\n }\n return lines;\n}\n"]}
|
|
@@ -41,6 +41,7 @@ export interface VoiceDictationApi {
|
|
|
41
41
|
start: () => Promise<void>;
|
|
42
42
|
stop: () => void;
|
|
43
43
|
cancel: () => void;
|
|
44
|
+
dismissError: () => void;
|
|
44
45
|
}
|
|
45
46
|
export declare function useVoiceDictation(options: UseVoiceDictationOptions): VoiceDictationApi;
|
|
46
47
|
//# sourceMappingURL=useVoiceDictation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useVoiceDictation.d.ts","sourceRoot":"","sources":["../../../src/client/composer/useVoiceDictation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,QAAQ,GACR,SAAS,GACT,iBAAiB,GACjB,gBAAgB,GAChB,SAAS,GACT,QAAQ,GACR,MAAM,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,iBAAiB,GAAG,OAAO,CAAC;AAE3E,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,aAAa,CAAC;IACxB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAgDD,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,UAAU,GACV,WAAW,GACX,cAAc,GACd,OAAO,CAAC;AAEZ,MAAM,WAAW,wBAAwB;IACvC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,mGAAmG;IACnG,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CACjE;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,aAAa,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,MAAM,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"useVoiceDictation.d.ts","sourceRoot":"","sources":["../../../src/client/composer/useVoiceDictation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,QAAQ,GACR,SAAS,GACT,iBAAiB,GACjB,gBAAgB,GAChB,SAAS,GACT,QAAQ,GACR,MAAM,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,iBAAiB,GAAG,OAAO,CAAC;AAE3E,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,aAAa,CAAC;IACxB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAgDD,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,UAAU,GACV,WAAW,GACX,cAAc,GACd,OAAO,CAAC;AAEZ,MAAM,WAAW,wBAAwB;IACvC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,mGAAmG;IACnG,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CACjE;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,aAAa,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAmED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,wBAAwB,GAChC,iBAAiB,CAktBnB"}
|
|
@@ -757,6 +757,23 @@ export function useVoiceDictation(options) {
|
|
|
757
757
|
teardown();
|
|
758
758
|
setState("idle");
|
|
759
759
|
}, [state, teardown]);
|
|
760
|
+
// Auto-dismiss error after 8s so a stale "permission denied" message doesn't
|
|
761
|
+
// sit forever after the user fixes the underlying permission. Manual dismiss
|
|
762
|
+
// (via dismissError) and click-to-retry both also clear the error sooner.
|
|
763
|
+
useEffect(() => {
|
|
764
|
+
if (state !== "error")
|
|
765
|
+
return;
|
|
766
|
+
const handle = setTimeout(() => {
|
|
767
|
+
setErrorMessage(null);
|
|
768
|
+
setState("idle");
|
|
769
|
+
}, 8000);
|
|
770
|
+
return () => clearTimeout(handle);
|
|
771
|
+
}, [state]);
|
|
772
|
+
const dismissError = useCallback(() => {
|
|
773
|
+
setErrorMessage(null);
|
|
774
|
+
if (state === "error")
|
|
775
|
+
setState("idle");
|
|
776
|
+
}, [state]);
|
|
760
777
|
return {
|
|
761
778
|
state,
|
|
762
779
|
amplitude,
|
|
@@ -767,6 +784,7 @@ export function useVoiceDictation(options) {
|
|
|
767
784
|
start,
|
|
768
785
|
stop,
|
|
769
786
|
cancel,
|
|
787
|
+
dismissError,
|
|
770
788
|
};
|
|
771
789
|
}
|
|
772
790
|
//# sourceMappingURL=useVoiceDictation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useVoiceDictation.js","sourceRoot":"","sources":["../../../src/client/composer/useVoiceDictation.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Voice dictation hook for the agent composer.\n *\n * Wires voice providers behind a single state machine:\n * - \"auto\" / \"openai\" / \"builder\" / \"builder-gemini\" / \"gemini\" / \"groq\"\n * — MediaRecorder → POST /_agent-native/transcribe-voice\n * - \"google-realtime\"\n * — MediaRecorder chunks → POST /_agent-native/transcribe-stream/session\n * → managed WebSocket → Google Speech-to-Text streaming\n * - \"browser\" — Web Speech API (low quality, offline capable)\n *\n * Provider preference lives in application_state under\n * `voice-transcription-prefs` (`{ transcriptionMode, provider, instructions }`).\n * The composer reads it on every start so settings changes take effect\n * immediately without unmounting the composer.\n *\n * The hook exposes amplitude (0..1) and duration (ms) so the composer can\n * render the Lovable-style live waveform + MM:SS timer.\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { agentNativePath } from \"../api-path.js\";\n\nexport type VoiceProvider =\n | \"auto\"\n | \"openai\"\n | \"browser\"\n | \"google-realtime\"\n | \"builder-gemini\"\n | \"builder\"\n | \"gemini\"\n | \"groq\";\n\nexport type TranscriptionMode = \"mac-native\" | \"google-realtime\" | \"batch\";\n\nexport interface VoicePrefs {\n provider: VoiceProvider;\n transcriptionMode?: TranscriptionMode;\n instructions?: string;\n}\n\nconst PREFS_KEY = \"voice-transcription-prefs\";\nconst PREFS_URL = agentNativePath(\n `/_agent-native/application-state/${PREFS_KEY}`,\n);\nconst TRANSCRIBE_URL = agentNativePath(\"/_agent-native/transcribe-voice\");\nconst GOOGLE_REALTIME_SESSION_URL = agentNativePath(\n \"/_agent-native/transcribe-stream/session\",\n);\nconst GOOGLE_REALTIME_WS_PROTOCOL = \"google-realtime.v1\";\nfunction isVoiceProvider(value: unknown): value is VoiceProvider {\n return (\n value === \"auto\" ||\n value === \"openai\" ||\n value === \"browser\" ||\n value === \"google-realtime\" ||\n value === \"builder-gemini\" ||\n value === \"builder\" ||\n value === \"gemini\" ||\n value === \"groq\"\n );\n}\n\nfunction isTranscriptionMode(value: unknown): value is TranscriptionMode {\n return (\n value === \"mac-native\" || value === \"google-realtime\" || value === \"batch\"\n );\n}\n\nasync function defaultProvider(): Promise<VoiceProvider> {\n return \"auto\";\n}\n\nfunction normalizeProviderForMode(\n mode: TranscriptionMode | undefined,\n provider: VoiceProvider | null,\n): VoiceProvider | null {\n if (mode === \"mac-native\") return \"browser\";\n if (mode === \"google-realtime\") return \"google-realtime\";\n if (mode === \"batch\") {\n if (!provider || provider === \"browser\") return \"auto\";\n return provider === \"builder\" ? \"builder-gemini\" : provider;\n }\n if (!provider) return null;\n return provider === \"builder\" ? \"builder-gemini\" : provider;\n}\n\nexport type VoiceState =\n | \"idle\"\n | \"starting\"\n | \"recording\"\n | \"transcribing\"\n | \"error\";\n\nexport interface UseVoiceDictationOptions {\n onTranscript: (text: string) => void;\n onError?: (message: string) => void;\n /** Called with (accumulatedFinalText, currentInterimText) as speech is recognized in real time. */\n onLiveUpdate?: (finalText: string, interimText: string) => void;\n}\n\nexport interface VoiceDictationApi {\n state: VoiceState;\n amplitude: number;\n durationMs: number;\n errorMessage: string | null;\n provider: VoiceProvider;\n supported: boolean;\n start: () => Promise<void>;\n stop: () => void;\n cancel: () => void;\n}\n\nasync function readVoicePrefs(): Promise<VoicePrefs> {\n try {\n const res = await fetch(PREFS_URL);\n if (!res.ok) return { provider: await defaultProvider() };\n const body = (await res.json()) as\n | VoicePrefs\n | { value?: VoicePrefs }\n | null;\n const value =\n (body as { value?: VoicePrefs } | null)?.value ??\n (body as VoicePrefs | null);\n const mode = isTranscriptionMode(value?.transcriptionMode)\n ? value.transcriptionMode\n : undefined;\n const p =\n (body as VoicePrefs | null)?.provider ??\n (body as { value?: VoicePrefs } | null)?.value?.provider;\n const instructions =\n (body as VoicePrefs | null)?.instructions ??\n (body as { value?: VoicePrefs } | null)?.value?.instructions;\n const provider = normalizeProviderForMode(\n mode,\n isVoiceProvider(p) ? p : null,\n );\n if (provider) {\n return {\n transcriptionMode: mode,\n provider,\n instructions:\n typeof instructions === \"string\" ? instructions.trim() : undefined,\n };\n }\n } catch {\n /* fall through */\n }\n return { provider: await defaultProvider() };\n}\n\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\nfunction pickMimeType(): string {\n if (typeof MediaRecorder === \"undefined\") return \"audio/webm\";\n const candidates = [\n \"audio/webm;codecs=opus\",\n \"audio/webm\",\n \"audio/mp4\",\n \"audio/ogg;codecs=opus\",\n ];\n for (const mime of candidates) {\n try {\n if (MediaRecorder.isTypeSupported(mime)) return mime;\n } catch {\n /* ignore */\n }\n }\n return \"audio/webm\";\n}\n\nexport function useVoiceDictation(\n options: UseVoiceDictationOptions,\n): VoiceDictationApi {\n const { onTranscript, onError, onLiveUpdate } = options;\n const onTranscriptRef = useRef(onTranscript);\n const onErrorRef = useRef(onError);\n const onLiveUpdateRef = useRef(onLiveUpdate);\n onTranscriptRef.current = onTranscript;\n onErrorRef.current = onError;\n onLiveUpdateRef.current = onLiveUpdate;\n\n const [state, setState] = useState<VoiceState>(\"idle\");\n const [amplitude, setAmplitude] = useState(0);\n const [durationMs, setDurationMs] = useState(0);\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const [provider, setProvider] = useState<VoiceProvider>(\"auto\");\n\n // Keep refs for teardown / cross-branch access.\n const mediaStreamRef = useRef<MediaStream | null>(null);\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n const chunksRef = useRef<Blob[]>([]);\n const audioContextRef = useRef<AudioContext | null>(null);\n const analyserRef = useRef<AnalyserNode | null>(null);\n const rafRef = useRef<number | null>(null);\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const startedAtRef = useRef<number>(0);\n const cancelledRef = useRef(false);\n const speechRef = useRef<any>(null);\n const speechTranscriptRef = useRef<string>(\"\");\n const activeProviderRef = useRef<VoiceProvider>(\"browser\");\n // Parallel live recognition for OpenAI mode (provides instant preview while MediaRecorder captures)\n const liveSpeechRef = useRef<any>(null);\n const liveTextRef = useRef<string>(\"\");\n const realtimeSocketRef = useRef<WebSocket | null>(null);\n const realtimeFinalRef = useRef<string>(\"\");\n const realtimeInterimRef = useRef<string>(\"\");\n const realtimeStopTimeoutRef = useRef<number | null>(null);\n\n const mediaRecorderSupported =\n typeof window !== \"undefined\" &&\n typeof navigator !== \"undefined\" &&\n !!navigator.mediaDevices?.getUserMedia &&\n typeof (window as any).MediaRecorder !== \"undefined\";\n const speechSupported = !!getSpeechRecognitionCtor();\n const supported = mediaRecorderSupported || speechSupported;\n\n const teardown = useCallback(() => {\n if (rafRef.current != null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n if (timerRef.current != null) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n if (mediaStreamRef.current) {\n for (const track of mediaStreamRef.current.getTracks()) {\n track.stop();\n }\n mediaStreamRef.current = null;\n }\n if (audioContextRef.current) {\n audioContextRef.current.close().catch(() => {});\n audioContextRef.current = null;\n }\n if (speechRef.current) {\n // Stop the Web Speech session before dropping the ref so the browser\n // releases the mic and stops dispatching onresult events into a stale\n // closure. abort() is fire-and-forget (no final result); stop() would\n // deliver remaining partials but we've already cleared state.\n try {\n speechRef.current.abort?.();\n } catch {\n /* ignore */\n }\n }\n if (liveSpeechRef.current) {\n try {\n liveSpeechRef.current.abort?.();\n } catch {\n /* ignore */\n }\n liveSpeechRef.current = null;\n }\n if (realtimeSocketRef.current) {\n const socket = realtimeSocketRef.current;\n realtimeSocketRef.current = null;\n try {\n socket.close();\n } catch {\n /* ignore */\n }\n }\n if (realtimeStopTimeoutRef.current) {\n clearTimeout(realtimeStopTimeoutRef.current);\n realtimeStopTimeoutRef.current = null;\n }\n analyserRef.current = null;\n mediaRecorderRef.current = null;\n chunksRef.current = [];\n speechRef.current = null;\n speechTranscriptRef.current = \"\";\n liveTextRef.current = \"\";\n realtimeFinalRef.current = \"\";\n realtimeInterimRef.current = \"\";\n setAmplitude(0);\n }, []);\n\n useEffect(() => teardown, [teardown]);\n\n const failWith = useCallback(\n (message: string) => {\n setErrorMessage(message);\n setState(\"error\");\n onErrorRef.current?.(message);\n teardown();\n },\n [teardown],\n );\n\n const startMeter = useCallback((stream: MediaStream) => {\n try {\n const AudioCtor =\n typeof window !== \"undefined\"\n ? window.AudioContext || (window as any).webkitAudioContext || null\n : null;\n if (!AudioCtor) return;\n const ctx: AudioContext = new AudioCtor();\n const source = ctx.createMediaStreamSource(stream);\n const analyser = ctx.createAnalyser();\n analyser.fftSize = 512;\n source.connect(analyser);\n audioContextRef.current = ctx;\n analyserRef.current = analyser;\n\n const buffer = new Uint8Array(analyser.frequencyBinCount);\n const tick = () => {\n if (!analyserRef.current) return;\n analyserRef.current.getByteTimeDomainData(buffer);\n let sumSquares = 0;\n for (let i = 0; i < buffer.length; i++) {\n const n = (buffer[i] - 128) / 128;\n sumSquares += n * n;\n }\n const rms = Math.sqrt(sumSquares / buffer.length);\n setAmplitude(Math.min(1, rms * 2.5));\n rafRef.current = requestAnimationFrame(tick);\n };\n rafRef.current = requestAnimationFrame(tick);\n } catch {\n /* analyser is best-effort */\n }\n }, []);\n\n const startTimer = useCallback(() => {\n startedAtRef.current = Date.now();\n setDurationMs(0);\n timerRef.current = setInterval(() => {\n setDurationMs(Date.now() - startedAtRef.current);\n }, 100);\n }, []);\n\n const startOpenAi = useCallback(\n async (providerPref: VoiceProvider, instructions?: string) => {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n // User may have pressed Escape (cancel) while the permission prompt was\n // open. If so, stop the stream and bail before we start recording.\n if (cancelledRef.current) {\n for (const track of stream.getTracks()) track.stop();\n cancelledRef.current = false;\n setState(\"idle\");\n return;\n }\n mediaStreamRef.current = stream;\n const mimeType = pickMimeType();\n const recorder = new MediaRecorder(stream, { mimeType });\n mediaRecorderRef.current = recorder;\n chunksRef.current = [];\n\n recorder.ondataavailable = (e) => {\n if (e.data && e.data.size > 0) chunksRef.current.push(e.data);\n };\n recorder.onstop = async () => {\n const localChunks = chunksRef.current.slice();\n const localMime = recorder.mimeType || mimeType;\n const liveSnapshot = liveTextRef.current;\n teardown();\n if (cancelledRef.current) {\n cancelledRef.current = false;\n setState(\"idle\");\n return;\n }\n if (localChunks.length === 0) {\n if (liveSnapshot) onTranscriptRef.current?.(liveSnapshot.trim());\n setState(\"idle\");\n return;\n }\n setState(\"transcribing\");\n try {\n const audioBlob = new Blob(localChunks, { type: localMime });\n const form = new FormData();\n form.append(\n \"audio\",\n audioBlob,\n `voice.${localMime.split(\"/\")[1] ?? \"webm\"}`,\n );\n form.append(\"provider\", providerPref);\n if (instructions?.trim()) {\n form.append(\"instructions\", instructions.trim());\n }\n const res = await fetch(TRANSCRIBE_URL, {\n method: \"POST\",\n body: form,\n });\n if (!res.ok) {\n const body = await res\n .json()\n .catch(() => ({ error: `HTTP ${res.status}` }));\n throw new Error(\n body.error || `Transcription failed (${res.status})`,\n );\n }\n const data = (await res.json()) as { text?: string };\n const text = (data.text ?? \"\").trim();\n if (text) {\n onTranscriptRef.current?.(text);\n } else if (liveSnapshot) {\n onTranscriptRef.current?.(liveSnapshot.trim());\n }\n setState(\"idle\");\n } catch (err) {\n if (liveSnapshot) {\n onTranscriptRef.current?.(liveSnapshot.trim());\n setState(\"idle\");\n } else {\n failWith(\n (err as Error)?.message ??\n \"Transcription failed. Check your voice transcription provider in settings.\",\n );\n }\n }\n };\n\n startMeter(stream);\n startTimer();\n setState(\"recording\");\n recorder.start();\n\n // Start parallel Web Speech recognition for live preview text.\n // This runs alongside MediaRecorder so the user sees words appear\n // immediately while the server provider processes the full recording later.\n const SpeechCtor = getSpeechRecognitionCtor();\n if (SpeechCtor) {\n const liveSpeech = new SpeechCtor();\n liveSpeech.continuous = true;\n liveSpeech.interimResults = true;\n liveSpeech.lang =\n (typeof navigator !== \"undefined\" && navigator.language) || \"en-US\";\n liveSpeechRef.current = liveSpeech;\n liveTextRef.current = \"\";\n\n liveSpeech.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 liveTextRef.current += text;\n } else {\n interim += text;\n }\n }\n onLiveUpdateRef.current?.(liveTextRef.current, interim);\n };\n\n liveSpeech.onend = () => {\n if (liveSpeechRef.current === liveSpeech) {\n try {\n liveSpeech.start();\n } catch {\n /* ignore */\n }\n }\n };\n\n liveSpeech.onerror = () => {};\n\n try {\n liveSpeech.start();\n } catch {\n /* best effort — live preview just won't appear */\n }\n }\n },\n [startMeter, startTimer, teardown, failWith],\n );\n\n const startBrowser = useCallback(async () => {\n const Ctor = getSpeechRecognitionCtor();\n if (!Ctor) {\n throw new Error(\n \"Your browser doesn't support speech recognition. Add an OpenAI API key in settings for Whisper transcription.\",\n );\n }\n // Still request mic to drive the amplitude meter, so the UI doesn't look\n // dead while the user talks. SpeechRecognition manages its own capture\n // under the hood in most browsers.\n let stream: MediaStream | null = null;\n try {\n stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n mediaStreamRef.current = stream;\n startMeter(stream);\n } catch {\n /* non-fatal — recognition can still work without our analyser */\n }\n\n if (cancelledRef.current) {\n if (stream) for (const track of stream.getTracks()) track.stop();\n mediaStreamRef.current = null;\n cancelledRef.current = false;\n setState(\"idle\");\n return;\n }\n\n const recognition = new Ctor();\n recognition.continuous = true;\n recognition.interimResults = true;\n recognition.lang =\n (typeof navigator !== \"undefined\" && navigator.language) || \"en-US\";\n speechRef.current = recognition;\n speechTranscriptRef.current = \"\";\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 speechTranscriptRef.current += text;\n } else {\n interim += text;\n }\n }\n onLiveUpdateRef.current?.(speechTranscriptRef.current, interim);\n };\n recognition.onerror = (event: any) => {\n if (event?.error === \"no-speech\" || event?.error === \"aborted\") return;\n failWith(\n event?.error === \"not-allowed\"\n ? \"Microphone permission denied. Enable it in your browser settings.\"\n : `Speech recognition error: ${event?.error ?? \"unknown\"}`,\n );\n };\n recognition.onend = () => {\n const text = speechTranscriptRef.current.trim();\n const wasCancelled = cancelledRef.current;\n cancelledRef.current = false;\n teardown();\n if (!wasCancelled && text) onTranscriptRef.current?.(text);\n setState(\"idle\");\n };\n\n startTimer();\n setState(\"recording\");\n recognition.start();\n }, [startMeter, startTimer, teardown, failWith]);\n\n const startGoogleRealtime = useCallback(async () => {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n if (cancelledRef.current) {\n for (const track of stream.getTracks()) track.stop();\n cancelledRef.current = false;\n setState(\"idle\");\n return;\n }\n\n const sessionRes = await fetch(GOOGLE_REALTIME_SESSION_URL, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n language:\n (typeof navigator !== \"undefined\" && navigator.language) || \"en-US\",\n }),\n });\n const sessionBody = (await sessionRes\n .json()\n .catch(() => ({ error: `HTTP ${sessionRes.status}` }))) as {\n websocketUrl?: string;\n websocketProtocol?: string;\n sessionToken?: string;\n error?: string;\n };\n if (\n !sessionRes.ok ||\n !sessionBody.websocketUrl ||\n !sessionBody.sessionToken\n ) {\n for (const track of stream.getTracks()) track.stop();\n throw new Error(\n sessionBody.error ||\n `Could not start Google realtime transcription (${sessionRes.status})`,\n );\n }\n if (cancelledRef.current) {\n for (const track of stream.getTracks()) track.stop();\n cancelledRef.current = false;\n setState(\"idle\");\n return;\n }\n\n mediaStreamRef.current = stream;\n const mimeType = pickMimeType();\n const recorder = new MediaRecorder(stream, { mimeType });\n mediaRecorderRef.current = recorder;\n realtimeFinalRef.current = \"\";\n realtimeInterimRef.current = \"\";\n\n let finalized = false;\n let recorderStarted = false;\n const finish = (errorMessage?: string) => {\n if (finalized) return;\n finalized = true;\n const finalText = realtimeFinalRef.current.trim();\n const interimText = realtimeInterimRef.current.trim();\n const text = [finalText, interimText].filter(Boolean).join(\" \").trim();\n teardown();\n if (cancelledRef.current) {\n cancelledRef.current = false;\n setState(\"idle\");\n return;\n }\n if (text) {\n onTranscriptRef.current?.(text);\n setState(\"idle\");\n return;\n }\n if (errorMessage) {\n failWith(errorMessage);\n return;\n }\n setState(\"idle\");\n };\n\n recorder.ondataavailable = async (event) => {\n if (!event.data || event.data.size === 0) return;\n const socket = realtimeSocketRef.current;\n if (!socket || socket.readyState !== WebSocket.OPEN) return;\n try {\n socket.send(await event.data.arrayBuffer());\n } catch (err) {\n finish((err as Error)?.message ?? \"Realtime audio upload failed\");\n }\n };\n\n recorder.onstop = () => {\n const socket = realtimeSocketRef.current;\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n finish();\n return;\n }\n setState(\"transcribing\");\n try {\n socket.send(JSON.stringify({ type: \"stop\" }));\n } catch {\n finish();\n return;\n }\n realtimeStopTimeoutRef.current = window.setTimeout(() => {\n const activeSocket = realtimeSocketRef.current;\n if (activeSocket?.readyState === WebSocket.OPEN) {\n try {\n activeSocket.close();\n } catch {\n finish();\n }\n return;\n }\n finish();\n }, 10000);\n };\n\n const socket = new WebSocket(sessionBody.websocketUrl, [\n sessionBody.websocketProtocol || GOOGLE_REALTIME_WS_PROTOCOL,\n sessionBody.sessionToken,\n ]);\n socket.binaryType = \"arraybuffer\";\n realtimeSocketRef.current = socket;\n\n socket.onmessage = (event) => {\n if (cancelledRef.current) {\n finish();\n return;\n }\n const raw =\n typeof event.data === \"string\"\n ? event.data\n : event.data instanceof Blob\n ? null\n : new TextDecoder().decode(event.data);\n if (!raw) return;\n let message:\n | {\n type?: string;\n text?: string;\n error?: string;\n }\n | undefined;\n try {\n message = JSON.parse(raw);\n } catch {\n return;\n }\n if (!message?.type) return;\n if (message.type === \"ready\") {\n if (!recorderStarted) {\n recorderStarted = true;\n startMeter(stream);\n startTimer();\n setState(\"recording\");\n recorder.start(100);\n }\n return;\n }\n if (message.type === \"partial\") {\n realtimeInterimRef.current = (message.text ?? \"\").trim();\n onLiveUpdateRef.current?.(\n realtimeFinalRef.current,\n realtimeInterimRef.current,\n );\n return;\n }\n if (message.type === \"final\") {\n const next = (message.text ?? \"\").trim();\n if (next) {\n realtimeFinalRef.current = [realtimeFinalRef.current.trim(), next]\n .filter(Boolean)\n .join(\" \");\n }\n realtimeInterimRef.current = \"\";\n onLiveUpdateRef.current?.(realtimeFinalRef.current, \"\");\n return;\n }\n if (message.type === \"error\") {\n finish(message.error || \"Google realtime transcription failed\");\n return;\n }\n if (message.type === \"end\") {\n finish();\n }\n };\n\n socket.onerror = () => {\n finish(\"Google realtime transcription connection failed\");\n };\n\n socket.onclose = () => {\n finish();\n };\n\n socket.onopen = () => {\n if (cancelledRef.current) {\n finish();\n return;\n }\n try {\n socket.send(\n JSON.stringify({\n type: \"start\",\n language:\n (typeof navigator !== \"undefined\" && navigator.language) ||\n \"en-US\",\n interimResults: true,\n mimeType,\n }),\n );\n } catch (err) {\n finish((err as Error)?.message ?? \"Could not start realtime stream\");\n }\n };\n }, [startMeter, startTimer, teardown, failWith]);\n\n const start = useCallback(async () => {\n if (state === \"recording\" || state === \"starting\") return;\n setErrorMessage(null);\n setState(\"starting\");\n cancelledRef.current = false;\n\n const prefs = await readVoicePrefs();\n const pref = prefs.provider;\n setProvider(pref);\n\n // Server providers all use the same client-side flow as \"openai\"\n // (MediaRecorder -> POST to /_agent-native/transcribe-voice).\n // The server route handles routing to the right backend.\n const resolvedProvider: VoiceProvider =\n pref === \"auto\" ||\n pref === \"builder\" ||\n pref === \"builder-gemini\" ||\n pref === \"gemini\" ||\n pref === \"groq\"\n ? \"openai\"\n : pref;\n activeProviderRef.current = resolvedProvider;\n\n try {\n if (resolvedProvider === \"openai\") {\n if (!mediaRecorderSupported) {\n throw new Error(\n \"Your browser doesn't support audio recording. Use the browser provider in Settings → Voice Transcription.\",\n );\n }\n await startOpenAi(pref, prefs.instructions);\n } else if (resolvedProvider === \"google-realtime\") {\n if (!mediaRecorderSupported) {\n throw new Error(\n \"Your browser doesn't support audio recording, so Google realtime transcription can't start.\",\n );\n }\n await startGoogleRealtime();\n } else {\n await startBrowser();\n }\n } catch (err) {\n if (cancelledRef.current) {\n cancelledRef.current = false;\n teardown();\n setState(\"idle\");\n return;\n }\n const message =\n (err as Error)?.name === \"NotAllowedError\"\n ? \"Microphone permission denied. Enable it in your browser settings.\"\n : ((err as Error)?.message ?? \"Could not start recording\");\n failWith(message);\n }\n }, [\n state,\n mediaRecorderSupported,\n startOpenAi,\n startGoogleRealtime,\n startBrowser,\n failWith,\n ]);\n\n const stop = useCallback(() => {\n if (state !== \"recording\") return;\n cancelledRef.current = false;\n if (\n (activeProviderRef.current === \"openai\" ||\n activeProviderRef.current === \"google-realtime\") &&\n mediaRecorderRef.current\n ) {\n try {\n mediaRecorderRef.current.stop();\n } catch {\n teardown();\n setState(\"idle\");\n }\n } else if (speechRef.current) {\n try {\n speechRef.current.stop();\n } catch {\n teardown();\n setState(\"idle\");\n }\n } else {\n teardown();\n setState(\"idle\");\n }\n }, [state, teardown]);\n\n const cancel = useCallback(() => {\n if (state !== \"recording\" && state !== \"starting\") return;\n cancelledRef.current = true;\n if (\n (activeProviderRef.current === \"openai\" ||\n activeProviderRef.current === \"google-realtime\") &&\n mediaRecorderRef.current\n ) {\n try {\n mediaRecorderRef.current.stop();\n } catch {\n /* ignore */\n }\n } else if (speechRef.current) {\n try {\n speechRef.current.abort?.();\n } catch {\n /* ignore */\n }\n }\n teardown();\n setState(\"idle\");\n }, [state, teardown]);\n\n return {\n state,\n amplitude,\n durationMs,\n errorMessage,\n provider,\n supported,\n start,\n stop,\n cancel,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"useVoiceDictation.js","sourceRoot":"","sources":["../../../src/client/composer/useVoiceDictation.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Voice dictation hook for the agent composer.\n *\n * Wires voice providers behind a single state machine:\n * - \"auto\" / \"openai\" / \"builder\" / \"builder-gemini\" / \"gemini\" / \"groq\"\n * — MediaRecorder → POST /_agent-native/transcribe-voice\n * - \"google-realtime\"\n * — MediaRecorder chunks → POST /_agent-native/transcribe-stream/session\n * → managed WebSocket → Google Speech-to-Text streaming\n * - \"browser\" — Web Speech API (low quality, offline capable)\n *\n * Provider preference lives in application_state under\n * `voice-transcription-prefs` (`{ transcriptionMode, provider, instructions }`).\n * The composer reads it on every start so settings changes take effect\n * immediately without unmounting the composer.\n *\n * The hook exposes amplitude (0..1) and duration (ms) so the composer can\n * render the Lovable-style live waveform + MM:SS timer.\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { agentNativePath } from \"../api-path.js\";\n\nexport type VoiceProvider =\n | \"auto\"\n | \"openai\"\n | \"browser\"\n | \"google-realtime\"\n | \"builder-gemini\"\n | \"builder\"\n | \"gemini\"\n | \"groq\";\n\nexport type TranscriptionMode = \"mac-native\" | \"google-realtime\" | \"batch\";\n\nexport interface VoicePrefs {\n provider: VoiceProvider;\n transcriptionMode?: TranscriptionMode;\n instructions?: string;\n}\n\nconst PREFS_KEY = \"voice-transcription-prefs\";\nconst PREFS_URL = agentNativePath(\n `/_agent-native/application-state/${PREFS_KEY}`,\n);\nconst TRANSCRIBE_URL = agentNativePath(\"/_agent-native/transcribe-voice\");\nconst GOOGLE_REALTIME_SESSION_URL = agentNativePath(\n \"/_agent-native/transcribe-stream/session\",\n);\nconst GOOGLE_REALTIME_WS_PROTOCOL = \"google-realtime.v1\";\nfunction isVoiceProvider(value: unknown): value is VoiceProvider {\n return (\n value === \"auto\" ||\n value === \"openai\" ||\n value === \"browser\" ||\n value === \"google-realtime\" ||\n value === \"builder-gemini\" ||\n value === \"builder\" ||\n value === \"gemini\" ||\n value === \"groq\"\n );\n}\n\nfunction isTranscriptionMode(value: unknown): value is TranscriptionMode {\n return (\n value === \"mac-native\" || value === \"google-realtime\" || value === \"batch\"\n );\n}\n\nasync function defaultProvider(): Promise<VoiceProvider> {\n return \"auto\";\n}\n\nfunction normalizeProviderForMode(\n mode: TranscriptionMode | undefined,\n provider: VoiceProvider | null,\n): VoiceProvider | null {\n if (mode === \"mac-native\") return \"browser\";\n if (mode === \"google-realtime\") return \"google-realtime\";\n if (mode === \"batch\") {\n if (!provider || provider === \"browser\") return \"auto\";\n return provider === \"builder\" ? \"builder-gemini\" : provider;\n }\n if (!provider) return null;\n return provider === \"builder\" ? \"builder-gemini\" : provider;\n}\n\nexport type VoiceState =\n | \"idle\"\n | \"starting\"\n | \"recording\"\n | \"transcribing\"\n | \"error\";\n\nexport interface UseVoiceDictationOptions {\n onTranscript: (text: string) => void;\n onError?: (message: string) => void;\n /** Called with (accumulatedFinalText, currentInterimText) as speech is recognized in real time. */\n onLiveUpdate?: (finalText: string, interimText: string) => void;\n}\n\nexport interface VoiceDictationApi {\n state: VoiceState;\n amplitude: number;\n durationMs: number;\n errorMessage: string | null;\n provider: VoiceProvider;\n supported: boolean;\n start: () => Promise<void>;\n stop: () => void;\n cancel: () => void;\n dismissError: () => void;\n}\n\nasync function readVoicePrefs(): Promise<VoicePrefs> {\n try {\n const res = await fetch(PREFS_URL);\n if (!res.ok) return { provider: await defaultProvider() };\n const body = (await res.json()) as\n | VoicePrefs\n | { value?: VoicePrefs }\n | null;\n const value =\n (body as { value?: VoicePrefs } | null)?.value ??\n (body as VoicePrefs | null);\n const mode = isTranscriptionMode(value?.transcriptionMode)\n ? value.transcriptionMode\n : undefined;\n const p =\n (body as VoicePrefs | null)?.provider ??\n (body as { value?: VoicePrefs } | null)?.value?.provider;\n const instructions =\n (body as VoicePrefs | null)?.instructions ??\n (body as { value?: VoicePrefs } | null)?.value?.instructions;\n const provider = normalizeProviderForMode(\n mode,\n isVoiceProvider(p) ? p : null,\n );\n if (provider) {\n return {\n transcriptionMode: mode,\n provider,\n instructions:\n typeof instructions === \"string\" ? instructions.trim() : undefined,\n };\n }\n } catch {\n /* fall through */\n }\n return { provider: await defaultProvider() };\n}\n\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\nfunction pickMimeType(): string {\n if (typeof MediaRecorder === \"undefined\") return \"audio/webm\";\n const candidates = [\n \"audio/webm;codecs=opus\",\n \"audio/webm\",\n \"audio/mp4\",\n \"audio/ogg;codecs=opus\",\n ];\n for (const mime of candidates) {\n try {\n if (MediaRecorder.isTypeSupported(mime)) return mime;\n } catch {\n /* ignore */\n }\n }\n return \"audio/webm\";\n}\n\nexport function useVoiceDictation(\n options: UseVoiceDictationOptions,\n): VoiceDictationApi {\n const { onTranscript, onError, onLiveUpdate } = options;\n const onTranscriptRef = useRef(onTranscript);\n const onErrorRef = useRef(onError);\n const onLiveUpdateRef = useRef(onLiveUpdate);\n onTranscriptRef.current = onTranscript;\n onErrorRef.current = onError;\n onLiveUpdateRef.current = onLiveUpdate;\n\n const [state, setState] = useState<VoiceState>(\"idle\");\n const [amplitude, setAmplitude] = useState(0);\n const [durationMs, setDurationMs] = useState(0);\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const [provider, setProvider] = useState<VoiceProvider>(\"auto\");\n\n // Keep refs for teardown / cross-branch access.\n const mediaStreamRef = useRef<MediaStream | null>(null);\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n const chunksRef = useRef<Blob[]>([]);\n const audioContextRef = useRef<AudioContext | null>(null);\n const analyserRef = useRef<AnalyserNode | null>(null);\n const rafRef = useRef<number | null>(null);\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const startedAtRef = useRef<number>(0);\n const cancelledRef = useRef(false);\n const speechRef = useRef<any>(null);\n const speechTranscriptRef = useRef<string>(\"\");\n const activeProviderRef = useRef<VoiceProvider>(\"browser\");\n // Parallel live recognition for OpenAI mode (provides instant preview while MediaRecorder captures)\n const liveSpeechRef = useRef<any>(null);\n const liveTextRef = useRef<string>(\"\");\n const realtimeSocketRef = useRef<WebSocket | null>(null);\n const realtimeFinalRef = useRef<string>(\"\");\n const realtimeInterimRef = useRef<string>(\"\");\n const realtimeStopTimeoutRef = useRef<number | null>(null);\n\n const mediaRecorderSupported =\n typeof window !== \"undefined\" &&\n typeof navigator !== \"undefined\" &&\n !!navigator.mediaDevices?.getUserMedia &&\n typeof (window as any).MediaRecorder !== \"undefined\";\n const speechSupported = !!getSpeechRecognitionCtor();\n const supported = mediaRecorderSupported || speechSupported;\n\n const teardown = useCallback(() => {\n if (rafRef.current != null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n if (timerRef.current != null) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n if (mediaStreamRef.current) {\n for (const track of mediaStreamRef.current.getTracks()) {\n track.stop();\n }\n mediaStreamRef.current = null;\n }\n if (audioContextRef.current) {\n audioContextRef.current.close().catch(() => {});\n audioContextRef.current = null;\n }\n if (speechRef.current) {\n // Stop the Web Speech session before dropping the ref so the browser\n // releases the mic and stops dispatching onresult events into a stale\n // closure. abort() is fire-and-forget (no final result); stop() would\n // deliver remaining partials but we've already cleared state.\n try {\n speechRef.current.abort?.();\n } catch {\n /* ignore */\n }\n }\n if (liveSpeechRef.current) {\n try {\n liveSpeechRef.current.abort?.();\n } catch {\n /* ignore */\n }\n liveSpeechRef.current = null;\n }\n if (realtimeSocketRef.current) {\n const socket = realtimeSocketRef.current;\n realtimeSocketRef.current = null;\n try {\n socket.close();\n } catch {\n /* ignore */\n }\n }\n if (realtimeStopTimeoutRef.current) {\n clearTimeout(realtimeStopTimeoutRef.current);\n realtimeStopTimeoutRef.current = null;\n }\n analyserRef.current = null;\n mediaRecorderRef.current = null;\n chunksRef.current = [];\n speechRef.current = null;\n speechTranscriptRef.current = \"\";\n liveTextRef.current = \"\";\n realtimeFinalRef.current = \"\";\n realtimeInterimRef.current = \"\";\n setAmplitude(0);\n }, []);\n\n useEffect(() => teardown, [teardown]);\n\n const failWith = useCallback(\n (message: string) => {\n setErrorMessage(message);\n setState(\"error\");\n onErrorRef.current?.(message);\n teardown();\n },\n [teardown],\n );\n\n const startMeter = useCallback((stream: MediaStream) => {\n try {\n const AudioCtor =\n typeof window !== \"undefined\"\n ? window.AudioContext || (window as any).webkitAudioContext || null\n : null;\n if (!AudioCtor) return;\n const ctx: AudioContext = new AudioCtor();\n const source = ctx.createMediaStreamSource(stream);\n const analyser = ctx.createAnalyser();\n analyser.fftSize = 512;\n source.connect(analyser);\n audioContextRef.current = ctx;\n analyserRef.current = analyser;\n\n const buffer = new Uint8Array(analyser.frequencyBinCount);\n const tick = () => {\n if (!analyserRef.current) return;\n analyserRef.current.getByteTimeDomainData(buffer);\n let sumSquares = 0;\n for (let i = 0; i < buffer.length; i++) {\n const n = (buffer[i] - 128) / 128;\n sumSquares += n * n;\n }\n const rms = Math.sqrt(sumSquares / buffer.length);\n setAmplitude(Math.min(1, rms * 2.5));\n rafRef.current = requestAnimationFrame(tick);\n };\n rafRef.current = requestAnimationFrame(tick);\n } catch {\n /* analyser is best-effort */\n }\n }, []);\n\n const startTimer = useCallback(() => {\n startedAtRef.current = Date.now();\n setDurationMs(0);\n timerRef.current = setInterval(() => {\n setDurationMs(Date.now() - startedAtRef.current);\n }, 100);\n }, []);\n\n const startOpenAi = useCallback(\n async (providerPref: VoiceProvider, instructions?: string) => {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n // User may have pressed Escape (cancel) while the permission prompt was\n // open. If so, stop the stream and bail before we start recording.\n if (cancelledRef.current) {\n for (const track of stream.getTracks()) track.stop();\n cancelledRef.current = false;\n setState(\"idle\");\n return;\n }\n mediaStreamRef.current = stream;\n const mimeType = pickMimeType();\n const recorder = new MediaRecorder(stream, { mimeType });\n mediaRecorderRef.current = recorder;\n chunksRef.current = [];\n\n recorder.ondataavailable = (e) => {\n if (e.data && e.data.size > 0) chunksRef.current.push(e.data);\n };\n recorder.onstop = async () => {\n const localChunks = chunksRef.current.slice();\n const localMime = recorder.mimeType || mimeType;\n const liveSnapshot = liveTextRef.current;\n teardown();\n if (cancelledRef.current) {\n cancelledRef.current = false;\n setState(\"idle\");\n return;\n }\n if (localChunks.length === 0) {\n if (liveSnapshot) onTranscriptRef.current?.(liveSnapshot.trim());\n setState(\"idle\");\n return;\n }\n setState(\"transcribing\");\n try {\n const audioBlob = new Blob(localChunks, { type: localMime });\n const form = new FormData();\n form.append(\n \"audio\",\n audioBlob,\n `voice.${localMime.split(\"/\")[1] ?? \"webm\"}`,\n );\n form.append(\"provider\", providerPref);\n if (instructions?.trim()) {\n form.append(\"instructions\", instructions.trim());\n }\n const res = await fetch(TRANSCRIBE_URL, {\n method: \"POST\",\n body: form,\n });\n if (!res.ok) {\n const body = await res\n .json()\n .catch(() => ({ error: `HTTP ${res.status}` }));\n throw new Error(\n body.error || `Transcription failed (${res.status})`,\n );\n }\n const data = (await res.json()) as { text?: string };\n const text = (data.text ?? \"\").trim();\n if (text) {\n onTranscriptRef.current?.(text);\n } else if (liveSnapshot) {\n onTranscriptRef.current?.(liveSnapshot.trim());\n }\n setState(\"idle\");\n } catch (err) {\n if (liveSnapshot) {\n onTranscriptRef.current?.(liveSnapshot.trim());\n setState(\"idle\");\n } else {\n failWith(\n (err as Error)?.message ??\n \"Transcription failed. Check your voice transcription provider in settings.\",\n );\n }\n }\n };\n\n startMeter(stream);\n startTimer();\n setState(\"recording\");\n recorder.start();\n\n // Start parallel Web Speech recognition for live preview text.\n // This runs alongside MediaRecorder so the user sees words appear\n // immediately while the server provider processes the full recording later.\n const SpeechCtor = getSpeechRecognitionCtor();\n if (SpeechCtor) {\n const liveSpeech = new SpeechCtor();\n liveSpeech.continuous = true;\n liveSpeech.interimResults = true;\n liveSpeech.lang =\n (typeof navigator !== \"undefined\" && navigator.language) || \"en-US\";\n liveSpeechRef.current = liveSpeech;\n liveTextRef.current = \"\";\n\n liveSpeech.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 liveTextRef.current += text;\n } else {\n interim += text;\n }\n }\n onLiveUpdateRef.current?.(liveTextRef.current, interim);\n };\n\n liveSpeech.onend = () => {\n if (liveSpeechRef.current === liveSpeech) {\n try {\n liveSpeech.start();\n } catch {\n /* ignore */\n }\n }\n };\n\n liveSpeech.onerror = () => {};\n\n try {\n liveSpeech.start();\n } catch {\n /* best effort — live preview just won't appear */\n }\n }\n },\n [startMeter, startTimer, teardown, failWith],\n );\n\n const startBrowser = useCallback(async () => {\n const Ctor = getSpeechRecognitionCtor();\n if (!Ctor) {\n throw new Error(\n \"Your browser doesn't support speech recognition. Add an OpenAI API key in settings for Whisper transcription.\",\n );\n }\n // Still request mic to drive the amplitude meter, so the UI doesn't look\n // dead while the user talks. SpeechRecognition manages its own capture\n // under the hood in most browsers.\n let stream: MediaStream | null = null;\n try {\n stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n mediaStreamRef.current = stream;\n startMeter(stream);\n } catch {\n /* non-fatal — recognition can still work without our analyser */\n }\n\n if (cancelledRef.current) {\n if (stream) for (const track of stream.getTracks()) track.stop();\n mediaStreamRef.current = null;\n cancelledRef.current = false;\n setState(\"idle\");\n return;\n }\n\n const recognition = new Ctor();\n recognition.continuous = true;\n recognition.interimResults = true;\n recognition.lang =\n (typeof navigator !== \"undefined\" && navigator.language) || \"en-US\";\n speechRef.current = recognition;\n speechTranscriptRef.current = \"\";\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 speechTranscriptRef.current += text;\n } else {\n interim += text;\n }\n }\n onLiveUpdateRef.current?.(speechTranscriptRef.current, interim);\n };\n recognition.onerror = (event: any) => {\n if (event?.error === \"no-speech\" || event?.error === \"aborted\") return;\n failWith(\n event?.error === \"not-allowed\"\n ? \"Microphone permission denied. Enable it in your browser settings.\"\n : `Speech recognition error: ${event?.error ?? \"unknown\"}`,\n );\n };\n recognition.onend = () => {\n const text = speechTranscriptRef.current.trim();\n const wasCancelled = cancelledRef.current;\n cancelledRef.current = false;\n teardown();\n if (!wasCancelled && text) onTranscriptRef.current?.(text);\n setState(\"idle\");\n };\n\n startTimer();\n setState(\"recording\");\n recognition.start();\n }, [startMeter, startTimer, teardown, failWith]);\n\n const startGoogleRealtime = useCallback(async () => {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n if (cancelledRef.current) {\n for (const track of stream.getTracks()) track.stop();\n cancelledRef.current = false;\n setState(\"idle\");\n return;\n }\n\n const sessionRes = await fetch(GOOGLE_REALTIME_SESSION_URL, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n language:\n (typeof navigator !== \"undefined\" && navigator.language) || \"en-US\",\n }),\n });\n const sessionBody = (await sessionRes\n .json()\n .catch(() => ({ error: `HTTP ${sessionRes.status}` }))) as {\n websocketUrl?: string;\n websocketProtocol?: string;\n sessionToken?: string;\n error?: string;\n };\n if (\n !sessionRes.ok ||\n !sessionBody.websocketUrl ||\n !sessionBody.sessionToken\n ) {\n for (const track of stream.getTracks()) track.stop();\n throw new Error(\n sessionBody.error ||\n `Could not start Google realtime transcription (${sessionRes.status})`,\n );\n }\n if (cancelledRef.current) {\n for (const track of stream.getTracks()) track.stop();\n cancelledRef.current = false;\n setState(\"idle\");\n return;\n }\n\n mediaStreamRef.current = stream;\n const mimeType = pickMimeType();\n const recorder = new MediaRecorder(stream, { mimeType });\n mediaRecorderRef.current = recorder;\n realtimeFinalRef.current = \"\";\n realtimeInterimRef.current = \"\";\n\n let finalized = false;\n let recorderStarted = false;\n const finish = (errorMessage?: string) => {\n if (finalized) return;\n finalized = true;\n const finalText = realtimeFinalRef.current.trim();\n const interimText = realtimeInterimRef.current.trim();\n const text = [finalText, interimText].filter(Boolean).join(\" \").trim();\n teardown();\n if (cancelledRef.current) {\n cancelledRef.current = false;\n setState(\"idle\");\n return;\n }\n if (text) {\n onTranscriptRef.current?.(text);\n setState(\"idle\");\n return;\n }\n if (errorMessage) {\n failWith(errorMessage);\n return;\n }\n setState(\"idle\");\n };\n\n recorder.ondataavailable = async (event) => {\n if (!event.data || event.data.size === 0) return;\n const socket = realtimeSocketRef.current;\n if (!socket || socket.readyState !== WebSocket.OPEN) return;\n try {\n socket.send(await event.data.arrayBuffer());\n } catch (err) {\n finish((err as Error)?.message ?? \"Realtime audio upload failed\");\n }\n };\n\n recorder.onstop = () => {\n const socket = realtimeSocketRef.current;\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n finish();\n return;\n }\n setState(\"transcribing\");\n try {\n socket.send(JSON.stringify({ type: \"stop\" }));\n } catch {\n finish();\n return;\n }\n realtimeStopTimeoutRef.current = window.setTimeout(() => {\n const activeSocket = realtimeSocketRef.current;\n if (activeSocket?.readyState === WebSocket.OPEN) {\n try {\n activeSocket.close();\n } catch {\n finish();\n }\n return;\n }\n finish();\n }, 10000);\n };\n\n const socket = new WebSocket(sessionBody.websocketUrl, [\n sessionBody.websocketProtocol || GOOGLE_REALTIME_WS_PROTOCOL,\n sessionBody.sessionToken,\n ]);\n socket.binaryType = \"arraybuffer\";\n realtimeSocketRef.current = socket;\n\n socket.onmessage = (event) => {\n if (cancelledRef.current) {\n finish();\n return;\n }\n const raw =\n typeof event.data === \"string\"\n ? event.data\n : event.data instanceof Blob\n ? null\n : new TextDecoder().decode(event.data);\n if (!raw) return;\n let message:\n | {\n type?: string;\n text?: string;\n error?: string;\n }\n | undefined;\n try {\n message = JSON.parse(raw);\n } catch {\n return;\n }\n if (!message?.type) return;\n if (message.type === \"ready\") {\n if (!recorderStarted) {\n recorderStarted = true;\n startMeter(stream);\n startTimer();\n setState(\"recording\");\n recorder.start(100);\n }\n return;\n }\n if (message.type === \"partial\") {\n realtimeInterimRef.current = (message.text ?? \"\").trim();\n onLiveUpdateRef.current?.(\n realtimeFinalRef.current,\n realtimeInterimRef.current,\n );\n return;\n }\n if (message.type === \"final\") {\n const next = (message.text ?? \"\").trim();\n if (next) {\n realtimeFinalRef.current = [realtimeFinalRef.current.trim(), next]\n .filter(Boolean)\n .join(\" \");\n }\n realtimeInterimRef.current = \"\";\n onLiveUpdateRef.current?.(realtimeFinalRef.current, \"\");\n return;\n }\n if (message.type === \"error\") {\n finish(message.error || \"Google realtime transcription failed\");\n return;\n }\n if (message.type === \"end\") {\n finish();\n }\n };\n\n socket.onerror = () => {\n finish(\"Google realtime transcription connection failed\");\n };\n\n socket.onclose = () => {\n finish();\n };\n\n socket.onopen = () => {\n if (cancelledRef.current) {\n finish();\n return;\n }\n try {\n socket.send(\n JSON.stringify({\n type: \"start\",\n language:\n (typeof navigator !== \"undefined\" && navigator.language) ||\n \"en-US\",\n interimResults: true,\n mimeType,\n }),\n );\n } catch (err) {\n finish((err as Error)?.message ?? \"Could not start realtime stream\");\n }\n };\n }, [startMeter, startTimer, teardown, failWith]);\n\n const start = useCallback(async () => {\n if (state === \"recording\" || state === \"starting\") return;\n setErrorMessage(null);\n setState(\"starting\");\n cancelledRef.current = false;\n\n const prefs = await readVoicePrefs();\n const pref = prefs.provider;\n setProvider(pref);\n\n // Server providers all use the same client-side flow as \"openai\"\n // (MediaRecorder -> POST to /_agent-native/transcribe-voice).\n // The server route handles routing to the right backend.\n const resolvedProvider: VoiceProvider =\n pref === \"auto\" ||\n pref === \"builder\" ||\n pref === \"builder-gemini\" ||\n pref === \"gemini\" ||\n pref === \"groq\"\n ? \"openai\"\n : pref;\n activeProviderRef.current = resolvedProvider;\n\n try {\n if (resolvedProvider === \"openai\") {\n if (!mediaRecorderSupported) {\n throw new Error(\n \"Your browser doesn't support audio recording. Use the browser provider in Settings → Voice Transcription.\",\n );\n }\n await startOpenAi(pref, prefs.instructions);\n } else if (resolvedProvider === \"google-realtime\") {\n if (!mediaRecorderSupported) {\n throw new Error(\n \"Your browser doesn't support audio recording, so Google realtime transcription can't start.\",\n );\n }\n await startGoogleRealtime();\n } else {\n await startBrowser();\n }\n } catch (err) {\n if (cancelledRef.current) {\n cancelledRef.current = false;\n teardown();\n setState(\"idle\");\n return;\n }\n const message =\n (err as Error)?.name === \"NotAllowedError\"\n ? \"Microphone permission denied. Enable it in your browser settings.\"\n : ((err as Error)?.message ?? \"Could not start recording\");\n failWith(message);\n }\n }, [\n state,\n mediaRecorderSupported,\n startOpenAi,\n startGoogleRealtime,\n startBrowser,\n failWith,\n ]);\n\n const stop = useCallback(() => {\n if (state !== \"recording\") return;\n cancelledRef.current = false;\n if (\n (activeProviderRef.current === \"openai\" ||\n activeProviderRef.current === \"google-realtime\") &&\n mediaRecorderRef.current\n ) {\n try {\n mediaRecorderRef.current.stop();\n } catch {\n teardown();\n setState(\"idle\");\n }\n } else if (speechRef.current) {\n try {\n speechRef.current.stop();\n } catch {\n teardown();\n setState(\"idle\");\n }\n } else {\n teardown();\n setState(\"idle\");\n }\n }, [state, teardown]);\n\n const cancel = useCallback(() => {\n if (state !== \"recording\" && state !== \"starting\") return;\n cancelledRef.current = true;\n if (\n (activeProviderRef.current === \"openai\" ||\n activeProviderRef.current === \"google-realtime\") &&\n mediaRecorderRef.current\n ) {\n try {\n mediaRecorderRef.current.stop();\n } catch {\n /* ignore */\n }\n } else if (speechRef.current) {\n try {\n speechRef.current.abort?.();\n } catch {\n /* ignore */\n }\n }\n teardown();\n setState(\"idle\");\n }, [state, teardown]);\n\n // Auto-dismiss error after 8s so a stale \"permission denied\" message doesn't\n // sit forever after the user fixes the underlying permission. Manual dismiss\n // (via dismissError) and click-to-retry both also clear the error sooner.\n useEffect(() => {\n if (state !== \"error\") return;\n const handle = setTimeout(() => {\n setErrorMessage(null);\n setState(\"idle\");\n }, 8000);\n return () => clearTimeout(handle);\n }, [state]);\n\n const dismissError = useCallback(() => {\n setErrorMessage(null);\n if (state === \"error\") setState(\"idle\");\n }, [state]);\n\n return {\n state,\n amplitude,\n durationMs,\n errorMessage,\n provider,\n supported,\n start,\n stop,\n cancel,\n dismissError,\n };\n}\n"]}
|
package/dist/client/index.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
export { sendToAgentChat, generateTabId, type AgentChatMessage, } from "./agent-chat.js";
|
|
2
|
-
export { DEV_MODE_USER_EMAIL } from "./dev-mode.js";
|
|
3
2
|
export { useAgentChatGenerating } from "./use-agent-chat.js";
|
|
4
3
|
export { useDevMode } from "./use-dev-mode.js";
|
|
5
4
|
export { agentNativePath, appApiPath, appBasePath, appPath, } from "./api-path.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,eAAe,EACf,aAAa,EACb,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
|
package/dist/client/index.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { installRouteChunkRecovery } from "./route-chunk-recovery.js";
|
|
2
2
|
installRouteChunkRecovery();
|
|
3
3
|
export { sendToAgentChat, generateTabId, } from "./agent-chat.js";
|
|
4
|
-
export { DEV_MODE_USER_EMAIL } from "./dev-mode.js";
|
|
5
4
|
export { useAgentChatGenerating } from "./use-agent-chat.js";
|
|
6
5
|
export { useDevMode } from "./use-dev-mode.js";
|
|
7
6
|
export { agentNativePath, appApiPath, appBasePath, appPath, } from "./api-path.js";
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,yBAAyB,EAAE,CAAC;AAE5B,OAAO,EACL,eAAe,EACf,aAAa,GAEd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { installRouteChunkRecovery } from \"./route-chunk-recovery.js\";\n\ninstallRouteChunkRecovery();\n\nexport {\n sendToAgentChat,\n generateTabId,\n type AgentChatMessage,\n} from \"./agent-chat.js\";\nexport { useAgentChatGenerating } from \"./use-agent-chat.js\";\nexport { useDevMode } from \"./use-dev-mode.js\";\nexport {\n agentNativePath,\n appApiPath,\n appBasePath,\n appPath,\n} from \"./api-path.js\";\nexport { useSendToAgentChat } from \"./use-send-to-agent-chat.js\";\nexport {\n useChatModels,\n type UseChatModelsResult,\n type EngineModelGroup,\n} from \"./use-chat-models.js\";\nexport {\n CodeRequiredDialog,\n type CodeRequiredDialogProps,\n} from \"./components/CodeRequiredDialog.js\";\nexport {\n CodeAgentIndicator,\n type CodeAgentIndicatorProps,\n} from \"./components/CodeAgentIndicator.js\";\nexport {\n useDbSync,\n useFileWatcher,\n useScreenRefreshKey,\n} from \"./use-db-sync.js\";\nexport { cn } from \"./utils.js\";\nexport { ApiKeySettings } from \"./components/ApiKeySettings.js\";\nexport { useSession, type AuthSession } from \"./use-session.js\";\nexport {\n sendToFrame,\n onFrameMessage,\n requestUserInfo,\n getFrameOrigin,\n getCallbackOrigin,\n isInFrame,\n enterStyleEditing,\n enterTextEditing,\n exitSelectionMode,\n type UserInfo,\n} from \"./frame.js\";\nexport {\n getBuilderParentOrigin,\n isInBuilderFrame,\n sendToBuilderChat,\n type BuilderChatMessage,\n} from \"./builder-frame.js\";\nexport {\n NewWorkspaceAppFlow,\n type NewWorkspaceAppFlowProps,\n type VaultSecretOption,\n} from \"./NewWorkspaceAppFlow.js\";\nexport {\n AssistantChat,\n clearChatStorage,\n type AssistantChatProps,\n type AssistantChatHandle,\n} from \"./AssistantChat.js\";\nexport {\n MultiTabAssistantChat,\n type MultiTabAssistantChatProps,\n type MultiTabAssistantChatHeaderProps,\n} from \"./MultiTabAssistantChat.js\";\nexport { createAgentChatAdapter } from \"./agent-chat-adapter.js\";\nexport {\n PromptComposer,\n type PromptComposerProps,\n type PromptComposerFile,\n} from \"./composer/PromptComposer.js\";\nexport {\n useChatThreads,\n type ChatThreadSummary,\n type ChatThreadData,\n} from \"./use-chat-threads.js\";\nexport {\n AgentPanel,\n AgentSidebar,\n AgentToggleButton,\n focusAgentChat,\n type AgentPanelProps,\n type AgentSidebarProps,\n} from \"./AgentPanel.js\";\n// Deprecated — use AgentSidebar + AgentToggleButton instead\nexport {\n ProductionAgentPanel,\n type ProductionAgentPanelProps,\n} from \"./ProductionAgentPanel.js\";\nexport {\n useProductionAgent,\n type ProductionAgentMessage,\n type UseProductionAgentOptions,\n type UseProductionAgentResult,\n} from \"./useProductionAgent.js\";\nexport { Turnstile, type TurnstileProps } from \"./Turnstile.js\";\nexport {\n OpenSourceBadge,\n PoweredByBadge,\n type OpenSourceBadgeProps,\n type PoweredByBadgeProps,\n} from \"./PoweredByBadge.js\";\nexport { FeedbackButton, type FeedbackButtonProps } from \"./FeedbackButton.js\";\nexport { ErrorBoundary } from \"./ErrorBoundary.js\";\nexport { installRouteChunkRecovery } from \"./route-chunk-recovery.js\";\nexport { ClientOnly } from \"./ClientOnly.js\";\nexport { DefaultSpinner } from \"./DefaultSpinner.js\";\nexport { AgentTerminal, type AgentTerminalProps } from \"./terminal/index.js\";\nexport {\n trackEvent,\n trackSessionStatus,\n configureTracking,\n} from \"./analytics.js\";\nexport {\n useCollaborativeDoc,\n emailToColor,\n emailToName,\n type UseCollaborativeDocOptions,\n type UseCollaborativeDocResult,\n type CollabUser,\n} from \"../collab/client.js\";\nexport {\n ResourcesPanel,\n ResourceTree,\n ResourceEditor,\n useResources,\n useResourceTree,\n useResource,\n useCreateResource,\n useUpdateResource,\n useDeleteResource,\n useUploadResource,\n type Resource,\n type ResourceMeta,\n type TreeNode,\n type ResourceScope,\n type ResourceTreeProps,\n type ResourceEditorProps,\n} from \"./resources/index.js\";\nexport type {\n AppToFrameMessage,\n FrameToAppMessage,\n FrameMessage,\n CodeCompleteMessage,\n ChatRunningMessage,\n} from \"./frame-protocol.js\";\nexport {\n CommandMenu,\n useCommandMenuShortcut,\n openAgentSidebar,\n submitToAgent,\n type CommandMenuProps,\n type CommandGroupProps,\n type CommandItemProps,\n type CommandShortcutProps,\n} from \"./CommandMenu.js\";\nexport {\n DevOverlay,\n useDevOverlayShortcut,\n registerDevPanel,\n unregisterDevPanel,\n listDevPanels,\n subscribeDevPanels,\n useDevOption,\n clearAllDevOverlayStorage,\n devOptionKey,\n DEV_OVERLAY_STORAGE_PREFIX,\n type DevOverlayProps,\n type DevPanel,\n type DevOption,\n type DevBooleanOption,\n type DevSelectOption,\n type DevStringOption,\n type DevActionOption,\n type DevOptionValue,\n} from \"./dev-overlay/index.js\";\nexport {\n useActionQuery,\n useActionMutation,\n type ActionRegistry,\n} from \"./use-action.js\";\nexport {\n ShareButton,\n ShareDialog,\n VisibilityBadge,\n type ShareButtonProps,\n type ShareDialogProps,\n type VisibilityBadgeProps,\n} from \"./sharing/index.js\";\nexport {\n postNavigate,\n isInAgentEmbed,\n AGENT_NAVIGATE_MESSAGE_TYPE,\n type AgentNavigateMessage,\n} from \"./embed.js\";\nexport { IframeEmbed, parseEmbedBody } from \"./IframeEmbed.js\";\nexport {\n useAvatarUrl,\n uploadAvatar,\n invalidateAvatarCache,\n} from \"./use-avatar.js\";\nexport {\n ObservabilityDashboard,\n ThumbsFeedback,\n} from \"./observability/index.js\";\n// Presence UI components\nexport {\n PresenceBar,\n type PresenceBarProps,\n} from \"./components/PresenceBar.js\";\nexport {\n AgentPresenceChip,\n type AgentPresenceChipProps,\n} from \"./components/AgentPresenceChip.js\";\n// Structured data collaboration hooks\nexport {\n useCollaborativeMap,\n useCollaborativeArray,\n type UseCollaborativeMapOptions,\n type UseCollaborativeMapResult,\n type UseCollaborativeArrayOptions,\n type UseCollaborativeArrayResult,\n} from \"../collab/client-struct.js\";\nexport { NotificationsBell } from \"./notifications/index.js\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IntegrationCard.d.ts","sourceRoot":"","sources":["../../../src/client/integrations/IntegrationCard.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AA0BnE,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,SAAS,GACV,EAAE;IACD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB,
|
|
1
|
+
{"version":3,"file":"IntegrationCard.d.ts","sourceRoot":"","sources":["../../../src/client/integrations/IntegrationCard.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AA0BnE,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,SAAS,GACV,EAAE;IACD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB,2CA2HA"}
|
|
@@ -20,20 +20,32 @@ export function IntegrationCard({ status, onRefresh, }) {
|
|
|
20
20
|
const [expanded, setExpanded] = useState(false);
|
|
21
21
|
const [toggling, setToggling] = useState(false);
|
|
22
22
|
const [copied, setCopied] = useState(false);
|
|
23
|
+
const [toggleError, setToggleError] = useState(null);
|
|
23
24
|
const Icon = platformIcons[status.platform] || IconMessageCircle;
|
|
24
25
|
const handleToggle = useCallback(async () => {
|
|
25
26
|
setToggling(true);
|
|
27
|
+
setToggleError(null);
|
|
26
28
|
try {
|
|
27
29
|
const action = status.enabled ? "disable" : "enable";
|
|
28
30
|
const res = await fetch(agentNativePath(`/_agent-native/integrations/${status.platform}/${action}`), { method: "POST" });
|
|
29
31
|
if (res.ok) {
|
|
30
32
|
onRefresh();
|
|
33
|
+
return;
|
|
31
34
|
}
|
|
35
|
+
const data = (await res.json().catch(() => null));
|
|
36
|
+
setToggleError(data?.error ||
|
|
37
|
+
res.statusText ||
|
|
38
|
+
`Couldn't ${action} ${status.label} (HTTP ${res.status})`);
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
setToggleError(err instanceof Error
|
|
42
|
+
? err.message
|
|
43
|
+
: "Network error reaching the server");
|
|
32
44
|
}
|
|
33
45
|
finally {
|
|
34
46
|
setToggling(false);
|
|
35
47
|
}
|
|
36
|
-
}, [status.platform, status.enabled, onRefresh]);
|
|
48
|
+
}, [status.platform, status.enabled, status.label, onRefresh]);
|
|
37
49
|
const handleCopy = useCallback(async () => {
|
|
38
50
|
if (!status.webhookUrl)
|
|
39
51
|
return;
|
|
@@ -41,6 +53,6 @@ export function IntegrationCard({ status, onRefresh, }) {
|
|
|
41
53
|
setCopied(true);
|
|
42
54
|
setTimeout(() => setCopied(false), 2000);
|
|
43
55
|
}, [status.webhookUrl]);
|
|
44
|
-
return (_jsxs("div", { className: "rounded-md border border-border bg-background", children: [_jsxs("button", { onClick: () => setExpanded(!expanded), className: "flex w-full items-center gap-2 px-2.5 py-2 text-left hover:bg-accent/50", children: [expanded ? (_jsx(IconChevronDown, { size: 12, className: "text-muted-foreground shrink-0" })) : (_jsx(IconChevronRight, { size: 12, className: "text-muted-foreground shrink-0" })), _jsx(Icon, { size: 16, className: "text-muted-foreground shrink-0" }), _jsx("span", { className: "flex-1 text-xs font-medium text-foreground", children: status.label }), _jsx(StatusDot, { enabled: status.enabled, configured: status.configured })] }), expanded && (_jsxs("div", { className: "border-t border-border px-2.5 py-2 space-y-2", children: [status.webhookUrl && (_jsxs("div", { children: [_jsx("div", { className: "text-[10px] font-medium text-muted-foreground mb-1", children: "Webhook URL" }), _jsxs("div", { className: "flex items-center gap-1", children: [_jsx("code", { className: "flex-1 truncate rounded bg-muted px-1.5 py-0.5 text-[10px] text-foreground", children: status.webhookUrl }), _jsx("button", { onClick: handleCopy, className: "shrink-0 rounded p-0.5 text-muted-foreground hover:text-foreground hover:bg-accent/50", title: "Copy webhook URL", children: copied ? _jsx(IconCheck, { size: 12 }) : _jsx(IconCopy, { size: 12 }) })] })] })), status.error && (_jsx("p", { className: "text-[10px] text-destructive", children: status.error })), !status.configured && !status.error && (_jsx("p", { className: "text-[10px] text-muted-foreground", children: "Not configured. Set the required secrets to enable this integration." })), status.configured && (_jsx("button", { onClick: handleToggle, disabled: toggling, className: "w-full rounded-md border border-border px-2 py-1 text-[11px] font-medium text-foreground hover:bg-accent/50 disabled:opacity-50", children: toggling ? "..." : status.enabled ? "Disable" : "Enable" }))] }))] }));
|
|
56
|
+
return (_jsxs("div", { className: "rounded-md border border-border bg-background", children: [_jsxs("button", { onClick: () => setExpanded(!expanded), className: "flex w-full items-center gap-2 px-2.5 py-2 text-left hover:bg-accent/50", children: [expanded ? (_jsx(IconChevronDown, { size: 12, className: "text-muted-foreground shrink-0" })) : (_jsx(IconChevronRight, { size: 12, className: "text-muted-foreground shrink-0" })), _jsx(Icon, { size: 16, className: "text-muted-foreground shrink-0" }), _jsx("span", { className: "flex-1 text-xs font-medium text-foreground", children: status.label }), _jsx(StatusDot, { enabled: status.enabled, configured: status.configured })] }), expanded && (_jsxs("div", { className: "border-t border-border px-2.5 py-2 space-y-2", children: [status.webhookUrl && (_jsxs("div", { children: [_jsx("div", { className: "text-[10px] font-medium text-muted-foreground mb-1", children: "Webhook URL" }), _jsxs("div", { className: "flex items-center gap-1", children: [_jsx("code", { className: "flex-1 truncate rounded bg-muted px-1.5 py-0.5 text-[10px] text-foreground", children: status.webhookUrl }), _jsx("button", { onClick: handleCopy, className: "shrink-0 rounded p-0.5 text-muted-foreground hover:text-foreground hover:bg-accent/50", title: "Copy webhook URL", children: copied ? _jsx(IconCheck, { size: 12 }) : _jsx(IconCopy, { size: 12 }) })] })] })), status.error && (_jsx("p", { className: "text-[10px] text-destructive", children: status.error })), toggleError && (_jsx("p", { className: "text-[10px] text-destructive", children: toggleError })), !status.configured && !status.error && (_jsx("p", { className: "text-[10px] text-muted-foreground", children: "Not configured. Set the required secrets to enable this integration." })), status.configured && (_jsx("button", { onClick: handleToggle, disabled: toggling, className: "w-full rounded-md border border-border px-2 py-1 text-[11px] font-medium text-foreground hover:bg-accent/50 disabled:opacity-50", children: toggling ? "..." : status.enabled ? "Disable" : "Enable" }))] }))] }));
|
|
45
57
|
}
|
|
46
58
|
//# sourceMappingURL=IntegrationCard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IntegrationCard.js","sourceRoot":"","sources":["../../../src/client/integrations/IntegrationCard.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,QAAQ,EACR,SAAS,GACV,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,8DAA8D;AAC9D,MAAM,aAAa,GAA6C;IAC9D,KAAK,EAAE,cAA0C;IACjD,QAAQ,EAAE,iBAA6C;IACvD,QAAQ,EAAE,iBAA6C;CACxD,CAAC;AAEF,SAAS,SAAS,CAAC,EACjB,OAAO,EACP,UAAU,GAIX;IACC,MAAM,KAAK,GACT,OAAO,IAAI,UAAU;QACnB,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,UAAU;YACV,CAAC,CAAC,eAAe;YACjB,CAAC,CAAC,aAAa,CAAC;IACtB,OAAO,eAAM,SAAS,EAAE,qCAAqC,KAAK,EAAE,GAAI,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAC9B,MAAM,EACN,SAAS,GAIV;IACC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"IntegrationCard.js","sourceRoot":"","sources":["../../../src/client/integrations/IntegrationCard.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useCallback } from \"react\";\nimport {\n IconBrandSlack,\n IconBrandTelegram,\n IconBrandWhatsapp,\n IconMessageCircle,\n IconChevronDown,\n IconChevronRight,\n IconCopy,\n IconCheck,\n} from \"@tabler/icons-react\";\nimport type { IntegrationStatus } from \"./useIntegrationStatus.js\";\nimport { agentNativePath } from \"../api-path.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst platformIcons: Record<string, React.ComponentType<any>> = {\n slack: IconBrandSlack as React.ComponentType<any>,\n telegram: IconBrandTelegram as React.ComponentType<any>,\n whatsapp: IconBrandWhatsapp as React.ComponentType<any>,\n};\n\nfunction StatusDot({\n enabled,\n configured,\n}: {\n enabled: boolean;\n configured: boolean;\n}) {\n const color =\n enabled && configured\n ? \"bg-green-500\"\n : configured\n ? \"bg-yellow-500\"\n : \"bg-gray-400\";\n return <span className={`inline-block h-2 w-2 rounded-full ${color}`} />;\n}\n\nexport function IntegrationCard({\n status,\n onRefresh,\n}: {\n status: IntegrationStatus;\n onRefresh: () => void;\n}) {\n const [expanded, setExpanded] = useState(false);\n const [toggling, setToggling] = useState(false);\n const [copied, setCopied] = useState(false);\n const [toggleError, setToggleError] = useState<string | null>(null);\n\n const Icon = platformIcons[status.platform] || IconMessageCircle;\n\n const handleToggle = useCallback(async () => {\n setToggling(true);\n setToggleError(null);\n try {\n const action = status.enabled ? \"disable\" : \"enable\";\n const res = await fetch(\n agentNativePath(\n `/_agent-native/integrations/${status.platform}/${action}`,\n ),\n { method: \"POST\" },\n );\n if (res.ok) {\n onRefresh();\n return;\n }\n const data = (await res.json().catch(() => null)) as {\n error?: string;\n } | null;\n setToggleError(\n data?.error ||\n res.statusText ||\n `Couldn't ${action} ${status.label} (HTTP ${res.status})`,\n );\n } catch (err) {\n setToggleError(\n err instanceof Error\n ? err.message\n : \"Network error reaching the server\",\n );\n } finally {\n setToggling(false);\n }\n }, [status.platform, status.enabled, status.label, onRefresh]);\n\n const handleCopy = useCallback(async () => {\n if (!status.webhookUrl) return;\n await navigator.clipboard.writeText(status.webhookUrl);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [status.webhookUrl]);\n\n return (\n <div className=\"rounded-md border border-border bg-background\">\n <button\n onClick={() => setExpanded(!expanded)}\n className=\"flex w-full items-center gap-2 px-2.5 py-2 text-left hover:bg-accent/50\"\n >\n {expanded ? (\n <IconChevronDown\n size={12}\n className=\"text-muted-foreground shrink-0\"\n />\n ) : (\n <IconChevronRight\n size={12}\n className=\"text-muted-foreground shrink-0\"\n />\n )}\n <Icon size={16} className=\"text-muted-foreground shrink-0\" />\n <span className=\"flex-1 text-xs font-medium text-foreground\">\n {status.label}\n </span>\n <StatusDot enabled={status.enabled} configured={status.configured} />\n </button>\n\n {expanded && (\n <div className=\"border-t border-border px-2.5 py-2 space-y-2\">\n {status.webhookUrl && (\n <div>\n <div className=\"text-[10px] font-medium text-muted-foreground mb-1\">\n Webhook URL\n </div>\n <div className=\"flex items-center gap-1\">\n <code className=\"flex-1 truncate rounded bg-muted px-1.5 py-0.5 text-[10px] text-foreground\">\n {status.webhookUrl}\n </code>\n <button\n onClick={handleCopy}\n className=\"shrink-0 rounded p-0.5 text-muted-foreground hover:text-foreground hover:bg-accent/50\"\n title=\"Copy webhook URL\"\n >\n {copied ? <IconCheck size={12} /> : <IconCopy size={12} />}\n </button>\n </div>\n </div>\n )}\n\n {status.error && (\n <p className=\"text-[10px] text-destructive\">{status.error}</p>\n )}\n\n {toggleError && (\n <p className=\"text-[10px] text-destructive\">{toggleError}</p>\n )}\n\n {!status.configured && !status.error && (\n <p className=\"text-[10px] text-muted-foreground\">\n Not configured. Set the required secrets to enable this\n integration.\n </p>\n )}\n\n {status.configured && (\n <button\n onClick={handleToggle}\n disabled={toggling}\n className=\"w-full rounded-md border border-border px-2 py-1 text-[11px] font-medium text-foreground hover:bg-accent/50 disabled:opacity-50\"\n >\n {toggling ? \"...\" : status.enabled ? \"Disable\" : \"Enable\"}\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IntegrationsPanel.d.ts","sourceRoot":"","sources":["../../../src/client/integrations/IntegrationsPanel.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"IntegrationsPanel.d.ts","sourceRoot":"","sources":["../../../src/client/integrations/IntegrationsPanel.tsx"],"names":[],"mappings":"AA2YA,wBAAgB,iBAAiB,4CA4IhC"}
|