@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
@@ -0,0 +1,439 @@
1
+ /**
2
+ * K8s-style manifest envelope, scoped to the cms group of the mantle universe.
3
+ *
4
+ * apiVersion: cms.mantle.aotter.net/v2
5
+ * kind: <Kind>
6
+ * metadata: { name }
7
+ * spec: { ... kind-specific ... }
8
+ *
9
+ * Sibling group `analytics.mantle.aotter.net/v1` lives in the parallel mantle (OLAP)
10
+ * project and is parsed there — the two systems share lineage and mantle.ai
11
+ * domain but not parsers.
12
+ *
13
+ * The parser rejects keys and enum values outside this shipped grammar.
14
+ * Future syntax is added only with its implementation.
15
+ */
16
+ export declare const API_VERSION: "cms.mantle.aotter.net/v2";
17
+ export type ApiVersion = typeof API_VERSION;
18
+ /** Media-shaped `x-mcp-hint` values — the subset marking a field as
19
+ * holding a media asset URL. */
20
+ export type MediaMcpHint = "media" | "media-image" | "media-video" | "media-file";
21
+ export declare function isMediaMcpHint(value: unknown): value is MediaMcpHint;
22
+ /** Loose JSON Schema shape — we don't constrain it at the type level.
23
+ * Manifest authoring stays JSON Schema; runtime validators translate
24
+ * to zod (Workers-CSP-safe). Cross-collection refs use the custom
25
+ * keyword `x-mantle-ref: <collectionName>` on string-typed fields holding
26
+ * foreign-key IDs; `x-mcp-hint` is a widget-intent hint. The grammar
27
+ * accepts strings; the conventional values agents and admin
28
+ * widgets understand are `markdown`, `html`, `richtext`, `code`,
29
+ * `media`, `media-image`, `media-video`, `media-file`, `money-minor`,
30
+ * `timestamp-ms`, and `idempotency-key`. */
31
+ export type JsonSchema = {
32
+ readonly $defs?: Readonly<Record<string, JsonSchema>>;
33
+ readonly $ref?: string;
34
+ readonly oneOf?: readonly JsonSchema[];
35
+ readonly const?: unknown;
36
+ readonly type?: string | readonly string[];
37
+ readonly properties?: Readonly<Record<string, JsonSchema>>;
38
+ readonly required?: readonly string[];
39
+ readonly items?: JsonSchema;
40
+ readonly enum?: readonly unknown[];
41
+ readonly format?: string;
42
+ readonly pattern?: string;
43
+ readonly minLength?: number;
44
+ readonly maxLength?: number;
45
+ readonly minimum?: number;
46
+ readonly maximum?: number;
47
+ readonly minItems?: number;
48
+ readonly maxItems?: number;
49
+ readonly nullable?: boolean;
50
+ /** Standard JSON Schema annotation. At the root of a Schema manifest,
51
+ * Mantle keeps generic Admin and Admin MCP authoring read-only while
52
+ * allowing trusted Procedure handlers to maintain the projection. */
53
+ readonly readOnly?: boolean;
54
+ readonly default?: unknown;
55
+ readonly additionalProperties?: boolean | JsonSchema;
56
+ /** Standard JSON Schema keyword: help text for this property, shown
57
+ * under the admin-UI form field (`entry-edit-view.tsx`) and the
58
+ * row-operation dialog's bound-field label fallback
59
+ * (`row-operations.tsx`). Accepts a plain string OR the same
60
+ * `LocalizedText` locale-map shape used by `Schema.spec.description`
61
+ * (#453, mirroring the property `title` keyword's #443 shape) —
62
+ * admin-ui resolves it client-side with `resolveLocalizedText`. `en`
63
+ * can stay the dev/OpenAPI-doc string while `zh-TW` etc. carry
64
+ * operator-readable copy. Optional; absent renders no help text
65
+ * (unchanged v0.1 behavior). */
66
+ readonly description?: LocalizedText;
67
+ /** Standard JSON Schema keyword (#443): a human-facing label for this
68
+ * property, for admin-UI form labels / list column headers /
69
+ * operation form labels. Accepts a plain string OR the same
70
+ * `LocalizedText` locale-map shape used by `Schema.spec.title` —
71
+ * admin-ui resolves it client-side with `resolveLocalizedText`, same
72
+ * as any other `LocalizedText` field. Optional; absent means the
73
+ * consumer humanizes the property name instead (unchanged v0.1
74
+ * behavior). */
75
+ readonly title?: LocalizedText;
76
+ /** Custom: cross-collection reference. The string form names the target
77
+ * Schema and means the value is that entry's `id`; the object form also
78
+ * names the target field (ADR-0029). */
79
+ readonly "x-mantle-ref"?: string | MantleRefTarget;
80
+ /** Custom: hint for MCP tool / agent prompt context. */
81
+ readonly "x-mcp-hint"?: string;
82
+ readonly [key: string]: unknown;
83
+ };
84
+ export declare const MANTLE_REF_KEYWORD: "x-mantle-ref";
85
+ /**
86
+ * A property's string options: its `enum`, or a `oneOf` whose every branch is a string `const` (the standard way to give each
87
+ * option a `title`). Undefined when the property is neither.
88
+ */
89
+ export declare function enumOptions(property: JsonSchema | undefined): {
90
+ readonly value: string;
91
+ readonly title?: LocalizedText;
92
+ }[] | undefined;
93
+ /** Object form of `x-mantle-ref`: which Schema the value points at, and
94
+ * which of its fields holds the value (`id` or a single-field unique
95
+ * index). */
96
+ export interface MantleRefTarget {
97
+ readonly schema: string;
98
+ readonly field: string;
99
+ }
100
+ /** Normalize either `x-mantle-ref` form, or `null` when the property carries
101
+ * none (or a malformed value, which graph validation reports). */
102
+ export declare function resolveMantleRef(property: unknown): MantleRefTarget | null;
103
+ export declare const MCP_HINT_KEYWORD: "x-mcp-hint";
104
+ /** A 0.1.x Schema-property keyword; 0.2.0 refuses it (Schema.spec.scope and a Procedure's SQL replace it). */
105
+ export declare const MANTLE_BIND_KEYWORD: "x-mantle-bind";
106
+ /**
107
+ * A human-facing label/blurb that is either a plain string (single
108
+ * language, the v0.1 shape) or a map of locale code → string (e.g.
109
+ * `{ en: "Products", "zh-TW": "商品" }`) so one manifest can serve a
110
+ * multi-language admin UI. `Schema.spec.title`/`.description`,
111
+ * `Procedure.spec.title`/`.description`, and `View.spec.title`/`.description`
112
+ * use this shape; consumers resolve it to a single displayable string
113
+ * with `resolveLocalizedText`.
114
+ */
115
+ export type LocalizedText = string | Readonly<Record<string, string>>;
116
+ /** A non-empty string or a non-empty `{ locale: non-empty string }` map. */
117
+ export declare const isLocalizedText: (v: unknown) => v is LocalizedText;
118
+ /**
119
+ * Resolve a `LocalizedText` value to a single displayable string for
120
+ * `preferred` (typically the viewer's chosen admin language), falling
121
+ * back to `canonical` (the site's canonical locale) and finally to the
122
+ * record's first own-enumerable entry (insertion order). A plain
123
+ * string is returned as-is — even an empty string, since only
124
+ * `null`/`undefined` map to `null` here; shape validation (rejecting
125
+ * empty strings) is the parser's job, not this resolver's. `null` /
126
+ * `undefined` input (the field was never set) resolves to `null`, and
127
+ * an empty record (structurally invalid, but resolved defensively)
128
+ * also resolves to `null` since there is nothing to fall back to.
129
+ */
130
+ export declare function resolveLocalizedText(value: LocalizedText | null | undefined, preferred: string, canonical?: string | null): string | null;
131
+ /**
132
+ * Four declarative atoms. Each maps 1-to-1 to a Postgres primitive — see
133
+ * ADR-0001 / `docs/handbook/concepts/four-atoms.md` for the mapping. `Procedure`
134
+ * is the only kind with a code seam (handler ref to consumer's TS file).
135
+ */
136
+ export type ManifestKind = "Schema" | "View" | "Procedure" | "Trigger";
137
+ export interface ManifestMetadata {
138
+ /** Resource identifier, e.g. `posts`. Required. Globally unique within
139
+ * `(kind, deployment)`. */
140
+ readonly name: string;
141
+ }
142
+ interface ManifestEnvelope<K extends ManifestKind, S> {
143
+ readonly apiVersion: ApiVersion;
144
+ readonly kind: K;
145
+ readonly metadata: ManifestMetadata;
146
+ readonly spec: S;
147
+ }
148
+ export type SchemaManifest = ManifestEnvelope<"Schema", SchemaManifestSpec>;
149
+ export interface SchemaManifestSpec {
150
+ /** Human-readable label for the admin UI. Required at v0.1.x —
151
+ * the SPA renders this in the sidebar and elsewhere instead of
152
+ * the bare `metadata.name`. Either a plain string, or a
153
+ * `LocalizedText` map of locale → string (e.g.
154
+ * `{ en: "Products", "zh-TW": "商品" }`) so one manifest can serve a
155
+ * multi-language admin UI — the SPA resolves it client-side via
156
+ * `resolveLocalizedText`. AI authors MUST populate it in the user's
157
+ * primary language (the install-time chosen locale) at minimum,
158
+ * since end-admin users may not even read English. See ADR-0010 and
159
+ * the authoring contract § Schema authoring. */
160
+ readonly title: LocalizedText;
161
+ /** Same string-or-locale-map shape as `title`. Optional. */
162
+ readonly description?: LocalizedText;
163
+ /** JSON Schema Draft 2020-12 describing per-entry data. May carry the
164
+ * property extensions `x-mantle-ref` and `x-mcp-hint`. */
165
+ readonly schema: JsonSchema;
166
+ /** Admin-only presentation. Closed Schema roots: `fields`, `list`,
167
+ * `nav`. Optional. */
168
+ readonly uiSchema?: Record<string, unknown>;
169
+ /** Boolean SQL expressions over this Schema's own columns, enforced by triggers on every insert and update
170
+ * (ADR-0034). No subqueries. Example: `stock >= 0`. */
171
+ readonly checks?: readonly string[];
172
+ /** Composite unique-index declarations, e.g. `[[slug, locale]]`. */
173
+ readonly uniqueIndexes?: ReadonlyArray<ReadonlyArray<string>>;
174
+ /** Ordered composite non-unique indexes over top-level scalar fields. */
175
+ readonly indexes?: ReadonlyArray<ReadonlyArray<string>>;
176
+ /** Top-level string fields included in Admin/MCP free-text search.
177
+ * Entry id is always searched; absent or empty means id-only. This is
178
+ * intentionally independent from `indexes`: substring LIKE queries do
179
+ * not benefit from ordinary B-tree indexes. */
180
+ readonly searchableFields?: readonly string[];
181
+ /** Whether entries in this collection carry a per-row locale. Default
182
+ * `false`. When `true`, `data.locale` MUST be present and ∈ site
183
+ * `locales`; when `false`, `data.locale` MUST be absent. See
184
+ * ADR-0010. Mutually constrained with `translates`. */
185
+ readonly localized?: boolean;
186
+ /** Parent/child translation pattern: this Schema is the translatable
187
+ * companion to a non-localized parent Schema, joined by a shared
188
+ * field. Requires explicit `localized: true` and at least one
189
+ * locale-specific field besides `locale` and the join field. See ADR-0010. */
190
+ readonly translates?: TranslatesBinding;
191
+ /** Content-workflow mode. Default `'publishing'` (draft → published →
192
+ * archived, no approval queue). `'operational'` marks record
193
+ * Schemas (orders, inventory snapshots, audit rows) that are written
194
+ * by Procedures rather than authored: entries are live on creation,
195
+ * editable in place, and have no publish/unpublish transitions — the
196
+ * admin hides the content-lifecycle chrome for them. */
197
+ readonly lifecycle?: LifecycleMode;
198
+ /** Logical expiry policy. Physical removal requires an explicit sweep. */
199
+ readonly ttl?: {
200
+ readonly field: string;
201
+ readonly expireAfterSeconds: number;
202
+ };
203
+ /** The Schema's row template (ADR-0046 amendment): AND-joined `column = auth.uid()` /
204
+ * `column IN auth.user('field')` terms, enforced on every read and write of the Schema. */
205
+ readonly scope?: string;
206
+ }
207
+ export interface TranslatesBinding {
208
+ /** Name of the parent Schema this translation table joins to. Must
209
+ * resolve to a declared Schema; the parent itself MUST NOT be
210
+ * `localized: true` (it carries the non-translatable facts). */
211
+ readonly parent: string;
212
+ /** Field present in both parent's and this Schema's
213
+ * `spec.schema.properties` and used as the join key. Conventionally
214
+ * `slug` for content, but any stable identifier works. */
215
+ readonly on: string;
216
+ }
217
+ export type LifecycleMode = "publishing" | "operational";
218
+ export type ViewManifest = ManifestEnvelope<"View", ViewManifestSpec>;
219
+ export interface ViewCachePolicy {
220
+ /** Maximum shared-cache staleness for anonymous REST reads, in seconds. */
221
+ readonly sharedMaxAge: number;
222
+ }
223
+ export declare const VIEW_SURFACES: readonly ["public", "admin", "internal"];
224
+ export type ViewSurface = (typeof VIEW_SURFACES)[number];
225
+ export interface ViewManifestSpec {
226
+ /** Human-readable label for the admin UI's report sidebar / report
227
+ * page (#443). Same string-or-locale-map `LocalizedText` shape as
228
+ * `Schema.spec.title`. Optional — Views didn't carry a title before
229
+ * v0.1.x; when absent the admin UI falls back to a Title-Cased
230
+ * rendering of `metadata.name`, exactly as before this field
231
+ * existed. */
232
+ readonly title?: LocalizedText;
233
+ /** What the View answers, for agents and people choosing a query
234
+ * (ADR-0029). Projected into the View's MCP tool description; absent
235
+ * keeps the generated "Query <surface> View '<name>'." text. */
236
+ readonly description?: LocalizedText;
237
+ /** Admin's list for a `surface: admin` View: `uiSchema.list.columns`, and
238
+ * `searchFields` / `filterFields`, which Store compiles to `LIKE` and `=`
239
+ * conditions on the View's outputs for Admin's search box and filters
240
+ * (ADR-0032 decision 5). REST and MCP are unchanged. */
241
+ readonly uiSchema?: Record<string, unknown>;
242
+ /** One read-only `SELECT` over declared Schemas (ADR-0034). It reads the
243
+ * declared `input` as `input.<name>` and the caller as `auth.uid()` /
244
+ * `auth.role()`; the CLI compiles it to the plan's IR. */
245
+ readonly sql: string;
246
+ /** Adapter exposure policy.
247
+ * `"public"` auto-mounts at the public
248
+ * `GET /api/views/<name>` (v0.1 default; `requires` may still gate
249
+ * the call). When `"admin"` the View is
250
+ * NOT mounted on the public path — it mounts at
251
+ * `GET /admin/api/views/<name>` behind the admin gate and becomes
252
+ * the report-sidebar source. Guards data behind an admin session; use
253
+ * it for any View over sensitive rows. `"internal"` mounts on no
254
+ * adapter and is callable only through `runtime.store.as(ctx).view()`. */
255
+ readonly surface: ViewSurface;
256
+ /** Optional anonymous REST response-cache policy. Validation limits this
257
+ * to public Views that read no caller and no TTL or operational Schema. */
258
+ readonly cache?: ViewCachePolicy;
259
+ /** Auth gate. Identical shape to `ProcedureManifestSpec.requires.auth`.
260
+ * When absent the View is public — `ExecuteViewUseCase` skips the
261
+ * predicate check. When present, ALL predicates must hold; the
262
+ * runtime enforces with `evaluateAuthAll`. Closed predicate
263
+ * vocabulary: `ctx.user`, `ctx.admin`, `ctx.auth`, and
264
+ * `ctx.auth.scope`; an optional guard names one consumer Procedure. */
265
+ readonly requires?: AuthorizationRequirements;
266
+ /** Extra row terms per Schema this target reads (ADR-0046): AND-ed onto that Schema's scope; never widens. */
267
+ readonly restrict?: Readonly<Record<string, string>>;
268
+ /** Caller-supplied parameters, read in `sql` as `input.<name>`. MUST be
269
+ * `type: "object"` with declared `properties`. `limit` and `cursor` are
270
+ * reserved: the runtime owns them for pagination. */
271
+ readonly input?: JsonSchema;
272
+ }
273
+ /** Reserved query-string names on the View REST surface. A View `input` may
274
+ * not declare them (`VIEW_INPUT_RESERVED_NAME`). */
275
+ export declare const VIEW_INPUT_RESERVED: readonly ["limit", "cursor"];
276
+ export type ProcedureManifest = ManifestEnvelope<"Procedure", ProcedureManifestSpec>;
277
+ export interface ProcedureManifestSpec {
278
+ /** Human-readable label for the admin UI's admin-operations surface
279
+ * (#430). Same string-or-locale-map `LocalizedText` shape as
280
+ * `Schema.spec.title`. Optional — Procedures didn't carry a title
281
+ * before v0.1.x; when absent the admin UI falls back to a
282
+ * Title-Cased rendering of `metadata.name`. */
283
+ readonly title?: LocalizedText;
284
+ /** Same string-or-locale-map shape as `title`. Optional. Surfaced by
285
+ * `GET /admin/api/operations` as the operation's `description`
286
+ * field (replaces the pre-#430 hack of reading
287
+ * `spec.input.description`). */
288
+ readonly description?: LocalizedText;
289
+ /** Authorization via `requires.auth.all` plus one optional
290
+ * `requires.guard.procedure`; static predicates are closed to
291
+ * `ctx.user`, `ctx.admin`, `ctx.auth`, and `ctx.auth.scope`. */
292
+ readonly requires?: AuthorizationRequirements;
293
+ /** Extra row terms per Schema this target reads (ADR-0046): AND-ed onto that Schema's scope; never widens. */
294
+ readonly restrict?: Readonly<Record<string, string>>;
295
+ /** JSON Schema for the request body. */
296
+ readonly input: JsonSchema;
297
+ /** Admin-only field widget choices. Does not affect input validation
298
+ * or the MCP tool schema. */
299
+ readonly uiSchema?: Record<string, unknown>;
300
+ /** JSON Schema for the response body. */
301
+ readonly output: JsonSchema;
302
+ /** Handler binding: `{ ref }` (consumer supplies a handler map) or
303
+ * `{ sql }` (write statements, compiled to the plan's IR; ADR-0034). */
304
+ readonly handler: HandlerBinding;
305
+ /** MCP tool annotations the author declares because Core cannot infer
306
+ * them for a `ref` handler (#972). They override the generated defaults
307
+ * (`procedureAnnotations`);
308
+ * An `x-mcp-hint: idempotency-key` input does not infer an
309
+ * `idempotentHint` annotation in 0.2. A `readOnlyHint: true` on a `sql`
310
+ * handler, which always writes, is rejected at validation. */
311
+ readonly mcp?: ProcedureMcpAnnotations;
312
+ /** The entity the handler mutates and whose version it locks
313
+ * (ADR-0029). Needed only for entity-bound interactions and automatic
314
+ * version binding. */
315
+ readonly target?: ProcedureTarget;
316
+ }
317
+ export interface ProcedureTarget {
318
+ /** Target Schema. */
319
+ readonly schema: string;
320
+ /** Required string input property carrying the target entry id. */
321
+ readonly id: string;
322
+ /** Number input property carrying the observed version, when locked. */
323
+ readonly version?: string;
324
+ }
325
+ export declare const PROCEDURE_TARGET_KEYS: readonly ["schema", "id", "version"];
326
+ export interface ProcedureMcpAnnotations {
327
+ readonly readOnlyHint?: boolean;
328
+ readonly destructiveHint?: boolean;
329
+ readonly openWorldHint?: boolean;
330
+ }
331
+ export declare const PROCEDURE_MCP_ANNOTATION_KEYS: readonly ["readOnlyHint", "destructiveHint", "openWorldHint"];
332
+ export type HandlerBinding = HandlerRefBinding | HandlerSqlBinding;
333
+ export interface HandlerRefBinding {
334
+ /** Opaque registration key (NOT a path). The consumer passes a matching
335
+ * key in the runtime/Worker `handlers` map. */
336
+ readonly ref: string;
337
+ }
338
+ /** One or more write statements (`INSERT`, `UPDATE`, `DELETE`), applied as
339
+ * one batch. Reads `input.<name>`, `auth.uid()`, `auth.role()`, `now()`. */
340
+ export interface HandlerSqlBinding {
341
+ readonly sql: string;
342
+ }
343
+ /** Closed predicate vocabulary. `ctx.user` and `ctx.auth` are bare
344
+ * strings; `ctx.admin` and `ctx.auth.scope` carry scalar data under
345
+ * literal object keys.
346
+ */
347
+ export interface AuthorizationRequirements {
348
+ readonly auth?: {
349
+ readonly all: readonly AuthPredicate[];
350
+ };
351
+ /** Dynamic, consumer-owned authorization check. The named Procedure
352
+ * receives the target's validated input/params and the same
353
+ * HandlerContext before the target executes. */
354
+ readonly guard?: {
355
+ readonly procedure: string;
356
+ };
357
+ }
358
+ export type AuthPredicate = CtxUserPredicate | "ctx.admin" | CtxAuthPredicate | CtxAuthScopePredicate;
359
+ export type CtxUserPredicate = "ctx.user";
360
+ /** Requires any verified credential normalized into HandlerContext.auth. */
361
+ export type CtxAuthPredicate = "ctx.auth";
362
+ /** Requires one opaque, consumer-owned scope. Repeat under `all` for
363
+ * multiple required scopes. */
364
+ export interface CtxAuthScopePredicate {
365
+ readonly "ctx.auth.scope": string;
366
+ }
367
+ /** Role names are application-owned; the privileged layer comes from Better Auth. */
368
+ export type AdminRole = string;
369
+ export declare function isAdminRole(s: string): s is AdminRole;
370
+ export type TriggerManifest = ManifestEnvelope<"Trigger", TriggerManifestSpec>;
371
+ export interface TriggerManifestSpec {
372
+ readonly source: TriggerSource;
373
+ /** The Procedure invoked when this Trigger fires. */
374
+ readonly target: {
375
+ readonly procedure: string;
376
+ };
377
+ }
378
+ /** Supported Trigger sources. */
379
+ export type TriggerSource = HttpTriggerSource | LifecycleTriggerSource | McpTriggerSource | ScheduleTriggerSource;
380
+ /** Five-field POSIX cron expression in UTC (weekday 0 = Sunday). Registration remains host-owned. */
381
+ export interface ScheduleTriggerSource {
382
+ readonly kind: "schedule";
383
+ readonly cron: string;
384
+ readonly enabled?: boolean;
385
+ }
386
+ export interface HttpTriggerSource {
387
+ readonly kind: "http";
388
+ readonly method: HttpMethod;
389
+ /** OpenAPI `{param}` syntax. Path params auto-bind to identically-named
390
+ * fields on the target Procedure's `input`. No optional segments. */
391
+ readonly path: string;
392
+ }
393
+ /** Shipped v0.1 lifecycle hook vocabulary: before/after ×
394
+ * create/update/delete plus the publish boundary. New entries require an
395
+ * explicit grammar-revise round. */
396
+ export declare const LIFECYCLE_HOOKS: readonly ["before_create", "after_create", "before_update", "after_update", "before_delete", "after_delete", "before_publish", "after_publish"];
397
+ export type LifecycleHook = (typeof LIFECYCLE_HOOKS)[number];
398
+ export interface LifecycleTriggerSource {
399
+ readonly kind: "lifecycle";
400
+ /** Schema this Trigger watches (`Schema.metadata.name`). */
401
+ readonly schema: string;
402
+ /** Hooks bound by this Trigger. Non-empty. */
403
+ readonly on: readonly LifecycleHook[];
404
+ }
405
+ /** Surfaces an MCP-source Trigger can be bound to. `admin` ⇒
406
+ * `/mcp/admin` (bearer + role gate); `public` ⇒ `/mcp` (bearer only).
407
+ * The procedure's own `requires.auth` still gates the call —
408
+ * surface determines visibility in `tools/list`. */
409
+ export declare const MCP_TRIGGER_SURFACES: readonly ["admin", "public"];
410
+ export type McpTriggerSurface = (typeof MCP_TRIGGER_SURFACES)[number];
411
+ export interface McpTriggerSource {
412
+ readonly kind: "mcp";
413
+ /** Which MCP surface this Procedure is callable from. The
414
+ * Procedure's `requires.auth` continues to evaluate against the
415
+ * authenticated caller — surface only controls discovery. */
416
+ readonly surface: McpTriggerSurface;
417
+ }
418
+ /** v0.1 HTTP methods that may carry a body. GET is intentionally absent
419
+ * — read endpoints are Views, not Procedures. */
420
+ export type HttpMethod = "POST" | "PUT" | "PATCH" | "DELETE";
421
+ export type Manifest = SchemaManifest | ViewManifest | ProcedureManifest | TriggerManifest;
422
+ /** Storage-row metadata columns reserved across every Schema. Used by
423
+ * the View SQL compiler (to project them as native columns rather
424
+ * than `json_extract`) and by the type emitter (to surface them on
425
+ * every Entry interface). Adding a new reserved column is a grammar
426
+ * revise — touch this constant + every consumer. */
427
+ export declare const RESERVED_ENTRY_COLUMNS: readonly ["id", "status", "version", "createdAt", "updatedAt", "authorId"];
428
+ /**
429
+ * Reserved Procedure input wire names. `expectedVersion` is the observed
430
+ * native `entry.version` at read time (not version+1). First-party Admin/SDK
431
+ * bind and hide it; other callers supply it. Schema `spec.schema.properties`
432
+ * must not collide — validate is fail-closed (`INVALID_MANIFEST_ENVELOPE`).
433
+ * New reserved names need an ADR (ADR-0022).
434
+ */
435
+ export declare const EXPECTED_VERSION_PROPERTY: "expectedVersion";
436
+ /** Rules between an input object's fields: only View and Procedure input takes them, and AI tool catalogues advertise them as sentences. */
437
+ export declare const INPUT_RULE_KEYWORDS: readonly ["dependentRequired", "anyOf", "if", "then", "else"];
438
+ export declare const RESERVED_PROCEDURE_INPUT_NAMES: readonly ["expectedVersion"];
439
+ export {};
@@ -0,0 +1,168 @@
1
+ /**
2
+ * The sealed plan (ADR-0032 decision 5, ADR-0034): what the CLI compiles from the manifests and Core executes.
3
+ * Every SQL source is already IR here, so no Worker parses SQL. Pure types and constants.
4
+ */
5
+ import type { AuthorizationRequirements, JsonSchema, LocalizedText, ProcedureMcpAnnotations, ProcedureTarget, TriggerSource } from "./ManifestGrammar.js";
6
+ import type { SqlNode, SqlPlan } from "./SqlIr.js";
7
+ import type { UserScope, UserFieldSpec } from "./UserFields.js";
8
+ export declare const RUNTIME_PLAN_VERSION: 6;
9
+ /** A Schema as storage and Store see it. Keys of `fields` and `names` are lower case: SQL folds unquoted identifiers. */
10
+ export interface PlanSchema {
11
+ readonly userScopes?: readonly UserScope[];
12
+ /** The name as declared: the key of `schemas` is lower case. */
13
+ readonly name: string;
14
+ readonly title?: LocalizedText;
15
+ readonly description?: LocalizedText;
16
+ /** Admin-only presentation, opaque to Core. */
17
+ readonly uiSchema?: Readonly<Record<string, unknown>>;
18
+ readonly localized?: boolean;
19
+ readonly scope?: string;
20
+ readonly ttl?: string;
21
+ readonly ttlSeconds?: number;
22
+ readonly publishing?: boolean;
23
+ /** column -> Mantle type: text integer real bool json timestamptz date numeric(p,s) geo */
24
+ readonly fields: Readonly<Record<string, string>>;
25
+ /** lower-cased column -> the name the JSON Schema declares */
26
+ readonly names: Readonly<Record<string, string>>;
27
+ /** The Schema's JSON Schema: Store validates the values of a write against it. */
28
+ readonly schema: JsonSchema;
29
+ /** Boolean expressions over the row's own columns, as IR. */
30
+ readonly checks?: readonly SqlNode[];
31
+ /** A translation publishes only once the parent entry that shares `on` is published (ADR-0010). Names as declared. */
32
+ readonly translates?: {
33
+ readonly parent: string;
34
+ readonly on: string;
35
+ };
36
+ readonly search?: readonly string[];
37
+ readonly unique?: readonly (readonly string[])[];
38
+ readonly indexes?: readonly (readonly string[])[];
39
+ }
40
+ /** A target's extra row terms per Schema (`restrict`): AND-ed onto that Schema's scope, never dropped by `{ all: true }`. */
41
+ export type PlanRestrict = Readonly<Record<string, {
42
+ readonly owner?: string;
43
+ readonly terms: readonly UserScope[];
44
+ }>>;
45
+ export interface PlanView extends SqlPlan {
46
+ readonly restrict?: PlanRestrict;
47
+ readonly title?: LocalizedText;
48
+ readonly description?: LocalizedText;
49
+ readonly uiSchema?: Readonly<Record<string, unknown>>;
50
+ /** input property -> Mantle type */
51
+ readonly inputs: Readonly<Record<string, string>>;
52
+ readonly input?: JsonSchema;
53
+ /** The SQL as authored, which Admin shows; the IR (`stmts`) is what runs. */
54
+ readonly source: string;
55
+ readonly surface: "public" | "admin" | "internal";
56
+ readonly requires?: AuthorizationRequirements;
57
+ /** `spec.cache.sharedMaxAge`: REST lets a shared cache keep an anonymous read this many seconds. Only an unguarded public View has it. */
58
+ readonly sharedMaxAge?: number;
59
+ /** Output name -> the Schema field it reads unchanged (`SELECT t.f`, `t.f AS f`, `*`, `created_at`) or a `sum`/`min`/`max` of it; the Store decodes these as `select` does. */
60
+ readonly columns?: Readonly<Record<string, {
61
+ readonly schema: string;
62
+ readonly field: string;
63
+ }>>;
64
+ }
65
+ export interface PlanProcedure {
66
+ readonly restrict?: PlanRestrict;
67
+ readonly trustedOnly?: true;
68
+ readonly title?: LocalizedText;
69
+ readonly description?: LocalizedText;
70
+ readonly uiSchema?: Readonly<Record<string, unknown>>;
71
+ readonly input: JsonSchema;
72
+ readonly output: JsonSchema;
73
+ /** input property -> Mantle type, for an inline `sql` handler */
74
+ readonly inputs: Readonly<Record<string, string>>;
75
+ readonly requires?: AuthorizationRequirements;
76
+ readonly target?: ProcedureTarget;
77
+ readonly mcp?: ProcedureMcpAnnotations;
78
+ /** An inline handler carries its SQL as authored (`source`), which Admin shows; the IR is what runs. */
79
+ readonly handler: {
80
+ readonly ref: string;
81
+ } | {
82
+ readonly sql: SqlPlan;
83
+ readonly source: string;
84
+ };
85
+ }
86
+ export interface PlanTrigger {
87
+ readonly source: TriggerSource;
88
+ readonly procedure: string;
89
+ }
90
+ /** A statement as the dialect printed it at `mantle generate` (ADR-0044). Binds are Core's BindSpec as JSON. */
91
+ export interface LoweredStatement {
92
+ readonly sql: string;
93
+ readonly binds: readonly {
94
+ readonly k: string;
95
+ readonly [key: string]: unknown;
96
+ }[];
97
+ readonly kind: "read" | "row" | "set";
98
+ readonly schema?: string;
99
+ readonly verb?: "insert" | "update" | "delete";
100
+ /** Omitted when false. */
101
+ readonly hooked?: true;
102
+ /** Omitted when false. */
103
+ readonly publish?: true;
104
+ /** The policy AST has a RETURNING clause. */
105
+ readonly returns?: true;
106
+ /** A write's table, lower case (D1's unique-conflict op mapping). */
107
+ readonly target?: string;
108
+ }
109
+ /** A paged statement of a View under one request shape, printed. The page size is a bind (`limit`), so one statement serves every page size. */
110
+ export interface LoweredPage {
111
+ readonly sql: string;
112
+ /** Where each extra bind comes from on a request, after the View's own binds: a cursor key, the search pattern, an equality value or the page size + 1. */
113
+ readonly sources: readonly ({
114
+ readonly cursor: number;
115
+ } | {
116
+ readonly search: true;
117
+ } | {
118
+ readonly eq: number;
119
+ } | {
120
+ readonly limit: true;
121
+ })[];
122
+ readonly flat?: true;
123
+ readonly names: readonly string[];
124
+ readonly nkeys: number;
125
+ }
126
+ export interface LoweredView extends LoweredStatement {
127
+ /** The length of the policy AST's sort clause. */
128
+ readonly nkeys: number;
129
+ /** By Core's page shape key (`pageShape`): no cursor, and a cursor whose every key is non-null. */
130
+ readonly paged: Readonly<Record<string, LoweredPage>>;
131
+ }
132
+ export type LoweredMode = "caller" | "public" | "trusted";
133
+ /** What `mantle generate` printed for the plan's dialect (ADR-0044): text, bind recipes and paging metadata, never ASTs. */
134
+ export interface PlanLowered {
135
+ /** The `@aotter/mantle` version that lowered. */
136
+ readonly mantle: string;
137
+ /** The dialect's name and version, and its `lowerKey` ("" when absent): a runtime on another uses none of it. */
138
+ readonly dialect: {
139
+ readonly name: string;
140
+ readonly version: string;
141
+ readonly key: string;
142
+ };
143
+ readonly views: Readonly<Record<string, Readonly<Partial<Record<LoweredMode, LoweredView>>>>>;
144
+ readonly procedures: Readonly<Record<string, Readonly<Partial<Record<"caller" | "trusted", readonly LoweredStatement[]>>>>>;
145
+ }
146
+ export interface RuntimePlan {
147
+ readonly access?: {
148
+ readonly roles: readonly string[];
149
+ readonly userFields: Readonly<Record<string, UserFieldSpec>>;
150
+ readonly warnings: readonly string[];
151
+ };
152
+ readonly version: typeof RUNTIME_PLAN_VERSION;
153
+ /** The dialect the SQL was compiled for (ADR-0035 decision 5); boot refuses a storage of another. */
154
+ readonly dialect: {
155
+ readonly name: string;
156
+ readonly version: string;
157
+ };
158
+ /** SHA-256 of the plan without this field (`planFingerprint`). */
159
+ readonly fingerprint: string;
160
+ readonly schemas: Readonly<Record<string, PlanSchema>>;
161
+ readonly views: Readonly<Record<string, PlanView>>;
162
+ readonly procedures: Readonly<Record<string, PlanProcedure>>;
163
+ readonly triggers: Readonly<Record<string, PlanTrigger>>;
164
+ /** Optional, covered by the fingerprint, and ignored by a runtime it does not match (ADR-0044). */
165
+ readonly lowered?: PlanLowered;
166
+ }
167
+ /** System-column type metadata for View output lineage. */
168
+ export declare const NATIVE_OUTPUT_TYPES: Readonly<Record<string, string>>;