@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,142 @@
|
|
|
1
|
+
import { createLogger } from "@happyvertical/logger";
|
|
2
|
+
import { ValidationError, RuntimeError } from "../errors.js";
|
|
3
|
+
const logger = createLogger({ level: "info" });
|
|
4
|
+
function validateToolCall(methodName, args, allowedMethods) {
|
|
5
|
+
if (!allowedMethods.includes(methodName)) {
|
|
6
|
+
throw ValidationError.invalidValue(
|
|
7
|
+
"methodName",
|
|
8
|
+
methodName,
|
|
9
|
+
`Method must be one of: ${allowedMethods.join(", ")}`
|
|
10
|
+
);
|
|
11
|
+
}
|
|
12
|
+
if (typeof args !== "object" || args === null) {
|
|
13
|
+
throw ValidationError.invalidValue(
|
|
14
|
+
"arguments",
|
|
15
|
+
args,
|
|
16
|
+
"Arguments must be a valid object"
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async function executeToolCall(instance, toolCall, allowedMethods, signalBus) {
|
|
21
|
+
const startTime = Date.now();
|
|
22
|
+
const methodName = toolCall.function.name;
|
|
23
|
+
const executionId = signalBus?.generateExecutionId() ?? toolCall.id;
|
|
24
|
+
let args;
|
|
25
|
+
try {
|
|
26
|
+
try {
|
|
27
|
+
args = JSON.parse(toolCall.function.arguments);
|
|
28
|
+
} catch (_parseError) {
|
|
29
|
+
throw ValidationError.invalidValue(
|
|
30
|
+
"arguments",
|
|
31
|
+
toolCall.function.arguments,
|
|
32
|
+
"Arguments must be valid JSON"
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
if (!args) {
|
|
36
|
+
throw ValidationError.invalidValue(
|
|
37
|
+
"arguments",
|
|
38
|
+
toolCall.function.arguments,
|
|
39
|
+
"Arguments must be a valid object"
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
validateToolCall(methodName, args, allowedMethods);
|
|
43
|
+
if (typeof instance[methodName] !== "function") {
|
|
44
|
+
throw RuntimeError.operationFailed(
|
|
45
|
+
`Method '${methodName}' not found on object`
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
if (signalBus) {
|
|
49
|
+
const startSignal = {
|
|
50
|
+
id: executionId,
|
|
51
|
+
objectId: instance.id ?? "unknown",
|
|
52
|
+
className: instance.constructor?.name ?? "Unknown",
|
|
53
|
+
method: methodName,
|
|
54
|
+
type: "start",
|
|
55
|
+
args: [args],
|
|
56
|
+
// Wrap in array for consistency
|
|
57
|
+
timestamp: /* @__PURE__ */ new Date()
|
|
58
|
+
};
|
|
59
|
+
await signalBus.emit(startSignal);
|
|
60
|
+
}
|
|
61
|
+
const result = await instance[methodName](args);
|
|
62
|
+
if (signalBus) {
|
|
63
|
+
const endSignal = {
|
|
64
|
+
id: executionId,
|
|
65
|
+
objectId: instance.id ?? "unknown",
|
|
66
|
+
className: instance.constructor?.name ?? "Unknown",
|
|
67
|
+
method: methodName,
|
|
68
|
+
type: "end",
|
|
69
|
+
args: [args],
|
|
70
|
+
result,
|
|
71
|
+
duration: Date.now() - startTime,
|
|
72
|
+
timestamp: /* @__PURE__ */ new Date()
|
|
73
|
+
};
|
|
74
|
+
await signalBus.emit(endSignal);
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
id: toolCall.id,
|
|
78
|
+
methodName,
|
|
79
|
+
arguments: args,
|
|
80
|
+
result,
|
|
81
|
+
success: true,
|
|
82
|
+
duration: Date.now() - startTime
|
|
83
|
+
};
|
|
84
|
+
} catch (error) {
|
|
85
|
+
if (signalBus) {
|
|
86
|
+
const errorSignal = {
|
|
87
|
+
id: executionId,
|
|
88
|
+
objectId: instance.id ?? "unknown",
|
|
89
|
+
className: instance.constructor?.name ?? "Unknown",
|
|
90
|
+
method: methodName,
|
|
91
|
+
type: "error",
|
|
92
|
+
// Preserve actual args if parsed, otherwise include raw arguments for debugging
|
|
93
|
+
args: [
|
|
94
|
+
typeof args !== "undefined" ? args : toolCall.function.arguments
|
|
95
|
+
],
|
|
96
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
97
|
+
duration: Date.now() - startTime,
|
|
98
|
+
timestamp: /* @__PURE__ */ new Date()
|
|
99
|
+
};
|
|
100
|
+
await signalBus.emit(errorSignal);
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
id: toolCall.id,
|
|
104
|
+
methodName,
|
|
105
|
+
arguments: {},
|
|
106
|
+
result: null,
|
|
107
|
+
success: false,
|
|
108
|
+
error: error instanceof Error ? error.message : String(error),
|
|
109
|
+
duration: Date.now() - startTime
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async function executeToolCalls(instance, toolCalls, allowedMethods, signalBus) {
|
|
114
|
+
const results = [];
|
|
115
|
+
for (const toolCall of toolCalls) {
|
|
116
|
+
const result = await executeToolCall(
|
|
117
|
+
instance,
|
|
118
|
+
toolCall,
|
|
119
|
+
allowedMethods,
|
|
120
|
+
signalBus
|
|
121
|
+
);
|
|
122
|
+
results.push(result);
|
|
123
|
+
if (!result.success) {
|
|
124
|
+
logger.warn(`Tool call failed for ${result.methodName}: ${result.error}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return results;
|
|
128
|
+
}
|
|
129
|
+
function formatToolResults(results) {
|
|
130
|
+
return results.map((result) => ({
|
|
131
|
+
role: "tool",
|
|
132
|
+
tool_call_id: result.id,
|
|
133
|
+
content: result.success ? JSON.stringify(result.result) : `Error: ${result.error}`
|
|
134
|
+
}));
|
|
135
|
+
}
|
|
136
|
+
export {
|
|
137
|
+
executeToolCall,
|
|
138
|
+
executeToolCalls,
|
|
139
|
+
formatToolResults,
|
|
140
|
+
validateToolCall
|
|
141
|
+
};
|
|
142
|
+
//# sourceMappingURL=tool-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-executor.js","sources":["../../src/tools/tool-executor.ts"],"sourcesContent":["/**\n * Tool Call Execution for AI Function Calling\n *\n * This module handles runtime execution of AI tool calls on SMRT object instances.\n */\n\nimport { createLogger } from '@happyvertical/logger';\nimport type { Signal } from '@happyvertical/smrt-types';\nimport { RuntimeError, ValidationError } from '../errors.js';\nimport type { SignalBus } from '../signals/bus.js';\n\nconst logger = createLogger({ level: 'info' });\n\n/**\n * Tool call structure from AI response\n */\nexport interface ToolCall {\n /**\n * Unique identifier for this tool call\n */\n id: string;\n\n /**\n * Type of tool (always 'function' for now)\n */\n type: 'function';\n\n /**\n * Function details\n */\n function: {\n /**\n * Name of the method to call\n */\n name: string;\n\n /**\n * JSON string of arguments to pass to the method\n */\n arguments: string;\n };\n}\n\n/**\n * Result of executing a tool call\n */\nexport interface ToolCallResult {\n /**\n * Tool call ID for correlation\n */\n id: string;\n\n /**\n * Method name that was called\n */\n methodName: string;\n\n /**\n * Parsed arguments that were used\n */\n arguments: Record<string, any>;\n\n /**\n * Result returned from the method\n */\n result: any;\n\n /**\n * Whether the call succeeded\n */\n success: boolean;\n\n /**\n * Error message if call failed\n */\n error?: string;\n\n /**\n * Execution time in milliseconds\n */\n duration?: number;\n}\n\n/**\n * Validates tool call arguments against method parameters\n *\n * @param methodName - Name of the method being called\n * @param args - Parsed arguments from tool call\n * @param allowedMethods - List of methods AI is allowed to call\n * @throws ValidationError if method not allowed or arguments invalid\n */\nexport function validateToolCall(\n methodName: string,\n args: Record<string, any>,\n allowedMethods: string[],\n): void {\n // Check if method is allowed\n if (!allowedMethods.includes(methodName)) {\n throw ValidationError.invalidValue(\n 'methodName',\n methodName,\n `Method must be one of: ${allowedMethods.join(', ')}`,\n );\n }\n\n // Basic argument validation (could be enhanced)\n if (typeof args !== 'object' || args === null) {\n throw ValidationError.invalidValue(\n 'arguments',\n args,\n 'Arguments must be a valid object',\n );\n }\n}\n\n/**\n * Executes a tool call on an object instance\n *\n * @param instance - Object instance to call method on\n * @param toolCall - Tool call from AI\n * @param allowedMethods - List of methods AI is allowed to call\n * @param signalBus - Optional signal bus for emitting execution events\n * @returns Result of the tool call execution\n */\nexport async function executeToolCall(\n instance: any,\n toolCall: ToolCall,\n allowedMethods: string[],\n signalBus?: SignalBus,\n): Promise<ToolCallResult> {\n const startTime = Date.now();\n const methodName = toolCall.function.name;\n const executionId = signalBus?.generateExecutionId() ?? toolCall.id;\n\n // Declare args outside try blocks so it's accessible in catch block\n let args: Record<string, any> | undefined;\n\n try {\n // Parse arguments\n try {\n args = JSON.parse(toolCall.function.arguments);\n } catch (_parseError) {\n throw ValidationError.invalidValue(\n 'arguments',\n toolCall.function.arguments,\n 'Arguments must be valid JSON',\n );\n }\n\n // Type guard - args is always defined after successful parsing\n if (!args) {\n throw ValidationError.invalidValue(\n 'arguments',\n toolCall.function.arguments,\n 'Arguments must be a valid object',\n );\n }\n\n // Validate tool call\n validateToolCall(methodName, args, allowedMethods);\n\n // Check method exists\n if (typeof instance[methodName] !== 'function') {\n throw RuntimeError.operationFailed(\n `Method '${methodName}' not found on object`,\n );\n }\n\n // Emit start signal\n if (signalBus) {\n const startSignal: Signal = {\n id: executionId,\n objectId: instance.id ?? 'unknown',\n className: instance.constructor?.name ?? 'Unknown',\n method: methodName,\n type: 'start',\n args: [args], // Wrap in array for consistency\n timestamp: new Date(),\n };\n await signalBus.emit(startSignal);\n }\n\n // Execute method\n const result = await instance[methodName](args);\n\n // Emit end signal\n if (signalBus) {\n const endSignal: Signal = {\n id: executionId,\n objectId: instance.id ?? 'unknown',\n className: instance.constructor?.name ?? 'Unknown',\n method: methodName,\n type: 'end',\n args: [args],\n result,\n duration: Date.now() - startTime,\n timestamp: new Date(),\n };\n await signalBus.emit(endSignal);\n }\n\n return {\n id: toolCall.id,\n methodName,\n arguments: args,\n result,\n success: true,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n // Emit error signal\n if (signalBus) {\n const errorSignal: Signal = {\n id: executionId,\n objectId: instance.id ?? 'unknown',\n className: instance.constructor?.name ?? 'Unknown',\n method: methodName,\n type: 'error',\n // Preserve actual args if parsed, otherwise include raw arguments for debugging\n args: [\n typeof args !== 'undefined' ? args : toolCall.function.arguments,\n ],\n error: error instanceof Error ? error : new Error(String(error)),\n duration: Date.now() - startTime,\n timestamp: new Date(),\n };\n await signalBus.emit(errorSignal);\n }\n\n return {\n id: toolCall.id,\n methodName,\n arguments: {},\n result: null,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\n/**\n * Executes multiple tool calls in sequence\n *\n * @param instance - Object instance to call methods on\n * @param toolCalls - Array of tool calls from AI\n * @param allowedMethods - List of methods AI is allowed to call\n * @param signalBus - Optional signal bus for emitting execution events\n * @returns Array of tool call results\n */\nexport async function executeToolCalls(\n instance: any,\n toolCalls: ToolCall[],\n allowedMethods: string[],\n signalBus?: SignalBus,\n): Promise<ToolCallResult[]> {\n const results: ToolCallResult[] = [];\n\n for (const toolCall of toolCalls) {\n const result = await executeToolCall(\n instance,\n toolCall,\n allowedMethods,\n signalBus,\n );\n results.push(result);\n\n // Stop on first error if needed\n if (!result.success) {\n logger.warn(`Tool call failed for ${result.methodName}: ${result.error}`);\n // Continue executing other tools (don't break)\n }\n }\n\n return results;\n}\n\n/**\n * Formats tool call results into messages for AI\n *\n * @param results - Tool call execution results\n * @returns Array of tool response messages\n */\nexport function formatToolResults(\n results: ToolCallResult[],\n): Array<{ role: 'tool'; tool_call_id: string; content: string }> {\n return results.map((result) => ({\n role: 'tool' as const,\n tool_call_id: result.id,\n content: result.success\n ? JSON.stringify(result.result)\n : `Error: ${result.error}`,\n }));\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { AITool } from '@happyvertical/ai';
|
|
2
|
+
import { MethodDefinition } from '../scanner/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Configuration for AI-callable methods
|
|
5
|
+
*/
|
|
6
|
+
export interface AiConfig {
|
|
7
|
+
/**
|
|
8
|
+
* Methods that AI can call
|
|
9
|
+
* - Array of method names, e.g., ['analyze', 'validate']
|
|
10
|
+
* - 'public-async' to auto-include all public async methods
|
|
11
|
+
* - 'all' to include all methods (not recommended)
|
|
12
|
+
*/
|
|
13
|
+
callable?: string[] | 'public-async' | 'all';
|
|
14
|
+
/**
|
|
15
|
+
* Methods to exclude from AI calling (higher priority than callable)
|
|
16
|
+
*/
|
|
17
|
+
exclude?: string[];
|
|
18
|
+
/**
|
|
19
|
+
* Additional tool descriptions to override method JSDoc
|
|
20
|
+
*/
|
|
21
|
+
descriptions?: Record<string, string>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Converts a TypeScript type string to JSON Schema format
|
|
25
|
+
*
|
|
26
|
+
* @param tsType - TypeScript type string (e.g., 'string', 'number', '{ foo: string }')
|
|
27
|
+
* @returns JSON Schema representation
|
|
28
|
+
*/
|
|
29
|
+
export declare function convertTypeToJsonSchema(tsType: string): Record<string, any>;
|
|
30
|
+
/**
|
|
31
|
+
* Determines if a method should be included as an AI-callable tool
|
|
32
|
+
*
|
|
33
|
+
* @param method - Method definition from AST scanner
|
|
34
|
+
* @param config - AI configuration from @smrt decorator
|
|
35
|
+
* @returns True if method should be callable by AI
|
|
36
|
+
*/
|
|
37
|
+
export declare function shouldIncludeMethod(method: MethodDefinition, config?: AiConfig): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Generates an AITool definition from a method definition
|
|
40
|
+
*
|
|
41
|
+
* @param method - Method definition from AST scanner
|
|
42
|
+
* @param config - AI configuration for custom descriptions
|
|
43
|
+
* @returns AITool definition for LLM function calling
|
|
44
|
+
*/
|
|
45
|
+
export declare function generateToolFromMethod(method: MethodDefinition, config?: AiConfig): AITool;
|
|
46
|
+
/**
|
|
47
|
+
* Generates tool manifest from method definitions
|
|
48
|
+
*
|
|
49
|
+
* @param methods - Array of method definitions from AST scanner
|
|
50
|
+
* @param config - AI configuration from @smrt decorator
|
|
51
|
+
* @returns Array of AITool definitions for LLM function calling
|
|
52
|
+
*/
|
|
53
|
+
export declare function generateToolManifest(methods: MethodDefinition[], config?: AiConfig): AITool[];
|
|
54
|
+
//# sourceMappingURL=tool-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-generator.d.ts","sourceRoot":"","sources":["../../src/tools/tool-generator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,cAAc,GAAG,KAAK,CAAC;IAE7C;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAqE3E;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,gBAAgB,EACxB,MAAM,CAAC,EAAE,QAAQ,GAChB,OAAO,CAqCT;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,gBAAgB,EACxB,MAAM,CAAC,EAAE,QAAQ,GAChB,MAAM,CA0CR;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,gBAAgB,EAAE,EAC3B,MAAM,CAAC,EAAE,QAAQ,GAChB,MAAM,EAAE,CAWV"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
function convertTypeToJsonSchema(tsType) {
|
|
2
|
+
const cleanType = tsType.trim();
|
|
3
|
+
if (cleanType === "string") {
|
|
4
|
+
return { type: "string" };
|
|
5
|
+
}
|
|
6
|
+
if (cleanType === "number") {
|
|
7
|
+
return { type: "number" };
|
|
8
|
+
}
|
|
9
|
+
if (cleanType === "boolean") {
|
|
10
|
+
return { type: "boolean" };
|
|
11
|
+
}
|
|
12
|
+
if (cleanType === "null") {
|
|
13
|
+
return { type: "null" };
|
|
14
|
+
}
|
|
15
|
+
if (cleanType === "any" || cleanType === "unknown") {
|
|
16
|
+
return {};
|
|
17
|
+
}
|
|
18
|
+
if (cleanType.endsWith("[]")) {
|
|
19
|
+
const itemType = cleanType.slice(0, -2);
|
|
20
|
+
return {
|
|
21
|
+
type: "array",
|
|
22
|
+
items: convertTypeToJsonSchema(itemType)
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const arrayMatch = cleanType.match(/^Array<(.+)>$/);
|
|
26
|
+
if (arrayMatch) {
|
|
27
|
+
return {
|
|
28
|
+
type: "array",
|
|
29
|
+
items: convertTypeToJsonSchema(arrayMatch[1])
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
if (cleanType.includes("|")) {
|
|
33
|
+
const options = cleanType.split("|").map((s) => s.trim());
|
|
34
|
+
if (options.every((opt) => opt.startsWith("'") && opt.endsWith("'"))) {
|
|
35
|
+
return {
|
|
36
|
+
type: "string",
|
|
37
|
+
enum: options.map((opt) => opt.slice(1, -1))
|
|
38
|
+
// Remove quotes
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
oneOf: options.map(convertTypeToJsonSchema)
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
if (cleanType.startsWith("{") && cleanType.endsWith("}")) {
|
|
46
|
+
return { type: "object" };
|
|
47
|
+
}
|
|
48
|
+
if (cleanType.startsWith("Record<")) {
|
|
49
|
+
return { type: "object" };
|
|
50
|
+
}
|
|
51
|
+
return { type: "string", description: `TypeScript type: ${cleanType}` };
|
|
52
|
+
}
|
|
53
|
+
function shouldIncludeMethod(method, config) {
|
|
54
|
+
if (!config || !config.callable) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
if (config.exclude?.includes(method.name)) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
if (!method.isPublic) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
if (method.isStatic) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
if (config.callable === "all") {
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
if (config.callable === "public-async") {
|
|
70
|
+
return method.async;
|
|
71
|
+
}
|
|
72
|
+
if (Array.isArray(config.callable)) {
|
|
73
|
+
return config.callable.includes(method.name);
|
|
74
|
+
}
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
function generateToolFromMethod(method, config) {
|
|
78
|
+
const parameters = {
|
|
79
|
+
type: "object",
|
|
80
|
+
properties: {},
|
|
81
|
+
required: []
|
|
82
|
+
};
|
|
83
|
+
for (const param of method.parameters) {
|
|
84
|
+
parameters.properties[param.name] = convertTypeToJsonSchema(param.type);
|
|
85
|
+
if (!param.optional) {
|
|
86
|
+
parameters.required.push(param.name);
|
|
87
|
+
}
|
|
88
|
+
if (param.default !== void 0) {
|
|
89
|
+
parameters.properties[param.name].default = param.default;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (parameters.required.length === 0) {
|
|
93
|
+
delete parameters.required;
|
|
94
|
+
}
|
|
95
|
+
const description = config?.descriptions?.[method.name] || method.description || `Call the ${method.name} method`;
|
|
96
|
+
return {
|
|
97
|
+
type: "function",
|
|
98
|
+
function: {
|
|
99
|
+
name: method.name,
|
|
100
|
+
description,
|
|
101
|
+
parameters
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function generateToolManifest(methods, config) {
|
|
106
|
+
const tools = [];
|
|
107
|
+
for (const method of methods) {
|
|
108
|
+
if (shouldIncludeMethod(method, config)) {
|
|
109
|
+
const tool = generateToolFromMethod(method, config);
|
|
110
|
+
tools.push(tool);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return tools;
|
|
114
|
+
}
|
|
115
|
+
export {
|
|
116
|
+
convertTypeToJsonSchema,
|
|
117
|
+
generateToolFromMethod,
|
|
118
|
+
generateToolManifest,
|
|
119
|
+
shouldIncludeMethod
|
|
120
|
+
};
|
|
121
|
+
//# sourceMappingURL=tool-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-generator.js","sources":["../../src/tools/tool-generator.ts"],"sourcesContent":["/**\n * Tool Manifest Generation for AI Function Calling\n *\n * This module converts TypeScript method definitions from the AST scanner\n * into AI tool format at build time for use with LLM function calling.\n */\n\nimport type { AITool } from '@happyvertical/ai';\nimport type { MethodDefinition } from '../scanner/types.js';\n\n/**\n * Configuration for AI-callable methods\n */\nexport interface AiConfig {\n /**\n * Methods that AI can call\n * - Array of method names, e.g., ['analyze', 'validate']\n * - 'public-async' to auto-include all public async methods\n * - 'all' to include all methods (not recommended)\n */\n callable?: string[] | 'public-async' | 'all';\n\n /**\n * Methods to exclude from AI calling (higher priority than callable)\n */\n exclude?: string[];\n\n /**\n * Additional tool descriptions to override method JSDoc\n */\n descriptions?: Record<string, string>;\n}\n\n/**\n * Converts a TypeScript type string to JSON Schema format\n *\n * @param tsType - TypeScript type string (e.g., 'string', 'number', '{ foo: string }')\n * @returns JSON Schema representation\n */\nexport function convertTypeToJsonSchema(tsType: string): Record<string, any> {\n // Remove whitespace\n const cleanType = tsType.trim();\n\n // Primitive types\n if (cleanType === 'string') {\n return { type: 'string' };\n }\n if (cleanType === 'number') {\n return { type: 'number' };\n }\n if (cleanType === 'boolean') {\n return { type: 'boolean' };\n }\n if (cleanType === 'null') {\n return { type: 'null' };\n }\n if (cleanType === 'any' || cleanType === 'unknown') {\n return {}; // No type constraint\n }\n\n // Array types\n if (cleanType.endsWith('[]')) {\n const itemType = cleanType.slice(0, -2);\n return {\n type: 'array',\n items: convertTypeToJsonSchema(itemType),\n };\n }\n\n // Array<T> syntax\n const arrayMatch = cleanType.match(/^Array<(.+)>$/);\n if (arrayMatch) {\n return {\n type: 'array',\n items: convertTypeToJsonSchema(arrayMatch[1]),\n };\n }\n\n // Union types with literal values (e.g., 'shallow' | 'deep')\n if (cleanType.includes('|')) {\n const options = cleanType.split('|').map((s) => s.trim());\n\n // Check if all options are string literals\n if (options.every((opt) => opt.startsWith(\"'\") && opt.endsWith(\"'\"))) {\n return {\n type: 'string',\n enum: options.map((opt) => opt.slice(1, -1)), // Remove quotes\n };\n }\n\n // Mixed union - use oneOf\n return {\n oneOf: options.map(convertTypeToJsonSchema),\n };\n }\n\n // Object types - basic support\n if (cleanType.startsWith('{') && cleanType.endsWith('}')) {\n return { type: 'object' };\n }\n\n // Record<string, any> and similar\n if (cleanType.startsWith('Record<')) {\n return { type: 'object' };\n }\n\n // Default fallback\n return { type: 'string', description: `TypeScript type: ${cleanType}` };\n}\n\n/**\n * Determines if a method should be included as an AI-callable tool\n *\n * @param method - Method definition from AST scanner\n * @param config - AI configuration from @smrt decorator\n * @returns True if method should be callable by AI\n */\nexport function shouldIncludeMethod(\n method: MethodDefinition,\n config?: AiConfig,\n): boolean {\n // Skip if no AI config\n if (!config || !config.callable) {\n return false;\n }\n\n // Check exclusions first (higher priority)\n if (config.exclude?.includes(method.name)) {\n return false;\n }\n\n // Skip private methods always\n if (!method.isPublic) {\n return false;\n }\n\n // Skip static methods (tools operate on instances)\n if (method.isStatic) {\n return false;\n }\n\n // Handle 'all' mode\n if (config.callable === 'all') {\n return true;\n }\n\n // Handle 'public-async' mode\n if (config.callable === 'public-async') {\n return method.async;\n }\n\n // Handle explicit array of method names\n if (Array.isArray(config.callable)) {\n return config.callable.includes(method.name);\n }\n\n return false;\n}\n\n/**\n * Generates an AITool definition from a method definition\n *\n * @param method - Method definition from AST scanner\n * @param config - AI configuration for custom descriptions\n * @returns AITool definition for LLM function calling\n */\nexport function generateToolFromMethod(\n method: MethodDefinition,\n config?: AiConfig,\n): AITool {\n // Build parameters JSON Schema\n const parameters: Record<string, any> = {\n type: 'object',\n properties: {},\n required: [],\n };\n\n for (const param of method.parameters) {\n // Convert parameter type to JSON Schema\n parameters.properties[param.name] = convertTypeToJsonSchema(param.type);\n\n // Add to required if not optional\n if (!param.optional) {\n parameters.required.push(param.name);\n }\n\n // Add default value if present\n if (param.default !== undefined) {\n parameters.properties[param.name].default = param.default;\n }\n }\n\n // Remove empty required array\n if (parameters.required.length === 0) {\n delete parameters.required;\n }\n\n // Get description (custom override or from JSDoc)\n const description =\n config?.descriptions?.[method.name] ||\n method.description ||\n `Call the ${method.name} method`;\n\n return {\n type: 'function',\n function: {\n name: method.name,\n description,\n parameters,\n },\n };\n}\n\n/**\n * Generates tool manifest from method definitions\n *\n * @param methods - Array of method definitions from AST scanner\n * @param config - AI configuration from @smrt decorator\n * @returns Array of AITool definitions for LLM function calling\n */\nexport function generateToolManifest(\n methods: MethodDefinition[],\n config?: AiConfig,\n): AITool[] {\n const tools: AITool[] = [];\n\n for (const method of methods) {\n if (shouldIncludeMethod(method, config)) {\n const tool = generateToolFromMethod(method, config);\n tools.push(tool);\n }\n }\n\n return tools;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helpers for capping `IN (?, ?, ...)` placeholder lists so a single
|
|
3
|
+
* query never exceeds the backend's bind-variable limit.
|
|
4
|
+
*
|
|
5
|
+
* Used by the relationship/junction loaders in `collection.ts` and by the
|
|
6
|
+
* BFS frontier in `SmrtHierarchical.getDescendants()` — any code path that
|
|
7
|
+
* expands an unbounded array of ids into one `column IN (...)` clause.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Maximum size of an `IN (?, ?, ...)` placeholder list per query.
|
|
11
|
+
*
|
|
12
|
+
* `SQLITE_MAX_VARIABLE_NUMBER` is 999 on SQLite builds older than 3.32 and
|
|
13
|
+
* 32766 on newer ones; Postgres allows up to 65535 bind parameters. Capping
|
|
14
|
+
* at a conservative 900 stays under the legacy SQLite limit AND keeps planner
|
|
15
|
+
* time predictable across every backend, so callers don't have to know which
|
|
16
|
+
* build they're talking to. Exceeding the cap throws
|
|
17
|
+
* `SQLITE_RANGE: bind or column index out of range` (or
|
|
18
|
+
* `SQLITE_ERROR: too many SQL variables`) before the query runs, which is why
|
|
19
|
+
* every loader that builds an IN-list from caller- or data-sized arrays must
|
|
20
|
+
* chunk through this value.
|
|
21
|
+
*/
|
|
22
|
+
export declare const IN_LIST_CHUNK_SIZE = 900;
|
|
23
|
+
/**
|
|
24
|
+
* Split `items` into contiguous batches of at most `size` elements.
|
|
25
|
+
*
|
|
26
|
+
* - Empty input yields `[]` (no empty batch).
|
|
27
|
+
* - A non-positive `size` is treated as "no chunking" and returns a single
|
|
28
|
+
* batch containing every item, matching the previous inline behavior in
|
|
29
|
+
* `collection.ts`.
|
|
30
|
+
*/
|
|
31
|
+
export declare function chunkArray<T>(items: T[], size: number): T[][];
|
|
32
|
+
//# sourceMappingURL=chunk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk.d.ts","sourceRoot":"","sources":["../../src/utils/chunk.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,EAAE,CAQ7D"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const IN_LIST_CHUNK_SIZE = 900;
|
|
2
|
+
function chunkArray(items, size) {
|
|
3
|
+
if (items.length === 0) return [];
|
|
4
|
+
const chunks = [];
|
|
5
|
+
for (let i = 0; i < items.length; i += size) {
|
|
6
|
+
chunks.push(items.slice(i, i + size));
|
|
7
|
+
}
|
|
8
|
+
return chunks;
|
|
9
|
+
}
|
|
10
|
+
export {
|
|
11
|
+
IN_LIST_CHUNK_SIZE,
|
|
12
|
+
chunkArray
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk.js","sources":["../../src/utils/chunk.ts"],"sourcesContent":["/**\n * Shared helpers for capping `IN (?, ?, ...)` placeholder lists so a single\n * query never exceeds the backend's bind-variable limit.\n *\n * Used by the relationship/junction loaders in `collection.ts` and by the\n * BFS frontier in `SmrtHierarchical.getDescendants()` — any code path that\n * expands an unbounded array of ids into one `column IN (...)` clause.\n */\n\n/**\n * Maximum size of an `IN (?, ?, ...)` placeholder list per query.\n *\n * `SQLITE_MAX_VARIABLE_NUMBER` is 999 on SQLite builds older than 3.32 and\n * 32766 on newer ones; Postgres allows up to 65535 bind parameters. Capping\n * at a conservative 900 stays under the legacy SQLite limit AND keeps planner\n * time predictable across every backend, so callers don't have to know which\n * build they're talking to. Exceeding the cap throws\n * `SQLITE_RANGE: bind or column index out of range` (or\n * `SQLITE_ERROR: too many SQL variables`) before the query runs, which is why\n * every loader that builds an IN-list from caller- or data-sized arrays must\n * chunk through this value.\n */\nexport const IN_LIST_CHUNK_SIZE = 900;\n\n/**\n * Split `items` into contiguous batches of at most `size` elements.\n *\n * - Empty input yields `[]` (no empty batch).\n * - A non-positive `size` is treated as \"no chunking\" and returns a single\n * batch containing every item, matching the previous inline behavior in\n * `collection.ts`.\n */\nexport function chunkArray<T>(items: T[], size: number): T[][] {\n if (items.length === 0) return [];\n if (size <= 0) return [items];\n const chunks: T[][] = [];\n for (let i = 0; i < items.length; i += size) {\n chunks.push(items.slice(i, i + size));\n }\n return chunks;\n}\n"],"names":[],"mappings":"AAsBO,MAAM,qBAAqB;AAU3B,SAAS,WAAc,OAAY,MAAqB;AAC7D,MAAI,MAAM,WAAW,EAAG,QAAO,CAAA;AAE/B,QAAM,SAAgB,CAAA;AACtB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,MAAM;AAC3C,WAAO,KAAK,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC;AAAA,EACtC;AACA,SAAO;AACT;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface ImportWorkspaceModuleOptions {
|
|
2
|
+
packageName: string;
|
|
3
|
+
sourceEntry: string;
|
|
4
|
+
distEntry?: string;
|
|
5
|
+
purpose: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function importWorkspaceModule<T = unknown>({ packageName, sourceEntry, distEntry, purpose, }: ImportWorkspaceModuleOptions): Promise<T>;
|
|
8
|
+
//# sourceMappingURL=import-workspace-module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-workspace-module.d.ts","sourceRoot":"","sources":["../../src/utils/import-workspace-module.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAsBD,wBAAsB,qBAAqB,CAAC,CAAC,GAAG,OAAO,EAAE,EACvD,WAAW,EACX,WAAW,EACX,SAAS,EACT,OAAO,GACR,EAAE,4BAA4B,GAAG,OAAO,CAAC,CAAC,CAAC,CAmD3C"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { join, dirname } from "node:path";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
function findWorkspaceRoot(startDir) {
|
|
5
|
+
let current = startDir;
|
|
6
|
+
while (true) {
|
|
7
|
+
if (existsSync(join(current, "pnpm-workspace.yaml"))) {
|
|
8
|
+
return current;
|
|
9
|
+
}
|
|
10
|
+
const parent = dirname(current);
|
|
11
|
+
if (parent === current) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
current = parent;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function resolveInstalledPackage(packageName) {
|
|
18
|
+
return import.meta.resolve(packageName);
|
|
19
|
+
}
|
|
20
|
+
async function importWorkspaceModule({
|
|
21
|
+
packageName,
|
|
22
|
+
sourceEntry,
|
|
23
|
+
distEntry,
|
|
24
|
+
purpose
|
|
25
|
+
}) {
|
|
26
|
+
try {
|
|
27
|
+
return await import(
|
|
28
|
+
/* @vite-ignore */
|
|
29
|
+
resolveInstalledPackage(packageName)
|
|
30
|
+
);
|
|
31
|
+
} catch (originalError) {
|
|
32
|
+
const workspaceRoot = findWorkspaceRoot(process.cwd());
|
|
33
|
+
if (!workspaceRoot) {
|
|
34
|
+
throw originalError;
|
|
35
|
+
}
|
|
36
|
+
if (distEntry) {
|
|
37
|
+
const distPath = join(workspaceRoot, distEntry);
|
|
38
|
+
if (existsSync(distPath)) {
|
|
39
|
+
return await import(
|
|
40
|
+
/* @vite-ignore */
|
|
41
|
+
pathToFileURL(distPath).href
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const sourcePath = join(workspaceRoot, sourceEntry);
|
|
46
|
+
if (!existsSync(sourcePath)) {
|
|
47
|
+
throw new Error(
|
|
48
|
+
`Failed to load ${packageName} for ${purpose}: could not find ${sourcePath}.`
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
let tsxApiPath;
|
|
52
|
+
try {
|
|
53
|
+
tsxApiPath = import.meta.resolve("tsx/esm/api");
|
|
54
|
+
} catch (tsxError) {
|
|
55
|
+
throw new Error(
|
|
56
|
+
`Failed to load ${packageName} for ${purpose}: workspace source fallback requires the "tsx" package.`,
|
|
57
|
+
{ cause: tsxError }
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
const { register } = await import(
|
|
61
|
+
/* @vite-ignore */
|
|
62
|
+
tsxApiPath
|
|
63
|
+
);
|
|
64
|
+
const tsconfigPath = join(workspaceRoot, "tsconfig.package-build.json");
|
|
65
|
+
const unregister = register(
|
|
66
|
+
existsSync(tsconfigPath) ? { tsconfig: tsconfigPath } : void 0
|
|
67
|
+
);
|
|
68
|
+
try {
|
|
69
|
+
return await import(
|
|
70
|
+
/* @vite-ignore */
|
|
71
|
+
pathToFileURL(sourcePath).href
|
|
72
|
+
);
|
|
73
|
+
} finally {
|
|
74
|
+
await unregister();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export {
|
|
79
|
+
importWorkspaceModule
|
|
80
|
+
};
|
|
81
|
+
//# sourceMappingURL=import-workspace-module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-workspace-module.js","sources":["../../src/utils/import-workspace-module.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nexport interface ImportWorkspaceModuleOptions {\n packageName: string;\n sourceEntry: string;\n distEntry?: string;\n purpose: string;\n}\n\nfunction findWorkspaceRoot(startDir: string): string | null {\n let current = startDir;\n\n while (true) {\n if (existsSync(join(current, 'pnpm-workspace.yaml'))) {\n return current;\n }\n\n const parent = dirname(current);\n if (parent === current) {\n return null;\n }\n current = parent;\n }\n}\n\nfunction resolveInstalledPackage(packageName: string): string {\n return import.meta.resolve(packageName);\n}\n\nexport async function importWorkspaceModule<T = unknown>({\n packageName,\n sourceEntry,\n distEntry,\n purpose,\n}: ImportWorkspaceModuleOptions): Promise<T> {\n try {\n return (await import(\n /* @vite-ignore */ resolveInstalledPackage(packageName)\n )) as T;\n } catch (originalError) {\n const workspaceRoot = findWorkspaceRoot(process.cwd());\n if (!workspaceRoot) {\n throw originalError;\n }\n\n if (distEntry) {\n const distPath = join(workspaceRoot, distEntry);\n if (existsSync(distPath)) {\n return (await import(\n /* @vite-ignore */ pathToFileURL(distPath).href\n )) as T;\n }\n }\n\n const sourcePath = join(workspaceRoot, sourceEntry);\n if (!existsSync(sourcePath)) {\n throw new Error(\n `Failed to load ${packageName} for ${purpose}: could not find ${sourcePath}.`,\n );\n }\n\n let tsxApiPath: string;\n try {\n tsxApiPath = import.meta.resolve('tsx/esm/api');\n } catch (tsxError) {\n throw new Error(\n `Failed to load ${packageName} for ${purpose}: workspace source fallback requires the \"tsx\" package.`,\n { cause: tsxError },\n );\n }\n\n const { register } = await import(/* @vite-ignore */ tsxApiPath);\n const tsconfigPath = join(workspaceRoot, 'tsconfig.package-build.json');\n const unregister = register(\n existsSync(tsconfigPath) ? { tsconfig: tsconfigPath } : undefined,\n );\n\n try {\n return (await import(\n /* @vite-ignore */ pathToFileURL(sourcePath).href\n )) as T;\n } finally {\n await unregister();\n }\n }\n}\n"],"names":[],"mappings":";;;AAWA,SAAS,kBAAkB,UAAiC;AAC1D,MAAI,UAAU;AAEd,SAAO,MAAM;AACX,QAAI,WAAW,KAAK,SAAS,qBAAqB,CAAC,GAAG;AACpD,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,QAAQ,OAAO;AAC9B,QAAI,WAAW,SAAS;AACtB,aAAO;AAAA,IACT;AACA,cAAU;AAAA,EACZ;AACF;AAEA,SAAS,wBAAwB,aAA6B;AAC5D,SAAO,YAAY,QAAQ,WAAW;AACxC;AAEA,eAAsB,sBAAmC;AAAA,EACvD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA6C;AAC3C,MAAI;AACF,WAAQ,MAAM;AAAA;AAAA,MACO,wBAAwB,WAAW;AAAA;AAAA,EAE1D,SAAS,eAAe;AACtB,UAAM,gBAAgB,kBAAkB,QAAQ,IAAA,CAAK;AACrD,QAAI,CAAC,eAAe;AAClB,YAAM;AAAA,IACR;AAEA,QAAI,WAAW;AACb,YAAM,WAAW,KAAK,eAAe,SAAS;AAC9C,UAAI,WAAW,QAAQ,GAAG;AACxB,eAAQ,MAAM;AAAA;AAAA,UACO,cAAc,QAAQ,EAAE;AAAA;AAAA,MAE/C;AAAA,IACF;AAEA,UAAM,aAAa,KAAK,eAAe,WAAW;AAClD,QAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,YAAM,IAAI;AAAA,QACR,kBAAkB,WAAW,QAAQ,OAAO,oBAAoB,UAAU;AAAA,MAAA;AAAA,IAE9E;AAEA,QAAI;AACJ,QAAI;AACF,mBAAa,YAAY,QAAQ,aAAa;AAAA,IAChD,SAAS,UAAU;AACjB,YAAM,IAAI;AAAA,QACR,kBAAkB,WAAW,QAAQ,OAAO;AAAA,QAC5C,EAAE,OAAO,SAAA;AAAA,MAAS;AAAA,IAEtB;AAEA,UAAM,EAAE,SAAA,IAAa,MAAM;AAAA;AAAA,MAA0B;AAAA;AACrD,UAAM,eAAe,KAAK,eAAe,6BAA6B;AACtE,UAAM,aAAa;AAAA,MACjB,WAAW,YAAY,IAAI,EAAE,UAAU,iBAAiB;AAAA,IAAA;AAG1D,QAAI;AACF,aAAQ,MAAM;AAAA;AAAA,QACO,cAAc,UAAU,EAAE;AAAA;AAAA,IAEjD,UAAA;AACE,YAAM,WAAA;AAAA,IACR;AAAA,EACF;AACF;"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { JSONAdapter, ParseError, Result, StringifyError } from '@happyvertical/json';
|
|
2
|
+
/**
|
|
3
|
+
* Parse JSON string with optional SIMD acceleration
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```typescript
|
|
7
|
+
* import { parse } from '@happyvertical/smrt-core/utils/json';
|
|
8
|
+
*
|
|
9
|
+
* const data = parse<MyType>('{"key": "value"}');
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
export declare function parse<T = unknown>(text: string): T;
|
|
13
|
+
/**
|
|
14
|
+
* Stringify value to JSON with optional SIMD acceleration
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* import { stringify } from '@happyvertical/smrt-core/utils/json';
|
|
19
|
+
*
|
|
20
|
+
* const json = stringify({ key: 'value' });
|
|
21
|
+
* const pretty = stringify({ key: 'value' }, null, 2);
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare function stringify(value: unknown, replacer?: ((key: string, value: unknown) => unknown) | (string | number)[] | null, space?: number | string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Deep clone via JSON round-trip with optional SIMD acceleration
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* import { clone } from '@happyvertical/smrt-core/utils/json';
|
|
31
|
+
*
|
|
32
|
+
* const copy = clone(original);
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function clone<T>(value: T): T;
|
|
36
|
+
/**
|
|
37
|
+
* Parse JSON without throwing - returns Result type
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* import { safeParse } from '@happyvertical/smrt-core/utils/json';
|
|
42
|
+
*
|
|
43
|
+
* const result = safeParse<Config>(configJson);
|
|
44
|
+
* if (result.success) {
|
|
45
|
+
* console.log(result.value);
|
|
46
|
+
* } else {
|
|
47
|
+
* console.error(result.error.message);
|
|
48
|
+
* }
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare function safeParse<T = unknown>(text: string): Result<T, ParseError>;
|
|
52
|
+
/**
|
|
53
|
+
* Stringify without throwing - returns Result type
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```typescript
|
|
57
|
+
* import { safeStringify } from '@happyvertical/smrt-core/utils/json';
|
|
58
|
+
*
|
|
59
|
+
* const result = safeStringify(data);
|
|
60
|
+
* if (result.success) {
|
|
61
|
+
* console.log(result.value);
|
|
62
|
+
* } else {
|
|
63
|
+
* console.error(result.error.message);
|
|
64
|
+
* }
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export declare function safeStringify(value: unknown): Result<string, StringifyError>;
|
|
68
|
+
/**
|
|
69
|
+
* Check if a string is valid JSON
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```typescript
|
|
73
|
+
* import { isValid } from '@happyvertical/smrt-core/utils/json';
|
|
74
|
+
*
|
|
75
|
+
* if (isValid(userInput)) {
|
|
76
|
+
* // Safe to parse
|
|
77
|
+
* }
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export declare function isValid(text: string): boolean;
|
|
81
|
+
/**
|
|
82
|
+
* Get information about the active JSON adapter
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* import { getAdapterInfo } from '@happyvertical/smrt-core/utils/json';
|
|
87
|
+
*
|
|
88
|
+
* const info = getAdapterInfo();
|
|
89
|
+
* console.log(`Using ${info.name} adapter, SIMD: ${info.simdEnabled}`);
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
export declare function getAdapterInfo(): {
|
|
93
|
+
name: string;
|
|
94
|
+
isNative: boolean;
|
|
95
|
+
version?: string;
|
|
96
|
+
simdEnabled?: boolean;
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Re-export types for convenience
|
|
100
|
+
*/
|
|
101
|
+
export type { JSONAdapter, ParseError, Result, StringifyError };
|
|
102
|
+
//# sourceMappingURL=json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/utils/json.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,KAAK,WAAW,EAEhB,KAAK,UAAU,EACf,KAAK,MAAM,EACX,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAkB7B;;;;;;;;;GASG;AACH,wBAAgB,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAElD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,OAAO,EACd,QAAQ,CAAC,EACL,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,GAC1C,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GACnB,IAAI,EACR,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GACtB,MAAM,CAER;AAED;;;;;;;;;GASG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAEpC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,CAE1E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAE5E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,IAAI;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAEA;AAED;;GAEG;AACH,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC"}
|