@agent-native/core 0.131.9 → 0.132.1

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 (295) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +105 -0
  3. package/corpus/core/docs/content/durable-background-runs.mdx +15 -6
  4. package/corpus/core/docs/design/durable-agent-runs.md +15 -11
  5. package/corpus/core/package.json +1 -1
  6. package/corpus/core/src/a2a/activity.ts +127 -10
  7. package/corpus/core/src/a2a/index.ts +3 -0
  8. package/corpus/core/src/action.ts +52 -11
  9. package/corpus/core/src/agent/durable-background.ts +38 -28
  10. package/corpus/core/src/agent/harness/background.ts +12 -2
  11. package/corpus/core/src/agent/production-agent.ts +210 -43
  12. package/corpus/core/src/agent/run-store.ts +45 -3
  13. package/corpus/core/src/application-state/handlers.ts +45 -0
  14. package/corpus/core/src/application-state/index.ts +3 -0
  15. package/corpus/core/src/application-state/store.ts +28 -11
  16. package/corpus/core/src/audit/redact.ts +104 -18
  17. package/corpus/core/src/client/AgentPanel.tsx +2 -7
  18. package/corpus/core/src/client/MultiTabAssistantChat.tsx +3 -0
  19. package/corpus/core/src/client/RunStuckBanner.tsx +29 -6
  20. package/corpus/core/src/client/agent-chat.ts +4 -9
  21. package/corpus/core/src/client/application-state.ts +115 -12
  22. package/corpus/core/src/client/dynamic-suggestions.ts +4 -12
  23. package/corpus/core/src/client/guided-questions.tsx +12 -23
  24. package/corpus/core/src/db/client.ts +148 -28
  25. package/corpus/core/src/db/create-get-db.ts +39 -6
  26. package/corpus/core/src/db/runtime-diagnostics.ts +41 -6
  27. package/corpus/core/src/deploy/build.ts +26 -33
  28. package/corpus/core/src/feature-flags/store.ts +10 -5
  29. package/corpus/core/src/integrations/a2a-continuations-store.ts +11 -0
  30. package/corpus/core/src/integrations/config-store.ts +13 -0
  31. package/corpus/core/src/integrations/google-docs-poller.ts +26 -2
  32. package/corpus/core/src/mcp-client/routes.ts +33 -2
  33. package/corpus/core/src/onboarding/plugin.ts +31 -25
  34. package/corpus/core/src/org/accept-pending.ts +2 -0
  35. package/corpus/core/src/org/auto-join-domain.ts +2 -0
  36. package/corpus/core/src/org/context.ts +35 -10
  37. package/corpus/core/src/org/handlers.ts +6 -0
  38. package/corpus/core/src/org/request-org-cache.ts +71 -0
  39. package/corpus/core/src/resources/store.ts +10 -9
  40. package/corpus/core/src/scripts/runner.ts +6 -3
  41. package/corpus/core/src/secrets/storage.ts +97 -5
  42. package/corpus/core/src/server/action-change.ts +33 -0
  43. package/corpus/core/src/server/action-routes.ts +11 -9
  44. package/corpus/core/src/server/agent-teams.ts +10 -2
  45. package/corpus/core/src/server/better-auth-instance.ts +39 -12
  46. package/corpus/core/src/server/core-routes-plugin.ts +19 -2
  47. package/corpus/core/src/server/credential-provider.ts +57 -14
  48. package/corpus/core/src/server/http-response-telemetry.ts +1 -0
  49. package/corpus/core/src/server/poll.ts +95 -57
  50. package/corpus/core/src/server/voice-providers-status.ts +19 -4
  51. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +38 -0
  52. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +1 -1
  53. package/corpus/templates/analytics/actions/ensure-native-v2-dashboards.ts +299 -0
  54. package/corpus/templates/analytics/actions/list-native-v2-dashboard-templates.ts +34 -0
  55. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +82 -0
  56. package/corpus/templates/analytics/app/components/layout/NewDashboardDialog.tsx +2 -2
  57. package/corpus/templates/analytics/app/hooks/use-dashboard-chat-context.ts +40 -34
  58. package/corpus/templates/analytics/app/hooks/use-user-pref.ts +3 -3
  59. package/corpus/templates/analytics/app/i18n-data.ts +40 -0
  60. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +18 -10
  61. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +14 -0
  62. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +1 -0
  63. package/corpus/templates/analytics/app/routes/chart.tsx +3 -0
  64. package/corpus/templates/analytics/changelog/2026-07-30-analytics-dashboards-now-expose-native-funnel-heatmap-callou.md +6 -0
  65. package/corpus/templates/analytics/changelog/2026-07-30-analytics-now-ships-reusable-native-v2-dashboard-manifests-w.md +6 -0
  66. package/corpus/templates/analytics/server/lib/dashboard-report-render.ts +81 -1
  67. package/corpus/templates/analytics/server/lib/native-v2-dashboards.ts +457 -0
  68. package/corpus/templates/analytics/server/lib/report-chart-svg.ts +73 -2
  69. package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -1
  70. package/corpus/templates/analytics/shared/dashboard-funnel.ts +83 -0
  71. package/corpus/templates/content/changelog/2026-07-30-long-running-delegated-requests-now-continue-reliably.md +6 -0
  72. package/corpus/templates/content/netlify.toml +3 -0
  73. package/corpus/templates/content/server/plugins/agent-chat.ts +1 -0
  74. package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +2 -1
  75. package/corpus/templates/slides/actions/patch-deck.ts +25 -1
  76. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +17 -4
  77. package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +9 -1
  78. package/corpus/templates/slides/app/components/layout/Layout.tsx +1 -1
  79. package/corpus/templates/slides/app/context/DeckContext.tsx +11 -3
  80. package/corpus/templates/slides/app/lib/sanitize-slide-html.ts +39 -11
  81. package/corpus/templates/slides/app/pages/Index.tsx +2 -2
  82. package/corpus/templates/slides/changelog/2026-07-30-slide-previews-keep-their-aspect-ratio-isolate-embedded-styl.md +6 -0
  83. package/corpus/templates/slides/changelog/2026-07-30-slides-no-longer-lose-decks-while-organization-access-is-loa.md +6 -0
  84. package/corpus/toolkit/CHANGELOG.md +8 -0
  85. package/corpus/toolkit/package.json +1 -1
  86. package/corpus/toolkit/src/composer/runtime-adapters.tsx +16 -11
  87. package/dist/a2a/activity.d.ts +22 -4
  88. package/dist/a2a/activity.d.ts.map +1 -1
  89. package/dist/a2a/activity.js +97 -11
  90. package/dist/a2a/activity.js.map +1 -1
  91. package/dist/a2a/index.d.ts +1 -1
  92. package/dist/a2a/index.d.ts.map +1 -1
  93. package/dist/a2a/index.js +1 -1
  94. package/dist/a2a/index.js.map +1 -1
  95. package/dist/action.d.ts.map +1 -1
  96. package/dist/action.js +41 -11
  97. package/dist/action.js.map +1 -1
  98. package/dist/agent/durable-background.d.ts +13 -8
  99. package/dist/agent/durable-background.d.ts.map +1 -1
  100. package/dist/agent/durable-background.js +36 -28
  101. package/dist/agent/durable-background.js.map +1 -1
  102. package/dist/agent/harness/background.d.ts.map +1 -1
  103. package/dist/agent/harness/background.js +12 -2
  104. package/dist/agent/harness/background.js.map +1 -1
  105. package/dist/agent/production-agent.d.ts.map +1 -1
  106. package/dist/agent/production-agent.js +195 -44
  107. package/dist/agent/production-agent.js.map +1 -1
  108. package/dist/agent/run-store.d.ts +2 -0
  109. package/dist/agent/run-store.d.ts.map +1 -1
  110. package/dist/agent/run-store.js +44 -3
  111. package/dist/agent/run-store.js.map +1 -1
  112. package/dist/application-state/handlers.d.ts +15 -0
  113. package/dist/application-state/handlers.d.ts.map +1 -1
  114. package/dist/application-state/handlers.js +42 -2
  115. package/dist/application-state/handlers.js.map +1 -1
  116. package/dist/application-state/index.d.ts +2 -2
  117. package/dist/application-state/index.d.ts.map +1 -1
  118. package/dist/application-state/index.js +2 -2
  119. package/dist/application-state/index.js.map +1 -1
  120. package/dist/application-state/store.d.ts +11 -0
  121. package/dist/application-state/store.d.ts.map +1 -1
  122. package/dist/application-state/store.js +23 -10
  123. package/dist/application-state/store.js.map +1 -1
  124. package/dist/audit/redact.d.ts +25 -2
  125. package/dist/audit/redact.d.ts.map +1 -1
  126. package/dist/audit/redact.js +85 -21
  127. package/dist/audit/redact.js.map +1 -1
  128. package/dist/client/AgentPanel.d.ts.map +1 -1
  129. package/dist/client/AgentPanel.js +2 -7
  130. package/dist/client/AgentPanel.js.map +1 -1
  131. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  132. package/dist/client/MultiTabAssistantChat.js +1 -1
  133. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  134. package/dist/client/RunStuckBanner.d.ts +11 -1
  135. package/dist/client/RunStuckBanner.d.ts.map +1 -1
  136. package/dist/client/RunStuckBanner.js +20 -7
  137. package/dist/client/RunStuckBanner.js.map +1 -1
  138. package/dist/client/agent-chat.d.ts.map +1 -1
  139. package/dist/client/agent-chat.js +4 -6
  140. package/dist/client/agent-chat.js.map +1 -1
  141. package/dist/client/application-state.d.ts +11 -0
  142. package/dist/client/application-state.d.ts.map +1 -1
  143. package/dist/client/application-state.js +87 -9
  144. package/dist/client/application-state.js.map +1 -1
  145. package/dist/client/dynamic-suggestions.d.ts.map +1 -1
  146. package/dist/client/dynamic-suggestions.js +4 -13
  147. package/dist/client/dynamic-suggestions.js.map +1 -1
  148. package/dist/client/guided-questions.d.ts.map +1 -1
  149. package/dist/client/guided-questions.js +6 -22
  150. package/dist/client/guided-questions.js.map +1 -1
  151. package/dist/collab/routes.d.ts +1 -1
  152. package/dist/collab/struct-routes.d.ts +1 -1
  153. package/dist/db/client.d.ts +57 -10
  154. package/dist/db/client.d.ts.map +1 -1
  155. package/dist/db/client.js +122 -31
  156. package/dist/db/client.js.map +1 -1
  157. package/dist/db/create-get-db.d.ts.map +1 -1
  158. package/dist/db/create-get-db.js +31 -7
  159. package/dist/db/create-get-db.js.map +1 -1
  160. package/dist/db/runtime-diagnostics.d.ts +1 -0
  161. package/dist/db/runtime-diagnostics.d.ts.map +1 -1
  162. package/dist/db/runtime-diagnostics.js +31 -6
  163. package/dist/db/runtime-diagnostics.js.map +1 -1
  164. package/dist/deploy/build.d.ts +5 -20
  165. package/dist/deploy/build.d.ts.map +1 -1
  166. package/dist/deploy/build.js +18 -30
  167. package/dist/deploy/build.js.map +1 -1
  168. package/dist/feature-flags/store.d.ts.map +1 -1
  169. package/dist/feature-flags/store.js +10 -5
  170. package/dist/feature-flags/store.js.map +1 -1
  171. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  172. package/dist/integrations/a2a-continuations-store.d.ts.map +1 -1
  173. package/dist/integrations/a2a-continuations-store.js +12 -0
  174. package/dist/integrations/a2a-continuations-store.js.map +1 -1
  175. package/dist/integrations/config-store.d.ts +1 -0
  176. package/dist/integrations/config-store.d.ts.map +1 -1
  177. package/dist/integrations/config-store.js +11 -0
  178. package/dist/integrations/config-store.js.map +1 -1
  179. package/dist/integrations/google-docs-poller.d.ts.map +1 -1
  180. package/dist/integrations/google-docs-poller.js +19 -2
  181. package/dist/integrations/google-docs-poller.js.map +1 -1
  182. package/dist/mcp/screen-memory-stdio.d.ts +7 -7
  183. package/dist/mcp/screen-memory-stdio.d.ts.map +1 -1
  184. package/dist/mcp-client/routes.d.ts.map +1 -1
  185. package/dist/mcp-client/routes.js +30 -2
  186. package/dist/mcp-client/routes.js.map +1 -1
  187. package/dist/notifications/routes.d.ts +3 -3
  188. package/dist/observability/routes.d.ts +1 -1
  189. package/dist/onboarding/plugin.d.ts.map +1 -1
  190. package/dist/onboarding/plugin.js +12 -8
  191. package/dist/onboarding/plugin.js.map +1 -1
  192. package/dist/org/accept-pending.d.ts.map +1 -1
  193. package/dist/org/accept-pending.js +2 -0
  194. package/dist/org/accept-pending.js.map +1 -1
  195. package/dist/org/auto-join-domain.d.ts.map +1 -1
  196. package/dist/org/auto-join-domain.js +2 -0
  197. package/dist/org/auto-join-domain.js.map +1 -1
  198. package/dist/org/context.d.ts.map +1 -1
  199. package/dist/org/context.js +29 -9
  200. package/dist/org/context.js.map +1 -1
  201. package/dist/org/handlers.d.ts.map +1 -1
  202. package/dist/org/handlers.js +5 -0
  203. package/dist/org/handlers.js.map +1 -1
  204. package/dist/org/request-org-cache.d.ts +16 -0
  205. package/dist/org/request-org-cache.d.ts.map +1 -0
  206. package/dist/org/request-org-cache.js +62 -0
  207. package/dist/org/request-org-cache.js.map +1 -0
  208. package/dist/resources/store.d.ts.map +1 -1
  209. package/dist/resources/store.js +11 -9
  210. package/dist/resources/store.js.map +1 -1
  211. package/dist/scripts/runner.d.ts.map +1 -1
  212. package/dist/scripts/runner.js +3 -3
  213. package/dist/scripts/runner.js.map +1 -1
  214. package/dist/secrets/storage.d.ts.map +1 -1
  215. package/dist/secrets/storage.js +82 -5
  216. package/dist/secrets/storage.js.map +1 -1
  217. package/dist/server/action-change.d.ts +20 -0
  218. package/dist/server/action-change.d.ts.map +1 -1
  219. package/dist/server/action-change.js +29 -0
  220. package/dist/server/action-change.js.map +1 -1
  221. package/dist/server/action-routes.d.ts.map +1 -1
  222. package/dist/server/action-routes.js +7 -8
  223. package/dist/server/action-routes.js.map +1 -1
  224. package/dist/server/agent-teams.d.ts.map +1 -1
  225. package/dist/server/agent-teams.js +10 -2
  226. package/dist/server/agent-teams.js.map +1 -1
  227. package/dist/server/better-auth-instance.d.ts.map +1 -1
  228. package/dist/server/better-auth-instance.js +31 -14
  229. package/dist/server/better-auth-instance.js.map +1 -1
  230. package/dist/server/core-routes-plugin.d.ts +1 -0
  231. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  232. package/dist/server/core-routes-plugin.js +18 -4
  233. package/dist/server/core-routes-plugin.js.map +1 -1
  234. package/dist/server/credential-provider.d.ts +16 -0
  235. package/dist/server/credential-provider.d.ts.map +1 -1
  236. package/dist/server/credential-provider.js +49 -13
  237. package/dist/server/credential-provider.js.map +1 -1
  238. package/dist/server/http-response-telemetry.d.ts.map +1 -1
  239. package/dist/server/http-response-telemetry.js +1 -0
  240. package/dist/server/http-response-telemetry.js.map +1 -1
  241. package/dist/server/poll.d.ts +6 -0
  242. package/dist/server/poll.d.ts.map +1 -1
  243. package/dist/server/poll.js +84 -47
  244. package/dist/server/poll.js.map +1 -1
  245. package/dist/server/voice-providers-status.d.ts.map +1 -1
  246. package/dist/server/voice-providers-status.js +12 -3
  247. package/dist/server/voice-providers-status.js.map +1 -1
  248. package/docs/content/durable-background-runs.mdx +15 -6
  249. package/docs/design/durable-agent-runs.md +15 -11
  250. package/package.json +2 -2
  251. package/src/a2a/activity.ts +127 -10
  252. package/src/a2a/index.ts +3 -0
  253. package/src/action.ts +52 -11
  254. package/src/agent/durable-background.ts +38 -28
  255. package/src/agent/harness/background.ts +12 -2
  256. package/src/agent/production-agent.ts +210 -43
  257. package/src/agent/run-store.ts +45 -3
  258. package/src/application-state/handlers.ts +45 -0
  259. package/src/application-state/index.ts +3 -0
  260. package/src/application-state/store.ts +28 -11
  261. package/src/audit/redact.ts +104 -18
  262. package/src/client/AgentPanel.tsx +2 -7
  263. package/src/client/MultiTabAssistantChat.tsx +3 -0
  264. package/src/client/RunStuckBanner.tsx +29 -6
  265. package/src/client/agent-chat.ts +4 -9
  266. package/src/client/application-state.ts +115 -12
  267. package/src/client/dynamic-suggestions.ts +4 -12
  268. package/src/client/guided-questions.tsx +12 -23
  269. package/src/db/client.ts +148 -28
  270. package/src/db/create-get-db.ts +39 -6
  271. package/src/db/runtime-diagnostics.ts +41 -6
  272. package/src/deploy/build.ts +26 -33
  273. package/src/feature-flags/store.ts +10 -5
  274. package/src/integrations/a2a-continuations-store.ts +11 -0
  275. package/src/integrations/config-store.ts +13 -0
  276. package/src/integrations/google-docs-poller.ts +26 -2
  277. package/src/mcp-client/routes.ts +33 -2
  278. package/src/onboarding/plugin.ts +31 -25
  279. package/src/org/accept-pending.ts +2 -0
  280. package/src/org/auto-join-domain.ts +2 -0
  281. package/src/org/context.ts +35 -10
  282. package/src/org/handlers.ts +6 -0
  283. package/src/org/request-org-cache.ts +71 -0
  284. package/src/resources/store.ts +10 -9
  285. package/src/scripts/runner.ts +6 -3
  286. package/src/secrets/storage.ts +97 -5
  287. package/src/server/action-change.ts +33 -0
  288. package/src/server/action-routes.ts +11 -9
  289. package/src/server/agent-teams.ts +10 -2
  290. package/src/server/better-auth-instance.ts +39 -12
  291. package/src/server/core-routes-plugin.ts +19 -2
  292. package/src/server/credential-provider.ts +57 -14
  293. package/src/server/http-response-telemetry.ts +1 -0
  294. package/src/server/poll.ts +95 -57
  295. package/src/server/voice-providers-status.ts +19 -4
