agentfootprint 3.0.0 → 3.1.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 (180) hide show
  1. package/README.md +1 -1
  2. package/dist/cache/CacheDecisionSubflow.js +13 -18
  3. package/dist/cache/CacheDecisionSubflow.js.map +1 -1
  4. package/dist/cache/CacheGateDecider.js +18 -3
  5. package/dist/cache/CacheGateDecider.js.map +1 -1
  6. package/dist/cache/cacheRecorder.js +12 -3
  7. package/dist/cache/cacheRecorder.js.map +1 -1
  8. package/dist/conventions.js +152 -2
  9. package/dist/conventions.js.map +1 -1
  10. package/dist/core/Agent.js +46 -9
  11. package/dist/core/Agent.js.map +1 -1
  12. package/dist/core/LLMCall.js +177 -44
  13. package/dist/core/LLMCall.js.map +1 -1
  14. package/dist/core/RunnerBase.js +14 -0
  15. package/dist/core/RunnerBase.js.map +1 -1
  16. package/dist/core/agent/buildAgentChart.js +117 -48
  17. package/dist/core/agent/buildAgentChart.js.map +1 -1
  18. package/dist/core/agent/buildAgentMessageApiChart.js +201 -0
  19. package/dist/core/agent/buildAgentMessageApiChart.js.map +1 -0
  20. package/dist/core/agent/buildCacheSubflow.js +62 -0
  21. package/dist/core/agent/buildCacheSubflow.js.map +1 -0
  22. package/dist/core/agent/buildDynamicAgentChart.js +364 -0
  23. package/dist/core/agent/buildDynamicAgentChart.js.map +1 -0
  24. package/dist/core/agent/buildMessageApiChart.js +154 -0
  25. package/dist/core/agent/buildMessageApiChart.js.map +1 -0
  26. package/dist/core/agent/stages/callLLM.js +11 -0
  27. package/dist/core/agent/stages/callLLM.js.map +1 -1
  28. package/dist/core/agent/stages/reliabilityExecution.js +64 -9
  29. package/dist/core/agent/stages/reliabilityExecution.js.map +1 -1
  30. package/dist/core/humanizeLLMError.js +66 -0
  31. package/dist/core/humanizeLLMError.js.map +1 -0
  32. package/dist/core/slots/buildMessagesSlot.js +1 -1
  33. package/dist/core/slots/buildMessagesSlot.js.map +1 -1
  34. package/dist/core/slots/buildToolsSlot.js.map +1 -1
  35. package/dist/core-flow/Conditional.js +1 -1
  36. package/dist/core-flow/Conditional.js.map +1 -1
  37. package/dist/core-flow/Loop.js +1 -1
  38. package/dist/core-flow/Loop.js.map +1 -1
  39. package/dist/core-flow/Parallel.js +1 -1
  40. package/dist/core-flow/Parallel.js.map +1 -1
  41. package/dist/esm/cache/CacheDecisionSubflow.js +11 -17
  42. package/dist/esm/cache/CacheDecisionSubflow.js.map +1 -1
  43. package/dist/esm/cache/CacheGateDecider.js +18 -3
  44. package/dist/esm/cache/CacheGateDecider.js.map +1 -1
  45. package/dist/esm/cache/cacheRecorder.js +12 -3
  46. package/dist/esm/cache/cacheRecorder.js.map +1 -1
  47. package/dist/esm/conventions.js +148 -1
  48. package/dist/esm/conventions.js.map +1 -1
  49. package/dist/esm/core/Agent.js +47 -10
  50. package/dist/esm/core/Agent.js.map +1 -1
  51. package/dist/esm/core/LLMCall.js +177 -44
  52. package/dist/esm/core/LLMCall.js.map +1 -1
  53. package/dist/esm/core/RunnerBase.js +14 -0
  54. package/dist/esm/core/RunnerBase.js.map +1 -1
  55. package/dist/esm/core/agent/buildAgentChart.js +118 -49
  56. package/dist/esm/core/agent/buildAgentChart.js.map +1 -1
  57. package/dist/esm/core/agent/buildAgentMessageApiChart.js +197 -0
  58. package/dist/esm/core/agent/buildAgentMessageApiChart.js.map +1 -0
  59. package/dist/esm/core/agent/buildCacheSubflow.js +58 -0
  60. package/dist/esm/core/agent/buildCacheSubflow.js.map +1 -0
  61. package/dist/esm/core/agent/buildDynamicAgentChart.js +360 -0
  62. package/dist/esm/core/agent/buildDynamicAgentChart.js.map +1 -0
  63. package/dist/esm/core/agent/buildMessageApiChart.js +150 -0
  64. package/dist/esm/core/agent/buildMessageApiChart.js.map +1 -0
  65. package/dist/esm/core/agent/stages/callLLM.js +11 -0
  66. package/dist/esm/core/agent/stages/callLLM.js.map +1 -1
  67. package/dist/esm/core/agent/stages/reliabilityExecution.js +64 -9
  68. package/dist/esm/core/agent/stages/reliabilityExecution.js.map +1 -1
  69. package/dist/esm/core/humanizeLLMError.js +61 -0
  70. package/dist/esm/core/humanizeLLMError.js.map +1 -0
  71. package/dist/esm/core/slots/buildMessagesSlot.js +1 -1
  72. package/dist/esm/core/slots/buildMessagesSlot.js.map +1 -1
  73. package/dist/esm/core/slots/buildToolsSlot.js.map +1 -1
  74. package/dist/esm/core-flow/Conditional.js +1 -1
  75. package/dist/esm/core-flow/Conditional.js.map +1 -1
  76. package/dist/esm/core-flow/Loop.js +1 -1
  77. package/dist/esm/core-flow/Loop.js.map +1 -1
  78. package/dist/esm/core-flow/Parallel.js +1 -1
  79. package/dist/esm/core-flow/Parallel.js.map +1 -1
  80. package/dist/esm/events/registry.js +10 -0
  81. package/dist/esm/events/registry.js.map +1 -1
  82. package/dist/esm/index.js +21 -1
  83. package/dist/esm/index.js.map +1 -1
  84. package/dist/esm/lib/injection-engine/buildInjectionEngineSubflow.js +15 -8
  85. package/dist/esm/lib/injection-engine/buildInjectionEngineSubflow.js.map +1 -1
  86. package/dist/esm/recorders/core/ContextEvaluatedRecorder.js +31 -0
  87. package/dist/esm/recorders/core/ContextEvaluatedRecorder.js.map +1 -0
  88. package/dist/esm/recorders/core/ContextRecorder.js +12 -14
  89. package/dist/esm/recorders/core/ContextRecorder.js.map +1 -1
  90. package/dist/esm/recorders/core/ErrorBridge.js +59 -0
  91. package/dist/esm/recorders/core/ErrorBridge.js.map +1 -0
  92. package/dist/esm/recorders/core/ReliabilityRecorder.js +29 -0
  93. package/dist/esm/recorders/core/ReliabilityRecorder.js.map +1 -0
  94. package/dist/esm/recorders/observability/BoundaryRecorder.js +23 -0
  95. package/dist/esm/recorders/observability/BoundaryRecorder.js.map +1 -1
  96. package/dist/esm/recorders/observability/LiveStateRecorder.js +8 -0
  97. package/dist/esm/recorders/observability/LiveStateRecorder.js.map +1 -1
  98. package/dist/esm/recorders/observability/commentary/commentaryTemplates.js +1 -0
  99. package/dist/esm/recorders/observability/commentary/commentaryTemplates.js.map +1 -1
  100. package/dist/esm/reliability/buildReliabilityGateChart.js +10 -4
  101. package/dist/esm/reliability/buildReliabilityGateChart.js.map +1 -1
  102. package/dist/events/registry.js +10 -0
  103. package/dist/events/registry.js.map +1 -1
  104. package/dist/index.js +26 -3
  105. package/dist/index.js.map +1 -1
  106. package/dist/lib/injection-engine/buildInjectionEngineSubflow.js +15 -8
  107. package/dist/lib/injection-engine/buildInjectionEngineSubflow.js.map +1 -1
  108. package/dist/recorders/core/ContextEvaluatedRecorder.js +35 -0
  109. package/dist/recorders/core/ContextEvaluatedRecorder.js.map +1 -0
  110. package/dist/recorders/core/ContextRecorder.js +11 -13
  111. package/dist/recorders/core/ContextRecorder.js.map +1 -1
  112. package/dist/recorders/core/ErrorBridge.js +64 -0
  113. package/dist/recorders/core/ErrorBridge.js.map +1 -0
  114. package/dist/recorders/core/ReliabilityRecorder.js +33 -0
  115. package/dist/recorders/core/ReliabilityRecorder.js.map +1 -0
  116. package/dist/recorders/observability/BoundaryRecorder.js +23 -0
  117. package/dist/recorders/observability/BoundaryRecorder.js.map +1 -1
  118. package/dist/recorders/observability/LiveStateRecorder.js +8 -0
  119. package/dist/recorders/observability/LiveStateRecorder.js.map +1 -1
  120. package/dist/recorders/observability/commentary/commentaryTemplates.js +1 -0
  121. package/dist/recorders/observability/commentary/commentaryTemplates.js.map +1 -1
  122. package/dist/reliability/buildReliabilityGateChart.js +10 -4
  123. package/dist/reliability/buildReliabilityGateChart.js.map +1 -1
  124. package/dist/types/cache/CacheDecisionSubflow.d.ts +7 -10
  125. package/dist/types/cache/CacheDecisionSubflow.d.ts.map +1 -1
  126. package/dist/types/cache/CacheGateDecider.d.ts +16 -2
  127. package/dist/types/cache/CacheGateDecider.d.ts.map +1 -1
  128. package/dist/types/cache/cacheRecorder.d.ts.map +1 -1
  129. package/dist/types/conventions.d.ts +101 -1
  130. package/dist/types/conventions.d.ts.map +1 -1
  131. package/dist/types/core/Agent.d.ts +8 -0
  132. package/dist/types/core/Agent.d.ts.map +1 -1
  133. package/dist/types/core/LLMCall.d.ts +48 -12
  134. package/dist/types/core/LLMCall.d.ts.map +1 -1
  135. package/dist/types/core/RunnerBase.d.ts +12 -0
  136. package/dist/types/core/RunnerBase.d.ts.map +1 -1
  137. package/dist/types/core/agent/buildAgentChart.d.ts +31 -18
  138. package/dist/types/core/agent/buildAgentChart.d.ts.map +1 -1
  139. package/dist/types/core/agent/buildAgentMessageApiChart.d.ts +41 -0
  140. package/dist/types/core/agent/buildAgentMessageApiChart.d.ts.map +1 -0
  141. package/dist/types/core/agent/buildCacheSubflow.d.ts +36 -0
  142. package/dist/types/core/agent/buildCacheSubflow.d.ts.map +1 -0
  143. package/dist/types/core/agent/buildDynamicAgentChart.d.ts +57 -0
  144. package/dist/types/core/agent/buildDynamicAgentChart.d.ts.map +1 -0
  145. package/dist/types/core/agent/buildMessageApiChart.d.ts +48 -0
  146. package/dist/types/core/agent/buildMessageApiChart.d.ts.map +1 -0
  147. package/dist/types/core/agent/stages/callLLM.d.ts.map +1 -1
  148. package/dist/types/core/agent/stages/reliabilityExecution.d.ts.map +1 -1
  149. package/dist/types/core/agent/types.d.ts +69 -2
  150. package/dist/types/core/agent/types.d.ts.map +1 -1
  151. package/dist/types/core/humanizeLLMError.d.ts +24 -0
  152. package/dist/types/core/humanizeLLMError.d.ts.map +1 -0
  153. package/dist/types/core/slots/buildMessagesSlot.d.ts.map +1 -1
  154. package/dist/types/events/payloads.d.ts +84 -0
  155. package/dist/types/events/payloads.d.ts.map +1 -1
  156. package/dist/types/events/registry.d.ts +11 -1
  157. package/dist/types/events/registry.d.ts.map +1 -1
  158. package/dist/types/index.d.ts +4 -1
  159. package/dist/types/index.d.ts.map +1 -1
  160. package/dist/types/lib/injection-engine/buildInjectionEngineSubflow.d.ts.map +1 -1
  161. package/dist/types/recorders/core/ContextEvaluatedRecorder.d.ts +24 -0
  162. package/dist/types/recorders/core/ContextEvaluatedRecorder.d.ts.map +1 -0
  163. package/dist/types/recorders/core/ContextRecorder.d.ts +0 -2
  164. package/dist/types/recorders/core/ContextRecorder.d.ts.map +1 -1
  165. package/dist/types/recorders/core/ErrorBridge.d.ts +39 -0
  166. package/dist/types/recorders/core/ErrorBridge.d.ts.map +1 -0
  167. package/dist/types/recorders/core/ReliabilityRecorder.d.ts +25 -0
  168. package/dist/types/recorders/core/ReliabilityRecorder.d.ts.map +1 -0
  169. package/dist/types/recorders/observability/BoundaryRecorder.d.ts +7 -0
  170. package/dist/types/recorders/observability/BoundaryRecorder.d.ts.map +1 -1
  171. package/dist/types/recorders/observability/LiveStateRecorder.d.ts.map +1 -1
  172. package/dist/types/recorders/observability/commentary/commentaryTemplates.d.ts.map +1 -1
  173. package/dist/types/reliability/buildReliabilityGateChart.d.ts.map +1 -1
  174. package/package.json +4 -3
  175. package/dist/core/agent/stages/iterationStart.js +0 -24
  176. package/dist/core/agent/stages/iterationStart.js.map +0 -1
  177. package/dist/esm/core/agent/stages/iterationStart.js +0 -20
  178. package/dist/esm/core/agent/stages/iterationStart.js.map +0 -1
  179. package/dist/types/core/agent/stages/iterationStart.d.ts +0 -16
  180. package/dist/types/core/agent/stages/iterationStart.d.ts.map +0 -1
