@aotter/mantle 0.2.0-alpha.6 → 0.2.0-alpha.8
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 +157 -45
- package/dist/auth/adapter.d.ts +32 -0
- package/dist/auth/adapter.js +285 -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 +225 -0
- package/dist/build/compiler.d.ts +712 -0
- package/dist/build/compiler.js +6896 -0
- package/dist/{spec → build/spec}/domain/model/ManifestGrammar.d.ts +30 -47
- package/dist/{spec → build/spec}/domain/model/RuntimePlan.d.ts +77 -3
- package/dist/{spec → build/spec}/domain/model/SqlIr.d.ts +37 -6
- package/dist/build/spec/domain/model/UserFields.d.ts +20 -0
- package/dist/{spec → build/spec}/domain/service/PlanFingerprint.d.ts +4 -1
- package/dist/{spec → build/spec}/kernel/diagnostic.d.ts +1 -30
- 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 +55 -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 +19 -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 +174 -0
- package/dist/infrastructure/cli.js +97 -0
- package/dist/infrastructure/generate.d.ts +12 -0
- package/dist/infrastructure/generate.js +174 -0
- package/dist/infrastructure/generateAuth.d.ts +8 -0
- package/dist/infrastructure/generateAuth.js +23 -0
- package/dist/infrastructure/inputs.js +41 -0
- package/dist/infrastructure/wrangler.js +94 -0
- package/dist/kernel/authorization.d.ts +4 -0
- package/dist/kernel/authorization.js +16 -0
- package/dist/kernel/binds.d.ts +51 -0
- package/dist/kernel/binds.js +45 -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 +139 -0
- package/dist/kernel/contracts.js +92 -0
- package/dist/{spec/domain/service/CloudflareCron.d.ts → kernel/cron.d.ts} +0 -1
- package/dist/{spec/domain/service/CloudflareCron.js → kernel/cron.js} +1 -6
- package/dist/kernel/dialect/common.d.ts +39 -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 +98 -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/{auth/emailTemplates.js → kernel/email.js} +13 -2
- 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 +106 -0
- package/dist/kernel/mcp.js +49 -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/{cloudflare/r2Media.d.ts → kernel/r2-media.d.ts} +4 -5
- 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 +43 -0
- package/dist/kernel/search.js +5 -0
- package/dist/{core/site.d.ts → kernel/site-types.d.ts} +38 -9
- 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 +165 -0
- package/dist/kernel/store.js +257 -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 +34 -0
- package/dist/kernel/user-fields.js +71 -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-response.js +8 -0
- package/dist/kernel/web.d.ts +77 -0
- package/dist/kernel/web.js +158 -0
- package/dist/kernel/where.js +27 -0
- package/dist/testing/index.d.ts +1 -37
- package/dist/testing/index.js +1 -43
- package/dist/usecase/adminBindings.js +141 -0
- package/dist/usecase/adminClient.js +87 -0
- package/dist/usecase/adminDescriptors.js +107 -0
- package/dist/usecase/generate.js +165 -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 +40 -0
- package/dist/usecase/stores.js +62 -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 +233 -0
- package/dist/usecase/web.js +23 -0
- package/docs/examples/README.md +31 -16
- package/docs/examples/app-shell/README.md +86 -0
- package/docs/examples/app-shell/package.json +42 -0
- package/docs/examples/app-shell/pnpm-workspace.yaml +8 -0
- package/docs/examples/app-shell/smoke-kit.mjs +154 -0
- package/docs/examples/app-shell/src/auth.ts +57 -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 +13 -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/{reference-service → app-shell}/tsconfig.json +6 -2
- 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 +60 -0
- package/docs/examples/club-events/manifests/club-events.yaml +225 -0
- package/docs/examples/club-events/smoke.mjs +121 -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 +90 -0
- package/docs/examples/purchasing/manifests/purchasing.yaml +341 -0
- package/docs/examples/purchasing/seed.sql +4 -0
- package/docs/examples/purchasing/smoke.mjs +177 -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 +58 -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 +164 -214
- package/docs/handbook/cloudflare/chatgpt-sites.md +4 -113
- package/docs/handbook/cloudflare/deploy-and-operate.md +38 -103
- package/docs/handbook/cloudflare/media-r2.md +62 -133
- package/docs/handbook/cloudflare/service-entry.md +210 -119
- package/docs/handbook/concepts/authorization.md +10 -123
- package/docs/handbook/concepts/four-atoms.md +9 -92
- package/docs/handbook/concepts/lifecycle-and-locales.md +9 -80
- package/docs/handbook/concepts/mcp-and-agents.md +24 -136
- package/docs/handbook/concepts/procedures-and-triggers.md +5 -162
- package/docs/handbook/concepts/runtime-and-adapters.md +15 -224
- package/docs/handbook/concepts/views.md +10 -109
- package/docs/handbook/examples/hub.md +2 -18
- package/docs/handbook/guides/adapter-guide.md +11 -0
- package/docs/handbook/guides/admin-ui.md +111 -164
- package/docs/handbook/guides/agent-setup.md +32 -27
- package/docs/handbook/guides/email.md +86 -0
- package/docs/handbook/guides/mcp-apps.md +483 -0
- package/docs/handbook/guides/native-admin.md +543 -0
- package/docs/handbook/guides/native-execution.md +132 -0
- package/docs/handbook/guides/oauth.md +161 -0
- package/docs/handbook/guides/postgres-adapters.md +56 -0
- package/docs/handbook/guides/public-pages.md +53 -0
- package/docs/handbook/guides/size-and-startup.md +9 -0
- package/docs/handbook/guides/typed-queries.md +39 -102
- package/docs/handbook/navigation.json +160 -31
- package/docs/handbook/reference/admin-descriptors.md +53 -0
- package/docs/handbook/reference/authorization.md +44 -52
- package/docs/handbook/reference/describe.md +56 -0
- package/docs/handbook/reference/diagnostics.md +15 -79
- package/docs/handbook/reference/features.md +45 -53
- package/docs/handbook/reference/manifest.md +6 -69
- package/docs/handbook/reference/procedure.md +11 -116
- package/docs/handbook/reference/schema.md +85 -185
- package/docs/handbook/reference/site-config.md +5 -65
- package/docs/handbook/reference/surface.md +389 -97
- package/docs/handbook/reference/trigger.md +54 -90
- package/docs/handbook/reference/view.md +32 -160
- package/docs/handbook/releases/index.md +120 -13
- package/docs/handbook/start/overview.md +9 -56
- package/docs/handbook/start/project-and-cli.md +40 -149
- package/docs/handbook/start/quickstart-worker.md +38 -116
- package/docs/skills/develop/SKILL.md +35 -123
- package/docs/skills/develop/mcp-app.md +37 -77
- package/docs/skills/integrate/SKILL.md +42 -84
- package/docs/skills/media-gc/SKILL.md +21 -8
- package/docs/skills/provision/SKILL.md +28 -91
- package/docs/skills/update/SKILL.md +19 -43
- package/docs/source/scripts/postgres-adapter.ts +101 -0
- package/docs/upgrade-0.1-to-0.2.md +25 -9
- package/package.json +97 -112
- package/skills/.keep +0 -0
- package/skills/README.md +67 -0
- package/skills/mantle/SKILL.md +135 -0
- package/skills/mantle/references/local-testing.md +15 -0
- package/skills/mantle/references/web.md +41 -0
- package/skills/mantle/references/website.md +49 -0
- package/dist/admin/consent.d.ts +0 -17
- package/dist/admin/consent.d.ts.map +0 -1
- package/dist/admin/consent.js +0 -17
- package/dist/admin/consent.js.map +0 -1
- package/dist/admin/createAdminSurface.d.ts +0 -25
- package/dist/admin/createAdminSurface.d.ts.map +0 -1
- package/dist/admin/createAdminSurface.js +0 -635
- package/dist/admin/createAdminSurface.js.map +0 -1
- package/dist/admin/design.d.ts +0 -7
- package/dist/admin/design.d.ts.map +0 -1
- package/dist/admin/design.js +0 -18
- package/dist/admin/design.js.map +0 -1
- package/dist/admin/developerConsole.d.ts +0 -267
- package/dist/admin/developerConsole.d.ts.map +0 -1
- package/dist/admin/developerConsole.js +0 -136
- package/dist/admin/developerConsole.js.map +0 -1
- package/dist/admin/extensions.d.ts +0 -290
- package/dist/admin/extensions.d.ts.map +0 -1
- package/dist/admin/extensions.js +0 -532
- package/dist/admin/extensions.js.map +0 -1
- package/dist/admin/identity.d.ts +0 -62
- package/dist/admin/identity.d.ts.map +0 -1
- package/dist/admin/identity.js +0 -7
- package/dist/admin/identity.js.map +0 -1
- package/dist/admin/index.d.ts +0 -7
- package/dist/admin/index.d.ts.map +0 -1
- package/dist/admin/index.js +0 -7
- package/dist/admin/index.js.map +0 -1
- package/dist/admin/procedureFlow.d.ts +0 -38
- package/dist/admin/procedureFlow.d.ts.map +0 -1
- package/dist/admin/procedureFlow.js +0 -188
- package/dist/admin/procedureFlow.js.map +0 -1
- package/dist/auth/ConsoleEmailSender.d.ts +0 -15
- package/dist/auth/ConsoleEmailSender.d.ts.map +0 -1
- package/dist/auth/ConsoleEmailSender.js +0 -19
- package/dist/auth/ConsoleEmailSender.js.map +0 -1
- package/dist/auth/appleClientSecret.d.ts +0 -75
- package/dist/auth/appleClientSecret.d.ts.map +0 -1
- package/dist/auth/appleClientSecret.js +0 -116
- package/dist/auth/appleClientSecret.js.map +0 -1
- package/dist/auth/buildAuth.d.ts +0 -4568
- package/dist/auth/buildAuth.d.ts.map +0 -1
- package/dist/auth/buildAuth.js +0 -312
- package/dist/auth/buildAuth.js.map +0 -1
- package/dist/auth/callerResolver.d.ts +0 -52
- package/dist/auth/callerResolver.d.ts.map +0 -1
- package/dist/auth/callerResolver.js +0 -52
- package/dist/auth/callerResolver.js.map +0 -1
- package/dist/auth/createAuthRoutes.d.ts +0 -22
- package/dist/auth/createAuthRoutes.d.ts.map +0 -1
- package/dist/auth/createAuthRoutes.js +0 -129
- package/dist/auth/createAuthRoutes.js.map +0 -1
- package/dist/auth/createMantleAuth.d.ts +0 -3
- package/dist/auth/createMantleAuth.d.ts.map +0 -1
- package/dist/auth/createMantleAuth.js +0 -504
- package/dist/auth/createMantleAuth.js.map +0 -1
- package/dist/auth/db.d.ts +0 -18
- package/dist/auth/db.d.ts.map +0 -1
- package/dist/auth/db.js +0 -27
- package/dist/auth/db.js.map +0 -1
- package/dist/auth/emailTemplates.d.ts +0 -7
- package/dist/auth/emailTemplates.d.ts.map +0 -1
- package/dist/auth/emailTemplates.js.map +0 -1
- package/dist/auth/index.d.ts +0 -9
- package/dist/auth/index.d.ts.map +0 -1
- package/dist/auth/index.js +0 -7
- package/dist/auth/index.js.map +0 -1
- package/dist/auth/methods.d.ts +0 -717
- package/dist/auth/methods.d.ts.map +0 -1
- package/dist/auth/methods.js +0 -321
- package/dist/auth/methods.js.map +0 -1
- package/dist/auth/oauthTokens.d.ts +0 -24
- package/dist/auth/oauthTokens.d.ts.map +0 -1
- package/dist/auth/oauthTokens.js +0 -146
- package/dist/auth/oauthTokens.js.map +0 -1
- package/dist/auth/setupIncomplete.d.ts +0 -16
- package/dist/auth/setupIncomplete.d.ts.map +0 -1
- package/dist/auth/setupIncomplete.js +0 -50
- package/dist/auth/setupIncomplete.js.map +0 -1
- package/dist/auth/types.d.ts +0 -440
- package/dist/auth/types.d.ts.map +0 -1
- package/dist/auth/types.js +0 -10
- package/dist/auth/types.js.map +0 -1
- package/dist/bun/index.d.ts +0 -21
- package/dist/bun/index.d.ts.map +0 -1
- package/dist/bun/index.js +0 -46
- package/dist/bun/index.js.map +0 -1
- package/dist/cli/emitModule.d.ts +0 -7
- package/dist/cli/emitModule.d.ts.map +0 -1
- package/dist/cli/emitModule.js +0 -127
- package/dist/cli/emitModule.js.map +0 -1
- package/dist/cli/generate.d.ts +0 -8
- package/dist/cli/generate.d.ts.map +0 -1
- package/dist/cli/generate.js +0 -391
- package/dist/cli/generate.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 -21
- package/dist/cli/main.js.map +0 -1
- package/dist/cli/preset.d.ts +0 -18
- package/dist/cli/preset.d.ts.map +0 -1
- package/dist/cli/preset.js +0 -405
- package/dist/cli/preset.js.map +0 -1
- package/dist/cloudflare/index.d.ts +0 -25
- package/dist/cloudflare/index.d.ts.map +0 -1
- package/dist/cloudflare/index.js +0 -16
- package/dist/cloudflare/index.js.map +0 -1
- package/dist/cloudflare/r2Media.d.ts.map +0 -1
- package/dist/cloudflare/r2Media.js +0 -69
- package/dist/cloudflare/r2Media.js.map +0 -1
- package/dist/core/caller.d.ts +0 -35
- package/dist/core/caller.d.ts.map +0 -1
- package/dist/core/caller.js +0 -3
- package/dist/core/caller.js.map +0 -1
- package/dist/core/createMantle.d.ts +0 -22
- package/dist/core/createMantle.d.ts.map +0 -1
- package/dist/core/createMantle.js +0 -117
- package/dist/core/createMantle.js.map +0 -1
- package/dist/core/dialect.d.ts +0 -53
- package/dist/core/dialect.d.ts.map +0 -1
- package/dist/core/dialect.js +0 -7
- package/dist/core/dialect.js.map +0 -1
- package/dist/core/driver.d.ts +0 -24
- package/dist/core/driver.d.ts.map +0 -1
- package/dist/core/driver.js +0 -2
- package/dist/core/driver.js.map +0 -1
- package/dist/core/email.d.ts +0 -17
- package/dist/core/email.d.ts.map +0 -1
- package/dist/core/email.js +0 -2
- package/dist/core/email.js.map +0 -1
- package/dist/core/index.d.ts +0 -16
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -16
- package/dist/core/index.js.map +0 -1
- package/dist/core/invocation.d.ts +0 -66
- package/dist/core/invocation.d.ts.map +0 -1
- package/dist/core/invocation.js +0 -3
- package/dist/core/invocation.js.map +0 -1
- package/dist/core/observation.d.ts +0 -3
- package/dist/core/observation.d.ts.map +0 -1
- package/dist/core/observation.js +0 -10
- package/dist/core/observation.js.map +0 -1
- package/dist/core/runtime/auth.d.ts +0 -9
- package/dist/core/runtime/auth.d.ts.map +0 -1
- package/dist/core/runtime/auth.js +0 -39
- package/dist/core/runtime/auth.js.map +0 -1
- package/dist/core/runtime/createRuntime.d.ts +0 -23
- package/dist/core/runtime/createRuntime.d.ts.map +0 -1
- package/dist/core/runtime/createRuntime.js +0 -214
- package/dist/core/runtime/createRuntime.js.map +0 -1
- package/dist/core/runtime/verifyPlan.d.ts +0 -34
- package/dist/core/runtime/verifyPlan.d.ts.map +0 -1
- package/dist/core/runtime/verifyPlan.js +0 -301
- package/dist/core/runtime/verifyPlan.js.map +0 -1
- package/dist/core/service.d.ts +0 -45
- package/dist/core/service.d.ts.map +0 -1
- package/dist/core/service.js +0 -2
- package/dist/core/service.js.map +0 -1
- package/dist/core/sessionUser.d.ts +0 -14
- package/dist/core/sessionUser.d.ts.map +0 -1
- package/dist/core/sessionUser.js +0 -4
- package/dist/core/sessionUser.js.map +0 -1
- package/dist/core/site.d.ts.map +0 -1
- package/dist/core/site.js +0 -2
- package/dist/core/site.js.map +0 -1
- package/dist/core/siteConfig.d.ts +0 -5
- package/dist/core/siteConfig.d.ts.map +0 -1
- package/dist/core/siteConfig.js +0 -24
- package/dist/core/siteConfig.js.map +0 -1
- package/dist/core/sql/allowlist.d.ts +0 -67
- package/dist/core/sql/allowlist.d.ts.map +0 -1
- package/dist/core/sql/allowlist.js +0 -737
- package/dist/core/sql/allowlist.js.map +0 -1
- package/dist/core/sql/ast.d.ts +0 -24
- package/dist/core/sql/ast.d.ts.map +0 -1
- package/dist/core/sql/ast.js +0 -32
- package/dist/core/sql/ast.js.map +0 -1
- package/dist/core/sql/compile.d.ts +0 -50
- package/dist/core/sql/compile.d.ts.map +0 -1
- package/dist/core/sql/compile.js +0 -48
- package/dist/core/sql/compile.js.map +0 -1
- package/dist/core/sql/policy.d.ts +0 -123
- package/dist/core/sql/policy.d.ts.map +0 -1
- package/dist/core/sql/policy.js +0 -398
- package/dist/core/sql/policy.js.map +0 -1
- package/dist/core/sql/positions.d.ts +0 -30
- package/dist/core/sql/positions.d.ts.map +0 -1
- package/dist/core/sql/positions.js +0 -22
- package/dist/core/sql/positions.js.map +0 -1
- package/dist/core/sql/run.d.ts +0 -68
- package/dist/core/sql/run.d.ts.map +0 -1
- package/dist/core/sql/run.js +0 -384
- package/dist/core/sql/run.js.map +0 -1
- package/dist/core/store/createStore.d.ts +0 -49
- package/dist/core/store/createStore.d.ts.map +0 -1
- package/dist/core/store/createStore.js +0 -227
- package/dist/core/store/createStore.js.map +0 -1
- package/dist/core/store/cursor.d.ts +0 -4
- package/dist/core/store/cursor.d.ts.map +0 -1
- package/dist/core/store/cursor.js +0 -22
- package/dist/core/store/cursor.js.map +0 -1
- package/dist/core/store/json.d.ts +0 -80
- package/dist/core/store/json.d.ts.map +0 -1
- package/dist/core/store/json.js +0 -342
- package/dist/core/store/json.js.map +0 -1
- package/dist/core/store.d.ts +0 -160
- package/dist/core/store.d.ts.map +0 -1
- package/dist/core/store.js +0 -2
- package/dist/core/store.js.map +0 -1
- package/dist/core/wire.d.ts +0 -20
- package/dist/core/wire.d.ts.map +0 -1
- package/dist/core/wire.js +0 -84
- package/dist/core/wire.js.map +0 -1
- package/dist/core/withCaller.d.ts +0 -24
- package/dist/core/withCaller.d.ts.map +0 -1
- package/dist/core/withCaller.js +0 -35
- package/dist/core/withCaller.js.map +0 -1
- package/dist/d1/adapter.d.ts +0 -12
- package/dist/d1/adapter.d.ts.map +0 -1
- package/dist/d1/adapter.js +0 -23
- package/dist/d1/adapter.js.map +0 -1
- package/dist/d1/codec.d.ts +0 -14
- package/dist/d1/codec.d.ts.map +0 -1
- package/dist/d1/codec.js +0 -136
- package/dist/d1/codec.js.map +0 -1
- package/dist/d1/compile/index.d.ts +0 -9
- package/dist/d1/compile/index.d.ts.map +0 -1
- package/dist/d1/compile/index.js +0 -9
- package/dist/d1/compile/index.js.map +0 -1
- package/dist/d1/dialect.d.ts +0 -4
- package/dist/d1/dialect.d.ts.map +0 -1
- package/dist/d1/dialect.js +0 -13
- package/dist/d1/dialect.js.map +0 -1
- package/dist/d1/executor.d.ts +0 -15
- package/dist/d1/executor.d.ts.map +0 -1
- package/dist/d1/executor.js +0 -96
- package/dist/d1/executor.js.map +0 -1
- package/dist/d1/index.d.ts +0 -6
- package/dist/d1/index.d.ts.map +0 -1
- package/dist/d1/index.js +0 -6
- package/dist/d1/index.js.map +0 -1
- package/dist/d1/lower.d.ts +0 -8
- package/dist/d1/lower.d.ts.map +0 -1
- package/dist/d1/lower.js +0 -167
- package/dist/d1/lower.js.map +0 -1
- package/dist/d1/media.d.ts +0 -5
- package/dist/d1/media.d.ts.map +0 -1
- package/dist/d1/media.js +0 -157
- package/dist/d1/media.js.map +0 -1
- package/dist/d1/migrations.d.ts +0 -12
- package/dist/d1/migrations.d.ts.map +0 -1
- package/dist/d1/migrations.js +0 -111
- package/dist/d1/migrations.js.map +0 -1
- package/dist/d1/print.d.ts +0 -28
- package/dist/d1/print.d.ts.map +0 -1
- package/dist/d1/print.js +0 -54
- package/dist/d1/print.js.map +0 -1
- package/dist/d1/site.d.ts +0 -17
- package/dist/d1/site.d.ts.map +0 -1
- package/dist/d1/site.js +0 -63
- package/dist/d1/site.js.map +0 -1
- package/dist/d1/storage.d.ts +0 -34
- package/dist/d1/storage.d.ts.map +0 -1
- package/dist/d1/storage.js +0 -288
- package/dist/d1/storage.js.map +0 -1
- package/dist/d1/tz.d.ts +0 -21
- package/dist/d1/tz.d.ts.map +0 -1
- package/dist/d1/tz.js +0 -54
- package/dist/d1/tz.js.map +0 -1
- package/dist/d1/validator.d.ts +0 -10
- package/dist/d1/validator.d.ts.map +0 -1
- package/dist/d1/validator.js +0 -33
- package/dist/d1/validator.js.map +0 -1
- package/dist/mcp/apps.d.ts +0 -43
- package/dist/mcp/apps.d.ts.map +0 -1
- package/dist/mcp/apps.js +0 -57
- package/dist/mcp/apps.js.map +0 -1
- package/dist/mcp/catalog.d.ts +0 -55
- package/dist/mcp/catalog.d.ts.map +0 -1
- package/dist/mcp/catalog.js +0 -81
- package/dist/mcp/catalog.js.map +0 -1
- package/dist/mcp/createMcpSurface.d.ts +0 -60
- package/dist/mcp/createMcpSurface.d.ts.map +0 -1
- package/dist/mcp/createMcpSurface.js +0 -182
- package/dist/mcp/createMcpSurface.js.map +0 -1
- package/dist/mcp/index.d.ts +0 -4
- package/dist/mcp/index.d.ts.map +0 -1
- package/dist/mcp/index.js +0 -4
- package/dist/mcp/index.js.map +0 -1
- package/dist/mcp/media.d.ts +0 -9
- package/dist/mcp/media.d.ts.map +0 -1
- package/dist/mcp/media.js +0 -33
- package/dist/mcp/media.js.map +0 -1
- package/dist/postgres/adapter.d.ts +0 -23
- package/dist/postgres/adapter.d.ts.map +0 -1
- package/dist/postgres/adapter.js +0 -50
- package/dist/postgres/adapter.js.map +0 -1
- package/dist/postgres/codec.d.ts +0 -13
- package/dist/postgres/codec.d.ts.map +0 -1
- package/dist/postgres/codec.js +0 -110
- package/dist/postgres/codec.js.map +0 -1
- package/dist/postgres/compile/index.d.ts +0 -9
- package/dist/postgres/compile/index.d.ts.map +0 -1
- package/dist/postgres/compile/index.js +0 -9
- package/dist/postgres/compile/index.js.map +0 -1
- package/dist/postgres/driver.d.ts +0 -109
- package/dist/postgres/driver.d.ts.map +0 -1
- package/dist/postgres/driver.js +0 -186
- package/dist/postgres/driver.js.map +0 -1
- package/dist/postgres/executor.d.ts +0 -28
- package/dist/postgres/executor.d.ts.map +0 -1
- package/dist/postgres/executor.js +0 -96
- package/dist/postgres/executor.js.map +0 -1
- package/dist/postgres/index.d.ts +0 -8
- package/dist/postgres/index.d.ts.map +0 -1
- package/dist/postgres/index.js +0 -8
- package/dist/postgres/index.js.map +0 -1
- package/dist/postgres/lower.d.ts +0 -6
- package/dist/postgres/lower.d.ts.map +0 -1
- package/dist/postgres/lower.js +0 -152
- package/dist/postgres/lower.js.map +0 -1
- package/dist/postgres/print.d.ts +0 -11
- package/dist/postgres/print.d.ts.map +0 -1
- package/dist/postgres/print.js +0 -108
- package/dist/postgres/print.js.map +0 -1
- package/dist/postgres/session.d.ts +0 -9
- package/dist/postgres/session.d.ts.map +0 -1
- package/dist/postgres/session.js +0 -111
- package/dist/postgres/session.js.map +0 -1
- package/dist/postgres/storage.d.ts +0 -32
- package/dist/postgres/storage.d.ts.map +0 -1
- package/dist/postgres/storage.js +0 -283
- package/dist/postgres/storage.js.map +0 -1
- package/dist/postgres/validator.d.ts +0 -13
- package/dist/postgres/validator.d.ts.map +0 -1
- package/dist/postgres/validator.js +0 -53
- package/dist/postgres/validator.js.map +0 -1
- package/dist/spec/domain/index.d.ts +0 -3
- package/dist/spec/domain/index.d.ts.map +0 -1
- package/dist/spec/domain/index.js +0 -3
- package/dist/spec/domain/index.js.map +0 -1
- package/dist/spec/domain/model/ContentState.d.ts +0 -8
- package/dist/spec/domain/model/ContentState.d.ts.map +0 -1
- package/dist/spec/domain/model/ContentState.js +0 -7
- package/dist/spec/domain/model/ContentState.js.map +0 -1
- package/dist/spec/domain/model/Entry.d.ts +0 -29
- package/dist/spec/domain/model/Entry.d.ts.map +0 -1
- package/dist/spec/domain/model/Entry.js +0 -16
- package/dist/spec/domain/model/Entry.js.map +0 -1
- package/dist/spec/domain/model/Locale.d.ts +0 -30
- package/dist/spec/domain/model/Locale.d.ts.map +0 -1
- package/dist/spec/domain/model/Locale.js +0 -33
- package/dist/spec/domain/model/Locale.js.map +0 -1
- package/dist/spec/domain/model/ManifestGrammar.d.ts.map +0 -1
- package/dist/spec/domain/model/ManifestGrammar.js +0 -153
- package/dist/spec/domain/model/ManifestGrammar.js.map +0 -1
- package/dist/spec/domain/model/MediaMimeAccept.d.ts +0 -55
- package/dist/spec/domain/model/MediaMimeAccept.d.ts.map +0 -1
- package/dist/spec/domain/model/MediaMimeAccept.js +0 -90
- package/dist/spec/domain/model/MediaMimeAccept.js.map +0 -1
- package/dist/spec/domain/model/RuntimePlan.d.ts.map +0 -1
- package/dist/spec/domain/model/RuntimePlan.js +0 -4
- package/dist/spec/domain/model/RuntimePlan.js.map +0 -1
- package/dist/spec/domain/model/SiteConfig.d.ts +0 -173
- package/dist/spec/domain/model/SiteConfig.d.ts.map +0 -1
- package/dist/spec/domain/model/SiteConfig.js +0 -13
- package/dist/spec/domain/model/SiteConfig.js.map +0 -1
- package/dist/spec/domain/model/SqlIr.d.ts.map +0 -1
- package/dist/spec/domain/model/SqlIr.js +0 -95
- package/dist/spec/domain/model/SqlIr.js.map +0 -1
- package/dist/spec/domain/model/index.d.ts +0 -14
- package/dist/spec/domain/model/index.d.ts.map +0 -1
- package/dist/spec/domain/model/index.js +0 -14
- package/dist/spec/domain/model/index.js.map +0 -1
- package/dist/spec/domain/service/CloudflareCron.d.ts.map +0 -1
- package/dist/spec/domain/service/CloudflareCron.js.map +0 -1
- package/dist/spec/domain/service/CrossSchemaChecker.d.ts +0 -34
- package/dist/spec/domain/service/CrossSchemaChecker.d.ts.map +0 -1
- package/dist/spec/domain/service/CrossSchemaChecker.js +0 -114
- package/dist/spec/domain/service/CrossSchemaChecker.js.map +0 -1
- package/dist/spec/domain/service/EntryDataValidator.d.ts +0 -56
- package/dist/spec/domain/service/EntryDataValidator.d.ts.map +0 -1
- package/dist/spec/domain/service/EntryDataValidator.js +0 -88
- package/dist/spec/domain/service/EntryDataValidator.js.map +0 -1
- package/dist/spec/domain/service/JsonSchemaToZod.d.ts +0 -29
- package/dist/spec/domain/service/JsonSchemaToZod.d.ts.map +0 -1
- package/dist/spec/domain/service/JsonSchemaToZod.js +0 -156
- package/dist/spec/domain/service/JsonSchemaToZod.js.map +0 -1
- package/dist/spec/domain/service/LifecycleStateMachine.d.ts +0 -75
- package/dist/spec/domain/service/LifecycleStateMachine.d.ts.map +0 -1
- package/dist/spec/domain/service/LifecycleStateMachine.js +0 -76
- package/dist/spec/domain/service/LifecycleStateMachine.js.map +0 -1
- package/dist/spec/domain/service/LocaleCanonicalizer.d.ts +0 -29
- package/dist/spec/domain/service/LocaleCanonicalizer.d.ts.map +0 -1
- package/dist/spec/domain/service/LocaleCanonicalizer.js +0 -96
- package/dist/spec/domain/service/LocaleCanonicalizer.js.map +0 -1
- package/dist/spec/domain/service/ManifestFieldChecks.d.ts +0 -60
- package/dist/spec/domain/service/ManifestFieldChecks.d.ts.map +0 -1
- package/dist/spec/domain/service/ManifestFieldChecks.js +0 -116
- package/dist/spec/domain/service/ManifestFieldChecks.js.map +0 -1
- package/dist/spec/domain/service/ManifestGraphValidator.d.ts +0 -15
- package/dist/spec/domain/service/ManifestGraphValidator.d.ts.map +0 -1
- package/dist/spec/domain/service/ManifestGraphValidator.js +0 -225
- package/dist/spec/domain/service/ManifestGraphValidator.js.map +0 -1
- package/dist/spec/domain/service/ManifestLinker.d.ts +0 -45
- package/dist/spec/domain/service/ManifestLinker.d.ts.map +0 -1
- package/dist/spec/domain/service/ManifestLinker.js +0 -92
- package/dist/spec/domain/service/ManifestLinker.js.map +0 -1
- package/dist/spec/domain/service/ManifestLocaleTrimmer.d.ts +0 -16
- package/dist/spec/domain/service/ManifestLocaleTrimmer.d.ts.map +0 -1
- package/dist/spec/domain/service/ManifestLocaleTrimmer.js +0 -76
- package/dist/spec/domain/service/ManifestLocaleTrimmer.js.map +0 -1
- package/dist/spec/domain/service/ManifestParser.d.ts +0 -49
- package/dist/spec/domain/service/ManifestParser.d.ts.map +0 -1
- package/dist/spec/domain/service/ManifestParser.js +0 -203
- package/dist/spec/domain/service/ManifestParser.js.map +0 -1
- package/dist/spec/domain/service/ManifestPartition.d.ts +0 -9
- package/dist/spec/domain/service/ManifestPartition.d.ts.map +0 -1
- package/dist/spec/domain/service/ManifestPartition.js +0 -19
- package/dist/spec/domain/service/ManifestPartition.js.map +0 -1
- package/dist/spec/domain/service/ManifestPathDiagnoser.d.ts +0 -33
- package/dist/spec/domain/service/ManifestPathDiagnoser.d.ts.map +0 -1
- package/dist/spec/domain/service/ManifestPathDiagnoser.js +0 -43
- package/dist/spec/domain/service/ManifestPathDiagnoser.js.map +0 -1
- package/dist/spec/domain/service/ManifestSourceSpans.d.ts +0 -10
- package/dist/spec/domain/service/ManifestSourceSpans.d.ts.map +0 -1
- package/dist/spec/domain/service/ManifestSourceSpans.js +0 -76
- package/dist/spec/domain/service/ManifestSourceSpans.js.map +0 -1
- package/dist/spec/domain/service/McpToolNaming.d.ts +0 -25
- package/dist/spec/domain/service/McpToolNaming.d.ts.map +0 -1
- package/dist/spec/domain/service/McpToolNaming.js +0 -50
- package/dist/spec/domain/service/McpToolNaming.js.map +0 -1
- package/dist/spec/domain/service/PlanFingerprint.d.ts.map +0 -1
- package/dist/spec/domain/service/PlanFingerprint.js +0 -14
- package/dist/spec/domain/service/PlanFingerprint.js.map +0 -1
- package/dist/spec/domain/service/ProcedureViewSpecChecks.d.ts +0 -4
- package/dist/spec/domain/service/ProcedureViewSpecChecks.d.ts.map +0 -1
- package/dist/spec/domain/service/ProcedureViewSpecChecks.js +0 -211
- package/dist/spec/domain/service/ProcedureViewSpecChecks.js.map +0 -1
- package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts +0 -44
- package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts.map +0 -1
- package/dist/spec/domain/service/SchemaAdminUiChecker.js +0 -333
- package/dist/spec/domain/service/SchemaAdminUiChecker.js.map +0 -1
- package/dist/spec/domain/service/SchemaIndexChecker.d.ts +0 -33
- package/dist/spec/domain/service/SchemaIndexChecker.d.ts.map +0 -1
- package/dist/spec/domain/service/SchemaIndexChecker.js +0 -256
- package/dist/spec/domain/service/SchemaIndexChecker.js.map +0 -1
- package/dist/spec/domain/service/SchemaSearchChecker.d.ts +0 -11
- package/dist/spec/domain/service/SchemaSearchChecker.d.ts.map +0 -1
- package/dist/spec/domain/service/SchemaSearchChecker.js +0 -78
- package/dist/spec/domain/service/SchemaSearchChecker.js.map +0 -1
- package/dist/spec/domain/service/SchemaSpecChecks.d.ts +0 -31
- package/dist/spec/domain/service/SchemaSpecChecks.d.ts.map +0 -1
- package/dist/spec/domain/service/SchemaSpecChecks.js +0 -445
- package/dist/spec/domain/service/SchemaSpecChecks.js.map +0 -1
- package/dist/spec/domain/service/SiteDefaultsValidator.d.ts +0 -39
- package/dist/spec/domain/service/SiteDefaultsValidator.d.ts.map +0 -1
- package/dist/spec/domain/service/SiteDefaultsValidator.js +0 -194
- package/dist/spec/domain/service/SiteDefaultsValidator.js.map +0 -1
- package/dist/spec/domain/service/SqlClassify.d.ts +0 -19
- package/dist/spec/domain/service/SqlClassify.d.ts.map +0 -1
- package/dist/spec/domain/service/SqlClassify.js +0 -42
- package/dist/spec/domain/service/SqlClassify.js.map +0 -1
- package/dist/spec/domain/service/SqlRefusal.d.ts +0 -16
- package/dist/spec/domain/service/SqlRefusal.d.ts.map +0 -1
- package/dist/spec/domain/service/SqlRefusal.js +0 -20
- package/dist/spec/domain/service/SqlRefusal.js.map +0 -1
- package/dist/spec/domain/service/SqlTypes.d.ts +0 -40
- package/dist/spec/domain/service/SqlTypes.d.ts.map +0 -1
- package/dist/spec/domain/service/SqlTypes.js +0 -110
- package/dist/spec/domain/service/SqlTypes.js.map +0 -1
- package/dist/spec/domain/service/StaffRoleHierarchy.d.ts +0 -3
- package/dist/spec/domain/service/StaffRoleHierarchy.d.ts.map +0 -1
- package/dist/spec/domain/service/StaffRoleHierarchy.js +0 -19
- package/dist/spec/domain/service/StaffRoleHierarchy.js.map +0 -1
- package/dist/spec/domain/service/TriggerGraphChecks.d.ts +0 -16
- package/dist/spec/domain/service/TriggerGraphChecks.d.ts.map +0 -1
- package/dist/spec/domain/service/TriggerGraphChecks.js +0 -337
- package/dist/spec/domain/service/TriggerGraphChecks.js.map +0 -1
- package/dist/spec/domain/service/TriggerSpecChecks.d.ts +0 -4
- package/dist/spec/domain/service/TriggerSpecChecks.d.ts.map +0 -1
- package/dist/spec/domain/service/TriggerSpecChecks.js +0 -89
- package/dist/spec/domain/service/TriggerSpecChecks.js.map +0 -1
- package/dist/spec/domain/service/ValidatedAdminUiProjection.d.ts +0 -11
- package/dist/spec/domain/service/ValidatedAdminUiProjection.d.ts.map +0 -1
- package/dist/spec/domain/service/ValidatedAdminUiProjection.js +0 -26
- package/dist/spec/domain/service/ValidatedAdminUiProjection.js.map +0 -1
- package/dist/spec/domain/service/ViewAdminUiChecker.d.ts +0 -14
- package/dist/spec/domain/service/ViewAdminUiChecker.d.ts.map +0 -1
- package/dist/spec/domain/service/ViewAdminUiChecker.js +0 -58
- package/dist/spec/domain/service/ViewAdminUiChecker.js.map +0 -1
- package/dist/spec/domain/service/index.d.ts +0 -24
- package/dist/spec/domain/service/index.d.ts.map +0 -1
- package/dist/spec/domain/service/index.js +0 -24
- package/dist/spec/domain/service/index.js.map +0 -1
- package/dist/spec/index.d.ts +0 -10
- package/dist/spec/index.d.ts.map +0 -1
- package/dist/spec/index.js +0 -12
- package/dist/spec/index.js.map +0 -1
- package/dist/spec/infrastructure/cli/parseArgsError.d.ts +0 -16
- package/dist/spec/infrastructure/cli/parseArgsError.d.ts.map +0 -1
- package/dist/spec/infrastructure/cli/parseArgsError.js +0 -34
- package/dist/spec/infrastructure/cli/parseArgsError.js.map +0 -1
- package/dist/spec/infrastructure/index.d.ts +0 -2
- package/dist/spec/infrastructure/index.d.ts.map +0 -1
- package/dist/spec/infrastructure/index.js +0 -2
- package/dist/spec/infrastructure/index.js.map +0 -1
- package/dist/spec/infrastructure/sql/PgQueryParser.d.ts +0 -18
- package/dist/spec/infrastructure/sql/PgQueryParser.d.ts.map +0 -1
- package/dist/spec/infrastructure/sql/PgQueryParser.js +0 -17
- package/dist/spec/infrastructure/sql/PgQueryParser.js.map +0 -1
- package/dist/spec/infrastructure/sql/compilePlan.d.ts +0 -37
- package/dist/spec/infrastructure/sql/compilePlan.d.ts.map +0 -1
- package/dist/spec/infrastructure/sql/compilePlan.js +0 -287
- package/dist/spec/infrastructure/sql/compilePlan.js.map +0 -1
- package/dist/spec/infrastructure/sql/compileSql.d.ts +0 -35
- package/dist/spec/infrastructure/sql/compileSql.d.ts.map +0 -1
- package/dist/spec/infrastructure/sql/compileSql.js +0 -92
- package/dist/spec/infrastructure/sql/compileSql.js.map +0 -1
- package/dist/spec/infrastructure/sql/frontEnd.d.ts +0 -8
- package/dist/spec/infrastructure/sql/frontEnd.d.ts.map +0 -1
- package/dist/spec/infrastructure/sql/frontEnd.js +0 -100
- package/dist/spec/infrastructure/sql/frontEnd.js.map +0 -1
- package/dist/spec/infrastructure/sql/index.d.ts +0 -4
- package/dist/spec/infrastructure/sql/index.d.ts.map +0 -1
- package/dist/spec/infrastructure/sql/index.js +0 -4
- package/dist/spec/infrastructure/sql/index.js.map +0 -1
- package/dist/spec/kernel/diagnostic.d.ts.map +0 -1
- package/dist/spec/kernel/diagnostic.js +0 -301
- package/dist/spec/kernel/diagnostic.js.map +0 -1
- package/dist/spec/kernel/index.d.ts +0 -8
- package/dist/spec/kernel/index.d.ts.map +0 -1
- package/dist/spec/kernel/index.js +0 -8
- package/dist/spec/kernel/index.js.map +0 -1
- package/dist/spec/usecase/EmitTypes.d.ts +0 -22
- package/dist/spec/usecase/EmitTypes.d.ts.map +0 -1
- package/dist/spec/usecase/EmitTypes.js +0 -182
- package/dist/spec/usecase/EmitTypes.js.map +0 -1
- package/dist/spec/usecase/ValidateManifestsUseCase.d.ts +0 -8
- package/dist/spec/usecase/ValidateManifestsUseCase.d.ts.map +0 -1
- package/dist/spec/usecase/ValidateManifestsUseCase.js +0 -101
- package/dist/spec/usecase/ValidateManifestsUseCase.js.map +0 -1
- package/dist/spec/usecase/dto/ValidateManifestsRequest.d.ts +0 -27
- package/dist/spec/usecase/dto/ValidateManifestsRequest.d.ts.map +0 -1
- package/dist/spec/usecase/dto/ValidateManifestsRequest.js +0 -2
- package/dist/spec/usecase/dto/ValidateManifestsRequest.js.map +0 -1
- package/dist/spec/usecase/dto/ValidateManifestsResponse.d.ts +0 -14
- package/dist/spec/usecase/dto/ValidateManifestsResponse.d.ts.map +0 -1
- package/dist/spec/usecase/dto/ValidateManifestsResponse.js +0 -2
- package/dist/spec/usecase/dto/ValidateManifestsResponse.js.map +0 -1
- package/dist/spec/usecase/dto/index.d.ts +0 -3
- package/dist/spec/usecase/dto/index.d.ts.map +0 -1
- package/dist/spec/usecase/dto/index.js +0 -3
- package/dist/spec/usecase/dto/index.js.map +0 -1
- package/dist/spec/usecase/index.d.ts +0 -10
- package/dist/spec/usecase/index.d.ts.map +0 -1
- package/dist/spec/usecase/index.js +0 -10
- package/dist/spec/usecase/index.js.map +0 -1
- package/dist/testing/cases/before-hook.d.ts +0 -4
- package/dist/testing/cases/before-hook.d.ts.map +0 -1
- package/dist/testing/cases/before-hook.js +0 -71
- package/dist/testing/cases/before-hook.js.map +0 -1
- package/dist/testing/cases/corpus.d.ts +0 -14
- package/dist/testing/cases/corpus.d.ts.map +0 -1
- package/dist/testing/cases/corpus.js +0 -93
- package/dist/testing/cases/corpus.js.map +0 -1
- package/dist/testing/cases/policy.d.ts +0 -87
- package/dist/testing/cases/policy.d.ts.map +0 -1
- package/dist/testing/cases/policy.js +0 -143
- package/dist/testing/cases/policy.js.map +0 -1
- package/dist/testing/cases/printer.d.ts +0 -4
- package/dist/testing/cases/printer.d.ts.map +0 -1
- package/dist/testing/cases/printer.js +0 -34
- package/dist/testing/cases/printer.js.map +0 -1
- package/dist/testing/cases/report-view.d.ts +0 -5
- package/dist/testing/cases/report-view.d.ts.map +0 -1
- package/dist/testing/cases/report-view.js +0 -51
- package/dist/testing/cases/report-view.js.map +0 -1
- package/dist/testing/cases/requisition.d.ts +0 -4
- package/dist/testing/cases/requisition.d.ts.map +0 -1
- package/dist/testing/cases/requisition.js +0 -38
- package/dist/testing/cases/requisition.js.map +0 -1
- package/dist/testing/cases/search-places.d.ts +0 -4
- package/dist/testing/cases/search-places.d.ts.map +0 -1
- package/dist/testing/cases/search-places.js +0 -60
- package/dist/testing/cases/search-places.js.map +0 -1
- package/dist/testing/cases/stock.d.ts +0 -4
- package/dist/testing/cases/stock.d.ts.map +0 -1
- package/dist/testing/cases/stock.js +0 -35
- package/dist/testing/cases/stock.js.map +0 -1
- package/dist/testing/cases/store.d.ts +0 -4
- package/dist/testing/cases/store.d.ts.map +0 -1
- package/dist/testing/cases/store.js +0 -100
- package/dist/testing/cases/store.js.map +0 -1
- package/dist/testing/harness.d.ts +0 -94
- package/dist/testing/harness.d.ts.map +0 -1
- package/dist/testing/harness.js +0 -168
- package/dist/testing/harness.js.map +0 -1
- package/dist/testing/index.d.ts.map +0 -1
- package/dist/testing/index.js.map +0 -1
- package/dist/testing/report.d.ts +0 -15
- package/dist/testing/report.d.ts.map +0 -1
- package/dist/testing/report.js +0 -22
- package/dist/testing/report.js.map +0 -1
- package/dist/web/createRestSurface.d.ts +0 -7
- package/dist/web/createRestSurface.d.ts.map +0 -1
- package/dist/web/createRestSurface.js +0 -41
- package/dist/web/createRestSurface.js.map +0 -1
- package/dist/web/index.d.ts +0 -2
- package/dist/web/index.d.ts.map +0 -1
- package/dist/web/index.js +0 -2
- package/dist/web/index.js.map +0 -1
- 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 -939
- 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 -244
- 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/0029-mcp-apps-interaction-contracts.md +0 -324
- package/docs/adr/0030-store.md +0 -40
- package/docs/adr/0031-host-cloud-core-contract.md +0 -102
- package/docs/adr/0032-store-centric-core-and-service-contract.md +0 -384
- package/docs/adr/0033-storage-converges-to-the-plan.md +0 -92
- package/docs/adr/0034-store-is-authored-as-sql.md +0 -192
- package/docs/adr/0035-sql-dialects.md +0 -154
- package/docs/adr/0036-host-and-dialect.md +0 -65
- package/docs/adr/0037-postgresql-is-the-reference-dialect.md +0 -125
- package/docs/adr/0038-bun-native-host.md +0 -63
- package/docs/adr/0039-postgresql-is-native.md +0 -130
- package/docs/adr/README.md +0 -98
- package/docs/adr/adr-lite-1376-admin-extensions.md +0 -330
- 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 -48
- package/docs/adr/adr-lite-909-admin-ui-kit.md +0 -37
- package/docs/examples/commerce-inventory.md +0 -498
- package/docs/examples/commerce.md +0 -254
- package/docs/examples/guarded-api.md +0 -238
- package/docs/examples/intake-hooks.md +0 -237
- package/docs/examples/intake.md +0 -127
- package/docs/examples/legal-documents.md +0 -218
- package/docs/examples/procurement.md +0 -226
- package/docs/examples/publication.md +0 -211
- package/docs/examples/reference-service/.mantle/generated/mantle.ts +0 -174
- package/docs/examples/reference-service/.mantle/generated/plan.json +0 -1936
- package/docs/examples/reference-service/README.md +0 -33
- package/docs/examples/reference-service/manifests/catalog.yaml +0 -103
- package/docs/examples/reference-service/manifests/orders.yaml +0 -120
- package/docs/examples/reference-service/mantle.config.json +0 -1
- package/docs/examples/reference-service/package.json +0 -27
- package/docs/examples/reference-service/smoke.mjs +0 -160
- package/docs/examples/reference-service/src/handlers.ts +0 -36
- package/docs/examples/reference-service/src/index.ts +0 -33
- package/docs/examples/reference-service/src/service.ts +0 -78
- package/docs/examples/reference-service/wrangler.jsonc +0 -26
- package/docs/examples/reservation.md +0 -142
- package/docs/handbook/guides/admin-extensions.md +0 -191
- /package/docs/examples/{reference-service → app-shell}/.dev.vars.example +0 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/** Application-owned Better Auth; this module loads only on an auth request. */
|
|
2
|
+
import { betterAuth } from "better-auth/minimal";
|
|
3
|
+
import { admin, emailOTP, jwt } from "better-auth/plugins";
|
|
4
|
+
import { createAccessControl } from "better-auth/plugins/access";
|
|
5
|
+
import { defaultStatements } from "better-auth/plugins/admin/access";
|
|
6
|
+
import { mcp } from "@better-auth/mcp";
|
|
7
|
+
import { cimd } from "@better-auth/cimd";
|
|
8
|
+
import { oauthGrantExtension, oauthGrantRevocation } from "@aotter/mantle/auth/oauth";
|
|
9
|
+
import { d1Adapter } from "@aotter/mantle/auth/adapter";
|
|
10
|
+
import { d1BootstrapAdmin } from "@aotter/mantle/auth/identity";
|
|
11
|
+
import { authHardening, hashEmailOtp } from "@aotter/mantle/auth/hardening";
|
|
12
|
+
import { APIError } from "better-auth/api";
|
|
13
|
+
import type { BetterAuthOptions } from "better-auth/types";
|
|
14
|
+
|
|
15
|
+
const ac = createAccessControl(defaultStatements);
|
|
16
|
+
/** Schema generation (`mantle generate --auth src/auth.ts`) reads these options without constructing Better Auth. */
|
|
17
|
+
export function authOptions(env: Env) {
|
|
18
|
+
const origin = env.PUBLIC_ORIGIN || "https://example.invalid";
|
|
19
|
+
const secret = env.BETTER_AUTH_SECRET || "schema-generation-placeholder-secret";
|
|
20
|
+
// The first verified sign-in with ADMIN_EMAIL becomes the admin while no admin exists.
|
|
21
|
+
const bootstrap = env.ADMIN_EMAIL ? d1BootstrapAdmin(env.DB, { match: "email", value: env.ADMIN_EMAIL }, () => ({ options: { plugins } })) : async () => {};
|
|
22
|
+
// Sign-up gate: runs only when Better Auth creates a user (never at schema generation). src/signup.ts loads lazily
|
|
23
|
+
// because it may import generated code; ADMIN_EMAIL is always allowed so the first officer can sign in.
|
|
24
|
+
const admit = async (user: { email: string }) => {
|
|
25
|
+
if (user.email === env.ADMIN_EMAIL?.trim().toLowerCase() || await (await import("./signup.js")).allowSignUp(env, user.email)) return;
|
|
26
|
+
// Throw rather than return false: email-OTP sign-in does not handle a refused create (it would be a 500).
|
|
27
|
+
throw new APIError("FORBIDDEN", { message: "Sign-up is limited to invited members." });
|
|
28
|
+
};
|
|
29
|
+
const plugins = [
|
|
30
|
+
// Two roles: admin (the admin layer: Admin console, admin MCP, `surface: admin`) and user (every signed-in member).
|
|
31
|
+
admin({ defaultRole: "user", adminRoles: ["admin"], ac, roles: { admin: ac.newRole(defaultStatements), user: ac.newRole({ user: [], session: [] }) } }),
|
|
32
|
+
emailOTP({ storeOTP: { hash: otp => hashEmailOtp(secret, otp) }, sendVerificationOTP: async ({ email, otp }) => {
|
|
33
|
+
// AGENT: replace with a real sender (see docs/handbook/guides/email.md) before deploying.
|
|
34
|
+
if (!/^http:\/\/(localhost|127\.0\.0\.1|\[::1\])(:\d+)?$/.test(origin)) throw new Error("Configure a production email sender.");
|
|
35
|
+
console.log(`${email}: one-time code is ${otp}`);
|
|
36
|
+
} }),
|
|
37
|
+
// --- MCP / OAuth (optional): delete these plugins, `disabledPaths` and the MCP block in service.ts if the app has no MCP.
|
|
38
|
+
jwt({ disableSettingJwtHeader: true }),
|
|
39
|
+
// Ends a user's OAuth grants (offline ones too) on password reset, admin ban or session revocation.
|
|
40
|
+
oauthGrantRevocation(),
|
|
41
|
+
mcp({ loginPage: "/admin/sign-in", consentPage: "/admin/oauth/consent", resource: `${origin}/mcp`, scopes: ["mcp"], extensions: [oauthGrantExtension], allowPublicClientPrelogin: true, clientRegistrationClientSecretExpiration: "90d" }),
|
|
42
|
+
cimd({ fetchClientMetadataResource: (input, init) => fetch(input, { ...init, redirect: "manual" }), metadataProfile: "mcp-2026-07-28" }),
|
|
43
|
+
// --- end MCP / OAuth
|
|
44
|
+
];
|
|
45
|
+
return { database: d1Adapter(env.DB), secret, baseURL: origin, basePath: "/api/auth", plugins,
|
|
46
|
+
// The jwt plugin's cookie-to-JWT endpoint is unused; OAuth tokens come from the provider.
|
|
47
|
+
disabledPaths: ["/token"],
|
|
48
|
+
// Trusted client IP header and Better Auth's database rate limiter (3 OTP requests per minute per IP).
|
|
49
|
+
...authHardening({ ipAddressHeaders: ["cf-connecting-ip"], baseURL: origin, errorURL: "/admin/sign-in" }),
|
|
50
|
+
databaseHooks: { user: { create: { before: admit, after: bootstrap }, update: { after: bootstrap } } },
|
|
51
|
+
session: { storeSessionInDatabase: true }, verification: { storeInDatabase: true },
|
|
52
|
+
} satisfies BetterAuthOptions;
|
|
53
|
+
}
|
|
54
|
+
export function createAuth(env: Env) {
|
|
55
|
+
if (!env.BETTER_AUTH_SECRET || !env.PUBLIC_ORIGIN || !env.ADMIN_EMAIL) throw new Error("Authentication setup is incomplete.");
|
|
56
|
+
return betterAuth(authOptions(env));
|
|
57
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Handlers } from "../generated/generated.js";
|
|
2
|
+
|
|
3
|
+
// `mantle generate` lists every `handler: { ref }` Procedure it needs; implement each one here.
|
|
4
|
+
// Each handler receives a Store bound to the same caller, so scope and restrict still apply.
|
|
5
|
+
export const handlers: Handlers = {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Caller } from "@aotter/mantle/contracts";
|
|
2
|
+
import { signInPage } from "./sign-in.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* App-owned routes, tried before Admin, MCP and REST. Return undefined to fall through.
|
|
6
|
+
* GET /sign-in: member sign-in (src/sign-in.ts); a member page sends anonymous visitors there with signInRedirect.
|
|
7
|
+
* AGENT: add visitor pages (HTML, SEO, feeds) and callbacks/webhooks here. A callback must verify the raw Request
|
|
8
|
+
* (signature, timestamp) before it reads the body as JSON or calls a generated Procedure.
|
|
9
|
+
*/
|
|
10
|
+
export async function appRoutes(request: Request, _env: Env, _context: { caller: () => Promise<Caller>; waitUntil: (task: Promise<unknown>) => void }): Promise<Response | undefined> {
|
|
11
|
+
if (new URL(request.url).pathname === "/sign-in" && request.method === "GET") return signInPage();
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scheduled work is app code: list each cron in wrangler.jsonc `triggers.crons` and branch on `controller.cron`
|
|
3
|
+
* (`toCloudflareCron` from "@aotter/mantle/cron" converts a standard expression).
|
|
4
|
+
* AGENT: call the Store or a generated Procedure here; schedules are not manifest Triggers.
|
|
5
|
+
*/
|
|
6
|
+
export async function scheduled(controller: ScheduledController, _env: Env): Promise<void> {
|
|
7
|
+
throw new Error(`No application schedule runs on '${controller.cron}'`);
|
|
8
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/** One Worker fetch: Better Auth routes, Admin console + API, MCP, generated REST, then the Admin shell. */
|
|
2
|
+
import { authLoader, resolveCaller } from "@aotter/mantle/auth";
|
|
3
|
+
import { authRoutes } from "@aotter/mantle/auth/routes";
|
|
4
|
+
import { withAuthTasks } from "@aotter/mantle/auth/hardening";
|
|
5
|
+
import { checkOrigin, surfaceFailure, type Caller } from "@aotter/mantle/contracts";
|
|
6
|
+
import { admin, adminShell } from "@aotter/mantle-admin/server";
|
|
7
|
+
import { entries } from "@aotter/mantle-admin/server/entries";
|
|
8
|
+
import { siteRoutes } from "@aotter/mantle-admin/server/site";
|
|
9
|
+
import { webmcpRoutes } from "@aotter/mantle-admin/server/webmcp";
|
|
10
|
+
import { adminMcpApps } from "@aotter/mantle-admin/mcp";
|
|
11
|
+
import { mcp as serveMcp } from "@aotter/mantle/mcp";
|
|
12
|
+
import type { Handle } from "@aotter/mantle/driver/d1";
|
|
13
|
+
import { adminBindings } from "../generated/admin-bindings.js";
|
|
14
|
+
import { rest } from "../generated/rest.js";
|
|
15
|
+
import { tools } from "../generated/mcp.js";
|
|
16
|
+
import { mcpAppCatalogues } from "../generated/admin-descriptors.js";
|
|
17
|
+
import type { Handlers } from "../generated/generated.js";
|
|
18
|
+
import { handlers } from "./handlers.js";
|
|
19
|
+
import { appRoutes } from "./routes.js";
|
|
20
|
+
|
|
21
|
+
let auth: ReturnType<typeof authLoader<ReturnType<typeof import("./auth.js").createAuth>>> | undefined;
|
|
22
|
+
const authorities = new WeakMap<Request, () => Promise<Caller>>();
|
|
23
|
+
const options = { db: (env: Env) => env.DB, caller: (request: Request) => authorities.get(request)!(), handlers };
|
|
24
|
+
let serveAdmin: ReturnType<typeof admin<Env, Handle, Handlers>> | undefined;
|
|
25
|
+
let serveMcpHandler: ReturnType<typeof serveMcp<Env, Handle, Handlers>> | undefined;
|
|
26
|
+
const serveRest = rest(options);
|
|
27
|
+
|
|
28
|
+
export async function fetchService(request: Request, env: Env, context: ExecutionContext): Promise<Response> {
|
|
29
|
+
auth ??= authLoader(() => import("./auth.js").then(m => m.createAuth(env)));
|
|
30
|
+
const headers = new Headers();
|
|
31
|
+
let authority: Promise<Caller> | undefined;
|
|
32
|
+
// One Caller per request, resolved on first use; every surface below shares it.
|
|
33
|
+
const caller = () => authority ??= resolveCaller(request, auth!, { audience: `${env.PUBLIC_ORIGIN}/mcp`, responseHeaders: headers }).then(value => { checkOrigin(request, value); return value; });
|
|
34
|
+
authorities.set(request, caller);
|
|
35
|
+
const respond = (response: Response) => {
|
|
36
|
+
if (!headers.has("set-cookie")) return response;
|
|
37
|
+
// Copy first: some responses (Response.redirect, fetched ones) have immutable headers.
|
|
38
|
+
const copy = new Response(response.body, response);
|
|
39
|
+
for (const cookie of headers.getSetCookie()) copy.headers.append("set-cookie", cookie);
|
|
40
|
+
return copy;
|
|
41
|
+
};
|
|
42
|
+
try {
|
|
43
|
+
const ownAuth = await withAuthTasks(context.waitUntil.bind(context), () => authRoutes(auth!, { methods: [{ kind: "email-otp" }], resolver: caller })(request));
|
|
44
|
+
if (ownAuth) return respond(ownAuth);
|
|
45
|
+
const url = new URL(request.url);
|
|
46
|
+
const own = await appRoutes(request, env, { caller, waitUntil: context.waitUntil.bind(context) });
|
|
47
|
+
if (own) return respond(own);
|
|
48
|
+
let response: Response | undefined;
|
|
49
|
+
if (url.pathname === "/admin/api" || url.pathname.startsWith("/admin/api/")) {
|
|
50
|
+
if (!serveAdmin) {
|
|
51
|
+
const bindings = adminBindings({ handlers });
|
|
52
|
+
const adminOptions = { ...options, mcpEndpoints: { public: "/mcp", admin: "/mcp/admin" },
|
|
53
|
+
identity: { directory: async ({ caller, request, db }: { caller: Caller; request: Request; db: Handle }) => (await import("@aotter/mantle/auth/identity")).d1Identity(db, await auth!.get(), caller, request.headers) } };
|
|
54
|
+
serveAdmin = admin(bindings.metadata, bindings.views, bindings.operations, { ...adminOptions, developerViews: bindings.developerViews,
|
|
55
|
+
routes: [...entries(bindings.schemas, bindings.adapter), ...siteRoutes(adminOptions), ...webmcpRoutes(bindings.metadata.webmcp, tools, handlers)] });
|
|
56
|
+
}
|
|
57
|
+
response = await serveAdmin(request, env);
|
|
58
|
+
} else if (/^\/mcp(?:\/admin)?\/*$/.test(url.pathname)) {
|
|
59
|
+
// --- MCP (optional): delete this branch with the MCP plugins in auth.ts if the app has no MCP.
|
|
60
|
+
serveMcpHandler ??= serveMcp(tools, { ...options, apps: { admin: adminMcpApps({ catalogue: mcpAppCatalogues.admin }) } });
|
|
61
|
+
response = await serveMcpHandler(request, env);
|
|
62
|
+
} else {
|
|
63
|
+
response = await serveRest(request, env);
|
|
64
|
+
}
|
|
65
|
+
if (response) return respond(response);
|
|
66
|
+
const shell = await adminShell(request, path => env.ASSETS.fetch(new Request(new URL("/admin/" + path, url), request)));
|
|
67
|
+
if (shell) return shell;
|
|
68
|
+
return new Response("Not found", { status: 404, headers: { "cache-control": "no-store" } });
|
|
69
|
+
} catch (error) { return surfaceFailure(error); }
|
|
70
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Member sign-in for app pages (Admin has its own at /admin/sign-in). Email one-time code through Better Auth's own
|
|
3
|
+
* endpoints, then back to `?return=`. A member page calls `signInRedirect(request)` when `await caller()` is anonymous.
|
|
4
|
+
* AGENT: unstyled on purpose; add the app's styling and copy. Delete this file and its route if the app has no
|
|
5
|
+
* member pages.
|
|
6
|
+
*/
|
|
7
|
+
export function signInRedirect(request: Request): Response {
|
|
8
|
+
const url = new URL(request.url);
|
|
9
|
+
return new Response(null, { status: 303, headers: { location: `/sign-in?return=${encodeURIComponent(url.pathname + url.search)}`, "cache-control": "no-store" } });
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function signInPage(): Response {
|
|
13
|
+
return new Response(`<!doctype html>
|
|
14
|
+
<html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
|
15
|
+
<meta name="robots" content="noindex"><title>Sign in</title>
|
|
16
|
+
<h1>Sign in</h1>
|
|
17
|
+
<form id="email" action="/api/auth/email-otp/send-verification-otp" method="post"><label>Email <input type="email" name="email" autocomplete="email" required></label> <button>Send code</button></form>
|
|
18
|
+
<form id="code" action="/api/auth/sign-in/email-otp" method="post" hidden><label>Code <input name="otp" inputmode="numeric" autocomplete="one-time-code" required></label> <button>Sign in</button></form>
|
|
19
|
+
<p id="status" role="status"></p>
|
|
20
|
+
<script type="module">
|
|
21
|
+
const status = document.getElementById("status"), email = document.getElementById("email"), code = document.getElementById("code");
|
|
22
|
+
// Only same-site paths: an open redirect would hand the fresh session's tab to another site.
|
|
23
|
+
const back = new URLSearchParams(location.search).get("return");
|
|
24
|
+
const target = back && new URL(back, location.origin).origin === location.origin ? back : "/";
|
|
25
|
+
// Better Auth takes JSON: each form keeps its action and method, and the script sends its fields as JSON there.
|
|
26
|
+
const post = (form, body) => fetch(form.action, { method: form.method, headers: { "content-type": "application/json" }, body: JSON.stringify(body) });
|
|
27
|
+
email.onsubmit = async event => {
|
|
28
|
+
event.preventDefault();
|
|
29
|
+
const response = await post(email, { email: email.email.value, type: "sign-in" });
|
|
30
|
+
status.textContent = response.ok ? "We sent a code to your email." : "Could not send a code. Try again later.";
|
|
31
|
+
code.hidden = !response.ok;
|
|
32
|
+
};
|
|
33
|
+
code.onsubmit = async event => {
|
|
34
|
+
event.preventDefault();
|
|
35
|
+
const response = await post(code, { email: email.email.value, otp: code.otp.value });
|
|
36
|
+
if (response.ok) location.assign(target);
|
|
37
|
+
else status.textContent = response.status === 403 ? "This email cannot sign up here." : "Wrong or expired code.";
|
|
38
|
+
};
|
|
39
|
+
</script>
|
|
40
|
+
`, { headers: { "content-type": "text/html; charset=utf-8", "cache-control": "no-store" } });
|
|
41
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Who may create an account. Better Auth calls this (through `databaseHooks.user.create.before` in auth.ts) only when a
|
|
3
|
+
* verified email has no user yet; existing users and ADMIN_EMAIL always sign in. Return false to refuse sign-up (403).
|
|
4
|
+
* AGENT: for invite-only or members-only sign-up, look the email up here (e.g. an allowlist Schema read through the Store).
|
|
5
|
+
*/
|
|
6
|
+
export async function allowSignUp(_env: Env, _email: string): Promise<boolean> {
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
"compilerOptions": {
|
|
3
3
|
"target": "ES2022",
|
|
4
4
|
"lib": [
|
|
5
|
-
"ES2023"
|
|
5
|
+
"ES2023",
|
|
6
|
+
"DOM"
|
|
6
7
|
],
|
|
8
|
+
"jsx": "react-jsx",
|
|
7
9
|
"module": "ESNext",
|
|
8
10
|
"moduleResolution": "Bundler",
|
|
9
11
|
"strict": true,
|
|
@@ -16,7 +18,9 @@
|
|
|
16
18
|
]
|
|
17
19
|
},
|
|
18
20
|
"include": [
|
|
21
|
+
"worker-configuration.d.ts",
|
|
19
22
|
"src/**/*.ts",
|
|
20
|
-
"
|
|
23
|
+
"src/**/*.tsx",
|
|
24
|
+
"generated/**/*.ts"
|
|
21
25
|
]
|
|
22
26
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
// Generated by Wrangler by running `wrangler types --include-runtime=false` (hash: 1091fee65f95f8f0fa1b8353572138b4)
|
|
3
|
+
interface __BaseEnv_Env {
|
|
4
|
+
DB: D1Database;
|
|
5
|
+
ASSETS: Fetcher;
|
|
6
|
+
BETTER_AUTH_SECRET: string;
|
|
7
|
+
PUBLIC_ORIGIN: string;
|
|
8
|
+
ADMIN_EMAIL: string;
|
|
9
|
+
}
|
|
10
|
+
declare namespace Cloudflare {
|
|
11
|
+
interface GlobalProps {
|
|
12
|
+
mainModule: typeof import("./dist/worker/index");
|
|
13
|
+
}
|
|
14
|
+
interface Env extends __BaseEnv_Env {}
|
|
15
|
+
}
|
|
16
|
+
interface Env extends __BaseEnv_Env {}
|
|
17
|
+
type StringifyValues<EnvType extends Record<string, unknown>> = {
|
|
18
|
+
[Binding in keyof EnvType]: EnvType[Binding] extends string ? EnvType[Binding] : string;
|
|
19
|
+
};
|
|
20
|
+
declare namespace NodeJS {
|
|
21
|
+
interface ProcessEnv extends StringifyValues<Pick<Cloudflare.Env, "BETTER_AUTH_SECRET" | "PUBLIC_ORIGIN" | "ADMIN_EMAIL">> {}
|
|
22
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "node_modules/wrangler/config-schema.json",
|
|
3
|
+
"name": "mantle-app",
|
|
4
|
+
"main": "dist/worker/index.js",
|
|
5
|
+
"compatibility_date": "2026-09-01",
|
|
6
|
+
"compatibility_flags": [
|
|
7
|
+
"nodejs_compat",
|
|
8
|
+
"global_fetch_strictly_public"
|
|
9
|
+
],
|
|
10
|
+
"secrets": {
|
|
11
|
+
"required": [
|
|
12
|
+
"BETTER_AUTH_SECRET",
|
|
13
|
+
"PUBLIC_ORIGIN",
|
|
14
|
+
"ADMIN_EMAIL"
|
|
15
|
+
]
|
|
16
|
+
},
|
|
17
|
+
"observability": {
|
|
18
|
+
"enabled": true,
|
|
19
|
+
"logs": {
|
|
20
|
+
"enabled": true,
|
|
21
|
+
"head_sampling_rate": 1
|
|
22
|
+
},
|
|
23
|
+
"traces": {
|
|
24
|
+
"enabled": true,
|
|
25
|
+
"head_sampling_rate": 0.01
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"d1_databases": [
|
|
29
|
+
{
|
|
30
|
+
"binding": "DB",
|
|
31
|
+
"database_name": "mantle-app"
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"assets": {
|
|
35
|
+
"directory": "dist/client",
|
|
36
|
+
"binding": "ASSETS",
|
|
37
|
+
"run_worker_first": true,
|
|
38
|
+
"html_handling": "none"
|
|
39
|
+
},
|
|
40
|
+
"triggers": {
|
|
41
|
+
"crons": []
|
|
42
|
+
},
|
|
43
|
+
"no_bundle": true,
|
|
44
|
+
"find_additional_modules": true,
|
|
45
|
+
"base_dir": "dist/worker",
|
|
46
|
+
"build": {
|
|
47
|
+
"command": "mantle bundle src/index.ts dist",
|
|
48
|
+
"watch_dir": [
|
|
49
|
+
"src",
|
|
50
|
+
"generated"
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
"rules": [
|
|
54
|
+
{
|
|
55
|
+
"type": "ESModule",
|
|
56
|
+
"globs": [
|
|
57
|
+
"**/*.js"
|
|
58
|
+
],
|
|
59
|
+
"fallthrough": true
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Club events
|
|
2
|
+
|
|
3
|
+
A club's event sign-up. Officers (the `admin` layer) create events with their seats in the Admin console; signed-in
|
|
4
|
+
members list events, register, and see and cancel only their own registrations, from a page or through their own AI
|
|
5
|
+
over MCP. Only members the officers listed in Admin can sign up. Officers see every registration in Admin. Seats never oversell, even when members race for the last one.
|
|
6
|
+
|
|
7
|
+
## Capabilities shown
|
|
8
|
+
|
|
9
|
+
- **Member-owned rows**: `restrict: { registrations: "author_id = auth.uid()" }` on the `my-registrations` View and the
|
|
10
|
+
`cancel-registration` Procedure (`manifests/club-events.yaml`). Registrations have no field `scope`, which would hide
|
|
11
|
+
rows from officers too; Admin lists all of them.
|
|
12
|
+
- **No duplicates**: `uniqueIndexes: [[eventId, member]]`. Native `authorId` is not allowed in a unique index, so the
|
|
13
|
+
`register` handler writes `member` from the verified caller (`src/handlers.ts`); a second registration is 409.
|
|
14
|
+
- **Capacity that never oversells**: officers edit `capacity`; `seats_taken` is a `readOnly` property, so Admin's
|
|
15
|
+
generic edit never writes it, and `checks: ["seats_taken <= capacity"]` guards both. `register-write` inserts the
|
|
16
|
+
registration and adds to `seats_taken` in one program, so a full event fails the check and the insert rolls back;
|
|
17
|
+
`cancel-registration` returns the seat in the same program as the delete.
|
|
18
|
+
- **A `ref` handler that checks before writing**: `register` refuses a missing (404) or closed (409) event, then calls
|
|
19
|
+
the internal SQL Procedure. It does not pre-check seats: the database check is what holds under concurrency.
|
|
20
|
+
- **Who registered**: the handler stores a `memberName` snapshot from Better Auth's `user` row, since `member` is an
|
|
21
|
+
opaque id; Admin's registration list shows it.
|
|
22
|
+
- **Members-only sign-up**: officers list members' emails in the `members` Schema in Admin (unique, lower case by a
|
|
23
|
+
Schema check; no View or Trigger exposes it). `src/signup.ts` replaces the shell's allow-all `allowSignUp` with a
|
|
24
|
+
Store lookup as a system caller, so any other email gets 403 at sign-in and no account. To invite another officer
|
|
25
|
+
through Admin, list their email in `members` first.
|
|
26
|
+
- **Member MCP tool**: the `register-mcp` Trigger (`surface: public`) exposes `register` on `/mcp`, so the member's AI
|
|
27
|
+
registers with the member's own sign-in.
|
|
28
|
+
|
|
29
|
+
## Combine with
|
|
30
|
+
|
|
31
|
+
- Need members to see only their own rows? Add a `restrict: { <schema>: "author_id = auth.uid()" }` like `my-registrations`.
|
|
32
|
+
- Need a stock, quota or budget that never goes negative? A `readOnly` counter, a Schema `checks`, and a relative
|
|
33
|
+
`UPDATE ... SET n = n + 1` in the same Procedure as the write.
|
|
34
|
+
- Need invite-only sign-up? club-events' members allowlist + `src/signup.ts`.
|
|
35
|
+
- Need "one per member"? A handler-written column from `caller.subject` in `uniqueIndexes`.
|
|
36
|
+
|
|
37
|
+
## Run it
|
|
38
|
+
|
|
39
|
+
```sh
|
|
40
|
+
cp -R node_modules/@aotter/mantle/docs/examples/app-shell/. my-app/
|
|
41
|
+
cp -R node_modules/@aotter/mantle/docs/examples/club-events/. my-app/
|
|
42
|
+
cd my-app && pnpm install && pnpm generate && pnpm types && pnpm check
|
|
43
|
+
cp .dev.vars.example .dev.vars && pnpm db:init && pnpm dev
|
|
44
|
+
pnpm smoke
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Members use `GET /api/views/events`, `GET /api/views/my-registrations`, `POST /api/registrations { eventId }` and
|
|
48
|
+
`POST /api/registrations/cancel { id }`. AGENT: build the member pages in `src/routes.ts` (the shell's Admin console is
|
|
49
|
+
for officers only).
|
|
50
|
+
|
|
51
|
+
## What `pnpm smoke` proves
|
|
52
|
+
|
|
53
|
+
Anonymous calls are 401. `ADMIN_EMAIL` signs in with an empty members list; an email not on the list gets a code but
|
|
54
|
+
its sign-in is 403 and creates no user row. The officer adds the members in Admin (a mixed-case email is refused), and
|
|
55
|
+
they sign in. An officer creates events in Admin. A member registers (seats 3 → 2); registering twice is 409
|
|
56
|
+
and takes no seat; a closed event is 409 and a missing one 404. Another member cannot see or cancel the registration
|
|
57
|
+
(cancel is 409; the row and seats stay). Four members race for a 1-seat event: exactly one succeeds, the rest are 409,
|
|
58
|
+
no seat is left and only one row exists. Cancelling returns the seat. A member registers through the MCP tool.
|
|
59
|
+
The officer sees every registration, with the member's name, through Admin's API; a member gets 403 on Admin.
|
|
60
|
+
Admin cannot write `seats_taken` or lower `capacity` below the seats taken.
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
# Club events: officers (admin) create events in Admin; signed-in members register and cancel their own seats.
|
|
2
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
3
|
+
kind: Schema
|
|
4
|
+
metadata: { name: events }
|
|
5
|
+
spec:
|
|
6
|
+
title: Events
|
|
7
|
+
lifecycle: operational
|
|
8
|
+
# Registering adds to seats_taken in the same program as the insert: past capacity the check fails and the insert rolls back.
|
|
9
|
+
# It also refuses an officer lowering capacity below the seats already taken.
|
|
10
|
+
checks: ["seats_taken <= capacity"]
|
|
11
|
+
indexes: [[startsAt, id]]
|
|
12
|
+
uiSchema: { list: { primaryField: title, columns: [startsAt, capacity, seats_taken, closed] } }
|
|
13
|
+
schema:
|
|
14
|
+
type: object
|
|
15
|
+
required: [title, startsAt, capacity, closed]
|
|
16
|
+
properties:
|
|
17
|
+
title: { type: string, minLength: 1 }
|
|
18
|
+
startsAt: { type: string, format: date-time }
|
|
19
|
+
capacity: { type: integer, minimum: 0, title: Capacity }
|
|
20
|
+
# readOnly: server-maintained. Admin's generic create/edit never writes it; only register/cancel change it.
|
|
21
|
+
seats_taken: { type: integer, minimum: 0, default: 0, readOnly: true, title: Seats taken }
|
|
22
|
+
closed: { type: boolean, default: false }
|
|
23
|
+
---
|
|
24
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
25
|
+
kind: Schema
|
|
26
|
+
metadata: { name: registrations }
|
|
27
|
+
spec:
|
|
28
|
+
title: Registrations
|
|
29
|
+
lifecycle: operational
|
|
30
|
+
# No `scope` here: a field scope would hide rows from officers too. Members are narrowed by `restrict` below.
|
|
31
|
+
# `member` is written by the register handler from the caller; native authorId cannot be in a unique index.
|
|
32
|
+
uniqueIndexes: [[eventId, member]]
|
|
33
|
+
indexes: [[authorId, createdAt, id]]
|
|
34
|
+
# Officers read registrations in Admin; generic edits would bypass seats_taken, so writes go through the Procedures.
|
|
35
|
+
uiSchema: { list: { primaryField: eventId, columns: [memberName] } }
|
|
36
|
+
schema:
|
|
37
|
+
type: object
|
|
38
|
+
readOnly: true
|
|
39
|
+
required: [eventId, member]
|
|
40
|
+
properties:
|
|
41
|
+
eventId: { type: string, x-mantle-ref: events }
|
|
42
|
+
member: { type: string }
|
|
43
|
+
# A snapshot of the member's name at sign-up, so officers see who registered (member is an opaque id).
|
|
44
|
+
memberName: { type: string, maxLength: 200 }
|
|
45
|
+
---
|
|
46
|
+
# The sign-up allowlist: officers add members in Admin; src/signup.ts lets only these emails create an account.
|
|
47
|
+
# No View or Trigger reads it, so it stays out of the public API and MCP.
|
|
48
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
49
|
+
kind: Schema
|
|
50
|
+
metadata: { name: members }
|
|
51
|
+
spec:
|
|
52
|
+
title: Members
|
|
53
|
+
lifecycle: operational
|
|
54
|
+
uniqueIndexes: [[email]]
|
|
55
|
+
# Better Auth lowercases emails; the check refuses a mixed-case entry that would never match.
|
|
56
|
+
checks: ["email = lower(email)"]
|
|
57
|
+
uiSchema: { list: { primaryField: email, columns: [name] } }
|
|
58
|
+
schema:
|
|
59
|
+
type: object
|
|
60
|
+
required: [email]
|
|
61
|
+
properties:
|
|
62
|
+
email: { type: string, format: email, maxLength: 254, title: Email }
|
|
63
|
+
name: { type: string, maxLength: 200, title: Name }
|
|
64
|
+
---
|
|
65
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
66
|
+
kind: View
|
|
67
|
+
metadata: { name: events }
|
|
68
|
+
spec:
|
|
69
|
+
surface: public
|
|
70
|
+
description: Upcoming club events with the seats still available.
|
|
71
|
+
requires: { auth: { all: [ctx.user] } }
|
|
72
|
+
sql: |
|
|
73
|
+
SELECT id, title, startsAt AS "startsAt", capacity - seats_taken AS seats_left, closed FROM events ORDER BY startsAt, id
|
|
74
|
+
---
|
|
75
|
+
# Only the caller's own rows: restrict narrows registrations to author_id = the caller.
|
|
76
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
77
|
+
kind: View
|
|
78
|
+
metadata: { name: my-registrations }
|
|
79
|
+
spec:
|
|
80
|
+
surface: public
|
|
81
|
+
description: The signed-in member's registrations.
|
|
82
|
+
requires: { auth: { all: [ctx.user] } }
|
|
83
|
+
restrict: { registrations: "author_id = auth.uid()" }
|
|
84
|
+
sql: |
|
|
85
|
+
SELECT r.id, r.eventId AS "eventId", e.title, e.startsAt AS "startsAt"
|
|
86
|
+
FROM registrations r JOIN events e ON e.id = r.eventId
|
|
87
|
+
ORDER BY r.created_at DESC, r.id DESC
|
|
88
|
+
---
|
|
89
|
+
# The member-facing entry: a ref handler checks the event, then runs register-write.
|
|
90
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
91
|
+
kind: Procedure
|
|
92
|
+
metadata: { name: register }
|
|
93
|
+
spec:
|
|
94
|
+
title: Register for an event
|
|
95
|
+
description: Take one seat at a club event for the signed-in member. Fails when the event is closed, full or already registered.
|
|
96
|
+
requires: { auth: { all: [ctx.user] } }
|
|
97
|
+
input:
|
|
98
|
+
type: object
|
|
99
|
+
required: [eventId]
|
|
100
|
+
additionalProperties: false
|
|
101
|
+
properties:
|
|
102
|
+
eventId: { type: string }
|
|
103
|
+
output: { type: object }
|
|
104
|
+
handler: { ref: register }
|
|
105
|
+
---
|
|
106
|
+
# Internal (no Trigger): one program, so a failed seat check rolls back the insert too.
|
|
107
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
108
|
+
kind: Procedure
|
|
109
|
+
metadata: { name: register-write }
|
|
110
|
+
spec:
|
|
111
|
+
requires: { auth: { all: [ctx.user] } }
|
|
112
|
+
input:
|
|
113
|
+
type: object
|
|
114
|
+
required: [eventId, member]
|
|
115
|
+
properties:
|
|
116
|
+
eventId: { type: string }
|
|
117
|
+
member: { type: string }
|
|
118
|
+
memberName: { type: string, maxLength: 200 }
|
|
119
|
+
output: { type: object }
|
|
120
|
+
handler:
|
|
121
|
+
sql: |
|
|
122
|
+
INSERT INTO registrations (eventId, member, memberName) VALUES (input.eventId, input.member, input.memberName) RETURNING id, eventId AS "eventId";
|
|
123
|
+
UPDATE events SET seats_taken = seats_taken + 1 WHERE id = input.eventId RETURNING capacity - seats_taken AS seats_left
|
|
124
|
+
---
|
|
125
|
+
# restrict: another member's registration is invisible here, so the UPDATE matches no row -> CONFLICT, nothing changes.
|
|
126
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
127
|
+
kind: Procedure
|
|
128
|
+
metadata: { name: cancel-registration }
|
|
129
|
+
spec:
|
|
130
|
+
title: Cancel a registration
|
|
131
|
+
description: Cancel one of the signed-in member's registrations and return the seat.
|
|
132
|
+
requires: { auth: { all: [ctx.user] } }
|
|
133
|
+
restrict: { registrations: "author_id = auth.uid()" }
|
|
134
|
+
input:
|
|
135
|
+
type: object
|
|
136
|
+
required: [id]
|
|
137
|
+
additionalProperties: false
|
|
138
|
+
properties:
|
|
139
|
+
id: { type: string }
|
|
140
|
+
output: { type: object }
|
|
141
|
+
handler:
|
|
142
|
+
sql: |
|
|
143
|
+
UPDATE events SET seats_taken = seats_taken - 1 WHERE id = (SELECT eventId FROM registrations WHERE id = input.id) RETURNING capacity - seats_taken AS seats_left;
|
|
144
|
+
DELETE FROM registrations WHERE id = input.id RETURNING id
|
|
145
|
+
---
|
|
146
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
147
|
+
kind: Trigger
|
|
148
|
+
metadata: { name: register-http }
|
|
149
|
+
spec:
|
|
150
|
+
source: { kind: http, method: POST, path: /api/registrations }
|
|
151
|
+
target: { procedure: register }
|
|
152
|
+
---
|
|
153
|
+
# "Your AI" registers for the member over the member MCP endpoint (/mcp) with the member's own sign-in.
|
|
154
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
155
|
+
kind: Trigger
|
|
156
|
+
metadata: { name: register-mcp }
|
|
157
|
+
spec:
|
|
158
|
+
source: { kind: mcp, surface: public }
|
|
159
|
+
target: { procedure: register }
|
|
160
|
+
---
|
|
161
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
162
|
+
kind: Trigger
|
|
163
|
+
metadata: { name: cancel-registration-http }
|
|
164
|
+
spec:
|
|
165
|
+
source: { kind: http, method: POST, path: /api/registrations/cancel }
|
|
166
|
+
target: { procedure: cancel-registration }
|
|
167
|
+
---
|
|
168
|
+
# Officers add records through declared Procedures: operational collections have no generic create in Admin.
|
|
169
|
+
# collectionAction puts the Procedure's button and input form in that collection's list header; the admin MCP
|
|
170
|
+
# Trigger is what makes it an Admin operation (and lets the officers' AI do the same).
|
|
171
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
172
|
+
kind: Procedure
|
|
173
|
+
metadata: { name: create-event }
|
|
174
|
+
spec:
|
|
175
|
+
title: New event
|
|
176
|
+
description: Create a club event with its capacity.
|
|
177
|
+
requires: { auth: { all: [ctx.admin] } }
|
|
178
|
+
uiSchema: { collectionAction: events }
|
|
179
|
+
input:
|
|
180
|
+
type: object
|
|
181
|
+
required: [title, startsAt, capacity]
|
|
182
|
+
additionalProperties: false
|
|
183
|
+
properties:
|
|
184
|
+
title: { type: string, minLength: 1, maxLength: 200, title: Title }
|
|
185
|
+
startsAt: { type: string, format: date-time, title: Starts at }
|
|
186
|
+
capacity: { type: integer, minimum: 1, title: Capacity }
|
|
187
|
+
output: { type: object }
|
|
188
|
+
handler:
|
|
189
|
+
sql: |
|
|
190
|
+
INSERT INTO events (title, startsAt, capacity, closed, seats_taken) VALUES (input.title, input.startsAt, input.capacity, false, 0) RETURNING id
|
|
191
|
+
---
|
|
192
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
193
|
+
kind: Procedure
|
|
194
|
+
metadata: { name: add-member }
|
|
195
|
+
spec:
|
|
196
|
+
title: Add a member
|
|
197
|
+
description: Let an email sign up as a club member.
|
|
198
|
+
requires: { auth: { all: [ctx.admin] } }
|
|
199
|
+
uiSchema: { collectionAction: members }
|
|
200
|
+
input:
|
|
201
|
+
type: object
|
|
202
|
+
required: [email]
|
|
203
|
+
additionalProperties: false
|
|
204
|
+
properties:
|
|
205
|
+
email: { type: string, format: email, maxLength: 254, title: Email }
|
|
206
|
+
name: { type: string, maxLength: 200, title: Name }
|
|
207
|
+
output: { type: object }
|
|
208
|
+
handler:
|
|
209
|
+
# Better Auth lowercases emails, so the list stores them lowercased too.
|
|
210
|
+
sql: |
|
|
211
|
+
INSERT INTO members (email, name) VALUES (lower(input.email), input.name) RETURNING id
|
|
212
|
+
---
|
|
213
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
214
|
+
kind: Trigger
|
|
215
|
+
metadata: { name: create-event-admin }
|
|
216
|
+
spec:
|
|
217
|
+
source: { kind: mcp, surface: admin }
|
|
218
|
+
target: { procedure: create-event }
|
|
219
|
+
---
|
|
220
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
221
|
+
kind: Trigger
|
|
222
|
+
metadata: { name: add-member-admin }
|
|
223
|
+
spec:
|
|
224
|
+
source: { kind: mcp, surface: admin }
|
|
225
|
+
target: { procedure: add-member }
|