@aotter/mantle 0.1.4 → 0.2.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (849) hide show
  1. package/README.md +39 -306
  2. package/dist/admin/consent.d.ts +17 -0
  3. package/dist/admin/consent.d.ts.map +1 -0
  4. package/dist/admin/consent.js +17 -0
  5. package/dist/admin/consent.js.map +1 -0
  6. package/dist/admin/createAdminSurface.d.ts +22 -0
  7. package/dist/admin/createAdminSurface.d.ts.map +1 -0
  8. package/dist/admin/createAdminSurface.js +589 -0
  9. package/dist/admin/createAdminSurface.js.map +1 -0
  10. package/dist/admin/developerConsole.d.ts +264 -0
  11. package/dist/admin/developerConsole.d.ts.map +1 -0
  12. package/dist/admin/developerConsole.js +136 -0
  13. package/dist/admin/developerConsole.js.map +1 -0
  14. package/dist/admin/identity.d.ts +62 -0
  15. package/dist/admin/identity.d.ts.map +1 -0
  16. package/dist/admin/identity.js +7 -0
  17. package/dist/admin/identity.js.map +1 -0
  18. package/dist/admin/index.d.ts +4 -0
  19. package/dist/admin/index.d.ts.map +1 -0
  20. package/dist/admin/index.js +4 -0
  21. package/dist/admin/index.js.map +1 -0
  22. package/dist/admin/procedureFlow.d.ts +25 -0
  23. package/dist/admin/procedureFlow.d.ts.map +1 -0
  24. package/dist/admin/procedureFlow.js +154 -0
  25. package/dist/admin/procedureFlow.js.map +1 -0
  26. package/dist/auth/ConsoleEmailSender.d.ts +15 -0
  27. package/dist/auth/ConsoleEmailSender.d.ts.map +1 -0
  28. package/dist/auth/ConsoleEmailSender.js +19 -0
  29. package/dist/auth/ConsoleEmailSender.js.map +1 -0
  30. package/dist/auth/appleClientSecret.d.ts +75 -0
  31. package/dist/auth/appleClientSecret.d.ts.map +1 -0
  32. package/dist/auth/appleClientSecret.js +116 -0
  33. package/dist/auth/appleClientSecret.js.map +1 -0
  34. package/dist/auth/buildAuth.d.ts +4565 -0
  35. package/dist/auth/buildAuth.d.ts.map +1 -0
  36. package/dist/auth/buildAuth.js +307 -0
  37. package/dist/auth/buildAuth.js.map +1 -0
  38. package/dist/auth/callerResolver.d.ts +48 -0
  39. package/dist/auth/callerResolver.d.ts.map +1 -0
  40. package/dist/auth/callerResolver.js +49 -0
  41. package/dist/auth/callerResolver.js.map +1 -0
  42. package/dist/auth/createAuthRoutes.d.ts +22 -0
  43. package/dist/auth/createAuthRoutes.d.ts.map +1 -0
  44. package/dist/auth/createAuthRoutes.js +128 -0
  45. package/dist/auth/createAuthRoutes.js.map +1 -0
  46. package/dist/auth/createMantleAuth.d.ts +3 -0
  47. package/dist/auth/createMantleAuth.d.ts.map +1 -0
  48. package/dist/auth/createMantleAuth.js +483 -0
  49. package/dist/auth/createMantleAuth.js.map +1 -0
  50. package/dist/auth/db.d.ts +17 -0
  51. package/dist/auth/db.d.ts.map +1 -0
  52. package/dist/auth/db.js +24 -0
  53. package/dist/auth/db.js.map +1 -0
  54. package/dist/auth/emailTemplates.d.ts +7 -0
  55. package/dist/auth/emailTemplates.d.ts.map +1 -0
  56. package/dist/auth/emailTemplates.js +27 -0
  57. package/dist/auth/emailTemplates.js.map +1 -0
  58. package/dist/auth/index.d.ts +9 -0
  59. package/dist/auth/index.d.ts.map +1 -0
  60. package/dist/auth/index.js +7 -0
  61. package/dist/auth/index.js.map +1 -0
  62. package/dist/auth/methods.d.ts +717 -0
  63. package/dist/auth/methods.d.ts.map +1 -0
  64. package/dist/auth/methods.js +321 -0
  65. package/dist/auth/methods.js.map +1 -0
  66. package/dist/auth/oauthTokens.d.ts +24 -0
  67. package/dist/auth/oauthTokens.d.ts.map +1 -0
  68. package/dist/auth/oauthTokens.js +146 -0
  69. package/dist/auth/oauthTokens.js.map +1 -0
  70. package/dist/auth/setupIncomplete.d.ts +16 -0
  71. package/dist/auth/setupIncomplete.d.ts.map +1 -0
  72. package/dist/auth/setupIncomplete.js +50 -0
  73. package/dist/auth/setupIncomplete.js.map +1 -0
  74. package/dist/auth/types.d.ts +440 -0
  75. package/dist/auth/types.d.ts.map +1 -0
  76. package/dist/auth/types.js +10 -0
  77. package/dist/auth/types.js.map +1 -0
  78. package/dist/bun/index.d.ts +65 -0
  79. package/dist/bun/index.d.ts.map +1 -0
  80. package/dist/bun/index.js +130 -0
  81. package/dist/bun/index.js.map +1 -0
  82. package/dist/cli/emitModule.d.ts +7 -0
  83. package/dist/cli/emitModule.d.ts.map +1 -0
  84. package/dist/cli/emitModule.js +127 -0
  85. package/dist/cli/emitModule.js.map +1 -0
  86. package/dist/cli/generate.d.ts +4 -16
  87. package/dist/cli/generate.d.ts.map +1 -1
  88. package/dist/cli/generate.js +332 -165
  89. package/dist/cli/generate.js.map +1 -1
  90. package/dist/cli/main.d.ts +1 -1
  91. package/dist/cli/main.d.ts.map +1 -1
  92. package/dist/cli/main.js +15 -71
  93. package/dist/cli/main.js.map +1 -1
  94. package/dist/cli/preset.d.ts +18 -0
  95. package/dist/cli/preset.d.ts.map +1 -0
  96. package/dist/cli/preset.js +352 -0
  97. package/dist/cli/preset.js.map +1 -0
  98. package/dist/cloudflare/index.d.ts +21 -0
  99. package/dist/cloudflare/index.d.ts.map +1 -0
  100. package/dist/cloudflare/index.js +14 -0
  101. package/dist/cloudflare/index.js.map +1 -0
  102. package/dist/cloudflare/r2Media.d.ts +43 -0
  103. package/dist/cloudflare/r2Media.d.ts.map +1 -0
  104. package/dist/cloudflare/r2Media.js +69 -0
  105. package/dist/cloudflare/r2Media.js.map +1 -0
  106. package/dist/core/caller.d.ts +35 -0
  107. package/dist/core/caller.d.ts.map +1 -0
  108. package/dist/core/caller.js +3 -0
  109. package/dist/core/caller.js.map +1 -0
  110. package/dist/core/createMantle.d.ts +22 -0
  111. package/dist/core/createMantle.d.ts.map +1 -0
  112. package/dist/core/createMantle.js +117 -0
  113. package/dist/core/createMantle.js.map +1 -0
  114. package/dist/core/dialect.d.ts +41 -0
  115. package/dist/core/dialect.d.ts.map +1 -0
  116. package/dist/core/dialect.js +7 -0
  117. package/dist/core/dialect.js.map +1 -0
  118. package/dist/core/driver.d.ts +17 -0
  119. package/dist/core/driver.d.ts.map +1 -0
  120. package/dist/core/driver.js +2 -0
  121. package/dist/core/driver.js.map +1 -0
  122. package/dist/core/email.d.ts +17 -0
  123. package/dist/core/email.d.ts.map +1 -0
  124. package/dist/core/email.js +2 -0
  125. package/dist/core/email.js.map +1 -0
  126. package/dist/core/index.d.ts +16 -0
  127. package/dist/core/index.d.ts.map +1 -0
  128. package/dist/core/index.js +16 -0
  129. package/dist/core/index.js.map +1 -0
  130. package/dist/core/invocation.d.ts +66 -0
  131. package/dist/core/invocation.d.ts.map +1 -0
  132. package/dist/core/invocation.js +3 -0
  133. package/dist/core/invocation.js.map +1 -0
  134. package/dist/core/runtime/auth.d.ts +9 -0
  135. package/dist/core/runtime/auth.d.ts.map +1 -0
  136. package/dist/core/runtime/auth.js +39 -0
  137. package/dist/core/runtime/auth.js.map +1 -0
  138. package/dist/core/runtime/createRuntime.d.ts +23 -0
  139. package/dist/core/runtime/createRuntime.d.ts.map +1 -0
  140. package/dist/core/runtime/createRuntime.js +214 -0
  141. package/dist/core/runtime/createRuntime.js.map +1 -0
  142. package/dist/core/runtime/verifyPlan.d.ts +34 -0
  143. package/dist/core/runtime/verifyPlan.d.ts.map +1 -0
  144. package/dist/core/runtime/verifyPlan.js +301 -0
  145. package/dist/core/runtime/verifyPlan.js.map +1 -0
  146. package/dist/core/service.d.ts +45 -0
  147. package/dist/core/service.d.ts.map +1 -0
  148. package/dist/core/service.js +2 -0
  149. package/dist/core/service.js.map +1 -0
  150. package/dist/core/site.d.ts +117 -0
  151. package/dist/core/site.d.ts.map +1 -0
  152. package/dist/core/site.js +2 -0
  153. package/dist/core/site.js.map +1 -0
  154. package/dist/core/siteConfig.d.ts +5 -0
  155. package/dist/core/siteConfig.d.ts.map +1 -0
  156. package/dist/core/siteConfig.js +24 -0
  157. package/dist/core/siteConfig.js.map +1 -0
  158. package/dist/core/sql/allowlist.d.ts +65 -0
  159. package/dist/core/sql/allowlist.d.ts.map +1 -0
  160. package/dist/core/sql/allowlist.js +705 -0
  161. package/dist/core/sql/allowlist.js.map +1 -0
  162. package/dist/core/sql/ast.d.ts +24 -0
  163. package/dist/core/sql/ast.d.ts.map +1 -0
  164. package/dist/core/sql/ast.js +32 -0
  165. package/dist/core/sql/ast.js.map +1 -0
  166. package/dist/core/sql/compile.d.ts +50 -0
  167. package/dist/core/sql/compile.d.ts.map +1 -0
  168. package/dist/core/sql/compile.js +48 -0
  169. package/dist/core/sql/compile.js.map +1 -0
  170. package/dist/core/sql/policy.d.ts +121 -0
  171. package/dist/core/sql/policy.d.ts.map +1 -0
  172. package/dist/core/sql/policy.js +379 -0
  173. package/dist/core/sql/policy.js.map +1 -0
  174. package/dist/core/sql/positions.d.ts +30 -0
  175. package/dist/core/sql/positions.d.ts.map +1 -0
  176. package/dist/core/sql/positions.js +22 -0
  177. package/dist/core/sql/positions.js.map +1 -0
  178. package/dist/core/sql/run.d.ts +76 -0
  179. package/dist/core/sql/run.d.ts.map +1 -0
  180. package/dist/core/sql/run.js +267 -0
  181. package/dist/core/sql/run.js.map +1 -0
  182. package/dist/core/store/createStore.d.ts +49 -0
  183. package/dist/core/store/createStore.d.ts.map +1 -0
  184. package/dist/core/store/createStore.js +227 -0
  185. package/dist/core/store/createStore.js.map +1 -0
  186. package/dist/core/store/cursor.d.ts +4 -0
  187. package/dist/core/store/cursor.d.ts.map +1 -0
  188. package/dist/core/store/cursor.js +22 -0
  189. package/dist/core/store/cursor.js.map +1 -0
  190. package/dist/core/store/json.d.ts +80 -0
  191. package/dist/core/store/json.d.ts.map +1 -0
  192. package/dist/core/store/json.js +342 -0
  193. package/dist/core/store/json.js.map +1 -0
  194. package/dist/core/store.d.ts +160 -0
  195. package/dist/core/store.d.ts.map +1 -0
  196. package/dist/core/store.js +2 -0
  197. package/dist/core/store.js.map +1 -0
  198. package/dist/core/wire.d.ts +20 -0
  199. package/dist/core/wire.d.ts.map +1 -0
  200. package/dist/core/wire.js +84 -0
  201. package/dist/core/wire.js.map +1 -0
  202. package/dist/core/withCaller.d.ts +16 -0
  203. package/dist/core/withCaller.d.ts.map +1 -0
  204. package/dist/core/withCaller.js +29 -0
  205. package/dist/core/withCaller.js.map +1 -0
  206. package/dist/d1/adapter.d.ts +12 -0
  207. package/dist/d1/adapter.d.ts.map +1 -0
  208. package/dist/d1/adapter.js +23 -0
  209. package/dist/d1/adapter.js.map +1 -0
  210. package/dist/d1/codec.d.ts +14 -0
  211. package/dist/d1/codec.d.ts.map +1 -0
  212. package/dist/d1/codec.js +136 -0
  213. package/dist/d1/codec.js.map +1 -0
  214. package/dist/d1/compile/index.d.ts +9 -0
  215. package/dist/d1/compile/index.d.ts.map +1 -0
  216. package/dist/d1/compile/index.js +9 -0
  217. package/dist/d1/compile/index.js.map +1 -0
  218. package/dist/d1/dialect.d.ts +4 -0
  219. package/dist/d1/dialect.d.ts.map +1 -0
  220. package/dist/d1/dialect.js +13 -0
  221. package/dist/d1/dialect.js.map +1 -0
  222. package/dist/d1/executor.d.ts +13 -0
  223. package/dist/d1/executor.d.ts.map +1 -0
  224. package/dist/d1/executor.js +91 -0
  225. package/dist/d1/executor.js.map +1 -0
  226. package/dist/d1/index.d.ts +6 -0
  227. package/dist/d1/index.d.ts.map +1 -0
  228. package/dist/d1/index.js +6 -0
  229. package/dist/d1/index.js.map +1 -0
  230. package/dist/d1/lower.d.ts +8 -0
  231. package/dist/d1/lower.d.ts.map +1 -0
  232. package/dist/d1/lower.js +167 -0
  233. package/dist/d1/lower.js.map +1 -0
  234. package/dist/d1/media.d.ts +5 -0
  235. package/dist/d1/media.d.ts.map +1 -0
  236. package/dist/d1/media.js +157 -0
  237. package/dist/d1/media.js.map +1 -0
  238. package/dist/d1/migrations.d.ts +12 -0
  239. package/dist/d1/migrations.d.ts.map +1 -0
  240. package/dist/d1/migrations.js +111 -0
  241. package/dist/d1/migrations.js.map +1 -0
  242. package/dist/d1/print.d.ts +28 -0
  243. package/dist/d1/print.d.ts.map +1 -0
  244. package/dist/d1/print.js +54 -0
  245. package/dist/d1/print.js.map +1 -0
  246. package/dist/d1/site.d.ts +17 -0
  247. package/dist/d1/site.d.ts.map +1 -0
  248. package/dist/d1/site.js +63 -0
  249. package/dist/d1/site.js.map +1 -0
  250. package/dist/d1/storage.d.ts +34 -0
  251. package/dist/d1/storage.d.ts.map +1 -0
  252. package/dist/d1/storage.js +288 -0
  253. package/dist/d1/storage.js.map +1 -0
  254. package/dist/d1/tz.d.ts +21 -0
  255. package/dist/d1/tz.d.ts.map +1 -0
  256. package/dist/d1/tz.js +54 -0
  257. package/dist/d1/tz.js.map +1 -0
  258. package/dist/d1/validator.d.ts +10 -0
  259. package/dist/d1/validator.d.ts.map +1 -0
  260. package/dist/d1/validator.js +33 -0
  261. package/dist/d1/validator.js.map +1 -0
  262. package/dist/mcp/apps.d.ts +43 -0
  263. package/dist/mcp/apps.d.ts.map +1 -0
  264. package/dist/mcp/apps.js +57 -0
  265. package/dist/mcp/apps.js.map +1 -0
  266. package/dist/mcp/catalog.d.ts +55 -0
  267. package/dist/mcp/catalog.d.ts.map +1 -0
  268. package/dist/mcp/catalog.js +81 -0
  269. package/dist/mcp/catalog.js.map +1 -0
  270. package/dist/mcp/createMcpSurface.d.ts +34 -0
  271. package/dist/mcp/createMcpSurface.d.ts.map +1 -0
  272. package/dist/mcp/createMcpSurface.js +150 -0
  273. package/dist/mcp/createMcpSurface.js.map +1 -0
  274. package/dist/mcp/index.d.ts +4 -0
  275. package/dist/mcp/index.d.ts.map +1 -0
  276. package/dist/mcp/index.js +4 -0
  277. package/dist/mcp/index.js.map +1 -0
  278. package/dist/postgres/adapter.d.ts +20 -0
  279. package/dist/postgres/adapter.d.ts.map +1 -0
  280. package/dist/postgres/adapter.js +44 -0
  281. package/dist/postgres/adapter.js.map +1 -0
  282. package/dist/postgres/codec.d.ts +13 -0
  283. package/dist/postgres/codec.d.ts.map +1 -0
  284. package/dist/postgres/codec.js +110 -0
  285. package/dist/postgres/codec.js.map +1 -0
  286. package/dist/postgres/compile/index.d.ts +9 -0
  287. package/dist/postgres/compile/index.d.ts.map +1 -0
  288. package/dist/postgres/compile/index.js +9 -0
  289. package/dist/postgres/compile/index.js.map +1 -0
  290. package/dist/postgres/driver.d.ts +92 -0
  291. package/dist/postgres/driver.d.ts.map +1 -0
  292. package/dist/postgres/driver.js +110 -0
  293. package/dist/postgres/driver.js.map +1 -0
  294. package/dist/postgres/executor.d.ts +20 -0
  295. package/dist/postgres/executor.d.ts.map +1 -0
  296. package/dist/postgres/executor.js +69 -0
  297. package/dist/postgres/executor.js.map +1 -0
  298. package/dist/postgres/index.d.ts +7 -0
  299. package/dist/postgres/index.d.ts.map +1 -0
  300. package/dist/postgres/index.js +7 -0
  301. package/dist/postgres/index.js.map +1 -0
  302. package/dist/postgres/lower.d.ts +6 -0
  303. package/dist/postgres/lower.d.ts.map +1 -0
  304. package/dist/postgres/lower.js +157 -0
  305. package/dist/postgres/lower.js.map +1 -0
  306. package/dist/postgres/print.d.ts +11 -0
  307. package/dist/postgres/print.d.ts.map +1 -0
  308. package/dist/postgres/print.js +121 -0
  309. package/dist/postgres/print.js.map +1 -0
  310. package/dist/postgres/storage.d.ts +19 -0
  311. package/dist/postgres/storage.d.ts.map +1 -0
  312. package/dist/postgres/storage.js +201 -0
  313. package/dist/postgres/storage.js.map +1 -0
  314. package/dist/postgres/textRows.d.ts +10 -0
  315. package/dist/postgres/textRows.d.ts.map +1 -0
  316. package/dist/postgres/textRows.js +44 -0
  317. package/dist/postgres/textRows.js.map +1 -0
  318. package/dist/postgres/validator.d.ts +12 -0
  319. package/dist/postgres/validator.d.ts.map +1 -0
  320. package/dist/postgres/validator.js +46 -0
  321. package/dist/postgres/validator.js.map +1 -0
  322. package/dist/spec/domain/index.d.ts +3 -0
  323. package/dist/spec/domain/index.d.ts.map +1 -0
  324. package/dist/spec/domain/index.js +3 -0
  325. package/dist/spec/domain/index.js.map +1 -0
  326. package/dist/spec/domain/model/ContentState.d.ts +8 -0
  327. package/dist/spec/domain/model/ContentState.d.ts.map +1 -0
  328. package/dist/spec/domain/model/ContentState.js +7 -0
  329. package/dist/spec/domain/model/ContentState.js.map +1 -0
  330. package/dist/spec/domain/model/Entry.d.ts +29 -0
  331. package/dist/spec/domain/model/Entry.d.ts.map +1 -0
  332. package/dist/spec/domain/model/Entry.js +16 -0
  333. package/dist/spec/domain/model/Entry.js.map +1 -0
  334. package/dist/spec/domain/model/Locale.d.ts +30 -0
  335. package/dist/spec/domain/model/Locale.d.ts.map +1 -0
  336. package/dist/spec/domain/model/Locale.js +33 -0
  337. package/dist/spec/domain/model/Locale.js.map +1 -0
  338. package/dist/spec/domain/model/ManifestGrammar.d.ts +452 -0
  339. package/dist/spec/domain/model/ManifestGrammar.d.ts.map +1 -0
  340. package/dist/spec/domain/model/ManifestGrammar.js +149 -0
  341. package/dist/spec/domain/model/ManifestGrammar.js.map +1 -0
  342. package/dist/spec/domain/model/MediaMimeAccept.d.ts +55 -0
  343. package/dist/spec/domain/model/MediaMimeAccept.d.ts.map +1 -0
  344. package/dist/spec/domain/model/MediaMimeAccept.js +90 -0
  345. package/dist/spec/domain/model/MediaMimeAccept.js.map +1 -0
  346. package/dist/spec/domain/model/RuntimePlan.d.ts +94 -0
  347. package/dist/spec/domain/model/RuntimePlan.d.ts.map +1 -0
  348. package/dist/spec/domain/model/RuntimePlan.js +4 -0
  349. package/dist/spec/domain/model/RuntimePlan.js.map +1 -0
  350. package/dist/spec/domain/model/SiteConfig.d.ts +173 -0
  351. package/dist/spec/domain/model/SiteConfig.d.ts.map +1 -0
  352. package/dist/spec/domain/model/SiteConfig.js +13 -0
  353. package/dist/spec/domain/model/SiteConfig.js.map +1 -0
  354. package/dist/spec/domain/model/SqlIr.d.ts +96 -0
  355. package/dist/spec/domain/model/SqlIr.d.ts.map +1 -0
  356. package/dist/spec/domain/model/SqlIr.js +95 -0
  357. package/dist/spec/domain/model/SqlIr.js.map +1 -0
  358. package/dist/spec/domain/model/index.d.ts +14 -0
  359. package/dist/spec/domain/model/index.d.ts.map +1 -0
  360. package/dist/spec/domain/model/index.js +14 -0
  361. package/dist/spec/domain/model/index.js.map +1 -0
  362. package/dist/spec/domain/service/CloudflareCron.d.ts +2 -0
  363. package/dist/spec/domain/service/CloudflareCron.d.ts.map +1 -0
  364. package/dist/spec/domain/service/CloudflareCron.js +63 -0
  365. package/dist/spec/domain/service/CloudflareCron.js.map +1 -0
  366. package/dist/spec/domain/service/CrossSchemaChecker.d.ts +34 -0
  367. package/dist/spec/domain/service/CrossSchemaChecker.d.ts.map +1 -0
  368. package/dist/spec/domain/service/CrossSchemaChecker.js +114 -0
  369. package/dist/spec/domain/service/CrossSchemaChecker.js.map +1 -0
  370. package/dist/spec/domain/service/EntryDataValidator.d.ts +56 -0
  371. package/dist/spec/domain/service/EntryDataValidator.d.ts.map +1 -0
  372. package/dist/spec/domain/service/EntryDataValidator.js +88 -0
  373. package/dist/spec/domain/service/EntryDataValidator.js.map +1 -0
  374. package/dist/spec/domain/service/JsonSchemaToZod.d.ts +29 -0
  375. package/dist/spec/domain/service/JsonSchemaToZod.d.ts.map +1 -0
  376. package/dist/spec/domain/service/JsonSchemaToZod.js +156 -0
  377. package/dist/spec/domain/service/JsonSchemaToZod.js.map +1 -0
  378. package/dist/spec/domain/service/LifecycleStateMachine.d.ts +75 -0
  379. package/dist/spec/domain/service/LifecycleStateMachine.d.ts.map +1 -0
  380. package/dist/spec/domain/service/LifecycleStateMachine.js +76 -0
  381. package/dist/spec/domain/service/LifecycleStateMachine.js.map +1 -0
  382. package/dist/spec/domain/service/LocaleCanonicalizer.d.ts +29 -0
  383. package/dist/spec/domain/service/LocaleCanonicalizer.d.ts.map +1 -0
  384. package/dist/spec/domain/service/LocaleCanonicalizer.js +96 -0
  385. package/dist/spec/domain/service/LocaleCanonicalizer.js.map +1 -0
  386. package/dist/spec/domain/service/ManifestFieldChecks.d.ts +60 -0
  387. package/dist/spec/domain/service/ManifestFieldChecks.d.ts.map +1 -0
  388. package/dist/spec/domain/service/ManifestFieldChecks.js +116 -0
  389. package/dist/spec/domain/service/ManifestFieldChecks.js.map +1 -0
  390. package/dist/spec/domain/service/ManifestGraphValidator.d.ts +15 -0
  391. package/dist/spec/domain/service/ManifestGraphValidator.d.ts.map +1 -0
  392. package/dist/spec/domain/service/ManifestGraphValidator.js +225 -0
  393. package/dist/spec/domain/service/ManifestGraphValidator.js.map +1 -0
  394. package/dist/spec/domain/service/ManifestLinker.d.ts +45 -0
  395. package/dist/spec/domain/service/ManifestLinker.d.ts.map +1 -0
  396. package/dist/spec/domain/service/ManifestLinker.js +92 -0
  397. package/dist/spec/domain/service/ManifestLinker.js.map +1 -0
  398. package/dist/spec/domain/service/ManifestLocaleTrimmer.d.ts +16 -0
  399. package/dist/spec/domain/service/ManifestLocaleTrimmer.d.ts.map +1 -0
  400. package/dist/spec/domain/service/ManifestLocaleTrimmer.js +76 -0
  401. package/dist/spec/domain/service/ManifestLocaleTrimmer.js.map +1 -0
  402. package/dist/spec/domain/service/ManifestParser.d.ts +49 -0
  403. package/dist/spec/domain/service/ManifestParser.d.ts.map +1 -0
  404. package/dist/spec/domain/service/ManifestParser.js +203 -0
  405. package/dist/spec/domain/service/ManifestParser.js.map +1 -0
  406. package/dist/spec/domain/service/ManifestPartition.d.ts +9 -0
  407. package/dist/spec/domain/service/ManifestPartition.d.ts.map +1 -0
  408. package/dist/spec/domain/service/ManifestPartition.js +19 -0
  409. package/dist/spec/domain/service/ManifestPartition.js.map +1 -0
  410. package/dist/spec/domain/service/ManifestPathDiagnoser.d.ts +33 -0
  411. package/dist/spec/domain/service/ManifestPathDiagnoser.d.ts.map +1 -0
  412. package/dist/spec/domain/service/ManifestPathDiagnoser.js +43 -0
  413. package/dist/spec/domain/service/ManifestPathDiagnoser.js.map +1 -0
  414. package/dist/spec/domain/service/ManifestSourceSpans.d.ts +10 -0
  415. package/dist/spec/domain/service/ManifestSourceSpans.d.ts.map +1 -0
  416. package/dist/spec/domain/service/ManifestSourceSpans.js +76 -0
  417. package/dist/spec/domain/service/ManifestSourceSpans.js.map +1 -0
  418. package/dist/spec/domain/service/McpToolNaming.d.ts +25 -0
  419. package/dist/spec/domain/service/McpToolNaming.d.ts.map +1 -0
  420. package/dist/spec/domain/service/McpToolNaming.js +50 -0
  421. package/dist/spec/domain/service/McpToolNaming.js.map +1 -0
  422. package/dist/spec/domain/service/PlanFingerprint.d.ts +4 -0
  423. package/dist/spec/domain/service/PlanFingerprint.d.ts.map +1 -0
  424. package/dist/spec/domain/service/PlanFingerprint.js +14 -0
  425. package/dist/spec/domain/service/PlanFingerprint.js.map +1 -0
  426. package/dist/spec/domain/service/ProcedureViewSpecChecks.d.ts +4 -0
  427. package/dist/spec/domain/service/ProcedureViewSpecChecks.d.ts.map +1 -0
  428. package/dist/spec/domain/service/ProcedureViewSpecChecks.js +211 -0
  429. package/dist/spec/domain/service/ProcedureViewSpecChecks.js.map +1 -0
  430. package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts +42 -0
  431. package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts.map +1 -0
  432. package/dist/spec/domain/service/SchemaAdminUiChecker.js +289 -0
  433. package/dist/spec/domain/service/SchemaAdminUiChecker.js.map +1 -0
  434. package/dist/spec/domain/service/SchemaIndexChecker.d.ts +33 -0
  435. package/dist/spec/domain/service/SchemaIndexChecker.d.ts.map +1 -0
  436. package/dist/spec/domain/service/SchemaIndexChecker.js +256 -0
  437. package/dist/spec/domain/service/SchemaIndexChecker.js.map +1 -0
  438. package/dist/spec/domain/service/SchemaSearchChecker.d.ts +11 -0
  439. package/dist/spec/domain/service/SchemaSearchChecker.d.ts.map +1 -0
  440. package/dist/spec/domain/service/SchemaSearchChecker.js +78 -0
  441. package/dist/spec/domain/service/SchemaSearchChecker.js.map +1 -0
  442. package/dist/spec/domain/service/SchemaSpecChecks.d.ts +31 -0
  443. package/dist/spec/domain/service/SchemaSpecChecks.d.ts.map +1 -0
  444. package/dist/spec/domain/service/SchemaSpecChecks.js +445 -0
  445. package/dist/spec/domain/service/SchemaSpecChecks.js.map +1 -0
  446. package/dist/spec/domain/service/SiteDefaultsValidator.d.ts +39 -0
  447. package/dist/spec/domain/service/SiteDefaultsValidator.d.ts.map +1 -0
  448. package/dist/spec/domain/service/SiteDefaultsValidator.js +194 -0
  449. package/dist/spec/domain/service/SiteDefaultsValidator.js.map +1 -0
  450. package/dist/spec/domain/service/SqlClassify.d.ts +19 -0
  451. package/dist/spec/domain/service/SqlClassify.d.ts.map +1 -0
  452. package/dist/spec/domain/service/SqlClassify.js +42 -0
  453. package/dist/spec/domain/service/SqlClassify.js.map +1 -0
  454. package/dist/spec/domain/service/SqlRefusal.d.ts +16 -0
  455. package/dist/spec/domain/service/SqlRefusal.d.ts.map +1 -0
  456. package/dist/spec/domain/service/SqlRefusal.js +20 -0
  457. package/dist/spec/domain/service/SqlRefusal.js.map +1 -0
  458. package/dist/spec/domain/service/SqlTypes.d.ts +40 -0
  459. package/dist/spec/domain/service/SqlTypes.d.ts.map +1 -0
  460. package/dist/spec/domain/service/SqlTypes.js +110 -0
  461. package/dist/spec/domain/service/SqlTypes.js.map +1 -0
  462. package/dist/spec/domain/service/StaffRoleHierarchy.d.ts +3 -0
  463. package/dist/spec/domain/service/StaffRoleHierarchy.d.ts.map +1 -0
  464. package/dist/spec/domain/service/StaffRoleHierarchy.js +19 -0
  465. package/dist/spec/domain/service/StaffRoleHierarchy.js.map +1 -0
  466. package/dist/spec/domain/service/TriggerGraphChecks.d.ts +16 -0
  467. package/dist/spec/domain/service/TriggerGraphChecks.d.ts.map +1 -0
  468. package/dist/spec/domain/service/TriggerGraphChecks.js +337 -0
  469. package/dist/spec/domain/service/TriggerGraphChecks.js.map +1 -0
  470. package/dist/spec/domain/service/TriggerSpecChecks.d.ts +4 -0
  471. package/dist/spec/domain/service/TriggerSpecChecks.d.ts.map +1 -0
  472. package/dist/spec/domain/service/TriggerSpecChecks.js +89 -0
  473. package/dist/spec/domain/service/TriggerSpecChecks.js.map +1 -0
  474. package/dist/spec/domain/service/ValidatedAdminUiProjection.d.ts +11 -0
  475. package/dist/spec/domain/service/ValidatedAdminUiProjection.d.ts.map +1 -0
  476. package/dist/spec/domain/service/ValidatedAdminUiProjection.js +26 -0
  477. package/dist/spec/domain/service/ValidatedAdminUiProjection.js.map +1 -0
  478. package/dist/spec/domain/service/ViewAdminUiChecker.d.ts +14 -0
  479. package/dist/spec/domain/service/ViewAdminUiChecker.d.ts.map +1 -0
  480. package/dist/spec/domain/service/ViewAdminUiChecker.js +53 -0
  481. package/dist/spec/domain/service/ViewAdminUiChecker.js.map +1 -0
  482. package/dist/spec/domain/service/index.d.ts +24 -0
  483. package/dist/spec/domain/service/index.d.ts.map +1 -0
  484. package/dist/spec/domain/service/index.js +24 -0
  485. package/dist/spec/domain/service/index.js.map +1 -0
  486. package/dist/spec/index.d.ts +10 -0
  487. package/dist/spec/index.d.ts.map +1 -0
  488. package/dist/spec/index.js +12 -0
  489. package/dist/spec/index.js.map +1 -0
  490. package/dist/spec/infrastructure/cli/parseArgsError.d.ts +16 -0
  491. package/dist/spec/infrastructure/cli/parseArgsError.d.ts.map +1 -0
  492. package/dist/spec/infrastructure/cli/parseArgsError.js +34 -0
  493. package/dist/spec/infrastructure/cli/parseArgsError.js.map +1 -0
  494. package/dist/spec/infrastructure/index.d.ts +2 -0
  495. package/dist/spec/infrastructure/index.d.ts.map +1 -0
  496. package/dist/spec/infrastructure/index.js +2 -0
  497. package/dist/spec/infrastructure/index.js.map +1 -0
  498. package/dist/spec/infrastructure/sql/PgQueryParser.d.ts +18 -0
  499. package/dist/spec/infrastructure/sql/PgQueryParser.d.ts.map +1 -0
  500. package/dist/spec/infrastructure/sql/PgQueryParser.js +17 -0
  501. package/dist/spec/infrastructure/sql/PgQueryParser.js.map +1 -0
  502. package/dist/spec/infrastructure/sql/compilePlan.d.ts +37 -0
  503. package/dist/spec/infrastructure/sql/compilePlan.d.ts.map +1 -0
  504. package/dist/spec/infrastructure/sql/compilePlan.js +282 -0
  505. package/dist/spec/infrastructure/sql/compilePlan.js.map +1 -0
  506. package/dist/spec/infrastructure/sql/compileSql.d.ts +35 -0
  507. package/dist/spec/infrastructure/sql/compileSql.d.ts.map +1 -0
  508. package/dist/spec/infrastructure/sql/compileSql.js +92 -0
  509. package/dist/spec/infrastructure/sql/compileSql.js.map +1 -0
  510. package/dist/spec/infrastructure/sql/frontEnd.d.ts +8 -0
  511. package/dist/spec/infrastructure/sql/frontEnd.d.ts.map +1 -0
  512. package/dist/spec/infrastructure/sql/frontEnd.js +100 -0
  513. package/dist/spec/infrastructure/sql/frontEnd.js.map +1 -0
  514. package/dist/spec/infrastructure/sql/index.d.ts +4 -0
  515. package/dist/spec/infrastructure/sql/index.d.ts.map +1 -0
  516. package/dist/spec/infrastructure/sql/index.js +4 -0
  517. package/dist/spec/infrastructure/sql/index.js.map +1 -0
  518. package/dist/spec/kernel/diagnostic.d.ts +137 -0
  519. package/dist/spec/kernel/diagnostic.d.ts.map +1 -0
  520. package/dist/spec/kernel/diagnostic.js +296 -0
  521. package/dist/spec/kernel/diagnostic.js.map +1 -0
  522. package/dist/spec/kernel/index.d.ts +8 -0
  523. package/dist/spec/kernel/index.d.ts.map +1 -0
  524. package/dist/spec/kernel/index.js +8 -0
  525. package/dist/spec/kernel/index.js.map +1 -0
  526. package/dist/spec/usecase/EmitTypes.d.ts +22 -0
  527. package/dist/spec/usecase/EmitTypes.d.ts.map +1 -0
  528. package/dist/spec/usecase/EmitTypes.js +182 -0
  529. package/dist/spec/usecase/EmitTypes.js.map +1 -0
  530. package/dist/spec/usecase/ValidateManifestsUseCase.d.ts +8 -0
  531. package/dist/spec/usecase/ValidateManifestsUseCase.d.ts.map +1 -0
  532. package/dist/spec/usecase/ValidateManifestsUseCase.js +101 -0
  533. package/dist/spec/usecase/ValidateManifestsUseCase.js.map +1 -0
  534. package/dist/spec/usecase/dto/ValidateManifestsRequest.d.ts +27 -0
  535. package/dist/spec/usecase/dto/ValidateManifestsRequest.d.ts.map +1 -0
  536. package/dist/spec/usecase/dto/ValidateManifestsRequest.js +2 -0
  537. package/dist/spec/usecase/dto/ValidateManifestsRequest.js.map +1 -0
  538. package/dist/spec/usecase/dto/ValidateManifestsResponse.d.ts +14 -0
  539. package/dist/spec/usecase/dto/ValidateManifestsResponse.d.ts.map +1 -0
  540. package/dist/spec/usecase/dto/ValidateManifestsResponse.js +2 -0
  541. package/dist/spec/usecase/dto/ValidateManifestsResponse.js.map +1 -0
  542. package/dist/spec/usecase/dto/index.d.ts +3 -0
  543. package/dist/spec/usecase/dto/index.d.ts.map +1 -0
  544. package/dist/spec/usecase/dto/index.js +3 -0
  545. package/dist/spec/usecase/dto/index.js.map +1 -0
  546. package/dist/spec/usecase/index.d.ts +10 -0
  547. package/dist/spec/usecase/index.d.ts.map +1 -0
  548. package/dist/spec/usecase/index.js +10 -0
  549. package/dist/spec/usecase/index.js.map +1 -0
  550. package/dist/testing/cases/before-hook.d.ts +4 -0
  551. package/dist/testing/cases/before-hook.d.ts.map +1 -0
  552. package/dist/testing/cases/before-hook.js +71 -0
  553. package/dist/testing/cases/before-hook.js.map +1 -0
  554. package/dist/testing/cases/corpus.d.ts +12 -0
  555. package/dist/testing/cases/corpus.d.ts.map +1 -0
  556. package/dist/testing/cases/corpus.js +91 -0
  557. package/dist/testing/cases/corpus.js.map +1 -0
  558. package/dist/testing/cases/policy.d.ts +74 -0
  559. package/dist/testing/cases/policy.d.ts.map +1 -0
  560. package/dist/testing/cases/policy.js +142 -0
  561. package/dist/testing/cases/policy.js.map +1 -0
  562. package/dist/testing/cases/printer.d.ts +4 -0
  563. package/dist/testing/cases/printer.d.ts.map +1 -0
  564. package/dist/testing/cases/printer.js +32 -0
  565. package/dist/testing/cases/printer.js.map +1 -0
  566. package/dist/testing/cases/report-view.d.ts +5 -0
  567. package/dist/testing/cases/report-view.d.ts.map +1 -0
  568. package/dist/testing/cases/report-view.js +33 -0
  569. package/dist/testing/cases/report-view.js.map +1 -0
  570. package/dist/testing/cases/requisition.d.ts +4 -0
  571. package/dist/testing/cases/requisition.d.ts.map +1 -0
  572. package/dist/testing/cases/requisition.js +38 -0
  573. package/dist/testing/cases/requisition.js.map +1 -0
  574. package/dist/testing/cases/search-places.d.ts +4 -0
  575. package/dist/testing/cases/search-places.d.ts.map +1 -0
  576. package/dist/testing/cases/search-places.js +60 -0
  577. package/dist/testing/cases/search-places.js.map +1 -0
  578. package/dist/testing/cases/stock.d.ts +4 -0
  579. package/dist/testing/cases/stock.d.ts.map +1 -0
  580. package/dist/testing/cases/stock.js +35 -0
  581. package/dist/testing/cases/stock.js.map +1 -0
  582. package/dist/testing/cases/store.d.ts +4 -0
  583. package/dist/testing/cases/store.d.ts.map +1 -0
  584. package/dist/testing/cases/store.js +100 -0
  585. package/dist/testing/cases/store.js.map +1 -0
  586. package/dist/testing/harness.d.ts +94 -0
  587. package/dist/testing/harness.d.ts.map +1 -0
  588. package/dist/testing/harness.js +168 -0
  589. package/dist/testing/harness.js.map +1 -0
  590. package/dist/testing/index.d.ts +37 -0
  591. package/dist/testing/index.d.ts.map +1 -0
  592. package/dist/testing/index.js +43 -0
  593. package/dist/testing/index.js.map +1 -0
  594. package/dist/testing/report.d.ts +15 -0
  595. package/dist/testing/report.d.ts.map +1 -0
  596. package/dist/testing/report.js +22 -0
  597. package/dist/testing/report.js.map +1 -0
  598. package/dist/web/createRestSurface.d.ts +7 -0
  599. package/dist/web/createRestSurface.d.ts.map +1 -0
  600. package/dist/web/createRestSurface.js +39 -0
  601. package/dist/web/createRestSurface.js.map +1 -0
  602. package/dist/web/index.d.ts +2 -0
  603. package/dist/web/index.d.ts.map +1 -0
  604. package/dist/web/index.js +2 -0
  605. package/dist/web/index.js.map +1 -0
  606. package/docs/adr/0008-structured-diagnostic-shape.md +2 -2
  607. package/docs/adr/0011-adapter-port-spec.md +2 -2
  608. package/docs/adr/0014-auth-better-auth-and-multi-tenant-mcp.md +21 -2
  609. package/docs/adr/0019-sealed-manifest-runtime-pipeline.md +5 -1
  610. package/docs/adr/0021-retire-starter-scaffolding.md +1 -1
  611. package/docs/adr/0022-caller-observed-version-occ.md +1 -1
  612. package/docs/adr/0024-manifest-native-schema-tables.md +2 -2
  613. package/docs/adr/0026-progressive-generate.md +36 -0
  614. package/docs/adr/0027-scheduled-procedure-triggers.md +31 -0
  615. package/docs/adr/0028-schema-ttl-expiry.md +33 -0
  616. package/docs/adr/0029-mcp-apps-interaction-contracts.md +324 -0
  617. package/docs/adr/0030-store.md +40 -0
  618. package/docs/adr/0031-host-cloud-core-contract.md +25 -0
  619. package/docs/adr/0032-store-centric-core-and-service-contract.md +361 -0
  620. package/docs/adr/0033-storage-converges-to-the-plan.md +92 -0
  621. package/docs/adr/0034-store-is-authored-as-sql.md +192 -0
  622. package/docs/adr/0035-sql-dialects.md +154 -0
  623. package/docs/adr/0036-host-and-dialect.md +65 -0
  624. package/docs/adr/0037-postgresql-is-the-reference-dialect.md +124 -0
  625. package/docs/adr/0038-bun-native-host.md +63 -0
  626. package/docs/adr/README.md +26 -8
  627. package/docs/adr/adr-lite-861-admin-webmcp.md +6 -0
  628. package/docs/adr/adr-lite-909-admin-ui-kit.md +1 -1
  629. package/docs/examples/README.md +16 -18
  630. package/docs/examples/commerce-inventory.md +481 -0
  631. package/docs/examples/commerce.md +254 -0
  632. package/docs/examples/guarded-api.md +238 -0
  633. package/docs/examples/intake-hooks.md +237 -0
  634. package/docs/examples/intake.md +127 -0
  635. package/docs/examples/legal-documents.md +218 -0
  636. package/docs/examples/procurement.md +215 -0
  637. package/docs/examples/publication.md +211 -0
  638. package/docs/examples/reference-service/.dev.vars.example +4 -0
  639. package/docs/examples/reference-service/.mantle/generated/mantle.ts +174 -0
  640. package/docs/examples/reference-service/.mantle/generated/plan.json +1936 -0
  641. package/docs/examples/reference-service/README.md +33 -0
  642. package/docs/examples/reference-service/manifests/catalog.yaml +103 -0
  643. package/docs/examples/reference-service/manifests/orders.yaml +120 -0
  644. package/docs/examples/reference-service/mantle.config.json +1 -0
  645. package/docs/examples/reference-service/package.json +27 -0
  646. package/docs/examples/reference-service/smoke.mjs +156 -0
  647. package/docs/examples/reference-service/src/handlers.ts +36 -0
  648. package/docs/examples/reference-service/src/index.ts +33 -0
  649. package/docs/examples/reference-service/src/service.ts +78 -0
  650. package/docs/examples/{host-minimal-worker → reference-service}/tsconfig.json +7 -2
  651. package/docs/examples/reference-service/wrangler.jsonc +26 -0
  652. package/docs/examples/reservation.md +142 -0
  653. package/docs/handbook/cloudflare/authentication.md +96 -299
  654. package/docs/handbook/cloudflare/chatgpt-sites.md +104 -15
  655. package/docs/handbook/cloudflare/deploy-and-operate.md +77 -71
  656. package/docs/handbook/cloudflare/media-r2.md +64 -187
  657. package/docs/handbook/cloudflare/service-entry.md +138 -0
  658. package/docs/handbook/concepts/authorization.md +104 -94
  659. package/docs/handbook/concepts/four-atoms.md +68 -144
  660. package/docs/handbook/concepts/lifecycle-and-locales.md +62 -114
  661. package/docs/handbook/concepts/mcp-and-agents.md +112 -117
  662. package/docs/handbook/concepts/procedures-and-triggers.md +126 -181
  663. package/docs/handbook/concepts/runtime-and-adapters.md +177 -156
  664. package/docs/handbook/concepts/views.md +97 -173
  665. package/docs/handbook/examples/hub.md +17 -6
  666. package/docs/handbook/guides/admin-ui.md +101 -96
  667. package/docs/handbook/guides/agent-setup.md +56 -71
  668. package/docs/handbook/guides/typed-queries.md +105 -111
  669. package/docs/handbook/navigation.json +8 -32
  670. package/docs/handbook/reference/authorization.md +52 -271
  671. package/docs/handbook/reference/diagnostics.md +69 -173
  672. package/docs/handbook/reference/features.md +48 -50
  673. package/docs/handbook/reference/manifest.md +56 -116
  674. package/docs/handbook/reference/procedure.md +92 -229
  675. package/docs/handbook/reference/schema.md +156 -215
  676. package/docs/handbook/reference/site-config.md +58 -211
  677. package/docs/handbook/reference/surface.md +69 -181
  678. package/docs/handbook/reference/trigger.md +73 -162
  679. package/docs/handbook/reference/view.md +140 -241
  680. package/docs/handbook/releases/index.md +58 -22
  681. package/docs/handbook/start/overview.md +59 -48
  682. package/docs/handbook/start/project-and-cli.md +127 -116
  683. package/docs/handbook/start/quickstart-worker.md +102 -151
  684. package/docs/skills/develop/SKILL.md +114 -232
  685. package/docs/skills/develop/mcp-app.md +79 -0
  686. package/docs/skills/integrate/SKILL.md +96 -0
  687. package/docs/skills/media-gc/SKILL.md +21 -10
  688. package/docs/skills/provision/SKILL.md +68 -162
  689. package/docs/skills/update/SKILL.md +33 -34
  690. package/docs/upgrade-0.1-to-0.2.md +211 -0
  691. package/package.json +87 -105
  692. package/dist/admin-ui.d.ts +0 -2
  693. package/dist/admin-ui.d.ts.map +0 -1
  694. package/dist/admin-ui.js +0 -2
  695. package/dist/admin-ui.js.map +0 -1
  696. package/dist/admin.d.ts +0 -2
  697. package/dist/admin.d.ts.map +0 -1
  698. package/dist/admin.js +0 -2
  699. package/dist/admin.js.map +0 -1
  700. package/dist/auth.d.ts +0 -2
  701. package/dist/auth.d.ts.map +0 -1
  702. package/dist/auth.js +0 -2
  703. package/dist/auth.js.map +0 -1
  704. package/dist/bun.d.ts +0 -2
  705. package/dist/bun.d.ts.map +0 -1
  706. package/dist/bun.js +0 -2
  707. package/dist/bun.js.map +0 -1
  708. package/dist/cli/harness.d.ts +0 -3
  709. package/dist/cli/harness.d.ts.map +0 -1
  710. package/dist/cli/harness.js +0 -214
  711. package/dist/cli/harness.js.map +0 -1
  712. package/dist/cli/skills.d.ts +0 -3
  713. package/dist/cli/skills.d.ts.map +0 -1
  714. package/dist/cli/skills.js +0 -128
  715. package/dist/cli/skills.js.map +0 -1
  716. package/dist/cloudflare.d.ts +0 -2
  717. package/dist/cloudflare.d.ts.map +0 -1
  718. package/dist/cloudflare.js +0 -2
  719. package/dist/cloudflare.js.map +0 -1
  720. package/dist/codegen/emitMantleModule.d.ts +0 -22
  721. package/dist/codegen/emitMantleModule.d.ts.map +0 -1
  722. package/dist/codegen/emitMantleModule.js +0 -291
  723. package/dist/codegen/emitMantleModule.js.map +0 -1
  724. package/dist/codegen.d.ts +0 -2
  725. package/dist/codegen.d.ts.map +0 -1
  726. package/dist/codegen.js +0 -2
  727. package/dist/codegen.js.map +0 -1
  728. package/dist/runtime-testing.d.ts +0 -2
  729. package/dist/runtime-testing.d.ts.map +0 -1
  730. package/dist/runtime-testing.js +0 -2
  731. package/dist/runtime-testing.js.map +0 -1
  732. package/dist/runtime.d.ts +0 -2
  733. package/dist/runtime.d.ts.map +0 -1
  734. package/dist/runtime.js +0 -2
  735. package/dist/runtime.js.map +0 -1
  736. package/dist/spec.d.ts +0 -2
  737. package/dist/spec.d.ts.map +0 -1
  738. package/dist/spec.js +0 -2
  739. package/dist/spec.js.map +0 -1
  740. package/dist/vercel-libsql.d.ts +0 -2
  741. package/dist/vercel-libsql.d.ts.map +0 -1
  742. package/dist/vercel-libsql.js +0 -2
  743. package/dist/vercel-libsql.js.map +0 -1
  744. package/dist/vercel.d.ts +0 -2
  745. package/dist/vercel.d.ts.map +0 -1
  746. package/dist/vercel.js +0 -2
  747. package/dist/vercel.js.map +0 -1
  748. package/dist/web.d.ts +0 -2
  749. package/dist/web.d.ts.map +0 -1
  750. package/dist/web.js +0 -2
  751. package/dist/web.js.map +0 -1
  752. package/docs/adapter-guide.md +0 -222
  753. package/docs/agent-prompts.md +0 -102
  754. package/docs/api-mcp-authorization.md +0 -5
  755. package/docs/assets/mantle-admin-developer.png +0 -0
  756. package/docs/assets/mantle-admin-operations.png +0 -0
  757. package/docs/assets/mantle-hero.jpg +0 -0
  758. package/docs/auth-hosting-model.md +0 -166
  759. package/docs/cloudflare-low-level-composition.md +0 -5
  760. package/docs/consumer-onboarding-audit.md +0 -65
  761. package/docs/deferred-lifecycle-queues.md +0 -5
  762. package/docs/design-atoms.md +0 -16
  763. package/docs/design-references/editorial-blog-2026-05-05.md +0 -218
  764. package/docs/direct-authoring.md +0 -5
  765. package/docs/examples/builtin-commerce.md +0 -269
  766. package/docs/examples/builtin-intake.md +0 -143
  767. package/docs/examples/builtin-legal-documents.md +0 -189
  768. package/docs/examples/builtin-procurement.md +0 -241
  769. package/docs/examples/builtin-publication.md +0 -241
  770. package/docs/examples/builtin-reservation.md +0 -149
  771. package/docs/examples/cf-primitives-commerce-inventory.md +0 -809
  772. package/docs/examples/cf-primitives-guarded-api.md +0 -429
  773. package/docs/examples/cf-primitives-intake-hooks.md +0 -319
  774. package/docs/examples/host-chatgpt-sites/.openai/hosting.json +0 -1
  775. package/docs/examples/host-chatgpt-sites/README.md +0 -70
  776. package/docs/examples/host-chatgpt-sites/drizzle/0000_sites_users.sql +0 -8
  777. package/docs/examples/host-chatgpt-sites/drizzle/0001_mantle.sql +0 -294
  778. package/docs/examples/host-chatgpt-sites/drizzle/0002_article_cover.sql +0 -5
  779. package/docs/examples/host-chatgpt-sites/drizzle/0003_store_instance_id.sql +0 -1
  780. package/docs/examples/host-chatgpt-sites/drizzle/meta/_journal.json +0 -1
  781. package/docs/examples/host-chatgpt-sites/manifests/site.yaml +0 -27
  782. package/docs/examples/host-chatgpt-sites/package.json +0 -1
  783. package/docs/examples/host-chatgpt-sites/public/site.css +0 -1
  784. package/docs/examples/host-chatgpt-sites/scripts/build.mjs +0 -13
  785. package/docs/examples/host-chatgpt-sites/scripts/check.mjs +0 -101
  786. package/docs/examples/host-chatgpt-sites/scripts/migration.mjs +0 -9
  787. package/docs/examples/host-chatgpt-sites/src/chatgpt-auth.ts +0 -63
  788. package/docs/examples/host-chatgpt-sites/src/index.ts +0 -46
  789. package/docs/examples/host-chatgpt-sites/src/mcp.ts +0 -49
  790. package/docs/examples/host-chatgpt-sites/src/media.ts +0 -109
  791. package/docs/examples/host-chatgpt-sites/src/r2-lab.ts +0 -38
  792. package/docs/examples/host-chatgpt-sites/src/storage-fingerprint.json +0 -1
  793. package/docs/examples/host-chatgpt-sites/src/web.ts +0 -35
  794. package/docs/examples/host-chatgpt-sites/tsconfig.json +0 -1
  795. package/docs/examples/host-chatgpt-sites/wrangler.jsonc +0 -10
  796. package/docs/examples/host-local-admin-otp/.dev.vars.example +0 -3
  797. package/docs/examples/host-local-admin-otp/README.md +0 -80
  798. package/docs/examples/host-local-admin-otp/ensure-dev-vars.mjs +0 -5
  799. package/docs/examples/host-local-admin-otp/manifests/site.yaml +0 -25
  800. package/docs/examples/host-local-admin-otp/package.json +0 -29
  801. package/docs/examples/host-local-admin-otp/public/.gitkeep +0 -1
  802. package/docs/examples/host-local-admin-otp/smoke.mjs +0 -141
  803. package/docs/examples/host-local-admin-otp/src/index.ts +0 -54
  804. package/docs/examples/host-local-admin-otp/tsconfig.json +0 -17
  805. package/docs/examples/host-local-admin-otp/wrangler.jsonc +0 -23
  806. package/docs/examples/host-minimal-worker/README.md +0 -41
  807. package/docs/examples/host-minimal-worker/manifests/site.yaml +0 -25
  808. package/docs/examples/host-minimal-worker/package.json +0 -26
  809. package/docs/examples/host-minimal-worker/smoke.mjs +0 -23
  810. package/docs/examples/host-minimal-worker/src/index.ts +0 -4
  811. package/docs/examples/host-minimal-worker/wrangler.jsonc +0 -22
  812. package/docs/handbook/chatgpt-sites/equipment-checkout.md +0 -231
  813. package/docs/handbook/chatgpt-sites/host-reference.md +0 -113
  814. package/docs/handbook/chatgpt-sites/index.md +0 -123
  815. package/docs/handbook/cloudflare/bindings.md +0 -298
  816. package/docs/handbook/cloudflare/conventional-worker.md +0 -162
  817. package/docs/handbook/cloudflare/deferred-hooks-queues.md +0 -170
  818. package/docs/handbook/cloudflare/low-level-composition.md +0 -169
  819. package/docs/handbook/cloudflare/public-web.md +0 -144
  820. package/docs/handbook/cloudflare/site-chrome.md +0 -75
  821. package/docs/handbook/examples/commerce-transaction.md +0 -11
  822. package/docs/handbook/examples/commerce.md +0 -11
  823. package/docs/handbook/examples/guarded-api.md +0 -10
  824. package/docs/handbook/examples/intake-form.md +0 -12
  825. package/docs/handbook/examples/intake-hooks.md +0 -11
  826. package/docs/handbook/examples/legal-documents.md +0 -10
  827. package/docs/handbook/examples/procurement-approvals.md +0 -10
  828. package/docs/handbook/examples/publication.md +0 -10
  829. package/docs/handbook/examples/reservation.md +0 -10
  830. package/docs/handbook/start/quickstart-admin.md +0 -50
  831. package/docs/labels.md +0 -71
  832. package/docs/media-uploads.md +0 -5
  833. package/docs/migration-0.1.2.md +0 -13
  834. package/docs/performance-harness.md +0 -228
  835. package/docs/release-process.md +0 -244
  836. package/docs/schema-indexes.md +0 -5
  837. package/docs/sealed-pipeline-ownership.md +0 -101
  838. package/docs/skills/plugin/SKILL.md +0 -132
  839. package/docs/skills/theme/SKILL.md +0 -77
  840. package/docs/spec-only-host-adoption.md +0 -157
  841. package/docs/transaction-patterns.md +0 -5
  842. package/skills/README.md +0 -125
  843. package/skills/develop/SKILL.md +0 -250
  844. package/skills/install/SKILL.md +0 -149
  845. package/skills/media-gc/SKILL.md +0 -85
  846. package/skills/plugin/SKILL.md +0 -132
  847. package/skills/provision/SKILL.md +0 -194
  848. package/skills/theme/SKILL.md +0 -77
  849. package/skills/update/SKILL.md +0 -51
