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.
- package/README.md +1 -1
- package/dist/cache/CacheDecisionSubflow.js +13 -18
- package/dist/cache/CacheDecisionSubflow.js.map +1 -1
- package/dist/cache/CacheGateDecider.js +18 -3
- package/dist/cache/CacheGateDecider.js.map +1 -1
- package/dist/cache/cacheRecorder.js +12 -3
- package/dist/cache/cacheRecorder.js.map +1 -1
- package/dist/conventions.js +152 -2
- package/dist/conventions.js.map +1 -1
- package/dist/core/Agent.js +46 -9
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/LLMCall.js +177 -44
- package/dist/core/LLMCall.js.map +1 -1
- package/dist/core/RunnerBase.js +14 -0
- package/dist/core/RunnerBase.js.map +1 -1
- package/dist/core/agent/buildAgentChart.js +117 -48
- package/dist/core/agent/buildAgentChart.js.map +1 -1
- package/dist/core/agent/buildAgentMessageApiChart.js +201 -0
- package/dist/core/agent/buildAgentMessageApiChart.js.map +1 -0
- package/dist/core/agent/buildCacheSubflow.js +62 -0
- package/dist/core/agent/buildCacheSubflow.js.map +1 -0
- package/dist/core/agent/buildDynamicAgentChart.js +364 -0
- package/dist/core/agent/buildDynamicAgentChart.js.map +1 -0
- package/dist/core/agent/buildMessageApiChart.js +154 -0
- package/dist/core/agent/buildMessageApiChart.js.map +1 -0
- package/dist/core/agent/stages/callLLM.js +11 -0
- package/dist/core/agent/stages/callLLM.js.map +1 -1
- package/dist/core/agent/stages/reliabilityExecution.js +64 -9
- package/dist/core/agent/stages/reliabilityExecution.js.map +1 -1
- package/dist/core/humanizeLLMError.js +66 -0
- package/dist/core/humanizeLLMError.js.map +1 -0
- package/dist/core/slots/buildMessagesSlot.js +1 -1
- package/dist/core/slots/buildMessagesSlot.js.map +1 -1
- package/dist/core/slots/buildToolsSlot.js.map +1 -1
- package/dist/core-flow/Conditional.js +1 -1
- package/dist/core-flow/Conditional.js.map +1 -1
- package/dist/core-flow/Loop.js +1 -1
- package/dist/core-flow/Loop.js.map +1 -1
- package/dist/core-flow/Parallel.js +1 -1
- package/dist/core-flow/Parallel.js.map +1 -1
- package/dist/esm/cache/CacheDecisionSubflow.js +11 -17
- package/dist/esm/cache/CacheDecisionSubflow.js.map +1 -1
- package/dist/esm/cache/CacheGateDecider.js +18 -3
- package/dist/esm/cache/CacheGateDecider.js.map +1 -1
- package/dist/esm/cache/cacheRecorder.js +12 -3
- package/dist/esm/cache/cacheRecorder.js.map +1 -1
- package/dist/esm/conventions.js +148 -1
- package/dist/esm/conventions.js.map +1 -1
- package/dist/esm/core/Agent.js +47 -10
- package/dist/esm/core/Agent.js.map +1 -1
- package/dist/esm/core/LLMCall.js +177 -44
- package/dist/esm/core/LLMCall.js.map +1 -1
- package/dist/esm/core/RunnerBase.js +14 -0
- package/dist/esm/core/RunnerBase.js.map +1 -1
- package/dist/esm/core/agent/buildAgentChart.js +118 -49
- package/dist/esm/core/agent/buildAgentChart.js.map +1 -1
- package/dist/esm/core/agent/buildAgentMessageApiChart.js +197 -0
- package/dist/esm/core/agent/buildAgentMessageApiChart.js.map +1 -0
- package/dist/esm/core/agent/buildCacheSubflow.js +58 -0
- package/dist/esm/core/agent/buildCacheSubflow.js.map +1 -0
- package/dist/esm/core/agent/buildDynamicAgentChart.js +360 -0
- package/dist/esm/core/agent/buildDynamicAgentChart.js.map +1 -0
- package/dist/esm/core/agent/buildMessageApiChart.js +150 -0
- package/dist/esm/core/agent/buildMessageApiChart.js.map +1 -0
- package/dist/esm/core/agent/stages/callLLM.js +11 -0
- package/dist/esm/core/agent/stages/callLLM.js.map +1 -1
- package/dist/esm/core/agent/stages/reliabilityExecution.js +64 -9
- package/dist/esm/core/agent/stages/reliabilityExecution.js.map +1 -1
- package/dist/esm/core/humanizeLLMError.js +61 -0
- package/dist/esm/core/humanizeLLMError.js.map +1 -0
- package/dist/esm/core/slots/buildMessagesSlot.js +1 -1
- package/dist/esm/core/slots/buildMessagesSlot.js.map +1 -1
- package/dist/esm/core/slots/buildToolsSlot.js.map +1 -1
- package/dist/esm/core-flow/Conditional.js +1 -1
- package/dist/esm/core-flow/Conditional.js.map +1 -1
- package/dist/esm/core-flow/Loop.js +1 -1
- package/dist/esm/core-flow/Loop.js.map +1 -1
- package/dist/esm/core-flow/Parallel.js +1 -1
- package/dist/esm/core-flow/Parallel.js.map +1 -1
- package/dist/esm/events/registry.js +10 -0
- package/dist/esm/events/registry.js.map +1 -1
- package/dist/esm/index.js +21 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/injection-engine/buildInjectionEngineSubflow.js +15 -8
- package/dist/esm/lib/injection-engine/buildInjectionEngineSubflow.js.map +1 -1
- package/dist/esm/recorders/core/ContextEvaluatedRecorder.js +31 -0
- package/dist/esm/recorders/core/ContextEvaluatedRecorder.js.map +1 -0
- package/dist/esm/recorders/core/ContextRecorder.js +12 -14
- package/dist/esm/recorders/core/ContextRecorder.js.map +1 -1
- package/dist/esm/recorders/core/ErrorBridge.js +59 -0
- package/dist/esm/recorders/core/ErrorBridge.js.map +1 -0
- package/dist/esm/recorders/core/ReliabilityRecorder.js +29 -0
- package/dist/esm/recorders/core/ReliabilityRecorder.js.map +1 -0
- package/dist/esm/recorders/observability/BoundaryRecorder.js +23 -0
- package/dist/esm/recorders/observability/BoundaryRecorder.js.map +1 -1
- package/dist/esm/recorders/observability/LiveStateRecorder.js +8 -0
- package/dist/esm/recorders/observability/LiveStateRecorder.js.map +1 -1
- package/dist/esm/recorders/observability/commentary/commentaryTemplates.js +1 -0
- package/dist/esm/recorders/observability/commentary/commentaryTemplates.js.map +1 -1
- package/dist/esm/reliability/buildReliabilityGateChart.js +10 -4
- package/dist/esm/reliability/buildReliabilityGateChart.js.map +1 -1
- package/dist/events/registry.js +10 -0
- package/dist/events/registry.js.map +1 -1
- package/dist/index.js +26 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/injection-engine/buildInjectionEngineSubflow.js +15 -8
- package/dist/lib/injection-engine/buildInjectionEngineSubflow.js.map +1 -1
- package/dist/recorders/core/ContextEvaluatedRecorder.js +35 -0
- package/dist/recorders/core/ContextEvaluatedRecorder.js.map +1 -0
- package/dist/recorders/core/ContextRecorder.js +11 -13
- package/dist/recorders/core/ContextRecorder.js.map +1 -1
- package/dist/recorders/core/ErrorBridge.js +64 -0
- package/dist/recorders/core/ErrorBridge.js.map +1 -0
- package/dist/recorders/core/ReliabilityRecorder.js +33 -0
- package/dist/recorders/core/ReliabilityRecorder.js.map +1 -0
- package/dist/recorders/observability/BoundaryRecorder.js +23 -0
- package/dist/recorders/observability/BoundaryRecorder.js.map +1 -1
- package/dist/recorders/observability/LiveStateRecorder.js +8 -0
- package/dist/recorders/observability/LiveStateRecorder.js.map +1 -1
- package/dist/recorders/observability/commentary/commentaryTemplates.js +1 -0
- package/dist/recorders/observability/commentary/commentaryTemplates.js.map +1 -1
- package/dist/reliability/buildReliabilityGateChart.js +10 -4
- package/dist/reliability/buildReliabilityGateChart.js.map +1 -1
- package/dist/types/cache/CacheDecisionSubflow.d.ts +7 -10
- package/dist/types/cache/CacheDecisionSubflow.d.ts.map +1 -1
- package/dist/types/cache/CacheGateDecider.d.ts +16 -2
- package/dist/types/cache/CacheGateDecider.d.ts.map +1 -1
- package/dist/types/cache/cacheRecorder.d.ts.map +1 -1
- package/dist/types/conventions.d.ts +101 -1
- package/dist/types/conventions.d.ts.map +1 -1
- package/dist/types/core/Agent.d.ts +8 -0
- package/dist/types/core/Agent.d.ts.map +1 -1
- package/dist/types/core/LLMCall.d.ts +48 -12
- package/dist/types/core/LLMCall.d.ts.map +1 -1
- package/dist/types/core/RunnerBase.d.ts +12 -0
- package/dist/types/core/RunnerBase.d.ts.map +1 -1
- package/dist/types/core/agent/buildAgentChart.d.ts +31 -18
- package/dist/types/core/agent/buildAgentChart.d.ts.map +1 -1
- package/dist/types/core/agent/buildAgentMessageApiChart.d.ts +41 -0
- package/dist/types/core/agent/buildAgentMessageApiChart.d.ts.map +1 -0
- package/dist/types/core/agent/buildCacheSubflow.d.ts +36 -0
- package/dist/types/core/agent/buildCacheSubflow.d.ts.map +1 -0
- package/dist/types/core/agent/buildDynamicAgentChart.d.ts +57 -0
- package/dist/types/core/agent/buildDynamicAgentChart.d.ts.map +1 -0
- package/dist/types/core/agent/buildMessageApiChart.d.ts +48 -0
- package/dist/types/core/agent/buildMessageApiChart.d.ts.map +1 -0
- package/dist/types/core/agent/stages/callLLM.d.ts.map +1 -1
- package/dist/types/core/agent/stages/reliabilityExecution.d.ts.map +1 -1
- package/dist/types/core/agent/types.d.ts +69 -2
- package/dist/types/core/agent/types.d.ts.map +1 -1
- package/dist/types/core/humanizeLLMError.d.ts +24 -0
- package/dist/types/core/humanizeLLMError.d.ts.map +1 -0
- package/dist/types/core/slots/buildMessagesSlot.d.ts.map +1 -1
- package/dist/types/events/payloads.d.ts +84 -0
- package/dist/types/events/payloads.d.ts.map +1 -1
- package/dist/types/events/registry.d.ts +11 -1
- package/dist/types/events/registry.d.ts.map +1 -1
- package/dist/types/index.d.ts +4 -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/recorders/core/ContextEvaluatedRecorder.d.ts +24 -0
- package/dist/types/recorders/core/ContextEvaluatedRecorder.d.ts.map +1 -0
- package/dist/types/recorders/core/ContextRecorder.d.ts +0 -2
- package/dist/types/recorders/core/ContextRecorder.d.ts.map +1 -1
- package/dist/types/recorders/core/ErrorBridge.d.ts +39 -0
- package/dist/types/recorders/core/ErrorBridge.d.ts.map +1 -0
- package/dist/types/recorders/core/ReliabilityRecorder.d.ts +25 -0
- package/dist/types/recorders/core/ReliabilityRecorder.d.ts.map +1 -0
- package/dist/types/recorders/observability/BoundaryRecorder.d.ts +7 -0
- package/dist/types/recorders/observability/BoundaryRecorder.d.ts.map +1 -1
- package/dist/types/recorders/observability/LiveStateRecorder.d.ts.map +1 -1
- package/dist/types/recorders/observability/commentary/commentaryTemplates.d.ts.map +1 -1
- package/dist/types/reliability/buildReliabilityGateChart.d.ts.map +1 -1
- package/package.json +4 -3
- package/dist/core/agent/stages/iterationStart.js +0 -24
- package/dist/core/agent/stages/iterationStart.js.map +0 -1
- package/dist/esm/core/agent/stages/iterationStart.js +0 -20
- package/dist/esm/core/agent/stages/iterationStart.js.map +0 -1
- package/dist/types/core/agent/stages/iterationStart.d.ts +0 -16
- package/dist/types/core/agent/stages/iterationStart.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
<p align="center">
|
|
18
18
|
<a href="https://github.com/footprintjs/agentfootprint/actions"><img src="https://github.com/footprintjs/agentfootprint/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
19
|
-
|
|
19
|
+
<!-- coverage-badge --><img src="https://img.shields.io/badge/coverage-87%25-green.svg" alt="coverage: 87%"><!-- /coverage-badge -->
|
|
20
20
|
<a href="https://www.npmjs.com/package/agentfootprint"><img src="https://img.shields.io/npm/v/agentfootprint.svg?style=flat" alt="npm version"></a>
|
|
21
21
|
<a href="https://www.npmjs.com/package/agentfootprint"><img src="https://img.shields.io/npm/dm/agentfootprint.svg" alt="Downloads"></a>
|
|
22
22
|
<a href="https://github.com/footprintjs/agentfootprint/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="MIT"></a>
|
|
@@ -26,8 +26,7 @@
|
|
|
26
26
|
* always-active rules) follow.
|
|
27
27
|
*/
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.
|
|
30
|
-
const footprintjs_1 = require("footprintjs");
|
|
29
|
+
exports.decideCacheMarkers = exports.computeCacheMarkers = exports.injectionTargetSlots = exports.evaluateCachePolicy = void 0;
|
|
31
30
|
/**
|
|
32
31
|
* Evaluate a `CachePolicy` against the current context.
|
|
33
32
|
* Returns `true` if the policy says THIS iteration's content is cacheable.
|
|
@@ -143,10 +142,13 @@ function computeCacheMarkers(state) {
|
|
|
143
142
|
}
|
|
144
143
|
exports.computeCacheMarkers = computeCacheMarkers;
|
|
145
144
|
/**
|
|
146
|
-
* The decision function. Thin scope-binding wrapper around
|
|
147
|
-
* `computeCacheMarkers`.
|
|
145
|
+
* The decision stage function. Thin scope-binding wrapper around
|
|
146
|
+
* `computeCacheMarkers`. Exported so it can serve as the ROOT stage of
|
|
147
|
+
* the `sf-cache` subflow (a chart cannot start with a nested subflow),
|
|
148
|
+
* while `cacheDecisionSubflow` below still wraps the SAME function for
|
|
149
|
+
* standalone use — no logic duplication.
|
|
148
150
|
*/
|
|
149
|
-
function
|
|
151
|
+
function decideCacheMarkers(scope) {
|
|
150
152
|
scope.cacheMarkers = computeCacheMarkers({
|
|
151
153
|
activeInjections: scope.activeInjections,
|
|
152
154
|
iteration: scope.iteration,
|
|
@@ -158,17 +160,10 @@ function decide(scope) {
|
|
|
158
160
|
cachingDisabled: scope.cachingDisabled,
|
|
159
161
|
});
|
|
160
162
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
* with `arrayMerge: ArrayMergeMode.Replace` on the outputMapper —
|
|
168
|
-
* `cacheMarkers` MUST replace, not concatenate, across iterations
|
|
169
|
-
* (same lesson as the v2.5.1 InjectionEngine fix).
|
|
170
|
-
*/
|
|
171
|
-
exports.cacheDecisionSubflow = (0, footprintjs_1.flowChart)('DecideCacheMarkers', decide, 'decide-cache-markers', {
|
|
172
|
-
description: 'CacheDecision: walk activeInjections, evaluate cache directives, emit CacheMarker[]',
|
|
173
|
-
}).build();
|
|
163
|
+
exports.decideCacheMarkers = decideCacheMarkers;
|
|
164
|
+
// NOTE: the cache decision is now the ROOT stage of the `sf-cache` subflow
|
|
165
|
+
// (see core/agent/buildCacheSubflow.ts) via the exported `decideCacheMarkers`
|
|
166
|
+
// above. The former standalone `cacheDecisionSubflow` FlowChart export was
|
|
167
|
+
// removed when the agent stopped mounting it directly — `computeCacheMarkers`
|
|
168
|
+
// + `decideCacheMarkers` are the reusable pieces.
|
|
174
169
|
//# sourceMappingURL=CacheDecisionSubflow.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CacheDecisionSubflow.js","sourceRoot":"","sources":["../../src/cache/CacheDecisionSubflow.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;;;
|
|
1
|
+
{"version":3,"file":"CacheDecisionSubflow.js","sourceRoot":"","sources":["../../src/cache/CacheDecisionSubflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -102,15 +102,30 @@ exports.cacheGateDecide = cacheGateDecide;
|
|
|
102
102
|
/**
|
|
103
103
|
* Update the skill-history rolling window. Called as a function
|
|
104
104
|
* stage BEFORE the CacheGate decider. Reads the current iteration's
|
|
105
|
-
* active skill (
|
|
106
|
-
* `skillHistory` array.
|
|
105
|
+
* active skill (the MOST-RECENTLY activated one — the TAIL of
|
|
106
|
+
* `activatedInjectionIds`) and appends it to the `skillHistory` array.
|
|
107
|
+
*
|
|
108
|
+
* WHY THE TAIL, NOT THE HEAD: `read_skill` APPENDS each newly-activated
|
|
109
|
+
* skill to the end of `activatedInjectionIds`, and the list is cumulative
|
|
110
|
+
* + deduped per turn (reset only at seed). So the HEAD is frozen at the
|
|
111
|
+
* FIRST skill activated and never changes mid-turn — sampling it made the
|
|
112
|
+
* window record one constant value, so `detectSkillChurn` could never fire
|
|
113
|
+
* (the skill-churn cache rule was effectively dead). The tail tracks what
|
|
114
|
+
* the agent just switched to, which is the churn signal we actually want.
|
|
115
|
+
*
|
|
116
|
+
* KNOWN LIMITATION: if several skills are activated in the SAME iteration,
|
|
117
|
+
* only the last (tail) is recorded for that iteration — churn can
|
|
118
|
+
* under-count a multi-skill burst. A fully order-independent signal would
|
|
119
|
+
* read `activatedInjectionIds.length` directly in the gate; that is a
|
|
120
|
+
* larger change deferred for now.
|
|
107
121
|
*
|
|
108
122
|
* Window length is bounded at `SKILL_CHURN_WINDOW * 2` so the array
|
|
109
123
|
* doesn't grow unboundedly across long agent runs. Old entries
|
|
110
124
|
* fall off the front naturally.
|
|
111
125
|
*/
|
|
112
126
|
function updateSkillHistory(scope) {
|
|
113
|
-
const
|
|
127
|
+
const ids = scope.activatedInjectionIds ?? [];
|
|
128
|
+
const current = ids.length > 0 ? ids[ids.length - 1] : undefined;
|
|
114
129
|
const prior = scope.skillHistory ?? [];
|
|
115
130
|
const next = [...prior, current];
|
|
116
131
|
// Bounded buffer — keep window*2 to give detectSkillChurn room
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CacheGateDecider.js","sourceRoot":"","sources":["../../src/cache/CacheGateDecider.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;;;AAEH,6CAA2E;AA6B3E;;;;;;;;;;;;GAYG;AACU,QAAA,cAAc,GAAG,GAAG,CAAC;AAElC;;;GAGG;AACU,QAAA,kBAAkB,GAAG,CAAC,CAAC;AAEpC;;;;GAIG;AACU,QAAA,qBAAqB,GAAG,CAAC,CAAC;AAEvC;;;GAGG;AACH,SAAgB,gBAAgB,CAC9B,OAAwC,EACxC,aAAqB,0BAAkB,EACvC,YAAoB,6BAAqB;IAEzC,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS;QAAE,OAAO,KAAK,CAAC,CAAC,yBAAyB;IACvE,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,KAAK,SAAS;YAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,YAAY,CAAC,IAAI,IAAI,SAAS,CAAC;AACxC,CAAC;AAZD,4CAYC;AAQD;;;;;;;;;;;GAWG;AACH,SAAgB,eAAe,CAAC,KAAiC;IAC/D,OAAO,IAAA,oBAAM,EACX,KAAK,EACL;QACE;YACE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,IAAI;YACvC,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,uDAAuD;SAC/D;QACD;YACE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,SAAS,IAAI,CAAC,CAAC,aAAa,GAAG,sBAAc;YAC9E,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,cAAc,sBAAc,GAAG,GAAG,kBAAkB;SAC5D;QACD;YACE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC;YAC7C,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,iBAAiB,6BAAqB,0BAA0B,0BAAkB,SAAS;SACnG;KACF,EACD,eAAe,CAChB,CAAC;AACJ,CAAC;AAtBD,0CAsBC;AAED
|
|
1
|
+
{"version":3,"file":"CacheGateDecider.js","sourceRoot":"","sources":["../../src/cache/CacheGateDecider.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;;;AAEH,6CAA2E;AA6B3E;;;;;;;;;;;;GAYG;AACU,QAAA,cAAc,GAAG,GAAG,CAAC;AAElC;;;GAGG;AACU,QAAA,kBAAkB,GAAG,CAAC,CAAC;AAEpC;;;;GAIG;AACU,QAAA,qBAAqB,GAAG,CAAC,CAAC;AAEvC;;;GAGG;AACH,SAAgB,gBAAgB,CAC9B,OAAwC,EACxC,aAAqB,0BAAkB,EACvC,YAAoB,6BAAqB;IAEzC,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS;QAAE,OAAO,KAAK,CAAC,CAAC,yBAAyB;IACvE,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,KAAK,SAAS;YAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,YAAY,CAAC,IAAI,IAAI,SAAS,CAAC;AACxC,CAAC;AAZD,4CAYC;AAQD;;;;;;;;;;;GAWG;AACH,SAAgB,eAAe,CAAC,KAAiC;IAC/D,OAAO,IAAA,oBAAM,EACX,KAAK,EACL;QACE;YACE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,IAAI;YACvC,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,uDAAuD;SAC/D;QACD;YACE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,SAAS,IAAI,CAAC,CAAC,aAAa,GAAG,sBAAc;YAC9E,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,cAAc,sBAAc,GAAG,GAAG,kBAAkB;SAC5D;QACD;YACE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC;YAC7C,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,iBAAiB,6BAAqB,0BAA0B,0BAAkB,SAAS;SACnG;KACF,EACD,eAAe,CAChB,CAAC;AACJ,CAAC;AAtBD,0CAsBC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,SAAgB,kBAAkB,CAChC,KAGE;IAEF,MAAM,GAAG,GAAG,KAAK,CAAC,qBAAqB,IAAI,EAAE,CAAC;IAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACjE,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC;IACvC,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,EAAE,OAAO,CAAC,CAAC;IACjC,+DAA+D;IAC/D,mDAAmD;IACnD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,0BAAkB,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,0BAAkB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClG,KAAK,CAAC,YAAY,GAAG,OAAO,CAAC;AAC/B,CAAC;AAdD,gDAcC"}
|
|
@@ -28,6 +28,8 @@
|
|
|
28
28
|
*/
|
|
29
29
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
30
|
exports.cacheRecorder = void 0;
|
|
31
|
+
const trace_1 = require("footprintjs/trace");
|
|
32
|
+
const conventions_js_1 = require("../conventions.js");
|
|
31
33
|
function cacheRecorder(options = {}) {
|
|
32
34
|
const perIter = [];
|
|
33
35
|
let lastDecision;
|
|
@@ -41,9 +43,16 @@ function cacheRecorder(options = {}) {
|
|
|
41
43
|
const handle = {
|
|
42
44
|
id: 'cache-recorder',
|
|
43
45
|
onDecision(event) {
|
|
44
|
-
// Only care about CacheGate decisions
|
|
45
|
-
//
|
|
46
|
-
|
|
46
|
+
// Only care about CacheGate decisions, matched by the decider's LOCAL
|
|
47
|
+
// stage id. Both `event.decider` (the node NAME) and the prefixed
|
|
48
|
+
// `traversalContext.stageId` become `sf-cache/…` now that CacheGate is
|
|
49
|
+
// nested in sf-cache, so we strip the subflow path with splitStageId and
|
|
50
|
+
// compare the local id. This is id-stable (survives a display-name
|
|
51
|
+
// rename) and nesting-safe (works top-level or inside sf-cache).
|
|
52
|
+
// (The old `event.decider !== 'cache-gate'` was a no-op: event.decider is
|
|
53
|
+
// the NAME 'CacheGate', never the id 'cache-gate'.)
|
|
54
|
+
const stageId = event.traversalContext?.stageId;
|
|
55
|
+
if (!stageId || (0, trace_1.splitStageId)(stageId).localStageId !== conventions_js_1.STAGE_IDS.CACHE_GATE)
|
|
47
56
|
return;
|
|
48
57
|
const matched = event.evidence?.rules.find((r) => r.matched);
|
|
49
58
|
lastDecision = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cacheRecorder.js","sourceRoot":"","sources":["../../src/cache/cacheRecorder.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;;;
|
|
1
|
+
{"version":3,"file":"cacheRecorder.js","sourceRoot":"","sources":["../../src/cache/cacheRecorder.ts"],"names":[],"mappings":"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"}
|
package/dist/conventions.js
CHANGED
|
@@ -11,13 +11,17 @@
|
|
|
11
11
|
* Rename any ID here → both builders and recorders stay in sync.
|
|
12
12
|
*/
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
exports.isInjectionKey = exports.injectionKeyForSlot = exports.INJECTION_KEYS = exports.isKnownStage = exports.isKnownSubflow = exports.slotFromSubflowId = exports.isSlotSubflow = exports.STAGE_IDS = exports.SUBFLOW_IDS = void 0;
|
|
14
|
+
exports.isInjectionKey = exports.injectionKeyForSlot = exports.INJECTION_KEYS = exports.milestoneFor = exports.stageRole = exports.isKnownStage = exports.isKnownSubflow = exports.slotFromRuntimeStageId = exports.slotFromSubflowId = exports.isSlotSubflow = exports.STAGE_IDS = exports.SUBFLOW_IDS = void 0;
|
|
15
15
|
const trace_1 = require("footprintjs/trace");
|
|
16
16
|
/** Subflow IDs — mounted by builders, observed by recorders. */
|
|
17
17
|
exports.SUBFLOW_IDS = {
|
|
18
18
|
/** Injection Engine subflow. Evaluates every Injection's trigger
|
|
19
19
|
* and writes activeInjections[] for the slot subflows to consume. */
|
|
20
20
|
INJECTION_ENGINE: 'sf-injection-engine',
|
|
21
|
+
/** Inner subflow inside LLMCall that wraps the invocation
|
|
22
|
+
* (seed + slots + call-llm + optional thinking + extract-final).
|
|
23
|
+
* Mounted by LLMCall's outer `client` chart. */
|
|
24
|
+
LLM_CALL: 'sf-llm-call',
|
|
21
25
|
/** System-prompt slot subflow. Observed by ContextRecorder. */
|
|
22
26
|
SYSTEM_PROMPT: 'sf-system-prompt',
|
|
23
27
|
/** Messages slot subflow. */
|
|
@@ -36,8 +40,18 @@ exports.SUBFLOW_IDS = {
|
|
|
36
40
|
* decider returns `'final'` as a routing value AND the same string
|
|
37
41
|
* becomes the subflow's id. */
|
|
38
42
|
FINAL: 'final',
|
|
43
|
+
/** Cache subflow (v2.14). Wraps the whole per-turn cache machinery —
|
|
44
|
+
* decide markers → CacheGate decider → apply/skip — as ONE collapsible
|
|
45
|
+
* boundary in the chart. Provider-independent decision layer; the
|
|
46
|
+
* attached provider's CacheStrategy turns markers into wire format.
|
|
47
|
+
* UpdateSkillHistory stays OUTSIDE (in the main loop) so the rolling
|
|
48
|
+
* skillHistory window persists across iterations without round-tripping
|
|
49
|
+
* through this subflow. */
|
|
50
|
+
CACHE: 'sf-cache',
|
|
39
51
|
/** Cache decision subflow (v2.6). Walks activeInjections, emits
|
|
40
|
-
* agnostic CacheMarker[]. Provider-independent.
|
|
52
|
+
* agnostic CacheMarker[]. Provider-independent. Standalone building
|
|
53
|
+
* block; the agent now uses the `decideCacheMarkers` stage inside
|
|
54
|
+
* `sf-cache` instead of mounting this directly. */
|
|
41
55
|
CACHE_DECISION: 'sf-cache-decision',
|
|
42
56
|
/** Thinking-normalization mount (v2.14). Wraps the consumer's
|
|
43
57
|
* ThinkingHandler.normalize() in a real footprintjs subflow so it
|
|
@@ -50,7 +64,24 @@ exports.SUBFLOW_IDS = {
|
|
|
50
64
|
/** Stage IDs — plain function stages that builders mount. */
|
|
51
65
|
exports.STAGE_IDS = {
|
|
52
66
|
SEED: 'seed',
|
|
67
|
+
/** Context-assembly selector stage. Runs AFTER InjectionEngine and
|
|
68
|
+
* fans the 3 slot subflows (system-prompt / messages / tools) out in
|
|
69
|
+
* PARALLEL (selector picks all 3 every iteration; failFast so a
|
|
70
|
+
* required slot's throw aborts the turn). They converge before
|
|
71
|
+
* CacheDecision. Shared by buildAgentChart + buildDynamicAgentChart;
|
|
72
|
+
* the flat viz proof chart uses the same id as its root selector. */
|
|
73
|
+
CONTEXT: 'context',
|
|
74
|
+
/** Outer "client" stage in LLMCall's wrapped chart. Receives args on
|
|
75
|
+
* the first visit, $break()s on the second (post-loop) visit with
|
|
76
|
+
* the LLM answer as TraversalResult. This is the lens-friendly
|
|
77
|
+
* affordance — the User pill maps to this stage. */
|
|
78
|
+
CLIENT: 'client',
|
|
53
79
|
CALL_LLM: 'call-llm',
|
|
80
|
+
/** Final-response extraction stage that runs after CallLLM (and
|
|
81
|
+
* optional sf-thinking). For LLMCall this is mostly symmetric with
|
|
82
|
+
* Agent's `sf-final` branch — gives lens a "Final" node and a
|
|
83
|
+
* clear commit boundary marking "we have the answer." */
|
|
84
|
+
EXTRACT_FINAL: 'extract-final',
|
|
54
85
|
FINAL: 'final',
|
|
55
86
|
FORMAT_MERGE: 'format-merge',
|
|
56
87
|
MERGE_LLM: 'merge-llm',
|
|
@@ -96,6 +127,30 @@ function slotFromSubflowId(id) {
|
|
|
96
127
|
}
|
|
97
128
|
}
|
|
98
129
|
exports.slotFromSubflowId = slotFromSubflowId;
|
|
130
|
+
/**
|
|
131
|
+
* Resolve the context slot a scope write belongs to FROM THE WRITE'S OWN
|
|
132
|
+
* `runtimeStageId` — not from a "currently-open slot" stack.
|
|
133
|
+
*
|
|
134
|
+
* Why: once the 3 slot subflows run in PARALLEL (selector fan-out), their
|
|
135
|
+
* entry/write/exit events INTERLEAVE — a stack top is unreliable, so a write
|
|
136
|
+
* inside `sf-messages` could be attributed to (or dropped against)
|
|
137
|
+
* `sf-tools`. The write's `runtimeStageId` (`[subflowPath/]stageId#index`)
|
|
138
|
+
* always encodes which slot subflow enclosed it; we scan the path segments
|
|
139
|
+
* innermost-first for a slot id. Matches the sequential result exactly
|
|
140
|
+
* (the write is still inside its own slot), so it is behavior-preserving.
|
|
141
|
+
*/
|
|
142
|
+
function slotFromRuntimeStageId(runtimeStageId) {
|
|
143
|
+
// Strip the `#index` suffix, then walk `[subflowPath/]stageId` segments.
|
|
144
|
+
const path = runtimeStageId.split('#', 1)[0];
|
|
145
|
+
const segments = path.split('/');
|
|
146
|
+
for (let i = segments.length - 1; i >= 0; i--) {
|
|
147
|
+
const slot = slotFromSubflowId(segments[i]);
|
|
148
|
+
if (slot)
|
|
149
|
+
return slot;
|
|
150
|
+
}
|
|
151
|
+
return undefined;
|
|
152
|
+
}
|
|
153
|
+
exports.slotFromRuntimeStageId = slotFromRuntimeStageId;
|
|
99
154
|
/** True when an id is any of the library's known subflow IDs. */
|
|
100
155
|
function isKnownSubflow(id) {
|
|
101
156
|
return Object.values(exports.SUBFLOW_IDS).includes(id);
|
|
@@ -106,6 +161,101 @@ function isKnownStage(id) {
|
|
|
106
161
|
return Object.values(exports.STAGE_IDS).includes(id);
|
|
107
162
|
}
|
|
108
163
|
exports.isKnownStage = isKnownStage;
|
|
164
|
+
/** Mechanism stages — present so the run works, not what the user reads. */
|
|
165
|
+
const PLUMBING_LOCAL_IDS = new Set([
|
|
166
|
+
exports.SUBFLOW_IDS.INJECTION_ENGINE,
|
|
167
|
+
exports.SUBFLOW_IDS.LLM_CALL, // wrapper; the hero is the `call-llm` stage INSIDE it
|
|
168
|
+
exports.SUBFLOW_IDS.ROUTE,
|
|
169
|
+
exports.SUBFLOW_IDS.MERGE,
|
|
170
|
+
exports.SUBFLOW_IDS.CACHE,
|
|
171
|
+
exports.SUBFLOW_IDS.CACHE_DECISION,
|
|
172
|
+
exports.SUBFLOW_IDS.THINKING,
|
|
173
|
+
exports.STAGE_IDS.CONTEXT, // the selector fan-out point; its 3 slot children are the heroes
|
|
174
|
+
exports.STAGE_IDS.CLIENT,
|
|
175
|
+
exports.STAGE_IDS.EXTRACT_FINAL,
|
|
176
|
+
exports.STAGE_IDS.FORMAT_MERGE,
|
|
177
|
+
exports.STAGE_IDS.EXTRACT_MERGE,
|
|
178
|
+
exports.STAGE_IDS.UPDATE_SKILL_HISTORY,
|
|
179
|
+
exports.STAGE_IDS.CACHE_GATE,
|
|
180
|
+
exports.STAGE_IDS.APPLY_MARKERS,
|
|
181
|
+
exports.STAGE_IDS.SKIP_CACHING,
|
|
182
|
+
exports.STAGE_IDS.BUILD_LLM_REQUEST,
|
|
183
|
+
]);
|
|
184
|
+
/** Neutral chart boundaries — entry/exit, rendered normally (not muted). */
|
|
185
|
+
const BOUNDARY_LOCAL_IDS = new Set([
|
|
186
|
+
exports.STAGE_IDS.SEED, // 'Initialize' — chart root / Agent boundary
|
|
187
|
+
exports.STAGE_IDS.FINAL, // 'final' (=== SUBFLOW_IDS.FINAL)
|
|
188
|
+
]);
|
|
189
|
+
/**
|
|
190
|
+
* Classify a stage id into its {@link StageRole}. Accepts a path-qualified id
|
|
191
|
+
* (`sf-llm-call/call-llm`) — only the LOCAL segment matters, so it works at
|
|
192
|
+
* any nesting depth. Built entirely from the id constants above, so adding a
|
|
193
|
+
* stage to the chart only requires listing it here.
|
|
194
|
+
*/
|
|
195
|
+
function stageRole(id) {
|
|
196
|
+
const { localStageId } = (0, trace_1.splitStageId)(id);
|
|
197
|
+
if (isSlotSubflow(localStageId))
|
|
198
|
+
return 'hero-slot';
|
|
199
|
+
if (localStageId === exports.STAGE_IDS.CALL_LLM || localStageId === exports.STAGE_IDS.MERGE_LLM)
|
|
200
|
+
return 'hero-llm';
|
|
201
|
+
// Tool execution mounts under the bare branch key 'tool-calls' in shipped
|
|
202
|
+
// charts; SUBFLOW_IDS.TOOL_CALLS is the reserved prefixed form.
|
|
203
|
+
if (localStageId === 'tool-calls' || localStageId === exports.SUBFLOW_IDS.TOOL_CALLS)
|
|
204
|
+
return 'hero-action';
|
|
205
|
+
if (BOUNDARY_LOCAL_IDS.has(localStageId))
|
|
206
|
+
return 'boundary';
|
|
207
|
+
if (PLUMBING_LOCAL_IDS.has(localStageId))
|
|
208
|
+
return 'plumbing';
|
|
209
|
+
return 'boundary'; // unknown → neutral (never silently muted)
|
|
210
|
+
}
|
|
211
|
+
exports.stageRole = stageRole;
|
|
212
|
+
/**
|
|
213
|
+
* Classify a stage id into a {@link Milestone}, or `null` when the stage is NOT
|
|
214
|
+
* a milestone boundary (its commits fold into the surrounding milestone's
|
|
215
|
+
* collection). This is the DOMAIN's declaration of which steps are scrub-worthy;
|
|
216
|
+
* the Lens consumes it to build the time-travel slider (see
|
|
217
|
+
* agentfootprint-lens `cursorPositionsAtDrill`).
|
|
218
|
+
*
|
|
219
|
+
* Mirrors {@link stageRole}: accepts a runtimeStageId (`call-llm#17`), a
|
|
220
|
+
* path-qualified id (`sf-llm-call/call-llm`), or a bare local id — only the
|
|
221
|
+
* LOCAL stage segment matters, so it works at any nesting depth and for both
|
|
222
|
+
* commit ids and subflow-group ids.
|
|
223
|
+
*/
|
|
224
|
+
function milestoneFor(id) {
|
|
225
|
+
// Strip the `#executionIndex` suffix (runtimeStageId form) before decomposing
|
|
226
|
+
// the path prefix — splitStageId expects the segment before `#`.
|
|
227
|
+
const beforeHash = id.includes('#') ? id.slice(0, id.indexOf('#')) : id;
|
|
228
|
+
const { localStageId } = (0, trace_1.splitStageId)(beforeHash);
|
|
229
|
+
switch (localStageId) {
|
|
230
|
+
// Loop entry — one per ReAct iteration. INJECTION_ENGINE is the flat loop
|
|
231
|
+
// target; LLM_CALL is the subflow-shape loop target.
|
|
232
|
+
case exports.SUBFLOW_IDS.INJECTION_ENGINE:
|
|
233
|
+
case exports.SUBFLOW_IDS.LLM_CALL:
|
|
234
|
+
return { kind: 'iteration', label: 'Iteration' };
|
|
235
|
+
// Context slots — one stop per slot that was engineered THIS iteration. In
|
|
236
|
+
// dynamic mode all three appear every turn; in classic mode only the slot
|
|
237
|
+
// that actually re-ran (Messages) appears after turn 1 — so scrubbing shows
|
|
238
|
+
// exactly "which slot got updated."
|
|
239
|
+
case exports.SUBFLOW_IDS.SYSTEM_PROMPT:
|
|
240
|
+
return { kind: 'slot', label: 'System prompt' };
|
|
241
|
+
case exports.SUBFLOW_IDS.MESSAGES:
|
|
242
|
+
return { kind: 'slot', label: 'Messages' };
|
|
243
|
+
case exports.SUBFLOW_IDS.TOOLS:
|
|
244
|
+
return { kind: 'slot', label: 'Tools' };
|
|
245
|
+
case exports.STAGE_IDS.CALL_LLM:
|
|
246
|
+
case exports.STAGE_IDS.MERGE_LLM:
|
|
247
|
+
return { kind: 'llm-turn', label: 'LLM turn' };
|
|
248
|
+
// Tool execution mounts under the bare branch key 'tool-calls'.
|
|
249
|
+
case 'tool-calls':
|
|
250
|
+
case exports.SUBFLOW_IDS.TOOL_CALLS:
|
|
251
|
+
return { kind: 'tool-call', label: 'Tool call' };
|
|
252
|
+
case exports.SUBFLOW_IDS.ROUTE:
|
|
253
|
+
return { kind: 'decision', label: 'Route' };
|
|
254
|
+
default:
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
exports.milestoneFor = milestoneFor;
|
|
109
259
|
/**
|
|
110
260
|
* Scope-key convention for context injections.
|
|
111
261
|
*
|
package/dist/conventions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conventions.js","sourceRoot":"","sources":["../src/conventions.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAEH,6CAAiD;AAGjD,gEAAgE;AACnD,QAAA,WAAW,GAAG;IACzB;0EACsE;IACtE,gBAAgB,EAAE,qBAAqB;IACvC,+DAA+D;IAC/D,aAAa,EAAE,kBAAkB;IACjC,6BAA6B;IAC7B,QAAQ,EAAE,aAAa;IACvB,0BAA0B;IAC1B,KAAK,EAAE,UAAU;IACjB,2CAA2C;IAC3C,KAAK,EAAE,UAAU;IACjB,uDAAuD;IACvD,UAAU,EAAE,eAAe;IAC3B,kCAAkC;IAClC,KAAK,EAAE,UAAU;IACjB;;;;oCAIgC;IAChC,KAAK,EAAE,OAAO;IACd;
|
|
1
|
+
{"version":3,"file":"conventions.js","sourceRoot":"","sources":["../src/conventions.ts"],"names":[],"mappings":"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"}
|
package/dist/core/Agent.js
CHANGED
|
@@ -20,19 +20,21 @@ const footprintjs_1 = require("footprintjs");
|
|
|
20
20
|
const types_js_1 = require("../reliability/types.js");
|
|
21
21
|
const extractSequence_js_1 = require("../security/extractSequence.js");
|
|
22
22
|
const PolicyHaltError_js_1 = require("../security/PolicyHaltError.js");
|
|
23
|
-
const CacheDecisionSubflow_js_1 = require("../cache/CacheDecisionSubflow.js");
|
|
24
23
|
const CacheGateDecider_js_1 = require("../cache/CacheGateDecider.js");
|
|
25
24
|
const strategyRegistry_js_1 = require("../cache/strategyRegistry.js");
|
|
26
25
|
const conventions_js_1 = require("../conventions.js");
|
|
27
26
|
const ContextRecorder_js_1 = require("../recorders/core/ContextRecorder.js");
|
|
27
|
+
const ContextEvaluatedRecorder_js_1 = require("../recorders/core/ContextEvaluatedRecorder.js");
|
|
28
28
|
const StreamRecorder_js_1 = require("../recorders/core/StreamRecorder.js");
|
|
29
29
|
const AgentRecorder_js_1 = require("../recorders/core/AgentRecorder.js");
|
|
30
|
+
const ErrorBridge_js_1 = require("../recorders/core/ErrorBridge.js");
|
|
30
31
|
const CostRecorder_js_1 = require("../recorders/core/CostRecorder.js");
|
|
31
32
|
const PermissionRecorder_js_1 = require("../recorders/core/PermissionRecorder.js");
|
|
32
33
|
const EvalRecorder_js_1 = require("../recorders/core/EvalRecorder.js");
|
|
33
34
|
const MemoryRecorder_js_1 = require("../recorders/core/MemoryRecorder.js");
|
|
34
35
|
const SkillRecorder_js_1 = require("../recorders/core/SkillRecorder.js");
|
|
35
36
|
const ToolsRecorder_js_1 = require("../recorders/core/ToolsRecorder.js");
|
|
37
|
+
const ReliabilityRecorder_js_1 = require("../recorders/core/ReliabilityRecorder.js");
|
|
36
38
|
const buildSystemPromptSlot_js_1 = require("./slots/buildSystemPromptSlot.js");
|
|
37
39
|
const buildMessagesSlot_js_1 = require("./slots/buildMessagesSlot.js");
|
|
38
40
|
const buildToolsSlot_js_1 = require("./slots/buildToolsSlot.js");
|
|
@@ -42,12 +44,12 @@ const runCheckpoint_js_1 = require("./runCheckpoint.js");
|
|
|
42
44
|
const outputSchema_js_1 = require("./outputSchema.js");
|
|
43
45
|
const RunnerBase_js_1 = require("./RunnerBase.js");
|
|
44
46
|
const validators_js_1 = require("./agent/validators.js");
|
|
45
|
-
const iterationStart_js_1 = require("./agent/stages/iterationStart.js");
|
|
46
47
|
const route_js_1 = require("./agent/stages/route.js");
|
|
47
48
|
const seed_js_1 = require("./agent/stages/seed.js");
|
|
48
49
|
const callLLM_js_1 = require("./agent/stages/callLLM.js");
|
|
49
50
|
const toolCalls_js_1 = require("./agent/stages/toolCalls.js");
|
|
50
51
|
const buildAgentChart_js_1 = require("./agent/buildAgentChart.js");
|
|
52
|
+
const buildDynamicAgentChart_js_1 = require("./agent/buildDynamicAgentChart.js");
|
|
51
53
|
const buildToolRegistry_js_1 = require("./agent/buildToolRegistry.js");
|
|
52
54
|
const AgentBuilder_js_1 = require("./agent/AgentBuilder.js");
|
|
53
55
|
Object.defineProperty(exports, "AgentBuilder", { enumerable: true, get: function () { return AgentBuilder_js_1.AgentBuilder; } });
|
|
@@ -185,6 +187,14 @@ class Agent extends RunnerBase_js_1.RunnerBase {
|
|
|
185
187
|
/** Per-COMPOSITION translator (L1b). Set from `opts.groupTranslator`;
|
|
186
188
|
* undefined when consumer didn't attach one. */
|
|
187
189
|
agentGroupTranslator;
|
|
190
|
+
/** ReAct chart shape — 'flat' (default, bare call-llm stage) or
|
|
191
|
+
* 'subflow' (LLM turn wrapped in sf-llm-call). Set from
|
|
192
|
+
* `opts.reactStructure`. */
|
|
193
|
+
reactStructure;
|
|
194
|
+
/** ReAct loop SEMANTICS — 'dynamic' (default, re-engineer all slots each
|
|
195
|
+
* turn, loop→InjectionEngine) or 'classic' (engineer context once,
|
|
196
|
+
* loop→Messages only). Set from `opts.reactMode`. See AgentOptions. */
|
|
197
|
+
reactMode;
|
|
188
198
|
constructor(opts, systemPromptValue, registry, voice, injections = [], memories = [], outputSchemaParser, toolProvider, systemPromptCachePolicy = 'always', cachingDisabled = false, cacheStrategy, outputFallbackCfg, reliabilityConfig, thinkingHandlerValue, thinkingBudgetValue) {
|
|
189
199
|
super();
|
|
190
200
|
this.provider = opts.provider;
|
|
@@ -196,6 +206,8 @@ class Agent extends RunnerBase_js_1.RunnerBase {
|
|
|
196
206
|
this.maxIterations = (0, validators_js_1.clampIterations)(opts.maxIterations ?? 10);
|
|
197
207
|
this.structureRecorders = opts.structureRecorders;
|
|
198
208
|
this.agentGroupTranslator = opts.groupTranslator;
|
|
209
|
+
this.reactStructure = opts.reactStructure ?? 'flat';
|
|
210
|
+
this.reactMode = opts.reactMode ?? 'dynamic';
|
|
199
211
|
this.systemPromptValue = systemPromptValue;
|
|
200
212
|
this.systemPromptCachePolicy = systemPromptCachePolicy;
|
|
201
213
|
this.cachingDisabledValue = cachingDisabled;
|
|
@@ -554,8 +566,14 @@ class Agent extends RunnerBase_js_1.RunnerBase {
|
|
|
554
566
|
const dispatcher = this.getDispatcher();
|
|
555
567
|
const getRunCtx = () => this.currentRunContext;
|
|
556
568
|
executor.attachCombinedRecorder(new ContextRecorder_js_1.ContextRecorder({ dispatcher, getRunContext: getRunCtx }));
|
|
569
|
+
// The InjectionEngine typedEmits context.evaluated; this bridge forwards it
|
|
570
|
+
// to the dispatcher (ContextRecorder handles the write-derived context.*).
|
|
571
|
+
executor.attachCombinedRecorder((0, ContextEvaluatedRecorder_js_1.contextEvaluatedRecorder)({ dispatcher, getRunContext: getRunCtx }));
|
|
557
572
|
executor.attachCombinedRecorder((0, StreamRecorder_js_1.streamRecorder)({ dispatcher, getRunContext: getRunCtx }));
|
|
558
573
|
executor.attachCombinedRecorder((0, AgentRecorder_js_1.agentRecorder)({ dispatcher, getRunContext: getRunCtx }));
|
|
574
|
+
// Terminal-failure bridge: footprintjs onRunFailed → typed error.fatal,
|
|
575
|
+
// so a thrown run clears in-flight live state + flips monitor status.
|
|
576
|
+
executor.attachCombinedRecorder((0, ErrorBridge_js_1.errorBridge)({ dispatcher, getRunContext: getRunCtx }));
|
|
559
577
|
if (this.pricingTable) {
|
|
560
578
|
executor.attachCombinedRecorder((0, CostRecorder_js_1.costRecorder)({ dispatcher, getRunContext: getRunCtx }));
|
|
561
579
|
}
|
|
@@ -567,6 +585,9 @@ class Agent extends RunnerBase_js_1.RunnerBase {
|
|
|
567
585
|
executor.attachCombinedRecorder((0, MemoryRecorder_js_1.memoryRecorder)({ dispatcher, getRunContext: getRunCtx }));
|
|
568
586
|
executor.attachCombinedRecorder((0, SkillRecorder_js_1.skillRecorder)({ dispatcher, getRunContext: getRunCtx }));
|
|
569
587
|
executor.attachCombinedRecorder((0, ToolsRecorder_js_1.toolsRecorder)({ dispatcher, getRunContext: getRunCtx }));
|
|
588
|
+
// Reliability telemetry (rules-loop fail_fast / retried / recovered).
|
|
589
|
+
// Always-on, but zero-cost when no .reliability() config fires events.
|
|
590
|
+
executor.attachCombinedRecorder((0, ReliabilityRecorder_js_1.reliabilityRecorder)({ dispatcher, getRunContext: getRunCtx }));
|
|
570
591
|
for (const r of this.attachedRecorders)
|
|
571
592
|
executor.attachCombinedRecorder(r);
|
|
572
593
|
return executor;
|
|
@@ -584,6 +605,8 @@ class Agent extends RunnerBase_js_1.RunnerBase {
|
|
|
584
605
|
// and branch on `.kind`.
|
|
585
606
|
if (this.reliabilityConfig !== undefined) {
|
|
586
607
|
const snap = executor.getSnapshot();
|
|
608
|
+
// Read via Pick<AgentState, …> so the read shape cannot drift from
|
|
609
|
+
// the typed write side (the fields are declared once on AgentState).
|
|
587
610
|
const state = snap.sharedState;
|
|
588
611
|
if (state.reliabilityFailKind !== undefined) {
|
|
589
612
|
// Reconstruct the cause Error from the captured message+name —
|
|
@@ -718,8 +741,6 @@ class Agent extends RunnerBase_js_1.RunnerBase {
|
|
|
718
741
|
...(this.externalToolProvider && { toolProvider: this.externalToolProvider }),
|
|
719
742
|
...(this.externalToolProvider && { providerToolCache }),
|
|
720
743
|
});
|
|
721
|
-
// iterationStart extracted to ./agent/stages/iterationStart.ts (v2.11.2).
|
|
722
|
-
const iterationStart = iterationStart_js_1.iterationStartStage;
|
|
723
744
|
// callLLM extracted to ./agent/stages/callLLM.ts (v2.11.2). Same
|
|
724
745
|
// late-binding pattern as seed for toolSchemas (computed below).
|
|
725
746
|
const callLLM = (0, callLLM_js_1.buildCallLLMStage)({
|
|
@@ -758,12 +779,13 @@ class Agent extends RunnerBase_js_1.RunnerBase {
|
|
|
758
779
|
? (0, buildThinkingSubflow_js_1.buildThinkingSubflow)(this.thinkingHandler)
|
|
759
780
|
: undefined;
|
|
760
781
|
// Chart composition extracted to ./agent/buildAgentChart.ts (v2.11.2).
|
|
761
|
-
|
|
782
|
+
// The deps object is identical for both chart shapes — only the
|
|
783
|
+
// wiring differs (flat call-llm stage vs sf-llm-call subflow).
|
|
784
|
+
const chartDeps = {
|
|
762
785
|
memories: this.memories,
|
|
763
786
|
systemPromptCachePolicy,
|
|
764
787
|
maxIterations,
|
|
765
788
|
seed,
|
|
766
|
-
iterationStart,
|
|
767
789
|
callLLM,
|
|
768
790
|
routeDecider,
|
|
769
791
|
toolCallsHandler,
|
|
@@ -772,13 +794,28 @@ class Agent extends RunnerBase_js_1.RunnerBase {
|
|
|
772
794
|
messagesSubflow,
|
|
773
795
|
toolsSubflow,
|
|
774
796
|
...(thinkingSubflow !== undefined && { thinkingSubflow }),
|
|
775
|
-
cacheDecisionSubflow: CacheDecisionSubflow_js_1.cacheDecisionSubflow,
|
|
776
797
|
updateSkillHistoryStage: CacheGateDecider_js_1.updateSkillHistory,
|
|
777
|
-
|
|
798
|
+
// Gate the UpdateSkillHistory stage on skills being registered —
|
|
799
|
+
// same idiom buildToolRegistry uses to auto-attach `read_skill`.
|
|
800
|
+
hasSkills: this.injections.some((i) => i.flavor === 'skill'),
|
|
801
|
+
reactMode: this.reactMode,
|
|
778
802
|
...(this.structureRecorders !== undefined && {
|
|
779
803
|
structureRecorders: [...this.structureRecorders],
|
|
780
804
|
}),
|
|
781
|
-
}
|
|
805
|
+
};
|
|
806
|
+
// `reactMode: 'classic'` engineers context ONCE and loops only Messages —
|
|
807
|
+
// it uses the flat builder's classic path (the subflow grouping is
|
|
808
|
+
// dynamic-only for now), so it takes precedence over reactStructure.
|
|
809
|
+
if (this.reactMode === 'classic') {
|
|
810
|
+
return (0, buildAgentChart_js_1.buildAgentChart)(chartDeps);
|
|
811
|
+
}
|
|
812
|
+
// `reactStructure: 'subflow'` (opt-in) wraps the LLM turn in an
|
|
813
|
+
// `sf-llm-call` subflow — same boundary LLMCall produces — so Lens /
|
|
814
|
+
// explainable-ui render it as an LLM group with slots inside. Default
|
|
815
|
+
// `'flat'` keeps the historical bare-stage shape. Behaviour identical.
|
|
816
|
+
return this.reactStructure === 'subflow'
|
|
817
|
+
? (0, buildDynamicAgentChart_js_1.buildDynamicAgentChart)(chartDeps)
|
|
818
|
+
: (0, buildAgentChart_js_1.buildAgentChart)(chartDeps);
|
|
782
819
|
}
|
|
783
820
|
}
|
|
784
821
|
exports.Agent = Agent;
|