@@ -15,40 +15,45 @@
15
15
  *
16
16
  * Chart shape:
17
17
  *
18
- * Seed
18
+ * Initialize
19
19
  * → [memory READ subflows for each .memory()]
20
- * → InjectionEngine (subflow)
21
- * → SystemPrompt (slot subflow)
22
- * Messages (slot subflow)
23
- * Tools (slot subflow)
24
- * → CacheDecision (subflow)
20
+ * → InjectionEngine (subflow) ← loop target (tool-calls loops here)
21
+ * → Context (selector, PARALLEL fan-out, failFast)
22
+ * {System Prompt ‖ Messages ‖ Tools} (slot subflows)
23
+ * converge
25
24
  * → UpdateSkillHistory
26
- * → CacheGate (decider) ApplyMarkers / SkipCaching
27
- * IterationStart
28
- * → CallLLM
29
- * → Route (decider) tool-calls (pausable) / final (subflow)
30
- * |
31
- * ┌────── PrepareFinal ▼
25
+ * → Cache (sf-cache subflow: decideCacheMarkers CacheGate
26
+ * ApplyMarkers / SkipCaching)
27
+ * → CallLLM (also emits the per-iteration iteration_start marker)
28
+ * → [NormalizeThinking] (subflow, only when a ThinkingHandler resolved)
29
+ * → Route (decider)
30
+ * ├─ tool-calls (pausable) → loopTo(InjectionEngine) ← branch-sourced loop
31
+ * └─ final (subflow) → terminal leaf
32
+ * ┌────── PrepareFinal
32
33
  * ├──── [memory WRITE subflows]
