@aotter/mantle 0.1.5-alpha.1 → 0.2.0-alpha.10

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 (495) hide show
  1. package/README.md +166 -298
  2. package/dist/auth/adapter.d.ts +32 -0
  3. package/dist/auth/adapter.js +288 -0
  4. package/dist/auth/admin.d.ts +3 -0
  5. package/dist/auth/admin.js +21 -0
  6. package/dist/auth/caller.d.ts +86 -0
  7. package/dist/auth/caller.js +155 -0
  8. package/dist/auth/hardening.d.ts +24 -0
  9. package/dist/auth/hardening.js +40 -0
  10. package/dist/auth/identity.d.ts +121 -0
  11. package/dist/auth/identity.js +203 -0
  12. package/dist/auth/oauth.d.ts +63 -0
  13. package/dist/auth/oauth.js +217 -0
  14. package/dist/auth/resource-seeds.js +10 -0
  15. package/dist/auth/routes.d.ts +32 -0
  16. package/dist/auth/routes.js +226 -0
  17. package/dist/build/compiler.d.ts +721 -0
  18. package/dist/build/compiler.js +7029 -0
  19. package/dist/build/spec/domain/model/ManifestGrammar.d.ts +439 -0
  20. package/dist/build/spec/domain/model/RuntimePlan.d.ts +168 -0
  21. package/dist/build/spec/domain/model/SqlIr.d.ts +129 -0
  22. package/dist/build/spec/domain/model/UserFields.d.ts +21 -0
  23. package/dist/build/spec/domain/service/PlanFingerprint.d.ts +7 -0
  24. package/dist/build/spec/kernel/diagnostic.d.ts +108 -0
  25. package/dist/bun/assets.d.ts +2 -0
  26. package/dist/bun/assets.js +24 -0
  27. package/dist/domain/adminOrder.js +24 -0
  28. package/dist/domain/columns.js +57 -0
  29. package/dist/domain/describe/chunk-ZVXBGP7Y.js +424 -0
  30. package/dist/domain/describe/index.d.ts +58 -0
  31. package/dist/domain/describe/index.js +115 -0
  32. package/dist/domain/describe/target-hash.d.ts +8 -0
  33. package/dist/domain/describe/target-hash.js +12 -0
  34. package/dist/domain/describe/targets.d.ts +40 -0
  35. package/dist/domain/entry.js +33 -0
  36. package/dist/domain/generated-tools.js +19 -0
  37. package/dist/domain/generation.d.ts +16 -0
  38. package/dist/domain/generation.js +1 -0
  39. package/dist/domain/input.js +17 -0
  40. package/dist/domain/model.js +1 -0
  41. package/dist/domain/paging.js +230 -0
  42. package/dist/domain/recipes.js +24 -0
  43. package/dist/domain/userReferences.js +5 -0
  44. package/dist/domain/wireScalars.js +47 -0
  45. package/dist/infrastructure/adminEntries.js +153 -0
  46. package/dist/infrastructure/adminPaging.js +72 -0
  47. package/dist/infrastructure/artifacts.js +71 -0
  48. package/dist/infrastructure/authSchema.js +83 -0
  49. package/dist/infrastructure/bundle.js +188 -0
  50. package/dist/infrastructure/cli.js +118 -0
  51. package/dist/infrastructure/generate.d.ts +12 -0
  52. package/dist/infrastructure/generate.js +189 -0
  53. package/dist/infrastructure/generateAuth.d.ts +8 -0
  54. package/dist/infrastructure/generateAuth.js +74 -0
  55. package/dist/infrastructure/help.js +60 -0
  56. package/dist/infrastructure/init.js +54 -0
  57. package/dist/infrastructure/inputs.js +41 -0
  58. package/dist/infrastructure/mounts.js +25 -0
  59. package/dist/infrastructure/wrangler.js +109 -0
  60. package/dist/kernel/authorization.d.ts +4 -0
  61. package/dist/kernel/authorization.js +16 -0
  62. package/dist/kernel/binds.d.ts +60 -0
  63. package/dist/kernel/binds.js +49 -0
  64. package/dist/kernel/caller-identity.d.ts +24 -0
  65. package/dist/kernel/caller-identity.js +22 -0
  66. package/dist/kernel/contract-error.d.ts +12 -0
  67. package/dist/kernel/contract-error.js +14 -0
  68. package/dist/kernel/contracts.d.ts +143 -0
  69. package/dist/kernel/contracts.js +97 -0
  70. package/dist/kernel/cron.d.ts +1 -0
  71. package/dist/kernel/cron.js +58 -0
  72. package/dist/kernel/dialect/common.d.ts +38 -0
  73. package/dist/kernel/dialect/common.js +6 -0
  74. package/dist/kernel/dialect/postgres.d.ts +16 -0
  75. package/dist/kernel/dialect/postgres.js +18 -0
  76. package/dist/kernel/dialect/sqlite.d.ts +20 -0
  77. package/dist/kernel/dialect/sqlite.js +34 -0
  78. package/dist/kernel/drain.d.ts +5 -0
  79. package/dist/kernel/drain.js +35 -0
  80. package/dist/kernel/driver/bun-sqlite.d.ts +19 -0
  81. package/dist/kernel/driver/bun-sqlite.js +77 -0
  82. package/dist/kernel/driver/d1.d.ts +24 -0
  83. package/dist/kernel/driver/d1.js +22 -0
  84. package/dist/kernel/driver/postgres.d.ts +25 -0
  85. package/dist/kernel/driver/postgres.js +99 -0
  86. package/dist/kernel/driver/transaction-context.d.ts +10 -0
  87. package/dist/kernel/driver/transaction-context.js +29 -0
  88. package/dist/kernel/email.d.ts +28 -0
  89. package/dist/kernel/email.js +38 -0
  90. package/dist/kernel/host-access.d.ts +10 -0
  91. package/dist/kernel/host-access.js +65 -0
  92. package/dist/kernel/host-caller.d.ts +39 -0
  93. package/dist/kernel/host-caller.js +56 -0
  94. package/dist/kernel/json-body.d.ts +4 -0
  95. package/dist/kernel/json-body.js +44 -0
  96. package/dist/kernel/mcp-apps.d.ts +69 -0
  97. package/dist/kernel/mcp-apps.js +40 -0
  98. package/dist/kernel/mcp-call.d.ts +5 -0
  99. package/dist/kernel/mcp-call.js +25 -0
  100. package/dist/kernel/mcp-handler.js +371 -0
  101. package/dist/kernel/mcp.d.ts +110 -0
  102. package/dist/kernel/mcp.js +50 -0
  103. package/dist/kernel/media.d.ts +27 -0
  104. package/dist/kernel/media.js +216 -0
  105. package/dist/kernel/paging.d.ts +55 -0
  106. package/dist/kernel/paging.js +95 -0
  107. package/dist/kernel/publishing.d.ts +4 -0
  108. package/dist/kernel/publishing.js +16 -0
  109. package/dist/kernel/r2-media.d.ts +42 -0
  110. package/dist/kernel/r2-media.js +78 -0
  111. package/dist/kernel/rest-dispatch.js +38 -0
  112. package/dist/kernel/rest-router.js +64 -0
  113. package/dist/kernel/rest.d.ts +58 -0
  114. package/dist/kernel/rest.js +41 -0
  115. package/dist/kernel/scalars.d.ts +6 -0
  116. package/dist/kernel/scalars.js +44 -0
  117. package/dist/kernel/search.js +5 -0
  118. package/dist/kernel/site-types.d.ts +146 -0
  119. package/dist/kernel/site-types.js +1 -0
  120. package/dist/kernel/site.d.ts +39 -0
  121. package/dist/kernel/site.js +32 -0
  122. package/dist/kernel/store.d.ts +175 -0
  123. package/dist/kernel/store.js +269 -0
  124. package/dist/kernel/surface.d.ts +10 -0
  125. package/dist/kernel/surface.js +19 -0
  126. package/dist/kernel/sweep.d.ts +17 -0
  127. package/dist/kernel/sweep.js +27 -0
  128. package/dist/kernel/translations.d.ts +1 -0
  129. package/dist/kernel/translations.js +13 -0
  130. package/dist/kernel/user-caller.d.ts +31 -0
  131. package/dist/kernel/user-caller.js +67 -0
  132. package/dist/kernel/user-field-name.js +3 -0
  133. package/dist/kernel/user-fields.d.ts +35 -0
  134. package/dist/kernel/user-fields.js +81 -0
  135. package/dist/kernel/validation.d.ts +15 -0
  136. package/dist/kernel/validation.js +54 -0
  137. package/dist/kernel/web-gateway.js +68 -0
  138. package/dist/kernel/web-head.js +15 -0
  139. package/dist/kernel/web-index.js +40 -0
  140. package/dist/kernel/web-response.js +8 -0
  141. package/dist/kernel/web.d.ts +77 -0
  142. package/dist/kernel/web.js +124 -0
  143. package/dist/kernel/where.js +27 -0
  144. package/dist/testing/index.d.ts +1 -0
  145. package/dist/testing/index.js +1 -0
  146. package/dist/usecase/adminBindings.js +143 -0
  147. package/dist/usecase/adminClient.js +87 -0
  148. package/dist/usecase/adminDescriptors.js +107 -0
  149. package/dist/usecase/generate.js +166 -0
  150. package/dist/usecase/handlers.js +21 -0
  151. package/dist/usecase/mcp-media.js +17 -0
  152. package/dist/usecase/mcp.js +100 -0
  153. package/dist/usecase/paging.js +71 -0
  154. package/dist/usecase/publishing.js +63 -0
  155. package/dist/usecase/refusals.js +27 -0
  156. package/dist/usecase/rest.js +54 -0
  157. package/dist/usecase/search.js +7 -0
  158. package/dist/usecase/site.js +39 -0
  159. package/dist/usecase/stores.js +64 -0
  160. package/dist/usecase/tool-version.js +9 -0
  161. package/dist/usecase/translations.js +78 -0
  162. package/dist/usecase/ttl.js +20 -0
  163. package/dist/usecase/validation.js +241 -0
  164. package/dist/usecase/web.js +23 -0
  165. package/docs/examples/README.md +39 -18
  166. package/docs/examples/app-shell/.dev.vars.example +4 -0
  167. package/docs/examples/app-shell/README.md +121 -0
  168. package/docs/examples/app-shell/accept.mjs +91 -0
  169. package/docs/examples/app-shell/gitignore +7 -0
  170. package/docs/examples/app-shell/package.json +43 -0
  171. package/docs/examples/app-shell/pnpm-workspace.yaml +8 -0
  172. package/docs/examples/app-shell/smoke-kit.mjs +168 -0
  173. package/docs/examples/app-shell/src/auth.ts +58 -0
  174. package/docs/examples/app-shell/src/handlers.ts +5 -0
  175. package/docs/examples/app-shell/src/index.ts +4 -0
  176. package/docs/examples/app-shell/src/routes.ts +14 -0
  177. package/docs/examples/app-shell/src/schedule.ts +8 -0
  178. package/docs/examples/app-shell/src/service.ts +70 -0
  179. package/docs/examples/app-shell/src/sign-in.ts +41 -0
  180. package/docs/examples/app-shell/src/signup.ts +8 -0
  181. package/docs/examples/app-shell/tsconfig.json +26 -0
  182. package/docs/examples/app-shell/worker-configuration.d.ts +22 -0
  183. package/docs/examples/app-shell/wrangler.jsonc +62 -0
  184. package/docs/examples/club-events/README.md +65 -0
  185. package/docs/examples/club-events/manifests/club-events.yaml +247 -0
  186. package/docs/examples/club-events/smoke.mjs +127 -0
  187. package/docs/examples/club-events/src/handlers.ts +25 -0
  188. package/docs/examples/club-events/src/signup.ts +9 -0
  189. package/docs/examples/generated-web/README.md +78 -0
  190. package/docs/examples/generated-web/posts.yaml +38 -0
  191. package/docs/examples/generated-web/seed.sql +6 -0
  192. package/docs/examples/generated-web/src/worker.ts +43 -0
  193. package/docs/examples/generated-web/tsconfig.json +8 -0
  194. package/docs/examples/generated-web/wrangler.jsonc +8 -0
  195. package/docs/examples/purchasing/.dev.vars.example +6 -0
  196. package/docs/examples/purchasing/README.md +99 -0
  197. package/docs/examples/purchasing/manifests/purchasing.yaml +374 -0
  198. package/docs/examples/purchasing/seed.sql +4 -0
  199. package/docs/examples/purchasing/smoke.mjs +191 -0
  200. package/docs/examples/purchasing/src/admin.tsx +13 -0
  201. package/docs/examples/purchasing/src/handlers.ts +33 -0
  202. package/docs/examples/purchasing/src/notify.ts +29 -0
  203. package/docs/examples/purchasing/src/requests-page.ts +57 -0
  204. package/docs/examples/purchasing/src/routes.ts +53 -0
  205. package/docs/examples/purchasing/src/schedule.ts +31 -0
  206. package/docs/examples/purchasing/src/signup.ts +5 -0
  207. package/docs/examples/purchasing/src/supplier.ts +32 -0
  208. package/docs/examples/purchasing/wrangler.jsonc +69 -0
  209. package/docs/examples/recipes/README.md +60 -0
  210. package/docs/examples/recipes/manifests/recipes.yaml +75 -0
  211. package/docs/examples/recipes/smoke.mjs +102 -0
  212. package/docs/examples/recipes/src/media.ts +13 -0
  213. package/docs/examples/recipes/src/pages.ts +99 -0
  214. package/docs/examples/recipes/src/routes.ts +71 -0
  215. package/docs/examples/recipes/src/site-config.ts +12 -0
  216. package/docs/examples/recipes/wrangler.jsonc +74 -0
  217. package/docs/handbook/cloudflare/authentication.md +180 -322
  218. package/docs/handbook/cloudflare/chatgpt-sites.md +5 -23
  219. package/docs/handbook/cloudflare/deploy-and-operate.md +55 -77
  220. package/docs/handbook/cloudflare/media-r2.md +61 -205
  221. package/docs/handbook/cloudflare/service-entry.md +239 -0
  222. package/docs/handbook/concepts/authorization.md +10 -107
  223. package/docs/handbook/concepts/four-atoms.md +9 -168
  224. package/docs/handbook/concepts/lifecycle-and-locales.md +9 -132
  225. package/docs/handbook/concepts/mcp-and-agents.md +24 -121
  226. package/docs/handbook/concepts/procedures-and-triggers.md +5 -217
  227. package/docs/handbook/concepts/runtime-and-adapters.md +15 -169
  228. package/docs/handbook/concepts/views.md +10 -185
  229. package/docs/handbook/examples/hub.md +3 -8
  230. package/docs/handbook/guides/adapter-guide.md +11 -0
  231. package/docs/handbook/guides/admin-ui.md +115 -133
  232. package/docs/handbook/guides/agent-setup.md +64 -74
  233. package/docs/handbook/guides/agent-workflow-acceptance.md +232 -0
  234. package/docs/handbook/guides/email.md +86 -0
  235. package/docs/handbook/guides/local-testing.md +40 -0
  236. package/docs/handbook/guides/mcp-apps.md +560 -0
  237. package/docs/handbook/guides/native-admin.md +566 -0
  238. package/docs/handbook/guides/native-execution.md +133 -0
  239. package/docs/handbook/guides/oauth.md +219 -0
  240. package/docs/handbook/guides/postgres-adapters.md +56 -0
  241. package/docs/handbook/guides/public-pages.md +87 -0
  242. package/docs/handbook/guides/size-and-startup.md +9 -0
  243. package/docs/handbook/guides/sql-patterns.md +266 -0
  244. package/docs/handbook/guides/typed-queries.md +211 -107
  245. package/docs/handbook/navigation.json +176 -55
  246. package/docs/handbook/reference/admin-descriptors.md +53 -0
  247. package/docs/handbook/reference/authorization.md +39 -266
  248. package/docs/handbook/reference/describe.md +56 -0
  249. package/docs/handbook/reference/diagnostics.md +19 -186
  250. package/docs/handbook/reference/features.md +45 -55
  251. package/docs/handbook/reference/manifest.md +6 -129
  252. package/docs/handbook/reference/procedure.md +11 -303
  253. package/docs/handbook/reference/schema.md +64 -240
  254. package/docs/handbook/reference/site-config.md +5 -218
  255. package/docs/handbook/reference/sql.md +64 -0
  256. package/docs/handbook/reference/surface.md +392 -201
  257. package/docs/handbook/reference/trigger.md +56 -192
  258. package/docs/handbook/reference/view.md +24 -243
  259. package/docs/handbook/releases/index.md +244 -77
  260. package/docs/handbook/start/agents.md +45 -0
  261. package/docs/handbook/start/overview.md +9 -48
  262. package/docs/handbook/start/project-and-cli.md +51 -104
  263. package/docs/handbook/start/quickstart-worker.md +43 -178
  264. package/docs/skills/develop/SKILL.md +79 -249
  265. package/docs/skills/integrate/SKILL.md +39 -50
  266. package/docs/skills/media-gc/SKILL.md +34 -10
  267. package/docs/skills/provision/SKILL.md +36 -186
  268. package/docs/skills/update/SKILL.md +23 -38
  269. package/docs/source/scripts/postgres-adapter.ts +101 -0
  270. package/docs/upgrade-0.1-to-0.2.md +227 -0
  271. package/package.json +120 -131
  272. package/skills/README.md +48 -108
  273. package/skills/mantle/SKILL.md +76 -0
  274. package/dist/admin-ui.d.ts +0 -2
  275. package/dist/admin-ui.d.ts.map +0 -1
  276. package/dist/admin-ui.js +0 -2
  277. package/dist/admin-ui.js.map +0 -1
  278. package/dist/admin.d.ts +0 -2
  279. package/dist/admin.d.ts.map +0 -1
  280. package/dist/admin.js +0 -2
  281. package/dist/admin.js.map +0 -1
  282. package/dist/auth.d.ts +0 -2
  283. package/dist/auth.d.ts.map +0 -1
  284. package/dist/auth.js +0 -2
  285. package/dist/auth.js.map +0 -1
  286. package/dist/bun.d.ts +0 -2
  287. package/dist/bun.d.ts.map +0 -1
  288. package/dist/bun.js +0 -2
  289. package/dist/bun.js.map +0 -1
  290. package/dist/cli/generate-cloudflare.d.ts +0 -7
  291. package/dist/cli/generate-cloudflare.d.ts.map +0 -1
  292. package/dist/cli/generate-cloudflare.js +0 -123
  293. package/dist/cli/generate-cloudflare.js.map +0 -1
  294. package/dist/cli/generate-project.d.ts +0 -25
  295. package/dist/cli/generate-project.d.ts.map +0 -1
  296. package/dist/cli/generate-project.js +0 -282
  297. package/dist/cli/generate-project.js.map +0 -1
  298. package/dist/cli/generate-sites.d.ts +0 -8
  299. package/dist/cli/generate-sites.d.ts.map +0 -1
  300. package/dist/cli/generate-sites.js +0 -273
  301. package/dist/cli/generate-sites.js.map +0 -1
  302. package/dist/cli/generate.d.ts +0 -20
  303. package/dist/cli/generate.d.ts.map +0 -1
  304. package/dist/cli/generate.js +0 -299
  305. package/dist/cli/generate.js.map +0 -1
  306. package/dist/cli/harness.d.ts +0 -3
  307. package/dist/cli/harness.d.ts.map +0 -1
  308. package/dist/cli/harness.js +0 -214
  309. package/dist/cli/harness.js.map +0 -1
  310. package/dist/cli/main.d.ts +0 -3
  311. package/dist/cli/main.d.ts.map +0 -1
  312. package/dist/cli/main.js +0 -77
  313. package/dist/cli/main.js.map +0 -1
  314. package/dist/cli/skills.d.ts +0 -3
  315. package/dist/cli/skills.d.ts.map +0 -1
  316. package/dist/cli/skills.js +0 -128
  317. package/dist/cli/skills.js.map +0 -1
  318. package/dist/cloudflare.d.ts +0 -2
  319. package/dist/cloudflare.d.ts.map +0 -1
  320. package/dist/cloudflare.js +0 -2
  321. package/dist/cloudflare.js.map +0 -1
  322. package/dist/codegen/emitMantleModule.d.ts +0 -22
  323. package/dist/codegen/emitMantleModule.d.ts.map +0 -1
  324. package/dist/codegen/emitMantleModule.js +0 -291
  325. package/dist/codegen/emitMantleModule.js.map +0 -1
  326. package/dist/codegen.d.ts +0 -2
  327. package/dist/codegen.d.ts.map +0 -1
  328. package/dist/codegen.js +0 -2
  329. package/dist/codegen.js.map +0 -1
  330. package/dist/runtime-testing.d.ts +0 -2
  331. package/dist/runtime-testing.d.ts.map +0 -1
  332. package/dist/runtime-testing.js +0 -2
  333. package/dist/runtime-testing.js.map +0 -1
  334. package/dist/runtime.d.ts +0 -2
  335. package/dist/runtime.d.ts.map +0 -1
  336. package/dist/runtime.js +0 -2
  337. package/dist/runtime.js.map +0 -1
  338. package/dist/spec.d.ts +0 -2
  339. package/dist/spec.d.ts.map +0 -1
  340. package/dist/spec.js +0 -2
  341. package/dist/spec.js.map +0 -1
  342. package/dist/vercel-libsql.d.ts +0 -2
  343. package/dist/vercel-libsql.d.ts.map +0 -1
  344. package/dist/vercel-libsql.js +0 -2
  345. package/dist/vercel-libsql.js.map +0 -1
  346. package/dist/vercel.d.ts +0 -2
  347. package/dist/vercel.d.ts.map +0 -1
  348. package/dist/vercel.js +0 -2
  349. package/dist/vercel.js.map +0 -1
  350. package/dist/web.d.ts +0 -2
  351. package/dist/web.d.ts.map +0 -1
  352. package/dist/web.js +0 -2
  353. package/dist/web.js.map +0 -1
  354. package/docs/adapter-guide.md +0 -222
  355. package/docs/adr/0001-four-atom-manifest-model.md +0 -440
  356. package/docs/adr/0002-closed-enums-for-bindings.md +0 -253
  357. package/docs/adr/0007-ai-as-primary-author.md +0 -473
  358. package/docs/adr/0008-structured-diagnostic-shape.md +0 -338
  359. package/docs/adr/0009-consumer-supplied-manifests.md +0 -149
  360. package/docs/adr/0010-locale-and-translates.md +0 -453
  361. package/docs/adr/0011-adapter-port-spec.md +0 -281
  362. package/docs/adr/0012-views-as-public-rest.md +0 -161
  363. package/docs/adr/0013-agent-provisioned-consumer-projects.md +0 -154
  364. package/docs/adr/0014-auth-better-auth-and-multi-tenant-mcp.md +0 -900
  365. package/docs/adr/0016-site-semantic-layer.md +0 -70
  366. package/docs/adr/0017-media-multi-variant-agent-side-optimization.md +0 -181
  367. package/docs/adr/0018-core-starters-repository-boundary.md +0 -179
  368. package/docs/adr/0019-sealed-manifest-runtime-pipeline.md +0 -240
  369. package/docs/adr/0020-builtin-handler-contracts-and-matched-upsert.md +0 -199
  370. package/docs/adr/0021-retire-starter-scaffolding.md +0 -30
  371. package/docs/adr/0022-caller-observed-version-occ.md +0 -212
  372. package/docs/adr/0023-port-failure-contract.md +0 -69
  373. package/docs/adr/0024-manifest-native-schema-tables.md +0 -264
  374. package/docs/adr/0025-reserved-native-columns-and-published-only-public-views.md +0 -105
  375. package/docs/adr/0026-progressive-generate.md +0 -36
  376. package/docs/adr/0027-scheduled-procedure-triggers.md +0 -31
  377. package/docs/adr/0028-schema-ttl-expiry.md +0 -33
  378. package/docs/adr/README.md +0 -81
  379. package/docs/adr/adr-lite-803-request-diagnostics.md +0 -38
  380. package/docs/adr/adr-lite-808-route-readiness.md +0 -47
  381. package/docs/adr/adr-lite-809-bounded-public-content.md +0 -71
  382. package/docs/adr/adr-lite-812-native-parity.md +0 -150
  383. package/docs/adr/adr-lite-823-home-statistics.md +0 -64
  384. package/docs/adr/adr-lite-842-mcp-authoring.md +0 -30
  385. package/docs/adr/adr-lite-845-frontend-client.md +0 -38
  386. package/docs/adr/adr-lite-861-admin-webmcp.md +0 -42
  387. package/docs/adr/adr-lite-909-admin-ui-kit.md +0 -37
  388. package/docs/agent-prompts.md +0 -64
  389. package/docs/api-mcp-authorization.md +0 -5
  390. package/docs/assets/mantle-admin-developer.png +0 -0
  391. package/docs/assets/mantle-admin-operations.png +0 -0
  392. package/docs/assets/mantle-hero.jpg +0 -0
  393. package/docs/auth-hosting-model.md +0 -166
  394. package/docs/cloudflare-low-level-composition.md +0 -5
  395. package/docs/consumer-onboarding-audit.md +0 -65
  396. package/docs/deferred-lifecycle-queues.md +0 -5
  397. package/docs/design-atoms.md +0 -16
  398. package/docs/design-references/editorial-blog-2026-05-05.md +0 -218
  399. package/docs/direct-authoring.md +0 -5
  400. package/docs/examples/builtin-commerce.md +0 -269
  401. package/docs/examples/builtin-intake.md +0 -143
  402. package/docs/examples/builtin-legal-documents.md +0 -189
  403. package/docs/examples/builtin-procurement.md +0 -241
  404. package/docs/examples/builtin-publication.md +0 -241
  405. package/docs/examples/builtin-reservation.md +0 -149
  406. package/docs/examples/cf-primitives-commerce-inventory.md +0 -809
  407. package/docs/examples/cf-primitives-guarded-api.md +0 -429
  408. package/docs/examples/cf-primitives-intake-hooks.md +0 -319
  409. package/docs/examples/host-chatgpt-sites/.openai/hosting.json +0 -1
  410. package/docs/examples/host-chatgpt-sites/README.md +0 -70
  411. package/docs/examples/host-chatgpt-sites/drizzle/0000_sites_users.sql +0 -8
  412. package/docs/examples/host-chatgpt-sites/drizzle/0001_mantle.sql +0 -294
  413. package/docs/examples/host-chatgpt-sites/drizzle/0002_article_cover.sql +0 -5
  414. package/docs/examples/host-chatgpt-sites/drizzle/0003_store_instance_id.sql +0 -1
  415. package/docs/examples/host-chatgpt-sites/drizzle/0004_mantle.sql +0 -10
  416. package/docs/examples/host-chatgpt-sites/drizzle/0005_mantle.sql +0 -24
  417. package/docs/examples/host-chatgpt-sites/drizzle/meta/_journal.json +0 -1
  418. package/docs/examples/host-chatgpt-sites/drizzle/meta/mantle-state.json +0 -60
  419. package/docs/examples/host-chatgpt-sites/manifests/site.yaml +0 -27
  420. package/docs/examples/host-chatgpt-sites/package.json +0 -1
  421. package/docs/examples/host-chatgpt-sites/public/site.css +0 -1
  422. package/docs/examples/host-chatgpt-sites/scripts/build.mjs +0 -13
  423. package/docs/examples/host-chatgpt-sites/scripts/check.mjs +0 -101
  424. package/docs/examples/host-chatgpt-sites/scripts/migration.mjs +0 -43
  425. package/docs/examples/host-chatgpt-sites/src/chatgpt-auth.ts +0 -66
  426. package/docs/examples/host-chatgpt-sites/src/index.ts +0 -46
  427. package/docs/examples/host-chatgpt-sites/src/mcp.ts +0 -49
  428. package/docs/examples/host-chatgpt-sites/src/media.ts +0 -109
  429. package/docs/examples/host-chatgpt-sites/src/r2-lab.ts +0 -38
  430. package/docs/examples/host-chatgpt-sites/src/storage-fingerprint.json +0 -1
  431. package/docs/examples/host-chatgpt-sites/src/web.ts +0 -35
  432. package/docs/examples/host-chatgpt-sites/tsconfig.json +0 -1
  433. package/docs/examples/host-chatgpt-sites/wrangler.jsonc +0 -10
  434. package/docs/examples/host-local-admin-otp/.dev.vars.example +0 -3
  435. package/docs/examples/host-local-admin-otp/README.md +0 -80
  436. package/docs/examples/host-local-admin-otp/ensure-dev-vars.mjs +0 -5
  437. package/docs/examples/host-local-admin-otp/manifests/site.yaml +0 -25
  438. package/docs/examples/host-local-admin-otp/package.json +0 -29
  439. package/docs/examples/host-local-admin-otp/public/.gitkeep +0 -1
  440. package/docs/examples/host-local-admin-otp/smoke.mjs +0 -141
  441. package/docs/examples/host-local-admin-otp/src/index.ts +0 -54
  442. package/docs/examples/host-local-admin-otp/tsconfig.json +0 -17
  443. package/docs/examples/host-local-admin-otp/wrangler.jsonc +0 -23
  444. package/docs/examples/host-minimal-worker/README.md +0 -41
  445. package/docs/examples/host-minimal-worker/manifests/site.yaml +0 -25
  446. package/docs/examples/host-minimal-worker/package.json +0 -26
  447. package/docs/examples/host-minimal-worker/smoke.mjs +0 -23
  448. package/docs/examples/host-minimal-worker/src/index.ts +0 -4
  449. package/docs/examples/host-minimal-worker/tsconfig.json +0 -17
  450. package/docs/examples/host-minimal-worker/wrangler.jsonc +0 -22
  451. package/docs/handbook/chatgpt-sites/equipment-checkout.md +0 -231
  452. package/docs/handbook/chatgpt-sites/generated-app.md +0 -84
  453. package/docs/handbook/chatgpt-sites/host-reference.md +0 -113
  454. package/docs/handbook/chatgpt-sites/index.md +0 -133
  455. package/docs/handbook/cloudflare/bindings.md +0 -291
  456. package/docs/handbook/cloudflare/conventional-worker.md +0 -166
  457. package/docs/handbook/cloudflare/deferred-hooks-queues.md +0 -170
  458. package/docs/handbook/cloudflare/low-level-composition.md +0 -169
  459. package/docs/handbook/cloudflare/public-web.md +0 -144
  460. package/docs/handbook/cloudflare/site-chrome.md +0 -75
  461. package/docs/handbook/examples/commerce-transaction.md +0 -11
  462. package/docs/handbook/examples/commerce.md +0 -11
  463. package/docs/handbook/examples/guarded-api.md +0 -10
  464. package/docs/handbook/examples/intake-form.md +0 -12
  465. package/docs/handbook/examples/intake-hooks.md +0 -11
  466. package/docs/handbook/examples/legal-documents.md +0 -10
  467. package/docs/handbook/examples/procurement-approvals.md +0 -10
  468. package/docs/handbook/examples/publication.md +0 -10
  469. package/docs/handbook/examples/reservation.md +0 -10
  470. package/docs/handbook/start/quickstart-admin.md +0 -52
  471. package/docs/labels.md +0 -71
  472. package/docs/media-uploads.md +0 -5
  473. package/docs/migration-0.1.2.md +0 -13
  474. package/docs/performance-harness.md +0 -228
  475. package/docs/release-process.md +0 -244
  476. package/docs/schema-indexes.md +0 -5
  477. package/docs/sealed-pipeline-ownership.md +0 -101
  478. package/docs/skills/plugin/SKILL.md +0 -132
  479. package/docs/skills/theme/SKILL.md +0 -77
  480. package/docs/spec-only-host-adoption.md +0 -157
  481. package/docs/transaction-patterns.md +0 -5
  482. package/skills/develop/SKILL.md +0 -258
  483. package/skills/install/SKILL.md +0 -112
  484. package/skills/integrate/SKILL.md +0 -60
  485. package/skills/media-gc/SKILL.md +0 -85
  486. package/skills/plugin/SKILL.md +0 -132
  487. package/skills/provision/SKILL.md +0 -194
  488. package/skills/theme/SKILL.md +0 -77
  489. package/skills/update/SKILL.md +0 -51
  490. package/templates/chatgpt-sites/auth.ts +0 -66
  491. package/templates/chatgpt-sites/build.mjs +0 -14
  492. package/templates/chatgpt-sites/env.ts +0 -1
  493. package/templates/chatgpt-sites/mcp.ts +0 -48
  494. package/templates/chatgpt-sites/public-mcp.ts +0 -29
  495. package/templates/chatgpt-sites/smoke-local.mjs +0 -20
