loopforge 1.15.1 → 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.map +1 -1
- package/dist/enforcement-gate.js +28 -10
- package/dist/enforcement-gate.js.map +1 -1
- package/dist/engine.d.ts +7 -4
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +78 -138
- 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 +18 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -9
- 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 +303 -2206
- 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 +75 -19
- package/dist/mcp/session.d.ts.map +1 -1
- package/dist/mcp/session.js +707 -361
- 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 +53 -140
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +119 -184
- 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 +88 -93
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +23 -39
- 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 +33 -19
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +355 -336
- 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 +33 -7
- package/dist/verification-gate.d.ts.map +1 -1
- package/dist/verification-gate.js +195 -7
- package/dist/verification-gate.js.map +1 -1
- package/loop_policy.json +22 -48
- 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/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,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":"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"}
|
|
@@ -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":"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"}
|
|
@@ -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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"}
|
package/dist/runtime.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ import { RuntimeStatus, type RuntimeConfig, type RunResult } from "./protocol.js
|
|
|
17
17
|
export declare class LoopRuntime extends EventEmitter {
|
|
18
18
|
private config;
|
|
19
19
|
private engine;
|
|
20
|
+
private roundDriver;
|
|
20
21
|
private _status;
|
|
21
22
|
private currentRound;
|
|
22
23
|
private successTrajectory;
|
|
@@ -26,40 +27,53 @@ export declare class LoopRuntime extends EventEmitter {
|
|
|
26
27
|
private lastSelfEval;
|
|
27
28
|
private pendingVerificationFlags;
|
|
28
29
|
private consecutiveRejections;
|
|
30
|
+
/** Which enforcement check triggered the last rejection.
|
|
31
|
+
* Only same-check rejections accumulate; a different check resets the counter. */
|
|
32
|
+
private lastRejectionCheck;
|
|
29
33
|
private pendingRejectionNotice;
|
|
30
|
-
private
|
|
31
|
-
private
|
|
32
|
-
private
|
|
33
|
-
private
|
|
34
|
-
private phase3Triggered;
|
|
34
|
+
private roundSnapshot;
|
|
35
|
+
private pauseTimestamp;
|
|
36
|
+
private pauseRequested;
|
|
37
|
+
private driverPromise;
|
|
35
38
|
private pendingExternalContext;
|
|
36
39
|
private roundStartTime;
|
|
37
40
|
private lastProgressTime;
|
|
38
41
|
private activeCtx;
|
|
42
|
+
private activeAbortController;
|
|
39
43
|
private timedOut;
|
|
40
44
|
constructor(rawConfig: RuntimeConfig);
|
|
41
45
|
get status(): RuntimeStatus;
|
|
42
46
|
getCurrentRound(): number;
|
|
43
47
|
getSuccessTrajectory(): boolean[];
|
|
44
|
-
/** Derive the current progress estimate from the last self evaluation.
|
|
45
|
-
* Returns -1 if no progress data is available. */
|
|
46
|
-
private getCurrentProgress;
|
|
47
|
-
/** Determine which memory injection phase (0/1/2/3) should fire this round.
|
|
48
|
-
* Returns 0 if no injection should occur. Phase tracking (phase2Triggered /
|
|
49
|
-
* phase3Triggered) is updated by the caller based on the returned phase. */
|
|
50
|
-
private getInjectionPhase;
|
|
51
|
-
/** Build the accumulated context for constructing a targeted memory query.
|
|
52
|
-
* Delegates to the shared buildAccumulatedMemoryContext() utility. */
|
|
53
|
-
private buildAccumulatedContext;
|
|
54
|
-
/** Deduplicate external context against previously injected contexts.
|
|
55
|
-
* Returns empty string if the new context is too similar to any prior. */
|
|
56
|
-
private dedupAndStoreContext;
|
|
57
48
|
/** Start the loop. Returns when the loop terminates (task complete,
|
|
58
|
-
* circuit breaker, max rounds, stalled, or manual stop).
|
|
49
|
+
* circuit breaker, max rounds, stalled, paused, or manual stop).
|
|
50
|
+
* Can only be called from IDLE state. */
|
|
59
51
|
start(): Promise<RunResult>;
|
|
52
|
+
/** Start the one allowed loop driver and clear its ownership on exit. */
|
|
53
|
+
private launchDriver;
|
|
54
|
+
/** Internal loop driver. Called by both start() (isResume=false) and
|
|
55
|
+
* resume() (isResume=true). When resuming, skips the currentRound=1
|
|
56
|
+
* reset — the loop picks up exactly where it left off. */
|
|
57
|
+
private _continue;
|
|
58
|
+
/** Execute one round with a hard driver deadline. The AbortSignal lets a
|
|
59
|
+
* cooperative executor stop early; the race guarantees the runtime itself
|
|
60
|
+
* still resolves when an executor ignores cancellation. */
|
|
61
|
+
private executeWithDeadline;
|
|
62
|
+
private triggerTimeout;
|
|
63
|
+
private triggerStall;
|
|
60
64
|
/** Stop the loop gracefully. Safe to call from any thread/timer. */
|
|
61
65
|
stop(): void;
|
|
66
|
+
/** Pause the loop gracefully. Completes the current round, then suspends.
|
|
67
|
+
* Safe to call from signal handlers or callbacks.
|
|
68
|
+
* Only has effect when the loop is RUNNING. */
|
|
69
|
+
pause(): void;
|
|
70
|
+
/** Resume a paused loop. Re-enters the main loop from currentRound.
|
|
71
|
+
* The loop continues exactly where it was suspended. */
|
|
72
|
+
resume(): Promise<RunResult>;
|
|
62
73
|
private buildCompileRequest;
|
|
74
|
+
/** Adapt the typed compiler request to the engine envelope once for both
|
|
75
|
+
* normal rounds and enforcement retry attempts. */
|
|
76
|
+
private buildEngineCompileRequest;
|
|
63
77
|
private startHeartbeat;
|
|
64
78
|
private heartbeatTick;
|
|
65
79
|
private stopHeartbeat;
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAO3C,OAAO,EAEL,aAAa,EAab,KAAK,aAAa,EAClB,KAAK,SAAS,EAMf,MAAM,eAAe,CAAC;AAmFvB,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,iBAAiB,CAAiB;IAC1C,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,cAAc,CAA6B;IAGnD,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,wBAAwB,CAA0B;IAG1D,OAAO,CAAC,qBAAqB,CAAK;IAClC;uFACmF;IACnF,OAAO,CAAC,kBAAkB,CAAM;IAChC,OAAO,CAAC,sBAAsB,CAAM;IACpC,OAAO,CAAC,aAAa,CAAyC;IAG9D,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,aAAa,CAAmC;IAGxD,OAAO,CAAC,sBAAsB,CAAM;IAGpC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,qBAAqB,CAAgC;IAC7D,OAAO,CAAC,QAAQ,CAAS;gBAEb,SAAS,EAAE,aAAa;IAOpC,IAAI,MAAM,IAAI,aAAa,CAE1B;IAED,eAAe,IAAI,MAAM;IAIzB,oBAAoB,IAAI,OAAO,EAAE;IAMjC;;8CAE0C;IACpC,KAAK,IAAI,OAAO,CAAC,SAAS,CAAC;IAWjC,yEAAyE;IACzE,OAAO,CAAC,YAAY;IAepB;;+DAE2D;YAC7C,SAAS;IA2UvB;;gEAE4D;YAC9C,mBAAmB;IA0BjC,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,YAAY;IAYpB,oEAAoE;IACpE,IAAI,IAAI,IAAI;IAiBZ;;oDAEgD;IAChD,KAAK,IAAI,IAAI;IAQb;6DACyD;IACnD,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC;IAuBlC,OAAO,CAAC,mBAAmB;IAoD3B;uDACmD;IACnD,OAAO,CAAC,yBAAyB;IA0BjC,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,aAAa;IAiDrB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,sBAAsB;IAgC9B,OAAO,CAAC,wBAAwB;CAUjC;AAMD;;;;;;;;;GASG;AACH,wBAAsB,GAAG,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAGtE"}
|