33
34
  * └──── BreakFinal ($break)
34
- * loopTo(InjectionEngine)
35
35
  *
36
36
  * (When v2.11.x reliability is configured, the reliability gate chart
37
- * mounts as a subflow between IterationStart and CallLLM with a
38
- * TranslateFailFast stage after it. Lands in the next commit.)
37
+ * mounts as a subflow before CallLLM with a TranslateFailFast stage
38
+ * after it. Lands in the next commit.)
39
39
  */
40
40
  import { ArrayMergeMode } from 'footprintjs/advanced';
41
- import { flowChart } from 'footprintjs';
41
+ import { flowChart, select } from 'footprintjs';
42
42
  import { STAGE_IDS, SUBFLOW_IDS } from '../../conventions.js';
43
43
  import { memoryInjectionKey } from '../../memory/define.types.js';
44
44
  import { unwrapMemoryFlowChart } from '../../memory/define.js';
45
45
  import { mountMemoryRead, mountMemoryWrite } from '../../memory/wire/mountMemoryPipeline.js';
46
46
  import { breakFinalStage } from './stages/breakFinal.js';
47
47
  import { prepareFinalStage } from './stages/prepareFinal.js';
48
+ import { buildCacheSubflow } from './buildCacheSubflow.js';
48
49
  /**
49
50
  * Build the agent's complete FlowChart from the supplied deps.
50
51
  */