@@ -1,29 +1,118 @@
1
1
  ---
2
- description: "Mantle on ChatGPT Sites now has its own integration guide."
2
+ description: Run a Mantle 0.2.0 service on ChatGPT Sites — the Cloudflare preset with a custom identity over Sites sign-in, D1 schema delivery, R2 media, MCP paths, and what to verify after each publish.
3
3
  ---
4
4
  # Mantle on ChatGPT Sites
5
5
 
6
- ChatGPT Sites has a dedicated section in the Mantle handbook. Start with
7
- [Mantle on ChatGPT Sites](../chatgpt-sites/index.md) for installation, supported
8
- capabilities, and your first published article. This page preserves earlier
9
- links to the host checklist.
6
+ A ChatGPT Site runs a Cloudflare Worker with D1 and R2 bindings, and Sites owns
7
+ sign-in and deployment. Mantle runs there as the ordinary Cloudflare preset
8
+ with `identity: custom`: Sites authenticates the person, and your
9
+ `src/identity.ts` turns that into a Mantle `Caller`. There is no Sites option in
10
+ `mantle generate` and no Sites code in Core.
10
11
 
11
- ## First deployment
12
+ This page is a guide, not a runnable example. Inspect the Site's actual
13
+ hosting configuration and bindings before relying on any detail here, and
14
+ verify every claim on the deployed Site.
12
15
 
