agentfootprint 9.33.0 → 9.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1 -1
- package/CLAUDE.md +3 -1
- package/ai-instructions/claude-code/SKILL.md +1 -1
- package/dist/adapters/hosting/firestoreSessions.js +5 -1
- package/dist/adapters/hosting/firestoreSessions.js.map +1 -1
- package/dist/conventions.js +14 -0
- package/dist/conventions.js.map +1 -1
- package/dist/core/Agent.js +89 -5
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/agent/AgentBuilder.js +76 -1
- package/dist/core/agent/AgentBuilder.js.map +1 -1
- package/dist/core/agent/buildAgentChart.js +8 -0
- package/dist/core/agent/buildAgentChart.js.map +1 -1
- package/dist/core/agent/buildDynamicAgentChart.js +16 -0
- package/dist/core/agent/buildDynamicAgentChart.js.map +1 -1
- package/dist/core/agent/buildToolRegistry.js +1 -1
- package/dist/core/agent/buildToolRegistry.js.map +1 -1
- package/dist/core/agent/evidence/errors.js +55 -0
- package/dist/core/agent/evidence/errors.js.map +1 -0
- package/dist/core/agent/evidence/evidenceIndex.js +167 -0
- package/dist/core/agent/evidence/evidenceIndex.js.map +1 -0
- package/dist/core/agent/evidence/extract.js +145 -0
- package/dist/core/agent/evidence/extract.js.map +1 -0
- package/dist/core/agent/evidence/frames.js +44 -0
- package/dist/core/agent/evidence/frames.js.map +1 -0
- package/dist/core/agent/evidence/gate.js +206 -0
- package/dist/core/agent/evidence/gate.js.map +1 -0
- package/dist/core/agent/evidence/index.js +15 -0
- package/dist/core/agent/evidence/index.js.map +1 -0
- package/dist/core/agent/evidence/normalize.js +141 -0
- package/dist/core/agent/evidence/normalize.js.map +1 -0
- package/dist/core/agent/evidence/types.js +11 -0
- package/dist/core/agent/evidence/types.js.map +1 -0
- package/dist/core/agent/stages/evidenceRecheck.js +86 -0
- package/dist/core/agent/stages/evidenceRecheck.js.map +1 -0
- package/dist/core/agent/stages/route.js +152 -16
- package/dist/core/agent/stages/route.js.map +1 -1
- package/dist/core/agent/stages/seed.js +7 -0
- package/dist/core/agent/stages/seed.js.map +1 -1
- package/dist/core/agent/toolEffects.js +4 -10
- package/dist/core/agent/toolEffects.js.map +1 -1
- package/dist/core/slots/buildToolsSlot.js +2 -1
- package/dist/core/slots/buildToolsSlot.js.map +1 -1
- package/dist/doors/skill-graph.js +109 -0
- package/dist/doors/skill-graph.js.map +1 -0
- package/dist/esm/adapters/hosting/firestoreSessions.d.ts +5 -1
- package/dist/esm/adapters/hosting/firestoreSessions.js +5 -1
- package/dist/esm/adapters/hosting/firestoreSessions.js.map +1 -1
- package/dist/esm/conventions.d.ts +7 -0
- package/dist/esm/conventions.js +14 -0
- package/dist/esm/conventions.js.map +1 -1
- package/dist/esm/core/Agent.d.ts +34 -1
- package/dist/esm/core/Agent.js +87 -3
- package/dist/esm/core/Agent.js.map +1 -1
- package/dist/esm/core/agent/AgentBuilder.d.ts +66 -0
- package/dist/esm/core/agent/AgentBuilder.js +76 -1
- package/dist/esm/core/agent/AgentBuilder.js.map +1 -1
- package/dist/esm/core/agent/buildAgentChart.d.ts +21 -0
- package/dist/esm/core/agent/buildAgentChart.js +8 -0
- package/dist/esm/core/agent/buildAgentChart.js.map +1 -1
- package/dist/esm/core/agent/buildDynamicAgentChart.js +16 -0
- package/dist/esm/core/agent/buildDynamicAgentChart.js.map +1 -1
- package/dist/esm/core/agent/buildToolRegistry.js +2 -2
- package/dist/esm/core/agent/buildToolRegistry.js.map +1 -1
- package/dist/esm/core/agent/evidence/errors.d.ts +55 -0
- package/dist/esm/core/agent/evidence/errors.js +51 -0
- package/dist/esm/core/agent/evidence/errors.js.map +1 -0
- package/dist/esm/core/agent/evidence/evidenceIndex.d.ts +73 -0
- package/dist/esm/core/agent/evidence/evidenceIndex.js +162 -0
- package/dist/esm/core/agent/evidence/evidenceIndex.js.map +1 -0
- package/dist/esm/core/agent/evidence/extract.d.ts +66 -0
- package/dist/esm/core/agent/evidence/extract.js +139 -0
- package/dist/esm/core/agent/evidence/extract.js.map +1 -0
- package/dist/esm/core/agent/evidence/frames.d.ts +36 -0
- package/dist/esm/core/agent/evidence/frames.js +40 -0
- package/dist/esm/core/agent/evidence/frames.js.map +1 -0
- package/dist/esm/core/agent/evidence/gate.d.ts +96 -0
- package/dist/esm/core/agent/evidence/gate.js +201 -0
- package/dist/esm/core/agent/evidence/gate.js.map +1 -0
- package/dist/esm/core/agent/evidence/index.d.ts +11 -0
- package/dist/esm/core/agent/evidence/index.js +11 -0
- package/dist/esm/core/agent/evidence/index.js.map +1 -0
- package/dist/esm/core/agent/evidence/normalize.d.ts +49 -0
- package/dist/esm/core/agent/evidence/normalize.js +134 -0
- package/dist/esm/core/agent/evidence/normalize.js.map +1 -0
- package/dist/esm/core/agent/evidence/types.d.ts +118 -0
- package/dist/esm/core/agent/evidence/types.js +10 -0
- package/dist/esm/core/agent/evidence/types.js.map +1 -0
- package/dist/esm/core/agent/stages/evidenceRecheck.d.ts +31 -0
- package/dist/esm/core/agent/stages/evidenceRecheck.js +82 -0
- package/dist/esm/core/agent/stages/evidenceRecheck.js.map +1 -0
- package/dist/esm/core/agent/stages/route.d.ts +3 -2
- package/dist/esm/core/agent/stages/route.js +152 -16
- package/dist/esm/core/agent/stages/route.js.map +1 -1
- package/dist/esm/core/agent/stages/seed.d.ts +8 -0
- package/dist/esm/core/agent/stages/seed.js +7 -0
- package/dist/esm/core/agent/stages/seed.js.map +1 -1
- package/dist/esm/core/agent/toolEffects.d.ts +15 -7
- package/dist/esm/core/agent/toolEffects.js +2 -9
- package/dist/esm/core/agent/toolEffects.js.map +1 -1
- package/dist/esm/core/agent/types.d.ts +44 -0
- package/dist/esm/core/slots/buildToolsSlot.js +2 -1
- package/dist/esm/core/slots/buildToolsSlot.js.map +1 -1
- package/dist/esm/doors/skill-graph.d.ts +70 -0
- package/dist/esm/doors/skill-graph.js +77 -0
- package/dist/esm/doors/skill-graph.js.map +1 -0
- package/dist/esm/events/payloads.d.ts +53 -2
- package/dist/esm/events/registry.d.ts +3 -1
- package/dist/esm/events/registry.js +2 -0
- package/dist/esm/events/registry.js.map +1 -1
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +10 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/injection-engine/devWarn.d.ts +47 -0
- package/dist/esm/lib/injection-engine/devWarn.js +57 -0
- package/dist/esm/lib/injection-engine/devWarn.js.map +1 -0
- package/dist/esm/lib/injection-engine/devWarnHost.d.ts +16 -0
- package/dist/esm/lib/injection-engine/devWarnHost.js +19 -0
- package/dist/esm/lib/injection-engine/devWarnHost.js.map +1 -0
- package/dist/esm/lib/injection-engine/hostContract.d.ts +211 -0
- package/dist/esm/lib/injection-engine/hostContract.js +37 -0
- package/dist/esm/lib/injection-engine/hostContract.js.map +1 -0
- package/dist/esm/lib/injection-engine/index.d.ts +7 -2
- package/dist/esm/lib/injection-engine/index.js +18 -2
- package/dist/esm/lib/injection-engine/index.js.map +1 -1
- package/dist/esm/lib/injection-engine/skillGraph.d.ts +3 -2
- package/dist/esm/lib/injection-engine/skillGraph.js +7 -12
- package/dist/esm/lib/injection-engine/skillGraph.js.map +1 -1
- package/dist/esm/lib/injection-engine/skillIntent.js +4 -7
- package/dist/esm/lib/injection-engine/skillIntent.js.map +1 -1
- package/dist/esm/lib/injection-engine/skillSteps.d.ts +18 -10
- package/dist/esm/lib/injection-engine/skillSteps.js +17 -12
- package/dist/esm/lib/injection-engine/skillSteps.js.map +1 -1
- package/dist/esm/lib/injection-engine/skillToolDescriptors.d.ts +119 -0
- package/dist/esm/lib/injection-engine/skillToolDescriptors.js +182 -0
- package/dist/esm/lib/injection-engine/skillToolDescriptors.js.map +1 -0
- package/dist/esm/lib/injection-engine/skillTools.d.ts +41 -79
- package/dist/esm/lib/injection-engine/skillTools.js +61 -137
- package/dist/esm/lib/injection-engine/skillTools.js.map +1 -1
- package/dist/esm/lib/injection-engine/toolOutcome.d.ts +30 -0
- package/dist/esm/lib/injection-engine/toolOutcome.js +31 -0
- package/dist/esm/lib/injection-engine/toolOutcome.js.map +1 -0
- package/dist/esm/lib/injection-engine/types.d.ts +38 -14
- package/dist/esm/lib/injection-engine/types.js.map +1 -1
- package/dist/events/registry.js +2 -0
- package/dist/events/registry.js.map +1 -1
- package/dist/index.js +50 -38
- package/dist/index.js.map +1 -1
- package/dist/lib/injection-engine/devWarn.js +63 -0
- package/dist/lib/injection-engine/devWarn.js.map +1 -0
- package/dist/lib/injection-engine/devWarnHost.js +21 -0
- package/dist/lib/injection-engine/devWarnHost.js.map +1 -0
- package/dist/lib/injection-engine/hostContract.js +38 -0
- package/dist/lib/injection-engine/hostContract.js.map +1 -0
- package/dist/lib/injection-engine/index.js +23 -2
- package/dist/lib/injection-engine/index.js.map +1 -1
- package/dist/lib/injection-engine/skillGraph.js +7 -12
- package/dist/lib/injection-engine/skillGraph.js.map +1 -1
- package/dist/lib/injection-engine/skillIntent.js +4 -7
- package/dist/lib/injection-engine/skillIntent.js.map +1 -1
- package/dist/lib/injection-engine/skillSteps.js +19 -14
- package/dist/lib/injection-engine/skillSteps.js.map +1 -1
- package/dist/lib/injection-engine/skillToolDescriptors.js +187 -0
- package/dist/lib/injection-engine/skillToolDescriptors.js.map +1 -0
- package/dist/lib/injection-engine/skillTools.js +63 -138
- package/dist/lib/injection-engine/skillTools.js.map +1 -1
- package/dist/lib/injection-engine/toolOutcome.js +34 -0
- package/dist/lib/injection-engine/toolOutcome.js.map +1 -0
- package/dist/lib/injection-engine/types.js.map +1 -1
- package/dist/types/adapters/hosting/firestoreSessions.d.ts +5 -1
- package/dist/types/adapters/hosting/firestoreSessions.d.ts.map +1 -1
- package/dist/types/conventions.d.ts +7 -0
- package/dist/types/conventions.d.ts.map +1 -1
- package/dist/types/core/Agent.d.ts +34 -1
- package/dist/types/core/Agent.d.ts.map +1 -1
- package/dist/types/core/agent/AgentBuilder.d.ts +66 -0
- package/dist/types/core/agent/AgentBuilder.d.ts.map +1 -1
- package/dist/types/core/agent/buildAgentChart.d.ts +21 -0
- package/dist/types/core/agent/buildAgentChart.d.ts.map +1 -1
- package/dist/types/core/agent/buildDynamicAgentChart.d.ts.map +1 -1
- package/dist/types/core/agent/buildToolRegistry.d.ts.map +1 -1
- package/dist/types/core/agent/evidence/errors.d.ts +56 -0
- package/dist/types/core/agent/evidence/errors.d.ts.map +1 -0
- package/dist/types/core/agent/evidence/evidenceIndex.d.ts +74 -0
- package/dist/types/core/agent/evidence/evidenceIndex.d.ts.map +1 -0
- package/dist/types/core/agent/evidence/extract.d.ts +67 -0
- package/dist/types/core/agent/evidence/extract.d.ts.map +1 -0
- package/dist/types/core/agent/evidence/frames.d.ts +37 -0
- package/dist/types/core/agent/evidence/frames.d.ts.map +1 -0
- package/dist/types/core/agent/evidence/gate.d.ts +97 -0
- package/dist/types/core/agent/evidence/gate.d.ts.map +1 -0
- package/dist/types/core/agent/evidence/index.d.ts +12 -0
- package/dist/types/core/agent/evidence/index.d.ts.map +1 -0
- package/dist/types/core/agent/evidence/normalize.d.ts +50 -0
- package/dist/types/core/agent/evidence/normalize.d.ts.map +1 -0
- package/dist/types/core/agent/evidence/types.d.ts +119 -0
- package/dist/types/core/agent/evidence/types.d.ts.map +1 -0
- package/dist/types/core/agent/stages/evidenceRecheck.d.ts +32 -0
- package/dist/types/core/agent/stages/evidenceRecheck.d.ts.map +1 -0
- package/dist/types/core/agent/stages/route.d.ts +3 -2
- package/dist/types/core/agent/stages/route.d.ts.map +1 -1
- package/dist/types/core/agent/stages/seed.d.ts +8 -0
- package/dist/types/core/agent/stages/seed.d.ts.map +1 -1
- package/dist/types/core/agent/toolEffects.d.ts +15 -7
- package/dist/types/core/agent/toolEffects.d.ts.map +1 -1
- package/dist/types/core/agent/types.d.ts +44 -0
- package/dist/types/core/agent/types.d.ts.map +1 -1
- package/dist/types/core/slots/buildToolsSlot.d.ts.map +1 -1
- package/dist/types/doors/skill-graph.d.ts +71 -0
- package/dist/types/doors/skill-graph.d.ts.map +1 -0
- package/dist/types/events/payloads.d.ts +53 -2
- package/dist/types/events/payloads.d.ts.map +1 -1
- package/dist/types/events/registry.d.ts +3 -1
- package/dist/types/events/registry.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/lib/injection-engine/devWarn.d.ts +48 -0
- package/dist/types/lib/injection-engine/devWarn.d.ts.map +1 -0
- package/dist/types/lib/injection-engine/devWarnHost.d.ts +17 -0
- package/dist/types/lib/injection-engine/devWarnHost.d.ts.map +1 -0
- package/dist/types/lib/injection-engine/hostContract.d.ts +212 -0
- package/dist/types/lib/injection-engine/hostContract.d.ts.map +1 -0
- package/dist/types/lib/injection-engine/index.d.ts +7 -2
- package/dist/types/lib/injection-engine/index.d.ts.map +1 -1
- package/dist/types/lib/injection-engine/skillGraph.d.ts +3 -2
- package/dist/types/lib/injection-engine/skillGraph.d.ts.map +1 -1
- package/dist/types/lib/injection-engine/skillIntent.d.ts.map +1 -1
- package/dist/types/lib/injection-engine/skillSteps.d.ts +18 -10
- package/dist/types/lib/injection-engine/skillSteps.d.ts.map +1 -1
- package/dist/types/lib/injection-engine/skillToolDescriptors.d.ts +120 -0
- package/dist/types/lib/injection-engine/skillToolDescriptors.d.ts.map +1 -0
- package/dist/types/lib/injection-engine/skillTools.d.ts +41 -79
- package/dist/types/lib/injection-engine/skillTools.d.ts.map +1 -1
- package/dist/types/lib/injection-engine/toolOutcome.d.ts +31 -0
- package/dist/types/lib/injection-engine/toolOutcome.d.ts.map +1 -0
- package/dist/types/lib/injection-engine/types.d.ts +38 -14
- package/dist/types/lib/injection-engine/types.d.ts.map +1 -1
- package/package.json +16 -2
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* gate — the check itself, and the sentences it says.
|
|
4
|
+
*
|
|
5
|
+
* Pattern: resolve-once/ask-many (the `ResolvedOutputEnforcement` shape) plus
|
|
6
|
+
* an authored frame around untrusted text (the `buildCorrectiveTurn`
|
|
7
|
+
* shape, and for the same reason).
|
|
8
|
+
* Role: core/ layer. This is the module a reader should start from.
|
|
9
|
+
* Emits: N/A — the Route decider and the recheck stage emit; this file only
|
|
10
|
+
* computes verdicts and builds strings.
|
|
11
|
+
*
|
|
12
|
+
* ## WHAT THIS IS
|
|
13
|
+
*
|
|
14
|
+
* Every number, identifier and name in the model's final answer must appear in
|
|
15
|
+
* a tool result the run can point at. If one does not, the model TYPED it
|
|
16
|
+
* rather than read it. That is the whole claim.
|
|
17
|
+
*
|
|
18
|
+
* ## WHAT IT IS NOT — read this before trusting it
|
|
19
|
+
*
|
|
20
|
+
* **It is a fabrication detector, not a correctness judge.** It catches values
|
|
21
|
+
* that came from nowhere. It cannot catch a FALSE CLAIM ASSEMBLED FROM REAL
|
|
22
|
+
* VALUES: "fc1/3 is healthy" when the data says the port is down uses entirely
|
|
23
|
+
* grounded tokens — `fc1/3` is in the evidence, "healthy" is a word — and this
|
|
24
|
+
* check passes it without a murmur. So will "the outage started at 08:15" when
|
|
25
|
+
* 08:15 is a timestamp from a different port. Anyone who reads this as a
|
|
26
|
+
* hallucination check will trust it for the thing it provably cannot do.
|
|
27
|
+
*
|
|
28
|
+
* It is also deliberately incomplete in the other direction: the extractor is
|
|
29
|
+
* conservative (see `extract.ts`), so small numbers and all-letters names pass
|
|
30
|
+
* unexamined. A missed fabrication is a miss; a false accusation costs a real
|
|
31
|
+
* turn and can refuse a good answer, so the bias points the way it does.
|
|
32
|
+
*
|
|
33
|
+
* ## Why the check is DETERMINISTIC
|
|
34
|
+
*
|
|
35
|
+
* No model call, no embedding, no judge. The library's thesis is that
|
|
36
|
+
* structure lets a smaller model perform like a bigger one — so a guard that
|
|
37
|
+
* needed a BIGGER model to police the small one would invert the whole value
|
|
38
|
+
* proposition, and would fail exactly where the small model is deployed
|
|
39
|
+
* (offline, cheap, fast). Set membership over normalized tokens is the entire
|
|
40
|
+
* mechanism, it costs microseconds, and it is the same on every run.
|
|
41
|
+
*/
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.evidenceRefusalSentence = exports.buildEvidenceCorrection = exports.describeValues = exports.checkAnswer = exports.resolveEvidenceGate = exports.MAX_REPORTED_VALUES = exports.EVIDENCE_CHECK_FRAME_PREFIX = void 0;
|
|
44
|
+
const frames_js_1 = require("./frames.js");
|
|
45
|
+
Object.defineProperty(exports, "EVIDENCE_CHECK_FRAME_PREFIX", { enumerable: true, get: function () { return frames_js_1.EVIDENCE_CHECK_FRAME_PREFIX; } });
|
|
46
|
+
const extract_js_1 = require("./extract.js");
|
|
47
|
+
const normalize_js_1 = require("./normalize.js");
|
|
48
|
+
const POSTURES = ['assist', 'guard', 'rails'];
|
|
49
|
+
/** Most values named in one message, one event payload or one error. */
|
|
50
|
+
exports.MAX_REPORTED_VALUES = 12;
|
|
51
|
+
/** Longest a single value is quoted at. */
|
|
52
|
+
const MAX_VALUE_CHARS = 64;
|
|
53
|
+
/** Clip a value for display without letting it pretend to be complete. */
|
|
54
|
+
function clip(v) {
|
|
55
|
+
return v.length <= MAX_VALUE_CHARS ? v : `${v.slice(0, MAX_VALUE_CHARS - 1)}…`;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Validate the caller's options once, at build time, into the config the chart
|
|
59
|
+
* carries. Refusals name the option and the fix — nothing here is discovered
|
|
60
|
+
* at run time.
|
|
61
|
+
*/
|
|
62
|
+
function resolveEvidenceGate(opts = {}) {
|
|
63
|
+
const posture = opts.posture ?? 'assist';
|
|
64
|
+
if (!POSTURES.includes(posture)) {
|
|
65
|
+
throw new Error(`AgentBuilder.namesAndNumbersFromEvidence: posture '${String(posture)}' is not a posture ` +
|
|
66
|
+
`this library has. Use 'assist' (record and flag — the default), 'guard' (name the ` +
|
|
67
|
+
`values back to the model and allow one revision), or 'rails' (refuse to return an ` +
|
|
68
|
+
`answer that still carries them).`);
|
|
69
|
+
}
|
|
70
|
+
const minDigits = opts.minDigits ?? 4;
|
|
71
|
+
if (!Number.isInteger(minDigits) || minDigits < 1) {
|
|
72
|
+
throw new Error(`AgentBuilder.namesAndNumbersFromEvidence: minDigits must be a whole number of at least ` +
|
|
73
|
+
`1 — got ${String(opts.minDigits)}. It is the point at which a BARE number stops being ` +
|
|
74
|
+
`prose ("24 hours") and starts being a reading off a screen ("41,200"); the default is 4.`);
|
|
75
|
+
}
|
|
76
|
+
const shapes = [];
|
|
77
|
+
const names = new Set();
|
|
78
|
+
for (const shape of opts.shapes ?? []) {
|
|
79
|
+
const name = shape?.name?.trim();
|
|
80
|
+
if (!name) {
|
|
81
|
+
throw new Error('AgentBuilder.namesAndNumbersFromEvidence: every shape needs a non-empty `name`. It is ' +
|
|
82
|
+
'what a flagged value is labelled with, so a reader can tell which of your rules ' +
|
|
83
|
+
"caught it (e.g. { name: 'wwn', match: /(?:[0-9a-f]{2}:){7}[0-9a-f]{2}/ }).");
|
|
84
|
+
}
|
|
85
|
+
if (names.has(name)) {
|
|
86
|
+
throw new Error(`AgentBuilder.namesAndNumbersFromEvidence: two shapes are both named '${name}'. Names ` +
|
|
87
|
+
`label flagged values, so duplicates make the record ambiguous — rename one.`);
|
|
88
|
+
}
|
|
89
|
+
if (!(shape.match instanceof RegExp)) {
|
|
90
|
+
throw new Error(`AgentBuilder.namesAndNumbersFromEvidence: shape '${name}' needs a RegExp \`match\`.`);
|
|
91
|
+
}
|
|
92
|
+
names.add(name);
|
|
93
|
+
shapes.push({ name, match: anchor(shape.match) });
|
|
94
|
+
}
|
|
95
|
+
const exemptValues = new Set();
|
|
96
|
+
const exemptPatterns = [];
|
|
97
|
+
for (const ex of opts.exempt ?? []) {
|
|
98
|
+
if (ex instanceof RegExp)
|
|
99
|
+
exemptPatterns.push(anchor(ex));
|
|
100
|
+
else if (typeof ex === 'string') {
|
|
101
|
+
const norm = (0, normalize_js_1.normalizeToken)(ex);
|
|
102
|
+
// Both spellings of an FCID, so exempting `0xef0101` also exempts the
|
|
103
|
+
// bare form the extractor would have looked up.
|
|
104
|
+
for (const form of (0, normalize_js_1.lookupForms)(norm))
|
|
105
|
+
if (form !== '')
|
|
106
|
+
exemptValues.add(form);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
throw new Error('AgentBuilder.namesAndNumbersFromEvidence: `exempt` takes strings and RegExps only.');
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return { posture, shapes, exemptValues, exemptPatterns, minDigits };
|
|
113
|
+
}
|
|
114
|
+
exports.resolveEvidenceGate = resolveEvidenceGate;
|
|
115
|
+
/**
|
|
116
|
+
* Anchor a caller's pattern to a whole token and drop `g`/`y`.
|
|
117
|
+
*
|
|
118
|
+
* Both halves are bug prevention rather than taste: an unanchored pattern
|
|
119
|
+
* matches inside a longer token (so `/\d{4}/` would flag every serial that
|
|
120
|
+
* merely CONTAINS four digits), and a `g` regex carries `lastIndex` between
|
|
121
|
+
* calls, so reusing one across tokens silently skips every other match.
|
|
122
|
+
*/
|
|
123
|
+
function anchor(re) {
|
|
124
|
+
return new RegExp(`^(?:${re.source})$`, re.flags.replace(/[gy]/g, ''));
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Judge one answer.
|
|
128
|
+
*
|
|
129
|
+
* `exempt` is checked BEFORE the evidence: a value the user supplied is not a
|
|
130
|
+
* fabrication whether or not a tool ever echoed it back.
|
|
131
|
+
*/
|
|
132
|
+
function checkAnswer(answer, args) {
|
|
133
|
+
const candidates = (0, extract_js_1.extractCandidates)(answer, args.gate);
|
|
134
|
+
const unsupported = [];
|
|
135
|
+
for (const candidate of candidates) {
|
|
136
|
+
const forms = (0, normalize_js_1.lookupForms)(candidate.value);
|
|
137
|
+
const known = forms.some((f) => args.exempt.has(f) || args.evidence.values.has(f));
|
|
138
|
+
if (!known)
|
|
139
|
+
unsupported.push({ value: clip(candidate.value), shape: candidate.shape });
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
unsupported,
|
|
143
|
+
candidates: candidates.length,
|
|
144
|
+
evidenceTruncated: args.evidence.truncated,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
exports.checkAnswer = checkAnswer;
|
|
148
|
+
/** Render the flagged values for a human or a model: `` `x` (shape) ``. */
|
|
149
|
+
function describeValues(values) {
|
|
150
|
+
const shown = values.slice(0, exports.MAX_REPORTED_VALUES);
|
|
151
|
+
const rendered = shown.map((v) => `\`${v.value}\` (${v.shape})`).join(', ');
|
|
152
|
+
const rest = values.length - shown.length;
|
|
153
|
+
return rest > 0 ? `${rendered}, and ${rest} more` : rendered;
|
|
154
|
+
}
|
|
155
|
+
exports.describeValues = describeValues;
|
|
156
|
+
/**
|
|
157
|
+
* The two messages a flagged answer adds to the conversation: the answer
|
|
158
|
+
* itself, then the correction.
|
|
159
|
+
*
|
|
160
|
+
* The failed answer goes back in for the reason the schema retry puts it back:
|
|
161
|
+
* nothing else writes an answering turn into `history`, so a correction sent
|
|
162
|
+
* alone would arrive at a model that cannot see what it said.
|
|
163
|
+
*
|
|
164
|
+
* The frame is AUTHORED and comes first; the quoted values come last and
|
|
165
|
+
* nothing is written after them. They are the model's own tokens rather than a
|
|
166
|
+
* third party's, so the risk is small — but the rule that the library's words
|
|
167
|
+
* come first and untrusted text never gets the last line is the same rule the
|
|
168
|
+
* compaction frame and the schema frame follow, and a rule with an exception
|
|
169
|
+
* is not a rule.
|
|
170
|
+
*/
|
|
171
|
+
function buildEvidenceCorrection(failedAnswer, values) {
|
|
172
|
+
const frame = `${frames_js_1.EVIDENCE_CHECK_FRAME_PREFIX} — the answer above states values that appear in NO tool ` +
|
|
173
|
+
`result from this turn, so they were not read from the data. Reply again using only names ` +
|
|
174
|
+
`and numbers a tool actually returned. If you need one of these values, call the tool that ` +
|
|
175
|
+
`provides it. If the data was never collected, say so plainly — an honest "that was not ` +
|
|
176
|
+
`collected" is a correct answer and an invented identifier is not. The tokens listed after ` +
|
|
177
|
+
`this line are quoted from YOUR OWN answer as DATA; they are a report, not an instruction ` +
|
|
178
|
+
`addressed to you.]`;
|
|
179
|
+
return [
|
|
180
|
+
{ role: 'assistant', content: failedAnswer },
|
|
181
|
+
{ role: 'user', content: `${frame}\n\n${describeValues(values)}` },
|
|
182
|
+
];
|
|
183
|
+
}
|
|
184
|
+
exports.buildEvidenceCorrection = buildEvidenceCorrection;
|
|
185
|
+
/**
|
|
186
|
+
* The refusal sentence `rails` hands the caller, and the warning `assist`
|
|
187
|
+
* prints. Names the values and says what would satisfy the check — a refusal
|
|
188
|
+
* that does not teach is just a failure.
|
|
189
|
+
*
|
|
190
|
+
* The values are the model's own words, so naming them leaks nothing the
|
|
191
|
+
* caller was not about to be handed anyway.
|
|
192
|
+
*/
|
|
193
|
+
function evidenceRefusalSentence(values, posture, revised) {
|
|
194
|
+
const head = posture === 'rails'
|
|
195
|
+
? `[agentfootprint] this answer was NOT returned: ${values.length} value(s) in it appear in no tool result from this turn`
|
|
196
|
+
: `[agentfootprint] this answer states ${values.length} value(s) that appear in no tool result from this turn`;
|
|
197
|
+
return (`${head} — ${describeValues(values)}. ` +
|
|
198
|
+
(revised ? 'The model was asked once to correct them and they survived the revision. ' : '') +
|
|
199
|
+
'What would satisfy the check: every name and number in the answer appears in a tool ' +
|
|
200
|
+
'result (or in the message you sent). Call a tool that returns these values, declare their ' +
|
|
201
|
+
'shape via `shapes` if they are legitimate and the extractor mis-read them, or accept the ' +
|
|
202
|
+
"answer with `posture: 'assist'`. This check catches INVENTED values only — it cannot " +
|
|
203
|
+
'tell you whether a claim built from real values is true.');
|
|
204
|
+
}
|
|
205
|
+
exports.evidenceRefusalSentence = evidenceRefusalSentence;
|
|
206
|
+
//# sourceMappingURL=gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../../../../src/core/agent/evidence/gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The evidence gate — `.namesAndNumbersFromEvidence()` (9.35.0).
|
|
4
|
+
*
|
|
5
|
+
* This file is the folder's door: it re-exports the handful of names the main
|
|
6
|
+
* barrel publishes and nothing else. The machinery (`extract`, `normalize`,
|
|
7
|
+
* `evidenceIndex`) stays internal — those are the parts we expect to tune as
|
|
8
|
+
* more domains are measured, and a consumer who pinned them would make that
|
|
9
|
+
* impossible. See ./README.md for the design.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.EVIDENCE_CHECK_FRAME_PREFIX = void 0;
|
|
13
|
+
var gate_js_1 = require("./gate.js");
|
|
14
|
+
Object.defineProperty(exports, "EVIDENCE_CHECK_FRAME_PREFIX", { enumerable: true, get: function () { return gate_js_1.EVIDENCE_CHECK_FRAME_PREFIX; } });
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/agent/evidence/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,qCAAwD;AAA/C,sHAAA,2BAA2B,OAAA"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* normalize — one spelling for one value, on BOTH sides of the comparison.
|
|
4
|
+
*
|
|
5
|
+
* Pattern: a pure leaf module (no imports), shared by the extractor and the
|
|
6
|
+
* evidence index so the two can never disagree about what "the same
|
|
7
|
+
* value" means.
|
|
8
|
+
* Role: core/ layer, `namesAndNumbersFromEvidence` only.
|
|
9
|
+
* Emits: N/A.
|
|
10
|
+
*
|
|
11
|
+
* ## Why this file exists at all
|
|
12
|
+
*
|
|
13
|
+
* The answer is prose and the evidence is JSON. The same fact is spelled
|
|
14
|
+
* differently in each: a tool returns the NUMBER `41200`, and the model writes
|
|
15
|
+
* `41,200 IOPS.` — with a thousands separator, a unit and a full stop. A naive
|
|
16
|
+
* matcher calls that fabricated, which is the worst failure this feature can
|
|
17
|
+
* have: a false accusation costs a real turn under `guard` and refuses a good
|
|
18
|
+
* answer under `rails`.
|
|
19
|
+
*
|
|
20
|
+
* So every value passes through {@link normalizeToken} before it is compared,
|
|
21
|
+
* on the answer side AND on the evidence side. The rules are deliberately few
|
|
22
|
+
* and each is here because a real spelling difference needed it.
|
|
23
|
+
*/
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.lookupForms = exports.tokenize = exports.countDigits = exports.normalizeToken = void 0;
|
|
26
|
+
/**
|
|
27
|
+
* Characters that may live INSIDE one token.
|
|
28
|
+
*
|
|
29
|
+
* Everything else is a separator. The set is the punctuation that real
|
|
30
|
+
* identifiers are built from — `21:00:00:24:ff:4a:12:03` (colons),
|
|
31
|
+
* `stor-array05-ct1-fc0` (hyphens), `fc1/3` (slash), `z_array05_ct1_esxi`
|
|
32
|
+
* (underscore), `7.0.3` (dots), `41,200` (comma), `0xef0101`, `78%`, `$20`.
|
|
33
|
+
* Quotes, brackets, pipes, asterisks and backticks are NOT in it, so a value
|
|
34
|
+
* in a markdown table cell or in `**bold**` tokenizes to the same string as the
|
|
35
|
+
* bare one.
|
|
36
|
+
*/
|
|
37
|
+
const INTRA_TOKEN = /[^A-Za-z0-9:_\-/.,%+@#$]+/g;
|
|
38
|
+
/**
|
|
39
|
+
* A comma that is NOT flanked by digits on both sides — i.e. a list comma
|
|
40
|
+
* (`fc1/3,fc1/4`) rather than a thousands separator (`41,200`).
|
|
41
|
+
*/
|
|
42
|
+
const LIST_COMMA = /,(?!\d)|(?<!\d),/;
|
|
43
|
+
/**
|
|
44
|
+
* Leading characters that decorate a value rather than belong to it. Quotes
|
|
45
|
+
* and brackets are in the set even though {@link tokenize} already removes
|
|
46
|
+
* them: this function is ALSO called straight on a JSON leaf and on a
|
|
47
|
+
* caller's `exempt` string, and one spelling rule has to cover all three
|
|
48
|
+
* entry points or the two sides can disagree.
|
|
49
|
+
*/
|
|
50
|
+
const LEADING_DECORATION = /^[$#@+'"`([{<]+/;
|
|
51
|
+
/** Trailing punctuation: sentence ends, list separators, a trailing percent. */
|
|
52
|
+
const TRAILING_DECORATION = /[.,;:!?%'"`)\]}>]+$/;
|
|
53
|
+
/** `1,234` / `12,345,678` / `1,234.56` — a number wearing thousands separators. */
|
|
54
|
+
const THOUSANDS = /^-?\d{1,3}(,\d{3})+(\.\d+)?$/;
|
|
55
|
+
/** A plain decimal or integer, optionally signed. */
|
|
56
|
+
const PLAIN_NUMBER = /^[-+]?\d+(\.\d+)?$/;
|
|
57
|
+
/**
|
|
58
|
+
* Above this many digits, `Number()` silently rounds — `9007199254740993`
|
|
59
|
+
* becomes `9007199254740992`. A 20-digit array serial is a VALUE, not a
|
|
60
|
+
* quantity, so past the safe-integer range the raw digits are kept and
|
|
61
|
+
* compared as a string.
|
|
62
|
+
*/
|
|
63
|
+
const MAX_EXACT_DIGITS = 15;
|
|
64
|
+
/**
|
|
65
|
+
* Reduce one raw token to the form both sides compare on.
|
|
66
|
+
*
|
|
67
|
+
* Returns `''` for a token that is nothing but decoration — callers drop those.
|
|
68
|
+
*/
|
|
69
|
+
function normalizeToken(raw) {
|
|
70
|
+
let v = raw.toLowerCase().trim();
|
|
71
|
+
if (v === '')
|
|
72
|
+
return '';
|
|
73
|
+
v = v.replace(LEADING_DECORATION, '').replace(TRAILING_DECORATION, '');
|
|
74
|
+
if (v === '')
|
|
75
|
+
return '';
|
|
76
|
+
// Thousands separators are PRESENTATION. `41,200` in prose and `41200` in
|
|
77
|
+
// JSON are one value, and this is the single most common way a correct
|
|
78
|
+
// answer looks fabricated to a naive matcher.
|
|
79
|
+
if (THOUSANDS.test(v))
|
|
80
|
+
v = v.replace(/,/g, '');
|
|
81
|
+
// `98304.0` (a JSON float printed by a spreadsheet exporter) and `98304`
|
|
82
|
+
// (the same float printed by JSON.stringify) are one value. Canonicalise
|
|
83
|
+
// through Number — but only while Number can hold the digits exactly.
|
|
84
|
+
if (PLAIN_NUMBER.test(v) && countDigits(v) <= MAX_EXACT_DIGITS) {
|
|
85
|
+
const n = Number(v);
|
|
86
|
+
if (Number.isFinite(n))
|
|
87
|
+
v = String(n);
|
|
88
|
+
}
|
|
89
|
+
return v;
|
|
90
|
+
}
|
|
91
|
+
exports.normalizeToken = normalizeToken;
|
|
92
|
+
/** How many digit characters a string carries. */
|
|
93
|
+
function countDigits(v) {
|
|
94
|
+
let n = 0;
|
|
95
|
+
for (const ch of v)
|
|
96
|
+
if (ch >= '0' && ch <= '9')
|
|
97
|
+
n += 1;
|
|
98
|
+
return n;
|
|
99
|
+
}
|
|
100
|
+
exports.countDigits = countDigits;
|
|
101
|
+
/**
|
|
102
|
+
* Split free text into candidate tokens.
|
|
103
|
+
*
|
|
104
|
+
* Used on the answer (to find values to ground) and on any tool-result text
|
|
105
|
+
* that is not JSON. Token boundaries are the whole point: a value that appears
|
|
106
|
+
* only as a SUBSTRING of an unrelated field must not read as grounded, so
|
|
107
|
+
* matching is always token-exact and never substring.
|
|
108
|
+
*/
|
|
109
|
+
function tokenize(text) {
|
|
110
|
+
const out = [];
|
|
111
|
+
for (const rough of text.replace(INTRA_TOKEN, ' ').split(/\s+/)) {
|
|
112
|
+
if (rough === '')
|
|
113
|
+
continue;
|
|
114
|
+
// A comma inside a token is either a thousands separator (keep the token
|
|
115
|
+
// whole) or a list separator that had no space after it (split).
|
|
116
|
+
for (const piece of rough.split(LIST_COMMA)) {
|
|
117
|
+
const norm = normalizeToken(piece);
|
|
118
|
+
if (norm !== '')
|
|
119
|
+
out.push(norm);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return out;
|
|
123
|
+
}
|
|
124
|
+
exports.tokenize = tokenize;
|
|
125
|
+
/**
|
|
126
|
+
* The spellings of one normalized value that count as the SAME value when
|
|
127
|
+
* looking it up.
|
|
128
|
+
*
|
|
129
|
+
* Only one rule so far, and it is a real one: an FCID is read off a switch as
|
|
130
|
+
* `0xef0101` and quoted back sometimes as `ef0101`. Both sides expand, so the
|
|
131
|
+
* prefix can be dropped by either the tool or the model without either being
|
|
132
|
+
* accused of inventing it.
|
|
133
|
+
*/
|
|
134
|
+
function lookupForms(normalized) {
|
|
135
|
+
if (normalized.startsWith('0x') && normalized.length > 2) {
|
|
136
|
+
return [normalized, normalized.slice(2)];
|
|
137
|
+
}
|
|
138
|
+
return [normalized];
|
|
139
|
+
}
|
|
140
|
+
exports.lookupForms = lookupForms;
|
|
141
|
+
//# sourceMappingURL=normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../../../src/core/agent/evidence/normalize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* types — the public vocabulary of `.namesAndNumbersFromEvidence()`.
|
|
4
|
+
*
|
|
5
|
+
* Pattern: one options interface the builder validates once into a resolved
|
|
6
|
+
* config the chart carries (the `ResolvedOutputEnforcement` shape).
|
|
7
|
+
* Role: core/ layer. Nothing here runs; it is the contract.
|
|
8
|
+
* Emits: N/A.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/agent/evidence/types.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* evidenceRecheck — the branch that asks again when the answer states values
|
|
4
|
+
* no tool result carried (9.35.0).
|
|
5
|
+
*
|
|
6
|
+
* Mounted as a branch of the Route decider, and only on an agent that opted
|
|
7
|
+
* into `.namesAndNumbersFromEvidence({ posture: 'guard' | 'rails' })`. It
|
|
8
|
+
* carries `{ loopTo }` to the same target the `tool-calls` branch loops to —
|
|
9
|
+
* the SchemaRetry mechanism verbatim: a correction is not a special mode, it
|
|
10
|
+
* is one more ordinary turn of the ReAct loop, with its own `iteration_start`
|
|
11
|
+
* / `llm_start` / `llm_end` bracket and its own `cost.tick` against
|
|
12
|
+
* `costBudget`. The model can spend that turn calling the tool that would
|
|
13
|
+
* actually produce the value, because it is a real turn and the tools are
|
|
14
|
+
* still on the wire.
|
|
15
|
+
*
|
|
16
|
+
* What it appends is the conversation as it really went: the answer that
|
|
17
|
+
* stated the values as the assistant turn, then a `role: 'user'` message
|
|
18
|
+
* naming them and saying what would satisfy the check. **At most once per
|
|
19
|
+
* turn** (`evidenceRevisionSpent`) — a model that cannot ground a value on
|
|
20
|
+
* its second try will not ground it on its fifth, and the retry storm that
|
|
21
|
+
* would follow is the exact failure this library exists to remove.
|
|
22
|
+
*
|
|
23
|
+
* Pure function apart from its resolved config — no Agent class state.
|
|
24
|
+
*/
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.buildEvidenceRecheckStage = void 0;
|
|
27
|
+
const typedEmit_js_1 = require("../../../recorders/core/typedEmit.js");
|
|
28
|
+
const gate_js_1 = require("../evidence/gate.js");
|
|
29
|
+
/**
|
|
30
|
+
* Build the recheck stage. The decider already found the values and wrote the
|
|
31
|
+
* carrier immediately before routing here — this stage does the work of asking.
|
|
32
|
+
*/
|
|
33
|
+
function buildEvidenceRecheckStage(gate) {
|
|
34
|
+
return (scope) => {
|
|
35
|
+
const pending = scope.evidenceUnsupported;
|
|
36
|
+
if (pending === undefined || pending.values.length === 0) {
|
|
37
|
+
// Unreachable through the decider, which writes the carrier immediately
|
|
38
|
+
// before routing here. Returning quietly rather than throwing keeps a
|
|
39
|
+
// hand-built chart that mounts this branch without the decider from
|
|
40
|
+
// taking down a run (the SchemaRetry discipline).
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const iteration = scope.iteration;
|
|
44
|
+
const values = [...pending.values];
|
|
45
|
+
const flaggedAnswer = scope.llmLatestContent;
|
|
46
|
+
const [answerTurn, correctionTurn] = (0, gate_js_1.buildEvidenceCorrection)(flaggedAnswer, values);
|
|
47
|
+
// The conversation, as it really went. A plain local array — a TypedScope
|
|
48
|
+
// array read is a live proxy view, and both the commit and the event
|
|
49
|
+
// payload below must be detached plain data.
|
|
50
|
+
const newHistory = [
|
|
51
|
+
...scope.history,
|
|
52
|
+
answerTurn,
|
|
53
|
+
correctionTurn,
|
|
54
|
+
];
|
|
55
|
+
scope.history = newHistory;
|
|
56
|
+
// The one-per-turn latch, spent BEFORE the loop turns: a second flagged
|
|
57
|
+
// answer is recorded and (under `rails`) refused, never re-asked.
|
|
58
|
+
scope.evidenceRevisionSpent = true;
|
|
59
|
+
// The event fires HERE, where the work is — the `steps_unfinished
|
|
60
|
+
// { action: 'nudged' }` precedent. The decider files every other outcome
|
|
61
|
+
// itself, so exactly one `evidence_checked` exists per judgement.
|
|
62
|
+
(0, typedEmit_js_1.typedEmit)(scope, 'agentfootprint.agent.evidence_checked', {
|
|
63
|
+
iteration,
|
|
64
|
+
posture: gate.posture,
|
|
65
|
+
candidates: pending.candidates,
|
|
66
|
+
unsupported: values.slice(0, gate_js_1.MAX_REPORTED_VALUES),
|
|
67
|
+
action: 'revision-asked',
|
|
68
|
+
afterRevision: false,
|
|
69
|
+
});
|
|
70
|
+
// Close this iteration's bracket before the loop turns — every recorder
|
|
71
|
+
// that synthesizes steps pairs `iteration_start`/`iteration_end` per
|
|
72
|
+
// `iterIndex`, and the crash-checkpoint tracker snapshots history from
|
|
73
|
+
// this payload (the SchemaRetry stage's reasoning, verbatim).
|
|
74
|
+
(0, typedEmit_js_1.typedEmit)(scope, 'agentfootprint.agent.iteration_end', {
|
|
75
|
+
turnIndex: 0,
|
|
76
|
+
iterIndex: iteration,
|
|
77
|
+
toolCallCount: 0,
|
|
78
|
+
history: newHistory,
|
|
79
|
+
});
|
|
80
|
+
// A revision consumes an iteration, exactly as a tool call does — one more
|
|
81
|
+
// real turn against the agent's declared budget.
|
|
82
|
+
scope.iteration = iteration + 1;
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
exports.buildEvidenceRecheckStage = buildEvidenceRecheckStage;
|
|
86
|
+
//# sourceMappingURL=evidenceRecheck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidenceRecheck.js","sourceRoot":"","sources":["../../../../src/core/agent/stages/evidenceRecheck.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;AAIH,uEAAiE;AACjE,iDAAmF;AAInF;;;GAGG;AACH,SAAgB,yBAAyB,CACvC,IAA0B;IAE1B,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,MAAM,OAAO,GAAG,KAAK,CAAC,mBAAmB,CAAC;QAC1C,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzD,wEAAwE;YACxE,sEAAsE;YACtE,oEAAoE;YACpE,kDAAkD;YAClD,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,SAAmB,CAAC;QAC5C,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAuB,CAAC;QACzD,MAAM,aAAa,GAAG,KAAK,CAAC,gBAA0B,CAAC;QACvD,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC,GAAG,IAAA,iCAAuB,EAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAEpF,0EAA0E;QAC1E,qEAAqE;QACrE,6CAA6C;QAC7C,MAAM,UAAU,GAAiB;YAC/B,GAAI,KAAK,CAAC,OAAiC;YAC3C,UAAU;YACV,cAAc;SACf,CAAC;QACF,KAAK,CAAC,OAAO,GAAG,UAAU,CAAC;QAE3B,wEAAwE;QACxE,kEAAkE;QAClE,KAAK,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAEnC,kEAAkE;QAClE,yEAAyE;QACzE,kEAAkE;QAClE,IAAA,wBAAS,EAAC,KAAK,EAAE,uCAAuC,EAAE;YACxD,SAAS;YACT,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,6BAAmB,CAAC;YACjD,MAAM,EAAE,gBAAgB;YACxB,aAAa,EAAE,KAAK;SACrB,CAAC,CAAC;QAEH,wEAAwE;QACxE,qEAAqE;QACrE,uEAAuE;QACvE,8DAA8D;QAC9D,IAAA,wBAAS,EAAC,KAAK,EAAE,oCAAoC,EAAE;YACrD,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,SAAS;YACpB,aAAa,EAAE,CAAC;YAChB,OAAO,EAAE,UAAU;SACpB,CAAC,CAAC;QAEH,2EAA2E;QAC3E,iDAAiD;QACjD,KAAK,CAAC,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;IAClC,CAAC,CAAC;AACJ,CAAC;AA3DD,8DA2DC"}
|