@aotter/mantle 0.2.0-alpha.6 → 0.2.0-alpha.7

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 (942) hide show
  1. package/README.md +152 -45
  2. package/dist/auth/adapter.d.ts +32 -0
  3. package/dist/auth/adapter.js +285 -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 +154 -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 +31 -0
  13. package/dist/auth/oauth.js +124 -0
  14. package/dist/auth/resource-seeds.js +10 -0
  15. package/dist/auth/routes.d.ts +32 -0
  16. package/dist/auth/{createAuthRoutes.js → routes.js} +130 -35
  17. package/dist/build/compiler.d.ts +790 -0
  18. package/dist/build/compiler.js +6971 -0
  19. package/dist/{spec → build/spec}/domain/model/ManifestGrammar.d.ts +24 -42
  20. package/dist/{spec → build/spec}/domain/model/RuntimePlan.d.ts +77 -3
  21. package/dist/{spec → build/spec}/domain/model/SqlIr.d.ts +35 -6
  22. package/dist/build/spec/domain/model/UserFields.d.ts +20 -0
  23. package/dist/{spec → build/spec}/domain/service/PlanFingerprint.d.ts +2 -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 +55 -0
  29. package/dist/domain/describe/chunk-ZIQVLA7X.js +363 -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 +17 -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 +204 -0
  42. package/dist/domain/recipes.js +19 -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 +84 -0
  50. package/dist/infrastructure/cli.js +101 -0
  51. package/dist/infrastructure/generate.d.ts +14 -0
  52. package/dist/infrastructure/generate.js +174 -0
  53. package/dist/infrastructure/generateAuth.d.ts +8 -0
  54. package/dist/infrastructure/generateAuth.js +17 -0
  55. package/dist/infrastructure/inputs.js +36 -0
  56. package/dist/infrastructure/wrangler.js +71 -0
  57. package/dist/kernel/authorization.d.ts +4 -0
  58. package/dist/kernel/authorization.js +16 -0
  59. package/dist/kernel/binds.d.ts +51 -0
  60. package/dist/kernel/binds.js +45 -0
  61. package/dist/kernel/caller-identity.d.ts +24 -0
  62. package/dist/kernel/caller-identity.js +22 -0
  63. package/dist/kernel/contract-error.d.ts +12 -0
  64. package/dist/kernel/contract-error.js +14 -0
  65. package/dist/kernel/contracts.d.ts +139 -0
  66. package/dist/kernel/contracts.js +92 -0
  67. package/dist/{spec/domain/service/CloudflareCron.d.ts → kernel/cron.d.ts} +0 -1
  68. package/dist/{spec/domain/service/CloudflareCron.js → kernel/cron.js} +1 -6
  69. package/dist/kernel/dialect/common.d.ts +39 -0
  70. package/dist/kernel/dialect/common.js +6 -0
  71. package/dist/kernel/dialect/postgres.d.ts +16 -0
  72. package/dist/kernel/dialect/postgres.js +18 -0
  73. package/dist/kernel/dialect/sqlite.d.ts +20 -0
  74. package/dist/kernel/dialect/sqlite.js +34 -0
  75. package/dist/kernel/driver/bun-sqlite.d.ts +19 -0
  76. package/dist/kernel/driver/bun-sqlite.js +77 -0
  77. package/dist/kernel/driver/d1.d.ts +24 -0
  78. package/dist/kernel/driver/d1.js +22 -0
  79. package/dist/kernel/driver/postgres.d.ts +25 -0
  80. package/dist/kernel/driver/postgres.js +95 -0
  81. package/dist/kernel/driver/transaction-context.d.ts +10 -0
  82. package/dist/kernel/driver/transaction-context.js +29 -0
  83. package/dist/kernel/email.d.ts +28 -0
  84. package/dist/{auth/emailTemplates.js → kernel/email.js} +13 -2
  85. package/dist/kernel/host-access.d.ts +10 -0
  86. package/dist/kernel/host-access.js +65 -0
  87. package/dist/kernel/host-caller.d.ts +38 -0
  88. package/dist/kernel/host-caller.js +55 -0
  89. package/dist/kernel/json-body.d.ts +4 -0
  90. package/dist/kernel/json-body.js +44 -0
  91. package/dist/kernel/mcp-apps.d.ts +49 -0
  92. package/dist/kernel/mcp-apps.js +40 -0
  93. package/dist/kernel/mcp-call.d.ts +5 -0
  94. package/dist/kernel/mcp-call.js +25 -0
  95. package/dist/kernel/mcp-handler.js +288 -0
  96. package/dist/kernel/mcp.d.ts +101 -0
  97. package/dist/kernel/mcp.js +25 -0
  98. package/dist/kernel/media.d.ts +27 -0
  99. package/dist/kernel/media.js +216 -0
  100. package/dist/kernel/paging.d.ts +55 -0
  101. package/dist/kernel/paging.js +95 -0
  102. package/dist/kernel/publishing.d.ts +4 -0
  103. package/dist/kernel/publishing.js +16 -0
  104. package/dist/{cloudflare/r2Media.d.ts → kernel/r2-media.d.ts} +4 -5
  105. package/dist/kernel/r2-media.js +78 -0
  106. package/dist/kernel/rest-dispatch.js +38 -0
  107. package/dist/kernel/rest-router.js +63 -0
  108. package/dist/kernel/rest.d.ts +58 -0
  109. package/dist/kernel/rest.js +41 -0
  110. package/dist/kernel/scalars.d.ts +6 -0
  111. package/dist/kernel/scalars.js +43 -0
  112. package/dist/kernel/search.js +5 -0
  113. package/dist/{core/site.d.ts → kernel/site-types.d.ts} +38 -9
  114. package/dist/kernel/site-types.js +1 -0
  115. package/dist/kernel/site.d.ts +41 -0
  116. package/dist/kernel/site.js +32 -0
  117. package/dist/kernel/store.d.ts +165 -0
  118. package/dist/kernel/store.js +257 -0
  119. package/dist/kernel/surface.d.ts +10 -0
  120. package/dist/kernel/surface.js +19 -0
  121. package/dist/kernel/sweep.d.ts +17 -0
  122. package/dist/kernel/sweep.js +27 -0
  123. package/dist/kernel/translations.d.ts +1 -0
  124. package/dist/kernel/translations.js +13 -0
  125. package/dist/kernel/user-caller.d.ts +31 -0
  126. package/dist/kernel/user-caller.js +67 -0
  127. package/dist/kernel/user-field-name.js +3 -0
  128. package/dist/kernel/user-fields.d.ts +34 -0
  129. package/dist/kernel/user-fields.js +71 -0
  130. package/dist/kernel/validation.d.ts +15 -0
  131. package/dist/kernel/validation.js +54 -0
  132. package/dist/kernel/web-gateway.js +68 -0
  133. package/dist/kernel/web-head.js +15 -0
  134. package/dist/kernel/web-response.js +8 -0
  135. package/dist/kernel/web.d.ts +75 -0
  136. package/dist/kernel/web.js +155 -0
  137. package/dist/kernel/where.js +27 -0
  138. package/dist/testing/index.d.ts +1 -37
  139. package/dist/testing/index.js +1 -43
  140. package/dist/usecase/adminBindings.js +142 -0
  141. package/dist/usecase/adminDescriptors.js +153 -0
  142. package/dist/usecase/generate.js +164 -0
  143. package/dist/usecase/handlers.js +21 -0
  144. package/dist/usecase/mcp-media.js +17 -0
  145. package/dist/usecase/mcp.js +96 -0
  146. package/dist/usecase/paging.js +72 -0
  147. package/dist/usecase/publishing.js +63 -0
  148. package/dist/usecase/refusals.js +27 -0
  149. package/dist/usecase/rest.js +54 -0
  150. package/dist/usecase/search.js +7 -0
  151. package/dist/usecase/site.js +40 -0
  152. package/dist/usecase/stores.js +62 -0
  153. package/dist/usecase/translations.js +78 -0
  154. package/dist/usecase/ttl.js +20 -0
  155. package/dist/usecase/validation.js +132 -0
  156. package/dist/usecase/web.js +22 -0
  157. package/docs/examples/README.md +31 -16
  158. package/docs/examples/app-shell/README.md +48 -0
  159. package/docs/examples/app-shell/package.json +34 -0
  160. package/docs/examples/app-shell/pnpm-workspace.yaml +8 -0
  161. package/docs/examples/app-shell/smoke-kit.mjs +100 -0
  162. package/docs/examples/app-shell/src/admin.ts +10 -0
  163. package/docs/examples/app-shell/src/auth.ts +55 -0
  164. package/docs/examples/app-shell/src/handlers.ts +5 -0
  165. package/docs/examples/app-shell/src/index.ts +4 -0
  166. package/docs/examples/app-shell/src/routes.ts +13 -0
  167. package/docs/examples/app-shell/src/schedule.ts +8 -0
  168. package/docs/examples/app-shell/src/service.ts +70 -0
  169. package/docs/examples/app-shell/src/sign-in.ts +41 -0
  170. package/docs/examples/app-shell/src/signup.ts +8 -0
  171. package/docs/examples/{reference-service → app-shell}/tsconfig.json +2 -1
  172. package/docs/examples/app-shell/worker-configuration.d.ts +22 -0
  173. package/docs/examples/app-shell/wrangler.jsonc +61 -0
  174. package/docs/examples/club-events/README.md +60 -0
  175. package/docs/examples/club-events/manifests/club-events.yaml +225 -0
  176. package/docs/examples/club-events/smoke.mjs +121 -0
  177. package/docs/examples/club-events/src/handlers.ts +25 -0
  178. package/docs/examples/club-events/src/signup.ts +9 -0
  179. package/docs/examples/generated-web/README.md +74 -0
  180. package/docs/examples/generated-web/posts.yaml +38 -0
  181. package/docs/examples/generated-web/seed.sql +6 -0
  182. package/docs/examples/generated-web/src/worker.ts +43 -0
  183. package/docs/examples/generated-web/tsconfig.json +8 -0
  184. package/docs/examples/generated-web/wrangler.jsonc +7 -0
  185. package/docs/examples/purchasing/.dev.vars.example +6 -0
  186. package/docs/examples/purchasing/README.md +90 -0
  187. package/docs/examples/purchasing/manifests/purchasing.yaml +341 -0
  188. package/docs/examples/purchasing/seed.sql +4 -0
  189. package/docs/examples/purchasing/smoke.mjs +171 -0
  190. package/docs/examples/purchasing/src/admin.ts +12 -0
  191. package/docs/examples/purchasing/src/handlers.ts +33 -0
  192. package/docs/examples/purchasing/src/notify.ts +29 -0
  193. package/docs/examples/purchasing/src/requests-page.ts +57 -0
  194. package/docs/examples/purchasing/src/routes.ts +53 -0
  195. package/docs/examples/purchasing/src/schedule.ts +31 -0
  196. package/docs/examples/purchasing/src/signup.ts +5 -0
  197. package/docs/examples/purchasing/src/supplier.ts +32 -0
  198. package/docs/examples/purchasing/wrangler.jsonc +68 -0
  199. package/docs/examples/recipes/README.md +58 -0
  200. package/docs/examples/recipes/manifests/recipes.yaml +75 -0
  201. package/docs/examples/recipes/smoke.mjs +102 -0
  202. package/docs/examples/recipes/src/media.ts +13 -0
  203. package/docs/examples/recipes/src/pages.ts +99 -0
  204. package/docs/examples/recipes/src/routes.ts +71 -0
  205. package/docs/examples/recipes/src/site-config.ts +12 -0
  206. package/docs/examples/recipes/wrangler.jsonc +73 -0
  207. package/docs/handbook/cloudflare/authentication.md +142 -212
  208. package/docs/handbook/cloudflare/chatgpt-sites.md +4 -113
  209. package/docs/handbook/cloudflare/deploy-and-operate.md +20 -106
  210. package/docs/handbook/cloudflare/media-r2.md +62 -133
  211. package/docs/handbook/cloudflare/service-entry.md +180 -116
  212. package/docs/handbook/concepts/authorization.md +10 -123
  213. package/docs/handbook/concepts/four-atoms.md +9 -92
  214. package/docs/handbook/concepts/lifecycle-and-locales.md +9 -80
  215. package/docs/handbook/concepts/mcp-and-agents.md +10 -141
  216. package/docs/handbook/concepts/procedures-and-triggers.md +5 -162
  217. package/docs/handbook/concepts/runtime-and-adapters.md +15 -224
  218. package/docs/handbook/concepts/views.md +10 -109
  219. package/docs/handbook/examples/hub.md +2 -18
  220. package/docs/handbook/guides/adapter-guide.md +11 -0
  221. package/docs/handbook/guides/admin-extensions.md +12 -183
  222. package/docs/handbook/guides/admin-ui.md +5 -164
  223. package/docs/handbook/guides/agent-setup.md +5 -18
  224. package/docs/handbook/guides/email.md +86 -0
  225. package/docs/handbook/guides/mcp-apps.md +44 -0
  226. package/docs/handbook/guides/native-admin.md +298 -0
  227. package/docs/handbook/guides/native-execution.md +132 -0
  228. package/docs/handbook/guides/oauth.md +105 -0
  229. package/docs/handbook/guides/postgres-adapters.md +56 -0
  230. package/docs/handbook/guides/public-pages.md +53 -0
  231. package/docs/handbook/guides/size-and-startup.md +9 -0
  232. package/docs/handbook/guides/typed-queries.md +39 -102
  233. package/docs/handbook/navigation.json +164 -31
  234. package/docs/handbook/reference/admin-descriptors.md +88 -0
  235. package/docs/handbook/reference/authorization.md +44 -52
  236. package/docs/handbook/reference/describe.md +56 -0
  237. package/docs/handbook/reference/diagnostics.md +15 -79
  238. package/docs/handbook/reference/features.md +45 -53
  239. package/docs/handbook/reference/manifest.md +6 -69
  240. package/docs/handbook/reference/procedure.md +9 -118
  241. package/docs/handbook/reference/schema.md +75 -185
  242. package/docs/handbook/reference/site-config.md +5 -65
  243. package/docs/handbook/reference/surface.md +279 -97
  244. package/docs/handbook/reference/trigger.md +24 -93
  245. package/docs/handbook/reference/view.md +32 -160
  246. package/docs/handbook/releases/index.md +48 -13
  247. package/docs/handbook/start/overview.md +9 -56
  248. package/docs/handbook/start/project-and-cli.md +40 -149
  249. package/docs/handbook/start/quickstart-worker.md +38 -116
  250. package/docs/skills/develop/SKILL.md +34 -123
  251. package/docs/skills/develop/mcp-app.md +37 -77
  252. package/docs/skills/integrate/SKILL.md +42 -84
  253. package/docs/skills/media-gc/SKILL.md +14 -3
  254. package/docs/skills/provision/SKILL.md +25 -91
  255. package/docs/skills/update/SKILL.md +19 -43
  256. package/docs/source/scripts/postgres-adapter.ts +101 -0
  257. package/docs/upgrade-0.1-to-0.2.md +25 -9
  258. package/package.json +96 -112
  259. package/skills/.keep +0 -0
  260. package/skills/README.md +72 -0
  261. package/skills/mantle/SKILL.md +135 -0
  262. package/skills/mantle/references/local-testing.md +11 -0
  263. package/skills/mantle/references/web.md +41 -0
  264. package/skills/mantle/references/website.md +47 -0
  265. package/dist/admin/consent.d.ts +0 -17
  266. package/dist/admin/consent.d.ts.map +0 -1
  267. package/dist/admin/consent.js +0 -17
  268. package/dist/admin/consent.js.map +0 -1
  269. package/dist/admin/createAdminSurface.d.ts +0 -25
  270. package/dist/admin/createAdminSurface.d.ts.map +0 -1
  271. package/dist/admin/createAdminSurface.js +0 -635
  272. package/dist/admin/createAdminSurface.js.map +0 -1
  273. package/dist/admin/design.d.ts +0 -7
  274. package/dist/admin/design.d.ts.map +0 -1
  275. package/dist/admin/design.js +0 -18
  276. package/dist/admin/design.js.map +0 -1
  277. package/dist/admin/developerConsole.d.ts +0 -267
  278. package/dist/admin/developerConsole.d.ts.map +0 -1
  279. package/dist/admin/developerConsole.js +0 -136
  280. package/dist/admin/developerConsole.js.map +0 -1
  281. package/dist/admin/extensions.d.ts +0 -290
  282. package/dist/admin/extensions.d.ts.map +0 -1
  283. package/dist/admin/extensions.js +0 -532
  284. package/dist/admin/extensions.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 -7
  290. package/dist/admin/index.d.ts.map +0 -1
  291. package/dist/admin/index.js +0 -7
  292. package/dist/admin/index.js.map +0 -1
  293. package/dist/admin/procedureFlow.d.ts +0 -38
  294. package/dist/admin/procedureFlow.d.ts.map +0 -1
  295. package/dist/admin/procedureFlow.js +0 -188
  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 -4568
  306. package/dist/auth/buildAuth.d.ts.map +0 -1
  307. package/dist/auth/buildAuth.js +0 -312
  308. package/dist/auth/buildAuth.js.map +0 -1
  309. package/dist/auth/callerResolver.d.ts +0 -52
  310. package/dist/auth/callerResolver.d.ts.map +0 -1
  311. package/dist/auth/callerResolver.js +0 -52
  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.map +0 -1
  316. package/dist/auth/createMantleAuth.d.ts +0 -3
  317. package/dist/auth/createMantleAuth.d.ts.map +0 -1
  318. package/dist/auth/createMantleAuth.js +0 -504
  319. package/dist/auth/createMantleAuth.js.map +0 -1
  320. package/dist/auth/db.d.ts +0 -18
  321. package/dist/auth/db.d.ts.map +0 -1
  322. package/dist/auth/db.js +0 -27
  323. package/dist/auth/db.js.map +0 -1
  324. package/dist/auth/emailTemplates.d.ts +0 -7
  325. package/dist/auth/emailTemplates.d.ts.map +0 -1
  326. package/dist/auth/emailTemplates.js.map +0 -1
  327. package/dist/auth/index.d.ts +0 -9
  328. package/dist/auth/index.d.ts.map +0 -1
  329. package/dist/auth/index.js +0 -7
  330. package/dist/auth/index.js.map +0 -1
  331. package/dist/auth/methods.d.ts +0 -717
  332. package/dist/auth/methods.d.ts.map +0 -1
  333. package/dist/auth/methods.js +0 -321
  334. package/dist/auth/methods.js.map +0 -1
  335. package/dist/auth/oauthTokens.d.ts +0 -24
  336. package/dist/auth/oauthTokens.d.ts.map +0 -1
  337. package/dist/auth/oauthTokens.js +0 -146
  338. package/dist/auth/oauthTokens.js.map +0 -1
  339. package/dist/auth/setupIncomplete.d.ts +0 -16
  340. package/dist/auth/setupIncomplete.d.ts.map +0 -1
  341. package/dist/auth/setupIncomplete.js +0 -50
  342. package/dist/auth/setupIncomplete.js.map +0 -1
  343. package/dist/auth/types.d.ts +0 -440
  344. package/dist/auth/types.d.ts.map +0 -1
  345. package/dist/auth/types.js +0 -10
  346. package/dist/auth/types.js.map +0 -1
  347. package/dist/bun/index.d.ts +0 -21
  348. package/dist/bun/index.d.ts.map +0 -1
  349. package/dist/bun/index.js +0 -46
  350. package/dist/bun/index.js.map +0 -1
  351. package/dist/cli/emitModule.d.ts +0 -7
  352. package/dist/cli/emitModule.d.ts.map +0 -1
  353. package/dist/cli/emitModule.js +0 -127
  354. package/dist/cli/emitModule.js.map +0 -1
  355. package/dist/cli/generate.d.ts +0 -8
  356. package/dist/cli/generate.d.ts.map +0 -1
  357. package/dist/cli/generate.js +0 -391
  358. package/dist/cli/generate.js.map +0 -1
  359. package/dist/cli/main.d.ts +0 -3
  360. package/dist/cli/main.d.ts.map +0 -1
  361. package/dist/cli/main.js +0 -21
  362. package/dist/cli/main.js.map +0 -1
  363. package/dist/cli/preset.d.ts +0 -18
  364. package/dist/cli/preset.d.ts.map +0 -1
  365. package/dist/cli/preset.js +0 -405
  366. package/dist/cli/preset.js.map +0 -1
  367. package/dist/cloudflare/index.d.ts +0 -25
  368. package/dist/cloudflare/index.d.ts.map +0 -1
  369. package/dist/cloudflare/index.js +0 -16
  370. package/dist/cloudflare/index.js.map +0 -1
  371. package/dist/cloudflare/r2Media.d.ts.map +0 -1
  372. package/dist/cloudflare/r2Media.js +0 -69
  373. package/dist/cloudflare/r2Media.js.map +0 -1
  374. package/dist/core/caller.d.ts +0 -35
  375. package/dist/core/caller.d.ts.map +0 -1
  376. package/dist/core/caller.js +0 -3
  377. package/dist/core/caller.js.map +0 -1
  378. package/dist/core/createMantle.d.ts +0 -22
  379. package/dist/core/createMantle.d.ts.map +0 -1
  380. package/dist/core/createMantle.js +0 -117
  381. package/dist/core/createMantle.js.map +0 -1
  382. package/dist/core/dialect.d.ts +0 -53
  383. package/dist/core/dialect.d.ts.map +0 -1
  384. package/dist/core/dialect.js +0 -7
  385. package/dist/core/dialect.js.map +0 -1
  386. package/dist/core/driver.d.ts +0 -24
  387. package/dist/core/driver.d.ts.map +0 -1
  388. package/dist/core/driver.js +0 -2
  389. package/dist/core/driver.js.map +0 -1
  390. package/dist/core/email.d.ts +0 -17
  391. package/dist/core/email.d.ts.map +0 -1
  392. package/dist/core/email.js +0 -2
  393. package/dist/core/email.js.map +0 -1
  394. package/dist/core/index.d.ts +0 -16
  395. package/dist/core/index.d.ts.map +0 -1
  396. package/dist/core/index.js +0 -16
  397. package/dist/core/index.js.map +0 -1
  398. package/dist/core/invocation.d.ts +0 -66
  399. package/dist/core/invocation.d.ts.map +0 -1
  400. package/dist/core/invocation.js +0 -3
  401. package/dist/core/invocation.js.map +0 -1
  402. package/dist/core/observation.d.ts +0 -3
  403. package/dist/core/observation.d.ts.map +0 -1
  404. package/dist/core/observation.js +0 -10
  405. package/dist/core/observation.js.map +0 -1
  406. package/dist/core/runtime/auth.d.ts +0 -9
  407. package/dist/core/runtime/auth.d.ts.map +0 -1
  408. package/dist/core/runtime/auth.js +0 -39
  409. package/dist/core/runtime/auth.js.map +0 -1
  410. package/dist/core/runtime/createRuntime.d.ts +0 -23
  411. package/dist/core/runtime/createRuntime.d.ts.map +0 -1
  412. package/dist/core/runtime/createRuntime.js +0 -214
  413. package/dist/core/runtime/createRuntime.js.map +0 -1
  414. package/dist/core/runtime/verifyPlan.d.ts +0 -34
  415. package/dist/core/runtime/verifyPlan.d.ts.map +0 -1
  416. package/dist/core/runtime/verifyPlan.js +0 -301
  417. package/dist/core/runtime/verifyPlan.js.map +0 -1
  418. package/dist/core/service.d.ts +0 -45
  419. package/dist/core/service.d.ts.map +0 -1
  420. package/dist/core/service.js +0 -2
  421. package/dist/core/service.js.map +0 -1
  422. package/dist/core/sessionUser.d.ts +0 -14
  423. package/dist/core/sessionUser.d.ts.map +0 -1
  424. package/dist/core/sessionUser.js +0 -4
  425. package/dist/core/sessionUser.js.map +0 -1
  426. package/dist/core/site.d.ts.map +0 -1
  427. package/dist/core/site.js +0 -2
  428. package/dist/core/site.js.map +0 -1
  429. package/dist/core/siteConfig.d.ts +0 -5
  430. package/dist/core/siteConfig.d.ts.map +0 -1
  431. package/dist/core/siteConfig.js +0 -24
  432. package/dist/core/siteConfig.js.map +0 -1
  433. package/dist/core/sql/allowlist.d.ts +0 -67
  434. package/dist/core/sql/allowlist.d.ts.map +0 -1
  435. package/dist/core/sql/allowlist.js +0 -737
  436. package/dist/core/sql/allowlist.js.map +0 -1
  437. package/dist/core/sql/ast.d.ts +0 -24
  438. package/dist/core/sql/ast.d.ts.map +0 -1
  439. package/dist/core/sql/ast.js +0 -32
  440. package/dist/core/sql/ast.js.map +0 -1
  441. package/dist/core/sql/compile.d.ts +0 -50
  442. package/dist/core/sql/compile.d.ts.map +0 -1
  443. package/dist/core/sql/compile.js +0 -48
  444. package/dist/core/sql/compile.js.map +0 -1
  445. package/dist/core/sql/policy.d.ts +0 -123
  446. package/dist/core/sql/policy.d.ts.map +0 -1
  447. package/dist/core/sql/policy.js +0 -398
  448. package/dist/core/sql/policy.js.map +0 -1
  449. package/dist/core/sql/positions.d.ts +0 -30
  450. package/dist/core/sql/positions.d.ts.map +0 -1
  451. package/dist/core/sql/positions.js +0 -22
  452. package/dist/core/sql/positions.js.map +0 -1
  453. package/dist/core/sql/run.d.ts +0 -68
  454. package/dist/core/sql/run.d.ts.map +0 -1
  455. package/dist/core/sql/run.js +0 -384
  456. package/dist/core/sql/run.js.map +0 -1
  457. package/dist/core/store/createStore.d.ts +0 -49
  458. package/dist/core/store/createStore.d.ts.map +0 -1
  459. package/dist/core/store/createStore.js +0 -227
  460. package/dist/core/store/createStore.js.map +0 -1
  461. package/dist/core/store/cursor.d.ts +0 -4
  462. package/dist/core/store/cursor.d.ts.map +0 -1
  463. package/dist/core/store/cursor.js +0 -22
  464. package/dist/core/store/cursor.js.map +0 -1
  465. package/dist/core/store/json.d.ts +0 -80
  466. package/dist/core/store/json.d.ts.map +0 -1
  467. package/dist/core/store/json.js +0 -342
  468. package/dist/core/store/json.js.map +0 -1
  469. package/dist/core/store.d.ts +0 -160
  470. package/dist/core/store.d.ts.map +0 -1
  471. package/dist/core/store.js +0 -2
  472. package/dist/core/store.js.map +0 -1
  473. package/dist/core/wire.d.ts +0 -20
  474. package/dist/core/wire.d.ts.map +0 -1
  475. package/dist/core/wire.js +0 -84
  476. package/dist/core/wire.js.map +0 -1
  477. package/dist/core/withCaller.d.ts +0 -24
  478. package/dist/core/withCaller.d.ts.map +0 -1
  479. package/dist/core/withCaller.js +0 -35
  480. package/dist/core/withCaller.js.map +0 -1
  481. package/dist/d1/adapter.d.ts +0 -12
  482. package/dist/d1/adapter.d.ts.map +0 -1
  483. package/dist/d1/adapter.js +0 -23
  484. package/dist/d1/adapter.js.map +0 -1
  485. package/dist/d1/codec.d.ts +0 -14
  486. package/dist/d1/codec.d.ts.map +0 -1
  487. package/dist/d1/codec.js +0 -136
  488. package/dist/d1/codec.js.map +0 -1
  489. package/dist/d1/compile/index.d.ts +0 -9
  490. package/dist/d1/compile/index.d.ts.map +0 -1
  491. package/dist/d1/compile/index.js +0 -9
  492. package/dist/d1/compile/index.js.map +0 -1
  493. package/dist/d1/dialect.d.ts +0 -4
  494. package/dist/d1/dialect.d.ts.map +0 -1
  495. package/dist/d1/dialect.js +0 -13
  496. package/dist/d1/dialect.js.map +0 -1
  497. package/dist/d1/executor.d.ts +0 -15
  498. package/dist/d1/executor.d.ts.map +0 -1
  499. package/dist/d1/executor.js +0 -96
  500. package/dist/d1/executor.js.map +0 -1
  501. package/dist/d1/index.d.ts +0 -6
  502. package/dist/d1/index.d.ts.map +0 -1
  503. package/dist/d1/index.js +0 -6
  504. package/dist/d1/index.js.map +0 -1
  505. package/dist/d1/lower.d.ts +0 -8
  506. package/dist/d1/lower.d.ts.map +0 -1
  507. package/dist/d1/lower.js +0 -167
  508. package/dist/d1/lower.js.map +0 -1
  509. package/dist/d1/media.d.ts +0 -5
  510. package/dist/d1/media.d.ts.map +0 -1
  511. package/dist/d1/media.js +0 -157
  512. package/dist/d1/media.js.map +0 -1
  513. package/dist/d1/migrations.d.ts +0 -12
  514. package/dist/d1/migrations.d.ts.map +0 -1
  515. package/dist/d1/migrations.js +0 -111
  516. package/dist/d1/migrations.js.map +0 -1
  517. package/dist/d1/print.d.ts +0 -28
  518. package/dist/d1/print.d.ts.map +0 -1
  519. package/dist/d1/print.js +0 -54
  520. package/dist/d1/print.js.map +0 -1
  521. package/dist/d1/site.d.ts +0 -17
  522. package/dist/d1/site.d.ts.map +0 -1
  523. package/dist/d1/site.js +0 -63
  524. package/dist/d1/site.js.map +0 -1
  525. package/dist/d1/storage.d.ts +0 -34
  526. package/dist/d1/storage.d.ts.map +0 -1
  527. package/dist/d1/storage.js +0 -288
  528. package/dist/d1/storage.js.map +0 -1
  529. package/dist/d1/tz.d.ts +0 -21
  530. package/dist/d1/tz.d.ts.map +0 -1
  531. package/dist/d1/tz.js +0 -54
  532. package/dist/d1/tz.js.map +0 -1
  533. package/dist/d1/validator.d.ts +0 -10
  534. package/dist/d1/validator.d.ts.map +0 -1
  535. package/dist/d1/validator.js +0 -33
  536. package/dist/d1/validator.js.map +0 -1
  537. package/dist/mcp/apps.d.ts +0 -43
  538. package/dist/mcp/apps.d.ts.map +0 -1
  539. package/dist/mcp/apps.js +0 -57
  540. package/dist/mcp/apps.js.map +0 -1
  541. package/dist/mcp/catalog.d.ts +0 -55
  542. package/dist/mcp/catalog.d.ts.map +0 -1
  543. package/dist/mcp/catalog.js +0 -81
  544. package/dist/mcp/catalog.js.map +0 -1
  545. package/dist/mcp/createMcpSurface.d.ts +0 -60
  546. package/dist/mcp/createMcpSurface.d.ts.map +0 -1
  547. package/dist/mcp/createMcpSurface.js +0 -182
  548. package/dist/mcp/createMcpSurface.js.map +0 -1
  549. package/dist/mcp/index.d.ts +0 -4
  550. package/dist/mcp/index.d.ts.map +0 -1
  551. package/dist/mcp/index.js +0 -4
  552. package/dist/mcp/index.js.map +0 -1
  553. package/dist/mcp/media.d.ts +0 -9
  554. package/dist/mcp/media.d.ts.map +0 -1
  555. package/dist/mcp/media.js +0 -33
  556. package/dist/mcp/media.js.map +0 -1
  557. package/dist/postgres/adapter.d.ts +0 -23
  558. package/dist/postgres/adapter.d.ts.map +0 -1
  559. package/dist/postgres/adapter.js +0 -50
  560. package/dist/postgres/adapter.js.map +0 -1
  561. package/dist/postgres/codec.d.ts +0 -13
  562. package/dist/postgres/codec.d.ts.map +0 -1
  563. package/dist/postgres/codec.js +0 -110
  564. package/dist/postgres/codec.js.map +0 -1
  565. package/dist/postgres/compile/index.d.ts +0 -9
  566. package/dist/postgres/compile/index.d.ts.map +0 -1
  567. package/dist/postgres/compile/index.js +0 -9
  568. package/dist/postgres/compile/index.js.map +0 -1
  569. package/dist/postgres/driver.d.ts +0 -109
  570. package/dist/postgres/driver.d.ts.map +0 -1
  571. package/dist/postgres/driver.js +0 -186
  572. package/dist/postgres/driver.js.map +0 -1
  573. package/dist/postgres/executor.d.ts +0 -28
  574. package/dist/postgres/executor.d.ts.map +0 -1
  575. package/dist/postgres/executor.js +0 -96
  576. package/dist/postgres/executor.js.map +0 -1
  577. package/dist/postgres/index.d.ts +0 -8
  578. package/dist/postgres/index.d.ts.map +0 -1
  579. package/dist/postgres/index.js +0 -8
  580. package/dist/postgres/index.js.map +0 -1
  581. package/dist/postgres/lower.d.ts +0 -6
  582. package/dist/postgres/lower.d.ts.map +0 -1
  583. package/dist/postgres/lower.js +0 -152
  584. package/dist/postgres/lower.js.map +0 -1
  585. package/dist/postgres/print.d.ts +0 -11
  586. package/dist/postgres/print.d.ts.map +0 -1
  587. package/dist/postgres/print.js +0 -108
  588. package/dist/postgres/print.js.map +0 -1
  589. package/dist/postgres/session.d.ts +0 -9
  590. package/dist/postgres/session.d.ts.map +0 -1
  591. package/dist/postgres/session.js +0 -111
  592. package/dist/postgres/session.js.map +0 -1
  593. package/dist/postgres/storage.d.ts +0 -32
  594. package/dist/postgres/storage.d.ts.map +0 -1
  595. package/dist/postgres/storage.js +0 -283
  596. package/dist/postgres/storage.js.map +0 -1
  597. package/dist/postgres/validator.d.ts +0 -13
  598. package/dist/postgres/validator.d.ts.map +0 -1
  599. package/dist/postgres/validator.js +0 -53
  600. package/dist/postgres/validator.js.map +0 -1
  601. package/dist/spec/domain/index.d.ts +0 -3
  602. package/dist/spec/domain/index.d.ts.map +0 -1
  603. package/dist/spec/domain/index.js +0 -3
  604. package/dist/spec/domain/index.js.map +0 -1
  605. package/dist/spec/domain/model/ContentState.d.ts +0 -8
  606. package/dist/spec/domain/model/ContentState.d.ts.map +0 -1
  607. package/dist/spec/domain/model/ContentState.js +0 -7
  608. package/dist/spec/domain/model/ContentState.js.map +0 -1
  609. package/dist/spec/domain/model/Entry.d.ts +0 -29
  610. package/dist/spec/domain/model/Entry.d.ts.map +0 -1
  611. package/dist/spec/domain/model/Entry.js +0 -16
  612. package/dist/spec/domain/model/Entry.js.map +0 -1
  613. package/dist/spec/domain/model/Locale.d.ts +0 -30
  614. package/dist/spec/domain/model/Locale.d.ts.map +0 -1
  615. package/dist/spec/domain/model/Locale.js +0 -33
  616. package/dist/spec/domain/model/Locale.js.map +0 -1
  617. package/dist/spec/domain/model/ManifestGrammar.d.ts.map +0 -1
  618. package/dist/spec/domain/model/ManifestGrammar.js +0 -153
  619. package/dist/spec/domain/model/ManifestGrammar.js.map +0 -1
  620. package/dist/spec/domain/model/MediaMimeAccept.d.ts +0 -55
  621. package/dist/spec/domain/model/MediaMimeAccept.d.ts.map +0 -1
  622. package/dist/spec/domain/model/MediaMimeAccept.js +0 -90
  623. package/dist/spec/domain/model/MediaMimeAccept.js.map +0 -1
  624. package/dist/spec/domain/model/RuntimePlan.d.ts.map +0 -1
  625. package/dist/spec/domain/model/RuntimePlan.js +0 -4
  626. package/dist/spec/domain/model/RuntimePlan.js.map +0 -1
  627. package/dist/spec/domain/model/SiteConfig.d.ts +0 -173
  628. package/dist/spec/domain/model/SiteConfig.d.ts.map +0 -1
  629. package/dist/spec/domain/model/SiteConfig.js +0 -13
  630. package/dist/spec/domain/model/SiteConfig.js.map +0 -1
  631. package/dist/spec/domain/model/SqlIr.d.ts.map +0 -1
  632. package/dist/spec/domain/model/SqlIr.js +0 -95
  633. package/dist/spec/domain/model/SqlIr.js.map +0 -1
  634. package/dist/spec/domain/model/index.d.ts +0 -14
  635. package/dist/spec/domain/model/index.d.ts.map +0 -1
  636. package/dist/spec/domain/model/index.js +0 -14
  637. package/dist/spec/domain/model/index.js.map +0 -1
  638. package/dist/spec/domain/service/CloudflareCron.d.ts.map +0 -1
  639. package/dist/spec/domain/service/CloudflareCron.js.map +0 -1
  640. package/dist/spec/domain/service/CrossSchemaChecker.d.ts +0 -34
  641. package/dist/spec/domain/service/CrossSchemaChecker.d.ts.map +0 -1
  642. package/dist/spec/domain/service/CrossSchemaChecker.js +0 -114
  643. package/dist/spec/domain/service/CrossSchemaChecker.js.map +0 -1
  644. package/dist/spec/domain/service/EntryDataValidator.d.ts +0 -56
  645. package/dist/spec/domain/service/EntryDataValidator.d.ts.map +0 -1
  646. package/dist/spec/domain/service/EntryDataValidator.js +0 -88
  647. package/dist/spec/domain/service/EntryDataValidator.js.map +0 -1
  648. package/dist/spec/domain/service/JsonSchemaToZod.d.ts +0 -29
  649. package/dist/spec/domain/service/JsonSchemaToZod.d.ts.map +0 -1
  650. package/dist/spec/domain/service/JsonSchemaToZod.js +0 -156
  651. package/dist/spec/domain/service/JsonSchemaToZod.js.map +0 -1
  652. package/dist/spec/domain/service/LifecycleStateMachine.d.ts +0 -75
  653. package/dist/spec/domain/service/LifecycleStateMachine.d.ts.map +0 -1
  654. package/dist/spec/domain/service/LifecycleStateMachine.js +0 -76
  655. package/dist/spec/domain/service/LifecycleStateMachine.js.map +0 -1
  656. package/dist/spec/domain/service/LocaleCanonicalizer.d.ts +0 -29
  657. package/dist/spec/domain/service/LocaleCanonicalizer.d.ts.map +0 -1
  658. package/dist/spec/domain/service/LocaleCanonicalizer.js +0 -96
  659. package/dist/spec/domain/service/LocaleCanonicalizer.js.map +0 -1
  660. package/dist/spec/domain/service/ManifestFieldChecks.d.ts +0 -60
  661. package/dist/spec/domain/service/ManifestFieldChecks.d.ts.map +0 -1
  662. package/dist/spec/domain/service/ManifestFieldChecks.js +0 -116
  663. package/dist/spec/domain/service/ManifestFieldChecks.js.map +0 -1
  664. package/dist/spec/domain/service/ManifestGraphValidator.d.ts +0 -15
  665. package/dist/spec/domain/service/ManifestGraphValidator.d.ts.map +0 -1
  666. package/dist/spec/domain/service/ManifestGraphValidator.js +0 -225
  667. package/dist/spec/domain/service/ManifestGraphValidator.js.map +0 -1
  668. package/dist/spec/domain/service/ManifestLinker.d.ts +0 -45
  669. package/dist/spec/domain/service/ManifestLinker.d.ts.map +0 -1
  670. package/dist/spec/domain/service/ManifestLinker.js +0 -92
  671. package/dist/spec/domain/service/ManifestLinker.js.map +0 -1
  672. package/dist/spec/domain/service/ManifestLocaleTrimmer.d.ts +0 -16
  673. package/dist/spec/domain/service/ManifestLocaleTrimmer.d.ts.map +0 -1
  674. package/dist/spec/domain/service/ManifestLocaleTrimmer.js +0 -76
  675. package/dist/spec/domain/service/ManifestLocaleTrimmer.js.map +0 -1
  676. package/dist/spec/domain/service/ManifestParser.d.ts +0 -49
  677. package/dist/spec/domain/service/ManifestParser.d.ts.map +0 -1
  678. package/dist/spec/domain/service/ManifestParser.js +0 -203
  679. package/dist/spec/domain/service/ManifestParser.js.map +0 -1
  680. package/dist/spec/domain/service/ManifestPartition.d.ts +0 -9
  681. package/dist/spec/domain/service/ManifestPartition.d.ts.map +0 -1
  682. package/dist/spec/domain/service/ManifestPartition.js +0 -19
  683. package/dist/spec/domain/service/ManifestPartition.js.map +0 -1
  684. package/dist/spec/domain/service/ManifestPathDiagnoser.d.ts +0 -33
  685. package/dist/spec/domain/service/ManifestPathDiagnoser.d.ts.map +0 -1
  686. package/dist/spec/domain/service/ManifestPathDiagnoser.js +0 -43
  687. package/dist/spec/domain/service/ManifestPathDiagnoser.js.map +0 -1
  688. package/dist/spec/domain/service/ManifestSourceSpans.d.ts +0 -10
  689. package/dist/spec/domain/service/ManifestSourceSpans.d.ts.map +0 -1
  690. package/dist/spec/domain/service/ManifestSourceSpans.js +0 -76
  691. package/dist/spec/domain/service/ManifestSourceSpans.js.map +0 -1
  692. package/dist/spec/domain/service/McpToolNaming.d.ts +0 -25
  693. package/dist/spec/domain/service/McpToolNaming.d.ts.map +0 -1
  694. package/dist/spec/domain/service/McpToolNaming.js +0 -50
  695. package/dist/spec/domain/service/McpToolNaming.js.map +0 -1
  696. package/dist/spec/domain/service/PlanFingerprint.d.ts.map +0 -1
  697. package/dist/spec/domain/service/PlanFingerprint.js +0 -14
  698. package/dist/spec/domain/service/PlanFingerprint.js.map +0 -1
  699. package/dist/spec/domain/service/ProcedureViewSpecChecks.d.ts +0 -4
  700. package/dist/spec/domain/service/ProcedureViewSpecChecks.d.ts.map +0 -1
  701. package/dist/spec/domain/service/ProcedureViewSpecChecks.js +0 -211
  702. package/dist/spec/domain/service/ProcedureViewSpecChecks.js.map +0 -1
  703. package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts +0 -44
  704. package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts.map +0 -1
  705. package/dist/spec/domain/service/SchemaAdminUiChecker.js +0 -333
  706. package/dist/spec/domain/service/SchemaAdminUiChecker.js.map +0 -1
  707. package/dist/spec/domain/service/SchemaIndexChecker.d.ts +0 -33
  708. package/dist/spec/domain/service/SchemaIndexChecker.d.ts.map +0 -1
  709. package/dist/spec/domain/service/SchemaIndexChecker.js +0 -256
  710. package/dist/spec/domain/service/SchemaIndexChecker.js.map +0 -1
  711. package/dist/spec/domain/service/SchemaSearchChecker.d.ts +0 -11
  712. package/dist/spec/domain/service/SchemaSearchChecker.d.ts.map +0 -1
  713. package/dist/spec/domain/service/SchemaSearchChecker.js +0 -78
  714. package/dist/spec/domain/service/SchemaSearchChecker.js.map +0 -1
  715. package/dist/spec/domain/service/SchemaSpecChecks.d.ts +0 -31
  716. package/dist/spec/domain/service/SchemaSpecChecks.d.ts.map +0 -1
  717. package/dist/spec/domain/service/SchemaSpecChecks.js +0 -445
  718. package/dist/spec/domain/service/SchemaSpecChecks.js.map +0 -1
  719. package/dist/spec/domain/service/SiteDefaultsValidator.d.ts +0 -39
  720. package/dist/spec/domain/service/SiteDefaultsValidator.d.ts.map +0 -1
  721. package/dist/spec/domain/service/SiteDefaultsValidator.js +0 -194
  722. package/dist/spec/domain/service/SiteDefaultsValidator.js.map +0 -1
  723. package/dist/spec/domain/service/SqlClassify.d.ts +0 -19
  724. package/dist/spec/domain/service/SqlClassify.d.ts.map +0 -1
  725. package/dist/spec/domain/service/SqlClassify.js +0 -42
  726. package/dist/spec/domain/service/SqlClassify.js.map +0 -1
  727. package/dist/spec/domain/service/SqlRefusal.d.ts +0 -16
  728. package/dist/spec/domain/service/SqlRefusal.d.ts.map +0 -1
  729. package/dist/spec/domain/service/SqlRefusal.js +0 -20
  730. package/dist/spec/domain/service/SqlRefusal.js.map +0 -1
  731. package/dist/spec/domain/service/SqlTypes.d.ts +0 -40
  732. package/dist/spec/domain/service/SqlTypes.d.ts.map +0 -1
  733. package/dist/spec/domain/service/SqlTypes.js +0 -110
  734. package/dist/spec/domain/service/SqlTypes.js.map +0 -1
  735. package/dist/spec/domain/service/StaffRoleHierarchy.d.ts +0 -3
  736. package/dist/spec/domain/service/StaffRoleHierarchy.d.ts.map +0 -1
  737. package/dist/spec/domain/service/StaffRoleHierarchy.js +0 -19
  738. package/dist/spec/domain/service/StaffRoleHierarchy.js.map +0 -1
  739. package/dist/spec/domain/service/TriggerGraphChecks.d.ts +0 -16
  740. package/dist/spec/domain/service/TriggerGraphChecks.d.ts.map +0 -1
  741. package/dist/spec/domain/service/TriggerGraphChecks.js +0 -337
  742. package/dist/spec/domain/service/TriggerGraphChecks.js.map +0 -1
  743. package/dist/spec/domain/service/TriggerSpecChecks.d.ts +0 -4
  744. package/dist/spec/domain/service/TriggerSpecChecks.d.ts.map +0 -1
  745. package/dist/spec/domain/service/TriggerSpecChecks.js +0 -89
  746. package/dist/spec/domain/service/TriggerSpecChecks.js.map +0 -1
  747. package/dist/spec/domain/service/ValidatedAdminUiProjection.d.ts +0 -11
  748. package/dist/spec/domain/service/ValidatedAdminUiProjection.d.ts.map +0 -1
  749. package/dist/spec/domain/service/ValidatedAdminUiProjection.js +0 -26
  750. package/dist/spec/domain/service/ValidatedAdminUiProjection.js.map +0 -1
  751. package/dist/spec/domain/service/ViewAdminUiChecker.d.ts +0 -14
  752. package/dist/spec/domain/service/ViewAdminUiChecker.d.ts.map +0 -1
  753. package/dist/spec/domain/service/ViewAdminUiChecker.js +0 -58
  754. package/dist/spec/domain/service/ViewAdminUiChecker.js.map +0 -1
  755. package/dist/spec/domain/service/index.d.ts +0 -24
  756. package/dist/spec/domain/service/index.d.ts.map +0 -1
  757. package/dist/spec/domain/service/index.js +0 -24
  758. package/dist/spec/domain/service/index.js.map +0 -1
  759. package/dist/spec/index.d.ts +0 -10
  760. package/dist/spec/index.d.ts.map +0 -1
  761. package/dist/spec/index.js +0 -12
  762. package/dist/spec/index.js.map +0 -1
  763. package/dist/spec/infrastructure/cli/parseArgsError.d.ts +0 -16
  764. package/dist/spec/infrastructure/cli/parseArgsError.d.ts.map +0 -1
  765. package/dist/spec/infrastructure/cli/parseArgsError.js +0 -34
  766. package/dist/spec/infrastructure/cli/parseArgsError.js.map +0 -1
  767. package/dist/spec/infrastructure/index.d.ts +0 -2
  768. package/dist/spec/infrastructure/index.d.ts.map +0 -1
  769. package/dist/spec/infrastructure/index.js +0 -2
  770. package/dist/spec/infrastructure/index.js.map +0 -1
  771. package/dist/spec/infrastructure/sql/PgQueryParser.d.ts +0 -18
  772. package/dist/spec/infrastructure/sql/PgQueryParser.d.ts.map +0 -1
  773. package/dist/spec/infrastructure/sql/PgQueryParser.js +0 -17
  774. package/dist/spec/infrastructure/sql/PgQueryParser.js.map +0 -1
  775. package/dist/spec/infrastructure/sql/compilePlan.d.ts +0 -37
  776. package/dist/spec/infrastructure/sql/compilePlan.d.ts.map +0 -1
  777. package/dist/spec/infrastructure/sql/compilePlan.js +0 -287
  778. package/dist/spec/infrastructure/sql/compilePlan.js.map +0 -1
  779. package/dist/spec/infrastructure/sql/compileSql.d.ts +0 -35
  780. package/dist/spec/infrastructure/sql/compileSql.d.ts.map +0 -1
  781. package/dist/spec/infrastructure/sql/compileSql.js +0 -92
  782. package/dist/spec/infrastructure/sql/compileSql.js.map +0 -1
  783. package/dist/spec/infrastructure/sql/frontEnd.d.ts +0 -8
  784. package/dist/spec/infrastructure/sql/frontEnd.d.ts.map +0 -1
  785. package/dist/spec/infrastructure/sql/frontEnd.js +0 -100
  786. package/dist/spec/infrastructure/sql/frontEnd.js.map +0 -1
  787. package/dist/spec/infrastructure/sql/index.d.ts +0 -4
  788. package/dist/spec/infrastructure/sql/index.d.ts.map +0 -1
  789. package/dist/spec/infrastructure/sql/index.js +0 -4
  790. package/dist/spec/infrastructure/sql/index.js.map +0 -1
  791. package/dist/spec/kernel/diagnostic.d.ts.map +0 -1
  792. package/dist/spec/kernel/diagnostic.js +0 -301
  793. package/dist/spec/kernel/diagnostic.js.map +0 -1
  794. package/dist/spec/kernel/index.d.ts +0 -8
  795. package/dist/spec/kernel/index.d.ts.map +0 -1
  796. package/dist/spec/kernel/index.js +0 -8
  797. package/dist/spec/kernel/index.js.map +0 -1
  798. package/dist/spec/usecase/EmitTypes.d.ts +0 -22
  799. package/dist/spec/usecase/EmitTypes.d.ts.map +0 -1
  800. package/dist/spec/usecase/EmitTypes.js +0 -182
  801. package/dist/spec/usecase/EmitTypes.js.map +0 -1
  802. package/dist/spec/usecase/ValidateManifestsUseCase.d.ts +0 -8
  803. package/dist/spec/usecase/ValidateManifestsUseCase.d.ts.map +0 -1
  804. package/dist/spec/usecase/ValidateManifestsUseCase.js +0 -101
  805. package/dist/spec/usecase/ValidateManifestsUseCase.js.map +0 -1
  806. package/dist/spec/usecase/dto/ValidateManifestsRequest.d.ts +0 -27
  807. package/dist/spec/usecase/dto/ValidateManifestsRequest.d.ts.map +0 -1
  808. package/dist/spec/usecase/dto/ValidateManifestsRequest.js +0 -2
  809. package/dist/spec/usecase/dto/ValidateManifestsRequest.js.map +0 -1
  810. package/dist/spec/usecase/dto/ValidateManifestsResponse.d.ts +0 -14
  811. package/dist/spec/usecase/dto/ValidateManifestsResponse.d.ts.map +0 -1
  812. package/dist/spec/usecase/dto/ValidateManifestsResponse.js +0 -2
  813. package/dist/spec/usecase/dto/ValidateManifestsResponse.js.map +0 -1
  814. package/dist/spec/usecase/dto/index.d.ts +0 -3
  815. package/dist/spec/usecase/dto/index.d.ts.map +0 -1
  816. package/dist/spec/usecase/dto/index.js +0 -3
  817. package/dist/spec/usecase/dto/index.js.map +0 -1
  818. package/dist/spec/usecase/index.d.ts +0 -10
  819. package/dist/spec/usecase/index.d.ts.map +0 -1
  820. package/dist/spec/usecase/index.js +0 -10
  821. package/dist/spec/usecase/index.js.map +0 -1
  822. package/dist/testing/cases/before-hook.d.ts +0 -4
  823. package/dist/testing/cases/before-hook.d.ts.map +0 -1
  824. package/dist/testing/cases/before-hook.js +0 -71
  825. package/dist/testing/cases/before-hook.js.map +0 -1
  826. package/dist/testing/cases/corpus.d.ts +0 -14
  827. package/dist/testing/cases/corpus.d.ts.map +0 -1
  828. package/dist/testing/cases/corpus.js +0 -93
  829. package/dist/testing/cases/corpus.js.map +0 -1
  830. package/dist/testing/cases/policy.d.ts +0 -87
  831. package/dist/testing/cases/policy.d.ts.map +0 -1
  832. package/dist/testing/cases/policy.js +0 -143
  833. package/dist/testing/cases/policy.js.map +0 -1
  834. package/dist/testing/cases/printer.d.ts +0 -4
  835. package/dist/testing/cases/printer.d.ts.map +0 -1
  836. package/dist/testing/cases/printer.js +0 -34
  837. package/dist/testing/cases/printer.js.map +0 -1
  838. package/dist/testing/cases/report-view.d.ts +0 -5
  839. package/dist/testing/cases/report-view.d.ts.map +0 -1
  840. package/dist/testing/cases/report-view.js +0 -51
  841. package/dist/testing/cases/report-view.js.map +0 -1
  842. package/dist/testing/cases/requisition.d.ts +0 -4
  843. package/dist/testing/cases/requisition.d.ts.map +0 -1
  844. package/dist/testing/cases/requisition.js +0 -38
  845. package/dist/testing/cases/requisition.js.map +0 -1
  846. package/dist/testing/cases/search-places.d.ts +0 -4
  847. package/dist/testing/cases/search-places.d.ts.map +0 -1
  848. package/dist/testing/cases/search-places.js +0 -60
  849. package/dist/testing/cases/search-places.js.map +0 -1
  850. package/dist/testing/cases/stock.d.ts +0 -4
  851. package/dist/testing/cases/stock.d.ts.map +0 -1
  852. package/dist/testing/cases/stock.js +0 -35
  853. package/dist/testing/cases/stock.js.map +0 -1
  854. package/dist/testing/cases/store.d.ts +0 -4
  855. package/dist/testing/cases/store.d.ts.map +0 -1
  856. package/dist/testing/cases/store.js +0 -100
  857. package/dist/testing/cases/store.js.map +0 -1
  858. package/dist/testing/harness.d.ts +0 -94
  859. package/dist/testing/harness.d.ts.map +0 -1
  860. package/dist/testing/harness.js +0 -168
  861. package/dist/testing/harness.js.map +0 -1
  862. package/dist/testing/index.d.ts.map +0 -1
  863. package/dist/testing/index.js.map +0 -1
  864. package/dist/testing/report.d.ts +0 -15
  865. package/dist/testing/report.d.ts.map +0 -1
  866. package/dist/testing/report.js +0 -22
  867. package/dist/testing/report.js.map +0 -1
  868. package/dist/web/createRestSurface.d.ts +0 -7
  869. package/dist/web/createRestSurface.d.ts.map +0 -1
  870. package/dist/web/createRestSurface.js +0 -41
  871. package/dist/web/createRestSurface.js.map +0 -1
  872. package/dist/web/index.d.ts +0 -2
  873. package/dist/web/index.d.ts.map +0 -1
  874. package/dist/web/index.js +0 -2
  875. package/dist/web/index.js.map +0 -1
  876. package/docs/adr/0001-four-atom-manifest-model.md +0 -440
  877. package/docs/adr/0002-closed-enums-for-bindings.md +0 -253
  878. package/docs/adr/0007-ai-as-primary-author.md +0 -473
  879. package/docs/adr/0008-structured-diagnostic-shape.md +0 -338
  880. package/docs/adr/0009-consumer-supplied-manifests.md +0 -149
  881. package/docs/adr/0010-locale-and-translates.md +0 -453
  882. package/docs/adr/0011-adapter-port-spec.md +0 -281
  883. package/docs/adr/0012-views-as-public-rest.md +0 -161
  884. package/docs/adr/0013-agent-provisioned-consumer-projects.md +0 -154
  885. package/docs/adr/0014-auth-better-auth-and-multi-tenant-mcp.md +0 -939
  886. package/docs/adr/0016-site-semantic-layer.md +0 -70
  887. package/docs/adr/0017-media-multi-variant-agent-side-optimization.md +0 -181
  888. package/docs/adr/0018-core-starters-repository-boundary.md +0 -179
  889. package/docs/adr/0019-sealed-manifest-runtime-pipeline.md +0 -244
  890. package/docs/adr/0020-builtin-handler-contracts-and-matched-upsert.md +0 -199
  891. package/docs/adr/0021-retire-starter-scaffolding.md +0 -30
  892. package/docs/adr/0022-caller-observed-version-occ.md +0 -212
  893. package/docs/adr/0023-port-failure-contract.md +0 -69
  894. package/docs/adr/0024-manifest-native-schema-tables.md +0 -264
  895. package/docs/adr/0025-reserved-native-columns-and-published-only-public-views.md +0 -105
  896. package/docs/adr/0026-progressive-generate.md +0 -36
  897. package/docs/adr/0027-scheduled-procedure-triggers.md +0 -31
  898. package/docs/adr/0028-schema-ttl-expiry.md +0 -33
  899. package/docs/adr/0029-mcp-apps-interaction-contracts.md +0 -324
  900. package/docs/adr/0030-store.md +0 -40
  901. package/docs/adr/0031-host-cloud-core-contract.md +0 -102
  902. package/docs/adr/0032-store-centric-core-and-service-contract.md +0 -384
  903. package/docs/adr/0033-storage-converges-to-the-plan.md +0 -92
  904. package/docs/adr/0034-store-is-authored-as-sql.md +0 -192
  905. package/docs/adr/0035-sql-dialects.md +0 -154
  906. package/docs/adr/0036-host-and-dialect.md +0 -65
  907. package/docs/adr/0037-postgresql-is-the-reference-dialect.md +0 -125
  908. package/docs/adr/0038-bun-native-host.md +0 -63
  909. package/docs/adr/0039-postgresql-is-native.md +0 -130
  910. package/docs/adr/README.md +0 -98
  911. package/docs/adr/adr-lite-1376-admin-extensions.md +0 -330
  912. package/docs/adr/adr-lite-803-request-diagnostics.md +0 -38
  913. package/docs/adr/adr-lite-808-route-readiness.md +0 -47
  914. package/docs/adr/adr-lite-809-bounded-public-content.md +0 -71
  915. package/docs/adr/adr-lite-812-native-parity.md +0 -150
  916. package/docs/adr/adr-lite-823-home-statistics.md +0 -64
  917. package/docs/adr/adr-lite-842-mcp-authoring.md +0 -30
  918. package/docs/adr/adr-lite-845-frontend-client.md +0 -38
  919. package/docs/adr/adr-lite-861-admin-webmcp.md +0 -48
  920. package/docs/adr/adr-lite-909-admin-ui-kit.md +0 -37
  921. package/docs/examples/commerce-inventory.md +0 -498
  922. package/docs/examples/commerce.md +0 -254
  923. package/docs/examples/guarded-api.md +0 -238
  924. package/docs/examples/intake-hooks.md +0 -237
  925. package/docs/examples/intake.md +0 -127
  926. package/docs/examples/legal-documents.md +0 -218
  927. package/docs/examples/procurement.md +0 -226
  928. package/docs/examples/publication.md +0 -211
  929. package/docs/examples/reference-service/.mantle/generated/mantle.ts +0 -174
  930. package/docs/examples/reference-service/.mantle/generated/plan.json +0 -1936
  931. package/docs/examples/reference-service/README.md +0 -33
  932. package/docs/examples/reference-service/manifests/catalog.yaml +0 -103
  933. package/docs/examples/reference-service/manifests/orders.yaml +0 -120
  934. package/docs/examples/reference-service/mantle.config.json +0 -1
  935. package/docs/examples/reference-service/package.json +0 -27
  936. package/docs/examples/reference-service/smoke.mjs +0 -160
  937. package/docs/examples/reference-service/src/handlers.ts +0 -36
  938. package/docs/examples/reference-service/src/index.ts +0 -33
  939. package/docs/examples/reference-service/src/service.ts +0 -78
  940. package/docs/examples/reference-service/wrangler.jsonc +0 -26
  941. package/docs/examples/reservation.md +0 -142
  942. /package/docs/examples/{reference-service → app-shell}/.dev.vars.example +0 -0
