@aotter/mantle 0.2.0-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 (930) hide show
  1. package/README.md +180 -45
  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/{spec → build/spec}/domain/model/ManifestGrammar.d.ts +30 -43
  20. package/dist/{spec → build/spec}/domain/model/RuntimePlan.d.ts +77 -3
  21. package/dist/{spec → build/spec}/domain/model/SqlIr.d.ts +39 -6
  22. package/dist/build/spec/domain/model/UserFields.d.ts +21 -0
  23. package/dist/{spec → build/spec}/domain/service/PlanFingerprint.d.ts +4 -1
  24. package/dist/{spec → build/spec}/kernel/diagnostic.d.ts +1 -30
  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/{spec/domain/service/CloudflareCron.d.ts → kernel/cron.d.ts} +0 -1
  71. package/dist/{spec/domain/service/CloudflareCron.js → kernel/cron.js} +1 -6
  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/{auth/emailTemplates.js → kernel/email.js} +13 -2
  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/{cloudflare/r2Media.d.ts → kernel/r2-media.d.ts} +4 -5
  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/{core/site.d.ts → kernel/site-types.d.ts} +38 -9
  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 -37
  145. package/dist/testing/index.js +1 -43
  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 -16
  166. package/docs/examples/app-shell/README.md +121 -0
  167. package/docs/examples/app-shell/accept.mjs +91 -0
  168. package/docs/examples/app-shell/gitignore +7 -0
  169. package/docs/examples/app-shell/package.json +43 -0
  170. package/docs/examples/app-shell/pnpm-workspace.yaml +8 -0
  171. package/docs/examples/app-shell/smoke-kit.mjs +168 -0
  172. package/docs/examples/app-shell/src/auth.ts +58 -0
  173. package/docs/examples/app-shell/src/handlers.ts +5 -0
  174. package/docs/examples/app-shell/src/index.ts +4 -0
  175. package/docs/examples/app-shell/src/routes.ts +14 -0
  176. package/docs/examples/app-shell/src/schedule.ts +8 -0
  177. package/docs/examples/app-shell/src/service.ts +70 -0
  178. package/docs/examples/app-shell/src/sign-in.ts +41 -0
  179. package/docs/examples/app-shell/src/signup.ts +8 -0
  180. package/docs/examples/{reference-service → app-shell}/tsconfig.json +6 -2
  181. package/docs/examples/app-shell/worker-configuration.d.ts +22 -0
  182. package/docs/examples/app-shell/wrangler.jsonc +62 -0
  183. package/docs/examples/club-events/README.md +65 -0
  184. package/docs/examples/club-events/manifests/club-events.yaml +247 -0
  185. package/docs/examples/club-events/smoke.mjs +127 -0
  186. package/docs/examples/club-events/src/handlers.ts +25 -0
  187. package/docs/examples/club-events/src/signup.ts +9 -0
  188. package/docs/examples/generated-web/README.md +78 -0
  189. package/docs/examples/generated-web/posts.yaml +38 -0
  190. package/docs/examples/generated-web/seed.sql +6 -0
  191. package/docs/examples/generated-web/src/worker.ts +43 -0
  192. package/docs/examples/generated-web/tsconfig.json +8 -0
  193. package/docs/examples/generated-web/wrangler.jsonc +8 -0
  194. package/docs/examples/purchasing/.dev.vars.example +6 -0
  195. package/docs/examples/purchasing/README.md +99 -0
  196. package/docs/examples/purchasing/manifests/purchasing.yaml +374 -0
  197. package/docs/examples/purchasing/seed.sql +4 -0
  198. package/docs/examples/purchasing/smoke.mjs +191 -0
  199. package/docs/examples/purchasing/src/admin.tsx +13 -0
  200. package/docs/examples/purchasing/src/handlers.ts +33 -0
  201. package/docs/examples/purchasing/src/notify.ts +29 -0
  202. package/docs/examples/purchasing/src/requests-page.ts +57 -0
  203. package/docs/examples/purchasing/src/routes.ts +53 -0
  204. package/docs/examples/purchasing/src/schedule.ts +31 -0
  205. package/docs/examples/purchasing/src/signup.ts +5 -0
  206. package/docs/examples/purchasing/src/supplier.ts +32 -0
  207. package/docs/examples/purchasing/wrangler.jsonc +69 -0
  208. package/docs/examples/recipes/README.md +60 -0
  209. package/docs/examples/recipes/manifests/recipes.yaml +75 -0
  210. package/docs/examples/recipes/smoke.mjs +102 -0
  211. package/docs/examples/recipes/src/media.ts +13 -0
  212. package/docs/examples/recipes/src/pages.ts +99 -0
  213. package/docs/examples/recipes/src/routes.ts +71 -0
  214. package/docs/examples/recipes/src/site-config.ts +12 -0
  215. package/docs/examples/recipes/wrangler.jsonc +74 -0
  216. package/docs/handbook/cloudflare/authentication.md +186 -108
  217. package/docs/handbook/cloudflare/chatgpt-sites.md +5 -112
  218. package/docs/handbook/cloudflare/deploy-and-operate.md +59 -87
  219. package/docs/handbook/cloudflare/media-r2.md +61 -82
  220. package/docs/handbook/cloudflare/service-entry.md +220 -119
  221. package/docs/handbook/concepts/authorization.md +10 -117
  222. package/docs/handbook/concepts/four-atoms.md +9 -92
  223. package/docs/handbook/concepts/lifecycle-and-locales.md +9 -80
  224. package/docs/handbook/concepts/mcp-and-agents.md +24 -116
  225. package/docs/handbook/concepts/procedures-and-triggers.md +5 -162
  226. package/docs/handbook/concepts/runtime-and-adapters.md +15 -183
  227. package/docs/handbook/concepts/views.md +10 -109
  228. package/docs/handbook/examples/hub.md +2 -18
  229. package/docs/handbook/guides/adapter-guide.md +11 -0
  230. package/docs/handbook/guides/admin-ui.md +113 -136
  231. package/docs/handbook/guides/agent-setup.md +32 -27
  232. package/docs/handbook/guides/agent-workflow-acceptance.md +232 -0
  233. package/docs/handbook/guides/email.md +86 -0
  234. package/docs/handbook/guides/local-testing.md +40 -0
  235. package/docs/handbook/guides/mcp-apps.md +560 -0
  236. package/docs/handbook/guides/native-admin.md +566 -0
  237. package/docs/handbook/guides/native-execution.md +133 -0
  238. package/docs/handbook/guides/oauth.md +219 -0
  239. package/docs/handbook/guides/postgres-adapters.md +56 -0
  240. package/docs/handbook/guides/public-pages.md +87 -0
  241. package/docs/handbook/guides/size-and-startup.md +9 -0
  242. package/docs/handbook/guides/sql-patterns.md +266 -0
  243. package/docs/handbook/guides/typed-queries.md +210 -100
  244. package/docs/handbook/navigation.json +176 -30
  245. package/docs/handbook/reference/admin-descriptors.md +53 -0
  246. package/docs/handbook/reference/authorization.md +44 -52
  247. package/docs/handbook/reference/describe.md +56 -0
  248. package/docs/handbook/reference/diagnostics.md +19 -77
  249. package/docs/handbook/reference/features.md +45 -53
  250. package/docs/handbook/reference/manifest.md +6 -69
  251. package/docs/handbook/reference/procedure.md +11 -115
  252. package/docs/handbook/reference/schema.md +81 -172
  253. package/docs/handbook/reference/site-config.md +5 -65
  254. package/docs/handbook/reference/sql.md +64 -0
  255. package/docs/handbook/reference/surface.md +396 -93
  256. package/docs/handbook/reference/trigger.md +62 -89
  257. package/docs/handbook/reference/view.md +40 -158
  258. package/docs/handbook/releases/index.md +198 -12
  259. package/docs/handbook/start/agents.md +45 -0
  260. package/docs/handbook/start/overview.md +9 -56
  261. package/docs/handbook/start/project-and-cli.md +51 -131
  262. package/docs/handbook/start/quickstart-worker.md +38 -115
  263. package/docs/skills/develop/SKILL.md +77 -121
  264. package/docs/skills/integrate/SKILL.md +37 -84
  265. package/docs/skills/media-gc/SKILL.md +21 -8
  266. package/docs/skills/provision/SKILL.md +31 -87
  267. package/docs/skills/update/SKILL.md +20 -34
  268. package/docs/source/scripts/postgres-adapter.ts +101 -0
  269. package/docs/upgrade-0.1-to-0.2.md +26 -10
  270. package/package.json +120 -112
  271. package/skills/README.md +67 -0
  272. package/skills/mantle/SKILL.md +76 -0
  273. package/dist/admin/consent.d.ts +0 -17
  274. package/dist/admin/consent.d.ts.map +0 -1
  275. package/dist/admin/consent.js +0 -17
  276. package/dist/admin/consent.js.map +0 -1
  277. package/dist/admin/createAdminSurface.d.ts +0 -22
  278. package/dist/admin/createAdminSurface.d.ts.map +0 -1
  279. package/dist/admin/createAdminSurface.js +0 -589
  280. package/dist/admin/createAdminSurface.js.map +0 -1
  281. package/dist/admin/developerConsole.d.ts +0 -264
  282. package/dist/admin/developerConsole.d.ts.map +0 -1
  283. package/dist/admin/developerConsole.js +0 -136
  284. package/dist/admin/developerConsole.js.map +0 -1
  285. package/dist/admin/identity.d.ts +0 -62
  286. package/dist/admin/identity.d.ts.map +0 -1
  287. package/dist/admin/identity.js +0 -7
  288. package/dist/admin/identity.js.map +0 -1
  289. package/dist/admin/index.d.ts +0 -4
  290. package/dist/admin/index.d.ts.map +0 -1
  291. package/dist/admin/index.js +0 -4
  292. package/dist/admin/index.js.map +0 -1
  293. package/dist/admin/procedureFlow.d.ts +0 -25
  294. package/dist/admin/procedureFlow.d.ts.map +0 -1
  295. package/dist/admin/procedureFlow.js +0 -154
  296. package/dist/admin/procedureFlow.js.map +0 -1
  297. package/dist/auth/ConsoleEmailSender.d.ts +0 -15
  298. package/dist/auth/ConsoleEmailSender.d.ts.map +0 -1
  299. package/dist/auth/ConsoleEmailSender.js +0 -19
  300. package/dist/auth/ConsoleEmailSender.js.map +0 -1
  301. package/dist/auth/appleClientSecret.d.ts +0 -75
  302. package/dist/auth/appleClientSecret.d.ts.map +0 -1
  303. package/dist/auth/appleClientSecret.js +0 -116
  304. package/dist/auth/appleClientSecret.js.map +0 -1
  305. package/dist/auth/buildAuth.d.ts +0 -4565
  306. package/dist/auth/buildAuth.d.ts.map +0 -1
  307. package/dist/auth/buildAuth.js +0 -307
  308. package/dist/auth/buildAuth.js.map +0 -1
  309. package/dist/auth/callerResolver.d.ts +0 -48
  310. package/dist/auth/callerResolver.d.ts.map +0 -1
  311. package/dist/auth/callerResolver.js +0 -49
  312. package/dist/auth/callerResolver.js.map +0 -1
  313. package/dist/auth/createAuthRoutes.d.ts +0 -22
  314. package/dist/auth/createAuthRoutes.d.ts.map +0 -1
  315. package/dist/auth/createAuthRoutes.js +0 -128
  316. package/dist/auth/createAuthRoutes.js.map +0 -1
  317. package/dist/auth/createMantleAuth.d.ts +0 -3
  318. package/dist/auth/createMantleAuth.d.ts.map +0 -1
  319. package/dist/auth/createMantleAuth.js +0 -483
  320. package/dist/auth/createMantleAuth.js.map +0 -1
  321. package/dist/auth/db.d.ts +0 -17
  322. package/dist/auth/db.d.ts.map +0 -1
  323. package/dist/auth/db.js +0 -24
  324. package/dist/auth/db.js.map +0 -1
  325. package/dist/auth/emailTemplates.d.ts +0 -7
  326. package/dist/auth/emailTemplates.d.ts.map +0 -1
  327. package/dist/auth/emailTemplates.js.map +0 -1
  328. package/dist/auth/index.d.ts +0 -9
  329. package/dist/auth/index.d.ts.map +0 -1
  330. package/dist/auth/index.js +0 -7
  331. package/dist/auth/index.js.map +0 -1
  332. package/dist/auth/methods.d.ts +0 -717
  333. package/dist/auth/methods.d.ts.map +0 -1
  334. package/dist/auth/methods.js +0 -321
  335. package/dist/auth/methods.js.map +0 -1
  336. package/dist/auth/oauthTokens.d.ts +0 -24
  337. package/dist/auth/oauthTokens.d.ts.map +0 -1
  338. package/dist/auth/oauthTokens.js +0 -146
  339. package/dist/auth/oauthTokens.js.map +0 -1
  340. package/dist/auth/setupIncomplete.d.ts +0 -16
  341. package/dist/auth/setupIncomplete.d.ts.map +0 -1
  342. package/dist/auth/setupIncomplete.js +0 -50
  343. package/dist/auth/setupIncomplete.js.map +0 -1
  344. package/dist/auth/types.d.ts +0 -440
  345. package/dist/auth/types.d.ts.map +0 -1
  346. package/dist/auth/types.js +0 -10
  347. package/dist/auth/types.js.map +0 -1
  348. package/dist/bun/index.d.ts +0 -65
  349. package/dist/bun/index.d.ts.map +0 -1
  350. package/dist/bun/index.js +0 -130
  351. package/dist/bun/index.js.map +0 -1
  352. package/dist/cli/emitModule.d.ts +0 -7
  353. package/dist/cli/emitModule.d.ts.map +0 -1
  354. package/dist/cli/emitModule.js +0 -127
  355. package/dist/cli/emitModule.js.map +0 -1
  356. package/dist/cli/generate.d.ts +0 -8
  357. package/dist/cli/generate.d.ts.map +0 -1
  358. package/dist/cli/generate.js +0 -355
  359. package/dist/cli/generate.js.map +0 -1
  360. package/dist/cli/main.d.ts +0 -3
  361. package/dist/cli/main.d.ts.map +0 -1
  362. package/dist/cli/main.js +0 -21
  363. package/dist/cli/main.js.map +0 -1
  364. package/dist/cli/preset.d.ts +0 -18
  365. package/dist/cli/preset.d.ts.map +0 -1
  366. package/dist/cli/preset.js +0 -352
  367. package/dist/cli/preset.js.map +0 -1
  368. package/dist/cloudflare/index.d.ts +0 -21
  369. package/dist/cloudflare/index.d.ts.map +0 -1
  370. package/dist/cloudflare/index.js +0 -14
  371. package/dist/cloudflare/index.js.map +0 -1
  372. package/dist/cloudflare/r2Media.d.ts.map +0 -1
  373. package/dist/cloudflare/r2Media.js +0 -69
  374. package/dist/cloudflare/r2Media.js.map +0 -1
  375. package/dist/core/caller.d.ts +0 -35
  376. package/dist/core/caller.d.ts.map +0 -1
  377. package/dist/core/caller.js +0 -3
  378. package/dist/core/caller.js.map +0 -1
  379. package/dist/core/createMantle.d.ts +0 -22
  380. package/dist/core/createMantle.d.ts.map +0 -1
  381. package/dist/core/createMantle.js +0 -117
  382. package/dist/core/createMantle.js.map +0 -1
  383. package/dist/core/dialect.d.ts +0 -41
  384. package/dist/core/dialect.d.ts.map +0 -1
  385. package/dist/core/dialect.js +0 -7
  386. package/dist/core/dialect.js.map +0 -1
  387. package/dist/core/driver.d.ts +0 -17
  388. package/dist/core/driver.d.ts.map +0 -1
  389. package/dist/core/driver.js +0 -2
  390. package/dist/core/driver.js.map +0 -1
  391. package/dist/core/email.d.ts +0 -17
  392. package/dist/core/email.d.ts.map +0 -1
  393. package/dist/core/email.js +0 -2
  394. package/dist/core/email.js.map +0 -1
  395. package/dist/core/index.d.ts +0 -16
  396. package/dist/core/index.d.ts.map +0 -1
  397. package/dist/core/index.js +0 -16
  398. package/dist/core/index.js.map +0 -1
  399. package/dist/core/invocation.d.ts +0 -66
  400. package/dist/core/invocation.d.ts.map +0 -1
  401. package/dist/core/invocation.js +0 -3
  402. package/dist/core/invocation.js.map +0 -1
  403. package/dist/core/runtime/auth.d.ts +0 -9
  404. package/dist/core/runtime/auth.d.ts.map +0 -1
  405. package/dist/core/runtime/auth.js +0 -39
  406. package/dist/core/runtime/auth.js.map +0 -1
  407. package/dist/core/runtime/createRuntime.d.ts +0 -23
  408. package/dist/core/runtime/createRuntime.d.ts.map +0 -1
  409. package/dist/core/runtime/createRuntime.js +0 -214
  410. package/dist/core/runtime/createRuntime.js.map +0 -1
  411. package/dist/core/runtime/verifyPlan.d.ts +0 -34
  412. package/dist/core/runtime/verifyPlan.d.ts.map +0 -1
  413. package/dist/core/runtime/verifyPlan.js +0 -301
  414. package/dist/core/runtime/verifyPlan.js.map +0 -1
  415. package/dist/core/service.d.ts +0 -45
  416. package/dist/core/service.d.ts.map +0 -1
  417. package/dist/core/service.js +0 -2
  418. package/dist/core/service.js.map +0 -1
  419. package/dist/core/site.d.ts.map +0 -1
  420. package/dist/core/site.js +0 -2
  421. package/dist/core/site.js.map +0 -1
  422. package/dist/core/siteConfig.d.ts +0 -5
  423. package/dist/core/siteConfig.d.ts.map +0 -1
  424. package/dist/core/siteConfig.js +0 -24
  425. package/dist/core/siteConfig.js.map +0 -1
  426. package/dist/core/sql/allowlist.d.ts +0 -65
  427. package/dist/core/sql/allowlist.d.ts.map +0 -1
  428. package/dist/core/sql/allowlist.js +0 -705
  429. package/dist/core/sql/allowlist.js.map +0 -1
  430. package/dist/core/sql/ast.d.ts +0 -24
  431. package/dist/core/sql/ast.d.ts.map +0 -1
  432. package/dist/core/sql/ast.js +0 -32
  433. package/dist/core/sql/ast.js.map +0 -1
  434. package/dist/core/sql/compile.d.ts +0 -50
  435. package/dist/core/sql/compile.d.ts.map +0 -1
  436. package/dist/core/sql/compile.js +0 -48
  437. package/dist/core/sql/compile.js.map +0 -1
  438. package/dist/core/sql/policy.d.ts +0 -121
  439. package/dist/core/sql/policy.d.ts.map +0 -1
  440. package/dist/core/sql/policy.js +0 -379
  441. package/dist/core/sql/policy.js.map +0 -1
  442. package/dist/core/sql/positions.d.ts +0 -30
  443. package/dist/core/sql/positions.d.ts.map +0 -1
  444. package/dist/core/sql/positions.js +0 -22
  445. package/dist/core/sql/positions.js.map +0 -1
  446. package/dist/core/sql/run.d.ts +0 -76
  447. package/dist/core/sql/run.d.ts.map +0 -1
  448. package/dist/core/sql/run.js +0 -267
  449. package/dist/core/sql/run.js.map +0 -1
  450. package/dist/core/store/createStore.d.ts +0 -49
  451. package/dist/core/store/createStore.d.ts.map +0 -1
  452. package/dist/core/store/createStore.js +0 -227
  453. package/dist/core/store/createStore.js.map +0 -1
  454. package/dist/core/store/cursor.d.ts +0 -4
  455. package/dist/core/store/cursor.d.ts.map +0 -1
  456. package/dist/core/store/cursor.js +0 -22
  457. package/dist/core/store/cursor.js.map +0 -1
  458. package/dist/core/store/json.d.ts +0 -80
  459. package/dist/core/store/json.d.ts.map +0 -1
  460. package/dist/core/store/json.js +0 -342
  461. package/dist/core/store/json.js.map +0 -1
  462. package/dist/core/store.d.ts +0 -160
  463. package/dist/core/store.d.ts.map +0 -1
  464. package/dist/core/store.js +0 -2
  465. package/dist/core/store.js.map +0 -1
  466. package/dist/core/wire.d.ts +0 -20
  467. package/dist/core/wire.d.ts.map +0 -1
  468. package/dist/core/wire.js +0 -84
  469. package/dist/core/wire.js.map +0 -1
  470. package/dist/core/withCaller.d.ts +0 -16
  471. package/dist/core/withCaller.d.ts.map +0 -1
  472. package/dist/core/withCaller.js +0 -29
  473. package/dist/core/withCaller.js.map +0 -1
  474. package/dist/d1/adapter.d.ts +0 -12
  475. package/dist/d1/adapter.d.ts.map +0 -1
  476. package/dist/d1/adapter.js +0 -23
  477. package/dist/d1/adapter.js.map +0 -1
  478. package/dist/d1/codec.d.ts +0 -14
  479. package/dist/d1/codec.d.ts.map +0 -1
  480. package/dist/d1/codec.js +0 -136
  481. package/dist/d1/codec.js.map +0 -1
  482. package/dist/d1/compile/index.d.ts +0 -9
  483. package/dist/d1/compile/index.d.ts.map +0 -1
  484. package/dist/d1/compile/index.js +0 -9
  485. package/dist/d1/compile/index.js.map +0 -1
  486. package/dist/d1/dialect.d.ts +0 -4
  487. package/dist/d1/dialect.d.ts.map +0 -1
  488. package/dist/d1/dialect.js +0 -13
  489. package/dist/d1/dialect.js.map +0 -1
  490. package/dist/d1/executor.d.ts +0 -13
  491. package/dist/d1/executor.d.ts.map +0 -1
  492. package/dist/d1/executor.js +0 -91
  493. package/dist/d1/executor.js.map +0 -1
  494. package/dist/d1/index.d.ts +0 -6
  495. package/dist/d1/index.d.ts.map +0 -1
  496. package/dist/d1/index.js +0 -6
  497. package/dist/d1/index.js.map +0 -1
  498. package/dist/d1/lower.d.ts +0 -8
  499. package/dist/d1/lower.d.ts.map +0 -1
  500. package/dist/d1/lower.js +0 -167
  501. package/dist/d1/lower.js.map +0 -1
  502. package/dist/d1/media.d.ts +0 -5
  503. package/dist/d1/media.d.ts.map +0 -1
  504. package/dist/d1/media.js +0 -157
  505. package/dist/d1/media.js.map +0 -1
  506. package/dist/d1/migrations.d.ts +0 -12
  507. package/dist/d1/migrations.d.ts.map +0 -1
  508. package/dist/d1/migrations.js +0 -111
  509. package/dist/d1/migrations.js.map +0 -1
  510. package/dist/d1/print.d.ts +0 -28
  511. package/dist/d1/print.d.ts.map +0 -1
  512. package/dist/d1/print.js +0 -54
  513. package/dist/d1/print.js.map +0 -1
  514. package/dist/d1/site.d.ts +0 -17
  515. package/dist/d1/site.d.ts.map +0 -1
  516. package/dist/d1/site.js +0 -63
  517. package/dist/d1/site.js.map +0 -1
  518. package/dist/d1/storage.d.ts +0 -34
  519. package/dist/d1/storage.d.ts.map +0 -1
  520. package/dist/d1/storage.js +0 -288
  521. package/dist/d1/storage.js.map +0 -1
  522. package/dist/d1/tz.d.ts +0 -21
  523. package/dist/d1/tz.d.ts.map +0 -1
  524. package/dist/d1/tz.js +0 -54
  525. package/dist/d1/tz.js.map +0 -1
  526. package/dist/d1/validator.d.ts +0 -10
  527. package/dist/d1/validator.d.ts.map +0 -1
  528. package/dist/d1/validator.js +0 -33
  529. package/dist/d1/validator.js.map +0 -1
  530. package/dist/mcp/apps.d.ts +0 -43
  531. package/dist/mcp/apps.d.ts.map +0 -1
  532. package/dist/mcp/apps.js +0 -57
  533. package/dist/mcp/apps.js.map +0 -1
  534. package/dist/mcp/catalog.d.ts +0 -55
  535. package/dist/mcp/catalog.d.ts.map +0 -1
  536. package/dist/mcp/catalog.js +0 -81
  537. package/dist/mcp/catalog.js.map +0 -1
  538. package/dist/mcp/createMcpSurface.d.ts +0 -34
  539. package/dist/mcp/createMcpSurface.d.ts.map +0 -1
  540. package/dist/mcp/createMcpSurface.js +0 -150
  541. package/dist/mcp/createMcpSurface.js.map +0 -1
  542. package/dist/mcp/index.d.ts +0 -4
  543. package/dist/mcp/index.d.ts.map +0 -1
  544. package/dist/mcp/index.js +0 -4
  545. package/dist/mcp/index.js.map +0 -1
  546. package/dist/postgres/adapter.d.ts +0 -20
  547. package/dist/postgres/adapter.d.ts.map +0 -1
  548. package/dist/postgres/adapter.js +0 -44
  549. package/dist/postgres/adapter.js.map +0 -1
  550. package/dist/postgres/codec.d.ts +0 -13
  551. package/dist/postgres/codec.d.ts.map +0 -1
  552. package/dist/postgres/codec.js +0 -110
  553. package/dist/postgres/codec.js.map +0 -1
  554. package/dist/postgres/compile/index.d.ts +0 -9
  555. package/dist/postgres/compile/index.d.ts.map +0 -1
  556. package/dist/postgres/compile/index.js +0 -9
  557. package/dist/postgres/compile/index.js.map +0 -1
  558. package/dist/postgres/driver.d.ts +0 -92
  559. package/dist/postgres/driver.d.ts.map +0 -1
  560. package/dist/postgres/driver.js +0 -110
  561. package/dist/postgres/driver.js.map +0 -1
  562. package/dist/postgres/executor.d.ts +0 -20
  563. package/dist/postgres/executor.d.ts.map +0 -1
  564. package/dist/postgres/executor.js +0 -69
  565. package/dist/postgres/executor.js.map +0 -1
  566. package/dist/postgres/index.d.ts +0 -7
  567. package/dist/postgres/index.d.ts.map +0 -1
  568. package/dist/postgres/index.js +0 -7
  569. package/dist/postgres/index.js.map +0 -1
  570. package/dist/postgres/lower.d.ts +0 -6
  571. package/dist/postgres/lower.d.ts.map +0 -1
  572. package/dist/postgres/lower.js +0 -157
  573. package/dist/postgres/lower.js.map +0 -1
  574. package/dist/postgres/print.d.ts +0 -11
  575. package/dist/postgres/print.d.ts.map +0 -1
  576. package/dist/postgres/print.js +0 -121
  577. package/dist/postgres/print.js.map +0 -1
  578. package/dist/postgres/storage.d.ts +0 -19
  579. package/dist/postgres/storage.d.ts.map +0 -1
  580. package/dist/postgres/storage.js +0 -201
  581. package/dist/postgres/storage.js.map +0 -1
  582. package/dist/postgres/textRows.d.ts +0 -10
  583. package/dist/postgres/textRows.d.ts.map +0 -1
  584. package/dist/postgres/textRows.js +0 -44
  585. package/dist/postgres/textRows.js.map +0 -1
  586. package/dist/postgres/validator.d.ts +0 -12
  587. package/dist/postgres/validator.d.ts.map +0 -1
  588. package/dist/postgres/validator.js +0 -46
  589. package/dist/postgres/validator.js.map +0 -1
  590. package/dist/spec/domain/index.d.ts +0 -3
  591. package/dist/spec/domain/index.d.ts.map +0 -1
  592. package/dist/spec/domain/index.js +0 -3
  593. package/dist/spec/domain/index.js.map +0 -1
  594. package/dist/spec/domain/model/ContentState.d.ts +0 -8
  595. package/dist/spec/domain/model/ContentState.d.ts.map +0 -1
  596. package/dist/spec/domain/model/ContentState.js +0 -7
  597. package/dist/spec/domain/model/ContentState.js.map +0 -1
  598. package/dist/spec/domain/model/Entry.d.ts +0 -29
  599. package/dist/spec/domain/model/Entry.d.ts.map +0 -1
  600. package/dist/spec/domain/model/Entry.js +0 -16
  601. package/dist/spec/domain/model/Entry.js.map +0 -1
  602. package/dist/spec/domain/model/Locale.d.ts +0 -30
  603. package/dist/spec/domain/model/Locale.d.ts.map +0 -1
  604. package/dist/spec/domain/model/Locale.js +0 -33
  605. package/dist/spec/domain/model/Locale.js.map +0 -1
  606. package/dist/spec/domain/model/ManifestGrammar.d.ts.map +0 -1
  607. package/dist/spec/domain/model/ManifestGrammar.js +0 -149
  608. package/dist/spec/domain/model/ManifestGrammar.js.map +0 -1
  609. package/dist/spec/domain/model/MediaMimeAccept.d.ts +0 -55
  610. package/dist/spec/domain/model/MediaMimeAccept.d.ts.map +0 -1
  611. package/dist/spec/domain/model/MediaMimeAccept.js +0 -90
  612. package/dist/spec/domain/model/MediaMimeAccept.js.map +0 -1
  613. package/dist/spec/domain/model/RuntimePlan.d.ts.map +0 -1
  614. package/dist/spec/domain/model/RuntimePlan.js +0 -4
  615. package/dist/spec/domain/model/RuntimePlan.js.map +0 -1
  616. package/dist/spec/domain/model/SiteConfig.d.ts +0 -173
  617. package/dist/spec/domain/model/SiteConfig.d.ts.map +0 -1
  618. package/dist/spec/domain/model/SiteConfig.js +0 -13
  619. package/dist/spec/domain/model/SiteConfig.js.map +0 -1
  620. package/dist/spec/domain/model/SqlIr.d.ts.map +0 -1
  621. package/dist/spec/domain/model/SqlIr.js +0 -95
  622. package/dist/spec/domain/model/SqlIr.js.map +0 -1
  623. package/dist/spec/domain/model/index.d.ts +0 -14
  624. package/dist/spec/domain/model/index.d.ts.map +0 -1
  625. package/dist/spec/domain/model/index.js +0 -14
  626. package/dist/spec/domain/model/index.js.map +0 -1
  627. package/dist/spec/domain/service/CloudflareCron.d.ts.map +0 -1
  628. package/dist/spec/domain/service/CloudflareCron.js.map +0 -1
  629. package/dist/spec/domain/service/CrossSchemaChecker.d.ts +0 -34
  630. package/dist/spec/domain/service/CrossSchemaChecker.d.ts.map +0 -1
  631. package/dist/spec/domain/service/CrossSchemaChecker.js +0 -114
  632. package/dist/spec/domain/service/CrossSchemaChecker.js.map +0 -1
  633. package/dist/spec/domain/service/EntryDataValidator.d.ts +0 -56
  634. package/dist/spec/domain/service/EntryDataValidator.d.ts.map +0 -1
  635. package/dist/spec/domain/service/EntryDataValidator.js +0 -88
  636. package/dist/spec/domain/service/EntryDataValidator.js.map +0 -1
  637. package/dist/spec/domain/service/JsonSchemaToZod.d.ts +0 -29
  638. package/dist/spec/domain/service/JsonSchemaToZod.d.ts.map +0 -1
  639. package/dist/spec/domain/service/JsonSchemaToZod.js +0 -156
  640. package/dist/spec/domain/service/JsonSchemaToZod.js.map +0 -1
  641. package/dist/spec/domain/service/LifecycleStateMachine.d.ts +0 -75
  642. package/dist/spec/domain/service/LifecycleStateMachine.d.ts.map +0 -1
  643. package/dist/spec/domain/service/LifecycleStateMachine.js +0 -76
  644. package/dist/spec/domain/service/LifecycleStateMachine.js.map +0 -1
  645. package/dist/spec/domain/service/LocaleCanonicalizer.d.ts +0 -29
  646. package/dist/spec/domain/service/LocaleCanonicalizer.d.ts.map +0 -1
  647. package/dist/spec/domain/service/LocaleCanonicalizer.js +0 -96
  648. package/dist/spec/domain/service/LocaleCanonicalizer.js.map +0 -1
  649. package/dist/spec/domain/service/ManifestFieldChecks.d.ts +0 -60
  650. package/dist/spec/domain/service/ManifestFieldChecks.d.ts.map +0 -1
  651. package/dist/spec/domain/service/ManifestFieldChecks.js +0 -116
  652. package/dist/spec/domain/service/ManifestFieldChecks.js.map +0 -1
  653. package/dist/spec/domain/service/ManifestGraphValidator.d.ts +0 -15
  654. package/dist/spec/domain/service/ManifestGraphValidator.d.ts.map +0 -1
  655. package/dist/spec/domain/service/ManifestGraphValidator.js +0 -225
  656. package/dist/spec/domain/service/ManifestGraphValidator.js.map +0 -1
  657. package/dist/spec/domain/service/ManifestLinker.d.ts +0 -45
  658. package/dist/spec/domain/service/ManifestLinker.d.ts.map +0 -1
  659. package/dist/spec/domain/service/ManifestLinker.js +0 -92
  660. package/dist/spec/domain/service/ManifestLinker.js.map +0 -1
  661. package/dist/spec/domain/service/ManifestLocaleTrimmer.d.ts +0 -16
  662. package/dist/spec/domain/service/ManifestLocaleTrimmer.d.ts.map +0 -1
  663. package/dist/spec/domain/service/ManifestLocaleTrimmer.js +0 -76
  664. package/dist/spec/domain/service/ManifestLocaleTrimmer.js.map +0 -1
  665. package/dist/spec/domain/service/ManifestParser.d.ts +0 -49
  666. package/dist/spec/domain/service/ManifestParser.d.ts.map +0 -1
  667. package/dist/spec/domain/service/ManifestParser.js +0 -203
  668. package/dist/spec/domain/service/ManifestParser.js.map +0 -1
  669. package/dist/spec/domain/service/ManifestPartition.d.ts +0 -9
  670. package/dist/spec/domain/service/ManifestPartition.d.ts.map +0 -1
  671. package/dist/spec/domain/service/ManifestPartition.js +0 -19
  672. package/dist/spec/domain/service/ManifestPartition.js.map +0 -1
  673. package/dist/spec/domain/service/ManifestPathDiagnoser.d.ts +0 -33
  674. package/dist/spec/domain/service/ManifestPathDiagnoser.d.ts.map +0 -1
  675. package/dist/spec/domain/service/ManifestPathDiagnoser.js +0 -43
  676. package/dist/spec/domain/service/ManifestPathDiagnoser.js.map +0 -1
  677. package/dist/spec/domain/service/ManifestSourceSpans.d.ts +0 -10
  678. package/dist/spec/domain/service/ManifestSourceSpans.d.ts.map +0 -1
  679. package/dist/spec/domain/service/ManifestSourceSpans.js +0 -76
  680. package/dist/spec/domain/service/ManifestSourceSpans.js.map +0 -1
  681. package/dist/spec/domain/service/McpToolNaming.d.ts +0 -25
  682. package/dist/spec/domain/service/McpToolNaming.d.ts.map +0 -1
  683. package/dist/spec/domain/service/McpToolNaming.js +0 -50
  684. package/dist/spec/domain/service/McpToolNaming.js.map +0 -1
  685. package/dist/spec/domain/service/PlanFingerprint.d.ts.map +0 -1
  686. package/dist/spec/domain/service/PlanFingerprint.js +0 -14
  687. package/dist/spec/domain/service/PlanFingerprint.js.map +0 -1
  688. package/dist/spec/domain/service/ProcedureViewSpecChecks.d.ts +0 -4
  689. package/dist/spec/domain/service/ProcedureViewSpecChecks.d.ts.map +0 -1
  690. package/dist/spec/domain/service/ProcedureViewSpecChecks.js +0 -211
  691. package/dist/spec/domain/service/ProcedureViewSpecChecks.js.map +0 -1
  692. package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts +0 -42
  693. package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts.map +0 -1
  694. package/dist/spec/domain/service/SchemaAdminUiChecker.js +0 -289
  695. package/dist/spec/domain/service/SchemaAdminUiChecker.js.map +0 -1
  696. package/dist/spec/domain/service/SchemaIndexChecker.d.ts +0 -33
  697. package/dist/spec/domain/service/SchemaIndexChecker.d.ts.map +0 -1
  698. package/dist/spec/domain/service/SchemaIndexChecker.js +0 -256
  699. package/dist/spec/domain/service/SchemaIndexChecker.js.map +0 -1
  700. package/dist/spec/domain/service/SchemaSearchChecker.d.ts +0 -11
  701. package/dist/spec/domain/service/SchemaSearchChecker.d.ts.map +0 -1
  702. package/dist/spec/domain/service/SchemaSearchChecker.js +0 -78
  703. package/dist/spec/domain/service/SchemaSearchChecker.js.map +0 -1
  704. package/dist/spec/domain/service/SchemaSpecChecks.d.ts +0 -31
  705. package/dist/spec/domain/service/SchemaSpecChecks.d.ts.map +0 -1
  706. package/dist/spec/domain/service/SchemaSpecChecks.js +0 -445
  707. package/dist/spec/domain/service/SchemaSpecChecks.js.map +0 -1
  708. package/dist/spec/domain/service/SiteDefaultsValidator.d.ts +0 -39
  709. package/dist/spec/domain/service/SiteDefaultsValidator.d.ts.map +0 -1
  710. package/dist/spec/domain/service/SiteDefaultsValidator.js +0 -194
  711. package/dist/spec/domain/service/SiteDefaultsValidator.js.map +0 -1
  712. package/dist/spec/domain/service/SqlClassify.d.ts +0 -19
  713. package/dist/spec/domain/service/SqlClassify.d.ts.map +0 -1
  714. package/dist/spec/domain/service/SqlClassify.js +0 -42
  715. package/dist/spec/domain/service/SqlClassify.js.map +0 -1
  716. package/dist/spec/domain/service/SqlRefusal.d.ts +0 -16
  717. package/dist/spec/domain/service/SqlRefusal.d.ts.map +0 -1
  718. package/dist/spec/domain/service/SqlRefusal.js +0 -20
  719. package/dist/spec/domain/service/SqlRefusal.js.map +0 -1
  720. package/dist/spec/domain/service/SqlTypes.d.ts +0 -40
  721. package/dist/spec/domain/service/SqlTypes.d.ts.map +0 -1
  722. package/dist/spec/domain/service/SqlTypes.js +0 -110
  723. package/dist/spec/domain/service/SqlTypes.js.map +0 -1
  724. package/dist/spec/domain/service/StaffRoleHierarchy.d.ts +0 -3
  725. package/dist/spec/domain/service/StaffRoleHierarchy.d.ts.map +0 -1
  726. package/dist/spec/domain/service/StaffRoleHierarchy.js +0 -19
  727. package/dist/spec/domain/service/StaffRoleHierarchy.js.map +0 -1
  728. package/dist/spec/domain/service/TriggerGraphChecks.d.ts +0 -16
  729. package/dist/spec/domain/service/TriggerGraphChecks.d.ts.map +0 -1
  730. package/dist/spec/domain/service/TriggerGraphChecks.js +0 -337
  731. package/dist/spec/domain/service/TriggerGraphChecks.js.map +0 -1
  732. package/dist/spec/domain/service/TriggerSpecChecks.d.ts +0 -4
  733. package/dist/spec/domain/service/TriggerSpecChecks.d.ts.map +0 -1
  734. package/dist/spec/domain/service/TriggerSpecChecks.js +0 -89
  735. package/dist/spec/domain/service/TriggerSpecChecks.js.map +0 -1
  736. package/dist/spec/domain/service/ValidatedAdminUiProjection.d.ts +0 -11
  737. package/dist/spec/domain/service/ValidatedAdminUiProjection.d.ts.map +0 -1
  738. package/dist/spec/domain/service/ValidatedAdminUiProjection.js +0 -26
  739. package/dist/spec/domain/service/ValidatedAdminUiProjection.js.map +0 -1
  740. package/dist/spec/domain/service/ViewAdminUiChecker.d.ts +0 -14
  741. package/dist/spec/domain/service/ViewAdminUiChecker.d.ts.map +0 -1
  742. package/dist/spec/domain/service/ViewAdminUiChecker.js +0 -53
  743. package/dist/spec/domain/service/ViewAdminUiChecker.js.map +0 -1
  744. package/dist/spec/domain/service/index.d.ts +0 -24
  745. package/dist/spec/domain/service/index.d.ts.map +0 -1
  746. package/dist/spec/domain/service/index.js +0 -24
  747. package/dist/spec/domain/service/index.js.map +0 -1
  748. package/dist/spec/index.d.ts +0 -10
  749. package/dist/spec/index.d.ts.map +0 -1
  750. package/dist/spec/index.js +0 -12
  751. package/dist/spec/index.js.map +0 -1
  752. package/dist/spec/infrastructure/cli/parseArgsError.d.ts +0 -16
  753. package/dist/spec/infrastructure/cli/parseArgsError.d.ts.map +0 -1
  754. package/dist/spec/infrastructure/cli/parseArgsError.js +0 -34
  755. package/dist/spec/infrastructure/cli/parseArgsError.js.map +0 -1
  756. package/dist/spec/infrastructure/index.d.ts +0 -2
  757. package/dist/spec/infrastructure/index.d.ts.map +0 -1
  758. package/dist/spec/infrastructure/index.js +0 -2
  759. package/dist/spec/infrastructure/index.js.map +0 -1
  760. package/dist/spec/infrastructure/sql/PgQueryParser.d.ts +0 -18
  761. package/dist/spec/infrastructure/sql/PgQueryParser.d.ts.map +0 -1
  762. package/dist/spec/infrastructure/sql/PgQueryParser.js +0 -17
  763. package/dist/spec/infrastructure/sql/PgQueryParser.js.map +0 -1
  764. package/dist/spec/infrastructure/sql/compilePlan.d.ts +0 -37
  765. package/dist/spec/infrastructure/sql/compilePlan.d.ts.map +0 -1
  766. package/dist/spec/infrastructure/sql/compilePlan.js +0 -282
  767. package/dist/spec/infrastructure/sql/compilePlan.js.map +0 -1
  768. package/dist/spec/infrastructure/sql/compileSql.d.ts +0 -35
  769. package/dist/spec/infrastructure/sql/compileSql.d.ts.map +0 -1
  770. package/dist/spec/infrastructure/sql/compileSql.js +0 -92
  771. package/dist/spec/infrastructure/sql/compileSql.js.map +0 -1
  772. package/dist/spec/infrastructure/sql/frontEnd.d.ts +0 -8
  773. package/dist/spec/infrastructure/sql/frontEnd.d.ts.map +0 -1
  774. package/dist/spec/infrastructure/sql/frontEnd.js +0 -100
  775. package/dist/spec/infrastructure/sql/frontEnd.js.map +0 -1
  776. package/dist/spec/infrastructure/sql/index.d.ts +0 -4
  777. package/dist/spec/infrastructure/sql/index.d.ts.map +0 -1
  778. package/dist/spec/infrastructure/sql/index.js +0 -4
  779. package/dist/spec/infrastructure/sql/index.js.map +0 -1
  780. package/dist/spec/kernel/diagnostic.d.ts.map +0 -1
  781. package/dist/spec/kernel/diagnostic.js +0 -296
  782. package/dist/spec/kernel/diagnostic.js.map +0 -1
  783. package/dist/spec/kernel/index.d.ts +0 -8
  784. package/dist/spec/kernel/index.d.ts.map +0 -1
  785. package/dist/spec/kernel/index.js +0 -8
  786. package/dist/spec/kernel/index.js.map +0 -1
  787. package/dist/spec/usecase/EmitTypes.d.ts +0 -22
  788. package/dist/spec/usecase/EmitTypes.d.ts.map +0 -1
  789. package/dist/spec/usecase/EmitTypes.js +0 -182
  790. package/dist/spec/usecase/EmitTypes.js.map +0 -1
  791. package/dist/spec/usecase/ValidateManifestsUseCase.d.ts +0 -8
  792. package/dist/spec/usecase/ValidateManifestsUseCase.d.ts.map +0 -1
  793. package/dist/spec/usecase/ValidateManifestsUseCase.js +0 -101
  794. package/dist/spec/usecase/ValidateManifestsUseCase.js.map +0 -1
  795. package/dist/spec/usecase/dto/ValidateManifestsRequest.d.ts +0 -27
  796. package/dist/spec/usecase/dto/ValidateManifestsRequest.d.ts.map +0 -1
  797. package/dist/spec/usecase/dto/ValidateManifestsRequest.js +0 -2
  798. package/dist/spec/usecase/dto/ValidateManifestsRequest.js.map +0 -1
  799. package/dist/spec/usecase/dto/ValidateManifestsResponse.d.ts +0 -14
  800. package/dist/spec/usecase/dto/ValidateManifestsResponse.d.ts.map +0 -1
  801. package/dist/spec/usecase/dto/ValidateManifestsResponse.js +0 -2
  802. package/dist/spec/usecase/dto/ValidateManifestsResponse.js.map +0 -1
  803. package/dist/spec/usecase/dto/index.d.ts +0 -3
  804. package/dist/spec/usecase/dto/index.d.ts.map +0 -1
  805. package/dist/spec/usecase/dto/index.js +0 -3
  806. package/dist/spec/usecase/dto/index.js.map +0 -1
  807. package/dist/spec/usecase/index.d.ts +0 -10
  808. package/dist/spec/usecase/index.d.ts.map +0 -1
  809. package/dist/spec/usecase/index.js +0 -10
  810. package/dist/spec/usecase/index.js.map +0 -1
  811. package/dist/testing/cases/before-hook.d.ts +0 -4
  812. package/dist/testing/cases/before-hook.d.ts.map +0 -1
  813. package/dist/testing/cases/before-hook.js +0 -71
  814. package/dist/testing/cases/before-hook.js.map +0 -1
  815. package/dist/testing/cases/corpus.d.ts +0 -12
  816. package/dist/testing/cases/corpus.d.ts.map +0 -1
  817. package/dist/testing/cases/corpus.js +0 -91
  818. package/dist/testing/cases/corpus.js.map +0 -1
  819. package/dist/testing/cases/policy.d.ts +0 -74
  820. package/dist/testing/cases/policy.d.ts.map +0 -1
  821. package/dist/testing/cases/policy.js +0 -142
  822. package/dist/testing/cases/policy.js.map +0 -1
  823. package/dist/testing/cases/printer.d.ts +0 -4
  824. package/dist/testing/cases/printer.d.ts.map +0 -1
  825. package/dist/testing/cases/printer.js +0 -32
  826. package/dist/testing/cases/printer.js.map +0 -1
  827. package/dist/testing/cases/report-view.d.ts +0 -5
  828. package/dist/testing/cases/report-view.d.ts.map +0 -1
  829. package/dist/testing/cases/report-view.js +0 -33
  830. package/dist/testing/cases/report-view.js.map +0 -1
  831. package/dist/testing/cases/requisition.d.ts +0 -4
  832. package/dist/testing/cases/requisition.d.ts.map +0 -1
  833. package/dist/testing/cases/requisition.js +0 -38
  834. package/dist/testing/cases/requisition.js.map +0 -1
  835. package/dist/testing/cases/search-places.d.ts +0 -4
  836. package/dist/testing/cases/search-places.d.ts.map +0 -1
  837. package/dist/testing/cases/search-places.js +0 -60
  838. package/dist/testing/cases/search-places.js.map +0 -1
  839. package/dist/testing/cases/stock.d.ts +0 -4
  840. package/dist/testing/cases/stock.d.ts.map +0 -1
  841. package/dist/testing/cases/stock.js +0 -35
  842. package/dist/testing/cases/stock.js.map +0 -1
  843. package/dist/testing/cases/store.d.ts +0 -4
  844. package/dist/testing/cases/store.d.ts.map +0 -1
  845. package/dist/testing/cases/store.js +0 -100
  846. package/dist/testing/cases/store.js.map +0 -1
  847. package/dist/testing/harness.d.ts +0 -94
  848. package/dist/testing/harness.d.ts.map +0 -1
  849. package/dist/testing/harness.js +0 -168
  850. package/dist/testing/harness.js.map +0 -1
  851. package/dist/testing/index.d.ts.map +0 -1
  852. package/dist/testing/index.js.map +0 -1
  853. package/dist/testing/report.d.ts +0 -15
  854. package/dist/testing/report.d.ts.map +0 -1
  855. package/dist/testing/report.js +0 -22
  856. package/dist/testing/report.js.map +0 -1
  857. package/dist/web/createRestSurface.d.ts +0 -7
  858. package/dist/web/createRestSurface.d.ts.map +0 -1
  859. package/dist/web/createRestSurface.js +0 -39
  860. package/dist/web/createRestSurface.js.map +0 -1
  861. package/dist/web/index.d.ts +0 -2
  862. package/dist/web/index.d.ts.map +0 -1
  863. package/dist/web/index.js +0 -2
  864. package/dist/web/index.js.map +0 -1
  865. package/docs/adr/0001-four-atom-manifest-model.md +0 -440
  866. package/docs/adr/0002-closed-enums-for-bindings.md +0 -253
  867. package/docs/adr/0007-ai-as-primary-author.md +0 -473
  868. package/docs/adr/0008-structured-diagnostic-shape.md +0 -338
  869. package/docs/adr/0009-consumer-supplied-manifests.md +0 -149
  870. package/docs/adr/0010-locale-and-translates.md +0 -453
  871. package/docs/adr/0011-adapter-port-spec.md +0 -281
  872. package/docs/adr/0012-views-as-public-rest.md +0 -161
  873. package/docs/adr/0013-agent-provisioned-consumer-projects.md +0 -154
  874. package/docs/adr/0014-auth-better-auth-and-multi-tenant-mcp.md +0 -919
  875. package/docs/adr/0016-site-semantic-layer.md +0 -70
  876. package/docs/adr/0017-media-multi-variant-agent-side-optimization.md +0 -181
  877. package/docs/adr/0018-core-starters-repository-boundary.md +0 -179
  878. package/docs/adr/0019-sealed-manifest-runtime-pipeline.md +0 -244
  879. package/docs/adr/0020-builtin-handler-contracts-and-matched-upsert.md +0 -199
  880. package/docs/adr/0021-retire-starter-scaffolding.md +0 -30
  881. package/docs/adr/0022-caller-observed-version-occ.md +0 -212
  882. package/docs/adr/0023-port-failure-contract.md +0 -69
  883. package/docs/adr/0024-manifest-native-schema-tables.md +0 -264
  884. package/docs/adr/0025-reserved-native-columns-and-published-only-public-views.md +0 -105
  885. package/docs/adr/0026-progressive-generate.md +0 -36
  886. package/docs/adr/0027-scheduled-procedure-triggers.md +0 -31
  887. package/docs/adr/0028-schema-ttl-expiry.md +0 -33
  888. package/docs/adr/0029-mcp-apps-interaction-contracts.md +0 -324
  889. package/docs/adr/0030-store.md +0 -40
  890. package/docs/adr/0031-host-cloud-core-contract.md +0 -25
  891. package/docs/adr/0032-store-centric-core-and-service-contract.md +0 -361
  892. package/docs/adr/0033-storage-converges-to-the-plan.md +0 -92
  893. package/docs/adr/0034-store-is-authored-as-sql.md +0 -192
  894. package/docs/adr/0035-sql-dialects.md +0 -154
  895. package/docs/adr/0036-host-and-dialect.md +0 -65
  896. package/docs/adr/0037-postgresql-is-the-reference-dialect.md +0 -124
  897. package/docs/adr/0038-bun-native-host.md +0 -63
  898. package/docs/adr/README.md +0 -96
  899. package/docs/adr/adr-lite-803-request-diagnostics.md +0 -38
  900. package/docs/adr/adr-lite-808-route-readiness.md +0 -47
  901. package/docs/adr/adr-lite-809-bounded-public-content.md +0 -71
  902. package/docs/adr/adr-lite-812-native-parity.md +0 -150
  903. package/docs/adr/adr-lite-823-home-statistics.md +0 -64
  904. package/docs/adr/adr-lite-842-mcp-authoring.md +0 -30
  905. package/docs/adr/adr-lite-845-frontend-client.md +0 -38
  906. package/docs/adr/adr-lite-861-admin-webmcp.md +0 -48
  907. package/docs/adr/adr-lite-909-admin-ui-kit.md +0 -37
  908. package/docs/examples/commerce-inventory.md +0 -481
  909. package/docs/examples/commerce.md +0 -254
  910. package/docs/examples/guarded-api.md +0 -238
  911. package/docs/examples/intake-hooks.md +0 -237
  912. package/docs/examples/intake.md +0 -127
  913. package/docs/examples/legal-documents.md +0 -218
  914. package/docs/examples/procurement.md +0 -215
  915. package/docs/examples/publication.md +0 -211
  916. package/docs/examples/reference-service/.mantle/generated/mantle.ts +0 -174
  917. package/docs/examples/reference-service/.mantle/generated/plan.json +0 -1936
  918. package/docs/examples/reference-service/README.md +0 -33
  919. package/docs/examples/reference-service/manifests/catalog.yaml +0 -103
  920. package/docs/examples/reference-service/manifests/orders.yaml +0 -120
  921. package/docs/examples/reference-service/mantle.config.json +0 -1
  922. package/docs/examples/reference-service/package.json +0 -27
  923. package/docs/examples/reference-service/smoke.mjs +0 -156
  924. package/docs/examples/reference-service/src/handlers.ts +0 -36
  925. package/docs/examples/reference-service/src/index.ts +0 -33
  926. package/docs/examples/reference-service/src/service.ts +0 -78
  927. package/docs/examples/reference-service/wrangler.jsonc +0 -26
  928. package/docs/examples/reservation.md +0 -142
  929. package/docs/skills/develop/mcp-app.md +0 -79
  930. /package/docs/examples/{reference-service → app-shell}/.dev.vars.example +0 -0
