@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,358 @@
|
|
|
1
|
+
import { Dispatch } from "../models/Dispatch.js";
|
|
2
|
+
function pushTenantPredicate(conditions, params, scope, placeholder) {
|
|
3
|
+
if (!scope?.enforced) {
|
|
4
|
+
return false;
|
|
5
|
+
}
|
|
6
|
+
if (scope.tenantId !== null) {
|
|
7
|
+
conditions.push(`(tenant_id = ${placeholder} OR tenant_id IS NULL)`);
|
|
8
|
+
params.push(scope.tenantId);
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
conditions.push("tenant_id IS NULL");
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
class DispatchCollection {
|
|
15
|
+
/**
|
|
16
|
+
* Insert a new dispatch
|
|
17
|
+
*/
|
|
18
|
+
static async insert(db, dispatch) {
|
|
19
|
+
const row = dispatch.toRow();
|
|
20
|
+
await db.query(
|
|
21
|
+
`INSERT INTO _smrt_dispatch
|
|
22
|
+
(id, type, source, source_id, payload, status, attempts, last_error,
|
|
23
|
+
processed_at, processed_by, target_subscriber, correlation_id, tenant_id, metadata, created_at, updated_at)
|
|
24
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16)`,
|
|
25
|
+
row.id,
|
|
26
|
+
row.type,
|
|
27
|
+
row.source,
|
|
28
|
+
row.source_id,
|
|
29
|
+
row.payload,
|
|
30
|
+
row.status,
|
|
31
|
+
row.attempts,
|
|
32
|
+
row.last_error,
|
|
33
|
+
row.processed_at,
|
|
34
|
+
row.processed_by,
|
|
35
|
+
row.target_subscriber,
|
|
36
|
+
row.correlation_id,
|
|
37
|
+
row.tenant_id,
|
|
38
|
+
row.metadata,
|
|
39
|
+
row.created_at,
|
|
40
|
+
row.updated_at
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Update an existing dispatch
|
|
45
|
+
*/
|
|
46
|
+
static async update(db, dispatch) {
|
|
47
|
+
const row = dispatch.toRow();
|
|
48
|
+
await db.query(
|
|
49
|
+
`UPDATE _smrt_dispatch SET
|
|
50
|
+
type = $1, source = $2, source_id = $3, payload = $4, status = $5,
|
|
51
|
+
attempts = $6, last_error = $7, processed_at = $8, processed_by = $9,
|
|
52
|
+
target_subscriber = $10, correlation_id = $11, metadata = $12, updated_at = $13
|
|
53
|
+
WHERE id = $14`,
|
|
54
|
+
row.type,
|
|
55
|
+
row.source,
|
|
56
|
+
row.source_id,
|
|
57
|
+
row.payload,
|
|
58
|
+
row.status,
|
|
59
|
+
row.attempts,
|
|
60
|
+
row.last_error,
|
|
61
|
+
row.processed_at,
|
|
62
|
+
row.processed_by,
|
|
63
|
+
row.target_subscriber,
|
|
64
|
+
row.correlation_id,
|
|
65
|
+
row.metadata,
|
|
66
|
+
row.updated_at,
|
|
67
|
+
row.id
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get a dispatch by ID (unscoped).
|
|
72
|
+
*
|
|
73
|
+
* Internal/system use only — applies no tenant filter. Public reads go
|
|
74
|
+
* through the DispatchBus, which uses {@link getScoped} so a caller cannot
|
|
75
|
+
* fetch another tenant's dispatch by id (S5 #1398).
|
|
76
|
+
*/
|
|
77
|
+
static async get(db, id) {
|
|
78
|
+
const result = await db.single`
|
|
79
|
+
SELECT * FROM _smrt_dispatch WHERE id = ${id}
|
|
80
|
+
`;
|
|
81
|
+
if (!result) return null;
|
|
82
|
+
return Dispatch.fromRow(result);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get a dispatch by ID, enforcing the active tenant scope (S5 #1398).
|
|
86
|
+
*
|
|
87
|
+
* Applies the same tenant predicate as {@link list}/{@link findPending}, so a
|
|
88
|
+
* cross-tenant or out-of-scope id lookup returns `null` rather than leaking
|
|
89
|
+
* the row. The scope is derived server-side by the DispatchBus.
|
|
90
|
+
*/
|
|
91
|
+
static async getScoped(db, id, tenantScope) {
|
|
92
|
+
const conditions = ["id = $1"];
|
|
93
|
+
const params = [id];
|
|
94
|
+
pushTenantPredicate(conditions, params, tenantScope, "$2");
|
|
95
|
+
const { rows } = await db.query(
|
|
96
|
+
`SELECT * FROM _smrt_dispatch WHERE ${conditions.join(" AND ")} LIMIT 1`,
|
|
97
|
+
...params
|
|
98
|
+
);
|
|
99
|
+
if (rows.length === 0) return null;
|
|
100
|
+
return Dispatch.fromRow(rows[0]);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* List dispatches with filtering
|
|
104
|
+
*/
|
|
105
|
+
static async list(db, options = {}) {
|
|
106
|
+
const conditions = [];
|
|
107
|
+
const params = [];
|
|
108
|
+
let paramIndex = 1;
|
|
109
|
+
if (options.status) {
|
|
110
|
+
conditions.push(`status = $${paramIndex++}`);
|
|
111
|
+
params.push(options.status);
|
|
112
|
+
}
|
|
113
|
+
if (options.source) {
|
|
114
|
+
conditions.push(`source = $${paramIndex++}`);
|
|
115
|
+
params.push(options.source);
|
|
116
|
+
}
|
|
117
|
+
if (options.type) {
|
|
118
|
+
conditions.push(`type = $${paramIndex++}`);
|
|
119
|
+
params.push(options.type);
|
|
120
|
+
}
|
|
121
|
+
if (options.targetSubscriber) {
|
|
122
|
+
conditions.push(`target_subscriber = $${paramIndex++}`);
|
|
123
|
+
params.push(options.targetSubscriber);
|
|
124
|
+
}
|
|
125
|
+
if (options.correlationId !== void 0) {
|
|
126
|
+
conditions.push(`correlation_id = $${paramIndex++}`);
|
|
127
|
+
params.push(options.correlationId);
|
|
128
|
+
}
|
|
129
|
+
if (pushTenantPredicate(
|
|
130
|
+
conditions,
|
|
131
|
+
params,
|
|
132
|
+
options.tenantScope,
|
|
133
|
+
`$${paramIndex}`
|
|
134
|
+
)) {
|
|
135
|
+
paramIndex++;
|
|
136
|
+
}
|
|
137
|
+
let sql = "SELECT * FROM _smrt_dispatch";
|
|
138
|
+
if (conditions.length > 0) {
|
|
139
|
+
sql += ` WHERE ${conditions.join(" AND ")}`;
|
|
140
|
+
}
|
|
141
|
+
const allowedOrderBy = [
|
|
142
|
+
"created_at DESC",
|
|
143
|
+
"created_at ASC",
|
|
144
|
+
"updated_at DESC",
|
|
145
|
+
"updated_at ASC",
|
|
146
|
+
"type",
|
|
147
|
+
"type DESC",
|
|
148
|
+
"type ASC",
|
|
149
|
+
"status",
|
|
150
|
+
"status DESC",
|
|
151
|
+
"status ASC",
|
|
152
|
+
"source",
|
|
153
|
+
"source DESC",
|
|
154
|
+
"source ASC"
|
|
155
|
+
];
|
|
156
|
+
const safeOrderBy = options.orderBy && allowedOrderBy.includes(options.orderBy) ? options.orderBy : "created_at DESC";
|
|
157
|
+
sql += ` ORDER BY ${safeOrderBy}`;
|
|
158
|
+
if (options.limit !== void 0) {
|
|
159
|
+
sql += ` LIMIT $${paramIndex++}`;
|
|
160
|
+
params.push(options.limit);
|
|
161
|
+
}
|
|
162
|
+
if (options.offset !== void 0) {
|
|
163
|
+
sql += ` OFFSET $${paramIndex++}`;
|
|
164
|
+
params.push(options.offset);
|
|
165
|
+
}
|
|
166
|
+
const { rows } = await db.query(sql, ...params);
|
|
167
|
+
return rows.map(
|
|
168
|
+
(row) => Dispatch.fromRow(row)
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Find pending dispatches for a set of signal types
|
|
173
|
+
*
|
|
174
|
+
* @param subscriber - When provided, filters to dispatches with no target
|
|
175
|
+
* or targeted specifically at this subscriber (for fan-out delivery)
|
|
176
|
+
* @param tenantScope - Active tenant scope (S5 #1398). Derived server-side by
|
|
177
|
+
* the bus; restricts results so a subscriber in one tenant cannot see
|
|
178
|
+
* another tenant's dispatch. See {@link pushTenantPredicate} for the exact
|
|
179
|
+
* semantics (off → no filter; active tenant → that tenant + global; on but
|
|
180
|
+
* no tenant → global only).
|
|
181
|
+
*/
|
|
182
|
+
static async findPending(db, signalTypes, limit = 100, subscriber, tenantScope) {
|
|
183
|
+
if (signalTypes.length === 0) {
|
|
184
|
+
return [];
|
|
185
|
+
}
|
|
186
|
+
let paramIndex = 1;
|
|
187
|
+
const placeholders = signalTypes.map(() => `$${paramIndex++}`).join(", ");
|
|
188
|
+
const conditions = [
|
|
189
|
+
"status = 'pending'",
|
|
190
|
+
`type IN (${placeholders})`
|
|
191
|
+
];
|
|
192
|
+
const params = [...signalTypes];
|
|
193
|
+
if (subscriber) {
|
|
194
|
+
conditions.push(
|
|
195
|
+
`(target_subscriber IS NULL OR target_subscriber = $${paramIndex++})`
|
|
196
|
+
);
|
|
197
|
+
params.push(subscriber);
|
|
198
|
+
}
|
|
199
|
+
if (pushTenantPredicate(conditions, params, tenantScope, `$${paramIndex}`)) {
|
|
200
|
+
paramIndex++;
|
|
201
|
+
}
|
|
202
|
+
const sql = `SELECT * FROM _smrt_dispatch
|
|
203
|
+
WHERE ${conditions.join(" AND ")}
|
|
204
|
+
ORDER BY created_at ASC LIMIT $${paramIndex}`;
|
|
205
|
+
params.push(limit);
|
|
206
|
+
const { rows } = await db.query(sql, ...params);
|
|
207
|
+
return rows.map(
|
|
208
|
+
(row) => Dispatch.fromRow(row)
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Atomically claim a pending dispatch for processing (S5 #1398).
|
|
213
|
+
*
|
|
214
|
+
* Performs a conditional `UPDATE ... WHERE id = ? AND status = 'pending'`
|
|
215
|
+
* (plus the tenant predicate for the active scope) and reports whether the
|
|
216
|
+
* row was claimed by THIS call. Only the caller whose update affected a row
|
|
217
|
+
* may run the handler, which closes the claim TOCTOU window where a `process`
|
|
218
|
+
* filter-then-update could let two workers (or a tenant-scoped and a
|
|
219
|
+
* system-scoped processor) both pick up the same compete/global dispatch.
|
|
220
|
+
*
|
|
221
|
+
* On a successful claim the dispatch's status/attempts/updated_at are
|
|
222
|
+
* advanced in the DB; the in-memory `dispatch` instance is updated to match
|
|
223
|
+
* so the caller can proceed to `update()` it to completed/failed.
|
|
224
|
+
*
|
|
225
|
+
* @returns `true` if this call claimed the dispatch, `false` if another
|
|
226
|
+
* worker already moved it out of `pending` (or it is not visible in scope).
|
|
227
|
+
*/
|
|
228
|
+
static async claim(db, dispatch, tenantScope) {
|
|
229
|
+
dispatch.markProcessing();
|
|
230
|
+
const row = dispatch.toRow();
|
|
231
|
+
const conditions = ["id = $4", "status = 'pending'"];
|
|
232
|
+
const params = [
|
|
233
|
+
row.status,
|
|
234
|
+
row.attempts,
|
|
235
|
+
row.updated_at,
|
|
236
|
+
row.id
|
|
237
|
+
];
|
|
238
|
+
let paramIndex = 5;
|
|
239
|
+
if (pushTenantPredicate(conditions, params, tenantScope, `$${paramIndex}`)) {
|
|
240
|
+
paramIndex++;
|
|
241
|
+
}
|
|
242
|
+
const { rowCount } = await db.query(
|
|
243
|
+
`UPDATE _smrt_dispatch
|
|
244
|
+
SET status = $1, attempts = $2, updated_at = $3
|
|
245
|
+
WHERE ${conditions.join(" AND ")}`,
|
|
246
|
+
...params
|
|
247
|
+
);
|
|
248
|
+
return (rowCount ?? 0) > 0;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Find failed dispatches eligible for retry.
|
|
252
|
+
*
|
|
253
|
+
* @param tenantScope - Active tenant scope (S5 #1398). Derived server-side by
|
|
254
|
+
* the bus; restricts retryable rows to the active tenant (plus global) so a
|
|
255
|
+
* tenant's `retry()` cannot reset another tenant's failed dispatches. See
|
|
256
|
+
* {@link pushTenantPredicate} for the exact semantics.
|
|
257
|
+
*/
|
|
258
|
+
static async findRetryable(db, options = {}, tenantScope) {
|
|
259
|
+
const conditions = ["status = 'failed'"];
|
|
260
|
+
const params = [];
|
|
261
|
+
let paramIndex = 1;
|
|
262
|
+
if (options.maxAttempts) {
|
|
263
|
+
conditions.push(`attempts < $${paramIndex++}`);
|
|
264
|
+
params.push(options.maxAttempts);
|
|
265
|
+
}
|
|
266
|
+
if (options.olderThan) {
|
|
267
|
+
conditions.push(`created_at < $${paramIndex++}`);
|
|
268
|
+
params.push(options.olderThan.toISOString());
|
|
269
|
+
}
|
|
270
|
+
if (options.signalTypes && options.signalTypes.length > 0) {
|
|
271
|
+
const placeholders = options.signalTypes.map(() => `$${paramIndex++}`).join(", ");
|
|
272
|
+
conditions.push(`type IN (${placeholders})`);
|
|
273
|
+
params.push(...options.signalTypes);
|
|
274
|
+
}
|
|
275
|
+
if (pushTenantPredicate(conditions, params, tenantScope, `$${paramIndex}`)) {
|
|
276
|
+
paramIndex++;
|
|
277
|
+
}
|
|
278
|
+
const { rows } = await db.query(
|
|
279
|
+
`SELECT * FROM _smrt_dispatch WHERE ${conditions.join(" AND ")} ORDER BY created_at ASC`,
|
|
280
|
+
...params
|
|
281
|
+
);
|
|
282
|
+
return rows.map(
|
|
283
|
+
(row) => Dispatch.fromRow(row)
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Count dispatches by status
|
|
288
|
+
*/
|
|
289
|
+
static async countByStatus(db, status) {
|
|
290
|
+
const result = await db.single`
|
|
291
|
+
SELECT COUNT(*) as count FROM _smrt_dispatch WHERE status = ${status}
|
|
292
|
+
`;
|
|
293
|
+
return result?.count || 0;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Delete a dispatch
|
|
297
|
+
*/
|
|
298
|
+
static async delete(db, id) {
|
|
299
|
+
await db.query(`DELETE FROM _smrt_dispatch WHERE id = $1`, id);
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Cleanup old dispatches.
|
|
303
|
+
*
|
|
304
|
+
* @param tenantScope - Active tenant scope (S5 #1398). Derived server-side by
|
|
305
|
+
* the bus; restricts deletions to the active tenant (plus global) so a
|
|
306
|
+
* tenant's `cleanup()` cannot delete another tenant's dispatches. See
|
|
307
|
+
* {@link pushTenantPredicate} for the exact semantics.
|
|
308
|
+
*/
|
|
309
|
+
static async cleanup(db, options = {}, tenantScope) {
|
|
310
|
+
const result = {
|
|
311
|
+
completedDeleted: 0,
|
|
312
|
+
failedDeleted: 0
|
|
313
|
+
};
|
|
314
|
+
if (options.completedOlderThanDays) {
|
|
315
|
+
const cutoff = /* @__PURE__ */ new Date();
|
|
316
|
+
cutoff.setDate(cutoff.getDate() - options.completedOlderThanDays);
|
|
317
|
+
const conditions = [
|
|
318
|
+
"status = 'completed'",
|
|
319
|
+
"processed_at < $1"
|
|
320
|
+
];
|
|
321
|
+
const params = [cutoff.toISOString()];
|
|
322
|
+
pushTenantPredicate(conditions, params, tenantScope, "$2");
|
|
323
|
+
const { rowCount } = await db.query(
|
|
324
|
+
`DELETE FROM _smrt_dispatch WHERE ${conditions.join(" AND ")}`,
|
|
325
|
+
...params
|
|
326
|
+
);
|
|
327
|
+
result.completedDeleted = rowCount || 0;
|
|
328
|
+
}
|
|
329
|
+
if (options.failedOlderThanDays) {
|
|
330
|
+
const cutoff = /* @__PURE__ */ new Date();
|
|
331
|
+
cutoff.setDate(cutoff.getDate() - options.failedOlderThanDays);
|
|
332
|
+
const conditions = ["status = 'failed'", "updated_at < $1"];
|
|
333
|
+
const params = [cutoff.toISOString()];
|
|
334
|
+
pushTenantPredicate(conditions, params, tenantScope, "$2");
|
|
335
|
+
const { rowCount } = await db.query(
|
|
336
|
+
`DELETE FROM _smrt_dispatch WHERE ${conditions.join(" AND ")}`,
|
|
337
|
+
...params
|
|
338
|
+
);
|
|
339
|
+
result.failedDeleted = rowCount || 0;
|
|
340
|
+
}
|
|
341
|
+
return result;
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Check if dispatch table exists
|
|
345
|
+
*/
|
|
346
|
+
static async tableExists(db) {
|
|
347
|
+
try {
|
|
348
|
+
await db.query(`SELECT 1 FROM _smrt_dispatch LIMIT 1`);
|
|
349
|
+
return true;
|
|
350
|
+
} catch {
|
|
351
|
+
return false;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
export {
|
|
356
|
+
DispatchCollection
|
|
357
|
+
};
|
|
358
|
+
//# sourceMappingURL=Dispatches.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dispatches.js","sources":["../../../src/dispatch/collections/Dispatches.ts"],"sourcesContent":["/**\n * DispatchCollection - Storage operations for dispatch messages\n *\n * CRUD operations for the _smrt_dispatch system table.\n */\n\nimport type { DatabaseInterface } from '@happyvertical/sql';\nimport { Dispatch, type DispatchData } from '../models/Dispatch.js';\nimport type { DispatchTenantScope } from '../tenant-resolver.js';\nimport type {\n DispatchCleanupOptions,\n DispatchCleanupResult,\n DispatchListOptions,\n DispatchRetryOptions,\n DispatchStatus,\n} from '../types.js';\n\n/**\n * Build the SQL tenant predicate for the active scope (S5 #1398).\n *\n * Appends a parameterized condition to `conditions` (and the corresponding\n * value to `params`) based on the resolved {@link DispatchTenantScope}:\n *\n * - tenancy off / no scope → no predicate (pre-tenancy behavior)\n * - `enforced` + active tenant T → `(tenant_id = ? OR tenant_id IS NULL)`\n * - `enforced` + no active tenant → `tenant_id IS NULL` (fail-closed global)\n *\n * @param placeholder - Engine-specific positional placeholder (e.g. `$3`) used\n * when a tenant id value is bound. Ignored for the no-value branches.\n * @returns `true` when a value placeholder was consumed (so the caller can\n * advance its param index), `false` otherwise.\n */\nfunction pushTenantPredicate(\n conditions: string[],\n params: unknown[],\n scope: DispatchTenantScope | undefined,\n placeholder: string,\n): boolean {\n if (!scope?.enforced) {\n return false;\n }\n if (scope.tenantId !== null) {\n conditions.push(`(tenant_id = ${placeholder} OR tenant_id IS NULL)`);\n params.push(scope.tenantId);\n return true;\n }\n conditions.push('tenant_id IS NULL');\n return false;\n}\n\n/**\n * Storage operations for dispatches in _smrt_dispatch table\n */\nexport class DispatchCollection {\n /**\n * Insert a new dispatch\n */\n static async insert(\n db: DatabaseInterface,\n dispatch: Dispatch,\n ): Promise<void> {\n const row = dispatch.toRow();\n await db.query(\n `INSERT INTO _smrt_dispatch\n (id, type, source, source_id, payload, status, attempts, last_error,\n processed_at, processed_by, target_subscriber, correlation_id, tenant_id, metadata, created_at, updated_at)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16)`,\n row.id,\n row.type,\n row.source,\n row.source_id,\n row.payload,\n row.status,\n row.attempts,\n row.last_error,\n row.processed_at,\n row.processed_by,\n row.target_subscriber,\n row.correlation_id,\n row.tenant_id,\n row.metadata,\n row.created_at,\n row.updated_at,\n );\n }\n\n /**\n * Update an existing dispatch\n */\n static async update(\n db: DatabaseInterface,\n dispatch: Dispatch,\n ): Promise<void> {\n const row = dispatch.toRow();\n await db.query(\n `UPDATE _smrt_dispatch SET\n type = $1, source = $2, source_id = $3, payload = $4, status = $5,\n attempts = $6, last_error = $7, processed_at = $8, processed_by = $9,\n target_subscriber = $10, correlation_id = $11, metadata = $12, updated_at = $13\n WHERE id = $14`,\n row.type,\n row.source,\n row.source_id,\n row.payload,\n row.status,\n row.attempts,\n row.last_error,\n row.processed_at,\n row.processed_by,\n row.target_subscriber,\n row.correlation_id,\n row.metadata,\n row.updated_at,\n row.id,\n );\n }\n\n /**\n * Get a dispatch by ID (unscoped).\n *\n * Internal/system use only — applies no tenant filter. Public reads go\n * through the DispatchBus, which uses {@link getScoped} so a caller cannot\n * fetch another tenant's dispatch by id (S5 #1398).\n */\n static async get(\n db: DatabaseInterface,\n id: string,\n ): Promise<Dispatch | null> {\n const result = await db.single`\n SELECT * FROM _smrt_dispatch WHERE id = ${id}\n `;\n\n if (!result) return null;\n return Dispatch.fromRow(result as DispatchData);\n }\n\n /**\n * Get a dispatch by ID, enforcing the active tenant scope (S5 #1398).\n *\n * Applies the same tenant predicate as {@link list}/{@link findPending}, so a\n * cross-tenant or out-of-scope id lookup returns `null` rather than leaking\n * the row. The scope is derived server-side by the DispatchBus.\n */\n static async getScoped(\n db: DatabaseInterface,\n id: string,\n tenantScope?: DispatchTenantScope,\n ): Promise<Dispatch | null> {\n const conditions: string[] = ['id = $1'];\n const params: unknown[] = [id];\n\n pushTenantPredicate(conditions, params, tenantScope, '$2');\n\n const { rows } = await db.query(\n `SELECT * FROM _smrt_dispatch WHERE ${conditions.join(' AND ')} LIMIT 1`,\n ...params,\n );\n\n if (rows.length === 0) return null;\n return Dispatch.fromRow(rows[0] as unknown as DispatchData);\n }\n\n /**\n * List dispatches with filtering\n */\n static async list(\n db: DatabaseInterface,\n options: DispatchListOptions = {},\n ): Promise<Dispatch[]> {\n const conditions: string[] = [];\n const params: unknown[] = [];\n let paramIndex = 1;\n\n if (options.status) {\n conditions.push(`status = $${paramIndex++}`);\n params.push(options.status);\n }\n\n if (options.source) {\n conditions.push(`source = $${paramIndex++}`);\n params.push(options.source);\n }\n\n if (options.type) {\n conditions.push(`type = $${paramIndex++}`);\n params.push(options.type);\n }\n\n if (options.targetSubscriber) {\n conditions.push(`target_subscriber = $${paramIndex++}`);\n params.push(options.targetSubscriber);\n }\n\n if (options.correlationId !== undefined) {\n conditions.push(`correlation_id = $${paramIndex++}`);\n params.push(options.correlationId);\n }\n\n // Tenant isolation (S5 #1398). Scope is derived server-side by the bus;\n // callers cannot widen it. See DispatchListOptions.tenantScope.\n if (\n pushTenantPredicate(\n conditions,\n params,\n options.tenantScope,\n `$${paramIndex}`,\n )\n ) {\n paramIndex++;\n }\n\n let sql = 'SELECT * FROM _smrt_dispatch';\n if (conditions.length > 0) {\n sql += ` WHERE ${conditions.join(' AND ')}`;\n }\n\n // Whitelist allowed orderBy values to prevent SQL injection\n const allowedOrderBy = [\n 'created_at DESC',\n 'created_at ASC',\n 'updated_at DESC',\n 'updated_at ASC',\n 'type',\n 'type DESC',\n 'type ASC',\n 'status',\n 'status DESC',\n 'status ASC',\n 'source',\n 'source DESC',\n 'source ASC',\n ];\n const safeOrderBy =\n options.orderBy && allowedOrderBy.includes(options.orderBy)\n ? options.orderBy\n : 'created_at DESC';\n sql += ` ORDER BY ${safeOrderBy}`;\n\n // Use parameterized queries for limit/offset\n if (options.limit !== undefined) {\n sql += ` LIMIT $${paramIndex++}`;\n params.push(options.limit);\n }\n\n if (options.offset !== undefined) {\n sql += ` OFFSET $${paramIndex++}`;\n params.push(options.offset);\n }\n\n const { rows } = await db.query(sql, ...params);\n return rows.map((row: Record<string, unknown>) =>\n Dispatch.fromRow(row as unknown as DispatchData),\n );\n }\n\n /**\n * Find pending dispatches for a set of signal types\n *\n * @param subscriber - When provided, filters to dispatches with no target\n * or targeted specifically at this subscriber (for fan-out delivery)\n * @param tenantScope - Active tenant scope (S5 #1398). Derived server-side by\n * the bus; restricts results so a subscriber in one tenant cannot see\n * another tenant's dispatch. See {@link pushTenantPredicate} for the exact\n * semantics (off → no filter; active tenant → that tenant + global; on but\n * no tenant → global only).\n */\n static async findPending(\n db: DatabaseInterface,\n signalTypes: string[],\n limit: number = 100,\n subscriber?: string,\n tenantScope?: DispatchTenantScope,\n ): Promise<Dispatch[]> {\n if (signalTypes.length === 0) {\n return [];\n }\n\n let paramIndex = 1;\n const placeholders = signalTypes.map(() => `$${paramIndex++}`).join(', ');\n const conditions: string[] = [\n \"status = 'pending'\",\n `type IN (${placeholders})`,\n ];\n const params: unknown[] = [...signalTypes];\n\n if (subscriber) {\n conditions.push(\n `(target_subscriber IS NULL OR target_subscriber = $${paramIndex++})`,\n );\n params.push(subscriber);\n }\n\n if (\n pushTenantPredicate(conditions, params, tenantScope, `$${paramIndex}`)\n ) {\n paramIndex++;\n }\n\n const sql = `SELECT * FROM _smrt_dispatch\n WHERE ${conditions.join(' AND ')}\n ORDER BY created_at ASC LIMIT $${paramIndex}`;\n params.push(limit);\n\n const { rows } = await db.query(sql, ...params);\n\n return rows.map((row: Record<string, unknown>) =>\n Dispatch.fromRow(row as unknown as DispatchData),\n );\n }\n\n /**\n * Atomically claim a pending dispatch for processing (S5 #1398).\n *\n * Performs a conditional `UPDATE ... WHERE id = ? AND status = 'pending'`\n * (plus the tenant predicate for the active scope) and reports whether the\n * row was claimed by THIS call. Only the caller whose update affected a row\n * may run the handler, which closes the claim TOCTOU window where a `process`\n * filter-then-update could let two workers (or a tenant-scoped and a\n * system-scoped processor) both pick up the same compete/global dispatch.\n *\n * On a successful claim the dispatch's status/attempts/updated_at are\n * advanced in the DB; the in-memory `dispatch` instance is updated to match\n * so the caller can proceed to `update()` it to completed/failed.\n *\n * @returns `true` if this call claimed the dispatch, `false` if another\n * worker already moved it out of `pending` (or it is not visible in scope).\n */\n static async claim(\n db: DatabaseInterface,\n dispatch: Dispatch,\n tenantScope?: DispatchTenantScope,\n ): Promise<boolean> {\n dispatch.markProcessing();\n const row = dispatch.toRow();\n\n const conditions: string[] = ['id = $4', \"status = 'pending'\"];\n const params: unknown[] = [\n row.status,\n row.attempts,\n row.updated_at,\n row.id,\n ];\n let paramIndex = 5;\n\n if (\n pushTenantPredicate(conditions, params, tenantScope, `$${paramIndex}`)\n ) {\n paramIndex++;\n }\n\n const { rowCount } = await db.query(\n `UPDATE _smrt_dispatch\n SET status = $1, attempts = $2, updated_at = $3\n WHERE ${conditions.join(' AND ')}`,\n ...params,\n );\n\n return (rowCount ?? 0) > 0;\n }\n\n /**\n * Find failed dispatches eligible for retry.\n *\n * @param tenantScope - Active tenant scope (S5 #1398). Derived server-side by\n * the bus; restricts retryable rows to the active tenant (plus global) so a\n * tenant's `retry()` cannot reset another tenant's failed dispatches. See\n * {@link pushTenantPredicate} for the exact semantics.\n */\n static async findRetryable(\n db: DatabaseInterface,\n options: DispatchRetryOptions = {},\n tenantScope?: DispatchTenantScope,\n ): Promise<Dispatch[]> {\n const conditions: string[] = [\"status = 'failed'\"];\n const params: unknown[] = [];\n let paramIndex = 1;\n\n if (options.maxAttempts) {\n conditions.push(`attempts < $${paramIndex++}`);\n params.push(options.maxAttempts);\n }\n\n if (options.olderThan) {\n conditions.push(`created_at < $${paramIndex++}`);\n params.push(options.olderThan.toISOString());\n }\n\n if (options.signalTypes && options.signalTypes.length > 0) {\n const placeholders = options.signalTypes\n .map(() => `$${paramIndex++}`)\n .join(', ');\n conditions.push(`type IN (${placeholders})`);\n params.push(...options.signalTypes);\n }\n\n if (\n pushTenantPredicate(conditions, params, tenantScope, `$${paramIndex}`)\n ) {\n paramIndex++;\n }\n\n const { rows } = await db.query(\n `SELECT * FROM _smrt_dispatch WHERE ${conditions.join(' AND ')} ORDER BY created_at ASC`,\n ...params,\n );\n\n return rows.map((row: Record<string, unknown>) =>\n Dispatch.fromRow(row as unknown as DispatchData),\n );\n }\n\n /**\n * Count dispatches by status\n */\n static async countByStatus(\n db: DatabaseInterface,\n status: DispatchStatus,\n ): Promise<number> {\n const result = await db.single`\n SELECT COUNT(*) as count FROM _smrt_dispatch WHERE status = ${status}\n `;\n return (result as { count: number })?.count || 0;\n }\n\n /**\n * Delete a dispatch\n */\n static async delete(db: DatabaseInterface, id: string): Promise<void> {\n await db.query(`DELETE FROM _smrt_dispatch WHERE id = $1`, id);\n }\n\n /**\n * Cleanup old dispatches.\n *\n * @param tenantScope - Active tenant scope (S5 #1398). Derived server-side by\n * the bus; restricts deletions to the active tenant (plus global) so a\n * tenant's `cleanup()` cannot delete another tenant's dispatches. See\n * {@link pushTenantPredicate} for the exact semantics.\n */\n static async cleanup(\n db: DatabaseInterface,\n options: DispatchCleanupOptions = {},\n tenantScope?: DispatchTenantScope,\n ): Promise<DispatchCleanupResult> {\n const result: DispatchCleanupResult = {\n completedDeleted: 0,\n failedDeleted: 0,\n };\n\n if (options.completedOlderThanDays) {\n const cutoff = new Date();\n cutoff.setDate(cutoff.getDate() - options.completedOlderThanDays);\n\n const conditions: string[] = [\n \"status = 'completed'\",\n 'processed_at < $1',\n ];\n const params: unknown[] = [cutoff.toISOString()];\n pushTenantPredicate(conditions, params, tenantScope, '$2');\n\n const { rowCount } = await db.query(\n `DELETE FROM _smrt_dispatch WHERE ${conditions.join(' AND ')}`,\n ...params,\n );\n result.completedDeleted = rowCount || 0;\n }\n\n if (options.failedOlderThanDays) {\n const cutoff = new Date();\n cutoff.setDate(cutoff.getDate() - options.failedOlderThanDays);\n\n const conditions: string[] = [\"status = 'failed'\", 'updated_at < $1'];\n const params: unknown[] = [cutoff.toISOString()];\n pushTenantPredicate(conditions, params, tenantScope, '$2');\n\n const { rowCount } = await db.query(\n `DELETE FROM _smrt_dispatch WHERE ${conditions.join(' AND ')}`,\n ...params,\n );\n result.failedDeleted = rowCount || 0;\n }\n\n return result;\n }\n\n /**\n * Check if dispatch table exists\n */\n static async tableExists(db: DatabaseInterface): Promise<boolean> {\n try {\n await db.query(`SELECT 1 FROM _smrt_dispatch LIMIT 1`);\n return true;\n } catch {\n return false;\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dispatch Module - Inter-Agent Communication
|
|
3
|
+
*
|
|
4
|
+
* Provides the DispatchBus for asynchronous agent-to-agent messaging.
|
|
5
|
+
*
|
|
6
|
+
* ## Delivery modes
|
|
7
|
+
*
|
|
8
|
+
* - **compete** (default): At-most-once delivery. First subscriber to process
|
|
9
|
+
* claims the dispatch. Other subscribers won't see it.
|
|
10
|
+
* - **fanout**: Each subscriber gets their own copy of the dispatch and
|
|
11
|
+
* processes independently.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* import { createDispatchBus } from '@happyvertical/smrt-core';
|
|
16
|
+
*
|
|
17
|
+
* const bus = await createDispatchBus({ db: { type: 'sqlite', url: 'app.db' } });
|
|
18
|
+
*
|
|
19
|
+
* // Emit a dispatch
|
|
20
|
+
* await bus.emit('campaign.completed', { campaignId: '123' }, { source: 'suasor' });
|
|
21
|
+
*
|
|
22
|
+
* // Subscribe with compete delivery (default — first-to-claim)
|
|
23
|
+
* await bus.subscribe({ signalType: 'campaign.*', subscriber: 'fiscus' });
|
|
24
|
+
*
|
|
25
|
+
* // Subscribe with fan-out delivery (each subscriber gets own copy)
|
|
26
|
+
* await bus.subscribe({
|
|
27
|
+
* signalType: 'campaign.*',
|
|
28
|
+
* subscriber: 'auditor',
|
|
29
|
+
* delivery: 'fanout',
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* // Process pending dispatches
|
|
33
|
+
* await bus.process('fiscus', async (payload, metadata) => {
|
|
34
|
+
* console.log(`Processing ${metadata.type} from ${metadata.source}`);
|
|
35
|
+
* });
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* @packageDocumentation
|
|
39
|
+
*/
|
|
40
|
+
export { createDispatchBus, DispatchBus } from './bus.js';
|
|
41
|
+
export { DispatchCollection } from './collections/Dispatches.js';
|
|
42
|
+
export { DispatchSubscriptionCollection } from './collections/DispatchSubscriptions.js';
|
|
43
|
+
export { Dispatch, type DispatchData } from './models/Dispatch.js';
|
|
44
|
+
export { DispatchSubscription, type DispatchSubscriptionData, } from './models/DispatchSubscription.js';
|
|
45
|
+
export { type DispatchTenantResolver, type DispatchTenantScope, resolveDispatchTenantId, resolveDispatchTenantScope, setDispatchTenantResolver, } from './tenant-resolver.js';
|
|
46
|
+
export type { DispatchBusOptions, DispatchCleanupOptions, DispatchCleanupResult, DispatchEmitOptions, DispatchHandler, DispatchListOptions, DispatchMetadata, DispatchProcessOptions, DispatchRetryOptions, DispatchStatus, DispatchSubscribeOptions, } from './types.js';
|
|
47
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dispatch/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAGH,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,8BAA8B,EAAE,MAAM,wCAAwC,CAAC;AAExF,OAAO,EAAE,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EACL,oBAAoB,EACpB,KAAK,wBAAwB,GAC9B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,uBAAuB,EACvB,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAG9B,YAAY,EACV,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,EACpB,cAAc,EACd,wBAAwB,GACzB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { DispatchMetadata, DispatchStatus } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Raw dispatch data as stored in the database
|
|
4
|
+
*/
|
|
5
|
+
export interface DispatchData {
|
|
6
|
+
id: string;
|
|
7
|
+
type: string;
|
|
8
|
+
source: string;
|
|
9
|
+
source_id: string | null;
|
|
10
|
+
payload: string | null;
|
|
11
|
+
status: DispatchStatus;
|
|
12
|
+
attempts: number;
|
|
13
|
+
last_error: string | null;
|
|
14
|
+
processed_at: string | null;
|
|
15
|
+
processed_by: string | null;
|
|
16
|
+
target_subscriber: string | null;
|
|
17
|
+
correlation_id: string | null;
|
|
18
|
+
tenant_id: string | null;
|
|
19
|
+
metadata: string | null;
|
|
20
|
+
created_at: string;
|
|
21
|
+
updated_at: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Dispatch model for inter-agent communication
|
|
25
|
+
*/
|
|
26
|
+
export declare class Dispatch {
|
|
27
|
+
/** Table name for this model */
|
|
28
|
+
static readonly tableName = "_smrt_dispatch";
|
|
29
|
+
/** Unique identifier */
|
|
30
|
+
id: string;
|
|
31
|
+
/** Signal type (e.g., 'campaign.completed') */
|
|
32
|
+
type: string;
|
|
33
|
+
/** Emitting agent name */
|
|
34
|
+
source: string;
|
|
35
|
+
/** Emitting agent instance ID */
|
|
36
|
+
sourceId: string;
|
|
37
|
+
/** Dispatch payload */
|
|
38
|
+
payload: Record<string, unknown>;
|
|
39
|
+
/** Current status */
|
|
40
|
+
status: DispatchStatus;
|
|
41
|
+
/** Number of processing attempts */
|
|
42
|
+
attempts: number;
|
|
43
|
+
/** Last error message if failed */
|
|
44
|
+
lastError: string;
|
|
45
|
+
/** When the dispatch was processed */
|
|
46
|
+
processedAt: Date | null;
|
|
47
|
+
/** Which subscriber processed it */
|
|
48
|
+
processedBy: string;
|
|
49
|
+
/** Target subscriber for fan-out delivery (null for compete mode) */
|
|
50
|
+
targetSubscriber: string | null;
|
|
51
|
+
/** Correlation ID for linking request/response dispatch pairs */
|
|
52
|
+
correlationId: string;
|
|
53
|
+
/**
|
|
54
|
+
* Tenant the dispatch was emitted in (server-derived, untrusted-input-proof).
|
|
55
|
+
*
|
|
56
|
+
* Stamped from the active tenant context at emit time — never from caller
|
|
57
|
+
* options — so it cannot be spoofed. `null` for global / non-tenant
|
|
58
|
+
* dispatches. Used to isolate reads/claims across tenants (S5 #1398).
|
|
59
|
+
*/
|
|
60
|
+
tenantId: string | null;
|
|
61
|
+
/** Additional metadata */
|
|
62
|
+
metadata: Record<string, unknown>;
|
|
63
|
+
/** Creation timestamp */
|
|
64
|
+
createdAt: Date;
|
|
65
|
+
/** Last update timestamp */
|
|
66
|
+
updatedAt: Date;
|
|
67
|
+
constructor(data?: Partial<DispatchData>);
|
|
68
|
+
/**
|
|
69
|
+
* Create a Dispatch from a database row
|
|
70
|
+
*/
|
|
71
|
+
static fromRow(row: DispatchData): Dispatch;
|
|
72
|
+
/**
|
|
73
|
+
* Convert to database row format
|
|
74
|
+
*/
|
|
75
|
+
toRow(): DispatchData;
|
|
76
|
+
/**
|
|
77
|
+
* Get dispatch metadata for handlers
|
|
78
|
+
*/
|
|
79
|
+
getMetadata(): DispatchMetadata;
|
|
80
|
+
/**
|
|
81
|
+
* Mark as processing
|
|
82
|
+
*/
|
|
83
|
+
markProcessing(): void;
|
|
84
|
+
/**
|
|
85
|
+
* Mark as completed
|
|
86
|
+
*/
|
|
87
|
+
markCompleted(processedBy: string): void;
|
|
88
|
+
/**
|
|
89
|
+
* Mark as failed
|
|
90
|
+
*/
|
|
91
|
+
markFailed(error: string): void;
|
|
92
|
+
/**
|
|
93
|
+
* Reset to pending for retry
|
|
94
|
+
*/
|
|
95
|
+
resetForRetry(): void;
|
|
96
|
+
/**
|
|
97
|
+
* Check if this dispatch can be retried
|
|
98
|
+
*/
|
|
99
|
+
canRetry(maxAttempts: number): boolean;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=Dispatch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dispatch.d.ts","sourceRoot":"","sources":["../../../src/dispatch/models/Dispatch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAgCpE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,QAAQ;IACnB,gCAAgC;IAChC,MAAM,CAAC,QAAQ,CAAC,SAAS,oBAAoB;IAE7C,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IAEX,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IAEb,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IAEf,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;IAEjB,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEjC,qBAAqB;IACrB,MAAM,EAAE,cAAc,CAAC;IAEvB,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IAEjB,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAElB,sCAAsC;IACtC,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;IAEzB,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IAEpB,qEAAqE;IACrE,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAEhC,iEAAiE;IACjE,aAAa,EAAE,MAAM,CAAC;IAEtB;;;;;;OAMG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAExB,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAElC,yBAAyB;IACzB,SAAS,EAAE,IAAI,CAAC;IAEhB,4BAA4B;IAC5B,SAAS,EAAE,IAAI,CAAC;gBAEJ,IAAI,GAAE,OAAO,CAAC,YAAY,CAAM;IA0B5C;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,QAAQ;IAI3C;;OAEG;IACH,KAAK,IAAI,YAAY;IAqBrB;;OAEG;IACH,WAAW,IAAI,gBAAgB;IAa/B;;OAEG;IACH,cAAc,IAAI,IAAI;IAMtB;;OAEG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAQxC;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM/B;;OAEG;IACH,aAAa,IAAI,IAAI;IAKrB;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;CAGvC"}
|