@aotter/mantle 0.2.0-alpha.1 → 0.2.0-alpha.11

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 (936) hide show
  1. package/README.md +180 -45
  2. package/dist/auth/adapter.d.ts +32 -0
  3. package/dist/auth/adapter.js +261 -0
  4. package/dist/auth/admin.d.ts +3 -0
  5. package/dist/auth/admin.js +18 -0
  6. package/dist/auth/caller.d.ts +86 -0
  7. package/dist/auth/caller.js +128 -0
  8. package/dist/auth/{createAuthRoutes.js → consent.js} +26 -54
  9. package/dist/auth/hardening.d.ts +24 -0
  10. package/dist/auth/hardening.js +33 -0
  11. package/dist/auth/identity.d.ts +121 -0
  12. package/dist/auth/identity.js +192 -0
  13. package/dist/auth/oauth.d.ts +63 -0
  14. package/dist/auth/oauth.js +185 -0
  15. package/dist/auth/resource-seeds.js +8 -0
  16. package/dist/auth/route-http.js +33 -0
  17. package/dist/auth/routes.d.ts +32 -0
  18. package/dist/auth/routes.js +80 -0
  19. package/dist/build/compiler.d.ts +122 -0
  20. package/dist/build/compiler.js +3 -0
  21. package/dist/{spec → build/spec}/domain/model/ManifestGrammar.d.ts +30 -43
  22. package/dist/{spec → build/spec}/domain/model/RuntimePlan.d.ts +77 -3
  23. package/dist/{spec → build/spec}/domain/model/SqlIr.d.ts +39 -6
  24. package/dist/build/spec/domain/model/UserFields.d.ts +21 -0
  25. package/dist/{spec → build/spec}/domain/service/PlanFingerprint.d.ts +4 -1
  26. package/dist/{spec → build/spec}/kernel/diagnostic.d.ts +1 -30
  27. package/dist/bun/assets.d.ts +2 -0
  28. package/dist/bun/assets.js +22 -0
  29. package/dist/domain/adminOrder.js +22 -0
  30. package/dist/domain/columns.js +42 -0
  31. package/dist/domain/describe/chunk-SGMRVDGE.js +1 -0
  32. package/dist/domain/describe/index.d.ts +58 -0
  33. package/dist/domain/describe/index.js +1 -0
  34. package/dist/domain/describe/target-hash.d.ts +8 -0
  35. package/dist/domain/describe/target-hash.js +1 -0
  36. package/dist/domain/describe/targets.d.ts +40 -0
  37. package/dist/domain/entry.js +19 -0
  38. package/dist/domain/generated-tools.js +18 -0
  39. package/dist/domain/generation.d.ts +16 -0
  40. package/dist/domain/generation.js +1 -0
  41. package/dist/domain/input.js +15 -0
  42. package/dist/domain/model.js +1 -0
  43. package/dist/domain/paging.js +213 -0
  44. package/dist/domain/recipes.js +22 -0
  45. package/dist/domain/userReferences.js +4 -0
  46. package/dist/domain/wireScalars.js +41 -0
  47. package/dist/infrastructure/adminEntries.js +156 -0
  48. package/dist/infrastructure/adminPaging.js +70 -0
  49. package/dist/infrastructure/artifacts.js +67 -0
  50. package/dist/infrastructure/authSchema.js +74 -0
  51. package/dist/infrastructure/bundle.js +159 -0
  52. package/dist/infrastructure/cli.js +111 -0
  53. package/dist/infrastructure/generate.d.ts +12 -0
  54. package/dist/infrastructure/generate.js +175 -0
  55. package/dist/infrastructure/generateAuth.d.ts +8 -0
  56. package/dist/infrastructure/generateAuth.js +66 -0
  57. package/dist/infrastructure/help.js +55 -0
  58. package/dist/infrastructure/init.js +50 -0
  59. package/dist/infrastructure/inputs.js +32 -0
  60. package/dist/infrastructure/mounts.js +22 -0
  61. package/dist/infrastructure/wrangler.js +103 -0
  62. package/dist/kernel/authorization.d.ts +4 -0
  63. package/dist/kernel/authorization.js +15 -0
  64. package/dist/kernel/binds.d.ts +60 -0
  65. package/dist/kernel/binds.js +39 -0
  66. package/dist/kernel/caller-identity.d.ts +21 -0
  67. package/dist/kernel/caller-identity.js +7 -0
  68. package/dist/kernel/caller-mode.d.ts +4 -0
  69. package/dist/kernel/caller-mode.js +14 -0
  70. package/dist/kernel/contract-error.d.ts +12 -0
  71. package/dist/kernel/contract-error.js +14 -0
  72. package/dist/kernel/contracts.d.ts +135 -0
  73. package/dist/kernel/contracts.js +56 -0
  74. package/dist/{spec/domain/service/CloudflareCron.d.ts → kernel/cron.d.ts} +0 -1
  75. package/dist/{spec/domain/service/CloudflareCron.js → kernel/cron.js} +0 -9
  76. package/dist/kernel/dialect/common.d.ts +38 -0
  77. package/dist/kernel/dialect/common.js +3 -0
  78. package/dist/kernel/dialect/postgres.d.ts +16 -0
  79. package/dist/kernel/dialect/postgres.js +16 -0
  80. package/dist/kernel/dialect/sqlite.d.ts +20 -0
  81. package/dist/kernel/dialect/sqlite.js +29 -0
  82. package/dist/kernel/drain.d.ts +5 -0
  83. package/dist/kernel/drain.js +29 -0
  84. package/dist/kernel/driver/bun-sqlite.d.ts +19 -0
  85. package/dist/kernel/driver/bun-sqlite.js +73 -0
  86. package/dist/kernel/driver/d1.d.ts +24 -0
  87. package/dist/kernel/driver/d1.js +21 -0
  88. package/dist/kernel/driver/postgres.d.ts +25 -0
  89. package/dist/kernel/driver/postgres.js +84 -0
  90. package/dist/kernel/driver/transaction-context.d.ts +10 -0
  91. package/dist/kernel/driver/transaction-context.js +28 -0
  92. package/dist/kernel/email.d.ts +28 -0
  93. package/dist/{auth/emailTemplates.js → kernel/email.js} +9 -2
  94. package/dist/kernel/host-access.d.ts +10 -0
  95. package/dist/kernel/host-access.js +64 -0
  96. package/dist/kernel/host-caller.d.ts +39 -0
  97. package/dist/kernel/host-caller.js +53 -0
  98. package/dist/kernel/json-body.d.ts +4 -0
  99. package/dist/kernel/json-body.js +42 -0
  100. package/dist/kernel/mcp-apps.d.ts +69 -0
  101. package/dist/kernel/mcp-apps.js +35 -0
  102. package/dist/kernel/mcp-call.d.ts +5 -0
  103. package/dist/kernel/mcp-call.js +24 -0
  104. package/dist/kernel/mcp-handler.js +347 -0
  105. package/dist/kernel/mcp.d.ts +110 -0
  106. package/dist/kernel/mcp.js +45 -0
  107. package/dist/kernel/media.d.ts +27 -0
  108. package/dist/kernel/media.js +198 -0
  109. package/dist/kernel/paging.d.ts +55 -0
  110. package/dist/kernel/paging.js +87 -0
  111. package/dist/kernel/publishing.d.ts +4 -0
  112. package/dist/kernel/publishing.js +15 -0
  113. package/dist/{cloudflare/r2Media.d.ts → kernel/r2-media.d.ts} +4 -5
  114. package/dist/kernel/r2-media.js +71 -0
  115. package/dist/kernel/rest-dispatch.js +37 -0
  116. package/dist/kernel/rest-router.js +63 -0
  117. package/dist/kernel/rest.d.ts +58 -0
  118. package/dist/kernel/rest.js +38 -0
  119. package/dist/kernel/scalars.d.ts +6 -0
  120. package/dist/kernel/scalars.js +36 -0
  121. package/dist/kernel/search.js +4 -0
  122. package/dist/{core/site.d.ts → kernel/site-types.d.ts} +38 -9
  123. package/dist/kernel/site-types.js +1 -0
  124. package/dist/kernel/site.d.ts +39 -0
  125. package/dist/kernel/site.js +30 -0
  126. package/dist/kernel/store.d.ts +175 -0
  127. package/dist/kernel/store.js +244 -0
  128. package/dist/kernel/surface-failure.d.ts +10 -0
  129. package/dist/kernel/surface-failure.js +29 -0
  130. package/dist/kernel/surface.d.ts +10 -0
  131. package/dist/kernel/surface.js +16 -0
  132. package/dist/kernel/sweep.d.ts +17 -0
  133. package/dist/kernel/sweep.js +26 -0
  134. package/dist/kernel/translations.d.ts +1 -0
  135. package/dist/kernel/translations.js +12 -0
  136. package/dist/kernel/user-caller.d.ts +31 -0
  137. package/dist/kernel/user-caller.js +61 -0
  138. package/dist/kernel/user-field-name.js +3 -0
  139. package/dist/kernel/user-fields.d.ts +35 -0
  140. package/dist/kernel/user-fields.js +71 -0
  141. package/dist/kernel/validation.d.ts +15 -0
  142. package/dist/kernel/validation.js +46 -0
  143. package/dist/kernel/web-gateway.js +66 -0
  144. package/dist/kernel/web-head.js +14 -0
  145. package/dist/kernel/web-index.js +39 -0
  146. package/dist/kernel/web-response.js +7 -0
  147. package/dist/kernel/web-serve.js +97 -0
  148. package/dist/kernel/web.d.ts +77 -0
  149. package/dist/kernel/web.js +43 -0
  150. package/dist/kernel/where.js +21 -0
  151. package/dist/testing/index.d.ts +1 -37
  152. package/dist/testing/index.js +1 -43
  153. package/dist/usecase/adminBindings.js +150 -0
  154. package/dist/usecase/adminClient.js +66 -0
  155. package/dist/usecase/adminDescriptors.js +100 -0
  156. package/dist/usecase/generate.js +160 -0
  157. package/dist/usecase/handlers.js +18 -0
  158. package/dist/usecase/mcp-media.js +16 -0
  159. package/dist/usecase/mcp.js +96 -0
  160. package/dist/usecase/paging.js +69 -0
  161. package/dist/usecase/publishing.js +59 -0
  162. package/dist/usecase/refusals.js +27 -0
  163. package/dist/usecase/rest.js +53 -0
  164. package/dist/usecase/search.js +7 -0
  165. package/dist/usecase/site.js +38 -0
  166. package/dist/usecase/stores.js +52 -0
  167. package/dist/usecase/tool-version.js +6 -0
  168. package/dist/usecase/translations.js +76 -0
  169. package/dist/usecase/ttl.js +20 -0
  170. package/dist/usecase/validation.js +221 -0
  171. package/dist/usecase/web.js +23 -0
  172. package/docs/examples/README.md +39 -16
  173. package/docs/examples/app-shell/README.md +121 -0
  174. package/docs/examples/app-shell/accept.mjs +91 -0
  175. package/docs/examples/app-shell/gitignore +7 -0
  176. package/docs/examples/app-shell/package.json +43 -0
  177. package/docs/examples/app-shell/pnpm-workspace.yaml +8 -0
  178. package/docs/examples/app-shell/smoke-kit.mjs +168 -0
  179. package/docs/examples/app-shell/src/auth.ts +58 -0
  180. package/docs/examples/app-shell/src/handlers.ts +5 -0
  181. package/docs/examples/app-shell/src/index.ts +4 -0
  182. package/docs/examples/app-shell/src/routes.ts +16 -0
  183. package/docs/examples/app-shell/src/schedule.ts +8 -0
  184. package/docs/examples/app-shell/src/service.ts +71 -0
  185. package/docs/examples/app-shell/src/sign-in.ts +41 -0
  186. package/docs/examples/app-shell/src/signup.ts +8 -0
  187. package/docs/examples/{reference-service → app-shell}/tsconfig.json +6 -2
  188. package/docs/examples/app-shell/worker-configuration.d.ts +22 -0
  189. package/docs/examples/app-shell/wrangler.jsonc +62 -0
  190. package/docs/examples/club-events/README.md +65 -0
  191. package/docs/examples/club-events/manifests/club-events.yaml +247 -0
  192. package/docs/examples/club-events/smoke.mjs +127 -0
  193. package/docs/examples/club-events/src/handlers.ts +25 -0
  194. package/docs/examples/club-events/src/signup.ts +9 -0
  195. package/docs/examples/generated-web/README.md +78 -0
  196. package/docs/examples/generated-web/posts.yaml +38 -0
  197. package/docs/examples/generated-web/seed.sql +6 -0
  198. package/docs/examples/generated-web/src/worker.ts +43 -0
  199. package/docs/examples/generated-web/tsconfig.json +8 -0
  200. package/docs/examples/generated-web/wrangler.jsonc +8 -0
  201. package/docs/examples/purchasing/.dev.vars.example +6 -0
  202. package/docs/examples/purchasing/README.md +99 -0
  203. package/docs/examples/purchasing/manifests/purchasing.yaml +374 -0
  204. package/docs/examples/purchasing/seed.sql +4 -0
  205. package/docs/examples/purchasing/smoke.mjs +191 -0
  206. package/docs/examples/purchasing/src/admin.tsx +13 -0
  207. package/docs/examples/purchasing/src/handlers.ts +33 -0
  208. package/docs/examples/purchasing/src/notify.ts +29 -0
  209. package/docs/examples/purchasing/src/requests-page.ts +57 -0
  210. package/docs/examples/purchasing/src/routes.ts +53 -0
  211. package/docs/examples/purchasing/src/schedule.ts +31 -0
  212. package/docs/examples/purchasing/src/signup.ts +5 -0
  213. package/docs/examples/purchasing/src/supplier.ts +32 -0
  214. package/docs/examples/purchasing/wrangler.jsonc +69 -0
  215. package/docs/examples/recipes/README.md +60 -0
  216. package/docs/examples/recipes/manifests/recipes.yaml +75 -0
  217. package/docs/examples/recipes/smoke.mjs +102 -0
  218. package/docs/examples/recipes/src/media.ts +13 -0
  219. package/docs/examples/recipes/src/pages.ts +99 -0
  220. package/docs/examples/recipes/src/routes.ts +71 -0
  221. package/docs/examples/recipes/src/site-config.ts +12 -0
  222. package/docs/examples/recipes/wrangler.jsonc +74 -0
  223. package/docs/handbook/cloudflare/authentication.md +186 -108
  224. package/docs/handbook/cloudflare/chatgpt-sites.md +5 -112
  225. package/docs/handbook/cloudflare/deploy-and-operate.md +59 -87
  226. package/docs/handbook/cloudflare/media-r2.md +61 -82
  227. package/docs/handbook/cloudflare/service-entry.md +223 -119
  228. package/docs/handbook/concepts/authorization.md +10 -117
  229. package/docs/handbook/concepts/four-atoms.md +9 -92
  230. package/docs/handbook/concepts/lifecycle-and-locales.md +9 -80
  231. package/docs/handbook/concepts/mcp-and-agents.md +24 -116
  232. package/docs/handbook/concepts/procedures-and-triggers.md +5 -162
  233. package/docs/handbook/concepts/runtime-and-adapters.md +15 -183
  234. package/docs/handbook/concepts/views.md +10 -109
  235. package/docs/handbook/examples/hub.md +2 -18
  236. package/docs/handbook/guides/adapter-guide.md +11 -0
  237. package/docs/handbook/guides/admin-ui.md +113 -136
  238. package/docs/handbook/guides/agent-setup.md +32 -27
  239. package/docs/handbook/guides/agent-workflow-acceptance.md +232 -0
  240. package/docs/handbook/guides/email.md +86 -0
  241. package/docs/handbook/guides/local-testing.md +40 -0
  242. package/docs/handbook/guides/mcp-apps.md +560 -0
  243. package/docs/handbook/guides/native-admin.md +566 -0
  244. package/docs/handbook/guides/native-execution.md +133 -0
  245. package/docs/handbook/guides/oauth.md +219 -0
  246. package/docs/handbook/guides/postgres-adapters.md +56 -0
  247. package/docs/handbook/guides/public-pages.md +93 -0
  248. package/docs/handbook/guides/size-and-startup.md +9 -0
  249. package/docs/handbook/guides/sql-patterns.md +266 -0
  250. package/docs/handbook/guides/typed-queries.md +210 -100
  251. package/docs/handbook/navigation.json +176 -30
  252. package/docs/handbook/reference/admin-descriptors.md +56 -0
  253. package/docs/handbook/reference/authorization.md +44 -52
  254. package/docs/handbook/reference/describe.md +56 -0
  255. package/docs/handbook/reference/diagnostics.md +19 -77
  256. package/docs/handbook/reference/features.md +45 -53
  257. package/docs/handbook/reference/manifest.md +6 -69
  258. package/docs/handbook/reference/procedure.md +11 -115
  259. package/docs/handbook/reference/schema.md +81 -172
  260. package/docs/handbook/reference/site-config.md +5 -65
  261. package/docs/handbook/reference/sql.md +64 -0
  262. package/docs/handbook/reference/surface.md +396 -93
  263. package/docs/handbook/reference/trigger.md +62 -89
  264. package/docs/handbook/reference/view.md +40 -158
  265. package/docs/handbook/releases/index.md +198 -12
  266. package/docs/handbook/start/agents.md +45 -0
  267. package/docs/handbook/start/overview.md +9 -56
  268. package/docs/handbook/start/project-and-cli.md +51 -131
  269. package/docs/handbook/start/quickstart-worker.md +38 -115
  270. package/docs/skills/develop/SKILL.md +77 -121
  271. package/docs/skills/integrate/SKILL.md +37 -84
  272. package/docs/skills/media-gc/SKILL.md +21 -8
  273. package/docs/skills/provision/SKILL.md +31 -87
  274. package/docs/skills/update/SKILL.md +20 -34
  275. package/docs/source/scripts/postgres-adapter.ts +101 -0
  276. package/docs/upgrade-0.1-to-0.2.md +26 -10
  277. package/package.json +120 -112
  278. package/skills/README.md +67 -0
  279. package/skills/mantle/SKILL.md +76 -0
  280. package/dist/admin/consent.d.ts +0 -17
  281. package/dist/admin/consent.d.ts.map +0 -1
  282. package/dist/admin/consent.js +0 -17
  283. package/dist/admin/consent.js.map +0 -1
  284. package/dist/admin/createAdminSurface.d.ts +0 -22
  285. package/dist/admin/createAdminSurface.d.ts.map +0 -1
  286. package/dist/admin/createAdminSurface.js +0 -589
  287. package/dist/admin/createAdminSurface.js.map +0 -1
  288. package/dist/admin/developerConsole.d.ts +0 -264
  289. package/dist/admin/developerConsole.d.ts.map +0 -1
  290. package/dist/admin/developerConsole.js +0 -136
  291. package/dist/admin/developerConsole.js.map +0 -1
  292. package/dist/admin/identity.d.ts +0 -62
  293. package/dist/admin/identity.d.ts.map +0 -1
  294. package/dist/admin/identity.js +0 -7
  295. package/dist/admin/identity.js.map +0 -1
  296. package/dist/admin/index.d.ts +0 -4
  297. package/dist/admin/index.d.ts.map +0 -1
  298. package/dist/admin/index.js +0 -4
  299. package/dist/admin/index.js.map +0 -1
  300. package/dist/admin/procedureFlow.d.ts +0 -25
  301. package/dist/admin/procedureFlow.d.ts.map +0 -1
  302. package/dist/admin/procedureFlow.js +0 -154
  303. package/dist/admin/procedureFlow.js.map +0 -1
  304. package/dist/auth/ConsoleEmailSender.d.ts +0 -15
  305. package/dist/auth/ConsoleEmailSender.d.ts.map +0 -1
  306. package/dist/auth/ConsoleEmailSender.js +0 -19
  307. package/dist/auth/ConsoleEmailSender.js.map +0 -1
  308. package/dist/auth/appleClientSecret.d.ts +0 -75
  309. package/dist/auth/appleClientSecret.d.ts.map +0 -1
  310. package/dist/auth/appleClientSecret.js +0 -116
  311. package/dist/auth/appleClientSecret.js.map +0 -1
  312. package/dist/auth/buildAuth.d.ts +0 -4565
  313. package/dist/auth/buildAuth.d.ts.map +0 -1
  314. package/dist/auth/buildAuth.js +0 -307
  315. package/dist/auth/buildAuth.js.map +0 -1
  316. package/dist/auth/callerResolver.d.ts +0 -48
  317. package/dist/auth/callerResolver.d.ts.map +0 -1
  318. package/dist/auth/callerResolver.js +0 -49
  319. package/dist/auth/callerResolver.js.map +0 -1
  320. package/dist/auth/createAuthRoutes.d.ts +0 -22
  321. package/dist/auth/createAuthRoutes.d.ts.map +0 -1
  322. package/dist/auth/createAuthRoutes.js.map +0 -1
  323. package/dist/auth/createMantleAuth.d.ts +0 -3
  324. package/dist/auth/createMantleAuth.d.ts.map +0 -1
  325. package/dist/auth/createMantleAuth.js +0 -483
  326. package/dist/auth/createMantleAuth.js.map +0 -1
  327. package/dist/auth/db.d.ts +0 -17
  328. package/dist/auth/db.d.ts.map +0 -1
  329. package/dist/auth/db.js +0 -24
  330. package/dist/auth/db.js.map +0 -1
  331. package/dist/auth/emailTemplates.d.ts +0 -7
  332. package/dist/auth/emailTemplates.d.ts.map +0 -1
  333. package/dist/auth/emailTemplates.js.map +0 -1
  334. package/dist/auth/index.d.ts +0 -9
  335. package/dist/auth/index.d.ts.map +0 -1
  336. package/dist/auth/index.js +0 -7
  337. package/dist/auth/index.js.map +0 -1
  338. package/dist/auth/methods.d.ts +0 -717
  339. package/dist/auth/methods.d.ts.map +0 -1
  340. package/dist/auth/methods.js +0 -321
  341. package/dist/auth/methods.js.map +0 -1
  342. package/dist/auth/oauthTokens.d.ts +0 -24
  343. package/dist/auth/oauthTokens.d.ts.map +0 -1
  344. package/dist/auth/oauthTokens.js +0 -146
  345. package/dist/auth/oauthTokens.js.map +0 -1
  346. package/dist/auth/setupIncomplete.d.ts +0 -16
  347. package/dist/auth/setupIncomplete.d.ts.map +0 -1
  348. package/dist/auth/setupIncomplete.js +0 -50
  349. package/dist/auth/setupIncomplete.js.map +0 -1
  350. package/dist/auth/types.d.ts +0 -440
  351. package/dist/auth/types.d.ts.map +0 -1
  352. package/dist/auth/types.js +0 -10
  353. package/dist/auth/types.js.map +0 -1
  354. package/dist/bun/index.d.ts +0 -65
  355. package/dist/bun/index.d.ts.map +0 -1
  356. package/dist/bun/index.js +0 -130
  357. package/dist/bun/index.js.map +0 -1
  358. package/dist/cli/emitModule.d.ts +0 -7
  359. package/dist/cli/emitModule.d.ts.map +0 -1
  360. package/dist/cli/emitModule.js +0 -127
  361. package/dist/cli/emitModule.js.map +0 -1
  362. package/dist/cli/generate.d.ts +0 -8
  363. package/dist/cli/generate.d.ts.map +0 -1
  364. package/dist/cli/generate.js +0 -355
  365. package/dist/cli/generate.js.map +0 -1
  366. package/dist/cli/main.d.ts +0 -3
  367. package/dist/cli/main.d.ts.map +0 -1
  368. package/dist/cli/main.js +0 -21
  369. package/dist/cli/main.js.map +0 -1
  370. package/dist/cli/preset.d.ts +0 -18
  371. package/dist/cli/preset.d.ts.map +0 -1
  372. package/dist/cli/preset.js +0 -352
  373. package/dist/cli/preset.js.map +0 -1
  374. package/dist/cloudflare/index.d.ts +0 -21
  375. package/dist/cloudflare/index.d.ts.map +0 -1
  376. package/dist/cloudflare/index.js +0 -14
  377. package/dist/cloudflare/index.js.map +0 -1
  378. package/dist/cloudflare/r2Media.d.ts.map +0 -1
  379. package/dist/cloudflare/r2Media.js +0 -69
  380. package/dist/cloudflare/r2Media.js.map +0 -1
  381. package/dist/core/caller.d.ts +0 -35
  382. package/dist/core/caller.d.ts.map +0 -1
  383. package/dist/core/caller.js +0 -3
  384. package/dist/core/caller.js.map +0 -1
  385. package/dist/core/createMantle.d.ts +0 -22
  386. package/dist/core/createMantle.d.ts.map +0 -1
  387. package/dist/core/createMantle.js +0 -117
  388. package/dist/core/createMantle.js.map +0 -1
  389. package/dist/core/dialect.d.ts +0 -41
  390. package/dist/core/dialect.d.ts.map +0 -1
  391. package/dist/core/dialect.js +0 -7
  392. package/dist/core/dialect.js.map +0 -1
  393. package/dist/core/driver.d.ts +0 -17
  394. package/dist/core/driver.d.ts.map +0 -1
  395. package/dist/core/driver.js +0 -2
  396. package/dist/core/driver.js.map +0 -1
  397. package/dist/core/email.d.ts +0 -17
  398. package/dist/core/email.d.ts.map +0 -1
  399. package/dist/core/email.js +0 -2
  400. package/dist/core/email.js.map +0 -1
  401. package/dist/core/index.d.ts +0 -16
  402. package/dist/core/index.d.ts.map +0 -1
  403. package/dist/core/index.js +0 -16
  404. package/dist/core/index.js.map +0 -1
  405. package/dist/core/invocation.d.ts +0 -66
  406. package/dist/core/invocation.d.ts.map +0 -1
  407. package/dist/core/invocation.js +0 -3
  408. package/dist/core/invocation.js.map +0 -1
  409. package/dist/core/runtime/auth.d.ts +0 -9
  410. package/dist/core/runtime/auth.d.ts.map +0 -1
  411. package/dist/core/runtime/auth.js +0 -39
  412. package/dist/core/runtime/auth.js.map +0 -1
  413. package/dist/core/runtime/createRuntime.d.ts +0 -23
  414. package/dist/core/runtime/createRuntime.d.ts.map +0 -1
  415. package/dist/core/runtime/createRuntime.js +0 -214
  416. package/dist/core/runtime/createRuntime.js.map +0 -1
  417. package/dist/core/runtime/verifyPlan.d.ts +0 -34
  418. package/dist/core/runtime/verifyPlan.d.ts.map +0 -1
  419. package/dist/core/runtime/verifyPlan.js +0 -301
  420. package/dist/core/runtime/verifyPlan.js.map +0 -1
  421. package/dist/core/service.d.ts +0 -45
  422. package/dist/core/service.d.ts.map +0 -1
  423. package/dist/core/service.js +0 -2
  424. package/dist/core/service.js.map +0 -1
  425. package/dist/core/site.d.ts.map +0 -1
  426. package/dist/core/site.js +0 -2
  427. package/dist/core/site.js.map +0 -1
  428. package/dist/core/siteConfig.d.ts +0 -5
  429. package/dist/core/siteConfig.d.ts.map +0 -1
  430. package/dist/core/siteConfig.js +0 -24
  431. package/dist/core/siteConfig.js.map +0 -1
  432. package/dist/core/sql/allowlist.d.ts +0 -65
  433. package/dist/core/sql/allowlist.d.ts.map +0 -1
  434. package/dist/core/sql/allowlist.js +0 -705
  435. package/dist/core/sql/allowlist.js.map +0 -1
  436. package/dist/core/sql/ast.d.ts +0 -24
  437. package/dist/core/sql/ast.d.ts.map +0 -1
  438. package/dist/core/sql/ast.js +0 -32
  439. package/dist/core/sql/ast.js.map +0 -1
  440. package/dist/core/sql/compile.d.ts +0 -50
  441. package/dist/core/sql/compile.d.ts.map +0 -1
  442. package/dist/core/sql/compile.js +0 -48
  443. package/dist/core/sql/compile.js.map +0 -1
  444. package/dist/core/sql/policy.d.ts +0 -121
  445. package/dist/core/sql/policy.d.ts.map +0 -1
  446. package/dist/core/sql/policy.js +0 -379
  447. package/dist/core/sql/policy.js.map +0 -1
  448. package/dist/core/sql/positions.d.ts +0 -30
  449. package/dist/core/sql/positions.d.ts.map +0 -1
  450. package/dist/core/sql/positions.js +0 -22
  451. package/dist/core/sql/positions.js.map +0 -1
  452. package/dist/core/sql/run.d.ts +0 -76
  453. package/dist/core/sql/run.d.ts.map +0 -1
  454. package/dist/core/sql/run.js +0 -267
  455. package/dist/core/sql/run.js.map +0 -1
  456. package/dist/core/store/createStore.d.ts +0 -49
  457. package/dist/core/store/createStore.d.ts.map +0 -1
  458. package/dist/core/store/createStore.js +0 -227
  459. package/dist/core/store/createStore.js.map +0 -1
  460. package/dist/core/store/cursor.d.ts +0 -4
  461. package/dist/core/store/cursor.d.ts.map +0 -1
  462. package/dist/core/store/cursor.js +0 -22
  463. package/dist/core/store/cursor.js.map +0 -1
  464. package/dist/core/store/json.d.ts +0 -80
  465. package/dist/core/store/json.d.ts.map +0 -1
  466. package/dist/core/store/json.js +0 -342
  467. package/dist/core/store/json.js.map +0 -1
  468. package/dist/core/store.d.ts +0 -160
  469. package/dist/core/store.d.ts.map +0 -1
  470. package/dist/core/store.js +0 -2
  471. package/dist/core/store.js.map +0 -1
  472. package/dist/core/wire.d.ts +0 -20
  473. package/dist/core/wire.d.ts.map +0 -1
  474. package/dist/core/wire.js +0 -84
  475. package/dist/core/wire.js.map +0 -1
  476. package/dist/core/withCaller.d.ts +0 -16
  477. package/dist/core/withCaller.d.ts.map +0 -1
  478. package/dist/core/withCaller.js +0 -29
  479. package/dist/core/withCaller.js.map +0 -1
  480. package/dist/d1/adapter.d.ts +0 -12
  481. package/dist/d1/adapter.d.ts.map +0 -1
  482. package/dist/d1/adapter.js +0 -23
  483. package/dist/d1/adapter.js.map +0 -1
  484. package/dist/d1/codec.d.ts +0 -14
  485. package/dist/d1/codec.d.ts.map +0 -1
  486. package/dist/d1/codec.js +0 -136
  487. package/dist/d1/codec.js.map +0 -1
  488. package/dist/d1/compile/index.d.ts +0 -9
  489. package/dist/d1/compile/index.d.ts.map +0 -1
  490. package/dist/d1/compile/index.js +0 -9
  491. package/dist/d1/compile/index.js.map +0 -1
  492. package/dist/d1/dialect.d.ts +0 -4
  493. package/dist/d1/dialect.d.ts.map +0 -1
  494. package/dist/d1/dialect.js +0 -13
  495. package/dist/d1/dialect.js.map +0 -1
  496. package/dist/d1/executor.d.ts +0 -13
  497. package/dist/d1/executor.d.ts.map +0 -1
  498. package/dist/d1/executor.js +0 -91
  499. package/dist/d1/executor.js.map +0 -1
  500. package/dist/d1/index.d.ts +0 -6
  501. package/dist/d1/index.d.ts.map +0 -1
  502. package/dist/d1/index.js +0 -6
  503. package/dist/d1/index.js.map +0 -1
  504. package/dist/d1/lower.d.ts +0 -8
  505. package/dist/d1/lower.d.ts.map +0 -1
  506. package/dist/d1/lower.js +0 -167
  507. package/dist/d1/lower.js.map +0 -1
  508. package/dist/d1/media.d.ts +0 -5
  509. package/dist/d1/media.d.ts.map +0 -1
  510. package/dist/d1/media.js +0 -157
  511. package/dist/d1/media.js.map +0 -1
  512. package/dist/d1/migrations.d.ts +0 -12
  513. package/dist/d1/migrations.d.ts.map +0 -1
  514. package/dist/d1/migrations.js +0 -111
  515. package/dist/d1/migrations.js.map +0 -1
  516. package/dist/d1/print.d.ts +0 -28
  517. package/dist/d1/print.d.ts.map +0 -1
  518. package/dist/d1/print.js +0 -54
  519. package/dist/d1/print.js.map +0 -1
  520. package/dist/d1/site.d.ts +0 -17
  521. package/dist/d1/site.d.ts.map +0 -1
  522. package/dist/d1/site.js +0 -63
  523. package/dist/d1/site.js.map +0 -1
  524. package/dist/d1/storage.d.ts +0 -34
  525. package/dist/d1/storage.d.ts.map +0 -1
  526. package/dist/d1/storage.js +0 -288
  527. package/dist/d1/storage.js.map +0 -1
  528. package/dist/d1/tz.d.ts +0 -21
  529. package/dist/d1/tz.d.ts.map +0 -1
  530. package/dist/d1/tz.js +0 -54
  531. package/dist/d1/tz.js.map +0 -1
  532. package/dist/d1/validator.d.ts +0 -10
  533. package/dist/d1/validator.d.ts.map +0 -1
  534. package/dist/d1/validator.js +0 -33
  535. package/dist/d1/validator.js.map +0 -1
  536. package/dist/mcp/apps.d.ts +0 -43
  537. package/dist/mcp/apps.d.ts.map +0 -1
  538. package/dist/mcp/apps.js +0 -57
  539. package/dist/mcp/apps.js.map +0 -1
  540. package/dist/mcp/catalog.d.ts +0 -55
  541. package/dist/mcp/catalog.d.ts.map +0 -1
  542. package/dist/mcp/catalog.js +0 -81
  543. package/dist/mcp/catalog.js.map +0 -1
  544. package/dist/mcp/createMcpSurface.d.ts +0 -34
  545. package/dist/mcp/createMcpSurface.d.ts.map +0 -1
  546. package/dist/mcp/createMcpSurface.js +0 -150
  547. package/dist/mcp/createMcpSurface.js.map +0 -1
  548. package/dist/mcp/index.d.ts +0 -4
  549. package/dist/mcp/index.d.ts.map +0 -1
  550. package/dist/mcp/index.js +0 -4
  551. package/dist/mcp/index.js.map +0 -1
  552. package/dist/postgres/adapter.d.ts +0 -20
  553. package/dist/postgres/adapter.d.ts.map +0 -1
  554. package/dist/postgres/adapter.js +0 -44
  555. package/dist/postgres/adapter.js.map +0 -1
  556. package/dist/postgres/codec.d.ts +0 -13
  557. package/dist/postgres/codec.d.ts.map +0 -1
  558. package/dist/postgres/codec.js +0 -110
  559. package/dist/postgres/codec.js.map +0 -1
  560. package/dist/postgres/compile/index.d.ts +0 -9
  561. package/dist/postgres/compile/index.d.ts.map +0 -1
  562. package/dist/postgres/compile/index.js +0 -9
  563. package/dist/postgres/compile/index.js.map +0 -1
  564. package/dist/postgres/driver.d.ts +0 -92
  565. package/dist/postgres/driver.d.ts.map +0 -1
  566. package/dist/postgres/driver.js +0 -110
  567. package/dist/postgres/driver.js.map +0 -1
  568. package/dist/postgres/executor.d.ts +0 -20
  569. package/dist/postgres/executor.d.ts.map +0 -1
  570. package/dist/postgres/executor.js +0 -69
  571. package/dist/postgres/executor.js.map +0 -1
  572. package/dist/postgres/index.d.ts +0 -7
  573. package/dist/postgres/index.d.ts.map +0 -1
  574. package/dist/postgres/index.js +0 -7
  575. package/dist/postgres/index.js.map +0 -1
  576. package/dist/postgres/lower.d.ts +0 -6
  577. package/dist/postgres/lower.d.ts.map +0 -1
  578. package/dist/postgres/lower.js +0 -157
  579. package/dist/postgres/lower.js.map +0 -1
  580. package/dist/postgres/print.d.ts +0 -11
  581. package/dist/postgres/print.d.ts.map +0 -1
  582. package/dist/postgres/print.js +0 -121
  583. package/dist/postgres/print.js.map +0 -1
  584. package/dist/postgres/storage.d.ts +0 -19
  585. package/dist/postgres/storage.d.ts.map +0 -1
  586. package/dist/postgres/storage.js +0 -201
  587. package/dist/postgres/storage.js.map +0 -1
  588. package/dist/postgres/textRows.d.ts +0 -10
  589. package/dist/postgres/textRows.d.ts.map +0 -1
  590. package/dist/postgres/textRows.js +0 -44
  591. package/dist/postgres/textRows.js.map +0 -1
  592. package/dist/postgres/validator.d.ts +0 -12
  593. package/dist/postgres/validator.d.ts.map +0 -1
  594. package/dist/postgres/validator.js +0 -46
  595. package/dist/postgres/validator.js.map +0 -1
  596. package/dist/spec/domain/index.d.ts +0 -3
  597. package/dist/spec/domain/index.d.ts.map +0 -1
  598. package/dist/spec/domain/index.js +0 -3
  599. package/dist/spec/domain/index.js.map +0 -1
  600. package/dist/spec/domain/model/ContentState.d.ts +0 -8
  601. package/dist/spec/domain/model/ContentState.d.ts.map +0 -1
  602. package/dist/spec/domain/model/ContentState.js +0 -7
  603. package/dist/spec/domain/model/ContentState.js.map +0 -1
  604. package/dist/spec/domain/model/Entry.d.ts +0 -29
  605. package/dist/spec/domain/model/Entry.d.ts.map +0 -1
  606. package/dist/spec/domain/model/Entry.js +0 -16
  607. package/dist/spec/domain/model/Entry.js.map +0 -1
  608. package/dist/spec/domain/model/Locale.d.ts +0 -30
  609. package/dist/spec/domain/model/Locale.d.ts.map +0 -1
  610. package/dist/spec/domain/model/Locale.js +0 -33
  611. package/dist/spec/domain/model/Locale.js.map +0 -1
  612. package/dist/spec/domain/model/ManifestGrammar.d.ts.map +0 -1
  613. package/dist/spec/domain/model/ManifestGrammar.js +0 -149
  614. package/dist/spec/domain/model/ManifestGrammar.js.map +0 -1
  615. package/dist/spec/domain/model/MediaMimeAccept.d.ts +0 -55
  616. package/dist/spec/domain/model/MediaMimeAccept.d.ts.map +0 -1
  617. package/dist/spec/domain/model/MediaMimeAccept.js +0 -90
  618. package/dist/spec/domain/model/MediaMimeAccept.js.map +0 -1
  619. package/dist/spec/domain/model/RuntimePlan.d.ts.map +0 -1
  620. package/dist/spec/domain/model/RuntimePlan.js +0 -4
  621. package/dist/spec/domain/model/RuntimePlan.js.map +0 -1
  622. package/dist/spec/domain/model/SiteConfig.d.ts +0 -173
  623. package/dist/spec/domain/model/SiteConfig.d.ts.map +0 -1
  624. package/dist/spec/domain/model/SiteConfig.js +0 -13
  625. package/dist/spec/domain/model/SiteConfig.js.map +0 -1
  626. package/dist/spec/domain/model/SqlIr.d.ts.map +0 -1
  627. package/dist/spec/domain/model/SqlIr.js +0 -95
  628. package/dist/spec/domain/model/SqlIr.js.map +0 -1
  629. package/dist/spec/domain/model/index.d.ts +0 -14
  630. package/dist/spec/domain/model/index.d.ts.map +0 -1
  631. package/dist/spec/domain/model/index.js +0 -14
  632. package/dist/spec/domain/model/index.js.map +0 -1
  633. package/dist/spec/domain/service/CloudflareCron.d.ts.map +0 -1
  634. package/dist/spec/domain/service/CloudflareCron.js.map +0 -1
  635. package/dist/spec/domain/service/CrossSchemaChecker.d.ts +0 -34
  636. package/dist/spec/domain/service/CrossSchemaChecker.d.ts.map +0 -1
  637. package/dist/spec/domain/service/CrossSchemaChecker.js +0 -114
  638. package/dist/spec/domain/service/CrossSchemaChecker.js.map +0 -1
  639. package/dist/spec/domain/service/EntryDataValidator.d.ts +0 -56
  640. package/dist/spec/domain/service/EntryDataValidator.d.ts.map +0 -1
  641. package/dist/spec/domain/service/EntryDataValidator.js +0 -88
  642. package/dist/spec/domain/service/EntryDataValidator.js.map +0 -1
  643. package/dist/spec/domain/service/JsonSchemaToZod.d.ts +0 -29
  644. package/dist/spec/domain/service/JsonSchemaToZod.d.ts.map +0 -1
  645. package/dist/spec/domain/service/JsonSchemaToZod.js +0 -156
  646. package/dist/spec/domain/service/JsonSchemaToZod.js.map +0 -1
  647. package/dist/spec/domain/service/LifecycleStateMachine.d.ts +0 -75
  648. package/dist/spec/domain/service/LifecycleStateMachine.d.ts.map +0 -1
  649. package/dist/spec/domain/service/LifecycleStateMachine.js +0 -76
  650. package/dist/spec/domain/service/LifecycleStateMachine.js.map +0 -1
  651. package/dist/spec/domain/service/LocaleCanonicalizer.d.ts +0 -29
  652. package/dist/spec/domain/service/LocaleCanonicalizer.d.ts.map +0 -1
  653. package/dist/spec/domain/service/LocaleCanonicalizer.js +0 -96
  654. package/dist/spec/domain/service/LocaleCanonicalizer.js.map +0 -1
  655. package/dist/spec/domain/service/ManifestFieldChecks.d.ts +0 -60
  656. package/dist/spec/domain/service/ManifestFieldChecks.d.ts.map +0 -1
  657. package/dist/spec/domain/service/ManifestFieldChecks.js +0 -116
  658. package/dist/spec/domain/service/ManifestFieldChecks.js.map +0 -1
  659. package/dist/spec/domain/service/ManifestGraphValidator.d.ts +0 -15
  660. package/dist/spec/domain/service/ManifestGraphValidator.d.ts.map +0 -1
  661. package/dist/spec/domain/service/ManifestGraphValidator.js +0 -225
  662. package/dist/spec/domain/service/ManifestGraphValidator.js.map +0 -1
  663. package/dist/spec/domain/service/ManifestLinker.d.ts +0 -45
  664. package/dist/spec/domain/service/ManifestLinker.d.ts.map +0 -1
  665. package/dist/spec/domain/service/ManifestLinker.js +0 -92
  666. package/dist/spec/domain/service/ManifestLinker.js.map +0 -1
  667. package/dist/spec/domain/service/ManifestLocaleTrimmer.d.ts +0 -16
  668. package/dist/spec/domain/service/ManifestLocaleTrimmer.d.ts.map +0 -1
  669. package/dist/spec/domain/service/ManifestLocaleTrimmer.js +0 -76
  670. package/dist/spec/domain/service/ManifestLocaleTrimmer.js.map +0 -1
  671. package/dist/spec/domain/service/ManifestParser.d.ts +0 -49
  672. package/dist/spec/domain/service/ManifestParser.d.ts.map +0 -1
  673. package/dist/spec/domain/service/ManifestParser.js +0 -203
  674. package/dist/spec/domain/service/ManifestParser.js.map +0 -1
  675. package/dist/spec/domain/service/ManifestPartition.d.ts +0 -9
  676. package/dist/spec/domain/service/ManifestPartition.d.ts.map +0 -1
  677. package/dist/spec/domain/service/ManifestPartition.js +0 -19
  678. package/dist/spec/domain/service/ManifestPartition.js.map +0 -1
  679. package/dist/spec/domain/service/ManifestPathDiagnoser.d.ts +0 -33
  680. package/dist/spec/domain/service/ManifestPathDiagnoser.d.ts.map +0 -1
  681. package/dist/spec/domain/service/ManifestPathDiagnoser.js +0 -43
  682. package/dist/spec/domain/service/ManifestPathDiagnoser.js.map +0 -1
  683. package/dist/spec/domain/service/ManifestSourceSpans.d.ts +0 -10
  684. package/dist/spec/domain/service/ManifestSourceSpans.d.ts.map +0 -1
  685. package/dist/spec/domain/service/ManifestSourceSpans.js +0 -76
  686. package/dist/spec/domain/service/ManifestSourceSpans.js.map +0 -1
  687. package/dist/spec/domain/service/McpToolNaming.d.ts +0 -25
  688. package/dist/spec/domain/service/McpToolNaming.d.ts.map +0 -1
  689. package/dist/spec/domain/service/McpToolNaming.js +0 -50
  690. package/dist/spec/domain/service/McpToolNaming.js.map +0 -1
  691. package/dist/spec/domain/service/PlanFingerprint.d.ts.map +0 -1
  692. package/dist/spec/domain/service/PlanFingerprint.js +0 -14
  693. package/dist/spec/domain/service/PlanFingerprint.js.map +0 -1
  694. package/dist/spec/domain/service/ProcedureViewSpecChecks.d.ts +0 -4
  695. package/dist/spec/domain/service/ProcedureViewSpecChecks.d.ts.map +0 -1
  696. package/dist/spec/domain/service/ProcedureViewSpecChecks.js +0 -211
  697. package/dist/spec/domain/service/ProcedureViewSpecChecks.js.map +0 -1
  698. package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts +0 -42
  699. package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts.map +0 -1
  700. package/dist/spec/domain/service/SchemaAdminUiChecker.js +0 -289
  701. package/dist/spec/domain/service/SchemaAdminUiChecker.js.map +0 -1
  702. package/dist/spec/domain/service/SchemaIndexChecker.d.ts +0 -33
  703. package/dist/spec/domain/service/SchemaIndexChecker.d.ts.map +0 -1
  704. package/dist/spec/domain/service/SchemaIndexChecker.js +0 -256
  705. package/dist/spec/domain/service/SchemaIndexChecker.js.map +0 -1
  706. package/dist/spec/domain/service/SchemaSearchChecker.d.ts +0 -11
  707. package/dist/spec/domain/service/SchemaSearchChecker.d.ts.map +0 -1
  708. package/dist/spec/domain/service/SchemaSearchChecker.js +0 -78
  709. package/dist/spec/domain/service/SchemaSearchChecker.js.map +0 -1
  710. package/dist/spec/domain/service/SchemaSpecChecks.d.ts +0 -31
  711. package/dist/spec/domain/service/SchemaSpecChecks.d.ts.map +0 -1
  712. package/dist/spec/domain/service/SchemaSpecChecks.js +0 -445
  713. package/dist/spec/domain/service/SchemaSpecChecks.js.map +0 -1
  714. package/dist/spec/domain/service/SiteDefaultsValidator.d.ts +0 -39
  715. package/dist/spec/domain/service/SiteDefaultsValidator.d.ts.map +0 -1
  716. package/dist/spec/domain/service/SiteDefaultsValidator.js +0 -194
  717. package/dist/spec/domain/service/SiteDefaultsValidator.js.map +0 -1
  718. package/dist/spec/domain/service/SqlClassify.d.ts +0 -19
  719. package/dist/spec/domain/service/SqlClassify.d.ts.map +0 -1
  720. package/dist/spec/domain/service/SqlClassify.js +0 -42
  721. package/dist/spec/domain/service/SqlClassify.js.map +0 -1
  722. package/dist/spec/domain/service/SqlRefusal.d.ts +0 -16
  723. package/dist/spec/domain/service/SqlRefusal.d.ts.map +0 -1
  724. package/dist/spec/domain/service/SqlRefusal.js +0 -20
  725. package/dist/spec/domain/service/SqlRefusal.js.map +0 -1
  726. package/dist/spec/domain/service/SqlTypes.d.ts +0 -40
  727. package/dist/spec/domain/service/SqlTypes.d.ts.map +0 -1
  728. package/dist/spec/domain/service/SqlTypes.js +0 -110
  729. package/dist/spec/domain/service/SqlTypes.js.map +0 -1
  730. package/dist/spec/domain/service/StaffRoleHierarchy.d.ts +0 -3
  731. package/dist/spec/domain/service/StaffRoleHierarchy.d.ts.map +0 -1
  732. package/dist/spec/domain/service/StaffRoleHierarchy.js +0 -19
  733. package/dist/spec/domain/service/StaffRoleHierarchy.js.map +0 -1
  734. package/dist/spec/domain/service/TriggerGraphChecks.d.ts +0 -16
  735. package/dist/spec/domain/service/TriggerGraphChecks.d.ts.map +0 -1
  736. package/dist/spec/domain/service/TriggerGraphChecks.js +0 -337
  737. package/dist/spec/domain/service/TriggerGraphChecks.js.map +0 -1
  738. package/dist/spec/domain/service/TriggerSpecChecks.d.ts +0 -4
  739. package/dist/spec/domain/service/TriggerSpecChecks.d.ts.map +0 -1
  740. package/dist/spec/domain/service/TriggerSpecChecks.js +0 -89
  741. package/dist/spec/domain/service/TriggerSpecChecks.js.map +0 -1
  742. package/dist/spec/domain/service/ValidatedAdminUiProjection.d.ts +0 -11
  743. package/dist/spec/domain/service/ValidatedAdminUiProjection.d.ts.map +0 -1
  744. package/dist/spec/domain/service/ValidatedAdminUiProjection.js +0 -26
  745. package/dist/spec/domain/service/ValidatedAdminUiProjection.js.map +0 -1
  746. package/dist/spec/domain/service/ViewAdminUiChecker.d.ts +0 -14
  747. package/dist/spec/domain/service/ViewAdminUiChecker.d.ts.map +0 -1
  748. package/dist/spec/domain/service/ViewAdminUiChecker.js +0 -53
  749. package/dist/spec/domain/service/ViewAdminUiChecker.js.map +0 -1
  750. package/dist/spec/domain/service/index.d.ts +0 -24
  751. package/dist/spec/domain/service/index.d.ts.map +0 -1
  752. package/dist/spec/domain/service/index.js +0 -24
  753. package/dist/spec/domain/service/index.js.map +0 -1
  754. package/dist/spec/index.d.ts +0 -10
  755. package/dist/spec/index.d.ts.map +0 -1
  756. package/dist/spec/index.js +0 -12
  757. package/dist/spec/index.js.map +0 -1
  758. package/dist/spec/infrastructure/cli/parseArgsError.d.ts +0 -16
  759. package/dist/spec/infrastructure/cli/parseArgsError.d.ts.map +0 -1
  760. package/dist/spec/infrastructure/cli/parseArgsError.js +0 -34
  761. package/dist/spec/infrastructure/cli/parseArgsError.js.map +0 -1
  762. package/dist/spec/infrastructure/index.d.ts +0 -2
  763. package/dist/spec/infrastructure/index.d.ts.map +0 -1
  764. package/dist/spec/infrastructure/index.js +0 -2
  765. package/dist/spec/infrastructure/index.js.map +0 -1
  766. package/dist/spec/infrastructure/sql/PgQueryParser.d.ts +0 -18
  767. package/dist/spec/infrastructure/sql/PgQueryParser.d.ts.map +0 -1
  768. package/dist/spec/infrastructure/sql/PgQueryParser.js +0 -17
  769. package/dist/spec/infrastructure/sql/PgQueryParser.js.map +0 -1
  770. package/dist/spec/infrastructure/sql/compilePlan.d.ts +0 -37
  771. package/dist/spec/infrastructure/sql/compilePlan.d.ts.map +0 -1
  772. package/dist/spec/infrastructure/sql/compilePlan.js +0 -282
  773. package/dist/spec/infrastructure/sql/compilePlan.js.map +0 -1
  774. package/dist/spec/infrastructure/sql/compileSql.d.ts +0 -35
  775. package/dist/spec/infrastructure/sql/compileSql.d.ts.map +0 -1
  776. package/dist/spec/infrastructure/sql/compileSql.js +0 -92
  777. package/dist/spec/infrastructure/sql/compileSql.js.map +0 -1
  778. package/dist/spec/infrastructure/sql/frontEnd.d.ts +0 -8
  779. package/dist/spec/infrastructure/sql/frontEnd.d.ts.map +0 -1
  780. package/dist/spec/infrastructure/sql/frontEnd.js +0 -100
  781. package/dist/spec/infrastructure/sql/frontEnd.js.map +0 -1
  782. package/dist/spec/infrastructure/sql/index.d.ts +0 -4
  783. package/dist/spec/infrastructure/sql/index.d.ts.map +0 -1
  784. package/dist/spec/infrastructure/sql/index.js +0 -4
  785. package/dist/spec/infrastructure/sql/index.js.map +0 -1
  786. package/dist/spec/kernel/diagnostic.d.ts.map +0 -1
  787. package/dist/spec/kernel/diagnostic.js +0 -296
  788. package/dist/spec/kernel/diagnostic.js.map +0 -1
  789. package/dist/spec/kernel/index.d.ts +0 -8
  790. package/dist/spec/kernel/index.d.ts.map +0 -1
  791. package/dist/spec/kernel/index.js +0 -8
  792. package/dist/spec/kernel/index.js.map +0 -1
  793. package/dist/spec/usecase/EmitTypes.d.ts +0 -22
  794. package/dist/spec/usecase/EmitTypes.d.ts.map +0 -1
  795. package/dist/spec/usecase/EmitTypes.js +0 -182
  796. package/dist/spec/usecase/EmitTypes.js.map +0 -1
  797. package/dist/spec/usecase/ValidateManifestsUseCase.d.ts +0 -8
  798. package/dist/spec/usecase/ValidateManifestsUseCase.d.ts.map +0 -1
  799. package/dist/spec/usecase/ValidateManifestsUseCase.js +0 -101
  800. package/dist/spec/usecase/ValidateManifestsUseCase.js.map +0 -1
  801. package/dist/spec/usecase/dto/ValidateManifestsRequest.d.ts +0 -27
  802. package/dist/spec/usecase/dto/ValidateManifestsRequest.d.ts.map +0 -1
  803. package/dist/spec/usecase/dto/ValidateManifestsRequest.js +0 -2
  804. package/dist/spec/usecase/dto/ValidateManifestsRequest.js.map +0 -1
  805. package/dist/spec/usecase/dto/ValidateManifestsResponse.d.ts +0 -14
  806. package/dist/spec/usecase/dto/ValidateManifestsResponse.d.ts.map +0 -1
  807. package/dist/spec/usecase/dto/ValidateManifestsResponse.js +0 -2
  808. package/dist/spec/usecase/dto/ValidateManifestsResponse.js.map +0 -1
  809. package/dist/spec/usecase/dto/index.d.ts +0 -3
  810. package/dist/spec/usecase/dto/index.d.ts.map +0 -1
  811. package/dist/spec/usecase/dto/index.js +0 -3
  812. package/dist/spec/usecase/dto/index.js.map +0 -1
  813. package/dist/spec/usecase/index.d.ts +0 -10
  814. package/dist/spec/usecase/index.d.ts.map +0 -1
  815. package/dist/spec/usecase/index.js +0 -10
  816. package/dist/spec/usecase/index.js.map +0 -1
  817. package/dist/testing/cases/before-hook.d.ts +0 -4
  818. package/dist/testing/cases/before-hook.d.ts.map +0 -1
  819. package/dist/testing/cases/before-hook.js +0 -71
  820. package/dist/testing/cases/before-hook.js.map +0 -1
  821. package/dist/testing/cases/corpus.d.ts +0 -12
  822. package/dist/testing/cases/corpus.d.ts.map +0 -1
  823. package/dist/testing/cases/corpus.js +0 -91
  824. package/dist/testing/cases/corpus.js.map +0 -1
  825. package/dist/testing/cases/policy.d.ts +0 -74
  826. package/dist/testing/cases/policy.d.ts.map +0 -1
  827. package/dist/testing/cases/policy.js +0 -142
  828. package/dist/testing/cases/policy.js.map +0 -1
  829. package/dist/testing/cases/printer.d.ts +0 -4
  830. package/dist/testing/cases/printer.d.ts.map +0 -1
  831. package/dist/testing/cases/printer.js +0 -32
  832. package/dist/testing/cases/printer.js.map +0 -1
  833. package/dist/testing/cases/report-view.d.ts +0 -5
  834. package/dist/testing/cases/report-view.d.ts.map +0 -1
  835. package/dist/testing/cases/report-view.js +0 -33
  836. package/dist/testing/cases/report-view.js.map +0 -1
  837. package/dist/testing/cases/requisition.d.ts +0 -4
  838. package/dist/testing/cases/requisition.d.ts.map +0 -1
  839. package/dist/testing/cases/requisition.js +0 -38
  840. package/dist/testing/cases/requisition.js.map +0 -1
  841. package/dist/testing/cases/search-places.d.ts +0 -4
  842. package/dist/testing/cases/search-places.d.ts.map +0 -1
  843. package/dist/testing/cases/search-places.js +0 -60
  844. package/dist/testing/cases/search-places.js.map +0 -1
  845. package/dist/testing/cases/stock.d.ts +0 -4
  846. package/dist/testing/cases/stock.d.ts.map +0 -1
  847. package/dist/testing/cases/stock.js +0 -35
  848. package/dist/testing/cases/stock.js.map +0 -1
  849. package/dist/testing/cases/store.d.ts +0 -4
  850. package/dist/testing/cases/store.d.ts.map +0 -1
  851. package/dist/testing/cases/store.js +0 -100
  852. package/dist/testing/cases/store.js.map +0 -1
  853. package/dist/testing/harness.d.ts +0 -94
  854. package/dist/testing/harness.d.ts.map +0 -1
  855. package/dist/testing/harness.js +0 -168
  856. package/dist/testing/harness.js.map +0 -1
  857. package/dist/testing/index.d.ts.map +0 -1
  858. package/dist/testing/index.js.map +0 -1
  859. package/dist/testing/report.d.ts +0 -15
  860. package/dist/testing/report.d.ts.map +0 -1
  861. package/dist/testing/report.js +0 -22
  862. package/dist/testing/report.js.map +0 -1
  863. package/dist/web/createRestSurface.d.ts +0 -7
  864. package/dist/web/createRestSurface.d.ts.map +0 -1
  865. package/dist/web/createRestSurface.js +0 -39
  866. package/dist/web/createRestSurface.js.map +0 -1
  867. package/dist/web/index.d.ts +0 -2
  868. package/dist/web/index.d.ts.map +0 -1
  869. package/dist/web/index.js +0 -2
  870. package/dist/web/index.js.map +0 -1
  871. package/docs/adr/0001-four-atom-manifest-model.md +0 -440
  872. package/docs/adr/0002-closed-enums-for-bindings.md +0 -253
  873. package/docs/adr/0007-ai-as-primary-author.md +0 -473
  874. package/docs/adr/0008-structured-diagnostic-shape.md +0 -338
  875. package/docs/adr/0009-consumer-supplied-manifests.md +0 -149
  876. package/docs/adr/0010-locale-and-translates.md +0 -453
  877. package/docs/adr/0011-adapter-port-spec.md +0 -281
  878. package/docs/adr/0012-views-as-public-rest.md +0 -161
  879. package/docs/adr/0013-agent-provisioned-consumer-projects.md +0 -154
  880. package/docs/adr/0014-auth-better-auth-and-multi-tenant-mcp.md +0 -919
  881. package/docs/adr/0016-site-semantic-layer.md +0 -70
  882. package/docs/adr/0017-media-multi-variant-agent-side-optimization.md +0 -181
  883. package/docs/adr/0018-core-starters-repository-boundary.md +0 -179
  884. package/docs/adr/0019-sealed-manifest-runtime-pipeline.md +0 -244
  885. package/docs/adr/0020-builtin-handler-contracts-and-matched-upsert.md +0 -199
  886. package/docs/adr/0021-retire-starter-scaffolding.md +0 -30
  887. package/docs/adr/0022-caller-observed-version-occ.md +0 -212
  888. package/docs/adr/0023-port-failure-contract.md +0 -69
  889. package/docs/adr/0024-manifest-native-schema-tables.md +0 -264
  890. package/docs/adr/0025-reserved-native-columns-and-published-only-public-views.md +0 -105
  891. package/docs/adr/0026-progressive-generate.md +0 -36
  892. package/docs/adr/0027-scheduled-procedure-triggers.md +0 -31
  893. package/docs/adr/0028-schema-ttl-expiry.md +0 -33
  894. package/docs/adr/0029-mcp-apps-interaction-contracts.md +0 -324
  895. package/docs/adr/0030-store.md +0 -40
  896. package/docs/adr/0031-host-cloud-core-contract.md +0 -25
  897. package/docs/adr/0032-store-centric-core-and-service-contract.md +0 -361
  898. package/docs/adr/0033-storage-converges-to-the-plan.md +0 -92
  899. package/docs/adr/0034-store-is-authored-as-sql.md +0 -192
  900. package/docs/adr/0035-sql-dialects.md +0 -154
  901. package/docs/adr/0036-host-and-dialect.md +0 -65
  902. package/docs/adr/0037-postgresql-is-the-reference-dialect.md +0 -124
  903. package/docs/adr/0038-bun-native-host.md +0 -63
  904. package/docs/adr/README.md +0 -96
  905. package/docs/adr/adr-lite-803-request-diagnostics.md +0 -38
  906. package/docs/adr/adr-lite-808-route-readiness.md +0 -47
  907. package/docs/adr/adr-lite-809-bounded-public-content.md +0 -71
  908. package/docs/adr/adr-lite-812-native-parity.md +0 -150
  909. package/docs/adr/adr-lite-823-home-statistics.md +0 -64
  910. package/docs/adr/adr-lite-842-mcp-authoring.md +0 -30
  911. package/docs/adr/adr-lite-845-frontend-client.md +0 -38
  912. package/docs/adr/adr-lite-861-admin-webmcp.md +0 -48
  913. package/docs/adr/adr-lite-909-admin-ui-kit.md +0 -37
  914. package/docs/examples/commerce-inventory.md +0 -481
  915. package/docs/examples/commerce.md +0 -254
  916. package/docs/examples/guarded-api.md +0 -238
  917. package/docs/examples/intake-hooks.md +0 -237
  918. package/docs/examples/intake.md +0 -127
  919. package/docs/examples/legal-documents.md +0 -218
  920. package/docs/examples/procurement.md +0 -215
  921. package/docs/examples/publication.md +0 -211
  922. package/docs/examples/reference-service/.mantle/generated/mantle.ts +0 -174
  923. package/docs/examples/reference-service/.mantle/generated/plan.json +0 -1936
  924. package/docs/examples/reference-service/README.md +0 -33
  925. package/docs/examples/reference-service/manifests/catalog.yaml +0 -103
  926. package/docs/examples/reference-service/manifests/orders.yaml +0 -120
  927. package/docs/examples/reference-service/mantle.config.json +0 -1
  928. package/docs/examples/reference-service/package.json +0 -27
  929. package/docs/examples/reference-service/smoke.mjs +0 -156
  930. package/docs/examples/reference-service/src/handlers.ts +0 -36
  931. package/docs/examples/reference-service/src/index.ts +0 -33
  932. package/docs/examples/reference-service/src/service.ts +0 -78
  933. package/docs/examples/reference-service/wrangler.jsonc +0 -26
  934. package/docs/examples/reservation.md +0 -142
  935. package/docs/skills/develop/mcp-app.md +0 -79
  936. /package/docs/examples/{reference-service → app-shell}/.dev.vars.example +0 -0
