@agent-native/core 0.169.1 → 0.170.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (459) hide show
  1. package/agent-native.eject.json +4 -1
  2. package/bin/agent-native.js +23 -5
  3. package/corpus/README.md +1 -1
  4. package/corpus/templates/analytics/.agents/skills/secrets/SKILL.md +11 -4
  5. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +1 -1
  6. package/corpus/templates/analytics/app/i18n-data.ts +28 -0
  7. package/corpus/templates/analytics/app/pages/Agents.tsx +25 -1
  8. package/corpus/templates/analytics/app/routes/$.tsx +10 -0
  9. package/corpus/templates/analytics/app/routes.ts +3 -1
  10. package/corpus/templates/analytics/changelog/2026-08-22-fixed-the-agent-native-templates-first-party-dashboard-panel.md +6 -0
  11. package/corpus/templates/analytics/changelog/2026-08-22-org-admin-panels-no-longer-report-a-database-error-as-a-per.md +9 -0
  12. package/corpus/templates/analytics/changelog/2026-08-22-slack-requests-report-invalid-inputs.md +6 -0
  13. package/corpus/templates/analytics/changelog/2026-08-22-unknown-analytics-links-now-return-a-real-not-found-status.md +6 -0
  14. package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +2 -1
  15. package/corpus/templates/analytics/docs/schemas/tracked-events.md +2 -0
  16. package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +29 -7
  17. package/corpus/templates/analytics/server/handlers/slack.ts +59 -5
  18. package/corpus/templates/analytics/server/lib/db-admin-connections.ts +11 -6
  19. package/corpus/templates/analytics/server/lib/first-party-analytics.ts +132 -2
  20. package/corpus/templates/analytics/server/lib/slack.ts +4 -2
  21. package/corpus/templates/analytics/vitest.config.ts +6 -1
  22. package/corpus/templates/assets/.agents/skills/secrets/SKILL.md +11 -4
  23. package/corpus/templates/assets/app/routes/library.tsx +5 -3
  24. package/corpus/templates/assets/app/routes.ts +3 -1
  25. package/corpus/templates/assets/changelog/2026-08-22-library-page-loads-again-instead-of-crashing-on-open.md +6 -0
  26. package/corpus/templates/assets/vitest.config.ts +6 -1
  27. package/corpus/templates/brain/.agents/skills/secrets/SKILL.md +11 -4
  28. package/corpus/templates/brain/app/components/ui/pointer-lock.ts +1 -0
  29. package/corpus/templates/brain/app/routes/sources.tsx +8 -3
  30. package/corpus/templates/brain/changelog/2026-08-22-tuning-or-adding-a-source-no-longer-leaves-the-sources-page.md +6 -0
  31. package/corpus/templates/brain/vitest.config.ts +1 -0
  32. package/corpus/templates/calendar/.agents/skills/secrets/SKILL.md +11 -4
  33. package/corpus/templates/calendar/actions/list-booking-links.ts +83 -4
  34. package/corpus/templates/calendar/actions/update-booking-link.ts +4 -3
  35. package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +11 -3
  36. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +1 -1
  37. package/corpus/templates/calendar/app/components/calendar/GoogleConnectBanner.tsx +103 -44
  38. package/corpus/templates/calendar/app/components/calendar/OutOfOfficeEvent.tsx +28 -24
  39. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +9 -2
  40. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +47 -58
  41. package/corpus/templates/calendar/app/hooks/use-booking-links.ts +5 -1
  42. package/corpus/templates/calendar/app/lib/event-layout.ts +52 -26
  43. package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +126 -98
  44. package/corpus/templates/calendar/app/pages/CalendarView.tsx +1 -0
  45. package/corpus/templates/calendar/app/pages/Settings.tsx +88 -81
  46. package/corpus/templates/calendar/app/routes.ts +3 -1
  47. package/corpus/templates/calendar/changelog/2026-08-22-booking-link-visibility-respects-shared-access.md +6 -0
  48. package/corpus/templates/calendar/changelog/2026-08-22-clicking-an-out-of-office-event-s-marker-no-longer-creates-a.md +6 -0
  49. package/corpus/templates/calendar/changelog/2026-08-22-event-detail-views-now-show-your-calendar-timezone.md +6 -0
  50. package/corpus/templates/calendar/changelog/2026-08-22-google-calendar-can-now-connect-with-the-shared-google-oauth.md +6 -0
  51. package/corpus/templates/calendar/changelog/2026-08-22-overlapping-events-now-show-each-others-boundaries.md +6 -0
  52. package/corpus/templates/calendar/changelog/2026-08-22-public-booking-pages-now-offer-time-slots-from-the-host-s-we.md +6 -0
  53. package/corpus/templates/calendar/server/handlers/bookings.ts +5 -7
  54. package/corpus/templates/calendar/server/handlers/google-auth.ts +10 -2
  55. package/corpus/templates/calendar/server/lib/google-calendar.ts +139 -14
  56. package/corpus/templates/calendar/server/onboarding.ts +85 -0
  57. package/corpus/templates/calendar/server/plugins/agent-chat.ts +2 -0
  58. package/corpus/templates/calendar/shared/api.ts +9 -1
  59. package/corpus/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
  60. package/corpus/templates/chat/app/routes.ts +3 -1
  61. package/corpus/templates/chat/vitest.config.ts +8 -0
  62. package/corpus/templates/clips/.agents/skills/secrets/SKILL.md +11 -4
  63. package/corpus/templates/clips/actions/get-meeting.ts +9 -4
  64. package/corpus/templates/clips/actions/list-recordings.ts +16 -3
  65. package/corpus/templates/clips/actions/search-meetings.ts +1 -0
  66. package/corpus/templates/clips/actions/view-screen.ts +8 -1
  67. package/corpus/templates/clips/app/components/meetings/meeting-history-row.tsx +32 -1
  68. package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +1 -1
  69. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +29 -1
  70. package/corpus/templates/clips/app/i18n/en-US.ts +5 -0
  71. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +33 -4
  72. package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +1 -0
  73. package/corpus/templates/clips/app/routes/access-request.approve.tsx +16 -9
  74. package/corpus/templates/clips/app/routes/embed.$shareId.tsx +17 -7
  75. package/corpus/templates/clips/app/routes/share.$shareId.tsx +17 -7
  76. package/corpus/templates/clips/changelog/2026-08-21-camera-bubble-black-circle.md +6 -0
  77. package/corpus/templates/clips/changelog/2026-08-22-screen-recordings-respect-the-microphone-toggle.md +6 -0
  78. package/corpus/templates/clips/changelog/2026-08-22-the-recordings-library-no-longer-fails-right-after-server-start.md +6 -0
  79. package/corpus/templates/clips/changelog/2026-08-23-the-agent-can-see-your-library-right-after-server-start.md +6 -0
  80. package/corpus/templates/clips/chrome-extension/src/background.ts +1 -2
  81. package/corpus/templates/clips/chrome-extension/src/native-transcription.ts +39 -7
  82. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +21 -25
  83. package/corpus/templates/clips/desktop/src/app.tsx +53 -24
  84. package/corpus/templates/clips/desktop/src/lib/bubble-playback.ts +68 -0
  85. package/corpus/templates/clips/desktop/src/lib/recorder.ts +3 -0
  86. package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +72 -14
  87. package/corpus/templates/clips/desktop/src/lib/updater.ts +8 -3
  88. package/corpus/templates/clips/desktop/src/overlays/bubble.tsx +162 -20
  89. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +43 -6
  90. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +150 -13
  91. package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +12 -0
  92. package/corpus/templates/clips/server/lib/calendar-event-meetings.ts +28 -3
  93. package/corpus/templates/clips/server/lib/emails.ts +17 -33
  94. package/corpus/templates/content/.agents/skills/secrets/SKILL.md +11 -4
  95. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +140 -15
  96. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +12 -14
  97. package/corpus/templates/content/app/components/ui/pointer-lock.ts +1 -0
  98. package/corpus/templates/content/app/hooks/use-content-database.ts +18 -2
  99. package/corpus/templates/content/app/hooks/use-local-storage.ts +38 -22
  100. package/corpus/templates/content/app/i18n-data.ts +25 -0
  101. package/corpus/templates/content/app/routes.ts +3 -1
  102. package/corpus/templates/content/changelog/2026-08-22-code-blocks-inserted-from-the-slash-menu-no-longer-get-stuck.md +6 -0
  103. package/corpus/templates/content/changelog/2026-08-22-the-sidebar-page-tree-no-longer-flashes-empty-after-creating-a-page.md +6 -0
  104. package/corpus/templates/content/docs/solutions/2026-08-21-content-mermaid-rendering-shape.md +233 -0
  105. package/corpus/templates/content/server/plugins/agent-chat.ts +9 -2
  106. package/corpus/templates/content/vitest.config.ts +7 -1
  107. package/corpus/templates/crm/.agents/skills/secrets/SKILL.md +11 -4
  108. package/corpus/templates/design/.agents/skills/secrets/SKILL.md +11 -4
  109. package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +1383 -88
  110. package/corpus/templates/design/actions/generate-design.ts +98 -47
  111. package/corpus/templates/design/actions/get-design-system.ts +6 -1
  112. package/corpus/templates/design/actions/refresh-design-system-with-builder.ts +146 -0
  113. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +70 -26
  114. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +284 -136
  115. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +2057 -141
  116. package/corpus/templates/design/app/components/design/editor/DesignBottomToolbar.tsx +6 -2
  117. package/corpus/templates/design/app/components/design/editor/DesignWorkspaceRail.tsx +4 -4
  118. package/corpus/templates/design/app/components/design/keyboard-shortcuts.ts +10 -1
  119. package/corpus/templates/design/app/components/design/multi-screen/alt-hover-measurement.ts +19 -2
  120. package/corpus/templates/design/app/components/design/multi-screen/types.ts +9 -2
  121. package/corpus/templates/design/app/components/layout/Header.tsx +15 -0
  122. package/corpus/templates/design/app/components/layout/Layout.tsx +7 -2
  123. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +11 -4
  124. package/corpus/templates/design/app/i18n-data.ts +1 -0
  125. package/corpus/templates/design/app/i18n-keyboard-shortcuts.ts +12 -0
  126. package/corpus/templates/design/app/lib/design-system-data.ts +68 -0
  127. package/corpus/templates/design/app/pages/DesignEditor.tsx +77 -35
  128. package/corpus/templates/design/app/pages/DesignSystems.tsx +136 -42
  129. package/corpus/templates/design/app/pages/Index.tsx +2 -0
  130. package/corpus/templates/design/app/pages/Templates.tsx +0 -10
  131. package/corpus/templates/design/app/pages/design-editor/code-layer-state.ts +10 -0
  132. package/corpus/templates/design/app/pages/design-editor/collab-sync.ts +50 -0
  133. package/corpus/templates/design/app/pages/design-editor/commands/apply-design-editor-command.ts +1 -1
  134. package/corpus/templates/design/app/pages/design-editor/commands/apply-file-content-update.ts +10 -8
  135. package/corpus/templates/design/app/pages/design-editor/commands/apply-local-content-update.ts +6 -6
  136. package/corpus/templates/design/app/pages/design-editor/commands/apply-pending-visual-styles-with-agent.ts +1 -1
  137. package/corpus/templates/design/app/pages/design-editor/commands/commit-visual-styles.ts +18 -7
  138. package/corpus/templates/design/app/pages/design-editor/commands/escape-hotkey.ts +4 -90
  139. package/corpus/templates/design/app/pages/design-editor/commands/layer-marquee-selection-change.ts +2 -1
  140. package/corpus/templates/design/app/pages/design-editor/commands/layer-selection-change.ts +4 -3
  141. package/corpus/templates/design/app/pages/design-editor/commands/screen-element-select.ts +12 -2
  142. package/corpus/templates/design/app/pages/design-editor/commands/screen-visual-style-change.ts +9 -2
  143. package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-move-semantic-handoff.ts +1 -1
  144. package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-semantic-handoff.ts +1 -1
  145. package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-state-semantic-handoff.ts +1 -1
  146. package/corpus/templates/design/app/pages/design-editor/commands/start-sidebar-resize.ts +1 -1
  147. package/corpus/templates/design/app/pages/design-editor/editor-state.ts +11 -1
  148. package/corpus/templates/design/app/pages/design-editor/effects/adopt-db-file-content.ts +11 -19
  149. package/corpus/templates/design/app/pages/design-editor/effects/observe-collab-text.ts +6 -6
  150. package/corpus/templates/design/app/pages/design-editor/effects/publish-agent-selection-context.ts +1 -1
  151. package/corpus/templates/design/app/pages/design-editor/effects/seed-collab-content.ts +12 -15
  152. package/corpus/templates/design/app/pages/design-editor/selection-state.ts +5 -59
  153. package/corpus/templates/design/app/pages/design-editor/tool-state.ts +8 -0
  154. package/corpus/templates/design/app/pages/design-editor/types.ts +3 -3
  155. package/corpus/templates/design/app/routes.ts +3 -1
  156. package/corpus/templates/design/changelog/2026-08-20-canvas-edits-patch-the-frame-instead-of-rebuilding-it.md +6 -0
  157. package/corpus/templates/design/changelog/2026-08-21-builder-design-system-imports-reconcile-after-indexing.md +6 -0
  158. package/corpus/templates/design/changelog/2026-08-21-draw-mode-needs-shift-y.md +6 -0
  159. package/corpus/templates/design/changelog/2026-08-21-eyedropper-shortcut.md +6 -0
  160. package/corpus/templates/design/changelog/2026-08-21-figma-style-alignment-guides-and-snapping.md +6 -0
  161. package/corpus/templates/design/changelog/2026-08-21-group-transforms-keep-the-selection.md +6 -0
  162. package/corpus/templates/design/changelog/2026-08-21-inspector-fields-keep-focus-on-enter.md +6 -0
  163. package/corpus/templates/design/changelog/2026-08-21-pen-alt-keeps-the-incoming-handle.md +6 -0
  164. package/corpus/templates/design/changelog/2026-08-21-pen-on-the-board-creates-one-vector.md +6 -0
  165. package/corpus/templates/design/changelog/2026-08-21-scale-a-multi-selection-from-the-group-handles.md +6 -0
  166. package/corpus/templates/design/changelog/2026-08-21-scale-resizes-text-with-the-object.md +6 -0
  167. package/corpus/templates/design/changelog/2026-08-21-selecting-another-object-keeps-the-scale-tool-armed.md +6 -0
  168. package/corpus/templates/design/changelog/2026-08-21-the-shape-tool-remembers-the-shape-you-picked.md +6 -0
  169. package/corpus/templates/design/changelog/2026-08-21-vectors-drawn-in-a-frame-land-where-you-drew-them.md +6 -0
  170. package/corpus/templates/design/changelog/2026-08-22-multi-screen-generation-no-longer-loses-a-saved-screens-layo.md +6 -0
  171. package/corpus/templates/design/changelog/2026-08-22-rename-and-search-fields-are-labeled-for-screen-readers.md +6 -0
  172. package/corpus/templates/design/package.json +2 -0
  173. package/corpus/templates/design/server/lib/builder-design-system-proxy.ts +311 -0
  174. package/corpus/templates/design/shared/canvas-math.ts +612 -206
  175. package/corpus/templates/design/shared/pen-path.ts +37 -0
  176. package/corpus/templates/design/vitest.config.ts +7 -1
  177. package/corpus/templates/dispatch/.agents/skills/secrets/SKILL.md +11 -4
  178. package/corpus/templates/dispatch/actions/list-workspace-connections.ts +34 -3
  179. package/corpus/templates/dispatch/app/routes/integrations.tsx +55 -21
  180. package/corpus/templates/dispatch/app/routes.ts +3 -1
  181. package/corpus/templates/factory/.agents/skills/secrets/SKILL.md +11 -4
  182. package/corpus/templates/factory/.env.example +2 -7
  183. package/corpus/templates/factory/AGENTS.md +3 -0
  184. package/corpus/templates/factory/README.md +5 -3
  185. package/corpus/templates/factory/actions/create-factory.ts +16 -3
  186. package/corpus/templates/factory/actions/get-slack-feedback-context.ts +2 -0
  187. package/corpus/templates/factory/actions/get-triage-item.ts +2 -0
  188. package/corpus/templates/factory/actions/list-factory-audit.ts +116 -36
  189. package/corpus/templates/factory/actions/list-factory-automations.ts +2 -1
  190. package/corpus/templates/factory/actions/list-triage-items.ts +22 -19
  191. package/corpus/templates/factory/actions/run-factory-automation.ts +7 -3
  192. package/corpus/templates/factory/actions/save-factory-automation.ts +5 -2
  193. package/corpus/templates/factory/actions/save-triage-config.ts +2 -8
  194. package/corpus/templates/factory/actions/start-builder-for-item.ts +21 -0
  195. package/corpus/templates/factory/app/components/factory/FactoryAuditView.tsx +229 -297
  196. package/corpus/templates/factory/app/components/factory/FactorySettingsView.tsx +397 -247
  197. package/corpus/templates/factory/app/components/factory/FactorySourceSettingsGroup.tsx +33 -0
  198. package/corpus/templates/factory/app/components/factory/NewFactoryForm.tsx +202 -162
  199. package/corpus/templates/factory/app/i18n/en-US.ts +32 -4
  200. package/corpus/templates/factory/app/routes/factory.tsx +84 -11
  201. package/corpus/templates/factory/app/routes.ts +3 -1
  202. package/corpus/templates/factory/changelog/2026-08-21-activity-runs-use-automation-display-names.md +6 -0
  203. package/corpus/templates/factory/changelog/2026-08-21-create-and-settings-source-cards.md +6 -0
  204. package/corpus/templates/factory/changelog/2026-08-21-keep-automations-visible-while-running.md +6 -0
  205. package/corpus/templates/factory/changelog/2026-08-21-nested-factory-automations-can-poll.md +6 -0
  206. package/corpus/templates/factory/changelog/2026-08-21-settings-sticky-unsaved-bar.md +6 -0
  207. package/corpus/templates/factory/server/connectors/credentials.ts +10 -5
  208. package/corpus/templates/factory/server/lib/factory-audit-report.ts +412 -0
  209. package/corpus/templates/factory/server/lib/factory-config-reconcile.ts +321 -0
  210. package/corpus/templates/factory/server/lib/factory-scope.ts +25 -2
  211. package/corpus/templates/factory/server/lib/require-factory-automation.ts +13 -4
  212. package/corpus/templates/factory/server/plugins/factory-migrations.ts +148 -4
  213. package/corpus/templates/factory/server/plugins/factory-scheduler-job.ts +4 -6
  214. package/corpus/templates/factory/vitest.config.ts +17 -2
  215. package/corpus/templates/forms/.agents/skills/secrets/SKILL.md +11 -4
  216. package/corpus/templates/forms/app/routes/_app.settings.tsx +4 -1
  217. package/corpus/templates/forms/changelog/2026-08-22-the-extensions-link-now-opens-the-extensions-tab-instead-o.md +6 -0
  218. package/corpus/templates/forms/server/lib/public-form-ssr.ts +11 -1
  219. package/corpus/templates/forms/vitest.config.ts +1 -0
  220. package/corpus/templates/macros/.agents/skills/secrets/SKILL.md +11 -4
  221. package/corpus/templates/macros/app/routes.ts +3 -1
  222. package/corpus/templates/macros/vitest.config.ts +6 -1
  223. package/corpus/templates/mail/.agents/skills/secrets/SKILL.md +11 -4
  224. package/corpus/templates/mail/actions/manage-gmail-filters.ts +10 -2
  225. package/corpus/templates/mail/app/components/GoogleConnectBanner.tsx +100 -37
  226. package/corpus/templates/mail/app/components/email/IntegrationsSidebar.tsx +14 -2
  227. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +66 -36
  228. package/corpus/templates/mail/app/hooks/use-google-auth.ts +2 -0
  229. package/corpus/templates/mail/app/lib/google-oauth-setup.ts +17 -0
  230. package/corpus/templates/mail/app/pages/InboxPage.tsx +69 -9
  231. package/corpus/templates/mail/app/routes/$.tsx +9 -0
  232. package/corpus/templates/mail/app/routes/$view.$threadId.tsx +23 -1
  233. package/corpus/templates/mail/app/routes/$view.tsx +47 -1
  234. package/corpus/templates/mail/app/routes.ts +3 -1
  235. package/corpus/templates/mail/changelog/2026-08-22-gmail-can-now-connect-with-the-shared-google-oauth.md +6 -0
  236. package/corpus/templates/mail/changelog/2026-08-22-gmail-filters-now-shows-the-real-error.md +6 -0
  237. package/corpus/templates/mail/changelog/2026-08-22-unknown-mail-urls-now-show-the-404-page.md +6 -0
  238. package/corpus/templates/mail/server/handlers/google-auth.ts +11 -2
  239. package/corpus/templates/mail/server/lib/google-auth.ts +92 -12
  240. package/corpus/templates/mail/server/onboarding.ts +66 -18
  241. package/corpus/templates/mail/vitest.config.ts +6 -1
  242. package/corpus/templates/plan/.agents/skills/secrets/SKILL.md +11 -4
  243. package/corpus/templates/plan/app/routes/settings.tsx +4 -1
  244. package/corpus/templates/plan/app/routes.ts +3 -1
  245. package/corpus/templates/plan/changelog/2026-08-22-the-extensions-link-now-opens-the-extensions-tab-instead-o.md +6 -0
  246. package/corpus/templates/plan/netlify.toml +1 -1
  247. package/corpus/templates/slides/.agents/skills/secrets/SKILL.md +11 -4
  248. package/corpus/templates/slides/actions/patch-deck.ts +79 -10
  249. package/corpus/templates/slides/actions/update-slide.ts +11 -1
  250. package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +14 -4
  251. package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +10 -52
  252. package/corpus/templates/slides/app/components/editor/GoogleDocImportHint.tsx +8 -53
  253. package/corpus/templates/slides/app/components/editor/GoogleDriveConnectionCta.tsx +9 -75
  254. package/corpus/templates/slides/app/components/editor/GoogleSlidesReferenceImport.tsx +8 -60
  255. package/corpus/templates/slides/app/components/editor/SlideContextToolbar.tsx +10 -2
  256. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +19 -7
  257. package/corpus/templates/slides/app/lib/sanitize-slide-html.ts +49 -36
  258. package/corpus/templates/slides/app/routes/access-request.approve.tsx +16 -9
  259. package/corpus/templates/slides/app/routes.ts +3 -1
  260. package/corpus/templates/slides/changelog/2026-08-22-already-uploaded-chat-images-are-no-longer-dropped.md +6 -0
  261. package/corpus/templates/slides/changelog/2026-08-22-google-drive-and-slides-can-now-connect-with-the-shared-google-oauth.md +6 -0
  262. package/corpus/templates/slides/changelog/2026-08-22-multi-slide-repairs-now-report-slides-that-still-overflow.md +6 -0
  263. package/corpus/templates/slides/changelog/2026-08-22-update-slide-now-reports-which-batched-edit-was-skipped.md +6 -0
  264. package/corpus/templates/slides/server/handlers/google-docs-auth.ts +52 -1
  265. package/corpus/templates/slides/server/lib/chat-attachments.ts +29 -3
  266. package/corpus/templates/slides/server/lib/google-docs-oauth.ts +66 -16
  267. package/corpus/templates/slides/server/lib/slide-content-patch.ts +13 -2
  268. package/corpus/templates/slides/server/plugins/agent-chat.ts +5 -2
  269. package/corpus/templates/slides/tsconfig.json +5 -0
  270. package/corpus/templates/slides/vitest.config.ts +6 -1
  271. package/corpus/templates/tasks/.agents/skills/secrets/SKILL.md +11 -4
  272. package/corpus/templates/tasks/app/routes/settings.tsx +4 -1
  273. package/corpus/templates/tasks/app/routes.ts +3 -1
  274. package/corpus/templates/tasks/changelog/2026-08-22-the-extensions-link-now-opens-the-extensions-tab-instead-o.md +6 -0
  275. package/corpus/templates/tasks/vitest.config.ts +7 -1
  276. package/dist/action.d.ts +91 -0
  277. package/dist/action.js +50 -0
  278. package/dist/agent/abort-reasons.d.ts +38 -0
  279. package/dist/agent/abort-reasons.js +49 -0
  280. package/dist/agent/engine/ai-sdk-engine.js +8 -5
  281. package/dist/agent/engine/anthropic-engine.js +7 -5
  282. package/dist/agent/engine/first-event-timeout.d.ts +42 -17
  283. package/dist/agent/engine/first-event-timeout.js +67 -25
  284. package/dist/agent/production-agent.d.ts +23 -0
  285. package/dist/agent/production-agent.js +107 -102
  286. package/dist/agent/run-loop-with-resume.d.ts +2 -28
  287. package/dist/agent/run-loop-with-resume.js +25 -40
  288. package/dist/agent/run-manager.js +5 -4
  289. package/dist/agent/run-store.d.ts +55 -0
  290. package/dist/agent/run-store.js +124 -1
  291. package/dist/agent/tool-search.js +2 -1
  292. package/dist/agent/types.d.ts +9 -4
  293. package/dist/app-config/configuration-error.d.ts +11 -0
  294. package/dist/app-config/configuration-error.js +14 -0
  295. package/dist/app-config/index.d.ts +1 -0
  296. package/dist/app-config/index.js +1 -0
  297. package/dist/app-config/integrations.d.ts +1 -0
  298. package/dist/app-config/integrations.js +10 -0
  299. package/dist/app-config/plugins.d.ts +34 -0
  300. package/dist/app-config/plugins.js +39 -0
  301. package/dist/app-config/run-lifecycle-invariants.d.ts +18 -9
  302. package/dist/app-config/run-lifecycle-invariants.js +18 -25
  303. package/dist/app-config/schema.d.ts +16 -0
  304. package/dist/app-config/schema.js +2 -0
  305. package/dist/chat-threads/schema-migrations.js +20 -0
  306. package/dist/chat-threads/store.js +21 -4
  307. package/dist/cli/native-dependencies.d.ts +4 -0
  308. package/dist/cli/native-dependencies.js +15 -0
  309. package/dist/client/EnvironmentBadge.d.ts +1 -1
  310. package/dist/client/EnvironmentBadge.js +40 -5
  311. package/dist/client/MultiTabAssistantChat.d.ts +1 -1
  312. package/dist/client/MultiTabAssistantChat.js +35 -14
  313. package/dist/client/agent-chat/index.d.ts +1 -1
  314. package/dist/client/agent-chat/index.js +1 -1
  315. package/dist/client/agent-page/use-jobs.d.ts +2 -1
  316. package/dist/client/agent-page/use-jobs.js +3 -5
  317. package/dist/client/agent-sidebar-state.js +3 -1
  318. package/dist/client/blocks/library/code-tabs.js +5 -0
  319. package/dist/client/blocks/library/code.js +1 -0
  320. package/dist/client/chat-first/apps-rail.js +2 -2
  321. package/dist/client/chat-model-groups.d.ts +12 -0
  322. package/dist/client/chat-model-groups.js +3 -2
  323. package/dist/client/integrations/GoogleProductLogo.d.ts +5 -0
  324. package/dist/client/integrations/GoogleProductLogo.js +45 -0
  325. package/dist/client/integrations/index.d.ts +2 -0
  326. package/dist/client/integrations/index.js +2 -0
  327. package/dist/client/integrations/workspace-provider-oauth.d.ts +8 -0
  328. package/dist/client/integrations/workspace-provider-oauth.js +13 -0
  329. package/dist/client/resources/mcp-integration-catalog.js +0 -29
  330. package/dist/client/settings/SettingsTabsPage.js +10 -6
  331. package/dist/client/sharing/ShareButton.js +11 -2
  332. package/dist/client/use-chat-models.d.ts +6 -0
  333. package/dist/client/use-chat-models.js +10 -0
  334. package/dist/client/use-db-sync.js +27 -9
  335. package/dist/connections/catalog.d.ts +111 -9
  336. package/dist/connections/catalog.js +86 -30
  337. package/dist/db/create-get-db.js +18 -0
  338. package/dist/db/ddl-guard.d.ts +0 -4
  339. package/dist/db/ddl-guard.js +46 -0
  340. package/dist/deploy/build.d.ts +19 -0
  341. package/dist/deploy/build.js +190 -16
  342. package/dist/deploy/function-bundle.d.ts +45 -0
  343. package/dist/deploy/function-bundle.js +337 -0
  344. package/dist/deploy/workspace-deploy.js +19 -1
  345. package/dist/eject/workspace-connections.js +4 -0
  346. package/dist/email-catalog/registry.d.ts +4 -0
  347. package/dist/email-catalog/registry.js +79 -14
  348. package/dist/extensions/content-patch.js +14 -2
  349. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  350. package/dist/integrations/plugin.d.ts +10 -0
  351. package/dist/integrations/plugin.js +40 -6
  352. package/dist/jobs/actions/run-automation-now.d.ts +2 -1
  353. package/dist/jobs/actions/run-automation-now.js +11 -5
  354. package/dist/jobs/frontmatter.js +53 -2
  355. package/dist/jobs/run-now.d.ts +11 -1
  356. package/dist/jobs/run-now.js +42 -7
  357. package/dist/jobs/scheduler.d.ts +1 -0
  358. package/dist/jobs/scheduler.js +2 -1
  359. package/dist/localization/core-messages/ar-SA.js +3 -0
  360. package/dist/localization/core-messages/de-DE.js +3 -0
  361. package/dist/localization/core-messages/en-US.d.ts +3 -0
  362. package/dist/localization/core-messages/en-US.js +3 -0
  363. package/dist/localization/core-messages/es-ES.js +3 -0
  364. package/dist/localization/core-messages/fr-FR.js +3 -0
  365. package/dist/localization/core-messages/hi-IN.js +3 -0
  366. package/dist/localization/core-messages/ja-JP.js +3 -0
  367. package/dist/localization/core-messages/ko-KR.js +3 -0
  368. package/dist/localization/core-messages/pt-BR.js +3 -0
  369. package/dist/localization/core-messages/zh-CN.js +3 -0
  370. package/dist/localization/core-messages/zh-TW.js +3 -0
  371. package/dist/localization/core-messages.d.ts +3 -0
  372. package/dist/localization/default-messages.d.ts +2 -5
  373. package/dist/localization/default-messages.js +2 -5
  374. package/dist/mcp/build-server.d.ts +9 -0
  375. package/dist/mcp/build-server.js +37 -8
  376. package/dist/mcp-client/oauth-client.d.ts +7 -0
  377. package/dist/mcp-client/oauth-client.js +12 -1
  378. package/dist/oauth-tokens/index.d.ts +1 -1
  379. package/dist/oauth-tokens/index.js +1 -1
  380. package/dist/oauth-tokens/lifecycle.d.ts +11 -0
  381. package/dist/oauth-tokens/lifecycle.js +17 -0
  382. package/dist/oauth-tokens/store.js +7 -0
  383. package/dist/observability/posthog-ai.d.ts +15 -1
  384. package/dist/observability/posthog-ai.js +24 -12
  385. package/dist/observability/routes.d.ts +3 -3
  386. package/dist/observability/traces.js +158 -28
  387. package/dist/onboarding/app-profile.js +2 -2
  388. package/dist/onboarding/plugin.js +10 -2
  389. package/dist/onboarding/types.d.ts +2 -0
  390. package/dist/provider-api/actions/custom-provider-registration.d.ts +1 -1
  391. package/dist/provider-api/actions/provider-api.d.ts +2 -2
  392. package/dist/provider-api/index.js +2 -0
  393. package/dist/resources/store.js +13 -4
  394. package/dist/scripts/agent-engines/list-agent-engines.js +29 -3
  395. package/dist/secrets/register-framework-secrets.js +1 -1
  396. package/dist/server/action-discovery.js +5 -0
  397. package/dist/server/agent-chat/action-filters-a2a.d.ts +27 -3
  398. package/dist/server/agent-chat/action-filters-a2a.js +48 -9
  399. package/dist/server/agent-chat-plugin.js +36 -9
  400. package/dist/server/agent-discovery.js +43 -20
  401. package/dist/server/auth.js +18 -16
  402. package/dist/server/beta-opt-out-html.js +45 -4
  403. package/dist/server/better-auth-instance.d.ts +2 -1
  404. package/dist/server/better-auth-instance.js +23 -7
  405. package/dist/server/builder-design-systems.d.ts +4 -1
  406. package/dist/server/builder-design-systems.js +87 -6
  407. package/dist/server/builder-oauth.d.ts +1 -7
  408. package/dist/server/builder-oauth.js +80 -163
  409. package/dist/server/core-routes-plugin.d.ts +29 -0
  410. package/dist/server/core-routes-plugin.js +100 -20
  411. package/dist/server/default-plugins.d.ts +18 -0
  412. package/dist/server/default-plugins.js +22 -0
  413. package/dist/server/edge.d.ts +1 -0
  414. package/dist/server/edge.js +1 -0
  415. package/dist/server/framework-request-handler.js +31 -3
  416. package/dist/server/google-oauth.d.ts +3 -0
  417. package/dist/server/google-oauth.js +3 -0
  418. package/dist/server/index.d.ts +4 -4
  419. package/dist/server/index.js +3 -3
  420. package/dist/server/onboarding-html.js +37 -3
  421. package/dist/server/realtime-token.d.ts +1 -1
  422. package/dist/server/transcribe-voice.d.ts +1 -1
  423. package/dist/server/workspace-provider-oauth.d.ts +6 -1
  424. package/dist/server/workspace-provider-oauth.js +72 -20
  425. package/dist/shared/agent-sidebar-url.d.ts +1 -0
  426. package/dist/shared/agent-sidebar-url.js +1 -0
  427. package/dist/shared/environment-lanes.d.ts +2 -0
  428. package/dist/shared/environment-lanes.js +3 -1
  429. package/dist/shared/index.d.ts +3 -1
  430. package/dist/shared/index.js +3 -1
  431. package/dist/shared/surface-visibility.d.ts +31 -0
  432. package/dist/shared/surface-visibility.js +57 -0
  433. package/dist/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
  434. package/dist/templates/chat/app/routes.ts +3 -1
  435. package/dist/templates/chat/vitest.config.ts +8 -0
  436. package/dist/templates/default/.agents/skills/secrets/SKILL.md +11 -4
  437. package/dist/templates/default/app/routes.ts +3 -1
  438. package/dist/templates/headless/.agents/skills/secrets/SKILL.md +11 -4
  439. package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +11 -4
  440. package/dist/tracking/registry.d.ts +11 -0
  441. package/dist/tracking/registry.js +5 -2
  442. package/dist/triggers/actions.js +10 -3
  443. package/dist/usage/store.js +23 -3
  444. package/dist/user-profile/actions/get-auth-methods.js +18 -5
  445. package/dist/vite/client.js +24 -5
  446. package/docs/content/actions-access-control.mdx +43 -4
  447. package/docs/content/actions-defining.mdx +16 -0
  448. package/docs/content/template-clips-capture-everywhere.mdx +29 -30
  449. package/docs/content/template-clips-developers.mdx +4 -4
  450. package/docs/content/template-clips.mdx +3 -1
  451. package/package.json +2 -2
  452. package/src/eject/workspace-connections.ts +4 -0
  453. package/src/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
  454. package/src/templates/chat/app/routes.ts +3 -1
  455. package/src/templates/chat/vitest.config.ts +8 -0
  456. package/src/templates/default/.agents/skills/secrets/SKILL.md +11 -4
  457. package/src/templates/default/app/routes.ts +3 -1
  458. package/src/templates/headless/.agents/skills/secrets/SKILL.md +11 -4
  459. package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +11 -4
@@ -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
- pluginCalls.push(` if (typeof ${varName} === "function") {
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;