loopforge 1.12.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +172 -95
- package/dist/backends/interface.d.ts +3 -9
- package/dist/backends/interface.d.ts.map +1 -1
- package/dist/backends/interface.js +1 -5
- 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 +44 -0
- package/dist/enforcement-gate.d.ts.map +1 -0
- package/dist/enforcement-gate.js +271 -0
- package/dist/enforcement-gate.js.map +1 -0
- package/dist/engine.d.ts +17 -7
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +158 -249
- package/dist/engine.js.map +1 -1
- package/dist/evidence-provider.d.ts +113 -0
- package/dist/evidence-provider.d.ts.map +1 -0
- package/dist/evidence-provider.js +419 -0
- package/dist/evidence-provider.js.map +1 -0
- package/dist/index.d.ts +19 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -10
- 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 +30 -0
- package/dist/interop.d.ts.map +1 -0
- package/dist/interop.js +29 -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 +307 -2001
- package/dist/loop-compiler.js.map +1 -1
- package/dist/loop-store.d.ts +82 -0
- package/dist/loop-store.d.ts.map +1 -0
- package/dist/loop-store.js +332 -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 +84 -20
- package/dist/mcp/session.d.ts.map +1 -1
- package/dist/mcp/session.js +718 -316
- 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 +225 -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 +58 -75
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +122 -93
- 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 +257 -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 +117 -91
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +40 -36
- 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/runtime.d.ts +35 -17
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +357 -344
- package/dist/runtime.js.map +1 -1
- package/dist/storage.d.ts +38 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +201 -0
- package/dist/storage.js.map +1 -0
- package/dist/verification-gate.d.ts +39 -7
- package/dist/verification-gate.d.ts.map +1 -1
- package/dist/verification-gate.js +198 -9
- package/dist/verification-gate.js.map +1 -1
- package/loop_policy.json +26 -47
- package/package.json +13 -10
- package/skills/perception/SKILL.md +80 -249
- package/dist/backends/fs.d.ts +0 -36
- package/dist/backends/fs.d.ts.map +0 -1
- package/dist/backends/fs.js +0 -358
- package/dist/backends/fs.js.map +0 -1
- package/dist/builder.d.ts +0 -12
- package/dist/builder.d.ts.map +0 -1
- package/dist/builder.js +0 -259
- 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/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 -110
- package/dist/tests/builder.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 -371
- 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 -1051
- 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 -485
- 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 -323
- 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,90 @@
|
|
|
1
|
+
/** RoundCoordinator — Unified round-boundary state machine (v1.17).
|
|
2
|
+
*
|
|
3
|
+
* Encapsulates the shared round processing pipeline used by both
|
|
4
|
+
* LoopRuntime (runtime.ts) and SessionManager (mcp/session.ts):
|
|
5
|
+
*
|
|
6
|
+
* verify → enforce → stop decision
|
|
7
|
+
*
|
|
8
|
+
* Before this module, runtime.ts and session.ts each maintained their
|
|
9
|
+
* own copy of the pipeline (~60 lines each). Drift between the two
|
|
10
|
+
* paths (e.g. git verification only wired into one side) was a known
|
|
11
|
+
* risk. The RoundCoordinator is the single source of truth.
|
|
12
|
+
*
|
|
13
|
+
* State transitions:
|
|
14
|
+
* RoundStarted → EvidenceCaptured → EvaluationSubmitted
|
|
15
|
+
* → VerificationCompleted → EnforcementDecided
|
|
16
|
+
*
|
|
17
|
+
* Persistence is owned by round-transaction.ts so reject paths remain
|
|
18
|
+
* side-effect free and accepted decisions can be replayed idempotently.
|
|
19
|
+
*/
|
|
20
|
+
import type { VaultBackend } from "./backends/interface.js";
|
|
21
|
+
import type { ProviderSnapshot } from "./evidence-provider.js";
|
|
22
|
+
import type { SelfEvaluation, StopReason, VerificationFlag } from "./protocol.js";
|
|
23
|
+
/** Input to a single round processing step. */
|
|
24
|
+
export interface RoundProcessInput {
|
|
25
|
+
loopId: string;
|
|
26
|
+
task: string;
|
|
27
|
+
currentRound: number;
|
|
28
|
+
maxRounds: number;
|
|
29
|
+
/** The agent's self-evaluation for this round. */
|
|
30
|
+
selfEval: SelfEvaluation;
|
|
31
|
+
/** Whether structured extraction succeeded (false = heuristic fallback). */
|
|
32
|
+
extractionSucceeded: boolean;
|
|
33
|
+
/** The previous round's validated SelfEvaluation (null for round 1). */
|
|
34
|
+
lastSelfEval?: SelfEvaluation;
|
|
35
|
+
/** How many consecutive rounds have been rejected by enforcement. */
|
|
36
|
+
consecutiveRejections: number;
|
|
37
|
+
/** v1.16: Files detected as changed by git diff. null if git unavailable. */
|
|
38
|
+
runtimeFilesChanged?: string[] | null;
|
|
39
|
+
/** v1.18: Evidence snapshots from configured providers. */
|
|
40
|
+
evidenceSnapshots?: ProviderSnapshot[];
|
|
41
|
+
/** Success values from already committed rounds. */
|
|
42
|
+
successTrajectory?: boolean[];
|
|
43
|
+
}
|
|
44
|
+
/** Result of processing a round through the coordinator. */
|
|
45
|
+
export interface RoundProcessResult {
|
|
46
|
+
/** What the caller should do next. */
|
|
47
|
+
action: "continue" | "stop" | "reject" | "terminate";
|
|
48
|
+
/** Reason for stop (set when action is "stop" or "terminate"). */
|
|
49
|
+
stopReason?: StopReason;
|
|
50
|
+
/** Rejection prompt (set when action is "reject"). */
|
|
51
|
+
rejectionPrompt?: string;
|
|
52
|
+
/** Verification flags from this round (for injection into next prompt). */
|
|
53
|
+
verificationFlags: VerificationFlag[];
|
|
54
|
+
/** Enforcement action for observability. */
|
|
55
|
+
enforcementAction?: "accept" | "reject" | "terminate";
|
|
56
|
+
/** Enforcement reason (set when rejected or terminated). */
|
|
57
|
+
enforcementReason?: string;
|
|
58
|
+
/** Whether this round was successful (from selfEval.success). */
|
|
59
|
+
roundSuccess: boolean;
|
|
60
|
+
/** Whether the verification gate returned "contradicted". */
|
|
61
|
+
gateContradicted: boolean;
|
|
62
|
+
/** Updated consecutiveRejections count — caller must persist. */
|
|
63
|
+
newConsecutiveRejections: number;
|
|
64
|
+
/** Which enforcement check fired (set when action is "reject" or "terminate").
|
|
65
|
+
* Used by callers to track per-rule rejection counters. */
|
|
66
|
+
rejectionCheck?: string;
|
|
67
|
+
/** The selfEval to store as lastSelfEval for the next round
|
|
68
|
+
* (undefined when action is "reject" — caller should NOT update). */
|
|
69
|
+
newLastSelfEval?: SelfEvaluation;
|
|
70
|
+
/** Whether the caller should push roundSuccess onto the success trajectory.
|
|
71
|
+
* false when gateContradicted or when action is "reject". */
|
|
72
|
+
shouldPushSuccessTrajectory: boolean;
|
|
73
|
+
}
|
|
74
|
+
export declare class RoundCoordinator {
|
|
75
|
+
private backend;
|
|
76
|
+
constructor(backend?: VaultBackend);
|
|
77
|
+
/** Process a single round's self-evaluation through the decision pipeline:
|
|
78
|
+
* verify → enforce → stop decision.
|
|
79
|
+
*
|
|
80
|
+
* This is the single entry point called by both LoopRuntime and
|
|
81
|
+
* SessionManager. The caller is responsible for:
|
|
82
|
+
* - Compiling the next prompt (if action is "continue")
|
|
83
|
+
* - Managing heartbeat / signal handlers (runtime only)
|
|
84
|
+
* - Memory injection (both paths, before calling processRound)
|
|
85
|
+
* - Transactional feedback commit (accepted rounds only)
|
|
86
|
+
* - State file I/O (both paths, after compiling)
|
|
87
|
+
*/
|
|
88
|
+
processRound(input: RoundProcessInput): RoundProcessResult;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=round-coordinator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"round-coordinator.d.ts","sourceRoot":"","sources":["../src/round-coordinator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,yBAAyB,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAEV,cAAc,EACd,UAAU,EACV,gBAAgB,EAEjB,MAAM,eAAe,CAAC;AAQvB,+CAA+C;AAC/C,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,QAAQ,EAAE,cAAc,CAAC;IACzB,4EAA4E;IAC5E,mBAAmB,EAAE,OAAO,CAAC;IAC7B,wEAAwE;IACxE,YAAY,CAAC,EAAE,cAAc,CAAC;IAC9B,qEAAqE;IACrE,qBAAqB,EAAE,MAAM,CAAC;IAC9B,6EAA6E;IAC7E,mBAAmB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACtC,2DAA2D;IAC3D,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACvC,oDAAoD;IACpD,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC;CAC/B;AAED,4DAA4D;AAC5D,MAAM,WAAW,kBAAkB;IACjC,sCAAsC;IACtC,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC;IACrD,kEAAkE;IAClE,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,sDAAsD;IACtD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2EAA2E;IAC3E,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,4CAA4C;IAC5C,iBAAiB,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;IACtD,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iEAAiE;IACjE,YAAY,EAAE,OAAO,CAAC;IACtB,6DAA6D;IAC7D,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iEAAiE;IACjE,wBAAwB,EAAE,MAAM,CAAC;IACjC;gEAC4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;0EACsE;IACtE,eAAe,CAAC,EAAE,cAAc,CAAC;IACjC;kEAC8D;IAC9D,2BAA2B,EAAE,OAAO,CAAC;CACtC;AAID,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAA2B;gBAE9B,OAAO,CAAC,EAAE,YAAY;IAIlC;;;;;;;;;;OAUG;IACH,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,kBAAkB;CAkL3D"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/** RoundCoordinator — Unified round-boundary state machine (v1.17).
|
|
2
|
+
*
|
|
3
|
+
* Encapsulates the shared round processing pipeline used by both
|
|
4
|
+
* LoopRuntime (runtime.ts) and SessionManager (mcp/session.ts):
|
|
5
|
+
*
|
|
6
|
+
* verify → enforce → stop decision
|
|
7
|
+
*
|
|
8
|
+
* Before this module, runtime.ts and session.ts each maintained their
|
|
9
|
+
* own copy of the pipeline (~60 lines each). Drift between the two
|
|
10
|
+
* paths (e.g. git verification only wired into one side) was a known
|
|
11
|
+
* risk. The RoundCoordinator is the single source of truth.
|
|
12
|
+
*
|
|
13
|
+
* State transitions:
|
|
14
|
+
* RoundStarted → EvidenceCaptured → EvaluationSubmitted
|
|
15
|
+
* → VerificationCompleted → EnforcementDecided
|
|
16
|
+
*
|
|
17
|
+
* Persistence is owned by round-transaction.ts so reject paths remain
|
|
18
|
+
* side-effect free and accepted decisions can be replayed idempotently.
|
|
19
|
+
*/
|
|
20
|
+
import { verifySelfEvaluation } from "./verification-gate.js";
|
|
21
|
+
import { enforceRound, buildRejectionPrompt } from "./enforcement-gate.js";
|
|
22
|
+
import { logEvent } from "./observability.js";
|
|
23
|
+
import { getPolicy } from "./policy.js";
|
|
24
|
+
// ── RoundCoordinator ───────────────────────────────────────────────────────
|
|
25
|
+
export class RoundCoordinator {
|
|
26
|
+
backend;
|
|
27
|
+
constructor(backend) {
|
|
28
|
+
this.backend = backend;
|
|
29
|
+
}
|
|
30
|
+
/** Process a single round's self-evaluation through the decision pipeline:
|
|
31
|
+
* verify → enforce → stop decision.
|
|
32
|
+
*
|
|
33
|
+
* This is the single entry point called by both LoopRuntime and
|
|
34
|
+
* SessionManager. The caller is responsible for:
|
|
35
|
+
* - Compiling the next prompt (if action is "continue")
|
|
36
|
+
* - Managing heartbeat / signal handlers (runtime only)
|
|
37
|
+
* - Memory injection (both paths, before calling processRound)
|
|
38
|
+
* - Transactional feedback commit (accepted rounds only)
|
|
39
|
+
* - State file I/O (both paths, after compiling)
|
|
40
|
+
*/
|
|
41
|
+
processRound(input) {
|
|
42
|
+
const { loopId, task, currentRound, maxRounds, selfEval, extractionSucceeded, lastSelfEval, consecutiveRejections, runtimeFilesChanged, evidenceSnapshots, } = input;
|
|
43
|
+
const roundSuccess = selfEval.success ?? false;
|
|
44
|
+
// ── 1. Query vault entries ──────────────────────────────────────────
|
|
45
|
+
const vaultEntries = this.backend
|
|
46
|
+
? this.backend.queryEntries({ prefix: `loop:${loopId}:r` })
|
|
47
|
+
: [];
|
|
48
|
+
// ── 2. Verification gate ────────────────────────────────────────────
|
|
49
|
+
const verifyResult = verifySelfEvaluation(selfEval, currentRound, vaultEntries, lastSelfEval ?? null, runtimeFilesChanged ?? null, evidenceSnapshots ?? []);
|
|
50
|
+
const verificationFlags = verifyResult.flags;
|
|
51
|
+
const gateContradicted = verifyResult.verdict === "contradicted";
|
|
52
|
+
if (gateContradicted) {
|
|
53
|
+
logEvent("gate_contradicted", {
|
|
54
|
+
loopId,
|
|
55
|
+
round: currentRound,
|
|
56
|
+
flags: verificationFlags.map((f) => f.check),
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
// ── 3. Enforcement gate (structured extractions only) ───────────────
|
|
60
|
+
// Heuristic evaluations have no reliable execution_evidence —
|
|
61
|
+
// enforcement rules that depend on evidence are skipped.
|
|
62
|
+
if (extractionSucceeded) {
|
|
63
|
+
const enforceResult = enforceRound(selfEval, verifyResult, currentRound, vaultEntries, consecutiveRejections);
|
|
64
|
+
if (enforceResult.action === "reject") {
|
|
65
|
+
const newRejections = consecutiveRejections + 1;
|
|
66
|
+
const rejectionPrompt = buildRejectionPrompt(currentRound, task, enforceResult);
|
|
67
|
+
logEvent("enforcement_reject", {
|
|
68
|
+
loopId,
|
|
69
|
+
round: currentRound,
|
|
70
|
+
reason: enforceResult.reason.slice(0, 120),
|
|
71
|
+
check: enforceResult.check ?? "",
|
|
72
|
+
consecutiveRejections: newRejections,
|
|
73
|
+
});
|
|
74
|
+
return {
|
|
75
|
+
action: "reject",
|
|
76
|
+
rejectionPrompt,
|
|
77
|
+
verificationFlags,
|
|
78
|
+
enforcementAction: "reject",
|
|
79
|
+
enforcementReason: enforceResult.reason,
|
|
80
|
+
rejectionCheck: enforceResult.check,
|
|
81
|
+
roundSuccess,
|
|
82
|
+
gateContradicted,
|
|
83
|
+
newConsecutiveRejections: newRejections,
|
|
84
|
+
// Don't update lastSelfEval on reject — the agent redoes the same round
|
|
85
|
+
newLastSelfEval: undefined,
|
|
86
|
+
shouldPushSuccessTrajectory: false,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
if (enforceResult.action === "terminate") {
|
|
90
|
+
logEvent("session_end", {
|
|
91
|
+
loopId,
|
|
92
|
+
stopReason: "enforcement_terminated",
|
|
93
|
+
round: currentRound,
|
|
94
|
+
});
|
|
95
|
+
return {
|
|
96
|
+
action: "terminate",
|
|
97
|
+
stopReason: "enforcement_terminated",
|
|
98
|
+
verificationFlags,
|
|
99
|
+
enforcementAction: "terminate",
|
|
100
|
+
enforcementReason: enforceResult.reason,
|
|
101
|
+
rejectionCheck: enforceResult.check,
|
|
102
|
+
roundSuccess,
|
|
103
|
+
gateContradicted,
|
|
104
|
+
newConsecutiveRejections: 0,
|
|
105
|
+
newLastSelfEval: selfEval,
|
|
106
|
+
shouldPushSuccessTrajectory: false,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
// Accept: reset rejection counter
|
|
110
|
+
// (consecutiveRejections reset to 0 — caller persists)
|
|
111
|
+
}
|
|
112
|
+
// ── 4. Auto-feedback (AFTER enforcement, only if accepted) ──────────
|
|
113
|
+
// ── 5. Stop condition checks ────────────────────────────────────────
|
|
114
|
+
// 5a. Extraction failed → stalled
|
|
115
|
+
if (!extractionSucceeded) {
|
|
116
|
+
return {
|
|
117
|
+
action: "stop",
|
|
118
|
+
stopReason: "stalled",
|
|
119
|
+
verificationFlags,
|
|
120
|
+
roundSuccess,
|
|
121
|
+
gateContradicted,
|
|
122
|
+
newConsecutiveRejections: 0,
|
|
123
|
+
newLastSelfEval: selfEval,
|
|
124
|
+
shouldPushSuccessTrajectory: !gateContradicted,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
// 5b. Agent says stop
|
|
128
|
+
if (!selfEval.should_continue) {
|
|
129
|
+
const reason = roundSuccess ? "completed" : "failed";
|
|
130
|
+
return {
|
|
131
|
+
action: "stop",
|
|
132
|
+
stopReason: reason,
|
|
133
|
+
verificationFlags,
|
|
134
|
+
roundSuccess,
|
|
135
|
+
gateContradicted,
|
|
136
|
+
newConsecutiveRejections: 0,
|
|
137
|
+
newLastSelfEval: selfEval,
|
|
138
|
+
shouldPushSuccessTrajectory: !gateContradicted,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
// 5c. Circuit breaker
|
|
142
|
+
const projectedTrajectory = [...(input.successTrajectory ?? [])];
|
|
143
|
+
if (!gateContradicted)
|
|
144
|
+
projectedTrajectory.push(roundSuccess);
|
|
145
|
+
const breakerSize = getPolicy().engine.max_circuit_breaker;
|
|
146
|
+
const circuitBroken = projectedTrajectory.length >= breakerSize &&
|
|
147
|
+
projectedTrajectory.slice(-breakerSize).every((value) => !value);
|
|
148
|
+
if (circuitBroken) {
|
|
149
|
+
return {
|
|
150
|
+
action: "stop",
|
|
151
|
+
stopReason: "circuit_breaker",
|
|
152
|
+
verificationFlags,
|
|
153
|
+
roundSuccess,
|
|
154
|
+
gateContradicted,
|
|
155
|
+
newConsecutiveRejections: 0,
|
|
156
|
+
newLastSelfEval: selfEval,
|
|
157
|
+
shouldPushSuccessTrajectory: !gateContradicted,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
// 5d. Max rounds reached
|
|
161
|
+
if (currentRound >= maxRounds) {
|
|
162
|
+
return {
|
|
163
|
+
action: "stop",
|
|
164
|
+
stopReason: "max_rounds",
|
|
165
|
+
verificationFlags,
|
|
166
|
+
roundSuccess,
|
|
167
|
+
gateContradicted,
|
|
168
|
+
newConsecutiveRejections: 0,
|
|
169
|
+
newLastSelfEval: selfEval,
|
|
170
|
+
shouldPushSuccessTrajectory: !gateContradicted,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
// ── 6. Continue — caller compiles next round ────────────────────────
|
|
174
|
+
return {
|
|
175
|
+
action: "continue",
|
|
176
|
+
verificationFlags,
|
|
177
|
+
enforcementAction: "accept",
|
|
178
|
+
roundSuccess,
|
|
179
|
+
gateContradicted,
|
|
180
|
+
newConsecutiveRejections: 0,
|
|
181
|
+
newLastSelfEval: selfEval,
|
|
182
|
+
shouldPushSuccessTrajectory: !gateContradicted,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=round-coordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"round-coordinator.js","sourceRoot":"","sources":["../src/round-coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/** Shared round lifecycle used by Runtime and MCP adapters.
|
|
2
|
+
*
|
|
3
|
+
* The driver owns compile -> state projection -> before evidence and
|
|
4
|
+
* after evidence -> transaction evaluation. Transport-specific concerns such
|
|
5
|
+
* as heartbeats, executor deadlines, MCP leases, and response formatting stay
|
|
6
|
+
* in their adapters.
|
|
7
|
+
*/
|
|
8
|
+
import type { VaultBackend } from "./backends/interface.js";
|
|
9
|
+
import { LoopForgeEngine } from "./engine.js";
|
|
10
|
+
import type { ProviderSnapshot } from "./evidence-provider.js";
|
|
11
|
+
import type { LoopForgeRequest, PromptArtifact, SelfEvaluation } from "./protocol.js";
|
|
12
|
+
import type { RoundTransactionOutcome, RoundTransactionSnapshot } from "./round-transaction.js";
|
|
13
|
+
export interface PreparedRound {
|
|
14
|
+
prompt: string;
|
|
15
|
+
artifact?: PromptArtifact;
|
|
16
|
+
level: "l0" | "l1" | "l2";
|
|
17
|
+
evidenceBaseline: ProviderSnapshot[];
|
|
18
|
+
snapshot: RoundTransactionSnapshot;
|
|
19
|
+
stateFileContent?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface CompleteRoundInput {
|
|
22
|
+
snapshot: RoundTransactionSnapshot;
|
|
23
|
+
loopId: string;
|
|
24
|
+
task: string;
|
|
25
|
+
maxRounds: number;
|
|
26
|
+
selfEval: SelfEvaluation;
|
|
27
|
+
extractionSucceeded: boolean;
|
|
28
|
+
lastSelfEval?: SelfEvaluation;
|
|
29
|
+
consecutiveRejections: number;
|
|
30
|
+
successTrajectory: boolean[];
|
|
31
|
+
}
|
|
32
|
+
export interface CompletedRound {
|
|
33
|
+
outcome: RoundTransactionOutcome;
|
|
34
|
+
actualEvidence: ProviderSnapshot[];
|
|
35
|
+
}
|
|
36
|
+
export declare class RoundDriver {
|
|
37
|
+
private readonly engine;
|
|
38
|
+
private readonly backend;
|
|
39
|
+
constructor(engine: LoopForgeEngine, backend?: VaultBackend);
|
|
40
|
+
prepare(request: LoopForgeRequest, loopId: string, round: number): Promise<PreparedRound | null>;
|
|
41
|
+
/** Synchronous fallback for legacy embedding APIs. Async evidence providers
|
|
42
|
+
* are deliberately skipped by EvidenceCollector.collect(). */
|
|
43
|
+
prepareSync(request: LoopForgeRequest, loopId: string, round: number): PreparedRound | null;
|
|
44
|
+
private compile;
|
|
45
|
+
/** Compile a fresh prompt for a zero-commit enforcement retry. The logical
|
|
46
|
+
* round ID and before-evidence snapshot remain stable; only attempt changes. */
|
|
47
|
+
prepareRetry(request: LoopForgeRequest, rejected: RoundTransactionSnapshot, rejectionNotice: string, consecutiveRejections: number): Promise<PreparedRound | null>;
|
|
48
|
+
private finishPrepare;
|
|
49
|
+
complete(input: CompleteRoundInput): Promise<CompletedRound>;
|
|
50
|
+
recover(snapshot: RoundTransactionSnapshot): RoundTransactionOutcome | null;
|
|
51
|
+
private collectEvidence;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=round-driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"round-driver.d.ts","sourceRoot":"","sources":["../src/round-driver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,OAAO,KAAK,EACV,gBAAgB,EAEhB,cAAc,EACd,cAAc,EACf,MAAM,eAAe,CAAC;AAMvB,OAAO,KAAK,EACV,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;IACrC,QAAQ,EAAE,wBAAwB,CAAC;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,wBAAwB,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,cAAc,CAAC;IACzB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,YAAY,CAAC,EAAE,cAAc,CAAC;IAC9B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,iBAAiB,EAAE,OAAO,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,uBAAuB,CAAC;IACjC,cAAc,EAAE,gBAAgB,EAAE,CAAC;CACpC;AAED,qBAAa,WAAW;IAGV,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;gBAEV,MAAM,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,YAAY;IAItE,OAAO,CACX,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAOhC;kEAC8D;IAC9D,WAAW,CACT,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,aAAa,GAAG,IAAI;IASvB,OAAO,CAAC,OAAO;IAgBf;oFACgF;IAC1E,YAAY,CAChB,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,wBAAwB,EAClC,eAAe,EAAE,MAAM,EACvB,qBAAqB,EAAE,MAAM,GAC5B,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAsBhC,OAAO,CAAC,aAAa;IAuBf,QAAQ,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,CAAC;IAoBlE,OAAO,CAAC,QAAQ,EAAE,wBAAwB,GAAG,uBAAuB,GAAG,IAAI;IAO3E,OAAO,CAAC,eAAe;CAMxB"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/** Shared round lifecycle used by Runtime and MCP adapters.
|
|
2
|
+
*
|
|
3
|
+
* The driver owns compile -> state projection -> before evidence and
|
|
4
|
+
* after evidence -> transaction evaluation. Transport-specific concerns such
|
|
5
|
+
* as heartbeats, executor deadlines, MCP leases, and response formatting stay
|
|
6
|
+
* in their adapters.
|
|
7
|
+
*/
|
|
8
|
+
import { EvidenceCollector } from "./evidence-provider.js";
|
|
9
|
+
import { getPolicy, writeStateFile } from "./policy.js";
|
|
10
|
+
import { prepareRejectedAttempt, prepareRoundTransaction, RoundTransactionCoordinator, } from "./round-transaction.js";
|
|
11
|
+
export class RoundDriver {
|
|
12
|
+
engine;
|
|
13
|
+
backend;
|
|
14
|
+
constructor(engine, backend) {
|
|
15
|
+
this.engine = engine;
|
|
16
|
+
this.backend = backend ?? engine.getBackend();
|
|
17
|
+
}
|
|
18
|
+
async prepare(request, loopId, round) {
|
|
19
|
+
const response = this.compile(request, loopId, true);
|
|
20
|
+
if (!response)
|
|
21
|
+
return null;
|
|
22
|
+
const evidenceBaseline = await this.collectEvidence(loopId, "before");
|
|
23
|
+
return this.finishPrepare(response, loopId, round, evidenceBaseline);
|
|
24
|
+
}
|
|
25
|
+
/** Synchronous fallback for legacy embedding APIs. Async evidence providers
|
|
26
|
+
* are deliberately skipped by EvidenceCollector.collect(). */
|
|
27
|
+
prepareSync(request, loopId, round) {
|
|
28
|
+
const response = this.compile(request, loopId, true);
|
|
29
|
+
if (!response)
|
|
30
|
+
return null;
|
|
31
|
+
const evidenceBaseline = EvidenceCollector.fromProviderNames(getPolicy().evidence.providers).collect({ loopId });
|
|
32
|
+
return this.finishPrepare(response, loopId, round, evidenceBaseline);
|
|
33
|
+
}
|
|
34
|
+
compile(request, loopId, persistLineage) {
|
|
35
|
+
const compiled = this.engine.invokeLoopCompile(request, undefined, { persistLineage });
|
|
36
|
+
const response = compiled.response;
|
|
37
|
+
if (!response?.prompt)
|
|
38
|
+
return null;
|
|
39
|
+
writeStateFile(loopId, response.state_file_content);
|
|
40
|
+
return response;
|
|
41
|
+
}
|
|
42
|
+
/** Compile a fresh prompt for a zero-commit enforcement retry. The logical
|
|
43
|
+
* round ID and before-evidence snapshot remain stable; only attempt changes. */
|
|
44
|
+
async prepareRetry(request, rejected, rejectionNotice, consecutiveRejections) {
|
|
45
|
+
const retryRequest = {
|
|
46
|
+
...request,
|
|
47
|
+
round: rejected.round,
|
|
48
|
+
attempt: rejected.attempt + 1,
|
|
49
|
+
consecutive_rejections: consecutiveRejections,
|
|
50
|
+
rejection_notice: rejectionNotice,
|
|
51
|
+
force_level: consecutiveRejections >= 2 ? "l2" : "l0",
|
|
52
|
+
};
|
|
53
|
+
const response = this.compile(retryRequest, rejected.loopId, false);
|
|
54
|
+
if (!response?.prompt_artifact)
|
|
55
|
+
return null;
|
|
56
|
+
const snapshot = prepareRejectedAttempt(rejected, response.prompt_artifact);
|
|
57
|
+
return {
|
|
58
|
+
prompt: response.prompt,
|
|
59
|
+
artifact: response.prompt_artifact,
|
|
60
|
+
level: response.prompt_artifact.level,
|
|
61
|
+
evidenceBaseline: rejected.beforeEvidence,
|
|
62
|
+
snapshot,
|
|
63
|
+
stateFileContent: response.state_file_content,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
finishPrepare(response, loopId, round, evidenceBaseline) {
|
|
67
|
+
const artifact = response.prompt_artifact;
|
|
68
|
+
const snapshot = prepareRoundTransaction(loopId, round, evidenceBaseline, artifact);
|
|
69
|
+
return {
|
|
70
|
+
prompt: response.prompt,
|
|
71
|
+
artifact,
|
|
72
|
+
level: artifact?.level ?? "l2",
|
|
73
|
+
evidenceBaseline,
|
|
74
|
+
snapshot,
|
|
75
|
+
stateFileContent: response.state_file_content,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
async complete(input) {
|
|
79
|
+
const actualEvidence = await this.collectEvidence(input.loopId, "after");
|
|
80
|
+
const transaction = new RoundTransactionCoordinator(this.engine, this.backend);
|
|
81
|
+
const outcome = transaction.process({
|
|
82
|
+
snapshot: input.snapshot,
|
|
83
|
+
task: input.task,
|
|
84
|
+
maxRounds: input.maxRounds,
|
|
85
|
+
selfEval: input.selfEval,
|
|
86
|
+
extractionSucceeded: input.extractionSucceeded,
|
|
87
|
+
lastSelfEval: input.lastSelfEval,
|
|
88
|
+
consecutiveRejections: input.consecutiveRejections,
|
|
89
|
+
successTrajectory: input.successTrajectory,
|
|
90
|
+
actualEvidence,
|
|
91
|
+
});
|
|
92
|
+
return { outcome, actualEvidence };
|
|
93
|
+
}
|
|
94
|
+
recover(snapshot) {
|
|
95
|
+
return new RoundTransactionCoordinator(this.engine, this.backend).recover(snapshot);
|
|
96
|
+
}
|
|
97
|
+
collectEvidence(loopId, phase) {
|
|
98
|
+
return EvidenceCollector.fromPolicy().collectAsync({ loopId, phase });
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=round-driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"round-driver.js","sourceRoot":"","sources":["../src/round-driver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAOxD,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,2BAA2B,GAC5B,MAAM,wBAAwB,CAAC;AAgChC,MAAM,OAAO,WAAW;IAGO;IAFZ,OAAO,CAAe;IAEvC,YAA6B,MAAuB,EAAE,OAAsB;QAA/C,WAAM,GAAN,MAAM,CAAiB;QAClD,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,OAAO,CACX,OAAyB,EACzB,MAAc,EACd,KAAa;QAEb,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC3B,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC;IACvE,CAAC;IAED;kEAC8D;IAC9D,WAAW,CACT,OAAyB,EACzB,MAAc,EACd,KAAa;QAEb,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC3B,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,iBAAiB,CAC1D,SAAS,EAAE,CAAC,QAAQ,CAAC,SAAS,CAC/B,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC;IACvE,CAAC;IAEO,OAAO,CACb,OAAyB,EACzB,MAAc,EACd,cAAuB;QAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAC5C,OAAO,EACP,SAAS,EACT,EAAE,cAAc,EAAE,CACnB,CAAC;QACF,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QACnC,IAAI,CAAC,QAAQ,EAAE,MAAM;YAAE,OAAO,IAAI,CAAC;QACnC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC;QACpD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;oFACgF;IAChF,KAAK,CAAC,YAAY,CAChB,OAAyB,EACzB,QAAkC,EAClC,eAAuB,EACvB,qBAA6B;QAE7B,MAAM,YAAY,GAAG;YACnB,GAAG,OAAO;YACV,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,OAAO,EAAE,QAAQ,CAAC,OAAO,GAAG,CAAC;YAC7B,sBAAsB,EAAE,qBAAqB;YAC7C,gBAAgB,EAAE,eAAe;YACjC,WAAW,EAAE,qBAAqB,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;SAClC,CAAC;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACpE,IAAI,CAAC,QAAQ,EAAE,eAAe;YAAE,OAAO,IAAI,CAAC;QAC5C,MAAM,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;QAC5E,OAAO;YACL,MAAM,EAAE,QAAQ,CAAC,MAAO;YACxB,QAAQ,EAAE,QAAQ,CAAC,eAAe;YAClC,KAAK,EAAE,QAAQ,CAAC,eAAe,CAAC,KAAK;YACrC,gBAAgB,EAAE,QAAQ,CAAC,cAAc;YACzC,QAAQ;YACR,gBAAgB,EAAE,QAAQ,CAAC,kBAAkB;SAC9C,CAAC;IACJ,CAAC;IAEO,aAAa,CACnB,QAA2B,EAC3B,MAAc,EACd,KAAa,EACb,gBAAoC;QAEpC,MAAM,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC;QAC1C,MAAM,QAAQ,GAAG,uBAAuB,CACtC,MAAM,EACN,KAAK,EACL,gBAAgB,EAChB,QAAQ,CACT,CAAC;QACF,OAAO;YACL,MAAM,EAAE,QAAQ,CAAC,MAAO;YACxB,QAAQ;YACR,KAAK,EAAE,QAAQ,EAAE,KAAK,IAAI,IAAI;YAC9B,gBAAgB;YAChB,QAAQ;YACR,gBAAgB,EAAE,QAAQ,CAAC,kBAAkB;SAC9C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAyB;QACtC,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACzE,MAAM,WAAW,GAAG,IAAI,2BAA2B,CACjD,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,OAAO,CACb,CAAC;QACF,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;YAClC,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;YAC9C,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,qBAAqB,EAAE,KAAK,CAAC,qBAAqB;YAClD,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;YAC1C,cAAc;SACf,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;IACrC,CAAC;IAED,OAAO,CAAC,QAAkC;QACxC,OAAO,IAAI,2BAA2B,CACpC,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,OAAO,CACb,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACtB,CAAC;IAEO,eAAe,CACrB,MAAc,EACd,KAAyB;QAEzB,OAAO,iBAAiB,CAAC,UAAU,EAAE,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACxE,CAAC;CACF"}
|
|
@@ -0,0 +1,70 @@
|
|
|
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 type { VaultBackend } from "./backends/interface.js";
|
|
9
|
+
import { LoopForgeEngine } from "./engine.js";
|
|
10
|
+
import type { ProviderSnapshot } from "./evidence-provider.js";
|
|
11
|
+
import type { SelfEvaluation } from "./protocol.js";
|
|
12
|
+
import type { PromptArtifact } from "./protocol.js";
|
|
13
|
+
import { type RoundProcessResult } from "./round-coordinator.js";
|
|
14
|
+
import type { RoundCommitStore } from "./storage.js";
|
|
15
|
+
export declare const ROUND_TRANSACTION_SCHEMA_VERSION: 1;
|
|
16
|
+
export type RoundTransactionPhase = "prepared" | "prompted" | "evaluated" | "rejected" | "committed" | "terminated";
|
|
17
|
+
export interface RoundTransactionSnapshot {
|
|
18
|
+
schemaVersion: typeof ROUND_TRANSACTION_SCHEMA_VERSION;
|
|
19
|
+
roundId: string;
|
|
20
|
+
loopId: string;
|
|
21
|
+
round: number;
|
|
22
|
+
attempt: number;
|
|
23
|
+
phase: RoundTransactionPhase;
|
|
24
|
+
beforeEvidence: ProviderSnapshot[];
|
|
25
|
+
afterEvidence?: ProviderSnapshot[];
|
|
26
|
+
roundEvidence?: ProviderSnapshot[];
|
|
27
|
+
evaluation?: SelfEvaluation;
|
|
28
|
+
result?: RoundProcessResult;
|
|
29
|
+
createdAt: number;
|
|
30
|
+
updatedAt: number;
|
|
31
|
+
/** Exact prompt delivered for the current attempt. */
|
|
32
|
+
promptArtifact?: PromptArtifact;
|
|
33
|
+
}
|
|
34
|
+
export interface RoundTransactionInput {
|
|
35
|
+
snapshot: RoundTransactionSnapshot;
|
|
36
|
+
task: string;
|
|
37
|
+
maxRounds: number;
|
|
38
|
+
selfEval: SelfEvaluation;
|
|
39
|
+
extractionSucceeded: boolean;
|
|
40
|
+
lastSelfEval?: SelfEvaluation;
|
|
41
|
+
consecutiveRejections: number;
|
|
42
|
+
successTrajectory: boolean[];
|
|
43
|
+
actualEvidence: ProviderSnapshot[];
|
|
44
|
+
}
|
|
45
|
+
export interface RoundTransactionOutcome {
|
|
46
|
+
snapshot: RoundTransactionSnapshot;
|
|
47
|
+
result: RoundProcessResult;
|
|
48
|
+
/** true when a prior committed decision was replayed from the vault. */
|
|
49
|
+
replayed: boolean;
|
|
50
|
+
}
|
|
51
|
+
export declare function makeRoundId(loopId: string, round: number): string;
|
|
52
|
+
export declare function prepareRoundTransaction(loopId: string, round: number, beforeEvidence: ProviderSnapshot[], promptArtifact?: PromptArtifact): RoundTransactionSnapshot;
|
|
53
|
+
/** Attach the next prompt attempt to a rejected logical round without changing
|
|
54
|
+
* its identity or evidence baseline. Evaluation fields belong to the previous
|
|
55
|
+
* attempt and are cleared before the Agent receives the retry prompt. */
|
|
56
|
+
export declare function prepareRejectedAttempt(rejected: RoundTransactionSnapshot, promptArtifact: PromptArtifact): RoundTransactionSnapshot;
|
|
57
|
+
/** Parse a persisted snapshot without trusting arbitrary vault data. */
|
|
58
|
+
export declare function parseRoundTransactionSnapshot(value: unknown): RoundTransactionSnapshot | null;
|
|
59
|
+
export declare class RoundTransactionCoordinator {
|
|
60
|
+
private readonly engine;
|
|
61
|
+
private readonly backend;
|
|
62
|
+
private readonly commitStore;
|
|
63
|
+
constructor(engine: LoopForgeEngine, backend?: VaultBackend, commitStore?: RoundCommitStore);
|
|
64
|
+
process(input: RoundTransactionInput): RoundTransactionOutcome;
|
|
65
|
+
/** Recover an already committed decision without evaluating or writing. */
|
|
66
|
+
recover(snapshot: RoundTransactionSnapshot): RoundTransactionOutcome | null;
|
|
67
|
+
private readCommitted;
|
|
68
|
+
private outcomeFromEntry;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=round-transaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"round-transaction.d.ts","sourceRoot":"","sources":["../src/round-transaction.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAK9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,wBAAwB,CAAC;AAIhC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,eAAO,MAAM,gCAAgC,EAAG,CAAU,CAAC;AAE3D,MAAM,MAAM,qBAAqB,GAC7B,UAAU,GACV,UAAU,GACV,WAAW,GACX,UAAU,GACV,WAAW,GACX,YAAY,CAAC;AAEjB,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,OAAO,gCAAgC,CAAC;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,qBAAqB,CAAC;IAC7B,cAAc,EAAE,gBAAgB,EAAE,CAAC;IACnC,aAAa,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACnC,aAAa,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACnC,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,wBAAwB,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,cAAc,CAAC;IACzB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,YAAY,CAAC,EAAE,cAAc,CAAC;IAC9B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,iBAAiB,EAAE,OAAO,EAAE,CAAC;IAC7B,cAAc,EAAE,gBAAgB,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,wBAAwB,CAAC;IACnC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,wEAAwE;IACxE,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKjE;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,gBAAgB,EAAE,EAClC,cAAc,CAAC,EAAE,cAAc,GAC9B,wBAAwB,CAc1B;AAED;;yEAEyE;AACzE,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,wBAAwB,EAClC,cAAc,EAAE,cAAc,GAC7B,wBAAwB,CAyB1B;AA8BD,wEAAwE;AACxE,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,OAAO,GACb,wBAAwB,GAAG,IAAI,CA8CjC;AAED,qBAAa,2BAA2B;IAKpC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmB;gBAG5B,MAAM,EAAE,eAAe,EACxC,OAAO,CAAC,EAAE,YAAY,EACtB,WAAW,CAAC,EAAE,gBAAgB;IAMhC,OAAO,CAAC,KAAK,EAAE,qBAAqB,GAAG,uBAAuB;IAuH9D,2EAA2E;IAC3E,OAAO,CAAC,QAAQ,EAAE,wBAAwB,GAAG,uBAAuB,GAAG,IAAI;IAmB3E,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,gBAAgB;CAczB"}
|