51
52
  export function buildAgentChart(deps) {
53
+ // ReAct loop semantics. 'classic' caches the static slots (engineer
54
+ // system-prompt + tools only on the first turn); 'dynamic' (default)
55
+ // re-engineers all 3 slots every turn. Drives the Context selector below.
56
+ const reactMode = deps.reactMode ?? 'dynamic';
52
57
  // ── Final-branch subflow ─────────────────────────────────────
53
58
  // Split so memory-write subflows can mount BETWEEN setting
54
59
  // finalContent and breaking the ReAct loop. PrepareFinal captures
@@ -82,13 +87,16 @@ export function buildAgentChart(deps) {
82
87
  // (Lens + FlowchartRecorder) detect Agent-primitive subflows via
83
88
  // this prefix and flag them as true agent boundaries (separate
84
89
  // from LLMCall subflows which use `LLMCall:` prefix).
85
- let builder = flowChart('Seed', deps.seed, STAGE_IDS.SEED, {
90
+ let builder = flowChart('Initialize', deps.seed, STAGE_IDS.SEED, {
86
91
  ...(deps.structureRecorders !== undefined && {
87
92
  structureRecorders: [...deps.structureRecorders],
88
93
  }),
89
- description: 'Agent: ReAct loop',
94
+ // Tag the mode so the Lens can label the run. Keep the `Agent:` taxonomy
95
+ // prefix (consumers detect Agent boundaries by it). Dynamic keeps the
96
+ // historical 'Agent: ReAct loop' string for byte-stability.
97
+ description: reactMode === 'classic' ? 'Agent: Classic ReAct loop' : 'Agent: ReAct loop',
90
98
  });
91
- // Memory READ subflows — mounted between Seed and InjectionEngine
99
+ // Memory READ subflows — mounted between Initialize and InjectionEngine
92
100
  // for TURN_START timing (default). Each memory writes to its own
93
101
  // scope key (`memoryInjection_${id}`) so multiple `.memory()`
94
102
  // registrations layer without colliding.
@@ -128,7 +136,48 @@ export function buildAgentChart(deps) {
128
136
  // 8 → 16 → 24 → 32 cumulative injections per turn.
129
137
  arrayMerge: ArrayMergeMode.Replace,
130
138
  })
131
- .addSubFlowChartNext(SUBFLOW_IDS.SYSTEM_PROMPT, deps.systemPromptSubflow, 'System Prompt', {
139
+ // ── Context assembly: the 3 slots run in PARALLEL (selector fan-out) ──
140
+ // The slots are genuinely INDEPENDENT — each reads ONLY InjectionEngine's
141
+ // activeInjections + seed state, and each writes a DISJOINT output key
142
+ // (systemPromptInjections / messagesInjections / toolsInjections +
143
+ // dynamicToolSchemas). None reads another slot's output. Running them
144
+ // sequentially was an accident of chaining; the fork makes the execution
145
+ // tree tell the truth (and the Lens merge-tree renders the real shape).
146
+ // The selector picks ALL 3 every iteration (unconditional fan-out).
147
+ // failFast: true — a REQUIRED slot that throws aborts the whole turn,
148
+ // matching the old sequential-throw behavior. WITHOUT it the default
149
+ // Promise.allSettled would SWALLOW a failing slot and call the LLM with a
150
+ // half-built request (the documented request-assembly footgun).
151
+ // ── Context selector — THE one place Classic and Dynamic differ ──────
152
+ // The 3 slots are always selector BRANCHES (so they stay drawn in the
153
+ // chart in both modes); WHICH ones get selected per turn is the whole
154
+ // Classic-vs-Dynamic difference:
155
+ // • dynamic — pick all 3 EVERY turn (activations can change per turn:
156
+ // a skill fires, a rule matches, a tool-return steers the next turn).
157
+ // • classic — pick all 3 on the FIRST turn, then ONLY messages. The
158
+ // static slots aren't re-selected, so their turn-1 outputs persist in
159
+ // scope (that IS the cache — the flat builder has no per-turn reset),
160
+ // and only the message list rebuilds each iteration. The Lens shows
161
+ // this directly: after turn 1 only the Messages branch lights up.
162
+ .addSelectorFunction('Context', ((scope) => {
163
+ const firstTurn = (scope.iteration ?? 1) <= 1;
164
+ const includeStatic = reactMode === 'dynamic' || firstTurn;
165
+ return select(scope, [
166
+ {
167
+ when: () => includeStatic,
168
+ then: SUBFLOW_IDS.SYSTEM_PROMPT,
169
+ label: 'engineer system-prompt',
170
+ },
171
+ { when: () => true, then: SUBFLOW_IDS.MESSAGES, label: 'engineer messages' },
172
+ { when: () => includeStatic, then: SUBFLOW_IDS.TOOLS, label: 'engineer tools' },
173
+ ]);
174
+ }), STAGE_IDS.CONTEXT, reactMode === 'classic'
175
+ ? 'Assemble request context: messages every turn; system-prompt + tools cached after turn 1'
176
+ : 'Assemble request context: system-prompt + messages + tools (parallel)', { failFast: true })
177
+ // Each branch keeps its inputMapper + outputMapper + arrayMerge:Replace
178
+ // VERBATIM from the former sequential mounts. Replace (not concat) is
179
+ // load-bearing: the loopTo would otherwise accumulate injections/tools.
180
+ .addSubFlowChartBranch(SUBFLOW_IDS.SYSTEM_PROMPT, deps.systemPromptSubflow, 'System Prompt', {
132
181
  inputMapper: (parent) => ({
133
182
  userMessage: parent.userMessage,
134
183
  iteration: parent.iteration,
@@ -137,7 +186,7 @@ export function buildAgentChart(deps) {
137
186
  outputMapper: (sf) => ({ systemPromptInjections: sf.systemPromptInjections }),
138
187
  arrayMerge: ArrayMergeMode.Replace,
139
188
  })
140
- .addSubFlowChartNext(SUBFLOW_IDS.MESSAGES, deps.messagesSubflow, 'Messages', {
189
+ .addSubFlowChartBranch(SUBFLOW_IDS.MESSAGES, deps.messagesSubflow, 'Messages', {
141
190
  inputMapper: (parent) => ({
142
191
  messages: parent.history,
143
192
  iteration: parent.iteration,
@@ -146,7 +195,7 @@ export function buildAgentChart(deps) {
146
195
  outputMapper: (sf) => ({ messagesInjections: sf.messagesInjections }),
147
196
  arrayMerge: ArrayMergeMode.Replace,
148
197
  })
149
- .addSubFlowChartNext(SUBFLOW_IDS.TOOLS, deps.toolsSubflow, 'Tools', {
198
+ .addSubFlowChartBranch(SUBFLOW_IDS.TOOLS, deps.toolsSubflow, 'Tools', {
150
199
  inputMapper: (parent) => ({
151
200
  iteration: parent.iteration,
152
201
  activeInjections: parent.activeInjections,
@@ -168,9 +217,30 @@ export function buildAgentChart(deps) {
168
217
  // duplicates that providers reject.
169
218
  arrayMerge: ArrayMergeMode.Replace,
170
219
  })
171
- // ── Cache layer (v2.6) ─────────────────────────────────────
172
- .addSubFlowChartNext(SUBFLOW_IDS.CACHE_DECISION, deps.cacheDecisionSubflow, 'CacheDecision', {
220
+ .end();
221
+ // ── Skill-churn window (cache concern) ──────────────────────────
222
+ // UpdateSkillHistory stays in the MAIN loop (NOT inside sf-cache): the
223
+ // skillHistory rolling window must persist across iterations, so keeping
224
+ // it here lets it live in parent scope without round-tripping through the
225
+ // subflow. It feeds sf-cache's CacheGate churn check, and sits right where
226
+ // the tool-driven skill activation flows into it.
227
+ //
228
+ // CONDITIONAL MOUNT: only when skills are registered. With no skills the
229
+ // window records "no skill" every iteration and CacheGate's churn rule can
230
+ // never fire — so the stage is omitted entirely (no dead weight, no
231
+ // misleading box). Mirrors the read_skill auto-attach + NormalizeThinking.
232
+ if (deps.hasSkills) {
233
+ builder = builder.addFunction('UpdateSkillHistory', deps.updateSkillHistoryStage, STAGE_IDS.UPDATE_SKILL_HISTORY, 'Update skill-history rolling window for CacheGate churn detection');
234
+ }
235
+ builder = builder
236
+ // sf-cache: decideCacheMarkers → CacheGate → apply/skip, collapsed into
237
+ // ONE box. Pure provider-agnostic DECISION layer — reads the turn's state,
238
+ // outputs only the gated cacheMarkers (Replace, not concat, across the
239
+ // loop). The attached provider's CacheStrategy turns markers into wire
240
+ // format later. See buildCacheSubflow.ts.
241
+ .addSubFlowChartNext(SUBFLOW_IDS.CACHE, buildCacheSubflow(), 'Cache', {
173
242
  inputMapper: (parent) => ({
243
+ // decideCacheMarkers inputs
174
244
  activeInjections: parent.activeInjections ?? [],
175
245
  iteration: parent.iteration ?? 1,
176
246
  maxIterations: parent.maxIterations ?? deps.maxIterations,
@@ -181,24 +251,16 @@ export function buildAgentChart(deps) {
181
251
  cumulativeInputTokens: parent.totalInputTokens ?? 0,
182
252
  systemPromptCachePolicy: deps.systemPromptCachePolicy,
183
253
  cachingDisabled: parent.cachingDisabled ?? false,
254
+ // CacheGate inputs (read-only: skillHistory is updated in the main
255
+ // loop above, so it is NOT mapped back out)
256
+ recentHitRate: parent.recentHitRate,
257
+ skillHistory: parent.skillHistory ?? [],
184
258
  }),
185
259
  outputMapper: (sf) => ({ cacheMarkers: sf.cacheMarkers }),
186
260
  arrayMerge: ArrayMergeMode.Replace,
187
261
  })
188
- .addFunction('UpdateSkillHistory', deps.updateSkillHistoryStage, STAGE_IDS.UPDATE_SKILL_HISTORY, 'Update skill-history rolling window for CacheGate churn detection')
189
- .addDeciderFunction('CacheGate', deps.cacheGateDecide, STAGE_IDS.CACHE_GATE, 'Gate cache-marker application: kill switch / hit-rate / skill-churn')
190
- .addFunctionBranch(STAGE_IDS.APPLY_MARKERS, 'ApplyMarkers',
191
- // Pass-through stage — markers stay in scope as-is.
192
- // BuildLLMRequest (Phase 7+) reads them on the next stage.
193
- () => undefined, 'Proceed with cache markers from CacheDecision')
194
- .addFunctionBranch(STAGE_IDS.SKIP_CACHING, 'SkipCaching',
195
- // Clear markers so BuildLLMRequest sees an empty list and
196
- // makes the request unmodified.
197
- (scope) => {
198
- scope.cacheMarkers = [];
199
- }, 'Skip caching this iteration')
200
- .end()
201
- .addFunction('IterationStart', deps.iterationStart, 'iteration-start', 'Iteration begin marker')
262
+ // CallLLM emits the per-iteration `iteration_start` marker itself (no
263
+ // dedicated IterationStart stage emitting is passive observability).
202
264
  .addFunction('CallLLM', deps.callLLM, STAGE_IDS.CALL_LLM, 'LLM invocation');
203
265
  // v2.14 — conditional NormalizeThinking sub-subflow. Mounted ONLY
204
266
  // when a ThinkingHandler resolved (auto-wired by provider.name OR
@@ -220,7 +282,15 @@ export function buildAgentChart(deps) {
220
282
  }
221
283
  builder = builder
222
284
  .addDeciderFunction('Route', deps.routeDecider, SUBFLOW_IDS.ROUTE, 'ReAct routing')
223
- .addPausableFunctionBranch('tool-calls', 'ToolCalls', deps.toolCallsHandler, 'Tool execution (pausable via pauseHere)')
285
+ .addPausableFunctionBranch('tool-calls', 'ToolCalls', deps.toolCallsHandler, 'Tool execution (pausable via pauseHere)',
286
+ // Branch-sourced loop: tool-calls loops back to the InjectionEngine so
287
+ // EVERY iteration re-evaluates triggers against the freshest context (the
288
+ // just-appended tool result). Sourced from the BRANCH (not the decider) so
289
+ // the chart reads honestly — `ToolCalls → InjectionEngine` loops, `Final`
290
+ // terminates. Survives pause/resume (human-in-the-loop tool approval): the
291
+ // engine resolves the subflow loop target on resume — footprintjs
292
+ // FlowChartExecutor.resume + test/lib/pause/resume-branch-loop-subflow.
293
+ { loopTo: SUBFLOW_IDS.INJECTION_ENGINE })
224
294
  .addSubFlowChartBranch(SUBFLOW_IDS.FINAL, finalBranchChart, 'Final', {
225
295
  // Pass through the read-only state the sub-chart needs;
226
296
  // OMIT keys the sub-chart writes (finalContent, newMessages)
@@ -234,19 +304,18 @@ export function buildAgentChart(deps) {
234
304
  outputMapper: (sf) => ({
235
305
  finalContent: sf.finalContent,
236
306
  }),
237
- // BreakFinal's $break() must reach the outer loopTo so the
238
- // ReAct iteration terminates; without this the inner break
239
- // only exits the sub-chart and the outer loop continues.
307
+ // With the branch-sourced loop, `final` is a terminal LEAF — it ends the
308
+ // run on its own (no decider `next` to suppress). propagateBreak is kept
309
+ // so BreakFinal's $break() still surfaces a terminal onBreak signal to the
310
+ // parent (observability) and stays correct if a decider-level `next` is
311
+ // ever reintroduced.
240
312
  propagateBreak: true,
241
313
  })
242
314
  .setDefault(SUBFLOW_IDS.FINAL)
243
- .end()
244
- // Dynamic ReAct: loop back to the InjectionEngine so EVERY iteration
245
- // re-evaluates triggers (rule predicates, on-tool-return,
246
- // llm-activated) against the freshest context (the just-appended
247
- // tool result). Without this, the InjectionEngine runs ONCE per
248
- // turn — quietly breaking the framework's "Dynamic ReAct" claim.
249
- .loopTo(SUBFLOW_IDS.INJECTION_ENGINE);
315
+ .end();
316
+ // The ReAct loop is now sourced from the `tool-calls` branch (the
317
+ // `{ loopTo }` above), not the decider — so `Final` is a plain terminal leaf
318
+ // and the chart draws `ToolCalls → InjectionEngine` for the loop edge.
250
319
  return builder.build();
251
320
  }
252
321
  //# sourceMappingURL=buildAgentChart.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"buildAgentChart.js","sourceRoot":"","sources":["../../../../src/core/agent/buildAgentChart.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"buildAgentChart.js","sourceRoot":"","sources":["../../../../src/core/agent/buildAgentChart.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,197 @@
1
+ /**
2
+ * buildAgentMessageApiChart — the Agent (ReAct) form of the messageAPI
3
+ * merge-tree, as ONE FLAT main chart (no inner LLM-call sub-box).
4
+ *
5
+ * The whole ReAct cycle lives directly in the single Agent chart:
6
+ *
7
+ * Context (ROOT selector — inits + picks which context slots to engineer)
8
+ * ├─ system-prompt ┐
9
+ * ├─ messages ─────┼─→ messageAPI → Call-LLM
10
+ * └─ tools ────────┘
11
+ * → Route (decider) → [ ToolCalls (execute) → loop ] / Final (response)
12
+ * loopTo(Context)
13
+ *
14
+ * WHY flat (the user's call): the entire agent — context engineering, the LLM
15
+ * call, routing, tool execution, the loop, and the final response — is ONE
16
+ * visible flowchart in ONE Agent box. No nested LLM-call box: Lens wraps the
17
+ * whole chart in the Agent main-box and renders the slots as pills. This is
18
+ * simpler than the composed (sf-llm-call subflow) shape and avoids box-in-box
19
+ * nesting entirely.
20
+ *
21
+ * The three context slots are DIRECT children of Context; all converge at
22
+ * messageAPI (which assembles system-prompt + messages); Call-LLM then sends
23
+ * the assembled payload plus the tool schemas. Route decides tool-calls (loop)
24
+ * vs final (terminate). The same chart serves Static and Dynamic agents — only
25
+ * which slots the Context selector lights per iteration differs.
26
+ */
27
+ import { flowChartSelector, select } from 'footprintjs';
28
+ import { SUBFLOW_IDS } from '../../conventions.js';
29
+ import { typedEmit } from '../../recorders/core/typedEmit.js';
30
+ import { buildSystemPromptSlot } from '../slots/buildSystemPromptSlot.js';
31
+ import { buildMessagesSlot } from '../slots/buildMessagesSlot.js';
32
+ import { buildToolsSlot } from '../slots/buildToolsSlot.js';
33
+ /** Route branch ids. */
34
+ const ROUTE_TOOL_CALLS = 'tool-calls';
35
+ const ROUTE_FINAL = SUBFLOW_IDS.FINAL;
36
+ /**
37
+ * Build the Agent merge-tree chart as one flat ReAct flowchart.
38
+ */
39
+ export function buildAgentMessageApiChart(deps) {
40
+ const { provider, model, systemPrompt, tools } = deps;
41
+ const maxIterations = deps.maxIterations ?? 5;
42
+ // ── Context: ROOT selector. Inits per-call state on the first turn (the
43
+ // folded-in seed — Context is the chart's first node); on ReAct loop re-entry
44
+ // it leaves state intact (the iteration was bumped by ToolCalls). Returns the
45
+ // three context slots to engineer. ──
46
+ const contextSelector = (scope) => {
47
+ if (scope.iteration === undefined) {
48
+ const args = scope.$getArgs();
49
+ scope.userMessage = args.message;
50
+ scope.history = [{ role: 'user', content: args.message }];
51
+ scope.iteration = 1;
52
+ scope.systemPromptInjections = [];
53
+ scope.messagesInjections = [];
54
+ scope.toolSchemas = [];
55
+ scope.assembledSystem = '';
56
+ scope.assembledMessages = [];
57
+ scope.answer = '';
58
+ scope.toolCalls = [];
59
+ scope.finalContent = '';
60
+ }
61
+ return select(scope, [
62
+ { when: () => true, then: SUBFLOW_IDS.SYSTEM_PROMPT, label: 'engineer system-prompt' },
63
+ { when: () => true, then: SUBFLOW_IDS.MESSAGES, label: 'engineer messages' },
64
+ { when: () => true, then: SUBFLOW_IDS.TOOLS, label: 'engineer tools' },
65
+ ]);
66
+ };
67
+ // ── messageAPI: assemble system-prompt + messages (the join after the slots
68
+ // converge). tools is a separate field Call-LLM reads directly. ──
69
+ const messageApiStage = (scope) => {
70
+ const sysInjections = (scope.systemPromptInjections ?? []);
71
+ scope.assembledSystem = sysInjections
72
+ .map((r) => r.rawContent ?? '')
73
+ .filter((s) => s.length > 0)
74
+ .join('\n\n');
75
+ scope.assembledMessages = [...(scope.history ?? [])];
76
+ };
77
+ // ── Call-LLM: send the assembled payload + the tool schemas. ──
78
+ const callLLM = async (scope) => {
79
+ const system = scope.assembledSystem;
80
+ const messages = (scope.assembledMessages ?? []);
81
+ const toolSchemas = (scope.toolSchemas ?? []);
82
+ typedEmit(scope, 'agentfootprint.stream.llm_start', {
83
+ iteration: scope.iteration,
84
+ provider: provider.name,
85
+ model,
86
+ systemPromptChars: system.length,
87
+ messagesCount: messages.length,
88
+ toolsCount: toolSchemas.length,
89
+ });
90
+ const startMs = Date.now();
91
+ const response = await provider.complete({
92
+ ...(system.length > 0 && { systemPrompt: system }),
93
+ messages,
94
+ ...(toolSchemas.length > 0 && { tools: toolSchemas }),
95
+ model,
96
+ });
97
+ scope.answer = response.content;
98
+ scope.toolCalls = response.toolCalls;
99
+ typedEmit(scope, 'agentfootprint.stream.llm_end', {
100
+ iteration: scope.iteration,
101
+ content: response.content,
102
+ toolCallCount: response.toolCalls.length,
103
+ usage: response.usage,
104
+ stopReason: response.stopReason,
105
+ durationMs: Date.now() - startMs,
106
+ });
107
+ };
108
+ // ── Route: ReAct decider — tool-calls (loop) vs final (terminate). ──
109
+ const routeDecider = (scope) => {
110
+ const calls = (scope.toolCalls ?? []);
111
+ if (calls.length > 0 && scope.iteration < maxIterations)
112
+ return ROUTE_TOOL_CALLS;
113
+ return ROUTE_FINAL;
114
+ };
115
+ // ── ToolCalls: execute the LLM's requested tools, append results, bump the
116
+ // iteration, loop. ──
117
+ const toolExec = async (scope) => {
118
+ const calls = (scope.toolCalls ?? []);
119
+ const newHistory = [...(scope.history ?? [])];
120
+ for (const call of calls) {
121
+ typedEmit(scope, 'agentfootprint.stream.tool_start', {
122
+ toolCallId: call.id,
123
+ toolName: call.name,
124
+ args: call.args,
125
+ });
126
+ const result = `[${call.name} result]`; // demo executor — real agents wire a registry
127
+ newHistory.push({ role: 'tool', content: result, toolCallId: call.id });
128
+ typedEmit(scope, 'agentfootprint.stream.tool_end', {
129
+ toolCallId: call.id,
130
+ result,
131
+ durationMs: 0,
132
+ });
133
+ }
134
+ scope.history = newHistory;
135
+ scope.toolCalls = [];
136
+ scope.iteration = scope.iteration + 1;
137
+ };
138
+ // ── Final: the agent's response — terminate the loop, capture the answer. ──
139
+ const finalStage = (scope) => {
140
+ scope.finalContent = scope.answer;
141
+ scope.$break('agent reached final answer');
142
+ };
143
+ // ── Build ONE flat chart: Context(root) → 3 slots → messageAPI → Call-LLM
144
+ // → Route → [ToolCalls → loop] / Final. ──
145
+ return (flowChartSelector('Context', contextSelector, 'context', {
146
+ ...(deps.structureRecorders !== undefined && {
147
+ structureRecorders: [...deps.structureRecorders],
148
+ }),
149
+ // 'Agent:' taxonomy marker → Lens renders this as an Agent group.
150
+ description: 'Agent: ReAct loop',
151
+ })
152
+ // Three DIRECT context slots — all converge at messageAPI.
153
+ .addSubFlowChartBranch(SUBFLOW_IDS.SYSTEM_PROMPT, buildSystemPromptSlot({ prompt: systemPrompt, reason: 'agent messageAPI' }), 'System Prompt', {
154
+ inputMapper: (parent) => ({
155
+ userMessage: parent.userMessage,
156
+ iteration: parent.iteration,
157
+ }),
158
+ outputMapper: (sf) => ({
159
+ systemPromptInjections: sf.systemPromptInjections,
160
+ }),
161
+ })
162
+ .addSubFlowChartBranch(SUBFLOW_IDS.MESSAGES, buildMessagesSlot(), 'Messages', {
163
+ inputMapper: (parent) => ({
164
+ messages: parent.history,
165
+ iteration: parent.iteration,
166
+ }),
167
+ outputMapper: (sf) => ({ messagesInjections: sf.messagesInjections }),
168
+ })
169
+ .addSubFlowChartBranch(SUBFLOW_IDS.TOOLS, buildToolsSlot({ tools }), 'Tools', {
170
+ inputMapper: (parent) => ({ iteration: parent.iteration }),
171
+ outputMapper: (sf) => ({ toolSchemas: sf.toolSchemas }),
172
+ // tools is a SEPARATE Anthropic wire field — it BYPASSES messageAPI
173
+ // (which assembles only system+messages) and pairs with its output at
174
+ // Call-LLM. `convergeAt` makes the structure edge `sf-tools → call-llm`
175
+ // instead of the default `sf-tools → message-api`, so Call-LLM reads as a
176
+ // true 2-parent merge {messageAPI, tools}. (toolSchemas already rides
177
+ // shared scope; this only makes the diagram faithful.)
178
+ convergeAt: 'call-llm',
179
+ })
180
+ .end()
181
+ // messageAPI assembles ONLY system+messages; Call-LLM then sends that
182
+ // payload + the tool schemas (the 2-parent merge above).
183
+ .addFunction('messageAPI', messageApiStage, 'message-api', 'Assemble system + messages into the LLM request')
184
+ .addFunction('CallLLM', callLLM, 'call-llm', 'Send the assembled request + tools to the LLM')
185
+ // Route → [ToolCalls → loop back to Context] / [Final → terminate].
186
+ .addDeciderFunction('Route', routeDecider, SUBFLOW_IDS.ROUTE, 'ReAct routing')
187
+ .addFunctionBranch(ROUTE_TOOL_CALLS, 'ToolCalls', toolExec, 'Execute tool calls')
188
+ // ReAct: the loop is sourced from the TOOL-CALLS branch (after executing
189
+ // tools, re-engineer context next turn) — NOT from the Route decider. Final
190
+ // terminates as a leaf (its $break is the terminal boundary signal).
191
+ .loopTo('context')
192
+ .addFunctionBranch(ROUTE_FINAL, 'Final', finalStage, 'Terminate the ReAct loop (response)')
193
+ .setDefault(ROUTE_FINAL)
194
+ .end()
195
+ .build());
196
+ }
197
+ //# sourceMappingURL=buildAgentMessageApiChart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildAgentMessageApiChart.js","sourceRoot":"","sources":["../../../../src/core/agent/buildAgentMessageApiChart.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * buildCacheSubflow — the per-turn prompt-cache decision, as ONE subflow.
3
+ *
4
+ * Collapses the cache machinery into a single `sf-cache` boundary so the
5
+ * agent chart reads cleanly (one "Cache" box you can drill into) while the
6
+ * execution tree stays honest:
7
+ *
8
+ * decideCacheMarkers → CacheGate (decider) → ApplyMarkers / SkipCaching
9
+ *
10
+ * Layering (see src/cache/types.ts):
11
+ * - This subflow is the provider-AGNOSTIC DECISION layer — it only computes
12
+ * and gates provider-neutral `CacheMarker[]`. It knows nothing about any
13
+ * provider.
14
+ * - The provider-SPECIFIC MECHANISM (Anthropic `cache_control`, OpenAI
15
+ * automatic, …) is the attached provider's `CacheStrategy`, selected by
16
+ * `provider.name`, applied later when the request is built.
17
+ *
18
+ * Why `UpdateSkillHistory` is NOT in here: the `skillHistory` rolling window
19
+ * must persist across loop iterations. Keeping `UpdateSkillHistory` in the
20
+ * main loop (just before this subflow) lets `skillHistory` live in the parent
21
+ * scope without round-tripping through this subflow's in/out mappers — the
22
+ * subflow stays pure (reads the turn's state, writes only `cacheMarkers`).
23
+ *
24
+ * Deps-free: every input (`activeInjections`, `iteration`, `skillHistory`,
25
+ * `recentHitRate`, `systemPromptCachePolicy`, …) is supplied by the PARENT's
26
+ * `inputMapper` at the mount site; the output is just `cacheMarkers`.
27
+ */
28
+ import { flowChart } from 'footprintjs';
29
+ import { decideCacheMarkers } from '../../cache/CacheDecisionSubflow.js';
30
+ import { cacheGateDecide } from '../../cache/CacheGateDecider.js';
31
+ import { STAGE_IDS } from '../../conventions.js';
32
+ /**
33
+ * Build the `sf-cache` subflow chart. Called by `buildAgentChart` and
34
+ * `buildDynamicAgentChart` and mounted via `addSubFlowChartNext(
35
+ * SUBFLOW_IDS.CACHE, buildCacheSubflow(), 'Cache', { inputMapper,
36
+ * outputMapper, arrayMerge: Replace })`.
37
+ */
38
+ export function buildCacheSubflow() {
39
+ return flowChart('CacheDecision',
40
+ // Root stage = the cache-decision function (a chart cannot start with a
41
+ // nested subflow). Exported from CacheDecisionSubflow.ts and reused here —
42
+ // the cache decision is the root of sf-cache, no logic duplication.
43
+ decideCacheMarkers, 'decide-cache-markers', {
44
+ description: 'CacheDecision: walk activeInjections, evaluate cache directives, emit CacheMarker[]',
45
+ })
46
+ .addDeciderFunction('CacheGate', cacheGateDecide, STAGE_IDS.CACHE_GATE, 'Gate cache-marker application: kill switch / hit-rate / skill-churn')
47
+ .addFunctionBranch(STAGE_IDS.APPLY_MARKERS, 'ApplyMarkers',
48
+ // Pass-through — markers stay in scope; the request build reads them.
49
+ () => undefined, 'Proceed with cache markers from CacheDecision')
50
+ .addFunctionBranch(STAGE_IDS.SKIP_CACHING, 'SkipCaching',
51
+ // Clear markers so the request is built unmodified this iteration.
52
+ (scope) => {
53
+ scope.cacheMarkers = [];
54
+ }, 'Skip caching this iteration')
55
+ .end()
56
+ .build();
57
+ }
58
+ //# sourceMappingURL=buildCacheSubflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildCacheSubflow.js","sourceRoot":"","sources":["../../../../src/core/agent/buildCacheSubflow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,SAAS,EAAkB,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,SAAS,CACd,eAAe;IACf,wEAAwE;IACxE,2EAA2E;IAC3E,oEAAoE;IACpE,kBAA2B,EAC3B,sBAAsB,EACtB;QACE,WAAW,EACT,qFAAqF;KACxF,CACF;SACE,kBAAkB,CACjB,WAAW,EACX,eAAwB,EACxB,SAAS,CAAC,UAAU,EACpB,qEAAqE,CACtE;SACA,iBAAiB,CAChB,SAAS,CAAC,aAAa,EACvB,cAAc;IACd,sEAAsE;IACtE,GAAG,EAAE,CAAC,SAAS,EACf,+CAA+C,CAChD;SACA,iBAAiB,CAChB,SAAS,CAAC,YAAY,EACtB,aAAa;IACb,mEAAmE;IACnE,CAAC,KAAK,EAAE,EAAE;QACP,KAA8C,CAAC,YAAY,GAAG,EAAE,CAAC;IACpE,CAAC,EACD,6BAA6B,CAC9B;SACA,GAAG,EAAE;SACL,KAAK,EAAE,CAAC;AACb,CAAC"}