@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,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RoutingTelemetry — emits OTEL spans for model routing decisions.
|
|
3
|
+
*
|
|
4
|
+
* Call `recordModelResolved()` immediately after `RoutingResolver.resolveModel()`
|
|
5
|
+
* returns a non-null result to capture per-dispatch routing latency and metadata.
|
|
6
|
+
*
|
|
7
|
+
* References:
|
|
8
|
+
* - Epic 28, Story 28-6: Routing Telemetry — Per-Phase Token Tracking and OTEL Spans
|
|
9
|
+
*/
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// RoutingTelemetry
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
/**
|
|
14
|
+
* Emits `routing.model_resolved` OTEL spans via an IRoutingTelemetryPersistence instance.
|
|
15
|
+
*
|
|
16
|
+
* Injected into the run command alongside RoutingResolver. When telemetry is
|
|
17
|
+
* not configured, pass null to the run command; no spans are emitted.
|
|
18
|
+
*/
|
|
19
|
+
export class RoutingTelemetry {
|
|
20
|
+
_telemetry;
|
|
21
|
+
_logger;
|
|
22
|
+
constructor(telemetry, logger) {
|
|
23
|
+
this._telemetry = telemetry;
|
|
24
|
+
this._logger = logger;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Emit a `routing.model_resolved` span for a single routing decision.
|
|
28
|
+
*
|
|
29
|
+
* @param attrs - span attributes including dispatchId, taskType, phase, model, source, latencyMs
|
|
30
|
+
*/
|
|
31
|
+
recordModelResolved(attrs) {
|
|
32
|
+
this._telemetry.recordSpan({
|
|
33
|
+
name: 'routing.model_resolved',
|
|
34
|
+
attributes: attrs,
|
|
35
|
+
});
|
|
36
|
+
this._logger.debug(attrs, 'routing.model_resolved span emitted');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=routing-telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing-telemetry.js","sourceRoot":"","sources":["../../src/routing/routing-telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,OAAO,gBAAgB;IACV,UAAU,CAA8B;IACxC,OAAO,CAAS;IAEjC,YAAY,SAAuC,EAAE,MAAe;QAClE,IAAI,CAAC,UAAU,GAAG,SAAS,CAAA;QAC3B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED;;;;OAIG;IACH,mBAAmB,CAAC,KAOnB;QACC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YACzB,IAAI,EAAE,wBAAwB;YAC9B,UAAU,EAAE,KAAK;SAClB,CAAC,CAAA;QACF,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,qCAAqC,CAAC,CAAA;IAClE,CAAC;CACF"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RoutingTokenAccumulator — collects per-dispatch routing metadata and
|
|
3
|
+
* attributes agent token usage to pipeline phase buckets.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* 1. Subscribe `onRoutingSelected` to `routing:model-selected` events.
|
|
7
|
+
* 2. Subscribe `onAgentCompleted` to `agent:completed` events.
|
|
8
|
+
* 3. Call `flush(runId)` at pipeline completion to persist the breakdown.
|
|
9
|
+
*
|
|
10
|
+
* References:
|
|
11
|
+
* - Epic 28, Story 28-6: Routing Telemetry — Per-Phase Token Tracking and OTEL Spans
|
|
12
|
+
*/
|
|
13
|
+
import type { ILogger } from '../dispatch/types.js';
|
|
14
|
+
import type { ModelRoutingConfig } from './model-routing-config.js';
|
|
15
|
+
import type { IStateStore } from './types.js';
|
|
16
|
+
/**
|
|
17
|
+
* Accumulates per-dispatch routing decisions and agent token usage, then
|
|
18
|
+
* flushes an aggregated `PhaseTokenBreakdown` to the IStateStore at run end.
|
|
19
|
+
*
|
|
20
|
+
* Thread-safety: all methods are synchronous accumulators; `flush` is async
|
|
21
|
+
* but should only be called once per run after all dispatches settle.
|
|
22
|
+
*/
|
|
23
|
+
export declare class RoutingTokenAccumulator {
|
|
24
|
+
private readonly _config;
|
|
25
|
+
private readonly _stateStore;
|
|
26
|
+
private readonly _logger;
|
|
27
|
+
/** Maps dispatchId → { phase, model } registered from routing:model-selected events */
|
|
28
|
+
private readonly _dispatchMap;
|
|
29
|
+
/**
|
|
30
|
+
* Bucket key = `"${phase}::${model}"`.
|
|
31
|
+
* Separate entries per (phase, model) combination so mixed-model runs
|
|
32
|
+
* produce distinct rows in the breakdown.
|
|
33
|
+
*/
|
|
34
|
+
private readonly _buckets;
|
|
35
|
+
constructor(config: ModelRoutingConfig, stateStore: IStateStore, logger: ILogger);
|
|
36
|
+
/**
|
|
37
|
+
* Register the routing decision for a dispatch.
|
|
38
|
+
* A second event for the same `dispatchId` overwrites the prior entry (last-writer-wins).
|
|
39
|
+
*
|
|
40
|
+
* @param event - payload from `routing:model-selected`
|
|
41
|
+
*/
|
|
42
|
+
onRoutingSelected(event: {
|
|
43
|
+
dispatchId: string;
|
|
44
|
+
phase: string;
|
|
45
|
+
model: string;
|
|
46
|
+
}): void;
|
|
47
|
+
/**
|
|
48
|
+
* Attribute token usage to the phase bucket for this dispatch.
|
|
49
|
+
* Unknown `dispatchId` values are attributed to `phase: 'default', model: 'unknown'`.
|
|
50
|
+
*
|
|
51
|
+
* @param event - payload from `agent:completed` (must include inputTokens / outputTokens)
|
|
52
|
+
*/
|
|
53
|
+
onAgentCompleted(event: {
|
|
54
|
+
dispatchId: string;
|
|
55
|
+
inputTokens: number;
|
|
56
|
+
outputTokens: number;
|
|
57
|
+
}): void;
|
|
58
|
+
/**
|
|
59
|
+
* Construct the `PhaseTokenBreakdown` from the accumulated buckets and
|
|
60
|
+
* persist it to the IStateStore via `setMetric`.
|
|
61
|
+
* Clears all in-memory state afterwards so a second call writes an empty entry.
|
|
62
|
+
*
|
|
63
|
+
* @param runId - the pipeline run ID used to scope the metric key
|
|
64
|
+
*/
|
|
65
|
+
flush(runId: string): Promise<void>;
|
|
66
|
+
private _upsertBucket;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=routing-token-accumulator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing-token-accumulator.d.ts","sourceRoot":"","sources":["../../src/routing/routing-token-accumulator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,KAAK,EAAE,WAAW,EAAwC,MAAM,YAAY,CAAA;AAMnF;;;;;;GAMG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC,uFAAuF;IACvF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA2D;IAExF;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0C;gBAEvD,MAAM,EAAE,kBAAkB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO;IAUhF;;;;;OAKG;IACH,iBAAiB,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAQpF;;;;;OAKG;IACH,gBAAgB,CAAC,KAAK,EAAE;QACtB,UAAU,EAAE,MAAM,CAAA;QAClB,WAAW,EAAE,MAAM,CAAA;QACnB,YAAY,EAAE,MAAM,CAAA;KACrB,GAAG,IAAI;IAeR;;;;;;OAMG;IACG,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBzC,OAAO,CAAC,aAAa;CAsBtB"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RoutingTokenAccumulator — collects per-dispatch routing metadata and
|
|
3
|
+
* attributes agent token usage to pipeline phase buckets.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* 1. Subscribe `onRoutingSelected` to `routing:model-selected` events.
|
|
7
|
+
* 2. Subscribe `onAgentCompleted` to `agent:completed` events.
|
|
8
|
+
* 3. Call `flush(runId)` at pipeline completion to persist the breakdown.
|
|
9
|
+
*
|
|
10
|
+
* References:
|
|
11
|
+
* - Epic 28, Story 28-6: Routing Telemetry — Per-Phase Token Tracking and OTEL Spans
|
|
12
|
+
*/
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// RoutingTokenAccumulator
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
/**
|
|
17
|
+
* Accumulates per-dispatch routing decisions and agent token usage, then
|
|
18
|
+
* flushes an aggregated `PhaseTokenBreakdown` to the IStateStore at run end.
|
|
19
|
+
*
|
|
20
|
+
* Thread-safety: all methods are synchronous accumulators; `flush` is async
|
|
21
|
+
* but should only be called once per run after all dispatches settle.
|
|
22
|
+
*/
|
|
23
|
+
export class RoutingTokenAccumulator {
|
|
24
|
+
_config;
|
|
25
|
+
_stateStore;
|
|
26
|
+
_logger;
|
|
27
|
+
/** Maps dispatchId → { phase, model } registered from routing:model-selected events */
|
|
28
|
+
_dispatchMap = new Map();
|
|
29
|
+
/**
|
|
30
|
+
* Bucket key = `"${phase}::${model}"`.
|
|
31
|
+
* Separate entries per (phase, model) combination so mixed-model runs
|
|
32
|
+
* produce distinct rows in the breakdown.
|
|
33
|
+
*/
|
|
34
|
+
_buckets = new Map();
|
|
35
|
+
constructor(config, stateStore, logger) {
|
|
36
|
+
this._config = config;
|
|
37
|
+
this._stateStore = stateStore;
|
|
38
|
+
this._logger = logger;
|
|
39
|
+
}
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// Event handlers
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
/**
|
|
44
|
+
* Register the routing decision for a dispatch.
|
|
45
|
+
* A second event for the same `dispatchId` overwrites the prior entry (last-writer-wins).
|
|
46
|
+
*
|
|
47
|
+
* @param event - payload from `routing:model-selected`
|
|
48
|
+
*/
|
|
49
|
+
onRoutingSelected(event) {
|
|
50
|
+
this._dispatchMap.set(event.dispatchId, { phase: event.phase, model: event.model });
|
|
51
|
+
this._logger.debug({ dispatchId: event.dispatchId, phase: event.phase, model: event.model }, 'routing:model-selected registered');
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Attribute token usage to the phase bucket for this dispatch.
|
|
55
|
+
* Unknown `dispatchId` values are attributed to `phase: 'default', model: 'unknown'`.
|
|
56
|
+
*
|
|
57
|
+
* @param event - payload from `agent:completed` (must include inputTokens / outputTokens)
|
|
58
|
+
*/
|
|
59
|
+
onAgentCompleted(event) {
|
|
60
|
+
const mapping = this._dispatchMap.get(event.dispatchId);
|
|
61
|
+
const phase = mapping?.phase ?? 'default';
|
|
62
|
+
const model = mapping?.model ?? 'unknown';
|
|
63
|
+
this._upsertBucket(phase, model, event.inputTokens, event.outputTokens);
|
|
64
|
+
this._logger.debug({ dispatchId: event.dispatchId, phase, model, inputTokens: event.inputTokens }, 'agent:completed attributed');
|
|
65
|
+
}
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
// Flush
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
/**
|
|
70
|
+
* Construct the `PhaseTokenBreakdown` from the accumulated buckets and
|
|
71
|
+
* persist it to the IStateStore via `setMetric`.
|
|
72
|
+
* Clears all in-memory state afterwards so a second call writes an empty entry.
|
|
73
|
+
*
|
|
74
|
+
* @param runId - the pipeline run ID used to scope the metric key
|
|
75
|
+
*/
|
|
76
|
+
async flush(runId) {
|
|
77
|
+
const entries = Array.from(this._buckets.values());
|
|
78
|
+
const breakdown = {
|
|
79
|
+
entries,
|
|
80
|
+
baselineModel: this._config.baseline_model,
|
|
81
|
+
runId,
|
|
82
|
+
};
|
|
83
|
+
await this._stateStore.setMetric(runId, 'phase_token_breakdown', breakdown);
|
|
84
|
+
this._logger.debug({ runId, entryCount: entries.length }, 'Phase token breakdown flushed to StateStore');
|
|
85
|
+
// Clear in-memory state — a subsequent flush() will write an empty breakdown.
|
|
86
|
+
this._dispatchMap.clear();
|
|
87
|
+
this._buckets.clear();
|
|
88
|
+
}
|
|
89
|
+
// ---------------------------------------------------------------------------
|
|
90
|
+
// Private helpers
|
|
91
|
+
// ---------------------------------------------------------------------------
|
|
92
|
+
_upsertBucket(phase, model, inputTokens, outputTokens) {
|
|
93
|
+
const key = `${phase}::${model}`;
|
|
94
|
+
const existing = this._buckets.get(key);
|
|
95
|
+
if (existing) {
|
|
96
|
+
existing.inputTokens += inputTokens;
|
|
97
|
+
existing.outputTokens += outputTokens;
|
|
98
|
+
existing.dispatchCount += 1;
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
this._buckets.set(key, {
|
|
102
|
+
phase: phase,
|
|
103
|
+
model,
|
|
104
|
+
inputTokens,
|
|
105
|
+
outputTokens,
|
|
106
|
+
dispatchCount: 1,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=routing-token-accumulator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing-token-accumulator.js","sourceRoot":"","sources":["../../src/routing/routing-token-accumulator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,OAAO,uBAAuB;IACjB,OAAO,CAAoB;IAC3B,WAAW,CAAa;IACxB,OAAO,CAAS;IAEjC,uFAAuF;IACtE,YAAY,GAAkD,IAAI,GAAG,EAAE,CAAA;IAExF;;;;OAIG;IACc,QAAQ,GAAiC,IAAI,GAAG,EAAE,CAAA;IAEnE,YAAY,MAA0B,EAAE,UAAuB,EAAE,MAAe;QAC9E,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;QACrB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAA;QAC7B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,8EAA8E;IAC9E,iBAAiB;IACjB,8EAA8E;IAE9E;;;;;OAKG;IACH,iBAAiB,CAAC,KAA2D;QAC3E,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAA;QACnF,IAAI,CAAC,OAAO,CAAC,KAAK,CAChB,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EACxE,mCAAmC,CACpC,CAAA;IACH,CAAC;IAED;;;;;OAKG;IACH,gBAAgB,CAAC,KAIhB;QACC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QACvD,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,SAAS,CAAA;QACzC,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,SAAS,CAAA;QACzC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,CAAC,CAAA;QACvE,IAAI,CAAC,OAAO,CAAC,KAAK,CAChB,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,EAC9E,4BAA4B,CAC7B,CAAA;IACH,CAAC;IAED,8EAA8E;IAC9E,QAAQ;IACR,8EAA8E;IAE9E;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,CAAC,KAAa;QACvB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;QAClD,MAAM,SAAS,GAAwB;YACrC,OAAO;YACP,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc;YAC1C,KAAK;SACN,CAAA;QAED,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,EAAE,uBAAuB,EAAE,SAAS,CAAC,CAAA;QAE3E,IAAI,CAAC,OAAO,CAAC,KAAK,CAChB,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,EACrC,6CAA6C,CAC9C,CAAA;QAED,8EAA8E;QAC9E,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAA;QACzB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;IACvB,CAAC;IAED,8EAA8E;IAC9E,kBAAkB;IAClB,8EAA8E;IAEtE,aAAa,CACnB,KAAa,EACb,KAAa,EACb,WAAmB,EACnB,YAAoB;QAEpB,MAAM,GAAG,GAAG,GAAG,KAAK,KAAK,KAAK,EAAE,CAAA;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACvC,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,WAAW,IAAI,WAAW,CAAA;YACnC,QAAQ,CAAC,YAAY,IAAI,YAAY,CAAA;YACrC,QAAQ,CAAC,aAAa,IAAI,CAAC,CAAA;QAC7B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE;gBACrB,KAAK,EAAE,KAAiC;gBACxC,KAAK;gBACL,WAAW;gBACX,YAAY;gBACZ,aAAa,EAAE,CAAC;aACjB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RoutingTuner — automatically applies conservative model downgrades based on
|
|
3
|
+
* historical phase token breakdown data.
|
|
4
|
+
*
|
|
5
|
+
* When `config.auto_tune` is true and enough historical data exists, RoutingTuner
|
|
6
|
+
* selects the highest-confidence downgrade recommendation, updates the YAML config
|
|
7
|
+
* file in place, and appends an audit log entry to the IStateStore.
|
|
8
|
+
*
|
|
9
|
+
* At most one phase is changed per invocation.
|
|
10
|
+
*
|
|
11
|
+
* References:
|
|
12
|
+
* - Epic 28, Story 28-8: Feedback Loop — Telemetry-Driven Routing Tuning
|
|
13
|
+
*/
|
|
14
|
+
import type { ILogger } from '../dispatch/types.js';
|
|
15
|
+
import type { TypedEventBus } from '../events/event-bus.js';
|
|
16
|
+
import type { CoreEvents } from '../events/core-events.js';
|
|
17
|
+
import type { ModelRoutingConfig } from './model-routing-config.js';
|
|
18
|
+
import type { IStateStore } from './types.js';
|
|
19
|
+
import { RoutingRecommender } from './routing-recommender.js';
|
|
20
|
+
/**
|
|
21
|
+
* Auto-applies a single conservative model downgrade per invocation when
|
|
22
|
+
* `config.auto_tune` is `true` and sufficient historical data is available.
|
|
23
|
+
*
|
|
24
|
+
* The tuner reads the current routing YAML config, applies the change in memory,
|
|
25
|
+
* and writes it back to disk synchronously. It also appends a `TuneLogEntry`
|
|
26
|
+
* to the IStateStore for audit purposes, and emits a `routing:auto-tuned` event.
|
|
27
|
+
*/
|
|
28
|
+
export declare class RoutingTuner {
|
|
29
|
+
private readonly _stateStore;
|
|
30
|
+
private readonly _recommender;
|
|
31
|
+
private readonly _eventEmitter;
|
|
32
|
+
private readonly _configPath;
|
|
33
|
+
private readonly _logger;
|
|
34
|
+
constructor(stateStore: IStateStore, recommender: RoutingRecommender, eventEmitter: TypedEventBus<CoreEvents>, configPath: string, logger: ILogger);
|
|
35
|
+
/**
|
|
36
|
+
* Called at the end of a pipeline run. When auto_tune is enabled and sufficient
|
|
37
|
+
* historical data exists, applies a single conservative model downgrade to the
|
|
38
|
+
* routing config YAML file.
|
|
39
|
+
*
|
|
40
|
+
* @param runId - ID of the just-completed pipeline run
|
|
41
|
+
* @param config - Current model routing config (already loaded from disk)
|
|
42
|
+
*/
|
|
43
|
+
maybeAutoTune(runId: string, config: ModelRoutingConfig): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Register a run ID in the stored run index so future calls can discover
|
|
46
|
+
* all historical breakdowns without a separate run listing endpoint.
|
|
47
|
+
*/
|
|
48
|
+
private _registerRunId;
|
|
49
|
+
/**
|
|
50
|
+
* Load the most recent `lookback` PhaseTokenBreakdown records from the IStateStore.
|
|
51
|
+
*
|
|
52
|
+
* Each breakdown is stored by RoutingTokenAccumulator under the key
|
|
53
|
+
* `'phase_token_breakdown'` scoped to the run ID. The run IDs themselves are
|
|
54
|
+
* tracked in a global index stored under `('__global__', RUN_INDEX_KEY)`.
|
|
55
|
+
*
|
|
56
|
+
* @param lookback - Maximum number of recent runs to inspect
|
|
57
|
+
*/
|
|
58
|
+
private _loadRecentBreakdowns;
|
|
59
|
+
/**
|
|
60
|
+
* Append a TuneLogEntry to the persisted tune log in the IStateStore.
|
|
61
|
+
*
|
|
62
|
+
* NOTE: This uses `'__global__'` as the scope key (codebase convention) rather
|
|
63
|
+
* than the literal `'global'` mentioned in AC6. The tune log is stored as a raw
|
|
64
|
+
* array (not a JSON-stringified string) for internal consistency with how other
|
|
65
|
+
* array values are stored in this IStateStore.
|
|
66
|
+
*/
|
|
67
|
+
private _appendTuneLog;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=routing-tuner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing-tuner.d.ts","sourceRoot":"","sources":["../../src/routing/routing-tuner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,KAAK,EAAE,WAAW,EAAqC,MAAM,YAAY,CAAA;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAoB7D;;;;;;;GAOG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA2B;IACzD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAG/B,UAAU,EAAE,WAAW,EACvB,WAAW,EAAE,kBAAkB,EAC/B,YAAY,EAAE,aAAa,CAAC,UAAU,CAAC,EACvC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,OAAO;IAajB;;;;;;;OAOG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsH7E;;;OAGG;YACW,cAAc;IAS5B;;;;;;;;OAQG;YACW,qBAAqB;IA0BnC;;;;;;;OAOG;YACW,cAAc;CAM7B"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RoutingTuner — automatically applies conservative model downgrades based on
|
|
3
|
+
* historical phase token breakdown data.
|
|
4
|
+
*
|
|
5
|
+
* When `config.auto_tune` is true and enough historical data exists, RoutingTuner
|
|
6
|
+
* selects the highest-confidence downgrade recommendation, updates the YAML config
|
|
7
|
+
* file in place, and appends an audit log entry to the IStateStore.
|
|
8
|
+
*
|
|
9
|
+
* At most one phase is changed per invocation.
|
|
10
|
+
*
|
|
11
|
+
* References:
|
|
12
|
+
* - Epic 28, Story 28-8: Feedback Loop — Telemetry-Driven Routing Tuning
|
|
13
|
+
*/
|
|
14
|
+
import { readFileSync, writeFileSync } from 'node:fs';
|
|
15
|
+
import { load as yamlLoad, dump as yamlDump } from 'js-yaml';
|
|
16
|
+
import { getModelTier } from './model-tier.js';
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Internal constants
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
/** Minimum number of breakdowns required before auto-tuning is attempted. */
|
|
21
|
+
const MIN_BREAKDOWNS_FOR_TUNING = 5;
|
|
22
|
+
/** Key used to store the list of known run IDs in the IStateStore. */
|
|
23
|
+
const RUN_INDEX_KEY = 'phase_token_breakdown_runs';
|
|
24
|
+
/** Key used to store the tune log in the IStateStore. */
|
|
25
|
+
const TUNE_LOG_KEY = 'routing_tune_log';
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// RoutingTuner
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
/**
|
|
30
|
+
* Auto-applies a single conservative model downgrade per invocation when
|
|
31
|
+
* `config.auto_tune` is `true` and sufficient historical data is available.
|
|
32
|
+
*
|
|
33
|
+
* The tuner reads the current routing YAML config, applies the change in memory,
|
|
34
|
+
* and writes it back to disk synchronously. It also appends a `TuneLogEntry`
|
|
35
|
+
* to the IStateStore for audit purposes, and emits a `routing:auto-tuned` event.
|
|
36
|
+
*/
|
|
37
|
+
export class RoutingTuner {
|
|
38
|
+
_stateStore;
|
|
39
|
+
_recommender;
|
|
40
|
+
_eventEmitter;
|
|
41
|
+
_configPath;
|
|
42
|
+
_logger;
|
|
43
|
+
constructor(stateStore, recommender, eventEmitter, configPath, logger) {
|
|
44
|
+
this._stateStore = stateStore;
|
|
45
|
+
this._recommender = recommender;
|
|
46
|
+
this._eventEmitter = eventEmitter;
|
|
47
|
+
this._configPath = configPath;
|
|
48
|
+
this._logger = logger;
|
|
49
|
+
}
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
// Public API
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
/**
|
|
54
|
+
* Called at the end of a pipeline run. When auto_tune is enabled and sufficient
|
|
55
|
+
* historical data exists, applies a single conservative model downgrade to the
|
|
56
|
+
* routing config YAML file.
|
|
57
|
+
*
|
|
58
|
+
* @param runId - ID of the just-completed pipeline run
|
|
59
|
+
* @param config - Current model routing config (already loaded from disk)
|
|
60
|
+
*/
|
|
61
|
+
async maybeAutoTune(runId, config) {
|
|
62
|
+
if (config.auto_tune !== true) {
|
|
63
|
+
this._logger.debug({ runId }, 'auto_tune_disabled — skipping RoutingTuner');
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// Register the current run in the run index
|
|
67
|
+
await this._registerRunId(runId);
|
|
68
|
+
// Load recent breakdowns
|
|
69
|
+
const breakdowns = await this._loadRecentBreakdowns(10);
|
|
70
|
+
if (breakdowns.length < MIN_BREAKDOWNS_FOR_TUNING) {
|
|
71
|
+
this._logger.debug({ runId, available: breakdowns.length, required: MIN_BREAKDOWNS_FOR_TUNING }, 'insufficient_data — not enough breakdowns for auto-tuning');
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// Compute recommendations
|
|
75
|
+
const analysis = this._recommender.analyze(breakdowns, config);
|
|
76
|
+
if (analysis.insufficientData) {
|
|
77
|
+
this._logger.debug({ runId }, 'Recommender returned insufficientData');
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// Filter to downgrade-only, one-step transitions (|currentTier - suggestedTier| === 1).
|
|
81
|
+
// The one-step check uses getModelTier() to prevent opus→haiku two-step jumps even
|
|
82
|
+
// if a recommender were to emit such a recommendation.
|
|
83
|
+
const downgradeCandidates = analysis.recommendations.filter((rec) => {
|
|
84
|
+
if (rec.direction !== 'downgrade')
|
|
85
|
+
return false;
|
|
86
|
+
const tierDiff = Math.abs(getModelTier(rec.currentModel) - getModelTier(rec.suggestedModel));
|
|
87
|
+
return tierDiff === 1;
|
|
88
|
+
});
|
|
89
|
+
if (downgradeCandidates.length === 0) {
|
|
90
|
+
this._logger.debug({ runId }, 'no_safe_recommendation');
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// Pick the highest-confidence candidate
|
|
94
|
+
const topRec = downgradeCandidates.sort((a, b) => b.confidence - a.confidence)[0];
|
|
95
|
+
// Apply the change to the YAML config
|
|
96
|
+
let rawContent;
|
|
97
|
+
try {
|
|
98
|
+
rawContent = readFileSync(this._configPath, 'utf-8');
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
102
|
+
this._logger.warn({ err: msg, configPath: this._configPath }, 'Failed to read routing config for auto-tune');
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
let rawObject;
|
|
106
|
+
try {
|
|
107
|
+
rawObject = yamlLoad(rawContent);
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
111
|
+
this._logger.warn({ err: msg }, 'Failed to parse routing config YAML for auto-tune');
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
// Mutate the phase model
|
|
115
|
+
const configObj = rawObject;
|
|
116
|
+
if (configObj.phases === undefined) {
|
|
117
|
+
configObj.phases = {};
|
|
118
|
+
}
|
|
119
|
+
const existingPhase = configObj.phases[topRec.phase];
|
|
120
|
+
if (existingPhase !== undefined) {
|
|
121
|
+
existingPhase.model = topRec.suggestedModel;
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
configObj.phases[topRec.phase] = { model: topRec.suggestedModel };
|
|
125
|
+
}
|
|
126
|
+
// Write the updated config back to disk
|
|
127
|
+
try {
|
|
128
|
+
writeFileSync(this._configPath, yamlDump(rawObject, { lineWidth: 120 }), 'utf-8');
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
132
|
+
this._logger.warn({ err: msg, configPath: this._configPath }, 'Failed to write updated routing config');
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
// Append audit log entry
|
|
136
|
+
const tuneEntry = {
|
|
137
|
+
id: crypto.randomUUID(),
|
|
138
|
+
runId,
|
|
139
|
+
phase: topRec.phase,
|
|
140
|
+
oldModel: topRec.currentModel,
|
|
141
|
+
newModel: topRec.suggestedModel,
|
|
142
|
+
estimatedSavingsPct: topRec.estimatedSavingsPct,
|
|
143
|
+
appliedAt: new Date().toISOString(),
|
|
144
|
+
};
|
|
145
|
+
await this._appendTuneLog(tuneEntry);
|
|
146
|
+
// Emit event
|
|
147
|
+
this._eventEmitter.emit('routing:auto-tuned', {
|
|
148
|
+
runId,
|
|
149
|
+
phase: topRec.phase,
|
|
150
|
+
oldModel: topRec.currentModel,
|
|
151
|
+
newModel: topRec.suggestedModel,
|
|
152
|
+
estimatedSavingsPct: topRec.estimatedSavingsPct,
|
|
153
|
+
});
|
|
154
|
+
this._logger.info({ runId, phase: topRec.phase, oldModel: topRec.currentModel, newModel: topRec.suggestedModel }, 'Auto-tuned routing config — applied downgrade');
|
|
155
|
+
}
|
|
156
|
+
// ---------------------------------------------------------------------------
|
|
157
|
+
// Private helpers
|
|
158
|
+
// ---------------------------------------------------------------------------
|
|
159
|
+
/**
|
|
160
|
+
* Register a run ID in the stored run index so future calls can discover
|
|
161
|
+
* all historical breakdowns without a separate run listing endpoint.
|
|
162
|
+
*/
|
|
163
|
+
async _registerRunId(runId) {
|
|
164
|
+
const existing = await this._stateStore.getMetric('__global__', RUN_INDEX_KEY);
|
|
165
|
+
const runIds = Array.isArray(existing) ? existing : [];
|
|
166
|
+
if (!runIds.includes(runId)) {
|
|
167
|
+
runIds.push(runId);
|
|
168
|
+
await this._stateStore.setMetric('__global__', RUN_INDEX_KEY, runIds);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Load the most recent `lookback` PhaseTokenBreakdown records from the IStateStore.
|
|
173
|
+
*
|
|
174
|
+
* Each breakdown is stored by RoutingTokenAccumulator under the key
|
|
175
|
+
* `'phase_token_breakdown'` scoped to the run ID. The run IDs themselves are
|
|
176
|
+
* tracked in a global index stored under `('__global__', RUN_INDEX_KEY)`.
|
|
177
|
+
*
|
|
178
|
+
* @param lookback - Maximum number of recent runs to inspect
|
|
179
|
+
*/
|
|
180
|
+
async _loadRecentBreakdowns(lookback) {
|
|
181
|
+
const existing = await this._stateStore.getMetric('__global__', RUN_INDEX_KEY);
|
|
182
|
+
const allRunIds = Array.isArray(existing) ? existing : [];
|
|
183
|
+
// Take the most recent `lookback` run IDs
|
|
184
|
+
const recentRunIds = allRunIds.slice(-lookback);
|
|
185
|
+
const breakdowns = [];
|
|
186
|
+
for (const runId of recentRunIds) {
|
|
187
|
+
try {
|
|
188
|
+
const raw = await this._stateStore.getMetric(runId, 'phase_token_breakdown');
|
|
189
|
+
if (raw !== undefined && raw !== null) {
|
|
190
|
+
// The value may be stored as an object or as a JSON string
|
|
191
|
+
const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw;
|
|
192
|
+
breakdowns.push(parsed);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
197
|
+
this._logger.debug({ runId, err: msg }, 'Failed to load breakdown for run — skipping');
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return breakdowns;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Append a TuneLogEntry to the persisted tune log in the IStateStore.
|
|
204
|
+
*
|
|
205
|
+
* NOTE: This uses `'__global__'` as the scope key (codebase convention) rather
|
|
206
|
+
* than the literal `'global'` mentioned in AC6. The tune log is stored as a raw
|
|
207
|
+
* array (not a JSON-stringified string) for internal consistency with how other
|
|
208
|
+
* array values are stored in this IStateStore.
|
|
209
|
+
*/
|
|
210
|
+
async _appendTuneLog(entry) {
|
|
211
|
+
const existing = await this._stateStore.getMetric('__global__', TUNE_LOG_KEY);
|
|
212
|
+
const log = Array.isArray(existing) ? existing : [];
|
|
213
|
+
log.push(entry);
|
|
214
|
+
await this._stateStore.setMetric('__global__', TUNE_LOG_KEY, log);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=routing-tuner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing-tuner.js","sourceRoot":"","sources":["../../src/routing/routing-tuner.ts"],"names":[],"mappings":"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"}
|