agentfootprint 9.16.0 → 9.17.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 +1 -1
- package/CLAUDE.md +1 -1
- package/README.md +2 -0
- package/ai-instructions/claude-code/SKILL.md +1 -1
- package/dist/core/Agent.js +92 -4
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/agent/AgentBuilder.js +85 -3
- package/dist/core/agent/AgentBuilder.js.map +1 -1
- package/dist/core/agent/buildAgentChart.js +14 -5
- package/dist/core/agent/buildAgentChart.js.map +1 -1
- package/dist/core/agent/buildDynamicAgentChart.js +17 -4
- package/dist/core/agent/buildDynamicAgentChart.js.map +1 -1
- package/dist/core/agent/stages/routeTurn.js +308 -0
- package/dist/core/agent/stages/routeTurn.js.map +1 -0
- package/dist/core/agent/stages/seed.js +9 -0
- package/dist/core/agent/stages/seed.js.map +1 -1
- package/dist/core/agent/stages/toolCalls.js +53 -0
- package/dist/core/agent/stages/toolCalls.js.map +1 -1
- package/dist/core/runCheckpoint.js +18 -1
- package/dist/core/runCheckpoint.js.map +1 -1
- package/dist/core/slots/buildToolsSlot.js +19 -0
- package/dist/core/slots/buildToolsSlot.js.map +1 -1
- package/dist/esm/core/Agent.d.ts +33 -2
- package/dist/esm/core/Agent.js +92 -4
- package/dist/esm/core/Agent.js.map +1 -1
- package/dist/esm/core/agent/AgentBuilder.d.ts +68 -6
- package/dist/esm/core/agent/AgentBuilder.js +85 -3
- package/dist/esm/core/agent/AgentBuilder.js.map +1 -1
- package/dist/esm/core/agent/buildAgentChart.d.ts +9 -0
- package/dist/esm/core/agent/buildAgentChart.js +14 -5
- package/dist/esm/core/agent/buildAgentChart.js.map +1 -1
- package/dist/esm/core/agent/buildDynamicAgentChart.js +17 -4
- package/dist/esm/core/agent/buildDynamicAgentChart.js.map +1 -1
- package/dist/esm/core/agent/stages/routeTurn.d.ts +73 -0
- package/dist/esm/core/agent/stages/routeTurn.js +304 -0
- package/dist/esm/core/agent/stages/routeTurn.js.map +1 -0
- package/dist/esm/core/agent/stages/seed.d.ts +14 -0
- package/dist/esm/core/agent/stages/seed.js +9 -0
- package/dist/esm/core/agent/stages/seed.js.map +1 -1
- package/dist/esm/core/agent/stages/toolCalls.d.ts +16 -0
- package/dist/esm/core/agent/stages/toolCalls.js +53 -0
- package/dist/esm/core/agent/stages/toolCalls.js.map +1 -1
- package/dist/esm/core/agent/types.d.ts +6 -0
- package/dist/esm/core/runCheckpoint.d.ts +29 -1
- package/dist/esm/core/runCheckpoint.js +18 -1
- package/dist/esm/core/runCheckpoint.js.map +1 -1
- package/dist/esm/core/slots/buildToolsSlot.d.ts +10 -0
- package/dist/esm/core/slots/buildToolsSlot.js +19 -0
- package/dist/esm/core/slots/buildToolsSlot.js.map +1 -1
- package/dist/esm/events/payloads.d.ts +81 -1
- package/dist/esm/events/registry.d.ts +3 -1
- package/dist/esm/events/registry.js +2 -0
- package/dist/esm/events/registry.js.map +1 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/injection-engine/buildInjectionEngineSubflow.js +20 -0
- package/dist/esm/lib/injection-engine/buildInjectionEngineSubflow.js.map +1 -1
- package/dist/esm/lib/injection-engine/entryScorer.d.ts +20 -2
- package/dist/esm/lib/injection-engine/entryScorer.js +60 -22
- package/dist/esm/lib/injection-engine/entryScorer.js.map +1 -1
- package/dist/esm/lib/injection-engine/factories/defineMenuHint.d.ts +39 -0
- package/dist/esm/lib/injection-engine/factories/defineMenuHint.js +53 -0
- package/dist/esm/lib/injection-engine/factories/defineMenuHint.js.map +1 -0
- package/dist/esm/lib/injection-engine/index.d.ts +5 -0
- package/dist/esm/lib/injection-engine/index.js +8 -0
- package/dist/esm/lib/injection-engine/index.js.map +1 -1
- package/dist/esm/lib/injection-engine/intentScorer.d.ts +78 -0
- package/dist/esm/lib/injection-engine/intentScorer.js +56 -0
- package/dist/esm/lib/injection-engine/intentScorer.js.map +1 -0
- package/dist/esm/lib/injection-engine/llmClassifier.d.ts +36 -0
- package/dist/esm/lib/injection-engine/llmClassifier.js +140 -0
- package/dist/esm/lib/injection-engine/llmClassifier.js.map +1 -0
- package/dist/esm/lib/injection-engine/routingPolicy.d.ts +154 -0
- package/dist/esm/lib/injection-engine/routingPolicy.js +128 -0
- package/dist/esm/lib/injection-engine/routingPolicy.js.map +1 -0
- package/dist/esm/lib/injection-engine/skillGraph.d.ts +76 -2
- package/dist/esm/lib/injection-engine/skillGraph.js +135 -14
- package/dist/esm/lib/injection-engine/skillGraph.js.map +1 -1
- package/dist/esm/lib/injection-engine/skillGraphCheckup.d.ts +11 -1
- package/dist/esm/lib/injection-engine/skillGraphCheckup.js +28 -2
- package/dist/esm/lib/injection-engine/skillGraphCheckup.js.map +1 -1
- package/dist/esm/lib/injection-engine/skillIntent.d.ts +88 -0
- package/dist/esm/lib/injection-engine/skillIntent.js +192 -0
- package/dist/esm/lib/injection-engine/skillIntent.js.map +1 -0
- package/dist/esm/lib/injection-engine/skillMatch.d.ts +28 -6
- package/dist/esm/lib/injection-engine/skillMatch.js +47 -12
- package/dist/esm/lib/injection-engine/skillMatch.js.map +1 -1
- package/dist/esm/lib/injection-engine/skillTools.d.ts +24 -0
- package/dist/esm/lib/injection-engine/skillTools.js +24 -4
- package/dist/esm/lib/injection-engine/skillTools.js.map +1 -1
- package/dist/esm/lib/injection-engine/types.d.ts +10 -0
- package/dist/esm/lib/injection-engine/types.js.map +1 -1
- package/dist/esm/recorders/observability/RouteRecorder.d.ts +6 -1
- package/dist/esm/recorders/observability/RouteRecorder.js +9 -0
- package/dist/esm/recorders/observability/RouteRecorder.js.map +1 -1
- package/dist/esm/recorders/observability/commentary/commentaryTemplates.js +44 -0
- package/dist/esm/recorders/observability/commentary/commentaryTemplates.js.map +1 -1
- package/dist/events/registry.js +2 -0
- package/dist/events/registry.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/injection-engine/buildInjectionEngineSubflow.js +20 -0
- package/dist/lib/injection-engine/buildInjectionEngineSubflow.js.map +1 -1
- package/dist/lib/injection-engine/entryScorer.js +60 -22
- package/dist/lib/injection-engine/entryScorer.js.map +1 -1
- package/dist/lib/injection-engine/factories/defineMenuHint.js +57 -0
- package/dist/lib/injection-engine/factories/defineMenuHint.js.map +1 -0
- package/dist/lib/injection-engine/index.js +18 -1
- package/dist/lib/injection-engine/index.js.map +1 -1
- package/dist/lib/injection-engine/intentScorer.js +60 -0
- package/dist/lib/injection-engine/intentScorer.js.map +1 -0
- package/dist/lib/injection-engine/llmClassifier.js +144 -0
- package/dist/lib/injection-engine/llmClassifier.js.map +1 -0
- package/dist/lib/injection-engine/routingPolicy.js +134 -0
- package/dist/lib/injection-engine/routingPolicy.js.map +1 -0
- package/dist/lib/injection-engine/skillGraph.js +134 -13
- package/dist/lib/injection-engine/skillGraph.js.map +1 -1
- package/dist/lib/injection-engine/skillGraphCheckup.js +28 -2
- package/dist/lib/injection-engine/skillGraphCheckup.js.map +1 -1
- package/dist/lib/injection-engine/skillIntent.js +199 -0
- package/dist/lib/injection-engine/skillIntent.js.map +1 -0
- package/dist/lib/injection-engine/skillMatch.js +47 -12
- package/dist/lib/injection-engine/skillMatch.js.map +1 -1
- package/dist/lib/injection-engine/skillTools.js +24 -4
- package/dist/lib/injection-engine/skillTools.js.map +1 -1
- package/dist/lib/injection-engine/types.js.map +1 -1
- package/dist/recorders/observability/RouteRecorder.js +9 -0
- package/dist/recorders/observability/RouteRecorder.js.map +1 -1
- package/dist/recorders/observability/commentary/commentaryTemplates.js +44 -0
- package/dist/recorders/observability/commentary/commentaryTemplates.js.map +1 -1
- package/dist/types/core/Agent.d.ts +33 -2
- package/dist/types/core/Agent.d.ts.map +1 -1
- package/dist/types/core/agent/AgentBuilder.d.ts +68 -6
- package/dist/types/core/agent/AgentBuilder.d.ts.map +1 -1
- package/dist/types/core/agent/buildAgentChart.d.ts +9 -0
- 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/routeTurn.d.ts +74 -0
- package/dist/types/core/agent/stages/routeTurn.d.ts.map +1 -0
- package/dist/types/core/agent/stages/seed.d.ts +14 -0
- package/dist/types/core/agent/stages/seed.d.ts.map +1 -1
- package/dist/types/core/agent/stages/toolCalls.d.ts +16 -0
- package/dist/types/core/agent/stages/toolCalls.d.ts.map +1 -1
- package/dist/types/core/agent/types.d.ts +6 -0
- package/dist/types/core/agent/types.d.ts.map +1 -1
- package/dist/types/core/runCheckpoint.d.ts +29 -1
- package/dist/types/core/runCheckpoint.d.ts.map +1 -1
- package/dist/types/core/slots/buildToolsSlot.d.ts +10 -0
- package/dist/types/core/slots/buildToolsSlot.d.ts.map +1 -1
- package/dist/types/events/payloads.d.ts +81 -1
- package/dist/types/events/payloads.d.ts.map +1 -1
- package/dist/types/events/registry.d.ts +3 -1
- package/dist/types/events/registry.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/lib/injection-engine/buildInjectionEngineSubflow.d.ts.map +1 -1
- package/dist/types/lib/injection-engine/entryScorer.d.ts +20 -2
- package/dist/types/lib/injection-engine/entryScorer.d.ts.map +1 -1
- package/dist/types/lib/injection-engine/factories/defineMenuHint.d.ts +40 -0
- package/dist/types/lib/injection-engine/factories/defineMenuHint.d.ts.map +1 -0
- package/dist/types/lib/injection-engine/index.d.ts +5 -0
- package/dist/types/lib/injection-engine/index.d.ts.map +1 -1
- package/dist/types/lib/injection-engine/intentScorer.d.ts +79 -0
- package/dist/types/lib/injection-engine/intentScorer.d.ts.map +1 -0
- package/dist/types/lib/injection-engine/llmClassifier.d.ts +37 -0
- package/dist/types/lib/injection-engine/llmClassifier.d.ts.map +1 -0
- package/dist/types/lib/injection-engine/routingPolicy.d.ts +155 -0
- package/dist/types/lib/injection-engine/routingPolicy.d.ts.map +1 -0
- package/dist/types/lib/injection-engine/skillGraph.d.ts +76 -2
- package/dist/types/lib/injection-engine/skillGraph.d.ts.map +1 -1
- package/dist/types/lib/injection-engine/skillGraphCheckup.d.ts +11 -1
- package/dist/types/lib/injection-engine/skillGraphCheckup.d.ts.map +1 -1
- package/dist/types/lib/injection-engine/skillIntent.d.ts +89 -0
- package/dist/types/lib/injection-engine/skillIntent.d.ts.map +1 -0
- package/dist/types/lib/injection-engine/skillMatch.d.ts +28 -6
- package/dist/types/lib/injection-engine/skillMatch.d.ts.map +1 -1
- package/dist/types/lib/injection-engine/skillTools.d.ts +24 -0
- package/dist/types/lib/injection-engine/skillTools.d.ts.map +1 -1
- package/dist/types/lib/injection-engine/types.d.ts +10 -0
- package/dist/types/lib/injection-engine/types.d.ts.map +1 -1
- package/dist/types/recorders/observability/RouteRecorder.d.ts +6 -1
- package/dist/types/recorders/observability/RouteRecorder.d.ts.map +1 -1
- package/dist/types/recorders/observability/commentary/commentaryTemplates.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RouteTurn — the turn-start routing cascade stage (SG-C).
|
|
4
|
+
*
|
|
5
|
+
* Runs ONCE per turn, BEFORE the ReAct loop, in the slot PickEntry has always
|
|
6
|
+
* occupied (`STAGE_IDS.PICK_ENTRY` — recorded structures stay stable), so
|
|
7
|
+
* anything async (a classifier, an embedder, one model call) is paid off the
|
|
8
|
+
* hot loop and `nextSkill` stays synchronous. It decides where the turn
|
|
9
|
+
* STARTS and writes the verdict to `scope.turnRoute`; the graph's cursor
|
|
10
|
+
* resolver consumes it on iteration 1 — the exact mechanism
|
|
11
|
+
* `entryScores`/`pendingSkillPick` already use. Iterations 2..N keep today's
|
|
12
|
+
* law byte-for-byte (`userMessage` is fixed for a run).
|
|
13
|
+
*
|
|
14
|
+
* The cascade:
|
|
15
|
+
* tier 1 — declared start rules (regex / keywords / `when`), declaration
|
|
16
|
+
* order, binary and decisive;
|
|
17
|
+
* tier 2 — the configured scorer: the intent classifier (`classify`) over
|
|
18
|
+
* declared intents, or the entry scorer (`entryBy*`) over
|
|
19
|
+
* descriptions — judged by `decideTier2` (floor + pairwise
|
|
20
|
+
* near-tie margin; near-ties FALL THROUGH, never argmax);
|
|
21
|
+
* tier 3 — a menu through the model's own `read_skill` description (plus
|
|
22
|
+
* the advisory menu hint), STAY first-class mid-conversation.
|
|
23
|
+
*
|
|
24
|
+
* Mounted only on graphs that run the cascade — `classify` configured, or
|
|
25
|
+
* `continuity: 'conversation'` declared. A 9.16-style graph (scorer or not)
|
|
26
|
+
* keeps its exact prior stage and events: scorer-only graphs keep PickEntry
|
|
27
|
+
* byte-for-byte, and the cascade fires no `turn_routed` there.
|
|
28
|
+
*
|
|
29
|
+
* Mid-conversation (an inherited cursor from `continuity: 'conversation'`):
|
|
30
|
+
* sticky default — the incumbent is scored AS A CANDIDATE, beaten only by a
|
|
31
|
+
* decisive tier-1/tier-2 verdict; ambiguity = stay; genuinely-new-but-
|
|
32
|
+
* unmatched opens the full menu with STAY first-class. An inherited id the
|
|
33
|
+
* mounted graph does not know is DROPPED (cold start), dev-warned, and
|
|
34
|
+
* recorded as `turn_routed.droppedResume` — never silently parked on a node
|
|
35
|
+
* that does not exist.
|
|
36
|
+
*
|
|
37
|
+
* Every verdict lands on `agentfootprint.skill.turn_routed` with the losers
|
|
38
|
+
* (`scores`, ranked), the pairwise runner-up gap, and the policy numbers that
|
|
39
|
+
* judged it. A throwing/misbehaving scorer never aborts the run: cold start
|
|
40
|
+
* falls through to the FULL menu (recorded — never the declaration-order
|
|
41
|
+
* walk), mid-conversation stays put (`by: 'continuity'`), both dev-warned.
|
|
42
|
+
*
|
|
43
|
+
* `strictness: 'rails'` and menus: the model is not allowed to route, so a
|
|
44
|
+
* menu verdict proceeds on the base prompt — recorded as `by: 'none'` WITH
|
|
45
|
+
* the offered set on the EVENT (what happened), while `scope.turnRoute`
|
|
46
|
+
* carries no `offered` (what the loop may act on): no envelope is composed,
|
|
47
|
+
* and no entry loads. That is the honest cost of rails without a resolver,
|
|
48
|
+
* and the README names it.
|
|
49
|
+
*/
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
exports.makeRouteTurnStage = void 0;
|
|
52
|
+
const footprintjs_1 = require("footprintjs");
|
|
53
|
+
const intentScorer_js_1 = require("../../../lib/injection-engine/intentScorer.js");
|
|
54
|
+
const routingPolicy_js_1 = require("../../../lib/injection-engine/routingPolicy.js");
|
|
55
|
+
const typedEmit_js_1 = require("../../../recorders/core/typedEmit.js");
|
|
56
|
+
function makeRouteTurnStage(deps) {
|
|
57
|
+
const plan = deps.turnRouting;
|
|
58
|
+
return async (scope) => {
|
|
59
|
+
const env = scope.$getEnv();
|
|
60
|
+
let inherited = scope.currentSkillId;
|
|
61
|
+
// Deploy honesty: an inherited id that is not a node of the CURRENTLY
|
|
62
|
+
// mounted graph is dropped (cold start), never silently parked on a node
|
|
63
|
+
// that does not exist.
|
|
64
|
+
let droppedResume;
|
|
65
|
+
if (inherited !== undefined && !deps.isNode(inherited)) {
|
|
66
|
+
droppedResume = { id: inherited, reason: 'unknown-skill' };
|
|
67
|
+
scope.currentSkillId = undefined;
|
|
68
|
+
if ((0, footprintjs_1.isDevMode)()) {
|
|
69
|
+
// eslint-disable-next-line no-console
|
|
70
|
+
console.warn(`agentfootprint RouteTurn: the conversation's stored cursor "${inherited}" is not a ` +
|
|
71
|
+
`node of the currently mounted graph (a deploy changed it?) — starting cold. ` +
|
|
72
|
+
`Recorded as turn_routed.droppedResume.`);
|
|
73
|
+
}
|
|
74
|
+
inherited = undefined;
|
|
75
|
+
}
|
|
76
|
+
const ctx = {
|
|
77
|
+
iteration: scope.iteration ?? 1,
|
|
78
|
+
userMessage: scope.userMessage ?? '',
|
|
79
|
+
history: scope.history ?? [],
|
|
80
|
+
activatedInjectionIds: scope.activatedInjectionIds ?? [],
|
|
81
|
+
...(inherited !== undefined && { currentSkillId: inherited }),
|
|
82
|
+
};
|
|
83
|
+
const resolved = await resolveHidden(deps.hiddenSkillIds);
|
|
84
|
+
// Fail CLOSED: a throwing resolver hides EVERY graph candidate this turn
|
|
85
|
+
// (the cascade degrades to continuity-stay / base prompt, all recorded)
|
|
86
|
+
// rather than advertising skills a policy may have meant to hide.
|
|
87
|
+
const hidden = resolved === 'resolver-failed' ? new Set(plan.entryIds) : new Set(resolved);
|
|
88
|
+
if (resolved === 'resolver-failed' && (0, footprintjs_1.isDevMode)()) {
|
|
89
|
+
console.warn('agentfootprint: the hidden-skills resolver threw during turn routing — ' +
|
|
90
|
+
'failing closed (no graph candidates scored or offered this turn). ' +
|
|
91
|
+
'Fix the resolver passed to hiddenSkillIds.');
|
|
92
|
+
}
|
|
93
|
+
const visibleEntryIds = plan.entryIds.filter((id) => !hidden.has(id));
|
|
94
|
+
const verdict = await runCascade(deps, plan, ctx, inherited, hidden, visibleEntryIds, env.signal);
|
|
95
|
+
if (verdict === undefined && droppedResume === undefined) {
|
|
96
|
+
// Cold start on a continuity graph with no tier 2 at all: the resolver's
|
|
97
|
+
// cold walk decides exactly as it always has — no verdict, no event.
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
// The shipped ranking surface (defineRelevanceHint, the Why-panel) — the
|
|
101
|
+
// tier-2 numbers, whatever scorer produced them.
|
|
102
|
+
if (verdict?.scores !== undefined && verdict.scorer !== undefined) {
|
|
103
|
+
scope.entryScores = verdict.scores;
|
|
104
|
+
scope.entryScorer = verdict.scorer;
|
|
105
|
+
}
|
|
106
|
+
const policy = plan.policy;
|
|
107
|
+
const effectiveFloor = policy.floor ?? plan.scorer?.floor;
|
|
108
|
+
// Rails × menu: the model may not act on it — record the offer, act on none.
|
|
109
|
+
const rails = deps.strictness === 'rails';
|
|
110
|
+
const eventBy = rails && verdict?.by === 'menu' ? 'none' : verdict?.by ?? 'none';
|
|
111
|
+
(0, typedEmit_js_1.typedEmit)(scope, 'agentfootprint.skill.turn_routed', {
|
|
112
|
+
by: eventBy,
|
|
113
|
+
...(inherited !== undefined && { from: inherited }),
|
|
114
|
+
...(verdict?.to !== undefined && { to: verdict.to }),
|
|
115
|
+
...(verdict?.scorer !== undefined && { scorer: verdict.scorer }),
|
|
116
|
+
...(verdict?.scores !== undefined && { scores: verdict.scores.map((s) => ({ ...s })) }),
|
|
117
|
+
...(verdict?.runnerUp !== undefined && { runnerUp: { ...verdict.runnerUp } }),
|
|
118
|
+
...(verdict?.decisive !== undefined && { decisive: verdict.decisive }),
|
|
119
|
+
...(verdict?.offered !== undefined && { offered: [...verdict.offered] }),
|
|
120
|
+
...(verdict?.stayOffered !== undefined && { stayOffered: verdict.stayOffered }),
|
|
121
|
+
policy: {
|
|
122
|
+
nearTieMargin: policy.nearTieMargin,
|
|
123
|
+
menuSize: policy.menuSize,
|
|
124
|
+
...(effectiveFloor !== undefined && { floor: effectiveFloor }),
|
|
125
|
+
},
|
|
126
|
+
...(verdict?.window !== undefined && { window: verdict.window }),
|
|
127
|
+
...(droppedResume !== undefined && { droppedResume }),
|
|
128
|
+
});
|
|
129
|
+
// The POJO the LOOP acts on — the resolver's iteration-1 input, the
|
|
130
|
+
// envelope's source, the guard gate's window. Under rails a menu carries
|
|
131
|
+
// no `offered` here: nothing downstream may offer what nothing may accept.
|
|
132
|
+
// Written ONLY when the cascade DECIDED something: the resolver suppresses
|
|
133
|
+
// its cold-start walk on the POJO's presence (suppression follows the
|
|
134
|
+
// verdict), so a droppedResume with nothing else to say — a TRUE cold
|
|
135
|
+
// start on a graph whose cold walk still decides — must leave scope
|
|
136
|
+
// untouched, or the drop would silently strand the turn on no entry.
|
|
137
|
+
if (verdict === undefined)
|
|
138
|
+
return;
|
|
139
|
+
const turnRoute = {
|
|
140
|
+
by: eventBy,
|
|
141
|
+
...(inherited !== undefined && { from: inherited }),
|
|
142
|
+
...(verdict.to !== undefined && { to: verdict.to }),
|
|
143
|
+
...(!rails && verdict.offered !== undefined && { offered: [...verdict.offered] }),
|
|
144
|
+
...(!rails && verdict.stayOffered !== undefined && { stayOffered: verdict.stayOffered }),
|
|
145
|
+
...(!rails &&
|
|
146
|
+
verdict.offered !== undefined &&
|
|
147
|
+
verdict.scores !== undefined && {
|
|
148
|
+
relevance: verdict.scores.map((s) => ({ id: s.id, relevance: s.relevance })),
|
|
149
|
+
}),
|
|
150
|
+
};
|
|
151
|
+
scope.turnRoute = turnRoute;
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
exports.makeRouteTurnStage = makeRouteTurnStage;
|
|
155
|
+
/** Resolve the role-hidden set. A throwing resolver returns the sentinel so the
|
|
156
|
+
* caller can fail CLOSED (hide every candidate) — a menu built on a question
|
|
157
|
+
* nobody answered would advertise what policy hides. */
|
|
158
|
+
async function resolveHidden(hiddenSkillIds) {
|
|
159
|
+
if (!hiddenSkillIds)
|
|
160
|
+
return [];
|
|
161
|
+
try {
|
|
162
|
+
const asked = hiddenSkillIds();
|
|
163
|
+
return asked instanceof Promise ? await asked : asked;
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return 'resolver-failed';
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/** The cascade proper. Returns undefined when the stage has nothing to decide
|
|
170
|
+
* (cold start, no classifier, no scorer — the resolver's law). */
|
|
171
|
+
async function runCascade(deps, plan, ctx, inherited, hidden, visibleEntryIds, signal) {
|
|
172
|
+
const cold = inherited === undefined;
|
|
173
|
+
// Tier 1 — declared rules, declaration order. Binary: a rule match is
|
|
174
|
+
// decisive by definition, cold or mid-conversation.
|
|
175
|
+
const ruleWin = plan.firstRuleMatch(ctx);
|
|
176
|
+
if (ruleWin !== undefined) {
|
|
177
|
+
return { by: 'entry', to: ruleWin, decisive: true };
|
|
178
|
+
}
|
|
179
|
+
// Tier 2 — the classifier over declared intents…
|
|
180
|
+
if (plan.scorer !== undefined) {
|
|
181
|
+
const scorer = plan.scorer;
|
|
182
|
+
const candidates = [...plan.intentCandidates(hidden)];
|
|
183
|
+
if (!cold && !hidden.has(inherited) && !candidates.some((c) => c.id === inherited)) {
|
|
184
|
+
// The incumbent is judged by the same numbers as its challengers — its
|
|
185
|
+
// intent is its description when it is not an intent entry.
|
|
186
|
+
candidates.push(plan.incumbentCandidate(inherited));
|
|
187
|
+
}
|
|
188
|
+
if (candidates.length === 0) {
|
|
189
|
+
return cold
|
|
190
|
+
? menuVerdict(visibleEntryIds, false, scorer.name, scorer.window)
|
|
191
|
+
: { by: 'continuity', to: inherited, scorer: scorer.name };
|
|
192
|
+
}
|
|
193
|
+
let scores;
|
|
194
|
+
try {
|
|
195
|
+
const input = {
|
|
196
|
+
message: ctx.userMessage,
|
|
197
|
+
...(scorer.window !== undefined && {
|
|
198
|
+
recentTurns: recentTurnsOf(ctx.history, scorer.window),
|
|
199
|
+
}),
|
|
200
|
+
};
|
|
201
|
+
const raw = await scorer.score(input, candidates, signal);
|
|
202
|
+
scores = (0, intentScorer_js_1.validateIntentScores)(scorer.name, candidates, raw);
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
return scorerFellThrough(err, scorer.name, cold, inherited, visibleEntryIds, scorer.window);
|
|
206
|
+
}
|
|
207
|
+
const v = (0, routingPolicy_js_1.decideTier2)(scores, cold ? undefined : inherited, plan.policy, {
|
|
208
|
+
...(scorer.floor !== undefined && { floor: scorer.floor }),
|
|
209
|
+
...(scorer.categorical !== undefined && { categorical: scorer.categorical }),
|
|
210
|
+
});
|
|
211
|
+
return mapTier2(v, scorer.name, cold, inherited, visibleEntryIds, scorer.window);
|
|
212
|
+
}
|
|
213
|
+
// …or the entry scorer over descriptions (entryBy/entryByRelevance graphs
|
|
214
|
+
// that opted into the cascade via continuity).
|
|
215
|
+
if (deps.scoreEntries !== undefined) {
|
|
216
|
+
let scoring;
|
|
217
|
+
try {
|
|
218
|
+
scoring = await deps.scoreEntries(ctx, signal);
|
|
219
|
+
}
|
|
220
|
+
catch (err) {
|
|
221
|
+
return scorerFellThrough(err, 'entry-scorer', cold, inherited, visibleEntryIds, undefined);
|
|
222
|
+
}
|
|
223
|
+
// Role-hidden candidates never appear in scores, menus or the envelope.
|
|
224
|
+
let ranked = scoring.ranked.filter((r) => !hidden.has(r.id));
|
|
225
|
+
if (!cold && !hidden.has(inherited) && !ranked.some((r) => r.id === inherited)) {
|
|
226
|
+
// The incumbent was not a when-passing entry candidate this turn — score
|
|
227
|
+
// floor-less zero so the same verdict function judges it. (An entry
|
|
228
|
+
// scorer declares no floor, so 0 is a rank, not "unmatched".)
|
|
229
|
+
ranked = [...ranked, { id: inherited, score: 0, relevance: 0 }];
|
|
230
|
+
}
|
|
231
|
+
if (ranked.length === 0)
|
|
232
|
+
return cold
|
|
233
|
+
? menuVerdict(visibleEntryIds, false, scoring.scorer, undefined)
|
|
234
|
+
: { by: 'continuity', to: inherited, scorer: scoring.scorer };
|
|
235
|
+
const v = (0, routingPolicy_js_1.decideTier2)(ranked.map((r) => ({ id: r.id, score: r.score })), cold ? undefined : inherited, plan.policy, {});
|
|
236
|
+
return mapTier2(v, scoring.scorer, cold, inherited, visibleEntryIds, undefined);
|
|
237
|
+
}
|
|
238
|
+
// No tier 2 at all: mid-conversation the inherited cursor holds (sticky,
|
|
239
|
+
// recorded); cold start is the resolver's cold walk — nothing to decide.
|
|
240
|
+
if (!cold)
|
|
241
|
+
return { by: 'continuity', to: inherited };
|
|
242
|
+
return undefined;
|
|
243
|
+
}
|
|
244
|
+
/** Map a `decideTier2` verdict into the stage's recorded shape. */
|
|
245
|
+
function mapTier2(v, scorerName, cold, inherited, visibleEntryIds, window) {
|
|
246
|
+
const numbers = {
|
|
247
|
+
scorer: scorerName,
|
|
248
|
+
scores: v.ranked.map((r) => ({ id: r.id, score: r.score, relevance: r.relevance })),
|
|
249
|
+
...(v.runnerUp !== undefined && { runnerUp: { ...v.runnerUp } }),
|
|
250
|
+
decisive: v.decisive,
|
|
251
|
+
...(window !== undefined && { window }),
|
|
252
|
+
};
|
|
253
|
+
switch (v.kind) {
|
|
254
|
+
case 'move':
|
|
255
|
+
return { by: 'intent', to: v.to, ...numbers };
|
|
256
|
+
case 'stay':
|
|
257
|
+
// Incumbent won or near-tie held it — `continuity`, with the numbers.
|
|
258
|
+
return { by: 'continuity', to: inherited, ...numbers };
|
|
259
|
+
case 'menu':
|
|
260
|
+
return { by: 'menu', offered: v.offered, ...(!cold && { stayOffered: true }), ...numbers };
|
|
261
|
+
case 'unmatched':
|
|
262
|
+
// Genuinely new but unmatched: the FULL entry menu, STAY first-class
|
|
263
|
+
// mid-conversation.
|
|
264
|
+
return {
|
|
265
|
+
by: 'menu',
|
|
266
|
+
offered: visibleEntryIds,
|
|
267
|
+
...(!cold && { stayOffered: true }),
|
|
268
|
+
...numbers,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/** The recorded fallback for a throwing/misbehaving scorer: cold → the full
|
|
273
|
+
* menu (never the declaration-order walk); mid → stay. Dev-warned. */
|
|
274
|
+
function scorerFellThrough(err, scorerName, cold, inherited, visibleEntryIds, window) {
|
|
275
|
+
if ((0, footprintjs_1.isDevMode)()) {
|
|
276
|
+
// eslint-disable-next-line no-console
|
|
277
|
+
console.warn(`agentfootprint RouteTurn: the '${scorerName}' scorer failed — ${cold
|
|
278
|
+
? 'offering the full entry menu (recorded)'
|
|
279
|
+
: 'staying on the inherited cursor (recorded)'}. Scorers are a tier, never a correctness dependency. ${err instanceof Error ? err.message : String(err)}`);
|
|
280
|
+
}
|
|
281
|
+
return cold
|
|
282
|
+
? menuVerdict(visibleEntryIds, false, scorerName, window)
|
|
283
|
+
: {
|
|
284
|
+
by: 'continuity',
|
|
285
|
+
to: inherited,
|
|
286
|
+
scorer: scorerName,
|
|
287
|
+
...(window !== undefined && { window }),
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
function menuVerdict(offered, stayOffered, scorerName, window) {
|
|
291
|
+
return {
|
|
292
|
+
by: 'menu',
|
|
293
|
+
offered,
|
|
294
|
+
...(stayOffered && { stayOffered }),
|
|
295
|
+
...(scorerName !== undefined && { scorer: scorerName }),
|
|
296
|
+
...(window !== undefined && { window }),
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
/** The prior conversational turns a windowed scorer sees — user/assistant
|
|
300
|
+
* roles only, the CURRENT user message excluded, newest last. */
|
|
301
|
+
function recentTurnsOf(history, window) {
|
|
302
|
+
const prior = history.slice(0, Math.max(0, history.length - 1));
|
|
303
|
+
return prior
|
|
304
|
+
.filter((m) => m.role === 'user' || m.role === 'assistant')
|
|
305
|
+
.map((m) => ({ role: m.role, content: m.content }))
|
|
306
|
+
.slice(-window);
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=routeTurn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routeTurn.js","sourceRoot":"","sources":["../../../../src/core/agent/stages/routeTurn.ts"],"names":[],"mappings":"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"}
|
|
@@ -244,6 +244,15 @@ function seedFrom(scope, message, deps) {
|
|
|
244
244
|
// graph through the entry router (cold start). The Injection Engine advances
|
|
245
245
|
// it each iteration; undefined for agents without a skillGraph().
|
|
246
246
|
scope.currentSkillId = undefined;
|
|
247
|
+
// …unless the graph declared `continuity: 'conversation'` and this run
|
|
248
|
+
// continues a stored conversation (SG-C): the SAME key, one clause earlier —
|
|
249
|
+
// no second cursor, no new time axis. Consumed unconditionally (the side
|
|
250
|
+
// channel clears whether or not it is honored); written only under the
|
|
251
|
+
// option, so `continuity: 'turn'` commits exactly the keys it always did.
|
|
252
|
+
const inheritedCursor = deps.consumePendingResumeSkillCursor?.();
|
|
253
|
+
if (deps.restoreSkillCursor === true && inheritedCursor !== undefined) {
|
|
254
|
+
scope.currentSkillId = inheritedCursor;
|
|
255
|
+
}
|
|
247
256
|
// The model's `read_skill` pick — nothing picked yet on a fresh turn.
|
|
248
257
|
scope.pendingSkillPick = undefined;
|
|
249
258
|
// `.configure()` — resolved ONCE here (seed runs exactly once per run)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../../../src/core/agent/stages/seed.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;AAKH,4DAAkE;AAClE,uEAAiE;AAIjE,2DAA4D;AAC5D,uDAA0D;
|
|
1
|
+
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../../../src/core/agent/stages/seed.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,6 +49,7 @@ const types_js_1 = require("../../../adapters/types.js");
|
|
|
49
49
|
const typedEmit_js_1 = require("../../../recorders/core/typedEmit.js");
|
|
50
50
|
const extractSequence_js_1 = require("../../../security/extractSequence.js");
|
|
51
51
|
const skillTarget_js_1 = require("../../../security/skillTarget.js");
|
|
52
|
+
const routingPolicy_js_1 = require("../../../lib/injection-engine/routingPolicy.js");
|
|
52
53
|
const types_js_2 = require("../../../identity/types.js");
|
|
53
54
|
const consent_js_1 = require("../../../identity/consent.js");
|
|
54
55
|
const pause_js_1 = require("../../pause.js");
|
|
@@ -136,6 +137,36 @@ function skillRefusal(requestedId, allowed, isTree) {
|
|
|
136
137
|
}
|
|
137
138
|
return `${head}No skills are reachable from here — answer with the current skill, or finish.`;
|
|
138
139
|
}
|
|
140
|
+
/**
|
|
141
|
+
* The re-prompt a POSTURE-refused `read_skill` gets back (SG-C `strictness`).
|
|
142
|
+
* The pick was REACHABLE — the graph would have granted it — so the message
|
|
143
|
+
* must teach the posture, not the map: who routes here, and what the model may
|
|
144
|
+
* still do (open skills, staying, finishing).
|
|
145
|
+
*/
|
|
146
|
+
function postureRefusal(requestedId, posture, turnRoute, currentSkillId, openIds) {
|
|
147
|
+
const openClause = openIds.length > 0
|
|
148
|
+
? ` read_skill here reaches only the open skills: ${openIds.join(', ')}.`
|
|
149
|
+
: '';
|
|
150
|
+
if (posture === 'rails') {
|
|
151
|
+
return (`read_skill("${requestedId}") was declined: this graph runs on rails — turn starts ` +
|
|
152
|
+
`resolve by declared rule or scorer and transitions by declared routes; the model ` +
|
|
153
|
+
`does not route itself.${openClause} Continue with the skill you are in` +
|
|
154
|
+
`${currentSkillId !== undefined ? ` ('${currentSkillId}')` : ''}, or finish.`);
|
|
155
|
+
}
|
|
156
|
+
// guard — either no menu is outstanding, or the pick was off it.
|
|
157
|
+
if (turnRoute?.offered !== undefined && (0, routingPolicy_js_1.menuOutstanding)(turnRoute, currentSkillId)) {
|
|
158
|
+
return (`read_skill("${requestedId}") was declined: under this graph's 'guard' posture a ` +
|
|
159
|
+
`routing pick must come from the offered menu — ${turnRoute.offered.join(', ')} — or ` +
|
|
160
|
+
`stay (answer without calling read_skill).${openClause}`);
|
|
161
|
+
}
|
|
162
|
+
const decidedBy = turnRoute?.by === 'intent' || turnRoute?.by === 'entry'
|
|
163
|
+
? `the turn's start was resolved decisively this turn`
|
|
164
|
+
: `no routing ambiguity is open this turn`;
|
|
165
|
+
return (`read_skill("${requestedId}") was declined: this graph's 'guard' posture admits a ` +
|
|
166
|
+
`routing pick only while the framework has declared ambiguity (an offered menu), and ` +
|
|
167
|
+
`${decidedBy}; declared routes handle transitions.${openClause} Continue with the ` +
|
|
168
|
+
`skill you are in${currentSkillId !== undefined ? ` ('${currentSkillId}')` : ''}, or finish.`);
|
|
169
|
+
}
|
|
139
170
|
/**
|
|
140
171
|
* The args a `pauseHere` / `askHuman` call was running with, read back on the
|
|
141
172
|
* far side of the pause (8.13.0).
|
|
@@ -1106,6 +1137,28 @@ function buildToolCallsHandler(deps) {
|
|
|
1106
1137
|
iteration,
|
|
1107
1138
|
});
|
|
1108
1139
|
}
|
|
1140
|
+
else if (deps.skillStrictness !== undefined && skillHop) {
|
|
1141
|
+
// ── The POSTURE arm (SG-C) — after reachability, hops only. ──
|
|
1142
|
+
// OPEN skills never reach here (skillHop is false for them), so
|
|
1143
|
+
// `.selfExplain()` and friends stay admitted under every posture.
|
|
1144
|
+
const turnRoute = scope.turnRoute;
|
|
1145
|
+
const onOutstandingMenu = (0, routingPolicy_js_1.menuOutstanding)(turnRoute, currentSkillId) &&
|
|
1146
|
+
turnRoute?.offered?.includes(reqId) === true;
|
|
1147
|
+
const refusedByPosture = deps.skillStrictness === 'rails' ||
|
|
1148
|
+
(deps.skillStrictness === 'guard' && !onOutstandingMenu);
|
|
1149
|
+
if (refusedByPosture) {
|
|
1150
|
+
skillRejected = true;
|
|
1151
|
+
skillHop = false; // a refused pick must not move the cursor below
|
|
1152
|
+
result = postureRefusal(reqId, deps.skillStrictness, turnRoute, currentSkillId, deps.openSkillIds ?? []);
|
|
1153
|
+
(0, typedEmit_js_1.typedEmit)(scope, 'agentfootprint.skill.rejected', {
|
|
1154
|
+
requestedId: reqId,
|
|
1155
|
+
...(currentSkillId !== undefined && { currentSkillId }),
|
|
1156
|
+
allowed,
|
|
1157
|
+
iteration,
|
|
1158
|
+
posture: deps.skillStrictness,
|
|
1159
|
+
});
|
|
1160
|
+
}
|
|
1161
|
+
}
|
|
1109
1162
|
}
|
|
1110
1163
|
}
|
|
1111
1164
|
// ── The after-tool moment ────────────────────────────────────────
|