@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.
Files changed (463) 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/auth.d.ts +1 -0
  294. package/dist/app-config/auth.js +7 -0
  295. package/dist/app-config/configuration-error.d.ts +11 -0
  296. package/dist/app-config/configuration-error.js +14 -0
  297. package/dist/app-config/index.d.ts +1 -0
  298. package/dist/app-config/index.js +1 -0
  299. package/dist/app-config/integrations.d.ts +1 -0
  300. package/dist/app-config/integrations.js +10 -0
  301. package/dist/app-config/plugins.d.ts +34 -0
  302. package/dist/app-config/plugins.js +39 -0
  303. package/dist/app-config/run-lifecycle-invariants.d.ts +18 -9
  304. package/dist/app-config/run-lifecycle-invariants.js +18 -25
  305. package/dist/app-config/schema.d.ts +17 -0
  306. package/dist/app-config/schema.js +2 -0
  307. package/dist/chat-threads/schema-migrations.js +20 -0
  308. package/dist/chat-threads/store.js +21 -4
  309. package/dist/cli/native-dependencies.d.ts +4 -0
  310. package/dist/cli/native-dependencies.js +15 -0
  311. package/dist/client/EnvironmentBadge.d.ts +1 -1
  312. package/dist/client/EnvironmentBadge.js +40 -5
  313. package/dist/client/MultiTabAssistantChat.d.ts +1 -1
  314. package/dist/client/MultiTabAssistantChat.js +35 -14
  315. package/dist/client/agent-chat/index.d.ts +1 -1
  316. package/dist/client/agent-chat/index.js +1 -1
  317. package/dist/client/agent-page/use-jobs.d.ts +2 -1
  318. package/dist/client/agent-page/use-jobs.js +3 -5
  319. package/dist/client/agent-sidebar-state.js +3 -1
  320. package/dist/client/blocks/library/code-tabs.js +5 -0
  321. package/dist/client/blocks/library/code.js +1 -0
  322. package/dist/client/chat-first/apps-rail.js +2 -2
  323. package/dist/client/chat-model-groups.d.ts +12 -0
  324. package/dist/client/chat-model-groups.js +3 -2
  325. package/dist/client/integrations/GoogleProductLogo.d.ts +5 -0
  326. package/dist/client/integrations/GoogleProductLogo.js +45 -0
  327. package/dist/client/integrations/index.d.ts +2 -0
  328. package/dist/client/integrations/index.js +2 -0
  329. package/dist/client/integrations/workspace-provider-oauth.d.ts +8 -0
  330. package/dist/client/integrations/workspace-provider-oauth.js +13 -0
  331. package/dist/client/resources/mcp-integration-catalog.js +0 -29
  332. package/dist/client/settings/SettingsTabsPage.js +10 -6
  333. package/dist/client/sharing/ShareButton.js +11 -2
  334. package/dist/client/use-chat-models.d.ts +6 -0
  335. package/dist/client/use-chat-models.js +10 -0
  336. package/dist/client/use-db-sync.js +27 -9
  337. package/dist/collab/routes.d.ts +1 -1
  338. package/dist/collab/struct-routes.d.ts +1 -1
  339. package/dist/connections/catalog.d.ts +111 -9
  340. package/dist/connections/catalog.js +86 -30
  341. package/dist/db/create-get-db.js +18 -0
  342. package/dist/db/ddl-guard.d.ts +0 -4
  343. package/dist/db/ddl-guard.js +46 -0
  344. package/dist/deploy/build.d.ts +19 -0
  345. package/dist/deploy/build.js +190 -16
  346. package/dist/deploy/function-bundle.d.ts +45 -0
  347. package/dist/deploy/function-bundle.js +337 -0
  348. package/dist/deploy/workspace-deploy.js +19 -1
  349. package/dist/eject/workspace-connections.js +4 -0
  350. package/dist/email-catalog/registry.d.ts +4 -0
  351. package/dist/email-catalog/registry.js +79 -14
  352. package/dist/extensions/content-patch.js +14 -2
  353. package/dist/integrations/plugin.d.ts +10 -0
  354. package/dist/integrations/plugin.js +40 -6
  355. package/dist/jobs/actions/run-automation-now.d.ts +2 -1
  356. package/dist/jobs/actions/run-automation-now.js +11 -5
  357. package/dist/jobs/frontmatter.js +53 -2
  358. package/dist/jobs/run-now.d.ts +11 -1
  359. package/dist/jobs/run-now.js +42 -7
  360. package/dist/jobs/scheduler.d.ts +1 -0
  361. package/dist/jobs/scheduler.js +2 -1
  362. package/dist/localization/core-messages/ar-SA.js +3 -0
  363. package/dist/localization/core-messages/de-DE.js +3 -0
  364. package/dist/localization/core-messages/en-US.d.ts +3 -0
  365. package/dist/localization/core-messages/en-US.js +3 -0
  366. package/dist/localization/core-messages/es-ES.js +3 -0
  367. package/dist/localization/core-messages/fr-FR.js +3 -0
  368. package/dist/localization/core-messages/hi-IN.js +3 -0
  369. package/dist/localization/core-messages/ja-JP.js +3 -0
  370. package/dist/localization/core-messages/ko-KR.js +3 -0
  371. package/dist/localization/core-messages/pt-BR.js +3 -0
  372. package/dist/localization/core-messages/zh-CN.js +3 -0
  373. package/dist/localization/core-messages/zh-TW.js +3 -0
  374. package/dist/localization/core-messages.d.ts +3 -0
  375. package/dist/localization/default-messages.d.ts +2 -5
  376. package/dist/localization/default-messages.js +2 -5
  377. package/dist/mcp/build-server.d.ts +9 -0
  378. package/dist/mcp/build-server.js +37 -8
  379. package/dist/mcp-client/oauth-client.d.ts +7 -0
  380. package/dist/mcp-client/oauth-client.js +12 -1
  381. package/dist/oauth-tokens/index.d.ts +1 -1
  382. package/dist/oauth-tokens/index.js +1 -1
  383. package/dist/oauth-tokens/lifecycle.d.ts +11 -0
  384. package/dist/oauth-tokens/lifecycle.js +17 -0
  385. package/dist/oauth-tokens/store.js +7 -0
  386. package/dist/observability/posthog-ai.d.ts +15 -1
  387. package/dist/observability/posthog-ai.js +24 -12
  388. package/dist/observability/traces.js +158 -28
  389. package/dist/onboarding/app-profile.js +2 -2
  390. package/dist/onboarding/plugin.js +10 -2
  391. package/dist/onboarding/types.d.ts +2 -0
  392. package/dist/provider-api/actions/custom-provider-registration.d.ts +1 -1
  393. package/dist/provider-api/actions/provider-api.d.ts +2 -2
  394. package/dist/provider-api/index.js +2 -0
  395. package/dist/resources/handlers.d.ts +2 -2
  396. package/dist/resources/store.js +13 -4
  397. package/dist/scripts/agent-engines/list-agent-engines.js +29 -3
  398. package/dist/secrets/register-framework-secrets.js +1 -1
  399. package/dist/server/action-discovery.js +5 -0
  400. package/dist/server/agent-chat/action-filters-a2a.d.ts +27 -3
  401. package/dist/server/agent-chat/action-filters-a2a.js +48 -9
  402. package/dist/server/agent-chat-plugin.js +36 -9
  403. package/dist/server/agent-discovery.js +43 -20
  404. package/dist/server/auth.js +18 -16
  405. package/dist/server/beta-opt-out-html.js +45 -4
  406. package/dist/server/better-auth-instance.d.ts +2 -1
  407. package/dist/server/better-auth-instance.js +37 -7
  408. package/dist/server/builder-design-systems.d.ts +4 -1
  409. package/dist/server/builder-design-systems.js +87 -6
  410. package/dist/server/builder-oauth.d.ts +1 -7
  411. package/dist/server/builder-oauth.js +80 -163
  412. package/dist/server/core-routes-plugin.d.ts +29 -0
  413. package/dist/server/core-routes-plugin.js +100 -20
  414. package/dist/server/default-plugins.d.ts +18 -0
  415. package/dist/server/default-plugins.js +22 -0
  416. package/dist/server/edge.d.ts +1 -0
  417. package/dist/server/edge.js +1 -0
  418. package/dist/server/framework-request-handler.js +31 -3
  419. package/dist/server/google-oauth.d.ts +3 -0
  420. package/dist/server/google-oauth.js +3 -0
  421. package/dist/server/index.d.ts +4 -4
  422. package/dist/server/index.js +3 -3
  423. package/dist/server/onboarding-html.js +37 -3
  424. package/dist/server/realtime-token.d.ts +1 -1
  425. package/dist/server/workspace-provider-oauth.d.ts +6 -1
  426. package/dist/server/workspace-provider-oauth.js +72 -20
  427. package/dist/shared/agent-sidebar-url.d.ts +1 -0
  428. package/dist/shared/agent-sidebar-url.js +1 -0
  429. package/dist/shared/environment-lanes.d.ts +2 -0
  430. package/dist/shared/environment-lanes.js +3 -1
  431. package/dist/shared/index.d.ts +3 -1
  432. package/dist/shared/index.js +3 -1
  433. package/dist/shared/surface-visibility.d.ts +31 -0
  434. package/dist/shared/surface-visibility.js +57 -0
  435. package/dist/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
  436. package/dist/templates/chat/app/routes.ts +3 -1
  437. package/dist/templates/chat/vitest.config.ts +8 -0
  438. package/dist/templates/default/.agents/skills/secrets/SKILL.md +11 -4
  439. package/dist/templates/default/app/routes.ts +3 -1
  440. package/dist/templates/headless/.agents/skills/secrets/SKILL.md +11 -4
  441. package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +11 -4
  442. package/dist/tracking/registry.d.ts +11 -0
  443. package/dist/tracking/registry.js +5 -2
  444. package/dist/triggers/actions.js +10 -3
  445. package/dist/usage/store.js +23 -3
  446. package/dist/user-profile/actions/get-auth-methods.js +18 -5
  447. package/dist/vite/client.js +33 -7
  448. package/docs/content/actions-access-control.mdx +43 -4
  449. package/docs/content/actions-defining.mdx +16 -0
  450. package/docs/content/authentication.mdx +40 -21
  451. package/docs/content/environment-variables.mdx +1 -0
  452. package/docs/content/template-clips-capture-everywhere.mdx +29 -30
  453. package/docs/content/template-clips-developers.mdx +4 -4
  454. package/docs/content/template-clips.mdx +3 -1
  455. package/package.json +2 -2
  456. package/src/eject/workspace-connections.ts +4 -0
  457. package/src/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
  458. package/src/templates/chat/app/routes.ts +3 -1
  459. package/src/templates/chat/vitest.config.ts +8 -0
  460. package/src/templates/default/.agents/skills/secrets/SKILL.md +11 -4
  461. package/src/templates/default/app/routes.ts +3 -1
  462. package/src/templates/headless/.agents/skills/secrets/SKILL.md +11 -4
  463. package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +11 -4
