@aotter/mantle 0.1.5-alpha.1 → 0.2.0-alpha.1
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 +39 -306
- package/dist/admin/consent.d.ts +17 -0
- package/dist/admin/consent.d.ts.map +1 -0
- package/dist/admin/consent.js +17 -0
- package/dist/admin/consent.js.map +1 -0
- package/dist/admin/createAdminSurface.d.ts +22 -0
- package/dist/admin/createAdminSurface.d.ts.map +1 -0
- package/dist/admin/createAdminSurface.js +589 -0
- package/dist/admin/createAdminSurface.js.map +1 -0
- package/dist/admin/developerConsole.d.ts +264 -0
- package/dist/admin/developerConsole.d.ts.map +1 -0
- package/dist/admin/developerConsole.js +136 -0
- package/dist/admin/developerConsole.js.map +1 -0
- package/dist/admin/identity.d.ts +62 -0
- package/dist/admin/identity.d.ts.map +1 -0
- package/dist/admin/identity.js +7 -0
- package/dist/admin/identity.js.map +1 -0
- package/dist/admin/index.d.ts +4 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +4 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/procedureFlow.d.ts +25 -0
- package/dist/admin/procedureFlow.d.ts.map +1 -0
- package/dist/admin/procedureFlow.js +154 -0
- package/dist/admin/procedureFlow.js.map +1 -0
- package/dist/auth/ConsoleEmailSender.d.ts +15 -0
- package/dist/auth/ConsoleEmailSender.d.ts.map +1 -0
- package/dist/auth/ConsoleEmailSender.js +19 -0
- package/dist/auth/ConsoleEmailSender.js.map +1 -0
- package/dist/auth/appleClientSecret.d.ts +75 -0
- package/dist/auth/appleClientSecret.d.ts.map +1 -0
- package/dist/auth/appleClientSecret.js +116 -0
- package/dist/auth/appleClientSecret.js.map +1 -0
- package/dist/auth/buildAuth.d.ts +4565 -0
- package/dist/auth/buildAuth.d.ts.map +1 -0
- package/dist/auth/buildAuth.js +307 -0
- package/dist/auth/buildAuth.js.map +1 -0
- package/dist/auth/callerResolver.d.ts +48 -0
- package/dist/auth/callerResolver.d.ts.map +1 -0
- package/dist/auth/callerResolver.js +49 -0
- package/dist/auth/callerResolver.js.map +1 -0
- package/dist/auth/createAuthRoutes.d.ts +22 -0
- package/dist/auth/createAuthRoutes.d.ts.map +1 -0
- package/dist/auth/createAuthRoutes.js +128 -0
- package/dist/auth/createAuthRoutes.js.map +1 -0
- package/dist/auth/createMantleAuth.d.ts +3 -0
- package/dist/auth/createMantleAuth.d.ts.map +1 -0
- package/dist/auth/createMantleAuth.js +483 -0
- package/dist/auth/createMantleAuth.js.map +1 -0
- package/dist/auth/db.d.ts +17 -0
- package/dist/auth/db.d.ts.map +1 -0
- package/dist/auth/db.js +24 -0
- package/dist/auth/db.js.map +1 -0
- package/dist/auth/emailTemplates.d.ts +7 -0
- package/dist/auth/emailTemplates.d.ts.map +1 -0
- package/dist/auth/emailTemplates.js +27 -0
- package/dist/auth/emailTemplates.js.map +1 -0
- package/dist/auth/index.d.ts +9 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +7 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/methods.d.ts +717 -0
- package/dist/auth/methods.d.ts.map +1 -0
- package/dist/auth/methods.js +321 -0
- package/dist/auth/methods.js.map +1 -0
- package/dist/auth/oauthTokens.d.ts +24 -0
- package/dist/auth/oauthTokens.d.ts.map +1 -0
- package/dist/auth/oauthTokens.js +146 -0
- package/dist/auth/oauthTokens.js.map +1 -0
- package/dist/auth/setupIncomplete.d.ts +16 -0
- package/dist/auth/setupIncomplete.d.ts.map +1 -0
- package/dist/auth/setupIncomplete.js +50 -0
- package/dist/auth/setupIncomplete.js.map +1 -0
- package/dist/auth/types.d.ts +440 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +10 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/bun/index.d.ts +65 -0
- package/dist/bun/index.d.ts.map +1 -0
- package/dist/bun/index.js +130 -0
- package/dist/bun/index.js.map +1 -0
- package/dist/cli/emitModule.d.ts +7 -0
- package/dist/cli/emitModule.d.ts.map +1 -0
- package/dist/cli/emitModule.js +127 -0
- package/dist/cli/emitModule.js.map +1 -0
- package/dist/cli/generate.d.ts +4 -16
- package/dist/cli/generate.d.ts.map +1 -1
- package/dist/cli/generate.js +318 -262
- package/dist/cli/generate.js.map +1 -1
- package/dist/cli/main.d.ts +1 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +15 -71
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/preset.d.ts +18 -0
- package/dist/cli/preset.d.ts.map +1 -0
- package/dist/cli/preset.js +352 -0
- package/dist/cli/preset.js.map +1 -0
- package/dist/cloudflare/index.d.ts +21 -0
- package/dist/cloudflare/index.d.ts.map +1 -0
- package/dist/cloudflare/index.js +14 -0
- package/dist/cloudflare/index.js.map +1 -0
- package/dist/cloudflare/r2Media.d.ts +43 -0
- package/dist/cloudflare/r2Media.d.ts.map +1 -0
- package/dist/cloudflare/r2Media.js +69 -0
- package/dist/cloudflare/r2Media.js.map +1 -0
- package/dist/core/caller.d.ts +35 -0
- package/dist/core/caller.d.ts.map +1 -0
- package/dist/core/caller.js +3 -0
- package/dist/core/caller.js.map +1 -0
- package/dist/core/createMantle.d.ts +22 -0
- package/dist/core/createMantle.d.ts.map +1 -0
- package/dist/core/createMantle.js +117 -0
- package/dist/core/createMantle.js.map +1 -0
- package/dist/core/dialect.d.ts +41 -0
- package/dist/core/dialect.d.ts.map +1 -0
- package/dist/core/dialect.js +7 -0
- package/dist/core/dialect.js.map +1 -0
- package/dist/core/driver.d.ts +17 -0
- package/dist/core/driver.d.ts.map +1 -0
- package/dist/core/driver.js +2 -0
- package/dist/core/driver.js.map +1 -0
- package/dist/core/email.d.ts +17 -0
- package/dist/core/email.d.ts.map +1 -0
- package/dist/core/email.js +2 -0
- package/dist/core/email.js.map +1 -0
- package/dist/core/index.d.ts +16 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +16 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/invocation.d.ts +66 -0
- package/dist/core/invocation.d.ts.map +1 -0
- package/dist/core/invocation.js +3 -0
- package/dist/core/invocation.js.map +1 -0
- package/dist/core/runtime/auth.d.ts +9 -0
- package/dist/core/runtime/auth.d.ts.map +1 -0
- package/dist/core/runtime/auth.js +39 -0
- package/dist/core/runtime/auth.js.map +1 -0
- package/dist/core/runtime/createRuntime.d.ts +23 -0
- package/dist/core/runtime/createRuntime.d.ts.map +1 -0
- package/dist/core/runtime/createRuntime.js +214 -0
- package/dist/core/runtime/createRuntime.js.map +1 -0
- package/dist/core/runtime/verifyPlan.d.ts +34 -0
- package/dist/core/runtime/verifyPlan.d.ts.map +1 -0
- package/dist/core/runtime/verifyPlan.js +301 -0
- package/dist/core/runtime/verifyPlan.js.map +1 -0
- package/dist/core/service.d.ts +45 -0
- package/dist/core/service.d.ts.map +1 -0
- package/dist/core/service.js +2 -0
- package/dist/core/service.js.map +1 -0
- package/dist/core/site.d.ts +117 -0
- package/dist/core/site.d.ts.map +1 -0
- package/dist/core/site.js +2 -0
- package/dist/core/site.js.map +1 -0
- package/dist/core/siteConfig.d.ts +5 -0
- package/dist/core/siteConfig.d.ts.map +1 -0
- package/dist/core/siteConfig.js +24 -0
- package/dist/core/siteConfig.js.map +1 -0
- package/dist/core/sql/allowlist.d.ts +65 -0
- package/dist/core/sql/allowlist.d.ts.map +1 -0
- package/dist/core/sql/allowlist.js +705 -0
- package/dist/core/sql/allowlist.js.map +1 -0
- package/dist/core/sql/ast.d.ts +24 -0
- package/dist/core/sql/ast.d.ts.map +1 -0
- package/dist/core/sql/ast.js +32 -0
- package/dist/core/sql/ast.js.map +1 -0
- package/dist/core/sql/compile.d.ts +50 -0
- package/dist/core/sql/compile.d.ts.map +1 -0
- package/dist/core/sql/compile.js +48 -0
- package/dist/core/sql/compile.js.map +1 -0
- package/dist/core/sql/policy.d.ts +121 -0
- package/dist/core/sql/policy.d.ts.map +1 -0
- package/dist/core/sql/policy.js +379 -0
- package/dist/core/sql/policy.js.map +1 -0
- package/dist/core/sql/positions.d.ts +30 -0
- package/dist/core/sql/positions.d.ts.map +1 -0
- package/dist/core/sql/positions.js +22 -0
- package/dist/core/sql/positions.js.map +1 -0
- package/dist/core/sql/run.d.ts +76 -0
- package/dist/core/sql/run.d.ts.map +1 -0
- package/dist/core/sql/run.js +267 -0
- package/dist/core/sql/run.js.map +1 -0
- package/dist/core/store/createStore.d.ts +49 -0
- package/dist/core/store/createStore.d.ts.map +1 -0
- package/dist/core/store/createStore.js +227 -0
- package/dist/core/store/createStore.js.map +1 -0
- package/dist/core/store/cursor.d.ts +4 -0
- package/dist/core/store/cursor.d.ts.map +1 -0
- package/dist/core/store/cursor.js +22 -0
- package/dist/core/store/cursor.js.map +1 -0
- package/dist/core/store/json.d.ts +80 -0
- package/dist/core/store/json.d.ts.map +1 -0
- package/dist/core/store/json.js +342 -0
- package/dist/core/store/json.js.map +1 -0
- package/dist/core/store.d.ts +160 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +2 -0
- package/dist/core/store.js.map +1 -0
- package/dist/core/wire.d.ts +20 -0
- package/dist/core/wire.d.ts.map +1 -0
- package/dist/core/wire.js +84 -0
- package/dist/core/wire.js.map +1 -0
- package/dist/core/withCaller.d.ts +16 -0
- package/dist/core/withCaller.d.ts.map +1 -0
- package/dist/core/withCaller.js +29 -0
- package/dist/core/withCaller.js.map +1 -0
- package/dist/d1/adapter.d.ts +12 -0
- package/dist/d1/adapter.d.ts.map +1 -0
- package/dist/d1/adapter.js +23 -0
- package/dist/d1/adapter.js.map +1 -0
- package/dist/d1/codec.d.ts +14 -0
- package/dist/d1/codec.d.ts.map +1 -0
- package/dist/d1/codec.js +136 -0
- package/dist/d1/codec.js.map +1 -0
- package/dist/d1/compile/index.d.ts +9 -0
- package/dist/d1/compile/index.d.ts.map +1 -0
- package/dist/d1/compile/index.js +9 -0
- package/dist/d1/compile/index.js.map +1 -0
- package/dist/d1/dialect.d.ts +4 -0
- package/dist/d1/dialect.d.ts.map +1 -0
- package/dist/d1/dialect.js +13 -0
- package/dist/d1/dialect.js.map +1 -0
- package/dist/d1/executor.d.ts +13 -0
- package/dist/d1/executor.d.ts.map +1 -0
- package/dist/d1/executor.js +91 -0
- package/dist/d1/executor.js.map +1 -0
- package/dist/d1/index.d.ts +6 -0
- package/dist/d1/index.d.ts.map +1 -0
- package/dist/d1/index.js +6 -0
- package/dist/d1/index.js.map +1 -0
- package/dist/d1/lower.d.ts +8 -0
- package/dist/d1/lower.d.ts.map +1 -0
- package/dist/d1/lower.js +167 -0
- package/dist/d1/lower.js.map +1 -0
- package/dist/d1/media.d.ts +5 -0
- package/dist/d1/media.d.ts.map +1 -0
- package/dist/d1/media.js +157 -0
- package/dist/d1/media.js.map +1 -0
- package/dist/d1/migrations.d.ts +12 -0
- package/dist/d1/migrations.d.ts.map +1 -0
- package/dist/d1/migrations.js +111 -0
- package/dist/d1/migrations.js.map +1 -0
- package/dist/d1/print.d.ts +28 -0
- package/dist/d1/print.d.ts.map +1 -0
- package/dist/d1/print.js +54 -0
- package/dist/d1/print.js.map +1 -0
- package/dist/d1/site.d.ts +17 -0
- package/dist/d1/site.d.ts.map +1 -0
- package/dist/d1/site.js +63 -0
- package/dist/d1/site.js.map +1 -0
- package/dist/d1/storage.d.ts +34 -0
- package/dist/d1/storage.d.ts.map +1 -0
- package/dist/d1/storage.js +288 -0
- package/dist/d1/storage.js.map +1 -0
- package/dist/d1/tz.d.ts +21 -0
- package/dist/d1/tz.d.ts.map +1 -0
- package/dist/d1/tz.js +54 -0
- package/dist/d1/tz.js.map +1 -0
- package/dist/d1/validator.d.ts +10 -0
- package/dist/d1/validator.d.ts.map +1 -0
- package/dist/d1/validator.js +33 -0
- package/dist/d1/validator.js.map +1 -0
- package/dist/mcp/apps.d.ts +43 -0
- package/dist/mcp/apps.d.ts.map +1 -0
- package/dist/mcp/apps.js +57 -0
- package/dist/mcp/apps.js.map +1 -0
- package/dist/mcp/catalog.d.ts +55 -0
- package/dist/mcp/catalog.d.ts.map +1 -0
- package/dist/mcp/catalog.js +81 -0
- package/dist/mcp/catalog.js.map +1 -0
- package/dist/mcp/createMcpSurface.d.ts +34 -0
- package/dist/mcp/createMcpSurface.d.ts.map +1 -0
- package/dist/mcp/createMcpSurface.js +150 -0
- package/dist/mcp/createMcpSurface.js.map +1 -0
- package/dist/mcp/index.d.ts +4 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +4 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/postgres/adapter.d.ts +20 -0
- package/dist/postgres/adapter.d.ts.map +1 -0
- package/dist/postgres/adapter.js +44 -0
- package/dist/postgres/adapter.js.map +1 -0
- package/dist/postgres/codec.d.ts +13 -0
- package/dist/postgres/codec.d.ts.map +1 -0
- package/dist/postgres/codec.js +110 -0
- package/dist/postgres/codec.js.map +1 -0
- package/dist/postgres/compile/index.d.ts +9 -0
- package/dist/postgres/compile/index.d.ts.map +1 -0
- package/dist/postgres/compile/index.js +9 -0
- package/dist/postgres/compile/index.js.map +1 -0
- package/dist/postgres/driver.d.ts +92 -0
- package/dist/postgres/driver.d.ts.map +1 -0
- package/dist/postgres/driver.js +110 -0
- package/dist/postgres/driver.js.map +1 -0
- package/dist/postgres/executor.d.ts +20 -0
- package/dist/postgres/executor.d.ts.map +1 -0
- package/dist/postgres/executor.js +69 -0
- package/dist/postgres/executor.js.map +1 -0
- package/dist/postgres/index.d.ts +7 -0
- package/dist/postgres/index.d.ts.map +1 -0
- package/dist/postgres/index.js +7 -0
- package/dist/postgres/index.js.map +1 -0
- package/dist/postgres/lower.d.ts +6 -0
- package/dist/postgres/lower.d.ts.map +1 -0
- package/dist/postgres/lower.js +157 -0
- package/dist/postgres/lower.js.map +1 -0
- package/dist/postgres/print.d.ts +11 -0
- package/dist/postgres/print.d.ts.map +1 -0
- package/dist/postgres/print.js +121 -0
- package/dist/postgres/print.js.map +1 -0
- package/dist/postgres/storage.d.ts +19 -0
- package/dist/postgres/storage.d.ts.map +1 -0
- package/dist/postgres/storage.js +201 -0
- package/dist/postgres/storage.js.map +1 -0
- package/dist/postgres/textRows.d.ts +10 -0
- package/dist/postgres/textRows.d.ts.map +1 -0
- package/dist/postgres/textRows.js +44 -0
- package/dist/postgres/textRows.js.map +1 -0
- package/dist/postgres/validator.d.ts +12 -0
- package/dist/postgres/validator.d.ts.map +1 -0
- package/dist/postgres/validator.js +46 -0
- package/dist/postgres/validator.js.map +1 -0
- package/dist/spec/domain/index.d.ts +3 -0
- package/dist/spec/domain/index.d.ts.map +1 -0
- package/dist/spec/domain/index.js +3 -0
- package/dist/spec/domain/index.js.map +1 -0
- package/dist/spec/domain/model/ContentState.d.ts +8 -0
- package/dist/spec/domain/model/ContentState.d.ts.map +1 -0
- package/dist/spec/domain/model/ContentState.js +7 -0
- package/dist/spec/domain/model/ContentState.js.map +1 -0
- package/dist/spec/domain/model/Entry.d.ts +29 -0
- package/dist/spec/domain/model/Entry.d.ts.map +1 -0
- package/dist/spec/domain/model/Entry.js +16 -0
- package/dist/spec/domain/model/Entry.js.map +1 -0
- package/dist/spec/domain/model/Locale.d.ts +30 -0
- package/dist/spec/domain/model/Locale.d.ts.map +1 -0
- package/dist/spec/domain/model/Locale.js +33 -0
- package/dist/spec/domain/model/Locale.js.map +1 -0
- package/dist/spec/domain/model/ManifestGrammar.d.ts +452 -0
- package/dist/spec/domain/model/ManifestGrammar.d.ts.map +1 -0
- package/dist/spec/domain/model/ManifestGrammar.js +149 -0
- package/dist/spec/domain/model/ManifestGrammar.js.map +1 -0
- package/dist/spec/domain/model/MediaMimeAccept.d.ts +55 -0
- package/dist/spec/domain/model/MediaMimeAccept.d.ts.map +1 -0
- package/dist/spec/domain/model/MediaMimeAccept.js +90 -0
- package/dist/spec/domain/model/MediaMimeAccept.js.map +1 -0
- package/dist/spec/domain/model/RuntimePlan.d.ts +94 -0
- package/dist/spec/domain/model/RuntimePlan.d.ts.map +1 -0
- package/dist/spec/domain/model/RuntimePlan.js +4 -0
- package/dist/spec/domain/model/RuntimePlan.js.map +1 -0
- package/dist/spec/domain/model/SiteConfig.d.ts +173 -0
- package/dist/spec/domain/model/SiteConfig.d.ts.map +1 -0
- package/dist/spec/domain/model/SiteConfig.js +13 -0
- package/dist/spec/domain/model/SiteConfig.js.map +1 -0
- package/dist/spec/domain/model/SqlIr.d.ts +96 -0
- package/dist/spec/domain/model/SqlIr.d.ts.map +1 -0
- package/dist/spec/domain/model/SqlIr.js +95 -0
- package/dist/spec/domain/model/SqlIr.js.map +1 -0
- package/dist/spec/domain/model/index.d.ts +14 -0
- package/dist/spec/domain/model/index.d.ts.map +1 -0
- package/dist/spec/domain/model/index.js +14 -0
- package/dist/spec/domain/model/index.js.map +1 -0
- package/dist/spec/domain/service/CloudflareCron.d.ts +2 -0
- package/dist/spec/domain/service/CloudflareCron.d.ts.map +1 -0
- package/dist/spec/domain/service/CloudflareCron.js +63 -0
- package/dist/spec/domain/service/CloudflareCron.js.map +1 -0
- package/dist/spec/domain/service/CrossSchemaChecker.d.ts +34 -0
- package/dist/spec/domain/service/CrossSchemaChecker.d.ts.map +1 -0
- package/dist/spec/domain/service/CrossSchemaChecker.js +114 -0
- package/dist/spec/domain/service/CrossSchemaChecker.js.map +1 -0
- package/dist/spec/domain/service/EntryDataValidator.d.ts +56 -0
- package/dist/spec/domain/service/EntryDataValidator.d.ts.map +1 -0
- package/dist/spec/domain/service/EntryDataValidator.js +88 -0
- package/dist/spec/domain/service/EntryDataValidator.js.map +1 -0
- package/dist/spec/domain/service/JsonSchemaToZod.d.ts +29 -0
- package/dist/spec/domain/service/JsonSchemaToZod.d.ts.map +1 -0
- package/dist/spec/domain/service/JsonSchemaToZod.js +156 -0
- package/dist/spec/domain/service/JsonSchemaToZod.js.map +1 -0
- package/dist/spec/domain/service/LifecycleStateMachine.d.ts +75 -0
- package/dist/spec/domain/service/LifecycleStateMachine.d.ts.map +1 -0
- package/dist/spec/domain/service/LifecycleStateMachine.js +76 -0
- package/dist/spec/domain/service/LifecycleStateMachine.js.map +1 -0
- package/dist/spec/domain/service/LocaleCanonicalizer.d.ts +29 -0
- package/dist/spec/domain/service/LocaleCanonicalizer.d.ts.map +1 -0
- package/dist/spec/domain/service/LocaleCanonicalizer.js +96 -0
- package/dist/spec/domain/service/LocaleCanonicalizer.js.map +1 -0
- package/dist/spec/domain/service/ManifestFieldChecks.d.ts +60 -0
- package/dist/spec/domain/service/ManifestFieldChecks.d.ts.map +1 -0
- package/dist/spec/domain/service/ManifestFieldChecks.js +116 -0
- package/dist/spec/domain/service/ManifestFieldChecks.js.map +1 -0
- package/dist/spec/domain/service/ManifestGraphValidator.d.ts +15 -0
- package/dist/spec/domain/service/ManifestGraphValidator.d.ts.map +1 -0
- package/dist/spec/domain/service/ManifestGraphValidator.js +225 -0
- package/dist/spec/domain/service/ManifestGraphValidator.js.map +1 -0
- package/dist/spec/domain/service/ManifestLinker.d.ts +45 -0
- package/dist/spec/domain/service/ManifestLinker.d.ts.map +1 -0
- package/dist/spec/domain/service/ManifestLinker.js +92 -0
- package/dist/spec/domain/service/ManifestLinker.js.map +1 -0
- package/dist/spec/domain/service/ManifestLocaleTrimmer.d.ts +16 -0
- package/dist/spec/domain/service/ManifestLocaleTrimmer.d.ts.map +1 -0
- package/dist/spec/domain/service/ManifestLocaleTrimmer.js +76 -0
- package/dist/spec/domain/service/ManifestLocaleTrimmer.js.map +1 -0
- package/dist/spec/domain/service/ManifestParser.d.ts +49 -0
- package/dist/spec/domain/service/ManifestParser.d.ts.map +1 -0
- package/dist/spec/domain/service/ManifestParser.js +203 -0
- package/dist/spec/domain/service/ManifestParser.js.map +1 -0
- package/dist/spec/domain/service/ManifestPartition.d.ts +9 -0
- package/dist/spec/domain/service/ManifestPartition.d.ts.map +1 -0
- package/dist/spec/domain/service/ManifestPartition.js +19 -0
- package/dist/spec/domain/service/ManifestPartition.js.map +1 -0
- package/dist/spec/domain/service/ManifestPathDiagnoser.d.ts +33 -0
- package/dist/spec/domain/service/ManifestPathDiagnoser.d.ts.map +1 -0
- package/dist/spec/domain/service/ManifestPathDiagnoser.js +43 -0
- package/dist/spec/domain/service/ManifestPathDiagnoser.js.map +1 -0
- package/dist/spec/domain/service/ManifestSourceSpans.d.ts +10 -0
- package/dist/spec/domain/service/ManifestSourceSpans.d.ts.map +1 -0
- package/dist/spec/domain/service/ManifestSourceSpans.js +76 -0
- package/dist/spec/domain/service/ManifestSourceSpans.js.map +1 -0
- package/dist/spec/domain/service/McpToolNaming.d.ts +25 -0
- package/dist/spec/domain/service/McpToolNaming.d.ts.map +1 -0
- package/dist/spec/domain/service/McpToolNaming.js +50 -0
- package/dist/spec/domain/service/McpToolNaming.js.map +1 -0
- package/dist/spec/domain/service/PlanFingerprint.d.ts +4 -0
- package/dist/spec/domain/service/PlanFingerprint.d.ts.map +1 -0
- package/dist/spec/domain/service/PlanFingerprint.js +14 -0
- package/dist/spec/domain/service/PlanFingerprint.js.map +1 -0
- package/dist/spec/domain/service/ProcedureViewSpecChecks.d.ts +4 -0
- package/dist/spec/domain/service/ProcedureViewSpecChecks.d.ts.map +1 -0
- package/dist/spec/domain/service/ProcedureViewSpecChecks.js +211 -0
- package/dist/spec/domain/service/ProcedureViewSpecChecks.js.map +1 -0
- package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts +42 -0
- package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts.map +1 -0
- package/dist/spec/domain/service/SchemaAdminUiChecker.js +289 -0
- package/dist/spec/domain/service/SchemaAdminUiChecker.js.map +1 -0
- package/dist/spec/domain/service/SchemaIndexChecker.d.ts +33 -0
- package/dist/spec/domain/service/SchemaIndexChecker.d.ts.map +1 -0
- package/dist/spec/domain/service/SchemaIndexChecker.js +256 -0
- package/dist/spec/domain/service/SchemaIndexChecker.js.map +1 -0
- package/dist/spec/domain/service/SchemaSearchChecker.d.ts +11 -0
- package/dist/spec/domain/service/SchemaSearchChecker.d.ts.map +1 -0
- package/dist/spec/domain/service/SchemaSearchChecker.js +78 -0
- package/dist/spec/domain/service/SchemaSearchChecker.js.map +1 -0
- package/dist/spec/domain/service/SchemaSpecChecks.d.ts +31 -0
- package/dist/spec/domain/service/SchemaSpecChecks.d.ts.map +1 -0
- package/dist/spec/domain/service/SchemaSpecChecks.js +445 -0
- package/dist/spec/domain/service/SchemaSpecChecks.js.map +1 -0
- package/dist/spec/domain/service/SiteDefaultsValidator.d.ts +39 -0
- package/dist/spec/domain/service/SiteDefaultsValidator.d.ts.map +1 -0
- package/dist/spec/domain/service/SiteDefaultsValidator.js +194 -0
- package/dist/spec/domain/service/SiteDefaultsValidator.js.map +1 -0
- package/dist/spec/domain/service/SqlClassify.d.ts +19 -0
- package/dist/spec/domain/service/SqlClassify.d.ts.map +1 -0
- package/dist/spec/domain/service/SqlClassify.js +42 -0
- package/dist/spec/domain/service/SqlClassify.js.map +1 -0
- package/dist/spec/domain/service/SqlRefusal.d.ts +16 -0
- package/dist/spec/domain/service/SqlRefusal.d.ts.map +1 -0
- package/dist/spec/domain/service/SqlRefusal.js +20 -0
- package/dist/spec/domain/service/SqlRefusal.js.map +1 -0
- package/dist/spec/domain/service/SqlTypes.d.ts +40 -0
- package/dist/spec/domain/service/SqlTypes.d.ts.map +1 -0
- package/dist/spec/domain/service/SqlTypes.js +110 -0
- package/dist/spec/domain/service/SqlTypes.js.map +1 -0
- package/dist/spec/domain/service/StaffRoleHierarchy.d.ts +3 -0
- package/dist/spec/domain/service/StaffRoleHierarchy.d.ts.map +1 -0
- package/dist/spec/domain/service/StaffRoleHierarchy.js +19 -0
- package/dist/spec/domain/service/StaffRoleHierarchy.js.map +1 -0
- package/dist/spec/domain/service/TriggerGraphChecks.d.ts +16 -0
- package/dist/spec/domain/service/TriggerGraphChecks.d.ts.map +1 -0
- package/dist/spec/domain/service/TriggerGraphChecks.js +337 -0
- package/dist/spec/domain/service/TriggerGraphChecks.js.map +1 -0
- package/dist/spec/domain/service/TriggerSpecChecks.d.ts +4 -0
- package/dist/spec/domain/service/TriggerSpecChecks.d.ts.map +1 -0
- package/dist/spec/domain/service/TriggerSpecChecks.js +89 -0
- package/dist/spec/domain/service/TriggerSpecChecks.js.map +1 -0
- package/dist/spec/domain/service/ValidatedAdminUiProjection.d.ts +11 -0
- package/dist/spec/domain/service/ValidatedAdminUiProjection.d.ts.map +1 -0
- package/dist/spec/domain/service/ValidatedAdminUiProjection.js +26 -0
- package/dist/spec/domain/service/ValidatedAdminUiProjection.js.map +1 -0
- package/dist/spec/domain/service/ViewAdminUiChecker.d.ts +14 -0
- package/dist/spec/domain/service/ViewAdminUiChecker.d.ts.map +1 -0
- package/dist/spec/domain/service/ViewAdminUiChecker.js +53 -0
- package/dist/spec/domain/service/ViewAdminUiChecker.js.map +1 -0
- package/dist/spec/domain/service/index.d.ts +24 -0
- package/dist/spec/domain/service/index.d.ts.map +1 -0
- package/dist/spec/domain/service/index.js +24 -0
- package/dist/spec/domain/service/index.js.map +1 -0
- package/dist/spec/index.d.ts +10 -0
- package/dist/spec/index.d.ts.map +1 -0
- package/dist/spec/index.js +12 -0
- package/dist/spec/index.js.map +1 -0
- package/dist/spec/infrastructure/cli/parseArgsError.d.ts +16 -0
- package/dist/spec/infrastructure/cli/parseArgsError.d.ts.map +1 -0
- package/dist/spec/infrastructure/cli/parseArgsError.js +34 -0
- package/dist/spec/infrastructure/cli/parseArgsError.js.map +1 -0
- package/dist/spec/infrastructure/index.d.ts +2 -0
- package/dist/spec/infrastructure/index.d.ts.map +1 -0
- package/dist/spec/infrastructure/index.js +2 -0
- package/dist/spec/infrastructure/index.js.map +1 -0
- package/dist/spec/infrastructure/sql/PgQueryParser.d.ts +18 -0
- package/dist/spec/infrastructure/sql/PgQueryParser.d.ts.map +1 -0
- package/dist/spec/infrastructure/sql/PgQueryParser.js +17 -0
- package/dist/spec/infrastructure/sql/PgQueryParser.js.map +1 -0
- package/dist/spec/infrastructure/sql/compilePlan.d.ts +37 -0
- package/dist/spec/infrastructure/sql/compilePlan.d.ts.map +1 -0
- package/dist/spec/infrastructure/sql/compilePlan.js +282 -0
- package/dist/spec/infrastructure/sql/compilePlan.js.map +1 -0
- package/dist/spec/infrastructure/sql/compileSql.d.ts +35 -0
- package/dist/spec/infrastructure/sql/compileSql.d.ts.map +1 -0
- package/dist/spec/infrastructure/sql/compileSql.js +92 -0
- package/dist/spec/infrastructure/sql/compileSql.js.map +1 -0
- package/dist/spec/infrastructure/sql/frontEnd.d.ts +8 -0
- package/dist/spec/infrastructure/sql/frontEnd.d.ts.map +1 -0
- package/dist/spec/infrastructure/sql/frontEnd.js +100 -0
- package/dist/spec/infrastructure/sql/frontEnd.js.map +1 -0
- package/dist/spec/infrastructure/sql/index.d.ts +4 -0
- package/dist/spec/infrastructure/sql/index.d.ts.map +1 -0
- package/dist/spec/infrastructure/sql/index.js +4 -0
- package/dist/spec/infrastructure/sql/index.js.map +1 -0
- package/dist/spec/kernel/diagnostic.d.ts +137 -0
- package/dist/spec/kernel/diagnostic.d.ts.map +1 -0
- package/dist/spec/kernel/diagnostic.js +296 -0
- package/dist/spec/kernel/diagnostic.js.map +1 -0
- package/dist/spec/kernel/index.d.ts +8 -0
- package/dist/spec/kernel/index.d.ts.map +1 -0
- package/dist/spec/kernel/index.js +8 -0
- package/dist/spec/kernel/index.js.map +1 -0
- package/dist/spec/usecase/EmitTypes.d.ts +22 -0
- package/dist/spec/usecase/EmitTypes.d.ts.map +1 -0
- package/dist/spec/usecase/EmitTypes.js +182 -0
- package/dist/spec/usecase/EmitTypes.js.map +1 -0
- package/dist/spec/usecase/ValidateManifestsUseCase.d.ts +8 -0
- package/dist/spec/usecase/ValidateManifestsUseCase.d.ts.map +1 -0
- package/dist/spec/usecase/ValidateManifestsUseCase.js +101 -0
- package/dist/spec/usecase/ValidateManifestsUseCase.js.map +1 -0
- package/dist/spec/usecase/dto/ValidateManifestsRequest.d.ts +27 -0
- package/dist/spec/usecase/dto/ValidateManifestsRequest.d.ts.map +1 -0
- package/dist/spec/usecase/dto/ValidateManifestsRequest.js +2 -0
- package/dist/spec/usecase/dto/ValidateManifestsRequest.js.map +1 -0
- package/dist/spec/usecase/dto/ValidateManifestsResponse.d.ts +14 -0
- package/dist/spec/usecase/dto/ValidateManifestsResponse.d.ts.map +1 -0
- package/dist/spec/usecase/dto/ValidateManifestsResponse.js +2 -0
- package/dist/spec/usecase/dto/ValidateManifestsResponse.js.map +1 -0
- package/dist/spec/usecase/dto/index.d.ts +3 -0
- package/dist/spec/usecase/dto/index.d.ts.map +1 -0
- package/dist/spec/usecase/dto/index.js +3 -0
- package/dist/spec/usecase/dto/index.js.map +1 -0
- package/dist/spec/usecase/index.d.ts +10 -0
- package/dist/spec/usecase/index.d.ts.map +1 -0
- package/dist/spec/usecase/index.js +10 -0
- package/dist/spec/usecase/index.js.map +1 -0
- package/dist/testing/cases/before-hook.d.ts +4 -0
- package/dist/testing/cases/before-hook.d.ts.map +1 -0
- package/dist/testing/cases/before-hook.js +71 -0
- package/dist/testing/cases/before-hook.js.map +1 -0
- package/dist/testing/cases/corpus.d.ts +12 -0
- package/dist/testing/cases/corpus.d.ts.map +1 -0
- package/dist/testing/cases/corpus.js +91 -0
- package/dist/testing/cases/corpus.js.map +1 -0
- package/dist/testing/cases/policy.d.ts +74 -0
- package/dist/testing/cases/policy.d.ts.map +1 -0
- package/dist/testing/cases/policy.js +142 -0
- package/dist/testing/cases/policy.js.map +1 -0
- package/dist/testing/cases/printer.d.ts +4 -0
- package/dist/testing/cases/printer.d.ts.map +1 -0
- package/dist/testing/cases/printer.js +32 -0
- package/dist/testing/cases/printer.js.map +1 -0
- package/dist/testing/cases/report-view.d.ts +5 -0
- package/dist/testing/cases/report-view.d.ts.map +1 -0
- package/dist/testing/cases/report-view.js +33 -0
- package/dist/testing/cases/report-view.js.map +1 -0
- package/dist/testing/cases/requisition.d.ts +4 -0
- package/dist/testing/cases/requisition.d.ts.map +1 -0
- package/dist/testing/cases/requisition.js +38 -0
- package/dist/testing/cases/requisition.js.map +1 -0
- package/dist/testing/cases/search-places.d.ts +4 -0
- package/dist/testing/cases/search-places.d.ts.map +1 -0
- package/dist/testing/cases/search-places.js +60 -0
- package/dist/testing/cases/search-places.js.map +1 -0
- package/dist/testing/cases/stock.d.ts +4 -0
- package/dist/testing/cases/stock.d.ts.map +1 -0
- package/dist/testing/cases/stock.js +35 -0
- package/dist/testing/cases/stock.js.map +1 -0
- package/dist/testing/cases/store.d.ts +4 -0
- package/dist/testing/cases/store.d.ts.map +1 -0
- package/dist/testing/cases/store.js +100 -0
- package/dist/testing/cases/store.js.map +1 -0
- package/dist/testing/harness.d.ts +94 -0
- package/dist/testing/harness.d.ts.map +1 -0
- package/dist/testing/harness.js +168 -0
- package/dist/testing/harness.js.map +1 -0
- package/dist/testing/index.d.ts +37 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +43 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/report.d.ts +15 -0
- package/dist/testing/report.d.ts.map +1 -0
- package/dist/testing/report.js +22 -0
- package/dist/testing/report.js.map +1 -0
- package/dist/web/createRestSurface.d.ts +7 -0
- package/dist/web/createRestSurface.d.ts.map +1 -0
- package/dist/web/createRestSurface.js +39 -0
- package/dist/web/createRestSurface.js.map +1 -0
- package/dist/web/index.d.ts +2 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +2 -0
- package/dist/web/index.js.map +1 -0
- package/docs/adr/0008-structured-diagnostic-shape.md +2 -2
- package/docs/adr/0011-adapter-port-spec.md +2 -2
- package/docs/adr/0014-auth-better-auth-and-multi-tenant-mcp.md +21 -2
- package/docs/adr/0019-sealed-manifest-runtime-pipeline.md +5 -1
- package/docs/adr/0022-caller-observed-version-occ.md +1 -1
- package/docs/adr/0024-manifest-native-schema-tables.md +2 -2
- package/docs/adr/0027-scheduled-procedure-triggers.md +1 -1
- package/docs/adr/0028-schema-ttl-expiry.md +3 -3
- package/docs/adr/0029-mcp-apps-interaction-contracts.md +324 -0
- package/docs/adr/0030-store.md +40 -0
- package/docs/adr/0031-host-cloud-core-contract.md +25 -0
- package/docs/adr/0032-store-centric-core-and-service-contract.md +361 -0
- package/docs/adr/0033-storage-converges-to-the-plan.md +92 -0
- package/docs/adr/0034-store-is-authored-as-sql.md +192 -0
- package/docs/adr/0035-sql-dialects.md +154 -0
- package/docs/adr/0036-host-and-dialect.md +65 -0
- package/docs/adr/0037-postgresql-is-the-reference-dialect.md +124 -0
- package/docs/adr/0038-bun-native-host.md +63 -0
- package/docs/adr/README.md +23 -8
- package/docs/adr/adr-lite-861-admin-webmcp.md +6 -0
- package/docs/adr/adr-lite-909-admin-ui-kit.md +1 -1
- package/docs/examples/README.md +16 -18
- package/docs/examples/commerce-inventory.md +481 -0
- package/docs/examples/commerce.md +254 -0
- package/docs/examples/guarded-api.md +238 -0
- package/docs/examples/intake-hooks.md +237 -0
- package/docs/examples/intake.md +127 -0
- package/docs/examples/legal-documents.md +218 -0
- package/docs/examples/procurement.md +215 -0
- package/docs/examples/publication.md +211 -0
- package/docs/examples/reference-service/.dev.vars.example +4 -0
- package/docs/examples/reference-service/.mantle/generated/mantle.ts +174 -0
- package/docs/examples/reference-service/.mantle/generated/plan.json +1936 -0
- package/docs/examples/reference-service/README.md +33 -0
- package/docs/examples/reference-service/manifests/catalog.yaml +103 -0
- package/docs/examples/reference-service/manifests/orders.yaml +120 -0
- package/docs/examples/reference-service/mantle.config.json +1 -0
- package/docs/examples/reference-service/package.json +27 -0
- package/docs/examples/reference-service/smoke.mjs +156 -0
- package/docs/examples/reference-service/src/handlers.ts +36 -0
- package/docs/examples/reference-service/src/index.ts +33 -0
- package/docs/examples/reference-service/src/service.ts +78 -0
- package/docs/examples/{host-minimal-worker → reference-service}/tsconfig.json +7 -2
- package/docs/examples/reference-service/wrangler.jsonc +26 -0
- package/docs/examples/reservation.md +142 -0
- package/docs/handbook/cloudflare/authentication.md +96 -316
- package/docs/handbook/cloudflare/chatgpt-sites.md +104 -15
- package/docs/handbook/cloudflare/deploy-and-operate.md +77 -71
- package/docs/handbook/cloudflare/media-r2.md +64 -187
- package/docs/handbook/cloudflare/service-entry.md +138 -0
- package/docs/handbook/concepts/authorization.md +104 -94
- package/docs/handbook/concepts/four-atoms.md +68 -144
- package/docs/handbook/concepts/lifecycle-and-locales.md +62 -114
- package/docs/handbook/concepts/mcp-and-agents.md +112 -117
- package/docs/handbook/concepts/procedures-and-triggers.md +126 -181
- package/docs/handbook/concepts/runtime-and-adapters.md +177 -163
- package/docs/handbook/concepts/views.md +97 -173
- package/docs/handbook/examples/hub.md +17 -6
- package/docs/handbook/guides/admin-ui.md +101 -96
- package/docs/handbook/guides/agent-setup.md +56 -71
- package/docs/handbook/guides/typed-queries.md +105 -111
- package/docs/handbook/navigation.json +8 -33
- package/docs/handbook/reference/authorization.md +52 -271
- package/docs/handbook/reference/diagnostics.md +69 -178
- package/docs/handbook/reference/features.md +48 -50
- package/docs/handbook/reference/manifest.md +56 -116
- package/docs/handbook/reference/procedure.md +91 -279
- package/docs/handbook/reference/schema.md +154 -239
- package/docs/handbook/reference/site-config.md +58 -211
- package/docs/handbook/reference/surface.md +69 -181
- package/docs/handbook/reference/trigger.md +72 -181
- package/docs/handbook/reference/view.md +140 -241
- package/docs/handbook/releases/index.md +58 -77
- package/docs/handbook/start/overview.md +59 -51
- package/docs/handbook/start/project-and-cli.md +132 -105
- package/docs/handbook/start/quickstart-worker.md +102 -160
- package/docs/skills/develop/SKILL.md +114 -240
- package/docs/skills/develop/mcp-app.md +79 -0
- package/docs/skills/integrate/SKILL.md +83 -47
- package/docs/skills/media-gc/SKILL.md +21 -10
- package/docs/skills/provision/SKILL.md +68 -162
- package/docs/skills/update/SKILL.md +33 -34
- package/docs/upgrade-0.1-to-0.2.md +211 -0
- package/package.json +87 -106
- package/dist/admin-ui.d.ts +0 -2
- package/dist/admin-ui.d.ts.map +0 -1
- package/dist/admin-ui.js +0 -2
- package/dist/admin-ui.js.map +0 -1
- package/dist/admin.d.ts +0 -2
- package/dist/admin.d.ts.map +0 -1
- package/dist/admin.js +0 -2
- package/dist/admin.js.map +0 -1
- package/dist/auth.d.ts +0 -2
- package/dist/auth.d.ts.map +0 -1
- package/dist/auth.js +0 -2
- package/dist/auth.js.map +0 -1
- package/dist/bun.d.ts +0 -2
- package/dist/bun.d.ts.map +0 -1
- package/dist/bun.js +0 -2
- package/dist/bun.js.map +0 -1
- package/dist/cli/generate-cloudflare.d.ts +0 -7
- package/dist/cli/generate-cloudflare.d.ts.map +0 -1
- package/dist/cli/generate-cloudflare.js +0 -123
- package/dist/cli/generate-cloudflare.js.map +0 -1
- package/dist/cli/generate-project.d.ts +0 -25
- package/dist/cli/generate-project.d.ts.map +0 -1
- package/dist/cli/generate-project.js +0 -282
- package/dist/cli/generate-project.js.map +0 -1
- package/dist/cli/generate-sites.d.ts +0 -8
- package/dist/cli/generate-sites.d.ts.map +0 -1
- package/dist/cli/generate-sites.js +0 -273
- package/dist/cli/generate-sites.js.map +0 -1
- package/dist/cli/harness.d.ts +0 -3
- package/dist/cli/harness.d.ts.map +0 -1
- package/dist/cli/harness.js +0 -214
- package/dist/cli/harness.js.map +0 -1
- package/dist/cli/skills.d.ts +0 -3
- package/dist/cli/skills.d.ts.map +0 -1
- package/dist/cli/skills.js +0 -128
- package/dist/cli/skills.js.map +0 -1
- package/dist/cloudflare.d.ts +0 -2
- package/dist/cloudflare.d.ts.map +0 -1
- package/dist/cloudflare.js +0 -2
- package/dist/cloudflare.js.map +0 -1
- package/dist/codegen/emitMantleModule.d.ts +0 -22
- package/dist/codegen/emitMantleModule.d.ts.map +0 -1
- package/dist/codegen/emitMantleModule.js +0 -291
- package/dist/codegen/emitMantleModule.js.map +0 -1
- package/dist/codegen.d.ts +0 -2
- package/dist/codegen.d.ts.map +0 -1
- package/dist/codegen.js +0 -2
- package/dist/codegen.js.map +0 -1
- package/dist/runtime-testing.d.ts +0 -2
- package/dist/runtime-testing.d.ts.map +0 -1
- package/dist/runtime-testing.js +0 -2
- package/dist/runtime-testing.js.map +0 -1
- package/dist/runtime.d.ts +0 -2
- package/dist/runtime.d.ts.map +0 -1
- package/dist/runtime.js +0 -2
- package/dist/runtime.js.map +0 -1
- package/dist/spec.d.ts +0 -2
- package/dist/spec.d.ts.map +0 -1
- package/dist/spec.js +0 -2
- package/dist/spec.js.map +0 -1
- package/dist/vercel-libsql.d.ts +0 -2
- package/dist/vercel-libsql.d.ts.map +0 -1
- package/dist/vercel-libsql.js +0 -2
- package/dist/vercel-libsql.js.map +0 -1
- package/dist/vercel.d.ts +0 -2
- package/dist/vercel.d.ts.map +0 -1
- package/dist/vercel.js +0 -2
- package/dist/vercel.js.map +0 -1
- package/dist/web.d.ts +0 -2
- package/dist/web.d.ts.map +0 -1
- package/dist/web.js +0 -2
- package/dist/web.js.map +0 -1
- package/docs/adapter-guide.md +0 -222
- package/docs/agent-prompts.md +0 -64
- package/docs/api-mcp-authorization.md +0 -5
- package/docs/assets/mantle-admin-developer.png +0 -0
- package/docs/assets/mantle-admin-operations.png +0 -0
- package/docs/assets/mantle-hero.jpg +0 -0
- package/docs/auth-hosting-model.md +0 -166
- package/docs/cloudflare-low-level-composition.md +0 -5
- package/docs/consumer-onboarding-audit.md +0 -65
- package/docs/deferred-lifecycle-queues.md +0 -5
- package/docs/design-atoms.md +0 -16
- package/docs/design-references/editorial-blog-2026-05-05.md +0 -218
- package/docs/direct-authoring.md +0 -5
- package/docs/examples/builtin-commerce.md +0 -269
- package/docs/examples/builtin-intake.md +0 -143
- package/docs/examples/builtin-legal-documents.md +0 -189
- package/docs/examples/builtin-procurement.md +0 -241
- package/docs/examples/builtin-publication.md +0 -241
- package/docs/examples/builtin-reservation.md +0 -149
- package/docs/examples/cf-primitives-commerce-inventory.md +0 -809
- package/docs/examples/cf-primitives-guarded-api.md +0 -429
- package/docs/examples/cf-primitives-intake-hooks.md +0 -319
- package/docs/examples/host-chatgpt-sites/.openai/hosting.json +0 -1
- package/docs/examples/host-chatgpt-sites/README.md +0 -70
- package/docs/examples/host-chatgpt-sites/drizzle/0000_sites_users.sql +0 -8
- package/docs/examples/host-chatgpt-sites/drizzle/0001_mantle.sql +0 -294
- package/docs/examples/host-chatgpt-sites/drizzle/0002_article_cover.sql +0 -5
- package/docs/examples/host-chatgpt-sites/drizzle/0003_store_instance_id.sql +0 -1
- package/docs/examples/host-chatgpt-sites/drizzle/0004_mantle.sql +0 -10
- package/docs/examples/host-chatgpt-sites/drizzle/0005_mantle.sql +0 -24
- package/docs/examples/host-chatgpt-sites/drizzle/meta/_journal.json +0 -1
- package/docs/examples/host-chatgpt-sites/drizzle/meta/mantle-state.json +0 -60
- package/docs/examples/host-chatgpt-sites/manifests/site.yaml +0 -27
- package/docs/examples/host-chatgpt-sites/package.json +0 -1
- package/docs/examples/host-chatgpt-sites/public/site.css +0 -1
- package/docs/examples/host-chatgpt-sites/scripts/build.mjs +0 -13
- package/docs/examples/host-chatgpt-sites/scripts/check.mjs +0 -101
- package/docs/examples/host-chatgpt-sites/scripts/migration.mjs +0 -43
- package/docs/examples/host-chatgpt-sites/src/chatgpt-auth.ts +0 -66
- package/docs/examples/host-chatgpt-sites/src/index.ts +0 -46
- package/docs/examples/host-chatgpt-sites/src/mcp.ts +0 -49
- package/docs/examples/host-chatgpt-sites/src/media.ts +0 -109
- package/docs/examples/host-chatgpt-sites/src/r2-lab.ts +0 -38
- package/docs/examples/host-chatgpt-sites/src/storage-fingerprint.json +0 -1
- package/docs/examples/host-chatgpt-sites/src/web.ts +0 -35
- package/docs/examples/host-chatgpt-sites/tsconfig.json +0 -1
- package/docs/examples/host-chatgpt-sites/wrangler.jsonc +0 -10
- package/docs/examples/host-local-admin-otp/.dev.vars.example +0 -3
- package/docs/examples/host-local-admin-otp/README.md +0 -80
- package/docs/examples/host-local-admin-otp/ensure-dev-vars.mjs +0 -5
- package/docs/examples/host-local-admin-otp/manifests/site.yaml +0 -25
- package/docs/examples/host-local-admin-otp/package.json +0 -29
- package/docs/examples/host-local-admin-otp/public/.gitkeep +0 -1
- package/docs/examples/host-local-admin-otp/smoke.mjs +0 -141
- package/docs/examples/host-local-admin-otp/src/index.ts +0 -54
- package/docs/examples/host-local-admin-otp/tsconfig.json +0 -17
- package/docs/examples/host-local-admin-otp/wrangler.jsonc +0 -23
- package/docs/examples/host-minimal-worker/README.md +0 -41
- package/docs/examples/host-minimal-worker/manifests/site.yaml +0 -25
- package/docs/examples/host-minimal-worker/package.json +0 -26
- package/docs/examples/host-minimal-worker/smoke.mjs +0 -23
- package/docs/examples/host-minimal-worker/src/index.ts +0 -4
- package/docs/examples/host-minimal-worker/wrangler.jsonc +0 -22
- package/docs/handbook/chatgpt-sites/equipment-checkout.md +0 -231
- package/docs/handbook/chatgpt-sites/generated-app.md +0 -84
- package/docs/handbook/chatgpt-sites/host-reference.md +0 -113
- package/docs/handbook/chatgpt-sites/index.md +0 -133
- package/docs/handbook/cloudflare/bindings.md +0 -291
- package/docs/handbook/cloudflare/conventional-worker.md +0 -166
- package/docs/handbook/cloudflare/deferred-hooks-queues.md +0 -170
- package/docs/handbook/cloudflare/low-level-composition.md +0 -169
- package/docs/handbook/cloudflare/public-web.md +0 -144
- package/docs/handbook/cloudflare/site-chrome.md +0 -75
- package/docs/handbook/examples/commerce-transaction.md +0 -11
- package/docs/handbook/examples/commerce.md +0 -11
- package/docs/handbook/examples/guarded-api.md +0 -10
- package/docs/handbook/examples/intake-form.md +0 -12
- package/docs/handbook/examples/intake-hooks.md +0 -11
- package/docs/handbook/examples/legal-documents.md +0 -10
- package/docs/handbook/examples/procurement-approvals.md +0 -10
- package/docs/handbook/examples/publication.md +0 -10
- package/docs/handbook/examples/reservation.md +0 -10
- package/docs/handbook/start/quickstart-admin.md +0 -52
- package/docs/labels.md +0 -71
- package/docs/media-uploads.md +0 -5
- package/docs/migration-0.1.2.md +0 -13
- package/docs/performance-harness.md +0 -228
- package/docs/release-process.md +0 -244
- package/docs/schema-indexes.md +0 -5
- package/docs/sealed-pipeline-ownership.md +0 -101
- package/docs/skills/plugin/SKILL.md +0 -132
- package/docs/skills/theme/SKILL.md +0 -77
- package/docs/spec-only-host-adoption.md +0 -157
- package/docs/transaction-patterns.md +0 -5
- package/skills/README.md +0 -127
- package/skills/develop/SKILL.md +0 -258
- package/skills/install/SKILL.md +0 -112
- package/skills/integrate/SKILL.md +0 -60
- package/skills/media-gc/SKILL.md +0 -85
- package/skills/plugin/SKILL.md +0 -132
- package/skills/provision/SKILL.md +0 -194
- package/skills/theme/SKILL.md +0 -77
- package/skills/update/SKILL.md +0 -51
- package/templates/chatgpt-sites/auth.ts +0 -66
- package/templates/chatgpt-sites/build.mjs +0 -14
- package/templates/chatgpt-sites/env.ts +0 -1
- package/templates/chatgpt-sites/mcp.ts +0 -48
- package/templates/chatgpt-sites/public-mcp.ts +0 -29
- package/templates/chatgpt-sites/smoke-local.mjs +0 -20
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Generate a blank Mantle app for ChatGPT Sites, apply D1 migrations, and verify local Admin and MCP.
|
|
3
|
-
---
|
|
4
|
-
# Generate a ChatGPT Sites app
|
|
5
|
-
|
|
6
|
-
`mantle generate --host chatgpt-sites` creates a blank home, a D1-backed Runtime,
|
|
7
|
-
public API and MCP, and Mantle Admin. It adds no article Schema, media bucket, or
|
|
8
|
-
demo content. Edit `src/home.ts` and add your own manifests and handlers as needed.
|
|
9
|
-
|
|
10
|
-
```sh
|
|
11
|
-
mkdir my-site && cd my-site
|
|
12
|
-
npm init -y
|
|
13
|
-
npm pkg set type=module
|
|
14
|
-
npm install --save-exact @aotter/mantle
|
|
15
|
-
npx mantle generate --host chatgpt-sites
|
|
16
|
-
npm install
|
|
17
|
-
npx mantle generate
|
|
18
|
-
npm run build
|
|
19
|
-
npx wrangler d1 migrations apply my-site --local
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
The first generate declares the exact Mantle package versions it needs; the
|
|
23
|
-
second runs after those packages are installed. Review `drizzle/0000_mantle.sql`
|
|
24
|
-
before applying it. The D1 name comes from `wrangler.jsonc`. Generation does not
|
|
25
|
-
apply a migration, provision a Site, or publish one. `npm run build` removes the
|
|
26
|
-
old `dist` before copying the current migrations and Admin assets.
|
|
27
|
-
|
|
28
|
-
For local Admin, copy `.dev.vars.example` to `.dev.vars`, set `OWNER_EMAIL` to
|
|
29
|
-
the email of the ChatGPT account that will own this Site, and keep
|
|
30
|
-
`PUBLIC_ORIGIN` equal to the local URL. Run `npm run dev`.
|
|
31
|
-
The plain local browser has no ChatGPT Sites identity, so it will redirect to
|
|
32
|
-
Sites sign-in and cannot prove owner access. To exercise the identity contract
|
|
33
|
-
locally, set `MANTLE_TEST_OWNER_EMAIL` to the same email and run
|
|
34
|
-
`npm run smoke:local`. That script refuses non-loopback
|
|
35
|
-
targets. Its identity headers are a local simulation; the production Worker
|
|
36
|
-
contains no identity-injection path and must run behind Sites' trusted
|
|
37
|
-
identity-stripping dispatcher. The generated Wrangler config disables the
|
|
38
|
-
independent `workers.dev` URL; do not add a direct Worker route. A passing
|
|
39
|
-
local smoke does not verify a deployed ChatGPT sign-in.
|
|
40
|
-
|
|
41
|
-
Without `OWNER_EMAIL`, sign-in grants no Mantle staff role. If the intended
|
|
42
|
-
owner signed in before configuration, their existing `sites_users` row remains
|
|
43
|
-
unprivileged. Configure the owner email and deliberately assign `role='owner'`
|
|
44
|
-
to that account's exact email and `chatgpt:` ID in D1, or reset a disposable
|
|
45
|
-
local database and sign in again. Mantle never gives ownership to the first
|
|
46
|
-
visitor.
|
|
47
|
-
|
|
48
|
-
The anonymous public MCP endpoint is `/api/mcp`; it discovers only public
|
|
49
|
-
manifest capabilities. `/api/mcp/staff` uses the current Sites browser session
|
|
50
|
-
and a Mantle staff role. Admin advertises these endpoints, and Admin WebMCP
|
|
51
|
-
works in supporting browsers. The staff endpoint is not a remote OAuth MCP
|
|
52
|
-
connector. A remote agent needs a separately implemented verified OAuth flow.
|
|
53
|
-
|
|
54
|
-
When a Schema changes, run `npx mantle generate --check` to detect drift, then
|
|
55
|
-
`npx mantle generate`. Review the newly appended SQL and apply pending D1
|
|
56
|
-
migrations before deploying code that expects the new Schema. Previous
|
|
57
|
-
migration files remain untouched; an unapplied migration keeps the old database
|
|
58
|
-
fingerprint, and managed boot refuses to use an older database. Sites owns
|
|
59
|
-
`.openai/hosting.json` project metadata and production D1 migration delivery.
|
|
60
|
-
|
|
61
|
-
Replacing a Schema's `uniqueIndexes` tuple requires an explicit reviewed
|
|
62
|
-
migration. With the old local D1 migration applied, edit the Manifest and run
|
|
63
|
-
`npx mantle generate --review-unique-indexes --check` to inspect the proposed
|
|
64
|
-
source/target fingerprints, affected tuples and checksum without writing. Then
|
|
65
|
-
run `npx mantle generate --review-unique-indexes`, review the new
|
|
66
|
-
`drizzle/meta/000N_mantle.review.json` and matching SQL, and apply that SQL
|
|
67
|
-
through the normal Sites D1 migration path. The CLI checks **local D1 only**
|
|
68
|
-
for duplicate target tuples and reports a count and sample before writing;
|
|
69
|
-
inspect production data separately before applying there. SQLite also refuses
|
|
70
|
-
to create the new unique index if production has conflicts; do
|
|
71
|
-
not deploy the target Worker until the migration has succeeded. Old Workers
|
|
72
|
-
cannot safely reactivate after the old uniqueness guarantee is removed.
|
|
73
|
-
This option is limited to managed Sites SQLite and unique tuple changes;
|
|
74
|
-
field conversions and runtime-managed CF boot still reject destructive
|
|
75
|
-
changes.
|
|
76
|
-
|
|
77
|
-
For a complete article, media, and publishing example, use the
|
|
78
|
-
[Sites reference](../../examples/host-chatgpt-sites/README.md).
|
|
79
|
-
|
|
80
|
-
## Source
|
|
81
|
-
|
|
82
|
-
- [Sites generator](../../../packages/mantle/src/cli/generate-sites.ts)
|
|
83
|
-
- [Generated Sites templates](../../../packages/mantle/templates/chatgpt-sites)
|
|
84
|
-
- [Runnable Sites reference](../../examples/host-chatgpt-sites/README.md)
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "Mantle on ChatGPT Sites: identity, D1, R2 media, public web, MCP boundaries, and deployment checks."
|
|
3
|
-
---
|
|
4
|
-
# ChatGPT Sites host reference
|
|
5
|
-
|
|
6
|
-
Start with [Mantle on ChatGPT Sites](./index.md) for the supported installation
|
|
7
|
-
path and your first publishing workflow. This reference explains how the
|
|
8
|
-
integration connects Sites hosting and sign-in to Mantle content, staff roles,
|
|
9
|
-
Admin, media, and public web. Keep the application outside the Mantle SDK
|
|
10
|
-
checkout and use matching SDK packages.
|
|
11
|
-
|
|
12
|
-
Start from the [runnable Sites host reference](../../examples/host-chatgpt-sites/README.md), then replace its **example** manifest with the user's business contract. It contains the matching D1 migrations/fingerprint, R2 upload adapter, local smoke test and build layout. Its browser-backed staff identity is not an OAuth resource-server credential.
|
|
13
|
-
|
|
14
|
-
## First deployment
|
|
15
|
-
|
|
16
|
-
1. Inspect the Site's actual hosting manifest and available bindings. Bind D1 before booting Mantle; create and apply the generated immutable D1 migration before publishing. Do not run DDL per request.
|
|
17
|
-
2. Compile the sealed plan (`mantle generate --check`, `mantle validate --phase deploy`) and bind `SqliteMantleStorageAdapter(new D1DatabaseDriver(env.DB), siteDefaults)`. Keep the generated storage fingerprint in sync with the migration.
|
|
18
|
-
3. If Admin is requested, mount `@aotter/mantle-admin` and its prebuilt assets. Use the trusted identity supplied by Sites **only after its ingress has stripped caller-supplied identity headers**. Map the stable per-Site user ID to a Mantle principal; use email only for owner bootstrap/invitation matching, not as a durable ID. Persist staff roles in D1 and re-read them for each privileged request. A Site Viewer is not automatically a Mantle editor.
|
|
19
|
-
4. If public pages are requested, compose `@aotter/mantle-web` over published-only queries. Verify anonymous article HTML, canonical/JSON-LD, Markdown, sitemap and `llms.txt`; a draft must remain 404. Do not assume a successful Admin boot implies a working homepage.
|
|
20
|
-
5. Publish through Sites, then verify the deployed version rather than only a local preview. Test owner, second account, role revocation, public/anonymous reads and every configured binding.
|
|
21
|
-
|
|
22
|
-
## Media with only an R2 binding
|
|
23
|
-
|
|
24
|
-
The `MediaStorage` port returns an HTTP `PUT` capability; it does **not** require a presigned S3 URL. An application with `env.MEDIA_BUCKET` can implement the port with `R2Bucket.put/head/get/delete` and return a same-origin upload URL. Bind that implementation as `ports.mediaStorage` **and** declare at least one `siteDefaults.media.purposes` policy; otherwise the Admin library and `create_media_upload` remain disabled.
|
|
25
|
-
|
|
26
|
-
The application must mount two routes alongside the port:
|
|
27
|
-
|
|
28
|
-
- `PUT /admin/media-upload/:group/:file`: check an authenticated editor-or-higher session, exact `Origin`, unexpired D1 pending-upload record, server-generated storage key, declared MIME and exact byte size before `R2Bucket.put`. Bound the request body by the policy limit. In Workers, a fixed-length `Uint8Array` is the conservative input to `put` when a streamed request body has unknown length. The port's `createUpload` must return this route as `uploadUrl` and the exact required `Content-Type` header.
|
|
29
|
-
- `GET /media/:purpose/:group/:file`: look up the committed `media_assets` row before `R2Bucket.get`, and serve only a listed variant with a safe MIME, `nosniff` and an intentional public cache policy. This is a **public** URL; it does not make private media safe.
|
|
30
|
-
|
|
31
|
-
The existing create → `PUT` each `uploadUrl` → commit flow works unchanged in Admin UI. Verify that an anonymous/cross-origin/expired/oversize `PUT` fails, that pre-commit public reads are 404, and that committed media resolves anonymously. A successful R2 binding read/write probe alone does not enable the library.
|
|
32
|
-
|
|
33
|
-
The browser route above uses the Sites session and therefore does **not** automatically work for a remote MCP client. For remote agent upload, either give the client a separately authenticated Worker `PUT` capability (with its own expiry and pending-record check) or choose the native `R2MediaStorage` direct-to-R2 path. Do not put image bytes in MCP JSON tool arguments. R2 bindings expose object operations, not S3 SigV4 presigning: direct-to-R2 presigned URLs require an R2 S3 endpoint and API key pair. Do not configure those credentials merely to make Admin UI upload work.
|
|
34
|
-
|
|
35
|
-
## Remote MCP is a separate gate
|
|
36
|
-
|
|
37
|
-
The reference exposes these separate surfaces:
|
|
38
|
-
|
|
39
|
-
| Surface | Authentication | Reference support |
|
|
40
|
-
|---|---|---|
|
|
41
|
-
| Admin WebMCP | Current browser Admin session and fresh Mantle staff role | Available within Admin. |
|
|
42
|
-
| Public MCP (reference path: `/api/mcp`) | Anonymous, read-only public Views | Manual HTTPS `initialize`, `tools/list`, and a published View call verified on the deployed integration. |
|
|
43
|
-
| Sites-session staff MCP (reference path: `/api/mcp/staff`) | Sites-injected identity plus a fresh Mantle staff role | Mounted and reported to Admin; not usable as a remote OAuth connector. |
|
|
44
|
-
| Remote staff OAuth MCP | OAuth bearer authorization and fresh Mantle staff role | Requires a separate integration. |
|
|
45
|
-
| Sites-managed connector registration | Sites MCP declaration and connection configuration | Unverified; do not guess a hosting manifest key. |
|
|
46
|
-
|
|
47
|
-
Try the conventional `/mcp` path first. If ChatGPT Sites does not route that
|
|
48
|
-
path to the application, mount the MCP handler at another application-owned
|
|
49
|
-
path and report the actual path through `mcpEndpoints`. For example:
|
|
50
|
-
|
|
51
|
-
```ts
|
|
52
|
-
app.all("/agent/read", publicMcpHandler);
|
|
53
|
-
|
|
54
|
-
mountMantleAdmin(app, {
|
|
55
|
-
plan,
|
|
56
|
-
auth,
|
|
57
|
-
assets,
|
|
58
|
-
get,
|
|
59
|
-
mcpEndpoints: { public: "/agent/read", staff: "/agent/staff" },
|
|
60
|
-
});
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
The reference encountered that condition and chose `/api/mcp` plus
|
|
64
|
-
`/api/mcp/staff`. It mounts both handlers and passes both paths through
|
|
65
|
-
`mcpEndpoints`, so Admin displays the routes that actually exist. These are
|
|
66
|
-
example fallback paths, not Mantle Core routes. Verify each chosen route with
|
|
67
|
-
`initialize`, `tools/list`, and a tool call after every Sites deployment.
|
|
68
|
-
|
|
69
|
-
The reference smoke test also checks that `/mcp` and `/mcp/staff` return 404.
|
|
70
|
-
The earlier deployment's root `/mcp` response is not evidence of a globally
|
|
71
|
-
reserved Sites path; another Sites deployment may route it differently.
|
|
72
|
-
|
|
73
|
-
Identity follows the same host-owned design. `@aotter/mantle-admin` exports
|
|
74
|
-
`AdminAuth`; the reference implements it using trusted Sites identity headers
|
|
75
|
-
and a D1 staff table. A host may implement the interface with another identity
|
|
76
|
-
system or wrap Mantle's Better Auth adapter. Core does not contain a ChatGPT
|
|
77
|
-
login implementation or require Better Auth for Sites.
|
|
78
|
-
|
|
79
|
-
A successful public MCP call verifies that endpoint, not ChatGPT connector
|
|
80
|
-
registration. A manually configured connector targets the HTTPS endpoint;
|
|
81
|
-
Sites-provisioned connection details (`get_site` with `include_mcp_connection`)
|
|
82
|
-
additionally require a deployed MCP declaration.
|
|
83
|
-
|
|
84
|
-
The reference's staff endpoint trusts only identity injected by the Sites
|
|
85
|
-
ingress, rejects ordinary members, and re-reads the Mantle role on every
|
|
86
|
-
request. Before exposing staff MCP to remote clients, implement a standard
|
|
87
|
-
OAuth authorization server or established provider, bearer verification, and
|
|
88
|
-
a fresh Mantle staff role check on each tool request. Verify OAuth protected-resource and
|
|
89
|
-
authorization metadata as JSON, a standards-compliant unauthenticated `401`
|
|
90
|
-
challenge, and authenticated `tools/list` plus a read-only call. A Sites browser
|
|
91
|
-
session or forwarded identity header is not an OAuth bearer token; a sign-in
|
|
92
|
-
HTML page returned to an OAuth JSON request is a failed integration.
|
|
93
|
-
|
|
94
|
-
## Capability boundaries
|
|
95
|
-
|
|
96
|
-
Native Cloudflare deployments can configure R2 public domains, S3 credentials, Queues, Durable Objects, KV and Cron independently. A Sites deployment should claim only the bindings its hosting manifest and deployed tests actually expose. `waitUntil` is not a durable queue. Keep missing primitives as explicit host limitations rather than adding fake Mantle ports.
|
|
97
|
-
|
|
98
|
-
See [native R2 direct upload](../cloudflare/media-r2.md), [authentication](../cloudflare/authentication.md), and [public web](../cloudflare/public-web.md).
|
|
99
|
-
|
|
100
|
-
For custom business rules and external API calls, see the
|
|
101
|
-
[equipment checkout guide](./equipment-checkout.md). It keeps transactional
|
|
102
|
-
application state separate from notification delivery and documents the
|
|
103
|
-
deployment experiment's limits. Sites' [unsupported uses](https://learn.chatgpt.com/docs/sites#understand-limits-and-unsupported-uses)
|
|
104
|
-
include financial transactions; a successful sandbox experiment is not support
|
|
105
|
-
for live payments.
|
|
106
|
-
|
|
107
|
-
## Source
|
|
108
|
-
|
|
109
|
-
- `MediaStorage` port and the media upload use case in `@aotter/mantle-runtime`
|
|
110
|
-
- [Cloudflare R2 Workers binding API](https://developers.cloudflare.com/r2/api/workers/workers-api-reference/)
|
|
111
|
-
- [Cloudflare R2 presigned URLs](https://developers.cloudflare.com/r2/api/s3/presigned-urls/)
|
|
112
|
-
- [OpenAI Sites](https://learn.chatgpt.com/docs/sites)
|
|
113
|
-
- [OpenAI MCP server authentication](https://developers.openai.com/plugins/build/auth)
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "Build with ChatGPT Sites. Manage content and publishing with Mantle."
|
|
3
|
-
---
|
|
4
|
-
# Mantle on ChatGPT Sites
|
|
5
|
-
|
|
6
|
-
**Build with ChatGPT Sites. Manage content and publishing with Mantle.**
|
|
7
|
-
|
|
8
|
-
Give your Site an editorial workflow: sign in, invite editors, upload a cover
|
|
9
|
-
image, save a draft, and publish an article. Mantle connects the Admin console,
|
|
10
|
-
public pages, and agent tools to the same content model, so your team can keep
|
|
11
|
-
the site current after the first build.
|
|
12
|
-
|
|
13
|
-
ChatGPT Sites is a first-class integration in Mantle's official documentation,
|
|
14
|
-
with a runnable reference and a repeatable verification flow maintained in this
|
|
15
|
-
repository. Sites owns hosting, visitor access, and ChatGPT sign-in; Mantle owns
|
|
16
|
-
the content model, staff roles, and publishing workflow. For platform access and
|
|
17
|
-
sharing options, see [OpenAI's Sites documentation](https://learn.chatgpt.com/docs/sites).
|
|
18
|
-
|
|
19
|
-
For a new project, start with the [blank generated app](./generated-app.md).
|
|
20
|
-
The article reference below demonstrates a complete editorial Site with R2
|
|
21
|
-
media after you choose that content model.
|
|
22
|
-
|
|
23
|
-
## What you get
|
|
24
|
-
|
|
25
|
-
| Capability | In the Mantle Sites reference |
|
|
26
|
-
|---|---|
|
|
27
|
-
| Content management | Admin for drafting, editing, publishing, and unpublishing articles stored in D1. |
|
|
28
|
-
| Staff access | ChatGPT sign-in with Mantle owner, editor, and contributor roles. Site visitor access grants no Mantle staff role. |
|
|
29
|
-
| Images | Admin uploads through the Site's R2 binding, with public URLs for committed images. No R2 S3 credentials required. |
|
|
30
|
-
| Public pages | Published article HTML and Markdown, cover images, canonical metadata, JSON-LD, sitemap, and `llms.txt`. |
|
|
31
|
-
| Agent access | Admin WebMCP, anonymous read-only public Views at `/api/mcp`, and Sites-session staff tools at `/api/mcp/staff`. |
|
|
32
|
-
|
|
33
|
-
Remote staff OAuth MCP and automatic ChatGPT connector registration are outside
|
|
34
|
-
the reference's current scope. Public media URLs are readable by anyone
|
|
35
|
-
who can reach the Site; this integration does not implement private media.
|
|
36
|
-
See the [host reference](./host-reference.md) for the exact trust and transport
|
|
37
|
-
boundaries.
|
|
38
|
-
|
|
39
|
-
## Start with the supported SDK
|
|
40
|
-
|
|
41
|
-
You need Node.js 22+ and Sites access with D1. Start with the
|
|
42
|
-
[blank generated app](./generated-app.md) to choose your own content model;
|
|
43
|
-
it requires no R2 bucket. The article reference also needs R2 for cover
|
|
44
|
-
images. Build and smoke-test locally before deployment, and keep your
|
|
45
|
-
application outside the SDK checkout.
|
|
46
|
-
|
|
47
|
-
## Follow the article reference when it fits
|
|
48
|
-
|
|
49
|
-
The steps below apply to the optional prebuilt article example. A new blank
|
|
50
|
-
generated Site has no article Schema, media bucket or content; add those only
|
|
51
|
-
when your requirements call for them.
|
|
52
|
-
|
|
53
|
-
1. **Prepare the application.** Follow the
|
|
54
|
-
[runnable reference](../../examples/host-chatgpt-sites/README.md#install-and-run).
|
|
55
|
-
Its local test verifies content, roles, images, public pages, and MCP together.
|
|
56
|
-
2. **Connect Sites.** Follow [Publish with Sites](../../examples/host-chatgpt-sites/README.md#publish-with-sites)
|
|
57
|
-
to provision D1 and R2, set the production origin and first owner's email,
|
|
58
|
-
and review the database migrations. Save a version, then deploy it through
|
|
59
|
-
Sites for the intended audience.
|
|
60
|
-
3. **Sign in as the owner.** Open `/admin/sign-in` and use the configured owner's
|
|
61
|
-
ChatGPT account. Give a second account an editor role in Mantle when you want
|
|
62
|
-
someone else to manage content. Sites sharing and Mantle staff roles are
|
|
63
|
-
separate controls.
|
|
64
|
-
4. **Create a draft.** In Admin, create an article with a title, summary, and
|
|
65
|
-
Markdown body. Upload an image in the media library and select it as the
|
|
66
|
-
article's cover. The draft's public article URL should return 404.
|
|
67
|
-
5. **Publish and read.** Publish the article and open `/articles`. Follow its
|
|
68
|
-
link to check the body and cover, then confirm the page head advertises
|
|
69
|
-
its `.md` version with `rel="alternate"` and `type="text/markdown"`. For a public
|
|
70
|
-
Site, repeat this while signed out. A restricted Site still enforces its
|
|
71
|
-
audience settings before visitors reach these pages.
|
|
72
|
-
6. **Verify control.** Unpublish the article and confirm its detail page returns
|
|
73
|
-
404. Revoke the second account's staff role and verify it can no longer edit.
|
|
74
|
-
Published content and staff access should follow your changes immediately.
|
|
75
|
-
|
|
76
|
-
For later content edits, return to Mantle Admin. Changes to the application's
|
|
77
|
-
schema, code, or deployment settings follow the reference's migration and Sites
|
|
78
|
-
deployment workflow.
|
|
79
|
-
|
|
80
|
-
## Maintain content with an agent
|
|
81
|
-
|
|
82
|
-
The owner can use Admin WebMCP in a browser that supports it to let an agent
|
|
83
|
-
discover staff tools for drafts, publishing, and other permitted operations.
|
|
84
|
-
Open `/admin/dev/docs/webmcp` to see that browser surface and
|
|
85
|
-
`/admin/dev/docs/mcp` to see the Site's `/api/mcp` public read-only endpoint and `/api/mcp/staff`
|
|
86
|
-
staff endpoint. The latter uses the current Sites browser session and checks
|
|
87
|
-
the Mantle staff role on each request. It is useful to same-origin browser
|
|
88
|
-
code, but is not a remote OAuth MCP connector for a desktop agent. A remote
|
|
89
|
-
staff connector needs its own verified OAuth flow; see the [host reference](./host-reference.md#remote-mcp-is-a-separate-gate).
|
|
90
|
-
|
|
91
|
-
## Ask your agent to set it up
|
|
92
|
-
|
|
93
|
-
Install the Mantle skill and exact SDK version, then describe your audience
|
|
94
|
-
and content requirements:
|
|
95
|
-
|
|
96
|
-
```text
|
|
97
|
-
Build a content site with ChatGPT Sites and Mantle. Read
|
|
98
|
-
handbook/chatgpt-sites/generated-app.md from the installed Mantle docs, and
|
|
99
|
-
start from the blank generated Site when that CLI supports it. Use the article
|
|
100
|
-
reference only if its content model matches my requirements. Include ChatGPT
|
|
101
|
-
sign-in and Mantle staff roles; add cover uploads only if I request media.
|
|
102
|
-
Run the local checks and show me a draft-to-publish walkthrough before
|
|
103
|
-
deploying through Sites. Keep remote staff OAuth MCP outside this scope.
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
For business rules beyond content, add: "use custom `ref` handlers and
|
|
107
|
-
application-owned tables as described in handbook/chatgpt-sites/equipment-checkout.md."
|
|
108
|
-
|
|
109
|
-
## Beyond content: operational workflows
|
|
110
|
-
|
|
111
|
-
Custom handlers can connect typed Mantle operations to application-owned
|
|
112
|
-
business rules and external services. See [Equipment checkout and external
|
|
113
|
-
notifications](./equipment-checkout.md) for a non-payment scenario: staff
|
|
114
|
-
approve equipment loans, atomically reserve a kit, and notify an equipment desk
|
|
115
|
-
in Slack without making approval depend on notification delivery.
|
|
116
|
-
|
|
117
|
-
This is an implementation guide and acceptance checklist, not an additional
|
|
118
|
-
feature installed by the article reference. It separates deployed integration
|
|
119
|
-
evidence from the equipment and Slack work still required in your application.
|
|
120
|
-
|
|
121
|
-
## Integration details
|
|
122
|
-
|
|
123
|
-
- [Host reference](./host-reference.md): identity, migrations, R2 routes, MCP, and deployment checks.
|
|
124
|
-
- [Generated blank app](./generated-app.md): local composition, D1 migration, Admin, and MCP.
|
|
125
|
-
- [Equipment checkout](./equipment-checkout.md): custom business rules and external API delivery without payments.
|
|
126
|
-
- [Runnable application](../../examples/host-chatgpt-sites/README.md): installation, build artifacts, and smoke tests.
|
|
127
|
-
- [Conventional Cloudflare Worker](../cloudflare/conventional-worker.md): the separate path for a Worker you deploy directly.
|
|
128
|
-
|
|
129
|
-
## Source
|
|
130
|
-
|
|
131
|
-
- [Runnable Sites application](../../examples/host-chatgpt-sites/README.md)
|
|
132
|
-
- [Sites host reference](./host-reference.md)
|
|
133
|
-
- [OpenAI Sites documentation](https://learn.chatgpt.com/docs/sites)
|
|
@@ -1,291 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Each Cloudflare primitive a Mantle Worker can bind, what Mantle uses it for, the wrangler snippet, and the Env type.
|
|
3
|
-
---
|
|
4
|
-
# Bindings and primitives
|
|
5
|
-
|
|
6
|
-
This page lists every Cloudflare binding a Mantle Worker commonly declares: which are required, what Mantle does with each, the `wrangler.jsonc` snippet, and the matching `Env` field. Read it when you write or review a Worker's configuration.
|
|
7
|
-
|
|
8
|
-
## Compatibility flags
|
|
9
|
-
|
|
10
|
-
Every Mantle Worker keeps both flags:
|
|
11
|
-
|
|
12
|
-
```jsonc
|
|
13
|
-
"compatibility_flags": ["nodejs_compat", "global_fetch_strictly_public"]
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
`nodejs_compat` is required by the adapter and its Auth dependencies. `global_fetch_strictly_public` is required because MCP client metadata (CIMD) is fetched through the public Internet boundary.
|
|
17
|
-
|
|
18
|
-
## The composition-root rule
|
|
19
|
-
|
|
20
|
-
Bindings appear in two places only: the Worker entry (`createMantleWorker` options and the `bindings` hook) and `wrangler.jsonc`. Procedure handlers receive them through `ctx.env`. An application may own additional tables behind its own repository, but it never queries Mantle-owned native Schema tables, site settings, media or Auth tables outside the runtime. Use `runtime.entries`, generated `bindMantle(runtime)` and Views instead.
|
|
21
|
-
|
|
22
|
-
## The Env interface
|
|
23
|
-
|
|
24
|
-
```ts
|
|
25
|
-
import type { DeferredHookEnvelope } from "@aotter/mantle/runtime";
|
|
26
|
-
import type { MantleCloudflareEnv } from "@aotter/mantle/cloudflare";
|
|
27
|
-
|
|
28
|
-
interface EmailBinding {
|
|
29
|
-
send(message: { to: string; from: string; subject: string; text?: string; replyTo?: string }): Promise<unknown>;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface Env extends MantleCloudflareEnv {
|
|
33
|
-
// MantleCloudflareEnv already declares DB, ASSETS?, MANTLE_KV? and the auth vars.
|
|
34
|
-
readonly DB: D1Database; // required
|
|
35
|
-
readonly ASSETS: Fetcher; // Admin bundle + your frontend
|
|
36
|
-
readonly PUBLIC_ORIGIN: string;
|
|
37
|
-
readonly MANTLE_KV?: KVNamespace; // optional MCP catalog cache
|
|
38
|
-
readonly MEDIA_BUCKET?: R2Bucket; // optional media
|
|
39
|
-
readonly R2_ACCOUNT_ID?: string;
|
|
40
|
-
readonly R2_ACCESS_KEY_ID?: string;
|
|
41
|
-
readonly R2_SECRET_ACCESS_KEY?: string;
|
|
42
|
-
readonly MEDIA_PUBLIC_URL_BASE?: string;
|
|
43
|
-
readonly AUDIT?: AnalyticsEngineDataset; // optional MCP tools/call audit trail
|
|
44
|
-
readonly MANTLE_INTERNAL_QUEUE?: Queue<DeferredHookEnvelope>; // optional deferred hooks
|
|
45
|
-
readonly ORDER_EXPIRY_QUEUE?: Queue<{ type: "expire-order"; orderToken: string }>; // application queue
|
|
46
|
-
readonly INVENTORY_COORDINATOR?: DurableObjectNamespace; // application-owned
|
|
47
|
-
readonly EMAIL?: EmailBinding; // Email Service
|
|
48
|
-
readonly TURNSTILE_SECRET_KEY?: string; // secret
|
|
49
|
-
}
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
## D1: `DB` (required)
|
|
53
|
-
|
|
54
|
-
D1 is canonical storage. It holds one native table per Manifest Schema, Mantle's
|
|
55
|
-
`_mantle_*` envelope and migration metadata, site settings, media metadata and
|
|
56
|
-
pending uploads, and the Better Auth tables. `createConventionalBindings`
|
|
57
|
-
throws without `DB`.
|
|
58
|
-
|
|
59
|
-
```jsonc
|
|
60
|
-
"d1_databases": [
|
|
61
|
-
{ "binding": "DB", "database_name": "my-site", "database_id": "<production-id>" }
|
|
62
|
-
]
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
Omit `database_id` only for local development. Set the production id before any remote deploy.
|
|
66
|
-
|
|
67
|
-
## Static Assets: `ASSETS`
|
|
68
|
-
|
|
69
|
-
```jsonc
|
|
70
|
-
"assets": { "directory": "./public", "binding": "ASSETS" }
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
`ASSETS` is a hard requirement for Admin. `mantle generate` syncs the **prebuilt** Admin SPA into `public/_mantle/admin/` when `@aotter/mantle-admin-ui` is installed — there is no Vite step unless you are developing `admin-ui` itself. The facade wraps `ASSETS` as the Admin asset server and falls back to `/_mantle/admin/index.html` for client-side Admin routes. The same binding serves your own CSS, JS and icons.
|
|
74
|
-
|
|
75
|
-
Without this binding, `/admin` can still return SPA HTML (`200`) while `/_mantle/admin/assets/*` is `404`. That white-screens the Dev UI.
|
|
76
|
-
|
|
77
|
-
When Worker routes and static paths overlap, list Worker-owned paths in `run_worker_first` and keep `not_found_handling` at `"none"` so unmatched requests fall through to the Worker. **Leave `/_mantle` out of `run_worker_first`** so hashed Admin JS/CSS stay on the assets layer. A production configuration lists `/admin`, `/admin/*`, `/mcp`, `/mcp/*`, `/oauth`, `/oauth/*`, `/.well-known/*`, `/api/*`, `/llms.txt`, `/robots.txt`, `/sitemap.xml`, `/*/llms.txt` and every public content prefix there, so a static file can never shadow a Mantle route.
|
|
78
|
-
|
|
79
|
-
## Workers Cache
|
|
80
|
-
|
|
81
|
-
```jsonc
|
|
82
|
-
"cache": { "enabled": true }
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
With a valid `cacheScope`, Mantle marks anonymous `200` `GET`/`HEAD` responses from the public mount (HTML, `.md`, `llms.txt`, sitemap) and eligible Views with a shared lifetime and a deployment-scoped `Cache-Tag`; everything else is `private, no-store`. Supplying a custom `credentialResolver` disables shared responses because Core cannot infer which request headers carry identity. Publishing-content and site-setting writes purge the tag after the canonical write. Purge failure is logged and does not turn a committed write into an error. The local emulator does not simulate the entrypoint cache or its purge API. See [Public web](./public-web.md#cache-contract).
|
|
86
|
-
|
|
87
|
-
## KV: `MANTLE_KV` (optional)
|
|
88
|
-
|
|
89
|
-
```jsonc
|
|
90
|
-
"kv_namespaces": [
|
|
91
|
-
{ "binding": "MANTLE_KV", "id": "<production-id>", "preview_id": "<development-id>" }
|
|
92
|
-
]
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
A deployment-owned namespace that caches the caller-independent MCP catalog projection (brand, description, origin, icons, media-purpose policy) so an authenticated MCP catalog does not read D1 site settings. D1 stays canonical; missing or expired snapshots are repaired from D1 within one hour, and a KV failure never fails a committed write. Never store tokens, sessions or content here. `createMantleWorker` uses this binding only when `cacheScope` is valid, producing keys such as `mantle:my-site-production:site-config:v1:mcp`. KV is eventually consistent across regions, so invalidation is not a global read-after-write guarantee.
|
|
96
|
-
|
|
97
|
-
## R2: `MEDIA_BUCKET` (optional)
|
|
98
|
-
|
|
99
|
-
```jsonc
|
|
100
|
-
"r2_buckets": [{ "binding": "MEDIA_BUCKET", "bucket_name": "<project>-media" }]
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
Staff media uploads through Staff MCP presigned PUT. The binding alone cannot sign URLs; you also need `R2_ACCOUNT_ID`, `MEDIA_PUBLIC_URL_BASE` and the two S3 credential secrets. See [Media uploads with R2](./media-r2.md).
|
|
104
|
-
|
|
105
|
-
## Analytics Engine: `AUDIT` (optional)
|
|
106
|
-
|
|
107
|
-
```jsonc
|
|
108
|
-
"analytics_engine_datasets": [{ "binding": "AUDIT", "dataset": "mantle_mcp_audit" }]
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
An MCP `tools/call` audit trail: who called which tool on which surface, with
|
|
112
|
-
what outcome and how long it took. The runtime's `McpJsonRpcDispatcher` is the
|
|
113
|
-
single write point; it records nothing unless the composition root passes an
|
|
114
|
-
`AuditSink`, and the write happens through `waitUntil`, off the response path.
|
|
115
|
-
Request and response payloads are never recorded.
|
|
116
|
-
|
|
117
|
-
```ts
|
|
118
|
-
import { analyticsEngineAuditSink, createMantleWorker } from "@aotter/mantle/cloudflare";
|
|
119
|
-
|
|
120
|
-
export default createMantleWorker<Env>({
|
|
121
|
-
plan,
|
|
122
|
-
audit: (env) => env.AUDIT
|
|
123
|
-
? analyticsEngineAuditSink(env.AUDIT, { index: env.PUBLIC_ORIGIN })
|
|
124
|
-
: undefined,
|
|
125
|
-
});
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
One dataset may hold many deployments: `index` is the deployment's public
|
|
129
|
-
origin, the only column Analytics Engine filters cheaply. Columns, in order:
|
|
130
|
-
|
|
131
|
-
| Column | Field |
|
|
132
|
-
|---|---|
|
|
133
|
-
| `index1` | the configured `index` |
|
|
134
|
-
| `blob1` … `blob7` | `surface`, `callerId`, `clientId`, `credential`, `tool`, `outcome`, `operationId` |
|
|
135
|
-
| `double1`, `double2` | `at` (epoch ms), `durationMs` |
|
|
136
|
-
|
|
137
|
-
`outcome` is `ok`, a runtime Diagnostic code such as `UNAUTHENTICATED` or
|
|
138
|
-
`AUTH_DENIED`, `UNKNOWN_TOOL`, `INVALID_PARAMS`, `INTERNAL`, or a transport gate denial
|
|
139
|
-
(`INVALID_TOKEN`, `INSUFFICIENT_SCOPE`, `INSUFFICIENT_ROLE`, `CROSS_ORIGIN`): a
|
|
140
|
-
`tools/call` refused before it reaches the dispatcher is recorded too, with
|
|
141
|
-
whatever identity the gate established. Its body goes through the same 1 MiB
|
|
142
|
-
bounded reader as an admitted call; a denied request whose body is oversized
|
|
143
|
-
or not JSON is still recorded, with `tool` set to `(unreadable)`, so padding a
|
|
144
|
-
body cannot hide a credential probe. `operationId` is the string argument whose
|
|
145
|
-
schema declares `x-mcp-hint: idempotency-key`, falling back to the conventional
|
|
146
|
-
`operationId` argument when the tool declares no hint. It is empty when that
|
|
147
|
-
argument is absent and is resolved the same way on admitted and denied calls.
|
|
148
|
-
Read it with the
|
|
149
|
-
[SQL API](https://developers.cloudflare.com/analytics/analytics-engine/sql-api/):
|
|
150
|
-
|
|
151
|
-
```sql
|
|
152
|
-
SELECT timestamp, blob2 AS caller, blob5 AS tool, blob6 AS outcome, double2 AS ms
|
|
153
|
-
FROM mantle_mcp_audit
|
|
154
|
-
WHERE index1 IN ('https://site-a.example', 'https://site-b.example')
|
|
155
|
-
AND timestamp > NOW() - INTERVAL '7' DAY
|
|
156
|
-
ORDER BY timestamp DESC
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
Analytics Engine keeps data for a bounded window and samples under very high
|
|
160
|
-
write rates. Longer retention or a tamper-evident trail is an export job on top
|
|
161
|
-
of this dataset. Self-hosted runtimes may implement `AuditSink` over any store;
|
|
162
|
-
the interface is one `record(event)` method.
|
|
163
|
-
|
|
164
|
-
## Queues
|
|
165
|
-
|
|
166
|
-
```jsonc
|
|
167
|
-
"queues": {
|
|
168
|
-
"producers": [
|
|
169
|
-
{ "binding": "MANTLE_INTERNAL_QUEUE", "queue": "mantle-internal" },
|
|
170
|
-
{ "binding": "ORDER_EXPIRY_QUEUE", "queue": "my-site-order-expiry" }
|
|
171
|
-
],
|
|
172
|
-
"consumers": [
|
|
173
|
-
{ "queue": "mantle-internal", "max_batch_size": 10, "max_batch_timeout": 5,
|
|
174
|
-
"max_retries": 5, "retry_delay": 60, "dead_letter_queue": "mantle-internal-dlq" },
|
|
175
|
-
{ "queue": "my-site-order-expiry", "max_concurrency": 1, "max_batch_size": 10,
|
|
176
|
-
"max_retries": 5, "retry_delay": 30, "dead_letter_queue": "my-site-order-expiry-dlq" }
|
|
177
|
-
]
|
|
178
|
-
}
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
`MANTLE_INTERNAL_QUEUE` carries deferred `after_*` lifecycle hooks. Application queues share the same Worker; the `queue()` export switches on `batch.queue`. See [Deferred hooks with Queues](./deferred-hooks-queues.md).
|
|
182
|
-
|
|
183
|
-
## Cron Triggers
|
|
184
|
-
|
|
185
|
-
```jsonc
|
|
186
|
-
"triggers": { "crons": ["*/5 * * * *"] }
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
A `schedule` Trigger declares the Procedure, and the Worker export reuses the same runtime as `fetch`:
|
|
190
|
-
|
|
191
|
-
```ts
|
|
192
|
-
const worker = createMantleWorker<Env>({ plan, handlers });
|
|
193
|
-
|
|
194
|
-
export default {
|
|
195
|
-
fetch: worker.fetch,
|
|
196
|
-
scheduled: worker.scheduled,
|
|
197
|
-
} satisfies ExportedHandler<Env>;
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
Register the exact enabled `cron` expression in `wrangler.jsonc`; Mantle does not create provider triggers. The Procedure takes `{}` input and sees `ctx.schedule.id` for retry-safe idempotency. See [Trigger](../reference/trigger.md#schedule-source).
|
|
201
|
-
|
|
202
|
-
## Durable Objects (application-owned)
|
|
203
|
-
|
|
204
|
-
Durable Objects are not a Core primitive. Use one as an application-owned coordinator when a decision must be serialized, for example reserving inventory exactly once. Export the class from the Worker entry, then bind and migrate it:
|
|
205
|
-
|
|
206
|
-
```jsonc
|
|
207
|
-
"durable_objects": { "bindings": [{ "name": "INVENTORY_COORDINATOR", "class_name": "InventoryCoordinator" }] },
|
|
208
|
-
"migrations": [{ "tag": "inventory-v1", "new_sqlite_classes": ["InventoryCoordinator"] }]
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
```ts
|
|
212
|
-
export { InventoryCoordinator } from "./commerce/InventoryCoordinator.js";
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
The coordinator keeps its own state; Mantle entries mirror the result. See [Commerce inventory](../../examples/cf-primitives-commerce-inventory.md).
|
|
216
|
-
|
|
217
|
-
## Email Service: `[[send_email]]`
|
|
218
|
-
|
|
219
|
-
```jsonc
|
|
220
|
-
"send_email": [{ "name": "EMAIL" }]
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
Send from an `after_create` handler with `errorPolicy: continue`, and fail soft when the binding or addresses are absent so submissions still save on a fresh deployment:
|
|
224
|
-
|
|
225
|
-
```ts
|
|
226
|
-
export async function notifyIntake(input: { name?: string; email?: string }, ctx: HandlerContext) {
|
|
227
|
-
const env = ctx.env as Env & { INTAKE_NOTIFY_TO?: string; INTAKE_NOTIFY_FROM?: string };
|
|
228
|
-
if (!env.EMAIL || !env.INTAKE_NOTIFY_TO || !env.INTAKE_NOTIFY_FROM) {
|
|
229
|
-
console.info("[intake] notification not configured");
|
|
230
|
-
return { ok: true };
|
|
231
|
-
}
|
|
232
|
-
await env.EMAIL.send({
|
|
233
|
-
to: env.INTAKE_NOTIFY_TO,
|
|
234
|
-
from: env.INTAKE_NOTIFY_FROM,
|
|
235
|
-
subject: `New intake response from ${input.name ?? "website"}`,
|
|
236
|
-
text: `Email: ${input.email ?? ""}`,
|
|
237
|
-
...(input.email ? { replyTo: input.email } : {}),
|
|
238
|
-
});
|
|
239
|
-
return { ok: true };
|
|
240
|
-
}
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
## Turnstile
|
|
244
|
-
|
|
245
|
-
Store the secret with `wrangler secret put TURNSTILE_SECRET_KEY`. Declare the token in the Procedure input, then verify it in a `before_create` lifecycle Trigger that aborts on failure:
|
|
246
|
-
|
|
247
|
-
```yaml
|
|
248
|
-
apiVersion: cms.mantle.aotter.net/v1
|
|
249
|
-
kind: Trigger
|
|
250
|
-
metadata:
|
|
251
|
-
name: intake-before-create-verify-turnstile
|
|
252
|
-
spec:
|
|
253
|
-
source:
|
|
254
|
-
kind: lifecycle
|
|
255
|
-
schema: intake-submissions
|
|
256
|
-
on: [before_create]
|
|
257
|
-
errorPolicy: abort
|
|
258
|
-
target:
|
|
259
|
-
procedure: verify-intake-turnstile
|
|
260
|
-
```
|
|
261
|
-
|
|
262
|
-
The adapter exports a handler factory for the `siteverify` call:
|
|
263
|
-
|
|
264
|
-
```ts
|
|
265
|
-
import { cloudflareTurnstileCheck } from "@aotter/mantle/cloudflare";
|
|
266
|
-
|
|
267
|
-
extend: ({ env }) => ({
|
|
268
|
-
handlers: {
|
|
269
|
-
"verify-intake-turnstile": cloudflareTurnstileCheck({
|
|
270
|
-
secret: env.TURNSTILE_SECRET_KEY ?? "dev-stub",
|
|
271
|
-
tokenField: "turnstileToken",
|
|
272
|
-
}),
|
|
273
|
-
},
|
|
274
|
-
}),
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
Authenticated callers (`ctx.user` set) bypass the check. The literal secret `"dev-stub"` skips the network and rejects only the token `"fail"`. Rejection throws `AUTH_DENIED`, which maps to HTTP `403`. See [Intake Turnstile and email hooks](../../examples/cf-primitives-intake-hooks.md).
|
|
278
|
-
|
|
279
|
-
## Source
|
|
280
|
-
- [`packages/adapters/cloudflare/README.md`](../../../packages/adapters/cloudflare/README.md)
|
|
281
|
-
- [`packages/adapters/cloudflare/src/bindings/conventionalBindings.ts`](../../../packages/adapters/cloudflare/src/bindings/conventionalBindings.ts)
|
|
282
|
-
- [`packages/adapters/cloudflare/src/mount/cmsConfig.ts`](../../../packages/adapters/cloudflare/src/mount/cmsConfig.ts)
|
|
283
|
-
- [`packages/adapters/cloudflare/src/worker/createMantleWorker.ts`](../../../packages/adapters/cloudflare/src/worker/createMantleWorker.ts)
|
|
284
|
-
- [`packages/adapters/cloudflare/src/handlers/turnstile.ts`](../../../packages/adapters/cloudflare/src/handlers/turnstile.ts)
|
|
285
|
-
- [`packages/mantle/src/cli/generate.ts`](../../../packages/mantle/src/cli/generate.ts)
|
|
286
|
-
- [`docs/deferred-lifecycle-queues.md`](../../../docs/deferred-lifecycle-queues.md)
|
|
287
|
-
- [`docs/media-uploads.md`](../../../docs/media-uploads.md)
|
|
288
|
-
- [`docs/performance-harness.md`](../../../docs/performance-harness.md)
|
|
289
|
-
- [`docs/cloudflare-low-level-composition.md`](../../../docs/cloudflare-low-level-composition.md)
|
|
290
|
-
- [`docs/examples/host-local-admin-otp/wrangler.jsonc`](../../../docs/examples/host-local-admin-otp/wrangler.jsonc)
|
|
291
|
-
- [`docs/examples/host-minimal-worker/wrangler.jsonc`](../../../docs/examples/host-minimal-worker/wrangler.jsonc)
|