@happyvertical/smrt-core 0.30.0
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/AGENTS.md +124 -0
- package/CLAUDE.md +1 -0
- package/LICENSE +7 -0
- package/README.md +265 -0
- package/bin/smrt-prebuild.js +26 -0
- package/dist/__tests__/fixtures/advisor-test-classes.d.ts +28 -0
- package/dist/__tests__/fixtures/advisor-test-classes.d.ts.map +1 -0
- package/dist/__tests__/fixtures/collection-coverage-fixtures.d.ts +12 -0
- package/dist/__tests__/fixtures/collection-coverage-fixtures.d.ts.map +1 -0
- package/dist/__tests__/fixtures/inheritance-resolver-fixtures.d.ts +28 -0
- package/dist/__tests__/fixtures/inheritance-resolver-fixtures.d.ts.map +1 -0
- package/dist/__tests__/fixtures/inheritance-test-classes.d.ts +43 -0
- package/dist/__tests__/fixtures/inheritance-test-classes.d.ts.map +1 -0
- package/dist/__tests__/fixtures/mcp-integration-test-classes.d.ts +18 -0
- package/dist/__tests__/fixtures/mcp-integration-test-classes.d.ts.map +1 -0
- package/dist/__tests__/fixtures/object-ai-memory-fixtures.d.ts +15 -0
- package/dist/__tests__/fixtures/object-ai-memory-fixtures.d.ts.map +1 -0
- package/dist/__tests__/fixtures/object-spec-test-classes.d.ts +13 -0
- package/dist/__tests__/fixtures/object-spec-test-classes.d.ts.map +1 -0
- package/dist/__tests__/fixtures/registry-test-classes.d.ts +23 -0
- package/dist/__tests__/fixtures/registry-test-classes.d.ts.map +1 -0
- package/dist/adapters/ai-usage.d.ts +23 -0
- package/dist/adapters/ai-usage.d.ts.map +1 -0
- package/dist/adapters/ai-usage.js +105 -0
- package/dist/adapters/ai-usage.js.map +1 -0
- package/dist/adapters/cost-rates.d.ts +20 -0
- package/dist/adapters/cost-rates.d.ts.map +1 -0
- package/dist/adapters/cost-rates.js +40 -0
- package/dist/adapters/cost-rates.js.map +1 -0
- package/dist/adapters/index.d.ts +19 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/metrics.d.ts +111 -0
- package/dist/adapters/metrics.d.ts.map +1 -0
- package/dist/adapters/metrics.js +169 -0
- package/dist/adapters/metrics.js.map +1 -0
- package/dist/adapters/pubsub.d.ts +124 -0
- package/dist/adapters/pubsub.d.ts.map +1 -0
- package/dist/adapters/pubsub.js +121 -0
- package/dist/adapters/pubsub.js.map +1 -0
- package/dist/browser.d.ts +32 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +68 -0
- package/dist/browser.js.map +1 -0
- package/dist/child-accessors.d.ts +27 -0
- package/dist/child-accessors.d.ts.map +1 -0
- package/dist/child-accessors.js +35 -0
- package/dist/child-accessors.js.map +1 -0
- package/dist/class.d.ts +313 -0
- package/dist/class.d.ts.map +1 -0
- package/dist/class.js +896 -0
- package/dist/class.js.map +1 -0
- package/dist/collection-cache.d.ts +110 -0
- package/dist/collection-cache.d.ts.map +1 -0
- package/dist/collection-cache.js +187 -0
- package/dist/collection-cache.js.map +1 -0
- package/dist/collection.d.ts +894 -0
- package/dist/collection.d.ts.map +1 -0
- package/dist/collection.js +1987 -0
- package/dist/collection.js.map +1 -0
- package/dist/config/global-config.d.ts +3 -0
- package/dist/config/global-config.d.ts.map +1 -0
- package/dist/config/global-config.js +19 -0
- package/dist/config/global-config.js.map +1 -0
- package/dist/config.d.ts +145 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +57 -0
- package/dist/config.js.map +1 -0
- package/dist/consumer-plugin/index.d.ts +22 -0
- package/dist/consumer-plugin/index.d.ts.map +1 -0
- package/dist/consumer-plugin/index.js +452 -0
- package/dist/consumer-plugin/index.js.map +1 -0
- package/dist/consumer-plugin.d.ts +8 -0
- package/dist/consumer-plugin.d.ts.map +1 -0
- package/dist/consumer-plugin.js +5 -0
- package/dist/consumer-plugin.js.map +1 -0
- package/dist/database.d.ts +95 -0
- package/dist/database.d.ts.map +1 -0
- package/dist/database.js +32 -0
- package/dist/database.js.map +1 -0
- package/dist/decorators/compatibility.d.ts +14 -0
- package/dist/decorators/compatibility.d.ts.map +1 -0
- package/dist/decorators/compatibility.js +111 -0
- package/dist/decorators/compatibility.js.map +1 -0
- package/dist/decorators/index.d.ts +381 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/dist/decorators/index.js +104 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/dispatch/bus.d.ts +306 -0
- package/dist/dispatch/bus.d.ts.map +1 -0
- package/dist/dispatch/bus.js +583 -0
- package/dist/dispatch/bus.js.map +1 -0
- package/dist/dispatch/collections/DispatchSubscriptions.d.ts +79 -0
- package/dist/dispatch/collections/DispatchSubscriptions.d.ts.map +1 -0
- package/dist/dispatch/collections/DispatchSubscriptions.js +243 -0
- package/dist/dispatch/collections/DispatchSubscriptions.js.map +1 -0
- package/dist/dispatch/collections/Dispatches.d.ts +98 -0
- package/dist/dispatch/collections/Dispatches.d.ts.map +1 -0
- package/dist/dispatch/collections/Dispatches.js +358 -0
- package/dist/dispatch/collections/Dispatches.js.map +1 -0
- package/dist/dispatch/index.d.ts +47 -0
- package/dist/dispatch/index.d.ts.map +1 -0
- package/dist/dispatch/models/Dispatch.d.ts +101 -0
- package/dist/dispatch/models/Dispatch.d.ts.map +1 -0
- package/dist/dispatch/models/Dispatch.js +162 -0
- package/dist/dispatch/models/Dispatch.js.map +1 -0
- package/dist/dispatch/models/DispatchSubscription.d.ts +83 -0
- package/dist/dispatch/models/DispatchSubscription.d.ts.map +1 -0
- package/dist/dispatch/models/DispatchSubscription.js +112 -0
- package/dist/dispatch/models/DispatchSubscription.js.map +1 -0
- package/dist/dispatch/tenant-resolver.d.ts +98 -0
- package/dist/dispatch/tenant-resolver.d.ts.map +1 -0
- package/dist/dispatch/tenant-resolver.js +32 -0
- package/dist/dispatch/tenant-resolver.js.map +1 -0
- package/dist/dispatch/types.d.ts +149 -0
- package/dist/dispatch/types.d.ts.map +1 -0
- package/dist/embeddings/hash.d.ts +33 -0
- package/dist/embeddings/hash.d.ts.map +1 -0
- package/dist/embeddings/hash.js +37 -0
- package/dist/embeddings/hash.js.map +1 -0
- package/dist/embeddings/index.d.ts +36 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/provider.d.ts +75 -0
- package/dist/embeddings/provider.d.ts.map +1 -0
- package/dist/embeddings/provider.js +170 -0
- package/dist/embeddings/provider.js.map +1 -0
- package/dist/embeddings/similarity.d.ts +47 -0
- package/dist/embeddings/similarity.d.ts.map +1 -0
- package/dist/embeddings/similarity.js +64 -0
- package/dist/embeddings/similarity.js.map +1 -0
- package/dist/embeddings/storage.d.ts +125 -0
- package/dist/embeddings/storage.d.ts.map +1 -0
- package/dist/embeddings/storage.js +283 -0
- package/dist/embeddings/storage.js.map +1 -0
- package/dist/embeddings/types.d.ts +250 -0
- package/dist/embeddings/types.d.ts.map +1 -0
- package/dist/errors.d.ts +363 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +669 -0
- package/dist/errors.js.map +1 -0
- package/dist/generators/cli.d.ts +162 -0
- package/dist/generators/cli.d.ts.map +1 -0
- package/dist/generators/cli.js +462 -0
- package/dist/generators/cli.js.map +1 -0
- package/dist/generators/index.d.ts +13 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/mcp-runtime-template.d.ts +60 -0
- package/dist/generators/mcp-runtime-template.d.ts.map +1 -0
- package/dist/generators/mcp-runtime-template.js +509 -0
- package/dist/generators/mcp-runtime-template.js.map +1 -0
- package/dist/generators/mcp.d.ts +231 -0
- package/dist/generators/mcp.d.ts.map +1 -0
- package/dist/generators/mcp.js +1220 -0
- package/dist/generators/mcp.js.map +1 -0
- package/dist/generators/rest.d.ts +171 -0
- package/dist/generators/rest.d.ts.map +1 -0
- package/dist/generators/rest.js +591 -0
- package/dist/generators/rest.js.map +1 -0
- package/dist/generators/swagger.d.ts +21 -0
- package/dist/generators/swagger.d.ts.map +1 -0
- package/dist/generators/swagger.js +307 -0
- package/dist/generators/swagger.js.map +1 -0
- package/dist/generators/tenant-gate.d.ts +74 -0
- package/dist/generators/tenant-gate.d.ts.map +1 -0
- package/dist/generators/tenant-gate.js +15 -0
- package/dist/generators/tenant-gate.js.map +1 -0
- package/dist/generators.d.ts +8 -0
- package/dist/generators.d.ts.map +1 -0
- package/dist/generators.js +19 -0
- package/dist/generators.js.map +1 -0
- package/dist/hierarchical.d.ts +103 -0
- package/dist/hierarchical.d.ts.map +1 -0
- package/dist/hierarchical.js +184 -0
- package/dist/hierarchical.js.map +1 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +202 -0
- package/dist/index.js.map +1 -0
- package/dist/interceptors.d.ts +251 -0
- package/dist/interceptors.d.ts.map +1 -0
- package/dist/interceptors.js +259 -0
- package/dist/interceptors.js.map +1 -0
- package/dist/junction.d.ts +99 -0
- package/dist/junction.d.ts.map +1 -0
- package/dist/junction.js +136 -0
- package/dist/junction.js.map +1 -0
- package/dist/knowledge.d.ts +11 -0
- package/dist/knowledge.d.ts.map +1 -0
- package/dist/knowledge.js +310 -0
- package/dist/knowledge.js.map +1 -0
- package/dist/lazy-config.d.ts +160 -0
- package/dist/lazy-config.d.ts.map +1 -0
- package/dist/lazy-config.js +146 -0
- package/dist/lazy-config.js.map +1 -0
- package/dist/manifest/discover-base-classes.d.ts +78 -0
- package/dist/manifest/discover-base-classes.d.ts.map +1 -0
- package/dist/manifest/discover-base-classes.js +85 -0
- package/dist/manifest/discover-base-classes.js.map +1 -0
- package/dist/manifest/discover-smrt-packages.d.ts +48 -0
- package/dist/manifest/discover-smrt-packages.d.ts.map +1 -0
- package/dist/manifest/discover-smrt-packages.js +361 -0
- package/dist/manifest/discover-smrt-packages.js.map +1 -0
- package/dist/manifest/generator.d.ts +93 -0
- package/dist/manifest/generator.d.ts.map +1 -0
- package/dist/manifest/generator.js +380 -0
- package/dist/manifest/generator.js.map +1 -0
- package/dist/manifest/index.d.ts +16 -0
- package/dist/manifest/index.d.ts.map +1 -0
- package/dist/manifest/index.js +51 -0
- package/dist/manifest/index.js.map +1 -0
- package/dist/manifest/manager.d.ts +51 -0
- package/dist/manifest/manager.d.ts.map +1 -0
- package/dist/manifest/manager.js +89 -0
- package/dist/manifest/manager.js.map +1 -0
- package/dist/manifest/manifest-loader.d.ts +187 -0
- package/dist/manifest/manifest-loader.d.ts.map +1 -0
- package/dist/manifest/manifest-loader.js +847 -0
- package/dist/manifest/manifest-loader.js.map +1 -0
- package/dist/manifest/sources/composite.d.ts +22 -0
- package/dist/manifest/sources/composite.d.ts.map +1 -0
- package/dist/manifest/sources/composite.js +60 -0
- package/dist/manifest/sources/composite.js.map +1 -0
- package/dist/manifest/sources/embedded.d.ts +7 -0
- package/dist/manifest/sources/embedded.d.ts.map +1 -0
- package/dist/manifest/sources/embedded.js +30 -0
- package/dist/manifest/sources/embedded.js.map +1 -0
- package/dist/manifest/sources/explicit-paths.d.ts +17 -0
- package/dist/manifest/sources/explicit-paths.d.ts.map +1 -0
- package/dist/manifest/sources/explicit-paths.js +35 -0
- package/dist/manifest/sources/explicit-paths.js.map +1 -0
- package/dist/manifest/sources/fallback.d.ts +25 -0
- package/dist/manifest/sources/fallback.d.ts.map +1 -0
- package/dist/manifest/sources/fallback.js +63 -0
- package/dist/manifest/sources/fallback.js.map +1 -0
- package/dist/manifest/sources/index.d.ts +17 -0
- package/dist/manifest/sources/index.d.ts.map +1 -0
- package/dist/manifest/sources/local-test.d.ts +7 -0
- package/dist/manifest/sources/local-test.d.ts.map +1 -0
- package/dist/manifest/sources/local-test.js +21 -0
- package/dist/manifest/sources/local-test.js.map +1 -0
- package/dist/manifest/sources/static.d.ts +7 -0
- package/dist/manifest/sources/static.d.ts.map +1 -0
- package/dist/manifest/sources/static.js +19 -0
- package/dist/manifest/sources/static.js.map +1 -0
- package/dist/manifest/sources/test.d.ts +7 -0
- package/dist/manifest/sources/test.d.ts.map +1 -0
- package/dist/manifest/sources/test.js +21 -0
- package/dist/manifest/sources/test.js.map +1 -0
- package/dist/manifest/sources/types.d.ts +79 -0
- package/dist/manifest/sources/types.d.ts.map +1 -0
- package/dist/manifest/sources/types.js +61 -0
- package/dist/manifest/sources/types.js.map +1 -0
- package/dist/manifest/static-manifest.d.ts +4 -0
- package/dist/manifest/static-manifest.d.ts.map +1 -0
- package/dist/manifest/static-manifest.js +1535 -0
- package/dist/manifest/static-manifest.js.map +1 -0
- package/dist/manifest/store.d.ts +111 -0
- package/dist/manifest/store.d.ts.map +1 -0
- package/dist/manifest/store.js +431 -0
- package/dist/manifest/store.js.map +1 -0
- package/dist/manifest/test-manifest-loader.d.ts +3 -0
- package/dist/manifest/test-manifest-loader.d.ts.map +1 -0
- package/dist/manifest/test-manifest-stub.d.ts +4 -0
- package/dist/manifest/test-manifest-stub.d.ts.map +1 -0
- package/dist/manifest/test-manifest-stub.js +80013 -0
- package/dist/manifest/test-manifest-stub.js.map +1 -0
- package/dist/manifest.d.ts +8 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +20 -0
- package/dist/manifest.js.map +1 -0
- package/dist/manifest.json +1489 -0
- package/dist/mcp-advisor/index.d.ts +499 -0
- package/dist/mcp-advisor/index.d.ts.map +1 -0
- package/dist/mcp-advisor/tools/add-ai-methods.d.ts +6 -0
- package/dist/mcp-advisor/tools/add-ai-methods.d.ts.map +1 -0
- package/dist/mcp-advisor/tools/configure-decorators.d.ts +6 -0
- package/dist/mcp-advisor/tools/configure-decorators.d.ts.map +1 -0
- package/dist/mcp-advisor/tools/generate-collection.d.ts +6 -0
- package/dist/mcp-advisor/tools/generate-collection.d.ts.map +1 -0
- package/dist/mcp-advisor/tools/generate-field-definitions.d.ts +6 -0
- package/dist/mcp-advisor/tools/generate-field-definitions.d.ts.map +1 -0
- package/dist/mcp-advisor/tools/generate-smrt-class.d.ts +6 -0
- package/dist/mcp-advisor/tools/generate-smrt-class.d.ts.map +1 -0
- package/dist/mcp-advisor/tools/get-object-config.d.ts +6 -0
- package/dist/mcp-advisor/tools/get-object-config.d.ts.map +1 -0
- package/dist/mcp-advisor/tools/get-object-schema.d.ts +10 -0
- package/dist/mcp-advisor/tools/get-object-schema.d.ts.map +1 -0
- package/dist/mcp-advisor/tools/list-registered-objects.d.ts +9 -0
- package/dist/mcp-advisor/tools/list-registered-objects.d.ts.map +1 -0
- package/dist/mcp-advisor/tools/preview-api-endpoints.d.ts +9 -0
- package/dist/mcp-advisor/tools/preview-api-endpoints.d.ts.map +1 -0
- package/dist/mcp-advisor/tools/preview-mcp-tools.d.ts +9 -0
- package/dist/mcp-advisor/tools/preview-mcp-tools.d.ts.map +1 -0
- package/dist/mcp-advisor/tools/validate-smrt-object.d.ts +6 -0
- package/dist/mcp-advisor/tools/validate-smrt-object.d.ts.map +1 -0
- package/dist/mcp-advisor/types.d.ts +209 -0
- package/dist/mcp-advisor/types.d.ts.map +1 -0
- package/dist/migrations/backfill-tracker.d.ts +84 -0
- package/dist/migrations/backfill-tracker.d.ts.map +1 -0
- package/dist/migrations/backfill-tracker.js +118 -0
- package/dist/migrations/backfill-tracker.js.map +1 -0
- package/dist/migrations/checksum.d.ts +43 -0
- package/dist/migrations/checksum.d.ts.map +1 -0
- package/dist/migrations/checksum.js +32 -0
- package/dist/migrations/checksum.js.map +1 -0
- package/dist/migrations/differ.d.ts +186 -0
- package/dist/migrations/differ.d.ts.map +1 -0
- package/dist/migrations/differ.js +601 -0
- package/dist/migrations/differ.js.map +1 -0
- package/dist/migrations/generator.d.ts +133 -0
- package/dist/migrations/generator.d.ts.map +1 -0
- package/dist/migrations/generator.js +328 -0
- package/dist/migrations/generator.js.map +1 -0
- package/dist/migrations/index.d.ts +20 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/orchestrate.d.ts +148 -0
- package/dist/migrations/orchestrate.d.ts.map +1 -0
- package/dist/migrations/orchestrate.js +118 -0
- package/dist/migrations/orchestrate.js.map +1 -0
- package/dist/migrations/tracker.d.ts +134 -0
- package/dist/migrations/tracker.d.ts.map +1 -0
- package/dist/migrations/tracker.js +624 -0
- package/dist/migrations/tracker.js.map +1 -0
- package/dist/migrations/types.d.ts +221 -0
- package/dist/migrations/types.d.ts.map +1 -0
- package/dist/migrations.d.ts +7 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +26 -0
- package/dist/migrations.js.map +1 -0
- package/dist/node_modules/.pnpm/balanced-match@4.0.4/node_modules/balanced-match/dist/esm/index.js +56 -0
- package/dist/node_modules/.pnpm/balanced-match@4.0.4/node_modules/balanced-match/dist/esm/index.js.map +1 -0
- package/dist/node_modules/.pnpm/brace-expansion@5.0.5/node_modules/brace-expansion/dist/esm/index.js +163 -0
- package/dist/node_modules/.pnpm/brace-expansion@5.0.5/node_modules/brace-expansion/dist/esm/index.js.map +1 -0
- package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/assert-valid-pattern.js +13 -0
- package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/assert-valid-pattern.js.map +1 -0
- package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/ast.js +654 -0
- package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/ast.js.map +1 -0
- package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/brace-expressions.js +111 -0
- package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/brace-expressions.js.map +1 -0
- package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/escape.js +10 -0
- package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/escape.js.map +1 -0
- package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/index.js +824 -0
- package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/index.js.map +1 -0
- package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/unescape.js +10 -0
- package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/unescape.js.map +1 -0
- package/dist/object.d.ts +1202 -0
- package/dist/object.d.ts.map +1 -0
- package/dist/object.js +2731 -0
- package/dist/object.js.map +1 -0
- package/dist/polymorphic-association.d.ts +69 -0
- package/dist/polymorphic-association.d.ts.map +1 -0
- package/dist/polymorphic-association.js +96 -0
- package/dist/polymorphic-association.js.map +1 -0
- package/dist/prebuild/cli.d.ts +7 -0
- package/dist/prebuild/cli.d.ts.map +1 -0
- package/dist/prebuild/cli.js +29 -0
- package/dist/prebuild/cli.js.map +1 -0
- package/dist/prebuild/index.d.ts +22 -0
- package/dist/prebuild/index.d.ts.map +1 -0
- package/dist/prebuild/index.js +239 -0
- package/dist/prebuild/index.js.map +1 -0
- package/dist/prebuild.d.ts +8 -0
- package/dist/prebuild.d.ts.map +1 -0
- package/dist/prebuild.js +6 -0
- package/dist/prebuild.js.map +1 -0
- package/dist/registry/cache-config.d.ts +13 -0
- package/dist/registry/cache-config.d.ts.map +1 -0
- package/dist/registry/cache-config.js +17 -0
- package/dist/registry/cache-config.js.map +1 -0
- package/dist/registry/class-registration.d.ts +31 -0
- package/dist/registry/class-registration.d.ts.map +1 -0
- package/dist/registry/class-registration.js +1074 -0
- package/dist/registry/class-registration.js.map +1 -0
- package/dist/registry/collection-resolution.d.ts +45 -0
- package/dist/registry/collection-resolution.d.ts.map +1 -0
- package/dist/registry/collection-resolution.js +121 -0
- package/dist/registry/collection-resolution.js.map +1 -0
- package/dist/registry/collision-policy.d.ts +179 -0
- package/dist/registry/collision-policy.d.ts.map +1 -0
- package/dist/registry/collision-policy.js +153 -0
- package/dist/registry/collision-policy.js.map +1 -0
- package/dist/registry/diagnostics.d.ts +58 -0
- package/dist/registry/diagnostics.d.ts.map +1 -0
- package/dist/registry/diagnostics.js +54 -0
- package/dist/registry/diagnostics.js.map +1 -0
- package/dist/registry/embedding-manager.d.ts +23 -0
- package/dist/registry/embedding-manager.d.ts.map +1 -0
- package/dist/registry/embedding-manager.js +62 -0
- package/dist/registry/embedding-manager.js.map +1 -0
- package/dist/registry/index.d.ts +13 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/inheritance-resolver.d.ts +13 -0
- package/dist/registry/inheritance-resolver.d.ts.map +1 -0
- package/dist/registry/inheritance-resolver.js +244 -0
- package/dist/registry/inheritance-resolver.js.map +1 -0
- package/dist/registry/manifest-field-merge.d.ts +4 -0
- package/dist/registry/manifest-field-merge.d.ts.map +1 -0
- package/dist/registry/manifest-field-merge.js +82 -0
- package/dist/registry/manifest-field-merge.js.map +1 -0
- package/dist/registry/name-resolver.d.ts +102 -0
- package/dist/registry/name-resolver.d.ts.map +1 -0
- package/dist/registry/name-resolver.js +241 -0
- package/dist/registry/name-resolver.js.map +1 -0
- package/dist/registry/relationship-graph.d.ts +16 -0
- package/dist/registry/relationship-graph.d.ts.map +1 -0
- package/dist/registry/relationship-graph.js +79 -0
- package/dist/registry/relationship-graph.js.map +1 -0
- package/dist/registry/schema-builder.d.ts +113 -0
- package/dist/registry/schema-builder.d.ts.map +1 -0
- package/dist/registry/schema-builder.js +474 -0
- package/dist/registry/schema-builder.js.map +1 -0
- package/dist/registry/shared-state.d.ts +62 -0
- package/dist/registry/shared-state.d.ts.map +1 -0
- package/dist/registry/shared-state.js +135 -0
- package/dist/registry/shared-state.js.map +1 -0
- package/dist/registry/types.d.ts +667 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/validator.d.ts +13 -0
- package/dist/registry/validator.d.ts.map +1 -0
- package/dist/registry/validator.js +138 -0
- package/dist/registry/validator.js.map +1 -0
- package/dist/registry.d.ts +1358 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +2301 -0
- package/dist/registry.js.map +1 -0
- package/dist/runtime/client.d.ts +34 -0
- package/dist/runtime/client.d.ts.map +1 -0
- package/dist/runtime/client.js +104 -0
- package/dist/runtime/client.js.map +1 -0
- package/dist/runtime/index.d.ts +10 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/mcp.d.ts +47 -0
- package/dist/runtime/mcp.d.ts.map +1 -0
- package/dist/runtime/mcp.js +72 -0
- package/dist/runtime/mcp.js.map +1 -0
- package/dist/runtime/server.d.ts +92 -0
- package/dist/runtime/server.d.ts.map +1 -0
- package/dist/runtime/server.js +390 -0
- package/dist/runtime/server.js.map +1 -0
- package/dist/runtime/types.d.ts +58 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime.d.ts +8 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +10 -0
- package/dist/runtime.js.map +1 -0
- package/dist/scanner/import-scanner.d.ts +7 -0
- package/dist/scanner/import-scanner.d.ts.map +1 -0
- package/dist/scanner/index.d.ts +12 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/manifest-generator.d.ts +304 -0
- package/dist/scanner/manifest-generator.d.ts.map +1 -0
- package/dist/scanner/manifest-generator.js +1707 -0
- package/dist/scanner/manifest-generator.js.map +1 -0
- package/dist/scanner/test-file-patterns.d.ts +18 -0
- package/dist/scanner/test-file-patterns.d.ts.map +1 -0
- package/dist/scanner/test-file-patterns.js +16 -0
- package/dist/scanner/test-file-patterns.js.map +1 -0
- package/dist/scanner/types.d.ts +313 -0
- package/dist/scanner/types.d.ts.map +1 -0
- package/dist/scanner/types.js +2 -0
- package/dist/scanner/types.js.map +1 -0
- package/dist/scanner.d.ts +6 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +6 -0
- package/dist/scanner.js.map +1 -0
- package/dist/schema/code-generator.d.ts +53 -0
- package/dist/schema/code-generator.d.ts.map +1 -0
- package/dist/schema/ddl/base-strategy.d.ts +80 -0
- package/dist/schema/ddl/base-strategy.d.ts.map +1 -0
- package/dist/schema/ddl/base-strategy.js +240 -0
- package/dist/schema/ddl/base-strategy.js.map +1 -0
- package/dist/schema/ddl/duckdb-strategy.d.ts +33 -0
- package/dist/schema/ddl/duckdb-strategy.d.ts.map +1 -0
- package/dist/schema/ddl/duckdb-strategy.js +74 -0
- package/dist/schema/ddl/duckdb-strategy.js.map +1 -0
- package/dist/schema/ddl/index.d.ts +53 -0
- package/dist/schema/ddl/index.d.ts.map +1 -0
- package/dist/schema/ddl/index.js +80 -0
- package/dist/schema/ddl/index.js.map +1 -0
- package/dist/schema/ddl/json-duckdb-strategy.d.ts +8 -0
- package/dist/schema/ddl/json-duckdb-strategy.d.ts.map +1 -0
- package/dist/schema/ddl/json-duckdb-strategy.js +14 -0
- package/dist/schema/ddl/json-duckdb-strategy.js.map +1 -0
- package/dist/schema/ddl/postgres-strategy.d.ts +29 -0
- package/dist/schema/ddl/postgres-strategy.d.ts.map +1 -0
- package/dist/schema/ddl/postgres-strategy.js +102 -0
- package/dist/schema/ddl/postgres-strategy.js.map +1 -0
- package/dist/schema/ddl/sqlite-strategy.d.ts +38 -0
- package/dist/schema/ddl/sqlite-strategy.d.ts.map +1 -0
- package/dist/schema/ddl/sqlite-strategy.js +74 -0
- package/dist/schema/ddl/sqlite-strategy.js.map +1 -0
- package/dist/schema/ddl/types.d.ts +114 -0
- package/dist/schema/ddl/types.d.ts.map +1 -0
- package/dist/schema/generator.d.ts +176 -0
- package/dist/schema/generator.d.ts.map +1 -0
- package/dist/schema/generator.js +1076 -0
- package/dist/schema/generator.js.map +1 -0
- package/dist/schema/index-utils.d.ts +19 -0
- package/dist/schema/index-utils.d.ts.map +1 -0
- package/dist/schema/index-utils.js +32 -0
- package/dist/schema/index-utils.js.map +1 -0
- package/dist/schema/index.d.ts +13 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/override-system.d.ts +43 -0
- package/dist/schema/override-system.d.ts.map +1 -0
- package/dist/schema/schema-aggregator.d.ts +112 -0
- package/dist/schema/schema-aggregator.d.ts.map +1 -0
- package/dist/schema/schema-manager.d.ts +95 -0
- package/dist/schema/schema-manager.d.ts.map +1 -0
- package/dist/schema/schema-manager.js +283 -0
- package/dist/schema/schema-manager.js.map +1 -0
- package/dist/schema/sql-identifiers.d.ts +107 -0
- package/dist/schema/sql-identifiers.d.ts.map +1 -0
- package/dist/schema/sql-identifiers.js +190 -0
- package/dist/schema/sql-identifiers.js.map +1 -0
- package/dist/schema/table-verifier.d.ts +10 -0
- package/dist/schema/table-verifier.d.ts.map +1 -0
- package/dist/schema/table-verifier.js +37 -0
- package/dist/schema/table-verifier.js.map +1 -0
- package/dist/schema/types.d.ts +241 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/utils.d.ts +32 -0
- package/dist/schema/utils.d.ts.map +1 -0
- package/dist/schema/utils.js +134 -0
- package/dist/schema/utils.js.map +1 -0
- package/dist/scripts/create-wrappers.js +89 -0
- package/dist/scripts/generate-manifest.js +155 -0
- package/dist/scripts/generate-test-manifest.js +77 -0
- package/dist/scripts/migrate-datetime-to-timestamp.ts +310 -0
- package/dist/scripts/prepack.js +49 -0
- package/dist/signals/bus.d.ts +64 -0
- package/dist/signals/bus.d.ts.map +1 -0
- package/dist/signals/bus.js +102 -0
- package/dist/signals/bus.js.map +1 -0
- package/dist/signals/index.d.ts +11 -0
- package/dist/signals/index.d.ts.map +1 -0
- package/dist/signals/sanitizer.d.ts +54 -0
- package/dist/signals/sanitizer.d.ts.map +1 -0
- package/dist/signals/sanitizer.js +111 -0
- package/dist/signals/sanitizer.js.map +1 -0
- package/dist/smrt-knowledge.json +335 -0
- package/dist/system/compatibility.d.ts +8 -0
- package/dist/system/compatibility.d.ts.map +1 -0
- package/dist/system/compatibility.js +409 -0
- package/dist/system/compatibility.js.map +1 -0
- package/dist/system/index.d.ts +9 -0
- package/dist/system/index.d.ts.map +1 -0
- package/dist/system/schema.d.ts +69 -0
- package/dist/system/schema.d.ts.map +1 -0
- package/dist/system/schema.js +271 -0
- package/dist/system/schema.js.map +1 -0
- package/dist/system/types.d.ts +135 -0
- package/dist/system/types.d.ts.map +1 -0
- package/dist/system-fields.d.ts +44 -0
- package/dist/system-fields.d.ts.map +1 -0
- package/dist/system-fields.js +55 -0
- package/dist/system-fields.js.map +1 -0
- package/dist/table-cache.d.ts +28 -0
- package/dist/table-cache.d.ts.map +1 -0
- package/dist/table-cache.js +21 -0
- package/dist/table-cache.js.map +1 -0
- package/dist/test-utils.d.ts +140 -0
- package/dist/test-utils.d.ts.map +1 -0
- package/dist/testing/database.d.ts +73 -0
- package/dist/testing/database.d.ts.map +1 -0
- package/dist/testing/database.js +204 -0
- package/dist/testing/database.js.map +1 -0
- package/dist/testing/index.d.ts +21 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing.d.ts +6 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +5 -0
- package/dist/testing.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/tool-executor.d.ts +101 -0
- package/dist/tools/tool-executor.d.ts.map +1 -0
- package/dist/tools/tool-executor.js +142 -0
- package/dist/tools/tool-executor.js.map +1 -0
- package/dist/tools/tool-generator.d.ts +54 -0
- package/dist/tools/tool-generator.d.ts.map +1 -0
- package/dist/tools/tool-generator.js +121 -0
- package/dist/tools/tool-generator.js.map +1 -0
- package/dist/utils/chunk.d.ts +32 -0
- package/dist/utils/chunk.d.ts.map +1 -0
- package/dist/utils/chunk.js +14 -0
- package/dist/utils/chunk.js.map +1 -0
- package/dist/utils/import-workspace-module.d.ts +8 -0
- package/dist/utils/import-workspace-module.d.ts.map +1 -0
- package/dist/utils/import-workspace-module.js +81 -0
- package/dist/utils/import-workspace-module.js.map +1 -0
- package/dist/utils/json.d.ts +102 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +43 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/lru-cache.d.ts +69 -0
- package/dist/utils/lru-cache.d.ts.map +1 -0
- package/dist/utils/lru-cache.js +100 -0
- package/dist/utils/lru-cache.js.map +1 -0
- package/dist/utils/naming.d.ts +16 -0
- package/dist/utils/naming.d.ts.map +1 -0
- package/dist/utils/naming.js +23 -0
- package/dist/utils/naming.js.map +1 -0
- package/dist/utils/qualified-names.d.ts +122 -0
- package/dist/utils/qualified-names.d.ts.map +1 -0
- package/dist/utils/qualified-names.js +82 -0
- package/dist/utils/qualified-names.js.map +1 -0
- package/dist/utils/scanner-module.d.ts +37 -0
- package/dist/utils/scanner-module.d.ts.map +1 -0
- package/dist/utils.d.ts +177 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +185 -0
- package/dist/utils.js.map +1 -0
- package/dist/vite-plugin/import-build-aware.d.ts +68 -0
- package/dist/vite-plugin/import-build-aware.d.ts.map +1 -0
- package/dist/vite-plugin/import-build-aware.js +72 -0
- package/dist/vite-plugin/import-build-aware.js.map +1 -0
- package/dist/vite-plugin/index.d.ts +59 -0
- package/dist/vite-plugin/index.d.ts.map +1 -0
- package/dist/vite-plugin/index.js +1400 -0
- package/dist/vite-plugin/index.js.map +1 -0
- package/dist/vite-plugin/sveltekit-generator.d.ts +66 -0
- package/dist/vite-plugin/sveltekit-generator.d.ts.map +1 -0
- package/dist/vite-plugin/sveltekit-generator.js +1375 -0
- package/dist/vite-plugin/sveltekit-generator.js.map +1 -0
- package/dist/vite-plugin/templates/default-ui.ts +432 -0
- package/dist/vite-plugin/templates/default.html +206 -0
- package/dist/vite-plugin.d.ts +8 -0
- package/dist/vite-plugin.d.ts.map +1 -0
- package/dist/vite-plugin.js +11 -0
- package/dist/vite-plugin.js.map +1 -0
- package/package.json +208 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { DatabaseInterface } from '@happyvertical/sql';
|
|
2
|
+
import { DispatchSubscription } from '../models/DispatchSubscription.js';
|
|
3
|
+
import { DispatchTenantScope } from '../tenant-resolver.js';
|
|
4
|
+
/**
|
|
5
|
+
* Storage operations for subscriptions in _smrt_dispatch_subscriptions table
|
|
6
|
+
*/
|
|
7
|
+
export declare class DispatchSubscriptionCollection {
|
|
8
|
+
/**
|
|
9
|
+
* Insert or update a subscription.
|
|
10
|
+
*
|
|
11
|
+
* Identity is tenant-scoped (S5 #1398): the conflict key is
|
|
12
|
+
* `(tenant_id, signal_type, subscriber)` so the same (signal_type, subscriber)
|
|
13
|
+
* pair can exist independently per tenant and one tenant cannot overwrite
|
|
14
|
+
* another's subscription. Global (NULL tenant_id) subscriptions are deduped by
|
|
15
|
+
* the NULL-aware upsert path in @happyvertical/sql.
|
|
16
|
+
*/
|
|
17
|
+
static upsert(db: DatabaseInterface, subscription: DispatchSubscription): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Get a subscription by ID
|
|
20
|
+
*/
|
|
21
|
+
static get(db: DatabaseInterface, id: string): Promise<DispatchSubscription | null>;
|
|
22
|
+
/**
|
|
23
|
+
* Find subscription by signal type and subscriber
|
|
24
|
+
*/
|
|
25
|
+
static find(db: DatabaseInterface, signalType: string, subscriber: string): Promise<DispatchSubscription | null>;
|
|
26
|
+
/**
|
|
27
|
+
* Get all subscriptions for a subscriber, scoped to the active tenant (S5 #1398).
|
|
28
|
+
*/
|
|
29
|
+
static findBySubscriber(db: DatabaseInterface, subscriber: string, enabledOnly?: boolean, tenantScope?: DispatchTenantScope): Promise<DispatchSubscription[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Get all subscriptions that match a signal type
|
|
32
|
+
*
|
|
33
|
+
* Uses SQL-level filtering for exact matches. Wildcard subscriptions
|
|
34
|
+
* (containing '*') are fetched separately and filtered in memory since
|
|
35
|
+
* pattern matching requires application-side regex evaluation.
|
|
36
|
+
*/
|
|
37
|
+
static findMatchingSubscribers(db: DatabaseInterface, signalType: string, tenantScope?: DispatchTenantScope): Promise<DispatchSubscription[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Find all enabled subscriptions matching a signal type
|
|
40
|
+
*
|
|
41
|
+
* Alias for findMatchingSubscribers — used by emit() to determine
|
|
42
|
+
* fan-out targets. Scoped to the active tenant (S5 #1398).
|
|
43
|
+
*/
|
|
44
|
+
static findBySignalType(db: DatabaseInterface, signalType: string, tenantScope?: DispatchTenantScope): Promise<DispatchSubscription[]>;
|
|
45
|
+
/**
|
|
46
|
+
* Get all unique signal types that a subscriber is subscribed to
|
|
47
|
+
*/
|
|
48
|
+
static getSignalTypes(db: DatabaseInterface, subscriber: string): Promise<string[]>;
|
|
49
|
+
/**
|
|
50
|
+
* List all subscriptions, scoped to the active tenant (S5 #1398).
|
|
51
|
+
*/
|
|
52
|
+
static list(db: DatabaseInterface, enabledOnly?: boolean, tenantScope?: DispatchTenantScope): Promise<DispatchSubscription[]>;
|
|
53
|
+
/**
|
|
54
|
+
* Delete a subscription
|
|
55
|
+
*/
|
|
56
|
+
static delete(db: DatabaseInterface, id: string): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Delete subscription by signal type and subscriber, scoped to the active
|
|
59
|
+
* tenant (S5 #1398) so tenant B cannot delete tenant A's subscription.
|
|
60
|
+
*/
|
|
61
|
+
static deleteByKey(db: DatabaseInterface, signalType: string, subscriber: string, tenantScope?: DispatchTenantScope): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Delete all subscriptions for a subscriber
|
|
64
|
+
*/
|
|
65
|
+
static deleteBySubscriber(db: DatabaseInterface, subscriber: string): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Enable a subscription, scoped to the active tenant (S5 #1398).
|
|
68
|
+
*/
|
|
69
|
+
static enable(db: DatabaseInterface, signalType: string, subscriber: string, tenantScope?: DispatchTenantScope): Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* Disable a subscription, scoped to the active tenant (S5 #1398).
|
|
72
|
+
*/
|
|
73
|
+
static disable(db: DatabaseInterface, signalType: string, subscriber: string, tenantScope?: DispatchTenantScope): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Check if subscriptions table exists
|
|
76
|
+
*/
|
|
77
|
+
static tableExists(db: DatabaseInterface): Promise<boolean>;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=DispatchSubscriptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DispatchSubscriptions.d.ts","sourceRoot":"","sources":["../../../src/dispatch/collections/DispatchSubscriptions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EACL,oBAAoB,EAErB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAkCjE;;GAEG;AACH,qBAAa,8BAA8B;IACzC;;;;;;;;OAQG;WACU,MAAM,CACjB,EAAE,EAAE,iBAAiB,EACrB,YAAY,EAAE,oBAAoB,GACjC,OAAO,CAAC,IAAI,CAAC;IAmBhB;;OAEG;WACU,GAAG,CACd,EAAE,EAAE,iBAAiB,EACrB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IASvC;;OAEG;WACU,IAAI,CACf,EAAE,EAAE,iBAAiB,EACrB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAUvC;;OAEG;WACU,gBAAgB,CAC3B,EAAE,EAAE,iBAAiB,EACrB,UAAU,EAAE,MAAM,EAClB,WAAW,GAAE,OAAc,EAC3B,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAqBlC;;;;;;OAMG;WACU,uBAAuB,CAClC,EAAE,EAAE,iBAAiB,EACrB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,oBAAoB,EAAE,CAAC;IA8ClC;;;;;OAKG;WACU,gBAAgB,CAC3B,EAAE,EAAE,iBAAiB,EACrB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAIlC;;OAEG;WACU,cAAc,CACzB,EAAE,EAAE,iBAAiB,EACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC;IAYpB;;OAEG;WACU,IAAI,CACf,EAAE,EAAE,iBAAiB,EACrB,WAAW,GAAE,OAAe,EAC5B,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAuBlC;;OAEG;WACU,MAAM,CAAC,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE;;;OAGG;WACU,WAAW,CACtB,EAAE,EAAE,iBAAiB,EACrB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,IAAI,CAAC;IAUhB;;OAEG;WACU,kBAAkB,CAC7B,EAAE,EAAE,iBAAiB,EACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IAOhB;;OAEG;WACU,MAAM,CACjB,EAAE,EAAE,iBAAiB,EACrB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,IAAI,CAAC;IAchB;;OAEG;WACU,OAAO,CAClB,EAAE,EAAE,iBAAiB,EACrB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,IAAI,CAAC;IAchB;;OAEG;WACU,WAAW,CAAC,EAAE,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;CAQlE"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { DispatchSubscription } from "../models/DispatchSubscription.js";
|
|
2
|
+
function subscriptionTenantClause(scope, params) {
|
|
3
|
+
if (!scope?.enforced) {
|
|
4
|
+
return null;
|
|
5
|
+
}
|
|
6
|
+
if (scope.tenantId !== null) {
|
|
7
|
+
params.push(scope.tenantId);
|
|
8
|
+
return "tenant_id = ?";
|
|
9
|
+
}
|
|
10
|
+
return "tenant_id IS NULL";
|
|
11
|
+
}
|
|
12
|
+
class DispatchSubscriptionCollection {
|
|
13
|
+
/**
|
|
14
|
+
* Insert or update a subscription.
|
|
15
|
+
*
|
|
16
|
+
* Identity is tenant-scoped (S5 #1398): the conflict key is
|
|
17
|
+
* `(tenant_id, signal_type, subscriber)` so the same (signal_type, subscriber)
|
|
18
|
+
* pair can exist independently per tenant and one tenant cannot overwrite
|
|
19
|
+
* another's subscription. Global (NULL tenant_id) subscriptions are deduped by
|
|
20
|
+
* the NULL-aware upsert path in @happyvertical/sql.
|
|
21
|
+
*/
|
|
22
|
+
static async upsert(db, subscription) {
|
|
23
|
+
const row = subscription.toRow();
|
|
24
|
+
await db.upsert(
|
|
25
|
+
"_smrt_dispatch_subscriptions",
|
|
26
|
+
["tenant_id", "signal_type", "subscriber"],
|
|
27
|
+
{
|
|
28
|
+
id: row.id,
|
|
29
|
+
signal_type: row.signal_type,
|
|
30
|
+
subscriber: row.subscriber,
|
|
31
|
+
handler: row.handler,
|
|
32
|
+
delivery: row.delivery,
|
|
33
|
+
enabled: row.enabled,
|
|
34
|
+
tenant_id: row.tenant_id,
|
|
35
|
+
created_at: row.created_at,
|
|
36
|
+
updated_at: row.updated_at
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get a subscription by ID
|
|
42
|
+
*/
|
|
43
|
+
static async get(db, id) {
|
|
44
|
+
const result = await db.single`
|
|
45
|
+
SELECT * FROM _smrt_dispatch_subscriptions WHERE id = ${id}
|
|
46
|
+
`;
|
|
47
|
+
if (!result) return null;
|
|
48
|
+
return DispatchSubscription.fromRow(result);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Find subscription by signal type and subscriber
|
|
52
|
+
*/
|
|
53
|
+
static async find(db, signalType, subscriber) {
|
|
54
|
+
const result = await db.single`
|
|
55
|
+
SELECT * FROM _smrt_dispatch_subscriptions
|
|
56
|
+
WHERE signal_type = ${signalType} AND subscriber = ${subscriber}
|
|
57
|
+
`;
|
|
58
|
+
if (!result) return null;
|
|
59
|
+
return DispatchSubscription.fromRow(result);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get all subscriptions for a subscriber, scoped to the active tenant (S5 #1398).
|
|
63
|
+
*/
|
|
64
|
+
static async findBySubscriber(db, subscriber, enabledOnly = true, tenantScope) {
|
|
65
|
+
let sql = `SELECT * FROM _smrt_dispatch_subscriptions WHERE subscriber = ?`;
|
|
66
|
+
const params = [subscriber];
|
|
67
|
+
if (enabledOnly) {
|
|
68
|
+
sql += " AND enabled = 1";
|
|
69
|
+
}
|
|
70
|
+
const tenantClause = subscriptionTenantClause(tenantScope, params);
|
|
71
|
+
if (tenantClause) {
|
|
72
|
+
sql += ` AND ${tenantClause}`;
|
|
73
|
+
}
|
|
74
|
+
sql += " ORDER BY signal_type ASC";
|
|
75
|
+
const { rows } = await db.query(sql, ...params);
|
|
76
|
+
return rows.map(
|
|
77
|
+
(row) => DispatchSubscription.fromRow(row)
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get all subscriptions that match a signal type
|
|
82
|
+
*
|
|
83
|
+
* Uses SQL-level filtering for exact matches. Wildcard subscriptions
|
|
84
|
+
* (containing '*') are fetched separately and filtered in memory since
|
|
85
|
+
* pattern matching requires application-side regex evaluation.
|
|
86
|
+
*/
|
|
87
|
+
static async findMatchingSubscribers(db, signalType, tenantScope) {
|
|
88
|
+
const exactParams = [signalType];
|
|
89
|
+
let exactSql = `SELECT * FROM _smrt_dispatch_subscriptions
|
|
90
|
+
WHERE enabled = 1 AND signal_type = ?`;
|
|
91
|
+
const exactTenantClause = subscriptionTenantClause(
|
|
92
|
+
tenantScope,
|
|
93
|
+
exactParams
|
|
94
|
+
);
|
|
95
|
+
if (exactTenantClause) {
|
|
96
|
+
exactSql += ` AND ${exactTenantClause}`;
|
|
97
|
+
}
|
|
98
|
+
const { rows: exactRows } = await db.query(exactSql, ...exactParams);
|
|
99
|
+
const exactSubs = exactRows.map(
|
|
100
|
+
(row) => DispatchSubscription.fromRow(row)
|
|
101
|
+
);
|
|
102
|
+
const wildcardParams = [];
|
|
103
|
+
let wildcardSql = `SELECT * FROM _smrt_dispatch_subscriptions
|
|
104
|
+
WHERE enabled = 1 AND signal_type LIKE '%*%'`;
|
|
105
|
+
const wildcardTenantClause = subscriptionTenantClause(
|
|
106
|
+
tenantScope,
|
|
107
|
+
wildcardParams
|
|
108
|
+
);
|
|
109
|
+
if (wildcardTenantClause) {
|
|
110
|
+
wildcardSql += ` AND ${wildcardTenantClause}`;
|
|
111
|
+
}
|
|
112
|
+
const { rows: wildcardRows } = await db.query(
|
|
113
|
+
wildcardSql,
|
|
114
|
+
...wildcardParams
|
|
115
|
+
);
|
|
116
|
+
const wildcardSubs = wildcardRows.map(
|
|
117
|
+
(row) => DispatchSubscription.fromRow(
|
|
118
|
+
row
|
|
119
|
+
)
|
|
120
|
+
).filter((sub) => sub.matches(signalType));
|
|
121
|
+
return [...exactSubs, ...wildcardSubs];
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Find all enabled subscriptions matching a signal type
|
|
125
|
+
*
|
|
126
|
+
* Alias for findMatchingSubscribers — used by emit() to determine
|
|
127
|
+
* fan-out targets. Scoped to the active tenant (S5 #1398).
|
|
128
|
+
*/
|
|
129
|
+
static async findBySignalType(db, signalType, tenantScope) {
|
|
130
|
+
return this.findMatchingSubscribers(db, signalType, tenantScope);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get all unique signal types that a subscriber is subscribed to
|
|
134
|
+
*/
|
|
135
|
+
static async getSignalTypes(db, subscriber) {
|
|
136
|
+
const { rows } = await db.query(
|
|
137
|
+
`SELECT DISTINCT signal_type FROM _smrt_dispatch_subscriptions
|
|
138
|
+
WHERE subscriber = ? AND enabled = 1`,
|
|
139
|
+
subscriber
|
|
140
|
+
);
|
|
141
|
+
return rows.map(
|
|
142
|
+
(row) => row.signal_type
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* List all subscriptions, scoped to the active tenant (S5 #1398).
|
|
147
|
+
*/
|
|
148
|
+
static async list(db, enabledOnly = false, tenantScope) {
|
|
149
|
+
const conditions = [];
|
|
150
|
+
const params = [];
|
|
151
|
+
if (enabledOnly) {
|
|
152
|
+
conditions.push("enabled = 1");
|
|
153
|
+
}
|
|
154
|
+
const tenantClause = subscriptionTenantClause(tenantScope, params);
|
|
155
|
+
if (tenantClause) {
|
|
156
|
+
conditions.push(tenantClause);
|
|
157
|
+
}
|
|
158
|
+
let sql = "SELECT * FROM _smrt_dispatch_subscriptions";
|
|
159
|
+
if (conditions.length > 0) {
|
|
160
|
+
sql += ` WHERE ${conditions.join(" AND ")}`;
|
|
161
|
+
}
|
|
162
|
+
sql += " ORDER BY subscriber ASC, signal_type ASC";
|
|
163
|
+
const { rows } = await db.query(sql, ...params);
|
|
164
|
+
return rows.map(
|
|
165
|
+
(row) => DispatchSubscription.fromRow(row)
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Delete a subscription
|
|
170
|
+
*/
|
|
171
|
+
static async delete(db, id) {
|
|
172
|
+
await db.query(`DELETE FROM _smrt_dispatch_subscriptions WHERE id = ?`, id);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Delete subscription by signal type and subscriber, scoped to the active
|
|
176
|
+
* tenant (S5 #1398) so tenant B cannot delete tenant A's subscription.
|
|
177
|
+
*/
|
|
178
|
+
static async deleteByKey(db, signalType, subscriber, tenantScope) {
|
|
179
|
+
const params = [signalType, subscriber];
|
|
180
|
+
let sql = `DELETE FROM _smrt_dispatch_subscriptions WHERE signal_type = ? AND subscriber = ?`;
|
|
181
|
+
const tenantClause = subscriptionTenantClause(tenantScope, params);
|
|
182
|
+
if (tenantClause) {
|
|
183
|
+
sql += ` AND ${tenantClause}`;
|
|
184
|
+
}
|
|
185
|
+
await db.query(sql, ...params);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Delete all subscriptions for a subscriber
|
|
189
|
+
*/
|
|
190
|
+
static async deleteBySubscriber(db, subscriber) {
|
|
191
|
+
await db.query(
|
|
192
|
+
`DELETE FROM _smrt_dispatch_subscriptions WHERE subscriber = ?`,
|
|
193
|
+
subscriber
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Enable a subscription, scoped to the active tenant (S5 #1398).
|
|
198
|
+
*/
|
|
199
|
+
static async enable(db, signalType, subscriber, tenantScope) {
|
|
200
|
+
const params = [
|
|
201
|
+
(/* @__PURE__ */ new Date()).toISOString(),
|
|
202
|
+
signalType,
|
|
203
|
+
subscriber
|
|
204
|
+
];
|
|
205
|
+
let sql = `UPDATE _smrt_dispatch_subscriptions SET enabled = 1, updated_at = ? WHERE signal_type = ? AND subscriber = ?`;
|
|
206
|
+
const tenantClause = subscriptionTenantClause(tenantScope, params);
|
|
207
|
+
if (tenantClause) {
|
|
208
|
+
sql += ` AND ${tenantClause}`;
|
|
209
|
+
}
|
|
210
|
+
await db.query(sql, ...params);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Disable a subscription, scoped to the active tenant (S5 #1398).
|
|
214
|
+
*/
|
|
215
|
+
static async disable(db, signalType, subscriber, tenantScope) {
|
|
216
|
+
const params = [
|
|
217
|
+
(/* @__PURE__ */ new Date()).toISOString(),
|
|
218
|
+
signalType,
|
|
219
|
+
subscriber
|
|
220
|
+
];
|
|
221
|
+
let sql = `UPDATE _smrt_dispatch_subscriptions SET enabled = 0, updated_at = ? WHERE signal_type = ? AND subscriber = ?`;
|
|
222
|
+
const tenantClause = subscriptionTenantClause(tenantScope, params);
|
|
223
|
+
if (tenantClause) {
|
|
224
|
+
sql += ` AND ${tenantClause}`;
|
|
225
|
+
}
|
|
226
|
+
await db.query(sql, ...params);
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Check if subscriptions table exists
|
|
230
|
+
*/
|
|
231
|
+
static async tableExists(db) {
|
|
232
|
+
try {
|
|
233
|
+
await db.query(`SELECT 1 FROM _smrt_dispatch_subscriptions LIMIT 1`);
|
|
234
|
+
return true;
|
|
235
|
+
} catch {
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
export {
|
|
241
|
+
DispatchSubscriptionCollection
|
|
242
|
+
};
|
|
243
|
+
//# sourceMappingURL=DispatchSubscriptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DispatchSubscriptions.js","sources":["../../../src/dispatch/collections/DispatchSubscriptions.ts"],"sourcesContent":["/**\n * DispatchSubscriptionCollection - Storage operations for dispatch subscriptions\n *\n * CRUD operations for the _smrt_dispatch_subscriptions system table.\n */\n\nimport type { DatabaseInterface } from '@happyvertical/sql';\nimport {\n DispatchSubscription,\n type DispatchSubscriptionData,\n} from '../models/DispatchSubscription.js';\nimport type { DispatchTenantScope } from '../tenant-resolver.js';\n\n/**\n * Build a SQL tenant predicate fragment for subscription queries (S5 #1398).\n *\n * Mirrors the dispatch-row scoping, but subscription identity is *per tenant* —\n * a subscription belongs to exactly one scope, so an active tenant sees only its\n * own subscriptions (not also globals), preventing tenant B from finding/\n * mutating tenant A's (or a shared global) subscription row. Semantics:\n *\n * - tenancy off / no scope → no predicate.\n * - active tenant T → `tenant_id = ?`.\n * - tenancy on, no active tenant → `tenant_id IS NULL` (global subs only).\n *\n * Uses `?` positional placeholders (these collection queries bind via the\n * sqlite-style `?` convention used elsewhere in this file).\n *\n * @returns The SQL fragment (without a leading `AND`), or `null` when no\n * predicate applies. When a value is bound it is pushed onto `params`.\n */\nfunction subscriptionTenantClause(\n scope: DispatchTenantScope | undefined,\n params: unknown[],\n): string | null {\n if (!scope?.enforced) {\n return null;\n }\n if (scope.tenantId !== null) {\n params.push(scope.tenantId);\n return 'tenant_id = ?';\n }\n return 'tenant_id IS NULL';\n}\n\n/**\n * Storage operations for subscriptions in _smrt_dispatch_subscriptions table\n */\nexport class DispatchSubscriptionCollection {\n /**\n * Insert or update a subscription.\n *\n * Identity is tenant-scoped (S5 #1398): the conflict key is\n * `(tenant_id, signal_type, subscriber)` so the same (signal_type, subscriber)\n * pair can exist independently per tenant and one tenant cannot overwrite\n * another's subscription. Global (NULL tenant_id) subscriptions are deduped by\n * the NULL-aware upsert path in @happyvertical/sql.\n */\n static async upsert(\n db: DatabaseInterface,\n subscription: DispatchSubscription,\n ): Promise<void> {\n const row = subscription.toRow();\n await db.upsert(\n '_smrt_dispatch_subscriptions',\n ['tenant_id', 'signal_type', 'subscriber'],\n {\n id: row.id,\n signal_type: row.signal_type,\n subscriber: row.subscriber,\n handler: row.handler,\n delivery: row.delivery,\n enabled: row.enabled,\n tenant_id: row.tenant_id,\n created_at: row.created_at,\n updated_at: row.updated_at,\n },\n );\n }\n\n /**\n * Get a subscription by ID\n */\n static async get(\n db: DatabaseInterface,\n id: string,\n ): Promise<DispatchSubscription | null> {\n const result = await db.single`\n SELECT * FROM _smrt_dispatch_subscriptions WHERE id = ${id}\n `;\n\n if (!result) return null;\n return DispatchSubscription.fromRow(result as DispatchSubscriptionData);\n }\n\n /**\n * Find subscription by signal type and subscriber\n */\n static async find(\n db: DatabaseInterface,\n signalType: string,\n subscriber: string,\n ): Promise<DispatchSubscription | null> {\n const result = await db.single`\n SELECT * FROM _smrt_dispatch_subscriptions\n WHERE signal_type = ${signalType} AND subscriber = ${subscriber}\n `;\n\n if (!result) return null;\n return DispatchSubscription.fromRow(result as DispatchSubscriptionData);\n }\n\n /**\n * Get all subscriptions for a subscriber, scoped to the active tenant (S5 #1398).\n */\n static async findBySubscriber(\n db: DatabaseInterface,\n subscriber: string,\n enabledOnly: boolean = true,\n tenantScope?: DispatchTenantScope,\n ): Promise<DispatchSubscription[]> {\n let sql = `SELECT * FROM _smrt_dispatch_subscriptions WHERE subscriber = ?`;\n const params: unknown[] = [subscriber];\n\n if (enabledOnly) {\n sql += ' AND enabled = 1';\n }\n\n const tenantClause = subscriptionTenantClause(tenantScope, params);\n if (tenantClause) {\n sql += ` AND ${tenantClause}`;\n }\n\n sql += ' ORDER BY signal_type ASC';\n\n const { rows } = await db.query(sql, ...params);\n return rows.map((row: Record<string, unknown>) =>\n DispatchSubscription.fromRow(row as unknown as DispatchSubscriptionData),\n );\n }\n\n /**\n * Get all subscriptions that match a signal type\n *\n * Uses SQL-level filtering for exact matches. Wildcard subscriptions\n * (containing '*') are fetched separately and filtered in memory since\n * pattern matching requires application-side regex evaluation.\n */\n static async findMatchingSubscribers(\n db: DatabaseInterface,\n signalType: string,\n tenantScope?: DispatchTenantScope,\n ): Promise<DispatchSubscription[]> {\n // SQL-level: exact match subscriptions (scoped to the active tenant).\n const exactParams: unknown[] = [signalType];\n let exactSql = `SELECT * FROM _smrt_dispatch_subscriptions\n WHERE enabled = 1 AND signal_type = ?`;\n const exactTenantClause = subscriptionTenantClause(\n tenantScope,\n exactParams,\n );\n if (exactTenantClause) {\n exactSql += ` AND ${exactTenantClause}`;\n }\n const { rows: exactRows } = await db.query(exactSql, ...exactParams);\n\n const exactSubs = exactRows.map((row: Record<string, unknown>) =>\n DispatchSubscription.fromRow(row as unknown as DispatchSubscriptionData),\n );\n\n // SQL-level: wildcard subscriptions (contain '*'), scoped to the tenant.\n // Must be filtered in memory for pattern matching.\n const wildcardParams: unknown[] = [];\n let wildcardSql = `SELECT * FROM _smrt_dispatch_subscriptions\n WHERE enabled = 1 AND signal_type LIKE '%*%'`;\n const wildcardTenantClause = subscriptionTenantClause(\n tenantScope,\n wildcardParams,\n );\n if (wildcardTenantClause) {\n wildcardSql += ` AND ${wildcardTenantClause}`;\n }\n const { rows: wildcardRows } = await db.query(\n wildcardSql,\n ...wildcardParams,\n );\n\n const wildcardSubs = wildcardRows\n .map((row: Record<string, unknown>) =>\n DispatchSubscription.fromRow(\n row as unknown as DispatchSubscriptionData,\n ),\n )\n .filter((sub) => sub.matches(signalType));\n\n return [...exactSubs, ...wildcardSubs];\n }\n\n /**\n * Find all enabled subscriptions matching a signal type\n *\n * Alias for findMatchingSubscribers — used by emit() to determine\n * fan-out targets. Scoped to the active tenant (S5 #1398).\n */\n static async findBySignalType(\n db: DatabaseInterface,\n signalType: string,\n tenantScope?: DispatchTenantScope,\n ): Promise<DispatchSubscription[]> {\n return this.findMatchingSubscribers(db, signalType, tenantScope);\n }\n\n /**\n * Get all unique signal types that a subscriber is subscribed to\n */\n static async getSignalTypes(\n db: DatabaseInterface,\n subscriber: string,\n ): Promise<string[]> {\n const { rows } = await db.query(\n `SELECT DISTINCT signal_type FROM _smrt_dispatch_subscriptions\n WHERE subscriber = ? AND enabled = 1`,\n subscriber,\n );\n\n return rows.map(\n (row: Record<string, unknown>) => row.signal_type as string,\n );\n }\n\n /**\n * List all subscriptions, scoped to the active tenant (S5 #1398).\n */\n static async list(\n db: DatabaseInterface,\n enabledOnly: boolean = false,\n tenantScope?: DispatchTenantScope,\n ): Promise<DispatchSubscription[]> {\n const conditions: string[] = [];\n const params: unknown[] = [];\n if (enabledOnly) {\n conditions.push('enabled = 1');\n }\n const tenantClause = subscriptionTenantClause(tenantScope, params);\n if (tenantClause) {\n conditions.push(tenantClause);\n }\n\n let sql = 'SELECT * FROM _smrt_dispatch_subscriptions';\n if (conditions.length > 0) {\n sql += ` WHERE ${conditions.join(' AND ')}`;\n }\n sql += ' ORDER BY subscriber ASC, signal_type ASC';\n\n const { rows } = await db.query(sql, ...params);\n return rows.map((row: Record<string, unknown>) =>\n DispatchSubscription.fromRow(row as unknown as DispatchSubscriptionData),\n );\n }\n\n /**\n * Delete a subscription\n */\n static async delete(db: DatabaseInterface, id: string): Promise<void> {\n await db.query(`DELETE FROM _smrt_dispatch_subscriptions WHERE id = ?`, id);\n }\n\n /**\n * Delete subscription by signal type and subscriber, scoped to the active\n * tenant (S5 #1398) so tenant B cannot delete tenant A's subscription.\n */\n static async deleteByKey(\n db: DatabaseInterface,\n signalType: string,\n subscriber: string,\n tenantScope?: DispatchTenantScope,\n ): Promise<void> {\n const params: unknown[] = [signalType, subscriber];\n let sql = `DELETE FROM _smrt_dispatch_subscriptions WHERE signal_type = ? AND subscriber = ?`;\n const tenantClause = subscriptionTenantClause(tenantScope, params);\n if (tenantClause) {\n sql += ` AND ${tenantClause}`;\n }\n await db.query(sql, ...params);\n }\n\n /**\n * Delete all subscriptions for a subscriber\n */\n static async deleteBySubscriber(\n db: DatabaseInterface,\n subscriber: string,\n ): Promise<void> {\n await db.query(\n `DELETE FROM _smrt_dispatch_subscriptions WHERE subscriber = ?`,\n subscriber,\n );\n }\n\n /**\n * Enable a subscription, scoped to the active tenant (S5 #1398).\n */\n static async enable(\n db: DatabaseInterface,\n signalType: string,\n subscriber: string,\n tenantScope?: DispatchTenantScope,\n ): Promise<void> {\n const params: unknown[] = [\n new Date().toISOString(),\n signalType,\n subscriber,\n ];\n let sql = `UPDATE _smrt_dispatch_subscriptions SET enabled = 1, updated_at = ? WHERE signal_type = ? AND subscriber = ?`;\n const tenantClause = subscriptionTenantClause(tenantScope, params);\n if (tenantClause) {\n sql += ` AND ${tenantClause}`;\n }\n await db.query(sql, ...params);\n }\n\n /**\n * Disable a subscription, scoped to the active tenant (S5 #1398).\n */\n static async disable(\n db: DatabaseInterface,\n signalType: string,\n subscriber: string,\n tenantScope?: DispatchTenantScope,\n ): Promise<void> {\n const params: unknown[] = [\n new Date().toISOString(),\n signalType,\n subscriber,\n ];\n let sql = `UPDATE _smrt_dispatch_subscriptions SET enabled = 0, updated_at = ? WHERE signal_type = ? AND subscriber = ?`;\n const tenantClause = subscriptionTenantClause(tenantScope, params);\n if (tenantClause) {\n sql += ` AND ${tenantClause}`;\n }\n await db.query(sql, ...params);\n }\n\n /**\n * Check if subscriptions table exists\n */\n static async tableExists(db: DatabaseInterface): Promise<boolean> {\n try {\n await db.query(`SELECT 1 FROM _smrt_dispatch_subscriptions LIMIT 1`);\n return true;\n } catch {\n return false;\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { DatabaseInterface } from '@happyvertical/sql';
|
|
2
|
+
import { Dispatch } from '../models/Dispatch.js';
|
|
3
|
+
import { DispatchTenantScope } from '../tenant-resolver.js';
|
|
4
|
+
import { DispatchCleanupOptions, DispatchCleanupResult, DispatchListOptions, DispatchRetryOptions, DispatchStatus } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Storage operations for dispatches in _smrt_dispatch table
|
|
7
|
+
*/
|
|
8
|
+
export declare class DispatchCollection {
|
|
9
|
+
/**
|
|
10
|
+
* Insert a new dispatch
|
|
11
|
+
*/
|
|
12
|
+
static insert(db: DatabaseInterface, dispatch: Dispatch): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Update an existing dispatch
|
|
15
|
+
*/
|
|
16
|
+
static update(db: DatabaseInterface, dispatch: Dispatch): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Get a dispatch by ID (unscoped).
|
|
19
|
+
*
|
|
20
|
+
* Internal/system use only — applies no tenant filter. Public reads go
|
|
21
|
+
* through the DispatchBus, which uses {@link getScoped} so a caller cannot
|
|
22
|
+
* fetch another tenant's dispatch by id (S5 #1398).
|
|
23
|
+
*/
|
|
24
|
+
static get(db: DatabaseInterface, id: string): Promise<Dispatch | null>;
|
|
25
|
+
/**
|
|
26
|
+
* Get a dispatch by ID, enforcing the active tenant scope (S5 #1398).
|
|
27
|
+
*
|
|
28
|
+
* Applies the same tenant predicate as {@link list}/{@link findPending}, so a
|
|
29
|
+
* cross-tenant or out-of-scope id lookup returns `null` rather than leaking
|
|
30
|
+
* the row. The scope is derived server-side by the DispatchBus.
|
|
31
|
+
*/
|
|
32
|
+
static getScoped(db: DatabaseInterface, id: string, tenantScope?: DispatchTenantScope): Promise<Dispatch | null>;
|
|
33
|
+
/**
|
|
34
|
+
* List dispatches with filtering
|
|
35
|
+
*/
|
|
36
|
+
static list(db: DatabaseInterface, options?: DispatchListOptions): Promise<Dispatch[]>;
|
|
37
|
+
/**
|
|
38
|
+
* Find pending dispatches for a set of signal types
|
|
39
|
+
*
|
|
40
|
+
* @param subscriber - When provided, filters to dispatches with no target
|
|
41
|
+
* or targeted specifically at this subscriber (for fan-out delivery)
|
|
42
|
+
* @param tenantScope - Active tenant scope (S5 #1398). Derived server-side by
|
|
43
|
+
* the bus; restricts results so a subscriber in one tenant cannot see
|
|
44
|
+
* another tenant's dispatch. See {@link pushTenantPredicate} for the exact
|
|
45
|
+
* semantics (off → no filter; active tenant → that tenant + global; on but
|
|
46
|
+
* no tenant → global only).
|
|
47
|
+
*/
|
|
48
|
+
static findPending(db: DatabaseInterface, signalTypes: string[], limit?: number, subscriber?: string, tenantScope?: DispatchTenantScope): Promise<Dispatch[]>;
|
|
49
|
+
/**
|
|
50
|
+
* Atomically claim a pending dispatch for processing (S5 #1398).
|
|
51
|
+
*
|
|
52
|
+
* Performs a conditional `UPDATE ... WHERE id = ? AND status = 'pending'`
|
|
53
|
+
* (plus the tenant predicate for the active scope) and reports whether the
|
|
54
|
+
* row was claimed by THIS call. Only the caller whose update affected a row
|
|
55
|
+
* may run the handler, which closes the claim TOCTOU window where a `process`
|
|
56
|
+
* filter-then-update could let two workers (or a tenant-scoped and a
|
|
57
|
+
* system-scoped processor) both pick up the same compete/global dispatch.
|
|
58
|
+
*
|
|
59
|
+
* On a successful claim the dispatch's status/attempts/updated_at are
|
|
60
|
+
* advanced in the DB; the in-memory `dispatch` instance is updated to match
|
|
61
|
+
* so the caller can proceed to `update()` it to completed/failed.
|
|
62
|
+
*
|
|
63
|
+
* @returns `true` if this call claimed the dispatch, `false` if another
|
|
64
|
+
* worker already moved it out of `pending` (or it is not visible in scope).
|
|
65
|
+
*/
|
|
66
|
+
static claim(db: DatabaseInterface, dispatch: Dispatch, tenantScope?: DispatchTenantScope): Promise<boolean>;
|
|
67
|
+
/**
|
|
68
|
+
* Find failed dispatches eligible for retry.
|
|
69
|
+
*
|
|
70
|
+
* @param tenantScope - Active tenant scope (S5 #1398). Derived server-side by
|
|
71
|
+
* the bus; restricts retryable rows to the active tenant (plus global) so a
|
|
72
|
+
* tenant's `retry()` cannot reset another tenant's failed dispatches. See
|
|
73
|
+
* {@link pushTenantPredicate} for the exact semantics.
|
|
74
|
+
*/
|
|
75
|
+
static findRetryable(db: DatabaseInterface, options?: DispatchRetryOptions, tenantScope?: DispatchTenantScope): Promise<Dispatch[]>;
|
|
76
|
+
/**
|
|
77
|
+
* Count dispatches by status
|
|
78
|
+
*/
|
|
79
|
+
static countByStatus(db: DatabaseInterface, status: DispatchStatus): Promise<number>;
|
|
80
|
+
/**
|
|
81
|
+
* Delete a dispatch
|
|
82
|
+
*/
|
|
83
|
+
static delete(db: DatabaseInterface, id: string): Promise<void>;
|
|
84
|
+
/**
|
|
85
|
+
* Cleanup old dispatches.
|
|
86
|
+
*
|
|
87
|
+
* @param tenantScope - Active tenant scope (S5 #1398). Derived server-side by
|
|
88
|
+
* the bus; restricts deletions to the active tenant (plus global) so a
|
|
89
|
+
* tenant's `cleanup()` cannot delete another tenant's dispatches. See
|
|
90
|
+
* {@link pushTenantPredicate} for the exact semantics.
|
|
91
|
+
*/
|
|
92
|
+
static cleanup(db: DatabaseInterface, options?: DispatchCleanupOptions, tenantScope?: DispatchTenantScope): Promise<DispatchCleanupResult>;
|
|
93
|
+
/**
|
|
94
|
+
* Check if dispatch table exists
|
|
95
|
+
*/
|
|
96
|
+
static tableExists(db: DatabaseInterface): Promise<boolean>;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=Dispatches.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dispatches.d.ts","sourceRoot":"","sources":["../../../src/dispatch/collections/Dispatches.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAqB,MAAM,uBAAuB,CAAC;AACpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACf,MAAM,aAAa,CAAC;AAmCrB;;GAEG;AACH,qBAAa,kBAAkB;IAC7B;;OAEG;WACU,MAAM,CACjB,EAAE,EAAE,iBAAiB,EACrB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,IAAI,CAAC;IA0BhB;;OAEG;WACU,MAAM,CACjB,EAAE,EAAE,iBAAiB,EACrB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,IAAI,CAAC;IAyBhB;;;;;;OAMG;WACU,GAAG,CACd,EAAE,EAAE,iBAAiB,EACrB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAS3B;;;;;;OAMG;WACU,SAAS,CACpB,EAAE,EAAE,iBAAiB,EACrB,EAAE,EAAE,MAAM,EACV,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAe3B;;OAEG;WACU,IAAI,CACf,EAAE,EAAE,iBAAiB,EACrB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAuFtB;;;;;;;;;;OAUG;WACU,WAAW,CACtB,EAAE,EAAE,iBAAiB,EACrB,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,GAAE,MAAY,EACnB,UAAU,CAAC,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAsCtB;;;;;;;;;;;;;;;;OAgBG;WACU,KAAK,CAChB,EAAE,EAAE,iBAAiB,EACrB,QAAQ,EAAE,QAAQ,EAClB,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,OAAO,CAAC;IA6BnB;;;;;;;OAOG;WACU,aAAa,CACxB,EAAE,EAAE,iBAAiB,EACrB,OAAO,GAAE,oBAAyB,EAClC,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAuCtB;;OAEG;WACU,aAAa,CACxB,EAAE,EAAE,iBAAiB,EACrB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,MAAM,CAAC;IAOlB;;OAEG;WACU,MAAM,CAAC,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE;;;;;;;OAOG;WACU,OAAO,CAClB,EAAE,EAAE,iBAAiB,EACrB,OAAO,GAAE,sBAA2B,EACpC,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,qBAAqB,CAAC;IA0CjC;;OAEG;WACU,WAAW,CAAC,EAAE,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;CAQlE"}
|