@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
package/dist/deploy/build.js
CHANGED
|
@@ -32,7 +32,7 @@ import { isTruthyRuntimeValue } from "../shared/runtime-config.js";
|
|
|
32
32
|
import { AGENT_NATIVE_SOCIAL_IMAGE_ALT, AGENT_NATIVE_SOCIAL_IMAGE_CACHE_BUSTER, AGENT_NATIVE_SOCIAL_IMAGE_HEIGHT, AGENT_NATIVE_SOCIAL_IMAGE_PATH, AGENT_NATIVE_SOCIAL_IMAGE_TYPE, AGENT_NATIVE_SOCIAL_IMAGE_WIDTH, } from "../shared/social-meta.js";
|
|
33
33
|
import { generateActionRegistryForProject } from "../vite/action-types-plugin.js";
|
|
34
34
|
import { createAgentNativeConfigContext, loadResolvedAgentNativeConfig, } from "../vite/agent-native-config-loader.js";
|
|
35
|
-
import { cloneServerBundleForFunction, copyDir } from "./function-bundle.js";
|
|
35
|
+
import { cloneServerBundleForFunction, copyDir, pruneSsrIslandFromRewritingClone, readPackageManifest, SERVERLESS_BROWSER_RUNTIME_PACKAGES, } from "./function-bundle.js";
|
|
36
36
|
import { collectImmutableAssetPaths, IMMUTABLE_ASSET_CACHE_CONTROL, IMMUTABLE_ASSET_CACHE_HEADERS, prefixAssetPath, } from "./immutable-assets.js";
|
|
37
37
|
import { writeNetlifyStaticHeaders } from "./netlify-static-headers.js";
|
|
38
38
|
import { discoverApiRoutes, discoverPlugins, discoverActionFiles, getMissingDefaultPlugins, DEFAULT_PLUGIN_REGISTRY, } from "./route-discovery.js";
|
|
@@ -766,10 +766,17 @@ ${["post", "put", "delete"]
|
|
|
766
766
|
continue;
|
|
767
767
|
pluginImports.push(`import { ${defaultExportName} as ${varName} } from "${EDGE_SERVER_ENTRYPOINT}";`);
|
|
768
768
|
}
|
|
769
|
-
|
|
769
|
+
// The worker entry mounts defaults statically, so the `plugins.disabled`
|
|
770
|
+
// check that `bootstrapDefaultPlugins` runs has to happen here too —
|
|
771
|
+
// otherwise the same config withholds a plugin on Node hosts and mounts it
|
|
772
|
+
// on the edge.
|
|
773
|
+
pluginCalls.push(` if (typeof ${varName} === "function" && !isDefaultPluginDisabled(${JSON.stringify(stem)})) {
|
|
770
774
|
await ${varName}(nitroApp);
|
|
771
775
|
}`);
|
|
772
776
|
}
|
|
777
|
+
if (edgeDefaultStems.length > 0) {
|
|
778
|
+
pluginImports.unshift(`import { isDefaultPluginDisabled } from "${EDGE_SERVER_ENTRYPOINT}";`);
|
|
779
|
+
}
|
|
773
780
|
const generatedPluginMarks = providedPluginStems.size > 0
|
|
774
781
|
? [
|
|
775
782
|
...new Set([
|
|
@@ -2065,10 +2072,6 @@ const LIBSQL_NATIVE_PACKAGE_NAMES = [
|
|
|
2065
2072
|
const FFMPEG_STATIC_PACKAGE_NAME = "ffmpeg-static";
|
|
2066
2073
|
const RESVG_SCOPE = "@resvg";
|
|
2067
2074
|
const RESVG_PACKAGE_PREFIX = "resvg-js";
|
|
2068
|
-
const SERVERLESS_BROWSER_RUNTIME_PACKAGES = [
|
|
2069
|
-
"@sparticuz/chromium",
|
|
2070
|
-
"playwright-core",
|
|
2071
|
-
];
|
|
2072
2075
|
const SERVERLESS_BROWSER_RUNTIME_CONSUMER = "@agent-native/creative-context";
|
|
2073
2076
|
const PACKAGE_DEPENDENCY_FIELDS = [
|
|
2074
2077
|
"dependencies",
|
|
@@ -2112,6 +2115,28 @@ const SERVERLESS_FUNCTION_PACKAGE_DENYLIST = new Set([
|
|
|
2112
2115
|
"fsevents",
|
|
2113
2116
|
"node-pty",
|
|
2114
2117
|
"playwright",
|
|
2118
|
+
// Nitro traces these from officeparser's PDF-output branch, which nothing in
|
|
2119
|
+
// this repo reaches — the creative-context browser path uses playwright-core,
|
|
2120
|
+
// not puppeteer. `pdf` output from officeparser now fails loudly instead of
|
|
2121
|
+
// launching a second, unused browser stack in every function.
|
|
2122
|
+
"puppeteer",
|
|
2123
|
+
"puppeteer-core",
|
|
2124
|
+
"chromium-bidi",
|
|
2125
|
+
]);
|
|
2126
|
+
/**
|
|
2127
|
+
* Declared dependencies of the browser tree that only the Bare runtime can
|
|
2128
|
+
* load. tar-stream hard-depends on bare-fs and events-universal on bare-events,
|
|
2129
|
+
* but on Node both exports maps resolve to the plain builtins instead, so these
|
|
2130
|
+
* are never required — and most of their bytes are android/darwin/win32
|
|
2131
|
+
* prebuilds a Linux function could not execute anyway.
|
|
2132
|
+
*/
|
|
2133
|
+
const BARE_RUNTIME_ONLY_PACKAGES = new Set([
|
|
2134
|
+
"bare-events",
|
|
2135
|
+
"bare-fs",
|
|
2136
|
+
"bare-path",
|
|
2137
|
+
"bare-stream",
|
|
2138
|
+
"bare-url",
|
|
2139
|
+
"teex",
|
|
2115
2140
|
]);
|
|
2116
2141
|
function serverlessFfmpegStaticTargetArchFromEnv() {
|
|
2117
2142
|
const value = process.env.AGENT_NATIVE_SERVERLESS_FFMPEG_ARCH;
|
|
@@ -2139,16 +2164,6 @@ function nodeModulesAncestors(startDir) {
|
|
|
2139
2164
|
}
|
|
2140
2165
|
return dirs;
|
|
2141
2166
|
}
|
|
2142
|
-
function readPackageManifest(packageDir) {
|
|
2143
|
-
const packageJsonPath = path.join(packageDir, "package.json");
|
|
2144
|
-
if (!fs.existsSync(packageJsonPath))
|
|
2145
|
-
return null;
|
|
2146
|
-
const manifest = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
|
|
2147
|
-
if (!manifest || typeof manifest !== "object" || Array.isArray(manifest)) {
|
|
2148
|
-
return null;
|
|
2149
|
-
}
|
|
2150
|
-
return manifest;
|
|
2151
|
-
}
|
|
2152
2167
|
function manifestDeclaresDependency(manifest, packageName) {
|
|
2153
2168
|
if (!manifest)
|
|
2154
2169
|
return false;
|
|
@@ -2237,6 +2252,13 @@ function copyRuntimePackageTree(packageName, packageDir, serverDir, nodeModulesR
|
|
|
2237
2252
|
return 1;
|
|
2238
2253
|
let copiedCount = 1;
|
|
2239
2254
|
for (const dependencyName of Object.keys(dependencies)) {
|
|
2255
|
+
// Declared by tar-stream and events-universal but unreachable on Node: both
|
|
2256
|
+
// exports maps send Node to a plain fs/path implementation, and only the
|
|
2257
|
+
// Bare runtime sets the condition that selects these. Skipped inside the
|
|
2258
|
+
// loop, before resolution, so an unresolvable REAL dependency still fails
|
|
2259
|
+
// loudly below.
|
|
2260
|
+
if (BARE_RUNTIME_ONLY_PACKAGES.has(dependencyName))
|
|
2261
|
+
continue;
|
|
2240
2262
|
const dependencyDir = findInstalledPackageRoot(dependencyName, nodeModulesRoots, packageDir);
|
|
2241
2263
|
if (!dependencyDir) {
|
|
2242
2264
|
throw new Error(`[deploy] Could not resolve ${dependencyName}, required by ${packageName}, for the serverless browser runtime.`);
|
|
@@ -2267,6 +2289,15 @@ export function copyInstalledBrowserRuntimePackages(serverDir, projectCwd = cwd)
|
|
|
2267
2289
|
continue;
|
|
2268
2290
|
copiedCount += copyRuntimePackageTree(packageName, packageDir, serverDir, nodeModulesRoots, copiedPackages);
|
|
2269
2291
|
}
|
|
2292
|
+
// playwright-core ships its own developer tooling: lib/vite is the trace
|
|
2293
|
+
// viewer, HTML reporter, codegen recorder and CLI dashboard UI, and lib/tools
|
|
2294
|
+
// plus bin/ and cli.js are the command line. A function reaches none of them —
|
|
2295
|
+
// they are only entered from startTraceViewerServer, startDashboardServer and
|
|
2296
|
+
// the recorder route — and every byte is paid once per emitted function.
|
|
2297
|
+
// force:true because a fixture (or a future playwright-core) may not have them.
|
|
2298
|
+
for (const dead of ["lib/vite", "lib/tools", "bin", "cli.js"]) {
|
|
2299
|
+
fs.rmSync(path.join(serverDir, "node_modules", "playwright-core", ...dead.split("/")), { recursive: true, force: true });
|
|
2300
|
+
}
|
|
2270
2301
|
if (copiedCount === 0) {
|
|
2271
2302
|
// Not the same as the skip above: the app asked for the browser runtime and
|
|
2272
2303
|
// the build could not find it, so anything that opens a browser will fail
|
|
@@ -2871,6 +2902,15 @@ export const config = {
|
|
|
2871
2902
|
};
|
|
2872
2903
|
`;
|
|
2873
2904
|
fs.writeFileSync(path.join(dest, `${backgroundName}.mjs`), entry);
|
|
2905
|
+
{
|
|
2906
|
+
// The clone rewrites url.pathname unconditionally, so it can never
|
|
2907
|
+
// route to the SSR page/asset handlers it inherited. Netlify zips and
|
|
2908
|
+
// uploads every function separately, so that island is paid for twice.
|
|
2909
|
+
const freed = pruneSsrIslandFromRewritingClone(dest, entry);
|
|
2910
|
+
if (freed > 0) {
|
|
2911
|
+
console.log(`[deploy] Pruned ${(freed / 1024 / 1024).toFixed(1)}MB of unroutable SSR modules from ${path.basename(dest)}.`);
|
|
2912
|
+
}
|
|
2913
|
+
}
|
|
2874
2914
|
assertEmittedBackgroundFunctionOnDisk(dest, backgroundName);
|
|
2875
2915
|
console.log(`[build] Emitted durable-background function "${backgroundName}" into the ` +
|
|
2876
2916
|
`scanned dir .netlify/functions-internal with config { background:true } ` +
|
|
@@ -2961,6 +3001,15 @@ export const config = {
|
|
|
2961
3001
|
};
|
|
2962
3002
|
`;
|
|
2963
3003
|
fs.writeFileSync(path.join(dest, `${functionName}.mjs`), entry);
|
|
3004
|
+
{
|
|
3005
|
+
// The clone rewrites url.pathname unconditionally, so it can never route to
|
|
3006
|
+
// the SSR page/asset handlers it inherited. Netlify zips and uploads every
|
|
3007
|
+
// function separately, so that island is paid for on every deploy.
|
|
3008
|
+
const freed = pruneSsrIslandFromRewritingClone(dest, entry);
|
|
3009
|
+
if (freed > 0) {
|
|
3010
|
+
console.log(`[deploy] Pruned ${(freed / 1024 / 1024).toFixed(1)}MB of unroutable SSR modules from ${path.basename(dest)}.`);
|
|
3011
|
+
}
|
|
3012
|
+
}
|
|
2964
3013
|
}
|
|
2965
3014
|
/**
|
|
2966
3015
|
* Nitro's Netlify preset can emit a harmful fallback rewrite to
|
|
@@ -3135,9 +3184,81 @@ function hasBundledFfmpegStaticRuntime(functionDir) {
|
|
|
3135
3184
|
const binaryName = FFMPEG_STATIC_BINARY_NAMES[0];
|
|
3136
3185
|
return fs.existsSync(path.join(functionDir, "node_modules", FFMPEG_STATIC_PACKAGE_NAME, binaryName));
|
|
3137
3186
|
}
|
|
3187
|
+
/**
|
|
3188
|
+
* Whether this function embeds the browser binary itself, which earns the size
|
|
3189
|
+
* budget's browser allowance. `chromium-min` fetches the pack at launch and
|
|
3190
|
+
* ships no `bin/`, so a min-based function no longer claims the allowance — the
|
|
3191
|
+
* budget tightens automatically once the binary stops being bundled.
|
|
3192
|
+
*/
|
|
3138
3193
|
function hasBundledServerlessBrowserRuntime(functionDir) {
|
|
3139
3194
|
return fs.existsSync(path.join(functionDir, "node_modules", "@sparticuz", "chromium", "bin", "chromium.br"));
|
|
3140
3195
|
}
|
|
3196
|
+
/**
|
|
3197
|
+
* Replace the bundled `better-sqlite3` with a throwing stub in serverless
|
|
3198
|
+
* output.
|
|
3199
|
+
*
|
|
3200
|
+
* The package is 27MB — a 9.1MB `sqlite3.c`, its object files, and a static
|
|
3201
|
+
* archive, none of which a function can use: every consumer is gated on a
|
|
3202
|
+
* `file:` or schemeless `DATABASE_URL`, and a serverless container holding a
|
|
3203
|
+
* file-backed SQLite database is already broken, since the filesystem is
|
|
3204
|
+
* ephemeral and each container gets its own copy.
|
|
3205
|
+
*
|
|
3206
|
+
* It cannot simply be deleted. Drizzle's bundled `_libs/drizzle-orm+postgres`
|
|
3207
|
+
* chunk imports it at module scope, so removing the package turns every cold
|
|
3208
|
+
* start into `ERR_MODULE_NOT_FOUND` — which is how this was first written, and
|
|
3209
|
+
* what the SSR cold-start smoke caught. The stub keeps the specifier
|
|
3210
|
+
* resolvable and moves the failure to the only place it can be acted on: a
|
|
3211
|
+
* deploy that actually tries to open a file-backed database, which now throws
|
|
3212
|
+
* with the reason instead of quietly serving an empty one.
|
|
3213
|
+
*/
|
|
3214
|
+
export function stubLocalOnlySqliteDriverForServerless(serverDir) {
|
|
3215
|
+
const packageDir = path.join(serverDir, "node_modules", "better-sqlite3");
|
|
3216
|
+
if (!fs.existsSync(packageDir))
|
|
3217
|
+
return 0;
|
|
3218
|
+
const manifestPath = path.join(packageDir, "package.json");
|
|
3219
|
+
if (!fs.existsSync(manifestPath)) {
|
|
3220
|
+
throw new Error(`[deploy] ${path.relative(serverDir, packageDir)} has no package.json; ` +
|
|
3221
|
+
"refusing to stub a package tree this build does not understand.");
|
|
3222
|
+
}
|
|
3223
|
+
const version = JSON.parse(fs.readFileSync(manifestPath, "utf8")).version;
|
|
3224
|
+
if (!version) {
|
|
3225
|
+
throw new Error(`[deploy] ${path.relative(serverDir, manifestPath)} declares no version; ` +
|
|
3226
|
+
"refusing to stub a package tree this build does not understand.");
|
|
3227
|
+
}
|
|
3228
|
+
const saved = getDirSize(packageDir);
|
|
3229
|
+
fs.rmSync(packageDir, { recursive: true, force: true });
|
|
3230
|
+
fs.mkdirSync(packageDir, { recursive: true });
|
|
3231
|
+
fs.writeFileSync(manifestPath, `${JSON.stringify({
|
|
3232
|
+
name: "better-sqlite3",
|
|
3233
|
+
version,
|
|
3234
|
+
main: "index.js",
|
|
3235
|
+
// Read by the CLI's native-dependency preflight, which would otherwise
|
|
3236
|
+
// probe the stub, see its deliberate throw, and try to rebuild it.
|
|
3237
|
+
agentNativeServerlessStub: true,
|
|
3238
|
+
}, null, 2)}\n`);
|
|
3239
|
+
// CommonJS, matching the real package: Drizzle default-imports it from ESM
|
|
3240
|
+
// and relies on the interop default being the constructor.
|
|
3241
|
+
fs.writeFileSync(path.join(packageDir, "index.js"), [
|
|
3242
|
+
"// Replaced at build time by @agent-native/core: better-sqlite3 is a",
|
|
3243
|
+
"// local-development driver and cannot back a serverless deployment,",
|
|
3244
|
+
"// whose filesystem is ephemeral and per-container.",
|
|
3245
|
+
"module.exports = class BetterSqlite3NotAvailableInServerless {",
|
|
3246
|
+
" constructor() {",
|
|
3247
|
+
" throw new Error(",
|
|
3248
|
+
' "better-sqlite3 is not available in a serverless deployment. " +',
|
|
3249
|
+
' "DATABASE_URL resolved to a file-backed SQLite database, whose " +',
|
|
3250
|
+
' "filesystem is ephemeral and not shared between containers. " +',
|
|
3251
|
+
' "Point DATABASE_URL at Postgres or libSQL/Turso."',
|
|
3252
|
+
" );",
|
|
3253
|
+
" }",
|
|
3254
|
+
"};",
|
|
3255
|
+
"",
|
|
3256
|
+
].join("\n"));
|
|
3257
|
+
const freed = saved - getDirSize(packageDir);
|
|
3258
|
+
console.log(`[deploy] Stubbed better-sqlite3 in ${path.basename(serverDir)}: ` +
|
|
3259
|
+
`${(freed / 1024 / 1024).toFixed(1)}MB of local-only SQLite driver removed.`);
|
|
3260
|
+
return freed;
|
|
3261
|
+
}
|
|
3141
3262
|
function netlifyFunctionSizeBudget(functionDir) {
|
|
3142
3263
|
const allowance = (hasBundledServerlessBrowserRuntime(functionDir)
|
|
3143
3264
|
? NETLIFY_BROWSER_RUNTIME_SIZE_ALLOWANCE_BYTES
|
|
@@ -3147,6 +3268,33 @@ function netlifyFunctionSizeBudget(functionDir) {
|
|
|
3147
3268
|
: 0);
|
|
3148
3269
|
return Math.min(NETLIFY_FUNCTION_SIZE_BUDGET_BYTES + allowance, NETLIFY_FUNCTION_HARD_LIMIT_BYTES);
|
|
3149
3270
|
}
|
|
3271
|
+
/**
|
|
3272
|
+
* App-owned pruning of the emitted serverless functions, run before the
|
|
3273
|
+
* framework measures them.
|
|
3274
|
+
*
|
|
3275
|
+
* An app can know things about its own payload the framework cannot — docs, for
|
|
3276
|
+
* instance, emits a locale chunk per translated page and can tell which ones no
|
|
3277
|
+
* prerendered route will ever import. That pruning used to be chained after
|
|
3278
|
+
* `agent-native build` with `&&`, which put it after this file had already
|
|
3279
|
+
* printed the size report and applied the budget: the numbers described a
|
|
3280
|
+
* directory that no longer existed by the time the deploy uploaded it, 19MB
|
|
3281
|
+
* high for docs. Running the app's script here instead is the only ordering in
|
|
3282
|
+
* which the report is measuring what ships.
|
|
3283
|
+
*
|
|
3284
|
+
* A script that exists and fails aborts the build. Silently continuing would
|
|
3285
|
+
* publish an unpruned payload while reporting the size the app expected.
|
|
3286
|
+
*/
|
|
3287
|
+
function runAppServerlessFunctionPruning(cwd) {
|
|
3288
|
+
const script = path.join(cwd, "scripts", "prune-serverless-functions.ts");
|
|
3289
|
+
if (!fs.existsSync(script))
|
|
3290
|
+
return;
|
|
3291
|
+
console.log(`[deploy] Running app serverless pruning: ${path.relative(cwd, script)}`);
|
|
3292
|
+
// Resolve tsx's own entry rather than shelling out to `npx`: npm's Windows
|
|
3293
|
+
// shim is `npx.cmd`, which execFileSync cannot resolve, and running the
|
|
3294
|
+
// resolved script under the current interpreter avoids the question.
|
|
3295
|
+
const tsxCli = createRequire(path.join(cwd, "package.json")).resolve("tsx/cli");
|
|
3296
|
+
execFileSync(process.execPath, [tsxCli, script], { cwd, stdio: "inherit" });
|
|
3297
|
+
}
|
|
3150
3298
|
function reportNetlifyFunctionSizes(internalDir, failures) {
|
|
3151
3299
|
if (!fs.existsSync(internalDir))
|
|
3152
3300
|
return;
|
|
@@ -3602,6 +3750,30 @@ export function pruneServerlessFunctionDeadWeight(functionDir) {
|
|
|
3602
3750
|
removedNames.push("data");
|
|
3603
3751
|
fs.rmSync(dataDir, { recursive: true, force: true });
|
|
3604
3752
|
}
|
|
3753
|
+
// Only the `types` export condition points at declaration files, and no
|
|
3754
|
+
// runtime resolver honours it — nothing inside a deployed function ever
|
|
3755
|
+
// type-checks. Scoped to node_modules on purpose: there are no .d.ts outside
|
|
3756
|
+
// it today, and scoping keeps a future emitted asset out of range.
|
|
3757
|
+
if (fs.existsSync(nodeModulesDir)) {
|
|
3758
|
+
let removedDeclarations = 0;
|
|
3759
|
+
for (const declaration of fs.globSync("**/*.d.ts", {
|
|
3760
|
+
cwd: nodeModulesDir,
|
|
3761
|
+
})) {
|
|
3762
|
+
const declarationPath = path.join(nodeModulesDir, declaration);
|
|
3763
|
+
try {
|
|
3764
|
+
removedBytes += fs.statSync(declarationPath).size;
|
|
3765
|
+
fs.rmSync(declarationPath);
|
|
3766
|
+
removedDeclarations += 1;
|
|
3767
|
+
}
|
|
3768
|
+
catch {
|
|
3769
|
+
// coercion-ok: a file already gone contributes nothing, and its bytes
|
|
3770
|
+
// were counted before the unlink, so the total stays honest.
|
|
3771
|
+
}
|
|
3772
|
+
}
|
|
3773
|
+
if (removedDeclarations > 0) {
|
|
3774
|
+
removedNames.push(`${removedDeclarations} .d.ts file(s)`);
|
|
3775
|
+
}
|
|
3776
|
+
}
|
|
3605
3777
|
if (removedNames.length > 0) {
|
|
3606
3778
|
console.log(`[deploy] Pruned ${removedNames.length} unrunnable path(s) (${(removedBytes /
|
|
3607
3779
|
1024 /
|
|
@@ -4104,6 +4276,7 @@ export default bundle;
|
|
|
4104
4276
|
copyInstalledFfmpegStaticPackage(nitro.options.output.serverDir);
|
|
4105
4277
|
copyInstalledBrowserRuntimePackages(nitro.options.output.serverDir);
|
|
4106
4278
|
sanitizeServerlessFunctionPackageManifest(nitro.options.output.serverDir);
|
|
4279
|
+
stubLocalOnlySqliteDriverForServerless(nitro.options.output.serverDir);
|
|
4107
4280
|
// Before the Netlify block below clones this dir into the extra functions,
|
|
4108
4281
|
// so they inherit the pruned bundle instead of a second full copy.
|
|
4109
4282
|
pruneServerlessFunctionDeadWeight(nitro.options.output.serverDir);
|
|
@@ -4144,6 +4317,7 @@ export default bundle;
|
|
|
4144
4317
|
// directly from Netlify's static backing store. Keep that artifact on the
|
|
4145
4318
|
// same public SWR policy as runtime SSR and .data responses.
|
|
4146
4319
|
writeNetlifyStaticHeaders(path.join(cwd, "dist"));
|
|
4320
|
+
runAppServerlessFunctionPruning(cwd);
|
|
4147
4321
|
assertSingleTemplateNetlifyBuildOutput(cwd);
|
|
4148
4322
|
}
|
|
4149
4323
|
// Resolve remaining bare npm imports by bundling them into _libs/.
|
|
@@ -19,3 +19,48 @@ export declare function copyDir(src: string, dest: string, ancestorRealPaths?: S
|
|
|
19
19
|
* regular file — see the note in `copyTree`.
|
|
20
20
|
*/
|
|
21
21
|
export declare function cloneServerBundleForFunction(src: string, dest: string): void;
|
|
22
|
+
/**
|
|
23
|
+
* Drop the SSR page/asset island from a clone that can never route to it.
|
|
24
|
+
*
|
|
25
|
+
* The background and integration-recovery entries overwrite `url.pathname`
|
|
26
|
+
* unconditionally before delegating to `main.mjs`, so those clones cannot reach
|
|
27
|
+
* the page or asset handlers — yet each shipped a full copy of that island, and
|
|
28
|
+
* Netlify zips and uploads every function separately. Deleting from the clone is
|
|
29
|
+
* safe under hard links: only an in-place WRITE would reach the source bundle.
|
|
30
|
+
*/
|
|
31
|
+
export declare function pruneSsrIslandFromRewritingClone(dest: string, entryText: string): number;
|
|
32
|
+
/**
|
|
33
|
+
* Read a package's manifest, or null when it has none. Shared with build.ts's
|
|
34
|
+
* copyRuntimePackageTree, which is why this lives here rather than there:
|
|
35
|
+
* build.ts already imports from this file, and the reverse import would be
|
|
36
|
+
* circular.
|
|
37
|
+
*/
|
|
38
|
+
export declare function readPackageManifest(packageDir: string): Record<string, unknown> | null;
|
|
39
|
+
/**
|
|
40
|
+
* The browser runtime copied into serverless functions, by exact package name.
|
|
41
|
+
*
|
|
42
|
+
* Exact names, never the `@sparticuz` scope: another dependency can install an
|
|
43
|
+
* unrelated package into the same scope, and a scope-wide delete takes it with
|
|
44
|
+
* no way for the closure walk to prove it is still needed. build.ts imports
|
|
45
|
+
* this rather than declaring its own copy, so the list that is copied in and
|
|
46
|
+
* the list that is pruned out cannot drift apart.
|
|
47
|
+
*/
|
|
48
|
+
export declare const SERVERLESS_BROWSER_RUNTIME_PACKAGES: readonly ["@sparticuz/chromium-min", "playwright-core"];
|
|
49
|
+
/**
|
|
50
|
+
* Drop the serverless browser runtime — and everything installed only because
|
|
51
|
+
* the runtime needed it — from a clone that can never run an agent turn.
|
|
52
|
+
*
|
|
53
|
+
* Playwright and @sparticuz/chromium are reached only through NON-LITERAL
|
|
54
|
+
* dynamic imports in creative-context's rendered-page connector, so no static
|
|
55
|
+
* walk can prove them dead. The caller asserts it instead, and this refuses the
|
|
56
|
+
* prune when the entry rewrites to a route that could reach an agent — a
|
|
57
|
+
* scheduled report sweep can drop the runtime, an agent worker cannot.
|
|
58
|
+
*
|
|
59
|
+
* Deleting just the two known directories used to leave their whole
|
|
60
|
+
* dependency closure behind — packages like tar-fs and pump that exist in
|
|
61
|
+
* `node_modules` for no other reason than @sparticuz/chromium-min or
|
|
62
|
+
* playwright-core needing them. Those are orphaned the instant the runtime is
|
|
63
|
+
* gone, so this walks the closure and removes it too, keeping only what a
|
|
64
|
+
* still-present, unrelated package also depends on.
|
|
65
|
+
*/
|
|
66
|
+
export declare function pruneBrowserRuntimeFromNonAgentClone(dest: string, entryText: string): number;
|