@agent-native/core 0.118.0 → 0.119.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +32 -0
- package/corpus/core/docs/content/a2a-protocol.mdx +15 -0
- package/corpus/core/docs/content/template-chat.mdx +1 -1
- package/corpus/core/docs/content/template-plan.mdx +3 -3
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/a2a/activity.ts +371 -0
- package/corpus/core/src/a2a/client.ts +35 -11
- package/corpus/core/src/a2a/index.ts +21 -0
- package/corpus/core/src/a2a/types.ts +8 -0
- package/corpus/core/src/agent/model-config.ts +19 -23
- package/corpus/core/src/agent/production-agent.ts +167 -100
- package/corpus/core/src/agent/types.ts +16 -1
- package/corpus/core/src/cli/index.ts +18 -10
- package/corpus/core/src/cli/multi-frontier-runs.ts +5 -3
- package/corpus/core/src/cli/templates-meta.ts +0 -12
- package/corpus/core/src/cli/workspace-dev.ts +1 -1
- package/corpus/core/src/client/AgentPanel.tsx +9 -1
- package/corpus/core/src/client/RunStuckBanner.tsx +39 -47
- package/corpus/core/src/client/chat/action-chat-ui-surface.tsx +32 -0
- package/corpus/core/src/client/chat/message-components.tsx +53 -8
- package/corpus/core/src/client/chat/tool-call-display.tsx +214 -44
- package/corpus/core/src/client/chat/widgets/InlineExtensionWidget.tsx +0 -1
- package/corpus/core/src/client/chat/widgets/builtin-tool-renderers.tsx +7 -3
- package/corpus/core/src/client/chat-model-groups.ts +67 -27
- package/corpus/core/src/client/conversation/AgentConversation.tsx +12 -1
- package/corpus/core/src/client/error-capture.ts +2 -6
- package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +20 -14
- package/corpus/core/src/client/resources/ResourcesPanel.tsx +5 -1
- package/corpus/core/src/client/resources/mcp-integration-catalog.ts +7 -17
- package/corpus/core/src/client/resources/mcp-integration-logos.ts +2 -2
- package/corpus/core/src/client/route-chunk-recovery.ts +5 -3
- package/corpus/core/src/client/session-replay.ts +3 -3
- package/corpus/core/src/client/settings/SettingsPanel.tsx +15 -6
- package/corpus/core/src/client/sharing/ShareButton.tsx +1 -27
- package/corpus/core/src/client/sharing/ShareDialog.tsx +0 -16
- package/corpus/core/src/client/sharing/useShareButtonController.ts +0 -7
- package/corpus/core/src/client/sharing/useShareDialogController.ts +0 -2
- package/corpus/core/src/client/sse-event-processor.ts +85 -1
- package/corpus/core/src/client/transcription/use-live-transcription.ts +64 -45
- package/corpus/core/src/deploy/build.ts +2 -1
- package/corpus/core/src/guards/db-tool-scoping.ts +1 -1
- package/corpus/core/src/integrations/adapters/slack.ts +84 -5
- package/corpus/core/src/integrations/index.ts +5 -1
- package/corpus/core/src/localization/default-messages.ts +7 -1
- package/corpus/core/src/mcp-client/oauth-routes.ts +45 -12
- package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +1 -18
- package/corpus/core/src/scripts/call-agent.ts +49 -6
- package/corpus/core/src/server/agent-chat-plugin.ts +50 -10
- package/corpus/core/src/server/realtime-voice.ts +4 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +16 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
- package/corpus/core/src/terminal/cli-registry.ts +1 -1
- package/corpus/core/src/vite/client.ts +166 -1
- package/corpus/templates/analytics/app/hooks/use-dashboard-views.ts +13 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewsMenu.tsx +10 -0
- package/corpus/templates/analytics/changelog/2026-07-22-show-a-useful-error-when-saving-a-dashboard-view-fails.md +6 -0
- package/corpus/templates/brain/app/routes/sources.tsx +181 -114
- package/corpus/templates/clips/AGENTS.md +8 -6
- package/corpus/templates/clips/actions/request-transcript.ts +90 -420
- package/corpus/templates/clips/actions/save-browser-transcript.ts +11 -28
- package/corpus/templates/clips/app/components/capture-install-options.tsx +5 -3
- package/corpus/templates/clips/app/components/player/transcript-panel.tsx +3 -136
- package/corpus/templates/clips/app/lib/capture-install-options.ts +15 -4
- package/corpus/templates/clips/app/routes/download.tsx +3 -2
- package/corpus/templates/clips/changelog/2026-07-22-fixed-an-intermittent-hydration-error-on-the-download-page.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-22-fixed-transcript-generation-when-native-speech-capture-retur.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-22-transcript-generation-now-retries-with-backup-speech-recogni.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-23-fixed-recordings-failing-to-save-with-a-cancelled-or-cleanup.md +6 -0
- package/corpus/templates/clips/server/lib/public-agent-context.ts +2 -2
- package/corpus/templates/clips/server/plugins/db.ts +9 -1
- package/corpus/templates/clips/server/register-secrets.ts +7 -6
- package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +16 -84
- package/corpus/templates/content/app/components/editor/VisualEditor.tsx +13 -7
- package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +2 -2
- package/corpus/templates/content/app/i18n-data.ts +10 -0
- package/corpus/templates/design/server/lib/fig-file-decoder.ts +1 -0
- package/corpus/templates/plan/app/entry.client.tsx +3 -0
- package/corpus/templates/plan/changelog/2026-07-22-recover-stale-pages-after-a-deployment-refresh-automatically.md +6 -0
- package/corpus/templates/slides/app/hooks/use-agent-generating.ts +10 -3
- package/corpus/templates/slides/app/pages/Index.tsx +1 -0
- package/corpus/templates/slides/changelog/2026-07-22-new-deck-prompts-now-open-in-their-own-visible-chat-thread.md +6 -0
- package/corpus/toolkit/CHANGELOG.md +9 -0
- package/corpus/toolkit/package.json +1 -1
- package/corpus/toolkit/src/composer/PromptComposer.tsx +5 -1
- package/corpus/toolkit/src/composer/RealtimeVoiceMode.tsx +119 -31
- package/corpus/toolkit/src/composer/useRealtimeVoiceMode.tsx +30 -0
- package/corpus/toolkit/src/conformance/runner.tsx +153 -1
- package/corpus/toolkit/src/editor/SharedRichEditor.tsx +13 -2
- package/corpus/toolkit/src/editor/SlashCommandMenu.tsx +20 -0
- package/corpus/toolkit/src/editor/index.ts +2 -0
- package/corpus/toolkit/src/styles.css +52 -23
- package/dist/a2a/activity.d.ts +50 -0
- package/dist/a2a/activity.d.ts.map +1 -0
- package/dist/a2a/activity.js +236 -0
- package/dist/a2a/activity.js.map +1 -0
- package/dist/a2a/client.d.ts +5 -1
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +18 -13
- package/dist/a2a/client.js.map +1 -1
- package/dist/a2a/index.d.ts +2 -1
- package/dist/a2a/index.d.ts.map +1 -1
- package/dist/a2a/index.js +1 -0
- package/dist/a2a/index.js.map +1 -1
- package/dist/a2a/types.d.ts +1 -0
- package/dist/a2a/types.d.ts.map +1 -1
- package/dist/a2a/types.js.map +1 -1
- package/dist/agent/engine/anthropic-engine.d.ts +1 -1
- package/dist/agent/engine/builder-engine.d.ts +2 -2
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/model-config.d.ts +16 -16
- package/dist/agent/model-config.d.ts.map +1 -1
- package/dist/agent/model-config.js +19 -23
- package/dist/agent/model-config.js.map +1 -1
- package/dist/agent/production-agent.d.ts +26 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +137 -80
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/types.d.ts +10 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/cli/index.js +18 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/multi-frontier-runs.js +3 -3
- package/dist/cli/multi-frontier-runs.js.map +1 -1
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +0 -12
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/cli/workspace-dev.js +1 -1
- package/dist/cli/workspace-dev.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +4 -1
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/RunStuckBanner.d.ts +3 -5
- package/dist/client/RunStuckBanner.d.ts.map +1 -1
- package/dist/client/RunStuckBanner.js +17 -18
- package/dist/client/RunStuckBanner.js.map +1 -1
- package/dist/client/chat/action-chat-ui-surface.d.ts +8 -0
- package/dist/client/chat/action-chat-ui-surface.d.ts.map +1 -0
- package/dist/client/chat/action-chat-ui-surface.js +10 -0
- package/dist/client/chat/action-chat-ui-surface.js.map +1 -0
- package/dist/client/chat/message-components.d.ts +3 -0
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +40 -7
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/chat/tool-call-display.d.ts +3 -1
- package/dist/client/chat/tool-call-display.d.ts.map +1 -1
- package/dist/client/chat/tool-call-display.js +76 -23
- package/dist/client/chat/tool-call-display.js.map +1 -1
- package/dist/client/chat/widgets/InlineExtensionWidget.d.ts.map +1 -1
- package/dist/client/chat/widgets/InlineExtensionWidget.js +1 -1
- package/dist/client/chat/widgets/InlineExtensionWidget.js.map +1 -1
- package/dist/client/chat/widgets/builtin-tool-renderers.d.ts.map +1 -1
- package/dist/client/chat/widgets/builtin-tool-renderers.js +5 -3
- package/dist/client/chat/widgets/builtin-tool-renderers.js.map +1 -1
- package/dist/client/chat-model-groups.d.ts.map +1 -1
- package/dist/client/chat-model-groups.js +44 -21
- package/dist/client/chat-model-groups.js.map +1 -1
- package/dist/client/conversation/AgentConversation.d.ts.map +1 -1
- package/dist/client/conversation/AgentConversation.js +3 -2
- package/dist/client/conversation/AgentConversation.js.map +1 -1
- package/dist/client/error-capture.d.ts.map +1 -1
- package/dist/client/error-capture.js +2 -2
- package/dist/client/error-capture.js.map +1 -1
- package/dist/client/resources/McpConnectionSuggestion.d.ts +1 -0
- package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -1
- package/dist/client/resources/McpConnectionSuggestion.js +9 -8
- package/dist/client/resources/McpConnectionSuggestion.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +3 -1
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/resources/mcp-integration-catalog.d.ts +1 -0
- package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
- package/dist/client/resources/mcp-integration-catalog.js +4 -17
- package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
- package/dist/client/resources/mcp-integration-logos.js +2 -2
- package/dist/client/resources/mcp-integration-logos.js.map +1 -1
- package/dist/client/route-chunk-recovery.d.ts.map +1 -1
- package/dist/client/route-chunk-recovery.js +5 -3
- package/dist/client/route-chunk-recovery.js.map +1 -1
- package/dist/client/session-replay.js +3 -3
- package/dist/client/session-replay.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +2 -2
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/sharing/ShareButton.d.ts +1 -1
- package/dist/client/sharing/ShareButton.d.ts.map +1 -1
- package/dist/client/sharing/ShareButton.js +3 -4
- package/dist/client/sharing/ShareButton.js.map +1 -1
- package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
- package/dist/client/sharing/ShareDialog.js +1 -2
- package/dist/client/sharing/ShareDialog.js.map +1 -1
- package/dist/client/sharing/useShareButtonController.d.ts +0 -1
- package/dist/client/sharing/useShareButtonController.d.ts.map +1 -1
- package/dist/client/sharing/useShareButtonController.js +0 -6
- package/dist/client/sharing/useShareButtonController.js.map +1 -1
- package/dist/client/sharing/useShareDialogController.d.ts +0 -1
- package/dist/client/sharing/useShareDialogController.d.ts.map +1 -1
- package/dist/client/sharing/useShareDialogController.js +0 -1
- package/dist/client/sharing/useShareDialogController.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts +12 -0
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +63 -1
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/client/transcription/use-live-transcription.d.ts +3 -3
- package/dist/client/transcription/use-live-transcription.d.ts.map +1 -1
- package/dist/client/transcription/use-live-transcription.js +22 -11
- package/dist/client/transcription/use-live-transcription.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +1 -1
- package/dist/deploy/build.js.map +1 -1
- package/dist/guards/db-tool-scoping.js +1 -1
- package/dist/guards/db-tool-scoping.js.map +1 -1
- package/dist/integrations/adapters/slack.d.ts +1 -0
- package/dist/integrations/adapters/slack.d.ts.map +1 -1
- package/dist/integrations/adapters/slack.js +61 -5
- package/dist/integrations/adapters/slack.js.map +1 -1
- package/dist/integrations/index.d.ts +1 -1
- package/dist/integrations/index.d.ts.map +1 -1
- package/dist/integrations/index.js +1 -1
- package/dist/integrations/index.js.map +1 -1
- package/dist/localization/default-messages.d.ts +6 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +7 -1
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/mcp-client/oauth-routes.d.ts +3 -0
- package/dist/mcp-client/oauth-routes.d.ts.map +1 -1
- package/dist/mcp-client/oauth-routes.js +41 -12
- package/dist/mcp-client/oauth-routes.js.map +1 -1
- package/dist/observability/routes.d.ts +3 -3
- package/dist/provider-api/actions/custom-provider-registration.d.ts +8 -8
- package/dist/provider-api/actions/provider-api.d.ts +11 -11
- package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.js +1 -18
- package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
- package/dist/scripts/call-agent.d.ts.map +1 -1
- package/dist/scripts/call-agent.js +49 -6
- package/dist/scripts/call-agent.js.map +1 -1
- package/dist/secrets/routes.d.ts +6 -6
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +38 -10
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/realtime-voice.d.ts.map +1 -1
- package/dist/server/realtime-voice.js +1 -1
- package/dist/server/realtime-voice.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +16 -0
- package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
- package/dist/terminal/cli-registry.js +1 -1
- package/dist/terminal/cli-registry.js.map +1 -1
- package/dist/vite/client.d.ts +8 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +113 -2
- package/dist/vite/client.js.map +1 -1
- package/docs/content/a2a-protocol.mdx +15 -0
- package/docs/content/template-chat.mdx +1 -1
- package/docs/content/template-plan.mdx +3 -3
- package/package.json +2 -2
- package/src/a2a/activity.ts +371 -0
- package/src/a2a/client.ts +35 -11
- package/src/a2a/index.ts +21 -0
- package/src/a2a/types.ts +8 -0
- package/src/agent/model-config.ts +19 -23
- package/src/agent/production-agent.ts +167 -100
- package/src/agent/types.ts +16 -1
- package/src/cli/index.ts +18 -10
- package/src/cli/multi-frontier-runs.ts +5 -3
- package/src/cli/templates-meta.ts +0 -12
- package/src/cli/workspace-dev.ts +1 -1
- package/src/client/AgentPanel.tsx +9 -1
- package/src/client/RunStuckBanner.tsx +39 -47
- package/src/client/chat/action-chat-ui-surface.tsx +32 -0
- package/src/client/chat/message-components.tsx +53 -8
- package/src/client/chat/tool-call-display.tsx +214 -44
- package/src/client/chat/widgets/InlineExtensionWidget.tsx +0 -1
- package/src/client/chat/widgets/builtin-tool-renderers.tsx +7 -3
- package/src/client/chat-model-groups.ts +67 -27
- package/src/client/conversation/AgentConversation.tsx +12 -1
- package/src/client/error-capture.ts +2 -6
- package/src/client/resources/McpConnectionSuggestion.tsx +20 -14
- package/src/client/resources/ResourcesPanel.tsx +5 -1
- package/src/client/resources/mcp-integration-catalog.ts +7 -17
- package/src/client/resources/mcp-integration-logos.ts +2 -2
- package/src/client/route-chunk-recovery.ts +5 -3
- package/src/client/session-replay.ts +3 -3
- package/src/client/settings/SettingsPanel.tsx +15 -6
- package/src/client/sharing/ShareButton.tsx +1 -27
- package/src/client/sharing/ShareDialog.tsx +0 -16
- package/src/client/sharing/useShareButtonController.ts +0 -7
- package/src/client/sharing/useShareDialogController.ts +0 -2
- package/src/client/sse-event-processor.ts +85 -1
- package/src/client/transcription/use-live-transcription.ts +64 -45
- package/src/deploy/build.ts +2 -1
- package/src/guards/db-tool-scoping.ts +1 -1
- package/src/integrations/adapters/slack.ts +84 -5
- package/src/integrations/index.ts +5 -1
- package/src/localization/default-messages.ts +7 -1
- package/src/mcp-client/oauth-routes.ts +45 -12
- package/src/scripts/agent-engines/list-agent-engines.ts +1 -18
- package/src/scripts/call-agent.ts +49 -6
- package/src/server/agent-chat-plugin.ts +50 -10
- package/src/server/realtime-voice.ts +4 -1
- package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +16 -0
- package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
- package/src/terminal/cli-registry.ts +1 -1
- package/src/vite/client.ts +166 -1
- package/corpus/core/src/observability/hosted-model-experiment.ts +0 -118
- package/corpus/templates/crm/.agents/skills/agent-native-docs/SKILL.md +0 -115
- package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +0 -177
- package/corpus/templates/crm/.agents/skills/crm/SKILL.md +0 -128
- package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +0 -220
- package/corpus/templates/crm/.agents/skills/feature-flags/SKILL.md +0 -169
- package/corpus/templates/crm/.agents/skills/upgrade-agent-native/SKILL.md +0 -100
- package/corpus/templates/crm/.env.example +0 -5
- package/corpus/templates/crm/AGENTS.md +0 -120
- package/corpus/templates/crm/CHANGELOG.md +0 -1
- package/corpus/templates/crm/DEVELOPING.md +0 -66
- package/corpus/templates/crm/README.md +0 -106
- package/corpus/templates/crm/_gitignore +0 -12
- package/corpus/templates/crm/actions/_crm-action-utils.ts +0 -87
- package/corpus/templates/crm/actions/_crm-dashboard.ts +0 -69
- package/corpus/templates/crm/actions/_crm-data-program-actions.ts +0 -15
- package/corpus/templates/crm/actions/_crm-signal-utils.ts +0 -79
- package/corpus/templates/crm/actions/apply-crm-proposals.ts +0 -203
- package/corpus/templates/crm/actions/attach-call-evidence.ts +0 -170
- package/corpus/templates/crm/actions/configure-crm-connection.ts +0 -126
- package/corpus/templates/crm/actions/configure-native-crm.ts +0 -44
- package/corpus/templates/crm/actions/create-crm-record.ts +0 -148
- package/corpus/templates/crm/actions/create-crm-signal-tracker.ts +0 -58
- package/corpus/templates/crm/actions/delete-staged-dataset.ts +0 -14
- package/corpus/templates/crm/actions/get-crm-automation-recipe.ts +0 -36
- package/corpus/templates/crm/actions/get-crm-dashboard-panel.ts +0 -35
- package/corpus/templates/crm/actions/get-crm-dashboard.ts +0 -14
- package/corpus/templates/crm/actions/get-crm-overview.ts +0 -13
- package/corpus/templates/crm/actions/get-crm-pipeline-data.ts +0 -61
- package/corpus/templates/crm/actions/get-crm-record.ts +0 -75
- package/corpus/templates/crm/actions/install-crm-pipeline-dashboard.ts +0 -81
- package/corpus/templates/crm/actions/list-crm-dashboard-revisions.ts +0 -15
- package/corpus/templates/crm/actions/list-crm-dashboards.ts +0 -15
- package/corpus/templates/crm/actions/list-crm-proposals.ts +0 -31
- package/corpus/templates/crm/actions/list-crm-records.ts +0 -79
- package/corpus/templates/crm/actions/list-crm-saved-views.ts +0 -15
- package/corpus/templates/crm/actions/list-crm-signal-hits.ts +0 -43
- package/corpus/templates/crm/actions/list-crm-signal-trackers.ts +0 -32
- package/corpus/templates/crm/actions/list-crm-tasks.ts +0 -22
- package/corpus/templates/crm/actions/list-staged-datasets.ts +0 -14
- package/corpus/templates/crm/actions/list-workspace-connections.ts +0 -47
- package/corpus/templates/crm/actions/manage-crm-signal-tracker.ts +0 -87
- package/corpus/templates/crm/actions/manage-crm-task.ts +0 -132
- package/corpus/templates/crm/actions/navigate.ts +0 -63
- package/corpus/templates/crm/actions/provider-api-catalog.ts +0 -22
- package/corpus/templates/crm/actions/provider-api-docs.ts +0 -54
- package/corpus/templates/crm/actions/provider-api-request.ts +0 -92
- package/corpus/templates/crm/actions/query-staged-dataset.ts +0 -44
- package/corpus/templates/crm/actions/record-crm-call-insight.ts +0 -160
- package/corpus/templates/crm/actions/record-crm-smart-signal.ts +0 -150
- package/corpus/templates/crm/actions/restore-crm-dashboard-revision.ts +0 -23
- package/corpus/templates/crm/actions/review-crm-signal.ts +0 -31
- package/corpus/templates/crm/actions/run-crm-saved-view-program.ts +0 -103
- package/corpus/templates/crm/actions/run-crm-signal-trackers.ts +0 -275
- package/corpus/templates/crm/actions/run.ts +0 -7
- package/corpus/templates/crm/actions/save-crm-dashboard.ts +0 -51
- package/corpus/templates/crm/actions/save-crm-saved-view.ts +0 -119
- package/corpus/templates/crm/actions/sync-crm.ts +0 -146
- package/corpus/templates/crm/actions/update-crm-record.ts +0 -510
- package/corpus/templates/crm/actions/view-screen.ts +0 -218
- package/corpus/templates/crm/agent-native.app-skill.json +0 -58
- package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +0 -158
- package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +0 -78
- package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +0 -226
- package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +0 -414
- package/corpus/templates/crm/app/components/crm/RecordActions.tsx +0 -510
- package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +0 -134
- package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +0 -362
- package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +0 -93
- package/corpus/templates/crm/app/components/crm/Surface.tsx +0 -97
- package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +0 -180
- package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +0 -112
- package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +0 -84
- package/corpus/templates/crm/app/components/ui/alert-dialog.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/badge.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/button.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/card.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/dialog.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/input.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/label.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/select.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/sheet.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/skeleton.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/switch.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/table.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/tabs.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/textarea.tsx +0 -1
- package/corpus/templates/crm/app/components/ui/toolkit-provider.tsx +0 -17
- package/corpus/templates/crm/app/design-system.ts +0 -3
- package/corpus/templates/crm/app/entry.client.tsx +0 -16
- package/corpus/templates/crm/app/entry.server.tsx +0 -10
- package/corpus/templates/crm/app/global.css +0 -167
- package/corpus/templates/crm/app/hooks/use-navigation-state.ts +0 -60
- package/corpus/templates/crm/app/i18n/en-US.ts +0 -89
- package/corpus/templates/crm/app/i18n/index.ts +0 -34
- package/corpus/templates/crm/app/lib/dashboard.ts +0 -13
- package/corpus/templates/crm/app/lib/navigation.ts +0 -54
- package/corpus/templates/crm/app/lib/tab-id.ts +0 -1
- package/corpus/templates/crm/app/lib/types.ts +0 -172
- package/corpus/templates/crm/app/lib/utils.ts +0 -1
- package/corpus/templates/crm/app/root.tsx +0 -91
- package/corpus/templates/crm/app/routes/_index.tsx +0 -26
- package/corpus/templates/crm/app/routes/accounts.tsx +0 -41
- package/corpus/templates/crm/app/routes/agent.tsx +0 -5
- package/corpus/templates/crm/app/routes/ask.tsx +0 -53
- package/corpus/templates/crm/app/routes/dashboard.tsx +0 -118
- package/corpus/templates/crm/app/routes/opportunities.tsx +0 -41
- package/corpus/templates/crm/app/routes/people.tsx +0 -41
- package/corpus/templates/crm/app/routes/proposals.tsx +0 -266
- package/corpus/templates/crm/app/routes/records.$recordId.tsx +0 -35
- package/corpus/templates/crm/app/routes/settings.tsx +0 -63
- package/corpus/templates/crm/app/routes/setup.tsx +0 -308
- package/corpus/templates/crm/app/routes/tasks.tsx +0 -252
- package/corpus/templates/crm/app/routes/views.tsx +0 -333
- package/corpus/templates/crm/app/routes.ts +0 -17
- package/corpus/templates/crm/app/vite-env.d.ts +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-agent-native-crm.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-clips-call-evidence-review-recipe.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-find-and-review-evidence-grounded-call-signals-w.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-manage-keyword-and-smart-call-signal-trackers-fr.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-delegated-local-crm-automation.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-native-sql.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboard.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboards-now-install-correctly-from-the-crm-actio.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-21-salesforce-connection.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-22-crm-field-validation-now-explains-which-fields-cannot-be-edi.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-22-fixed-hubspot-contact-syncs-missing-records-updated-after-th.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-22-fixed-pipeline-dashboard-panels-so-their-opportunity-data-lo.md +0 -6
- package/corpus/templates/crm/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +0 -6
- package/corpus/templates/crm/components.json +0 -20
- package/corpus/templates/crm/docs/architecture/crm-contract.md +0 -180
- package/corpus/templates/crm/learnings.defaults.md +0 -5
- package/corpus/templates/crm/package.json +0 -59
- package/corpus/templates/crm/public/favicon.svg +0 -1
- package/corpus/templates/crm/public/icon-180.svg +0 -1
- package/corpus/templates/crm/public/manifest.json +0 -11
- package/corpus/templates/crm/react-router.config.ts +0 -7
- package/corpus/templates/crm/server/crm/adapter.ts +0 -32
- package/corpus/templates/crm/server/crm/crm-field-firewall.ts +0 -64
- package/corpus/templates/crm/server/crm/crm-mirror.ts +0 -711
- package/corpus/templates/crm/server/crm/hubspot-adapter.ts +0 -1146
- package/corpus/templates/crm/server/crm/native-adapter.ts +0 -1715
- package/corpus/templates/crm/server/crm/read-through.ts +0 -207
- package/corpus/templates/crm/server/crm/salesforce-adapter.ts +0 -1255
- package/corpus/templates/crm/server/db/crm-store.ts +0 -1170
- package/corpus/templates/crm/server/db/index.ts +0 -169
- package/corpus/templates/crm/server/db/schema.ts +0 -441
- package/corpus/templates/crm/server/lib/intelligence/default-detectors.ts +0 -65
- package/corpus/templates/crm/server/lib/intelligence/evidence.ts +0 -105
- package/corpus/templates/crm/server/lib/intelligence/keyword-detector.ts +0 -100
- package/corpus/templates/crm/server/lib/intelligence/smart-detector.ts +0 -144
- package/corpus/templates/crm/server/lib/intelligence/summary.ts +0 -141
- package/corpus/templates/crm/server/lib/provider-api.ts +0 -64
- package/corpus/templates/crm/server/middleware/auth.ts +0 -4
- package/corpus/templates/crm/server/plugins/agent-chat.ts +0 -68
- package/corpus/templates/crm/server/plugins/auth.ts +0 -14
- package/corpus/templates/crm/server/plugins/core-routes.ts +0 -17
- package/corpus/templates/crm/server/plugins/db.ts +0 -454
- package/corpus/templates/crm/server/routes/[...page].get.ts +0 -5
- package/corpus/templates/crm/shared/crm-automation-recipes.ts +0 -132
- package/corpus/templates/crm/shared/crm-contract.ts +0 -254
- package/corpus/templates/crm/shared/crm-sales-config.ts +0 -63
- package/corpus/templates/crm/ssr-entry.ts +0 -11
- package/corpus/templates/crm/tsconfig.json +0 -24
- package/corpus/templates/crm/vite.config.ts +0 -15
- package/corpus/templates/crm/vitest.config.ts +0 -5
- package/dist/observability/hosted-model-experiment.d.ts +0 -39
- package/dist/observability/hosted-model-experiment.d.ts.map +0 -1
- package/dist/observability/hosted-model-experiment.js +0 -90
- package/dist/observability/hosted-model-experiment.js.map +0 -1
- package/src/observability/hosted-model-experiment.ts +0 -118
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-capture.js","sourceRoot":"","sources":["../../src/client/error-capture.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * First-party, Sentry-style browser error capture for the Agent Native\n * analytics SDK.\n *\n * Two responsibilities:\n * 1. Automatic capture of uncaught exceptions (`window.onerror`) and\n * unhandled promise rejections (`unhandledrejection`).\n * 2. A documented manual API — `captureException(error, context?)` and\n * `captureMessage(message, level?)` — mirroring Sentry's ergonomics.\n *\n * Captured exceptions are handed to a `send` callback (wired by\n * `configureTracking` to the first-party analytics `/track` ingest as a\n * dedicated `$exception` event) and are tagged with the current analytics\n * session id + session replay id so each error links back to the recording it\n * happened in. Everything here is defensive: capture must never throw back into\n * the host app, so every path is wrapped and failures are swallowed.\n *\n * Stack parsing and fingerprinting are intentionally done authoritatively on\n * the server (see the analytics template's `server/lib/error-capture.ts`); the\n * client sends a compact, bounded payload (type/message/raw stack/context) and\n * the server normalizes + groups it. That keeps one tested source of truth for\n * grouping instead of duplicating parser logic across the wire.\n */\nimport { scrubUrl } from \"./url-scrub.js\";\n\nexport type ExceptionLevel = \"fatal\" | \"error\" | \"warning\" | \"info\" | \"debug\";\n\n/** Extra Sentry-style context accepted by `captureException`. */\nexport interface CaptureExceptionContext {\n /** Low-cardinality searchable tags. Values are coerced to strings. */\n tags?: Record<string, string | number | boolean | null | undefined>;\n /** Structured, higher-cardinality detail shown on the event. */\n extra?: Record<string, unknown>;\n /** Severity; defaults to \"error\". */\n level?: ExceptionLevel;\n}\n\nexport interface ExceptionBreadcrumb {\n timestamp: string;\n category: string;\n message: string;\n level?: ExceptionLevel;\n}\n\n/**\n * Compact exception payload emitted to transport. Field names are the wire\n * contract the analytics server ingest reads — keep them stable.\n */\nexport interface CapturedExceptionEvent {\n /** Error class/name, e.g. \"TypeError\". \"Message\" for `captureMessage`. */\n type: string;\n message: string;\n /** Raw (bounded, redacted) stack string; server parses it into frames. */\n stack?: string;\n /** False for uncaught/global errors, true for manually handled ones. */\n handled: boolean;\n level: ExceptionLevel;\n /** ISO timestamp of the occurrence. */\n occurredAt: string;\n url?: string;\n release?: string;\n environment?: string;\n sessionId?: string;\n /** Client session replay id (localStorage) for replay linkage. */\n sessionReplayId?: string;\n anonymousId?: string;\n breadcrumbs: ExceptionBreadcrumb[];\n tags?: Record<string, string>;\n extra?: Record<string, unknown>;\n}\n\nexport interface InstallErrorCaptureOptions {\n /** Transport for a captured exception. Must not throw. */\n send: (event: CapturedExceptionEvent) => void;\n /** Resolve current analytics/session-replay identifiers at capture time. */\n getSessionContext?: () => {\n sessionId?: string;\n anonymousId?: string;\n replayId?: string;\n };\n /**\n * Optional hook to also surface a manual capture on the session replay\n * timeline. Only invoked for manual `captureException`/`captureMessage`;\n * auto-captured global errors are already recorded by the replay recorder.\n */\n emitReplayEvent?: (event: CapturedExceptionEvent) => void;\n release?: string;\n environment?: string;\n /** Auto-capture `window.onerror`. Defaults to true. */\n captureGlobalErrors?: boolean;\n /** Auto-capture `unhandledrejection`. Defaults to true. */\n captureUnhandledRejections?: boolean;\n /** Breadcrumb ring buffer size. Defaults to 20. */\n maxBreadcrumbs?: number;\n /** Dedupe window (ms) for identical signatures. Defaults to 3000. */\n dedupeWindowMs?: number;\n}\n\ninterface ErrorCaptureRuntime {\n installed: boolean;\n config: Required<\n Pick<\n InstallErrorCaptureOptions,\n | \"captureGlobalErrors\"\n | \"captureUnhandledRejections\"\n | \"maxBreadcrumbs\"\n | \"dedupeWindowMs\"\n >\n > &\n Omit<\n InstallErrorCaptureOptions,\n | \"captureGlobalErrors\"\n | \"captureUnhandledRejections\"\n | \"maxBreadcrumbs\"\n | \"dedupeWindowMs\"\n >;\n breadcrumbs: ExceptionBreadcrumb[];\n recentSignatures: Map<string, number>;\n removeHandlers: (() => void) | null;\n navigationInstalled: boolean;\n}\n\nconst MAX_MESSAGE_LENGTH = 1000;\nconst MAX_STACK_LENGTH = 8000;\nconst MAX_TAGS = 30;\nconst MAX_EXTRA_KEYS = 50;\nconst MAX_EXTRA_DEPTH = 4;\nconst MAX_EXTRA_OBJECT_KEYS = 20;\nconst MAX_EXTRA_ARRAY_ITEMS = 20;\nconst MAX_EXTRA_STRING_LENGTH = 2000;\n\nconst ERROR_CAPTURE_STATE_KEY = Symbol.for(\"agent-native.client.errorCapture\");\n\n// Reuse the same credential-looking redaction the replay capture uses so a\n// stack/message that echoes a token never leaves the browser in the clear.\nconst SECRET_KEY_FRAGMENT =\n \"(?:authorization|cookie|set[-_]?cookie|token|secret|password|passwd|pwd|api[-_]?key|apikey|session|credential)\";\nconst BEARER_RE = /\\b(bearer|basic)\\s+[a-z0-9._~+/-]+=*/gi;\nconst UNQUOTED_SECRET_RE = new RegExp(\n `([\"']?)([A-Za-z0-9_$.-]*${SECRET_KEY_FRAGMENT}[A-Za-z0-9_$.-]*)\\\\1(\\\\s*[:=]\\\\s*)([^\"',\\\\s;}\\\\]]+)`,\n \"gi\",\n);\nconst SECRET_KEY_RE = new RegExp(SECRET_KEY_FRAGMENT, \"i\");\n\nfunction redactSecrets(value: string): string {\n return value\n .replace(BEARER_RE, \"$1 <redacted>\")\n .replace(UNQUOTED_SECRET_RE, \"$1$2$1$3<redacted>\");\n}\n\nfunction getRuntime(): ErrorCaptureRuntime {\n const g = globalThis as typeof globalThis & {\n [ERROR_CAPTURE_STATE_KEY]?: ErrorCaptureRuntime;\n };\n if (!g[ERROR_CAPTURE_STATE_KEY]) {\n g[ERROR_CAPTURE_STATE_KEY] = {\n installed: false,\n config: {\n send: () => {},\n captureGlobalErrors: true,\n captureUnhandledRejections: true,\n maxBreadcrumbs: 20,\n dedupeWindowMs: 3000,\n },\n breadcrumbs: [],\n recentSignatures: new Map(),\n removeHandlers: null,\n navigationInstalled: false,\n };\n }\n return g[ERROR_CAPTURE_STATE_KEY]!;\n}\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction truncate(value: string, max: number): string {\n return value.length > max ? value.slice(0, max) : value;\n}\n\nfunction currentUrl(): string | undefined {\n try {\n return scrubUrl(window.location.href);\n } catch {\n return undefined;\n }\n}\n\n/** Normalize any thrown value into a stable `{ type, message, stack }`. */\nexport function normalizeCapturedError(error: unknown): {\n type: string;\n message: string;\n stack?: string;\n} {\n if (error instanceof Error) {\n return {\n type: error.name || \"Error\",\n message: error.message || String(error),\n stack: typeof error.stack === \"string\" ? error.stack : undefined,\n };\n }\n if (typeof error === \"string\") {\n return { type: \"Error\", message: error };\n }\n if (error && typeof error === \"object\") {\n const record = error as Record<string, unknown>;\n const name = typeof record.name === \"string\" ? record.name : undefined;\n const message =\n typeof record.message === \"string\" ? record.message : undefined;\n const stack = typeof record.stack === \"string\" ? record.stack : undefined;\n if (name || message || stack) {\n return {\n type: name || \"Error\",\n message: message || safeStringify(error),\n stack,\n };\n }\n return { type: \"Error\", message: safeStringify(error) };\n }\n return { type: \"Error\", message: String(error) };\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\nfunction coerceTags(\n tags: CaptureExceptionContext[\"tags\"],\n): Record<string, string> | undefined {\n if (!tags) return undefined;\n const out: Record<string, string> = {};\n let count = 0;\n for (const [key, value] of Object.entries(tags)) {\n if (count >= MAX_TAGS) break;\n if (value === undefined || value === null) continue;\n out[key] = truncate(redactSecrets(String(value)), 200);\n count += 1;\n }\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction coerceExtra(\n extra: CaptureExceptionContext[\"extra\"],\n): Record<string, unknown> | undefined {\n if (!extra || typeof extra !== \"object\") return undefined;\n const out: Record<string, unknown> = {};\n let count = 0;\n for (const [key, value] of Object.entries(extra)) {\n if (count >= MAX_EXTRA_KEYS) break;\n const safeKey = truncate(redactSecrets(key), 100);\n out[safeKey] = SECRET_KEY_RE.test(safeKey)\n ? \"<redacted>\"\n : coerceExtraValue(value, MAX_EXTRA_DEPTH);\n count += 1;\n }\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction coerceExtraValue(value: unknown, depth: number): unknown {\n if (\n value == null ||\n typeof value === \"boolean\" ||\n typeof value === \"number\"\n ) {\n return value;\n }\n if (typeof value === \"string\") {\n return truncate(redactSecrets(value), MAX_EXTRA_STRING_LENGTH);\n }\n if (typeof value === \"bigint\") {\n return truncate(redactSecrets(value.toString()), MAX_EXTRA_STRING_LENGTH);\n }\n if (depth <= 0) {\n return truncate(\n redactSecrets(safeStringify(value)),\n MAX_EXTRA_STRING_LENGTH,\n );\n }\n if (Array.isArray(value)) {\n return value\n .slice(0, MAX_EXTRA_ARRAY_ITEMS)\n .map((item) => coerceExtraValue(item, depth - 1));\n }\n if (typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n let count = 0;\n for (const [rawKey, child] of Object.entries(value)) {\n if (count >= MAX_EXTRA_OBJECT_KEYS) break;\n const key = truncate(redactSecrets(rawKey), 100);\n out[key] = SECRET_KEY_RE.test(key)\n ? \"<redacted>\"\n : coerceExtraValue(child, depth - 1);\n count += 1;\n }\n return out;\n }\n return truncate(redactSecrets(String(value)), MAX_EXTRA_STRING_LENGTH);\n}\n\nfunction firstStackLine(stack: string | undefined): string {\n if (!stack) return \"\";\n const lines = stack.split(\"\\n\").map((line) => line.trim());\n return (\n lines.find((line) => line.startsWith(\"at \") || /:\\d+:\\d+/.test(line)) ??\n lines[1] ??\n \"\"\n );\n}\n\n/** Cheap client-side signature used only for local dedupe. */\nfunction signatureOf(type: string, message: string, stack?: string): string {\n return `${type}|${message}|${firstStackLine(stack)}`;\n}\n\nfunction normalizeGlobalErrorEvent(event: ErrorEvent): {\n type: string;\n message: string;\n stack?: string;\n} {\n const error = event?.error;\n const normalized = error\n ? normalizeCapturedError(error)\n : {\n type: \"Error\",\n message: String(event?.message ?? \"Uncaught error\"),\n };\n\n if (!normalized.stack && event?.filename) {\n const line = event.lineno ?? 0;\n const col = event.colno ?? 0;\n normalized.stack = `at ${event.filename}:${line}:${col}`;\n }\n\n return normalized;\n}\n\nfunction shouldIgnoreAutoCapturedError(normalized: {\n type: string;\n message: string;\n stack?: string;\n}): boolean {\n const message = (normalized.message || \"\").trim();\n const stack = normalized.stack || \"\";\n\n if (\n /^ResizeObserver loop (?:limit exceeded|completed with undelivered notifications\\.?)$/i.test(\n message,\n )\n ) {\n return true;\n }\n\n // Route-chunk recovery reloads the current page after stale lazy chunks or\n // module scripts fail. Browser-level failures have no useful stack, so do\n // not retain the transient loader noise as an application issue.\n if (\n !stack &&\n /^(?:Importing a module script failed\\.?|(?:Failed to fetch|error loading) dynamically imported module(?::.*)?)$/i.test(\n message,\n )\n ) {\n return true;\n }\n\n if (\n normalized.type === \"InvalidStateError\" &&\n /^Transition was aborted because of invalid state$/i.test(message)\n ) {\n return true;\n }\n\n if (\n /^This script should only be loaded in a browser extension\\.?$/i.test(\n message,\n )\n ) {\n return true;\n }\n\n const hasExtensionFrame =\n /\\b(?:chrome|moz|safari|webkit)-extension:\\/\\//i.test(stack) ||\n /\\binjectScriptAdjust\\.js\\b/i.test(stack);\n if (\n hasExtensionFrame &&\n /^(?:TypeError:\\s*)?Failed to fetch$/i.test(message)\n ) {\n return true;\n }\n\n return false;\n}\n\nfunction shouldDedupe(\n runtime: ErrorCaptureRuntime,\n signature: string,\n): boolean {\n const now = Date.now();\n const windowMs = runtime.config.dedupeWindowMs;\n // Opportunistic cleanup so the map can't grow without bound.\n if (runtime.recentSignatures.size > 200) {\n for (const [key, ts] of runtime.recentSignatures) {\n if (now - ts > windowMs) runtime.recentSignatures.delete(key);\n }\n }\n const last = runtime.recentSignatures.get(signature);\n runtime.recentSignatures.set(signature, now);\n return last !== undefined && now - last < windowMs;\n}\n\n/** Append a privacy-safe breadcrumb to the bounded ring buffer. */\nexport function addErrorBreadcrumb(breadcrumb: {\n category: string;\n message: string;\n level?: ExceptionLevel;\n}): void {\n try {\n const runtime = getRuntime();\n runtime.breadcrumbs.push({\n timestamp: nowIso(),\n category: truncate(breadcrumb.category, 60),\n message: truncate(redactSecrets(breadcrumb.message), 300),\n ...(breadcrumb.level ? { level: breadcrumb.level } : {}),\n });\n const max = runtime.config.maxBreadcrumbs;\n if (runtime.breadcrumbs.length > max) {\n runtime.breadcrumbs.splice(0, runtime.breadcrumbs.length - max);\n }\n } catch {\n // breadcrumbs are best-effort\n }\n}\n\nfunction snapshotBreadcrumbs(\n runtime: ErrorCaptureRuntime,\n): ExceptionBreadcrumb[] {\n return runtime.breadcrumbs.slice(-runtime.config.maxBreadcrumbs);\n}\n\nfunction installNavigationBreadcrumbs(runtime: ErrorCaptureRuntime): void {\n if (runtime.navigationInstalled || typeof window === \"undefined\") return;\n runtime.navigationInstalled = true;\n const record = (navType: string) => {\n try {\n addErrorBreadcrumb({\n category: \"navigation\",\n message: `${navType} ${scrubUrl(window.location.href) ?? window.location.pathname}`,\n });\n } catch {\n // ignore\n }\n };\n try {\n const originalPush = window.history.pushState;\n const originalReplace = window.history.replaceState;\n window.history.pushState = function pushState(...args) {\n const result = originalPush.apply(this, args);\n record(\"navigate\");\n return result;\n };\n window.history.replaceState = function replaceState(...args) {\n const result = originalReplace.apply(this, args);\n record(\"replace\");\n return result;\n };\n window.addEventListener(\"popstate\", () => record(\"popstate\"));\n // Seed the trail with the initial location.\n record(\"load\");\n } catch {\n // navigation breadcrumbs are best-effort\n }\n}\n\nfunction buildEvent(\n runtime: ErrorCaptureRuntime,\n normalized: { type: string; message: string; stack?: string },\n options: {\n handled: boolean;\n level: ExceptionLevel;\n tags?: Record<string, string>;\n extra?: Record<string, unknown>;\n },\n): CapturedExceptionEvent {\n const context = runtime.config.getSessionContext?.() ?? {};\n const stack = normalized.stack\n ? truncate(redactSecrets(normalized.stack), MAX_STACK_LENGTH)\n : undefined;\n return {\n type: truncate(normalized.type || \"Error\", 200),\n message: truncate(\n redactSecrets(normalized.message || \"\"),\n MAX_MESSAGE_LENGTH,\n ),\n ...(stack ? { stack } : {}),\n handled: options.handled,\n level: options.level,\n occurredAt: nowIso(),\n ...(currentUrl() ? { url: currentUrl() } : {}),\n ...(runtime.config.release ? { release: runtime.config.release } : {}),\n ...(runtime.config.environment\n ? { environment: runtime.config.environment }\n : {}),\n ...(context.sessionId ? { sessionId: context.sessionId } : {}),\n ...(context.replayId ? { sessionReplayId: context.replayId } : {}),\n ...(context.anonymousId ? { anonymousId: context.anonymousId } : {}),\n breadcrumbs: snapshotBreadcrumbs(runtime),\n ...(options.tags ? { tags: options.tags } : {}),\n ...(options.extra ? { extra: options.extra } : {}),\n };\n}\n\nfunction dispatch(\n runtime: ErrorCaptureRuntime,\n event: CapturedExceptionEvent,\n emitToReplay: boolean,\n): void {\n const signature = signatureOf(event.type, event.message, event.stack);\n if (shouldDedupe(runtime, signature)) return;\n try {\n runtime.config.send(event);\n } catch {\n // transport must never throw into the host app\n }\n if (emitToReplay) {\n try {\n runtime.config.emitReplayEvent?.(event);\n } catch {\n // replay timeline emission is best-effort\n }\n }\n // Record the exception itself as a breadcrumb so a following error carries\n // the prior failure in its trail.\n addErrorBreadcrumb({\n category: \"exception\",\n message: `${event.type}: ${event.message}`,\n level: event.level,\n });\n}\n\n/**\n * Capture a handled exception. Mirrors Sentry's `captureException(err, ctx)`.\n * Safe to call before `configureTracking` has run — it simply no-ops if no\n * transport is installed yet.\n */\nexport function captureException(\n error: unknown,\n context: CaptureExceptionContext = {},\n): void {\n try {\n const runtime = getRuntime();\n const normalized = normalizeCapturedError(error);\n const event = buildEvent(runtime, normalized, {\n handled: true,\n level: context.level ?? \"error\",\n tags: coerceTags(context.tags),\n extra: coerceExtra(context.extra),\n });\n dispatch(runtime, event, true);\n } catch {\n // never throw from capture\n }\n}\n\n/**\n * Capture a message string as an exception-like event. Mirrors Sentry's\n * `captureMessage(message, level?)`.\n */\nexport function captureMessage(\n message: string,\n level: ExceptionLevel = \"info\",\n): void {\n try {\n const runtime = getRuntime();\n const event = buildEvent(\n runtime,\n { type: \"Message\", message: String(message ?? \"\") },\n { handled: true, level },\n );\n dispatch(runtime, event, true);\n } catch {\n // never throw from capture\n }\n}\n\n/**\n * Install auto-capture + wire the transport. Idempotent: re-invoking updates\n * the config (and (re)installs global handlers) without duplicating listeners.\n * Returns a disposer that removes the global handlers.\n */\nexport function installErrorCapture(\n options: InstallErrorCaptureOptions,\n): () => void {\n const runtime = getRuntime();\n runtime.config = {\n ...runtime.config,\n ...options,\n captureGlobalErrors: options.captureGlobalErrors ?? true,\n captureUnhandledRejections: options.captureUnhandledRejections ?? true,\n maxBreadcrumbs: options.maxBreadcrumbs ?? runtime.config.maxBreadcrumbs,\n dedupeWindowMs: options.dedupeWindowMs ?? runtime.config.dedupeWindowMs,\n };\n\n if (typeof window === \"undefined\") return () => {};\n\n installNavigationBreadcrumbs(runtime);\n\n // Tear down any previously-installed handlers before reinstalling so a second\n // configureTracking call doesn't double-report.\n runtime.removeHandlers?.();\n runtime.removeHandlers = null;\n\n const removers: Array<() => void> = [];\n\n if (runtime.config.captureGlobalErrors) {\n const onError = (event: ErrorEvent) => {\n try {\n const normalized = normalizeGlobalErrorEvent(event);\n if (shouldIgnoreAutoCapturedError(normalized)) return;\n // Global errors are already logged by the session replay recorder, so\n // don't re-emit them onto the replay timeline (avoid double-counting).\n dispatch(\n runtime,\n buildEvent(runtime, normalized, {\n handled: false,\n level: \"error\",\n }),\n false,\n );\n } catch {\n // never throw from the listener\n }\n };\n window.addEventListener(\"error\", onError as EventListener);\n removers.push(() =>\n window.removeEventListener(\"error\", onError as EventListener),\n );\n }\n\n if (runtime.config.captureUnhandledRejections) {\n const onRejection = (event: PromiseRejectionEvent) => {\n try {\n const reason = event?.reason;\n const normalized = normalizeCapturedError(reason);\n if (!normalized.type || normalized.type === \"Error\") {\n normalized.type = \"UnhandledRejection\";\n }\n if (shouldIgnoreAutoCapturedError(normalized)) return;\n dispatch(\n runtime,\n buildEvent(runtime, normalized, {\n handled: false,\n level: \"error\",\n }),\n false,\n );\n } catch {\n // never throw from the listener\n }\n };\n window.addEventListener(\"unhandledrejection\", onRejection as EventListener);\n removers.push(() =>\n window.removeEventListener(\n \"unhandledrejection\",\n onRejection as EventListener,\n ),\n );\n }\n\n runtime.installed = true;\n runtime.removeHandlers = () => {\n for (const remove of removers) {\n try {\n remove();\n } catch {\n // best-effort teardown\n }\n }\n runtime.removeHandlers = null;\n runtime.installed = false;\n };\n return runtime.removeHandlers;\n}\n\nexport function isErrorCaptureInstalled(): boolean {\n return getRuntime().installed;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"error-capture.js","sourceRoot":"","sources":["../../src/client/error-capture.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * First-party, Sentry-style browser error capture for the Agent Native\n * analytics SDK.\n *\n * Two responsibilities:\n * 1. Automatic capture of uncaught exceptions (`window.onerror`) and\n * unhandled promise rejections (`unhandledrejection`).\n * 2. A documented manual API — `captureException(error, context?)` and\n * `captureMessage(message, level?)` — mirroring Sentry's ergonomics.\n *\n * Captured exceptions are handed to a `send` callback (wired by\n * `configureTracking` to the first-party analytics `/track` ingest as a\n * dedicated `$exception` event) and are tagged with the current analytics\n * session id + session replay id so each error links back to the recording it\n * happened in. Everything here is defensive: capture must never throw back into\n * the host app, so every path is wrapped and failures are swallowed.\n *\n * Stack parsing and fingerprinting are intentionally done authoritatively on\n * the server (see the analytics template's `server/lib/error-capture.ts`); the\n * client sends a compact, bounded payload (type/message/raw stack/context) and\n * the server normalizes + groups it. That keeps one tested source of truth for\n * grouping instead of duplicating parser logic across the wire.\n */\nimport { isDynamicImportFailureMessage } from \"./route-chunk-recovery.js\";\nimport { scrubUrl } from \"./url-scrub.js\";\n\nexport type ExceptionLevel = \"fatal\" | \"error\" | \"warning\" | \"info\" | \"debug\";\n\n/** Extra Sentry-style context accepted by `captureException`. */\nexport interface CaptureExceptionContext {\n /** Low-cardinality searchable tags. Values are coerced to strings. */\n tags?: Record<string, string | number | boolean | null | undefined>;\n /** Structured, higher-cardinality detail shown on the event. */\n extra?: Record<string, unknown>;\n /** Severity; defaults to \"error\". */\n level?: ExceptionLevel;\n}\n\nexport interface ExceptionBreadcrumb {\n timestamp: string;\n category: string;\n message: string;\n level?: ExceptionLevel;\n}\n\n/**\n * Compact exception payload emitted to transport. Field names are the wire\n * contract the analytics server ingest reads — keep them stable.\n */\nexport interface CapturedExceptionEvent {\n /** Error class/name, e.g. \"TypeError\". \"Message\" for `captureMessage`. */\n type: string;\n message: string;\n /** Raw (bounded, redacted) stack string; server parses it into frames. */\n stack?: string;\n /** False for uncaught/global errors, true for manually handled ones. */\n handled: boolean;\n level: ExceptionLevel;\n /** ISO timestamp of the occurrence. */\n occurredAt: string;\n url?: string;\n release?: string;\n environment?: string;\n sessionId?: string;\n /** Client session replay id (localStorage) for replay linkage. */\n sessionReplayId?: string;\n anonymousId?: string;\n breadcrumbs: ExceptionBreadcrumb[];\n tags?: Record<string, string>;\n extra?: Record<string, unknown>;\n}\n\nexport interface InstallErrorCaptureOptions {\n /** Transport for a captured exception. Must not throw. */\n send: (event: CapturedExceptionEvent) => void;\n /** Resolve current analytics/session-replay identifiers at capture time. */\n getSessionContext?: () => {\n sessionId?: string;\n anonymousId?: string;\n replayId?: string;\n };\n /**\n * Optional hook to also surface a manual capture on the session replay\n * timeline. Only invoked for manual `captureException`/`captureMessage`;\n * auto-captured global errors are already recorded by the replay recorder.\n */\n emitReplayEvent?: (event: CapturedExceptionEvent) => void;\n release?: string;\n environment?: string;\n /** Auto-capture `window.onerror`. Defaults to true. */\n captureGlobalErrors?: boolean;\n /** Auto-capture `unhandledrejection`. Defaults to true. */\n captureUnhandledRejections?: boolean;\n /** Breadcrumb ring buffer size. Defaults to 20. */\n maxBreadcrumbs?: number;\n /** Dedupe window (ms) for identical signatures. Defaults to 3000. */\n dedupeWindowMs?: number;\n}\n\ninterface ErrorCaptureRuntime {\n installed: boolean;\n config: Required<\n Pick<\n InstallErrorCaptureOptions,\n | \"captureGlobalErrors\"\n | \"captureUnhandledRejections\"\n | \"maxBreadcrumbs\"\n | \"dedupeWindowMs\"\n >\n > &\n Omit<\n InstallErrorCaptureOptions,\n | \"captureGlobalErrors\"\n | \"captureUnhandledRejections\"\n | \"maxBreadcrumbs\"\n | \"dedupeWindowMs\"\n >;\n breadcrumbs: ExceptionBreadcrumb[];\n recentSignatures: Map<string, number>;\n removeHandlers: (() => void) | null;\n navigationInstalled: boolean;\n}\n\nconst MAX_MESSAGE_LENGTH = 1000;\nconst MAX_STACK_LENGTH = 8000;\nconst MAX_TAGS = 30;\nconst MAX_EXTRA_KEYS = 50;\nconst MAX_EXTRA_DEPTH = 4;\nconst MAX_EXTRA_OBJECT_KEYS = 20;\nconst MAX_EXTRA_ARRAY_ITEMS = 20;\nconst MAX_EXTRA_STRING_LENGTH = 2000;\n\nconst ERROR_CAPTURE_STATE_KEY = Symbol.for(\"agent-native.client.errorCapture\");\n\n// Reuse the same credential-looking redaction the replay capture uses so a\n// stack/message that echoes a token never leaves the browser in the clear.\nconst SECRET_KEY_FRAGMENT =\n \"(?:authorization|cookie|set[-_]?cookie|token|secret|password|passwd|pwd|api[-_]?key|apikey|session|credential)\";\nconst BEARER_RE = /\\b(bearer|basic)\\s+[a-z0-9._~+/-]+=*/gi;\nconst UNQUOTED_SECRET_RE = new RegExp(\n `([\"']?)([A-Za-z0-9_$.-]*${SECRET_KEY_FRAGMENT}[A-Za-z0-9_$.-]*)\\\\1(\\\\s*[:=]\\\\s*)([^\"',\\\\s;}\\\\]]+)`,\n \"gi\",\n);\nconst SECRET_KEY_RE = new RegExp(SECRET_KEY_FRAGMENT, \"i\");\n\nfunction redactSecrets(value: string): string {\n return value\n .replace(BEARER_RE, \"$1 <redacted>\")\n .replace(UNQUOTED_SECRET_RE, \"$1$2$1$3<redacted>\");\n}\n\nfunction getRuntime(): ErrorCaptureRuntime {\n const g = globalThis as typeof globalThis & {\n [ERROR_CAPTURE_STATE_KEY]?: ErrorCaptureRuntime;\n };\n if (!g[ERROR_CAPTURE_STATE_KEY]) {\n g[ERROR_CAPTURE_STATE_KEY] = {\n installed: false,\n config: {\n send: () => {},\n captureGlobalErrors: true,\n captureUnhandledRejections: true,\n maxBreadcrumbs: 20,\n dedupeWindowMs: 3000,\n },\n breadcrumbs: [],\n recentSignatures: new Map(),\n removeHandlers: null,\n navigationInstalled: false,\n };\n }\n return g[ERROR_CAPTURE_STATE_KEY]!;\n}\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction truncate(value: string, max: number): string {\n return value.length > max ? value.slice(0, max) : value;\n}\n\nfunction currentUrl(): string | undefined {\n try {\n return scrubUrl(window.location.href);\n } catch {\n return undefined;\n }\n}\n\n/** Normalize any thrown value into a stable `{ type, message, stack }`. */\nexport function normalizeCapturedError(error: unknown): {\n type: string;\n message: string;\n stack?: string;\n} {\n if (error instanceof Error) {\n return {\n type: error.name || \"Error\",\n message: error.message || String(error),\n stack: typeof error.stack === \"string\" ? error.stack : undefined,\n };\n }\n if (typeof error === \"string\") {\n return { type: \"Error\", message: error };\n }\n if (error && typeof error === \"object\") {\n const record = error as Record<string, unknown>;\n const name = typeof record.name === \"string\" ? record.name : undefined;\n const message =\n typeof record.message === \"string\" ? record.message : undefined;\n const stack = typeof record.stack === \"string\" ? record.stack : undefined;\n if (name || message || stack) {\n return {\n type: name || \"Error\",\n message: message || safeStringify(error),\n stack,\n };\n }\n return { type: \"Error\", message: safeStringify(error) };\n }\n return { type: \"Error\", message: String(error) };\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\nfunction coerceTags(\n tags: CaptureExceptionContext[\"tags\"],\n): Record<string, string> | undefined {\n if (!tags) return undefined;\n const out: Record<string, string> = {};\n let count = 0;\n for (const [key, value] of Object.entries(tags)) {\n if (count >= MAX_TAGS) break;\n if (value === undefined || value === null) continue;\n out[key] = truncate(redactSecrets(String(value)), 200);\n count += 1;\n }\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction coerceExtra(\n extra: CaptureExceptionContext[\"extra\"],\n): Record<string, unknown> | undefined {\n if (!extra || typeof extra !== \"object\") return undefined;\n const out: Record<string, unknown> = {};\n let count = 0;\n for (const [key, value] of Object.entries(extra)) {\n if (count >= MAX_EXTRA_KEYS) break;\n const safeKey = truncate(redactSecrets(key), 100);\n out[safeKey] = SECRET_KEY_RE.test(safeKey)\n ? \"<redacted>\"\n : coerceExtraValue(value, MAX_EXTRA_DEPTH);\n count += 1;\n }\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction coerceExtraValue(value: unknown, depth: number): unknown {\n if (\n value == null ||\n typeof value === \"boolean\" ||\n typeof value === \"number\"\n ) {\n return value;\n }\n if (typeof value === \"string\") {\n return truncate(redactSecrets(value), MAX_EXTRA_STRING_LENGTH);\n }\n if (typeof value === \"bigint\") {\n return truncate(redactSecrets(value.toString()), MAX_EXTRA_STRING_LENGTH);\n }\n if (depth <= 0) {\n return truncate(\n redactSecrets(safeStringify(value)),\n MAX_EXTRA_STRING_LENGTH,\n );\n }\n if (Array.isArray(value)) {\n return value\n .slice(0, MAX_EXTRA_ARRAY_ITEMS)\n .map((item) => coerceExtraValue(item, depth - 1));\n }\n if (typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n let count = 0;\n for (const [rawKey, child] of Object.entries(value)) {\n if (count >= MAX_EXTRA_OBJECT_KEYS) break;\n const key = truncate(redactSecrets(rawKey), 100);\n out[key] = SECRET_KEY_RE.test(key)\n ? \"<redacted>\"\n : coerceExtraValue(child, depth - 1);\n count += 1;\n }\n return out;\n }\n return truncate(redactSecrets(String(value)), MAX_EXTRA_STRING_LENGTH);\n}\n\nfunction firstStackLine(stack: string | undefined): string {\n if (!stack) return \"\";\n const lines = stack.split(\"\\n\").map((line) => line.trim());\n return (\n lines.find((line) => line.startsWith(\"at \") || /:\\d+:\\d+/.test(line)) ??\n lines[1] ??\n \"\"\n );\n}\n\n/** Cheap client-side signature used only for local dedupe. */\nfunction signatureOf(type: string, message: string, stack?: string): string {\n return `${type}|${message}|${firstStackLine(stack)}`;\n}\n\nfunction normalizeGlobalErrorEvent(event: ErrorEvent): {\n type: string;\n message: string;\n stack?: string;\n} {\n const error = event?.error;\n const normalized = error\n ? normalizeCapturedError(error)\n : {\n type: \"Error\",\n message: String(event?.message ?? \"Uncaught error\"),\n };\n\n if (!normalized.stack && event?.filename) {\n const line = event.lineno ?? 0;\n const col = event.colno ?? 0;\n normalized.stack = `at ${event.filename}:${line}:${col}`;\n }\n\n return normalized;\n}\n\nfunction shouldIgnoreAutoCapturedError(normalized: {\n type: string;\n message: string;\n stack?: string;\n}): boolean {\n const message = (normalized.message || \"\").trim();\n const stack = normalized.stack || \"\";\n\n if (\n /^ResizeObserver loop (?:limit exceeded|completed with undelivered notifications\\.?)$/i.test(\n message,\n )\n ) {\n return true;\n }\n\n // Route-chunk recovery reloads the current page after stale lazy chunks or\n // module scripts fail. Browser-level failures have no useful stack, so do\n // not retain the transient loader noise as an application issue.\n if (!stack && isDynamicImportFailureMessage(message)) {\n return true;\n }\n\n if (\n normalized.type === \"InvalidStateError\" &&\n /^Transition was aborted because of invalid state$/i.test(message)\n ) {\n return true;\n }\n\n if (\n /^This script should only be loaded in a browser extension\\.?$/i.test(\n message,\n )\n ) {\n return true;\n }\n\n const hasExtensionFrame =\n /\\b(?:chrome|moz|safari|webkit)-extension:\\/\\//i.test(stack) ||\n /\\binjectScriptAdjust\\.js\\b/i.test(stack);\n if (\n hasExtensionFrame &&\n /^(?:TypeError:\\s*)?Failed to fetch$/i.test(message)\n ) {\n return true;\n }\n\n return false;\n}\n\nfunction shouldDedupe(\n runtime: ErrorCaptureRuntime,\n signature: string,\n): boolean {\n const now = Date.now();\n const windowMs = runtime.config.dedupeWindowMs;\n // Opportunistic cleanup so the map can't grow without bound.\n if (runtime.recentSignatures.size > 200) {\n for (const [key, ts] of runtime.recentSignatures) {\n if (now - ts > windowMs) runtime.recentSignatures.delete(key);\n }\n }\n const last = runtime.recentSignatures.get(signature);\n runtime.recentSignatures.set(signature, now);\n return last !== undefined && now - last < windowMs;\n}\n\n/** Append a privacy-safe breadcrumb to the bounded ring buffer. */\nexport function addErrorBreadcrumb(breadcrumb: {\n category: string;\n message: string;\n level?: ExceptionLevel;\n}): void {\n try {\n const runtime = getRuntime();\n runtime.breadcrumbs.push({\n timestamp: nowIso(),\n category: truncate(breadcrumb.category, 60),\n message: truncate(redactSecrets(breadcrumb.message), 300),\n ...(breadcrumb.level ? { level: breadcrumb.level } : {}),\n });\n const max = runtime.config.maxBreadcrumbs;\n if (runtime.breadcrumbs.length > max) {\n runtime.breadcrumbs.splice(0, runtime.breadcrumbs.length - max);\n }\n } catch {\n // breadcrumbs are best-effort\n }\n}\n\nfunction snapshotBreadcrumbs(\n runtime: ErrorCaptureRuntime,\n): ExceptionBreadcrumb[] {\n return runtime.breadcrumbs.slice(-runtime.config.maxBreadcrumbs);\n}\n\nfunction installNavigationBreadcrumbs(runtime: ErrorCaptureRuntime): void {\n if (runtime.navigationInstalled || typeof window === \"undefined\") return;\n runtime.navigationInstalled = true;\n const record = (navType: string) => {\n try {\n addErrorBreadcrumb({\n category: \"navigation\",\n message: `${navType} ${scrubUrl(window.location.href) ?? window.location.pathname}`,\n });\n } catch {\n // ignore\n }\n };\n try {\n const originalPush = window.history.pushState;\n const originalReplace = window.history.replaceState;\n window.history.pushState = function pushState(...args) {\n const result = originalPush.apply(this, args);\n record(\"navigate\");\n return result;\n };\n window.history.replaceState = function replaceState(...args) {\n const result = originalReplace.apply(this, args);\n record(\"replace\");\n return result;\n };\n window.addEventListener(\"popstate\", () => record(\"popstate\"));\n // Seed the trail with the initial location.\n record(\"load\");\n } catch {\n // navigation breadcrumbs are best-effort\n }\n}\n\nfunction buildEvent(\n runtime: ErrorCaptureRuntime,\n normalized: { type: string; message: string; stack?: string },\n options: {\n handled: boolean;\n level: ExceptionLevel;\n tags?: Record<string, string>;\n extra?: Record<string, unknown>;\n },\n): CapturedExceptionEvent {\n const context = runtime.config.getSessionContext?.() ?? {};\n const stack = normalized.stack\n ? truncate(redactSecrets(normalized.stack), MAX_STACK_LENGTH)\n : undefined;\n return {\n type: truncate(normalized.type || \"Error\", 200),\n message: truncate(\n redactSecrets(normalized.message || \"\"),\n MAX_MESSAGE_LENGTH,\n ),\n ...(stack ? { stack } : {}),\n handled: options.handled,\n level: options.level,\n occurredAt: nowIso(),\n ...(currentUrl() ? { url: currentUrl() } : {}),\n ...(runtime.config.release ? { release: runtime.config.release } : {}),\n ...(runtime.config.environment\n ? { environment: runtime.config.environment }\n : {}),\n ...(context.sessionId ? { sessionId: context.sessionId } : {}),\n ...(context.replayId ? { sessionReplayId: context.replayId } : {}),\n ...(context.anonymousId ? { anonymousId: context.anonymousId } : {}),\n breadcrumbs: snapshotBreadcrumbs(runtime),\n ...(options.tags ? { tags: options.tags } : {}),\n ...(options.extra ? { extra: options.extra } : {}),\n };\n}\n\nfunction dispatch(\n runtime: ErrorCaptureRuntime,\n event: CapturedExceptionEvent,\n emitToReplay: boolean,\n): void {\n const signature = signatureOf(event.type, event.message, event.stack);\n if (shouldDedupe(runtime, signature)) return;\n try {\n runtime.config.send(event);\n } catch {\n // transport must never throw into the host app\n }\n if (emitToReplay) {\n try {\n runtime.config.emitReplayEvent?.(event);\n } catch {\n // replay timeline emission is best-effort\n }\n }\n // Record the exception itself as a breadcrumb so a following error carries\n // the prior failure in its trail.\n addErrorBreadcrumb({\n category: \"exception\",\n message: `${event.type}: ${event.message}`,\n level: event.level,\n });\n}\n\n/**\n * Capture a handled exception. Mirrors Sentry's `captureException(err, ctx)`.\n * Safe to call before `configureTracking` has run — it simply no-ops if no\n * transport is installed yet.\n */\nexport function captureException(\n error: unknown,\n context: CaptureExceptionContext = {},\n): void {\n try {\n const runtime = getRuntime();\n const normalized = normalizeCapturedError(error);\n const event = buildEvent(runtime, normalized, {\n handled: true,\n level: context.level ?? \"error\",\n tags: coerceTags(context.tags),\n extra: coerceExtra(context.extra),\n });\n dispatch(runtime, event, true);\n } catch {\n // never throw from capture\n }\n}\n\n/**\n * Capture a message string as an exception-like event. Mirrors Sentry's\n * `captureMessage(message, level?)`.\n */\nexport function captureMessage(\n message: string,\n level: ExceptionLevel = \"info\",\n): void {\n try {\n const runtime = getRuntime();\n const event = buildEvent(\n runtime,\n { type: \"Message\", message: String(message ?? \"\") },\n { handled: true, level },\n );\n dispatch(runtime, event, true);\n } catch {\n // never throw from capture\n }\n}\n\n/**\n * Install auto-capture + wire the transport. Idempotent: re-invoking updates\n * the config (and (re)installs global handlers) without duplicating listeners.\n * Returns a disposer that removes the global handlers.\n */\nexport function installErrorCapture(\n options: InstallErrorCaptureOptions,\n): () => void {\n const runtime = getRuntime();\n runtime.config = {\n ...runtime.config,\n ...options,\n captureGlobalErrors: options.captureGlobalErrors ?? true,\n captureUnhandledRejections: options.captureUnhandledRejections ?? true,\n maxBreadcrumbs: options.maxBreadcrumbs ?? runtime.config.maxBreadcrumbs,\n dedupeWindowMs: options.dedupeWindowMs ?? runtime.config.dedupeWindowMs,\n };\n\n if (typeof window === \"undefined\") return () => {};\n\n installNavigationBreadcrumbs(runtime);\n\n // Tear down any previously-installed handlers before reinstalling so a second\n // configureTracking call doesn't double-report.\n runtime.removeHandlers?.();\n runtime.removeHandlers = null;\n\n const removers: Array<() => void> = [];\n\n if (runtime.config.captureGlobalErrors) {\n const onError = (event: ErrorEvent) => {\n try {\n const normalized = normalizeGlobalErrorEvent(event);\n if (shouldIgnoreAutoCapturedError(normalized)) return;\n // Global errors are already logged by the session replay recorder, so\n // don't re-emit them onto the replay timeline (avoid double-counting).\n dispatch(\n runtime,\n buildEvent(runtime, normalized, {\n handled: false,\n level: \"error\",\n }),\n false,\n );\n } catch {\n // never throw from the listener\n }\n };\n window.addEventListener(\"error\", onError as EventListener);\n removers.push(() =>\n window.removeEventListener(\"error\", onError as EventListener),\n );\n }\n\n if (runtime.config.captureUnhandledRejections) {\n const onRejection = (event: PromiseRejectionEvent) => {\n try {\n const reason = event?.reason;\n const normalized = normalizeCapturedError(reason);\n if (!normalized.type || normalized.type === \"Error\") {\n normalized.type = \"UnhandledRejection\";\n }\n if (shouldIgnoreAutoCapturedError(normalized)) return;\n dispatch(\n runtime,\n buildEvent(runtime, normalized, {\n handled: false,\n level: \"error\",\n }),\n false,\n );\n } catch {\n // never throw from the listener\n }\n };\n window.addEventListener(\"unhandledrejection\", onRejection as EventListener);\n removers.push(() =>\n window.removeEventListener(\n \"unhandledrejection\",\n onRejection as EventListener,\n ),\n );\n }\n\n runtime.installed = true;\n runtime.removeHandlers = () => {\n for (const remove of removers) {\n try {\n remove();\n } catch {\n // best-effort teardown\n }\n }\n runtime.removeHandlers = null;\n runtime.installed = false;\n };\n return runtime.removeHandlers;\n}\n\nexport function isErrorCaptureInstalled(): boolean {\n return getRuntime().installed;\n}\n"]}
|
|
@@ -6,5 +6,6 @@ export interface McpConnectionSuggestionProps {
|
|
|
6
6
|
variant?: McpConnectionSuggestionVariant;
|
|
7
7
|
integrations?: DefaultMcpIntegration[];
|
|
8
8
|
}
|
|
9
|
+
export declare function findMcpConnectionSuggestionIntegration({ text, contextText, variant, integrations, }: McpConnectionSuggestionProps): DefaultMcpIntegration | null;
|
|
9
10
|
export declare function McpConnectionSuggestion({ text, contextText, variant, integrations: integrationOptions, }: McpConnectionSuggestionProps): import("react").JSX.Element | null;
|
|
10
11
|
//# sourceMappingURL=McpConnectionSuggestion.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"McpConnectionSuggestion.d.ts","sourceRoot":"","sources":["../../../src/client/resources/McpConnectionSuggestion.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAOL,KAAK,qBAAqB,EAC3B,MAAM,8BAA8B,CAAC;AAQtC,MAAM,MAAM,8BAA8B,GAAG,UAAU,GAAG,UAAU,CAAC;AAErE,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,8BAA8B,CAAC;IACzC,YAAY,CAAC,EAAE,qBAAqB,EAAE,CAAC;CACxC;AA6CD,wBAAgB,uBAAuB,CAAC,EACtC,IAAI,EACJ,WAAgB,EAChB,OAAoB,EACpB,YAAY,EAAE,kBAAkB,GACjC,EAAE,4BAA4B,
|
|
1
|
+
{"version":3,"file":"McpConnectionSuggestion.d.ts","sourceRoot":"","sources":["../../../src/client/resources/McpConnectionSuggestion.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAOL,KAAK,qBAAqB,EAC3B,MAAM,8BAA8B,CAAC;AAQtC,MAAM,MAAM,8BAA8B,GAAG,UAAU,GAAG,UAAU,CAAC;AAErE,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,8BAA8B,CAAC;IACzC,YAAY,CAAC,EAAE,qBAAqB,EAAE,CAAC;CACxC;AAED,wBAAgB,sCAAsC,CAAC,EACrD,IAAI,EACJ,WAAgB,EAChB,OAAoB,EACpB,YAA0C,GAC3C,EAAE,4BAA4B,GAAG,qBAAqB,GAAG,IAAI,CAK7D;AA6CD,wBAAgB,uBAAuB,CAAC,EACtC,IAAI,EACJ,WAAgB,EAChB,OAAoB,EACpB,YAAY,EAAE,kBAAkB,GACjC,EAAE,4BAA4B,sCAwM9B"}
|
|
@@ -8,6 +8,9 @@ import { clearMcpConnectionResume, notifyMcpConnectionComplete, saveMcpConnectio
|
|
|
8
8
|
import { buildMcpOAuthStartUrl, findMcpIntegrationForText, getMcpIntegrationApiFallback, getDefaultMcpIntegrations, isMcpConnectionFailureText, navigateToMcpOAuthStart, } from "./mcp-integration-catalog.js";
|
|
9
9
|
import { McpIntegrationDialog } from "./McpIntegrationDialog.js";
|
|
10
10
|
import { useCreateMcpServer, useMcpServers, } from "./use-mcp-servers.js";
|
|
11
|
+
export function findMcpConnectionSuggestionIntegration({ text, contextText = "", variant = "composer", integrations = getDefaultMcpIntegrations(), }) {
|
|
12
|
+
return findMcpIntegrationForText(variant === "response" ? contextText : text, integrations);
|
|
13
|
+
}
|
|
11
14
|
function compareUrl(value) {
|
|
12
15
|
try {
|
|
13
16
|
const url = new URL(value.trim());
|
|
@@ -45,14 +48,12 @@ export function McpConnectionSuggestion({ text, contextText = "", variant = "com
|
|
|
45
48
|
const [connecting, setConnecting] = useState(false);
|
|
46
49
|
const [error, setError] = useState(null);
|
|
47
50
|
const integrations = useMemo(() => integrationOptions ?? getDefaultMcpIntegrations(), [integrationOptions]);
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
? null
|
|
55
|
-
: (textIntegration ?? contextIntegration);
|
|
51
|
+
const integration = useMemo(() => findMcpConnectionSuggestionIntegration({
|
|
52
|
+
text,
|
|
53
|
+
contextText,
|
|
54
|
+
variant,
|
|
55
|
+
integrations,
|
|
56
|
+
}), [contextText, integrations, text, variant]);
|
|
56
57
|
const apiFallback = integration
|
|
57
58
|
? getMcpIntegrationApiFallback(integration)
|
|
58
59
|
: null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"McpConnectionSuggestion.js","sourceRoot":"","sources":["../../../src/client/resources/McpConnectionSuggestion.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconArrowUpRight,\n IconLoader2,\n IconPlugConnected,\n IconX,\n} from \"@tabler/icons-react\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nimport { agentNativePath } from \"../api-path.js\";\nimport { openAgentSettings } from \"../CommandMenu.js\";\nimport { useT } from \"../i18n.js\";\nimport {\n clearMcpConnectionResume,\n notifyMcpConnectionComplete,\n saveMcpConnectionResume,\n} from \"./mcp-connection-resume.js\";\nimport {\n buildMcpOAuthStartUrl,\n findMcpIntegrationForText,\n getMcpIntegrationApiFallback,\n getDefaultMcpIntegrations,\n isMcpConnectionFailureText,\n navigateToMcpOAuthStart,\n type DefaultMcpIntegration,\n} from \"./mcp-integration-catalog.js\";\nimport { McpIntegrationDialog } from \"./McpIntegrationDialog.js\";\nimport {\n useCreateMcpServer,\n useMcpServers,\n type McpServer,\n} from \"./use-mcp-servers.js\";\n\nexport type McpConnectionSuggestionVariant = \"composer\" | \"response\";\n\nexport interface McpConnectionSuggestionProps {\n text: string;\n contextText?: string;\n variant?: McpConnectionSuggestionVariant;\n integrations?: DefaultMcpIntegration[];\n}\n\nfunction compareUrl(value: string): string {\n try {\n const url = new URL(value.trim());\n url.hash = \"\";\n return url.toString().replace(/\\/+$/, \"\");\n } catch {\n return value.trim().replace(/\\/+$/, \"\");\n }\n}\n\nfunction isConnected(\n integration: DefaultMcpIntegration,\n servers: McpServer[],\n): boolean {\n const targetUrl = compareUrl(integration.url);\n return servers.some(\n (server) =>\n server.status.state === \"connected\" &&\n compareUrl(server.url) === targetUrl,\n );\n}\n\nfunction returnUrl(): string {\n if (typeof window === \"undefined\") return \"/\";\n return (\n window.location.pathname + window.location.search + window.location.hash\n );\n}\n\nfunction canStartOAuth(integration: DefaultMcpIntegration): boolean {\n return (\n integration.authMode === \"oauth\" &&\n integration.connectionMode === \"oauth\" &&\n integration.availability === \"ready\"\n );\n}\n\nfunction hasApiFallback(\n apiFallback: DefaultMcpIntegration[\"apiFallback\"] | null,\n): boolean {\n return Boolean(apiFallback);\n}\n\nexport function McpConnectionSuggestion({\n text,\n contextText = \"\",\n variant = \"composer\",\n integrations: integrationOptions,\n}: McpConnectionSuggestionProps) {\n const t = useT();\n const mcpServersQuery = useMcpServers();\n const createMcpServer = useCreateMcpServer();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [dismissedId, setDismissedId] = useState<string | null>(null);\n const [connecting, setConnecting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const integrations = useMemo(\n () => integrationOptions ?? getDefaultMcpIntegrations(),\n [integrationOptions],\n );\n const textIntegration = useMemo(\n () => findMcpIntegrationForText(text, integrations),\n [integrations, text],\n );\n const contextIntegration = useMemo(\n () =>\n contextText ? findMcpIntegrationForText(contextText, integrations) : null,\n [contextText, integrations],\n );\n const integration =\n variant === \"response\" &&\n textIntegration &&\n contextIntegration &&\n textIntegration.id !== contextIntegration.id\n ? null\n : (textIntegration ?? contextIntegration);\n const apiFallback = integration\n ? getMcpIntegrationApiFallback(integration)\n : null;\n const servers = useMemo(\n () => [\n ...(mcpServersQuery.data?.user ?? []),\n ...(mcpServersQuery.data?.org ?? []),\n ],\n [mcpServersQuery.data],\n );\n const connected = integration ? isConnected(integration, servers) : false;\n const shouldSuggest =\n mcpServersQuery.isSuccess &&\n integration &&\n !connected &&\n dismissedId !== integration.id &&\n (variant === \"composer\" || isMcpConnectionFailureText(text));\n\n useEffect(() => {\n setError(null);\n setConnecting(false);\n }, [integration?.id, variant]);\n\n if (!shouldSuggest) return null;\n\n const connect = async () => {\n if (!integration || connecting) return;\n setError(null);\n\n if (apiFallback) {\n openAgentSettings(`secrets:${apiFallback.secretKey}`);\n return;\n }\n\n if (canStartOAuth(integration)) {\n setConnecting(true);\n saveMcpConnectionResume(variant === \"response\" ? contextText : text);\n navigateToMcpOAuthStart(\n agentNativePath(\n buildMcpOAuthStartUrl({\n name: integration.name,\n url: integration.url,\n description: integration.description,\n scope: \"user\",\n returnUrl: returnUrl(),\n }),\n ),\n );\n return;\n }\n\n if (\n integration.authMode === \"none\" &&\n integration.connectionMode === \"direct\"\n ) {\n saveMcpConnectionResume(variant === \"response\" ? contextText : text);\n setConnecting(true);\n try {\n await createMcpServer.mutateAsync({\n scope: \"user\",\n name: integration.name,\n url: integration.url,\n description: integration.description,\n });\n setDismissedId(integration.id);\n notifyMcpConnectionComplete();\n } catch (cause) {\n clearMcpConnectionResume();\n setError(\n cause instanceof Error ? cause.message : t(\"mcpIntegrations.failed\"),\n );\n } finally {\n setConnecting(false);\n }\n return;\n }\n\n saveMcpConnectionResume(variant === \"response\" ? contextText : text);\n setDialogOpen(true);\n };\n\n const actionLabel = hasApiFallback(apiFallback)\n ? t(\"mcpIntegrations.useApiToken\")\n : canStartOAuth(integration)\n ? t(\"mcpIntegrations.connectWithOAuth\")\n : integration.availability === \"client-restricted\" ||\n integration.availability === \"provider-setup\"\n ? t(\"mcpIntegrations.viewSetup\")\n : t(\"mcpIntegrations.connect\");\n\n return (\n <>\n <div\n className={\n variant === \"response\"\n ? \"mt-3 flex max-w-[520px] items-center gap-2 rounded-lg border border-primary/20 bg-primary/5 px-3 py-2 text-[12px]\"\n : \"mx-auto mb-2 flex w-[min(calc(100%_-_1.5rem),680px)] items-center gap-2 rounded-lg border border-primary/20 bg-primary/5 px-3 py-2 text-[12px]\"\n }\n data-mcp-connection-suggestion={integration.id}\n >\n <div className=\"relative flex h-6 w-6 shrink-0 items-center justify-center overflow-hidden rounded-md border border-border bg-background text-[10px] font-semibold text-muted-foreground\">\n <span aria-hidden=\"true\">{integration.name.slice(0, 1)}</span>\n {integration.logoUrl && (\n <img\n src={integration.logoUrl}\n alt=\"\"\n className=\"absolute h-5 w-5 object-contain\"\n onError={(event) => {\n event.currentTarget.hidden = true;\n }}\n />\n )}\n </div>\n <span className=\"min-w-0 flex-1 leading-snug text-foreground\">\n {t(\n hasApiFallback(apiFallback)\n ? \"mcpIntegrations.connectSuggestionWithApiToken\"\n : \"mcpIntegrations.connectSuggestion\",\n { name: integration.name },\n )}\n </span>\n <button\n type=\"button\"\n onClick={() => void connect()}\n disabled={connecting}\n aria-busy={connecting}\n className=\"inline-flex shrink-0 items-center gap-1 rounded-md bg-primary px-2.5 py-1.5 text-[11px] font-medium text-primary-foreground hover:bg-primary/90 disabled:pointer-events-none disabled:opacity-60\"\n >\n {connecting && <IconLoader2 className=\"h-3 w-3 animate-spin\" />}\n {!connecting &&\n canStartOAuth(integration) &&\n !hasApiFallback(apiFallback) && (\n <IconPlugConnected className=\"h-3 w-3\" />\n )}\n {!connecting && hasApiFallback(apiFallback) && (\n <IconPlugConnected className=\"h-3 w-3\" />\n )}\n {actionLabel}\n {!connecting &&\n !canStartOAuth(integration) &&\n !hasApiFallback(apiFallback) && (\n <IconArrowUpRight className=\"h-3 w-3\" />\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => setDismissedId(integration.id)}\n className=\"inline-flex h-6 w-6 shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-background hover:text-foreground\"\n aria-label={t(\"mcpIntegrations.dismissSuggestion\")}\n >\n <IconX className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n {error && (\n <div className=\"mx-auto mb-2 w-[min(100%,680px)] text-[11px] text-destructive\">\n {error}\n </div>\n )}\n <McpIntegrationDialog\n open={dialogOpen}\n onOpenChange={(open) => {\n setDialogOpen(open);\n if (!open) clearMcpConnectionResume();\n }}\n initialIntegrationId={integration.id}\n defaultScope=\"user\"\n canCreateOrgMcp={false}\n hasOrg={Boolean(mcpServersQuery.data?.orgId)}\n onCreateMcpServer={(args) => createMcpServer.mutateAsync(args)}\n onCreated={() => {\n setDismissedId(integration.id);\n saveMcpConnectionResume(variant === \"response\" ? contextText : text);\n notifyMcpConnectionComplete();\n }}\n integrations={integrations}\n />\n </>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"McpConnectionSuggestion.js","sourceRoot":"","sources":["../../../src/client/resources/McpConnectionSuggestion.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconArrowUpRight,\n IconLoader2,\n IconPlugConnected,\n IconX,\n} from \"@tabler/icons-react\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nimport { agentNativePath } from \"../api-path.js\";\nimport { openAgentSettings } from \"../CommandMenu.js\";\nimport { useT } from \"../i18n.js\";\nimport {\n clearMcpConnectionResume,\n notifyMcpConnectionComplete,\n saveMcpConnectionResume,\n} from \"./mcp-connection-resume.js\";\nimport {\n buildMcpOAuthStartUrl,\n findMcpIntegrationForText,\n getMcpIntegrationApiFallback,\n getDefaultMcpIntegrations,\n isMcpConnectionFailureText,\n navigateToMcpOAuthStart,\n type DefaultMcpIntegration,\n} from \"./mcp-integration-catalog.js\";\nimport { McpIntegrationDialog } from \"./McpIntegrationDialog.js\";\nimport {\n useCreateMcpServer,\n useMcpServers,\n type McpServer,\n} from \"./use-mcp-servers.js\";\n\nexport type McpConnectionSuggestionVariant = \"composer\" | \"response\";\n\nexport interface McpConnectionSuggestionProps {\n text: string;\n contextText?: string;\n variant?: McpConnectionSuggestionVariant;\n integrations?: DefaultMcpIntegration[];\n}\n\nexport function findMcpConnectionSuggestionIntegration({\n text,\n contextText = \"\",\n variant = \"composer\",\n integrations = getDefaultMcpIntegrations(),\n}: McpConnectionSuggestionProps): DefaultMcpIntegration | null {\n return findMcpIntegrationForText(\n variant === \"response\" ? contextText : text,\n integrations,\n );\n}\n\nfunction compareUrl(value: string): string {\n try {\n const url = new URL(value.trim());\n url.hash = \"\";\n return url.toString().replace(/\\/+$/, \"\");\n } catch {\n return value.trim().replace(/\\/+$/, \"\");\n }\n}\n\nfunction isConnected(\n integration: DefaultMcpIntegration,\n servers: McpServer[],\n): boolean {\n const targetUrl = compareUrl(integration.url);\n return servers.some(\n (server) =>\n server.status.state === \"connected\" &&\n compareUrl(server.url) === targetUrl,\n );\n}\n\nfunction returnUrl(): string {\n if (typeof window === \"undefined\") return \"/\";\n return (\n window.location.pathname + window.location.search + window.location.hash\n );\n}\n\nfunction canStartOAuth(integration: DefaultMcpIntegration): boolean {\n return (\n integration.authMode === \"oauth\" &&\n integration.connectionMode === \"oauth\" &&\n integration.availability === \"ready\"\n );\n}\n\nfunction hasApiFallback(\n apiFallback: DefaultMcpIntegration[\"apiFallback\"] | null,\n): boolean {\n return Boolean(apiFallback);\n}\n\nexport function McpConnectionSuggestion({\n text,\n contextText = \"\",\n variant = \"composer\",\n integrations: integrationOptions,\n}: McpConnectionSuggestionProps) {\n const t = useT();\n const mcpServersQuery = useMcpServers();\n const createMcpServer = useCreateMcpServer();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [dismissedId, setDismissedId] = useState<string | null>(null);\n const [connecting, setConnecting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const integrations = useMemo(\n () => integrationOptions ?? getDefaultMcpIntegrations(),\n [integrationOptions],\n );\n const integration = useMemo(\n () =>\n findMcpConnectionSuggestionIntegration({\n text,\n contextText,\n variant,\n integrations,\n }),\n [contextText, integrations, text, variant],\n );\n const apiFallback = integration\n ? getMcpIntegrationApiFallback(integration)\n : null;\n const servers = useMemo(\n () => [\n ...(mcpServersQuery.data?.user ?? []),\n ...(mcpServersQuery.data?.org ?? []),\n ],\n [mcpServersQuery.data],\n );\n const connected = integration ? isConnected(integration, servers) : false;\n const shouldSuggest =\n mcpServersQuery.isSuccess &&\n integration &&\n !connected &&\n dismissedId !== integration.id &&\n (variant === \"composer\" || isMcpConnectionFailureText(text));\n\n useEffect(() => {\n setError(null);\n setConnecting(false);\n }, [integration?.id, variant]);\n\n if (!shouldSuggest) return null;\n\n const connect = async () => {\n if (!integration || connecting) return;\n setError(null);\n\n if (apiFallback) {\n openAgentSettings(`secrets:${apiFallback.secretKey}`);\n return;\n }\n\n if (canStartOAuth(integration)) {\n setConnecting(true);\n saveMcpConnectionResume(variant === \"response\" ? contextText : text);\n navigateToMcpOAuthStart(\n agentNativePath(\n buildMcpOAuthStartUrl({\n name: integration.name,\n url: integration.url,\n description: integration.description,\n scope: \"user\",\n returnUrl: returnUrl(),\n }),\n ),\n );\n return;\n }\n\n if (\n integration.authMode === \"none\" &&\n integration.connectionMode === \"direct\"\n ) {\n saveMcpConnectionResume(variant === \"response\" ? contextText : text);\n setConnecting(true);\n try {\n await createMcpServer.mutateAsync({\n scope: \"user\",\n name: integration.name,\n url: integration.url,\n description: integration.description,\n });\n setDismissedId(integration.id);\n notifyMcpConnectionComplete();\n } catch (cause) {\n clearMcpConnectionResume();\n setError(\n cause instanceof Error ? cause.message : t(\"mcpIntegrations.failed\"),\n );\n } finally {\n setConnecting(false);\n }\n return;\n }\n\n saveMcpConnectionResume(variant === \"response\" ? contextText : text);\n setDialogOpen(true);\n };\n\n const actionLabel = hasApiFallback(apiFallback)\n ? t(\"mcpIntegrations.useApiToken\")\n : canStartOAuth(integration)\n ? t(\"mcpIntegrations.connectWithOAuth\")\n : integration.availability === \"client-restricted\" ||\n integration.availability === \"provider-setup\"\n ? t(\"mcpIntegrations.viewSetup\")\n : t(\"mcpIntegrations.connect\");\n\n return (\n <>\n <div\n className={\n variant === \"response\"\n ? \"mt-3 flex max-w-[520px] items-center gap-2 rounded-lg border border-primary/20 bg-primary/5 px-3 py-2 text-[12px]\"\n : \"mx-auto mb-2 flex w-[min(calc(100%_-_1.5rem),680px)] items-center gap-2 rounded-lg border border-primary/20 bg-primary/5 px-3 py-2 text-[12px]\"\n }\n data-mcp-connection-suggestion={integration.id}\n >\n <div className=\"relative flex h-6 w-6 shrink-0 items-center justify-center overflow-hidden rounded-md border border-border bg-background text-[10px] font-semibold text-muted-foreground\">\n <span aria-hidden=\"true\">{integration.name.slice(0, 1)}</span>\n {integration.logoUrl && (\n <img\n src={integration.logoUrl}\n alt=\"\"\n className=\"absolute h-5 w-5 object-contain\"\n onError={(event) => {\n event.currentTarget.hidden = true;\n }}\n />\n )}\n </div>\n <span className=\"min-w-0 flex-1 leading-snug text-foreground\">\n {t(\n hasApiFallback(apiFallback)\n ? \"mcpIntegrations.connectSuggestionWithApiToken\"\n : \"mcpIntegrations.connectSuggestion\",\n { name: integration.name },\n )}\n </span>\n <button\n type=\"button\"\n onClick={() => void connect()}\n disabled={connecting}\n aria-busy={connecting}\n className=\"inline-flex shrink-0 items-center gap-1 rounded-md bg-primary px-2.5 py-1.5 text-[11px] font-medium text-primary-foreground hover:bg-primary/90 disabled:pointer-events-none disabled:opacity-60\"\n >\n {connecting && <IconLoader2 className=\"h-3 w-3 animate-spin\" />}\n {!connecting &&\n canStartOAuth(integration) &&\n !hasApiFallback(apiFallback) && (\n <IconPlugConnected className=\"h-3 w-3\" />\n )}\n {!connecting && hasApiFallback(apiFallback) && (\n <IconPlugConnected className=\"h-3 w-3\" />\n )}\n {actionLabel}\n {!connecting &&\n !canStartOAuth(integration) &&\n !hasApiFallback(apiFallback) && (\n <IconArrowUpRight className=\"h-3 w-3\" />\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => setDismissedId(integration.id)}\n className=\"inline-flex h-6 w-6 shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-background hover:text-foreground\"\n aria-label={t(\"mcpIntegrations.dismissSuggestion\")}\n >\n <IconX className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n {error && (\n <div className=\"mx-auto mb-2 w-[min(100%,680px)] text-[11px] text-destructive\">\n {error}\n </div>\n )}\n <McpIntegrationDialog\n open={dialogOpen}\n onOpenChange={(open) => {\n setDialogOpen(open);\n if (!open) clearMcpConnectionResume();\n }}\n initialIntegrationId={integration.id}\n defaultScope=\"user\"\n canCreateOrgMcp={false}\n hasOrg={Boolean(mcpServersQuery.data?.orgId)}\n onCreateMcpServer={(args) => createMcpServer.mutateAsync(args)}\n onCreated={() => {\n setDismissedId(integration.id);\n saveMcpConnectionResume(variant === \"response\" ? contextText : text);\n notifyMcpConnectionComplete();\n }}\n integrations={integrations}\n />\n </>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourcesPanel.d.ts","sourceRoot":"","sources":["../../../src/client/resources/ResourcesPanel.tsx"],"names":[],"mappings":"AAeA,OAAO,KAMN,MAAM,OAAO,CAAC;AA0Bf,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,8BAA8B,CAAC;AAgBtC,OAAO,EAQL,KAAK,aAAa,EAGlB,KAAK,QAAQ,EACd,MAAM,oBAAoB,CAAC;AAI5B,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK9D;AAsCD,MAAM,MAAM,YAAY,GACpB,OAAO,GACP,cAAc,GACd,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,WAAW,GACX,eAAe,CAAC;AAEpB,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,YAAY,CAAC;AAuCxD,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,QAAQ,EAAE,EAChB,IAAI,EAAE,YAAY,GAAG,SAAS,GAC7B,QAAQ,EAAE,CAoBZ;
|
|
1
|
+
{"version":3,"file":"ResourcesPanel.d.ts","sourceRoot":"","sources":["../../../src/client/resources/ResourcesPanel.tsx"],"names":[],"mappings":"AAeA,OAAO,KAMN,MAAM,OAAO,CAAC;AA0Bf,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,8BAA8B,CAAC;AAgBtC,OAAO,EAQL,KAAK,aAAa,EAGlB,KAAK,QAAQ,EACd,MAAM,oBAAoB,CAAC;AAI5B,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK9D;AAsCD,MAAM,MAAM,YAAY,GACpB,OAAO,GACP,cAAc,GACd,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,WAAW,GACX,eAAe,CAAC;AAEpB,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,YAAY,CAAC;AAuCxD,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,QAAQ,EAAE,EAChB,IAAI,EAAE,YAAY,GAAG,SAAS,GAC7B,QAAQ,EAAE,CAoBZ;AAu8BD,MAAM,WAAW,mBAAmB;IAClC,0EAA0E;IAC1E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mEAAmE;IACnE,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,8EAA8E;IAC9E,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,8DAA8D;IAC9D,cAAc,CAAC,EAAE,YAAY,CAAC;IAC9B,yEAAyE;IACzE,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,6CAA6C;IAC7C,eAAe,CAAC,EAAE,qBAAqB,EAAE,CAAC;CAC3C;AAED,wBAAgB,2BAA2B,CACzC,cAAc,EAAE,aAAa,GAAG,SAAS,EACzC,UAAU,EAAE,OAAO,GAClB,aAAa,CAIf;AAED,wBAAgB,cAAc,CAAC,EAC7B,cAAqB,EACrB,KAAK,EAAE,cAAc,EACrB,sBAA8B,EAC9B,cAAc,EACd,mBAA4B,EAC5B,eAAe,GAChB,GAAE,mBAAwB,qBAu1B1B"}
|
|
@@ -168,7 +168,9 @@ function CreateMenu({ scope, resourceFilter, onCreateFile, onCreateResource, onC
|
|
|
168
168
|
window.clearTimeout(skillFlyoutCloseTimerRef.current);
|
|
169
169
|
skillFlyoutCloseTimerRef.current = null;
|
|
170
170
|
}
|
|
171
|
-
if (rowEl &&
|
|
171
|
+
if (rowEl &&
|
|
172
|
+
typeof window !== "undefined" &&
|
|
173
|
+
typeof rowEl.getBoundingClientRect === "function") {
|
|
172
174
|
const rect = rowEl.getBoundingClientRect();
|
|
173
175
|
const FLYOUT_WIDTH = 248;
|
|
174
176
|
setSkillFlyoutSide(window.innerWidth - rect.right < FLYOUT_WIDTH ? "left" : "right");
|