@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
package/dist/junction.js
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { SmrtCollection } from "./collection.js";
|
|
2
|
+
function camelToSnake(name) {
|
|
3
|
+
return name.replace(/[A-Z]/g, (m) => `_${m.toLowerCase()}`);
|
|
4
|
+
}
|
|
5
|
+
class SmrtJunction extends SmrtCollection {
|
|
6
|
+
/**
|
|
7
|
+
* Internal marker used by `SmrtCollection.create` to detect that this
|
|
8
|
+
* subclass is a junction and apply a registration-presence guard. Static
|
|
9
|
+
* property is inherited by all subclasses via the constructor chain.
|
|
10
|
+
* Don't rename or remove without also updating the guard.
|
|
11
|
+
*/
|
|
12
|
+
static _isJunctionBase = true;
|
|
13
|
+
/**
|
|
14
|
+
* Field name (camelCase) used to ORDER BY when calling `byLeft` / `byRight`.
|
|
15
|
+
* Defaults to `'sortOrder'`. Set to `null` to omit ORDER BY entirely.
|
|
16
|
+
*
|
|
17
|
+
* Independent from `positionField` — `sortField` is a *query* concern
|
|
18
|
+
* (how rows are ordered when read), while `positionField` is a *write*
|
|
19
|
+
* concern (what column `setLinks` auto-assigns to). Tables that order
|
|
20
|
+
* by a non-position field (e.g. `'createdAt'`) should set `sortField`
|
|
21
|
+
* accordingly and leave `positionField` set to `null` or its dedicated
|
|
22
|
+
* position column name.
|
|
23
|
+
*/
|
|
24
|
+
sortField = "sortOrder";
|
|
25
|
+
/**
|
|
26
|
+
* Field name (camelCase) that `setLinks` auto-assigns the array index
|
|
27
|
+
* to when the caller doesn't supply a value. Defaults to `'sortOrder'`.
|
|
28
|
+
* Set to `null` for tables without a dedicated position column (e.g.
|
|
29
|
+
* pure-key junctions, or tables ordered by timestamps).
|
|
30
|
+
*
|
|
31
|
+
* Writing the array index into a non-position field — like `createdAt`
|
|
32
|
+
* or `placement` — would corrupt data. Subclasses without a numeric
|
|
33
|
+
* position column MUST set this to `null`.
|
|
34
|
+
*/
|
|
35
|
+
positionField = "sortOrder";
|
|
36
|
+
/**
|
|
37
|
+
* Return junction rows where the left FK matches `leftId`, narrowed by
|
|
38
|
+
* optional additional WHERE filters. Ordered ASC by `sortField` if set.
|
|
39
|
+
*/
|
|
40
|
+
async byLeft(leftId, opts = {}) {
|
|
41
|
+
return await this.list({
|
|
42
|
+
// Spread opts FIRST so the fixed key always wins — prevents a
|
|
43
|
+
// caller-supplied `{ [leftField]: otherId }` from retargeting the
|
|
44
|
+
// query when opts is forwarded from untrusted input.
|
|
45
|
+
where: { ...opts, [this.leftField]: leftId },
|
|
46
|
+
...this.sortField ? { orderBy: `${camelToSnake(this.sortField)} ASC` } : {}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Return junction rows where the right FK matches `rightId`, narrowed by
|
|
51
|
+
* optional additional WHERE filters. Ordered ASC by `sortField` if set.
|
|
52
|
+
*/
|
|
53
|
+
async byRight(rightId, opts = {}) {
|
|
54
|
+
return await this.list({
|
|
55
|
+
where: { ...opts, [this.rightField]: rightId },
|
|
56
|
+
...this.sortField ? { orderBy: `${camelToSnake(this.sortField)} ASC` } : {}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Create a new junction row linking `leftId` ↔ `rightId`.
|
|
61
|
+
*
|
|
62
|
+
* Goes through `SmrtCollection.create` which performs an upsert keyed on
|
|
63
|
+
* the model's `@smrt({ conflictColumns })`. Duplicates on the conflict key
|
|
64
|
+
* resolve to an UPDATE that rewrites every column — including the row's
|
|
65
|
+
* `id` and any timestamp columns — to the new instance's values. For most
|
|
66
|
+
* junctions that's fine: callers identify rows by (left, right, discriminator),
|
|
67
|
+
* not by junction-row-id, so id rewrites are invisible.
|
|
68
|
+
*
|
|
69
|
+
* If your junction table is externally addressable by id (e.g. its rows
|
|
70
|
+
* are exposed under `/api/v1/<table>/[id]`), override this method with a
|
|
71
|
+
* find-or-create check to preserve id stability across duplicate calls.
|
|
72
|
+
* See `ContentReferences.attach` for an example.
|
|
73
|
+
*
|
|
74
|
+
* @param opts - Extra fields to write into the row (e.g. `{ relationship, sortOrder, tenantId }`)
|
|
75
|
+
*/
|
|
76
|
+
async attach(leftId, rightId, opts = {}) {
|
|
77
|
+
return await this.create({
|
|
78
|
+
// Spread opts FIRST so the fixed key fields always win — prevents
|
|
79
|
+
// a caller-supplied `{ [leftField]: otherId }` from retargeting
|
|
80
|
+
// the write when opts is forwarded from untrusted input.
|
|
81
|
+
...opts,
|
|
82
|
+
[this.leftField]: leftId,
|
|
83
|
+
[this.rightField]: rightId
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Delete all junction rows matching `leftId` + `rightId` (+ optional filter `opts`).
|
|
88
|
+
*
|
|
89
|
+
* @param opts - Additional WHERE filters (e.g. `{ relationship: 'thumbnail' }`)
|
|
90
|
+
*/
|
|
91
|
+
async detach(leftId, rightId, opts = {}) {
|
|
92
|
+
const links = await this.list({
|
|
93
|
+
where: {
|
|
94
|
+
...opts,
|
|
95
|
+
[this.leftField]: leftId,
|
|
96
|
+
[this.rightField]: rightId
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
for (const link of links) {
|
|
100
|
+
await link.delete();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Replace the full set of right-side rows for a `leftId`, scoped by `opts`.
|
|
105
|
+
*
|
|
106
|
+
* Behavior:
|
|
107
|
+
* 1. Snapshots and deletes existing rows matching `{ leftField: leftId, ...opts }`.
|
|
108
|
+
* 2. Creates a new row for each `rightId`, spreading `opts` into the row data.
|
|
109
|
+
* 3. If `positionField` is set and `opts` doesn't specify it, assigns the array index.
|
|
110
|
+
*
|
|
111
|
+
* Not transactional — partial failure leaves the table in a mixed state.
|
|
112
|
+
* For atomic replaces, wrap the call in your own DB transaction.
|
|
113
|
+
*/
|
|
114
|
+
async setLinks(leftId, rightIds, opts = {}) {
|
|
115
|
+
const snapshotOpts = { ...opts };
|
|
116
|
+
delete snapshotOpts[this.rightField];
|
|
117
|
+
const existing = await this.list({
|
|
118
|
+
where: { ...snapshotOpts, [this.leftField]: leftId }
|
|
119
|
+
});
|
|
120
|
+
for (const link of existing) {
|
|
121
|
+
await link.delete();
|
|
122
|
+
}
|
|
123
|
+
const positionKey = this.positionField;
|
|
124
|
+
for (let i = 0; i < rightIds.length; i++) {
|
|
125
|
+
const rowOpts = { ...opts };
|
|
126
|
+
if (positionKey && rowOpts[positionKey] === void 0) {
|
|
127
|
+
rowOpts[positionKey] = i;
|
|
128
|
+
}
|
|
129
|
+
await this.attach(leftId, rightIds[i], rowOpts);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
export {
|
|
134
|
+
SmrtJunction
|
|
135
|
+
};
|
|
136
|
+
//# sourceMappingURL=junction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"junction.js","sources":["../src/junction.ts"],"sourcesContent":["/**\n * SmrtJunction — base class for two-sided junction (many-to-many) collections.\n *\n * A junction collection manages rows that link a \"left\" entity to a \"right\" entity,\n * typically with discriminator fields (relationship/role) and an optional sortOrder.\n * Examples in the monorepo:\n *\n * | Subclass | Left field | Right field | Discriminator |\n * |--------------------------------|---------------|-------------|-----------------|\n * | ContentAssetCollection | contentId | assetId | relationship |\n * | PerformerOwnedAssetCollection | performerId | assetId | role |\n * | PlaceAssetCollection | placeId | assetId | relationship |\n * | EventParticipantCollection | eventId | profileId | role |\n * | FactContentCollection | factId | contentId | relationship |\n *\n * Each subclass declares `leftField` / `rightField` (camelCase) and optionally\n * overrides `sortField` (defaults to `'sortOrder'`; set `null` to disable ORDER BY).\n *\n * Polymorphic subclasses (where \"left\" or \"right\" is a composite key like\n * `metaType + metaId`) may override `byLeft` / `byRight` / `attach` / `detach`\n * with diverging signatures — see `AssetAssociationCollection` for a reference.\n *\n * @typeParam TItem - The junction row class (extends `SmrtObject`)\n */\n\nimport { SmrtCollection } from './collection';\nimport type { SmrtObject } from './object';\n\n/**\n * Options passed to `attach` / `setLinks` — written into the created junction row.\n *\n * Common keys: `relationship`, `role`, `sortOrder`, `tenantId`.\n * Subclass-specific keys (e.g. `placement`, `groupId` on EventParticipant) pass through.\n * Keys must match actual camelCase column names on the junction model; unknown\n * keys are rejected by `SmrtCollection.create`'s WHERE/field validation.\n */\nexport type JunctionAttachOptions = Record<string, unknown>;\n\n/**\n * Options passed to `byLeft` / `byRight` / `detach` — additional WHERE filters\n * narrowing the operation. Keys must match camelCase column names.\n */\nexport type JunctionFilterOptions = Record<string, unknown>;\n\nfunction camelToSnake(name: string): string {\n return name.replace(/[A-Z]/g, (m) => `_${m.toLowerCase()}`);\n}\n\nexport abstract class SmrtJunction<\n TItem extends SmrtObject,\n> extends SmrtCollection<TItem> {\n /**\n * Internal marker used by `SmrtCollection.create` to detect that this\n * subclass is a junction and apply a registration-presence guard. Static\n * property is inherited by all subclasses via the constructor chain.\n * Don't rename or remove without also updating the guard.\n */\n static readonly _isJunctionBase = true as const;\n\n /** Field name (camelCase) holding the \"left\" foreign key, e.g. `'contentId'`. */\n protected abstract leftField: string;\n\n /** Field name (camelCase) holding the \"right\" foreign key, e.g. `'assetId'`. */\n protected abstract rightField: string;\n\n /**\n * Field name (camelCase) used to ORDER BY when calling `byLeft` / `byRight`.\n * Defaults to `'sortOrder'`. Set to `null` to omit ORDER BY entirely.\n *\n * Independent from `positionField` — `sortField` is a *query* concern\n * (how rows are ordered when read), while `positionField` is a *write*\n * concern (what column `setLinks` auto-assigns to). Tables that order\n * by a non-position field (e.g. `'createdAt'`) should set `sortField`\n * accordingly and leave `positionField` set to `null` or its dedicated\n * position column name.\n */\n protected sortField: string | null = 'sortOrder';\n\n /**\n * Field name (camelCase) that `setLinks` auto-assigns the array index\n * to when the caller doesn't supply a value. Defaults to `'sortOrder'`.\n * Set to `null` for tables without a dedicated position column (e.g.\n * pure-key junctions, or tables ordered by timestamps).\n *\n * Writing the array index into a non-position field — like `createdAt`\n * or `placement` — would corrupt data. Subclasses without a numeric\n * position column MUST set this to `null`.\n */\n protected positionField: string | null = 'sortOrder';\n\n /**\n * Return junction rows where the left FK matches `leftId`, narrowed by\n * optional additional WHERE filters. Ordered ASC by `sortField` if set.\n */\n async byLeft(\n leftId: string,\n opts: JunctionFilterOptions = {},\n ): Promise<TItem[]> {\n return (await this.list({\n // Spread opts FIRST so the fixed key always wins — prevents a\n // caller-supplied `{ [leftField]: otherId }` from retargeting the\n // query when opts is forwarded from untrusted input.\n where: { ...opts, [this.leftField]: leftId },\n ...(this.sortField\n ? { orderBy: `${camelToSnake(this.sortField)} ASC` }\n : {}),\n })) as TItem[];\n }\n\n /**\n * Return junction rows where the right FK matches `rightId`, narrowed by\n * optional additional WHERE filters. Ordered ASC by `sortField` if set.\n */\n async byRight(\n rightId: string,\n opts: JunctionFilterOptions = {},\n ): Promise<TItem[]> {\n return (await this.list({\n where: { ...opts, [this.rightField]: rightId },\n ...(this.sortField\n ? { orderBy: `${camelToSnake(this.sortField)} ASC` }\n : {}),\n })) as TItem[];\n }\n\n /**\n * Create a new junction row linking `leftId` ↔ `rightId`.\n *\n * Goes through `SmrtCollection.create` which performs an upsert keyed on\n * the model's `@smrt({ conflictColumns })`. Duplicates on the conflict key\n * resolve to an UPDATE that rewrites every column — including the row's\n * `id` and any timestamp columns — to the new instance's values. For most\n * junctions that's fine: callers identify rows by (left, right, discriminator),\n * not by junction-row-id, so id rewrites are invisible.\n *\n * If your junction table is externally addressable by id (e.g. its rows\n * are exposed under `/api/v1/<table>/[id]`), override this method with a\n * find-or-create check to preserve id stability across duplicate calls.\n * See `ContentReferences.attach` for an example.\n *\n * @param opts - Extra fields to write into the row (e.g. `{ relationship, sortOrder, tenantId }`)\n */\n async attach(\n leftId: string,\n rightId: string,\n opts: JunctionAttachOptions = {},\n ): Promise<TItem> {\n return (await this.create({\n // Spread opts FIRST so the fixed key fields always win — prevents\n // a caller-supplied `{ [leftField]: otherId }` from retargeting\n // the write when opts is forwarded from untrusted input.\n ...opts,\n [this.leftField]: leftId,\n [this.rightField]: rightId,\n } as any)) as TItem;\n }\n\n /**\n * Delete all junction rows matching `leftId` + `rightId` (+ optional filter `opts`).\n *\n * @param opts - Additional WHERE filters (e.g. `{ relationship: 'thumbnail' }`)\n */\n async detach(\n leftId: string,\n rightId: string,\n opts: JunctionFilterOptions = {},\n ): Promise<void> {\n const links = (await this.list({\n where: {\n ...opts,\n [this.leftField]: leftId,\n [this.rightField]: rightId,\n },\n })) as TItem[];\n for (const link of links) {\n await (link as unknown as { delete(): Promise<void> }).delete();\n }\n }\n\n /**\n * Replace the full set of right-side rows for a `leftId`, scoped by `opts`.\n *\n * Behavior:\n * 1. Snapshots and deletes existing rows matching `{ leftField: leftId, ...opts }`.\n * 2. Creates a new row for each `rightId`, spreading `opts` into the row data.\n * 3. If `positionField` is set and `opts` doesn't specify it, assigns the array index.\n *\n * Not transactional — partial failure leaves the table in a mixed state.\n * For atomic replaces, wrap the call in your own DB transaction.\n */\n async setLinks(\n leftId: string,\n rightIds: string[],\n opts: JunctionAttachOptions = {},\n ): Promise<void> {\n // Strip the right-side key from snapshot opts — leaving it in would\n // narrow the delete to one specific right id, but `setLinks` is\n // contractually \"replace the full set of right rows for leftId\n // within the opts scope\". A rightField filter contradicts that.\n const snapshotOpts: JunctionAttachOptions = { ...opts };\n delete snapshotOpts[this.rightField];\n\n const existing = (await this.list({\n where: { ...snapshotOpts, [this.leftField]: leftId },\n })) as TItem[];\n for (const link of existing) {\n await (link as unknown as { delete(): Promise<void> }).delete();\n }\n\n const positionKey = this.positionField;\n for (let i = 0; i < rightIds.length; i++) {\n const rowOpts: JunctionAttachOptions = { ...opts };\n if (positionKey && rowOpts[positionKey] === undefined) {\n rowOpts[positionKey] = i;\n }\n await this.attach(leftId, rightIds[i], rowOpts);\n }\n }\n}\n"],"names":[],"mappings":";AA4CA,SAAS,aAAa,MAAsB;AAC1C,SAAO,KAAK,QAAQ,UAAU,CAAC,MAAM,IAAI,EAAE,YAAA,CAAa,EAAE;AAC5D;AAEO,MAAe,qBAEZ,eAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO9B,OAAgB,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBxB,YAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAY3B,gBAA+B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMzC,MAAM,OACJ,QACA,OAA8B,IACZ;AAClB,WAAQ,MAAM,KAAK,KAAK;AAAA;AAAA;AAAA;AAAA,MAItB,OAAO,EAAE,GAAG,MAAM,CAAC,KAAK,SAAS,GAAG,OAAA;AAAA,MACpC,GAAI,KAAK,YACL,EAAE,SAAS,GAAG,aAAa,KAAK,SAAS,CAAC,WAC1C,CAAA;AAAA,IAAC,CACN;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QACJ,SACA,OAA8B,IACZ;AAClB,WAAQ,MAAM,KAAK,KAAK;AAAA,MACtB,OAAO,EAAE,GAAG,MAAM,CAAC,KAAK,UAAU,GAAG,QAAA;AAAA,MACrC,GAAI,KAAK,YACL,EAAE,SAAS,GAAG,aAAa,KAAK,SAAS,CAAC,WAC1C,CAAA;AAAA,IAAC,CACN;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,OACJ,QACA,SACA,OAA8B,CAAA,GACd;AAChB,WAAQ,MAAM,KAAK,OAAO;AAAA;AAAA;AAAA;AAAA,MAIxB,GAAG;AAAA,MACH,CAAC,KAAK,SAAS,GAAG;AAAA,MAClB,CAAC,KAAK,UAAU,GAAG;AAAA,IAAA,CACb;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OACJ,QACA,SACA,OAA8B,CAAA,GACf;AACf,UAAM,QAAS,MAAM,KAAK,KAAK;AAAA,MAC7B,OAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,KAAK,SAAS,GAAG;AAAA,QAClB,CAAC,KAAK,UAAU,GAAG;AAAA,MAAA;AAAA,IACrB,CACD;AACD,eAAW,QAAQ,OAAO;AACxB,YAAO,KAAgD,OAAA;AAAA,IACzD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,SACJ,QACA,UACA,OAA8B,CAAA,GACf;AAKf,UAAM,eAAsC,EAAE,GAAG,KAAA;AACjD,WAAO,aAAa,KAAK,UAAU;AAEnC,UAAM,WAAY,MAAM,KAAK,KAAK;AAAA,MAChC,OAAO,EAAE,GAAG,cAAc,CAAC,KAAK,SAAS,GAAG,OAAA;AAAA,IAAO,CACpD;AACD,eAAW,QAAQ,UAAU;AAC3B,YAAO,KAAgD,OAAA;AAAA,IACzD;AAEA,UAAM,cAAc,KAAK;AACzB,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,YAAM,UAAiC,EAAE,GAAG,KAAA;AAC5C,UAAI,eAAe,QAAQ,WAAW,MAAM,QAAW;AACrD,gBAAQ,WAAW,IAAI;AAAA,MACzB;AACA,YAAM,KAAK,OAAO,QAAQ,SAAS,CAAC,GAAG,OAAO;AAAA,IAChD;AAAA,EACF;AACF;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DomainKnowledgeConfig, DomainKnowledgeManifest } from '@happyvertical/smrt-types';
|
|
2
|
+
import { SmartObjectManifest } from './scanner/types.js';
|
|
3
|
+
export interface BuildDomainKnowledgeOptions {
|
|
4
|
+
manifest: SmartObjectManifest;
|
|
5
|
+
rootDir: string;
|
|
6
|
+
packageJson?: Record<string, any>;
|
|
7
|
+
manifestPath?: string;
|
|
8
|
+
config?: DomainKnowledgeConfig;
|
|
9
|
+
}
|
|
10
|
+
export declare function buildDomainKnowledgeManifest(options: BuildDomainKnowledgeOptions): DomainKnowledgeManifest;
|
|
11
|
+
//# sourceMappingURL=knowledge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../src/knowledge.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,qBAAqB,EACrB,uBAAuB,EAGxB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAEV,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC;AAkCD,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,2BAA2B,GACnC,uBAAuB,CAsDzB"}
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { readFileSync, existsSync, readdirSync } from "node:fs";
|
|
3
|
+
import { relative, join } from "node:path";
|
|
4
|
+
const SDK_PACKAGE_NAMES = /* @__PURE__ */ new Set([
|
|
5
|
+
"@happyvertical/ai",
|
|
6
|
+
"@happyvertical/cache",
|
|
7
|
+
"@happyvertical/documents",
|
|
8
|
+
"@happyvertical/email",
|
|
9
|
+
"@happyvertical/encryption",
|
|
10
|
+
"@happyvertical/files",
|
|
11
|
+
"@happyvertical/geo",
|
|
12
|
+
"@happyvertical/images",
|
|
13
|
+
"@happyvertical/jobs",
|
|
14
|
+
"@happyvertical/json",
|
|
15
|
+
"@happyvertical/logger",
|
|
16
|
+
"@happyvertical/messages",
|
|
17
|
+
"@happyvertical/ocr",
|
|
18
|
+
"@happyvertical/pdf",
|
|
19
|
+
"@happyvertical/projects",
|
|
20
|
+
"@happyvertical/repos",
|
|
21
|
+
"@happyvertical/secrets",
|
|
22
|
+
"@happyvertical/spider",
|
|
23
|
+
"@happyvertical/sql",
|
|
24
|
+
"@happyvertical/utils"
|
|
25
|
+
]);
|
|
26
|
+
const RELATIONSHIP_FIELD_TYPES = /* @__PURE__ */ new Set([
|
|
27
|
+
"foreignKey",
|
|
28
|
+
"crossPackageRef",
|
|
29
|
+
"oneToMany",
|
|
30
|
+
"manyToMany"
|
|
31
|
+
]);
|
|
32
|
+
const STANDARD_OPERATIONS = ["list", "get", "create", "update", "delete"];
|
|
33
|
+
function buildDomainKnowledgeManifest(options) {
|
|
34
|
+
const rootDir = options.rootDir;
|
|
35
|
+
const packageJson = options.packageJson ?? readPackageJson(rootDir) ?? {};
|
|
36
|
+
const packageName = options.manifest.packageName ?? packageJson.name;
|
|
37
|
+
const packageVersion = options.manifest.packageVersion ?? packageJson.version;
|
|
38
|
+
const agentDocPath = existingPath(rootDir, "AGENTS.md");
|
|
39
|
+
const agentDoc = options.config?.includeDocs === false || !agentDocPath ? void 0 : readFileSync(agentDocPath, "utf8");
|
|
40
|
+
const allDependencies = {
|
|
41
|
+
...record(packageJson.dependencies),
|
|
42
|
+
...record(packageJson.devDependencies),
|
|
43
|
+
...record(packageJson.peerDependencies)
|
|
44
|
+
};
|
|
45
|
+
const manifestObjects = Object.values(options.manifest.objects).filter(
|
|
46
|
+
(object) => object.decoratorConfig?.knowledge !== false
|
|
47
|
+
);
|
|
48
|
+
const objects = manifestObjects.map((object) => buildKnowledgeObject(object));
|
|
49
|
+
const surfaces = objects.flatMap((object) => object.surfaces);
|
|
50
|
+
const manifestJson = stableJson(normalizeManifestForHash(options.manifest));
|
|
51
|
+
return {
|
|
52
|
+
schemaVersion: 1,
|
|
53
|
+
generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
54
|
+
packageName,
|
|
55
|
+
packageVersion,
|
|
56
|
+
sourceManifestPath: options.manifestPath ? relative(rootDir, options.manifestPath) : void 0,
|
|
57
|
+
agentDocPath: agentDocPath ? relative(rootDir, agentDocPath) : void 0,
|
|
58
|
+
sourceHashes: sourceHashes({
|
|
59
|
+
manifest: { content: manifestJson },
|
|
60
|
+
packageJson: fileHashSource(existingPath(rootDir, "package.json")),
|
|
61
|
+
agents: fileHashSource(agentDocPath)
|
|
62
|
+
}),
|
|
63
|
+
exports: exportKeys(packageJson.exports),
|
|
64
|
+
dependencies: allDependencies,
|
|
65
|
+
smrtDependencies: Object.keys(allDependencies).filter((dep) => dep.startsWith("@happyvertical/smrt-")).sort(),
|
|
66
|
+
sdkDependencies: Object.keys(allDependencies).filter((dep) => SDK_PACKAGE_NAMES.has(dep)).sort(),
|
|
67
|
+
tags: options.config?.tags ?? [],
|
|
68
|
+
summary: options.config?.summary,
|
|
69
|
+
risks: options.config?.risks ?? [],
|
|
70
|
+
objects,
|
|
71
|
+
surfaces,
|
|
72
|
+
prompts: options.config?.includePrompts === false ? [] : readPrompts(rootDir),
|
|
73
|
+
relationshipsV2: summarizeRelationships(objects, manifestObjects),
|
|
74
|
+
agentDoc
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
function buildKnowledgeObject(object) {
|
|
78
|
+
const knowledge = typeof object.decoratorConfig?.knowledge === "object" ? object.decoratorConfig.knowledge : {};
|
|
79
|
+
const fields = Object.entries(object.fields).map(([name, field]) => ({
|
|
80
|
+
name,
|
|
81
|
+
type: field.type,
|
|
82
|
+
required: field.required,
|
|
83
|
+
related: field.related,
|
|
84
|
+
columnType: columnType(object, name)
|
|
85
|
+
}));
|
|
86
|
+
const relationships = fields.filter((field) => RELATIONSHIP_FIELD_TYPES.has(field.type)).map((field) => ({
|
|
87
|
+
name: field.name,
|
|
88
|
+
type: field.type,
|
|
89
|
+
required: field.required,
|
|
90
|
+
related: field.related,
|
|
91
|
+
columnType: field.columnType
|
|
92
|
+
}));
|
|
93
|
+
return {
|
|
94
|
+
name: object.className,
|
|
95
|
+
qualifiedName: object.qualifiedName,
|
|
96
|
+
collection: object.collection,
|
|
97
|
+
tableName: object.schema?.tableName,
|
|
98
|
+
packageName: object.packageName,
|
|
99
|
+
extends: object.extends,
|
|
100
|
+
visibility: object.visibility,
|
|
101
|
+
fields,
|
|
102
|
+
relationships,
|
|
103
|
+
methods: Object.keys(object.methods).sort(),
|
|
104
|
+
surfaces: objectSurfaces(object),
|
|
105
|
+
relationshipFeatures: relationshipFeatures(object),
|
|
106
|
+
tags: knowledge.tags ?? [],
|
|
107
|
+
summary: knowledge.summary,
|
|
108
|
+
risks: knowledge.risks ?? []
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function objectSurfaces(object) {
|
|
112
|
+
return [
|
|
113
|
+
...configuredSurfaces("api", object),
|
|
114
|
+
...configuredSurfaces("cli", object),
|
|
115
|
+
...configuredSurfaces("mcp", object),
|
|
116
|
+
...aiSurfaces(object)
|
|
117
|
+
];
|
|
118
|
+
}
|
|
119
|
+
function configuredSurfaces(kind, object) {
|
|
120
|
+
const config = object.decoratorConfig?.[kind];
|
|
121
|
+
if (!config) return [];
|
|
122
|
+
const operations = configuredOperations(config);
|
|
123
|
+
return operations.map((operation) => ({
|
|
124
|
+
kind,
|
|
125
|
+
name: kind === "api" ? `${object.collection}.${operation}` : `${object.className.toLowerCase()}_${operation}`,
|
|
126
|
+
operation,
|
|
127
|
+
objectName: object.qualifiedName ?? object.className,
|
|
128
|
+
path: kind === "api" ? apiPath(object, operation) : void 0,
|
|
129
|
+
method: kind === "api" ? apiMethod(operation) : void 0
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
function configuredOperations(config) {
|
|
133
|
+
if (config === true) return [...STANDARD_OPERATIONS];
|
|
134
|
+
if (!config || typeof config !== "object" || Array.isArray(config)) {
|
|
135
|
+
return [];
|
|
136
|
+
}
|
|
137
|
+
const recordConfig = config;
|
|
138
|
+
const base = Array.isArray(recordConfig.include) ? recordConfig.include : STANDARD_OPERATIONS;
|
|
139
|
+
const excluded = new Set(recordConfig.exclude ?? []);
|
|
140
|
+
return [...new Set(base.filter((operation) => !excluded.has(operation)))];
|
|
141
|
+
}
|
|
142
|
+
function aiSurfaces(object) {
|
|
143
|
+
return (object.tools ?? []).map((tool) => ({
|
|
144
|
+
kind: "ai",
|
|
145
|
+
name: tool.function.name,
|
|
146
|
+
operation: tool.function.name,
|
|
147
|
+
description: tool.function.description,
|
|
148
|
+
objectName: object.qualifiedName ?? object.className
|
|
149
|
+
}));
|
|
150
|
+
}
|
|
151
|
+
function apiPath(object, operation) {
|
|
152
|
+
const collection = object.decoratorConfig?.api;
|
|
153
|
+
const configuredPath = typeof collection === "object" && typeof collection.path === "string" ? collection.path : object.collection.replaceAll("_", "-");
|
|
154
|
+
if (operation === "list" || operation === "create") {
|
|
155
|
+
return `/${configuredPath}`;
|
|
156
|
+
}
|
|
157
|
+
if (STANDARD_OPERATIONS.includes(operation)) {
|
|
158
|
+
return `/${configuredPath}/[id]`;
|
|
159
|
+
}
|
|
160
|
+
return `/${configuredPath}/${operation}`;
|
|
161
|
+
}
|
|
162
|
+
function apiMethod(operation) {
|
|
163
|
+
switch (operation) {
|
|
164
|
+
case "list":
|
|
165
|
+
case "get":
|
|
166
|
+
return "GET";
|
|
167
|
+
case "create":
|
|
168
|
+
return "POST";
|
|
169
|
+
case "update":
|
|
170
|
+
return "PATCH";
|
|
171
|
+
case "delete":
|
|
172
|
+
return "DELETE";
|
|
173
|
+
default:
|
|
174
|
+
return "POST";
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function relationshipFeatures(object) {
|
|
178
|
+
const features = /* @__PURE__ */ new Set();
|
|
179
|
+
for (const field of Object.values(object.fields)) {
|
|
180
|
+
if (field.type === "foreignKey") features.add("foreignKey");
|
|
181
|
+
if (field.type === "crossPackageRef") features.add("crossPackageRef");
|
|
182
|
+
if (field.type === "oneToMany") features.add("oneToMany");
|
|
183
|
+
if (field.type === "manyToMany") features.add("manyToMany");
|
|
184
|
+
}
|
|
185
|
+
if (object.extends === "SmrtJunction") features.add("SmrtJunction");
|
|
186
|
+
if (object.extends === "SmrtHierarchical") features.add("SmrtHierarchical");
|
|
187
|
+
if (object.extends === "SmrtPolymorphicAssociation" || object.fields.metaType || object.fields.metaId) {
|
|
188
|
+
features.add("SmrtPolymorphicAssociation");
|
|
189
|
+
}
|
|
190
|
+
if (Object.keys(object.schema?.columns ?? {}).some(
|
|
191
|
+
(name) => object.schema?.columns[name]?.type === "UUID"
|
|
192
|
+
)) {
|
|
193
|
+
features.add("uuidColumns");
|
|
194
|
+
}
|
|
195
|
+
return [...features].sort();
|
|
196
|
+
}
|
|
197
|
+
function summarizeRelationships(objects, manifestObjects) {
|
|
198
|
+
const fields = objects.flatMap((object) => object.fields);
|
|
199
|
+
return {
|
|
200
|
+
foreignKeyFields: fields.filter((field) => field.type === "foreignKey").length,
|
|
201
|
+
crossPackageRefFields: fields.filter(
|
|
202
|
+
(field) => field.type === "crossPackageRef"
|
|
203
|
+
).length,
|
|
204
|
+
junctionCollections: objects.filter(
|
|
205
|
+
(object) => object.relationshipFeatures.includes("SmrtJunction")
|
|
206
|
+
).length,
|
|
207
|
+
hierarchicalObjects: objects.filter(
|
|
208
|
+
(object) => object.relationshipFeatures.includes("SmrtHierarchical")
|
|
209
|
+
).length,
|
|
210
|
+
polymorphicAssociations: objects.filter(
|
|
211
|
+
(object) => object.relationshipFeatures.includes("SmrtPolymorphicAssociation")
|
|
212
|
+
).length,
|
|
213
|
+
uuidColumns: manifestObjects.reduce(
|
|
214
|
+
(count, object) => count + Object.values(object.schema?.columns ?? {}).filter(
|
|
215
|
+
(column) => column.type === "UUID"
|
|
216
|
+
).length,
|
|
217
|
+
0
|
|
218
|
+
)
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
function columnType(object, fieldName) {
|
|
222
|
+
const columnName = camelToSnake(fieldName);
|
|
223
|
+
return object.schema?.columns[columnName]?.type;
|
|
224
|
+
}
|
|
225
|
+
function readPrompts(rootDir) {
|
|
226
|
+
const srcDir = join(rootDir, "src");
|
|
227
|
+
if (!existsSync(srcDir)) return [];
|
|
228
|
+
const prompts = [];
|
|
229
|
+
for (const filePath of walkFiles(srcDir)) {
|
|
230
|
+
if (!filePath.endsWith(".ts")) continue;
|
|
231
|
+
const content = readFileSync(filePath, "utf8");
|
|
232
|
+
if (!content.includes("definePrompt")) continue;
|
|
233
|
+
const keyMatch = content.match(/definePrompt\s*\(\s*['"`]([^'"`]+)['"`]/);
|
|
234
|
+
prompts.push({
|
|
235
|
+
filePath: relative(rootDir, filePath),
|
|
236
|
+
key: keyMatch?.[1]
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
return prompts;
|
|
240
|
+
}
|
|
241
|
+
function walkFiles(dir) {
|
|
242
|
+
const files = [];
|
|
243
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
244
|
+
if (entry.name === "node_modules" || entry.name === "dist" || entry.name === ".svelte-kit") {
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
const fullPath = join(dir, entry.name);
|
|
248
|
+
if (entry.isDirectory()) {
|
|
249
|
+
files.push(...walkFiles(fullPath));
|
|
250
|
+
} else if (entry.isFile()) {
|
|
251
|
+
files.push(fullPath);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return files;
|
|
255
|
+
}
|
|
256
|
+
function sourceHashes(sources) {
|
|
257
|
+
const hashes = {};
|
|
258
|
+
for (const [name, source] of Object.entries(sources)) {
|
|
259
|
+
if (!source) continue;
|
|
260
|
+
const content = "content" in source ? source.content : readFileSync(source.path, "utf8");
|
|
261
|
+
hashes[name] = createHash("sha256").update(content).digest("hex");
|
|
262
|
+
}
|
|
263
|
+
return hashes;
|
|
264
|
+
}
|
|
265
|
+
function fileHashSource(path) {
|
|
266
|
+
return path ? { path } : void 0;
|
|
267
|
+
}
|
|
268
|
+
function existingPath(rootDir, path) {
|
|
269
|
+
const fullPath = join(rootDir, path);
|
|
270
|
+
return existsSync(fullPath) ? fullPath : void 0;
|
|
271
|
+
}
|
|
272
|
+
function readPackageJson(rootDir) {
|
|
273
|
+
const path = join(rootDir, "package.json");
|
|
274
|
+
if (!existsSync(path)) return null;
|
|
275
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
276
|
+
}
|
|
277
|
+
function record(value) {
|
|
278
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) ? value : {};
|
|
279
|
+
}
|
|
280
|
+
function exportKeys(exportsField) {
|
|
281
|
+
if (typeof exportsField === "string") return ["."];
|
|
282
|
+
if (typeof exportsField !== "object" || exportsField === null || Array.isArray(exportsField)) {
|
|
283
|
+
return [];
|
|
284
|
+
}
|
|
285
|
+
return Object.keys(exportsField).sort();
|
|
286
|
+
}
|
|
287
|
+
function camelToSnake(value) {
|
|
288
|
+
return value.replace(/([a-z0-9])([A-Z])/g, "$1_$2").replace(/[-\s]+/g, "_").toLowerCase();
|
|
289
|
+
}
|
|
290
|
+
function normalizeManifestForHash(manifest) {
|
|
291
|
+
const normalized = JSON.parse(JSON.stringify(manifest));
|
|
292
|
+
delete normalized.timestamp;
|
|
293
|
+
return normalized;
|
|
294
|
+
}
|
|
295
|
+
function stableJson(value) {
|
|
296
|
+
return JSON.stringify(sortJson(value), null, 2);
|
|
297
|
+
}
|
|
298
|
+
function sortJson(value) {
|
|
299
|
+
if (Array.isArray(value)) return value.map(sortJson);
|
|
300
|
+
if (value && typeof value === "object") {
|
|
301
|
+
return Object.fromEntries(
|
|
302
|
+
Object.entries(value).sort(([a], [b]) => a.localeCompare(b)).map(([key, entry]) => [key, sortJson(entry)])
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
return value;
|
|
306
|
+
}
|
|
307
|
+
export {
|
|
308
|
+
buildDomainKnowledgeManifest
|
|
309
|
+
};
|
|
310
|
+
//# sourceMappingURL=knowledge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge.js","sources":["../src/knowledge.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join, relative } from 'node:path';\nimport type {\n DomainKnowledgeConfig,\n DomainKnowledgeManifest,\n DomainKnowledgeObject,\n DomainKnowledgeSurface,\n} from '@happyvertical/smrt-types';\nimport type {\n SmartObjectDefinition,\n SmartObjectManifest,\n} from './scanner/types.js';\n\nexport interface BuildDomainKnowledgeOptions {\n manifest: SmartObjectManifest;\n rootDir: string;\n packageJson?: Record<string, any>;\n manifestPath?: string;\n config?: DomainKnowledgeConfig;\n}\n\nconst SDK_PACKAGE_NAMES = new Set([\n '@happyvertical/ai',\n '@happyvertical/cache',\n '@happyvertical/documents',\n '@happyvertical/email',\n '@happyvertical/encryption',\n '@happyvertical/files',\n '@happyvertical/geo',\n '@happyvertical/images',\n '@happyvertical/jobs',\n '@happyvertical/json',\n '@happyvertical/logger',\n '@happyvertical/messages',\n '@happyvertical/ocr',\n '@happyvertical/pdf',\n '@happyvertical/projects',\n '@happyvertical/repos',\n '@happyvertical/secrets',\n '@happyvertical/spider',\n '@happyvertical/sql',\n '@happyvertical/utils',\n]);\n\nconst RELATIONSHIP_FIELD_TYPES = new Set([\n 'foreignKey',\n 'crossPackageRef',\n 'oneToMany',\n 'manyToMany',\n]);\n\nconst STANDARD_OPERATIONS = ['list', 'get', 'create', 'update', 'delete'];\n\nexport function buildDomainKnowledgeManifest(\n options: BuildDomainKnowledgeOptions,\n): DomainKnowledgeManifest {\n const rootDir = options.rootDir;\n const packageJson = options.packageJson ?? readPackageJson(rootDir) ?? {};\n const packageName = options.manifest.packageName ?? packageJson.name;\n const packageVersion = options.manifest.packageVersion ?? packageJson.version;\n const agentDocPath = existingPath(rootDir, 'AGENTS.md');\n const agentDoc =\n options.config?.includeDocs === false || !agentDocPath\n ? undefined\n : readFileSync(agentDocPath, 'utf8');\n const allDependencies = {\n ...record(packageJson.dependencies),\n ...record(packageJson.devDependencies),\n ...record(packageJson.peerDependencies),\n };\n const manifestObjects = Object.values(options.manifest.objects).filter(\n (object) => object.decoratorConfig?.knowledge !== false,\n );\n const objects = manifestObjects.map((object) => buildKnowledgeObject(object));\n const surfaces = objects.flatMap((object) => object.surfaces);\n const manifestJson = stableJson(normalizeManifestForHash(options.manifest));\n\n return {\n schemaVersion: 1,\n generatedAt: new Date().toISOString(),\n packageName,\n packageVersion,\n sourceManifestPath: options.manifestPath\n ? relative(rootDir, options.manifestPath)\n : undefined,\n agentDocPath: agentDocPath ? relative(rootDir, agentDocPath) : undefined,\n sourceHashes: sourceHashes({\n manifest: { content: manifestJson },\n packageJson: fileHashSource(existingPath(rootDir, 'package.json')),\n agents: fileHashSource(agentDocPath),\n }),\n exports: exportKeys(packageJson.exports),\n dependencies: allDependencies,\n smrtDependencies: Object.keys(allDependencies)\n .filter((dep) => dep.startsWith('@happyvertical/smrt-'))\n .sort(),\n sdkDependencies: Object.keys(allDependencies)\n .filter((dep) => SDK_PACKAGE_NAMES.has(dep))\n .sort(),\n tags: options.config?.tags ?? [],\n summary: options.config?.summary,\n risks: options.config?.risks ?? [],\n objects,\n surfaces,\n prompts:\n options.config?.includePrompts === false ? [] : readPrompts(rootDir),\n relationshipsV2: summarizeRelationships(objects, manifestObjects),\n agentDoc,\n };\n}\n\nfunction buildKnowledgeObject(\n object: SmartObjectDefinition,\n): DomainKnowledgeObject {\n const knowledge =\n typeof object.decoratorConfig?.knowledge === 'object'\n ? object.decoratorConfig.knowledge\n : {};\n const fields = Object.entries(object.fields).map(([name, field]) => ({\n name,\n type: field.type,\n required: field.required,\n related: field.related,\n columnType: columnType(object, name),\n }));\n const relationships = fields\n .filter((field) => RELATIONSHIP_FIELD_TYPES.has(field.type))\n .map((field) => ({\n name: field.name,\n type: field.type,\n required: field.required,\n related: field.related,\n columnType: field.columnType,\n }));\n\n return {\n name: object.className,\n qualifiedName: object.qualifiedName,\n collection: object.collection,\n tableName: object.schema?.tableName,\n packageName: object.packageName,\n extends: object.extends,\n visibility: object.visibility,\n fields,\n relationships,\n methods: Object.keys(object.methods).sort(),\n surfaces: objectSurfaces(object),\n relationshipFeatures: relationshipFeatures(object),\n tags: knowledge.tags ?? [],\n summary: knowledge.summary,\n risks: knowledge.risks ?? [],\n };\n}\n\nfunction objectSurfaces(\n object: SmartObjectDefinition,\n): DomainKnowledgeSurface[] {\n return [\n ...configuredSurfaces('api', object),\n ...configuredSurfaces('cli', object),\n ...configuredSurfaces('mcp', object),\n ...aiSurfaces(object),\n ];\n}\n\nfunction configuredSurfaces(\n kind: 'api' | 'cli' | 'mcp',\n object: SmartObjectDefinition,\n): DomainKnowledgeSurface[] {\n const config = object.decoratorConfig?.[kind];\n if (!config) return [];\n const operations = configuredOperations(config);\n return operations.map((operation) => ({\n kind,\n name:\n kind === 'api'\n ? `${object.collection}.${operation}`\n : `${object.className.toLowerCase()}_${operation}`,\n operation,\n objectName: object.qualifiedName ?? object.className,\n path: kind === 'api' ? apiPath(object, operation) : undefined,\n method: kind === 'api' ? apiMethod(operation) : undefined,\n }));\n}\n\nfunction configuredOperations(config: unknown): string[] {\n if (config === true) return [...STANDARD_OPERATIONS];\n if (!config || typeof config !== 'object' || Array.isArray(config)) {\n return [];\n }\n const recordConfig = config as { include?: string[]; exclude?: string[] };\n const base = Array.isArray(recordConfig.include)\n ? recordConfig.include\n : STANDARD_OPERATIONS;\n const excluded = new Set(recordConfig.exclude ?? []);\n return [...new Set(base.filter((operation) => !excluded.has(operation)))];\n}\n\nfunction aiSurfaces(object: SmartObjectDefinition): DomainKnowledgeSurface[] {\n return (object.tools ?? []).map((tool) => ({\n kind: 'ai',\n name: tool.function.name,\n operation: tool.function.name,\n description: tool.function.description,\n objectName: object.qualifiedName ?? object.className,\n }));\n}\n\nfunction apiPath(object: SmartObjectDefinition, operation: string): string {\n const collection = object.decoratorConfig?.api;\n const configuredPath =\n typeof collection === 'object' && typeof collection.path === 'string'\n ? collection.path\n : object.collection.replaceAll('_', '-');\n if (operation === 'list' || operation === 'create') {\n return `/${configuredPath}`;\n }\n if (STANDARD_OPERATIONS.includes(operation)) {\n return `/${configuredPath}/[id]`;\n }\n return `/${configuredPath}/${operation}`;\n}\n\nfunction apiMethod(operation: string): string {\n switch (operation) {\n case 'list':\n case 'get':\n return 'GET';\n case 'create':\n return 'POST';\n case 'update':\n return 'PATCH';\n case 'delete':\n return 'DELETE';\n default:\n return 'POST';\n }\n}\n\nfunction relationshipFeatures(object: SmartObjectDefinition): string[] {\n const features = new Set<string>();\n for (const field of Object.values(object.fields)) {\n if (field.type === 'foreignKey') features.add('foreignKey');\n if (field.type === 'crossPackageRef') features.add('crossPackageRef');\n if (field.type === 'oneToMany') features.add('oneToMany');\n if (field.type === 'manyToMany') features.add('manyToMany');\n }\n if (object.extends === 'SmrtJunction') features.add('SmrtJunction');\n if (object.extends === 'SmrtHierarchical') features.add('SmrtHierarchical');\n if (\n object.extends === 'SmrtPolymorphicAssociation' ||\n object.fields.metaType ||\n object.fields.metaId\n ) {\n features.add('SmrtPolymorphicAssociation');\n }\n if (\n Object.keys(object.schema?.columns ?? {}).some(\n (name) => object.schema?.columns[name]?.type === 'UUID',\n )\n ) {\n features.add('uuidColumns');\n }\n return [...features].sort();\n}\n\nfunction summarizeRelationships(\n objects: DomainKnowledgeObject[],\n manifestObjects: SmartObjectDefinition[],\n) {\n const fields = objects.flatMap((object) => object.fields);\n return {\n foreignKeyFields: fields.filter((field) => field.type === 'foreignKey')\n .length,\n crossPackageRefFields: fields.filter(\n (field) => field.type === 'crossPackageRef',\n ).length,\n junctionCollections: objects.filter((object) =>\n object.relationshipFeatures.includes('SmrtJunction'),\n ).length,\n hierarchicalObjects: objects.filter((object) =>\n object.relationshipFeatures.includes('SmrtHierarchical'),\n ).length,\n polymorphicAssociations: objects.filter((object) =>\n object.relationshipFeatures.includes('SmrtPolymorphicAssociation'),\n ).length,\n uuidColumns: manifestObjects.reduce(\n (count, object) =>\n count +\n Object.values(object.schema?.columns ?? {}).filter(\n (column) => column.type === 'UUID',\n ).length,\n 0,\n ),\n };\n}\n\nfunction columnType(\n object: SmartObjectDefinition,\n fieldName: string,\n): string | undefined {\n const columnName = camelToSnake(fieldName);\n return object.schema?.columns[columnName]?.type;\n}\n\nfunction readPrompts(\n rootDir: string,\n): Array<{ filePath: string; key?: string }> {\n const srcDir = join(rootDir, 'src');\n if (!existsSync(srcDir)) return [];\n const prompts: Array<{ filePath: string; key?: string }> = [];\n for (const filePath of walkFiles(srcDir)) {\n if (!filePath.endsWith('.ts')) continue;\n const content = readFileSync(filePath, 'utf8');\n if (!content.includes('definePrompt')) continue;\n const keyMatch = content.match(/definePrompt\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/);\n prompts.push({\n filePath: relative(rootDir, filePath),\n key: keyMatch?.[1],\n });\n }\n return prompts;\n}\n\nfunction walkFiles(dir: string): string[] {\n const files: string[] = [];\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (\n entry.name === 'node_modules' ||\n entry.name === 'dist' ||\n entry.name === '.svelte-kit'\n ) {\n continue;\n }\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...walkFiles(fullPath));\n } else if (entry.isFile()) {\n files.push(fullPath);\n }\n }\n return files;\n}\n\nfunction sourceHashes(sources: Record<string, HashSource | undefined>) {\n const hashes: Record<string, string> = {};\n for (const [name, source] of Object.entries(sources)) {\n if (!source) continue;\n const content =\n 'content' in source ? source.content : readFileSync(source.path, 'utf8');\n hashes[name] = createHash('sha256').update(content).digest('hex');\n }\n return hashes;\n}\n\ntype HashSource = { content: string } | { path: string };\n\nfunction fileHashSource(path: string | undefined): HashSource | undefined {\n return path ? { path } : undefined;\n}\n\nfunction existingPath(rootDir: string, path: string): string | undefined {\n const fullPath = join(rootDir, path);\n return existsSync(fullPath) ? fullPath : undefined;\n}\n\nfunction readPackageJson(rootDir: string): Record<string, any> | null {\n const path = join(rootDir, 'package.json');\n if (!existsSync(path)) return null;\n return JSON.parse(readFileSync(path, 'utf8'));\n}\n\nfunction record(value: unknown): Record<string, string> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, string>)\n : {};\n}\n\nfunction exportKeys(exportsField: unknown): string[] {\n if (typeof exportsField === 'string') return ['.'];\n if (\n typeof exportsField !== 'object' ||\n exportsField === null ||\n Array.isArray(exportsField)\n ) {\n return [];\n }\n return Object.keys(exportsField).sort();\n}\n\nfunction camelToSnake(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/[-\\s]+/g, '_')\n .toLowerCase();\n}\n\nfunction normalizeManifestForHash(manifest: SmartObjectManifest): unknown {\n const normalized = JSON.parse(JSON.stringify(manifest)) as Record<\n string,\n unknown\n >;\n delete normalized.timestamp;\n return normalized;\n}\n\nfunction stableJson(value: unknown): string {\n return JSON.stringify(sortJson(value), null, 2);\n}\n\nfunction sortJson(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortJson);\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, entry]) => [key, sortJson(entry)]),\n );\n }\n return value;\n}\n"],"names":[],"mappings":"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"}
|