@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,23 @@
|
|
|
1
|
+
import { AiUsageHandler, AiUsageSnapshot, SmrtAiUsageEvent } from '@happyvertical/smrt-types';
|
|
2
|
+
import { DatabaseInterface } from '@happyvertical/sql';
|
|
3
|
+
/**
|
|
4
|
+
* Collects normalized AI usage events in memory for quick inspection.
|
|
5
|
+
*/
|
|
6
|
+
export declare class AiUsageCollector implements AiUsageHandler {
|
|
7
|
+
private byModel;
|
|
8
|
+
private byClass;
|
|
9
|
+
private totalCalls;
|
|
10
|
+
private startTime;
|
|
11
|
+
handle(event: SmrtAiUsageEvent): Promise<void>;
|
|
12
|
+
getSnapshot(): AiUsageSnapshot;
|
|
13
|
+
reset(): void;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Persists normalized AI usage events into the framework system table.
|
|
17
|
+
*/
|
|
18
|
+
export declare class AiUsagePersistenceHandler implements AiUsageHandler {
|
|
19
|
+
private readonly db;
|
|
20
|
+
constructor(db: DatabaseInterface);
|
|
21
|
+
handle(event: SmrtAiUsageEvent): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=ai-usage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-usage.d.ts","sourceRoot":"","sources":["../../src/adapters/ai-usage.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EAEf,gBAAgB,EACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAwB5D;;GAEG;AACH,qBAAa,gBAAiB,YAAW,cAAc;IACrD,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,SAAS,CAAc;IAEzB,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBpD,WAAW,IAAI,eAAe;IAoB9B,KAAK,IAAI,IAAI;CAMd;AAED;;GAEG;AACH,qBAAa,yBAA0B,YAAW,cAAc;IAClD,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,iBAAiB;IAE5C,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;CA8BrD"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
function emptyStats(timestamp) {
|
|
2
|
+
return {
|
|
3
|
+
callCount: 0,
|
|
4
|
+
promptTokens: 0,
|
|
5
|
+
completionTokens: 0,
|
|
6
|
+
totalTokens: 0,
|
|
7
|
+
totalDuration: 0,
|
|
8
|
+
estimatedCost: 0,
|
|
9
|
+
lastUsed: timestamp
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function updateStats(stats, event) {
|
|
13
|
+
stats.callCount++;
|
|
14
|
+
stats.promptTokens += event.usage?.promptTokens ?? 0;
|
|
15
|
+
stats.completionTokens += event.usage?.completionTokens ?? 0;
|
|
16
|
+
stats.totalTokens += event.usage?.totalTokens ?? 0;
|
|
17
|
+
stats.totalDuration += event.duration ?? 0;
|
|
18
|
+
stats.estimatedCost += event.estimatedCost ?? 0;
|
|
19
|
+
stats.lastUsed = event.timestamp.getTime();
|
|
20
|
+
}
|
|
21
|
+
class AiUsageCollector {
|
|
22
|
+
byModel = /* @__PURE__ */ new Map();
|
|
23
|
+
byClass = /* @__PURE__ */ new Map();
|
|
24
|
+
totalCalls = 0;
|
|
25
|
+
startTime = Date.now();
|
|
26
|
+
async handle(event) {
|
|
27
|
+
this.totalCalls++;
|
|
28
|
+
const timestamp = event.timestamp.getTime();
|
|
29
|
+
const modelKey = `${event.provider}:${event.model}`;
|
|
30
|
+
const classKey = `${event.className ?? "unknown"}:${event.operation}`;
|
|
31
|
+
let modelStats = this.byModel.get(modelKey);
|
|
32
|
+
if (!modelStats) {
|
|
33
|
+
modelStats = emptyStats(timestamp);
|
|
34
|
+
this.byModel.set(modelKey, modelStats);
|
|
35
|
+
}
|
|
36
|
+
let classStats = this.byClass.get(classKey);
|
|
37
|
+
if (!classStats) {
|
|
38
|
+
classStats = emptyStats(timestamp);
|
|
39
|
+
this.byClass.set(classKey, classStats);
|
|
40
|
+
}
|
|
41
|
+
updateStats(modelStats, event);
|
|
42
|
+
updateStats(classStats, event);
|
|
43
|
+
}
|
|
44
|
+
getSnapshot() {
|
|
45
|
+
const byModel = {};
|
|
46
|
+
const byClass = {};
|
|
47
|
+
for (const [key, stats] of this.byModel.entries()) {
|
|
48
|
+
byModel[key] = { ...stats };
|
|
49
|
+
}
|
|
50
|
+
for (const [key, stats] of this.byClass.entries()) {
|
|
51
|
+
byClass[key] = { ...stats };
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
byModel,
|
|
55
|
+
byClass,
|
|
56
|
+
totalCalls: this.totalCalls,
|
|
57
|
+
startTime: this.startTime
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
reset() {
|
|
61
|
+
this.byModel.clear();
|
|
62
|
+
this.byClass.clear();
|
|
63
|
+
this.totalCalls = 0;
|
|
64
|
+
this.startTime = Date.now();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
class AiUsagePersistenceHandler {
|
|
68
|
+
constructor(db) {
|
|
69
|
+
this.db = db;
|
|
70
|
+
}
|
|
71
|
+
db;
|
|
72
|
+
async handle(event) {
|
|
73
|
+
try {
|
|
74
|
+
await this.db.query(
|
|
75
|
+
`INSERT INTO _smrt_ai_usage
|
|
76
|
+
(id, provider, model, operation, prompt_tokens, completion_tokens,
|
|
77
|
+
total_tokens, estimated_cost, duration, class_name, tenant_id, tags, created_at)
|
|
78
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)`,
|
|
79
|
+
crypto.randomUUID(),
|
|
80
|
+
event.provider,
|
|
81
|
+
event.model,
|
|
82
|
+
event.operation,
|
|
83
|
+
event.usage?.promptTokens ?? null,
|
|
84
|
+
event.usage?.completionTokens ?? null,
|
|
85
|
+
event.usage?.totalTokens ?? null,
|
|
86
|
+
event.estimatedCost ?? null,
|
|
87
|
+
event.duration,
|
|
88
|
+
event.className ?? null,
|
|
89
|
+
event.tenantId ?? null,
|
|
90
|
+
event.tags ? JSON.stringify(event.tags) : null,
|
|
91
|
+
event.timestamp.toISOString()
|
|
92
|
+
);
|
|
93
|
+
} catch (error) {
|
|
94
|
+
throw new Error(
|
|
95
|
+
`Failed to persist AI usage event for ${event.provider}:${event.model}: ${error instanceof Error ? error.message : String(error)}`,
|
|
96
|
+
{ cause: error }
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export {
|
|
102
|
+
AiUsageCollector,
|
|
103
|
+
AiUsagePersistenceHandler
|
|
104
|
+
};
|
|
105
|
+
//# sourceMappingURL=ai-usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-usage.js","sources":["../../src/adapters/ai-usage.ts"],"sourcesContent":["/**\n * In-memory AI usage tracking adapters.\n */\n\nimport type {\n AiUsageHandler,\n AiUsageSnapshot,\n AiUsageStats,\n SmrtAiUsageEvent,\n} from '@happyvertical/smrt-types';\nimport type { DatabaseInterface } from '@happyvertical/sql';\n\nfunction emptyStats(timestamp: number): AiUsageStats {\n return {\n callCount: 0,\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n totalDuration: 0,\n estimatedCost: 0,\n lastUsed: timestamp,\n };\n}\n\nfunction updateStats(stats: AiUsageStats, event: SmrtAiUsageEvent): void {\n stats.callCount++;\n stats.promptTokens += event.usage?.promptTokens ?? 0;\n stats.completionTokens += event.usage?.completionTokens ?? 0;\n stats.totalTokens += event.usage?.totalTokens ?? 0;\n stats.totalDuration += event.duration ?? 0;\n stats.estimatedCost += event.estimatedCost ?? 0;\n stats.lastUsed = event.timestamp.getTime();\n}\n\n/**\n * Collects normalized AI usage events in memory for quick inspection.\n */\nexport class AiUsageCollector implements AiUsageHandler {\n private byModel = new Map<string, AiUsageStats>();\n private byClass = new Map<string, AiUsageStats>();\n private totalCalls = 0;\n private startTime = Date.now();\n\n async handle(event: SmrtAiUsageEvent): Promise<void> {\n this.totalCalls++;\n\n const timestamp = event.timestamp.getTime();\n const modelKey = `${event.provider}:${event.model}`;\n const classKey = `${event.className ?? 'unknown'}:${event.operation}`;\n\n let modelStats = this.byModel.get(modelKey);\n if (!modelStats) {\n modelStats = emptyStats(timestamp);\n this.byModel.set(modelKey, modelStats);\n }\n\n let classStats = this.byClass.get(classKey);\n if (!classStats) {\n classStats = emptyStats(timestamp);\n this.byClass.set(classKey, classStats);\n }\n\n updateStats(modelStats, event);\n updateStats(classStats, event);\n }\n\n getSnapshot(): AiUsageSnapshot {\n const byModel: AiUsageSnapshot['byModel'] = {};\n const byClass: AiUsageSnapshot['byClass'] = {};\n\n for (const [key, stats] of this.byModel.entries()) {\n byModel[key] = { ...stats };\n }\n\n for (const [key, stats] of this.byClass.entries()) {\n byClass[key] = { ...stats };\n }\n\n return {\n byModel,\n byClass,\n totalCalls: this.totalCalls,\n startTime: this.startTime,\n };\n }\n\n reset(): void {\n this.byModel.clear();\n this.byClass.clear();\n this.totalCalls = 0;\n this.startTime = Date.now();\n }\n}\n\n/**\n * Persists normalized AI usage events into the framework system table.\n */\nexport class AiUsagePersistenceHandler implements AiUsageHandler {\n constructor(private readonly db: DatabaseInterface) {}\n\n async handle(event: SmrtAiUsageEvent): Promise<void> {\n try {\n await this.db.query(\n `INSERT INTO _smrt_ai_usage\n (id, provider, model, operation, prompt_tokens, completion_tokens,\n total_tokens, estimated_cost, duration, class_name, tenant_id, tags, created_at)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)`,\n crypto.randomUUID(),\n event.provider,\n event.model,\n event.operation,\n event.usage?.promptTokens ?? null,\n event.usage?.completionTokens ?? null,\n event.usage?.totalTokens ?? null,\n event.estimatedCost ?? null,\n event.duration,\n event.className ?? null,\n event.tenantId ?? null,\n event.tags ? JSON.stringify(event.tags) : null,\n event.timestamp.toISOString(),\n );\n } catch (error) {\n throw new Error(\n `Failed to persist AI usage event for ${event.provider}:${event.model}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n { cause: error },\n );\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { AiTokenUsage } from '@happyvertical/smrt-types';
|
|
2
|
+
/**
|
|
3
|
+
* Cost rates are expressed in USD per 1K tokens.
|
|
4
|
+
*
|
|
5
|
+
* These defaults are intentionally small and best-effort. Applications can
|
|
6
|
+
* override them via configuration when they need stricter billing accuracy.
|
|
7
|
+
* Snapshot captured on 2026-03-12 from provider pricing pages.
|
|
8
|
+
*/
|
|
9
|
+
export declare const DEFAULT_AI_COST_RATES: Record<string, {
|
|
10
|
+
input: number;
|
|
11
|
+
output: number;
|
|
12
|
+
}>;
|
|
13
|
+
/**
|
|
14
|
+
* Estimate the cost of a single AI usage event.
|
|
15
|
+
*/
|
|
16
|
+
export declare function estimateAiUsageCost(provider: string, model: string, usage?: AiTokenUsage, customRates?: Record<string, {
|
|
17
|
+
input: number;
|
|
18
|
+
output: number;
|
|
19
|
+
}>): number | undefined;
|
|
20
|
+
//# sourceMappingURL=cost-rates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-rates.d.ts","sourceRoot":"","sources":["../../src/adapters/cost-rates.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAM9D;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CACxC,MAAM,EACN;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CASlC,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,YAAY,EACpB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAC9D,MAAM,GAAG,SAAS,CA8BpB"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { createLogger } from "@happyvertical/logger";
|
|
2
|
+
const logger = createLogger({ level: "info" });
|
|
3
|
+
const missingRateWarnings = /* @__PURE__ */ new Set();
|
|
4
|
+
const DEFAULT_AI_COST_RATES = {
|
|
5
|
+
"openai:gpt-4o": { input: 25e-4, output: 0.01 },
|
|
6
|
+
"openai:gpt-4o-mini": { input: 15e-5, output: 6e-4 },
|
|
7
|
+
"anthropic:claude-sonnet-4.5": { input: 3e-3, output: 0.015 },
|
|
8
|
+
"anthropic:claude-haiku-4.5": { input: 1e-3, output: 5e-3 },
|
|
9
|
+
"anthropic:claude-3-5-sonnet-latest": { input: 3e-3, output: 0.015 },
|
|
10
|
+
"anthropic:claude-3-5-haiku-latest": { input: 8e-4, output: 4e-3 },
|
|
11
|
+
"google:gemini-2.5-flash": { input: 3e-4, output: 25e-4 }
|
|
12
|
+
};
|
|
13
|
+
function estimateAiUsageCost(provider, model, usage, customRates) {
|
|
14
|
+
if (!usage) return void 0;
|
|
15
|
+
const rates = {
|
|
16
|
+
...DEFAULT_AI_COST_RATES,
|
|
17
|
+
...customRates ?? {}
|
|
18
|
+
};
|
|
19
|
+
const exactKey = `${provider}:${model}`;
|
|
20
|
+
const fallbackKey = model;
|
|
21
|
+
const rate = rates[exactKey] ?? rates[fallbackKey];
|
|
22
|
+
if (!rate) {
|
|
23
|
+
const warningKey = exactKey;
|
|
24
|
+
if (!missingRateWarnings.has(warningKey)) {
|
|
25
|
+
missingRateWarnings.add(warningKey);
|
|
26
|
+
logger.warn(
|
|
27
|
+
`[smrt] No AI usage cost rate configured for ${warningKey}. Cost estimation will be skipped for this model.`
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
return void 0;
|
|
31
|
+
}
|
|
32
|
+
const promptTokens = usage.promptTokens ?? 0;
|
|
33
|
+
const completionTokens = usage.completionTokens ?? 0;
|
|
34
|
+
return promptTokens / 1e3 * rate.input + completionTokens / 1e3 * rate.output;
|
|
35
|
+
}
|
|
36
|
+
export {
|
|
37
|
+
DEFAULT_AI_COST_RATES,
|
|
38
|
+
estimateAiUsageCost
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=cost-rates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-rates.js","sources":["../../src/adapters/cost-rates.ts"],"sourcesContent":["import { createLogger } from '@happyvertical/logger';\nimport type { AiTokenUsage } from '@happyvertical/smrt-types';\n\nconst logger = createLogger({ level: 'info' });\n\nconst missingRateWarnings = new Set<string>();\n\n/**\n * Cost rates are expressed in USD per 1K tokens.\n *\n * These defaults are intentionally small and best-effort. Applications can\n * override them via configuration when they need stricter billing accuracy.\n * Snapshot captured on 2026-03-12 from provider pricing pages.\n */\nexport const DEFAULT_AI_COST_RATES: Record<\n string,\n { input: number; output: number }\n> = {\n 'openai:gpt-4o': { input: 0.0025, output: 0.01 },\n 'openai:gpt-4o-mini': { input: 0.00015, output: 0.0006 },\n 'anthropic:claude-sonnet-4.5': { input: 0.003, output: 0.015 },\n 'anthropic:claude-haiku-4.5': { input: 0.001, output: 0.005 },\n 'anthropic:claude-3-5-sonnet-latest': { input: 0.003, output: 0.015 },\n 'anthropic:claude-3-5-haiku-latest': { input: 0.0008, output: 0.004 },\n 'google:gemini-2.5-flash': { input: 0.0003, output: 0.0025 },\n};\n\n/**\n * Estimate the cost of a single AI usage event.\n */\nexport function estimateAiUsageCost(\n provider: string,\n model: string,\n usage?: AiTokenUsage,\n customRates?: Record<string, { input: number; output: number }>,\n): number | undefined {\n if (!usage) return undefined;\n\n const rates = {\n ...DEFAULT_AI_COST_RATES,\n ...(customRates ?? {}),\n };\n\n const exactKey = `${provider}:${model}`;\n const fallbackKey = model;\n const rate = rates[exactKey] ?? rates[fallbackKey];\n\n if (!rate) {\n const warningKey = exactKey;\n if (!missingRateWarnings.has(warningKey)) {\n missingRateWarnings.add(warningKey);\n logger.warn(\n `[smrt] No AI usage cost rate configured for ${warningKey}. ` +\n `Cost estimation will be skipped for this model.`,\n );\n }\n return undefined;\n }\n\n const promptTokens = usage.promptTokens ?? 0;\n const completionTokens = usage.completionTokens ?? 0;\n\n return (\n (promptTokens / 1000) * rate.input + (completionTokens / 1000) * rate.output\n );\n}\n"],"names":[],"mappings":";AAGA,MAAM,SAAS,aAAa,EAAE,OAAO,QAAQ;AAE7C,MAAM,0CAA0B,IAAA;AASzB,MAAM,wBAGT;AAAA,EACF,iBAAiB,EAAE,OAAO,OAAQ,QAAQ,KAAA;AAAA,EAC1C,sBAAsB,EAAE,OAAO,OAAS,QAAQ,KAAA;AAAA,EAChD,+BAA+B,EAAE,OAAO,MAAO,QAAQ,MAAA;AAAA,EACvD,8BAA8B,EAAE,OAAO,MAAO,QAAQ,KAAA;AAAA,EACtD,sCAAsC,EAAE,OAAO,MAAO,QAAQ,MAAA;AAAA,EAC9D,qCAAqC,EAAE,OAAO,MAAQ,QAAQ,KAAA;AAAA,EAC9D,2BAA2B,EAAE,OAAO,MAAQ,QAAQ,MAAA;AACtD;AAKO,SAAS,oBACd,UACA,OACA,OACA,aACoB;AACpB,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,QAAQ;AAAA,IACZ,GAAG;AAAA,IACH,GAAI,eAAe,CAAA;AAAA,EAAC;AAGtB,QAAM,WAAW,GAAG,QAAQ,IAAI,KAAK;AACrC,QAAM,cAAc;AACpB,QAAM,OAAO,MAAM,QAAQ,KAAK,MAAM,WAAW;AAEjD,MAAI,CAAC,MAAM;AACT,UAAM,aAAa;AACnB,QAAI,CAAC,oBAAoB,IAAI,UAAU,GAAG;AACxC,0BAAoB,IAAI,UAAU;AAClC,aAAO;AAAA,QACL,+CAA+C,UAAU;AAAA,MAAA;AAAA,IAG7D;AACA,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,MAAM,gBAAgB;AAC3C,QAAM,mBAAmB,MAAM,oBAAoB;AAEnD,SACG,eAAe,MAAQ,KAAK,QAAS,mBAAmB,MAAQ,KAAK;AAE1E;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in Adapters & Usage Handlers
|
|
3
|
+
*
|
|
4
|
+
* Pre-built components for common observability and communication patterns:
|
|
5
|
+
* - AiUsageCollector / AiUsagePersistenceHandler: AI usage handlers for
|
|
6
|
+
* normalized telemetry collection and persistence
|
|
7
|
+
* - MetricsAdapter: Signal adapter for execution metrics
|
|
8
|
+
* (Prometheus-compatible)
|
|
9
|
+
* - PubSubAdapter: Signal adapter to broadcast signals to subscribers
|
|
10
|
+
* (WebSocket/SSE)
|
|
11
|
+
*/
|
|
12
|
+
export type { AiUsageSnapshot, AiUsageStats } from '@happyvertical/smrt-types';
|
|
13
|
+
export { AiUsageCollector, AiUsagePersistenceHandler } from './ai-usage.js';
|
|
14
|
+
export { DEFAULT_AI_COST_RATES, estimateAiUsageCost, } from './cost-rates.js';
|
|
15
|
+
export type { MethodMetrics, MetricsSnapshot, } from './metrics.js';
|
|
16
|
+
export { MetricsAdapter } from './metrics.js';
|
|
17
|
+
export type { SignalFilter, SignalSubscriber, Subscription, } from './pubsub.js';
|
|
18
|
+
export { PubSubAdapter } from './pubsub.js';
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EACL,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,aAAa,EACb,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { Signal, SignalAdapter } from '@happyvertical/smrt-types';
|
|
2
|
+
/**
|
|
3
|
+
* Execution metrics for a specific method
|
|
4
|
+
*/
|
|
5
|
+
export interface MethodMetrics {
|
|
6
|
+
/** Total number of executions */
|
|
7
|
+
count: number;
|
|
8
|
+
/** Number of successful executions */
|
|
9
|
+
successCount: number;
|
|
10
|
+
/** Number of failed executions */
|
|
11
|
+
errorCount: number;
|
|
12
|
+
/** Total execution time across all calls (ms) */
|
|
13
|
+
totalDuration: number;
|
|
14
|
+
/** Minimum execution time (ms) */
|
|
15
|
+
minDuration: number;
|
|
16
|
+
/** Maximum execution time (ms) */
|
|
17
|
+
maxDuration: number;
|
|
18
|
+
/** Last execution timestamp */
|
|
19
|
+
lastExecuted: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Aggregated metrics storage
|
|
23
|
+
*/
|
|
24
|
+
export interface MetricsSnapshot {
|
|
25
|
+
/** Metrics per class.method combination */
|
|
26
|
+
methods: Record<string, MethodMetrics>;
|
|
27
|
+
/** Total signals processed */
|
|
28
|
+
totalSignals: number;
|
|
29
|
+
/** Metrics collection start time */
|
|
30
|
+
startTime: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Metrics Adapter - Tracks execution metrics for observability
|
|
34
|
+
*
|
|
35
|
+
* Provides Prometheus-style metrics for SMRT method executions:
|
|
36
|
+
* - Execution counts (total, success, error)
|
|
37
|
+
* - Duration statistics (min, max, avg)
|
|
38
|
+
* - Success/error rates
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* const metrics = new MetricsAdapter();
|
|
43
|
+
* signalBus.register(metrics);
|
|
44
|
+
*
|
|
45
|
+
* // Later, get metrics snapshot
|
|
46
|
+
* const snapshot = metrics.getMetrics();
|
|
47
|
+
* console.log(snapshot.methods['Product.analyze']);
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export declare class MetricsAdapter implements SignalAdapter {
|
|
51
|
+
private metrics;
|
|
52
|
+
private totalSignals;
|
|
53
|
+
private startTime;
|
|
54
|
+
/**
|
|
55
|
+
* Handle a signal and update metrics
|
|
56
|
+
*
|
|
57
|
+
* @param signal - Signal to process
|
|
58
|
+
*/
|
|
59
|
+
handle(signal: Signal): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Get current metrics snapshot
|
|
62
|
+
*
|
|
63
|
+
* @returns Snapshot of all collected metrics
|
|
64
|
+
*/
|
|
65
|
+
getMetrics(): MetricsSnapshot;
|
|
66
|
+
/**
|
|
67
|
+
* Get metrics for a specific method
|
|
68
|
+
*
|
|
69
|
+
* @param className - Class name
|
|
70
|
+
* @param methodName - Method name
|
|
71
|
+
* @returns Metrics for the method, or undefined if not found
|
|
72
|
+
*/
|
|
73
|
+
getMethodMetrics(className: string, methodName: string): MethodMetrics | undefined;
|
|
74
|
+
/**
|
|
75
|
+
* Get average duration for a method
|
|
76
|
+
*
|
|
77
|
+
* @param className - Class name
|
|
78
|
+
* @param methodName - Method name
|
|
79
|
+
* @returns Average duration in ms, or 0 if no executions
|
|
80
|
+
*/
|
|
81
|
+
getAverageDuration(className: string, methodName: string): number;
|
|
82
|
+
/**
|
|
83
|
+
* Get success rate for a method
|
|
84
|
+
*
|
|
85
|
+
* @param className - Class name
|
|
86
|
+
* @param methodName - Method name
|
|
87
|
+
* @returns Success rate (0-1), or 0 if no executions
|
|
88
|
+
*/
|
|
89
|
+
getSuccessRate(className: string, methodName: string): number;
|
|
90
|
+
/**
|
|
91
|
+
* Get error rate for a method
|
|
92
|
+
*
|
|
93
|
+
* @param className - Class name
|
|
94
|
+
* @param methodName - Method name
|
|
95
|
+
* @returns Error rate (0-1), or 0 if no executions
|
|
96
|
+
*/
|
|
97
|
+
getErrorRate(className: string, methodName: string): number;
|
|
98
|
+
/**
|
|
99
|
+
* Export metrics in Prometheus text format
|
|
100
|
+
*
|
|
101
|
+
* @returns Prometheus-compatible metrics text
|
|
102
|
+
*/
|
|
103
|
+
toPrometheusFormat(): string;
|
|
104
|
+
/**
|
|
105
|
+
* Reset all metrics
|
|
106
|
+
*
|
|
107
|
+
* Clears all collected metrics and resets counters.
|
|
108
|
+
*/
|
|
109
|
+
reset(): void;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/adapters/metrics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAEvE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,aAAa,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvC,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,cAAe,YAAW,aAAa;IAClD,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,SAAS,CAAc;IAE/B;;;;OAIG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiD3C;;;;OAIG;IACH,UAAU,IAAI,eAAe;IAc7B;;;;;;OAMG;IACH,gBAAgB,CACd,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,aAAa,GAAG,SAAS;IAM5B;;;;;;OAMG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAQjE;;;;;;OAMG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAQ7D;;;;;;OAMG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAQ3D;;;;OAIG;IACH,kBAAkB,IAAI,MAAM;IAgD5B;;;;OAIG;IACH,KAAK,IAAI,IAAI;CAKd"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
class MetricsAdapter {
|
|
2
|
+
metrics = /* @__PURE__ */ new Map();
|
|
3
|
+
totalSignals = 0;
|
|
4
|
+
startTime = Date.now();
|
|
5
|
+
/**
|
|
6
|
+
* Handle a signal and update metrics
|
|
7
|
+
*
|
|
8
|
+
* @param signal - Signal to process
|
|
9
|
+
*/
|
|
10
|
+
async handle(signal) {
|
|
11
|
+
this.totalSignals++;
|
|
12
|
+
if (signal.type !== "end" && signal.type !== "error") {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const key = `${signal.className}.${signal.method}`;
|
|
16
|
+
let methodMetrics = this.metrics.get(key);
|
|
17
|
+
if (!methodMetrics) {
|
|
18
|
+
methodMetrics = {
|
|
19
|
+
count: 0,
|
|
20
|
+
successCount: 0,
|
|
21
|
+
errorCount: 0,
|
|
22
|
+
totalDuration: 0,
|
|
23
|
+
minDuration: Number.POSITIVE_INFINITY,
|
|
24
|
+
maxDuration: 0,
|
|
25
|
+
lastExecuted: 0
|
|
26
|
+
};
|
|
27
|
+
this.metrics.set(key, methodMetrics);
|
|
28
|
+
}
|
|
29
|
+
methodMetrics.count++;
|
|
30
|
+
if (signal.type === "end") {
|
|
31
|
+
methodMetrics.successCount++;
|
|
32
|
+
} else {
|
|
33
|
+
methodMetrics.errorCount++;
|
|
34
|
+
}
|
|
35
|
+
if (signal.duration !== void 0) {
|
|
36
|
+
methodMetrics.totalDuration += signal.duration;
|
|
37
|
+
methodMetrics.minDuration = Math.min(
|
|
38
|
+
methodMetrics.minDuration,
|
|
39
|
+
signal.duration
|
|
40
|
+
);
|
|
41
|
+
methodMetrics.maxDuration = Math.max(
|
|
42
|
+
methodMetrics.maxDuration,
|
|
43
|
+
signal.duration
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
methodMetrics.lastExecuted = signal.timestamp.getTime();
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get current metrics snapshot
|
|
50
|
+
*
|
|
51
|
+
* @returns Snapshot of all collected metrics
|
|
52
|
+
*/
|
|
53
|
+
getMetrics() {
|
|
54
|
+
const methods = {};
|
|
55
|
+
for (const [key, metrics] of this.metrics.entries()) {
|
|
56
|
+
methods[key] = { ...metrics };
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
methods,
|
|
60
|
+
totalSignals: this.totalSignals,
|
|
61
|
+
startTime: this.startTime
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get metrics for a specific method
|
|
66
|
+
*
|
|
67
|
+
* @param className - Class name
|
|
68
|
+
* @param methodName - Method name
|
|
69
|
+
* @returns Metrics for the method, or undefined if not found
|
|
70
|
+
*/
|
|
71
|
+
getMethodMetrics(className, methodName) {
|
|
72
|
+
const key = `${className}.${methodName}`;
|
|
73
|
+
const metrics = this.metrics.get(key);
|
|
74
|
+
return metrics ? { ...metrics } : void 0;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get average duration for a method
|
|
78
|
+
*
|
|
79
|
+
* @param className - Class name
|
|
80
|
+
* @param methodName - Method name
|
|
81
|
+
* @returns Average duration in ms, or 0 if no executions
|
|
82
|
+
*/
|
|
83
|
+
getAverageDuration(className, methodName) {
|
|
84
|
+
const metrics = this.getMethodMetrics(className, methodName);
|
|
85
|
+
if (!metrics || metrics.count === 0) {
|
|
86
|
+
return 0;
|
|
87
|
+
}
|
|
88
|
+
return metrics.totalDuration / metrics.count;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Get success rate for a method
|
|
92
|
+
*
|
|
93
|
+
* @param className - Class name
|
|
94
|
+
* @param methodName - Method name
|
|
95
|
+
* @returns Success rate (0-1), or 0 if no executions
|
|
96
|
+
*/
|
|
97
|
+
getSuccessRate(className, methodName) {
|
|
98
|
+
const metrics = this.getMethodMetrics(className, methodName);
|
|
99
|
+
if (!metrics || metrics.count === 0) {
|
|
100
|
+
return 0;
|
|
101
|
+
}
|
|
102
|
+
return metrics.successCount / metrics.count;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get error rate for a method
|
|
106
|
+
*
|
|
107
|
+
* @param className - Class name
|
|
108
|
+
* @param methodName - Method name
|
|
109
|
+
* @returns Error rate (0-1), or 0 if no executions
|
|
110
|
+
*/
|
|
111
|
+
getErrorRate(className, methodName) {
|
|
112
|
+
const metrics = this.getMethodMetrics(className, methodName);
|
|
113
|
+
if (!metrics || metrics.count === 0) {
|
|
114
|
+
return 0;
|
|
115
|
+
}
|
|
116
|
+
return metrics.errorCount / metrics.count;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Export metrics in Prometheus text format
|
|
120
|
+
*
|
|
121
|
+
* @returns Prometheus-compatible metrics text
|
|
122
|
+
*/
|
|
123
|
+
toPrometheusFormat() {
|
|
124
|
+
const lines = [];
|
|
125
|
+
lines.push("# HELP smrt_method_executions_total Total method executions");
|
|
126
|
+
lines.push("# TYPE smrt_method_executions_total counter");
|
|
127
|
+
lines.push("# HELP smrt_method_duration_seconds Method execution duration");
|
|
128
|
+
lines.push("# TYPE smrt_method_duration_seconds histogram");
|
|
129
|
+
lines.push("# HELP smrt_method_errors_total Total method errors");
|
|
130
|
+
lines.push("# TYPE smrt_method_errors_total counter");
|
|
131
|
+
for (const [key, metrics] of this.metrics.entries()) {
|
|
132
|
+
const [className, methodName] = key.split(".");
|
|
133
|
+
const labels = `class="${className}",method="${methodName}"`;
|
|
134
|
+
lines.push(`smrt_method_executions_total{${labels}} ${metrics.count}`);
|
|
135
|
+
lines.push(
|
|
136
|
+
`smrt_method_executions_total{${labels},status="success"} ${metrics.successCount}`
|
|
137
|
+
);
|
|
138
|
+
lines.push(`smrt_method_errors_total{${labels}} ${metrics.errorCount}`);
|
|
139
|
+
const avgDuration = metrics.totalDuration / metrics.count / 1e3;
|
|
140
|
+
const minDuration = metrics.minDuration / 1e3;
|
|
141
|
+
const maxDuration = metrics.maxDuration / 1e3;
|
|
142
|
+
lines.push(
|
|
143
|
+
`smrt_method_duration_seconds{${labels},quantile="0.0"} ${minDuration}`
|
|
144
|
+
);
|
|
145
|
+
lines.push(
|
|
146
|
+
`smrt_method_duration_seconds{${labels},quantile="0.5"} ${avgDuration}`
|
|
147
|
+
);
|
|
148
|
+
lines.push(
|
|
149
|
+
`smrt_method_duration_seconds{${labels},quantile="1.0"} ${maxDuration}`
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
return `${lines.join("\n")}
|
|
153
|
+
`;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Reset all metrics
|
|
157
|
+
*
|
|
158
|
+
* Clears all collected metrics and resets counters.
|
|
159
|
+
*/
|
|
160
|
+
reset() {
|
|
161
|
+
this.metrics.clear();
|
|
162
|
+
this.totalSignals = 0;
|
|
163
|
+
this.startTime = Date.now();
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
export {
|
|
167
|
+
MetricsAdapter
|
|
168
|
+
};
|
|
169
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sources":["../../src/adapters/metrics.ts"],"sourcesContent":["/**\n * Metrics Adapter for Signal System\n *\n * Tracks execution metrics for SMRT objects in Prometheus-compatible format.\n * Collects counts, durations, error rates, and success rates.\n */\n\nimport type { Signal, SignalAdapter } from '@happyvertical/smrt-types';\n\n/**\n * Execution metrics for a specific method\n */\nexport interface MethodMetrics {\n /** Total number of executions */\n count: number;\n /** Number of successful executions */\n successCount: number;\n /** Number of failed executions */\n errorCount: number;\n /** Total execution time across all calls (ms) */\n totalDuration: number;\n /** Minimum execution time (ms) */\n minDuration: number;\n /** Maximum execution time (ms) */\n maxDuration: number;\n /** Last execution timestamp */\n lastExecuted: number;\n}\n\n/**\n * Aggregated metrics storage\n */\nexport interface MetricsSnapshot {\n /** Metrics per class.method combination */\n methods: Record<string, MethodMetrics>;\n /** Total signals processed */\n totalSignals: number;\n /** Metrics collection start time */\n startTime: number;\n}\n\n/**\n * Metrics Adapter - Tracks execution metrics for observability\n *\n * Provides Prometheus-style metrics for SMRT method executions:\n * - Execution counts (total, success, error)\n * - Duration statistics (min, max, avg)\n * - Success/error rates\n *\n * @example\n * ```typescript\n * const metrics = new MetricsAdapter();\n * signalBus.register(metrics);\n *\n * // Later, get metrics snapshot\n * const snapshot = metrics.getMetrics();\n * console.log(snapshot.methods['Product.analyze']);\n * ```\n */\nexport class MetricsAdapter implements SignalAdapter {\n private metrics: Map<string, MethodMetrics> = new Map();\n private totalSignals = 0;\n private startTime = Date.now();\n\n /**\n * Handle a signal and update metrics\n *\n * @param signal - Signal to process\n */\n async handle(signal: Signal): Promise<void> {\n this.totalSignals++;\n\n // Only track end and error signals (they have duration)\n if (signal.type !== 'end' && signal.type !== 'error') {\n return;\n }\n\n const key = `${signal.className}.${signal.method}`;\n let methodMetrics = this.metrics.get(key);\n\n // Initialize metrics for new method\n if (!methodMetrics) {\n methodMetrics = {\n count: 0,\n successCount: 0,\n errorCount: 0,\n totalDuration: 0,\n minDuration: Number.POSITIVE_INFINITY,\n maxDuration: 0,\n lastExecuted: 0,\n };\n this.metrics.set(key, methodMetrics);\n }\n\n // Update counts\n methodMetrics.count++;\n if (signal.type === 'end') {\n methodMetrics.successCount++;\n } else {\n methodMetrics.errorCount++;\n }\n\n // Update duration statistics\n if (signal.duration !== undefined) {\n methodMetrics.totalDuration += signal.duration;\n methodMetrics.minDuration = Math.min(\n methodMetrics.minDuration,\n signal.duration,\n );\n methodMetrics.maxDuration = Math.max(\n methodMetrics.maxDuration,\n signal.duration,\n );\n }\n\n methodMetrics.lastExecuted = signal.timestamp.getTime();\n }\n\n /**\n * Get current metrics snapshot\n *\n * @returns Snapshot of all collected metrics\n */\n getMetrics(): MetricsSnapshot {\n const methods: Record<string, MethodMetrics> = {};\n\n for (const [key, metrics] of this.metrics.entries()) {\n methods[key] = { ...metrics };\n }\n\n return {\n methods,\n totalSignals: this.totalSignals,\n startTime: this.startTime,\n };\n }\n\n /**\n * Get metrics for a specific method\n *\n * @param className - Class name\n * @param methodName - Method name\n * @returns Metrics for the method, or undefined if not found\n */\n getMethodMetrics(\n className: string,\n methodName: string,\n ): MethodMetrics | undefined {\n const key = `${className}.${methodName}`;\n const metrics = this.metrics.get(key);\n return metrics ? { ...metrics } : undefined;\n }\n\n /**\n * Get average duration for a method\n *\n * @param className - Class name\n * @param methodName - Method name\n * @returns Average duration in ms, or 0 if no executions\n */\n getAverageDuration(className: string, methodName: string): number {\n const metrics = this.getMethodMetrics(className, methodName);\n if (!metrics || metrics.count === 0) {\n return 0;\n }\n return metrics.totalDuration / metrics.count;\n }\n\n /**\n * Get success rate for a method\n *\n * @param className - Class name\n * @param methodName - Method name\n * @returns Success rate (0-1), or 0 if no executions\n */\n getSuccessRate(className: string, methodName: string): number {\n const metrics = this.getMethodMetrics(className, methodName);\n if (!metrics || metrics.count === 0) {\n return 0;\n }\n return metrics.successCount / metrics.count;\n }\n\n /**\n * Get error rate for a method\n *\n * @param className - Class name\n * @param methodName - Method name\n * @returns Error rate (0-1), or 0 if no executions\n */\n getErrorRate(className: string, methodName: string): number {\n const metrics = this.getMethodMetrics(className, methodName);\n if (!metrics || metrics.count === 0) {\n return 0;\n }\n return metrics.errorCount / metrics.count;\n }\n\n /**\n * Export metrics in Prometheus text format\n *\n * @returns Prometheus-compatible metrics text\n */\n toPrometheusFormat(): string {\n const lines: string[] = [];\n\n // Add help and type declarations\n lines.push('# HELP smrt_method_executions_total Total method executions');\n lines.push('# TYPE smrt_method_executions_total counter');\n\n lines.push('# HELP smrt_method_duration_seconds Method execution duration');\n lines.push('# TYPE smrt_method_duration_seconds histogram');\n\n lines.push('# HELP smrt_method_errors_total Total method errors');\n lines.push('# TYPE smrt_method_errors_total counter');\n\n // Generate metrics for each method\n for (const [key, metrics] of this.metrics.entries()) {\n const [className, methodName] = key.split('.');\n const labels = `class=\"${className}\",method=\"${methodName}\"`;\n\n // Execution count\n lines.push(`smrt_method_executions_total{${labels}} ${metrics.count}`);\n\n // Success count\n lines.push(\n `smrt_method_executions_total{${labels},status=\"success\"} ${metrics.successCount}`,\n );\n\n // Error count\n lines.push(`smrt_method_errors_total{${labels}} ${metrics.errorCount}`);\n\n // Duration statistics (convert to seconds for Prometheus)\n const avgDuration = metrics.totalDuration / metrics.count / 1000;\n const minDuration = metrics.minDuration / 1000;\n const maxDuration = metrics.maxDuration / 1000;\n\n lines.push(\n `smrt_method_duration_seconds{${labels},quantile=\"0.0\"} ${minDuration}`,\n );\n lines.push(\n `smrt_method_duration_seconds{${labels},quantile=\"0.5\"} ${avgDuration}`,\n );\n lines.push(\n `smrt_method_duration_seconds{${labels},quantile=\"1.0\"} ${maxDuration}`,\n );\n }\n\n return `${lines.join('\\n')}\\n`;\n }\n\n /**\n * Reset all metrics\n *\n * Clears all collected metrics and resets counters.\n */\n reset(): void {\n this.metrics.clear();\n this.totalSignals = 0;\n this.startTime = Date.now();\n }\n}\n"],"names":[],"mappings":"AA2DO,MAAM,eAAwC;AAAA,EAC3C,8BAA0C,IAAA;AAAA,EAC1C,eAAe;AAAA,EACf,YAAY,KAAK,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOzB,MAAM,OAAO,QAA+B;AAC1C,SAAK;AAGL,QAAI,OAAO,SAAS,SAAS,OAAO,SAAS,SAAS;AACpD;AAAA,IACF;AAEA,UAAM,MAAM,GAAG,OAAO,SAAS,IAAI,OAAO,MAAM;AAChD,QAAI,gBAAgB,KAAK,QAAQ,IAAI,GAAG;AAGxC,QAAI,CAAC,eAAe;AAClB,sBAAgB;AAAA,QACd,OAAO;AAAA,QACP,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,eAAe;AAAA,QACf,aAAa,OAAO;AAAA,QACpB,aAAa;AAAA,QACb,cAAc;AAAA,MAAA;AAEhB,WAAK,QAAQ,IAAI,KAAK,aAAa;AAAA,IACrC;AAGA,kBAAc;AACd,QAAI,OAAO,SAAS,OAAO;AACzB,oBAAc;AAAA,IAChB,OAAO;AACL,oBAAc;AAAA,IAChB;AAGA,QAAI,OAAO,aAAa,QAAW;AACjC,oBAAc,iBAAiB,OAAO;AACtC,oBAAc,cAAc,KAAK;AAAA,QAC/B,cAAc;AAAA,QACd,OAAO;AAAA,MAAA;AAET,oBAAc,cAAc,KAAK;AAAA,QAC/B,cAAc;AAAA,QACd,OAAO;AAAA,MAAA;AAAA,IAEX;AAEA,kBAAc,eAAe,OAAO,UAAU,QAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAA8B;AAC5B,UAAM,UAAyC,CAAA;AAE/C,eAAW,CAAC,KAAK,OAAO,KAAK,KAAK,QAAQ,WAAW;AACnD,cAAQ,GAAG,IAAI,EAAE,GAAG,QAAA;AAAA,IACtB;AAEA,WAAO;AAAA,MACL;AAAA,MACA,cAAc,KAAK;AAAA,MACnB,WAAW,KAAK;AAAA,IAAA;AAAA,EAEpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,iBACE,WACA,YAC2B;AAC3B,UAAM,MAAM,GAAG,SAAS,IAAI,UAAU;AACtC,UAAM,UAAU,KAAK,QAAQ,IAAI,GAAG;AACpC,WAAO,UAAU,EAAE,GAAG,QAAA,IAAY;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,mBAAmB,WAAmB,YAA4B;AAChE,UAAM,UAAU,KAAK,iBAAiB,WAAW,UAAU;AAC3D,QAAI,CAAC,WAAW,QAAQ,UAAU,GAAG;AACnC,aAAO;AAAA,IACT;AACA,WAAO,QAAQ,gBAAgB,QAAQ;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAe,WAAmB,YAA4B;AAC5D,UAAM,UAAU,KAAK,iBAAiB,WAAW,UAAU;AAC3D,QAAI,CAAC,WAAW,QAAQ,UAAU,GAAG;AACnC,aAAO;AAAA,IACT;AACA,WAAO,QAAQ,eAAe,QAAQ;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aAAa,WAAmB,YAA4B;AAC1D,UAAM,UAAU,KAAK,iBAAiB,WAAW,UAAU;AAC3D,QAAI,CAAC,WAAW,QAAQ,UAAU,GAAG;AACnC,aAAO;AAAA,IACT;AACA,WAAO,QAAQ,aAAa,QAAQ;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,qBAA6B;AAC3B,UAAM,QAAkB,CAAA;AAGxB,UAAM,KAAK,6DAA6D;AACxE,UAAM,KAAK,6CAA6C;AAExD,UAAM,KAAK,+DAA+D;AAC1E,UAAM,KAAK,+CAA+C;AAE1D,UAAM,KAAK,qDAAqD;AAChE,UAAM,KAAK,yCAAyC;AAGpD,eAAW,CAAC,KAAK,OAAO,KAAK,KAAK,QAAQ,WAAW;AACnD,YAAM,CAAC,WAAW,UAAU,IAAI,IAAI,MAAM,GAAG;AAC7C,YAAM,SAAS,UAAU,SAAS,aAAa,UAAU;AAGzD,YAAM,KAAK,gCAAgC,MAAM,KAAK,QAAQ,KAAK,EAAE;AAGrE,YAAM;AAAA,QACJ,gCAAgC,MAAM,sBAAsB,QAAQ,YAAY;AAAA,MAAA;AAIlF,YAAM,KAAK,4BAA4B,MAAM,KAAK,QAAQ,UAAU,EAAE;AAGtE,YAAM,cAAc,QAAQ,gBAAgB,QAAQ,QAAQ;AAC5D,YAAM,cAAc,QAAQ,cAAc;AAC1C,YAAM,cAAc,QAAQ,cAAc;AAE1C,YAAM;AAAA,QACJ,gCAAgC,MAAM,oBAAoB,WAAW;AAAA,MAAA;AAEvE,YAAM;AAAA,QACJ,gCAAgC,MAAM,oBAAoB,WAAW;AAAA,MAAA;AAEvE,YAAM;AAAA,QACJ,gCAAgC,MAAM,oBAAoB,WAAW;AAAA,MAAA;AAAA,IAEzE;AAEA,WAAO,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAc;AACZ,SAAK,QAAQ,MAAA;AACb,SAAK,eAAe;AACpB,SAAK,YAAY,KAAK,IAAA;AAAA,EACxB;AACF;"}
|