@qduc/term2 0.18.0 → 0.20.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/agent.d.ts +9 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +7 -1
- package/dist/agent.js.map +1 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +3 -2
- package/dist/app.js.map +1 -1
- package/dist/cli.js +9 -5
- package/dist/cli.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 +15 -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 +17 -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 +33 -10
- package/dist/components/message/MessageList.js.map +1 -1
- package/dist/components/message/command-grouping.d.ts +7 -6
- package/dist/components/message/command-grouping.d.ts.map +1 -1
- package/dist/components/message/command-grouping.js +35 -15
- package/dist/components/message/command-grouping.js.map +1 -1
- package/dist/components/message/command-message-helpers.d.ts +5 -5
- 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/settings-completion-config.d.ts.map +1 -1
- package/dist/hooks/settings-completion-config.js +0 -2
- package/dist/hooks/settings-completion-config.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 +18 -0
- package/dist/lib/agent-client.d.ts.map +1 -1
- package/dist/lib/agent-client.js +68 -23
- package/dist/lib/agent-client.js.map +1 -1
- package/dist/lib/agent-configuration.d.ts +8 -0
- package/dist/lib/agent-configuration.d.ts.map +1 -1
- package/dist/lib/agent-configuration.js +6 -0
- package/dist/lib/agent-configuration.js.map +1 -1
- package/dist/lib/agent-factory.d.ts +8 -0
- package/dist/lib/agent-factory.d.ts.map +1 -1
- package/dist/lib/agent-factory.js +2 -0
- package/dist/lib/agent-factory.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 +39 -1
- 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 +3 -0
- package/dist/services/conversation/session-browser.d.ts.map +1 -1
- package/dist/services/conversation/session-browser.js +42 -40
- 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/memory/memory-store.d.ts.map +1 -1
- package/dist/services/memory/memory-store.js +3 -1
- package/dist/services/memory/memory-store.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 +20 -4
- package/dist/services/session/background-check-in-scheduler.d.ts.map +1 -1
- package/dist/services/session/background-check-in-scheduler.js +108 -8
- 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 +5 -1
- 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/settings/settings-schema.d.ts +0 -4
- package/dist/services/settings/settings-schema.d.ts.map +1 -1
- package/dist/services/settings/settings-schema.js +1 -5
- package/dist/services/settings/settings-schema.js.map +1 -1
- package/dist/services/settings/settings-sources.d.ts.map +1 -1
- package/dist/services/settings/settings-sources.js +0 -1
- package/dist/services/settings/settings-sources.js.map +1 -1
- package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts +1 -1
- package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts.map +1 -1
- package/dist/services/settings/test-helpers/settings-consumer-inventory.js +0 -1
- package/dist/services/settings/test-helpers/settings-consumer-inventory.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/configure-task-check-in.d.ts +17 -0
- package/dist/tools/agent/configure-task-check-in.d.ts.map +1 -0
- package/dist/tools/agent/configure-task-check-in.js +74 -0
- package/dist/tools/agent/configure-task-check-in.js.map +1 -0
- package/dist/tools/agent/run-subagent-async.d.ts +12 -2
- package/dist/tools/agent/run-subagent-async.d.ts.map +1 -1
- package/dist/tools/agent/run-subagent-async.js +47 -5
- package/dist/tools/agent/run-subagent-async.js.map +1 -1
- package/dist/tools/agent/run-subagent.d.ts +15 -0
- package/dist/tools/agent/run-subagent.d.ts.map +1 -1
- package/dist/tools/agent/run-subagent.js +24 -2
- package/dist/tools/agent/run-subagent.js.map +1 -1
- package/dist/tools/file/read-file.d.ts.map +1 -1
- package/dist/tools/file/read-file.js +48 -0
- package/dist/tools/file/read-file.js.map +1 -1
- package/dist/tools/format-helpers.d.ts.map +1 -1
- package/dist/tools/format-helpers.js +7 -0
- package/dist/tools/format-helpers.js.map +1 -1
- package/dist/tools/memory/memory-tools.js +1 -1
- package/dist/tools/memory/memory-tools.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/system/shell.d.ts +12 -0
- package/dist/tools/system/shell.d.ts.map +1 -1
- package/dist/tools/system/shell.js +22 -2
- package/dist/tools/system/shell.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 +5 -0
- package/dist/utils/ai/token-usage.d.ts.map +1 -1
- package/dist/utils/ai/token-usage.js +37 -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/settings-command.d.ts.map +1 -1
- package/dist/utils/settings-command.js +0 -5
- package/dist/utils/settings-command.js.map +1 -1
- package/dist/utils/streaming/streaming-session-factory.d.ts +7 -0
- package/dist/utils/streaming/streaming-session-factory.d.ts.map +1 -1
- package/dist/utils/streaming/streaming-session-factory.js +65 -9
- package/dist/utils/streaming/streaming-session-factory.js.map +1 -1
- package/dist/utils/streaming/streaming-speed-tracker.d.ts +125 -0
- package/dist/utils/streaming/streaming-speed-tracker.d.ts.map +1 -0
- package/dist/utils/streaming/streaming-speed-tracker.js +265 -0
- package/dist/utils/streaming/streaming-speed-tracker.js.map +1 -0
- package/package.json +1 -1
|
@@ -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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"}
|
|
@@ -74,26 +74,80 @@ export interface ProviderTrafficClosedResponse {
|
|
|
74
74
|
requestId: string;
|
|
75
75
|
provider: string;
|
|
76
76
|
model: string;
|
|
77
|
-
|
|
77
|
+
/**
|
|
78
|
+
* `'failed'` is a stream that ended because a raw transport `error`/`close`
|
|
79
|
+
* frame was observed before any terminal response event — distinct from
|
|
80
|
+
* `'consumer_closed'`, which is this application choosing to stop reading a
|
|
81
|
+
* still-live stream. Without the distinction, an abnormal WebSocket close
|
|
82
|
+
* (e.g. close code 1006) is indistinguishable from ordinary cleanup.
|
|
83
|
+
*/
|
|
84
|
+
outcome: 'consumer_closed' | 'aborted' | 'failed';
|
|
78
85
|
eventCount: number;
|
|
79
86
|
modelClass?: string;
|
|
80
87
|
modelWrapperClass?: string;
|
|
81
88
|
/**
|
|
82
89
|
* A stream that ends without a terminal event leaves no payload to
|
|
83
90
|
* summarize, so the retained transcript and its timings are the only record
|
|
84
|
-
* of what the model was doing when it was cut off.
|
|
91
|
+
* of what the model was doing when it was cut off. Bounded (no raw event
|
|
92
|
+
* payload) for `'failed'`, since a transport failure is not the deliberate
|
|
93
|
+
* client abort that full transcript retention is for.
|
|
85
94
|
*/
|
|
86
|
-
diagnostics?: ProviderTrafficStreamDiagnostics;
|
|
95
|
+
diagnostics?: ProviderTrafficStreamDiagnostics | ProviderTrafficBoundedStreamDiagnostics;
|
|
87
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Fixed, bounded classification of a Responses WebSocket frame's progress
|
|
99
|
+
* kind. Closed union on purpose — see `aborted-stream-recorder.ts`.
|
|
100
|
+
*/
|
|
101
|
+
export type ProviderTrafficProgressCategory = 'text' | 'reasoning' | 'tool' | 'usage' | 'heartbeat_or_unknown';
|
|
88
102
|
export interface ProviderTrafficStreamDiagnostics {
|
|
89
103
|
durationMs: number;
|
|
90
104
|
firstEventMs?: number;
|
|
91
105
|
lastEventMs?: number;
|
|
92
106
|
maxGapMs?: number;
|
|
93
107
|
responseId?: string;
|
|
108
|
+
/** Present only when a raw transport `close` frame was observed. */
|
|
109
|
+
closeCode?: number;
|
|
110
|
+
closeReason?: string;
|
|
94
111
|
eventTypeCounts: Record<string, number>;
|
|
112
|
+
progressCategoryCounts: Record<ProviderTrafficProgressCategory, number>;
|
|
113
|
+
/** Content-free count of raw tool-argument delta frames. */
|
|
114
|
+
toolArgumentDeltaFrames: number;
|
|
115
|
+
/** Sum of raw tool-argument delta string lengths. */
|
|
116
|
+
toolArgumentDeltaCharacters: number;
|
|
117
|
+
/** Raw function-call item starts observed before argument deltas. */
|
|
118
|
+
toolCallStartFrames: number;
|
|
95
119
|
events: unknown[];
|
|
96
120
|
}
|
|
121
|
+
/**
|
|
122
|
+
* A mechanically fixed-size/fixed-cardinality view of stream progress,
|
|
123
|
+
* distinct from {@link ProviderTrafficStreamDiagnostics}: every field here is
|
|
124
|
+
* either a single number (including content-free tool-argument growth counts)
|
|
125
|
+
* or a `Record` with a closed, hard-coded key set
|
|
126
|
+
* (`progressCategoryCounts`), so its serialized size cannot grow no matter
|
|
127
|
+
* how many frames, or how novel/hostile their `type` strings, a stream sends.
|
|
128
|
+
*
|
|
129
|
+
* This is why it is a distinct interface rather than
|
|
130
|
+
* `Omit<ProviderTrafficStreamDiagnostics, 'events'>`: that would still expose
|
|
131
|
+
* `eventTypeCounts` (keyed by raw, provider-supplied `type` strings with no
|
|
132
|
+
* enforced vocabulary — unbounded key cardinality) and `closeReason` (free
|
|
133
|
+
* text the server chooses). Used where the caller must retain progress
|
|
134
|
+
* evidence about a stream without retaining anything unbounded or
|
|
135
|
+
* provider-authored — in particular a genuine transport failure, which is not
|
|
136
|
+
* a deliberate client abort and can carry an unbounded number of frames.
|
|
137
|
+
*/
|
|
138
|
+
export interface ProviderTrafficBoundedStreamDiagnostics {
|
|
139
|
+
durationMs: number;
|
|
140
|
+
firstEventMs?: number;
|
|
141
|
+
lastEventMs?: number;
|
|
142
|
+
maxGapMs?: number;
|
|
143
|
+
/** Numeric WebSocket close code (RFC 6455 §7.4); never free text. */
|
|
144
|
+
closeCode?: number;
|
|
145
|
+
eventCount: number;
|
|
146
|
+
progressCategoryCounts: Record<ProviderTrafficProgressCategory, number>;
|
|
147
|
+
toolArgumentDeltaFrames: number;
|
|
148
|
+
toolArgumentDeltaCharacters: number;
|
|
149
|
+
toolCallStartFrames: number;
|
|
150
|
+
}
|
|
97
151
|
/**
|
|
98
152
|
* What a transport-liveness guard observed while receiving a response, in the
|
|
99
153
|
* same clock it judges expiry with.
|
|
@@ -124,6 +178,16 @@ export interface IProviderTraffic {
|
|
|
124
178
|
wsAttempt?: number;
|
|
125
179
|
wsMaxAttempts?: number;
|
|
126
180
|
receiveTiming?: ProviderTrafficReceiveTiming;
|
|
181
|
+
host?: string;
|
|
182
|
+
timeoutMs?: number;
|
|
183
|
+
phase?: string;
|
|
184
|
+
physicalAttempt?: number;
|
|
185
|
+
/**
|
|
186
|
+
* Bounded category/counter/timing evidence of stream progress observed
|
|
187
|
+
* before the failure, when a stream had already started delivering
|
|
188
|
+
* frames. Absent when the failure happened before any frame arrived.
|
|
189
|
+
*/
|
|
190
|
+
diagnostics?: ProviderTrafficBoundedStreamDiagnostics;
|
|
127
191
|
}): void;
|
|
128
192
|
}
|
|
129
193
|
export interface ISessionContextService {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-interfaces.d.ts","sourceRoot":"","sources":["../../source/services/service-interfaces.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"service-interfaces.d.ts","sourceRoot":"","sources":["../../source/services/service-interfaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,11 @@ import type { BackgroundShellJob } from '../shell/background-shell-registry.js';
|
|
|
6
6
|
export interface BackgroundCheckInSettings {
|
|
7
7
|
enabled: boolean;
|
|
8
8
|
intervalMs: number;
|
|
9
|
-
|
|
9
|
+
}
|
|
10
|
+
export interface TaskCheckInPolicy {
|
|
11
|
+
enabled?: boolean;
|
|
12
|
+
intervalMs?: number;
|
|
13
|
+
nextDueAt?: number;
|
|
10
14
|
}
|
|
11
15
|
export interface BackgroundCheckInSchedulerDeps {
|
|
12
16
|
/** Snapshot of currently tracked background tasks, unified across executors. */
|
|
@@ -34,14 +38,26 @@ export interface BackgroundCheckInSchedulerDeps {
|
|
|
34
38
|
* notification pipeline (see docs/plans/background-work-control/agent-checkin.md).
|
|
35
39
|
*
|
|
36
40
|
* Owns no execution state of its own — `getRunningTasks` reads the unified
|
|
37
|
-
* task snapshot the notification store already maintains. Per-task due time
|
|
38
|
-
* and check-in count live only here, keyed by `${kind}:${id}`,
|
|
39
|
-
* dropped the moment a task leaves the running snapshot (settled or evicted),
|
|
41
|
+
* task snapshot the notification store already maintains. Per-task due time,
|
|
42
|
+
* policy overrides, and check-in count live only here, keyed by `${kind}:${id}`,
|
|
43
|
+
* and are dropped the moment a task leaves the running snapshot (settled or evicted),
|
|
40
44
|
* so a reused id after a task's lifecycle epoch bumps starts a fresh count.
|
|
41
45
|
*/
|
|
42
46
|
export declare class BackgroundCheckInScheduler {
|
|
43
47
|
#private;
|
|
44
48
|
constructor(deps: BackgroundCheckInSchedulerDeps);
|
|
49
|
+
setTaskPolicy(target: BackgroundCheckInDueEvent['target'], policy: TaskCheckInPolicy): void;
|
|
50
|
+
getTaskPolicy(target: BackgroundCheckInDueEvent['target']): TaskCheckInPolicy | undefined;
|
|
51
|
+
resolveTarget(targetNameOrId: string): BackgroundCheckInDueEvent['target'] | undefined;
|
|
52
|
+
configureTaskCheckIn(targetNameOrId: string, options: {
|
|
53
|
+
enabled?: boolean;
|
|
54
|
+
intervalMs?: number;
|
|
55
|
+
nextDueInMs?: number;
|
|
56
|
+
}): {
|
|
57
|
+
ok: boolean;
|
|
58
|
+
message?: string;
|
|
59
|
+
error?: string;
|
|
60
|
+
};
|
|
45
61
|
/** Exposed for tests; production callers rely on the internal timer. */
|
|
46
62
|
tick(): void;
|
|
47
63
|
dispose(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"background-check-in-scheduler.d.ts","sourceRoot":"","sources":["../../../source/services/session/background-check-in-scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AACxF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6CAA6C,CAAC;AAClF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"background-check-in-scheduler.d.ts","sourceRoot":"","sources":["../../../source/services/session/background-check-in-scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AACxF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6CAA6C,CAAC;AAClF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAQhF,+EAA+E;AAC/E,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,8BAA8B;IAC7C,gFAAgF;IAChF,eAAe,EAAE,MAAM,SAAS,cAAc,EAAE,CAAC;IACjD,sFAAsF;IACtF,IAAI,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,CAAC;IACjD,WAAW,EAAE,MAAM,yBAAyB,CAAC;IAC7C,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,iBAAiB,GAAG,SAAS,CAAC;IACrE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,kBAAkB,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;IACzE,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC9E,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IACtF,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,KAAK,IAAI,CAAC;IAChE;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAuGD;;;;;;;;;;;GAWG;AACH,qBAAa,0BAA0B;;IAarC,YAAY,IAAI,EAAE,8BAA8B,EAY/C;IAED,aAAa,CAAC,MAAM,EAAE,yBAAyB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAO1F;IAED,aAAa,CAAC,MAAM,EAAE,yBAAyB,CAAC,QAAQ,CAAC,GAAG,iBAAiB,GAAG,SAAS,CAExF;IAED,aAAa,CAAC,cAAc,EAAE,MAAM,GAAG,yBAAyB,CAAC,QAAQ,CAAC,GAAG,SAAS,CAerF;IAED,oBAAoB,CAClB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GACxE;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAyBnD;IAED,wEAAwE;IACxE,IAAI,IAAI,IAAI,CA+CX;IAED,OAAO,IAAI,IAAI,CAId;CACF"}
|