@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
|
@@ -5,6 +5,16 @@ import { buildChatModelGroups, } from "./chat-model-groups.js";
|
|
|
5
5
|
import { fetchBuilderStatus, fetchEnvironmentStatus, } from "./client-status-requests.js";
|
|
6
6
|
import { callAction } from "./use-action.js";
|
|
7
7
|
const DEFAULT_STORAGE_KEY = "agent-native:chat-models:selection";
|
|
8
|
+
/**
|
|
9
|
+
* `useChatModels` takes the raw localStorage key while `MultiTabAssistantChat`
|
|
10
|
+
* takes only the namespace suffix — a surface that hand-writes either one stops
|
|
11
|
+
* sharing the selection with the chat it sits next to.
|
|
12
|
+
*/
|
|
13
|
+
export function chatModelSelectionStorageKey(namespace) {
|
|
14
|
+
return namespace
|
|
15
|
+
? `${DEFAULT_STORAGE_KEY}:${namespace}`
|
|
16
|
+
: DEFAULT_STORAGE_KEY;
|
|
17
|
+
}
|
|
8
18
|
export const CHAT_MODEL_SELECTION_CHANGED_EVENT = "agent-native:chat-model-selection-changed";
|
|
9
19
|
const MODEL_DISCOVERY_RETRY_DELAYS_MS = [250, 1_000];
|
|
10
20
|
async function fetchEngineCatalog() {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { useEffect, useRef, useState } from "react";
|
|
2
2
|
import { ensureDemoModeFetchInterceptor } from "../demo/fetch-interceptor.js";
|
|
3
3
|
import { parseHandshakeFrame, parseTokenFrame, REALTIME_PROTOCOL_VERSION, REALTIME_SSE_HANDSHAKE_EVENT, REALTIME_SSE_TOKEN_EVENT, } from "../realtime-protocol.js";
|
|
4
|
+
import { addSurfaceVisibilityListener, isHostSurfaceHidden, isSurfaceHidden, } from "../shared/surface-visibility.js";
|
|
4
5
|
import { agentNativePath } from "./api-path.js";
|
|
5
6
|
import { getBrowserTabId } from "./browser-tab-id.js";
|
|
6
7
|
import { ensureEmbedAuthFetchInterceptor, isEmbedAuthActive, } from "./embed-auth.js";
|
|
@@ -103,7 +104,7 @@ function getPollAbortMs(interval) {
|
|
|
103
104
|
return Math.max(POLL_ABORT_MIN_MS, interval * 4);
|
|
104
105
|
}
|
|
105
106
|
function isDocumentHidden() {
|
|
106
|
-
return (
|
|
107
|
+
return isSurfaceHidden();
|
|
107
108
|
}
|
|
108
109
|
function resolveSseUrl(sseUrl) {
|
|
109
110
|
if (sseUrl === false)
|
|
@@ -269,6 +270,7 @@ class SyncTransport {
|
|
|
269
270
|
subscribers = new Map();
|
|
270
271
|
cursorRef = { ...INITIAL_SYNC_CURSOR };
|
|
271
272
|
timer = null;
|
|
273
|
+
removeVisibilityListener;
|
|
272
274
|
stopped = false;
|
|
273
275
|
inFlight = false;
|
|
274
276
|
eventSource = null;
|
|
@@ -470,6 +472,17 @@ class SyncTransport {
|
|
|
470
472
|
// -------------------------------------------------------------------------
|
|
471
473
|
// Derived settings (aggregate over active subscribers)
|
|
472
474
|
// -------------------------------------------------------------------------
|
|
475
|
+
/**
|
|
476
|
+
* Whether this transport must do nothing at all right now. A host that has
|
|
477
|
+
* stashed the surface off screen is a stronger statement than a backgrounded
|
|
478
|
+
* browser tab, so it pauses regardless of `pauseWhenHidden` — an embedder
|
|
479
|
+
* only sets it for a surface the user genuinely cannot see.
|
|
480
|
+
*/
|
|
481
|
+
shouldStayIdle() {
|
|
482
|
+
if (isHostSurfaceHidden())
|
|
483
|
+
return true;
|
|
484
|
+
return this.effectivePauseWhenHidden && isDocumentHidden();
|
|
485
|
+
}
|
|
473
486
|
get effectivePauseWhenHidden() {
|
|
474
487
|
// Pause only if every subscriber has opted in.
|
|
475
488
|
for (const sub of this.subscribers.values()) {
|
|
@@ -550,7 +563,7 @@ class SyncTransport {
|
|
|
550
563
|
schedulePoll() {
|
|
551
564
|
if (this.stopped)
|
|
552
565
|
return;
|
|
553
|
-
if (this.
|
|
566
|
+
if (this.shouldStayIdle())
|
|
554
567
|
return;
|
|
555
568
|
if (this.timer)
|
|
556
569
|
clearTimeout(this.timer);
|
|
@@ -743,7 +756,7 @@ class SyncTransport {
|
|
|
743
756
|
if (this.stopped ||
|
|
744
757
|
this.eventSource ||
|
|
745
758
|
typeof EventSource === "undefined" ||
|
|
746
|
-
|
|
759
|
+
this.shouldStayIdle()) {
|
|
747
760
|
return;
|
|
748
761
|
}
|
|
749
762
|
// One tab per origin holds the stream; the rest follow it over
|
|
@@ -896,6 +909,10 @@ class SyncTransport {
|
|
|
896
909
|
async poll() {
|
|
897
910
|
if (this.stopped || this.inFlight)
|
|
898
911
|
return;
|
|
912
|
+
// Re-checked here, not only at the schedule sites: whatever path
|
|
913
|
+
// reached poll(), a host-hidden surface must not issue a request.
|
|
914
|
+
if (this.shouldStayIdle())
|
|
915
|
+
return;
|
|
899
916
|
this.inFlight = true;
|
|
900
917
|
try {
|
|
901
918
|
if (this.mode === "hosted" && this.gateway && !this.token) {
|
|
@@ -947,7 +964,7 @@ class SyncTransport {
|
|
|
947
964
|
}
|
|
948
965
|
}
|
|
949
966
|
pollNow() {
|
|
950
|
-
if (this.
|
|
967
|
+
if (this.shouldStayIdle())
|
|
951
968
|
return;
|
|
952
969
|
if (this.authFailureDelayMs() > 0) {
|
|
953
970
|
this.schedulePoll();
|
|
@@ -961,11 +978,11 @@ class SyncTransport {
|
|
|
961
978
|
void this.poll();
|
|
962
979
|
}
|
|
963
980
|
handleVisibilityChange = () => {
|
|
964
|
-
if (
|
|
981
|
+
if (!isSurfaceHidden()) {
|
|
965
982
|
this.connectEvents();
|
|
966
983
|
this.pollNow();
|
|
967
984
|
}
|
|
968
|
-
else if (this.
|
|
985
|
+
else if (this.shouldStayIdle()) {
|
|
969
986
|
this.closeEvents();
|
|
970
987
|
// A hidden leader stops streaming, so it must not keep holding the
|
|
971
988
|
// origin's stream slot — that would leave every visible tab following a
|
|
@@ -1030,13 +1047,13 @@ class SyncTransport {
|
|
|
1030
1047
|
// already mounts useDbSync, so this needs zero per-template wiring.
|
|
1031
1048
|
ensureEmbedAuthFetchInterceptor();
|
|
1032
1049
|
ensureDemoModeFetchInterceptor();
|
|
1033
|
-
if (!this.
|
|
1050
|
+
if (!this.shouldStayIdle()) {
|
|
1034
1051
|
this.connectEvents();
|
|
1035
1052
|
void this.poll();
|
|
1036
1053
|
}
|
|
1037
1054
|
window.addEventListener("focus", this.handleFocus);
|
|
1038
1055
|
window.addEventListener("agentNative.chatRunning", this.handleChatRunning);
|
|
1039
|
-
|
|
1056
|
+
this.removeVisibilityListener = addSurfaceVisibilityListener(this.handleVisibilityChange);
|
|
1040
1057
|
}
|
|
1041
1058
|
teardown() {
|
|
1042
1059
|
this.stopped = true;
|
|
@@ -1060,7 +1077,8 @@ class SyncTransport {
|
|
|
1060
1077
|
}
|
|
1061
1078
|
window.removeEventListener("focus", this.handleFocus);
|
|
1062
1079
|
window.removeEventListener("agentNative.chatRunning", this.handleChatRunning);
|
|
1063
|
-
|
|
1080
|
+
this.removeVisibilityListener?.();
|
|
1081
|
+
this.removeVisibilityListener = undefined;
|
|
1064
1082
|
}
|
|
1065
1083
|
}
|
|
1066
1084
|
/**
|
package/dist/collab/routes.d.ts
CHANGED
|
@@ -26,8 +26,8 @@ export declare const getCollabState: import("h3").EventHandlerWithFetch<import("
|
|
|
26
26
|
* Body: { update: string (base64), requestSource?: string }
|
|
27
27
|
*/
|
|
28
28
|
export declare const postCollabUpdate: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
|
|
29
|
-
ok?: undefined;
|
|
30
29
|
error: string;
|
|
30
|
+
ok?: undefined;
|
|
31
31
|
} | {
|
|
32
32
|
error?: undefined;
|
|
33
33
|
ok: boolean;
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
* Body: { json: any, fieldName?: string, type?: "map"|"array", requestSource?: string }
|
|
14
14
|
*/
|
|
15
15
|
export declare const postCollabJson: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
|
|
16
|
-
error: string;
|
|
17
16
|
ok?: undefined;
|
|
17
|
+
error: string;
|
|
18
18
|
} | {
|
|
19
19
|
error?: undefined;
|
|
20
20
|
ok: boolean;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export type WorkspaceConnectionCapability = "search" | "import" | "messages" | "meetings" | "crm" | "code" | "docs";
|
|
2
2
|
export type WorkspaceConnectionTemplateUse = "analytics" | "brain" | "calendar" | "clips" | "content" | "crm" | "design" | "dispatch" | "factory" | "forms" | "mail" | "slides";
|
|
3
|
-
export type WorkspaceConnectionProviderId = "slack" | "github" | "figma" | "notion" | "gmail" | "google_drive" | "hubspot" | "salesforce" | "jira" | "sentry" | "granola" | "clips" | "generic";
|
|
3
|
+
export type WorkspaceConnectionProviderId = "slack" | "github" | "figma" | "notion" | "gmail" | "google_calendar" | "google_drive" | "google_docs" | "google_sheets" | "google_slides" | "hubspot" | "salesforce" | "jira" | "sentry" | "granola" | "clips" | "generic";
|
|
4
4
|
export interface WorkspaceConnectionCredentialKey {
|
|
5
5
|
key: string;
|
|
6
6
|
label: string;
|
|
@@ -97,35 +97,137 @@ export declare const WORKSPACE_CONNECTION_PROVIDERS: readonly [{
|
|
|
97
97
|
readonly description: "Mailbox messages and threads for search, triage, customer context, and agent replies.";
|
|
98
98
|
readonly credentialKeys: readonly [{
|
|
99
99
|
readonly key: "GOOGLE_CLIENT_ID";
|
|
100
|
-
readonly label: "Google OAuth client ID";
|
|
100
|
+
readonly label: "Managed Google OAuth client ID";
|
|
101
|
+
readonly description: "Resolved from the workspace's shared Google OAuth application. Users do not paste a key to connect a service.";
|
|
101
102
|
readonly required: true;
|
|
102
103
|
}, {
|
|
103
104
|
readonly key: "GOOGLE_CLIENT_SECRET";
|
|
104
|
-
readonly label: "Google OAuth client secret";
|
|
105
|
+
readonly label: "Managed Google OAuth client secret";
|
|
106
|
+
readonly description: "Resolved from the workspace's shared Google OAuth application. Users do not paste a key to connect a service.";
|
|
105
107
|
readonly required: true;
|
|
106
108
|
}];
|
|
107
109
|
readonly capabilities: readonly ["search", "import", "messages"];
|
|
108
110
|
readonly recommendedTemplateUses: readonly ["mail", "brain", "dispatch"];
|
|
111
|
+
readonly oauth: {
|
|
112
|
+
provider: "google";
|
|
113
|
+
authorizationUrl: "https://accounts.google.com/o/oauth2/v2/auth";
|
|
114
|
+
tokenUrl: "https://oauth2.googleapis.com/token";
|
|
115
|
+
scopes: readonly string[];
|
|
116
|
+
};
|
|
117
|
+
}, {
|
|
118
|
+
readonly id: "google_calendar";
|
|
119
|
+
readonly label: "Google Calendar";
|
|
120
|
+
readonly description: "Calendars and events for scheduling, availability, reminders, and meeting workflows.";
|
|
121
|
+
readonly credentialKeys: readonly [{
|
|
122
|
+
readonly key: "GOOGLE_CLIENT_ID";
|
|
123
|
+
readonly label: "Managed Google OAuth client ID";
|
|
124
|
+
readonly description: "Resolved from the workspace's shared Google OAuth application. Users do not paste a key to connect a service.";
|
|
125
|
+
readonly required: true;
|
|
126
|
+
}, {
|
|
127
|
+
readonly key: "GOOGLE_CLIENT_SECRET";
|
|
128
|
+
readonly label: "Managed Google OAuth client secret";
|
|
129
|
+
readonly description: "Resolved from the workspace's shared Google OAuth application. Users do not paste a key to connect a service.";
|
|
130
|
+
readonly required: true;
|
|
131
|
+
}];
|
|
132
|
+
readonly capabilities: readonly ["search", "import", "meetings"];
|
|
133
|
+
readonly recommendedTemplateUses: readonly ["calendar", "brain", "dispatch", "mail"];
|
|
134
|
+
readonly oauth: {
|
|
135
|
+
provider: "google";
|
|
136
|
+
authorizationUrl: "https://accounts.google.com/o/oauth2/v2/auth";
|
|
137
|
+
tokenUrl: "https://oauth2.googleapis.com/token";
|
|
138
|
+
scopes: readonly string[];
|
|
139
|
+
};
|
|
109
140
|
}, {
|
|
110
141
|
readonly id: "google_drive";
|
|
111
142
|
readonly label: "Google Drive";
|
|
112
143
|
readonly description: "Drive files, Docs, Sheets, and Slides for document search and import workflows.";
|
|
113
144
|
readonly credentialKeys: readonly [{
|
|
114
145
|
readonly key: "GOOGLE_CLIENT_ID";
|
|
115
|
-
readonly label: "Google OAuth client ID";
|
|
146
|
+
readonly label: "Managed Google OAuth client ID";
|
|
147
|
+
readonly description: "Resolved from the workspace's shared Google OAuth application. Users do not paste a key to connect a service.";
|
|
116
148
|
readonly required: true;
|
|
117
149
|
}, {
|
|
118
150
|
readonly key: "GOOGLE_CLIENT_SECRET";
|
|
119
|
-
readonly label: "Google OAuth client secret";
|
|
151
|
+
readonly label: "Managed Google OAuth client secret";
|
|
152
|
+
readonly description: "Resolved from the workspace's shared Google OAuth application. Users do not paste a key to connect a service.";
|
|
120
153
|
readonly required: true;
|
|
121
154
|
}];
|
|
122
155
|
readonly capabilities: readonly ["search", "import", "docs"];
|
|
123
156
|
readonly recommendedTemplateUses: readonly ["brain", "content", "slides", "dispatch", "analytics"];
|
|
124
157
|
readonly oauth: {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
158
|
+
provider: "google";
|
|
159
|
+
authorizationUrl: "https://accounts.google.com/o/oauth2/v2/auth";
|
|
160
|
+
tokenUrl: "https://oauth2.googleapis.com/token";
|
|
161
|
+
scopes: readonly string[];
|
|
162
|
+
};
|
|
163
|
+
}, {
|
|
164
|
+
readonly id: "google_docs";
|
|
165
|
+
readonly label: "Google Docs";
|
|
166
|
+
readonly description: "Google Docs files for source material, document search, and agent-assisted writing workflows.";
|
|
167
|
+
readonly credentialKeys: readonly [{
|
|
168
|
+
readonly key: "GOOGLE_CLIENT_ID";
|
|
169
|
+
readonly label: "Managed Google OAuth client ID";
|
|
170
|
+
readonly description: "Resolved from the workspace's shared Google OAuth application. Users do not paste a key to connect a service.";
|
|
171
|
+
readonly required: true;
|
|
172
|
+
}, {
|
|
173
|
+
readonly key: "GOOGLE_CLIENT_SECRET";
|
|
174
|
+
readonly label: "Managed Google OAuth client secret";
|
|
175
|
+
readonly description: "Resolved from the workspace's shared Google OAuth application. Users do not paste a key to connect a service.";
|
|
176
|
+
readonly required: true;
|
|
177
|
+
}];
|
|
178
|
+
readonly capabilities: readonly ["search", "import", "docs"];
|
|
179
|
+
readonly recommendedTemplateUses: readonly ["brain", "content", "slides", "dispatch"];
|
|
180
|
+
readonly oauth: {
|
|
181
|
+
provider: "google";
|
|
182
|
+
authorizationUrl: "https://accounts.google.com/o/oauth2/v2/auth";
|
|
183
|
+
tokenUrl: "https://oauth2.googleapis.com/token";
|
|
184
|
+
scopes: readonly string[];
|
|
185
|
+
};
|
|
186
|
+
}, {
|
|
187
|
+
readonly id: "google_sheets";
|
|
188
|
+
readonly label: "Google Sheets";
|
|
189
|
+
readonly description: "Google Sheets workbooks for analysis, reporting, imports, and structured agent workflows.";
|
|
190
|
+
readonly credentialKeys: readonly [{
|
|
191
|
+
readonly key: "GOOGLE_CLIENT_ID";
|
|
192
|
+
readonly label: "Managed Google OAuth client ID";
|
|
193
|
+
readonly description: "Resolved from the workspace's shared Google OAuth application. Users do not paste a key to connect a service.";
|
|
194
|
+
readonly required: true;
|
|
195
|
+
}, {
|
|
196
|
+
readonly key: "GOOGLE_CLIENT_SECRET";
|
|
197
|
+
readonly label: "Managed Google OAuth client secret";
|
|
198
|
+
readonly description: "Resolved from the workspace's shared Google OAuth application. Users do not paste a key to connect a service.";
|
|
199
|
+
readonly required: true;
|
|
200
|
+
}];
|
|
201
|
+
readonly capabilities: readonly ["search", "import", "docs"];
|
|
202
|
+
readonly recommendedTemplateUses: readonly ["analytics", "brain", "content", "dispatch"];
|
|
203
|
+
readonly oauth: {
|
|
204
|
+
provider: "google";
|
|
205
|
+
authorizationUrl: "https://accounts.google.com/o/oauth2/v2/auth";
|
|
206
|
+
tokenUrl: "https://oauth2.googleapis.com/token";
|
|
207
|
+
scopes: readonly string[];
|
|
208
|
+
};
|
|
209
|
+
}, {
|
|
210
|
+
readonly id: "google_slides";
|
|
211
|
+
readonly label: "Google Slides";
|
|
212
|
+
readonly description: "Google Slides presentations for reference imports, visual context, and presentation workflows.";
|
|
213
|
+
readonly credentialKeys: readonly [{
|
|
214
|
+
readonly key: "GOOGLE_CLIENT_ID";
|
|
215
|
+
readonly label: "Managed Google OAuth client ID";
|
|
216
|
+
readonly description: "Resolved from the workspace's shared Google OAuth application. Users do not paste a key to connect a service.";
|
|
217
|
+
readonly required: true;
|
|
218
|
+
}, {
|
|
219
|
+
readonly key: "GOOGLE_CLIENT_SECRET";
|
|
220
|
+
readonly label: "Managed Google OAuth client secret";
|
|
221
|
+
readonly description: "Resolved from the workspace's shared Google OAuth application. Users do not paste a key to connect a service.";
|
|
222
|
+
readonly required: true;
|
|
223
|
+
}];
|
|
224
|
+
readonly capabilities: readonly ["search", "import", "docs"];
|
|
225
|
+
readonly recommendedTemplateUses: readonly ["brain", "content", "slides", "dispatch"];
|
|
226
|
+
readonly oauth: {
|
|
227
|
+
provider: "google";
|
|
228
|
+
authorizationUrl: "https://accounts.google.com/o/oauth2/v2/auth";
|
|
229
|
+
tokenUrl: "https://oauth2.googleapis.com/token";
|
|
230
|
+
scopes: readonly string[];
|
|
129
231
|
};
|
|
130
232
|
}, {
|
|
131
233
|
readonly id: "hubspot";
|
|
@@ -1,6 +1,29 @@
|
|
|
1
1
|
export function defineWorkspaceConnectionProvider(provider) {
|
|
2
2
|
return provider;
|
|
3
3
|
}
|
|
4
|
+
const GOOGLE_CREDENTIAL_KEYS = [
|
|
5
|
+
{
|
|
6
|
+
key: "GOOGLE_CLIENT_ID",
|
|
7
|
+
label: "Managed Google OAuth client ID",
|
|
8
|
+
description: "Resolved from the workspace's shared Google OAuth application. Users do not paste a key to connect a service.",
|
|
9
|
+
required: true,
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
key: "GOOGLE_CLIENT_SECRET",
|
|
13
|
+
label: "Managed Google OAuth client secret",
|
|
14
|
+
description: "Resolved from the workspace's shared Google OAuth application. Users do not paste a key to connect a service.",
|
|
15
|
+
required: true,
|
|
16
|
+
},
|
|
17
|
+
];
|
|
18
|
+
const GOOGLE_OAUTH_BASE = {
|
|
19
|
+
provider: "google",
|
|
20
|
+
authorizationUrl: "https://accounts.google.com/o/oauth2/v2/auth",
|
|
21
|
+
tokenUrl: "https://oauth2.googleapis.com/token",
|
|
22
|
+
};
|
|
23
|
+
function googleOAuth(scopes) {
|
|
24
|
+
return { ...GOOGLE_OAUTH_BASE, scopes };
|
|
25
|
+
}
|
|
26
|
+
const GOOGLE_IDENTITY_SCOPES = ["openid", "email", "profile"];
|
|
4
27
|
export const WORKSPACE_CONNECTION_PROVIDERS = [
|
|
5
28
|
defineWorkspaceConnectionProvider({
|
|
6
29
|
id: "slack",
|
|
@@ -84,37 +107,35 @@ export const WORKSPACE_CONNECTION_PROVIDERS = [
|
|
|
84
107
|
id: "gmail",
|
|
85
108
|
label: "Gmail",
|
|
86
109
|
description: "Mailbox messages and threads for search, triage, customer context, and agent replies.",
|
|
87
|
-
credentialKeys:
|
|
88
|
-
{
|
|
89
|
-
key: "GOOGLE_CLIENT_ID",
|
|
90
|
-
label: "Google OAuth client ID",
|
|
91
|
-
required: true,
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
key: "GOOGLE_CLIENT_SECRET",
|
|
95
|
-
label: "Google OAuth client secret",
|
|
96
|
-
required: true,
|
|
97
|
-
},
|
|
98
|
-
],
|
|
110
|
+
credentialKeys: GOOGLE_CREDENTIAL_KEYS,
|
|
99
111
|
capabilities: ["search", "import", "messages"],
|
|
100
112
|
recommendedTemplateUses: ["mail", "brain", "dispatch"],
|
|
113
|
+
oauth: googleOAuth([
|
|
114
|
+
...GOOGLE_IDENTITY_SCOPES,
|
|
115
|
+
"https://www.googleapis.com/auth/gmail.readonly",
|
|
116
|
+
"https://www.googleapis.com/auth/gmail.send",
|
|
117
|
+
"https://www.googleapis.com/auth/gmail.modify",
|
|
118
|
+
"https://www.googleapis.com/auth/gmail.settings.basic",
|
|
119
|
+
]),
|
|
120
|
+
}),
|
|
121
|
+
defineWorkspaceConnectionProvider({
|
|
122
|
+
id: "google_calendar",
|
|
123
|
+
label: "Google Calendar",
|
|
124
|
+
description: "Calendars and events for scheduling, availability, reminders, and meeting workflows.",
|
|
125
|
+
credentialKeys: GOOGLE_CREDENTIAL_KEYS,
|
|
126
|
+
capabilities: ["search", "import", "meetings"],
|
|
127
|
+
recommendedTemplateUses: ["calendar", "brain", "dispatch", "mail"],
|
|
128
|
+
oauth: googleOAuth([
|
|
129
|
+
...GOOGLE_IDENTITY_SCOPES,
|
|
130
|
+
"https://www.googleapis.com/auth/calendar.readonly",
|
|
131
|
+
"https://www.googleapis.com/auth/calendar.events",
|
|
132
|
+
]),
|
|
101
133
|
}),
|
|
102
134
|
defineWorkspaceConnectionProvider({
|
|
103
135
|
id: "google_drive",
|
|
104
136
|
label: "Google Drive",
|
|
105
137
|
description: "Drive files, Docs, Sheets, and Slides for document search and import workflows.",
|
|
106
|
-
credentialKeys:
|
|
107
|
-
{
|
|
108
|
-
key: "GOOGLE_CLIENT_ID",
|
|
109
|
-
label: "Google OAuth client ID",
|
|
110
|
-
required: true,
|
|
111
|
-
},
|
|
112
|
-
{
|
|
113
|
-
key: "GOOGLE_CLIENT_SECRET",
|
|
114
|
-
label: "Google OAuth client secret",
|
|
115
|
-
required: true,
|
|
116
|
-
},
|
|
117
|
-
],
|
|
138
|
+
credentialKeys: GOOGLE_CREDENTIAL_KEYS,
|
|
118
139
|
capabilities: ["search", "import", "docs"],
|
|
119
140
|
recommendedTemplateUses: [
|
|
120
141
|
"brain",
|
|
@@ -123,12 +144,47 @@ export const WORKSPACE_CONNECTION_PROVIDERS = [
|
|
|
123
144
|
"dispatch",
|
|
124
145
|
"analytics",
|
|
125
146
|
],
|
|
126
|
-
oauth:
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
147
|
+
oauth: googleOAuth([
|
|
148
|
+
...GOOGLE_IDENTITY_SCOPES,
|
|
149
|
+
"https://www.googleapis.com/auth/drive.file",
|
|
150
|
+
"https://www.googleapis.com/auth/drive.readonly",
|
|
151
|
+
]),
|
|
152
|
+
}),
|
|
153
|
+
defineWorkspaceConnectionProvider({
|
|
154
|
+
id: "google_docs",
|
|
155
|
+
label: "Google Docs",
|
|
156
|
+
description: "Google Docs files for source material, document search, and agent-assisted writing workflows.",
|
|
157
|
+
credentialKeys: GOOGLE_CREDENTIAL_KEYS,
|
|
158
|
+
capabilities: ["search", "import", "docs"],
|
|
159
|
+
recommendedTemplateUses: ["brain", "content", "slides", "dispatch"],
|
|
160
|
+
oauth: googleOAuth([
|
|
161
|
+
...GOOGLE_IDENTITY_SCOPES,
|
|
162
|
+
"https://www.googleapis.com/auth/documents.readonly",
|
|
163
|
+
]),
|
|
164
|
+
}),
|
|
165
|
+
defineWorkspaceConnectionProvider({
|
|
166
|
+
id: "google_sheets",
|
|
167
|
+
label: "Google Sheets",
|
|
168
|
+
description: "Google Sheets workbooks for analysis, reporting, imports, and structured agent workflows.",
|
|
169
|
+
credentialKeys: GOOGLE_CREDENTIAL_KEYS,
|
|
170
|
+
capabilities: ["search", "import", "docs"],
|
|
171
|
+
recommendedTemplateUses: ["analytics", "brain", "content", "dispatch"],
|
|
172
|
+
oauth: googleOAuth([
|
|
173
|
+
...GOOGLE_IDENTITY_SCOPES,
|
|
174
|
+
"https://www.googleapis.com/auth/spreadsheets.readonly",
|
|
175
|
+
]),
|
|
176
|
+
}),
|
|
177
|
+
defineWorkspaceConnectionProvider({
|
|
178
|
+
id: "google_slides",
|
|
179
|
+
label: "Google Slides",
|
|
180
|
+
description: "Google Slides presentations for reference imports, visual context, and presentation workflows.",
|
|
181
|
+
credentialKeys: GOOGLE_CREDENTIAL_KEYS,
|
|
182
|
+
capabilities: ["search", "import", "docs"],
|
|
183
|
+
recommendedTemplateUses: ["brain", "content", "slides", "dispatch"],
|
|
184
|
+
oauth: googleOAuth([
|
|
185
|
+
...GOOGLE_IDENTITY_SCOPES,
|
|
186
|
+
"https://www.googleapis.com/auth/presentations.readonly",
|
|
187
|
+
]),
|
|
132
188
|
}),
|
|
133
189
|
defineWorkspaceConnectionProvider({
|
|
134
190
|
id: "hubspot",
|
package/dist/db/create-get-db.js
CHANGED
|
@@ -519,6 +519,24 @@ export function createGetDb(schema) {
|
|
|
519
519
|
});
|
|
520
520
|
return promise[prop].bind(promise);
|
|
521
521
|
}
|
|
522
|
+
// drizzle-orm duck-types "is this an SQL entity" by reading these two
|
|
523
|
+
// properties directly off a value — synchronously, without awaiting
|
|
524
|
+
// (see `isSQLWrapper` in drizzle-orm/sql/sql.js). Because this proxy's
|
|
525
|
+
// target is a function, answering that probe with another proxy would
|
|
526
|
+
// make an un-awaited chain (e.g. a subquery chain embedded as a raw
|
|
527
|
+
// value instead of being awaited — the pattern that broke
|
|
528
|
+
// list-recordings.ts) masquerade as a resolved SQL entity. drizzle
|
|
529
|
+
// then calls `.getSQL()` on it, which duck-types as a wrapper again,
|
|
530
|
+
// forever — `RangeError: Maximum call stack size exceeded` deep
|
|
531
|
+
// inside drizzle internals instead of a message pointing at the
|
|
532
|
+
// actual bug. Fail loudly here instead, at the point of misuse.
|
|
533
|
+
if (prop === "getSQL" || prop === "shouldOmitSQLParens") {
|
|
534
|
+
throw new Error("getDb(): accessed an unresolved query chain synchronously " +
|
|
535
|
+
`(reading '${String(prop)}'). This chain was embedded as a raw ` +
|
|
536
|
+
"value instead of being awaited first — e.g. a subquery passed " +
|
|
537
|
+
"straight into another expression. Await the chain before " +
|
|
538
|
+
"using its result.");
|
|
539
|
+
}
|
|
522
540
|
// Symbol.toStringTag, Symbol.iterator, etc. — return another proxy
|
|
523
541
|
// Property access (e.g. db.query) — record and return another proxy
|
|
524
542
|
return createLazyProxy(ready, [...chain, { prop }]);
|
package/dist/db/ddl-guard.d.ts
CHANGED
|
@@ -125,10 +125,6 @@ export declare function ensureColumnExists(table: string, column: string, addCol
|
|
|
125
125
|
lockTimeout?: string;
|
|
126
126
|
injectedClient?: DbExec;
|
|
127
127
|
}): Promise<boolean>;
|
|
128
|
-
/**
|
|
129
|
-
* Convenience wrapper: ensure an INDEX exists (probe via `pgIndexExists`).
|
|
130
|
-
* `createIndexSql` should be the full `CREATE INDEX IF NOT EXISTS <name> …`.
|
|
131
|
-
*/
|
|
132
128
|
export declare function ensureIndexExists(indexName: string, createIndexSql: string, options?: {
|
|
133
129
|
lockTimeout?: string;
|
|
134
130
|
injectedClient?: DbExec;
|
package/dist/db/ddl-guard.js
CHANGED
|
@@ -391,7 +391,46 @@ export async function ensureColumnExists(table, column, addColumnSql, options =
|
|
|
391
391
|
* Convenience wrapper: ensure an INDEX exists (probe via `pgIndexExists`).
|
|
392
392
|
* `createIndexSql` should be the full `CREATE INDEX IF NOT EXISTS <name> …`.
|
|
393
393
|
*/
|
|
394
|
+
/**
|
|
395
|
+
* Drop an index that exists under this name but is INVALID.
|
|
396
|
+
*
|
|
397
|
+
* A failed `CREATE INDEX CONCURRENTLY` leaves the index present but unusable
|
|
398
|
+
* (`indisvalid = false`). That is a trap for every repair attempt that follows:
|
|
399
|
+
* `pgIndexExists` correctly reports it missing, but `CREATE INDEX IF NOT
|
|
400
|
+
* EXISTS` sees the NAME is taken and skips, so the re-probe fails again and the
|
|
401
|
+
* release never recovers on its own. Found in production on
|
|
402
|
+
* `chat_threads_owner_lower_updated_idx` and `sync_events_created_at_id_idx`.
|
|
403
|
+
*
|
|
404
|
+
* Dropping is safe: an invalid index serves no query and cannot be repaired in
|
|
405
|
+
* place — Postgres' own guidance is to drop and rebuild it.
|
|
406
|
+
*/
|
|
407
|
+
async function dropInvalidIndex(indexName, client) {
|
|
408
|
+
if (!PLAIN_IDENTIFIER.test(indexName))
|
|
409
|
+
return;
|
|
410
|
+
const { rows } = await client.execute({
|
|
411
|
+
sql: `SELECT 1
|
|
412
|
+
FROM pg_class AS index_class
|
|
413
|
+
JOIN pg_namespace AS index_namespace
|
|
414
|
+
ON index_namespace.oid = index_class.relnamespace
|
|
415
|
+
AND index_namespace.nspname = 'public'
|
|
416
|
+
JOIN pg_index AS index_state
|
|
417
|
+
ON index_state.indexrelid = index_class.oid
|
|
418
|
+
WHERE index_class.relname = ?
|
|
419
|
+
AND NOT index_state.indisvalid
|
|
420
|
+
LIMIT 1`,
|
|
421
|
+
args: [indexName],
|
|
422
|
+
});
|
|
423
|
+
if (rows.length === 0)
|
|
424
|
+
return;
|
|
425
|
+
console.warn(`[db] dropping INVALID index "${indexName}" so it can be rebuilt; ` +
|
|
426
|
+
`a previous CREATE INDEX left it unusable.`);
|
|
427
|
+
await client.execute(`DROP INDEX IF EXISTS "${indexName}"`);
|
|
428
|
+
invalidateSchemaSnapshot(client);
|
|
429
|
+
}
|
|
394
430
|
export async function ensureIndexExists(indexName, createIndexSql, options = {}) {
|
|
431
|
+
if ((options.dialectIsPostgres ?? isPostgres()) && !schemaEnsureDisabled()) {
|
|
432
|
+
await dropInvalidIndex(indexName, options.injectedClient ?? getDbExec());
|
|
433
|
+
}
|
|
395
434
|
return ensureSchemaObject({
|
|
396
435
|
probe: () => pgIndexExists(indexName, options.injectedClient, options.dialectIsPostgres),
|
|
397
436
|
ddl: createIndexSql,
|
|
@@ -420,6 +459,13 @@ export async function ensureIndexExistsConcurrently(indexName, createIndexSql, o
|
|
|
420
459
|
if (initiallyExists === undefined) {
|
|
421
460
|
throw new Error(`ensureIndexExistsConcurrently: could not probe required index "${indexName}"; refusing to issue DDL`);
|
|
422
461
|
}
|
|
462
|
+
// This helper is what STRANDS an invalid index in the first place: an
|
|
463
|
+
// interrupted concurrent build leaves the name taken and the index unusable,
|
|
464
|
+
// and `CREATE INDEX CONCURRENTLY IF NOT EXISTS` then skips it forever. Clear
|
|
465
|
+
// it here too, or the one caller that creates the mess is the one caller that
|
|
466
|
+
// cannot recover from it — which is how `sync_events_created_at_id_idx` has
|
|
467
|
+
// stayed invalid in production.
|
|
468
|
+
await dropInvalidIndex(indexName, client);
|
|
423
469
|
await client.execute(createIndexSql);
|
|
424
470
|
invalidateSchemaSnapshot(client);
|
|
425
471
|
const existsAfterCreate = await pgIndexExists(indexName, client, options.dialectIsPostgres);
|
package/dist/deploy/build.d.ts
CHANGED
|
@@ -246,6 +246,25 @@ export declare function findNonLinuxBetterSqlite3Binaries(serverDir: string): st
|
|
|
246
246
|
export declare function bundleYjsRuntimeForServerlessOutput(serverDir: string, projectCwd: string): string[];
|
|
247
247
|
/** Presets whose Node-style output needs the emitted Yjs runtime bundle. */
|
|
248
248
|
export declare function shouldBundleYjsRuntimeForPreset(targetPreset: string): boolean;
|
|
249
|
+
/**
|
|
250
|
+
* Replace the bundled `better-sqlite3` with a throwing stub in serverless
|
|
251
|
+
* output.
|
|
252
|
+
*
|
|
253
|
+
* The package is 27MB — a 9.1MB `sqlite3.c`, its object files, and a static
|
|
254
|
+
* archive, none of which a function can use: every consumer is gated on a
|
|
255
|
+
* `file:` or schemeless `DATABASE_URL`, and a serverless container holding a
|
|
256
|
+
* file-backed SQLite database is already broken, since the filesystem is
|
|
257
|
+
* ephemeral and each container gets its own copy.
|
|
258
|
+
*
|
|
259
|
+
* It cannot simply be deleted. Drizzle's bundled `_libs/drizzle-orm+postgres`
|
|
260
|
+
* chunk imports it at module scope, so removing the package turns every cold
|
|
261
|
+
* start into `ERR_MODULE_NOT_FOUND` — which is how this was first written, and
|
|
262
|
+
* what the SSR cold-start smoke caught. The stub keeps the specifier
|
|
263
|
+
* resolvable and moves the failure to the only place it can be acted on: a
|
|
264
|
+
* deploy that actually tries to open a file-backed database, which now throws
|
|
265
|
+
* with the reason instead of quietly serving an empty one.
|
|
266
|
+
*/
|
|
267
|
+
export declare function stubLocalOnlySqliteDriverForServerless(serverDir: string): number;
|
|
249
268
|
export declare function assertSingleTemplateNetlifyBuildOutput(projectCwd: string): void;
|
|
250
269
|
/**
|
|
251
270
|
* Strip the harmful single-template catch-all rewrite that points at
|