@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,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lazy / execute-time agent_config resolvers.
|
|
3
|
+
*
|
|
4
|
+
* Persisted agent configs (e.g. `_smrt_agent_schedules.agent_config`) freeze
|
|
5
|
+
* any value resolved at sync time, including env-derived ones. When operators
|
|
6
|
+
* rotate an env var the persisted snapshot goes stale until the schedule is
|
|
7
|
+
* rewritten.
|
|
8
|
+
*
|
|
9
|
+
* To avoid that, callers can store **sentinel references** in the persisted
|
|
10
|
+
* config and register matching resolvers that run at execute time. The
|
|
11
|
+
* runtime walks the agent_config tree, replaces every recognised sentinel
|
|
12
|
+
* with the resolver's current return value, and only then hands the config
|
|
13
|
+
* to the agent.
|
|
14
|
+
*
|
|
15
|
+
* Two registration shapes are supported:
|
|
16
|
+
*
|
|
17
|
+
* 1. **Global named resolvers** — register a callback by name once at
|
|
18
|
+
* application startup. Use this for shared resolvers like
|
|
19
|
+
* `resolveSharedAssetStorage`.
|
|
20
|
+
*
|
|
21
|
+
* ```ts
|
|
22
|
+
* import { registerConfigResolver } from '@happyvertical/smrt-agents';
|
|
23
|
+
*
|
|
24
|
+
* registerConfigResolver('sharedAssetStorage', () =>
|
|
25
|
+
* resolveSharedAssetStorage(),
|
|
26
|
+
* );
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* Then in the persisted agent_config:
|
|
30
|
+
* ```jsonc
|
|
31
|
+
* { "assetStorage": { "$env": "sharedAssetStorage" } }
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* 2. **Per-agent class resolvers** — declare them as a static
|
|
35
|
+
* `configResolvers` map on the agent class. The runtime applies them on
|
|
36
|
+
* top of the persisted config keyed by the same name as the resolver.
|
|
37
|
+
*
|
|
38
|
+
* ```ts
|
|
39
|
+
* class Praeco extends Agent {
|
|
40
|
+
* static configResolvers = {
|
|
41
|
+
* assetStorage: () => resolveSharedAssetStorage(),
|
|
42
|
+
* };
|
|
43
|
+
* }
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* Both shapes can be combined freely. Global resolvers always take precedence
|
|
47
|
+
* for `$env` sentinels; class resolvers fill in / override fields by name.
|
|
48
|
+
*
|
|
49
|
+
* @module
|
|
50
|
+
*/
|
|
51
|
+
/**
|
|
52
|
+
* A lazy resolver — synchronous or async. Return values are merged into the
|
|
53
|
+
* config tree at execute time. Throwing is allowed but is treated as a
|
|
54
|
+
* resolution failure (see {@link ResolveLazyConfigOptions.onError}).
|
|
55
|
+
*/
|
|
56
|
+
export type ConfigResolver = () => unknown | Promise<unknown>;
|
|
57
|
+
/**
|
|
58
|
+
* Sentinel object recognised inside agent_config to defer a value to a named
|
|
59
|
+
* resolver. The runtime accepts both `$env` (preferred) and `$resolver` for
|
|
60
|
+
* symmetry with similar systems.
|
|
61
|
+
*/
|
|
62
|
+
export interface LazyConfigSentinel {
|
|
63
|
+
$env?: string;
|
|
64
|
+
$resolver?: string;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Options for resolving the lazy parts of a config tree.
|
|
68
|
+
*/
|
|
69
|
+
export interface ResolveLazyConfigOptions {
|
|
70
|
+
/**
|
|
71
|
+
* Per-class resolvers — typically the agent class's static
|
|
72
|
+
* `configResolvers`. Applied as a key-by-key overlay on top of the
|
|
73
|
+
* sentinel-resolved config.
|
|
74
|
+
*/
|
|
75
|
+
classResolvers?: Record<string, ConfigResolver>;
|
|
76
|
+
/**
|
|
77
|
+
* Optional override for the global resolver registry. When omitted the
|
|
78
|
+
* shared module-scoped registry is used. Useful for tests.
|
|
79
|
+
*/
|
|
80
|
+
resolvers?: Map<string, ConfigResolver> | Record<string, ConfigResolver>;
|
|
81
|
+
/**
|
|
82
|
+
* What to do when a sentinel references a resolver that isn't registered,
|
|
83
|
+
* or when a resolver throws.
|
|
84
|
+
*
|
|
85
|
+
* - `'leave'` (default): the sentinel is left in place verbatim. The
|
|
86
|
+
* downstream consumer is responsible for handling it.
|
|
87
|
+
* - `'omit'`: the sentinel key is removed from the parent object/array.
|
|
88
|
+
* - `'throw'`: re-throw the underlying error (or throw a new one for
|
|
89
|
+
* missing resolvers).
|
|
90
|
+
*/
|
|
91
|
+
onError?: 'leave' | 'omit' | 'throw';
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Register a named resolver that participates in lazy config resolution.
|
|
95
|
+
*
|
|
96
|
+
* Calling this with the same name twice replaces the previous resolver — the
|
|
97
|
+
* registry is intentionally last-write-wins so application boot ordering
|
|
98
|
+
* doesn't have to be fragile.
|
|
99
|
+
*/
|
|
100
|
+
export declare function registerConfigResolver(name: string, resolver: ConfigResolver): void;
|
|
101
|
+
/**
|
|
102
|
+
* Remove a previously registered resolver. Returns `true` if a resolver was
|
|
103
|
+
* removed.
|
|
104
|
+
*/
|
|
105
|
+
export declare function unregisterConfigResolver(name: string): boolean;
|
|
106
|
+
/**
|
|
107
|
+
* Get the resolver registered under the given name, if any.
|
|
108
|
+
*/
|
|
109
|
+
export declare function getConfigResolver(name: string): ConfigResolver | undefined;
|
|
110
|
+
/**
|
|
111
|
+
* List the names of all currently-registered global resolvers.
|
|
112
|
+
*/
|
|
113
|
+
export declare function listConfigResolvers(): string[];
|
|
114
|
+
/**
|
|
115
|
+
* Reset the global resolver registry. Primarily for tests.
|
|
116
|
+
*/
|
|
117
|
+
export declare function resetConfigResolvers(): void;
|
|
118
|
+
/**
|
|
119
|
+
* Type guard that returns `true` if `value` is a lazy config sentinel.
|
|
120
|
+
*
|
|
121
|
+
* Recognises objects of the form `{ $env: string }` or
|
|
122
|
+
* `{ $resolver: string }` exactly — extra keys disqualify the value so
|
|
123
|
+
* arbitrary user data isn't accidentally treated as a sentinel.
|
|
124
|
+
*/
|
|
125
|
+
export declare function isLazyConfigSentinel(value: unknown): value is LazyConfigSentinel;
|
|
126
|
+
/**
|
|
127
|
+
* Resolve every lazy sentinel inside an `agent_config`-style record at
|
|
128
|
+
* execute time. The input is not mutated; a new object is returned with
|
|
129
|
+
* sentinel placeholders replaced by their resolver's current return value.
|
|
130
|
+
*
|
|
131
|
+
* Class-level resolvers from {@link ResolveLazyConfigOptions.classResolvers}
|
|
132
|
+
* are applied as a final overlay so they always reflect the live value
|
|
133
|
+
* regardless of what's persisted.
|
|
134
|
+
*
|
|
135
|
+
* @example Sentinel resolution
|
|
136
|
+
* ```ts
|
|
137
|
+
* registerConfigResolver('sharedAssetStorage', () => resolveStorage());
|
|
138
|
+
*
|
|
139
|
+
* const stored = { assetStorage: { $env: 'sharedAssetStorage' } };
|
|
140
|
+
* const live = await resolveLazyConfig(stored);
|
|
141
|
+
* // live.assetStorage === resolveStorage()
|
|
142
|
+
* ```
|
|
143
|
+
*
|
|
144
|
+
* @example Class-level resolvers
|
|
145
|
+
* ```ts
|
|
146
|
+
* const live = await resolveLazyConfig(stored, {
|
|
147
|
+
* classResolvers: { assetStorage: () => resolveStorage() },
|
|
148
|
+
* });
|
|
149
|
+
* ```
|
|
150
|
+
*/
|
|
151
|
+
export declare function resolveLazyConfig<T extends Record<string, unknown>>(config: T, options?: ResolveLazyConfigOptions): Promise<T>;
|
|
152
|
+
/**
|
|
153
|
+
* Look up the static `configResolvers` map on a class (or any of its
|
|
154
|
+
* ancestors). Returns `undefined` if none is declared.
|
|
155
|
+
*
|
|
156
|
+
* The lookup walks the prototype chain so a subclass can extend its parent's
|
|
157
|
+
* resolvers without redeclaring them.
|
|
158
|
+
*/
|
|
159
|
+
export declare function getClassConfigResolvers(ctor: unknown): Record<string, ConfigResolver> | undefined;
|
|
160
|
+
//# sourceMappingURL=lazy-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy-config.d.ts","sourceRoot":"","sources":["../src/lazy-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAEH;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAE9D;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAEhD;;;OAGG;IACH,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAEzE;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;CACtC;AAID;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,cAAc,GACvB,IAAI,CAQN;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAE1E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,kBAAkB,CAU7B;AA2GD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvE,MAAM,EAAE,CAAC,EACT,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,CAAC,CAAC,CAwCZ;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,OAAO,GACZ,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,SAAS,CAkB5C"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
const globalResolvers = /* @__PURE__ */ new Map();
|
|
2
|
+
function registerConfigResolver(name, resolver) {
|
|
3
|
+
if (typeof name !== "string" || name.length === 0) {
|
|
4
|
+
throw new Error("registerConfigResolver: name must be a non-empty string");
|
|
5
|
+
}
|
|
6
|
+
if (typeof resolver !== "function") {
|
|
7
|
+
throw new Error("registerConfigResolver: resolver must be a function");
|
|
8
|
+
}
|
|
9
|
+
globalResolvers.set(name, resolver);
|
|
10
|
+
}
|
|
11
|
+
function unregisterConfigResolver(name) {
|
|
12
|
+
return globalResolvers.delete(name);
|
|
13
|
+
}
|
|
14
|
+
function getConfigResolver(name) {
|
|
15
|
+
return globalResolvers.get(name);
|
|
16
|
+
}
|
|
17
|
+
function listConfigResolvers() {
|
|
18
|
+
return Array.from(globalResolvers.keys()).sort();
|
|
19
|
+
}
|
|
20
|
+
function resetConfigResolvers() {
|
|
21
|
+
globalResolvers.clear();
|
|
22
|
+
}
|
|
23
|
+
function isLazyConfigSentinel(value) {
|
|
24
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
const keys = Object.keys(value);
|
|
28
|
+
if (keys.length !== 1) return false;
|
|
29
|
+
const key = keys[0];
|
|
30
|
+
if (key !== "$env" && key !== "$resolver") return false;
|
|
31
|
+
const resolverName = value[key];
|
|
32
|
+
return typeof resolverName === "string" && resolverName.length > 0;
|
|
33
|
+
}
|
|
34
|
+
function getSentinelName(sentinel) {
|
|
35
|
+
return sentinel.$env ?? sentinel.$resolver;
|
|
36
|
+
}
|
|
37
|
+
function normalizeResolverMap(resolvers) {
|
|
38
|
+
if (resolvers instanceof Map) return resolvers;
|
|
39
|
+
return new Map(Object.entries(resolvers));
|
|
40
|
+
}
|
|
41
|
+
const REMOVE = /* @__PURE__ */ Symbol("LazyConfig.REMOVE");
|
|
42
|
+
const MAX_DEPTH = 64;
|
|
43
|
+
async function resolveValue(value, ctx, depth) {
|
|
44
|
+
if (isLazyConfigSentinel(value)) {
|
|
45
|
+
const name = getSentinelName(value);
|
|
46
|
+
const resolver = ctx.resolvers.get(name);
|
|
47
|
+
if (!resolver) {
|
|
48
|
+
if (ctx.onError === "throw") {
|
|
49
|
+
throw new Error(
|
|
50
|
+
`Lazy config sentinel references unknown resolver "${name}"`
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
if (ctx.onError === "omit") return REMOVE;
|
|
54
|
+
return value;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
return await resolver();
|
|
58
|
+
} catch (error) {
|
|
59
|
+
if (ctx.onError === "throw") throw error;
|
|
60
|
+
if (ctx.onError === "omit") return REMOVE;
|
|
61
|
+
return value;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (depth > MAX_DEPTH) {
|
|
65
|
+
return value;
|
|
66
|
+
}
|
|
67
|
+
if (Array.isArray(value)) {
|
|
68
|
+
const cached = ctx.resolved.get(value);
|
|
69
|
+
if (cached !== void 0) return cached;
|
|
70
|
+
const next = [];
|
|
71
|
+
ctx.resolved.set(value, next);
|
|
72
|
+
for (const entry of value) {
|
|
73
|
+
const resolved = await resolveValue(entry, ctx, depth + 1);
|
|
74
|
+
if (resolved !== REMOVE) next.push(resolved);
|
|
75
|
+
}
|
|
76
|
+
return next;
|
|
77
|
+
}
|
|
78
|
+
if (value && typeof value === "object") {
|
|
79
|
+
const cached = ctx.resolved.get(value);
|
|
80
|
+
if (cached !== void 0) return cached;
|
|
81
|
+
const next = {};
|
|
82
|
+
ctx.resolved.set(value, next);
|
|
83
|
+
for (const [key, entry] of Object.entries(
|
|
84
|
+
value
|
|
85
|
+
)) {
|
|
86
|
+
const resolved = await resolveValue(entry, ctx, depth + 1);
|
|
87
|
+
if (resolved !== REMOVE) next[key] = resolved;
|
|
88
|
+
}
|
|
89
|
+
return next;
|
|
90
|
+
}
|
|
91
|
+
return value;
|
|
92
|
+
}
|
|
93
|
+
async function resolveLazyConfig(config, options = {}) {
|
|
94
|
+
const onError = options.onError ?? "leave";
|
|
95
|
+
const resolvers = options.resolvers ? normalizeResolverMap(options.resolvers) : globalResolvers;
|
|
96
|
+
const ctx = {
|
|
97
|
+
resolvers,
|
|
98
|
+
onError,
|
|
99
|
+
resolved: /* @__PURE__ */ new WeakMap()
|
|
100
|
+
};
|
|
101
|
+
const sentinelResolved = await resolveValue(config, ctx, 0);
|
|
102
|
+
const result = { ...sentinelResolved };
|
|
103
|
+
if (options.classResolvers) {
|
|
104
|
+
for (const [key, resolver] of Object.entries(options.classResolvers)) {
|
|
105
|
+
try {
|
|
106
|
+
const value = await resolver();
|
|
107
|
+
if (value !== void 0 && value !== null) {
|
|
108
|
+
result[key] = value;
|
|
109
|
+
}
|
|
110
|
+
} catch (error) {
|
|
111
|
+
if (onError === "throw") throw error;
|
|
112
|
+
if (onError === "omit") {
|
|
113
|
+
delete result[key];
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return result;
|
|
119
|
+
}
|
|
120
|
+
function getClassConfigResolvers(ctor) {
|
|
121
|
+
if (typeof ctor !== "function") return void 0;
|
|
122
|
+
let current = ctor;
|
|
123
|
+
let collected;
|
|
124
|
+
while (current && current !== Function.prototype) {
|
|
125
|
+
const resolvers = current.configResolvers;
|
|
126
|
+
if (resolvers && typeof resolvers === "object") {
|
|
127
|
+
collected = {
|
|
128
|
+
...resolvers,
|
|
129
|
+
...collected ?? {}
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
current = Object.getPrototypeOf(current);
|
|
133
|
+
}
|
|
134
|
+
return collected;
|
|
135
|
+
}
|
|
136
|
+
export {
|
|
137
|
+
getClassConfigResolvers,
|
|
138
|
+
getConfigResolver,
|
|
139
|
+
isLazyConfigSentinel,
|
|
140
|
+
listConfigResolvers,
|
|
141
|
+
registerConfigResolver,
|
|
142
|
+
resetConfigResolvers,
|
|
143
|
+
resolveLazyConfig,
|
|
144
|
+
unregisterConfigResolver
|
|
145
|
+
};
|
|
146
|
+
//# sourceMappingURL=lazy-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy-config.js","sources":["../src/lazy-config.ts"],"sourcesContent":["/**\n * Lazy / execute-time agent_config resolvers.\n *\n * Persisted agent configs (e.g. `_smrt_agent_schedules.agent_config`) freeze\n * any value resolved at sync time, including env-derived ones. When operators\n * rotate an env var the persisted snapshot goes stale until the schedule is\n * rewritten.\n *\n * To avoid that, callers can store **sentinel references** in the persisted\n * config and register matching resolvers that run at execute time. The\n * runtime walks the agent_config tree, replaces every recognised sentinel\n * with the resolver's current return value, and only then hands the config\n * to the agent.\n *\n * Two registration shapes are supported:\n *\n * 1. **Global named resolvers** — register a callback by name once at\n * application startup. Use this for shared resolvers like\n * `resolveSharedAssetStorage`.\n *\n * ```ts\n * import { registerConfigResolver } from '@happyvertical/smrt-agents';\n *\n * registerConfigResolver('sharedAssetStorage', () =>\n * resolveSharedAssetStorage(),\n * );\n * ```\n *\n * Then in the persisted agent_config:\n * ```jsonc\n * { \"assetStorage\": { \"$env\": \"sharedAssetStorage\" } }\n * ```\n *\n * 2. **Per-agent class resolvers** — declare them as a static\n * `configResolvers` map on the agent class. The runtime applies them on\n * top of the persisted config keyed by the same name as the resolver.\n *\n * ```ts\n * class Praeco extends Agent {\n * static configResolvers = {\n * assetStorage: () => resolveSharedAssetStorage(),\n * };\n * }\n * ```\n *\n * Both shapes can be combined freely. Global resolvers always take precedence\n * for `$env` sentinels; class resolvers fill in / override fields by name.\n *\n * @module\n */\n\n/**\n * A lazy resolver — synchronous or async. Return values are merged into the\n * config tree at execute time. Throwing is allowed but is treated as a\n * resolution failure (see {@link ResolveLazyConfigOptions.onError}).\n */\nexport type ConfigResolver = () => unknown | Promise<unknown>;\n\n/**\n * Sentinel object recognised inside agent_config to defer a value to a named\n * resolver. The runtime accepts both `$env` (preferred) and `$resolver` for\n * symmetry with similar systems.\n */\nexport interface LazyConfigSentinel {\n $env?: string;\n $resolver?: string;\n}\n\n/**\n * Options for resolving the lazy parts of a config tree.\n */\nexport interface ResolveLazyConfigOptions {\n /**\n * Per-class resolvers — typically the agent class's static\n * `configResolvers`. Applied as a key-by-key overlay on top of the\n * sentinel-resolved config.\n */\n classResolvers?: Record<string, ConfigResolver>;\n\n /**\n * Optional override for the global resolver registry. When omitted the\n * shared module-scoped registry is used. Useful for tests.\n */\n resolvers?: Map<string, ConfigResolver> | Record<string, ConfigResolver>;\n\n /**\n * What to do when a sentinel references a resolver that isn't registered,\n * or when a resolver throws.\n *\n * - `'leave'` (default): the sentinel is left in place verbatim. The\n * downstream consumer is responsible for handling it.\n * - `'omit'`: the sentinel key is removed from the parent object/array.\n * - `'throw'`: re-throw the underlying error (or throw a new one for\n * missing resolvers).\n */\n onError?: 'leave' | 'omit' | 'throw';\n}\n\nconst globalResolvers = new Map<string, ConfigResolver>();\n\n/**\n * Register a named resolver that participates in lazy config resolution.\n *\n * Calling this with the same name twice replaces the previous resolver — the\n * registry is intentionally last-write-wins so application boot ordering\n * doesn't have to be fragile.\n */\nexport function registerConfigResolver(\n name: string,\n resolver: ConfigResolver,\n): void {\n if (typeof name !== 'string' || name.length === 0) {\n throw new Error('registerConfigResolver: name must be a non-empty string');\n }\n if (typeof resolver !== 'function') {\n throw new Error('registerConfigResolver: resolver must be a function');\n }\n globalResolvers.set(name, resolver);\n}\n\n/**\n * Remove a previously registered resolver. Returns `true` if a resolver was\n * removed.\n */\nexport function unregisterConfigResolver(name: string): boolean {\n return globalResolvers.delete(name);\n}\n\n/**\n * Get the resolver registered under the given name, if any.\n */\nexport function getConfigResolver(name: string): ConfigResolver | undefined {\n return globalResolvers.get(name);\n}\n\n/**\n * List the names of all currently-registered global resolvers.\n */\nexport function listConfigResolvers(): string[] {\n return Array.from(globalResolvers.keys()).sort();\n}\n\n/**\n * Reset the global resolver registry. Primarily for tests.\n */\nexport function resetConfigResolvers(): void {\n globalResolvers.clear();\n}\n\n/**\n * Type guard that returns `true` if `value` is a lazy config sentinel.\n *\n * Recognises objects of the form `{ $env: string }` or\n * `{ $resolver: string }` exactly — extra keys disqualify the value so\n * arbitrary user data isn't accidentally treated as a sentinel.\n */\nexport function isLazyConfigSentinel(\n value: unknown,\n): value is LazyConfigSentinel {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n const keys = Object.keys(value as Record<string, unknown>);\n if (keys.length !== 1) return false;\n const key = keys[0];\n if (key !== '$env' && key !== '$resolver') return false;\n const resolverName = (value as Record<string, unknown>)[key];\n return typeof resolverName === 'string' && resolverName.length > 0;\n}\n\n/**\n * Extract the resolver name from a sentinel.\n */\nfunction getSentinelName(sentinel: LazyConfigSentinel): string {\n return (sentinel.$env ?? sentinel.$resolver) as string;\n}\n\nfunction normalizeResolverMap(\n resolvers: Map<string, ConfigResolver> | Record<string, ConfigResolver>,\n): Map<string, ConfigResolver> {\n if (resolvers instanceof Map) return resolvers;\n return new Map(Object.entries(resolvers));\n}\n\nconst REMOVE = Symbol('LazyConfig.REMOVE');\n\n/**\n * Maximum traversal depth before {@link resolveValue} bails out. Real\n * `agent_config` payloads are shallow (2–3 levels); a high cap here exists\n * solely to prevent stack overflow from a malicious or buggy persisted\n * config without rejecting any legitimate input. When the cap is hit the\n * value is returned verbatim — same fail-soft as for a missing resolver.\n */\nconst MAX_DEPTH = 64;\n\ninterface ResolveContext {\n resolvers: Map<string, ConfigResolver>;\n onError: NonNullable<ResolveLazyConfigOptions['onError']>;\n /**\n * Map from input object/array to its resolved replacement. Serves two\n * purposes simultaneously:\n * 1. Cycle protection — without it, a self-referential config would\n * recurse forever.\n * 2. DAG fidelity — a sub-tree referenced from two places gets cloned\n * once and the same clone is reused for every reference, preserving\n * structure and ensuring sentinels under shared references are still\n * resolved.\n */\n resolved: WeakMap<object, unknown>;\n}\n\nasync function resolveValue(\n value: unknown,\n ctx: ResolveContext,\n depth: number,\n): Promise<unknown> {\n if (isLazyConfigSentinel(value)) {\n const name = getSentinelName(value);\n const resolver = ctx.resolvers.get(name);\n if (!resolver) {\n if (ctx.onError === 'throw') {\n throw new Error(\n `Lazy config sentinel references unknown resolver \"${name}\"`,\n );\n }\n if (ctx.onError === 'omit') return REMOVE;\n return value;\n }\n\n try {\n return await resolver();\n } catch (error) {\n if (ctx.onError === 'throw') throw error;\n if (ctx.onError === 'omit') return REMOVE;\n return value;\n }\n }\n\n if (depth > MAX_DEPTH) {\n // Defensive: refuse to recurse further. The original sub-tree is\n // returned as-is; sentinels beyond this point will stay unresolved.\n return value;\n }\n\n if (Array.isArray(value)) {\n const cached = ctx.resolved.get(value);\n if (cached !== undefined) return cached;\n const next: unknown[] = [];\n // Register the placeholder *before* descending so that a cycle pointing\n // back at this array sees the in-progress array (and stops recursing).\n ctx.resolved.set(value, next);\n for (const entry of value) {\n const resolved = await resolveValue(entry, ctx, depth + 1);\n if (resolved !== REMOVE) next.push(resolved);\n }\n return next;\n }\n\n if (value && typeof value === 'object') {\n const cached = ctx.resolved.get(value);\n if (cached !== undefined) return cached;\n const next: Record<string, unknown> = {};\n ctx.resolved.set(value, next);\n for (const [key, entry] of Object.entries(\n value as Record<string, unknown>,\n )) {\n const resolved = await resolveValue(entry, ctx, depth + 1);\n if (resolved !== REMOVE) next[key] = resolved;\n }\n return next;\n }\n\n return value;\n}\n\n/**\n * Resolve every lazy sentinel inside an `agent_config`-style record at\n * execute time. The input is not mutated; a new object is returned with\n * sentinel placeholders replaced by their resolver's current return value.\n *\n * Class-level resolvers from {@link ResolveLazyConfigOptions.classResolvers}\n * are applied as a final overlay so they always reflect the live value\n * regardless of what's persisted.\n *\n * @example Sentinel resolution\n * ```ts\n * registerConfigResolver('sharedAssetStorage', () => resolveStorage());\n *\n * const stored = { assetStorage: { $env: 'sharedAssetStorage' } };\n * const live = await resolveLazyConfig(stored);\n * // live.assetStorage === resolveStorage()\n * ```\n *\n * @example Class-level resolvers\n * ```ts\n * const live = await resolveLazyConfig(stored, {\n * classResolvers: { assetStorage: () => resolveStorage() },\n * });\n * ```\n */\nexport async function resolveLazyConfig<T extends Record<string, unknown>>(\n config: T,\n options: ResolveLazyConfigOptions = {},\n): Promise<T> {\n const onError = options.onError ?? 'leave';\n const resolvers = options.resolvers\n ? normalizeResolverMap(options.resolvers)\n : globalResolvers;\n\n const ctx: ResolveContext = {\n resolvers,\n onError,\n resolved: new WeakMap<object, unknown>(),\n };\n const sentinelResolved = (await resolveValue(config, ctx, 0)) as Record<\n string,\n unknown\n >;\n\n const result: Record<string, unknown> = { ...sentinelResolved };\n\n if (options.classResolvers) {\n for (const [key, resolver] of Object.entries(options.classResolvers)) {\n try {\n const value = await resolver();\n // Both `undefined` and `null` are treated as \"no overlay value\" —\n // the persisted record's existing value (if any) is preserved.\n // This matches the documented contract on `Agent.configResolvers`\n // and makes the common pattern `() => process.env.X ?? null` safe.\n if (value !== undefined && value !== null) {\n result[key] = value;\n }\n } catch (error) {\n if (onError === 'throw') throw error;\n if (onError === 'omit') {\n delete result[key];\n }\n // 'leave': preserve the existing (possibly persisted) value.\n }\n }\n }\n\n return result as T;\n}\n\n/**\n * Look up the static `configResolvers` map on a class (or any of its\n * ancestors). Returns `undefined` if none is declared.\n *\n * The lookup walks the prototype chain so a subclass can extend its parent's\n * resolvers without redeclaring them.\n */\nexport function getClassConfigResolvers(\n ctor: unknown,\n): Record<string, ConfigResolver> | undefined {\n if (typeof ctor !== 'function') return undefined;\n\n let current: any = ctor;\n let collected: Record<string, ConfigResolver> | undefined;\n\n while (current && current !== Function.prototype) {\n const resolvers = current.configResolvers;\n if (resolvers && typeof resolvers === 'object') {\n collected = {\n ...(resolvers as Record<string, ConfigResolver>),\n ...(collected ?? {}),\n };\n }\n current = Object.getPrototypeOf(current);\n }\n\n return collected;\n}\n"],"names":[],"mappings":"AAkGA,MAAM,sCAAsB,IAAA;AASrB,SAAS,uBACd,MACA,UACM;AACN,MAAI,OAAO,SAAS,YAAY,KAAK,WAAW,GAAG;AACjD,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AACA,MAAI,OAAO,aAAa,YAAY;AAClC,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACA,kBAAgB,IAAI,MAAM,QAAQ;AACpC;AAMO,SAAS,yBAAyB,MAAuB;AAC9D,SAAO,gBAAgB,OAAO,IAAI;AACpC;AAKO,SAAS,kBAAkB,MAA0C;AAC1E,SAAO,gBAAgB,IAAI,IAAI;AACjC;AAKO,SAAS,sBAAgC;AAC9C,SAAO,MAAM,KAAK,gBAAgB,KAAA,CAAM,EAAE,KAAA;AAC5C;AAKO,SAAS,uBAA6B;AAC3C,kBAAgB,MAAA;AAClB;AASO,SAAS,qBACd,OAC6B;AAC7B,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,WAAO;AAAA,EACT;AACA,QAAM,OAAO,OAAO,KAAK,KAAgC;AACzD,MAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,QAAM,MAAM,KAAK,CAAC;AAClB,MAAI,QAAQ,UAAU,QAAQ,YAAa,QAAO;AAClD,QAAM,eAAgB,MAAkC,GAAG;AAC3D,SAAO,OAAO,iBAAiB,YAAY,aAAa,SAAS;AACnE;AAKA,SAAS,gBAAgB,UAAsC;AAC7D,SAAQ,SAAS,QAAQ,SAAS;AACpC;AAEA,SAAS,qBACP,WAC6B;AAC7B,MAAI,qBAAqB,IAAK,QAAO;AACrC,SAAO,IAAI,IAAI,OAAO,QAAQ,SAAS,CAAC;AAC1C;AAEA,MAAM,gCAAgB,mBAAmB;AASzC,MAAM,YAAY;AAkBlB,eAAe,aACb,OACA,KACA,OACkB;AAClB,MAAI,qBAAqB,KAAK,GAAG;AAC/B,UAAM,OAAO,gBAAgB,KAAK;AAClC,UAAM,WAAW,IAAI,UAAU,IAAI,IAAI;AACvC,QAAI,CAAC,UAAU;AACb,UAAI,IAAI,YAAY,SAAS;AAC3B,cAAM,IAAI;AAAA,UACR,qDAAqD,IAAI;AAAA,QAAA;AAAA,MAE7D;AACA,UAAI,IAAI,YAAY,OAAQ,QAAO;AACnC,aAAO;AAAA,IACT;AAEA,QAAI;AACF,aAAO,MAAM,SAAA;AAAA,IACf,SAAS,OAAO;AACd,UAAI,IAAI,YAAY,QAAS,OAAM;AACnC,UAAI,IAAI,YAAY,OAAQ,QAAO;AACnC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW;AAGrB,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,SAAS,IAAI,SAAS,IAAI,KAAK;AACrC,QAAI,WAAW,OAAW,QAAO;AACjC,UAAM,OAAkB,CAAA;AAGxB,QAAI,SAAS,IAAI,OAAO,IAAI;AAC5B,eAAW,SAAS,OAAO;AACzB,YAAM,WAAW,MAAM,aAAa,OAAO,KAAK,QAAQ,CAAC;AACzD,UAAI,aAAa,OAAQ,MAAK,KAAK,QAAQ;AAAA,IAC7C;AACA,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,UAAM,SAAS,IAAI,SAAS,IAAI,KAAK;AACrC,QAAI,WAAW,OAAW,QAAO;AACjC,UAAM,OAAgC,CAAA;AACtC,QAAI,SAAS,IAAI,OAAO,IAAI;AAC5B,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO;AAAA,MAChC;AAAA,IAAA,GACC;AACD,YAAM,WAAW,MAAM,aAAa,OAAO,KAAK,QAAQ,CAAC;AACzD,UAAI,aAAa,OAAQ,MAAK,GAAG,IAAI;AAAA,IACvC;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AA2BA,eAAsB,kBACpB,QACA,UAAoC,IACxB;AACZ,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,YAAY,QAAQ,YACtB,qBAAqB,QAAQ,SAAS,IACtC;AAEJ,QAAM,MAAsB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA,8BAAc,QAAA;AAAA,EAAyB;AAEzC,QAAM,mBAAoB,MAAM,aAAa,QAAQ,KAAK,CAAC;AAK3D,QAAM,SAAkC,EAAE,GAAG,iBAAA;AAE7C,MAAI,QAAQ,gBAAgB;AAC1B,eAAW,CAAC,KAAK,QAAQ,KAAK,OAAO,QAAQ,QAAQ,cAAc,GAAG;AACpE,UAAI;AACF,cAAM,QAAQ,MAAM,SAAA;AAKpB,YAAI,UAAU,UAAa,UAAU,MAAM;AACzC,iBAAO,GAAG,IAAI;AAAA,QAChB;AAAA,MACF,SAAS,OAAO;AACd,YAAI,YAAY,QAAS,OAAM;AAC/B,YAAI,YAAY,QAAQ;AACtB,iBAAO,OAAO,GAAG;AAAA,QACnB;AAAA,MAEF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AASO,SAAS,wBACd,MAC4C;AAC5C,MAAI,OAAO,SAAS,WAAY,QAAO;AAEvC,MAAI,UAAe;AACnB,MAAI;AAEJ,SAAO,WAAW,YAAY,SAAS,WAAW;AAChD,UAAM,YAAY,QAAQ;AAC1B,QAAI,aAAa,OAAO,cAAc,UAAU;AAC9C,kBAAY;AAAA,QACV,GAAI;AAAA,QACJ,GAAI,aAAa,CAAA;AAAA,MAAC;AAAA,IAEtB;AACA,cAAU,OAAO,eAAe,OAAO;AAAA,EACzC;AAEA,SAAO;AACT;"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discover SMRT classes from external packages for inheritance detection
|
|
3
|
+
*
|
|
4
|
+
* Loads manifests from external SMRT packages and extracts all class names.
|
|
5
|
+
* These are used by the scanner for inheritance detection - to determine
|
|
6
|
+
* if a class extends a valid SMRT class from an external package.
|
|
7
|
+
*
|
|
8
|
+
* IMPORTANT: Despite the name, this function returns ALL SMRT classes from
|
|
9
|
+
* external packages, not just "base classes". The two have different uses:
|
|
10
|
+
*
|
|
11
|
+
* 1. DEFAULT_BASE_CLASSES (SmrtObject, SmrtClass, SmrtCollection):
|
|
12
|
+
* Used by the scanner to SKIP these framework classes from the manifest.
|
|
13
|
+
* These are the only classes that should be filtered out.
|
|
14
|
+
*
|
|
15
|
+
* 2. All discovered classes (return value of this function):
|
|
16
|
+
* Used by the scanner for INHERITANCE DETECTION - to recognize when a
|
|
17
|
+
* local class extends an external SMRT class.
|
|
18
|
+
*
|
|
19
|
+
* Issue #847 Fix: The scanner now uses DEFAULT_BASE_CLASSES for skipping,
|
|
20
|
+
* not the full return value of this function. This prevents local classes
|
|
21
|
+
* with names matching external classes from being incorrectly skipped.
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Framework base classes that should be skipped during manifest generation
|
|
25
|
+
*
|
|
26
|
+
* These are the ONLY classes that the scanner should skip - they are
|
|
27
|
+
* framework base classes that should not appear in the manifest themselves.
|
|
28
|
+
*
|
|
29
|
+
* Note: This is separate from inheritance detection. A local class named
|
|
30
|
+
* "Council" should NOT be skipped just because an external package has a
|
|
31
|
+
* class named "Council" - only these framework classes should be skipped.
|
|
32
|
+
*/
|
|
33
|
+
export declare const DEFAULT_BASE_CLASSES: readonly ["SmrtObject", "SmrtClass", "SmrtCollection"];
|
|
34
|
+
/**
|
|
35
|
+
* Discover all available base classes for scanning
|
|
36
|
+
*
|
|
37
|
+
* Combines the default SMRT framework base classes with classes discovered
|
|
38
|
+
* from external SMRT package manifests.
|
|
39
|
+
*
|
|
40
|
+
* @param options - Discovery options
|
|
41
|
+
* @param options.includeDefaults - Include default base classes (default: true)
|
|
42
|
+
* @param options.cwd - Current working directory (default: process.cwd())
|
|
43
|
+
* @returns Array of base class names
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```typescript
|
|
47
|
+
* // Discover all base classes
|
|
48
|
+
* const baseClasses = await discoverBaseClasses();
|
|
49
|
+
* // ['SmrtObject', 'SmrtClass', 'SmrtCollection', 'ProfileRelationship', ...]
|
|
50
|
+
*
|
|
51
|
+
* // Only external classes
|
|
52
|
+
* const external = await discoverBaseClasses({ includeDefaults: false });
|
|
53
|
+
* // ['ProfileRelationship', 'Event', 'Organization', ...]
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export declare function discoverBaseClasses(options?: {
|
|
57
|
+
includeDefaults?: boolean;
|
|
58
|
+
cwd?: string;
|
|
59
|
+
}): Promise<string[]>;
|
|
60
|
+
/**
|
|
61
|
+
* Synchronous version of discoverBaseClasses
|
|
62
|
+
*
|
|
63
|
+
* Uses readFileSync to load manifests synchronously. Works in both ESM and CJS.
|
|
64
|
+
*
|
|
65
|
+
* @param options - Discovery options
|
|
66
|
+
* @returns Array of base class names
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* const baseClasses = discoverBaseClassesSync();
|
|
71
|
+
* const scanner = new OxcScanner({ baseClasses });
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
export declare function discoverBaseClassesSync(options?: {
|
|
75
|
+
includeDefaults?: boolean;
|
|
76
|
+
cwd?: string;
|
|
77
|
+
}): string[];
|
|
78
|
+
//# sourceMappingURL=discover-base-classes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover-base-classes.d.ts","sourceRoot":"","sources":["../../src/manifest/discover-base-classes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAwCH;;;;;;;;;GASG;AACH,eAAO,MAAM,oBAAoB,wDAIvB,CAAC;AAEX;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,GAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GACxD,OAAO,CAAC,MAAM,EAAE,CAAC,CAiDnB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,GAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GACxD,MAAM,EAAE,CA+CV"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { createLogger } from "@happyvertical/logger";
|
|
4
|
+
import { discoverSmrtPackages, resolveManifestPath } from "./discover-smrt-packages.js";
|
|
5
|
+
const logger = createLogger({ level: "info" });
|
|
6
|
+
function logBaseClassLoadError(pkgName, manifestPath, error) {
|
|
7
|
+
const code = error && typeof error === "object" && "code" in error ? error.code : void 0;
|
|
8
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
9
|
+
if (code === "ENOENT") {
|
|
10
|
+
logger.debug(
|
|
11
|
+
`[discoverBaseClasses] No manifest for ${pkgName} at ${manifestPath}; skipping.`
|
|
12
|
+
);
|
|
13
|
+
} else {
|
|
14
|
+
logger.warn(
|
|
15
|
+
`[discoverBaseClasses] Failed to load manifest for ${pkgName} at ${manifestPath}: ${message}`
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const DEFAULT_BASE_CLASSES = [
|
|
20
|
+
"SmrtObject",
|
|
21
|
+
"SmrtClass",
|
|
22
|
+
"SmrtCollection"
|
|
23
|
+
];
|
|
24
|
+
async function discoverBaseClasses(options = {}) {
|
|
25
|
+
const { includeDefaults = true, cwd = process.cwd() } = options;
|
|
26
|
+
const baseClasses = includeDefaults ? [...DEFAULT_BASE_CLASSES] : [];
|
|
27
|
+
const smrtDependencies = discoverSmrtPackages();
|
|
28
|
+
for (const pkgName of smrtDependencies) {
|
|
29
|
+
const manifestPath = resolveManifestPath(pkgName, cwd);
|
|
30
|
+
if (!manifestPath) {
|
|
31
|
+
logger.debug(
|
|
32
|
+
`[discoverBaseClasses] No SMRT manifest resolved for ${pkgName}; skipping.`
|
|
33
|
+
);
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
const manifestContent = await readFile(manifestPath, "utf-8");
|
|
38
|
+
const manifest = JSON.parse(manifestContent);
|
|
39
|
+
if (manifest.objects && typeof manifest.objects === "object") {
|
|
40
|
+
for (const objDef of Object.values(manifest.objects)) {
|
|
41
|
+
if (objDef && typeof objDef === "object" && "className" in objDef && typeof objDef.className === "string") {
|
|
42
|
+
baseClasses.push(objDef.className);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
} catch (error) {
|
|
47
|
+
logBaseClassLoadError(pkgName, manifestPath, error);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return baseClasses;
|
|
51
|
+
}
|
|
52
|
+
function discoverBaseClassesSync(options = {}) {
|
|
53
|
+
const { includeDefaults = true, cwd = process.cwd() } = options;
|
|
54
|
+
const baseClasses = includeDefaults ? [...DEFAULT_BASE_CLASSES] : [];
|
|
55
|
+
const smrtDependencies = discoverSmrtPackages();
|
|
56
|
+
for (const pkgName of smrtDependencies) {
|
|
57
|
+
const manifestPath = resolveManifestPath(pkgName, cwd);
|
|
58
|
+
if (!manifestPath) {
|
|
59
|
+
logger.debug(
|
|
60
|
+
`[discoverBaseClassesSync] No SMRT manifest resolved for ${pkgName}; skipping.`
|
|
61
|
+
);
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
const manifestContent = readFileSync(manifestPath, "utf-8");
|
|
66
|
+
const manifest = JSON.parse(manifestContent);
|
|
67
|
+
if (manifest.objects && typeof manifest.objects === "object") {
|
|
68
|
+
for (const objDef of Object.values(manifest.objects)) {
|
|
69
|
+
if (objDef && typeof objDef === "object" && "className" in objDef && typeof objDef.className === "string") {
|
|
70
|
+
baseClasses.push(objDef.className);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
} catch (error) {
|
|
75
|
+
logBaseClassLoadError(pkgName, manifestPath, error);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return baseClasses;
|
|
79
|
+
}
|
|
80
|
+
export {
|
|
81
|
+
DEFAULT_BASE_CLASSES,
|
|
82
|
+
discoverBaseClasses,
|
|
83
|
+
discoverBaseClassesSync
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=discover-base-classes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover-base-classes.js","sources":["../../src/manifest/discover-base-classes.ts"],"sourcesContent":["/**\n * Discover SMRT classes from external packages for inheritance detection\n *\n * Loads manifests from external SMRT packages and extracts all class names.\n * These are used by the scanner for inheritance detection - to determine\n * if a class extends a valid SMRT class from an external package.\n *\n * IMPORTANT: Despite the name, this function returns ALL SMRT classes from\n * external packages, not just \"base classes\". The two have different uses:\n *\n * 1. DEFAULT_BASE_CLASSES (SmrtObject, SmrtClass, SmrtCollection):\n * Used by the scanner to SKIP these framework classes from the manifest.\n * These are the only classes that should be filtered out.\n *\n * 2. All discovered classes (return value of this function):\n * Used by the scanner for INHERITANCE DETECTION - to recognize when a\n * local class extends an external SMRT class.\n *\n * Issue #847 Fix: The scanner now uses DEFAULT_BASE_CLASSES for skipping,\n * not the full return value of this function. This prevents local classes\n * with names matching external classes from being incorrectly skipped.\n */\n\nimport { readFileSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { createLogger } from '@happyvertical/logger';\nimport {\n discoverSmrtPackages,\n resolveManifestPath,\n} from './discover-smrt-packages.js';\n\nconst logger = createLogger({ level: 'info' });\n\n/**\n * Log a manifest-load failure during base-class discovery without aborting the\n * whole scan. ENOENT (a package that simply hasn't built/published a manifest)\n * is benign and logged at debug; malformed JSON or other read errors are\n * surfaced at warn so a stale/corrupt manifest is not silently ignored.\n */\nfunction logBaseClassLoadError(\n pkgName: string,\n manifestPath: string,\n error: unknown,\n): void {\n const code =\n error && typeof error === 'object' && 'code' in error\n ? (error as { code?: string }).code\n : undefined;\n const message = error instanceof Error ? error.message : String(error);\n\n if (code === 'ENOENT') {\n logger.debug(\n `[discoverBaseClasses] No manifest for ${pkgName} at ${manifestPath}; skipping.`,\n );\n } else {\n logger.warn(\n `[discoverBaseClasses] Failed to load manifest for ${pkgName} at ${manifestPath}: ${message}`,\n );\n }\n}\n\n/**\n * Framework base classes that should be skipped during manifest generation\n *\n * These are the ONLY classes that the scanner should skip - they are\n * framework base classes that should not appear in the manifest themselves.\n *\n * Note: This is separate from inheritance detection. A local class named\n * \"Council\" should NOT be skipped just because an external package has a\n * class named \"Council\" - only these framework classes should be skipped.\n */\nexport const DEFAULT_BASE_CLASSES = [\n 'SmrtObject',\n 'SmrtClass',\n 'SmrtCollection',\n] as const;\n\n/**\n * Discover all available base classes for scanning\n *\n * Combines the default SMRT framework base classes with classes discovered\n * from external SMRT package manifests.\n *\n * @param options - Discovery options\n * @param options.includeDefaults - Include default base classes (default: true)\n * @param options.cwd - Current working directory (default: process.cwd())\n * @returns Array of base class names\n *\n * @example\n * ```typescript\n * // Discover all base classes\n * const baseClasses = await discoverBaseClasses();\n * // ['SmrtObject', 'SmrtClass', 'SmrtCollection', 'ProfileRelationship', ...]\n *\n * // Only external classes\n * const external = await discoverBaseClasses({ includeDefaults: false });\n * // ['ProfileRelationship', 'Event', 'Organization', ...]\n * ```\n */\nexport async function discoverBaseClasses(\n options: { includeDefaults?: boolean; cwd?: string } = {},\n): Promise<string[]> {\n const { includeDefaults = true, cwd = process.cwd() } = options;\n\n // Start with default base classes\n const baseClasses: string[] = includeDefaults\n ? [...DEFAULT_BASE_CLASSES]\n : [];\n\n // Discover external SMRT packages\n const smrtDependencies = discoverSmrtPackages();\n\n // Load external base classes from SMRT package manifests.\n // Resolve each manifest the same way discovery does (honoring `.smrt/` and\n // `src/manifest/` in addition to `dist/`), so a workspace package not yet\n // built to dist/ still contributes its base classes (#1378). A hardcoded\n // `node_modules/{pkg}/dist/manifest.json` path silently degraded inheritance\n // detection for source-only packages.\n for (const pkgName of smrtDependencies) {\n const manifestPath = resolveManifestPath(pkgName, cwd);\n if (!manifestPath) {\n logger.debug(\n `[discoverBaseClasses] No SMRT manifest resolved for ${pkgName}; skipping.`,\n );\n continue;\n }\n\n try {\n const manifestContent = await readFile(manifestPath, 'utf-8');\n const manifest = JSON.parse(manifestContent);\n\n // Extract all class names from this package\n if (manifest.objects && typeof manifest.objects === 'object') {\n for (const objDef of Object.values(manifest.objects)) {\n if (\n objDef &&\n typeof objDef === 'object' &&\n 'className' in objDef &&\n typeof objDef.className === 'string'\n ) {\n baseClasses.push(objDef.className);\n }\n }\n }\n } catch (error) {\n logBaseClassLoadError(pkgName, manifestPath, error);\n }\n }\n\n return baseClasses;\n}\n\n/**\n * Synchronous version of discoverBaseClasses\n *\n * Uses readFileSync to load manifests synchronously. Works in both ESM and CJS.\n *\n * @param options - Discovery options\n * @returns Array of base class names\n *\n * @example\n * ```typescript\n * const baseClasses = discoverBaseClassesSync();\n * const scanner = new OxcScanner({ baseClasses });\n * ```\n */\nexport function discoverBaseClassesSync(\n options: { includeDefaults?: boolean; cwd?: string } = {},\n): string[] {\n const { includeDefaults = true, cwd = process.cwd() } = options;\n\n // Start with default base classes\n const baseClasses: string[] = includeDefaults\n ? [...DEFAULT_BASE_CLASSES]\n : [];\n\n // Discover external SMRT packages\n const smrtDependencies = discoverSmrtPackages();\n\n // Load external base classes from SMRT package manifests. Same resolution as\n // the async variant (honors `.smrt/` and `src/manifest/`, not just `dist/`),\n // so source-only workspace packages still contribute base classes (#1378).\n for (const pkgName of smrtDependencies) {\n const manifestPath = resolveManifestPath(pkgName, cwd);\n if (!manifestPath) {\n logger.debug(\n `[discoverBaseClassesSync] No SMRT manifest resolved for ${pkgName}; skipping.`,\n );\n continue;\n }\n\n try {\n // Use fs.readFileSync for synchronous loading (works in ESM)\n const manifestContent = readFileSync(manifestPath, 'utf-8');\n const manifest = JSON.parse(manifestContent);\n\n // Extract all class names from this package\n if (manifest.objects && typeof manifest.objects === 'object') {\n for (const objDef of Object.values(manifest.objects)) {\n if (\n objDef &&\n typeof objDef === 'object' &&\n 'className' in objDef &&\n typeof objDef.className === 'string'\n ) {\n baseClasses.push(objDef.className);\n }\n }\n }\n } catch (error) {\n logBaseClassLoadError(pkgName, manifestPath, error);\n }\n }\n\n return baseClasses;\n}\n"],"names":[],"mappings":";;;;AA+BA,MAAM,SAAS,aAAa,EAAE,OAAO,QAAQ;AAQ7C,SAAS,sBACP,SACA,cACA,OACM;AACN,QAAM,OACJ,SAAS,OAAO,UAAU,YAAY,UAAU,QAC3C,MAA4B,OAC7B;AACN,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAErE,MAAI,SAAS,UAAU;AACrB,WAAO;AAAA,MACL,yCAAyC,OAAO,OAAO,YAAY;AAAA,IAAA;AAAA,EAEvE,OAAO;AACL,WAAO;AAAA,MACL,qDAAqD,OAAO,OAAO,YAAY,KAAK,OAAO;AAAA,IAAA;AAAA,EAE/F;AACF;AAYO,MAAM,uBAAuB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AACF;AAwBA,eAAsB,oBACpB,UAAuD,IACpC;AACnB,QAAM,EAAE,kBAAkB,MAAM,MAAM,QAAQ,IAAA,MAAU;AAGxD,QAAM,cAAwB,kBAC1B,CAAC,GAAG,oBAAoB,IACxB,CAAA;AAGJ,QAAM,mBAAmB,qBAAA;AAQzB,aAAW,WAAW,kBAAkB;AACtC,UAAM,eAAe,oBAAoB,SAAS,GAAG;AACrD,QAAI,CAAC,cAAc;AACjB,aAAO;AAAA,QACL,uDAAuD,OAAO;AAAA,MAAA;AAEhE;AAAA,IACF;AAEA,QAAI;AACF,YAAM,kBAAkB,MAAM,SAAS,cAAc,OAAO;AAC5D,YAAM,WAAW,KAAK,MAAM,eAAe;AAG3C,UAAI,SAAS,WAAW,OAAO,SAAS,YAAY,UAAU;AAC5D,mBAAW,UAAU,OAAO,OAAO,SAAS,OAAO,GAAG;AACpD,cACE,UACA,OAAO,WAAW,YAClB,eAAe,UACf,OAAO,OAAO,cAAc,UAC5B;AACA,wBAAY,KAAK,OAAO,SAAS;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,4BAAsB,SAAS,cAAc,KAAK;AAAA,IACpD;AAAA,EACF;AAEA,SAAO;AACT;AAgBO,SAAS,wBACd,UAAuD,IAC7C;AACV,QAAM,EAAE,kBAAkB,MAAM,MAAM,QAAQ,IAAA,MAAU;AAGxD,QAAM,cAAwB,kBAC1B,CAAC,GAAG,oBAAoB,IACxB,CAAA;AAGJ,QAAM,mBAAmB,qBAAA;AAKzB,aAAW,WAAW,kBAAkB;AACtC,UAAM,eAAe,oBAAoB,SAAS,GAAG;AACrD,QAAI,CAAC,cAAc;AACjB,aAAO;AAAA,QACL,2DAA2D,OAAO;AAAA,MAAA;AAEpE;AAAA,IACF;AAEA,QAAI;AAEF,YAAM,kBAAkB,aAAa,cAAc,OAAO;AAC1D,YAAM,WAAW,KAAK,MAAM,eAAe;AAG3C,UAAI,SAAS,WAAW,OAAO,SAAS,YAAY,UAAU;AAC5D,mBAAW,UAAU,OAAO,OAAO,SAAS,OAAO,GAAG;AACpD,cACE,UACA,OAAO,WAAW,YAClB,eAAe,UACf,OAAO,OAAO,cAAc,UAC5B;AACA,wBAAY,KAAK,OAAO,SAAS;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,4BAAsB,SAAS,cAAc,KAAK;AAAA,IACpD;AAAA,EACF;AAEA,SAAO;AACT;"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMRT Package Discovery
|
|
3
|
+
*
|
|
4
|
+
* Discovers all SMRT packages in node_modules by:
|
|
5
|
+
* 1. Scanning node_modules directory for installed packages
|
|
6
|
+
* 2. Following symlinks for workspace: dependencies
|
|
7
|
+
* 3. Checking for a package manifest (`dist/manifest.json`,
|
|
8
|
+
* `.smrt/manifest.json`, or `src/manifest/manifest.json`) with moduleType: "smrt"
|
|
9
|
+
* 4. Caching results based on lockfile hash and manifest timestamps
|
|
10
|
+
*
|
|
11
|
+
* Cache Strategy:
|
|
12
|
+
* - ENABLED by default (5-50x faster startup)
|
|
13
|
+
* - Automatically invalidates when lockfile or any manifest.json changes
|
|
14
|
+
* - Disable with SMRT_DISABLE_DISCOVERY_CACHE=true for debugging
|
|
15
|
+
*/
|
|
16
|
+
/** Timing data for --timing flag */
|
|
17
|
+
interface TimingData {
|
|
18
|
+
discovery?: number;
|
|
19
|
+
cacheCheck?: number;
|
|
20
|
+
total?: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get timing data from last discovery operation
|
|
24
|
+
*/
|
|
25
|
+
export declare function getDiscoveryTiming(): TimingData;
|
|
26
|
+
export declare function resolveManifestPath(packageName: string, baseDir?: string): string | null;
|
|
27
|
+
export interface DiscoveryOptions {
|
|
28
|
+
/** Override project root for discovery/cache */
|
|
29
|
+
baseDir?: string;
|
|
30
|
+
/** Force fresh discovery, ignoring cache */
|
|
31
|
+
noCache?: boolean;
|
|
32
|
+
/** Show verbose output */
|
|
33
|
+
verbose?: boolean;
|
|
34
|
+
/** Record timing data */
|
|
35
|
+
timing?: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Main discovery function
|
|
39
|
+
*
|
|
40
|
+
* Cache ENABLED by default (5-50x faster startup)
|
|
41
|
+
* - Automatically invalidates when lockfile changes (dependencies updated)
|
|
42
|
+
* - Automatically invalidates when any manifest.json changes (packages rebuilt)
|
|
43
|
+
*
|
|
44
|
+
* Disable with SMRT_DISABLE_DISCOVERY_CACHE=true for debugging
|
|
45
|
+
*/
|
|
46
|
+
export declare function discoverSmrtPackages(options?: DiscoveryOptions): string[];
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=discover-smrt-packages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover-smrt-packages.d.ts","sourceRoot":"","sources":["../../src/manifest/discover-smrt-packages.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAoBH,oCAAoC;AACpC,UAAU,UAAU;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,UAAU,CAE/C;AA2ID,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,MAAsB,GAC9B,MAAM,GAAG,IAAI,CAoBf;AAkPD,MAAM,WAAW,gBAAgB;IAC/B,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yBAAyB;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,gBAAqB,GAAG,MAAM,EAAE,CAsE7E"}
|