13
- See [the host deployment checklist](../chatgpt-sites/host-reference.md#first-deployment).
16
+ ## Generate
14
17
 
15
- ## Media with only an R2 binding
18
+ ```sh
19
+ pnpm exec mantle generate --identity custom --features mcp,admin,web
20
+ ```
16
21
 
17
- See [R2 media integration](../chatgpt-sites/host-reference.md#media-with-only-an-r2-binding).
22
+ Keep the application outside the Mantle SDK checkout, pin every
23
+ `@aotter/mantle*` package to one exact version, and publish through Sites; do
24
+ not `wrangler deploy` a Site's Worker yourself.
18
25
 
19
- ## Remote MCP is a separate gate
26
+ ## Identity: Sites sign-in as a `CallerResolver`
20
27
 
21
- See [MCP support and authentication](../chatgpt-sites/host-reference.md#remote-mcp-is-a-separate-gate).
28
+ Sites' ingress authenticates the visitor and forwards the identity in
29
+ `oai-authenticated-user-*` headers. Trust them **only** when every request
30
+ reaches the Worker through that ingress, which strips caller-supplied copies;
31
+ never expose the Worker on another route.
22
32
 
23
- ## Capability boundaries
33
+ Staff roles are the application's: keep them in your own table (here
34
+ `sites_users (id, email, role)`, created by your own migration) and read them
35
+ on every request. A Site viewer is not automatically a Mantle editor.
24
36
 
25
- See [host capability boundaries](../chatgpt-sites/host-reference.md#capability-boundaries).
37
+ ```ts
38
+ // src/identity.ts
39
+ import type { CallerResolver } from "@aotter/mantle";
26
40
 
27
- ## Source
41
+ export function sitesResolver(db: D1Database, ownerEmail: string | undefined): CallerResolver {
42
+ return async (request) => {
43
+ const sub = request.headers.get("oai-authenticated-user-id");
44
+ const email = request.headers.get("oai-authenticated-user-email")?.trim().toLowerCase();
45
+ if (!sub) return { caller: { kind: "anonymous" } };
46
+ if (!email || sub.length > 512) return { invalid: true };
47
+ const subject = `chatgpt:${sub}`; // namespaced: unique across issuers, never the email
48
+ await db.prepare("INSERT INTO sites_users (id, email, role) VALUES (?1, ?2, ?3) ON CONFLICT (id) DO NOTHING")
49
+ .bind(subject, email, email === ownerEmail?.trim().toLowerCase() ? "owner" : null).run();
50
+ const row = await db.prepare("SELECT role FROM sites_users WHERE id = ?1").bind(subject).first<{ role: "owner" | "editor" | "contributor" | null }>();
51
+ return { caller: { kind: "user", subject, role: row?.role ?? null, scopes: [], credential: "session", credentialId: null, clientId: null } };
52
+ };
53
+ }
54
+ ```
28
55
 
29
- See [integration sources](../chatgpt-sites/host-reference.md#source).
56
+ In `src/service.ts`, use `sitesResolver(env.DB, env.OWNER_EMAIL)` where the
57
+ preset uses `resolveCaller`. The email is used only to recognize the first
58
+ owner. To manage staff from Admin, implement `AdminIdentity`'s `directory` and
59
+ `roles` facets (from `@aotter/mantle/admin`) over `sites_users` and pass it as
60
+ `identity`; without it Admin hides user management.
61
+
62
+ A Sites session is a browser session. It is not an OAuth bearer token, so it
63
+ does not authenticate a remote MCP client.
64
+
65
+ ## Storage on D1
66
+
67
+ Boot converges Schema tables to the plan. If the Site applies schema changes
68
+ through migration files instead of letting the Worker run DDL, deliver
69
+ Mantle's SQL that way:
70
+
71
+ 1. Point `mantle generate --check --database <file>` at a local SQLite file
72
+ in the same state as the Site's database (for example local D1 under
73
+ `.wrangler/state/v3/d1/`, migrated the same way).
74
+ 2. Put the printed SQL into a new migration in the Site's migration directory,
75
+ together with your own tables (`sites_users`).
76
+ 3. Publish; boot then finds the database converged and applies nothing.
77
+
78
+ Repeat for each plan change. A blocked change is resolved by hand, as in
79
+ [Deploy and operate](./deploy-and-operate.md#resolving-a-blocked-change).
80
+
81
+ ## Media
82
+
83
+ `r2MediaStorage` presigns uploads with R2's S3 API, which needs an S3
84
+ endpoint and an API key pair. With only an R2 binding, implement the
85
+ `MediaStorage` port yourself (`createUpload`, `commitUpload`, `deleteObject`)
86
+ and add two routes to your service:
87
+
88
+ - an authenticated, same-origin `PUT` route that checks the pending upload,
89
+ the declared type and the exact size before `bucket.put`;
90
+ - a public `GET` route that serves only committed variants, with a safe type
91
+ and `nosniff`.
92
+
93
+ Pass it as `media` to `createAdminSurface` and declare media purposes in the
94
+ site defaults ([Media uploads with R2](./media-r2.md)).
95
+
96
+ ## MCP paths
97
+
98
+ Try `/mcp` first. If the Site does not route it to the Worker, mount the
99
+ public surface at another path you own (`createMcpSurface(runtime, { basePath:
100
+ "/agent/mcp", surface: "public" })`) and report the real paths through
101
+ `createAdminSurface`'s `site: { mcpEndpoints }`. Admin and its browser tools
102
+ work with the Sites session. A remote staff MCP client (`/mcp/staff`)
103
+ needs a real OAuth authorization server and bearer verification in your
104
+ resolver; a forwarded identity header is not one.
105
+
106
+ ## Verify after every publish
107
+
108
+ - Anonymous: a public View, an HTTP Trigger, `/mcp` (or your path)
109
+ `initialize` and `tools/list` when a public tool may be called anonymously;
110
+ when every public tool `requires` a caller, they answer 401 with a
111
+ `WWW-Authenticate` challenge instead.
112
+ - The owner: `GET /admin/api/me` is `owner`; a staff View and an operation.
113
+ - A second account: no Admin access until granted; revoking the role takes
114
+ effect on the next request.
115
+ - Every binding the service uses, on the deployed Site, not only locally.
116
+
117
+ Sites lists financial transactions among its unsupported uses; a working
118
+ sandbox flow is not support for live payments.
@@ -1,104 +1,110 @@
1
1
  ---
2
- description: Production checklist, the check loop, deploy and post-deploy probes, day-to-day content operations, and version pins.
2
+ description: Deploy a Mantle 0.2.0 service to Cloudflare Workers, change Schemas safely with storage convergence, resolve a blocked change, and operate schedules, expiry and the boot handshake.
3
3
  ---
4
4
  # Deploy and operate
5
5
 
6
- This page is the production checklist for a Mantle Worker on Cloudflare: what to pin and configure, which checks to run before `wrangler deploy`, how to verify a deployment, how content is operated afterwards, and how to move versions.
6
+ ## First deploy
7
7
 
8
- ## Before the first deploy
8
+ ```sh
9
+ pnpm exec mantle generate --check # nothing stale
10
+ pnpm exec tsc --noEmit
11
+ pnpm exec wrangler d1 create my-service # copy database_id into wrangler.jsonc's d1_databases[0]
12
+ pnpm exec wrangler secret put BETTER_AUTH_SECRET # identity mantle
13
+ pnpm exec wrangler secret put ADMIN_EMAIL
14
+ pnpm exec wrangler deploy
15
+ ```
9
16
 
10
- - Pin every `@aotter/mantle*` package to one exact version and commit the lockfile. Install with `pnpm install --frozen-lockfile` (or `npm ci`) from then on. See [Project and CLI](../start/project-and-cli.md).
11
- - Set `PUBLIC_ORIGIN` to the real HTTPS origin, without a trailing slash. It drives canonical URLs, `.md` mirrors, `llms.txt`, the MCP resource and the OAuth callback. If a static documentation build also emits absolute URLs, give it the same value.
12
- - Set the production D1 `database_id` (and `account_id` if your deployment needs it) in `wrangler.jsonc`. A local `database_name` is not a production identifier, and local D1 is not production data.
13
- - Choose production Auth: replace local console email delivery with a real `EmailSender`, or configure `MANTLE_AUTH_MODE` for GitHub OAuth or hosted Auth. Store secrets with `wrangler secret put`. See [Authentication](./authentication.md).
14
- - Keep `compatibility_flags: ["nodejs_compat", "global_fetch_strictly_public"]`.
15
- - Enable observability:
17
+ With dialect `postgres`, create the Hyperdrive config instead of the D1
18
+ database (`pnpm exec wrangler hyperdrive create my-service --caching-disabled
19
+ --connection-string=…`) and copy its id into `hyperdrive[0].id`.
16
20
 
17
- ```jsonc
18
- "observability": { "enabled": true, "logs": { "head_sampling_rate": 1 } },
19
- "upload_source_maps": true
20
- ```
21
+ Set `PUBLIC_ORIGIN` in `wrangler.jsonc` `vars` to the deployed origin, and
22
+ replace the console email sender first
23
+ ([Authentication](./authentication.md#production)). The first request boots
24
+ the runtime, which creates every table the plan needs on the empty database.
21
25
 
22
- ## The check loop
26
+ Deploying anywhere is your choice: Cloudflare and Bun have generated presets,
27
+ `host: none` composes any other, and you may always self-host. Mantle Cloud is one option, never a
28
+ requirement.
23
29
 
24
- Run the project's `check` script before every deploy. The minimal reference chains:
30
+ ## Changing Schemas
25
31
 
26
- ```sh
27
- mantle generate && mantle generate --check && mantle validate \
28
- && mantle skills && mantle skills --check && tsc --noEmit && node smoke.mjs
29
- ```
32
+ There are no migration files. Edit the manifests, run `mantle generate`, and
33
+ deploy. The first request after a plan change compares the database with the
34
+ plan:
30
35
 
31
- Add tests and the frontend build where the project has them, then confirm index coverage for every public View:
36
+ - **Applied**: a new Schema table, a new field column, a new index, a new
37
+ unique index that existing rows satisfy, new `checks` and search triggers.
38
+ - **Blocked** (`STORAGE_CHANGE_BLOCKED`, the service refuses to serve): a
39
+ unique index that existing rows break, a field whose type changed, an index
40
+ whose columns changed under the same name, an undeclared unique index.
41
+ - **Kept, with a warning**: a column or non-unique index the plan no longer
42
+ declares. Nothing is dropped.
43
+
44
+ Before deploying, see what boot will do against a local SQLite file, such as
45
+ Wrangler's local D1 under `.wrangler/state/v3/d1/` after it has run the
46
+ previous plan:
32
47
 
33
48
  ```sh
34
- pnpm exec mantle-harness indexes --require-public --format text
49
+ pnpm exec mantle generate --check --database .wrangler/state/v3/d1/<…>.sqlite
35
50
  ```
36
51
 
37
- A required path fails on a required Schema-table scan, a temporary sort or an unindexed data-field predicate. Then dry-run and deploy:
52
+ It prints the SQL boot would run, the undeclared differences as comments, or
53
+ the blocked change (exit 1). It reads the file read-only. The dry run is the
54
+ SQLite dialect's; PostgreSQL has none.
38
55
 
39
- This local SQLite check intentionally runs without planner statistics. Treat it
40
- as a conservative preflight; use post-deploy D1 metrics for production cost and
41
- latency claims.
56
+ ### Resolving a blocked change
42
57
 
43
- ```sh
44
- wrangler deploy --dry-run
45
- wrangler deploy
46
- ```
58
+ Mantle verifies; you change. The diagnostic names the change and hints SQL
59
+ that would reach the plan. For example, to make `email` unique when duplicates
60
+ exist: remove the duplicates (with a Procedure run as the system caller, or
61
+ `wrangler d1 execute`), then deploy again; boot creates the index. To rename a
62
+ field: add the new field, copy the data with a Procedure or SQL, then drop the
63
+ old field from the manifest (its column stays, unused). Never edit `_mantle_*`
64
+ tables.
47
65
 
48
- ## Post-deploy verification
66
+ ### Hosts that refuse DDL from the Worker
49
67
 
50
- Probe the deployed origin, not `wrangler dev`. Run only the probes for surfaces
51
- the application mounts and configures:
68
+ If a host applies schema changes only through its own migration mechanism,
69
+ take the SQL `mantle generate --check --database` prints and deliver it
70
+ through that mechanism; boot then finds the database converged.
52
71
 
53
- | Probe | Expect |
54
- |---|---|
55
- | `GET /api/views/<public-view>` | `200`, `{ "ok": true, "data": { "rows": [...] } }` |
56
- | `GET /<locale>/<segment>/<slug>` and `GET /<locale>/<segment>/<slug>.md` | `200` HTML and Markdown for a published entry |
57
- | `GET /llms.txt`, `GET /sitemap.xml`, `GET /robots.txt` | `200` |
58
- | `GET /<locale>/<segment>/does-not-exist` | `404` from your `notFoundRenderer` |
59
- | `POST /mcp/staff` without credentials | `401` with `WWW-Authenticate`; `GET /mcp` is `405` |
60
- | `GET /admin` | Sign-in page; sign in with the `ADMIN_GITHUB_LOGIN` account |
72
+ ## Schedules
61
73
 
62
- Then check the cache: a second anonymous `GET` of a public page should show `cf-cache-status: HIT`; publish a change in Admin and the next request should be a `MISS`. Sample latency with:
74
+ `wrangler.jsonc` `triggers.crons` holds the Cloudflare spelling of every
75
+ enabled schedule Trigger. `mantle generate` warns when it drifts from the plan;
76
+ update it by hand (the file is yours). Locally:
63
77
 
64
78
  ```sh
65
- pnpm exec mantle-harness http --base-url https://example.com \
66
- --route recent=/api/views/recent-posts --route page=/en/posts/hello --rounds 20 --warmup 2
79
+ pnpm exec wrangler dev --local --test-scheduled
80
+ curl 'http://127.0.0.1:8787/__scheduled?cron=0+3+*+*+1'
67
81
  ```
68
82
 
69
- ## Operating content
70
-
71
- Sign in to Admin with a staff account. Publishing collections (`lifecycle: publishing`) follow draft, publish, verify:
83
+ The cron in the URL is the Cloudflare spelling.
72
84
 
73
- 1. Create a draft with its title, slug, locale and body.
74
- 2. Publish (`editor` or above). The write purges the deployment-scoped public cache tag.
75
- 3. Open the public URL and its `.md` mirror. Drafts never appear on pages, mirrors, `llms.txt` or the sitemap; use `?preview=1` with a staff session to see one.
76
- 4. Unpublish removes the entry from every public surface; the Admin delete action and the Staff MCP `archive_entry` tool retire it.
85
+ ## Expired rows
77
86
 
78
- Operational collections (`lifecycle: operational`) have no publish step; records are edited in place and do not purge the public cache. The same operations are available to agents through Staff MCP; see [MCP and agents](../concepts/mcp-and-agents.md).
87
+ TTL hides expired rows at once. To delete them, call
88
+ `ctx.store.sweepExpired({ collection, limit })` in a schedule Trigger's `ref`
89
+ handler (the system caller's Store has it), or `runtime.store.sweepExpired` from
90
+ your own maintenance route, page with `nextCursor`, and use
91
+ `delete: false` to count first.
79
92
 
80
- Site settings split by owner. Brand, title and description seed once from `siteDefaults` and are then edited in Admin (`owner`); each edit purges the public cache. Origin, icons, locales and media purposes are code-owned and re-sync from `siteDefaults` on every boot, so change them in the Worker and redeploy. Analytics, pixels and search-engine verification are host chrome, not Core settings; see [Site chrome](./site-chrome.md) and [Site config](../reference/site-config.md).
93
+ ## The boot handshake
81
94
 
82
- ## Changing versions
95
+ `runtime.bootReport()` returns `{ fingerprint, coreVersion }`. Pass
96
+ `expectedFingerprint` to `createMantle` to refuse booting any plan but the one
97
+ you built (`PLAN_FINGERPRINT_MISMATCH`). The fingerprint is in
98
+ `.mantle/generated/plan.json`; reformatting a manifest does not change it.
83
99
 
84
- Pin every selected `@aotter/mantle*` package to one exact version and keep them together. This handbook describes the snapshot in this source tree; use the docs that ship with the version you install.
100
+ ## Mantle Cloud
85
101
 
86
- 1. Pin the new exact release for every selected package and update the lockfile through the package manager; review peer ranges.
87
- 2. Keep application source, Worker/D1/KV identity, origins, auth mode and secrets.
88
- 3. Run `mantle generate`, `generate --check`, `skills`, `skills --check`, `validate`, typecheck and tests.
89
- 4. Test local routes and authorization, then deploy.
102
+ Deploying a 0.2.0 service to Mantle Cloud needs Cloud's host protocol 3, which
103
+ uploads the compiled plan and the service entry. Mantle Cloud does not accept
104
+ 0.2.0 services yet. The plugin's `mantle` skill and its helper script check
105
+ the plan and the installed Core version so a project is ready when it does.
90
106
 
91
- Each Manifest Schema is a native table. Safe additive storage changes deploy online. Destructive changes — including any `uniqueIndexes` tuple add, remove, reorder or rewrite — are rejected; rebuild the instance and move required data outside Mantle. There is no in-product data-move workflow.
107
+ ## Moving data from 0.1.x
92
108
 
93
- ## Source
94
- - [`packages/mantle/README.md`](../../../packages/mantle/README.md)
95
- - [`packages/adapters/cloudflare/README.md`](../../../packages/adapters/cloudflare/README.md)
96
- - [`docs/direct-authoring.md`](../../../docs/direct-authoring.md)
97
- - [`docs/performance-harness.md`](../../../docs/performance-harness.md)
98
- - [`docs/examples/host-minimal-worker/README.md`](../../../docs/examples/host-minimal-worker/README.md)
99
- - [`docs/examples/host-minimal-worker/package.json`](../../../docs/examples/host-minimal-worker/package.json)
100
- - [`docs/examples/host-minimal-worker/wrangler.jsonc`](../../../docs/examples/host-minimal-worker/wrangler.jsonc)
101
- - [`docs/examples/host-minimal-worker/smoke.mjs`](../../../docs/examples/host-minimal-worker/smoke.mjs)
102
- - [`packages/mantle-spec/src/domain/model/SiteConfig.ts`](../../../packages/mantle-spec/src/domain/model/SiteConfig.ts)
103
- - [`packages/mantle-admin/src/mountMantleAdmin.ts`](../../../packages/mantle-admin/src/mountMantleAdmin.ts)
104
- - [`packages/adapters/cloudflare/src/oauth/cachePolicy.ts`](../../../packages/adapters/cloudflare/src/oauth/cachePolicy.ts)
109
+ Give the 0.2.0 service a new database and import through
110
+ `runtime.store`; `docs/upgrade-0.1-to-0.2.md` describes the steps.
@@ -1,216 +1,93 @@
1
1
  ---
2
- description: Enable staff media uploads on R2 — presigned PUT flow through Staff MCP, media purposes, wrangler config, commit cost and cleanup.
2
+ description: Media uploads in Mantle 0.2.0 on Cloudflare R2 — site media purposes, r2MediaStorage, wiring Admin's media routes, the presigned upload flow, and what to store in a Schema.
3
3
  ---
4
4
  # Media uploads with R2
5
5
 
6
- R2-backed media is an optional post-launch capability for Workers whose staff or agents need to upload images and files. This page covers the native Cloudflare direct-to-R2 flow, the configuration it needs, how a Schema references an asset, what a commit costs, and how to clean up. For ChatGPT Sites with an R2 binding but no S3 credentials, use [the same-origin Worker flow](../chatgpt-sites/host-reference.md#media-with-only-an-r2-binding).
6
+ Media is optional. It needs three things in `src/service.ts`: site defaults
7
+ with media purposes, an `r2MediaStorage`, and both passed where they belong.
8
+ The bytes go from the uploader straight to R2; the Worker never proxies them.
7
9
 
8
- ## When to enable it
10
+ ## 1. A public bucket and S3 credentials
9
11
 
10
- Turn this on only after the site already has a working deploy, staff auth configured, and a real need for staff-managed media. R2 setup may require billing, so it is deliberately not part of the first-deploy path. Everything on this page is inert until the bucket, credentials and at least one media purpose all exist.
12
+ - An R2 bucket served publicly, from a custom domain or `pub-<hash>.r2.dev`.
13
+ That URL is `publicBase`.
14
+ - An R2 API token with write access to the bucket, for presigning PUT URLs:
15
+ `R2_ACCESS_KEY_ID` and `R2_SECRET_ACCESS_KEY` as Worker secrets.
16
+ - A CORS rule on the bucket that allows `PUT` with `Content-Type` from your
17
+ Admin's origin, if a browser uploads.
11
18
 
12
- Media maintenance also needs an agent that can read local files, process images and make outbound `PUT` requests to `*.r2.cloudflarestorage.com`. A sandboxed agent without egress cannot finish the flow.
13
-
14
- ## The upload flow
15
-
16
- ```txt
17
- 1. create_media_upload staff MCP -> purpose, variants, mime types, byte sizes
18
- 2. Mantle -> signed upload URLs + required headers
19
- 3. agent or browser -> PUT bytes directly to R2
20
- 4. commit_media_upload staff MCP -> validate, stamp, save the asset row
21
- ```
22
-
23
- Bytes travel from the agent to R2 over a signed URL; the Worker sees policy, not payload. Never pass image bytes or base64 payloads through MCP tool arguments — the tool dispatchers count streamed JSON bytes and return `413` above the 1 MiB control-plane limit. The Worker validates; the agent runtime does the file work.
24
-
25
- ## Cloudflare setup
26
-
27
- ```sh
28
- wrangler r2 bucket create <project>-media
29
- wrangler r2 bucket dev-url enable <project>-media
30
- ```
31
-
32
- Then create an R2 S3 API token in the dashboard: open **R2**, open **Manage R2 API Tokens**, create an **Object Read & Write** token, and copy the Access Key ID and Secret Access Key.
33
-
34
- The R2 binding alone cannot issue presigned `PUT` URLs: presigning is an S3-protocol operation, so this **direct-to-R2 adapter** needs these credentials in addition to the binding. This is not a requirement of Mantle's `MediaStorage` port: a host may return an authenticated same-origin Worker `PUT` URL instead. Media tools appear whenever `mediaStorage` and a media purpose are bound, regardless of which transport the adapter uses.
35
-
36
- ## Wrangler configuration
37
-
38
- ```toml
39
- [vars]
40
- R2_ACCOUNT_ID = "<account-id>"
41
- MEDIA_PUBLIC_URL_BASE = "https://pub-<hash>.r2.dev"
42
-
43
- [[r2_buckets]]
44
- binding = "MEDIA_BUCKET"
45
- bucket_name = "<project>-media"
46
- ```
47
-
48
- A `wrangler.jsonc` project writes the same binding as an `"r2_buckets"` array; see [Bindings and primitives](./bindings.md#r2-media-bucket-optional) for the JSON form and the matching `Env` fields.
49
-
50
- ```sh
51
- wrangler secret put R2_ACCESS_KEY_ID
52
- wrangler secret put R2_SECRET_ACCESS_KEY
19
+ ```jsonc
20
+ // wrangler.jsonc
21
+ "r2_buckets": [{ "binding": "MEDIA", "bucket_name": "my-media" }],
22
+ "vars": { "MEDIA_PUBLIC_BASE": "https://media.example.com", "R2_ENDPOINT": "https://my-media.<account>.r2.cloudflarestorage.com" }
53
23
  ```
54
24
 
55
- `MEDIA_PUBLIC_URL_BASE` is the origin public URLs are built from — the `r2.dev` development URL, or a custom domain in production. `R2_ACCOUNT_ID` builds the S3 endpoint, which is a different host from the public one.
56
-
57
- ## Wiring `R2MediaStorage`
58
-
59
- Build the adapter from `env`, returning `undefined` when any part is missing so a half-configured environment degrades to no media rather than failing to boot:
25
+ ## 2. Wire it
60
26
 
61
27
  ```ts
62
- import { R2MediaStorage } from "@aotter/mantle/cloudflare";
63
28
  import { AwsClient } from "aws4fetch";
64
-
65
- function buildMediaStorage(env: Env) {
66
- if (
67
- !env.MEDIA_BUCKET ||
68
- !env.R2_ACCOUNT_ID ||
69
- !env.R2_ACCESS_KEY_ID ||
70
- !env.R2_SECRET_ACCESS_KEY ||
71
- !env.MEDIA_PUBLIC_URL_BASE
72
- ) {
73
- return undefined;
74
- }
75
-
76
- const s3 = new AwsClient({
77
- accessKeyId: env.R2_ACCESS_KEY_ID,
78
- secretAccessKey: env.R2_SECRET_ACCESS_KEY,
79
- region: "auto",
80
- service: "s3",
81
- });
82
-
83
- return new R2MediaStorage(
84
- env.MEDIA_BUCKET,
85
- s3,
86
- `https://<project>-media.${env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`,
87
- env.MEDIA_PUBLIC_URL_BASE,
88
- );
89
- }
90
- ```
91
-
92
- Pass it through the `bindings` hook, spreading the conventional set:
93
-
94
- ```ts
95
- export default createMantleWorker<Env>({
96
- plan,
97
- bindings: (env, conventional) => ({
98
- ...conventional,
99
- mediaStorage: buildMediaStorage(env),
100
- }),
29
+ import { d1Storage, r2MediaStorage } from "@aotter/mantle/cloudflare";
30
+
31
+ // storage, with the purposes uploads may use
32
+ export const mantle = createMantle(service, {
33
+ plan, schedules: true,
34
+ storage: (env) => d1Storage(env.DB, { site: {
35
+ title: "My site",
36
+ media: { purposes: [{ name: "cover", required: ["image/webp", "image/jpeg,image/png"], maxBytes: { "image/webp": 2_000_000, "image/jpeg": 2_000_000, "image/png": 2_000_000 } }] },
37
+ } }),
101
38
  });
102
- ```
103
-
104
- `aws4fetch` is an application dependency; the adapter takes the signing client rather than embedding one. See [The conventional Worker](./conventional-worker.md#a-bindings-hook).
105
-
106
- ## Declaring media purposes
107
39
 
108
- A purpose is the upload policy: which variants an asset must have, and how large each may be.
109
-
110
- ```ts
111
- siteDefaults: {
112
- media: {
113
- purposes: [
114
- {
115
- name: "page-image",
116
- required: ["image/jpeg,image/png", "image/webp", "image/avif"],
117
- maxBytes: {
118
- "image/jpeg": 5_000_000,
119
- "image/png": 5_000_000,
120
- "image/webp": 3_000_000,
121
- "image/avif": 2_000_000,
122
- },
123
- },
124
- ],
125
- },
126
- },
40
+ // in mount(): the media storage, handed to Admin
41
+ const media = r2MediaStorage({
42
+ bucket: env.MEDIA,
43
+ signer: new AwsClient({ accessKeyId: env.R2_ACCESS_KEY_ID, secretAccessKey: env.R2_SECRET_ACCESS_KEY, region: "auto", service: "s3" }),
44
+ endpoint: env.R2_ENDPOINT,
45
+ publicBase: env.MEDIA_PUBLIC_BASE,
46
+ });
47
+ const admin = guard(createAdminSurface(runtime, { basePath: "/admin", media, /* …the generated options… */ }));
127
48
  ```
128
49
 
129
- `required` is slot-based, in the grammar of an `<input accept>` list. The example declares three slots: slot 0 takes exactly one fallback mime preserving source semantics (`image/jpeg` for opaque photos, `image/png` when alpha must survive), slot 1 a WebP variant, slot 2 an AVIF variant. That models a multi-variant `<picture>`. A narrower purpose may declare a single slot such as `["image/jpeg,image/png,image/webp,image/gif"]`, in which case the agent picks exactly one mime from that list and must not upload one variant per listed mime.
50
+ `aws4fetch` is the application's dependency; Mantle only calls its `sign`.
51
+ Without both `media` and site defaults, every media route answers 501
52
+ `MEDIA_NOT_CONFIGURED`.
130
53
 
131
- Purpose names are slugs (`^[a-z0-9]+(-[a-z0-9]+)*$`), every slot must be non-empty, slots may not overlap on a mime, and every `maxBytes` key must be a mime some slot accepts with a positive value. Violations fail at boot. SVG uploads are rejected unless the Worker sets `mediaAllowSvg`. See [Site defaults and site_config](../reference/site-config.md).
54
+ ## 3. The upload flow
132
55
 
133
- The runtime emits the policy summary into the `create_media_upload` tool description, so an agent reads the contract straight from `tools/list` without an extra round trip.
56
+ All through Admin's API, `editor` role or higher:
134
57
 
135
- ## Tool visibility
58
+ 1. `POST /admin/api/media/uploads` with
59
+ `{ filename, purpose, variants: [{ mimeType, byteSize, role }], alt?, caption? }`.
60
+ The purpose's MIME slots and per-type byte caps are checked here, and exactly one variant must be `role: "primary"`. The answer is
61
+ `{ uploadGroupId, capabilities: [{ role, mimeType, method: "PUT", uploadUrl, requiredHeaders }], expiresAt }`.
62
+ 2. `PUT` each variant's bytes to its `uploadUrl` with its `requiredHeaders`.
63
+ 3. `POST /admin/api/media/uploads/{uploadGroupId}/commit` (optionally with
64
+ `{ alt, caption }`). Commit checks every stored object's type and size,
65
+ then copies each to a public key no upload URL can reach. A rejected group
66
+ publishes nothing and its upload objects are deleted. An expired or unknown
67
+ group is 410 `MEDIA_UPLOAD_EXPIRED`.
136
68
 
137
- `create_media_upload` and `commit_media_upload` are registered only when **both** hold:
69
+ The committed asset is `{ id, variants: [{ role, mimeType, publicUrl, storageKey, byteSize }], alt?, caption?, createdAt }`.
70
+ `GET /admin/api/media` lists assets (`search`, `limit`, `cursor`); `GET`,
71
+ `PATCH` (`alt`, `caption`) and `DELETE /admin/api/media/{id}` manage one.
72
+ Delete removes the objects first, then the row, so a partial failure can be
73
+ retried.
138
74
 
139
- - `bindings.mediaStorage` is set;
140
- - `siteDefaults.media.purposes` contains at least one purpose.
75
+ Optimize images where they are made (in the browser or the agent), and upload
76
+ the variants; Mantle does not transform images.
141
77
 
142
- If either is missing the tools never appear in `tools/list`. That is the intended diagnostic: an agent that cannot see the tools is looking at a deployment where media is not configured, not at a permissions problem. A call that reaches a runtime without media storage answers `MEDIA_NOT_CONFIGURED`.
78
+ ## Storing media in a Schema
143
79
 
144
- ## Referencing an asset from a Schema
145
-
146
- Entries store asset ids, not URLs. Mark the field with both existing v0.1 grammar extensions:
80
+ Store the asset's `publicUrl` (or its `id`) in a string field and mark it:
147
81
 
148
82
  ```yaml
149
- apiVersion: cms.mantle.aotter.net/v1
150
- kind: Schema
151
- metadata:
152
- name: pages
153
- spec:
154
- title: Pages
155
- schema:
156
- type: object
157
- additionalProperties: false
158
- required: [slug, title]
159
- properties:
160
- slug: { type: string, pattern: "^[a-z0-9-]+$" }
161
- title: { type: string, minLength: 1 }
162
- coverAssetId:
163
- type: string
164
- x-mantle-ref: media_assets
165
- x-mcp-hint: media-image
83
+ cover: { type: string, x-mcp-hint: media-image }
166
84
  ```
167
85
 
168
- `x-mantle-ref: media_assets` marks the string as an id in the media asset collection, which is what makes Admin show a media picker instead of a text box. `x-mcp-hint: media-image` tells an MCP client the field expects an image asset. Neither key is validated as a foreign key; they are informational. At render time, resolve ids to their variants with `runtime.media.resolve(id)` or `resolveMany(ids)`, which batches a render pass into one database round trip. No new manifest keys are involved; see [Schema](../reference/schema.md).
169
-
170
- ## What a commit costs
171
-
172
- R2 has no metadata-only patch. To stamp `committedAt`, `role`, `uploadGroupId` and the filename markers, Mantle streams each uploaded object through a `GET` and a `PUT`. So a successful N-variant commit performs N `GET`s and N `PUT`s and rewrites the sum of the variant sizes.
173
-
174
- - Commits validate the bundle shape before any I/O.
175
- - Variants are processed in batches of at most three; a batch settles before the next starts or an error returns.
176
- - A mime or size failure cancels the unused `GET` stream; a failed `PUT` also attempts cancellation while preserving the original error.
177
- - The asset row is saved only after every variant succeeds. All-or-nothing.
178
-
179
- Parallelism reduces waiting, not operation count or bytes. Keep variant counts and byte caps deliberate. A partial R2 failure leaves the pending D1 record in place so the commit can be retried before it expires; already stamped objects stay stamped.
180
-
181
- ## Cleanup
182
-
183
- An upload can reach R2 and never be committed — an interrupted agent, a rejected commit. Remove those objects with the version-matched `media-gc` skill. It is opt-in and deliberately not projected into a repository by `mantle skills`, because it deletes remote objects.
184
-
185
- Its posture is audit first, delete only what an operator confirmed. It treats an object as a candidate only when it is over 24 hours old, has no `committedAt` custom metadata, and matches the exact key layout `<purpose>/<group>/(primary|alternate|fallback).<ext>` for a purpose this project declares. It reports account, bucket, prefixes, cutoff, counts, bytes and a digest of the candidate set without printing keys or URLs; on confirmation it re-runs the same audit and stops if anything changed.
186
-
187
- > **Do not use an R2 lifecycle rule**
188
- > Committed and uncommitted media share the same purpose prefix, so an age-based rule deletes live assets. After a pending record expires, partially stamped orphans require an operator audit against D1 references: a missing pending record does not mean an object is unused.
189
-
190
- ## Diagnostics
191
-
192
- | Code | HTTP | Raised when |
193
- |---|---|---|
194
- | `MEDIA_NOT_CONFIGURED` | 501 | No `mediaStorage` port is bound on this deployment |
195
- | `MEDIA_PURPOSE_REJECTED` | 400 | The requested purpose is not declared; the declared set is returned so an agent can self-correct |
196
- | `MEDIA_MIME_REJECTED` | 400 | A mime outside `image/png`, `image/jpeg`, `image/webp`, `image/avif`, `image/gif` |
197
- | `MEDIA_SIZE_EXCEEDED` | 400 | A declared byte size exceeds its cap |
198
- | `MEDIA_SVG_REJECTED` | 400 | An SVG was offered while SVG is not allowed; object storage does not sanitize SVG payloads |
199
- | `MEDIA_VARIANTS_INCOMPLETE` | 400 | The bundle misses a mime the purpose requires; the missing set is returned |
200
- | `MEDIA_VARIANT_SIZE_EXCEEDED` | 400 | One variant exceeds the cap declared for its mime |
201
- | `MEDIA_VARIANTS_SUSPICIOUS_SIZE` | 400 | A modern variant is larger than its fallback (AVIF above JPEG), so it looks unoptimized |
202
- | `MEDIA_ASSET_NOT_FOUND` | 404 | No `media_assets` row matches the id |
203
- | `MEDIA_UPLOAD_EXPIRED` | 410 | The upload capability's TTL elapsed, or it was never created |
204
- | `MEDIA_OBJECT_NOT_FOUND` | 409 | A variant's bytes were never PUT before commit |
86
+ The hint tells Admin and agents what the field holds. No MCP tool uploads
87
+ media in 0.2.0; an agent uploads through Admin's API with a staff session.
205
88
 
206
- The full catalog is in [Diagnostic codes](../reference/diagnostics.md).
89
+ ## Stale uploads
207
90
 
208
- ## Source
209
- - [`docs/media-uploads.md`](../../../docs/media-uploads.md)
210
- - [`docs/adr/0017-media-multi-variant-agent-side-optimization.md`](../../../docs/adr/0017-media-multi-variant-agent-side-optimization.md)
211
- - [`packages/mantle-runtime/src/domain/port/MediaStorage.ts`](../../../packages/mantle-runtime/src/domain/port/MediaStorage.ts)
212
- - [`packages/mantle-runtime/src/domain/port/MediaAssetRepository.ts`](../../../packages/mantle-runtime/src/domain/port/MediaAssetRepository.ts)
213
- - [`packages/mantle-spec/src/domain/service/SiteDefaultsValidator.ts`](../../../packages/mantle-spec/src/domain/service/SiteDefaultsValidator.ts)
214
- - [`packages/mantle-spec/src/kernel/diagnostic.ts`](../../../packages/mantle-spec/src/kernel/diagnostic.ts)
215
- - [`packages/adapters/cloudflare/README.md`](../../../packages/adapters/cloudflare/README.md)
216
- - [`docs/skills/media-gc/SKILL.md`](../../skills/media-gc/SKILL.md)
91
+ A group created but never committed leaves objects under `uploads/` until its
92
+ URLs expire. The package skill `docs/skills/media-gc/SKILL.md` audits and
93
+ removes them.