@agent-native/core 0.141.6 → 0.144.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/agent-native.eject.json +9 -0
- package/corpus/README.md +1 -1
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +3 -14
- package/corpus/templates/analytics/.agents/skills/data-querying/SKILL.md +11 -6
- package/corpus/templates/analytics/.agents/skills/prometheus/SKILL.md +5 -5
- package/corpus/templates/analytics/.agents/skills/provider-api/SKILL.md +19 -0
- package/corpus/templates/analytics/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/analytics/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/analytics/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/analytics/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/analytics/AGENTS.md +37 -40
- package/corpus/templates/analytics/actions/compose-dashboard.ts +1 -1
- package/corpus/templates/analytics/actions/ensure-native-v2-dashboards.ts +1 -1
- package/corpus/templates/analytics/actions/list-dashboard-usage-stats.ts +17 -22
- package/corpus/templates/analytics/actions/migrate-first-party-analytics-to-bigquery.ts +135 -0
- package/corpus/templates/analytics/actions/navigate.ts +5 -6
- package/corpus/templates/analytics/actions/provider-api-register.ts +50 -0
- package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +46 -13
- package/corpus/templates/analytics/actions/test-custom-api-connection.ts +106 -0
- package/corpus/templates/analytics/actions/update-dashboard.ts +0 -1
- package/corpus/templates/analytics/actions/view-screen.ts +0 -20
- package/corpus/templates/analytics/app/components/CustomApiCard.tsx +430 -0
- package/corpus/templates/analytics/app/components/layout/Header.tsx +0 -1
- package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +5 -5
- package/corpus/templates/analytics/app/i18n-data.ts +682 -90
- package/corpus/templates/analytics/app/lib/native-mcp-exclusions.ts +6 -0
- package/corpus/templates/analytics/app/lib/sql-query.ts +33 -6
- package/corpus/templates/analytics/app/pages/Agents.tsx +0 -3
- package/corpus/templates/analytics/app/pages/DataSources.tsx +4 -0
- package/corpus/templates/analytics/app/pages/Settings.tsx +22 -43
- package/corpus/templates/analytics/app/pages/settings/settings-search.ts +23 -20
- package/corpus/templates/analytics/app/routes/extensions._index.tsx +1 -1
- package/corpus/templates/analytics/app/routes/settings.$.tsx +1 -0
- package/corpus/templates/analytics/app/routes/team.tsx +1 -1
- package/corpus/templates/analytics/changelog/2026-08-05-settings-no-longer-includes-an-unnecessary-about-section.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-06-analytics-dashboards-load-reliably-during-background-data-sw.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-06-analytics-dashboards-remain-responsive-while-historical-data.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-06-analytics-query-results-now-render-as-a-table-with-csv-downl.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-06-connect-public-https-custom-apis-and-hand-tested-endpoints-t.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-06-durable-agent-worker-memory.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-06-live-dashboard-panels-use-the-shared-query-timeout.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-06-on-demand-billing-is-available-as-a-native-dashboard-with-ta.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-06-visible-dashboard-names-are-unique.md +6 -0
- package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +1 -1
- package/corpus/templates/analytics/netlify.toml +7 -0
- package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +4 -0
- package/corpus/templates/analytics/scripts/first-party-analytics-bigquery.sql +104 -0
- package/corpus/templates/analytics/server/db/index.ts +27 -0
- package/corpus/templates/analytics/server/db/schema.ts +10 -0
- package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +0 -2
- package/corpus/templates/analytics/server/lib/dashboards-store.ts +227 -60
- package/corpus/templates/analytics/server/lib/first-party-analytics-backend.ts +1147 -0
- package/corpus/templates/analytics/server/lib/first-party-analytics-health.ts +34 -15
- package/corpus/templates/analytics/server/lib/first-party-analytics.ts +57 -4
- package/corpus/templates/analytics/server/lib/native-v2-dashboards.ts +227 -1
- package/corpus/templates/analytics/server/lib/real-data-actions.ts +1 -3
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +7 -4
- package/corpus/templates/analytics/server/plugins/analytics-rollup-backfill-jobs.ts +1 -0
- package/corpus/templates/analytics/server/plugins/db.ts +52 -18
- package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +36 -8
- package/corpus/templates/assets/.agents/skills/image-generation/SKILL.md +16 -1
- package/corpus/templates/assets/.agents/skills/library-management/SKILL.md +16 -1
- package/corpus/templates/assets/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/assets/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/assets/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/assets/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/assets/AGENTS.md +1 -0
- package/corpus/templates/assets/actions/_helpers.ts +12 -0
- package/corpus/templates/assets/actions/generate-image.ts +9 -3
- package/corpus/templates/assets/actions/import-style-from-url.ts +115 -0
- package/corpus/templates/assets/app/hooks/use-navigation-state.ts +3 -1
- package/corpus/templates/assets/app/routes/extensions._index.tsx +1 -1
- package/corpus/templates/assets/app/routes/settings.$.tsx +1 -0
- package/corpus/templates/assets/app/routes/settings.tsx +5 -0
- package/corpus/templates/assets/app/routes/team.tsx +1 -1
- package/corpus/templates/assets/changelog/2026-08-05-brand-kits-can-import-a-website-s-hydrated-visual-language-a.md +6 -0
- package/corpus/templates/assets/changelog/2026-08-05-generated-images-now-hand-off-embeddable-previews-to-other-w.md +6 -0
- package/corpus/templates/assets/server/lib/generation.ts +58 -0
- package/corpus/templates/assets/shared/api.ts +12 -0
- package/corpus/templates/brain/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/brain/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/brain/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/brain/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/brain/actions/list-connection-providers.ts +24 -3
- package/corpus/templates/brain/app/lib/dispatch-links.ts +44 -0
- package/corpus/templates/brain/app/routes/extensions._index.tsx +1 -1
- package/corpus/templates/brain/app/routes/sources.tsx +15 -7
- package/corpus/templates/brain/app/routes/team.tsx +1 -1
- package/corpus/templates/brain/app/routes.ts +1 -1
- package/corpus/templates/brain/changelog/2026-08-06-brain-provider-setup-links-open-dispatch-correctly-in-standa.md +6 -0
- package/corpus/templates/brain/server/plugins/agent-chat.ts +1 -0
- package/corpus/templates/calendar/.agents/skills/event-management/SKILL.md +26 -0
- package/corpus/templates/calendar/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/calendar/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/calendar/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/calendar/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/calendar/AGENTS.md +11 -32
- package/corpus/templates/calendar/actions/update-event.ts +107 -1
- package/corpus/templates/calendar/app/components/calendar/EventCalendarSelect.tsx +83 -0
- package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +57 -0
- package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +59 -73
- package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +3 -1
- package/corpus/templates/calendar/app/hooks/use-events.ts +4 -1
- package/corpus/templates/calendar/app/i18n-data.ts +20 -0
- package/corpus/templates/calendar/app/routes/_app.extensions._index.tsx +1 -1
- package/corpus/templates/calendar/app/routes/_app.settings.$.tsx +1 -0
- package/corpus/templates/calendar/app/routes/_app.team.tsx +1 -1
- package/corpus/templates/calendar/changelog/2026-08-06-delegated-requests-continue-in-the-background.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-06-existing-events-can-move-between-connected-google-account-ca.md +6 -0
- package/corpus/templates/calendar/server/lib/google-calendar.ts +101 -0
- package/corpus/templates/calendar/server/plugins/agent-chat.ts +7 -1
- package/corpus/templates/chat/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/chat/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/chat/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/chat/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/chat/app/components/layout/Layout.tsx +1 -1
- package/corpus/templates/chat/app/hooks/use-navigation-state.ts +1 -1
- package/corpus/templates/chat/app/root.tsx +1 -1
- package/corpus/templates/chat/app/routes/agent.tsx +7 -7
- package/corpus/templates/chat/app/routes/extensions._index.tsx +1 -1
- package/corpus/templates/chat/app/routes/settings.$.tsx +1 -0
- package/corpus/templates/chat/app/routes/team.tsx +1 -1
- package/corpus/templates/clips/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/clips/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/clips/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/clips/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/clips/app/components/editor/editor-layout.tsx +9 -24
- package/corpus/templates/clips/app/components/editor/timeline-geometry.ts +15 -0
- package/corpus/templates/clips/app/components/editor/waveform.tsx +4 -17
- package/corpus/templates/clips/app/components/library/library-layout.tsx +1 -1
- package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +14 -3
- package/corpus/templates/clips/app/components/player/transcript-panel.tsx +1 -1
- package/corpus/templates/clips/app/components/recorder/storage-setup-card.tsx +1 -1
- package/corpus/templates/clips/app/routes/_app.extensions._index.tsx +1 -1
- package/corpus/templates/clips/app/routes/_app.settings.$.tsx +1 -0
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +28 -38
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +21 -27
- package/corpus/templates/clips/changelog/2026-08-06-clips-recovers-from-stalled-recording-setup-without-requirin.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-06-clips-starts-faster-after-a-deploy-or-idle-period-startup-no.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-06-deleting-a-recording-returns-cleanly-to-the-library-and-fit-.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-06-hide-clip-insights-from-viewers-without-analytics-access.md +6 -0
- package/corpus/templates/clips/desktop/src/app.tsx +48 -20
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +275 -74
- package/corpus/templates/clips/desktop/src/lib/recording-start-guard.ts +84 -0
- package/corpus/templates/clips/desktop/src/overlays/toolbar.tsx +14 -4
- package/corpus/templates/clips/server/plugins/db.ts +214 -26
- package/corpus/templates/content/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/content/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/content/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/content/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/content/app/routes/_app.extensions._index.tsx +1 -1
- package/corpus/templates/content/app/routes/_app.settings.$.tsx +1 -0
- package/corpus/templates/content/app/routes/_app.team.tsx +1 -1
- package/corpus/templates/content/e2e/global-setup.ts +1 -1
- package/corpus/templates/crm/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/crm/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/crm/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/crm/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/crm/changelog/2026-08-06-crm-starts-faster-after-a-deploy-or-idle-period-one-time-dat.md +6 -0
- package/corpus/templates/crm/server/plugins/db.ts +11 -8
- package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +36 -1
- package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +6 -1
- package/corpus/templates/design/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/design/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/design/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/design/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/design/actions/analyze-brand-assets.ts +7 -7
- package/corpus/templates/design/actions/import-from-url.ts +6 -5
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +27 -18
- package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +2 -2
- package/corpus/templates/design/app/pages/Index.tsx +6 -2
- package/corpus/templates/design/app/routes/extensions._index.tsx +1 -1
- package/corpus/templates/design/app/routes/settings.$.tsx +1 -0
- package/corpus/templates/design/app/routes/team.tsx +1 -1
- package/corpus/templates/design/changelog/2026-08-05-deleting-a-design-from-the-home-page-no-longer-leaves-the-ap.md +6 -0
- package/corpus/templates/design/changelog/2026-08-05-renaming-a-layer-now-focuses-its-name-field-automatically.md +6 -0
- package/corpus/templates/design/changelog/2026-08-05-website-url-imports-now-capture-hydrated-browser-computed-de.md +6 -0
- package/corpus/templates/design/e2e/global-setup.ts +1 -1
- package/corpus/templates/design/server/plugins/agent-chat.ts +2 -0
- package/corpus/templates/dispatch/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/dispatch/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/dispatch/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/dispatch/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/dispatch/app/hooks/use-navigation-state.ts +1 -1
- package/corpus/templates/dispatch/app/routes/settings.$.tsx +1 -0
- package/corpus/templates/dispatch/app/routes/team.tsx +1 -1
- package/corpus/templates/dispatch/changelog/2026-08-06-ready-workspace-apps-stay-one-click-away-in-a-compact-dispat.md +6 -0
- package/corpus/templates/dispatch/changelog/2026-08-06-shared-vault-values-and-management-are-now-restricted-to-wor.md +6 -0
- package/corpus/templates/factory/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/factory/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/factory/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/factory/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/factory/app/hooks/use-navigation-state.ts +1 -1
- package/corpus/templates/factory/app/routes/extensions._index.tsx +1 -1
- package/corpus/templates/factory/app/routes/settings.$.tsx +1 -0
- package/corpus/templates/factory/app/routes/team.tsx +1 -1
- package/corpus/templates/forms/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/forms/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/forms/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/forms/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/forms/app/routes/_app.extensions._index.tsx +1 -1
- package/corpus/templates/forms/app/routes/_app.settings.$.tsx +1 -0
- package/corpus/templates/forms/app/routes/_app.team.tsx +1 -1
- package/corpus/templates/forms/changelog/2026-08-06-delegated-requests-continue-in-the-background.md +6 -0
- package/corpus/templates/forms/server/plugins/agent-chat.ts +4 -0
- package/corpus/templates/forms/shared/navigation.ts +1 -1
- package/corpus/templates/macros/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/macros/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/macros/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/macros/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/macros/app/routes/extensions._index.tsx +1 -1
- package/corpus/templates/macros/app/routes/settings.$.tsx +1 -0
- package/corpus/templates/macros/app/routes/team.tsx +1 -1
- package/corpus/templates/mail/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/mail/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/mail/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/mail/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/mail/app/routes/extensions._index.tsx +1 -1
- package/corpus/templates/mail/app/routes/settings.$.tsx +1 -0
- package/corpus/templates/mail/changelog/2026-08-06-delegated-requests-continue-in-the-background.md +6 -0
- package/corpus/templates/mail/server/plugins/agent-chat.ts +6 -0
- package/corpus/templates/plan/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/plan/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/plan/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/plan/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/plan/app/hooks/use-navigation-state.ts +1 -1
- package/corpus/templates/plan/app/routes/extensions._index.tsx +1 -1
- package/corpus/templates/plan/app/routes/settings.$.tsx +1 -0
- package/corpus/templates/plan/app/routes/team.tsx +1 -1
- package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +48 -5
- package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +40 -2
- package/corpus/templates/slides/.agents/skills/image-generation-via-a2a/SKILL.md +6 -0
- package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +15 -2
- package/corpus/templates/slides/.agents/skills/slide-images/SKILL.md +29 -24
- package/corpus/templates/slides/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/slides/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/slides/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/slides/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/slides/AGENTS.md +7 -9
- package/corpus/templates/slides/_gitignore +1 -0
- package/corpus/templates/slides/actions/analyze-brand-assets.ts +7 -7
- package/corpus/templates/slides/actions/export-pptx.ts +402 -36
- package/corpus/templates/slides/actions/import-file.ts +46 -85
- package/corpus/templates/slides/actions/import-from-url.ts +6 -6
- package/corpus/templates/slides/actions/import-google-slides-reference.ts +271 -12
- package/corpus/templates/slides/actions/import-pptx.ts +85 -60
- package/corpus/templates/slides/app/components/deck/DeckCard.tsx +10 -13
- package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +1 -1
- package/corpus/templates/slides/app/components/editor/AddSlidePopover.tsx +5 -1
- package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +25 -12
- package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +112 -57
- package/corpus/templates/slides/app/components/editor/GoogleDriveConnectionCta.tsx +202 -0
- package/corpus/templates/slides/app/components/editor/GoogleSlidesReferenceImport.tsx +26 -14
- package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +176 -0
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +182 -141
- package/corpus/templates/slides/app/components/editor/canvas-interactions/index.ts +1 -0
- package/corpus/templates/slides/app/components/editor/canvas-interactions/slides-canvas-adapter.ts +18 -0
- package/corpus/templates/slides/app/components/editor/slide-text-targets.ts +85 -0
- package/corpus/templates/slides/app/components/layout/Layout.tsx +3 -0
- package/corpus/templates/slides/app/components/onboarding/FirstDeckOnboardingFlow.tsx +13 -3
- package/corpus/templates/slides/app/components/presentation/PresentationView.tsx +27 -1
- package/corpus/templates/slides/app/context/DeckContext.tsx +71 -20
- package/corpus/templates/slides/app/global.css +6 -0
- package/corpus/templates/slides/app/i18n/en-US.ts +1 -0
- package/corpus/templates/slides/app/lib/create-deck-generation.ts +10 -6
- package/corpus/templates/slides/app/lib/deck-preview-frame.ts +15 -0
- package/corpus/templates/slides/app/lib/deck-share-links.ts +9 -0
- package/corpus/templates/slides/app/lib/export-pptx-client.ts +89 -0
- package/corpus/templates/slides/app/lib/slide-animation-elements.ts +3 -0
- package/corpus/templates/slides/app/pages/DeckEditor.tsx +17 -0
- package/corpus/templates/slides/app/pages/Index.tsx +107 -6
- package/corpus/templates/slides/app/routes/extensions._index.tsx +1 -1
- package/corpus/templates/slides/app/routes/settings.$.tsx +1 -0
- package/corpus/templates/slides/app/routes/team.tsx +1 -1
- package/corpus/templates/slides/changelog/2026-08-05-failed-deck-creation-and-reference-uploads-now-recover-clean.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-05-slides-recover-completed-generation-results-after-a-sync-hic.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-05-website-url-imports-now-capture-hydrated-browser-computed-st.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-06-clicking-the-gray-canvas-around-a-slide-clears-its-selection.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-06-deck-thumbnails-keep-a-consistent-listing-frame-across-aspec.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-06-deep-linked-decks-open-directly-instead-of-being-interrupted.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-06-google-slides-exports-now-show-clear-import-steps-when-direc.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-06-import-pdf-google-slides-and-powerpoint-decks-directly-from-.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-06-imported-powerpoint-exports-keep-text-and-images-editable-an.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-06-presentation-prompts-continue-adding-rendered-slides-until-t.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-06-public-decks-now-share-read-only-presentation-links-by-defau.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-06-slides-offers-a-direct-connect-google-button-when-a-drive-co.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-06-slides-preserve-uploaded-pdf-layouts-accept-larger-reference.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-06-styled-words-stay-part-of-their-text-box-instead-of-becoming.md +6 -0
- package/corpus/templates/slides/server/handlers/google-docs-auth.ts +7 -20
- package/corpus/templates/slides/server/handlers/import/html-converter.ts +236 -13
- package/corpus/templates/slides/server/handlers/import/pptx-assets.ts +67 -0
- package/corpus/templates/slides/server/handlers/import/pptx-parser.ts +2 -0
- package/corpus/templates/slides/server/handlers/uploads.ts +7 -3
- package/corpus/templates/slides/server/lib/chat-attachments.ts +6 -3
- package/corpus/templates/slides/server/lib/emails.ts +7 -2
- package/corpus/templates/slides/server/lib/google-docs-error.ts +50 -0
- package/corpus/templates/slides/server/lib/google-docs-oauth.ts +1 -0
- package/corpus/templates/slides/server/lib/import-asset-storage.ts +127 -0
- package/corpus/templates/slides/server/plugins/agent-chat.ts +4 -3
- package/corpus/templates/slides/server/routes/api/import-assets/[token].get.ts +70 -0
- package/corpus/templates/slides/shared/upload-types.ts +3 -0
- package/corpus/templates/tasks/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/corpus/templates/tasks/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/corpus/templates/tasks/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/tasks/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/tasks/app/components/layout/Header.tsx +3 -1
- package/corpus/templates/tasks/app/routes/extensions._index.tsx +1 -1
- package/corpus/templates/tasks/app/routes/settings.$.tsx +1 -0
- package/dist/agent/engine/ai-sdk-engine.js +49 -3
- package/dist/agent/production-agent.d.ts +18 -0
- package/dist/agent/production-agent.js +80 -1
- package/dist/agent/types.d.ts +7 -0
- package/dist/cli/agent-plugin.d.ts +112 -0
- package/dist/cli/agent-plugin.js +1081 -0
- package/dist/cli/app-skill.js +39 -1
- package/dist/cli/code-agent-executor.d.ts +3 -0
- package/dist/cli/code-agent-executor.js +51 -13
- package/dist/cli/index.js +13 -0
- package/dist/cli/templates-meta.js +1 -1
- package/dist/client/AgentPanel.d.ts +3 -1
- package/dist/client/AgentPanel.js +9 -2
- package/dist/client/AssistantChat.d.ts +8 -0
- package/dist/client/AssistantChat.js +23 -8
- package/dist/client/NewWorkspaceAppFlow.js +1 -0
- package/dist/client/agent-chat-adapter.d.ts +1 -1
- package/dist/client/agent-chat-adapter.js +153 -7
- package/dist/client/agent-page/AgentWorkspaceContent.d.ts +1 -1
- package/dist/client/agent-page/AgentWorkspaceContent.js +13 -13
- package/dist/client/assistant-ui-recovery.d.ts +2 -1
- package/dist/client/assistant-ui-recovery.js +7 -3
- package/dist/client/chat/run-recovery.js +5 -1
- package/dist/client/embed-auth.js +6 -2
- package/dist/client/error-format.js +12 -0
- package/dist/client/integrations/IntegrationsPanel.js +40 -6
- package/dist/client/onboarding/FirstRunOnboarding.js +11 -4
- package/dist/client/org/OrgSwitcher.js +2 -2
- package/dist/client/org/TeamPage.js +92 -72
- package/dist/client/require-session.d.ts +1 -1
- package/dist/client/require-session.js +4 -4
- package/dist/client/resources/McpConnectionSuggestion.d.ts +1 -0
- package/dist/client/resources/McpConnectionSuggestion.js +27 -10
- package/dist/client/resources/McpIntegrationDialog.js +77 -45
- package/dist/client/resources/mcp-integration-catalog.d.ts +13 -1
- package/dist/client/resources/mcp-integration-catalog.js +255 -2
- package/dist/client/resources/mcp-integration-logos.js +18 -2
- package/dist/client/resources/use-mcp-servers.d.ts +5 -0
- package/dist/client/resources/use-mcp-servers.js +36 -0
- package/dist/client/settings/AccountSettingsCard.js +42 -36
- package/dist/client/settings/AutomationsSection.js +1 -1
- package/dist/client/settings/DemoModeSection.d.ts +3 -1
- package/dist/client/settings/DemoModeSection.js +4 -1
- package/dist/client/settings/ExtensionsSettingsContent.js +1 -1
- package/dist/client/settings/SchedulingTimezoneField.d.ts +3 -1
- package/dist/client/settings/SchedulingTimezoneField.js +9 -5
- package/dist/client/settings/SettingsPanel.d.ts +4 -1
- package/dist/client/settings/SettingsPanel.js +21 -21
- package/dist/client/settings/SettingsTabsPage.d.ts +2 -2
- package/dist/client/settings/SettingsTabsPage.js +98 -45
- package/dist/client/settings/VoiceTranscriptionSection.js +6 -1
- package/dist/client/settings/useSettingsPanelController.js +47 -8
- package/dist/collab/routes.d.ts +1 -1
- package/dist/db/client.d.ts +9 -0
- package/dist/db/client.js +51 -16
- package/dist/db/create-get-db.js +2 -2
- package/dist/db/ddl-guard.d.ts +11 -10
- package/dist/db/ddl-guard.js +40 -12
- package/dist/deploy/build.d.ts +2 -0
- package/dist/deploy/build.js +97 -4
- package/dist/deploy/workspace-deploy.js +0 -2
- package/dist/guards/no-env-credentials.js +9 -0
- package/dist/ingestion/index.d.ts +1 -1
- package/dist/ingestion/pptx.d.ts +68 -0
- package/dist/ingestion/pptx.js +660 -213
- package/dist/ingestion/website.d.ts +30 -0
- package/dist/integrations/plugin.js +9 -6
- package/dist/localization/default-messages.d.ts +59 -0
- package/dist/localization/default-messages.js +62 -2
- package/dist/mcp/screen-memory-stdio.d.ts +7 -7
- package/dist/mcp-client/oauth-routes.d.ts +2 -0
- package/dist/mcp-client/oauth-routes.js +74 -7
- package/dist/mcp-client/routes.d.ts +1 -0
- package/dist/mcp-client/routes.js +49 -0
- package/dist/navigation/index.js +16 -5
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/observability/routes.d.ts +3 -3
- package/dist/onboarding/app-profile.js +11 -0
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/actions/custom-provider-registration.d.ts +13 -13
- package/dist/provider-api/actions/provider-api.d.ts +11 -11
- package/dist/resources/store.js +15 -1
- package/dist/scripts/call-agent.js +45 -4
- package/dist/secrets/routes.d.ts +6 -6
- package/dist/server/agent-chat/action-filters-a2a.d.ts +1 -1
- package/dist/server/agent-chat/action-filters-a2a.js +36 -1
- package/dist/server/agent-chat-plugin.js +29 -8
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/auth.js +55 -17
- package/dist/server/better-auth-instance.js +5 -3
- package/dist/server/core-routes-plugin.d.ts +8 -1
- package/dist/server/core-routes-plugin.js +28 -3
- package/dist/server/credential-provider.d.ts +3 -3
- package/dist/server/credential-provider.js +90 -4
- package/dist/server/identity-sso.js +2 -1
- package/dist/server/onboarding-html.d.ts +2 -0
- package/dist/server/onboarding-html.js +171 -62
- package/dist/server/realtime-token.d.ts +1 -1
- package/dist/server/self-dispatch.d.ts +5 -4
- package/dist/server/self-dispatch.js +25 -14
- package/dist/server/ssr-handler.d.ts +1 -1
- package/dist/server/ssr-handler.js +1 -1
- package/dist/server/workspace-provider-oauth.js +1 -1
- package/dist/setup-connections/onboarding.js +1 -1
- package/dist/shared/cache-control.d.ts +26 -2
- package/dist/shared/cache-control.js +43 -2
- package/dist/shared/index.d.ts +1 -1
- package/dist/shared/index.js +1 -1
- package/dist/shared/password-policy.d.ts +3 -0
- package/dist/shared/password-policy.js +3 -0
- package/dist/shared/sign-in-journey.d.ts +5 -2
- package/dist/shared/sign-in-journey.js +10 -4
- package/dist/sharing/actions/set-resource-visibility.js +16 -4
- package/dist/sharing/registry.d.ts +14 -0
- package/dist/styles/agent-native.css +6 -0
- package/dist/templates/chat/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/dist/templates/chat/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/dist/templates/chat/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/dist/templates/chat/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/dist/templates/chat/app/components/layout/Layout.tsx +1 -1
- package/dist/templates/chat/app/hooks/use-navigation-state.ts +1 -1
- package/dist/templates/chat/app/root.tsx +1 -1
- package/dist/templates/chat/app/routes/agent.tsx +7 -7
- package/dist/templates/chat/app/routes/extensions._index.tsx +1 -1
- package/dist/templates/chat/app/routes/settings.$.tsx +1 -0
- package/dist/templates/chat/app/routes/team.tsx +1 -1
- package/dist/templates/default/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/dist/templates/default/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/dist/templates/default/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/dist/templates/default/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/dist/templates/headless/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/dist/templates/headless/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/dist/templates/headless/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/dist/templates/headless/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/dist/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +6 -0
- package/dist/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +37 -6
- package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +4 -2
- package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +51 -0
- package/dist/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/dist/templates/workspace-core/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/dist/templates/workspace-core/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/dist/templates/workspace-core/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/dist/templates/workspace-root/AGENTS.md +7 -0
- package/dist/user-profile/actions/change-password.js +8 -3
- package/dist/user-profile/actions/set-password.js +5 -1
- package/dist/vite/action-types-plugin.js +59 -0
- package/docs/content/authentication.mdx +4 -5
- package/docs/content/skills-guide.mdx +13 -0
- package/docs/content/template-analytics-developers.mdx +1 -1
- package/docs/content/template-calendar-developers.mdx +1 -1
- package/docs/content/template-chat-developers.mdx +2 -2
- package/docs/content/template-content-developers.mdx +1 -1
- package/docs/content/template-mail-developers.mdx +1 -1
- package/docs/content/template-plan-developers.mdx +1 -1
- package/docs/content/toolkit-command-navigation.mdx +6 -6
- package/docs/content/toolkit-org-team.mdx +1 -1
- package/docs/content/toolkit-settings.mdx +8 -8
- package/docs/content/toolkit-setup-connections.mdx +1 -1
- package/package.json +6 -2
- package/src/templates/chat/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/src/templates/chat/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/src/templates/chat/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/src/templates/chat/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/src/templates/chat/app/components/layout/Layout.tsx +1 -1
- package/src/templates/chat/app/hooks/use-navigation-state.ts +1 -1
- package/src/templates/chat/app/root.tsx +1 -1
- package/src/templates/chat/app/routes/agent.tsx +7 -7
- package/src/templates/chat/app/routes/extensions._index.tsx +1 -1
- package/src/templates/chat/app/routes/settings.$.tsx +1 -0
- package/src/templates/chat/app/routes/team.tsx +1 -1
- package/src/templates/default/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/src/templates/default/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/src/templates/default/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/src/templates/default/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/src/templates/headless/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/src/templates/headless/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/src/templates/headless/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/src/templates/headless/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/src/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +6 -0
- package/src/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +37 -6
- package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +4 -2
- package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +51 -0
- package/src/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +296 -0
- package/src/templates/workspace-core/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
- package/src/templates/workspace-core/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/src/templates/workspace-core/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/src/templates/workspace-root/AGENTS.md +7 -0
- package/corpus/templates/analytics/.agents/skills/dashboard-management/references/template-catalog-and-demo.md +0 -62
- package/corpus/templates/analytics/actions/install-dashboard-template.ts +0 -369
- package/corpus/templates/analytics/actions/list-dashboard-templates.ts +0 -47
- package/corpus/templates/analytics/actions/list-native-v2-dashboard-templates.ts +0 -34
- package/corpus/templates/analytics/app/routes/catalog.tsx +0 -240
- package/src/templates/default/actions/navigate.spec.ts +0 -53
|
@@ -7,7 +7,7 @@ import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, }
|
|
|
7
7
|
import { Tooltip, TooltipContent, TooltipTrigger, } from "../components/ui/tooltip.js";
|
|
8
8
|
import { useT } from "../i18n.js";
|
|
9
9
|
import { cn } from "../utils.js";
|
|
10
|
-
import { buildMcpOAuthStartUrl, createMcpIntegrationFormDefaults, filterMcpIntegrations, getMcpIntegrationApiFallback, getDefaultMcpIntegrations, isCustomMcpIntegrationEnabled, navigateToMcpOAuthStart, resolveMcpIntegrationScope, shouldOfferMcpOrganizationScope, } from "./mcp-integration-catalog.js";
|
|
10
|
+
import { buildMcpOAuthStartUrl, createMcpIntegrationFormDefaults, filterMcpIntegrations, getMcpIntegrationApiFallback, getDefaultMcpIntegrations, isCustomMcpIntegrationEnabled, navigateToMcpOAuthStart, resolveMcpIntegrationScope, shouldOfferMcpIntegrationOrganizationScope, shouldOfferMcpOrganizationScope, } from "./mcp-integration-catalog.js";
|
|
11
11
|
import { formatMcpServerError, getMcpUrlValidationError, testMcpServerUrl, useMcpServers, } from "./use-mcp-servers.js";
|
|
12
12
|
function IntegrationLogo({ name, logoUrl }) {
|
|
13
13
|
const [loaded, setLoaded] = useState(false);
|
|
@@ -51,6 +51,17 @@ function compareUrl(value) {
|
|
|
51
51
|
return value.trim().replace(/\/+$/, "");
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
|
+
function requiresMcpIntegrationSetup(integration) {
|
|
55
|
+
return Boolean(!integration.managedOAuth &&
|
|
56
|
+
(integration.connectionMode === "manual" ||
|
|
57
|
+
integration.availability === "provider-setup" ||
|
|
58
|
+
integration.availability === "client-restricted"));
|
|
59
|
+
}
|
|
60
|
+
function resolveIntegrationScope(integration, defaultScope, hasOrg, canCreateOrgMcp) {
|
|
61
|
+
return resolveMcpIntegrationScope(defaultScope, hasOrg, canCreateOrgMcp, !integration ||
|
|
62
|
+
(integration.supportsOrganizationScope === true &&
|
|
63
|
+
integration.managedOAuth !== true));
|
|
64
|
+
}
|
|
54
65
|
export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId = null, defaultScope, canCreateOrgMcp, hasOrg, onCreateMcpServer, onCreated, integrations, }) {
|
|
55
66
|
const t = useT();
|
|
56
67
|
const [mode, setMode] = useState("catalog");
|
|
@@ -84,10 +95,7 @@ export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId
|
|
|
84
95
|
.map((server) => compareUrl(server.url)));
|
|
85
96
|
}, [mcpServersQuery.data]);
|
|
86
97
|
const filteredIntegrations = useMemo(() => filterMcpIntegrations(query, defaultIntegrations), [defaultIntegrations, query]);
|
|
87
|
-
const selectedRequiresSetup = Boolean(selected &&
|
|
88
|
-
(selected.connectionMode === "manual" ||
|
|
89
|
-
selected.availability === "provider-setup" ||
|
|
90
|
-
selected.availability === "client-restricted"));
|
|
98
|
+
const selectedRequiresSetup = Boolean(selected && requiresMcpIntegrationSetup(selected));
|
|
91
99
|
useEffect(() => {
|
|
92
100
|
if (!open)
|
|
93
101
|
return;
|
|
@@ -98,7 +106,7 @@ export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId
|
|
|
98
106
|
setMode(initialIntegration || !showCatalog ? "form" : "catalog");
|
|
99
107
|
setQuery("");
|
|
100
108
|
setSelected(initialIntegration ?? null);
|
|
101
|
-
setScope(
|
|
109
|
+
setScope(resolveIntegrationScope(initialIntegration, defaultScope, hasOrg, canCreateOrgMcp));
|
|
102
110
|
setName(initialDefaults.name);
|
|
103
111
|
setUrl(initialDefaults.url);
|
|
104
112
|
setDescription(initialDefaults.description);
|
|
@@ -110,6 +118,9 @@ export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId
|
|
|
110
118
|
}, [
|
|
111
119
|
defaultIntegrations,
|
|
112
120
|
initialIntegrationId,
|
|
121
|
+
canCreateOrgMcp,
|
|
122
|
+
defaultScope,
|
|
123
|
+
hasOrg,
|
|
113
124
|
open,
|
|
114
125
|
safeDefaultScope,
|
|
115
126
|
showCatalog,
|
|
@@ -127,7 +138,7 @@ export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId
|
|
|
127
138
|
const openForm = (integration) => {
|
|
128
139
|
const defaults = createMcpIntegrationFormDefaults(integration);
|
|
129
140
|
setSelected(integration ?? null);
|
|
130
|
-
setScope(
|
|
141
|
+
setScope(resolveIntegrationScope(integration, defaultScope, hasOrg, canCreateOrgMcp));
|
|
131
142
|
setName(defaults.name);
|
|
132
143
|
setUrl(defaults.url);
|
|
133
144
|
setDescription(defaults.description);
|
|
@@ -154,7 +165,7 @@ export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId
|
|
|
154
165
|
name: args.name,
|
|
155
166
|
url: args.url,
|
|
156
167
|
description: args.description,
|
|
157
|
-
scope,
|
|
168
|
+
scope: options?.scope ?? scope,
|
|
158
169
|
returnUrl,
|
|
159
170
|
})));
|
|
160
171
|
};
|
|
@@ -162,7 +173,13 @@ export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId
|
|
|
162
173
|
name: integration.name,
|
|
163
174
|
url: integration.url,
|
|
164
175
|
description: integration.description,
|
|
165
|
-
},
|
|
176
|
+
}, {
|
|
177
|
+
...options,
|
|
178
|
+
scope: integration.supportsOrganizationScope === true &&
|
|
179
|
+
integration.managedOAuth !== true
|
|
180
|
+
? scope
|
|
181
|
+
: "user",
|
|
182
|
+
});
|
|
166
183
|
const connectCustomWithOAuth = () => {
|
|
167
184
|
if (!name.trim()) {
|
|
168
185
|
setError(t("mcpIntegrations.serverNameRequired"));
|
|
@@ -212,10 +229,12 @@ export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId
|
|
|
212
229
|
});
|
|
213
230
|
};
|
|
214
231
|
const quickConnect = (integration) => {
|
|
215
|
-
if (integration
|
|
216
|
-
integration
|
|
232
|
+
if (shouldOfferMcpIntegrationOrganizationScope(integration, hasOrg, canCreateOrgMcp)) {
|
|
233
|
+
openForm(integration);
|
|
217
234
|
return;
|
|
218
235
|
}
|
|
236
|
+
if (requiresMcpIntegrationSetup(integration))
|
|
237
|
+
return;
|
|
219
238
|
if (integration.authMode === "oauth") {
|
|
220
239
|
connectWithOAuth(integration, { quickId: integration.id });
|
|
221
240
|
return;
|
|
@@ -225,7 +244,7 @@ export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId
|
|
|
225
244
|
return;
|
|
226
245
|
}
|
|
227
246
|
void createServer({
|
|
228
|
-
scope:
|
|
247
|
+
scope: resolveIntegrationScope(integration, defaultScope, hasOrg, canCreateOrgMcp),
|
|
229
248
|
name: integration.name,
|
|
230
249
|
url: integration.url,
|
|
231
250
|
description: integration.description,
|
|
@@ -263,13 +282,20 @@ export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId
|
|
|
263
282
|
}
|
|
264
283
|
};
|
|
265
284
|
const renderScopeSelector = () => {
|
|
266
|
-
if (
|
|
285
|
+
if (selected?.managedOAuth)
|
|
286
|
+
return null;
|
|
287
|
+
const canSelectScope = selected
|
|
288
|
+
? shouldOfferMcpIntegrationOrganizationScope(selected, hasOrg, canCreateOrgMcp)
|
|
289
|
+
: shouldOfferMcpOrganizationScope(hasOrg, canCreateOrgMcp);
|
|
290
|
+
if (!canSelectScope)
|
|
267
291
|
return null;
|
|
268
|
-
return (_jsxs("div", { className: "flex gap-1 rounded-md border border-border bg-background p-0.5", children: [_jsx("button", { type: "button", onClick: () => setScope("user"), className: cn("flex-1 rounded px-2 py-1.5 text-[11px] font-medium", scope === "user"
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
292
|
+
return (_jsxs("div", { className: "space-y-1.5", children: [_jsx("p", { className: "text-[11px] font-medium text-foreground", children: t("mcpIntegrations.scopeQuestion") }), _jsxs("div", { className: "flex gap-1 rounded-md border border-border bg-background p-0.5", children: [_jsx("button", { type: "button", onClick: () => setScope("user"), "aria-pressed": scope === "user", className: cn("flex-1 rounded px-2 py-1.5 text-[11px] font-medium", scope === "user"
|
|
293
|
+
? "bg-accent text-foreground"
|
|
294
|
+
: "text-muted-foreground hover:text-foreground"), children: t("mcpIntegrations.personal") }), _jsx("button", { type: "button", onClick: () => setScope("org"), "aria-pressed": scope === "org", className: cn("flex-1 rounded px-2 py-1.5 text-[11px] font-medium", scope === "org"
|
|
295
|
+
? "bg-accent text-foreground"
|
|
296
|
+
: "text-muted-foreground hover:text-foreground"), children: t("mcpIntegrations.sharedWithWorkspace") })] }), _jsx("p", { className: "text-[11px] leading-relaxed text-muted-foreground", children: t(scope === "user"
|
|
297
|
+
? "mcpIntegrations.personalDescription"
|
|
298
|
+
: "mcpIntegrations.organizationDescription") })] }));
|
|
273
299
|
};
|
|
274
300
|
if (!showCatalog && !customIntegrationEnabled)
|
|
275
301
|
return null;
|
|
@@ -279,9 +305,7 @@ export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId
|
|
|
279
305
|
const apiFallback = getMcpIntegrationApiFallback(integration);
|
|
280
306
|
const connected = connectedUrls.has(compareUrl(integration.url));
|
|
281
307
|
const requiresHeaders = integration.authMode === "headers";
|
|
282
|
-
const setupOnly = integration
|
|
283
|
-
integration.availability === "provider-setup" ||
|
|
284
|
-
integration.availability === "client-restricted";
|
|
308
|
+
const setupOnly = requiresMcpIntegrationSetup(integration);
|
|
285
309
|
return (_jsxs("article", { className: "flex min-h-[128px] flex-col rounded-md border border-border bg-card p-4 transition-colors hover:border-border/80 hover:bg-accent/20", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(IntegrationLogo, { name: integration.name, logoUrl: integration.logoUrl }), _jsxs("div", { className: "min-w-0", children: [_jsx("h3", { className: "truncate text-[13px] font-semibold text-foreground", children: integration.name }), integration.availability !== "ready" && (_jsx("span", { className: "mt-0.5 inline-flex rounded-full border border-border/70 bg-muted/40 px-1.5 py-0.5 text-[9px] font-medium text-muted-foreground", children: integration.availability === "beta"
|
|
286
310
|
? t("mcpIntegrations.status.beta")
|
|
287
311
|
: integration.availability ===
|
|
@@ -291,7 +315,7 @@ export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId
|
|
|
291
315
|
? t("mcpIntegrations.status.verified")
|
|
292
316
|
: integration.verification === "restricted"
|
|
293
317
|
? t("mcpIntegrations.status.restricted")
|
|
294
|
-
: t("mcpIntegrations.status.preflightOnly") })] })] }), _jsx("p", { className: "mt-1 line-clamp-2 flex-1 text-[12px] leading-relaxed text-muted-foreground", children: t(integration.descriptionKey) }), _jsxs("div", { className: "mt-3 flex items-center gap-2", children: [connected ? (_jsx("button", { type: "button", disabled: true, className: "inline-flex h-8 flex-1 cursor-not-allowed items-center justify-center gap-1.5 rounded-md border border-border bg-muted px-2.5 text-[12px] font-medium text-muted-foreground opacity-70", children: t("mcpIntegrations.connected") })) : setupOnly ? (_jsxs(_Fragment, { children: [apiFallback && (_jsx("button", { type: "button", onClick: () => openAgentSettings(`secrets:${apiFallback.secretKey}`), className: "inline-flex h-8 flex-1 items-center justify-center gap-1.5 rounded-md bg-primary px-2.5 text-[12px] font-medium text-primary-foreground hover:bg-primary/90", children: t("mcpIntegrations.useApiToken") })),
|
|
318
|
+
: t("mcpIntegrations.status.preflightOnly") })] })] }), _jsx("p", { className: "mt-1 line-clamp-2 flex-1 text-[12px] leading-relaxed text-muted-foreground", children: t(integration.descriptionKey) }), _jsxs("div", { className: "mt-3 flex items-center gap-2", children: [connected ? (_jsx("button", { type: "button", disabled: true, className: "inline-flex h-8 flex-1 cursor-not-allowed items-center justify-center gap-1.5 rounded-md border border-border bg-muted px-2.5 text-[12px] font-medium text-muted-foreground opacity-70", children: t("mcpIntegrations.connected") })) : setupOnly ? (_jsxs(_Fragment, { children: [apiFallback && (_jsx("button", { type: "button", onClick: () => openAgentSettings(`secrets:${apiFallback.secretKey}`), className: "inline-flex h-8 flex-1 items-center justify-center gap-1.5 rounded-md bg-primary px-2.5 text-[12px] font-medium text-primary-foreground hover:bg-primary/90", children: t("mcpIntegrations.useApiToken") })), _jsx("button", { type: "button", onClick: () => openForm(integration), className: "inline-flex h-8 flex-1 items-center justify-center gap-1.5 rounded-md border border-border bg-background px-2.5 text-[12px] font-medium text-foreground hover:bg-accent", children: t("mcpIntegrations.viewSetup") })] })) : (_jsxs("button", { type: "button", onClick: () => quickConnect(integration), disabled: busy, "aria-busy": quickBusyId === integration.id, className: cn("inline-flex h-8 flex-1 items-center justify-center gap-1.5 rounded-md bg-primary px-2.5 text-[12px] font-medium text-primary-foreground hover:bg-primary/90", busy && "cursor-not-allowed opacity-70"), children: [quickBusyId === integration.id ? (_jsx(IconLoader2, { className: "h-3.5 w-3.5 animate-spin" })) : null, integration.authMode === "oauth"
|
|
295
319
|
? t("mcpIntegrations.connectWithOAuth")
|
|
296
320
|
: requiresHeaders
|
|
297
321
|
? t("mcpIntegrations.configure")
|
|
@@ -304,29 +328,37 @@ export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId
|
|
|
304
328
|
clearFeedback();
|
|
305
329
|
setMode("catalog");
|
|
306
330
|
}, className: cn("mb-1 inline-flex w-fit items-center gap-1 text-[11px] text-muted-foreground hover:text-foreground", !showCatalog && "hidden"), children: [_jsx(IconArrowLeft, { className: "h-3 w-3 rtl:-scale-x-100" }), t("mcpIntegrations.backToIntegrations")] }), _jsx(DialogTitle, { children: selected
|
|
307
|
-
?
|
|
308
|
-
|
|
309
|
-
|
|
331
|
+
? selectedRequiresSetup
|
|
332
|
+
? t("mcpIntegrations.setupTitle", {
|
|
333
|
+
name: selected.name,
|
|
334
|
+
})
|
|
335
|
+
: t("mcpIntegrations.configureTitle", {
|
|
336
|
+
name: selected.name,
|
|
337
|
+
})
|
|
310
338
|
: t("mcpIntegrations.customTitle") }), _jsx(DialogDescription, { children: selected
|
|
311
|
-
?
|
|
312
|
-
? t("mcpIntegrations.
|
|
313
|
-
:
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
339
|
+
? selectedRequiresSetup
|
|
340
|
+
? t("mcpIntegrations.providerSetupFormDescription")
|
|
341
|
+
: selected.authMode === "none"
|
|
342
|
+
? t("mcpIntegrations.presetNoAuthDescription")
|
|
343
|
+
: t("mcpIntegrations.presetAuthDescription")
|
|
344
|
+
: t("mcpIntegrations.customDescription") })] }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto px-7 py-5", children: _jsxs("div", { className: "space-y-3", children: [renderScopeSelector(), selected?.setupNoteKey && (_jsx("div", { className: "rounded-md border border-border bg-muted/40 px-3 py-2 text-[11px] leading-relaxed text-muted-foreground", children: t(selected.setupNoteKey) })), selectedRequiresSetup && selected && (_jsxs("div", { className: "rounded-md border border-border bg-muted/40 px-3 py-2 text-[11px] leading-relaxed", children: [_jsx("p", { className: "font-medium text-foreground", children: t("mcpIntegrations.providerSetupRequired") }), _jsx("p", { className: "mt-0.5 text-muted-foreground", children: t("mcpIntegrations.providerSetupDescription", {
|
|
345
|
+
name: selected.name,
|
|
346
|
+
}) })] })), !selectedRequiresSetup && (_jsxs(_Fragment, { children: [selected?.authMode === "oauth" && (_jsx("div", { className: "rounded-md border border-primary/20 bg-primary/5 px-3 py-2 text-[11px] leading-relaxed text-primary", children: t("mcpIntegrations.oauthNotice") })), _jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1 block text-[10px] font-medium text-muted-foreground", children: t("mcpIntegrations.serverName") }), _jsx("input", { ref: inputRef, value: name, onChange: (event) => {
|
|
347
|
+
setName(event.target.value);
|
|
348
|
+
clearFeedback();
|
|
349
|
+
}, className: "w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-ring", placeholder: t("mcpIntegrations.serverNamePlaceholder") })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1 block text-[10px] font-medium text-muted-foreground", children: t("mcpIntegrations.url") }), _jsx("input", { value: url, onChange: (event) => {
|
|
350
|
+
setUrl(event.target.value);
|
|
351
|
+
clearFeedback();
|
|
352
|
+
}, className: "w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-ring", placeholder: t("mcpIntegrations.urlPlaceholder") })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1 block text-[10px] font-medium text-muted-foreground", children: t("mcpIntegrations.fieldDescription") }), _jsx("input", { value: description, onChange: (event) => {
|
|
353
|
+
setDescription(event.target.value);
|
|
354
|
+
clearFeedback();
|
|
355
|
+
}, className: "w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-ring", placeholder: t("mcpIntegrations.descriptionPlaceholder") })] }), selected?.authMode !== "oauth" && (_jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1 block text-[10px] font-medium text-muted-foreground", children: t("mcpIntegrations.headers") }), _jsx("textarea", { value: headersText, onChange: (event) => {
|
|
356
|
+
setHeadersText(event.target.value);
|
|
357
|
+
clearFeedback();
|
|
358
|
+
}, rows: 3, className: "w-full resize-y rounded-md border border-border bg-background px-2.5 py-1.5 text-[12px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-ring", style: {
|
|
359
|
+
fontFamily: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace',
|
|
360
|
+
}, placeholder: selected?.headerPlaceholder ??
|
|
361
|
+
t("mcpIntegrations.headersPlaceholder") })] })), selected?.docsUrl && (_jsxs("a", { href: selected.docsUrl, target: "_blank", rel: "noopener noreferrer", className: "inline-flex items-center gap-1 text-[11px] text-muted-foreground underline hover:text-foreground", children: [t("mcpIntegrations.openSetupDocs"), _jsx(IconExternalLink, { className: "h-3 w-3" })] }))] })), testResult && (_jsxs("div", { className: cn("flex items-start gap-1 rounded-md px-3 py-2 text-[11px] leading-snug", testResult.ok
|
|
330
362
|
? "bg-green-500/5 text-green-600 dark:text-green-400"
|
|
331
|
-
: "bg-red-500/5 text-red-600 dark:text-red-400"), children: [testResult.ok && (_jsx(IconCheck, { className: "mt-0.5 h-3 w-3 shrink-0" })), _jsx("span", { className: "min-w-0 break-words", children: testResult.message })] })), error && (_jsx("div", { className: "break-words rounded-md bg-red-500/5 px-3 py-2 text-[11px] leading-snug text-red-600 dark:text-red-400", children: error }))] }) }), _jsxs("div", { className: "flex shrink-0 items-center justify-between gap-2 border-t border-border px-7 py-4", children: [!selectedRequiresSetup && (_jsx("button", { type: "button", onClick: runTest, disabled: !url.trim() || busy, className: "rounded-md border border-border bg-background px-3 py-1.5 text-[12px] font-medium text-foreground hover:bg-accent disabled:pointer-events-none disabled:opacity-40", children: t("mcpIntegrations.test") })), !selected ? (_jsxs("button", { type: "button", onClick: connectCustomWithOAuth, disabled: !name.trim() || !url.trim() || busy, "aria-busy": busy, className: "rounded-md border border-border bg-background px-3 py-1.5 text-[12px] font-medium text-foreground hover:bg-accent disabled:pointer-events-none disabled:opacity-40", children: [busy && (_jsx(IconLoader2, { className: "me-1.5 inline h-3.5 w-3.5 animate-spin" })), t("mcpIntegrations.connectWithOAuth")] })) : null, selectedRequiresSetup ? (selected?.docsUrl ? (_jsxs("a", { href: selected.docsUrl, target: "_blank", rel: "noopener noreferrer", className: "
|
|
363
|
+
: "bg-red-500/5 text-red-600 dark:text-red-400"), children: [testResult.ok && (_jsx(IconCheck, { className: "mt-0.5 h-3 w-3 shrink-0" })), _jsx("span", { className: "min-w-0 break-words", children: testResult.message })] })), error && (_jsx("div", { className: "break-words rounded-md bg-red-500/5 px-3 py-2 text-[11px] leading-snug text-red-600 dark:text-red-400", children: error }))] }) }), _jsxs("div", { className: "flex shrink-0 items-center justify-between gap-2 border-t border-border px-7 py-4", children: [!selectedRequiresSetup && (_jsx("button", { type: "button", onClick: runTest, disabled: !url.trim() || busy, className: "rounded-md border border-border bg-background px-3 py-1.5 text-[12px] font-medium text-foreground hover:bg-accent disabled:pointer-events-none disabled:opacity-40", children: t("mcpIntegrations.test") })), !selected ? (_jsxs("button", { type: "button", onClick: connectCustomWithOAuth, disabled: !name.trim() || !url.trim() || busy, "aria-busy": busy, className: "rounded-md border border-border bg-background px-3 py-1.5 text-[12px] font-medium text-foreground hover:bg-accent disabled:pointer-events-none disabled:opacity-40", children: [busy && (_jsx(IconLoader2, { className: "me-1.5 inline h-3.5 w-3.5 animate-spin" })), t("mcpIntegrations.connectWithOAuth")] })) : null, selectedRequiresSetup ? (_jsxs("div", { className: "ms-auto flex items-center gap-2", children: [selected?.docsUrl ? (_jsxs("a", { href: selected.docsUrl, target: "_blank", rel: "noopener noreferrer", className: "inline-flex min-w-[92px] items-center justify-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-[12px] font-medium text-foreground hover:bg-accent", children: [t("mcpIntegrations.viewSetup"), _jsx(IconExternalLink, { className: "h-3 w-3" })] })) : null, selected?.authMode === "oauth" && (_jsxs("button", { type: "button", onClick: () => connectWithOAuth(selected), disabled: busy, "aria-busy": busy, className: "inline-flex min-w-[132px] items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-[12px] font-medium text-primary-foreground hover:bg-primary/90 disabled:pointer-events-none disabled:opacity-40", children: [busy && (_jsx(IconLoader2, { className: "h-3.5 w-3.5 animate-spin" })), t("mcpIntegrations.continueToConnect")] }))] })) : selected?.authMode === "oauth" ? (_jsxs("button", { type: "button", onClick: () => connectWithOAuth(selected), disabled: !name.trim() || !url.trim() || busy, "aria-busy": busy, className: "inline-flex min-w-[92px] items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-[12px] font-medium text-primary-foreground hover:bg-primary/90 disabled:pointer-events-none disabled:opacity-40", children: [busy && _jsx(IconLoader2, { className: "h-3.5 w-3.5 animate-spin" }), t("mcpIntegrations.connectWithOAuth")] })) : (_jsxs("button", { type: "button", onClick: submitForm, disabled: !name.trim() || !url.trim() || busy, className: "inline-flex min-w-[92px] items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-[12px] font-medium text-primary-foreground hover:bg-primary/90 disabled:pointer-events-none disabled:opacity-40", children: [busy && _jsx(IconLoader2, { className: "h-3.5 w-3.5 animate-spin" }), t("mcpIntegrations.connect")] }))] })] })) }) }));
|
|
332
364
|
}
|
|
@@ -17,6 +17,17 @@ export interface DefaultMcpIntegration {
|
|
|
17
17
|
availability: McpIntegrationAvailability;
|
|
18
18
|
verification: McpIntegrationVerification;
|
|
19
19
|
logoUrl: string;
|
|
20
|
+
/**
|
|
21
|
+
* The server has a first-party OAuth client configured for this provider.
|
|
22
|
+
* Keep the connection user-scoped even when the client itself is shared.
|
|
23
|
+
*/
|
|
24
|
+
managedOAuth?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* The provider supports a workspace connection whose access can be shared
|
|
27
|
+
* with permitted workspace members. Keep this opt-in until provider scope
|
|
28
|
+
* semantics are verified.
|
|
29
|
+
*/
|
|
30
|
+
supportsOrganizationScope?: boolean;
|
|
20
31
|
docsUrl?: string;
|
|
21
32
|
setupNoteKey?: string;
|
|
22
33
|
apiFallback?: {
|
|
@@ -51,8 +62,9 @@ export declare function isMcpIntegrationCatalogAvailable(config?: McpIntegration
|
|
|
51
62
|
export declare function mcpIntegrationAuthLabel(mode: McpIntegrationAuthMode): string;
|
|
52
63
|
export declare function buildMcpOAuthStartUrl({ name, url, description, scope, returnUrl, }: McpOAuthStartParams): string;
|
|
53
64
|
export declare function navigateToMcpOAuthStart(url: string): void;
|
|
54
|
-
export declare function resolveMcpIntegrationScope(defaultScope: "user" | "org", hasOrg: boolean, canCreateOrgMcp: boolean): "user" | "org";
|
|
65
|
+
export declare function resolveMcpIntegrationScope(defaultScope: "user" | "org", hasOrg: boolean, canCreateOrgMcp: boolean, supportsOrganizationScope?: boolean): "user" | "org";
|
|
55
66
|
export declare function shouldOfferMcpOrganizationScope(hasOrg: boolean, canCreateOrgMcp: boolean): boolean;
|
|
67
|
+
export declare function shouldOfferMcpIntegrationOrganizationScope(integration: DefaultMcpIntegration, hasOrg: boolean, canCreateOrgMcp: boolean): boolean;
|
|
56
68
|
export declare function filterMcpIntegrations(query: string, integrations?: DefaultMcpIntegration[]): DefaultMcpIntegration[];
|
|
57
69
|
export declare function findMcpIntegrationForText(text: string, integrations?: DefaultMcpIntegration[]): DefaultMcpIntegration | null;
|
|
58
70
|
/**
|
|
@@ -16,6 +16,7 @@ export const DEFAULT_MCP_INTEGRATIONS = [
|
|
|
16
16
|
availability: "ready",
|
|
17
17
|
verification: "verified",
|
|
18
18
|
logoUrl: mcpIntegrationLogo("context7"),
|
|
19
|
+
supportsOrganizationScope: true,
|
|
19
20
|
docsUrl: "https://context7.com/",
|
|
20
21
|
keywords: ["docs", "documentation", "libraries", "frameworks"],
|
|
21
22
|
},
|
|
@@ -63,6 +64,31 @@ export const DEFAULT_MCP_INTEGRATIONS = [
|
|
|
63
64
|
"screenshots",
|
|
64
65
|
],
|
|
65
66
|
},
|
|
67
|
+
{
|
|
68
|
+
id: "amplitude",
|
|
69
|
+
name: "Amplitude",
|
|
70
|
+
provider: "amplitude",
|
|
71
|
+
description: "Read and work with Amplitude product analytics.",
|
|
72
|
+
descriptionKey: "mcpIntegrations.catalog.amplitude.description",
|
|
73
|
+
useCase: "product analytics, charts, dashboards, cohorts, experiments",
|
|
74
|
+
useCaseKey: "mcpIntegrations.catalog.amplitude.useCase",
|
|
75
|
+
url: "https://mcp.amplitude.com/mcp",
|
|
76
|
+
authMode: "oauth",
|
|
77
|
+
connectionMode: "oauth",
|
|
78
|
+
availability: "ready",
|
|
79
|
+
verification: "preflight-only",
|
|
80
|
+
logoUrl: mcpIntegrationLogo("amplitude"),
|
|
81
|
+
docsUrl: "https://amplitude.com/docs/amplitude-ai/amplitude-mcp/other-clients",
|
|
82
|
+
setupNoteKey: "mcpIntegrations.catalog.amplitude.setupNote",
|
|
83
|
+
keywords: [
|
|
84
|
+
"analytics",
|
|
85
|
+
"product analytics",
|
|
86
|
+
"charts",
|
|
87
|
+
"dashboards",
|
|
88
|
+
"cohorts",
|
|
89
|
+
"experiments",
|
|
90
|
+
],
|
|
91
|
+
},
|
|
66
92
|
{
|
|
67
93
|
id: "notion",
|
|
68
94
|
name: "Notion",
|
|
@@ -107,6 +133,32 @@ export const DEFAULT_MCP_INTEGRATIONS = [
|
|
|
107
133
|
"decisions",
|
|
108
134
|
],
|
|
109
135
|
},
|
|
136
|
+
{
|
|
137
|
+
id: "gong",
|
|
138
|
+
name: "Gong",
|
|
139
|
+
provider: "gong",
|
|
140
|
+
description: "Search Gong calls and generate account and deal insights.",
|
|
141
|
+
descriptionKey: "mcpIntegrations.catalog.gong.description",
|
|
142
|
+
useCase: "sales calls, transcripts, deal insights, account summaries",
|
|
143
|
+
useCaseKey: "mcpIntegrations.catalog.gong.useCase",
|
|
144
|
+
url: "https://mcp.gong.io/mcp",
|
|
145
|
+
authMode: "oauth",
|
|
146
|
+
connectionMode: "manual",
|
|
147
|
+
availability: "provider-setup",
|
|
148
|
+
verification: "restricted",
|
|
149
|
+
logoUrl: mcpIntegrationLogo("gong"),
|
|
150
|
+
supportsOrganizationScope: true,
|
|
151
|
+
docsUrl: "https://help.gong.io/docs/create-an-integration-to-connect-to-the-mcp-server",
|
|
152
|
+
setupNoteKey: "mcpIntegrations.catalog.gong.setupNote",
|
|
153
|
+
keywords: [
|
|
154
|
+
"sales calls",
|
|
155
|
+
"calls",
|
|
156
|
+
"transcripts",
|
|
157
|
+
"deals",
|
|
158
|
+
"accounts",
|
|
159
|
+
"revenue intelligence",
|
|
160
|
+
],
|
|
161
|
+
},
|
|
110
162
|
{
|
|
111
163
|
id: "semgrep",
|
|
112
164
|
name: "Semgrep",
|
|
@@ -121,6 +173,7 @@ export const DEFAULT_MCP_INTEGRATIONS = [
|
|
|
121
173
|
availability: "ready",
|
|
122
174
|
verification: "preflight-only",
|
|
123
175
|
logoUrl: mcpIntegrationLogo("semgrep"),
|
|
176
|
+
supportsOrganizationScope: true,
|
|
124
177
|
docsUrl: "https://github.com/semgrep/mcp#readme",
|
|
125
178
|
keywords: ["security", "sast", "code scanning", "vulnerabilities"],
|
|
126
179
|
},
|
|
@@ -141,6 +194,82 @@ export const DEFAULT_MCP_INTEGRATIONS = [
|
|
|
141
194
|
docsUrl: "https://linear.app/docs/mcp",
|
|
142
195
|
keywords: ["issues", "tickets", "planning", "project management"],
|
|
143
196
|
},
|
|
197
|
+
{
|
|
198
|
+
id: "apollo",
|
|
199
|
+
name: "Apollo",
|
|
200
|
+
provider: "apollo",
|
|
201
|
+
description: "Search, enrich, and manage Apollo GTM data.",
|
|
202
|
+
descriptionKey: "mcpIntegrations.catalog.apollo.description",
|
|
203
|
+
useCase: "prospecting, enrichment, contacts, sequences, account research",
|
|
204
|
+
useCaseKey: "mcpIntegrations.catalog.apollo.useCase",
|
|
205
|
+
url: "https://mcp.apollo.io/mcp",
|
|
206
|
+
authMode: "oauth",
|
|
207
|
+
connectionMode: "oauth",
|
|
208
|
+
availability: "ready",
|
|
209
|
+
verification: "preflight-only",
|
|
210
|
+
logoUrl: mcpIntegrationLogo("apollo"),
|
|
211
|
+
docsUrl: "https://docs.apollo.io/docs/apollo-mcp",
|
|
212
|
+
setupNoteKey: "mcpIntegrations.catalog.apollo.setupNote",
|
|
213
|
+
keywords: [
|
|
214
|
+
"prospecting",
|
|
215
|
+
"enrichment",
|
|
216
|
+
"contacts",
|
|
217
|
+
"sequences",
|
|
218
|
+
"accounts",
|
|
219
|
+
"GTM",
|
|
220
|
+
],
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
id: "common-room",
|
|
224
|
+
name: "Common Room",
|
|
225
|
+
provider: "common-room",
|
|
226
|
+
description: "Research buyer signals, contacts, and organizations.",
|
|
227
|
+
descriptionKey: "mcpIntegrations.catalog.commonRoom.description",
|
|
228
|
+
useCase: "buyer intelligence, product signals, intent, contact enrichment",
|
|
229
|
+
useCaseKey: "mcpIntegrations.catalog.commonRoom.useCase",
|
|
230
|
+
url: "https://mcp.commonroom.io/mcp",
|
|
231
|
+
authMode: "oauth",
|
|
232
|
+
connectionMode: "oauth",
|
|
233
|
+
availability: "ready",
|
|
234
|
+
verification: "preflight-only",
|
|
235
|
+
logoUrl: mcpIntegrationLogo("common-room"),
|
|
236
|
+
docsUrl: "https://www.commonroom.io/docs/using-common-room/mcp-server/",
|
|
237
|
+
setupNoteKey: "mcpIntegrations.catalog.commonRoom.setupNote",
|
|
238
|
+
keywords: [
|
|
239
|
+
"buyer intelligence",
|
|
240
|
+
"intent",
|
|
241
|
+
"signals",
|
|
242
|
+
"contacts",
|
|
243
|
+
"organizations",
|
|
244
|
+
"GTM",
|
|
245
|
+
],
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
id: "exa",
|
|
249
|
+
name: "Exa",
|
|
250
|
+
provider: "exa",
|
|
251
|
+
description: "Search the web and fetch pages with Exa.",
|
|
252
|
+
descriptionKey: "mcpIntegrations.catalog.exa.description",
|
|
253
|
+
useCase: "web search, research, code search, page fetching",
|
|
254
|
+
useCaseKey: "mcpIntegrations.catalog.exa.useCase",
|
|
255
|
+
url: "https://mcp.exa.ai/mcp",
|
|
256
|
+
authMode: "none",
|
|
257
|
+
connectionMode: "direct",
|
|
258
|
+
availability: "ready",
|
|
259
|
+
verification: "preflight-only",
|
|
260
|
+
logoUrl: mcpIntegrationLogo("exa"),
|
|
261
|
+
supportsOrganizationScope: true,
|
|
262
|
+
docsUrl: "https://exa.ai/docs/reference/exa-mcp",
|
|
263
|
+
setupNoteKey: "mcpIntegrations.catalog.exa.setupNote",
|
|
264
|
+
keywords: [
|
|
265
|
+
"web search",
|
|
266
|
+
"research",
|
|
267
|
+
"code search",
|
|
268
|
+
"crawl",
|
|
269
|
+
"fetch",
|
|
270
|
+
"web",
|
|
271
|
+
],
|
|
272
|
+
},
|
|
144
273
|
{
|
|
145
274
|
id: "atlassian",
|
|
146
275
|
name: "Atlassian",
|
|
@@ -229,6 +358,59 @@ export const DEFAULT_MCP_INTEGRATIONS = [
|
|
|
229
358
|
setupNoteKey: "mcpIntegrations.catalog.cloudflare.setupNote",
|
|
230
359
|
keywords: ["cloud", "workers", "dns", "security", "observability"],
|
|
231
360
|
},
|
|
361
|
+
{
|
|
362
|
+
id: "grafana",
|
|
363
|
+
name: "Grafana",
|
|
364
|
+
provider: "grafana",
|
|
365
|
+
description: "Query Grafana Cloud metrics, logs, and observability data.",
|
|
366
|
+
descriptionKey: "mcpIntegrations.catalog.grafana.description",
|
|
367
|
+
useCase: "observability, metrics, logs, traces, dashboards",
|
|
368
|
+
useCaseKey: "mcpIntegrations.catalog.grafana.useCase",
|
|
369
|
+
url: "https://mcp.grafana.com/mcp",
|
|
370
|
+
authMode: "oauth",
|
|
371
|
+
connectionMode: "oauth",
|
|
372
|
+
availability: "beta",
|
|
373
|
+
verification: "preflight-only",
|
|
374
|
+
logoUrl: mcpIntegrationLogo("grafana"),
|
|
375
|
+
docsUrl: "https://grafana.com/docs/grafana-cloud/ai-tools/mcp-servers/cloud-mcp/",
|
|
376
|
+
setupNoteKey: "mcpIntegrations.catalog.grafana.setupNote",
|
|
377
|
+
keywords: [
|
|
378
|
+
"observability",
|
|
379
|
+
"metrics",
|
|
380
|
+
"logs",
|
|
381
|
+
"traces",
|
|
382
|
+
"dashboards",
|
|
383
|
+
"Grafana Cloud",
|
|
384
|
+
],
|
|
385
|
+
},
|
|
386
|
+
{
|
|
387
|
+
id: "google-workspace",
|
|
388
|
+
name: "Google Workspace",
|
|
389
|
+
provider: "google-workspace",
|
|
390
|
+
description: "Search Google Workspace data through its remote MCP server.",
|
|
391
|
+
descriptionKey: "mcpIntegrations.catalog.googleWorkspace.description",
|
|
392
|
+
useCase: "Workspace search across Gmail, Drive, Calendar, Chat, Docs, Sheets, Slides",
|
|
393
|
+
useCaseKey: "mcpIntegrations.catalog.googleWorkspace.useCase",
|
|
394
|
+
url: "https://workspacemcp.googleapis.com/mcp/v1",
|
|
395
|
+
authMode: "oauth",
|
|
396
|
+
connectionMode: "manual",
|
|
397
|
+
availability: "beta",
|
|
398
|
+
verification: "restricted",
|
|
399
|
+
logoUrl: mcpIntegrationLogo("google-workspace"),
|
|
400
|
+
docsUrl: "https://developers.google.com/workspace/guides/configure-mcp-servers",
|
|
401
|
+
setupNoteKey: "mcpIntegrations.catalog.googleWorkspace.setupNote",
|
|
402
|
+
brandAliases: ["Google", "Gmail", "Google Drive", "Google Calendar"],
|
|
403
|
+
keywords: [
|
|
404
|
+
"email",
|
|
405
|
+
"gmail",
|
|
406
|
+
"drive",
|
|
407
|
+
"calendar",
|
|
408
|
+
"chat",
|
|
409
|
+
"docs",
|
|
410
|
+
"sheets",
|
|
411
|
+
"slides",
|
|
412
|
+
],
|
|
413
|
+
},
|
|
232
414
|
{
|
|
233
415
|
id: "gitlab",
|
|
234
416
|
name: "GitLab",
|
|
@@ -374,10 +556,36 @@ export const DEFAULT_MCP_INTEGRATIONS = [
|
|
|
374
556
|
availability: "provider-setup",
|
|
375
557
|
verification: "restricted",
|
|
376
558
|
logoUrl: mcpIntegrationLogo("hubspot"),
|
|
559
|
+
managedOAuth: true,
|
|
377
560
|
docsUrl: "https://developers.hubspot.com/docs/apps/developer-platform/build-apps/integrate-with-the-remote-hubspot-mcp-server",
|
|
378
561
|
setupNoteKey: "mcpIntegrations.catalog.hubspot.setupNote",
|
|
379
562
|
keywords: ["crm", "contacts", "companies", "deals", "tickets"],
|
|
380
563
|
},
|
|
564
|
+
{
|
|
565
|
+
id: "pylon",
|
|
566
|
+
name: "Pylon",
|
|
567
|
+
provider: "pylon",
|
|
568
|
+
description: "Search and update Pylon support data.",
|
|
569
|
+
descriptionKey: "mcpIntegrations.catalog.pylon.description",
|
|
570
|
+
useCase: "customer support, issues, accounts, contacts, conversations",
|
|
571
|
+
useCaseKey: "mcpIntegrations.catalog.pylon.useCase",
|
|
572
|
+
url: "https://mcp.usepylon.com/",
|
|
573
|
+
authMode: "oauth",
|
|
574
|
+
connectionMode: "oauth",
|
|
575
|
+
availability: "provider-setup",
|
|
576
|
+
verification: "restricted",
|
|
577
|
+
logoUrl: mcpIntegrationLogo("pylon"),
|
|
578
|
+
docsUrl: "https://www.usepylon.com/integrations/mcp",
|
|
579
|
+
setupNoteKey: "mcpIntegrations.catalog.pylon.setupNote",
|
|
580
|
+
keywords: [
|
|
581
|
+
"support",
|
|
582
|
+
"issues",
|
|
583
|
+
"accounts",
|
|
584
|
+
"contacts",
|
|
585
|
+
"conversations",
|
|
586
|
+
"customer support",
|
|
587
|
+
],
|
|
588
|
+
},
|
|
381
589
|
{
|
|
382
590
|
id: "intercom",
|
|
383
591
|
name: "Intercom",
|
|
@@ -468,6 +676,32 @@ export const DEFAULT_MCP_INTEGRATIONS = [
|
|
|
468
676
|
setupNoteKey: "mcpIntegrations.catalog.box.setupNote",
|
|
469
677
|
keywords: ["files", "folders", "documents", "enterprise content"],
|
|
470
678
|
},
|
|
679
|
+
{
|
|
680
|
+
id: "builder-cms",
|
|
681
|
+
name: "Builder.io",
|
|
682
|
+
provider: "builder",
|
|
683
|
+
description: "Search Builder Publish and Hybrid Space content.",
|
|
684
|
+
descriptionKey: "mcpIntegrations.catalog.builder.description",
|
|
685
|
+
useCase: "content models, pages, entries, Publish and Hybrid Spaces",
|
|
686
|
+
useCaseKey: "mcpIntegrations.catalog.builder.useCase",
|
|
687
|
+
url: "https://mcp.builder.io/mcp/publish",
|
|
688
|
+
authMode: "oauth",
|
|
689
|
+
connectionMode: "oauth",
|
|
690
|
+
availability: "ready",
|
|
691
|
+
verification: "preflight-only",
|
|
692
|
+
logoUrl: mcpIntegrationLogo("builder-cms"),
|
|
693
|
+
docsUrl: "https://www.builder.io/c/docs/mcp-builder-server/",
|
|
694
|
+
setupNoteKey: "mcpIntegrations.catalog.builder.setupNote",
|
|
695
|
+
keywords: [
|
|
696
|
+
"Builder",
|
|
697
|
+
"content",
|
|
698
|
+
"CMS",
|
|
699
|
+
"pages",
|
|
700
|
+
"models",
|
|
701
|
+
"Publish",
|
|
702
|
+
"Hybrid",
|
|
703
|
+
],
|
|
704
|
+
},
|
|
471
705
|
{
|
|
472
706
|
id: "netlify",
|
|
473
707
|
name: "Netlify",
|
|
@@ -608,12 +842,22 @@ export function navigateToMcpOAuthStart(url) {
|
|
|
608
842
|
navigate();
|
|
609
843
|
}
|
|
610
844
|
}
|
|
611
|
-
export function resolveMcpIntegrationScope(defaultScope, hasOrg, canCreateOrgMcp) {
|
|
612
|
-
return defaultScope === "org" &&
|
|
845
|
+
export function resolveMcpIntegrationScope(defaultScope, hasOrg, canCreateOrgMcp, supportsOrganizationScope = true) {
|
|
846
|
+
return defaultScope === "org" &&
|
|
847
|
+
hasOrg &&
|
|
848
|
+
canCreateOrgMcp &&
|
|
849
|
+
supportsOrganizationScope
|
|
850
|
+
? "org"
|
|
851
|
+
: "user";
|
|
613
852
|
}
|
|
614
853
|
export function shouldOfferMcpOrganizationScope(hasOrg, canCreateOrgMcp) {
|
|
615
854
|
return hasOrg && canCreateOrgMcp;
|
|
616
855
|
}
|
|
856
|
+
export function shouldOfferMcpIntegrationOrganizationScope(integration, hasOrg, canCreateOrgMcp) {
|
|
857
|
+
return (shouldOfferMcpOrganizationScope(hasOrg, canCreateOrgMcp) &&
|
|
858
|
+
integration.supportsOrganizationScope === true &&
|
|
859
|
+
integration.managedOAuth !== true);
|
|
860
|
+
}
|
|
617
861
|
export function filterMcpIntegrations(query, integrations = getDefaultMcpIntegrations()) {
|
|
618
862
|
const needle = query.trim().toLowerCase();
|
|
619
863
|
if (!needle)
|
|
@@ -635,8 +879,16 @@ export function filterMcpIntegrations(query, integrations = getDefaultMcpIntegra
|
|
|
635
879
|
});
|
|
636
880
|
}
|
|
637
881
|
const MCP_LINK_HOSTS = {
|
|
882
|
+
amplitude: ["amplitude.com"],
|
|
883
|
+
apollo: ["apollo.io"],
|
|
884
|
+
"common-room": ["commonroom.io"],
|
|
638
885
|
context7: ["context7.com"],
|
|
886
|
+
exa: ["exa.ai"],
|
|
639
887
|
sentry: ["sentry.io", "sentry.dev"],
|
|
888
|
+
gong: ["gong.io"],
|
|
889
|
+
grafana: ["grafana.com", "grafana.net"],
|
|
890
|
+
"google-workspace": ["google.com", "googleapis.com"],
|
|
891
|
+
"builder-cms": ["builder.io"],
|
|
640
892
|
notion: ["notion.so", "notion.site"],
|
|
641
893
|
granola: ["granola.ai"],
|
|
642
894
|
semgrep: ["semgrep.dev", "semgrep.com"],
|
|
@@ -654,6 +906,7 @@ const MCP_LINK_HOSTS = {
|
|
|
654
906
|
asana: ["asana.com"],
|
|
655
907
|
hubspot: ["hubspot.com"],
|
|
656
908
|
intercom: ["intercom.com"],
|
|
909
|
+
pylon: ["usepylon.com", "pylon.com"],
|
|
657
910
|
monday: ["monday.com"],
|
|
658
911
|
webflow: ["webflow.com"],
|
|
659
912
|
paypal: ["paypal.com"],
|