@@ -4056,6 +4056,24 @@ async function mountBetterAuthRoutes(app, options) {
4056
4056
  return { error: authError.message };
4057
4057
  }
4058
4058
  }));
4059
+ // Better Auth redirects new magic-link users through this small public
4060
+ // callback so first-run onboarding is marked only for newly created users.
4061
+ // Keep this before the generic magic-link handler for runtimes whose
4062
+ // app.use() middleware paths match descendants as prefixes.
4063
+ app.use("/_agent-native/auth/magic-link/new-user", defineEventHandler(async (event) => {
4064
+ if (!isReadMethod(event)) {
4065
+ setResponseStatus(event, 405);
4066
+ return { error: "Method not allowed" };
4067
+ }
4068
+ const query = getQuery(event);
4069
+ const rawReturn = Array.isArray(query.return)
4070
+ ? query.return[0]
4071
+ : query.return;
4072
+ if (await getSession(event)) {
4073
+ setFirstRunOnboardingCookie(event);
4074
+ }
4075
+ return redirectWithStagedCookies(event, safeReturnPath(rawReturn), 302);
4076
+ }));
4059
4077
  // Passwordless login via Better Auth's rate-limited magic-link plugin.
4060
4078
  app.use("/_agent-native/auth/magic-link", defineEventHandler(async (event) => {
4061
4079
  if (getMethod(event) === "GET") {
@@ -4313,22 +4331,6 @@ async function mountBetterAuthRoutes(app, options) {
4313
4331
  headers: { "Content-Type": "text/html; charset=utf-8" },
4314
4332
  });
4315
4333
  }));
