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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (495) hide show
  1. package/README.md +166 -298
  2. package/dist/auth/adapter.d.ts +32 -0
  3. package/dist/auth/adapter.js +288 -0
  4. package/dist/auth/admin.d.ts +3 -0
  5. package/dist/auth/admin.js +21 -0
  6. package/dist/auth/caller.d.ts +86 -0
  7. package/dist/auth/caller.js +155 -0
  8. package/dist/auth/hardening.d.ts +24 -0
  9. package/dist/auth/hardening.js +40 -0
  10. package/dist/auth/identity.d.ts +121 -0
  11. package/dist/auth/identity.js +203 -0
  12. package/dist/auth/oauth.d.ts +63 -0
  13. package/dist/auth/oauth.js +217 -0
  14. package/dist/auth/resource-seeds.js +10 -0
  15. package/dist/auth/routes.d.ts +32 -0
  16. package/dist/auth/routes.js +226 -0
  17. package/dist/build/compiler.d.ts +721 -0
  18. package/dist/build/compiler.js +7029 -0
  19. package/dist/build/spec/domain/model/ManifestGrammar.d.ts +439 -0
  20. package/dist/build/spec/domain/model/RuntimePlan.d.ts +168 -0
  21. package/dist/build/spec/domain/model/SqlIr.d.ts +129 -0
  22. package/dist/build/spec/domain/model/UserFields.d.ts +21 -0
  23. package/dist/build/spec/domain/service/PlanFingerprint.d.ts +7 -0
  24. package/dist/build/spec/kernel/diagnostic.d.ts +108 -0
  25. package/dist/bun/assets.d.ts +2 -0
  26. package/dist/bun/assets.js +24 -0
  27. package/dist/domain/adminOrder.js +24 -0
  28. package/dist/domain/columns.js +57 -0
  29. package/dist/domain/describe/chunk-ZVXBGP7Y.js +424 -0
  30. package/dist/domain/describe/index.d.ts +58 -0
  31. package/dist/domain/describe/index.js +115 -0
  32. package/dist/domain/describe/target-hash.d.ts +8 -0
  33. package/dist/domain/describe/target-hash.js +12 -0
  34. package/dist/domain/describe/targets.d.ts +40 -0
  35. package/dist/domain/entry.js +33 -0
  36. package/dist/domain/generated-tools.js +19 -0
  37. package/dist/domain/generation.d.ts +16 -0
  38. package/dist/domain/generation.js +1 -0
  39. package/dist/domain/input.js +17 -0
  40. package/dist/domain/model.js +1 -0
  41. package/dist/domain/paging.js +230 -0
  42. package/dist/domain/recipes.js +24 -0
  43. package/dist/domain/userReferences.js +5 -0
  44. package/dist/domain/wireScalars.js +47 -0
  45. package/dist/infrastructure/adminEntries.js +153 -0
  46. package/dist/infrastructure/adminPaging.js +72 -0
  47. package/dist/infrastructure/artifacts.js +71 -0
  48. package/dist/infrastructure/authSchema.js +83 -0
  49. package/dist/infrastructure/bundle.js +188 -0
  50. package/dist/infrastructure/cli.js +118 -0
  51. package/dist/infrastructure/generate.d.ts +12 -0
  52. package/dist/infrastructure/generate.js +189 -0
  53. package/dist/infrastructure/generateAuth.d.ts +8 -0
  54. package/dist/infrastructure/generateAuth.js +74 -0
  55. package/dist/infrastructure/help.js +60 -0
  56. package/dist/infrastructure/init.js +54 -0
  57. package/dist/infrastructure/inputs.js +41 -0
  58. package/dist/infrastructure/mounts.js +25 -0
  59. package/dist/infrastructure/wrangler.js +109 -0
  60. package/dist/kernel/authorization.d.ts +4 -0
  61. package/dist/kernel/authorization.js +16 -0
  62. package/dist/kernel/binds.d.ts +60 -0
  63. package/dist/kernel/binds.js +49 -0
  64. package/dist/kernel/caller-identity.d.ts +24 -0
  65. package/dist/kernel/caller-identity.js +22 -0
  66. package/dist/kernel/contract-error.d.ts +12 -0
  67. package/dist/kernel/contract-error.js +14 -0
  68. package/dist/kernel/contracts.d.ts +143 -0
  69. package/dist/kernel/contracts.js +97 -0
  70. package/dist/kernel/cron.d.ts +1 -0
  71. package/dist/kernel/cron.js +58 -0
  72. package/dist/kernel/dialect/common.d.ts +38 -0
  73. package/dist/kernel/dialect/common.js +6 -0
  74. package/dist/kernel/dialect/postgres.d.ts +16 -0
  75. package/dist/kernel/dialect/postgres.js +18 -0
  76. package/dist/kernel/dialect/sqlite.d.ts +20 -0
  77. package/dist/kernel/dialect/sqlite.js +34 -0
  78. package/dist/kernel/drain.d.ts +5 -0
  79. package/dist/kernel/drain.js +35 -0
  80. package/dist/kernel/driver/bun-sqlite.d.ts +19 -0
  81. package/dist/kernel/driver/bun-sqlite.js +77 -0
  82. package/dist/kernel/driver/d1.d.ts +24 -0
  83. package/dist/kernel/driver/d1.js +22 -0
  84. package/dist/kernel/driver/postgres.d.ts +25 -0
  85. package/dist/kernel/driver/postgres.js +99 -0
  86. package/dist/kernel/driver/transaction-context.d.ts +10 -0
  87. package/dist/kernel/driver/transaction-context.js +29 -0
  88. package/dist/kernel/email.d.ts +28 -0
  89. package/dist/kernel/email.js +38 -0
  90. package/dist/kernel/host-access.d.ts +10 -0
  91. package/dist/kernel/host-access.js +65 -0
  92. package/dist/kernel/host-caller.d.ts +39 -0
  93. package/dist/kernel/host-caller.js +56 -0
  94. package/dist/kernel/json-body.d.ts +4 -0
  95. package/dist/kernel/json-body.js +44 -0
  96. package/dist/kernel/mcp-apps.d.ts +69 -0
  97. package/dist/kernel/mcp-apps.js +40 -0
  98. package/dist/kernel/mcp-call.d.ts +5 -0
  99. package/dist/kernel/mcp-call.js +25 -0
  100. package/dist/kernel/mcp-handler.js +371 -0
  101. package/dist/kernel/mcp.d.ts +110 -0
  102. package/dist/kernel/mcp.js +50 -0
  103. package/dist/kernel/media.d.ts +27 -0
  104. package/dist/kernel/media.js +216 -0
  105. package/dist/kernel/paging.d.ts +55 -0
  106. package/dist/kernel/paging.js +95 -0
  107. package/dist/kernel/publishing.d.ts +4 -0
  108. package/dist/kernel/publishing.js +16 -0
  109. package/dist/kernel/r2-media.d.ts +42 -0
  110. package/dist/kernel/r2-media.js +78 -0
  111. package/dist/kernel/rest-dispatch.js +38 -0
  112. package/dist/kernel/rest-router.js +64 -0
  113. package/dist/kernel/rest.d.ts +58 -0
  114. package/dist/kernel/rest.js +41 -0
  115. package/dist/kernel/scalars.d.ts +6 -0
  116. package/dist/kernel/scalars.js +44 -0
  117. package/dist/kernel/search.js +5 -0
  118. package/dist/kernel/site-types.d.ts +146 -0
  119. package/dist/kernel/site-types.js +1 -0
  120. package/dist/kernel/site.d.ts +39 -0
  121. package/dist/kernel/site.js +32 -0
  122. package/dist/kernel/store.d.ts +175 -0
  123. package/dist/kernel/store.js +269 -0
  124. package/dist/kernel/surface.d.ts +10 -0
  125. package/dist/kernel/surface.js +19 -0
  126. package/dist/kernel/sweep.d.ts +17 -0
  127. package/dist/kernel/sweep.js +27 -0
  128. package/dist/kernel/translations.d.ts +1 -0
  129. package/dist/kernel/translations.js +13 -0
  130. package/dist/kernel/user-caller.d.ts +31 -0
  131. package/dist/kernel/user-caller.js +67 -0
  132. package/dist/kernel/user-field-name.js +3 -0
  133. package/dist/kernel/user-fields.d.ts +35 -0
  134. package/dist/kernel/user-fields.js +81 -0
  135. package/dist/kernel/validation.d.ts +15 -0
  136. package/dist/kernel/validation.js +54 -0
  137. package/dist/kernel/web-gateway.js +68 -0
  138. package/dist/kernel/web-head.js +15 -0
  139. package/dist/kernel/web-index.js +40 -0
  140. package/dist/kernel/web-response.js +8 -0
  141. package/dist/kernel/web.d.ts +77 -0
  142. package/dist/kernel/web.js +124 -0
  143. package/dist/kernel/where.js +27 -0
  144. package/dist/testing/index.d.ts +1 -0
  145. package/dist/testing/index.js +1 -0
  146. package/dist/usecase/adminBindings.js +143 -0
  147. package/dist/usecase/adminClient.js +87 -0
  148. package/dist/usecase/adminDescriptors.js +107 -0
  149. package/dist/usecase/generate.js +166 -0
  150. package/dist/usecase/handlers.js +21 -0
  151. package/dist/usecase/mcp-media.js +17 -0
  152. package/dist/usecase/mcp.js +100 -0
  153. package/dist/usecase/paging.js +71 -0
  154. package/dist/usecase/publishing.js +63 -0
  155. package/dist/usecase/refusals.js +27 -0
  156. package/dist/usecase/rest.js +54 -0
  157. package/dist/usecase/search.js +7 -0
  158. package/dist/usecase/site.js +39 -0
  159. package/dist/usecase/stores.js +64 -0
  160. package/dist/usecase/tool-version.js +9 -0
  161. package/dist/usecase/translations.js +78 -0
  162. package/dist/usecase/ttl.js +20 -0
  163. package/dist/usecase/validation.js +241 -0
  164. package/dist/usecase/web.js +23 -0
  165. package/docs/examples/README.md +39 -18
  166. package/docs/examples/app-shell/.dev.vars.example +4 -0
  167. package/docs/examples/app-shell/README.md +121 -0
  168. package/docs/examples/app-shell/accept.mjs +91 -0
  169. package/docs/examples/app-shell/gitignore +7 -0
  170. package/docs/examples/app-shell/package.json +43 -0
  171. package/docs/examples/app-shell/pnpm-workspace.yaml +8 -0
  172. package/docs/examples/app-shell/smoke-kit.mjs +168 -0
  173. package/docs/examples/app-shell/src/auth.ts +58 -0
  174. package/docs/examples/app-shell/src/handlers.ts +5 -0
  175. package/docs/examples/app-shell/src/index.ts +4 -0
  176. package/docs/examples/app-shell/src/routes.ts +14 -0
  177. package/docs/examples/app-shell/src/schedule.ts +8 -0
  178. package/docs/examples/app-shell/src/service.ts +70 -0
  179. package/docs/examples/app-shell/src/sign-in.ts +41 -0
  180. package/docs/examples/app-shell/src/signup.ts +8 -0
  181. package/docs/examples/app-shell/tsconfig.json +26 -0
  182. package/docs/examples/app-shell/worker-configuration.d.ts +22 -0
  183. package/docs/examples/app-shell/wrangler.jsonc +62 -0
  184. package/docs/examples/club-events/README.md +65 -0
  185. package/docs/examples/club-events/manifests/club-events.yaml +247 -0
  186. package/docs/examples/club-events/smoke.mjs +127 -0
  187. package/docs/examples/club-events/src/handlers.ts +25 -0
  188. package/docs/examples/club-events/src/signup.ts +9 -0
  189. package/docs/examples/generated-web/README.md +78 -0
  190. package/docs/examples/generated-web/posts.yaml +38 -0
  191. package/docs/examples/generated-web/seed.sql +6 -0
  192. package/docs/examples/generated-web/src/worker.ts +43 -0
  193. package/docs/examples/generated-web/tsconfig.json +8 -0
  194. package/docs/examples/generated-web/wrangler.jsonc +8 -0
  195. package/docs/examples/purchasing/.dev.vars.example +6 -0
  196. package/docs/examples/purchasing/README.md +99 -0
  197. package/docs/examples/purchasing/manifests/purchasing.yaml +374 -0
  198. package/docs/examples/purchasing/seed.sql +4 -0
  199. package/docs/examples/purchasing/smoke.mjs +191 -0
  200. package/docs/examples/purchasing/src/admin.tsx +13 -0
  201. package/docs/examples/purchasing/src/handlers.ts +33 -0
  202. package/docs/examples/purchasing/src/notify.ts +29 -0
  203. package/docs/examples/purchasing/src/requests-page.ts +57 -0
  204. package/docs/examples/purchasing/src/routes.ts +53 -0
  205. package/docs/examples/purchasing/src/schedule.ts +31 -0
  206. package/docs/examples/purchasing/src/signup.ts +5 -0
  207. package/docs/examples/purchasing/src/supplier.ts +32 -0
  208. package/docs/examples/purchasing/wrangler.jsonc +69 -0
  209. package/docs/examples/recipes/README.md +60 -0
  210. package/docs/examples/recipes/manifests/recipes.yaml +75 -0
  211. package/docs/examples/recipes/smoke.mjs +102 -0
  212. package/docs/examples/recipes/src/media.ts +13 -0
  213. package/docs/examples/recipes/src/pages.ts +99 -0
  214. package/docs/examples/recipes/src/routes.ts +71 -0
  215. package/docs/examples/recipes/src/site-config.ts +12 -0
  216. package/docs/examples/recipes/wrangler.jsonc +74 -0
  217. package/docs/handbook/cloudflare/authentication.md +180 -322
  218. package/docs/handbook/cloudflare/chatgpt-sites.md +5 -23
  219. package/docs/handbook/cloudflare/deploy-and-operate.md +55 -77
  220. package/docs/handbook/cloudflare/media-r2.md +61 -205
  221. package/docs/handbook/cloudflare/service-entry.md +239 -0
  222. package/docs/handbook/concepts/authorization.md +10 -107
  223. package/docs/handbook/concepts/four-atoms.md +9 -168
  224. package/docs/handbook/concepts/lifecycle-and-locales.md +9 -132
  225. package/docs/handbook/concepts/mcp-and-agents.md +24 -121
  226. package/docs/handbook/concepts/procedures-and-triggers.md +5 -217
  227. package/docs/handbook/concepts/runtime-and-adapters.md +15 -169
  228. package/docs/handbook/concepts/views.md +10 -185
  229. package/docs/handbook/examples/hub.md +3 -8
  230. package/docs/handbook/guides/adapter-guide.md +11 -0
  231. package/docs/handbook/guides/admin-ui.md +115 -133
  232. package/docs/handbook/guides/agent-setup.md +64 -74
  233. package/docs/handbook/guides/agent-workflow-acceptance.md +232 -0
  234. package/docs/handbook/guides/email.md +86 -0
  235. package/docs/handbook/guides/local-testing.md +40 -0
  236. package/docs/handbook/guides/mcp-apps.md +560 -0
  237. package/docs/handbook/guides/native-admin.md +566 -0
  238. package/docs/handbook/guides/native-execution.md +133 -0
  239. package/docs/handbook/guides/oauth.md +219 -0
  240. package/docs/handbook/guides/postgres-adapters.md +56 -0
  241. package/docs/handbook/guides/public-pages.md +87 -0
  242. package/docs/handbook/guides/size-and-startup.md +9 -0
  243. package/docs/handbook/guides/sql-patterns.md +266 -0
  244. package/docs/handbook/guides/typed-queries.md +211 -107
  245. package/docs/handbook/navigation.json +176 -55
  246. package/docs/handbook/reference/admin-descriptors.md +53 -0
  247. package/docs/handbook/reference/authorization.md +39 -266
  248. package/docs/handbook/reference/describe.md +56 -0
  249. package/docs/handbook/reference/diagnostics.md +19 -186
  250. package/docs/handbook/reference/features.md +45 -55
  251. package/docs/handbook/reference/manifest.md +6 -129
  252. package/docs/handbook/reference/procedure.md +11 -303
  253. package/docs/handbook/reference/schema.md +64 -240
  254. package/docs/handbook/reference/site-config.md +5 -218
  255. package/docs/handbook/reference/sql.md +64 -0
  256. package/docs/handbook/reference/surface.md +392 -201
  257. package/docs/handbook/reference/trigger.md +56 -192
  258. package/docs/handbook/reference/view.md +24 -243
  259. package/docs/handbook/releases/index.md +244 -77
  260. package/docs/handbook/start/agents.md +45 -0
  261. package/docs/handbook/start/overview.md +9 -48
  262. package/docs/handbook/start/project-and-cli.md +51 -104
  263. package/docs/handbook/start/quickstart-worker.md +43 -178
  264. package/docs/skills/develop/SKILL.md +79 -249
  265. package/docs/skills/integrate/SKILL.md +39 -50
  266. package/docs/skills/media-gc/SKILL.md +34 -10
  267. package/docs/skills/provision/SKILL.md +36 -186
  268. package/docs/skills/update/SKILL.md +23 -38
  269. package/docs/source/scripts/postgres-adapter.ts +101 -0
  270. package/docs/upgrade-0.1-to-0.2.md +227 -0
  271. package/package.json +120 -131
  272. package/skills/README.md +48 -108
  273. package/skills/mantle/SKILL.md +76 -0
  274. package/dist/admin-ui.d.ts +0 -2
  275. package/dist/admin-ui.d.ts.map +0 -1
  276. package/dist/admin-ui.js +0 -2
  277. package/dist/admin-ui.js.map +0 -1
  278. package/dist/admin.d.ts +0 -2
  279. package/dist/admin.d.ts.map +0 -1
  280. package/dist/admin.js +0 -2
  281. package/dist/admin.js.map +0 -1
  282. package/dist/auth.d.ts +0 -2
  283. package/dist/auth.d.ts.map +0 -1
  284. package/dist/auth.js +0 -2
  285. package/dist/auth.js.map +0 -1
  286. package/dist/bun.d.ts +0 -2
  287. package/dist/bun.d.ts.map +0 -1
  288. package/dist/bun.js +0 -2
  289. package/dist/bun.js.map +0 -1
  290. package/dist/cli/generate-cloudflare.d.ts +0 -7
  291. package/dist/cli/generate-cloudflare.d.ts.map +0 -1
  292. package/dist/cli/generate-cloudflare.js +0 -123
  293. package/dist/cli/generate-cloudflare.js.map +0 -1
  294. package/dist/cli/generate-project.d.ts +0 -25
  295. package/dist/cli/generate-project.d.ts.map +0 -1
  296. package/dist/cli/generate-project.js +0 -282
  297. package/dist/cli/generate-project.js.map +0 -1
  298. package/dist/cli/generate-sites.d.ts +0 -8
  299. package/dist/cli/generate-sites.d.ts.map +0 -1
  300. package/dist/cli/generate-sites.js +0 -273
  301. package/dist/cli/generate-sites.js.map +0 -1
  302. package/dist/cli/generate.d.ts +0 -20
  303. package/dist/cli/generate.d.ts.map +0 -1
  304. package/dist/cli/generate.js +0 -299
  305. package/dist/cli/generate.js.map +0 -1
  306. package/dist/cli/harness.d.ts +0 -3
  307. package/dist/cli/harness.d.ts.map +0 -1
  308. package/dist/cli/harness.js +0 -214
  309. package/dist/cli/harness.js.map +0 -1
  310. package/dist/cli/main.d.ts +0 -3
  311. package/dist/cli/main.d.ts.map +0 -1
  312. package/dist/cli/main.js +0 -77
  313. package/dist/cli/main.js.map +0 -1
  314. package/dist/cli/skills.d.ts +0 -3
  315. package/dist/cli/skills.d.ts.map +0 -1
  316. package/dist/cli/skills.js +0 -128
  317. package/dist/cli/skills.js.map +0 -1
  318. package/dist/cloudflare.d.ts +0 -2
  319. package/dist/cloudflare.d.ts.map +0 -1
  320. package/dist/cloudflare.js +0 -2
  321. package/dist/cloudflare.js.map +0 -1
  322. package/dist/codegen/emitMantleModule.d.ts +0 -22
  323. package/dist/codegen/emitMantleModule.d.ts.map +0 -1
  324. package/dist/codegen/emitMantleModule.js +0 -291
  325. package/dist/codegen/emitMantleModule.js.map +0 -1
  326. package/dist/codegen.d.ts +0 -2
  327. package/dist/codegen.d.ts.map +0 -1
  328. package/dist/codegen.js +0 -2
  329. package/dist/codegen.js.map +0 -1
  330. package/dist/runtime-testing.d.ts +0 -2
  331. package/dist/runtime-testing.d.ts.map +0 -1
  332. package/dist/runtime-testing.js +0 -2
  333. package/dist/runtime-testing.js.map +0 -1
  334. package/dist/runtime.d.ts +0 -2
  335. package/dist/runtime.d.ts.map +0 -1
  336. package/dist/runtime.js +0 -2
  337. package/dist/runtime.js.map +0 -1
  338. package/dist/spec.d.ts +0 -2
  339. package/dist/spec.d.ts.map +0 -1
  340. package/dist/spec.js +0 -2
  341. package/dist/spec.js.map +0 -1
  342. package/dist/vercel-libsql.d.ts +0 -2
  343. package/dist/vercel-libsql.d.ts.map +0 -1
  344. package/dist/vercel-libsql.js +0 -2
  345. package/dist/vercel-libsql.js.map +0 -1
  346. package/dist/vercel.d.ts +0 -2
  347. package/dist/vercel.d.ts.map +0 -1
  348. package/dist/vercel.js +0 -2
  349. package/dist/vercel.js.map +0 -1
  350. package/dist/web.d.ts +0 -2
  351. package/dist/web.d.ts.map +0 -1
  352. package/dist/web.js +0 -2
  353. package/dist/web.js.map +0 -1
  354. package/docs/adapter-guide.md +0 -222
  355. package/docs/adr/0001-four-atom-manifest-model.md +0 -440
  356. package/docs/adr/0002-closed-enums-for-bindings.md +0 -253
  357. package/docs/adr/0007-ai-as-primary-author.md +0 -473
  358. package/docs/adr/0008-structured-diagnostic-shape.md +0 -338
  359. package/docs/adr/0009-consumer-supplied-manifests.md +0 -149
  360. package/docs/adr/0010-locale-and-translates.md +0 -453
  361. package/docs/adr/0011-adapter-port-spec.md +0 -281
  362. package/docs/adr/0012-views-as-public-rest.md +0 -161
  363. package/docs/adr/0013-agent-provisioned-consumer-projects.md +0 -154
  364. package/docs/adr/0014-auth-better-auth-and-multi-tenant-mcp.md +0 -900
  365. package/docs/adr/0016-site-semantic-layer.md +0 -70
  366. package/docs/adr/0017-media-multi-variant-agent-side-optimization.md +0 -181
  367. package/docs/adr/0018-core-starters-repository-boundary.md +0 -179
  368. package/docs/adr/0019-sealed-manifest-runtime-pipeline.md +0 -240
  369. package/docs/adr/0020-builtin-handler-contracts-and-matched-upsert.md +0 -199
  370. package/docs/adr/0021-retire-starter-scaffolding.md +0 -30
  371. package/docs/adr/0022-caller-observed-version-occ.md +0 -212
  372. package/docs/adr/0023-port-failure-contract.md +0 -69
  373. package/docs/adr/0024-manifest-native-schema-tables.md +0 -264
  374. package/docs/adr/0025-reserved-native-columns-and-published-only-public-views.md +0 -105
  375. package/docs/adr/0026-progressive-generate.md +0 -36
  376. package/docs/adr/0027-scheduled-procedure-triggers.md +0 -31
  377. package/docs/adr/0028-schema-ttl-expiry.md +0 -33
  378. package/docs/adr/README.md +0 -81
  379. package/docs/adr/adr-lite-803-request-diagnostics.md +0 -38
  380. package/docs/adr/adr-lite-808-route-readiness.md +0 -47
  381. package/docs/adr/adr-lite-809-bounded-public-content.md +0 -71
  382. package/docs/adr/adr-lite-812-native-parity.md +0 -150
  383. package/docs/adr/adr-lite-823-home-statistics.md +0 -64
  384. package/docs/adr/adr-lite-842-mcp-authoring.md +0 -30
  385. package/docs/adr/adr-lite-845-frontend-client.md +0 -38
  386. package/docs/adr/adr-lite-861-admin-webmcp.md +0 -42
  387. package/docs/adr/adr-lite-909-admin-ui-kit.md +0 -37
  388. package/docs/agent-prompts.md +0 -64
  389. package/docs/api-mcp-authorization.md +0 -5
  390. package/docs/assets/mantle-admin-developer.png +0 -0
  391. package/docs/assets/mantle-admin-operations.png +0 -0
  392. package/docs/assets/mantle-hero.jpg +0 -0
  393. package/docs/auth-hosting-model.md +0 -166
  394. package/docs/cloudflare-low-level-composition.md +0 -5
  395. package/docs/consumer-onboarding-audit.md +0 -65
  396. package/docs/deferred-lifecycle-queues.md +0 -5
  397. package/docs/design-atoms.md +0 -16
  398. package/docs/design-references/editorial-blog-2026-05-05.md +0 -218
  399. package/docs/direct-authoring.md +0 -5
  400. package/docs/examples/builtin-commerce.md +0 -269
  401. package/docs/examples/builtin-intake.md +0 -143
  402. package/docs/examples/builtin-legal-documents.md +0 -189
  403. package/docs/examples/builtin-procurement.md +0 -241
  404. package/docs/examples/builtin-publication.md +0 -241
  405. package/docs/examples/builtin-reservation.md +0 -149
  406. package/docs/examples/cf-primitives-commerce-inventory.md +0 -809
  407. package/docs/examples/cf-primitives-guarded-api.md +0 -429
  408. package/docs/examples/cf-primitives-intake-hooks.md +0 -319
  409. package/docs/examples/host-chatgpt-sites/.openai/hosting.json +0 -1
  410. package/docs/examples/host-chatgpt-sites/README.md +0 -70
  411. package/docs/examples/host-chatgpt-sites/drizzle/0000_sites_users.sql +0 -8
  412. package/docs/examples/host-chatgpt-sites/drizzle/0001_mantle.sql +0 -294
  413. package/docs/examples/host-chatgpt-sites/drizzle/0002_article_cover.sql +0 -5
  414. package/docs/examples/host-chatgpt-sites/drizzle/0003_store_instance_id.sql +0 -1
  415. package/docs/examples/host-chatgpt-sites/drizzle/0004_mantle.sql +0 -10
  416. package/docs/examples/host-chatgpt-sites/drizzle/0005_mantle.sql +0 -24
  417. package/docs/examples/host-chatgpt-sites/drizzle/meta/_journal.json +0 -1
  418. package/docs/examples/host-chatgpt-sites/drizzle/meta/mantle-state.json +0 -60
  419. package/docs/examples/host-chatgpt-sites/manifests/site.yaml +0 -27
  420. package/docs/examples/host-chatgpt-sites/package.json +0 -1
  421. package/docs/examples/host-chatgpt-sites/public/site.css +0 -1
  422. package/docs/examples/host-chatgpt-sites/scripts/build.mjs +0 -13
  423. package/docs/examples/host-chatgpt-sites/scripts/check.mjs +0 -101
  424. package/docs/examples/host-chatgpt-sites/scripts/migration.mjs +0 -43
  425. package/docs/examples/host-chatgpt-sites/src/chatgpt-auth.ts +0 -66
  426. package/docs/examples/host-chatgpt-sites/src/index.ts +0 -46
  427. package/docs/examples/host-chatgpt-sites/src/mcp.ts +0 -49
  428. package/docs/examples/host-chatgpt-sites/src/media.ts +0 -109
  429. package/docs/examples/host-chatgpt-sites/src/r2-lab.ts +0 -38
  430. package/docs/examples/host-chatgpt-sites/src/storage-fingerprint.json +0 -1
  431. package/docs/examples/host-chatgpt-sites/src/web.ts +0 -35
  432. package/docs/examples/host-chatgpt-sites/tsconfig.json +0 -1
  433. package/docs/examples/host-chatgpt-sites/wrangler.jsonc +0 -10
  434. package/docs/examples/host-local-admin-otp/.dev.vars.example +0 -3
  435. package/docs/examples/host-local-admin-otp/README.md +0 -80
  436. package/docs/examples/host-local-admin-otp/ensure-dev-vars.mjs +0 -5
  437. package/docs/examples/host-local-admin-otp/manifests/site.yaml +0 -25
  438. package/docs/examples/host-local-admin-otp/package.json +0 -29
  439. package/docs/examples/host-local-admin-otp/public/.gitkeep +0 -1
  440. package/docs/examples/host-local-admin-otp/smoke.mjs +0 -141
  441. package/docs/examples/host-local-admin-otp/src/index.ts +0 -54
  442. package/docs/examples/host-local-admin-otp/tsconfig.json +0 -17
  443. package/docs/examples/host-local-admin-otp/wrangler.jsonc +0 -23
  444. package/docs/examples/host-minimal-worker/README.md +0 -41
  445. package/docs/examples/host-minimal-worker/manifests/site.yaml +0 -25
  446. package/docs/examples/host-minimal-worker/package.json +0 -26
  447. package/docs/examples/host-minimal-worker/smoke.mjs +0 -23
  448. package/docs/examples/host-minimal-worker/src/index.ts +0 -4
  449. package/docs/examples/host-minimal-worker/tsconfig.json +0 -17
  450. package/docs/examples/host-minimal-worker/wrangler.jsonc +0 -22
  451. package/docs/handbook/chatgpt-sites/equipment-checkout.md +0 -231
  452. package/docs/handbook/chatgpt-sites/generated-app.md +0 -84
  453. package/docs/handbook/chatgpt-sites/host-reference.md +0 -113
  454. package/docs/handbook/chatgpt-sites/index.md +0 -133
  455. package/docs/handbook/cloudflare/bindings.md +0 -291
  456. package/docs/handbook/cloudflare/conventional-worker.md +0 -166
  457. package/docs/handbook/cloudflare/deferred-hooks-queues.md +0 -170
  458. package/docs/handbook/cloudflare/low-level-composition.md +0 -169
  459. package/docs/handbook/cloudflare/public-web.md +0 -144
  460. package/docs/handbook/cloudflare/site-chrome.md +0 -75
  461. package/docs/handbook/examples/commerce-transaction.md +0 -11
  462. package/docs/handbook/examples/commerce.md +0 -11
  463. package/docs/handbook/examples/guarded-api.md +0 -10
  464. package/docs/handbook/examples/intake-form.md +0 -12
  465. package/docs/handbook/examples/intake-hooks.md +0 -11
  466. package/docs/handbook/examples/legal-documents.md +0 -10
  467. package/docs/handbook/examples/procurement-approvals.md +0 -10
  468. package/docs/handbook/examples/publication.md +0 -10
  469. package/docs/handbook/examples/reservation.md +0 -10
  470. package/docs/handbook/start/quickstart-admin.md +0 -52
  471. package/docs/labels.md +0 -71
  472. package/docs/media-uploads.md +0 -5
  473. package/docs/migration-0.1.2.md +0 -13
  474. package/docs/performance-harness.md +0 -228
  475. package/docs/release-process.md +0 -244
  476. package/docs/schema-indexes.md +0 -5
  477. package/docs/sealed-pipeline-ownership.md +0 -101
  478. package/docs/skills/plugin/SKILL.md +0 -132
  479. package/docs/skills/theme/SKILL.md +0 -77
  480. package/docs/spec-only-host-adoption.md +0 -157
  481. package/docs/transaction-patterns.md +0 -5
  482. package/skills/develop/SKILL.md +0 -258
  483. package/skills/install/SKILL.md +0 -112
  484. package/skills/integrate/SKILL.md +0 -60
  485. package/skills/media-gc/SKILL.md +0 -85
  486. package/skills/plugin/SKILL.md +0 -132
  487. package/skills/provision/SKILL.md +0 -194
  488. package/skills/theme/SKILL.md +0 -77
  489. package/skills/update/SKILL.md +0 -51
  490. package/templates/chatgpt-sites/auth.ts +0 -66
  491. package/templates/chatgpt-sites/build.mjs +0 -14
  492. package/templates/chatgpt-sites/env.ts +0 -1
  493. package/templates/chatgpt-sites/mcp.ts +0 -48
  494. package/templates/chatgpt-sites/public-mcp.ts +0 -29
  495. package/templates/chatgpt-sites/smoke-local.mjs +0 -20
