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.
Files changed (183) hide show
  1. package/AGENTS.md +1 -1
  2. package/CLAUDE.md +1 -1
  3. package/README.md +2 -0
  4. package/ai-instructions/claude-code/SKILL.md +1 -1
  5. package/dist/core/Agent.js +92 -4
  6. package/dist/core/Agent.js.map +1 -1
  7. package/dist/core/agent/AgentBuilder.js +85 -3
  8. package/dist/core/agent/AgentBuilder.js.map +1 -1
  9. package/dist/core/agent/buildAgentChart.js +14 -5
  10. package/dist/core/agent/buildAgentChart.js.map +1 -1
  11. package/dist/core/agent/buildDynamicAgentChart.js +17 -4
  12. package/dist/core/agent/buildDynamicAgentChart.js.map +1 -1
  13. package/dist/core/agent/stages/routeTurn.js +308 -0
  14. package/dist/core/agent/stages/routeTurn.js.map +1 -0
  15. package/dist/core/agent/stages/seed.js +9 -0
  16. package/dist/core/agent/stages/seed.js.map +1 -1
  17. package/dist/core/agent/stages/toolCalls.js +53 -0
  18. package/dist/core/agent/stages/toolCalls.js.map +1 -1
  19. package/dist/core/runCheckpoint.js +18 -1
  20. package/dist/core/runCheckpoint.js.map +1 -1
  21. package/dist/core/slots/buildToolsSlot.js +19 -0
  22. package/dist/core/slots/buildToolsSlot.js.map +1 -1
  23. package/dist/esm/core/Agent.d.ts +33 -2
  24. package/dist/esm/core/Agent.js +92 -4
  25. package/dist/esm/core/Agent.js.map +1 -1
  26. package/dist/esm/core/agent/AgentBuilder.d.ts +68 -6
  27. package/dist/esm/core/agent/AgentBuilder.js +85 -3
  28. package/dist/esm/core/agent/AgentBuilder.js.map +1 -1
  29. package/dist/esm/core/agent/buildAgentChart.d.ts +9 -0
  30. package/dist/esm/core/agent/buildAgentChart.js +14 -5
  31. package/dist/esm/core/agent/buildAgentChart.js.map +1 -1
  32. package/dist/esm/core/agent/buildDynamicAgentChart.js +17 -4
  33. package/dist/esm/core/agent/buildDynamicAgentChart.js.map +1 -1
  34. package/dist/esm/core/agent/stages/routeTurn.d.ts +73 -0
  35. package/dist/esm/core/agent/stages/routeTurn.js +304 -0
  36. package/dist/esm/core/agent/stages/routeTurn.js.map +1 -0
  37. package/dist/esm/core/agent/stages/seed.d.ts +14 -0
  38. package/dist/esm/core/agent/stages/seed.js +9 -0
  39. package/dist/esm/core/agent/stages/seed.js.map +1 -1
  40. package/dist/esm/core/agent/stages/toolCalls.d.ts +16 -0
  41. package/dist/esm/core/agent/stages/toolCalls.js +53 -0
  42. package/dist/esm/core/agent/stages/toolCalls.js.map +1 -1
  43. package/dist/esm/core/agent/types.d.ts +6 -0
  44. package/dist/esm/core/runCheckpoint.d.ts +29 -1
  45. package/dist/esm/core/runCheckpoint.js +18 -1
  46. package/dist/esm/core/runCheckpoint.js.map +1 -1
  47. package/dist/esm/core/slots/buildToolsSlot.d.ts +10 -0
  48. package/dist/esm/core/slots/buildToolsSlot.js +19 -0
  49. package/dist/esm/core/slots/buildToolsSlot.js.map +1 -1
  50. package/dist/esm/events/payloads.d.ts +81 -1
  51. package/dist/esm/events/registry.d.ts +3 -1
  52. package/dist/esm/events/registry.js +2 -0
  53. package/dist/esm/events/registry.js.map +1 -1
  54. package/dist/esm/index.d.ts +1 -1
  55. package/dist/esm/index.js.map +1 -1
  56. package/dist/esm/lib/injection-engine/buildInjectionEngineSubflow.js +20 -0
  57. package/dist/esm/lib/injection-engine/buildInjectionEngineSubflow.js.map +1 -1
  58. package/dist/esm/lib/injection-engine/entryScorer.d.ts +20 -2
  59. package/dist/esm/lib/injection-engine/entryScorer.js +60 -22
  60. package/dist/esm/lib/injection-engine/entryScorer.js.map +1 -1
  61. package/dist/esm/lib/injection-engine/factories/defineMenuHint.d.ts +39 -0
  62. package/dist/esm/lib/injection-engine/factories/defineMenuHint.js +53 -0
  63. package/dist/esm/lib/injection-engine/factories/defineMenuHint.js.map +1 -0
  64. package/dist/esm/lib/injection-engine/index.d.ts +5 -0
  65. package/dist/esm/lib/injection-engine/index.js +8 -0
  66. package/dist/esm/lib/injection-engine/index.js.map +1 -1
  67. package/dist/esm/lib/injection-engine/intentScorer.d.ts +78 -0
  68. package/dist/esm/lib/injection-engine/intentScorer.js +56 -0
  69. package/dist/esm/lib/injection-engine/intentScorer.js.map +1 -0
  70. package/dist/esm/lib/injection-engine/llmClassifier.d.ts +36 -0
  71. package/dist/esm/lib/injection-engine/llmClassifier.js +140 -0
  72. package/dist/esm/lib/injection-engine/llmClassifier.js.map +1 -0
  73. package/dist/esm/lib/injection-engine/routingPolicy.d.ts +154 -0
  74. package/dist/esm/lib/injection-engine/routingPolicy.js +128 -0
  75. package/dist/esm/lib/injection-engine/routingPolicy.js.map +1 -0
  76. package/dist/esm/lib/injection-engine/skillGraph.d.ts +76 -2
  77. package/dist/esm/lib/injection-engine/skillGraph.js +135 -14
  78. package/dist/esm/lib/injection-engine/skillGraph.js.map +1 -1
  79. package/dist/esm/lib/injection-engine/skillGraphCheckup.d.ts +11 -1
  80. package/dist/esm/lib/injection-engine/skillGraphCheckup.js +28 -2
  81. package/dist/esm/lib/injection-engine/skillGraphCheckup.js.map +1 -1
  82. package/dist/esm/lib/injection-engine/skillIntent.d.ts +88 -0
  83. package/dist/esm/lib/injection-engine/skillIntent.js +192 -0
  84. package/dist/esm/lib/injection-engine/skillIntent.js.map +1 -0
  85. package/dist/esm/lib/injection-engine/skillMatch.d.ts +28 -6
  86. package/dist/esm/lib/injection-engine/skillMatch.js +47 -12
  87. package/dist/esm/lib/injection-engine/skillMatch.js.map +1 -1
  88. package/dist/esm/lib/injection-engine/skillTools.d.ts +24 -0
  89. package/dist/esm/lib/injection-engine/skillTools.js +24 -4
  90. package/dist/esm/lib/injection-engine/skillTools.js.map +1 -1
  91. package/dist/esm/lib/injection-engine/types.d.ts +10 -0
  92. package/dist/esm/lib/injection-engine/types.js.map +1 -1
  93. package/dist/esm/recorders/observability/RouteRecorder.d.ts +6 -1
  94. package/dist/esm/recorders/observability/RouteRecorder.js +9 -0
  95. package/dist/esm/recorders/observability/RouteRecorder.js.map +1 -1
  96. package/dist/esm/recorders/observability/commentary/commentaryTemplates.js +44 -0
  97. package/dist/esm/recorders/observability/commentary/commentaryTemplates.js.map +1 -1
  98. package/dist/events/registry.js +2 -0
  99. package/dist/events/registry.js.map +1 -1
  100. package/dist/index.js.map +1 -1
  101. package/dist/lib/injection-engine/buildInjectionEngineSubflow.js +20 -0
  102. package/dist/lib/injection-engine/buildInjectionEngineSubflow.js.map +1 -1
  103. package/dist/lib/injection-engine/entryScorer.js +60 -22
  104. package/dist/lib/injection-engine/entryScorer.js.map +1 -1
  105. package/dist/lib/injection-engine/factories/defineMenuHint.js +57 -0
  106. package/dist/lib/injection-engine/factories/defineMenuHint.js.map +1 -0
  107. package/dist/lib/injection-engine/index.js +18 -1
  108. package/dist/lib/injection-engine/index.js.map +1 -1
  109. package/dist/lib/injection-engine/intentScorer.js +60 -0
  110. package/dist/lib/injection-engine/intentScorer.js.map +1 -0
  111. package/dist/lib/injection-engine/llmClassifier.js +144 -0
  112. package/dist/lib/injection-engine/llmClassifier.js.map +1 -0
  113. package/dist/lib/injection-engine/routingPolicy.js +134 -0
  114. package/dist/lib/injection-engine/routingPolicy.js.map +1 -0
  115. package/dist/lib/injection-engine/skillGraph.js +134 -13
  116. package/dist/lib/injection-engine/skillGraph.js.map +1 -1
  117. package/dist/lib/injection-engine/skillGraphCheckup.js +28 -2
  118. package/dist/lib/injection-engine/skillGraphCheckup.js.map +1 -1
  119. package/dist/lib/injection-engine/skillIntent.js +199 -0
  120. package/dist/lib/injection-engine/skillIntent.js.map +1 -0
  121. package/dist/lib/injection-engine/skillMatch.js +47 -12
  122. package/dist/lib/injection-engine/skillMatch.js.map +1 -1
  123. package/dist/lib/injection-engine/skillTools.js +24 -4
  124. package/dist/lib/injection-engine/skillTools.js.map +1 -1
  125. package/dist/lib/injection-engine/types.js.map +1 -1
  126. package/dist/recorders/observability/RouteRecorder.js +9 -0
  127. package/dist/recorders/observability/RouteRecorder.js.map +1 -1
  128. package/dist/recorders/observability/commentary/commentaryTemplates.js +44 -0
  129. package/dist/recorders/observability/commentary/commentaryTemplates.js.map +1 -1
  130. package/dist/types/core/Agent.d.ts +33 -2
  131. package/dist/types/core/Agent.d.ts.map +1 -1
  132. package/dist/types/core/agent/AgentBuilder.d.ts +68 -6
  133. package/dist/types/core/agent/AgentBuilder.d.ts.map +1 -1
  134. package/dist/types/core/agent/buildAgentChart.d.ts +9 -0
  135. package/dist/types/core/agent/buildAgentChart.d.ts.map +1 -1
  136. package/dist/types/core/agent/buildDynamicAgentChart.d.ts.map +1 -1
  137. package/dist/types/core/agent/stages/routeTurn.d.ts +74 -0
  138. package/dist/types/core/agent/stages/routeTurn.d.ts.map +1 -0
  139. package/dist/types/core/agent/stages/seed.d.ts +14 -0
  140. package/dist/types/core/agent/stages/seed.d.ts.map +1 -1
  141. package/dist/types/core/agent/stages/toolCalls.d.ts +16 -0
  142. package/dist/types/core/agent/stages/toolCalls.d.ts.map +1 -1
  143. package/dist/types/core/agent/types.d.ts +6 -0
  144. package/dist/types/core/agent/types.d.ts.map +1 -1
  145. package/dist/types/core/runCheckpoint.d.ts +29 -1
  146. package/dist/types/core/runCheckpoint.d.ts.map +1 -1
  147. package/dist/types/core/slots/buildToolsSlot.d.ts +10 -0
  148. package/dist/types/core/slots/buildToolsSlot.d.ts.map +1 -1
  149. package/dist/types/events/payloads.d.ts +81 -1
  150. package/dist/types/events/payloads.d.ts.map +1 -1
  151. package/dist/types/events/registry.d.ts +3 -1
  152. package/dist/types/events/registry.d.ts.map +1 -1
  153. package/dist/types/index.d.ts +1 -1
  154. package/dist/types/index.d.ts.map +1 -1
  155. package/dist/types/lib/injection-engine/buildInjectionEngineSubflow.d.ts.map +1 -1
  156. package/dist/types/lib/injection-engine/entryScorer.d.ts +20 -2
  157. package/dist/types/lib/injection-engine/entryScorer.d.ts.map +1 -1
  158. package/dist/types/lib/injection-engine/factories/defineMenuHint.d.ts +40 -0
  159. package/dist/types/lib/injection-engine/factories/defineMenuHint.d.ts.map +1 -0
  160. package/dist/types/lib/injection-engine/index.d.ts +5 -0
  161. package/dist/types/lib/injection-engine/index.d.ts.map +1 -1
  162. package/dist/types/lib/injection-engine/intentScorer.d.ts +79 -0
  163. package/dist/types/lib/injection-engine/intentScorer.d.ts.map +1 -0
  164. package/dist/types/lib/injection-engine/llmClassifier.d.ts +37 -0
  165. package/dist/types/lib/injection-engine/llmClassifier.d.ts.map +1 -0
  166. package/dist/types/lib/injection-engine/routingPolicy.d.ts +155 -0
  167. package/dist/types/lib/injection-engine/routingPolicy.d.ts.map +1 -0
  168. package/dist/types/lib/injection-engine/skillGraph.d.ts +76 -2
  169. package/dist/types/lib/injection-engine/skillGraph.d.ts.map +1 -1
  170. package/dist/types/lib/injection-engine/skillGraphCheckup.d.ts +11 -1
  171. package/dist/types/lib/injection-engine/skillGraphCheckup.d.ts.map +1 -1
  172. package/dist/types/lib/injection-engine/skillIntent.d.ts +89 -0
  173. package/dist/types/lib/injection-engine/skillIntent.d.ts.map +1 -0
  174. package/dist/types/lib/injection-engine/skillMatch.d.ts +28 -6
  175. package/dist/types/lib/injection-engine/skillMatch.d.ts.map +1 -1
  176. package/dist/types/lib/injection-engine/skillTools.d.ts +24 -0
  177. package/dist/types/lib/injection-engine/skillTools.d.ts.map +1 -1
  178. package/dist/types/lib/injection-engine/types.d.ts +10 -0
  179. package/dist/types/lib/injection-engine/types.d.ts.map +1 -1
  180. package/dist/types/recorders/observability/RouteRecorder.d.ts +6 -1
  181. package/dist/types/recorders/observability/RouteRecorder.d.ts.map +1 -1
  182. package/dist/types/recorders/observability/commentary/commentaryTemplates.d.ts.map +1 -1
  183. 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":"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"}
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 ────────────────────────────────────────