@qduc/term2 0.18.0 → 0.19.0
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/dist/app.d.ts.map +1 -1
- package/dist/app.js +3 -2
- package/dist/app.js.map +1 -1
- package/dist/commands/retry-failed-turn-command.d.ts +6 -0
- package/dist/commands/retry-failed-turn-command.d.ts.map +1 -0
- package/dist/commands/retry-failed-turn-command.js +12 -0
- package/dist/commands/retry-failed-turn-command.js.map +1 -0
- package/dist/components/layout/BackgroundTaskManager.d.ts.map +1 -1
- package/dist/components/layout/BackgroundTaskManager.js +4 -0
- package/dist/components/layout/BackgroundTaskManager.js.map +1 -1
- package/dist/components/layout/BackgroundTasksPanel.d.ts.map +1 -1
- package/dist/components/layout/BackgroundTasksPanel.js +11 -1
- package/dist/components/layout/BackgroundTasksPanel.js.map +1 -1
- package/dist/components/layout/BottomArea.d.ts +6 -0
- package/dist/components/layout/BottomArea.d.ts.map +1 -1
- package/dist/components/layout/BottomArea.js +14 -5
- package/dist/components/layout/BottomArea.js.map +1 -1
- package/dist/components/layout/StatusBar.d.ts +6 -0
- package/dist/components/layout/StatusBar.d.ts.map +1 -1
- package/dist/components/layout/StatusBar.js +15 -4
- package/dist/components/layout/StatusBar.js.map +1 -1
- package/dist/components/message/CommandGroupSummary.js +4 -5
- package/dist/components/message/CommandGroupSummary.js.map +1 -1
- package/dist/components/message/MessageList.d.ts.map +1 -1
- package/dist/components/message/MessageList.js +15 -2
- package/dist/components/message/MessageList.js.map +1 -1
- package/dist/components/message/command-grouping.d.ts +1 -0
- package/dist/components/message/command-grouping.d.ts.map +1 -1
- package/dist/components/message/command-grouping.js +14 -7
- package/dist/components/message/command-grouping.js.map +1 -1
- package/dist/contracts/conversation.d.ts +2 -0
- package/dist/contracts/conversation.d.ts.map +1 -1
- package/dist/contracts/conversation.js.map +1 -1
- package/dist/contracts/run-termination.d.ts +7 -0
- package/dist/contracts/run-termination.d.ts.map +1 -0
- package/dist/contracts/run-termination.js +2 -0
- package/dist/contracts/run-termination.js.map +1 -0
- package/dist/contracts/streamed-model-turn.d.ts +4 -0
- package/dist/contracts/streamed-model-turn.d.ts.map +1 -1
- package/dist/hooks/conversation-ui-reducer.d.ts +7 -0
- package/dist/hooks/conversation-ui-reducer.d.ts.map +1 -1
- package/dist/hooks/conversation-ui-reducer.js +6 -0
- package/dist/hooks/conversation-ui-reducer.js.map +1 -1
- package/dist/hooks/use-app-commands.d.ts +2 -1
- package/dist/hooks/use-app-commands.d.ts.map +1 -1
- package/dist/hooks/use-app-commands.js +4 -1
- package/dist/hooks/use-app-commands.js.map +1 -1
- package/dist/hooks/use-conversation.d.ts +5 -0
- package/dist/hooks/use-conversation.d.ts.map +1 -1
- package/dist/hooks/use-conversation.js +29 -4
- package/dist/hooks/use-conversation.js.map +1 -1
- package/dist/hooks/use-model-selection.d.ts +2 -0
- package/dist/hooks/use-model-selection.d.ts.map +1 -1
- package/dist/hooks/use-model-selection.js +3 -3
- package/dist/hooks/use-model-selection.js.map +1 -1
- package/dist/lib/agent-client.d.ts.map +1 -1
- package/dist/lib/agent-client.js +49 -23
- package/dist/lib/agent-client.js.map +1 -1
- package/dist/providers/aborted-stream-recorder.d.ts +26 -1
- package/dist/providers/aborted-stream-recorder.d.ts.map +1 -1
- package/dist/providers/aborted-stream-recorder.js +133 -0
- package/dist/providers/aborted-stream-recorder.js.map +1 -1
- package/dist/providers/ai-sdk-streamed-model.d.ts +5 -0
- package/dist/providers/ai-sdk-streamed-model.d.ts.map +1 -1
- package/dist/providers/ai-sdk-streamed-model.js +90 -1
- package/dist/providers/ai-sdk-streamed-model.js.map +1 -1
- package/dist/providers/codex-compact.d.ts +5 -4
- package/dist/providers/codex-compact.d.ts.map +1 -1
- package/dist/providers/codex-compact.js +5 -4
- package/dist/providers/codex-compact.js.map +1 -1
- package/dist/providers/codex-responses-model.d.ts.map +1 -1
- package/dist/providers/codex-responses-model.js +103 -20
- package/dist/providers/codex-responses-model.js.map +1 -1
- package/dist/providers/codex.provider.d.ts +1 -0
- package/dist/providers/codex.provider.d.ts.map +1 -1
- package/dist/providers/codex.provider.js +59 -3
- package/dist/providers/codex.provider.js.map +1 -1
- package/dist/providers/fetch/logging-middleware.d.ts +1 -0
- package/dist/providers/fetch/logging-middleware.d.ts.map +1 -1
- package/dist/providers/fetch/logging-middleware.js +24 -1
- package/dist/providers/fetch/logging-middleware.js.map +1 -1
- package/dist/providers/openai-chat-completions-model.d.ts.map +1 -1
- package/dist/providers/openai-chat-completions-model.js +99 -2
- package/dist/providers/openai-chat-completions-model.js.map +1 -1
- package/dist/providers/openai-responses-model.d.ts.map +1 -1
- package/dist/providers/openai-responses-model.js +21 -13
- package/dist/providers/openai-responses-model.js.map +1 -1
- package/dist/providers/retrying-model.d.ts +5 -1
- package/dist/providers/retrying-model.d.ts.map +1 -1
- package/dist/providers/retrying-model.js +29 -6
- package/dist/providers/retrying-model.js.map +1 -1
- package/dist/providers/websocket-abort-race.d.ts +13 -0
- package/dist/providers/websocket-abort-race.d.ts.map +1 -0
- package/dist/providers/websocket-abort-race.js +34 -0
- package/dist/providers/websocket-abort-race.js.map +1 -0
- package/dist/services/agent-runtime/application-run-loop.d.ts +7 -2
- package/dist/services/agent-runtime/application-run-loop.d.ts.map +1 -1
- package/dist/services/agent-runtime/application-run-loop.js +48 -8
- package/dist/services/agent-runtime/application-run-loop.js.map +1 -1
- package/dist/services/agent-runtime/context-compaction/context-milestone-reminder.js +3 -3
- package/dist/services/agent-runtime/context-compaction/context-milestone-reminder.js.map +1 -1
- package/dist/services/agent-runtime/executor.d.ts.map +1 -1
- package/dist/services/agent-runtime/executor.js +2 -0
- package/dist/services/agent-runtime/executor.js.map +1 -1
- package/dist/services/agent-runtime/types.d.ts +2 -2
- package/dist/services/agent-runtime/types.d.ts.map +1 -1
- package/dist/services/agent-stream.d.ts +13 -0
- package/dist/services/agent-stream.d.ts.map +1 -1
- package/dist/services/agent-stream.js +56 -0
- package/dist/services/agent-stream.js.map +1 -1
- package/dist/services/background-task-activity.d.ts +7 -0
- package/dist/services/background-task-activity.d.ts.map +1 -1
- package/dist/services/background-task-activity.js +17 -0
- package/dist/services/background-task-activity.js.map +1 -1
- package/dist/services/conversation/conversation-events.d.ts +36 -3
- package/dist/services/conversation/conversation-events.d.ts.map +1 -1
- package/dist/services/conversation/conversation-events.js +30 -1
- package/dist/services/conversation/conversation-events.js.map +1 -1
- package/dist/services/conversation/conversation-orchestrator.d.ts +2 -0
- package/dist/services/conversation/conversation-orchestrator.d.ts.map +1 -1
- package/dist/services/conversation/conversation-orchestrator.js +31 -0
- package/dist/services/conversation/conversation-orchestrator.js.map +1 -1
- package/dist/services/conversation/conversation-orchestrator.types.d.ts +4 -0
- package/dist/services/conversation/conversation-orchestrator.types.d.ts.map +1 -1
- package/dist/services/conversation/conversation-result-builder.d.ts.map +1 -1
- package/dist/services/conversation/conversation-result-builder.js +9 -5
- package/dist/services/conversation/conversation-result-builder.js.map +1 -1
- package/dist/services/conversation/conversation-service.d.ts +2 -0
- package/dist/services/conversation/conversation-service.d.ts.map +1 -1
- package/dist/services/conversation/conversation-service.js +14 -2
- package/dist/services/conversation/conversation-service.js.map +1 -1
- package/dist/services/conversation/session-browser.d.ts +1 -0
- package/dist/services/conversation/session-browser.d.ts.map +1 -1
- package/dist/services/conversation/session-browser.js +32 -38
- package/dist/services/conversation/session-browser.js.map +1 -1
- package/dist/services/conversation-agent-client.d.ts +3 -0
- package/dist/services/conversation-agent-client.d.ts.map +1 -1
- package/dist/services/logging/provider-traffic.d.ts +6 -1
- package/dist/services/logging/provider-traffic.d.ts.map +1 -1
- package/dist/services/logging/provider-traffic.js +29 -4
- package/dist/services/logging/provider-traffic.js.map +1 -1
- package/dist/services/models/model-catalog-session.d.ts +1 -2
- package/dist/services/models/model-catalog-session.d.ts.map +1 -1
- package/dist/services/retry/committed-tool-continuation.d.ts +4 -0
- package/dist/services/retry/committed-tool-continuation.d.ts.map +1 -0
- package/dist/services/retry/committed-tool-continuation.js +12 -0
- package/dist/services/retry/committed-tool-continuation.js.map +1 -0
- package/dist/services/retry/in-loop-model-retry.d.ts.map +1 -1
- package/dist/services/retry/in-loop-model-retry.js +9 -0
- package/dist/services/retry/in-loop-model-retry.js.map +1 -1
- package/dist/services/retry/provider-failure-classification.d.ts +12 -0
- package/dist/services/retry/provider-failure-classification.d.ts.map +1 -0
- package/dist/services/retry/provider-failure-classification.js +55 -0
- package/dist/services/retry/provider-failure-classification.js.map +1 -0
- package/dist/services/retry/retry-classifier.d.ts.map +1 -1
- package/dist/services/retry/retry-classifier.js +68 -0
- package/dist/services/retry/retry-classifier.js.map +1 -1
- package/dist/services/retry/retry-contracts.d.ts +24 -3
- package/dist/services/retry/retry-contracts.d.ts.map +1 -1
- package/dist/services/retry/retry-event-presenter.d.ts.map +1 -1
- package/dist/services/retry/retry-event-presenter.js +14 -4
- package/dist/services/retry/retry-event-presenter.js.map +1 -1
- package/dist/services/retry/retry-recovery-budget.d.ts +51 -0
- package/dist/services/retry/retry-recovery-budget.d.ts.map +1 -0
- package/dist/services/retry/retry-recovery-budget.js +84 -0
- package/dist/services/retry/retry-recovery-budget.js.map +1 -0
- package/dist/services/service-interfaces.d.ts +67 -3
- package/dist/services/service-interfaces.d.ts.map +1 -1
- package/dist/services/session/background-check-in-scheduler.d.ts.map +1 -1
- package/dist/services/session/background-check-in-scheduler.js +35 -2
- package/dist/services/session/background-check-in-scheduler.js.map +1 -1
- package/dist/services/session/continuation-recovery-handler.d.ts +1 -0
- package/dist/services/session/continuation-recovery-handler.d.ts.map +1 -1
- package/dist/services/session/continuation-recovery-handler.js +42 -0
- package/dist/services/session/continuation-recovery-handler.js.map +1 -1
- package/dist/services/session/continuation-state.d.ts +4 -1
- package/dist/services/session/continuation-state.d.ts.map +1 -1
- package/dist/services/session/continuation-state.js +5 -1
- package/dist/services/session/continuation-state.js.map +1 -1
- package/dist/services/session/initial-turn-recovery-handler.d.ts +3 -0
- package/dist/services/session/initial-turn-recovery-handler.d.ts.map +1 -1
- package/dist/services/session/initial-turn-recovery-handler.js +70 -0
- package/dist/services/session/initial-turn-recovery-handler.js.map +1 -1
- package/dist/services/session/session-composition.d.ts.map +1 -1
- package/dist/services/session/session-composition.js +3 -0
- package/dist/services/session/session-composition.js.map +1 -1
- package/dist/services/session/session-tool-tracker.d.ts +6 -0
- package/dist/services/session/session-tool-tracker.d.ts.map +1 -1
- package/dist/services/session/session-tool-tracker.js +17 -0
- package/dist/services/session/session-tool-tracker.js.map +1 -1
- package/dist/services/session/terminal-result-collector.d.ts.map +1 -1
- package/dist/services/session/terminal-result-collector.js +3 -0
- package/dist/services/session/terminal-result-collector.js.map +1 -1
- package/dist/services/session/turn-attempt-factory.d.ts +2 -0
- package/dist/services/session/turn-attempt-factory.d.ts.map +1 -1
- package/dist/services/session/turn-attempt-factory.js +1 -0
- package/dist/services/session/turn-attempt-factory.js.map +1 -1
- package/dist/services/session/turn-attempt.d.ts +6 -0
- package/dist/services/session/turn-attempt.d.ts.map +1 -1
- package/dist/services/session/turn-attempt.js +16 -0
- package/dist/services/session/turn-attempt.js.map +1 -1
- package/dist/services/session/turn-workflow.d.ts +1 -1
- package/dist/services/session/turn-workflow.d.ts.map +1 -1
- package/dist/services/session/turn-workflow.js +83 -19
- package/dist/services/session/turn-workflow.js.map +1 -1
- package/dist/services/subagents/execution-runner.d.ts.map +1 -1
- package/dist/services/subagents/execution-runner.js +39 -4
- package/dist/services/subagents/execution-runner.js.map +1 -1
- package/dist/services/subagents/nested-runner.d.ts.map +1 -1
- package/dist/services/subagents/nested-runner.js +23 -7
- package/dist/services/subagents/nested-runner.js.map +1 -1
- package/dist/services/subagents/subagent-async-registry.d.ts.map +1 -1
- package/dist/services/subagents/subagent-async-registry.js +28 -2
- package/dist/services/subagents/subagent-async-registry.js.map +1 -1
- package/dist/services/subagents/subagent-notification-store.d.ts +2 -2
- package/dist/services/subagents/subagent-notification-store.d.ts.map +1 -1
- package/dist/services/subagents/subagent-notification-store.js +3 -2
- package/dist/services/subagents/subagent-notification-store.js.map +1 -1
- package/dist/services/subagents/types.d.ts +31 -8
- package/dist/services/subagents/types.d.ts.map +1 -1
- package/dist/services/subagents/types.js +11 -0
- package/dist/services/subagents/types.js.map +1 -1
- package/dist/services/subagents/utils.d.ts.map +1 -1
- package/dist/services/subagents/utils.js +3 -0
- package/dist/services/subagents/utils.js.map +1 -1
- package/dist/test-helpers/terminal-e2e.d.ts +2 -0
- package/dist/test-helpers/terminal-e2e.d.ts.map +1 -1
- package/dist/test-helpers/terminal-e2e.js +13 -6
- package/dist/test-helpers/terminal-e2e.js.map +1 -1
- package/dist/test-helpers/vitest-network-guard.d.ts +2 -0
- package/dist/test-helpers/vitest-network-guard.d.ts.map +1 -0
- package/dist/test-helpers/vitest-network-guard.js +24 -0
- package/dist/test-helpers/vitest-network-guard.js.map +1 -0
- package/dist/tools/agent/run-subagent-async.d.ts +1 -1
- package/dist/tools/agent/run-subagent-async.d.ts.map +1 -1
- package/dist/tools/agent/run-subagent-async.js +25 -4
- package/dist/tools/agent/run-subagent-async.js.map +1 -1
- package/dist/tools/session-rollover/session-rollover-tool.d.ts.map +1 -1
- package/dist/tools/session-rollover/session-rollover-tool.js +1 -0
- package/dist/tools/session-rollover/session-rollover-tool.js.map +1 -1
- package/dist/tools/types.d.ts +4 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js.map +1 -1
- package/dist/utils/ai/token-usage.d.ts +3 -0
- package/dist/utils/ai/token-usage.d.ts.map +1 -1
- package/dist/utils/ai/token-usage.js +29 -0
- package/dist/utils/ai/token-usage.js.map +1 -1
- package/dist/utils/conversation/conversation-event-handler.d.ts.map +1 -1
- package/dist/utils/conversation/conversation-event-handler.js +23 -1
- package/dist/utils/conversation/conversation-event-handler.js.map +1 -1
- package/dist/utils/streaming/streaming-session-factory.d.ts +4 -0
- package/dist/utils/streaming/streaming-session-factory.d.ts.map +1 -1
- package/dist/utils/streaming/streaming-session-factory.js +59 -9
- package/dist/utils/streaming/streaming-session-factory.js.map +1 -1
- package/dist/utils/streaming/streaming-speed-tracker.d.ts +99 -0
- package/dist/utils/streaming/streaming-speed-tracker.d.ts.map +1 -0
- package/dist/utils/streaming/streaming-speed-tracker.js +214 -0
- package/dist/utils/streaming/streaming-speed-tracker.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function isSettledCommittedToolContinuation(evidence) {
|
|
2
|
+
return (evidence !== undefined &&
|
|
3
|
+
evidence.completedToolCount > 0 &&
|
|
4
|
+
evidence.allToolsCompleted &&
|
|
5
|
+
evidence.completedPairsPresentInHistory);
|
|
6
|
+
}
|
|
7
|
+
export function skipsAutomaticReplayClaim(failure, evidence) {
|
|
8
|
+
return (failure.kind === 'chain_recovery' &&
|
|
9
|
+
failure.cause === 'connection_interrupted' &&
|
|
10
|
+
isSettledCommittedToolContinuation(evidence));
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=committed-tool-continuation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"committed-tool-continuation.js","sourceRoot":"","sources":["../../../source/services/retry/committed-tool-continuation.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,kCAAkC,CAAC,QAA+C;IAChG,OAAO,CACL,QAAQ,KAAK,SAAS;QACtB,QAAQ,CAAC,kBAAkB,GAAG,CAAC;QAC/B,QAAQ,CAAC,iBAAiB;QAC1B,QAAQ,CAAC,8BAA8B,CACxC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,OAA0B,EAC1B,QAA+C;IAE/C,OAAO,CACL,OAAO,CAAC,IAAI,KAAK,gBAAgB;QACjC,OAAO,CAAC,KAAK,KAAK,wBAAwB;QAC1C,kCAAkC,CAAC,QAAQ,CAAC,CAC7C,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"in-loop-model-retry.d.ts","sourceRoot":"","sources":["../../../source/services/retry/in-loop-model-retry.ts"],"names":[],"mappings":"AAwBA,MAAM,MAAM,mBAAmB,GAC3B;IACE,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,GACD;IACE,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEN,wFAAwF;AACxF,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C,CAAC;AAEF,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,MAAM,MAAoB,EAClC,eAAe,CAAC,EAAE,MAAM,GACvB,MAAM,CAOR;AAMD,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,MAAM,MAAoB,EAClC,OAAO,CAAC,EAAE,yBAAyB,GAClC,mBAAmB,
|
|
1
|
+
{"version":3,"file":"in-loop-model-retry.d.ts","sourceRoot":"","sources":["../../../source/services/retry/in-loop-model-retry.ts"],"names":[],"mappings":"AAwBA,MAAM,MAAM,mBAAmB,GAC3B;IACE,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,GACD;IACE,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEN,wFAAwF;AACxF,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C,CAAC;AAEF,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,MAAM,MAAoB,EAClC,eAAe,CAAC,EAAE,MAAM,GACvB,MAAM,CAOR;AAMD,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,MAAM,MAAoB,EAClC,OAAO,CAAC,EAAE,yBAAyB,GAClC,mBAAmB,CA6FrB;AAED,wBAAsB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BpF"}
|
|
@@ -82,6 +82,15 @@ export function classifyInLoopModelRetry(error, attempt, maxRetries, random = Ma
|
|
|
82
82
|
if (isRecoverableIncompleteStreamClose(error)) {
|
|
83
83
|
return recoverChain();
|
|
84
84
|
}
|
|
85
|
+
// Mid-turn tool-continuation failures (e.g. an OpenRouter stream that ends
|
|
86
|
+
// with finish_reason "error" and a 429/5xx-classified payload) previously
|
|
87
|
+
// fell through to `unrecoverable` here because only `upstreamDelay` was
|
|
88
|
+
// read off `upstream` above. Turn-boundary retry consults this same
|
|
89
|
+
// classifier via `isTransientRetryableError`; without this check, an error
|
|
90
|
+
// retryable at a turn boundary was silently unrecoverable mid-continuation.
|
|
91
|
+
if (upstream.retryable) {
|
|
92
|
+
return recoverChain();
|
|
93
|
+
}
|
|
85
94
|
const errorString = String(error?.message ?? error).toLowerCase();
|
|
86
95
|
const isConnectionDrop = errorString.includes('websocket') ||
|
|
87
96
|
errorString.includes('socket hang up') ||
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"in-loop-model-retry.js","sourceRoot":"","sources":["../../../source/services/retry/in-loop-model-retry.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"in-loop-model-retry.js","sourceRoot":"","sources":["../../../source/services/retry/in-loop-model-retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type ProviderFailureKind = 'network' | 'provider' | 'rate_limit' | 'authentication' | 'cancelled' | 'unknown';
|
|
2
|
+
export type ProviderFailureClassification = {
|
|
3
|
+
errorKind: ProviderFailureKind;
|
|
4
|
+
code?: string;
|
|
5
|
+
status?: number;
|
|
6
|
+
retryAfterMs?: number;
|
|
7
|
+
message: string;
|
|
8
|
+
retryable: boolean;
|
|
9
|
+
};
|
|
10
|
+
/** One sanitized, shared interpretation of an upstream failure. */
|
|
11
|
+
export declare function classifyProviderFailure(error: unknown): ProviderFailureClassification;
|
|
12
|
+
//# sourceMappingURL=provider-failure-classification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-failure-classification.d.ts","sourceRoot":"","sources":["../../../source/services/retry/provider-failure-classification.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,gBAAgB,GAAG,WAAW,GAAG,SAAS,CAAC;AAErH,MAAM,MAAM,6BAA6B,GAAG;IAC1C,SAAS,EAAE,mBAAmB,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,mEAAmE;AACnE,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,6BAA6B,CA8BrF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { OpenAICompatibleError, OpenRouterError } from '../../providers/common/provider-errors.js';
|
|
2
|
+
import { describeError, isAbortLikeError } from '../../utils/error-helpers.js';
|
|
3
|
+
import { isNetworkProtocolError, isTransientRetryableError } from './retry-error-classification.js';
|
|
4
|
+
import { classifyUpstreamRetryableError } from './upstream-retry-policy.js';
|
|
5
|
+
/** One sanitized, shared interpretation of an upstream failure. */
|
|
6
|
+
export function classifyProviderFailure(error) {
|
|
7
|
+
const upstream = classifyUpstreamRetryableError(error);
|
|
8
|
+
const statusRaw = error && typeof error === 'object' ? error.status ?? error.statusCode : undefined;
|
|
9
|
+
const status = typeof statusRaw === 'number' && Number.isInteger(statusRaw) ? statusRaw : undefined;
|
|
10
|
+
const codeRaw = findSafeField(error, 'code');
|
|
11
|
+
const code = typeof codeRaw === 'string' && /^[A-Za-z0-9_.-]{1,80}$/.test(codeRaw) ? codeRaw : undefined;
|
|
12
|
+
const transport = isNetworkProtocolError(error);
|
|
13
|
+
const retryable = transport || upstream.retryable || isTransientRetryableError(error);
|
|
14
|
+
const errorKind = isAbortLikeError(error)
|
|
15
|
+
? 'cancelled'
|
|
16
|
+
: status === 401 || status === 403
|
|
17
|
+
? 'authentication'
|
|
18
|
+
: status === 429 || upstream.status === 429
|
|
19
|
+
? 'rate_limit'
|
|
20
|
+
: transport
|
|
21
|
+
? 'network'
|
|
22
|
+
: retryable ||
|
|
23
|
+
(status !== undefined && status >= 400) ||
|
|
24
|
+
error instanceof OpenRouterError ||
|
|
25
|
+
error instanceof OpenAICompatibleError
|
|
26
|
+
? 'provider'
|
|
27
|
+
: 'unknown';
|
|
28
|
+
return {
|
|
29
|
+
errorKind,
|
|
30
|
+
...(code ? { code } : {}),
|
|
31
|
+
...(status ?? upstream.status ? { status: status ?? upstream.status } : {}),
|
|
32
|
+
...(upstream.retryAfterMs !== undefined ? { retryAfterMs: upstream.retryAfterMs } : {}),
|
|
33
|
+
message: describeError(error),
|
|
34
|
+
retryable: errorKind !== 'cancelled' && errorKind !== 'authentication' && retryable,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function findSafeField(error, field) {
|
|
38
|
+
const seen = new Set();
|
|
39
|
+
const visit = (value) => {
|
|
40
|
+
if (!value || typeof value !== 'object' || seen.has(value))
|
|
41
|
+
return undefined;
|
|
42
|
+
seen.add(value);
|
|
43
|
+
const record = value;
|
|
44
|
+
if (typeof record[field] === 'string')
|
|
45
|
+
return record[field];
|
|
46
|
+
for (const child of [record.cause, record.error, ...(Array.isArray(record.errors) ? record.errors : [])]) {
|
|
47
|
+
const found = visit(child);
|
|
48
|
+
if (found !== undefined)
|
|
49
|
+
return found;
|
|
50
|
+
}
|
|
51
|
+
return undefined;
|
|
52
|
+
};
|
|
53
|
+
return visit(error);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=provider-failure-classification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-failure-classification.js","sourceRoot":"","sources":["../../../source/services/retry/provider-failure-classification.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry-classifier.d.ts","sourceRoot":"","sources":["../../../source/services/retry/retry-classifier.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGrF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"retry-classifier.d.ts","sourceRoot":"","sources":["../../../source/services/retry/retry-classifier.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGrF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAiB/E,qBAAa,sBAAsB;IACrB,OAAO,CAAC,WAAW;IAA2B,OAAO,CAAC,MAAM;IAAxE,YAAoB,WAAW,EAAE,uBAAuB,EAAU,MAAM,GAAE,MAAM,MAAoB,EAEnG;IAED,QAAQ,CAAC,OAAO,EAAE,qBAAqB,GAAG,iBAAiB,CAqJ1D;CACF"}
|
|
@@ -4,6 +4,10 @@ import { classifyUpstreamRetryableError } from './upstream-retry-policy.js';
|
|
|
4
4
|
import { AmbiguousModelOutcomeError, ConversationStateNoProgressError } from './retry-errors.js';
|
|
5
5
|
import { extractHistoryLength } from '../stream-snapshot.js';
|
|
6
6
|
import { isMissingChainedToolOutputError, isOrphanedChainedToolOutputError } from '../../lib/chained-input-filter.js';
|
|
7
|
+
import { isRetryRecoveryBudgetExhaustedError } from './retry-recovery-budget.js';
|
|
8
|
+
import { streamHasCommittedOutput } from '../agent-stream.js';
|
|
9
|
+
import { UnsentWebSocketRequestError } from '../../providers/websocket-request-dispatch.js';
|
|
10
|
+
import { isSettledCommittedToolContinuation } from './committed-tool-continuation.js';
|
|
7
11
|
const TRANSIENT_BASE_DELAY_MS = 500;
|
|
8
12
|
const TRANSIENT_MAX_DELAY_MS = 30_000;
|
|
9
13
|
const MAX_TRANSPORT_DOWNGRADES = 1;
|
|
@@ -22,6 +26,68 @@ export class DefaultRetryClassifier {
|
|
|
22
26
|
}
|
|
23
27
|
classify(context) {
|
|
24
28
|
const { error, retryCounts, stream, maxTransientRetries, maxModelRetries } = context;
|
|
29
|
+
// The shared transport/session recovery envelope already gave up (90s
|
|
30
|
+
// deadline, 3 physical attempts, or 1 automatic replay). Retrying again at
|
|
31
|
+
// this layer would just re-enter RetryingModel, which claims against the
|
|
32
|
+
// same exhausted budget and throws this same error immediately -- an
|
|
33
|
+
// unproductive bounce between layers instead of a clean stop.
|
|
34
|
+
if (isRetryRecoveryBudgetExhaustedError(error)) {
|
|
35
|
+
return { kind: 'unrecoverable' };
|
|
36
|
+
}
|
|
37
|
+
// Once the application has emitted any model event, the request may have
|
|
38
|
+
// produced user-visible or externally meaningful work. Never replay that
|
|
39
|
+
// partial turn automatically; the recovery executor still settles its tool
|
|
40
|
+
// ledger truthfully before termination.
|
|
41
|
+
//
|
|
42
|
+
// streamHasCommittedOutput (not a bare length check) matters here: a run
|
|
43
|
+
// that fails before producing anything can still leave a run_budget
|
|
44
|
+
// evidence item or a context_compaction_* lifecycle item in
|
|
45
|
+
// stream.output/newItems -- pure bookkeeping pushed unconditionally by
|
|
46
|
+
// outputPush() in application-run-loop.ts, unrelated to whether any real
|
|
47
|
+
// model output or tool effect occurred. A bare `.length > 0` check
|
|
48
|
+
// treated that as "committed" and forced 'unrecoverable' on an otherwise
|
|
49
|
+
// safely recoverable failure.
|
|
50
|
+
//
|
|
51
|
+
// Exception: a recoverable connection drop after every live-turn tool is
|
|
52
|
+
// completed and already in reconciled history is not a replay. It severs
|
|
53
|
+
// the dead chain and continues from those pairs. Open or unknown calls,
|
|
54
|
+
// missing pairs, and committed text with no completed tools stay closed.
|
|
55
|
+
if (context.hasCommittedOutput || (stream && streamHasCommittedOutput(stream))) {
|
|
56
|
+
if (isSettledCommittedToolContinuation(context.committedToolContinuation)) {
|
|
57
|
+
const connectionInterrupted = error instanceof UnsentWebSocketRequestError ||
|
|
58
|
+
(error instanceof AmbiguousModelOutcomeError && isRecoverableIncompleteStreamClose(error)) ||
|
|
59
|
+
isRecoverableIncompleteStreamClose(error);
|
|
60
|
+
if (connectionInterrupted) {
|
|
61
|
+
const nextAttempt = retryCounts.transientRetryCount + 1;
|
|
62
|
+
if (nextAttempt > maxTransientRetries) {
|
|
63
|
+
return { kind: 'unrecoverable' };
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
kind: 'chain_recovery',
|
|
67
|
+
attempt: nextAttempt,
|
|
68
|
+
delayMs: computeTransientDelayMs(nextAttempt, this.random),
|
|
69
|
+
cause: 'connection_interrupted',
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return { kind: 'unrecoverable' };
|
|
74
|
+
}
|
|
75
|
+
// The provider has positive send-path evidence that no request frame left
|
|
76
|
+
// the socket. Rebuild from durable full history rather than treating this
|
|
77
|
+
// as an ordinary transient retry; subagent sessions disable fresh-start
|
|
78
|
+
// retries but can safely take this non-replaying recovery path.
|
|
79
|
+
if (error instanceof UnsentWebSocketRequestError) {
|
|
80
|
+
const nextAttempt = retryCounts.transientRetryCount + 1;
|
|
81
|
+
if (nextAttempt > maxTransientRetries) {
|
|
82
|
+
return { kind: 'unrecoverable' };
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
kind: 'chain_recovery',
|
|
86
|
+
attempt: nextAttempt,
|
|
87
|
+
delayMs: computeTransientDelayMs(nextAttempt, this.random),
|
|
88
|
+
cause: 'connection_interrupted',
|
|
89
|
+
};
|
|
90
|
+
}
|
|
25
91
|
const hallucinationDecision = decideRetry(error, retryCounts.modelRetryCount, Boolean(stream), extractHistoryLength(stream), maxModelRetries);
|
|
26
92
|
if (hallucinationDecision.kind === 'retry') {
|
|
27
93
|
return {
|
|
@@ -47,6 +113,7 @@ export class DefaultRetryClassifier {
|
|
|
47
113
|
kind: 'chain_recovery',
|
|
48
114
|
attempt: nextAttempt,
|
|
49
115
|
delayMs: computeTransientDelayMs(nextAttempt, this.random),
|
|
116
|
+
cause: 'provider_state_rejected',
|
|
50
117
|
};
|
|
51
118
|
}
|
|
52
119
|
// A stream cut before its terminal event is wrapped as ambiguous because it
|
|
@@ -64,6 +131,7 @@ export class DefaultRetryClassifier {
|
|
|
64
131
|
kind: 'chain_recovery',
|
|
65
132
|
attempt: nextAttempt,
|
|
66
133
|
delayMs: computeTransientDelayMs(nextAttempt, this.random),
|
|
134
|
+
cause: 'connection_interrupted',
|
|
67
135
|
};
|
|
68
136
|
}
|
|
69
137
|
return { kind: 'unrecoverable' };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry-classifier.js","sourceRoot":"","sources":["../../../source/services/retry/retry-classifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EACL,8BAA8B,EAC9B,+BAA+B,EAC/B,kCAAkC,EAClC,yBAAyB,EACzB,yBAAyB,EACzB,sCAAsC,GACvC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAE5E,OAAO,EAAE,0BAA0B,EAAE,gCAAgC,EAAE,MAAM,mBAAmB,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAAE,+BAA+B,EAAE,gCAAgC,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"retry-classifier.js","sourceRoot":"","sources":["../../../source/services/retry/retry-classifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,14 +8,22 @@ export type ClassifiedFailure = {
|
|
|
8
8
|
delayMs: number;
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* Rebuild from full history, charged against the normal bounded
|
|
12
|
+
* transient-retry budget. `cause` distinguishes two different underlying
|
|
13
|
+
* events that share this recovery mechanism but must not share a
|
|
14
|
+
* presentation:
|
|
15
|
+
* - 'provider_state_rejected': the provider actively rejected conversation
|
|
16
|
+
* continuity (e.g. `previous_response_not_found`, a missing/orphaned
|
|
17
|
+
* chained tool result).
|
|
18
|
+
* - 'connection_interrupted': the connection dropped before a terminal
|
|
19
|
+
* response event (e.g. WebSocket close code 1006); the provider made no
|
|
20
|
+
* rejection claim at all.
|
|
14
21
|
*/
|
|
15
22
|
| {
|
|
16
23
|
kind: 'chain_recovery';
|
|
17
24
|
attempt: number;
|
|
18
25
|
delayMs: number;
|
|
26
|
+
cause: 'provider_state_rejected' | 'connection_interrupted';
|
|
19
27
|
} | {
|
|
20
28
|
kind: 'service_tier_fallback';
|
|
21
29
|
} | {
|
|
@@ -52,10 +60,23 @@ export type RetryCounts = {
|
|
|
52
60
|
modelRetryCount: number;
|
|
53
61
|
transportDowngradeCount: number;
|
|
54
62
|
};
|
|
63
|
+
export type CommittedToolContinuation = {
|
|
64
|
+
completedToolCount: number;
|
|
65
|
+
allToolsCompleted: boolean;
|
|
66
|
+
completedPairsPresentInHistory: boolean;
|
|
67
|
+
};
|
|
55
68
|
export type ClassificationContext = {
|
|
56
69
|
error: unknown;
|
|
57
70
|
retryCounts: RetryCounts;
|
|
58
71
|
stream: AgentStream | null;
|
|
72
|
+
/** True once a model event has crossed the session stream boundary. */
|
|
73
|
+
hasCommittedOutput?: boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Live-turn tool settlement observed by the session ledger. Required to
|
|
76
|
+
* admit chain recovery after committed output: completed pairs already in
|
|
77
|
+
* history can continue, but open or unknown calls cannot.
|
|
78
|
+
*/
|
|
79
|
+
committedToolContinuation?: CommittedToolContinuation;
|
|
59
80
|
maxTransientRetries: number;
|
|
60
81
|
maxModelRetries?: number;
|
|
61
82
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry-contracts.d.ts","sourceRoot":"","sources":["../../../source/services/retry/retry-contracts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AAI1F,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACzD
|
|
1
|
+
{"version":3,"file":"retry-contracts.d.ts","sourceRoot":"","sources":["../../../source/services/retry/retry-contracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry-event-presenter.d.ts","sourceRoot":"","sources":["../../../source/services/retry/retry-event-presenter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"retry-event-presenter.d.ts","sourceRoot":"","sources":["../../../source/services/retry/retry-event-presenter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAIhF,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,SAAS,GAAG,cAAc,CAAC;IACnC,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,iBAAiB,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC,CAAC;AAEF,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,KAAK,EAAE,wBAAwB,GAAG,iBAAiB,CA+I1D;CACF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { describeError } from '../../utils/error-helpers.js';
|
|
2
|
+
import { classifyProviderFailure } from './provider-failure-classification.js';
|
|
2
3
|
export class RetryEventPresenter {
|
|
3
4
|
present(input) {
|
|
4
5
|
const { failure, maxTransientRetries, maxModelRetries, source, error } = input;
|
|
@@ -26,6 +27,7 @@ export class RetryEventPresenter {
|
|
|
26
27
|
return { event, logMessage, logFields };
|
|
27
28
|
}
|
|
28
29
|
case 'transient': {
|
|
30
|
+
const providerFailure = classifyProviderFailure(error);
|
|
29
31
|
const toolName = source === 'continuation' ? 'continuation' : 'turn';
|
|
30
32
|
const event = {
|
|
31
33
|
type: 'retry',
|
|
@@ -34,6 +36,9 @@ export class RetryEventPresenter {
|
|
|
34
36
|
maxRetries: maxTransientRetries,
|
|
35
37
|
errorMessage,
|
|
36
38
|
retryType: 'upstream',
|
|
39
|
+
errorKind: providerFailure.errorKind,
|
|
40
|
+
delayMs: failure.delayMs,
|
|
41
|
+
...(providerFailure.retryAfterMs !== undefined ? { retryAfterMs: providerFailure.retryAfterMs } : {}),
|
|
37
42
|
};
|
|
38
43
|
const logMessage = source === 'continuation'
|
|
39
44
|
? 'Transient error in continuation, retrying'
|
|
@@ -44,23 +49,28 @@ export class RetryEventPresenter {
|
|
|
44
49
|
retryAttempt: failure.attempt,
|
|
45
50
|
maxRetries: maxTransientRetries,
|
|
46
51
|
errorMessage,
|
|
52
|
+
errorKind: providerFailure.errorKind,
|
|
47
53
|
delayMs: failure.delayMs,
|
|
48
54
|
};
|
|
49
55
|
return { event, logMessage, logFields };
|
|
50
56
|
}
|
|
51
57
|
case 'chain_recovery': {
|
|
58
|
+
const isConnectionInterrupted = failure.cause === 'connection_interrupted';
|
|
59
|
+
const retryType = isConnectionInterrupted ? 'connection_interrupted' : 'conversation_state';
|
|
52
60
|
const event = {
|
|
53
61
|
type: 'retry',
|
|
54
62
|
toolName: 'conversation',
|
|
55
63
|
attempt: failure.attempt,
|
|
56
64
|
maxRetries: maxTransientRetries,
|
|
57
65
|
errorMessage,
|
|
58
|
-
retryType
|
|
66
|
+
retryType,
|
|
59
67
|
};
|
|
60
|
-
const logMessage =
|
|
68
|
+
const logMessage = isConnectionInterrupted
|
|
69
|
+
? 'Connection interrupted before a terminal response event, rebuilding full history'
|
|
70
|
+
: 'Provider rejected conversation continuity, rebuilding full history';
|
|
61
71
|
const logFields = {
|
|
62
|
-
eventType: 'retry.conversation_state',
|
|
63
|
-
retryType
|
|
72
|
+
eventType: isConnectionInterrupted ? 'retry.connection_interrupted' : 'retry.conversation_state',
|
|
73
|
+
retryType,
|
|
64
74
|
retryAttempt: failure.attempt,
|
|
65
75
|
maxRetries: maxTransientRetries,
|
|
66
76
|
errorMessage,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry-event-presenter.js","sourceRoot":"","sources":["../../../source/services/retry/retry-event-presenter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"retry-event-presenter.js","sourceRoot":"","sources":["../../../source/services/retry/retry-event-presenter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One bounded capability shared by provider transport retries and session
|
|
3
|
+
* recovery. The owner is deliberately the retry/session layer: providers can
|
|
4
|
+
* consume claims, but cannot extend or reset the envelope.
|
|
5
|
+
*/
|
|
6
|
+
export declare const RETRY_RECOVERY_LIMITS: {
|
|
7
|
+
readonly maxRecoveryTimeMs: 90000;
|
|
8
|
+
readonly maxPhysicalAttempts: 3;
|
|
9
|
+
readonly maxAutomaticReplays: 1;
|
|
10
|
+
};
|
|
11
|
+
export type RetryRecoveryBudgetOptions = {
|
|
12
|
+
now?: () => number;
|
|
13
|
+
maxRecoveryTimeMs?: number;
|
|
14
|
+
maxPhysicalAttempts?: number;
|
|
15
|
+
maxAutomaticReplays?: number;
|
|
16
|
+
};
|
|
17
|
+
export declare class RetryRecoveryBudget {
|
|
18
|
+
#private;
|
|
19
|
+
readonly maxRecoveryTimeMs: number;
|
|
20
|
+
readonly maxPhysicalAttempts: number;
|
|
21
|
+
readonly maxAutomaticReplays: number;
|
|
22
|
+
constructor(options?: RetryRecoveryBudgetOptions);
|
|
23
|
+
get startedAt(): number | undefined;
|
|
24
|
+
get physicalAttempts(): number;
|
|
25
|
+
get automaticReplays(): number;
|
|
26
|
+
get elapsedMs(): number;
|
|
27
|
+
/** Starts the recovery clock only after a retryable failure is observed. */
|
|
28
|
+
noteRetryableFailure(): void;
|
|
29
|
+
get deadlineExceeded(): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Claim one physical dispatch made because recovery is in progress.
|
|
32
|
+
* Ordinary first attempts and successful tool-loop continuations are not
|
|
33
|
+
* recovery work; their callers must not spend this budget on them.
|
|
34
|
+
*/
|
|
35
|
+
claimPhysicalAttempt(): boolean;
|
|
36
|
+
/** Claim exactly once before an automatic full-history turn replay. */
|
|
37
|
+
claimAutomaticReplay(): boolean;
|
|
38
|
+
remainingMs(): number | undefined;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Raised when a provider wrapper tried to start another physical request after
|
|
42
|
+
* the shared recovery envelope was exhausted. Keeping the triggering failure
|
|
43
|
+
* as a cause lets the classifier retain its useful provider/status details
|
|
44
|
+
* without making the budget error itself look like a new provider failure.
|
|
45
|
+
*/
|
|
46
|
+
export declare class RetryRecoveryBudgetExhaustedError extends Error {
|
|
47
|
+
readonly cause: unknown;
|
|
48
|
+
constructor(cause?: unknown);
|
|
49
|
+
}
|
|
50
|
+
export declare const isRetryRecoveryBudgetExhaustedError: (error: unknown) => error is RetryRecoveryBudgetExhaustedError;
|
|
51
|
+
//# sourceMappingURL=retry-recovery-budget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-recovery-budget.d.ts","sourceRoot":"","sources":["../../../source/services/retry/retry-recovery-budget.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,qBAAqB;aAChC,iBAAiB,EAAE,KAAM;aACzB,mBAAmB,EAAE,CAAC;aACtB,mBAAmB,EAAE,CAAC;CACd,CAAC;AAEX,MAAM,MAAM,0BAA0B,GAAG;IACvC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,qBAAa,mBAAmB;;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IAMrC,YAAY,OAAO,GAAE,0BAA+B,EAKnD;IAED,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IAED,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,4EAA4E;IAC5E,oBAAoB,IAAI,IAAI,CAE3B;IAED,IAAI,gBAAgB,IAAI,OAAO,CAE9B;IAED;;;;OAIG;IACH,oBAAoB,IAAI,OAAO,CAI9B;IAED,uEAAuE;IACvE,oBAAoB,IAAI,OAAO,CAI9B;IAED,WAAW,IAAI,MAAM,GAAG,SAAS,CAGhC;CACF;AAED;;;;;GAKG;AACH,qBAAa,iCAAkC,SAAQ,KAAK;IAC1D,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAExB,YAAY,KAAK,CAAC,EAAE,OAAO,EAI1B;CACF;AAED,eAAO,MAAM,mCAAmC,UAAW,OAAO,KAAG,KAAK,IAAI,iCAC1B,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One bounded capability shared by provider transport retries and session
|
|
3
|
+
* recovery. The owner is deliberately the retry/session layer: providers can
|
|
4
|
+
* consume claims, but cannot extend or reset the envelope.
|
|
5
|
+
*/
|
|
6
|
+
export const RETRY_RECOVERY_LIMITS = {
|
|
7
|
+
maxRecoveryTimeMs: 90_000,
|
|
8
|
+
maxPhysicalAttempts: 3,
|
|
9
|
+
maxAutomaticReplays: 1,
|
|
10
|
+
};
|
|
11
|
+
export class RetryRecoveryBudget {
|
|
12
|
+
maxRecoveryTimeMs;
|
|
13
|
+
maxPhysicalAttempts;
|
|
14
|
+
maxAutomaticReplays;
|
|
15
|
+
#now;
|
|
16
|
+
#startedAt;
|
|
17
|
+
#physicalAttempts = 0;
|
|
18
|
+
#automaticReplays = 0;
|
|
19
|
+
constructor(options = {}) {
|
|
20
|
+
this.#now = options.now ?? (() => performance.now());
|
|
21
|
+
this.maxRecoveryTimeMs = options.maxRecoveryTimeMs ?? RETRY_RECOVERY_LIMITS.maxRecoveryTimeMs;
|
|
22
|
+
this.maxPhysicalAttempts = options.maxPhysicalAttempts ?? RETRY_RECOVERY_LIMITS.maxPhysicalAttempts;
|
|
23
|
+
this.maxAutomaticReplays = options.maxAutomaticReplays ?? RETRY_RECOVERY_LIMITS.maxAutomaticReplays;
|
|
24
|
+
}
|
|
25
|
+
get startedAt() {
|
|
26
|
+
return this.#startedAt;
|
|
27
|
+
}
|
|
28
|
+
get physicalAttempts() {
|
|
29
|
+
return this.#physicalAttempts;
|
|
30
|
+
}
|
|
31
|
+
get automaticReplays() {
|
|
32
|
+
return this.#automaticReplays;
|
|
33
|
+
}
|
|
34
|
+
get elapsedMs() {
|
|
35
|
+
return this.#startedAt === undefined ? 0 : Math.max(0, this.#now() - this.#startedAt);
|
|
36
|
+
}
|
|
37
|
+
/** Starts the recovery clock only after a retryable failure is observed. */
|
|
38
|
+
noteRetryableFailure() {
|
|
39
|
+
if (this.#startedAt === undefined)
|
|
40
|
+
this.#startedAt = this.#now();
|
|
41
|
+
}
|
|
42
|
+
get deadlineExceeded() {
|
|
43
|
+
return this.#startedAt !== undefined && this.elapsedMs >= this.maxRecoveryTimeMs;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Claim one physical dispatch made because recovery is in progress.
|
|
47
|
+
* Ordinary first attempts and successful tool-loop continuations are not
|
|
48
|
+
* recovery work; their callers must not spend this budget on them.
|
|
49
|
+
*/
|
|
50
|
+
claimPhysicalAttempt() {
|
|
51
|
+
if (this.#physicalAttempts >= this.maxPhysicalAttempts || this.deadlineExceeded)
|
|
52
|
+
return false;
|
|
53
|
+
this.#physicalAttempts++;
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
/** Claim exactly once before an automatic full-history turn replay. */
|
|
57
|
+
claimAutomaticReplay() {
|
|
58
|
+
if (this.#automaticReplays >= this.maxAutomaticReplays || this.deadlineExceeded)
|
|
59
|
+
return false;
|
|
60
|
+
this.#automaticReplays++;
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
remainingMs() {
|
|
64
|
+
if (this.#startedAt === undefined)
|
|
65
|
+
return undefined;
|
|
66
|
+
return Math.max(0, this.maxRecoveryTimeMs - this.elapsedMs);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Raised when a provider wrapper tried to start another physical request after
|
|
71
|
+
* the shared recovery envelope was exhausted. Keeping the triggering failure
|
|
72
|
+
* as a cause lets the classifier retain its useful provider/status details
|
|
73
|
+
* without making the budget error itself look like a new provider failure.
|
|
74
|
+
*/
|
|
75
|
+
export class RetryRecoveryBudgetExhaustedError extends Error {
|
|
76
|
+
cause;
|
|
77
|
+
constructor(cause) {
|
|
78
|
+
super('Retry recovery budget exhausted', { cause });
|
|
79
|
+
this.name = 'RetryRecoveryBudgetExhaustedError';
|
|
80
|
+
this.cause = cause;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export const isRetryRecoveryBudgetExhaustedError = (error) => error instanceof RetryRecoveryBudgetExhaustedError;
|
|
84
|
+
//# sourceMappingURL=retry-recovery-budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-recovery-budget.js","sourceRoot":"","sources":["../../../source/services/retry/retry-recovery-budget.ts"],"names":[],"mappings":"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"}
|