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