@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 @@
|
|
|
1
|
+
{"version":3,"file":"similarity.js","sources":["../../src/embeddings/similarity.ts"],"sourcesContent":["/**\n * Vector Similarity Calculations\n *\n * Provides cosine similarity for semantic search.\n */\n\n/**\n * Cosine similarity calculator for embedding vectors\n */\nexport class CosineSimilarity {\n /**\n * Calculate cosine similarity between two vectors\n *\n * @param a - First embedding vector\n * @param b - Second embedding vector\n * @returns Similarity score between -1 and 1 (higher = more similar)\n * @throws Error if vectors have different dimensions\n */\n static calculate(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n throw new Error(\n `Vector dimension mismatch: ${a.length} vs ${b.length}. ` +\n 'Ensure all embeddings use the same model and dimensions.',\n );\n }\n\n if (a.length === 0) {\n return 0;\n }\n\n let dotProduct = 0;\n let normA = 0;\n let normB = 0;\n\n for (let i = 0; i < a.length; i++) {\n dotProduct += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n\n const denominator = Math.sqrt(normA) * Math.sqrt(normB);\n\n if (denominator === 0) {\n return 0;\n }\n\n return dotProduct / denominator;\n }\n\n /**\n * Calculate similarities between a query vector and multiple candidates\n *\n * @param query - Query embedding vector\n * @param candidates - Array of candidate vectors with IDs\n * @returns Array sorted by similarity (highest first)\n */\n static rankBySimilarity<T extends { id: string; embedding: number[] }>(\n query: number[],\n candidates: T[],\n ): Array<T & { similarity: number }> {\n const results = candidates.map((candidate) => ({\n ...candidate,\n similarity: CosineSimilarity.calculate(query, candidate.embedding),\n }));\n\n return results.sort((a, b) => b.similarity - a.similarity);\n }\n\n /**\n * Filter candidates by minimum similarity threshold\n *\n * @param query - Query embedding vector\n * @param candidates - Array of candidate vectors\n * @param minSimilarity - Minimum similarity threshold (0-1)\n * @returns Filtered and sorted results\n */\n static filterBySimilarity<T extends { id: string; embedding: number[] }>(\n query: number[],\n candidates: T[],\n minSimilarity: number,\n ): Array<T & { similarity: number }> {\n return CosineSimilarity.rankBySimilarity(query, candidates).filter(\n (result) => result.similarity >= minSimilarity,\n );\n }\n}\n"],"names":[],"mappings":"AASO,MAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS5B,OAAO,UAAU,GAAa,GAAqB;AACjD,QAAI,EAAE,WAAW,EAAE,QAAQ;AACzB,YAAM,IAAI;AAAA,QACR,8BAA8B,EAAE,MAAM,OAAO,EAAE,MAAM;AAAA,MAAA;AAAA,IAGzD;AAEA,QAAI,EAAE,WAAW,GAAG;AAClB,aAAO;AAAA,IACT;AAEA,QAAI,aAAa;AACjB,QAAI,QAAQ;AACZ,QAAI,QAAQ;AAEZ,aAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,oBAAc,EAAE,CAAC,IAAI,EAAE,CAAC;AACxB,eAAS,EAAE,CAAC,IAAI,EAAE,CAAC;AACnB,eAAS,EAAE,CAAC,IAAI,EAAE,CAAC;AAAA,IACrB;AAEA,UAAM,cAAc,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK;AAEtD,QAAI,gBAAgB,GAAG;AACrB,aAAO;AAAA,IACT;AAEA,WAAO,aAAa;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,iBACL,OACA,YACmC;AACnC,UAAM,UAAU,WAAW,IAAI,CAAC,eAAe;AAAA,MAC7C,GAAG;AAAA,MACH,YAAY,iBAAiB,UAAU,OAAO,UAAU,SAAS;AAAA,IAAA,EACjE;AAEF,WAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,mBACL,OACA,YACA,eACmC;AACnC,WAAO,iBAAiB,iBAAiB,OAAO,UAAU,EAAE;AAAA,MAC1D,CAAC,WAAW,OAAO,cAAc;AAAA,IAAA;AAAA,EAErC;AACF;"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { DatabaseInterface, VectorCapabilities } from '@happyvertical/sql';
|
|
2
|
+
import { StoredEmbedding } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Storage operations for embeddings in _smrt_embeddings table
|
|
5
|
+
*/
|
|
6
|
+
export declare class EmbeddingStorage {
|
|
7
|
+
/**
|
|
8
|
+
* Insert or update an embedding
|
|
9
|
+
*
|
|
10
|
+
* @param db - Database interface
|
|
11
|
+
* @param data - Embedding data to store
|
|
12
|
+
* @param vector - Optional vector capabilities for native storage
|
|
13
|
+
*/
|
|
14
|
+
static upsert(db: DatabaseInterface, data: {
|
|
15
|
+
objectClass: string;
|
|
16
|
+
objectId: string;
|
|
17
|
+
fieldName: string;
|
|
18
|
+
contentHash: string;
|
|
19
|
+
embedding: number[];
|
|
20
|
+
model: string;
|
|
21
|
+
dimensions: number;
|
|
22
|
+
provider?: string;
|
|
23
|
+
}, vector?: VectorCapabilities): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Search for similar embeddings using the best available strategy.
|
|
26
|
+
*
|
|
27
|
+
* When vector capabilities are provided, delegates to database-level
|
|
28
|
+
* vector search. Otherwise falls back to loading all embeddings and
|
|
29
|
+
* computing cosine similarity in memory.
|
|
30
|
+
*
|
|
31
|
+
* @param db - Database interface
|
|
32
|
+
* @param objectClass - Class name to search within
|
|
33
|
+
* @param embedding - Query embedding vector
|
|
34
|
+
* @param options - Search options
|
|
35
|
+
* @param vector - Optional vector capabilities for native search
|
|
36
|
+
* @returns Array of { objectId, similarity } ranked by similarity (highest first)
|
|
37
|
+
*/
|
|
38
|
+
static searchSimilar(db: DatabaseInterface, objectClass: string, embedding: number[], options?: {
|
|
39
|
+
field?: string;
|
|
40
|
+
model?: string;
|
|
41
|
+
limit?: number;
|
|
42
|
+
minSimilarity?: number;
|
|
43
|
+
}, vector?: VectorCapabilities): Promise<Array<{
|
|
44
|
+
objectId: string;
|
|
45
|
+
similarity: number;
|
|
46
|
+
}>>;
|
|
47
|
+
/**
|
|
48
|
+
* Ensure the native vector column and index exist on _smrt_embeddings.
|
|
49
|
+
* Called once during initialization when storage: 'native' is configured.
|
|
50
|
+
*
|
|
51
|
+
* @param db - Database interface
|
|
52
|
+
* @param dimensions - Vector dimensions
|
|
53
|
+
* @param vector - Vector capabilities
|
|
54
|
+
*/
|
|
55
|
+
static ensureVectorStorage(_db: DatabaseInterface, dimensions: number, vector: VectorCapabilities): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* Get a specific embedding
|
|
58
|
+
*
|
|
59
|
+
* @param db - Database interface
|
|
60
|
+
* @param objectClass - Class name
|
|
61
|
+
* @param objectId - Object ID
|
|
62
|
+
* @param fieldName - Field name
|
|
63
|
+
* @param model - Model used
|
|
64
|
+
* @returns Stored embedding or null
|
|
65
|
+
*/
|
|
66
|
+
static get(db: DatabaseInterface, objectClass: string, objectId: string, fieldName: string, model: string): Promise<StoredEmbedding | null>;
|
|
67
|
+
/**
|
|
68
|
+
* Get all embeddings for an object
|
|
69
|
+
*
|
|
70
|
+
* @param db - Database interface
|
|
71
|
+
* @param objectClass - Class name
|
|
72
|
+
* @param objectId - Object ID
|
|
73
|
+
* @returns Array of stored embeddings
|
|
74
|
+
*/
|
|
75
|
+
static getForObject(db: DatabaseInterface, objectClass: string, objectId: string): Promise<StoredEmbedding[]>;
|
|
76
|
+
/**
|
|
77
|
+
* List embeddings for a class (optionally filtered by field and model)
|
|
78
|
+
*
|
|
79
|
+
* @param db - Database interface
|
|
80
|
+
* @param objectClass - Class name
|
|
81
|
+
* @param fieldName - Optional field filter
|
|
82
|
+
* @param model - Optional model filter
|
|
83
|
+
* @returns Array of stored embeddings
|
|
84
|
+
*/
|
|
85
|
+
static listForClass(db: DatabaseInterface, objectClass: string, fieldName?: string, model?: string): Promise<StoredEmbedding[]>;
|
|
86
|
+
/**
|
|
87
|
+
* Get object IDs that have embeddings for a specific field
|
|
88
|
+
*
|
|
89
|
+
* @param db - Database interface
|
|
90
|
+
* @param objectClass - Class name
|
|
91
|
+
* @param fieldName - Field name
|
|
92
|
+
* @returns Array of object IDs
|
|
93
|
+
*/
|
|
94
|
+
static getObjectIdsWithEmbeddings(db: DatabaseInterface, objectClass: string, fieldName: string): Promise<string[]>;
|
|
95
|
+
/**
|
|
96
|
+
* Delete all embeddings for an object
|
|
97
|
+
*
|
|
98
|
+
* @param db - Database interface
|
|
99
|
+
* @param objectClass - Class name
|
|
100
|
+
* @param objectId - Object ID
|
|
101
|
+
*/
|
|
102
|
+
static deleteForObject(db: DatabaseInterface, objectClass: string, objectId: string): Promise<void>;
|
|
103
|
+
/**
|
|
104
|
+
* Delete a specific embedding
|
|
105
|
+
*
|
|
106
|
+
* @param db - Database interface
|
|
107
|
+
* @param objectClass - Class name
|
|
108
|
+
* @param objectId - Object ID
|
|
109
|
+
* @param fieldName - Field name
|
|
110
|
+
* @param model - Model used
|
|
111
|
+
*/
|
|
112
|
+
static delete(db: DatabaseInterface, objectClass: string, objectId: string, fieldName: string, model: string): Promise<void>;
|
|
113
|
+
/**
|
|
114
|
+
* Check if embedding table exists
|
|
115
|
+
*
|
|
116
|
+
* @param db - Database interface
|
|
117
|
+
* @returns True if table exists
|
|
118
|
+
*/
|
|
119
|
+
static tableExists(db: DatabaseInterface): Promise<boolean>;
|
|
120
|
+
/**
|
|
121
|
+
* Parse a database row into StoredEmbedding
|
|
122
|
+
*/
|
|
123
|
+
private static parseRow;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/embeddings/storage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAEhF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAO/C;;GAEG;AACH,qBAAa,gBAAgB;IAC3B;;;;;;OAMG;WACU,MAAM,CACjB,EAAE,EAAE,iBAAiB,EACrB,IAAI,EAAE;QACJ,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,EACD,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC;IA6ChB;;;;;;;;;;;;;OAaG;WACU,aAAa,CACxB,EAAE,EAAE,iBAAiB,EACrB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,GAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,aAAa,CAAC,EAAE,MAAM,CAAC;KACnB,EACN,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAuE3D;;;;;;;OAOG;WACU,mBAAmB,CAC9B,GAAG,EAAE,iBAAiB,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,IAAI,CAAC;IAShB;;;;;;;;;OASG;WACU,GAAG,CACd,EAAE,EAAE,iBAAiB,EACrB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAclC;;;;;;;OAOG;WACU,YAAY,CACvB,EAAE,EAAE,iBAAiB,EACrB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,EAAE,CAAC;IAY7B;;;;;;;;OAQG;WACU,YAAY,CACvB,EAAE,EAAE,iBAAiB,EACrB,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,EAAE,CAAC;IAqB7B;;;;;;;OAOG;WACU,0BAA0B,CACrC,EAAE,EAAE,iBAAiB,EACrB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,EAAE,CAAC;IAWpB;;;;;;OAMG;WACU,eAAe,CAC1B,EAAE,EAAE,iBAAiB,EACrB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;IAQhB;;;;;;;;OAQG;WACU,MAAM,CACjB,EAAE,EAAE,iBAAiB,EACrB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC;IAWhB;;;;;OAKG;WACU,WAAW,CAAC,EAAE,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IASjE;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ;CAexB"}
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { createLogger } from "@happyvertical/logger";
|
|
3
|
+
import { CosineSimilarity } from "./similarity.js";
|
|
4
|
+
const logger = createLogger({ level: "info" });
|
|
5
|
+
const VECTOR_COLUMN = "embedding_vector";
|
|
6
|
+
class EmbeddingStorage {
|
|
7
|
+
/**
|
|
8
|
+
* Insert or update an embedding
|
|
9
|
+
*
|
|
10
|
+
* @param db - Database interface
|
|
11
|
+
* @param data - Embedding data to store
|
|
12
|
+
* @param vector - Optional vector capabilities for native storage
|
|
13
|
+
*/
|
|
14
|
+
static async upsert(db, data, vector) {
|
|
15
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
16
|
+
const id = randomUUID();
|
|
17
|
+
await db.upsert(
|
|
18
|
+
"_smrt_embeddings",
|
|
19
|
+
["object_class", "object_id", "field_name", "model"],
|
|
20
|
+
{
|
|
21
|
+
id,
|
|
22
|
+
object_class: data.objectClass,
|
|
23
|
+
object_id: data.objectId,
|
|
24
|
+
field_name: data.fieldName,
|
|
25
|
+
content_hash: data.contentHash,
|
|
26
|
+
embedding: JSON.stringify(data.embedding),
|
|
27
|
+
model: data.model,
|
|
28
|
+
dimensions: data.dimensions,
|
|
29
|
+
provider: data.provider || null,
|
|
30
|
+
created_at: now,
|
|
31
|
+
updated_at: now
|
|
32
|
+
}
|
|
33
|
+
);
|
|
34
|
+
if (vector) {
|
|
35
|
+
try {
|
|
36
|
+
await vector.upsertVector(
|
|
37
|
+
"_smrt_embeddings",
|
|
38
|
+
{
|
|
39
|
+
object_class: data.objectClass,
|
|
40
|
+
object_id: data.objectId,
|
|
41
|
+
field_name: data.fieldName,
|
|
42
|
+
model: data.model
|
|
43
|
+
},
|
|
44
|
+
VECTOR_COLUMN,
|
|
45
|
+
data.embedding
|
|
46
|
+
);
|
|
47
|
+
} catch (error) {
|
|
48
|
+
logger.warn(
|
|
49
|
+
`[embeddings] Failed to store native vector: ${error instanceof Error ? error.message : String(error)}`
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Search for similar embeddings using the best available strategy.
|
|
56
|
+
*
|
|
57
|
+
* When vector capabilities are provided, delegates to database-level
|
|
58
|
+
* vector search. Otherwise falls back to loading all embeddings and
|
|
59
|
+
* computing cosine similarity in memory.
|
|
60
|
+
*
|
|
61
|
+
* @param db - Database interface
|
|
62
|
+
* @param objectClass - Class name to search within
|
|
63
|
+
* @param embedding - Query embedding vector
|
|
64
|
+
* @param options - Search options
|
|
65
|
+
* @param vector - Optional vector capabilities for native search
|
|
66
|
+
* @returns Array of { objectId, similarity } ranked by similarity (highest first)
|
|
67
|
+
*/
|
|
68
|
+
static async searchSimilar(db, objectClass, embedding, options = {}, vector) {
|
|
69
|
+
const { field, model, limit = 10, minSimilarity = 0 } = options;
|
|
70
|
+
if (vector) {
|
|
71
|
+
try {
|
|
72
|
+
const conditions = ["object_class = $2"];
|
|
73
|
+
const params = [objectClass];
|
|
74
|
+
if (field) {
|
|
75
|
+
conditions.push(`field_name = $${params.length + 2}`);
|
|
76
|
+
params.push(field);
|
|
77
|
+
}
|
|
78
|
+
if (model) {
|
|
79
|
+
conditions.push(`model = $${params.length + 2}`);
|
|
80
|
+
params.push(model);
|
|
81
|
+
}
|
|
82
|
+
const results = await vector.search(
|
|
83
|
+
"_smrt_embeddings",
|
|
84
|
+
VECTOR_COLUMN,
|
|
85
|
+
embedding,
|
|
86
|
+
{
|
|
87
|
+
limit,
|
|
88
|
+
metric: "cosine",
|
|
89
|
+
where: conditions.join(" AND "),
|
|
90
|
+
params
|
|
91
|
+
}
|
|
92
|
+
);
|
|
93
|
+
return results.map((r) => ({
|
|
94
|
+
objectId: r.object_id,
|
|
95
|
+
similarity: 1 - r.distance
|
|
96
|
+
})).filter((r) => r.similarity >= minSimilarity);
|
|
97
|
+
} catch (error) {
|
|
98
|
+
logger.warn(
|
|
99
|
+
`[embeddings] Native vector search failed, falling back to in-memory: ${error instanceof Error ? error.message : String(error)}`
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const storedEmbeddings = await EmbeddingStorage.listForClass(
|
|
104
|
+
db,
|
|
105
|
+
objectClass,
|
|
106
|
+
field,
|
|
107
|
+
model
|
|
108
|
+
);
|
|
109
|
+
if (storedEmbeddings.length === 0) {
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
return storedEmbeddings.map((stored) => ({
|
|
113
|
+
objectId: stored.object_id,
|
|
114
|
+
similarity: CosineSimilarity.calculate(embedding, stored.embedding)
|
|
115
|
+
})).filter((item) => item.similarity >= minSimilarity).sort((a, b) => b.similarity - a.similarity).slice(0, limit);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Ensure the native vector column and index exist on _smrt_embeddings.
|
|
119
|
+
* Called once during initialization when storage: 'native' is configured.
|
|
120
|
+
*
|
|
121
|
+
* @param db - Database interface
|
|
122
|
+
* @param dimensions - Vector dimensions
|
|
123
|
+
* @param vector - Vector capabilities
|
|
124
|
+
*/
|
|
125
|
+
static async ensureVectorStorage(_db, dimensions, vector) {
|
|
126
|
+
await vector.ensureColumn("_smrt_embeddings", VECTOR_COLUMN, dimensions);
|
|
127
|
+
await vector.ensureIndex("_smrt_embeddings", VECTOR_COLUMN, {
|
|
128
|
+
dimensions,
|
|
129
|
+
metric: "cosine",
|
|
130
|
+
type: "hnsw"
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get a specific embedding
|
|
135
|
+
*
|
|
136
|
+
* @param db - Database interface
|
|
137
|
+
* @param objectClass - Class name
|
|
138
|
+
* @param objectId - Object ID
|
|
139
|
+
* @param fieldName - Field name
|
|
140
|
+
* @param model - Model used
|
|
141
|
+
* @returns Stored embedding or null
|
|
142
|
+
*/
|
|
143
|
+
static async get(db, objectClass, objectId, fieldName, model) {
|
|
144
|
+
const result = await db.single`
|
|
145
|
+
SELECT * FROM _smrt_embeddings
|
|
146
|
+
WHERE object_class = ${objectClass}
|
|
147
|
+
AND object_id = ${objectId}
|
|
148
|
+
AND field_name = ${fieldName}
|
|
149
|
+
AND model = ${model}
|
|
150
|
+
`;
|
|
151
|
+
if (!result) return null;
|
|
152
|
+
return EmbeddingStorage.parseRow(result);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Get all embeddings for an object
|
|
156
|
+
*
|
|
157
|
+
* @param db - Database interface
|
|
158
|
+
* @param objectClass - Class name
|
|
159
|
+
* @param objectId - Object ID
|
|
160
|
+
* @returns Array of stored embeddings
|
|
161
|
+
*/
|
|
162
|
+
static async getForObject(db, objectClass, objectId) {
|
|
163
|
+
const { rows } = await db.query(
|
|
164
|
+
`SELECT * FROM _smrt_embeddings WHERE object_class = ? AND object_id = ?`,
|
|
165
|
+
objectClass,
|
|
166
|
+
objectId
|
|
167
|
+
);
|
|
168
|
+
return rows.map(
|
|
169
|
+
(row) => EmbeddingStorage.parseRow(row)
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* List embeddings for a class (optionally filtered by field and model)
|
|
174
|
+
*
|
|
175
|
+
* @param db - Database interface
|
|
176
|
+
* @param objectClass - Class name
|
|
177
|
+
* @param fieldName - Optional field filter
|
|
178
|
+
* @param model - Optional model filter
|
|
179
|
+
* @returns Array of stored embeddings
|
|
180
|
+
*/
|
|
181
|
+
static async listForClass(db, objectClass, fieldName, model) {
|
|
182
|
+
let sql = `SELECT * FROM _smrt_embeddings WHERE object_class = ?`;
|
|
183
|
+
const params = [objectClass];
|
|
184
|
+
if (fieldName) {
|
|
185
|
+
sql += ` AND field_name = ?`;
|
|
186
|
+
params.push(fieldName);
|
|
187
|
+
}
|
|
188
|
+
if (model) {
|
|
189
|
+
sql += ` AND model = ?`;
|
|
190
|
+
params.push(model);
|
|
191
|
+
}
|
|
192
|
+
const { rows } = await db.query(sql, ...params);
|
|
193
|
+
return rows.map(
|
|
194
|
+
(row) => EmbeddingStorage.parseRow(row)
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Get object IDs that have embeddings for a specific field
|
|
199
|
+
*
|
|
200
|
+
* @param db - Database interface
|
|
201
|
+
* @param objectClass - Class name
|
|
202
|
+
* @param fieldName - Field name
|
|
203
|
+
* @returns Array of object IDs
|
|
204
|
+
*/
|
|
205
|
+
static async getObjectIdsWithEmbeddings(db, objectClass, fieldName) {
|
|
206
|
+
const { rows } = await db.query(
|
|
207
|
+
`SELECT DISTINCT object_id FROM _smrt_embeddings
|
|
208
|
+
WHERE object_class = ? AND field_name = ?`,
|
|
209
|
+
objectClass,
|
|
210
|
+
fieldName
|
|
211
|
+
);
|
|
212
|
+
return rows.map((row) => row.object_id);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Delete all embeddings for an object
|
|
216
|
+
*
|
|
217
|
+
* @param db - Database interface
|
|
218
|
+
* @param objectClass - Class name
|
|
219
|
+
* @param objectId - Object ID
|
|
220
|
+
*/
|
|
221
|
+
static async deleteForObject(db, objectClass, objectId) {
|
|
222
|
+
await db.query(
|
|
223
|
+
`DELETE FROM _smrt_embeddings WHERE object_class = ? AND object_id = ?`,
|
|
224
|
+
objectClass,
|
|
225
|
+
objectId
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Delete a specific embedding
|
|
230
|
+
*
|
|
231
|
+
* @param db - Database interface
|
|
232
|
+
* @param objectClass - Class name
|
|
233
|
+
* @param objectId - Object ID
|
|
234
|
+
* @param fieldName - Field name
|
|
235
|
+
* @param model - Model used
|
|
236
|
+
*/
|
|
237
|
+
static async delete(db, objectClass, objectId, fieldName, model) {
|
|
238
|
+
await db.query(
|
|
239
|
+
`DELETE FROM _smrt_embeddings
|
|
240
|
+
WHERE object_class = ? AND object_id = ? AND field_name = ? AND model = ?`,
|
|
241
|
+
objectClass,
|
|
242
|
+
objectId,
|
|
243
|
+
fieldName,
|
|
244
|
+
model
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Check if embedding table exists
|
|
249
|
+
*
|
|
250
|
+
* @param db - Database interface
|
|
251
|
+
* @returns True if table exists
|
|
252
|
+
*/
|
|
253
|
+
static async tableExists(db) {
|
|
254
|
+
try {
|
|
255
|
+
await db.query(`SELECT 1 FROM _smrt_embeddings LIMIT 1`);
|
|
256
|
+
return true;
|
|
257
|
+
} catch {
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Parse a database row into StoredEmbedding
|
|
263
|
+
*/
|
|
264
|
+
static parseRow(row) {
|
|
265
|
+
return {
|
|
266
|
+
id: row.id,
|
|
267
|
+
object_class: row.object_class,
|
|
268
|
+
object_id: row.object_id,
|
|
269
|
+
field_name: row.field_name,
|
|
270
|
+
content_hash: row.content_hash,
|
|
271
|
+
embedding: JSON.parse(row.embedding),
|
|
272
|
+
model: row.model,
|
|
273
|
+
dimensions: row.dimensions,
|
|
274
|
+
provider: row.provider,
|
|
275
|
+
created_at: new Date(row.created_at),
|
|
276
|
+
updated_at: new Date(row.updated_at)
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
export {
|
|
281
|
+
EmbeddingStorage
|
|
282
|
+
};
|
|
283
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sources":["../../src/embeddings/storage.ts"],"sourcesContent":["/**\n * Embedding Storage Operations\n *\n * CRUD operations for the _smrt_embeddings system table.\n * Supports both JSON-based and native vector storage strategies.\n */\n\nimport { randomUUID } from 'node:crypto';\nimport { createLogger } from '@happyvertical/logger';\nimport type { DatabaseInterface, VectorCapabilities } from '@happyvertical/sql';\nimport { CosineSimilarity } from './similarity';\nimport type { StoredEmbedding } from './types';\n\nconst logger = createLogger({ level: 'info' });\n\n/** Column name for native vector storage */\nconst VECTOR_COLUMN = 'embedding_vector';\n\n/**\n * Storage operations for embeddings in _smrt_embeddings table\n */\nexport class EmbeddingStorage {\n /**\n * Insert or update an embedding\n *\n * @param db - Database interface\n * @param data - Embedding data to store\n * @param vector - Optional vector capabilities for native storage\n */\n static async upsert(\n db: DatabaseInterface,\n data: {\n objectClass: string;\n objectId: string;\n fieldName: string;\n contentHash: string;\n embedding: number[];\n model: string;\n dimensions: number;\n provider?: string;\n },\n vector?: VectorCapabilities,\n ): Promise<void> {\n const now = new Date().toISOString();\n const id = randomUUID();\n\n await db.upsert(\n '_smrt_embeddings',\n ['object_class', 'object_id', 'field_name', 'model'],\n {\n id,\n object_class: data.objectClass,\n object_id: data.objectId,\n field_name: data.fieldName,\n content_hash: data.contentHash,\n embedding: JSON.stringify(data.embedding),\n model: data.model,\n dimensions: data.dimensions,\n provider: data.provider || null,\n created_at: now,\n updated_at: now,\n },\n );\n\n // Also store native vector if capability is available\n if (vector) {\n try {\n await vector.upsertVector(\n '_smrt_embeddings',\n {\n object_class: data.objectClass,\n object_id: data.objectId,\n field_name: data.fieldName,\n model: data.model,\n },\n VECTOR_COLUMN,\n data.embedding,\n );\n } catch (error) {\n // Log but don't fail — JSON fallback is always available\n logger.warn(\n `[embeddings] Failed to store native vector: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n }\n\n /**\n * Search for similar embeddings using the best available strategy.\n *\n * When vector capabilities are provided, delegates to database-level\n * vector search. Otherwise falls back to loading all embeddings and\n * computing cosine similarity in memory.\n *\n * @param db - Database interface\n * @param objectClass - Class name to search within\n * @param embedding - Query embedding vector\n * @param options - Search options\n * @param vector - Optional vector capabilities for native search\n * @returns Array of { objectId, similarity } ranked by similarity (highest first)\n */\n static async searchSimilar(\n db: DatabaseInterface,\n objectClass: string,\n embedding: number[],\n options: {\n field?: string;\n model?: string;\n limit?: number;\n minSimilarity?: number;\n } = {},\n vector?: VectorCapabilities,\n ): Promise<Array<{ objectId: string; similarity: number }>> {\n const { field, model, limit = 10, minSimilarity = 0 } = options;\n\n // Native vector search path\n if (vector) {\n try {\n // Build WHERE clause for class/field/model filtering.\n // Parameter numbering starts at $2 because vector.search() reserves\n // $1 for the query vector embedding in its internal SQL query.\n const conditions: string[] = ['object_class = $2'];\n const params: any[] = [objectClass];\n\n if (field) {\n conditions.push(`field_name = $${params.length + 2}`);\n params.push(field);\n }\n\n if (model) {\n conditions.push(`model = $${params.length + 2}`);\n params.push(model);\n }\n\n const results = await vector.search(\n '_smrt_embeddings',\n VECTOR_COLUMN,\n embedding,\n {\n limit,\n metric: 'cosine',\n where: conditions.join(' AND '),\n params,\n },\n );\n\n // Convert cosine distance (0=identical, 2=opposite) to similarity (1=identical, -1=opposite)\n return results\n .map((r) => ({\n objectId: r.object_id as string,\n similarity: 1 - r.distance,\n }))\n .filter((r) => r.similarity >= minSimilarity);\n } catch (error) {\n // Fall back to in-memory search on vector search failure\n logger.warn(\n `[embeddings] Native vector search failed, falling back to in-memory: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n // In-memory fallback: load all embeddings and compute cosine similarity\n const storedEmbeddings = await EmbeddingStorage.listForClass(\n db,\n objectClass,\n field,\n model,\n );\n\n if (storedEmbeddings.length === 0) {\n return [];\n }\n\n return storedEmbeddings\n .map((stored) => ({\n objectId: stored.object_id,\n similarity: CosineSimilarity.calculate(embedding, stored.embedding),\n }))\n .filter((item) => item.similarity >= minSimilarity)\n .sort((a, b) => b.similarity - a.similarity)\n .slice(0, limit);\n }\n\n /**\n * Ensure the native vector column and index exist on _smrt_embeddings.\n * Called once during initialization when storage: 'native' is configured.\n *\n * @param db - Database interface\n * @param dimensions - Vector dimensions\n * @param vector - Vector capabilities\n */\n static async ensureVectorStorage(\n _db: DatabaseInterface,\n dimensions: number,\n vector: VectorCapabilities,\n ): Promise<void> {\n await vector.ensureColumn('_smrt_embeddings', VECTOR_COLUMN, dimensions);\n await vector.ensureIndex('_smrt_embeddings', VECTOR_COLUMN, {\n dimensions,\n metric: 'cosine',\n type: 'hnsw',\n });\n }\n\n /**\n * Get a specific embedding\n *\n * @param db - Database interface\n * @param objectClass - Class name\n * @param objectId - Object ID\n * @param fieldName - Field name\n * @param model - Model used\n * @returns Stored embedding or null\n */\n static async get(\n db: DatabaseInterface,\n objectClass: string,\n objectId: string,\n fieldName: string,\n model: string,\n ): Promise<StoredEmbedding | null> {\n const result = await db.single`\n SELECT * FROM _smrt_embeddings\n WHERE object_class = ${objectClass}\n AND object_id = ${objectId}\n AND field_name = ${fieldName}\n AND model = ${model}\n `;\n\n if (!result) return null;\n\n return EmbeddingStorage.parseRow(result);\n }\n\n /**\n * Get all embeddings for an object\n *\n * @param db - Database interface\n * @param objectClass - Class name\n * @param objectId - Object ID\n * @returns Array of stored embeddings\n */\n static async getForObject(\n db: DatabaseInterface,\n objectClass: string,\n objectId: string,\n ): Promise<StoredEmbedding[]> {\n const { rows } = await db.query(\n `SELECT * FROM _smrt_embeddings WHERE object_class = ? AND object_id = ?`,\n objectClass,\n objectId,\n );\n\n return rows.map((row: Record<string, unknown>) =>\n EmbeddingStorage.parseRow(row),\n );\n }\n\n /**\n * List embeddings for a class (optionally filtered by field and model)\n *\n * @param db - Database interface\n * @param objectClass - Class name\n * @param fieldName - Optional field filter\n * @param model - Optional model filter\n * @returns Array of stored embeddings\n */\n static async listForClass(\n db: DatabaseInterface,\n objectClass: string,\n fieldName?: string,\n model?: string,\n ): Promise<StoredEmbedding[]> {\n let sql = `SELECT * FROM _smrt_embeddings WHERE object_class = ?`;\n const params: unknown[] = [objectClass];\n\n if (fieldName) {\n sql += ` AND field_name = ?`;\n params.push(fieldName);\n }\n\n if (model) {\n sql += ` AND model = ?`;\n params.push(model);\n }\n\n const { rows } = await db.query(sql, ...params);\n\n return rows.map((row: Record<string, unknown>) =>\n EmbeddingStorage.parseRow(row),\n );\n }\n\n /**\n * Get object IDs that have embeddings for a specific field\n *\n * @param db - Database interface\n * @param objectClass - Class name\n * @param fieldName - Field name\n * @returns Array of object IDs\n */\n static async getObjectIdsWithEmbeddings(\n db: DatabaseInterface,\n objectClass: string,\n fieldName: string,\n ): Promise<string[]> {\n const { rows } = await db.query(\n `SELECT DISTINCT object_id FROM _smrt_embeddings\n WHERE object_class = ? AND field_name = ?`,\n objectClass,\n fieldName,\n );\n\n return rows.map((row: Record<string, unknown>) => row.object_id as string);\n }\n\n /**\n * Delete all embeddings for an object\n *\n * @param db - Database interface\n * @param objectClass - Class name\n * @param objectId - Object ID\n */\n static async deleteForObject(\n db: DatabaseInterface,\n objectClass: string,\n objectId: string,\n ): Promise<void> {\n await db.query(\n `DELETE FROM _smrt_embeddings WHERE object_class = ? AND object_id = ?`,\n objectClass,\n objectId,\n );\n }\n\n /**\n * Delete a specific embedding\n *\n * @param db - Database interface\n * @param objectClass - Class name\n * @param objectId - Object ID\n * @param fieldName - Field name\n * @param model - Model used\n */\n static async delete(\n db: DatabaseInterface,\n objectClass: string,\n objectId: string,\n fieldName: string,\n model: string,\n ): Promise<void> {\n await db.query(\n `DELETE FROM _smrt_embeddings\n WHERE object_class = ? AND object_id = ? AND field_name = ? AND model = ?`,\n objectClass,\n objectId,\n fieldName,\n model,\n );\n }\n\n /**\n * Check if embedding table exists\n *\n * @param db - Database interface\n * @returns True if table exists\n */\n static async tableExists(db: DatabaseInterface): Promise<boolean> {\n try {\n await db.query(`SELECT 1 FROM _smrt_embeddings LIMIT 1`);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Parse a database row into StoredEmbedding\n */\n private static parseRow(row: Record<string, unknown>): StoredEmbedding {\n return {\n id: row.id as string,\n object_class: row.object_class as string,\n object_id: row.object_id as string,\n field_name: row.field_name as string,\n content_hash: row.content_hash as string,\n embedding: JSON.parse(row.embedding as string) as number[],\n model: row.model as string,\n dimensions: row.dimensions as number,\n provider: row.provider as string | undefined,\n created_at: new Date(row.created_at as string),\n updated_at: new Date(row.updated_at as string),\n };\n }\n}\n"],"names":[],"mappings":"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"}
|