@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,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metrics query functions for the persistence layer.
|
|
3
|
+
*
|
|
4
|
+
* Provides CRUD operations for run_metrics and story_metrics tables (Story 17-2).
|
|
5
|
+
*
|
|
6
|
+
* All functions are async and accept a DatabaseAdapter, making them
|
|
7
|
+
* compatible with both the SqliteDatabaseAdapter and DoltDatabaseAdapter.
|
|
8
|
+
*/
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// Run metrics queries
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
/**
|
|
13
|
+
* Write or update run-level metrics.
|
|
14
|
+
*
|
|
15
|
+
* Uses a portable delete-then-insert pattern inside a transaction to work on
|
|
16
|
+
* both SQLite/WASM and Dolt/MySQL. When a row already exists, the `restarts`
|
|
17
|
+
* and `is_baseline` values are preserved from the existing row (so any
|
|
18
|
+
* `incrementRunRestarts()` calls made by the supervisor between the caller's
|
|
19
|
+
* read and this write are not silently overwritten).
|
|
20
|
+
*/
|
|
21
|
+
export async function writeRunMetrics(adapter, input) {
|
|
22
|
+
await adapter.transaction(async (tx) => {
|
|
23
|
+
// Read existing row to preserve restarts and is_baseline
|
|
24
|
+
const existing = await tx.query('SELECT restarts, is_baseline FROM run_metrics WHERE run_id = ?', [input.run_id]);
|
|
25
|
+
if (existing.length > 0) {
|
|
26
|
+
await tx.query('DELETE FROM run_metrics WHERE run_id = ?', [input.run_id]);
|
|
27
|
+
}
|
|
28
|
+
const restarts = existing[0]?.restarts ?? (input.restarts ?? 0);
|
|
29
|
+
const isBaseline = existing[0]?.is_baseline ?? (input.is_baseline ?? 0);
|
|
30
|
+
await tx.query(`INSERT INTO run_metrics (
|
|
31
|
+
run_id, methodology, status, started_at, completed_at,
|
|
32
|
+
wall_clock_seconds, total_input_tokens, total_output_tokens, total_cost_usd,
|
|
33
|
+
stories_attempted, stories_succeeded, stories_failed, stories_escalated,
|
|
34
|
+
total_review_cycles, total_dispatches, concurrency_setting, max_concurrent_actual, restarts,
|
|
35
|
+
is_baseline
|
|
36
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
37
|
+
input.run_id,
|
|
38
|
+
input.methodology,
|
|
39
|
+
input.status,
|
|
40
|
+
input.started_at,
|
|
41
|
+
input.completed_at ?? null,
|
|
42
|
+
input.wall_clock_seconds ?? 0,
|
|
43
|
+
input.total_input_tokens ?? 0,
|
|
44
|
+
input.total_output_tokens ?? 0,
|
|
45
|
+
input.total_cost_usd ?? 0,
|
|
46
|
+
input.stories_attempted ?? 0,
|
|
47
|
+
input.stories_succeeded ?? 0,
|
|
48
|
+
input.stories_failed ?? 0,
|
|
49
|
+
input.stories_escalated ?? 0,
|
|
50
|
+
input.total_review_cycles ?? 0,
|
|
51
|
+
input.total_dispatches ?? 0,
|
|
52
|
+
input.concurrency_setting ?? 1,
|
|
53
|
+
input.max_concurrent_actual ?? 1,
|
|
54
|
+
restarts,
|
|
55
|
+
isBaseline,
|
|
56
|
+
]);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get run metrics for a specific run.
|
|
61
|
+
*/
|
|
62
|
+
export async function getRunMetrics(adapter, runId) {
|
|
63
|
+
const rows = await adapter.query('SELECT * FROM run_metrics WHERE run_id = ?', [runId]);
|
|
64
|
+
return rows[0];
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* List the most recent N run metrics rows, newest first.
|
|
68
|
+
*/
|
|
69
|
+
export async function listRunMetrics(adapter, limit = 10) {
|
|
70
|
+
return adapter.query('SELECT * FROM run_metrics ORDER BY started_at DESC LIMIT ?', [limit]);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Tag a run as the baseline (clears any existing baseline first).
|
|
74
|
+
*/
|
|
75
|
+
export async function tagRunAsBaseline(adapter, runId) {
|
|
76
|
+
await adapter.transaction(async (tx) => {
|
|
77
|
+
await tx.query('UPDATE run_metrics SET is_baseline = 0');
|
|
78
|
+
await tx.query('UPDATE run_metrics SET is_baseline = 1 WHERE run_id = ?', [runId]);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get the current baseline run metrics (if any).
|
|
83
|
+
*/
|
|
84
|
+
export async function getBaselineRunMetrics(adapter) {
|
|
85
|
+
const rows = await adapter.query('SELECT * FROM run_metrics WHERE is_baseline = 1 LIMIT 1');
|
|
86
|
+
return rows[0];
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Increment the restart count for a run by 1.
|
|
90
|
+
* Called by the supervisor each time it successfully restarts the pipeline.
|
|
91
|
+
* If the run_id does not yet exist in run_metrics, a placeholder row is
|
|
92
|
+
* inserted so the restart count is not lost — writeRunMetrics will overwrite
|
|
93
|
+
* all other fields when the run reaches a terminal state.
|
|
94
|
+
*
|
|
95
|
+
* Uses a portable select-then-update/insert pattern inside a transaction to
|
|
96
|
+
* work on both SQLite/WASM and Dolt/MySQL.
|
|
97
|
+
*/
|
|
98
|
+
export async function incrementRunRestarts(adapter, runId) {
|
|
99
|
+
await adapter.transaction(async (tx) => {
|
|
100
|
+
const existing = await tx.query('SELECT restarts FROM run_metrics WHERE run_id = ?', [runId]);
|
|
101
|
+
if (existing.length > 0) {
|
|
102
|
+
await tx.query('UPDATE run_metrics SET restarts = ? WHERE run_id = ?', [existing[0].restarts + 1, runId]);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
await tx.query(`INSERT INTO run_metrics (run_id, methodology, status, started_at, restarts)
|
|
106
|
+
VALUES (?, 'unknown', 'running', ?, 1)`, [runId, new Date().toISOString()]);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
// Story metrics queries
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
/**
|
|
114
|
+
* Write or update story-level metrics.
|
|
115
|
+
*
|
|
116
|
+
* Uses a portable delete-then-insert pattern inside a transaction to work on
|
|
117
|
+
* both SQLite/WASM and Dolt/MySQL. When a row already exists, the `started_at`
|
|
118
|
+
* value is preserved from the existing row if the new value is null.
|
|
119
|
+
*/
|
|
120
|
+
export async function writeStoryMetrics(adapter, input) {
|
|
121
|
+
await adapter.transaction(async (tx) => {
|
|
122
|
+
// Read existing row to preserve started_at when new value is null
|
|
123
|
+
const existing = await tx.query('SELECT started_at FROM story_metrics WHERE run_id = ? AND story_key = ?', [input.run_id, input.story_key]);
|
|
124
|
+
if (existing.length > 0) {
|
|
125
|
+
await tx.query('DELETE FROM story_metrics WHERE run_id = ? AND story_key = ?', [input.run_id, input.story_key]);
|
|
126
|
+
}
|
|
127
|
+
const startedAt = input.started_at ?? existing[0]?.started_at ?? null;
|
|
128
|
+
await tx.query(`INSERT INTO story_metrics (
|
|
129
|
+
run_id, story_key, result, phase_durations_json, started_at, completed_at,
|
|
130
|
+
wall_clock_seconds, input_tokens, output_tokens, cost_usd,
|
|
131
|
+
review_cycles, dispatches, primary_agent_id, primary_model, dispatch_agents_json
|
|
132
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
133
|
+
input.run_id,
|
|
134
|
+
input.story_key,
|
|
135
|
+
input.result,
|
|
136
|
+
input.phase_durations_json ?? null,
|
|
137
|
+
startedAt,
|
|
138
|
+
input.completed_at ?? null,
|
|
139
|
+
input.wall_clock_seconds ?? 0,
|
|
140
|
+
input.input_tokens ?? 0,
|
|
141
|
+
input.output_tokens ?? 0,
|
|
142
|
+
input.cost_usd ?? 0,
|
|
143
|
+
input.review_cycles ?? 0,
|
|
144
|
+
input.dispatches ?? 0,
|
|
145
|
+
input.primary_agent_id ?? null,
|
|
146
|
+
input.primary_model ?? null,
|
|
147
|
+
input.dispatch_agents_json ?? null,
|
|
148
|
+
]);
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get all story metrics for a given run.
|
|
153
|
+
*/
|
|
154
|
+
export async function getStoryMetricsForRun(adapter, runId) {
|
|
155
|
+
return adapter.query('SELECT * FROM story_metrics WHERE run_id = ? ORDER BY id ASC', [runId]);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Compare two runs and return percentage deltas for key numeric fields.
|
|
159
|
+
* Positive deltas mean run B is larger/longer than run A.
|
|
160
|
+
* Returns null if either run does not exist.
|
|
161
|
+
*/
|
|
162
|
+
export async function compareRunMetrics(adapter, runIdA, runIdB) {
|
|
163
|
+
const a = await getRunMetrics(adapter, runIdA);
|
|
164
|
+
const b = await getRunMetrics(adapter, runIdB);
|
|
165
|
+
if (!a || !b)
|
|
166
|
+
return null;
|
|
167
|
+
const pct = (base, diff) => base === 0 ? null : Math.round((diff / base) * 100 * 10) / 10;
|
|
168
|
+
const inputDelta = b.total_input_tokens - a.total_input_tokens;
|
|
169
|
+
const outputDelta = b.total_output_tokens - a.total_output_tokens;
|
|
170
|
+
const clockDelta = (b.wall_clock_seconds ?? 0) - (a.wall_clock_seconds ?? 0);
|
|
171
|
+
const cycleDelta = b.total_review_cycles - a.total_review_cycles;
|
|
172
|
+
const costDelta = (b.total_cost_usd ?? 0) - (a.total_cost_usd ?? 0);
|
|
173
|
+
return {
|
|
174
|
+
run_id_a: runIdA,
|
|
175
|
+
run_id_b: runIdB,
|
|
176
|
+
token_input_delta: inputDelta,
|
|
177
|
+
token_output_delta: outputDelta,
|
|
178
|
+
token_input_pct: pct(a.total_input_tokens, inputDelta),
|
|
179
|
+
token_output_pct: pct(a.total_output_tokens, outputDelta),
|
|
180
|
+
wall_clock_delta_seconds: clockDelta,
|
|
181
|
+
wall_clock_pct: pct(a.wall_clock_seconds ?? 0, clockDelta),
|
|
182
|
+
review_cycles_delta: cycleDelta,
|
|
183
|
+
review_cycles_pct: pct(a.total_review_cycles, cycleDelta),
|
|
184
|
+
cost_delta: costDelta,
|
|
185
|
+
cost_pct: pct(a.total_cost_usd ?? 0, costDelta),
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Fetch a full run summary for consumption by the supervisor agent (AC5).
|
|
190
|
+
* Includes per-story metrics and baseline delta percentages.
|
|
191
|
+
*/
|
|
192
|
+
export async function getRunSummaryForSupervisor(adapter, runId) {
|
|
193
|
+
const run = await getRunMetrics(adapter, runId);
|
|
194
|
+
if (!run)
|
|
195
|
+
return null;
|
|
196
|
+
const stories = await getStoryMetricsForRun(adapter, runId);
|
|
197
|
+
const baseline = await getBaselineRunMetrics(adapter);
|
|
198
|
+
let token_vs_baseline_pct = null;
|
|
199
|
+
let review_cycles_vs_baseline_pct = null;
|
|
200
|
+
if (baseline && baseline.run_id !== runId) {
|
|
201
|
+
const pct = (base, val) => base === 0 ? 0 : Math.round(((val - base) / base) * 100 * 10) / 10;
|
|
202
|
+
token_vs_baseline_pct = pct((baseline.total_input_tokens ?? 0) + (baseline.total_output_tokens ?? 0), (run.total_input_tokens ?? 0) + (run.total_output_tokens ?? 0));
|
|
203
|
+
review_cycles_vs_baseline_pct = pct(baseline.total_review_cycles ?? 0, run.total_review_cycles ?? 0);
|
|
204
|
+
}
|
|
205
|
+
return { run, stories, baseline, token_vs_baseline_pct, review_cycles_vs_baseline_pct };
|
|
206
|
+
}
|
|
207
|
+
// ---------------------------------------------------------------------------
|
|
208
|
+
// Token aggregation
|
|
209
|
+
// ---------------------------------------------------------------------------
|
|
210
|
+
/**
|
|
211
|
+
* Aggregate token usage from the token_usage table for a pipeline run.
|
|
212
|
+
*/
|
|
213
|
+
export async function aggregateTokenUsageForRun(adapter, runId) {
|
|
214
|
+
const rows = await adapter.query(`SELECT
|
|
215
|
+
COALESCE(SUM(input_tokens), 0) as input,
|
|
216
|
+
COALESCE(SUM(output_tokens), 0) as output,
|
|
217
|
+
COALESCE(SUM(cost_usd), 0) as cost
|
|
218
|
+
FROM token_usage
|
|
219
|
+
WHERE pipeline_run_id = ?`, [runId]);
|
|
220
|
+
return rows[0] ?? { input: 0, output: 0, cost: 0 };
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Aggregate token usage for a specific story within a pipeline run.
|
|
224
|
+
* Matches rows where the metadata JSON contains the given storyKey.
|
|
225
|
+
*/
|
|
226
|
+
export async function aggregateTokenUsageForStory(adapter, runId, storyKey) {
|
|
227
|
+
const rows = await adapter.query(`SELECT
|
|
228
|
+
COALESCE(SUM(input_tokens), 0) as input,
|
|
229
|
+
COALESCE(SUM(output_tokens), 0) as output,
|
|
230
|
+
COALESCE(SUM(cost_usd), 0) as cost
|
|
231
|
+
FROM token_usage
|
|
232
|
+
WHERE pipeline_run_id = ?
|
|
233
|
+
AND metadata IS NOT NULL
|
|
234
|
+
AND metadata LIKE ?`, [runId, `%"storyKey":"${storyKey}"%`]);
|
|
235
|
+
return rows[0] ?? { input: 0, output: 0, cost: 0 };
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/persistence/queries/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query functions for retryable escalated stories.
|
|
3
|
+
*
|
|
4
|
+
* Reads escalation-diagnosis decisions from the decision store and classifies
|
|
5
|
+
* each story as retryable (retry-targeted) or skipped (human-intervention /
|
|
6
|
+
* split-story).
|
|
7
|
+
*
|
|
8
|
+
* All functions are async and accept a DatabaseAdapter, making them
|
|
9
|
+
* compatible with both the SqliteDatabaseAdapter and DoltDatabaseAdapter.
|
|
10
|
+
*/
|
|
11
|
+
import type { DatabaseAdapter } from '../types.js';
|
|
12
|
+
export interface SkippedStory {
|
|
13
|
+
key: string;
|
|
14
|
+
reason: string;
|
|
15
|
+
}
|
|
16
|
+
export interface RetryableEscalationsResult {
|
|
17
|
+
retryable: string[];
|
|
18
|
+
skipped: SkippedStory[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Query the decision store for escalation-diagnosis decisions and classify
|
|
22
|
+
* each story key as retryable or skipped.
|
|
23
|
+
*
|
|
24
|
+
* Key format in the DB: `{storyKey}:{runId}`
|
|
25
|
+
*
|
|
26
|
+
* - When `runId` is provided, only decisions whose key contains that runId
|
|
27
|
+
* are considered (AC5 scoping).
|
|
28
|
+
* - When `runId` is omitted, the runId of the last (most recently created)
|
|
29
|
+
* escalation-diagnosis decision is used as the default (AC1 defaulting).
|
|
30
|
+
*
|
|
31
|
+
* @param adapter The database adapter
|
|
32
|
+
* @param runId Optional run ID to scope the query
|
|
33
|
+
*/
|
|
34
|
+
export declare function getRetryableEscalations(adapter: DatabaseAdapter, runId?: string): Promise<RetryableEscalationsResult>;
|
|
35
|
+
//# sourceMappingURL=retry-escalated.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-escalated.d.ts","sourceRoot":"","sources":["../../../src/persistence/queries/retry-escalated.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAiBlD,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,OAAO,EAAE,YAAY,EAAE,CAAA;CACxB;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,eAAe,EACxB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,0BAA0B,CAAC,CAmErC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query functions for retryable escalated stories.
|
|
3
|
+
*
|
|
4
|
+
* Reads escalation-diagnosis decisions from the decision store and classifies
|
|
5
|
+
* each story as retryable (retry-targeted) or skipped (human-intervention /
|
|
6
|
+
* split-story).
|
|
7
|
+
*
|
|
8
|
+
* All functions are async and accept a DatabaseAdapter, making them
|
|
9
|
+
* compatible with both the SqliteDatabaseAdapter and DoltDatabaseAdapter.
|
|
10
|
+
*/
|
|
11
|
+
import { getDecisionsByCategory } from './decisions.js';
|
|
12
|
+
import { ESCALATION_DIAGNOSIS } from '../schemas/operational.js';
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Query
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
/**
|
|
17
|
+
* Query the decision store for escalation-diagnosis decisions and classify
|
|
18
|
+
* each story key as retryable or skipped.
|
|
19
|
+
*
|
|
20
|
+
* Key format in the DB: `{storyKey}:{runId}`
|
|
21
|
+
*
|
|
22
|
+
* - When `runId` is provided, only decisions whose key contains that runId
|
|
23
|
+
* are considered (AC5 scoping).
|
|
24
|
+
* - When `runId` is omitted, the runId of the last (most recently created)
|
|
25
|
+
* escalation-diagnosis decision is used as the default (AC1 defaulting).
|
|
26
|
+
*
|
|
27
|
+
* @param adapter The database adapter
|
|
28
|
+
* @param runId Optional run ID to scope the query
|
|
29
|
+
*/
|
|
30
|
+
export async function getRetryableEscalations(adapter, runId) {
|
|
31
|
+
const decisions = await getDecisionsByCategory(adapter, ESCALATION_DIAGNOSIS);
|
|
32
|
+
const result = { retryable: [], skipped: [] };
|
|
33
|
+
if (decisions.length === 0) {
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
const parsed = [];
|
|
37
|
+
for (const decision of decisions) {
|
|
38
|
+
const colonIdx = decision.key.indexOf(':');
|
|
39
|
+
if (colonIdx === -1)
|
|
40
|
+
continue; // skip malformed keys
|
|
41
|
+
const storyKey = decision.key.slice(0, colonIdx);
|
|
42
|
+
const decisionRunId = decision.key.slice(colonIdx + 1);
|
|
43
|
+
let diagnosis;
|
|
44
|
+
try {
|
|
45
|
+
diagnosis = JSON.parse(decision.value);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
continue; // skip malformed values
|
|
49
|
+
}
|
|
50
|
+
parsed.push({ storyKey, decisionRunId, diagnosis });
|
|
51
|
+
}
|
|
52
|
+
if (parsed.length === 0) {
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
// Determine effective runId:
|
|
56
|
+
// - If caller supplies a runId, use it (AC5)
|
|
57
|
+
// - Otherwise, use the runId of the last decision (most recently created = latest run) (AC1)
|
|
58
|
+
const effectiveRunId = runId ?? (parsed[parsed.length - 1].decisionRunId);
|
|
59
|
+
// Deduplicate by storyKey: keep the last entry per storyKey (last write wins since the
|
|
60
|
+
// list is ordered by created_at ASC — later entries in the array are more recent).
|
|
61
|
+
const lastEntryByKey = new Map();
|
|
62
|
+
for (const entry of parsed) {
|
|
63
|
+
if (entry.decisionRunId !== effectiveRunId)
|
|
64
|
+
continue;
|
|
65
|
+
// Overwrite so the last occurrence wins
|
|
66
|
+
lastEntryByKey.set(entry.storyKey, entry);
|
|
67
|
+
}
|
|
68
|
+
for (const [storyKey, entry] of lastEntryByKey.entries()) {
|
|
69
|
+
const { recommendedAction } = entry.diagnosis;
|
|
70
|
+
if (recommendedAction === 'retry-targeted') {
|
|
71
|
+
result.retryable.push(storyKey);
|
|
72
|
+
}
|
|
73
|
+
else if (recommendedAction === 'human-intervention') {
|
|
74
|
+
result.skipped.push({ key: storyKey, reason: 'needs human review' });
|
|
75
|
+
}
|
|
76
|
+
else if (recommendedAction === 'split-story') {
|
|
77
|
+
result.skipped.push({ key: storyKey, reason: 'story should be split' });
|
|
78
|
+
}
|
|
79
|
+
// Unknown recommendedAction values are silently ignored
|
|
80
|
+
}
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=retry-escalated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-escalated.js","sourceRoot":"","sources":["../../../src/persistence/queries/retry-escalated.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema version management contract for @substrate-ai/core.
|
|
3
|
+
*
|
|
4
|
+
* This module defines the versioning contract — interfaces, type aliases,
|
|
5
|
+
* constants, and the `checkSchemaVersion` runtime function. It does NOT
|
|
6
|
+
* contain schema DDL for application tables (those live in schema.ts).
|
|
7
|
+
*
|
|
8
|
+
* The concrete `SchemaVersionManagerImpl` is added in Epic 41 (story 41-3).
|
|
9
|
+
* Factory schema versioning (Epic 44) uses `FACTORY_SCHEMA_NAME` defined here.
|
|
10
|
+
*/
|
|
11
|
+
import type { DatabaseAdapter } from './types.js';
|
|
12
|
+
/** Canonical schema name for the core (monolith) persistence schema. */
|
|
13
|
+
export declare const CORE_SCHEMA_NAME: "core";
|
|
14
|
+
/** Canonical schema name for the factory persistence schema (Epic 44+). */
|
|
15
|
+
export declare const FACTORY_SCHEMA_NAME: "factory";
|
|
16
|
+
/**
|
|
17
|
+
* Canonical DDL for the `schema_version` table.
|
|
18
|
+
* Epic 41 will call this as part of `initSchema`.
|
|
19
|
+
*/
|
|
20
|
+
export declare const SCHEMA_VERSION_DDL: "\n CREATE TABLE IF NOT EXISTS schema_version (\n schema_name TEXT NOT NULL,\n version INTEGER NOT NULL,\n applied_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,\n PRIMARY KEY (schema_name)\n )\n";
|
|
21
|
+
/** A single row in the `schema_version` table. */
|
|
22
|
+
export interface SchemaVersionRecord {
|
|
23
|
+
schema_name: string;
|
|
24
|
+
version: number;
|
|
25
|
+
applied_at: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Result returned by `checkSchemaVersion`.
|
|
29
|
+
*
|
|
30
|
+
* - `action: 'ok'` — stored version matches expected; no action needed
|
|
31
|
+
* - `action: 'migrate'` — stored version is less than expected; run migrations
|
|
32
|
+
* - `action: 'incompatible'` — stored version is null (table empty) or greater
|
|
33
|
+
* than expected; manual intervention required
|
|
34
|
+
*/
|
|
35
|
+
export interface SchemaVersionCheckResult {
|
|
36
|
+
compatible: boolean;
|
|
37
|
+
storedVersion: number | null;
|
|
38
|
+
expectedVersion: number;
|
|
39
|
+
action: 'ok' | 'migrate' | 'incompatible';
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Interface for the schema version manager.
|
|
43
|
+
* The concrete implementation (`SchemaVersionManagerImpl`) is added in Epic 41.
|
|
44
|
+
*/
|
|
45
|
+
export interface SchemaVersionManager {
|
|
46
|
+
/** Ensure the `schema_version` table exists (idempotent). */
|
|
47
|
+
ensureVersionTable(adapter: DatabaseAdapter): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Return the currently stored version for `schemaName`, or `null` if no
|
|
50
|
+
* row exists for that schema.
|
|
51
|
+
*/
|
|
52
|
+
getCurrentVersion(adapter: DatabaseAdapter, schemaName: string): Promise<number | null>;
|
|
53
|
+
/** Upsert the version row for `schemaName`. */
|
|
54
|
+
setVersion(adapter: DatabaseAdapter, schemaName: string, version: number): Promise<void>;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* A single schema migration step.
|
|
58
|
+
* Migrations must be strictly additive on the `'migrate'` path (new columns
|
|
59
|
+
* with defaults, new tables). Destructive changes require `'incompatible'`.
|
|
60
|
+
*/
|
|
61
|
+
export interface SchemaMigration {
|
|
62
|
+
fromVersion: number;
|
|
63
|
+
toVersion: number;
|
|
64
|
+
description: string;
|
|
65
|
+
up: (adapter: DatabaseAdapter) => Promise<void>;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Function type alias for the migration orchestration entry point.
|
|
69
|
+
* Implementations are responsible for ordering migrations by `fromVersion`,
|
|
70
|
+
* executing them in sequence, and updating the version row after each step.
|
|
71
|
+
*/
|
|
72
|
+
export type MigrationRunner = (adapter: DatabaseAdapter, migrations: SchemaMigration[], schemaName: string, targetVersion: number) => Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Check whether the stored schema version for `schemaName` is compatible with
|
|
75
|
+
* `expectedVersion`.
|
|
76
|
+
*
|
|
77
|
+
* Queries the `schema_version` table directly via `adapter`. Callers must
|
|
78
|
+
* ensure the table exists before calling this function (use
|
|
79
|
+
* `SchemaVersionManager.ensureVersionTable` or include `SCHEMA_VERSION_DDL`
|
|
80
|
+
* in `initSchema`).
|
|
81
|
+
*
|
|
82
|
+
* Decision logic:
|
|
83
|
+
* - `storedVersion === expectedVersion` → `{ action: 'ok', compatible: true }`
|
|
84
|
+
* - `storedVersion < expectedVersion` → `{ action: 'migrate', compatible: false }`
|
|
85
|
+
* - `storedVersion > expectedVersion` → `{ action: 'incompatible', compatible: false }`
|
|
86
|
+
* - no row for `schemaName` → `{ action: 'incompatible', compatible: false }`
|
|
87
|
+
*/
|
|
88
|
+
export declare function checkSchemaVersion(adapter: DatabaseAdapter, schemaName: string, expectedVersion: number): Promise<SchemaVersionCheckResult>;
|
|
89
|
+
//# sourceMappingURL=schema-version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-version.d.ts","sourceRoot":"","sources":["../../src/persistence/schema-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAMjD,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,EAAG,MAAe,CAAA;AAE/C,2EAA2E;AAC3E,eAAO,MAAM,mBAAmB,EAAG,SAAkB,CAAA;AAMrD;;;GAGG;AACH,eAAO,MAAM,kBAAkB,4NAOrB,CAAA;AAMV,kDAAkD;AAClD,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,OAAO,CAAA;IACnB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,IAAI,GAAG,SAAS,GAAG,cAAc,CAAA;CAC1C;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE3D;;;OAGG;IACH,iBAAiB,CAAC,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IAEvF,+CAA+C;IAC/C,UAAU,CAAC,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACzF;AAMD;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,EAAE,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAChD;AAED;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,CAC5B,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,eAAe,EAAE,EAC7B,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,KAClB,OAAO,CAAC,IAAI,CAAC,CAAA;AAMlB;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,wBAAwB,CAAC,CAuBnC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema version management contract for @substrate-ai/core.
|
|
3
|
+
*
|
|
4
|
+
* This module defines the versioning contract — interfaces, type aliases,
|
|
5
|
+
* constants, and the `checkSchemaVersion` runtime function. It does NOT
|
|
6
|
+
* contain schema DDL for application tables (those live in schema.ts).
|
|
7
|
+
*
|
|
8
|
+
* The concrete `SchemaVersionManagerImpl` is added in Epic 41 (story 41-3).
|
|
9
|
+
* Factory schema versioning (Epic 44) uses `FACTORY_SCHEMA_NAME` defined here.
|
|
10
|
+
*/
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Schema name constants
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
/** Canonical schema name for the core (monolith) persistence schema. */
|
|
15
|
+
export const CORE_SCHEMA_NAME = 'core';
|
|
16
|
+
/** Canonical schema name for the factory persistence schema (Epic 44+). */
|
|
17
|
+
export const FACTORY_SCHEMA_NAME = 'factory';
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// DDL
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
/**
|
|
22
|
+
* Canonical DDL for the `schema_version` table.
|
|
23
|
+
* Epic 41 will call this as part of `initSchema`.
|
|
24
|
+
*/
|
|
25
|
+
export const SCHEMA_VERSION_DDL = `
|
|
26
|
+
CREATE TABLE IF NOT EXISTS schema_version (
|
|
27
|
+
schema_name TEXT NOT NULL,
|
|
28
|
+
version INTEGER NOT NULL,
|
|
29
|
+
applied_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
30
|
+
PRIMARY KEY (schema_name)
|
|
31
|
+
)
|
|
32
|
+
`;
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// Runtime helper
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
/**
|
|
37
|
+
* Check whether the stored schema version for `schemaName` is compatible with
|
|
38
|
+
* `expectedVersion`.
|
|
39
|
+
*
|
|
40
|
+
* Queries the `schema_version` table directly via `adapter`. Callers must
|
|
41
|
+
* ensure the table exists before calling this function (use
|
|
42
|
+
* `SchemaVersionManager.ensureVersionTable` or include `SCHEMA_VERSION_DDL`
|
|
43
|
+
* in `initSchema`).
|
|
44
|
+
*
|
|
45
|
+
* Decision logic:
|
|
46
|
+
* - `storedVersion === expectedVersion` → `{ action: 'ok', compatible: true }`
|
|
47
|
+
* - `storedVersion < expectedVersion` → `{ action: 'migrate', compatible: false }`
|
|
48
|
+
* - `storedVersion > expectedVersion` → `{ action: 'incompatible', compatible: false }`
|
|
49
|
+
* - no row for `schemaName` → `{ action: 'incompatible', compatible: false }`
|
|
50
|
+
*/
|
|
51
|
+
export async function checkSchemaVersion(adapter, schemaName, expectedVersion) {
|
|
52
|
+
const rows = await adapter.query('SELECT schema_name, version, applied_at FROM schema_version WHERE schema_name = ?', [schemaName]);
|
|
53
|
+
const firstRow = rows.length > 0 ? rows[0] : undefined;
|
|
54
|
+
const storedVersion = firstRow !== undefined ? firstRow.version : null;
|
|
55
|
+
if (storedVersion === null) {
|
|
56
|
+
return { compatible: false, storedVersion: null, expectedVersion, action: 'incompatible' };
|
|
57
|
+
}
|
|
58
|
+
if (storedVersion === expectedVersion) {
|
|
59
|
+
return { compatible: true, storedVersion, expectedVersion, action: 'ok' };
|
|
60
|
+
}
|
|
61
|
+
if (storedVersion < expectedVersion) {
|
|
62
|
+
return { compatible: false, storedVersion, expectedVersion, action: 'migrate' };
|
|
63
|
+
}
|
|
64
|
+
// storedVersion > expectedVersion
|
|
65
|
+
return { compatible: false, storedVersion, expectedVersion, action: 'incompatible' };
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=schema-version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-version.js","sourceRoot":"","sources":["../../src/persistence/schema-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,wEAAwE;AACxE,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAe,CAAA;AAE/C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,mBAAmB,GAAG,SAAkB,CAAA;AAErD,8EAA8E;AAC9E,MAAM;AACN,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;CAOxB,CAAA;AA0EV,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAwB,EACxB,UAAkB,EAClB,eAAuB;IAEvB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,KAAK,CAC9B,mFAAmF,EACnF,CAAC,UAAU,CAAC,CACb,CAAA;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACtD,MAAM,aAAa,GAAkB,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA;IAErF,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;IAC5F,CAAC;IAED,IAAI,aAAa,KAAK,eAAe,EAAE,CAAC;QACtC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;IAC3E,CAAC;IAED,IAAI,aAAa,GAAG,eAAe,EAAE,CAAC;QACpC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IACjF,CAAC;IAED,kCAAkC;IAClC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;AACtF,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consolidated schema DDL for all persistence tables.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the 11 separate SQLite migration files with a single
|
|
5
|
+
* async function that creates all tables via DatabaseAdapter.
|
|
6
|
+
*
|
|
7
|
+
* All tables use CREATE TABLE IF NOT EXISTS for idempotency.
|
|
8
|
+
* Indexes and views use IF NOT EXISTS.
|
|
9
|
+
*
|
|
10
|
+
* Schema covers:
|
|
11
|
+
* - Core: sessions, tasks, task_dependencies, execution_log
|
|
12
|
+
* - Cost: cost_entries
|
|
13
|
+
* - Pipeline: pipeline_runs, decisions, requirements, constraints, artifacts, token_usage
|
|
14
|
+
* - Plans: plans, plan_versions
|
|
15
|
+
* - Signals: session_signals
|
|
16
|
+
* - Metrics: run_metrics, story_metrics
|
|
17
|
+
* - Monitor: task_metrics, performance_aggregates, routing_recommendations
|
|
18
|
+
* - Telemetry: turn_analysis, efficiency_scores, recommendations, category_stats, consumer_stats
|
|
19
|
+
*/
|
|
20
|
+
import type { DatabaseAdapter } from './types.js';
|
|
21
|
+
/**
|
|
22
|
+
* Initialize all persistence tables on the given adapter.
|
|
23
|
+
* Idempotent — safe to call multiple times.
|
|
24
|
+
*/
|
|
25
|
+
export declare function initSchema(adapter: DatabaseAdapter): Promise<void>;
|
|
26
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/persistence/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA0fxE"}
|