agentfootprint 9.90.0 → 9.92.1
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/AGENTS.md +1 -1
- package/CHANGELOG.md +213 -0
- package/CLAUDE.md +1 -1
- package/ai-instructions/claude-code/SKILL.md +1 -1
- package/dist/core/Agent.js +23 -7
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/LLMCall.js +62 -7
- package/dist/core/LLMCall.js.map +1 -1
- package/dist/core/agent/buildAgentMessageApiChart.js +36 -3
- package/dist/core/agent/buildAgentMessageApiChart.js.map +1 -1
- package/dist/core/agent/buildMessageApiChart.js +26 -3
- package/dist/core/agent/buildMessageApiChart.js.map +1 -1
- package/dist/core/agent/buildToolRegistry.js +90 -33
- package/dist/core/agent/buildToolRegistry.js.map +1 -1
- package/dist/core/agent/messageApiReceipt.js +77 -0
- package/dist/core/agent/messageApiReceipt.js.map +1 -0
- package/dist/core/agent/stages/callLLM.js +1 -5
- package/dist/core/agent/stages/callLLM.js.map +1 -1
- package/dist/core/agent/stages/toolCalls.js +176 -28
- package/dist/core/agent/stages/toolCalls.js.map +1 -1
- package/dist/core/slots/buildToolsSlot.js +209 -62
- package/dist/core/slots/buildToolsSlot.js.map +1 -1
- package/dist/esm/core/Agent.js +24 -8
- package/dist/esm/core/Agent.js.map +1 -1
- package/dist/esm/core/LLMCall.d.ts +18 -0
- package/dist/esm/core/LLMCall.js +63 -8
- package/dist/esm/core/LLMCall.js.map +1 -1
- package/dist/esm/core/agent/buildAgentMessageApiChart.d.ts +22 -0
- package/dist/esm/core/agent/buildAgentMessageApiChart.js +37 -4
- package/dist/esm/core/agent/buildAgentMessageApiChart.js.map +1 -1
- package/dist/esm/core/agent/buildMessageApiChart.d.ts +32 -0
- package/dist/esm/core/agent/buildMessageApiChart.js +27 -4
- package/dist/esm/core/agent/buildMessageApiChart.js.map +1 -1
- package/dist/esm/core/agent/buildToolRegistry.d.ts +80 -31
- package/dist/esm/core/agent/buildToolRegistry.js +90 -33
- package/dist/esm/core/agent/buildToolRegistry.js.map +1 -1
- package/dist/esm/core/agent/messageApiReceipt.d.ts +82 -0
- package/dist/esm/core/agent/messageApiReceipt.js +73 -0
- package/dist/esm/core/agent/messageApiReceipt.js.map +1 -0
- package/dist/esm/core/agent/stages/callLLM.js +3 -7
- package/dist/esm/core/agent/stages/callLLM.js.map +1 -1
- package/dist/esm/core/agent/stages/toolCalls.d.ts +43 -5
- package/dist/esm/core/agent/stages/toolCalls.js +174 -27
- package/dist/esm/core/agent/stages/toolCalls.js.map +1 -1
- package/dist/esm/core/agent/types.d.ts +15 -0
- package/dist/esm/core/slots/buildToolsSlot.d.ts +100 -0
- package/dist/esm/core/slots/buildToolsSlot.js +207 -61
- package/dist/esm/core/slots/buildToolsSlot.js.map +1 -1
- package/dist/esm/events/payloads.d.ts +92 -18
- package/dist/esm/events/registry.d.ts +5 -1
- package/dist/esm/events/registry.js +4 -0
- package/dist/esm/events/registry.js.map +1 -1
- package/dist/esm/lib/time-travel/receipt.d.ts +45 -13
- package/dist/esm/lib/time-travel/receipt.js +41 -10
- package/dist/esm/lib/time-travel/receipt.js.map +1 -1
- package/dist/esm/lib/time-travel/servedView.d.ts +36 -35
- package/dist/esm/lib/time-travel/servedView.js +64 -43
- package/dist/esm/lib/time-travel/servedView.js.map +1 -1
- package/dist/events/registry.js +4 -0
- package/dist/events/registry.js.map +1 -1
- package/dist/lib/time-travel/receipt.js +43 -11
- package/dist/lib/time-travel/receipt.js.map +1 -1
- package/dist/lib/time-travel/servedView.js +64 -43
- package/dist/lib/time-travel/servedView.js.map +1 -1
- package/dist/types/core/Agent.d.ts.map +1 -1
- package/dist/types/core/LLMCall.d.ts +18 -0
- package/dist/types/core/LLMCall.d.ts.map +1 -1
- package/dist/types/core/agent/buildAgentMessageApiChart.d.ts +22 -0
- package/dist/types/core/agent/buildAgentMessageApiChart.d.ts.map +1 -1
- package/dist/types/core/agent/buildMessageApiChart.d.ts +32 -0
- package/dist/types/core/agent/buildMessageApiChart.d.ts.map +1 -1
- package/dist/types/core/agent/buildToolRegistry.d.ts +80 -31
- package/dist/types/core/agent/buildToolRegistry.d.ts.map +1 -1
- package/dist/types/core/agent/messageApiReceipt.d.ts +83 -0
- package/dist/types/core/agent/messageApiReceipt.d.ts.map +1 -0
- package/dist/types/core/agent/stages/callLLM.d.ts.map +1 -1
- package/dist/types/core/agent/stages/toolCalls.d.ts +43 -5
- package/dist/types/core/agent/stages/toolCalls.d.ts.map +1 -1
- package/dist/types/core/agent/types.d.ts +15 -0
- package/dist/types/core/agent/types.d.ts.map +1 -1
- package/dist/types/core/slots/buildToolsSlot.d.ts +100 -0
- package/dist/types/core/slots/buildToolsSlot.d.ts.map +1 -1
- package/dist/types/events/payloads.d.ts +92 -18
- package/dist/types/events/payloads.d.ts.map +1 -1
- package/dist/types/events/registry.d.ts +5 -1
- package/dist/types/events/registry.d.ts.map +1 -1
- package/dist/types/lib/time-travel/receipt.d.ts +45 -13
- package/dist/types/lib/time-travel/receipt.d.ts.map +1 -1
- package/dist/types/lib/time-travel/servedView.d.ts +36 -35
- package/dist/types/lib/time-travel/servedView.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -25,13 +25,16 @@
|
|
|
25
25
|
* which slots the Context selector lights per iteration differs.
|
|
26
26
|
*/
|
|
27
27
|
import { flowChartSelector, select } from 'footprintjs';
|
|
28
|
+
import { ArrayMergeMode } from 'footprintjs/advanced';
|
|
29
|
+
import { RECEIPT_KEY } from '../../lib/time-travel/receipt.js';
|
|
30
|
+
import { messageApiReceipt } from './messageApiReceipt.js';
|
|
28
31
|
import { SUBFLOW_IDS, STAGE_IDS, milestoneTagsFor } from '../../conventions.js';
|
|
29
32
|
import { typedEmit } from '../../recorders/core/typedEmit.js';
|
|
30
33
|
import { resilienceHooks } from '../../recorders/core/resilienceHooks.js';
|
|
31
34
|
import { buildSystemPromptSlot } from '../slots/buildSystemPromptSlot.js';
|
|
32
35
|
import { buildMessagesSlot } from '../slots/buildMessagesSlot.js';
|
|
33
36
|
import { buildToolsSlot } from '../slots/buildToolsSlot.js';
|
|
34
|
-
import { joinSystemPrompt } from './composeRequest.js';
|
|
37
|
+
import { joinSystemPrompt, stripFrameworkFields } from './composeRequest.js';
|
|
35
38
|
/** Route branch ids. */
|
|
36
39
|
const ROUTE_TOOL_CALLS = 'tool-calls';
|
|
37
40
|
const ROUTE_FINAL = SUBFLOW_IDS.FINAL;
|
|
@@ -76,7 +79,7 @@ export function buildAgentMessageApiChart(deps) {
|
|
|
76
79
|
// ── Call-LLM: send the assembled payload + the tool schemas. ──
|
|
77
80
|
const callLLM = async (scope) => {
|
|
78
81
|
const system = scope.assembledSystem;
|
|
79
|
-
const messages = (scope.assembledMessages ?? []);
|
|
82
|
+
const messages = stripFrameworkFields((scope.assembledMessages ?? []));
|
|
80
83
|
const toolSchemas = (scope.toolSchemas ?? []);
|
|
81
84
|
typedEmit(scope, 'agentfootprint.stream.llm_start', {
|
|
82
85
|
iteration: scope.iteration,
|
|
@@ -93,12 +96,33 @@ export function buildAgentMessageApiChart(deps) {
|
|
|
93
96
|
}),
|
|
94
97
|
});
|
|
95
98
|
const startMs = Date.now();
|
|
96
|
-
|
|
99
|
+
// ONE request object, sent and fingerprinted — never assembled twice.
|
|
100
|
+
const request = {
|
|
97
101
|
...(system.length > 0 && { systemPrompt: system }),
|
|
98
102
|
messages,
|
|
99
103
|
...(toolSchemas.length > 0 && { tools: toolSchemas }),
|
|
100
104
|
model,
|
|
101
|
-
}
|
|
105
|
+
};
|
|
106
|
+
// ── THE RECEIPT (9.91.0) ───────────────────────────────────────────
|
|
107
|
+
// Minted immediately before the port is called, so it is committed in the
|
|
108
|
+
// call-llm bundle that already exists — and before rather than after on
|
|
109
|
+
// purpose: the stage commits on the error path too, so a call that throws
|
|
110
|
+
// still leaves the record of what it was about to send. No run id ⇒ no
|
|
111
|
+
// receipt; the rule and its reason live in `messageApiReceipt.ts`.
|
|
112
|
+
const receipt = messageApiReceipt({
|
|
113
|
+
runId: deps.getRunId?.(),
|
|
114
|
+
epoch: scope.iteration,
|
|
115
|
+
model,
|
|
116
|
+
provider: provider.name,
|
|
117
|
+
systemText: system,
|
|
118
|
+
systemPieces: (scope.systemPromptInjections ?? []),
|
|
119
|
+
messages,
|
|
120
|
+
tools: toolSchemas,
|
|
121
|
+
request,
|
|
122
|
+
});
|
|
123
|
+
if (receipt !== undefined)
|
|
124
|
+
scope[RECEIPT_KEY] = receipt;
|
|
125
|
+
const response = await provider.complete(request,
|
|
102
126
|
// Resilience-report channel: a decorated provider's fallback /
|
|
103
127
|
// retry / recovery becomes an in-run typed event here.
|
|
104
128
|
//
|
|
@@ -193,6 +217,15 @@ export function buildAgentMessageApiChart(deps) {
|
|
|
193
217
|
tags: milestoneTagsFor(SUBFLOW_IDS.TOOLS),
|
|
194
218
|
inputMapper: (parent) => ({ iteration: parent.iteration }),
|
|
195
219
|
outputMapper: (sf) => ({ toolSchemas: sf.toolSchemas }),
|
|
220
|
+
// REPLACE, never concatenate (9.92.0). footprintjs's default output
|
|
221
|
+
// mapping CONCATENATES a subflow's array output onto the parent's
|
|
222
|
+
// existing array, so turn 2 of this loop handed the model
|
|
223
|
+
// `['weather','weather']` — the same tool twice, and Anthropic rejects
|
|
224
|
+
// a request whose tool names repeat. The receipt and `servedAt` recorded
|
|
225
|
+
// the doubled list truthfully, which is how the defect became visible
|
|
226
|
+
// (9.91.0 follow-up). The agent charts already say this on their own
|
|
227
|
+
// tools mount; this chart had the same mapper without the same law.
|
|
228
|
+
arrayMerge: ArrayMergeMode.Replace,
|
|
196
229
|
// tools is a SEPARATE Anthropic wire field — it BYPASSES messageAPI
|
|
197
230
|
// (which assembles only system+messages) and pairs with its output at
|
|
198
231
|
// Call-LLM. `convergeAt` makes the structure edge `sf-tools → call-llm`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildAgentMessageApiChart.js","sourceRoot":"","sources":["../../../../src/core/agent/buildAgentMessageApiChart.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"buildAgentMessageApiChart.js","sourceRoot":"","sources":["../../../../src/core/agent/buildAgentMessageApiChart.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,6 +41,38 @@ export interface MessageApiChartDeps {
|
|
|
41
41
|
readonly model: string;
|
|
42
42
|
readonly systemPrompt: string;
|
|
43
43
|
readonly structureRecorders?: readonly import('footprintjs').StructureRecorder[];
|
|
44
|
+
/**
|
|
45
|
+
* The id of the run this chart is about to make (9.91.0) — supply it and
|
|
46
|
+
* Call-LLM mints a receipt, the fingerprint of what the model was handed,
|
|
47
|
+
* committed at the call for `receiptAt` and `servedAt` to read.
|
|
48
|
+
*
|
|
49
|
+
* IT IS A DEP BECAUSE THIS IS A CHART BUILDER, NOT A RUNNER. `Agent` and
|
|
50
|
+
* `LLMCall` own their executor and mint a run id per run; this chart is
|
|
51
|
+
* handed to a `FlowChartExecutor` the caller owns, and nothing in a stage's
|
|
52
|
+
* scope carries that executor's run id. So the one value the receipt cannot
|
|
53
|
+
* do without has to come from whoever starts the run.
|
|
54
|
+
*
|
|
55
|
+
* OMIT IT AND NO RECEIPT IS MINTED — deliberately, rather than minting an
|
|
56
|
+
* unsalted one. Every hash on a receipt is salted with the run id precisely
|
|
57
|
+
* so a short system prompt or a two-word turn cannot be fingerprinted across
|
|
58
|
+
* runs (`receipt.ts`, the third law), and a receipt is committed state that
|
|
59
|
+
* travels in recordings. A chart that minted with an empty salt would ship
|
|
60
|
+
* dictionary-attackable fingerprints by default. `servedAt` then declares
|
|
61
|
+
* the absence — `no-receipt-on-chart`, cause `'no-receipt-committed'` — and
|
|
62
|
+
* rebuilds the view as it always did.
|
|
63
|
+
*
|
|
64
|
+
* @example (internal — `buildMessageApiChart` is not on the package's public
|
|
65
|
+
* surface; the type is, so a caller composing this chart inside the library
|
|
66
|
+
* reads the contract here)
|
|
67
|
+
* ```ts
|
|
68
|
+
* const runId = `run-${Date.now()}`;
|
|
69
|
+
* const chart = buildMessageApiChart({ provider, model, systemPrompt, getRunId: () => runId });
|
|
70
|
+
* const executor = new FlowChartExecutor(chart);
|
|
71
|
+
* await executor.run({ input: { message: 'hi' } });
|
|
72
|
+
* receiptAt(executor.getSnapshot(), 1)?.basis.runId; // runId
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
readonly getRunId?: () => string | undefined;
|
|
44
76
|
}
|
|
45
77
|
/**
|
|
46
78
|
* Build the LLM-only messageAPI merge-tree chart.
|
|
@@ -35,12 +35,14 @@
|
|
|
35
35
|
* emits context.injected and Lens renders them — no bespoke collapser.
|
|
36
36
|
*/
|
|
37
37
|
import { flowChartSelector, select } from 'footprintjs';
|
|
38
|
+
import { RECEIPT_KEY } from '../../lib/time-travel/receipt.js';
|
|
39
|
+
import { messageApiReceipt } from './messageApiReceipt.js';
|
|
38
40
|
import { SUBFLOW_IDS, STAGE_IDS, milestoneTagsFor } from '../../conventions.js';
|
|
39
41
|
import { typedEmit } from '../../recorders/core/typedEmit.js';
|
|
40
42
|
import { resilienceHooks } from '../../recorders/core/resilienceHooks.js';
|
|
41
43
|
import { buildSystemPromptSlot } from '../slots/buildSystemPromptSlot.js';
|
|
42
44
|
import { buildMessagesSlot } from '../slots/buildMessagesSlot.js';
|
|
43
|
-
import { joinSystemPrompt } from './composeRequest.js';
|
|
45
|
+
import { joinSystemPrompt, stripFrameworkFields } from './composeRequest.js';
|
|
44
46
|
/**
|
|
45
47
|
* Build the LLM-only messageAPI merge-tree chart.
|
|
46
48
|
*/
|
|
@@ -92,7 +94,7 @@ export function buildMessageApiChart(deps) {
|
|
|
92
94
|
// ── Call-LLM: send the assembled payload, write the answer. ──
|
|
93
95
|
const callLLM = async (scope) => {
|
|
94
96
|
const system = scope.assembledSystem;
|
|
95
|
-
const messages = (scope.assembledMessages ?? []);
|
|
97
|
+
const messages = stripFrameworkFields((scope.assembledMessages ?? []));
|
|
96
98
|
typedEmit(scope, 'agentfootprint.stream.llm_start', {
|
|
97
99
|
iteration: scope.iteration,
|
|
98
100
|
provider: provider.name,
|
|
@@ -102,11 +104,32 @@ export function buildMessageApiChart(deps) {
|
|
|
102
104
|
toolsCount: 0,
|
|
103
105
|
});
|
|
104
106
|
const startMs = Date.now();
|
|
105
|
-
|
|
107
|
+
// ONE request object, sent and fingerprinted — see the receipt below.
|
|
108
|
+
const request = {
|
|
106
109
|
...(system.length > 0 && { systemPrompt: system }),
|
|
107
110
|
messages,
|
|
108
111
|
model,
|
|
109
|
-
}
|
|
112
|
+
};
|
|
113
|
+
// ── THE RECEIPT (9.91.0) ───────────────────────────────────────────
|
|
114
|
+
// Minted immediately before the port is called, so it is committed in the
|
|
115
|
+
// call-llm bundle that already exists — and before rather than after on
|
|
116
|
+
// purpose: the stage commits on the error path too, so a call that throws
|
|
117
|
+
// still leaves the record of what it was about to send. No run id ⇒ no
|
|
118
|
+
// receipt; the rule and its reason live in `messageApiReceipt.ts`.
|
|
119
|
+
const receipt = messageApiReceipt({
|
|
120
|
+
runId: deps.getRunId?.(),
|
|
121
|
+
epoch: scope.iteration,
|
|
122
|
+
model,
|
|
123
|
+
provider: provider.name,
|
|
124
|
+
systemText: system,
|
|
125
|
+
systemPieces: (scope.systemPromptInjections ?? []),
|
|
126
|
+
messages,
|
|
127
|
+
tools: [],
|
|
128
|
+
request,
|
|
129
|
+
});
|
|
130
|
+
if (receipt !== undefined)
|
|
131
|
+
scope[RECEIPT_KEY] = receipt;
|
|
132
|
+
const response = await provider.complete(request,
|
|
110
133
|
// Resilience-report channel — see buildAgentMessageApiChart.
|
|
111
134
|
resilienceHooks(scope));
|
|
112
135
|
scope.answer = response.content;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildMessageApiChart.js","sourceRoot":"","sources":["../../../../src/core/agent/buildMessageApiChart.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGxD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAEhF,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"buildMessageApiChart.js","sourceRoot":"","sources":["../../../../src/core/agent/buildMessageApiChart.ts"],"names":[],"mappings":"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"}
|
|
@@ -57,16 +57,18 @@
|
|
|
57
57
|
* the autoActivate invariant above exists, and why the name-uniqueness throws
|
|
58
58
|
* below are throws: an identity that is not stable is one the model cannot
|
|
59
59
|
* address. Where a provider schema reaches the wire ahead of a skill tool of
|
|
60
|
-
* the same name, the identity half
|
|
60
|
+
* the same name, the identity half WAS the SHADOW SEAM illustrated below —
|
|
61
|
+
* closed in 9.92.0 by making dispatch follow the offer.
|
|
61
62
|
*
|
|
62
63
|
* `with stable identity` is kept rather than dropped, and the reason is the
|
|
63
64
|
* event. A law reading only "every offered name resolves to something" would
|
|
64
65
|
* be true everywhere and would leave `agentfootprint.tools.shadowed` reporting
|
|
65
66
|
* a deviation from nothing — the framework spends an event on that seam
|
|
66
67
|
* precisely because reading one contract and calling another implementation is
|
|
67
|
-
* a violation of an expectation worth naming.
|
|
68
|
-
*
|
|
69
|
-
*
|
|
68
|
+
* a violation of an expectation worth naming. Since 9.92.0 the clause HOLDS
|
|
69
|
+
* for every name on the wire (dispatch follows the offer); the event now names
|
|
70
|
+
* the collision that would have broken it, and its companion
|
|
71
|
+
* `agentfootprint.tools.claim_swallowed` names the party the collision silenced.
|
|
70
72
|
*
|
|
71
73
|
* Clause two is the whole point of the narrowing dials — `autoActivate`,
|
|
72
74
|
* `skillGraph({ scopeTools })`, `.toolsFromActiveSkill()`, a parked map,
|
|
@@ -133,33 +135,44 @@
|
|
|
133
135
|
* `makeReachableSkills` filters the cursor out of its own successor set,
|
|
134
136
|
* and under `.tree()` the reachable set is `() => []` outright
|
|
135
137
|
* (skillGraph.ts) — a tree routes by predicate and has no cursor to move.
|
|
136
|
-
* • The SHADOW SEAM —
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
*
|
|
146
|
-
*
|
|
147
|
-
*
|
|
148
|
-
*
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
*
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
*
|
|
138
|
+
* • The SHADOW SEAM — the SAME-EPOCH divergence this file's two maps used
|
|
139
|
+
* to produce, CLOSED in 9.92.0 and kept here because a reader meeting
|
|
140
|
+
* the maps has to know why dispatch no longer reads them first. A
|
|
141
|
+
* `ToolProvider` and a skill can declare the same tool name. The wire
|
|
142
|
+
* merge puts provider schemas ahead of skill injections
|
|
143
|
+
* first-occurrence-wins, so the model reads the PROVIDER's contract; until
|
|
144
|
+
* 9.92.0 `lookupTool` checked `registryByName` first, where every skill
|
|
145
|
+
* tool lives and no provider tool does, so the SKILL's `execute` ran —
|
|
146
|
+
* the contract offered and the implementation that answered were
|
|
147
|
+
* different tools, inside ONE epoch, and an INACTIVE skill could answer
|
|
148
|
+
* a call it was never offered. Now DISPATCH FOLLOWS THE OFFER: the tools
|
|
149
|
+
* slot records which party put each name on the wire (`ServedToolParties`,
|
|
150
|
+
* buildToolsSlot.ts) and `lookupTool` resolves a name on the wire to THAT
|
|
151
|
+
* party's implementation; `registryByName` is the fallback for a name
|
|
152
|
+
* that is not on this epoch's wire at all (the held-out, parked and
|
|
153
|
+
* restored-transcript cases the capability law keeps dispatchable) —
|
|
154
|
+
* reached only for the party the model LAST read the name under, or the
|
|
155
|
+
* name's only holder when it was never served, and put on the record by
|
|
156
|
+
* `agentfootprint.tools.answered_off_wire`; a name whose last-served
|
|
157
|
+
* party can no longer answer is refused (`toolCalls.ts` ·
|
|
158
|
+
* `notServedResult`), never handed to a party the model was not shown
|
|
159
|
+
* under that name. The
|
|
160
|
+
* collision itself is still REPORTED rather than refused, because nothing
|
|
161
|
+
* here can see it coming: the provider's list is resolved per iteration
|
|
162
|
+
* (`list(ctx)`), so there is no build-time moment at which the pair is
|
|
163
|
+
* knowable. The pair this file CAN see — a static `.tool()` against a
|
|
164
|
+
* skill tool — is refused upstream (`validators.ts` ·
|
|
165
|
+
* `validateToolNameUniqueness`), which is the better answer whenever the
|
|
166
|
+
* answer is available that early. `agentfootprint.tools.shadowed` names
|
|
167
|
+
* the wire's party (now the same party in both of its halves) every
|
|
168
|
+
* iteration two contracts compete, and `agentfootprint.tools.claim_swallowed`
|
|
169
|
+
* names every party whose claim is dead that iteration — the loser of a
|
|
170
|
+
* competition, and the claimant that never even reached the merge (a
|
|
171
|
+
* provider tool whose name a registry holder owns, a skill tool named
|
|
172
|
+
* after a framework auto-attach). `toolClaimants` below is what makes the
|
|
173
|
+
* second event possible: the list of who claimed a name, kept instead of
|
|
174
|
+
* collapsed to a winner. Pinned by `test/toolShadowing.test.ts`,
|
|
175
|
+
* `test/core/tools/offer-and-answer.test.ts` and epoch-laws 1(g).
|
|
163
176
|
*
|
|
164
177
|
* MCP does not add a seam of its OWN, and it is worth saying so because it
|
|
165
178
|
* looks like it does: `mcpServe` builds `listing` and `byName` ONCE at
|
|
@@ -176,6 +189,20 @@
|
|
|
176
189
|
import type { Injection } from '../../lib/injection-engine/types.js';
|
|
177
190
|
import type { LLMToolSchema } from '../../adapters/types.js';
|
|
178
191
|
import { type Tool, type ToolRegistryEntry } from '../tools.js';
|
|
192
|
+
import type { ToolNameChannel } from '../../events/payloads.js';
|
|
193
|
+
/**
|
|
194
|
+
* One party's claim to a tool name, as declared at build (9.92.0).
|
|
195
|
+
*
|
|
196
|
+
* `channel` is the vocabulary `tools.shadowed` / `tools.claim_swallowed` name
|
|
197
|
+
* parties in; `id` is the skill id for a skill's claim (a static `.tool()` and
|
|
198
|
+
* a framework auto-attach carry none). `tool` is the implementation that
|
|
199
|
+
* answers when THIS claim is the one on the wire.
|
|
200
|
+
*/
|
|
201
|
+
export interface ToolClaim {
|
|
202
|
+
readonly channel: Exclude<ToolNameChannel, 'provider'>;
|
|
203
|
+
readonly id?: string;
|
|
204
|
+
readonly tool: Tool;
|
|
205
|
+
}
|
|
179
206
|
export interface ToolRegistryArtifacts {
|
|
180
207
|
/** All tools the LLM sees in the static portion of its tool list
|
|
181
208
|
* (registry + read_skill + non-autoActivate skill tools). */
|
|
@@ -209,6 +236,28 @@ export interface ToolRegistryArtifacts {
|
|
|
209
236
|
* they are the framework's or the app's, not a skill's.
|
|
210
237
|
*/
|
|
211
238
|
readonly toolDeclaringSkills: ReadonlyMap<string, readonly string[]>;
|
|
239
|
+
/**
|
|
240
|
+
* EVERY BUILD-TIME CLAIMANT PER TOOL NAME (9.92.0) — a list, not a winner.
|
|
241
|
+
*
|
|
242
|
+
* `registryByName` holds one implementation per name and still does: it is
|
|
243
|
+
* the map dispatch falls back to for a name that is NOT on this epoch's
|
|
244
|
+
* wire (a held-out step tool, a parked map's tool, a scoped tool named from
|
|
245
|
+
* a restored transcript — the capability law's "a narrowing takes a name
|
|
246
|
+
* off the wire, never out of dispatch", qualified since the 9.92.0 review
|
|
247
|
+
* by "to the party the model last read it under"). What it cannot say is who ELSE
|
|
248
|
+
* claimed the name, and that is what the tools slot needs to report a
|
|
249
|
+
* dead claim (`tools.claim_swallowed`) and to name the wire's party
|
|
250
|
+
* truthfully (`tools.shadowed`). Provider claims are not here — a
|
|
251
|
+
* `ToolProvider` resolves per iteration and is a runtime fact.
|
|
252
|
+
*
|
|
253
|
+
* Order per name: the `augmentedRegistry` holder first (a static `.tool()`,
|
|
254
|
+
* the framework's `read_skill`/`present`, an always-visible skill's tool),
|
|
255
|
+
* then every other skill that declares the name (a shared reference is
|
|
256
|
+
* listed under each declaring skill), then the framework's `skip_step` when
|
|
257
|
+
* any skill declares steps. Build time decides nothing here: the wire
|
|
258
|
+
* decides, per epoch, in `buildToolsSlot`.
|
|
259
|
+
*/
|
|
260
|
+
readonly toolClaimants: ReadonlyMap<string, readonly ToolClaim[]>;
|
|
212
261
|
}
|
|
213
262
|
/** The build facts that gate auto-attached tools beyond skills (9.22.0). */
|
|
214
263
|
export interface BuildToolRegistryOptions {
|
|
@@ -61,16 +61,18 @@
|
|
|
61
61
|
* the autoActivate invariant above exists, and why the name-uniqueness throws
|
|
62
62
|
* below are throws: an identity that is not stable is one the model cannot
|
|
63
63
|
* address. Where a provider schema reaches the wire ahead of a skill tool of
|
|
64
|
-
* the same name, the identity half
|
|
64
|
+
* the same name, the identity half WAS the SHADOW SEAM illustrated below —
|
|
65
|
+
* closed in 9.92.0 by making dispatch follow the offer.
|
|
65
66
|
*
|
|
66
67
|
* `with stable identity` is kept rather than dropped, and the reason is the
|
|
67
68
|
* event. A law reading only "every offered name resolves to something" would
|
|
68
69
|
* be true everywhere and would leave `agentfootprint.tools.shadowed` reporting
|
|
69
70
|
* a deviation from nothing — the framework spends an event on that seam
|
|
70
71
|
* precisely because reading one contract and calling another implementation is
|
|
71
|
-
* a violation of an expectation worth naming.
|
|
72
|
-
*
|
|
73
|
-
*
|
|
72
|
+
* a violation of an expectation worth naming. Since 9.92.0 the clause HOLDS
|
|
73
|
+
* for every name on the wire (dispatch follows the offer); the event now names
|
|
74
|
+
* the collision that would have broken it, and its companion
|
|
75
|
+
* `agentfootprint.tools.claim_swallowed` names the party the collision silenced.
|
|
74
76
|
*
|
|
75
77
|
* Clause two is the whole point of the narrowing dials — `autoActivate`,
|
|
76
78
|
* `skillGraph({ scopeTools })`, `.toolsFromActiveSkill()`, a parked map,
|
|
@@ -137,33 +139,44 @@
|
|
|
137
139
|
* `makeReachableSkills` filters the cursor out of its own successor set,
|
|
138
140
|
* and under `.tree()` the reachable set is `() => []` outright
|
|
139
141
|
* (skillGraph.ts) — a tree routes by predicate and has no cursor to move.
|
|
140
|
-
* • The SHADOW SEAM —
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
*
|
|
146
|
-
*
|
|
147
|
-
*
|
|
148
|
-
*
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
*
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
*
|
|
142
|
+
* • The SHADOW SEAM — the SAME-EPOCH divergence this file's two maps used
|
|
143
|
+
* to produce, CLOSED in 9.92.0 and kept here because a reader meeting
|
|
144
|
+
* the maps has to know why dispatch no longer reads them first. A
|
|
145
|
+
* `ToolProvider` and a skill can declare the same tool name. The wire
|
|
146
|
+
* merge puts provider schemas ahead of skill injections
|
|
147
|
+
* first-occurrence-wins, so the model reads the PROVIDER's contract; until
|
|
148
|
+
* 9.92.0 `lookupTool` checked `registryByName` first, where every skill
|
|
149
|
+
* tool lives and no provider tool does, so the SKILL's `execute` ran —
|
|
150
|
+
* the contract offered and the implementation that answered were
|
|
151
|
+
* different tools, inside ONE epoch, and an INACTIVE skill could answer
|
|
152
|
+
* a call it was never offered. Now DISPATCH FOLLOWS THE OFFER: the tools
|
|
153
|
+
* slot records which party put each name on the wire (`ServedToolParties`,
|
|
154
|
+
* buildToolsSlot.ts) and `lookupTool` resolves a name on the wire to THAT
|
|
155
|
+
* party's implementation; `registryByName` is the fallback for a name
|
|
156
|
+
* that is not on this epoch's wire at all (the held-out, parked and
|
|
157
|
+
* restored-transcript cases the capability law keeps dispatchable) —
|
|
158
|
+
* reached only for the party the model LAST read the name under, or the
|
|
159
|
+
* name's only holder when it was never served, and put on the record by
|
|
160
|
+
* `agentfootprint.tools.answered_off_wire`; a name whose last-served
|
|
161
|
+
* party can no longer answer is refused (`toolCalls.ts` ·
|
|
162
|
+
* `notServedResult`), never handed to a party the model was not shown
|
|
163
|
+
* under that name. The
|
|
164
|
+
* collision itself is still REPORTED rather than refused, because nothing
|
|
165
|
+
* here can see it coming: the provider's list is resolved per iteration
|
|
166
|
+
* (`list(ctx)`), so there is no build-time moment at which the pair is
|
|
167
|
+
* knowable. The pair this file CAN see — a static `.tool()` against a
|
|
168
|
+
* skill tool — is refused upstream (`validators.ts` ·
|
|
169
|
+
* `validateToolNameUniqueness`), which is the better answer whenever the
|
|
170
|
+
* answer is available that early. `agentfootprint.tools.shadowed` names
|
|
171
|
+
* the wire's party (now the same party in both of its halves) every
|
|
172
|
+
* iteration two contracts compete, and `agentfootprint.tools.claim_swallowed`
|
|
173
|
+
* names every party whose claim is dead that iteration — the loser of a
|
|
174
|
+
* competition, and the claimant that never even reached the merge (a
|
|
175
|
+
* provider tool whose name a registry holder owns, a skill tool named
|
|
176
|
+
* after a framework auto-attach). `toolClaimants` below is what makes the
|
|
177
|
+
* second event possible: the list of who claimed a name, kept instead of
|
|
178
|
+
* collapsed to a winner. Pinned by `test/toolShadowing.test.ts`,
|
|
179
|
+
* `test/core/tools/offer-and-answer.test.ts` and epoch-laws 1(g).
|
|
167
180
|
*
|
|
168
181
|
* MCP does not add a seam of its OWN, and it is worth saying so because it
|
|
169
182
|
* looks like it does: `mcpServe` builds `listing` and `byName` ONCE at
|
|
@@ -202,6 +215,16 @@ export function buildToolRegistry(registry, injections, options = {}) {
|
|
|
202
215
|
// a shared Tool reference is genuinely declared by both skills, and a reader
|
|
203
216
|
// asking "may this name be spoken?" needs both ids to answer.
|
|
204
217
|
const declaringSkills = new Map();
|
|
218
|
+
// The claims (9.92.0), in the order the doc on `toolClaimants` states.
|
|
219
|
+
const claims = new Map();
|
|
220
|
+
const claim = (name, c) => {
|
|
221
|
+
const held = claims.get(name);
|
|
222
|
+
if (held === undefined)
|
|
223
|
+
claims.set(name, [c]);
|
|
224
|
+
else
|
|
225
|
+
held.push(c);
|
|
226
|
+
};
|
|
227
|
+
const skillClaims = [];
|
|
205
228
|
for (const skill of skills) {
|
|
206
229
|
const meta = skill.metadata;
|
|
207
230
|
const isAutoActivate = meta?.autoActivate === 'currentSkill';
|
|
@@ -213,6 +236,10 @@ export function buildToolRegistry(registry, injections, options = {}) {
|
|
|
213
236
|
declaringSkills.set(name, [skill.id]);
|
|
214
237
|
else if (!declared.includes(skill.id))
|
|
215
238
|
declared.push(skill.id);
|
|
239
|
+
skillClaims.push({
|
|
240
|
+
name,
|
|
241
|
+
claim: { channel: 'skill', id: skill.id, tool: tool },
|
|
242
|
+
});
|
|
216
243
|
// Check EVERY skill tool — including autoActivate ones, which `continue`
|
|
217
244
|
// below and never reach the static registry's gate. (This is the common
|
|
218
245
|
// case: all of Neo's skills are autoActivate, so their scoped tools would
|
|
@@ -300,6 +327,22 @@ export function buildToolRegistry(registry, injections, options = {}) {
|
|
|
300
327
|
}
|
|
301
328
|
seenNames.add(entry.name);
|
|
302
329
|
}
|
|
330
|
+
// Claims, in `toolClaimants` order: the augmentedRegistry holders first
|
|
331
|
+
// (registry, read_skill, present — every always-visible skill tool is a
|
|
332
|
+
// skill claim and lands in the next loop, in declaration order, which is
|
|
333
|
+
// the order `skillToolEntries` was pushed in), then every skill claim.
|
|
334
|
+
for (const e of registry) {
|
|
335
|
+
claim(e.name, {
|
|
336
|
+
channel: 'registry',
|
|
337
|
+
...(e.tool.owner && { id: e.tool.owner.id }),
|
|
338
|
+
tool: e.tool,
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
for (const e of [...readSkillEntries, ...presentEntries]) {
|
|
342
|
+
claim(e.name, { channel: 'framework', tool: e.tool });
|
|
343
|
+
}
|
|
344
|
+
for (const { name, claim: c } of skillClaims)
|
|
345
|
+
claim(name, c);
|
|
303
346
|
const registryByName = new Map(augmentedRegistry.map((e) => [e.name, e.tool]));
|
|
304
347
|
// autoActivate skill tools live outside augmentedRegistry but MUST
|
|
305
348
|
// be findable by name at dispatch time. Add them to the dispatch
|
|
@@ -329,9 +372,23 @@ export function buildToolRegistry(registry, injections, options = {}) {
|
|
|
329
372
|
`name, and a same-named tool would silently take over the model's recorded skips. ` +
|
|
330
373
|
`Rename your tool.`);
|
|
331
374
|
}
|
|
332
|
-
|
|
375
|
+
const skipStep = buildSkipStepTool();
|
|
376
|
+
registryByName.set(SKIP_STEP_TOOL_NAME, skipStep);
|
|
377
|
+
// The framework's own claim (9.92.0): a claimant like any other. It wins
|
|
378
|
+
// the wire only when no other party puts the name forward that epoch —
|
|
379
|
+
// the tools slot merges its schema LAST — and when a provider does, the
|
|
380
|
+
// provider's contract is what the model reads and the provider's tool is
|
|
381
|
+
// what answers; the procedure does not advance on a call whose contract
|
|
382
|
+
// the model read from somebody else (recorded-not-built, entry 3).
|
|
383
|
+
claim(SKIP_STEP_TOOL_NAME, { channel: 'framework', tool: skipStep });
|
|
333
384
|
}
|
|
334
385
|
const toolSchemas = augmentedRegistry.map((e) => e.tool.schema);
|
|
335
|
-
return {
|
|
386
|
+
return {
|
|
387
|
+
augmentedRegistry,
|
|
388
|
+
registryByName,
|
|
389
|
+
toolSchemas,
|
|
390
|
+
toolDeclaringSkills: declaringSkills,
|
|
391
|
+
toolClaimants: claims,
|
|
392
|
+
};
|
|
336
393
|
}
|
|
337
394
|
//# sourceMappingURL=buildToolRegistry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildToolRegistry.js","sourceRoot":"","sources":["../../../../src/core/agent/buildToolRegistry.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,8FAA8F;AAC9F,+FAA+F;AAC/F,2CAA2C;AAC3C
|
|
1
|
+
{"version":3,"file":"buildToolRegistry.js","sourceRoot":"","sources":["../../../../src/core/agent/buildToolRegistry.ts"],"names":[],"mappings":"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"}
|