@@ -1,635 +0,0 @@
1
- import { requiredEnumStates } from "./procedureFlow.js";
2
- /**
3
- * The Admin surface (ADR-0032 decisions 8 and 9): the staff JSON API under `{basePath}/api` and the SPA shell under `{basePath}`.
4
- * Every API route needs a staff caller. Reads and runs go through `store.as(caller)` and `invokeProcedure`, so Admin sees what the
5
- * caller's scope sees and nothing wider. Routes of an `AdminIdentity` facet that is absent do not exist.
6
- */
7
- import { makeDiagnostic, redactForWire } from "../spec/kernel/index.js";
8
- import { MCP_HINT_KEYWORD, STAFF_ROLES, isMediaMcpHint, isStaffRole, meetsRole, enumOptions, resolveMantleRef, mcpTools } from "../spec/domain/index.js";
9
- import { evaluateAuthAll } from "../core/index.js";
10
- import { siteConfigOf } from "../core/siteConfig.js";
11
- import { sessionUserOf } from "../core/sessionUser.js";
12
- import { coerce, failure, json, match, readJsonObject, viewQuery, wireError } from "../core/wire.js";
13
- import { decodeMemberCursor } from "./consent.js";
14
- import { developerConsole } from "./developerConsole.js";
15
- import { adminExtensionModule, adminExtensionRoute, adminExtensionsFor, checkPlanUiExtensions, extensionSource, extensionSourcePath, validateAdminExtensions } from "./extensions.js";
16
- const NO_STORE = { "cache-control": "no-store" };
17
- const P = "admin";
18
- const bad = (message) => wireError("INPUT_VALIDATION_FAILED", message, P);
19
- const propsOf = (s) => (s.properties ?? {});
20
- /** A role denial names the minimum role, so the SPA can say who may do it. */
21
- const denied = (role, message) => json({ error: redactForWire(makeDiagnostic({ code: "AUTH_DENIED", phase: "runtime", severity: "error", path: P, expected: `${role} role or higher`, message })), minimumRole: role }, 403, NO_STORE);
22
- /** What the SPA lists and edits for one Schema; a translation's parent is the entry sharing its `on`. */
23
- function collectionOf(s, schemas) {
24
- const names = new Set(schemas.filter((x) => !x.translates).map((x) => x.name));
25
- const props = propsOf(s.schema);
26
- const required = new Set(s.schema.required ?? []);
27
- const ui = (s.uiSchema ?? {});
28
- const list = ui["list"] ?? {};
29
- const nav = ui["nav"];
30
- const filterField = list["filterField"];
31
- // a required reference is composition: the child sits under its parent, an `id` reference first, else one by a unique field
32
- const refs = Object.keys(props).filter((f) => required.has(f) && names.has(resolveMantleRef(props[f])?.schema ?? ""));
33
- const byId = refs.find((f) => resolveMantleRef(props[f]).field === "id");
34
- const parentField = byId ?? refs[0];
35
- // a standalone list's parent picker scopes by the parent's entry id, so only an `id` reference composes there (the checker agrees)
36
- const navField = nav?.["standalone"] === true ? nav["parentField"] ?? byId : undefined;
37
- const navParent = navField ? resolveMantleRef(props[navField]) : null;
38
- const children = schemas.filter((c) => c.translates?.parent === s.name);
39
- return {
40
- name: s.name, title: s.title ?? s.name, description: s.description ?? null,
41
- lifecycle: s.publishing ? "publishing" : "operational",
42
- parent: s.translates ? { collection: s.translates.parent, parentField: s.translates.on, childField: s.translates.on }
43
- : parentField ? { collection: resolveMantleRef(props[parentField]).schema, parentField: resolveMantleRef(props[parentField]).field, childField: parentField } : null,
44
- hasTranslations: children.length > 0, localized: s.localized === true || !!s.translates, translates: s.translates ?? null,
45
- schema: s.schema, uiSchema: s.uiSchema ?? null,
46
- mediaFields: [s, ...children].flatMap((x) => Object.entries(propsOf(x.schema)).flatMap(([name, p]) => (isMediaMcpHint(p[MCP_HINT_KEYWORD]) ? [{ name, hint: p[MCP_HINT_KEYWORD] }] : []))),
47
- // the plan lower-cases index columns; `names` maps them back to the declared spelling
48
- sortableFields: [...new Set([...(s.unique ?? []), ...(s.indexes ?? [])].map((i) => s.names[i[0]] ?? i[0]).filter((f) => required.has(f)))],
49
- filter: filterField ? { field: filterField, values: enumOptions(props[filterField])?.map((o) => o.value) ?? [] } : null,
50
- list: { primaryField: list["primaryField"] ?? null, columns: list["columns"] ?? [] },
51
- nav: navField && navParent ? { standalone: true, parentField: navField, parentCollection: navParent.schema } : null,
52
- };
53
- }
54
- /** The settings page's fields and their longest value; the old surface had no limit. */
55
- const SETTINGS = { brand: 80, title: 200, description: 1000 };
56
- /** A committed asset with its primary variant lifted, so the library grid renders without deriving it. */
57
- const settingsOf = ({ brand, title, description }) => ({ brand, title, description });
58
- function mediaItem(a) {
59
- const primary = a.variants.find((v) => v.role === "primary") ?? a.variants[0];
60
- return { id: a.id, variants: a.variants, primaryUrl: primary?.publicUrl ?? null, mime: primary?.mimeType ?? null, byteSize: primary?.byteSize ?? null, alt: a.alt ?? null, caption: a.caption ?? null, createdAt: a.createdAt };
61
- }
62
- /** Store's native columns: `data` never sets them (status moves by publish and unpublish). */
63
- const NATIVE = ["id", "status", "version", "createdAt", "updatedAt", "authorId"];
64
- /** Store keeps microseconds; the Admin wire keeps the old milliseconds. */
65
- const ms = (iso) => (typeof iso === "string" ? Date.parse(iso) : null);
66
- /** RFC 4180 quoting, and a text that a spreadsheet would run as a formula gets a leading `'`. */
67
- function csvCell(v) {
68
- const t = v === null || v === undefined ? "" : typeof v === "object" ? JSON.stringify(v) : String(v);
69
- const safe = typeof v === "string" && /^[\s\u0000-\u001f]*[=+@-]|^[\t\r]/u.test(t) ? `'${t}` : t;
70
- return /[",\r\n]/.test(safe) ? `"${safe.replace(/"/g, '""')}"` : safe;
71
- }
72
- /** Every page as one CSV download. The first page is read before answering, so a bad query is a JSON error, not a broken file. */
73
- async function csv(name, read, columnsOf, cell) {
74
- let page = await read();
75
- const columns = columnsOf(page.rows);
76
- const line = (xs) => `${xs.map(csvCell).join(",")}\r\n`;
77
- async function* lines() {
78
- yield `\uFEFF${line(columns)}`;
79
- for (;;) {
80
- yield page.rows.map((r) => line(columns.map((c) => cell(r, c)))).join("");
81
- if (!page.nextCursor)
82
- return;
83
- page = await read(page.nextCursor);
84
- }
85
- }
86
- const it = lines();
87
- const enc = new TextEncoder();
88
- const body = new ReadableStream({
89
- async pull(c) {
90
- try {
91
- const n = await it.next();
92
- if (n.done)
93
- c.close();
94
- else
95
- c.enqueue(enc.encode(n.value));
96
- }
97
- catch (e) {
98
- // the status line is gone once a page has streamed: end the download as failed, and leave a trace
99
- console.error("[mantle admin] export failed mid-stream", e);
100
- c.error(e);
101
- }
102
- },
103
- async cancel() { await it.return(undefined); },
104
- });
105
- return new Response(body, { headers: { "content-type": "text/csv; charset=utf-8", "content-disposition": `attachment; filename="${name}.csv"`, ...NO_STORE } });
106
- }
107
- /** Adds `integrity` to the shell's import map; a shell without one (a dev build) gets one holding only the integrity. */
108
- function withModuleIntegrity(html, integrity) {
109
- const found = /<script type="importmap">([\s\S]*?)<\/script>/.exec(html);
110
- let map = {};
111
- try {
112
- if (found)
113
- map = JSON.parse(found[1]);
114
- }
115
- catch {
116
- map = {};
117
- }
118
- // `<` cannot close the script early once escaped
119
- const json = JSON.stringify({ ...map, integrity: { ...(map.integrity ?? {}), ...integrity } }).replace(/</g, "\\u003c");
120
- const tag = `<script type="importmap">${json}</script>`;
121
- return found ? html.replace(found[0], () => tag) : html.replace(/<head>/i, (head) => `${head}${tag}`);
122
- }
123
- export function createAdminSurface(runtime, options) {
124
- const base = options.basePath.replace(/\/+$/, "");
125
- // the SPA is built for /admin: its chunks, its API calls and its links name that path
126
- if (options.assets && base !== "/admin")
127
- throw new Error(`createAdminSurface: the Admin SPA (assets) is served at /admin only, not '${options.basePath}'.`);
128
- const { plan } = runtime;
129
- const { directory, roles } = options.identity ?? {};
130
- const schemas = Object.values(plan.schemas);
131
- const projected = new Map(schemas.map((s) => [s, collectionOf(s, schemas)]));
132
- const projection = (s) => projected.get(s);
133
- const collections = schemas.filter((s) => !s.translates).map(projection);
134
- const staffProcedures = [...new Set(Object.values(plan.triggers).flatMap((t) => (t.source.kind === "mcp" && t.source.surface === "staff" ? [t.procedure] : [])))];
135
- const sees = (requires, caller) => evaluateAuthAll(requires, caller, P) === null;
136
- const operations = (caller) => staffProcedures.filter((name) => sees(plan.procedures[name].requires, caller)).map((name) => {
137
- const p = plan.procedures[name];
138
- const requiredStates = p.target && "sql" in p.handler ? requiredEnumStates(p.handler.sql.stmts, p.target.schema, plan.schemas[p.target.schema.toLowerCase()]?.schema ?? {}) : [];
139
- return {
140
- ...(requiredStates.length ? { requiredStates } : {}),
141
- name, title: p.title ?? null, description: p.description ?? null, input: p.input, uiSchema: p.uiSchema ?? null,
142
- interactions: p.target ? [{ collection: p.target.schema, bind: [{ input: p.target.id, field: "id" }], ...(p.target.version ? { version: p.target.version } : {}), mutates: true }] : [],
143
- };
144
- });
145
- const staffView = (name, caller) => {
146
- const v = plan.views[name];
147
- // a View the caller cannot see is not there for them, so its name and its rule cannot be probed
148
- if (!v || v.surface !== "staff" || !sees(v.requires, caller))
149
- throw wireError("NOT_FOUND", `no staff View '${name}'`, P);
150
- return v;
151
- };
152
- const views = (caller) => Object.entries(plan.views).filter(([, v]) => v.surface === "staff" && sees(v.requires, caller)).map(([name, v]) => {
153
- const list = (v.uiSchema?.["list"] ?? {});
154
- // `columns`: the output that reads a Schema field unchanged, so Admin labels and formats it as that field; named as the rows and the
155
- // JSON Schema name them, not by the plan's lower-cased keys
156
- const columns = Object.fromEntries(Object.entries(v.columns ?? {}).map(([k, c]) => {
157
- const s = plan.schemas[c.schema];
158
- const field = s.names?.[c.field] ?? c.field;
159
- return [k === c.field ? field : k, { schema: s.name, field }];
160
- }));
161
- return { name, title: v.title ?? null, description: v.description ?? null, input: v.input ?? null, list: { columns: list["columns"] ?? [], searchFields: list["searchFields"] ?? [], filterFields: list["filterFields"] ?? [], cells: list["cells"] ?? {} }, columns };
162
- });
163
- // `search` and `filter.<output>` from the query string, for the outputs the View's uiSchema.list declares (ADR-0032 decision 5).
164
- // A filter value is coerced to the field the output reads, as a View's input is.
165
- const viewMatch = (v, q) => {
166
- const list = (v.uiSchema?.["list"] ?? {});
167
- const search = q.get("search")?.trim();
168
- const filters = {};
169
- for (const f of list["filterFields"] ?? []) {
170
- const raw = q.get(`filter.${f}`);
171
- if (raw === null || raw === "")
172
- continue;
173
- const c = v.columns?.[f] ?? v.columns?.[f.toLowerCase()];
174
- const schema = c ? propsOf(plan.schemas[c.schema].schema)[plan.schemas[c.schema].names?.[c.field] ?? c.field] : undefined;
175
- filters[f] = coerce(raw, schema, `filter.${f}`, P);
176
- }
177
- return { ...(search && list["searchFields"]?.length ? { search } : {}), ...(Object.keys(filters).length ? { filters } : {}) };
178
- };
179
- // a custom directory may return more than it declares: only the declared fields reach the wire
180
- const staffInfo = ({ id, email, name, role, githubLogin, emailVerified, createdAt }) => ({ id, email, name, role, githubLogin, emailVerified, createdAt });
181
- const memberInfo = ({ id, email, name, emailVerified, createdAt }) => ({ id, email, name, emailVerified, createdAt });
182
- const extensions = options.extensions ?? [];
183
- validateAdminExtensions(extensions);
184
- // a manifest's uiSchema may name a contribution: it must exist, fit the key and accept the options
185
- checkPlanUiExtensions(plan, extensions);
186
- const site = async (url, caller) => {
187
- const { origin, ...config } = runtime.site ? await runtime.site.read() : siteConfigOf([]);
188
- // boot refuses a bad origin; a row edited by hand still must not take /site down
189
- const publicUrl = URL.canParse(origin) ? origin : url.origin;
190
- const at = (p) => (p ? new URL(p, publicUrl).href : null);
191
- const mcp = options.site?.mcpEndpoints;
192
- // what this deployment turned on, so the console does not offer a page that can only answer 501
193
- // creation statistics are a storage capability 0.2.0 storage does not have (the route answers 501)
194
- const capabilities = { siteSettings: runtime.site !== undefined, media: !!library, invitationEmail: !!roles?.sendStaffInvitation, statistics: false };
195
- return { ...config, publicUrl, mcpEndpoints: { public: at(mcp?.public), staff: at(mcp?.staff) }, capabilities, extensions: adminExtensionsFor(extensions, caller.role, base) };
196
- };
197
- const library = options.media && runtime.site?.media(options.media);
198
- const media = () => {
199
- if (!library)
200
- throw wireError("MEDIA_NOT_CONFIGURED", "Media is not enabled on this deployment: give the storage adapter site defaults and createAdminSurface a MediaStorage.", P);
201
- return library;
202
- };
203
- const me = async (caller) => {
204
- // the session user this request already resolved; a token or credential caller has none and reads the row
205
- // ponytail: with a sessionCache or cookieCache the snapshot may be stale, so login and image can lag a profile edit (display only; role is re-read); the upgrade is a fresh read here if that matters
206
- const u = sessionUserOf(caller) ?? await directory?.getUser?.(caller.subject);
207
- return { userId: caller.subject, role: caller.role, login: u ? u.githubLogin || u.name || u.email || null : null, image: u?.image ?? null };
208
- };
209
- // the staff MCP surface's tools (its default locale), each with its page: a Procedure's target Schema, or the View
210
- const staffTools = mcpTools(plan, "staff");
211
- const staffTool = new Map(staffTools.map((t) => [t.name, t]));
212
- const webmcp = {
213
- tools: staffTools.map(({ name, title, description, inputSchema, outputSchema, annotations }) => ({ name, ...(title ? { title } : {}), description, inputSchema, ...(outputSchema ? { outputSchema } : {}), ...(annotations ? { annotations } : {}) })),
214
- routes: Object.fromEntries(staffTools.flatMap((t) => {
215
- if (t.kind === "view")
216
- return [[t.name, { path: `${base}/views/${encodeURIComponent(t.source)}` }]];
217
- const target = plan.procedures[t.source].target;
218
- return target ? [[t.name, { path: `${base}/c/${encodeURIComponent(plan.schemas[target.schema.toLowerCase()]?.name ?? target.schema)}`, entry: true }]] : [];
219
- })),
220
- };
221
- let developer;
222
- // ---- entries: every read and write is the caller's own Store, so a scoped Schema shows the caller's rows only (G2b)
223
- const schemaOf = (name) => {
224
- if (typeof name !== "string" || !name)
225
- throw bad("a `collection` naming a Schema is required");
226
- const s = Object.hasOwn(plan.schemas, name.toLowerCase()) ? plan.schemas[name.toLowerCase()] : undefined;
227
- if (!s)
228
- throw wireError("NOT_FOUND", `no collection '${name}'`, P);
229
- return s;
230
- };
231
- // root `readOnly: true` keeps generic authoring off a Schema its Procedures maintain
232
- const writable = (s) => {
233
- if (s.schema.readOnly === true)
234
- throw wireError("CONFLICT", `Schema '${s.name}' is read-only on generic authoring surfaces; use its declared Procedures.`, P);
235
- };
236
- const dataOf = (body) => {
237
- const d = body["data"] ?? {};
238
- if (typeof d !== "object" || d === null || Array.isArray(d))
239
- throw bad("`data` must be an object");
240
- const native = Object.keys(d).find((k) => NATIVE.includes(k));
241
- if (native)
242
- throw bad(`\`data\` may not set '${native}': status moves by publish and unpublish, and Store owns the rest`);
243
- return d;
244
- };
245
- const current = async (store, s, id) => {
246
- const [row] = (await store.select({ from: s.name, where: { id }, limit: 1 })).rows;
247
- if (!row)
248
- throw wireError("NOT_FOUND", `no ${s.name} entry '${id}'`, P);
249
- return row;
250
- };
251
- const entryOf = (s, row) => {
252
- const { id, status, version, createdAt: _c, updatedAt, authorId: _a, ...data } = row;
253
- return { id: String(id), collection: s.name, locale: typeof data["locale"] === "string" ? data["locale"] : null, status: status ?? null, version, data, updated_at: ms(updatedAt) };
254
- };
255
- const titleOf = (s, data) => {
256
- const props = propsOf(s.schema);
257
- const key = [projection(s).list.primaryField, "title", "name", "slug", ...(s.schema.required ?? []).filter((f) => [props[f]?.["type"]].flat().includes("string"))]
258
- .find((k) => k && typeof data[k] === "string" && data[k] !== "");
259
- return key ? data[key] : null;
260
- };
261
- const listQuery = (s, q) => {
262
- if (q.get("cursor_direction") === "backward")
263
- throw bad("entries page forward only: keep the cursors already seen to go back");
264
- const where = [];
265
- const status = q.get("status");
266
- if (s.publishing && status && status !== "all")
267
- where.push({ status });
268
- for (const k of ["filter", "scope"]) {
269
- const field = q.get(`${k}_field`), value = q.get(`${k}_value`);
270
- if (!field !== !value)
271
- throw bad(`${k}_field and ${k}_value go together`);
272
- if (field)
273
- where.push({ [field]: coerce(value, propsOf(s.schema)[field], field, P) });
274
- }
275
- const search = q.get("search")?.trim();
276
- return { from: s.name, ...(where.length ? { where: { and: where } } : {}), ...(search ? { search } : {}), orderBy: { [q.get("sort") || "updatedAt"]: q.get("direction") === "asc" ? "asc" : "desc" } };
277
- };
278
- const everyPage = async (store, q) => {
279
- const rows = [];
280
- let cursor;
281
- do {
282
- const page = await store.select({ ...q, ...(cursor ? { cursor } : {}) });
283
- rows.push(...page.rows);
284
- cursor = page.nextCursor;
285
- } while (cursor);
286
- return rows;
287
- };
288
- /** Each row's translation locales: a second select per translation Schema, `in` the page's keys, in chunks under the bind limit. */
289
- const localesOf = async (store, s, rows) => {
290
- const out = new Map(rows.map((r) => [String(r["id"]), new Set()]));
291
- for (const t of schemas.filter((x) => x.translates?.parent === s.name && x.fields["locale"])) {
292
- const on = t.translates.on;
293
- const keys = [...new Set(rows.map((r) => r[on]).filter((v) => v !== null && v !== undefined && v !== ""))];
294
- const byKey = new Map();
295
- for (let i = 0; i < keys.length; i += 50) {
296
- for (const tr of await everyPage(store, { from: t.name, columns: [on, "locale"], where: { [on]: { in: keys.slice(i, i + 50) } }, limit: 500 })) {
297
- if (typeof tr["locale"] === "string")
298
- byKey.set(tr[on], (byKey.get(tr[on]) ?? new Set()).add(tr["locale"]));
299
- }
300
- }
301
- for (const r of rows)
302
- for (const l of byKey.get(r[on]) ?? [])
303
- out.get(String(r["id"])).add(l);
304
- }
305
- return out;
306
- };
307
- const list = async (caller, q) => {
308
- const s = schemaOf(q.get("collection"));
309
- const store = runtime.store.as(caller);
310
- const limit = q.get("limit");
311
- const cursor = q.get("cursor");
312
- const page = await store.select({ ...listQuery(s, q), ...(limit ? { limit: coerce(limit, { type: "integer" }, "limit", P) } : {}), ...(cursor ? { cursor } : {}) });
313
- const locales = await localesOf(store, s, page.rows);
314
- const ui = projection(s).list;
315
- const preview = [...(ui.primaryField ? [ui.primaryField] : []), ...ui.columns];
316
- return {
317
- items: page.rows.map((row) => {
318
- const e = entryOf(s, row);
319
- return {
320
- id: e.id, collection: s.name, locale: e.locale, status: e.status, version: e.version, title: s.publishing ? titleOf(s, e.data) : null, updated_at: e.updated_at,
321
- translation_locales: [...locales.get(e.id)],
322
- ...(!s.publishing && preview.length ? { data_preview: Object.fromEntries(preview.map((f) => [f, row[f] ?? null])) } : {}),
323
- };
324
- }),
325
- // forward only: Store pages one way, so the client keeps the cursors it has seen (G5)
326
- next_cursor: page.nextCursor ?? null,
327
- };
328
- };
329
- /** The editor's payload: the entry, its parent, and the related sections (translations, and Schemas that reference it by id or a unique field). */
330
- const editor = async (store, s, row) => {
331
- const join = (v) => (v === undefined || v === "" ? null : v);
332
- const up = projection(s).parent;
333
- const upValue = up ? join(row[up.childField]) : null;
334
- const parentSchema = up && upValue !== null ? schemaOf(up.collection) : undefined;
335
- const [parent] = parentSchema ? (await store.select({ from: parentSchema.name, where: { [up.parentField]: upValue }, limit: 1 })).rows : [];
336
- const rels = [
337
- ...(s.translates ? [{ t: s, kind: "translation", parentField: s.translates.on, childField: s.translates.on }] : []),
338
- ...schemas.filter((c) => c !== s).flatMap((c) => c.translates?.parent === s.name
339
- ? [{ t: c, kind: "translation", parentField: c.translates.on, childField: c.translates.on }]
340
- : Object.entries(propsOf(c.schema)).flatMap(([f, p]) => { const ref = resolveMantleRef(p); return ref?.schema === s.name ? [{ t: c, kind: "field", parentField: ref.field, childField: f }] : []; })),
341
- ];
342
- const related = await Promise.all(rels.map(async ({ t, kind, parentField, childField }) => {
343
- const parentValue = join(row[parentField]);
344
- const rows = parentValue === null ? [] : (await store.select({ from: t.name, where: { [childField]: parentValue }, limit: 50 })).rows;
345
- return { collection: projection(t), relationship: { kind, parentField, childField, parentValue }, entries: rows.map((r) => entryOf(t, r)) };
346
- }));
347
- return {
348
- collection: projection(s), entry: entryOf(s, row),
349
- parentEntryId: parent ? String(parent["id"]) : null, parentEntryTitle: parent ? titleOf(parentSchema, entryOf(parentSchema, parent).data) ?? String(parent["id"]) : null,
350
- related,
351
- };
352
- };
353
- const move = (status) => async ({ caller, params: { id }, url }) => {
354
- const s = schemaOf(url.searchParams.get("collection"));
355
- writable(s);
356
- const store = runtime.store.as(caller);
357
- await current(store, s, id);
358
- // the lifecycle, a publish's completeness and a translation's parent-first rule are Store's (ADR-0032 decision 1)
359
- await store.write([{ update: s.name, set: { status }, where: { id: id } }]);
360
- return editor(store, s, await current(store, s, id));
361
- };
362
- const routes = [
363
- { method: "GET", path: "/me", role: "contributor", run: ({ caller }) => me(caller) },
364
- {
365
- method: "GET", path: "/bootstrap", role: "contributor", run: async ({ caller, url, url: { searchParams: q } }) => ({
366
- me: await me(caller), site: await site(url, caller), collections, operations: operations(caller), views: views(caller), webmcp,
367
- // the first page of the collection the SPA opens on
368
- ...(q.get("collection") ? { entries: await list(caller, q) } : {}),
369
- }),
370
- },
371
- { method: "GET", path: "/collections", role: "contributor", run: async () => ({ collections }) },
372
- {
373
- // creation statistics are an optional storage capability that 0.2.0 storage does not have (G7); the SPA hides the card on 501
374
- method: "GET", path: "/collections/{name}/statistics", role: "contributor", run: async ({ params: { name } }) => {
375
- schemaOf(name);
376
- return json({ error: { code: "STATISTICS_UNAVAILABLE", message: "Statistics are unavailable for this storage adapter." } }, 501, NO_STORE);
377
- },
378
- },
379
- { method: "GET", path: "/developer-console", role: "owner", run: async () => (developer ??= developerConsole(plan)) },
380
- { method: "GET", path: "/site", role: "contributor", run: ({ url, caller }) => site(url, caller) },
381
- // the bytes go straight to the bucket: create, PUT each variant to its uploadUrl, commit
382
- { method: "POST", path: "/media/uploads", role: "editor", run: async ({ request }) => media().createUpload(await readJsonObject(request, P)) },
383
- { method: "POST", path: "/media/uploads/{groupId}/commit", role: "editor", run: async ({ request, params: { groupId } }) => media().commitUpload(groupId, await readJsonObject(request, P)) },
384
- {
385
- method: "GET", path: "/media", role: "editor", run: async ({ url: { searchParams: q } }) => {
386
- const limit = q.get("limit");
387
- // the callee first: an unconfigured library is 501 before the query is read
388
- const r = await media().list({ ...(limit ? { limit: coerce(limit, { type: "integer" }, "limit", P) } : {}), ...(q.get("cursor") ? { cursor: q.get("cursor") } : {}), ...(q.get("search")?.trim() ? { search: q.get("search").trim() } : {}) });
389
- return { items: r.rows.map(mediaItem), next_cursor: r.nextCursor ?? null };
390
- },
391
- },
392
- { method: "GET", path: "/media/{id}", role: "editor", run: async ({ params: { id } }) => mediaItem(await media().get(id)) },
393
- { method: "PATCH", path: "/media/{id}", role: "editor", run: async ({ request, params: { id } }) => mediaItem(await media().update(id, await readJsonObject(request, P))) },
394
- { method: "DELETE", path: "/media/{id}", role: "editor", run: async ({ params: { id } }) => media().delete(id) },
395
- { method: "GET", path: "/views-manifest", role: "contributor", run: async ({ caller }) => ({ views: views(caller) }) },
396
- {
397
- method: "GET", path: "/views/{name}", role: "contributor", run: ({ caller, params: { name }, url }) => runtime.store.as(caller).view(name, { ...viewQuery(name, staffView(name, caller), url.searchParams, P), ...viewMatch(staffView(name, caller), url.searchParams) }),
398
- },
399
- {
400
- method: "GET", path: "/views/{name}/export", role: "contributor", run: ({ caller, params: { name }, url }) => {
401
- const v = staffView(name, caller);
402
- const { input } = viewQuery(name, v, url.searchParams, P);
403
- const declared = (v.uiSchema?.["list"] ?? {})["columns"] ?? [];
404
- const store = runtime.store.as(caller);
405
- const matched = viewMatch(v, url.searchParams);
406
- return csv(name, (cursor) => store.view(name, { input, ...matched, limit: 500, ...(cursor ? { cursor } : {}) }), (rows) => (declared.length ? declared : [...new Set(rows.flatMap((r) => Object.keys(r)))]), (row, c) => row[c]);
407
- },
408
- },
409
- { method: "GET", path: "/entries", role: "contributor", run: ({ caller, url }) => list(caller, url.searchParams) },
410
- // before `/entries/{id}`, which has as many segments
411
- {
412
- method: "GET", path: "/entries/export", role: "contributor", run: ({ caller, url: { searchParams: q } }) => {
413
- const s = schemaOf(q.get("collection"));
414
- const query = listQuery(s, q);
415
- const store = runtime.store.as(caller);
416
- const columns = ["id", ...(s.publishing ? ["status"] : []), "version", "updated_at", ...Object.keys(propsOf(s.schema)).filter((f) => f.toLowerCase() !== s.scope && s.fields[f.toLowerCase()] !== "geo")];
417
- return csv(s.name, (cursor) => store.select({ ...query, limit: 500, ...(cursor ? { cursor } : {}) }), () => columns, (row, c) => (c === "updated_at" ? ms(row["updatedAt"]) : row[c]));
418
- },
419
- },
420
- {
421
- method: "GET", path: "/entries/{id}", role: "contributor", run: async ({ caller, params: { id }, url }) => {
422
- const s = schemaOf(url.searchParams.get("collection"));
423
- const store = runtime.store.as(caller);
424
- return editor(store, s, await current(store, s, id));
425
- },
426
- },
427
- {
428
- method: "POST", path: "/entries", role: "contributor", run: async ({ caller, request }) => {
429
- const body = await readJsonObject(request, P);
430
- const s = schemaOf(body["collection"]);
431
- writable(s);
432
- if (caller.role === "contributor" && !s.publishing)
433
- return denied("editor", "Contributors can create drafts, not operational records.");
434
- const store = runtime.store.as(caller);
435
- const [r] = await store.write([{ insert: s.name, values: Object.fromEntries(Object.entries(dataOf(body)).filter(([, v]) => v !== null)) }]);
436
- return editor(store, s, await current(store, s, r.id));
437
- },
438
- },
439
- {
440
- method: "PATCH", path: "/entries/{id}", role: "contributor", run: async ({ caller, params: { id }, request, url }) => {
441
- const s = schemaOf(url.searchParams.get("collection"));
442
- writable(s);
443
- const store = runtime.store.as(caller);
444
- const row = await current(store, s, id);
445
- if (caller.role === "contributor" && (!s.publishing || row["status"] !== "draft"))
446
- return denied("editor", "Contributors can edit drafts only.");
447
- const body = await readJsonObject(request, P);
448
- const lock = body["expectedVersion"];
449
- if (typeof lock !== "number" || !Number.isSafeInteger(lock) || lock < 0)
450
- throw bad("`expectedVersion` (the version the editor loaded) is required");
451
- // the editor sends the whole entry back: a null it read stays as it is, so a draft's empty required field is no write
452
- const set = Object.fromEntries(Object.entries(dataOf(body)).filter(([k, v]) => v !== null || row[k] != null));
453
- if (Object.keys(set).length)
454
- await store.write([{ update: s.name, set, where: { id: id }, lock }]);
455
- return editor(store, s, await current(store, s, id));
456
- },
457
- },
458
- { method: "POST", path: "/entries/{id}/publish", role: "editor", run: move("published") },
459
- { method: "POST", path: "/entries/{id}/unpublish", role: "editor", run: move("draft") },
460
- {
461
- method: "DELETE", path: "/entries/{id}", role: "editor", run: async ({ caller, params: { id }, url }) => {
462
- const s = schemaOf(url.searchParams.get("collection"));
463
- writable(s);
464
- const store = runtime.store.as(caller);
465
- await current(store, s, id);
466
- return (await store.write([{ delete: s.name, where: { id: id } }]))[0];
467
- },
468
- },
469
- { method: "GET", path: "/operations", role: "contributor", run: async ({ caller }) => ({ operations: operations(caller) }) },
470
- {
471
- method: "POST", path: "/operations/{name}", role: "contributor", run: async ({ caller, params: { name }, request }) => {
472
- // an operation the caller cannot see is not there for them, so its name cannot be probed
473
- if (!staffProcedures.includes(name) || !sees(plan.procedures[name].requires, caller))
474
- throw wireError("NOT_FOUND", `no staff operation '${name}'`, P);
475
- const input = await readJsonObject(request, P);
476
- return { ok: true, output: await runtime.invokeProcedure({ procedure: name, input, caller, cause: { kind: "http", id: crypto.randomUUID() } }) };
477
- },
478
- },
479
- ];
480
- // without the site tables the routes still answer, so Admin's Settings page can say what is missing
481
- const siteStore = () => runtime.site ?? (() => { throw wireError("SITE_NOT_CONFIGURED", "Site settings need the site tables: give the storage adapter site defaults (d1Storage(db, { site })).", P); })();
482
- routes.push({ method: "GET", path: "/site-settings", role: "owner", run: async () => settingsOf(await siteStore().read()) }, {
483
- method: "PATCH", path: "/site-settings", role: "owner", run: async ({ request }) => {
484
- const body = await readJsonObject(request, P);
485
- const values = {};
486
- for (const [k, max] of Object.entries(SETTINGS)) {
487
- const v = body[k];
488
- if (v === undefined)
489
- continue;
490
- if (typeof v !== "string" || v.length > max)
491
- throw bad(`'${k}' must be a string of at most ${max} characters`);
492
- values[k] = v;
493
- }
494
- return settingsOf(await siteStore().updateSettings(values));
495
- },
496
- });
497
- routes.push({ method: "GET", path: "/webmcp", role: "contributor", run: async () => webmcp }, {
498
- // a browser agent's tool call, run as `/mcp/staff` runs it: the same input, an `mcp` cause, the caller's own Store
499
- method: "POST", path: "/webmcp/{tool}", role: "contributor", run: async ({ caller, params: { tool: name }, request }) => {
500
- const tool = staffTool.get(name);
501
- if (!tool)
502
- throw wireError("NOT_FOUND", `no staff tool '${name}'`, P);
503
- const input = await readJsonObject(request, P);
504
- const cause = { kind: "mcp", id: crypto.randomUUID() };
505
- if (tool.kind === "procedure")
506
- return { output: await runtime.invokeProcedure({ procedure: tool.source, input, caller, cause }) };
507
- const { limit, cursor, ...rest } = input;
508
- return { output: await runtime.store.as(caller, cause).view(tool.source, { input: rest, ...(limit !== undefined ? { limit: limit } : {}), ...(cursor !== undefined ? { cursor: cursor } : {}) }) };
509
- },
510
- });
511
- if (directory)
512
- routes.push({ method: "GET", path: "/staff", role: "owner", run: async ({ request }) => ({ users: (await directory.listUsers(request)).map(staffInfo) }) }, {
513
- method: "GET", path: "/members", role: "editor", run: async ({ url: { searchParams: q } }) => {
514
- const limit = Number(q.get("limit") ?? 50);
515
- const cursor = q.get("cursor") || undefined;
516
- const search = q.get("search")?.trim() || undefined;
517
- if (!Number.isInteger(limit) || limit < 1 || limit > 100 || (cursor && !decodeMemberCursor(cursor)) || (search?.length ?? 0) > 200)
518
- throw bad("limit must be 1..100, the cursor one this list returned, and search at most 200 characters");
519
- const r = await directory.listMembers({ limit, ...(search ? { search } : {}), ...(cursor ? { cursor } : {}), cursorDirection: q.get("cursor_direction") === "backward" ? "backward" : "forward" });
520
- return { items: r.items.map(memberInfo), previous_cursor: r.previousCursor, next_cursor: r.nextCursor };
521
- },
522
- });
523
- if (roles)
524
- routes.push({
525
- method: "PATCH", path: "/staff/{id}/role", role: "owner", run: async ({ caller, params: { id }, request }) => {
526
- const { role } = await readJsonObject(request, P);
527
- if (role !== null && !(typeof role === "string" && isStaffRole(role)))
528
- throw bad(`role must be one of ${STAFF_ROLES.join(", ")}, or null to revoke`);
529
- // demoting the only owner would lock everyone out of staff management
530
- if (id === caller.subject)
531
- throw wireError("AUTH_DENIED", "You cannot change your own role.", P);
532
- if (!await roles.setUserRole(request, id, role))
533
- throw wireError("NOT_FOUND", "no user with that id", P);
534
- return { ok: true };
535
- },
536
- }, {
537
- method: "POST", path: "/staff/invitations", role: "owner", run: async ({ caller, request }) => {
538
- const body = await readJsonObject(request, P);
539
- const email = typeof body["email"] === "string" ? body["email"].trim().toLowerCase() : "";
540
- const role = body["role"];
541
- if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email) || !(typeof role === "string" && isStaffRole(role)))
542
- throw bad(`an invitation needs an email and a role in ${STAFF_ROLES.join(", ")}`);
543
- const r = await roles.inviteUser(request, email, role);
544
- if (r.kind === "exists") {
545
- if (r.id === caller.subject)
546
- throw wireError("AUTH_DENIED", "You cannot change your own role.", P);
547
- await roles.setUserRole(request, r.id, role);
548
- }
549
- await roles.sendStaffInvitation?.(email, role);
550
- return { ok: true, userId: r.id, emailSent: roles.sendStaffInvitation !== undefined };
551
- },
552
- }, {
553
- method: "DELETE", path: "/staff/invitations/{id}", role: "owner", run: async ({ params: { id } }) => {
554
- if (!await roles.revokeInvite(id))
555
- throw wireError("CONFLICT", "Only an invitation nobody has signed in to can be revoked; clear an active user's role instead.", P);
556
- return { ok: true };
557
- },
558
- });
559
- const staffOf = (caller) => {
560
- if (caller.kind === "anonymous")
561
- throw wireError("UNAUTHENTICATED", "Sign in to use Admin.", P);
562
- if (caller.kind !== "user" || caller.role === null)
563
- throw wireError("AUTH_DENIED", "This account is not on the staff list.", P);
564
- // Admin acts as the person: a token or key minted for something narrower (an MCP client, a script) is not a sign-in
565
- if (caller.credential !== "session")
566
- throw wireError("AUTH_DENIED", "Admin needs a signed-in session.", P);
567
- return caller;
568
- };
569
- const api = async (request, url, caller) => {
570
- const staff = staffOf(caller);
571
- const prefix = `${base}/api/x/`;
572
- if (url.pathname.startsWith(prefix))
573
- return adminExtensionRoute(extensions, request, url.pathname.slice(prefix.length), staff);
574
- for (const route of routes) {
575
- const params = route.method === request.method ? match(`${base}/api${route.path}`, url.pathname) : null;
576
- if (!params)
577
- continue;
578
- if (!meetsRole(staff.role, route.role))
579
- return denied(route.role, `This needs the ${route.role} role.`);
580
- const out = await route.run({ request, url, caller: staff, params });
581
- return out instanceof Response ? out : json(out, 200, NO_STORE);
582
- }
583
- throw wireError("NOT_FOUND", "no such route", P);
584
- };
585
- // an extension module's Subresource Integrity, which the browser enforces through the shell's import map; Admin computes it for a source
586
- const hasIntegrity = extensions.some((e) => (e.module && e.integrity) || e.source !== undefined);
587
- const integrity = async () => Object.fromEntries(await Promise.all(extensions.flatMap((e) => e.module && e.integrity ? [Promise.resolve([e.module, e.integrity])]
588
- : e.source !== undefined ? [extensionSource(e).then((s) => [extensionSourcePath(base, e.id), s.integrity])] : [])));
589
- // a `source` extension's code, behind the same sign-in checks as the API
590
- const extensionModule = (id, caller) => adminExtensionModule(extensions, id, staffOf(caller));
591
- const shell = async (request, rel) => {
592
- // the path reaches `assets` as the client sent it, so a traversal or an encoded separator stops here
593
- if (request.method !== "GET" || !options.assets || /(^|\/)\.\.(\/|$)|%2f|%5c|\\/i.test(rel))
594
- throw wireError("NOT_FOUND", "no such route", P);
595
- const file = rel.split("/").pop().includes(".") ? await options.assets(rel) : null;
596
- // an unknown path is a client-side route (`/members/a.b@x.test` too), which the shell answers
597
- const res = file ?? (rel.startsWith("assets/") ? null : await options.assets("index.html"));
598
- if (!res)
599
- throw wireError("NOT_FOUND", "no such route", P);
600
- // every HTML page is the shell's but the preview, whatever path reached it (`//index.html`, an encoded name)
601
- const headers = new Headers(res.headers);
602
- headers.set("x-content-type-options", "nosniff");
603
- // a built chunk's name carries its hash, so it never changes; a 304 is then never needed
604
- if (file?.ok && rel.startsWith("assets/"))
605
- headers.set("cache-control", "public, max-age=31536000, immutable");
606
- if (file && (rel === "preview.html" || !/^text\/html\b/i.test(res.headers.get("content-type") ?? "")))
607
- return new Response(res.body, { status: res.status, headers });
608
- // appended, so a policy the asset already carries stays in force
609
- headers.append("content-security-policy", "frame-ancestors 'none'");
610
- headers.set("x-frame-options", "DENY");
611
- headers.set("cache-control", "no-store");
612
- if (hasIntegrity) {
613
- headers.delete("content-length");
614
- return new Response(withModuleIntegrity(await res.text(), await integrity()), { status: res.status, headers });
615
- }
616
- return new Response(res.body, { status: res.status, headers });
617
- };
618
- return async (request, caller) => {
619
- const url = new URL(request.url);
620
- const rel = url.pathname.startsWith(`${base}/`) ? url.pathname.slice(base.length + 1) : url.pathname === base ? "" : null;
621
- const isApi = rel !== null && (rel === "api" || rel.startsWith("api/"));
622
- try {
623
- if (rel === null)
624
- throw wireError("NOT_FOUND", "no such route", P);
625
- const source = rel !== null && request.method === "GET" ? /^extensions\/([a-z][a-z0-9-]{0,62})\.js$/.exec(rel) : null;
626
- if (source)
627
- return await extensionModule(source[1], caller);
628
- return isApi ? await api(request, url, caller) : await shell(request, rel);
629
- }
630
- catch (e) {
631
- return failure(e, P, isApi ? NO_STORE : undefined);
632
- }
633
- };
634
- }
635
- //# sourceMappingURL=createAdminSurface.js.map