@agent-native/core 0.118.0 → 0.118.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +21 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/a2a/client.ts +32 -10
- 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 +24 -9
- 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/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/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 +1 -1
- package/corpus/core/src/mcp-client/oauth-routes.ts +45 -12
- package/corpus/core/src/server/realtime-voice.ts +4 -1
- 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/server/lib/public-agent-context.ts +2 -2
- 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/client.d.ts +3 -1
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +17 -12
- package/dist/a2a/client.js.map +1 -1
- package/dist/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 +13 -9
- 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/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/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/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +1 -1
- package/dist/deploy/build.js.map +1 -1
- package/dist/guards/db-tool-scoping.js +1 -1
- package/dist/guards/db-tool-scoping.js.map +1 -1
- package/dist/integrations/adapters/slack.d.ts +1 -0
- package/dist/integrations/adapters/slack.d.ts.map +1 -1
- package/dist/integrations/adapters/slack.js +61 -5
- package/dist/integrations/adapters/slack.js.map +1 -1
- package/dist/integrations/index.d.ts +1 -1
- package/dist/integrations/index.d.ts.map +1 -1
- package/dist/integrations/index.js +1 -1
- package/dist/integrations/index.js.map +1 -1
- package/dist/localization/default-messages.js +1 -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/notifications/routes.d.ts +2 -2
- 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/secrets/routes.d.ts +6 -6
- 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/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/package.json +2 -2
- package/src/a2a/client.ts +32 -10
- 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 +24 -9
- package/src/client/chat/widgets/InlineExtensionWidget.tsx +0 -1
- package/src/client/chat/widgets/builtin-tool-renderers.tsx +7 -3
- 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/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 +1 -1
- package/src/mcp-client/oauth-routes.ts +45 -12
- package/src/server/realtime-voice.ts +4 -1
- 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/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
|
@@ -4,10 +4,11 @@ import type { OAuthClientInformationMixed } from "@modelcontextprotocol/sdk/shar
|
|
|
4
4
|
import {
|
|
5
5
|
deleteCookie,
|
|
6
6
|
defineEventHandler,
|
|
7
|
+
getChunkedCookie,
|
|
7
8
|
getCookie,
|
|
8
9
|
getMethod,
|
|
9
10
|
getQuery,
|
|
10
|
-
|
|
11
|
+
setChunkedCookie,
|
|
11
12
|
setResponseStatus,
|
|
12
13
|
type H3Event,
|
|
13
14
|
} from "h3";
|
|
@@ -32,6 +33,9 @@ import {
|
|
|
32
33
|
|
|
33
34
|
const FLOW_COOKIE = "an_mcp_oauth_flow";
|
|
34
35
|
const FLOW_TTL_SECONDS = 10 * 60;
|
|
36
|
+
const FLOW_COOKIE_CHUNK_SIZE = 2_800;
|
|
37
|
+
const FLOW_COOKIE_MAX_CHUNKS = 8;
|
|
38
|
+
const CHUNKED_COOKIE_PREFIX = "__chunked__";
|
|
35
39
|
|
|
36
40
|
export interface McpOAuthFlow {
|
|
37
41
|
name: string;
|
|
@@ -189,13 +193,7 @@ async function handleMcpOAuthStart(
|
|
|
189
193
|
...(safeReturnUrl ? { returnUrl: safeReturnUrl } : {}),
|
|
190
194
|
expiresAt: Date.now() + FLOW_TTL_SECONDS * 1_000,
|
|
191
195
|
};
|
|
192
|
-
|
|
193
|
-
httpOnly: true,
|
|
194
|
-
secure: redirectUri.startsWith("https://"),
|
|
195
|
-
sameSite: "lax",
|
|
196
|
-
path: "/",
|
|
197
|
-
maxAge: FLOW_TTL_SECONDS,
|
|
198
|
-
});
|
|
196
|
+
setMcpOAuthFlowCookie(event, flow, redirectUri.startsWith("https://"));
|
|
199
197
|
return redirectWithStagedCookies(event, started.authorizationUrl.href);
|
|
200
198
|
} catch {
|
|
201
199
|
setResponseStatus(event, 400);
|
|
@@ -217,8 +215,8 @@ async function handleMcpOAuthCallback(
|
|
|
217
215
|
const code = text(query.code);
|
|
218
216
|
const state = text(query.state);
|
|
219
217
|
const providerError = text(query.error);
|
|
220
|
-
const flow =
|
|
221
|
-
|
|
218
|
+
const flow = readMcpOAuthFlowCookie(event);
|
|
219
|
+
clearMcpOAuthFlowCookies(event);
|
|
222
220
|
if (providerError || !code || !state) {
|
|
223
221
|
setResponseStatus(event, 400);
|
|
224
222
|
return { error: "MCP OAuth authorization was not completed." };
|
|
@@ -275,8 +273,36 @@ async function handleMcpOAuthCallback(
|
|
|
275
273
|
}
|
|
276
274
|
}
|
|
277
275
|
|
|
278
|
-
function
|
|
279
|
-
|
|
276
|
+
export function setMcpOAuthFlowCookie(
|
|
277
|
+
event: H3Event,
|
|
278
|
+
flow: McpOAuthFlow,
|
|
279
|
+
secure: boolean,
|
|
280
|
+
): void {
|
|
281
|
+
const encrypted = encryptSecretValue(JSON.stringify(flow));
|
|
282
|
+
const chunkCount = Math.ceil(encrypted.length / FLOW_COOKIE_CHUNK_SIZE);
|
|
283
|
+
if (chunkCount > FLOW_COOKIE_MAX_CHUNKS) {
|
|
284
|
+
throw new Error("MCP OAuth flow state exceeds the cookie size limit.");
|
|
285
|
+
}
|
|
286
|
+
setChunkedCookie(event, FLOW_COOKIE, encrypted, {
|
|
287
|
+
httpOnly: true,
|
|
288
|
+
secure,
|
|
289
|
+
sameSite: "lax",
|
|
290
|
+
path: "/",
|
|
291
|
+
maxAge: FLOW_TTL_SECONDS,
|
|
292
|
+
chunkMaxLength: FLOW_COOKIE_CHUNK_SIZE,
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
export function readMcpOAuthFlowCookie(event: H3Event): McpOAuthFlow | null {
|
|
297
|
+
const primaryCookie = getCookie(event, FLOW_COOKIE);
|
|
298
|
+
if (!primaryCookie) return null;
|
|
299
|
+
if (primaryCookie.startsWith(CHUNKED_COOKIE_PREFIX)) {
|
|
300
|
+
const rawCount = primaryCookie.slice(CHUNKED_COOKIE_PREFIX.length);
|
|
301
|
+
if (!/^\d+$/.test(rawCount)) return null;
|
|
302
|
+
const chunkCount = Number(rawCount);
|
|
303
|
+
if (chunkCount < 2 || chunkCount > FLOW_COOKIE_MAX_CHUNKS) return null;
|
|
304
|
+
}
|
|
305
|
+
const encrypted = getChunkedCookie(event, FLOW_COOKIE);
|
|
280
306
|
if (!encrypted) return null;
|
|
281
307
|
try {
|
|
282
308
|
const parsed = JSON.parse(decryptSecretValue(encrypted)) as McpOAuthFlow;
|
|
@@ -286,6 +312,13 @@ function readFlow(event: H3Event): McpOAuthFlow | null {
|
|
|
286
312
|
}
|
|
287
313
|
}
|
|
288
314
|
|
|
315
|
+
export function clearMcpOAuthFlowCookies(event: H3Event): void {
|
|
316
|
+
deleteCookie(event, FLOW_COOKIE, { path: "/" });
|
|
317
|
+
for (let index = 1; index <= FLOW_COOKIE_MAX_CHUNKS; index += 1) {
|
|
318
|
+
deleteCookie(event, `${FLOW_COOKIE}.${index}`, { path: "/" });
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
289
322
|
export function isValidMcpOAuthFlow(
|
|
290
323
|
flow: McpOAuthFlow,
|
|
291
324
|
email: string,
|
|
@@ -201,7 +201,10 @@ export function resolveRealtimeVoiceReasoningEffort(
|
|
|
201
201
|
): "minimal" | "low" | "medium" {
|
|
202
202
|
const normalized = value?.trim().toLowerCase();
|
|
203
203
|
return normalized &&
|
|
204
|
-
Object.
|
|
204
|
+
Object.prototype.hasOwnProperty.call(
|
|
205
|
+
REALTIME_VOICE_REASONING_EFFORT,
|
|
206
|
+
normalized,
|
|
207
|
+
)
|
|
205
208
|
? REALTIME_VOICE_REASONING_EFFORT[
|
|
206
209
|
normalized as keyof typeof REALTIME_VOICE_REASONING_EFFORT
|
|
207
210
|
]
|
package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md
CHANGED
|
@@ -57,11 +57,13 @@ action before requesting microphone permission.
|
|
|
57
57
|
controls contain only settings and the separate end-session action.
|
|
58
58
|
- The orb's compact waveform stays visible for the full session and reflects
|
|
59
59
|
actual microphone or assistant audio activity. At silence it rests at its
|
|
60
|
-
baseline instead of turning into a loading spinner.
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
60
|
+
baseline instead of turning into a loading spinner. Once connected, a soft,
|
|
61
|
+
slowly rotating blue glow marks the live session; brighten and speed up the
|
|
62
|
+
glow while the agent is working, and keep it static under reduced motion.
|
|
63
|
+
While connecting, show a distinct compact spinner; when the session becomes
|
|
64
|
+
live, the assistant gives one brief spoken greeting so readiness is
|
|
65
|
+
unambiguous. Do not apply a text-sized `max_output_tokens` cap to that audio
|
|
66
|
+
greeting because audio tokens can truncate it mid-sentence.
|
|
65
67
|
- The orb settings cog opens in place without ending voice mode or navigating
|
|
66
68
|
away. Nested pickers must not dismiss the settings popover. Language and
|
|
67
69
|
intelligence update the active Realtime session; the microphone picker swaps
|
|
@@ -42,7 +42,7 @@ export const CLI_REGISTRY: Record<string, CliEntry> = {
|
|
|
42
42
|
|
|
43
43
|
/** Check if a command name is in the CLI_REGISTRY allowlist */
|
|
44
44
|
export function isAllowedCommand(cmd: string): boolean {
|
|
45
|
-
return Object.
|
|
45
|
+
return Object.prototype.hasOwnProperty.call(CLI_REGISTRY, cmd);
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
/** Check if a CLI command exists on PATH (safe — no shell interpolation) */
|
|
@@ -732,7 +732,6 @@ function findCorePackageRoot(cwd: string): string | null {
|
|
|
732
732
|
const candidates = [
|
|
733
733
|
path.resolve(cwd, "../../packages/core"), // templates/<name>/
|
|
734
734
|
path.resolve(cwd, "../core"), // packages/<name>/
|
|
735
|
-
path.resolve(cwd, "node_modules/@agent-native/core"),
|
|
736
735
|
];
|
|
737
736
|
for (const candidate of candidates) {
|
|
738
737
|
try {
|
|
@@ -2315,6 +2314,165 @@ function portExposer(): Plugin {
|
|
|
2315
2314
|
};
|
|
2316
2315
|
}
|
|
2317
2316
|
|
|
2317
|
+
function isNitroEnvironmentUnavailable(error: unknown): boolean {
|
|
2318
|
+
const candidate = error as {
|
|
2319
|
+
name?: unknown;
|
|
2320
|
+
status?: unknown;
|
|
2321
|
+
statusCode?: unknown;
|
|
2322
|
+
message?: unknown;
|
|
2323
|
+
};
|
|
2324
|
+
return (
|
|
2325
|
+
candidate?.name === "NitroViteError" &&
|
|
2326
|
+
(candidate.status === 503 || candidate.statusCode === 503) &&
|
|
2327
|
+
typeof candidate.message === "string" &&
|
|
2328
|
+
/Vite environment .+ is unavailable/.test(candidate.message)
|
|
2329
|
+
);
|
|
2330
|
+
}
|
|
2331
|
+
|
|
2332
|
+
type NitroModuleNode = {
|
|
2333
|
+
id: string | null;
|
|
2334
|
+
ssrError?: Error | null;
|
|
2335
|
+
transformResult: unknown | null;
|
|
2336
|
+
};
|
|
2337
|
+
|
|
2338
|
+
type NitroModuleGraph = {
|
|
2339
|
+
idToModuleMap: Map<string, NitroModuleNode>;
|
|
2340
|
+
};
|
|
2341
|
+
|
|
2342
|
+
const NITRO_STARTUP_SETTLE_MS = 1_000;
|
|
2343
|
+
const NITRO_STARTUP_TIMEOUT_MS = 30_000;
|
|
2344
|
+
|
|
2345
|
+
function nitroModuleGraphSignature(environment: unknown): string | null {
|
|
2346
|
+
const graph = (environment as { moduleGraph?: NitroModuleGraph } | undefined)
|
|
2347
|
+
?.moduleGraph;
|
|
2348
|
+
if (!graph) return null;
|
|
2349
|
+
|
|
2350
|
+
const modules = [...graph.idToModuleMap.values()];
|
|
2351
|
+
const entry = modules.find((module) =>
|
|
2352
|
+
module.id
|
|
2353
|
+
?.replaceAll("\\", "/")
|
|
2354
|
+
.endsWith("/nitro/dist/runtime/internal/vite/dev-entry.mjs"),
|
|
2355
|
+
);
|
|
2356
|
+
if (!entry?.transformResult && !entry?.ssrError) return null;
|
|
2357
|
+
|
|
2358
|
+
let transformed = 0;
|
|
2359
|
+
let errors = 0;
|
|
2360
|
+
for (const module of modules) {
|
|
2361
|
+
if (module.transformResult) transformed += 1;
|
|
2362
|
+
if (module.ssrError) errors += 1;
|
|
2363
|
+
}
|
|
2364
|
+
return `${modules.length}:${transformed}:${errors}`;
|
|
2365
|
+
}
|
|
2366
|
+
|
|
2367
|
+
function isHtmlDocumentRequest(req: IncomingMessage): boolean {
|
|
2368
|
+
return (
|
|
2369
|
+
(req.method === "GET" || req.method === "HEAD") &&
|
|
2370
|
+
(req.headers.accept ?? "").includes("text/html")
|
|
2371
|
+
);
|
|
2372
|
+
}
|
|
2373
|
+
|
|
2374
|
+
function sendNitroStartingResponse(
|
|
2375
|
+
req: IncomingMessage,
|
|
2376
|
+
res: ServerResponse,
|
|
2377
|
+
): void {
|
|
2378
|
+
res.statusCode = 503;
|
|
2379
|
+
res.setHeader("cache-control", "no-store");
|
|
2380
|
+
res.setHeader("content-type", "text/html; charset=utf-8");
|
|
2381
|
+
res.setHeader("retry-after", "1");
|
|
2382
|
+
if (req.method === "HEAD") {
|
|
2383
|
+
res.end();
|
|
2384
|
+
return;
|
|
2385
|
+
}
|
|
2386
|
+
res.end(
|
|
2387
|
+
'<!doctype html><html><head><meta charset="utf-8"><meta http-equiv="refresh" content="0.25"><title>Starting…</title></head><body></body></html>',
|
|
2388
|
+
);
|
|
2389
|
+
}
|
|
2390
|
+
|
|
2391
|
+
function nitroStartupGate(
|
|
2392
|
+
options: {
|
|
2393
|
+
now?: () => number;
|
|
2394
|
+
settleMs?: number;
|
|
2395
|
+
timeoutMs?: number;
|
|
2396
|
+
} = {},
|
|
2397
|
+
): Plugin {
|
|
2398
|
+
return {
|
|
2399
|
+
name: "agent-native-nitro-startup-gate",
|
|
2400
|
+
apply: "serve",
|
|
2401
|
+
enforce: "pre",
|
|
2402
|
+
configureServer(server) {
|
|
2403
|
+
const now = options.now ?? Date.now;
|
|
2404
|
+
const settleMs = options.settleMs ?? NITRO_STARTUP_SETTLE_MS;
|
|
2405
|
+
const timeoutMs = options.timeoutMs ?? NITRO_STARTUP_TIMEOUT_MS;
|
|
2406
|
+
const startedAt = now();
|
|
2407
|
+
let graphSignature: string | null = null;
|
|
2408
|
+
let graphStableAt: number | undefined;
|
|
2409
|
+
let startupComplete = false;
|
|
2410
|
+
|
|
2411
|
+
server.middlewares.use((req, res, next) => {
|
|
2412
|
+
if (startupComplete || !isHtmlDocumentRequest(req)) {
|
|
2413
|
+
next();
|
|
2414
|
+
return;
|
|
2415
|
+
}
|
|
2416
|
+
|
|
2417
|
+
const timestamp = now();
|
|
2418
|
+
if (timestamp - startedAt >= timeoutMs) {
|
|
2419
|
+
startupComplete = true;
|
|
2420
|
+
next();
|
|
2421
|
+
return;
|
|
2422
|
+
}
|
|
2423
|
+
|
|
2424
|
+
const nextGraphSignature = nitroModuleGraphSignature(
|
|
2425
|
+
server.environments?.nitro,
|
|
2426
|
+
);
|
|
2427
|
+
if (nextGraphSignature) {
|
|
2428
|
+
if (nextGraphSignature !== graphSignature) {
|
|
2429
|
+
graphSignature = nextGraphSignature;
|
|
2430
|
+
graphStableAt = timestamp;
|
|
2431
|
+
} else if (
|
|
2432
|
+
graphStableAt !== undefined &&
|
|
2433
|
+
timestamp - graphStableAt >= settleMs
|
|
2434
|
+
) {
|
|
2435
|
+
startupComplete = true;
|
|
2436
|
+
next();
|
|
2437
|
+
return;
|
|
2438
|
+
}
|
|
2439
|
+
} else {
|
|
2440
|
+
graphSignature = null;
|
|
2441
|
+
graphStableAt = undefined;
|
|
2442
|
+
}
|
|
2443
|
+
|
|
2444
|
+
sendNitroStartingResponse(req, res);
|
|
2445
|
+
});
|
|
2446
|
+
},
|
|
2447
|
+
};
|
|
2448
|
+
}
|
|
2449
|
+
|
|
2450
|
+
function nitroStartupRecovery(): Plugin {
|
|
2451
|
+
return {
|
|
2452
|
+
name: "agent-native-nitro-startup-recovery",
|
|
2453
|
+
apply: "serve",
|
|
2454
|
+
configureServer(server) {
|
|
2455
|
+
server.middlewares.use(function nitroStartupErrorRecovery(
|
|
2456
|
+
error: unknown,
|
|
2457
|
+
req: IncomingMessage,
|
|
2458
|
+
res: ServerResponse,
|
|
2459
|
+
next: (error?: unknown) => void,
|
|
2460
|
+
) {
|
|
2461
|
+
if (
|
|
2462
|
+
!isNitroEnvironmentUnavailable(error) ||
|
|
2463
|
+
!isHtmlDocumentRequest(req) ||
|
|
2464
|
+
res.headersSent
|
|
2465
|
+
) {
|
|
2466
|
+
next(error);
|
|
2467
|
+
return;
|
|
2468
|
+
}
|
|
2469
|
+
|
|
2470
|
+
sendNitroStartingResponse(req, res);
|
|
2471
|
+
});
|
|
2472
|
+
},
|
|
2473
|
+
};
|
|
2474
|
+
}
|
|
2475
|
+
|
|
2318
2476
|
/**
|
|
2319
2477
|
* Silence benign connection-reset noise from Vite's dev middleware.
|
|
2320
2478
|
* Fires when a browser closes/reloads/navigates mid-request — the peer has
|
|
@@ -2693,6 +2851,7 @@ function createAgentNativePlugins(
|
|
|
2693
2851
|
embedDevFrameHeaders(),
|
|
2694
2852
|
baseRedirectGuard(),
|
|
2695
2853
|
portExposer(),
|
|
2854
|
+
nitroStartupGate(),
|
|
2696
2855
|
silenceConnectionResets(),
|
|
2697
2856
|
rolldownInputFix(),
|
|
2698
2857
|
// Nitro Vite plugin for dev-mode API route serving and HMR.
|
|
@@ -2702,6 +2861,9 @@ function createAgentNativePlugins(
|
|
|
2702
2861
|
: includeNitro
|
|
2703
2862
|
? [nitroPlugin]
|
|
2704
2863
|
: []),
|
|
2864
|
+
// Nitro can reject the first document request while its Vite environment
|
|
2865
|
+
// is still importing. This error handler must follow Nitro's middleware.
|
|
2866
|
+
nitroStartupRecovery(),
|
|
2705
2867
|
includeReactTransform ? createReactTransformPlugin() : null,
|
|
2706
2868
|
createDesignSystemThemePlugin(options.designSystemTheme),
|
|
2707
2869
|
createTailwindPlugin(options),
|
|
@@ -3096,5 +3258,8 @@ export {
|
|
|
3096
3258
|
getDefaultOptimizeDeps as _getDefaultOptimizeDeps,
|
|
3097
3259
|
findCorePackageRoot as _findCorePackageRoot,
|
|
3098
3260
|
getReactRouterAliases as _getReactRouterAliases,
|
|
3261
|
+
nitroStartupGate as _nitroStartupGate,
|
|
3262
|
+
nitroStartupRecovery as _nitroStartupRecovery,
|
|
3263
|
+
nitroModuleGraphSignature as _nitroModuleGraphSignature,
|
|
3099
3264
|
debounceNitroFullReloadHotUpdate as _debounceNitroFullReloadHotUpdate,
|
|
3100
3265
|
};
|
|
@@ -23,6 +23,18 @@ async function fetchWithAuth(url: string, options?: RequestInit) {
|
|
|
23
23
|
});
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
async function responseError(res: Response, fallback: string): Promise<Error> {
|
|
27
|
+
try {
|
|
28
|
+
const body = (await res.json()) as { error?: unknown };
|
|
29
|
+
if (typeof body.error === "string" && body.error.trim()) {
|
|
30
|
+
return new Error(body.error.trim());
|
|
31
|
+
}
|
|
32
|
+
} catch {
|
|
33
|
+
// Keep the status fallback when the server did not return JSON.
|
|
34
|
+
}
|
|
35
|
+
return new Error(`${fallback}: ${res.status}`);
|
|
36
|
+
}
|
|
37
|
+
|
|
26
38
|
export function useDashboardViews(dashboardId: string | undefined) {
|
|
27
39
|
const queryClient = useQueryClient();
|
|
28
40
|
const queryKey = ["dashboard-views", dashboardId];
|
|
@@ -53,7 +65,7 @@ export function useDashboardViews(dashboardId: string | undefined) {
|
|
|
53
65
|
body: JSON.stringify(view),
|
|
54
66
|
},
|
|
55
67
|
);
|
|
56
|
-
if (!res.ok) throw
|
|
68
|
+
if (!res.ok) throw await responseError(res, "Save failed");
|
|
57
69
|
},
|
|
58
70
|
onSettled: () => {
|
|
59
71
|
queryClient.invalidateQueries({ queryKey });
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
} from "@tabler/icons-react";
|
|
8
8
|
import { useMemo, useState } from "react";
|
|
9
9
|
import { useSearchParams } from "react-router";
|
|
10
|
+
import { toast } from "sonner";
|
|
10
11
|
|
|
11
12
|
import { ResourceLoadError } from "@/components/ResourceLoadError";
|
|
12
13
|
import {
|
|
@@ -147,6 +148,15 @@ export function ViewsMenu({ dashboardId, canEdit = true }: ViewsMenuProps) {
|
|
|
147
148
|
});
|
|
148
149
|
setViewName("");
|
|
149
150
|
setSaveDialogOpen(false);
|
|
151
|
+
} catch (error) {
|
|
152
|
+
toast.error(
|
|
153
|
+
t("sqlDashboard.saveFailedWithMessage", {
|
|
154
|
+
message:
|
|
155
|
+
error instanceof Error
|
|
156
|
+
? error.message
|
|
157
|
+
: t("sqlDashboard.saveFailed"),
|
|
158
|
+
}),
|
|
159
|
+
);
|
|
150
160
|
} finally {
|
|
151
161
|
setSavingView(false);
|
|
152
162
|
}
|