@agent-native/core 0.169.1 → 0.171.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 +4 -1
- package/bin/agent-native.js +23 -5
- package/corpus/README.md +1 -1
- package/corpus/templates/analytics/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +1 -1
- package/corpus/templates/analytics/app/i18n-data.ts +28 -0
- package/corpus/templates/analytics/app/pages/Agents.tsx +25 -1
- package/corpus/templates/analytics/app/routes/$.tsx +10 -0
- package/corpus/templates/analytics/app/routes.ts +3 -1
- package/corpus/templates/analytics/changelog/2026-08-22-fixed-the-agent-native-templates-first-party-dashboard-panel.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-22-org-admin-panels-no-longer-report-a-database-error-as-a-per.md +9 -0
- package/corpus/templates/analytics/changelog/2026-08-22-slack-requests-report-invalid-inputs.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-22-unknown-analytics-links-now-return-a-real-not-found-status.md +6 -0
- package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +2 -1
- package/corpus/templates/analytics/docs/schemas/tracked-events.md +2 -0
- package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +29 -7
- package/corpus/templates/analytics/server/handlers/slack.ts +59 -5
- package/corpus/templates/analytics/server/lib/db-admin-connections.ts +11 -6
- package/corpus/templates/analytics/server/lib/first-party-analytics.ts +132 -2
- package/corpus/templates/analytics/server/lib/slack.ts +4 -2
- package/corpus/templates/analytics/vitest.config.ts +6 -1
- package/corpus/templates/assets/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/assets/app/routes/library.tsx +5 -3
- package/corpus/templates/assets/app/routes.ts +3 -1
- package/corpus/templates/assets/changelog/2026-08-22-library-page-loads-again-instead-of-crashing-on-open.md +6 -0
- package/corpus/templates/assets/vitest.config.ts +6 -1
- package/corpus/templates/brain/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/brain/app/components/ui/pointer-lock.ts +1 -0
- package/corpus/templates/brain/app/routes/sources.tsx +8 -3
- package/corpus/templates/brain/changelog/2026-08-22-tuning-or-adding-a-source-no-longer-leaves-the-sources-page.md +6 -0
- package/corpus/templates/brain/vitest.config.ts +1 -0
- package/corpus/templates/calendar/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/calendar/actions/list-booking-links.ts +83 -4
- package/corpus/templates/calendar/actions/update-booking-link.ts +4 -3
- package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +11 -3
- package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +1 -1
- package/corpus/templates/calendar/app/components/calendar/GoogleConnectBanner.tsx +103 -44
- package/corpus/templates/calendar/app/components/calendar/OutOfOfficeEvent.tsx +28 -24
- package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +9 -2
- package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +47 -58
- package/corpus/templates/calendar/app/hooks/use-booking-links.ts +5 -1
- package/corpus/templates/calendar/app/lib/event-layout.ts +52 -26
- package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +126 -98
- package/corpus/templates/calendar/app/pages/CalendarView.tsx +1 -0
- package/corpus/templates/calendar/app/pages/Settings.tsx +88 -81
- package/corpus/templates/calendar/app/routes.ts +3 -1
- package/corpus/templates/calendar/changelog/2026-08-22-booking-link-visibility-respects-shared-access.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-22-clicking-an-out-of-office-event-s-marker-no-longer-creates-a.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-22-event-detail-views-now-show-your-calendar-timezone.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-22-google-calendar-can-now-connect-with-the-shared-google-oauth.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-22-overlapping-events-now-show-each-others-boundaries.md +6 -0
- package/corpus/templates/calendar/changelog/2026-08-22-public-booking-pages-now-offer-time-slots-from-the-host-s-we.md +6 -0
- package/corpus/templates/calendar/server/handlers/bookings.ts +5 -7
- package/corpus/templates/calendar/server/handlers/google-auth.ts +10 -2
- package/corpus/templates/calendar/server/lib/google-calendar.ts +139 -14
- package/corpus/templates/calendar/server/onboarding.ts +85 -0
- package/corpus/templates/calendar/server/plugins/agent-chat.ts +2 -0
- package/corpus/templates/calendar/shared/api.ts +9 -1
- package/corpus/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/chat/app/routes.ts +3 -1
- package/corpus/templates/chat/vitest.config.ts +8 -0
- package/corpus/templates/clips/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/clips/actions/get-meeting.ts +9 -4
- package/corpus/templates/clips/actions/list-recordings.ts +16 -3
- package/corpus/templates/clips/actions/search-meetings.ts +1 -0
- package/corpus/templates/clips/actions/view-screen.ts +8 -1
- package/corpus/templates/clips/app/components/meetings/meeting-history-row.tsx +32 -1
- package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +1 -1
- package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +29 -1
- package/corpus/templates/clips/app/i18n/en-US.ts +5 -0
- package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +33 -4
- package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +1 -0
- package/corpus/templates/clips/app/routes/access-request.approve.tsx +16 -9
- package/corpus/templates/clips/app/routes/embed.$shareId.tsx +17 -7
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +17 -7
- package/corpus/templates/clips/changelog/2026-08-21-camera-bubble-black-circle.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-22-screen-recordings-respect-the-microphone-toggle.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-22-the-recordings-library-no-longer-fails-right-after-server-start.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-23-the-agent-can-see-your-library-right-after-server-start.md +6 -0
- package/corpus/templates/clips/chrome-extension/src/background.ts +1 -2
- package/corpus/templates/clips/chrome-extension/src/native-transcription.ts +39 -7
- package/corpus/templates/clips/chrome-extension/src/offscreen.ts +21 -25
- package/corpus/templates/clips/desktop/src/app.tsx +53 -24
- package/corpus/templates/clips/desktop/src/lib/bubble-playback.ts +68 -0
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +3 -0
- package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +72 -14
- package/corpus/templates/clips/desktop/src/lib/updater.ts +8 -3
- package/corpus/templates/clips/desktop/src/overlays/bubble.tsx +162 -20
- package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +43 -6
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +150 -13
- package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +12 -0
- package/corpus/templates/clips/server/lib/calendar-event-meetings.ts +28 -3
- package/corpus/templates/clips/server/lib/emails.ts +17 -33
- package/corpus/templates/content/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/content/app/components/editor/VisualEditor.tsx +140 -15
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +12 -14
- package/corpus/templates/content/app/components/ui/pointer-lock.ts +1 -0
- package/corpus/templates/content/app/hooks/use-content-database.ts +18 -2
- package/corpus/templates/content/app/hooks/use-local-storage.ts +38 -22
- package/corpus/templates/content/app/i18n-data.ts +25 -0
- package/corpus/templates/content/app/routes.ts +3 -1
- package/corpus/templates/content/changelog/2026-08-22-code-blocks-inserted-from-the-slash-menu-no-longer-get-stuck.md +6 -0
- package/corpus/templates/content/changelog/2026-08-22-the-sidebar-page-tree-no-longer-flashes-empty-after-creating-a-page.md +6 -0
- package/corpus/templates/content/docs/solutions/2026-08-21-content-mermaid-rendering-shape.md +233 -0
- package/corpus/templates/content/server/plugins/agent-chat.ts +9 -2
- package/corpus/templates/content/vitest.config.ts +7 -1
- package/corpus/templates/crm/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/design/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +1383 -88
- package/corpus/templates/design/actions/generate-design.ts +98 -47
- package/corpus/templates/design/actions/get-design-system.ts +6 -1
- package/corpus/templates/design/actions/refresh-design-system-with-builder.ts +146 -0
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +70 -26
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +284 -136
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +2057 -141
- package/corpus/templates/design/app/components/design/editor/DesignBottomToolbar.tsx +6 -2
- package/corpus/templates/design/app/components/design/editor/DesignWorkspaceRail.tsx +4 -4
- package/corpus/templates/design/app/components/design/keyboard-shortcuts.ts +10 -1
- package/corpus/templates/design/app/components/design/multi-screen/alt-hover-measurement.ts +19 -2
- package/corpus/templates/design/app/components/design/multi-screen/types.ts +9 -2
- package/corpus/templates/design/app/components/layout/Header.tsx +15 -0
- package/corpus/templates/design/app/components/layout/Layout.tsx +7 -2
- package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +11 -4
- package/corpus/templates/design/app/i18n-data.ts +1 -0
- package/corpus/templates/design/app/i18n-keyboard-shortcuts.ts +12 -0
- package/corpus/templates/design/app/lib/design-system-data.ts +68 -0
- package/corpus/templates/design/app/pages/DesignEditor.tsx +77 -35
- package/corpus/templates/design/app/pages/DesignSystems.tsx +136 -42
- package/corpus/templates/design/app/pages/Index.tsx +2 -0
- package/corpus/templates/design/app/pages/Templates.tsx +0 -10
- package/corpus/templates/design/app/pages/design-editor/code-layer-state.ts +10 -0
- package/corpus/templates/design/app/pages/design-editor/collab-sync.ts +50 -0
- package/corpus/templates/design/app/pages/design-editor/commands/apply-design-editor-command.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/commands/apply-file-content-update.ts +10 -8
- package/corpus/templates/design/app/pages/design-editor/commands/apply-local-content-update.ts +6 -6
- package/corpus/templates/design/app/pages/design-editor/commands/apply-pending-visual-styles-with-agent.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/commands/commit-visual-styles.ts +18 -7
- package/corpus/templates/design/app/pages/design-editor/commands/escape-hotkey.ts +4 -90
- package/corpus/templates/design/app/pages/design-editor/commands/layer-marquee-selection-change.ts +2 -1
- package/corpus/templates/design/app/pages/design-editor/commands/layer-selection-change.ts +4 -3
- package/corpus/templates/design/app/pages/design-editor/commands/screen-element-select.ts +12 -2
- package/corpus/templates/design/app/pages/design-editor/commands/screen-visual-style-change.ts +9 -2
- package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-move-semantic-handoff.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-semantic-handoff.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-state-semantic-handoff.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/commands/start-sidebar-resize.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/editor-state.ts +11 -1
- package/corpus/templates/design/app/pages/design-editor/effects/adopt-db-file-content.ts +11 -19
- package/corpus/templates/design/app/pages/design-editor/effects/observe-collab-text.ts +6 -6
- package/corpus/templates/design/app/pages/design-editor/effects/publish-agent-selection-context.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/effects/seed-collab-content.ts +12 -15
- package/corpus/templates/design/app/pages/design-editor/selection-state.ts +5 -59
- package/corpus/templates/design/app/pages/design-editor/tool-state.ts +8 -0
- package/corpus/templates/design/app/pages/design-editor/types.ts +3 -3
- package/corpus/templates/design/app/routes.ts +3 -1
- package/corpus/templates/design/changelog/2026-08-20-canvas-edits-patch-the-frame-instead-of-rebuilding-it.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-builder-design-system-imports-reconcile-after-indexing.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-draw-mode-needs-shift-y.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-eyedropper-shortcut.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-figma-style-alignment-guides-and-snapping.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-group-transforms-keep-the-selection.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-inspector-fields-keep-focus-on-enter.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-pen-alt-keeps-the-incoming-handle.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-pen-on-the-board-creates-one-vector.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-scale-a-multi-selection-from-the-group-handles.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-scale-resizes-text-with-the-object.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-selecting-another-object-keeps-the-scale-tool-armed.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-the-shape-tool-remembers-the-shape-you-picked.md +6 -0
- package/corpus/templates/design/changelog/2026-08-21-vectors-drawn-in-a-frame-land-where-you-drew-them.md +6 -0
- package/corpus/templates/design/changelog/2026-08-22-multi-screen-generation-no-longer-loses-a-saved-screens-layo.md +6 -0
- package/corpus/templates/design/changelog/2026-08-22-rename-and-search-fields-are-labeled-for-screen-readers.md +6 -0
- package/corpus/templates/design/package.json +2 -0
- package/corpus/templates/design/server/lib/builder-design-system-proxy.ts +311 -0
- package/corpus/templates/design/shared/canvas-math.ts +612 -206
- package/corpus/templates/design/shared/pen-path.ts +37 -0
- package/corpus/templates/design/vitest.config.ts +7 -1
- package/corpus/templates/dispatch/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/dispatch/actions/list-workspace-connections.ts +34 -3
- package/corpus/templates/dispatch/app/routes/integrations.tsx +55 -21
- package/corpus/templates/dispatch/app/routes.ts +3 -1
- package/corpus/templates/factory/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/factory/.env.example +2 -7
- package/corpus/templates/factory/AGENTS.md +3 -0
- package/corpus/templates/factory/README.md +5 -3
- package/corpus/templates/factory/actions/create-factory.ts +16 -3
- package/corpus/templates/factory/actions/get-slack-feedback-context.ts +2 -0
- package/corpus/templates/factory/actions/get-triage-item.ts +2 -0
- package/corpus/templates/factory/actions/list-factory-audit.ts +116 -36
- package/corpus/templates/factory/actions/list-factory-automations.ts +2 -1
- package/corpus/templates/factory/actions/list-triage-items.ts +22 -19
- package/corpus/templates/factory/actions/run-factory-automation.ts +7 -3
- package/corpus/templates/factory/actions/save-factory-automation.ts +5 -2
- package/corpus/templates/factory/actions/save-triage-config.ts +2 -8
- package/corpus/templates/factory/actions/start-builder-for-item.ts +21 -0
- package/corpus/templates/factory/app/components/factory/FactoryAuditView.tsx +229 -297
- package/corpus/templates/factory/app/components/factory/FactorySettingsView.tsx +397 -247
- package/corpus/templates/factory/app/components/factory/FactorySourceSettingsGroup.tsx +33 -0
- package/corpus/templates/factory/app/components/factory/NewFactoryForm.tsx +202 -162
- package/corpus/templates/factory/app/i18n/en-US.ts +32 -4
- package/corpus/templates/factory/app/routes/factory.tsx +84 -11
- package/corpus/templates/factory/app/routes.ts +3 -1
- package/corpus/templates/factory/changelog/2026-08-21-activity-runs-use-automation-display-names.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-21-create-and-settings-source-cards.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-21-keep-automations-visible-while-running.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-21-nested-factory-automations-can-poll.md +6 -0
- package/corpus/templates/factory/changelog/2026-08-21-settings-sticky-unsaved-bar.md +6 -0
- package/corpus/templates/factory/server/connectors/credentials.ts +10 -5
- package/corpus/templates/factory/server/lib/factory-audit-report.ts +412 -0
- package/corpus/templates/factory/server/lib/factory-config-reconcile.ts +321 -0
- package/corpus/templates/factory/server/lib/factory-scope.ts +25 -2
- package/corpus/templates/factory/server/lib/require-factory-automation.ts +13 -4
- package/corpus/templates/factory/server/plugins/factory-migrations.ts +148 -4
- package/corpus/templates/factory/server/plugins/factory-scheduler-job.ts +4 -6
- package/corpus/templates/factory/vitest.config.ts +17 -2
- package/corpus/templates/forms/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/forms/app/routes/_app.settings.tsx +4 -1
- package/corpus/templates/forms/changelog/2026-08-22-the-extensions-link-now-opens-the-extensions-tab-instead-o.md +6 -0
- package/corpus/templates/forms/server/lib/public-form-ssr.ts +11 -1
- package/corpus/templates/forms/vitest.config.ts +1 -0
- package/corpus/templates/macros/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/macros/app/routes.ts +3 -1
- package/corpus/templates/macros/vitest.config.ts +6 -1
- package/corpus/templates/mail/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/mail/actions/manage-gmail-filters.ts +10 -2
- package/corpus/templates/mail/app/components/GoogleConnectBanner.tsx +100 -37
- package/corpus/templates/mail/app/components/email/IntegrationsSidebar.tsx +14 -2
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +66 -36
- package/corpus/templates/mail/app/hooks/use-google-auth.ts +2 -0
- package/corpus/templates/mail/app/lib/google-oauth-setup.ts +17 -0
- package/corpus/templates/mail/app/pages/InboxPage.tsx +69 -9
- package/corpus/templates/mail/app/routes/$.tsx +9 -0
- package/corpus/templates/mail/app/routes/$view.$threadId.tsx +23 -1
- package/corpus/templates/mail/app/routes/$view.tsx +47 -1
- package/corpus/templates/mail/app/routes.ts +3 -1
- package/corpus/templates/mail/changelog/2026-08-22-gmail-can-now-connect-with-the-shared-google-oauth.md +6 -0
- package/corpus/templates/mail/changelog/2026-08-22-gmail-filters-now-shows-the-real-error.md +6 -0
- package/corpus/templates/mail/changelog/2026-08-22-unknown-mail-urls-now-show-the-404-page.md +6 -0
- package/corpus/templates/mail/server/handlers/google-auth.ts +11 -2
- package/corpus/templates/mail/server/lib/google-auth.ts +92 -12
- package/corpus/templates/mail/server/onboarding.ts +66 -18
- package/corpus/templates/mail/vitest.config.ts +6 -1
- package/corpus/templates/plan/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/plan/app/routes/settings.tsx +4 -1
- package/corpus/templates/plan/app/routes.ts +3 -1
- package/corpus/templates/plan/changelog/2026-08-22-the-extensions-link-now-opens-the-extensions-tab-instead-o.md +6 -0
- package/corpus/templates/plan/netlify.toml +1 -1
- package/corpus/templates/slides/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/slides/actions/patch-deck.ts +79 -10
- package/corpus/templates/slides/actions/update-slide.ts +11 -1
- package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +14 -4
- package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +10 -52
- package/corpus/templates/slides/app/components/editor/GoogleDocImportHint.tsx +8 -53
- package/corpus/templates/slides/app/components/editor/GoogleDriveConnectionCta.tsx +9 -75
- package/corpus/templates/slides/app/components/editor/GoogleSlidesReferenceImport.tsx +8 -60
- package/corpus/templates/slides/app/components/editor/SlideContextToolbar.tsx +10 -2
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +19 -7
- package/corpus/templates/slides/app/lib/sanitize-slide-html.ts +49 -36
- package/corpus/templates/slides/app/routes/access-request.approve.tsx +16 -9
- package/corpus/templates/slides/app/routes.ts +3 -1
- package/corpus/templates/slides/changelog/2026-08-22-already-uploaded-chat-images-are-no-longer-dropped.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-22-google-drive-and-slides-can-now-connect-with-the-shared-google-oauth.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-22-multi-slide-repairs-now-report-slides-that-still-overflow.md +6 -0
- package/corpus/templates/slides/changelog/2026-08-22-update-slide-now-reports-which-batched-edit-was-skipped.md +6 -0
- package/corpus/templates/slides/server/handlers/google-docs-auth.ts +52 -1
- package/corpus/templates/slides/server/lib/chat-attachments.ts +29 -3
- package/corpus/templates/slides/server/lib/google-docs-oauth.ts +66 -16
- package/corpus/templates/slides/server/lib/slide-content-patch.ts +13 -2
- package/corpus/templates/slides/server/plugins/agent-chat.ts +5 -2
- package/corpus/templates/slides/tsconfig.json +5 -0
- package/corpus/templates/slides/vitest.config.ts +6 -1
- package/corpus/templates/tasks/.agents/skills/secrets/SKILL.md +11 -4
- package/corpus/templates/tasks/app/routes/settings.tsx +4 -1
- package/corpus/templates/tasks/app/routes.ts +3 -1
- package/corpus/templates/tasks/changelog/2026-08-22-the-extensions-link-now-opens-the-extensions-tab-instead-o.md +6 -0
- package/corpus/templates/tasks/vitest.config.ts +7 -1
- package/dist/action.d.ts +91 -0
- package/dist/action.js +50 -0
- package/dist/agent/abort-reasons.d.ts +38 -0
- package/dist/agent/abort-reasons.js +49 -0
- package/dist/agent/engine/ai-sdk-engine.js +8 -5
- package/dist/agent/engine/anthropic-engine.js +7 -5
- package/dist/agent/engine/first-event-timeout.d.ts +42 -17
- package/dist/agent/engine/first-event-timeout.js +67 -25
- package/dist/agent/production-agent.d.ts +23 -0
- package/dist/agent/production-agent.js +107 -102
- package/dist/agent/run-loop-with-resume.d.ts +2 -28
- package/dist/agent/run-loop-with-resume.js +25 -40
- package/dist/agent/run-manager.js +5 -4
- package/dist/agent/run-store.d.ts +55 -0
- package/dist/agent/run-store.js +124 -1
- package/dist/agent/tool-search.js +2 -1
- package/dist/agent/types.d.ts +9 -4
- package/dist/app-config/auth.d.ts +1 -0
- package/dist/app-config/auth.js +7 -0
- package/dist/app-config/configuration-error.d.ts +11 -0
- package/dist/app-config/configuration-error.js +14 -0
- package/dist/app-config/index.d.ts +1 -0
- package/dist/app-config/index.js +1 -0
- package/dist/app-config/integrations.d.ts +1 -0
- package/dist/app-config/integrations.js +10 -0
- package/dist/app-config/plugins.d.ts +34 -0
- package/dist/app-config/plugins.js +39 -0
- package/dist/app-config/run-lifecycle-invariants.d.ts +18 -9
- package/dist/app-config/run-lifecycle-invariants.js +18 -25
- package/dist/app-config/schema.d.ts +17 -0
- package/dist/app-config/schema.js +2 -0
- package/dist/chat-threads/schema-migrations.js +20 -0
- package/dist/chat-threads/store.js +21 -4
- package/dist/cli/native-dependencies.d.ts +4 -0
- package/dist/cli/native-dependencies.js +15 -0
- package/dist/client/EnvironmentBadge.d.ts +1 -1
- package/dist/client/EnvironmentBadge.js +40 -5
- package/dist/client/MultiTabAssistantChat.d.ts +1 -1
- package/dist/client/MultiTabAssistantChat.js +35 -14
- package/dist/client/agent-chat/index.d.ts +1 -1
- package/dist/client/agent-chat/index.js +1 -1
- package/dist/client/agent-page/use-jobs.d.ts +2 -1
- package/dist/client/agent-page/use-jobs.js +3 -5
- package/dist/client/agent-sidebar-state.js +3 -1
- package/dist/client/blocks/library/code-tabs.js +5 -0
- package/dist/client/blocks/library/code.js +1 -0
- package/dist/client/chat-first/apps-rail.js +2 -2
- package/dist/client/chat-model-groups.d.ts +12 -0
- package/dist/client/chat-model-groups.js +3 -2
- package/dist/client/integrations/GoogleProductLogo.d.ts +5 -0
- package/dist/client/integrations/GoogleProductLogo.js +45 -0
- package/dist/client/integrations/index.d.ts +2 -0
- package/dist/client/integrations/index.js +2 -0
- package/dist/client/integrations/workspace-provider-oauth.d.ts +8 -0
- package/dist/client/integrations/workspace-provider-oauth.js +13 -0
- package/dist/client/resources/mcp-integration-catalog.js +0 -29
- package/dist/client/settings/SettingsTabsPage.js +10 -6
- package/dist/client/sharing/ShareButton.js +11 -2
- package/dist/client/use-chat-models.d.ts +6 -0
- package/dist/client/use-chat-models.js +10 -0
- package/dist/client/use-db-sync.js +27 -9
- package/dist/collab/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/connections/catalog.d.ts +111 -9
- package/dist/connections/catalog.js +86 -30
- package/dist/db/create-get-db.js +18 -0
- package/dist/db/ddl-guard.d.ts +0 -4
- package/dist/db/ddl-guard.js +46 -0
- package/dist/deploy/build.d.ts +19 -0
- package/dist/deploy/build.js +190 -16
- package/dist/deploy/function-bundle.d.ts +45 -0
- package/dist/deploy/function-bundle.js +337 -0
- package/dist/deploy/workspace-deploy.js +19 -1
- package/dist/eject/workspace-connections.js +4 -0
- package/dist/email-catalog/registry.d.ts +4 -0
- package/dist/email-catalog/registry.js +79 -14
- package/dist/extensions/content-patch.js +14 -2
- package/dist/integrations/plugin.d.ts +10 -0
- package/dist/integrations/plugin.js +40 -6
- package/dist/jobs/actions/run-automation-now.d.ts +2 -1
- package/dist/jobs/actions/run-automation-now.js +11 -5
- package/dist/jobs/frontmatter.js +53 -2
- package/dist/jobs/run-now.d.ts +11 -1
- package/dist/jobs/run-now.js +42 -7
- package/dist/jobs/scheduler.d.ts +1 -0
- package/dist/jobs/scheduler.js +2 -1
- package/dist/localization/core-messages/ar-SA.js +3 -0
- package/dist/localization/core-messages/de-DE.js +3 -0
- package/dist/localization/core-messages/en-US.d.ts +3 -0
- package/dist/localization/core-messages/en-US.js +3 -0
- package/dist/localization/core-messages/es-ES.js +3 -0
- package/dist/localization/core-messages/fr-FR.js +3 -0
- package/dist/localization/core-messages/hi-IN.js +3 -0
- package/dist/localization/core-messages/ja-JP.js +3 -0
- package/dist/localization/core-messages/ko-KR.js +3 -0
- package/dist/localization/core-messages/pt-BR.js +3 -0
- package/dist/localization/core-messages/zh-CN.js +3 -0
- package/dist/localization/core-messages/zh-TW.js +3 -0
- package/dist/localization/core-messages.d.ts +3 -0
- package/dist/localization/default-messages.d.ts +2 -5
- package/dist/localization/default-messages.js +2 -5
- package/dist/mcp/build-server.d.ts +9 -0
- package/dist/mcp/build-server.js +37 -8
- package/dist/mcp-client/oauth-client.d.ts +7 -0
- package/dist/mcp-client/oauth-client.js +12 -1
- package/dist/oauth-tokens/index.d.ts +1 -1
- package/dist/oauth-tokens/index.js +1 -1
- package/dist/oauth-tokens/lifecycle.d.ts +11 -0
- package/dist/oauth-tokens/lifecycle.js +17 -0
- package/dist/oauth-tokens/store.js +7 -0
- package/dist/observability/posthog-ai.d.ts +15 -1
- package/dist/observability/posthog-ai.js +24 -12
- package/dist/observability/traces.js +158 -28
- package/dist/onboarding/app-profile.js +2 -2
- package/dist/onboarding/plugin.js +10 -2
- package/dist/onboarding/types.d.ts +2 -0
- package/dist/provider-api/actions/custom-provider-registration.d.ts +1 -1
- package/dist/provider-api/actions/provider-api.d.ts +2 -2
- package/dist/provider-api/index.js +2 -0
- package/dist/resources/handlers.d.ts +2 -2
- package/dist/resources/store.js +13 -4
- package/dist/scripts/agent-engines/list-agent-engines.js +29 -3
- package/dist/secrets/register-framework-secrets.js +1 -1
- package/dist/server/action-discovery.js +5 -0
- package/dist/server/agent-chat/action-filters-a2a.d.ts +27 -3
- package/dist/server/agent-chat/action-filters-a2a.js +48 -9
- package/dist/server/agent-chat-plugin.js +36 -9
- package/dist/server/agent-discovery.js +43 -20
- package/dist/server/auth.js +18 -16
- package/dist/server/beta-opt-out-html.js +45 -4
- package/dist/server/better-auth-instance.d.ts +2 -1
- package/dist/server/better-auth-instance.js +37 -7
- package/dist/server/builder-design-systems.d.ts +4 -1
- package/dist/server/builder-design-systems.js +87 -6
- package/dist/server/builder-oauth.d.ts +1 -7
- package/dist/server/builder-oauth.js +80 -163
- package/dist/server/core-routes-plugin.d.ts +29 -0
- package/dist/server/core-routes-plugin.js +100 -20
- package/dist/server/default-plugins.d.ts +18 -0
- package/dist/server/default-plugins.js +22 -0
- package/dist/server/edge.d.ts +1 -0
- package/dist/server/edge.js +1 -0
- package/dist/server/framework-request-handler.js +31 -3
- package/dist/server/google-oauth.d.ts +3 -0
- package/dist/server/google-oauth.js +3 -0
- package/dist/server/index.d.ts +4 -4
- package/dist/server/index.js +3 -3
- package/dist/server/onboarding-html.js +37 -3
- package/dist/server/realtime-token.d.ts +1 -1
- package/dist/server/workspace-provider-oauth.d.ts +6 -1
- package/dist/server/workspace-provider-oauth.js +72 -20
- package/dist/shared/agent-sidebar-url.d.ts +1 -0
- package/dist/shared/agent-sidebar-url.js +1 -0
- package/dist/shared/environment-lanes.d.ts +2 -0
- package/dist/shared/environment-lanes.js +3 -1
- package/dist/shared/index.d.ts +3 -1
- package/dist/shared/index.js +3 -1
- package/dist/shared/surface-visibility.d.ts +31 -0
- package/dist/shared/surface-visibility.js +57 -0
- package/dist/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
- package/dist/templates/chat/app/routes.ts +3 -1
- package/dist/templates/chat/vitest.config.ts +8 -0
- package/dist/templates/default/.agents/skills/secrets/SKILL.md +11 -4
- package/dist/templates/default/app/routes.ts +3 -1
- package/dist/templates/headless/.agents/skills/secrets/SKILL.md +11 -4
- package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +11 -4
- package/dist/tracking/registry.d.ts +11 -0
- package/dist/tracking/registry.js +5 -2
- package/dist/triggers/actions.js +10 -3
- package/dist/usage/store.js +23 -3
- package/dist/user-profile/actions/get-auth-methods.js +18 -5
- package/dist/vite/client.js +33 -7
- package/docs/content/actions-access-control.mdx +43 -4
- package/docs/content/actions-defining.mdx +16 -0
- package/docs/content/authentication.mdx +40 -21
- package/docs/content/environment-variables.mdx +1 -0
- package/docs/content/template-clips-capture-everywhere.mdx +29 -30
- package/docs/content/template-clips-developers.mdx +4 -4
- package/docs/content/template-clips.mdx +3 -1
- package/package.json +2 -2
- package/src/eject/workspace-connections.ts +4 -0
- package/src/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
- package/src/templates/chat/app/routes.ts +3 -1
- package/src/templates/chat/vitest.config.ts +8 -0
- package/src/templates/default/.agents/skills/secrets/SKILL.md +11 -4
- package/src/templates/default/app/routes.ts +3 -1
- package/src/templates/headless/.agents/skills/secrets/SKILL.md +11 -4
- package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +11 -4
|
@@ -2,13 +2,18 @@ import { z } from "zod";
|
|
|
2
2
|
import { defineAction } from "../../action.js";
|
|
3
3
|
import { queueAutomationRunNow } from "../run-now.js";
|
|
4
4
|
export default defineAction({
|
|
5
|
-
description: "Run one personal or organization automation immediately. This is an explicit send/run action and may perform the automation's real side effects.",
|
|
5
|
+
description: "Run one personal or organization automation immediately. This is an explicit send/run action and may perform the automation's real side effects. Pass a flat `name` or a nested `path` such as jobs/factories/<id>/factory-slack-feedback.md — not both.",
|
|
6
6
|
agentTool: false,
|
|
7
|
-
schema: z
|
|
8
|
-
|
|
7
|
+
schema: z
|
|
8
|
+
.object({
|
|
9
|
+
name: z.string().min(1).optional(),
|
|
10
|
+
path: z.string().min(1).optional(),
|
|
9
11
|
scope: z.enum(["personal", "organization"]).default("personal"),
|
|
12
|
+
})
|
|
13
|
+
.refine((value) => Boolean(value.name) !== Boolean(value.path), {
|
|
14
|
+
message: "Specify either an automation name or a path, not both.",
|
|
10
15
|
}),
|
|
11
|
-
run: async ({ name, scope }, ctx) => {
|
|
16
|
+
run: async ({ name, path, scope }, ctx) => {
|
|
12
17
|
if (!ctx?.userEmail)
|
|
13
18
|
throw new Error("Not authenticated.");
|
|
14
19
|
return queueAutomationRunNow({
|
|
@@ -16,7 +21,8 @@ export default defineAction({
|
|
|
16
21
|
orgId: ctx.orgId,
|
|
17
22
|
appId: ctx.appId,
|
|
18
23
|
scope,
|
|
19
|
-
name,
|
|
24
|
+
...(path ? { path } : { name }),
|
|
25
|
+
requestHeaders: ctx.requestHeaders,
|
|
20
26
|
});
|
|
21
27
|
},
|
|
22
28
|
});
|
package/dist/jobs/frontmatter.js
CHANGED
|
@@ -20,6 +20,44 @@ const FRONTMATTER_RE = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n)?([\s\S]*)$/;
|
|
|
20
20
|
const DELEGATED_POLICY_ID_RE = /^[a-z0-9][a-z0-9._:-]{0,127}$/i;
|
|
21
21
|
const EXECUTION_ID_RE = /^[a-z0-9][a-z0-9._:-]{0,127}$/i;
|
|
22
22
|
const REMOTE_ID_RE = /^[a-z0-9][a-z0-9@+._:/-]{0,511}$/i;
|
|
23
|
+
const EXTRA_FRONTMATTER_LINES = Symbol("extraFrontmatterLines");
|
|
24
|
+
const KNOWN_FRONTMATTER_FIELDS = new Set([
|
|
25
|
+
"schedule",
|
|
26
|
+
"enabled",
|
|
27
|
+
"timezone",
|
|
28
|
+
"createdBy",
|
|
29
|
+
"orgId",
|
|
30
|
+
"runAs",
|
|
31
|
+
"lastRun",
|
|
32
|
+
"lastCheck",
|
|
33
|
+
"lastStatus",
|
|
34
|
+
"lastError",
|
|
35
|
+
"nextRun",
|
|
36
|
+
"originScopeId",
|
|
37
|
+
"deliveryPlatform",
|
|
38
|
+
"deliveryDestination",
|
|
39
|
+
"deliveryThreadRef",
|
|
40
|
+
"deliveryTenantId",
|
|
41
|
+
"model",
|
|
42
|
+
"maxIterations",
|
|
43
|
+
"maxRunInputTokens",
|
|
44
|
+
"mcpTools",
|
|
45
|
+
"triggerType",
|
|
46
|
+
"event",
|
|
47
|
+
"condition",
|
|
48
|
+
"mode",
|
|
49
|
+
"domain",
|
|
50
|
+
"appId",
|
|
51
|
+
"executionHostId",
|
|
52
|
+
"executionEngine",
|
|
53
|
+
"executionCwd",
|
|
54
|
+
"remoteRequestId",
|
|
55
|
+
"remoteCommandId",
|
|
56
|
+
"remoteRunId",
|
|
57
|
+
"remoteAutomationRunId",
|
|
58
|
+
"remoteAdvanceSchedule",
|
|
59
|
+
"delegatedPolicyId",
|
|
60
|
+
]);
|
|
23
61
|
function assertBoundedFrontmatterValue(value, label, pattern) {
|
|
24
62
|
if (value === undefined)
|
|
25
63
|
return;
|
|
@@ -216,11 +254,23 @@ export function parseJobResource(content) {
|
|
|
216
254
|
};
|
|
217
255
|
}
|
|
218
256
|
const meta = { schedule: "", enabled: true };
|
|
257
|
+
const extraLines = [];
|
|
219
258
|
for (const line of match[1].split(/\r?\n/)) {
|
|
220
259
|
const colonIdx = line.indexOf(":");
|
|
221
|
-
if (colonIdx === -1)
|
|
260
|
+
if (colonIdx === -1) {
|
|
261
|
+
if (line.trim())
|
|
262
|
+
extraLines.push(line);
|
|
222
263
|
continue;
|
|
223
|
-
|
|
264
|
+
}
|
|
265
|
+
const key = line.slice(0, colonIdx).trim();
|
|
266
|
+
if (!KNOWN_FRONTMATTER_FIELDS.has(key)) {
|
|
267
|
+
extraLines.push(line);
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
parseKnownField(meta, key, line.slice(colonIdx + 1));
|
|
271
|
+
}
|
|
272
|
+
if (extraLines.length) {
|
|
273
|
+
meta[EXTRA_FRONTMATTER_LINES] = extraLines;
|
|
224
274
|
}
|
|
225
275
|
return {
|
|
226
276
|
meta,
|
|
@@ -307,6 +357,7 @@ export function buildJobResourceContent(meta, body) {
|
|
|
307
357
|
if (meta.mcpTools?.length) {
|
|
308
358
|
lines.push(`mcpTools: ${JSON.stringify(meta.mcpTools)}`);
|
|
309
359
|
}
|
|
360
|
+
lines.push(...(meta[EXTRA_FRONTMATTER_LINES] ?? []));
|
|
310
361
|
lines.push("---", "", body);
|
|
311
362
|
return lines.join("\n");
|
|
312
363
|
}
|
package/dist/jobs/run-now.d.ts
CHANGED
|
@@ -4,7 +4,16 @@ export interface RunAutomationNowInput {
|
|
|
4
4
|
orgId?: string | null;
|
|
5
5
|
appId?: string | null;
|
|
6
6
|
scope: AutomationScope;
|
|
7
|
-
|
|
7
|
+
/** Inbound request headers used to dispatch back to this exact local host. */
|
|
8
|
+
requestHeaders?: Headers;
|
|
9
|
+
/** Flat automation name, resolved as `jobs/<name>.md`. */
|
|
10
|
+
name?: string;
|
|
11
|
+
/**
|
|
12
|
+
* Full resource path for an automation the caller already resolved. Required
|
|
13
|
+
* for automations nested under `jobs/` (e.g. per-factory jobs), whose names
|
|
14
|
+
* contain a slash and cannot round-trip through `name`.
|
|
15
|
+
*/
|
|
16
|
+
path?: string;
|
|
8
17
|
}
|
|
9
18
|
export interface QueuedAutomationRun {
|
|
10
19
|
queued: true;
|
|
@@ -19,4 +28,5 @@ export declare function queueAutomationRunNow(input: RunAutomationNowInput): Pro
|
|
|
19
28
|
*/
|
|
20
29
|
export declare function redispatchUnclaimedAutomationRuns(options?: {
|
|
21
30
|
appId?: string | null;
|
|
31
|
+
requestHeaders?: Headers;
|
|
22
32
|
}): Promise<number>;
|
package/dist/jobs/run-now.js
CHANGED
|
@@ -5,11 +5,12 @@ import { organizationResourceOwner, resourceGetByPath, } from "../resources/stor
|
|
|
5
5
|
import { fireInternalDispatch } from "../server/self-dispatch.js";
|
|
6
6
|
import { parseJobResource } from "./frontmatter.js";
|
|
7
7
|
import { listUnclaimedAutomationRuns, startAutomationRun, } from "./run-history.js";
|
|
8
|
-
async function dispatchAutomationRun(historyId) {
|
|
8
|
+
async function dispatchAutomationRun(historyId, requestHeaders) {
|
|
9
9
|
const dispatchPath = resolveAgentChatProcessRunDispatchPath();
|
|
10
10
|
await fireInternalDispatch({
|
|
11
11
|
path: dispatchPath,
|
|
12
12
|
taskId: historyId,
|
|
13
|
+
...(requestHeaders ? { event: { headers: requestHeaders } } : {}),
|
|
13
14
|
body: {
|
|
14
15
|
[AGENT_CHAT_BACKGROUND_RUN_FIELD]: {
|
|
15
16
|
runId: historyId,
|
|
@@ -23,6 +24,9 @@ async function dispatchAutomationRun(historyId) {
|
|
|
23
24
|
: {}),
|
|
24
25
|
});
|
|
25
26
|
}
|
|
27
|
+
function automationName(path) {
|
|
28
|
+
return path.replace(/^jobs\//, "").replace(/\.md$/, "");
|
|
29
|
+
}
|
|
26
30
|
function ownerForScope(input) {
|
|
27
31
|
if (input.scope === "personal")
|
|
28
32
|
return input.userEmail.trim().toLowerCase();
|
|
@@ -31,15 +35,43 @@ function ownerForScope(input) {
|
|
|
31
35
|
}
|
|
32
36
|
return organizationResourceOwner(input.orgId);
|
|
33
37
|
}
|
|
34
|
-
|
|
35
|
-
|
|
38
|
+
/**
|
|
39
|
+
* One place decides which resource a run-now request means. Callers that
|
|
40
|
+
* already hold the resource pass `path`; callers that only know a flat slug
|
|
41
|
+
* pass `name`. Accepting both at once would let two disagreeing identifiers
|
|
42
|
+
* silently pick a winner.
|
|
43
|
+
*/
|
|
44
|
+
function resolveAutomationTarget(input) {
|
|
45
|
+
const path = input.path?.trim();
|
|
46
|
+
const name = input.name?.trim();
|
|
47
|
+
if (path && name) {
|
|
48
|
+
throw Object.assign(new Error("Specify either an automation name or a path, not both."), { statusCode: 400 });
|
|
49
|
+
}
|
|
50
|
+
if (path) {
|
|
51
|
+
const segments = path.split("/");
|
|
52
|
+
const valid = segments[0] === "jobs" &&
|
|
53
|
+
segments.length > 1 &&
|
|
54
|
+
path.endsWith(".md") &&
|
|
55
|
+
!path.includes("\\") &&
|
|
56
|
+
segments.every((segment) => segment && segment !== "." && segment !== "..");
|
|
57
|
+
if (!valid) {
|
|
58
|
+
throw Object.assign(new Error("A valid automation path is required."), {
|
|
59
|
+
statusCode: 400,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return { path, name: automationName(path) };
|
|
63
|
+
}
|
|
36
64
|
if (!name || name.includes("/") || name.endsWith(".md")) {
|
|
37
65
|
throw Object.assign(new Error("A valid automation name is required."), {
|
|
38
66
|
statusCode: 400,
|
|
39
67
|
});
|
|
40
68
|
}
|
|
69
|
+
return { path: `jobs/${name}.md`, name };
|
|
70
|
+
}
|
|
71
|
+
export async function queueAutomationRunNow(input) {
|
|
72
|
+
const { path, name } = resolveAutomationTarget(input);
|
|
41
73
|
const owner = ownerForScope(input);
|
|
42
|
-
const resource = await resourceGetByPath(owner,
|
|
74
|
+
const resource = await resourceGetByPath(owner, path);
|
|
43
75
|
if (!resource) {
|
|
44
76
|
throw Object.assign(new Error(`Automation "${name}" not found.`), {
|
|
45
77
|
statusCode: 404,
|
|
@@ -56,7 +88,10 @@ export async function queueAutomationRunNow(input) {
|
|
|
56
88
|
}
|
|
57
89
|
// A manual-run request is a guaranteed app request even on hosts without a
|
|
58
90
|
// durable timer. Use it to recover older rows before adding the new one.
|
|
59
|
-
await redispatchUnclaimedAutomationRuns({
|
|
91
|
+
await redispatchUnclaimedAutomationRuns({
|
|
92
|
+
appId: input.appId,
|
|
93
|
+
requestHeaders: input.requestHeaders,
|
|
94
|
+
}).catch((error) => {
|
|
60
95
|
console.warn("[automations] Could not sweep queued runs before run-now:", error);
|
|
61
96
|
});
|
|
62
97
|
const historyId = await startAutomationRun({
|
|
@@ -69,7 +104,7 @@ export async function queueAutomationRunNow(input) {
|
|
|
69
104
|
dispatchPending: true,
|
|
70
105
|
});
|
|
71
106
|
try {
|
|
72
|
-
await dispatchAutomationRun(historyId);
|
|
107
|
+
await dispatchAutomationRun(historyId, input.requestHeaders);
|
|
73
108
|
}
|
|
74
109
|
catch (error) {
|
|
75
110
|
const message = error instanceof Error ? error.message : "Background dispatch failed";
|
|
@@ -88,7 +123,7 @@ export async function redispatchUnclaimedAutomationRuns(options) {
|
|
|
88
123
|
let attempted = 0;
|
|
89
124
|
for (const run of runs) {
|
|
90
125
|
try {
|
|
91
|
-
await dispatchAutomationRun(run.id);
|
|
126
|
+
await dispatchAutomationRun(run.id, options?.requestHeaders);
|
|
92
127
|
attempted += 1;
|
|
93
128
|
}
|
|
94
129
|
catch (error) {
|
package/dist/jobs/scheduler.d.ts
CHANGED
|
@@ -38,6 +38,7 @@ interface JobExecutionResult {
|
|
|
38
38
|
/** Execute one stored automation without changing its scheduled next run. */
|
|
39
39
|
export declare function runJobNow(owner: string, name: string, deps: SchedulerDeps, options?: {
|
|
40
40
|
historyId?: string;
|
|
41
|
+
path?: string;
|
|
41
42
|
}): Promise<JobExecutionResult>;
|
|
42
43
|
/** Process a durable run-now history row exactly once in the background worker. */
|
|
43
44
|
export declare function runQueuedAutomation(historyId: string, deps: SchedulerDeps): Promise<{
|
package/dist/jobs/scheduler.js
CHANGED
|
@@ -553,7 +553,7 @@ async function executeJob(resource, meta, body, deps, now, options = {}) {
|
|
|
553
553
|
}
|
|
554
554
|
/** Execute one stored automation without changing its scheduled next run. */
|
|
555
555
|
export async function runJobNow(owner, name, deps, options = {}) {
|
|
556
|
-
const path = `jobs/${name}.md`;
|
|
556
|
+
const path = options.path ?? `jobs/${name}.md`;
|
|
557
557
|
const resource = await resourceGetByPath(owner, path);
|
|
558
558
|
if (!resource)
|
|
559
559
|
throw new Error(`Automation "${name}" not found.`);
|
|
@@ -581,6 +581,7 @@ export async function runQueuedAutomation(historyId, deps) {
|
|
|
581
581
|
}
|
|
582
582
|
const result = await runJobNow(queued.owner, queued.automation, deps, {
|
|
583
583
|
historyId,
|
|
584
|
+
path: queued.path,
|
|
584
585
|
});
|
|
585
586
|
return {
|
|
586
587
|
skipped: false,
|
|
@@ -31,6 +31,8 @@ const messages = {
|
|
|
31
31
|
"aboutAgentNative.copyDiagnostics": "نسخ بيانات التشخيص",
|
|
32
32
|
"aboutAgentNative.unknown": "غير معروف",
|
|
33
33
|
"common.agent": "الوكيل",
|
|
34
|
+
"agentPanel.mode": "الوضع",
|
|
35
|
+
"agentPanel.uiMode": "واجهة المستخدم",
|
|
34
36
|
"common.cancel": "إلغاء",
|
|
35
37
|
"common.collapse": "طي",
|
|
36
38
|
"common.connect": "اتصال",
|
|
@@ -463,6 +465,7 @@ const messages = {
|
|
|
463
465
|
"share.linkCanStillOpen": "لا يزال بإمكان من لديه الرابط فتحه.",
|
|
464
466
|
"share.loading": "جارٍ التحميل...",
|
|
465
467
|
"share.loadMore": "تحميل المزيد",
|
|
468
|
+
"share.loadFailed": "تعذّر تحميل إعدادات المشاركة.",
|
|
466
469
|
"share.loadPeopleFailed": "تعذّر تحميل الأشخاص.",
|
|
467
470
|
"share.noAccess": "لا أحد لديه صلاحية الوصول حتى الآن.",
|
|
468
471
|
"share.noMatches": "لا توجد نتائج مطابقة.",
|
|
@@ -31,6 +31,8 @@ const messages = {
|
|
|
31
31
|
"aboutAgentNative.copyDiagnostics": "Diagnosedaten kopieren",
|
|
32
32
|
"aboutAgentNative.unknown": "Unbekannt",
|
|
33
33
|
"common.agent": "Agent",
|
|
34
|
+
"agentPanel.mode": "Modus",
|
|
35
|
+
"agentPanel.uiMode": "Benutzeroberfläche",
|
|
34
36
|
"common.cancel": "Abbrechen",
|
|
35
37
|
"common.collapse": "Einklappen",
|
|
36
38
|
"common.connect": "Verbinden",
|
|
@@ -498,6 +500,7 @@ const messages = {
|
|
|
498
500
|
"share.linkCanStillOpen": "Personen mit dem Link können dies weiterhin öffnen.",
|
|
499
501
|
"share.loading": "Laden...",
|
|
500
502
|
"share.loadMore": "Mehr laden",
|
|
503
|
+
"share.loadFailed": "Freigabeeinstellungen konnten nicht geladen werden.",
|
|
501
504
|
"share.loadPeopleFailed": "Es konnten keine Personen geladen werden.",
|
|
502
505
|
"share.noAccess": "Noch hat niemand Zugriff.",
|
|
503
506
|
"share.noMatches": "Keine Übereinstimmungen.",
|
|
@@ -31,6 +31,8 @@ declare const messages: {
|
|
|
31
31
|
readonly "aboutAgentNative.copyDiagnostics": "Copy diagnostics";
|
|
32
32
|
readonly "aboutAgentNative.unknown": "Unknown";
|
|
33
33
|
readonly "common.agent": "Agent";
|
|
34
|
+
readonly "agentPanel.mode": "Mode";
|
|
35
|
+
readonly "agentPanel.uiMode": "UI";
|
|
34
36
|
readonly "common.cancel": "Cancel";
|
|
35
37
|
readonly "common.collapse": "Collapse";
|
|
36
38
|
readonly "common.connect": "Connect";
|
|
@@ -447,6 +449,7 @@ declare const messages: {
|
|
|
447
449
|
readonly "share.linkCanStillOpen": "People with the link can still open this.";
|
|
448
450
|
readonly "share.loading": "Loading...";
|
|
449
451
|
readonly "share.loadMore": "Load more";
|
|
452
|
+
readonly "share.loadFailed": "Couldn't load sharing settings.";
|
|
450
453
|
readonly "share.loadPeopleFailed": "Could not load people.";
|
|
451
454
|
readonly "share.noAccess": "No one has access yet.";
|
|
452
455
|
readonly "share.noMatches": "No matches.";
|
|
@@ -31,6 +31,8 @@ const messages = {
|
|
|
31
31
|
"aboutAgentNative.copyDiagnostics": "Copy diagnostics",
|
|
32
32
|
"aboutAgentNative.unknown": "Unknown",
|
|
33
33
|
"common.agent": "Agent",
|
|
34
|
+
"agentPanel.mode": "Mode",
|
|
35
|
+
"agentPanel.uiMode": "UI",
|
|
34
36
|
"common.cancel": "Cancel",
|
|
35
37
|
"common.collapse": "Collapse",
|
|
36
38
|
"common.connect": "Connect",
|
|
@@ -447,6 +449,7 @@ const messages = {
|
|
|
447
449
|
"share.linkCanStillOpen": "People with the link can still open this.",
|
|
448
450
|
"share.loading": "Loading...",
|
|
449
451
|
"share.loadMore": "Load more",
|
|
452
|
+
"share.loadFailed": "Couldn't load sharing settings.",
|
|
450
453
|
"share.loadPeopleFailed": "Could not load people.",
|
|
451
454
|
"share.noAccess": "No one has access yet.",
|
|
452
455
|
"share.noMatches": "No matches.",
|
|
@@ -31,6 +31,8 @@ const messages = {
|
|
|
31
31
|
"aboutAgentNative.copyDiagnostics": "Copiar diagnóstico",
|
|
32
32
|
"aboutAgentNative.unknown": "Desconocida",
|
|
33
33
|
"common.agent": "Agente",
|
|
34
|
+
"agentPanel.mode": "Modo",
|
|
35
|
+
"agentPanel.uiMode": "Interfaz de usuario",
|
|
34
36
|
"common.cancel": "Cancelar",
|
|
35
37
|
"common.collapse": "Contraer",
|
|
36
38
|
"common.connect": "Conectar",
|
|
@@ -505,6 +507,7 @@ const messages = {
|
|
|
505
507
|
"share.linkCanStillOpen": "Las personas con el enlace aún pueden abrirlo.",
|
|
506
508
|
"share.loading": "Cargando...",
|
|
507
509
|
"share.loadMore": "Cargar más",
|
|
510
|
+
"share.loadFailed": "No se pudo cargar la configuración de uso compartido.",
|
|
508
511
|
"share.loadPeopleFailed": "No se pudieron cargar las personas.",
|
|
509
512
|
"share.noAccess": "Nadie tiene acceso todavía.",
|
|
510
513
|
"share.noMatches": "Sin coincidencias.",
|
|
@@ -31,6 +31,8 @@ const messages = {
|
|
|
31
31
|
"aboutAgentNative.copyDiagnostics": "Copier les diagnostics",
|
|
32
32
|
"aboutAgentNative.unknown": "Inconnue",
|
|
33
33
|
"common.agent": "Agent",
|
|
34
|
+
"agentPanel.mode": "Mode",
|
|
35
|
+
"agentPanel.uiMode": "Interface utilisateur",
|
|
34
36
|
"common.cancel": "Annuler",
|
|
35
37
|
"common.collapse": "Réduire",
|
|
36
38
|
"common.connect": "Connecter",
|
|
@@ -505,6 +507,7 @@ const messages = {
|
|
|
505
507
|
"share.linkCanStillOpen": "Les personnes disposant du lien peuvent toujours l'ouvrir.",
|
|
506
508
|
"share.loading": "Chargement...",
|
|
507
509
|
"share.loadMore": "Afficher plus",
|
|
510
|
+
"share.loadFailed": "Impossible de charger les paramètres de partage.",
|
|
508
511
|
"share.loadPeopleFailed": "Impossible de charger des personnes.",
|
|
509
512
|
"share.noAccess": "Personne n'y a encore accès.",
|
|
510
513
|
"share.noMatches": "Aucun résultat.",
|
|
@@ -31,6 +31,8 @@ const messages = {
|
|
|
31
31
|
"aboutAgentNative.copyDiagnostics": "डायग्नोस्टिक कॉपी करें",
|
|
32
32
|
"aboutAgentNative.unknown": "अज्ञात",
|
|
33
33
|
"common.agent": "एजेंट",
|
|
34
|
+
"agentPanel.mode": "मोड",
|
|
35
|
+
"agentPanel.uiMode": "यूआई",
|
|
34
36
|
"common.cancel": "रद्द करें",
|
|
35
37
|
"common.collapse": "समेटें",
|
|
36
38
|
"common.connect": "कनेक्ट करें",
|
|
@@ -447,6 +449,7 @@ const messages = {
|
|
|
447
449
|
"share.linkCanStillOpen": "लिंक वाले लोग इसे फिर भी खोल सकते हैं।",
|
|
448
450
|
"share.loading": "लोड हो रहा है...",
|
|
449
451
|
"share.loadMore": "और लोड करें",
|
|
452
|
+
"share.loadFailed": "साझाकरण सेटिंग्स लोड नहीं की जा सकीं।",
|
|
450
453
|
"share.loadPeopleFailed": "लोगों को लोड नहीं किया जा सका।",
|
|
451
454
|
"share.noAccess": "अभी किसी के पास एक्सेस नहीं है।",
|
|
452
455
|
"share.noMatches": "कोई मिलान नहीं मिला।",
|
|
@@ -31,6 +31,8 @@ const messages = {
|
|
|
31
31
|
"aboutAgentNative.copyDiagnostics": "診断情報をコピー",
|
|
32
32
|
"aboutAgentNative.unknown": "不明",
|
|
33
33
|
"common.agent": "エージェント",
|
|
34
|
+
"agentPanel.mode": "モード",
|
|
35
|
+
"agentPanel.uiMode": "UI",
|
|
34
36
|
"common.cancel": "キャンセル",
|
|
35
37
|
"common.collapse": "折りたたむ",
|
|
36
38
|
"common.connect": "接続",
|
|
@@ -442,6 +444,7 @@ const messages = {
|
|
|
442
444
|
"share.hideInSearch": "検索結果に表示しない",
|
|
443
445
|
"share.linkCanStillOpen": "リンクを知っているユーザーは引き続き開くことができます。",
|
|
444
446
|
"share.loadMore": "さらに読み込む",
|
|
447
|
+
"share.loadFailed": "共有設定を読み込めませんでした。",
|
|
445
448
|
"share.loadPeopleFailed": "ユーザーを読み込めませんでした。",
|
|
446
449
|
"share.loading": "読み込み中...",
|
|
447
450
|
"share.noAccess": "アクセスできるユーザーはまだいません。",
|
|
@@ -31,6 +31,8 @@ const messages = {
|
|
|
31
31
|
"aboutAgentNative.copyDiagnostics": "진단 정보 복사",
|
|
32
32
|
"aboutAgentNative.unknown": "알 수 없음",
|
|
33
33
|
"common.agent": "에이전트",
|
|
34
|
+
"agentPanel.mode": "모드",
|
|
35
|
+
"agentPanel.uiMode": "UI",
|
|
34
36
|
"common.cancel": "취소",
|
|
35
37
|
"common.collapse": "접기",
|
|
36
38
|
"common.connect": "연결",
|
|
@@ -442,6 +444,7 @@ const messages = {
|
|
|
442
444
|
"share.hideInSearch": "검색에서 숨기기",
|
|
443
445
|
"share.linkCanStillOpen": "링크가 있는 사용자는 계속 열 수 있습니다.",
|
|
444
446
|
"share.loadMore": "더 불러오기",
|
|
447
|
+
"share.loadFailed": "공유 설정을 불러올 수 없습니다.",
|
|
445
448
|
"share.loadPeopleFailed": "사용자를 불러올 수 없습니다.",
|
|
446
449
|
"share.loading": "불러오는 중...",
|
|
447
450
|
"share.noAccess": "아직 접근 권한이 있는 사용자가 없습니다.",
|
|
@@ -31,6 +31,8 @@ const messages = {
|
|
|
31
31
|
"aboutAgentNative.copyDiagnostics": "Copiar diagnósticos",
|
|
32
32
|
"aboutAgentNative.unknown": "Desconhecida",
|
|
33
33
|
"common.agent": "Agente",
|
|
34
|
+
"agentPanel.mode": "Modo",
|
|
35
|
+
"agentPanel.uiMode": "Interface",
|
|
34
36
|
"common.cancel": "Cancelar",
|
|
35
37
|
"common.collapse": "Recolher",
|
|
36
38
|
"common.connect": "Conectar",
|
|
@@ -505,6 +507,7 @@ const messages = {
|
|
|
505
507
|
"share.linkCanStillOpen": "Pessoas com o link ainda podem abrir isto.",
|
|
506
508
|
"share.loading": "Carregando...",
|
|
507
509
|
"share.loadMore": "Ver mais",
|
|
510
|
+
"share.loadFailed": "Não foi possível carregar as configurações de compartilhamento.",
|
|
508
511
|
"share.loadPeopleFailed": "Não foi possível carregar pessoas.",
|
|
509
512
|
"share.noAccess": "Ninguém tem acesso ainda.",
|
|
510
513
|
"share.noMatches": "Nenhuma correspondência.",
|
|
@@ -31,6 +31,8 @@ const messages = {
|
|
|
31
31
|
"aboutAgentNative.copyDiagnostics": "复制诊断信息",
|
|
32
32
|
"aboutAgentNative.unknown": "未知",
|
|
33
33
|
"common.agent": "智能体",
|
|
34
|
+
"agentPanel.mode": "模式",
|
|
35
|
+
"agentPanel.uiMode": "界面",
|
|
34
36
|
"common.cancel": "取消",
|
|
35
37
|
"common.collapse": "收起",
|
|
36
38
|
"common.connect": "连接",
|
|
@@ -442,6 +444,7 @@ const messages = {
|
|
|
442
444
|
"share.hideInSearch": "在搜索中隐藏",
|
|
443
445
|
"share.linkCanStillOpen": "拥有链接的人员仍可打开此内容。",
|
|
444
446
|
"share.loadMore": "加载更多",
|
|
447
|
+
"share.loadFailed": "无法加载共享设置。",
|
|
445
448
|
"share.loadPeopleFailed": "无法加载人员。",
|
|
446
449
|
"share.loading": "正在加载...",
|
|
447
450
|
"share.noAccess": "尚无任何人拥有访问权限。",
|
|
@@ -31,6 +31,8 @@ const messages = {
|
|
|
31
31
|
"aboutAgentNative.copyDiagnostics": "複製診斷資訊",
|
|
32
32
|
"aboutAgentNative.unknown": "未知",
|
|
33
33
|
"common.agent": "代理",
|
|
34
|
+
"agentPanel.mode": "模式",
|
|
35
|
+
"agentPanel.uiMode": "介面",
|
|
34
36
|
"common.cancel": "取消",
|
|
35
37
|
"common.collapse": "收合",
|
|
36
38
|
"common.connect": "連線",
|
|
@@ -442,6 +444,7 @@ const messages = {
|
|
|
442
444
|
"share.hideInSearch": "在搜尋中隱藏",
|
|
443
445
|
"share.linkCanStillOpen": "擁有連結的人員仍可開啟這個項目。",
|
|
444
446
|
"share.loadMore": "載入更多",
|
|
447
|
+
"share.loadFailed": "無法載入分享設定。",
|
|
445
448
|
"share.loadPeopleFailed": "無法載入人員。",
|
|
446
449
|
"share.loading": "載入中...",
|
|
447
450
|
"share.noAccess": "尚無任何人擁有存取權。",
|
|
@@ -33,6 +33,8 @@ export declare const englishAgentChatMessages: {
|
|
|
33
33
|
readonly "aboutAgentNative.copyDiagnostics": "Copy diagnostics";
|
|
34
34
|
readonly "aboutAgentNative.unknown": "Unknown";
|
|
35
35
|
readonly "common.agent": "Agent";
|
|
36
|
+
readonly "agentPanel.mode": "Mode";
|
|
37
|
+
readonly "agentPanel.uiMode": "UI";
|
|
36
38
|
readonly "common.cancel": "Cancel";
|
|
37
39
|
readonly "common.collapse": "Collapse";
|
|
38
40
|
readonly "common.connect": "Connect";
|
|
@@ -449,6 +451,7 @@ export declare const englishAgentChatMessages: {
|
|
|
449
451
|
readonly "share.linkCanStillOpen": "People with the link can still open this.";
|
|
450
452
|
readonly "share.loading": "Loading...";
|
|
451
453
|
readonly "share.loadMore": "Load more";
|
|
454
|
+
readonly "share.loadFailed": "Couldn't load sharing settings.";
|
|
452
455
|
readonly "share.loadPeopleFailed": "Could not load people.";
|
|
453
456
|
readonly "share.noAccess": "No one has access yet.";
|
|
454
457
|
readonly "share.noMatches": "No matches.";
|
|
@@ -422,6 +422,8 @@ declare const messages: {
|
|
|
422
422
|
downloadDesktop: string;
|
|
423
423
|
chatMode: string;
|
|
424
424
|
chat: string;
|
|
425
|
+
mode: string;
|
|
426
|
+
uiMode: string;
|
|
425
427
|
cliTerminalMode: string;
|
|
426
428
|
cli: string;
|
|
427
429
|
workspaceMode: string;
|
|
@@ -1126,11 +1128,6 @@ declare const messages: {
|
|
|
1126
1128
|
useCase: string;
|
|
1127
1129
|
setupNote: string;
|
|
1128
1130
|
};
|
|
1129
|
-
googleWorkspace: {
|
|
1130
|
-
description: string;
|
|
1131
|
-
useCase: string;
|
|
1132
|
-
setupNote: string;
|
|
1133
|
-
};
|
|
1134
1131
|
gitlab: {
|
|
1135
1132
|
description: string;
|
|
1136
1133
|
useCase: string;
|
|
@@ -428,6 +428,8 @@ const messages = {
|
|
|
428
428
|
downloadDesktop: "Download Desktop",
|
|
429
429
|
chatMode: "Chat mode",
|
|
430
430
|
chat: "Chat",
|
|
431
|
+
mode: "Mode",
|
|
432
|
+
uiMode: "UI",
|
|
431
433
|
cliTerminalMode: "CLI terminal mode",
|
|
432
434
|
cli: "CLI",
|
|
433
435
|
workspaceMode: "Files, agents, skills, and tasks",
|
|
@@ -1132,11 +1134,6 @@ const messages = {
|
|
|
1132
1134
|
useCase: "Observability, metrics, logs, traces, dashboards",
|
|
1133
1135
|
setupNote: "Grafana Cloud MCP is in public preview and requires Grafana Cloud Assistant MCP access. It is hosted Grafana Cloud only; self-hosted Grafana needs the local MCP server.",
|
|
1134
1136
|
},
|
|
1135
|
-
googleWorkspace: {
|
|
1136
|
-
description: "Search Google Workspace data through its remote MCP server.",
|
|
1137
|
-
useCase: "Workspace search across Gmail, Drive, Calendar, Chat, Docs, Sheets, Slides",
|
|
1138
|
-
setupNote: "Google Workspace MCP is in Developer Preview. Enable the relevant Google Workspace and MCP APIs, configure an OAuth consent screen and client, then authorize the products you want to use.",
|
|
1139
|
-
},
|
|
1140
1137
|
gitlab: {
|
|
1141
1138
|
description: "Read and manage GitLab projects, issues, and merge requests.",
|
|
1142
1139
|
useCase: "Repositories, issues, merge requests, CI/CD, code analytics",
|
|
@@ -189,6 +189,15 @@ export interface MCPRequestMeta {
|
|
|
189
189
|
* results simply fall back to their deep-link text.
|
|
190
190
|
*/
|
|
191
191
|
export declare function isMcpAppsInlineEnabled(identity: MCPCallerIdentity | undefined): boolean;
|
|
192
|
+
/**
|
|
193
|
+
* Connector-catalog membership declared on the actions themselves.
|
|
194
|
+
*
|
|
195
|
+
* This is `mcp.connectorCatalog` with the list inverted into the action files,
|
|
196
|
+
* so a rename moves the declaration with the action instead of stranding a
|
|
197
|
+
* dead string in a plugin config. Both forms feed the same set and an app can
|
|
198
|
+
* run either or both while it migrates.
|
|
199
|
+
*/
|
|
200
|
+
export declare function declaredMcpToolNames(actions: Record<string, ActionEntry>): string[];
|
|
192
201
|
export declare function isAuthenticatedReadAction(entry: ActionEntry): boolean;
|
|
193
202
|
export declare function isAutoReadExcludedActionName(name: string): boolean;
|
|
194
203
|
/**
|
package/dist/mcp/build-server.js
CHANGED
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
* — it can be bundled into the serverless function alongside `mountMCP`.
|
|
19
19
|
*/
|
|
20
20
|
import { MCP_APP_EXTENSION_ID, MCP_APP_MIME_TYPE, MCP_APP_RESOURCE_URI_META_KEY, } from "../action.js";
|
|
21
|
+
import { isActionExposedToExternalAgents } from "../action.js";
|
|
21
22
|
import { isMcpActionResult } from "../mcp-client/app-result.js";
|
|
22
23
|
import { getConfiguredAppBasePath } from "../server/app-base-path.js";
|
|
23
24
|
import { buildDeepLink, toAbsoluteOpenUrl, toDesktopOpenUrl, toVsCodeOpenUrl, } from "../server/deep-link.js";
|
|
@@ -177,6 +178,34 @@ function scopeToolSearchToAdvertised(advertised) {
|
|
|
177
178
|
},
|
|
178
179
|
};
|
|
179
180
|
}
|
|
181
|
+
/**
|
|
182
|
+
* Drop every action this request's surface must not reach at all.
|
|
183
|
+
*
|
|
184
|
+
* Applied to `actions` — the whole surface this request can reach — and not
|
|
185
|
+
* just to the advertised listing, because on the `--full-catalog` tier
|
|
186
|
+
* `actions` IS the callable set (see the `tools/call` handler below). An
|
|
187
|
+
* external-agent opt-out that only hid the schema would leave the action
|
|
188
|
+
* callable by name, which is the same "hidden but reachable" bug the
|
|
189
|
+
* `withoutToolSearch` comment above exists to prevent.
|
|
190
|
+
*
|
|
191
|
+
* The in-app agent never comes through here, so its tool list is unaffected.
|
|
192
|
+
*/
|
|
193
|
+
function withoutExternalOptOuts(actions) {
|
|
194
|
+
return Object.fromEntries(Object.entries(actions).filter(([, entry]) => isActionExposedToExternalAgents(entry)));
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Connector-catalog membership declared on the actions themselves.
|
|
198
|
+
*
|
|
199
|
+
* This is `mcp.connectorCatalog` with the list inverted into the action files,
|
|
200
|
+
* so a rename moves the declaration with the action instead of stranding a
|
|
201
|
+
* dead string in a plugin config. Both forms feed the same set and an app can
|
|
202
|
+
* run either or both while it migrates.
|
|
203
|
+
*/
|
|
204
|
+
export function declaredMcpToolNames(actions) {
|
|
205
|
+
return Object.entries(actions)
|
|
206
|
+
.filter(([, entry]) => entry.mcpTool === true)
|
|
207
|
+
.map(([name]) => name);
|
|
208
|
+
}
|
|
180
209
|
const COMPACT_MCP_APP_CATALOG_BUILTINS = new Set([
|
|
181
210
|
"list_apps",
|
|
182
211
|
"open_app",
|
|
@@ -1170,9 +1199,7 @@ export async function createMCPServerForRequest(config, identity, requestMeta) {
|
|
|
1170
1199
|
// Strip from `actions`, not just the advertised set: on the full-catalog tier
|
|
1171
1200
|
// `actions` IS the callable surface, so filtering only the listing would
|
|
1172
1201
|
// leave `tool-search` callable but invisible.
|
|
1173
|
-
const actions = flatCatalog
|
|
1174
|
-
? withoutToolSearch(mergedActions)
|
|
1175
|
-
: mergedActions;
|
|
1202
|
+
const actions = withoutExternalOptOuts(flatCatalog ? withoutToolSearch(mergedActions) : mergedActions);
|
|
1176
1203
|
const visibleActions = Object.fromEntries(Object.entries(actions).filter(([, entry]) => isActionVisibleForOAuthScope(entry, effectiveIdentity?.oauthScopes)));
|
|
1177
1204
|
// Compact/connector is the DEFAULT for every caller — hosted connectors,
|
|
1178
1205
|
// code clients (Claude Code / Cursor / Codex), and the local CLI alike. The
|
|
@@ -1187,15 +1214,17 @@ export async function createMCPServerForRequest(config, identity, requestMeta) {
|
|
|
1187
1214
|
const autoReadNames = autoAuthenticatedReadNames(visibleActions, config);
|
|
1188
1215
|
const connectorNames = new Set([
|
|
1189
1216
|
...(config.connectorCatalog ?? []),
|
|
1217
|
+
...declaredMcpToolNames(visibleActions),
|
|
1190
1218
|
...autoReadNames,
|
|
1191
1219
|
]);
|
|
1192
1220
|
const denyNames = externalAgentDenySet(config);
|
|
1193
1221
|
const automaticConnectorPolicyActive = config.externalAgents?.authenticatedReads === "auto";
|
|
1194
|
-
// Connector-catalog tier: when a template declares a connector allow-list
|
|
1195
|
-
//
|
|
1196
|
-
//
|
|
1197
|
-
//
|
|
1198
|
-
//
|
|
1222
|
+
// Connector-catalog tier: when a template declares a connector allow-list —
|
|
1223
|
+
// as `mcp.connectorCatalog` names or as `mcpTool: true` on the actions
|
|
1224
|
+
// themselves — serve exactly that curated surface plus any explicitly
|
|
1225
|
+
// annotated authenticated reads from `externalAgents.authenticatedReads:
|
|
1226
|
+
// "auto"`. This stays compact by default and keeps db-exec / seed-* /
|
|
1227
|
+
// extension / browser-session footguns off the external surface.
|
|
1199
1228
|
const connectorCatalogActive = !appCatalog &&
|
|
1200
1229
|
(connectorNames.size > 0 || automaticConnectorPolicyActive) &&
|
|
1201
1230
|
!fullCatalogRequested;
|