package/README.md CHANGED
@@ -1,319 +1,187 @@
1
- # @aotter/mantle
2
-
3
- Umbrella entry for the embeddable Mantle SDK — a manifest-driven application
4
- engine built around a 4-atom YAML model (Schema / View / Procedure / Trigger)
5
- where agents write config and the runtime carries the complexity.
6
-
7
- > Mantle's first stable release is `0.1.2`. Use this package's `package.json`
8
- > as the exact installed version.
9
-
10
- ## Install
11
-
12
- An agent can install the small bootstrap skill:
1
+ # Mantle
2
+
3
+ Mantle is an agent-native application SDK and backend compiler. Declare Schemas, Views, Procedures and Triggers in
4
+ YAML manifests; `mantle generate` compiles them at build time into native SQL and typed TypeScript for SQLite (Bun or
5
+ Cloudflare D1) and PostgreSQL (Bun or Cloudflare Workers). The compiler adds row policy to every query, and the closed v2
6
+ grammar reports actionable diagnostics. Your app keeps its own entry, routes and auth; Mantle adds only the surfaces
7
+ you select: REST, MCP, a web module, Better Auth sign-in and the native Admin.
8
+
9
+ **Start here:** `npx mantle help` prints the installed docs one topic at a time. `mantle init <directory>` writes a
10
+ complete app shell once (email OTP, `admin` + `user`, Admin, MCP, REST); [examples](./docs/examples/README.md) show
11
+ how to combine stock, own-records, approvals, callbacks, public pages and email into it.
12
+
13
+ Three packages: `@aotter/mantle` is the SDK with bin `mantle`; `@aotter/mantle-ui` is pure UI without an SDK dependency; `@aotter/mantle-admin` is the optional product with the SDK as a peer. Use matching installed versions and their own docs.
14
+
15
+ Select `--admin` / `admin: true` for [Native Admin](./docs/handbook/guides/native-admin.md).
16
+ Its generated adapter mounts with `entries(bindings.schemas, bindings.adapter)`;
17
+ shared read templates and generated Procedure fragments preserve the native
18
+ row policy and checks without importing generic Store into initial Admin reads.
19
+
20
+ Build and contributor checks: [CONTRIBUTING](https://github.com/aotter/mantle/blob/develop/CONTRIBUTING.md).
21
+
22
+ Outputs include `generated.ts`, `schema.sql` and direct operation entries.
23
+ Commit generated output and Wrangler edits; keep `dist/` untracked. Run the same
24
+ generate command with `--check` in CI. Never hand-edit generated files; merge
25
+ manifest/options changes and regenerate. See [service composition](./docs/handbook/cloudflare/service-entry.md)
26
+ for app-owned routing, assets, scheduling, Bun and the generated-output workflow.
27
+ Import `views/<encoded-name>.ts` or `procedures/<encoded-name>.ts` (default export
28
+ and types) to exclude other operations. Apply initial DDL to an empty development
29
+ database; it is not a production migration. Generation performs no database I/O.
30
+ Call `views[name](db, caller, input)` or `procedures[name](db, caller, input)` with
31
+ driver-ready inputs, a native handle (Bun.SQL, bun:sqlite Database or D1 binding)
32
+ and a verified Caller.
33
+
34
+ Validate untrusted input before calling queries and redact native errors at application
35
+ transports. The [query contract](./docs/handbook/guides/native-execution.md#query-inputs-values-and-outcomes)
36
+ defines driver-ready inputs, native results, date-time/date wire forms and failure handling.
37
+
38
+ For transports, `paged/views/<name>.ts` returns `{ rows, nextCursor? }` with keyset paging and
39
+ `validation/<kind>/<name>.ts` checks input against the declared JSON Schema subset; the
40
+ [surface deltas](./docs/handbook/reference/surface.md) define the REST/MCP wire contract.
41
+ Proved internal Views also get paging without a public route/tool: one SELECT
42
+ per page, validated scalar cursor keys and hidden-key removal. Schema tuples
43
+ need indexed order after fixed equality prefixes ([index prefixes](./docs/handbook/reference/schema.md#index-prefixes-for-paged-views)); complete groups and singleton
44
+ joins are supported. Grouping still scans/aggregates its source: inspect EXPLAIN.
45
+ Unsupported internal SQL retains its bare module.
46
+
47
+ Every Schema is a typed **Store** collection:
48
+ `store(db, caller).collection("purchase_requests")` with `findById`, `find` (AND-only `where`, `{ rows, cursor }` keyset pages), `first`,
49
+ `count`, `insert(values)`, OCC `update(id, set, { lock })` and `delete(id, { lock })`. Rows, `where`, `set` and `orderBy` use the
50
+ table's storage column names, lower-case (`requestnumber`, `created_at`), the keys a generated View returns; the generated types
51
+ state column names, value types and the writable columns, and the Store enforces the Schema's row rules (scope, TTL, version) but
52
+ **not** a View's or Procedure's `requires`: authorize before calling it. Design, limits and what the runtime still refuses are in
53
+ [Store guide](./docs/handbook/guides/typed-queries.md).
54
+
55
+ For simple creates and partial updates, prefer a declared Store-backed ref
56
+ Procedure: await the caller-bound insert/update, return an allowlist with the
57
+ actual returned `id`/`version`, and preserve omitted fields. Keep Procedure
58
+ `requires` and boundary validation; Store row policy is not operation
59
+ permission. Retain SQL Procedures for atomic conditional/multi-entity writes
60
+ such as stock/order changes and additive upserts. D1 batches cannot consume a
61
+ prior step's result and have no interactive transaction callback. See the
62
+ [write design guidance](./docs/handbook/guides/typed-queries.md#prefer-store-backed-ref-procedures-for-simple-writes).
63
+
64
+ Importing generated modules does not initialize the Store. The first `store()`
65
+ call prepares its metadata factory once; every call binds its own database,
66
+ Caller and handlers. Unused Stores still tree-shake out of direct operations.
67
+
68
+ `find({ search: "text" })` and `first({ search: "text" })` match an exact id or
69
+ the Schema's `searchableFields`. Search is trimmed, must be non-empty and cannot contain NUL; it
70
+ combines with `where`, scope, TTL and publication rules. SQLite/D1 use the
71
+ generated FTS5 trigram index with maintenance triggers (queries shorter than
72
+ three characters use LIKE); PostgreSQL uses ILIKE without requiring an extension.
73
+ `%`, `_`, quotes and FTS operators are literal text. Schemas without search fields
74
+ match id only. Non-ASCII case folding follows the dialect: SQLite/D1 FTS5
75
+ trigram folds searchable text for queries of three or more characters, while
76
+ shorter SQLite/D1 LIKE queries fold ASCII only; PostgreSQL ILIKE follows the
77
+ database locale/collation. These are the same native differences as 0.2.
78
+ Generated Views reuse Core's `mantle.search(alias, input.q)` and
79
+ `mantle.search_rank(alias)`; ranking requires search on the same alias/query.
80
+ Rank-ordered exposed Views still need supported keyset ordering; use an internal
81
+ View for arbitrary rank ordering. Applying changed search DDL remains the app's
82
+ migration responsibility; no request runs DDL or rebuilds indexes.
83
+
84
+ ## Independently accept user-facing work
85
+
86
+ Before reporting any user-facing deliverable as done, follow the version-matched
87
+ [independent acceptance guide](./docs/handbook/guides/agent-workflow-acceptance.md)
88
+ with a fresh agent on the surface its user uses. For MCP work, also run the
89
+ guide's design audit before implementing tools; scripted checks remain separate
90
+ evidence.
91
+
92
+ ## Publishing
93
+
94
+ Schemas default to `lifecycle: operational`. Opt-in `lifecycle: publishing` adds status
95
+ (`draft` default, `published`, `archived`), nullable `published_at` and a scope-aware
96
+ `(published_at, id)` index; `published_at` is selectable in Views and orders Store `find`
97
+ (`NULLS LAST`). Generated `<table>.publish`, `.unpublish` and `.archive` Procedures take
98
+ `{ id, expectedVersion }`, gate admin/system callers and run one atomic UPDATE; a failed guard is
99
+ `CONFLICT`. Store writes cannot set status or `published_at`. Public Views see published rows only;
100
+ other reads expose drafts only to admin or system callers.
101
+
102
+ ## Ref Procedures
103
+
104
+ A Procedure with a `ref` handler generates a typed `Handlers` interface. `mantle generate` lists the
105
+ handlers to implement; pass them at `store(db, caller, { handlers })` (required by type when the
106
+ manifest declares ref Procedures) and run `tsc --noEmit`. A handler receives `{ caller, db, store }`
107
+ bound to the same caller and transaction; the exported `procedures` map holds SQL Procedures only.
108
+
109
+ ## Workers build
110
+
111
+ In an application, run generation:
13
112
 
14
113
  ```sh
15
- npx skills add aotter/mantle
16
- ```
17
-
18
- For a new application, resolve one published stable version and install it
19
- exactly. `mantle generate` will declare matching selected packages:
20
-
21
- ```bash
22
- MANTLE_VERSION=$(npm view @aotter/mantle@latest version)
23
- npm install --save-exact "@aotter/mantle@$MANTLE_VERSION"
24
- ```
25
-
26
- ## What's inside
27
-
28
- The umbrella provides Spec and Runtime by default. Install an optional package
29
- before importing its matching Web, Admin, Auth, Bun, Vercel, Cloudflare, or Admin UI
30
- subpath. Every sub-package also remains directly installable.
31
-
32
- | Subpath | Re-exports |
33
- |---|---|
34
- | `@aotter/mantle/spec` (or root) | Manifest grammar, validators, JSON-Schema→Zod, diagnostic catalog (no env / no IO) |
35
- | `@aotter/mantle/runtime` | Hexagonal runtime: domain ports, use cases, infrastructure helpers (no adapter deps) |
36
- | `@aotter/mantle/runtime/testing` | Node-only crowded SQLite planner and HTTP sampling helpers |
37
- | `@aotter/mantle/codegen` | Pure linked manifests or compiled plan → typed runtime module emitter (no IO) |
38
- | `@aotter/mantle/web` | Optional HTML, Markdown, `llms.txt`, sitemap, SEO, and preview composition (no routes or platform deps) |
39
- | `@aotter/mantle/admin` | Optional Admin API, auth routes, and static-asset composition |
40
- | `@aotter/mantle/auth` | Optional host-neutral Better Auth identity; adapters own IP headers and storage bindings |
41
- | `@aotter/mantle/bun` | Bun adapter — caller-owned `bun:sqlite` and Web-standard View/Trigger transport |
42
- | `@aotter/mantle/vercel` | Vercel Functions adapter — injected durable storage and platform `waitUntil` |
43
- | `@aotter/mantle/vercel/libsql` | Optional application-owned Turso/libSQL driver |
44
- | `@aotter/mantle/cloudflare` | Cloudflare Workers adapter — D1, Workers Cache, R2, and Better Auth 1.7 MCP/CIMD |
45
- | `@aotter/mantle/admin-ui` | Pre-built React 19 admin SPA bundle |
46
-
47
- ```ts
48
- import { linkManifestSet, parseManifestSources } from "@aotter/mantle/spec";
49
- import { bootMantleRuntime, compileRuntimePlan } from "@aotter/mantle/runtime";
50
- import { createMantleWeb } from "@aotter/mantle/web";
51
- import { mountRuntimeEndpoints } from "@aotter/mantle/cloudflare";
52
- ```
53
-
54
- The umbrella installs only Spec and Runtime. Web, Admin, Auth, Admin UI, Bun,
55
- Vercel, and Cloudflare are optional peers; install only the subpaths selected
56
- by the application.
57
-
58
- The package also installs `mantle` and `mantle-harness`:
59
-
60
- ```bash
61
- pnpm exec mantle generate
62
- pnpm exec mantle generate --check
63
- pnpm exec mantle skills
64
- pnpm exec mantle skills --check
65
- pnpm exec mantle-harness indexes --require-public
66
- pnpm exec mantle-harness http --base-url http://127.0.0.1:8787 --route page=/en/example
67
- ```
68
-
69
- `mantle generate --host cf` or `--host chatgpt-sites` assembles a new blank
70
- app with Spec, Runtime, API, MCP, Admin and Web by default. Use `--features`
71
- to select a smaller set, including host-free Spec-only. The first run declares
72
- matching optional dependencies; install them, then rerun. In an existing
73
- direct-authored app, `generate` keeps its compile behavior: validate
74
- `./manifests/` and write `.mantle/generated/mantle.ts`. Selected Admin syncs
75
- its prebuilt SPA to `public/_mantle/admin/`. Generation does not deploy.
76
- The same pure emitter is available from `@aotter/mantle/codegen` when a host
77
- wants to own parsing and filesystem IO. TypeScript-authored manifests can pass
78
- their already-compiled `plan` directly:
79
-
80
- ```ts
81
- import { emitMantleModule } from "@aotter/mantle/codegen";
82
-
83
- const emitted = emitMantleModule({ plan });
84
- if (!emitted.ok) throw new Error(emitted.diagnostics.map(({ message }) => message).join("\n"));
85
- ```
86
-
87
- ```ts
88
- import { createMantle } from "../.mantle/generated/mantle.js";
89
-
90
- const mantle = await createMantle({ storage, handlers, ports });
91
- const notes = await mantle.views.publishedNotes();
92
- const result = await mantle.procedures.expireOrder(
93
- { orderId },
94
- { user: null, staff: null, env },
95
- );
96
- await mantle.entries.orders.createDraft({ data, authorId: user.id });
97
-
98
- // The typed projection never hides the underlying Core runtime.
99
- await mantle.runtime.archive.execute({ id: noteId, ctx });
114
+ pnpm exec mantle generate cloudflare-d1 generated manifests/*.yaml --auth src/auth.ts
115
+ pnpm exec wrangler deploy
116
+ # or: pnpm exec wrangler dev --local
100
117
  ```
101
118
 
102
- Generated property names are deterministic lower-camel identifiers; calls keep
103
- the authored wire names internally. `createMantle()` eagerly prepares once and
104
- does not cache or retry. Dynamic and platform hosts can keep their own lifecycle,
105
- use generated `bindMantle(runtime)`, or skip code generation and call
106
- `runtime.executeView({ view: "published-notes" })` directly.
107
-
108
- Start with [Project layout and CLI](docs/handbook/start/project-and-cli.md).
109
- The [local Admin OTP](docs/handbook/start/quickstart-admin.md) tutorial remains
110
- for apps that own their Worker entry. Generated apps start with an editable
111
- blank home and no invented business Schema.
119
+ For `cloudflare-d1` and `cloudflare-postgres`, generation configures Wrangler to run
120
+ `mantle bundle <entry> <outdir>` automatically. Node 22.22 or newer is required. Run from the project root;
121
+ regenerate after manifest or auth option changes.
112
122
 
113
- `mantle skills` copies every skill the installed package marks
114
- `projection: project` in its front matter into matching
115
- `.agents/skills/mantle-*` and `.claude/skills/mantle-*` paths — no list of
116
- skill names is maintained anywhere else. Skills that act destructively or
117
- target one platform stay out of that set and are opt-in. Both tool layouts
118
- receive identical bytes; `--check` detects drift without writing. An older
119
- project may also carry `.agent/skills/`, which is left untouched. Manifest
120
- generation never rewrites agent instructions.
123
+ `--entry` defaults to `src/worker.ts`, `--outdir` to `dist`; with `--admin`, `--assets` (Wrangler's `assets.directory`) defaults to `<outdir>/client`. `--wrangler` defaults to the
124
+ existing `wrangler.jsonc`, `wrangler.json` or `wrangler.toml`, otherwise `wrangler.jsonc`.
125
+ JSONC edits preserve comments and unrelated settings and are idempotent. A new config
126
+ needs its `name`, `compatibility_date` and bindings filled in. TOML only prints instructions.
121
127
 
122
- SDK upgrades use the package manager and the version-matched update skill.
123
- For npm peer-resolution troubleshooting, see [the authoring guide](docs/handbook/start/project-and-cli.md).
124
- See [Releases](docs/handbook/releases/index.md) for what each stable version
125
- contains and what it requires.
128
+ esbuild emits minified split ESM into `<outdir>/worker`; Wrangler uploads it with `no_bundle`,
129
+ `find_additional_modules`, `base_dir` and an ESModule rule. Generation ensures
130
+ `nodejs_compat` and defaults to `global_fetch_strictly_public`, including explicit
131
+ environment flag overrides; see [Workers deployment](./docs/handbook/cloudflare/deploy-and-operate.md).
132
+ The metafile guard rejects `better-auth` / `@better-auth/*` in the static startup graph:
133
+ use `authLoader(() => import(...))` ([Auth](./docs/handbook/cloudflare/authentication.md#worker-entry)).
134
+ The Worker directory is cleaned first; keep source and generated code elsewhere. A Worker that imports
135
+ `@aotter/mantle-admin/server` also gets Admin, built with Vite into `<assets>/admin` (default `<outdir>/client/admin`)
136
+ from `admin.tsx` beside the entry or the built-in entry. The built-in entry is skipped while the installed
137
+ Admin and its direct dependencies are unchanged; an `admin.tsx` entry builds every time.
126
138
 
127
- ## Conventional Cloudflare Worker
139
+ ## D1 Sessions
128
140
 
129
- The normal Worker entry delegates Core-owned assembly to the SDK:
141
+ D1's session handle already satisfies generated Views/Procedures and the Store's structural `db` type:
130
142
 
131
143
  ```ts
132
- import { createMantleWorker } from "@aotter/mantle/cloudflare";
133
- import { plan } from "../.mantle/generated/mantle.js";
134
-
135
- export default createMantleWorker({ plan });
136
- ```
137
-
138
- `createMantleWorker` owns conventional D1/assets bindings, Auth, Admin,
139
- manifest REST/HTTP routes, OAuth, MCP, cache safety, and rejection-safe
140
- per-isolate boot. Use its single `extend` seam for application handlers and
141
- new Hono routes; use the public low-level exports when the deployment does not
142
- fit the conventional binding or lifecycle contract.
143
-
144
- Conventional Auth requires an explicit `MANTLE_AUTH_MODE`: `self-managed`
145
- uses the site's GitHub OAuth credentials, while `hosted` uses a same-origin
146
- Mantle Hosted Auth PKCE client. Missing, invalid, partial, or mixed-mode
147
- configuration keeps public routes available but returns `503 setup_incomplete`
148
- from Auth-owned private routes. Pass `auth: (env) => Auth` only when the site
149
- needs to replace this conventional factory; Core still owns the Auth routes.
150
- The exact bindings and validation rules are in the
151
- `node_modules/@aotter/mantle-cloudflare/README.md`, under “Conventional Auth”
152
- (path relative to the application root).
153
-
154
- Extensions may add routes but may not replace Core surfaces. These paths are
155
- reserved:
156
-
157
- - `/admin` and `/admin/*`
158
- - `/_mantle` and `/_mantle/*`
159
- - `/api/auth` and `/api/auth/*`
160
- - `/api/views` and `/api/views/*`
161
- - `/oauth` and `/oauth/*`
162
- - `/mcp` and `/mcp/*`
163
- - `/.well-known/oauth*`
164
- - global `*` and `/*` handlers
165
-
166
- A custom Auth factory's `basePath` and exact manifest-owned method/path pairs
167
- are also reserved at assembly. Static literal conflicts fail TypeScript during
168
- the consumer build. Computed paths cannot be proven statically, so the facade
169
- checks Hono's assembled route table and fails closed before serving requests.
170
- There is no standard-route override option.
171
-
172
- Cloudflare projects may expose an independently installed Admin bundle and the
173
- application's own frontend assets through one native binding:
174
-
175
- ```toml
176
- [assets]
177
- directory = "./public"
178
- binding = "ASSETS"
179
- ```
180
-
181
- Declare browser, Admin, and MCP identity once. Multiple renditions are allowed;
182
- keep SVG as the source and add PNG renditions when a target MCP client requires
183
- the baseline raster formats:
184
-
185
- ```ts
186
- siteDefaults: {
187
- icons: [
188
- { src: "/site-icon.png", mimeType: "image/png", sizes: ["64x64"] },
189
- { src: "/site-icon.svg", mimeType: "image/svg+xml", sizes: ["any"] },
190
- ],
191
- }
192
- ```
193
-
194
- Keep both files in the project's `public/` directory. They are one site
195
- identity reused by browser favicons, Admin chrome, and MCP `serverInfo.icons`;
196
- PNG is the compatibility rendition and SVG remains the editable source.
197
-
198
- For an uncommon deployment that must own the top-level assembly, use the
199
- embedded [`docs/handbook/cloudflare/low-level-composition.md`](docs/handbook/cloudflare/low-level-composition.md)
200
- fixture. It composes the same public primitives without importing package
201
- internals or rebuilding Mantle's adapters.
202
-
203
- ## Getting started
204
-
205
- Cold start from GitHub or a marketplace host:
206
-
207
- ```sh
208
- npx skills add aotter/mantle
144
+ const bookmark = request.headers.get("x-d1-bookmark");
145
+ const session = env.DB.withSession(bookmark ?? "first-unconstrained");
146
+ const rows = await views.catalog(session, caller, {});
147
+ const data = store(session, caller); // use the same handle for Store operations
148
+ return Response.json(rows, { headers: { "x-d1-bookmark": session.getBookmark() ?? "" } });
209
149
  ```
210
150
 
211
- That skill interviews, pins this package, then uses the CLI and the
212
- [direct-authoring guide](docs/handbook/start/project-and-cli.md).
213
- The owner or agent writes the application's manifests, entry and configuration;
214
- `generate` compiles them and `skills` projects the version-matched instructions.
215
- The [minimal Worker reference](docs/examples/host-minimal-worker/README.md) is
216
- the embed / adapter path without Admin. The
217
- [local Admin OTP reference](docs/examples/host-local-admin-otp/README.md) is the
218
- opt-in Dev UI path. Neither is a scaffold command. Admin is optional.
151
+ Return `session.getBookmark()` in a header or cookie and have the client pass it back on the next request.
152
+ Keep `resolveCaller` and Better Auth on `env.DB`: revocation and roles must read the primary.
153
+ Enable [read replication](https://developers.cloudflare.com/d1/best-practices/read-replication/)
154
+ on the database (dashboard or REST); writes always go to the primary.
219
155
 
220
- ## Agent marketplace install
156
+ ## Store transactions
221
157
 
222
- Install the Mantle Core skill bundle before authoring or maintaining a
223
- consumer application. The canonical command is:
158
+ Writes are lazy thenables: await `collection.insert/update/delete(...)` to execute once,
159
+ or pass unused Writes from the same Store to `store.batch([...])` for atomic results in input order;
160
+ a stale lock, excluded row or unique clash rolls back the whole batch with `CONFLICT`.
161
+ A batch step cannot use a previous step's result. D1 supports only batch.
162
+ On bun:sqlite and PostgreSQL, `store.transaction(async tx => { ... })` binds `collection`, `views`
163
+ and `procedures` to one transaction: resolve commits, throw rolls back; nested transactions and `tx.batch` are refused.
164
+ PostgreSQL defaults to serializable; `{ isolation: "read committed" }` selects another level. There is no automatic retry.
165
+ SQLite uses BEGIN IMMEDIATE and queues all Store/generated driver calls on the same Database until COMMIT/ROLLBACK;
166
+ Inside a transaction callback the outer Store or handle passed to a Mantle driver throws `INPUT_VALIDATION_FAILED`; use `tx`.
224
167
 
225
- ```sh
226
- npx skills add aotter/mantle
227
- ```
228
-
229
- Claude Code and Codex can install the plugin, then run that skill:
168
+ Views return rows; Procedures return `{ results }`. See the [query contract](./docs/handbook/guides/native-execution.md#query-inputs-values-and-outcomes)
169
+ for atomicity and uncertain writes.
230
170
 
231
- ```bash
232
- # Claude Code
233
- /plugin marketplace add aotter/mantle
234
- /plugin install mantle@mantle
171
+ PostgreSQL handles (Bun.SQL, postgres.js) satisfy the two-method `Postgres` shape as they are; see the [contract](./docs/handbook/guides/native-execution.md).
172
+ Unsupported declarations fail generation with diagnostics;
173
+ see the [supported/refused list](./docs/handbook/reference/features.md) for current scope and planned features.
235
174
 
236
- # Codex
237
- codex plugin marketplace add aotter/mantle
238
- codex plugin add mantle@mantle
239
- ```
175
+ Native contributor checks run all four hosts with independent SQL oracles and
176
+ fresh PostgreSQL schemas; behavior follows each engine. Local Cloudflare checks
177
+ create no cloud resources. Performance claims need a quiet machine and raw samples.
178
+ The [size and startup gates](./docs/handbook/guides/size-and-startup.md) cover the
179
+ bundle and package budgets. The private compiler ships in this SDK and stays outside request imports.
240
180
 
241
- Cursor and VS Code Copilot can auto-discover the GitHub repo through
242
- `.cursor-plugin/plugin.json` and `.copilot-plugin/plugin.json` after the repo
243
- is cloned or opened. Still start from the `npx skills add` sentence (or open
244
- `skills/install/SKILL.md`). Untagged `aotter/mantle` resolves to `main`, which
245
- can contain a source-only hotfix ahead of the latest npm release. Add
246
- `@vX.Y.Z` only to reproduce an older project; never point a consumer at
247
- `develop` or another moving branch.
181
+ ## Data paths and migrations
248
182
 
249
- ## Marketplace capability installs
183
+ Writes use Store or declared Procedures, never raw SQL writes that bypass scope, TTL, publishing and system columns. Internal Views are for joins, aggregates, OR and reusable reads. Store findById/find/first remain useful for simple handler lookups and partial adoption in existing TypeScript/Node apps using their own native handle and verified Caller.
250
184
 
251
- In a consumer application, tell your coding agent:
252
-
253
- ```txt
254
- Use repo-local mantle:plugin to install <plugin slug or recipe URL> in this repo.
255
- Use repo-local mantle:plugin to update <plugin id> in this repo.
256
- Use repo-local mantle:plugin to remove <plugin id> from this repo.
257
- ```
185
+ The runtime never creates, alters or checks tables; boot and requests run no DDL. Apply initial schema.sql plus selected auth/site DDL to an empty database. For each later change, the app's agent diffs regenerated SQL, writes a native migration, rehearses it on a copy and applies it before deploying code. Destructive/type changes need explicit data migration; Mantle drops nothing.
258
186
 
259
- Mantle marketplace entries are agent-installable recipes. They declare the
260
- plugin source, Mantle version range, files/atoms/routes/tools, adapter
261
- requirements, secrets, and checks. The agent applies the recipe through the
262
- Core-owned `mantle:plugin` skill and records it in `.mantle/plugins.json` plus
263
- `.mantle/plugins.lock.json`. There is no `mantle plugin add` CLI yet.
264
-
265
- ## Adapter targets
266
-
267
- | Adapter | Status |
268
- |---|---|
269
- | Bun | ✅ shipping |
270
- | Vercel Functions (Node.js) | ✅ shipping |
271
- | Cloudflare Workers | ✅ shipping |
272
-
273
- The `mantle-runtime` package never imports platform-specific types — adapters
274
- bind concrete storage and lifecycle primitives to Core ports, so adding a new
275
- adapter is a port-implementation exercise, not a runtime refactor.
276
-
277
- ## Documentation
278
-
279
- - The handbook is the user documentation and ships inside this npm package:
280
- `node_modules/@aotter/mantle/docs/handbook/` (start, concepts, Cloudflare
281
- guides, example redirects, reference; `navigation.json` lists every page in order).
282
- Worked Manifests live in `node_modules/@aotter/mantle/docs/examples/`
283
- ([index](docs/examples/README.md)).
284
- The copy in `node_modules` describes the installed release.
285
- - Embedded docs and agent skills ship inside this npm package for
286
- agents working from the installed package:
287
- - `node_modules/@aotter/mantle/docs/handbook/reference/manifest.md`
288
- - `node_modules/@aotter/mantle/docs/examples/cf-primitives-guarded-api.md` (anonymous,
289
- API-key, paid guard, personal-token, OAuth, REST, and MCP examples)
290
- - `node_modules/@aotter/mantle/docs/handbook/cloudflare/media-r2.md` (Cloudflare R2 adapter recipe)
291
- - `node_modules/@aotter/mantle/docs/handbook/cloudflare/deferred-hooks-queues.md` (versioned
292
- Queue wiring, retry/DLQ, idempotency, and delivery guarantees)
293
- - `node_modules/@aotter/mantle/docs/handbook/reference/schema.md` (Schema grammar,
294
- ordered composite JSON-field indexes and the safe Procedure SQL helper)
295
- - `node_modules/@aotter/mantle/docs/performance-harness.md` (crowded SQLite,
296
- Wrangler-local D1 origin paths and coding-agent guardrails)
297
- - `node_modules/@aotter/mantle/docs/adr/`
298
- - `node_modules/@aotter/mantle/skills/develop/SKILL.md`
299
- - `node_modules/@aotter/mantle/skills/plugin/SKILL.md`
300
- - `node_modules/@aotter/mantle/skills/theme/SKILL.md`
301
- - `node_modules/@aotter/mantle/skills/update/SKILL.md`
302
- - `node_modules/@aotter/mantle/skills/install/SKILL.md`
303
- - `node_modules/@aotter/mantle/skills/provision/SKILL.md`
304
- - [4-atom manifest model (ADR-0001)](docs/adr/0001-four-atom-manifest-model.md)
305
- - [API and MCP authorization](docs/examples/cf-primitives-guarded-api.md)
306
- - [Deferred lifecycle Queues](docs/handbook/cloudflare/deferred-hooks-queues.md)
307
- - [Schema indexes on D1](docs/handbook/reference/schema.md)
308
- - [Release process](docs/release-process.md)
309
- - [Source repository](https://github.com/aotter/mantle)
310
- - [Issues](https://github.com/aotter/mantle/issues)
311
-
312
- ## License
313
-
314
- Apache-2.0
315
-
316
- Pure extension routes do not await content preparation. Before an extension
317
- uses Mantle data or database-backed Auth, await its supplied `getRuntime()`
318
- (or `ref.get()`). Standard protected routes establish this readiness themselves;
319
- queue/scheduled handlers continue to use `worker.getRuntime(env)`.
187
+ [Drivers are open structural handles; dialects are exactly postgres and sqlite](./docs/handbook/concepts/runtime-and-adapters.md#drivers-and-dialects).
@@ -0,0 +1,32 @@
1
+ import type { BetterAuthOptions } from "@better-auth/core";
2
+ import { type Postgres } from "../kernel/contracts.js";
3
+ import * as bunSql from "../kernel/driver/postgres.js";
4
+ import type { Reader } from "../kernel/driver/d1.js";
5
+ /** Runs one statement; `changes` is the affected-row count. */
6
+ type Exec = (text: string, values: unknown[], protectAdmin?: boolean) => ReturnType<typeof bunSql.run>;
7
+ /** Selected auth queries share this adapter's handle, dialect and Better Auth's physical model/field mapping. */
8
+ /** Better Auth's table and column names for these options (modelName/fieldName mapping); needs no database. */
9
+ export declare function authNames(options: BetterAuthOptions): {
10
+ table: (model: string) => string;
11
+ column: (model: string, field: string) => string;
12
+ has: (model: string, field: string) => boolean;
13
+ };
14
+ export declare function nativeAuthRead(options: BetterAuthOptions): {
15
+ table: (model: string) => string;
16
+ column: (model: string, field: string) => string;
17
+ has: (model: string, field: string) => boolean;
18
+ exec: Exec;
19
+ param(n: number): string;
20
+ now(ms: number): Date | string;
21
+ };
22
+ /** The slice of D1 the adapter calls (a real `D1Database` satisfies it). */
23
+ export type D1Like = Reader;
24
+ /** Cloudflare D1 (SQLite). D1 has no interactive transactions, so `transaction` is off and the atomic operations are single statements. */
25
+ export declare function d1Adapter(db: D1Like): (options: BetterAuthOptions) => import("better-auth").DBAdapter<BetterAuthOptions>;
26
+ /**
27
+ * PostgreSQL through Bun.SQL or postgres.js (the `Postgres` contract the data layer uses). Transactions use `begin`,
28
+ * which pins every statement to one connection. On Workers, create the postgres.js client per request (or per isolate
29
+ * with `max: 1`), as for the data layer.
30
+ */
31
+ export declare function postgresAdapter(sql: Postgres): (options: BetterAuthOptions) => import("better-auth").DBAdapter<BetterAuthOptions>;
32
+ export {};