@agent-native/core 0.169.1 → 0.170.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/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 +16 -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/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/file-upload/actions/upload-image.d.ts +1 -1
- 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/routes.d.ts +3 -3
- 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/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 +23 -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/transcribe-voice.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 +24 -5
- package/docs/content/actions-access-control.mdx +43 -4
- package/docs/content/actions-defining.mdx +16 -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
|
@@ -222,6 +222,33 @@ async function resolveAgentEngineStatusIdentity(event) {
|
|
|
222
222
|
return { userEmail, orgId: undefined };
|
|
223
223
|
}
|
|
224
224
|
}
|
|
225
|
+
/**
|
|
226
|
+
* A Builder grant is shared by everyone in the caller's org, so establishing,
|
|
227
|
+
* overwriting, or revoking one requires org owner/admin authority. Returns the
|
|
228
|
+
* authorized org id and a denial message (null when allowed). The org id is
|
|
229
|
+
* captured at connect start so the grant is stored under the org that was
|
|
230
|
+
* authorized, not one re-resolved after the OAuth round trip. Fails closed: an
|
|
231
|
+
* unreadable owner/admin role is denied.
|
|
232
|
+
*/
|
|
233
|
+
async function resolveBuilderOrgMutation(event) {
|
|
234
|
+
let orgId = null;
|
|
235
|
+
let role = null;
|
|
236
|
+
try {
|
|
237
|
+
const orgCtx = await getOrgContext(event);
|
|
238
|
+
orgId = orgCtx.orgId ?? null;
|
|
239
|
+
role = orgCtx.role ?? null;
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
// coercion-ok: org is missing, it will fail closed
|
|
243
|
+
}
|
|
244
|
+
if (role !== "owner" && role !== "admin") {
|
|
245
|
+
return {
|
|
246
|
+
orgId,
|
|
247
|
+
deny: "Only an organization owner or admin can change the shared Builder connection.",
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
return { orgId, deny: null };
|
|
251
|
+
}
|
|
225
252
|
export function getFrameworkEnvKeys() {
|
|
226
253
|
return [
|
|
227
254
|
{ key: "ENABLE_BUILDER", label: "Enable Builder.io features" },
|
|
@@ -927,6 +954,43 @@ export function ensureS3FileUploadProvider() {
|
|
|
927
954
|
}
|
|
928
955
|
registerFileUploadProvider(s3FileUploadProvider);
|
|
929
956
|
}
|
|
957
|
+
/**
|
|
958
|
+
* Resolves the classic Builder key-pair status for a request that already
|
|
959
|
+
* has Builder MCP OAuth custody (the connection-status handler's `configured`
|
|
960
|
+
* is already `true` by the time this runs — OAuth alone proves the chat
|
|
961
|
+
* gateway). Exported so the connection-status route's OAuth-custody branch is
|
|
962
|
+
* unit-testable without standing up the full plugin.
|
|
963
|
+
*/
|
|
964
|
+
export async function resolveOAuthCustodyBuilderKeyStatus(dependencies = {
|
|
965
|
+
resolveCredentialsDetailed: async () => {
|
|
966
|
+
const { resolveBuilderCredentialsDetailed } = await import("./credential-provider.js");
|
|
967
|
+
return resolveBuilderCredentialsDetailed();
|
|
968
|
+
},
|
|
969
|
+
}) {
|
|
970
|
+
try {
|
|
971
|
+
const creds = await dependencies.resolveCredentialsDetailed();
|
|
972
|
+
return {
|
|
973
|
+
privateKeyConfigured: !!creds.privateKey,
|
|
974
|
+
publicKeyConfigured: !!creds.publicKey,
|
|
975
|
+
orgName: typeof creds.orgName === "string" && creds.orgName
|
|
976
|
+
? creds.orgName
|
|
977
|
+
: "Builder OAuth",
|
|
978
|
+
keyLookupFailed: creds.lookupFailed,
|
|
979
|
+
};
|
|
980
|
+
}
|
|
981
|
+
catch {
|
|
982
|
+
// OAuth already proves the chat gateway, so a thrown key-pair lookup
|
|
983
|
+
// here must not abort the response — but it is unreadable, not
|
|
984
|
+
// confirmed-absent, so keyLookupFailed has to say so (see the field doc
|
|
985
|
+
// above) instead of silently landing on the same `false`s as a real miss.
|
|
986
|
+
return {
|
|
987
|
+
privateKeyConfigured: false,
|
|
988
|
+
publicKeyConfigured: false,
|
|
989
|
+
orgName: "Builder OAuth",
|
|
990
|
+
keyLookupFailed: true,
|
|
991
|
+
};
|
|
992
|
+
}
|
|
993
|
+
}
|
|
930
994
|
export function createCoreRoutesPlugin(options = {}) {
|
|
931
995
|
return async (nitroApp) => {
|
|
932
996
|
markDefaultPluginProvided(nitroApp, "core-routes");
|
|
@@ -1143,7 +1207,12 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
1143
1207
|
}
|
|
1144
1208
|
for (const provider of [
|
|
1145
1209
|
"figma",
|
|
1210
|
+
"gmail",
|
|
1211
|
+
"google_calendar",
|
|
1212
|
+
"google_docs",
|
|
1146
1213
|
"google_drive",
|
|
1214
|
+
"google_sheets",
|
|
1215
|
+
"google_slides",
|
|
1147
1216
|
"github",
|
|
1148
1217
|
"hubspot",
|
|
1149
1218
|
"salesforce",
|
|
@@ -1562,29 +1631,15 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
1562
1631
|
}
|
|
1563
1632
|
}
|
|
1564
1633
|
if (oauthAccess) {
|
|
1565
|
-
|
|
1566
|
-
let publicKeyConfigured = false;
|
|
1567
|
-
let orgName = "Builder OAuth";
|
|
1568
|
-
try {
|
|
1569
|
-
const { resolveBuilderCredentials } = await import("./credential-provider.js");
|
|
1570
|
-
const creds = await resolveBuilderCredentials();
|
|
1571
|
-
privateKeyConfigured = !!creds.privateKey;
|
|
1572
|
-
publicKeyConfigured = !!creds.publicKey;
|
|
1573
|
-
if (typeof creds.orgName === "string" && creds.orgName) {
|
|
1574
|
-
orgName = creds.orgName;
|
|
1575
|
-
}
|
|
1576
|
-
}
|
|
1577
|
-
catch {
|
|
1578
|
-
// coercion-ok: OAuth already proves the chat gateway; missing
|
|
1579
|
-
// key flags only hide code-change send until secrets are readable.
|
|
1580
|
-
}
|
|
1634
|
+
const keyStatus = await resolveOAuthCustodyBuilderKeyStatus();
|
|
1581
1635
|
return withConnectToken({
|
|
1582
1636
|
...requestStatus,
|
|
1583
1637
|
configured: true,
|
|
1584
1638
|
credentialSource: "user",
|
|
1585
|
-
privateKeyConfigured,
|
|
1586
|
-
publicKeyConfigured,
|
|
1587
|
-
|
|
1639
|
+
privateKeyConfigured: keyStatus.privateKeyConfigured,
|
|
1640
|
+
publicKeyConfigured: keyStatus.publicKeyConfigured,
|
|
1641
|
+
keyLookupFailed: keyStatus.keyLookupFailed,
|
|
1642
|
+
orgName: keyStatus.orgName,
|
|
1588
1643
|
spaces: [],
|
|
1589
1644
|
});
|
|
1590
1645
|
}
|
|
@@ -1870,6 +1925,21 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
1870
1925
|
parentOrigin: getBuilderBrowserOriginForEvent(event),
|
|
1871
1926
|
});
|
|
1872
1927
|
}
|
|
1928
|
+
const { orgId: connectOrgId, deny: orgConnectDenied } = await resolveBuilderOrgMutation(event);
|
|
1929
|
+
if (orgConnectDenied) {
|
|
1930
|
+
await trackBuilderLifecycle(event, "builder connect failed", ownerEmail, {
|
|
1931
|
+
...builderConnectTrackingProperties(connectTracking),
|
|
1932
|
+
reason: "org_authorization_required",
|
|
1933
|
+
stage: "connect",
|
|
1934
|
+
});
|
|
1935
|
+
setResponseStatus(event, 403);
|
|
1936
|
+
setResponseHeader(event, "Content-Type", "text/html; charset=utf-8");
|
|
1937
|
+
return createBuilderBrowserCallbackErrorPage(orgConnectDenied, {
|
|
1938
|
+
title: "Not allowed to connect Builder for this organization",
|
|
1939
|
+
body: "Ask an organization owner or admin to connect Builder.",
|
|
1940
|
+
parentOrigin: getBuilderBrowserOriginForEvent(event),
|
|
1941
|
+
});
|
|
1942
|
+
}
|
|
1873
1943
|
const state = createBuilderConnectState();
|
|
1874
1944
|
// The standard OAuth client discovers Builder's protected-resource
|
|
1875
1945
|
// metadata, dynamically registers, and creates its S256 verifier.
|
|
@@ -1886,7 +1956,7 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
1886
1956
|
authorizationUrl = started.authorizationUrl;
|
|
1887
1957
|
await putSetting(`builder-connect-pending:${state}`, {
|
|
1888
1958
|
ownerEmail,
|
|
1889
|
-
orgId:
|
|
1959
|
+
orgId: connectOrgId,
|
|
1890
1960
|
role: null,
|
|
1891
1961
|
encryptedOAuthFlow: encryptSecretValue(JSON.stringify(oauthFlow)),
|
|
1892
1962
|
redirectUri: callbackUrl,
|
|
@@ -2242,6 +2312,7 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
2242
2312
|
const oauthFlow = JSON.parse(decryptSecretValue(encryptedOAuthFlow));
|
|
2243
2313
|
await finishBuilderOAuthAuthorization({
|
|
2244
2314
|
ownerEmail,
|
|
2315
|
+
orgId: typeof consumed.orgId === "string" ? consumed.orgId : undefined,
|
|
2245
2316
|
code,
|
|
2246
2317
|
iss,
|
|
2247
2318
|
pending: oauthFlow,
|
|
@@ -2283,6 +2354,15 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
2283
2354
|
}
|
|
2284
2355
|
try {
|
|
2285
2356
|
const hadOAuth = await hasBuilderOAuthSession(session.email);
|
|
2357
|
+
// Revoking an org-scoped grant takes the connection offline for
|
|
2358
|
+
// every member, so require org owner/admin before doing so.
|
|
2359
|
+
if (hadOAuth) {
|
|
2360
|
+
const { deny } = await resolveBuilderOrgMutation(event);
|
|
2361
|
+
if (deny) {
|
|
2362
|
+
setResponseStatus(event, 403);
|
|
2363
|
+
return { error: deny };
|
|
2364
|
+
}
|
|
2365
|
+
}
|
|
2286
2366
|
const oauthResult = hadOAuth
|
|
2287
2367
|
? await deleteBuilderOAuthSession(session.email)
|
|
2288
2368
|
: { localDeleted: false, remoteRevoked: false };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { DefaultPluginSlot } from "../app-config/plugins.js";
|
|
2
|
+
/**
|
|
3
|
+
* Which default plugin slots this deployment refuses, from `plugins.disabled`.
|
|
4
|
+
*
|
|
5
|
+
* Read on every call rather than captured once: `getAppConfig()` already caches
|
|
6
|
+
* the parse and drops that cache when the environment layer changes, and the
|
|
7
|
+
* auto-mount decision runs before some apps have called `defineAppConfig()`, so
|
|
8
|
+
* a module-level snapshot would freeze an empty list for the process.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getDisabledDefaultPlugins(): readonly DefaultPluginSlot[];
|
|
11
|
+
/**
|
|
12
|
+
* Whether the framework should withhold its default implementation of `slot`.
|
|
13
|
+
*
|
|
14
|
+
* Only the framework's own defaults are gated. An app that ships
|
|
15
|
+
* `server/plugins/<slot>.ts` mounted its plugin deliberately, and this switch
|
|
16
|
+
* does not reach in and unmount it.
|
|
17
|
+
*/
|
|
18
|
+
export declare function isDefaultPluginDisabled(slot: string): boolean;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { getAppConfig } from "../app-config/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Which default plugin slots this deployment refuses, from `plugins.disabled`.
|
|
4
|
+
*
|
|
5
|
+
* Read on every call rather than captured once: `getAppConfig()` already caches
|
|
6
|
+
* the parse and drops that cache when the environment layer changes, and the
|
|
7
|
+
* auto-mount decision runs before some apps have called `defineAppConfig()`, so
|
|
8
|
+
* a module-level snapshot would freeze an empty list for the process.
|
|
9
|
+
*/
|
|
10
|
+
export function getDisabledDefaultPlugins() {
|
|
11
|
+
return getAppConfig().plugins.disabled;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Whether the framework should withhold its default implementation of `slot`.
|
|
15
|
+
*
|
|
16
|
+
* Only the framework's own defaults are gated. An app that ships
|
|
17
|
+
* `server/plugins/<slot>.ts` mounted its plugin deliberately, and this switch
|
|
18
|
+
* does not reach in and unmount it.
|
|
19
|
+
*/
|
|
20
|
+
export function isDefaultPluginDisabled(slot) {
|
|
21
|
+
return getDisabledDefaultPlugins().includes(slot);
|
|
22
|
+
}
|
package/dist/server/edge.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { createAuthPlugin, defaultAuthPlugin } from "./auth-plugin.js";
|
|
2
|
+
export { getDisabledDefaultPlugins, isDefaultPluginDisabled, } from "./default-plugins.js";
|
|
2
3
|
export { BETTER_AUTH_MIGRATIONS, runBetterAuthMigrations, } from "./better-auth-migrations.js";
|
|
3
4
|
export { runFrameworkReleaseMigrations } from "./release-migrations.js";
|
|
4
5
|
export { createAgentChatPlugin, defaultAgentChatPlugin, refreshGlobalMcpManager, type AgentChatPluginOptions, } from "./agent-chat-plugin.js";
|
package/dist/server/edge.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { createAuthPlugin, defaultAuthPlugin } from "./auth-plugin.js";
|
|
2
|
+
export { getDisabledDefaultPlugins, isDefaultPluginDisabled, } from "./default-plugins.js";
|
|
2
3
|
export { BETTER_AUTH_MIGRATIONS, runBetterAuthMigrations, } from "./better-auth-migrations.js";
|
|
3
4
|
export { runFrameworkReleaseMigrations } from "./release-migrations.js";
|
|
4
5
|
export { createAgentChatPlugin, defaultAgentChatPlugin, refreshGlobalMcpManager, } from "./agent-chat-plugin.js";
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { setResponseHeader, setResponseStatus } from "h3";
|
|
2
|
+
import { AppConfigurationError } from "../app-config/index.js";
|
|
2
3
|
import { getMissingDefaultPlugins } from "../deploy/route-discovery.js";
|
|
3
4
|
import { MCP_PUBLIC_ROUTE_PREFIX } from "../mcp/route-paths.js";
|
|
4
5
|
import { SIGN_IN_ENTRY_PATH, SIGN_IN_LEGACY_ENTRY_PATH, } from "../shared/sign-in-journey.js";
|
|
5
6
|
import { getConfiguredAppBasePath } from "./app-base-path.js";
|
|
6
7
|
import { captureError } from "./capture-error.js";
|
|
7
8
|
import { createCsrfMiddleware } from "./csrf.js";
|
|
9
|
+
import { getDisabledDefaultPlugins } from "./default-plugins.js";
|
|
8
10
|
import { installHttpResponseTelemetryHooks, recordFrameworkReadyWait, } from "./http-response-telemetry.js";
|
|
9
11
|
import { hasRequestContext, markRequestBoundaryInstalled, runWithRequestContext, } from "./request-context.js";
|
|
10
12
|
const BOOTSTRAPPED = new WeakSet();
|
|
@@ -127,13 +129,28 @@ export function getH3App(nitroApp) {
|
|
|
127
129
|
nitroApp[APP_SHIM_KEY] = shim;
|
|
128
130
|
if (!BOOTSTRAPPED.has(nitroApp)) {
|
|
129
131
|
BOOTSTRAPPED.add(nitroApp);
|
|
130
|
-
|
|
132
|
+
// Parse now, decide later. An unknown slot name in `plugins.disabled` is
|
|
133
|
+
// an invalid deployment, not a plugin that failed to start, and the catch
|
|
134
|
+
// below would turn it into an app with every default route missing — so
|
|
135
|
+
// the value has to be read where it can still throw synchronously. The
|
|
136
|
+
// mount set is read again inside bootstrap: auto-mount can start before a
|
|
137
|
+
// server plugin has called `defineAppConfig()`, and this early read only
|
|
138
|
+
// sees the environment layer.
|
|
139
|
+
getDisabledDefaultPlugins();
|
|
140
|
+
const bootstrap = bootstrapDefaultPlugins(nitroApp).catch((err) => {
|
|
131
141
|
console.warn("[agent-native] Failed to auto-mount default plugins:", err.message);
|
|
132
142
|
captureError(err, {
|
|
133
143
|
route: "default-plugin-bootstrap",
|
|
134
144
|
tags: { phase: "default-plugin-bootstrap" },
|
|
135
145
|
});
|
|
146
|
+
if (err instanceof AppConfigurationError)
|
|
147
|
+
throw err;
|
|
136
148
|
});
|
|
149
|
+
// The readiness gate is what observes this rejection, and it only runs on
|
|
150
|
+
// a request. Without a handler attached now, Node exits on the unhandled
|
|
151
|
+
// rejection before anything can report the configuration error.
|
|
152
|
+
bootstrap.catch(() => { });
|
|
153
|
+
nitroApp[BOOTSTRAP_PROMISE_KEY] = bootstrap;
|
|
137
154
|
// Readiness gate: Nitro v3 doesn't await async plugins, so routes
|
|
138
155
|
// registered inside an async plugin may not exist when the first
|
|
139
156
|
// request arrives. These middleware entries hold framework routes
|
|
@@ -688,9 +705,12 @@ async function bootstrapDefaultPlugins(nitroApp) {
|
|
|
688
705
|
const cwd = process.cwd();
|
|
689
706
|
const discoveredMissing = await getMissingDefaultPlugins(cwd);
|
|
690
707
|
const provided = nitroApp[PROVIDED_PLUGIN_STEMS_KEY];
|
|
691
|
-
const
|
|
708
|
+
const undiscovered = provided
|
|
692
709
|
? discoveredMissing.filter((stem) => !provided.has(stem))
|
|
693
710
|
: discoveredMissing;
|
|
711
|
+
const disabled = getDisabledDefaultPlugins();
|
|
712
|
+
const missing = undiscovered.filter((stem) => !disabled.includes(stem));
|
|
713
|
+
const refused = undiscovered.filter((stem) => disabled.includes(stem));
|
|
694
714
|
if (missing.length === 0)
|
|
695
715
|
return;
|
|
696
716
|
// Lazy import to avoid circular dependency at module load time
|
|
@@ -760,7 +780,10 @@ async function bootstrapDefaultPlugins(nitroApp) {
|
|
|
760
780
|
// runtime without fs). Silently fall through to framework defaults.
|
|
761
781
|
}
|
|
762
782
|
if (process.env.DEBUG)
|
|
763
|
-
console.log(`[agent-native] Auto-mounting ${missing.length} default plugin(s): ${missing.join(", ")}`
|
|
783
|
+
console.log(`[agent-native] Auto-mounting ${missing.length} default plugin(s): ${missing.join(", ")}` +
|
|
784
|
+
(refused.length > 0
|
|
785
|
+
? ` (refused by plugins.disabled: ${refused.join(", ")})`
|
|
786
|
+
: ""));
|
|
764
787
|
for (const stem of missing) {
|
|
765
788
|
// Prefer workspace-core impl over framework default when both exist.
|
|
766
789
|
const impl = workspaceImpls[stem] ?? frameworkImpls[stem];
|
|
@@ -774,6 +797,11 @@ async function bootstrapDefaultPlugins(nitroApp) {
|
|
|
774
797
|
route: "default-plugin-bootstrap",
|
|
775
798
|
tags: { phase: "default-plugin-bootstrap", plugin: stem },
|
|
776
799
|
});
|
|
800
|
+
// A plugin that cannot start is optional; a plugin the deployment
|
|
801
|
+
// configured wrongly is not. Skipping it leaves the operator with
|
|
802
|
+
// routes that 404 and a deployment that reported success.
|
|
803
|
+
if (e instanceof AppConfigurationError)
|
|
804
|
+
throw e;
|
|
777
805
|
}
|
|
778
806
|
}
|
|
779
807
|
}
|
|
@@ -97,6 +97,8 @@ export interface OAuthStatePayload {
|
|
|
97
97
|
mobile?: boolean;
|
|
98
98
|
addAccount?: boolean;
|
|
99
99
|
app?: string;
|
|
100
|
+
/** Optional signed scope for provider-specific OAuth flows. */
|
|
101
|
+
scope?: string;
|
|
100
102
|
/**
|
|
101
103
|
* Same-origin path to redirect to after a successful web-flow sign-in.
|
|
102
104
|
* Threaded through the (HMAC-signed) state so it survives the round trip
|
|
@@ -129,6 +131,7 @@ export interface EncodeOAuthStateOptions {
|
|
|
129
131
|
mobile?: boolean;
|
|
130
132
|
addAccount?: boolean;
|
|
131
133
|
app?: string;
|
|
134
|
+
scope?: string;
|
|
132
135
|
returnUrl?: string;
|
|
133
136
|
flowId?: string;
|
|
134
137
|
desktopVerifierHash?: string;
|
|
@@ -459,6 +459,8 @@ export function encodeOAuthState(redirectUriOrOpts, owner, desktop, addAccount,
|
|
|
459
459
|
payload.a = true;
|
|
460
460
|
if (opts.app)
|
|
461
461
|
payload.app = opts.app;
|
|
462
|
+
if (opts.scope)
|
|
463
|
+
payload.s = opts.scope;
|
|
462
464
|
if (opts.returnUrl)
|
|
463
465
|
payload.r2 = opts.returnUrl;
|
|
464
466
|
if (opts.flowId)
|
|
@@ -511,6 +513,7 @@ export function decodeOAuthState(stateParam, fallbackUri) {
|
|
|
511
513
|
mobile: !!parsed.m,
|
|
512
514
|
addAccount: !!parsed.a,
|
|
513
515
|
app: typeof parsed.app === "string" ? parsed.app : undefined,
|
|
516
|
+
scope: typeof parsed.s === "string" ? parsed.s : undefined,
|
|
514
517
|
// Pass returnUrl through as-is — same-origin validation runs at the
|
|
515
518
|
// consumer (oauthCallbackResponse → safeReturnPath). The state is
|
|
516
519
|
// HMAC-signed, but we still validate at consumption as defence in
|
package/dist/server/index.d.ts
CHANGED
|
@@ -69,13 +69,13 @@ export { createOnboardingPlugin, defaultOnboardingPlugin, } from "../onboarding/
|
|
|
69
69
|
export { registerFileUploadProvider, unregisterFileUploadProvider, listFileUploadProviders, getActiveFileUploadProvider, getActiveFileUploadProviderForRequest, uploadFile, builderFileUploadProvider, type FileUploadInput, type FileUploadProvider, type FileUploadResult, } from "../file-upload/index.js";
|
|
70
70
|
export { createIntegrationsPlugin, defaultIntegrationsPlugin, enqueueRemoteCommand, slackAdapter, telegramAdapter, whatsappAdapter, discordAdapter, microsoftTeamsAdapter, emailAdapter, assertPlatformCapability, type PlatformAdapter, type IncomingMessage, type OutgoingMessage, type PlatformAdapterCapabilities, type ImmediateWebhookResponse, type IntegrationStatus, type IntegrationsPluginOptions, type IntegrationExecutionContext, BUILT_IN_INTEGRATION_CATALOG, INTEGRATION_CATEGORIES, getIntegrationCatalogEntry, listBuiltInChannelIntegrations, listIntegrationCatalog, type BuiltInChannelId, type ChannelCapabilities, type IntegrationAvailability, type IntegrationCatalogEntry, type IntegrationCategory, type IntegrationCredentialRequirement, type IntegrationIconKey, type IntegrationSupportMaturity, } from "../integrations/index.js";
|
|
71
71
|
export { isElectron, isMobile, getOrigin, getAppBasePath, getAppUrl, resolveOAuthRedirectUri, isAllowedOAuthRedirectUri, encodeOAuthState, decodeOAuthState, resolveOAuthOwner, createOAuthSession, oauthCallbackResponse, oauthErrorPage, oauthDesktopExchangePage, type OAuthStatePayload, type OAuthOwnerResult, type OAuthSessionResult, } from "./google-oauth.js";
|
|
72
|
-
export { buildWorkspaceProviderAuthorizationUrl, createWorkspaceProviderOAuthHandler, exchangeWorkspaceProviderOAuthCode, handleWorkspaceProviderOAuthCallback, handleWorkspaceProviderOAuthStart, isWorkspaceProviderOAuthFlowValid, mergeWorkspaceOAuthValues, resolveWorkspaceProviderIdentity, workspaceProviderOAuthPath, type GenericWorkspaceOAuthProvider, type WorkspaceProviderOAuthFlow, } from "./workspace-provider-oauth.js";
|
|
73
|
-
export { FeatureNotConfiguredError, hasBuilderPrivateKey, isBuilderEnvManaged, getBuilderProxyOrigin, getBuilderImageGenerationBaseUrl, getBuilderWebSearchBaseUrl, getBuilderAuthHeader, resolveBuilderPrivateKey, resolveBuilderAuthHeader, resolveHasBuilderPrivateKey, resolveHasCompleteBuilderConnection, resolveBuilderCredentials, resolveBuilderCredentialsDetailed, resolveBuilderGatewayCredentials, resolveBuilderGatewayCredentialsDetailed, resolveBuilderCredentialSource, resolveBuilderCredential, readDeployCredentialEnv, writeBuilderCredentials, deleteBuilderCredentials, resolveSecret, type BuilderCredentialsDetailed, } from "./credential-provider.js";
|
|
74
|
-
export { builderDesignSystemUrl, builderProjectBranchUrl, buildBuilderDesignSystemIndexFiles, collectBuilderDesignSystemGitHubFiles, createBuilderDesignSystemProxyFields, fetchBuilderDesignSystemDecodeJobStatus, fetchBuilderDesignSystemDocs, getBuilderDesignSystemsBaseUrl, hydrateBuilderDesignSystemReference, indexBuilderDesignSystem, localBuilderDesignSystemId, mimeTypeForBuilderDesignSystemFilename, parseBuilderDesignSystemProxyReference, startBuilderDesignSystemIndex, startBuilderDesignSystemUpload, type BuildBuilderDesignSystemIndexFilesOptions, type BuilderDesignSystemCodeFileInput, type BuilderDesignSystemDecodeJobStatus, type BuilderDesignSystemDocsOptions, type BuilderDesignSystemDocument, type BuilderDesignSystemHydratedReference, type BuilderDesignSystemIndexFile, type BuilderDesignSystemIndexFromSourcesOptions, type BuilderDesignSystemIndexOptions, type BuilderDesignSystemIndexResult, type BuilderDesignSystemGitHubFile, type BuilderDesignSystemGitHubFileCollection, type BuilderDesignSystemGitHubSource, type BuilderDesignSystemUploadAttachment, type BuilderDesignSystemUploadSlot, type BuilderDesignSystemProxyFields, type BuilderDesignSystemProxyFieldsOptions, type BuilderDesignSystemProxyReference, type BuilderDesignSystemSourceKind, } from "./builder-design-systems.js";
|
|
72
|
+
export { buildWorkspaceProviderAuthorizationUrl, createWorkspaceProviderOAuthHandler, exchangeWorkspaceProviderOAuthCode, handleWorkspaceProviderOAuthCallback, handleWorkspaceProviderOAuthStart, hasWorkspaceProviderOAuthCredentials, isGoogleWorkspaceOAuthProvider, isWorkspaceProviderOAuthFlowValid, mergeWorkspaceOAuthValues, resolveWorkspaceProviderIdentity, workspaceProviderOAuthPath, type GenericWorkspaceOAuthProvider, type WorkspaceProviderOAuthFlow, } from "./workspace-provider-oauth.js";
|
|
73
|
+
export { CredentialStoreUnavailableError, FeatureNotConfiguredError, hasBuilderPrivateKey, isBuilderEnvManaged, getBuilderProxyOrigin, getBuilderImageGenerationBaseUrl, getBuilderWebSearchBaseUrl, getBuilderAuthHeader, resolveBuilderPrivateKey, resolveBuilderAuthHeader, resolveHasBuilderPrivateKey, resolveHasCompleteBuilderConnection, resolveBuilderCredentials, resolveBuilderCredentialsDetailed, resolveBuilderGatewayCredentials, resolveBuilderGatewayCredentialsDetailed, resolveBuilderCredentialSource, resolveBuilderCredential, readDeployCredentialEnv, writeBuilderCredentials, deleteBuilderCredentials, resolveSecret, type BuilderCredentialsDetailed, } from "./credential-provider.js";
|
|
74
|
+
export { builderDesignSystemUrl, builderProjectBranchUrl, buildBuilderDesignSystemIndexFiles, collectBuilderDesignSystemGitHubFiles, createBuilderDesignSystemProxyFields, fetchBuilderDesignSystemDecodeJobStatus, fetchBuilderDesignSystemDocs, getBuilderDesignSystemsBaseUrl, hydrateBuilderDesignSystemReference, indexBuilderDesignSystem, localBuilderDesignSystemId, mimeTypeForBuilderDesignSystemFilename, parseBuilderDesignSystemProxyReference, startBuilderDesignSystemIndex, startBuilderDesignSystemUpload, type BuildBuilderDesignSystemIndexFilesOptions, type BuilderDesignSystemCodeFileInput, type BuilderDesignSystemDecodeJobStatus, type BuilderDesignSystemDocsOptions, type BuilderDesignSystemDocument, type BuilderDesignSystemHydratedReference, type BuilderDesignSystemIndexFile, type BuilderDesignSystemIndexFromSourcesOptions, type BuilderDesignSystemIndexOptions, type BuilderDesignSystemIndexResult, type BuilderDesignSystemStatus, type BuilderDesignSystemGitHubFile, type BuilderDesignSystemGitHubFileCollection, type BuilderDesignSystemGitHubSource, type BuilderDesignSystemUploadAttachment, type BuilderDesignSystemUploadSlot, type BuilderDesignSystemProxyFields, type BuilderDesignSystemProxyFieldsOptions, type BuilderDesignSystemProxyReference, type BuilderDesignSystemSourceKind, } from "./builder-design-systems.js";
|
|
75
75
|
export { createBuilderProject, ensureBuilderProject, findBuilderProjectForRepo, getBuilderBranchProjectId, isBuilderBranchingEnabled, requestBuilderBrowserConnection, resolveBuilderBranchProjectId, resolveIsBuilderBranchingEnabled, runBuilderAgent, type BuilderProjectResult, type RunBuilderAgentResult, } from "./builder-browser.js";
|
|
76
76
|
export { ensureFusionContainer, sendFusionBranchMessage, pushFusionBranch, reserveFusionHostingSlug, deployFusionProject, getFusionDeploys, getFusionBranchEditorUrl, getFusionHostingUrl, type FusionBranchRef, type EnsureFusionContainerResult, type SendFusionMessageResult, } from "./fusion-app.js";
|
|
77
77
|
export { sendEmail, isEmailConfigured, getEmailReadiness, getEmailProvider, type EmailAttachment, type EmailReadiness, type EmailProvider, type SendEmailArgs, } from "./email.js";
|
|
78
|
-
export { defineTransactionalEmail, listTransactionalEmails, getTransactionalEmail, renderTransactionalEmailPreview, type TransactionalEmailDefinition, type RegisteredTransactionalEmail, } from "../email-catalog/registry.js";
|
|
78
|
+
export { defineTransactionalEmail, defineTransactionalEmails, replaceTransactionalEmails, listTransactionalEmails, getTransactionalEmail, renderTransactionalEmailPreview, type TransactionalEmailDefinition, type RegisteredTransactionalEmail, } from "../email-catalog/registry.js";
|
|
79
79
|
export { notifyActivity, runActivityNotification, resolveActivityRecipients, type ActivityDeliveryFailure, type ActivityNotificationResult, type ActivityNotificationStatus, type NotifyActivityInput, type ResolveActivityRecipientsInput, } from "./activity-notifications.js";
|
|
80
80
|
export { renderEmail, emailStrong, emailLink, type RenderEmailArgs, type RenderedEmail, type EmailCta, } from "./email-template.js";
|
|
81
81
|
export { getAppProductionUrl, getFirstPartyProdUrl } from "./app-url.js";
|
package/dist/server/index.js
CHANGED
|
@@ -74,8 +74,8 @@ export { createOnboardingPlugin, defaultOnboardingPlugin, } from "../onboarding/
|
|
|
74
74
|
export { registerFileUploadProvider, unregisterFileUploadProvider, listFileUploadProviders, getActiveFileUploadProvider, getActiveFileUploadProviderForRequest, uploadFile, builderFileUploadProvider, } from "../file-upload/index.js";
|
|
75
75
|
export { createIntegrationsPlugin, defaultIntegrationsPlugin, enqueueRemoteCommand, slackAdapter, telegramAdapter, whatsappAdapter, discordAdapter, microsoftTeamsAdapter, emailAdapter, assertPlatformCapability, BUILT_IN_INTEGRATION_CATALOG, INTEGRATION_CATEGORIES, getIntegrationCatalogEntry, listBuiltInChannelIntegrations, listIntegrationCatalog, } from "../integrations/index.js";
|
|
76
76
|
export { isElectron, isMobile, getOrigin, getAppBasePath, getAppUrl, resolveOAuthRedirectUri, isAllowedOAuthRedirectUri, encodeOAuthState, decodeOAuthState, resolveOAuthOwner, createOAuthSession, oauthCallbackResponse, oauthErrorPage, oauthDesktopExchangePage, } from "./google-oauth.js";
|
|
77
|
-
export { buildWorkspaceProviderAuthorizationUrl, createWorkspaceProviderOAuthHandler, exchangeWorkspaceProviderOAuthCode, handleWorkspaceProviderOAuthCallback, handleWorkspaceProviderOAuthStart, isWorkspaceProviderOAuthFlowValid, mergeWorkspaceOAuthValues, resolveWorkspaceProviderIdentity, workspaceProviderOAuthPath, } from "./workspace-provider-oauth.js";
|
|
78
|
-
export { FeatureNotConfiguredError, hasBuilderPrivateKey, isBuilderEnvManaged, getBuilderProxyOrigin, getBuilderImageGenerationBaseUrl, getBuilderWebSearchBaseUrl, getBuilderAuthHeader, resolveBuilderPrivateKey, resolveBuilderAuthHeader, resolveHasBuilderPrivateKey, resolveHasCompleteBuilderConnection, resolveBuilderCredentials, resolveBuilderCredentialsDetailed,
|
|
77
|
+
export { buildWorkspaceProviderAuthorizationUrl, createWorkspaceProviderOAuthHandler, exchangeWorkspaceProviderOAuthCode, handleWorkspaceProviderOAuthCallback, handleWorkspaceProviderOAuthStart, hasWorkspaceProviderOAuthCredentials, isGoogleWorkspaceOAuthProvider, isWorkspaceProviderOAuthFlowValid, mergeWorkspaceOAuthValues, resolveWorkspaceProviderIdentity, workspaceProviderOAuthPath, } from "./workspace-provider-oauth.js";
|
|
78
|
+
export { CredentialStoreUnavailableError, FeatureNotConfiguredError, hasBuilderPrivateKey, isBuilderEnvManaged, getBuilderProxyOrigin, getBuilderImageGenerationBaseUrl, getBuilderWebSearchBaseUrl, getBuilderAuthHeader, resolveBuilderPrivateKey, resolveBuilderAuthHeader, resolveHasBuilderPrivateKey, resolveHasCompleteBuilderConnection, resolveBuilderCredentials, resolveBuilderCredentialsDetailed,
|
|
79
79
|
// Gateway lane, for the metered surfaces a deployed site can call without an
|
|
80
80
|
// identity — image and video generation, realtime transcription. Falls
|
|
81
81
|
// through to the identity credential first, so a consumer moves lane by
|
|
@@ -85,7 +85,7 @@ export { builderDesignSystemUrl, builderProjectBranchUrl, buildBuilderDesignSyst
|
|
|
85
85
|
export { createBuilderProject, ensureBuilderProject, findBuilderProjectForRepo, getBuilderBranchProjectId, isBuilderBranchingEnabled, requestBuilderBrowserConnection, resolveBuilderBranchProjectId, resolveIsBuilderBranchingEnabled, runBuilderAgent, } from "./builder-browser.js";
|
|
86
86
|
export { ensureFusionContainer, sendFusionBranchMessage, pushFusionBranch, reserveFusionHostingSlug, deployFusionProject, getFusionDeploys, getFusionBranchEditorUrl, getFusionHostingUrl, } from "./fusion-app.js";
|
|
87
87
|
export { sendEmail, isEmailConfigured, getEmailReadiness, getEmailProvider, } from "./email.js";
|
|
88
|
-
export { defineTransactionalEmail, listTransactionalEmails, getTransactionalEmail, renderTransactionalEmailPreview, } from "../email-catalog/registry.js";
|
|
88
|
+
export { defineTransactionalEmail, defineTransactionalEmails, replaceTransactionalEmails, listTransactionalEmails, getTransactionalEmail, renderTransactionalEmailPreview, } from "../email-catalog/registry.js";
|
|
89
89
|
export { notifyActivity, runActivityNotification, resolveActivityRecipients, } from "./activity-notifications.js";
|
|
90
90
|
export { renderEmail, emailStrong, emailLink, } from "./email-template.js";
|
|
91
91
|
export { getAppProductionUrl, getFirstPartyProdUrl } from "./app-url.js";
|
|
@@ -11,7 +11,7 @@ import { getLocaleInitScript } from "../localization/server.js";
|
|
|
11
11
|
import { DEFAULT_LOCALE, LOCALE_METADATA, LOCALE_STORAGE_KEY, SUPPORTED_LOCALES, localeDisplayName, } from "../localization/shared.js";
|
|
12
12
|
import { NATIVE_AUTH_COPY } from "../shared/auth-copy.js";
|
|
13
13
|
import { docsUrl } from "../shared/docs-url.js";
|
|
14
|
-
import { BETA_OPT_OUT_DURATION_MS, BETA_OPT_OUT_QUERY_PARAM, BETA_OPT_OUT_STORAGE_KEY, ENVIRONMENT_BETA_HOSTS, } from "../shared/environment-lanes.js";
|
|
14
|
+
import { BETA_FORCE_QUERY_PARAM, BETA_FORCE_SESSION_STORAGE_KEY, BETA_OPT_OUT_DURATION_MS, BETA_OPT_OUT_QUERY_PARAM, BETA_OPT_OUT_STORAGE_KEY, ENVIRONMENT_BETA_HOSTS, } from "../shared/environment-lanes.js";
|
|
15
15
|
import { PASSWORD_MAX_LENGTH, PASSWORD_MIN_LENGTH, } from "../shared/password-policy.js";
|
|
16
16
|
import { signInJourneyInlineScript } from "../shared/sign-in-journey.js";
|
|
17
17
|
import { AGENT_NATIVE_SOCIAL_IMAGE_ALT, AGENT_NATIVE_SOCIAL_IMAGE_HEIGHT, AGENT_NATIVE_SOCIAL_IMAGE_PATH, AGENT_NATIVE_SOCIAL_IMAGE_TYPE, AGENT_NATIVE_SOCIAL_IMAGE_WIDTH, withAgentNativeSocialImageCacheBuster, } from "../shared/social-meta.js";
|
|
@@ -1035,6 +1035,7 @@ ${localeMenuItemsHtml}
|
|
|
1035
1035
|
<div class="environment-popover-title" id="environment-popover-title">You're on Agent Native Beta</div>
|
|
1036
1036
|
<div class="environment-popover-copy">Choose where you want to continue.</div>
|
|
1037
1037
|
<a class="environment-production-link" id="environment-production-link" href="">Switch to production</a>
|
|
1038
|
+
<button type="button" class="environment-hide-badge" id="environment-hide-badge">Hide badge</button>
|
|
1038
1039
|
</div>
|
|
1039
1040
|
</div>`;
|
|
1040
1041
|
const hostedSignupLegalNotice = opts.signupLegalNotice === undefined &&
|
|
@@ -1430,9 +1431,19 @@ ${marketing.description ? ` <p class="app-desc" data-marketing-field="descr
|
|
|
1430
1431
|
var button = document.getElementById('environment-badge');
|
|
1431
1432
|
var popover = document.getElementById('environment-popover');
|
|
1432
1433
|
var productionLink = document.getElementById('environment-production-link');
|
|
1433
|
-
|
|
1434
|
+
var hideButton = document.getElementById('environment-hide-badge');
|
|
1435
|
+
if (!switcher || !button || !popover || !productionLink || !hideButton) return;
|
|
1434
1436
|
if (window.parent !== window) return;
|
|
1435
1437
|
|
|
1438
|
+
try {
|
|
1439
|
+
var forceUrl = new URL(window.location.href);
|
|
1440
|
+
if (forceUrl.searchParams.get(${JSON.stringify(BETA_FORCE_QUERY_PARAM)}) === 'true') {
|
|
1441
|
+
window.sessionStorage.setItem(${JSON.stringify(BETA_FORCE_SESSION_STORAGE_KEY)}, '1');
|
|
1442
|
+
}
|
|
1443
|
+
} catch (error) {
|
|
1444
|
+
void error;
|
|
1445
|
+
}
|
|
1446
|
+
|
|
1436
1447
|
// Persist the beta opt-out before authentication replaces this cached shell.
|
|
1437
1448
|
try {
|
|
1438
1449
|
var optOutUrl = new URL(window.location.href);
|
|
@@ -1496,6 +1507,10 @@ ${marketing.description ? ` <p class="app-desc" data-marketing-field="descr
|
|
|
1496
1507
|
document.addEventListener('keydown', function(event) {
|
|
1497
1508
|
if (event.key === 'Escape') setOpen(false);
|
|
1498
1509
|
});
|
|
1510
|
+
hideButton.addEventListener('click', function() {
|
|
1511
|
+
setOpen(false);
|
|
1512
|
+
switcher.hidden = true;
|
|
1513
|
+
});
|
|
1499
1514
|
})();`;
|
|
1500
1515
|
return `<!DOCTYPE html>
|
|
1501
1516
|
<html lang="${DEFAULT_LOCALE}" dir="ltr">
|
|
@@ -1668,7 +1683,8 @@ ${hasMarketing
|
|
|
1668
1683
|
.environment-badge:hover,
|
|
1669
1684
|
.environment-badge[aria-expanded="true"] { background: #4a4a4a; }
|
|
1670
1685
|
.environment-badge:focus-visible,
|
|
1671
|
-
.environment-production-link:focus-visible
|
|
1686
|
+
.environment-production-link:focus-visible,
|
|
1687
|
+
.environment-hide-badge:focus-visible {
|
|
1672
1688
|
outline: 2px solid #33c4ff;
|
|
1673
1689
|
outline-offset: 2px;
|
|
1674
1690
|
}
|
|
@@ -1700,6 +1716,24 @@ ${hasMarketing
|
|
|
1700
1716
|
text-decoration: none;
|
|
1701
1717
|
}
|
|
1702
1718
|
.environment-production-link:hover { background: #242424; }
|
|
1719
|
+
.environment-hide-badge {
|
|
1720
|
+
display: flex;
|
|
1721
|
+
align-items: center;
|
|
1722
|
+
justify-content: center;
|
|
1723
|
+
width: 100%;
|
|
1724
|
+
min-height: 2rem;
|
|
1725
|
+
margin-top: 0.5rem;
|
|
1726
|
+
margin-bottom: -0.5rem;
|
|
1727
|
+
padding: 0.375rem 0.75rem;
|
|
1728
|
+
color: inherit;
|
|
1729
|
+
opacity: 0.65;
|
|
1730
|
+
border: 0;
|
|
1731
|
+
background: transparent;
|
|
1732
|
+
font: inherit;
|
|
1733
|
+
font-size: 0.8125rem;
|
|
1734
|
+
cursor: pointer;
|
|
1735
|
+
}
|
|
1736
|
+
.environment-hide-badge:hover { opacity: 1; }
|
|
1703
1737
|
.card {
|
|
1704
1738
|
width: 100%;
|
|
1705
1739
|
max-width: 400px;
|
|
@@ -26,8 +26,8 @@ export declare function createRealtimeTokenHandler(): import("h3").EventHandlerW
|
|
|
26
26
|
expiresAt?: undefined;
|
|
27
27
|
ttlSeconds?: undefined;
|
|
28
28
|
} | {
|
|
29
|
-
error?: undefined;
|
|
30
29
|
token: string;
|
|
31
30
|
expiresAt: string;
|
|
32
31
|
ttlSeconds: number;
|
|
32
|
+
error?: undefined;
|
|
33
33
|
}>>;
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { type H3Event } from "h3";
|
|
2
2
|
import { type WorkspaceConnectionProvider } from "../connections/catalog.js";
|
|
3
3
|
import { type OAuthStatePayload } from "./google-oauth.js";
|
|
4
|
-
export type GenericWorkspaceOAuthProvider = "figma" | "google_drive" | "github" | "hubspot" | "salesforce" | "jira" | "sentry" | "notion";
|
|
4
|
+
export type GenericWorkspaceOAuthProvider = "figma" | "gmail" | "google_calendar" | "google_docs" | "google_drive" | "google_sheets" | "google_slides" | "github" | "hubspot" | "salesforce" | "jira" | "sentry" | "notion";
|
|
5
|
+
export type WorkspaceProviderOAuthScope = "user" | "organization" | "app";
|
|
6
|
+
export declare function isWorkspaceProviderOAuthScope(value: unknown): value is WorkspaceProviderOAuthScope;
|
|
7
|
+
export declare function isGoogleWorkspaceOAuthProvider(provider: string): boolean;
|
|
8
|
+
export declare function hasWorkspaceProviderOAuthCredentials(provider: GenericWorkspaceOAuthProvider): Promise<boolean>;
|
|
5
9
|
export interface WorkspaceProviderOAuthFlow {
|
|
6
10
|
provider: GenericWorkspaceOAuthProvider;
|
|
7
11
|
flowId: string;
|
|
@@ -10,6 +14,7 @@ export interface WorkspaceProviderOAuthFlow {
|
|
|
10
14
|
owner: string;
|
|
11
15
|
orgId?: string;
|
|
12
16
|
appId: string;
|
|
17
|
+
scope: WorkspaceProviderOAuthScope;
|
|
13
18
|
salesforceLoginUrl?: string;
|
|
14
19
|
expiresAt: number;
|
|
15
20
|
}
|