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,512 @@
|
|
|
1
|
+
/** EvidenceProvider — Pluggable evidence capture interface (v1.18).
|
|
2
|
+
*
|
|
3
|
+
* Before this module, evidence capture was hardcoded to git via
|
|
4
|
+
* captureGitModifiedFiles() in two places (runtime.ts, session.ts).
|
|
5
|
+
* This module defines an abstract EvidenceProvider interface so
|
|
6
|
+
* additional evidence sources (test runners, linters, bundle analysis)
|
|
7
|
+
* can be added without touching the verification pipeline.
|
|
8
|
+
*
|
|
9
|
+
* Built-in provider: GitEvidenceProvider — git file state capture with
|
|
10
|
+
* parallel async execution (v2.0.1) and a synchronous fallback.
|
|
11
|
+
*/
|
|
12
|
+
import { createHash } from "node:crypto";
|
|
13
|
+
import { readFileSync, realpathSync, statSync } from "node:fs";
|
|
14
|
+
import { spawn, execFile, execFileSync, } from "node:child_process";
|
|
15
|
+
import { isAbsolute, relative, resolve, sep } from "node:path";
|
|
16
|
+
import { getPolicy } from "./policy.js";
|
|
17
|
+
import { logEvent, startSpan } from "./observability.js";
|
|
18
|
+
import { policyMetrics } from "./policy-metrics.js";
|
|
19
|
+
const providerFactories = new Map();
|
|
20
|
+
/** Register a provider factory used by policy-driven collectors. */
|
|
21
|
+
export function registerEvidenceProvider(name, factory) {
|
|
22
|
+
if (!name.trim())
|
|
23
|
+
throw new Error("Evidence provider name must not be empty");
|
|
24
|
+
providerFactories.set(name, factory);
|
|
25
|
+
}
|
|
26
|
+
export function unregisterEvidenceProvider(name) {
|
|
27
|
+
if (name === "git")
|
|
28
|
+
return false;
|
|
29
|
+
return providerFactories.delete(name);
|
|
30
|
+
}
|
|
31
|
+
// ── EvidenceCollector ──────────────────────────────────────────────────────
|
|
32
|
+
/** Collects evidence from all configured providers.
|
|
33
|
+
*
|
|
34
|
+
* Usage:
|
|
35
|
+
* const collector = new EvidenceCollector([new GitEvidenceProvider()]);
|
|
36
|
+
* const snapshots = collector.collect();
|
|
37
|
+
* // snapshots = [{ provider: "git", files: [...], data: {...} }]
|
|
38
|
+
*/
|
|
39
|
+
export class EvidenceCollector {
|
|
40
|
+
providers;
|
|
41
|
+
constructor(providers) {
|
|
42
|
+
this.providers = providers;
|
|
43
|
+
}
|
|
44
|
+
/** Build the collector described by loop_policy.json. Unknown provider
|
|
45
|
+
* names are ignored so newer configs remain backward compatible. */
|
|
46
|
+
static fromProviderNames(providerNames) {
|
|
47
|
+
const providers = [];
|
|
48
|
+
for (const name of providerNames) {
|
|
49
|
+
const factory = providerFactories.get(name);
|
|
50
|
+
if (factory)
|
|
51
|
+
providers.push(factory());
|
|
52
|
+
}
|
|
53
|
+
return new EvidenceCollector(providers);
|
|
54
|
+
}
|
|
55
|
+
/** Build built-ins and explicitly configured command providers. */
|
|
56
|
+
static fromPolicy() {
|
|
57
|
+
const policy = getPolicy().evidence;
|
|
58
|
+
const providerNames = Array.isArray(policy.providers)
|
|
59
|
+
? policy.providers.filter((name) => typeof name === "string")
|
|
60
|
+
: [];
|
|
61
|
+
const providers = EvidenceCollector.fromProviderNames(providerNames).providers;
|
|
62
|
+
const commands = Array.isArray(policy.commands) ? policy.commands : [];
|
|
63
|
+
for (const command of commands) {
|
|
64
|
+
if (command?.enabled)
|
|
65
|
+
providers.push(new CommandEvidenceProvider(command));
|
|
66
|
+
}
|
|
67
|
+
return new EvidenceCollector(providers);
|
|
68
|
+
}
|
|
69
|
+
/** Run all providers and return non-null snapshots.
|
|
70
|
+
* Providers that return null (e.g. git not available) are silently
|
|
71
|
+
* skipped — the caller handles missing evidence. */
|
|
72
|
+
collect(options = {}) {
|
|
73
|
+
const results = [];
|
|
74
|
+
for (const p of this.providers) {
|
|
75
|
+
const startedAt = Date.now();
|
|
76
|
+
const controller = new AbortController();
|
|
77
|
+
try {
|
|
78
|
+
const snapshot = p.capture({
|
|
79
|
+
signal: controller.signal,
|
|
80
|
+
timeoutMs: options.timeoutMs ?? getPolicy().evidence.timeout_ms,
|
|
81
|
+
loopId: options.loopId,
|
|
82
|
+
phase: options.phase ?? "after",
|
|
83
|
+
});
|
|
84
|
+
if (snapshot && typeof snapshot.then === "function") {
|
|
85
|
+
// Async providers are not awaitable in the synchronous collect()
|
|
86
|
+
// path. Log and skip — callers who need async providers must use
|
|
87
|
+
// collectAsync() instead. Session recovery via reconstructSession()
|
|
88
|
+
// uses collect() as a fallback; the unpause() path replaces it
|
|
89
|
+
// with async evidence after reconstruction.
|
|
90
|
+
void snapshot.catch(() => undefined);
|
|
91
|
+
policyMetrics.recordEvidence(p.name, "failure", Date.now() - startedAt, options.loopId);
|
|
92
|
+
logEvent("evidence_async_provider_in_sync_collect", { provider: p.name });
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const syncSnapshot = snapshot;
|
|
96
|
+
policyMetrics.recordEvidence(p.name, syncSnapshot ? "available" : "unavailable", Date.now() - startedAt, options.loopId);
|
|
97
|
+
if (syncSnapshot)
|
|
98
|
+
results.push(syncSnapshot);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
policyMetrics.recordEvidence(p.name, "failure", Date.now() - startedAt, options.loopId);
|
|
102
|
+
logEvent("evidence_provider_error", { provider: p.name, error: String(error) });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return results;
|
|
106
|
+
}
|
|
107
|
+
/** Capture all providers concurrently with per-provider timeout isolation. */
|
|
108
|
+
async collectAsync(options = {}) {
|
|
109
|
+
const timeoutMs = options.timeoutMs ?? getPolicy().evidence.timeout_ms;
|
|
110
|
+
const captures = this.providers.map(async (provider) => {
|
|
111
|
+
const span = startSpan("evidence.capture", {
|
|
112
|
+
provider: provider.name,
|
|
113
|
+
loopId: options.loopId,
|
|
114
|
+
timeoutMs,
|
|
115
|
+
});
|
|
116
|
+
const startedAt = Date.now();
|
|
117
|
+
const controller = new AbortController();
|
|
118
|
+
let timer;
|
|
119
|
+
let timedOut = false;
|
|
120
|
+
try {
|
|
121
|
+
const capture = Promise.resolve(provider.capture({
|
|
122
|
+
signal: controller.signal,
|
|
123
|
+
timeoutMs,
|
|
124
|
+
loopId: options.loopId,
|
|
125
|
+
phase: options.phase ?? "after",
|
|
126
|
+
}));
|
|
127
|
+
const snapshot = timeoutMs > 0
|
|
128
|
+
? await Promise.race([
|
|
129
|
+
capture,
|
|
130
|
+
new Promise((resolve) => {
|
|
131
|
+
timer = setTimeout(() => {
|
|
132
|
+
timedOut = true;
|
|
133
|
+
controller.abort(new Error(`Evidence provider timed out after ${timeoutMs}ms`));
|
|
134
|
+
resolve(null);
|
|
135
|
+
}, timeoutMs);
|
|
136
|
+
}),
|
|
137
|
+
])
|
|
138
|
+
: await capture;
|
|
139
|
+
const outcome = timedOut
|
|
140
|
+
? "timeout"
|
|
141
|
+
: snapshot ? "available" : "unavailable";
|
|
142
|
+
policyMetrics.recordEvidence(provider.name, outcome, Date.now() - startedAt, options.loopId);
|
|
143
|
+
span.end(timedOut ? "cancelled" : "ok", { outcome });
|
|
144
|
+
if (timedOut) {
|
|
145
|
+
logEvent("evidence_provider_timeout", { provider: provider.name, timeoutMs });
|
|
146
|
+
}
|
|
147
|
+
return timedOut ? null : snapshot;
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
policyMetrics.recordEvidence(provider.name, "failure", Date.now() - startedAt, options.loopId);
|
|
151
|
+
span.end("error", { error: String(error) });
|
|
152
|
+
logEvent("evidence_provider_error", { provider: provider.name, error: String(error) });
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
finally {
|
|
156
|
+
if (timer)
|
|
157
|
+
clearTimeout(timer);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
return (await Promise.all(captures)).filter((snapshot) => snapshot !== null);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function commandCwd(configured) {
|
|
164
|
+
const workspace = realpathSync(process.cwd());
|
|
165
|
+
const lexical = resolve(workspace, configured ?? ".");
|
|
166
|
+
const lexicalRelative = relative(workspace, lexical);
|
|
167
|
+
if (lexicalRelative === ".." || lexicalRelative.startsWith(`..${sep}`) ||
|
|
168
|
+
isAbsolute(lexicalRelative)) {
|
|
169
|
+
throw new Error("command cwd must stay within the workspace");
|
|
170
|
+
}
|
|
171
|
+
const actual = realpathSync(lexical);
|
|
172
|
+
const actualRelative = relative(workspace, actual);
|
|
173
|
+
if (actualRelative === ".." || actualRelative.startsWith(`..${sep}`) ||
|
|
174
|
+
isAbsolute(actualRelative) || !statSync(actual).isDirectory()) {
|
|
175
|
+
throw new Error("command cwd resolves outside the workspace");
|
|
176
|
+
}
|
|
177
|
+
return actual;
|
|
178
|
+
}
|
|
179
|
+
/** Explicit, shell-free verification command. Disabled unless configured. */
|
|
180
|
+
export class CommandEvidenceProvider {
|
|
181
|
+
name;
|
|
182
|
+
config;
|
|
183
|
+
constructor(config) {
|
|
184
|
+
const name = typeof config.name === "string" && config.name.trim()
|
|
185
|
+
? config.name.trim()
|
|
186
|
+
: "invalid-config";
|
|
187
|
+
const executable = typeof config.executable === "string"
|
|
188
|
+
? config.executable.trim()
|
|
189
|
+
: "";
|
|
190
|
+
const args = Array.isArray(config.args)
|
|
191
|
+
? config.args.filter((arg) => typeof arg === "string")
|
|
192
|
+
: [];
|
|
193
|
+
const successExitCodes = Array.isArray(config.success_exit_codes)
|
|
194
|
+
? config.success_exit_codes.filter((code) => Number.isInteger(code))
|
|
195
|
+
: [0];
|
|
196
|
+
this.config = {
|
|
197
|
+
...config,
|
|
198
|
+
name,
|
|
199
|
+
executable,
|
|
200
|
+
args,
|
|
201
|
+
phase: config.phase === "both" ? "both" : "after",
|
|
202
|
+
required: config.required === true,
|
|
203
|
+
timeout_ms: Number.isFinite(config.timeout_ms) ? config.timeout_ms : 120_000,
|
|
204
|
+
max_output_chars: Number.isFinite(config.max_output_chars)
|
|
205
|
+
? config.max_output_chars
|
|
206
|
+
: 20_000,
|
|
207
|
+
success_exit_codes: successExitCodes,
|
|
208
|
+
};
|
|
209
|
+
this.name = `command:${name}`;
|
|
210
|
+
}
|
|
211
|
+
capture(context) {
|
|
212
|
+
const phase = context?.phase ?? "after";
|
|
213
|
+
if (phase === "before" && this.config.phase === "after") {
|
|
214
|
+
return Promise.resolve(null);
|
|
215
|
+
}
|
|
216
|
+
const startedAt = Date.now();
|
|
217
|
+
const cap = Math.max(0, Math.min(20_000, this.config.max_output_chars));
|
|
218
|
+
const timeoutMs = Math.max(1, Math.min(this.config.timeout_ms, context?.timeoutMs || this.config.timeout_ms));
|
|
219
|
+
let cwd;
|
|
220
|
+
if (!this.config.executable) {
|
|
221
|
+
return Promise.resolve(this.snapshot(phase, "missing", null, null, "", "Command executable is empty", false, 0));
|
|
222
|
+
}
|
|
223
|
+
try {
|
|
224
|
+
cwd = commandCwd(this.config.cwd);
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
return Promise.resolve(this.snapshot(phase, "invalid_cwd", null, null, "", String(error), false, Date.now() - startedAt));
|
|
228
|
+
}
|
|
229
|
+
return new Promise((resolveCapture) => {
|
|
230
|
+
let stdout = "";
|
|
231
|
+
let stderr = "";
|
|
232
|
+
let truncated = false;
|
|
233
|
+
let retained = 0;
|
|
234
|
+
let settled = false;
|
|
235
|
+
const append = (current, chunk) => {
|
|
236
|
+
const text = String(chunk);
|
|
237
|
+
if (retained >= cap) {
|
|
238
|
+
if (text.length > 0)
|
|
239
|
+
truncated = true;
|
|
240
|
+
return current;
|
|
241
|
+
}
|
|
242
|
+
const remaining = cap - retained;
|
|
243
|
+
if (text.length > remaining)
|
|
244
|
+
truncated = true;
|
|
245
|
+
const accepted = text.slice(0, remaining);
|
|
246
|
+
retained += accepted.length;
|
|
247
|
+
return current + accepted;
|
|
248
|
+
};
|
|
249
|
+
const child = spawn(this.config.executable, this.config.args, {
|
|
250
|
+
cwd,
|
|
251
|
+
shell: false,
|
|
252
|
+
windowsHide: true,
|
|
253
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
254
|
+
});
|
|
255
|
+
let timer;
|
|
256
|
+
const finish = (status, exitCode, signal) => {
|
|
257
|
+
if (settled)
|
|
258
|
+
return;
|
|
259
|
+
settled = true;
|
|
260
|
+
if (timer)
|
|
261
|
+
clearTimeout(timer);
|
|
262
|
+
context?.signal.removeEventListener("abort", abort);
|
|
263
|
+
resolveCapture(this.snapshot(phase, status, exitCode, signal, stdout, stderr, truncated, Date.now() - startedAt));
|
|
264
|
+
};
|
|
265
|
+
const abort = () => {
|
|
266
|
+
child.kill();
|
|
267
|
+
finish("aborted", null, null);
|
|
268
|
+
};
|
|
269
|
+
child.stdout.on("data", (chunk) => { stdout = append(stdout, chunk); });
|
|
270
|
+
child.stderr.on("data", (chunk) => { stderr = append(stderr, chunk); });
|
|
271
|
+
child.once("error", (error) => {
|
|
272
|
+
stderr = append(stderr, error.message);
|
|
273
|
+
finish(error.code === "ENOENT" ? "missing" : "failed", null, null);
|
|
274
|
+
});
|
|
275
|
+
child.once("close", (code, signal) => {
|
|
276
|
+
const passed = code !== null && this.config.success_exit_codes.includes(code);
|
|
277
|
+
finish(passed ? "passed" : "failed", code, signal);
|
|
278
|
+
});
|
|
279
|
+
timer = setTimeout(() => {
|
|
280
|
+
child.kill();
|
|
281
|
+
finish("timeout", null, null);
|
|
282
|
+
}, timeoutMs);
|
|
283
|
+
timer.unref?.();
|
|
284
|
+
if (context?.signal.aborted)
|
|
285
|
+
abort();
|
|
286
|
+
else
|
|
287
|
+
context?.signal.addEventListener("abort", abort, { once: true });
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
snapshot(phase, status, exitCode, signal, stdout, stderr, truncated, durationMs) {
|
|
291
|
+
return {
|
|
292
|
+
provider: this.name,
|
|
293
|
+
timestamp: Date.now(),
|
|
294
|
+
files: [],
|
|
295
|
+
data: {
|
|
296
|
+
kind: "command",
|
|
297
|
+
commandName: this.config.name,
|
|
298
|
+
required: this.config.required,
|
|
299
|
+
phase,
|
|
300
|
+
status,
|
|
301
|
+
exitCode,
|
|
302
|
+
signal,
|
|
303
|
+
durationMs,
|
|
304
|
+
stdout,
|
|
305
|
+
stderr,
|
|
306
|
+
truncated,
|
|
307
|
+
},
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
/** v2.0.1: Capture git file state using parallel async execFile.
|
|
312
|
+
*
|
|
313
|
+
* Runs three git commands concurrently via Promise.all. Uses a single
|
|
314
|
+
* timeout (shared across all commands) and an optional AbortSignal for
|
|
315
|
+
* early cancellation. Shell-free (execFile, not exec).
|
|
316
|
+
*
|
|
317
|
+
* On any command failure, returns null — the caller should treat git
|
|
318
|
+
* evidence as unavailable and degrade gracefully.
|
|
319
|
+
*
|
|
320
|
+
* Performance: wall-clock time is max(single-command), not sum(3).
|
|
321
|
+
* On a normal repo (~200ms/command): ~200ms vs ~600ms sequential.
|
|
322
|
+
* On Windows with antivirus (~4s/command): ~4s vs ~12s sequential. */
|
|
323
|
+
export async function captureGitFileStateAsync(signal, timeoutMs) {
|
|
324
|
+
const timeout = timeoutMs ?? 15000;
|
|
325
|
+
const runGit = (args) => {
|
|
326
|
+
return new Promise((resolve, reject) => {
|
|
327
|
+
const child = execFile("git", [...args], {
|
|
328
|
+
encoding: "utf-8",
|
|
329
|
+
timeout,
|
|
330
|
+
signal,
|
|
331
|
+
windowsHide: true,
|
|
332
|
+
});
|
|
333
|
+
let stdout = "";
|
|
334
|
+
child.stdout?.on("data", (chunk) => {
|
|
335
|
+
stdout += chunk;
|
|
336
|
+
});
|
|
337
|
+
child.on("close", (code) => {
|
|
338
|
+
code === 0
|
|
339
|
+
? resolve(stdout)
|
|
340
|
+
: reject(new Error(`git ${args[0]} exited ${code}`));
|
|
341
|
+
});
|
|
342
|
+
child.on("error", reject);
|
|
343
|
+
});
|
|
344
|
+
};
|
|
345
|
+
try {
|
|
346
|
+
const [tracked, staged, untracked] = await Promise.all([
|
|
347
|
+
runGit(["diff", "--name-only"]),
|
|
348
|
+
runGit(["diff", "--cached", "--name-only"]),
|
|
349
|
+
runGit(["ls-files", "--others", "--exclude-standard"]),
|
|
350
|
+
]);
|
|
351
|
+
return {
|
|
352
|
+
tracked: tracked.trim().split("\n").filter((f) => f.length > 0).sort(),
|
|
353
|
+
staged: staged.trim().split("\n").filter((f) => f.length > 0).sort(),
|
|
354
|
+
untracked: untracked.trim().split("\n").filter((f) => f.length > 0).sort(),
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
catch {
|
|
358
|
+
return null;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
/** v1.17 (sync): Capture git file state using sequential execFileSync.
|
|
362
|
+
*
|
|
363
|
+
* @deprecated Use captureGitFileStateAsync() for the primary path.
|
|
364
|
+
* This sync fallback exists for legacy callers that cannot be made async
|
|
365
|
+
* (e.g. reconstructSession during startup). Uses execFileSync — shell-free,
|
|
366
|
+
* unlike the old execSync-based implementation. */
|
|
367
|
+
export function captureGitFileState() {
|
|
368
|
+
try {
|
|
369
|
+
const tracked = execFileSync("git", ["diff", "--name-only"], {
|
|
370
|
+
encoding: "utf-8",
|
|
371
|
+
timeout: 5000,
|
|
372
|
+
}).trim();
|
|
373
|
+
const staged = execFileSync("git", ["diff", "--cached", "--name-only"], {
|
|
374
|
+
encoding: "utf-8",
|
|
375
|
+
timeout: 5000,
|
|
376
|
+
}).trim();
|
|
377
|
+
const untracked = execFileSync("git", ["ls-files", "--others", "--exclude-standard"], {
|
|
378
|
+
encoding: "utf-8",
|
|
379
|
+
timeout: 5000,
|
|
380
|
+
}).trim();
|
|
381
|
+
return {
|
|
382
|
+
tracked: tracked.split("\n").filter((f) => f.length > 0).sort(),
|
|
383
|
+
staged: staged.split("\n").filter((f) => f.length > 0).sort(),
|
|
384
|
+
untracked: untracked.split("\n").filter((f) => f.length > 0).sort(),
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
catch {
|
|
388
|
+
return null;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
/** v1.16: Capture modified files as a flat sorted array.
|
|
392
|
+
* @deprecated v1.17 — Use captureGitFileState() for full coverage. */
|
|
393
|
+
export function captureGitModifiedFiles() {
|
|
394
|
+
const state = captureGitFileState();
|
|
395
|
+
if (!state)
|
|
396
|
+
return null;
|
|
397
|
+
return [...new Set([...state.tracked, ...state.staged, ...state.untracked])].sort();
|
|
398
|
+
}
|
|
399
|
+
// ── Built-in: GitEvidenceProvider ──────────────────────────────────────────
|
|
400
|
+
/** Captures git file state (tracked, staged, untracked) via the async
|
|
401
|
+
* captureGitFileStateAsync() when a context is provided, falling back
|
|
402
|
+
* to the synchronous captureGitFileState() for legacy callers. */
|
|
403
|
+
export class GitEvidenceProvider {
|
|
404
|
+
name = "git";
|
|
405
|
+
capture(context) {
|
|
406
|
+
const capture = context
|
|
407
|
+
? captureGitFileStateAsync(context.signal, context.timeoutMs)
|
|
408
|
+
: captureGitFileState();
|
|
409
|
+
const statePromise = capture instanceof Promise ? capture : Promise.resolve(capture);
|
|
410
|
+
return statePromise.then((state) => {
|
|
411
|
+
if (!state)
|
|
412
|
+
return null;
|
|
413
|
+
const files = [...new Set([
|
|
414
|
+
...state.tracked,
|
|
415
|
+
...state.staged,
|
|
416
|
+
...state.untracked,
|
|
417
|
+
])].sort();
|
|
418
|
+
const fingerprints = {};
|
|
419
|
+
for (const file of files) {
|
|
420
|
+
try {
|
|
421
|
+
const stat = statSync(file);
|
|
422
|
+
const hash = createHash("sha256").update(readFileSync(file)).digest("hex");
|
|
423
|
+
fingerprints[file] = `${stat.mode}:${hash}`;
|
|
424
|
+
}
|
|
425
|
+
catch {
|
|
426
|
+
// Deleted files are evidence too. A stable sentinel lets the diff
|
|
427
|
+
// distinguish deleted/restored transitions across a round.
|
|
428
|
+
fingerprints[file] = "missing";
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
return {
|
|
432
|
+
provider: "git",
|
|
433
|
+
timestamp: Date.now(),
|
|
434
|
+
files,
|
|
435
|
+
data: {
|
|
436
|
+
tracked: state.tracked,
|
|
437
|
+
staged: state.staged,
|
|
438
|
+
untracked: state.untracked,
|
|
439
|
+
fingerprints,
|
|
440
|
+
},
|
|
441
|
+
};
|
|
442
|
+
}); // end of .then()
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
registerEvidenceProvider("git", () => new GitEvidenceProvider());
|
|
446
|
+
// ── Utility ────────────────────────────────────────────────────────────────
|
|
447
|
+
/** Extract merged file list from evidence snapshots for backward compat
|
|
448
|
+
* with runtimeFilesChanged (string[] | null).
|
|
449
|
+
*
|
|
450
|
+
* Looks for the "git" provider first; falls back to merging all
|
|
451
|
+
* providers' files arrays (deduplicated). */
|
|
452
|
+
export function extractFilesFromSnapshots(snapshots) {
|
|
453
|
+
if (snapshots.length === 0)
|
|
454
|
+
return null;
|
|
455
|
+
// Prefer the git provider for backward compat
|
|
456
|
+
const gitSnapshot = snapshots.find((s) => s.provider === "git");
|
|
457
|
+
if (gitSnapshot)
|
|
458
|
+
return [...gitSnapshot.files].sort();
|
|
459
|
+
// Fallback: merge all providers
|
|
460
|
+
const allFiles = new Set();
|
|
461
|
+
for (const s of snapshots) {
|
|
462
|
+
for (const f of s.files)
|
|
463
|
+
allFiles.add(f);
|
|
464
|
+
}
|
|
465
|
+
return [...allFiles].sort();
|
|
466
|
+
}
|
|
467
|
+
/** Compute a diff between two evidence collections (before → after).
|
|
468
|
+
* Returns files that appeared in the after-snapshot but not the before.
|
|
469
|
+
* Used by runtime.ts to compute runtimeFilesChanged. */
|
|
470
|
+
function snapshotFingerprints(snapshot) {
|
|
471
|
+
const value = snapshot.data.fingerprints;
|
|
472
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
473
|
+
return null;
|
|
474
|
+
const fingerprints = {};
|
|
475
|
+
for (const [file, fingerprint] of Object.entries(value)) {
|
|
476
|
+
if (typeof fingerprint === "string")
|
|
477
|
+
fingerprints[file] = fingerprint;
|
|
478
|
+
}
|
|
479
|
+
return fingerprints;
|
|
480
|
+
}
|
|
481
|
+
function diffProviderSnapshot(before, after) {
|
|
482
|
+
const beforeSet = new Set(before.files);
|
|
483
|
+
const afterSet = new Set(after.files);
|
|
484
|
+
const beforeFingerprints = snapshotFingerprints(before);
|
|
485
|
+
const afterFingerprints = snapshotFingerprints(after);
|
|
486
|
+
const candidates = new Set([...before.files, ...after.files]);
|
|
487
|
+
return [...candidates].filter((file) => {
|
|
488
|
+
if (beforeSet.has(file) !== afterSet.has(file))
|
|
489
|
+
return true;
|
|
490
|
+
if (!beforeFingerprints || !afterFingerprints)
|
|
491
|
+
return false;
|
|
492
|
+
return beforeFingerprints[file] !== afterFingerprints[file];
|
|
493
|
+
}).sort();
|
|
494
|
+
}
|
|
495
|
+
/** Return provider snapshots narrowed to evidence produced during this round.
|
|
496
|
+
* The full provider payload remains available in data, while files contains
|
|
497
|
+
* only added/removed/content-changed paths. */
|
|
498
|
+
export function diffSnapshotCollections(before, after) {
|
|
499
|
+
return after.map((snapshot) => {
|
|
500
|
+
const baseline = before.find((item) => item.provider === snapshot.provider);
|
|
501
|
+
if (!baseline)
|
|
502
|
+
return snapshot;
|
|
503
|
+
return {
|
|
504
|
+
...snapshot,
|
|
505
|
+
files: diffProviderSnapshot(baseline, snapshot),
|
|
506
|
+
};
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
export function diffSnapshots(before, after) {
|
|
510
|
+
return extractFilesFromSnapshots(diffSnapshotCollections(before, after));
|
|
511
|
+
}
|
|
512
|
+
//# sourceMappingURL=evidence-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-provider.js","sourceRoot":"","sources":["../src/evidence-provider.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** LoopForge —
|
|
1
|
+
/** LoopForge — Cognitive State Runtime for AI coding agents.
|
|
2
2
|
*
|
|
3
3
|
* TypeScript reference implementation v1.3.
|
|
4
4
|
*
|
|
@@ -21,22 +21,28 @@
|
|
|
21
21
|
* const server = new McpServer();
|
|
22
22
|
* server.start();
|
|
23
23
|
*/
|
|
24
|
-
export { Mode, AgentStatus,
|
|
25
|
-
export type {
|
|
26
|
-
export { getPolicy, loadPolicy, resetPolicy, DEFAULT_POLICY,
|
|
27
|
-
export type { LoopPolicy, ConstraintsPolicy, SummaryPolicy,
|
|
28
|
-
export
|
|
29
|
-
export {
|
|
30
|
-
export {
|
|
31
|
-
export { compileLoop, decideLevel, compileL2, alignTask, checkLoopHealth, computeAdvisories, computeGoalTextHash, deriveGoalId, getPreviousRound, buildSelfEvalBlock, buildRollingSummary, formatRollingSummaryForPrompt, filterConstraintsForSubTask, formatDelegationPrompt, buildDelegationSummary, } from "./loop-compiler.js";
|
|
24
|
+
export { Mode, AgentStatus, makeExecutionFeedback, makeSelfEvaluation, makeLoopObjective, makeLoopHealth, makeRollingSummary, makeTaskAlignment, makeLoopRoundResult, makeLoopCompileRequest, makeLoopCompileResponse, makeSessionState, makeTaskId, toDict, SELF_EVAL_REGEX, makeEvidenceSnapshot, makeVerificationFlag, makeVerificationResult, makeEnforcementResult, makeCheckpointSummary, } from "./protocol.js";
|
|
25
|
+
export type { ExecutionFeedback, SelfEvaluation, LoopForgeRequest, LoopObjective, LoopHealth, RollingSummary, TaskAlignment, LoopRoundResult, LoopCompileRequest, LoopCompileResponse, LoopForgeResponse, SessionState, AgentLoopResult, WorkerResult, EvidenceSnapshot, VerificationFlag, VerificationResult, EnforcementResult, CriterionRevision, CheckpointSummary, PromptArtifact, } from "./protocol.js";
|
|
26
|
+
export { getPolicy, loadPolicy, resetPolicy, DEFAULT_POLICY, writeStateFile, } from "./policy.js";
|
|
27
|
+
export type { LoopPolicy, ConstraintsPolicy, SummaryPolicy, EnginePolicy, BackendPolicy, PromptPolicy, StateFilePolicy, EvidencePolicy, CommandEvidencePolicy, McpPolicy, } from "./policy.js";
|
|
28
|
+
export { FileLoopStore, LoopStoreBackend, VaultBackendLoopStore, LOOP_STORE_SCHEMA_VERSION, } from "./loop-store.js";
|
|
29
|
+
export type { LoopStore, LoopSessionDocument, LoopRoundDocument, LoopStoreMigrationResult, } from "./loop-store.js";
|
|
30
|
+
export { compileLoop, decideLevel, alignTask, checkLoopHealth, computeGoalTextHash, deriveGoalId, getPreviousRound, buildSelfEvalBlock, buildRollingSummary, } from "./loop-compiler.js";
|
|
32
31
|
export { ReplayBackend } from "./replay.js";
|
|
33
32
|
export { LoopForgeEngine, createEngine, extractSelfEvaluation, heuristicSelfEvaluation, buildSelfEvaluation, parseExecutionEvidence, parseCriterionRevisions, parseWorkerResults, } from "./engine.js";
|
|
34
33
|
export type { EngineMetrics, DelegationEntry } from "./engine.js";
|
|
35
|
-
export {
|
|
36
|
-
export { RuntimeStatus } from "./protocol.js";
|
|
37
|
-
export type { RoundContext, AgentExecutor, StopReason, RoundStartInfo, RoundCompleteInfo, HeartbeatInfo, TimeoutInfo, HealthWarning, RuntimeConfig, RunResult, } from "./protocol.js";
|
|
34
|
+
export type { StopReason } from "./protocol.js";
|
|
38
35
|
export { McpServer } from "./mcp/server.js";
|
|
39
36
|
export { SessionManager } from "./mcp/session.js";
|
|
40
37
|
export type { McpSession, McpSessionSummary } from "./mcp/session.js";
|
|
41
|
-
export {
|
|
38
|
+
export { EvidenceCollector, GitEvidenceProvider, CommandEvidenceProvider, registerEvidenceProvider, unregisterEvidenceProvider, extractFilesFromSnapshots, diffSnapshots, diffSnapshotCollections, } from "./evidence-provider.js";
|
|
39
|
+
export type { ProviderSnapshot, EvidenceProvider, EvidenceCaptureContext, EvidenceCaptureResult, EvidenceCollectOptions, EvidenceProviderFactory, CommandEvidenceData, } from "./evidence-provider.js";
|
|
40
|
+
export { logEvent, startSpan, setTraceSink, getTraceSink, } from "./observability.js";
|
|
41
|
+
export type { LogEventData, TraceStatus, TraceRecord, TraceSink, TraceContext, TraceSpan, } from "./observability.js";
|
|
42
|
+
export { PolicyMetricsCollector, policyMetrics, getPolicyMetrics, resetPolicyMetrics, } from "./policy-metrics.js";
|
|
43
|
+
export type { PolicyMetricsSnapshot } from "./policy-metrics.js";
|
|
44
|
+
export { COGNITIVE_CHECKPOINT_SCHEMA_VERSION, createCognitiveCheckpoint, } from "./interop.js";
|
|
45
|
+
export type { CognitiveStateCheckpoint, CognitiveCheckpointSink, } from "./interop.js";
|
|
46
|
+
export { ROUND_TRANSACTION_SCHEMA_VERSION, RoundTransactionCoordinator, makeRoundId, prepareRoundTransaction, parseRoundTransactionSnapshot, } from "./round-transaction.js";
|
|
47
|
+
export type { RoundTransactionPhase, RoundTransactionSnapshot, RoundTransactionInput, RoundTransactionOutcome, } from "./round-transaction.js";
|
|
42
48
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EACL,IAAI,EACJ,WAAW,EACX,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|