loopforge 1.15.1 → 2.0.1
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 +172 -95
- package/dist/backends/interface.d.ts +5 -10
- package/dist/backends/interface.d.ts.map +1 -1
- package/dist/backends/interface.js +3 -4
- package/dist/backends/interface.js.map +1 -1
- package/dist/canonical-state.d.ts +53 -0
- package/dist/canonical-state.d.ts.map +1 -0
- package/dist/canonical-state.js +161 -0
- package/dist/canonical-state.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +227 -0
- package/dist/cli.js.map +1 -0
- package/dist/enforcement-gate.d.ts.map +1 -1
- package/dist/enforcement-gate.js +28 -10
- package/dist/enforcement-gate.js.map +1 -1
- package/dist/engine.d.ts +9 -28
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +135 -361
- package/dist/engine.js.map +1 -1
- package/dist/evidence-provider.d.ts +146 -0
- package/dist/evidence-provider.d.ts.map +1 -0
- package/dist/evidence-provider.js +512 -0
- package/dist/evidence-provider.js.map +1 -0
- package/dist/index.d.ts +19 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -12
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +15 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +49 -0
- package/dist/init.js.map +1 -0
- package/dist/interop.d.ts +35 -0
- package/dist/interop.d.ts.map +1 -0
- package/dist/interop.js +34 -0
- package/dist/interop.js.map +1 -0
- package/dist/loop-compiler.d.ts +14 -64
- package/dist/loop-compiler.d.ts.map +1 -1
- package/dist/loop-compiler.js +305 -2206
- package/dist/loop-compiler.js.map +1 -1
- package/dist/loop-extras-parser.d.ts +82 -0
- package/dist/loop-extras-parser.d.ts.map +1 -0
- package/dist/loop-extras-parser.js +217 -0
- package/dist/loop-extras-parser.js.map +1 -0
- package/dist/loop-store.d.ts +104 -0
- package/dist/loop-store.d.ts.map +1 -0
- package/dist/loop-store.js +421 -0
- package/dist/loop-store.js.map +1 -0
- package/dist/mcp/server.d.ts +9 -6
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +109 -73
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/session.d.ts +102 -21
- package/dist/mcp/session.d.ts.map +1 -1
- package/dist/mcp/session.js +795 -400
- package/dist/mcp/session.js.map +1 -1
- package/dist/mcp/tools.d.ts +18 -268
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +226 -12
- package/dist/mcp/tools.js.map +1 -1
- package/dist/observability.d.ts +36 -16
- package/dist/observability.d.ts.map +1 -1
- package/dist/observability.js +82 -23
- package/dist/observability.js.map +1 -1
- package/dist/policy-metrics.d.ts +46 -0
- package/dist/policy-metrics.d.ts.map +1 -0
- package/dist/policy-metrics.js +146 -0
- package/dist/policy-metrics.js.map +1 -0
- package/dist/policy.d.ts +52 -147
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +118 -191
- package/dist/policy.js.map +1 -1
- package/dist/prompt-assembler.d.ts +30 -0
- package/dist/prompt-assembler.d.ts.map +1 -0
- package/dist/prompt-assembler.js +278 -0
- package/dist/prompt-assembler.js.map +1 -0
- package/dist/prompt-policy.d.ts +29 -0
- package/dist/prompt-policy.d.ts.map +1 -0
- package/dist/prompt-policy.js +51 -0
- package/dist/prompt-policy.js.map +1 -0
- package/dist/protocol.d.ts +75 -152
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +11 -53
- package/dist/protocol.js.map +1 -1
- package/dist/replay.d.ts.map +1 -1
- package/dist/replay.js +1 -27
- package/dist/replay.js.map +1 -1
- package/dist/round-coordinator.d.ts +90 -0
- package/dist/round-coordinator.d.ts.map +1 -0
- package/dist/round-coordinator.js +186 -0
- package/dist/round-coordinator.js.map +1 -0
- package/dist/round-driver.d.ts +53 -0
- package/dist/round-driver.d.ts.map +1 -0
- package/dist/round-driver.js +101 -0
- package/dist/round-driver.js.map +1 -0
- package/dist/round-transaction.d.ts +70 -0
- package/dist/round-transaction.d.ts.map +1 -0
- package/dist/round-transaction.js +290 -0
- package/dist/round-transaction.js.map +1 -0
- package/dist/self-eval.d.ts +26 -0
- package/dist/self-eval.d.ts.map +1 -0
- package/dist/self-eval.js +154 -0
- package/dist/self-eval.js.map +1 -0
- package/dist/storage.d.ts +39 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +193 -0
- package/dist/storage.js.map +1 -0
- package/dist/verification-gate.d.ts +31 -7
- package/dist/verification-gate.d.ts.map +1 -1
- package/dist/verification-gate.js +250 -7
- package/dist/verification-gate.js.map +1 -1
- package/loop_policy.json +19 -53
- package/package.json +13 -10
- package/skills/perception/SKILL.md +80 -267
- package/dist/backends/fs.d.ts +0 -36
- package/dist/backends/fs.d.ts.map +0 -1
- package/dist/backends/fs.js +0 -362
- package/dist/backends/fs.js.map +0 -1
- package/dist/builder.d.ts +0 -19
- package/dist/builder.d.ts.map +0 -1
- package/dist/builder.js +0 -215
- package/dist/builder.js.map +0 -1
- package/dist/mcp-server.d.ts +0 -12
- package/dist/mcp-server.d.ts.map +0 -1
- package/dist/mcp-server.js +0 -14
- package/dist/mcp-server.js.map +0 -1
- package/dist/memory-bridge.d.ts +0 -47
- package/dist/memory-bridge.d.ts.map +0 -1
- package/dist/memory-bridge.js +0 -290
- package/dist/memory-bridge.js.map +0 -1
- package/dist/runtime.d.ts +0 -80
- package/dist/runtime.d.ts.map +0 -1
- package/dist/runtime.js +0 -699
- package/dist/runtime.js.map +0 -1
- package/dist/tests/_helpers.d.ts +0 -25
- package/dist/tests/_helpers.d.ts.map +0 -1
- package/dist/tests/_helpers.js +0 -47
- package/dist/tests/_helpers.js.map +0 -1
- package/dist/tests/builder.test.d.ts +0 -2
- package/dist/tests/builder.test.d.ts.map +0 -1
- package/dist/tests/builder.test.js +0 -112
- package/dist/tests/builder.test.js.map +0 -1
- package/dist/tests/enforcement-gate.test.d.ts +0 -2
- package/dist/tests/enforcement-gate.test.d.ts.map +0 -1
- package/dist/tests/enforcement-gate.test.js +0 -328
- package/dist/tests/enforcement-gate.test.js.map +0 -1
- package/dist/tests/engine.test.d.ts +0 -2
- package/dist/tests/engine.test.d.ts.map +0 -1
- package/dist/tests/engine.test.js +0 -375
- package/dist/tests/engine.test.js.map +0 -1
- package/dist/tests/generate-schema.test.d.ts +0 -8
- package/dist/tests/generate-schema.test.d.ts.map +0 -1
- package/dist/tests/generate-schema.test.js +0 -199
- package/dist/tests/generate-schema.test.js.map +0 -1
- package/dist/tests/loop-compiler.test.d.ts +0 -2
- package/dist/tests/loop-compiler.test.d.ts.map +0 -1
- package/dist/tests/loop-compiler.test.js +0 -1059
- package/dist/tests/loop-compiler.test.js.map +0 -1
- package/dist/tests/mcp.test.d.ts +0 -7
- package/dist/tests/mcp.test.d.ts.map +0 -1
- package/dist/tests/mcp.test.js +0 -505
- package/dist/tests/mcp.test.js.map +0 -1
- package/dist/tests/memory-bridge.test.d.ts +0 -8
- package/dist/tests/memory-bridge.test.d.ts.map +0 -1
- package/dist/tests/memory-bridge.test.js +0 -383
- package/dist/tests/memory-bridge.test.js.map +0 -1
- package/dist/tests/policy.test.d.ts +0 -2
- package/dist/tests/policy.test.d.ts.map +0 -1
- package/dist/tests/policy.test.js +0 -49
- package/dist/tests/policy.test.js.map +0 -1
- package/dist/tests/protocol.test.d.ts +0 -2
- package/dist/tests/protocol.test.d.ts.map +0 -1
- package/dist/tests/protocol.test.js +0 -73
- package/dist/tests/protocol.test.js.map +0 -1
- package/dist/tests/replay.test.d.ts +0 -2
- package/dist/tests/replay.test.d.ts.map +0 -1
- package/dist/tests/replay.test.js +0 -222
- package/dist/tests/replay.test.js.map +0 -1
- package/dist/tests/runtime.test.d.ts +0 -7
- package/dist/tests/runtime.test.d.ts.map +0 -1
- package/dist/tests/runtime.test.js +0 -337
- package/dist/tests/runtime.test.js.map +0 -1
- package/dist/tests/verification-gate.test.d.ts +0 -2
- package/dist/tests/verification-gate.test.d.ts.map +0 -1
- package/dist/tests/verification-gate.test.js +0 -407
- package/dist/tests/verification-gate.test.js.map +0 -1
- package/skills/prompt-techniques/SKILL.md +0 -52
- package/skills/prompt-techniques/references/chain-of-thought.md +0 -207
- package/skills/prompt-techniques/references/few-shot.md +0 -174
- package/skills/prompt-techniques/references/least-to-most.md +0 -182
- package/skills/prompt-techniques/references/step-back.md +0 -160
- package/skills/prompt-techniques/references/tree-of-thought.md +0 -191
- package/skills/prompt-techniques/references/zero-shot.md +0 -97
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/** Schema-versioned round transaction shared by Runtime and MCP.
|
|
2
|
+
*
|
|
3
|
+
* A logical round has one deterministic roundId. Rejected attempts keep the
|
|
4
|
+
* same identity and before snapshot; only accepted decisions are committed to
|
|
5
|
+
* feedback storage. The committed feedback embeds the decision so replay after
|
|
6
|
+
* a process crash is idempotent.
|
|
7
|
+
*/
|
|
8
|
+
import { diffSnapshotCollections, extractFilesFromSnapshots, } from "./evidence-provider.js";
|
|
9
|
+
import { RoundCoordinator, } from "./round-coordinator.js";
|
|
10
|
+
import { logEvent, startSpan } from "./observability.js";
|
|
11
|
+
import { policyMetrics } from "./policy-metrics.js";
|
|
12
|
+
import { VaultRoundCommitStore } from "./storage.js";
|
|
13
|
+
export const ROUND_TRANSACTION_SCHEMA_VERSION = 1;
|
|
14
|
+
export function makeRoundId(loopId, round) {
|
|
15
|
+
if (!Number.isInteger(round) || round < 1) {
|
|
16
|
+
throw new Error(`Invalid round number: ${round}`);
|
|
17
|
+
}
|
|
18
|
+
return `loop:${loopId}:round:${round}`;
|
|
19
|
+
}
|
|
20
|
+
export function prepareRoundTransaction(loopId, round, beforeEvidence, promptArtifact) {
|
|
21
|
+
const now = Date.now();
|
|
22
|
+
return {
|
|
23
|
+
schemaVersion: ROUND_TRANSACTION_SCHEMA_VERSION,
|
|
24
|
+
roundId: makeRoundId(loopId, round),
|
|
25
|
+
loopId,
|
|
26
|
+
round,
|
|
27
|
+
attempt: 1,
|
|
28
|
+
phase: promptArtifact ? "prompted" : "prepared",
|
|
29
|
+
beforeEvidence,
|
|
30
|
+
createdAt: now,
|
|
31
|
+
updatedAt: now,
|
|
32
|
+
promptArtifact,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** Attach the next prompt attempt to a rejected logical round without changing
|
|
36
|
+
* its identity or evidence baseline. Evaluation fields belong to the previous
|
|
37
|
+
* attempt and are cleared before the Agent receives the retry prompt. */
|
|
38
|
+
export function prepareRejectedAttempt(rejected, promptArtifact) {
|
|
39
|
+
if (rejected.phase !== "rejected") {
|
|
40
|
+
throw new Error(`Cannot retry transaction in phase ${rejected.phase}`);
|
|
41
|
+
}
|
|
42
|
+
if (promptArtifact.roundId !== rejected.roundId) {
|
|
43
|
+
throw new Error(`Retry prompt identity mismatch: ${promptArtifact.roundId} !== ${rejected.roundId}`);
|
|
44
|
+
}
|
|
45
|
+
if (promptArtifact.attempt !== rejected.attempt + 1) {
|
|
46
|
+
throw new Error(`Retry prompt attempt mismatch: ${promptArtifact.attempt} !== ${rejected.attempt + 1}`);
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
...rejected,
|
|
50
|
+
attempt: promptArtifact.attempt,
|
|
51
|
+
phase: "prompted",
|
|
52
|
+
afterEvidence: undefined,
|
|
53
|
+
roundEvidence: undefined,
|
|
54
|
+
evaluation: undefined,
|
|
55
|
+
result: undefined,
|
|
56
|
+
promptArtifact,
|
|
57
|
+
updatedAt: Date.now(),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function isRecord(value) {
|
|
61
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
62
|
+
}
|
|
63
|
+
function isProcessResult(value) {
|
|
64
|
+
if (!isRecord(value))
|
|
65
|
+
return false;
|
|
66
|
+
return ["continue", "stop", "reject", "terminate"].includes(String(value.action)) && Array.isArray(value.verificationFlags);
|
|
67
|
+
}
|
|
68
|
+
function parseProviderSnapshots(value) {
|
|
69
|
+
if (!Array.isArray(value))
|
|
70
|
+
return null;
|
|
71
|
+
const snapshots = [];
|
|
72
|
+
for (const item of value) {
|
|
73
|
+
if (!isRecord(item))
|
|
74
|
+
return null;
|
|
75
|
+
if (typeof item.provider !== "string" ||
|
|
76
|
+
typeof item.timestamp !== "number" ||
|
|
77
|
+
!Array.isArray(item.files) ||
|
|
78
|
+
!item.files.every((file) => typeof file === "string") ||
|
|
79
|
+
!isRecord(item.data))
|
|
80
|
+
return null;
|
|
81
|
+
snapshots.push(item);
|
|
82
|
+
}
|
|
83
|
+
return snapshots;
|
|
84
|
+
}
|
|
85
|
+
/** Parse a persisted snapshot without trusting arbitrary vault data. */
|
|
86
|
+
export function parseRoundTransactionSnapshot(value) {
|
|
87
|
+
if (!isRecord(value))
|
|
88
|
+
return null;
|
|
89
|
+
if (value.schemaVersion !== ROUND_TRANSACTION_SCHEMA_VERSION)
|
|
90
|
+
return null;
|
|
91
|
+
if (typeof value.roundId !== "string" || typeof value.loopId !== "string") {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
if (!Number.isInteger(value.round) || value.round < 1)
|
|
95
|
+
return null;
|
|
96
|
+
if (!Number.isInteger(value.attempt) || value.attempt < 1)
|
|
97
|
+
return null;
|
|
98
|
+
if (!["prepared", "prompted", "evaluated", "rejected", "committed", "terminated"]
|
|
99
|
+
.includes(String(value.phase)))
|
|
100
|
+
return null;
|
|
101
|
+
const beforeEvidence = parseProviderSnapshots(value.beforeEvidence);
|
|
102
|
+
if (!beforeEvidence)
|
|
103
|
+
return null;
|
|
104
|
+
const afterEvidence = value.afterEvidence === undefined
|
|
105
|
+
? undefined
|
|
106
|
+
: parseProviderSnapshots(value.afterEvidence);
|
|
107
|
+
if (value.afterEvidence !== undefined && !afterEvidence)
|
|
108
|
+
return null;
|
|
109
|
+
const roundEvidence = value.roundEvidence === undefined
|
|
110
|
+
? undefined
|
|
111
|
+
: parseProviderSnapshots(value.roundEvidence);
|
|
112
|
+
if (value.roundEvidence !== undefined && !roundEvidence)
|
|
113
|
+
return null;
|
|
114
|
+
if (value.result !== undefined && !isProcessResult(value.result))
|
|
115
|
+
return null;
|
|
116
|
+
if (value.promptArtifact !== undefined) {
|
|
117
|
+
if (!isRecord(value.promptArtifact))
|
|
118
|
+
return null;
|
|
119
|
+
const artifact = value.promptArtifact;
|
|
120
|
+
if (artifact.schemaVersion !== 1 ||
|
|
121
|
+
typeof artifact.roundId !== "string" ||
|
|
122
|
+
typeof artifact.renderedPrompt !== "string" ||
|
|
123
|
+
typeof artifact.promptHash !== "string" ||
|
|
124
|
+
typeof artifact.stateHash !== "string" ||
|
|
125
|
+
!["l0", "l1", "l2"].includes(String(artifact.level)))
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
const snapshot = {
|
|
129
|
+
...value,
|
|
130
|
+
beforeEvidence,
|
|
131
|
+
afterEvidence,
|
|
132
|
+
roundEvidence,
|
|
133
|
+
};
|
|
134
|
+
if (snapshot.roundId !== makeRoundId(snapshot.loopId, snapshot.round)) {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
return snapshot;
|
|
138
|
+
}
|
|
139
|
+
export class RoundTransactionCoordinator {
|
|
140
|
+
engine;
|
|
141
|
+
backend;
|
|
142
|
+
commitStore;
|
|
143
|
+
constructor(engine, backend, commitStore) {
|
|
144
|
+
this.engine = engine;
|
|
145
|
+
this.backend = backend ?? engine.getBackend();
|
|
146
|
+
this.commitStore = commitStore ?? new VaultRoundCommitStore(this.backend);
|
|
147
|
+
}
|
|
148
|
+
process(input) {
|
|
149
|
+
const { snapshot } = input;
|
|
150
|
+
const span = startSpan("round.transaction", {
|
|
151
|
+
loopId: snapshot.loopId,
|
|
152
|
+
round: snapshot.round,
|
|
153
|
+
roundId: snapshot.roundId,
|
|
154
|
+
attempt: snapshot.attempt,
|
|
155
|
+
});
|
|
156
|
+
const finish = (outcome) => {
|
|
157
|
+
policyMetrics.recordRound(snapshot.loopId, outcome.result, outcome.replayed);
|
|
158
|
+
span.end("ok", {
|
|
159
|
+
action: outcome.result.action,
|
|
160
|
+
replayed: outcome.replayed,
|
|
161
|
+
phase: outcome.snapshot.phase,
|
|
162
|
+
});
|
|
163
|
+
return outcome;
|
|
164
|
+
};
|
|
165
|
+
try {
|
|
166
|
+
const expectedRoundId = makeRoundId(snapshot.loopId, snapshot.round);
|
|
167
|
+
if (snapshot.roundId !== expectedRoundId) {
|
|
168
|
+
throw new Error(`Round snapshot identity mismatch: ${snapshot.roundId} !== ${expectedRoundId}`);
|
|
169
|
+
}
|
|
170
|
+
const committed = this.readCommitted(snapshot);
|
|
171
|
+
if (committed) {
|
|
172
|
+
logEvent("round_transaction_replay", {
|
|
173
|
+
loopId: snapshot.loopId,
|
|
174
|
+
round: snapshot.round,
|
|
175
|
+
roundId: snapshot.roundId,
|
|
176
|
+
});
|
|
177
|
+
return finish(committed);
|
|
178
|
+
}
|
|
179
|
+
const attempt = snapshot.phase === "rejected"
|
|
180
|
+
? snapshot.attempt + 1
|
|
181
|
+
: snapshot.attempt;
|
|
182
|
+
const roundEvidence = diffSnapshotCollections(snapshot.beforeEvidence, input.actualEvidence);
|
|
183
|
+
const coordinator = new RoundCoordinator(this.backend);
|
|
184
|
+
const result = coordinator.processRound({
|
|
185
|
+
loopId: snapshot.loopId,
|
|
186
|
+
task: input.task,
|
|
187
|
+
currentRound: snapshot.round,
|
|
188
|
+
maxRounds: input.maxRounds,
|
|
189
|
+
selfEval: input.selfEval,
|
|
190
|
+
extractionSucceeded: input.extractionSucceeded,
|
|
191
|
+
lastSelfEval: input.lastSelfEval,
|
|
192
|
+
consecutiveRejections: input.consecutiveRejections,
|
|
193
|
+
runtimeFilesChanged: extractFilesFromSnapshots(roundEvidence),
|
|
194
|
+
evidenceSnapshots: roundEvidence,
|
|
195
|
+
successTrajectory: input.successTrajectory,
|
|
196
|
+
});
|
|
197
|
+
const evaluated = {
|
|
198
|
+
...snapshot,
|
|
199
|
+
attempt,
|
|
200
|
+
phase: "evaluated",
|
|
201
|
+
afterEvidence: input.actualEvidence,
|
|
202
|
+
roundEvidence,
|
|
203
|
+
evaluation: input.selfEval,
|
|
204
|
+
result,
|
|
205
|
+
updatedAt: Date.now(),
|
|
206
|
+
};
|
|
207
|
+
if (result.action === "reject" || result.action === "terminate") {
|
|
208
|
+
const terminalPhase = result.action === "reject" ? "rejected" : "terminated";
|
|
209
|
+
return finish({
|
|
210
|
+
snapshot: { ...evaluated, phase: terminalPhase, updatedAt: Date.now() },
|
|
211
|
+
result,
|
|
212
|
+
replayed: false,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
const committedSnapshot = {
|
|
216
|
+
...evaluated,
|
|
217
|
+
phase: "committed",
|
|
218
|
+
updatedAt: Date.now(),
|
|
219
|
+
};
|
|
220
|
+
const metadata = {
|
|
221
|
+
schema_version: ROUND_TRANSACTION_SCHEMA_VERSION,
|
|
222
|
+
round_id: snapshot.roundId,
|
|
223
|
+
snapshot: committedSnapshot,
|
|
224
|
+
result,
|
|
225
|
+
};
|
|
226
|
+
this.engine.autoFeedback(input.selfEval, snapshot.loopId, snapshot.round, input.task, metadata);
|
|
227
|
+
const persisted = this.readCommitted(committedSnapshot);
|
|
228
|
+
if (!persisted) {
|
|
229
|
+
throw new Error(`Round transaction commit failed: ${snapshot.roundId}`);
|
|
230
|
+
}
|
|
231
|
+
logEvent("round_transaction_commit", {
|
|
232
|
+
loopId: snapshot.loopId,
|
|
233
|
+
round: snapshot.round,
|
|
234
|
+
roundId: snapshot.roundId,
|
|
235
|
+
action: result.action,
|
|
236
|
+
});
|
|
237
|
+
return finish({ snapshot: committedSnapshot, result, replayed: false });
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
span.end("error", { error: String(error) });
|
|
241
|
+
throw error;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/** Recover an already committed decision without evaluating or writing. */
|
|
245
|
+
recover(snapshot) {
|
|
246
|
+
const span = startSpan("round.transaction.recover", {
|
|
247
|
+
loopId: snapshot.loopId,
|
|
248
|
+
round: snapshot.round,
|
|
249
|
+
roundId: snapshot.roundId,
|
|
250
|
+
});
|
|
251
|
+
try {
|
|
252
|
+
const outcome = this.readCommitted(snapshot);
|
|
253
|
+
if (outcome) {
|
|
254
|
+
policyMetrics.recordRound(snapshot.loopId, outcome.result, true);
|
|
255
|
+
}
|
|
256
|
+
span.end("ok", { recovered: outcome !== null });
|
|
257
|
+
return outcome;
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
span.end("error", { error: String(error) });
|
|
261
|
+
throw error;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
readCommitted(expected) {
|
|
265
|
+
const taskId = `loop:${expected.loopId}:r${expected.round}:feedback`;
|
|
266
|
+
const entries = this.commitStore.find(expected.loopId, expected.round);
|
|
267
|
+
for (const entry of entries) {
|
|
268
|
+
if (entry.task_id !== taskId)
|
|
269
|
+
continue;
|
|
270
|
+
const outcome = this.outcomeFromEntry(entry, expected.roundId);
|
|
271
|
+
if (outcome)
|
|
272
|
+
return outcome;
|
|
273
|
+
}
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
outcomeFromEntry(entry, expectedRoundId) {
|
|
277
|
+
const lineage = isRecord(entry.loop_lineage) ? entry.loop_lineage : null;
|
|
278
|
+
const transaction = lineage && isRecord(lineage.round_transaction)
|
|
279
|
+
? lineage.round_transaction
|
|
280
|
+
: null;
|
|
281
|
+
if (!transaction || transaction.round_id !== expectedRoundId)
|
|
282
|
+
return null;
|
|
283
|
+
const snapshot = parseRoundTransactionSnapshot(transaction.snapshot);
|
|
284
|
+
const result = transaction.result;
|
|
285
|
+
if (!snapshot || !isProcessResult(result))
|
|
286
|
+
return null;
|
|
287
|
+
return { snapshot, result, replayed: true };
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=round-transaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"round-transaction.js","sourceRoot":"","sources":["../src/round-transaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** Self-evaluation extraction and parsing — pure functions.
|
|
2
|
+
*
|
|
3
|
+
* These functions parse an Agent's raw output into a structured
|
|
4
|
+
* SelfEvaluation. They have no dependency on Engine state, file I/O,
|
|
5
|
+
* or external services. They are shared by both the MCP tool handler
|
|
6
|
+
* (which receives structured JSON directly) and the legacy invoke
|
|
7
|
+
* path (which regex-scans free-text Agent output).
|
|
8
|
+
*/
|
|
9
|
+
import { type CriterionRevision, type ExecutionEvidence, type SelfEvaluation } from "./protocol.js";
|
|
10
|
+
/** Parse ExecutionEvidence from a raw JSON object. */
|
|
11
|
+
export declare function parseExecutionEvidence(raw: Record<string, unknown> | undefined | null): ExecutionEvidence | undefined;
|
|
12
|
+
/** Parse CriterionRevision[] from a raw JSON array. */
|
|
13
|
+
export declare function parseCriterionRevisions(raw: unknown): CriterionRevision[];
|
|
14
|
+
/** Parse WorkerResult[] from a raw JSON array. */
|
|
15
|
+
export declare function parseWorkerResults(raw: unknown): import("./protocol.js").WorkerResult[];
|
|
16
|
+
/** Extract a structured SelfEvaluation from agent output text.
|
|
17
|
+
* Returns null if no valid self-eval block is found.
|
|
18
|
+
* The agent is instructed to output JSON between the delimiters. */
|
|
19
|
+
export declare function extractSelfEvaluation(text: string): SelfEvaluation | null;
|
|
20
|
+
/** Build a SelfEvaluation from a parsed JSON object.
|
|
21
|
+
* Lenient parsing: missing optional fields get sensible defaults. */
|
|
22
|
+
export declare function buildSelfEvaluation(raw: Record<string, unknown>): SelfEvaluation;
|
|
23
|
+
/** Fallback heuristic when structured self-eval extraction fails.
|
|
24
|
+
* Scans agent output for completion and error signals. */
|
|
25
|
+
export declare function heuristicSelfEvaluation(text: string): SelfEvaluation | null;
|
|
26
|
+
//# sourceMappingURL=self-eval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-eval.d.ts","sourceRoot":"","sources":["../src/self-eval.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAIL,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACpB,MAAM,eAAe,CAAC;AAIvB,sDAAsD;AACtD,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,GAC9C,iBAAiB,GAAG,SAAS,CAwB/B;AAED,uDAAuD;AACvD,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,OAAO,GACX,iBAAiB,EAAE,CAWrB;AAED,kDAAkD;AAClD,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,OAAO,GACX,OAAO,eAAe,EAAE,YAAY,EAAE,CAqBxC;AAID;;qEAEqE;AACrE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAczE;AAED;sEACsE;AACtE,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,cAAc,CA0ChB;AAED;2DAC2D;AAC3D,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAoB3E"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/** Self-evaluation extraction and parsing — pure functions.
|
|
2
|
+
*
|
|
3
|
+
* These functions parse an Agent's raw output into a structured
|
|
4
|
+
* SelfEvaluation. They have no dependency on Engine state, file I/O,
|
|
5
|
+
* or external services. They are shared by both the MCP tool handler
|
|
6
|
+
* (which receives structured JSON directly) and the legacy invoke
|
|
7
|
+
* path (which regex-scans free-text Agent output).
|
|
8
|
+
*/
|
|
9
|
+
import { makeExecutionEvidence, makeSelfEvaluation, SELF_EVAL_REGEX, } from "./protocol.js";
|
|
10
|
+
// ── Raw parsing helpers ───────────────────────────────────────────────────
|
|
11
|
+
/** Parse ExecutionEvidence from a raw JSON object. */
|
|
12
|
+
export function parseExecutionEvidence(raw) {
|
|
13
|
+
if (!raw || typeof raw !== "object")
|
|
14
|
+
return undefined;
|
|
15
|
+
const testResults = raw.test_results;
|
|
16
|
+
return makeExecutionEvidence({
|
|
17
|
+
files_changed: Array.isArray(raw.files_changed)
|
|
18
|
+
? raw.files_changed.filter((v) => typeof v === "string")
|
|
19
|
+
: [],
|
|
20
|
+
test_results: testResults && typeof testResults.passed === "number"
|
|
21
|
+
? {
|
|
22
|
+
passed: testResults.passed,
|
|
23
|
+
failed: testResults.failed ?? 0,
|
|
24
|
+
skipped: testResults.skipped ?? 0,
|
|
25
|
+
}
|
|
26
|
+
: null,
|
|
27
|
+
success_criteria_met: Array.isArray(raw.success_criteria_met)
|
|
28
|
+
? raw.success_criteria_met.filter((v) => typeof v === "string")
|
|
29
|
+
: [],
|
|
30
|
+
success_criteria_remaining: Array.isArray(raw.success_criteria_remaining)
|
|
31
|
+
? raw.success_criteria_remaining.filter((v) => typeof v === "string")
|
|
32
|
+
: [],
|
|
33
|
+
progress_estimate: typeof raw.progress_estimate === "number"
|
|
34
|
+
? Math.max(0, Math.min(1, raw.progress_estimate))
|
|
35
|
+
: 0.0,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/** Parse CriterionRevision[] from a raw JSON array. */
|
|
39
|
+
export function parseCriterionRevisions(raw) {
|
|
40
|
+
if (!Array.isArray(raw))
|
|
41
|
+
return [];
|
|
42
|
+
return raw
|
|
43
|
+
.filter((v) => typeof v === "object" && v !== null &&
|
|
44
|
+
typeof v.old === "string" &&
|
|
45
|
+
typeof v.new === "string")
|
|
46
|
+
.map((v) => {
|
|
47
|
+
const r = v;
|
|
48
|
+
return { old: r.old, new: r.new };
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
/** Parse WorkerResult[] from a raw JSON array. */
|
|
52
|
+
export function parseWorkerResults(raw) {
|
|
53
|
+
if (!Array.isArray(raw))
|
|
54
|
+
return [];
|
|
55
|
+
return raw
|
|
56
|
+
.filter((v) => typeof v === "object" && v !== null &&
|
|
57
|
+
typeof v.agentId === "string" &&
|
|
58
|
+
typeof v.subTask === "string" &&
|
|
59
|
+
typeof v.resultSummary === "string")
|
|
60
|
+
.map((v) => {
|
|
61
|
+
const w = v;
|
|
62
|
+
return {
|
|
63
|
+
agentId: w.agentId,
|
|
64
|
+
subAgentType: typeof w.subAgentType === "string" ? w.subAgentType : "general-purpose",
|
|
65
|
+
subTask: w.subTask,
|
|
66
|
+
resultSummary: w.resultSummary,
|
|
67
|
+
success: typeof w.success === "boolean" ? w.success : false,
|
|
68
|
+
discoveredConstraints: Array.isArray(w.discoveredConstraints)
|
|
69
|
+
? w.discoveredConstraints.filter((c) => typeof c === "string")
|
|
70
|
+
: [],
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
// ── Self-evaluation extraction ───────────────────────────────────────────
|
|
75
|
+
/** Extract a structured SelfEvaluation from agent output text.
|
|
76
|
+
* Returns null if no valid self-eval block is found.
|
|
77
|
+
* The agent is instructed to output JSON between the delimiters. */
|
|
78
|
+
export function extractSelfEvaluation(text) {
|
|
79
|
+
const match = text.match(SELF_EVAL_REGEX);
|
|
80
|
+
if (!match)
|
|
81
|
+
return null;
|
|
82
|
+
try {
|
|
83
|
+
const raw = JSON.parse(match[1]);
|
|
84
|
+
if (typeof raw.success !== "boolean")
|
|
85
|
+
return null;
|
|
86
|
+
if (typeof raw.output_summary !== "string")
|
|
87
|
+
return null;
|
|
88
|
+
if (!Array.isArray(raw.constraint_violations))
|
|
89
|
+
return null;
|
|
90
|
+
if (typeof raw.should_continue !== "boolean")
|
|
91
|
+
return null;
|
|
92
|
+
return buildSelfEvaluation(raw);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** Build a SelfEvaluation from a parsed JSON object.
|
|
99
|
+
* Lenient parsing: missing optional fields get sensible defaults. */
|
|
100
|
+
export function buildSelfEvaluation(raw) {
|
|
101
|
+
const executionEvidence = parseExecutionEvidence(raw.execution_evidence);
|
|
102
|
+
const retractedConstraints = Array.isArray(raw.retracted_constraints)
|
|
103
|
+
? raw.retracted_constraints.filter((v) => typeof v === "string")
|
|
104
|
+
: [];
|
|
105
|
+
const revisedCriteria = parseCriterionRevisions(raw.revised_success_criteria);
|
|
106
|
+
const wrongAssumptions = Array.isArray(raw.wrong_assumptions)
|
|
107
|
+
? raw.wrong_assumptions.filter((v) => typeof v === "string")
|
|
108
|
+
: [];
|
|
109
|
+
const workerResults = parseWorkerResults(raw.worker_results);
|
|
110
|
+
return makeSelfEvaluation({
|
|
111
|
+
success: typeof raw.success === "boolean" ? raw.success : false,
|
|
112
|
+
output_summary: typeof raw.output_summary === "string" ? raw.output_summary : "",
|
|
113
|
+
constraint_violations: Array.isArray(raw.constraint_violations)
|
|
114
|
+
? raw.constraint_violations.filter((v) => typeof v === "string")
|
|
115
|
+
: [],
|
|
116
|
+
should_continue: typeof raw.should_continue === "boolean" ? raw.should_continue : true,
|
|
117
|
+
discovered_constraints: Array.isArray(raw.discovered_constraints)
|
|
118
|
+
? raw.discovered_constraints.filter((v) => typeof v === "string")
|
|
119
|
+
: [],
|
|
120
|
+
objective_refinement: typeof raw.objective_refinement === "string"
|
|
121
|
+
? raw.objective_refinement
|
|
122
|
+
: "",
|
|
123
|
+
emerged_subtasks: Array.isArray(raw.emerged_subtasks)
|
|
124
|
+
? raw.emerged_subtasks.filter((v) => typeof v === "string")
|
|
125
|
+
: [],
|
|
126
|
+
execution_evidence: executionEvidence,
|
|
127
|
+
retracted_constraints: retractedConstraints,
|
|
128
|
+
revised_success_criteria: revisedCriteria,
|
|
129
|
+
wrong_assumptions: wrongAssumptions,
|
|
130
|
+
worker_results: workerResults,
|
|
131
|
+
compression_checkpoint: typeof raw.compression_checkpoint === "boolean" ? raw.compression_checkpoint : false,
|
|
132
|
+
checkpoint_label: typeof raw.checkpoint_label === "string" ? raw.checkpoint_label : "",
|
|
133
|
+
next_action: typeof raw.next_action === "string" ? raw.next_action : undefined,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
/** Fallback heuristic when structured self-eval extraction fails.
|
|
137
|
+
* Scans agent output for completion and error signals. */
|
|
138
|
+
export function heuristicSelfEvaluation(text) {
|
|
139
|
+
const lower = text.toLowerCase();
|
|
140
|
+
const hasError = /error|failed|exception|cannot|unable|失败|错误|异常/.test(lower);
|
|
141
|
+
const hasCompletion = /done|complete|finished|完成|成功/.test(lower);
|
|
142
|
+
const hasRemaining = /remaining|continue|still need|next|todo|剩余|继续|下一步/.test(lower);
|
|
143
|
+
const paragraphs = text.split(/\n\n+/).filter((p) => p.trim().length > 30);
|
|
144
|
+
const summary = paragraphs.length > 0
|
|
145
|
+
? paragraphs[paragraphs.length - 1].trim().slice(0, 300)
|
|
146
|
+
: text.trim().slice(0, 300);
|
|
147
|
+
return makeSelfEvaluation({
|
|
148
|
+
success: !hasError && (hasCompletion || !hasRemaining),
|
|
149
|
+
output_summary: summary || "[heuristic fallback — could not parse structured self-eval]",
|
|
150
|
+
constraint_violations: [],
|
|
151
|
+
should_continue: hasRemaining && !hasError,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=self-eval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-eval.js","sourceRoot":"","sources":["../src/self-eval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** Persistence adapters for session state and committed round lookup. */
|
|
2
|
+
import type { VaultBackend, VaultEntry } from "./backends/interface.js";
|
|
3
|
+
import type { LoopStore } from "./loop-store.js";
|
|
4
|
+
export interface SessionStateStore {
|
|
5
|
+
load(loopId: string): VaultEntry | undefined;
|
|
6
|
+
list(): VaultEntry[];
|
|
7
|
+
save(entry: VaultEntry, options?: SessionSaveOptions): void;
|
|
8
|
+
acquireLease?(loopId: string, ownerId: string, leaseMs: number, now?: number): VaultEntry | undefined;
|
|
9
|
+
renewLease?(loopId: string, ownerId: string, leaseMs: number, now?: number): boolean;
|
|
10
|
+
releaseLease?(loopId: string, ownerId: string): boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface SessionSaveOptions {
|
|
13
|
+
/** Reject a write if another process owns the existing session entry. */
|
|
14
|
+
expectedLeaseOwner?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare class SessionLeaseConflictError extends Error {
|
|
17
|
+
readonly loopId: string;
|
|
18
|
+
constructor(loopId: string);
|
|
19
|
+
}
|
|
20
|
+
export interface RoundCommitStore {
|
|
21
|
+
find(loopId: string, round: number): VaultEntry[];
|
|
22
|
+
}
|
|
23
|
+
export declare class VaultSessionStateStore implements SessionStateStore {
|
|
24
|
+
private readonly store;
|
|
25
|
+
constructor(store: LoopStore);
|
|
26
|
+
load(loopId: string): VaultEntry | undefined;
|
|
27
|
+
list(): VaultEntry[];
|
|
28
|
+
save(entry: VaultEntry, options?: SessionSaveOptions): void;
|
|
29
|
+
acquireLease(loopId: string, ownerId: string, leaseMs: number, now?: number): VaultEntry | undefined;
|
|
30
|
+
renewLease(loopId: string, ownerId: string, leaseMs: number, now?: number): boolean;
|
|
31
|
+
releaseLease(loopId: string, ownerId: string): boolean;
|
|
32
|
+
private lineage;
|
|
33
|
+
}
|
|
34
|
+
export declare class VaultRoundCommitStore implements RoundCommitStore {
|
|
35
|
+
private readonly backend;
|
|
36
|
+
constructor(backend: VaultBackend);
|
|
37
|
+
find(loopId: string, round: number): VaultEntry[];
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAuB,MAAM,iBAAiB,CAAC;AAgBtE,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAC7C,IAAI,IAAI,UAAU,EAAE,CAAC;IACrB,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC5D,YAAY,CAAC,CACX,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,GACX,UAAU,GAAG,SAAS,CAAC;IAC1B,UAAU,CAAC,CACT,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC;IACX,YAAY,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;CACzD;AAED,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,qBAAa,yBAA0B,SAAQ,KAAK;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM;CAIpC;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,CAAC;CACnD;AAED,qBAAa,sBAAuB,YAAW,iBAAiB;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,SAAS;IAE7C,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAK5C,IAAI,IAAI,UAAU,EAAE;IASpB,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,IAAI;IA2B/D,YAAY,CACV,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,GAAG,SAAa,GACf,UAAU,GAAG,SAAS;IA6CzB,UAAU,CACR,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,GAAG,SAAa,GACf,OAAO;IA4BV,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IA6BtD,OAAO,CAAC,OAAO;CAOhB;AAED,qBAAa,qBAAsB,YAAW,gBAAgB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,YAAY;IAElD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE;CAMlD"}
|