@aotter/mantle 0.2.0-alpha.1 → 0.2.0-alpha.11
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 +180 -45
- package/dist/auth/adapter.d.ts +32 -0
- package/dist/auth/adapter.js +261 -0
- package/dist/auth/admin.d.ts +3 -0
- package/dist/auth/admin.js +18 -0
- package/dist/auth/caller.d.ts +86 -0
- package/dist/auth/caller.js +128 -0
- package/dist/auth/{createAuthRoutes.js → consent.js} +26 -54
- package/dist/auth/hardening.d.ts +24 -0
- package/dist/auth/hardening.js +33 -0
- package/dist/auth/identity.d.ts +121 -0
- package/dist/auth/identity.js +192 -0
- package/dist/auth/oauth.d.ts +63 -0
- package/dist/auth/oauth.js +185 -0
- package/dist/auth/resource-seeds.js +8 -0
- package/dist/auth/route-http.js +33 -0
- package/dist/auth/routes.d.ts +32 -0
- package/dist/auth/routes.js +80 -0
- package/dist/build/compiler.d.ts +122 -0
- package/dist/build/compiler.js +3 -0
- package/dist/{spec → build/spec}/domain/model/ManifestGrammar.d.ts +30 -43
- package/dist/{spec → build/spec}/domain/model/RuntimePlan.d.ts +77 -3
- package/dist/{spec → build/spec}/domain/model/SqlIr.d.ts +39 -6
- package/dist/build/spec/domain/model/UserFields.d.ts +21 -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 +22 -0
- package/dist/domain/adminOrder.js +22 -0
- package/dist/domain/columns.js +42 -0
- package/dist/domain/describe/chunk-SGMRVDGE.js +1 -0
- package/dist/domain/describe/index.d.ts +58 -0
- package/dist/domain/describe/index.js +1 -0
- package/dist/domain/describe/target-hash.d.ts +8 -0
- package/dist/domain/describe/target-hash.js +1 -0
- package/dist/domain/describe/targets.d.ts +40 -0
- package/dist/domain/entry.js +19 -0
- package/dist/domain/generated-tools.js +18 -0
- package/dist/domain/generation.d.ts +16 -0
- package/dist/domain/generation.js +1 -0
- package/dist/domain/input.js +15 -0
- package/dist/domain/model.js +1 -0
- package/dist/domain/paging.js +213 -0
- package/dist/domain/recipes.js +22 -0
- package/dist/domain/userReferences.js +4 -0
- package/dist/domain/wireScalars.js +41 -0
- package/dist/infrastructure/adminEntries.js +156 -0
- package/dist/infrastructure/adminPaging.js +70 -0
- package/dist/infrastructure/artifacts.js +67 -0
- package/dist/infrastructure/authSchema.js +74 -0
- package/dist/infrastructure/bundle.js +159 -0
- package/dist/infrastructure/cli.js +111 -0
- package/dist/infrastructure/generate.d.ts +12 -0
- package/dist/infrastructure/generate.js +175 -0
- package/dist/infrastructure/generateAuth.d.ts +8 -0
- package/dist/infrastructure/generateAuth.js +66 -0
- package/dist/infrastructure/help.js +55 -0
- package/dist/infrastructure/init.js +50 -0
- package/dist/infrastructure/inputs.js +32 -0
- package/dist/infrastructure/mounts.js +22 -0
- package/dist/infrastructure/wrangler.js +103 -0
- package/dist/kernel/authorization.d.ts +4 -0
- package/dist/kernel/authorization.js +15 -0
- package/dist/kernel/binds.d.ts +60 -0
- package/dist/kernel/binds.js +39 -0
- package/dist/kernel/caller-identity.d.ts +21 -0
- package/dist/kernel/caller-identity.js +7 -0
- package/dist/kernel/caller-mode.d.ts +4 -0
- package/dist/kernel/caller-mode.js +14 -0
- package/dist/kernel/contract-error.d.ts +12 -0
- package/dist/kernel/contract-error.js +14 -0
- package/dist/kernel/contracts.d.ts +135 -0
- package/dist/kernel/contracts.js +56 -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} +0 -9
- package/dist/kernel/dialect/common.d.ts +38 -0
- package/dist/kernel/dialect/common.js +3 -0
- package/dist/kernel/dialect/postgres.d.ts +16 -0
- package/dist/kernel/dialect/postgres.js +16 -0
- package/dist/kernel/dialect/sqlite.d.ts +20 -0
- package/dist/kernel/dialect/sqlite.js +29 -0
- package/dist/kernel/drain.d.ts +5 -0
- package/dist/kernel/drain.js +29 -0
- package/dist/kernel/driver/bun-sqlite.d.ts +19 -0
- package/dist/kernel/driver/bun-sqlite.js +73 -0
- package/dist/kernel/driver/d1.d.ts +24 -0
- package/dist/kernel/driver/d1.js +21 -0
- package/dist/kernel/driver/postgres.d.ts +25 -0
- package/dist/kernel/driver/postgres.js +84 -0
- package/dist/kernel/driver/transaction-context.d.ts +10 -0
- package/dist/kernel/driver/transaction-context.js +28 -0
- package/dist/kernel/email.d.ts +28 -0
- package/dist/{auth/emailTemplates.js → kernel/email.js} +9 -2
- package/dist/kernel/host-access.d.ts +10 -0
- package/dist/kernel/host-access.js +64 -0
- package/dist/kernel/host-caller.d.ts +39 -0
- package/dist/kernel/host-caller.js +53 -0
- package/dist/kernel/json-body.d.ts +4 -0
- package/dist/kernel/json-body.js +42 -0
- package/dist/kernel/mcp-apps.d.ts +69 -0
- package/dist/kernel/mcp-apps.js +35 -0
- package/dist/kernel/mcp-call.d.ts +5 -0
- package/dist/kernel/mcp-call.js +24 -0
- package/dist/kernel/mcp-handler.js +347 -0
- package/dist/kernel/mcp.d.ts +110 -0
- package/dist/kernel/mcp.js +45 -0
- package/dist/kernel/media.d.ts +27 -0
- package/dist/kernel/media.js +198 -0
- package/dist/kernel/paging.d.ts +55 -0
- package/dist/kernel/paging.js +87 -0
- package/dist/kernel/publishing.d.ts +4 -0
- package/dist/kernel/publishing.js +15 -0
- package/dist/{cloudflare/r2Media.d.ts → kernel/r2-media.d.ts} +4 -5
- package/dist/kernel/r2-media.js +71 -0
- package/dist/kernel/rest-dispatch.js +37 -0
- package/dist/kernel/rest-router.js +63 -0
- package/dist/kernel/rest.d.ts +58 -0
- package/dist/kernel/rest.js +38 -0
- package/dist/kernel/scalars.d.ts +6 -0
- package/dist/kernel/scalars.js +36 -0
- package/dist/kernel/search.js +4 -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 +30 -0
- package/dist/kernel/store.d.ts +175 -0
- package/dist/kernel/store.js +244 -0
- package/dist/kernel/surface-failure.d.ts +10 -0
- package/dist/kernel/surface-failure.js +29 -0
- package/dist/kernel/surface.d.ts +10 -0
- package/dist/kernel/surface.js +16 -0
- package/dist/kernel/sweep.d.ts +17 -0
- package/dist/kernel/sweep.js +26 -0
- package/dist/kernel/translations.d.ts +1 -0
- package/dist/kernel/translations.js +12 -0
- package/dist/kernel/user-caller.d.ts +31 -0
- package/dist/kernel/user-caller.js +61 -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 +71 -0
- package/dist/kernel/validation.d.ts +15 -0
- package/dist/kernel/validation.js +46 -0
- package/dist/kernel/web-gateway.js +66 -0
- package/dist/kernel/web-head.js +14 -0
- package/dist/kernel/web-index.js +39 -0
- package/dist/kernel/web-response.js +7 -0
- package/dist/kernel/web-serve.js +97 -0
- package/dist/kernel/web.d.ts +77 -0
- package/dist/kernel/web.js +43 -0
- package/dist/kernel/where.js +21 -0
- package/dist/testing/index.d.ts +1 -37
- package/dist/testing/index.js +1 -43
- package/dist/usecase/adminBindings.js +150 -0
- package/dist/usecase/adminClient.js +66 -0
- package/dist/usecase/adminDescriptors.js +100 -0
- package/dist/usecase/generate.js +160 -0
- package/dist/usecase/handlers.js +18 -0
- package/dist/usecase/mcp-media.js +16 -0
- package/dist/usecase/mcp.js +96 -0
- package/dist/usecase/paging.js +69 -0
- package/dist/usecase/publishing.js +59 -0
- package/dist/usecase/refusals.js +27 -0
- package/dist/usecase/rest.js +53 -0
- package/dist/usecase/search.js +7 -0
- package/dist/usecase/site.js +38 -0
- package/dist/usecase/stores.js +52 -0
- package/dist/usecase/tool-version.js +6 -0
- package/dist/usecase/translations.js +76 -0
- package/dist/usecase/ttl.js +20 -0
- package/dist/usecase/validation.js +221 -0
- package/dist/usecase/web.js +23 -0
- package/docs/examples/README.md +39 -16
- 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 +16 -0
- package/docs/examples/app-shell/src/schedule.ts +8 -0
- package/docs/examples/app-shell/src/service.ts +71 -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 +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 +186 -108
- package/docs/handbook/cloudflare/chatgpt-sites.md +5 -112
- package/docs/handbook/cloudflare/deploy-and-operate.md +59 -87
- package/docs/handbook/cloudflare/media-r2.md +61 -82
- package/docs/handbook/cloudflare/service-entry.md +223 -119
- package/docs/handbook/concepts/authorization.md +10 -117
- 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 -116
- package/docs/handbook/concepts/procedures-and-triggers.md +5 -162
- package/docs/handbook/concepts/runtime-and-adapters.md +15 -183
- 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 +113 -136
- package/docs/handbook/guides/agent-setup.md +32 -27
- 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 +93 -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 +210 -100
- package/docs/handbook/navigation.json +176 -30
- package/docs/handbook/reference/admin-descriptors.md +56 -0
- package/docs/handbook/reference/authorization.md +44 -52
- package/docs/handbook/reference/describe.md +56 -0
- package/docs/handbook/reference/diagnostics.md +19 -77
- package/docs/handbook/reference/features.md +45 -53
- package/docs/handbook/reference/manifest.md +6 -69
- package/docs/handbook/reference/procedure.md +11 -115
- package/docs/handbook/reference/schema.md +81 -172
- package/docs/handbook/reference/site-config.md +5 -65
- package/docs/handbook/reference/sql.md +64 -0
- package/docs/handbook/reference/surface.md +396 -93
- package/docs/handbook/reference/trigger.md +62 -89
- package/docs/handbook/reference/view.md +40 -158
- package/docs/handbook/releases/index.md +198 -12
- package/docs/handbook/start/agents.md +45 -0
- package/docs/handbook/start/overview.md +9 -56
- package/docs/handbook/start/project-and-cli.md +51 -131
- package/docs/handbook/start/quickstart-worker.md +38 -115
- package/docs/skills/develop/SKILL.md +77 -121
- package/docs/skills/integrate/SKILL.md +37 -84
- package/docs/skills/media-gc/SKILL.md +21 -8
- package/docs/skills/provision/SKILL.md +31 -87
- package/docs/skills/update/SKILL.md +20 -34
- package/docs/source/scripts/postgres-adapter.ts +101 -0
- package/docs/upgrade-0.1-to-0.2.md +26 -10
- package/package.json +120 -112
- package/skills/README.md +67 -0
- package/skills/mantle/SKILL.md +76 -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 -22
- package/dist/admin/createAdminSurface.d.ts.map +0 -1
- package/dist/admin/createAdminSurface.js +0 -589
- package/dist/admin/createAdminSurface.js.map +0 -1
- package/dist/admin/developerConsole.d.ts +0 -264
- 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/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 -4
- package/dist/admin/index.d.ts.map +0 -1
- package/dist/admin/index.js +0 -4
- package/dist/admin/index.js.map +0 -1
- package/dist/admin/procedureFlow.d.ts +0 -25
- package/dist/admin/procedureFlow.d.ts.map +0 -1
- package/dist/admin/procedureFlow.js +0 -154
- 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 -4565
- package/dist/auth/buildAuth.d.ts.map +0 -1
- package/dist/auth/buildAuth.js +0 -307
- package/dist/auth/buildAuth.js.map +0 -1
- package/dist/auth/callerResolver.d.ts +0 -48
- package/dist/auth/callerResolver.d.ts.map +0 -1
- package/dist/auth/callerResolver.js +0 -49
- 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.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 -483
- package/dist/auth/createMantleAuth.js.map +0 -1
- package/dist/auth/db.d.ts +0 -17
- package/dist/auth/db.d.ts.map +0 -1
- package/dist/auth/db.js +0 -24
- 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 -65
- package/dist/bun/index.d.ts.map +0 -1
- package/dist/bun/index.js +0 -130
- 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 -355
- 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 -352
- package/dist/cli/preset.js.map +0 -1
- package/dist/cloudflare/index.d.ts +0 -21
- package/dist/cloudflare/index.d.ts.map +0 -1
- package/dist/cloudflare/index.js +0 -14
- 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 -41
- 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 -17
- 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/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/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 -65
- package/dist/core/sql/allowlist.d.ts.map +0 -1
- package/dist/core/sql/allowlist.js +0 -705
- 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 -121
- package/dist/core/sql/policy.d.ts.map +0 -1
- package/dist/core/sql/policy.js +0 -379
- 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 -76
- package/dist/core/sql/run.d.ts.map +0 -1
- package/dist/core/sql/run.js +0 -267
- 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 -16
- package/dist/core/withCaller.d.ts.map +0 -1
- package/dist/core/withCaller.js +0 -29
- 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 -13
- package/dist/d1/executor.d.ts.map +0 -1
- package/dist/d1/executor.js +0 -91
- 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 -34
- package/dist/mcp/createMcpSurface.d.ts.map +0 -1
- package/dist/mcp/createMcpSurface.js +0 -150
- 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/postgres/adapter.d.ts +0 -20
- package/dist/postgres/adapter.d.ts.map +0 -1
- package/dist/postgres/adapter.js +0 -44
- 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 -92
- package/dist/postgres/driver.d.ts.map +0 -1
- package/dist/postgres/driver.js +0 -110
- package/dist/postgres/driver.js.map +0 -1
- package/dist/postgres/executor.d.ts +0 -20
- package/dist/postgres/executor.d.ts.map +0 -1
- package/dist/postgres/executor.js +0 -69
- package/dist/postgres/executor.js.map +0 -1
- package/dist/postgres/index.d.ts +0 -7
- package/dist/postgres/index.d.ts.map +0 -1
- package/dist/postgres/index.js +0 -7
- 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 -157
- 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 -121
- package/dist/postgres/print.js.map +0 -1
- package/dist/postgres/storage.d.ts +0 -19
- package/dist/postgres/storage.d.ts.map +0 -1
- package/dist/postgres/storage.js +0 -201
- package/dist/postgres/storage.js.map +0 -1
- package/dist/postgres/textRows.d.ts +0 -10
- package/dist/postgres/textRows.d.ts.map +0 -1
- package/dist/postgres/textRows.js +0 -44
- package/dist/postgres/textRows.js.map +0 -1
- package/dist/postgres/validator.d.ts +0 -12
- package/dist/postgres/validator.d.ts.map +0 -1
- package/dist/postgres/validator.js +0 -46
- 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 -149
- 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 -42
- package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts.map +0 -1
- package/dist/spec/domain/service/SchemaAdminUiChecker.js +0 -289
- 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 -53
- 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 -282
- 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 -296
- 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 -12
- package/dist/testing/cases/corpus.d.ts.map +0 -1
- package/dist/testing/cases/corpus.js +0 -91
- package/dist/testing/cases/corpus.js.map +0 -1
- package/dist/testing/cases/policy.d.ts +0 -74
- package/dist/testing/cases/policy.d.ts.map +0 -1
- package/dist/testing/cases/policy.js +0 -142
- 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 -32
- 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 -33
- 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 -39
- 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 -919
- 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 -25
- package/docs/adr/0032-store-centric-core-and-service-contract.md +0 -361
- 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 -124
- package/docs/adr/0038-bun-native-host.md +0 -63
- package/docs/adr/README.md +0 -96
- 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 -481
- 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 -215
- 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 -156
- 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/skills/develop/mcp-app.md +0 -79
- /package/docs/examples/{reference-service → app-shell}/.dev.vars.example +0 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Recipes. The parent row is the default locale (zh-TW); recipe_translations holds each other locale (en, ...).
|
|
2
|
+
# Both use the publishing lifecycle: Admin creates drafts, publish makes them visible to visitors.
|
|
3
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
4
|
+
kind: Schema
|
|
5
|
+
metadata: {name: recipes}
|
|
6
|
+
spec:
|
|
7
|
+
title: Recipes
|
|
8
|
+
lifecycle: publishing
|
|
9
|
+
uniqueIndexes: [[slug]]
|
|
10
|
+
searchableFields: [title]
|
|
11
|
+
schema:
|
|
12
|
+
type: object
|
|
13
|
+
required: [slug, title, summary, ingredients, steps, total_minutes, servings]
|
|
14
|
+
properties:
|
|
15
|
+
slug: {type: string, pattern: "^[a-z0-9-]+$", maxLength: 80}
|
|
16
|
+
title: {type: string}
|
|
17
|
+
summary: {type: string, description: "One or two sentences; used as the meta description."}
|
|
18
|
+
ingredients: {type: string, description: "One ingredient per line."}
|
|
19
|
+
steps: {type: string, description: "One step per line."}
|
|
20
|
+
total_minutes: {type: integer, minimum: 1}
|
|
21
|
+
servings: {type: integer, minimum: 1}
|
|
22
|
+
cover_url: {type: string, description: "Public URL of a committed cover image from the media library."}
|
|
23
|
+
uiSchema:
|
|
24
|
+
fields:
|
|
25
|
+
summary: {widget: textarea}
|
|
26
|
+
ingredients: {widget: textarea}
|
|
27
|
+
steps: {widget: textarea}
|
|
28
|
+
---
|
|
29
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
30
|
+
kind: Schema
|
|
31
|
+
metadata: {name: recipe_translations}
|
|
32
|
+
spec:
|
|
33
|
+
title: Recipe translations
|
|
34
|
+
lifecycle: publishing
|
|
35
|
+
localized: true
|
|
36
|
+
# Shares `slug` with its parent; reads merge the parent's total_minutes, servings and cover_url.
|
|
37
|
+
# A translation publishes only while its parent is published.
|
|
38
|
+
translates: {parent: recipes, on: slug}
|
|
39
|
+
uniqueIndexes: [[slug, locale]]
|
|
40
|
+
schema:
|
|
41
|
+
type: object
|
|
42
|
+
required: [slug, locale, title, summary, ingredients, steps]
|
|
43
|
+
properties:
|
|
44
|
+
slug: {type: string, maxLength: 80}
|
|
45
|
+
locale: {type: string, description: "BCP 47 tag, e.g. en"}
|
|
46
|
+
title: {type: string}
|
|
47
|
+
summary: {type: string}
|
|
48
|
+
ingredients: {type: string}
|
|
49
|
+
steps: {type: string}
|
|
50
|
+
uiSchema:
|
|
51
|
+
fields:
|
|
52
|
+
summary: {widget: textarea}
|
|
53
|
+
ingredients: {widget: textarea}
|
|
54
|
+
steps: {widget: textarea}
|
|
55
|
+
---
|
|
56
|
+
# Visitor list for the default locale. Public Views return published rows only.
|
|
57
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
58
|
+
kind: View
|
|
59
|
+
metadata: {name: published_recipes}
|
|
60
|
+
spec:
|
|
61
|
+
surface: public
|
|
62
|
+
sql: SELECT id, slug, title, summary FROM recipes ORDER BY id
|
|
63
|
+
---
|
|
64
|
+
# Visitor list for one translated locale; a translation is hidden while its parent is unpublished.
|
|
65
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
66
|
+
kind: View
|
|
67
|
+
metadata: {name: published_translations}
|
|
68
|
+
spec:
|
|
69
|
+
surface: public
|
|
70
|
+
input:
|
|
71
|
+
type: object
|
|
72
|
+
required: [locale]
|
|
73
|
+
additionalProperties: false
|
|
74
|
+
properties: {locale: {type: string, minLength: 2, maxLength: 35}}
|
|
75
|
+
sql: SELECT id, slug, title, summary FROM recipe_translations WHERE locale = input.locale ORDER BY id
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// Recipes acceptance: drafts stay hidden, publishing via the Admin API makes both locales visible with SEO, JSON-LD,
|
|
2
|
+
// hreflang, Markdown alternates, llms.txt, sitemap and robots.
|
|
3
|
+
import assert from "node:assert/strict";
|
|
4
|
+
import { smoke } from "./smoke-kit.mjs";
|
|
5
|
+
|
|
6
|
+
const recipe = {
|
|
7
|
+
slug: "scallion-pancake", title: "蔥油餅", summary: "外酥內軟的蔥油餅 </script>", total_minutes: 25, servings: 2,
|
|
8
|
+
ingredients: "中筋麵粉 200 克\n熱水 120 毫升\n青蔥 3 根", steps: "揉麵團並靜置\n擀開撒蔥捲起\n小火煎至金黃",
|
|
9
|
+
};
|
|
10
|
+
const english = {
|
|
11
|
+
slug: "scallion-pancake", locale: "en", title: "Scallion Pancake", summary: "Crisp outside, soft inside.",
|
|
12
|
+
ingredients: "200 g all-purpose flour\n120 ml hot water\n3 scallions", steps: "Knead and rest the dough\nRoll, add scallions, coil\nPan-fry until golden",
|
|
13
|
+
};
|
|
14
|
+
const jsonLd = html => JSON.parse(/<script type="application\/ld\+json">(.*?)<\/script>/s.exec(html)[1]);
|
|
15
|
+
|
|
16
|
+
await smoke(async ({ origin, owner, call, signIn, step }) => {
|
|
17
|
+
const admin = await signIn(owner);
|
|
18
|
+
const create = async (collection, data) => {
|
|
19
|
+
const created = await call("POST", "/admin/api/entries", { cookie: admin, body: { collection, data } });
|
|
20
|
+
assert.equal(created.status, 200, JSON.stringify(created.body));
|
|
21
|
+
return created.body.entry;
|
|
22
|
+
};
|
|
23
|
+
const publish = (collection, entry) => call("POST", `/admin/api/entries/${entry.id}/publish?collection=${collection}`, { cookie: admin, body: { expectedVersion: entry.version } });
|
|
24
|
+
const parent = await create("recipes", recipe), translation = await create("recipe_translations", english);
|
|
25
|
+
step("admin creates a zh-TW recipe and its en translation as drafts");
|
|
26
|
+
|
|
27
|
+
for (const path of ["/zh-TW/recipes/scallion-pancake", "/zh-TW/recipes/scallion-pancake.md", "/en/recipes/scallion-pancake"]) {
|
|
28
|
+
assert.equal((await call("GET", path)).status, 404, path);
|
|
29
|
+
}
|
|
30
|
+
// Visitor pages read as anonymous even when the request carries an admin session.
|
|
31
|
+
assert.equal((await call("GET", "/zh-TW/recipes/scallion-pancake", { cookie: admin })).status, 404);
|
|
32
|
+
assert.ok(!(await call("GET", "/zh-TW/")).body.includes("scallion-pancake"));
|
|
33
|
+
assert.ok(!(await call("GET", "/llms.txt")).body.includes("scallion-pancake"));
|
|
34
|
+
assert.ok(!(await call("GET", "/sitemap.xml")).body.includes("scallion-pancake"));
|
|
35
|
+
step("drafts are invisible to visitors: detail, Markdown, list, llms.txt and sitemap");
|
|
36
|
+
|
|
37
|
+
assert.equal((await publish("recipe_translations", translation)).status, 409);
|
|
38
|
+
const published = await publish("recipes", parent);
|
|
39
|
+
assert.equal(published.status, 200, JSON.stringify(published.body));
|
|
40
|
+
assert.equal((await call("GET", "/en/recipes/scallion-pancake")).status, 404);
|
|
41
|
+
assert.equal((await publish("recipe_translations", translation)).status, 200);
|
|
42
|
+
step("a translation cannot publish before its parent; publishing both via the Admin API");
|
|
43
|
+
|
|
44
|
+
const zh = await call("GET", "/zh-TW/recipes/scallion-pancake");
|
|
45
|
+
assert.equal(zh.status, 200);
|
|
46
|
+
assert.match(zh.headers.get("content-type"), /text\/html/);
|
|
47
|
+
const html = zh.body;
|
|
48
|
+
assert.match(html, /<html lang="zh-TW">/);
|
|
49
|
+
assert.match(html, /<title>蔥油餅 \| 食譜<\/title>/);
|
|
50
|
+
assert.match(html, /<meta name="description" content="外酥內軟的蔥油餅 <\/script>">/);
|
|
51
|
+
assert.ok(html.includes(`<link rel="canonical" href="${origin}/zh-TW/recipes/scallion-pancake">`));
|
|
52
|
+
assert.ok(html.includes(`<link rel="alternate" type="text/markdown" href="${origin}/zh-TW/recipes/scallion-pancake.md">`));
|
|
53
|
+
step("zh-TW detail has title, description and canonical");
|
|
54
|
+
|
|
55
|
+
for (const [lang, path] of [["zh-TW", "/zh-TW"], ["en", "/en"], ["x-default", "/zh-TW"]]) {
|
|
56
|
+
assert.ok(html.includes(`<link rel="alternate" hreflang="${lang}" href="${origin}${path}/recipes/scallion-pancake">`), lang);
|
|
57
|
+
}
|
|
58
|
+
assert.ok(html.includes(`<a href="/en/recipes/scallion-pancake" hreflang="en" lang="en">English</a>`));
|
|
59
|
+
const en = await call("GET", "/en/recipes/scallion-pancake");
|
|
60
|
+
assert.equal(en.status, 200);
|
|
61
|
+
assert.match(en.body, /<html lang="en">/);
|
|
62
|
+
assert.ok(en.body.includes(`<link rel="canonical" href="${origin}/en/recipes/scallion-pancake">`));
|
|
63
|
+
assert.ok(en.body.includes(`<link rel="alternate" hreflang="zh-TW" href="${origin}/zh-TW/recipes/scallion-pancake">`));
|
|
64
|
+
assert.ok(en.body.includes(`<a href="/zh-TW/recipes/scallion-pancake" hreflang="zh-TW" lang="zh-TW">繁體中文</a>`));
|
|
65
|
+
step("hreflang alternates and the locale switcher link zh-TW and en");
|
|
66
|
+
|
|
67
|
+
const zhData = jsonLd(html), enData = jsonLd(en.body);
|
|
68
|
+
assert.equal(zhData["@type"], "Recipe");
|
|
69
|
+
assert.equal(zhData.name, "蔥油餅");
|
|
70
|
+
assert.equal(zhData.description, recipe.summary);
|
|
71
|
+
assert.deepEqual(zhData.recipeIngredient, ["中筋麵粉 200 克", "熱水 120 毫升", "青蔥 3 根"]);
|
|
72
|
+
assert.equal(enData.name, "Scallion Pancake");
|
|
73
|
+
assert.equal(enData.inLanguage, "en");
|
|
74
|
+
assert.equal(enData.totalTime, "PT25M"); // merged from the parent row
|
|
75
|
+
assert.match(zhData.datePublished, /^\d{4}-/); assert.match(zhData.dateModified, /^\d{4}-/);
|
|
76
|
+
assert.ok(en.body.includes(`<meta property="og:url" content="${origin}/en/recipes/scallion-pancake">`));
|
|
77
|
+
assert.ok(en.body.includes(`<meta property="og:type" content="article">`));
|
|
78
|
+
assert.ok(en.body.includes(`<meta property="og:locale" content="en">`) && en.body.includes(`<meta property="og:locale:alternate" content="zh_TW">`));
|
|
79
|
+
assert.match(en.body, /<section id="quick-answer"><h2>How long does it take\?<\/h2><p>About 25 minutes in total; serves 2.<\/p><\/section>/);
|
|
80
|
+
step("JSON-LD Recipe parses with name and dates; Open Graph url/type/locale; the short answer block is present");
|
|
81
|
+
|
|
82
|
+
const md = await call("GET", "/en/recipes/scallion-pancake.md");
|
|
83
|
+
assert.equal(md.status, 200);
|
|
84
|
+
assert.match(md.headers.get("content-type"), /^text\/markdown/);
|
|
85
|
+
assert.ok(md.body.startsWith("# Scallion Pancake\n"));
|
|
86
|
+
assert.ok(md.body.includes("- 200 g all-purpose flour") && md.body.includes("1. Knead and rest the dough"));
|
|
87
|
+
step(".md alternate returns Markdown");
|
|
88
|
+
|
|
89
|
+
const llms = await call("GET", "/llms.txt");
|
|
90
|
+
assert.ok(llms.body.includes(`- [蔥油餅](${origin}/zh-TW/recipes/scallion-pancake.md)`));
|
|
91
|
+
assert.ok(llms.body.includes(`- [Scallion Pancake](${origin}/en/recipes/scallion-pancake.md)`));
|
|
92
|
+
assert.ok((await call("GET", "/en/")).body.includes(`<a href="/en/recipes/scallion-pancake">Scallion Pancake</a>`));
|
|
93
|
+
const home = await fetch(`${origin}/`, { redirect: "manual" });
|
|
94
|
+
assert.equal(home.status, 302);
|
|
95
|
+
assert.equal(home.headers.get("location"), `${origin}/zh-TW/`);
|
|
96
|
+
const sitemap = await call("GET", "/sitemap.xml");
|
|
97
|
+
assert.match(sitemap.headers.get("content-type"), /^application\/xml/);
|
|
98
|
+
for (const path of ["/zh-TW/", "/en/", "/zh-TW/recipes/scallion-pancake", "/en/recipes/scallion-pancake"]) assert.ok(sitemap.body.includes(`<loc>${origin}${path}</loc>`), path);
|
|
99
|
+
const robots = await call("GET", "/robots.txt");
|
|
100
|
+
assert.ok(robots.body.includes("Disallow: /admin/") && robots.body.includes(`Sitemap: ${origin}/sitemap.xml`));
|
|
101
|
+
step("llms.txt, sitemap (both locales), robots and the locale lists show the published recipe; / redirects to the default locale");
|
|
102
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { r2MediaStorage, type S3Signer } from "@aotter/mantle/media/r2";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Cover-image storage on the MEDIA R2 binding (docs/handbook/cloudflare/media-r2.md). Pass the result as Admin's
|
|
5
|
+
* `media` option (with `site` from generated/site.ts); the Admin media library then creates an upload, the browser
|
|
6
|
+
* PUTs the bytes straight to R2 with a presigned URL, and commit copies them under `committed/`.
|
|
7
|
+
* Copy the committed asset's public URL into a recipe's `cover_url`.
|
|
8
|
+
* AGENT: supply a SigV4 signer that returns query-signed PUT URLs, e.g. `new AwsClient({ accessKeyId, secretAccessKey })`
|
|
9
|
+
* from aws4fetch with R2 S3 credentials kept as secrets. Configure bucket CORS for PUT from your origin.
|
|
10
|
+
*/
|
|
11
|
+
export function coverStorage(env: Env, signer: S3Signer) {
|
|
12
|
+
return r2MediaStorage({ bucket: env.MEDIA, signer, endpoint: env.MEDIA_S3_ENDPOINT, publicBase: env.MEDIA_PUBLIC_BASE });
|
|
13
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/** Dependency-free visitor HTML, Markdown and llms.txt for recipes. */
|
|
2
|
+
export const LOCALES = ["zh-TW", "en"] as const;
|
|
3
|
+
export type Locale = (typeof LOCALES)[number];
|
|
4
|
+
export const DEFAULT_LOCALE: Locale = "zh-TW";
|
|
5
|
+
|
|
6
|
+
export interface Recipe {
|
|
7
|
+
slug: string; locale: Locale; title: string; summary: string; ingredients: string; steps: string;
|
|
8
|
+
total_minutes: number; servings: number; cover_url?: string | null; published_at?: string | null; updated_at?: string | null;
|
|
9
|
+
}
|
|
10
|
+
export interface Listed { slug: string; title: string; summary: string }
|
|
11
|
+
|
|
12
|
+
// AGENT: move UI strings to your translation workflow when you add locales.
|
|
13
|
+
const text = {
|
|
14
|
+
"zh-TW": { site: "食譜", description: "家常食譜,中英對照。", how: "需要多久?", answer: (m: number, s: number) => `總共約 ${m} 分鐘,可供 ${s} 人份。`, ingredients: "材料", steps: "步驟", all: "所有食譜", name: "繁體中文" },
|
|
15
|
+
en: { site: "Recipes", description: "Home recipes in Traditional Chinese and English.", how: "How long does it take?", answer: (m: number, s: number) => `About ${m} minutes in total; serves ${s}.`, ingredients: "Ingredients", steps: "Steps", all: "All recipes", name: "English" },
|
|
16
|
+
} satisfies Record<Locale, unknown>;
|
|
17
|
+
|
|
18
|
+
const escape = (value: unknown) => String(value ?? "").replace(/[&<>"']/g, c => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[c]!));
|
|
19
|
+
const lines = (value: string) => value.split("\n").map(line => line.trim()).filter(Boolean);
|
|
20
|
+
const recipePath = (locale: Locale, slug: string) => `/${locale}/recipes/${slug}`;
|
|
21
|
+
|
|
22
|
+
/** hreflang alternates for every locale the page exists in, plus x-default (the default locale). */
|
|
23
|
+
function alternates(origin: string, locales: readonly Locale[], path: (locale: Locale) => string) {
|
|
24
|
+
return locales.map(l => `<link rel="alternate" hreflang="${l}" href="${origin}${path(l)}">`).join("")
|
|
25
|
+
+ `<link rel="alternate" hreflang="x-default" href="${origin}${path(DEFAULT_LOCALE)}">`;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Open Graph: og:locale uses underscores (zh_TW); the other locales the page exists in are alternates. */
|
|
29
|
+
function openGraph(type: "website" | "article", url: string, locale: Locale, locales: readonly Locale[], title: string, description: string) {
|
|
30
|
+
const og = (property: string, content: string) => `<meta property="og:${property}" content="${escape(content)}">`;
|
|
31
|
+
return og("type", type) + og("url", url) + og("site_name", text[locale].site) + og("title", title) + og("description", description)
|
|
32
|
+
+ og("locale", locale.replace("-", "_")) + locales.filter(l => l !== locale).map(l => og("locale:alternate", l.replace("-", "_"))).join("");
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function documentHtml(locale: Locale, head: string, body: string) {
|
|
36
|
+
// AGENT: real layout and styling (stylesheet, header, footer, images sizes); keep the head tags.
|
|
37
|
+
return `<!doctype html><html lang="${locale}"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">${head}</head><body>${body}</body></html>`;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function switcher(locales: readonly Locale[], path: (locale: Locale) => string, current: Locale) {
|
|
41
|
+
return `<nav aria-label="Language">${locales.map(l => l === current ? `<strong>${text[l].name}</strong>` : `<a href="${path(l)}" hreflang="${l}" lang="${l}">${text[l].name}</a>`).join(" | ")}</nav>`;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function listHtml(origin: string, locale: Locale, rows: readonly Listed[]) {
|
|
45
|
+
const t = text[locale], path = (l: Locale) => `/${l}/`;
|
|
46
|
+
const head = `<title>${escape(t.site)}</title><meta name="description" content="${escape(t.description)}">`
|
|
47
|
+
+ `<link rel="canonical" href="${origin}${path(locale)}">${alternates(origin, LOCALES, path)}`
|
|
48
|
+
+ openGraph("website", `${origin}${path(locale)}`, locale, LOCALES, t.site, t.description);
|
|
49
|
+
const items = rows.map(r => `<li><a href="${recipePath(locale, r.slug)}">${escape(r.title)}</a><p>${escape(r.summary)}</p></li>`).join("");
|
|
50
|
+
return documentHtml(locale, head, `${switcher(LOCALES, path, locale)}<h1>${escape(t.site)}</h1><ul>${items}</ul>`);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function recipeHtml(origin: string, locale: Locale, r: Recipe, locales: readonly Locale[]) {
|
|
54
|
+
const t = text[locale], path = (l: Locale) => recipePath(l, r.slug), canonical = `${origin}${path(locale)}`;
|
|
55
|
+
const jsonLd = {
|
|
56
|
+
"@context": "https://schema.org", "@type": "Recipe", name: r.title, description: r.summary, inLanguage: locale, url: canonical,
|
|
57
|
+
...(r.cover_url ? { image: [r.cover_url] } : {}), ...(r.published_at ? { datePublished: r.published_at } : {}), ...(r.updated_at ? { dateModified: r.updated_at } : {}),
|
|
58
|
+
totalTime: `PT${r.total_minutes}M`, recipeYield: String(r.servings),
|
|
59
|
+
recipeIngredient: lines(r.ingredients),
|
|
60
|
+
recipeInstructions: lines(r.steps).map(step => ({ "@type": "HowToStep", text: step })),
|
|
61
|
+
};
|
|
62
|
+
const head = `<title>${escape(r.title)} | ${escape(t.site)}</title><meta name="description" content="${escape(r.summary)}">`
|
|
63
|
+
+ `<link rel="canonical" href="${canonical}">${alternates(origin, locales, path)}`
|
|
64
|
+
+ `<link rel="alternate" type="text/markdown" href="${canonical}.md">`
|
|
65
|
+
+ openGraph("article", canonical, locale, locales, r.title, r.summary)
|
|
66
|
+
+ (r.cover_url ? `<meta property="og:image" content="${escape(r.cover_url)}">` : "")
|
|
67
|
+
// `<` is escaped so admin-authored text cannot close the script element.
|
|
68
|
+
+ `<script type="application/ld+json">${JSON.stringify(jsonLd).replace(/</g, "\\u003c")}</script>`;
|
|
69
|
+
const body = `${switcher(locales, path, locale)}<p><a href="/${locale}/">${escape(t.all)}</a></p>`
|
|
70
|
+
+ `<article><h1>${escape(r.title)}</h1><p>${escape(r.summary)}</p>`
|
|
71
|
+
+ (r.cover_url ? `<img src="${escape(r.cover_url)}" alt="${escape(r.title)}">` : "")
|
|
72
|
+
// Short answer block: one question and a one-sentence answer that search and answer engines can quote.
|
|
73
|
+
+ `<section id="quick-answer"><h2>${escape(t.how)}</h2><p>${escape(t.answer(r.total_minutes, r.servings))}</p></section>`
|
|
74
|
+
+ `<h2>${escape(t.ingredients)}</h2><ul>${lines(r.ingredients).map(i => `<li>${escape(i)}</li>`).join("")}</ul>`
|
|
75
|
+
+ `<h2>${escape(t.steps)}</h2><ol>${lines(r.steps).map(s => `<li>${escape(s)}</li>`).join("")}</ol></article>`;
|
|
76
|
+
return documentHtml(locale, head, body);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function recipeMarkdown(r: Recipe) {
|
|
80
|
+
const t = text[r.locale];
|
|
81
|
+
return [`# ${r.title}`, "", r.summary, "", `## ${t.how}`, "", t.answer(r.total_minutes, r.servings), "",
|
|
82
|
+
`## ${t.ingredients}`, "", ...lines(r.ingredients).map(i => `- ${i}`), "",
|
|
83
|
+
`## ${t.steps}`, "", ...lines(r.steps).map((s, i) => `${i + 1}. ${s}`), ""].join("\n");
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** llms.txt (https://llmstxt.org): one section per locale, each recipe linking to its Markdown alternate. */
|
|
87
|
+
export function llmsTxt(origin: string, lists: readonly (readonly [Locale, readonly Listed[]])[]) {
|
|
88
|
+
return [`# ${text.en.site}`, "", `> ${text.en.description}`, "",
|
|
89
|
+
...lists.flatMap(([locale, rows]) => [`## ${text[locale].name} (${locale})`, "",
|
|
90
|
+
...rows.map(r => `- [${r.title}](${origin}${recipePath(locale, r.slug)}.md): ${r.summary.replace(/\s+/g, " ")}`), ""])].join("\n");
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** sitemap.xml: each locale's list page and every published recipe in it (only published rows reach `lists`). */
|
|
94
|
+
export function sitemapXml(origin: string, lists: readonly (readonly [Locale, readonly Listed[]])[]) {
|
|
95
|
+
const paths = lists.flatMap(([locale, rows]) => [`/${locale}/`, ...rows.map(r => recipePath(locale, r.slug))]);
|
|
96
|
+
return `<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">${paths.map(path => `<url><loc>${escape(origin + path)}</loc></url>`).join("")}</urlset>\n`;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export const robotsTxt = (origin: string) => `User-agent: *\nDisallow: /admin/\nSitemap: ${origin}/sitemap.xml\n`;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { Caller } from "@aotter/mantle/contracts";
|
|
2
|
+
import { store } from "../generated/generated.js";
|
|
3
|
+
import { translationLocales } from "../generated/translations.js";
|
|
4
|
+
import recipePage from "../generated/paged/views/published_recipes.js";
|
|
5
|
+
import translationPage from "../generated/paged/views/published_translations.js";
|
|
6
|
+
import { DEFAULT_LOCALE, LOCALES, type Locale, type Recipe, listHtml, llmsTxt, recipeHtml, recipeMarkdown, robotsTxt, sitemapXml } from "./pages.js";
|
|
7
|
+
|
|
8
|
+
// Visitor pages always read as anonymous, even for a signed-in admin, so drafts never reach public HTML.
|
|
9
|
+
const visitor: Caller = { kind: "anonymous" };
|
|
10
|
+
const page = /^\/(zh-TW|en)\/(?:recipes\/([a-z0-9-]+?)(\.md)?)?$/;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Visitor pages, tried before Admin, MCP and REST. Only these paths are matched; everything else falls through.
|
|
14
|
+
* / -> redirect to /zh-TW/
|
|
15
|
+
* /{locale}/ list (HTML)
|
|
16
|
+
* /{locale}/recipes/{slug} detail (HTML: SEO meta, hreflang, JSON-LD Recipe, short answer)
|
|
17
|
+
* /{locale}/recipes/{slug}.md Markdown alternate
|
|
18
|
+
* /llms.txt published recipes for AI agents
|
|
19
|
+
* /sitemap.xml, /robots.txt every published URL in every locale; robots keeps crawlers out of /admin/
|
|
20
|
+
*/
|
|
21
|
+
export async function appRoutes(request: Request, env: Env, _context: { caller: () => Promise<Caller>; waitUntil: (task: Promise<unknown>) => void }): Promise<Response | undefined> {
|
|
22
|
+
const url = new URL(request.url), match = page.exec(url.pathname);
|
|
23
|
+
if (!["/", "/llms.txt", "/sitemap.xml", "/robots.txt"].includes(url.pathname) && !match) return undefined;
|
|
24
|
+
if (request.method !== "GET" && request.method !== "HEAD") return new Response(null, { status: 405, headers: { allow: "GET, HEAD" } });
|
|
25
|
+
// Absolute links use the configured origin, not the request Host.
|
|
26
|
+
const origin = env.PUBLIC_ORIGIN;
|
|
27
|
+
if (url.pathname === "/") return Response.redirect(`${origin}/${DEFAULT_LOCALE}/`, 302);
|
|
28
|
+
|
|
29
|
+
if (url.pathname === "/robots.txt") return send(request, robotsTxt(origin), "text/plain; charset=utf-8");
|
|
30
|
+
if (url.pathname === "/llms.txt" || url.pathname === "/sitemap.xml") {
|
|
31
|
+
const lists = await Promise.all(LOCALES.map(async locale => [locale, await list(env, locale)] as const));
|
|
32
|
+
return url.pathname === "/llms.txt"
|
|
33
|
+
? send(request, llmsTxt(origin, lists), "text/plain; charset=utf-8")
|
|
34
|
+
: send(request, sitemapXml(origin, lists), "application/xml; charset=utf-8");
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const locale = match![1] as Locale, slug = match![2], markdown = !!match![3];
|
|
38
|
+
if (!slug) return send(request, listHtml(origin, locale, await list(env, locale)), "text/html; charset=utf-8");
|
|
39
|
+
const found = await read(env, slug, locale);
|
|
40
|
+
if (!found) return new Response("Not found", { status: 404, headers: { "cache-control": "no-store" } });
|
|
41
|
+
return markdown
|
|
42
|
+
? send(request, recipeMarkdown(found.recipe), "text/markdown; charset=utf-8", { link: `<${origin}/${locale}/recipes/${slug}>; rel="canonical"` })
|
|
43
|
+
: send(request, recipeHtml(origin, locale, found.recipe, found.locales), "text/html; charset=utf-8");
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** First page of published recipes in one locale. AGENT: page with `nextCursor` once a locale has more than 100 recipes. */
|
|
47
|
+
async function list(env: Env, locale: Locale) {
|
|
48
|
+
const result = locale === DEFAULT_LOCALE
|
|
49
|
+
? await recipePage(env.DB, visitor, {}, { limit: 100 })
|
|
50
|
+
: await translationPage(env.DB, visitor, { locale }, { limit: 100 });
|
|
51
|
+
return result.rows.map(row => ({ slug: String(row.slug), title: String(row.title), summary: String(row.summary) }));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** One published recipe in `locale` plus the locales it is published in (for hreflang). */
|
|
55
|
+
async function read(env: Env, slug: string, locale: Locale): Promise<{ recipe: Recipe; locales: Locale[] } | undefined> {
|
|
56
|
+
const recipes = store(env.DB, visitor);
|
|
57
|
+
const parent = await recipes.collection("recipes").first({ where: { slug } });
|
|
58
|
+
if (!parent) return undefined;
|
|
59
|
+
const translated = (await translationLocales(env.DB, visitor, "recipes", [parent]))[parent.id] ?? [];
|
|
60
|
+
const locales = LOCALES.filter(l => l === DEFAULT_LOCALE || translated.includes(l));
|
|
61
|
+
if (!locales.includes(locale)) return undefined;
|
|
62
|
+
// A translation read merges the parent's fields (total_minutes, servings, cover_url, ...); the child's own fields win.
|
|
63
|
+
const row = locale === DEFAULT_LOCALE ? parent : await recipes.collection("recipe_translations").first({ where: { slug, locale } });
|
|
64
|
+
if (!row) return undefined;
|
|
65
|
+
return { recipe: { ...row, slug, locale } as Recipe, locales };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function send(request: Request, body: string, type: string, headers: Record<string, string> = {}) {
|
|
69
|
+
// AGENT: choose a cache policy (and purge on publish) once pages sit behind a CDN.
|
|
70
|
+
return new Response(request.method === "HEAD" ? null : body, { headers: { "content-type": type, "cache-control": "no-store", ...headers } });
|
|
71
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SiteDefaults } from "@aotter/mantle/site";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Site defaults for `mantle generate ... --site src/site-config.ts`, which adds the media library tables and
|
|
5
|
+
* `generated/site.ts`. The shell does not pass `--site`; see README "Cover images" for the two lines to add.
|
|
6
|
+
*/
|
|
7
|
+
export const siteDefaults = {
|
|
8
|
+
title: "Recipes",
|
|
9
|
+
description: "Home recipes in Traditional Chinese and English.",
|
|
10
|
+
locales: ["zh-TW", "en"],
|
|
11
|
+
media: { purposes: [{ name: "cover", required: ["image/jpeg,image/png,image/webp"], maxBytes: { "image/jpeg": 5_000_000, "image/png": 5_000_000, "image/webp": 5_000_000 } }] },
|
|
12
|
+
} satisfies SiteDefaults;
|
|
@@ -0,0 +1,74 @@
|
|
|
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
|
+
// Recipe cover images (docs/handbook/cloudflare/media-r2.md). AGENT: create the bucket, serve its `committed/` prefix
|
|
35
|
+
// on a public domain, and set MEDIA_PUBLIC_BASE / MEDIA_S3_ENDPOINT below to that domain and the bucket's S3 endpoint.
|
|
36
|
+
"r2_buckets": [
|
|
37
|
+
{
|
|
38
|
+
"binding": "MEDIA",
|
|
39
|
+
"bucket_name": "mantle-app-media"
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
"vars": {
|
|
43
|
+
"MEDIA_PUBLIC_BASE": "https://media.example.com",
|
|
44
|
+
"MEDIA_S3_ENDPOINT": "https://mantle-app-media.ACCOUNT_ID.r2.cloudflarestorage.com"
|
|
45
|
+
},
|
|
46
|
+
"assets": {
|
|
47
|
+
"directory": "dist/client",
|
|
48
|
+
"binding": "ASSETS",
|
|
49
|
+
"run_worker_first": true,
|
|
50
|
+
"html_handling": "none"
|
|
51
|
+
},
|
|
52
|
+
"triggers": {
|
|
53
|
+
"crons": []
|
|
54
|
+
},
|
|
55
|
+
"no_bundle": true,
|
|
56
|
+
"find_additional_modules": true,
|
|
57
|
+
"base_dir": "dist/worker",
|
|
58
|
+
"build": {
|
|
59
|
+
"command": "mantle bundle src/index.ts dist",
|
|
60
|
+
"watch_dir": [
|
|
61
|
+
"src",
|
|
62
|
+
"generated"
|
|
63
|
+
]
|
|
64
|
+
},
|
|
65
|
+
"rules": [
|
|
66
|
+
{
|
|
67
|
+
"type": "ESModule",
|
|
68
|
+
"globs": [
|
|
69
|
+
"**/*.js"
|
|
70
|
+
],
|
|
71
|
+
"fallthrough": true
|
|
72
|
+
}
|
|
73
|
+
]
|
|
74
|
+
}
|