4316
- // Better Auth redirects new magic-link users through this small public
4317
- // callback so first-run onboarding is marked only for newly created users.
4318
- app.use("/_agent-native/auth/magic-link/new-user", defineEventHandler(async (event) => {
4319
- if (!isReadMethod(event)) {
4320
- setResponseStatus(event, 405);
4321
- return { error: "Method not allowed" };
4322
- }
4323
- const query = getQuery(event);
4324
- const rawReturn = Array.isArray(query.return)
4325
- ? query.return[0]
4326
- : query.return;
4327
- if (await getSession(event)) {
4328
- setFirstRunOnboardingCookie(event);
4329
- }
4330
- return redirectWithStagedCookies(event, safeReturnPath(rawReturn), 302);
4331
- }));
4332
4334
  // Auth guard — stored both in framework middleware registry AND in
4333
4335
  // _authGuardFn so the server middleware can enforce it on ALL routes.
4334
4336
  const loginHtmlConfig = getOnboardingLoginHtmlConfig(options, authLoginMode);
@@ -1,4 +1,4 @@
1
- import { BETA_OPT_OUT_DURATION_MS, BETA_OPT_OUT_QUERY_PARAM, BETA_OPT_OUT_STORAGE_KEY, ENVIRONMENT_BETA_HOSTS, } from "../shared/environment-lanes.js";
1
+ import { BETA_FORCE_QUERY_PARAM, BETA_FORCE_SESSION_STORAGE_KEY, BETA_OPT_OUT_DURATION_MS, BETA_OPT_OUT_QUERY_PARAM, BETA_OPT_OUT_STORAGE_KEY, ENVIRONMENT_BETA_HOSTS, } from "../shared/environment-lanes.js";
2
2
  export const BETA_OPT_OUT_PERSISTENCE_MARKER = "Persist the beta opt-out before authentication";