@@ -0,0 +1,192 @@
1
+ import { adminOptionsOf, isBanned } from "./caller.js";
2
+ import { authNames } from "./adapter.js";
3
+ import { APIError } from "@better-auth/core/error";
4
+ import { ContractError } from "../kernel/contracts.js";
5
+ import { adminLayerOf, rolesFrom } from "../kernel/user-caller.js";
6
+ import * as sqlite from "../kernel/dialect/sqlite.js";
7
+ import * as postgres from "../kernel/dialect/postgres.js";
8
+ import { read as d1Read } from "../kernel/driver/d1.js";
9
+ import { read as pgRead, transaction } from "../kernel/driver/postgres.js";
10
+ const invalid = (message) => new ContractError("INPUT_VALIDATION_FAILED", message, "identity");
11
+ const project = ({ id, email, name, role, githubLogin, emailVerified, createdAt }) => ({ id, email, name, role: role ?? null, githubLogin: githubLogin ?? null, emailVerified: Boolean(emailVerified), createdAt: new Date(createdAt) });
12
+ const literal = (value) => "'" + value.replaceAll("'", "''") + "'";
13
+ const adminSql = (d, auth) => {
14
+ const { column } = authNames(auth.options), { adminRoles, adminUserIds } = adminOptionsOf(auth);
15
+ const col = (field) => column("user", field);
16
+ return '(' + [...adminRoles.map(role => `${d === sqlite.dialect ? "instr" : "strpos"}(',' || COALESCE(${col("role")}, '') || ',', ${literal(',' + role + ',')}) > 0`), ...adminUserIds.map(id => `${col("id")} = ${literal(id)}`), 'FALSE'].join(' OR ') + ')';
17
+ };
18
+ async function api(run) {
19
+ try {
20
+ return await run();
21
+ }
22
+ catch (error) {
23
+ if (error instanceof APIError)
24
+ throw new ContractError(error.body?.code ?? "AUTH_DENIED", error.message, "identity", { status: error.statusCode, cause: error });
25
+ throw error;
26
+ }
27
+ }
28
+ function directory(auth, _caller, headers, d, read) {
29
+ const options = adminOptionsOf(auth), roles = options.adminRoles, privileged = adminSql(d, auth);
30
+ const { table, column, has } = authNames(auth.options), col = (field) => column("user", field);
31
+ const createdAt = d === sqlite.dialect ? col("createdAt") : postgres.wireTimestamp(col("createdAt")).join("");
32
+ const grantRole = (role = roles[0]) => { if (!role || !roles.includes(role))
33
+ throw invalid("Role must be configured in Better Auth adminRoles."); return role; };
34
+ const allowed = async (action) => {
35
+ if (!(await api(() => auth.api.userHasPermission({ headers, body: { permissions: { user: [action] } } }))).success)
36
+ throw new ContractError("AUTH_DENIED", `Requires Better Auth user:${action}.`, "identity");
37
+ };
38
+ const context = async () => await auth.$context;
39
+ const find = async (id) => (await context()).adapter.findOne({ model: "user", where: [{ field: "id", value: id }] });
40
+ const set = async (id, role) => {
41
+ try {
42
+ await api(() => auth.api.setRole({ headers, body: { userId: id, role: [...(role.length ? role : rolesFrom(options.defaultRole))] } }));
43
+ return true;
44
+ }
45
+ catch (error) {
46
+ if (error instanceof ContractError && error.code === "USER_NOT_FOUND")
47
+ return false;
48
+ throw error;
49
+ }
50
+ };
51
+ const remove = async (id) => {
52
+ try {
53
+ const found = await find(id);
54
+ if (found && adminLayerOf(found, options) && !(await read(`SELECT 1 FROM ${table("user")} WHERE ${privileged} AND ${col("id")} <> ${literal(id)} AND COALESCE(${col("banned")}, ${d === sqlite.dialect ? "0" : "FALSE"}) = ${d === sqlite.dialect ? "0" : "FALSE"} LIMIT 1`, [])).length)
55
+ throw new ContractError("CONFLICT", "This is the last admin; promote another admin before removing this one.", "identity", { status: 409 });
56
+ await api(() => auth.api.removeUser({ headers, body: { userId: id } }));
57
+ if (found)
58
+ await (await context()).adapter.deleteMany({ model: "verification", where: [{ field: "identifier", operator: "in", value: ["sign-in", "email-verification", "forget-password"].map(t => `${t}-otp-${found.email.toLowerCase()}`) }] });
59
+ return true;
60
+ }
61
+ catch (error) {
62
+ if (error instanceof ContractError && error.code === "USER_NOT_FOUND")
63
+ return false;
64
+ throw error;
65
+ }
66
+ };
67
+ return {
68
+ adminRoles: roles,
69
+ async listUsers() {
70
+ const query = { sortBy: "createdAt", sortDirection: "asc" };
71
+ let { users, total } = await api(() => auth.api.listUsers({ headers, query }));
72
+ if (users.length < total)
73
+ ({ users } = await api(() => auth.api.listUsers({ headers, query: { ...query, limit: total } })));
74
+ return users.filter(user => adminLayerOf(user, options)).map(project);
75
+ },
76
+ async listMembers({ search = "", limit = 50, cursor, cursorDirection = "forward" } = {}) {
77
+ await allowed("list");
78
+ if (!Number.isInteger(limit) || limit < 1 || limit > 100 || search.length > 200 || !["forward", "backward"].includes(cursorDirection))
79
+ throw invalid("Invalid member page options.");
80
+ const term = search.trim().toLowerCase(), scope = JSON.stringify(["members", term]);
81
+ let key;
82
+ if (cursor) {
83
+ try {
84
+ const v = JSON.parse(decodeURIComponent(cursor.slice(2)));
85
+ if (!cursor.startsWith("m:") || !Array.isArray(v) || v.length !== 3 || v[0] !== scope || typeof v[1] !== "string" || !Number.isFinite(Date.parse(v[1])) || typeof v[2] !== "string" || !v[2])
86
+ throw 0;
87
+ key = [v[1], v[2]];
88
+ }
89
+ catch {
90
+ throw invalid("Invalid member cursor for this search.");
91
+ }
92
+ }
93
+ const values = [], bind = (v) => (values.push(v), d.param(values.length));
94
+ const conditions = [`NOT ${privileged}`];
95
+ if (term) {
96
+ const like = bind(`%${d.escapeLike(term)}%`);
97
+ conditions.push(`(${[`CAST(${col("id")} AS text)`, col("name"), col("email")].map(c => `${c} ${d.like(true)} ${like}${d.likeEscape}`).join(" OR ")})`);
98
+ }
99
+ const backward = cursorDirection === "backward", order = backward ? "DESC" : "ASC", op = backward ? "<" : ">";
100
+ if (key) {
101
+ const time = d.cast(bind(key[0]), "timestamptz"), id = bind(key[1]);
102
+ conditions.push(`(${col("createdAt")} ${op} ${time} OR (${col("createdAt")} = ${time} AND ${col("id")} ${op} ${id}))`);
103
+ }
104
+ const rows = await read(`SELECT ${["id", "email", "name", "role", "githubLogin", "emailVerified"].map(field => `${has("user", field) ? col(field) : "NULL"} AS "${field}"`).join(",")},${createdAt} AS "createdAt" FROM ${table("user")} WHERE ${conditions.join(" AND ")} ORDER BY ${col("createdAt")} ${order},${col("id")} ${order} LIMIT ${limit + 1}`, values);
105
+ const page = rows.slice(0, limit);
106
+ if (backward)
107
+ page.reverse();
108
+ const encode = (row) => `m:${encodeURIComponent(JSON.stringify([scope, typeof row.createdAt === "string" ? row.createdAt : row.createdAt.toISOString(), row.id]))}`;
109
+ return { items: page.map(project), previousCursor: (backward ? rows.length > limit : !!key) && page[0] ? encode(page[0]) : null, nextCursor: (backward ? !!key : rows.length > limit) && page.at(-1) ? encode(page.at(-1)) : null };
110
+ },
111
+ async setUserRole(id, role) {
112
+ const user = await find(id), current = rolesFrom(user?.role);
113
+ return set(id, role === null ? current.filter(name => !roles.includes(name)) : typeof role === "string" ? [...new Set([...current, grantRole(role)])] : role);
114
+ },
115
+ async inviteUser(email, role) {
116
+ const adminRole = grantRole(role), normalized = email.trim().toLowerCase();
117
+ if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(normalized))
118
+ throw invalid("Invalid invitation email.");
119
+ try {
120
+ const { user } = await api(() => auth.api.createUser({ headers, body: { email: normalized, name: normalized.split("@")[0], role: [adminRole] } }));
121
+ return { kind: "created", id: user.id };
122
+ }
123
+ catch (error) {
124
+ if (!(error instanceof ContractError) || error.code !== "USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL")
125
+ throw error;
126
+ const { users: [found] } = await api(() => auth.api.listUsers({ headers, query: { filterField: "email", filterValue: normalized, limit: 1 } }));
127
+ if (!found)
128
+ throw error;
129
+ if (!found.emailVerified)
130
+ throw new ContractError("AUTH_DENIED", "The existing account must verify its email before receiving admin access.", "identity:invitation");
131
+ await set(found.id, [...new Set([...rolesFrom(found.role), adminRole])]);
132
+ return { kind: "exists", id: found.id };
133
+ }
134
+ },
135
+ async revokeInvite(id) {
136
+ await allowed("delete");
137
+ const user = await find(id);
138
+ if (!user || !adminLayerOf(user, options) || user.emailVerified || await (await context()).adapter.findOne({ model: "account", where: [{ field: "userId", value: id }] }))
139
+ return false;
140
+ return remove(id);
141
+ },
142
+ deleteUser: remove,
143
+ };
144
+ }
145
+ export const d1Identity = (db, auth, caller, headers) => directory(auth, caller, headers, sqlite.dialect, (sql, v) => d1Read(db, sql, v));
146
+ export const postgresIdentity = (db, auth, caller, headers) => directory(auth, caller, headers, postgres.dialect, (sql, v) => pgRead(db, sql, v));
147
+ export function readIdentity(auth) {
148
+ const options = adminOptionsOf(auth), context = async () => await auth.$context;
149
+ const active = (user) => user && !isBanned(user) ? project(user) : null;
150
+ return {
151
+ user: async (id) => active(await (await context()).internalAdapter.findUserById(id)),
152
+ admins: async () => {
153
+ const { adapter } = await context();
154
+ const found = new Map();
155
+ for (const role of options.adminRoles)
156
+ for (const user of await adapter.findMany({ model: "user", where: [{ field: "role", operator: "contains", value: role }], limit: 10_000 }))
157
+ found.set(user.id, user);
158
+ if (options.adminUserIds.length)
159
+ for (const user of await adapter.findMany({ model: "user", where: [{ field: "id", operator: "in", value: [...options.adminUserIds] }], limit: 10_000 }))
160
+ found.set(user.id, user);
161
+ return [...found.values()].filter(user => adminLayerOf(user, options)).map(active).filter((user) => !!user);
162
+ },
163
+ };
164
+ }
165
+ const matches = (rule, user) => (rule.match === "email" ? user.emailVerified === true ? user.email : null : user.githubLogin)?.trim().toLowerCase() === rule.value.trim().toLowerCase();
166
+ const promote = (d, param, source) => {
167
+ const auth = typeof source === "function" ? source() : source, { adminRoles: roles } = adminOptionsOf(auth);
168
+ if (!roles[0])
169
+ throw new ContractError("AUTH_CONFIGURATION_ERROR", "Bootstrap requires Better Auth adminRoles.", "identity");
170
+ const { table, column } = authNames(auth.options), role = column("user", "role"), id = column("user", "id");
171
+ return `UPDATE ${table("user")} SET ${role}=${literal(roles[0])} || CASE WHEN COALESCE(${role}, '') = '' THEN '' ELSE ',' || ${role} END WHERE ${id}=${param} AND NOT EXISTS (SELECT 1 FROM ${table("user")} WHERE ${adminSql(d, auth)}) RETURNING ${id}`;
172
+ };
173
+ function bootstrap(rule, update) {
174
+ if (!rule.value.trim())
175
+ throw invalid("Bootstrap target cannot be empty.");
176
+ return async (user) => {
177
+ if (!matches(rule, user))
178
+ return;
179
+ if (!(await update(user.id)).length)
180
+ console.warn("[mantle bootstrap] promotion blocked: admin already exists.");
181
+ };
182
+ }
183
+ export function d1BootstrapAdmin(db, rule, auth) {
184
+ return bootstrap(rule, id => d1Read(db, promote(sqlite.dialect, "?", auth), [id]));
185
+ }
186
+ export function postgresBootstrapAdmin(db, rule, source) {
187
+ return bootstrap(rule, id => transaction(db, async (tx) => {
188
+ const auth = typeof source === "function" ? source() : source;
189
+ await tx.unsafe("SELECT pg_advisory_xact_lock(hashtext($1))", [authNames(auth.options).table("user")]);
190
+ return tx.unsafe(promote(postgres.dialect, "$1", auth), [id]);
191
+ }, { isolation: "read committed" }, "identity/bootstrap"));
192
+ }
@@ -0,0 +1,63 @@
1
+ import type { oauthProvider } from "@better-auth/oauth-provider";
2
+ import type { AuthInstance } from "./caller.js";
3
+ /**
4
+ * Fail closed for unbound tokens; reconsent cannot resurrect an issued JWT. As in Better Auth, an `offline_access` grant outlives
5
+ * the browser session: without a live session it stands on an unrevoked, unexpired offline refresh token for the same user and client.
6
+ */
7
+ export declare function assertActiveUserGrant(auth: AuthInstance, claims: Record<string, unknown>, audience: string | readonly string[]): Promise<{
8
+ id: string;
9
+ }>;
10
+ /** Add first to oauthProvider/mcp extensions; Better Auth retains ownership of referenceId. */
11
+ export declare const oauthGrantExtension: NonNullable<Parameters<typeof oauthProvider>[0]["extensions"]>[number];
12
+ export declare const OAUTH_GRANT_REVOCATION = "mantle-oauth-grant-revocation";
13
+ /**
14
+ * Add to the Better Auth plugins with the OAuth provider. An `offline_access` grant outlives sign-out and session expiry
15
+ * (as in Better Auth), but a successful password reset, a password change that signs out other devices, an admin ban
16
+ * (`/admin/ban-user`, or `/admin/update-user` setting `banned: true`), an admin session revocation or an admin password
17
+ * change ends every OAuth grant of that user: tokens, consents and unredeemed codes. So does an email OTP or magic-link
18
+ * sign-in attempt on an unverified user: Better Auth strips what was set up before that proof, possibly by someone else
19
+ * who registered the address first, and Mantle ends that party's grants before the attempt is checked.
20
+ */
21
+ export declare function oauthGrantRevocation(): {
22
+ id: "mantle-oauth-grant-revocation";
23
+ hooks: {
24
+ before: ({
25
+ matcher: (ctx: import("better-auth").HookEndpointContext) => boolean;
26
+ handler: import("better-auth").Middleware<import("better-auth").MiddlewareOptions, (inputContext: import("better-auth").MiddlewareInputContext<import("better-auth").MiddlewareOptions>) => Promise<{
27
+ context: {
28
+ mantleResetPasswordUser: string;
29
+ };
30
+ } | undefined>>;
31
+ } | {
32
+ matcher: (ctx: import("better-auth").HookEndpointContext) => boolean;
33
+ handler: import("better-auth").Middleware<import("better-auth").MiddlewareOptions, (inputContext: import("better-auth").MiddlewareInputContext<import("better-auth").MiddlewareOptions>) => Promise<void>>;
34
+ })[];
35
+ after: {
36
+ matcher: (ctx: import("better-auth").HookEndpointContext) => boolean;
37
+ handler: import("better-auth").Middleware<import("better-auth").MiddlewareOptions, (inputContext: import("better-auth").MiddlewareInputContext<import("better-auth").MiddlewareOptions>) => Promise<void>>;
38
+ }[];
39
+ };
40
+ };
41
+ export interface OAuthConsentRequest {
42
+ readonly clientName: string;
43
+ readonly redirectUri: string;
44
+ readonly scopes: readonly string[];
45
+ readonly oauthQuery: string;
46
+ }
47
+ export interface OAuthConsentInfo {
48
+ readonly id: string;
49
+ readonly clientId: string;
50
+ readonly clientName: string;
51
+ readonly scopes: readonly string[];
52
+ }
53
+ /** Signed-query and consent APIs over the same application-owned instance and adapter (including renamed tables). */
54
+ export declare function oauthConsents(auth: AuthInstance & {
55
+ handler(request: Request): Promise<Response>;
56
+ }): {
57
+ getOAuthConsentRequest: (request: Request) => Promise<OAuthConsentRequest | null>;
58
+ completeOAuthConsent: (request: Request, accept: boolean) => Promise<string>;
59
+ listOAuthConsents: (userId: string) => Promise<OAuthConsentInfo[]>;
60
+ revokeOAuthConsent: (userId: string, consentId: string) => Promise<boolean>;
61
+ };
62
+ /** Optional scheduled storage hygiene, not boot work or an authorization rule. Owned/CIMD clients survive. */
63
+ export declare function pruneLegacyOAuthClients(auth: AuthInstance): Promise<number>;
@@ -0,0 +1,185 @@
1
+ import { createAuthMiddleware } from "@better-auth/core/api";
2
+ import { nativeAuthRead } from "./adapter.js";
3
+ import { ContractError } from "../kernel/contracts.js";
4
+ const pair = (field, value) => ({ field, value });
5
+ const array = (value) => {
6
+ try {
7
+ const parsed = typeof value === "string" ? JSON.parse(value) : value;
8
+ return Array.isArray(parsed) && parsed.every(x => typeof x === "string") ? parsed : null;
9
+ }
10
+ catch {
11
+ return null;
12
+ }
13
+ };
14
+ export async function assertActiveUserGrant(auth, claims, audience) {
15
+ const { sub, azp, sid, mantle_consent_id: id, mantle_consent_reference: reference, mantle_skip_consent: skip } = claims;
16
+ const tokenScopes = typeof claims.scope === "string" ? claims.scope.split(/\s+/).filter(Boolean) : array(claims.scope);
17
+ const offline = !!tokenScopes?.includes("offline_access");
18
+ if (![sub, azp].every(x => typeof x === "string" && x.length) || !(offline && sid == null || typeof sid === "string" && sid.length) || !(skip === true && id === null || typeof id === "string" && id.length))
19
+ throw new ContractError("UNAUTHENTICATED", "OAuth token is not bound to a user session.");
20
+ const { exec, param, now, table, column } = nativeAuthRead(auth.options);
21
+ const at = now(Date.now());
22
+ const c = (field) => `c.${column("oauthConsent", field)}`, s = (field) => `s.${column("session", field)}`, client = (field) => `client.${column("oauthClient", field)}`, r = (field) => column("oauthRefreshToken", field);
23
+ const { rows } = await exec(`SELECT ${s("id")} AS session, ${c("id")} AS "consentId", ${c("referenceId")} AS reference, ${c("resources")} AS resources, ${c("scopes")} AS scopes,
24
+ ${client("skipConsent")} AS "skipConsent", ${client("disabled")} AS disabled, ${client("scopes")} AS "clientScopes"
25
+ FROM ${table("oauthClient")} client LEFT JOIN ${table("session")} s ON ${s("id")} = ${param(1)} AND ${s("userId")} = ${param(2)} AND ${s("expiresAt")} > ${param(3)}
26
+ LEFT JOIN ${table("oauthConsent")} c ON ${c("id")} = ${param(4)} AND ${c("userId")} = ${param(2)} AND ${c("clientId")} = ${client("clientId")}
27
+ WHERE ${client("clientId")} = ${param(5)}`, [sid ?? null, sub, at, id, azp]);
28
+ const grant = rows[0];
29
+ const live = !!grant?.session || offline && !!grant && (await exec(`SELECT ${r("scopes")} AS scopes FROM ${table("oauthRefreshToken")}
30
+ WHERE ${r("userId")} = ${param(1)} AND ${r("clientId")} = ${param(2)} AND ${r("revoked")} IS NULL AND ${r("expiresAt")} > ${param(3)}`, [sub, azp, at])).rows.some(row => array(row.scopes)?.includes("offline_access"));
31
+ const provider = auth.options.plugins?.find(plugin => plugin.id === "oauth-provider");
32
+ const firstParty = skip === true && id === null && !!grant?.skipConsent;
33
+ const resources = firstParty ? (typeof claims.aud === "string" ? [claims.aud] : array(claims.aud)) : array(grant?.resources);
34
+ const scopes = firstParty ? array(grant?.clientScopes) ?? provider?.options?.scopes : array(grant?.scopes);
35
+ const requested = typeof audience === "string" ? [audience] : audience;
36
+ const tokenAudiences = typeof claims.aud === "string" ? [claims.aud] : array(claims.aud) ?? [];
37
+ if (!grant || !live || grant.disabled || !firstParty && (!grant.consentId || (grant.reference ?? null) !== reference) || !resources || !scopes || !tokenScopes || !requested.some(x => resources.includes(x) && tokenAudiences.includes(x)) || !tokenScopes.every(x => scopes.includes(x)))
38
+ throw new ContractError("UNAUTHENTICATED", "OAuth authorization grant is no longer active.");
39
+ return { id: sub };
40
+ }
41
+ export const oauthGrantExtension = {
42
+ claims: { accessToken: async ({ ctx, user, client, referenceId, grantType, scopes, sessionId }) => {
43
+ if (grantType === "refresh_token" && !scopes.includes("offline_access")) {
44
+ const session = sessionId ? await ctx.context.adapter.findOne({ model: "session", where: [pair("id", sessionId)] }) : null;
45
+ if (!session || new Date(session.expiresAt).getTime() <= Date.now())
46
+ throw ctx.error("BAD_REQUEST", { error: "invalid_grant", error_description: "The browser session for this grant has ended; keep offline_access or sign in again." });
47
+ }
48
+ if (client.skipConsent)
49
+ return { mantle_consent_id: null, mantle_skip_consent: true };
50
+ const consent = user && await ctx.context.adapter.findOne({ model: "oauthConsent", where: [pair("userId", user.id), pair("clientId", client.clientId), { field: "referenceId", value: referenceId ?? null }] });
51
+ return { mantle_consent_id: consent?.id ?? null, mantle_consent_reference: referenceId ?? null };
52
+ } },
53
+ };
54
+ export const OAUTH_GRANT_REVOCATION = "mantle-oauth-grant-revocation";
55
+ const RESETS = ["/reset-password", "/email-otp/reset-password", "/phone-number/reset-password", "/admin/set-user-password"];
56
+ const ENDING = [...RESETS, "/change-password", "/admin/ban-user", "/admin/update-user", "/admin/revoke-user-sessions"];
57
+ const RESET_USER = "mantleResetPasswordUser";
58
+ const PROVING = ["/sign-in/email-otp", "/magic-link/verify"];
59
+ export function oauthGrantRevocation() {
60
+ return {
61
+ id: OAUTH_GRANT_REVOCATION,
62
+ hooks: {
63
+ before: [{ matcher: ctx => ctx.path === "/reset-password", handler: createAuthMiddleware(async (ctx) => {
64
+ const token = ctx.body?.token || ctx.query?.token;
65
+ const value = typeof token === "string" && token ? await ctx.context.internalAdapter.findVerificationValue(`reset-password:${token}`) : null;
66
+ if (value)
67
+ return { context: { [RESET_USER]: value.value } };
68
+ }) }, { matcher: ctx => PROVING.includes(ctx.path ?? ""), handler: createAuthMiddleware(async (ctx) => {
69
+ const email = ctx.path === "/sign-in/email-otp" ? ctx.body?.email : await magicLinkEmail(ctx.context, ctx.query?.token);
70
+ const found = typeof email === "string" && email ? await ctx.context.internalAdapter.findUserByEmail(email.toLowerCase()) : null;
71
+ if (found && !found.user.emailVerified)
72
+ await endGrants(ctx.context.adapter, found.user.id);
73
+ }) }],
74
+ after: [{ matcher: ctx => ENDING.includes(ctx.path ?? ""), handler: createAuthMiddleware(async (ctx) => {
75
+ const returned = ctx.context.returned, path = ctx.path ?? "";
76
+ if (returned instanceof Error || returned instanceof Response && !returned.ok)
77
+ return;
78
+ const body = ctx.body;
79
+ const userId = path === "/reset-password" ? ctx[RESET_USER]
80
+ : path === "/email-otp/reset-password" ? typeof body?.email === "string" && (await ctx.context.internalAdapter.findUserByEmail(body.email.toLowerCase()))?.user.id
81
+ : path === "/phone-number/reset-password" ? typeof body?.phoneNumber === "string" && (await ctx.context.adapter.findOne({ model: "user", where: [pair("phoneNumber", body.phoneNumber)] }))?.id
82
+ : path === "/change-password" ? body?.revokeOtherSessions === true && (ctx.context.session?.user.id ?? returned?.user?.id)
83
+ : path === "/admin/update-user" ? body?.data?.banned === true && body.userId
84
+ : body?.userId;
85
+ if (typeof userId !== "string" || !userId)
86
+ return;
87
+ if (RESETS.includes(path))
88
+ await ctx.context.internalAdapter.deleteUserSessions(userId);
89
+ await endGrants(ctx.context.adapter, userId);
90
+ }) }],
91
+ },
92
+ };
93
+ }
94
+ async function magicLinkEmail(context, token) {
95
+ if (typeof token !== "string" || !token)
96
+ return;
97
+ const store = context.options.plugins?.find(plugin => plugin.id === "magic-link")?.options?.storeToken ?? "plain";
98
+ const hash = typeof store === "object" && store && "hash" in store && typeof store.hash === "function" ? store.hash : undefined;
99
+ const stored = store === "plain" ? token : hash ? await hash(token)
100
+ : store === "hashed" ? btoa(String.fromCharCode(...new Uint8Array(await crypto.subtle.digest("SHA-256", new TextEncoder().encode(token))))).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "") : undefined;
101
+ const value = stored === undefined ? null : await context.internalAdapter.findVerificationValue(`magic-link:${stored}`);
102
+ try {
103
+ return value ? JSON.parse(value.value).email : undefined;
104
+ }
105
+ catch {
106
+ return;
107
+ }
108
+ }
109
+ async function endGrants(db, userId, clientId) {
110
+ const where = [pair("userId", userId), ...clientId ? [pair("clientId", clientId)] : []];
111
+ await db.deleteMany({ model: "oauthConsent", where });
112
+ for (const model of ["oauthRefreshToken", "oauthAccessToken"])
113
+ await db.updateMany({ model, where: [...where, { field: "revoked", value: null }], update: { revoked: new Date() } });
114
+ const code = (v) => { const x = authCode(v); return x?.userId === userId && (!clientId || x.query.client_id === clientId); };
115
+ const codes = [userId, clientId].filter(x => x !== undefined).map(x => ({ field: "value", operator: "contains", value: JSON.stringify(x) }));
116
+ for (let offset = 0;;) {
117
+ const page = await db.findMany({ model: "verification", where: codes, limit: 100, offset, sortBy: { field: "id", direction: "asc" } });
118
+ const ids = page.filter(v => code(v.value)).map(v => v.id);
119
+ if (ids.length)
120
+ await db.deleteMany({ model: "verification", where: [{ field: "id", operator: "in", value: ids }] });
121
+ if (page.length < 100)
122
+ break;
123
+ offset += page.length - ids.length;
124
+ }
125
+ }
126
+ function authCode(text) {
127
+ let value;
128
+ try {
129
+ value = JSON.parse(text);
130
+ }
131
+ catch {
132
+ return;
133
+ }
134
+ return value?.type === "authorization_code" && typeof value.userId === "string" && typeof value.query?.client_id === "string" ? value : undefined;
135
+ }
136
+ export function oauthConsents(auth) {
137
+ const adapter = async () => (await auth.$context).adapter;
138
+ return {
139
+ getOAuthConsentRequest: async (request) => {
140
+ const url = new URL(request.url), clientId = url.searchParams.get("client_id");
141
+ if (!clientId || !url.search)
142
+ return null;
143
+ const api = auth.api;
144
+ const oauthQuery = url.search.slice(1);
145
+ const client = await api.getOAuthClientPublicPrelogin({ headers: request.headers, body: { client_id: clientId, oauth_query: oauthQuery } });
146
+ return { clientName: client.client_name ?? clientId, redirectUri: url.searchParams.get("redirect_uri") ?? client.redirect_uris?.[0] ?? "", scopes: (url.searchParams.get("scope") ?? "").split(/\s+/).filter(Boolean), oauthQuery };
147
+ },
148
+ completeOAuthConsent: async (request, accept) => {
149
+ const oauth_query = (await request.formData()).get("oauth_query");
150
+ if (typeof oauth_query !== "string" || !oauth_query)
151
+ throw new ContractError("INPUT_VALIDATION_FAILED", "Missing signed authorization request.");
152
+ const headers = new Headers(request.headers);
153
+ headers.set("content-type", "application/json");
154
+ headers.delete("content-length");
155
+ const response = await auth.handler(new Request(new URL(`${auth.options.basePath ?? "/api/auth"}/oauth2/consent`, request.url).href, { method: "POST", headers, body: JSON.stringify({ accept, oauth_query }) }));
156
+ const body = await response.json();
157
+ if (!response.ok || typeof body.url !== "string")
158
+ throw new ContractError("INPUT_VALIDATION_FAILED", "Invalid authorization request.");
159
+ return body.url;
160
+ },
161
+ listOAuthConsents: async (userId) => {
162
+ const { exec, param, table, column } = nativeAuthRead(auth.options);
163
+ const c = (field) => `c.${column("oauthConsent", field)}`, client = (field) => `client.${column("oauthClient", field)}`;
164
+ const { rows } = await exec(`SELECT ${c("id")} AS id, ${c("clientId")} AS "clientId", COALESCE(${client("name")}, ${c("clientId")}) AS "clientName", ${c("scopes")} AS scopes
165
+ FROM ${table("oauthConsent")} c LEFT JOIN ${table("oauthClient")} client ON ${client("clientId")} = ${c("clientId")}
166
+ WHERE ${c("userId")} = ${param(1)} ORDER BY ${c("updatedAt")} DESC, ${c("id")} ASC`, [userId]);
167
+ return rows.map(row => ({ id: row.id, clientId: row.clientId, clientName: row.clientName, scopes: array(row.scopes) ?? [] }));
168
+ },
169
+ revokeOAuthConsent: async (userId, consentId) => {
170
+ const db = await adapter();
171
+ const consent = await db.findOne({ model: "oauthConsent", where: [pair("id", consentId), pair("userId", userId)] });
172
+ if (!consent)
173
+ return false;
174
+ await endGrants(db, userId, consent.clientId);
175
+ return true;
176
+ },
177
+ };
178
+ }
179
+ export async function pruneLegacyOAuthClients(auth) {
180
+ const { adapter } = await auth.$context;
181
+ return adapter.deleteMany({ model: "oauthClient", where: [
182
+ { field: "clientDiscoveryId", value: null }, { field: "userId", value: null }, { field: "referenceId", value: null },
183
+ { field: "createdAt", operator: "lt", value: new Date(Date.now() - 90 * 86400_000) },
184
+ ] });
185
+ }
@@ -0,0 +1,8 @@
1
+ const seeds = new WeakMap();
2
+ export function resourceSeeds(options) {
3
+ const inputs = (seeds.get(options) ?? options.resources ?? []);
4
+ if (!seeds.has(options))
5
+ seeds.set(options, [...inputs]);
6
+ options.resources = [];
7
+ return inputs;
8
+ }
@@ -0,0 +1,33 @@
1
+ import { ContractError } from "../kernel/contracts.js";
2
+ export const PRIVATE = { "cache-control": "private, no-store" };
3
+ export const CONSENT = new Set(["GET /oauth/consent", "GET /oauth/consent/data", "POST /oauth/consent", "GET /oauth/consents", "GET /oauth/consents/data", "POST /oauth/consents/revoke"]);
4
+ export const MAX_BODY = 1_048_576;
5
+ export const text = (body, status) => new Response(body, { status, headers: PRIVATE });
6
+ export const json = (body, status = 200) => Response.json(body, { status, headers: PRIVATE });
7
+ export const redirect = (location, status = 302) => new Response(null, { status, headers: { location, ...PRIVATE } });
8
+ export const tooLarge = () => new ContractError("INPUT_VALIDATION_FAILED", "Request body exceeds 1 MiB.");
9
+ export async function readBody(request) {
10
+ if (Number(request.headers.get("content-length")) > MAX_BODY)
11
+ throw tooLarge();
12
+ const reader = request.body?.getReader();
13
+ if (!reader)
14
+ return "";
15
+ const decoder = new TextDecoder();
16
+ let size = 0, text = "";
17
+ try {
18
+ for (;;) {
19
+ const { value, done } = await reader.read();
20
+ if (done)
21
+ return text + decoder.decode();
22
+ size += value.byteLength;
23
+ if (size > MAX_BODY) {
24
+ void reader.cancel();
25
+ throw tooLarge();
26
+ }
27
+ text += decoder.decode(value, { stream: true });
28
+ }
29
+ }
30
+ finally {
31
+ reader.releaseLock();
32
+ }
33
+ }
@@ -0,0 +1,32 @@
1
+ /** Optional app-mounted auth routes; consent and raw admin routes resolve fresh authority. Better Auth owns tokens. */
2
+ import { type Caller } from "../kernel/contracts.js";
3
+ import { type AuthInstance, type AuthLoader } from "./caller.js";
4
+ export interface AuthRoutesOptions {
5
+ /** Same basePath as app-owned betterAuth options. */
6
+ readonly basePath?: string;
7
+ readonly resolver?: (request: Request) => Caller | Promise<Caller>;
8
+ readonly methods: readonly ({
9
+ readonly kind: "social";
10
+ readonly provider: string;
11
+ } | {
12
+ readonly kind: "oauth";
13
+ readonly providerId: string;
14
+ readonly displayName?: string;
15
+ } | {
16
+ readonly kind: "email-otp" | "magic-link";
17
+ })[];
18
+ readonly connectedAppsPage?: string;
19
+ }
20
+ /** The service's auth entry: a Response for a path it owns, `null` for any other. */
21
+ export declare function authRoutes(loader: AuthLoader<AuthInstance & {
22
+ handler(request: Request): Promise<Response>;
23
+ }>, options: AuthRoutesOptions): (request: Request) => Promise<Response | null>;
24
+ /**
25
+ * A dynamic registration whose every redirect URI is http on a loopback host and that names no application_type is a
26
+ * native app (RFC 8252 7.3): local MCP clients register this way. Better Auth reads the missing type as `web`, which
27
+ * needs https on a non-loopback host, so it would refuse them all. Mark it native, as the client could itself; a
28
+ * registration naming a type, mixing hosts or using any other redirect is passed through unchanged.
29
+ */
30
+ export declare function loopbackClientsAreNative(request: Request): Promise<Request>;
31
+ /** Better Auth and host fetch implementations may merge several Set-Cookie values into one header. */
32
+ export declare function normalizeAuthResponseCookies(response: Response): Promise<Response>;
@@ -0,0 +1,80 @@
1
+ import { ContractError } from "../kernel/contracts.js";
2
+ import { checkOrigin, surfaceFailure } from "../kernel/surface-failure.js";
3
+ import { draining } from "../kernel/drain.js";
4
+ import { guardAuthAdminRequest } from "./admin.js";
5
+ import { CONSENT, MAX_BODY, json, readBody, text } from "./route-http.js";
6
+ import { resolveCaller } from "./caller.js";
7
+ const basePathOf = (options) => (options.basePath ?? "/api/auth").replace(/\/+$/, "");
8
+ const WELL_KNOWN = /^\/\.well-known\/(oauth-authorization-server|oauth-protected-resource)(\/|$)/;
9
+ export function authRoutes(loader, options) {
10
+ const base = basePathOf(options);
11
+ if (options.connectedAppsPage && (!options.connectedAppsPage.startsWith("/") || options.connectedAppsPage.startsWith("//") || /[\\\r\n]/.test(options.connectedAppsPage)))
12
+ throw new Error("connectedAppsPage must be a same-origin absolute path.");
13
+ const resolve = options.resolver ?? ((request) => resolveCaller(request, loader));
14
+ return draining(async (request) => {
15
+ const { pathname } = new URL(request.url);
16
+ const route = `${request.method} ${pathname}`;
17
+ if (pathname === `${base}/methods` && request.method === "GET")
18
+ return json({ methods: options.methods });
19
+ if (pathname.startsWith(`${base}/`) || WELL_KNOWN.test(pathname)) {
20
+ const auth = await loader.get();
21
+ if (basePathOf(auth.options) !== base)
22
+ throw new Error("authRoutes basePath differs from betterAuth options.");
23
+ try {
24
+ const bounded = request.body ? new Request(request, { body: await readBody(request) }) : request;
25
+ await guardAuthAdminRequest(bounded, () => resolve(bounded), base);
26
+ const registration = bounded.method === "POST" && pathname === `${base}/oauth2/register` ? await loopbackClientsAreNative(bounded) : bounded;
27
+ return await normalizeAuthResponseCookies(await auth.handler(registration));
28
+ }
29
+ catch (error) {
30
+ return surfaceFailure(error, undefined, `auth ${route}`);
31
+ }
32
+ }
33
+ if (!CONSENT.has(route))
34
+ return null;
35
+ try {
36
+ const caller = await resolve(request);
37
+ checkOrigin(request, caller);
38
+ if (request.method === "POST" && Number(request.headers.get("content-length")) > MAX_BODY)
39
+ return text("request body too large", 413);
40
+ const [{ oauthConsents }, { consentSurface }] = await Promise.all([import("./oauth.js"), import("./consent.js")]);
41
+ return await consentSurface(oauthConsents(await loader.get()), options)(request, caller, route);
42
+ }
43
+ catch (error) {
44
+ return surfaceFailure(error, undefined, `auth ${route}`);
45
+ }
46
+ });
47
+ }
48
+ const LOOPBACK_HOSTS = new Set(["localhost", "127.0.0.1", "[::1]"]);
49
+ export async function loopbackClientsAreNative(request) {
50
+ const body = await readBody(request.clone()).then(JSON.parse).catch(error => { if (error instanceof ContractError)
51
+ throw error; return null; });
52
+ const uris = body?.redirect_uris;
53
+ if (!body || typeof body !== "object" || Array.isArray(body) || body.application_type !== undefined || !Array.isArray(uris) || !uris.length)
54
+ return request;
55
+ const loopback = uris.every((uri) => {
56
+ if (typeof uri !== "string" || !URL.canParse(uri))
57
+ return false;
58
+ const url = new URL(uri);
59
+ return url.protocol === "http:" && LOOPBACK_HOSTS.has(url.hostname);
60
+ });
61
+ if (!loopback)
62
+ return request;
63
+ const headers = new Headers(request.headers);
64
+ headers.delete("content-length");
65
+ return new Request(request.url, { method: "POST", headers, body: JSON.stringify({ ...body, application_type: "native" }) });
66
+ }
67
+ export async function normalizeAuthResponseCookies(response) {
68
+ if (!response.headers.has("set-cookie"))
69
+ return response;
70
+ const { splitSetCookieHeader } = await import("better-auth/cookies");
71
+ const values = response.headers.getSetCookie?.() ?? [response.headers.get("set-cookie")];
72
+ const cookies = values.flatMap(splitSetCookieHeader);
73
+ if (cookies.length < 2)
74
+ return response;
75
+ const headers = new Headers(response.headers);
76
+ headers.delete("set-cookie");
77
+ for (const cookie of cookies)
78
+ headers.append("set-cookie", cookie);
79
+ return new Response(response.body, { status: response.status, statusText: response.statusText, headers });
80
+ }