agentfootprint 7.7.0 → 7.8.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/CLAUDE.md +2 -1
- package/dist/adapters/llm/AnthropicProvider.js +5 -4
- package/dist/adapters/llm/AnthropicProvider.js.map +1 -1
- package/dist/adapters/llm/BedrockProvider.js +5 -4
- package/dist/adapters/llm/BedrockProvider.js.map +1 -1
- package/dist/adapters/llm/BrowserAnthropicProvider.js +5 -4
- package/dist/adapters/llm/BrowserAnthropicProvider.js.map +1 -1
- package/dist/adapters/llm/BrowserOpenAIProvider.js +13 -10
- package/dist/adapters/llm/BrowserOpenAIProvider.js.map +1 -1
- package/dist/adapters/llm/OpenAIProvider.js +8 -6
- package/dist/adapters/llm/OpenAIProvider.js.map +1 -1
- package/dist/core/Agent.js +10 -0
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/LLMCall.js +10 -1
- package/dist/core/LLMCall.js.map +1 -1
- package/dist/core/RunnerBase.js +42 -12
- package/dist/core/RunnerBase.js.map +1 -1
- package/dist/core/agent/buildAgentChart.js +7 -3
- package/dist/core/agent/buildAgentChart.js.map +1 -1
- package/dist/core/agent/buildAgentMessageApiChart.js +18 -1
- package/dist/core/agent/buildAgentMessageApiChart.js.map +1 -1
- package/dist/core/agent/buildMessageApiChart.js +4 -1
- package/dist/core/agent/buildMessageApiChart.js.map +1 -1
- package/dist/core/agent/stages/callLLM.js +18 -2
- package/dist/core/agent/stages/callLLM.js.map +1 -1
- package/dist/core-flow/Parallel.js +9 -1
- package/dist/core-flow/Parallel.js.map +1 -1
- package/dist/esm/adapters/llm/AnthropicProvider.d.ts +3 -3
- package/dist/esm/adapters/llm/AnthropicProvider.js +5 -4
- package/dist/esm/adapters/llm/AnthropicProvider.js.map +1 -1
- package/dist/esm/adapters/llm/BedrockProvider.d.ts +3 -3
- package/dist/esm/adapters/llm/BedrockProvider.js +5 -4
- package/dist/esm/adapters/llm/BedrockProvider.js.map +1 -1
- package/dist/esm/adapters/llm/BrowserAnthropicProvider.d.ts +3 -3
- package/dist/esm/adapters/llm/BrowserAnthropicProvider.js +5 -4
- package/dist/esm/adapters/llm/BrowserAnthropicProvider.js.map +1 -1
- package/dist/esm/adapters/llm/BrowserOpenAIProvider.d.ts +5 -5
- package/dist/esm/adapters/llm/BrowserOpenAIProvider.js +13 -10
- package/dist/esm/adapters/llm/BrowserOpenAIProvider.js.map +1 -1
- package/dist/esm/adapters/llm/OpenAIProvider.d.ts +3 -3
- package/dist/esm/adapters/llm/OpenAIProvider.js +8 -6
- package/dist/esm/adapters/llm/OpenAIProvider.js.map +1 -1
- package/dist/esm/adapters/types.d.ts +95 -2
- package/dist/esm/core/Agent.js +10 -0
- package/dist/esm/core/Agent.js.map +1 -1
- package/dist/esm/core/LLMCall.js +10 -1
- package/dist/esm/core/LLMCall.js.map +1 -1
- package/dist/esm/core/RunnerBase.d.ts +22 -1
- package/dist/esm/core/RunnerBase.js +42 -12
- package/dist/esm/core/RunnerBase.js.map +1 -1
- package/dist/esm/core/agent/buildAgentChart.d.ts +7 -3
- package/dist/esm/core/agent/buildAgentChart.js +7 -3
- package/dist/esm/core/agent/buildAgentChart.js.map +1 -1
- package/dist/esm/core/agent/buildAgentMessageApiChart.js +18 -1
- package/dist/esm/core/agent/buildAgentMessageApiChart.js.map +1 -1
- package/dist/esm/core/agent/buildMessageApiChart.js +4 -1
- package/dist/esm/core/agent/buildMessageApiChart.js.map +1 -1
- package/dist/esm/core/agent/stages/callLLM.js +18 -2
- package/dist/esm/core/agent/stages/callLLM.js.map +1 -1
- package/dist/esm/core/runner.d.ts +40 -5
- package/dist/esm/core-flow/Parallel.js +9 -1
- package/dist/esm/core-flow/Parallel.js.map +1 -1
- package/dist/esm/index.js +9 -9
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/context-bisect/types.d.ts +9 -0
- package/dist/esm/lib/context-bisect/types.js.map +1 -1
- package/dist/esm/lib/recorded-chat/recordedChat.js +10 -1
- package/dist/esm/lib/recorded-chat/recordedChat.js.map +1 -1
- package/dist/esm/lib/recorded-chat/types.d.ts +10 -0
- package/dist/esm/observe.d.ts +3 -1
- package/dist/esm/observe.js +13 -1
- package/dist/esm/observe.js.map +1 -1
- package/dist/esm/providers.d.ts +1 -1
- package/dist/esm/recorders/core/EmitBridge.d.ts +9 -3
- package/dist/esm/recorders/core/EmitBridge.js +4 -3
- package/dist/esm/recorders/core/EmitBridge.js.map +1 -1
- package/dist/esm/recorders/core/ResilienceRecorder.d.ts +32 -0
- package/dist/esm/recorders/core/ResilienceRecorder.js +41 -0
- package/dist/esm/recorders/core/ResilienceRecorder.js.map +1 -0
- package/dist/esm/recorders/core/resilienceHooks.d.ts +34 -0
- package/dist/esm/recorders/core/resilienceHooks.js +74 -0
- package/dist/esm/recorders/core/resilienceHooks.js.map +1 -0
- package/dist/esm/recorders/core/typedEmit.d.ts +1 -2
- package/dist/esm/recorders/observability/BoundaryRecorder.d.ts +176 -12
- package/dist/esm/recorders/observability/BoundaryRecorder.js +119 -8
- package/dist/esm/recorders/observability/BoundaryRecorder.js.map +1 -1
- package/dist/esm/recorders/observability/FlowchartRecorder.d.ts +13 -2
- package/dist/esm/recorders/observability/FlowchartRecorder.js +14 -3
- package/dist/esm/recorders/observability/FlowchartRecorder.js.map +1 -1
- package/dist/esm/recorders/observability/localObservability.d.ts +66 -6
- package/dist/esm/recorders/observability/localObservability.js +27 -7
- package/dist/esm/recorders/observability/localObservability.js.map +1 -1
- package/dist/esm/recorders/observability/recordRun.d.ts +143 -0
- package/dist/esm/recorders/observability/recordRun.js +133 -0
- package/dist/esm/recorders/observability/recordRun.js.map +1 -0
- package/dist/esm/recorders/observability/trace.d.ts +65 -13
- package/dist/esm/recorders/observability/trace.js +36 -9
- package/dist/esm/recorders/observability/trace.js.map +1 -1
- package/dist/esm/reliability/buildReliabilityGateChart.d.ts +23 -9
- package/dist/esm/reliability/buildReliabilityGateChart.js +37 -10
- package/dist/esm/reliability/buildReliabilityGateChart.js.map +1 -1
- package/dist/esm/resilience/withCircuitBreaker.d.ts +15 -5
- package/dist/esm/resilience/withCircuitBreaker.js +14 -7
- package/dist/esm/resilience/withCircuitBreaker.js.map +1 -1
- package/dist/esm/resilience/withFallback.d.ts +7 -1
- package/dist/esm/resilience/withFallback.js +30 -11
- package/dist/esm/resilience/withFallback.js.map +1 -1
- package/dist/esm/resilience/withRetry.d.ts +10 -5
- package/dist/esm/resilience/withRetry.js +53 -3
- package/dist/esm/resilience/withRetry.js.map +1 -1
- package/dist/esm/tool-providers/index.js +2 -2
- package/dist/esm/tool-providers/index.js.map +1 -1
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/dist/lib/context-bisect/types.js.map +1 -1
- package/dist/lib/recorded-chat/recordedChat.js +10 -1
- package/dist/lib/recorded-chat/recordedChat.js.map +1 -1
- package/dist/observe.js +16 -2
- package/dist/observe.js.map +1 -1
- package/dist/recorders/core/EmitBridge.js +4 -3
- package/dist/recorders/core/EmitBridge.js.map +1 -1
- package/dist/recorders/core/ResilienceRecorder.js +45 -0
- package/dist/recorders/core/ResilienceRecorder.js.map +1 -0
- package/dist/recorders/core/resilienceHooks.js +78 -0
- package/dist/recorders/core/resilienceHooks.js.map +1 -0
- package/dist/recorders/observability/BoundaryRecorder.js +119 -8
- package/dist/recorders/observability/BoundaryRecorder.js.map +1 -1
- package/dist/recorders/observability/FlowchartRecorder.js +14 -3
- package/dist/recorders/observability/FlowchartRecorder.js.map +1 -1
- package/dist/recorders/observability/localObservability.js +27 -7
- package/dist/recorders/observability/localObservability.js.map +1 -1
- package/dist/recorders/observability/recordRun.js +137 -0
- package/dist/recorders/observability/recordRun.js.map +1 -0
- package/dist/recorders/observability/trace.js +36 -9
- package/dist/recorders/observability/trace.js.map +1 -1
- package/dist/reliability/buildReliabilityGateChart.js +37 -10
- package/dist/reliability/buildReliabilityGateChart.js.map +1 -1
- package/dist/resilience/withCircuitBreaker.js +14 -7
- package/dist/resilience/withCircuitBreaker.js.map +1 -1
- package/dist/resilience/withFallback.js +30 -11
- package/dist/resilience/withFallback.js.map +1 -1
- package/dist/resilience/withRetry.js +53 -3
- package/dist/resilience/withRetry.js.map +1 -1
- package/dist/tool-providers/index.js +2 -2
- package/dist/tool-providers/index.js.map +1 -1
- package/dist/types/adapters/llm/AnthropicProvider.d.ts +3 -3
- package/dist/types/adapters/llm/AnthropicProvider.d.ts.map +1 -1
- package/dist/types/adapters/llm/BedrockProvider.d.ts +3 -3
- package/dist/types/adapters/llm/BedrockProvider.d.ts.map +1 -1
- package/dist/types/adapters/llm/BrowserAnthropicProvider.d.ts +3 -3
- package/dist/types/adapters/llm/BrowserAnthropicProvider.d.ts.map +1 -1
- package/dist/types/adapters/llm/BrowserOpenAIProvider.d.ts +5 -5
- package/dist/types/adapters/llm/BrowserOpenAIProvider.d.ts.map +1 -1
- package/dist/types/adapters/llm/OpenAIProvider.d.ts +3 -3
- package/dist/types/adapters/llm/OpenAIProvider.d.ts.map +1 -1
- package/dist/types/adapters/types.d.ts +95 -2
- package/dist/types/adapters/types.d.ts.map +1 -1
- package/dist/types/core/Agent.d.ts.map +1 -1
- package/dist/types/core/LLMCall.d.ts.map +1 -1
- package/dist/types/core/RunnerBase.d.ts +22 -1
- package/dist/types/core/RunnerBase.d.ts.map +1 -1
- package/dist/types/core/agent/buildAgentChart.d.ts +7 -3
- package/dist/types/core/agent/buildAgentChart.d.ts.map +1 -1
- package/dist/types/core/agent/buildAgentMessageApiChart.d.ts.map +1 -1
- package/dist/types/core/agent/buildMessageApiChart.d.ts.map +1 -1
- package/dist/types/core/agent/stages/callLLM.d.ts.map +1 -1
- package/dist/types/core/runner.d.ts +40 -5
- package/dist/types/core/runner.d.ts.map +1 -1
- package/dist/types/core-flow/Parallel.d.ts.map +1 -1
- package/dist/types/lib/context-bisect/types.d.ts +9 -0
- package/dist/types/lib/context-bisect/types.d.ts.map +1 -1
- package/dist/types/lib/recorded-chat/recordedChat.d.ts.map +1 -1
- package/dist/types/lib/recorded-chat/types.d.ts +10 -0
- package/dist/types/lib/recorded-chat/types.d.ts.map +1 -1
- package/dist/types/observe.d.ts +3 -1
- package/dist/types/observe.d.ts.map +1 -1
- package/dist/types/providers.d.ts +1 -1
- package/dist/types/providers.d.ts.map +1 -1
- package/dist/types/recorders/core/EmitBridge.d.ts +9 -3
- package/dist/types/recorders/core/EmitBridge.d.ts.map +1 -1
- package/dist/types/recorders/core/ResilienceRecorder.d.ts +33 -0
- package/dist/types/recorders/core/ResilienceRecorder.d.ts.map +1 -0
- package/dist/types/recorders/core/resilienceHooks.d.ts +35 -0
- package/dist/types/recorders/core/resilienceHooks.d.ts.map +1 -0
- package/dist/types/recorders/core/typedEmit.d.ts +1 -2
- package/dist/types/recorders/core/typedEmit.d.ts.map +1 -1
- package/dist/types/recorders/observability/BoundaryRecorder.d.ts +176 -12
- package/dist/types/recorders/observability/BoundaryRecorder.d.ts.map +1 -1
- package/dist/types/recorders/observability/FlowchartRecorder.d.ts +13 -2
- package/dist/types/recorders/observability/FlowchartRecorder.d.ts.map +1 -1
- package/dist/types/recorders/observability/localObservability.d.ts +66 -6
- package/dist/types/recorders/observability/localObservability.d.ts.map +1 -1
- package/dist/types/recorders/observability/recordRun.d.ts +144 -0
- package/dist/types/recorders/observability/recordRun.d.ts.map +1 -0
- package/dist/types/recorders/observability/trace.d.ts +65 -13
- package/dist/types/recorders/observability/trace.d.ts.map +1 -1
- package/dist/types/reliability/buildReliabilityGateChart.d.ts +23 -9
- package/dist/types/reliability/buildReliabilityGateChart.d.ts.map +1 -1
- package/dist/types/resilience/withCircuitBreaker.d.ts +15 -5
- package/dist/types/resilience/withCircuitBreaker.d.ts.map +1 -1
- package/dist/types/resilience/withFallback.d.ts +7 -1
- package/dist/types/resilience/withFallback.d.ts.map +1 -1
- package/dist/types/resilience/withRetry.d.ts +10 -5
- package/dist/types/resilience/withRetry.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* recordRun — save a run so a viewer can show it later.
|
|
4
|
+
*
|
|
5
|
+
* A RECORDING is exactly three things, and each one lights a different
|
|
6
|
+
* surface:
|
|
7
|
+
*
|
|
8
|
+
* `events` the typed agentfootprint stream, in the order it fired —
|
|
9
|
+
* the story, the commentary, the summary.
|
|
10
|
+
* `snapshot` the footprintjs run snapshot — shared state, the commit
|
|
11
|
+
* log, and every attached recorder's data (narrative,
|
|
12
|
+
* metrics, boundaries).
|
|
13
|
+
* `structure` the agent's build-time chart — THE CHART. Nothing else
|
|
14
|
+
* can draw it, and no snapshot carries it.
|
|
15
|
+
*
|
|
16
|
+
* Miss one and one surface goes dark. That is why this exists: every
|
|
17
|
+
* integration that assembled the bundle by hand assembled a different,
|
|
18
|
+
* incomplete one, and the piece most often missing was `structure` —
|
|
19
|
+
* because a completed run does not leave it behind. This is also the
|
|
20
|
+
* producer for the shape lens's `observeRecording()` consumes, which
|
|
21
|
+
* until now nothing produced.
|
|
22
|
+
*
|
|
23
|
+
* import { recordRun } from 'agentfootprint/observe';
|
|
24
|
+
*
|
|
25
|
+
* const recorder = recordRun(agent);
|
|
26
|
+
* await agent.run({ message });
|
|
27
|
+
* fs.writeFileSync('run.json', JSON.stringify(recorder.toRecording()));
|
|
28
|
+
*
|
|
29
|
+
* …and in the viewer:
|
|
30
|
+
*
|
|
31
|
+
* const { recorder, runner } = observeRecording(JSON.parse(json)); // lens
|
|
32
|
+
* <Lens recorder={recorder} runner={runner} />
|
|
33
|
+
*
|
|
34
|
+
* WHAT IT WIRES THAT HAND-ROLLING GETS WRONG
|
|
35
|
+
* ──────────────────────────────────────────
|
|
36
|
+
* The boundary recorder — the one that puts stops on the step strip —
|
|
37
|
+
* needs three connections, and each missing one fails differently:
|
|
38
|
+
*
|
|
39
|
+
* attach no boundaries at all (loud: the strip is empty)
|
|
40
|
+
* subscribe boundaries with nothing in them (quiet: no LLM or
|
|
41
|
+
* tool detail behind any stop)
|
|
42
|
+
* getCommitCount every boundary stamped at commit 0 (SILENT: the
|
|
43
|
+
* events look complete, and the strip cannot be
|
|
44
|
+
* rebuilt offline — the commit log records what
|
|
45
|
+
* stages wrote, never when a boundary was crossed,
|
|
46
|
+
* so nothing downstream can repair it)
|
|
47
|
+
*
|
|
48
|
+
* Wire it before the run or not at all — none of the three can be
|
|
49
|
+
* reconstructed from a finished run.
|
|
50
|
+
*
|
|
51
|
+
* WHAT IT DOES NOT DO
|
|
52
|
+
* ───────────────────
|
|
53
|
+
* It attaches no OTHER recorders. `narrative()` and `metrics()` are the
|
|
54
|
+
* consumer's choice — their data rides the snapshot when attached, and
|
|
55
|
+
* each viewer says so when it isn't there (a Gantt with no timings shows
|
|
56
|
+
* execution ORDER and says so; a story panel falls back to "X executed.
|
|
57
|
+
* Wrote: y"). Attaching them behind the consumer's back would make every
|
|
58
|
+
* recording pay for panels most runs never open.
|
|
59
|
+
*/
|
|
60
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
61
|
+
exports.recordRun = void 0;
|
|
62
|
+
const BoundaryRecorder_js_1 = require("./BoundaryRecorder.js");
|
|
63
|
+
/** Default retained-event cap — see `RecordRunOptions.maxEvents`. */
|
|
64
|
+
const DEFAULT_MAX_EVENTS = 10_000;
|
|
65
|
+
/**
|
|
66
|
+
* Start recording a runner. Call BEFORE `run()` — a recording is
|
|
67
|
+
* collected as the run happens and cannot be reconstructed after it.
|
|
68
|
+
*
|
|
69
|
+
* @param runner the Agent / composition / pattern to record.
|
|
70
|
+
* @param options event cap and boundary detail level.
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```ts
|
|
74
|
+
* const recorder = recordRun(agent);
|
|
75
|
+
* await agent.run({ message: 'Weather in San Francisco?' });
|
|
76
|
+
* const recording = recorder.toRecording();
|
|
77
|
+
* recorder.stop();
|
|
78
|
+
*
|
|
79
|
+
* fs.writeFileSync('run.json', JSON.stringify(recording));
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
function recordRun(runner, options = {}) {
|
|
83
|
+
const maxEvents = options.maxEvents ?? DEFAULT_MAX_EVENTS;
|
|
84
|
+
const events = [];
|
|
85
|
+
let dropped = 0;
|
|
86
|
+
// 1. THE TIMELINE. Subscribed before the run so nothing is missed —
|
|
87
|
+
// the dispatcher drops events with no listener rather than queuing
|
|
88
|
+
// them, so a late subscription starts mid-story.
|
|
89
|
+
const offEvents = runner.on('*', (event) => {
|
|
90
|
+
events.push(event);
|
|
91
|
+
if (events.length > maxEvents) {
|
|
92
|
+
events.shift();
|
|
93
|
+
dropped += 1;
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
// 2. THE BOUNDARIES — all three connections, which is the whole reason
|
|
97
|
+
// to call this instead of wiring it yourself. `getCommitCount` reads
|
|
98
|
+
// through the runner on every boundary, so it reports the count at
|
|
99
|
+
// that moment rather than a number captured now (when it is 0).
|
|
100
|
+
const boundary = (0, BoundaryRecorder_js_1.boundaryRecorder)({
|
|
101
|
+
getCommitCount: () => runner.getCommitCount(),
|
|
102
|
+
...(options.boundaryDetail === 'lean' ? { snapshot: 'lean' } : {}),
|
|
103
|
+
});
|
|
104
|
+
const offAttach = runner.attach(boundary);
|
|
105
|
+
const offTyped = boundary.subscribe(runner);
|
|
106
|
+
let stopped = false;
|
|
107
|
+
return {
|
|
108
|
+
toRecording: () => ({
|
|
109
|
+
// Read at freeze time. Before the run there is no snapshot; during
|
|
110
|
+
// one it grows; after it, it is the finished run's.
|
|
111
|
+
snapshot: runner.getLastSnapshot(),
|
|
112
|
+
events: events.slice(),
|
|
113
|
+
// The one piece a run does not leave behind — it lives on the
|
|
114
|
+
// chart, which is built once and never changes.
|
|
115
|
+
structure: runner.getSpec().buildTimeStructure,
|
|
116
|
+
}),
|
|
117
|
+
boundary,
|
|
118
|
+
get eventCount() {
|
|
119
|
+
return events.length;
|
|
120
|
+
},
|
|
121
|
+
get droppedEvents() {
|
|
122
|
+
return dropped;
|
|
123
|
+
},
|
|
124
|
+
stop: () => {
|
|
125
|
+
// Idempotent: a consumer that stops in both a finally block and an
|
|
126
|
+
// unmount handler should not detach someone else's later recorder.
|
|
127
|
+
if (stopped)
|
|
128
|
+
return;
|
|
129
|
+
stopped = true;
|
|
130
|
+
offEvents();
|
|
131
|
+
offTyped();
|
|
132
|
+
offAttach();
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
exports.recordRun = recordRun;
|
|
137
|
+
//# sourceMappingURL=recordRun.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recordRun.js","sourceRoot":"","sources":["../../../src/recorders/observability/recordRun.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;;;AAKH,+DAAgF;AAqEhF,qEAAqE;AACrE,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,SAAS,CAAC,MAAc,EAAE,UAA4B,EAAE;IACtE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC;IAC1D,MAAM,MAAM,GAA0B,EAAE,CAAC;IACzC,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,oEAAoE;IACpE,sEAAsE;IACtE,oDAAoD;IACpD,MAAM,SAAS,GAAgB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAA0B,EAAE,EAAE;QAC3E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,IAAI,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,CAAC;QACf,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,uEAAuE;IACvE,wEAAwE;IACxE,sEAAsE;IACtE,mEAAmE;IACnE,MAAM,QAAQ,GAAG,IAAA,sCAAgB,EAAC;QAChC,cAAc,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE;QAC7C,GAAG,CAAC,OAAO,CAAC,cAAc,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5E,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAE5C,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,OAAO;QACL,WAAW,EAAE,GAAc,EAAE,CAAC,CAAC;YAC7B,mEAAmE;YACnE,oDAAoD;YACpD,QAAQ,EAAE,MAAM,CAAC,eAAe,EAAE;YAClC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE;YACtB,8DAA8D;YAC9D,gDAAgD;YAChD,SAAS,EAAG,MAAM,CAAC,OAAO,EAAuC,CAAC,kBAAkB;SACrF,CAAC;QACF,QAAQ;QACR,IAAI,UAAU;YACZ,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,CAAC;QACD,IAAI,aAAa;YACf,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IAAI,EAAE,GAAG,EAAE;YACT,mEAAmE;YACnE,mEAAmE;YACnE,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,CAAC;YACX,SAAS,EAAE,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC;AAxDD,8BAwDC"}
|
|
@@ -6,14 +6,31 @@
|
|
|
6
6
|
* `serializeTrace()` freezes that model into a `Trace` — plain JSON you can
|
|
7
7
|
* persist (file, Redis, a bug report) and later rehydrate WITHOUT re-running
|
|
8
8
|
* the agent. `agentfootprint-lens`'s `<Replay trace={…} />` consumes it and
|
|
9
|
-
*
|
|
9
|
+
* draws the flowchart via the existing translators.
|
|
10
10
|
*
|
|
11
|
-
* A `Trace` stores
|
|
12
|
-
*
|
|
13
|
-
* events (footprint.js's "graph
|
|
14
|
-
* it is rebuilt at render time,
|
|
15
|
-
*
|
|
16
|
-
* `redact` could never reach.
|
|
11
|
+
* A `Trace` stores the domain-event log (the single source of truth the Lens
|
|
12
|
+
* already reads) plus, since 7.8, the run's footprintjs snapshot. The step
|
|
13
|
+
* graph is ALWAYS a derived projection of those events (footprint.js's "graph
|
|
14
|
+
* is derived, never post-processed" principle) — it is rebuilt at render time,
|
|
15
|
+
* never stored. Storing a derived graph would be redundant AND a redaction
|
|
16
|
+
* hazard: a second content surface a per-event `redact` could never reach.
|
|
17
|
+
*
|
|
18
|
+
* WHAT A TRACE CAN AND CANNOT DRIVE
|
|
19
|
+
* ─────────────────────────────────
|
|
20
|
+
* `<Replay trace={…} />` draws the chart from `structure`, and that is all it
|
|
21
|
+
* draws: a static shape, not a lit-up path. It does not read `trace.events` —
|
|
22
|
+
* time-travel over them is a planned refinement, and until it lands an offline
|
|
23
|
+
* `<Replay>` is a strictly smaller view than the live `<Lens>`, not a match
|
|
24
|
+
* for it.
|
|
25
|
+
*
|
|
26
|
+
* For the full viewers — `<Lens>`, ExplainableShell, WhereFrom, the commit
|
|
27
|
+
* axis — what you want is a RECORDING: `{ snapshot, events, structure }`, the
|
|
28
|
+
* shape `recordRun()` produces and lens's `observeRecording()` consumes. Note
|
|
29
|
+
* `events` there means the TYPED agentfootprint stream (`runner.on('*')`),
|
|
30
|
+
* which is not the domain-event log a Trace carries: the two are different
|
|
31
|
+
* projections of the same run, and a Trace holds only the second. So a Trace
|
|
32
|
+
* with a `snapshot` can drive the snapshot-fed surfaces, but it is not itself
|
|
33
|
+
* a recording — reach for `recordRun()` when the destination is a viewer.
|
|
17
34
|
*
|
|
18
35
|
* PII / trust boundary: the event log carries real content — `llm.end.content`,
|
|
19
36
|
* `tool.start.args`, `tool.end.result`, `context.injected.contentSummary`,
|
|
@@ -70,13 +87,17 @@ exports.redactContent = redactContent;
|
|
|
70
87
|
* `getEvents()` output.
|
|
71
88
|
*
|
|
72
89
|
* const trace = serializeTrace(handle.boundary.getEvents(), {
|
|
73
|
-
* redact: redactContent,
|
|
90
|
+
* redact: redactContent, // PII stripped before it enters the trace
|
|
91
|
+
* structure: agent.getSpec().buildTimeStructure, // the chart
|
|
92
|
+
* snapshot: agent.getLastSnapshot(), // state + commit log + recorders
|
|
74
93
|
* capturedAtMs: Date.now(),
|
|
75
94
|
* });
|
|
76
95
|
* fs.writeFileSync('run.trace.json', JSON.stringify(trace));
|
|
96
|
+
*
|
|
97
|
+
* `enable.localObservability().getTrace()` passes all three for you.
|
|
77
98
|
*/
|
|
78
99
|
function serializeTrace(events, options = {}) {
|
|
79
|
-
const { redact, redactionLabel, structure, summary, capturedAtMs } = options;
|
|
100
|
+
const { redact, redactionLabel, structure, snapshot, summary, capturedAtMs } = options;
|
|
80
101
|
// A fresh array either way, so a held Trace is detached from the live store.
|
|
81
102
|
const safeEvents = redact ? events.map((e) => redact(e)) : events.slice();
|
|
82
103
|
const redaction = redactionLabel ?? (redact ? 'pii' : 'none');
|
|
@@ -84,6 +105,12 @@ function serializeTrace(events, options = {}) {
|
|
|
84
105
|
version: 1,
|
|
85
106
|
events: safeEvents,
|
|
86
107
|
...(structure !== undefined && { structure }),
|
|
108
|
+
// Held by reference, not cloned. footprintjs's `sharedState` is a live
|
|
109
|
+
// view of working memory, so a Trace taken mid-run keeps moving until the
|
|
110
|
+
// run ends — which is the same caveat `getSnapshot()` carries, and the
|
|
111
|
+
// reason `onRecorded` fires at the run's exit boundary. Serializing the
|
|
112
|
+
// Trace (its whole purpose) detaches it.
|
|
113
|
+
...(snapshot !== undefined && { snapshot }),
|
|
87
114
|
...(summary !== undefined && { summary }),
|
|
88
115
|
redaction,
|
|
89
116
|
...(capturedAtMs !== undefined && { capturedAtMs }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../../../src/recorders/observability/trace.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../../../src/recorders/observability/trace.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,9 +4,20 @@
|
|
|
4
4
|
* an LLM call with rules-based reliability semantics, using the native
|
|
5
5
|
* `decide()` DSL via `addDeciderFunction` decider stages.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* ⚠ NOT REACHABLE FROM ANY SHIPPED PATH (verified 2026-07-28). This header
|
|
8
|
+
* used to say the chart "is mounted as a subflow in the agent's chart at
|
|
9
|
+
* Agent.build() time (only when reliability is configured)". It is not:
|
|
10
|
+
* `buildReliabilityGateChart` is exported from no barrel, and its only
|
|
11
|
+
* consumer in the repository is its own test
|
|
12
|
+
* (`test/reliability/gate-chart-7pattern.test.ts`). The live
|
|
13
|
+
* `.reliability()` path is `executeWithReliability`
|
|
14
|
+
* (`core/agent/stages/reliabilityExecution.ts`) driving
|
|
15
|
+
* `singleProviderCall` inline in `core/agent/stages/callLLM.ts` — which
|
|
16
|
+
* trades this chart's subflow visibility for streaming support. Keep this
|
|
17
|
+
* file honest rather than deleting it: it is the only implementation that
|
|
18
|
+
* honours the `providers` failover list (see MENTAL_MODEL §14 item 3).
|
|
19
|
+
*
|
|
20
|
+
* Inside the subflow, when something does mount it:
|
|
10
21
|
*
|
|
11
22
|
* PreCheck (decider) → CallProvider (function) → PostDecide (decider)
|
|
12
23
|
* │
|
|
@@ -27,15 +38,18 @@
|
|
|
27
38
|
* 'fallback' → call config.fallback(); $break() on success
|
|
28
39
|
* 'fail-fast' → set failKind, $emit, $break(reason)
|
|
29
40
|
*
|
|
30
|
-
* The subflow
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
* agent-level `$break(reason)
|
|
34
|
-
* (`ok`/`fallback`) leave the agent running while fail-fast stops it.
|
|
41
|
+
* The design intends the subflow to be mounted WITHOUT `propagateBreak:
|
|
42
|
+
* true`, so subflow `$break` stays local and an agent-level
|
|
43
|
+
* `TranslateFailFast` stage reads `scope.reliabilityFailKind` and converts
|
|
44
|
+
* it into an agent-level `$break(reason)` — letting normal subflow exits
|
|
45
|
+
* (`ok`/`fallback`) leave the agent running while fail-fast stops it. That
|
|
46
|
+
* stage was never built (`grep TranslateFailFast` finds only comments), which
|
|
47
|
+
* is part of why nothing mounts this chart; the live path throws
|
|
48
|
+
* `ReliabilityFailFastError` from `Agent.run` instead.
|
|
35
49
|
*
|
|
36
50
|
* Three-channel discipline preserved:
|
|
37
51
|
* • SCOPE STATE — failKind/failPayload/failReason mapped to parent via
|
|
38
|
-
* outputMapper;
|
|
52
|
+
* outputMapper; for the intended TranslateFailFast.
|
|
39
53
|
* • $emit — passive observability for external consumers.
|
|
40
54
|
* • $break(reason)— control flow + human reason for narrative.
|
|
41
55
|
*/
|
|
@@ -45,6 +59,7 @@ const footprintjs_1 = require("footprintjs");
|
|
|
45
59
|
const CircuitBreaker_js_1 = require("./CircuitBreaker.js");
|
|
46
60
|
const classifyError_js_1 = require("./classifyError.js");
|
|
47
61
|
const typedEmit_js_1 = require("../recorders/core/typedEmit.js");
|
|
62
|
+
const resilienceHooks_js_1 = require("../recorders/core/resilienceHooks.js");
|
|
48
63
|
// ─── Stage IDs (also used for narrative/topology readability) ────────
|
|
49
64
|
const STAGE_IDS = {
|
|
50
65
|
INIT: 'reliability-init',
|
|
@@ -203,7 +218,19 @@ function buildReliabilityGateChart(config) {
|
|
|
203
218
|
throw new CircuitBreaker_js_1.CircuitOpenError(providerEntry.name, nextState.lastErrorMessage, (0, CircuitBreaker_js_1.nextProbeTime)(nextState, breakerConfig));
|
|
204
219
|
}
|
|
205
220
|
}
|
|
206
|
-
|
|
221
|
+
// Hooks are passed here too, so a DECORATED provider does not go
|
|
222
|
+
// dark. This is not cross-emitting: the decorator's own account of
|
|
223
|
+
// its own fixed-cap decision merely happens to occur inside a
|
|
224
|
+
// reliability stage. The two families stay distinct —
|
|
225
|
+
// `reliability.*` = this rules loop's dynamic decisions, `error.*` =
|
|
226
|
+
// the decorator's.
|
|
227
|
+
//
|
|
228
|
+
// NOTE: this chart is currently DEAD — see the file header. The
|
|
229
|
+
// live `.reliability()` path is `executeWithReliability` driving
|
|
230
|
+
// `singleProviderCall` in `core/agent/stages/callLLM.ts`, which
|
|
231
|
+
// passes the same hooks. Wiring the dead site anyway keeps it from
|
|
232
|
+
// being a silent hole if the chart is ever revived.
|
|
233
|
+
const response = await providerEntry.provider.complete(scope.request, (0, resilienceHooks_js_1.resilienceHooks)(scope));
|
|
207
234
|
scope.response = response;
|
|
208
235
|
scope.error = undefined;
|
|
209
236
|
scope.errorKind = 'ok';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildReliabilityGateChart.js","sourceRoot":"","sources":["../../src/reliability/buildReliabilityGateChart.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"buildReliabilityGateChart.js","sourceRoot":"","sources":["../../src/reliability/buildReliabilityGateChart.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,9 +49,12 @@
|
|
|
49
49
|
*
|
|
50
50
|
* HALF-OPEN ──[ probe failure ]──► OPEN (cooldown restarts)
|
|
51
51
|
*
|
|
52
|
-
* `stream()` is decorated identically. `name
|
|
53
|
-
*
|
|
54
|
-
*
|
|
52
|
+
* `stream()` is decorated identically. `name` passes through unchanged
|
|
53
|
+
* (the consumer's existing observability hooks still see the underlying
|
|
54
|
+
* provider's identity), and the optional per-call `LLMCallHooks` is
|
|
55
|
+
* forwarded inward so a decorator nested inside this one can still
|
|
56
|
+
* report. Nothing else is copied — `LLMProvider` has exactly `name`,
|
|
57
|
+
* `complete` and the optional `stream`.
|
|
55
58
|
*
|
|
56
59
|
* **Scope: per-instance, NOT distributed.** Each `withCircuitBreaker(...)`
|
|
57
60
|
* call holds its own breaker state in process memory. If you run 100
|
|
@@ -195,10 +198,13 @@ function withCircuitBreaker(inner, options = {}) {
|
|
|
195
198
|
}
|
|
196
199
|
const wrapped = {
|
|
197
200
|
name: inner.name,
|
|
198
|
-
async complete(req) {
|
|
201
|
+
async complete(req, hooks) {
|
|
199
202
|
rejectFastIfOpen();
|
|
200
203
|
try {
|
|
201
|
-
|
|
204
|
+
// Forward `hooks` — this decorator reports nothing of its own, but
|
|
205
|
+
// it rebuilds a fresh provider object, so an inner decorator's
|
|
206
|
+
// reports are silently swallowed unless they're passed through.
|
|
207
|
+
const res = await inner.complete(req, hooks);
|
|
202
208
|
recordSuccess();
|
|
203
209
|
return res;
|
|
204
210
|
}
|
|
@@ -212,15 +218,16 @@ function withCircuitBreaker(inner, options = {}) {
|
|
|
212
218
|
// it undefined so the consumer's existing capability check
|
|
213
219
|
// (`if (provider.stream)`) still works correctly.
|
|
214
220
|
...(inner.stream && {
|
|
215
|
-
async *stream(req) {
|
|
221
|
+
async *stream(req, hooks) {
|
|
216
222
|
rejectFastIfOpen();
|
|
217
223
|
let yieldedAnyChunk = false;
|
|
218
224
|
try {
|
|
219
225
|
// This stream() method is conditionally defined only when
|
|
220
226
|
// inner.stream exists (see `...(inner.stream && {` above), so
|
|
221
227
|
// inner.stream is guaranteed non-null inside this body.
|
|
228
|
+
// `hooks` is forwarded for the same reason as in complete().
|
|
222
229
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
223
|
-
for await (const chunk of inner.stream(req)) {
|
|
230
|
+
for await (const chunk of inner.stream(req, hooks)) {
|
|
224
231
|
yieldedAnyChunk = true;
|
|
225
232
|
yield chunk;
|
|
226
233
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"withCircuitBreaker.js","sourceRoot":"","sources":["../../src/resilience/withCircuitBreaker.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"withCircuitBreaker.js","sourceRoot":"","sources":["../../src/resilience/withCircuitBreaker.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,17 +34,33 @@ exports.withFallback = void 0;
|
|
|
34
34
|
function withFallback(primary, fallback, options = {}) {
|
|
35
35
|
const shouldFallback = options.shouldFallback ?? defaultShouldFallback;
|
|
36
36
|
const onFallback = options.onFallback;
|
|
37
|
+
/**
|
|
38
|
+
* Report the ONE fact this decorator owns: the primary failed and the
|
|
39
|
+
* fallback is being called instead. Uses the pairwise `primary`/
|
|
40
|
+
* `fallback` names — never a composite chain name — so a
|
|
41
|
+
* `fallbackProvider(a, b, c)` right-fold reports honest `a→b`, `b→c`
|
|
42
|
+
* hops.
|
|
43
|
+
*/
|
|
44
|
+
function reportFellBack(hooks, err) {
|
|
45
|
+
hooks?.onResilience?.({
|
|
46
|
+
kind: 'fell-back',
|
|
47
|
+
primary: primary.name,
|
|
48
|
+
fallback: fallback.name,
|
|
49
|
+
reason: err instanceof Error ? err.message : String(err),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
37
52
|
const wrapped = {
|
|
38
53
|
name: `${primary.name}|${fallback.name}`,
|
|
39
|
-
async complete(req) {
|
|
54
|
+
async complete(req, hooks) {
|
|
40
55
|
try {
|
|
41
|
-
return await primary.complete(req);
|
|
56
|
+
return await primary.complete(req, hooks);
|
|
42
57
|
}
|
|
43
58
|
catch (err) {
|
|
44
59
|
if (!shouldFallback(err))
|
|
45
60
|
throw err;
|
|
46
61
|
onFallback?.(err);
|
|
47
|
-
|
|
62
|
+
reportFellBack(hooks, err);
|
|
63
|
+
return fallback.complete(req, hooks);
|
|
48
64
|
}
|
|
49
65
|
},
|
|
50
66
|
};
|
|
@@ -53,18 +69,20 @@ function withFallback(primary, fallback, options = {}) {
|
|
|
53
69
|
// would replay tokens. Yields from primary as long as it's working;
|
|
54
70
|
// catches errors in the iteration setup or first chunk only.
|
|
55
71
|
if (primary.stream || fallback.stream) {
|
|
56
|
-
wrapped.stream = async function* fallbackStream(req) {
|
|
72
|
+
wrapped.stream = async function* fallbackStream(req, hooks) {
|
|
57
73
|
// No primary stream support → fallback's stream (or its complete-only).
|
|
74
|
+
// Reports NOTHING: nothing failed here, the primary simply has no
|
|
75
|
+
// `stream()`. Calling this a fallback would be a lie.
|
|
58
76
|
if (!primary.stream) {
|
|
59
77
|
if (fallback.stream)
|
|
60
|
-
yield* fallback.stream(req);
|
|
78
|
+
yield* fallback.stream(req, hooks);
|
|
61
79
|
else
|
|
62
|
-
yield* completeAsStream(fallback, req);
|
|
80
|
+
yield* completeAsStream(fallback, req, hooks);
|
|
63
81
|
return;
|
|
64
82
|
}
|
|
65
83
|
let yieldedAny = false;
|
|
66
84
|
try {
|
|
67
|
-
for await (const chunk of primary.stream(req)) {
|
|
85
|
+
for await (const chunk of primary.stream(req, hooks)) {
|
|
68
86
|
yieldedAny = true;
|
|
69
87
|
yield chunk;
|
|
70
88
|
}
|
|
@@ -73,10 +91,11 @@ function withFallback(primary, fallback, options = {}) {
|
|
|
73
91
|
if (yieldedAny || !shouldFallback(err))
|
|
74
92
|
throw err;
|
|
75
93
|
onFallback?.(err);
|
|
94
|
+
reportFellBack(hooks, err);
|
|
76
95
|
if (fallback.stream)
|
|
77
|
-
yield* fallback.stream(req);
|
|
96
|
+
yield* fallback.stream(req, hooks);
|
|
78
97
|
else
|
|
79
|
-
yield* completeAsStream(fallback, req);
|
|
98
|
+
yield* completeAsStream(fallback, req, hooks);
|
|
80
99
|
}
|
|
81
100
|
};
|
|
82
101
|
}
|
|
@@ -98,8 +117,8 @@ function defaultShouldFallback(err) {
|
|
|
98
117
|
* fallback chain still satisfy a `stream()` request even when the
|
|
99
118
|
* fallback only implements `complete()`.
|
|
100
119
|
*/
|
|
101
|
-
async function* completeAsStream(provider, req) {
|
|
102
|
-
const response = await provider.complete(req);
|
|
120
|
+
async function* completeAsStream(provider, req, hooks) {
|
|
121
|
+
const response = await provider.complete(req, hooks);
|
|
103
122
|
yield {
|
|
104
123
|
tokenIndex: 0,
|
|
105
124
|
content: '',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"withFallback.js","sourceRoot":"","sources":["../../src/resilience/withFallback.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;;;
|
|
1
|
+
{"version":3,"file":"withFallback.js","sourceRoot":"","sources":["../../src/resilience/withFallback.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,11 +42,26 @@ function withRetry(provider, options = {}) {
|
|
|
42
42
|
const onRetry = options.onRetry;
|
|
43
43
|
const wrapped = {
|
|
44
44
|
name: `${provider.name}+retry`,
|
|
45
|
-
async complete(req) {
|
|
45
|
+
async complete(req, hooks) {
|
|
46
46
|
let lastError;
|
|
47
|
+
// t0 for the `recovered` report's totalDurationMs. New
|
|
48
|
+
// instrumentation (the decorator did not measure this before v7.8),
|
|
49
|
+
// not a recovered fact.
|
|
50
|
+
const startedMs = Date.now();
|
|
47
51
|
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
48
52
|
try {
|
|
49
|
-
|
|
53
|
+
const res = await provider.complete(req, hooks);
|
|
54
|
+
// Only a success that FOLLOWED a failure is a recovery — a
|
|
55
|
+
// first-try success reports nothing (mirrors the rules loop's
|
|
56
|
+
// guard in reliabilityExecution.ts).
|
|
57
|
+
if (attempt > 1) {
|
|
58
|
+
hooks?.onResilience?.({
|
|
59
|
+
kind: 'recovered',
|
|
60
|
+
attempt,
|
|
61
|
+
totalDurationMs: Date.now() - startedMs,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return res;
|
|
50
65
|
}
|
|
51
66
|
catch (err) {
|
|
52
67
|
lastError = err;
|
|
@@ -55,6 +70,14 @@ function withRetry(provider, options = {}) {
|
|
|
55
70
|
}
|
|
56
71
|
const delay = Math.min(maxDelayMs, initialDelayMs * Math.pow(backoffFactor, attempt - 1));
|
|
57
72
|
onRetry?.(err, attempt + 1, delay);
|
|
73
|
+
hooks?.onResilience?.({
|
|
74
|
+
kind: 'retried',
|
|
75
|
+
attempt: attempt + 1,
|
|
76
|
+
maxAttempts,
|
|
77
|
+
lastError: err instanceof Error ? err.message : String(err),
|
|
78
|
+
backoffMs: delay,
|
|
79
|
+
reason: classifyRetryReason(err),
|
|
80
|
+
});
|
|
58
81
|
await sleep(delay, req.signal);
|
|
59
82
|
}
|
|
60
83
|
}
|
|
@@ -64,14 +87,41 @@ function withRetry(provider, options = {}) {
|
|
|
64
87
|
};
|
|
65
88
|
// Pass-through `stream()` if the underlying provider supports it.
|
|
66
89
|
// No retry on streams (mid-stream resumption is provider-specific).
|
|
90
|
+
// `hooks` must still be FORWARDED: a stacked inner decorator (e.g.
|
|
91
|
+
// withRetry(withFallback(...))) would otherwise go dark on the stream
|
|
92
|
+
// path.
|
|
67
93
|
if (provider.stream) {
|
|
94
|
+
wrapped.stream = (req, hooks) =>
|
|
68
95
|
// Guarded by `if (provider.stream)` above; assertion safe.
|
|
69
96
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
70
|
-
|
|
97
|
+
provider.stream(req, hooks);
|
|
71
98
|
}
|
|
72
99
|
return wrapped;
|
|
73
100
|
}
|
|
74
101
|
exports.withRetry = withRetry;
|
|
102
|
+
/**
|
|
103
|
+
* Classify the ERROR that caused a retry, for `ResilienceReport.reason`.
|
|
104
|
+
*
|
|
105
|
+
* Reads exactly the fields `defaultShouldRetry` inspects, so the label
|
|
106
|
+
* always describes the same signal the default policy acted on. Note this
|
|
107
|
+
* is a classification of the error, NOT of the predicate's reasoning —
|
|
108
|
+
* `shouldRetry` returns a bare boolean, so a custom predicate's rationale
|
|
109
|
+
* is unknowable here. `'http-4xx'` is only reachable via a custom
|
|
110
|
+
* predicate (the default rejects non-429 4xx), which itself is a useful
|
|
111
|
+
* signal.
|
|
112
|
+
*/
|
|
113
|
+
function classifyRetryReason(err) {
|
|
114
|
+
const status = err?.status ?? err?.statusCode;
|
|
115
|
+
if (typeof status !== 'number')
|
|
116
|
+
return 'no-status';
|
|
117
|
+
if (status === 429)
|
|
118
|
+
return 'http-429';
|
|
119
|
+
if (status >= 500)
|
|
120
|
+
return 'http-5xx';
|
|
121
|
+
if (status >= 400)
|
|
122
|
+
return 'http-4xx';
|
|
123
|
+
return `http-${status}`;
|
|
124
|
+
}
|
|
75
125
|
// ── Defaults ────────────────────────────────────────────────────────
|
|
76
126
|
/**
|
|
77
127
|
* Skip retry for AbortError + 4xx-class errors. Retry on everything
|