loopforge 1.3.0 → 1.7.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.
Files changed (87) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +2 -0
  3. package/dist/backends/fs.d.ts +5 -0
  4. package/dist/backends/fs.d.ts.map +1 -1
  5. package/dist/backends/fs.js +67 -16
  6. package/dist/backends/fs.js.map +1 -1
  7. package/dist/builder.d.ts +0 -1
  8. package/dist/builder.d.ts.map +1 -1
  9. package/dist/builder.js +14 -25
  10. package/dist/builder.js.map +1 -1
  11. package/dist/engine.d.ts +14 -5
  12. package/dist/engine.d.ts.map +1 -1
  13. package/dist/engine.js +206 -105
  14. package/dist/engine.js.map +1 -1
  15. package/dist/index.d.ts +4 -8
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +4 -9
  18. package/dist/index.js.map +1 -1
  19. package/dist/loop-compiler.d.ts +5 -2
  20. package/dist/loop-compiler.d.ts.map +1 -1
  21. package/dist/loop-compiler.js +533 -19
  22. package/dist/loop-compiler.js.map +1 -1
  23. package/dist/mcp/session.d.ts +21 -2
  24. package/dist/mcp/session.d.ts.map +1 -1
  25. package/dist/mcp/session.js +257 -16
  26. package/dist/mcp/session.js.map +1 -1
  27. package/dist/mcp/tools.d.ts +153 -0
  28. package/dist/mcp/tools.d.ts.map +1 -1
  29. package/dist/mcp/tools.js +162 -6
  30. package/dist/mcp/tools.js.map +1 -1
  31. package/dist/observability.d.ts +23 -0
  32. package/dist/observability.d.ts.map +1 -0
  33. package/dist/observability.js +29 -0
  34. package/dist/observability.js.map +1 -0
  35. package/dist/policy.d.ts +15 -0
  36. package/dist/policy.d.ts.map +1 -1
  37. package/dist/policy.js +8 -0
  38. package/dist/policy.js.map +1 -1
  39. package/dist/protocol.d.ts +114 -5
  40. package/dist/protocol.d.ts.map +1 -1
  41. package/dist/protocol.js +44 -3
  42. package/dist/protocol.js.map +1 -1
  43. package/dist/runtime.d.ts +2 -0
  44. package/dist/runtime.d.ts.map +1 -1
  45. package/dist/runtime.js +51 -3
  46. package/dist/runtime.js.map +1 -1
  47. package/dist/tests/builder.test.js +1 -25
  48. package/dist/tests/builder.test.js.map +1 -1
  49. package/dist/tests/engine.test.js +213 -38
  50. package/dist/tests/engine.test.js.map +1 -1
  51. package/dist/tests/generate-schema.test.js +4 -4
  52. package/dist/tests/generate-schema.test.js.map +1 -1
  53. package/dist/tests/loop-compiler.test.js +212 -2
  54. package/dist/tests/loop-compiler.test.js.map +1 -1
  55. package/dist/tests/mcp.test.js +273 -0
  56. package/dist/tests/mcp.test.js.map +1 -1
  57. package/dist/tests/protocol.test.js +2 -4
  58. package/dist/tests/protocol.test.js.map +1 -1
  59. package/dist/tests/verification-gate.test.d.ts +2 -0
  60. package/dist/tests/verification-gate.test.d.ts.map +1 -0
  61. package/dist/tests/verification-gate.test.js +407 -0
  62. package/dist/tests/verification-gate.test.js.map +1 -0
  63. package/dist/verification-gate.d.ts +26 -0
  64. package/dist/verification-gate.d.ts.map +1 -0
  65. package/dist/verification-gate.js +232 -0
  66. package/dist/verification-gate.js.map +1 -0
  67. package/loop_policy.json +8 -0
  68. package/package.json +1 -2
  69. package/skills/perception/SKILL.md +102 -53
  70. package/dist/autonomous.d.ts +0 -84
  71. package/dist/autonomous.d.ts.map +0 -1
  72. package/dist/autonomous.js +0 -250
  73. package/dist/autonomous.js.map +0 -1
  74. package/dist/backends/ai.d.ts +0 -37
  75. package/dist/backends/ai.d.ts.map +0 -1
  76. package/dist/backends/ai.js +0 -98
  77. package/dist/backends/ai.js.map +0 -1
  78. package/dist/cli.d.ts +0 -7
  79. package/dist/cli.d.ts.map +0 -1
  80. package/dist/cli.js +0 -422
  81. package/dist/cli.js.map +0 -1
  82. package/dist/tests/adapter.test.js +0 -104
  83. package/dist/tests/adapter.test.js.map +0 -1
  84. package/dist/tests/autonomous.test.d.ts +0 -7
  85. package/dist/tests/autonomous.test.d.ts.map +0 -1
  86. package/dist/tests/autonomous.test.js +0 -294
  87. package/dist/tests/autonomous.test.js.map +0 -1
