agent-nuvira 3.3.13 → 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/orchestrator.d.ts +31 -0
- package/dist/agents/orchestrator.d.ts.map +1 -1
- package/dist/agents/orchestrator.js +74 -126
- 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 +765 -33
- package/dist/cli/chat.js.map +1 -1
- package/dist/cli/cli-program.d.ts.map +1 -1
- package/dist/cli/cli-program.js +12 -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 +86 -0
- 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/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 +9 -1
- package/dist/cli/knowledge.d.ts.map +1 -1
- package/dist/cli/knowledge.js +93 -2
- package/dist/cli/knowledge.js.map +1 -1
- package/dist/cli/loop-executor.d.ts.map +1 -1
- package/dist/cli/loop-executor.js +47 -12
- 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/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/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 +33 -0
- package/dist/gateway/hook-contract.d.ts.map +1 -1
- package/dist/gateway/hook-contract.js +97 -0
- package/dist/gateway/hook-contract.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 +37 -0
- package/dist/inference/interface.d.ts.map +1 -1
- 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/route-resolver.d.ts +30 -0
- package/dist/inference/route-resolver.d.ts.map +1 -1
- package/dist/inference/route-resolver.js +158 -1
- package/dist/inference/route-resolver.js.map +1 -1
- package/dist/inference/tools.d.ts +16 -1
- package/dist/inference/tools.d.ts.map +1 -1
- package/dist/inference/tools.js +51 -18
- 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 +68 -24
- package/dist/learning/auto-router.d.ts.map +1 -1
- package/dist/learning/auto-router.js +301 -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 +22 -1
- package/dist/learning/error-repair.d.ts.map +1 -1
- package/dist/learning/error-repair.js +37 -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 +229 -3
- package/dist/learning/knowledge-base.d.ts.map +1 -1
- package/dist/learning/knowledge-base.js +593 -24
- package/dist/learning/knowledge-base.js.map +1 -1
- 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.map +1 -1
- package/dist/learning/model-selection.js +41 -0
- 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/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/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/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/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 +20 -2
- package/dist/tools/plan-store.d.ts.map +1 -1
- package/dist/tools/plan-store.js +51 -7
- 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 +486 -26
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/remediation-ladder.d.ts.map +1 -1
- package/dist/tools/remediation-ladder.js +8 -0
- package/dist/tools/remediation-ladder.js.map +1 -1
- 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 +265 -10
- package/dist/tools/run-terminal.js.map +1 -1
- package/dist/tools/tool-loop.d.ts +321 -13
- package/dist/tools/tool-loop.d.ts.map +1 -1
- package/dist/tools/tool-loop.js +867 -66
- package/dist/tools/tool-loop.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 +11 -0
- package/dist/web-dashboard/server.d.ts.map +1 -1
- package/dist/web-dashboard/server.js +362 -11
- package/dist/web-dashboard/server.js.map +1 -1
- package/dist/web-dashboard/src/types.d.ts +170 -1
- package/dist/web-dashboard/src/types.d.ts.map +1 -1
- package/dist/web-dashboard/workspace-guard.d.ts +11 -2
- package/dist/web-dashboard/workspace-guard.d.ts.map +1 -1
- package/dist/web-dashboard/workspace-guard.js +24 -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-zjbdJnO-.js +210 -0
- package/src/web-dashboard/public/assets/index-zjbdJnO-.js.map +1 -0
- package/src/web-dashboard/public/index.html +1 -1
- package/src/web-dashboard/public/assets/index-DhiuR4S2.js +0 -210
- package/src/web-dashboard/public/assets/index-DhiuR4S2.js.map +0 -1
|
@@ -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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
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
|
+
import { detectHarnessNarration } from './harness-narration.js';
|
|
17
|
+
function normalize(raw) {
|
|
18
|
+
const list = Array.isArray(raw)
|
|
19
|
+
? raw
|
|
20
|
+
: raw && typeof raw === 'object' && Array.isArray(raw.traces)
|
|
21
|
+
? raw.traces
|
|
22
|
+
: [];
|
|
23
|
+
return list.filter((t) => Boolean(t) && typeof t === 'object');
|
|
24
|
+
}
|
|
25
|
+
function finalText(trace) {
|
|
26
|
+
const steps = trace.steps ?? [];
|
|
27
|
+
for (let i = steps.length - 1; i >= 0; i--) {
|
|
28
|
+
const t = steps[i]?.responsePreview;
|
|
29
|
+
if (t && String(t).trim())
|
|
30
|
+
return String(t);
|
|
31
|
+
}
|
|
32
|
+
return '';
|
|
33
|
+
}
|
|
34
|
+
export function summarizeGateFriction(raw) {
|
|
35
|
+
const traces = normalize(raw);
|
|
36
|
+
const byKey = new Map();
|
|
37
|
+
const perTurn = [];
|
|
38
|
+
let narrated = 0;
|
|
39
|
+
let echoed = 0;
|
|
40
|
+
for (const trace of traces) {
|
|
41
|
+
let total = 0;
|
|
42
|
+
const harnessTexts = [];
|
|
43
|
+
for (const e of trace.events ?? []) {
|
|
44
|
+
if (!e)
|
|
45
|
+
continue;
|
|
46
|
+
if (e.kind === 'gate') {
|
|
47
|
+
const key = `gate:${e.gate || 'unknown'}`;
|
|
48
|
+
byKey.set(key, (byKey.get(key) ?? 0) + 1);
|
|
49
|
+
total += 1;
|
|
50
|
+
if (e.summary)
|
|
51
|
+
harnessTexts.push(e.summary);
|
|
52
|
+
}
|
|
53
|
+
else if (e.kind === 'refusal') {
|
|
54
|
+
const key = `refusal:${e.gate || e.tool || 'unknown'}`;
|
|
55
|
+
byKey.set(key, (byKey.get(key) ?? 0) + 1);
|
|
56
|
+
total += 1;
|
|
57
|
+
if (e.summary)
|
|
58
|
+
harnessTexts.push(e.summary);
|
|
59
|
+
if (e.result)
|
|
60
|
+
harnessTexts.push(e.result);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
perTurn.push(total);
|
|
64
|
+
if (harnessTexts.length > 0) {
|
|
65
|
+
const text = finalText(trace);
|
|
66
|
+
if (text.includes('[harness]'))
|
|
67
|
+
echoed += 1;
|
|
68
|
+
if (detectHarnessNarration(text, harnessTexts).narrated)
|
|
69
|
+
narrated += 1;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const sorted = [...perTurn].sort((a, b) => a - b);
|
|
73
|
+
const sum = sorted.reduce((n, v) => n + v, 0);
|
|
74
|
+
const at = (p) => (sorted.length ? sorted[Math.min(sorted.length - 1, Math.floor(p * sorted.length))] : 0);
|
|
75
|
+
return {
|
|
76
|
+
traces: traces.length,
|
|
77
|
+
events: sum,
|
|
78
|
+
perTurn: {
|
|
79
|
+
mean: sorted.length ? Math.round((sum / sorted.length) * 100) / 100 : 0,
|
|
80
|
+
median: at(0.5),
|
|
81
|
+
p90: at(0.9),
|
|
82
|
+
max: sorted.length ? sorted[sorted.length - 1] : 0,
|
|
83
|
+
turnsWithAny: perTurn.filter((n) => n > 0).length,
|
|
84
|
+
},
|
|
85
|
+
byGate: [...byKey.entries()]
|
|
86
|
+
.map(([key, count]) => ({ key, count }))
|
|
87
|
+
.sort((a, b) => b.count - a.count),
|
|
88
|
+
narration: { turns: narrated, echoedMarker: echoed },
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=gate-friction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-friction.js","sourceRoot":"","sources":["../../src/learning/gate-friction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Harness-narration detection — did the model NARRATE the harness back at the
|
|
3
|
+
* user instead of acting on it?
|
|
4
|
+
*
|
|
5
|
+
* WHY THIS EXISTS. Bundle 37b made every gate nudge a marked `[harness]`
|
|
6
|
+
* `system` directive so the model would act on it rather than answer it. That
|
|
7
|
+
* change is only worth having if it is VERIFIABLE on live traces: some turns
|
|
8
|
+
* would still produce prose ABOUT the harness (`"the command guard misfired on a
|
|
9
|
+
* read-only check, so verification was…"`) instead of quietly continuing.
|
|
10
|
+
*
|
|
11
|
+
* HOW IT DETECTS, WITHOUT A PHRASE LIST. It does not look for words like
|
|
12
|
+
* "guard" or "misfire" — that would be a hand-written list of user phrasings,
|
|
13
|
+
* which this codebase forbids. Instead it takes the harness's OWN text (the
|
|
14
|
+
* refusals and gate summaries the trace recorded for that turn) and asks whether
|
|
15
|
+
* the model's answer reuses a DISTINCTIVE token from it: a hyphenated compound
|
|
16
|
+
* (`state-changing`, `read-only`) or a long word (≥10 chars). Those are the
|
|
17
|
+
* tokens that carry the harness's specific vocabulary; a shared one means the
|
|
18
|
+
* model is quoting the loop's language rather than talking about the task.
|
|
19
|
+
*
|
|
20
|
+
* The vocabulary is DERIVED at runtime from the harness's own strings, so it
|
|
21
|
+
* tracks whatever the harness actually says — it can never drift from a list.
|
|
22
|
+
*
|
|
23
|
+
* It is a REPORTER, not a gate: it never changes what the turn does. It exists so
|
|
24
|
+
* "the model stopped narrating the harness" is a measurement (see
|
|
25
|
+
* `scripts/detect-harness-narration.mjs`).
|
|
26
|
+
*/
|
|
27
|
+
export interface NarrationVerdict {
|
|
28
|
+
narrated: boolean;
|
|
29
|
+
/** The distinctive tokens the answer shares with the harness text. */
|
|
30
|
+
matches: string[];
|
|
31
|
+
}
|
|
32
|
+
/** The pure check. `harnessTexts` are the harness's own strings for this turn. */
|
|
33
|
+
export declare function detectHarnessNarration(finalText: string, harnessTexts: Array<string | undefined | null>): NarrationVerdict;
|
|
34
|
+
//# sourceMappingURL=harness-narration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness-narration.d.ts","sourceRoot":"","sources":["../../src/learning/harness-narration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,sEAAsE;IACtE,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAiBD,kFAAkF;AAClF,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,GAC7C,gBAAgB,CASlB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Harness-narration detection — did the model NARRATE the harness back at the
|
|
3
|
+
* user instead of acting on it?
|
|
4
|
+
*
|
|
5
|
+
* WHY THIS EXISTS. Bundle 37b made every gate nudge a marked `[harness]`
|
|
6
|
+
* `system` directive so the model would act on it rather than answer it. That
|
|
7
|
+
* change is only worth having if it is VERIFIABLE on live traces: some turns
|
|
8
|
+
* would still produce prose ABOUT the harness (`"the command guard misfired on a
|
|
9
|
+
* read-only check, so verification was…"`) instead of quietly continuing.
|
|
10
|
+
*
|
|
11
|
+
* HOW IT DETECTS, WITHOUT A PHRASE LIST. It does not look for words like
|
|
12
|
+
* "guard" or "misfire" — that would be a hand-written list of user phrasings,
|
|
13
|
+
* which this codebase forbids. Instead it takes the harness's OWN text (the
|
|
14
|
+
* refusals and gate summaries the trace recorded for that turn) and asks whether
|
|
15
|
+
* the model's answer reuses a DISTINCTIVE token from it: a hyphenated compound
|
|
16
|
+
* (`state-changing`, `read-only`) or a long word (≥10 chars). Those are the
|
|
17
|
+
* tokens that carry the harness's specific vocabulary; a shared one means the
|
|
18
|
+
* model is quoting the loop's language rather than talking about the task.
|
|
19
|
+
*
|
|
20
|
+
* The vocabulary is DERIVED at runtime from the harness's own strings, so it
|
|
21
|
+
* tracks whatever the harness actually says — it can never drift from a list.
|
|
22
|
+
*
|
|
23
|
+
* It is a REPORTER, not a gate: it never changes what the turn does. It exists so
|
|
24
|
+
* "the model stopped narrating the harness" is a measurement (see
|
|
25
|
+
* `scripts/detect-harness-narration.mjs`).
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* Tokens specific enough to signal the harness's vocabulary: hyphenated
|
|
29
|
+
* compounds, or long words. Deliberately NOT common prose (which is why a short
|
|
30
|
+
* word can never match).
|
|
31
|
+
*/
|
|
32
|
+
function distinctiveTokens(text) {
|
|
33
|
+
const out = new Set();
|
|
34
|
+
for (const raw of String(text ?? '').toLowerCase().split(/[^a-z0-9-]+/)) {
|
|
35
|
+
const t = raw.replace(/^-+|-+$/g, '');
|
|
36
|
+
if (!t)
|
|
37
|
+
continue;
|
|
38
|
+
if (t.length >= 10 || (t.includes('-') && t.length >= 6))
|
|
39
|
+
out.add(t);
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
/** The pure check. `harnessTexts` are the harness's own strings for this turn. */
|
|
44
|
+
export function detectHarnessNarration(finalText, harnessTexts) {
|
|
45
|
+
const said = distinctiveTokens(finalText);
|
|
46
|
+
if (said.size === 0)
|
|
47
|
+
return { narrated: false, matches: [] };
|
|
48
|
+
const matches = new Set();
|
|
49
|
+
for (const h of harnessTexts) {
|
|
50
|
+
if (!h)
|
|
51
|
+
continue;
|
|
52
|
+
for (const t of distinctiveTokens(h))
|
|
53
|
+
if (said.has(t))
|
|
54
|
+
matches.add(t);
|
|
55
|
+
}
|
|
56
|
+
return { narrated: matches.size > 0, matches: [...matches].sort() };
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=harness-narration.js.map
|