@@ -1,6 +1,6 @@
1
1
  import { AsyncLocalStorage } from "node:async_hooks";
2
2
  import { drizzle as drizzleD1 } from "drizzle-orm/d1";
3
- import { getDialect, getCloudflareD1Binding, getDatabaseUrl, getDatabaseAuthToken, isLocalSqliteUrl, isPgliteUrl, isConnectionError, getPgliteClient, loadPgliteDrizzle, prepareLocalSqliteUrl, sqliteFilenameFromUrl, pgPoolOptions, neonPoolMax, attachNeonPoolErrorLogger, withDbTimeout, retryOnConnectionError, dbOpTimeoutMs, } from "./client.js";
3
+ import { getDialect, getCloudflareD1Binding, getDatabaseUrl, getDatabaseAuthToken, isLocalSqliteUrl, isPgliteUrl, isConnectionError, getPgliteClient, loadPgliteDrizzle, prepareLocalSqliteUrl, sqliteFilenameFromUrl, pgPoolOptions, neonPoolMax, attachNeonPoolErrorLogger, withDbTimeout, retryOnConnectionError, dbOpTimeoutMs, sharedDbPool, onSharedDbPoolsClosed, onSharedDbPoolReplaced, } from "./client.js";
4
4
  // Lazy driver loaders — cached promises so dynamic import only runs once.
5
5
  let _pgDrizzle;