@@ -1,273 +0,0 @@
1
- import { execFileSync } from "node:child_process";
2
- import { access, readFile, readdir, mkdir, writeFile, appendFile } from "node:fs/promises";
3
- import { basename, dirname, join, relative, resolve, sep } from "node:path";
4
- import { buildSqliteMigrationArtifact, fieldColumn, quoteIdent, renderSqliteManagedMigration } from "@aotter/mantle-runtime";
5
- import { assertInsideProject } from "./generate-project.js";
6
- export async function prepareSites(root, output, selection, schemas, check, reviewUniqueIndexes = false) {
7
- const has = (feature) => selection.features.includes(feature);
8
- const name = basename(root).toLowerCase().replace(/[^a-z0-9-]/g, "-").replace(/^-+|-+$/g, "").slice(0, 63).replace(/-+$/, "") || "mantle-site";
9
- const worker = resolve(root, output, "worker.ts");
10
- const indexImport = importPath(join(root, "src/index.ts"), worker);
11
- const files = [
12
- { path: worker, content: workerSource(root, worker, selection), owned: true },
13
- { path: "src/index.ts", content: `export { default } from "${indexImport}";\n` },
14
- { path: "src/handlers.ts", content: 'import type { AnyHandler } from "@aotter/mantle/runtime";\n\nexport const handlers: Record<string, AnyHandler> = {};\n' },
15
- { path: "scripts/build.mjs", content: await template("build.mjs") },
16
- { path: "tsconfig.json", content: `${JSON.stringify({ compilerOptions: {
17
- target: "ES2022", module: "ESNext", moduleResolution: "Bundler", strict: true, skipLibCheck: true,
18
- noEmit: true, types: ["@cloudflare/workers-types"], lib: ["ES2022", "DOM"],
19
- }, include: ["src/**/*.ts", `${relative(root, resolve(root, output)).split(sep).join("/") || "."}/**/*.ts`] }, null, 2)}\n` },
20
- { path: ".dev.vars.example", content: "# Local simulation only. Configure the real owner and origin through Sites before publishing.\nOWNER_EMAIL=you@example.com\nPUBLIC_ORIGIN=http://127.0.0.1:4174\n" },
21
- ];
22
- if (has("web"))
23
- files.push({ path: "src/home.ts", content: 'export function home(): Response {\n return new Response(`<!doctype html><html lang="en"><meta charset="utf-8"><title>Mantle</title><body><main></main></body></html>`, { headers: { "content-type": "text/html; charset=utf-8" } });\n}\n' });
24
- if (has("admin")) {
25
- files.push({ path: "src/sites-auth.ts", content: await template("auth.ts") });
26
- files.push({ path: "src/sites-mcp.ts", content: await template("mcp.ts") });
27
- files.push({ path: "scripts/smoke-local.mjs", content: await template("smoke-local.mjs") });
28
- }
29
- else if (has("mcp")) {
30
- files.push({ path: "src/sites-env.ts", content: await template("env.ts") });
31
- files.push({ path: "src/sites-mcp.ts", content: await template("public-mcp.ts") });
32
- }
33
- const wrangler = await Promise.all(["wrangler.jsonc", "wrangler.json", "wrangler.toml"].map(async (path) => ({ path, content: await optional(join(root, path)) })));
34
- const existingWrangler = wrangler.filter(file => file.content !== null);
35
- if (existingWrangler.length > 1)
36
- throw new Error(`Multiple Wrangler configs found: ${existingWrangler.map(file => file.path).join(", ")}.`);
37
- let dbName = name;
38
- if (existingWrangler.length) {
39
- const config = existingWrangler[0];
40
- await assertInsideProject(root, join(root, config.path));
41
- const configuredName = config.content.match(/\bdatabase_name["']?\s*[:=]\s*["']([^"']+)["']/)?.[1];
42
- if (!configuredName || !/\bmigrations_dir["']?\s*[:=]\s*["']drizzle["']/.test(config.content)) {
43
- throw new Error(`Existing ${config.path} must name its D1 database and use migrations_dir=drizzle.`);
44
- }
45
- if (has("admin") && (!/(?:^|[{,])\s*["']?workers_dev["']?\s*[:=]\s*false\b/m.test(config.content) ||
46
- /(?:^|[{,])\s*["']?routes?["']?\s*[:=]|^\s*\[\[?routes?\]\]?/m.test(config.content))) {
47
- throw new Error(`Existing ${config.path} must set workers_dev=false and have no direct Worker route before Sites identity can be trusted.`);
48
- }
49
- dbName = configuredName;
50
- }
51
- else {
52
- files.push({ path: "wrangler.jsonc", content: `${JSON.stringify({
53
- name, main: "dist/server/index.js", compatibility_date: "2026-09-08", workers_dev: false,
54
- compatibility_flags: ["nodejs_compat", "global_fetch_strictly_public"],
55
- ...(has("admin") ? { assets: { directory: "dist/client", binding: "ASSETS", run_worker_first: true } } : {}),
56
- d1_databases: [{ binding: "DB", database_name: name, database_id: "local", migrations_dir: "drizzle" }],
57
- }, null, 2)}\n` });
58
- }
59
- const hosting = await optional(join(root, ".openai/hosting.json"));
60
- await assertInsideProject(root, join(root, ".openai/hosting.json"));
61
- if (hosting !== null) {
62
- if (JSON.parse(hosting).d1 !== "DB")
63
- throw new Error("Existing Sites hosting.json must bind D1 as DB; project metadata is preserved.");
64
- }
65
- else
66
- files.push({ path: ".openai/hosting.json", content: '{"d1":"DB"}\n' });
67
- const writes = [];
68
- for (const file of files) {
69
- const path = resolve(root, file.path);
70
- await assertInsideProject(root, path);
71
- const current = await optional(path);
72
- if (current !== null && file.owned && !current.startsWith("// Generated by `mantle generate`")) {
73
- throw new Error(`Generated output would replace a user-owned file: ${path}`);
74
- }
75
- if (current === null || (file.owned && current !== file.content))
76
- writes.push(file);
77
- }
78
- const migration = await prepareMigration(root, dbName, schemas, has("admin"), check, reviewUniqueIndexes);
79
- const ignorePath = join(root, ".gitignore");
80
- const ignored = await optional(ignorePath);
81
- const ignoreMissing = !ignored?.split(/\r?\n/).includes(".dev.vars");
82
- return {
83
- stale: writes.length > 0 || migration.stale || ignoreMissing,
84
- report: migration.report,
85
- commit: async () => {
86
- for (const file of writes) {
87
- const path = resolve(root, file.path);
88
- await mkdir(dirname(path), { recursive: true });
89
- await writeFile(path, file.content, { flag: file.owned ? "w" : "wx" });
90
- }
91
- if (ignoreMissing) {
92
- await assertInsideProject(root, ignorePath);
93
- if (ignored === null)
94
- await writeFile(ignorePath, "node_modules/\ndist/\n.wrangler/\n.dev.vars\n", { flag: "wx" });
95
- else
96
- await appendFile(ignorePath, `${ignored.endsWith("\n") ? "" : "\n"}.dev.vars\n`);
97
- }
98
- await migration.commit();
99
- },
100
- };
101
- }
102
- async function prepareMigration(root, dbName, schemas, admin, check, reviewUniqueIndexes) {
103
- const statePath = join(root, "drizzle/meta/mantle-state.json");
104
- const fingerprintPath = join(root, "src/storage-fingerprint.json");
105
- const journalPath = join(root, "drizzle/meta/_journal.json");
106
- for (const path of [statePath, fingerprintPath, journalPath])
107
- await assertInsideProject(root, path);
108
- const current = await optional(statePath);
109
- const state = current ? JSON.parse(current) : null;
110
- const artifact = await buildSqliteMigrationArtifact(state?.schemas ?? [], schemas, {
111
- appliedMigrationIds: state?.appliedMigrationIds, reviewUniqueIndexes,
112
- });
113
- if (state && artifact.sourceFingerprint !== state.fingerprint)
114
- throw new Error("Saved migration source fingerprint is invalid.");
115
- if (artifact.destructive)
116
- throw new Error("Destructive Schema change requires a reviewed migration; only unique-index tuple replacement supports --review-unique-indexes. No file was written.");
117
- const fingerprint = await optional(fingerprintPath);
118
- const fingerprintDrift = Boolean(state && fingerprint !== `${JSON.stringify(state.fingerprint)}\n`);
119
- const changed = !state || artifact.migrations.length > 0 || artifact.sourceFingerprint !== artifact.targetFingerprint;
120
- if (!changed)
121
- return { stale: fingerprintDrift, report: undefined, commit: async () => {
122
- if (fingerprintDrift && !check)
123
- await writeFile(fingerprintPath, `${JSON.stringify(state.fingerprint)}\n`);
124
- } };
125
- if (fingerprintDrift)
126
- throw new Error("Generated fingerprint and migration source disagree; finish or restore the pending migration first.");
127
- const index = (state?.lastIndex ?? -1) + 1;
128
- const tag = `${String(index).padStart(4, "0")}_mantle`;
129
- const sqlPath = join(root, "drizzle", `${tag}.sql`);
130
- const reviewPath = join(root, "drizzle/meta", `${tag}.review.json`);
131
- const journalText = await optional(journalPath);
132
- const journal = journalText ? JSON.parse(journalText) : null;
133
- for (const path of [statePath, fingerprintPath, sqlPath, journalPath, reviewPath])
134
- await assertInsideProject(root, path);
135
- const sql = `${!state && admin ? `CREATE TABLE sites_users (id TEXT PRIMARY KEY NOT NULL, email TEXT NOT NULL UNIQUE, name TEXT NOT NULL, role TEXT CHECK (role IN ('owner','editor','contributor') OR role IS NULL), signed_in INTEGER NOT NULL DEFAULT 0, created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')));\n--> statement-breakpoint\n` : ""}${renderSqliteManagedMigration(artifact, state ? { canonicalVersion: state.canonicalVersion } : undefined)}`;
136
- const existingSql = await optional(sqlPath);
137
- if (existingSql !== null && existingSql !== sql)
138
- throw new Error(`Migration file already exists with different SQL: ${sqlPath}`);
139
- const reviewContent = artifact.reviewedUniqueIndexes?.length ? `${JSON.stringify({
140
- sourceFingerprint: artifact.sourceFingerprint, targetFingerprint: artifact.targetFingerprint,
141
- checksum: artifact.checksum, changes: artifact.reviewedUniqueIndexes,
142
- steps: artifact.migrations.map(({ id, description, sql }) => ({ id, description, sql })),
143
- rollback: "Old Worker activation is unsupported after this uniqueness change.",
144
- }, null, 2)}\n` : null;
145
- const existingReview = await optional(reviewPath);
146
- if (existingReview !== null && existingReview !== reviewContent)
147
- throw new Error(`Reviewed migration report already exists with different content: ${reviewPath}`);
148
- const last = journal?.entries?.at(-1);
149
- const journalAhead = last?.idx === index && last.tag === tag && existingSql === sql;
150
- if (state && !journalAhead && last?.idx !== state.lastIndex)
151
- throw new Error("Sites migration journal does not match saved state.");
152
- if (!state && journalText !== null && !journalAhead)
153
- throw new Error("Existing D1 migration journal conflicts with initial Mantle migration state.");
154
- const migrationFiles = await readdir(join(root, "drizzle")).catch((error) => {
155
- if (error.code === "ENOENT")
156
- return [];
157
- throw error;
158
- });
159
- if (!state && migrationFiles.some(file => file.endsWith(".sql") && file !== `${tag}.sql`))
160
- throw new Error("Existing D1 migrations conflict with initial Mantle migration state.");
161
- if (artifact.reviewedUniqueIndexes?.length) {
162
- if (!state)
163
- throw new Error("Reviewed unique-index replacement requires an existing managed Schema.");
164
- await verifyLocalD1(root, dbName, state, existingSql === sql ? {
165
- ...state, fingerprint: artifact.targetFingerprint, canonicalVersion: artifact.targetCanonicalVersion,
166
- } : undefined);
167
- for (const change of artifact.reviewedUniqueIndexes) {
168
- const schema = schemas.find(item => item.metadata.name === change.schema);
169
- for (const fields of change.added) {
170
- const columns = fields.map(field => quoteIdent(fieldColumn(schema, field)));
171
- const group = `SELECT ${columns.join(", ")}, COUNT(*) AS copies FROM ${quoteIdent(change.schema)} WHERE ${columns.map(column => `${column} IS NOT NULL`).join(" AND ")} GROUP BY ${columns.join(", ")} HAVING COUNT(*) > 1`;
172
- const conflicts = queryLocalD1(root, dbName, `SELECT COUNT(*) AS groups FROM (${group})`)[0];
173
- if (conflicts?.groups) {
174
- const sample = queryLocalD1(root, dbName, `${group} LIMIT 3`);
175
- throw new Error(`UNIQUE_INDEX_CONFLICT: ${change.schema} (${fields.join(", ")}) has ${conflicts.groups} duplicate group(s); sample ${JSON.stringify(sample)}. No migration was written.`);
176
- }
177
- }
178
- }
179
- }
180
- const nextState = { fingerprint: artifact.targetFingerprint, canonicalVersion: artifact.targetCanonicalVersion, schemas,
181
- appliedMigrationIds: [...new Set([...(state?.appliedMigrationIds ?? []), ...artifact.migrations.map(({ id }) => id)])], lastIndex: index };
182
- const nextJournal = { version: "7", dialect: "sqlite", entries: [...(journal?.entries ?? []), {
183
- idx: index, version: "6", when: Date.now(), tag, breakpoints: true,
184
- }] };
185
- return {
186
- stale: true,
187
- report: artifact.reviewedUniqueIndexes?.length ? `Reviewed unique-index plan: ${JSON.stringify({ source: artifact.sourceFingerprint, target: artifact.targetFingerprint, checksum: artifact.checksum, changes: artifact.reviewedUniqueIndexes, sql: relative(root, sqlPath), rollback: "Old Worker activation is unsupported after this uniqueness change." })}` : undefined,
188
- commit: async () => {
189
- if (check)
190
- return;
191
- if (state)
192
- await verifyLocalD1(root, dbName, state, existingSql === sql ? nextState : undefined);
193
- await mkdir(dirname(sqlPath), { recursive: true });
194
- await mkdir(dirname(journalPath), { recursive: true });
195
- await mkdir(dirname(fingerprintPath), { recursive: true });
196
- if (existingSql === null)
197
- await writeFile(sqlPath, sql, { flag: "wx" });
198
- if (reviewContent !== null && existingReview === null)
199
- await writeFile(reviewPath, reviewContent, { flag: "wx" });
200
- if (!journalAhead)
201
- await writeFile(journalPath, `${JSON.stringify(nextJournal)}\n`, { flag: journalText === null ? "wx" : "w" });
202
- await writeFile(statePath, `${JSON.stringify(nextState, null, 2)}\n`);
203
- await writeFile(fingerprintPath, `${JSON.stringify(artifact.targetFingerprint)}\n`);
204
- },
205
- };
206
- }
207
- async function verifyLocalD1(root, dbName, state, appliedNext) {
208
- const wrangler = join(root, "node_modules/wrangler/bin/wrangler.js");
209
- await access(wrangler).catch(() => { throw new Error("Install the generated project dependencies before verifying local D1 migrations."); });
210
- const query = (sql) => queryLocalD1(root, dbName, sql);
211
- const active = query("SELECT fingerprint FROM _mantle_storage_state WHERE id=1")[0];
212
- const expected = active?.fingerprint === state.fingerprint ? state :
213
- active?.fingerprint === appliedNext?.fingerprint ? appliedNext : null;
214
- if (!expected)
215
- throw new Error("Local D1 has a pending migration. Apply it before generating another migration.");
216
- const table = query("SELECT name FROM sqlite_schema WHERE type='table' AND name='_mantle_managed_runtime_state'")[0];
217
- const version = table ? query("SELECT canonical_version FROM _mantle_managed_runtime_state WHERE id=1")[0]?.canonical_version : undefined;
218
- if (version !== expected.canonicalVersion)
219
- throw new Error("Local D1 runtime version does not match the applied migration state.");
220
- }
221
- function queryLocalD1(root, dbName, sql) {
222
- const output = execFileSync(process.execPath, [join(root, "node_modules/wrangler/bin/wrangler.js"), "d1", "execute", dbName, "--local", "--command", sql, "--json"], { cwd: root, encoding: "utf8" });
223
- return JSON.parse(output)[0]?.results ?? [];
224
- }
225
- async function optional(path) {
226
- return readFile(path, "utf8").catch((error) => {
227
- if (error.code === "ENOENT")
228
- return null;
229
- throw error;
230
- });
231
- }
232
- async function template(name) {
233
- return readFile(new URL(`../../templates/chatgpt-sites/${name}`, import.meta.url), "utf8");
234
- }
235
- function importPath(from, to) {
236
- const path = relative(dirname(from), to).split(sep).join("/").replace(/\.ts$/, ".js");
237
- return path.startsWith(".") ? path : `./${path}`;
238
- }
239
- function workerSource(root, worker, selection) {
240
- const has = (feature) => selection.features.includes(feature);
241
- const from = (path) => importPath(worker, join(root, path));
242
- const admin = has("admin");
243
- const mcp = has("mcp");
244
- return `// Generated by \`mantle generate\`. Edit src/home.ts and src/handlers.ts instead.\n` +
245
- `import { Hono } from "hono";\n` +
246
- `import { bootMantleRuntime, SqliteMantleStorageAdapter${has("api") ? ", createMantleRequestHandler" : ""}, type MantleRuntime } from "@aotter/mantle/runtime";\n` +
247
- `import { D1DatabaseDriver${admin ? ", AssetsAssetServer" : ""} } from "@aotter/mantle/cloudflare";\n` +
248
- (admin ? `import { mountMantleAdmin, type MantleAdminRuntime } from "@aotter/mantle/admin";\n` : "") +
249
- `import { plan } from "./mantle.js";\n` +
250
- `import { handlers } from "${from("src/handlers.ts")}";\n` +
251
- `import fingerprint from "${from("src/storage-fingerprint.json")}";\n` +
252
- (has("web") ? `import { home } from "${from("src/home.ts")}";\n` : "") +
253
- (admin ? `import { createChatGPTAuth, type Env } from "${from("src/sites-auth.ts")}";\n` :
254
- mcp ? `import type { Env } from "${from("src/sites-env.ts")}";\n` : `interface Env { DB: D1Database; PUBLIC_ORIGIN: string; ASSETS?: Fetcher }\n`) +
255
- (mcp ? `import { ${admin ? "mountMcp" : "mountPublicMcp"} } from "${from("src/sites-mcp.ts")}";\n` : "") +
256
- `\nfunction assemble(env: Env) {\n` +
257
- ` if (!env.PUBLIC_ORIGIN) throw new Error("Set PUBLIC_ORIGIN to the exact Sites origin.");\n` +
258
- (admin ? ` if (!env.ASSETS) throw new Error("Sites Admin requires the ASSETS binding.");\n const auth = createChatGPTAuth(env);\n` : "") +
259
- ` let runtime: Promise<${admin ? "MantleAdminRuntime" : "MantleRuntime"}> | undefined;\n` +
260
- ` const get = () => runtime ??= bootMantleRuntime({\n plan, handlers,\n storage: new SqliteMantleStorageAdapter(new D1DatabaseDriver(env.DB), { brand: "Mantle", title: "Mantle", origin: env.PUBLIC_ORIGIN }, { managedStorageFingerprint: fingerprint }),\n })` +
261
- (admin ? `.then(value => {\n if (!value.siteConfig || !value.updateSiteSettings) throw new Error("Admin storage unavailable.");\n return value as MantleAdminRuntime;\n })` : "") +
262
- `.catch(error => { runtime = undefined; throw error; });\n` +
263
- ` const app = new Hono<{ Bindings: Env }>();\n` +
264
- ` app.use("*", async (c, next) => { await next(); if (!c.res.headers.has("Cache-Control")) c.header("Cache-Control", "private, no-store"); c.header("X-Content-Type-Options", "nosniff"); });\n` +
265
- (has("web") ? ` app.get("/", () => home());\n` : "") +
266
- ` app.get("/health", async () => { await get(); return Response.json({ ok: true, storage: "D1", auth: "ChatGPT Sites" }); });\n` +
267
- (mcp ? ` ${admin ? "mountMcp(app, get, auth, plan)" : "mountPublicMcp(app, get, plan)"};\n` : "") +
268
- (admin ? ` app.get("/admin/sign-in", async c => {\n if (c.req.header("cookie")?.split(";").some(value => value.trim() === "mantle-sites-signout=1")) {\n c.header("Set-Cookie", "mantle-sites-signout=; Path=/admin/sign-in; HttpOnly; SameSite=Strict; Max-Age=0" + (env.PUBLIC_ORIGIN.startsWith("https:") ? "; Secure" : ""));\n return c.redirect("/signout-with-chatgpt?return_to=%2F");\n }\n return c.redirect(await auth.getSession(c.req.raw) ? "/admin" : "/signin-with-chatgpt?return_to=%2Fadmin");\n });\n app.use("/admin/*", async (c, next) => {\n if (!c.req.path.startsWith("/admin/api/") && !await auth.getSession(c.req.raw)) return c.redirect("/signin-with-chatgpt?return_to=%2Fadmin");\n await next();\n });\n mountMantleAdmin(app, { plan, auth, get, assets: new AssetsAssetServer(env.ASSETS), mcpEndpoints: { public: "/api/mcp", staff: "/api/mcp/staff" }, requestContext: c => ({ env: c.env, waitUntil: promise => c.executionCtx.waitUntil(promise) }) });\n app.get("/_mantle/*", c => env.ASSETS!.fetch(c.req.raw));\n` : "") +
269
- (has("api") ? ` const api = createMantleRequestHandler({ plan, getRuntime: get });\n app.use("*", async (c, next) => {\n const response = await api(c.req.raw, { user: null, staff: null, env: c.env, waitUntil: promise => c.executionCtx.waitUntil(promise) });\n if (response) return response;\n await next();\n });\n` : "") +
270
- ` app.onError(error => { console.error("Mantle request failed", error); return Response.json({ error: "internal_error" }, { status: 500, headers: { "Cache-Control": "private, no-store" } }); });\n` +
271
- ` return app;\n}\n\nlet app: ReturnType<typeof assemble> | undefined;\nexport default { fetch(request: Request, env: Env, ctx: ExecutionContext) { return (app ??= assemble(env)).fetch(request, env, ctx); } };\n`;
272
- }
273
- //# sourceMappingURL=generate-sites.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generate-sites.js","sourceRoot":"","sources":["../../src/cli/generate-sites.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,EAAE,4BAA4B,EAAE,WAAW,EAAE,UAAU,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAE7H,OAAO,EAAE,mBAAmB,EAAyB,MAAM,uBAAuB,CAAC;AAWnF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,MAAc,EAAE,SAA2B,EAAE,OAAkC,EAAE,KAAc,EAAE,mBAAmB,GAAG,KAAK;IAK3K,MAAM,GAAG,GAAG,CAAC,OAAe,EAAW,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAA4C,CAAC,CAAC;IACpH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC;IAC/I,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;IACnE,MAAM,KAAK,GAAW;QACpB,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;QAC7E,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,4BAA4B,WAAW,MAAM,EAAE;QAChF,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,wHAAwH,EAAE;QAC9J,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC,WAAW,CAAC,EAAE;QACnE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,eAAe,EAAE;oBACrE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI;oBACjG,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,2BAA2B,CAAC,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC;iBAC3E,EAAE,OAAO,EAAE,CAAC,aAAa,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QAC7H,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,mKAAmK,EAAE;KAC5M,CAAC;IACF,IAAI,GAAG,CAAC,KAAK,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,6OAA6O,EAAE,CAAC,CAAC;IAC5S,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC9E,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC5E,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;SAAM,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC5E,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,gBAAgB,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClK,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC;IACxE,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5I,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,gBAAgB,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAE,CAAC;QACpC,MAAM,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACzD,MAAM,cAAc,GAAG,MAAM,CAAC,OAAQ,CAAC,KAAK,CAAC,gDAAgD,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACpG,IAAI,CAAC,cAAc,IAAI,CAAC,gDAAgD,CAAC,IAAI,CAAC,MAAM,CAAC,OAAQ,CAAC,EAAE,CAAC;YAC/F,MAAM,IAAI,KAAK,CAAC,YAAY,MAAM,CAAC,IAAI,4DAA4D,CAAC,CAAC;QACvG,CAAC;QACD,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,sDAAsD,CAAC,IAAI,CAAC,MAAM,CAAC,OAAQ,CAAC;YAChG,8DAA8D,CAAC,IAAI,CAAC,MAAM,CAAC,OAAQ,CAAC,CAAC,EAAE,CAAC;YACxF,MAAM,IAAI,KAAK,CAAC,YAAY,MAAM,CAAC,IAAI,mGAAmG,CAAC,CAAC;QAC9I,CAAC;QACD,MAAM,GAAG,cAAc,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;gBAC9D,IAAI,EAAE,IAAI,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK;gBACxF,mBAAmB,EAAE,CAAC,eAAe,EAAE,8BAA8B,CAAC;gBACtE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5G,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC;aACxG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACrB,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC,CAAC;IACnE,MAAM,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC,CAAC;IACpE,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAC;IACzI,CAAC;;QAAM,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAW,EAAE,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,OAAO,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,mCAAmC,CAAC,EAAE,CAAC;YAC/F,MAAM,IAAI,KAAK,CAAC,qDAAqD,IAAI,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtF,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,mBAAmB,CAAC,CAAC;IAC1G,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACrE,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,IAAI,aAAa;QAC5D,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,MAAM,EAAE,KAAK,IAAI,EAAE;YACjB,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACtC,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChD,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACzE,CAAC;YACD,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,mBAAmB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBAC5C,IAAI,OAAO,KAAK,IAAI;oBAAE,MAAM,SAAS,CAAC,UAAU,EAAE,+CAA+C,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;;oBAC9G,MAAM,UAAU,CAAC,UAAU,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC;YACxF,CAAC;YACD,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;QAC3B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,MAAc,EAAE,OAAkC,EAAE,KAAc,EAAE,KAAc,EAAE,mBAA4B;IAC5J,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,gCAAgC,CAAC,CAAC;IAC/D,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,EAAE,8BAA8B,CAAC,CAAC;IACnE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,4BAA4B,CAAC,CAAC;IAC7D,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,eAAe,EAAE,WAAW,CAAC;QAAE,MAAM,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACpG,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAU,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5D,MAAM,QAAQ,GAAG,MAAM,4BAA4B,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,EAAE,OAAO,EAAE;QACjF,mBAAmB,EAAE,KAAK,EAAE,mBAAmB,EAAE,mBAAmB;KACrE,CAAC,CAAC;IACH,IAAI,KAAK,IAAI,QAAQ,CAAC,iBAAiB,KAAK,KAAK,CAAC,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACjI,IAAI,QAAQ,CAAC,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,qJAAqJ,CAAC,CAAC;IACjM,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,CAAC;IACpD,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,IAAI,WAAW,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACpG,MAAM,OAAO,GAAG,CAAC,KAAK,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,iBAAiB,KAAK,QAAQ,CAAC,iBAAiB,CAAC;IACtH,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE;gBACpF,IAAI,gBAAgB,IAAI,CAAC,KAAK;oBAAE,MAAM,SAAS,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAC9G,CAAC,EAAE,CAAC;IACJ,IAAI,gBAAgB;QAAE,MAAM,IAAI,KAAK,CAAC,qGAAqG,CAAC,CAAC;IAC7I,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,SAAS,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,GAAG,MAAM,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,GAAG,cAAc,CAAC,CAAC;IACpE,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAsD,CAAC,CAAC,CAAC,IAAI,CAAC;IAClH,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC;QAAE,MAAM,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzH,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,iUAAiU,CAAC,CAAC,CAAC,EAAE,GAAG,4BAA4B,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;IACrd,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,KAAK,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,OAAO,EAAE,CAAC,CAAC;IACjI,MAAM,aAAa,GAAG,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;QAC/E,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;QAC5F,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,qBAAqB;QACpE,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;QACxF,QAAQ,EAAE,oEAAoE;KAC/E,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACvB,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;IAClD,IAAI,cAAc,KAAK,IAAI,IAAI,cAAc,KAAK,aAAa;QAAE,MAAM,IAAI,KAAK,CAAC,oEAAoE,UAAU,EAAE,CAAC,CAAC;IACnK,MAAM,IAAI,GAAG,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,YAAY,GAAG,IAAI,EAAE,GAAG,KAAK,KAAK,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,WAAW,KAAK,GAAG,CAAC;IACpF,IAAI,KAAK,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE,GAAG,KAAK,KAAK,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACpI,IAAI,CAAC,KAAK,IAAI,WAAW,KAAK,IAAI,IAAI,CAAC,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;IACrJ,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAA4B,EAAE,EAAE;QACjG,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QACvC,MAAM,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,KAAK,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,KAAK,GAAG,GAAG,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;IACnL,IAAI,QAAQ,CAAC,qBAAqB,EAAE,MAAM,EAAE,CAAC;QAC3C,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;QACtG,MAAM,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,KAAK,GAAG,CAAC,CAAC,CAAC;YAC7D,GAAG,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,QAAQ,CAAC,sBAAsB;SACrG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACf,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,qBAAqB,EAAE,CAAC;YACpD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,CAAE,CAAC;YAC3E,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAE,CAAC,CAAC,CAAC;gBAC7E,MAAM,KAAK,GAAG,UAAU,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,cAAc,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC;gBAC5N,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,mCAAmC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAoC,CAAC;gBAChI,IAAI,SAAS,EAAE,MAAM,EAAE,CAAC;oBACtB,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,UAAU,CAAC,CAAC;oBAC9D,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,SAAS,CAAC,MAAM,+BAA+B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC;gBAC5L,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAU,EAAE,WAAW,EAAE,QAAQ,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,QAAQ,CAAC,sBAAsB,EAAE,OAAO;QAC5H,mBAAmB,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,mBAAmB,IAAI,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC7I,MAAM,WAAW,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC,EAAE;gBAC5F,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI;aACnE,CAAC,EAAE,CAAC;IACL,OAAO;QACL,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC,CAAC,+BAA+B,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,iBAAiB,EAAE,MAAM,EAAE,QAAQ,CAAC,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,oEAAoE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;QAC5W,MAAM,EAAE,KAAK,IAAI,EAAE;YACjB,IAAI,KAAK;gBAAE,OAAO;YAClB,IAAI,KAAK;gBAAE,MAAM,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACjG,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,MAAM,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,MAAM,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,IAAI,WAAW,KAAK,IAAI;gBAAE,MAAM,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACxE,IAAI,aAAa,KAAK,IAAI,IAAI,cAAc,KAAK,IAAI;gBAAE,MAAM,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAClH,IAAI,CAAC,YAAY;gBAAE,MAAM,SAAS,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YACjI,MAAM,SAAS,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACtE,MAAM,SAAS,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACtF,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,MAAc,EAAE,KAAY,EAAE,WAAmB;IAC1F,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,uCAAuC,CAAC,CAAC;IACrE,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7I,MAAM,KAAK,GAAG,CAAC,GAAW,EAAa,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAG,KAAK,CAAC,0DAA0D,CAAC,CAAC,CAAC,CAAyC,CAAC;IAC5H,MAAM,QAAQ,GAAG,MAAM,EAAE,WAAW,KAAK,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAClE,MAAM,EAAE,WAAW,KAAK,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;IACxE,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;IAClH,MAAM,KAAK,GAAG,KAAK,CAAC,4FAA4F,CAAC,CAAC,CAAC,CAAC,CAAC;IACrH,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAE,KAAK,CAAC,wEAAwE,CAAC,CAAC,CAAC,CAAgD,EAAE,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1L,IAAI,OAAO,KAAK,QAAQ,CAAC,gBAAgB;QAAE,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;AACrI,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,MAAc,EAAE,GAAW;IAC7D,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,uCAAuC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACtM,OAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAmC,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;AACjF,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAY;IAClC,OAAO,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAA4B,EAAE,EAAE;QACnE,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACzC,MAAM,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAY;IAClC,OAAO,QAAQ,CAAC,IAAI,GAAG,CAAC,iCAAiC,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;AAC7F,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,EAAU;IAC1C,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACtF,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;AACnD,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,MAAc,EAAE,SAA2B;IAC7E,MAAM,GAAG,GAAG,CAAC,OAAe,EAAW,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAA4C,CAAC,CAAC;IACpH,MAAM,IAAI,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACvB,OAAO,sFAAsF;QAC3F,gCAAgC;QAChC,yDAAyD,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,EAAE,yDAAyD;QAClK,4BAA4B,KAAK,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,wCAAwC;QACtG,CAAC,KAAK,CAAC,CAAC,CAAC,qFAAqF,CAAC,CAAC,CAAC,EAAE,CAAC;QACpG,uCAAuC;QACvC,6BAA6B,IAAI,CAAC,iBAAiB,CAAC,MAAM;QAC1D,4BAA4B,IAAI,CAAC,8BAA8B,CAAC,MAAM;QACtE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,yBAAyB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,CAAC,KAAK,CAAC,CAAC,CAAC,gDAAgD,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;YACxF,GAAG,CAAC,CAAC,CAAC,6BAA6B,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,6EAA6E,CAAC;QACpJ,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,gBAAgB,YAAY,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACxG,mCAAmC;QACnC,8FAA8F;QAC9F,CAAC,KAAK,CAAC,CAAC,CAAC,2HAA2H,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1I,0BAA0B,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,eAAe,kBAAkB;QAC1F,yQAAyQ;QACzQ,CAAC,KAAK,CAAC,CAAC,CAAC,yKAAyK,CAAC,CAAC,CAAC,EAAE,CAAC;QACxL,2DAA2D;QAC3D,gDAAgD;QAChD,iMAAiM;QACjM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,iIAAiI;QACjI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,gCAAgC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAClG,CAAC,KAAK,CAAC,CAAC,CAAC,mhCAAmhC,CAAC,CAAC,CAAC,EAAE,CAAC;QACliC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,yTAAyT,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7U,sMAAsM;QACtM,oNAAoN,CAAC;AACzN,CAAC"}
@@ -1,20 +0,0 @@
1
- /** Test seam for Core-only vs Admin-present installs. */
2
- export interface GenerateDeps {
3
- readonly resolveAdminUiIndexHtml?: () => string | null;
4
- }
5
- /**
6
- * Locate the optional Admin SPA. A Core-only install does not have
7
- * `@aotter/mantle-admin-ui`, so resolution failure is not an error.
8
- */
9
- export declare function resolveAdminUiIndexHtml(): string | null;
10
- export declare function runGenerate(rawArgs: readonly string[], deps?: GenerateDeps): Promise<number>;
11
- export declare function printGenerateNextSteps(adminUiInstalled: boolean, write?: {
12
- (buffer: Uint8Array | string, cb?: (err?: Error | null) => void): boolean;
13
- (str: Uint8Array | string, encoding?: BufferEncoding, cb?: (err?: Error | null) => void): boolean;
14
- }): void;
15
- /** Cheap hint: Admin SPA was synced but wrangler has no ASSETS binding. */
16
- export declare function warnMissingWranglerAssets(root: string, write?: {
17
- (buffer: Uint8Array | string, cb?: (err?: Error | null) => void): boolean;
18
- (str: Uint8Array | string, encoding?: BufferEncoding, cb?: (err?: Error | null) => void): boolean;
19
- }): void;
20
- //# sourceMappingURL=generate.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/cli/generate.ts"],"names":[],"mappings":"AAwBA,yDAAyD;AACzD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;CACxD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,GAAG,IAAI,CAOvD;AASD,wBAAsB,WAAW,CAC/B,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,IAAI,GAAE,YAAiB,GACtB,OAAO,CAAC,MAAM,CAAC,CA8HjB;AAwDD,wBAAgB,sBAAsB,CAAC,gBAAgB,EAAE,OAAO,EAAE,KAAK;2CA3GZ,CAAC;mEAM+D,CAAC;CAqGzB,GAAG,IAAI,CAmBzG;AAiBD,2EAA2E;AAC3E,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK;2CAhJF,CAAC;mEAM+D,CAAC;CA0InC,GAAG,IAAI,CAa/F"}
@@ -1,299 +0,0 @@
1
- import { existsSync, readFileSync } from "node:fs";
2
- import { mkdir, readFile, readdir, rm, writeFile } from "node:fs/promises";
3
- import { dirname, join, resolve } from "node:path";
4
- import { createRequire } from "node:module";
5
- import { cwd, stderr, stdout } from "node:process";
6
- import { fileURLToPath } from "node:url";
7
- import { parseArgs } from "node:util";
8
- import { parseManifestSources, ValidateManifestsUseCase } from "@aotter/mantle-spec";
9
- import { loadManifestsFromRoot } from "@aotter/mantle-spec/cli";
10
- import { assertMantleNamespace, emitMantleModule } from "../codegen/emitMantleModule.js";
11
- import { prepareProject } from "./generate-project.js";
12
- import { prepareSites } from "./generate-sites.js";
13
- /**
14
- * Locate the optional Admin SPA. A Core-only install does not have
15
- * `@aotter/mantle-admin-ui`, so resolution failure is not an error.
16
- */
17
- export function resolveAdminUiIndexHtml() {
18
- try {
19
- const path = fileURLToPath(import.meta.resolve("@aotter/mantle-admin-ui/index.html"));
20
- return existsSync(path) ? path : null;
21
- }
22
- catch {
23
- return null;
24
- }
25
- }
26
- function resolveProjectAdminUiIndexHtml(root) {
27
- try {
28
- const path = createRequire(join(root, "package.json")).resolve("@aotter/mantle-admin-ui/index.html");
29
- return existsSync(path) ? path : null;
30
- }
31
- catch {
32
- return null;
33
- }
34
- }
35
- export async function runGenerate(rawArgs, deps = {}) {
36
- let options;
37
- try {
38
- const parsed = parseGenerateArgs(rawArgs);
39
- if (parsed === null) {
40
- printHelp();
41
- return 0;
42
- }
43
- options = parsed;
44
- }
45
- catch (error) {
46
- stderr.write(`${message(error)}\n`);
47
- return 2;
48
- }
49
- const root = cwd();
50
- let loaded = await loadManifestsFromRoot(options.manifests);
51
- if (loaded.parseErrors.some((diagnostic) => diagnostic.code !== "MANIFEST_ROOT_NOT_FOUND") ||
52
- (options.manifestsExplicit && loaded.parseErrors.length > 0)) {
53
- printDiagnostics(loaded.parseErrors);
54
- return 1;
55
- }
56
- let project;
57
- try {
58
- project = await prepareProject({
59
- root, host: options.host, features: options.features, check: options.check, output: options.output,
60
- });
61
- }
62
- catch (error) {
63
- stderr.write(`${message(error)}\n`);
64
- return 2;
65
- }
66
- if (project.mode === "project" && !options.manifestsExplicit && loaded.parseErrors.length === 1 &&
67
- loaded.parseErrors[0]?.code === "MANIFEST_ROOT_NOT_FOUND") {
68
- let names;
69
- try {
70
- names = await readdir(resolve(root, options.manifests));
71
- }
72
- catch (error) {
73
- if (error.code !== "ENOENT") {
74
- printDiagnostics(loaded.parseErrors);
75
- return 1;
76
- }
77
- names = [];
78
- }
79
- if (!names.some((name) => /\.ya?ml$/i.test(name))) {
80
- const empty = parseManifestSources({ sources: [] });
81
- if (empty.ok)
82
- loaded = { parsed: empty.value, parseErrors: [], root: loaded.root };
83
- }
84
- }
85
- const validation = loaded.parsed
86
- ? ValidateManifestsUseCase.run({ parsed: loaded.parsed })
87
- : { diagnostics: [], errorCount: 0, warningCount: 0 };
88
- const validationErrors = [...loaded.parseErrors, ...validation.diagnostics]
89
- .filter((diagnostic) => diagnostic.severity === "error");
90
- if (validationErrors.length > 0 || !validation.linked) {
91
- printDiagnostics(validationErrors);
92
- return 1;
93
- }
94
- if (project.mode === "project" && project.selection?.host !== "cf") {
95
- const schedule = loaded.parsed.entries.find((entry) => entry.manifest.kind === "Trigger" && entry.manifest.spec.source.kind === "schedule");
96
- if (schedule) {
97
- stderr.write(`RESOURCE_UNAVAILABLE: Trigger '${schedule.manifest.metadata.name}' requires host 'cf'; '${project.selection?.host ?? "none"}' does not register Cron Triggers.\n`);
98
- return 1;
99
- }
100
- }
101
- const emitted = emitMantleModule({
102
- linked: validation.linked,
103
- namespace: options.namespace,
104
- });
105
- if (!emitted.ok) {
106
- printDiagnostics(emitted.diagnostics);
107
- return 1;
108
- }
109
- let sites = null;
110
- if (options.reviewUniqueIndexes && project.selection?.host !== "chatgpt-sites") {
111
- stderr.write("--review-unique-indexes requires a managed ChatGPT Sites project.\n");
112
- return 2;
113
- }
114
- if (project.mode === "project" && project.selection?.host === "chatgpt-sites") {
115
- try {
116
- sites = await prepareSites(root, project.selection.output ?? options.output, project.selection, loaded.parsed.entries.filter((entry) => entry.manifest.kind === "Schema").map((entry) => entry.manifest), options.check, options.reviewUniqueIndexes);
117
- if (sites.report)
118
- stdout.write(`${sites.report}\n`);
119
- }
120
- catch (error) {
121
- stderr.write(`${message(error)}\n`);
122
- return 2;
123
- }
124
- }
125
- const adminIndex = project.mode === "legacy" || project.selection?.features.includes("admin")
126
- ? (deps.resolveAdminUiIndexHtml ?? (project.mode === "legacy" ? resolveAdminUiIndexHtml : () => resolveProjectAdminUiIndexHtml(root)))()
127
- : null;
128
- const adminUnavailable = project.selection?.features.includes("admin") && adminIndex === null;
129
- if (adminUnavailable) {
130
- stderr.write("Selected Admin UI is not installed or its assets are missing. Install declared packages and rerun mantle generate.\n");
131
- if (!options.check && !project.incomplete)
132
- return 1;
133
- }
134
- if (!options.check && project.commit) {
135
- try {
136
- await project.commit();
137
- await sites?.commit();
138
- }
139
- catch (error) {
140
- stderr.write(`${message(error)}\n`);
141
- return 2;
142
- }
143
- }
144
- if (project.incomplete && !options.check)
145
- return 1;
146
- const output = resolve(cwd(), project.selection?.output ?? options.output);
147
- const generatedCurrent = await syncText(join(output, "mantle.ts"), emitted.source, options.check);
148
- let stale = project.incomplete || adminUnavailable || !generatedCurrent || Boolean(sites?.stale);
149
- if (adminIndex !== null) {
150
- const adminSource = dirname(adminIndex);
151
- const adminTarget = resolve(cwd(), "public/_mantle/admin");
152
- stale = !(await syncAdminAssets(adminSource, adminTarget, options.check)) || stale;
153
- if (!options.check)
154
- warnMissingWranglerAssets(cwd());
155
- }
156
- if (stale && options.check) {
157
- stderr.write("Mantle generated files are stale; run `mantle generate`.\n");
158
- return 1;
159
- }
160
- if (project.mode === "project") {
161
- if (!options.check)
162
- stdout.write(project.selection?.host === "cf"
163
- ? "Generated Cloudflare Worker composition and typed bindings.\n"
164
- : project.selection?.host === "chatgpt-sites"
165
- ? "Generated ChatGPT Sites composition and typed bindings. Apply reviewed local D1 migrations before serving.\n"
166
- : "Generated host-free Spec bindings.\n");
167
- return 0;
168
- }
169
- if (!options.check)
170
- printGenerateNextSteps(adminIndex !== null);
171
- return 0;
172
- }
173
- function parseGenerateArgs(rawArgs) {
174
- const { values } = parseArgs({
175
- args: [...rawArgs],
176
- options: {
177
- manifests: { type: "string" },
178
- output: { type: "string", short: "o" },
179
- namespace: { type: "string" },
180
- host: { type: "string" },
181
- features: { type: "string" },
182
- "review-unique-indexes": { type: "boolean" },
183
- check: { type: "boolean" },
184
- help: { type: "boolean", short: "h" },
185
- },
186
- });
187
- if (values.help)
188
- return null;
189
- const namespace = values.namespace ?? "Mantle";
190
- assertMantleNamespace(namespace, "--namespace");
191
- return {
192
- manifests: values.manifests ?? "./manifests",
193
- output: values.output ?? ".mantle/generated",
194
- namespace,
195
- check: values.check === true,
196
- host: values.host,
197
- features: values.features,
198
- reviewUniqueIndexes: values["review-unique-indexes"] === true,
199
- manifestsExplicit: values.manifests !== undefined,
200
- };
201
- }
202
- function printHelp() {
203
- stdout.write(`mantle generate — compile manifests and assemble selected application features
204
-
205
- Usage: mantle generate [options]
206
-
207
- For a new application, the default selects Spec, Runtime, API, MCP, Admin and Web.
208
- Select a host with --host cf or --host chatgpt-sites. --features replaces the
209
- default with a positive list; required feature dependencies are added.
210
- Existing authored applications retain their direct-authoring compile mode.
211
-
212
- Options:
213
- --manifests <dir> Manifest directory (default: ./manifests)
214
- -o, --output <dir> Generated root (default: .mantle/generated)
215
- --namespace <name> Generated type namespace (default: Mantle)
216
- --host <name> cf or chatgpt-sites (required for host-dependent features)
217
- --features <list> Comma-separated: spec,runtime,api,mcp,admin,web
218
- --review-unique-indexes Plan a reviewed Sites unique-index tuple replacement
219
- --check Check selection, dependencies and output without writing
220
- -h, --help This help
221
-
222
- Documentation:
223
- Handbook: docs/handbook/start/project-and-cli.md or https://mantle.tools/
224
- `);
225
- }
226
- export function printGenerateNextSteps(adminUiInstalled, write = stdout.write.bind(stdout)) {
227
- if (adminUiInstalled) {
228
- write("Synced public/_mantle/admin/ from @aotter/mantle-admin-ui (opt-in, prebuilt; do not vite-build).\n" +
229
- "Admin / Dev UI next steps:\n" +
230
- " 1. wrangler assets.directory=./public and binding=ASSETS\n" +
231
- " 2. pnpm dev → open /admin/sign-in\n" +
232
- " 3. email OTP via ConsoleEmailSender (code in wrangler logs)\n" +
233
- "PUBLIC_ORIGIN must equal the origin wrangler prints; a mismatch is INVALID_ORIGIN.\n" +
234
- "See docs/examples/host-local-admin-otp or node_modules/@aotter/mantle/docs/examples/host-local-admin-otp.\n");
235
- return;
236
- }
237
- write("API-only (Admin is opt-in). A complete service does not require a Dev UI. " +
238
- "To add Admin later: install @aotter/mantle-admin and @aotter/mantle-admin-ui, " +
239
- "re-run generate, configure wrangler ASSETS, and wire local email-otp " +
240
- "(docs/examples/host-local-admin-otp or node_modules/@aotter/mantle/docs/examples/host-local-admin-otp).\n");
241
- }
242
- function printDiagnostics(diagnostics) {
243
- for (const diagnostic of diagnostics) {
244
- stderr.write(`${diagnostic.code} ${diagnostic.path}: ${diagnostic.message}\n`);
245
- }
246
- }
247
- async function syncText(path, expected, check) {
248
- const current = await readFile(path, "utf8").catch(() => null);
249
- if (current === expected)
250
- return true;
251
- if (check)
252
- return false;
253
- await mkdir(dirname(path), { recursive: true });
254
- await writeFile(path, expected, "utf8");
255
- return true;
256
- }
257
- /** Cheap hint: Admin SPA was synced but wrangler has no ASSETS binding. */
258
- export function warnMissingWranglerAssets(root, write = stderr.write.bind(stderr)) {
259
- const wrangler = ["wrangler.jsonc", "wrangler.json", "wrangler.toml"]
260
- .map((name) => join(root, name))
261
- .find((path) => existsSync(path));
262
- if (!wrangler)
263
- return;
264
- const text = readFileSync(wrangler, "utf8");
265
- if (/["']?binding["']?\s*[:=]\s*["']ASSETS["']/.test(text))
266
- return;
267
- write("warning: @aotter/mantle-admin-ui synced public/_mantle/admin, but wrangler has no ASSETS binding. " +
268
- "/admin can return HTML 200 while /_mantle/admin/assets/* 404s (white screen). " +
269
- 'Add "assets": { "directory": "./public", "binding": "ASSETS" }. ' +
270
- "Do not put /_mantle in run_worker_first.\n");
271
- }
272
- async function syncAdminAssets(source, target, check) {
273
- const sourceFiles = (await listFiles(source)).filter((path) => !path.startsWith("server."));
274
- const targetFiles = await listFiles(target).catch(() => []);
275
- const current = sourceFiles.length === targetFiles.length
276
- && sourceFiles.every((path, index) => path === targetFiles[index])
277
- && (await Promise.all(sourceFiles.map(async (path) => (await readFile(join(source, path))).equals(await readFile(join(target, path)))))).every(Boolean);
278
- if (current || check)
279
- return current;
280
- await rm(target, { recursive: true, force: true });
281
- for (const path of sourceFiles) {
282
- const destination = join(target, path);
283
- await mkdir(dirname(destination), { recursive: true });
284
- await writeFile(destination, await readFile(join(source, path)));
285
- }
286
- return true;
287
- }
288
- async function listFiles(root, prefix = "") {
289
- const entries = await readdir(join(root, prefix), { withFileTypes: true });
290
- const files = await Promise.all(entries.map((entry) => {
291
- const path = join(prefix, entry.name);
292
- return entry.isDirectory() ? listFiles(root, path) : [path];
293
- }));
294
- return files.flat().sort();
295
- }
296
- function message(error) {
297
- return error instanceof Error ? error.message : String(error);
298
- }
299
- //# sourceMappingURL=generate.js.map