package/dist/cli.js DELETED
@@ -1,422 +0,0 @@
1
- #!/usr/bin/env node
2
- /** LoopForge CLI — command-line interface for the loop compiler.
3
- *
4
- * v1.2 — npm install loopforge
5
- */
6
- import { createEngine } from "./engine.js";
7
- import { FSBackend } from "./backends/fs.js";
8
- import { ReplayBackend } from "./replay.js";
9
- import { Mode, makeExecutionFeedback, } from "./protocol.js";
10
- import { LoopRuntime } from "./runtime.js";
11
- // ═══════════════════════════════════════════════════════════════════════════
12
- // Constants
13
- // ═══════════════════════════════════════════════════════════════════════════
14
- const VERSION = "1.2.0";
15
- const VAULT_CONFIG = {
16
- project_vault: ".promptcraft/prompt_vault.json",
17
- global_vault: "~/.promptcraft/global_vault.json",
18
- skills_dir: "skills",
19
- no_global: false,
20
- };
21
- const USAGE = `LoopForge v${VERSION} — Loop-Time Intelligence Layer
22
-
23
- Usage:
24
- loopforge init Initialise .promptcraft vault
25
- loopforge compile [json] Compile a loop prompt
26
- loopforge feedback [json] Record execution feedback
27
- loopforge run [json] Autonomous loop (event-driven runtime)
28
- loopforge replay <loop-id> Show loop timeline
29
- loopforge diff <loop-id> <a> <b> Diff two rounds
30
- loopforge review <loop-id> <rN> Audit stored prompt
31
- loopforge status Vault health summary
32
-
33
- Flags:
34
- --help, -h Show this help
35
- --version, -V Show version
36
-
37
- Pipe JSON via stdin: echo '{"task":"..."}' | loopforge compile
38
- `;
39
- const CMD_HELP = {
40
- init: "loopforge init — create .promptcraft/prompt_vault.json if it doesn't exist.",
41
- compile: "loopforge compile '<json>' — run loop_compile (L0/L1/L2).\n Required: task, loop_id, goal_id. Optional: round, domain, constraints_from_plan, new_since_last_round, force_level.",
42
- feedback: "loopforge feedback '<json>' — record execution result.\n Flat: {loop_id, round, success, score, output}\n Nested: {loop_id, round, feedback: {success, score, output}}",
43
- run: "loopforge run '<json>' — autonomous loop (v1.2).\n Required: task, loop_id. Optional: max_rounds (default 20), plan_source, domain.\n Outputs compiled prompt → reads agent output from stdin → continues until task complete or circuit breaker.",
44
- replay: "loopforge replay <loop-id> — show timeline: round, recompile level, quality, technique, task.",
45
- diff: "loopforge diff <loop-id> <round-a> <round-b> — field-level comparison between two rounds.",
46
- review: "loopforge review <loop-id> <round-num> — structural audit of a stored prompt.",
47
- status: "loopforge status — vault health: entry counts, active loops.",
48
- };
49
- // ═══════════════════════════════════════════════════════════════════════════
50
- // Helpers
51
- // ═══════════════════════════════════════════════════════════════════════════
52
- function die(msg) {
53
- process.stderr.write(`loopforge: ${msg}\n`);
54
- process.exit(1);
55
- }
56
- function showHelp(cmd) {
57
- if (cmd && CMD_HELP[cmd]) {
58
- console.log(CMD_HELP[cmd]);
59
- }
60
- else {
61
- console.log(USAGE);
62
- }
63
- }
64
- async function readStdin() {
65
- return new Promise((resolve) => {
66
- const chunks = [];
67
- process.stdin.on("data", (chunk) => chunks.push(chunk));
68
- process.stdin.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
69
- if (process.stdin.isTTY)
70
- resolve("");
71
- });
72
- }
73
- function parseJson(raw) {
74
- try {
75
- const data = JSON.parse(raw);
76
- if (typeof data !== "object" || Array.isArray(data) || data === null) {
77
- die("input must be a JSON object");
78
- }
79
- return data;
80
- }
81
- catch (e) {
82
- die(`invalid JSON: ${e instanceof Error ? e.message : e}`);
83
- }
84
- }
85
- /** Normalise flat fields into feedback payload — accepts both formats. */
86
- function normaliseFeedbackPayload(data) {
87
- // Already nested: { feedback: { success, score, ... } }
88
- if (data.feedback && typeof data.feedback === "object") {
89
- return data.feedback;
90
- }
91
- // Flat format: { success, score, output, ... } — auto-nest
92
- if (data.success !== undefined || data.score !== undefined) {
93
- return {
94
- output: data.output ?? "",
95
- success: data.success ?? false,
96
- constraint_violations: data.constraint_violations ?? [],
97
- manual_fixes_needed: data.manual_fixes_needed ?? "",
98
- };
99
- }
100
- return null;
101
- }
102
- // ═══════════════════════════════════════════════════════════════════════════
103
- // Commands
104
- // ═══════════════════════════════════════════════════════════════════════════
105
- async function cmdInit() {
106
- const backend = new FSBackend();
107
- const vault = backend.readVault();
108
- if (!vault.entries || !Array.isArray(vault.entries)) {
109
- backend.writeVault({ entries: [] });
110
- console.log("Initialised .promptcraft/prompt_vault.json");
111
- }
112
- else {
113
- const count = vault.entries.length;
114
- console.log(`Vault already exists (${count} entries). Nothing to do.`);
115
- }
116
- }
117
- async function cmdCompile(engine, jsonArg) {
118
- let raw;
119
- if (jsonArg === "--help" || jsonArg === "-h") {
120
- showHelp("compile");
121
- return;
122
- }
123
- if (jsonArg) {
124
- raw = jsonArg;
125
- }
126
- else {
127
- raw = await readStdin();
128
- }
129
- if (!raw.trim())
130
- die("compile requires JSON input (argument or stdin)");
131
- const data = parseJson(raw);
132
- const result = engine.invokeLoopCompile({
133
- task: data.task ?? "",
134
- mode: Mode.LOOP_COMPILE,
135
- vault_config: { ...VAULT_CONFIG },
136
- feedback: null,
137
- skill_name: null,
138
- task_id: null,
139
- ...data,
140
- });
141
- const prompt = result.response?.prompt ?? "Error: no prompt generated";
142
- console.log(prompt);
143
- }
144
- async function cmdFeedback(engine, jsonArg) {
145
- if (jsonArg === "--help" || jsonArg === "-h") {
146
- showHelp("feedback");
147
- return;
148
- }
149
- let raw;
150
- if (jsonArg) {
151
- raw = jsonArg;
152
- }
153
- else {
154
- raw = await readStdin();
155
- }
156
- if (!raw.trim())
157
- die("feedback requires JSON input (argument or stdin)");
158
- const data = parseJson(raw);
159
- const fbPayload = normaliseFeedbackPayload(data);
160
- if (!fbPayload) {
161
- die("feedback requires one of: {feedback:{success,score}} or {success,score} at top level");
162
- }
163
- const result = engine.invokeFeedback({
164
- task: data.task ?? "",
165
- mode: Mode.FEEDBACK,
166
- vault_config: { ...VAULT_CONFIG },
167
- feedback: makeExecutionFeedback({
168
- output: fbPayload.output ?? "",
169
- success: fbPayload.success ?? false,
170
- constraint_violations: fbPayload.constraint_violations ?? [],
171
- manual_fixes_needed: fbPayload.manual_fixes_needed ?? "",
172
- }),
173
- skill_name: null,
174
- task_id: null,
175
- ...data,
176
- });
177
- console.log(result.response?.prompt ?? result.response?.error ?? "Error");
178
- }
179
- function cmdReplay(loopId) {
180
- if (loopId === "--help" || loopId === "-h") {
181
- showHelp("replay");
182
- return;
183
- }
184
- if (!loopId)
185
- die("replay requires a loop-id");
186
- const backend = new FSBackend();
187
- const replay = new ReplayBackend(backend);
188
- const tl = replay.timeline(loopId);
189
- if (!tl.length) {
190
- console.log(`No rounds found for loop "${loopId}".`);
191
- return;
192
- }
193
- console.log(`Loop: ${loopId} (${tl.length} rounds)\n`);
194
- console.log("Round Level Quality Technique Task");
195
- console.log("----- ----- ------- -------------- ----");
196
- for (const entry of tl) {
197
- const rnd = String(entry.round).padStart(5);
198
- const level = String(entry.recompile_level).padEnd(6);
199
- const q = String(entry.quality_score ?? "-").padEnd(8);
200
- const tech = String(entry.technique_used || "-").padEnd(15);
201
- const task = String(entry.task || "").slice(0, 50);
202
- console.log(`${rnd} ${level} ${q} ${tech} ${task}`);
203
- }
204
- }
205
- function cmdDiff(loopId, roundA, roundB) {
206
- if (loopId === "--help" || loopId === "-h") {
207
- showHelp("diff");
208
- return;
209
- }
210
- if (!loopId || !roundA || !roundB) {
211
- die("diff requires <loop-id> <round-a> <round-b>");
212
- }
213
- const backend = new FSBackend();
214
- const replay = new ReplayBackend(backend);
215
- const diff = replay.diff(loopId, parseInt(roundA, 10), parseInt(roundB, 10));
216
- if (diff.missing) {
217
- console.log(`Cannot diff: ${diff.missing} not found.`);
218
- return;
219
- }
220
- console.log(`Diff: ${loopId} round ${diff.round_a} → round ${diff.round_b}\n`);
221
- const changes = diff.changes;
222
- if (!changes.length) {
223
- console.log("No changes detected.");
224
- }
225
- else {
226
- for (const c of changes) {
227
- console.log(` ${c.label}:`);
228
- if (c.field === "constraints_active") {
229
- const added = c.added;
230
- const removed = c.removed;
231
- if (added?.length)
232
- console.log(` + added: [${added.join(", ")}]`);
233
- if (removed?.length)
234
- console.log(` - removed: [${removed.join(", ")}]`);
235
- }
236
- else {
237
- console.log(` before: ${c.before}`);
238
- console.log(` after: ${c.after}`);
239
- }
240
- }
241
- }
242
- const unchanged = diff.unchanged;
243
- if (unchanged?.length) {
244
- console.log(`\nUnchanged: ${unchanged.join(", ")}`);
245
- }
246
- }
247
- function cmdReview(loopId, roundStr) {
248
- if (loopId === "--help" || loopId === "-h") {
249
- showHelp("review");
250
- return;
251
- }
252
- if (!loopId || !roundStr)
253
- die("review requires <loop-id> <round-num>");
254
- const roundNum = parseInt(roundStr, 10);
255
- if (Number.isNaN(roundNum))
256
- die(`invalid round number: ${roundStr}`);
257
- const backend = new FSBackend();
258
- const engine = createEngine("skills", backend);
259
- const context = engine.hydrateLoopContext(loopId);
260
- if (!context) {
261
- console.log(`No entries found for loop "${loopId}".`);
262
- return;
263
- }
264
- const results = context.results ?? [];
265
- const target = results.find((r) => {
266
- const lineage = (r.loop_lineage ?? {});
267
- return lineage.round === roundNum;
268
- });
269
- if (!target) {
270
- console.log(`Round ${roundNum} not found in loop "${loopId}".`);
271
- return;
272
- }
273
- const result = engine.handleReview({
274
- task: target.task ?? "review",
275
- mode: Mode.REVIEW,
276
- vault_config: { ...VAULT_CONFIG },
277
- feedback: null,
278
- skill_name: null,
279
- task_id: null,
280
- }, { results: [target], global_entries: [] });
281
- console.log(result.response?.prompt ?? "Review produced no output.");
282
- }
283
- async function cmdRun(_engine, jsonArg) {
284
- if (jsonArg === "--help" || jsonArg === "-h") {
285
- showHelp("run");
286
- return;
287
- }
288
- let raw;
289
- if (jsonArg) {
290
- raw = jsonArg;
291
- }
292
- else {
293
- raw = await readStdin();
294
- }
295
- if (!raw.trim())
296
- die("run requires JSON input (argument or stdin)");
297
- const data = parseJson(raw);
298
- const task = data.task ?? "";
299
- const loopId = data.loop_id ?? "";
300
- if (!task)
301
- die("run requires 'task' field");
302
- if (!loopId)
303
- die("run requires 'loop_id' field");
304
- const maxRounds = data.max_rounds ?? 20;
305
- const runtime = new LoopRuntime({
306
- task,
307
- loopId,
308
- maxRounds,
309
- interactive: true,
310
- goalId: data.goal_id ?? undefined,
311
- planSource: data.plan_source ?? undefined,
312
- constraintsFromPlan: data.constraints_from_plan ?? [],
313
- domain: data.domain ?? "",
314
- onRoundStart: (info) => {
315
- console.log(`\n=== Round ${info.round} | Level: ${info.level.toUpperCase()} | ` +
316
- `Technique: ${info.technique} ===\n`);
317
- console.log(info.prompt);
318
- console.log(`\n=== End Round ${info.round} Prompt ===\n` +
319
- `[Paste agent output, then press Ctrl+D (Unix) or Ctrl+Z (Windows) to continue]\n`);
320
- },
321
- execute: async (_prompt, _ctx) => {
322
- const output = await readStdin();
323
- if (!output.trim()) {
324
- throw new Error("No agent output provided.");
325
- }
326
- return output;
327
- },
328
- });
329
- const result = await runtime.start();
330
- console.log(`\n--- Loop stopped: ${result.stopReason} ---`);
331
- console.log(`Rounds: ${result.roundsCompleted} | ` +
332
- `Quality: [${result.qualityTrajectory.join(", ")}]`);
333
- if (result.stopReason === "stalled" && result.qualityTrajectory.length > 0) {
334
- const lastRound = result.roundsCompleted;
335
- console.log(`WARNING: Could not extract self-evaluation from agent output in round ${lastRound}. ` +
336
- "Ensure the agent outputs a ---loopforge-eval block.");
337
- }
338
- }
339
- function cmdStatus() {
340
- const backend = new FSBackend();
341
- const vault = backend.readVault();
342
- const entries = vault.entries ?? [];
343
- const loops = new Set();
344
- let lineageCount = 0;
345
- let feedbackCount = 0;
346
- for (const e of entries) {
347
- const taskId = String(e.task_id ?? "");
348
- if (taskId.endsWith(":feedback")) {
349
- feedbackCount++;
350
- }
351
- else if (taskId.startsWith("loop:")) {
352
- lineageCount++;
353
- }
354
- const lid = e.loop_id ?? e.loop_lineage?.loop_id;
355
- if (lid)
356
- loops.add(String(lid));
357
- }
358
- console.log("LoopForge Vault Status");
359
- console.log("=======================");
360
- console.log(`Total entries: ${entries.length}`);
361
- console.log(`Lineage entries: ${lineageCount}`);
362
- console.log(`Feedback entries: ${feedbackCount}`);
363
- console.log(`Active loops: ${loops.size}`);
364
- if (loops.size > 0) {
365
- console.log(`\nLoops: ${[...loops].sort().join(", ")}`);
366
- }
367
- }
368
- // ═══════════════════════════════════════════════════════════════════════════
369
- // Main
370
- // ═══════════════════════════════════════════════════════════════════════════
371
- async function main() {
372
- const args = process.argv.slice(2);
373
- const cmd = args[0];
374
- if (!cmd || cmd === "--help" || cmd === "-h") {
375
- showHelp(args[1]); // "loopforge --help compile" shows compile help
376
- process.exit(0);
377
- }
378
- if (cmd === "--version" || cmd === "-V") {
379
- console.log(`loopforge v${VERSION}`);
380
- process.exit(0);
381
- }
382
- const engine = createEngine("skills");
383
- switch (cmd) {
384
- case "init":
385
- if (args[1] === "--help" || args[1] === "-h")
386
- showHelp("init");
387
- else
388
- await cmdInit();
389
- break;
390
- case "compile":
391
- await cmdCompile(engine, args[1]);
392
- break;
393
- case "feedback":
394
- await cmdFeedback(engine, args[1]);
395
- break;
396
- case "run":
397
- await cmdRun(engine, args[1]);
398
- break;
399
- case "replay":
400
- cmdReplay(args[1]);
401
- break;
402
- case "diff":
403
- cmdDiff(args[1], args[2], args[3]);
404
- break;
405
- case "review":
406
- cmdReview(args[1], args[2]);
407
- break;
408
- case "status":
409
- if (args[1] === "--help" || args[1] === "-h")
410
- showHelp("status");
411
- else
412
- cmdStatus();
413
- break;
414
- default:
415
- die(`unknown command: ${cmd}\nUse --help for usage.`);
416
- }
417
- }
418
- main().catch((err) => {
419
- process.stderr.write(`loopforge: fatal: ${err.message ?? err}\n`);
420
- process.exit(1);
421
- });
422
- //# sourceMappingURL=cli.js.map
package/dist/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,104 +0,0 @@
1
- /** Tests for adapter: mode routing, input parsing, health line. */
2
- import { describe, it, beforeEach } from "node:test";
3
- import assert from "node:assert/strict";
4
- import { handle } from "../adapter.js";
5
- import { createEngine } from "../engine.js";
6
- import { resetPolicy } from "../policy.js";
7
- describe("Adapter — handle()", () => {
8
- beforeEach(() => resetPolicy());
9
- it("returns error for unknown mode", () => {
10
- const result = handle('{"task":"audit","mode":"unknown_mode"}');
11
- const parsed = JSON.parse(result);
12
- assert.equal(parsed.status, "error");
13
- assert.ok(parsed.result.error.includes("Unknown mode"));
14
- });
15
- it("returns error for empty task", () => {
16
- const result = handle('{"task":"","mode":"build"}');
17
- const parsed = JSON.parse(result);
18
- assert.equal(parsed.status, "error");
19
- assert.ok(parsed.result.error.includes("Task is required"));
20
- });
21
- it("handles build mode", () => {
22
- const result = handle('{"task":"Audit ERC20","mode":"build"}');
23
- const parsed = JSON.parse(result);
24
- assert.equal(parsed.status, "ok");
25
- assert.ok(parsed.result.prompt_or_overlay.includes("LoopForge Build"));
26
- assert.ok(parsed.health.startsWith("[PC:"));
27
- });
28
- it("handles loop_compile mode", () => {
29
- const result = handle(JSON.stringify({
30
- task: "Audit ERC20 token",
31
- mode: "loop_compile",
32
- loop_id: "audit-erc20",
33
- round: 1,
34
- goal_id: "audit-erc20",
35
- }));
36
- const parsed = JSON.parse(result);
37
- assert.equal(parsed.status, "ok");
38
- assert.ok(parsed.result.prompt_or_overlay.includes("L2 Compile"));
39
- assert.ok(parsed.health.includes("PC:"));
40
- });
41
- it("handles feedback mode", () => {
42
- const result = handle(JSON.stringify({
43
- task: "Audit ERC20",
44
- mode: "feedback",
45
- feedback: {
46
- success: true,
47
- constraint_violations: [],
48
- manual_fixes_needed: "",
49
- output: "All tests passed",
50
- },
51
- }));
52
- const parsed = JSON.parse(result);
53
- assert.equal(parsed.status, "ok");
54
- assert.ok(parsed.result.prompt_or_overlay.includes("Feedback Recorded"));
55
- assert.ok(parsed.result.prompt_or_overlay.includes("5/5"));
56
- });
57
- it("returns error for feedback without payload", () => {
58
- const result = handle('{"task":"Audit","mode":"feedback"}');
59
- const parsed = JSON.parse(result);
60
- assert.equal(parsed.status, "error");
61
- });
62
- it("handles dict input (not just JSON string)", () => {
63
- const result = handle({
64
- task: "Rename function",
65
- mode: "build",
66
- });
67
- const parsed = JSON.parse(result);
68
- assert.equal(parsed.status, "ok");
69
- });
70
- it("health line shows STALLED when circuit breaker tripped", () => {
71
- // Run enough feedback rounds to trigger circuit breaker
72
- const result = handle(JSON.stringify({
73
- task: "Test",
74
- mode: "feedback",
75
- feedback: { success: false, constraint_violations: ["error"], manual_fixes_needed: "", output: "failed" },
76
- }));
77
- const parsed = JSON.parse(result);
78
- assert.ok(parsed.health.startsWith("[PC:"));
79
- });
80
- it("accepts engine reuse across calls", () => {
81
- const engine = createEngine();
82
- const r1 = handle('{"task":"Test 1","mode":"build"}', engine);
83
- const p1 = JSON.parse(r1);
84
- assert.equal(p1.status, "ok");
85
- const r2 = handle('{"task":"Test 2","mode":"build"}', engine);
86
- const p2 = JSON.parse(r2);
87
- assert.equal(p2.status, "ok");
88
- // Engine state persists
89
- assert.equal(engine.state.call_count, 0); // build doesn't increment call_count
90
- });
91
- it("output size guard truncates at 32KB", () => {
92
- // Generate a large request that produces a large prompt
93
- const largeTask = "Audit " + "the contract ".repeat(50) + "for security";
94
- const result = handle(JSON.stringify({
95
- task: largeTask,
96
- mode: "build",
97
- }));
98
- const parsed = JSON.parse(result);
99
- const promptLen = parsed.result.prompt_or_overlay.length;
100
- // Should be under 32KB + some overhead
101
- assert.ok(promptLen <= 33_000);
102
- });
103
- });
104
- //# sourceMappingURL=adapter.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"adapter.test.js","sourceRoot":"","sources":["../../src/tests/adapter.test.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"}