@aotter/mantle 0.1.4 → 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 +332 -165
- 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/0021-retire-starter-scaffolding.md +1 -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/0026-progressive-generate.md +36 -0
- package/docs/adr/0027-scheduled-procedure-triggers.md +31 -0
- package/docs/adr/0028-schema-ttl-expiry.md +33 -0
- 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 +26 -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 -299
- 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 -156
- 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 -32
- package/docs/handbook/reference/authorization.md +52 -271
- package/docs/handbook/reference/diagnostics.md +69 -173
- package/docs/handbook/reference/features.md +48 -50
- package/docs/handbook/reference/manifest.md +56 -116
- package/docs/handbook/reference/procedure.md +92 -229
- package/docs/handbook/reference/schema.md +156 -215
- package/docs/handbook/reference/site-config.md +58 -211
- package/docs/handbook/reference/surface.md +69 -181
- package/docs/handbook/reference/trigger.md +73 -162
- package/docs/handbook/reference/view.md +140 -241
- package/docs/handbook/releases/index.md +58 -22
- package/docs/handbook/start/overview.md +59 -48
- package/docs/handbook/start/project-and-cli.md +127 -116
- package/docs/handbook/start/quickstart-worker.md +102 -151
- package/docs/skills/develop/SKILL.md +114 -232
- package/docs/skills/develop/mcp-app.md +79 -0
- package/docs/skills/integrate/SKILL.md +96 -0
- 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 -105
- 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/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 -102
- 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/meta/_journal.json +0 -1
- 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 -9
- package/docs/examples/host-chatgpt-sites/src/chatgpt-auth.ts +0 -63
- 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/host-reference.md +0 -113
- package/docs/handbook/chatgpt-sites/index.md +0 -123
- package/docs/handbook/cloudflare/bindings.md +0 -298
- package/docs/handbook/cloudflare/conventional-worker.md +0 -162
- 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 -50
- 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 -125
- package/skills/develop/SKILL.md +0 -250
- package/skills/install/SKILL.md +0 -149
- 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
|
@@ -1,29 +1,118 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: Run a Mantle 0.2.0 service on ChatGPT Sites — the Cloudflare preset with a custom identity over Sites sign-in, D1 schema delivery, R2 media, MCP paths, and what to verify after each publish.
|
|
3
3
|
---
|
|
4
4
|
# Mantle on ChatGPT Sites
|
|
5
5
|
|
|
6
|
-
ChatGPT
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
A ChatGPT Site runs a Cloudflare Worker with D1 and R2 bindings, and Sites owns
|
|
7
|
+
sign-in and deployment. Mantle runs there as the ordinary Cloudflare preset
|
|
8
|
+
with `identity: custom`: Sites authenticates the person, and your
|
|
9
|
+
`src/identity.ts` turns that into a Mantle `Caller`. There is no Sites option in
|
|
10
|
+
`mantle generate` and no Sites code in Core.
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
This page is a guide, not a runnable example. Inspect the Site's actual
|
|
13
|
+
hosting configuration and bindings before relying on any detail here, and
|
|
14
|
+
verify every claim on the deployed Site.
|
|
12
15
|
|
|
13
|
-
|
|
16
|
+
## Generate
|
|
14
17
|
|
|
15
|
-
|
|
18
|
+
```sh
|
|
19
|
+
pnpm exec mantle generate --identity custom --features mcp,admin,web
|
|
20
|
+
```
|
|
16
21
|
|
|
17
|
-
|
|
22
|
+
Keep the application outside the Mantle SDK checkout, pin every
|
|
23
|
+
`@aotter/mantle*` package to one exact version, and publish through Sites; do
|
|
24
|
+
not `wrangler deploy` a Site's Worker yourself.
|
|
18
25
|
|
|
19
|
-
##
|
|
26
|
+
## Identity: Sites sign-in as a `CallerResolver`
|
|
20
27
|
|
|
21
|
-
|
|
28
|
+
Sites' ingress authenticates the visitor and forwards the identity in
|
|
29
|
+
`oai-authenticated-user-*` headers. Trust them **only** when every request
|
|
30
|
+
reaches the Worker through that ingress, which strips caller-supplied copies;
|
|
31
|
+
never expose the Worker on another route.
|
|
22
32
|
|
|
23
|
-
|
|
33
|
+
Staff roles are the application's: keep them in your own table (here
|
|
34
|
+
`sites_users (id, email, role)`, created by your own migration) and read them
|
|
35
|
+
on every request. A Site viewer is not automatically a Mantle editor.
|
|
24
36
|
|
|
25
|
-
|
|
37
|
+
```ts
|
|
38
|
+
// src/identity.ts
|
|
39
|
+
import type { CallerResolver } from "@aotter/mantle";
|
|
26
40
|
|
|
27
|
-
|
|
41
|
+
export function sitesResolver(db: D1Database, ownerEmail: string | undefined): CallerResolver {
|
|
42
|
+
return async (request) => {
|
|
43
|
+
const sub = request.headers.get("oai-authenticated-user-id");
|
|
44
|
+
const email = request.headers.get("oai-authenticated-user-email")?.trim().toLowerCase();
|
|
45
|
+
if (!sub) return { caller: { kind: "anonymous" } };
|
|
46
|
+
if (!email || sub.length > 512) return { invalid: true };
|
|
47
|
+
const subject = `chatgpt:${sub}`; // namespaced: unique across issuers, never the email
|
|
48
|
+
await db.prepare("INSERT INTO sites_users (id, email, role) VALUES (?1, ?2, ?3) ON CONFLICT (id) DO NOTHING")
|
|
49
|
+
.bind(subject, email, email === ownerEmail?.trim().toLowerCase() ? "owner" : null).run();
|
|
50
|
+
const row = await db.prepare("SELECT role FROM sites_users WHERE id = ?1").bind(subject).first<{ role: "owner" | "editor" | "contributor" | null }>();
|
|
51
|
+
return { caller: { kind: "user", subject, role: row?.role ?? null, scopes: [], credential: "session", credentialId: null, clientId: null } };
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
```
|
|
28
55
|
|
|
29
|
-
|
|
56
|
+
In `src/service.ts`, use `sitesResolver(env.DB, env.OWNER_EMAIL)` where the
|
|
57
|
+
preset uses `resolveCaller`. The email is used only to recognize the first
|
|
58
|
+
owner. To manage staff from Admin, implement `AdminIdentity`'s `directory` and
|
|
59
|
+
`roles` facets (from `@aotter/mantle/admin`) over `sites_users` and pass it as
|
|
60
|
+
`identity`; without it Admin hides user management.
|
|
61
|
+
|
|
62
|
+
A Sites session is a browser session. It is not an OAuth bearer token, so it
|
|
63
|
+
does not authenticate a remote MCP client.
|
|
64
|
+
|
|
65
|
+
## Storage on D1
|
|
66
|
+
|
|
67
|
+
Boot converges Schema tables to the plan. If the Site applies schema changes
|
|
68
|
+
through migration files instead of letting the Worker run DDL, deliver
|
|
69
|
+
Mantle's SQL that way:
|
|
70
|
+
|
|
71
|
+
1. Point `mantle generate --check --database <file>` at a local SQLite file
|
|
72
|
+
in the same state as the Site's database (for example local D1 under
|
|
73
|
+
`.wrangler/state/v3/d1/`, migrated the same way).
|
|
74
|
+
2. Put the printed SQL into a new migration in the Site's migration directory,
|
|
75
|
+
together with your own tables (`sites_users`).
|
|
76
|
+
3. Publish; boot then finds the database converged and applies nothing.
|
|
77
|
+
|
|
78
|
+
Repeat for each plan change. A blocked change is resolved by hand, as in
|
|
79
|
+
[Deploy and operate](./deploy-and-operate.md#resolving-a-blocked-change).
|
|
80
|
+
|
|
81
|
+
## Media
|
|
82
|
+
|
|
83
|
+
`r2MediaStorage` presigns uploads with R2's S3 API, which needs an S3
|
|
84
|
+
endpoint and an API key pair. With only an R2 binding, implement the
|
|
85
|
+
`MediaStorage` port yourself (`createUpload`, `commitUpload`, `deleteObject`)
|
|
86
|
+
and add two routes to your service:
|
|
87
|
+
|
|
88
|
+
- an authenticated, same-origin `PUT` route that checks the pending upload,
|
|
89
|
+
the declared type and the exact size before `bucket.put`;
|
|
90
|
+
- a public `GET` route that serves only committed variants, with a safe type
|
|
91
|
+
and `nosniff`.
|
|
92
|
+
|
|
93
|
+
Pass it as `media` to `createAdminSurface` and declare media purposes in the
|
|
94
|
+
site defaults ([Media uploads with R2](./media-r2.md)).
|
|
95
|
+
|
|
96
|
+
## MCP paths
|
|
97
|
+
|
|
98
|
+
Try `/mcp` first. If the Site does not route it to the Worker, mount the
|
|
99
|
+
public surface at another path you own (`createMcpSurface(runtime, { basePath:
|
|
100
|
+
"/agent/mcp", surface: "public" })`) and report the real paths through
|
|
101
|
+
`createAdminSurface`'s `site: { mcpEndpoints }`. Admin and its browser tools
|
|
102
|
+
work with the Sites session. A remote staff MCP client (`/mcp/staff`)
|
|
103
|
+
needs a real OAuth authorization server and bearer verification in your
|
|
104
|
+
resolver; a forwarded identity header is not one.
|
|
105
|
+
|
|
106
|
+
## Verify after every publish
|
|
107
|
+
|
|
108
|
+
- Anonymous: a public View, an HTTP Trigger, `/mcp` (or your path)
|
|
109
|
+
`initialize` and `tools/list` when a public tool may be called anonymously;
|
|
110
|
+
when every public tool `requires` a caller, they answer 401 with a
|
|
111
|
+
`WWW-Authenticate` challenge instead.
|
|
112
|
+
- The owner: `GET /admin/api/me` is `owner`; a staff View and an operation.
|
|
113
|
+
- A second account: no Admin access until granted; revoking the role takes
|
|
114
|
+
effect on the next request.
|
|
115
|
+
- Every binding the service uses, on the deployed Site, not only locally.
|
|
116
|
+
|
|
117
|
+
Sites lists financial transactions among its unsupported uses; a working
|
|
118
|
+
sandbox flow is not support for live payments.
|
|
@@ -1,104 +1,110 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: Deploy a Mantle 0.2.0 service to Cloudflare Workers, change Schemas safely with storage convergence, resolve a blocked change, and operate schedules, expiry and the boot handshake.
|
|
3
3
|
---
|
|
4
4
|
# Deploy and operate
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
## First deploy
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
```sh
|
|
9
|
+
pnpm exec mantle generate --check # nothing stale
|
|
10
|
+
pnpm exec tsc --noEmit
|
|
11
|
+
pnpm exec wrangler d1 create my-service # copy database_id into wrangler.jsonc's d1_databases[0]
|
|
12
|
+
pnpm exec wrangler secret put BETTER_AUTH_SECRET # identity mantle
|
|
13
|
+
pnpm exec wrangler secret put ADMIN_EMAIL
|
|
14
|
+
pnpm exec wrangler deploy
|
|
15
|
+
```
|
|
9
16
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
-
|
|
13
|
-
- Choose production Auth: replace local console email delivery with a real `EmailSender`, or configure `MANTLE_AUTH_MODE` for GitHub OAuth or hosted Auth. Store secrets with `wrangler secret put`. See [Authentication](./authentication.md).
|
|
14
|
-
- Keep `compatibility_flags: ["nodejs_compat", "global_fetch_strictly_public"]`.
|
|
15
|
-
- Enable observability:
|
|
17
|
+
With dialect `postgres`, create the Hyperdrive config instead of the D1
|
|
18
|
+
database (`pnpm exec wrangler hyperdrive create my-service --caching-disabled
|
|
19
|
+
--connection-string=…`) and copy its id into `hyperdrive[0].id`.
|
|
16
20
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
Set `PUBLIC_ORIGIN` in `wrangler.jsonc` `vars` to the deployed origin, and
|
|
22
|
+
replace the console email sender first
|
|
23
|
+
([Authentication](./authentication.md#production)). The first request boots
|
|
24
|
+
the runtime, which creates every table the plan needs on the empty database.
|
|
21
25
|
|
|
22
|
-
|
|
26
|
+
Deploying anywhere is your choice: Cloudflare and Bun have generated presets,
|
|
27
|
+
`host: none` composes any other, and you may always self-host. Mantle Cloud is one option, never a
|
|
28
|
+
requirement.
|
|
23
29
|
|
|
24
|
-
|
|
30
|
+
## Changing Schemas
|
|
25
31
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
```
|
|
32
|
+
There are no migration files. Edit the manifests, run `mantle generate`, and
|
|
33
|
+
deploy. The first request after a plan change compares the database with the
|
|
34
|
+
plan:
|
|
30
35
|
|
|
31
|
-
|
|
36
|
+
- **Applied**: a new Schema table, a new field column, a new index, a new
|
|
37
|
+
unique index that existing rows satisfy, new `checks` and search triggers.
|
|
38
|
+
- **Blocked** (`STORAGE_CHANGE_BLOCKED`, the service refuses to serve): a
|
|
39
|
+
unique index that existing rows break, a field whose type changed, an index
|
|
40
|
+
whose columns changed under the same name, an undeclared unique index.
|
|
41
|
+
- **Kept, with a warning**: a column or non-unique index the plan no longer
|
|
42
|
+
declares. Nothing is dropped.
|
|
43
|
+
|
|
44
|
+
Before deploying, see what boot will do against a local SQLite file, such as
|
|
45
|
+
Wrangler's local D1 under `.wrangler/state/v3/d1/` after it has run the
|
|
46
|
+
previous plan:
|
|
32
47
|
|
|
33
48
|
```sh
|
|
34
|
-
pnpm exec mantle
|
|
49
|
+
pnpm exec mantle generate --check --database .wrangler/state/v3/d1/<…>.sqlite
|
|
35
50
|
```
|
|
36
51
|
|
|
37
|
-
|
|
52
|
+
It prints the SQL boot would run, the undeclared differences as comments, or
|
|
53
|
+
the blocked change (exit 1). It reads the file read-only. The dry run is the
|
|
54
|
+
SQLite dialect's; PostgreSQL has none.
|
|
38
55
|
|
|
39
|
-
|
|
40
|
-
as a conservative preflight; use post-deploy D1 metrics for production cost and
|
|
41
|
-
latency claims.
|
|
56
|
+
### Resolving a blocked change
|
|
42
57
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
58
|
+
Mantle verifies; you change. The diagnostic names the change and hints SQL
|
|
59
|
+
that would reach the plan. For example, to make `email` unique when duplicates
|
|
60
|
+
exist: remove the duplicates (with a Procedure run as the system caller, or
|
|
61
|
+
`wrangler d1 execute`), then deploy again; boot creates the index. To rename a
|
|
62
|
+
field: add the new field, copy the data with a Procedure or SQL, then drop the
|
|
63
|
+
old field from the manifest (its column stays, unused). Never edit `_mantle_*`
|
|
64
|
+
tables.
|
|
47
65
|
|
|
48
|
-
|
|
66
|
+
### Hosts that refuse DDL from the Worker
|
|
49
67
|
|
|
50
|
-
|
|
51
|
-
the
|
|
68
|
+
If a host applies schema changes only through its own migration mechanism,
|
|
69
|
+
take the SQL `mantle generate --check --database` prints and deliver it
|
|
70
|
+
through that mechanism; boot then finds the database converged.
|
|
52
71
|
|
|
53
|
-
|
|
54
|
-
|---|---|
|
|
55
|
-
| `GET /api/views/<public-view>` | `200`, `{ "ok": true, "data": { "rows": [...] } }` |
|
|
56
|
-
| `GET /<locale>/<segment>/<slug>` and `GET /<locale>/<segment>/<slug>.md` | `200` HTML and Markdown for a published entry |
|
|
57
|
-
| `GET /llms.txt`, `GET /sitemap.xml`, `GET /robots.txt` | `200` |
|
|
58
|
-
| `GET /<locale>/<segment>/does-not-exist` | `404` from your `notFoundRenderer` |
|
|
59
|
-
| `POST /mcp/staff` without credentials | `401` with `WWW-Authenticate`; `GET /mcp` is `405` |
|
|
60
|
-
| `GET /admin` | Sign-in page; sign in with the `ADMIN_GITHUB_LOGIN` account |
|
|
72
|
+
## Schedules
|
|
61
73
|
|
|
62
|
-
|
|
74
|
+
`wrangler.jsonc` `triggers.crons` holds the Cloudflare spelling of every
|
|
75
|
+
enabled schedule Trigger. `mantle generate` warns when it drifts from the plan;
|
|
76
|
+
update it by hand (the file is yours). Locally:
|
|
63
77
|
|
|
64
78
|
```sh
|
|
65
|
-
pnpm exec
|
|
66
|
-
|
|
79
|
+
pnpm exec wrangler dev --local --test-scheduled
|
|
80
|
+
curl 'http://127.0.0.1:8787/__scheduled?cron=0+3+*+*+1'
|
|
67
81
|
```
|
|
68
82
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
Sign in to Admin with a staff account. Publishing collections (`lifecycle: publishing`) follow draft, publish, verify:
|
|
83
|
+
The cron in the URL is the Cloudflare spelling.
|
|
72
84
|
|
|
73
|
-
|
|
74
|
-
2. Publish (`editor` or above). The write purges the deployment-scoped public cache tag.
|
|
75
|
-
3. Open the public URL and its `.md` mirror. Drafts never appear on pages, mirrors, `llms.txt` or the sitemap; use `?preview=1` with a staff session to see one.
|
|
76
|
-
4. Unpublish removes the entry from every public surface; the Admin delete action and the Staff MCP `archive_entry` tool retire it.
|
|
85
|
+
## Expired rows
|
|
77
86
|
|
|
78
|
-
|
|
87
|
+
TTL hides expired rows at once. To delete them, call
|
|
88
|
+
`ctx.store.sweepExpired({ collection, limit })` in a schedule Trigger's `ref`
|
|
89
|
+
handler (the system caller's Store has it), or `runtime.store.sweepExpired` from
|
|
90
|
+
your own maintenance route, page with `nextCursor`, and use
|
|
91
|
+
`delete: false` to count first.
|
|
79
92
|
|
|
80
|
-
|
|
93
|
+
## The boot handshake
|
|
81
94
|
|
|
82
|
-
|
|
95
|
+
`runtime.bootReport()` returns `{ fingerprint, coreVersion }`. Pass
|
|
96
|
+
`expectedFingerprint` to `createMantle` to refuse booting any plan but the one
|
|
97
|
+
you built (`PLAN_FINGERPRINT_MISMATCH`). The fingerprint is in
|
|
98
|
+
`.mantle/generated/plan.json`; reformatting a manifest does not change it.
|
|
83
99
|
|
|
84
|
-
|
|
100
|
+
## Mantle Cloud
|
|
85
101
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
102
|
+
Deploying a 0.2.0 service to Mantle Cloud needs Cloud's host protocol 3, which
|
|
103
|
+
uploads the compiled plan and the service entry. Mantle Cloud does not accept
|
|
104
|
+
0.2.0 services yet. The plugin's `mantle` skill and its helper script check
|
|
105
|
+
the plan and the installed Core version so a project is ready when it does.
|
|
90
106
|
|
|
91
|
-
|
|
107
|
+
## Moving data from 0.1.x
|
|
92
108
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
- [`packages/adapters/cloudflare/README.md`](../../../packages/adapters/cloudflare/README.md)
|
|
96
|
-
- [`docs/direct-authoring.md`](../../../docs/direct-authoring.md)
|
|
97
|
-
- [`docs/performance-harness.md`](../../../docs/performance-harness.md)
|
|
98
|
-
- [`docs/examples/host-minimal-worker/README.md`](../../../docs/examples/host-minimal-worker/README.md)
|
|
99
|
-
- [`docs/examples/host-minimal-worker/package.json`](../../../docs/examples/host-minimal-worker/package.json)
|
|
100
|
-
- [`docs/examples/host-minimal-worker/wrangler.jsonc`](../../../docs/examples/host-minimal-worker/wrangler.jsonc)
|
|
101
|
-
- [`docs/examples/host-minimal-worker/smoke.mjs`](../../../docs/examples/host-minimal-worker/smoke.mjs)
|
|
102
|
-
- [`packages/mantle-spec/src/domain/model/SiteConfig.ts`](../../../packages/mantle-spec/src/domain/model/SiteConfig.ts)
|
|
103
|
-
- [`packages/mantle-admin/src/mountMantleAdmin.ts`](../../../packages/mantle-admin/src/mountMantleAdmin.ts)
|
|
104
|
-
- [`packages/adapters/cloudflare/src/oauth/cachePolicy.ts`](../../../packages/adapters/cloudflare/src/oauth/cachePolicy.ts)
|
|
109
|
+
Give the 0.2.0 service a new database and import through
|
|
110
|
+
`runtime.store`; `docs/upgrade-0.1-to-0.2.md` describes the steps.
|
|
@@ -1,216 +1,93 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: Media uploads in Mantle 0.2.0 on Cloudflare R2 — site media purposes, r2MediaStorage, wiring Admin's media routes, the presigned upload flow, and what to store in a Schema.
|
|
3
3
|
---
|
|
4
4
|
# Media uploads with R2
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
Media is optional. It needs three things in `src/service.ts`: site defaults
|
|
7
|
+
with media purposes, an `r2MediaStorage`, and both passed where they belong.
|
|
8
|
+
The bytes go from the uploader straight to R2; the Worker never proxies them.
|
|
7
9
|
|
|
8
|
-
##
|
|
10
|
+
## 1. A public bucket and S3 credentials
|
|
9
11
|
|
|
10
|
-
|
|
12
|
+
- An R2 bucket served publicly, from a custom domain or `pub-<hash>.r2.dev`.
|
|
13
|
+
That URL is `publicBase`.
|
|
14
|
+
- An R2 API token with write access to the bucket, for presigning PUT URLs:
|
|
15
|
+
`R2_ACCESS_KEY_ID` and `R2_SECRET_ACCESS_KEY` as Worker secrets.
|
|
16
|
+
- A CORS rule on the bucket that allows `PUT` with `Content-Type` from your
|
|
17
|
+
Admin's origin, if a browser uploads.
|
|
11
18
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
```txt
|
|
17
|
-
1. create_media_upload staff MCP -> purpose, variants, mime types, byte sizes
|
|
18
|
-
2. Mantle -> signed upload URLs + required headers
|
|
19
|
-
3. agent or browser -> PUT bytes directly to R2
|
|
20
|
-
4. commit_media_upload staff MCP -> validate, stamp, save the asset row
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
Bytes travel from the agent to R2 over a signed URL; the Worker sees policy, not payload. Never pass image bytes or base64 payloads through MCP tool arguments — the tool dispatchers count streamed JSON bytes and return `413` above the 1 MiB control-plane limit. The Worker validates; the agent runtime does the file work.
|
|
24
|
-
|
|
25
|
-
## Cloudflare setup
|
|
26
|
-
|
|
27
|
-
```sh
|
|
28
|
-
wrangler r2 bucket create <project>-media
|
|
29
|
-
wrangler r2 bucket dev-url enable <project>-media
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
Then create an R2 S3 API token in the dashboard: open **R2**, open **Manage R2 API Tokens**, create an **Object Read & Write** token, and copy the Access Key ID and Secret Access Key.
|
|
33
|
-
|
|
34
|
-
The R2 binding alone cannot issue presigned `PUT` URLs: presigning is an S3-protocol operation, so this **direct-to-R2 adapter** needs these credentials in addition to the binding. This is not a requirement of Mantle's `MediaStorage` port: a host may return an authenticated same-origin Worker `PUT` URL instead. Media tools appear whenever `mediaStorage` and a media purpose are bound, regardless of which transport the adapter uses.
|
|
35
|
-
|
|
36
|
-
## Wrangler configuration
|
|
37
|
-
|
|
38
|
-
```toml
|
|
39
|
-
[vars]
|
|
40
|
-
R2_ACCOUNT_ID = "<account-id>"
|
|
41
|
-
MEDIA_PUBLIC_URL_BASE = "https://pub-<hash>.r2.dev"
|
|
42
|
-
|
|
43
|
-
[[r2_buckets]]
|
|
44
|
-
binding = "MEDIA_BUCKET"
|
|
45
|
-
bucket_name = "<project>-media"
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
A `wrangler.jsonc` project writes the same binding as an `"r2_buckets"` array; see [Bindings and primitives](./bindings.md#r2-media-bucket-optional) for the JSON form and the matching `Env` fields.
|
|
49
|
-
|
|
50
|
-
```sh
|
|
51
|
-
wrangler secret put R2_ACCESS_KEY_ID
|
|
52
|
-
wrangler secret put R2_SECRET_ACCESS_KEY
|
|
19
|
+
```jsonc
|
|
20
|
+
// wrangler.jsonc
|
|
21
|
+
"r2_buckets": [{ "binding": "MEDIA", "bucket_name": "my-media" }],
|
|
22
|
+
"vars": { "MEDIA_PUBLIC_BASE": "https://media.example.com", "R2_ENDPOINT": "https://my-media.<account>.r2.cloudflarestorage.com" }
|
|
53
23
|
```
|
|
54
24
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
## Wiring `R2MediaStorage`
|
|
58
|
-
|
|
59
|
-
Build the adapter from `env`, returning `undefined` when any part is missing so a half-configured environment degrades to no media rather than failing to boot:
|
|
25
|
+
## 2. Wire it
|
|
60
26
|
|
|
61
27
|
```ts
|
|
62
|
-
import { R2MediaStorage } from "@aotter/mantle/cloudflare";
|
|
63
28
|
import { AwsClient } from "aws4fetch";
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
)
|
|
73
|
-
return undefined;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
const s3 = new AwsClient({
|
|
77
|
-
accessKeyId: env.R2_ACCESS_KEY_ID,
|
|
78
|
-
secretAccessKey: env.R2_SECRET_ACCESS_KEY,
|
|
79
|
-
region: "auto",
|
|
80
|
-
service: "s3",
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
return new R2MediaStorage(
|
|
84
|
-
env.MEDIA_BUCKET,
|
|
85
|
-
s3,
|
|
86
|
-
`https://<project>-media.${env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`,
|
|
87
|
-
env.MEDIA_PUBLIC_URL_BASE,
|
|
88
|
-
);
|
|
89
|
-
}
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
Pass it through the `bindings` hook, spreading the conventional set:
|
|
93
|
-
|
|
94
|
-
```ts
|
|
95
|
-
export default createMantleWorker<Env>({
|
|
96
|
-
plan,
|
|
97
|
-
bindings: (env, conventional) => ({
|
|
98
|
-
...conventional,
|
|
99
|
-
mediaStorage: buildMediaStorage(env),
|
|
100
|
-
}),
|
|
29
|
+
import { d1Storage, r2MediaStorage } from "@aotter/mantle/cloudflare";
|
|
30
|
+
|
|
31
|
+
// storage, with the purposes uploads may use
|
|
32
|
+
export const mantle = createMantle(service, {
|
|
33
|
+
plan, schedules: true,
|
|
34
|
+
storage: (env) => d1Storage(env.DB, { site: {
|
|
35
|
+
title: "My site",
|
|
36
|
+
media: { purposes: [{ name: "cover", required: ["image/webp", "image/jpeg,image/png"], maxBytes: { "image/webp": 2_000_000, "image/jpeg": 2_000_000, "image/png": 2_000_000 } }] },
|
|
37
|
+
} }),
|
|
101
38
|
});
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
`aws4fetch` is an application dependency; the adapter takes the signing client rather than embedding one. See [The conventional Worker](./conventional-worker.md#a-bindings-hook).
|
|
105
|
-
|
|
106
|
-
## Declaring media purposes
|
|
107
39
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
required: ["image/jpeg,image/png", "image/webp", "image/avif"],
|
|
117
|
-
maxBytes: {
|
|
118
|
-
"image/jpeg": 5_000_000,
|
|
119
|
-
"image/png": 5_000_000,
|
|
120
|
-
"image/webp": 3_000_000,
|
|
121
|
-
"image/avif": 2_000_000,
|
|
122
|
-
},
|
|
123
|
-
},
|
|
124
|
-
],
|
|
125
|
-
},
|
|
126
|
-
},
|
|
40
|
+
// in mount(): the media storage, handed to Admin
|
|
41
|
+
const media = r2MediaStorage({
|
|
42
|
+
bucket: env.MEDIA,
|
|
43
|
+
signer: new AwsClient({ accessKeyId: env.R2_ACCESS_KEY_ID, secretAccessKey: env.R2_SECRET_ACCESS_KEY, region: "auto", service: "s3" }),
|
|
44
|
+
endpoint: env.R2_ENDPOINT,
|
|
45
|
+
publicBase: env.MEDIA_PUBLIC_BASE,
|
|
46
|
+
});
|
|
47
|
+
const admin = guard(createAdminSurface(runtime, { basePath: "/admin", media, /* …the generated options… */ }));
|
|
127
48
|
```
|
|
128
49
|
|
|
129
|
-
`
|
|
50
|
+
`aws4fetch` is the application's dependency; Mantle only calls its `sign`.
|
|
51
|
+
Without both `media` and site defaults, every media route answers 501
|
|
52
|
+
`MEDIA_NOT_CONFIGURED`.
|
|
130
53
|
|
|
131
|
-
|
|
54
|
+
## 3. The upload flow
|
|
132
55
|
|
|
133
|
-
|
|
56
|
+
All through Admin's API, `editor` role or higher:
|
|
134
57
|
|
|
135
|
-
|
|
58
|
+
1. `POST /admin/api/media/uploads` with
|
|
59
|
+
`{ filename, purpose, variants: [{ mimeType, byteSize, role }], alt?, caption? }`.
|
|
60
|
+
The purpose's MIME slots and per-type byte caps are checked here, and exactly one variant must be `role: "primary"`. The answer is
|
|
61
|
+
`{ uploadGroupId, capabilities: [{ role, mimeType, method: "PUT", uploadUrl, requiredHeaders }], expiresAt }`.
|
|
62
|
+
2. `PUT` each variant's bytes to its `uploadUrl` with its `requiredHeaders`.
|
|
63
|
+
3. `POST /admin/api/media/uploads/{uploadGroupId}/commit` (optionally with
|
|
64
|
+
`{ alt, caption }`). Commit checks every stored object's type and size,
|
|
65
|
+
then copies each to a public key no upload URL can reach. A rejected group
|
|
66
|
+
publishes nothing and its upload objects are deleted. An expired or unknown
|
|
67
|
+
group is 410 `MEDIA_UPLOAD_EXPIRED`.
|
|
136
68
|
|
|
137
|
-
|
|
69
|
+
The committed asset is `{ id, variants: [{ role, mimeType, publicUrl, storageKey, byteSize }], alt?, caption?, createdAt }`.
|
|
70
|
+
`GET /admin/api/media` lists assets (`search`, `limit`, `cursor`); `GET`,
|
|
71
|
+
`PATCH` (`alt`, `caption`) and `DELETE /admin/api/media/{id}` manage one.
|
|
72
|
+
Delete removes the objects first, then the row, so a partial failure can be
|
|
73
|
+
retried.
|
|
138
74
|
|
|
139
|
-
|
|
140
|
-
|
|
75
|
+
Optimize images where they are made (in the browser or the agent), and upload
|
|
76
|
+
the variants; Mantle does not transform images.
|
|
141
77
|
|
|
142
|
-
|
|
78
|
+
## Storing media in a Schema
|
|
143
79
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
Entries store asset ids, not URLs. Mark the field with both existing v0.1 grammar extensions:
|
|
80
|
+
Store the asset's `publicUrl` (or its `id`) in a string field and mark it:
|
|
147
81
|
|
|
148
82
|
```yaml
|
|
149
|
-
|
|
150
|
-
kind: Schema
|
|
151
|
-
metadata:
|
|
152
|
-
name: pages
|
|
153
|
-
spec:
|
|
154
|
-
title: Pages
|
|
155
|
-
schema:
|
|
156
|
-
type: object
|
|
157
|
-
additionalProperties: false
|
|
158
|
-
required: [slug, title]
|
|
159
|
-
properties:
|
|
160
|
-
slug: { type: string, pattern: "^[a-z0-9-]+$" }
|
|
161
|
-
title: { type: string, minLength: 1 }
|
|
162
|
-
coverAssetId:
|
|
163
|
-
type: string
|
|
164
|
-
x-mantle-ref: media_assets
|
|
165
|
-
x-mcp-hint: media-image
|
|
83
|
+
cover: { type: string, x-mcp-hint: media-image }
|
|
166
84
|
```
|
|
167
85
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
## What a commit costs
|
|
171
|
-
|
|
172
|
-
R2 has no metadata-only patch. To stamp `committedAt`, `role`, `uploadGroupId` and the filename markers, Mantle streams each uploaded object through a `GET` and a `PUT`. So a successful N-variant commit performs N `GET`s and N `PUT`s and rewrites the sum of the variant sizes.
|
|
173
|
-
|
|
174
|
-
- Commits validate the bundle shape before any I/O.
|
|
175
|
-
- Variants are processed in batches of at most three; a batch settles before the next starts or an error returns.
|
|
176
|
-
- A mime or size failure cancels the unused `GET` stream; a failed `PUT` also attempts cancellation while preserving the original error.
|
|
177
|
-
- The asset row is saved only after every variant succeeds. All-or-nothing.
|
|
178
|
-
|
|
179
|
-
Parallelism reduces waiting, not operation count or bytes. Keep variant counts and byte caps deliberate. A partial R2 failure leaves the pending D1 record in place so the commit can be retried before it expires; already stamped objects stay stamped.
|
|
180
|
-
|
|
181
|
-
## Cleanup
|
|
182
|
-
|
|
183
|
-
An upload can reach R2 and never be committed — an interrupted agent, a rejected commit. Remove those objects with the version-matched `media-gc` skill. It is opt-in and deliberately not projected into a repository by `mantle skills`, because it deletes remote objects.
|
|
184
|
-
|
|
185
|
-
Its posture is audit first, delete only what an operator confirmed. It treats an object as a candidate only when it is over 24 hours old, has no `committedAt` custom metadata, and matches the exact key layout `<purpose>/<group>/(primary|alternate|fallback).<ext>` for a purpose this project declares. It reports account, bucket, prefixes, cutoff, counts, bytes and a digest of the candidate set without printing keys or URLs; on confirmation it re-runs the same audit and stops if anything changed.
|
|
186
|
-
|
|
187
|
-
> **Do not use an R2 lifecycle rule**
|
|
188
|
-
> Committed and uncommitted media share the same purpose prefix, so an age-based rule deletes live assets. After a pending record expires, partially stamped orphans require an operator audit against D1 references: a missing pending record does not mean an object is unused.
|
|
189
|
-
|
|
190
|
-
## Diagnostics
|
|
191
|
-
|
|
192
|
-
| Code | HTTP | Raised when |
|
|
193
|
-
|---|---|---|
|
|
194
|
-
| `MEDIA_NOT_CONFIGURED` | 501 | No `mediaStorage` port is bound on this deployment |
|
|
195
|
-
| `MEDIA_PURPOSE_REJECTED` | 400 | The requested purpose is not declared; the declared set is returned so an agent can self-correct |
|
|
196
|
-
| `MEDIA_MIME_REJECTED` | 400 | A mime outside `image/png`, `image/jpeg`, `image/webp`, `image/avif`, `image/gif` |
|
|
197
|
-
| `MEDIA_SIZE_EXCEEDED` | 400 | A declared byte size exceeds its cap |
|
|
198
|
-
| `MEDIA_SVG_REJECTED` | 400 | An SVG was offered while SVG is not allowed; object storage does not sanitize SVG payloads |
|
|
199
|
-
| `MEDIA_VARIANTS_INCOMPLETE` | 400 | The bundle misses a mime the purpose requires; the missing set is returned |
|
|
200
|
-
| `MEDIA_VARIANT_SIZE_EXCEEDED` | 400 | One variant exceeds the cap declared for its mime |
|
|
201
|
-
| `MEDIA_VARIANTS_SUSPICIOUS_SIZE` | 400 | A modern variant is larger than its fallback (AVIF above JPEG), so it looks unoptimized |
|
|
202
|
-
| `MEDIA_ASSET_NOT_FOUND` | 404 | No `media_assets` row matches the id |
|
|
203
|
-
| `MEDIA_UPLOAD_EXPIRED` | 410 | The upload capability's TTL elapsed, or it was never created |
|
|
204
|
-
| `MEDIA_OBJECT_NOT_FOUND` | 409 | A variant's bytes were never PUT before commit |
|
|
86
|
+
The hint tells Admin and agents what the field holds. No MCP tool uploads
|
|
87
|
+
media in 0.2.0; an agent uploads through Admin's API with a staff session.
|
|
205
88
|
|
|
206
|
-
|
|
89
|
+
## Stale uploads
|
|
207
90
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
- [`packages/mantle-runtime/src/domain/port/MediaStorage.ts`](../../../packages/mantle-runtime/src/domain/port/MediaStorage.ts)
|
|
212
|
-
- [`packages/mantle-runtime/src/domain/port/MediaAssetRepository.ts`](../../../packages/mantle-runtime/src/domain/port/MediaAssetRepository.ts)
|
|
213
|
-
- [`packages/mantle-spec/src/domain/service/SiteDefaultsValidator.ts`](../../../packages/mantle-spec/src/domain/service/SiteDefaultsValidator.ts)
|
|
214
|
-
- [`packages/mantle-spec/src/kernel/diagnostic.ts`](../../../packages/mantle-spec/src/kernel/diagnostic.ts)
|
|
215
|
-
- [`packages/adapters/cloudflare/README.md`](../../../packages/adapters/cloudflare/README.md)
|
|
216
|
-
- [`docs/skills/media-gc/SKILL.md`](../../skills/media-gc/SKILL.md)
|
|
91
|
+
A group created but never committed leaves objects under `uploads/` until its
|
|
92
|
+
URLs expire. The package skill `docs/skills/media-gc/SKILL.md` audits and
|
|
93
|
+
removes them.
|