@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,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ModelRoutingConfig — Zod schema, types, error, and loader for substrate.routing.yml.
|
|
3
|
+
*
|
|
4
|
+
* The routing config YAML controls which model is used for each pipeline phase
|
|
5
|
+
* (explore / generate / review) and supports per-task-type overrides.
|
|
6
|
+
*
|
|
7
|
+
* References:
|
|
8
|
+
* - Epic 28, Story 28-4: Model Routing Configuration Schema
|
|
9
|
+
*/
|
|
10
|
+
import { readFileSync } from 'node:fs';
|
|
11
|
+
import { load as yamlLoad } from 'js-yaml';
|
|
12
|
+
import { z } from 'zod';
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Constants
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
const MODEL_NAME_PATTERN = /^[a-zA-Z0-9._-]+$/;
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Zod Schemas
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
/**
|
|
21
|
+
* Per-phase model configuration.
|
|
22
|
+
*/
|
|
23
|
+
export const ModelPhaseConfigSchema = z.object({
|
|
24
|
+
model: z.string().regex(MODEL_NAME_PATTERN, 'Model name contains invalid characters (must match /^[a-zA-Z0-9._-]+$/)'),
|
|
25
|
+
max_tokens: z.number().int().positive().optional(),
|
|
26
|
+
});
|
|
27
|
+
/**
|
|
28
|
+
* Complete model routing configuration document.
|
|
29
|
+
*
|
|
30
|
+
* All three phase keys (explore, generate, review) are optional — an absent
|
|
31
|
+
* phase causes resolveModel() to return null, signalling callers to use their
|
|
32
|
+
* own default model.
|
|
33
|
+
*/
|
|
34
|
+
export const ModelRoutingConfigSchema = z.object({
|
|
35
|
+
version: z.literal(1),
|
|
36
|
+
phases: z.object({
|
|
37
|
+
explore: ModelPhaseConfigSchema.optional(),
|
|
38
|
+
generate: ModelPhaseConfigSchema.optional(),
|
|
39
|
+
review: ModelPhaseConfigSchema.optional(),
|
|
40
|
+
}),
|
|
41
|
+
baseline_model: z.string().regex(MODEL_NAME_PATTERN, 'Baseline model name contains invalid characters (must match /^[a-zA-Z0-9._-]+$/)'),
|
|
42
|
+
overrides: z.record(z.string(), ModelPhaseConfigSchema).optional(),
|
|
43
|
+
/**
|
|
44
|
+
* When true, RoutingTuner will automatically apply conservative model downgrades
|
|
45
|
+
* at the end of each pipeline run based on historical phase token data.
|
|
46
|
+
*/
|
|
47
|
+
auto_tune: z.boolean().optional(),
|
|
48
|
+
});
|
|
49
|
+
/**
|
|
50
|
+
* Error thrown by loadModelRoutingConfig() for all failure modes.
|
|
51
|
+
*
|
|
52
|
+
* Extends plain Error (not SubstrateError) to keep core package free of monolith imports.
|
|
53
|
+
*/
|
|
54
|
+
export class RoutingConfigError extends Error {
|
|
55
|
+
context;
|
|
56
|
+
code;
|
|
57
|
+
constructor(message, code, context) {
|
|
58
|
+
super(message);
|
|
59
|
+
this.context = context;
|
|
60
|
+
this.name = 'RoutingConfigError';
|
|
61
|
+
this.code = code;
|
|
62
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// Loader
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
/**
|
|
69
|
+
* Load and validate a model routing config YAML file.
|
|
70
|
+
*
|
|
71
|
+
* @param filePath - Absolute or relative path to substrate.routing.yml
|
|
72
|
+
* @returns Parsed and validated ModelRoutingConfig object
|
|
73
|
+
* @throws {RoutingConfigError} with code CONFIG_NOT_FOUND if the file cannot be read
|
|
74
|
+
* @throws {RoutingConfigError} with code INVALID_YAML if the file contains invalid YAML
|
|
75
|
+
* @throws {RoutingConfigError} with code SCHEMA_INVALID if validation fails
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* const config = loadModelRoutingConfig('.substrate/routing.yml')
|
|
79
|
+
*/
|
|
80
|
+
export function loadModelRoutingConfig(filePath) {
|
|
81
|
+
// Read the file
|
|
82
|
+
let rawContent;
|
|
83
|
+
try {
|
|
84
|
+
rawContent = readFileSync(filePath, 'utf-8');
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
88
|
+
throw new RoutingConfigError(`Cannot read routing config file at "${filePath}": ${message}`, 'CONFIG_NOT_FOUND', { filePath });
|
|
89
|
+
}
|
|
90
|
+
// Parse YAML
|
|
91
|
+
let rawObject;
|
|
92
|
+
try {
|
|
93
|
+
rawObject = yamlLoad(rawContent);
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
97
|
+
throw new RoutingConfigError(`Invalid YAML in routing config file at "${filePath}": ${message}`, 'INVALID_YAML', { filePath });
|
|
98
|
+
}
|
|
99
|
+
// Validate with Zod
|
|
100
|
+
const result = ModelRoutingConfigSchema.safeParse(rawObject);
|
|
101
|
+
if (!result.success) {
|
|
102
|
+
const issues = result.error.issues;
|
|
103
|
+
const details = issues
|
|
104
|
+
.map((e) => ` - ${e.path.join('.')}: ${e.message}`)
|
|
105
|
+
.join('\n');
|
|
106
|
+
throw new RoutingConfigError(`Routing config validation failed for "${filePath}":\n${details}`, 'SCHEMA_INVALID', { filePath });
|
|
107
|
+
}
|
|
108
|
+
return result.data;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=model-routing-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-routing-config.js","sourceRoot":"","sources":["../../src/routing/model-routing-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RoutingResolver — resolves the appropriate model for each pipeline task type.
|
|
3
|
+
*
|
|
4
|
+
* Uses ModelRoutingConfig to map task types to pipeline phases and return
|
|
5
|
+
* the configured model (with optional per-task-type overrides).
|
|
6
|
+
*
|
|
7
|
+
* References:
|
|
8
|
+
* - Epic 28, Story 28-4: Model Routing Configuration Schema
|
|
9
|
+
*/
|
|
10
|
+
import type { ILogger } from '../dispatch/types.js';
|
|
11
|
+
import type { ModelRoutingConfig } from './model-routing-config.js';
|
|
12
|
+
import type { ModelResolution } from './routing-engine.js';
|
|
13
|
+
/**
|
|
14
|
+
* Resolves which model to use for each pipeline task type.
|
|
15
|
+
*
|
|
16
|
+
* Constructed with a ModelRoutingConfig and a logger. Use the static
|
|
17
|
+
* createWithFallback() factory to construct from a file path with graceful
|
|
18
|
+
* handling of missing config files.
|
|
19
|
+
*/
|
|
20
|
+
export declare class RoutingResolver {
|
|
21
|
+
private readonly config;
|
|
22
|
+
private readonly logger;
|
|
23
|
+
constructor(config: ModelRoutingConfig, logger: ILogger);
|
|
24
|
+
/**
|
|
25
|
+
* Resolve the model for a given task type.
|
|
26
|
+
*
|
|
27
|
+
* Resolution order:
|
|
28
|
+
* 1. config.overrides[taskType] (source: 'override')
|
|
29
|
+
* 2. config.phases[phase] via TASK_TYPE_PHASE_MAP (source: 'phase')
|
|
30
|
+
* 3. null if the phase key is absent in config.phases
|
|
31
|
+
*
|
|
32
|
+
* @returns ModelResolution if a model is configured, null if in fallback mode
|
|
33
|
+
*/
|
|
34
|
+
resolveModel(taskType: string): ModelResolution | null;
|
|
35
|
+
/**
|
|
36
|
+
* Static factory that loads a routing config from a file with graceful fallback.
|
|
37
|
+
*
|
|
38
|
+
* If the config file does not exist (CONFIG_NOT_FOUND), emits a single debug
|
|
39
|
+
* log and returns a resolver in fallback mode where all resolveModel() calls
|
|
40
|
+
* return null. Other errors are rethrown.
|
|
41
|
+
*
|
|
42
|
+
* @param filePath - Path to the substrate.routing.yml file
|
|
43
|
+
* @param logger - Logger instance
|
|
44
|
+
*/
|
|
45
|
+
static createWithFallback(filePath: string, logger: ILogger): RoutingResolver;
|
|
46
|
+
}
|
|
47
|
+
export declare const ROUTING_RESOLVER_LOGGER_NAME = "routing:model-resolver";
|
|
48
|
+
//# sourceMappingURL=model-routing-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-routing-resolver.d.ts","sourceRoot":"","sources":["../../src/routing/model-routing-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAEnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAc1D;;;;;;GAMG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,OAAO;IAKvD;;;;;;;;;OASG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAuCtD;;;;;;;;;OASG;IACH,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,eAAe;CAqB9E;AAGD,eAAO,MAAM,4BAA4B,2BAA2B,CAAA"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RoutingResolver — resolves the appropriate model for each pipeline task type.
|
|
3
|
+
*
|
|
4
|
+
* Uses ModelRoutingConfig to map task types to pipeline phases and return
|
|
5
|
+
* the configured model (with optional per-task-type overrides).
|
|
6
|
+
*
|
|
7
|
+
* References:
|
|
8
|
+
* - Epic 28, Story 28-4: Model Routing Configuration Schema
|
|
9
|
+
*/
|
|
10
|
+
import { loadModelRoutingConfig, RoutingConfigError } from './model-routing-config.js';
|
|
11
|
+
// TASK_TYPE_PHASE_MAP already defined in routing-engine.ts (story 40-6); import from there
|
|
12
|
+
import { TASK_TYPE_PHASE_MAP } from './routing-engine.js';
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Constants
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
const DEFAULT_PHASE = 'generate';
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// RoutingResolver
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
/**
|
|
21
|
+
* Resolves which model to use for each pipeline task type.
|
|
22
|
+
*
|
|
23
|
+
* Constructed with a ModelRoutingConfig and a logger. Use the static
|
|
24
|
+
* createWithFallback() factory to construct from a file path with graceful
|
|
25
|
+
* handling of missing config files.
|
|
26
|
+
*/
|
|
27
|
+
export class RoutingResolver {
|
|
28
|
+
config;
|
|
29
|
+
logger;
|
|
30
|
+
constructor(config, logger) {
|
|
31
|
+
this.config = config;
|
|
32
|
+
this.logger = logger;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Resolve the model for a given task type.
|
|
36
|
+
*
|
|
37
|
+
* Resolution order:
|
|
38
|
+
* 1. config.overrides[taskType] (source: 'override')
|
|
39
|
+
* 2. config.phases[phase] via TASK_TYPE_PHASE_MAP (source: 'phase')
|
|
40
|
+
* 3. null if the phase key is absent in config.phases
|
|
41
|
+
*
|
|
42
|
+
* @returns ModelResolution if a model is configured, null if in fallback mode
|
|
43
|
+
*/
|
|
44
|
+
resolveModel(taskType) {
|
|
45
|
+
// Check overrides first
|
|
46
|
+
const override = this.config.overrides?.[taskType];
|
|
47
|
+
if (override) {
|
|
48
|
+
const phase = TASK_TYPE_PHASE_MAP[taskType] ?? DEFAULT_PHASE;
|
|
49
|
+
const resolution = {
|
|
50
|
+
model: override.model,
|
|
51
|
+
phase,
|
|
52
|
+
source: 'override',
|
|
53
|
+
...(override.max_tokens !== undefined ? { maxTokens: override.max_tokens } : {}),
|
|
54
|
+
};
|
|
55
|
+
this.logger.debug({ taskType, phase: resolution.phase, model: resolution.model, source: 'override' }, 'Resolved model');
|
|
56
|
+
return resolution;
|
|
57
|
+
}
|
|
58
|
+
// Look up phase
|
|
59
|
+
const phase = TASK_TYPE_PHASE_MAP[taskType] ?? DEFAULT_PHASE;
|
|
60
|
+
const phaseConfig = this.config.phases[phase];
|
|
61
|
+
if (!phaseConfig) {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
const resolution = {
|
|
65
|
+
model: phaseConfig.model,
|
|
66
|
+
phase,
|
|
67
|
+
source: 'phase',
|
|
68
|
+
...(phaseConfig.max_tokens !== undefined ? { maxTokens: phaseConfig.max_tokens } : {}),
|
|
69
|
+
};
|
|
70
|
+
this.logger.debug({ taskType, phase, model: resolution.model, source: 'phase' }, 'Resolved model');
|
|
71
|
+
return resolution;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Static factory that loads a routing config from a file with graceful fallback.
|
|
75
|
+
*
|
|
76
|
+
* If the config file does not exist (CONFIG_NOT_FOUND), emits a single debug
|
|
77
|
+
* log and returns a resolver in fallback mode where all resolveModel() calls
|
|
78
|
+
* return null. Other errors are rethrown.
|
|
79
|
+
*
|
|
80
|
+
* @param filePath - Path to the substrate.routing.yml file
|
|
81
|
+
* @param logger - Logger instance
|
|
82
|
+
*/
|
|
83
|
+
static createWithFallback(filePath, logger) {
|
|
84
|
+
try {
|
|
85
|
+
const config = loadModelRoutingConfig(filePath);
|
|
86
|
+
return new RoutingResolver(config, logger);
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
if (err instanceof RoutingConfigError && err.code === 'CONFIG_NOT_FOUND') {
|
|
90
|
+
logger.debug({ configPath: filePath, component: 'routing', reason: 'config not found' }, `Model routing config not found at "${filePath}"; using fallback mode (all resolveModel calls will return null)`);
|
|
91
|
+
// Construct a sentinel config with empty phases so resolveModel always returns null
|
|
92
|
+
const fallbackConfig = {
|
|
93
|
+
version: 1,
|
|
94
|
+
phases: {},
|
|
95
|
+
baseline_model: '',
|
|
96
|
+
};
|
|
97
|
+
return new RoutingResolver(fallbackConfig, logger);
|
|
98
|
+
}
|
|
99
|
+
throw err;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Export the module-level logger name for external callers
|
|
104
|
+
export const ROUTING_RESOLVER_LOGGER_NAME = 'routing:model-resolver';
|
|
105
|
+
//# sourceMappingURL=model-routing-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-routing-resolver.js","sourceRoot":"","sources":["../../src/routing/model-routing-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared model tier resolution utility.
|
|
3
|
+
*
|
|
4
|
+
* Determines whether a model string belongs to the haiku (1), sonnet (2),
|
|
5
|
+
* or opus (3) tier based on substring matching against well-known keywords.
|
|
6
|
+
*
|
|
7
|
+
* Used by both RoutingRecommender and RoutingTuner to ensure consistent
|
|
8
|
+
* tier comparisons — in particular the one-step guard in RoutingTuner.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Get the model tier for a given model name string.
|
|
12
|
+
*
|
|
13
|
+
* Returns:
|
|
14
|
+
* - 1 for haiku-tier models
|
|
15
|
+
* - 2 for sonnet-tier models (also the default when unrecognized)
|
|
16
|
+
* - 3 for opus-tier models
|
|
17
|
+
*
|
|
18
|
+
* Matching is case-insensitive substring search.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getModelTier(model: string): number;
|
|
21
|
+
//# sourceMappingURL=model-tier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-tier.d.ts","sourceRoot":"","sources":["../../src/routing/model-tier.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMlD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared model tier resolution utility.
|
|
3
|
+
*
|
|
4
|
+
* Determines whether a model string belongs to the haiku (1), sonnet (2),
|
|
5
|
+
* or opus (3) tier based on substring matching against well-known keywords.
|
|
6
|
+
*
|
|
7
|
+
* Used by both RoutingRecommender and RoutingTuner to ensure consistent
|
|
8
|
+
* tier comparisons — in particular the one-step guard in RoutingTuner.
|
|
9
|
+
*/
|
|
10
|
+
/** Ordered tier keywords: index 0 = cheapest, index N = most expensive. */
|
|
11
|
+
const TIER_KEYWORDS = [
|
|
12
|
+
{ keyword: 'haiku', tier: 1 },
|
|
13
|
+
{ keyword: 'sonnet', tier: 2 },
|
|
14
|
+
{ keyword: 'opus', tier: 3 },
|
|
15
|
+
];
|
|
16
|
+
/**
|
|
17
|
+
* Get the model tier for a given model name string.
|
|
18
|
+
*
|
|
19
|
+
* Returns:
|
|
20
|
+
* - 1 for haiku-tier models
|
|
21
|
+
* - 2 for sonnet-tier models (also the default when unrecognized)
|
|
22
|
+
* - 3 for opus-tier models
|
|
23
|
+
*
|
|
24
|
+
* Matching is case-insensitive substring search.
|
|
25
|
+
*/
|
|
26
|
+
export function getModelTier(model) {
|
|
27
|
+
const lower = model.toLowerCase();
|
|
28
|
+
for (const { keyword, tier } of TIER_KEYWORDS) {
|
|
29
|
+
if (lower.includes(keyword))
|
|
30
|
+
return tier;
|
|
31
|
+
}
|
|
32
|
+
return 2; // default: sonnet tier
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=model-tier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-tier.js","sourceRoot":"","sources":["../../src/routing/model-tier.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,2EAA2E;AAC3E,MAAM,aAAa,GAA6C;IAC9D,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE;IAC7B,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;IAC9B,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE;CAC7B,CAAA;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAA;IACjC,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,aAAa,EAAE,CAAC;QAC9C,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAA;IAC1C,CAAC;IACD,OAAO,CAAC,CAAA,CAAC,uBAAuB;AAClC,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProviderStatus — in-memory rate limit and status tracking per provider.
|
|
3
|
+
*
|
|
4
|
+
* Tracks:
|
|
5
|
+
* - Subscription routing enabled/disabled
|
|
6
|
+
* - API billing availability
|
|
7
|
+
* - Rate limit consumption within the current window
|
|
8
|
+
*
|
|
9
|
+
* References:
|
|
10
|
+
* - Architecture Section 8: Rate limit tracking per provider
|
|
11
|
+
* - FR29: Rate limit management
|
|
12
|
+
* - ADR-004: RoutingEngine is stateless except for rate limit tracking in-memory
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Snapshot of a single provider's current status.
|
|
16
|
+
*/
|
|
17
|
+
export interface ProviderStatus {
|
|
18
|
+
/** Provider name (e.g., 'claude', 'codex', 'gemini') */
|
|
19
|
+
provider: string;
|
|
20
|
+
/** Whether subscription routing is enabled for this provider */
|
|
21
|
+
subscriptionRoutingEnabled: boolean;
|
|
22
|
+
/** Whether API billing is available for this provider */
|
|
23
|
+
apiBillingEnabled: boolean;
|
|
24
|
+
/** Tokens consumed in the current rate limit window */
|
|
25
|
+
tokensUsedInWindow: number;
|
|
26
|
+
/** Millisecond timestamp when the current window resets (0 if no rate limit configured) */
|
|
27
|
+
windowResetAtMs: number;
|
|
28
|
+
/** Rate limit configuration */
|
|
29
|
+
rateLimit: {
|
|
30
|
+
tokensPerWindow: number;
|
|
31
|
+
windowSeconds: number;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Manages in-memory rate limit state and provider availability for all providers.
|
|
36
|
+
*
|
|
37
|
+
* This is a pure in-memory tracker — all state is reset when the daemon restarts.
|
|
38
|
+
* This is acceptable per ADR-004 (stateless except for rate limit tracking).
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* const tracker = new ProviderStatusTracker()
|
|
42
|
+
* tracker.initProvider('claude', true, true, { tokensPerWindow: 220000, windowSeconds: 18000 })
|
|
43
|
+
* const ok = tracker.checkRateLimit('claude', 1000) // true if capacity available
|
|
44
|
+
* tracker.recordTokenUsage('claude', 1000)
|
|
45
|
+
*/
|
|
46
|
+
export declare class ProviderStatusTracker {
|
|
47
|
+
private readonly _windows;
|
|
48
|
+
private readonly _subscriptionEnabled;
|
|
49
|
+
private readonly _apiBillingEnabled;
|
|
50
|
+
/**
|
|
51
|
+
* Initialize tracking for a provider.
|
|
52
|
+
* Called once during RoutingEngine initialization from the routing policy.
|
|
53
|
+
*
|
|
54
|
+
* @param provider - Provider name
|
|
55
|
+
* @param subscriptionEnabled - Whether subscription routing is on
|
|
56
|
+
* @param apiBillingEnabled - Whether API billing is available
|
|
57
|
+
* @param rateLimit - Rate limit configuration (optional)
|
|
58
|
+
*/
|
|
59
|
+
initProvider(provider: string, subscriptionEnabled: boolean, apiBillingEnabled: boolean, rateLimit?: {
|
|
60
|
+
tokensPerWindow: number;
|
|
61
|
+
windowSeconds: number;
|
|
62
|
+
}): void;
|
|
63
|
+
/**
|
|
64
|
+
* Check whether a provider can accept the estimated token usage without exceeding its limit.
|
|
65
|
+
*
|
|
66
|
+
* @param provider - Provider name
|
|
67
|
+
* @param estimatedTokens - Tokens that would be consumed
|
|
68
|
+
* @returns true if tokens won't exceed limit (or no rate limit configured), false otherwise
|
|
69
|
+
*/
|
|
70
|
+
checkRateLimit(provider: string, estimatedTokens: number): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Record token usage for a provider after task completion.
|
|
73
|
+
* Resets the window if it has expired before recording.
|
|
74
|
+
*
|
|
75
|
+
* @param provider - Provider name
|
|
76
|
+
* @param tokensUsed - Actual tokens consumed
|
|
77
|
+
*/
|
|
78
|
+
recordTokenUsage(provider: string, tokensUsed: number): void;
|
|
79
|
+
/**
|
|
80
|
+
* Get the timestamp when the current rate limit window resets.
|
|
81
|
+
*
|
|
82
|
+
* @param provider - Provider name
|
|
83
|
+
* @returns Date when the window resets, or the current time if no rate limit configured
|
|
84
|
+
*/
|
|
85
|
+
getRateLimitResetTime(provider: string): Date;
|
|
86
|
+
/**
|
|
87
|
+
* Return a snapshot of the current status for a provider.
|
|
88
|
+
*
|
|
89
|
+
* @param provider - Provider name
|
|
90
|
+
* @returns ProviderStatus snapshot, or null if provider is not tracked
|
|
91
|
+
*/
|
|
92
|
+
getStatus(provider: string): ProviderStatus | null;
|
|
93
|
+
/**
|
|
94
|
+
* Return all tracked provider names.
|
|
95
|
+
*/
|
|
96
|
+
getTrackedProviders(): string[];
|
|
97
|
+
private _resetWindowIfExpired;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=provider-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-status.d.ts","sourceRoot":"","sources":["../../src/routing/provider-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAA;IAChB,gEAAgE;IAChE,0BAA0B,EAAE,OAAO,CAAA;IACnC,yDAAyD;IACzD,iBAAiB,EAAE,OAAO,CAAA;IAC1B,uDAAuD;IACvD,kBAAkB,EAAE,MAAM,CAAA;IAC1B,2FAA2F;IAC3F,eAAe,EAAE,MAAM,CAAA;IACvB,+BAA+B;IAC/B,SAAS,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAA;CAC9D;AAkBD;;;;;;;;;;;GAWG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0C;IACnE,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAkC;IACvE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAkC;IAMrE;;;;;;;;OAQG;IACH,YAAY,CACV,QAAQ,EAAE,MAAM,EAChB,mBAAmB,EAAE,OAAO,EAC5B,iBAAiB,EAAE,OAAO,EAC1B,SAAS,CAAC,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,GAC7D,IAAI;IAmBP;;;;;;OAMG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO;IAalE;;;;;;OAMG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAY5D;;;;;OAKG;IACH,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAY7C;;;;;OAKG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAkClD;;OAEG;IACH,mBAAmB,IAAI,MAAM,EAAE;IAQ/B,OAAO,CAAC,qBAAqB;CAO9B"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProviderStatus — in-memory rate limit and status tracking per provider.
|
|
3
|
+
*
|
|
4
|
+
* Tracks:
|
|
5
|
+
* - Subscription routing enabled/disabled
|
|
6
|
+
* - API billing availability
|
|
7
|
+
* - Rate limit consumption within the current window
|
|
8
|
+
*
|
|
9
|
+
* References:
|
|
10
|
+
* - Architecture Section 8: Rate limit tracking per provider
|
|
11
|
+
* - FR29: Rate limit management
|
|
12
|
+
* - ADR-004: RoutingEngine is stateless except for rate limit tracking in-memory
|
|
13
|
+
*/
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// ProviderStatusTracker
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
/**
|
|
18
|
+
* Manages in-memory rate limit state and provider availability for all providers.
|
|
19
|
+
*
|
|
20
|
+
* This is a pure in-memory tracker — all state is reset when the daemon restarts.
|
|
21
|
+
* This is acceptable per ADR-004 (stateless except for rate limit tracking).
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* const tracker = new ProviderStatusTracker()
|
|
25
|
+
* tracker.initProvider('claude', true, true, { tokensPerWindow: 220000, windowSeconds: 18000 })
|
|
26
|
+
* const ok = tracker.checkRateLimit('claude', 1000) // true if capacity available
|
|
27
|
+
* tracker.recordTokenUsage('claude', 1000)
|
|
28
|
+
*/
|
|
29
|
+
export class ProviderStatusTracker {
|
|
30
|
+
_windows = new Map();
|
|
31
|
+
_subscriptionEnabled = new Map();
|
|
32
|
+
_apiBillingEnabled = new Map();
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// Initialization
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
/**
|
|
37
|
+
* Initialize tracking for a provider.
|
|
38
|
+
* Called once during RoutingEngine initialization from the routing policy.
|
|
39
|
+
*
|
|
40
|
+
* @param provider - Provider name
|
|
41
|
+
* @param subscriptionEnabled - Whether subscription routing is on
|
|
42
|
+
* @param apiBillingEnabled - Whether API billing is available
|
|
43
|
+
* @param rateLimit - Rate limit configuration (optional)
|
|
44
|
+
*/
|
|
45
|
+
initProvider(provider, subscriptionEnabled, apiBillingEnabled, rateLimit) {
|
|
46
|
+
this._subscriptionEnabled.set(provider, subscriptionEnabled);
|
|
47
|
+
this._apiBillingEnabled.set(provider, apiBillingEnabled);
|
|
48
|
+
if (rateLimit !== undefined) {
|
|
49
|
+
this._windows.set(provider, {
|
|
50
|
+
provider,
|
|
51
|
+
tokensUsedInWindow: 0,
|
|
52
|
+
windowStartAtMs: Date.now(),
|
|
53
|
+
windowDurationMs: rateLimit.windowSeconds * 1000,
|
|
54
|
+
tokensPerWindow: rateLimit.tokensPerWindow,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
// Rate limit management
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
/**
|
|
62
|
+
* Check whether a provider can accept the estimated token usage without exceeding its limit.
|
|
63
|
+
*
|
|
64
|
+
* @param provider - Provider name
|
|
65
|
+
* @param estimatedTokens - Tokens that would be consumed
|
|
66
|
+
* @returns true if tokens won't exceed limit (or no rate limit configured), false otherwise
|
|
67
|
+
*/
|
|
68
|
+
checkRateLimit(provider, estimatedTokens) {
|
|
69
|
+
const window = this._windows.get(provider);
|
|
70
|
+
if (window === undefined) {
|
|
71
|
+
// No rate limit configured — always available
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
// Check if window has expired and reset if needed
|
|
75
|
+
this._resetWindowIfExpired(window);
|
|
76
|
+
return window.tokensUsedInWindow + estimatedTokens <= window.tokensPerWindow;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Record token usage for a provider after task completion.
|
|
80
|
+
* Resets the window if it has expired before recording.
|
|
81
|
+
*
|
|
82
|
+
* @param provider - Provider name
|
|
83
|
+
* @param tokensUsed - Actual tokens consumed
|
|
84
|
+
*/
|
|
85
|
+
recordTokenUsage(provider, tokensUsed) {
|
|
86
|
+
const window = this._windows.get(provider);
|
|
87
|
+
if (window === undefined) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
// Reset if window expired
|
|
91
|
+
this._resetWindowIfExpired(window);
|
|
92
|
+
window.tokensUsedInWindow += tokensUsed;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Get the timestamp when the current rate limit window resets.
|
|
96
|
+
*
|
|
97
|
+
* @param provider - Provider name
|
|
98
|
+
* @returns Date when the window resets, or the current time if no rate limit configured
|
|
99
|
+
*/
|
|
100
|
+
getRateLimitResetTime(provider) {
|
|
101
|
+
const window = this._windows.get(provider);
|
|
102
|
+
if (window === undefined) {
|
|
103
|
+
return new Date();
|
|
104
|
+
}
|
|
105
|
+
return new Date(window.windowStartAtMs + window.windowDurationMs);
|
|
106
|
+
}
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
// Status snapshot
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
/**
|
|
111
|
+
* Return a snapshot of the current status for a provider.
|
|
112
|
+
*
|
|
113
|
+
* @param provider - Provider name
|
|
114
|
+
* @returns ProviderStatus snapshot, or null if provider is not tracked
|
|
115
|
+
*/
|
|
116
|
+
getStatus(provider) {
|
|
117
|
+
const subscriptionEnabled = this._subscriptionEnabled.get(provider);
|
|
118
|
+
if (subscriptionEnabled === undefined) {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
const apiBillingEnabled = this._apiBillingEnabled.get(provider) ?? false;
|
|
122
|
+
const window = this._windows.get(provider);
|
|
123
|
+
if (window !== undefined) {
|
|
124
|
+
this._resetWindowIfExpired(window);
|
|
125
|
+
return {
|
|
126
|
+
provider,
|
|
127
|
+
subscriptionRoutingEnabled: subscriptionEnabled,
|
|
128
|
+
apiBillingEnabled,
|
|
129
|
+
tokensUsedInWindow: window.tokensUsedInWindow,
|
|
130
|
+
windowResetAtMs: window.windowStartAtMs + window.windowDurationMs,
|
|
131
|
+
rateLimit: {
|
|
132
|
+
tokensPerWindow: window.tokensPerWindow,
|
|
133
|
+
windowSeconds: window.windowDurationMs / 1000,
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
provider,
|
|
139
|
+
subscriptionRoutingEnabled: subscriptionEnabled,
|
|
140
|
+
apiBillingEnabled,
|
|
141
|
+
tokensUsedInWindow: 0,
|
|
142
|
+
windowResetAtMs: 0,
|
|
143
|
+
rateLimit: { tokensPerWindow: 0, windowSeconds: 0 },
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Return all tracked provider names.
|
|
148
|
+
*/
|
|
149
|
+
getTrackedProviders() {
|
|
150
|
+
return Array.from(this._subscriptionEnabled.keys());
|
|
151
|
+
}
|
|
152
|
+
// ---------------------------------------------------------------------------
|
|
153
|
+
// Private helpers
|
|
154
|
+
// ---------------------------------------------------------------------------
|
|
155
|
+
_resetWindowIfExpired(window) {
|
|
156
|
+
const now = Date.now();
|
|
157
|
+
if (now > window.windowStartAtMs + window.windowDurationMs) {
|
|
158
|
+
window.tokensUsedInWindow = 0;
|
|
159
|
+
window.windowStartAtMs = now;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=provider-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-status.js","sourceRoot":"","sources":["../../src/routing/provider-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAoCH,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,qBAAqB;IACf,QAAQ,GAAiC,IAAI,GAAG,EAAE,CAAA;IAClD,oBAAoB,GAAyB,IAAI,GAAG,EAAE,CAAA;IACtD,kBAAkB,GAAyB,IAAI,GAAG,EAAE,CAAA;IAErE,8EAA8E;IAC9E,iBAAiB;IACjB,8EAA8E;IAE9E;;;;;;;;OAQG;IACH,YAAY,CACV,QAAgB,EAChB,mBAA4B,EAC5B,iBAA0B,EAC1B,SAA8D;QAE9D,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAA;QAC5D,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAA;QAExD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE;gBAC1B,QAAQ;gBACR,kBAAkB,EAAE,CAAC;gBACrB,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE;gBAC3B,gBAAgB,EAAE,SAAS,CAAC,aAAa,GAAG,IAAI;gBAChD,eAAe,EAAE,SAAS,CAAC,eAAe;aAC3C,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,wBAAwB;IACxB,8EAA8E;IAE9E;;;;;;OAMG;IACH,cAAc,CAAC,QAAgB,EAAE,eAAuB;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC1C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,8CAA8C;YAC9C,OAAO,IAAI,CAAA;QACb,CAAC;QAED,kDAAkD;QAClD,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;QAElC,OAAO,MAAM,CAAC,kBAAkB,GAAG,eAAe,IAAI,MAAM,CAAC,eAAe,CAAA;IAC9E,CAAC;IAED;;;;;;OAMG;IACH,gBAAgB,CAAC,QAAgB,EAAE,UAAkB;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC1C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAM;QACR,CAAC;QAED,0BAA0B;QAC1B,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;QAElC,MAAM,CAAC,kBAAkB,IAAI,UAAU,CAAA;IACzC,CAAC;IAED;;;;;OAKG;IACH,qBAAqB,CAAC,QAAgB;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC1C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,IAAI,IAAI,EAAE,CAAA;QACnB,CAAC;QACD,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAA;IACnE,CAAC;IAED,8EAA8E;IAC9E,kBAAkB;IAClB,8EAA8E;IAE9E;;;;;OAKG;IACH,SAAS,CAAC,QAAgB;QACxB,MAAM,mBAAmB,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACnE,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAA;QACxE,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAE1C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;YAClC,OAAO;gBACL,QAAQ;gBACR,0BAA0B,EAAE,mBAAmB;gBAC/C,iBAAiB;gBACjB,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;gBAC7C,eAAe,EAAE,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC,gBAAgB;gBACjE,SAAS,EAAE;oBACT,eAAe,EAAE,MAAM,CAAC,eAAe;oBACvC,aAAa,EAAE,MAAM,CAAC,gBAAgB,GAAG,IAAI;iBAC9C;aACF,CAAA;QACH,CAAC;QAED,OAAO;YACL,QAAQ;YACR,0BAA0B,EAAE,mBAAmB;YAC/C,iBAAiB;YACjB,kBAAkB,EAAE,CAAC;YACrB,eAAe,EAAE,CAAC;YAClB,SAAS,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE;SACpD,CAAA;IACH,CAAC;IAED;;OAEG;IACH,mBAAmB;QACjB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAA;IACrD,CAAC;IAED,8EAA8E;IAC9E,kBAAkB;IAClB,8EAA8E;IAEtE,qBAAqB,CAAC,MAAuB;QACnD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,IAAI,GAAG,GAAG,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC3D,MAAM,CAAC,kBAAkB,GAAG,CAAC,CAAA;YAC7B,MAAM,CAAC,eAAe,GAAG,GAAG,CAAA;QAC9B,CAAC;IACH,CAAC;CACF"}
|