@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
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { coerce, failure, json, match, readJsonObject, viewQuery, wireError } from "../core/wire.js";
|
|
2
|
+
export function createRestSurface(runtime, options) {
|
|
3
|
+
const base = options.basePath.replace(/\/+$/, "");
|
|
4
|
+
const { plan } = runtime;
|
|
5
|
+
const params = (path) => path.split("/").filter((s) => s.startsWith("{")).length;
|
|
6
|
+
// a route with fewer path params is more specific, so `/items/search` is never shadowed by `/items/{id}`
|
|
7
|
+
const routes = Object.entries(plan.triggers)
|
|
8
|
+
.flatMap(([name, t]) => (t.source.kind === "http" ? [{ name, method: t.source.method, path: t.source.path, procedure: t.procedure }] : []))
|
|
9
|
+
.sort((a, b) => params(a.path) - params(b.path));
|
|
10
|
+
return async (request, caller) => {
|
|
11
|
+
try {
|
|
12
|
+
const url = new URL(request.url);
|
|
13
|
+
const path = url.pathname;
|
|
14
|
+
const view = request.method === "GET" ? match(`${base}/views/{name}`, path)?.name : undefined;
|
|
15
|
+
if (view !== undefined) {
|
|
16
|
+
const v = plan.views[view];
|
|
17
|
+
if (!v || v.surface !== "public")
|
|
18
|
+
throw wireError("NOT_FOUND", `no public View '${view}'`, "rest");
|
|
19
|
+
return json(await runtime.store.as(caller).view(view, viewQuery(view, v, url.searchParams, "rest")));
|
|
20
|
+
}
|
|
21
|
+
for (const route of routes) {
|
|
22
|
+
if (route.method !== request.method)
|
|
23
|
+
continue;
|
|
24
|
+
const params = match(route.path, path);
|
|
25
|
+
if (!params)
|
|
26
|
+
continue;
|
|
27
|
+
const props = plan.procedures[route.procedure]?.input.properties ?? {};
|
|
28
|
+
const body = await readJsonObject(request, "rest");
|
|
29
|
+
const input = { ...body, ...Object.fromEntries(Object.entries(params).map(([k, v]) => [k, coerce(v, props[k], k, "rest")])) };
|
|
30
|
+
return json(await runtime.invokeProcedure({ procedure: route.procedure, input, caller, cause: { kind: "http", id: crypto.randomUUID() } }));
|
|
31
|
+
}
|
|
32
|
+
throw wireError("NOT_FOUND", "no such route", "rest");
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
return failure(e, "rest");
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=createRestSurface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createRestSurface.js","sourceRoot":"","sources":["../../src/web/createRestSurface.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAOrG,MAAM,UAAU,iBAAiB,CAAC,OAAsB,EAAE,OAA2B;IACnF,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAClD,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IACzB,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IACzF,yGAAyG;IACzG,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;SACzC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SAC1I,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;QAC/B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC;YAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,eAAe,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;YAC9F,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,QAAQ;oBAAE,MAAM,SAAS,CAAC,WAAW,EAAE,mBAAmB,IAAI,GAAG,EAAE,MAAM,CAAC,CAAC;gBACnG,OAAO,IAAI,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YACvG,CAAC;YAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM;oBAAE,SAAS;gBAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACvC,IAAI,CAAC,MAAM;oBAAE,SAAS;gBACtB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC;gBACvE,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACnD,MAAM,KAAK,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAA2B,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxJ,OAAO,IAAI,CAAC,MAAM,OAAO,CAAC,eAAe,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC9I,CAAC;YACD,MAAM,SAAS,CAAC,WAAW,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/web/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/web/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC"}
|
|
@@ -7,7 +7,7 @@ diagnostic emitters and measured harnesses.
|
|
|
7
7
|
|
|
8
8
|
**Deciders**: phsu
|
|
9
9
|
|
|
10
|
-
**Related**: [ADR-0007](0007-ai-as-primary-author.md) (the AI-as-primary-author contract this diagnostic format serves); the zod runtime is described in [`docs/design-atoms.md`](
|
|
10
|
+
**Related**: [ADR-0007](0007-ai-as-primary-author.md) (the AI-as-primary-author contract this diagnostic format serves); the zod runtime is described in [`docs/design-atoms.md`](https://github.com/aotter/mantle/blob/main/docs/design-atoms.md) § "Manifest validation — JSON Schema in, zod at runtime".
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -217,7 +217,7 @@ from day 1 — manifest authoring stays JSON Schema, but the
|
|
|
217
217
|
runtime validator a manifest author's request body hits is a
|
|
218
218
|
zod schema, produced by Zod's official `z.fromJSONSchema` importer behind the
|
|
219
219
|
compatibility boundary in
|
|
220
|
-
`@aotter/mantle-spec` (see [`docs/design-atoms.md`](
|
|
220
|
+
`@aotter/mantle-spec` (see [`docs/design-atoms.md`](https://github.com/aotter/mantle/blob/main/docs/design-atoms.md) § "Manifest validation — JSON Schema in, zod at runtime").
|
|
221
221
|
Mantle validates its supported keyword/ref policy before import and emits
|
|
222
222
|
`JSON_SCHEMA_UNSUPPORTED`, `JSON_SCHEMA_REF_INVALID`, or
|
|
223
223
|
`JSON_SCHEMA_LIMIT_EXCEEDED`; Zod owns the accepted keywords' validation
|
|
@@ -63,7 +63,7 @@ execution. Deferred envelopes carry persisted entry data and normalized actor
|
|
|
63
63
|
metadata, never arbitrary original request input. Adapter-specific retry,
|
|
64
64
|
delay, batch, DLQ, and message-size settings remain outside manifest grammar.
|
|
65
65
|
The operational reference is
|
|
66
|
-
[`docs/deferred-lifecycle-queues.md`](
|
|
66
|
+
[`docs/deferred-lifecycle-queues.md`](https://github.com/aotter/mantle/blob/main/docs/deferred-lifecycle-queues.md).
|
|
67
67
|
|
|
68
68
|
Identity, session, OAuth, and role enforcement are adapter-owned per
|
|
69
69
|
ADR-0014. The runtime does not define `SessionRepository`,
|
|
@@ -227,7 +227,7 @@ There's no module-global state holding adapter-specific bindings.
|
|
|
227
227
|
- Removing a port is also possible (if a port is found to overlap or be unnecessary), again by amending this ADR.
|
|
228
228
|
|
|
229
229
|
**Discoverability for adapter authors**:
|
|
230
|
-
- A future adapter author reads this ADR + [`docs/adapter-guide.md`](
|
|
230
|
+
- A future adapter author reads this ADR + [`docs/adapter-guide.md`](https://github.com/aotter/mantle/blob/main/docs/adapter-guide.md), implements the two required ports, then wires boot and HTTP/MCP surfaces. That's the contract. No hidden state, no implicit assumptions about the HTTP framework.
|
|
231
231
|
|
|
232
232
|
**Test ergonomics**:
|
|
233
233
|
- Each port is small and isolated. Tests can mock individual ports without spinning up D1 or an OAuth provider.
|
|
@@ -439,7 +439,7 @@ and `ADMIN_GITHUB_LOGIN`; it does not use Platform Account OIDC, a client
|
|
|
439
439
|
secret, or an owner email handoff. The local provider id remains `github`.
|
|
440
440
|
The wire contract remains in [Platform #35](https://github.com/aotter/mantle-platform/issues/35),
|
|
441
441
|
and the product boundary is documented in
|
|
442
|
-
[`docs/auth-hosting-model.md`](
|
|
442
|
+
[`docs/auth-hosting-model.md`](https://github.com/aotter/mantle/blob/main/docs/auth-hosting-model.md).
|
|
443
443
|
|
|
444
444
|
This does not change ADR-0014's core rule: Mantle does not expose an
|
|
445
445
|
un-curated `betterAuthOptions` or `advanced` passthrough. Missing Better
|
|
@@ -521,7 +521,7 @@ every `tools/call`. MCP does not promise to accept a raw REST API key/PAT.
|
|
|
521
521
|
Dynamic membership, billing, and entitlement state remains consumer-owned.
|
|
522
522
|
`requires.guard.procedure` orchestrates a site handler on every invocation but
|
|
523
523
|
does not introduce a Policy atom or an entitlement service. See
|
|
524
|
-
[
|
|
524
|
+
[Guarded API access](../examples/guarded-api.md) for the public API
|
|
525
525
|
and end-to-end examples.
|
|
526
526
|
|
|
527
527
|
## Amendment — 2026-08-22: Better Auth 1.7 MCP and CIMD convergence
|
|
@@ -898,3 +898,22 @@ Boundaries that stay:
|
|
|
898
898
|
`verifyOAuthAccessToken`, DPoP binding and the MCP challenge are unchanged.
|
|
899
899
|
- No other Better Auth field gains a passthrough by this amendment. The
|
|
900
900
|
2026-05-14 test still applies to the next proposal.
|
|
901
|
+
|
|
902
|
+
## 2026-10-02 amendment — a surface with no anonymous tool challenges at connect
|
|
903
|
+
|
|
904
|
+
The 2026-09-21 amendment kept anonymous `initialize` and `tools/list` open on the public surface and moved the `401` to
|
|
905
|
+
the first `tools/call` that needs identity. MCP clients do not all follow that: several decide whether to run OAuth from
|
|
906
|
+
the connect step alone (an anonymous `initialize` that succeeds means "no sign-in"), so a surface whose every tool needs
|
|
907
|
+
identity never showed them a sign-in. Better Auth's `withMcpAuth` and the MCP SDK's `requireBearerAuth` both challenge
|
|
908
|
+
every unauthenticated request for the same reason.
|
|
909
|
+
|
|
910
|
+
- A surface is **closed** when none of its tools may be called anonymously: every tool's `requires.auth.all` names at least
|
|
911
|
+
one predicate (each of `ctx.user`, `ctx.auth`, `ctx.staff`, `ctx.auth.scope` needs an identity). The staff surface is
|
|
912
|
+
always closed; a public surface with no tools is open, since nothing on it needs a sign-in.
|
|
913
|
+
- On a closed surface every anonymous request (`initialize`, `tools/list`, the SSE `GET`) answers `401` with the RFC 9728
|
|
914
|
+
`WWW-Authenticate` challenge, as the staff surface already did. The challenge names the surface's scope floor
|
|
915
|
+
(`scope="mcp"` by default), so the first authorization already asks for it.
|
|
916
|
+
- A surface with at least one tool anonymous may call keeps the 2026-09-21 behaviour: discovery stays open and the first
|
|
917
|
+
`tools/call` that needs identity answers `401`.
|
|
918
|
+
- Nothing is configured: the rule follows from the plan, so a project that adds a public tool reopens discovery by
|
|
919
|
+
declaring it.
|
|
@@ -74,7 +74,7 @@ semantic fingerprint.
|
|
|
74
74
|
| Optional modules/adapters | Web/Admin composition and request/session/cache/platform translation | Re-parsing, re-linking, or a second authorization/runtime stack |
|
|
75
75
|
|
|
76
76
|
The current-to-target rule ledger and evidence are maintained in
|
|
77
|
-
[`docs/sealed-pipeline-ownership.md`](
|
|
77
|
+
[`docs/sealed-pipeline-ownership.md`](https://github.com/aotter/mantle/blob/main/docs/sealed-pipeline-ownership.md).
|
|
78
78
|
|
|
79
79
|
### Core and optional products
|
|
80
80
|
|
|
@@ -149,6 +149,10 @@ second manifest/runtime path.
|
|
|
149
149
|
|
|
150
150
|
### Naming and code generation
|
|
151
151
|
|
|
152
|
+
This section records the original codegen decision. The current generated API
|
|
153
|
+
uses a sealed `plan` and wire-keyed `Schemas`, `Views`, and `Store` type maps;
|
|
154
|
+
see the [typed queries guide](../handbook/guides/typed-queries.md).
|
|
155
|
+
|
|
152
156
|
The Core execution unit is `MantleRuntime`, not a site. Optional TypeScript
|
|
153
157
|
generation is a pure projection of linked/compiled semantics. It exposes
|
|
154
158
|
`bindMantle(runtime)` plus an eager `createMantle()` convenience that delegates
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# ADR-0022: Caller-observed `expectedVersion` for Admin and builtin upsert
|
|
2
2
|
|
|
3
|
-
**Status:** Accepted
|
|
3
|
+
**Status:** Accepted; the Admin binding rules are superseded by [ADR-0029](0029-mcp-apps-interaction-contracts.md) (Admin binds `expectedVersion` only from a declared interaction and infers no OCC target). The caller-observed version contract itself stands.
|
|
4
4
|
|
|
5
5
|
**Date:** 2026-09-14
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# ADR-0024: Materialize each Schema as a native storage table
|
|
2
2
|
|
|
3
|
-
**Status:** Accepted; the clauses allowing authored data to use `id`, `status` or `createdAt` are superseded by [ADR-0025](0025-reserved-native-columns-and-published-only-public-views.md) (2026-09-22)
|
|
3
|
+
**Status:** Accepted; the clauses allowing authored data to use `id`, `status` or `createdAt` are superseded by [ADR-0025](0025-reserved-native-columns-and-published-only-public-views.md) (2026-09-22); the migration-artifact and destructive-change workflow is superseded by [ADR-0033](0033-storage-converges-to-the-plan.md) for 0.2.0
|
|
4
4
|
|
|
5
5
|
**Date:** 2026-09-18
|
|
6
6
|
|
|
@@ -108,7 +108,7 @@ destructive in the pre-beta contract. Cloud rejects them; operators rebuild the
|
|
|
108
108
|
database and move required data manually outside Mantle and Control. Production
|
|
109
109
|
neither generates nor accepts arbitrary migration SQL.
|
|
110
110
|
|
|
111
|
-
Preparation records applied migration ids in the
|
|
111
|
+
Preparation records applied migration ids in the `_mantle_migrations` ledger (#1150).
|
|
112
112
|
The enclosing immutable artifact checksum protects the ordered SQL,
|
|
113
113
|
fingerprints, and target projections. Preparation rejects an unknown source
|
|
114
114
|
fingerprint, changed artifact checksum, skipped revision, or target mismatch.
|
|
@@ -24,7 +24,7 @@ Keeping host-only calls would preserve the old grammar but fail static validatio
|
|
|
24
24
|
|
|
25
25
|
## How to apply
|
|
26
26
|
|
|
27
|
-
Declare a schedule Trigger, export `worker.scheduled`, and register its expression in `wrangler.jsonc`. Use `ctx.schedule.id` to deduplicate writes. See [Trigger reference](../handbook/reference/trigger.md#schedule
|
|
27
|
+
Declare a schedule Trigger, export `worker.scheduled`, and register its expression in `wrangler.jsonc`. Use `ctx.schedule.id` to deduplicate writes. See [Trigger reference](../handbook/reference/trigger.md#schedule).
|
|
28
28
|
|
|
29
29
|
## Implementation status
|
|
30
30
|
|
|
@@ -10,11 +10,11 @@ An application needs a portable expiry rule across D1 and Bun SQLite. A cron-onl
|
|
|
10
10
|
|
|
11
11
|
## Decision
|
|
12
12
|
|
|
13
|
-
`Schema.spec.ttl` names one top-level date-time field and a nonnegative `expireAfterSeconds`. At `timestamp + duration <= now`, semantic reads exclude the row. Missing, null and unparseable legacy dates never expire. Declarative Views include the same predicate. Native SQL Views are rejected
|
|
13
|
+
`Schema.spec.ttl` names one top-level date-time field and a nonnegative `expireAfterSeconds`. At `timestamp + duration <= now`, semantic reads exclude the row. Missing, null and unparseable legacy dates never expire. Declarative Views include the same predicate. Native SQL Views that name a TTL Schema's table are rejected (SQL over other tables is unaffected), and shared caching of a TTL View is rejected. The compiled plan and introspection expose the policy. Public Cloudflare pages derived from TTL collections use `no-store` rather than shared caching.
|
|
14
14
|
|
|
15
15
|
SQLite storage implements an optional bounded `ExpirySweeper`. A sweep previews by default; `delete: true` is required for physical removal. It returns counts and a cursor, selects at most 100 expired IDs in stable order, and rechecks expiry in one bounded delete statement. A failed page can be retried with the previous cursor. Ref Procedures can call the semantic capability, including from a scheduled Trigger. No host automatically invokes it.
|
|
16
16
|
|
|
17
|
-
Physical TTL removal does not fire before/after entry lifecycle hooks. Expiry already changed logical visibility; cleanup reclaims storage rather than representing an editorial deletion. Consumers needing business actions at expiry must implement them in
|
|
17
|
+
Physical TTL removal does not fire before/after entry lifecycle hooks. Expiry already changed logical visibility; cleanup reclaims storage rather than representing an editorial deletion. Consumers needing business actions at expiry must implement them in idempotent scheduled host code before calling the sweep.
|
|
18
18
|
|
|
19
19
|
## Consequences
|
|
20
20
|
|
|
@@ -26,7 +26,7 @@ Scheduler-driven deletion alone leaves a visibility gap. Implicit migration-time
|
|
|
26
26
|
|
|
27
27
|
## How to apply
|
|
28
28
|
|
|
29
|
-
Declare `ttl` on a Schema, use declarative Views, preview with `runtime.sweepExpired`, then explicitly request deletion page by page. See [Schema TTL](../handbook/reference/schema.md#ttl).
|
|
29
|
+
Declare `ttl` on a Schema, use declarative Views, preview with `runtime.store.sweepExpired({ collection, delete: false })`, then explicitly request deletion page by page. See [Schema TTL](../handbook/reference/schema.md#ttl).
|
|
30
30
|
|
|
31
31
|
## Implementation status
|
|
32
32
|
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
# ADR-0029: Official MCP SDK, interaction contracts and MCP Apps
|
|
2
|
+
|
|
3
|
+
**Status:** Accepted
|
|
4
|
+
|
|
5
|
+
**Date:** 2026-09-25
|
|
6
|
+
|
|
7
|
+
**Related:** epic [#1110](https://github.com/aotter/mantle/issues/1110)
|
|
8
|
+
(supersedes #1109); tracked as [#1114](https://github.com/aotter/mantle/issues/1114).
|
|
9
|
+
Builds on [ADR-0012](0012-views-as-public-rest.md),
|
|
10
|
+
[ADR-0014](0014-auth-better-auth-and-multi-tenant-mcp.md),
|
|
11
|
+
[ADR-0019](0019-sealed-manifest-runtime-pipeline.md),
|
|
12
|
+
[ADR-0020](0020-builtin-handler-contracts-and-matched-upsert.md),
|
|
13
|
+
[ADR-0022](0022-caller-observed-version-occ.md),
|
|
14
|
+
[ADR-lite 845](adr-lite-845-frontend-client.md),
|
|
15
|
+
[ADR-lite 861](adr-lite-861-admin-webmcp.md).
|
|
16
|
+
Amends [ADR-lite 909](adr-lite-909-admin-ui-kit.md) (the kit moves to
|
|
17
|
+
`@aotter/mantle-ui`). External: MCP specification 2025-11-25 and 2026-07-28,
|
|
18
|
+
the MCP Apps extension, and the official TypeScript SDK
|
|
19
|
+
(`@modelcontextprotocol/server` 2.1.0, `client` 2.1.0, `ext-apps` 2.0.0).
|
|
20
|
+
|
|
21
|
+
## Context
|
|
22
|
+
|
|
23
|
+
Mantle projects callable capabilities from the sealed RuntimePlan
|
|
24
|
+
(`CallableCapabilityProjector`) and serves them over a hand-written JSON-RPC
|
|
25
|
+
dispatcher in `mantle-runtime/src/infrastructure/mcp`. The #1109 goal (agents
|
|
26
|
+
discover capabilities, find the right record, and open an interaction UI in
|
|
27
|
+
chat) exposed three gaps.
|
|
28
|
+
|
|
29
|
+
**Protocol.** The hand-written dispatcher accepts only protocol `2025-11-25`,
|
|
30
|
+
has no resource layer, and duplicates negotiation, batching and error framing
|
|
31
|
+
that the official SDK already owns. MCP Apps would add `resources/*`,
|
|
32
|
+
`ui://` resources and `_meta.ui` negotiation on top. The repository already
|
|
33
|
+
tests against the official client (#1023), and the official
|
|
34
|
+
`@modelcontextprotocol/ext-apps` 2.0 server helpers target SDK 2.x.
|
|
35
|
+
|
|
36
|
+
**Semantics in the wrong layer.** Tool semantics live in the transport:
|
|
37
|
+
generic-tool role floors, entry mutability checks, argument parsing, media
|
|
38
|
+
tool descriptions and `expected_version` annotation are in `McpToolCatalog`
|
|
39
|
+
and `McpJsonRpcDispatcher.dispatchToolByName`. They must survive a transport
|
|
40
|
+
swap unchanged.
|
|
41
|
+
|
|
42
|
+
**Interaction contracts.** Verified on `develop` @ `35d2c14`:
|
|
43
|
+
|
|
44
|
+
1. Row binding is inferred, and only in Admin. `discoverRowBindings`
|
|
45
|
+
(`mantle-admin/src/mountMantleAdmin.ts`) picks a same-name property, then a
|
|
46
|
+
lone single-field unique index, then `id`. The procurement example omits
|
|
47
|
+
`x-mantle-ref` because the inference would bind `requestNumber` where
|
|
48
|
+
builtin `update` needs the entry id.
|
|
49
|
+
2. Admin's View page has no row operations; bindings are keyed by collection.
|
|
50
|
+
3. SQL Views declare no output (ADR-lite 845).
|
|
51
|
+
4. `lockedCollection()` in `ManifestGraphValidator` infers the collection an
|
|
52
|
+
OCC write locks. It is a diagnostic heuristic, not an execution contract.
|
|
53
|
+
5. Staff MCP has no single-entry read.
|
|
54
|
+
6. Admin binds the version read when the dialog opens
|
|
55
|
+
(`row-operations.tsx`), not the version of the row the user saw.
|
|
56
|
+
7. Business errors are JSON-RPC `-32000` errors with `error.data`.
|
|
57
|
+
8. Website preview (`?preview=1`) is authorized by a staff session cookie,
|
|
58
|
+
which is a third-party cookie inside a host's sandboxed iframe.
|
|
59
|
+
9. Canonical Admin refuses framing (`frame-ancestors 'none'`).
|
|
60
|
+
10. An MCP App's `tools/call` is proxied by the host with the model's client
|
|
61
|
+
credential. The server cannot tell a UI call from a model call.
|
|
62
|
+
|
|
63
|
+
## Decision
|
|
64
|
+
|
|
65
|
+
### 1. Protocol belongs to the official SDK; semantics belong to Mantle
|
|
66
|
+
|
|
67
|
+
All MCP wire handling uses the official TypeScript SDK: JSON-RPC framing,
|
|
68
|
+
version negotiation, transports, `tools/*`, `resources/*` and MCP Apps
|
|
69
|
+
metadata. Mantle keeps authorization, guards, OCC, audit, validation and the
|
|
70
|
+
diagnostic vocabulary. Official packages are pinned to exact versions and
|
|
71
|
+
never forked. No hand-written JSON-RPC handling remains in the repository.
|
|
72
|
+
|
|
73
|
+
Both protocol eras are served: `2026-07-28` and `2025-*` in stateless mode
|
|
74
|
+
(`createMcpHandler(..., { legacy: "stateless" })`).
|
|
75
|
+
|
|
76
|
+
### 2. Runtime is transport-neutral
|
|
77
|
+
|
|
78
|
+
Runtime stops knowing about MCP. It provides:
|
|
79
|
+
|
|
80
|
+
- `CapabilityCatalog` (domain service): one transport-neutral description per
|
|
81
|
+
callable capability on a surface: Views, Procedures, generic authoring and
|
|
82
|
+
lifecycle operations, and media upload. Each carries name, surface, title,
|
|
83
|
+
description, `inputSchema`, declared `outputSchema`, annotations,
|
|
84
|
+
`requiresIdentity` and the argument that identifies the operation for audit.
|
|
85
|
+
- `InvokeCapabilityUseCase` (use case): the single execution entry and the
|
|
86
|
+
single validation point. It returns
|
|
87
|
+
`{ ok: true, data } | { ok: false, diagnostic }`. Missing or ill-typed
|
|
88
|
+
arguments are `VALIDATION_FAILED` diagnostics.
|
|
89
|
+
|
|
90
|
+
Nothing under `domain/` or `usecase/` imports an MCP concept.
|
|
91
|
+
|
|
92
|
+
### 3. Validate once
|
|
93
|
+
|
|
94
|
+
The SDK receives each `inputSchema` through `fromJsonSchema(schema, validator)`
|
|
95
|
+
with a pass-through validator: the schema is advertised unchanged, and the
|
|
96
|
+
SDK does not validate. Runtime validates once, so MCP, HTTP and Admin report
|
|
97
|
+
the same Mantle diagnostic, and the Ajv instance the default validator would
|
|
98
|
+
pull in is not bundled.
|
|
99
|
+
|
|
100
|
+
`outputSchema` is the safe projection from #1127: an allowlist that only
|
|
101
|
+
loosens the declared schema, so a standard client validator accepts every
|
|
102
|
+
value Runtime accepts. Ineligible outputs advertise none. Views advertise none.
|
|
103
|
+
|
|
104
|
+
### 4. Results and errors (D1)
|
|
105
|
+
|
|
106
|
+
- **Success:** `content` is one JSON text block; `structuredContent` carries
|
|
107
|
+
the value when it is a plain object.
|
|
108
|
+
- **Business failure:** `isError: true` with `{ diagnostics: [Diagnostic] }`
|
|
109
|
+
(the ADR-0008 shape) as a JSON text block, repeated as `structuredContent`
|
|
110
|
+
unless the tool advertises an `outputSchema`. Structured results must
|
|
111
|
+
conform to that schema, and 1.x clients validate them even on `isError`.
|
|
112
|
+
This replaces the JSON-RPC `-32000` business error and is a breaking wire
|
|
113
|
+
change, announced with the cutover.
|
|
114
|
+
- **Protocol failure** (malformed request, unknown method, unsupported
|
|
115
|
+
version) stays a JSON-RPC error owned by the SDK.
|
|
116
|
+
- **Authentication:** an anonymous call to a tool whose capability
|
|
117
|
+
`requiresIdentity` (including any member of a 2025-era batch) is answered
|
|
118
|
+
before the SDK with HTTP 401 and a `WWW-Authenticate` challenge built by the
|
|
119
|
+
SDK helper. The SDK's own
|
|
120
|
+
`scopeChallenge` covers scopes only; identity stays outside it.
|
|
121
|
+
|
|
122
|
+
### 5. Identity stays outside the SDK
|
|
123
|
+
|
|
124
|
+
The SDK never verifies tokens. Adapters verify the caller with `mantle-auth`
|
|
125
|
+
(ADR-0014), build the `HandlerContext`, and pass it as `authInfo.extra`. The
|
|
126
|
+
server factory reads it per request. Authorization extensions such as EMA are
|
|
127
|
+
unaffected.
|
|
128
|
+
|
|
129
|
+
### 6. Packages and dependency direction (D7)
|
|
130
|
+
|
|
131
|
+
Two packages are added; no other package is split.
|
|
132
|
+
|
|
133
|
+
| Package | Responsibility |
|
|
134
|
+
|---|---|
|
|
135
|
+
| `@aotter/mantle-mcp` | Optional. Registers the capability catalog on an official `McpServer` per surface (`createMantleMcpServer`), wraps `createMcpHandler` (`createMantleMcpHandler`), writes audit per call, and registers MCP Apps resources and app tools through `@modelcontextprotocol/ext-apps/server`. No UI dependency. |
|
|
136
|
+
| `@aotter/mantle-ui` | Optional. `/controller`: framework-free interaction controller; must not import React. `/` (root): React interaction components. `/kit` (with `kit.css` and `tokens.css`): the ADR-lite 909 kit moved from `@aotter/mantle-admin-ui/kit`, whose libraries are optional peers so `/controller` installs none. `/mcp-app`: a single-file `ui://` HTML build (`vite-plugin-singlefile`) using the official `App` bridge. |
|
|
137
|
+
|
|
138
|
+
```text
|
|
139
|
+
mantle-spec ◄── mantle-runtime ◄── mantle-mcp ◄── adapters, mantle-admin
|
|
140
|
+
▲ │
|
|
141
|
+
│ └──► @modelcontextprotocol/server, ext-apps/server
|
|
142
|
+
│ (types only)
|
|
143
|
+
mantle-ui/controller ◄── mantle-ui ◄── mantle-ui/mcp-app ──► ext-apps (App)
|
|
144
|
+
▲
|
|
145
|
+
mantle-admin-ui
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
- Arrows point from consumer to dependency. Server packages never depend on
|
|
149
|
+
UI packages; `mantle-mcp` receives MCP App HTML as injected bytes.
|
|
150
|
+
|
|
151
|
+
> **Amendment (0.2.0):** results carry no `_meta` interaction description.
|
|
152
|
+
> `planApp(plan, { surface, html })` (`@aotter/mantle/mcp`) embeds the plan's
|
|
153
|
+
> catalog (each View tool's columns as the fields they read, and, for a View
|
|
154
|
+
> that reads one table and outputs its `id`, the Procedure tools whose
|
|
155
|
+
> `target` is that Schema) as a JSON script in the injected HTML, and renders
|
|
156
|
+
> every View tool of the surface. A rendered result names its tool in
|
|
157
|
+
> `_meta["net.aotter.mantle/tool"]`. The App (`mantleAppHtml` from
|
|
158
|
+
> `@aotter/mantle-ui/mcp-app`) reviews a row as listed; a moved version is the
|
|
159
|
+
> server's `CONFLICT`. The preset serves it on `/mcp/staff`; a member-facing
|
|
160
|
+
> App is the application's own.
|
|
161
|
+
- `@aotter/mantle-admin-ui/kit` re-exports from `@aotter/mantle-ui` for one
|
|
162
|
+
minor release, then is removed.
|
|
163
|
+
- No exported UI module depends on Admin's router, global API client, query
|
|
164
|
+
singletons or cookie session.
|
|
165
|
+
|
|
166
|
+
### 7. Interaction contract
|
|
167
|
+
|
|
168
|
+
| Term | Meaning |
|
|
169
|
+
|---|---|
|
|
170
|
+
| **Capability** | A callable View or Procedure on one surface, with its Trigger identity. |
|
|
171
|
+
| **Target** | The entity an interaction is about: collection plus a stable key, never a display label. |
|
|
172
|
+
| **Reference** | A declared relation from a field to a target collection and key. A reference alone does not mean an operation mutates or locks that entity. |
|
|
173
|
+
| **Operation target** | The entity an operation mutates and whose version it locks. |
|
|
174
|
+
| **Snapshot read** | The authorized read that produces what the human sees, including its version. |
|
|
175
|
+
| **Input binding** | An explicit mapping from snapshot fields to operation input. |
|
|
176
|
+
| **Version binding** | The input field carrying the observed version, taken from the snapshot the human saw. |
|
|
177
|
+
| **Renderer** | Presentation of a snapshot, form, review or outcome. Owns no semantics. |
|
|
178
|
+
|
|
179
|
+
Rules:
|
|
180
|
+
|
|
181
|
+
- An interaction is **entity-bound** only when target, snapshot read, input
|
|
182
|
+
binding and (when required) version binding are all established by the
|
|
183
|
+
contract. Otherwise no automatic binding is offered; the operation stays
|
|
184
|
+
usable as an ordinary form.
|
|
185
|
+
- Nothing is guessed from names.
|
|
186
|
+
- **Derivable today:** builtin `update`/`delete`/`archive` and id-based
|
|
187
|
+
`upsert` target `handler.schema` by input `id`, with `expectedVersion` when
|
|
188
|
+
declared; a non-SQL View's rows target its `from` collection when `fields`
|
|
189
|
+
includes `id`, and supply a version only when `fields` includes `version`.
|
|
190
|
+
- **Declared (D4, grammar-revise #1116):**
|
|
191
|
+
- `x-mantle-ref: { schema, field }` on a Schema or View field names the
|
|
192
|
+
target collection and the key field. `field` must be `id` or a
|
|
193
|
+
single-field unique index of `schema`.
|
|
194
|
+
- `Procedure.spec.target: { schema, id, version? }` names a `ref`
|
|
195
|
+
handler's operation target: `id` and `version` are input property names.
|
|
196
|
+
It is rejected on builtin handlers, whose target is already derivable.
|
|
197
|
+
- Queries, notifications and multi-entity Procedures declare no target.
|
|
198
|
+
- `lockedCollection()` stays a diagnostic heuristic.
|
|
199
|
+
- SQL Views are not bound automatically until a validated output contract
|
|
200
|
+
admits them.
|
|
201
|
+
- **View purpose (D5, #1115):** `View.spec.description` is added and projected
|
|
202
|
+
into the View tool description.
|
|
203
|
+
|
|
204
|
+
### 8. Snapshot and version (D2)
|
|
205
|
+
|
|
206
|
+
- Public and member snapshots are read only through declared, parameterized
|
|
207
|
+
Views.
|
|
208
|
+
- Staff snapshots use a bounded single-entry read offered only for
|
|
209
|
+
collections that are the target of a declared interaction. Other staff
|
|
210
|
+
reads go through Views. This limits which records flow into a model
|
|
211
|
+
provider's context.
|
|
212
|
+
- The version bound to an operation is the version the human saw. A newer
|
|
213
|
+
read is shown as "changed since the list" and requires a deliberate re-read
|
|
214
|
+
and review; it never rebinds silently. Background refresh never replaces
|
|
215
|
+
user edits.
|
|
216
|
+
- Conflicts preserve user input. Uncertain writes (timeout, abort) are not
|
|
217
|
+
retried; the controller reconciles first.
|
|
218
|
+
|
|
219
|
+
### 9. Projection ownership (D8)
|
|
220
|
+
|
|
221
|
+
- Spec resolves D4 declarations during link. The RuntimePlan compiler emits
|
|
222
|
+
interaction descriptors (`plan.interactions`); this advances
|
|
223
|
+
`RUNTIME_PLAN_VERSION`.
|
|
224
|
+
- The capability catalog, Admin operations and the web client all read
|
|
225
|
+
`plan.interactions`. HTTP-only staff Procedures never enter an MCP
|
|
226
|
+
projection.
|
|
227
|
+
- Admin's inference is kept for one minor release. When an operation is bound
|
|
228
|
+
only by inference, Admin logs one deprecation warning pointing to
|
|
229
|
+
`Procedure.spec.target`. The next minor removes the inference.
|
|
230
|
+
- Dynamic availability is advisory. No mutating handler runs to infer
|
|
231
|
+
availability.
|
|
232
|
+
|
|
233
|
+
### 10. MCP Apps
|
|
234
|
+
|
|
235
|
+
Implemented the way the official `add-app-to-server` and `create-mcp-app`
|
|
236
|
+
skills describe:
|
|
237
|
+
|
|
238
|
+
- `mantle-mcp` registers `ui://` resources with `registerAppResource` and
|
|
239
|
+
interaction tools with `registerAppTool` and `_meta.ui.resourceUri`.
|
|
240
|
+
App-only helpers use `_meta.ui.visibility: ["app"]` and are read-only.
|
|
241
|
+
- Negotiation uses `getUiCapability`, per request. A 2026-07-28 request, or a
|
|
242
|
+
2025-era `initialize`, that declares no MCP Apps support gets no `_meta.ui`,
|
|
243
|
+
no resources and no app-only tools; everything else is unchanged.
|
|
244
|
+
- A stateless 2025-era request after `initialize` carries no client
|
|
245
|
+
capabilities. It is treated as possibly supporting MCP Apps: it gets the App
|
|
246
|
+
metadata and the app-only tools, so hosts with MCP Apps can call them on
|
|
247
|
+
every request. Hosts without MCP Apps ignore the metadata but may list the
|
|
248
|
+
app-only tools to the model. This is why app-only tools must be declared
|
|
249
|
+
read-only.
|
|
250
|
+
- Each surface is its own `McpServer`; staff resources never appear on public.
|
|
251
|
+
- Resources hold reusable assets only: no caller data, no bearer. Per-call data
|
|
252
|
+
travels in `structuredContent`. Every app tool keeps its text `content`.
|
|
253
|
+
- Opening an interaction is read-only; a mutation is always a separate
|
|
254
|
+
explicit `tools/call`. Canonical Admin keeps refusing framing.
|
|
255
|
+
- **Preview (D10):** a staff-only, read-only, app-only `preview_entry` tool,
|
|
256
|
+
offered only when a Web renderer is mounted, returns the rendered HTML in
|
|
257
|
+
`structuredContent` under bearer authorization. The app shows it in a
|
|
258
|
+
sandboxed `srcdoc` iframe without `allow-same-origin`. The response is
|
|
259
|
+
`no-store` and the HTML never enters a shared resource.
|
|
260
|
+
- **Hosts (D6):** CI runs the official `basic-host` and
|
|
261
|
+
`@modelcontextprotocol/client`; Claude and ChatGPT are verified manually per
|
|
262
|
+
release of this feature. No identical behavior across hosts is assumed.
|
|
263
|
+
|
|
264
|
+
### 11. Human approval (D3)
|
|
265
|
+
|
|
266
|
+
Deferred. UI confirmation and app-only visibility do not prove a human
|
|
267
|
+
decision (Context 10). The handbook documents the pattern that works today: a
|
|
268
|
+
`readOnly: true` Schema blocks generic writes, and an approval Procedure with
|
|
269
|
+
only an HTTP Trigger and a `ctx.staff` requirement appears in Admin but in no
|
|
270
|
+
MCP catalog. A test asserts an MCP-audience token cannot call an HTTP
|
|
271
|
+
Trigger. Any future Core mechanism is enforced at the server boundary and
|
|
272
|
+
binds target, input and version.
|
|
273
|
+
|
|
274
|
+
### 12. Presentation boundary
|
|
275
|
+
|
|
276
|
+
Renderer registries and `uiSchema` carry presentation only. Target, input
|
|
277
|
+
mapping, authorization, side effects and version semantics are never declared
|
|
278
|
+
there.
|
|
279
|
+
|
|
280
|
+
## Consequences
|
|
281
|
+
|
|
282
|
+
- One validated interaction definition drives Admin, application frontends
|
|
283
|
+
and chat hosts. Admin becomes a consumer of binding rules.
|
|
284
|
+
- Applications that do not use MCP no longer carry any MCP code in Runtime.
|
|
285
|
+
Applications that do add `@aotter/mantle-mcp` and its SDK dependency;
|
|
286
|
+
measured on a minimal Worker, SDK plus zod is about 82 KiB gzip without Ajv.
|
|
287
|
+
- MCP business errors change from JSON-RPC errors to `isError` results
|
|
288
|
+
(`breaking-change`), announced when adapters cut over.
|
|
289
|
+
- Manifests that need entity-bound interactions for `ref` handlers or non-id
|
|
290
|
+
references adopt the D4 declarations. The sealed plan version advances, so
|
|
291
|
+
applications rerun `mantle generate`.
|
|
292
|
+
- Hosts without MCP Apps support see only the additive `structuredContent`
|
|
293
|
+
and `outputSchema`.
|
|
294
|
+
|
|
295
|
+
## Alternatives
|
|
296
|
+
|
|
297
|
+
- **Keep the hand-written dispatcher and add MCP Apps to it.** Duplicates
|
|
298
|
+
the SDK, stays on one protocol version, and diverges from the official
|
|
299
|
+
ext-apps helpers.
|
|
300
|
+
- **Validate in both the SDK and Runtime.** Two error shapes for one mistake,
|
|
301
|
+
and Ajv in every Worker.
|
|
302
|
+
- **Put MCP Apps in Runtime with an injected provider.** Makes Runtime own a
|
|
303
|
+
protocol extension; the SDK already owns resources.
|
|
304
|
+
- **More packages** (separate controller, kit, app packages). Three
|
|
305
|
+
versioning surfaces for one feature; subpaths give the same boundaries.
|
|
306
|
+
- **Each surface derives relations itself.** Status quo; inconsistent.
|
|
307
|
+
- **Bindings in `uiSchema` or an SDK-side registry.** A second, unvalidated
|
|
308
|
+
Manifest; rejected by #1109.
|
|
309
|
+
- **Embed canonical Admin.** Requires weakening framing and cookie policy.
|
|
310
|
+
- **Promote `lockedCollection()` to the execution contract.** A reference does
|
|
311
|
+
not prove mutation or locking.
|
|
312
|
+
|
|
313
|
+
## How to apply
|
|
314
|
+
|
|
315
|
+
Work follows epic #1110 as stacked PRs:
|
|
316
|
+
|
|
317
|
+
1. #1126, #1127 — dispatcher factory; `structuredContent` and `outputSchema`.
|
|
318
|
+
2. #1129 — `CapabilityCatalog` and `InvokeCapabilityUseCase`.
|
|
319
|
+
3. #1130 — `@aotter/mantle-mcp`.
|
|
320
|
+
4. #1131 — adapters, Admin and templates cut over; hand-written dispatcher
|
|
321
|
+
deleted.
|
|
322
|
+
5. #1115, #1116 — grammar-revise; then #1120 interaction descriptors.
|
|
323
|
+
6. #1121 — MCP Apps registration; #1122, #1123, #1124 — `@aotter/mantle-ui`;
|
|
324
|
+
#1125 — preview; #1119 — host matrix.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# ADR-0030: Store — one persistence object over one relational query AST
|
|
2
|
+
|
|
3
|
+
**Status:** Accepted (#1151). Runtime slices shipped in 0.1.5 alphas; the grammar slice, the storage port and the removal of the parallel paths are decided for 0.2.0 by [ADR-0032](0032-store-centric-core-and-service-contract.md). Manifest authoring is amended by [ADR-0034](0034-store-is-authored-as-sql.md).
|
|
4
|
+
|
|
5
|
+
**Date:** 2026-09-26
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
Entry persistence grew parallel paths: builtin-op use cases over `EntryRepository`, `ctx.writeAtomically` over `AtomicEntryWriter`, declarative Views with their own Filter AST, typed-query bindings, `runtime.entries` readers and the TTL sweeper. Each re-implements filters, OCC and SQL for every adapter, and the public vocabulary stops at id-addressed single rows. A consumer deleting one workout (swolhalla/swolhalla-mantle#15) expands it to two statements per row — about 51 queries for a small workout and 615 for a large one — or bypasses Mantle with raw SQL against Mantle-owned tables.
|
|
10
|
+
|
|
11
|
+
## Decision
|
|
12
|
+
|
|
13
|
+
**Store** is the single persistence object: `ctx.store` inside Procedures (bound to the caller) and `runtime.store` for trusted host code.
|
|
14
|
+
|
|
15
|
+
- Queries are a closed **relational AST with a JSON shape**: SQL vocabulary and semantics (`select`/`from`/`where`/`orderBy`, NULL, subqueries), never a SQL string. Adapters compile it; values are always bound and identifiers come only from the linked Schema, so row scope and OCC can be injected structurally later.
|
|
16
|
+
- Where grammar: `{ column: value }` is equality and sibling keys AND; `{ column: { eq, ne, gt, gte, lt, lte, like, in, notIn, isNull } }`; `and`/`or`/`not`; `in`/`notIn` accept a `{ select, from, where }` subquery. Columns are scalar Schema fields plus the native `id`, `status`, `version`, `createdAt`, `updatedAt`, `authorId`. `like` requires a string column, uses SQLite patterns and `\` as its escape character. `ne` follows SQL and excludes NULL.
|
|
17
|
+
- Rows are flat (native columns next to Schema fields; the parser forbids clashes). Pagination is keyset `limit` (1–500) / `cursor` over one scalar `orderBy` column with `id` as tie-breaker. Declared-required fields can still be NULL in storage (publishing drafts validate partially; added columns start NULL), so NULLs sort last in either direction and the cursor carries a NULL value; no row falls between pages. A cursor is bound to its Schema, column and direction. TTL-expired rows stay hidden everywhere, including subqueries (ADR-0028).
|
|
18
|
+
- `select` returns every lifecycle status: it is a trusted-handler read, not a public View. A Procedure exposed to callers must filter `status` itself (ADR-0025 applies to public Views only). `ne` and `not` follow SQL three-valued logic and exclude NULL; subqueries exclude NULL values so `notIn` behaves like its array form (a NULL left-hand value still matches `notIn` only when the list is empty, as in SQL). A `where` nests at most 16 levels and counts at most 256 objects, comparisons and subqueries in total. A Schema field named `and`, `or` or `not` cannot be filtered.
|
|
19
|
+
- Storage support is an optional `StoreReader` capability; absent support is `RESOURCE_UNAVAILABLE`. Invalid queries are `INPUT_VALIDATION_FAILED`. A statement binds at most 100 values (D1's limit) on every adapter.
|
|
20
|
+
- `store.view(name, options)` runs a named View with the caller's context; `store.id()` returns an entry id.
|
|
21
|
+
- Runtime validates and snapshots Store queries before calling a storage adapter, including nested set-delete filters. Storage adapters retain dialect-specific limits and SQL compilation. `sweepExpired` is host maintenance and rejects every caller-bound Procedure Store, including an anonymous caller.
|
|
22
|
+
- A Schema may declare one identity scope as `scope: { ownerId: "$ctx.user.id" }`, where the named field is a required scalar string and starts an index. Caller-bound Store reads and deletes structurally AND this predicate into every touched Schema, including subqueries. Insert fills the field and rejects a conflicting value; id-based update/delete check the row owner before hooks. A missing caller identity fails closed. `expect` counts affected rows after scope. `runtime.store` remains trusted and unscoped. Until declarative Views use Store IR, a declarative View over a scoped Schema must carry the same top-level identity predicate and auth gate. Native SQL Views remain a trusted escape hatch.
|
|
23
|
+
|
|
24
|
+
Delivery order (each a reviewed PR): (1) `select`, `view`, `id` — this ADR's first slice; (2) `store.write(ops)` with `insert`/`update`/`delete`, `lock` and `expect`, set-based deletes over live rows only, rejected on Schemas with per-row delete hooks and on publishing Schemas (published entries are protected), replacing `ctx.writeAtomically`; (3) manifest grammar (handler `ref | store`, View `select`, Schema `scope`) and removal of the parallel read paths, under grammar-revise.
|
|
25
|
+
|
|
26
|
+
## Consequences
|
|
27
|
+
|
|
28
|
+
- One compiler per dialect replaces per-path SQL generators as later slices land; the SQLite family (D1, Bun, libSQL) implements it first, IndexedDB fails closed until it opts in.
|
|
29
|
+
- Handlers get multi-Schema reads without raw SQL; Web and Admin keep `EntryReader` until the grammar slice.
|
|
30
|
+
- Breaking changes are limited to 0.1.5-alpha APIs until the grammar slice, which ships with a `mantle-update` codemod.
|
|
31
|
+
|
|
32
|
+
## Alternatives
|
|
33
|
+
|
|
34
|
+
MongoDB-flavoured operators (`deleteMany`, `$in`) were considered first and rejected: every backend is relational, document semantics (nested paths, missing versus null) mismatch SQLite, and SQL is the vocabulary agents know best. SQL strings cannot carry injected scope and locks without a parser. Extending `writeAtomically` alone would add a fifth path.
|
|
35
|
+
|
|
36
|
+
> **Amendment (ADR-0034):** Manifests now carry SQL, and the CLI's parser lowers it to this AST before it reaches any Worker. The Store API still takes no SQL string. The AST grows to what the SQL dialect needs (expressions, `CASE`, joins, aggregates, window functions, `RETURNING`, `ON CONFLICT`), and native SQL Views are no longer an escape hatch.
|
|
37
|
+
|
|
38
|
+
## New folder rationale
|
|
39
|
+
|
|
40
|
+
`usecase/store/` holds the Store facade that binds storage capability, the View executor and the id generator to one caller context; it has no storage or platform imports.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# ADR 0031: Cloud supplies the host Core pin
|
|
2
|
+
|
|
3
|
+
Status: Accepted for mantle-host protocol 2.
|
|
4
|
+
|
|
5
|
+
The backend artifact includes `sdkVersion` and `sdkRevision` in its hashed
|
|
6
|
+
bytes. The old host bundled a fixed Core revision. Cloud can run the previous
|
|
7
|
+
Core release, so a host built from current Core cannot assume its own revision
|
|
8
|
+
is the revision Cloud accepts. Asking only the backend upload grant is too
|
|
9
|
+
late: that grant requires the artifact hash first.
|
|
10
|
+
|
|
11
|
+
`save` now preflights the project and emits `cloud-host-contract` with the
|
|
12
|
+
project ID. Control returns `{ projectId, core: { version, revision }, protocol }`
|
|
13
|
+
from the deployed Cloud configuration. The script validates the project,
|
|
14
|
+
40-hex revision and protocol minimum before packing. It persists the pin and
|
|
15
|
+
backend hash together. Upload grants, HTTP responses and the frontend kit must
|
|
16
|
+
echo the same pin; a difference fails before another upload and requires a new
|
|
17
|
+
save. No static Core pin is shipped in the plugin. The script contacts only
|
|
18
|
+
the granted Cloud HTTP endpoints; the contract comes through the Cloud MCP
|
|
19
|
+
tool, like upload grants.
|
|
20
|
+
|
|
21
|
+
Protocol 2 changes the MCP save sequence and requires both Core version and
|
|
22
|
+
revision in `kit.json`. Control must provide the contract tool and pin echoes
|
|
23
|
+
before this host script is offered to users. A future change to the MCP
|
|
24
|
+
sequence, artifact bytes or validation meaning requires a protocol bump. A
|
|
25
|
+
new Core release using these same rules changes only the Cloud contract pin.
|