@substrate-ai/core 0.19.54
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/README.md +55 -0
- package/dist/__tests__/adapter.test.d.ts +12 -0
- package/dist/__tests__/adapter.test.d.ts.map +1 -0
- package/dist/__tests__/adapter.test.js +259 -0
- package/dist/__tests__/adapter.test.js.map +1 -0
- package/dist/__tests__/event-bus.test.d.ts +14 -0
- package/dist/__tests__/event-bus.test.d.ts.map +1 -0
- package/dist/__tests__/event-bus.test.js +199 -0
- package/dist/__tests__/event-bus.test.js.map +1 -0
- package/dist/__tests__/output-quality.test.d.ts +8 -0
- package/dist/__tests__/output-quality.test.d.ts.map +1 -0
- package/dist/__tests__/output-quality.test.js +166 -0
- package/dist/__tests__/output-quality.test.js.map +1 -0
- package/dist/__tests__/schema-suffix.test.d.ts +9 -0
- package/dist/__tests__/schema-suffix.test.d.ts.map +1 -0
- package/dist/__tests__/schema-suffix.test.js +126 -0
- package/dist/__tests__/schema-suffix.test.js.map +1 -0
- package/dist/__tests__/yaml-parser.test.d.ts +18 -0
- package/dist/__tests__/yaml-parser.test.d.ts.map +1 -0
- package/dist/__tests__/yaml-parser.test.js +475 -0
- package/dist/__tests__/yaml-parser.test.js.map +1 -0
- package/dist/__type-checks__.d.ts +11 -0
- package/dist/__type-checks__.d.ts.map +1 -0
- package/dist/__type-checks__.js +19 -0
- package/dist/__type-checks__.js.map +1 -0
- package/dist/adapters/__tests__/adapter-output-normalizer.test.d.ts +12 -0
- package/dist/adapters/__tests__/adapter-output-normalizer.test.d.ts.map +1 -0
- package/dist/adapters/__tests__/adapter-output-normalizer.test.js +193 -0
- package/dist/adapters/__tests__/adapter-output-normalizer.test.js.map +1 -0
- package/dist/adapters/adapter-format-error.d.ts +35 -0
- package/dist/adapters/adapter-format-error.d.ts.map +1 -0
- package/dist/adapters/adapter-format-error.js +38 -0
- package/dist/adapters/adapter-format-error.js.map +1 -0
- package/dist/adapters/adapter-output-normalizer.d.ts +50 -0
- package/dist/adapters/adapter-output-normalizer.d.ts.map +1 -0
- package/dist/adapters/adapter-output-normalizer.js +233 -0
- package/dist/adapters/adapter-output-normalizer.js.map +1 -0
- package/dist/adapters/adapter-registry.d.ts +50 -0
- package/dist/adapters/adapter-registry.d.ts.map +1 -0
- package/dist/adapters/adapter-registry.js +101 -0
- package/dist/adapters/adapter-registry.js.map +1 -0
- package/dist/adapters/claude-adapter.d.ts +59 -0
- package/dist/adapters/claude-adapter.d.ts.map +1 -0
- package/dist/adapters/claude-adapter.js +367 -0
- package/dist/adapters/claude-adapter.js.map +1 -0
- package/dist/adapters/codex-adapter.d.ts +64 -0
- package/dist/adapters/codex-adapter.d.ts.map +1 -0
- package/dist/adapters/codex-adapter.js +263 -0
- package/dist/adapters/codex-adapter.js.map +1 -0
- package/dist/adapters/gemini-adapter.d.ts +57 -0
- package/dist/adapters/gemini-adapter.d.ts.map +1 -0
- package/dist/adapters/gemini-adapter.js +311 -0
- package/dist/adapters/gemini-adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +10 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +14 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/schemas.d.ts +137 -0
- package/dist/adapters/schemas.d.ts.map +1 -0
- package/dist/adapters/schemas.js +140 -0
- package/dist/adapters/schemas.js.map +1 -0
- package/dist/adapters/types.d.ts +245 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +6 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/adapters/worker-adapter.d.ts +188 -0
- package/dist/adapters/worker-adapter.d.ts.map +1 -0
- package/dist/adapters/worker-adapter.js +19 -0
- package/dist/adapters/worker-adapter.js.map +1 -0
- package/dist/budget/budget-tracker.d.ts +22 -0
- package/dist/budget/budget-tracker.d.ts.map +1 -0
- package/dist/budget/budget-tracker.js +39 -0
- package/dist/budget/budget-tracker.js.map +1 -0
- package/dist/budget/index.d.ts +6 -0
- package/dist/budget/index.d.ts.map +1 -0
- package/dist/budget/index.js +5 -0
- package/dist/budget/index.js.map +1 -0
- package/dist/config/config-migrator.d.ts +58 -0
- package/dist/config/config-migrator.d.ts.map +1 -0
- package/dist/config/config-migrator.js +158 -0
- package/dist/config/config-migrator.js.map +1 -0
- package/dist/config/config-system-impl.d.ts +63 -0
- package/dist/config/config-system-impl.d.ts.map +1 -0
- package/dist/config/config-system-impl.js +364 -0
- package/dist/config/config-system-impl.js.map +1 -0
- package/dist/config/config-watcher.d.ts +59 -0
- package/dist/config/config-watcher.d.ts.map +1 -0
- package/dist/config/config-watcher.js +137 -0
- package/dist/config/config-watcher.js.map +1 -0
- package/dist/config/defaults.d.ts +13 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +62 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/errors.d.ts +25 -0
- package/dist/config/errors.d.ts.map +1 -0
- package/dist/config/errors.js +49 -0
- package/dist/config/errors.js.map +1 -0
- package/dist/config/index.d.ts +19 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +39 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +456 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +174 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/version-utils.d.ts +39 -0
- package/dist/config/version-utils.d.ts.map +1 -0
- package/dist/config/version-utils.js +66 -0
- package/dist/config/version-utils.js.map +1 -0
- package/dist/context/index.d.ts +2 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +2 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/types.d.ts +113 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/context/types.js +59 -0
- package/dist/context/types.js.map +1 -0
- package/dist/cost-tracker/cost-tracker-impl.d.ts +51 -0
- package/dist/cost-tracker/cost-tracker-impl.d.ts.map +1 -0
- package/dist/cost-tracker/cost-tracker-impl.js +85 -0
- package/dist/cost-tracker/cost-tracker-impl.js.map +1 -0
- package/dist/cost-tracker/cost-tracker-subscriber.d.ts +31 -0
- package/dist/cost-tracker/cost-tracker-subscriber.d.ts.map +1 -0
- package/dist/cost-tracker/cost-tracker-subscriber.js +116 -0
- package/dist/cost-tracker/cost-tracker-subscriber.js.map +1 -0
- package/dist/cost-tracker/index.d.ts +11 -0
- package/dist/cost-tracker/index.d.ts.map +1 -0
- package/dist/cost-tracker/index.js +7 -0
- package/dist/cost-tracker/index.js.map +1 -0
- package/dist/cost-tracker/token-rates.d.ts +25 -0
- package/dist/cost-tracker/token-rates.d.ts.map +1 -0
- package/dist/cost-tracker/token-rates.js +99 -0
- package/dist/cost-tracker/token-rates.js.map +1 -0
- package/dist/cost-tracker/types.d.ts +6 -0
- package/dist/cost-tracker/types.d.ts.map +1 -0
- package/dist/cost-tracker/types.js +2 -0
- package/dist/cost-tracker/types.js.map +1 -0
- package/dist/dispatch/dispatcher-impl.d.ts +92 -0
- package/dist/dispatch/dispatcher-impl.d.ts.map +1 -0
- package/dist/dispatch/dispatcher-impl.js +847 -0
- package/dist/dispatch/dispatcher-impl.js.map +1 -0
- package/dist/dispatch/index.d.ts +15 -0
- package/dist/dispatch/index.d.ts.map +1 -0
- package/dist/dispatch/index.js +14 -0
- package/dist/dispatch/index.js.map +1 -0
- package/dist/dispatch/interface-change-detector.d.ts +46 -0
- package/dist/dispatch/interface-change-detector.d.ts.map +1 -0
- package/dist/dispatch/interface-change-detector.js +135 -0
- package/dist/dispatch/interface-change-detector.js.map +1 -0
- package/dist/dispatch/output-quality.d.ts +43 -0
- package/dist/dispatch/output-quality.d.ts.map +1 -0
- package/dist/dispatch/output-quality.js +148 -0
- package/dist/dispatch/output-quality.js.map +1 -0
- package/dist/dispatch/types.d.ts +271 -0
- package/dist/dispatch/types.d.ts.map +1 -0
- package/dist/dispatch/types.js +76 -0
- package/dist/dispatch/types.js.map +1 -0
- package/dist/dispatch/yaml-parser.d.ts +40 -0
- package/dist/dispatch/yaml-parser.d.ts.map +1 -0
- package/dist/dispatch/yaml-parser.js +323 -0
- package/dist/dispatch/yaml-parser.js.map +1 -0
- package/dist/events/core-events.d.ts +288 -0
- package/dist/events/core-events.d.ts.map +1 -0
- package/dist/events/core-events.js +10 -0
- package/dist/events/core-events.js.map +1 -0
- package/dist/events/event-bus.d.ts +55 -0
- package/dist/events/event-bus.d.ts.map +1 -0
- package/dist/events/event-bus.js +52 -0
- package/dist/events/event-bus.js.map +1 -0
- package/dist/events/index.d.ts +9 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +6 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/types.d.ts +21 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +8 -0
- package/dist/events/types.js.map +1 -0
- package/dist/git/git-manager.d.ts +31 -0
- package/dist/git/git-manager.d.ts.map +1 -0
- package/dist/git/git-manager.js +46 -0
- package/dist/git/git-manager.js.map +1 -0
- package/dist/git/git-utils.d.ts +166 -0
- package/dist/git/git-utils.d.ts.map +1 -0
- package/dist/git/git-utils.js +347 -0
- package/dist/git/git-utils.js.map +1 -0
- package/dist/git/git-worktree-manager-impl.d.ts +58 -0
- package/dist/git/git-worktree-manager-impl.d.ts.map +1 -0
- package/dist/git/git-worktree-manager-impl.js +336 -0
- package/dist/git/git-worktree-manager-impl.js.map +1 -0
- package/dist/git/git-worktree-manager.d.ts +122 -0
- package/dist/git/git-worktree-manager.d.ts.map +1 -0
- package/dist/git/git-worktree-manager.js +14 -0
- package/dist/git/git-worktree-manager.js.map +1 -0
- package/dist/git/index.d.ts +11 -0
- package/dist/git/index.d.ts.map +1 -0
- package/dist/git/index.js +8 -0
- package/dist/git/index.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/client.d.ts +42 -0
- package/dist/llm/client.d.ts.map +1 -0
- package/dist/llm/client.js +27 -0
- package/dist/llm/client.js.map +1 -0
- package/dist/monitor/index.d.ts +15 -0
- package/dist/monitor/index.d.ts.map +1 -0
- package/dist/monitor/index.js +9 -0
- package/dist/monitor/index.js.map +1 -0
- package/dist/monitor/monitor-agent-impl.d.ts +56 -0
- package/dist/monitor/monitor-agent-impl.d.ts.map +1 -0
- package/dist/monitor/monitor-agent-impl.js +178 -0
- package/dist/monitor/monitor-agent-impl.js.map +1 -0
- package/dist/monitor/monitor-agent.d.ts +36 -0
- package/dist/monitor/monitor-agent.d.ts.map +1 -0
- package/dist/monitor/monitor-agent.js +6 -0
- package/dist/monitor/monitor-agent.js.map +1 -0
- package/dist/monitor/performance-aggregates.d.ts +41 -0
- package/dist/monitor/performance-aggregates.d.ts.map +1 -0
- package/dist/monitor/performance-aggregates.js +6 -0
- package/dist/monitor/performance-aggregates.js.map +1 -0
- package/dist/monitor/recommendation-engine.d.ts +27 -0
- package/dist/monitor/recommendation-engine.d.ts.map +1 -0
- package/dist/monitor/recommendation-engine.js +140 -0
- package/dist/monitor/recommendation-engine.js.map +1 -0
- package/dist/monitor/recommendation-types.d.ts +30 -0
- package/dist/monitor/recommendation-types.d.ts.map +1 -0
- package/dist/monitor/recommendation-types.js +43 -0
- package/dist/monitor/recommendation-types.js.map +1 -0
- package/dist/monitor/report-generator.d.ts +48 -0
- package/dist/monitor/report-generator.d.ts.map +1 -0
- package/dist/monitor/report-generator.js +123 -0
- package/dist/monitor/report-generator.js.map +1 -0
- package/dist/monitor/task-type-classifier.d.ts +19 -0
- package/dist/monitor/task-type-classifier.d.ts.map +1 -0
- package/dist/monitor/task-type-classifier.js +68 -0
- package/dist/monitor/task-type-classifier.js.map +1 -0
- package/dist/persistence/adapter.d.ts +4 -0
- package/dist/persistence/adapter.d.ts.map +1 -0
- package/dist/persistence/adapter.js +56 -0
- package/dist/persistence/adapter.js.map +1 -0
- package/dist/persistence/cost-types.d.ts +87 -0
- package/dist/persistence/cost-types.d.ts.map +1 -0
- package/dist/persistence/cost-types.js +14 -0
- package/dist/persistence/cost-types.js.map +1 -0
- package/dist/persistence/dolt-adapter-transaction.test.d.ts +10 -0
- package/dist/persistence/dolt-adapter-transaction.test.d.ts.map +1 -0
- package/dist/persistence/dolt-adapter-transaction.test.js +359 -0
- package/dist/persistence/dolt-adapter-transaction.test.js.map +1 -0
- package/dist/persistence/dolt-adapter.d.ts +77 -0
- package/dist/persistence/dolt-adapter.d.ts.map +1 -0
- package/dist/persistence/dolt-adapter.js +98 -0
- package/dist/persistence/dolt-adapter.js.map +1 -0
- package/dist/persistence/dolt-client.d.ts +69 -0
- package/dist/persistence/dolt-client.d.ts.map +1 -0
- package/dist/persistence/dolt-client.js +278 -0
- package/dist/persistence/dolt-client.js.map +1 -0
- package/dist/persistence/dolt-errors.d.ts +10 -0
- package/dist/persistence/dolt-errors.d.ts.map +1 -0
- package/dist/persistence/dolt-errors.js +15 -0
- package/dist/persistence/dolt-errors.js.map +1 -0
- package/dist/persistence/dolt-init.d.ts +64 -0
- package/dist/persistence/dolt-init.d.ts.map +1 -0
- package/dist/persistence/dolt-init.js +233 -0
- package/dist/persistence/dolt-init.js.map +1 -0
- package/dist/persistence/index.d.ts +23 -0
- package/dist/persistence/index.d.ts.map +1 -0
- package/dist/persistence/index.js +23 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/persistence/memory-adapter.d.ts +156 -0
- package/dist/persistence/memory-adapter.d.ts.map +1 -0
- package/dist/persistence/memory-adapter.js +1167 -0
- package/dist/persistence/memory-adapter.js.map +1 -0
- package/dist/persistence/monitor-database.d.ts +113 -0
- package/dist/persistence/monitor-database.d.ts.map +1 -0
- package/dist/persistence/monitor-database.js +345 -0
- package/dist/persistence/monitor-database.js.map +1 -0
- package/dist/persistence/queries/amendments.d.ts +91 -0
- package/dist/persistence/queries/amendments.d.ts.map +1 -0
- package/dist/persistence/queries/amendments.js +185 -0
- package/dist/persistence/queries/amendments.js.map +1 -0
- package/dist/persistence/queries/cost.d.ts +130 -0
- package/dist/persistence/queries/cost.d.ts.map +1 -0
- package/dist/persistence/queries/cost.js +384 -0
- package/dist/persistence/queries/cost.js.map +1 -0
- package/dist/persistence/queries/decisions.d.ts +131 -0
- package/dist/persistence/queries/decisions.d.ts.map +1 -0
- package/dist/persistence/queries/decisions.js +339 -0
- package/dist/persistence/queries/decisions.js.map +1 -0
- package/dist/persistence/queries/metrics.d.ts +155 -0
- package/dist/persistence/queries/metrics.d.ts.map +1 -0
- package/dist/persistence/queries/metrics.js +237 -0
- package/dist/persistence/queries/metrics.js.map +1 -0
- package/dist/persistence/queries/retry-escalated.d.ts +35 -0
- package/dist/persistence/queries/retry-escalated.d.ts.map +1 -0
- package/dist/persistence/queries/retry-escalated.js +83 -0
- package/dist/persistence/queries/retry-escalated.js.map +1 -0
- package/dist/persistence/schema-version.d.ts +89 -0
- package/dist/persistence/schema-version.d.ts.map +1 -0
- package/dist/persistence/schema-version.js +67 -0
- package/dist/persistence/schema-version.js.map +1 -0
- package/dist/persistence/schema.d.ts +26 -0
- package/dist/persistence/schema.d.ts.map +1 -0
- package/dist/persistence/schema.js +509 -0
- package/dist/persistence/schema.js.map +1 -0
- package/dist/persistence/schemas/decisions.d.ts +176 -0
- package/dist/persistence/schemas/decisions.d.ts.map +1 -0
- package/dist/persistence/schemas/decisions.js +139 -0
- package/dist/persistence/schemas/decisions.js.map +1 -0
- package/dist/persistence/schemas/operational.d.ts +194 -0
- package/dist/persistence/schemas/operational.d.ts.map +1 -0
- package/dist/persistence/schemas/operational.js +197 -0
- package/dist/persistence/schemas/operational.js.map +1 -0
- package/dist/persistence/types.d.ts +98 -0
- package/dist/persistence/types.d.ts.map +1 -0
- package/dist/persistence/types.js +22 -0
- package/dist/persistence/types.js.map +1 -0
- package/dist/quality-gates/index.d.ts +2 -0
- package/dist/quality-gates/index.d.ts.map +1 -0
- package/dist/quality-gates/index.js +2 -0
- package/dist/quality-gates/index.js.map +1 -0
- package/dist/quality-gates/types.d.ts +106 -0
- package/dist/quality-gates/types.d.ts.map +1 -0
- package/dist/quality-gates/types.js +5 -0
- package/dist/quality-gates/types.js.map +1 -0
- package/dist/routing/index.d.ts +19 -0
- package/dist/routing/index.d.ts.map +1 -0
- package/dist/routing/index.js +32 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/routing/model-routing-config.d.ts +75 -0
- package/dist/routing/model-routing-config.d.ts.map +1 -0
- package/dist/routing/model-routing-config.js +110 -0
- package/dist/routing/model-routing-config.js.map +1 -0
- package/dist/routing/model-routing-resolver.d.ts +48 -0
- package/dist/routing/model-routing-resolver.d.ts.map +1 -0
- package/dist/routing/model-routing-resolver.js +105 -0
- package/dist/routing/model-routing-resolver.js.map +1 -0
- package/dist/routing/model-tier.d.ts +21 -0
- package/dist/routing/model-tier.d.ts.map +1 -0
- package/dist/routing/model-tier.js +34 -0
- package/dist/routing/model-tier.js.map +1 -0
- package/dist/routing/provider-status.d.ts +99 -0
- package/dist/routing/provider-status.d.ts.map +1 -0
- package/dist/routing/provider-status.js +163 -0
- package/dist/routing/provider-status.js.map +1 -0
- package/dist/routing/routing-decision.d.ts +127 -0
- package/dist/routing/routing-decision.d.ts.map +1 -0
- package/dist/routing/routing-decision.js +111 -0
- package/dist/routing/routing-decision.js.map +1 -0
- package/dist/routing/routing-engine-impl.d.ts +132 -0
- package/dist/routing/routing-engine-impl.d.ts.map +1 -0
- package/dist/routing/routing-engine-impl.js +450 -0
- package/dist/routing/routing-engine-impl.js.map +1 -0
- package/dist/routing/routing-engine.d.ts +83 -0
- package/dist/routing/routing-engine.d.ts.map +1 -0
- package/dist/routing/routing-engine.js +24 -0
- package/dist/routing/routing-engine.js.map +1 -0
- package/dist/routing/routing-policy.d.ts +138 -0
- package/dist/routing/routing-policy.d.ts.map +1 -0
- package/dist/routing/routing-policy.js +159 -0
- package/dist/routing/routing-policy.js.map +1 -0
- package/dist/routing/routing-recommender.d.ts +60 -0
- package/dist/routing/routing-recommender.d.ts.map +1 -0
- package/dist/routing/routing-recommender.js +209 -0
- package/dist/routing/routing-recommender.js.map +1 -0
- package/dist/routing/routing-telemetry.d.ts +36 -0
- package/dist/routing/routing-telemetry.d.ts.map +1 -0
- package/dist/routing/routing-telemetry.js +39 -0
- package/dist/routing/routing-telemetry.js.map +1 -0
- package/dist/routing/routing-token-accumulator.d.ts +68 -0
- package/dist/routing/routing-token-accumulator.d.ts.map +1 -0
- package/dist/routing/routing-token-accumulator.js +111 -0
- package/dist/routing/routing-token-accumulator.js.map +1 -0
- package/dist/routing/routing-tuner.d.ts +69 -0
- package/dist/routing/routing-tuner.d.ts.map +1 -0
- package/dist/routing/routing-tuner.js +217 -0
- package/dist/routing/routing-tuner.js.map +1 -0
- package/dist/routing/types.d.ts +152 -0
- package/dist/routing/types.d.ts.map +1 -0
- package/dist/routing/types.js +13 -0
- package/dist/routing/types.js.map +1 -0
- package/dist/supervisor/analysis.d.ts +178 -0
- package/dist/supervisor/analysis.d.ts.map +1 -0
- package/dist/supervisor/analysis.js +420 -0
- package/dist/supervisor/analysis.js.map +1 -0
- package/dist/supervisor/experimenter.d.ts +118 -0
- package/dist/supervisor/experimenter.d.ts.map +1 -0
- package/dist/supervisor/experimenter.js +493 -0
- package/dist/supervisor/experimenter.js.map +1 -0
- package/dist/supervisor/index.d.ts +13 -0
- package/dist/supervisor/index.d.ts.map +1 -0
- package/dist/supervisor/index.js +11 -0
- package/dist/supervisor/index.js.map +1 -0
- package/dist/telemetry/batch-buffer.d.ts +53 -0
- package/dist/telemetry/batch-buffer.d.ts.map +1 -0
- package/dist/telemetry/batch-buffer.js +83 -0
- package/dist/telemetry/batch-buffer.js.map +1 -0
- package/dist/telemetry/categorizer.d.ts +65 -0
- package/dist/telemetry/categorizer.d.ts.map +1 -0
- package/dist/telemetry/categorizer.js +338 -0
- package/dist/telemetry/categorizer.js.map +1 -0
- package/dist/telemetry/consumer-analyzer.d.ts +53 -0
- package/dist/telemetry/consumer-analyzer.d.ts.map +1 -0
- package/dist/telemetry/consumer-analyzer.js +182 -0
- package/dist/telemetry/consumer-analyzer.js.map +1 -0
- package/dist/telemetry/cost-table.d.ts +36 -0
- package/dist/telemetry/cost-table.d.ts.map +1 -0
- package/dist/telemetry/cost-table.js +127 -0
- package/dist/telemetry/cost-table.js.map +1 -0
- package/dist/telemetry/efficiency-scorer.d.ts +103 -0
- package/dist/telemetry/efficiency-scorer.d.ts.map +1 -0
- package/dist/telemetry/efficiency-scorer.js +311 -0
- package/dist/telemetry/efficiency-scorer.js.map +1 -0
- package/dist/telemetry/index.d.ts +28 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +37 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/ingestion-server.d.ts +99 -0
- package/dist/telemetry/ingestion-server.d.ts.map +1 -0
- package/dist/telemetry/ingestion-server.js +315 -0
- package/dist/telemetry/ingestion-server.js.map +1 -0
- package/dist/telemetry/log-turn-analyzer.d.ts +35 -0
- package/dist/telemetry/log-turn-analyzer.d.ts.map +1 -0
- package/dist/telemetry/log-turn-analyzer.js +132 -0
- package/dist/telemetry/log-turn-analyzer.js.map +1 -0
- package/dist/telemetry/normalizer.d.ts +43 -0
- package/dist/telemetry/normalizer.d.ts.map +1 -0
- package/dist/telemetry/normalizer.js +320 -0
- package/dist/telemetry/normalizer.js.map +1 -0
- package/dist/telemetry/recommender.d.ts +116 -0
- package/dist/telemetry/recommender.d.ts.map +1 -0
- package/dist/telemetry/recommender.js +532 -0
- package/dist/telemetry/recommender.js.map +1 -0
- package/dist/telemetry/source-detector.d.ts +19 -0
- package/dist/telemetry/source-detector.d.ts.map +1 -0
- package/dist/telemetry/source-detector.js +73 -0
- package/dist/telemetry/source-detector.js.map +1 -0
- package/dist/telemetry/task-baselines.d.ts +30 -0
- package/dist/telemetry/task-baselines.d.ts.map +1 -0
- package/dist/telemetry/task-baselines.js +44 -0
- package/dist/telemetry/task-baselines.js.map +1 -0
- package/dist/telemetry/telemetry-pipeline.d.ts +122 -0
- package/dist/telemetry/telemetry-pipeline.d.ts.map +1 -0
- package/dist/telemetry/telemetry-pipeline.js +349 -0
- package/dist/telemetry/telemetry-pipeline.js.map +1 -0
- package/dist/telemetry/timestamp-normalizer.d.ts +32 -0
- package/dist/telemetry/timestamp-normalizer.d.ts.map +1 -0
- package/dist/telemetry/timestamp-normalizer.js +133 -0
- package/dist/telemetry/timestamp-normalizer.js.map +1 -0
- package/dist/telemetry/token-extractor.d.ts +57 -0
- package/dist/telemetry/token-extractor.d.ts.map +1 -0
- package/dist/telemetry/token-extractor.js +200 -0
- package/dist/telemetry/token-extractor.js.map +1 -0
- package/dist/telemetry/turn-analyzer.d.ts +34 -0
- package/dist/telemetry/turn-analyzer.d.ts.map +1 -0
- package/dist/telemetry/turn-analyzer.js +101 -0
- package/dist/telemetry/turn-analyzer.js.map +1 -0
- package/dist/telemetry/types.d.ts +456 -0
- package/dist/telemetry/types.d.ts.map +1 -0
- package/dist/telemetry/types.js +186 -0
- package/dist/telemetry/types.js.map +1 -0
- package/dist/types.d.ts +80 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/version-manager/index.d.ts +11 -0
- package/dist/version-manager/index.d.ts.map +1 -0
- package/dist/version-manager/index.js +8 -0
- package/dist/version-manager/index.js.map +1 -0
- package/dist/version-manager/update-checker.d.ts +44 -0
- package/dist/version-manager/update-checker.d.ts.map +1 -0
- package/dist/version-manager/update-checker.js +171 -0
- package/dist/version-manager/update-checker.js.map +1 -0
- package/dist/version-manager/version-cache.d.ts +42 -0
- package/dist/version-manager/version-cache.d.ts.map +1 -0
- package/dist/version-manager/version-cache.js +69 -0
- package/dist/version-manager/version-cache.js.map +1 -0
- package/dist/version-manager/version-manager-impl.d.ts +81 -0
- package/dist/version-manager/version-manager-impl.d.ts.map +1 -0
- package/dist/version-manager/version-manager-impl.js +223 -0
- package/dist/version-manager/version-manager-impl.js.map +1 -0
- package/dist/version-manager/version-manager.d.ts +70 -0
- package/dist/version-manager/version-manager.d.ts.map +1 -0
- package/dist/version-manager/version-manager.js +8 -0
- package/dist/version-manager/version-manager.js.map +1 -0
- package/package.json +27 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timestamp normalization for OTLP telemetry payloads.
|
|
3
|
+
*
|
|
4
|
+
* OTLP payloads use nanosecond integers for timestamps (e.g. `startTimeUnixNano`).
|
|
5
|
+
* Claude Code and other providers may emit timestamps in various formats.
|
|
6
|
+
*
|
|
7
|
+
* `normalizeTimestamp()` accepts any unknown value and returns a Unix millisecond
|
|
8
|
+
* number. Null/undefined/unparseable inputs fall back to `Date.now()`.
|
|
9
|
+
*
|
|
10
|
+
* Detection order (after ISO string check):
|
|
11
|
+
* 1. Nanoseconds (>= 1e18)
|
|
12
|
+
* 2. Microseconds (>= 1e15)
|
|
13
|
+
* 3. Milliseconds (>= 1e12)
|
|
14
|
+
* 4. Seconds (< 1e12)
|
|
15
|
+
*/
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// normalizeTimestamp
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
/**
|
|
20
|
+
* Normalize any timestamp value to Unix milliseconds.
|
|
21
|
+
*
|
|
22
|
+
* Handles:
|
|
23
|
+
* - ISO 8601 strings (e.g. "2024-03-08T12:00:00Z")
|
|
24
|
+
* - Nanosecond integers or numeric strings (>= 1e18)
|
|
25
|
+
* - Microsecond integers or numeric strings (>= 1e15)
|
|
26
|
+
* - Millisecond integers or numeric strings (>= 1e12)
|
|
27
|
+
* - Second integers or numeric strings (< 1e12)
|
|
28
|
+
* - BigInt string values from OTLP `startTimeUnixNano` (e.g. "1709900000000000000")
|
|
29
|
+
* - null / undefined / unparseable → falls back to Date.now()
|
|
30
|
+
*
|
|
31
|
+
* @param value - Raw timestamp value of unknown type
|
|
32
|
+
* @returns Unix millisecond timestamp
|
|
33
|
+
*/
|
|
34
|
+
export function normalizeTimestamp(value) {
|
|
35
|
+
if (value === null || value === undefined) {
|
|
36
|
+
return Date.now();
|
|
37
|
+
}
|
|
38
|
+
// ISO 8601 string
|
|
39
|
+
if (typeof value === 'string') {
|
|
40
|
+
// Try ISO 8601 date string first (contains non-digit characters beyond just digits)
|
|
41
|
+
if (isIsoDateString(value)) {
|
|
42
|
+
const parsed = Date.parse(value);
|
|
43
|
+
if (!isNaN(parsed)) {
|
|
44
|
+
return parsed;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Numeric string (potentially bigint nanosecond from OTLP)
|
|
48
|
+
// Use BigInt for large nanosecond values to avoid floating point precision loss
|
|
49
|
+
const trimmed = value.trim();
|
|
50
|
+
if (/^\d+$/.test(trimmed)) {
|
|
51
|
+
try {
|
|
52
|
+
const big = BigInt(trimmed);
|
|
53
|
+
return bigIntToMillis(big);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// fall through
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return Date.now();
|
|
60
|
+
}
|
|
61
|
+
// BigInt
|
|
62
|
+
if (typeof value === 'bigint') {
|
|
63
|
+
return bigIntToMillis(value);
|
|
64
|
+
}
|
|
65
|
+
// Number
|
|
66
|
+
if (typeof value === 'number') {
|
|
67
|
+
if (!isFinite(value) || isNaN(value)) {
|
|
68
|
+
return Date.now();
|
|
69
|
+
}
|
|
70
|
+
return numericToMillis(value);
|
|
71
|
+
}
|
|
72
|
+
return Date.now();
|
|
73
|
+
}
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
// Helpers
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
/**
|
|
78
|
+
* Returns true if the string looks like an ISO 8601 date string
|
|
79
|
+
* (contains letters or dashes/colons in date-like positions).
|
|
80
|
+
*/
|
|
81
|
+
function isIsoDateString(value) {
|
|
82
|
+
// Quick check: contains 'T' or '-' in date-like format, or ends with 'Z'
|
|
83
|
+
return (/^\d{4}-\d{2}-\d{2}/.test(value) ||
|
|
84
|
+
/Z$/.test(value) ||
|
|
85
|
+
/[+-]\d{2}:\d{2}$/.test(value) ||
|
|
86
|
+
value.includes('T'));
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Convert a BigInt nanosecond/microsecond/millisecond/second value to milliseconds.
|
|
90
|
+
*/
|
|
91
|
+
function bigIntToMillis(value) {
|
|
92
|
+
const NS_THRESHOLD = BigInt('1000000000000000000'); // 1e18
|
|
93
|
+
const US_THRESHOLD = BigInt('1000000000000000'); // 1e15
|
|
94
|
+
const MS_THRESHOLD = BigInt('1000000000000'); // 1e12
|
|
95
|
+
if (value >= NS_THRESHOLD) {
|
|
96
|
+
// Nanoseconds → milliseconds
|
|
97
|
+
return Number(value / BigInt(1_000_000));
|
|
98
|
+
}
|
|
99
|
+
else if (value >= US_THRESHOLD) {
|
|
100
|
+
// Microseconds → milliseconds
|
|
101
|
+
return Number(value / BigInt(1_000));
|
|
102
|
+
}
|
|
103
|
+
else if (value >= MS_THRESHOLD) {
|
|
104
|
+
// Already milliseconds
|
|
105
|
+
return Number(value);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
// Seconds → milliseconds
|
|
109
|
+
return Number(value) * 1_000;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Convert a numeric value to milliseconds based on magnitude.
|
|
114
|
+
*/
|
|
115
|
+
function numericToMillis(value) {
|
|
116
|
+
if (value >= 1e18) {
|
|
117
|
+
// Nanoseconds
|
|
118
|
+
return Math.floor(value / 1_000_000);
|
|
119
|
+
}
|
|
120
|
+
else if (value >= 1e15) {
|
|
121
|
+
// Microseconds
|
|
122
|
+
return Math.floor(value / 1_000);
|
|
123
|
+
}
|
|
124
|
+
else if (value >= 1e12) {
|
|
125
|
+
// Milliseconds
|
|
126
|
+
return Math.floor(value);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
// Seconds
|
|
130
|
+
return Math.floor(value * 1_000);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=timestamp-normalizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timestamp-normalizer.js","sourceRoot":"","sources":["../../src/telemetry/timestamp-normalizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token extraction from OTLP span/log attributes and body JSON.
|
|
3
|
+
*
|
|
4
|
+
* OTLP payloads from different LLM providers use varying attribute naming
|
|
5
|
+
* conventions for token counts. This module provides fuzzy extraction via
|
|
6
|
+
* case-insensitive substring pattern matching.
|
|
7
|
+
*
|
|
8
|
+
* Priority: attributes take precedence over body for each field.
|
|
9
|
+
* Body fallback: parses JSON and recursively searches up to depth 4.
|
|
10
|
+
*/
|
|
11
|
+
import type { TokenCounts } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* A single OTLP attribute entry.
|
|
14
|
+
*/
|
|
15
|
+
interface OtlpAttributeValue {
|
|
16
|
+
stringValue?: string;
|
|
17
|
+
intValue?: string | number;
|
|
18
|
+
doubleValue?: string | number;
|
|
19
|
+
boolValue?: boolean;
|
|
20
|
+
}
|
|
21
|
+
interface OtlpAttribute {
|
|
22
|
+
key: string;
|
|
23
|
+
value: OtlpAttributeValue;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Extract token counts from an OTLP attributes array.
|
|
27
|
+
*
|
|
28
|
+
* Matches attribute keys case-insensitively against known patterns.
|
|
29
|
+
* The first matching value for each field wins.
|
|
30
|
+
*
|
|
31
|
+
* @param attributes - Array of OTLP attribute entries
|
|
32
|
+
* @returns Partial token counts (only fields found in attributes)
|
|
33
|
+
*/
|
|
34
|
+
export declare function extractTokensFromAttributes(attributes: OtlpAttribute[] | undefined | null): Partial<TokenCounts>;
|
|
35
|
+
/**
|
|
36
|
+
* Extract token counts from a JSON body string via recursive search.
|
|
37
|
+
*
|
|
38
|
+
* Parses the body as JSON and recursively walks the object tree up to
|
|
39
|
+
* depth 4, looking for keys matching token patterns.
|
|
40
|
+
*
|
|
41
|
+
* @param body - Raw body string (may be JSON)
|
|
42
|
+
* @returns Partial token counts found in body
|
|
43
|
+
*/
|
|
44
|
+
export declare function extractTokensFromBody(body: string | undefined | null): Partial<TokenCounts>;
|
|
45
|
+
/**
|
|
46
|
+
* Merge attribute-derived and body-derived token counts.
|
|
47
|
+
*
|
|
48
|
+
* Attributes take priority over body for each field.
|
|
49
|
+
* Missing fields default to 0.
|
|
50
|
+
*
|
|
51
|
+
* @param fromAttributes - Token counts from attributes (higher priority)
|
|
52
|
+
* @param fromBody - Token counts from body JSON (lower priority)
|
|
53
|
+
* @returns Complete TokenCounts with all fields
|
|
54
|
+
*/
|
|
55
|
+
export declare function mergeTokenCounts(fromAttributes: Partial<TokenCounts>, fromBody: Partial<TokenCounts>): TokenCounts;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=token-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-extractor.d.ts","sourceRoot":"","sources":["../../src/telemetry/token-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAM7C;;GAEG;AACH,UAAU,kBAAkB;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,UAAU,aAAa;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,kBAAkB,CAAA;CAC1B;AAwBD;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,aAAa,EAAE,GAAG,SAAS,GAAG,IAAI,GAC7C,OAAO,CAAC,WAAW,CAAC,CAmCtB;AAMD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAa3F;AAMD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,OAAO,CAAC,WAAW,CAAC,EACpC,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,GAC7B,WAAW,CAOb"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token extraction from OTLP span/log attributes and body JSON.
|
|
3
|
+
*
|
|
4
|
+
* OTLP payloads from different LLM providers use varying attribute naming
|
|
5
|
+
* conventions for token counts. This module provides fuzzy extraction via
|
|
6
|
+
* case-insensitive substring pattern matching.
|
|
7
|
+
*
|
|
8
|
+
* Priority: attributes take precedence over body for each field.
|
|
9
|
+
* Body fallback: parses JSON and recursively searches up to depth 4.
|
|
10
|
+
*/
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Pattern definitions
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
/**
|
|
15
|
+
* Patterns for matching attribute keys to token fields.
|
|
16
|
+
* Each pattern is checked case-insensitively via substring match.
|
|
17
|
+
*
|
|
18
|
+
* IMPORTANT: more-specific patterns (cacheRead, cacheCreation) MUST come first
|
|
19
|
+
* so that keys like `cache_read_input_tokens` match `cache_read` before `input_token`.
|
|
20
|
+
*/
|
|
21
|
+
const TOKEN_PATTERNS = {
|
|
22
|
+
cacheRead: ['cache_read'],
|
|
23
|
+
cacheCreation: ['cache_creation', 'cache_write'],
|
|
24
|
+
input: ['input_token', 'prompt_token'],
|
|
25
|
+
output: ['output_token', 'completion_token'],
|
|
26
|
+
};
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// extractTokensFromAttributes
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
/**
|
|
31
|
+
* Extract token counts from an OTLP attributes array.
|
|
32
|
+
*
|
|
33
|
+
* Matches attribute keys case-insensitively against known patterns.
|
|
34
|
+
* The first matching value for each field wins.
|
|
35
|
+
*
|
|
36
|
+
* @param attributes - Array of OTLP attribute entries
|
|
37
|
+
* @returns Partial token counts (only fields found in attributes)
|
|
38
|
+
*/
|
|
39
|
+
export function extractTokensFromAttributes(attributes) {
|
|
40
|
+
if (!Array.isArray(attributes) || attributes.length === 0) {
|
|
41
|
+
return {};
|
|
42
|
+
}
|
|
43
|
+
const result = {};
|
|
44
|
+
for (const attr of attributes) {
|
|
45
|
+
if (!attr?.key || !attr?.value)
|
|
46
|
+
continue;
|
|
47
|
+
const keyLower = attr.key.toLowerCase();
|
|
48
|
+
const numValue = resolveAttrValue(attr.value);
|
|
49
|
+
if (numValue === undefined)
|
|
50
|
+
continue;
|
|
51
|
+
// Each attribute maps to at most ONE field (first match in priority order wins).
|
|
52
|
+
// cacheRead/cacheCreation patterns are checked before input/output so that
|
|
53
|
+
// keys like `cache_read_input_tokens` do NOT also match `input_token`.
|
|
54
|
+
let matched = false;
|
|
55
|
+
for (const [field, patterns] of Object.entries(TOKEN_PATTERNS)) {
|
|
56
|
+
if (matched)
|
|
57
|
+
break;
|
|
58
|
+
if (result[field] !== undefined)
|
|
59
|
+
continue;
|
|
60
|
+
for (const pattern of patterns) {
|
|
61
|
+
if (keyLower.includes(pattern)) {
|
|
62
|
+
;
|
|
63
|
+
result[field] = numValue;
|
|
64
|
+
matched = true;
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
// ---------------------------------------------------------------------------
|
|
73
|
+
// extractTokensFromBody
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
/**
|
|
76
|
+
* Extract token counts from a JSON body string via recursive search.
|
|
77
|
+
*
|
|
78
|
+
* Parses the body as JSON and recursively walks the object tree up to
|
|
79
|
+
* depth 4, looking for keys matching token patterns.
|
|
80
|
+
*
|
|
81
|
+
* @param body - Raw body string (may be JSON)
|
|
82
|
+
* @returns Partial token counts found in body
|
|
83
|
+
*/
|
|
84
|
+
export function extractTokensFromBody(body) {
|
|
85
|
+
if (!body || typeof body !== 'string') {
|
|
86
|
+
return {};
|
|
87
|
+
}
|
|
88
|
+
let parsed;
|
|
89
|
+
try {
|
|
90
|
+
parsed = JSON.parse(body);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return {};
|
|
94
|
+
}
|
|
95
|
+
return searchObjectForTokens(parsed, 0);
|
|
96
|
+
}
|
|
97
|
+
// ---------------------------------------------------------------------------
|
|
98
|
+
// mergeTokenCounts
|
|
99
|
+
// ---------------------------------------------------------------------------
|
|
100
|
+
/**
|
|
101
|
+
* Merge attribute-derived and body-derived token counts.
|
|
102
|
+
*
|
|
103
|
+
* Attributes take priority over body for each field.
|
|
104
|
+
* Missing fields default to 0.
|
|
105
|
+
*
|
|
106
|
+
* @param fromAttributes - Token counts from attributes (higher priority)
|
|
107
|
+
* @param fromBody - Token counts from body JSON (lower priority)
|
|
108
|
+
* @returns Complete TokenCounts with all fields
|
|
109
|
+
*/
|
|
110
|
+
export function mergeTokenCounts(fromAttributes, fromBody) {
|
|
111
|
+
return {
|
|
112
|
+
input: fromAttributes.input ?? fromBody.input ?? 0,
|
|
113
|
+
output: fromAttributes.output ?? fromBody.output ?? 0,
|
|
114
|
+
cacheRead: fromAttributes.cacheRead ?? fromBody.cacheRead ?? 0,
|
|
115
|
+
cacheCreation: fromAttributes.cacheCreation ?? fromBody.cacheCreation ?? 0,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
// ---------------------------------------------------------------------------
|
|
119
|
+
// Helpers
|
|
120
|
+
// ---------------------------------------------------------------------------
|
|
121
|
+
/**
|
|
122
|
+
* Resolve an OTLP attribute value to a number.
|
|
123
|
+
* OTLP integer values arrive as strings (e.g. `"intValue": "2048"`).
|
|
124
|
+
*/
|
|
125
|
+
function resolveAttrValue(value) {
|
|
126
|
+
if (value.intValue !== undefined) {
|
|
127
|
+
const n = Number(value.intValue);
|
|
128
|
+
return isFinite(n) ? n : undefined;
|
|
129
|
+
}
|
|
130
|
+
if (value.doubleValue !== undefined) {
|
|
131
|
+
const n = Number(value.doubleValue);
|
|
132
|
+
return isFinite(n) ? n : undefined;
|
|
133
|
+
}
|
|
134
|
+
if (value.stringValue !== undefined) {
|
|
135
|
+
const n = Number(value.stringValue);
|
|
136
|
+
if (!isNaN(n) && isFinite(n))
|
|
137
|
+
return n;
|
|
138
|
+
}
|
|
139
|
+
return undefined;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Recursively search an object for token count fields up to maxDepth.
|
|
143
|
+
*/
|
|
144
|
+
function searchObjectForTokens(obj, depth) {
|
|
145
|
+
if (depth >= 4 || obj === null || typeof obj !== 'object') {
|
|
146
|
+
return {};
|
|
147
|
+
}
|
|
148
|
+
const result = {};
|
|
149
|
+
if (Array.isArray(obj)) {
|
|
150
|
+
for (const item of obj) {
|
|
151
|
+
const found = searchObjectForTokens(item, depth + 1);
|
|
152
|
+
mergePartialInto(result, found);
|
|
153
|
+
}
|
|
154
|
+
return result;
|
|
155
|
+
}
|
|
156
|
+
const record = obj;
|
|
157
|
+
for (const [key, val] of Object.entries(record)) {
|
|
158
|
+
const keyLower = key.toLowerCase();
|
|
159
|
+
// Check if this key matches a token pattern.
|
|
160
|
+
// Each key maps to at most ONE field (first match in priority order wins).
|
|
161
|
+
let keyMatched = false;
|
|
162
|
+
for (const [field, patterns] of Object.entries(TOKEN_PATTERNS)) {
|
|
163
|
+
if (keyMatched)
|
|
164
|
+
break;
|
|
165
|
+
if (result[field] !== undefined)
|
|
166
|
+
continue;
|
|
167
|
+
for (const pattern of patterns) {
|
|
168
|
+
if (keyLower.includes(pattern)) {
|
|
169
|
+
const num = typeof val === 'number' ? val : typeof val === 'string' ? Number(val) : NaN;
|
|
170
|
+
if (!isNaN(num) && isFinite(num)) {
|
|
171
|
+
;
|
|
172
|
+
result[field] = num;
|
|
173
|
+
}
|
|
174
|
+
keyMatched = true;
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Recurse into nested objects
|
|
180
|
+
if (val !== null && typeof val === 'object') {
|
|
181
|
+
const nested = searchObjectForTokens(val, depth + 1);
|
|
182
|
+
mergePartialInto(result, nested);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return result;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Merge source into target, only filling missing fields.
|
|
189
|
+
*/
|
|
190
|
+
function mergePartialInto(target, source) {
|
|
191
|
+
if (target.input === undefined && source.input !== undefined)
|
|
192
|
+
target.input = source.input;
|
|
193
|
+
if (target.output === undefined && source.output !== undefined)
|
|
194
|
+
target.output = source.output;
|
|
195
|
+
if (target.cacheRead === undefined && source.cacheRead !== undefined)
|
|
196
|
+
target.cacheRead = source.cacheRead;
|
|
197
|
+
if (target.cacheCreation === undefined && source.cacheCreation !== undefined)
|
|
198
|
+
target.cacheCreation = source.cacheCreation;
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=token-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-extractor.js","sourceRoot":"","sources":["../../src/telemetry/token-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TurnAnalyzer — computes per-turn token breakdowns from normalized spans.
|
|
3
|
+
*
|
|
4
|
+
* Takes a list of NormalizedSpan records and produces TurnAnalysis[], where
|
|
5
|
+
* each entry represents a root-level span (an agent "turn") with:
|
|
6
|
+
* - Chronological ordering (by startTime)
|
|
7
|
+
* - Sequential turnNumber assignment (1-N)
|
|
8
|
+
* - freshTokens, cacheHitRate, contextSize, contextDelta metrics
|
|
9
|
+
* - childSpans drill-down (tool calls within the turn)
|
|
10
|
+
* - isContextSpike detection (inputTokens > 2× average)
|
|
11
|
+
*
|
|
12
|
+
* Architecture constraints:
|
|
13
|
+
* - Constructor injection: accepts ILogger via constructor (defaults to console)
|
|
14
|
+
* - No external dependencies beyond types from this module
|
|
15
|
+
* - Zero LLM calls — pure statistical computation
|
|
16
|
+
*
|
|
17
|
+
* Migrated to @substrate-ai/core in story 41-6b.
|
|
18
|
+
*/
|
|
19
|
+
import type { ILogger } from '../dispatch/types.js';
|
|
20
|
+
import type { NormalizedSpan, TurnAnalysis } from './types.js';
|
|
21
|
+
import type { ITurnAnalyzer } from './telemetry-pipeline.js';
|
|
22
|
+
export declare class TurnAnalyzer implements ITurnAnalyzer {
|
|
23
|
+
private readonly _logger;
|
|
24
|
+
constructor(logger?: ILogger);
|
|
25
|
+
/**
|
|
26
|
+
* Analyze a list of NormalizedSpan records and produce TurnAnalysis[].
|
|
27
|
+
*
|
|
28
|
+
* Returns an empty array immediately when spans is empty.
|
|
29
|
+
*
|
|
30
|
+
* @param spans - All spans for a story (root and child spans mixed)
|
|
31
|
+
*/
|
|
32
|
+
analyze(spans: NormalizedSpan[]): TurnAnalysis[];
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=turn-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-analyzer.d.ts","sourceRoot":"","sources":["../../src/telemetry/turn-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAoB,MAAM,YAAY,CAAA;AAChF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAM5D,qBAAa,YAAa,YAAW,aAAa;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,CAAC,EAAE,OAAO;IAQ5B;;;;;;OAMG;IACH,OAAO,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,YAAY,EAAE;CA4EjD"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TurnAnalyzer — computes per-turn token breakdowns from normalized spans.
|
|
3
|
+
*
|
|
4
|
+
* Takes a list of NormalizedSpan records and produces TurnAnalysis[], where
|
|
5
|
+
* each entry represents a root-level span (an agent "turn") with:
|
|
6
|
+
* - Chronological ordering (by startTime)
|
|
7
|
+
* - Sequential turnNumber assignment (1-N)
|
|
8
|
+
* - freshTokens, cacheHitRate, contextSize, contextDelta metrics
|
|
9
|
+
* - childSpans drill-down (tool calls within the turn)
|
|
10
|
+
* - isContextSpike detection (inputTokens > 2× average)
|
|
11
|
+
*
|
|
12
|
+
* Architecture constraints:
|
|
13
|
+
* - Constructor injection: accepts ILogger via constructor (defaults to console)
|
|
14
|
+
* - No external dependencies beyond types from this module
|
|
15
|
+
* - Zero LLM calls — pure statistical computation
|
|
16
|
+
*
|
|
17
|
+
* Migrated to @substrate-ai/core in story 41-6b.
|
|
18
|
+
*/
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// TurnAnalyzer
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
export class TurnAnalyzer {
|
|
23
|
+
_logger;
|
|
24
|
+
constructor(logger) {
|
|
25
|
+
this._logger = logger ?? console;
|
|
26
|
+
}
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Public API
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
/**
|
|
31
|
+
* Analyze a list of NormalizedSpan records and produce TurnAnalysis[].
|
|
32
|
+
*
|
|
33
|
+
* Returns an empty array immediately when spans is empty.
|
|
34
|
+
*
|
|
35
|
+
* @param spans - All spans for a story (root and child spans mixed)
|
|
36
|
+
*/
|
|
37
|
+
analyze(spans) {
|
|
38
|
+
if (spans.length === 0) {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
// Build set of all spanIds for root-span identification
|
|
42
|
+
const allSpanIds = new Set(spans.map((s) => s.spanId));
|
|
43
|
+
// Separate root spans from child spans
|
|
44
|
+
const rootSpans = spans.filter((s) => !s.parentSpanId || !allSpanIds.has(s.parentSpanId));
|
|
45
|
+
// Sort root spans chronologically
|
|
46
|
+
const ordered = [...rootSpans].sort((a, b) => a.startTime - b.startTime);
|
|
47
|
+
// Build child span index: parentSpanId → child spans
|
|
48
|
+
const childIndex = new Map();
|
|
49
|
+
for (const span of spans) {
|
|
50
|
+
if (span.parentSpanId && allSpanIds.has(span.parentSpanId)) {
|
|
51
|
+
const children = childIndex.get(span.parentSpanId) ?? [];
|
|
52
|
+
children.push(span);
|
|
53
|
+
childIndex.set(span.parentSpanId, children);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// First pass: build turns with metrics (context accumulation)
|
|
57
|
+
let runningContext = 0;
|
|
58
|
+
const turns = ordered.map((span, idx) => {
|
|
59
|
+
const prevContext = runningContext;
|
|
60
|
+
runningContext += span.inputTokens;
|
|
61
|
+
const freshTokens = span.inputTokens - span.cacheReadTokens;
|
|
62
|
+
const cacheHitRate = span.inputTokens > 0 ? span.cacheReadTokens / span.inputTokens : 0;
|
|
63
|
+
const childSpanSummaries = (childIndex.get(span.spanId) ?? []).map((child) => ({
|
|
64
|
+
spanId: child.spanId,
|
|
65
|
+
name: child.name,
|
|
66
|
+
toolName: child.attributes?.['tool.name'],
|
|
67
|
+
inputTokens: child.inputTokens,
|
|
68
|
+
outputTokens: child.outputTokens,
|
|
69
|
+
durationMs: child.durationMs,
|
|
70
|
+
}));
|
|
71
|
+
return {
|
|
72
|
+
spanId: span.spanId,
|
|
73
|
+
turnNumber: idx + 1,
|
|
74
|
+
name: span.name,
|
|
75
|
+
timestamp: span.startTime,
|
|
76
|
+
source: span.source,
|
|
77
|
+
model: span.model,
|
|
78
|
+
inputTokens: span.inputTokens,
|
|
79
|
+
outputTokens: span.outputTokens,
|
|
80
|
+
cacheReadTokens: span.cacheReadTokens,
|
|
81
|
+
freshTokens,
|
|
82
|
+
cacheHitRate,
|
|
83
|
+
costUsd: span.costUsd,
|
|
84
|
+
durationMs: span.durationMs,
|
|
85
|
+
contextSize: runningContext,
|
|
86
|
+
contextDelta: runningContext - prevContext,
|
|
87
|
+
toolName: span.attributes?.['tool.name'],
|
|
88
|
+
isContextSpike: false, // will be set in second pass
|
|
89
|
+
childSpans: childSpanSummaries,
|
|
90
|
+
};
|
|
91
|
+
});
|
|
92
|
+
// Second pass: spike detection
|
|
93
|
+
const avg = turns.reduce((sum, t) => sum + t.inputTokens, 0) / turns.length;
|
|
94
|
+
for (const turn of turns) {
|
|
95
|
+
turn.isContextSpike = avg > 0 && turn.inputTokens > 2 * avg;
|
|
96
|
+
}
|
|
97
|
+
this._logger.debug({ turnCount: turns.length, avg }, 'TurnAnalyzer.analyze complete');
|
|
98
|
+
return turns;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=turn-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-analyzer.js","sourceRoot":"","sources":["../../src/telemetry/turn-analyzer.ts"],"names":[],"mappings":"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"}
|