loopforge 1.3.0 → 1.3.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.
Files changed (40) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +2 -0
  3. package/dist/backends/fs.d.ts.map +1 -1
  4. package/dist/backends/fs.js +1 -0
  5. package/dist/backends/fs.js.map +1 -1
  6. package/dist/cli.js +36 -0
  7. package/dist/cli.js.map +1 -1
  8. package/dist/engine.d.ts.map +1 -1
  9. package/dist/engine.js +4 -0
  10. package/dist/engine.js.map +1 -1
  11. package/dist/loop-compiler.js +1 -1
  12. package/dist/loop-compiler.js.map +1 -1
  13. package/dist/mcp/session.d.ts +11 -0
  14. package/dist/mcp/session.d.ts.map +1 -1
  15. package/dist/mcp/session.js +173 -7
  16. package/dist/mcp/session.js.map +1 -1
  17. package/dist/mcp/tools.d.ts +20 -0
  18. package/dist/mcp/tools.d.ts.map +1 -1
  19. package/dist/mcp/tools.js +46 -0
  20. package/dist/mcp/tools.js.map +1 -1
  21. package/dist/policy.d.ts.map +1 -1
  22. package/dist/policy.js.map +1 -1
  23. package/dist/tests/loop-compiler.test.js +21 -0
  24. package/dist/tests/loop-compiler.test.js.map +1 -1
  25. package/dist/tests/mcp.test.js +186 -0
  26. package/dist/tests/mcp.test.js.map +1 -1
  27. package/package.json +1 -1
  28. package/skills/perception/SKILL.md +10 -2
  29. package/dist/autonomous.d.ts +0 -84
  30. package/dist/autonomous.d.ts.map +0 -1
  31. package/dist/autonomous.js +0 -250
  32. package/dist/autonomous.js.map +0 -1
  33. package/dist/backends/ai.d.ts +0 -37
  34. package/dist/backends/ai.d.ts.map +0 -1
  35. package/dist/backends/ai.js +0 -98
  36. package/dist/backends/ai.js.map +0 -1
  37. package/dist/tests/autonomous.test.d.ts +0 -7
  38. package/dist/tests/autonomous.test.d.ts.map +0 -1
  39. package/dist/tests/autonomous.test.js +0 -294
  40. package/dist/tests/autonomous.test.js.map +0 -1
