@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
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Reference service
|
|
2
|
+
|
|
3
|
+
A small shop built on `@aotter/mantle` 0.2.0. It is also the Worker that the
|
|
4
|
+
release gate runs (`scripts/check-worker-consumer.mjs`).
|
|
5
|
+
|
|
6
|
+
- `manifests/`: the whole service in the v2 grammar.
|
|
7
|
+
- A scoped Schema (`orders`) and a Schema with a check (`items`, `stock >= 0`).
|
|
8
|
+
- Views written as one `SELECT`: a join, a `GROUP BY`, and `mantle.search`.
|
|
9
|
+
- Procedures written as SQL: a two-statement order, an `ON CONFLICT`
|
|
10
|
+
restock, and an optimistic-lock cancel in handler code.
|
|
11
|
+
- An after hook that loops over `ctx.cause.rows`.
|
|
12
|
+
- A POSIX cron.
|
|
13
|
+
- `src/handlers.ts`: the three `ref` handlers, written against the typed
|
|
14
|
+
`ctx.store`.
|
|
15
|
+
- `src/service.ts`, `src/index.ts`, `wrangler.jsonc`, `tsconfig.json`: the
|
|
16
|
+
preset `mantle generate` wrote once. These files are the application's own.
|
|
17
|
+
- `smoke.mjs`: starts `wrangler dev` on a fresh local D1 and drives the service:
|
|
18
|
+
- console email-OTP sign-in for an owner and a buyer;
|
|
19
|
+
- REST, both MCP surfaces, the cron, and Admin: the console from `@aotter/mantle-ui/admin` at `/admin`, its API, and an editor's save;
|
|
20
|
+
- asserts scope, the stock check, locks and hooks.
|
|
21
|
+
|
|
22
|
+
Outside the SDK workspace, with Node 22+ and pnpm 9+, pin every dependency to
|
|
23
|
+
one exact version, then:
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
pnpm install
|
|
27
|
+
pnpm check # generate, generate --check, typecheck, smoke
|
|
28
|
+
cp .dev.vars.example .dev.vars # set ADMIN_EMAIL and a random BETTER_AUTH_SECRET
|
|
29
|
+
pnpm dev # open /admin; sign-in codes are printed to this log
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The release gate installs the exact tarballs it just packed in place of the
|
|
33
|
+
pinned versions.
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# A small shop: a public catalog, orders that only their owner sees, and staff tools.
|
|
2
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
3
|
+
kind: Schema
|
|
4
|
+
metadata: { name: items }
|
|
5
|
+
spec:
|
|
6
|
+
title: Items
|
|
7
|
+
lifecycle: operational
|
|
8
|
+
schema:
|
|
9
|
+
type: object
|
|
10
|
+
required: [sku, name, stock]
|
|
11
|
+
properties:
|
|
12
|
+
sku: { type: string }
|
|
13
|
+
name: { type: string }
|
|
14
|
+
priceCents: { type: integer, minimum: 0 }
|
|
15
|
+
stock: { type: integer, default: 0 }
|
|
16
|
+
checks: ["stock >= 0"]
|
|
17
|
+
uiSchema: { list: { primaryField: name, columns: [sku, stock] } }
|
|
18
|
+
uniqueIndexes: [[sku]]
|
|
19
|
+
searchableFields: [name, sku]
|
|
20
|
+
---
|
|
21
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
22
|
+
kind: Schema
|
|
23
|
+
metadata: { name: orders }
|
|
24
|
+
spec:
|
|
25
|
+
title: Orders
|
|
26
|
+
lifecycle: operational
|
|
27
|
+
scope: { owner: auth.uid() }
|
|
28
|
+
uiSchema: { list: { primaryField: itemId, columns: [qty, orderStatus] } }
|
|
29
|
+
indexes: [[owner]]
|
|
30
|
+
schema:
|
|
31
|
+
type: object
|
|
32
|
+
required: [owner, itemId, qty, orderStatus]
|
|
33
|
+
properties:
|
|
34
|
+
owner: { type: string }
|
|
35
|
+
itemId: { type: string }
|
|
36
|
+
qty: { type: integer, minimum: 1 }
|
|
37
|
+
orderStatus: { type: string, enum: [placed, cancelled] }
|
|
38
|
+
placedAt: { type: string, format: date-time }
|
|
39
|
+
---
|
|
40
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
41
|
+
kind: Schema
|
|
42
|
+
metadata: { name: activity }
|
|
43
|
+
spec:
|
|
44
|
+
title: Activity
|
|
45
|
+
lifecycle: operational
|
|
46
|
+
schema:
|
|
47
|
+
type: object
|
|
48
|
+
required: [kind, subject]
|
|
49
|
+
properties:
|
|
50
|
+
kind: { type: string }
|
|
51
|
+
subject: { type: string }
|
|
52
|
+
detail: { type: string }
|
|
53
|
+
---
|
|
54
|
+
# Views are one SELECT; `input` is their parameters.
|
|
55
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
56
|
+
kind: View
|
|
57
|
+
metadata: { name: catalog }
|
|
58
|
+
spec:
|
|
59
|
+
surface: public
|
|
60
|
+
sql: SELECT id, sku, name, priceCents, stock FROM items ORDER BY name
|
|
61
|
+
---
|
|
62
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
63
|
+
kind: View
|
|
64
|
+
metadata: { name: search-items }
|
|
65
|
+
spec:
|
|
66
|
+
surface: public
|
|
67
|
+
input: { type: object, required: [q], properties: { q: { type: string, minLength: 1 } } }
|
|
68
|
+
sql: |
|
|
69
|
+
SELECT i.id, i.name, i.stock FROM items i
|
|
70
|
+
WHERE mantle.search(i, input.q)
|
|
71
|
+
ORDER BY mantle.search_rank(i), i.name
|
|
72
|
+
---
|
|
73
|
+
# Scope is injected into every Schema reference: this join only ever sees the caller's orders.
|
|
74
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
75
|
+
kind: View
|
|
76
|
+
metadata: { name: my-orders }
|
|
77
|
+
spec:
|
|
78
|
+
surface: public
|
|
79
|
+
requires: { auth: { all: [ctx.user] } }
|
|
80
|
+
sql: |
|
|
81
|
+
SELECT o.id, o.qty, o.orderStatus, i.name AS item, o.version
|
|
82
|
+
FROM orders o JOIN items i ON i.id = o.itemId
|
|
83
|
+
ORDER BY o.created_at DESC
|
|
84
|
+
---
|
|
85
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
86
|
+
kind: View
|
|
87
|
+
metadata: { name: sales-by-item }
|
|
88
|
+
spec:
|
|
89
|
+
surface: staff
|
|
90
|
+
requires: { auth: { all: [{ ctx.staff: [owner, editor] }] } }
|
|
91
|
+
sql: |
|
|
92
|
+
SELECT i.name, count(o.id) AS orders, coalesce(sum(o.qty), 0) AS units
|
|
93
|
+
FROM items i LEFT JOIN orders o ON o.itemId = i.id AND o.orderStatus = 'placed'
|
|
94
|
+
GROUP BY i.name
|
|
95
|
+
ORDER BY units DESC, i.name
|
|
96
|
+
---
|
|
97
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
98
|
+
kind: View
|
|
99
|
+
metadata: { name: recent-activity }
|
|
100
|
+
spec:
|
|
101
|
+
surface: staff
|
|
102
|
+
requires: { auth: { all: [{ ctx.staff: [owner, editor] }] } }
|
|
103
|
+
sql: SELECT kind, subject, detail FROM activity ORDER BY created_at DESC LIMIT 50
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# A Procedure written as SQL: its statements apply together or not at all. The order is written
|
|
2
|
+
# first, so when the stock check on items fails the second statement, the order is rolled back too.
|
|
3
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
4
|
+
kind: Procedure
|
|
5
|
+
metadata: { name: place-order }
|
|
6
|
+
spec:
|
|
7
|
+
title: Place an order
|
|
8
|
+
description: Order one item for the signed-in caller; the stock check fails the whole order when stock runs out.
|
|
9
|
+
requires: { auth: { all: [ctx.user] } }
|
|
10
|
+
input:
|
|
11
|
+
type: object
|
|
12
|
+
required: [itemId, qty]
|
|
13
|
+
properties:
|
|
14
|
+
itemId: { type: string }
|
|
15
|
+
qty: { type: integer, minimum: 1 }
|
|
16
|
+
output: { type: object }
|
|
17
|
+
handler:
|
|
18
|
+
sql: |
|
|
19
|
+
INSERT INTO orders (itemId, qty, orderStatus, placedAt)
|
|
20
|
+
SELECT id, input.qty, 'placed', now() FROM items WHERE id = input.itemId
|
|
21
|
+
RETURNING id, qty, orderStatus;
|
|
22
|
+
UPDATE items SET stock = stock - input.qty WHERE id = input.itemId
|
|
23
|
+
---
|
|
24
|
+
# Optimistic concurrency: the caller sends the version it saw.
|
|
25
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
26
|
+
kind: Procedure
|
|
27
|
+
metadata: { name: cancel-order }
|
|
28
|
+
spec:
|
|
29
|
+
title: Cancel an order
|
|
30
|
+
requires: { auth: { all: [ctx.user] } }
|
|
31
|
+
input:
|
|
32
|
+
type: object
|
|
33
|
+
required: [orderId, expectedVersion]
|
|
34
|
+
properties:
|
|
35
|
+
orderId: { type: string }
|
|
36
|
+
expectedVersion: { type: integer }
|
|
37
|
+
output: { type: object }
|
|
38
|
+
handler: { ref: cancelOrder }
|
|
39
|
+
---
|
|
40
|
+
# An upsert keyed by a unique index.
|
|
41
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
42
|
+
kind: Procedure
|
|
43
|
+
metadata: { name: restock }
|
|
44
|
+
spec:
|
|
45
|
+
title: Restock an item
|
|
46
|
+
description: Add stock to an item by SKU, creating the item if it is new.
|
|
47
|
+
requires: { auth: { all: [{ ctx.staff: [owner, editor] }] } }
|
|
48
|
+
input:
|
|
49
|
+
type: object
|
|
50
|
+
required: [sku, name, qty]
|
|
51
|
+
properties:
|
|
52
|
+
sku: { type: string }
|
|
53
|
+
name: { type: string }
|
|
54
|
+
qty: { type: integer, minimum: 1 }
|
|
55
|
+
output: { type: object }
|
|
56
|
+
handler:
|
|
57
|
+
sql: |
|
|
58
|
+
INSERT INTO items (sku, name, stock) VALUES (input.sku, input.name, input.qty)
|
|
59
|
+
ON CONFLICT (sku) DO UPDATE SET stock = items.stock + EXCLUDED.stock
|
|
60
|
+
RETURNING id, sku, stock
|
|
61
|
+
---
|
|
62
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
63
|
+
kind: Procedure
|
|
64
|
+
metadata: { name: record-orders }
|
|
65
|
+
spec:
|
|
66
|
+
input: { type: object }
|
|
67
|
+
output: { type: object }
|
|
68
|
+
handler: { ref: recordOrders }
|
|
69
|
+
---
|
|
70
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
71
|
+
kind: Procedure
|
|
72
|
+
metadata: { name: weekly-digest }
|
|
73
|
+
spec:
|
|
74
|
+
input: { type: object }
|
|
75
|
+
output: { type: object }
|
|
76
|
+
handler: { ref: weeklyDigest }
|
|
77
|
+
---
|
|
78
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
79
|
+
kind: Trigger
|
|
80
|
+
metadata: { name: place-order-http }
|
|
81
|
+
spec:
|
|
82
|
+
source: { kind: http, method: POST, path: /api/orders }
|
|
83
|
+
target: { procedure: place-order }
|
|
84
|
+
---
|
|
85
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
86
|
+
kind: Trigger
|
|
87
|
+
metadata: { name: place-order-mcp }
|
|
88
|
+
spec:
|
|
89
|
+
source: { kind: mcp, surface: public }
|
|
90
|
+
target: { procedure: place-order }
|
|
91
|
+
---
|
|
92
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
93
|
+
kind: Trigger
|
|
94
|
+
metadata: { name: cancel-order-http }
|
|
95
|
+
spec:
|
|
96
|
+
source: { kind: http, method: POST, path: /api/orders/cancel }
|
|
97
|
+
target: { procedure: cancel-order }
|
|
98
|
+
---
|
|
99
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
100
|
+
kind: Trigger
|
|
101
|
+
metadata: { name: restock-mcp }
|
|
102
|
+
spec:
|
|
103
|
+
source: { kind: mcp, surface: staff }
|
|
104
|
+
target: { procedure: restock }
|
|
105
|
+
---
|
|
106
|
+
# After hooks get every row one statement touched.
|
|
107
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
108
|
+
kind: Trigger
|
|
109
|
+
metadata: { name: orders-recorded }
|
|
110
|
+
spec:
|
|
111
|
+
source: { kind: lifecycle, schema: orders, on: [after_create, after_update] }
|
|
112
|
+
target: { procedure: record-orders }
|
|
113
|
+
---
|
|
114
|
+
# POSIX cron, UTC: Sundays at 03:00.
|
|
115
|
+
apiVersion: cms.mantle.aotter.net/v2
|
|
116
|
+
kind: Trigger
|
|
117
|
+
metadata: { name: weekly-digest }
|
|
118
|
+
spec:
|
|
119
|
+
source: { kind: schedule, cron: "0 3 * * 0" }
|
|
120
|
+
target: { procedure: weekly-digest }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "version": 2, "identity": "mantle", "features": ["mcp", "admin", "web"] }
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mantle-reference-service",
|
|
3
|
+
"private": true,
|
|
4
|
+
"type": "module",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"generate": "mantle generate",
|
|
7
|
+
"dev": "wrangler dev --local --ip 127.0.0.1 --port 8787",
|
|
8
|
+
"check": "mantle generate && mantle generate --check && tsc --noEmit && node smoke.mjs"
|
|
9
|
+
},
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"@aotter/mantle": "0.2.0-alpha.1",
|
|
12
|
+
"@aotter/mantle-ui": "0.2.0-alpha.1",
|
|
13
|
+
"@better-auth/cimd": "1.7.2",
|
|
14
|
+
"@better-auth/mcp": "1.7.2",
|
|
15
|
+
"@better-auth/oauth-provider": "1.7.2",
|
|
16
|
+
"@modelcontextprotocol/ext-apps": "2.0.0",
|
|
17
|
+
"@modelcontextprotocol/server": "2.1.0",
|
|
18
|
+
"better-auth": "1.7.2"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@cloudflare/workers-types": "5.20260904.1",
|
|
22
|
+
"@types/node": "^26",
|
|
23
|
+
"typescript": "^6.0.3",
|
|
24
|
+
"wrangler": "4.129.0"
|
|
25
|
+
},
|
|
26
|
+
"packageManager": "pnpm@9.15.0"
|
|
27
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
// Runs the service under `wrangler dev` on a fresh local D1 and drives it the way people and agents would: console email-OTP
|
|
2
|
+
// sign-in, REST, both MCP surfaces, Admin's API and a cron. Each step asserts what the manifests promise.
|
|
3
|
+
import assert from "node:assert/strict";
|
|
4
|
+
import { spawn } from "node:child_process";
|
|
5
|
+
import { mkdtempSync, readFileSync, rmSync } from "node:fs";
|
|
6
|
+
import { tmpdir } from "node:os";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
|
|
9
|
+
const port = 18000 + Math.floor(Math.random() * 1000);
|
|
10
|
+
const origin = `http://127.0.0.1:${port}`;
|
|
11
|
+
const owner = "owner@example.test";
|
|
12
|
+
const state = mkdtempSync(join(tmpdir(), "mantle-reference-"));
|
|
13
|
+
const wrangler = spawn("pnpm", ["exec", "wrangler", "dev", "--local", "--ip", "127.0.0.1", "--port", String(port), "--inspector-port", "0",
|
|
14
|
+
"--persist-to", state, "--test-scheduled",
|
|
15
|
+
"--var", `PUBLIC_ORIGIN:${origin}`, "--var", `ADMIN_EMAIL:${owner}`, "--var", "BETTER_AUTH_SECRET:reference-smoke-secret-0123456789abcdef"],
|
|
16
|
+
// its own process group: pnpm does not pass a signal on to wrangler and workerd, so the group is stopped as one
|
|
17
|
+
{ env: { ...process.env, WRANGLER_SEND_METRICS: "false", CI: "1" }, stdio: ["ignore", "pipe", "pipe"], detached: true });
|
|
18
|
+
let logs = "";
|
|
19
|
+
wrangler.stdout.on("data", (chunk) => { logs += chunk; });
|
|
20
|
+
wrangler.stderr.on("data", (chunk) => { logs += chunk; });
|
|
21
|
+
|
|
22
|
+
const json = { "content-type": "application/json", origin };
|
|
23
|
+
const call = async (method, path, { cookie, body } = {}) => {
|
|
24
|
+
const response = await fetch(`${origin}${path}`, { method, headers: { ...json, ...(cookie ? { cookie } : {}) }, ...(body === undefined ? {} : { body: JSON.stringify(body) }) });
|
|
25
|
+
const text = await response.text();
|
|
26
|
+
return { status: response.status, body: text ? JSON.parse(text) : null, headers: response.headers };
|
|
27
|
+
};
|
|
28
|
+
const mcp = async (path, cookie, name, args) => {
|
|
29
|
+
const response = await fetch(`${origin}${path}`, { method: "POST", headers: { ...json, accept: "application/json, text/event-stream", ...(cookie ? { cookie } : {}) },
|
|
30
|
+
body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: name ? "tools/call" : "tools/list", params: name ? { name, arguments: args } : {} }) });
|
|
31
|
+
const text = await response.text();
|
|
32
|
+
const data = text.split("\n").find((line) => line.startsWith("data:"));
|
|
33
|
+
return { status: response.status, body: data ? JSON.parse(data.slice(5)) : text ? JSON.parse(text) : null };
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
/** Console email OTP: ask for a code, read it from the wrangler log as a developer would, sign in. */
|
|
37
|
+
async function signIn(email) {
|
|
38
|
+
const before = logs.length;
|
|
39
|
+
assert.equal((await call("POST", "/api/auth/email-otp/send-verification-otp", { body: { email, type: "sign-in" } })).status, 200);
|
|
40
|
+
let code;
|
|
41
|
+
for (let i = 0; i < 40 && !code; i++) {
|
|
42
|
+
code = new RegExp(`${email.replace(/[.+]/g, "\\$&")}[\\s\\S]*?one-time code is (\\d{6})`).exec(logs.slice(before))?.[1];
|
|
43
|
+
if (!code) await new Promise((resolve) => setTimeout(resolve, 100));
|
|
44
|
+
}
|
|
45
|
+
assert.ok(code, `no one-time code for ${email} in the log`);
|
|
46
|
+
const signed = await call("POST", "/api/auth/sign-in/email-otp", { body: { email, otp: code } });
|
|
47
|
+
assert.equal(signed.status, 200, JSON.stringify(signed.body));
|
|
48
|
+
return signed.headers.getSetCookie().map((c) => c.split(";")[0]).join("; ");
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const stockOf = async () => (await call("GET", "/api/views/catalog")).body.rows[0].stock;
|
|
52
|
+
const step = (name) => console.log(`ok - ${name}`);
|
|
53
|
+
|
|
54
|
+
try {
|
|
55
|
+
for (let attempt = 0; ; attempt++) {
|
|
56
|
+
if (wrangler.exitCode !== null) throw new Error(`wrangler exited ${wrangler.exitCode}`);
|
|
57
|
+
try { if ((await fetch(`${origin}/api/views/catalog`)).status === 200) break; } catch { /* starting */ }
|
|
58
|
+
if (attempt > 240) throw new Error("the Worker did not start");
|
|
59
|
+
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
60
|
+
}
|
|
61
|
+
assert.deepEqual((await call("GET", "/api/views/catalog")).body.rows, []);
|
|
62
|
+
step("boot converges a fresh D1 to the plan; the public catalog is empty");
|
|
63
|
+
|
|
64
|
+
const staff = await signIn(owner);
|
|
65
|
+
assert.equal((await call("GET", "/admin/api/me", { cookie: staff })).body.role, "owner");
|
|
66
|
+
step("console email OTP signs in; ADMIN_EMAIL becomes the owner");
|
|
67
|
+
|
|
68
|
+
for (const qty of [5, 3]) {
|
|
69
|
+
const restocked = await mcp("/mcp/staff", staff, "restock", { sku: "TEA-1", name: "Oolong tea", qty });
|
|
70
|
+
assert.equal(restocked.body.result.isError, undefined, JSON.stringify(restocked.body));
|
|
71
|
+
}
|
|
72
|
+
assert.equal(await stockOf(), 8);
|
|
73
|
+
step("staff MCP: restock is an upsert on the unique sku (5 + 3)");
|
|
74
|
+
|
|
75
|
+
const itemId = (await call("GET", "/api/views/catalog")).body.rows[0].id;
|
|
76
|
+
assert.equal((await call("POST", "/api/orders", { body: { itemId, qty: 1 } })).status, 401);
|
|
77
|
+
step("an anonymous order is 401");
|
|
78
|
+
|
|
79
|
+
const buyer = await signIn("buyer@example.test");
|
|
80
|
+
assert.equal((await call("GET", "/admin/api/me", { cookie: buyer })).status, 403);
|
|
81
|
+
const placed = await call("POST", "/api/orders", { cookie: buyer, body: { itemId, qty: 2 } });
|
|
82
|
+
assert.equal(placed.status, 200, JSON.stringify(placed.body));
|
|
83
|
+
assert.equal(await stockOf(), 6);
|
|
84
|
+
step("a signed-in buyer (not staff) orders 2: stock 8 -> 6 in one program");
|
|
85
|
+
|
|
86
|
+
const tooMany = await call("POST", "/api/orders", { cookie: buyer, body: { itemId, qty: 99 } });
|
|
87
|
+
assert.equal(tooMany.status, 400, JSON.stringify(tooMany.body));
|
|
88
|
+
assert.match(tooMany.body.error.message, /CHECK items: stock >= 0/);
|
|
89
|
+
assert.equal(await stockOf(), 6);
|
|
90
|
+
step("ordering 99 fails the stock >= 0 check in the second statement, and the order the first wrote is rolled back");
|
|
91
|
+
|
|
92
|
+
const mine = (await call("GET", "/api/views/my-orders", { cookie: buyer })).body.rows;
|
|
93
|
+
assert.deepEqual(mine.map(({ qty, orderStatus, item }) => ({ qty, orderStatus, item })), [{ qty: 2, orderStatus: "placed", item: "Oolong tea" }]);
|
|
94
|
+
assert.deepEqual((await call("GET", "/api/views/my-orders", { cookie: staff })).body.rows, []);
|
|
95
|
+
step("my-orders joins items and shows only the caller's own orders (scope)");
|
|
96
|
+
|
|
97
|
+
const order = mine[0];
|
|
98
|
+
assert.equal((await call("POST", "/api/orders/cancel", { cookie: staff, body: { orderId: order.id, expectedVersion: order.version } })).status, 409);
|
|
99
|
+
const cancelled = await call("POST", "/api/orders/cancel", { cookie: buyer, body: { orderId: order.id, expectedVersion: order.version } });
|
|
100
|
+
assert.equal(cancelled.status, 200, JSON.stringify(cancelled.body));
|
|
101
|
+
assert.equal(await stockOf(), 8);
|
|
102
|
+
assert.equal((await call("POST", "/api/orders/cancel", { cookie: buyer, body: { orderId: order.id, expectedVersion: order.version } })).status, 409);
|
|
103
|
+
step("cancel: another owner's order is a CONFLICT, the owner's returns the stock, a stale version is a CONFLICT");
|
|
104
|
+
|
|
105
|
+
assert.deepEqual((await call("GET", "/api/views/search-items?q=oolong")).body.rows.map((r) => r.name), ["Oolong tea"]);
|
|
106
|
+
step("search-items: mantle.search over searchableFields");
|
|
107
|
+
|
|
108
|
+
const sales = await call("GET", "/admin/api/views/sales-by-item", { cookie: staff });
|
|
109
|
+
assert.deepEqual(sales.body.rows, [{ name: "Oolong tea", orders: 0, units: 0 }], JSON.stringify(sales.body));
|
|
110
|
+
assert.equal((await call("GET", "/admin/api/views/sales-by-item", { cookie: buyer })).status, 403);
|
|
111
|
+
step("sales-by-item (GROUP BY over a LEFT JOIN) is staff-only through Admin's API");
|
|
112
|
+
|
|
113
|
+
// the console: @aotter/mantle-ui/admin served by Admin at /admin, its assets by name, any other path its client-side route
|
|
114
|
+
const shell = await fetch(`${origin}/admin/c/items`);
|
|
115
|
+
const html = await shell.text();
|
|
116
|
+
const script = /src="(\/admin\/assets\/[^"]+\.js)"/.exec(html)?.[1];
|
|
117
|
+
assert.equal(shell.headers.get("x-frame-options"), "DENY");
|
|
118
|
+
assert.ok(script, html.slice(0, 300));
|
|
119
|
+
assert.equal((await fetch(`${origin}${script}`)).status, 200);
|
|
120
|
+
assert.equal((await fetch(`${origin}/admin/assets/missing.js`)).status, 404);
|
|
121
|
+
// the editor's round trip: it reads the whole entry and writes it back, an unset optional field included as null
|
|
122
|
+
const [tea] = (await call("GET", "/admin/api/entries?collection=items", { cookie: staff })).body.items;
|
|
123
|
+
assert.deepEqual(tea.data_preview, { name: "Oolong tea", sku: "TEA-1", stock: 8 });
|
|
124
|
+
const { entry } = (await call("GET", `/admin/api/entries/${tea.id}?collection=items`, { cookie: staff })).body;
|
|
125
|
+
const saved = await call("PATCH", `/admin/api/entries/${tea.id}?collection=items`, { cookie: staff, body: { expectedVersion: entry.version, data: { ...entry.data, name: "Oolong tea (Taiwan)", priceCents: null } } });
|
|
126
|
+
assert.equal(saved.status, 200, JSON.stringify(saved.body));
|
|
127
|
+
assert.equal((await call("GET", "/api/views/catalog")).body.rows[0].name, "Oolong tea (Taiwan)");
|
|
128
|
+
step("Admin's console: the SPA and its assets at /admin, the list's declared columns, and an editor's save of the whole entry");
|
|
129
|
+
|
|
130
|
+
const tools = (await mcp("/mcp", undefined)).body.result.tools.map((t) => t.name);
|
|
131
|
+
assert.ok(tools.includes("place_order") && !tools.includes("restock"), tools.join());
|
|
132
|
+
step("public MCP lists place_order and not the staff restock");
|
|
133
|
+
|
|
134
|
+
assert.equal((await fetch(`${origin}/__scheduled?cron=${encodeURIComponent("0 3 * * 1")}`)).status, 200);
|
|
135
|
+
const activity = (await call("GET", "/admin/api/views/recent-activity", { cookie: staff })).body.rows;
|
|
136
|
+
assert.deepEqual(activity.map((r) => r.kind).sort(), ["after_create", "after_update", "weekly-digest"]);
|
|
137
|
+
// the one order was cancelled, and the digest counts placed orders only
|
|
138
|
+
assert.equal(activity.find((r) => r.kind === "weekly-digest").detail, "0 orders, 0 units");
|
|
139
|
+
step("the after hooks recorded the order rows, and Cloudflare's Monday-numbered cron ran the POSIX Sunday digest");
|
|
140
|
+
|
|
141
|
+
const version = JSON.parse(readFileSync("node_modules/@aotter/mantle/package.json", "utf8")).version;
|
|
142
|
+
console.log(`Mantle ${version}: reference service passed`);
|
|
143
|
+
} catch (error) {
|
|
144
|
+
console.error(logs.slice(-4000));
|
|
145
|
+
throw error;
|
|
146
|
+
} finally {
|
|
147
|
+
const stop = (signal) => { try { process.kill(-wrangler.pid, signal); } catch { /* already gone */ } };
|
|
148
|
+
stop("SIGTERM");
|
|
149
|
+
await new Promise((resolve) => {
|
|
150
|
+
if (wrangler.exitCode !== null) return resolve();
|
|
151
|
+
const timer = setTimeout(() => { stop("SIGKILL"); resolve(); }, 5_000);
|
|
152
|
+
wrangler.once("exit", () => { clearTimeout(timer); resolve(); });
|
|
153
|
+
});
|
|
154
|
+
stop("SIGKILL");
|
|
155
|
+
rmSync(state, { recursive: true, force: true });
|
|
156
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Written once by `mantle generate`, then filled in. `MantleHandlers` lists exactly the plan's handler refs.
|
|
2
|
+
import type { MantleHandlers } from "../.mantle/generated/mantle.js";
|
|
3
|
+
|
|
4
|
+
export const handlers: MantleHandlers = {
|
|
5
|
+
// ctx.store is scoped to the caller: another owner's order is not visible, so the write below is a CONFLICT, never a leak
|
|
6
|
+
cancelOrder: async ({ orderId, expectedVersion }, ctx) => {
|
|
7
|
+
const [order] = (await ctx.store.select({ from: "orders", where: { id: orderId, orderStatus: "placed" } })).rows;
|
|
8
|
+
const [item] = order ? (await ctx.store.select({ from: "items", where: { id: String(order.itemId) } })).rows : [];
|
|
9
|
+
await ctx.store.write([
|
|
10
|
+
{ update: "orders", set: { orderStatus: "cancelled" }, where: { id: orderId }, lock: expectedVersion },
|
|
11
|
+
// both rows or neither: the stock goes back only with the cancellation, and a concurrent restock is a CONFLICT
|
|
12
|
+
...(order && item ? [{ update: "items" as const, set: { stock: Number(item.stock) + Number(order.qty) }, where: { id: String(item.id) }, lock: Number(item.version) }] : []),
|
|
13
|
+
]);
|
|
14
|
+
return { id: orderId, orderStatus: "cancelled" };
|
|
15
|
+
},
|
|
16
|
+
|
|
17
|
+
// an after hook gets every row the statement touched: loop, never rows[0]
|
|
18
|
+
recordOrders: async (_input, ctx) => {
|
|
19
|
+
const cause = ctx.cause;
|
|
20
|
+
if (cause.kind !== "lifecycle") return {};
|
|
21
|
+
await ctx.store.write(cause.rows.map((row) => ({
|
|
22
|
+
insert: "activity" as const,
|
|
23
|
+
values: { kind: cause.hook, subject: String(row.id), detail: `${String(row.orderStatus)} x${String(row.qty)}` },
|
|
24
|
+
})));
|
|
25
|
+
return {};
|
|
26
|
+
},
|
|
27
|
+
|
|
28
|
+
// a schedule runs as the system caller: no scope, and no requires.auth predicate holds for it. One page of up to 500 orders
|
|
29
|
+
// keeps the example short; a digest over more would page with nextCursor.
|
|
30
|
+
weeklyDigest: async (_input, ctx) => {
|
|
31
|
+
const { rows } = await ctx.store.select({ from: "orders", columns: ["qty"], where: { orderStatus: "placed" }, limit: 500 });
|
|
32
|
+
const units = rows.reduce((sum, row) => sum + Number(row.qty), 0);
|
|
33
|
+
await ctx.store.write([{ insert: "activity", values: { kind: "weekly-digest", subject: String(ctx.cause.kind === "schedule" ? ctx.cause.scheduledTime : ""), detail: `${rows.length} orders, ${units} units` } }]);
|
|
34
|
+
return {};
|
|
35
|
+
},
|
|
36
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// Written once by `mantle generate`; this file is yours now. The Cloudflare entry (ADR-0032 decision 6).
|
|
2
|
+
import { waitUntil } from "cloudflare:workers";
|
|
3
|
+
import { toCloudflareCron } from "@aotter/mantle/cloudflare";
|
|
4
|
+
import { plan } from "../.mantle/generated/mantle.js";
|
|
5
|
+
import { mantle, type Env } from "./service.js";
|
|
6
|
+
|
|
7
|
+
// Cloudflare names a cron as wrangler.jsonc spells it; the plan's schedule Triggers are POSIX, and several spellings can share one
|
|
8
|
+
const crons = new Map<string, string[]>();
|
|
9
|
+
for (const t of Object.values(plan.triggers)) {
|
|
10
|
+
if (t.source.kind !== "schedule" || t.source.enabled === false) continue;
|
|
11
|
+
const cf = toCloudflareCron(t.source.cron);
|
|
12
|
+
const posix = crons.get(cf) ?? [];
|
|
13
|
+
if (!posix.includes(t.source.cron)) crons.set(cf, [...posix, t.source.cron]);
|
|
14
|
+
}
|
|
15
|
+
// not bound to one request, so a handler's ctx.waitUntil never lands on another request's finished context
|
|
16
|
+
const ctx = { waitUntil };
|
|
17
|
+
|
|
18
|
+
export default {
|
|
19
|
+
fetch: (request, env) => mantle.fetch(request, env, ctx),
|
|
20
|
+
async scheduled(controller, env) {
|
|
21
|
+
const posix = crons.get(controller.cron);
|
|
22
|
+
if (posix === undefined) throw new Error(`No schedule Trigger runs on the Cloudflare cron '${controller.cron}'`);
|
|
23
|
+
const errors: unknown[] = [];
|
|
24
|
+
for (const cron of posix) {
|
|
25
|
+
try {
|
|
26
|
+
await mantle.invokeSchedule(cron, controller.scheduledTime, env, ctx);
|
|
27
|
+
} catch (error) {
|
|
28
|
+
errors.push(error);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (errors.length) throw new AggregateError(errors, `${errors.length} cron spelling(s) failed for '${controller.cron}'`);
|
|
32
|
+
},
|
|
33
|
+
} satisfies ExportedHandler<Env>;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// Written once by `mantle generate`; this file is yours now. It composes the service (ADR-0032 decision 6).
|
|
2
|
+
import { createMantle, withCaller, type MantleRuntime, type MantleService, type Surface } from "@aotter/mantle";
|
|
3
|
+
import { createAdminSurface } from "@aotter/mantle/admin";
|
|
4
|
+
import { ConsoleEmailSender, createAuthRoutes, createCallerResolver, createMantleAuth, createSetupIncompleteAuth, type MantleAuth } from "@aotter/mantle/auth";
|
|
5
|
+
import { d1Driver, d1Storage } from "@aotter/mantle/cloudflare";
|
|
6
|
+
import { createMcpSurface, planApp } from "@aotter/mantle/mcp";
|
|
7
|
+
import { mantleAppHtml } from "@aotter/mantle-ui/mcp-app";
|
|
8
|
+
import { createRestSurface } from "@aotter/mantle/web";
|
|
9
|
+
import { plan } from "../.mantle/generated/mantle.js";
|
|
10
|
+
import { handlers } from "./handlers.js";
|
|
11
|
+
|
|
12
|
+
export interface Env {
|
|
13
|
+
readonly DB: D1Database;
|
|
14
|
+
/** The Admin SPA's files (`@aotter/mantle-ui/admin`), bound in wrangler.jsonc. */
|
|
15
|
+
readonly ASSETS: Fetcher;
|
|
16
|
+
readonly BETTER_AUTH_SECRET?: string;
|
|
17
|
+
readonly PUBLIC_ORIGIN?: string;
|
|
18
|
+
readonly ADMIN_EMAIL?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** One-time codes printed to the log are for local development: a deployed service picks its own sign-in method and sender. */
|
|
22
|
+
function createAuth(env: Env, origin: string): MantleAuth {
|
|
23
|
+
// an unset PUBLIC_ORIGIN is not local: the fallback origin below is only for URLs, never for deciding to print codes
|
|
24
|
+
const local = env.PUBLIC_ORIGIN !== undefined && /^http:\/\/(localhost|127\.0\.0\.1|\[::1\])(:\d+)?$/.test(origin);
|
|
25
|
+
if (!local || !env.BETTER_AUTH_SECRET || !env.ADMIN_EMAIL)
|
|
26
|
+
return createSetupIncompleteAuth({ message: "Sign-in is not configured: copy .dev.vars.example to .dev.vars locally, or choose a sign-in method in src/service.ts." });
|
|
27
|
+
return createMantleAuth({
|
|
28
|
+
database: env.DB, driver: d1Driver(env.DB), baseURL: origin, secret: env.BETTER_AUTH_SECRET,
|
|
29
|
+
methods: [{ kind: "email-otp", sender: new ConsoleEmailSender() }],
|
|
30
|
+
bootstrapOwner: { match: "email", value: env.ADMIN_EMAIL },
|
|
31
|
+
ipAddressHeaders: ["cf-connecting-ip"],
|
|
32
|
+
oauthProvider: { loginPage: "/admin/sign-in", consentPage: "/oauth/consent", scopes: ["mcp"], mcpResource: `${origin}/mcp` },
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** A file of the Admin SPA, or null when it has none by that path. */
|
|
37
|
+
async function adminAsset(assets: Fetcher, path: string): Promise<Response | null> {
|
|
38
|
+
const response = await assets.fetch(new URL(path, "http://assets/"));
|
|
39
|
+
return response.ok ? response : null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function mount(runtime: MantleRuntime, env: Env) {
|
|
43
|
+
const origin = env.PUBLIC_ORIGIN?.replace(/\/+$/, "") ?? "http://127.0.0.1:8787";
|
|
44
|
+
const auth = createAuth(env, origin);
|
|
45
|
+
const resolver = createCallerResolver(auth, { jwtBearer: { audience: `${origin}/mcp`, scopes: ["mcp"] } });
|
|
46
|
+
const authRoutes = createAuthRoutes(auth, { resolver });
|
|
47
|
+
const guard = (surface: Surface, options?: { resourceMetadata?: string }) => withCaller(resolver, surface, options);
|
|
48
|
+
const resourceMetadata = `${origin}/.well-known/oauth-protected-resource/mcp`;
|
|
49
|
+
const admin = guard(createAdminSurface(runtime, { basePath: "/admin", assets: (path) => adminAsset(env.ASSETS, path), identity: { directory: auth, roles: auth, deleteUser: auth.deleteUser }, site: { mcpEndpoints: { public: "/mcp", staff: "/mcp/staff" } } }));
|
|
50
|
+
const mcp = guard(createMcpSurface(runtime, { basePath: "/mcp", surface: "public", resourceMetadata }), { resourceMetadata });
|
|
51
|
+
// MCP Apps hosts render each staff View's rows, and the operations on one row, in the chat
|
|
52
|
+
const staffMcp = guard(createMcpSurface(runtime, { basePath: "/mcp/staff", surface: "staff", apps: { resources: [planApp(runtime.plan, { surface: "staff", html: mantleAppHtml })] }, resourceMetadata }), { resourceMetadata });
|
|
53
|
+
// REST answers everything else: public Views under /api/views and the plan's HTTP Triggers
|
|
54
|
+
const rest = guard(createRestSurface(runtime, { basePath: "/api" }));
|
|
55
|
+
return async (request: Request, waitUntil: (promise: Promise<unknown>) => void): Promise<Response> => {
|
|
56
|
+
const { pathname } = new URL(request.url);
|
|
57
|
+
const under = (base: string) => pathname === base || pathname.startsWith(`${base}/`);
|
|
58
|
+
// Better Auth's context is per isolate: the request that starts it waits for it, or the next one hangs on it; a failed start is mounted again
|
|
59
|
+
await auth.ready?.catch((error) => {
|
|
60
|
+
routes = undefined;
|
|
61
|
+
throw error;
|
|
62
|
+
});
|
|
63
|
+
const owned = await authRoutes(request, { waitUntil });
|
|
64
|
+
if (owned) return owned;
|
|
65
|
+
if (under("/admin")) return admin(request);
|
|
66
|
+
if (under("/mcp/staff")) return staffMcp(request);
|
|
67
|
+
if (under("/mcp")) return mcp(request);
|
|
68
|
+
return rest(request);
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
let routes: ReturnType<typeof mount> | undefined;
|
|
73
|
+
const service: MantleService<Env> = {
|
|
74
|
+
handlers,
|
|
75
|
+
fetch: (request, env, { runtime, waitUntil }) => (routes ??= mount(runtime, env))(request, waitUntil),
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export const mantle = createMantle(service, { plan, storage: (env) => d1Storage(env.DB), schedules: true });
|
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"compilerOptions": {
|
|
3
3
|
"target": "ES2022",
|
|
4
|
+
"lib": [
|
|
5
|
+
"ES2023"
|
|
6
|
+
],
|
|
4
7
|
"module": "ESNext",
|
|
5
|
-
"moduleResolution": "
|
|
8
|
+
"moduleResolution": "Bundler",
|
|
6
9
|
"strict": true,
|
|
7
10
|
"noEmit": true,
|
|
8
11
|
"skipLibCheck": true,
|
|
12
|
+
"resolveJsonModule": true,
|
|
9
13
|
"types": [
|
|
10
|
-
"@cloudflare/workers-types"
|
|
14
|
+
"@cloudflare/workers-types",
|
|
15
|
+
"node"
|
|
11
16
|
]
|
|
12
17
|
},
|
|
13
18
|
"include": [
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "node_modules/wrangler/config-schema.json",
|
|
3
|
+
"name": "mantle-reference",
|
|
4
|
+
"main": "src/index.ts",
|
|
5
|
+
"compatibility_date": "2026-09-01",
|
|
6
|
+
"compatibility_flags": [
|
|
7
|
+
"nodejs_compat"
|
|
8
|
+
],
|
|
9
|
+
"d1_databases": [
|
|
10
|
+
{
|
|
11
|
+
"binding": "DB",
|
|
12
|
+
"database_name": "mantle-reference"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"assets": {
|
|
16
|
+
"directory": "node_modules/@aotter/mantle-ui/dist/admin",
|
|
17
|
+
"binding": "ASSETS",
|
|
18
|
+
"run_worker_first": true,
|
|
19
|
+
"html_handling": "none"
|
|
20
|
+
},
|
|
21
|
+
"triggers": {
|
|
22
|
+
"crons": [
|
|
23
|
+
"0 3 * * 1"
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
}
|