6
6
  function getPgDrizzle() {
@@ -358,6 +358,27 @@ const _EXTRACT_TX = Symbol("extract-tx");
358
358
  export function createGetDb(schema) {
359
359
  let _db;
360
360
  let _dbReady;
361
+ // The Drizzle instance is bound to a shared pool, so a `closeDbExec()` (test
362
+ // teardown, script cleanup) must invalidate it rather than leave this store
363
+ // issuing queries on a closed pool. Registered lazily from the pooled
364
+ // branches only — `createGetDb` is called at module scope by every store, and
365
+ // core's specs widely mock `db/client.js`.
366
+ let _closeHookRegistered = false;
367
+ function resetOnPoolClose(driver, url) {
368
+ if (_closeHookRegistered)
369
+ return;
370
+ _closeHookRegistered = true;
371
+ onSharedDbPoolsClosed(() => {
372
+ _db = undefined;
373
+ _dbReady = undefined;
374
+ });
375
+ if (driver && url) {
376
+ onSharedDbPoolReplaced(driver, url, () => {
377
+ _db = undefined;
378
+ _dbReady = undefined;
379
+ });
380
+ }
381
+ }
361
382
  function startInit() {
362
383
  if (_dbReady)
363
384
  return _dbReady;
@@ -382,10 +403,11 @@ export function createGetDb(schema) {
382
403
  if (dialect === "postgres") {
383
404
  if (isNeonUrl(url)) {
384
405
  _dbReady = getNeonServerlessDrizzle().then(({ drizzle, Pool }) => {
385
- const rawPool = new Pool({
386
- connectionString: url,
387
- max: neonPoolMax(),
388
- });
406
+ // Shared with the DbExec singleton, Better Auth, and every other
407
+ // `createGetDb` store: one connect per process instead of one per
408
+ // schema module. See `sharedDbPool` in client.ts.
409
+ resetOnPoolClose("neon", url);
410
+ const rawPool = sharedDbPool("neon", url, () => new Pool({ connectionString: url, max: neonPoolMax() }));
389
411
  attachNeonPoolErrorLogger(rawPool);
390
412
  // Wrap the pool with the resilience layer so Drizzle queries get the
391
413
  // same withDbTimeout + retryOnConnectionError protection as the raw
@@ -399,8 +421,10 @@ export function createGetDb(schema) {
399
421
  _dbReady = getPgDrizzle().then(({ drizzle, postgres }) => {
400
422
  // pgPoolOptions caps the pool to a small size on serverless so
401
423
  // concurrent frozen instances don't exhaust Neon/Postgres'
402
- // connection limit ("Max client connections reached").
403
- const client = postgres(url, pgPoolOptions(url));
424
+ // connection limit ("Max client connections reached"). Shared across
425
+ // consumers see `sharedDbPool` in client.ts.
426
+ resetOnPoolClose("postgres-js", url);
427
+ const client = sharedDbPool("postgres-js", url, () => postgres(url, pgPoolOptions(url)));
404
428
  _db = drizzle(buildResilientPostgresJsClient(client), { schema });
405
429
  });
406
430
  }
@@ -1 +1 @@
1
- {"version":3,"file":"create-get-db.js","sourceRoot":"","sources":["../../src/db/create-get-db.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\n\nimport { drizzle as drizzleD1 } from \"drizzle-orm/d1\";\nimport type { LibSQLDatabase } from \"drizzle-orm/libsql\";\n\nimport {\n getDialect,\n getCloudflareD1Binding,\n getDatabaseUrl,\n getDatabaseAuthToken,\n isLocalSqliteUrl,\n isPgliteUrl,\n isConnectionError,\n getPgliteClient,\n loadPgliteDrizzle,\n prepareLocalSqliteUrl,\n sqliteFilenameFromUrl,\n pgPoolOptions,\n neonPoolMax,\n attachNeonPoolErrorLogger,\n withDbTimeout,\n retryOnConnectionError,\n dbOpTimeoutMs,\n} from \"./client.js\";\n\n// Lazy driver loaders — cached promises so dynamic import only runs once.\nlet _pgDrizzle: Promise<{ drizzle: any; postgres: any }> | undefined;\nfunction getPgDrizzle() {\n if (!_pgDrizzle) {\n _pgDrizzle = Promise.all([\n import(\"drizzle-orm/postgres-js\"),\n import(\"postgres\"),\n ]).then(([drizzleMod, pgMod]) => ({\n drizzle: drizzleMod.drizzle,\n postgres: pgMod.default,\n }));\n }\n return _pgDrizzle;\n}\n\nlet _neonServerlessDrizzle: Promise<{ drizzle: any; Pool: any }> | undefined;\nfunction getNeonServerlessDrizzle() {\n if (!_neonServerlessDrizzle) {\n _neonServerlessDrizzle = Promise.all([\n import(\"drizzle-orm/neon-serverless\"),\n import(\"@neondatabase/serverless\"),\n ]).then(([drizzleMod, neonMod]) => ({\n drizzle: drizzleMod.drizzle,\n Pool: neonMod.Pool,\n }));\n }\n return _neonServerlessDrizzle;\n}\n\n/**\n * Returns true when a SQL string starts with a SELECT-class verb.\n * Used by the Neon resilience wrapper to decide retry safety:\n * - reads (SELECT) → retryable on any connection-class error\n * - writes (INSERT/UPDATE/DELETE/…) → only retryable on errors that\n * provably occurred BEFORE the statement was sent (e.g. an acquire /\n * connect timeout). Post-send write failures must propagate to the caller\n * to avoid double-execution.\n */\nexport function isSqlRead(sql: string): boolean {\n return /^\\s*(SELECT|WITH\\s)/i.test(sql);\n}\n\n/**\n * Wraps a @neondatabase/serverless Pool so every query goes through\n * the same withDbTimeout + retryOnConnectionError resilience that the\n * raw DbExec path in client.ts uses. This protects Drizzle queries\n * (which bypass DbExec) from the frozen-WebSocket failure mode documented\n * in client.ts (~lines 378–408).\n *\n * Retry-safety rule (prevents double-execution on writes):\n * - Reads (SELECT / WITH …): retry freely on any connection-class error.\n * - Writes: only retry when the error occurred during connection acquire\n * (i.e. withDbTimeout \"connect\" timed out before the statement was ever\n * sent). Post-send failures on writes are rethrown immediately.\n *\n * Transactions: we do NOT wrap individual queries inside a drizzle\n * transaction — drizzle-neon-serverless manages the session itself, so\n * interposing a per-query client acquire/release would break the sticky\n * connection the transaction needs. The pool-level error logger still fires\n * on idle-client drops inside transactions.\n */\nexport function buildResilientNeonPool<\n T extends {\n connect(): Promise<any>;\n query(...args: any[]): Promise<any>;\n end(): Promise<void>;\n on(event: string, listener: (...args: any[]) => void): unknown;\n },\n>(pool: T): T {\n // Preserve all original pool methods and properties; only override `connect`\n // and `query` at the Pool level (used by drizzle's neon-serverless adapter\n // when it calls pool.query() directly, e.g. outside a transaction).\n const resilientQuery = async (\n sql: string | { text?: unknown },\n args?: any[],\n ): Promise<{ rows: unknown[]; rowCount?: number }> => {\n const sqlText =\n typeof sql === \"string\"\n ? sql\n : typeof sql?.text === \"string\"\n ? sql.text\n : \"\";\n const isRead = isSqlRead(sqlText);\n\n const runAttempt = async (): Promise<{\n rows: unknown[];\n rowCount?: number;\n }> => {\n // Bound the pool.connect() acquire — a frozen Neon WebSocket stalls here\n // before the query ever starts, so a query-level timeout alone won't help.\n let acquireTimedOut = false;\n const client = await withDbTimeout(\n \"connect\",\n () =>\n pool.connect().then((c: any) => {\n // If we already gave up on this slot, immediately release it so\n // the scarce pool connection isn't leaked.\n if (acquireTimedOut) c.release();\n return c;\n }),\n dbOpTimeoutMs(),\n () => {\n acquireTimedOut = true;\n },\n );\n\n let released = false;\n const releaseClient = (err?: Error | boolean) => {\n if (released) return;\n released = true;\n client.release(err);\n };\n\n try {\n const result = await withDbTimeout(\n \"query\",\n () =>\n (args === undefined\n ? client.query(sql)\n : client.query(sql, args)) as Promise<{\n rows: unknown[];\n rowCount?: number;\n }>,\n dbOpTimeoutMs(),\n () => releaseClient(true),\n );\n releaseClient();\n return result;\n } catch (err) {\n releaseClient(isConnectionError(err) ? true : undefined);\n throw err;\n }\n };\n\n if (isRead) {\n // Reads: retry on any connection-class error (safe — no side effects).\n return retryOnConnectionError(runAttempt);\n }\n\n // Writes: attempt once. If the acquire itself times out (error occurs\n // before the statement was sent), that produces a CONNECT_TIMEOUT which\n // isConnectionError() recognises → retry is safe. Any error that surfaces\n // AFTER the statement was sent must propagate immediately to avoid\n // double-execution.\n try {\n return await runAttempt();\n } catch (err) {\n // acquire-timeout fires before the statement → safe to retry once.\n if (isConnectionError(err) && (err as any)?.code === \"CONNECT_TIMEOUT\") {\n return runAttempt();\n }\n throw err;\n }\n };\n\n // Return a proxy so every pool property/method is forwarded as-is, but\n // pool.query() goes through the resilient wrapper. drizzle-neon-serverless\n // calls pool.connect() for transactions and pool.query() for simple queries.\n return new Proxy(pool, {\n get(target, prop) {\n if (prop === \"query\") return resilientQuery;\n const val = (target as any)[prop];\n return typeof val === \"function\" ? val.bind(target) : val;\n },\n }) as T;\n}\n\n/**\n * Wraps a postgres.js client so Drizzle queries on the non-Neon Postgres\n * path get the same withDbTimeout + retryOnConnectionError protection as\n * every other Postgres path (raw DbExec postgres.js, raw DbExec Neon, and\n * the Drizzle Neon pool above). Without this, one hung query on a BYO\n * Postgres deployment stalls its request forever.\n *\n * Drizzle's postgres-js session only calls `client.unsafe(query, params)` —\n * awaited directly for row-object results or via `.values()` for row-array\n * results — plus `client.begin(...)` for transactions. We interpose on\n * `unsafe` with a lazy thenable that re-issues the query per retry attempt,\n * and leave transactions unwrapped (same rule as the Neon wrapper: the\n * driver manages the sticky connection inside `begin`).\n *\n * Retry-safety mirrors buildResilientNeonPool: reads retry freely on\n * connection-class errors; writes retry only on CONNECT_TIMEOUT (postgres.js\n * raises it before the statement is ever sent), so writes can't\n * double-execute.\n */\nexport function buildResilientPostgresJsClient<\n T extends {\n unsafe(query: string, params?: any[], options?: any): any;\n },\n>(client: T): T {\n const wrapUnsafe = (query: string, params?: any[], options?: any) => {\n const isRead = isSqlRead(query);\n\n const runAttempt = (mode: \"rows\" | \"values\") => async (): Promise<any> => {\n const pending = client.unsafe(query, params, options);\n return withDbTimeout(\n \"query\",\n async () => (mode === \"values\" ? pending.values() : pending),\n dbOpTimeoutMs(),\n () => {\n // Best-effort cancel so the timed-out statement doesn't keep\n // occupying one of the (small, serverless-capped) pool slots.\n try {\n pending.cancel?.();\n } catch {\n // ignore — cancellation is advisory\n }\n },\n );\n };\n\n const execute = async (mode: \"rows\" | \"values\"): Promise<any> => {\n if (isRead) return retryOnConnectionError(runAttempt(mode));\n try {\n return await runAttempt(mode)();\n } catch (err) {\n // Connect timeout fires before the statement is sent → one retry is\n // safe even for writes.\n if (\n isConnectionError(err) &&\n (err as any)?.code === \"CONNECT_TIMEOUT\"\n ) {\n return runAttempt(mode)();\n }\n throw err;\n }\n };\n\n // Lazy thenable mirroring the slice of postgres.js's PendingQuery\n // surface that Drizzle uses: `await q` or `await q.values()`.\n return {\n then: (onFulfilled?: any, onRejected?: any) =>\n execute(\"rows\").then(onFulfilled, onRejected),\n catch: (onRejected?: any) => execute(\"rows\").catch(onRejected),\n finally: (onFinally?: any) => execute(\"rows\").finally(onFinally),\n values: () => execute(\"values\"),\n };\n };\n\n return new Proxy(client as any, {\n get(target, prop) {\n if (prop === \"unsafe\") return wrapUnsafe;\n const val = target[prop];\n return typeof val === \"function\" ? val.bind(target) : val;\n },\n }) as T;\n}\n\n/**\n * Neon's pooler endpoints cold-start in 5–10s. Serverless environments\n * (Netlify Functions, Vercel Edge, CF Workers) have short cold-start\n * budgets of their own, and `postgres-js` opens a raw TCP connection on\n * port 5432 that can't negotiate around Neon's wake-up window — every\n * request after an idle period 502s. `@neondatabase/serverless` rides\n * over WebSockets (HTTP/443 upgrade) and handles Neon wake-up\n * transparently, supports transactions, and works in every serverless\n * runtime we deploy to, so we prefer it whenever the URL points at Neon.\n */\nexport function isNeonUrl(url: string): boolean {\n // Must match neon.tech followed by port/path/query/end — include `?` so\n // URLs like `postgres://…@ep.neon.tech?sslmode=require` (no explicit port\n // or path) still route through the serverless driver.\n return /\\.neon\\.tech([:/?]|$)/.test(url);\n}\n\nlet _libsqlWebDrizzle: Promise<{ drizzle: any }> | undefined;\nfunction getLibsqlWebDrizzle() {\n if (!_libsqlWebDrizzle) {\n _libsqlWebDrizzle = import(\"drizzle-orm/libsql/web\").then((mod) => ({\n drizzle: mod.drizzle,\n }));\n }\n return _libsqlWebDrizzle;\n}\n\nlet _betterSqliteDrizzle: Promise<{ drizzle: any; Database: any }> | undefined;\nfunction getBetterSqliteDrizzle() {\n if (!_betterSqliteDrizzle) {\n _betterSqliteDrizzle = Promise.all([\n import(\"drizzle-orm/better-sqlite3\"),\n import(\"better-sqlite3\"),\n ]).then(([drizzleMod, sqliteMod]) => ({\n drizzle: drizzleMod.drizzle,\n Database: sqliteMod.default,\n }));\n }\n return _betterSqliteDrizzle;\n}\n\n/**\n * Patch a drizzle-orm/better-sqlite3 instance so that db.transaction(async …)\n * works. The native better-sqlite3 Transaction wrapper is sync-only — passing\n * an async callback throws \"Transaction function cannot return a promise\".\n *\n * This wrapper bypasses the native path by issuing raw SQL control statements\n * on the single better-sqlite3 connection, which is safe because:\n * - better-sqlite3 is single-connection (no concurrency inside one process)\n * - the framework serialises all async work through one Database instance\n *\n * Nesting: if a transaction is already open (sqlite.inTransaction === true),\n * SAVEPOINT / RELEASE / ROLLBACK TO is used instead of BEGIN / COMMIT /\n * ROLLBACK, matching drizzle's own BetterSQLiteTransaction.transaction().\n *\n * The patched transaction also patches the tx object it passes to the callback\n * so that nested async calls (tx.transaction(async …)) work recursively.\n */\n/** @internal exported for the async-tx concurrency spec */\nexport function patchBetterSqliteTransactions<\n DB extends { transaction: (...args: any[]) => any; session: any },\n>(db: DB, sqlite: { inTransaction: boolean; exec: (sql: string) => void }): DB {\n let savepointSeq = 0;\n // Concurrent TOP-LEVEL async transactions on the single better-sqlite3\n // connection must not interleave: a second transaction starting while the\n // first is open would see `inTransaction` and open a savepoint INSIDE the\n // first transaction, which then commits out from under it (\"no such\n // savepoint\"). Serialize top-level transactions through a promise chain;\n // genuine same-task nesting (tx.transaction or db.transaction inside an\n // open callback) is detected via AsyncLocalStorage and keeps the direct\n // savepoint path so it cannot deadlock on the queue.\n const txContext = new AsyncLocalStorage<boolean>();\n let txChain: Promise<unknown> = Promise.resolve();\n\n function makeAsyncTransaction(\n originalTransaction: (...args: any[]) => any,\n ): (...args: any[]) => Promise<unknown> {\n async function runTransactionBody(\n cb: (tx: unknown) => unknown,\n ): Promise<unknown> {\n // Extract the drizzle tx proxy synchronously — call the original with a\n // stub that captures the tx arg then immediately throws a sentinel so\n // better-sqlite3's native wrapper rolls back the stub and re-throws.\n // The sentinel is caught here and never propagates further.\n let capturedTx: unknown;\n try {\n originalTransaction((tx: unknown) => {\n capturedTx = tx;\n throw _EXTRACT_TX;\n });\n } catch (e) {\n if (e !== _EXTRACT_TX) throw e;\n }\n\n // Recursively patch the nested tx so tx.transaction(async …) also works.\n const tx = capturedTx as { transaction: (...a: any[]) => any };\n if (tx && typeof tx.transaction === \"function\") {\n tx.transaction = makeAsyncTransaction(tx.transaction.bind(tx));\n }\n\n const nested = sqlite.inTransaction;\n if (nested) {\n const sp = `sp_async_${++savepointSeq}`;\n sqlite.exec(`SAVEPOINT ${sp}`);\n let released = false;\n try {\n const result = await cb(tx);\n sqlite.exec(`RELEASE SAVEPOINT ${sp}`);\n released = true;\n return result;\n } catch (err) {\n if (!released) {\n try {\n sqlite.exec(`ROLLBACK TO SAVEPOINT ${sp}`);\n sqlite.exec(`RELEASE SAVEPOINT ${sp}`);\n } catch {\n /* ignore: connection may already be in an error state */\n }\n }\n throw err;\n }\n }\n\n // Top-level: BEGIN IMMEDIATE … COMMIT / ROLLBACK.\n sqlite.exec(\"BEGIN IMMEDIATE\");\n let committed = false;\n try {\n const result = await cb(tx);\n sqlite.exec(\"COMMIT\");\n committed = true;\n return result;\n } catch (err) {\n if (!committed) {\n try {\n sqlite.exec(\"ROLLBACK\");\n } catch {\n /* swallow: connection may already be unusable */\n }\n }\n throw err;\n }\n }\n\n return function asyncTransaction(\n cb: (tx: unknown) => unknown,\n ): Promise<unknown> {\n if (txContext.getStore()) {\n // Same-task nesting: run directly (savepoint path inside the open\n // transaction). Queueing here would deadlock behind the outer tx.\n return runTransactionBody(cb);\n }\n const run = () => txContext.run(true, () => runTransactionBody(cb));\n const next = txChain.then(run, run);\n txChain = next.then(\n () => undefined,\n () => undefined,\n );\n return next;\n };\n }\n\n db.transaction = makeAsyncTransaction(db.transaction.bind(db));\n return db;\n}\n\n/** Sentinel thrown inside the tx-extraction stub — never escapes the catch. */\nconst _EXTRACT_TX = Symbol(\"extract-tx\");\n\nexport function createGetDb<T extends Record<string, unknown>>(schema: T) {\n let _db: any;\n let _dbReady: Promise<any> | undefined;\n\n function startInit(): Promise<any> {\n if (_dbReady) return _dbReady;\n\n const url = getDatabaseUrl(\"file:./data/app.db\");\n const dialect = getDialect();\n\n // D1 only if dialect detected it (DATABASE_URL takes priority)\n if (dialect === \"d1\") {\n const d1 = getCloudflareD1Binding() as\n | Parameters<typeof drizzleD1>[0]\n | undefined;\n if (d1) {\n _db = drizzleD1(d1, { schema }) as unknown as LibSQLDatabase<T>;\n _dbReady = Promise.resolve(_db);\n return _dbReady;\n }\n }\n\n if (isPgliteUrl(url)) {\n _dbReady = loadPgliteDrizzle().then(async ({ drizzle }) => {\n const client = await getPgliteClient(url);\n _db = drizzle({ client, schema });\n });\n return _dbReady;\n }\n\n if (dialect === \"postgres\") {\n if (isNeonUrl(url)) {\n _dbReady = getNeonServerlessDrizzle().then(({ drizzle, Pool }) => {\n const rawPool = new Pool({\n connectionString: url,\n max: neonPoolMax(),\n });\n attachNeonPoolErrorLogger(rawPool);\n // Wrap the pool with the resilience layer so Drizzle queries get the\n // same withDbTimeout + retryOnConnectionError protection as the raw\n // DbExec path in client.ts. Reads retry freely; writes only retry on\n // acquire-timeout (pre-send) errors to avoid double-execution.\n const pool = buildResilientNeonPool(rawPool);\n _db = drizzle(pool, { schema });\n });\n } else {\n _dbReady = getPgDrizzle().then(({ drizzle, postgres }) => {\n // pgPoolOptions caps the pool to a small size on serverless so\n // concurrent frozen instances don't exhaust Neon/Postgres'\n // connection limit (\"Max client connections reached\").\n const client = postgres(url, pgPoolOptions(url));\n _db = drizzle(buildResilientPostgresJsClient(client), { schema });\n });\n }\n } else if (isLocalSqliteUrl(url)) {\n _dbReady = Promise.all([\n prepareLocalSqliteUrl(url.startsWith(\"file:\") ? url : `file:${url}`),\n getBetterSqliteDrizzle(),\n ]).then(([sqliteUrl, { drizzle, Database }]) => {\n const sqlite = new Database(sqliteFilenameFromUrl(sqliteUrl));\n // Wait up to 10s for a concurrent writer instead of failing fast\n // with SQLITE_BUSY — mirrors the raw DbExec SQLite path in client.ts.\n sqlite.pragma(\"busy_timeout = 10000\");\n sqlite.pragma(\"journal_mode = WAL\");\n const db = drizzle(sqlite, { schema });\n _db = patchBetterSqliteTransactions(db, sqlite);\n });\n } else {\n _dbReady = getLibsqlWebDrizzle().then(({ drizzle }) => {\n _db = drizzle({\n connection: { url, authToken: getDatabaseAuthToken() },\n schema,\n });\n });\n }\n return _dbReady;\n }\n\n /**\n * Create a lazy proxy that records property accesses and method calls,\n * then replays them on the real DB once init completes. Supports\n * Drizzle's chained API: db.select().from(table).where(...).\n *\n * When `.then()` is called (i.e. the chain is awaited), the proxy\n * awaits _dbReady and replays the recorded chain on the real _db.\n */\n function createLazyProxy(\n ready: Promise<any>,\n chain: Array<{ prop: string | symbol; args?: any[] }>,\n ): any {\n return new Proxy(function () {} as any, {\n get(_target, prop) {\n // When awaited, replay the chain on the real db\n if (prop === \"then\" || prop === \"catch\" || prop === \"finally\") {\n const promise = ready.then(() => {\n let result: any = _db;\n for (const step of chain) {\n const val = result[step.prop];\n result =\n typeof val === \"function\" ? val.apply(result, step.args) : val;\n }\n return result;\n });\n return (promise as any)[prop].bind(promise);\n }\n // Symbol.toStringTag, Symbol.iterator, etc. — return another proxy\n // Property access (e.g. db.query) — record and return another proxy\n return createLazyProxy(ready, [...chain, { prop }]);\n },\n apply(_target, _thisArg, args) {\n // Method call (e.g. .from(table)) — record args and return another proxy\n if (chain.length === 0) return createLazyProxy(ready, []);\n const last = chain[chain.length - 1];\n const newChain = chain.slice(0, -1);\n newChain.push({ prop: last.prop, args });\n return createLazyProxy(ready, newChain);\n },\n });\n }\n\n /**\n * Get the Drizzle DB instance. Kicks off lazy init on first call.\n * If the async init hasn't completed yet, returns a lazy Proxy that\n * records the Drizzle chain (select/from/where/etc.) and replays it\n * once the DB driver finishes loading. Since callers always `await`\n * the final result, the proxy is transparent.\n */\n function getDb(): LibSQLDatabase<T> {\n if (_db) return _db;\n startInit();\n if (_db) return _db;\n\n return createLazyProxy(_dbReady!, []) as LibSQLDatabase<T>;\n }\n\n return getDb;\n}\n"]}
1
+ {"version":3,"file":"create-get-db.js","sourceRoot":"","sources":["../../src/db/create-get-db.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\n\nimport { drizzle as drizzleD1 } from \"drizzle-orm/d1\";\nimport type { LibSQLDatabase } from \"drizzle-orm/libsql\";\n\nimport {\n getDialect,\n getCloudflareD1Binding,\n getDatabaseUrl,\n getDatabaseAuthToken,\n isLocalSqliteUrl,\n isPgliteUrl,\n isConnectionError,\n getPgliteClient,\n loadPgliteDrizzle,\n prepareLocalSqliteUrl,\n sqliteFilenameFromUrl,\n pgPoolOptions,\n neonPoolMax,\n attachNeonPoolErrorLogger,\n withDbTimeout,\n retryOnConnectionError,\n dbOpTimeoutMs,\n sharedDbPool,\n onSharedDbPoolsClosed,\n onSharedDbPoolReplaced,\n} from \"./client.js\";\n\n// Lazy driver loaders — cached promises so dynamic import only runs once.\nlet _pgDrizzle: Promise<{ drizzle: any; postgres: any }> | undefined;\nfunction getPgDrizzle() {\n if (!_pgDrizzle) {\n _pgDrizzle = Promise.all([\n import(\"drizzle-orm/postgres-js\"),\n import(\"postgres\"),\n ]).then(([drizzleMod, pgMod]) => ({\n drizzle: drizzleMod.drizzle,\n postgres: pgMod.default,\n }));\n }\n return _pgDrizzle;\n}\n\nlet _neonServerlessDrizzle: Promise<{ drizzle: any; Pool: any }> | undefined;\nfunction getNeonServerlessDrizzle() {\n if (!_neonServerlessDrizzle) {\n _neonServerlessDrizzle = Promise.all([\n import(\"drizzle-orm/neon-serverless\"),\n import(\"@neondatabase/serverless\"),\n ]).then(([drizzleMod, neonMod]) => ({\n drizzle: drizzleMod.drizzle,\n Pool: neonMod.Pool,\n }));\n }\n return _neonServerlessDrizzle;\n}\n\n/**\n * Returns true when a SQL string starts with a SELECT-class verb.\n * Used by the Neon resilience wrapper to decide retry safety:\n * - reads (SELECT) → retryable on any connection-class error\n * - writes (INSERT/UPDATE/DELETE/…) → only retryable on errors that\n * provably occurred BEFORE the statement was sent (e.g. an acquire /\n * connect timeout). Post-send write failures must propagate to the caller\n * to avoid double-execution.\n */\nexport function isSqlRead(sql: string): boolean {\n return /^\\s*(SELECT|WITH\\s)/i.test(sql);\n}\n\n/**\n * Wraps a @neondatabase/serverless Pool so every query goes through\n * the same withDbTimeout + retryOnConnectionError resilience that the\n * raw DbExec path in client.ts uses. This protects Drizzle queries\n * (which bypass DbExec) from the frozen-WebSocket failure mode documented\n * in client.ts (~lines 378–408).\n *\n * Retry-safety rule (prevents double-execution on writes):\n * - Reads (SELECT / WITH …): retry freely on any connection-class error.\n * - Writes: only retry when the error occurred during connection acquire\n * (i.e. withDbTimeout \"connect\" timed out before the statement was ever\n * sent). Post-send failures on writes are rethrown immediately.\n *\n * Transactions: we do NOT wrap individual queries inside a drizzle\n * transaction — drizzle-neon-serverless manages the session itself, so\n * interposing a per-query client acquire/release would break the sticky\n * connection the transaction needs. The pool-level error logger still fires\n * on idle-client drops inside transactions.\n */\nexport function buildResilientNeonPool<\n T extends {\n connect(): Promise<any>;\n query(...args: any[]): Promise<any>;\n end(): Promise<void>;\n on(event: string, listener: (...args: any[]) => void): unknown;\n },\n>(pool: T): T {\n // Preserve all original pool methods and properties; only override `connect`\n // and `query` at the Pool level (used by drizzle's neon-serverless adapter\n // when it calls pool.query() directly, e.g. outside a transaction).\n const resilientQuery = async (\n sql: string | { text?: unknown },\n args?: any[],\n ): Promise<{ rows: unknown[]; rowCount?: number }> => {\n const sqlText =\n typeof sql === \"string\"\n ? sql\n : typeof sql?.text === \"string\"\n ? sql.text\n : \"\";\n const isRead = isSqlRead(sqlText);\n\n const runAttempt = async (): Promise<{\n rows: unknown[];\n rowCount?: number;\n }> => {\n // Bound the pool.connect() acquire — a frozen Neon WebSocket stalls here\n // before the query ever starts, so a query-level timeout alone won't help.\n let acquireTimedOut = false;\n const client = await withDbTimeout(\n \"connect\",\n () =>\n pool.connect().then((c: any) => {\n // If we already gave up on this slot, immediately release it so\n // the scarce pool connection isn't leaked.\n if (acquireTimedOut) c.release();\n return c;\n }),\n dbOpTimeoutMs(),\n () => {\n acquireTimedOut = true;\n },\n );\n\n let released = false;\n const releaseClient = (err?: Error | boolean) => {\n if (released) return;\n released = true;\n client.release(err);\n };\n\n try {\n const result = await withDbTimeout(\n \"query\",\n () =>\n (args === undefined\n ? client.query(sql)\n : client.query(sql, args)) as Promise<{\n rows: unknown[];\n rowCount?: number;\n }>,\n dbOpTimeoutMs(),\n () => releaseClient(true),\n );\n releaseClient();\n return result;\n } catch (err) {\n releaseClient(isConnectionError(err) ? true : undefined);\n throw err;\n }\n };\n\n if (isRead) {\n // Reads: retry on any connection-class error (safe — no side effects).\n return retryOnConnectionError(runAttempt);\n }\n\n // Writes: attempt once. If the acquire itself times out (error occurs\n // before the statement was sent), that produces a CONNECT_TIMEOUT which\n // isConnectionError() recognises → retry is safe. Any error that surfaces\n // AFTER the statement was sent must propagate immediately to avoid\n // double-execution.\n try {\n return await runAttempt();\n } catch (err) {\n // acquire-timeout fires before the statement → safe to retry once.\n if (isConnectionError(err) && (err as any)?.code === \"CONNECT_TIMEOUT\") {\n return runAttempt();\n }\n throw err;\n }\n };\n\n // Return a proxy so every pool property/method is forwarded as-is, but\n // pool.query() goes through the resilient wrapper. drizzle-neon-serverless\n // calls pool.connect() for transactions and pool.query() for simple queries.\n return new Proxy(pool, {\n get(target, prop) {\n if (prop === \"query\") return resilientQuery;\n const val = (target as any)[prop];\n return typeof val === \"function\" ? val.bind(target) : val;\n },\n }) as T;\n}\n\n/**\n * Wraps a postgres.js client so Drizzle queries on the non-Neon Postgres\n * path get the same withDbTimeout + retryOnConnectionError protection as\n * every other Postgres path (raw DbExec postgres.js, raw DbExec Neon, and\n * the Drizzle Neon pool above). Without this, one hung query on a BYO\n * Postgres deployment stalls its request forever.\n *\n * Drizzle's postgres-js session only calls `client.unsafe(query, params)` —\n * awaited directly for row-object results or via `.values()` for row-array\n * results — plus `client.begin(...)` for transactions. We interpose on\n * `unsafe` with a lazy thenable that re-issues the query per retry attempt,\n * and leave transactions unwrapped (same rule as the Neon wrapper: the\n * driver manages the sticky connection inside `begin`).\n *\n * Retry-safety mirrors buildResilientNeonPool: reads retry freely on\n * connection-class errors; writes retry only on CONNECT_TIMEOUT (postgres.js\n * raises it before the statement is ever sent), so writes can't\n * double-execute.\n */\nexport function buildResilientPostgresJsClient<\n T extends {\n unsafe(query: string, params?: any[], options?: any): any;\n },\n>(client: T): T {\n const wrapUnsafe = (query: string, params?: any[], options?: any) => {\n const isRead = isSqlRead(query);\n\n const runAttempt = (mode: \"rows\" | \"values\") => async (): Promise<any> => {\n const pending = client.unsafe(query, params, options);\n return withDbTimeout(\n \"query\",\n async () => (mode === \"values\" ? pending.values() : pending),\n dbOpTimeoutMs(),\n () => {\n // Best-effort cancel so the timed-out statement doesn't keep\n // occupying one of the (small, serverless-capped) pool slots.\n try {\n pending.cancel?.();\n } catch {\n // ignore — cancellation is advisory\n }\n },\n );\n };\n\n const execute = async (mode: \"rows\" | \"values\"): Promise<any> => {\n if (isRead) return retryOnConnectionError(runAttempt(mode));\n try {\n return await runAttempt(mode)();\n } catch (err) {\n // Connect timeout fires before the statement is sent → one retry is\n // safe even for writes.\n if (\n isConnectionError(err) &&\n (err as any)?.code === \"CONNECT_TIMEOUT\"\n ) {\n return runAttempt(mode)();\n }\n throw err;\n }\n };\n\n // Lazy thenable mirroring the slice of postgres.js's PendingQuery\n // surface that Drizzle uses: `await q` or `await q.values()`.\n return {\n then: (onFulfilled?: any, onRejected?: any) =>\n execute(\"rows\").then(onFulfilled, onRejected),\n catch: (onRejected?: any) => execute(\"rows\").catch(onRejected),\n finally: (onFinally?: any) => execute(\"rows\").finally(onFinally),\n values: () => execute(\"values\"),\n };\n };\n\n return new Proxy(client as any, {\n get(target, prop) {\n if (prop === \"unsafe\") return wrapUnsafe;\n const val = target[prop];\n return typeof val === \"function\" ? val.bind(target) : val;\n },\n }) as T;\n}\n\n/**\n * Neon's pooler endpoints cold-start in 5–10s. Serverless environments\n * (Netlify Functions, Vercel Edge, CF Workers) have short cold-start\n * budgets of their own, and `postgres-js` opens a raw TCP connection on\n * port 5432 that can't negotiate around Neon's wake-up window — every\n * request after an idle period 502s. `@neondatabase/serverless` rides\n * over WebSockets (HTTP/443 upgrade) and handles Neon wake-up\n * transparently, supports transactions, and works in every serverless\n * runtime we deploy to, so we prefer it whenever the URL points at Neon.\n */\nexport function isNeonUrl(url: string): boolean {\n // Must match neon.tech followed by port/path/query/end — include `?` so\n // URLs like `postgres://…@ep.neon.tech?sslmode=require` (no explicit port\n // or path) still route through the serverless driver.\n return /\\.neon\\.tech([:/?]|$)/.test(url);\n}\n\nlet _libsqlWebDrizzle: Promise<{ drizzle: any }> | undefined;\nfunction getLibsqlWebDrizzle() {\n if (!_libsqlWebDrizzle) {\n _libsqlWebDrizzle = import(\"drizzle-orm/libsql/web\").then((mod) => ({\n drizzle: mod.drizzle,\n }));\n }\n return _libsqlWebDrizzle;\n}\n\nlet _betterSqliteDrizzle: Promise<{ drizzle: any; Database: any }> | undefined;\nfunction getBetterSqliteDrizzle() {\n if (!_betterSqliteDrizzle) {\n _betterSqliteDrizzle = Promise.all([\n import(\"drizzle-orm/better-sqlite3\"),\n import(\"better-sqlite3\"),\n ]).then(([drizzleMod, sqliteMod]) => ({\n drizzle: drizzleMod.drizzle,\n Database: sqliteMod.default,\n }));\n }\n return _betterSqliteDrizzle;\n}\n\n/**\n * Patch a drizzle-orm/better-sqlite3 instance so that db.transaction(async …)\n * works. The native better-sqlite3 Transaction wrapper is sync-only — passing\n * an async callback throws \"Transaction function cannot return a promise\".\n *\n * This wrapper bypasses the native path by issuing raw SQL control statements\n * on the single better-sqlite3 connection, which is safe because:\n * - better-sqlite3 is single-connection (no concurrency inside one process)\n * - the framework serialises all async work through one Database instance\n *\n * Nesting: if a transaction is already open (sqlite.inTransaction === true),\n * SAVEPOINT / RELEASE / ROLLBACK TO is used instead of BEGIN / COMMIT /\n * ROLLBACK, matching drizzle's own BetterSQLiteTransaction.transaction().\n *\n * The patched transaction also patches the tx object it passes to the callback\n * so that nested async calls (tx.transaction(async …)) work recursively.\n */\n/** @internal exported for the async-tx concurrency spec */\nexport function patchBetterSqliteTransactions<\n DB extends { transaction: (...args: any[]) => any; session: any },\n>(db: DB, sqlite: { inTransaction: boolean; exec: (sql: string) => void }): DB {\n let savepointSeq = 0;\n // Concurrent TOP-LEVEL async transactions on the single better-sqlite3\n // connection must not interleave: a second transaction starting while the\n // first is open would see `inTransaction` and open a savepoint INSIDE the\n // first transaction, which then commits out from under it (\"no such\n // savepoint\"). Serialize top-level transactions through a promise chain;\n // genuine same-task nesting (tx.transaction or db.transaction inside an\n // open callback) is detected via AsyncLocalStorage and keeps the direct\n // savepoint path so it cannot deadlock on the queue.\n const txContext = new AsyncLocalStorage<boolean>();\n let txChain: Promise<unknown> = Promise.resolve();\n\n function makeAsyncTransaction(\n originalTransaction: (...args: any[]) => any,\n ): (...args: any[]) => Promise<unknown> {\n async function runTransactionBody(\n cb: (tx: unknown) => unknown,\n ): Promise<unknown> {\n // Extract the drizzle tx proxy synchronously — call the original with a\n // stub that captures the tx arg then immediately throws a sentinel so\n // better-sqlite3's native wrapper rolls back the stub and re-throws.\n // The sentinel is caught here and never propagates further.\n let capturedTx: unknown;\n try {\n originalTransaction((tx: unknown) => {\n capturedTx = tx;\n throw _EXTRACT_TX;\n });\n } catch (e) {\n if (e !== _EXTRACT_TX) throw e;\n }\n\n // Recursively patch the nested tx so tx.transaction(async …) also works.\n const tx = capturedTx as { transaction: (...a: any[]) => any };\n if (tx && typeof tx.transaction === \"function\") {\n tx.transaction = makeAsyncTransaction(tx.transaction.bind(tx));\n }\n\n const nested = sqlite.inTransaction;\n if (nested) {\n const sp = `sp_async_${++savepointSeq}`;\n sqlite.exec(`SAVEPOINT ${sp}`);\n let released = false;\n try {\n const result = await cb(tx);\n sqlite.exec(`RELEASE SAVEPOINT ${sp}`);\n released = true;\n return result;\n } catch (err) {\n if (!released) {\n try {\n sqlite.exec(`ROLLBACK TO SAVEPOINT ${sp}`);\n sqlite.exec(`RELEASE SAVEPOINT ${sp}`);\n } catch {\n /* ignore: connection may already be in an error state */\n }\n }\n throw err;\n }\n }\n\n // Top-level: BEGIN IMMEDIATE … COMMIT / ROLLBACK.\n sqlite.exec(\"BEGIN IMMEDIATE\");\n let committed = false;\n try {\n const result = await cb(tx);\n sqlite.exec(\"COMMIT\");\n committed = true;\n return result;\n } catch (err) {\n if (!committed) {\n try {\n sqlite.exec(\"ROLLBACK\");\n } catch {\n /* swallow: connection may already be unusable */\n }\n }\n throw err;\n }\n }\n\n return function asyncTransaction(\n cb: (tx: unknown) => unknown,\n ): Promise<unknown> {\n if (txContext.getStore()) {\n // Same-task nesting: run directly (savepoint path inside the open\n // transaction). Queueing here would deadlock behind the outer tx.\n return runTransactionBody(cb);\n }\n const run = () => txContext.run(true, () => runTransactionBody(cb));\n const next = txChain.then(run, run);\n txChain = next.then(\n () => undefined,\n () => undefined,\n );\n return next;\n };\n }\n\n db.transaction = makeAsyncTransaction(db.transaction.bind(db));\n return db;\n}\n\n/** Sentinel thrown inside the tx-extraction stub — never escapes the catch. */\nconst _EXTRACT_TX = Symbol(\"extract-tx\");\n\nexport function createGetDb<T extends Record<string, unknown>>(schema: T) {\n let _db: any;\n let _dbReady: Promise<any> | undefined;\n\n // The Drizzle instance is bound to a shared pool, so a `closeDbExec()` (test\n // teardown, script cleanup) must invalidate it rather than leave this store\n // issuing queries on a closed pool. Registered lazily from the pooled\n // branches only — `createGetDb` is called at module scope by every store, and\n // core's specs widely mock `db/client.js`.\n let _closeHookRegistered = false;\n function resetOnPoolClose(driver?: string, url?: string): void {\n if (_closeHookRegistered) return;\n _closeHookRegistered = true;\n onSharedDbPoolsClosed(() => {\n _db = undefined;\n _dbReady = undefined;\n });\n if (driver && url) {\n onSharedDbPoolReplaced(driver, url, () => {\n _db = undefined;\n _dbReady = undefined;\n });\n }\n }\n\n function startInit(): Promise<any> {\n if (_dbReady) return _dbReady;\n\n const url = getDatabaseUrl(\"file:./data/app.db\");\n const dialect = getDialect();\n\n // D1 only if dialect detected it (DATABASE_URL takes priority)\n if (dialect === \"d1\") {\n const d1 = getCloudflareD1Binding() as\n | Parameters<typeof drizzleD1>[0]\n | undefined;\n if (d1) {\n _db = drizzleD1(d1, { schema }) as unknown as LibSQLDatabase<T>;\n _dbReady = Promise.resolve(_db);\n return _dbReady;\n }\n }\n\n if (isPgliteUrl(url)) {\n _dbReady = loadPgliteDrizzle().then(async ({ drizzle }) => {\n const client = await getPgliteClient(url);\n _db = drizzle({ client, schema });\n });\n return _dbReady;\n }\n\n if (dialect === \"postgres\") {\n if (isNeonUrl(url)) {\n _dbReady = getNeonServerlessDrizzle().then(({ drizzle, Pool }) => {\n // Shared with the DbExec singleton, Better Auth, and every other\n // `createGetDb` store: one connect per process instead of one per\n // schema module. See `sharedDbPool` in client.ts.\n resetOnPoolClose(\"neon\", url);\n const rawPool = sharedDbPool(\n \"neon\",\n url,\n () => new Pool({ connectionString: url, max: neonPoolMax() }),\n );\n attachNeonPoolErrorLogger(rawPool);\n // Wrap the pool with the resilience layer so Drizzle queries get the\n // same withDbTimeout + retryOnConnectionError protection as the raw\n // DbExec path in client.ts. Reads retry freely; writes only retry on\n // acquire-timeout (pre-send) errors to avoid double-execution.\n const pool = buildResilientNeonPool(rawPool);\n _db = drizzle(pool, { schema });\n });\n } else {\n _dbReady = getPgDrizzle().then(({ drizzle, postgres }) => {\n // pgPoolOptions caps the pool to a small size on serverless so\n // concurrent frozen instances don't exhaust Neon/Postgres'\n // connection limit (\"Max client connections reached\"). Shared across\n // consumers — see `sharedDbPool` in client.ts.\n resetOnPoolClose(\"postgres-js\", url);\n const client = sharedDbPool(\"postgres-js\", url, () =>\n postgres(url, pgPoolOptions(url)),\n );\n _db = drizzle(buildResilientPostgresJsClient(client), { schema });\n });\n }\n } else if (isLocalSqliteUrl(url)) {\n _dbReady = Promise.all([\n prepareLocalSqliteUrl(url.startsWith(\"file:\") ? url : `file:${url}`),\n getBetterSqliteDrizzle(),\n ]).then(([sqliteUrl, { drizzle, Database }]) => {\n const sqlite = new Database(sqliteFilenameFromUrl(sqliteUrl));\n // Wait up to 10s for a concurrent writer instead of failing fast\n // with SQLITE_BUSY — mirrors the raw DbExec SQLite path in client.ts.\n sqlite.pragma(\"busy_timeout = 10000\");\n sqlite.pragma(\"journal_mode = WAL\");\n const db = drizzle(sqlite, { schema });\n _db = patchBetterSqliteTransactions(db, sqlite);\n });\n } else {\n _dbReady = getLibsqlWebDrizzle().then(({ drizzle }) => {\n _db = drizzle({\n connection: { url, authToken: getDatabaseAuthToken() },\n schema,\n });\n });\n }\n return _dbReady;\n }\n\n /**\n * Create a lazy proxy that records property accesses and method calls,\n * then replays them on the real DB once init completes. Supports\n * Drizzle's chained API: db.select().from(table).where(...).\n *\n * When `.then()` is called (i.e. the chain is awaited), the proxy\n * awaits _dbReady and replays the recorded chain on the real _db.\n */\n function createLazyProxy(\n ready: Promise<any>,\n chain: Array<{ prop: string | symbol; args?: any[] }>,\n ): any {\n return new Proxy(function () {} as any, {\n get(_target, prop) {\n // When awaited, replay the chain on the real db\n if (prop === \"then\" || prop === \"catch\" || prop === \"finally\") {\n const promise = ready.then(() => {\n let result: any = _db;\n for (const step of chain) {\n const val = result[step.prop];\n result =\n typeof val === \"function\" ? val.apply(result, step.args) : val;\n }\n return result;\n });\n return (promise as any)[prop].bind(promise);\n }\n // Symbol.toStringTag, Symbol.iterator, etc. — return another proxy\n // Property access (e.g. db.query) — record and return another proxy\n return createLazyProxy(ready, [...chain, { prop }]);\n },\n apply(_target, _thisArg, args) {\n // Method call (e.g. .from(table)) — record args and return another proxy\n if (chain.length === 0) return createLazyProxy(ready, []);\n const last = chain[chain.length - 1];\n const newChain = chain.slice(0, -1);\n newChain.push({ prop: last.prop, args });\n return createLazyProxy(ready, newChain);\n },\n });\n }\n\n /**\n * Get the Drizzle DB instance. Kicks off lazy init on first call.\n * If the async init hasn't completed yet, returns a lazy Proxy that\n * records the Drizzle chain (select/from/where/etc.) and replays it\n * once the DB driver finishes loading. Since callers always `await`\n * the final result, the proxy is transparent.\n */\n function getDb(): LibSQLDatabase<T> {\n if (_db) return _db;\n startInit();\n if (_db) return _db;\n\n return createLazyProxy(_dbReady!, []) as LibSQLDatabase<T>;\n }\n\n return getDb;\n}\n"]}
@@ -41,6 +41,7 @@ export interface DatabaseSchemaHealthResult {
41
41
  }>;
42
42
  error?: string;
43
43
  }
44
+ export declare const DEFAULT_REQUIRED_SCHEMA: RequiredSchemaTable[];
44
45
  export declare function getDatabaseRuntimeFingerprint(): DatabaseRuntimeFingerprint;
45
46
  export declare function getRuntimeDebugFingerprint(): RuntimeDebugFingerprint;
46
47
  export declare function runDatabaseSchemaHealthCheck(options?: {
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-diagnostics.d.ts","sourceRoot":"","sources":["../../src/db/runtime-diagnostics.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,MAAM,EACX,KAAK,OAAO,EACb,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,4BAA4B,EAAE,OAAO,CAAC;IACtC,IAAI,CAAC,EAAE;QACL,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,OAAO,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,0BAA0B,CAAC;CACtC;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA+HD,wBAAgB,6BAA6B,IAAI,0BAA0B,CAa1E;AAED,wBAAgB,0BAA0B,IAAI,uBAAuB,CAkBpE;AA4CD,wBAAsB,4BAA4B,CAChD,OAAO,GAAE;IACP,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;CAC7B,GACL,OAAO,CAAC,0BAA0B,CAAC,CAsCrC;AAED,wBAAgB,6BAA6B,CAC3C,WAAW,GAAE,uBAAsD,GAClE,MAAM,CA2BR"}
1
+ {"version":3,"file":"runtime-diagnostics.d.ts","sourceRoot":"","sources":["../../src/db/runtime-diagnostics.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,MAAM,EACX,KAAK,OAAO,EACb,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,4BAA4B,EAAE,OAAO,CAAC;IACtC,IAAI,CAAC,EAAE;QACL,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,OAAO,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,0BAA0B,CAAC;CACtC;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,uBAAuB,EAAE,mBAAmB,EAsDxD,CAAC;AAuEF,wBAAgB,6BAA6B,IAAI,0BAA0B,CAa1E;AAED,wBAAgB,0BAA0B,IAAI,uBAAuB,CAkBpE;AA8DD,wBAAsB,4BAA4B,CAChD,OAAO,GAAE;IACP,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;CAC7B,GACL,OAAO,CAAC,0BAA0B,CAAC,CAuDrC;AAED,wBAAgB,6BAA6B,CAC3C,WAAW,GAAE,uBAAsD,GAClE,MAAM,CA2BR"}
@@ -1,6 +1,6 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { getDatabaseUrl, getDialect, getDbExec, } from "./client.js";
3
- const DEFAULT_REQUIRED_SCHEMA = [
3
+ export const DEFAULT_REQUIRED_SCHEMA = [
4
4
  {
5
5
  table: "agent_runs",
6
6
  columns: [
@@ -181,25 +181,47 @@ async function tableColumns(exec, dialect, table) {
181
181
  ? postgresTableColumns(exec, table)
182
182
  : sqliteTableColumns(exec, table);
183
183
  }
184
+ /**
185
+ * Memo for the default probe, which several client surfaces re-run on every
186
+ * page load at one `information_schema` round trip per required table.
187
+ *
188
+ * Only a clean, completed result is memoized: a probe reporting a missing table
189
+ * or an unreadable database must never be served from cache, or the repair that
190
+ * follows stays invisible for the whole window. Schema changes are additive and
191
+ * applied by migrations, so a clean answer cannot silently go bad — but the
192
+ * window is still kept to seconds, short enough that anything a deploy changes
193
+ * shows up on the next page load rather than being pinned. Callers that
194
+ * override `exec`, `dialect`, or `required` bypass it entirely.
195
+ */
196
+ const SCHEMA_HEALTH_MEMO_MS = 5_000;
197
+ let schemaHealthMemo = null;
184
198
  export async function runDatabaseSchemaHealthCheck(options = {}) {
199
+ const memoizable = !options.exec && !options.dialect && !options.required;
200
+ if (memoizable &&
201
+ schemaHealthMemo &&
202
+ Date.now() - schemaHealthMemo.at < SCHEMA_HEALTH_MEMO_MS) {
203
+ return schemaHealthMemo.result;
204
+ }
185
205
  const dialect = options.dialect ?? getDialect();
186
206
  const exec = options.exec ?? getDbExec();
187
207
  const required = options.required ?? DEFAULT_REQUIRED_SCHEMA;
188
208
  const missingTables = [];
189
209
  const missingColumns = [];
190
210
  try {
191
- for (const requirement of required) {
192
- const columns = await tableColumns(exec, dialect, requirement.table);
211
+ // Independent probes: serially they cost one network round trip each.
212
+ const found = await Promise.all(required.map((requirement) => tableColumns(exec, dialect, requirement.table)));
213
+ required.forEach((requirement, index) => {
214
+ const columns = found[index];
193
215
  if (!columns) {
194
216
  missingTables.push(requirement.table);
195
- continue;
217
+ return;
196
218
  }
197
219
  for (const column of requirement.columns) {
198
220
  if (!columns.has(column)) {
199
221
  missingColumns.push({ table: requirement.table, column });
200
222
  }
201
223
  }
202
- }
224
+ });
203
225
  }
204
226
  catch (err) {
205
227
  return {
@@ -211,13 +233,16 @@ export async function runDatabaseSchemaHealthCheck(options = {}) {
211
233
  error: err instanceof Error ? err.message : String(err),
212
234
  };
213
235
  }
214
- return {
236
+ const result = {
215
237
  ok: missingTables.length === 0 && missingColumns.length === 0,
216
238
  checked: true,
217
239
  dialect,
218
240
  missingTables,
219
241
  missingColumns,
220
242
  };
243
+ if (memoizable && result.ok)
244
+ schemaHealthMemo = { at: Date.now(), result };
245
+ return result;
221
246
  }
222
247
  export function formatRuntimeDebugFingerprint(fingerprint = getRuntimeDebugFingerprint()) {
223
248
  const db = fingerprint.database;
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-diagnostics.js","sourceRoot":"","sources":["../../src/db/runtime-diagnostics.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport {\n getDatabaseUrl,\n getDialect,\n getDbExec,\n type DbExec,\n type Dialect,\n} from \"./client.js\";\n\nexport interface DatabaseRuntimeFingerprint {\n configured: boolean;\n source: string;\n dialect: Dialect;\n urlHash?: string;\n protocol?: string;\n host?: string;\n database?: string;\n appName?: string;\n authTokenConfigured: boolean;\n netlifyDatabaseUrlConfigured: boolean;\n neon?: {\n endpointId?: string;\n pooled: boolean;\n projectHost?: string;\n };\n}\n\nexport interface RuntimeDebugFingerprint {\n app: string;\n environment: string;\n deployContext?: string;\n deployId?: string;\n commitRef?: string;\n branch?: string;\n siteName?: string;\n database: DatabaseRuntimeFingerprint;\n}\n\nexport interface RequiredSchemaTable {\n table: string;\n columns: string[];\n}\n\nexport interface DatabaseSchemaHealthResult {\n ok: boolean;\n checked: boolean;\n dialect: Dialect;\n missingTables: string[];\n missingColumns: Array<{ table: string; column: string }>;\n error?: string;\n}\n\nconst DEFAULT_REQUIRED_SCHEMA: RequiredSchemaTable[] = [\n {\n table: \"agent_runs\",\n columns: [\n \"id\",\n \"thread_id\",\n \"status\",\n \"started_at\",\n \"completed_at\",\n \"heartbeat_at\",\n \"last_progress_at\",\n \"turn_id\",\n \"error_code\",\n \"error_detail\",\n \"terminal_reason\",\n \"dispatch_mode\",\n \"diag_stage\",\n \"worker_stage\",\n ],\n },\n {\n table: \"agent_run_events\",\n columns: [\"run_id\", \"seq\", \"event_at\", \"event_data\"],\n },\n {\n table: \"agent_tool_ledger\",\n columns: [\"thread_id\", \"tool_key\", \"result_summary\", \"completed_at\"],\n },\n {\n table: \"chat_threads\",\n columns: [\n \"id\",\n \"owner_email\",\n \"title\",\n \"preview\",\n \"thread_data\",\n \"message_count\",\n \"created_at\",\n \"updated_at\",\n \"scope_type\",\n \"scope_id\",\n \"scope_label\",\n \"pinned_at\",\n \"archived_at\",\n ],\n },\n {\n table: \"settings\",\n columns: [\"key\", \"value\", \"updated_at\"],\n },\n {\n table: \"application_state\",\n columns: [\"session_id\", \"key\", \"value\", \"updated_at\"],\n },\n];\n\nfunction envValue(key: string): string | undefined {\n const value = process.env[key]?.trim();\n return value || undefined;\n}\n\nfunction appEnvPrefix(): string | undefined {\n return envValue(\"APP_NAME\")?.toUpperCase().replace(/-/g, \"_\");\n}\n\nfunction databaseUrlSource(): string {\n const appName = appEnvPrefix();\n if (appName && envValue(`${appName}_DATABASE_URL`)) {\n return `${appName}_DATABASE_URL`;\n }\n if (envValue(\"DATABASE_URL\")) return \"DATABASE_URL\";\n if (envValue(\"NETLIFY_DATABASE_URL\")) return \"NETLIFY_DATABASE_URL\";\n return \"default\";\n}\n\nfunction databaseAuthTokenConfigured(): boolean {\n const appName = appEnvPrefix();\n return Boolean(\n (appName && envValue(`${appName}_DATABASE_AUTH_TOKEN`)) ||\n envValue(\"DATABASE_AUTH_TOKEN\") ||\n envValue(\"NETLIFY_DATABASE_AUTH_TOKEN\"),\n );\n}\n\nfunction shortHash(value: string): string | undefined {\n if (!value) return undefined;\n return createHash(\"sha256\").update(value).digest(\"hex\").slice(0, 12);\n}\n\nfunction parseDatabaseUrl(url: string): Partial<DatabaseRuntimeFingerprint> {\n if (!url) return {};\n if (url.startsWith(\"pglite:\")) {\n return { protocol: \"pglite\", database: url.slice(\"pglite:\".length) };\n }\n if (url.startsWith(\"file:\")) {\n return { protocol: \"file\", database: url.slice(\"file:\".length) };\n }\n if (!/^[a-z][a-z0-9+.-]*:\\/\\//i.test(url)) {\n return { protocol: \"sqlite\", database: url };\n }\n\n try {\n const parsed = new URL(url);\n const host = parsed.hostname || undefined;\n const neonMatch = host?.match(/^(ep-[a-z0-9-]+?)(-pooler)?\\.(.+)$/i);\n const isNeon = Boolean(host?.endsWith(\".neon.tech\") && neonMatch);\n return {\n protocol: parsed.protocol.replace(/:$/, \"\"),\n host,\n database: parsed.pathname.replace(/^\\//, \"\") || undefined,\n ...(isNeon\n ? {\n neon: {\n endpointId: neonMatch?.[1],\n pooled: Boolean(neonMatch?.[2]),\n projectHost: neonMatch?.[3],\n },\n }\n : {}),\n };\n } catch {\n return {};\n }\n}\n\nexport function getDatabaseRuntimeFingerprint(): DatabaseRuntimeFingerprint {\n const url = getDatabaseUrl();\n const parsed = parseDatabaseUrl(url);\n return {\n configured: Boolean(url),\n source: databaseUrlSource(),\n dialect: getDialect(),\n urlHash: shortHash(url),\n appName: envValue(\"APP_NAME\"),\n authTokenConfigured: databaseAuthTokenConfigured(),\n netlifyDatabaseUrlConfigured: Boolean(envValue(\"NETLIFY_DATABASE_URL\")),\n ...parsed,\n };\n}\n\nexport function getRuntimeDebugFingerprint(): RuntimeDebugFingerprint {\n return {\n app: envValue(\"APP_NAME\") ?? \"unknown\",\n environment: envValue(\"NODE_ENV\") ?? \"unknown\",\n deployContext: envValue(\"CONTEXT\") ?? envValue(\"VERCEL_ENV\"),\n deployId: envValue(\"DEPLOY_ID\") ?? envValue(\"VERCEL_DEPLOYMENT_ID\"),\n commitRef:\n envValue(\"COMMIT_REF\") ??\n envValue(\"NETLIFY_COMMIT_REF\") ??\n envValue(\"VERCEL_GIT_COMMIT_SHA\") ??\n envValue(\"GIT_COMMIT_SHA\"),\n branch:\n envValue(\"BRANCH\") ??\n envValue(\"HEAD\") ??\n envValue(\"VERCEL_GIT_COMMIT_REF\"),\n siteName: envValue(\"SITE_NAME\") ?? envValue(\"NETLIFY_SITE_NAME\"),\n database: getDatabaseRuntimeFingerprint(),\n };\n}\n\nfunction assertSafeIdentifier(value: string): void {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(value)) {\n throw new Error(`Unsafe schema identifier: ${value}`);\n }\n}\n\nasync function postgresTableColumns(\n exec: DbExec,\n table: string,\n): Promise<Set<string> | null> {\n const result = await exec.execute({\n sql: `SELECT column_name FROM information_schema.columns WHERE table_schema = 'public' AND table_name = ?`,\n args: [table],\n });\n if (!result.rows.length) return null;\n return new Set(result.rows.map((row) => String(row.column_name)));\n}\n\nasync function sqliteTableColumns(\n exec: DbExec,\n table: string,\n): Promise<Set<string> | null> {\n assertSafeIdentifier(table);\n const exists = await exec.execute({\n sql: `SELECT name FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1`,\n args: [table],\n });\n if (!exists.rows.length) return null;\n const result = await exec.execute(`PRAGMA table_info(${table})`);\n return new Set(result.rows.map((row) => String(row.name)));\n}\n\nasync function tableColumns(\n exec: DbExec,\n dialect: Dialect,\n table: string,\n): Promise<Set<string> | null> {\n return dialect === \"postgres\"\n ? postgresTableColumns(exec, table)\n : sqliteTableColumns(exec, table);\n}\n\nexport async function runDatabaseSchemaHealthCheck(\n options: {\n exec?: DbExec;\n dialect?: Dialect;\n required?: RequiredSchemaTable[];\n } = {},\n): Promise<DatabaseSchemaHealthResult> {\n const dialect = options.dialect ?? getDialect();\n const exec = options.exec ?? getDbExec();\n const required = options.required ?? DEFAULT_REQUIRED_SCHEMA;\n const missingTables: string[] = [];\n const missingColumns: Array<{ table: string; column: string }> = [];\n\n try {\n for (const requirement of required) {\n const columns = await tableColumns(exec, dialect, requirement.table);\n if (!columns) {\n missingTables.push(requirement.table);\n continue;\n }\n for (const column of requirement.columns) {\n if (!columns.has(column)) {\n missingColumns.push({ table: requirement.table, column });\n }\n }\n }\n } catch (err) {\n return {\n ok: false,\n checked: false,\n dialect,\n missingTables,\n missingColumns,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n\n return {\n ok: missingTables.length === 0 && missingColumns.length === 0,\n checked: true,\n dialect,\n missingTables,\n missingColumns,\n };\n}\n\nexport function formatRuntimeDebugFingerprint(\n fingerprint: RuntimeDebugFingerprint = getRuntimeDebugFingerprint(),\n): string {\n const db = fingerprint.database;\n return [\n `app: ${fingerprint.app}`,\n `environment: ${fingerprint.environment}`,\n fingerprint.deployContext\n ? `deploy_context: ${fingerprint.deployContext}`\n : \"\",\n fingerprint.deployId ? `deploy_id: ${fingerprint.deployId}` : \"\",\n fingerprint.commitRef ? `commit_ref: ${fingerprint.commitRef}` : \"\",\n fingerprint.branch ? `branch: ${fingerprint.branch}` : \"\",\n fingerprint.siteName ? `site_name: ${fingerprint.siteName}` : \"\",\n `db_configured: ${db.configured}`,\n `db_source: ${db.source}`,\n `db_dialect: ${db.dialect}`,\n db.protocol ? `db_protocol: ${db.protocol}` : \"\",\n db.host ? `db_host: ${db.host}` : \"\",\n db.database ? `db_database: ${db.database}` : \"\",\n db.urlHash ? `db_url_hash: ${db.urlHash}` : \"\",\n db.neon?.endpointId ? `db_neon_endpoint: ${db.neon.endpointId}` : \"\",\n db.neon ? `db_neon_pooled: ${db.neon.pooled}` : \"\",\n db.neon?.projectHost ? `db_neon_project_host: ${db.neon.projectHost}` : \"\",\n `db_auth_token_configured: ${db.authTokenConfigured}`,\n `netlify_database_url_configured: ${db.netlifyDatabaseUrlConfigured}`,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n}\n"]}
1
+ {"version":3,"file":"runtime-diagnostics.js","sourceRoot":"","sources":["../../src/db/runtime-diagnostics.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport {\n getDatabaseUrl,\n getDialect,\n getDbExec,\n type DbExec,\n type Dialect,\n} from \"./client.js\";\n\nexport interface DatabaseRuntimeFingerprint {\n configured: boolean;\n source: string;\n dialect: Dialect;\n urlHash?: string;\n protocol?: string;\n host?: string;\n database?: string;\n appName?: string;\n authTokenConfigured: boolean;\n netlifyDatabaseUrlConfigured: boolean;\n neon?: {\n endpointId?: string;\n pooled: boolean;\n projectHost?: string;\n };\n}\n\nexport interface RuntimeDebugFingerprint {\n app: string;\n environment: string;\n deployContext?: string;\n deployId?: string;\n commitRef?: string;\n branch?: string;\n siteName?: string;\n database: DatabaseRuntimeFingerprint;\n}\n\nexport interface RequiredSchemaTable {\n table: string;\n columns: string[];\n}\n\nexport interface DatabaseSchemaHealthResult {\n ok: boolean;\n checked: boolean;\n dialect: Dialect;\n missingTables: string[];\n missingColumns: Array<{ table: string; column: string }>;\n error?: string;\n}\n\nexport const DEFAULT_REQUIRED_SCHEMA: RequiredSchemaTable[] = [\n {\n table: \"agent_runs\",\n columns: [\n \"id\",\n \"thread_id\",\n \"status\",\n \"started_at\",\n \"completed_at\",\n \"heartbeat_at\",\n \"last_progress_at\",\n \"turn_id\",\n \"error_code\",\n \"error_detail\",\n \"terminal_reason\",\n \"dispatch_mode\",\n \"diag_stage\",\n \"worker_stage\",\n ],\n },\n {\n table: \"agent_run_events\",\n columns: [\"run_id\", \"seq\", \"event_at\", \"event_data\"],\n },\n {\n table: \"agent_tool_ledger\",\n columns: [\"thread_id\", \"tool_key\", \"result_summary\", \"completed_at\"],\n },\n {\n table: \"chat_threads\",\n columns: [\n \"id\",\n \"owner_email\",\n \"title\",\n \"preview\",\n \"thread_data\",\n \"message_count\",\n \"created_at\",\n \"updated_at\",\n \"scope_type\",\n \"scope_id\",\n \"scope_label\",\n \"pinned_at\",\n \"archived_at\",\n ],\n },\n {\n table: \"settings\",\n columns: [\"key\", \"value\", \"updated_at\"],\n },\n {\n table: \"application_state\",\n columns: [\"session_id\", \"key\", \"value\", \"updated_at\"],\n },\n];\n\nfunction envValue(key: string): string | undefined {\n const value = process.env[key]?.trim();\n return value || undefined;\n}\n\nfunction appEnvPrefix(): string | undefined {\n return envValue(\"APP_NAME\")?.toUpperCase().replace(/-/g, \"_\");\n}\n\nfunction databaseUrlSource(): string {\n const appName = appEnvPrefix();\n if (appName && envValue(`${appName}_DATABASE_URL`)) {\n return `${appName}_DATABASE_URL`;\n }\n if (envValue(\"DATABASE_URL\")) return \"DATABASE_URL\";\n if (envValue(\"NETLIFY_DATABASE_URL\")) return \"NETLIFY_DATABASE_URL\";\n return \"default\";\n}\n\nfunction databaseAuthTokenConfigured(): boolean {\n const appName = appEnvPrefix();\n return Boolean(\n (appName && envValue(`${appName}_DATABASE_AUTH_TOKEN`)) ||\n envValue(\"DATABASE_AUTH_TOKEN\") ||\n envValue(\"NETLIFY_DATABASE_AUTH_TOKEN\"),\n );\n}\n\nfunction shortHash(value: string): string | undefined {\n if (!value) return undefined;\n return createHash(\"sha256\").update(value).digest(\"hex\").slice(0, 12);\n}\n\nfunction parseDatabaseUrl(url: string): Partial<DatabaseRuntimeFingerprint> {\n if (!url) return {};\n if (url.startsWith(\"pglite:\")) {\n return { protocol: \"pglite\", database: url.slice(\"pglite:\".length) };\n }\n if (url.startsWith(\"file:\")) {\n return { protocol: \"file\", database: url.slice(\"file:\".length) };\n }\n if (!/^[a-z][a-z0-9+.-]*:\\/\\//i.test(url)) {\n return { protocol: \"sqlite\", database: url };\n }\n\n try {\n const parsed = new URL(url);\n const host = parsed.hostname || undefined;\n const neonMatch = host?.match(/^(ep-[a-z0-9-]+?)(-pooler)?\\.(.+)$/i);\n const isNeon = Boolean(host?.endsWith(\".neon.tech\") && neonMatch);\n return {\n protocol: parsed.protocol.replace(/:$/, \"\"),\n host,\n database: parsed.pathname.replace(/^\\//, \"\") || undefined,\n ...(isNeon\n ? {\n neon: {\n endpointId: neonMatch?.[1],\n pooled: Boolean(neonMatch?.[2]),\n projectHost: neonMatch?.[3],\n },\n }\n : {}),\n };\n } catch {\n return {};\n }\n}\n\nexport function getDatabaseRuntimeFingerprint(): DatabaseRuntimeFingerprint {\n const url = getDatabaseUrl();\n const parsed = parseDatabaseUrl(url);\n return {\n configured: Boolean(url),\n source: databaseUrlSource(),\n dialect: getDialect(),\n urlHash: shortHash(url),\n appName: envValue(\"APP_NAME\"),\n authTokenConfigured: databaseAuthTokenConfigured(),\n netlifyDatabaseUrlConfigured: Boolean(envValue(\"NETLIFY_DATABASE_URL\")),\n ...parsed,\n };\n}\n\nexport function getRuntimeDebugFingerprint(): RuntimeDebugFingerprint {\n return {\n app: envValue(\"APP_NAME\") ?? \"unknown\",\n environment: envValue(\"NODE_ENV\") ?? \"unknown\",\n deployContext: envValue(\"CONTEXT\") ?? envValue(\"VERCEL_ENV\"),\n deployId: envValue(\"DEPLOY_ID\") ?? envValue(\"VERCEL_DEPLOYMENT_ID\"),\n commitRef:\n envValue(\"COMMIT_REF\") ??\n envValue(\"NETLIFY_COMMIT_REF\") ??\n envValue(\"VERCEL_GIT_COMMIT_SHA\") ??\n envValue(\"GIT_COMMIT_SHA\"),\n branch:\n envValue(\"BRANCH\") ??\n envValue(\"HEAD\") ??\n envValue(\"VERCEL_GIT_COMMIT_REF\"),\n siteName: envValue(\"SITE_NAME\") ?? envValue(\"NETLIFY_SITE_NAME\"),\n database: getDatabaseRuntimeFingerprint(),\n };\n}\n\nfunction assertSafeIdentifier(value: string): void {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(value)) {\n throw new Error(`Unsafe schema identifier: ${value}`);\n }\n}\n\nasync function postgresTableColumns(\n exec: DbExec,\n table: string,\n): Promise<Set<string> | null> {\n const result = await exec.execute({\n sql: `SELECT column_name FROM information_schema.columns WHERE table_schema = 'public' AND table_name = ?`,\n args: [table],\n });\n if (!result.rows.length) return null;\n return new Set(result.rows.map((row) => String(row.column_name)));\n}\n\nasync function sqliteTableColumns(\n exec: DbExec,\n table: string,\n): Promise<Set<string> | null> {\n assertSafeIdentifier(table);\n const exists = await exec.execute({\n sql: `SELECT name FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1`,\n args: [table],\n });\n if (!exists.rows.length) return null;\n const result = await exec.execute(`PRAGMA table_info(${table})`);\n return new Set(result.rows.map((row) => String(row.name)));\n}\n\nasync function tableColumns(\n exec: DbExec,\n dialect: Dialect,\n table: string,\n): Promise<Set<string> | null> {\n return dialect === \"postgres\"\n ? postgresTableColumns(exec, table)\n : sqliteTableColumns(exec, table);\n}\n\n/**\n * Memo for the default probe, which several client surfaces re-run on every\n * page load at one `information_schema` round trip per required table.\n *\n * Only a clean, completed result is memoized: a probe reporting a missing table\n * or an unreadable database must never be served from cache, or the repair that\n * follows stays invisible for the whole window. Schema changes are additive and\n * applied by migrations, so a clean answer cannot silently go bad — but the\n * window is still kept to seconds, short enough that anything a deploy changes\n * shows up on the next page load rather than being pinned. Callers that\n * override `exec`, `dialect`, or `required` bypass it entirely.\n */\nconst SCHEMA_HEALTH_MEMO_MS = 5_000;\nlet schemaHealthMemo: {\n at: number;\n result: DatabaseSchemaHealthResult;\n} | null = null;\n\nexport async function runDatabaseSchemaHealthCheck(\n options: {\n exec?: DbExec;\n dialect?: Dialect;\n required?: RequiredSchemaTable[];\n } = {},\n): Promise<DatabaseSchemaHealthResult> {\n const memoizable = !options.exec && !options.dialect && !options.required;\n if (\n memoizable &&\n schemaHealthMemo &&\n Date.now() - schemaHealthMemo.at < SCHEMA_HEALTH_MEMO_MS\n ) {\n return schemaHealthMemo.result;\n }\n\n const dialect = options.dialect ?? getDialect();\n const exec = options.exec ?? getDbExec();\n const required = options.required ?? DEFAULT_REQUIRED_SCHEMA;\n const missingTables: string[] = [];\n const missingColumns: Array<{ table: string; column: string }> = [];\n\n try {\n // Independent probes: serially they cost one network round trip each.\n const found = await Promise.all(\n required.map((requirement) =>\n tableColumns(exec, dialect, requirement.table),\n ),\n );\n required.forEach((requirement, index) => {\n const columns = found[index];\n if (!columns) {\n missingTables.push(requirement.table);\n return;\n }\n for (const column of requirement.columns) {\n if (!columns.has(column)) {\n missingColumns.push({ table: requirement.table, column });\n }\n }\n });\n } catch (err) {\n return {\n ok: false,\n checked: false,\n dialect,\n missingTables,\n missingColumns,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n\n const result: DatabaseSchemaHealthResult = {\n ok: missingTables.length === 0 && missingColumns.length === 0,\n checked: true,\n dialect,\n missingTables,\n missingColumns,\n };\n if (memoizable && result.ok) schemaHealthMemo = { at: Date.now(), result };\n return result;\n}\n\nexport function formatRuntimeDebugFingerprint(\n fingerprint: RuntimeDebugFingerprint = getRuntimeDebugFingerprint(),\n): string {\n const db = fingerprint.database;\n return [\n `app: ${fingerprint.app}`,\n `environment: ${fingerprint.environment}`,\n fingerprint.deployContext\n ? `deploy_context: ${fingerprint.deployContext}`\n : \"\",\n fingerprint.deployId ? `deploy_id: ${fingerprint.deployId}` : \"\",\n fingerprint.commitRef ? `commit_ref: ${fingerprint.commitRef}` : \"\",\n fingerprint.branch ? `branch: ${fingerprint.branch}` : \"\",\n fingerprint.siteName ? `site_name: ${fingerprint.siteName}` : \"\",\n `db_configured: ${db.configured}`,\n `db_source: ${db.source}`,\n `db_dialect: ${db.dialect}`,\n db.protocol ? `db_protocol: ${db.protocol}` : \"\",\n db.host ? `db_host: ${db.host}` : \"\",\n db.database ? `db_database: ${db.database}` : \"\",\n db.urlHash ? `db_url_hash: ${db.urlHash}` : \"\",\n db.neon?.endpointId ? `db_neon_endpoint: ${db.neon.endpointId}` : \"\",\n db.neon ? `db_neon_pooled: ${db.neon.pooled}` : \"\",\n db.neon?.projectHost ? `db_neon_project_host: ${db.neon.projectHost}` : \"\",\n `db_auth_token_configured: ${db.authTokenConfigured}`,\n `netlify_database_url_configured: ${db.netlifyDatabaseUrlConfigured}`,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n}\n"]}
@@ -80,26 +80,11 @@ export declare function findInstalledResvgPackages(nodeModulesRoots: string[]):
80
80
  }>;
81
81
  /**
82
82
  * Deploy-time gate for emitting the second `-background` Netlify function.
83
- * Reads the same env flag the runtime gate uses
84
- * (`AGENT_CHAT_DURABLE_BACKGROUND`).
85
- *
86
- * DEFAULT-OFF (opt-in). It IS the runtime gate's flag parse
87
- * (`isDurableBackgroundFlagEnabled`), so the two can no longer drift:
88
- * unset/empty/unknown means DISABLED; an app opts IN
89
- * only with an explicit truthy value (`true`/`1`/`yes`/`on`). A premature
90
- * fleet-wide default-on caused real-user incidents (2026-06-24) before the
91
- * async worker path was proven, so durable is opt-in until verified live. This
92
- * gate is what emits the 15-min `-background` function so the `_process-run`
93
- * dispatch lands on it (async 202 → the worker runs with the real 15-min budget
94
- * → its ~13-min soft-timeout fits). The deploy gate and runtime gate MUST agree:
95
- * if the deploy emitted no `-background` function but the runtime still routed
96
- * the worker into the ~13-min timeout regime, the worker would overshoot the
97
- * ~60s synchronous wall and re-dispatch in a loop. (The runtime now also guards
98
- * the ~13-min budget on the real function name via `isInBackgroundFunctionRuntime`,
99
- * so a missing emit does not loop.) A missing emit is NOT benign, though: the
100
- * app then runs every turn on the ~60s synchronous wall for the life of the
101
- * deploy, so an opted-in build that cannot emit the function FAILS rather than
102
- * warning.
83
+ * Netlify deploys are default-on; an explicit falsy
84
+ * `AGENT_CHAT_DURABLE_BACKGROUND` value opts out. This is called only from the
85
+ * Netlify preset, so non-Netlify builds remain unaffected. The gate and runtime
86
+ * default must agree: otherwise the runtime could target a worker that the
87
+ * deploy did not emit.
103
88
  */
104
89
  export declare function isDurableBackgroundDeployEnabled(): boolean;
105
90
  export declare const NETLIFY_INTEGRATION_RECOVERY_FUNCTION_NAME = "server-integration-recovery";
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/deploy/build.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/deploy/build.ts"],"names":[],"mappings":"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"}
@@ -18,7 +18,7 @@ import fs from "fs";
18
18
  import { createRequire } from "module";
19
19
  import path from "path";
20
20
  import { fileURLToPath } from "url";
21
- import { AGENT_BACKGROUND_FUNCTION_NAME, AGENT_BACKGROUND_FUNCTION_URL_PATH, AGENT_BACKGROUND_PROCESSOR_A2A, AGENT_BACKGROUND_PROCESSOR_FIELD, AGENT_BACKGROUND_PROCESSOR_INTEGRATION, AGENT_BACKGROUND_PROCESSOR_ROUTE, AGENT_BACKGROUND_PROCESSOR_ROUTE_FIELD, AGENT_CHAT_PROCESS_RUN_PATH, isDurableBackgroundFlagEnabled, } from "../agent/durable-background.js";
21
+ import { AGENT_BACKGROUND_FUNCTION_NAME, AGENT_BACKGROUND_FUNCTION_URL_PATH, AGENT_BACKGROUND_PROCESSOR_A2A, AGENT_BACKGROUND_PROCESSOR_FIELD, AGENT_BACKGROUND_PROCESSOR_INTEGRATION, AGENT_BACKGROUND_PROCESSOR_ROUTE, AGENT_BACKGROUND_PROCESSOR_ROUTE_FIELD, AGENT_CHAT_PROCESS_RUN_PATH, isDurableBackgroundFlagExplicitlyDisabled, } from "../agent/durable-background.js";
22
22
  import { INTEGRATION_RECOVERY_RUNTIME_MARKER, INTEGRATION_RETRY_SWEEP_PATH, INTEGRATION_RETRY_SWEEP_TOKEN_SUBJECT, isIntegrationDurableDispatchConfigured, } from "../integrations/integration-durable-dispatch-config.js";
23
23
  import { normalizeAppBasePath } from "../server/app-base-path.js";
24
24
  import { DEFAULT_SPECULATION_RULES_PATH, resolveSsrCacheHeaders, } from "../shared/cache-control.js";
@@ -2073,29 +2073,14 @@ export function findInstalledResvgPackages(nodeModulesRoots) {
2073
2073
  }
2074
2074
  /**
2075
2075
  * Deploy-time gate for emitting the second `-background` Netlify function.
2076
- * Reads the same env flag the runtime gate uses
2077
- * (`AGENT_CHAT_DURABLE_BACKGROUND`).
2078
- *
2079
- * DEFAULT-OFF (opt-in). It IS the runtime gate's flag parse
2080
- * (`isDurableBackgroundFlagEnabled`), so the two can no longer drift:
2081
- * unset/empty/unknown means DISABLED; an app opts IN
2082
- * only with an explicit truthy value (`true`/`1`/`yes`/`on`). A premature
2083
- * fleet-wide default-on caused real-user incidents (2026-06-24) before the
2084
- * async worker path was proven, so durable is opt-in until verified live. This
2085
- * gate is what emits the 15-min `-background` function so the `_process-run`
2086
- * dispatch lands on it (async 202 → the worker runs with the real 15-min budget
2087
- * → its ~13-min soft-timeout fits). The deploy gate and runtime gate MUST agree:
2088
- * if the deploy emitted no `-background` function but the runtime still routed
2089
- * the worker into the ~13-min timeout regime, the worker would overshoot the
2090
- * ~60s synchronous wall and re-dispatch in a loop. (The runtime now also guards
2091
- * the ~13-min budget on the real function name via `isInBackgroundFunctionRuntime`,
2092
- * so a missing emit does not loop.) A missing emit is NOT benign, though: the
2093
- * app then runs every turn on the ~60s synchronous wall for the life of the
2094
- * deploy, so an opted-in build that cannot emit the function FAILS rather than
2095
- * warning.
2076
+ * Netlify deploys are default-on; an explicit falsy
2077
+ * `AGENT_CHAT_DURABLE_BACKGROUND` value opts out. This is called only from the
2078
+ * Netlify preset, so non-Netlify builds remain unaffected. The gate and runtime
2079
+ * default must agree: otherwise the runtime could target a worker that the
2080
+ * deploy did not emit.
2096
2081
  */
2097
2082
  export function isDurableBackgroundDeployEnabled() {
2098
- return isDurableBackgroundFlagEnabled();
2083
+ return !isDurableBackgroundFlagExplicitlyDisabled();
2099
2084
  }
2100
2085
  /**
2101
2086
  * True when this build MUST ship the `-background` function: either the chat
@@ -2132,7 +2117,8 @@ export function emitSingleTemplateNetlifyKeepWarmFunction(projectCwd) {
2132
2117
  // dispatch (18.4s observed to reach the agent loop). A POST with no runId is
2133
2118
  // rejected by the `_process-run` route before any DB work, so this only keeps
2134
2119
  // the container alive.
2135
- const backgroundWarmPath = isDurableBackgroundEmitRequired()
2120
+ const backgroundEntryPath = path.join(internalDir, AGENT_BACKGROUND_FUNCTION_NAME, `${AGENT_BACKGROUND_FUNCTION_NAME}.mjs`);
2121
+ const backgroundWarmPath = isDurableBackgroundEmitRequired() && fs.existsSync(backgroundEntryPath)
2136
2122
  ? JSON.stringify(AGENT_BACKGROUND_FUNCTION_URL_PATH)
2137
2123
  : "null";
2138
2124
  const entry = `const HEALTH_PATH = "/_agent-native/health";
@@ -3354,19 +3340,21 @@ export default bundle;
3354
3340
  bundleYjsRuntimeForServerlessOutput(nitro.options.output.serverDir, cwd);
3355
3341
  }
3356
3342
  if (preset === "netlify") {
3357
- emitSingleTemplateNetlifyKeepWarmFunction(cwd);
3358
- // Durable background agent runs (default-OFF / opt-in; enable with a truthy
3359
- // AGENT_CHAT_DURABLE_BACKGROUND). Additive ONLY: emits a SECOND Netlify
3360
- // function whose name ends in `-background` re-exporting the same handler
3361
- // bundle, so the chat `_process-run` POST lands on Netlify's async (15-min)
3362
- // function. When not opted in this is a no-op and the single-function
3363
- // deploy is byte-for-byte unchanged.
3343
+ // Durable background agent runs are default-on for Netlify; a falsy
3344
+ // AGENT_CHAT_DURABLE_BACKGROUND value opts out. Additive ONLY: emits a
3345
+ // SECOND Netlify function whose name ends in `-background` re-exporting the
3346
+ // same handler bundle, so the chat `_process-run` POST lands on Netlify's
3347
+ // async (15-min) function. When opted out this is a no-op and the
3348
+ // single-function deploy is byte-for-byte unchanged.
3364
3349
  // NOT wrapped in try/catch: this block only runs when the runtime depends
3365
3350
  // on the function, and a swallowed failure ships an app that loses the
3366
3351
  // background budget for the life of the deploy with nothing in the log.
3367
3352
  if (isDurableBackgroundEmitRequired()) {
3368
3353
  emitSingleTemplateNetlifyBackgroundFunction(cwd);
3369
3354
  }
3355
+ // Emit keep-warm after the background artifact so it only pings a function
3356
+ // that this build actually produced.
3357
+ emitSingleTemplateNetlifyKeepWarmFunction(cwd);
3370
3358
  if (isIntegrationDurableDispatchDeployEnabled()) {
3371
3359
  try {
3372
3360
  emitSingleTemplateNetlifyIntegrationRecoveryFunction(cwd);