@agent-native/core 0.52.0 → 0.54.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/README.md +41 -95
  2. package/blueprints/action/crud.md +98 -0
  3. package/blueprints/channel/discord.md +74 -0
  4. package/blueprints/provider/stripe.md +87 -0
  5. package/blueprints/sandbox/docker.md +78 -0
  6. package/dist/action.d.ts +64 -1
  7. package/dist/action.d.ts.map +1 -1
  8. package/dist/action.js +73 -2
  9. package/dist/action.js.map +1 -1
  10. package/dist/agent/index.d.ts +1 -0
  11. package/dist/agent/index.d.ts.map +1 -1
  12. package/dist/agent/index.js +1 -0
  13. package/dist/agent/index.js.map +1 -1
  14. package/dist/agent/observational-memory/compactor.d.ts +43 -0
  15. package/dist/agent/observational-memory/compactor.d.ts.map +1 -0
  16. package/dist/agent/observational-memory/compactor.js +50 -0
  17. package/dist/agent/observational-memory/compactor.js.map +1 -0
  18. package/dist/agent/observational-memory/config.d.ts +37 -0
  19. package/dist/agent/observational-memory/config.d.ts.map +1 -0
  20. package/dist/agent/observational-memory/config.js +48 -0
  21. package/dist/agent/observational-memory/config.js.map +1 -0
  22. package/dist/agent/observational-memory/index.d.ts +26 -0
  23. package/dist/agent/observational-memory/index.d.ts.map +1 -0
  24. package/dist/agent/observational-memory/index.js +25 -0
  25. package/dist/agent/observational-memory/index.js.map +1 -0
  26. package/dist/agent/observational-memory/internal-run.d.ts +37 -0
  27. package/dist/agent/observational-memory/internal-run.d.ts.map +1 -0
  28. package/dist/agent/observational-memory/internal-run.js +59 -0
  29. package/dist/agent/observational-memory/internal-run.js.map +1 -0
  30. package/dist/agent/observational-memory/message-text.d.ts +13 -0
  31. package/dist/agent/observational-memory/message-text.d.ts.map +1 -0
  32. package/dist/agent/observational-memory/message-text.js +46 -0
  33. package/dist/agent/observational-memory/message-text.js.map +1 -0
  34. package/dist/agent/observational-memory/migrations.d.ts +13 -0
  35. package/dist/agent/observational-memory/migrations.d.ts.map +1 -0
  36. package/dist/agent/observational-memory/migrations.js +43 -0
  37. package/dist/agent/observational-memory/migrations.js.map +1 -0
  38. package/dist/agent/observational-memory/observer.d.ts +37 -0
  39. package/dist/agent/observational-memory/observer.d.ts.map +1 -0
  40. package/dist/agent/observational-memory/observer.js +82 -0
  41. package/dist/agent/observational-memory/observer.js.map +1 -0
  42. package/dist/agent/observational-memory/plugin.d.ts +16 -0
  43. package/dist/agent/observational-memory/plugin.d.ts.map +1 -0
  44. package/dist/agent/observational-memory/plugin.js +26 -0
  45. package/dist/agent/observational-memory/plugin.js.map +1 -0
  46. package/dist/agent/observational-memory/prompts.d.ts +27 -0
  47. package/dist/agent/observational-memory/prompts.d.ts.map +1 -0
  48. package/dist/agent/observational-memory/prompts.js +42 -0
  49. package/dist/agent/observational-memory/prompts.js.map +1 -0
  50. package/dist/agent/observational-memory/read.d.ts +45 -0
  51. package/dist/agent/observational-memory/read.d.ts.map +1 -0
  52. package/dist/agent/observational-memory/read.js +97 -0
  53. package/dist/agent/observational-memory/read.js.map +1 -0
  54. package/dist/agent/observational-memory/reflector.d.ts +31 -0
  55. package/dist/agent/observational-memory/reflector.d.ts.map +1 -0
  56. package/dist/agent/observational-memory/reflector.js +76 -0
  57. package/dist/agent/observational-memory/reflector.js.map +1 -0
  58. package/dist/agent/observational-memory/schema.d.ts +267 -0
  59. package/dist/agent/observational-memory/schema.d.ts.map +1 -0
  60. package/dist/agent/observational-memory/schema.js +48 -0
  61. package/dist/agent/observational-memory/schema.js.map +1 -0
  62. package/dist/agent/observational-memory/store.d.ts +52 -0
  63. package/dist/agent/observational-memory/store.d.ts.map +1 -0
  64. package/dist/agent/observational-memory/store.js +197 -0
  65. package/dist/agent/observational-memory/store.js.map +1 -0
  66. package/dist/agent/observational-memory/types.d.ts +61 -0
  67. package/dist/agent/observational-memory/types.d.ts.map +1 -0
  68. package/dist/agent/observational-memory/types.js +9 -0
  69. package/dist/agent/observational-memory/types.js.map +1 -0
  70. package/dist/agent/processors.d.ts +146 -0
  71. package/dist/agent/processors.d.ts.map +1 -0
  72. package/dist/agent/processors.js +122 -0
  73. package/dist/agent/processors.js.map +1 -0
  74. package/dist/agent/production-agent.d.ts +25 -0
  75. package/dist/agent/production-agent.d.ts.map +1 -1
  76. package/dist/agent/production-agent.js +341 -1
  77. package/dist/agent/production-agent.js.map +1 -1
  78. package/dist/agent/run-loop-with-resume.d.ts.map +1 -1
  79. package/dist/agent/run-loop-with-resume.js +48 -0
  80. package/dist/agent/run-loop-with-resume.js.map +1 -1
  81. package/dist/agent/run-store.d.ts +17 -0
  82. package/dist/agent/run-store.d.ts.map +1 -1
  83. package/dist/agent/run-store.js +55 -0
  84. package/dist/agent/run-store.js.map +1 -1
  85. package/dist/agent/runtime-context.d.ts +30 -0
  86. package/dist/agent/runtime-context.d.ts.map +1 -1
  87. package/dist/agent/runtime-context.js +54 -1
  88. package/dist/agent/runtime-context.js.map +1 -1
  89. package/dist/agent/tool-call-journal.d.ts +99 -0
  90. package/dist/agent/tool-call-journal.d.ts.map +1 -0
  91. package/dist/agent/tool-call-journal.js +212 -0
  92. package/dist/agent/tool-call-journal.js.map +1 -0
  93. package/dist/agent/types.d.ts +35 -0
  94. package/dist/agent/types.d.ts.map +1 -1
  95. package/dist/agent/types.js.map +1 -1
  96. package/dist/cli/add.d.ts +109 -0
  97. package/dist/cli/add.d.ts.map +1 -0
  98. package/dist/cli/add.js +352 -0
  99. package/dist/cli/add.js.map +1 -0
  100. package/dist/cli/connect.d.ts +2 -2
  101. package/dist/cli/connect.d.ts.map +1 -1
  102. package/dist/cli/connect.js +92 -24
  103. package/dist/cli/connect.js.map +1 -1
  104. package/dist/cli/eval.d.ts +17 -0
  105. package/dist/cli/eval.d.ts.map +1 -0
  106. package/dist/cli/eval.js +121 -0
  107. package/dist/cli/eval.js.map +1 -0
  108. package/dist/cli/index.js +44 -3
  109. package/dist/cli/index.js.map +1 -1
  110. package/dist/cli/mcp.d.ts.map +1 -1
  111. package/dist/cli/mcp.js +11 -5
  112. package/dist/cli/mcp.js.map +1 -1
  113. package/dist/cli/plan-local.d.ts +66 -5
  114. package/dist/cli/plan-local.d.ts.map +1 -1
  115. package/dist/cli/plan-local.js +622 -21
  116. package/dist/cli/plan-local.js.map +1 -1
  117. package/dist/cli/skills.d.ts +2 -2
  118. package/dist/cli/skills.d.ts.map +1 -1
  119. package/dist/cli/skills.js +108 -62
  120. package/dist/cli/skills.js.map +1 -1
  121. package/dist/client/AssistantChat.d.ts.map +1 -1
  122. package/dist/client/AssistantChat.js +118 -92
  123. package/dist/client/AssistantChat.js.map +1 -1
  124. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  125. package/dist/client/agent-chat-adapter.js +16 -0
  126. package/dist/client/agent-chat-adapter.js.map +1 -1
  127. package/dist/client/chat/tool-call-display.d.ts +20 -1
  128. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  129. package/dist/client/chat/tool-call-display.js +32 -7
  130. package/dist/client/chat/tool-call-display.js.map +1 -1
  131. package/dist/client/sse-event-processor.d.ts +13 -0
  132. package/dist/client/sse-event-processor.d.ts.map +1 -1
  133. package/dist/client/sse-event-processor.js +21 -0
  134. package/dist/client/sse-event-processor.js.map +1 -1
  135. package/dist/coding-tools/run-code.d.ts.map +1 -1
  136. package/dist/coding-tools/run-code.js +18 -2
  137. package/dist/coding-tools/run-code.js.map +1 -1
  138. package/dist/db/client.d.ts +4 -2
  139. package/dist/db/client.d.ts.map +1 -1
  140. package/dist/db/client.js +6 -4
  141. package/dist/db/client.js.map +1 -1
  142. package/dist/deploy/route-discovery.d.ts.map +1 -1
  143. package/dist/deploy/route-discovery.js +1 -0
  144. package/dist/deploy/route-discovery.js.map +1 -1
  145. package/dist/eval/agent-runner.d.ts +63 -0
  146. package/dist/eval/agent-runner.d.ts.map +1 -0
  147. package/dist/eval/agent-runner.js +142 -0
  148. package/dist/eval/agent-runner.js.map +1 -0
  149. package/dist/eval/define-eval.d.ts +29 -0
  150. package/dist/eval/define-eval.d.ts.map +1 -0
  151. package/dist/eval/define-eval.js +43 -0
  152. package/dist/eval/define-eval.js.map +1 -0
  153. package/dist/eval/index.d.ts +18 -0
  154. package/dist/eval/index.d.ts.map +1 -0
  155. package/dist/eval/index.js +17 -0
  156. package/dist/eval/index.js.map +1 -0
  157. package/dist/eval/report.d.ts +8 -0
  158. package/dist/eval/report.d.ts.map +1 -0
  159. package/dist/eval/report.js +44 -0
  160. package/dist/eval/report.js.map +1 -0
  161. package/dist/eval/runner.d.ts +67 -0
  162. package/dist/eval/runner.d.ts.map +1 -0
  163. package/dist/eval/runner.js +256 -0
  164. package/dist/eval/runner.js.map +1 -0
  165. package/dist/eval/scorer.d.ts +83 -0
  166. package/dist/eval/scorer.d.ts.map +1 -0
  167. package/dist/eval/scorer.js +195 -0
  168. package/dist/eval/scorer.js.map +1 -0
  169. package/dist/eval/types.d.ts +162 -0
  170. package/dist/eval/types.d.ts.map +1 -0
  171. package/dist/eval/types.js +20 -0
  172. package/dist/eval/types.js.map +1 -0
  173. package/dist/extensions/fetch-tool.d.ts.map +1 -1
  174. package/dist/extensions/fetch-tool.js +80 -15
  175. package/dist/extensions/fetch-tool.js.map +1 -1
  176. package/dist/extensions/web-content.d.ts +61 -0
  177. package/dist/extensions/web-content.d.ts.map +1 -0
  178. package/dist/extensions/web-content.js +468 -0
  179. package/dist/extensions/web-content.js.map +1 -0
  180. package/dist/extensions/web-search-tool.js +3 -3
  181. package/dist/extensions/web-search-tool.js.map +1 -1
  182. package/dist/mcp/build-server.d.ts.map +1 -1
  183. package/dist/mcp/build-server.js +4 -1
  184. package/dist/mcp/build-server.js.map +1 -1
  185. package/dist/observability/traces.d.ts.map +1 -1
  186. package/dist/observability/traces.js +100 -1
  187. package/dist/observability/traces.js.map +1 -1
  188. package/dist/observability/tracing.d.ts +73 -0
  189. package/dist/observability/tracing.d.ts.map +1 -0
  190. package/dist/observability/tracing.js +126 -0
  191. package/dist/observability/tracing.js.map +1 -0
  192. package/dist/onboarding/default-steps.d.ts.map +1 -1
  193. package/dist/onboarding/default-steps.js +4 -1
  194. package/dist/onboarding/default-steps.js.map +1 -1
  195. package/dist/provider-api/actions/query-staged-dataset.d.ts +1 -1
  196. package/dist/provider-api/corpus-jobs.d.ts +80 -0
  197. package/dist/provider-api/corpus-jobs.d.ts.map +1 -1
  198. package/dist/provider-api/corpus-jobs.js +219 -22
  199. package/dist/provider-api/corpus-jobs.js.map +1 -1
  200. package/dist/provider-api/index.d.ts +24 -32
  201. package/dist/provider-api/index.d.ts.map +1 -1
  202. package/dist/provider-api/index.js +28 -1
  203. package/dist/provider-api/index.js.map +1 -1
  204. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  205. package/dist/scripts/agent-engines/list-agent-engines.js +10 -3
  206. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  207. package/dist/server/action-discovery.d.ts.map +1 -1
  208. package/dist/server/action-discovery.js +4 -0
  209. package/dist/server/action-discovery.js.map +1 -1
  210. package/dist/server/agent-chat-plugin.d.ts +9 -0
  211. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  212. package/dist/server/agent-chat-plugin.js +119 -111
  213. package/dist/server/agent-chat-plugin.js.map +1 -1
  214. package/dist/server/agent-teams.d.ts +62 -0
  215. package/dist/server/agent-teams.d.ts.map +1 -1
  216. package/dist/server/agent-teams.js +99 -2
  217. package/dist/server/agent-teams.js.map +1 -1
  218. package/dist/server/better-auth-instance.d.ts +7 -0
  219. package/dist/server/better-auth-instance.d.ts.map +1 -1
  220. package/dist/server/better-auth-instance.js +90 -0
  221. package/dist/server/better-auth-instance.js.map +1 -1
  222. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  223. package/dist/server/core-routes-plugin.js +7 -4
  224. package/dist/server/core-routes-plugin.js.map +1 -1
  225. package/dist/server/credential-provider.d.ts.map +1 -1
  226. package/dist/server/credential-provider.js +2 -0
  227. package/dist/server/credential-provider.js.map +1 -1
  228. package/dist/server/deep-link.d.ts +7 -0
  229. package/dist/server/deep-link.d.ts.map +1 -1
  230. package/dist/server/deep-link.js +13 -2
  231. package/dist/server/deep-link.js.map +1 -1
  232. package/dist/server/framework-request-handler.d.ts.map +1 -1
  233. package/dist/server/framework-request-handler.js +33 -1
  234. package/dist/server/framework-request-handler.js.map +1 -1
  235. package/dist/server/index.d.ts +2 -1
  236. package/dist/server/index.d.ts.map +1 -1
  237. package/dist/server/index.js +2 -1
  238. package/dist/server/index.js.map +1 -1
  239. package/dist/templates/default/.agents/skills/actions/SKILL.md +52 -1
  240. package/dist/templates/default/.agents/skills/security/SKILL.md +22 -0
  241. package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +52 -1
  242. package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +16 -4
  243. package/dist/templates/workspace-core/.agents/skills/harness-agents/SKILL.md +20 -0
  244. package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +31 -0
  245. package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +22 -0
  246. package/docs/content/actions.md +50 -0
  247. package/docs/content/agent-teams.md +32 -0
  248. package/docs/content/blueprint-installer.md +73 -0
  249. package/docs/content/durable-resume.md +49 -0
  250. package/docs/content/evals.md +141 -0
  251. package/docs/content/external-agents.md +2 -2
  252. package/docs/content/human-approval.md +101 -0
  253. package/docs/content/observability.md +21 -0
  254. package/docs/content/observational-memory.md +63 -0
  255. package/docs/content/plan-plugin.md +5 -0
  256. package/docs/content/pr-visual-recap.md +9 -5
  257. package/docs/content/processors.md +99 -0
  258. package/docs/content/sandbox-adapters.md +134 -0
  259. package/docs/content/template-plan.md +97 -21
  260. package/package.json +10 -1
  261. package/src/templates/default/.agents/skills/actions/SKILL.md +52 -1
  262. package/src/templates/default/.agents/skills/security/SKILL.md +22 -0
  263. package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +52 -1
  264. package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +16 -4
  265. package/src/templates/workspace-core/.agents/skills/harness-agents/SKILL.md +20 -0
  266. package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +31 -0
  267. package/src/templates/workspace-core/.agents/skills/security/SKILL.md +22 -0
@@ -25,8 +25,10 @@ export interface DbExecConfig {
25
25
  * Resolve the database URL for the current app.
26
26
  *
27
27
  * Checks for `<APP_NAME>_DATABASE_URL` first (e.g. `MAIL_DATABASE_URL`),
28
- * then falls back to `DATABASE_URL`. This allows multiple apps to run in the
29
- * same process group (e.g. eager repo dev or builder.io) with separate databases.
28
+ * then falls back to `DATABASE_URL`, then Netlify's managed database env. This
29
+ * allows multiple apps to run in the same process group (e.g. eager repo dev or
30
+ * builder.io) with separate databases while still using the persistent Netlify
31
+ * runtime database when `DATABASE_URL` was only exported for the build command.
30
32
  *
31
33
  * Set `APP_NAME=mail` in the child process env and
32
34
  * `MAIL_DATABASE_URL=postgres://...` in the shared env.
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"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"}
package/dist/db/client.js CHANGED
@@ -18,8 +18,10 @@ const loggedNeonPools = new WeakSet();
18
18
  * Resolve the database URL for the current app.
19
19
  *
20
20
  * Checks for `<APP_NAME>_DATABASE_URL` first (e.g. `MAIL_DATABASE_URL`),
21
- * then falls back to `DATABASE_URL`. This allows multiple apps to run in the
22
- * same process group (e.g. eager repo dev or builder.io) with separate databases.
21
+ * then falls back to `DATABASE_URL`, then Netlify's managed database env. This
22
+ * allows multiple apps to run in the same process group (e.g. eager repo dev or
23
+ * builder.io) with separate databases while still using the persistent Netlify
24
+ * runtime database when `DATABASE_URL` was only exported for the build command.
23
25
  *
24
26
  * Set `APP_NAME=mail` in the child process env and
25
27
  * `MAIL_DATABASE_URL=postgres://...` in the shared env.
@@ -31,7 +33,7 @@ export function getDatabaseUrl(fallback = "") {
31
33
  if (prefixed)
32
34
  return prefixed;
33
35
  }
34
- return process.env.DATABASE_URL || fallback;
36
+ return (process.env.DATABASE_URL || process.env.NETLIFY_DATABASE_URL || fallback);
35
37
  }
36
38
  /** Same per-app resolution for DATABASE_AUTH_TOKEN (used by Turso/libsql). */
37
39
  export function getDatabaseAuthToken() {
@@ -41,7 +43,7 @@ export function getDatabaseAuthToken() {
41
43
  if (prefixed)
42
44
  return prefixed;
43
45
  }
44
- return process.env.DATABASE_AUTH_TOKEN;
46
+ return (process.env.DATABASE_AUTH_TOKEN || process.env.NETLIFY_DATABASE_AUTH_TOKEN);
45
47
  }