@@ -0,0 +1,566 @@
1
+ # Native Admin
2
+
3
+ Select Admin explicitly; use the exact installed SDK/Admin versions.
4
+
5
+ ## Packages and generation
6
+
7
+ There are three packages, pinned to matching versions:
8
+
9
+ | Package | Owns |
10
+ | --- | --- |
11
+ | `@aotter/mantle` | One native Core SDK: compiler, generator, query kernel and optional auth/surface primitives. |
12
+ | `@aotter/mantle-admin` | Optional Admin server, the library an application builds its Admin SPA and MCP App from, design preview and `adminMcpApps`. |
13
+ | `@aotter/mantle-ui` | Shared UI kit and generic interaction controller. |
14
+
15
+ The SDK does not import Admin or its assets. Selecting Admin emits application
16
+ code that imports its small public server helpers. The SPA retains all 22
17
+ languages, rich editors and the developer workspace; language, editor and
18
+ workspace chunks load on demand. It is not part of the SDK query bundle.
19
+
20
+ Select Admin explicitly:
21
+
22
+ ```sh
23
+ pnpm exec mantle generate cloudflare-d1 generated manifests/*.yaml --admin
24
+ pnpm exec tsc --noEmit
25
+ ```
26
+
27
+ Targets are `bun-sqlite`, `bun-postgres`, `cloudflare-d1` and
28
+ `cloudflare-postgres`. Programmatic generation accepts `admin: true` with the
29
+ same target/source options. Optional `--auth` and `--site`
30
+ modules follow their [generation contracts](../cloudflare/service-entry.md).
31
+ Generate, typecheck, implement every printed `Handlers` key, then typecheck
32
+ again. Commit generated TypeScript, SQL and Wrangler edits. Never edit the
33
+ output by hand; regenerate after merging authored inputs. Use the matching
34
+ CLI's `--check` with the same selected options in CI.
35
+
36
+ Apply initial `schema.sql` and selected auth/site DDL only during explicit
37
+ setup of a new database. Existing data needs reviewed migrations. Imports and
38
+ metadata factories do no storage work. Requests run no DDL or storage checks;
39
+ the only request-time write outside app operations is the configured OAuth
40
+ resource row (see [OAuth](oauth.md)).
41
+
42
+ ## Mount the API and console
43
+
44
+ ```ts
45
+ import { admin } from '@aotter/mantle-admin/server';
46
+ import { entries } from '@aotter/mantle-admin/server/entries';
47
+ import { adminBindings } from './generated/admin-bindings.js';
48
+ import { handlers } from './handlers.js';
49
+ import { resolveRequestCaller } from './identity.js'; // application-owned
50
+
51
+ const bindings = adminBindings({ handlers });
52
+ const api = admin(bindings.metadata, bindings.views, bindings.operations, {
53
+ db: (env: Env) => env.DB,
54
+ caller: resolveRequestCaller,
55
+ routes: entries(bindings.schemas, bindings.adapter),
56
+ developerViews: bindings.developerViews,
57
+ });
58
+ // In app-owned fetch: await api(request, env); undefined means fall through.
59
+ ```
60
+
61
+ Ref operations run with the handlers given to `adminBindings({ handlers })`; `admin()` needs no second copy. Without ref Procedures, omit `handlers` and use `adminBindings()`. The app's
62
+ resolver verifies the caller; Admin accepts an admin cookie session classified from
63
+ Better Auth’s admin plugin `adminRoles` (default `["admin"]`), and cookie writes
64
+ retain the shared same-origin check. Comma-separated roles are supported.
65
+ Do not manufacture an admin/system Caller from request input. Views and operations
66
+ also retain their own generated `requires` checks. Share one request-local
67
+ resolver with auth, consent, MCP and REST; preserve its response cookie headers.
68
+
69
+ The API handles `/admin/api/*`. The app separately serves the Admin that
70
+ `mantle bundle` builds into `<assets>/admin` (default `dist/client/admin`, on Workers
71
+ and on Bun, where it builds only Admin) at `/admin`, including
72
+ client routes such as `/admin/sign-in`; missing assets stay 404. Do not serve
73
+ that directory bare: `adminShell(request, assets)` from
74
+ `@aotter/mantle-admin/server` returns the shell for every `/admin` page with
75
+ `frame-ancestors 'none'`, `X-Frame-Options: DENY`, `no-store` and `nosniff`, and
76
+ refuses traversal, encoded separators and control characters (`assets` fetches one built file
77
+ by its path within that directory; a 404 means missing; it returns `undefined` for other requests). `@aotter/mantle-ui` continues to supply the shared kit. See
78
+ [service composition](../cloudflare/service-entry.md) for the complete Fetch/Bun wiring.
79
+
80
+ Browser pages: a collection at `/admin/c/<schema>`, an admin View at `/admin/views/<view>` (its input as query parameters), a custom page at `/admin/p/<path>`.
81
+
82
+ ## HTTP routes
83
+
84
+ All paths below start with `/admin/api` and require an admin session; mutations
85
+ also require the shared same-origin check. Mount `entries(...)` for collection
86
+ routes. Send JSON with `Content-Type: application/json`.
87
+
88
+ These routes serve Admin's console with its session cookie; they are not a client API. A REST client reads back what it
89
+ wrote through the app's own Views with HTTP Triggers (`mantle help trigger`).
90
+
91
+ | Method and path | Request / response |
92
+ | --- | --- |
93
+ | `POST /entries` | Body `{ collection, data }`; creates an entry. |
94
+ | `GET /entries/{id}?collection=<schema>` | Reads an entry and its current `entry.version`. |
95
+ | `PATCH /entries/{id}?collection=<schema>` | Body `{ data, expectedVersion }`; sends the observed version, not the next one. Publishing entries must be drafts. |
96
+ | `POST /entries/{id}/publish?collection=<schema>` | Body `{ expectedVersion }`; validates required data before publishing. |
97
+ | `POST /entries/{id}/unpublish?collection=<schema>` | Body `{ expectedVersion }`; returns the entry to draft. |
98
+ | `POST /operations/{name}` | Body is the Procedure's input; runs an Admin operation (a Procedure with `requires: ctx.admin` or a `target`). Returns `{ ok: true, output }`, where `output` is what REST and MCP return (`{ results }` for a SQL Procedure). |
99
+ | `GET /views/{name}` | Generated admin View query parameters plus `limit`/`cursor`; returns `{ rows, nextCursor? }`. |
100
+ | `GET /view-batch?names=a,b` | One to 20 comma-separated admin View names, deduplicated; reads the first row of each as the caller, with the single route's checks (`requires`, scope, TTL, `authorize`), and returns `{ views: { <name>: { rows } \| { unavailable: true } \| { error: true } } }`. A refused View and a missing one are the same `{ unavailable: true }`; a View that cannot answer with no input is `{ error: true }`. Neither fails the batch. Empty or more than 20 names is a 400, before the database is acquired. |
101
+ | `GET /me` | Returns `{ userId, role, admin, login, image }` for the signed-in caller. |
102
+ | `GET /admin` | Administrators and pending invitations, plus `adminRoles` (mounted with `identity`). |
103
+ | `GET /members?search=&limit=&cursor=&direction=` | Pages members (1–100), searching id, name and email. |
104
+ | `PATCH /admin/{id}/role` | Body `{ role }`: an admin role name grants Admin, `null` removes it. You cannot change your own role. |
105
+ | `POST /admin/invitations` | Body `{ email, role }`; invites an administrator by email. Returns `{ ok, userId, emailSent }`. |
106
+ | `DELETE /admin/invitations/{id}` | Revokes an invitation nobody has signed in to yet (otherwise 409). |
107
+
108
+ Entry create/read/patch/transitions return
109
+ `{ collection, entry, parentEntryId, parentEntryTitle, related }`; the entry has
110
+ `{ id, collection, locale, status, version, data, created_at, updated_at }`.
111
+ Transitions accept `{}` to use the current version; tests should send the
112
+ observed `expectedVersion` to catch stale writes. Generic writes reject native
113
+ columns inside `data`. See [publishing](../concepts/lifecycle-and-locales.md).
114
+
115
+ ## Typed data hooks
116
+
117
+ `--admin` emits `generated/admin-client.ts`: the type of each admin View's input and row, of each collection's entry
118
+ `data` (declared field names, no scope field; every field optional for a `publishing` collection, as a draft is only partly
119
+ validated), and of each admin operation's input and output, and the hooks bound to those types. A View's row has the column
120
+ names the browser route gives it (declared case, where the SQL output name is lowercased). An entry such as `src/admin.tsx`
121
+ passes `admin`, which lists those renames, to `defineAdmin(admin)` so that an MCP App's rows match, and its components read
122
+ data through the hooks:
123
+
124
+ ```tsx
125
+ import { useOperation, useView } from "../generated/admin-client.js";
126
+
127
+ function Queue() {
128
+ const { rows, status, hasMore, loadMore, loadingMore } = useView("pending-requests", {}); // names, input and rows are checked by tsc
129
+ const approve = useOperation("approve");
130
+ if (status === "unavailable") return null;
131
+ return (
132
+ <>
133
+ {rows.map(row => <button key={String(row.id)} onClick={() => approve.run?.({ id: String(row.id) })}>{row.title}</button>)}
134
+ {hasMore ? <button disabled={loadingMore} onClick={loadMore}>Load more</button> : null}
135
+ </>
136
+ );
137
+ }
138
+ ```
139
+
140
+ The hooks read only the routes above, with the Admin session cookie and Admin's own query cache, so every route still checks
141
+ the caller, `requires`, scope and TTL; a hook has no caller, role or system argument. A 403 and a 404 both read as
142
+ `status: "unavailable"` (an operation's `run` rejects with `AdminUnavailableError`), so the front end cannot tell a
143
+ refused View or collection from a missing one. Showing or hiding a component grants or denies nothing.
144
+
145
+ | Hook | Route | Surface |
146
+ | --- | --- | --- |
147
+ | `useView(name, input, { limit? })` -> `{ rows, status, hasMore, loadMore, loadingMore }` | `GET /views/{name}` | browser and MCP App |
148
+ | `useOperation(name)` -> `{ run, pending }`; success refreshes Views, entries, entry editors and totals | `POST /operations/{name}` | browser and MCP App |
149
+ | `useEntries(collection, { filter?, search?, limit? })` -> `{ items, status, hasMore, loadMore, loadingMore }` | `GET /entries` (one `filter_field`/`filter_value`) | browser only |
150
+ | `useEntry(collection, id)` | `GET /entries/{id}` | browser only |
151
+ | `useCollectionTotal(collection)` | `GET /collections/{name}/statistics`, its `total` | browser only |
152
+ | `useMe()` | `GET /me` | browser only |
153
+ | `useBadges(refs)` -> one `{ count, status }` per `{ view, field }`, in order; [freshness below](#sidebar-badges) | `GET /view-batch` | browser only |
154
+
155
+ `useView` and `useEntries` accumulate: `rows` (`items`) holds every page loaded so far, in order, and `loadMore()` fetches the next
156
+ page and appends it while `hasMore` is true. There are no page numbers and no "previous page"; changing the input (or the
157
+ options) starts again from the first page. A failed `loadMore()` leaves `status` at `error` with the rows already loaded kept, and
158
+ calling `loadMore()` again retries. Admin's own lists work the same way, under a "Load more" button, and so does the MCP App, which
159
+ shows the button only when the host has `serverTools` (it calls the View's tool again with the same input and the `cursor`).
160
+
161
+ In an MCP host, `useView` and `useOperation` call the View's or operation's admin MCP tool (its name lowercased, kebab to snake) through the host (`tools/call`),
162
+ under the caller's MCP authorization; the browser-only hooks read `unavailable` there, so declare the data an App needs as an
163
+ admin View. Without the host's `serverTools`, `run` is `undefined`. `useHost()` is `null` in the browser and the host's API
164
+ (context, capabilities, `openLink`, `sendMessage`, `updateModelContext`, `requestDisplayMode`) in a host; `useAdminSurface()`
165
+ says which. `@aotter/mantle-admin/hooks` also exports the same hooks untyped, for code without generated types.
166
+
167
+ `@aotter/mantle-admin/app` and `/hooks`, and so `generated/admin-client.ts`, which imports them, run in the browser only:
168
+ `mantle bundle` refuses them in the Worker's startup graph.
169
+
170
+ ## Customising Admin
171
+
172
+ An application replaces or wraps regions of Admin from `src/admin.tsx`. The entry passes the generated metadata and, beside it,
173
+ what to change; the built-in entry needs none of this.
174
+
175
+ If browser-only integrations need APIs that an MCP host forbids, keep their implementations outside the host graph: add a sibling `src/admin.mcp.tsx`, also default-exporting `defineAdmin(...)`, and share the host-safe config and components between the two entries. `mantle bundle` selects it automatically for the MCP asset; the SPA and preview still use `admin.tsx`. The direct build API accepts `mcpEntry`. See [isolate browser-only integrations](mcp-apps.md#isolate-browser-only-integrations).
176
+
177
+ ```tsx
178
+ import { defineAdmin } from "@aotter/mantle-admin/app";
179
+ import { admin } from "../generated/admin-client.js";
180
+
181
+ export default defineAdmin(admin, {
182
+ pages: [{ path: "budget", title: "Budget", element: <BudgetPage />, nav: { group: "reports" } }],
183
+ components: {
184
+ // wrap: the built-in page below your own section
185
+ Home: (props) => <><MyQueue />{props.renderDefault(props)}</>,
186
+ // change a prop: the sidebar with a footer
187
+ Sidebar: (props) => props.renderDefault({ ...props, footer: <HelpLink /> }),
188
+ // replace: one value in the requests list, and the control of one field in its record form
189
+ "cell:requests.amount": ({ value }) => <Money cents={value} />,
190
+ "input:products.color": ({ value, onChange }) => <ColorPicker value={value} onChange={onChange} />,
191
+ "record.aside:requests": ({ entry }) => <RequestTimeline id={entry.id} />,
192
+ },
193
+ plugins: [auditTrail()],
194
+ });
195
+ ```
196
+
197
+ Every component receives the props of the built-in one and `renderDefault(props)`, which renders what it replaces: pass the
198
+ props you were given (spread them to change some), or ignore it to replace the region. A slot is named by a key that `tsc`
199
+ derives from the generated metadata, so a misspelt collection, field or View column is a type error. In a key `<schema>` is a
200
+ collection's name, `<field>` one of its fields and `<column>` a column of an admin View (names contain no `.`).
201
+
202
+ | Slot | Surface | Props (besides `renderDefault`) |
203
+ | --- | --- | --- |
204
+ | `Shell` | browser | `children`, `nav` (sidebar groups), `brand` |
205
+ | `Sidebar` | browser | `groups`, `brand`, `footer?` (above the signed-in user) |
206
+ | `Header` | browser | `title?`, `actions?` (before the built-in controls) |
207
+ | `Brand` | browser | `title`, `image?`, `href?` |
208
+ | `Home` | browser | `collections`, `site` (what the page shows; the built-in page loads its own data) |
209
+ | `CollectionList` | browser | `collection` (filters come from the page's location) |
210
+ | `RecordView` | browser | `collection`, `entryId`, `surface` |
211
+ | `record.aside:<schema>` | browser | `collection`, `entry`, `surface` |
212
+ | `record.actions:<schema>` | browser | `collection`, `entry`, `surface` |
213
+ | `list.actions:<schema>` | browser | `collection`, `selection` (empty in the toolbar, the selected ids in the bulk bar) |
214
+ | `cell:<schema>.<field>` | browser | `value`, `row` (the list's columns only, `null` when empty), `property`, `surface` |
215
+ | `cell:view:<view>.<column>` | both | `value`, `row`, `property`, `surface` |
216
+ | `input:<schema>.<field>` | browser | `value`, `onChange`, `readOnly`, `property`, `surface` |
217
+
218
+ `record.aside:` and `record.actions:` render beside Admin's own side cards and actions, which they do not replace. A
219
+ record form's top-level fields go through `input:`; a View's parameters and a Procedure's inputs do not. A read-only field
220
+ (a bound or `readOnly` property) has no `input:` component, and `readOnly` tells yours that the caller cannot edit the
221
+ record. In the browser Admin, a View column that reads a Schema field also goes through that field's `cell:` component, with the column's own
222
+ `cell:view:` component outside it; the MCP App renders only `cell:view:`. The developer workspace (`/admin/dev`) is Admin's own tool and does not go through any slot. A record with folded child collections opens on a workbench at `/admin/c/<schema>/<id>`, which is not `RecordView`; the record form (and so `RecordView`, `record.aside:`, `record.actions:` and `input:`) is its `/edit` page. A `Shell` that does not call `renderDefault` has no status bar: the record form's Save and Publish bar then stays in the page.
223
+
224
+ `plugins` are fragments of `components`, applied in order: each one's `renderDefault` is the plugin before it, the first
225
+ plugin's is the built-in component, and the application's own `components` are outermost. A plugin is
226
+ `{ components: { ... } }`, so one can be written once and shared.
227
+
228
+ `mcp: { csp: { connectDomains, resourceDomains, frameDomains, baseUriDomains } }` names the remote origins Admin's MCP App may
229
+ load. `mantle bundle` builds that App from this same entry (`<assets>/admin/mcp-app.html`) and fails it on an origin that is not
230
+ declared. The build writes the declaration into the file, and `adminMcpApps` sends it to the host as `_meta.ui.csp` on `resources/read`.
231
+ A page may also be an MCP App view: `pages: [{ path, title, element, mcp: { renders: "<view>" } }]`, where `renders` is an admin
232
+ View that has an MCP tool (`tsc` checks it against the generated `admin-client.ts`).
233
+
234
+ Authorization is unchanged by any of this. A component that shows or hides something grants or denies nothing; the server
235
+ checks every route, View and Procedure.
236
+
237
+ ### Components that also render in an MCP host
238
+
239
+ Record/collection slots carry `surface: "browser"` and do not mount in an MCP
240
+ Procedure action form. A slot marked both renders in Admin's browser page and in an MCP host (`surface` is `"browser"` or `"mcp-app"`). A component
241
+ for one of these slots must:
242
+
243
+ 1. read and write data only through the hooks, not `fetch`, and keep no login state in `document.cookie` or `localStorage`;
244
+ 2. link with `<AdminLink href>` or open URLs with `useOpenLink()` (from `@aotter/mantle-admin/app` and `/hooks`),
245
+ never `window.open` or `target="_blank"`, which a host's sandbox blocks. In a host `<AdminLink>` opens an http(s) URL
246
+ through `ui/open-link` and shows any other href, such as an `/admin/...` path, as plain text, as it has no origin there;
247
+ 3. assume no width: a host sets it;
248
+ 4. render something on both surfaces when it branches on `surface` or `useAdminSurface()`.
249
+
250
+ `useOpenLink()` resolves `false` for anything but an http(s) URL, and when a host cannot or refuses to open it.
251
+
252
+ `mantle bundle` enforces 1 and 2 on the built App (no `/admin/api`, no `document.cookie`, no undeclared remote origin; `window.open`
253
+ and `target="_blank"` warn), and your CSS and Tailwind classes reach the App. The surface table, the theme mapping and the full
254
+ rules are in [Customising Admin for MCP hosts](mcp-apps.md#customising-admin-for-mcp-hosts).
255
+
256
+ ### Hot reload while you work on `src/admin.tsx`
257
+
258
+ By default `wrangler dev` rebuilds Admin with `mantle bundle` when its sources change; reload the page. For hot module
259
+ replacement, add a Vite config yourself; nothing in a template enables it:
260
+
261
+ ```ts
262
+ // vite.config.ts
263
+ import { defineConfig } from "vite";
264
+ import { adminVitePlugin } from "@aotter/mantle-admin/build";
265
+ export default defineConfig({ plugins: [adminVitePlugin({ entry: "src/admin.tsx" })] });
266
+ ```
267
+
268
+ Run `vite` beside `wrangler dev` and open `http://localhost:5173/admin/`. The plugin proxies `/admin/api` and `/api/auth` to
269
+ `http://localhost:8787` (`target` changes it; `authBasePath` names the auth path when the service's is not `/api/auth`). The proxy keeps
270
+ the dev server's `Host`, so the browser's `Origin` and the service's own origin agree and session writes pass the same-origin check.
271
+ The service may still need to trust `http://localhost:5173` as an auth origin for sign-in.
272
+
273
+ ## Generated reads and writes
274
+
275
+ `adminBindings()` returns static metadata, schemas, views, operations and the
276
+ selected native adapter. Metadata-only endpoints add no storage read of their
277
+ own; authentication, optional user enrichment or site loading may still query.
278
+ The shared get/page/statistics functions select quoted tables and columns only
279
+ from generated whitelists. Search/filter/cursor/range values are binds, never
280
+ SQL identifiers. Core compiles scope, TTL, publishing and parent predicates;
281
+ there is no request-time manifest/schema/SQL AST interpreter.
282
+
283
+ Scoped rows remain private even from other admin. Translation reads merge at
284
+ most one visible parent with the matching join key; scoped parents correlate
285
+ scope in every mode, including trusted reads. Child declarations win over parent
286
+ fields, and a parent's public same-named field cannot replace a child's private
287
+ scope. Unrelated scoped Schemas cannot hide an ordinary public field. Scope and
288
+ storage-only fields are absent from entry data and generated CSV export fields.
289
+ Geo remains experimental: existing native outputs are readable, not generically
290
+ editable. Metadata derives child relationships from `allCollections`.
291
+
292
+ Entry queries validate indexed sort fields, directions, filters and limits
293
+ 1–500. `filter_field` and JSON `filter_values` are paired; each batch has at most
294
+ 50 scalar values. Search reuses native SQLite/D1 FTS and PostgreSQL behavior.
295
+ Pages keep native NULL ordering, id ties, microsecond timestamp keys and an
296
+ opaque cursor bound to caller, input, filters and ordering. Malformed/foreign
297
+ cursors and unknown selectors fail before acquiring the route's DB handle;
298
+ the app's authentication may already have used its own database. Admin manifest
299
+ Views retain their complete proved key tuple, not a two-key approximation. A View without a key is accepted only as a proved
300
+ singleton, such as an aggregate without `GROUP BY` (`SELECT COUNT(*) AS count FROM requests WHERE status = 'submitted'`): it
301
+ returns its one row on one page and has no cursor.
302
+
303
+ Generated full/partial input checks validate creates, edits, operations and
304
+ filters. Plain titled string `oneOf` choices use the same enum checks; general
305
+ or constrained alternatives remain refused. Draft creates can be incomplete;
306
+ publish checks required data. Publishing edits apply only to drafts. Read-only
307
+ collections refuse generic creates, edits, deletes and transitions with 403 `AUTH_DENIED`
308
+ ("This record is read-only; use its operations.") before any read or write, while
309
+ their declared Procedures can still run.
310
+
311
+ Writes use compiler-printed native Procedure frames, bind recipes and only the
312
+ supplied field fragments. They do not update omitted columns or run a schema
313
+ interpreter. PATCH retains its visible-row read and exact OCC check; the mutation
314
+ returns its row. Missing/excluded rows are 404; stale locks or failed state guards
315
+ are 409. Safe versions are numbers; exact native int64 strings can be bound
316
+ without rounding, while unsafe numbers are rejected. The console keeps versions
317
+ outside its supported safe range read-only rather than casting them to numbers.
318
+ Full cross-target int64 output parity remains incomplete; bare driver values
319
+ are unchanged.
320
+
321
+ Publishing/custom Admin operations load existing generated Procedure modules
322
+ when invoked. Ref handlers retain the original typed `{ caller, db, store }`
323
+ context and authorization. Ordinary SDK/REST/MCP emission and the synchronous
324
+ public Store API are unchanged. Selected JSON boundaries preserve declared JSON/boolean conversions and safe
325
+ cross-target integer normalization from SQL text; exact unsafe values are not rounded. Bare
326
+ Views, Store and SQL Procedures keep their driver-native contract. Native
327
+ unique/OCC errors and uncertain transaction outcomes keep their contracts. A 503 outcome may mean a write committed: do not
328
+ retry automatically or turn it into a success by reading afterward. Core
329
+ `statusOf` maps core codes only. App media/site/partial errors use `mediaError`
330
+ from `@aotter/mantle/media`; other custom ContractErrors must carry an explicit
331
+ status, otherwise the boundary returns a redacted 500. Do not leak native
332
+ error messages, tokens or credentials to clients.
333
+
334
+ ## Statistics
335
+
336
+ `GET /admin/api/collections/{name}/statistics?range=7d` supports primary or
337
+ standalone collections; folded children/translations are not primary routes.
338
+ Ranges are `1h`, `24h`, `7d` (default) and `20d`. It returns
339
+ `{ total, buckets, from, to, bucketMs }` in one native aggregate query. `total`
340
+ counts currently caller-visible retained rows, including rows outside the
341
+ requested window; expired rows are excluded. Buckets use `[from, to)` and the
342
+ same generated scope/TTL/parent policy. The shared native function accepts at
343
+ most 20 days and 480 buckets, with safe microsecond arithmetic. Temporal enum
344
+ subtypes return original metadata keys; equivalent offset spellings count once
345
+ under the first key, and separate microseconds remain distinct.
346
+
347
+ Site/media/identity, WebMCP, design preview and MCP Apps are selected
348
+ through the public Admin modules, not added to the SDK kernel. A route with
349
+ `rawBody` receives the original Request without pre-reading, cloning or
350
+ rebuilding it; its custom `bodyLimit` checks Content-Length before DB access,
351
+ and the app must bound reads of unknown-length raw streams. Built-in JSON routes use the shared bounded reader
352
+ (default 1,000,000 bytes) after caller/origin checks and before DB acquisition.
353
+ The API advertises capabilities for actually mounted routes, including statistics.
354
+
355
+ ## Acceptance
356
+
357
+ Before reporting Admin pages or customisations as done, follow the [independent
358
+ acceptance guide](agent-workflow-acceptance.md) with a fresh evaluator in the
359
+ real Admin browser session.
360
+
361
+ Use a disposable database for native tests, then exercise actual OTP sign-in,
362
+ the Admin console and member frontend. Check invalid input, another tenant's
363
+ rows, expired rows, publishing transitions, related/translated entries, paging,
364
+ statistics, CSV, operations/ref effects, stale OCC and persisted state after a
365
+ restart. Recheck custom components, previews, all supported UI languages and the
366
+ complete developer workspace. A generated file, typecheck or HTTP 200 alone
367
+ does not verify these flows.
368
+
369
+ Native adapter evidence covers all four targets; local D1 uses real workerd.
370
+ Initial Admin module imports perform no DB work. Startup graphs, uploaded total,
371
+ SDK package bytes and query/write/cold timing are separate checks. Extra selected
372
+ Admin indexes add write/storage maintenance; an indexed SELECT plan does not
373
+ prove unchanged write latency. Report remaining gates honestly; this guide does not promise measured performance.
374
+
375
+ Entry lists and editor reads/writes return translation badges and related
376
+ sections in one authorized HTTP response.
377
+ Reference fields show titles, not only IDs: a list of an operational collection (for its `list.columns`) and an entry
378
+ read return `ref_titles` / `refTitles`, the title of each record that a displayed `x-mantle-ref` field points at, keyed by
379
+ field and stored value. The server resolves them for the caller with one page query per referenced collection and field
380
+ (at most 50 distinct values), exactly as the parent entry's title is resolved, so visibility and `authorize` apply to the
381
+ target. A missing, deleted or unreadable target is absent, so the three look the same: Admin shows the exact ID with copy.
382
+ A resolved title links to the related record. Admin Views and the MCP App have no such step, since their rows come from the
383
+ View itself; a View that wants a title selects it (join the referenced table, within its own `requires`). `/bootstrap?collection=...` can include
384
+ the first requested list page.
385
+ In the entry editor and every operation form (including a `collectionAction` create), a string field with
386
+ `x-mantle-ref` to another Admin collection is a searchable picker: it lists the target through the same `/entries` route
387
+ (20 records per search, read as the caller), shows each record's title and stores the referenced value (`id`, or the
388
+ ref's unique field). A target the caller cannot list (403/404) or that is not an Admin collection keeps the plain text
389
+ input. The picker is a convenience; the server still validates the value. CSV exports use `/entries/export` and
390
+ `/views/{name}/export`; native browser downloads stream paged server output.
391
+ A failure after headers aborts the stream, so a download can fail after partial
392
+ bytes have arrived. Existing databases need an app-owned migration for the
393
+ Admin-selected `created_at` statistics indexes emitted in initial `schema.sql`.
394
+
395
+ ## Migrating from Admin extensions
396
+
397
+ The extension mechanism is gone: Admin is an application-built React library, and the application's own code replaces
398
+ what an extension contributed. Alpha applications that used it change as follows.
399
+
400
+ | Removed | Use instead |
401
+ | --- | --- |
402
+ | `--admin-extensions <module>`, `adminExtensions`, `src/admin.ts`, generated `admin-extensions.ts` | Drop the flag from `generate` and `check` scripts and delete the module. `generate` now rejects the option and removes the generated `admin-extensions.ts` (it is SDK-owned). |
403
+ | `navGroups` in that module | `defineAdmin(admin, { nav: { groups } })` in `src/admin.tsx`, an object keyed by group id instead of an array: `{ id: "approvals", title, order }` becomes `approvals: { title, order }`. `tsc` refuses a group the manifest uses and `groups` omits. See [Sidebar](#sidebar). |
404
+ | `defineAdminExtension`, `@aotter/mantle-admin/extension` | React components in `defineAdmin`: `components` for the regions below, `pages` for whole pages; see [Customising Admin](#customising-admin) and [Sidebar](#sidebar). |
405
+ | Field widget `widget: <extension>/<contribution>` and `options` | `"input:<schema>.<field>"` in `components`. `widget: textarea` stays. |
406
+ | `list.cells` on a Schema or View | `"cell:<schema>.<field>"` or `"cell:view:<view>.<column>"` in `components`. |
407
+ | `uiSchema.panels`, `record.sidebar/v1` and `home/v1` panels | `"record.aside:<schema>"` and the `Home` component. |
408
+ | `record/v1`, `list.selection/v1` and `list.toolbar/v1` actions | `"record.actions:<schema>"` and `"list.actions:<schema>"`; call a Procedure with `useOperation`. |
409
+ | Handlers `api`, `settings` and `actions.run`, and the `/admin/api/x/<extension>/*` routes | Server work is a Procedure (writes), a View (reads) or an application route. Authorization stays on the server: a Procedure or View carries its own `requires`. |
410
+ | `extensionBindings`, `extensionOptions`, `@aotter/mantle-admin/server/extensions`, the `extensions` and `navGroups` options of `admin()` and the `extensions` field of `/admin/api/site` | Delete them. |
411
+ | The import map and `shared/*.js` shims in the built Admin | None: the application's bundle holds the one React there is. Drop any CSP hash for the import map. |
412
+ | Extension pages (`/admin/x/<extension>/<page>`) | `defineAdmin({ pages: [{ path, title, element, nav }] })` at `/admin/p/<path>`; `nav: { group, order? }` replaces the page's `nav`, in a built-in group or one the manifest uses (an extension's own `navGroups` entry that no Schema or View uses cannot hold a page). A page has no `role`: every member sees it, so gate inside the element with `useMe()`; the `requires` of the View or Procedure it calls still decides what works. |
413
+ | Extension settings pages (declared form, `settings` handlers) | A page in `pages` whose element reads and saves through a View and a Procedure that hold the settings, or an application route. |
414
+
415
+ A manifest that still names a removed key fails `mantle generate` with `SCHEMA_UI_INVALID` or `VIEW_UI_INVALID` at the
416
+ key's path. The `UI_EXTENSION_*` diagnostics no longer exist.
417
+
418
+ ## Collection list template today
419
+
420
+ The compiler derives display/filter metadata from Schema `uiSchema`, searchable fields from `searchableFields`, and sortable fields from indexes plus required/non-null fields and selected system columns. It emits per-collection quoted fragments, row policies and bind recipes; Admin uses one shared `nativeEntryPage` implementation, not Store `find`, `search` or `count` for these lists.
421
+
422
+ Requests select only generated fields and append only supplied predicates. Absent filters are omitted, rather than expressed as `(? IS NULL OR …)`. Sorts and scalar values are checked before the route acquires its DB handle. In 0.2.0 there is no generated Cartesian set of filter variants or variant cap: runtime SQL shapes depend on selected filters, bounded IN lists, search, cursor and order. Only sortable fields are checked for indexes; there is no per-filter-combination index proof. Inspect EXPLAIN for the actual workload.
423
+
424
+ Store keeps `find({ search })`, `first({ search })` and `count(where?)`. See [Store search and count costs](typed-queries.md#store-reads-and-writes): Admin shares the dialect search, and a View does not make PostgreSQL ILIKE faster.
425
+
426
+ ## Collection navigation and operation placement
427
+
428
+ A Schema with a required `x-mantle-ref` folds under its parent collection: it
429
+ opens from the parent entry's workbench and stays out of the sidebar, while
430
+ `/admin/c/<schema>` still lists it; translation children remain on language
431
+ tabs. The parent is the reference named by `Schema.spec.uiSchema.nav.parentField` (a required
432
+ `x-mantle-ref` field, by `id` or by a unique field), else the only required `id` reference, else
433
+ the first required unique-field reference. A Schema with two or more required `id` references to
434
+ existing Schemas (translations excluded) and no `parentField`, with or without `standalone`, is refused by `mantle generate` with `SCHEMA_UI_INVALID`; the diagnostic lists the
435
+ candidates and the `nav: { parentField: <field> }` line that keeps the first one that is not a parent cycle. This applies to every build, with or without Admin, so a join table with two required `id` references needs it too. `parentField` is
436
+ refused on a translation child and when its parent chain leads back to the Schema. Choosing the
437
+ parent changes Admin navigation only: storage and authorization are unchanged.
438
+
439
+ Set `nav.standalone: true` to put a child with a required `id` reference at the top level instead;
440
+ a child folded only by a unique-field reference stays in its parent's workbench. With
441
+ `standalone`, `parentField` must name a required `id` reference.
442
+
443
+ ### Sidebar
444
+
445
+ By default the sidebar lists publishing Schemas under Content, operational Schemas under Records (`operations`) and
446
+ admin Views under Reports, in manifest declaration order (source files in the order given to `mantle generate`, then
447
+ document order), with Admin's own pages under More. A project arranges it for how its
448
+ staff work, in the same manifest change that adds a Schema or View. Placement is presentation only: permissions,
449
+ REST, MCP and storage are unchanged, entries a caller cannot see stay hidden, and an empty group is not shown.
450
+
451
+ - `Schema.spec.uiSchema.nav` and admin `View.spec.uiSchema.nav` take `group` (a group id), `order` (an integer;
452
+ ascending; entries without one follow in that default order, collections before Views) and
453
+ `hidden: true` (out of the sidebar, still at its URL).
454
+ - Built-in groups need no declaration: `content`, `operations`, `reports`, `more`. A project declares every other
455
+ group once, in `src/admin.tsx`: `defineAdmin(admin, { nav: { groups } })`, each with a title (text or
456
+ `{ locale: text }`) and an `order` among the built-in groups' content 10, operations 20 and reports 30 (default 50);
457
+ More always stays last. Declaring a built-in id is a type error (and ignored at runtime). `generated/admin-client.ts` exports `ManifestNavGroup`, every group the manifest uses, and types
458
+ `nav.groups` so that `tsc` refuses an entry that leaves one out (`mantle generate` no longer checks it). Without an
459
+ `src/admin.tsx` (the built-in entry) nothing refuses it, so an undeclared group still shows its items, titled by its id.
460
+ - `nav.items` adds entries beside the ones `uiSchema.nav` produces: `{ group, title, icon?, order?, to }`, where `title` is
461
+ text or `{ locale: text }`, `icon` is any React icon component, and `to` is `{ collection, filter? }` (the list, preset
462
+ to the value of one field) or `{ view, input? }` (an admin View with its input). Names, the filter field and value and the
463
+ View input are typed from the generated manifest, so a misspelling or a wrong preset fails `tsc`. Several items may lead to
464
+ one resource with different presets. An item whose collection or View the caller cannot see is not shown; showing or
465
+ hiding one changes no permission, because the target's own route still decides.
466
+ - <a id="sidebar-badges"></a>`badge: { view, field }` on an item shows a count after its title: `field` of the one row an aggregate admin View
467
+ returns, typically one with `uiSchema.nav.hidden: true` so it stays out of Reports. The View is typed from the generated manifest
468
+ and runs for the current caller through its own `requires`, scope and TTL, with no system fallback. Admin reads every badge of the
469
+ sidebar in one `GET /view-batch` (the first 20 distinct Views; `defineAdmin` logs the rest and they show nothing). Zero shows a muted
470
+ `0`, loading a placeholder and an unreadable count `!`. A refused or missing View shows nothing, so a badge never reveals a queue
471
+ the caller cannot read, and no state blocks the link. Counts are cached for 30 seconds, read again when the window regains
472
+ focus, and refreshed after a mutation through Admin's shared query cache (`useOperation` or any Admin write); there is no polling.
473
+ The cache is keyed by the signed-in user. A replacement `Sidebar` reads the same counts with `useBadges`. Badges are browser only.
474
+ - `pages` adds a page of the application's own inside Admin's shell: `{ path, title, element, icon?, nav? }`. `path` is one
475
+ segment of lowercase letters, digits and hyphens, and the page is at `/admin/p/<path>`. `nav: { group, order? }` places it in
476
+ the sidebar with the other entries of that group (the same group ids as `nav.items`: a built-in group, or one that a manifest
477
+ `uiSchema.nav.group` uses; `tsc` refuses any other); without `nav` it keeps its route and stays out of the sidebar. A page has
478
+ no `role`: every Admin member sees it, so hide a part of it with `useMe()` and rely on the `requires` of what it calls. A page's `element` reads through the [data hooks](#typed-data-hooks) and writes through
479
+ Procedures; showing a page grants nothing, because each View or Procedure it calls authorizes on the server.
480
+ - `home` names where `/admin` leads: `{ collection, filter? }`, `{ view, input? }` (typed like `nav.items[].to`) or `{ page: "<path>" }`
481
+ for one of `pages`. When the caller can see the target, `/admin` redirects to it and Admin's own home (setup and connector
482
+ content, or your `Home` override) moves to `/admin/setup`, listed first under More. When the caller cannot see the target, or without
483
+ `home`, `/admin` stays the built-in home. Choosing a landing page grants and denies nothing; the target's own route still decides.
484
+ The landing is browser only.
485
+
486
+ `pages[].header` composes actions beside the native page title without replacing
487
+ Admin's shell or targeting its internal DOM:
488
+
489
+ ```tsx
490
+ pages: [{ path: "queue", title: { en: "Queue", "zh-TW": "待辦" },
491
+ header: { description: "Items awaiting review", actions: <QueueActions /> },
492
+ element: <QueuePage />, mcp: { renders: "pending-requests" } }]
493
+ ```
494
+
495
+ The explicit object renders the same native heading on both surfaces. `title`
496
+ and `description` resolve using the browser preference or MCP host locale;
497
+ `actions` is React content, so its component may use the existing hooks and
498
+ host-aware links. Keep action controls disabled or provide a fallback when the
499
+ host lacks a capability. Do not add another h1 to `element` with this header.
500
+ Use `header: false` if the element owns its heading. Omitted preserves existing
501
+ behavior: native title in the browser, element alone in MCP. This option does
502
+ not customize the global application `Header` slot.
503
+
504
+
505
+ `src/admin.tsx` is JSX and runs in the browser, so `tsconfig.json` needs `"jsx": "react-jsx"` and `"lib": ["ES2023", "DOM"]` beside the Worker's `types` (`@cloudflare/workers-types`, `node`) and must include `src/**/*.tsx`; `node_modules/@aotter/mantle/docs/examples/app-shell/tsconfig.json` is the working file. The app also depends on `react`, `react-dom` and `@types/react` (see the example's `package.json`). The app owns `react` and `react-dom` (Admin and the kit take them as peers), so pin both to the same exact version: `react-dom` refuses to run beside a different `react`. `mantle bundle` stops with a message when they differ; add `lucide-react` (or another icon package) yourself if you use icons.
506
+
507
+ ```tsx
508
+ // src/admin.tsx
509
+ import { Inbox } from "lucide-react";
510
+ import { defineAdmin } from "@aotter/mantle-admin/app";
511
+ import { admin } from "../generated/admin-client.js";
512
+
513
+ export default defineAdmin(admin, {
514
+ nav: {
515
+ groups: { approvals: { title: { en: "Approvals", "zh-TW": "簽核" }, order: 5 } },
516
+ items: [
517
+ { group: "approvals", title: "Waiting for me", icon: Inbox, to: { view: "pending-requests" } },
518
+ { group: "approvals", title: "Rejected", to: { collection: "requests", filter: { status: "rejected" } } },
519
+ ],
520
+ },
521
+ });
522
+ ```
523
+
524
+ ```yaml
525
+ # a Schema or an admin View
526
+ uiSchema: { nav: { group: approvals, order: 1 } }
527
+ ```
528
+
529
+ `mantle generate` refuses a non-integer `order` and
530
+ placement on a Schema without a sidebar entry of its own: a translation, or a folded child that is not
531
+ [`standalone`](#collection-navigation-and-operation-placement).
532
+ The purchasing example (`node_modules/@aotter/mantle/docs/examples/purchasing/`) puts its approval queue and requests in an Approvals group.
533
+
534
+ Operational collections have no generic create or draft: officers add records through a Procedure placed with `collectionAction` (the list header shows its button and input form), so every write is a declared, validated program. For a user-field scoped Schema the Procedure can stay SQL; see [field scope](../reference/schema.md#field-scope) for the partition input.
535
+
536
+ Admin operations are Procedures exposed by an admin MCP Trigger. Declare
537
+ `Procedure.spec.uiSchema.collectionAction: <schema-name>` to show the operation
538
+ in that collection's list header. Row operations are chosen by the Procedure's
539
+ explicit `target: { schema, id, version? }`: `id` names the input bound to the
540
+ row id, and optional `version` names the input bound to its reviewed OCC version.
541
+ Names such as `approve` never determine placement. An operation without a row
542
+ target or collection action appears on the Operations page, whose sidebar link
543
+ appears whenever such operations exist.
544
+
545
+ A record's page shows its row operations as labeled buttons in the header (more than three: two buttons and a
546
+ "More actions" menu); list rows keep them in an "Actions for …" menu.
547
+ Generated row metadata includes simple AND-ed equality/IN literal conditions
548
+ from the target-row UPDATE/DELETE WHERE, and an operation whose conditions the
549
+ row does not meet is hidden: with `WHERE … AND orderStatus = 'approved'`, "Mark
550
+ fulfilled" appears only once the order is approved. Missing preview values and
551
+ unsupported predicates leave actions available. These are
552
+ presentation hints: the Procedure still enforces its WHERE and authorization.
553
+ Conflicts show a localized refresh message with the technical diagnostic in
554
+ Details. Successful actions show a short summary and changes, with raw output
555
+ in a collapsed Details disclosure. CSV exports retain UTC wire timestamps.
556
+
557
+ Developer Model and Logic pages share an object sidebar on wide containers
558
+ and an object-list drawer on narrow containers.
559
+ Schema Live data previews use collection routes even for folded children.
560
+ Pass `bindings.developerViews` as the Admin `developerViews` option for
561
+ public and admin View previews; ordinary Admin View routes and exports use
562
+ only `bindings.views` (admin Views). View previews use the read-only `/admin/api/developer/views/<view>` route,
563
+ with the signed-in admin caller and the same authorization, scope, TTL and
564
+ publishing policy as REST. Public Views retain public visibility; internal or
565
+ disallowed Views show an unavailable explanation. Previews never use a system
566
+ caller or bypass a View's `requires`.