agentfootprint 8.3.0 → 8.5.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/AGENTS.md +11 -8
- package/CLAUDE.md +4 -3
- package/ai-instructions/setup.sh +0 -0
- package/bin/agentfootprint-lint-tools.mjs +0 -0
- package/dist/core/Agent.js +107 -2
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/agent/AgentBuilder.js +47 -5
- package/dist/core/agent/AgentBuilder.js.map +1 -1
- package/dist/core/agent/buildAgentChart.js +5 -0
- package/dist/core/agent/buildAgentChart.js.map +1 -1
- package/dist/core/agent/buildDynamicAgentChart.js +6 -0
- package/dist/core/agent/buildDynamicAgentChart.js.map +1 -1
- package/dist/core/agent/stages/toolCalls.js +53 -7
- package/dist/core/agent/stages/toolCalls.js.map +1 -1
- package/dist/core/slots/buildToolsSlot.js +9 -1
- package/dist/core/slots/buildToolsSlot.js.map +1 -1
- package/dist/esm/core/Agent.d.ts +62 -2
- package/dist/esm/core/Agent.js +107 -2
- package/dist/esm/core/Agent.js.map +1 -1
- package/dist/esm/core/agent/AgentBuilder.d.ts +30 -1
- package/dist/esm/core/agent/AgentBuilder.js +47 -5
- package/dist/esm/core/agent/AgentBuilder.js.map +1 -1
- package/dist/esm/core/agent/buildAgentChart.js +5 -0
- package/dist/esm/core/agent/buildAgentChart.js.map +1 -1
- package/dist/esm/core/agent/buildDynamicAgentChart.js +6 -0
- package/dist/esm/core/agent/buildDynamicAgentChart.js.map +1 -1
- package/dist/esm/core/agent/stages/toolCalls.d.ts +17 -0
- package/dist/esm/core/agent/stages/toolCalls.js +53 -7
- package/dist/esm/core/agent/stages/toolCalls.js.map +1 -1
- package/dist/esm/core/slots/buildToolsSlot.d.ts +13 -0
- package/dist/esm/core/slots/buildToolsSlot.js +9 -1
- package/dist/esm/core/slots/buildToolsSlot.js.map +1 -1
- package/dist/esm/events/payloads.d.ts +17 -0
- package/dist/esm/lib/injection-engine/buildInjectionEngineSubflow.d.ts +12 -0
- package/dist/esm/lib/injection-engine/buildInjectionEngineSubflow.js +28 -4
- package/dist/esm/lib/injection-engine/buildInjectionEngineSubflow.js.map +1 -1
- package/dist/esm/lib/injection-engine/index.d.ts +1 -1
- package/dist/esm/lib/injection-engine/index.js.map +1 -1
- package/dist/esm/lib/injection-engine/skillBodyDelivery.d.ts +65 -0
- package/dist/esm/lib/injection-engine/skillBodyDelivery.js +110 -0
- package/dist/esm/lib/injection-engine/skillBodyDelivery.js.map +1 -0
- package/dist/esm/lib/injection-engine/skillGraph.d.ts +138 -39
- package/dist/esm/lib/injection-engine/skillGraph.js +178 -33
- package/dist/esm/lib/injection-engine/skillGraph.js.map +1 -1
- package/dist/esm/lib/injection-engine/skillTools.d.ts +22 -1
- package/dist/esm/lib/injection-engine/skillTools.js +39 -7
- package/dist/esm/lib/injection-engine/skillTools.js.map +1 -1
- package/dist/esm/recorders/observability/RouteRecorder.d.ts +11 -2
- package/dist/esm/recorders/observability/RouteRecorder.js +58 -6
- package/dist/esm/recorders/observability/RouteRecorder.js.map +1 -1
- package/dist/lib/injection-engine/buildInjectionEngineSubflow.js +28 -4
- package/dist/lib/injection-engine/buildInjectionEngineSubflow.js.map +1 -1
- package/dist/lib/injection-engine/index.js.map +1 -1
- package/dist/lib/injection-engine/skillBodyDelivery.js +116 -0
- package/dist/lib/injection-engine/skillBodyDelivery.js.map +1 -0
- package/dist/lib/injection-engine/skillGraph.js +178 -33
- package/dist/lib/injection-engine/skillGraph.js.map +1 -1
- package/dist/lib/injection-engine/skillTools.js +39 -7
- package/dist/lib/injection-engine/skillTools.js.map +1 -1
- package/dist/recorders/observability/RouteRecorder.js +58 -6
- package/dist/recorders/observability/RouteRecorder.js.map +1 -1
- package/dist/types/core/Agent.d.ts +62 -2
- package/dist/types/core/Agent.d.ts.map +1 -1
- package/dist/types/core/agent/AgentBuilder.d.ts +30 -1
- package/dist/types/core/agent/AgentBuilder.d.ts.map +1 -1
- package/dist/types/core/agent/buildAgentChart.d.ts.map +1 -1
- package/dist/types/core/agent/buildDynamicAgentChart.d.ts.map +1 -1
- package/dist/types/core/agent/stages/toolCalls.d.ts +17 -0
- package/dist/types/core/agent/stages/toolCalls.d.ts.map +1 -1
- package/dist/types/core/slots/buildToolsSlot.d.ts +13 -0
- package/dist/types/core/slots/buildToolsSlot.d.ts.map +1 -1
- package/dist/types/events/payloads.d.ts +17 -0
- package/dist/types/events/payloads.d.ts.map +1 -1
- package/dist/types/lib/injection-engine/buildInjectionEngineSubflow.d.ts +12 -0
- package/dist/types/lib/injection-engine/buildInjectionEngineSubflow.d.ts.map +1 -1
- package/dist/types/lib/injection-engine/index.d.ts +1 -1
- package/dist/types/lib/injection-engine/index.d.ts.map +1 -1
- package/dist/types/lib/injection-engine/skillBodyDelivery.d.ts +66 -0
- package/dist/types/lib/injection-engine/skillBodyDelivery.d.ts.map +1 -0
- package/dist/types/lib/injection-engine/skillGraph.d.ts +138 -39
- package/dist/types/lib/injection-engine/skillGraph.d.ts.map +1 -1
- package/dist/types/lib/injection-engine/skillTools.d.ts +22 -1
- package/dist/types/lib/injection-engine/skillTools.d.ts.map +1 -1
- package/dist/types/recorders/observability/RouteRecorder.d.ts +11 -2
- package/dist/types/recorders/observability/RouteRecorder.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -24,8 +24,17 @@ interface RunBoundaryEvent {
|
|
|
24
24
|
readonly runId?: string;
|
|
25
25
|
};
|
|
26
26
|
}
|
|
27
|
-
/**
|
|
28
|
-
|
|
27
|
+
/**
|
|
28
|
+
* How the graph arrived at a skill on a hop.
|
|
29
|
+
*
|
|
30
|
+
* `'model-pick'` joined the union in 8.5.0 — a `read_skill` the gate accepted, which
|
|
31
|
+
* moved the cursor because no declared edge fired. It used to be recorded as a
|
|
32
|
+
* `'route'`, borrowing the label of whatever edge happened to point at the same
|
|
33
|
+
* skill, so the trace asserted that an edge fired when it had not. The cause now
|
|
34
|
+
* comes from the graph's own resolver (`cursorMove.by`), not from the drawn
|
|
35
|
+
* build-time provenance.
|
|
36
|
+
*/
|
|
37
|
+
export type RouteOutcome = 'entry' | 'route' | 'model-pick' | 'stay' | 'rejected';
|
|
29
38
|
/** One hop of the route — the skill the graph was in at one iteration + how. */
|
|
30
39
|
export interface RouteHop {
|
|
31
40
|
/** runtimeStageId of the iteration (the SequenceStore key). */
|
|
@@ -26,12 +26,42 @@ export function formatRouteHop(hop) {
|
|
|
26
26
|
return `entered "${hop.toSkill}"`;
|
|
27
27
|
case 'route':
|
|
28
28
|
return `"${hop.fromSkill}" → "${hop.toSkill}"${hop.edgeLabel ? ` (${hop.edgeLabel})` : ''}${hop.lastTool ? ` on ${hop.lastTool}` : ''}`;
|
|
29
|
+
case 'model-pick':
|
|
30
|
+
// Deliberately carries no edge caption: no declared edge fired, and lending it
|
|
31
|
+
// one is the exact misattribution this outcome exists to end.
|
|
32
|
+
return hop.fromSkill === undefined
|
|
33
|
+
? `read_skill("${hop.toSkill}") accepted at cold start`
|
|
34
|
+
: `read_skill("${hop.toSkill}") accepted from "${hop.fromSkill}"`;
|
|
29
35
|
case 'stay':
|
|
30
36
|
return `stayed in "${hop.toSkill}"`;
|
|
31
37
|
case 'rejected':
|
|
32
38
|
return `read_skill("${hop.requestedSkill}") rejected from "${hop.fromSkill ?? 'cold start'}" — reachable: ${(hop.reachable ?? []).join(', ') || '(none)'}`;
|
|
33
39
|
}
|
|
34
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* The hop's cause as the GRAPH reported it (`context.evaluated`'s `cursorMove.by`,
|
|
43
|
+
* 8.5.0) — or `undefined` when the event carries none, so the caller can fall back
|
|
44
|
+
* to inferring it from the destination.
|
|
45
|
+
*
|
|
46
|
+
* `'none'` maps to `undefined` on purpose: it means the graph has no cursor at all
|
|
47
|
+
* this iteration, which is not a hop cause. A decision `tree()` reports it every
|
|
48
|
+
* iteration, and there the inferred outcome (entry, then stay) is the right story:
|
|
49
|
+
* a tree really does re-route by predicate rather than move a cursor.
|
|
50
|
+
*/
|
|
51
|
+
function causeOf(cursorMove) {
|
|
52
|
+
if (cursorMove === null || typeof cursorMove !== 'object')
|
|
53
|
+
return undefined;
|
|
54
|
+
const by = cursorMove.by;
|
|
55
|
+
switch (by) {
|
|
56
|
+
case 'entry':
|
|
57
|
+
case 'route':
|
|
58
|
+
case 'model-pick':
|
|
59
|
+
case 'stay':
|
|
60
|
+
return by;
|
|
61
|
+
default:
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
35
65
|
/** The current cursor skill from a `context.evaluated` routing[] — prefer a
|
|
36
66
|
* transitioned-into route target, then an entry, then a tree leaf, then model. */
|
|
37
67
|
function cursorFromRouting(routing) {
|
|
@@ -58,6 +88,7 @@ export function routeRecorder(options = {}) {
|
|
|
58
88
|
let cursor;
|
|
59
89
|
let lastTool;
|
|
60
90
|
let consecutiveRejected = 0;
|
|
91
|
+
let trippedRejectedCap = false;
|
|
61
92
|
const reset = () => {
|
|
62
93
|
store.clear();
|
|
63
94
|
trips.length = 0;
|
|
@@ -65,6 +96,7 @@ export function routeRecorder(options = {}) {
|
|
|
65
96
|
cursor = undefined;
|
|
66
97
|
lastTool = undefined;
|
|
67
98
|
consecutiveRejected = 0;
|
|
99
|
+
trippedRejectedCap = false;
|
|
68
100
|
};
|
|
69
101
|
const detectPingPong = (iteration) => {
|
|
70
102
|
if (transitions.length < pingPongWindow)
|
|
@@ -104,7 +136,15 @@ export function routeRecorder(options = {}) {
|
|
|
104
136
|
break; // no skill-graph routing this iteration
|
|
105
137
|
const iteration = Number(p.iteration ?? 0);
|
|
106
138
|
const from = cursor;
|
|
107
|
-
|
|
139
|
+
// The CAUSE, from the graph's own resolver when it reported one (8.5.0).
|
|
140
|
+
// Falling back to inferring it from the destination — what this recorder
|
|
141
|
+
// did before — is kept for a graph too old to explain itself, and is the
|
|
142
|
+
// only path that can still mistake a model pick for a declared edge.
|
|
143
|
+
const cause = causeOf(p.cursorMove);
|
|
144
|
+
const outcome = cause ?? (cursor === undefined ? 'entry' : cur.id !== cursor ? 'route' : 'stay');
|
|
145
|
+
// An edge caption belongs to a hop a declared EDGE drove. On a model pick
|
|
146
|
+
// the caption is the label of an edge that did not fire.
|
|
147
|
+
const wearsEdgeLabel = outcome === 'route' || outcome === 'entry';
|
|
108
148
|
const hop = {
|
|
109
149
|
runtimeStageId: event.runtimeStageId,
|
|
110
150
|
iteration,
|
|
@@ -112,17 +152,26 @@ export function routeRecorder(options = {}) {
|
|
|
112
152
|
toSkill: cur.id,
|
|
113
153
|
outcome,
|
|
114
154
|
why: '',
|
|
115
|
-
...(cur.label !== undefined ? { edgeLabel: cur.label } : {}),
|
|
155
|
+
...(wearsEdgeLabel && cur.label !== undefined ? { edgeLabel: cur.label } : {}),
|
|
116
156
|
...(outcome === 'route' && lastTool !== undefined ? { lastTool } : {}),
|
|
117
157
|
};
|
|
118
158
|
const finished = { ...hop, why: formatRouteHop(hop) };
|
|
119
159
|
store.push(finished);
|
|
120
|
-
|
|
160
|
+
const moved = outcome !== 'stay';
|
|
161
|
+
if (moved) {
|
|
121
162
|
transitions.push(cur.id);
|
|
122
163
|
detectPingPong(iteration);
|
|
123
164
|
}
|
|
124
165
|
cursor = cur.id;
|
|
125
|
-
|
|
166
|
+
// Only a CURSOR MOVE breaks a rejection run (8.5.0). Resetting on every
|
|
167
|
+
// evaluation made `maxRejectedRetries` untrippable: one evaluation fires
|
|
168
|
+
// between every pair of rejections, so the count never passed 1 and a model
|
|
169
|
+
// could re-ask for the same out-of-reach skill until the iteration cap. A
|
|
170
|
+
// 'stay' is precisely the case where the model asked and got nowhere.
|
|
171
|
+
if (moved) {
|
|
172
|
+
consecutiveRejected = 0;
|
|
173
|
+
trippedRejectedCap = false;
|
|
174
|
+
}
|
|
126
175
|
break;
|
|
127
176
|
}
|
|
128
177
|
case 'agentfootprint.skill.rejected': {
|
|
@@ -138,8 +187,11 @@ export function routeRecorder(options = {}) {
|
|
|
138
187
|
};
|
|
139
188
|
store.push({ ...hop, why: formatRouteHop(hop) });
|
|
140
189
|
consecutiveRejected += 1;
|
|
141
|
-
|
|
142
|
-
|
|
190
|
+
// ONE trip per run of rejections, re-armed when the cursor next moves.
|
|
191
|
+
// The old guard was per-ITERATION, so once the count passed the cap every
|
|
192
|
+
// further iteration pushed another identical trip.
|
|
193
|
+
if (consecutiveRejected >= maxRejectedRetries && !trippedRejectedCap) {
|
|
194
|
+
trippedRejectedCap = true;
|
|
143
195
|
trips.push({
|
|
144
196
|
kind: 'rejected-cap',
|
|
145
197
|
iteration,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RouteRecorder.js","sourceRoot":"","sources":["../../../../src/recorders/observability/RouteRecorder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"RouteRecorder.js","sourceRoot":"","sources":["../../../../src/recorders/observability/RouteRecorder.ts"],"names":[],"mappings":"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"}
|
|
@@ -76,7 +76,7 @@ function buildInjectionEngineSubflow(config) {
|
|
|
76
76
|
return (0, footprintjs_1.flowChart)('Gather', gatherStage, 'gather', {
|
|
77
77
|
description: "Snapshot this turn's injection inputs (iteration, history, last tool, LLM-activated)",
|
|
78
78
|
})
|
|
79
|
-
.addFunction('Evaluate', makeEvaluateStage(injections, config.nextSkill), 'evaluate', 'Evaluate every Injection trigger; produce activeInjections + metadata')
|
|
79
|
+
.addFunction('Evaluate', makeEvaluateStage(injections, config.nextSkill, config.explainNextSkill), 'evaluate', 'Evaluate every Injection trigger; produce activeInjections + metadata')
|
|
80
80
|
.addFunction('Route', routeStage, 'route', 'Partition active injections into per-slot buckets (system-prompt / messages / tools)')
|
|
81
81
|
.addFunction('Delta', deltaStage, 'delta', 'Per-slot delta vs last turn: what activated / deactivated / stayed')
|
|
82
82
|
.build();
|
|
@@ -94,7 +94,7 @@ function gatherStage(scope) {
|
|
|
94
94
|
});
|
|
95
95
|
}
|
|
96
96
|
// ── Stage 2: Evaluate (logic identical to the old single stage) ──────────
|
|
97
|
-
function makeEvaluateStage(injections, nextSkill) {
|
|
97
|
+
function makeEvaluateStage(injections, nextSkill, explainNextSkill) {
|
|
98
98
|
return (scope) => {
|
|
99
99
|
const args = scope.$getArgs();
|
|
100
100
|
const ctx = {
|
|
@@ -114,8 +114,13 @@ function makeEvaluateStage(injections, nextSkill) {
|
|
|
114
114
|
// (`nextSkillCursor`) because `currentSkillId` arrives as a readonly INPUT
|
|
115
115
|
// here; the mount's outputMapper maps it onto the parent's mutable
|
|
116
116
|
// `currentSkillId` for the next iteration. Skill-graph agents only.
|
|
117
|
-
|
|
118
|
-
|
|
117
|
+
// ONE consultation of the graph per iteration: when the graph can explain
|
|
118
|
+
// itself (8.5.0) the cursor comes out of `.to`, so asking for the cause costs
|
|
119
|
+
// nothing extra and cannot answer a different destination than the routing did.
|
|
120
|
+
const move = explainNextSkill ? explainNextSkill(ctx) : undefined;
|
|
121
|
+
const routes = explainNextSkill !== undefined || nextSkill !== undefined;
|
|
122
|
+
const cursor = move ? move.to : nextSkill ? nextSkill(ctx) : undefined;
|
|
123
|
+
if (routes) {
|
|
119
124
|
scope.$setValue('nextSkillCursor', cursor);
|
|
120
125
|
}
|
|
121
126
|
const evaluation = (0, evaluator_js_1.evaluateInjections)(injections, ctx);
|
|
@@ -145,6 +150,15 @@ function makeEvaluateStage(injections, nextSkill) {
|
|
|
145
150
|
const activePOJOs = evaluation.active.map(types_js_1.projectActiveInjection);
|
|
146
151
|
scope.$setValue('activeInjections', activePOJOs);
|
|
147
152
|
const routing = routingEntriesOf(evaluation.active);
|
|
153
|
+
// Structural copy (the events layer stays decoupled from `CursorMove`), and a
|
|
154
|
+
// POJO so it survives the emit channel's clone.
|
|
155
|
+
const cursorMove = move
|
|
156
|
+
? {
|
|
157
|
+
...(move.from !== undefined && { from: move.from }),
|
|
158
|
+
...(move.to !== undefined && { to: move.to }),
|
|
159
|
+
by: move.by,
|
|
160
|
+
}
|
|
161
|
+
: undefined;
|
|
148
162
|
// Aggregate evaluation metadata is pure OBSERVABILITY — no flow stage
|
|
149
163
|
// reads it — so it goes out the EMIT channel where a recorder/Lens can
|
|
150
164
|
// observe "what was considered, what won, what was skipped and why".
|
|
@@ -162,7 +176,17 @@ function makeEvaluateStage(injections, nextSkill) {
|
|
|
162
176
|
skillCatalog: skillCatalogOf(injections),
|
|
163
177
|
// Routing PROVENANCE for active skill-graph injections — the decision path
|
|
164
178
|
// / edge that reached each. Undefined when none came from a skillGraph().
|
|
179
|
+
//
|
|
180
|
+
// NOTE the difference from `cursorMove` below, which is the whole reason the
|
|
181
|
+
// latter exists: `routing[]` is BUILD-TIME provenance ("how is this skill
|
|
182
|
+
// reachable at all"), stamped once by the compiler. It answers per SKILL, not
|
|
183
|
+
// per HOP. Reading it as the cause of this turn's move is what made a model
|
|
184
|
+
// pick get recorded under a declared edge's label.
|
|
165
185
|
...(routing && { routing }),
|
|
186
|
+
// How the CURSOR actually moved this iteration, straight from the clause that
|
|
187
|
+
// won inside the resolver (8.5.0). Skill-graph agents only; absent for a graph
|
|
188
|
+
// built before `explainNextSkill` existed.
|
|
189
|
+
...(cursorMove && { cursorMove }),
|
|
166
190
|
});
|
|
167
191
|
};
|
|
168
192
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildInjectionEngineSubflow.js","sourceRoot":"","sources":["../../../src/lib/injection-engine/buildInjectionEngineSubflow.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;;;AAEH,6CAAwC;AAExC,oEAA8D;AAC9D,iDAAoD;AACpD,yCAKoB;AACpB,
|
|
1
|
+
{"version":3,"file":"buildInjectionEngineSubflow.js","sourceRoot":"","sources":["../../../src/lib/injection-engine/buildInjectionEngineSubflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/injection-engine/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAYH,+DAA+D;AAC/D,uCAAoD;AAA3C,kHAAA,sBAAsB,OAAA;AAE/B,SAAS;AACT,+CAAoD;AAA3C,kHAAA,kBAAkB,OAAA;AAC3B,mFAG0C;AAFxC,6IAAA,2BAA2B,OAAA;AAI7B,gFAAgF;AAChF,yEAAoG;AAA3F,yHAAA,iBAAiB,OAAA;AAC1B,6EAAoG;AAA3F,6HAAA,mBAAmB,OAAA;AAE5B,6DAOoC;AANlC,6GAAA,WAAW,OAAA;AACX,oHAAA,kBAAkB,OAAA;AAOpB,uDAA8E;AAArE,iHAAA,aAAa,OAAA;AAEtB,8EAA8E;AAC9E,+EAA+E;AAC/E,6DAA6D;AAC7D,uDAA8E;AAArE,iHAAA,aAAa,OAAA;AAEtB,wEAAwE;AACxE,sEAAsE;AACtE,iEAAiE;AACjE,+BAA+B;AAC/B,iDAA8F;AAArF,oHAAA,mBAAmB,OAAA;AAAE,mHAAA,kBAAkB,OAAA;AAEhD,mEAA2F;AAAlF,mHAAA,cAAc,OAAA;AAEvB,2DAA+E;AAAtE,2GAAA,UAAU,OAAA;AAEnB,6EAA6E;AAC7E,0EAA0E;AAC1E,qDAAqD;AACrD,qEAIwC;AAHtC,qHAAA,eAAe,OAAA;AAKjB,4EAA4E;AAC5E,8EAA8E;AAC9E,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/injection-engine/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAYH,+DAA+D;AAC/D,uCAAoD;AAA3C,kHAAA,sBAAsB,OAAA;AAE/B,SAAS;AACT,+CAAoD;AAA3C,kHAAA,kBAAkB,OAAA;AAC3B,mFAG0C;AAFxC,6IAAA,2BAA2B,OAAA;AAI7B,gFAAgF;AAChF,yEAAoG;AAA3F,yHAAA,iBAAiB,OAAA;AAC1B,6EAAoG;AAA3F,6HAAA,mBAAmB,OAAA;AAE5B,6DAOoC;AANlC,6GAAA,WAAW,OAAA;AACX,oHAAA,kBAAkB,OAAA;AAOpB,uDAA8E;AAArE,iHAAA,aAAa,OAAA;AAEtB,8EAA8E;AAC9E,+EAA+E;AAC/E,6DAA6D;AAC7D,uDAA8E;AAArE,iHAAA,aAAa,OAAA;AAEtB,wEAAwE;AACxE,sEAAsE;AACtE,iEAAiE;AACjE,+BAA+B;AAC/B,iDAA8F;AAArF,oHAAA,mBAAmB,OAAA;AAAE,mHAAA,kBAAkB,OAAA;AAEhD,mEAA2F;AAAlF,mHAAA,cAAc,OAAA;AAEvB,2DAA+E;AAAtE,2GAAA,UAAU,OAAA;AAEnB,6EAA6E;AAC7E,0EAA0E;AAC1E,qDAAqD;AACrD,qEAIwC;AAHtC,qHAAA,eAAe,OAAA;AAKjB,4EAA4E;AAC5E,8EAA8E;AAC9E,iDA+ByB;AA9BvB,2GAAA,UAAU,OAAA;AACV,4GAAA,WAAW,OAAA;AACX,yHAAA,wBAAwB,OAAA;AA6B1B,mDAO0B;AANxB,+GAAA,aAAa,OAAA;AACb,iHAAA,eAAe,OAAA;AACf,6GAAA,WAAW,OAAA;AAKb,uDAA6F;AAApF,sHAAA,kBAAkB,OAAA;AAAE,uHAAA,mBAAmB,OAAA;AAAE,kHAAA,cAAc,OAAA"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Where a skill's BODY actually lands — and the one combination where the honest
|
|
4
|
+
* answer is "nowhere" (8.5.0).
|
|
5
|
+
*
|
|
6
|
+
* `surfaceMode` names a delivery CHANNEL, and `'tool-only'` names the channel that
|
|
7
|
+
* only exists when the model calls `read_skill`: the body is returned as that tool's
|
|
8
|
+
* result, and the system slot suppresses it by design (`buildSystemPromptSlot`,
|
|
9
|
+
* mirrored in `routeActiveInjections`). That is exactly right for a skill `read_skill`
|
|
10
|
+
* activates, which is what the mode was designed against and what every shipped
|
|
11
|
+
* Block-C test covers.
|
|
12
|
+
*
|
|
13
|
+
* It is a hole for a skill the GRAPH activates. A route target, a flat entry and a
|
|
14
|
+
* decision-tree leaf all activate off the cursor, without any `read_skill` call — so
|
|
15
|
+
* the tool result never happens, the system slot suppresses the body anyway, and the
|
|
16
|
+
* body reaches the model through no channel at all. The skill's TOOLS still arrive,
|
|
17
|
+
* which makes it worse than the skill not loading: the model is handed the tools of a
|
|
18
|
+
* procedure it was never told.
|
|
19
|
+
*
|
|
20
|
+
* The rule that closes it is the one 8.4.0 already uses for the `read_skill` gate:
|
|
21
|
+
* `trigger.kind === 'llm-activated'` is precisely "read_skill can really activate
|
|
22
|
+
* this". A skill may claim the read_skill delivery channel exactly when read_skill is
|
|
23
|
+
* what activates it.
|
|
24
|
+
*
|
|
25
|
+
* Refusal rather than a quiet fall back to the system slot, because the author wrote
|
|
26
|
+
* `'tool-only'` to keep the body OUT of the system prompt (token cost, attention
|
|
27
|
+
* placement). Silently putting it back would honour the activation and break the
|
|
28
|
+
* declaration — a different lie, not a fix. `'both'` already means "deliver it either
|
|
29
|
+
* way", so the refusal has a real, one-word answer to name.
|
|
30
|
+
*/
|
|
31
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
|
+
exports.toolOnlyDeliveryRefusal = exports.activatesByRead = exports.resolvedSurfaceModeOf = void 0;
|
|
33
|
+
const defineSkill_js_1 = require("./factories/defineSkill.js");
|
|
34
|
+
/** A skill's declared surface mode, before any provider resolution. */
|
|
35
|
+
function declaredSurfaceModeOf(skill) {
|
|
36
|
+
const meta = skill.metadata;
|
|
37
|
+
return meta?.surfaceMode ?? 'auto';
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The surface mode a skill will be TREATED as at runtime.
|
|
41
|
+
*
|
|
42
|
+
* Today the runtime compares the literal string, so `'auto'` is its own mode and
|
|
43
|
+
* lands in the system slot — pass no provider and that is what you get back, which
|
|
44
|
+
* is the truth about the current engine.
|
|
45
|
+
*
|
|
46
|
+
* Pass a provider (and model) to ask the OTHER question: what would `'auto'` become
|
|
47
|
+
* if the `resolveSurfaceMode` cascade were wired into the runtime? It resolves to
|
|
48
|
+
* `'tool-only'` for every non-Claude provider, so wiring it in without this guard
|
|
49
|
+
* would silently open the delivered-nowhere hole for every OpenAI / Bedrock / Ollama
|
|
50
|
+
* user at once. Routing both questions through ONE function is what keeps that from
|
|
51
|
+
* being a future accident: the refusal below is written against this, so the day the
|
|
52
|
+
* cascade is wired in, the guard already covers it.
|
|
53
|
+
*/
|
|
54
|
+
function resolvedSurfaceModeOf(skill, provider, model) {
|
|
55
|
+
const declared = declaredSurfaceModeOf(skill);
|
|
56
|
+
if (declared !== 'auto' || provider === undefined)
|
|
57
|
+
return declared;
|
|
58
|
+
return (0, defineSkill_js_1.resolveSurfaceMode)(provider, model);
|
|
59
|
+
}
|
|
60
|
+
exports.resolvedSurfaceModeOf = resolvedSurfaceModeOf;
|
|
61
|
+
/**
|
|
62
|
+
* Can this skill's body be delivered through the `read_skill` tool result?
|
|
63
|
+
*
|
|
64
|
+
* Only if `read_skill` is what activates it. `'llm-activated'` is the one trigger
|
|
65
|
+
* kind that reads `activatedInjectionIds`, which is the only thing a `read_skill`
|
|
66
|
+
* call writes — the same clause the gate's open-skill rule turns on (8.4.0).
|
|
67
|
+
*/
|
|
68
|
+
function activatesByRead(skill) {
|
|
69
|
+
return skill.trigger.kind === 'llm-activated';
|
|
70
|
+
}
|
|
71
|
+
exports.activatesByRead = activatesByRead;
|
|
72
|
+
/** How a refused skill is identified back to its author, so a directory-sized
|
|
73
|
+
* refusal reads as a list of names and reasons rather than one mystery. */
|
|
74
|
+
function describeRouting(skill) {
|
|
75
|
+
const routing = skill.metadata
|
|
76
|
+
?.skillGraph;
|
|
77
|
+
if (routing?.via === 'route') {
|
|
78
|
+
return routing.from
|
|
79
|
+
? `a route target (the graph routes "${routing.from}" → "${skill.id}")`
|
|
80
|
+
: 'a route target';
|
|
81
|
+
}
|
|
82
|
+
if (routing?.via === 'entry')
|
|
83
|
+
return 'a graph entry';
|
|
84
|
+
if (routing?.via === 'tree')
|
|
85
|
+
return 'a decision-tree leaf';
|
|
86
|
+
return `activated by rule (trigger '${skill.trigger.kind}')`;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Refuse every skill that claims the `read_skill` delivery channel without being
|
|
90
|
+
* activated by `read_skill`. Returns the message, or `undefined` when all is well.
|
|
91
|
+
*
|
|
92
|
+
* Runs over the FINAL injection list — the agent is the only place that sees every
|
|
93
|
+
* skill's compiled trigger, whichever call registered it — and names every offender,
|
|
94
|
+
* because `skillsFromDir({ surfaceMode: 'tool-only' })` under a graph refuses a whole
|
|
95
|
+
* directory at once and a list is debuggable where one sample is not.
|
|
96
|
+
*/
|
|
97
|
+
function toolOnlyDeliveryRefusal(injections) {
|
|
98
|
+
const offenders = injections.filter((i) => i.flavor === 'skill' &&
|
|
99
|
+
resolvedSurfaceModeOf(i) === 'tool-only' &&
|
|
100
|
+
!activatesByRead(i) &&
|
|
101
|
+
(i.inject.systemPrompt ?? '').length > 0);
|
|
102
|
+
if (offenders.length === 0)
|
|
103
|
+
return undefined;
|
|
104
|
+
const list = offenders.map((s) => ` • "${s.id}" — ${describeRouting(s)}`).join('\n');
|
|
105
|
+
const subject = offenders.length === 1 ? 'This skill sets' : 'These skills set';
|
|
106
|
+
const its = offenders.length === 1 ? 'its' : 'their';
|
|
107
|
+
return (`Agent: ${subject} surfaceMode: 'tool-only', which delivers the body as the ` +
|
|
108
|
+
`read_skill tool result — but nothing here activates by read_skill, so ${its} ` +
|
|
109
|
+
`body would reach the model NOWHERE: the system slot suppresses a tool-only body ` +
|
|
110
|
+
`by design, and no read_skill call happens to carry it.\n${list}\n` +
|
|
111
|
+
`Use 'both' (system prompt AND tool result) or 'system-prompt'. Only a skill ` +
|
|
112
|
+
`read_skill actually activates — trigger 'llm-activated', which is every skill a ` +
|
|
113
|
+
`graph does not route — can be 'tool-only'.`);
|
|
114
|
+
}
|
|
115
|
+
exports.toolOnlyDeliveryRefusal = toolOnlyDeliveryRefusal;
|
|
116
|
+
//# sourceMappingURL=skillBodyDelivery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillBodyDelivery.js","sourceRoot":"","sources":["../../../src/lib/injection-engine/skillBodyDelivery.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;;;AAGH,+DAAkF;AAElF,uEAAuE;AACvE,SAAS,qBAAqB,CAAC,KAAgB;IAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,QAAqD,CAAC;IACzE,OAAO,IAAI,EAAE,WAAW,IAAI,MAAM,CAAC;AACrC,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAgB,qBAAqB,CACnC,KAAgB,EAChB,QAAiB,EACjB,KAAc;IAEd,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACnE,OAAO,IAAA,mCAAkB,EAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC7C,CAAC;AARD,sDAQC;AAED;;;;;;GAMG;AACH,SAAgB,eAAe,CAAC,KAAgB;IAC9C,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,eAAe,CAAC;AAChD,CAAC;AAFD,0CAEC;AAED;4EAC4E;AAC5E,SAAS,eAAe,CAAC,KAAgB;IACvC,MAAM,OAAO,GAAI,KAAK,CAAC,QAAyE;QAC9F,EAAE,UAAU,CAAC;IACf,IAAI,OAAO,EAAE,GAAG,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO,OAAO,CAAC,IAAI;YACjB,CAAC,CAAC,qCAAqC,OAAO,CAAC,IAAI,QAAQ,KAAK,CAAC,EAAE,IAAI;YACvE,CAAC,CAAC,gBAAgB,CAAC;IACvB,CAAC;IACD,IAAI,OAAO,EAAE,GAAG,KAAK,OAAO;QAAE,OAAO,eAAe,CAAC;IACrD,IAAI,OAAO,EAAE,GAAG,KAAK,MAAM;QAAE,OAAO,sBAAsB,CAAC;IAC3D,OAAO,+BAA+B,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;AAC/D,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,uBAAuB,CAAC,UAAgC;IACtE,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CACjC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,MAAM,KAAK,OAAO;QACpB,qBAAqB,CAAC,CAAC,CAAC,KAAK,WAAW;QACxC,CAAC,eAAe,CAAC,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAC3C,CAAC;IACF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAE7C,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,kBAAkB,CAAC;IAChF,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;IACrD,OAAO,CACL,UAAU,OAAO,4DAA4D;QAC7E,yEAAyE,GAAG,GAAG;QAC/E,kFAAkF;QAClF,2DAA2D,IAAI,IAAI;QACnE,8EAA8E;QAC9E,kFAAkF;QAClF,4CAA4C,CAC7C,CAAC;AACJ,CAAC;AAtBD,0DAsBC"}
|