loopforge 1.7.0 → 1.12.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 +64 -3
- package/dist/backends/fs.d.ts.map +1 -1
- package/dist/backends/fs.js +1 -2
- package/dist/backends/fs.js.map +1 -1
- package/dist/backends/interface.d.ts +2 -0
- package/dist/backends/interface.d.ts.map +1 -1
- package/dist/builder.d.ts +6 -10
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +128 -63
- package/dist/builder.js.map +1 -1
- package/dist/engine.d.ts +16 -2
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +142 -54
- package/dist/engine.js.map +1 -1
- package/dist/index.d.ts +7 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/loop-compiler.d.ts +33 -2
- package/dist/loop-compiler.d.ts.map +1 -1
- package/dist/loop-compiler.js +391 -135
- package/dist/loop-compiler.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +6 -4
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/session.d.ts +18 -4
- package/dist/mcp/session.d.ts.map +1 -1
- package/dist/mcp/session.js +225 -24
- package/dist/mcp/session.js.map +1 -1
- package/dist/mcp/tools.d.ts +32 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +33 -14
- package/dist/mcp/tools.js.map +1 -1
- package/dist/memory-bridge.d.ts +47 -0
- package/dist/memory-bridge.d.ts.map +1 -0
- package/dist/memory-bridge.js +290 -0
- package/dist/memory-bridge.js.map +1 -0
- package/dist/observability.d.ts +1 -1
- package/dist/observability.js +1 -1
- package/dist/policy.d.ts +66 -9
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +41 -28
- package/dist/policy.js.map +1 -1
- package/dist/protocol.d.ts +120 -16
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +23 -9
- package/dist/protocol.js.map +1 -1
- package/dist/replay.js +7 -7
- package/dist/replay.js.map +1 -1
- package/dist/runtime.d.ts +20 -3
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +420 -177
- package/dist/runtime.js.map +1 -1
- package/dist/tests/builder.test.js +40 -28
- package/dist/tests/builder.test.js.map +1 -1
- package/dist/tests/engine.test.js +13 -17
- package/dist/tests/engine.test.js.map +1 -1
- package/dist/tests/generate-schema.test.js +10 -7
- package/dist/tests/generate-schema.test.js.map +1 -1
- package/dist/tests/loop-compiler.test.js +481 -27
- package/dist/tests/loop-compiler.test.js.map +1 -1
- package/dist/tests/mcp.test.js +103 -103
- package/dist/tests/mcp.test.js.map +1 -1
- package/dist/tests/memory-bridge.test.d.ts +8 -0
- package/dist/tests/memory-bridge.test.d.ts.map +1 -0
- package/dist/tests/memory-bridge.test.js +383 -0
- package/dist/tests/memory-bridge.test.js.map +1 -0
- package/dist/tests/policy.test.js +5 -15
- package/dist/tests/policy.test.js.map +1 -1
- package/dist/tests/protocol.test.js +15 -3
- package/dist/tests/protocol.test.js.map +1 -1
- package/dist/tests/replay.test.js +9 -9
- package/dist/tests/replay.test.js.map +1 -1
- package/dist/tests/runtime.test.js +8 -8
- package/dist/tests/runtime.test.js.map +1 -1
- package/dist/tests/verification-gate.test.js +1 -1
- package/dist/tests/verification-gate.test.js.map +1 -1
- package/dist/verification-gate.d.ts +2 -2
- package/dist/verification-gate.js +2 -2
- package/loop_policy.json +28 -23
- package/package.json +1 -1
- package/skills/perception/SKILL.md +64 -12
- package/dist/adapter.d.ts +0 -17
- package/dist/adapter.d.ts.map +0 -1
- package/dist/adapter.js +0 -228
- package/dist/adapter.js.map +0 -1
- package/dist/tests/adapter.test.d.ts +0 -2
- package/dist/tests/adapter.test.d.ts.map +0 -1
package/dist/mcp/tools.js
CHANGED
|
@@ -150,6 +150,25 @@ export const TOOL_SCHEMAS = [
|
|
|
150
150
|
items: { type: "string" },
|
|
151
151
|
description: "Optional. Assumptions from earlier rounds that were incorrect.",
|
|
152
152
|
},
|
|
153
|
+
worker_results: {
|
|
154
|
+
type: "array",
|
|
155
|
+
description: "Optional. Results of sub-agent / Worker delegations this round.",
|
|
156
|
+
items: {
|
|
157
|
+
type: "object",
|
|
158
|
+
properties: {
|
|
159
|
+
agentId: { type: "string" },
|
|
160
|
+
subAgentType: { type: "string" },
|
|
161
|
+
subTask: { type: "string" },
|
|
162
|
+
resultSummary: { type: "string" },
|
|
163
|
+
success: { type: "boolean" },
|
|
164
|
+
discoveredConstraints: {
|
|
165
|
+
type: "array",
|
|
166
|
+
items: { type: "string" },
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
required: ["agentId", "subAgentType", "subTask", "resultSummary", "success"],
|
|
170
|
+
},
|
|
171
|
+
},
|
|
153
172
|
},
|
|
154
173
|
},
|
|
155
174
|
},
|
|
@@ -158,7 +177,7 @@ export const TOOL_SCHEMAS = [
|
|
|
158
177
|
},
|
|
159
178
|
{
|
|
160
179
|
name: "loopforge_status",
|
|
161
|
-
description: "Get the current status of a loop session: round number,
|
|
180
|
+
description: "Get the current status of a loop session: round number, success trajectory, technique in use.",
|
|
162
181
|
inputSchema: {
|
|
163
182
|
type: "object",
|
|
164
183
|
properties: {
|
|
@@ -237,7 +256,7 @@ export const TOOL_SCHEMAS = [
|
|
|
237
256
|
},
|
|
238
257
|
];
|
|
239
258
|
export const TOOL_HANDLERS = {
|
|
240
|
-
loopforge_start(mgr, input) {
|
|
259
|
+
async loopforge_start(mgr, input) {
|
|
241
260
|
const startInput = {
|
|
242
261
|
task: String(input.task ?? ""),
|
|
243
262
|
loopId: input.loopId,
|
|
@@ -251,10 +270,10 @@ export const TOOL_HANDLERS = {
|
|
|
251
270
|
if (!startInput.task.trim()) {
|
|
252
271
|
return { error: "task is required and must be non-empty" };
|
|
253
272
|
}
|
|
254
|
-
const result = mgr.create(startInput);
|
|
273
|
+
const result = await mgr.create(startInput);
|
|
255
274
|
return { ...result };
|
|
256
275
|
},
|
|
257
|
-
loopforge_next(mgr, input) {
|
|
276
|
+
async loopforge_next(mgr, input) {
|
|
258
277
|
const sessionId = String(input.sessionId ?? "");
|
|
259
278
|
const output = String(input.output ?? "");
|
|
260
279
|
const rawEval = input.evaluation;
|
|
@@ -266,14 +285,14 @@ export const TOOL_HANDLERS = {
|
|
|
266
285
|
if (!preExtractedEval && !output.trim()) {
|
|
267
286
|
return { error: "Either evaluation parameter or output with ---loopforge-eval block is required" };
|
|
268
287
|
}
|
|
269
|
-
const result = mgr.advance(sessionId, output, preExtractedEval);
|
|
288
|
+
const result = await mgr.advance(sessionId, output, preExtractedEval);
|
|
270
289
|
// Clean up finished sessions
|
|
271
290
|
if (result.prompt === null) {
|
|
272
291
|
mgr.delete(sessionId);
|
|
273
292
|
}
|
|
274
293
|
return { ...result };
|
|
275
294
|
},
|
|
276
|
-
loopforge_status(mgr, input) {
|
|
295
|
+
async loopforge_status(mgr, input) {
|
|
277
296
|
const sessionId = String(input.sessionId ?? "");
|
|
278
297
|
if (!sessionId)
|
|
279
298
|
return { error: "sessionId is required" };
|
|
@@ -287,7 +306,7 @@ export const TOOL_HANDLERS = {
|
|
|
287
306
|
round: session.currentRound,
|
|
288
307
|
maxRounds: session.maxRounds,
|
|
289
308
|
status: session.status,
|
|
290
|
-
|
|
309
|
+
successTrajectory: session.successTrajectory,
|
|
291
310
|
technique: session.engine.state?.last_technique ?? null,
|
|
292
311
|
metrics: {
|
|
293
312
|
vaultWriteErrors: metrics.vaultWriteErrors,
|
|
@@ -299,7 +318,7 @@ export const TOOL_HANDLERS = {
|
|
|
299
318
|
},
|
|
300
319
|
};
|
|
301
320
|
},
|
|
302
|
-
loopforge_stop(mgr, input) {
|
|
321
|
+
async loopforge_stop(mgr, input) {
|
|
303
322
|
const sessionId = String(input.sessionId ?? "");
|
|
304
323
|
if (!sessionId)
|
|
305
324
|
return { error: "sessionId is required" };
|
|
@@ -307,15 +326,15 @@ export const TOOL_HANDLERS = {
|
|
|
307
326
|
if (!session)
|
|
308
327
|
return { error: `session not found: ${sessionId}` };
|
|
309
328
|
const roundsCompleted = session.currentRound;
|
|
310
|
-
const
|
|
329
|
+
const successTrajectory = [...session.successTrajectory];
|
|
311
330
|
mgr.delete(sessionId);
|
|
312
|
-
return { success: true, roundsCompleted,
|
|
331
|
+
return { success: true, roundsCompleted, successTrajectory };
|
|
313
332
|
},
|
|
314
|
-
loopforge_list(mgr, _input) {
|
|
333
|
+
async loopforge_list(mgr, _input) {
|
|
315
334
|
const sessions = mgr.list();
|
|
316
335
|
return { sessions };
|
|
317
336
|
},
|
|
318
|
-
loopforge_replay(mgr, input) {
|
|
337
|
+
async loopforge_replay(mgr, input) {
|
|
319
338
|
const sessionId = String(input.sessionId ?? "");
|
|
320
339
|
if (!sessionId)
|
|
321
340
|
return { error: "sessionId is required" };
|
|
@@ -325,7 +344,7 @@ export const TOOL_HANDLERS = {
|
|
|
325
344
|
const timeline = mgr.replayTimeline(sessionId) ?? [];
|
|
326
345
|
return { sessionId, loopId: session.loopId, timeline };
|
|
327
346
|
},
|
|
328
|
-
loopforge_resume(mgr, input) {
|
|
347
|
+
async loopforge_resume(mgr, input) {
|
|
329
348
|
const loopId = String(input.loopId ?? "");
|
|
330
349
|
if (!loopId)
|
|
331
350
|
return { error: "loopId is required" };
|
|
@@ -334,7 +353,7 @@ export const TOOL_HANDLERS = {
|
|
|
334
353
|
return { error: `no saved session found for loop "${loopId}"` };
|
|
335
354
|
return { ...result };
|
|
336
355
|
},
|
|
337
|
-
loopforge_health(mgr, input) {
|
|
356
|
+
async loopforge_health(mgr, input) {
|
|
338
357
|
const loopId = String(input.loopId ?? "");
|
|
339
358
|
if (!loopId)
|
|
340
359
|
return { error: "loopId is required" };
|
package/dist/mcp/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/** LoopForge — Memory Bridge (v1.8).
|
|
2
|
+
*
|
|
3
|
+
* Zero-config auto-detection bridge between LoopForge and claude-mem.
|
|
4
|
+
* Detects claude-mem via the local filesystem, provides memoryProvider
|
|
5
|
+
* (file-based retrieval) and memoryWriter (Markdown file writeback).
|
|
6
|
+
*
|
|
7
|
+
* Two integration paths:
|
|
8
|
+
* MCP: autoConfigureMemory(sessionMgr) — sets provider/writer on SessionManager
|
|
9
|
+
* Lib: tryAutoConfigure() → { memoryProvider?, memoryWriter? } — for resolveConfig()
|
|
10
|
+
*
|
|
11
|
+
* If claude-mem is not installed or the project has no memory directory,
|
|
12
|
+
* both functions return without side effects — silent graceful degradation.
|
|
13
|
+
*/
|
|
14
|
+
import type { MemoryProviderContext, LoopMemoryWriteback } from "./protocol.js";
|
|
15
|
+
import type { SessionManager } from "./mcp/session.js";
|
|
16
|
+
/** Compute the project directory name the same way claude-mem does:
|
|
17
|
+
* replace every non-alphanumeric character with `-`.
|
|
18
|
+
* e.g. `C:\Users\Dell\Desktop\LoopForge` → `C--Users-Dell-Desktop-LoopForge` */
|
|
19
|
+
export declare function computeProjectHash(gitRoot: string): string;
|
|
20
|
+
/** Walk upward from cwd looking for a `.git` directory.
|
|
21
|
+
* Returns the git root path, or null if not found within 20 levels. */
|
|
22
|
+
export declare function findGitRoot(): string | null;
|
|
23
|
+
/** Check whether claude-mem has a memory directory for the current project.
|
|
24
|
+
* Returns the memory directory path and MEMORY.md path, or null. */
|
|
25
|
+
export declare function detectClaudeMem(): {
|
|
26
|
+
memoryDir: string;
|
|
27
|
+
indexPath: string;
|
|
28
|
+
} | null;
|
|
29
|
+
/** Create a memoryProvider callback bound to a specific memory directory.
|
|
30
|
+
* Reads .md files directly — no REST API dependency. */
|
|
31
|
+
export declare function createMemoryProvider(memoryDir: string): (ctx: MemoryProviderContext) => Promise<string>;
|
|
32
|
+
/** Create a memoryWriter callback bound to a specific memory directory.
|
|
33
|
+
* Writes .md files directly + appends to MEMORY.md index. */
|
|
34
|
+
export declare function createMemoryWriter(memoryDir: string, indexPath: string): (payload: LoopMemoryWriteback) => Promise<void>;
|
|
35
|
+
/** Auto-detect claude-mem and wire memoryProvider / memoryWriter onto a
|
|
36
|
+
* SessionManager instance. Called once at MCP server startup.
|
|
37
|
+
* If claude-mem is not available, this is a no-op. */
|
|
38
|
+
export declare function autoConfigureMemory(mgr: SessionManager): void;
|
|
39
|
+
/** Auto-detect claude-mem and return provider/writer callbacks.
|
|
40
|
+
* Used by the runtime library path (resolveConfig). Callers should
|
|
41
|
+
* only invoke this when the user has NOT provided explicit callbacks —
|
|
42
|
+
* explicit callbacks always take precedence. */
|
|
43
|
+
export declare function tryAutoConfigure(): {
|
|
44
|
+
memoryProvider?: (ctx: MemoryProviderContext) => Promise<string>;
|
|
45
|
+
memoryWriter?: (payload: LoopMemoryWriteback) => Promise<void>;
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=memory-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-bridge.d.ts","sourceRoot":"","sources":["../src/memory-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAaH,OAAO,KAAK,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAMvD;;iFAEiF;AACjF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;wEACwE;AACxE,wBAAgB,WAAW,IAAI,MAAM,GAAG,IAAI,CAS3C;AAED;qEACqE;AACrE,wBAAgB,eAAe,IAAI;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQjF;AA8FD;yDACyD;AACzD,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,GAChB,CAAC,GAAG,EAAE,qBAAqB,KAAK,OAAO,CAAC,MAAM,CAAC,CAKjD;AAiDD;8DAC8D;AAC9D,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAuGjD;AAMD;;uDAEuD;AACvD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAM7D;AAED;;;iDAGiD;AACjD,wBAAgB,gBAAgB,IAAI;IAClC,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,qBAAqB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACjE,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChE,CAQA"}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/** LoopForge — Memory Bridge (v1.8).
|
|
2
|
+
*
|
|
3
|
+
* Zero-config auto-detection bridge between LoopForge and claude-mem.
|
|
4
|
+
* Detects claude-mem via the local filesystem, provides memoryProvider
|
|
5
|
+
* (file-based retrieval) and memoryWriter (Markdown file writeback).
|
|
6
|
+
*
|
|
7
|
+
* Two integration paths:
|
|
8
|
+
* MCP: autoConfigureMemory(sessionMgr) — sets provider/writer on SessionManager
|
|
9
|
+
* Lib: tryAutoConfigure() → { memoryProvider?, memoryWriter? } — for resolveConfig()
|
|
10
|
+
*
|
|
11
|
+
* If claude-mem is not installed or the project has no memory directory,
|
|
12
|
+
* both functions return without side effects — silent graceful degradation.
|
|
13
|
+
*/
|
|
14
|
+
import { homedir } from "node:os";
|
|
15
|
+
import { join, dirname } from "node:path";
|
|
16
|
+
import { existsSync, readdirSync, readFileSync, mkdirSync, writeFileSync, appendFileSync, rmSync, } from "node:fs";
|
|
17
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
18
|
+
// Detection
|
|
19
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
20
|
+
/** Compute the project directory name the same way claude-mem does:
|
|
21
|
+
* replace every non-alphanumeric character with `-`.
|
|
22
|
+
* e.g. `C:\Users\Dell\Desktop\LoopForge` → `C--Users-Dell-Desktop-LoopForge` */
|
|
23
|
+
export function computeProjectHash(gitRoot) {
|
|
24
|
+
return gitRoot.replace(/[^a-zA-Z0-9]/g, "-");
|
|
25
|
+
}
|
|
26
|
+
/** Walk upward from cwd looking for a `.git` directory.
|
|
27
|
+
* Returns the git root path, or null if not found within 20 levels. */
|
|
28
|
+
export function findGitRoot() {
|
|
29
|
+
let dir = process.cwd();
|
|
30
|
+
for (let i = 0; i < 20; i++) {
|
|
31
|
+
if (existsSync(join(dir, ".git")))
|
|
32
|
+
return dir;
|
|
33
|
+
const parent = dirname(dir);
|
|
34
|
+
if (parent === dir)
|
|
35
|
+
break;
|
|
36
|
+
dir = parent;
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
/** Check whether claude-mem has a memory directory for the current project.
|
|
41
|
+
* Returns the memory directory path and MEMORY.md path, or null. */
|
|
42
|
+
export function detectClaudeMem() {
|
|
43
|
+
const gitRoot = findGitRoot();
|
|
44
|
+
if (!gitRoot)
|
|
45
|
+
return null;
|
|
46
|
+
const hash = computeProjectHash(gitRoot);
|
|
47
|
+
const memoryDir = join(homedir(), ".claude", "projects", hash, "memory");
|
|
48
|
+
const indexPath = join(memoryDir, "MEMORY.md");
|
|
49
|
+
if (!existsSync(memoryDir) || !existsSync(indexPath))
|
|
50
|
+
return null;
|
|
51
|
+
return { memoryDir, indexPath };
|
|
52
|
+
}
|
|
53
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
54
|
+
// Retrieval
|
|
55
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
56
|
+
/** Split text into lowercase words ≥4 chars for keyword matching. */
|
|
57
|
+
function keywords(text) {
|
|
58
|
+
return text
|
|
59
|
+
.toLowerCase()
|
|
60
|
+
.split(/[^a-z0-9]+/)
|
|
61
|
+
.filter((w) => w.length >= 4);
|
|
62
|
+
}
|
|
63
|
+
/** Build a phase-aware set of query terms from the provider context.
|
|
64
|
+
* Phase 1: task terms only (initial anchoring).
|
|
65
|
+
* Phase 2: task + recurring issues + failed patterns (mid-loop breakout).
|
|
66
|
+
* Phase 3: task + remaining criteria + key lessons (late-stage edge cases). */
|
|
67
|
+
function buildQueryTerms(ctx) {
|
|
68
|
+
const terms = new Set();
|
|
69
|
+
for (const w of keywords(ctx.task))
|
|
70
|
+
terms.add(w);
|
|
71
|
+
if (ctx.domain)
|
|
72
|
+
for (const w of keywords(ctx.domain))
|
|
73
|
+
terms.add(w);
|
|
74
|
+
if (ctx.phase === 2) {
|
|
75
|
+
for (const issue of ctx.accumulatedContext.recurringIssues) {
|
|
76
|
+
for (const w of keywords(issue))
|
|
77
|
+
terms.add(w);
|
|
78
|
+
}
|
|
79
|
+
for (const pat of ctx.accumulatedContext.failedPatterns) {
|
|
80
|
+
for (const w of keywords(pat))
|
|
81
|
+
terms.add(w);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else if (ctx.phase === 3) {
|
|
85
|
+
for (const crit of ctx.accumulatedContext.remainingCriteria) {
|
|
86
|
+
for (const w of keywords(crit))
|
|
87
|
+
terms.add(w);
|
|
88
|
+
}
|
|
89
|
+
for (const lesson of ctx.accumulatedContext.keyLessons) {
|
|
90
|
+
for (const w of keywords(lesson))
|
|
91
|
+
terms.add(w);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return [...terms];
|
|
95
|
+
}
|
|
96
|
+
/** Strip YAML frontmatter (--- ... ---) from a markdown file and return the body. */
|
|
97
|
+
function stripFrontmatter(md) {
|
|
98
|
+
const match = md.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n/);
|
|
99
|
+
if (!match)
|
|
100
|
+
return md;
|
|
101
|
+
return md.slice(match[0].length).trim();
|
|
102
|
+
}
|
|
103
|
+
/** Scan all .md memory files (excluding MEMORY.md) and return the top-N
|
|
104
|
+
* most relevant memories concatenated, scored by keyword overlap. */
|
|
105
|
+
function retrieveFromFiles(memoryDir, queryTerms, maxFiles, maxCharsPerFile) {
|
|
106
|
+
let files;
|
|
107
|
+
try {
|
|
108
|
+
files = readdirSync(memoryDir).filter((f) => f.endsWith(".md") && f !== "MEMORY.md");
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return "";
|
|
112
|
+
}
|
|
113
|
+
if (files.length === 0 || queryTerms.length === 0)
|
|
114
|
+
return "";
|
|
115
|
+
const scored = [];
|
|
116
|
+
for (const file of files) {
|
|
117
|
+
let content;
|
|
118
|
+
try {
|
|
119
|
+
content = readFileSync(join(memoryDir, file), "utf-8");
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
const lower = content.toLowerCase();
|
|
125
|
+
let score = 0;
|
|
126
|
+
for (const term of queryTerms) {
|
|
127
|
+
if (lower.includes(term))
|
|
128
|
+
score++;
|
|
129
|
+
}
|
|
130
|
+
if (score > 0) {
|
|
131
|
+
scored.push({ body: stripFrontmatter(content), score });
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (scored.length === 0)
|
|
135
|
+
return "";
|
|
136
|
+
scored.sort((a, b) => b.score - a.score);
|
|
137
|
+
return scored
|
|
138
|
+
.slice(0, maxFiles)
|
|
139
|
+
.map((s) => s.body.slice(0, maxCharsPerFile))
|
|
140
|
+
.join("\n\n---\n\n");
|
|
141
|
+
}
|
|
142
|
+
/** Create a memoryProvider callback bound to a specific memory directory.
|
|
143
|
+
* Reads .md files directly — no REST API dependency. */
|
|
144
|
+
export function createMemoryProvider(memoryDir) {
|
|
145
|
+
return async (ctx) => {
|
|
146
|
+
const queryTerms = buildQueryTerms(ctx);
|
|
147
|
+
return retrieveFromFiles(memoryDir, queryTerms, 3, 600);
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
151
|
+
// Writeback
|
|
152
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
153
|
+
const LOCK_RETRY_MS = 50;
|
|
154
|
+
/** Minimal mkdir-based mutex for safguarding MEMORY.md writes.
|
|
155
|
+
* Non-blocking: returns true if lock was acquired, false if held by another process. */
|
|
156
|
+
function acquireLock(lockDir) {
|
|
157
|
+
try {
|
|
158
|
+
mkdirSync(lockDir);
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function releaseLock(lockDir) {
|
|
166
|
+
try {
|
|
167
|
+
rmSync(lockDir, { recursive: true });
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
// lock dir already removed — ignore
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/** Write a single .md memory file with claude-mem-compatible YAML frontmatter. */
|
|
174
|
+
function writeMemoryFile(memoryDir, name, description, memType, body) {
|
|
175
|
+
const filename = `${name}.md`;
|
|
176
|
+
const frontmatter = [
|
|
177
|
+
"---",
|
|
178
|
+
`name: ${name}`,
|
|
179
|
+
`description: ${description.slice(0, 100)}`,
|
|
180
|
+
"metadata:",
|
|
181
|
+
` type: ${memType}`,
|
|
182
|
+
"---",
|
|
183
|
+
"",
|
|
184
|
+
].join("\n");
|
|
185
|
+
writeFileSync(join(memoryDir, filename), frontmatter + body, "utf-8");
|
|
186
|
+
return filename;
|
|
187
|
+
}
|
|
188
|
+
/** Create a memoryWriter callback bound to a specific memory directory.
|
|
189
|
+
* Writes .md files directly + appends to MEMORY.md index. */
|
|
190
|
+
export function createMemoryWriter(memoryDir, indexPath) {
|
|
191
|
+
return async (payload) => {
|
|
192
|
+
const lockDir = join(memoryDir, ".loopforge-wb.lock");
|
|
193
|
+
// Non-blocking lock acquire — skip if claude-mem is writing concurrently
|
|
194
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
195
|
+
if (acquireLock(lockDir))
|
|
196
|
+
break;
|
|
197
|
+
if (attempt === 2)
|
|
198
|
+
return; // could not acquire after 3 attempts — skip
|
|
199
|
+
await new Promise((r) => setTimeout(r, LOCK_RETRY_MS));
|
|
200
|
+
}
|
|
201
|
+
try {
|
|
202
|
+
const date = new Date().toISOString().split("T")[0];
|
|
203
|
+
const indexLines = [];
|
|
204
|
+
// 1. Project entry
|
|
205
|
+
const projectName = `loopforge-${payload.loopId}-outcome`;
|
|
206
|
+
const projectBody = [
|
|
207
|
+
`# ${payload.projectEntry.title}`,
|
|
208
|
+
"",
|
|
209
|
+
`**Outcome**: ${payload.projectEntry.keyOutcome}`,
|
|
210
|
+
`**Date**: ${date}`,
|
|
211
|
+
`**Rounds**: ${payload.roundsCompleted}`,
|
|
212
|
+
`**Rounds Completed**: ${payload.roundsCompleted}`,
|
|
213
|
+
"",
|
|
214
|
+
payload.projectEntry.objective
|
|
215
|
+
? `**Objective**: ${payload.projectEntry.objective}\n`
|
|
216
|
+
: "",
|
|
217
|
+
payload.projectEntry.keyDiscoveries.length > 0
|
|
218
|
+
? [
|
|
219
|
+
"**Key Discoveries**:",
|
|
220
|
+
...payload.projectEntry.keyDiscoveries.map((d) => `- ${d}`),
|
|
221
|
+
"",
|
|
222
|
+
].join("\n")
|
|
223
|
+
: "",
|
|
224
|
+
]
|
|
225
|
+
.filter(Boolean)
|
|
226
|
+
.join("\n");
|
|
227
|
+
const projectFile = writeMemoryFile(memoryDir, projectName, payload.projectEntry.title.slice(0, 100), "project", projectBody);
|
|
228
|
+
indexLines.push(`- [LoopForge: ${payload.task.slice(0, 60)}](${projectFile}) — ${payload.outcome} (${date})`);
|
|
229
|
+
// 2. Feedback entries
|
|
230
|
+
for (let i = 0; i < payload.feedbackEntries.length; i++) {
|
|
231
|
+
const fb = payload.feedbackEntries[i];
|
|
232
|
+
const fbName = `loopforge-${payload.loopId}-fb-${i + 1}`;
|
|
233
|
+
const fbBody = [
|
|
234
|
+
`# ${fb.rule}`,
|
|
235
|
+
"",
|
|
236
|
+
`**Why:** ${fb.why}`,
|
|
237
|
+
"",
|
|
238
|
+
`**How to apply:** ${fb.howToApply}`,
|
|
239
|
+
"",
|
|
240
|
+
].join("\n");
|
|
241
|
+
const fbFile = writeMemoryFile(memoryDir, fbName, fb.rule.slice(0, 100), "feedback", fbBody);
|
|
242
|
+
indexLines.push(`- [LoopForge Feedback](${fbFile}) — ${payload.outcome} (${date})`);
|
|
243
|
+
}
|
|
244
|
+
// 3. Reference entry
|
|
245
|
+
if (payload.referenceEntry) {
|
|
246
|
+
const refName = `loopforge-${payload.loopId}-ref`;
|
|
247
|
+
const refBody = [
|
|
248
|
+
`# ${payload.referenceEntry.description}`,
|
|
249
|
+
"",
|
|
250
|
+
`**Vault Location**: ${payload.referenceEntry.vaultLocation}`,
|
|
251
|
+
"",
|
|
252
|
+
].join("\n");
|
|
253
|
+
const refFile = writeMemoryFile(memoryDir, refName, payload.referenceEntry.description.slice(0, 100), "reference", refBody);
|
|
254
|
+
indexLines.push(`- [LoopForge Reference](${refFile}) — ${payload.outcome} (${date})`);
|
|
255
|
+
}
|
|
256
|
+
// 4. Append to MEMORY.md index
|
|
257
|
+
appendFileSync(indexPath, indexLines.join("\n") + "\n", "utf-8");
|
|
258
|
+
}
|
|
259
|
+
finally {
|
|
260
|
+
releaseLock(lockDir);
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
265
|
+
// Integration entry points
|
|
266
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
267
|
+
/** Auto-detect claude-mem and wire memoryProvider / memoryWriter onto a
|
|
268
|
+
* SessionManager instance. Called once at MCP server startup.
|
|
269
|
+
* If claude-mem is not available, this is a no-op. */
|
|
270
|
+
export function autoConfigureMemory(mgr) {
|
|
271
|
+
const detected = detectClaudeMem();
|
|
272
|
+
if (!detected)
|
|
273
|
+
return;
|
|
274
|
+
mgr.memoryProvider = createMemoryProvider(detected.memoryDir);
|
|
275
|
+
mgr.memoryWriter = createMemoryWriter(detected.memoryDir, detected.indexPath);
|
|
276
|
+
}
|
|
277
|
+
/** Auto-detect claude-mem and return provider/writer callbacks.
|
|
278
|
+
* Used by the runtime library path (resolveConfig). Callers should
|
|
279
|
+
* only invoke this when the user has NOT provided explicit callbacks —
|
|
280
|
+
* explicit callbacks always take precedence. */
|
|
281
|
+
export function tryAutoConfigure() {
|
|
282
|
+
const detected = detectClaudeMem();
|
|
283
|
+
if (!detected)
|
|
284
|
+
return {};
|
|
285
|
+
return {
|
|
286
|
+
memoryProvider: createMemoryProvider(detected.memoryDir),
|
|
287
|
+
memoryWriter: createMemoryWriter(detected.memoryDir, detected.indexPath),
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=memory-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-bridge.js","sourceRoot":"","sources":["../src/memory-bridge.ts"],"names":[],"mappings":"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"}
|
package/dist/observability.d.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* round_complete — engine/runtime after feedback processed
|
|
8
8
|
* circuit_breaker — shouldBreak() returns true
|
|
9
9
|
* gate_contradicted — verification gate returns contradicted verdict
|
|
10
|
-
*
|
|
10
|
+
* tier2_escalation — builder escalates to Tier 2 techniques
|
|
11
11
|
* vault_write_error — any catch in vault write paths
|
|
12
12
|
* session_start / session_end — MCP session lifecycle
|
|
13
13
|
*
|
package/dist/observability.js
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* round_complete — engine/runtime after feedback processed
|
|
8
8
|
* circuit_breaker — shouldBreak() returns true
|
|
9
9
|
* gate_contradicted — verification gate returns contradicted verdict
|
|
10
|
-
*
|
|
10
|
+
* tier2_escalation — builder escalates to Tier 2 techniques
|
|
11
11
|
* vault_write_error — any catch in vault write paths
|
|
12
12
|
* session_start / session_end — MCP session lifecycle
|
|
13
13
|
*
|
package/dist/policy.d.ts
CHANGED
|
@@ -10,15 +10,9 @@ export interface SummaryPolicy {
|
|
|
10
10
|
window: number;
|
|
11
11
|
health_check_interval: number;
|
|
12
12
|
}
|
|
13
|
-
export interface RecompileTriggersPolicy {
|
|
14
|
-
l1: string[];
|
|
15
|
-
l2: string[];
|
|
16
|
-
}
|
|
17
13
|
export interface TechniquePolicy {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
adaptive_consecutive_rounds: number;
|
|
21
|
-
routing_table: Record<string, string>;
|
|
14
|
+
/** Number of consecutive failures before escalating to Tier 2 techniques. */
|
|
15
|
+
tier2_escalation_failures: number;
|
|
22
16
|
}
|
|
23
17
|
export interface EnginePolicy {
|
|
24
18
|
feedback_flush_interval: number;
|
|
@@ -49,16 +43,79 @@ export interface EvolutionPolicy {
|
|
|
49
43
|
/** P4: Max allowed difference between objective and subjective progress. */
|
|
50
44
|
progress_mismatch_threshold: number;
|
|
51
45
|
}
|
|
46
|
+
/** A tier in the round-based injection strategy.
|
|
47
|
+
* Each tier defines how many and which injection phases are allowed
|
|
48
|
+
* based on the loop's maxRounds. */
|
|
49
|
+
export interface MemoryInjectionTier {
|
|
50
|
+
/** Upper bound of maxRounds for this tier (inclusive). */
|
|
51
|
+
max_rounds: number;
|
|
52
|
+
/** Which phases are allowed in this tier: [1], [1,3], or [1,2,3]. */
|
|
53
|
+
allowed_phases: number[];
|
|
54
|
+
}
|
|
55
|
+
export interface MemoryInjectionPolicy {
|
|
56
|
+
/** Master toggle for memory injection. */
|
|
57
|
+
enabled: boolean;
|
|
58
|
+
/** Minimum rounds between two consecutive injections. */
|
|
59
|
+
min_rounds_between_injections: number;
|
|
60
|
+
/** Phase trigger configuration. */
|
|
61
|
+
phase_thresholds: {
|
|
62
|
+
phase1: {
|
|
63
|
+
trigger: "round_1";
|
|
64
|
+
};
|
|
65
|
+
phase2: {
|
|
66
|
+
trigger: "progress";
|
|
67
|
+
threshold: number;
|
|
68
|
+
};
|
|
69
|
+
phase3: {
|
|
70
|
+
trigger: "progress";
|
|
71
|
+
threshold: number;
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
/** Round-based tiered injection strategy. Each tier defines which phases
|
|
75
|
+
* are allowed based on maxRounds. The first matching tier wins.
|
|
76
|
+
* Tiers should be ordered by max_rounds ascending. */
|
|
77
|
+
round_tiers: MemoryInjectionTier[];
|
|
78
|
+
/** Jaccard similarity threshold above which a new context is considered
|
|
79
|
+
* duplicate and skipped. */
|
|
80
|
+
dedup_threshold: number;
|
|
81
|
+
/** Maximum characters of memory context to inject (truncated if longer). */
|
|
82
|
+
max_context_length: number;
|
|
83
|
+
/** Section header for the injected context block in the L2 prompt. */
|
|
84
|
+
section_title: string;
|
|
85
|
+
}
|
|
86
|
+
/** Resolve which injection phases are allowed for a given maxRounds.
|
|
87
|
+
* Uses the tiered strategy: finds the first tier where maxRounds ≤ tier.max_rounds,
|
|
88
|
+
* and returns its allowed_phases. If maxRounds exceeds all tiers, returns the
|
|
89
|
+
* last tier's phases. */
|
|
90
|
+
export declare function resolveAllowedPhases(maxRounds: number, tiers: MemoryInjectionTier[]): number[];
|
|
91
|
+
export interface MemoryWritebackPolicy {
|
|
92
|
+
/** Master toggle for memory writeback on loop end. */
|
|
93
|
+
enabled: boolean;
|
|
94
|
+
/** Maximum number of feedback entries to write back. */
|
|
95
|
+
max_feedback_entries: number;
|
|
96
|
+
/** Maximum number of discoveries in the project entry. */
|
|
97
|
+
max_discoveries_in_project: number;
|
|
98
|
+
/** Only write back for these stop reasons. */
|
|
99
|
+
write_on_outcomes: string[];
|
|
100
|
+
}
|
|
101
|
+
export interface CheckpointPolicy {
|
|
102
|
+
/** Maximum number of constraints carried forward in a checkpoint. */
|
|
103
|
+
max_carried_constraints: number;
|
|
104
|
+
/** Maximum character length of the outcome field in a checkpoint. */
|
|
105
|
+
outcome_max_chars: number;
|
|
106
|
+
}
|
|
52
107
|
export interface LoopPolicy {
|
|
53
108
|
version: string;
|
|
54
109
|
constraints: ConstraintsPolicy;
|
|
55
110
|
summary: SummaryPolicy;
|
|
56
|
-
recompile_triggers: RecompileTriggersPolicy;
|
|
57
111
|
technique: TechniquePolicy;
|
|
58
112
|
engine: EnginePolicy;
|
|
59
113
|
runtime: RuntimePolicy;
|
|
60
114
|
backend: BackendPolicy;
|
|
61
115
|
evolution: EvolutionPolicy;
|
|
116
|
+
memory_injection: MemoryInjectionPolicy;
|
|
117
|
+
memory_writeback: MemoryWritebackPolicy;
|
|
118
|
+
checkpoint: CheckpointPolicy;
|
|
62
119
|
}
|
|
63
120
|
export declare const DEFAULT_POLICY: LoopPolicy;
|
|
64
121
|
export declare function loadPolicy(path?: string): LoopPolicy;
|