@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,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BatchBuffer — generic buffering utility with size-triggered and timer-triggered flush.
|
|
3
|
+
*
|
|
4
|
+
* Emits a 'flush' event with the accumulated items whenever either:
|
|
5
|
+
* - The buffer reaches `batchSize` items, or
|
|
6
|
+
* - The `flushIntervalMs` timer fires
|
|
7
|
+
*
|
|
8
|
+
* Callers subscribe to the 'flush' event via `.on('flush', handler)`.
|
|
9
|
+
* Call `start()` to begin the interval timer and `stop()` to drain and clean up.
|
|
10
|
+
* Call `flush()` to force-flush immediately without stopping the interval timer.
|
|
11
|
+
*
|
|
12
|
+
* Design invariants:
|
|
13
|
+
* - Never throws; errors from flush handlers are the caller's responsibility
|
|
14
|
+
* - Items pushed after stop() are still emitted in the final drain flush
|
|
15
|
+
* - EventEmitter pattern — no internal queue management beyond the items array
|
|
16
|
+
*/
|
|
17
|
+
import { EventEmitter } from 'node:events';
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// BatchBuffer
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
export class BatchBuffer extends EventEmitter {
|
|
22
|
+
_items = [];
|
|
23
|
+
_timer = null;
|
|
24
|
+
_batchSize;
|
|
25
|
+
_flushIntervalMs;
|
|
26
|
+
constructor(options = {}) {
|
|
27
|
+
super();
|
|
28
|
+
this._batchSize = options.batchSize ?? 100;
|
|
29
|
+
this._flushIntervalMs = options.flushIntervalMs ?? 5000;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Add an item to the buffer.
|
|
33
|
+
* Triggers a flush immediately when the buffer reaches `batchSize`.
|
|
34
|
+
*/
|
|
35
|
+
push(item) {
|
|
36
|
+
this._items.push(item);
|
|
37
|
+
if (this._items.length >= this._batchSize) {
|
|
38
|
+
this._flush();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Start the interval timer that flushes items on a schedule.
|
|
43
|
+
* Safe to call multiple times — subsequent calls are ignored.
|
|
44
|
+
*/
|
|
45
|
+
start() {
|
|
46
|
+
if (this._timer !== null)
|
|
47
|
+
return;
|
|
48
|
+
this._timer = setInterval(() => this._flush(), this._flushIntervalMs);
|
|
49
|
+
// Allow the Node.js event loop to exit even if this timer is active.
|
|
50
|
+
if (typeof this._timer.unref === 'function') {
|
|
51
|
+
this._timer.unref();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Trigger an immediate flush of buffered items without stopping the interval timer.
|
|
56
|
+
* Use this to force-flush between pipeline phases while keeping the timer active.
|
|
57
|
+
* No-op when the buffer is empty.
|
|
58
|
+
*/
|
|
59
|
+
flush() {
|
|
60
|
+
this._flush();
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Stop the interval timer and flush any remaining items.
|
|
64
|
+
* Safe to call multiple times — subsequent calls are ignored.
|
|
65
|
+
*/
|
|
66
|
+
stop() {
|
|
67
|
+
if (this._timer !== null) {
|
|
68
|
+
clearInterval(this._timer);
|
|
69
|
+
this._timer = null;
|
|
70
|
+
}
|
|
71
|
+
this._flush();
|
|
72
|
+
}
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
// Private
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
_flush() {
|
|
77
|
+
if (this._items.length === 0)
|
|
78
|
+
return;
|
|
79
|
+
const items = this._items.splice(0);
|
|
80
|
+
this.emit('flush', items);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=batch-buffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-buffer.js","sourceRoot":"","sources":["../../src/telemetry/batch-buffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAa1C,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,MAAM,OAAO,WAAe,SAAQ,YAAY;IACtC,MAAM,GAAQ,EAAE,CAAA;IAChB,MAAM,GAA0C,IAAI,CAAA;IAC3C,UAAU,CAAQ;IAClB,gBAAgB,CAAQ;IAEzC,YAAY,UAA8B,EAAE;QAC1C,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,IAAI,GAAG,CAAA;QAC1C,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,eAAe,IAAI,IAAI,CAAA;IACzD,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,IAAO;QACV,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM,EAAE,CAAA;QACf,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;YAAE,OAAM;QAChC,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAA;QACrE,qEAAqE;QACrE,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QACrB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK;QACH,IAAI,CAAC,MAAM,EAAE,CAAA;IACf,CAAC;IAED;;;OAGG;IACH,IAAI;QACF,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACzB,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QACpB,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAA;IACf,CAAC;IAED,8EAA8E;IAC9E,UAAU;IACV,8EAA8E;IAEtE,MAAM;QACZ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Categorizer — classifies telemetry spans into semantic categories and
|
|
3
|
+
* computes per-category token statistics with trend detection.
|
|
4
|
+
*
|
|
5
|
+
* Classification proceeds through three tiers:
|
|
6
|
+
* 1. Exact match against a lookup table of known operation names
|
|
7
|
+
* 2. Prefix/regex pattern match
|
|
8
|
+
* 3. Fuzzy case-insensitive substring match
|
|
9
|
+
* 4. Fallback to 'other' (overridden to 'tool_outputs' when toolName present)
|
|
10
|
+
*
|
|
11
|
+
* Architecture constraints:
|
|
12
|
+
* - Constructor injection: accepts ILogger via constructor (defaults to console)
|
|
13
|
+
* - Module-scope lookup tables to avoid recreation on every classify() call
|
|
14
|
+
* - Zero external dependencies beyond types from this module
|
|
15
|
+
*
|
|
16
|
+
* Migrated to @substrate-ai/core in story 41-6b.
|
|
17
|
+
*/
|
|
18
|
+
import type { ILogger } from '../dispatch/types.js';
|
|
19
|
+
import type { NormalizedSpan, TurnAnalysis, SemanticCategory, CategoryStats, Trend } from './types.js';
|
|
20
|
+
import type { ICategorizer } from './telemetry-pipeline.js';
|
|
21
|
+
export declare class Categorizer implements ICategorizer {
|
|
22
|
+
private readonly _logger;
|
|
23
|
+
constructor(logger?: ILogger);
|
|
24
|
+
/**
|
|
25
|
+
* Classify an operation into a SemanticCategory using tiered logic.
|
|
26
|
+
*
|
|
27
|
+
* @param operationName - Span operation name (e.g. 'read_file', 'bash')
|
|
28
|
+
* @param toolName - Optional tool name; non-empty value overrides fallback to tool_outputs
|
|
29
|
+
* @param taskType - Optional task type (e.g. 'dev-story', 'code-review'); acts as Tier 0 (highest priority)
|
|
30
|
+
*/
|
|
31
|
+
classify(operationName: string, toolName?: string, taskType?: string): SemanticCategory;
|
|
32
|
+
/**
|
|
33
|
+
* Detect whether a category's token consumption is growing, stable, or shrinking
|
|
34
|
+
* by comparing first-half vs second-half turn attribution.
|
|
35
|
+
*
|
|
36
|
+
* @param categorySpans - Spans already classified into this category
|
|
37
|
+
* @param turns - Full turn sequence for the story
|
|
38
|
+
*/
|
|
39
|
+
computeTrend(categorySpans: NormalizedSpan[], turns: TurnAnalysis[]): Trend;
|
|
40
|
+
/**
|
|
41
|
+
* Compute per-category token statistics from TurnAnalysis data (not raw spans).
|
|
42
|
+
*
|
|
43
|
+
* All six SemanticCategory values are always present in the result (zero-token
|
|
44
|
+
* categories are included with totalTokens: 0). Results are sorted by
|
|
45
|
+
* totalTokens descending.
|
|
46
|
+
*
|
|
47
|
+
* Trend is computed by comparing first-half vs second-half turn token attribution
|
|
48
|
+
* for each category, using the same 1.2×/0.8× thresholds as computeTrend().
|
|
49
|
+
*
|
|
50
|
+
* @param turns - TurnAnalysis[] for the story
|
|
51
|
+
*/
|
|
52
|
+
computeCategoryStatsFromTurns(turns: TurnAnalysis[]): CategoryStats[];
|
|
53
|
+
/**
|
|
54
|
+
* Compute per-category token statistics for a complete set of spans.
|
|
55
|
+
*
|
|
56
|
+
* All six SemanticCategory values are always present in the result (zero-token
|
|
57
|
+
* categories are included with totalTokens: 0). Results are sorted by
|
|
58
|
+
* totalTokens descending.
|
|
59
|
+
*
|
|
60
|
+
* @param spans - All NormalizedSpans for the story
|
|
61
|
+
* @param turns - TurnAnalysis sequence (may be empty)
|
|
62
|
+
*/
|
|
63
|
+
computeCategoryStats(spans: NormalizedSpan[], turns: TurnAnalysis[]): CategoryStats[];
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=categorizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"categorizer.d.ts","sourceRoot":"","sources":["../../src/telemetry/categorizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,KAAK,EACN,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAiE3D,qBAAa,WAAY,YAAW,YAAY;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,CAAC,EAAE,OAAO;IAQ5B;;;;;;OAMG;IACH,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,gBAAgB;IA8DvF;;;;;;OAMG;IACH,YAAY,CAAC,aAAa,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,KAAK;IA6C3E;;;;;;;;;;;OAWG;IACH,6BAA6B,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,aAAa,EAAE;IA4ErE;;;;;;;;;OASG;IACH,oBAAoB,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,aAAa,EAAE;CAgCtF"}
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Categorizer — classifies telemetry spans into semantic categories and
|
|
3
|
+
* computes per-category token statistics with trend detection.
|
|
4
|
+
*
|
|
5
|
+
* Classification proceeds through three tiers:
|
|
6
|
+
* 1. Exact match against a lookup table of known operation names
|
|
7
|
+
* 2. Prefix/regex pattern match
|
|
8
|
+
* 3. Fuzzy case-insensitive substring match
|
|
9
|
+
* 4. Fallback to 'other' (overridden to 'tool_outputs' when toolName present)
|
|
10
|
+
*
|
|
11
|
+
* Architecture constraints:
|
|
12
|
+
* - Constructor injection: accepts ILogger via constructor (defaults to console)
|
|
13
|
+
* - Module-scope lookup tables to avoid recreation on every classify() call
|
|
14
|
+
* - Zero external dependencies beyond types from this module
|
|
15
|
+
*
|
|
16
|
+
* Migrated to @substrate-ai/core in story 41-6b.
|
|
17
|
+
*/
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Module-scope lookup tables (constructed once, shared across all instances)
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
/**
|
|
22
|
+
* Tier 0: task-type to semantic category mapping.
|
|
23
|
+
*
|
|
24
|
+
* When a TurnAnalysis has a known taskType, the category is determined
|
|
25
|
+
* directly from this map without consulting lower tiers.
|
|
26
|
+
*/
|
|
27
|
+
const TASK_TYPE_CATEGORY_MAP = new Map([
|
|
28
|
+
['create-story', 'system_prompts'],
|
|
29
|
+
['dev-story', 'tool_outputs'],
|
|
30
|
+
['code-review', 'conversation_history'],
|
|
31
|
+
['test-plan', 'system_prompts'],
|
|
32
|
+
['minor-fixes', 'tool_outputs'],
|
|
33
|
+
]);
|
|
34
|
+
const EXACT_CATEGORY_MAP = new Map([
|
|
35
|
+
['read_file', 'file_reads'],
|
|
36
|
+
['write_file', 'tool_outputs'],
|
|
37
|
+
['bash', 'tool_outputs'],
|
|
38
|
+
['tool_use', 'tool_outputs'],
|
|
39
|
+
['tool_result', 'tool_outputs'],
|
|
40
|
+
['system_prompt', 'system_prompts'],
|
|
41
|
+
['human_turn', 'user_prompts'],
|
|
42
|
+
['user_message', 'user_prompts'],
|
|
43
|
+
['assistant_turn', 'conversation_history'],
|
|
44
|
+
['assistant_message', 'conversation_history'],
|
|
45
|
+
['search_files', 'file_reads'],
|
|
46
|
+
['list_files', 'file_reads'],
|
|
47
|
+
['run_command', 'tool_outputs'],
|
|
48
|
+
['memory_read', 'system_prompts'],
|
|
49
|
+
['web_fetch', 'tool_outputs'],
|
|
50
|
+
// Claude Code OTLP log event names
|
|
51
|
+
['api_request', 'conversation_history'],
|
|
52
|
+
['tool_decision', 'tool_outputs'],
|
|
53
|
+
]);
|
|
54
|
+
const PREFIX_PATTERNS = [
|
|
55
|
+
{ pattern: /^(bash|exec|run|spawn)/i, category: 'tool_outputs' },
|
|
56
|
+
{ pattern: /^(read|open|cat|head|tail).*file/i, category: 'file_reads' },
|
|
57
|
+
{ pattern: /^(list|glob|find).*file/i, category: 'file_reads' },
|
|
58
|
+
{ pattern: /^tool/i, category: 'tool_outputs' },
|
|
59
|
+
{ pattern: /^system/i, category: 'system_prompts' },
|
|
60
|
+
{ pattern: /^(human|user)/i, category: 'user_prompts' },
|
|
61
|
+
{ pattern: /^(assistant|ai|model)/i, category: 'conversation_history' },
|
|
62
|
+
];
|
|
63
|
+
/** All six semantic categories in a stable order for zero-fill initialisation. */
|
|
64
|
+
const ALL_CATEGORIES = [
|
|
65
|
+
'tool_outputs',
|
|
66
|
+
'file_reads',
|
|
67
|
+
'system_prompts',
|
|
68
|
+
'conversation_history',
|
|
69
|
+
'user_prompts',
|
|
70
|
+
'other',
|
|
71
|
+
];
|
|
72
|
+
// ---------------------------------------------------------------------------
|
|
73
|
+
// Categorizer
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
export class Categorizer {
|
|
76
|
+
_logger;
|
|
77
|
+
constructor(logger) {
|
|
78
|
+
this._logger = logger ?? console;
|
|
79
|
+
}
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
// classify
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
/**
|
|
84
|
+
* Classify an operation into a SemanticCategory using tiered logic.
|
|
85
|
+
*
|
|
86
|
+
* @param operationName - Span operation name (e.g. 'read_file', 'bash')
|
|
87
|
+
* @param toolName - Optional tool name; non-empty value overrides fallback to tool_outputs
|
|
88
|
+
* @param taskType - Optional task type (e.g. 'dev-story', 'code-review'); acts as Tier 0 (highest priority)
|
|
89
|
+
*/
|
|
90
|
+
classify(operationName, toolName, taskType) {
|
|
91
|
+
// Tier 0: taskType takes highest priority when defined and mapped
|
|
92
|
+
if (taskType !== undefined && taskType.length > 0) {
|
|
93
|
+
const taskCategory = TASK_TYPE_CATEGORY_MAP.get(taskType);
|
|
94
|
+
if (taskCategory !== undefined)
|
|
95
|
+
return taskCategory;
|
|
96
|
+
}
|
|
97
|
+
// Tier 1: exact match
|
|
98
|
+
const exact = EXACT_CATEGORY_MAP.get(operationName);
|
|
99
|
+
if (exact !== undefined)
|
|
100
|
+
return exact;
|
|
101
|
+
// Tier 2: prefix/regex pattern match
|
|
102
|
+
for (const { pattern, category } of PREFIX_PATTERNS) {
|
|
103
|
+
if (pattern.test(operationName))
|
|
104
|
+
return category;
|
|
105
|
+
}
|
|
106
|
+
// Tier 3: fuzzy case-insensitive substring match
|
|
107
|
+
const lower = operationName.toLowerCase();
|
|
108
|
+
// file_reads: contains 'file' AND ('read' or 'open')
|
|
109
|
+
if (lower.includes('file') && (lower.includes('read') || lower.includes('open'))) {
|
|
110
|
+
return 'file_reads';
|
|
111
|
+
}
|
|
112
|
+
// system_prompts: contains 'system' or 'prompt'
|
|
113
|
+
if (lower.includes('system') || lower.includes('prompt')) {
|
|
114
|
+
return 'system_prompts';
|
|
115
|
+
}
|
|
116
|
+
// tool_outputs: contains 'bash' or 'exec' or 'tool'
|
|
117
|
+
if (lower.includes('bash') || lower.includes('exec') || lower.includes('tool')) {
|
|
118
|
+
return 'tool_outputs';
|
|
119
|
+
}
|
|
120
|
+
// conversation_history: contains 'conversation' or 'history' or 'chat'
|
|
121
|
+
if (lower.includes('conversation') || lower.includes('history') || lower.includes('chat')) {
|
|
122
|
+
return 'conversation_history';
|
|
123
|
+
}
|
|
124
|
+
// user_prompts: contains 'user' or 'human'
|
|
125
|
+
if (lower.includes('user') || lower.includes('human')) {
|
|
126
|
+
return 'user_prompts';
|
|
127
|
+
}
|
|
128
|
+
// Tier 4: fallback — toolName presence overrides to tool_outputs
|
|
129
|
+
if (toolName !== undefined && toolName.length > 0) {
|
|
130
|
+
return 'tool_outputs';
|
|
131
|
+
}
|
|
132
|
+
// Tier 5: log-derived turns without explicit operation names default to
|
|
133
|
+
// conversation_history (they represent LLM turns, not unknown operations)
|
|
134
|
+
if (lower === 'log_turn') {
|
|
135
|
+
return 'conversation_history';
|
|
136
|
+
}
|
|
137
|
+
return 'other';
|
|
138
|
+
}
|
|
139
|
+
// ---------------------------------------------------------------------------
|
|
140
|
+
// computeTrend
|
|
141
|
+
// ---------------------------------------------------------------------------
|
|
142
|
+
/**
|
|
143
|
+
* Detect whether a category's token consumption is growing, stable, or shrinking
|
|
144
|
+
* by comparing first-half vs second-half turn attribution.
|
|
145
|
+
*
|
|
146
|
+
* @param categorySpans - Spans already classified into this category
|
|
147
|
+
* @param turns - Full turn sequence for the story
|
|
148
|
+
*/
|
|
149
|
+
computeTrend(categorySpans, turns) {
|
|
150
|
+
if (turns.length < 2)
|
|
151
|
+
return 'stable';
|
|
152
|
+
// Build spanId → turn-index map from direct spanId and childSpans
|
|
153
|
+
const spanTurnMap = new Map();
|
|
154
|
+
for (let i = 0; i < turns.length; i++) {
|
|
155
|
+
const turn = turns[i];
|
|
156
|
+
if (turn === undefined)
|
|
157
|
+
continue;
|
|
158
|
+
spanTurnMap.set(turn.spanId, i);
|
|
159
|
+
for (const child of turn.childSpans) {
|
|
160
|
+
spanTurnMap.set(child.spanId, i);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const half = Math.floor(turns.length / 2);
|
|
164
|
+
let firstHalfTokens = 0;
|
|
165
|
+
let secondHalfTokens = 0;
|
|
166
|
+
for (const span of categorySpans) {
|
|
167
|
+
const turnIdx = spanTurnMap.has(span.spanId)
|
|
168
|
+
? spanTurnMap.get(span.spanId)
|
|
169
|
+
: attributeSpanToTurnIndex(span.startTime, turns);
|
|
170
|
+
const tokens = span.inputTokens + span.outputTokens;
|
|
171
|
+
if (turnIdx < half) {
|
|
172
|
+
firstHalfTokens += tokens;
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
secondHalfTokens += tokens;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (firstHalfTokens === 0 && secondHalfTokens === 0)
|
|
179
|
+
return 'stable';
|
|
180
|
+
// If first half is zero but second is non-zero, it is growing
|
|
181
|
+
if (firstHalfTokens === 0)
|
|
182
|
+
return 'growing';
|
|
183
|
+
if (secondHalfTokens > 1.2 * firstHalfTokens)
|
|
184
|
+
return 'growing';
|
|
185
|
+
if (secondHalfTokens < 0.8 * firstHalfTokens)
|
|
186
|
+
return 'shrinking';
|
|
187
|
+
return 'stable';
|
|
188
|
+
}
|
|
189
|
+
// ---------------------------------------------------------------------------
|
|
190
|
+
// computeCategoryStatsFromTurns
|
|
191
|
+
// ---------------------------------------------------------------------------
|
|
192
|
+
/**
|
|
193
|
+
* Compute per-category token statistics from TurnAnalysis data (not raw spans).
|
|
194
|
+
*
|
|
195
|
+
* All six SemanticCategory values are always present in the result (zero-token
|
|
196
|
+
* categories are included with totalTokens: 0). Results are sorted by
|
|
197
|
+
* totalTokens descending.
|
|
198
|
+
*
|
|
199
|
+
* Trend is computed by comparing first-half vs second-half turn token attribution
|
|
200
|
+
* for each category, using the same 1.2×/0.8× thresholds as computeTrend().
|
|
201
|
+
*
|
|
202
|
+
* @param turns - TurnAnalysis[] for the story
|
|
203
|
+
*/
|
|
204
|
+
computeCategoryStatsFromTurns(turns) {
|
|
205
|
+
if (turns.length === 0) {
|
|
206
|
+
return ALL_CATEGORIES.map((category) => ({
|
|
207
|
+
category,
|
|
208
|
+
totalTokens: 0,
|
|
209
|
+
percentage: 0,
|
|
210
|
+
eventCount: 0,
|
|
211
|
+
avgTokensPerEvent: 0,
|
|
212
|
+
trend: 'stable',
|
|
213
|
+
}));
|
|
214
|
+
}
|
|
215
|
+
const grandTotal = turns.reduce((sum, t) => sum + t.inputTokens + t.outputTokens, 0);
|
|
216
|
+
const buckets = new Map();
|
|
217
|
+
for (const cat of ALL_CATEGORIES) {
|
|
218
|
+
buckets.set(cat, { total: 0, count: 0, first: 0, second: 0 });
|
|
219
|
+
}
|
|
220
|
+
const half = Math.floor(turns.length / 2);
|
|
221
|
+
for (let i = 0; i < turns.length; i++) {
|
|
222
|
+
const turn = turns[i];
|
|
223
|
+
if (turn === undefined)
|
|
224
|
+
continue;
|
|
225
|
+
const cat = this.classify(turn.name, turn.toolName, turn.taskType);
|
|
226
|
+
const bucket = buckets.get(cat);
|
|
227
|
+
const tokens = turn.inputTokens + turn.outputTokens;
|
|
228
|
+
bucket.total += tokens;
|
|
229
|
+
bucket.count += 1;
|
|
230
|
+
if (i < half) {
|
|
231
|
+
bucket.first += tokens;
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
bucket.second += tokens;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
const results = ALL_CATEGORIES.map((category) => {
|
|
238
|
+
const bucket = buckets.get(category);
|
|
239
|
+
const totalTokens = bucket.total;
|
|
240
|
+
const eventCount = bucket.count;
|
|
241
|
+
const percentage = grandTotal > 0 ? Math.round((totalTokens / grandTotal) * 100 * 1000) / 1000 : 0;
|
|
242
|
+
const avgTokensPerEvent = eventCount > 0 ? totalTokens / eventCount : 0;
|
|
243
|
+
// Compute trend from first vs second half turn token counts for this category
|
|
244
|
+
let trend = 'stable';
|
|
245
|
+
if (turns.length >= 2) {
|
|
246
|
+
const { first, second } = bucket;
|
|
247
|
+
if (first === 0 && second === 0) {
|
|
248
|
+
trend = 'stable';
|
|
249
|
+
}
|
|
250
|
+
else if (first === 0) {
|
|
251
|
+
trend = 'growing';
|
|
252
|
+
}
|
|
253
|
+
else if (second > 1.2 * first) {
|
|
254
|
+
trend = 'growing';
|
|
255
|
+
}
|
|
256
|
+
else if (second < 0.8 * first) {
|
|
257
|
+
trend = 'shrinking';
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return { category, totalTokens, percentage, eventCount, avgTokensPerEvent, trend };
|
|
261
|
+
});
|
|
262
|
+
this._logger.debug({ categories: results.length, grandTotal }, 'Computed category stats from turns');
|
|
263
|
+
return results.sort((a, b) => b.totalTokens - a.totalTokens);
|
|
264
|
+
}
|
|
265
|
+
// ---------------------------------------------------------------------------
|
|
266
|
+
// computeCategoryStats
|
|
267
|
+
// ---------------------------------------------------------------------------
|
|
268
|
+
/**
|
|
269
|
+
* Compute per-category token statistics for a complete set of spans.
|
|
270
|
+
*
|
|
271
|
+
* All six SemanticCategory values are always present in the result (zero-token
|
|
272
|
+
* categories are included with totalTokens: 0). Results are sorted by
|
|
273
|
+
* totalTokens descending.
|
|
274
|
+
*
|
|
275
|
+
* @param spans - All NormalizedSpans for the story
|
|
276
|
+
* @param turns - TurnAnalysis sequence (may be empty)
|
|
277
|
+
*/
|
|
278
|
+
computeCategoryStats(spans, turns) {
|
|
279
|
+
const grandTotal = spans.reduce((sum, s) => sum + s.inputTokens + s.outputTokens, 0);
|
|
280
|
+
// Bucket spans by category
|
|
281
|
+
const buckets = new Map();
|
|
282
|
+
for (const cat of ALL_CATEGORIES)
|
|
283
|
+
buckets.set(cat, []);
|
|
284
|
+
for (const span of spans) {
|
|
285
|
+
const toolName = extractToolNameFromSpan(span);
|
|
286
|
+
const cat = this.classify(span.operationName ?? span.name, toolName);
|
|
287
|
+
buckets.get(cat).push(span);
|
|
288
|
+
}
|
|
289
|
+
const results = ALL_CATEGORIES.map((category) => {
|
|
290
|
+
const catSpans = buckets.get(category);
|
|
291
|
+
const totalTokens = catSpans.reduce((sum, s) => sum + s.inputTokens + s.outputTokens, 0);
|
|
292
|
+
const eventCount = catSpans.length;
|
|
293
|
+
const percentage = grandTotal > 0 ? Math.round((totalTokens / grandTotal) * 100 * 1000) / 1000 : 0;
|
|
294
|
+
const avgTokensPerEvent = eventCount > 0 ? totalTokens / eventCount : 0;
|
|
295
|
+
const trend = this.computeTrend(catSpans, turns);
|
|
296
|
+
return { category, totalTokens, percentage, eventCount, avgTokensPerEvent, trend };
|
|
297
|
+
});
|
|
298
|
+
this._logger.debug({ categories: results.length, grandTotal }, 'Computed category stats');
|
|
299
|
+
return results.sort((a, b) => b.totalTokens - a.totalTokens);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
// ---------------------------------------------------------------------------
|
|
303
|
+
// Internal helpers
|
|
304
|
+
// ---------------------------------------------------------------------------
|
|
305
|
+
/**
|
|
306
|
+
* Binary search: find the index of the last turn whose timestamp ≤ spanStartTime.
|
|
307
|
+
* Returns 0 if no turn precedes the span.
|
|
308
|
+
*/
|
|
309
|
+
function attributeSpanToTurnIndex(spanStartTime, turns) {
|
|
310
|
+
let lo = 0;
|
|
311
|
+
let hi = turns.length - 1;
|
|
312
|
+
let result = 0;
|
|
313
|
+
while (lo <= hi) {
|
|
314
|
+
const mid = (lo + hi) >> 1;
|
|
315
|
+
if ((turns[mid]?.timestamp ?? 0) <= spanStartTime) {
|
|
316
|
+
result = mid;
|
|
317
|
+
lo = mid + 1;
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
hi = mid - 1;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
return result;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Extract a tool name from a span's attributes, checking known attribute keys
|
|
327
|
+
* in priority order.
|
|
328
|
+
*/
|
|
329
|
+
function extractToolNameFromSpan(span) {
|
|
330
|
+
if (!span.attributes)
|
|
331
|
+
return undefined;
|
|
332
|
+
const attrs = span.attributes;
|
|
333
|
+
const name = attrs['tool.name'] ||
|
|
334
|
+
attrs['llm.tool.name'] ||
|
|
335
|
+
attrs['claude.tool_name'];
|
|
336
|
+
return name || undefined;
|
|
337
|
+
}
|
|
338
|
+
//# sourceMappingURL=categorizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"categorizer.js","sourceRoot":"","sources":["../../src/telemetry/categorizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAYH,8EAA8E;AAC9E,6EAA6E;AAC7E,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAA2B;IAC/D,CAAC,cAAc,EAAE,gBAAgB,CAAC;IAClC,CAAC,WAAW,EAAK,cAAc,CAAC;IAChC,CAAC,aAAa,EAAG,sBAAsB,CAAC;IACxC,CAAC,WAAW,EAAK,gBAAgB,CAAC;IAClC,CAAC,aAAa,EAAG,cAAc,CAAC;CACjC,CAAC,CAAA;AAEF,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAA2B;IAC3D,CAAC,WAAW,EAAE,YAAY,CAAC;IAC3B,CAAC,YAAY,EAAE,cAAc,CAAC;IAC9B,CAAC,MAAM,EAAE,cAAc,CAAC;IACxB,CAAC,UAAU,EAAE,cAAc,CAAC;IAC5B,CAAC,aAAa,EAAE,cAAc,CAAC;IAC/B,CAAC,eAAe,EAAE,gBAAgB,CAAC;IACnC,CAAC,YAAY,EAAE,cAAc,CAAC;IAC9B,CAAC,cAAc,EAAE,cAAc,CAAC;IAChC,CAAC,gBAAgB,EAAE,sBAAsB,CAAC;IAC1C,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;IAC7C,CAAC,cAAc,EAAE,YAAY,CAAC;IAC9B,CAAC,YAAY,EAAE,YAAY,CAAC;IAC5B,CAAC,aAAa,EAAE,cAAc,CAAC;IAC/B,CAAC,aAAa,EAAE,gBAAgB,CAAC;IACjC,CAAC,WAAW,EAAE,cAAc,CAAC;IAC7B,mCAAmC;IACnC,CAAC,aAAa,EAAE,sBAAsB,CAAC;IACvC,CAAC,eAAe,EAAE,cAAc,CAAC;CAClC,CAAC,CAAA;AAEF,MAAM,eAAe,GAA2D;IAC9E,EAAE,OAAO,EAAE,yBAAyB,EAAE,QAAQ,EAAE,cAAc,EAAE;IAChE,EAAE,OAAO,EAAE,mCAAmC,EAAE,QAAQ,EAAE,YAAY,EAAE;IACxE,EAAE,OAAO,EAAE,0BAA0B,EAAE,QAAQ,EAAE,YAAY,EAAE;IAC/D,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE;IAC/C,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE;IACnD,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAE;IACvD,EAAE,OAAO,EAAE,wBAAwB,EAAE,QAAQ,EAAE,sBAAsB,EAAE;CACxE,CAAA;AAED,kFAAkF;AAClF,MAAM,cAAc,GAAgC;IAClD,cAAc;IACd,YAAY;IACZ,gBAAgB;IAChB,sBAAsB;IACtB,cAAc;IACd,OAAO;CACR,CAAA;AAED,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,MAAM,OAAO,WAAW;IACL,OAAO,CAAS;IAEjC,YAAY,MAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,OAAO,CAAA;IAClC,CAAC;IAED,8EAA8E;IAC9E,WAAW;IACX,8EAA8E;IAE9E;;;;;;OAMG;IACH,QAAQ,CAAC,aAAqB,EAAE,QAAiB,EAAE,QAAiB;QAClE,kEAAkE;QAClE,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,MAAM,YAAY,GAAG,sBAAsB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YACzD,IAAI,YAAY,KAAK,SAAS;gBAAE,OAAO,YAAY,CAAA;QACrD,CAAC;QAED,sBAAsB;QACtB,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;QACnD,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAA;QAErC,qCAAqC;QACrC,KAAK,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,eAAe,EAAE,CAAC;YACpD,IAAI,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC;gBAAE,OAAO,QAAQ,CAAA;QAClD,CAAC;QAED,iDAAiD;QACjD,MAAM,KAAK,GAAG,aAAa,CAAC,WAAW,EAAE,CAAA;QAEzC,qDAAqD;QACrD,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACjF,OAAO,YAAY,CAAA;QACrB,CAAC;QAED,gDAAgD;QAChD,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzD,OAAO,gBAAgB,CAAA;QACzB,CAAC;QAED,oDAAoD;QACpD,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/E,OAAO,cAAc,CAAA;QACvB,CAAC;QAED,uEAAuE;QACvE,IAAI,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1F,OAAO,sBAAsB,CAAA;QAC/B,CAAC;QAED,2CAA2C;QAC3C,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACtD,OAAO,cAAc,CAAA;QACvB,CAAC;QAED,iEAAiE;QACjE,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,OAAO,cAAc,CAAA;QACvB,CAAC;QAED,wEAAwE;QACxE,0EAA0E;QAC1E,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;YACzB,OAAO,sBAAsB,CAAA;QAC/B,CAAC;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,8EAA8E;IAC9E,eAAe;IACf,8EAA8E;IAE9E;;;;;;OAMG;IACH,YAAY,CAAC,aAA+B,EAAE,KAAqB;QACjE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,QAAQ,CAAA;QAErC,kEAAkE;QAClE,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAA;QAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;YACrB,IAAI,IAAI,KAAK,SAAS;gBAAE,SAAQ;YAChC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;YAC/B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;YAClC,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACzC,IAAI,eAAe,GAAG,CAAC,CAAA;QACvB,IAAI,gBAAgB,GAAG,CAAC,CAAA;QAExB,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC1C,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAE;gBAC/B,CAAC,CAAC,wBAAwB,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;YAEnD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAA;YACnD,IAAI,OAAO,GAAG,IAAI,EAAE,CAAC;gBACnB,eAAe,IAAI,MAAM,CAAA;YAC3B,CAAC;iBAAM,CAAC;gBACN,gBAAgB,IAAI,MAAM,CAAA;YAC5B,CAAC;QACH,CAAC;QAED,IAAI,eAAe,KAAK,CAAC,IAAI,gBAAgB,KAAK,CAAC;YAAE,OAAO,QAAQ,CAAA;QAEpE,8DAA8D;QAC9D,IAAI,eAAe,KAAK,CAAC;YAAE,OAAO,SAAS,CAAA;QAE3C,IAAI,gBAAgB,GAAG,GAAG,GAAG,eAAe;YAAE,OAAO,SAAS,CAAA;QAC9D,IAAI,gBAAgB,GAAG,GAAG,GAAG,eAAe;YAAE,OAAO,WAAW,CAAA;QAChE,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,8EAA8E;IAC9E,gCAAgC;IAChC,8EAA8E;IAE9E;;;;;;;;;;;OAWG;IACH,6BAA6B,CAAC,KAAqB;QACjD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACvC,QAAQ;gBACR,WAAW,EAAE,CAAC;gBACd,UAAU,EAAE,CAAC;gBACb,UAAU,EAAE,CAAC;gBACb,iBAAiB,EAAE,CAAC;gBACpB,KAAK,EAAE,QAAiB;aACzB,CAAC,CAAC,CAAA;QACL,CAAC;QAED,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAA;QAIpF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAgC,CAAA;QACvD,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAA;QAC/D,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAEzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;YACrB,IAAI,IAAI,KAAK,SAAS;gBAAE,SAAQ;YAChC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAE,CAAA;YAChC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAA;YACnD,MAAM,CAAC,KAAK,IAAI,MAAM,CAAA;YACtB,MAAM,CAAC,KAAK,IAAI,CAAC,CAAA;YACjB,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,IAAI,MAAM,CAAA;YACxB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,MAAM,IAAI,MAAM,CAAA;YACzB,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAoB,cAAc,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC/D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAA;YACrC,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAA;YAChC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAA;YAC/B,MAAM,UAAU,GACd,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,UAAU,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;YACjF,MAAM,iBAAiB,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;YAEvE,8EAA8E;YAC9E,IAAI,KAAK,GAAU,QAAQ,CAAA;YAC3B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACtB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;gBAChC,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;oBAChC,KAAK,GAAG,QAAQ,CAAA;gBAClB,CAAC;qBAAM,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;oBACvB,KAAK,GAAG,SAAS,CAAA;gBACnB,CAAC;qBAAM,IAAI,MAAM,GAAG,GAAG,GAAG,KAAK,EAAE,CAAC;oBAChC,KAAK,GAAG,SAAS,CAAA;gBACnB,CAAC;qBAAM,IAAI,MAAM,GAAG,GAAG,GAAG,KAAK,EAAE,CAAC;oBAChC,KAAK,GAAG,WAAW,CAAA;gBACrB,CAAC;YACH,CAAC;YAED,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAA;QACpF,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,OAAO,CAAC,KAAK,CAChB,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,EAC1C,oCAAoC,CACrC,CAAA;QAED,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAA;IAC9D,CAAC;IAED,8EAA8E;IAC9E,uBAAuB;IACvB,8EAA8E;IAE9E;;;;;;;;;OASG;IACH,oBAAoB,CAAC,KAAuB,EAAE,KAAqB;QACjE,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAA;QAEpF,2BAA2B;QAC3B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsC,CAAA;QAC7D,KAAK,MAAM,GAAG,IAAI,cAAc;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QAEtD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAA;YAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;YACpE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9B,CAAC;QAED,MAAM,OAAO,GAAoB,cAAc,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC/D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAA;YACvC,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAA;YACxF,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAA;YAClC,MAAM,UAAU,GACd,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,UAAU,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;YACjF,MAAM,iBAAiB,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;YACvE,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;YAEhD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAA;QACpF,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,OAAO,CAAC,KAAK,CAChB,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,EAC1C,yBAAyB,CAC1B,CAAA;QAED,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAA;IAC9D,CAAC;CACF;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;GAGG;AACH,SAAS,wBAAwB,CAAC,aAAqB,EAAE,KAAqB;IAC5E,IAAI,EAAE,GAAG,CAAC,CAAA;IACV,IAAI,EAAE,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;IACzB,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QAC1B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,SAAS,IAAI,CAAC,CAAC,IAAI,aAAa,EAAE,CAAC;YAClD,MAAM,GAAG,GAAG,CAAA;YACZ,EAAE,GAAG,GAAG,GAAG,CAAC,CAAA;QACd,CAAC;aAAM,CAAC;YACN,EAAE,GAAG,GAAG,GAAG,CAAC,CAAA;QACd,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;GAGG;AACH,SAAS,uBAAuB,CAAC,IAAoB;IACnD,IAAI,CAAC,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAA;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAA;IAC7B,MAAM,IAAI,GACP,KAAK,CAAC,WAAW,CAAwB;QACzC,KAAK,CAAC,eAAe,CAAwB;QAC7C,KAAK,CAAC,kBAAkB,CAAwB,CAAA;IACnD,OAAO,IAAI,IAAI,SAAS,CAAA;AAC1B,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConsumerAnalyzer — groups telemetry spans by consumer key and ranks by token
|
|
3
|
+
* consumption, producing ConsumerStats for each unique operation+tool combination.
|
|
4
|
+
*
|
|
5
|
+
* A "consumer key" is `operationName|toolName`, stable across runs and safe to
|
|
6
|
+
* store as a VARCHAR(300) primary-key component in Dolt.
|
|
7
|
+
*
|
|
8
|
+
* Architecture constraints:
|
|
9
|
+
* - Constructor injection: accepts Categorizer and ILogger (logger defaults to console)
|
|
10
|
+
* - Delegates classification to the injected Categorizer
|
|
11
|
+
* - Zero external dependencies beyond types and Categorizer from this module
|
|
12
|
+
*
|
|
13
|
+
* Migrated to @substrate-ai/core in story 41-6b.
|
|
14
|
+
*/
|
|
15
|
+
import type { ILogger } from '../dispatch/types.js';
|
|
16
|
+
import type { NormalizedSpan, ConsumerStats, TurnAnalysis } from './types.js';
|
|
17
|
+
import type { IConsumerAnalyzer } from './telemetry-pipeline.js';
|
|
18
|
+
import type { Categorizer } from './categorizer.js';
|
|
19
|
+
export declare class ConsumerAnalyzer implements IConsumerAnalyzer {
|
|
20
|
+
private readonly _categorizer;
|
|
21
|
+
private readonly _logger;
|
|
22
|
+
constructor(categorizer: Categorizer, logger?: ILogger);
|
|
23
|
+
/**
|
|
24
|
+
* Group spans by consumer key, rank by totalTokens descending, and return
|
|
25
|
+
* ConsumerStats for each non-zero-token group.
|
|
26
|
+
*
|
|
27
|
+
* @param spans - All NormalizedSpans for the story
|
|
28
|
+
*/
|
|
29
|
+
analyze(spans: NormalizedSpan[]): ConsumerStats[];
|
|
30
|
+
/**
|
|
31
|
+
* Group turns by consumer key (model|toolName), rank by totalTokens descending,
|
|
32
|
+
* and return ConsumerStats for each non-zero-token group.
|
|
33
|
+
*
|
|
34
|
+
* @param turns - All TurnAnalysis records for the story
|
|
35
|
+
*/
|
|
36
|
+
analyzeFromTurns(turns: TurnAnalysis[]): ConsumerStats[];
|
|
37
|
+
/**
|
|
38
|
+
* Build a stable, collision-resistant consumer key from a span.
|
|
39
|
+
* Format: `operationName|toolName` (tool part is empty string if absent).
|
|
40
|
+
*/
|
|
41
|
+
private _buildConsumerKey;
|
|
42
|
+
/**
|
|
43
|
+
* Build a stable consumer key from a turn.
|
|
44
|
+
* Format: `model|toolName` (tool part is empty string if absent).
|
|
45
|
+
*/
|
|
46
|
+
private _buildConsumerKeyFromTurn;
|
|
47
|
+
/**
|
|
48
|
+
* Extract a tool name from span attributes, checking three known attribute keys
|
|
49
|
+
* in priority order.
|
|
50
|
+
*/
|
|
51
|
+
private _extractToolName;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=consumer-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consumer-analyzer.d.ts","sourceRoot":"","sources":["../../src/telemetry/consumer-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAiB,YAAY,EAAE,MAAM,YAAY,CAAA;AAC5F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAMnD,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAa;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,OAAO;IAStD;;;;;OAKG;IACH,OAAO,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,aAAa,EAAE;IAuEjD;;;;;OAKG;IACH,gBAAgB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,aAAa,EAAE;IAqExD;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAMjC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;CASzB"}
|