3
3
  const ENVIRONMENT_SWITCHER_MARKER = 'data-agent-native-environment-switcher="1"';
4
4
  const ENVIRONMENT_SWITCHER_STYLE_MARKER = 'data-agent-native-environment-switcher-style="1"';
@@ -16,11 +16,16 @@ const environmentSwitcherMarkup = `<div class="environment-switcher" id="environ
16
16
  <div class="environment-popover-title" id="environment-popover-title">You're on Agent Native Beta</div>
17
17
  <div class="environment-popover-copy">Choose where you want to continue.</div>
18
18
  <a class="environment-production-link" id="environment-production-link" href="">Switch to production</a>
19
+ <button type="button" class="environment-hide-badge" id="environment-hide-badge">Hide badge</button>
19
20
  </div>
20
21
  </div>`;
21
22
  const environmentSwitcherStyles = `<style ${ENVIRONMENT_SWITCHER_STYLE_MARKER}>
22
- color-scheme: dark;
23
23
  .environment-switcher {
24
+ /* Must stay inside a rule. A bare declaration at stylesheet top level does
25
+ not end at its semicolon: the next qualified rule's prelude swallows it,
26
+ taking this selector with it, so the badge loses position/left/bottom and
27
+ drops into normal flow at the bottom of the page. */
28
+ color-scheme: dark;
24
29
  position: fixed;
25
30
  left: max(0.75rem, env(safe-area-inset-left));
26
31
  bottom: max(0.75rem, env(safe-area-inset-bottom));
@@ -53,7 +58,8 @@ const environmentSwitcherStyles = `<style ${ENVIRONMENT_SWITCHER_STYLE_MARKER}>
53
58
  background: color-mix(in srgb, CanvasText 85%, Canvas);
54
59
  }
55
60
  .environment-badge:focus-visible,
