agentfootprint 2.11.4 → 2.11.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +321 -165
- package/dist/core/Agent.js +55 -1
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/agent/AgentBuilder.js +67 -1
- package/dist/core/agent/AgentBuilder.js.map +1 -1
- package/dist/core/agent/stages/callLLM.js +45 -17
- package/dist/core/agent/stages/callLLM.js.map +1 -1
- package/dist/core/agent/stages/reliabilityExecution.js +291 -0
- package/dist/core/agent/stages/reliabilityExecution.js.map +1 -0
- package/dist/core/agent/stages/toolCalls.js +9 -17
- package/dist/core/agent/stages/toolCalls.js.map +1 -1
- package/dist/core/slots/buildToolsSlot.js +101 -33
- package/dist/core/slots/buildToolsSlot.js.map +1 -1
- package/dist/esm/core/Agent.js +55 -1
- package/dist/esm/core/Agent.js.map +1 -1
- package/dist/esm/core/agent/AgentBuilder.js +67 -1
- package/dist/esm/core/agent/AgentBuilder.js.map +1 -1
- package/dist/esm/core/agent/stages/callLLM.js +45 -17
- package/dist/esm/core/agent/stages/callLLM.js.map +1 -1
- package/dist/esm/core/agent/stages/reliabilityExecution.js +287 -0
- package/dist/esm/core/agent/stages/reliabilityExecution.js.map +1 -0
- package/dist/esm/core/agent/stages/toolCalls.js +9 -17
- package/dist/esm/core/agent/stages/toolCalls.js.map +1 -1
- package/dist/esm/core/slots/buildToolsSlot.js +101 -33
- package/dist/esm/core/slots/buildToolsSlot.js.map +1 -1
- package/dist/esm/events/registry.js +6 -0
- package/dist/esm/events/registry.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/recorders/core/ToolsRecorder.js +23 -0
- package/dist/esm/recorders/core/ToolsRecorder.js.map +1 -0
- package/dist/esm/tool-providers/gatedTools.js +8 -3
- package/dist/esm/tool-providers/gatedTools.js.map +1 -1
- package/dist/events/registry.js +6 -0
- package/dist/events/registry.js.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/recorders/core/ToolsRecorder.js +27 -0
- package/dist/recorders/core/ToolsRecorder.js.map +1 -0
- package/dist/tool-providers/gatedTools.js +8 -3
- package/dist/tool-providers/gatedTools.js.map +1 -1
- package/dist/types/core/Agent.d.ts +9 -1
- package/dist/types/core/Agent.d.ts.map +1 -1
- package/dist/types/core/agent/AgentBuilder.d.ts +61 -0
- package/dist/types/core/agent/AgentBuilder.d.ts.map +1 -1
- package/dist/types/core/agent/stages/callLLM.d.ts +8 -0
- package/dist/types/core/agent/stages/callLLM.d.ts.map +1 -1
- package/dist/types/core/agent/stages/reliabilityExecution.d.ts +66 -0
- package/dist/types/core/agent/stages/reliabilityExecution.d.ts.map +1 -0
- package/dist/types/core/agent/stages/toolCalls.d.ts +8 -0
- package/dist/types/core/agent/stages/toolCalls.d.ts.map +1 -1
- package/dist/types/core/slots/buildToolsSlot.d.ts +24 -4
- package/dist/types/core/slots/buildToolsSlot.d.ts.map +1 -1
- package/dist/types/events/payloads.d.ts +39 -0
- package/dist/types/events/payloads.d.ts.map +1 -1
- package/dist/types/events/registry.d.ts +7 -1
- package/dist/types/events/registry.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/recorders/core/ToolsRecorder.d.ts +19 -0
- package/dist/types/recorders/core/ToolsRecorder.d.ts.map +1 -0
- package/dist/types/tool-providers/gatedTools.d.ts.map +1 -1
- package/dist/types/tool-providers/types.d.ts +43 -7
- package/dist/types/tool-providers/types.d.ts.map +1 -1
- package/package.json +6 -1
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* reliabilityExecution — the retry-loop helper invoked by `callLLM`
|
|
4
|
+
* when `Agent.create(...).reliability(config)` is configured.
|
|
5
|
+
*
|
|
6
|
+
* Wraps a single-shot LLM call with rules-based reliability semantics:
|
|
7
|
+
*
|
|
8
|
+
* PreCheck rules → continue / fail-fast
|
|
9
|
+
* ↓
|
|
10
|
+
* provider call → response | error
|
|
11
|
+
* ↓
|
|
12
|
+
* PostDecide rules → ok / retry / retry-other / fallback / fail-fast
|
|
13
|
+
* ↓
|
|
14
|
+
* loop or commit
|
|
15
|
+
*
|
|
16
|
+
* The loop runs in JS within a SINGLE footprintjs stage execution. The
|
|
17
|
+
* trace shows one CallLLM stage that internally retried N times. Richer
|
|
18
|
+
* "every retry as a separate stage" tracing is the v2.11.6+ work via
|
|
19
|
+
* `buildReliabilityGateChart` (which trades streaming support for
|
|
20
|
+
* stage-level granularity).
|
|
21
|
+
*
|
|
22
|
+
* Streaming + reliability semantics — first-chunk arbitration:
|
|
23
|
+
* • Pre-first-chunk failures (connection, headers, breaker-open):
|
|
24
|
+
* full rule set fires (retry / retry-other / fallback / fail-fast).
|
|
25
|
+
* • Post-first-chunk failures (mid-stream): rules can ONLY emit
|
|
26
|
+
* `ok` (commit what we have) or `fail-fast`. Retry / retry-other /
|
|
27
|
+
* fallback are escalated to fail-fast with kind
|
|
28
|
+
* `'mid-stream-not-retryable'`. Matches LangChain's
|
|
29
|
+
* `RunnableWithFallbacks` first-chunk arbitration pattern.
|
|
30
|
+
*
|
|
31
|
+
* On fail-fast: writes `failKind` + `failPayload` to agent scope and
|
|
32
|
+
* calls `$break(reason)`. The agent's main chart catches the break;
|
|
33
|
+
* `Agent.run()` translates it into a typed `ReliabilityFailFastError`
|
|
34
|
+
* at the API boundary (via `TranslateFailFast` stage).
|
|
35
|
+
*
|
|
36
|
+
* Closure-local state (NOT scope):
|
|
37
|
+
* • `attempt` — 1-indexed attempt counter
|
|
38
|
+
* • `providerIdx` — index into the failover list
|
|
39
|
+
* • `breakerStates` — per-provider breaker state (Map)
|
|
40
|
+
* • `attemptsPerProvider` — per-provider counter
|
|
41
|
+
*
|
|
42
|
+
* Why closure-local: this is one footprintjs stage execution. Putting
|
|
43
|
+
* counters into scope would commit them across iterations of the
|
|
44
|
+
* agent's outer ReAct loop, which is not the intent.
|
|
45
|
+
*/
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.executeWithReliability = exports.MID_STREAM_KIND = void 0;
|
|
48
|
+
const CircuitBreaker_js_1 = require("../../../reliability/CircuitBreaker.js");
|
|
49
|
+
const classifyError_js_1 = require("../../../reliability/classifyError.js");
|
|
50
|
+
/** Sentinel kind written to scope on a mid-stream failure that the
|
|
51
|
+
* rules wanted to retry. Surfaces in `ReliabilityFailFastError.kind`. */
|
|
52
|
+
exports.MID_STREAM_KIND = 'mid-stream-not-retryable';
|
|
53
|
+
/**
|
|
54
|
+
* Run the reliability retry loop. Returns the committed `LLMResponse`
|
|
55
|
+
* on success; calls `scope.$break(reason)` and returns `undefined` on
|
|
56
|
+
* fail-fast (caller short-circuits when undefined is returned).
|
|
57
|
+
*/
|
|
58
|
+
async function executeWithReliability(scope, request, config, defaultProvider, defaultProviderName, defaultModel, callFn) {
|
|
59
|
+
const preRules = config.preCheck ?? [];
|
|
60
|
+
const postRules = config.postDecide ?? [];
|
|
61
|
+
const providers = config.providers ?? [];
|
|
62
|
+
const breakerConfig = config.circuitBreaker;
|
|
63
|
+
const fallbackFn = config.fallback;
|
|
64
|
+
// Closure-local state — see header comment for rationale.
|
|
65
|
+
let attempt = 0;
|
|
66
|
+
let providerIdx = 0;
|
|
67
|
+
let firstChunkSeen = false;
|
|
68
|
+
const breakerStates = {};
|
|
69
|
+
const attemptsPerProvider = {};
|
|
70
|
+
// Helper: build the reliability scope view rules read.
|
|
71
|
+
const reliabilityScope = () => {
|
|
72
|
+
const currentProvider = providerEntry().name;
|
|
73
|
+
return {
|
|
74
|
+
request,
|
|
75
|
+
providersCount: providers.length,
|
|
76
|
+
hasFallback: fallbackFn !== undefined,
|
|
77
|
+
attempt,
|
|
78
|
+
providerIdx,
|
|
79
|
+
currentProvider,
|
|
80
|
+
canSwitchProvider: providerIdx < providers.length - 1,
|
|
81
|
+
response: lastResponse,
|
|
82
|
+
error: lastError,
|
|
83
|
+
errorKind: lastErrorKind,
|
|
84
|
+
latencyMs: lastLatencyMs,
|
|
85
|
+
attemptsPerProvider,
|
|
86
|
+
breakerStates,
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
// Pick provider for current attempt — failover list if configured,
|
|
90
|
+
// else the agent's default provider.
|
|
91
|
+
const providerEntry = () => {
|
|
92
|
+
if (providers.length > 0) {
|
|
93
|
+
const entry = providers[providerIdx];
|
|
94
|
+
if (entry)
|
|
95
|
+
return entry;
|
|
96
|
+
}
|
|
97
|
+
return { name: defaultProviderName, provider: defaultProvider, model: defaultModel };
|
|
98
|
+
};
|
|
99
|
+
// Helper: build failPayload + write scope + emit + break.
|
|
100
|
+
const failFast = (phase, kind, label) => {
|
|
101
|
+
const cur = providerEntry();
|
|
102
|
+
const payload = {
|
|
103
|
+
phase,
|
|
104
|
+
attempt,
|
|
105
|
+
providerUsed: cur.name,
|
|
106
|
+
errorKind: lastErrorKind,
|
|
107
|
+
...(lastError?.message !== undefined && { errorMessage: lastError.message }),
|
|
108
|
+
};
|
|
109
|
+
const reason = `reliability-${phase}: ${label}`;
|
|
110
|
+
scope.reliabilityFailKind = kind;
|
|
111
|
+
scope.reliabilityFailPayload =
|
|
112
|
+
payload;
|
|
113
|
+
scope.reliabilityFailReason = reason;
|
|
114
|
+
if (lastError !== undefined) {
|
|
115
|
+
// Store the originating error as plain strings — Error instances
|
|
116
|
+
// don't round-trip cleanly through scope's structuredClone. The
|
|
117
|
+
// Agent.run() boundary reconstructs a new Error from these for
|
|
118
|
+
// ReliabilityFailFastError.cause; consumer's `instanceof` checks
|
|
119
|
+
// get a stable Error subclass without us needing to preserve the
|
|
120
|
+
// exact prototype.
|
|
121
|
+
scope.reliabilityFailCauseMessage =
|
|
122
|
+
lastError.message;
|
|
123
|
+
scope.reliabilityFailCauseName =
|
|
124
|
+
lastError.name;
|
|
125
|
+
}
|
|
126
|
+
scope.$emit('agentfootprint.reliability.fail_fast', {
|
|
127
|
+
phase,
|
|
128
|
+
kind,
|
|
129
|
+
label,
|
|
130
|
+
attempt,
|
|
131
|
+
providerUsed: cur.name,
|
|
132
|
+
errorKind: lastErrorKind,
|
|
133
|
+
...(lastError?.message !== undefined && { errorMessage: lastError.message }),
|
|
134
|
+
});
|
|
135
|
+
scope.$break(reason);
|
|
136
|
+
return undefined;
|
|
137
|
+
};
|
|
138
|
+
// Mutable per-attempt state. Outside the loop so reliabilityScope() can read.
|
|
139
|
+
let lastResponse;
|
|
140
|
+
let lastError;
|
|
141
|
+
let lastErrorKind = 'ok';
|
|
142
|
+
let lastLatencyMs = 0;
|
|
143
|
+
// We DON'T use footprintjs `decide()` here — its predicates bind
|
|
144
|
+
// to the active agent scope via TypedScope, but our `ReliabilityRule`
|
|
145
|
+
// predicates take the synthesized `ReliabilityScope` view (a closure-
|
|
146
|
+
// local projection over the retry-loop's mutable state). Iterate
|
|
147
|
+
// rules manually instead. The `decide()` import is kept available
|
|
148
|
+
// for `buildReliabilityGateChart` which DOES use it via subflows.
|
|
149
|
+
const evalRules = (rules, fallback) => {
|
|
150
|
+
const sv = reliabilityScope();
|
|
151
|
+
for (const rule of rules) {
|
|
152
|
+
try {
|
|
153
|
+
if (rule.when(sv))
|
|
154
|
+
return { branch: rule.then, matched: rule };
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
// Predicate threw — skip this rule. Per ReliabilityRule
|
|
158
|
+
// contract predicates should be pure; treat throws as no-match.
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return { branch: fallback };
|
|
162
|
+
};
|
|
163
|
+
if (preRules.length > 0) {
|
|
164
|
+
const pre = evalRules(preRules, 'continue');
|
|
165
|
+
if (pre.branch === 'fail-fast') {
|
|
166
|
+
const kind = pre.matched?.kind ?? 'pre-check-failed';
|
|
167
|
+
const label = pre.matched?.label ?? kind;
|
|
168
|
+
return failFast('pre-check', kind, label);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// ─── Retry loop ─────────────────────────────────────────────────
|
|
172
|
+
// Hard upper bound prevents pathological rule sets from looping forever.
|
|
173
|
+
// Most consumer rules cap retry at 3-5 via `attempt < N` predicates;
|
|
174
|
+
// this is just a safety net.
|
|
175
|
+
const MAX_LOOP = 50;
|
|
176
|
+
for (let loop = 0; loop < MAX_LOOP; loop++) {
|
|
177
|
+
const cur = providerEntry();
|
|
178
|
+
// Breaker check (pure): admit + transition based on cooldown.
|
|
179
|
+
if (breakerConfig !== undefined) {
|
|
180
|
+
const current = breakerStates[cur.name] ?? (0, CircuitBreaker_js_1.initialBreakerState)();
|
|
181
|
+
const { admitted, nextState } = (0, CircuitBreaker_js_1.admitCall)(current, breakerConfig);
|
|
182
|
+
breakerStates[cur.name] = nextState;
|
|
183
|
+
if (!admitted) {
|
|
184
|
+
lastError = new CircuitBreaker_js_1.CircuitOpenError(cur.name, nextState.lastErrorMessage, (0, CircuitBreaker_js_1.nextProbeTime)(nextState, breakerConfig));
|
|
185
|
+
lastErrorKind = 'circuit-open';
|
|
186
|
+
lastResponse = undefined;
|
|
187
|
+
// Skip the call; jump straight to PostDecide so rules can
|
|
188
|
+
// route on errorKind === 'circuit-open'.
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Fire the actual call (unless breaker pre-emptied above).
|
|
192
|
+
if (lastErrorKind !== 'circuit-open') {
|
|
193
|
+
const t0 = Date.now();
|
|
194
|
+
try {
|
|
195
|
+
const response = await callFn(request, {
|
|
196
|
+
onFirstChunk: () => {
|
|
197
|
+
firstChunkSeen = true;
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
lastResponse = response;
|
|
201
|
+
lastError = undefined;
|
|
202
|
+
lastErrorKind = 'ok';
|
|
203
|
+
if (breakerConfig !== undefined) {
|
|
204
|
+
breakerStates[cur.name] = (0, CircuitBreaker_js_1.recordSuccess)(breakerStates[cur.name] ?? (0, CircuitBreaker_js_1.initialBreakerState)(), breakerConfig);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
catch (err) {
|
|
208
|
+
lastResponse = undefined;
|
|
209
|
+
lastError = err instanceof Error ? err : new Error(String(err));
|
|
210
|
+
lastErrorKind = (0, classifyError_js_1.classifyError)(err);
|
|
211
|
+
if (breakerConfig !== undefined && !(err instanceof CircuitBreaker_js_1.CircuitOpenError)) {
|
|
212
|
+
breakerStates[cur.name] = (0, CircuitBreaker_js_1.recordFailure)(breakerStates[cur.name] ?? (0, CircuitBreaker_js_1.initialBreakerState)(), err, breakerConfig);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
finally {
|
|
216
|
+
lastLatencyMs = Date.now() - t0;
|
|
217
|
+
attemptsPerProvider[cur.name] = (attemptsPerProvider[cur.name] ?? 0) + 1;
|
|
218
|
+
attempt += 1;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// PostDecide
|
|
222
|
+
let postBranch = 'ok';
|
|
223
|
+
let matchedRule;
|
|
224
|
+
if (postRules.length > 0) {
|
|
225
|
+
const post = evalRules(postRules, lastError === undefined ? 'ok' : 'fail-fast');
|
|
226
|
+
postBranch = post.branch;
|
|
227
|
+
matchedRule = post.matched;
|
|
228
|
+
}
|
|
229
|
+
else if (lastError !== undefined) {
|
|
230
|
+
// No postDecide rules + error → default fail-fast.
|
|
231
|
+
postBranch = 'fail-fast';
|
|
232
|
+
}
|
|
233
|
+
// First-chunk arbitration: post-first-chunk only `ok` and
|
|
234
|
+
// `fail-fast` are honored. Other decisions escalate to fail-fast
|
|
235
|
+
// with the mid-stream-not-retryable kind. This matches the
|
|
236
|
+
// LangChain RunnableWithFallbacks pattern documented in the
|
|
237
|
+
// streaming-vs-reliability design memo.
|
|
238
|
+
if (firstChunkSeen && postBranch !== 'ok' && postBranch !== 'fail-fast') {
|
|
239
|
+
return failFast('post-decide', exports.MID_STREAM_KIND, `mid-stream failure not retryable (rule wanted '${postBranch}')`);
|
|
240
|
+
}
|
|
241
|
+
if (postBranch === 'ok') {
|
|
242
|
+
// Success exit. lastResponse is the committed value.
|
|
243
|
+
if (lastResponse !== undefined)
|
|
244
|
+
return lastResponse;
|
|
245
|
+
// 'ok' with no response is misconfiguration; fall through to
|
|
246
|
+
// fail-fast as a defensive default.
|
|
247
|
+
return failFast('post-decide', 'no-response', 'rule said ok but no response captured');
|
|
248
|
+
}
|
|
249
|
+
if (postBranch === 'fail-fast') {
|
|
250
|
+
const kind = matchedRule?.kind ?? lastErrorKind;
|
|
251
|
+
const label = matchedRule?.label ?? matchedRule?.kind ?? lastErrorKind;
|
|
252
|
+
return failFast('post-decide', kind, label);
|
|
253
|
+
}
|
|
254
|
+
if (postBranch === 'retry') {
|
|
255
|
+
// Loop continues; attempt was already bumped in finally.
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
if (postBranch === 'retry-other') {
|
|
259
|
+
providerIdx += 1;
|
|
260
|
+
if (providerIdx >= Math.max(providers.length, 1)) {
|
|
261
|
+
// Walked past the last provider — convert to fail-fast.
|
|
262
|
+
return failFast('post-decide', 'no-more-providers', 'retry-other requested but no more providers');
|
|
263
|
+
}
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
if (postBranch === 'fallback') {
|
|
267
|
+
if (!fallbackFn) {
|
|
268
|
+
return failFast('post-decide', 'fallback-not-configured', 'rule wanted fallback but no fallback fn provided');
|
|
269
|
+
}
|
|
270
|
+
try {
|
|
271
|
+
const repaired = await fallbackFn(request, lastError);
|
|
272
|
+
// Successful fallback — commit and exit.
|
|
273
|
+
return repaired;
|
|
274
|
+
}
|
|
275
|
+
catch (fallbackErr) {
|
|
276
|
+
// Fallback threw — re-classify and let next iteration's
|
|
277
|
+
// post-decide rules route on the new error.
|
|
278
|
+
lastError = fallbackErr instanceof Error ? fallbackErr : new Error(String(fallbackErr));
|
|
279
|
+
lastErrorKind = (0, classifyError_js_1.classifyError)(fallbackErr);
|
|
280
|
+
lastResponse = undefined;
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// Unknown branch — fail-fast as a defensive default.
|
|
285
|
+
return failFast('post-decide', 'unknown-branch', `unknown decision '${postBranch}'`);
|
|
286
|
+
}
|
|
287
|
+
// Hit the safety cap.
|
|
288
|
+
return failFast('post-decide', 'max-loop-exceeded', `reliability loop exceeded ${MAX_LOOP} iterations`);
|
|
289
|
+
}
|
|
290
|
+
exports.executeWithReliability = executeWithReliability;
|
|
291
|
+
//# sourceMappingURL=reliabilityExecution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reliabilityExecution.js","sourceRoot":"","sources":["../../../../src/core/agent/stages/reliabilityExecution.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,7 +34,7 @@ const validators_js_1 = require("../validators.js");
|
|
|
34
34
|
* Build the pausable tool-call handler for the agent's chart.
|
|
35
35
|
*/
|
|
36
36
|
function buildToolCallsHandler(deps) {
|
|
37
|
-
const { registryByName, externalToolProvider, permissionChecker } = deps;
|
|
37
|
+
const { registryByName, externalToolProvider, providerToolCache, permissionChecker } = deps;
|
|
38
38
|
return {
|
|
39
39
|
execute: async (scope) => {
|
|
40
40
|
const toolCalls = scope.llmLatestToolCalls;
|
|
@@ -53,28 +53,20 @@ function buildToolCallsHandler(deps) {
|
|
|
53
53
|
...(toolCalls.length > 0 && { toolCalls }),
|
|
54
54
|
});
|
|
55
55
|
}
|
|
56
|
-
// Resolve a tool by name
|
|
57
|
-
//
|
|
58
|
-
//
|
|
59
|
-
//
|
|
60
|
-
//
|
|
56
|
+
// Resolve a tool by name. The Tools slot already invoked
|
|
57
|
+
// `provider.list(ctx)` this iteration and cached the resolved
|
|
58
|
+
// Tool[] in the closure-shared providerToolCache — read from
|
|
59
|
+
// there to avoid a second discovery call (especially important
|
|
60
|
+
// for async network-backed providers). Same iteration ctx →
|
|
61
|
+
// same result, so the cache is correct.
|
|
61
62
|
const lookupTool = (toolName) => {
|
|
62
63
|
const fromRegistry = registryByName.get(toolName);
|
|
63
64
|
if (fromRegistry)
|
|
64
65
|
return fromRegistry;
|
|
65
66
|
if (!externalToolProvider)
|
|
66
67
|
return undefined;
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
const ctx = {
|
|
70
|
-
iteration: scope.iteration,
|
|
71
|
-
...(activatedIds.length > 0 && {
|
|
72
|
-
activeSkillId: activatedIds[activatedIds.length - 1],
|
|
73
|
-
}),
|
|
74
|
-
...(identity && { identity }),
|
|
75
|
-
};
|
|
76
|
-
const visible = externalToolProvider.list(ctx);
|
|
77
|
-
return visible.find((t) => t.schema.name === toolName);
|
|
68
|
+
const cached = providerToolCache?.current ?? [];
|
|
69
|
+
return cached.find((t) => t.schema.name === toolName);
|
|
78
70
|
};
|
|
79
71
|
for (const tc of toolCalls) {
|
|
80
72
|
const tool = lookupTool(tc.name);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolCalls.js","sourceRoot":"","sources":["../../../../src/core/agent/stages/toolCalls.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;;;AAKH,uEAAiE;AAEjE,6CAAgD;
|
|
1
|
+
{"version":3,"file":"toolCalls.js","sourceRoot":"","sources":["../../../../src/core/agent/stages/toolCalls.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ exports.buildToolsSlot = void 0;
|
|
|
16
16
|
const footprintjs_1 = require("footprintjs");
|
|
17
17
|
const conventions_js_1 = require("../../conventions.js");
|
|
18
18
|
const types_js_1 = require("../../recorders/core/types.js");
|
|
19
|
+
const typedEmit_js_1 = require("../../recorders/core/typedEmit.js");
|
|
19
20
|
const helpers_js_1 = require("./helpers.js");
|
|
20
21
|
/**
|
|
21
22
|
* Build the Tools slot subflow.
|
|
@@ -30,16 +31,94 @@ function buildToolsSlot(config) {
|
|
|
30
31
|
const budgetCap = config.budgetCap ?? 2000;
|
|
31
32
|
const tools = config.tools;
|
|
32
33
|
const toolProvider = config.toolProvider;
|
|
33
|
-
|
|
34
|
+
const providerToolCache = config.providerToolCache;
|
|
35
|
+
// Stage 1 — Discover: consult the external ToolProvider (if any) and
|
|
36
|
+
// resolve its Tool[] for this iteration. ALWAYS runs (even when no
|
|
37
|
+
// provider) so the trace shape is consistent across agents — the
|
|
38
|
+
// no-provider path early-returns in microseconds. When a provider IS
|
|
39
|
+
// set, this stage owns the entire async-discovery boundary:
|
|
40
|
+
//
|
|
41
|
+
// • own runtimeStageId (e.g., `sf-tools/discover#7`) so KeyedRecorder
|
|
42
|
+
// and SequenceRecorder can scope per-discovery latency / errors
|
|
43
|
+
// • own InOutRecorder boundary (entry/exit pair)
|
|
44
|
+
// • own narrative entry separating "I called the hub" from "I built
|
|
45
|
+
// the slot"
|
|
46
|
+
// • emits `tools.discovery_started`, `tools.discovery_completed` (or
|
|
47
|
+
// `tools.discovery_failed`) with timing + provider id
|
|
48
|
+
//
|
|
49
|
+
// Sync providers still pay zero microtask overhead — the dynamic
|
|
50
|
+
// `instanceof Promise` check skips await for non-Promise returns.
|
|
51
|
+
const discoverStage = async (scope) => {
|
|
52
|
+
if (!toolProvider)
|
|
53
|
+
return; // No-op fast path: keeps trace shape consistent.
|
|
54
|
+
const args = scope.$getArgs();
|
|
55
|
+
const iteration = args.iteration ?? 1;
|
|
56
|
+
const env = scope.$getEnv();
|
|
57
|
+
const activatedIds = scope.$getValue('activatedInjectionIds') ?? [];
|
|
58
|
+
const identity = scope.$getValue('runIdentity');
|
|
59
|
+
const ctx = {
|
|
60
|
+
iteration,
|
|
61
|
+
...(activatedIds.length > 0 && { activeSkillId: activatedIds[activatedIds.length - 1] }),
|
|
62
|
+
...(identity && { identity }),
|
|
63
|
+
...(env.signal && { signal: env.signal }),
|
|
64
|
+
};
|
|
65
|
+
(0, typedEmit_js_1.typedEmit)(scope, 'agentfootprint.tools.discovery_started', {
|
|
66
|
+
providerId: toolProvider.id,
|
|
67
|
+
iteration,
|
|
68
|
+
});
|
|
69
|
+
const startMs = Date.now();
|
|
70
|
+
let visibleTools;
|
|
71
|
+
try {
|
|
72
|
+
// Dynamic check — sync providers skip the await microtask.
|
|
73
|
+
const result = toolProvider.list(ctx);
|
|
74
|
+
visibleTools = result instanceof Promise ? await result : result;
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
// Discovery failure is loud by design. Emit the typed event
|
|
78
|
+
// with the providerId so consumers can route alerts; then
|
|
79
|
+
// re-throw so a configured `reliability` rule decides whether
|
|
80
|
+
// to retry / fall back / fail-fast. Silently dropping tools
|
|
81
|
+
// mid-conversation creates non-deterministic agent behavior
|
|
82
|
+
// harder to debug than a crash.
|
|
83
|
+
const errMessage = err instanceof Error ? err.message : String(err);
|
|
84
|
+
const errName = err instanceof Error ? err.name : 'Error';
|
|
85
|
+
(0, typedEmit_js_1.typedEmit)(scope, 'agentfootprint.tools.discovery_failed', {
|
|
86
|
+
providerId: toolProvider.id,
|
|
87
|
+
error: errMessage,
|
|
88
|
+
errorName: errName,
|
|
89
|
+
iteration,
|
|
90
|
+
durationMs: Date.now() - startMs,
|
|
91
|
+
});
|
|
92
|
+
throw err;
|
|
93
|
+
}
|
|
94
|
+
(0, typedEmit_js_1.typedEmit)(scope, 'agentfootprint.tools.discovery_completed', {
|
|
95
|
+
providerId: toolProvider.id,
|
|
96
|
+
iteration,
|
|
97
|
+
durationMs: Date.now() - startMs,
|
|
98
|
+
toolCount: visibleTools.length,
|
|
99
|
+
});
|
|
100
|
+
// Cache the resolved Tool[] in the closure-shared ProviderToolCache.
|
|
101
|
+
// The Compose stage reads providerSchemas from here; the toolCalls
|
|
102
|
+
// handler reads the executable Tool objects on dispatch. Both share
|
|
103
|
+
// ONE list() call per iteration. The cache lives outside scope
|
|
104
|
+
// because Tool objects carry `execute` functions that can't be
|
|
105
|
+
// `structuredClone`d into the transactional memory layer.
|
|
106
|
+
if (providerToolCache)
|
|
107
|
+
providerToolCache.current = visibleTools;
|
|
108
|
+
};
|
|
109
|
+
// Stage 2 — Compose: merges static + provider + per-skill schemas
|
|
110
|
+
// into the tool slot. Pure compute, sync, fast. Reads provider tools
|
|
111
|
+
// from `providerToolCache.current` populated by the Discover stage.
|
|
112
|
+
const composeStage = (scope) => {
|
|
34
113
|
const args = scope.$getArgs();
|
|
35
114
|
const iteration = args.iteration ?? 1;
|
|
36
115
|
const injections = tools.map((t, i) => {
|
|
37
116
|
const summary = `${t.name}: ${t.description}`;
|
|
38
117
|
// `source: 'registry'` — tools configured at build time via
|
|
39
|
-
// `.tool(...)` are baseline API flow (the static tool list
|
|
40
|
-
//
|
|
41
|
-
//
|
|
42
|
-
//
|
|
118
|
+
// `.tool(...)` are baseline API flow (the static tool list sent
|
|
119
|
+
// to the LLM), NOT context engineering. Skills / Instructions
|
|
120
|
+
// that gate tools dynamically tag their injections with their
|
|
121
|
+
// flavor below.
|
|
43
122
|
return {
|
|
44
123
|
contentSummary: (0, helpers_js_1.truncate)(summary, 80),
|
|
45
124
|
contentHash: (0, helpers_js_1.fnv1a)(`tool:${t.name}:${t.description}`),
|
|
@@ -51,23 +130,9 @@ function buildToolsSlot(config) {
|
|
|
51
130
|
position: i,
|
|
52
131
|
};
|
|
53
132
|
});
|
|
54
|
-
// Block A5/Neo follow-up: when an external `ToolProvider` is
|
|
55
|
-
// configured, consult it per iteration. Closure-held in
|
|
56
|
-
// `toolProvider` since scope can't carry functions. The provider
|
|
57
|
-
// sees `{ iteration, activeSkillId, identity }` so dynamic
|
|
58
|
-
// chains (`gatedTools`, `skillScopedTools`) react to the
|
|
59
|
-
// current activation state.
|
|
60
133
|
const providerSchemas = [];
|
|
61
|
-
if (toolProvider) {
|
|
62
|
-
const
|
|
63
|
-
const identity = scope.$getValue('runIdentity');
|
|
64
|
-
const ctx = {
|
|
65
|
-
iteration,
|
|
66
|
-
...(activatedIds.length > 0 && { activeSkillId: activatedIds[activatedIds.length - 1] }),
|
|
67
|
-
...(identity && { identity }),
|
|
68
|
-
};
|
|
69
|
-
const visibleTools = toolProvider.list(ctx);
|
|
70
|
-
for (const t of visibleTools) {
|
|
134
|
+
if (toolProvider && providerToolCache) {
|
|
135
|
+
for (const t of providerToolCache.current) {
|
|
71
136
|
const schema = t.schema;
|
|
72
137
|
providerSchemas.push(schema);
|
|
73
138
|
const summary = `${schema.name}: ${schema.description}`;
|
|
@@ -83,8 +148,8 @@ function buildToolsSlot(config) {
|
|
|
83
148
|
});
|
|
84
149
|
}
|
|
85
150
|
}
|
|
86
|
-
// Active Injections targeting the tools slot (Skills with
|
|
87
|
-
//
|
|
151
|
+
// Active Injections targeting the tools slot (Skills with tools=[…]).
|
|
152
|
+
// Filter activeInjections by `inject.tools`.
|
|
88
153
|
const activeInjections = scope.$getValue('activeInjections') ?? [];
|
|
89
154
|
const dynamicSchemas = [];
|
|
90
155
|
for (const inj of activeInjections) {
|
|
@@ -109,17 +174,17 @@ function buildToolsSlot(config) {
|
|
|
109
174
|
}
|
|
110
175
|
scope.$setValue(conventions_js_1.INJECTION_KEYS.TOOLS, injections);
|
|
111
176
|
// Merge schemas from all three sources, deduping by tool name.
|
|
112
|
-
// Order: static .tool() registry FIRST (auto-attached read_skill
|
|
113
|
-
//
|
|
114
|
-
//
|
|
115
|
-
//
|
|
177
|
+
// Order: static .tool() registry FIRST (auto-attached read_skill /
|
|
178
|
+
// list_skills land here when `.skills(registry)` is wired), then
|
|
179
|
+
// external `.toolProvider()` output, then per-skill inject.tools.
|
|
180
|
+
// First occurrence wins.
|
|
116
181
|
//
|
|
117
182
|
// Why dedupe matters: Neo wires `gatedTools(staticTools([listSkills,
|
|
118
|
-
// readSkill]), policy.isAllowed)` AND calls `.skills(registry)`
|
|
119
|
-
//
|
|
120
|
-
//
|
|
121
|
-
//
|
|
122
|
-
//
|
|
183
|
+
// readSkill]), policy.isAllowed)` AND calls `.skills(registry)` —
|
|
184
|
+
// the framework auto-attaches its own `read_skill` from the skill
|
|
185
|
+
// registry, AND the consumer's toolProvider emits one too. Without
|
|
186
|
+
// dedupe both reach the LLM and Anthropic rejects the request:
|
|
187
|
+
// "tools: Tool names must be unique."
|
|
123
188
|
const seen = new Set();
|
|
124
189
|
const merged = [];
|
|
125
190
|
for (const t of [...tools, ...providerSchemas, ...dynamicSchemas]) {
|
|
@@ -130,7 +195,10 @@ function buildToolsSlot(config) {
|
|
|
130
195
|
}
|
|
131
196
|
scope.toolSchemas = merged;
|
|
132
197
|
scope.$setValue(types_js_1.COMPOSITION_KEYS.SLOT_COMPOSED, (0, helpers_js_1.composeSlot)('tools', iteration, injections, budgetCap, toolProvider ? 'registry+provider+injections' : 'registry+injections'));
|
|
133
|
-
}
|
|
198
|
+
};
|
|
199
|
+
return (0, footprintjs_1.flowChart)('Discover', discoverStage, 'discover', undefined, 'Discover provider tools')
|
|
200
|
+
.addFunction('Compose', composeStage, 'compose', 'Compose tools slot')
|
|
201
|
+
.build();
|
|
134
202
|
}
|
|
135
203
|
exports.buildToolsSlot = buildToolsSlot;
|
|
136
204
|
//# sourceMappingURL=buildToolsSlot.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildToolsSlot.js","sourceRoot":"","sources":["../../../src/core/slots/buildToolsSlot.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;AAEH,6CAAwC;AAGxC,yDAAsD;AAEtD,4DAAiE;
|
|
1
|
+
{"version":3,"file":"buildToolsSlot.js","sourceRoot":"","sources":["../../../src/core/slots/buildToolsSlot.ts"],"names":[],"mappings":"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"}
|