agentfootprint 6.11.1 → 6.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +5 -6
- package/CLAUDE.md +6 -7
- package/README.md +1 -1
- package/ai-instructions/claude-code/SKILL.md +3 -4
- package/dist/core/Agent.js +14 -0
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/agent/buildAgentChart.js +3 -0
- package/dist/core/agent/buildAgentChart.js.map +1 -1
- package/dist/core/agent/buildDynamicAgentChart.js +3 -0
- package/dist/core/agent/buildDynamicAgentChart.js.map +1 -1
- package/dist/esm/core/Agent.js +14 -0
- package/dist/esm/core/Agent.js.map +1 -1
- package/dist/esm/core/agent/buildAgentChart.js +3 -0
- package/dist/esm/core/agent/buildAgentChart.js.map +1 -1
- package/dist/esm/core/agent/buildDynamicAgentChart.js +3 -0
- package/dist/esm/core/agent/buildDynamicAgentChart.js.map +1 -1
- package/dist/esm/memory/causal/evidenceRecorder.js +213 -0
- package/dist/esm/memory/causal/evidenceRecorder.js.map +1 -0
- package/dist/esm/memory/causal/index.js +1 -0
- package/dist/esm/memory/causal/index.js.map +1 -1
- package/dist/esm/memory/causal/loadSnapshot.js +18 -4
- package/dist/esm/memory/causal/loadSnapshot.js.map +1 -1
- package/dist/esm/memory/causal/writeSnapshot.js +9 -5
- package/dist/esm/memory/causal/writeSnapshot.js.map +1 -1
- package/dist/esm/memory/define.types.js +2 -2
- package/dist/esm/memory/wire/mountMemoryPipeline.js +10 -1
- package/dist/esm/memory/wire/mountMemoryPipeline.js.map +1 -1
- package/dist/memory/causal/evidenceRecorder.js +217 -0
- package/dist/memory/causal/evidenceRecorder.js.map +1 -0
- package/dist/memory/causal/index.js +3 -1
- package/dist/memory/causal/index.js.map +1 -1
- package/dist/memory/causal/loadSnapshot.js +18 -4
- package/dist/memory/causal/loadSnapshot.js.map +1 -1
- package/dist/memory/causal/writeSnapshot.js +9 -5
- package/dist/memory/causal/writeSnapshot.js.map +1 -1
- package/dist/memory/define.types.js +2 -2
- package/dist/memory/wire/mountMemoryPipeline.js +10 -1
- package/dist/memory/wire/mountMemoryPipeline.js.map +1 -1
- package/dist/types/core/Agent.d.ts +2 -0
- package/dist/types/core/Agent.d.ts.map +1 -1
- package/dist/types/core/agent/buildAgentChart.d.ts +5 -0
- package/dist/types/core/agent/buildAgentChart.d.ts.map +1 -1
- package/dist/types/core/agent/buildDynamicAgentChart.d.ts.map +1 -1
- package/dist/types/memory/causal/evidenceRecorder.d.ts +67 -0
- package/dist/types/memory/causal/evidenceRecorder.d.ts.map +1 -0
- package/dist/types/memory/causal/index.d.ts +1 -0
- package/dist/types/memory/causal/index.d.ts.map +1 -1
- package/dist/types/memory/causal/writeSnapshot.d.ts.map +1 -1
- package/dist/types/memory/define.types.d.ts +2 -2
- package/dist/types/memory/stages/types.d.ts +7 -0
- package/dist/types/memory/stages/types.d.ts.map +1 -1
- package/dist/types/memory/wire/mountMemoryPipeline.d.ts +9 -0
- package/dist/types/memory/wire/mountMemoryPipeline.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* causalEvidenceRecorder — the evidence bridge (backlog Phase-1 #5).
|
|
3
|
+
*
|
|
4
|
+
* Harvests, DURING the run, everything a causal snapshot needs beyond
|
|
5
|
+
* (query, finalContent) — from events the engine already fires:
|
|
6
|
+
*
|
|
7
|
+
* stream.tool_start/tool_end → ToolCallRecord (name, args, resultPreview, errored)
|
|
8
|
+
* stream.llm_end → tokenUsage accumulation + iteration high-water
|
|
9
|
+
* agent.turn_start/turn_end → durationMs (+ authoritative totals when seen)
|
|
10
|
+
* FlowRecorder.onDecision → DecisionRecord with footprintjs decide()/select()
|
|
11
|
+
* operator-level evidence (rule, conditions, chosen)
|
|
12
|
+
* context.evaluated routing → DecisionRecord per skill the graph routed to
|
|
13
|
+
*
|
|
14
|
+
* Pattern: CombinedRecorder (Convention 1 — single purpose: evidence
|
|
15
|
+
* accumulation); per-turn reset anchored on `agent.turn_start`
|
|
16
|
+
* (Convention 4 — executor `clear()` resets between runs; same-
|
|
17
|
+
* executor pause/resume PRESERVES pre-pause evidence by design).
|
|
18
|
+
* PII note: tool args/results and decide() evidence persist into snapshots.
|
|
19
|
+
* footprintjs `RedactionPolicy.emitPatterns` redacts the emit channel
|
|
20
|
+
* BEFORE this recorder IF the consumer configures one on the executor
|
|
21
|
+
* — the Agent does NOT configure one by default. Values are bounded
|
|
22
|
+
* (`maxPreviewChars` for results, `maxFieldChars` for args/evidence);
|
|
23
|
+
* treat the snapshot store as PII-bearing and protect it accordingly.
|
|
24
|
+
*
|
|
25
|
+
* The Agent attaches this automatically when a CAUSAL memory is mounted and
|
|
26
|
+
* threads `collect` into the memory write mount (`evidenceSource`) — so
|
|
27
|
+
* `writeSnapshot` persists real evidence instead of zeros.
|
|
28
|
+
*/
|
|
29
|
+
function preview(value, max) {
|
|
30
|
+
let s;
|
|
31
|
+
if (typeof value === 'string')
|
|
32
|
+
s = value;
|
|
33
|
+
else {
|
|
34
|
+
try {
|
|
35
|
+
s = JSON.stringify(value);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
s = String(value);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return s.length > max ? `${s.slice(0, max)}…` : s;
|
|
42
|
+
}
|
|
43
|
+
/** Bound a record-ish value: oversized serializations become a truncated
|
|
44
|
+
* preview marker so snapshots can't grow unbounded (and PII exposure is
|
|
45
|
+
* capped). Small values pass through untouched. */
|
|
46
|
+
function bounded(value, max) {
|
|
47
|
+
if (value === undefined)
|
|
48
|
+
return undefined;
|
|
49
|
+
try {
|
|
50
|
+
const s = JSON.stringify(value);
|
|
51
|
+
if (s.length <= max)
|
|
52
|
+
return value;
|
|
53
|
+
return { __truncated: `${s.slice(0, max)}…` };
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return { __truncated: String(value).slice(0, max) };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/** Build the evidence-harvesting recorder. Attach via `.recorder(rec)` (the
|
|
60
|
+
* Agent does this automatically for CAUSAL memories). */
|
|
61
|
+
export function causalEvidenceRecorder(options = {}) {
|
|
62
|
+
const maxPreview = options.maxPreviewChars ?? 200;
|
|
63
|
+
const maxField = options.maxFieldChars ?? 2000;
|
|
64
|
+
// ── per-turn accumulators (reset on agent.turn_start; executor clear()
|
|
65
|
+
// resets between runs; pause/resume keeps pre-pause evidence) ──
|
|
66
|
+
let decisions = [];
|
|
67
|
+
let toolCalls = [];
|
|
68
|
+
let pendingTools = new Map();
|
|
69
|
+
let tokens = { input: 0, output: 0 };
|
|
70
|
+
let iterations = 0;
|
|
71
|
+
let turnStartMs;
|
|
72
|
+
let authoritative;
|
|
73
|
+
const reset = () => {
|
|
74
|
+
decisions = [];
|
|
75
|
+
toolCalls = [];
|
|
76
|
+
pendingTools = new Map();
|
|
77
|
+
tokens = { input: 0, output: 0 };
|
|
78
|
+
iterations = 0;
|
|
79
|
+
turnStartMs = undefined;
|
|
80
|
+
authoritative = undefined;
|
|
81
|
+
};
|
|
82
|
+
return {
|
|
83
|
+
id: options.id ?? 'causal-evidence',
|
|
84
|
+
onEmit(event) {
|
|
85
|
+
const { name, payload } = event;
|
|
86
|
+
switch (name) {
|
|
87
|
+
case 'agentfootprint.agent.turn_start':
|
|
88
|
+
// A new turn on the same executor — start fresh (one snapshot per turn).
|
|
89
|
+
reset();
|
|
90
|
+
turnStartMs = Date.now();
|
|
91
|
+
break;
|
|
92
|
+
case 'agentfootprint.stream.tool_start': {
|
|
93
|
+
const id = String(payload.toolCallId ?? '');
|
|
94
|
+
pendingTools.set(id, {
|
|
95
|
+
name: String(payload.toolName ?? 'unknown'),
|
|
96
|
+
args: bounded((payload.args ?? {}), maxField) ?? {},
|
|
97
|
+
});
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
case 'agentfootprint.stream.tool_end': {
|
|
101
|
+
const id = String(payload.toolCallId ?? '');
|
|
102
|
+
const started = pendingTools.get(id);
|
|
103
|
+
pendingTools.delete(id);
|
|
104
|
+
toolCalls.push({
|
|
105
|
+
name: started?.name ?? 'unknown',
|
|
106
|
+
args: started?.args ?? {},
|
|
107
|
+
resultPreview: preview(payload.result, maxPreview),
|
|
108
|
+
errored: payload.error === true,
|
|
109
|
+
});
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
case 'agentfootprint.stream.llm_end': {
|
|
113
|
+
const usage = payload.usage;
|
|
114
|
+
tokens = {
|
|
115
|
+
input: tokens.input + (usage?.input ?? 0),
|
|
116
|
+
output: tokens.output + (usage?.output ?? 0),
|
|
117
|
+
};
|
|
118
|
+
const iter = Number(payload.iteration ?? 0);
|
|
119
|
+
if (iter > iterations)
|
|
120
|
+
iterations = iter;
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
case 'agentfootprint.context.evaluated': {
|
|
124
|
+
// Skill-graph routing provenance → one DecisionRecord per routed skill.
|
|
125
|
+
const routing = payload.routing;
|
|
126
|
+
if (Array.isArray(routing)) {
|
|
127
|
+
for (const r of routing) {
|
|
128
|
+
decisions.push({
|
|
129
|
+
stageId: 'skill-graph',
|
|
130
|
+
chosen: String(r.injectionId ?? r.id ?? 'unknown'),
|
|
131
|
+
...(r.label !== undefined || r.via !== undefined
|
|
132
|
+
? { rule: r.label ?? `via ${r.via}` }
|
|
133
|
+
: {}),
|
|
134
|
+
...(r.path !== undefined && {
|
|
135
|
+
evidence: { path: r.path },
|
|
136
|
+
}),
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
case 'agentfootprint.agent.turn_end': {
|
|
143
|
+
// Authoritative totals when the write runs after turn_end.
|
|
144
|
+
authoritative = {
|
|
145
|
+
iterations: Number(payload.iterationCount ?? iterations),
|
|
146
|
+
input: Number(payload.totalInputTokens ?? tokens.input),
|
|
147
|
+
output: Number(payload.totalOutputTokens ?? tokens.output),
|
|
148
|
+
durationMs: Number(payload.durationMs ?? 0),
|
|
149
|
+
};
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
default:
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
/** footprintjs FlowRecorder channel — decide() decision evidence.
|
|
157
|
+
* FlowDecisionEvent carries `decider` (display name), `chosen`, optional
|
|
158
|
+
* `evidence` from decide(), and `traversalContext.stageId` (the stable,
|
|
159
|
+
* subflow-prefixed stage id — preferred for DecisionRecord.stageId). */
|
|
160
|
+
onDecision(event) {
|
|
161
|
+
const stageId = event.traversalContext?.stageId ?? event.decider;
|
|
162
|
+
// Internal agent plumbing (the cache-gate decider) is not domain
|
|
163
|
+
// decision evidence. `includes` (not startsWith): in reactMode
|
|
164
|
+
// 'dynamic-grouped' the names are double-prefixed
|
|
165
|
+
// ('sf-llm-call/sf-cache/…').
|
|
166
|
+
if (String(event.chosen ?? '').includes('sf-cache/') || String(stageId).includes('sf-cache'))
|
|
167
|
+
return;
|
|
168
|
+
const evidence = event.evidence;
|
|
169
|
+
decisions.push({
|
|
170
|
+
stageId: String(stageId),
|
|
171
|
+
chosen: String(event.chosen ?? 'unknown'),
|
|
172
|
+
...(evidence?.label !== undefined || evidence?.rule !== undefined
|
|
173
|
+
? { rule: String(evidence.label ?? evidence.rule) }
|
|
174
|
+
: {}),
|
|
175
|
+
...(evidence !== undefined && {
|
|
176
|
+
evidence: bounded(evidence, maxField),
|
|
177
|
+
}),
|
|
178
|
+
});
|
|
179
|
+
},
|
|
180
|
+
/** footprintjs FlowRecorder channel — select() selection evidence. */
|
|
181
|
+
onSelected(event) {
|
|
182
|
+
const stageId = event.traversalContext?.stageId ?? event.parent;
|
|
183
|
+
if (String(stageId).includes('sf-cache'))
|
|
184
|
+
return;
|
|
185
|
+
// The agent's own Context slot-fork is a selector — plumbing, not domain.
|
|
186
|
+
if (String(stageId).includes('context') && event.selected.every((s) => s.startsWith('sf-')))
|
|
187
|
+
return;
|
|
188
|
+
decisions.push({
|
|
189
|
+
stageId: String(stageId),
|
|
190
|
+
chosen: event.selected.join(', '),
|
|
191
|
+
...(event.evidence !== undefined && {
|
|
192
|
+
evidence: bounded(event.evidence, maxField),
|
|
193
|
+
}),
|
|
194
|
+
});
|
|
195
|
+
},
|
|
196
|
+
collect() {
|
|
197
|
+
return {
|
|
198
|
+
iterations: authoritative?.iterations ?? iterations,
|
|
199
|
+
decisions: [...decisions],
|
|
200
|
+
toolCalls: [...toolCalls],
|
|
201
|
+
durationMs: authoritative?.durationMs ?? (turnStartMs !== undefined ? Date.now() - turnStartMs : 0),
|
|
202
|
+
tokenUsage: {
|
|
203
|
+
input: authoritative?.input ?? tokens.input,
|
|
204
|
+
output: authoritative?.output ?? tokens.output,
|
|
205
|
+
},
|
|
206
|
+
};
|
|
207
|
+
},
|
|
208
|
+
clear() {
|
|
209
|
+
reset();
|
|
210
|
+
},
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=evidenceRecorder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidenceRecorder.js","sourceRoot":"","sources":["../../../../src/memory/causal/evidenceRecorder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { DEFAULT_TOOL_RESULT_PREVIEW_LEN } from './types.js';
|
|
2
|
+
export { causalEvidenceRecorder, } from './evidenceRecorder.js';
|
|
2
3
|
export { writeSnapshot } from './writeSnapshot.js';
|
|
3
4
|
export { loadSnapshot } from './loadSnapshot.js';
|
|
4
5
|
export { snapshotPipeline } from './snapshotPipeline.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/memory/causal/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,+BAA+B,EAAE,MAAM,YAAY,CAAC;AAE7D,OAAO,EAAE,aAAa,EAA4B,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,YAAY,EAA2B,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAA+B,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/memory/causal/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,+BAA+B,EAAE,MAAM,YAAY,CAAC;AAE7D,OAAO,EACL,sBAAsB,GAIvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAA4B,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,YAAY,EAA2B,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAA+B,MAAM,uBAAuB,CAAC"}
|
|
@@ -78,15 +78,29 @@ function formatProjection(entry, projection, score) {
|
|
|
78
78
|
const header = `[Past run · query: "${truncate(snap.query, 80)}" · score: ${score.toFixed(2)}]`;
|
|
79
79
|
let body;
|
|
80
80
|
switch (projection) {
|
|
81
|
-
case SNAPSHOT_PROJECTIONS.DECISIONS:
|
|
81
|
+
case SNAPSHOT_PROJECTIONS.DECISIONS: {
|
|
82
|
+
// Tool evidence is part of the "why": in LLM-decided flows the
|
|
83
|
+
// operator-level facts (creditScore=580, dti=0.45) arrive as tool
|
|
84
|
+
// results, so the decisions projection includes them.
|
|
85
|
+
// SECURITY: this replays STORED TOOL OUTPUT into a future prompt — a
|
|
86
|
+
// persisted prompt-injection surface if tools ingest untrusted content.
|
|
87
|
+
// Treat snapshot stores as prompt-trusted; sanitize tool output at the
|
|
88
|
+
// tool boundary when it carries third-party text.
|
|
89
|
+
const toolLines = snap.toolCalls.length === 0
|
|
90
|
+
? ''
|
|
91
|
+
: `\nTool evidence:\n${snap.toolCalls
|
|
92
|
+
.map((t) => `- ${t.name}(${JSON.stringify(t.args)}) → ${t.resultPreview}` +
|
|
93
|
+
(t.errored ? ' [ERROR]' : ''))
|
|
94
|
+
.join('\n')}`;
|
|
82
95
|
body =
|
|
83
|
-
snap.decisions.length === 0
|
|
96
|
+
snap.decisions.length === 0 && snap.toolCalls.length === 0
|
|
84
97
|
? `(no decision evidence captured)\nFinal answer: ${snap.finalContent}`
|
|
85
|
-
: snap.decisions
|
|
98
|
+
: `${snap.decisions
|
|
86
99
|
.map((d) => `- ${d.stageId} → "${d.chosen}"${d.rule ? ` (rule: ${d.rule})` : ''}` +
|
|
87
100
|
(d.evidence ? `; evidence: ${JSON.stringify(d.evidence)}` : ''))
|
|
88
|
-
.join('\n')
|
|
101
|
+
.join('\n')}${toolLines}\nFinal answer: ${snap.finalContent}`;
|
|
89
102
|
break;
|
|
103
|
+
}
|
|
90
104
|
case SNAPSHOT_PROJECTIONS.NARRATIVE:
|
|
91
105
|
body = snap.narrative ?? `(no narrative captured)\nFinal answer: ${snap.finalContent}`;
|
|
92
106
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadSnapshot.js","sourceRoot":"","sources":["../../../../src/memory/causal/loadSnapshot.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"loadSnapshot.js","sourceRoot":"","sources":["../../../../src/memory/causal/loadSnapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -46,14 +46,18 @@ export function writeSnapshot(config) {
|
|
|
46
46
|
}));
|
|
47
47
|
const now = Date.now();
|
|
48
48
|
const ttl = config.ttlMs ? now + config.ttlMs : undefined;
|
|
49
|
+
// Evidence bridge (#5): the wire layer delivers run evidence harvested by
|
|
50
|
+
// `causalEvidenceRecorder` via the write mount's `evidenceSource`. Absent
|
|
51
|
+
// (non-agent hosts, no recorder attached) → zeros, as before.
|
|
52
|
+
const evidence = scope.runEvidence;
|
|
49
53
|
const snapshot = {
|
|
50
54
|
query,
|
|
51
55
|
finalContent,
|
|
52
|
-
iterations: 0,
|
|
53
|
-
decisions: [],
|
|
54
|
-
toolCalls: [],
|
|
55
|
-
durationMs: 0,
|
|
56
|
-
tokenUsage: { input: 0, output: 0 },
|
|
56
|
+
iterations: evidence?.iterations ?? 0,
|
|
57
|
+
decisions: evidence?.decisions ?? [],
|
|
58
|
+
toolCalls: evidence?.toolCalls ?? [],
|
|
59
|
+
durationMs: evidence?.durationMs ?? 0,
|
|
60
|
+
tokenUsage: evidence?.tokenUsage ?? { input: 0, output: 0 },
|
|
57
61
|
};
|
|
58
62
|
const entry = {
|
|
59
63
|
id: `snap-${turn}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writeSnapshot.js","sourceRoot":"","sources":["../../../../src/memory/causal/writeSnapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AA0CH,MAAM,UAAU,aAAa,CAAC,MAA2B;IACvD,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IACnC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,kBAAkB,CAAC;IAE3D,OAAO,KAAK,EAAE,KAA8B,EAAiB,EAAE;QAC7D,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC;QAC9B,MAAM,WAAW,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAA0B,CAAC;QACvE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAErC,4DAA4D;QAC5D,gEAAgE;QAChE,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QAC3D,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QACrE,MAAM,KAAK,GAAI,OAAO,EAAE,OAA8B,IAAI,EAAE,CAAC;QAC7D,MAAM,YAAY,GAAI,YAAY,EAAE,OAA8B,IAAI,EAAE,CAAC;QAEzE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,iCAAiC;QAEjE,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC;QACzC,MAAM,QAAQ,GAAG,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC;YACrC,IAAI,EAAE,KAAK;YACX,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9B,CAAC,CAAa,CAAC;QAEhB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAE1D,MAAM,QAAQ,GAAkB;YAC9B,KAAK;YACL,YAAY;YACZ,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"writeSnapshot.js","sourceRoot":"","sources":["../../../../src/memory/causal/writeSnapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -44,8 +44,8 @@
|
|
|
44
44
|
* - `SEMANTIC` — extracted structured facts, deduped on key
|
|
45
45
|
* - `NARRATIVE` — beats / summaries of prior runs (append-only)
|
|
46
46
|
* - `CAUSAL` — footprintjs execution snapshots, the differentiator
|
|
47
|
-
* (replays stored
|
|
48
|
-
*
|
|
47
|
+
* (replays stored decisions + tool evidence for "why?"
|
|
48
|
+
* follow-ups — harvested automatically per run)
|
|
49
49
|
*/
|
|
50
50
|
export const MEMORY_TYPES = {
|
|
51
51
|
EPISODIC: 'episodic',
|
|
@@ -40,7 +40,11 @@ export function mountMemoryRead(builder, config) {
|
|
|
40
40
|
// like `loadRelevant` derive the query from the last user
|
|
41
41
|
// message here. The write-side `newMessages` field is empty
|
|
42
42
|
// during read; these are two different concerns.
|
|
43
|
-
|
|
43
|
+
// Agents carry the conversation as `history`; bare hosts may use
|
|
44
|
+
// `messages`. Without this fallback, read stages that derive the query
|
|
45
|
+
// from the last user message (loadSnapshot/loadRelevant) saw [] inside
|
|
46
|
+
// an Agent and silently injected nothing — the causal READ never fired.
|
|
47
|
+
messages: parentState.messages ?? parentState.history ?? [],
|
|
44
48
|
newMessages: [], // write side unused in read subflow
|
|
45
49
|
}),
|
|
46
50
|
outputMapper: (subflowState) => ({
|
|
@@ -66,6 +70,11 @@ export function mountMemoryWrite(builder, config) {
|
|
|
66
70
|
turnNumber: parentState[turnNumberKey],
|
|
67
71
|
contextTokensRemaining: parentState[contextTokensKey] ?? 0,
|
|
68
72
|
newMessages: parentState[newMessagesKey] ?? [],
|
|
73
|
+
// Evidence bridge (#5): harvested run evidence for causal writeSnapshot.
|
|
74
|
+
// Closure-delivered (no PARENT-scope write) — note it DOES land in the
|
|
75
|
+
// write subflow's own tracked scope/commit log, like newMessages; the
|
|
76
|
+
// values are already observable as events, so no new exposure class.
|
|
77
|
+
...(config.evidenceSource && { runEvidence: config.evidenceSource() }),
|
|
69
78
|
}),
|
|
70
79
|
// No outputMapper — write has no parent-visible output.
|
|
71
80
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mountMemoryPipeline.js","sourceRoot":"","sources":["../../../../src/memory/wire/mountMemoryPipeline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mountMemoryPipeline.js","sourceRoot":"","sources":["../../../../src/memory/wire/mountMemoryPipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* causalEvidenceRecorder — the evidence bridge (backlog Phase-1 #5).
|
|
4
|
+
*
|
|
5
|
+
* Harvests, DURING the run, everything a causal snapshot needs beyond
|
|
6
|
+
* (query, finalContent) — from events the engine already fires:
|
|
7
|
+
*
|
|
8
|
+
* stream.tool_start/tool_end → ToolCallRecord (name, args, resultPreview, errored)
|
|
9
|
+
* stream.llm_end → tokenUsage accumulation + iteration high-water
|
|
10
|
+
* agent.turn_start/turn_end → durationMs (+ authoritative totals when seen)
|
|
11
|
+
* FlowRecorder.onDecision → DecisionRecord with footprintjs decide()/select()
|
|
12
|
+
* operator-level evidence (rule, conditions, chosen)
|
|
13
|
+
* context.evaluated routing → DecisionRecord per skill the graph routed to
|
|
14
|
+
*
|
|
15
|
+
* Pattern: CombinedRecorder (Convention 1 — single purpose: evidence
|
|
16
|
+
* accumulation); per-turn reset anchored on `agent.turn_start`
|
|
17
|
+
* (Convention 4 — executor `clear()` resets between runs; same-
|
|
18
|
+
* executor pause/resume PRESERVES pre-pause evidence by design).
|
|
19
|
+
* PII note: tool args/results and decide() evidence persist into snapshots.
|
|
20
|
+
* footprintjs `RedactionPolicy.emitPatterns` redacts the emit channel
|
|
21
|
+
* BEFORE this recorder IF the consumer configures one on the executor
|
|
22
|
+
* — the Agent does NOT configure one by default. Values are bounded
|
|
23
|
+
* (`maxPreviewChars` for results, `maxFieldChars` for args/evidence);
|
|
24
|
+
* treat the snapshot store as PII-bearing and protect it accordingly.
|
|
25
|
+
*
|
|
26
|
+
* The Agent attaches this automatically when a CAUSAL memory is mounted and
|
|
27
|
+
* threads `collect` into the memory write mount (`evidenceSource`) — so
|
|
28
|
+
* `writeSnapshot` persists real evidence instead of zeros.
|
|
29
|
+
*/
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.causalEvidenceRecorder = void 0;
|
|
32
|
+
function preview(value, max) {
|
|
33
|
+
let s;
|
|
34
|
+
if (typeof value === 'string')
|
|
35
|
+
s = value;
|
|
36
|
+
else {
|
|
37
|
+
try {
|
|
38
|
+
s = JSON.stringify(value);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
s = String(value);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return s.length > max ? `${s.slice(0, max)}…` : s;
|
|
45
|
+
}
|
|
46
|
+
/** Bound a record-ish value: oversized serializations become a truncated
|
|
47
|
+
* preview marker so snapshots can't grow unbounded (and PII exposure is
|
|
48
|
+
* capped). Small values pass through untouched. */
|
|
49
|
+
function bounded(value, max) {
|
|
50
|
+
if (value === undefined)
|
|
51
|
+
return undefined;
|
|
52
|
+
try {
|
|
53
|
+
const s = JSON.stringify(value);
|
|
54
|
+
if (s.length <= max)
|
|
55
|
+
return value;
|
|
56
|
+
return { __truncated: `${s.slice(0, max)}…` };
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return { __truncated: String(value).slice(0, max) };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** Build the evidence-harvesting recorder. Attach via `.recorder(rec)` (the
|
|
63
|
+
* Agent does this automatically for CAUSAL memories). */
|
|
64
|
+
function causalEvidenceRecorder(options = {}) {
|
|
65
|
+
const maxPreview = options.maxPreviewChars ?? 200;
|
|
66
|
+
const maxField = options.maxFieldChars ?? 2000;
|
|
67
|
+
// ── per-turn accumulators (reset on agent.turn_start; executor clear()
|
|
68
|
+
// resets between runs; pause/resume keeps pre-pause evidence) ──
|
|
69
|
+
let decisions = [];
|
|
70
|
+
let toolCalls = [];
|
|
71
|
+
let pendingTools = new Map();
|
|
72
|
+
let tokens = { input: 0, output: 0 };
|
|
73
|
+
let iterations = 0;
|
|
74
|
+
let turnStartMs;
|
|
75
|
+
let authoritative;
|
|
76
|
+
const reset = () => {
|
|
77
|
+
decisions = [];
|
|
78
|
+
toolCalls = [];
|
|
79
|
+
pendingTools = new Map();
|
|
80
|
+
tokens = { input: 0, output: 0 };
|
|
81
|
+
iterations = 0;
|
|
82
|
+
turnStartMs = undefined;
|
|
83
|
+
authoritative = undefined;
|
|
84
|
+
};
|
|
85
|
+
return {
|
|
86
|
+
id: options.id ?? 'causal-evidence',
|
|
87
|
+
onEmit(event) {
|
|
88
|
+
const { name, payload } = event;
|
|
89
|
+
switch (name) {
|
|
90
|
+
case 'agentfootprint.agent.turn_start':
|
|
91
|
+
// A new turn on the same executor — start fresh (one snapshot per turn).
|
|
92
|
+
reset();
|
|
93
|
+
turnStartMs = Date.now();
|
|
94
|
+
break;
|
|
95
|
+
case 'agentfootprint.stream.tool_start': {
|
|
96
|
+
const id = String(payload.toolCallId ?? '');
|
|
97
|
+
pendingTools.set(id, {
|
|
98
|
+
name: String(payload.toolName ?? 'unknown'),
|
|
99
|
+
args: bounded((payload.args ?? {}), maxField) ?? {},
|
|
100
|
+
});
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
case 'agentfootprint.stream.tool_end': {
|
|
104
|
+
const id = String(payload.toolCallId ?? '');
|
|
105
|
+
const started = pendingTools.get(id);
|
|
106
|
+
pendingTools.delete(id);
|
|
107
|
+
toolCalls.push({
|
|
108
|
+
name: started?.name ?? 'unknown',
|
|
109
|
+
args: started?.args ?? {},
|
|
110
|
+
resultPreview: preview(payload.result, maxPreview),
|
|
111
|
+
errored: payload.error === true,
|
|
112
|
+
});
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
case 'agentfootprint.stream.llm_end': {
|
|
116
|
+
const usage = payload.usage;
|
|
117
|
+
tokens = {
|
|
118
|
+
input: tokens.input + (usage?.input ?? 0),
|
|
119
|
+
output: tokens.output + (usage?.output ?? 0),
|
|
120
|
+
};
|
|
121
|
+
const iter = Number(payload.iteration ?? 0);
|
|
122
|
+
if (iter > iterations)
|
|
123
|
+
iterations = iter;
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
case 'agentfootprint.context.evaluated': {
|
|
127
|
+
// Skill-graph routing provenance → one DecisionRecord per routed skill.
|
|
128
|
+
const routing = payload.routing;
|
|
129
|
+
if (Array.isArray(routing)) {
|
|
130
|
+
for (const r of routing) {
|
|
131
|
+
decisions.push({
|
|
132
|
+
stageId: 'skill-graph',
|
|
133
|
+
chosen: String(r.injectionId ?? r.id ?? 'unknown'),
|
|
134
|
+
...(r.label !== undefined || r.via !== undefined
|
|
135
|
+
? { rule: r.label ?? `via ${r.via}` }
|
|
136
|
+
: {}),
|
|
137
|
+
...(r.path !== undefined && {
|
|
138
|
+
evidence: { path: r.path },
|
|
139
|
+
}),
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
case 'agentfootprint.agent.turn_end': {
|
|
146
|
+
// Authoritative totals when the write runs after turn_end.
|
|
147
|
+
authoritative = {
|
|
148
|
+
iterations: Number(payload.iterationCount ?? iterations),
|
|
149
|
+
input: Number(payload.totalInputTokens ?? tokens.input),
|
|
150
|
+
output: Number(payload.totalOutputTokens ?? tokens.output),
|
|
151
|
+
durationMs: Number(payload.durationMs ?? 0),
|
|
152
|
+
};
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
default:
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
/** footprintjs FlowRecorder channel — decide() decision evidence.
|
|
160
|
+
* FlowDecisionEvent carries `decider` (display name), `chosen`, optional
|
|
161
|
+
* `evidence` from decide(), and `traversalContext.stageId` (the stable,
|
|
162
|
+
* subflow-prefixed stage id — preferred for DecisionRecord.stageId). */
|
|
163
|
+
onDecision(event) {
|
|
164
|
+
const stageId = event.traversalContext?.stageId ?? event.decider;
|
|
165
|
+
// Internal agent plumbing (the cache-gate decider) is not domain
|
|
166
|
+
// decision evidence. `includes` (not startsWith): in reactMode
|
|
167
|
+
// 'dynamic-grouped' the names are double-prefixed
|
|
168
|
+
// ('sf-llm-call/sf-cache/…').
|
|
169
|
+
if (String(event.chosen ?? '').includes('sf-cache/') || String(stageId).includes('sf-cache'))
|
|
170
|
+
return;
|
|
171
|
+
const evidence = event.evidence;
|
|
172
|
+
decisions.push({
|
|
173
|
+
stageId: String(stageId),
|
|
174
|
+
chosen: String(event.chosen ?? 'unknown'),
|
|
175
|
+
...(evidence?.label !== undefined || evidence?.rule !== undefined
|
|
176
|
+
? { rule: String(evidence.label ?? evidence.rule) }
|
|
177
|
+
: {}),
|
|
178
|
+
...(evidence !== undefined && {
|
|
179
|
+
evidence: bounded(evidence, maxField),
|
|
180
|
+
}),
|
|
181
|
+
});
|
|
182
|
+
},
|
|
183
|
+
/** footprintjs FlowRecorder channel — select() selection evidence. */
|
|
184
|
+
onSelected(event) {
|
|
185
|
+
const stageId = event.traversalContext?.stageId ?? event.parent;
|
|
186
|
+
if (String(stageId).includes('sf-cache'))
|
|
187
|
+
return;
|
|
188
|
+
// The agent's own Context slot-fork is a selector — plumbing, not domain.
|
|
189
|
+
if (String(stageId).includes('context') && event.selected.every((s) => s.startsWith('sf-')))
|
|
190
|
+
return;
|
|
191
|
+
decisions.push({
|
|
192
|
+
stageId: String(stageId),
|
|
193
|
+
chosen: event.selected.join(', '),
|
|
194
|
+
...(event.evidence !== undefined && {
|
|
195
|
+
evidence: bounded(event.evidence, maxField),
|
|
196
|
+
}),
|
|
197
|
+
});
|
|
198
|
+
},
|
|
199
|
+
collect() {
|
|
200
|
+
return {
|
|
201
|
+
iterations: authoritative?.iterations ?? iterations,
|
|
202
|
+
decisions: [...decisions],
|
|
203
|
+
toolCalls: [...toolCalls],
|
|
204
|
+
durationMs: authoritative?.durationMs ?? (turnStartMs !== undefined ? Date.now() - turnStartMs : 0),
|
|
205
|
+
tokenUsage: {
|
|
206
|
+
input: authoritative?.input ?? tokens.input,
|
|
207
|
+
output: authoritative?.output ?? tokens.output,
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
},
|
|
211
|
+
clear() {
|
|
212
|
+
reset();
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
exports.causalEvidenceRecorder = causalEvidenceRecorder;
|
|
217
|
+
//# sourceMappingURL=evidenceRecorder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidenceRecorder.js","sourceRoot":"","sources":["../../../src/memory/causal/evidenceRecorder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.snapshotPipeline = exports.loadSnapshot = exports.writeSnapshot = exports.DEFAULT_TOOL_RESULT_PREVIEW_LEN = void 0;
|
|
3
|
+
exports.snapshotPipeline = exports.loadSnapshot = exports.writeSnapshot = exports.causalEvidenceRecorder = exports.DEFAULT_TOOL_RESULT_PREVIEW_LEN = void 0;
|
|
4
4
|
var types_js_1 = require("./types.js");
|
|
5
5
|
Object.defineProperty(exports, "DEFAULT_TOOL_RESULT_PREVIEW_LEN", { enumerable: true, get: function () { return types_js_1.DEFAULT_TOOL_RESULT_PREVIEW_LEN; } });
|
|
6
|
+
var evidenceRecorder_js_1 = require("./evidenceRecorder.js");
|
|
7
|
+
Object.defineProperty(exports, "causalEvidenceRecorder", { enumerable: true, get: function () { return evidenceRecorder_js_1.causalEvidenceRecorder; } });
|
|
6
8
|
var writeSnapshot_js_1 = require("./writeSnapshot.js");
|
|
7
9
|
Object.defineProperty(exports, "writeSnapshot", { enumerable: true, get: function () { return writeSnapshot_js_1.writeSnapshot; } });
|
|
8
10
|
var loadSnapshot_js_1 = require("./loadSnapshot.js");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/memory/causal/index.ts"],"names":[],"mappings":";;;AAOA,uCAA6D;AAApD,2HAAA,+BAA+B,OAAA;AAExC,uDAA6E;AAApE,iHAAA,aAAa,OAAA;AACtB,qDAA0E;AAAjE,+GAAA,YAAY,OAAA;AACrB,6DAAsF;AAA7E,uHAAA,gBAAgB,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/memory/causal/index.ts"],"names":[],"mappings":";;;AAOA,uCAA6D;AAApD,2HAAA,+BAA+B,OAAA;AAExC,6DAK+B;AAJ7B,6HAAA,sBAAsB,OAAA;AAKxB,uDAA6E;AAApE,iHAAA,aAAa,OAAA;AACtB,qDAA0E;AAAjE,+GAAA,YAAY,OAAA;AACrB,6DAAsF;AAA7E,uHAAA,gBAAgB,OAAA"}
|