56
- .environment-production-link:focus-visible {
61
+ .environment-production-link:focus-visible,
62
+ .environment-hide-badge:focus-visible {
57
63
  outline: 2px solid LinkText;
58
64
  outline-offset: 2px;
59
65
  }
@@ -87,6 +93,23 @@ const environmentSwitcherStyles = `<style ${ENVIRONMENT_SWITCHER_STYLE_MARKER}>
87
93
  .environment-production-link:hover {
88
94
  background: color-mix(in srgb, CanvasText 12%, Canvas);
89
95
  }
96
+ .environment-hide-badge {
97
+ display: flex;
98
+ align-items: center;
99
+ justify-content: center;
100
+ width: 100%;
101
+ min-height: 2rem;
102
+ margin-top: 0.5rem;
103
+ margin-bottom: -0.5rem;
104
+ padding: 0.375rem 0.75rem;
105
+ color: GrayText;
106
+ border: 0;
107
+ background: transparent;
108
+ font: inherit;
109
+ font-size: 0.8125rem;
110
+ cursor: pointer;
111
+ }
112
+ .environment-hide-badge:hover { color: CanvasText; }
90
113
  </style>`;
91
114
  const environmentSwitcherScript = `<script ${ENVIRONMENT_SWITCHER_SCRIPT_MARKER}>
92
115
  (function __anInitEnvironmentBadge() {
@@ -94,9 +117,19 @@ const environmentSwitcherScript = `<script ${ENVIRONMENT_SWITCHER_SCRIPT_MARKER}
94
117
  var button = document.getElementById('environment-badge');
95
118
  var popover = document.getElementById('environment-popover');
96
119
  var productionLink = document.getElementById('environment-production-link');
97
- if (!switcher || !button || !popover || !productionLink) return;
120
+ var hideButton = document.getElementById('environment-hide-badge');
121
+ if (!switcher || !button || !popover || !productionLink || !hideButton) return;
98
122
  if (window.parent !== window) return;
99
123
 
124
+ try {
125
+ var forceUrl = new URL(window.location.href);
126
+ if (forceUrl.searchParams.get(${JSON.stringify(BETA_FORCE_QUERY_PARAM)}) === 'true') {
127
+ window.sessionStorage.setItem(${JSON.stringify(BETA_FORCE_SESSION_STORAGE_KEY)}, '1');
128
+ }
129
+ } catch (error) {
130
+ void error;
131
+ }
132
+
100
133
  var betaHosts = ${JSON.stringify(ENVIRONMENT_BETA_HOSTS)};
101
134
  var hostname = (window.location.hostname || '').toLowerCase().replace(/\\.$/, '');
102
135
  var productionHost = hostname.indexOf('beta.') === 0 ? hostname.slice(5) : '';
@@ -132,12 +165,20 @@ const environmentSwitcherScript = `<script ${ENVIRONMENT_SWITCHER_SCRIPT_MARKER}
132
165
  document.addEventListener('keydown', function(event) {
133
166
  if (event.key === 'Escape') setOpen(false);
134
167
  });
168
+ hideButton.addEventListener('click', function() {
169
+ setOpen(false);
170
+ switcher.hidden = true;
171
+ });
135
172
  })();
136
173
  </script>`;
137
174
  const betaOptOutPersistenceScript = `<script data-agent-native-beta-opt-out>
138
175
  // ${BETA_OPT_OUT_PERSISTENCE_MARKER}.
139
176
  (function __anPersistBetaOptOut() {
140
177
  try {
178
+ var forceUrl = new URL(window.location.href);
179
+ if (forceUrl.searchParams.get(${JSON.stringify(BETA_FORCE_QUERY_PARAM)}) === 'true') {
180
+ window.sessionStorage.setItem(${JSON.stringify(BETA_FORCE_SESSION_STORAGE_KEY)}, '1');
181
+ }
141
182
  var optOutUrl = new URL(window.location.href);
142
183
  var optOutValue = optOutUrl.searchParams.get(${JSON.stringify(BETA_OPT_OUT_QUERY_PARAM)});
143
184
  if (optOutValue === null) return;
@@ -265,5 +265,6 @@ export declare function resetBetterAuth(): Promise<void>;
265
265
  */
266
266
  export declare function configureLocalSqlite(sqlite: {
267
267
  pragma(statement: string): unknown;
268
- }): void;
268
+ close?(): void;
269
+ }): Promise<void>;
269
270
  export declare function buildDatabaseConfig(dialect: string): Promise<BetterAuthOptions["database"]>;
@@ -14,9 +14,10 @@ import { jwt } from "better-auth/plugins/jwt";
14
14
  import { magicLink } from "better-auth/plugins/magic-link";
15
15
  import { pgTable, text as pgText, timestamp as pgTimestamp, boolean as pgBoolean, } from "drizzle-orm/pg-core";
16
16
  import { sqliteTable, text as sqliteText, integer as sqliteInteger, } from "drizzle-orm/sqlite-core";
17
+ import { getAppConfig } from "../app-config/index.js";
17
18
  import { TEMPLATES } from "../cli/templates-meta.js";
18
19
  import { getDbExec, isPostgres } from "../db/client.js";
19
- import { getDialect, getCloudflareD1Binding, getDatabaseUrl, getDatabaseAuthToken, closePgliteClients, getPgliteClient, isPgliteUrl, loadPgliteDrizzle, pgPoolOptions, neonPoolOptions, guardNeonPool, sharedDbPool, onSharedDbPoolsClosed, onSharedDbPoolReplaced, } from "../db/client.js";
20
+ import { getDialect, getCloudflareD1Binding, getDatabaseUrl, getDatabaseAuthToken, closePgliteClients, getPgliteClient, isPgliteUrl, loadPgliteDrizzle, pgPoolOptions, neonPoolOptions, guardNeonPool, sharedDbPool, onSharedDbPoolsClosed, onSharedDbPoolReplaced, prepareLocalSqliteUrl, sqliteFilenameFromUrl, retrySqliteBusy, } from "../db/client.js";
20
21
  import { CORE_RESET_PASSWORD_EMAIL_ID, CORE_VERIFY_SIGNUP_EMAIL_ID, } from "../email-catalog/system-emails.js";
21
22
  import { saveOAuthTokens } from "../oauth-tokens/store.js";
22
23
  import { acceptPendingInvitationsForEmail } from "../org/accept-pending.js";
@@ -266,6 +267,19 @@ export function isDeployPreview() {
266
267
  return deployContext === "deploy-preview";
267
268
  }
268
269
  export function resolveEmailPasswordAuthPolicy(emailConfigured) {
270
+ const declared = getAppConfig().auth.requireEmailVerification;
271
+ if (declared !== undefined) {
272
+ // A declared policy is the whole policy — it outranks both the hosted
273
+ // derivation below and AUTH_SKIP_EMAIL_VERIFICATION. Choosing `false` is
274
+ // choosing to accept an unverified email as a login credential, so the
275
+ // signup lock that exists to prevent exactly that comes off with it.
276
+ return {
277
+ requireEmailVerification: declared && emailConfigured,
278
+ // Verification that no provider can deliver would strand every new
279
+ // account on an unverifiable signup, so refuse the signup instead.
280
+ disableSignUp: declared && !emailConfigured,
281
+ };
282
+ }
269
283
  const hosted = process.env.NODE_ENV === "production" || isDeployPreview();
270
284
  return {
271
285
  requireEmailVerification: emailConfigured && (hosted || !shouldSkipEmailVerification()),
@@ -539,7 +553,12 @@ export async function getBetterAuth(config) {
539
553
  return _auth;
540
554
  if (_initPromise)
541
555
  return _initPromise;
542
- _initPromise = createBetterAuthInstance(config);
556
+ // A failed boot must not be cached: every later request would replay the same
557
+ // stale error with no way back short of restarting the process.
558
+ _initPromise = createBetterAuthInstance(config).catch((error) => {
559
+ _initPromise = undefined;
560
+ throw error;
561
+ });
543
562
  _auth = await _initPromise;
544
563
  return _auth;
545
564
  }
@@ -1247,9 +1266,20 @@ async function createBetterAuthInstance(config) {
1247
1266
  * as the shared app connection. Better Auth uses its own SQLite handle, so the
1248
1267
  * app connection's busy timeout does not protect first-run account creation.
1249
1268
  */
1250
- export function configureLocalSqlite(sqlite) {
1269
+ export async function configureLocalSqlite(sqlite) {
1251
1270
  sqlite.pragma("busy_timeout = 10000");
1252
- sqlite.pragma("journal_mode = WAL");
1271
+ try {
1272
+ // Vite can start a replacement Nitro runtime while the previous instance is
1273
+ // still releasing app.db, and the busy timeout can expire during that
1274
+ // handoff, so retry the idempotent WAL negotiation.
1275
+ await retrySqliteBusy(async () => sqlite.pragma("journal_mode = WAL"), {
1276
+ rethrow: true,
1277
+ });
1278
+ }
1279
+ catch (error) {
1280
+ sqlite.close?.();
1281
+ throw error;
1282
+ }
1253
1283
  }
1254
1284
  export async function buildDatabaseConfig(dialect) {
1255
1285
  if (dialect === "postgres") {
@@ -1325,9 +1355,9 @@ export async function buildDatabaseConfig(dialect) {
1325
1355
  if (url.startsWith("file:") || !url.includes("://")) {
1326
1356
  // Local SQLite via better-sqlite3
1327
1357
  const { default: Database } = await import("better-sqlite3");
1328
- const filePath = url.replace(/^file:/, "");
1329
- const sqlite = new Database(filePath);
1330
- configureLocalSqlite(sqlite);
1358
+ const sqliteUrl = await prepareLocalSqliteUrl(url.startsWith("file:") ? url : `file:${url}`);
1359
+ const sqlite = new Database(sqliteFilenameFromUrl(sqliteUrl));
1360
+ await configureLocalSqlite(sqlite);
1331
1361
  const { drizzle } = await import("drizzle-orm/better-sqlite3");
1332
1362
  const db = drizzle(sqlite, { schema: sqliteAuthSchema });
1333
1363
  const { drizzleAdapter } = await import("better-auth/adapters/drizzle");
@@ -81,6 +81,8 @@ export interface BuilderDesignSystemHydratedReference extends BuilderDesignSyste
81
81
  docs: BuilderDesignSystemDocument[];
82
82
  tokenValues: Record<string, string>;
83
83
  docCount: number;
84
+ /** True only when Builder explicitly confirms that indexing is complete. */
85
+ completionConfirmed?: boolean;
84
86
  }
85
87
  export interface BuilderDesignSystemIndexOptions {
86
88
  projectName?: string;
@@ -108,8 +110,9 @@ export interface BuilderDesignSystemIndexResult {
108
110
  designSystemId: string;
109
111
  suggestedTitle: string | null;
110
112
  builderUrl: string;
111
- status: "in-progress";
113
+ status: BuilderDesignSystemStatus;
112
114
  }
115
+ export type BuilderDesignSystemStatus = "in-progress" | "ready" | "complete" | "completed" | "error" | "failed" | "cancelled";
113
116
  export interface BuilderDesignSystemUploadAttachment {
114
117
  name: string;
115
118
  mimetype: string;
@@ -10,6 +10,8 @@ const GCS_CHUNK_SIZE = 16 * 1024 * 1024;
10
10
  const MAX_CHUNK_RETRIES = 5;
11
11
  const DEFAULT_MAX_CODE_FILES = 50;
12
12
  const DEFAULT_MAX_TOTAL_CODE_BYTES = 2 * 1024 * 1024;
13
+ const DEFAULT_BUILDER_DOC_PAGE_SIZE = 40;
14
+ const MAX_BUILDER_DOC_PAGES = 100;
13
15
  const MAX_DOC_CONTENT_CHARS = 4_000;
14
16
  const MAX_GITHUB_FILES = 50;
15
17
  const MAX_GITHUB_TOTAL_BYTES = 2 * 1024 * 1024;
@@ -654,7 +656,35 @@ function normalizeBuilderDesignSystemDocument(value) {
654
656
  : undefined,
655
657
  };
656
658
  }
657
- export async function fetchBuilderDesignSystemDocs(designSystemId, options = {}) {
659
+ function normalizeBuilderDesignSystemStatus(value) {
660
+ if (typeof value !== "string")
661
+ return "in-progress";
662
+ switch (value.trim().toLowerCase()) {
663
+ case "ready":
664
+ return "ready";
665
+ case "complete":
666
+ case "done":
667
+ case "success":
668
+ return "complete";
669
+ case "completed":
670
+ return "completed";
671
+ case "error":
672
+ return "error";
673
+ case "failed":
674
+ case "failure":
675
+ return "failed";
676
+ case "cancelled":
677
+ case "canceled":
678
+ return "cancelled";
679
+ default:
680
+ return "in-progress";
681
+ }
682
+ }
683
+ function isConfirmedBuilderDesignSystemStatus(value) {
684
+ const status = normalizeBuilderDesignSystemStatus(value);
685
+ return status === "ready" || status === "complete" || status === "completed";
686
+ }
687
+ async function fetchBuilderDesignSystemDocsResponse(designSystemId, options) {
658
688
  const credentials = await resolveBuilderDesignSystemCredentials();
659
689
  const url = makeBuilderDesignSystemUrl(`${encodeURIComponent(designSystemId)}/docs`, credentials);
660
690
  if (options.page !== undefined)
@@ -671,13 +701,61 @@ export async function fetchBuilderDesignSystemDocs(designSystemId, options = {})
671
701
  });
672
702
  await assertOk(response, "Builder design-system docs fetch failed");
673
703
  const json = (await response.json());
674
- if (!Array.isArray(json)) {
704
+ if (Array.isArray(json)) {
705
+ return {
706
+ docs: json.map(normalizeBuilderDesignSystemDocument),
707
+ completionConfirmed: false,
708
+ };
709
+ }
710
+ if (!json || typeof json !== "object") {
711
+ throw new Error("Builder design-system docs fetch returned an invalid response.");
712
+ }
713
+ const envelope = json;
714
+ const rawDocs = envelope.docs ?? envelope.items;
715
+ if (!Array.isArray(rawDocs)) {
675
716
  throw new Error("Builder design-system docs fetch returned an invalid response.");
676
717
  }
677
- return json.map(normalizeBuilderDesignSystemDocument);
718
+ const rawStatus = envelope.status ?? envelope.builderStatus;
719
+ const status = typeof rawStatus === "string"
720
+ ? normalizeBuilderDesignSystemStatus(rawStatus)
721
+ : undefined;
722
+ const isTerminalFailure = status === "error" || status === "failed" || status === "cancelled";
723
+ return {
724
+ docs: rawDocs.map(normalizeBuilderDesignSystemDocument),
725
+ completionConfirmed: !isTerminalFailure &&
726
+ (envelope.complete === true ||
727
+ envelope.completed === true ||
728
+ isConfirmedBuilderDesignSystemStatus(status)),
729
+ ...(status ? { status } : {}),
730
+ };
678
731
  }
679
- export async function hydrateBuilderDesignSystemReference(reference, options = { page: 0, pageSize: 40 }) {
680
- const docs = await fetchBuilderDesignSystemDocs(reference.builderDesignSystemId, options);
732
+ export async function fetchBuilderDesignSystemDocs(designSystemId, options = {}) {
733
+ return (await fetchBuilderDesignSystemDocsResponse(designSystemId, options))
734
+ .docs;
735
+ }
736
+ export async function hydrateBuilderDesignSystemReference(reference, options = {
737
+ page: 0,
738
+ pageSize: DEFAULT_BUILDER_DOC_PAGE_SIZE,
739
+ }) {
740
+ const pageSize = options.pageSize && options.pageSize > 0
741
+ ? options.pageSize
742
+ : DEFAULT_BUILDER_DOC_PAGE_SIZE;
743
+ const docs = [];
744
+ let page = Math.max(0, options.page ?? 0);
745
+ let completionConfirmed = false;
746
+ let builderStatus = reference.builderStatus;
747
+ for (let pageNumber = 0; pageNumber < MAX_BUILDER_DOC_PAGES; pageNumber++) {
748
+ const response = await fetchBuilderDesignSystemDocsResponse(reference.builderDesignSystemId, { ...options, page, pageSize });
749
+ docs.push(...response.docs);
750
+ completionConfirmed ||= response.completionConfirmed;
751
+ builderStatus = response.status ?? builderStatus;
752
+ if (response.docs.length < pageSize)
753
+ break;
754
+ page += 1;
755
+ if (pageNumber === MAX_BUILDER_DOC_PAGES - 1) {
756
+ throw new Error("Builder design-system docs fetch exceeded the safe pagination limit.");
757
+ }
758
+ }
681
759
  const tokenValues = {};
682
760
  for (const doc of docs) {
683
761
  if (!doc.tokenValues)
@@ -689,9 +767,12 @@ export async function hydrateBuilderDesignSystemReference(reference, options = {
689
767
  }
690
768
  return {
691
769
  ...reference,
770
+ ...(builderStatus ? { builderStatus } : {}),
692
771
  docs,
693
772
  tokenValues,
694
773
  docCount: docs.length,
774
+ completionConfirmed: completionConfirmed ||
775
+ isConfirmedBuilderDesignSystemStatus(builderStatus),
695
776
  };
696
777
  }
697
778
  /**
@@ -771,7 +852,7 @@ export async function indexBuilderDesignSystem(options) {
771
852
  builderUrl: branchUrl ||
772
853
  builderProjectBranchUrl(indexed.projectId, indexed.branchName) ||
773
854
  builderDesignSystemUrl(indexed.designSystemId),
774
- status: "in-progress",
855
+ status: normalizeBuilderDesignSystemStatus(indexed.status),
775
856
  };
776
857
  }
777
858
  /**
@@ -1,11 +1,5 @@
1
1
  export declare const BUILDER_OAUTH_ISSUER = "https://mcp.builder.io";
2
2
  export declare const BUILDER_OAUTH_RESOURCE = "https://api.builder.io";
3
- export declare const BUILDER_OAUTH_PROTECTED_RESOURCE_METADATA = "https://mcp.builder.io/.well-known/oauth-protected-resource/api";
4
- export declare const BUILDER_OAUTH_AUTHORIZATION_METADATA = "https://mcp.builder.io/.well-known/oauth-authorization-server";
5
- export declare const BUILDER_OAUTH_AUTHORIZATION_ENDPOINT = "https://mcp.builder.io/oauth/authorize";
6
- export declare const BUILDER_OAUTH_TOKEN_ENDPOINT = "https://mcp.builder.io/oauth/token";
7
- export declare const BUILDER_OAUTH_REGISTRATION_ENDPOINT = "https://mcp.builder.io/oauth/register";
8
- export declare const BUILDER_OAUTH_REVOCATION_ENDPOINT = "https://mcp.builder.io/oauth/revoke";
9
3
  export declare const BUILDER_OAUTH_SCOPE = "builder:ai:invoke";
10
4
  export declare const BUILDER_OAUTH_SCOPES: readonly ["builder:ai:invoke"];
11
5
  export type BuilderOAuthPendingFlow = {
@@ -32,12 +26,12 @@ export declare function startBuilderOAuthAuthorization(input: {
32
26
  }>;
33
27
  export declare function finishBuilderOAuthAuthorization(input: {
34
28
  ownerEmail: string;
29
+ orgId?: string;
35
30
  code: string;
36
31
  iss?: string;
37
32
  pending: BuilderOAuthPendingFlow;
38
33
  }): Promise<void>;
39
34
  export declare function markBuilderOAuthReconnectRequired(ownerEmail: string): Promise<void>;
40
- export declare function builderOAuthReconnectRequired(ownerEmail: string): Promise<boolean>;
41
35
  export declare function getBuilderOAuthSession(ownerEmail: string): Promise<BuilderOAuthSession | null>;
42
36
  export declare function hasBuilderOAuthSession(ownerEmail: string): Promise<boolean>;
43
37
  export declare function resolveBuilderOAuthRequestAccess(input: {