@@ -1,37 +0,0 @@
1
- /** LoopForge — Anthropic API backend (v1.1).
2
- *
3
- * Calls Claude API via Node.js built-in fetch. Zero additional dependencies.
4
- * Uses ANTHROPIC_API_KEY from environment. Falls back gracefully on failure.
5
- */
6
- export interface AiConfig {
7
- /** Anthropic API key. Default: process.env.ANTHROPIC_API_KEY */
8
- apiKey?: string;
9
- /** Model ID. Default: claude-sonnet-4-6 */
10
- model?: string;
11
- /** Max output tokens. Default: 8192 */
12
- maxTokens?: number;
13
- /** Base URL override (for proxies / alternative endpoints). */
14
- baseUrl?: string;
15
- /** Timeout in ms. Default: 300_000 (5 min). */
16
- timeoutMs?: number;
17
- }
18
- export interface AiResult {
19
- /** The model's text response, or null on failure. */
20
- text: string | null;
21
- /** True if the API call succeeded. */
22
- ok: boolean;
23
- /** Error message if !ok. */
24
- error: string | null;
25
- /** Model used. */
26
- model: string;
27
- }
28
- /** Call Claude with a single user message. Returns the text response. */
29
- export declare function callClaude(prompt: string, config?: AiConfig): Promise<AiResult>;
30
- import type { AgentExecutor } from "../autonomous.js";
31
- /** Create an AgentExecutor backed by Claude API.
32
- * Usage:
33
- * const executor = createClaudeExecutor({ apiKey: "sk-ant-..." });
34
- * const result = await runAutonomousLoop(engine, config, executor);
35
- */
36
- export declare function createClaudeExecutor(aiConfig?: AiConfig): AgentExecutor;
37
- //# sourceMappingURL=ai.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/backends/ai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,QAAQ;IACvB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,qDAAqD;IACrD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,sCAAsC;IACtC,EAAE,EAAE,OAAO,CAAC;IACZ,4BAA4B;IAC5B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAQD,yEAAyE;AACzE,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,QAAa,GACpB,OAAO,CAAC,QAAQ,CAAC,CA+EnB;AAMD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,GAAE,QAAa,GAAG,aAAa,CAQ3E"}
@@ -1,98 +0,0 @@
1
- /** LoopForge — Anthropic API backend (v1.1).
2
- *
3
- * Calls Claude API via Node.js built-in fetch. Zero additional dependencies.
4
- * Uses ANTHROPIC_API_KEY from environment. Falls back gracefully on failure.
5
- */
6
- // ═══════════════════════════════════════════════════════════════════════════
7
- // API call
8
- // ═══════════════════════════════════════════════════════════════════════════
9
- const DEFAULT_BASE_URL = "https://api.anthropic.com/v1";
10
- /** Call Claude with a single user message. Returns the text response. */
11
- export async function callClaude(prompt, config = {}) {
12
- const apiKey = config.apiKey ?? process.env.ANTHROPIC_API_KEY ?? "";
13
- const model = config.model ?? process.env.LOOPFORGE_MODEL ?? "claude-sonnet-4-6";
14
- const maxTokens = config.maxTokens ?? 8192;
15
- const baseUrl = config.baseUrl ?? process.env.ANTHROPIC_BASE_URL ?? DEFAULT_BASE_URL;
16
- const timeoutMs = config.timeoutMs ?? 300_000;
17
- if (!apiKey) {
18
- return {
19
- text: null,
20
- ok: false,
21
- error: "ANTHROPIC_API_KEY not set. Export it or pass apiKey in config.",
22
- model,
23
- };
24
- }
25
- const controller = new AbortController();
26
- const timer = setTimeout(() => controller.abort(), timeoutMs);
27
- try {
28
- const resp = await fetch(`${baseUrl}/messages`, {
29
- method: "POST",
30
- headers: {
31
- "x-api-key": apiKey,
32
- "anthropic-version": "2023-06-01",
33
- "content-type": "application/json",
34
- },
35
- body: JSON.stringify({
36
- model,
37
- max_tokens: maxTokens,
38
- messages: [{ role: "user", content: prompt }],
39
- }),
40
- signal: controller.signal,
41
- });
42
- clearTimeout(timer);
43
- if (!resp.ok) {
44
- const body = await resp.text().catch(() => "");
45
- return {
46
- text: null,
47
- ok: false,
48
- error: `API returned ${resp.status}: ${body.slice(0, 300)}`,
49
- model,
50
- };
51
- }
52
- const data = (await resp.json());
53
- const content = data.content;
54
- if (!Array.isArray(content) || content.length === 0) {
55
- return {
56
- text: null, ok: false,
57
- error: `Unexpected response shape: ${JSON.stringify(data).slice(0, 200)}`,
58
- model,
59
- };
60
- }
61
- const first = content[0];
62
- const text = String(first.text ?? "");
63
- if (!text) {
64
- return {
65
- text: null, ok: false,
66
- error: "Empty response text from model.",
67
- model,
68
- };
69
- }
70
- return { text, ok: true, error: null, model };
71
- }
72
- catch (err) {
73
- clearTimeout(timer);
74
- if (err instanceof DOMException && err.name === "AbortError") {
75
- return { text: null, ok: false, error: `Request timed out after ${timeoutMs}ms`, model };
76
- }
77
- return {
78
- text: null, ok: false,
79
- error: `Fetch error: ${err instanceof Error ? err.message : String(err)}`,
80
- model,
81
- };
82
- }
83
- }
84
- /** Create an AgentExecutor backed by Claude API.
85
- * Usage:
86
- * const executor = createClaudeExecutor({ apiKey: "sk-ant-..." });
87
- * const result = await runAutonomousLoop(engine, config, executor);
88
- */
89
- export function createClaudeExecutor(aiConfig = {}) {
90
- return async (prompt, _round) => {
91
- const result = await callClaude(prompt, aiConfig);
92
- if (!result.ok || result.text === null) {
93
- throw new Error(`Claude API error (round ${_round}): ${result.error}`);
94
- }
95
- return result.text;
96
- };
97
- }
98
- //# sourceMappingURL=ai.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/backends/ai.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- /** LoopForge — Autonomous loop tests (v1.1).
2
- *
3
- * Tests: extractSelfEvaluation, heuristicSelfEvaluation, buildSelfEvalBlock,
4
- * autoFeedback, runOneRound.
5
- */
6
- export {};
7
- //# sourceMappingURL=autonomous.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"autonomous.test.d.ts","sourceRoot":"","sources":["../../src/tests/autonomous.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -1,294 +0,0 @@
1
- /** LoopForge — Autonomous loop tests (v1.1).
2
- *
3
- * Tests: extractSelfEvaluation, heuristicSelfEvaluation, buildSelfEvalBlock,
4
- * autoFeedback, runOneRound.
5
- */
6
- import { describe, it } from "node:test";
7
- import assert from "node:assert/strict";
8
- import { tmpdir } from "node:os";
9
- import { mkdtempSync } from "node:fs";
10
- import { join } from "node:path";
11
- import { extractSelfEvaluation, heuristicSelfEvaluation, createEngine, } from "../engine.js";
12
- import { buildSelfEvalBlock } from "../loop-compiler.js";
13
- import { makeSelfEvaluation } from "../protocol.js";
14
- import { runOneRound } from "../autonomous.js";
15
- // ═══════════════════════════════════════════════════════════════════════════
16
- // Helpers
17
- // ═══════════════════════════════════════════════════════════════════════════
18
- function makeAgentOutput(evalOverrides = {}) {
19
- const se = makeSelfEvaluation({
20
- success: true,
21
- output_summary: "Found 3 vulnerabilities in the ERC20 contract.",
22
- constraint_violations: [],
23
- should_continue: true,
24
- ...evalOverrides,
25
- });
26
- return [
27
- "## Security Audit Results",
28
- "",
29
- "I audited the ERC20 contract and found 3 issues:",
30
- "- Reentrancy in withdraw()",
31
- "- Integer overflow in transfer()",
32
- "- Missing access control in mint()",
33
- "",
34
- "---loopforge-eval",
35
- JSON.stringify(se, null, 2),
36
- "---end-loopforge-eval",
37
- "",
38
- "All issues have been documented with PoC exploits.",
39
- ].join("\n");
40
- }
41
- function makeTmpDir() {
42
- const dir = mkdtempSync(join(tmpdir(), "loopforge-test-"));
43
- return dir;
44
- }
45
- // ═══════════════════════════════════════════════════════════════════════════
46
- // extractSelfEvaluation
47
- // ═══════════════════════════════════════════════════════════════════════════
48
- describe("extractSelfEvaluation", () => {
49
- it("extracts valid self-evaluation from agent output", () => {
50
- const output = makeAgentOutput({ success: true, should_continue: false });
51
- const result = extractSelfEvaluation(output);
52
- assert.ok(result !== null);
53
- assert.equal(result.success, true);
54
- assert.equal(result.should_continue, false);
55
- assert.equal(result.constraint_violations.length, 0);
56
- assert.ok(result.output_summary.includes("vulnerabilities"));
57
- });
58
- it("returns null when no eval block present", () => {
59
- const output = "Just some regular text without any eval block.";
60
- const result = extractSelfEvaluation(output);
61
- assert.equal(result, null);
62
- });
63
- it("returns null for invalid JSON in eval block", () => {
64
- const output = [
65
- "---loopforge-eval",
66
- "{invalid json here}",
67
- "---end-loopforge-eval",
68
- ].join("\n");
69
- const result = extractSelfEvaluation(output);
70
- assert.equal(result, null);
71
- });
72
- it("returns null when required fields are missing", () => {
73
- const output = [
74
- "---loopforge-eval",
75
- JSON.stringify({ success: true }),
76
- "---end-loopforge-eval",
77
- ].join("\n");
78
- const result = extractSelfEvaluation(output);
79
- assert.equal(result, null);
80
- });
81
- it("returns null when success is not boolean", () => {
82
- const output = [
83
- "---loopforge-eval",
84
- JSON.stringify({
85
- success: "yes",
86
- output_summary: "done",
87
- constraint_violations: [],
88
- should_continue: false,
89
- }),
90
- "---end-loopforge-eval",
91
- ].join("\n");
92
- const result = extractSelfEvaluation(output);
93
- assert.equal(result, null);
94
- });
95
- it("extracts eval with constraint violations", () => {
96
- const output = makeAgentOutput({
97
- success: false,
98
- constraint_violations: ["Modified file outside scope"],
99
- should_continue: true,
100
- });
101
- const result = extractSelfEvaluation(output);
102
- assert.ok(result !== null);
103
- assert.equal(result.success, false);
104
- assert.equal(result.constraint_violations.length, 1);
105
- assert.equal(result.constraint_violations[0], "Modified file outside scope");
106
- });
107
- });
108
- // ═══════════════════════════════════════════════════════════════════════════
109
- // heuristicSelfEvaluation
110
- // ═══════════════════════════════════════════════════════════════════════════
111
- describe("heuristicSelfEvaluation", () => {
112
- it("detects success from completion keywords", () => {
113
- const output = "Task completed successfully. All tests pass. The module is ready.";
114
- const result = heuristicSelfEvaluation(output);
115
- assert.ok(result !== null);
116
- assert.equal(result.success, true);
117
- });
118
- it("detects failure from error keywords", () => {
119
- const output = "Failed to compile. Error: Cannot find module 'express'. Exception thrown.";
120
- const result = heuristicSelfEvaluation(output);
121
- assert.ok(result !== null);
122
- assert.equal(result.success, false);
123
- });
124
- it("detects remaining work", () => {
125
- const output = "Partially completed. Still need to implement the authentication module. Continue with step 3.";
126
- const result = heuristicSelfEvaluation(output);
127
- assert.ok(result !== null);
128
- assert.equal(result.should_continue, true);
129
- });
130
- it("returns null for empty text", () => {
131
- // heuristicSelfEvaluation never returns null — it always produces a best-effort result
132
- const result = heuristicSelfEvaluation("");
133
- assert.ok(result !== null);
134
- });
135
- });
136
- // ═══════════════════════════════════════════════════════════════════════════
137
- // buildSelfEvalBlock
138
- // ═══════════════════════════════════════════════════════════════════════════
139
- describe("buildSelfEvalBlock", () => {
140
- it("includes the round number", () => {
141
- const block = buildSelfEvalBlock(5);
142
- assert.ok(block.includes("5"));
143
- });
144
- it("includes required markers", () => {
145
- const block = buildSelfEvalBlock(1);
146
- assert.ok(block.includes("---loopforge-eval"));
147
- assert.ok(block.includes("---end-loopforge-eval"));
148
- assert.ok(block.includes("success"));
149
- assert.ok(block.includes("output_summary"));
150
- assert.ok(block.includes("constraint_violations"));
151
- assert.ok(block.includes("should_continue"));
152
- });
153
- it("includes field rules", () => {
154
- const block = buildSelfEvalBlock(1);
155
- assert.ok(block.includes("Field rules"));
156
- assert.ok(block.includes("true ONLY if"));
157
- });
158
- it("produces different output for different rounds", () => {
159
- const b1 = buildSelfEvalBlock(1);
160
- const b2 = buildSelfEvalBlock(2);
161
- assert.notEqual(b1, b2);
162
- });
163
- });
164
- // ═══════════════════════════════════════════════════════════════════════════
165
- // autoFeedback
166
- // ═══════════════════════════════════════════════════════════════════════════
167
- describe("Engine — autoFeedback", () => {
168
- it("records self-evaluation without errors", () => {
169
- const engine = createEngine();
170
- const se = makeSelfEvaluation({
171
- success: true,
172
- output_summary: "Task completed successfully.",
173
- constraint_violations: [],
174
- should_continue: false,
175
- });
176
- const quality = engine.autoFeedback(se, "test-loop", 1, "Test task");
177
- assert.equal(quality, 5);
178
- });
179
- it("scores quality=2 for failed round with violations", () => {
180
- const engine = createEngine();
181
- const se = makeSelfEvaluation({
182
- success: false,
183
- output_summary: "Failed to complete.",
184
- constraint_violations: ["broke constraint X"],
185
- should_continue: true,
186
- });
187
- const quality = engine.autoFeedback(se, "test-loop", 1, "Test task");
188
- assert.equal(quality, 2);
189
- });
190
- it("updates quality trend", () => {
191
- const engine = createEngine();
192
- const se = makeSelfEvaluation({
193
- success: true,
194
- output_summary: "done",
195
- constraint_violations: [],
196
- should_continue: true,
197
- });
198
- engine.autoFeedback(se, "test-loop", 1, "Test task");
199
- assert.ok(engine.state !== null);
200
- assert.equal(engine.state.quality_trend.length, 1);
201
- assert.equal(engine.state.quality_trend[0], 5);
202
- });
203
- });
204
- // ═══════════════════════════════════════════════════════════════════════════
205
- // runOneRound
206
- // ═══════════════════════════════════════════════════════════════════════════
207
- describe("runOneRound — autonomous loop", () => {
208
- const baseConfig = {
209
- task: "Audit ERC20 token for security vulnerabilities",
210
- loopId: "audit-erc20",
211
- goalId: "audit",
212
- maxRounds: 10,
213
- };
214
- it("round 1 produces L2 prompt without stopping", () => {
215
- const engine = createEngine();
216
- const result = runOneRound(engine, baseConfig, 1, null);
217
- assert.equal(result.stopNow, false);
218
- assert.ok(result.roundOutput !== null);
219
- assert.equal(result.roundOutput.round, 1);
220
- assert.ok(result.roundOutput.prompt.length > 100);
221
- // Round 1 prompt should include self-eval instructions
222
- assert.ok(result.roundOutput.prompt.includes("---loopforge-eval"));
223
- assert.ok(result.roundOutput.prompt.includes("Self-Evaluation"));
224
- // No self-eval for round 1 (no prior agent output)
225
- assert.equal(result.selfEval, null);
226
- });
227
- it("round 2 extracts self-eval from agent output and compiles", () => {
228
- const engine = createEngine();
229
- // First, establish round 1 lineage
230
- const se1 = makeSelfEvaluation({
231
- success: true,
232
- output_summary: "Round 1: found 3 vulns.",
233
- constraint_violations: [],
234
- should_continue: true,
235
- });
236
- engine.autoFeedback(se1, "audit-erc20", 1, baseConfig.task);
237
- // Now run round 2 with agent output
238
- const agentOutput = makeAgentOutput({
239
- success: true,
240
- output_summary: "Round 1: found 3 vulns in ERC20.",
241
- constraint_violations: [],
242
- should_continue: true,
243
- });
244
- const result = runOneRound(engine, baseConfig, 2, agentOutput);
245
- assert.equal(result.stopNow, false);
246
- assert.ok(result.roundOutput !== null);
247
- assert.equal(result.roundOutput.round, 2);
248
- assert.ok(result.selfEval !== null);
249
- assert.equal(result.selfEval.success, true);
250
- assert.ok(result.extractionSucceeded);
251
- });
252
- it("stops when agent reports should_continue=false", () => {
253
- const engine = createEngine();
254
- // Round 1 lineage
255
- engine.autoFeedback(makeSelfEvaluation({ success: true, output_summary: "r1", constraint_violations: [], should_continue: true }), "audit-erc20", 1, baseConfig.task);
256
- // Round 2 agent output says task complete
257
- const agentOutput = makeAgentOutput({
258
- success: true,
259
- output_summary: "All done.",
260
- constraint_violations: [],
261
- should_continue: false,
262
- });
263
- const result = runOneRound(engine, baseConfig, 2, agentOutput);
264
- assert.equal(result.stopNow, true);
265
- assert.equal(result.stopReason, "task_complete");
266
- assert.equal(result.roundOutput, null);
267
- });
268
- it("stops when max rounds exceeded", () => {
269
- const engine = createEngine();
270
- const config = { ...baseConfig, maxRounds: 3 };
271
- const result = runOneRound(engine, config, 4, null);
272
- assert.equal(result.stopNow, true);
273
- assert.equal(result.stopReason, "max_rounds");
274
- });
275
- it("stops on extraction failure (no eval block in output)", () => {
276
- const engine = createEngine();
277
- engine.autoFeedback(makeSelfEvaluation({ success: true, output_summary: "r1", constraint_violations: [], should_continue: true }), "audit-erc20", 1, baseConfig.task);
278
- const badOutput = "Just some text without any eval block.";
279
- const result = runOneRound(engine, baseConfig, 2, badOutput);
280
- assert.equal(result.stopNow, true);
281
- assert.equal(result.stopReason, "extraction_failed");
282
- });
283
- it("prompt includes self-eval block on every round", () => {
284
- const engine = createEngine();
285
- // Round 1
286
- const r1 = runOneRound(engine, baseConfig, 1, null);
287
- assert.ok(r1.roundOutput.prompt.includes("---loopforge-eval"));
288
- // Round 2
289
- engine.autoFeedback(makeSelfEvaluation({ success: true, output_summary: "r1 done", constraint_violations: [], should_continue: true }), "audit-erc20", 1, baseConfig.task);
290
- const r2 = runOneRound(engine, baseConfig, 2, makeAgentOutput({ success: true, output_summary: "r1", constraint_violations: [], should_continue: true }));
291
- assert.ok(r2.roundOutput.prompt.includes("---loopforge-eval"));
292
- });
293
- });
294
- //# sourceMappingURL=autonomous.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"autonomous.test.js","sourceRoot":"","sources":["../../src/tests/autonomous.test.ts"],"names":[],"mappings":"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"}