agent-nuvira 3.3.12 → 3.3.14
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 +67 -1
- package/dist/agents/agents/planner.d.ts.map +1 -1
- package/dist/agents/agents/planner.js +9 -0
- package/dist/agents/agents/planner.js.map +1 -1
- package/dist/agents/agents/reasoner.d.ts.map +1 -1
- package/dist/agents/agents/reasoner.js +13 -0
- package/dist/agents/agents/reasoner.js.map +1 -1
- package/dist/agents/orchestrator.d.ts +31 -0
- package/dist/agents/orchestrator.d.ts.map +1 -1
- package/dist/agents/orchestrator.js +103 -135
- package/dist/agents/orchestrator.js.map +1 -1
- package/dist/cli/chat.d.ts +89 -0
- package/dist/cli/chat.d.ts.map +1 -1
- package/dist/cli/chat.js +798 -39
- package/dist/cli/chat.js.map +1 -1
- package/dist/cli/cli-program.d.ts.map +1 -1
- package/dist/cli/cli-program.js +20 -0
- package/dist/cli/cli-program.js.map +1 -1
- package/dist/cli/config.d.ts +12 -0
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +107 -3
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/decisions.d.ts +28 -0
- package/dist/cli/decisions.d.ts.map +1 -0
- package/dist/cli/decisions.js +140 -0
- package/dist/cli/decisions.js.map +1 -0
- package/dist/cli/doctor.d.ts +6 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +46 -0
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/execute.d.ts.map +1 -1
- package/dist/cli/execute.js +6 -0
- package/dist/cli/execute.js.map +1 -1
- package/dist/cli/failover-runner.d.ts.map +1 -1
- package/dist/cli/failover-runner.js +19 -1
- package/dist/cli/failover-runner.js.map +1 -1
- package/dist/cli/feedback.d.ts.map +1 -1
- package/dist/cli/feedback.js +5 -1
- package/dist/cli/feedback.js.map +1 -1
- package/dist/cli/hooks.d.ts +30 -0
- package/dist/cli/hooks.d.ts.map +1 -0
- package/dist/cli/hooks.js +224 -0
- package/dist/cli/hooks.js.map +1 -0
- package/dist/cli/knowledge.d.ts +31 -0
- package/dist/cli/knowledge.d.ts.map +1 -0
- package/dist/cli/knowledge.js +223 -0
- package/dist/cli/knowledge.js.map +1 -0
- package/dist/cli/loop-executor.d.ts.map +1 -1
- package/dist/cli/loop-executor.js +92 -18
- package/dist/cli/loop-executor.js.map +1 -1
- package/dist/cli/model.d.ts +20 -0
- package/dist/cli/model.d.ts.map +1 -1
- package/dist/cli/model.js +294 -14
- package/dist/cli/model.js.map +1 -1
- package/dist/cli/omniroute-control.d.ts +88 -0
- package/dist/cli/omniroute-control.d.ts.map +1 -0
- package/dist/cli/omniroute-control.js +179 -0
- package/dist/cli/omniroute-control.js.map +1 -0
- package/dist/cli/omniroute.d.ts +21 -0
- package/dist/cli/omniroute.d.ts.map +1 -0
- package/dist/cli/omniroute.js +67 -0
- package/dist/cli/omniroute.js.map +1 -0
- package/dist/cli/rate.d.ts +78 -0
- package/dist/cli/rate.d.ts.map +1 -0
- package/dist/cli/rate.js +294 -0
- package/dist/cli/rate.js.map +1 -0
- package/dist/config/process-env.d.ts.map +1 -1
- package/dist/config/process-env.js +10 -0
- package/dist/config/process-env.js.map +1 -1
- package/dist/config/types.d.ts +8 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/context/history.d.ts +21 -0
- package/dist/context/history.d.ts.map +1 -1
- package/dist/context/history.js +50 -0
- package/dist/context/history.js.map +1 -1
- package/dist/enterprise/vault.d.ts.map +1 -1
- package/dist/enterprise/vault.js +5 -21
- package/dist/enterprise/vault.js.map +1 -1
- package/dist/gateway/hook-contract.d.ts +206 -0
- package/dist/gateway/hook-contract.d.ts.map +1 -0
- package/dist/gateway/hook-contract.js +449 -0
- package/dist/gateway/hook-contract.js.map +1 -0
- package/dist/gateway/hooks.d.ts.map +1 -1
- package/dist/gateway/hooks.js +14 -0
- package/dist/gateway/hooks.js.map +1 -1
- package/dist/inference/gemini-adapter.d.ts.map +1 -1
- package/dist/inference/gemini-adapter.js +4 -0
- package/dist/inference/gemini-adapter.js.map +1 -1
- package/dist/inference/interface.d.ts +54 -0
- package/dist/inference/interface.d.ts.map +1 -1
- package/dist/inference/model-id-validation.d.ts +57 -0
- package/dist/inference/model-id-validation.d.ts.map +1 -0
- package/dist/inference/model-id-validation.js +127 -0
- package/dist/inference/model-id-validation.js.map +1 -0
- package/dist/inference/native-tools.d.ts +16 -1
- package/dist/inference/native-tools.d.ts.map +1 -1
- package/dist/inference/native-tools.js +34 -10
- package/dist/inference/native-tools.js.map +1 -1
- package/dist/inference/openai-compat-adapter.d.ts.map +1 -1
- package/dist/inference/openai-compat-adapter.js +12 -1
- package/dist/inference/openai-compat-adapter.js.map +1 -1
- package/dist/inference/provider-catalog.d.ts +11 -0
- package/dist/inference/provider-catalog.d.ts.map +1 -1
- package/dist/inference/provider-catalog.js +80 -0
- package/dist/inference/provider-catalog.js.map +1 -1
- package/dist/inference/route-resolver.d.ts +32 -8
- package/dist/inference/route-resolver.d.ts.map +1 -1
- package/dist/inference/route-resolver.js +175 -1
- package/dist/inference/route-resolver.js.map +1 -1
- package/dist/inference/tool-call-utils.d.ts.map +1 -1
- package/dist/inference/tool-call-utils.js +10 -8
- package/dist/inference/tool-call-utils.js.map +1 -1
- package/dist/inference/tools.d.ts +17 -1
- package/dist/inference/tools.d.ts.map +1 -1
- package/dist/inference/tools.js +69 -19
- package/dist/inference/tools.js.map +1 -1
- package/dist/learning/acceptance-model.d.ts +247 -0
- package/dist/learning/acceptance-model.d.ts.map +1 -0
- package/dist/learning/acceptance-model.js +708 -0
- package/dist/learning/acceptance-model.js.map +1 -0
- package/dist/learning/auto-router.d.ts +121 -24
- package/dist/learning/auto-router.d.ts.map +1 -1
- package/dist/learning/auto-router.js +374 -96
- package/dist/learning/auto-router.js.map +1 -1
- package/dist/learning/autonomy-policy.d.ts +12 -16
- package/dist/learning/autonomy-policy.d.ts.map +1 -1
- package/dist/learning/autonomy-policy.js +50 -48
- package/dist/learning/autonomy-policy.js.map +1 -1
- package/dist/learning/behavioural-labels.d.ts +86 -0
- package/dist/learning/behavioural-labels.d.ts.map +1 -0
- package/dist/learning/behavioural-labels.js +166 -0
- package/dist/learning/behavioural-labels.js.map +1 -0
- package/dist/learning/capability-evidence.d.ts +167 -0
- package/dist/learning/capability-evidence.d.ts.map +1 -0
- package/dist/learning/capability-evidence.js +210 -0
- package/dist/learning/capability-evidence.js.map +1 -0
- package/dist/learning/capability-readiness.d.ts +64 -0
- package/dist/learning/capability-readiness.d.ts.map +1 -0
- package/dist/learning/capability-readiness.js +74 -0
- package/dist/learning/capability-readiness.js.map +1 -0
- package/dist/learning/capability-types.d.ts +169 -0
- package/dist/learning/capability-types.d.ts.map +1 -0
- package/dist/learning/capability-types.js +20 -0
- package/dist/learning/capability-types.js.map +1 -0
- package/dist/learning/catalog-feed.d.ts +89 -0
- package/dist/learning/catalog-feed.d.ts.map +1 -0
- package/dist/learning/catalog-feed.js +211 -0
- package/dist/learning/catalog-feed.js.map +1 -0
- package/dist/learning/cli-intent-effects.d.ts +60 -0
- package/dist/learning/cli-intent-effects.d.ts.map +1 -0
- package/dist/learning/cli-intent-effects.js +153 -0
- package/dist/learning/cli-intent-effects.js.map +1 -0
- package/dist/learning/command-adaptation.d.ts +41 -0
- package/dist/learning/command-adaptation.d.ts.map +1 -0
- package/dist/learning/command-adaptation.js +122 -0
- package/dist/learning/command-adaptation.js.map +1 -0
- package/dist/learning/consent-picture.d.ts +42 -0
- package/dist/learning/consent-picture.d.ts.map +1 -0
- package/dist/learning/consent-picture.js +53 -0
- package/dist/learning/consent-picture.js.map +1 -0
- package/dist/learning/context-budget.d.ts +37 -6
- package/dist/learning/context-budget.d.ts.map +1 -1
- package/dist/learning/context-budget.js +38 -9
- package/dist/learning/context-budget.js.map +1 -1
- package/dist/learning/decision-log.d.ts +114 -0
- package/dist/learning/decision-log.d.ts.map +1 -0
- package/dist/learning/decision-log.js +296 -0
- package/dist/learning/decision-log.js.map +1 -0
- package/dist/learning/deliverable-class.d.ts.map +1 -1
- package/dist/learning/deliverable-class.js +19 -0
- package/dist/learning/deliverable-class.js.map +1 -1
- package/dist/learning/deliverable-corpus.d.ts +117 -0
- package/dist/learning/deliverable-corpus.d.ts.map +1 -0
- package/dist/learning/deliverable-corpus.js +176 -0
- package/dist/learning/deliverable-corpus.js.map +1 -0
- package/dist/learning/error-repair.d.ts +45 -2
- package/dist/learning/error-repair.d.ts.map +1 -1
- package/dist/learning/error-repair.js +95 -0
- package/dist/learning/error-repair.js.map +1 -1
- package/dist/learning/exhaustion-report.d.ts +136 -0
- package/dist/learning/exhaustion-report.d.ts.map +1 -0
- package/dist/learning/exhaustion-report.js +239 -0
- package/dist/learning/exhaustion-report.js.map +1 -0
- package/dist/learning/failure-bookkeeping.d.ts +16 -0
- package/dist/learning/failure-bookkeeping.d.ts.map +1 -1
- package/dist/learning/failure-bookkeeping.js +51 -5
- package/dist/learning/failure-bookkeeping.js.map +1 -1
- package/dist/learning/gate-friction.d.ts +39 -0
- package/dist/learning/gate-friction.d.ts.map +1 -0
- package/dist/learning/gate-friction.js +91 -0
- package/dist/learning/gate-friction.js.map +1 -0
- package/dist/learning/harness-narration.d.ts +34 -0
- package/dist/learning/harness-narration.d.ts.map +1 -0
- package/dist/learning/harness-narration.js +58 -0
- package/dist/learning/harness-narration.js.map +1 -0
- package/dist/learning/hub-skill-catalog.d.ts.map +1 -1
- package/dist/learning/hub-skill-catalog.js +1 -2
- package/dist/learning/hub-skill-catalog.js.map +1 -1
- package/dist/learning/hybrid-router.d.ts +65 -0
- package/dist/learning/hybrid-router.d.ts.map +1 -1
- package/dist/learning/hybrid-router.js +186 -0
- package/dist/learning/hybrid-router.js.map +1 -1
- package/dist/learning/knowledge-base.d.ts +350 -0
- package/dist/learning/knowledge-base.d.ts.map +1 -0
- package/dist/learning/knowledge-base.js +906 -0
- package/dist/learning/knowledge-base.js.map +1 -0
- package/dist/learning/knowledge-eval.d.ts +171 -0
- package/dist/learning/knowledge-eval.d.ts.map +1 -0
- package/dist/learning/knowledge-eval.js +196 -0
- package/dist/learning/knowledge-eval.js.map +1 -0
- package/dist/learning/knowledge-turn.d.ts +92 -0
- package/dist/learning/knowledge-turn.d.ts.map +1 -0
- package/dist/learning/knowledge-turn.js +190 -0
- package/dist/learning/knowledge-turn.js.map +1 -0
- package/dist/learning/learned-commands.d.ts +64 -0
- package/dist/learning/learned-commands.d.ts.map +1 -0
- package/dist/learning/learned-commands.js +108 -0
- package/dist/learning/learned-commands.js.map +1 -0
- package/dist/learning/lexical-search.d.ts +50 -0
- package/dist/learning/lexical-search.d.ts.map +1 -0
- package/dist/learning/lexical-search.js +111 -0
- package/dist/learning/lexical-search.js.map +1 -0
- package/dist/learning/machine-facts.d.ts +71 -0
- package/dist/learning/machine-facts.d.ts.map +1 -0
- package/dist/learning/machine-facts.js +164 -0
- package/dist/learning/machine-facts.js.map +1 -0
- package/dist/learning/markdown-outline.d.ts +73 -0
- package/dist/learning/markdown-outline.d.ts.map +1 -0
- package/dist/learning/markdown-outline.js +136 -0
- package/dist/learning/markdown-outline.js.map +1 -0
- package/dist/learning/model-first-router.d.ts +33 -1
- package/dist/learning/model-first-router.d.ts.map +1 -1
- package/dist/learning/model-first-router.js +123 -9
- package/dist/learning/model-first-router.js.map +1 -1
- package/dist/learning/model-identity.d.ts +80 -0
- package/dist/learning/model-identity.d.ts.map +1 -0
- package/dist/learning/model-identity.js +115 -0
- package/dist/learning/model-identity.js.map +1 -0
- package/dist/learning/model-registry.d.ts +141 -2
- package/dist/learning/model-registry.d.ts.map +1 -1
- package/dist/learning/model-registry.js +324 -38
- package/dist/learning/model-registry.js.map +1 -1
- package/dist/learning/model-scoring.d.ts.map +1 -1
- package/dist/learning/model-scoring.js +8 -1
- package/dist/learning/model-scoring.js.map +1 -1
- package/dist/learning/model-selection.d.ts +2 -1
- package/dist/learning/model-selection.d.ts.map +1 -1
- package/dist/learning/model-selection.js +76 -2
- package/dist/learning/model-selection.js.map +1 -1
- package/dist/learning/outcome-observation.d.ts +49 -0
- package/dist/learning/outcome-observation.d.ts.map +1 -0
- package/dist/learning/outcome-observation.js +95 -0
- package/dist/learning/outcome-observation.js.map +1 -0
- package/dist/learning/pair-entitlement.d.ts +184 -0
- package/dist/learning/pair-entitlement.d.ts.map +1 -0
- package/dist/learning/pair-entitlement.js +214 -0
- package/dist/learning/pair-entitlement.js.map +1 -0
- package/dist/learning/project-docs.d.ts +83 -0
- package/dist/learning/project-docs.d.ts.map +1 -0
- package/dist/learning/project-docs.js +132 -0
- package/dist/learning/project-docs.js.map +1 -0
- package/dist/learning/provider-fallback.d.ts +23 -1
- package/dist/learning/provider-fallback.d.ts.map +1 -1
- package/dist/learning/provider-fallback.js +24 -0
- package/dist/learning/provider-fallback.js.map +1 -1
- package/dist/learning/quota-ledger.d.ts +13 -0
- package/dist/learning/quota-ledger.d.ts.map +1 -1
- package/dist/learning/quota-ledger.js +28 -0
- package/dist/learning/quota-ledger.js.map +1 -1
- package/dist/learning/reasoning-trace.d.ts +65 -1
- package/dist/learning/reasoning-trace.d.ts.map +1 -1
- package/dist/learning/reasoning-trace.js +123 -1
- package/dist/learning/reasoning-trace.js.map +1 -1
- package/dist/learning/requirement-probe.d.ts +55 -0
- package/dist/learning/requirement-probe.d.ts.map +1 -0
- package/dist/learning/requirement-probe.js +77 -0
- package/dist/learning/requirement-probe.js.map +1 -0
- package/dist/learning/resilient-call.d.ts +20 -1
- package/dist/learning/resilient-call.d.ts.map +1 -1
- package/dist/learning/resilient-call.js +42 -4
- package/dist/learning/resilient-call.js.map +1 -1
- package/dist/learning/response-usability.d.ts +85 -0
- package/dist/learning/response-usability.d.ts.map +1 -0
- package/dist/learning/response-usability.js +135 -0
- package/dist/learning/response-usability.js.map +1 -0
- package/dist/learning/router-bandit.d.ts +132 -0
- package/dist/learning/router-bandit.d.ts.map +1 -1
- package/dist/learning/router-bandit.js +253 -0
- package/dist/learning/router-bandit.js.map +1 -1
- package/dist/learning/routing-history.d.ts +41 -2
- package/dist/learning/routing-history.d.ts.map +1 -1
- package/dist/learning/routing-history.js.map +1 -1
- package/dist/learning/run-trace.d.ts +21 -0
- package/dist/learning/run-trace.d.ts.map +1 -1
- package/dist/learning/run-trace.js +38 -0
- package/dist/learning/run-trace.js.map +1 -1
- package/dist/learning/seeded-benchmark.d.ts +14 -0
- package/dist/learning/seeded-benchmark.d.ts.map +1 -1
- package/dist/learning/seeded-benchmark.js +43 -4
- package/dist/learning/seeded-benchmark.js.map +1 -1
- package/dist/learning/session-grant.d.ts +75 -0
- package/dist/learning/session-grant.d.ts.map +1 -0
- package/dist/learning/session-grant.js +112 -0
- package/dist/learning/session-grant.js.map +1 -0
- package/dist/learning/task-model-continuity.d.ts +73 -0
- package/dist/learning/task-model-continuity.d.ts.map +1 -0
- package/dist/learning/task-model-continuity.js +87 -0
- package/dist/learning/task-model-continuity.js.map +1 -0
- package/dist/learning/turn-feedback.d.ts +93 -0
- package/dist/learning/turn-feedback.d.ts.map +1 -0
- package/dist/learning/turn-feedback.js +127 -0
- package/dist/learning/turn-feedback.js.map +1 -0
- package/dist/learning/turn-report.d.ts +104 -2
- package/dist/learning/turn-report.d.ts.map +1 -1
- package/dist/learning/turn-report.js +161 -6
- package/dist/learning/turn-report.js.map +1 -1
- package/dist/learning/verdict-routing.d.ts +51 -0
- package/dist/learning/verdict-routing.d.ts.map +1 -0
- package/dist/learning/verdict-routing.js +122 -0
- package/dist/learning/verdict-routing.js.map +1 -0
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +5 -0
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/manager.d.ts +10 -0
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/manager.js +20 -0
- package/dist/mcp/manager.js.map +1 -1
- package/dist/mcp/mcp-discovery.d.ts +34 -0
- package/dist/mcp/mcp-discovery.d.ts.map +1 -0
- package/dist/mcp/mcp-discovery.js +71 -0
- package/dist/mcp/mcp-discovery.js.map +1 -0
- package/dist/mcp/mcp-schema-cache.d.ts +17 -0
- package/dist/mcp/mcp-schema-cache.d.ts.map +1 -1
- package/dist/mcp/mcp-schema-cache.js +47 -3
- package/dist/mcp/mcp-schema-cache.js.map +1 -1
- package/dist/mcp/types.d.ts +28 -0
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/mcp/types.js.map +1 -1
- package/dist/security/secret-scan.d.ts +156 -0
- package/dist/security/secret-scan.d.ts.map +1 -0
- package/dist/security/secret-scan.js +525 -0
- package/dist/security/secret-scan.js.map +1 -0
- package/dist/tools/ask-user.d.ts.map +1 -1
- package/dist/tools/ask-user.js +4 -0
- package/dist/tools/ask-user.js.map +1 -1
- package/dist/tools/capability-registry.d.ts +150 -0
- package/dist/tools/capability-registry.d.ts.map +1 -0
- package/dist/tools/capability-registry.js +400 -0
- package/dist/tools/capability-registry.js.map +1 -0
- package/dist/tools/child-agent-runtime.d.ts.map +1 -1
- package/dist/tools/child-agent-runtime.js +19 -5
- package/dist/tools/child-agent-runtime.js.map +1 -1
- package/dist/tools/coding-tools.d.ts +17 -5
- package/dist/tools/coding-tools.d.ts.map +1 -1
- package/dist/tools/coding-tools.js +80 -11
- package/dist/tools/coding-tools.js.map +1 -1
- package/dist/tools/command-memo.d.ts +116 -0
- package/dist/tools/command-memo.d.ts.map +1 -0
- package/dist/tools/command-memo.js +202 -0
- package/dist/tools/command-memo.js.map +1 -0
- package/dist/tools/git-tool.d.ts.map +1 -1
- package/dist/tools/git-tool.js +13 -3
- package/dist/tools/git-tool.js.map +1 -1
- package/dist/tools/harness-directive.d.ts +42 -0
- package/dist/tools/harness-directive.d.ts.map +1 -0
- package/dist/tools/harness-directive.js +45 -0
- package/dist/tools/harness-directive.js.map +1 -0
- package/dist/tools/loop-skill-hint.d.ts +74 -174
- package/dist/tools/loop-skill-hint.d.ts.map +1 -1
- package/dist/tools/loop-skill-hint.js +110 -536
- package/dist/tools/loop-skill-hint.js.map +1 -1
- package/dist/tools/mcp-client-tool.d.ts +2 -0
- package/dist/tools/mcp-client-tool.d.ts.map +1 -1
- package/dist/tools/mcp-client-tool.js +3 -0
- package/dist/tools/mcp-client-tool.js.map +1 -1
- package/dist/tools/modality/shared.d.ts +1 -4
- package/dist/tools/modality/shared.d.ts.map +1 -1
- package/dist/tools/modality/shared.js +7 -22
- package/dist/tools/modality/shared.js.map +1 -1
- package/dist/tools/plan-store.d.ts +44 -4
- package/dist/tools/plan-store.d.ts.map +1 -1
- package/dist/tools/plan-store.js +93 -9
- package/dist/tools/plan-store.js.map +1 -1
- package/dist/tools/registry.d.ts +76 -3
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +623 -15
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/remediation-ladder.d.ts +91 -0
- package/dist/tools/remediation-ladder.d.ts.map +1 -0
- package/dist/tools/remediation-ladder.js +316 -0
- package/dist/tools/remediation-ladder.js.map +1 -0
- package/dist/tools/run-cli.d.ts.map +1 -1
- package/dist/tools/run-cli.js +29 -4
- package/dist/tools/run-cli.js.map +1 -1
- package/dist/tools/run-terminal.d.ts +11 -0
- package/dist/tools/run-terminal.d.ts.map +1 -1
- package/dist/tools/run-terminal.js +289 -10
- package/dist/tools/run-terminal.js.map +1 -1
- package/dist/tools/skills-hub.d.ts +7 -0
- package/dist/tools/skills-hub.d.ts.map +1 -1
- package/dist/tools/skills-hub.js +11 -2
- package/dist/tools/skills-hub.js.map +1 -1
- package/dist/tools/step-artifact.d.ts +35 -0
- package/dist/tools/step-artifact.d.ts.map +1 -0
- package/dist/tools/step-artifact.js +154 -0
- package/dist/tools/step-artifact.js.map +1 -0
- package/dist/tools/tool-loop.d.ts +327 -13
- package/dist/tools/tool-loop.d.ts.map +1 -1
- package/dist/tools/tool-loop.js +891 -66
- package/dist/tools/tool-loop.js.map +1 -1
- package/dist/tools/toolsets.js +4 -4
- package/dist/tools/toolsets.js.map +1 -1
- package/dist/tools/worktree.d.ts +11 -2
- package/dist/tools/worktree.d.ts.map +1 -1
- package/dist/tools/worktree.js +11 -2
- package/dist/tools/worktree.js.map +1 -1
- package/dist/utils/atomic-store.d.ts +53 -0
- package/dist/utils/atomic-store.d.ts.map +1 -0
- package/dist/utils/atomic-store.js +178 -0
- package/dist/utils/atomic-store.js.map +1 -0
- package/dist/utils/binary-probe.d.ts +25 -0
- package/dist/utils/binary-probe.d.ts.map +1 -0
- package/dist/utils/binary-probe.js +48 -0
- package/dist/utils/binary-probe.js.map +1 -0
- package/dist/utils/workspace-path.d.ts +50 -0
- package/dist/utils/workspace-path.d.ts.map +1 -0
- package/dist/utils/workspace-path.js +86 -0
- package/dist/utils/workspace-path.js.map +1 -0
- package/dist/web-dashboard/chat-console.d.ts +24 -0
- package/dist/web-dashboard/chat-console.d.ts.map +1 -1
- package/dist/web-dashboard/chat-console.js +38 -0
- package/dist/web-dashboard/chat-console.js.map +1 -1
- package/dist/web-dashboard/project-context.d.ts +27 -2
- package/dist/web-dashboard/project-context.d.ts.map +1 -1
- package/dist/web-dashboard/project-context.js +32 -2
- package/dist/web-dashboard/project-context.js.map +1 -1
- package/dist/web-dashboard/server.d.ts +40 -0
- package/dist/web-dashboard/server.d.ts.map +1 -1
- package/dist/web-dashboard/server.js +733 -15
- package/dist/web-dashboard/server.js.map +1 -1
- package/dist/web-dashboard/src/types.d.ts +236 -1
- package/dist/web-dashboard/src/types.d.ts.map +1 -1
- package/dist/web-dashboard/workspace-guard.d.ts +18 -2
- package/dist/web-dashboard/workspace-guard.d.ts.map +1 -1
- package/dist/web-dashboard/workspace-guard.js +94 -12
- package/dist/web-dashboard/workspace-guard.js.map +1 -1
- package/dist/web-dashboard/workspace-resolution.d.ts +87 -0
- package/dist/web-dashboard/workspace-resolution.d.ts.map +1 -0
- package/dist/web-dashboard/workspace-resolution.js +105 -0
- package/dist/web-dashboard/workspace-resolution.js.map +1 -0
- package/package.json +1 -1
- package/src/web-dashboard/public/assets/index-tK8Y2qHB.css +1 -0
- package/src/web-dashboard/public/assets/index-zjbdJnO-.js +210 -0
- package/src/web-dashboard/public/assets/index-zjbdJnO-.js.map +1 -0
- package/src/web-dashboard/public/index.html +2 -2
- package/src/web-dashboard/public/assets/index-BrZcYhy6.js +0 -207
- package/src/web-dashboard/public/assets/index-BrZcYhy6.js.map +0 -1
- package/src/web-dashboard/public/assets/index-DsWczTa6.css +0 -1
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The honest EXHAUSTION REPORT (fix_model_routing P4, invariants 2, 4 and 7).
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS. When every reachable model has been tried and the task is
|
|
5
|
+
* still not delivered, the old answer was a one-line apology plus — worse — a
|
|
6
|
+
* question: *"Want me to retry? Reply yes."* That makes the USER the retry
|
|
7
|
+
* button, which is the single clearest way to fail them: a competent operator
|
|
8
|
+
* does not walk back to the requester to ask permission to try the next worker,
|
|
9
|
+
* and they certainly do not do it after the requester already asked once. The
|
|
10
|
+
* user's own words: *"if user need to say retry that we are failing."*
|
|
11
|
+
*
|
|
12
|
+
* So the report's job is to say, in plain language and with NO follow-up
|
|
13
|
+
* question:
|
|
14
|
+
*
|
|
15
|
+
* 1. what was tried, per model, and why each one did not answer;
|
|
16
|
+
* 2. which targets are exhausted vs. DEAD vs. merely COOLING DOWN, and the
|
|
17
|
+
* WALL-CLOCK TIME each cooling one frees up (a wait length is unactionable;
|
|
18
|
+
* "free at 18:42" is something a person can plan around);
|
|
19
|
+
* 3. what the system itself is doing about it (routing to an untried model,
|
|
20
|
+
* or waiting for a window) — stated as the system's job, not the user's;
|
|
21
|
+
* 4. the concrete levers only the user can pull: recharge/replace a rejected
|
|
22
|
+
* credential, knowingly accept a weaker model, or narrow the ask.
|
|
23
|
+
*
|
|
24
|
+
* DETERMINISTIC AND LLM-FREE on purpose. A failure explanation that is itself
|
|
25
|
+
* generated can hallucinate a reason or a time, and this text is the only thing
|
|
26
|
+
* the user has left to trust. Every line here comes from measured state: the
|
|
27
|
+
* failover walk's own attempt log, the routing exclusion ledger, and the pool
|
|
28
|
+
* count — the SAME sources enforcement reads, so the report can never disagree
|
|
29
|
+
* with what routing actually did.
|
|
30
|
+
*
|
|
31
|
+
* It DELIBERATELY does not duplicate `renderModelBreadthReport`'s job of
|
|
32
|
+
* explaining a failure to a caller that still has a retry mechanism available;
|
|
33
|
+
* it is the terminal, "there is nothing left" message, and its distinguishing
|
|
34
|
+
* features are the absolute clocks, the named levers and the refusal to ask the
|
|
35
|
+
* user to trigger anything.
|
|
36
|
+
*/
|
|
37
|
+
/** One model the walk actually reached, and how it went. */
|
|
38
|
+
export interface ExhaustionAttempt {
|
|
39
|
+
provider: string;
|
|
40
|
+
model: string;
|
|
41
|
+
/** The classified failure kind ('empty-response', 'rate-limit', 'auth', …). */
|
|
42
|
+
kind: string;
|
|
43
|
+
/** A short human phrase — what the user can act on. */
|
|
44
|
+
reason: string;
|
|
45
|
+
/** True when the candidate was ruled out WITHOUT being called. */
|
|
46
|
+
skipped?: boolean;
|
|
47
|
+
}
|
|
48
|
+
/** A target that could not be reached, with why and (when known) until when. */
|
|
49
|
+
export interface ExhaustionExclusion {
|
|
50
|
+
provider: string;
|
|
51
|
+
model?: string;
|
|
52
|
+
kind: string;
|
|
53
|
+
/**
|
|
54
|
+
* When it becomes usable again (ms epoch). Absent/0 means "not on its own" —
|
|
55
|
+
* a retired pair or a rejected credential does not heal with time.
|
|
56
|
+
*/
|
|
57
|
+
expiresAt?: number;
|
|
58
|
+
/** 'registry' marks a ruling (the pair does not exist), not a cooldown. */
|
|
59
|
+
source?: string;
|
|
60
|
+
}
|
|
61
|
+
export interface ExhaustionInput {
|
|
62
|
+
attempts: ExhaustionAttempt[];
|
|
63
|
+
exclusions?: ExhaustionExclusion[];
|
|
64
|
+
/** Eligible models the router would consider right now (measured, never guessed). */
|
|
65
|
+
poolSize?: number;
|
|
66
|
+
poolProviders?: number;
|
|
67
|
+
/** What the user asked for, for the header. */
|
|
68
|
+
task?: string;
|
|
69
|
+
/**
|
|
70
|
+
* The underlying failure line, when there is one (e.g. the provider's own
|
|
71
|
+
* rejection text). Rendered as a `Reason:` line so a specific, actionable
|
|
72
|
+
* cause is never lost behind the report.
|
|
73
|
+
*/
|
|
74
|
+
cause?: string;
|
|
75
|
+
/** Injected clock — reports are pure functions of their inputs. */
|
|
76
|
+
now?: number;
|
|
77
|
+
}
|
|
78
|
+
export interface ExhaustionOption {
|
|
79
|
+
/** `recharge` | `wait` | `weaker-model` | `narrow`. */
|
|
80
|
+
code: 'recharge' | 'wait' | 'weaker-model' | 'narrow';
|
|
81
|
+
text: string;
|
|
82
|
+
}
|
|
83
|
+
export interface ExhaustionReport {
|
|
84
|
+
headline: string;
|
|
85
|
+
/** `provider/model — reason`, one per model that was reached and failed. */
|
|
86
|
+
tried: string[];
|
|
87
|
+
/** Targets that were not reachable, with an absolute free time when it exists. */
|
|
88
|
+
unavailable: Array<{
|
|
89
|
+
target: string;
|
|
90
|
+
reason: string;
|
|
91
|
+
freeAt?: number;
|
|
92
|
+
}>;
|
|
93
|
+
/** Pairs ruled out because they do not exist on that provider. */
|
|
94
|
+
retired: string[];
|
|
95
|
+
/** The measured pool claim, when the pool was measured. */
|
|
96
|
+
poolClaim?: string;
|
|
97
|
+
/**
|
|
98
|
+
* True when a healthy pool existed and the walk simply did not reach the
|
|
99
|
+
* remaining models. That is a ROUTING GAP, not a shortage — and the report
|
|
100
|
+
* says so instead of presenting it as an outage.
|
|
101
|
+
*/
|
|
102
|
+
routingGap: boolean;
|
|
103
|
+
/** The soonest a capable model comes back on its own (ms epoch). */
|
|
104
|
+
nextFreeAt?: number;
|
|
105
|
+
options: ExhaustionOption[];
|
|
106
|
+
/** The rendered, ready-to-deliver text. */
|
|
107
|
+
text: string;
|
|
108
|
+
}
|
|
109
|
+
/** `18:42` in the operator's own clock. Deterministic given a timestamp. */
|
|
110
|
+
export declare function formatClockTime(ts: number): string;
|
|
111
|
+
/** `2m`, `55m`, `3h` — a wait a person can read. */
|
|
112
|
+
export declare function formatWaitShort(ms: number): string;
|
|
113
|
+
/**
|
|
114
|
+
* A phrase for a failure kind, in the vocabulary the user can act on.
|
|
115
|
+
*
|
|
116
|
+
* Exported so a caller RECORDING an attempt (chat's own walk) writes the same
|
|
117
|
+
* words the report will print — the alternative is a raw provider message
|
|
118
|
+
* reaching the user, which is how a JSON quota dump once got delivered verbatim
|
|
119
|
+
* as an answer.
|
|
120
|
+
*/
|
|
121
|
+
export declare function describeFailureKind(kind: string): string;
|
|
122
|
+
/**
|
|
123
|
+
* Build the report. Pure: same inputs, same text — no clock reads, no network,
|
|
124
|
+
* no model call (pass `now` explicitly; absent means "measured here").
|
|
125
|
+
*/
|
|
126
|
+
export declare function buildExhaustionReport(input: ExhaustionInput): ExhaustionReport;
|
|
127
|
+
/**
|
|
128
|
+
* The report, or `undefined` when there is genuinely nothing concrete to say.
|
|
129
|
+
*
|
|
130
|
+
* Silent-when-empty is deliberate: a caller that already has an actionable line
|
|
131
|
+
* ("the provider rejected the key") must keep it rather than trade it for an
|
|
132
|
+
* empty report. "Concrete" means exactly one thing — a model was reached, or
|
|
133
|
+
* something was ruled out. A report with neither is not evidence of exhaustion.
|
|
134
|
+
*/
|
|
135
|
+
export declare function renderExhaustionReport(input: ExhaustionInput): string | undefined;
|
|
136
|
+
//# sourceMappingURL=exhaustion-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exhaustion-report.d.ts","sourceRoot":"","sources":["../../src/learning/exhaustion-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,4DAA4D;AAC5D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,gFAAgF;AAChF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACnC,qFAAqF;IACrF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,cAAc,GAAG,QAAQ,CAAC;IACtD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,kFAAkF;IAClF,WAAW,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,kEAAkE;IAClE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,UAAU,EAAE,OAAO,CAAC;IACpB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAKlD;AAED,oDAAoD;AACpD,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuBxD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CAuJ9E;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,GAAG,SAAS,CAQjF"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The honest EXHAUSTION REPORT (fix_model_routing P4, invariants 2, 4 and 7).
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS. When every reachable model has been tried and the task is
|
|
5
|
+
* still not delivered, the old answer was a one-line apology plus — worse — a
|
|
6
|
+
* question: *"Want me to retry? Reply yes."* That makes the USER the retry
|
|
7
|
+
* button, which is the single clearest way to fail them: a competent operator
|
|
8
|
+
* does not walk back to the requester to ask permission to try the next worker,
|
|
9
|
+
* and they certainly do not do it after the requester already asked once. The
|
|
10
|
+
* user's own words: *"if user need to say retry that we are failing."*
|
|
11
|
+
*
|
|
12
|
+
* So the report's job is to say, in plain language and with NO follow-up
|
|
13
|
+
* question:
|
|
14
|
+
*
|
|
15
|
+
* 1. what was tried, per model, and why each one did not answer;
|
|
16
|
+
* 2. which targets are exhausted vs. DEAD vs. merely COOLING DOWN, and the
|
|
17
|
+
* WALL-CLOCK TIME each cooling one frees up (a wait length is unactionable;
|
|
18
|
+
* "free at 18:42" is something a person can plan around);
|
|
19
|
+
* 3. what the system itself is doing about it (routing to an untried model,
|
|
20
|
+
* or waiting for a window) — stated as the system's job, not the user's;
|
|
21
|
+
* 4. the concrete levers only the user can pull: recharge/replace a rejected
|
|
22
|
+
* credential, knowingly accept a weaker model, or narrow the ask.
|
|
23
|
+
*
|
|
24
|
+
* DETERMINISTIC AND LLM-FREE on purpose. A failure explanation that is itself
|
|
25
|
+
* generated can hallucinate a reason or a time, and this text is the only thing
|
|
26
|
+
* the user has left to trust. Every line here comes from measured state: the
|
|
27
|
+
* failover walk's own attempt log, the routing exclusion ledger, and the pool
|
|
28
|
+
* count — the SAME sources enforcement reads, so the report can never disagree
|
|
29
|
+
* with what routing actually did.
|
|
30
|
+
*
|
|
31
|
+
* It DELIBERATELY does not duplicate `renderModelBreadthReport`'s job of
|
|
32
|
+
* explaining a failure to a caller that still has a retry mechanism available;
|
|
33
|
+
* it is the terminal, "there is nothing left" message, and its distinguishing
|
|
34
|
+
* features are the absolute clocks, the named levers and the refusal to ask the
|
|
35
|
+
* user to trigger anything.
|
|
36
|
+
*/
|
|
37
|
+
/** `18:42` in the operator's own clock. Deterministic given a timestamp. */
|
|
38
|
+
export function formatClockTime(ts) {
|
|
39
|
+
const d = new Date(ts);
|
|
40
|
+
const hh = String(d.getHours()).padStart(2, '0');
|
|
41
|
+
const mm = String(d.getMinutes()).padStart(2, '0');
|
|
42
|
+
return `${hh}:${mm}`;
|
|
43
|
+
}
|
|
44
|
+
/** `2m`, `55m`, `3h` — a wait a person can read. */
|
|
45
|
+
export function formatWaitShort(ms) {
|
|
46
|
+
if (ms < 60_000)
|
|
47
|
+
return `${Math.max(1, Math.round(ms / 1000))}s`;
|
|
48
|
+
if (ms < 3_600_000)
|
|
49
|
+
return `${Math.round(ms / 60_000)}m`;
|
|
50
|
+
return `${Math.round(ms / 3_600_000)}h`;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* A phrase for a failure kind, in the vocabulary the user can act on.
|
|
54
|
+
*
|
|
55
|
+
* Exported so a caller RECORDING an attempt (chat's own walk) writes the same
|
|
56
|
+
* words the report will print — the alternative is a raw provider message
|
|
57
|
+
* reaching the user, which is how a JSON quota dump once got delivered verbatim
|
|
58
|
+
* as an answer.
|
|
59
|
+
*/
|
|
60
|
+
export function describeFailureKind(kind) {
|
|
61
|
+
switch (kind) {
|
|
62
|
+
case 'empty-response':
|
|
63
|
+
return 'answered with nothing (no text, no tool call)';
|
|
64
|
+
case 'rate-limit':
|
|
65
|
+
return 'out of quota for now';
|
|
66
|
+
case 'auth':
|
|
67
|
+
return 'rejected its credential';
|
|
68
|
+
case 'timeout':
|
|
69
|
+
return 'timed out';
|
|
70
|
+
case 'network':
|
|
71
|
+
return 'unreachable (network)';
|
|
72
|
+
case 'model-not-found':
|
|
73
|
+
return 'model not found on that provider';
|
|
74
|
+
case 'context-window':
|
|
75
|
+
return 'the prompt was too large for its window';
|
|
76
|
+
case 'server':
|
|
77
|
+
return 'provider-side error';
|
|
78
|
+
case 'skipped':
|
|
79
|
+
return 'was not tried';
|
|
80
|
+
default:
|
|
81
|
+
return kind && kind !== 'unknown' ? kind : 'failed';
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Build the report. Pure: same inputs, same text — no clock reads, no network,
|
|
86
|
+
* no model call (pass `now` explicitly; absent means "measured here").
|
|
87
|
+
*/
|
|
88
|
+
export function buildExhaustionReport(input) {
|
|
89
|
+
const now = input.now ?? Date.now();
|
|
90
|
+
const attempts = input.attempts ?? [];
|
|
91
|
+
const exclusions = input.exclusions ?? [];
|
|
92
|
+
const triedAttempts = attempts.filter((a) => !a.skipped);
|
|
93
|
+
const skippedAttempts = attempts.filter((a) => a.skipped);
|
|
94
|
+
const isRuling = (e) => e.source === 'registry' && !!e.model;
|
|
95
|
+
const retired = exclusions.filter(isRuling).map((e) => `${e.provider}/${e.model}`);
|
|
96
|
+
const cooling = exclusions.filter((e) => !isRuling(e));
|
|
97
|
+
const tried = triedAttempts.map((a) => {
|
|
98
|
+
const reason = a.reason?.trim() ? a.reason : describeFailureKind(a.kind);
|
|
99
|
+
return `${a.provider}/${a.model} — ${reason}`;
|
|
100
|
+
});
|
|
101
|
+
const unavailable = [];
|
|
102
|
+
for (const e of cooling) {
|
|
103
|
+
const target = e.model ? `${e.provider}/${e.model}` : e.provider;
|
|
104
|
+
const freeAt = e.expiresAt && e.expiresAt > now ? e.expiresAt : undefined;
|
|
105
|
+
unavailable.push({
|
|
106
|
+
target,
|
|
107
|
+
reason: describeFailureKind(e.kind),
|
|
108
|
+
...(freeAt ? { freeAt } : {}),
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
// Every exclusion that will heal is a legitimate wait option; take the soonest.
|
|
112
|
+
const nextFreeAt = unavailable.reduce((acc, u) => (u.freeAt === undefined ? acc : acc === undefined || u.freeAt < acc ? u.freeAt : acc), undefined);
|
|
113
|
+
const poolMeasured = typeof input.poolSize === 'number';
|
|
114
|
+
const poolSize = input.poolSize ?? 0;
|
|
115
|
+
const poolProviders = input.poolProviders ?? 0;
|
|
116
|
+
// A routing gap: the pool was measured, models were reached, and eligible
|
|
117
|
+
// models remained untouched. Presenting that as an outage is the dishonesty
|
|
118
|
+
// the user called out when a healthy pool sat unused behind "no model
|
|
119
|
+
// available".
|
|
120
|
+
const routingGap = poolMeasured && triedAttempts.length > 0 && poolSize > triedAttempts.length;
|
|
121
|
+
const emptyPool = poolMeasured && poolSize === 0;
|
|
122
|
+
const parts = [];
|
|
123
|
+
const attemptCount = triedAttempts.length;
|
|
124
|
+
parts.push(input.task
|
|
125
|
+
? `I couldn't finish: ${input.task.slice(0, 120)}`
|
|
126
|
+
: "I couldn't finish this one.");
|
|
127
|
+
const cause = input.cause?.trim();
|
|
128
|
+
if (cause)
|
|
129
|
+
parts.push(`Reason: ${cause}`);
|
|
130
|
+
if (attemptCount > 0) {
|
|
131
|
+
parts.push('');
|
|
132
|
+
parts.push(`Tried ${attemptCount} model${attemptCount === 1 ? '' : 's'}, and every one of them was unable to do it:`);
|
|
133
|
+
for (const line of tried.slice(0, 8))
|
|
134
|
+
parts.push(` • ${line}`);
|
|
135
|
+
if (tried.length > 8)
|
|
136
|
+
parts.push(` • …and ${tried.length - 8} more`);
|
|
137
|
+
}
|
|
138
|
+
else if (skippedAttempts.length > 0) {
|
|
139
|
+
parts.push('');
|
|
140
|
+
parts.push(`No model could even be called: ${skippedAttempts.length} candidate${skippedAttempts.length === 1 ? ' was' : 's were'} ruled out before a request went out.`);
|
|
141
|
+
}
|
|
142
|
+
if (unavailable.length > 0) {
|
|
143
|
+
parts.push('');
|
|
144
|
+
parts.push('Unavailable right now, and when each comes back:');
|
|
145
|
+
for (const u of unavailable.slice(0, 8)) {
|
|
146
|
+
const when = u.freeAt ? `free at ${formatClockTime(u.freeAt)} (about ${formatWaitShort(u.freeAt - now)})` : 'no reset window — this one needs a fix, not patience';
|
|
147
|
+
parts.push(` • ${u.target} — ${u.reason}; ${when}`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (retired.length > 0) {
|
|
151
|
+
parts.push('');
|
|
152
|
+
parts.push('Ruled out (that model does not exist on that provider):');
|
|
153
|
+
for (const r of retired.slice(0, 4))
|
|
154
|
+
parts.push(` • ${r}`);
|
|
155
|
+
}
|
|
156
|
+
let poolClaim;
|
|
157
|
+
if (poolMeasured && !emptyPool) {
|
|
158
|
+
poolClaim = `${poolSize} model${poolSize === 1 ? '' : 's'} across ${poolProviders} provider${poolProviders === 1 ? '' : 's'} were eligible at the time.`;
|
|
159
|
+
parts.push('');
|
|
160
|
+
parts.push(poolClaim);
|
|
161
|
+
}
|
|
162
|
+
// ── What the SYSTEM is doing (never a question to the user) ──────────────
|
|
163
|
+
parts.push('');
|
|
164
|
+
if (routingGap) {
|
|
165
|
+
parts.push(`This was a routing gap, not a shortage: only ${attemptCount} of ${poolSize} eligible models were actually tried. The next attempt routes to an untried model automatically — you do not need to trigger anything.`);
|
|
166
|
+
}
|
|
167
|
+
else if (emptyPool) {
|
|
168
|
+
parts.push('No model was eligible at all — the pool is empty (no usable credential, or every model is ruled out).');
|
|
169
|
+
}
|
|
170
|
+
else if (attemptCount === 0) {
|
|
171
|
+
parts.push('The model layer failed before it could try anything, which is a transport problem rather than a missing model.');
|
|
172
|
+
}
|
|
173
|
+
// ── The levers only the user can pull ────────────────────────────────────
|
|
174
|
+
const options = [];
|
|
175
|
+
const needsKey = exclusions.filter((e) => e.kind === 'auth');
|
|
176
|
+
if (needsKey.length > 0) {
|
|
177
|
+
options.push({
|
|
178
|
+
code: 'recharge',
|
|
179
|
+
text: `Recharge or replace the credential for ${[...new Set(needsKey.map((e) => e.provider))].join(', ')} — it was rejected, so no amount of waiting fixes it.`,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
const quotaBound = exclusions.filter((e) => e.kind === 'rate-limit');
|
|
183
|
+
if (quotaBound.length > 0) {
|
|
184
|
+
options.push({
|
|
185
|
+
code: 'recharge',
|
|
186
|
+
text: `Raise the quota / add a key for ${[...new Set(quotaBound.map((e) => e.provider))].join(', ')} if you need this done sooner than their reset window.`,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
if (nextFreeAt !== undefined) {
|
|
190
|
+
options.push({
|
|
191
|
+
code: 'wait',
|
|
192
|
+
text: `Wait — a capable model frees up at ${formatClockTime(nextFreeAt)}, about ${formatWaitShort(nextFreeAt - now)} from now. Ask again after that and it will be used automatically.`,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
options.push({
|
|
196
|
+
code: 'weaker-model',
|
|
197
|
+
text: 'Allow a weaker or cheaper model for this task and accept that its answer may need more checking.',
|
|
198
|
+
});
|
|
199
|
+
options.push({
|
|
200
|
+
code: 'narrow',
|
|
201
|
+
text: 'Narrow the ask — one file, one change, or one question at a time — so a smaller (or cheaper) model can finish it.',
|
|
202
|
+
});
|
|
203
|
+
if (options.length > 0) {
|
|
204
|
+
parts.push('');
|
|
205
|
+
parts.push('Things that would unblock it:');
|
|
206
|
+
for (const o of options)
|
|
207
|
+
parts.push(` • ${o.text}`);
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
headline: parts[0],
|
|
211
|
+
tried,
|
|
212
|
+
unavailable,
|
|
213
|
+
retired,
|
|
214
|
+
...(poolClaim ? { poolClaim } : {}),
|
|
215
|
+
routingGap,
|
|
216
|
+
...(nextFreeAt !== undefined ? { nextFreeAt } : {}),
|
|
217
|
+
options,
|
|
218
|
+
text: parts.join('\n'),
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* The report, or `undefined` when there is genuinely nothing concrete to say.
|
|
223
|
+
*
|
|
224
|
+
* Silent-when-empty is deliberate: a caller that already has an actionable line
|
|
225
|
+
* ("the provider rejected the key") must keep it rather than trade it for an
|
|
226
|
+
* empty report. "Concrete" means exactly one thing — a model was reached, or
|
|
227
|
+
* something was ruled out. A report with neither is not evidence of exhaustion.
|
|
228
|
+
*/
|
|
229
|
+
export function renderExhaustionReport(input) {
|
|
230
|
+
const attempts = input.attempts ?? [];
|
|
231
|
+
const exclusions = input.exclusions ?? [];
|
|
232
|
+
// A measured pool size is NOT evidence: a governance refusal, a bad pin or a
|
|
233
|
+
// caller bug all fail with a perfectly healthy pool and no attempt at all, and
|
|
234
|
+
// dressing those up as exhaustion would be a new lie in place of the old one.
|
|
235
|
+
if (attempts.length === 0 && exclusions.length === 0)
|
|
236
|
+
return undefined;
|
|
237
|
+
return buildExhaustionReport(input).text;
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=exhaustion-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exhaustion-report.js","sourceRoot":"","sources":["../../src/learning/exhaustion-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -67,6 +67,22 @@ export declare function isModelSessionExcluded(session: FailureSessionState, pro
|
|
|
67
67
|
* session-level exclusion and the breaker's scoring cooldown expire together.
|
|
68
68
|
*/
|
|
69
69
|
export declare const RATE_LIMIT_EXCLUSION_MS: number;
|
|
70
|
+
/**
|
|
71
|
+
* How long a provider × model pair is excluded after it resolved with NOTHING
|
|
72
|
+
* usable — an HTTP 200 carrying neither answer text nor a tool call (see
|
|
73
|
+
* `response-usability.ts`).
|
|
74
|
+
*
|
|
75
|
+
* MODEL-scoped on purpose, and never escalated to the provider: the transport
|
|
76
|
+
* worked and the provider answered, so its OTHER models are very often
|
|
77
|
+
* perfectly healthy — the live case was one local model returning nothing on
|
|
78
|
+
* five consecutive steps while Gemini sat configured and unused. Two minutes is
|
|
79
|
+
* long enough to cover a turn plus its retries, short enough that a genuinely
|
|
80
|
+
* transient empty self-heals with no user action.
|
|
81
|
+
*
|
|
82
|
+
* The failover walk (`resilient-call.ts`) uses this same constant for its own
|
|
83
|
+
* pair exclusion, so the session and cross-pipeline windows cannot drift.
|
|
84
|
+
*/
|
|
85
|
+
export declare const EMPTY_RESPONSE_SESSION_EXCLUSION_MS: number;
|
|
70
86
|
export declare const RAPID_FAILURE_WINDOW_MS: number;
|
|
71
87
|
export declare const RAPID_FAILURE_THRESHOLD = 3;
|
|
72
88
|
export declare const RAPID_FAILURE_COOLDOWN_MS: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"failure-bookkeeping.d.ts","sourceRoot":"","sources":["../../src/learning/failure-bookkeeping.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAsC1D,MAAM,WAAW,mBAAmB;IAClC;;;;;OAKG;IACH,sBAAsB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C;;;OAGG;IACH,+BAA+B,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7C;;;;;;;;;OASG;IACH,mBAAmB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C;;;;;OAKG;IACH,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACvC;AAED;gFACgF;AAChF,eAAO,MAAM,qCAAqC,IAAI,CAAC;AAEvD,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,mBAAmB,EAC5B,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,GAAG,GAAE,MAAmB,GACvB,OAAO,CAIT;AAID;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,QAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"failure-bookkeeping.d.ts","sourceRoot":"","sources":["../../src/learning/failure-bookkeeping.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAsC1D,MAAM,WAAW,mBAAmB;IAClC;;;;;OAKG;IACH,sBAAsB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C;;;OAGG;IACH,+BAA+B,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7C;;;;;;;;;OASG;IACH,mBAAmB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C;;;;;OAKG;IACH,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACvC;AAED;gFACgF;AAChF,eAAO,MAAM,qCAAqC,IAAI,CAAC;AAEvD,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,mBAAmB,EAC5B,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,GAAG,GAAE,MAAmB,GACvB,OAAO,CAIT;AAID;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,QAAgB,CAAC;AAErD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,mCAAmC,QAAgB,CAAC;AAajE,eAAO,MAAM,uBAAuB,QAAY,CAAC;AAEjD,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC,eAAO,MAAM,yBAAyB,QAAY,CAAC;AAEnD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,mBAAmB,EAC5B,YAAY,EAAE,MAAM,EACpB,GAAG,GAAE,MAAmB,GACvB,OAAO,CAMT;AAED,0EAA0E;AAC1E,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,mBAAmB,EAC5B,YAAY,EAAE,MAAM,EACpB,GAAG,GAAE,MAAmB,GACvB,OAAO,CAIT;AAED;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,QAAY,CAAC;AAIxD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,mBAAmB,EAC5B,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,OAAO,EACZ,aAAa,EAAE,aAAa,EAC5B,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7D,IAAI,CA0MN"}
|
|
@@ -65,6 +65,22 @@ export function isModelSessionExcluded(session, providerType, model, now = Date.
|
|
|
65
65
|
* session-level exclusion and the breaker's scoring cooldown expire together.
|
|
66
66
|
*/
|
|
67
67
|
export const RATE_LIMIT_EXCLUSION_MS = 2 * 60 * 1000;
|
|
68
|
+
/**
|
|
69
|
+
* How long a provider × model pair is excluded after it resolved with NOTHING
|
|
70
|
+
* usable — an HTTP 200 carrying neither answer text nor a tool call (see
|
|
71
|
+
* `response-usability.ts`).
|
|
72
|
+
*
|
|
73
|
+
* MODEL-scoped on purpose, and never escalated to the provider: the transport
|
|
74
|
+
* worked and the provider answered, so its OTHER models are very often
|
|
75
|
+
* perfectly healthy — the live case was one local model returning nothing on
|
|
76
|
+
* five consecutive steps while Gemini sat configured and unused. Two minutes is
|
|
77
|
+
* long enough to cover a turn plus its retries, short enough that a genuinely
|
|
78
|
+
* transient empty self-heals with no user action.
|
|
79
|
+
*
|
|
80
|
+
* The failover walk (`resilient-call.ts`) uses this same constant for its own
|
|
81
|
+
* pair exclusion, so the session and cross-pipeline windows cannot drift.
|
|
82
|
+
*/
|
|
83
|
+
export const EMPTY_RESPONSE_SESSION_EXCLUSION_MS = 2 * 60 * 1000;
|
|
68
84
|
// ─── T4 — RPM/TPM rapid-failure breaker ─────────────────────────────────────
|
|
69
85
|
//
|
|
70
86
|
// Free tiers meter requests/tokens PER MINUTE, but a 429 with no reset hint
|
|
@@ -265,6 +281,25 @@ export function recordActionFailure(session, providerType, err, configManager, o
|
|
|
265
281
|
// other keys of the same provider stay usable).
|
|
266
282
|
parkAccountForKey(providerType, options?.apiKey, now + parkMs, failureKind);
|
|
267
283
|
}
|
|
284
|
+
else if (failureKind === 'empty-response') {
|
|
285
|
+
// ── An empty completion is a MODEL failure, not a provider outage ──────
|
|
286
|
+
// The provider answered (HTTP 200, a real response body) and simply carried
|
|
287
|
+
// no text and no tool call. So the pair is what must rest — exclude it and
|
|
288
|
+
// leave its SIBLINGS routable, or one dead model would take a healthy
|
|
289
|
+
// provider's whole model list out of the running. No quota park: nothing was
|
|
290
|
+
// rate-limited, and the registry already parks this exact pair for
|
|
291
|
+
// `EMPTY_RESPONSE_PARK_MS` (see `model-registry.recordCall`).
|
|
292
|
+
const failingModel = options?.model;
|
|
293
|
+
if (session.sessionFailedModels && failingModel && failingModel !== 'default') {
|
|
294
|
+
session.sessionFailedModels.set(modelExclusionKey(providerType, failingModel), now + EMPTY_RESPONSE_SESSION_EXCLUSION_MS);
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
// No model attribution available — the provider is the only thing we can
|
|
298
|
+
// hold back, so fall back to the transient provider exclusion.
|
|
299
|
+
session.sessionFailedProviders.set(providerType, now + TRANSIENT_FAILURE_EXCLUSION_MS);
|
|
300
|
+
session.sessionTransientFailedProviders.add(providerType);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
268
303
|
else {
|
|
269
304
|
// Server / network / timeout / unknown — transient but definitive enough
|
|
270
305
|
// that the next message shouldn't re-pick this provider. Short cooldown,
|
|
@@ -290,11 +325,22 @@ export function recordActionFailure(session, providerType, err, configManager, o
|
|
|
290
325
|
// ── 6. Shared circuit breaker ─────────────────────────────────────────
|
|
291
326
|
// Repeated failures open the breaker so the auto router deprioritizes the
|
|
292
327
|
// provider by scoring even for transient errors.
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
328
|
+
//
|
|
329
|
+
// EXCEPT for an empty-response: the breaker is PROVIDER-scoped, and an empty
|
|
330
|
+
// completion is a MODEL property — the provider answered, on time, with a
|
|
331
|
+
// well-formed HTTP 200. Tripping its breaker would deprioritize every healthy
|
|
332
|
+
// sibling on that provider because one model returned nothing, which is the
|
|
333
|
+
// same corruption the harness-fault guard at the top of this function exists
|
|
334
|
+
// to prevent. The pair is already parked in the registry (see
|
|
335
|
+
// `model-registry.recordCall`), so the model rests without the provider paying
|
|
336
|
+
// for it.
|
|
337
|
+
if (failureKind !== 'empty-response') {
|
|
338
|
+
try {
|
|
339
|
+
getProviderFallback(configManager).recordFailure(providerType);
|
|
340
|
+
}
|
|
341
|
+
catch {
|
|
342
|
+
// Best-effort — circuit-breaker bookkeeping must not crash a call.
|
|
343
|
+
}
|
|
298
344
|
}
|
|
299
345
|
}
|
|
300
346
|
//# sourceMappingURL=failure-bookkeeping.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"failure-bookkeeping.js","sourceRoot":"","sources":["../../src/learning/failure-bookkeeping.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"failure-bookkeeping.js","sourceRoot":"","sources":["../../src/learning/failure-bookkeeping.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gate friction — how much the harness speaks to the model in a turn, summarized
|
|
3
|
+
* from reasoning traces so the dashboard can show the number.
|
|
4
|
+
*
|
|
5
|
+
* Counts every `gate` event (a bounded nudge: plan / verification / deliverable /
|
|
6
|
+
* permission / repeat / action / promise / self-review / diagnosis /
|
|
7
|
+
* malformed-call / prerequisite) and every `refusal` event (a tool declined a
|
|
8
|
+
* call). The per-turn distribution is the number Bundle 37b ("deliver gate text
|
|
9
|
+
* as an acted-on instruction") exists to reduce. This module is the READ side of
|
|
10
|
+
* `scripts/measure-gate-friction.mjs`, so the dashboard and the CLI report the
|
|
11
|
+
* same figure from the same rule.
|
|
12
|
+
*
|
|
13
|
+
* It also counts narration (Bundle 39): a turn whose final answer reuses the
|
|
14
|
+
* harness's own distinctive vocabulary — see `harness-narration.ts`.
|
|
15
|
+
*/
|
|
16
|
+
export interface GateFrictionSummary {
|
|
17
|
+
traces: number;
|
|
18
|
+
/** Total gate + refusal events across all traces. */
|
|
19
|
+
events: number;
|
|
20
|
+
perTurn: {
|
|
21
|
+
mean: number;
|
|
22
|
+
median: number;
|
|
23
|
+
p90: number;
|
|
24
|
+
max: number;
|
|
25
|
+
turnsWithAny: number;
|
|
26
|
+
};
|
|
27
|
+
/** Per-gate counts, highest first. */
|
|
28
|
+
byGate: Array<{
|
|
29
|
+
key: string;
|
|
30
|
+
count: number;
|
|
31
|
+
}>;
|
|
32
|
+
/** Turns whose answer narrated the harness (Bundle 39). */
|
|
33
|
+
narration: {
|
|
34
|
+
turns: number;
|
|
35
|
+
echoedMarker: number;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export declare function summarizeGateFriction(raw: unknown): GateFrictionSummary;
|
|
39
|
+
//# sourceMappingURL=gate-friction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-friction.d.ts","sourceRoot":"","sources":["../../src/learning/gate-friction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,sCAAsC;IACtC,MAAM,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,2DAA2D;IAC3D,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;CACpD;AAyBD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,mBAAmB,CAqDvE"}
|