46
48
  /**
47
49
  * Database URL to use for migrations — identical to DATABASE_URL but with the
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Central database client abstraction.\n *\n * Detects the database backend from the environment (D1, Postgres, or SQLite/libsql)\n * and returns a unified `DbExec` interface that all core stores use.\n *\n * Imports for postgres, better-sqlite3, and @libsql/client/web are lazy\n * (dynamic import) so this module can be loaded in any runtime (Node.js,\n * Cloudflare Workers, edge) without failing on missing native deps.\n */\nimport path from \"path\";\n\nconst recyclingPostgresPools = new WeakSet<object>();\nconst loggedNeonPools = new WeakSet<object>();\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type Dialect = \"sqlite\" | \"postgres\" | \"d1\";\n\nexport interface DbExec {\n execute(\n sql: string | { sql: string; args?: unknown[] },\n ): Promise<{ rows: any[]; rowsAffected: number }>;\n transaction?<T>(fn: (tx: DbExec) => Promise<T>): Promise<T>;\n /**\n * Release the underlying connection/pool held by this exec.\n * Only non-singleton execs created via `createDbExec()` (e.g. the migration\n * direct-endpoint exec) should call this. The global singleton exec (`getDbExec`)\n * is managed by `closeDbExec()` instead.\n */\n close?(): Promise<void>;\n}\n\nexport interface DbExecConfig {\n url?: string;\n authToken?: string;\n d1Binding?: any;\n}\n\n// ---------------------------------------------------------------------------\n// Per-app DATABASE_URL resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the database URL for the current app.\n *\n * Checks for `<APP_NAME>_DATABASE_URL` first (e.g. `MAIL_DATABASE_URL`),\n * then falls back to `DATABASE_URL`. This allows multiple apps to run in the\n * same process group (e.g. eager repo dev or builder.io) with separate databases.\n *\n * Set `APP_NAME=mail` in the child process env and\n * `MAIL_DATABASE_URL=postgres://...` in the shared env.\n */\nexport function getDatabaseUrl(fallback = \"\"): string {\n const appName = process.env.APP_NAME?.toUpperCase().replace(/-/g, \"_\");\n if (appName) {\n const prefixed = process.env[`${appName}_DATABASE_URL`];\n if (prefixed) return prefixed;\n }\n return process.env.DATABASE_URL || fallback;\n}\n\n/** Same per-app resolution for DATABASE_AUTH_TOKEN (used by Turso/libsql). */\nexport function getDatabaseAuthToken(): string | undefined {\n const appName = process.env.APP_NAME?.toUpperCase().replace(/-/g, \"_\");\n if (appName) {\n const prefixed = process.env[`${appName}_DATABASE_AUTH_TOKEN`];\n if (prefixed) return prefixed;\n }\n return process.env.DATABASE_AUTH_TOKEN;\n}\n\n/**\n * Database URL to use for migrations — identical to DATABASE_URL but with the\n * Neon connection-pooler suffix stripped. Neon's PgBouncer runs in transaction\n * mode, which resets session-level ownership after each statement and causes\n * `ALTER TABLE … ADD COLUMN` to fail with \"must be owner of table <x>\" even\n * when the connecting role owns it. The direct endpoint bypasses PgBouncer so\n * DDL honours the role's actual ownership.\n *\n * Non-Neon URLs and already-direct Neon URLs are returned unchanged.\n */\nexport function getMigrationDatabaseUrl(): string {\n const url = getDatabaseUrl();\n // Neon pooler hostname: ep-<id>-pooler.<region>.<cloud>.neon.tech\n // Direct hostname: ep-<id>.<region>.<cloud>.neon.tech\n // The region between `-pooler.` and `.neon.tech` can contain multiple\n // dot-separated labels (e.g. `c-7.us-east-1.aws`), so the matched segment\n // must allow dots — `[a-z0-9.-]+` — not just a single label. Anchoring on the\n // stable `.neon.tech` suffix keeps this from touching non-Neon hosts.\n return url.replace(/-pooler(\\.[a-z0-9.-]+\\.neon\\.tech)/, \"$1\");\n}\n\nexport function isLocalSqliteUrl(url: string): boolean {\n return url === \"\" || url.startsWith(\"file:\") || !url.includes(\"://\");\n}\n\nexport async function prepareLocalSqliteUrl(url: string): Promise<string> {\n if (!url.startsWith(\"file:\")) return url;\n\n // On serverless runtimes (Netlify / Vercel / AWS Lambda / CF Pages) the\n // working directory is read-only. Detect this and redirect local SQLite to\n // /tmp which IS writable (ephemeral per invocation, but the server stays\n // alive for the request). Shares the canonical isServerlessRuntime() check.\n const isServerless = isServerlessRuntime();\n try {\n const fs = await import(\"fs\");\n if (isServerless && url === \"file:./data/app.db\") {\n fs.mkdirSync(\"/tmp/data\", { recursive: true });\n return \"file:///tmp/data/app.db\";\n }\n fs.mkdirSync(path.join(process.cwd(), \"data\"), { recursive: true });\n } catch {\n // Edge runtime — no filesystem.\n }\n return url;\n}\n\nexport function sqliteFilenameFromUrl(url: string): string {\n if (url.startsWith(\"file://\")) {\n return decodeURIComponent(new URL(url).pathname);\n }\n if (url.startsWith(\"file:\")) {\n return url.slice(\"file:\".length) || \":memory:\";\n }\n return url || \"./data/app.db\";\n}\n\n// ---------------------------------------------------------------------------\n// Safe JSON column parsing\n// ---------------------------------------------------------------------------\n\n/**\n * Parse a JSON-serialized column value defensively. A malformed row — from a\n * hand-edit, dirty migration, or a misbehaving agent that wrote raw SQL —\n * must not break an entire list endpoint. Callers supply a fallback for the\n * malformed path; null/undefined values also fall back.\n */\nexport function safeJsonParse<T>(value: unknown, fallback: T): T {\n if (value == null) return fallback;\n try {\n return JSON.parse(String(value)) as T;\n } catch {\n return fallback;\n }\n}\n\n// ---------------------------------------------------------------------------\n// SQLite retry helper\n// ---------------------------------------------------------------------------\n\n/**\n * Retry an async operation when it fails with SQLITE_BUSY.\n * Used during WAL initialization and migrations where a stale WAL from a\n * previous crash or HMR restart can briefly lock the database.\n */\nexport async function retrySqliteBusy<T>(\n fn: () => Promise<T>,\n opts: { maxAttempts?: number; baseDelayMs?: number; rethrow?: boolean } = {},\n): Promise<T> {\n const { maxAttempts = 5, baseDelayMs = 500, rethrow = false } = opts;\n let last: unknown;\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (e: any) {\n last = e;\n const msg = String(e?.message || e);\n if (msg.includes(\"SQLITE_BUSY\") && attempt < maxAttempts - 1) {\n await new Promise((r) => setTimeout(r, baseDelayMs * (attempt + 1)));\n } else {\n break;\n }\n }\n }\n if (rethrow) throw last;\n return undefined as unknown as T; // caller handles undefined (e.g. PRAGMA setup)\n}\n\n/**\n * Retry a DDL statement (CREATE TABLE, CREATE INDEX) once when it fails due\n * to a Postgres pg_catalog race.\n *\n * Postgres's `IF NOT EXISTS` check is NOT atomic with the `pg_type` /\n * `pg_class` catalog insert. When multiple processes boot concurrently and\n * issue the same CREATE, both can pass the existence check and one fails\n * with code 23505 on `pg_type_typname_nsp_index` or similar. The table does\n * end up created by the winner, so rerunning the same `IF NOT EXISTS`\n * statement is a safe no-op.\n */\nexport async function retryOnDdlRace<T>(fn: () => Promise<T>): Promise<T> {\n try {\n return await fn();\n } catch (e: any) {\n if (!isPgCatalogRace(e)) throw e;\n return await fn();\n }\n}\n\nfunction isPgCatalogRace(e: any): boolean {\n if (e?.code === \"42P07\") return true;\n if (e?.code !== \"23505\") return false;\n const constraint = String(e?.constraint_name ?? e?.constraint ?? \"\");\n const detail = String(e?.detail ?? \"\");\n const msg = String(e?.message ?? \"\");\n return (\n constraint.startsWith(\"pg_type\") ||\n constraint.startsWith(\"pg_class\") ||\n detail.includes(\"pg_type\") ||\n detail.includes(\"pg_class\") ||\n /relation .* already exists/i.test(msg)\n );\n}\n\n/**\n * True when `e` is a UNIQUE / PRIMARY KEY constraint violation from any\n * supported driver (Postgres 23505, SQLite SQLITE_CONSTRAINT_PRIMARYKEY /\n * _UNIQUE, D1). Used by stores that accept caller-provided ids and want to\n * surface a clean \"already exists\" error instead of the raw SQL text.\n */\nexport function isUniqueViolation(e: any): boolean {\n if (e?.code === \"23505\") return true;\n const code = String(e?.code ?? \"\");\n if (\n code === \"SQLITE_CONSTRAINT_PRIMARYKEY\" ||\n code === \"SQLITE_CONSTRAINT_UNIQUE\"\n ) {\n return true;\n }\n const msg = String(e?.message ?? \"\").toLowerCase();\n return (\n msg.includes(\"unique constraint\") ||\n msg.includes(\"primary key constraint\") ||\n msg.includes(\"duplicate key\")\n );\n}\n\n// ---------------------------------------------------------------------------\n// Dialect detection\n// ---------------------------------------------------------------------------\n\nlet _dialect: Dialect | undefined;\n\nexport function getDialect(): Dialect {\n if (_dialect !== undefined) return _dialect;\n\n // DATABASE_URL takes priority over D1 when set.\n const url = getDatabaseUrl();\n if (url.startsWith(\"postgres://\") || url.startsWith(\"postgresql://\")) {\n _dialect = \"postgres\";\n return _dialect;\n }\n if (url && !url.startsWith(\"file:\")) {\n // Remote libsql (e.g. Turso)\n _dialect = \"sqlite\";\n return _dialect;\n }\n\n const d1 = globalThis.__cf_env?.DB;\n if (d1) {\n _dialect = \"d1\";\n return _dialect;\n }\n\n // Don't cache the fallthrough — on CF Workers, env bindings (__cf_env) aren't\n // available at import time. If we cache \"sqlite\" here, D1 will never be\n // detected once the bindings are set in the fetch handler.\n return \"sqlite\";\n}\n\nexport function isPostgres(): boolean {\n return getDialect() === \"postgres\";\n}\n\nfunction dialectForConfig(config: DbExecConfig): Dialect {\n const url = config.url ?? \"\";\n if (url.startsWith(\"postgres://\") || url.startsWith(\"postgresql://\")) {\n return \"postgres\";\n }\n if (url && !url.startsWith(\"file:\")) {\n return \"sqlite\";\n }\n if (config.d1Binding) {\n return \"d1\";\n }\n return \"sqlite\";\n}\n\n/**\n * Returns true when the database is a local-only SQLite file (or unset, which\n * defaults to a local SQLite file). Returns false for Postgres, remote libsql\n * (Turso), and D1 — any backend that could be shared across developers.\n *\n * Used to gate local@localhost mode: that mode uses a single shared virtual\n * user with no per-machine scoping, so on any shared database two developers\n * would read and write each other's settings, oauth tokens, and app state.\n */\nexport function isLocalDatabase(): boolean {\n if (getDialect() !== \"sqlite\") return false;\n const url = getDatabaseUrl();\n return url === \"\" || url.startsWith(\"file:\");\n}\n\n/** Returns BIGINT for Postgres (64-bit), INTEGER for SQLite (already 64-bit). */\nexport function intType(): string {\n return isPostgres() ? \"BIGINT\" : \"INTEGER\";\n}\n\n// ---------------------------------------------------------------------------\n// Parameter conversion: ? -> $1, $2, $3\n// ---------------------------------------------------------------------------\n\nfunction sqliteToPostgresParams(sql: string): string {\n let i = 0;\n return sql.replace(/\\?/g, () => `$${++i}`);\n}\n\nfunction sqlAndArgs(sql: string | { sql: string; args?: unknown[] }): {\n rawSql: string;\n args: unknown[];\n} {\n return typeof sql === \"string\"\n ? { rawSql: sql, args: [] }\n : { rawSql: sql.sql, args: sql.args || [] };\n}\n\nfunction explicitTransaction(\n execute: DbExec[\"execute\"],\n begin = \"BEGIN\",\n): NonNullable<DbExec[\"transaction\"]> {\n return async (fn) => {\n await execute(begin);\n try {\n const result = await fn({ execute });\n await execute(\"COMMIT\");\n return result;\n } catch (err) {\n await execute(\"ROLLBACK\").catch(() => {});\n throw err;\n }\n };\n}\n\n// ---------------------------------------------------------------------------\n// Connection error retry (ECONNRESET, etc.)\n// ---------------------------------------------------------------------------\n\n/** Error codes that indicate a dead/stale connection we can safely retry. */\nconst CONNECTION_ERROR_CODES = new Set([\n \"ECONNRESET\",\n \"ETIMEDOUT\",\n \"EPIPE\",\n \"ENOTFOUND\",\n \"CONNECT_TIMEOUT\",\n \"CONNECTION_ENDED\",\n \"CONNECTION_DESTROYED\",\n \"CONNECTION_CLOSED\",\n]);\n\nexport function isConnectionError(err: any): boolean {\n if (!err) return false;\n const code = err.code || err.cause?.code;\n if (code && CONNECTION_ERROR_CODES.has(code)) return true;\n // Neon serverless WS driver: errors from the underlying undici WebSocket\n // closing mid-query come through as TypeError or ErrorEvent without a code.\n const name = err.name || err.cause?.name || \"\";\n if (name === \"ErrorEvent\") return true;\n const stack = String(err.stack || err.cause?.stack || \"\");\n if (\n /WebSocket\\.#onSocketClose|failWebsocketConnection|onSocketClose/.test(\n stack,\n )\n ) {\n return true;\n }\n const msg = String(err.message || err.cause?.message || \"\");\n return /ECONNRESET|ETIMEDOUT|EPIPE|connection.*(closed|ended|terminated)|socket hang up|websocket/i.test(\n msg,\n );\n}\n\nexport async function retryOnConnectionError<T>(\n fn: () => Promise<T>,\n maxAttempts = 3,\n): Promise<T> {\n let last: unknown;\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (e) {\n last = e;\n if (!isConnectionError(e) || attempt === maxAttempts - 1) throw e;\n await new Promise((r) => setTimeout(r, 100 * (attempt + 1)));\n }\n }\n throw last;\n}\n\n// ---------------------------------------------------------------------------\n// Per-op timeout — converts a silent serverless hang into a retryable error\n// ---------------------------------------------------------------------------\n\n/**\n * Max wall time for a single DB op (init or query) before we treat it as a\n * dead connection. A frozen→thawed serverless instance can leave the Neon\n * WebSocket (or a postgres.js socket) hung mid-flight: the promise neither\n * settles nor errors, so retryOnConnectionError() — which only retries thrown\n * errors — can't help and the request hangs until the platform kills the\n * function (~30s on Netlify). For authenticated requests that run a session\n * lookup on every navigation this surfaces as \"the site won't load\". Bounding\n * each op well under the platform function limit turns the silent hang into a\n * CONNECT_TIMEOUT that the existing retry and reject-reset paths already\n * handle. Override with DB_OP_TIMEOUT_MS.\n */\nexport function dbOpTimeoutMs(): number {\n const raw = Number(process.env.DB_OP_TIMEOUT_MS);\n if (Number.isFinite(raw) && raw > 0) return raw;\n return isServerlessRuntime() ? 8_000 : 30_000;\n}\n\n/**\n * Timeout error tagged with a recognized connection-error code so\n * isConnectionError() / retryOnConnectionError() treat a hung op as a\n * retryable dead connection, and upstream reject-reset guards (e.g. the\n * cached session-table init promise) clear their poisoned state.\n */\nclass DbTimeoutError extends Error {\n code = \"CONNECT_TIMEOUT\";\n constructor(op: string, ms: number) {\n super(`DB ${op} timed out after ${ms}ms (connection terminated)`);\n this.name = \"DbTimeoutError\";\n }\n}\n\n/**\n * Race a DB op against {@link dbOpTimeoutMs}. Callers that own a cancellable\n * query or pooled client should pass onTimeout so the losing operation does\n * not keep occupying a scarce connection slot after the request has recovered.\n */\nexport async function withDbTimeout<T>(\n op: string,\n run: () => Promise<T>,\n ms = dbOpTimeoutMs(),\n onTimeout?: () => void | Promise<void>,\n): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n let settled = false;\n\n const runCleanup = async () => {\n if (!onTimeout) return;\n try {\n await onTimeout();\n } catch (err) {\n console.warn(\n `[db] timeout cleanup for ${op} failed:`,\n err instanceof Error ? err.message : err,\n );\n }\n };\n\n return await new Promise<T>((resolve, reject) => {\n const finish = (\n complete: (value: T | PromiseLike<T>) => void,\n value: T | PromiseLike<T>,\n ) => {\n if (settled) return;\n settled = true;\n if (timer) clearTimeout(timer);\n complete(value);\n };\n const fail = (err: unknown) => {\n if (settled) return;\n settled = true;\n if (timer) clearTimeout(timer);\n reject(err);\n };\n\n timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n void (async () => {\n await runCleanup();\n reject(new DbTimeoutError(op, ms));\n })();\n }, ms);\n\n let promise: Promise<T>;\n try {\n promise = run();\n } catch (err) {\n fail(err);\n return;\n }\n promise.then((value) => finish(resolve, value), fail);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Serverless-aware Postgres pool options\n// ---------------------------------------------------------------------------\n\n/**\n * True on serverless function runtimes (Netlify / Vercel / AWS Lambda /\n * Cloudflare Pages Functions) where every concurrent request can spin up its\n * own frozen process. Connections cannot be shared across instances, so each\n * instance must keep its pool tiny — otherwise dozens of warm instances each\n * holding postgres.js's default 10-connection pool blow past Neon/Postgres'\n * connection cap and every `/_agent-native/*` route 500s with \"Max client\n * connections reached\".\n */\nexport function isServerlessRuntime(): boolean {\n return (\n !!process.env.NETLIFY ||\n !!process.env.VERCEL ||\n !!process.env.AWS_LAMBDA_FUNCTION_NAME ||\n !!process.env.LAMBDA_TASK_ROOT ||\n !!process.env.CF_PAGES\n );\n}\n\n/**\n * postgres.js pool options tuned per runtime. A serverless instance handles\n * one request at a time, so a tiny pool is enough — but we cap at 2 (not 1)\n * so a single slow query or open transaction can't serialize every other\n * query in the same request. Total connections stay bounded to ≈ 2×\n * concurrent-instance count instead of 10×. idle_timeout is shortened on\n * serverless so a thawed-but-idle instance releases its connections quickly.\n * Long-lived Node servers keep the normal pool for throughput.\n */\nexport function pgPoolOptions(url: string): Record<string, unknown> {\n const serverless = isServerlessRuntime();\n return {\n onnotice: () => {},\n max: serverless ? 2 : 10,\n idle_timeout: serverless ? 20 : 240,\n max_lifetime: 60 * 30,\n connect_timeout: 10,\n // Supabase's connection pooler (Transaction mode) requires prepare:false.\n // Only disable for Supabase URLs to avoid degrading other deployments.\n ...(url.includes(\"supabase\") ? { prepare: false } : {}),\n };\n}\n\n/**\n * Connection cap for the @neondatabase/serverless `Pool`. Same instance\n * accumulation risk as postgres.js — a small pool (2) is enough on serverless\n * and keeps total connections bounded while still letting a second query\n * proceed when one connection is busy.\n */\nexport function neonPoolMax(): number {\n return isServerlessRuntime() ? 2 : 10;\n}\n\n/**\n * Render any rejection reason as a readable message. The Neon serverless\n * driver surfaces WebSocket failures as raw DOM-style ErrorEvent objects (not\n * Error instances), which stringify uselessly as \"[object ErrorEvent]\" — pull\n * the message off the event (or its nested `.error`) instead so logs carry\n * actual context.\n */\nexport function describeDbError(err: unknown): string {\n if (err instanceof Error) return err.message;\n if (err && typeof err === \"object\") {\n const evt = err as {\n message?: unknown;\n error?: { message?: unknown };\n type?: unknown;\n };\n const msg = evt.message ?? evt.error?.message;\n if (typeof msg === \"string\" && msg) return msg;\n if (evt.type === \"error\") {\n return \"WebSocket ErrorEvent (connection failed; no message attached)\";\n }\n }\n return String(err);\n}\n\nexport function attachNeonPoolErrorLogger(\n pool: unknown,\n label = \"db/neon\",\n): void {\n if (!pool || typeof pool !== \"object\") return;\n if (loggedNeonPools.has(pool)) return;\n const withEvents = pool as {\n on?: (event: string, listener: (...args: unknown[]) => void) => unknown;\n };\n if (typeof withEvents.on !== \"function\") return;\n\n loggedNeonPools.add(pool);\n withEvents.on(\"error\", (err: unknown) => {\n console.warn(\n `[${label}] pool error (will reconnect on next query):`,\n describeDbError(err),\n );\n });\n\n // Attach a persistent 'error' listener to EVERY client for its whole lifetime.\n //\n // @neondatabase/serverless mirrors pg-pool, which only keeps its own idle\n // error listener on a client while that client is idle — it REMOVES the\n // listener the moment the client is checked out. So when a checked-out\n // client's WebSocket drops mid-flight (Lambda freeze/thaw, Neon \"terminating\n // connection due to administrator command\", an idle socket the pooler closed),\n // the client emits 'error' with no listener. Node turns an unhandled 'error'\n // EventEmitter event into an uncaught exception, which crashes the whole\n // serverless function. This was by far the single highest-volume production\n // crash (Sentry \"Unhandled error. ()\", mechanism auto.node.onuncaughtexception,\n // culprit neondatabase__serverless). pg routes the failure to the in-flight\n // query independently, so this listener only needs to keep the emit from going\n // unhandled — the dropped client is discarded and the next query reconnects.\n withEvents.on(\"connect\", (client: unknown) => {\n if (!client || typeof client !== \"object\") return;\n const clientEvents = client as {\n on?: (event: string, listener: (...args: unknown[]) => void) => unknown;\n };\n if (typeof clientEvents.on !== \"function\") return;\n clientEvents.on(\"error\", (err: unknown) => {\n console.warn(\n `[${label}] client connection error (connection discarded, next query reconnects):`,\n describeDbError(err),\n );\n });\n });\n}\n\nfunction disposePostgresPoolEventually(\n pool: { end: () => Promise<unknown> },\n label: string,\n): void {\n if (!pool || typeof pool !== \"object\") return;\n if (recyclingPostgresPools.has(pool)) return;\n recyclingPostgresPools.add(pool);\n void pool.end().catch((err: unknown) => {\n console.warn(\n `[db/postgres] ${label} cleanup failed:`,\n err instanceof Error ? err.message : err,\n );\n });\n}\n\n// ---------------------------------------------------------------------------\n// Singleton client — lazy-initialized on first execute() call\n// ---------------------------------------------------------------------------\n\nlet _exec: DbExec | undefined;\nlet _pgPool: any;\nlet _neonPool: any;\nlet _sqlite: any;\nlet _initPromise: Promise<void> | undefined;\n\nasync function createDbExecInternal(\n config: DbExecConfig = {},\n trackSingletonResources = false,\n): Promise<DbExec> {\n const dialect = dialectForConfig(config);\n\n // Cloudflare D1\n if (dialect === \"d1\") {\n const d1 = config.d1Binding;\n const execute: DbExec[\"execute\"] = async (sql) => {\n if (typeof sql === \"string\") {\n const r = await d1.prepare(sql).all();\n return {\n rows: r.results || [],\n rowsAffected: r.meta?.changes ?? 0,\n };\n }\n const r = await d1\n .prepare(sql.sql)\n .bind(...(sql.args ?? []))\n .all();\n return { rows: r.results || [], rowsAffected: r.meta?.changes ?? 0 };\n };\n return {\n execute,\n transaction: explicitTransaction(execute),\n };\n }\n\n let url = config.url || \"file:./data/app.db\";\n\n // Postgres — uses postgres.js. Works on Node.js natively and on Cloudflare\n // Workers with the nodejs_compat compatibility flag (provides net/tls polyfills).\n // On Workers, connections can't be shared across requests, so we create a\n // fresh connection per query (max:1) to avoid the \"I/O on behalf of a\n // different request\" error.\n if (dialect === \"postgres\") {\n const { isNeonUrl } = await import(\"./create-get-db.js\");\n\n // Neon over @neondatabase/serverless (WebSocket upgrade on port 443).\n // postgres-js uses a raw TCP socket on 5432 that frequently fails on\n // serverless runtimes (Netlify Functions, Vercel, CF Workers) when\n // Neon's pooler is cold — every request after an idle period times out\n // with CONNECT_TIMEOUT. The serverless Pool handles wake-up transparently\n // and keeps the same `pg`-compatible query(...) interface we need here.\n if (isNeonUrl(url)) {\n const { Pool } = await import(\"@neondatabase/serverless\");\n const pool = new Pool({ connectionString: url, max: neonPoolMax() });\n attachNeonPoolErrorLogger(pool);\n if (trackSingletonResources) _neonPool = pool;\n async function queryNeonClient(\n client: any,\n sql: Parameters<DbExec[\"execute\"]>[0],\n ) {\n const { rawSql, args } = sqlAndArgs(sql);\n const pgSql = sqliteToPostgresParams(rawSql);\n const result = await withDbTimeout(\n \"query\",\n () =>\n client.query(pgSql, args as any[]) as Promise<{\n rows: unknown[];\n rowCount?: number;\n }>,\n dbOpTimeoutMs(),\n );\n return {\n rows: result.rows,\n rowsAffected: result.rowCount ?? 0,\n };\n }\n return {\n async execute(sql) {\n const result = await retryOnConnectionError<{\n rows: unknown[];\n rowsAffected: number;\n }>(async () => {\n // Bound the pooled-connection ACQUIRE, not just the query below.\n // Neon's pooler can stall on `connect()` when cold or exhausted,\n // and that happens BEFORE `client.query`, so the query-level\n // timeout never fires — the request hangs until the platform kills\n // the function (~\"the site won't load\" for authenticated users,\n // whose every request runs a session/org lookup). Time the acquire\n // out into a retryable CONNECT_TIMEOUT that retryOnConnectionError\n // already handles, and release the connection if it resolves after\n // we've given up so the scarce pool slot isn't leaked.\n let acquireTimedOut = false;\n const client = await withDbTimeout(\n \"connect\",\n () =>\n pool.connect().then((c) => {\n if (acquireTimedOut) c.release();\n return c;\n }),\n dbOpTimeoutMs(),\n () => {\n acquireTimedOut = true;\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 queryNeonClient(client, sql);\n releaseClient();\n return result;\n } catch (err) {\n releaseClient(isConnectionError(err) ? true : undefined);\n throw err;\n }\n });\n return {\n rows: result.rows,\n rowsAffected: result.rowsAffected,\n };\n },\n async transaction<T>(fn: (tx: DbExec) => Promise<T>): Promise<T> {\n return retryOnConnectionError(async () => {\n let acquireTimedOut = false;\n const client = await withDbTimeout(\n \"connect\",\n () =>\n pool.connect().then((c) => {\n if (acquireTimedOut) c.release();\n return c;\n }),\n dbOpTimeoutMs(),\n () => {\n acquireTimedOut = true;\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 const tx: DbExec = {\n execute: (sql) => queryNeonClient(client, sql),\n };\n try {\n await queryNeonClient(client, \"BEGIN\");\n const result = await fn(tx);\n await queryNeonClient(client, \"COMMIT\");\n releaseClient();\n return result;\n } catch (err) {\n await queryNeonClient(client, \"ROLLBACK\").catch(() => {});\n releaseClient(isConnectionError(err) ? true : undefined);\n throw err;\n }\n }, 1);\n },\n async close() {\n await pool.end();\n },\n };\n }\n\n const { default: postgres } = await import(\"postgres\");\n const isWorkers =\n \"__cf_env\" in globalThis ||\n (typeof navigator !== \"undefined\" &&\n navigator.userAgent === \"Cloudflare-Workers\");\n\n if (isWorkers) {\n // Workers: fresh connection per query — I/O can't be shared across requests\n return {\n async execute(sql) {\n const conn = postgres(url, {\n max: 1,\n idle_timeout: 0,\n onnotice: () => {},\n });\n let timedOut = false;\n try {\n const rawSql = typeof sql === \"string\" ? sql : sql.sql;\n const args = typeof sql === \"string\" ? [] : sql.args || [];\n const pgSql = sqliteToPostgresParams(rawSql);\n const result = await withDbTimeout<\n ArrayLike<unknown> & { count?: number }\n >(\n \"query\",\n () =>\n conn.unsafe(pgSql, args as any[]) as Promise<\n ArrayLike<unknown> & { count?: number }\n >,\n dbOpTimeoutMs(),\n () => {\n timedOut = true;\n disposePostgresPoolEventually(conn, \"timed-out worker query\");\n },\n );\n return {\n rows: Array.from(result),\n rowsAffected: result.count ?? 0,\n };\n } finally {\n if (!timedOut) {\n await conn.end().catch((err: unknown) => {\n console.warn(\n \"[db/postgres] worker query cleanup failed:\",\n err instanceof Error ? err.message : err,\n );\n });\n }\n }\n },\n async transaction<T>(fn: (tx: DbExec) => Promise<T>): Promise<T> {\n const conn = postgres(url, {\n max: 1,\n idle_timeout: 0,\n onnotice: () => {},\n });\n try {\n const result = await conn.begin(async (txSql: any) => {\n const tx: DbExec = {\n async execute(sql) {\n const { rawSql, args } = sqlAndArgs(sql);\n const pgSql = sqliteToPostgresParams(rawSql);\n const result = await withDbTimeout<\n ArrayLike<unknown> & { count?: number }\n >(\n \"query\",\n () =>\n txSql.unsafe(pgSql, args as any[]) as Promise<\n ArrayLike<unknown> & { count?: number }\n >,\n dbOpTimeoutMs(),\n );\n return {\n rows: Array.from(result),\n rowsAffected: result.count ?? 0,\n };\n },\n };\n return fn(tx);\n });\n return result as T;\n } finally {\n await conn.end().catch((err: unknown) => {\n console.warn(\n \"[db/postgres] worker transaction cleanup failed:\",\n err instanceof Error ? err.message : err,\n );\n });\n }\n },\n };\n } else {\n // Node.js: reuse connection pool. pgPoolOptions caps the pool to a\n // small size on serverless (Netlify/Vercel/Lambda/CF) so concurrent\n // frozen instances don't exhaust Neon/Postgres' connection limit;\n // idle_timeout also closes idle connections before Neon's ~5min\n // server-side timeout, avoiding ECONNRESET when the server hangs up.\n const createPool = () => postgres(url, pgPoolOptions(url));\n type PostgresPool = ReturnType<typeof createPool>;\n let pool = createPool();\n if (trackSingletonResources) _pgPool = pool;\n const recyclePool = (timedOutPool: PostgresPool) => {\n if (pool === timedOutPool) {\n pool = createPool();\n if (trackSingletonResources) _pgPool = pool;\n }\n disposePostgresPoolEventually(timedOutPool, \"timed-out pooled query\");\n };\n\n return {\n async execute(sql) {\n const { rawSql, args } = sqlAndArgs(sql);\n const pgSql = sqliteToPostgresParams(rawSql);\n const result = await retryOnConnectionError<\n ArrayLike<unknown> & { count?: number }\n >(() => {\n const queryPool = pool;\n const query = queryPool.unsafe(pgSql, args as any[]);\n return withDbTimeout(\n \"query\",\n () => query,\n dbOpTimeoutMs(),\n () => recyclePool(queryPool),\n );\n });\n return {\n rows: Array.from(result),\n rowsAffected: result.count ?? 0,\n };\n },\n async transaction<T>(fn: (tx: DbExec) => Promise<T>): Promise<T> {\n const result = await pool.begin(async (txSql: any) => {\n const tx: DbExec = {\n async execute(sql) {\n const { rawSql, args } = sqlAndArgs(sql);\n const pgSql = sqliteToPostgresParams(rawSql);\n const result = await withDbTimeout<\n ArrayLike<unknown> & { count?: number }\n >(\n \"query\",\n () =>\n txSql.unsafe(pgSql, args as any[]) as Promise<\n ArrayLike<unknown> & { count?: number }\n >,\n dbOpTimeoutMs(),\n );\n return {\n rows: Array.from(result),\n rowsAffected: result.count ?? 0,\n };\n },\n };\n return fn(tx);\n });\n return result as T;\n },\n async close() {\n await pool.end();\n },\n };\n }\n }\n\n // SQLite / libsql (default). Local file databases use better-sqlite3 so\n // serverless bundles do not need libsql's platform-specific native package.\n if (isLocalSqliteUrl(url)) {\n url = await prepareLocalSqliteUrl(\n url.startsWith(\"file:\") ? url : `file:${url}`,\n );\n const { default: Database } = await import(\"better-sqlite3\");\n const sqlite = new Database(sqliteFilenameFromUrl(url));\n sqlite.pragma(\"busy_timeout = 10000\");\n sqlite.pragma(\"journal_mode = WAL\");\n if (trackSingletonResources) _sqlite = sqlite;\n const execute: DbExec[\"execute\"] = async (sql) => {\n const { rawSql, args } = sqlAndArgs(sql);\n const stmt = sqlite.prepare(rawSql);\n if (stmt.reader) {\n return {\n rows: stmt.all(...args),\n rowsAffected: 0,\n };\n }\n const result = stmt.run(...args);\n return {\n rows: [],\n rowsAffected: result.changes ?? 0,\n };\n };\n\n return {\n execute,\n transaction: explicitTransaction(execute, \"BEGIN IMMEDIATE\"),\n async close() {\n sqlite.close();\n },\n };\n }\n\n const { createClient } = await import(\"@libsql/client/web\");\n const client = createClient({\n url,\n authToken: config.authToken,\n });\n const execute: DbExec[\"execute\"] = async (sql) => {\n if (typeof sql === \"string\") {\n const r = await client.execute(sql);\n return {\n rows: r.rows as any[],\n rowsAffected: r.rowsAffected,\n };\n }\n const r = await client.execute({\n sql: sql.sql,\n args: sql.args as any[],\n });\n return {\n rows: r.rows as any[],\n rowsAffected: r.rowsAffected,\n };\n };\n\n return {\n execute,\n transaction: explicitTransaction(execute),\n async close() {\n client.close();\n },\n };\n}\n\nexport async function createDbExec(config: DbExecConfig = {}): Promise<DbExec> {\n return createDbExecInternal(config, false);\n}\n\nasync function initClient(): Promise<void> {\n if (_exec) return;\n\n const dialect = getDialect();\n const url = getDatabaseUrl(\"file:./data/app.db\");\n _exec = await createDbExecInternal(\n {\n url,\n authToken: getDatabaseAuthToken(),\n d1Binding: dialect === \"d1\" ? globalThis.__cf_env?.DB : undefined,\n },\n true,\n );\n}\n\n/**\n * Get the singleton database client. Returns a `DbExec` whose first\n * `execute()` call lazily initializes the underlying driver.\n */\nexport function getDbExec(): DbExec {\n if (_exec) return _exec;\n\n // Sanitize args: replace undefined with null (libsql rejects undefined)\n function sanitize(\n sql: string | { sql: string; args?: unknown[] },\n ): string | { sql: string; args?: unknown[] } {\n if (typeof sql === \"object\" && sql.args) {\n return { ...sql, args: sql.args.map((a) => a ?? null) };\n }\n return sql;\n }\n\n // Return a proxy that lazy-inits on first call\n const proxy: DbExec = {\n async execute(sql) {\n if (!_initPromise) _initPromise = initClient();\n try {\n await _initPromise;\n } catch (err) {\n // A failed/hung init must not poison the singleton for the life of\n // the process — drop it so the next call retries a fresh connection\n // instead of re-awaiting a permanently rejected/pending promise.\n _initPromise = undefined;\n _exec = undefined;\n throw err;\n }\n // After init, swap to a sanitizing wrapper around the real client\n const wrapper: DbExec = {\n execute: (s) => _exec!.execute(sanitize(s)),\n transaction: _exec!.transaction\n ? (fn) =>\n _exec!.transaction!((tx) =>\n fn({\n execute: (s) => tx.execute(sanitize(s)),\n transaction: tx.transaction,\n }),\n )\n : undefined,\n };\n Object.assign(proxy, wrapper);\n return _exec!.execute(sanitize(sql));\n },\n async transaction(fn) {\n if (!_initPromise) _initPromise = initClient();\n try {\n await _initPromise;\n } catch (err) {\n _initPromise = undefined;\n _exec = undefined;\n throw err;\n }\n const wrapper: DbExec = {\n execute: (s) => _exec!.execute(sanitize(s)),\n transaction: _exec!.transaction\n ? (innerFn) =>\n _exec!.transaction!((tx) =>\n innerFn({\n execute: (s) => tx.execute(sanitize(s)),\n transaction: tx.transaction,\n }),\n )\n : undefined,\n };\n Object.assign(proxy, wrapper);\n if (_exec!.transaction) {\n return _exec!.transaction((tx) =>\n fn({\n execute: (s) => tx.execute(sanitize(s)),\n transaction: tx.transaction,\n }),\n );\n }\n return explicitTransaction(wrapper.execute)(fn);\n },\n };\n return proxy;\n}\n\n/** Close the database connection (for scripts that need cleanup). */\nexport async function closeDbExec(): Promise<void> {\n if (_pgPool) {\n await _pgPool.end();\n _pgPool = undefined;\n }\n if (_neonPool) {\n await _neonPool.end();\n _neonPool = undefined;\n }\n if (_sqlite) {\n _sqlite.close();\n _sqlite = undefined;\n }\n _exec = undefined;\n _initPromise = undefined;\n}\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,sBAAsB,GAAG,IAAI,OAAO,EAAU,CAAC;AACrD,MAAM,eAAe,GAAG,IAAI,OAAO,EAAU,CAAC;AA4B9C,8EAA8E;AAC9E,kCAAkC;AAClC,8EAA8E;AAE9E;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAAC,QAAQ,GAAG,EAAE;IAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACvE,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,eAAe,CAAC,CAAC;QACxD,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;IAChC,CAAC;IACD,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,QAAQ,CACzE,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,oBAAoB;IAClC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACvE,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,sBAAsB,CAAC,CAAC;QAC/D,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;IAChC,CAAC;IACD,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAC3E,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,kEAAkE;IAClE,2DAA2D;IAC3D,sEAAsE;IACtE,0EAA0E;IAC1E,8EAA8E;IAC9E,sEAAsE;IACtE,OAAO,GAAG,CAAC,OAAO,CAAC,oCAAoC,EAAE,IAAI,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,OAAO,GAAG,KAAK,EAAE,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAW;IACrD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,GAAG,CAAC;IAEzC,wEAAwE;IACxE,2EAA2E;IAC3E,yEAAyE;IACzE,4EAA4E;IAC5E,MAAM,YAAY,GAAG,mBAAmB,EAAE,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,YAAY,IAAI,GAAG,KAAK,oBAAoB,EAAE,CAAC;YACjD,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,OAAO,yBAAyB,CAAC;QACnC,CAAC;QACD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,gCAAgC;IAClC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,kBAAkB,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC;IACjD,CAAC;IACD,OAAO,GAAG,IAAI,eAAe,CAAC;AAChC,CAAC;AAED,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAI,KAAc,EAAE,QAAW;IAC1D,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,QAAQ,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAM,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAoB,EACpB,OAA0E,EAAE;IAE5E,MAAM,EAAE,WAAW,GAAG,CAAC,EAAE,WAAW,GAAG,GAAG,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC;IACrE,IAAI,IAAa,CAAC;IAClB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,GAAG,CAAC,CAAC;YACT,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC;YACpC,IAAI,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,OAAO,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC;gBAC7D,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,WAAW,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACvE,CAAC;iBAAM,CAAC;gBACN,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,OAAO;QAAE,MAAM,IAAI,CAAC;IACxB,OAAO,SAAyB,CAAC,CAAC,+CAA+C;AACnF,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAI,EAAoB;IAC1D,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;YAAE,MAAM,CAAC,CAAC;QACjC,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,CAAM;IAC7B,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACtC,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,EAAE,eAAe,IAAI,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IACrC,OAAO,CACL,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC;QAChC,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC1B,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC3B,6BAA6B,CAAC,IAAI,CAAC,GAAG,CAAC,CACxC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAM;IACtC,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IACnC,IACE,IAAI,KAAK,8BAA8B;QACvC,IAAI,KAAK,0BAA0B,EACnC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACnD,OAAO,CACL,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACjC,GAAG,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACtC,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,CAC9B,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,IAAI,QAA6B,CAAC;AAElC,MAAM,UAAU,UAAU;IACxB,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAE5C,gDAAgD;IAChD,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACrE,QAAQ,GAAG,UAAU,CAAC;QACtB,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,6BAA6B;QAC7B,QAAQ,GAAG,QAAQ,CAAC;QACpB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,GAAG,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC;IACnC,IAAI,EAAE,EAAE,CAAC;QACP,QAAQ,GAAG,IAAI,CAAC;QAChB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,8EAA8E;IAC9E,wEAAwE;IACxE,2DAA2D;IAC3D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,UAAU,EAAE,KAAK,UAAU,CAAC;AACrC,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAoB;IAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IAC7B,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACrE,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,UAAU,EAAE,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,OAAO,GAAG,KAAK,EAAE,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,OAAO;IACrB,OAAO,UAAU,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7C,CAAC;AAED,8EAA8E;AAC9E,wCAAwC;AACxC,8EAA8E;AAE9E,SAAS,sBAAsB,CAAC,GAAW;IACzC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,UAAU,CAAC,GAA+C;IAIjE,OAAO,OAAO,GAAG,KAAK,QAAQ;QAC5B,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE;QAC3B,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,mBAAmB,CAC1B,OAA0B,EAC1B,KAAK,GAAG,OAAO;IAEf,OAAO,KAAK,EAAE,EAAE,EAAE,EAAE;QAClB,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;YACrC,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC1C,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,4CAA4C;AAC5C,8EAA8E;AAE9E,6EAA6E;AAC7E,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACrC,YAAY;IACZ,WAAW;IACX,OAAO;IACP,WAAW;IACX,iBAAiB;IACjB,kBAAkB;IAClB,sBAAsB;IACtB,mBAAmB;CACpB,CAAC,CAAC;AAEH,MAAM,UAAU,iBAAiB,CAAC,GAAQ;IACxC,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC;IACzC,IAAI,IAAI,IAAI,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1D,yEAAyE;IACzE,4EAA4E;IAC5E,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC;IAC/C,IAAI,IAAI,KAAK,YAAY;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAC1D,IACE,iEAAiE,CAAC,IAAI,CACpE,KAAK,CACN,EACD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IAC5D,OAAO,4FAA4F,CAAC,IAAI,CACtG,GAAG,CACJ,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,EAAoB,EACpB,WAAW,GAAG,CAAC;IAEf,IAAI,IAAa,CAAC;IAClB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,GAAG,CAAC,CAAC;YACT,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,OAAO,KAAK,WAAW,GAAG,CAAC;gBAAE,MAAM,CAAC,CAAC;YAClE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IACD,MAAM,IAAI,CAAC;AACb,CAAC;AAED,8EAA8E;AAC9E,4EAA4E;AAC5E,8EAA8E;AAE9E;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACjD,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAChD,OAAO,mBAAmB,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;AAChD,CAAC;AAED;;;;;GAKG;AACH,MAAM,cAAe,SAAQ,KAAK;IAChC,IAAI,GAAG,iBAAiB,CAAC;IACzB,YAAY,EAAU,EAAE,EAAU;QAChC,KAAK,CAAC,MAAM,EAAE,oBAAoB,EAAE,4BAA4B,CAAC,CAAC;QAClE,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,EAAU,EACV,GAAqB,EACrB,EAAE,GAAG,aAAa,EAAE,EACpB,SAAsC;IAEtC,IAAI,KAAgD,CAAC;IACrD,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;QAC5B,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,IAAI,CAAC;YACH,MAAM,SAAS,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CACV,4BAA4B,EAAE,UAAU,EACxC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,MAAM,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC9C,MAAM,MAAM,GAAG,CACb,QAA6C,EAC7C,KAAyB,EACzB,EAAE;YACF,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,CAAC,GAAY,EAAE,EAAE;YAC5B,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC;QAEF,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACtB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,KAAK,CAAC,KAAK,IAAI,EAAE;gBACf,MAAM,UAAU,EAAE,CAAC;gBACnB,MAAM,CAAC,IAAI,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YACrC,CAAC,CAAC,EAAE,CAAC;QACP,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,IAAI,OAAmB,CAAC;QACxB,IAAI,CAAC;YACH,OAAO,GAAG,GAAG,EAAE,CAAC;QAClB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,OAAO;QACT,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,yCAAyC;AACzC,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,CACL,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO;QACrB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM;QACpB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB;QACtC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB;QAC9B,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CACvB,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,UAAU,GAAG,mBAAmB,EAAE,CAAC;IACzC,OAAO;QACL,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;QAClB,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;QACxB,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG;QACnC,YAAY,EAAE,EAAE,GAAG,EAAE;QACrB,eAAe,EAAE,EAAE;QACnB,0EAA0E;QAC1E,uEAAuE;QACvE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxD,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,mBAAmB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACxC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IAC7C,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,GAIX,CAAC;QACF,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC;QAC9C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;QAC/C,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACzB,OAAO,+DAA+D,CAAC;QACzE,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,IAAa,EACb,KAAK,GAAG,SAAS;IAEjB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO;IAC9C,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO;IACtC,MAAM,UAAU,GAAG,IAElB,CAAC;IACF,IAAI,OAAO,UAAU,CAAC,EAAE,KAAK,UAAU;QAAE,OAAO;IAEhD,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAY,EAAE,EAAE;QACtC,OAAO,CAAC,IAAI,CACV,IAAI,KAAK,8CAA8C,EACvD,eAAe,CAAC,GAAG,CAAC,CACrB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,+EAA+E;IAC/E,EAAE;IACF,0EAA0E;IAC1E,wEAAwE;IACxE,uEAAuE;IACvE,6EAA6E;IAC7E,+EAA+E;IAC/E,6EAA6E;IAC7E,yEAAyE;IACzE,4EAA4E;IAC5E,gFAAgF;IAChF,4EAA4E;IAC5E,+EAA+E;IAC/E,6EAA6E;IAC7E,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,MAAe,EAAE,EAAE;QAC3C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO;QAClD,MAAM,YAAY,GAAG,MAEpB,CAAC;QACF,IAAI,OAAO,YAAY,CAAC,EAAE,KAAK,UAAU;YAAE,OAAO;QAClD,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAY,EAAE,EAAE;YACxC,OAAO,CAAC,IAAI,CACV,IAAI,KAAK,0EAA0E,EACnF,eAAe,CAAC,GAAG,CAAC,CACrB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,6BAA6B,CACpC,IAAqC,EACrC,KAAa;IAEb,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO;IAC9C,IAAI,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO;IAC7C,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QACrC,OAAO,CAAC,IAAI,CACV,iBAAiB,KAAK,kBAAkB,EACxC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,8DAA8D;AAC9D,8EAA8E;AAE9E,IAAI,KAAyB,CAAC;AAC9B,IAAI,OAAY,CAAC;AACjB,IAAI,SAAc,CAAC;AACnB,IAAI,OAAY,CAAC;AACjB,IAAI,YAAuC,CAAC;AAE5C,KAAK,UAAU,oBAAoB,CACjC,SAAuB,EAAE,EACzB,uBAAuB,GAAG,KAAK;IAE/B,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEzC,gBAAgB;IAChB,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;QAC5B,MAAM,OAAO,GAAsB,KAAK,EAAE,GAAG,EAAE,EAAE;YAC/C,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;gBACtC,OAAO;oBACL,IAAI,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;oBACrB,YAAY,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC;iBACnC,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,GAAG,MAAM,EAAE;iBACf,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;iBAChB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;iBACzB,GAAG,EAAE,CAAC;YACT,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QACvE,CAAC,CAAC;QACF,OAAO;YACL,OAAO;YACP,WAAW,EAAE,mBAAmB,CAAC,OAAO,CAAC;SAC1C,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,oBAAoB,CAAC;IAE7C,2EAA2E;IAC3E,kFAAkF;IAClF,0EAA0E;IAC1E,sEAAsE;IACtE,4BAA4B;IAC5B,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QAC3B,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAEzD,sEAAsE;QACtE,qEAAqE;QACrE,mEAAmE;QACnE,uEAAuE;QACvE,0EAA0E;QAC1E,wEAAwE;QACxE,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;YACrE,yBAAyB,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,uBAAuB;gBAAE,SAAS,GAAG,IAAI,CAAC;YAC9C,KAAK,UAAU,eAAe,CAC5B,MAAW,EACX,GAAqC;gBAErC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;gBACzC,MAAM,KAAK,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;gBAC7C,MAAM,MAAM,GAAG,MAAM,aAAa,CAChC,OAAO,EACP,GAAG,EAAE,CACH,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,IAAa,CAG/B,EACJ,aAAa,EAAE,CAChB,CAAC;gBACF,OAAO;oBACL,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,YAAY,EAAE,MAAM,CAAC,QAAQ,IAAI,CAAC;iBACnC,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,KAAK,CAAC,OAAO,CAAC,GAAG;oBACf,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAGxC,KAAK,IAAI,EAAE;wBACZ,iEAAiE;wBACjE,iEAAiE;wBACjE,6DAA6D;wBAC7D,mEAAmE;wBACnE,gEAAgE;wBAChE,mEAAmE;wBACnE,mEAAmE;wBACnE,mEAAmE;wBACnE,uDAAuD;wBACvD,IAAI,eAAe,GAAG,KAAK,CAAC;wBAC5B,MAAM,MAAM,GAAG,MAAM,aAAa,CAChC,SAAS,EACT,GAAG,EAAE,CACH,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;4BACxB,IAAI,eAAe;gCAAE,CAAC,CAAC,OAAO,EAAE,CAAC;4BACjC,OAAO,CAAC,CAAC;wBACX,CAAC,CAAC,EACJ,aAAa,EAAE,EACf,GAAG,EAAE;4BACH,eAAe,GAAG,IAAI,CAAC;wBACzB,CAAC,CACF,CAAC;wBACF,IAAI,QAAQ,GAAG,KAAK,CAAC;wBACrB,MAAM,aAAa,GAAG,CAAC,GAAqB,EAAE,EAAE;4BAC9C,IAAI,QAAQ;gCAAE,OAAO;4BACrB,QAAQ,GAAG,IAAI,CAAC;4BAChB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;wBACtB,CAAC,CAAC;wBAEF,IAAI,CAAC;4BACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;4BAClD,aAAa,EAAE,CAAC;4BAChB,OAAO,MAAM,CAAC;wBAChB,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,aAAa,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;4BACzD,MAAM,GAAG,CAAC;wBACZ,CAAC;oBACH,CAAC,CAAC,CAAC;oBACH,OAAO;wBACL,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,YAAY,EAAE,MAAM,CAAC,YAAY;qBAClC,CAAC;gBACJ,CAAC;gBACD,KAAK,CAAC,WAAW,CAAI,EAA8B;oBACjD,OAAO,sBAAsB,CAAC,KAAK,IAAI,EAAE;wBACvC,IAAI,eAAe,GAAG,KAAK,CAAC;wBAC5B,MAAM,MAAM,GAAG,MAAM,aAAa,CAChC,SAAS,EACT,GAAG,EAAE,CACH,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;4BACxB,IAAI,eAAe;gCAAE,CAAC,CAAC,OAAO,EAAE,CAAC;4BACjC,OAAO,CAAC,CAAC;wBACX,CAAC,CAAC,EACJ,aAAa,EAAE,EACf,GAAG,EAAE;4BACH,eAAe,GAAG,IAAI,CAAC;wBACzB,CAAC,CACF,CAAC;wBACF,IAAI,QAAQ,GAAG,KAAK,CAAC;wBACrB,MAAM,aAAa,GAAG,CAAC,GAAqB,EAAE,EAAE;4BAC9C,IAAI,QAAQ;gCAAE,OAAO;4BACrB,QAAQ,GAAG,IAAI,CAAC;4BAChB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;wBACtB,CAAC,CAAC;wBACF,MAAM,EAAE,GAAW;4BACjB,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC;yBAC/C,CAAC;wBACF,IAAI,CAAC;4BACH,MAAM,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;4BACvC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;4BAC5B,MAAM,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;4BACxC,aAAa,EAAE,CAAC;4BAChB,OAAO,MAAM,CAAC;wBAChB,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,MAAM,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;4BAC1D,aAAa,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;4BACzD,MAAM,GAAG,CAAC;wBACZ,CAAC;oBACH,CAAC,EAAE,CAAC,CAAC,CAAC;gBACR,CAAC;gBACD,KAAK,CAAC,KAAK;oBACT,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;gBACnB,CAAC;aACF,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QACvD,MAAM,SAAS,GACb,UAAU,IAAI,UAAU;YACxB,CAAC,OAAO,SAAS,KAAK,WAAW;gBAC/B,SAAS,CAAC,SAAS,KAAK,oBAAoB,CAAC,CAAC;QAElD,IAAI,SAAS,EAAE,CAAC;YACd,4EAA4E;YAC5E,OAAO;gBACL,KAAK,CAAC,OAAO,CAAC,GAAG;oBACf,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,EAAE;wBACzB,GAAG,EAAE,CAAC;wBACN,YAAY,EAAE,CAAC;wBACf,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;qBACnB,CAAC,CAAC;oBACH,IAAI,QAAQ,GAAG,KAAK,CAAC;oBACrB,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;wBACvD,MAAM,IAAI,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;wBAC3D,MAAM,KAAK,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;wBAC7C,MAAM,MAAM,GAAG,MAAM,aAAa,CAGhC,OAAO,EACP,GAAG,EAAE,CACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAa,CAE/B,EACH,aAAa,EAAE,EACf,GAAG,EAAE;4BACH,QAAQ,GAAG,IAAI,CAAC;4BAChB,6BAA6B,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;wBAChE,CAAC,CACF,CAAC;wBACF,OAAO;4BACL,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;4BACxB,YAAY,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;yBAChC,CAAC;oBACJ,CAAC;4BAAS,CAAC;wBACT,IAAI,CAAC,QAAQ,EAAE,CAAC;4BACd,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;gCACtC,OAAO,CAAC,IAAI,CACV,4CAA4C,EAC5C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;4BACJ,CAAC,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,KAAK,CAAC,WAAW,CAAI,EAA8B;oBACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,EAAE;wBACzB,GAAG,EAAE,CAAC;wBACN,YAAY,EAAE,CAAC;wBACf,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;qBACnB,CAAC,CAAC;oBACH,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAU,EAAE,EAAE;4BACnD,MAAM,EAAE,GAAW;gCACjB,KAAK,CAAC,OAAO,CAAC,GAAG;oCACf,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;oCACzC,MAAM,KAAK,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;oCAC7C,MAAM,MAAM,GAAG,MAAM,aAAa,CAGhC,OAAO,EACP,GAAG,EAAE,CACH,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,IAAa,CAEhC,EACH,aAAa,EAAE,CAChB,CAAC;oCACF,OAAO;wCACL,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;wCACxB,YAAY,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;qCAChC,CAAC;gCACJ,CAAC;6BACF,CAAC;4BACF,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;wBAChB,CAAC,CAAC,CAAC;wBACH,OAAO,MAAW,CAAC;oBACrB,CAAC;4BAAS,CAAC;wBACT,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;4BACtC,OAAO,CAAC,IAAI,CACV,kDAAkD,EAClD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;wBACJ,CAAC,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;aACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,mEAAmE;YACnE,oEAAoE;YACpE,kEAAkE;YAClE,gEAAgE;YAChE,qEAAqE;YACrE,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;YAE3D,IAAI,IAAI,GAAG,UAAU,EAAE,CAAC;YACxB,IAAI,uBAAuB;gBAAE,OAAO,GAAG,IAAI,CAAC;YAC5C,MAAM,WAAW,GAAG,CAAC,YAA0B,EAAE,EAAE;gBACjD,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;oBAC1B,IAAI,GAAG,UAAU,EAAE,CAAC;oBACpB,IAAI,uBAAuB;wBAAE,OAAO,GAAG,IAAI,CAAC;gBAC9C,CAAC;gBACD,6BAA6B,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC;YACxE,CAAC,CAAC;YAEF,OAAO;gBACL,KAAK,CAAC,OAAO,CAAC,GAAG;oBACf,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;oBACzC,MAAM,KAAK,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;oBAC7C,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAEzC,GAAG,EAAE;wBACL,MAAM,SAAS,GAAG,IAAI,CAAC;wBACvB,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,IAAa,CAAC,CAAC;wBACrD,OAAO,aAAa,CAClB,OAAO,EACP,GAAG,EAAE,CAAC,KAAK,EACX,aAAa,EAAE,EACf,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,CAC7B,CAAC;oBACJ,CAAC,CAAC,CAAC;oBACH,OAAO;wBACL,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;wBACxB,YAAY,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;qBAChC,CAAC;gBACJ,CAAC;gBACD,KAAK,CAAC,WAAW,CAAI,EAA8B;oBACjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAU,EAAE,EAAE;wBACnD,MAAM,EAAE,GAAW;4BACjB,KAAK,CAAC,OAAO,CAAC,GAAG;gCACf,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;gCACzC,MAAM,KAAK,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;gCAC7C,MAAM,MAAM,GAAG,MAAM,aAAa,CAGhC,OAAO,EACP,GAAG,EAAE,CACH,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,IAAa,CAEhC,EACH,aAAa,EAAE,CAChB,CAAC;gCACF,OAAO;oCACL,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;oCACxB,YAAY,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;iCAChC,CAAC;4BACJ,CAAC;yBACF,CAAC;wBACF,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;oBAChB,CAAC,CAAC,CAAC;oBACH,OAAO,MAAW,CAAC;gBACrB,CAAC;gBACD,KAAK,CAAC,KAAK;oBACT,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;gBACnB,CAAC;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,4EAA4E;IAC5E,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,GAAG,GAAG,MAAM,qBAAqB,CAC/B,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,EAAE,CAC9C,CAAC;QACF,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACpC,IAAI,uBAAuB;YAAE,OAAO,GAAG,MAAM,CAAC;QAC9C,MAAM,OAAO,GAAsB,KAAK,EAAE,GAAG,EAAE,EAAE;YAC/C,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YACzC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACpC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,OAAO;oBACL,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;oBACvB,YAAY,EAAE,CAAC;iBAChB,CAAC;YACJ,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;YACjC,OAAO;gBACL,IAAI,EAAE,EAAE;gBACR,YAAY,EAAE,MAAM,CAAC,OAAO,IAAI,CAAC;aAClC,CAAC;QACJ,CAAC,CAAC;QAEF,OAAO;YACL,OAAO;YACP,WAAW,EAAE,mBAAmB,CAAC,OAAO,EAAE,iBAAiB,CAAC;YAC5D,KAAK,CAAC,KAAK;gBACT,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,CAAC;SACF,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,YAAY,CAAC;QAC1B,GAAG;QACH,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC,CAAC;IACH,MAAM,OAAO,GAAsB,KAAK,EAAE,GAAG,EAAE,EAAE;QAC/C,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACpC,OAAO;gBACL,IAAI,EAAE,CAAC,CAAC,IAAa;gBACrB,YAAY,EAAE,CAAC,CAAC,YAAY;aAC7B,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;YAC7B,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,IAAI,EAAE,GAAG,CAAC,IAAa;SACxB,CAAC,CAAC;QACH,OAAO;YACL,IAAI,EAAE,CAAC,CAAC,IAAa;YACrB,YAAY,EAAE,CAAC,CAAC,YAAY;SAC7B,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO;QACL,OAAO;QACP,WAAW,EAAE,mBAAmB,CAAC,OAAO,CAAC;QACzC,KAAK,CAAC,KAAK;YACT,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,SAAuB,EAAE;IAC1D,OAAO,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,UAAU;IACvB,IAAI,KAAK;QAAE,OAAO;IAElB,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,cAAc,CAAC,oBAAoB,CAAC,CAAC;IACjD,KAAK,GAAG,MAAM,oBAAoB,CAChC;QACE,GAAG;QACH,SAAS,EAAE,oBAAoB,EAAE;QACjC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS;KAClE,EACD,IAAI,CACL,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS;IACvB,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IAExB,wEAAwE;IACxE,SAAS,QAAQ,CACf,GAA+C;QAE/C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACxC,OAAO,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;QAC1D,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,+CAA+C;IAC/C,MAAM,KAAK,GAAW;QACpB,KAAK,CAAC,OAAO,CAAC,GAAG;YACf,IAAI,CAAC,YAAY;gBAAE,YAAY,GAAG,UAAU,EAAE,CAAC;YAC/C,IAAI,CAAC;gBACH,MAAM,YAAY,CAAC;YACrB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,mEAAmE;gBACnE,oEAAoE;gBACpE,iEAAiE;gBACjE,YAAY,GAAG,SAAS,CAAC;gBACzB,KAAK,GAAG,SAAS,CAAC;gBAClB,MAAM,GAAG,CAAC;YACZ,CAAC;YACD,kEAAkE;YAClE,MAAM,OAAO,GAAW;gBACtB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC3C,WAAW,EAAE,KAAM,CAAC,WAAW;oBAC7B,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CACL,KAAM,CAAC,WAAY,CAAC,CAAC,EAAE,EAAE,EAAE,CACzB,EAAE,CAAC;wBACD,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;wBACvC,WAAW,EAAE,EAAE,CAAC,WAAW;qBAC5B,CAAC,CACH;oBACL,CAAC,CAAC,SAAS;aACd,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC9B,OAAO,KAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QACvC,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,EAAE;YAClB,IAAI,CAAC,YAAY;gBAAE,YAAY,GAAG,UAAU,EAAE,CAAC;YAC/C,IAAI,CAAC;gBACH,MAAM,YAAY,CAAC;YACrB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,YAAY,GAAG,SAAS,CAAC;gBACzB,KAAK,GAAG,SAAS,CAAC;gBAClB,MAAM,GAAG,CAAC;YACZ,CAAC;YACD,MAAM,OAAO,GAAW;gBACtB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC3C,WAAW,EAAE,KAAM,CAAC,WAAW;oBAC7B,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CACV,KAAM,CAAC,WAAY,CAAC,CAAC,EAAE,EAAE,EAAE,CACzB,OAAO,CAAC;wBACN,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;wBACvC,WAAW,EAAE,EAAE,CAAC,WAAW;qBAC5B,CAAC,CACH;oBACL,CAAC,CAAC,SAAS;aACd,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC9B,IAAI,KAAM,CAAC,WAAW,EAAE,CAAC;gBACvB,OAAO,KAAM,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAC/B,EAAE,CAAC;oBACD,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBACvC,WAAW,EAAE,EAAE,CAAC,WAAW;iBAC5B,CAAC,CACH,CAAC;YACJ,CAAC;YACD,OAAO,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;QAClD,CAAC;KACF,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,qEAAqE;AACrE,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC;QACpB,OAAO,GAAG,SAAS,CAAC;IACtB,CAAC;IACD,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC;QACtB,SAAS,GAAG,SAAS,CAAC;IACxB,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,GAAG,SAAS,CAAC;IACtB,CAAC;IACD,KAAK,GAAG,SAAS,CAAC;IAClB,YAAY,GAAG,SAAS,CAAC;AAC3B,CAAC","sourcesContent":["/**\n * Central database client abstraction.\n *\n * Detects the database backend from the environment (D1, Postgres, or SQLite/libsql)\n * and returns a unified `DbExec` interface that all core stores use.\n *\n * Imports for postgres, better-sqlite3, and @libsql/client/web are lazy\n * (dynamic import) so this module can be loaded in any runtime (Node.js,\n * Cloudflare Workers, edge) without failing on missing native deps.\n */\nimport path from \"path\";\n\nconst recyclingPostgresPools = new WeakSet<object>();\nconst loggedNeonPools = new WeakSet<object>();\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type Dialect = \"sqlite\" | \"postgres\" | \"d1\";\n\nexport interface DbExec {\n execute(\n sql: string | { sql: string; args?: unknown[] },\n ): Promise<{ rows: any[]; rowsAffected: number }>;\n transaction?<T>(fn: (tx: DbExec) => Promise<T>): Promise<T>;\n /**\n * Release the underlying connection/pool held by this exec.\n * Only non-singleton execs created via `createDbExec()` (e.g. the migration\n * direct-endpoint exec) should call this. The global singleton exec (`getDbExec`)\n * is managed by `closeDbExec()` instead.\n */\n close?(): Promise<void>;\n}\n\nexport interface DbExecConfig {\n url?: string;\n authToken?: string;\n d1Binding?: any;\n}\n\n// ---------------------------------------------------------------------------\n// Per-app DATABASE_URL resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the database URL for the current app.\n *\n * Checks for `<APP_NAME>_DATABASE_URL` first (e.g. `MAIL_DATABASE_URL`),\n * then falls back to `DATABASE_URL`, then Netlify's managed database env. This\n * allows multiple apps to run in the same process group (e.g. eager repo dev or\n * builder.io) with separate databases while still using the persistent Netlify\n * runtime database when `DATABASE_URL` was only exported for the build command.\n *\n * Set `APP_NAME=mail` in the child process env and\n * `MAIL_DATABASE_URL=postgres://...` in the shared env.\n */\nexport function getDatabaseUrl(fallback = \"\"): string {\n const appName = process.env.APP_NAME?.toUpperCase().replace(/-/g, \"_\");\n if (appName) {\n const prefixed = process.env[`${appName}_DATABASE_URL`];\n if (prefixed) return prefixed;\n }\n return (\n process.env.DATABASE_URL || process.env.NETLIFY_DATABASE_URL || fallback\n );\n}\n\n/** Same per-app resolution for DATABASE_AUTH_TOKEN (used by Turso/libsql). */\nexport function getDatabaseAuthToken(): string | undefined {\n const appName = process.env.APP_NAME?.toUpperCase().replace(/-/g, \"_\");\n if (appName) {\n const prefixed = process.env[`${appName}_DATABASE_AUTH_TOKEN`];\n if (prefixed) return prefixed;\n }\n return (\n process.env.DATABASE_AUTH_TOKEN || process.env.NETLIFY_DATABASE_AUTH_TOKEN\n );\n}\n\n/**\n * Database URL to use for migrations — identical to DATABASE_URL but with the\n * Neon connection-pooler suffix stripped. Neon's PgBouncer runs in transaction\n * mode, which resets session-level ownership after each statement and causes\n * `ALTER TABLE … ADD COLUMN` to fail with \"must be owner of table <x>\" even\n * when the connecting role owns it. The direct endpoint bypasses PgBouncer so\n * DDL honours the role's actual ownership.\n *\n * Non-Neon URLs and already-direct Neon URLs are returned unchanged.\n */\nexport function getMigrationDatabaseUrl(): string {\n const url = getDatabaseUrl();\n // Neon pooler hostname: ep-<id>-pooler.<region>.<cloud>.neon.tech\n // Direct hostname: ep-<id>.<region>.<cloud>.neon.tech\n // The region between `-pooler.` and `.neon.tech` can contain multiple\n // dot-separated labels (e.g. `c-7.us-east-1.aws`), so the matched segment\n // must allow dots — `[a-z0-9.-]+` — not just a single label. Anchoring on the\n // stable `.neon.tech` suffix keeps this from touching non-Neon hosts.\n return url.replace(/-pooler(\\.[a-z0-9.-]+\\.neon\\.tech)/, \"$1\");\n}\n\nexport function isLocalSqliteUrl(url: string): boolean {\n return url === \"\" || url.startsWith(\"file:\") || !url.includes(\"://\");\n}\n\nexport async function prepareLocalSqliteUrl(url: string): Promise<string> {\n if (!url.startsWith(\"file:\")) return url;\n\n // On serverless runtimes (Netlify / Vercel / AWS Lambda / CF Pages) the\n // working directory is read-only. Detect this and redirect local SQLite to\n // /tmp which IS writable (ephemeral per invocation, but the server stays\n // alive for the request). Shares the canonical isServerlessRuntime() check.\n const isServerless = isServerlessRuntime();\n try {\n const fs = await import(\"fs\");\n if (isServerless && url === \"file:./data/app.db\") {\n fs.mkdirSync(\"/tmp/data\", { recursive: true });\n return \"file:///tmp/data/app.db\";\n }\n fs.mkdirSync(path.join(process.cwd(), \"data\"), { recursive: true });\n } catch {\n // Edge runtime — no filesystem.\n }\n return url;\n}\n\nexport function sqliteFilenameFromUrl(url: string): string {\n if (url.startsWith(\"file://\")) {\n return decodeURIComponent(new URL(url).pathname);\n }\n if (url.startsWith(\"file:\")) {\n return url.slice(\"file:\".length) || \":memory:\";\n }\n return url || \"./data/app.db\";\n}\n\n// ---------------------------------------------------------------------------\n// Safe JSON column parsing\n// ---------------------------------------------------------------------------\n\n/**\n * Parse a JSON-serialized column value defensively. A malformed row — from a\n * hand-edit, dirty migration, or a misbehaving agent that wrote raw SQL —\n * must not break an entire list endpoint. Callers supply a fallback for the\n * malformed path; null/undefined values also fall back.\n */\nexport function safeJsonParse<T>(value: unknown, fallback: T): T {\n if (value == null) return fallback;\n try {\n return JSON.parse(String(value)) as T;\n } catch {\n return fallback;\n }\n}\n\n// ---------------------------------------------------------------------------\n// SQLite retry helper\n// ---------------------------------------------------------------------------\n\n/**\n * Retry an async operation when it fails with SQLITE_BUSY.\n * Used during WAL initialization and migrations where a stale WAL from a\n * previous crash or HMR restart can briefly lock the database.\n */\nexport async function retrySqliteBusy<T>(\n fn: () => Promise<T>,\n opts: { maxAttempts?: number; baseDelayMs?: number; rethrow?: boolean } = {},\n): Promise<T> {\n const { maxAttempts = 5, baseDelayMs = 500, rethrow = false } = opts;\n let last: unknown;\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (e: any) {\n last = e;\n const msg = String(e?.message || e);\n if (msg.includes(\"SQLITE_BUSY\") && attempt < maxAttempts - 1) {\n await new Promise((r) => setTimeout(r, baseDelayMs * (attempt + 1)));\n } else {\n break;\n }\n }\n }\n if (rethrow) throw last;\n return undefined as unknown as T; // caller handles undefined (e.g. PRAGMA setup)\n}\n\n/**\n * Retry a DDL statement (CREATE TABLE, CREATE INDEX) once when it fails due\n * to a Postgres pg_catalog race.\n *\n * Postgres's `IF NOT EXISTS` check is NOT atomic with the `pg_type` /\n * `pg_class` catalog insert. When multiple processes boot concurrently and\n * issue the same CREATE, both can pass the existence check and one fails\n * with code 23505 on `pg_type_typname_nsp_index` or similar. The table does\n * end up created by the winner, so rerunning the same `IF NOT EXISTS`\n * statement is a safe no-op.\n */\nexport async function retryOnDdlRace<T>(fn: () => Promise<T>): Promise<T> {\n try {\n return await fn();\n } catch (e: any) {\n if (!isPgCatalogRace(e)) throw e;\n return await fn();\n }\n}\n\nfunction isPgCatalogRace(e: any): boolean {\n if (e?.code === \"42P07\") return true;\n if (e?.code !== \"23505\") return false;\n const constraint = String(e?.constraint_name ?? e?.constraint ?? \"\");\n const detail = String(e?.detail ?? \"\");\n const msg = String(e?.message ?? \"\");\n return (\n constraint.startsWith(\"pg_type\") ||\n constraint.startsWith(\"pg_class\") ||\n detail.includes(\"pg_type\") ||\n detail.includes(\"pg_class\") ||\n /relation .* already exists/i.test(msg)\n );\n}\n\n/**\n * True when `e` is a UNIQUE / PRIMARY KEY constraint violation from any\n * supported driver (Postgres 23505, SQLite SQLITE_CONSTRAINT_PRIMARYKEY /\n * _UNIQUE, D1). Used by stores that accept caller-provided ids and want to\n * surface a clean \"already exists\" error instead of the raw SQL text.\n */\nexport function isUniqueViolation(e: any): boolean {\n if (e?.code === \"23505\") return true;\n const code = String(e?.code ?? \"\");\n if (\n code === \"SQLITE_CONSTRAINT_PRIMARYKEY\" ||\n code === \"SQLITE_CONSTRAINT_UNIQUE\"\n ) {\n return true;\n }\n const msg = String(e?.message ?? \"\").toLowerCase();\n return (\n msg.includes(\"unique constraint\") ||\n msg.includes(\"primary key constraint\") ||\n msg.includes(\"duplicate key\")\n );\n}\n\n// ---------------------------------------------------------------------------\n// Dialect detection\n// ---------------------------------------------------------------------------\n\nlet _dialect: Dialect | undefined;\n\nexport function getDialect(): Dialect {\n if (_dialect !== undefined) return _dialect;\n\n // DATABASE_URL takes priority over D1 when set.\n const url = getDatabaseUrl();\n if (url.startsWith(\"postgres://\") || url.startsWith(\"postgresql://\")) {\n _dialect = \"postgres\";\n return _dialect;\n }\n if (url && !url.startsWith(\"file:\")) {\n // Remote libsql (e.g. Turso)\n _dialect = \"sqlite\";\n return _dialect;\n }\n\n const d1 = globalThis.__cf_env?.DB;\n if (d1) {\n _dialect = \"d1\";\n return _dialect;\n }\n\n // Don't cache the fallthrough — on CF Workers, env bindings (__cf_env) aren't\n // available at import time. If we cache \"sqlite\" here, D1 will never be\n // detected once the bindings are set in the fetch handler.\n return \"sqlite\";\n}\n\nexport function isPostgres(): boolean {\n return getDialect() === \"postgres\";\n}\n\nfunction dialectForConfig(config: DbExecConfig): Dialect {\n const url = config.url ?? \"\";\n if (url.startsWith(\"postgres://\") || url.startsWith(\"postgresql://\")) {\n return \"postgres\";\n }\n if (url && !url.startsWith(\"file:\")) {\n return \"sqlite\";\n }\n if (config.d1Binding) {\n return \"d1\";\n }\n return \"sqlite\";\n}\n\n/**\n * Returns true when the database is a local-only SQLite file (or unset, which\n * defaults to a local SQLite file). Returns false for Postgres, remote libsql\n * (Turso), and D1 — any backend that could be shared across developers.\n *\n * Used to gate local@localhost mode: that mode uses a single shared virtual\n * user with no per-machine scoping, so on any shared database two developers\n * would read and write each other's settings, oauth tokens, and app state.\n */\nexport function isLocalDatabase(): boolean {\n if (getDialect() !== \"sqlite\") return false;\n const url = getDatabaseUrl();\n return url === \"\" || url.startsWith(\"file:\");\n}\n\n/** Returns BIGINT for Postgres (64-bit), INTEGER for SQLite (already 64-bit). */\nexport function intType(): string {\n return isPostgres() ? \"BIGINT\" : \"INTEGER\";\n}\n\n// ---------------------------------------------------------------------------\n// Parameter conversion: ? -> $1, $2, $3\n// ---------------------------------------------------------------------------\n\nfunction sqliteToPostgresParams(sql: string): string {\n let i = 0;\n return sql.replace(/\\?/g, () => `$${++i}`);\n}\n\nfunction sqlAndArgs(sql: string | { sql: string; args?: unknown[] }): {\n rawSql: string;\n args: unknown[];\n} {\n return typeof sql === \"string\"\n ? { rawSql: sql, args: [] }\n : { rawSql: sql.sql, args: sql.args || [] };\n}\n\nfunction explicitTransaction(\n execute: DbExec[\"execute\"],\n begin = \"BEGIN\",\n): NonNullable<DbExec[\"transaction\"]> {\n return async (fn) => {\n await execute(begin);\n try {\n const result = await fn({ execute });\n await execute(\"COMMIT\");\n return result;\n } catch (err) {\n await execute(\"ROLLBACK\").catch(() => {});\n throw err;\n }\n };\n}\n\n// ---------------------------------------------------------------------------\n// Connection error retry (ECONNRESET, etc.)\n// ---------------------------------------------------------------------------\n\n/** Error codes that indicate a dead/stale connection we can safely retry. */\nconst CONNECTION_ERROR_CODES = new Set([\n \"ECONNRESET\",\n \"ETIMEDOUT\",\n \"EPIPE\",\n \"ENOTFOUND\",\n \"CONNECT_TIMEOUT\",\n \"CONNECTION_ENDED\",\n \"CONNECTION_DESTROYED\",\n \"CONNECTION_CLOSED\",\n]);\n\nexport function isConnectionError(err: any): boolean {\n if (!err) return false;\n const code = err.code || err.cause?.code;\n if (code && CONNECTION_ERROR_CODES.has(code)) return true;\n // Neon serverless WS driver: errors from the underlying undici WebSocket\n // closing mid-query come through as TypeError or ErrorEvent without a code.\n const name = err.name || err.cause?.name || \"\";\n if (name === \"ErrorEvent\") return true;\n const stack = String(err.stack || err.cause?.stack || \"\");\n if (\n /WebSocket\\.#onSocketClose|failWebsocketConnection|onSocketClose/.test(\n stack,\n )\n ) {\n return true;\n }\n const msg = String(err.message || err.cause?.message || \"\");\n return /ECONNRESET|ETIMEDOUT|EPIPE|connection.*(closed|ended|terminated)|socket hang up|websocket/i.test(\n msg,\n );\n}\n\nexport async function retryOnConnectionError<T>(\n fn: () => Promise<T>,\n maxAttempts = 3,\n): Promise<T> {\n let last: unknown;\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (e) {\n last = e;\n if (!isConnectionError(e) || attempt === maxAttempts - 1) throw e;\n await new Promise((r) => setTimeout(r, 100 * (attempt + 1)));\n }\n }\n throw last;\n}\n\n// ---------------------------------------------------------------------------\n// Per-op timeout — converts a silent serverless hang into a retryable error\n// ---------------------------------------------------------------------------\n\n/**\n * Max wall time for a single DB op (init or query) before we treat it as a\n * dead connection. A frozen→thawed serverless instance can leave the Neon\n * WebSocket (or a postgres.js socket) hung mid-flight: the promise neither\n * settles nor errors, so retryOnConnectionError() — which only retries thrown\n * errors — can't help and the request hangs until the platform kills the\n * function (~30s on Netlify). For authenticated requests that run a session\n * lookup on every navigation this surfaces as \"the site won't load\". Bounding\n * each op well under the platform function limit turns the silent hang into a\n * CONNECT_TIMEOUT that the existing retry and reject-reset paths already\n * handle. Override with DB_OP_TIMEOUT_MS.\n */\nexport function dbOpTimeoutMs(): number {\n const raw = Number(process.env.DB_OP_TIMEOUT_MS);\n if (Number.isFinite(raw) && raw > 0) return raw;\n return isServerlessRuntime() ? 8_000 : 30_000;\n}\n\n/**\n * Timeout error tagged with a recognized connection-error code so\n * isConnectionError() / retryOnConnectionError() treat a hung op as a\n * retryable dead connection, and upstream reject-reset guards (e.g. the\n * cached session-table init promise) clear their poisoned state.\n */\nclass DbTimeoutError extends Error {\n code = \"CONNECT_TIMEOUT\";\n constructor(op: string, ms: number) {\n super(`DB ${op} timed out after ${ms}ms (connection terminated)`);\n this.name = \"DbTimeoutError\";\n }\n}\n\n/**\n * Race a DB op against {@link dbOpTimeoutMs}. Callers that own a cancellable\n * query or pooled client should pass onTimeout so the losing operation does\n * not keep occupying a scarce connection slot after the request has recovered.\n */\nexport async function withDbTimeout<T>(\n op: string,\n run: () => Promise<T>,\n ms = dbOpTimeoutMs(),\n onTimeout?: () => void | Promise<void>,\n): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n let settled = false;\n\n const runCleanup = async () => {\n if (!onTimeout) return;\n try {\n await onTimeout();\n } catch (err) {\n console.warn(\n `[db] timeout cleanup for ${op} failed:`,\n err instanceof Error ? err.message : err,\n );\n }\n };\n\n return await new Promise<T>((resolve, reject) => {\n const finish = (\n complete: (value: T | PromiseLike<T>) => void,\n value: T | PromiseLike<T>,\n ) => {\n if (settled) return;\n settled = true;\n if (timer) clearTimeout(timer);\n complete(value);\n };\n const fail = (err: unknown) => {\n if (settled) return;\n settled = true;\n if (timer) clearTimeout(timer);\n reject(err);\n };\n\n timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n void (async () => {\n await runCleanup();\n reject(new DbTimeoutError(op, ms));\n })();\n }, ms);\n\n let promise: Promise<T>;\n try {\n promise = run();\n } catch (err) {\n fail(err);\n return;\n }\n promise.then((value) => finish(resolve, value), fail);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Serverless-aware Postgres pool options\n// ---------------------------------------------------------------------------\n\n/**\n * True on serverless function runtimes (Netlify / Vercel / AWS Lambda /\n * Cloudflare Pages Functions) where every concurrent request can spin up its\n * own frozen process. Connections cannot be shared across instances, so each\n * instance must keep its pool tiny — otherwise dozens of warm instances each\n * holding postgres.js's default 10-connection pool blow past Neon/Postgres'\n * connection cap and every `/_agent-native/*` route 500s with \"Max client\n * connections reached\".\n */\nexport function isServerlessRuntime(): boolean {\n return (\n !!process.env.NETLIFY ||\n !!process.env.VERCEL ||\n !!process.env.AWS_LAMBDA_FUNCTION_NAME ||\n !!process.env.LAMBDA_TASK_ROOT ||\n !!process.env.CF_PAGES\n );\n}\n\n/**\n * postgres.js pool options tuned per runtime. A serverless instance handles\n * one request at a time, so a tiny pool is enough — but we cap at 2 (not 1)\n * so a single slow query or open transaction can't serialize every other\n * query in the same request. Total connections stay bounded to ≈ 2×\n * concurrent-instance count instead of 10×. idle_timeout is shortened on\n * serverless so a thawed-but-idle instance releases its connections quickly.\n * Long-lived Node servers keep the normal pool for throughput.\n */\nexport function pgPoolOptions(url: string): Record<string, unknown> {\n const serverless = isServerlessRuntime();\n return {\n onnotice: () => {},\n max: serverless ? 2 : 10,\n idle_timeout: serverless ? 20 : 240,\n max_lifetime: 60 * 30,\n connect_timeout: 10,\n // Supabase's connection pooler (Transaction mode) requires prepare:false.\n // Only disable for Supabase URLs to avoid degrading other deployments.\n ...(url.includes(\"supabase\") ? { prepare: false } : {}),\n };\n}\n\n/**\n * Connection cap for the @neondatabase/serverless `Pool`. Same instance\n * accumulation risk as postgres.js — a small pool (2) is enough on serverless\n * and keeps total connections bounded while still letting a second query\n * proceed when one connection is busy.\n */\nexport function neonPoolMax(): number {\n return isServerlessRuntime() ? 2 : 10;\n}\n\n/**\n * Render any rejection reason as a readable message. The Neon serverless\n * driver surfaces WebSocket failures as raw DOM-style ErrorEvent objects (not\n * Error instances), which stringify uselessly as \"[object ErrorEvent]\" — pull\n * the message off the event (or its nested `.error`) instead so logs carry\n * actual context.\n */\nexport function describeDbError(err: unknown): string {\n if (err instanceof Error) return err.message;\n if (err && typeof err === \"object\") {\n const evt = err as {\n message?: unknown;\n error?: { message?: unknown };\n type?: unknown;\n };\n const msg = evt.message ?? evt.error?.message;\n if (typeof msg === \"string\" && msg) return msg;\n if (evt.type === \"error\") {\n return \"WebSocket ErrorEvent (connection failed; no message attached)\";\n }\n }\n return String(err);\n}\n\nexport function attachNeonPoolErrorLogger(\n pool: unknown,\n label = \"db/neon\",\n): void {\n if (!pool || typeof pool !== \"object\") return;\n if (loggedNeonPools.has(pool)) return;\n const withEvents = pool as {\n on?: (event: string, listener: (...args: unknown[]) => void) => unknown;\n };\n if (typeof withEvents.on !== \"function\") return;\n\n loggedNeonPools.add(pool);\n withEvents.on(\"error\", (err: unknown) => {\n console.warn(\n `[${label}] pool error (will reconnect on next query):`,\n describeDbError(err),\n );\n });\n\n // Attach a persistent 'error' listener to EVERY client for its whole lifetime.\n //\n // @neondatabase/serverless mirrors pg-pool, which only keeps its own idle\n // error listener on a client while that client is idle — it REMOVES the\n // listener the moment the client is checked out. So when a checked-out\n // client's WebSocket drops mid-flight (Lambda freeze/thaw, Neon \"terminating\n // connection due to administrator command\", an idle socket the pooler closed),\n // the client emits 'error' with no listener. Node turns an unhandled 'error'\n // EventEmitter event into an uncaught exception, which crashes the whole\n // serverless function. This was by far the single highest-volume production\n // crash (Sentry \"Unhandled error. ()\", mechanism auto.node.onuncaughtexception,\n // culprit neondatabase__serverless). pg routes the failure to the in-flight\n // query independently, so this listener only needs to keep the emit from going\n // unhandled — the dropped client is discarded and the next query reconnects.\n withEvents.on(\"connect\", (client: unknown) => {\n if (!client || typeof client !== \"object\") return;\n const clientEvents = client as {\n on?: (event: string, listener: (...args: unknown[]) => void) => unknown;\n };\n if (typeof clientEvents.on !== \"function\") return;\n clientEvents.on(\"error\", (err: unknown) => {\n console.warn(\n `[${label}] client connection error (connection discarded, next query reconnects):`,\n describeDbError(err),\n );\n });\n });\n}\n\nfunction disposePostgresPoolEventually(\n pool: { end: () => Promise<unknown> },\n label: string,\n): void {\n if (!pool || typeof pool !== \"object\") return;\n if (recyclingPostgresPools.has(pool)) return;\n recyclingPostgresPools.add(pool);\n void pool.end().catch((err: unknown) => {\n console.warn(\n `[db/postgres] ${label} cleanup failed:`,\n err instanceof Error ? err.message : err,\n );\n });\n}\n\n// ---------------------------------------------------------------------------\n// Singleton client — lazy-initialized on first execute() call\n// ---------------------------------------------------------------------------\n\nlet _exec: DbExec | undefined;\nlet _pgPool: any;\nlet _neonPool: any;\nlet _sqlite: any;\nlet _initPromise: Promise<void> | undefined;\n\nasync function createDbExecInternal(\n config: DbExecConfig = {},\n trackSingletonResources = false,\n): Promise<DbExec> {\n const dialect = dialectForConfig(config);\n\n // Cloudflare D1\n if (dialect === \"d1\") {\n const d1 = config.d1Binding;\n const execute: DbExec[\"execute\"] = async (sql) => {\n if (typeof sql === \"string\") {\n const r = await d1.prepare(sql).all();\n return {\n rows: r.results || [],\n rowsAffected: r.meta?.changes ?? 0,\n };\n }\n const r = await d1\n .prepare(sql.sql)\n .bind(...(sql.args ?? []))\n .all();\n return { rows: r.results || [], rowsAffected: r.meta?.changes ?? 0 };\n };\n return {\n execute,\n transaction: explicitTransaction(execute),\n };\n }\n\n let url = config.url || \"file:./data/app.db\";\n\n // Postgres — uses postgres.js. Works on Node.js natively and on Cloudflare\n // Workers with the nodejs_compat compatibility flag (provides net/tls polyfills).\n // On Workers, connections can't be shared across requests, so we create a\n // fresh connection per query (max:1) to avoid the \"I/O on behalf of a\n // different request\" error.\n if (dialect === \"postgres\") {\n const { isNeonUrl } = await import(\"./create-get-db.js\");\n\n // Neon over @neondatabase/serverless (WebSocket upgrade on port 443).\n // postgres-js uses a raw TCP socket on 5432 that frequently fails on\n // serverless runtimes (Netlify Functions, Vercel, CF Workers) when\n // Neon's pooler is cold — every request after an idle period times out\n // with CONNECT_TIMEOUT. The serverless Pool handles wake-up transparently\n // and keeps the same `pg`-compatible query(...) interface we need here.\n if (isNeonUrl(url)) {\n const { Pool } = await import(\"@neondatabase/serverless\");\n const pool = new Pool({ connectionString: url, max: neonPoolMax() });\n attachNeonPoolErrorLogger(pool);\n if (trackSingletonResources) _neonPool = pool;\n async function queryNeonClient(\n client: any,\n sql: Parameters<DbExec[\"execute\"]>[0],\n ) {\n const { rawSql, args } = sqlAndArgs(sql);\n const pgSql = sqliteToPostgresParams(rawSql);\n const result = await withDbTimeout(\n \"query\",\n () =>\n client.query(pgSql, args as any[]) as Promise<{\n rows: unknown[];\n rowCount?: number;\n }>,\n dbOpTimeoutMs(),\n );\n return {\n rows: result.rows,\n rowsAffected: result.rowCount ?? 0,\n };\n }\n return {\n async execute(sql) {\n const result = await retryOnConnectionError<{\n rows: unknown[];\n rowsAffected: number;\n }>(async () => {\n // Bound the pooled-connection ACQUIRE, not just the query below.\n // Neon's pooler can stall on `connect()` when cold or exhausted,\n // and that happens BEFORE `client.query`, so the query-level\n // timeout never fires — the request hangs until the platform kills\n // the function (~\"the site won't load\" for authenticated users,\n // whose every request runs a session/org lookup). Time the acquire\n // out into a retryable CONNECT_TIMEOUT that retryOnConnectionError\n // already handles, and release the connection if it resolves after\n // we've given up so the scarce pool slot isn't leaked.\n let acquireTimedOut = false;\n const client = await withDbTimeout(\n \"connect\",\n () =>\n pool.connect().then((c) => {\n if (acquireTimedOut) c.release();\n return c;\n }),\n dbOpTimeoutMs(),\n () => {\n acquireTimedOut = true;\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 queryNeonClient(client, sql);\n releaseClient();\n return result;\n } catch (err) {\n releaseClient(isConnectionError(err) ? true : undefined);\n throw err;\n }\n });\n return {\n rows: result.rows,\n rowsAffected: result.rowsAffected,\n };\n },\n async transaction<T>(fn: (tx: DbExec) => Promise<T>): Promise<T> {\n return retryOnConnectionError(async () => {\n let acquireTimedOut = false;\n const client = await withDbTimeout(\n \"connect\",\n () =>\n pool.connect().then((c) => {\n if (acquireTimedOut) c.release();\n return c;\n }),\n dbOpTimeoutMs(),\n () => {\n acquireTimedOut = true;\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 const tx: DbExec = {\n execute: (sql) => queryNeonClient(client, sql),\n };\n try {\n await queryNeonClient(client, \"BEGIN\");\n const result = await fn(tx);\n await queryNeonClient(client, \"COMMIT\");\n releaseClient();\n return result;\n } catch (err) {\n await queryNeonClient(client, \"ROLLBACK\").catch(() => {});\n releaseClient(isConnectionError(err) ? true : undefined);\n throw err;\n }\n }, 1);\n },\n async close() {\n await pool.end();\n },\n };\n }\n\n const { default: postgres } = await import(\"postgres\");\n const isWorkers =\n \"__cf_env\" in globalThis ||\n (typeof navigator !== \"undefined\" &&\n navigator.userAgent === \"Cloudflare-Workers\");\n\n if (isWorkers) {\n // Workers: fresh connection per query — I/O can't be shared across requests\n return {\n async execute(sql) {\n const conn = postgres(url, {\n max: 1,\n idle_timeout: 0,\n onnotice: () => {},\n });\n let timedOut = false;\n try {\n const rawSql = typeof sql === \"string\" ? sql : sql.sql;\n const args = typeof sql === \"string\" ? [] : sql.args || [];\n const pgSql = sqliteToPostgresParams(rawSql);\n const result = await withDbTimeout<\n ArrayLike<unknown> & { count?: number }\n >(\n \"query\",\n () =>\n conn.unsafe(pgSql, args as any[]) as Promise<\n ArrayLike<unknown> & { count?: number }\n >,\n dbOpTimeoutMs(),\n () => {\n timedOut = true;\n disposePostgresPoolEventually(conn, \"timed-out worker query\");\n },\n );\n return {\n rows: Array.from(result),\n rowsAffected: result.count ?? 0,\n };\n } finally {\n if (!timedOut) {\n await conn.end().catch((err: unknown) => {\n console.warn(\n \"[db/postgres] worker query cleanup failed:\",\n err instanceof Error ? err.message : err,\n );\n });\n }\n }\n },\n async transaction<T>(fn: (tx: DbExec) => Promise<T>): Promise<T> {\n const conn = postgres(url, {\n max: 1,\n idle_timeout: 0,\n onnotice: () => {},\n });\n try {\n const result = await conn.begin(async (txSql: any) => {\n const tx: DbExec = {\n async execute(sql) {\n const { rawSql, args } = sqlAndArgs(sql);\n const pgSql = sqliteToPostgresParams(rawSql);\n const result = await withDbTimeout<\n ArrayLike<unknown> & { count?: number }\n >(\n \"query\",\n () =>\n txSql.unsafe(pgSql, args as any[]) as Promise<\n ArrayLike<unknown> & { count?: number }\n >,\n dbOpTimeoutMs(),\n );\n return {\n rows: Array.from(result),\n rowsAffected: result.count ?? 0,\n };\n },\n };\n return fn(tx);\n });\n return result as T;\n } finally {\n await conn.end().catch((err: unknown) => {\n console.warn(\n \"[db/postgres] worker transaction cleanup failed:\",\n err instanceof Error ? err.message : err,\n );\n });\n }\n },\n };\n } else {\n // Node.js: reuse connection pool. pgPoolOptions caps the pool to a\n // small size on serverless (Netlify/Vercel/Lambda/CF) so concurrent\n // frozen instances don't exhaust Neon/Postgres' connection limit;\n // idle_timeout also closes idle connections before Neon's ~5min\n // server-side timeout, avoiding ECONNRESET when the server hangs up.\n const createPool = () => postgres(url, pgPoolOptions(url));\n type PostgresPool = ReturnType<typeof createPool>;\n let pool = createPool();\n if (trackSingletonResources) _pgPool = pool;\n const recyclePool = (timedOutPool: PostgresPool) => {\n if (pool === timedOutPool) {\n pool = createPool();\n if (trackSingletonResources) _pgPool = pool;\n }\n disposePostgresPoolEventually(timedOutPool, \"timed-out pooled query\");\n };\n\n return {\n async execute(sql) {\n const { rawSql, args } = sqlAndArgs(sql);\n const pgSql = sqliteToPostgresParams(rawSql);\n const result = await retryOnConnectionError<\n ArrayLike<unknown> & { count?: number }\n >(() => {\n const queryPool = pool;\n const query = queryPool.unsafe(pgSql, args as any[]);\n return withDbTimeout(\n \"query\",\n () => query,\n dbOpTimeoutMs(),\n () => recyclePool(queryPool),\n );\n });\n return {\n rows: Array.from(result),\n rowsAffected: result.count ?? 0,\n };\n },\n async transaction<T>(fn: (tx: DbExec) => Promise<T>): Promise<T> {\n const result = await pool.begin(async (txSql: any) => {\n const tx: DbExec = {\n async execute(sql) {\n const { rawSql, args } = sqlAndArgs(sql);\n const pgSql = sqliteToPostgresParams(rawSql);\n const result = await withDbTimeout<\n ArrayLike<unknown> & { count?: number }\n >(\n \"query\",\n () =>\n txSql.unsafe(pgSql, args as any[]) as Promise<\n ArrayLike<unknown> & { count?: number }\n >,\n dbOpTimeoutMs(),\n );\n return {\n rows: Array.from(result),\n rowsAffected: result.count ?? 0,\n };\n },\n };\n return fn(tx);\n });\n return result as T;\n },\n async close() {\n await pool.end();\n },\n };\n }\n }\n\n // SQLite / libsql (default). Local file databases use better-sqlite3 so\n // serverless bundles do not need libsql's platform-specific native package.\n if (isLocalSqliteUrl(url)) {\n url = await prepareLocalSqliteUrl(\n url.startsWith(\"file:\") ? url : `file:${url}`,\n );\n const { default: Database } = await import(\"better-sqlite3\");\n const sqlite = new Database(sqliteFilenameFromUrl(url));\n sqlite.pragma(\"busy_timeout = 10000\");\n sqlite.pragma(\"journal_mode = WAL\");\n if (trackSingletonResources) _sqlite = sqlite;\n const execute: DbExec[\"execute\"] = async (sql) => {\n const { rawSql, args } = sqlAndArgs(sql);\n const stmt = sqlite.prepare(rawSql);\n if (stmt.reader) {\n return {\n rows: stmt.all(...args),\n rowsAffected: 0,\n };\n }\n const result = stmt.run(...args);\n return {\n rows: [],\n rowsAffected: result.changes ?? 0,\n };\n };\n\n return {\n execute,\n transaction: explicitTransaction(execute, \"BEGIN IMMEDIATE\"),\n async close() {\n sqlite.close();\n },\n };\n }\n\n const { createClient } = await import(\"@libsql/client/web\");\n const client = createClient({\n url,\n authToken: config.authToken,\n });\n const execute: DbExec[\"execute\"] = async (sql) => {\n if (typeof sql === \"string\") {\n const r = await client.execute(sql);\n return {\n rows: r.rows as any[],\n rowsAffected: r.rowsAffected,\n };\n }\n const r = await client.execute({\n sql: sql.sql,\n args: sql.args as any[],\n });\n return {\n rows: r.rows as any[],\n rowsAffected: r.rowsAffected,\n };\n };\n\n return {\n execute,\n transaction: explicitTransaction(execute),\n async close() {\n client.close();\n },\n };\n}\n\nexport async function createDbExec(config: DbExecConfig = {}): Promise<DbExec> {\n return createDbExecInternal(config, false);\n}\n\nasync function initClient(): Promise<void> {\n if (_exec) return;\n\n const dialect = getDialect();\n const url = getDatabaseUrl(\"file:./data/app.db\");\n _exec = await createDbExecInternal(\n {\n url,\n authToken: getDatabaseAuthToken(),\n d1Binding: dialect === \"d1\" ? globalThis.__cf_env?.DB : undefined,\n },\n true,\n );\n}\n\n/**\n * Get the singleton database client. Returns a `DbExec` whose first\n * `execute()` call lazily initializes the underlying driver.\n */\nexport function getDbExec(): DbExec {\n if (_exec) return _exec;\n\n // Sanitize args: replace undefined with null (libsql rejects undefined)\n function sanitize(\n sql: string | { sql: string; args?: unknown[] },\n ): string | { sql: string; args?: unknown[] } {\n if (typeof sql === \"object\" && sql.args) {\n return { ...sql, args: sql.args.map((a) => a ?? null) };\n }\n return sql;\n }\n\n // Return a proxy that lazy-inits on first call\n const proxy: DbExec = {\n async execute(sql) {\n if (!_initPromise) _initPromise = initClient();\n try {\n await _initPromise;\n } catch (err) {\n // A failed/hung init must not poison the singleton for the life of\n // the process — drop it so the next call retries a fresh connection\n // instead of re-awaiting a permanently rejected/pending promise.\n _initPromise = undefined;\n _exec = undefined;\n throw err;\n }\n // After init, swap to a sanitizing wrapper around the real client\n const wrapper: DbExec = {\n execute: (s) => _exec!.execute(sanitize(s)),\n transaction: _exec!.transaction\n ? (fn) =>\n _exec!.transaction!((tx) =>\n fn({\n execute: (s) => tx.execute(sanitize(s)),\n transaction: tx.transaction,\n }),\n )\n : undefined,\n };\n Object.assign(proxy, wrapper);\n return _exec!.execute(sanitize(sql));\n },\n async transaction(fn) {\n if (!_initPromise) _initPromise = initClient();\n try {\n await _initPromise;\n } catch (err) {\n _initPromise = undefined;\n _exec = undefined;\n throw err;\n }\n const wrapper: DbExec = {\n execute: (s) => _exec!.execute(sanitize(s)),\n transaction: _exec!.transaction\n ? (innerFn) =>\n _exec!.transaction!((tx) =>\n innerFn({\n execute: (s) => tx.execute(sanitize(s)),\n transaction: tx.transaction,\n }),\n )\n : undefined,\n };\n Object.assign(proxy, wrapper);\n if (_exec!.transaction) {\n return _exec!.transaction((tx) =>\n fn({\n execute: (s) => tx.execute(sanitize(s)),\n transaction: tx.transaction,\n }),\n );\n }\n return explicitTransaction(wrapper.execute)(fn);\n },\n };\n return proxy;\n}\n\n/** Close the database connection (for scripts that need cleanup). */\nexport async function closeDbExec(): Promise<void> {\n if (_pgPool) {\n await _pgPool.end();\n _pgPool = undefined;\n }\n if (_neonPool) {\n await _neonPool.end();\n _neonPool = undefined;\n }\n if (_sqlite) {\n _sqlite.close();\n _sqlite = undefined;\n }\n _exec = undefined;\n _initPromise = undefined;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"route-discovery.d.ts","sourceRoot":"","sources":["../../src/deploy/route-discovery.ts"],"names":[],"mappings":"AAYA;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,IAAI,CA2BP;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,MAAM,SAAK,GACV,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBnB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,eAAe,EAAE,CAAC,CAoB5B;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAapE;AASD;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAW1D,CAAC;AAWF,MAAM,WAAW,gBAAgB;IAC/B,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAaD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,GACd,KAAK,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAmB3C;AAyKD;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAoB7B;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmB7E"}
1
+ {"version":3,"file":"route-discovery.d.ts","sourceRoot":"","sources":["../../src/deploy/route-discovery.ts"],"names":[],"mappings":"AAYA;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,IAAI,CA2BP;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,MAAM,SAAK,GACV,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBnB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,eAAe,EAAE,CAAC,CAoB5B;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAapE;AASD;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAY1D,CAAC;AAWF,MAAM,WAAW,gBAAgB;IAC/B,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAaD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,GACd,KAAK,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAmB3C;AAyKD;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAoB7B;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmB7E"}
@@ -126,6 +126,7 @@ export const DEFAULT_PLUGIN_REGISTRY = {
126
126
  "context-xray": "defaultContextXrayPlugin",
127
127
  "core-routes": "defaultCoreRoutesPlugin",
128
128
  integrations: "defaultIntegrationsPlugin",
129
+ "observational-memory": "defaultObservationalMemoryPlugin",
129
130
  onboarding: "defaultOnboardingPlugin",
130
131
  org: "defaultOrgPlugin",
131
132
  resources: "defaultResourcesPlugin",
@@ -1 +1 @@
1
- {"version":3,"file":"route-discovery.js","sourceRoot":"","sources":["../../src/deploy/route-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,sDAAsD;AACtD,yFAAyF;AACzF,IAAI,GAAoC,CAAC;AACzC,KAAK,UAAU,KAAK;IAClB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAI5C,0BAA0B;IAC1B,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAEnD,+EAA+E;IAC/E,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,MAAM,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAE/B,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1D,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC1E,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAEhD,IAAI,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAE5C,8BAA8B;IAC9B,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IAEtD,yEAAyE;IACzE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;IAEvD,yBAAyB;IACzB,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAE9C,uBAAuB;IACvB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,GAAG,GAAG,GAAG,SAAS,CAAC;IAE5D,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAW,EACX,MAAM,GAAG,EAAE;IAEX,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YAC5D,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;YACxE,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,+BAA+B;IAC5C,CAAC;AACH,CAAC;AAWD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAW;IAEX,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IACnD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,6BAA6B,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG;QACjB,GAAG,CAAC,MAAM,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACvC,GAAG,CAAC,MAAM,aAAa,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;KAC1D,CAAC;IACF,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,MAAM,CAAC,IAAI,CAAC;YACV,GAAG,MAAM;YACT,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,CAAC;SAClD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW;IAC/C,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QACpD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,EAAE,CAAC;QAC1C,OAAO,EAAE;aACN,WAAW,CAAC,UAAU,CAAC;aACvB,MAAM,CAAC,mBAAmB,CAAC;aAC3B,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,+BAA+B;IAC5C,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,yBAAyB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3D,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAA2B;IAC7D,YAAY,EAAE,wBAAwB;IACtC,IAAI,EAAE,mBAAmB;IACzB,cAAc,EAAE,0BAA0B;IAC1C,aAAa,EAAE,yBAAyB;IACxC,YAAY,EAAE,2BAA2B;IACzC,UAAU,EAAE,yBAAyB;IACrC,GAAG,EAAE,kBAAkB;IACvB,SAAS,EAAE,wBAAwB;IACnC,MAAM,EAAE,qBAAqB;IAC7B,QAAQ,EAAE,uBAAuB;CAClC,CAAC;AAEF,2EAA2E;AAC3E,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,SAAS;IACT,KAAK;IACL,YAAY;IACZ,WAAW;IACX,UAAU;CACX,CAAC,CAAC;AAiBH,2DAA2D;AAC3D,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACnC,KAAK;IACL,MAAM;IACN,KAAK;IACL,OAAO;IACP,QAAQ;IACR,SAAS;IACT,MAAM;CACP,CAAC,CAAC;AAEH;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAAe;IAEf,IAAI,MAAM,GAAG,MAAM,CAAC;IACpB,IAAI,IAAwB,CAAC;IAE7B,MAAM,UAAU,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,UAAU,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAEvC,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,UAAU,CAAC;QACxB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACrE,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACvC,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,MAAM,GAAG,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC9D,IAAI,SAAS;YAAE,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAe;IAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,GAAI,CAAC;QACrC,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACxC,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;YAClB,CAAC,GAAG,OAAO,CAAC;YACZ,SAAS;QACX,CAAC;QAED,IACE,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YAC7B,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACjC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EACjC,CAAC;YACD,IAAI,UAAU,GAAG,yBAAyB,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC;gBAChC,CAAC,IAAI,CAAC,CAAC;gBACP,SAAS;YACX,CAAC;YAED,UAAU,GAAG,yBAAyB,CAAC,OAAO,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;YAChE,IACE,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC;gBACvC,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAC1C,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC;gBAChC,OAAO,yBAAyB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAED,CAAC,IAAI,CAAC,CAAC;IACT,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,yBAAyB,CAChC,OAAe,EACf,cAAsB;IAEtB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,cAAc,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,GAAI,CAAC;QAClD,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACxC,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;YAClB,CAAC,GAAG,OAAO,CAAC;YACZ,SAAS;QACX,CAAC;QAED,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACtB,KAAK,IAAI,CAAC,CAAC;YACX,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC;QAED,CAAC,IAAI,CAAC,CAAC;IACT,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,yBAAyB,CAAC,OAAe,EAAE,KAAa;IAC/D,IAAI,CAAC,GAAG,KAAK,CAAC;IACd,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1B,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACxC,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;YAClB,CAAC,GAAG,OAAO,CAAC;YACZ,SAAS;QACX,CAAC;QAED,MAAM;IACR,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,WAAW,CAAC,OAAe,EAAE,KAAa;IACjD,OAAO,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,WAAW,CAAC,OAAe,EAAE,KAAa;IACjD,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QACzD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACjD,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QACzD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC/C,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,OAAe,EAAE,KAAa;IAChD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IAElE,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACxB,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAsB;IAC9C,OAAO,EAAE,KAAK,SAAS,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,cAAc,CAAC,UAAkB;IAC9C,MAAM,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;IACzB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,CAAC;IAE1C,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACpD,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC1C,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACzC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QACvC,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,MAAM,GAAG,GAAuB,EAAE,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAE5C,8DAA8D;QAC9D,6DAA6D;QAC7D,6DAA6D;QAC7D,iEAAiE;QACjE,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;YAAE,SAAS;QAEhD,MAAM,IAAI,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,IAAI,KAAK,KAAK;YAAE,SAAS,CAAC,aAAa;QAE3C,GAAG,CAAC,IAAI,CAAC;YACP,IAAI;YACJ,OAAO;YACP,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1C,CAAC,CAAC;IACL,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,GAAW;IAEX,MAAM,eAAe,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;IACnD,KAAK,MAAM,CAAC,IAAI,eAAe;QAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAEvD,6DAA6D;IAC7D,IAAI,CAAC;QACH,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACxE,MAAM,EAAE,GAAG,MAAM,uBAAuB,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;YACxB,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;YACtD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;oBAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,oDAAoD;IACtD,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,GAAW;IACxD,IAAI,aAA0B,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QACpD,aAAa,GAAG,IAAI,GAAG,CACrB,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;YACvB,CAAC,CAAC,EAAE;iBACC,WAAW,CAAC,UAAU,CAAC;iBACvB,MAAM,CAAC,mBAAmB,CAAC;iBAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAClD,CAAC,CAAC,EAAE,CACP,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,aAAa,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,mDAAmD;IAChF,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,MAAM,CAChD,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CACnC,CAAC;AACJ,CAAC","sourcesContent":["import path from \"path\";\n\n// Lazy fs — loaded via dynamic import() on first use.\n// Avoids require() which bundlers convert to createRequire() that crashes on CF Workers.\nlet _fs: typeof import(\"fs\") | undefined;\nasync function getFs(): Promise<typeof import(\"fs\")> {\n if (!_fs) {\n _fs = await import(\"node:fs\");\n }\n return _fs;\n}\n\n/**\n * Map a Nitro-style route file path to { method, route }.\n *\n * Examples:\n * api/emails/index.get.ts → GET /api/emails\n * api/emails/[id].get.ts → GET /api/emails/:id\n * api/emails/[id]/star.patch.ts→ PATCH /api/emails/:id/star\n * api/events.get.ts → GET /api/events\n */\nexport function parseRouteFile(relPath: string): {\n method: string;\n route: string;\n} | null {\n // Strip .ts/.js extension\n const withoutExt = relPath.replace(/\\.[tj]s$/, \"\");\n\n // Extract HTTP method from the last segment (e.g. \"status.get\" → method=\"get\")\n const dotIdx = withoutExt.lastIndexOf(\".\");\n if (dotIdx === -1) return null;\n\n const method = withoutExt.slice(dotIdx + 1).toLowerCase();\n const validMethods = [\"get\", \"post\", \"put\", \"patch\", \"delete\", \"options\"];\n if (!validMethods.includes(method)) return null;\n\n let routePath = withoutExt.slice(0, dotIdx);\n\n // Replace [param] with :param\n routePath = routePath.replace(/\\[([^\\]]+)\\]/g, \":$1\");\n\n // Replace [...catchall] with ** (H3 catch-all syntax, value in params._)\n routePath = routePath.replace(/:\\.\\.\\.([^/]+)/g, \"**\");\n\n // Remove trailing /index\n routePath = routePath.replace(/\\/index$/, \"\");\n\n // Ensure leading slash\n if (!routePath.startsWith(\"/\")) routePath = \"/\" + routePath;\n\n return { method, route: routePath };\n}\n\n/**\n * Recursively discover all .ts files under a directory.\n */\nexport async function discoverFiles(\n dir: string,\n prefix = \"\",\n): Promise<string[]> {\n try {\n const fs = await getFs();\n if (!fs.existsSync(dir)) return [];\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n const rel = prefix ? `${prefix}/${entry.name}` : entry.name;\n if (entry.isDirectory()) {\n files.push(...(await discoverFiles(path.join(dir, entry.name), rel)));\n } else if (entry.name.endsWith(\".ts\") || entry.name.endsWith(\".js\")) {\n files.push(rel);\n }\n }\n return files;\n } catch {\n return []; // Edge runtime — no filesystem\n }\n}\n\nexport interface DiscoveredRoute {\n method: string;\n route: string;\n /** Relative path from server/routes/ */\n filePath: string;\n /** Absolute path on disk */\n absPath: string;\n}\n\n/**\n * Discover all API routes in a project's server/routes/ directory.\n */\nexport async function discoverApiRoutes(\n cwd: string,\n): Promise<DiscoveredRoute[]> {\n const apiDir = path.join(cwd, \"server/routes/api\");\n const agentNativeDir = path.join(cwd, \"server/routes/_agent-native\");\n const routeFiles = [\n ...(await discoverFiles(apiDir, \"api\")),\n ...(await discoverFiles(agentNativeDir, \"_agent-native\")),\n ];\n const routes: DiscoveredRoute[] = [];\n\n for (const relFile of routeFiles) {\n const parsed = parseRouteFile(relFile);\n if (!parsed) continue;\n routes.push({\n ...parsed,\n filePath: relFile,\n absPath: path.join(cwd, \"server/routes\", relFile),\n });\n }\n\n return routes;\n}\n\n/**\n * Discover all server plugins in a project's server/plugins/ directory.\n */\nexport async function discoverPlugins(cwd: string): Promise<string[]> {\n try {\n const fs = await getFs();\n const pluginsDir = path.join(cwd, \"server/plugins\");\n if (!fs.existsSync(pluginsDir)) return [];\n return fs\n .readdirSync(pluginsDir)\n .filter(isRuntimeSourceFile)\n .sort()\n .map((f) => path.join(pluginsDir, f));\n } catch {\n return []; // Edge runtime — no filesystem\n }\n}\n\nfunction isRuntimeSourceFile(filename: string): boolean {\n if (!/\\.(ts|js)$/.test(filename)) return false;\n if (/\\.d\\.ts$/.test(filename)) return false;\n if (/\\.(test|spec)\\.(ts|js)$/.test(filename)) return false;\n return true;\n}\n\n/**\n * Default plugins that auto-mount when not provided by the template.\n * Key = filename stem, value = export name from @agent-native/core/server.\n */\nexport const DEFAULT_PLUGIN_REGISTRY: Record<string, string> = {\n \"agent-chat\": \"defaultAgentChatPlugin\",\n auth: \"defaultAuthPlugin\",\n \"context-xray\": \"defaultContextXrayPlugin\",\n \"core-routes\": \"defaultCoreRoutesPlugin\",\n integrations: \"defaultIntegrationsPlugin\",\n onboarding: \"defaultOnboardingPlugin\",\n org: \"defaultOrgPlugin\",\n resources: \"defaultResourcesPlugin\",\n sentry: \"defaultSentryPlugin\",\n terminal: \"defaultTerminalPlugin\",\n};\n\n/** Files to skip during action discovery (mirrors action-discovery.ts). */\nconst SKIP_ACTION_FILES = new Set([\n \"helpers\",\n \"run\",\n \"db-connect\",\n \"db-status\",\n \"registry\",\n]);\n\nexport interface DiscoveredAction {\n /** Action name (filename without extension) */\n name: string;\n /** Absolute path to the action file */\n absPath: string;\n /** HTTP method (from defineAction's http config, default POST) */\n method: string;\n /**\n * Custom route segment from defineAction's `http.path`. When unset the\n * route falls back to `name`, mirroring the runtime mount\n * (`action-routes.ts`: `path = http?.path ?? name`).\n */\n path?: string;\n}\n\n/** HTTP methods an action may expose via `http.method`. */\nconst VALID_ACTION_METHODS = new Set([\n \"get\",\n \"post\",\n \"put\",\n \"patch\",\n \"delete\",\n \"options\",\n \"head\",\n]);\n\n/**\n * Statically extract the `http` config from a defineAction source file.\n *\n * Deploy discovery cannot import the action module — edge bundlers rewrite\n * require()/import in ways that crash (see getFs note above), and action\n * files often pull in Node-only deps — so we parse the source text instead.\n * The parse is scoped to the `http: { ... }` object literal so unrelated\n * `method:`/`path:` keys elsewhere in the file (e.g. a\n * `fetch(url, { method: \"GET\" })` in the action body) cannot flip the\n * route's method. A naive `content.includes('method: \"GET\"')` did exactly\n * that, and it also missed PUT/PATCH/DELETE and dropped `http.path`.\n *\n * The http config may contain nested object literals before `method` or\n * `path`, so extract the object body with a small balanced-brace scan rather\n * than a non-greedy regex that stops at the first closing brace.\n *\n * Returns `false` when the action opts out of HTTP (`http: false`); otherwise\n * `{ method, path? }` with method lowercased and defaulting to \"post\".\n */\nexport function parseActionHttpConfig(\n content: string,\n): false | { method: string; path?: string } {\n let method = \"post\";\n let path: string | undefined;\n\n const httpConfig = extractActionHttpConfig(content);\n if (httpConfig === false) return false;\n\n if (typeof httpConfig === \"string\") {\n const body = httpConfig;\n const methodMatch = body.match(/\\bmethod\\s*:\\s*['\"]([A-Za-z]+)['\"]/);\n if (methodMatch) {\n const m = methodMatch[1].toLowerCase();\n if (VALID_ACTION_METHODS.has(m)) method = m;\n }\n const pathMatch = body.match(/\\bpath\\s*:\\s*['\"]([^'\"]+)['\"]/);\n if (pathMatch) path = pathMatch[1];\n }\n\n return { method, path };\n}\n\nfunction extractActionHttpConfig(content: string): false | string | undefined {\n for (let i = 0; i < content.length; ) {\n const skipped = skipNonCode(content, i);\n if (skipped !== i) {\n i = skipped;\n continue;\n }\n\n if (\n content.startsWith(\"http\", i) &&\n !isIdentifierChar(content[i - 1]) &&\n !isIdentifierChar(content[i + 4])\n ) {\n let valueStart = skipWhitespaceAndComments(content, i + 4);\n if (content[valueStart] !== \":\") {\n i += 4;\n continue;\n }\n\n valueStart = skipWhitespaceAndComments(content, valueStart + 1);\n if (\n content.startsWith(\"false\", valueStart) &&\n !isIdentifierChar(content[valueStart + 5])\n ) {\n return false;\n }\n\n if (content[valueStart] === \"{\") {\n return extractBalancedObjectBody(content, valueStart);\n }\n }\n\n i += 1;\n }\n\n return undefined;\n}\n\nfunction extractBalancedObjectBody(\n content: string,\n openBraceIndex: number,\n): string | undefined {\n let depth = 0;\n for (let i = openBraceIndex; i < content.length; ) {\n const skipped = skipNonCode(content, i);\n if (skipped !== i) {\n i = skipped;\n continue;\n }\n\n const ch = content[i];\n if (ch === \"{\") {\n depth += 1;\n } else if (ch === \"}\") {\n depth -= 1;\n if (depth === 0) return content.slice(openBraceIndex + 1, i);\n }\n\n i += 1;\n }\n\n return undefined;\n}\n\nfunction skipWhitespaceAndComments(content: string, start: number): number {\n let i = start;\n while (i < content.length) {\n if (/\\s/.test(content[i])) {\n i += 1;\n continue;\n }\n\n const skipped = skipComment(content, i);\n if (skipped !== i) {\n i = skipped;\n continue;\n }\n\n break;\n }\n return i;\n}\n\nfunction skipNonCode(content: string, start: number): number {\n return skipComment(content, skipString(content, start));\n}\n\nfunction skipComment(content: string, start: number): number {\n if (content[start] === \"/\" && content[start + 1] === \"/\") {\n const newline = content.indexOf(\"\\n\", start + 2);\n return newline === -1 ? content.length : newline + 1;\n }\n\n if (content[start] === \"/\" && content[start + 1] === \"*\") {\n const close = content.indexOf(\"*/\", start + 2);\n return close === -1 ? content.length : close + 2;\n }\n\n return start;\n}\n\nfunction skipString(content: string, start: number): number {\n const quote = content[start];\n if (quote !== \"'\" && quote !== '\"' && quote !== \"`\") return start;\n\n for (let i = start + 1; i < content.length; i += 1) {\n if (content[i] === \"\\\\\") {\n i += 1;\n continue;\n }\n if (content[i] === quote) return i + 1;\n }\n\n return content.length;\n}\n\nfunction isIdentifierChar(ch: string | undefined): boolean {\n return ch !== undefined && /[A-Za-z0-9_$]/.test(ch);\n}\n\n/**\n * Scan a single actions directory for defineAction-backed files. Shared\n * between the template-actions path and the workspace-core actions layer.\n */\nasync function scanActionsDir(actionsDir: string): Promise<DiscoveredAction[]> {\n const fs = await getFs();\n if (!fs.existsSync(actionsDir)) return [];\n\n const files = fs.readdirSync(actionsDir).filter((f) => {\n if (!isRuntimeSourceFile(f)) return false;\n const name = f.replace(/\\.(ts|js)$/, \"\");\n if (name.startsWith(\"_\")) return false;\n if (SKIP_ACTION_FILES.has(name)) return false;\n return true;\n });\n\n const out: DiscoveredAction[] = [];\n for (const file of files) {\n const name = file.replace(/\\.(ts|js)$/, \"\");\n const absPath = path.join(actionsDir, file);\n\n // Only mount actions that use defineAction. CLI-style scripts\n // (export default async function()) often use Node-only APIs\n // (fs, path) that can't run on edge runtimes — they're meant\n // to be invoked via `pnpm action <name>`, not as HTTP endpoints.\n let content: string;\n try {\n content = fs.readFileSync(absPath, \"utf-8\");\n } catch {\n continue;\n }\n if (!content.includes(\"defineAction\")) continue;\n\n const http = parseActionHttpConfig(content);\n if (http === false) continue; // agent-only\n\n out.push({\n name,\n absPath,\n method: http.method,\n ...(http.path ? { path: http.path } : {}),\n });\n }\n\n return out;\n}\n\n/**\n * Discover action files in the actions/ directory.\n *\n * When a workspace core is present in the ancestor chain, its actions/\n * directory is also scanned and its actions are merged in after the\n * template's — with template actions winning on name collision.\n *\n * These become `/_agent-native/actions/:name` HTTP endpoints.\n */\nexport async function discoverActionFiles(\n cwd: string,\n): Promise<DiscoveredAction[]> {\n const templateActions = await scanActionsDir(path.join(cwd, \"actions\"));\n const byName = new Map<string, DiscoveredAction>();\n for (const a of templateActions) byName.set(a.name, a);\n\n // Merge workspace-core actions (template wins on collision).\n try {\n const { getWorkspaceCoreExports } = await import(\"./workspace-core.js\");\n const ws = await getWorkspaceCoreExports(cwd);\n if (ws && ws.actionsDir) {\n const wsActions = await scanActionsDir(ws.actionsDir);\n for (const a of wsActions) {\n if (!byName.has(a.name)) byName.set(a.name, a);\n }\n }\n } catch {\n // Edge runtime / no fs — skip workspace-core merge.\n }\n\n return Array.from(byName.values());\n}\n\n/**\n * Returns the stems of default plugins that are missing from the project.\n */\nexport async function getMissingDefaultPlugins(cwd: string): Promise<string[]> {\n let existingStems: Set<string>;\n try {\n const fs = await getFs();\n const pluginsDir = path.join(cwd, \"server/plugins\");\n existingStems = new Set(\n fs.existsSync(pluginsDir)\n ? fs\n .readdirSync(pluginsDir)\n .filter(isRuntimeSourceFile)\n .map((f) => path.basename(f, path.extname(f)))\n : [],\n );\n } catch {\n existingStems = new Set(); // Edge runtime — all defaults will be auto-mounted\n }\n return Object.keys(DEFAULT_PLUGIN_REGISTRY).filter(\n (stem) => !existingStems.has(stem),\n );\n}\n"]}
1
+ {"version":3,"file":"route-discovery.js","sourceRoot":"","sources":["../../src/deploy/route-discovery.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\";\n\n// Lazy fs — loaded via dynamic import() on first use.\n// Avoids require() which bundlers convert to createRequire() that crashes on CF Workers.\nlet _fs: typeof import(\"fs\") | undefined;\nasync function getFs(): Promise<typeof import(\"fs\")> {\n if (!_fs) {\n _fs = await import(\"node:fs\");\n }\n return _fs;\n}\n\n/**\n * Map a Nitro-style route file path to { method, route }.\n *\n * Examples:\n * api/emails/index.get.ts → GET /api/emails\n * api/emails/[id].get.ts → GET /api/emails/:id\n * api/emails/[id]/star.patch.ts→ PATCH /api/emails/:id/star\n * api/events.get.ts → GET /api/events\n */\nexport function parseRouteFile(relPath: string): {\n method: string;\n route: string;\n} | null {\n // Strip .ts/.js extension\n const withoutExt = relPath.replace(/\\.[tj]s$/, \"\");\n\n // Extract HTTP method from the last segment (e.g. \"status.get\" → method=\"get\")\n const dotIdx = withoutExt.lastIndexOf(\".\");\n if (dotIdx === -1) return null;\n\n const method = withoutExt.slice(dotIdx + 1).toLowerCase();\n const validMethods = [\"get\", \"post\", \"put\", \"patch\", \"delete\", \"options\"];\n if (!validMethods.includes(method)) return null;\n\n let routePath = withoutExt.slice(0, dotIdx);\n\n // Replace [param] with :param\n routePath = routePath.replace(/\\[([^\\]]+)\\]/g, \":$1\");\n\n // Replace [...catchall] with ** (H3 catch-all syntax, value in params._)\n routePath = routePath.replace(/:\\.\\.\\.([^/]+)/g, \"**\");\n\n // Remove trailing /index\n routePath = routePath.replace(/\\/index$/, \"\");\n\n // Ensure leading slash\n if (!routePath.startsWith(\"/\")) routePath = \"/\" + routePath;\n\n return { method, route: routePath };\n}\n\n/**\n * Recursively discover all .ts files under a directory.\n */\nexport async function discoverFiles(\n dir: string,\n prefix = \"\",\n): Promise<string[]> {\n try {\n const fs = await getFs();\n if (!fs.existsSync(dir)) return [];\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n const rel = prefix ? `${prefix}/${entry.name}` : entry.name;\n if (entry.isDirectory()) {\n files.push(...(await discoverFiles(path.join(dir, entry.name), rel)));\n } else if (entry.name.endsWith(\".ts\") || entry.name.endsWith(\".js\")) {\n files.push(rel);\n }\n }\n return files;\n } catch {\n return []; // Edge runtime — no filesystem\n }\n}\n\nexport interface DiscoveredRoute {\n method: string;\n route: string;\n /** Relative path from server/routes/ */\n filePath: string;\n /** Absolute path on disk */\n absPath: string;\n}\n\n/**\n * Discover all API routes in a project's server/routes/ directory.\n */\nexport async function discoverApiRoutes(\n cwd: string,\n): Promise<DiscoveredRoute[]> {\n const apiDir = path.join(cwd, \"server/routes/api\");\n const agentNativeDir = path.join(cwd, \"server/routes/_agent-native\");\n const routeFiles = [\n ...(await discoverFiles(apiDir, \"api\")),\n ...(await discoverFiles(agentNativeDir, \"_agent-native\")),\n ];\n const routes: DiscoveredRoute[] = [];\n\n for (const relFile of routeFiles) {\n const parsed = parseRouteFile(relFile);\n if (!parsed) continue;\n routes.push({\n ...parsed,\n filePath: relFile,\n absPath: path.join(cwd, \"server/routes\", relFile),\n });\n }\n\n return routes;\n}\n\n/**\n * Discover all server plugins in a project's server/plugins/ directory.\n */\nexport async function discoverPlugins(cwd: string): Promise<string[]> {\n try {\n const fs = await getFs();\n const pluginsDir = path.join(cwd, \"server/plugins\");\n if (!fs.existsSync(pluginsDir)) return [];\n return fs\n .readdirSync(pluginsDir)\n .filter(isRuntimeSourceFile)\n .sort()\n .map((f) => path.join(pluginsDir, f));\n } catch {\n return []; // Edge runtime — no filesystem\n }\n}\n\nfunction isRuntimeSourceFile(filename: string): boolean {\n if (!/\\.(ts|js)$/.test(filename)) return false;\n if (/\\.d\\.ts$/.test(filename)) return false;\n if (/\\.(test|spec)\\.(ts|js)$/.test(filename)) return false;\n return true;\n}\n\n/**\n * Default plugins that auto-mount when not provided by the template.\n * Key = filename stem, value = export name from @agent-native/core/server.\n */\nexport const DEFAULT_PLUGIN_REGISTRY: Record<string, string> = {\n \"agent-chat\": \"defaultAgentChatPlugin\",\n auth: \"defaultAuthPlugin\",\n \"context-xray\": \"defaultContextXrayPlugin\",\n \"core-routes\": \"defaultCoreRoutesPlugin\",\n integrations: \"defaultIntegrationsPlugin\",\n \"observational-memory\": \"defaultObservationalMemoryPlugin\",\n onboarding: \"defaultOnboardingPlugin\",\n org: \"defaultOrgPlugin\",\n resources: \"defaultResourcesPlugin\",\n sentry: \"defaultSentryPlugin\",\n terminal: \"defaultTerminalPlugin\",\n};\n\n/** Files to skip during action discovery (mirrors action-discovery.ts). */\nconst SKIP_ACTION_FILES = new Set([\n \"helpers\",\n \"run\",\n \"db-connect\",\n \"db-status\",\n \"registry\",\n]);\n\nexport interface DiscoveredAction {\n /** Action name (filename without extension) */\n name: string;\n /** Absolute path to the action file */\n absPath: string;\n /** HTTP method (from defineAction's http config, default POST) */\n method: string;\n /**\n * Custom route segment from defineAction's `http.path`. When unset the\n * route falls back to `name`, mirroring the runtime mount\n * (`action-routes.ts`: `path = http?.path ?? name`).\n */\n path?: string;\n}\n\n/** HTTP methods an action may expose via `http.method`. */\nconst VALID_ACTION_METHODS = new Set([\n \"get\",\n \"post\",\n \"put\",\n \"patch\",\n \"delete\",\n \"options\",\n \"head\",\n]);\n\n/**\n * Statically extract the `http` config from a defineAction source file.\n *\n * Deploy discovery cannot import the action module — edge bundlers rewrite\n * require()/import in ways that crash (see getFs note above), and action\n * files often pull in Node-only deps — so we parse the source text instead.\n * The parse is scoped to the `http: { ... }` object literal so unrelated\n * `method:`/`path:` keys elsewhere in the file (e.g. a\n * `fetch(url, { method: \"GET\" })` in the action body) cannot flip the\n * route's method. A naive `content.includes('method: \"GET\"')` did exactly\n * that, and it also missed PUT/PATCH/DELETE and dropped `http.path`.\n *\n * The http config may contain nested object literals before `method` or\n * `path`, so extract the object body with a small balanced-brace scan rather\n * than a non-greedy regex that stops at the first closing brace.\n *\n * Returns `false` when the action opts out of HTTP (`http: false`); otherwise\n * `{ method, path? }` with method lowercased and defaulting to \"post\".\n */\nexport function parseActionHttpConfig(\n content: string,\n): false | { method: string; path?: string } {\n let method = \"post\";\n let path: string | undefined;\n\n const httpConfig = extractActionHttpConfig(content);\n if (httpConfig === false) return false;\n\n if (typeof httpConfig === \"string\") {\n const body = httpConfig;\n const methodMatch = body.match(/\\bmethod\\s*:\\s*['\"]([A-Za-z]+)['\"]/);\n if (methodMatch) {\n const m = methodMatch[1].toLowerCase();\n if (VALID_ACTION_METHODS.has(m)) method = m;\n }\n const pathMatch = body.match(/\\bpath\\s*:\\s*['\"]([^'\"]+)['\"]/);\n if (pathMatch) path = pathMatch[1];\n }\n\n return { method, path };\n}\n\nfunction extractActionHttpConfig(content: string): false | string | undefined {\n for (let i = 0; i < content.length; ) {\n const skipped = skipNonCode(content, i);\n if (skipped !== i) {\n i = skipped;\n continue;\n }\n\n if (\n content.startsWith(\"http\", i) &&\n !isIdentifierChar(content[i - 1]) &&\n !isIdentifierChar(content[i + 4])\n ) {\n let valueStart = skipWhitespaceAndComments(content, i + 4);\n if (content[valueStart] !== \":\") {\n i += 4;\n continue;\n }\n\n valueStart = skipWhitespaceAndComments(content, valueStart + 1);\n if (\n content.startsWith(\"false\", valueStart) &&\n !isIdentifierChar(content[valueStart + 5])\n ) {\n return false;\n }\n\n if (content[valueStart] === \"{\") {\n return extractBalancedObjectBody(content, valueStart);\n }\n }\n\n i += 1;\n }\n\n return undefined;\n}\n\nfunction extractBalancedObjectBody(\n content: string,\n openBraceIndex: number,\n): string | undefined {\n let depth = 0;\n for (let i = openBraceIndex; i < content.length; ) {\n const skipped = skipNonCode(content, i);\n if (skipped !== i) {\n i = skipped;\n continue;\n }\n\n const ch = content[i];\n if (ch === \"{\") {\n depth += 1;\n } else if (ch === \"}\") {\n depth -= 1;\n if (depth === 0) return content.slice(openBraceIndex + 1, i);\n }\n\n i += 1;\n }\n\n return undefined;\n}\n\nfunction skipWhitespaceAndComments(content: string, start: number): number {\n let i = start;\n while (i < content.length) {\n if (/\\s/.test(content[i])) {\n i += 1;\n continue;\n }\n\n const skipped = skipComment(content, i);\n if (skipped !== i) {\n i = skipped;\n continue;\n }\n\n break;\n }\n return i;\n}\n\nfunction skipNonCode(content: string, start: number): number {\n return skipComment(content, skipString(content, start));\n}\n\nfunction skipComment(content: string, start: number): number {\n if (content[start] === \"/\" && content[start + 1] === \"/\") {\n const newline = content.indexOf(\"\\n\", start + 2);\n return newline === -1 ? content.length : newline + 1;\n }\n\n if (content[start] === \"/\" && content[start + 1] === \"*\") {\n const close = content.indexOf(\"*/\", start + 2);\n return close === -1 ? content.length : close + 2;\n }\n\n return start;\n}\n\nfunction skipString(content: string, start: number): number {\n const quote = content[start];\n if (quote !== \"'\" && quote !== '\"' && quote !== \"`\") return start;\n\n for (let i = start + 1; i < content.length; i += 1) {\n if (content[i] === \"\\\\\") {\n i += 1;\n continue;\n }\n if (content[i] === quote) return i + 1;\n }\n\n return content.length;\n}\n\nfunction isIdentifierChar(ch: string | undefined): boolean {\n return ch !== undefined && /[A-Za-z0-9_$]/.test(ch);\n}\n\n/**\n * Scan a single actions directory for defineAction-backed files. Shared\n * between the template-actions path and the workspace-core actions layer.\n */\nasync function scanActionsDir(actionsDir: string): Promise<DiscoveredAction[]> {\n const fs = await getFs();\n if (!fs.existsSync(actionsDir)) return [];\n\n const files = fs.readdirSync(actionsDir).filter((f) => {\n if (!isRuntimeSourceFile(f)) return false;\n const name = f.replace(/\\.(ts|js)$/, \"\");\n if (name.startsWith(\"_\")) return false;\n if (SKIP_ACTION_FILES.has(name)) return false;\n return true;\n });\n\n const out: DiscoveredAction[] = [];\n for (const file of files) {\n const name = file.replace(/\\.(ts|js)$/, \"\");\n const absPath = path.join(actionsDir, file);\n\n // Only mount actions that use defineAction. CLI-style scripts\n // (export default async function()) often use Node-only APIs\n // (fs, path) that can't run on edge runtimes — they're meant\n // to be invoked via `pnpm action <name>`, not as HTTP endpoints.\n let content: string;\n try {\n content = fs.readFileSync(absPath, \"utf-8\");\n } catch {\n continue;\n }\n if (!content.includes(\"defineAction\")) continue;\n\n const http = parseActionHttpConfig(content);\n if (http === false) continue; // agent-only\n\n out.push({\n name,\n absPath,\n method: http.method,\n ...(http.path ? { path: http.path } : {}),\n });\n }\n\n return out;\n}\n\n/**\n * Discover action files in the actions/ directory.\n *\n * When a workspace core is present in the ancestor chain, its actions/\n * directory is also scanned and its actions are merged in after the\n * template's — with template actions winning on name collision.\n *\n * These become `/_agent-native/actions/:name` HTTP endpoints.\n */\nexport async function discoverActionFiles(\n cwd: string,\n): Promise<DiscoveredAction[]> {\n const templateActions = await scanActionsDir(path.join(cwd, \"actions\"));\n const byName = new Map<string, DiscoveredAction>();\n for (const a of templateActions) byName.set(a.name, a);\n\n // Merge workspace-core actions (template wins on collision).\n try {\n const { getWorkspaceCoreExports } = await import(\"./workspace-core.js\");\n const ws = await getWorkspaceCoreExports(cwd);\n if (ws && ws.actionsDir) {\n const wsActions = await scanActionsDir(ws.actionsDir);\n for (const a of wsActions) {\n if (!byName.has(a.name)) byName.set(a.name, a);\n }\n }\n } catch {\n // Edge runtime / no fs — skip workspace-core merge.\n }\n\n return Array.from(byName.values());\n}\n\n/**\n * Returns the stems of default plugins that are missing from the project.\n */\nexport async function getMissingDefaultPlugins(cwd: string): Promise<string[]> {\n let existingStems: Set<string>;\n try {\n const fs = await getFs();\n const pluginsDir = path.join(cwd, \"server/plugins\");\n existingStems = new Set(\n fs.existsSync(pluginsDir)\n ? fs\n .readdirSync(pluginsDir)\n .filter(isRuntimeSourceFile)\n .map((f) => path.basename(f, path.extname(f)))\n : [],\n );\n } catch {\n existingStems = new Set(); // Edge runtime — all defaults will be auto-mounted\n }\n return Object.keys(DEFAULT_PLUGIN_REGISTRY).filter(\n (stem) => !existingStems.has(stem),\n );\n}\n"]}