@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,462 @@
|
|
|
1
|
+
import { ObjectRegistry } from "../registry.js";
|
|
2
|
+
import { runWithTenantGate } from "./tenant-gate.js";
|
|
3
|
+
const CRUD_OPERATIONS = ["list", "get", "create", "update", "delete"];
|
|
4
|
+
const RESERVED_FLAGS = /* @__PURE__ */ new Set([
|
|
5
|
+
"tenant",
|
|
6
|
+
"all-tenants",
|
|
7
|
+
"from-file",
|
|
8
|
+
"limit",
|
|
9
|
+
"offset",
|
|
10
|
+
"order-by",
|
|
11
|
+
"orderBy",
|
|
12
|
+
"where",
|
|
13
|
+
"format",
|
|
14
|
+
"json",
|
|
15
|
+
"help",
|
|
16
|
+
"id"
|
|
17
|
+
]);
|
|
18
|
+
class CLIGenerator {
|
|
19
|
+
config;
|
|
20
|
+
context;
|
|
21
|
+
constructor(config = {}, context = {}) {
|
|
22
|
+
this.config = {
|
|
23
|
+
name: "smrt-cli",
|
|
24
|
+
version: "1.0.0",
|
|
25
|
+
description: "Auto-generated CLI from smrt objects",
|
|
26
|
+
...config
|
|
27
|
+
};
|
|
28
|
+
this.context = context;
|
|
29
|
+
}
|
|
30
|
+
/** CLI program name. */
|
|
31
|
+
get name() {
|
|
32
|
+
return this.config.name;
|
|
33
|
+
}
|
|
34
|
+
/** CLI version. */
|
|
35
|
+
get version() {
|
|
36
|
+
return this.config.version;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Return the argv handler invoked by the generated `setupCLI()` wrapper.
|
|
40
|
+
*
|
|
41
|
+
* @returns An async function accepting the post-`node script` argv slice.
|
|
42
|
+
*/
|
|
43
|
+
generateHandler() {
|
|
44
|
+
return async (args) => {
|
|
45
|
+
await this.run(args ?? []);
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Parse and execute a single CLI invocation.
|
|
50
|
+
*
|
|
51
|
+
* @param args - argv slice (command + flags).
|
|
52
|
+
*/
|
|
53
|
+
async run(args) {
|
|
54
|
+
if (args.length === 0 || args[0] === "--help" || args[0] === "help") {
|
|
55
|
+
console.log(await this.helpText());
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const parsed = this.parseArgs(args);
|
|
59
|
+
if (!parsed) {
|
|
60
|
+
console.log(await this.helpText());
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const classInfo = this.resolveClass(parsed.objectName);
|
|
64
|
+
if (!classInfo) {
|
|
65
|
+
throw new Error(`Object type '${parsed.objectName}' not found`);
|
|
66
|
+
}
|
|
67
|
+
const objectName = classInfo.name || parsed.objectName;
|
|
68
|
+
await this.assertCommandExposed(objectName, parsed.action);
|
|
69
|
+
const tenantId = typeof parsed.flags.tenant === "string" ? parsed.flags.tenant : this.context.tenantId;
|
|
70
|
+
const allowCrossTenant = parsed.flags["all-tenants"] === true || this.context.allowCrossTenant === true;
|
|
71
|
+
const result = await runWithTenantGate(
|
|
72
|
+
{ className: objectName, tenantId, allowCrossTenant, surface: "CLI" },
|
|
73
|
+
async () => {
|
|
74
|
+
const collection = await this.getCollection(objectName);
|
|
75
|
+
return this.executeAction(collection, objectName, parsed);
|
|
76
|
+
}
|
|
77
|
+
);
|
|
78
|
+
if (result !== void 0) {
|
|
79
|
+
console.log(JSON.stringify(this.toPublicData(result), null, 2));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Parse argv into a command + flags. Supports `name:action` and
|
|
84
|
+
* `name action` command forms, `--key value`, `--key=value`, and bare
|
|
85
|
+
* `--flag` booleans.
|
|
86
|
+
*/
|
|
87
|
+
parseArgs(args) {
|
|
88
|
+
const [command, ...rest] = args;
|
|
89
|
+
if (!command || command.startsWith("-")) return null;
|
|
90
|
+
let objectName;
|
|
91
|
+
let action;
|
|
92
|
+
let tail = rest;
|
|
93
|
+
if (command.includes(":")) {
|
|
94
|
+
const [obj, act] = command.split(":");
|
|
95
|
+
objectName = obj.toLowerCase();
|
|
96
|
+
action = act;
|
|
97
|
+
} else if (rest.length > 0 && !rest[0].startsWith("-")) {
|
|
98
|
+
objectName = command.toLowerCase();
|
|
99
|
+
action = rest[0];
|
|
100
|
+
tail = rest.slice(1);
|
|
101
|
+
} else {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
if (!objectName || !action) return null;
|
|
105
|
+
const flags = {};
|
|
106
|
+
let positional;
|
|
107
|
+
for (let i = 0; i < tail.length; i++) {
|
|
108
|
+
const token = tail[i];
|
|
109
|
+
if (token.startsWith("--")) {
|
|
110
|
+
const body = token.slice(2);
|
|
111
|
+
const eq = body.indexOf("=");
|
|
112
|
+
if (eq !== -1) {
|
|
113
|
+
flags[body.slice(0, eq)] = body.slice(eq + 1);
|
|
114
|
+
} else {
|
|
115
|
+
const next = tail[i + 1];
|
|
116
|
+
if (next !== void 0 && !next.startsWith("--")) {
|
|
117
|
+
flags[body] = next;
|
|
118
|
+
i++;
|
|
119
|
+
} else {
|
|
120
|
+
flags[body] = true;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
} else if (positional === void 0) {
|
|
124
|
+
positional = token;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return { objectName, action, positional, flags };
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Resolve a registered class by simple name (case-insensitive), mirroring the
|
|
131
|
+
* MCP generator's lookup.
|
|
132
|
+
*/
|
|
133
|
+
resolveClass(objectName) {
|
|
134
|
+
const registeredClasses = ObjectRegistry.getAllClasses();
|
|
135
|
+
for (const [key, info] of registeredClasses) {
|
|
136
|
+
const simpleName = info.name || key;
|
|
137
|
+
if (simpleName.toLowerCase() === objectName.toLowerCase()) {
|
|
138
|
+
return info;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Throw if `action` is not exposed for `objectName` under its `@smrt({ cli })`
|
|
145
|
+
* config. `cli: false` disables the object entirely; an `include` list is the
|
|
146
|
+
* complete allowlist; custom methods must be `isPublic`.
|
|
147
|
+
*/
|
|
148
|
+
async assertCommandExposed(objectName, action) {
|
|
149
|
+
const config = ObjectRegistry.getConfig(objectName);
|
|
150
|
+
const cliConfig = config?.cli;
|
|
151
|
+
if (cliConfig === false) {
|
|
152
|
+
throw new Error(`CLI is disabled for ${objectName}`);
|
|
153
|
+
}
|
|
154
|
+
const included = typeof cliConfig === "object" ? cliConfig?.include : void 0;
|
|
155
|
+
const excluded = typeof cliConfig === "object" && cliConfig?.exclude ? cliConfig.exclude : [];
|
|
156
|
+
if (excluded.includes(action)) {
|
|
157
|
+
throw new Error(`Command '${action}' is excluded for ${objectName}`);
|
|
158
|
+
}
|
|
159
|
+
const isCrud = CRUD_OPERATIONS.includes(action);
|
|
160
|
+
if (isCrud) {
|
|
161
|
+
if (included && !included.includes(action)) {
|
|
162
|
+
throw new Error(`Command '${action}' is not enabled for ${objectName}`);
|
|
163
|
+
}
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const methods = await ObjectRegistry.getAllMethods(objectName);
|
|
167
|
+
const methodDef = methods.get(action);
|
|
168
|
+
if (!methodDef) {
|
|
169
|
+
throw new Error(`Unknown command '${action}' for ${objectName}`);
|
|
170
|
+
}
|
|
171
|
+
if (!methodDef.isPublic) {
|
|
172
|
+
throw new Error(`Command '${action}' is not public on ${objectName}`);
|
|
173
|
+
}
|
|
174
|
+
if (included !== void 0 && !included.includes(action)) {
|
|
175
|
+
throw new Error(`Command '${action}' is not enabled for ${objectName}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Get the collection for an object via the registry factory. Uses
|
|
180
|
+
* `ObjectRegistry.getCollection`, which caches, initializes, and — for plain
|
|
181
|
+
* `@smrt()` models without a hand-written collection class — auto-creates the
|
|
182
|
+
* default collection. (A bare `collectionConstructor` check would wrongly
|
|
183
|
+
* throw for those models even though CRUD is advertised.)
|
|
184
|
+
*/
|
|
185
|
+
async getCollection(objectName) {
|
|
186
|
+
return ObjectRegistry.getCollection(objectName, {
|
|
187
|
+
ai: this.context.ai,
|
|
188
|
+
db: this.context.db
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Execute a parsed command against a collection.
|
|
193
|
+
*/
|
|
194
|
+
async executeAction(collection, objectName, parsed) {
|
|
195
|
+
const { action, positional, flags } = parsed;
|
|
196
|
+
switch (action) {
|
|
197
|
+
case "list": {
|
|
198
|
+
const listOptions = {
|
|
199
|
+
limit: Math.min(this.toNumber(flags.limit, 50), 1e3),
|
|
200
|
+
offset: this.toNumber(flags.offset, 0)
|
|
201
|
+
};
|
|
202
|
+
const orderBy = flags["order-by"] ?? flags.orderBy;
|
|
203
|
+
if (typeof orderBy === "string") listOptions.orderBy = orderBy;
|
|
204
|
+
if (typeof flags.where === "string") {
|
|
205
|
+
listOptions.where = JSON.parse(flags.where);
|
|
206
|
+
}
|
|
207
|
+
return collection.list(listOptions);
|
|
208
|
+
}
|
|
209
|
+
case "get": {
|
|
210
|
+
const id = positional ?? this.flagString(flags.id);
|
|
211
|
+
if (!id) throw new Error("An id is required for get");
|
|
212
|
+
const item = await collection.get(id);
|
|
213
|
+
if (!item) throw new Error(`${objectName} not found`);
|
|
214
|
+
return item;
|
|
215
|
+
}
|
|
216
|
+
case "create": {
|
|
217
|
+
const data = this.applyWritablePolicy(
|
|
218
|
+
objectName,
|
|
219
|
+
await this.readPayload(flags)
|
|
220
|
+
);
|
|
221
|
+
if (this.context.user) {
|
|
222
|
+
data.created_by = this.context.user.id;
|
|
223
|
+
data.owner_id = this.context.user.id;
|
|
224
|
+
}
|
|
225
|
+
const created = await collection.create(data);
|
|
226
|
+
await created.save();
|
|
227
|
+
return created;
|
|
228
|
+
}
|
|
229
|
+
case "update": {
|
|
230
|
+
const id = positional ?? this.flagString(flags.id);
|
|
231
|
+
if (!id) throw new Error("An id is required for update");
|
|
232
|
+
const existing = await collection.get(id);
|
|
233
|
+
if (!existing) throw new Error(`${objectName} not found`);
|
|
234
|
+
const data = this.applyWritablePolicy(
|
|
235
|
+
objectName,
|
|
236
|
+
await this.readPayload(flags)
|
|
237
|
+
);
|
|
238
|
+
Object.assign(existing, data);
|
|
239
|
+
if (this.context.user) {
|
|
240
|
+
existing.updated_by = this.context.user.id;
|
|
241
|
+
}
|
|
242
|
+
await existing.save();
|
|
243
|
+
return existing;
|
|
244
|
+
}
|
|
245
|
+
case "delete": {
|
|
246
|
+
const id = positional ?? this.flagString(flags.id);
|
|
247
|
+
if (!id) throw new Error("An id is required for delete");
|
|
248
|
+
const existing = await collection.get(id);
|
|
249
|
+
if (!existing) throw new Error(`${objectName} not found`);
|
|
250
|
+
await existing.delete();
|
|
251
|
+
return { success: true, id, message: `${objectName} deleted` };
|
|
252
|
+
}
|
|
253
|
+
default:
|
|
254
|
+
return this.executeCustomAction(collection, action, positional, flags);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Execute a custom method on an instance (when an id is given) or on the
|
|
259
|
+
* collection (singleton actions). Mirrors the MCP custom-action path.
|
|
260
|
+
*/
|
|
261
|
+
async executeCustomAction(collection, action, positional, flags) {
|
|
262
|
+
const options = this.customOptions(flags);
|
|
263
|
+
const id = positional ?? this.flagString(flags.id);
|
|
264
|
+
if (id) {
|
|
265
|
+
const object = await collection.get(id);
|
|
266
|
+
if (!object) throw new Error("Object not found");
|
|
267
|
+
if (typeof object[action] !== "function") {
|
|
268
|
+
throw new Error(`Method '${action}' not found on object instance`);
|
|
269
|
+
}
|
|
270
|
+
return object[action](options);
|
|
271
|
+
}
|
|
272
|
+
if (typeof collection[action] === "function") {
|
|
273
|
+
return collection[action](options);
|
|
274
|
+
}
|
|
275
|
+
throw new Error(
|
|
276
|
+
`Method '${action}' not found on collection. Provide an id for object-specific actions.`
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Resolve the create/update payload: `--from-file <path>` (JSON) takes
|
|
281
|
+
* precedence; otherwise non-reserved `--field value` flags form the body.
|
|
282
|
+
* Reading from a file also keeps secrets off the process argv (#1556).
|
|
283
|
+
*/
|
|
284
|
+
async readPayload(flags) {
|
|
285
|
+
const fromFile = flags["from-file"];
|
|
286
|
+
if (typeof fromFile === "string" && fromFile) {
|
|
287
|
+
const { readFile } = await import("node:fs/promises");
|
|
288
|
+
const content = await readFile(fromFile, "utf-8");
|
|
289
|
+
const parsed = JSON.parse(content);
|
|
290
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
291
|
+
throw new Error("--from-file must contain a JSON object");
|
|
292
|
+
}
|
|
293
|
+
return parsed;
|
|
294
|
+
}
|
|
295
|
+
const data = {};
|
|
296
|
+
for (const [key, value] of Object.entries(flags)) {
|
|
297
|
+
if (RESERVED_FLAGS.has(key)) continue;
|
|
298
|
+
data[key] = this.coerceValue(value);
|
|
299
|
+
}
|
|
300
|
+
return data;
|
|
301
|
+
}
|
|
302
|
+
/** Collect non-reserved flags as custom-action options. */
|
|
303
|
+
customOptions(flags) {
|
|
304
|
+
const options = {};
|
|
305
|
+
for (const [key, value] of Object.entries(flags)) {
|
|
306
|
+
if (RESERVED_FLAGS.has(key)) continue;
|
|
307
|
+
options[key] = this.coerceValue(value);
|
|
308
|
+
}
|
|
309
|
+
return options;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Mass-assignment guard (#1540/#1556): strip framework/server-managed and
|
|
313
|
+
* `@field({ readonly })` fields, and — when an `@smrt({ api: { writable } })`
|
|
314
|
+
* allowlist is set — intersect with it. Identical policy to the REST/MCP
|
|
315
|
+
* generators so a CLI create/update cannot set fields the API forbids.
|
|
316
|
+
*/
|
|
317
|
+
applyWritablePolicy(objectName, data) {
|
|
318
|
+
if (!data || typeof data !== "object") return {};
|
|
319
|
+
const serverManaged = /* @__PURE__ */ new Set([
|
|
320
|
+
"id",
|
|
321
|
+
"tenantId",
|
|
322
|
+
"tenant_id",
|
|
323
|
+
"createdAt",
|
|
324
|
+
"created_at",
|
|
325
|
+
"updatedAt",
|
|
326
|
+
"updated_at"
|
|
327
|
+
]);
|
|
328
|
+
const readonly = /* @__PURE__ */ new Set();
|
|
329
|
+
let writable = null;
|
|
330
|
+
if (objectName) {
|
|
331
|
+
const apiConfig = ObjectRegistry.getConfig(objectName)?.api;
|
|
332
|
+
if (apiConfig && typeof apiConfig === "object" && Array.isArray(apiConfig.writable)) {
|
|
333
|
+
writable = apiConfig.writable;
|
|
334
|
+
}
|
|
335
|
+
for (const [name, def] of ObjectRegistry.getFields(objectName)) {
|
|
336
|
+
if (def && (def.readonly === true || def._meta?.readonly === true)) {
|
|
337
|
+
readonly.add(name);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
const result = {};
|
|
342
|
+
for (const [key, value] of Object.entries(data)) {
|
|
343
|
+
if (key.startsWith("_")) continue;
|
|
344
|
+
if (serverManaged.has(key)) continue;
|
|
345
|
+
if (readonly.has(key)) continue;
|
|
346
|
+
if (writable && !writable.includes(key)) continue;
|
|
347
|
+
result[key] = value;
|
|
348
|
+
}
|
|
349
|
+
return result;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Serialize command output, excluding `@field({ sensitive })` fields (#1540).
|
|
353
|
+
* Recurses arrays/plain objects so a SmrtObject nested in a custom-action
|
|
354
|
+
* result is stripped too; a cycle guard prevents infinite loops.
|
|
355
|
+
*/
|
|
356
|
+
toPublicData(value, seen = /* @__PURE__ */ new WeakSet()) {
|
|
357
|
+
if (value === null || typeof value !== "object") return value;
|
|
358
|
+
if (typeof value.toPublicJSON === "function") return value.toPublicJSON();
|
|
359
|
+
if (Array.isArray(value)) {
|
|
360
|
+
if (seen.has(value)) return value;
|
|
361
|
+
seen.add(value);
|
|
362
|
+
return value.map((entry) => this.toPublicData(entry, seen));
|
|
363
|
+
}
|
|
364
|
+
const proto = Object.getPrototypeOf(value);
|
|
365
|
+
if (proto !== Object.prototype && proto !== null) return value;
|
|
366
|
+
if (seen.has(value)) return value;
|
|
367
|
+
seen.add(value);
|
|
368
|
+
const out = {};
|
|
369
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
370
|
+
out[key] = this.toPublicData(entry, seen);
|
|
371
|
+
}
|
|
372
|
+
return out;
|
|
373
|
+
}
|
|
374
|
+
/** List the runnable commands grouped by object, for help output. */
|
|
375
|
+
async listCommands() {
|
|
376
|
+
const commands = [];
|
|
377
|
+
for (const [key, classInfo] of ObjectRegistry.getAllClasses()) {
|
|
378
|
+
const objectName = classInfo.name || key;
|
|
379
|
+
const config = ObjectRegistry.getConfig(objectName);
|
|
380
|
+
const cliConfig = config?.cli;
|
|
381
|
+
if (cliConfig === false) continue;
|
|
382
|
+
const lower = objectName.toLowerCase();
|
|
383
|
+
const included = typeof cliConfig === "object" ? cliConfig?.include : void 0;
|
|
384
|
+
const excluded = typeof cliConfig === "object" && cliConfig?.exclude ? cliConfig.exclude : [];
|
|
385
|
+
const expose = (cmd) => !excluded.includes(cmd) && (!included || included.includes(cmd));
|
|
386
|
+
for (const verb of CRUD_OPERATIONS) {
|
|
387
|
+
if (expose(verb)) commands.push(`${lower}:${verb}`);
|
|
388
|
+
}
|
|
389
|
+
const methods = await ObjectRegistry.getAllMethods(objectName);
|
|
390
|
+
for (const [methodName, methodDef] of methods) {
|
|
391
|
+
if (CRUD_OPERATIONS.includes(methodName)) continue;
|
|
392
|
+
if (!methodDef.isPublic) continue;
|
|
393
|
+
if (excluded.includes(methodName)) continue;
|
|
394
|
+
if (included !== void 0 && !included.includes(methodName)) continue;
|
|
395
|
+
commands.push(`${lower}:${methodName}`);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
return commands.sort();
|
|
399
|
+
}
|
|
400
|
+
async helpText() {
|
|
401
|
+
const commands = await this.listCommands();
|
|
402
|
+
return [
|
|
403
|
+
`${this.config.name} ${this.config.version}`,
|
|
404
|
+
this.config.description ?? "",
|
|
405
|
+
"",
|
|
406
|
+
"Usage: <object>:<action> [id] [--flags]",
|
|
407
|
+
"",
|
|
408
|
+
"Global flags:",
|
|
409
|
+
" --tenant <id> run the command inside a specific tenant",
|
|
410
|
+
" --all-tenants allow cross-tenant access (operator opt-in)",
|
|
411
|
+
" --from-file <p> read create/update payload from a JSON file",
|
|
412
|
+
" --where <json> filter for list",
|
|
413
|
+
" --limit / --offset / --order-by",
|
|
414
|
+
"",
|
|
415
|
+
"Commands:",
|
|
416
|
+
...commands.map((c) => ` ${c}`)
|
|
417
|
+
].join("\n");
|
|
418
|
+
}
|
|
419
|
+
toNumber(value, fallback) {
|
|
420
|
+
if (typeof value !== "string") return fallback;
|
|
421
|
+
const n = Number.parseInt(value, 10);
|
|
422
|
+
return Number.isNaN(n) ? fallback : n;
|
|
423
|
+
}
|
|
424
|
+
flagString(value) {
|
|
425
|
+
return typeof value === "string" ? value : void 0;
|
|
426
|
+
}
|
|
427
|
+
/** Coerce a flag value to a JSON scalar/object where it parses cleanly. */
|
|
428
|
+
coerceValue(value) {
|
|
429
|
+
if (typeof value !== "string") return value;
|
|
430
|
+
if (value === "true") return true;
|
|
431
|
+
if (value === "false") return false;
|
|
432
|
+
if (value !== "" && !Number.isNaN(Number(value))) return Number(value);
|
|
433
|
+
if (value.startsWith("{") && value.endsWith("}") || value.startsWith("[") && value.endsWith("]")) {
|
|
434
|
+
try {
|
|
435
|
+
return JSON.parse(value);
|
|
436
|
+
} catch {
|
|
437
|
+
return value;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
return value;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
function setupCLI(config = {}, context = {}) {
|
|
444
|
+
const generator = new CLIGenerator(config, context);
|
|
445
|
+
return {
|
|
446
|
+
run: async (argv) => {
|
|
447
|
+
const handler = generator.generateHandler();
|
|
448
|
+
await handler(argv.slice(2));
|
|
449
|
+
},
|
|
450
|
+
generator
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
function getCLIHandler(config = {}, context = {}) {
|
|
454
|
+
const generator = new CLIGenerator(config, context);
|
|
455
|
+
return generator.generateHandler();
|
|
456
|
+
}
|
|
457
|
+
export {
|
|
458
|
+
CLIGenerator,
|
|
459
|
+
getCLIHandler,
|
|
460
|
+
setupCLI
|
|
461
|
+
};
|
|
462
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sources":["../../src/generators/cli.ts"],"sourcesContent":["/**\n * CLI command generator for smrt objects\n *\n * Exposes registered `@smrt()` objects as a runnable admin CLI: each object gets\n * `list`/`get`/`create`/`update`/`delete` commands plus its public custom\n * methods, dispatched as `objectname:action`.\n *\n * Security parity with the REST/MCP generators (#1540, #1547, #1554, #1556):\n * - **Mass-assignment guard** — create/update bodies are filtered through the\n * `@smrt({ api: { writable: [...] } })` allowlist, dropping server-managed and\n * `@field({ readonly })` fields ({@link CLIGenerator.applyWritablePolicy}).\n * - **Exhaustive include** — an `include` list is the COMPLETE allowlist for the\n * surface; custom methods are gated on `isPublic`.\n * - **Sensitive redaction** — command *output* is serialized through\n * {@link CLIGenerator.toPublicData} so `@field({ sensitive })` values never\n * print (input bodies are guarded by the writable allowlist above).\n * - **Fail-closed tenant context** — tenant-scoped reads/writes run inside the\n * tenancy gate; without `--tenant <id>` / `--all-tenants` (and with tenancy\n * enabled) the command throws rather than ranging across all tenants.\n */\n\nimport type { SmrtCollection } from '../collection';\nimport { ObjectRegistry } from '../registry';\nimport { runWithTenantGate } from './tenant-gate.js';\n\n/**\n * Configuration for a generated CLI.\n */\nexport interface CLIConfig {\n /** CLI program name (used in help output). */\n name?: string;\n /** CLI version. */\n version?: string;\n /** CLI description. */\n description?: string;\n}\n\n/**\n * Per-invocation context for a generated CLI.\n */\nexport interface CLIContext {\n /** Database handle passed to collections. */\n db?: any;\n /** AI provider passed to collections. */\n ai?: any;\n /** Authenticated operator, when the host establishes one. */\n user?: {\n id: string;\n roles?: string[];\n };\n /**\n * Default tenant for tenant-scoped commands when no `--tenant` flag is given.\n * Hosts that authenticate an operator may set this from the principal.\n */\n tenantId?: string;\n /**\n * Default cross-tenant opt-in when no `--all-tenants` flag is given. Hosts\n * may set this for trusted operator/admin shells.\n */\n allowCrossTenant?: boolean;\n}\n\n/** Standard CRUD verbs handled directly by the generator. */\nconst CRUD_OPERATIONS = ['list', 'get', 'create', 'update', 'delete'];\n\n/**\n * Flags consumed by the CLI itself — never treated as create/update field\n * values or as custom-action options.\n */\nconst RESERVED_FLAGS = new Set([\n 'tenant',\n 'all-tenants',\n 'from-file',\n 'limit',\n 'offset',\n 'order-by',\n 'orderBy',\n 'where',\n 'format',\n 'json',\n 'help',\n 'id',\n]);\n\n/** Parsed CLI invocation. */\ninterface ParsedInvocation {\n /** Object/collection segment (lowercased), e.g. `product`. */\n objectName: string;\n /** Action segment, e.g. `list` or a custom method name. */\n action: string;\n /** First positional argument after the command (typically an id). */\n positional?: string;\n /** Parsed flags. String for `--k v`/`--k=v`, `true` for bare `--flag`. */\n flags: Record<string, string | boolean>;\n}\n\n/**\n * Generate and run an admin CLI for the registered `@smrt()` objects.\n */\nexport class CLIGenerator {\n private config: CLIConfig;\n private context: CLIContext;\n\n constructor(config: CLIConfig = {}, context: CLIContext = {}) {\n this.config = {\n name: 'smrt-cli',\n version: '1.0.0',\n description: 'Auto-generated CLI from smrt objects',\n ...config,\n };\n this.context = context;\n }\n\n /** CLI program name. */\n get name(): string | undefined {\n return this.config.name;\n }\n\n /** CLI version. */\n get version(): string | undefined {\n return this.config.version;\n }\n\n /**\n * Return the argv handler invoked by the generated `setupCLI()` wrapper.\n *\n * @returns An async function accepting the post-`node script` argv slice.\n */\n generateHandler(): (args: string[]) => Promise<void> {\n return async (args: string[]) => {\n await this.run(args ?? []);\n };\n }\n\n /**\n * Parse and execute a single CLI invocation.\n *\n * @param args - argv slice (command + flags).\n */\n async run(args: string[]): Promise<void> {\n if (args.length === 0 || args[0] === '--help' || args[0] === 'help') {\n console.log(await this.helpText());\n return;\n }\n\n const parsed = this.parseArgs(args);\n if (!parsed) {\n console.log(await this.helpText());\n return;\n }\n\n const classInfo = this.resolveClass(parsed.objectName);\n if (!classInfo) {\n throw new Error(`Object type '${parsed.objectName}' not found`);\n }\n const objectName: string = classInfo.name || parsed.objectName;\n\n await this.assertCommandExposed(objectName, parsed.action);\n\n const tenantId =\n typeof parsed.flags.tenant === 'string'\n ? parsed.flags.tenant\n : this.context.tenantId;\n const allowCrossTenant =\n parsed.flags['all-tenants'] === true ||\n this.context.allowCrossTenant === true;\n\n // Tenant-scoping is resolved authoritatively inside tenancy (by class name),\n // matching the interceptor and covering both @TenantScoped and\n // @smrt({ tenantScoped }) registrations (#1554).\n const result = await runWithTenantGate(\n { className: objectName, tenantId, allowCrossTenant, surface: 'CLI' },\n async () => {\n const collection = await this.getCollection(objectName);\n return this.executeAction(collection, objectName, parsed);\n },\n );\n\n if (result !== undefined) {\n console.log(JSON.stringify(this.toPublicData(result), null, 2));\n }\n }\n\n /**\n * Parse argv into a command + flags. Supports `name:action` and\n * `name action` command forms, `--key value`, `--key=value`, and bare\n * `--flag` booleans.\n */\n private parseArgs(args: string[]): ParsedInvocation | null {\n const [command, ...rest] = args;\n if (!command || command.startsWith('-')) return null;\n\n let objectName: string;\n let action: string;\n let tail = rest;\n\n if (command.includes(':')) {\n const [obj, act] = command.split(':');\n objectName = obj.toLowerCase();\n action = act;\n } else if (rest.length > 0 && !rest[0].startsWith('-')) {\n objectName = command.toLowerCase();\n action = rest[0];\n tail = rest.slice(1);\n } else {\n // A bare object name with no action is not a runnable command.\n return null;\n }\n\n if (!objectName || !action) return null;\n\n const flags: Record<string, string | boolean> = {};\n let positional: string | undefined;\n\n for (let i = 0; i < tail.length; i++) {\n const token = tail[i];\n if (token.startsWith('--')) {\n const body = token.slice(2);\n const eq = body.indexOf('=');\n if (eq !== -1) {\n flags[body.slice(0, eq)] = body.slice(eq + 1);\n } else {\n const next = tail[i + 1];\n if (next !== undefined && !next.startsWith('--')) {\n flags[body] = next;\n i++;\n } else {\n flags[body] = true;\n }\n }\n } else if (positional === undefined) {\n positional = token;\n }\n }\n\n return { objectName, action, positional, flags };\n }\n\n /**\n * Resolve a registered class by simple name (case-insensitive), mirroring the\n * MCP generator's lookup.\n */\n private resolveClass(objectName: string): any {\n const registeredClasses = ObjectRegistry.getAllClasses();\n for (const [key, info] of registeredClasses) {\n const simpleName = info.name || key;\n if (simpleName.toLowerCase() === objectName.toLowerCase()) {\n return info;\n }\n }\n return null;\n }\n\n /**\n * Throw if `action` is not exposed for `objectName` under its `@smrt({ cli })`\n * config. `cli: false` disables the object entirely; an `include` list is the\n * complete allowlist; custom methods must be `isPublic`.\n */\n private async assertCommandExposed(\n objectName: string,\n action: string,\n ): Promise<void> {\n const config = ObjectRegistry.getConfig(objectName);\n const cliConfig = config?.cli;\n\n if (cliConfig === false) {\n throw new Error(`CLI is disabled for ${objectName}`);\n }\n\n const included: string[] | undefined =\n typeof cliConfig === 'object' ? cliConfig?.include : undefined;\n const excluded: string[] =\n typeof cliConfig === 'object' && cliConfig?.exclude\n ? cliConfig.exclude\n : [];\n\n if (excluded.includes(action)) {\n throw new Error(`Command '${action}' is excluded for ${objectName}`);\n }\n\n const isCrud = CRUD_OPERATIONS.includes(action);\n\n if (isCrud) {\n // An include list, when present, is the complete allowlist for CRUD too.\n if (included && !included.includes(action)) {\n throw new Error(`Command '${action}' is not enabled for ${objectName}`);\n }\n return;\n }\n\n // Custom method: must be public, and — when an include list is present — it\n // is the COMPLETE allowlist (parity with MCP exhaustive-include, #1547).\n const methods = await ObjectRegistry.getAllMethods(objectName);\n const methodDef = methods.get(action);\n if (!methodDef) {\n throw new Error(`Unknown command '${action}' for ${objectName}`);\n }\n if (!methodDef.isPublic) {\n throw new Error(`Command '${action}' is not public on ${objectName}`);\n }\n if (included !== undefined && !included.includes(action)) {\n throw new Error(`Command '${action}' is not enabled for ${objectName}`);\n }\n }\n\n /**\n * Get the collection for an object via the registry factory. Uses\n * `ObjectRegistry.getCollection`, which caches, initializes, and — for plain\n * `@smrt()` models without a hand-written collection class — auto-creates the\n * default collection. (A bare `collectionConstructor` check would wrongly\n * throw for those models even though CRUD is advertised.)\n */\n private async getCollection(\n objectName: string,\n ): Promise<SmrtCollection<any>> {\n return ObjectRegistry.getCollection(objectName, {\n ai: this.context.ai,\n db: this.context.db,\n });\n }\n\n /**\n * Execute a parsed command against a collection.\n */\n private async executeAction(\n collection: SmrtCollection<any>,\n objectName: string,\n parsed: ParsedInvocation,\n ): Promise<any> {\n const { action, positional, flags } = parsed;\n\n switch (action) {\n case 'list': {\n const listOptions: any = {\n limit: Math.min(this.toNumber(flags.limit, 50), 1000),\n offset: this.toNumber(flags.offset, 0),\n };\n const orderBy = flags['order-by'] ?? flags.orderBy;\n if (typeof orderBy === 'string') listOptions.orderBy = orderBy;\n if (typeof flags.where === 'string') {\n listOptions.where = JSON.parse(flags.where);\n }\n return collection.list(listOptions);\n }\n\n case 'get': {\n const id = positional ?? this.flagString(flags.id);\n if (!id) throw new Error('An id is required for get');\n const item = await collection.get(id);\n if (!item) throw new Error(`${objectName} not found`);\n return item;\n }\n\n case 'create': {\n const data = this.applyWritablePolicy(\n objectName,\n await this.readPayload(flags),\n );\n if (this.context.user) {\n (data as any).created_by = this.context.user.id;\n (data as any).owner_id = this.context.user.id;\n }\n const created = await collection.create(data);\n await created.save();\n return created;\n }\n\n case 'update': {\n const id = positional ?? this.flagString(flags.id);\n if (!id) throw new Error('An id is required for update');\n const existing = await collection.get(id);\n if (!existing) throw new Error(`${objectName} not found`);\n const data = this.applyWritablePolicy(\n objectName,\n await this.readPayload(flags),\n );\n Object.assign(existing, data);\n if (this.context.user) {\n (existing as any).updated_by = this.context.user.id;\n }\n await existing.save();\n return existing;\n }\n\n case 'delete': {\n const id = positional ?? this.flagString(flags.id);\n if (!id) throw new Error('An id is required for delete');\n const existing = await collection.get(id);\n if (!existing) throw new Error(`${objectName} not found`);\n await existing.delete();\n return { success: true, id, message: `${objectName} deleted` };\n }\n\n default:\n return this.executeCustomAction(collection, action, positional, flags);\n }\n }\n\n /**\n * Execute a custom method on an instance (when an id is given) or on the\n * collection (singleton actions). Mirrors the MCP custom-action path.\n */\n private async executeCustomAction(\n collection: SmrtCollection<any>,\n action: string,\n positional: string | undefined,\n flags: Record<string, string | boolean>,\n ): Promise<any> {\n const options = this.customOptions(flags);\n const id = positional ?? this.flagString(flags.id);\n\n if (id) {\n const object = (await collection.get(id)) as any;\n if (!object) throw new Error('Object not found');\n if (typeof object[action] !== 'function') {\n throw new Error(`Method '${action}' not found on object instance`);\n }\n return object[action](options);\n }\n\n if (typeof (collection as any)[action] === 'function') {\n return (collection as any)[action](options);\n }\n throw new Error(\n `Method '${action}' not found on collection. Provide an id for object-specific actions.`,\n );\n }\n\n /**\n * Resolve the create/update payload: `--from-file <path>` (JSON) takes\n * precedence; otherwise non-reserved `--field value` flags form the body.\n * Reading from a file also keeps secrets off the process argv (#1556).\n */\n private async readPayload(\n flags: Record<string, string | boolean>,\n ): Promise<Record<string, any>> {\n const fromFile = flags['from-file'];\n if (typeof fromFile === 'string' && fromFile) {\n const { readFile } = await import('node:fs/promises');\n const content = await readFile(fromFile, 'utf-8');\n const parsed = JSON.parse(content);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error('--from-file must contain a JSON object');\n }\n return parsed as Record<string, any>;\n }\n\n const data: Record<string, any> = {};\n for (const [key, value] of Object.entries(flags)) {\n if (RESERVED_FLAGS.has(key)) continue;\n data[key] = this.coerceValue(value);\n }\n return data;\n }\n\n /** Collect non-reserved flags as custom-action options. */\n private customOptions(\n flags: Record<string, string | boolean>,\n ): Record<string, any> {\n const options: Record<string, any> = {};\n for (const [key, value] of Object.entries(flags)) {\n if (RESERVED_FLAGS.has(key)) continue;\n options[key] = this.coerceValue(value);\n }\n return options;\n }\n\n /**\n * Mass-assignment guard (#1540/#1556): strip framework/server-managed and\n * `@field({ readonly })` fields, and — when an `@smrt({ api: { writable } })`\n * allowlist is set — intersect with it. Identical policy to the REST/MCP\n * generators so a CLI create/update cannot set fields the API forbids.\n */\n private applyWritablePolicy(\n objectName: string | undefined,\n data: any,\n ): Record<string, any> {\n if (!data || typeof data !== 'object') return {};\n\n const serverManaged = new Set([\n 'id',\n 'tenantId',\n 'tenant_id',\n 'createdAt',\n 'created_at',\n 'updatedAt',\n 'updated_at',\n ]);\n\n const readonly = new Set<string>();\n let writable: string[] | null = null;\n\n if (objectName) {\n const apiConfig = ObjectRegistry.getConfig(objectName)?.api;\n if (\n apiConfig &&\n typeof apiConfig === 'object' &&\n Array.isArray((apiConfig as { writable?: unknown }).writable)\n ) {\n writable = (apiConfig as { writable: string[] }).writable;\n }\n\n for (const [name, def] of ObjectRegistry.getFields(objectName)) {\n if (def && (def.readonly === true || def._meta?.readonly === true)) {\n readonly.add(name);\n }\n }\n }\n\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(data)) {\n if (key.startsWith('_')) continue;\n if (serverManaged.has(key)) continue;\n if (readonly.has(key)) continue;\n if (writable && !writable.includes(key)) continue;\n result[key] = value;\n }\n return result;\n }\n\n /**\n * Serialize command output, excluding `@field({ sensitive })` fields (#1540).\n * Recurses arrays/plain objects so a SmrtObject nested in a custom-action\n * result is stripped too; a cycle guard prevents infinite loops.\n */\n private toPublicData(value: any, seen: WeakSet<object> = new WeakSet()): any {\n if (value === null || typeof value !== 'object') return value;\n if (typeof value.toPublicJSON === 'function') return value.toPublicJSON();\n if (Array.isArray(value)) {\n if (seen.has(value)) return value;\n seen.add(value);\n return value.map((entry) => this.toPublicData(entry, seen));\n }\n const proto = Object.getPrototypeOf(value);\n if (proto !== Object.prototype && proto !== null) return value;\n if (seen.has(value)) return value;\n seen.add(value);\n const out: Record<string, any> = {};\n for (const [key, entry] of Object.entries(value)) {\n out[key] = this.toPublicData(entry, seen);\n }\n return out;\n }\n\n /** List the runnable commands grouped by object, for help output. */\n async listCommands(): Promise<string[]> {\n const commands: string[] = [];\n for (const [key, classInfo] of ObjectRegistry.getAllClasses()) {\n const objectName = classInfo.name || key;\n const config = ObjectRegistry.getConfig(objectName);\n const cliConfig = config?.cli;\n if (cliConfig === false) continue;\n\n const lower = objectName.toLowerCase();\n const included: string[] | undefined =\n typeof cliConfig === 'object' ? cliConfig?.include : undefined;\n const excluded: string[] =\n typeof cliConfig === 'object' && cliConfig?.exclude\n ? cliConfig.exclude\n : [];\n\n const expose = (cmd: string) =>\n !excluded.includes(cmd) && (!included || included.includes(cmd));\n\n for (const verb of CRUD_OPERATIONS) {\n if (expose(verb)) commands.push(`${lower}:${verb}`);\n }\n\n const methods = await ObjectRegistry.getAllMethods(objectName);\n for (const [methodName, methodDef] of methods) {\n if (CRUD_OPERATIONS.includes(methodName)) continue;\n if (!methodDef.isPublic) continue;\n if (excluded.includes(methodName)) continue;\n if (included !== undefined && !included.includes(methodName)) continue;\n commands.push(`${lower}:${methodName}`);\n }\n }\n return commands.sort();\n }\n\n private async helpText(): Promise<string> {\n const commands = await this.listCommands();\n return [\n `${this.config.name} ${this.config.version}`,\n this.config.description ?? '',\n '',\n 'Usage: <object>:<action> [id] [--flags]',\n '',\n 'Global flags:',\n ' --tenant <id> run the command inside a specific tenant',\n ' --all-tenants allow cross-tenant access (operator opt-in)',\n ' --from-file <p> read create/update payload from a JSON file',\n ' --where <json> filter for list',\n ' --limit / --offset / --order-by',\n '',\n 'Commands:',\n ...commands.map((c) => ` ${c}`),\n ].join('\\n');\n }\n\n private toNumber(\n value: string | boolean | undefined,\n fallback: number,\n ): number {\n if (typeof value !== 'string') return fallback;\n const n = Number.parseInt(value, 10);\n return Number.isNaN(n) ? fallback : n;\n }\n\n private flagString(value: string | boolean | undefined): string | undefined {\n return typeof value === 'string' ? value : undefined;\n }\n\n /** Coerce a flag value to a JSON scalar/object where it parses cleanly. */\n private coerceValue(value: string | boolean): any {\n if (typeof value !== 'string') return value;\n if (value === 'true') return true;\n if (value === 'false') return false;\n if (value !== '' && !Number.isNaN(Number(value))) return Number(value);\n if (\n (value.startsWith('{') && value.endsWith('}')) ||\n (value.startsWith('[') && value.endsWith(']'))\n ) {\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n }\n return value;\n }\n}\n\n/**\n * Convenience runner used by the generated `setupCLI()` wrapper.\n *\n * @param config - CLI configuration.\n * @param context - Per-invocation context.\n * @returns A `{ run, generator }` pair; `run(argv)` strips the leading\n * `node script` entries before dispatching.\n */\nexport function setupCLI(config: CLIConfig = {}, context: CLIContext = {}) {\n const generator = new CLIGenerator(config, context);\n return {\n run: async (argv: string[]) => {\n const handler = generator.generateHandler();\n await handler(argv.slice(2));\n },\n generator,\n };\n}\n\n/**\n * Get a bare argv handler for a generated CLI.\n *\n * @param config - CLI configuration.\n * @param context - Per-invocation context.\n * @returns An async argv-slice handler.\n */\nexport function getCLIHandler(\n config: CLIConfig = {},\n context: CLIContext = {},\n) {\n const generator = new CLIGenerator(config, context);\n return generator.generateHandler();\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @smrt/core generators - Create REST APIs and MCP servers from SMRT objects
|
|
3
|
+
*/
|
|
4
|
+
export type { CLIConfig, CLIContext } from './cli';
|
|
5
|
+
export { CLIGenerator, getCLIHandler, setupCLI } from './cli';
|
|
6
|
+
export type { MCPConfig, MCPContext, MCPRequest, MCPResponse, MCPTool, } from './mcp';
|
|
7
|
+
export { MCPGenerator } from './mcp';
|
|
8
|
+
export type { APIConfig, APIContext, RestServerConfig } from './rest';
|
|
9
|
+
export { APIGenerator, createRestServer, startRestServer } from './rest';
|
|
10
|
+
export type { OpenAPIConfig } from './swagger';
|
|
11
|
+
export { generateOpenAPISpec, setupSwaggerUI, } from './swagger';
|
|
12
|
+
export { runWithTenantGate, setTenantEntryPointRunner, type TenantEntryPointRunner, type TenantGateOptions, } from './tenant-gate';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generators/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC9D,YAAY,EACV,SAAS,EACT,UAAU,EACV,UAAU,EACV,WAAW,EACX,OAAO,GACR,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAEtE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACzE,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,EACL,mBAAmB,EACnB,cAAc,GACf,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,GACvB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { MCPConfig, MCPContext } from './mcp.js';
|
|
2
|
+
export interface RuntimeOptions {
|
|
3
|
+
/** Server name (defaults to package name) */
|
|
4
|
+
name?: string;
|
|
5
|
+
/** Server version (defaults to package version) */
|
|
6
|
+
version?: string;
|
|
7
|
+
/** Server description */
|
|
8
|
+
description?: string;
|
|
9
|
+
/** MCP generator configuration */
|
|
10
|
+
config?: MCPConfig;
|
|
11
|
+
/** MCP context (database, AI client, etc.) */
|
|
12
|
+
context?: MCPContext;
|
|
13
|
+
/** Enable debug logging */
|
|
14
|
+
debug?: boolean;
|
|
15
|
+
/** Static tool definitions (generated at build time) */
|
|
16
|
+
tools?: Array<{
|
|
17
|
+
name: string;
|
|
18
|
+
description: string;
|
|
19
|
+
inputSchema: any;
|
|
20
|
+
}>;
|
|
21
|
+
/**
|
|
22
|
+
* Lowercased simple names of objects that are `@TenantScoped` (#1554). When
|
|
23
|
+
* non-empty, the generated server imports the tenancy fail-closed gate and
|
|
24
|
+
* wraps tenant-scoped tool calls so a stdio invocation cannot read across all
|
|
25
|
+
* tenants. The tenant is sourced from `SMRT_MCP_TENANT_ID` /
|
|
26
|
+
* `SMRT_MCP_ALLOW_CROSS_TENANT` env vars (this server has no auth principal).
|
|
27
|
+
*/
|
|
28
|
+
tenantScopedObjects?: string[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Generate runtime bootstrap code for MCP server
|
|
32
|
+
*
|
|
33
|
+
* @param options - Runtime configuration options
|
|
34
|
+
* @returns TypeScript code for server entry point
|
|
35
|
+
*/
|
|
36
|
+
export declare function generateRuntimeBootstrap(options?: RuntimeOptions): string;
|
|
37
|
+
/**
|
|
38
|
+
* Generate package.json script for running MCP server
|
|
39
|
+
*
|
|
40
|
+
* @param serverPath - Path to generated server file (relative to package root)
|
|
41
|
+
* @returns Script command for package.json
|
|
42
|
+
*/
|
|
43
|
+
export declare function generateMCPScript(serverPath?: string): string;
|
|
44
|
+
/**
|
|
45
|
+
* Generate Claude Desktop configuration example
|
|
46
|
+
*
|
|
47
|
+
* @param serverName - Name for the MCP server
|
|
48
|
+
* @param serverPath - Absolute path to server file
|
|
49
|
+
* @returns Configuration object for claude_desktop_config.json
|
|
50
|
+
*/
|
|
51
|
+
export declare function generateClaudeConfig(serverName: string, serverPath: string): object;
|
|
52
|
+
/**
|
|
53
|
+
* Generate README documentation for MCP server setup
|
|
54
|
+
*
|
|
55
|
+
* @param serverName - Name of the MCP server
|
|
56
|
+
* @param serverPath - Path to the server file
|
|
57
|
+
* @returns Markdown documentation
|
|
58
|
+
*/
|
|
59
|
+
export declare function generateMCPDocumentation(serverName: string, serverPath: string): string;
|
|
60
|
+
//# sourceMappingURL=mcp-runtime-template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-runtime-template.d.ts","sourceRoot":"","sources":["../../src/generators/mcp-runtime-template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAStD,MAAM,WAAW,cAAc;IAC7B,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,kCAAkC;IAClC,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,UAAU,CAAC;IAErB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,wDAAwD;IACxD,KAAK,CAAC,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,GAAG,CAAC;KAClB,CAAC,CAAC;IAEH;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,cAAmB,GAAG,MAAM,CAyZ7E;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,GAAE,MAA6B,GACxC,MAAM,CAER;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,MAAM,CASR;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,MAAM,CA0GR"}
|