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.
Files changed (193) hide show
  1. package/README.md +172 -95
  2. package/dist/backends/interface.d.ts +5 -10
  3. package/dist/backends/interface.d.ts.map +1 -1
  4. package/dist/backends/interface.js +3 -4
  5. package/dist/backends/interface.js.map +1 -1
  6. package/dist/canonical-state.d.ts +53 -0
  7. package/dist/canonical-state.d.ts.map +1 -0
  8. package/dist/canonical-state.js +161 -0
  9. package/dist/canonical-state.js.map +1 -0
  10. package/dist/cli.d.ts +4 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +227 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/enforcement-gate.d.ts.map +1 -1
  15. package/dist/enforcement-gate.js +28 -10
  16. package/dist/enforcement-gate.js.map +1 -1
  17. package/dist/engine.d.ts +9 -28
  18. package/dist/engine.d.ts.map +1 -1
  19. package/dist/engine.js +135 -361
  20. package/dist/engine.js.map +1 -1
  21. package/dist/evidence-provider.d.ts +146 -0
  22. package/dist/evidence-provider.d.ts.map +1 -0
  23. package/dist/evidence-provider.js +512 -0
  24. package/dist/evidence-provider.js.map +1 -0
  25. package/dist/index.d.ts +19 -13
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +15 -12
  28. package/dist/index.js.map +1 -1
  29. package/dist/init.d.ts +15 -0
  30. package/dist/init.d.ts.map +1 -0
  31. package/dist/init.js +49 -0
  32. package/dist/init.js.map +1 -0
  33. package/dist/interop.d.ts +35 -0
  34. package/dist/interop.d.ts.map +1 -0
  35. package/dist/interop.js +34 -0
  36. package/dist/interop.js.map +1 -0
  37. package/dist/loop-compiler.d.ts +14 -64
  38. package/dist/loop-compiler.d.ts.map +1 -1
  39. package/dist/loop-compiler.js +305 -2206
  40. package/dist/loop-compiler.js.map +1 -1
  41. package/dist/loop-extras-parser.d.ts +82 -0
  42. package/dist/loop-extras-parser.d.ts.map +1 -0
  43. package/dist/loop-extras-parser.js +217 -0
  44. package/dist/loop-extras-parser.js.map +1 -0
  45. package/dist/loop-store.d.ts +104 -0
  46. package/dist/loop-store.d.ts.map +1 -0
  47. package/dist/loop-store.js +421 -0
  48. package/dist/loop-store.js.map +1 -0
  49. package/dist/mcp/server.d.ts +9 -6
  50. package/dist/mcp/server.d.ts.map +1 -1
  51. package/dist/mcp/server.js +109 -73
  52. package/dist/mcp/server.js.map +1 -1
  53. package/dist/mcp/session.d.ts +102 -21
  54. package/dist/mcp/session.d.ts.map +1 -1
  55. package/dist/mcp/session.js +795 -400
  56. package/dist/mcp/session.js.map +1 -1
  57. package/dist/mcp/tools.d.ts +18 -268
  58. package/dist/mcp/tools.d.ts.map +1 -1
  59. package/dist/mcp/tools.js +226 -12
  60. package/dist/mcp/tools.js.map +1 -1
  61. package/dist/observability.d.ts +36 -16
  62. package/dist/observability.d.ts.map +1 -1
  63. package/dist/observability.js +82 -23
  64. package/dist/observability.js.map +1 -1
  65. package/dist/policy-metrics.d.ts +46 -0
  66. package/dist/policy-metrics.d.ts.map +1 -0
  67. package/dist/policy-metrics.js +146 -0
  68. package/dist/policy-metrics.js.map +1 -0
  69. package/dist/policy.d.ts +52 -147
  70. package/dist/policy.d.ts.map +1 -1
  71. package/dist/policy.js +118 -191
  72. package/dist/policy.js.map +1 -1
  73. package/dist/prompt-assembler.d.ts +30 -0
  74. package/dist/prompt-assembler.d.ts.map +1 -0
  75. package/dist/prompt-assembler.js +278 -0
  76. package/dist/prompt-assembler.js.map +1 -0
  77. package/dist/prompt-policy.d.ts +29 -0
  78. package/dist/prompt-policy.d.ts.map +1 -0
  79. package/dist/prompt-policy.js +51 -0
  80. package/dist/prompt-policy.js.map +1 -0
  81. package/dist/protocol.d.ts +75 -152
  82. package/dist/protocol.d.ts.map +1 -1
  83. package/dist/protocol.js +11 -53
  84. package/dist/protocol.js.map +1 -1
  85. package/dist/replay.d.ts.map +1 -1
  86. package/dist/replay.js +1 -27
  87. package/dist/replay.js.map +1 -1
  88. package/dist/round-coordinator.d.ts +90 -0
  89. package/dist/round-coordinator.d.ts.map +1 -0
  90. package/dist/round-coordinator.js +186 -0
  91. package/dist/round-coordinator.js.map +1 -0
  92. package/dist/round-driver.d.ts +53 -0
  93. package/dist/round-driver.d.ts.map +1 -0
  94. package/dist/round-driver.js +101 -0
  95. package/dist/round-driver.js.map +1 -0
  96. package/dist/round-transaction.d.ts +70 -0
  97. package/dist/round-transaction.d.ts.map +1 -0
  98. package/dist/round-transaction.js +290 -0
  99. package/dist/round-transaction.js.map +1 -0
  100. package/dist/self-eval.d.ts +26 -0
  101. package/dist/self-eval.d.ts.map +1 -0
  102. package/dist/self-eval.js +154 -0
  103. package/dist/self-eval.js.map +1 -0
  104. package/dist/storage.d.ts +39 -0
  105. package/dist/storage.d.ts.map +1 -0
  106. package/dist/storage.js +193 -0
  107. package/dist/storage.js.map +1 -0
  108. package/dist/verification-gate.d.ts +31 -7
  109. package/dist/verification-gate.d.ts.map +1 -1
  110. package/dist/verification-gate.js +250 -7
  111. package/dist/verification-gate.js.map +1 -1
  112. package/loop_policy.json +19 -53
  113. package/package.json +13 -10
  114. package/skills/perception/SKILL.md +80 -267
  115. package/dist/backends/fs.d.ts +0 -36
  116. package/dist/backends/fs.d.ts.map +0 -1
  117. package/dist/backends/fs.js +0 -362
  118. package/dist/backends/fs.js.map +0 -1
  119. package/dist/builder.d.ts +0 -19
  120. package/dist/builder.d.ts.map +0 -1
  121. package/dist/builder.js +0 -215
  122. package/dist/builder.js.map +0 -1
  123. package/dist/mcp-server.d.ts +0 -12
  124. package/dist/mcp-server.d.ts.map +0 -1
  125. package/dist/mcp-server.js +0 -14
  126. package/dist/mcp-server.js.map +0 -1
  127. package/dist/memory-bridge.d.ts +0 -47
  128. package/dist/memory-bridge.d.ts.map +0 -1
  129. package/dist/memory-bridge.js +0 -290
  130. package/dist/memory-bridge.js.map +0 -1
  131. package/dist/runtime.d.ts +0 -80
  132. package/dist/runtime.d.ts.map +0 -1
  133. package/dist/runtime.js +0 -699
  134. package/dist/runtime.js.map +0 -1
  135. package/dist/tests/_helpers.d.ts +0 -25
  136. package/dist/tests/_helpers.d.ts.map +0 -1
  137. package/dist/tests/_helpers.js +0 -47
  138. package/dist/tests/_helpers.js.map +0 -1
  139. package/dist/tests/builder.test.d.ts +0 -2
  140. package/dist/tests/builder.test.d.ts.map +0 -1
  141. package/dist/tests/builder.test.js +0 -112
  142. package/dist/tests/builder.test.js.map +0 -1
  143. package/dist/tests/enforcement-gate.test.d.ts +0 -2
  144. package/dist/tests/enforcement-gate.test.d.ts.map +0 -1
  145. package/dist/tests/enforcement-gate.test.js +0 -328
  146. package/dist/tests/enforcement-gate.test.js.map +0 -1
  147. package/dist/tests/engine.test.d.ts +0 -2
  148. package/dist/tests/engine.test.d.ts.map +0 -1
  149. package/dist/tests/engine.test.js +0 -375
  150. package/dist/tests/engine.test.js.map +0 -1
  151. package/dist/tests/generate-schema.test.d.ts +0 -8
  152. package/dist/tests/generate-schema.test.d.ts.map +0 -1
  153. package/dist/tests/generate-schema.test.js +0 -199
  154. package/dist/tests/generate-schema.test.js.map +0 -1
  155. package/dist/tests/loop-compiler.test.d.ts +0 -2
  156. package/dist/tests/loop-compiler.test.d.ts.map +0 -1
  157. package/dist/tests/loop-compiler.test.js +0 -1059
  158. package/dist/tests/loop-compiler.test.js.map +0 -1
  159. package/dist/tests/mcp.test.d.ts +0 -7
  160. package/dist/tests/mcp.test.d.ts.map +0 -1
  161. package/dist/tests/mcp.test.js +0 -505
  162. package/dist/tests/mcp.test.js.map +0 -1
  163. package/dist/tests/memory-bridge.test.d.ts +0 -8
  164. package/dist/tests/memory-bridge.test.d.ts.map +0 -1
  165. package/dist/tests/memory-bridge.test.js +0 -383
  166. package/dist/tests/memory-bridge.test.js.map +0 -1
  167. package/dist/tests/policy.test.d.ts +0 -2
  168. package/dist/tests/policy.test.d.ts.map +0 -1
  169. package/dist/tests/policy.test.js +0 -49
  170. package/dist/tests/policy.test.js.map +0 -1
  171. package/dist/tests/protocol.test.d.ts +0 -2
  172. package/dist/tests/protocol.test.d.ts.map +0 -1
  173. package/dist/tests/protocol.test.js +0 -73
  174. package/dist/tests/protocol.test.js.map +0 -1
  175. package/dist/tests/replay.test.d.ts +0 -2
  176. package/dist/tests/replay.test.d.ts.map +0 -1
  177. package/dist/tests/replay.test.js +0 -222
  178. package/dist/tests/replay.test.js.map +0 -1
  179. package/dist/tests/runtime.test.d.ts +0 -7
  180. package/dist/tests/runtime.test.d.ts.map +0 -1
  181. package/dist/tests/runtime.test.js +0 -337
  182. package/dist/tests/runtime.test.js.map +0 -1
  183. package/dist/tests/verification-gate.test.d.ts +0 -2
  184. package/dist/tests/verification-gate.test.d.ts.map +0 -1
  185. package/dist/tests/verification-gate.test.js +0 -407
  186. package/dist/tests/verification-gate.test.js.map +0 -1
  187. package/skills/prompt-techniques/SKILL.md +0 -52
  188. package/skills/prompt-techniques/references/chain-of-thought.md +0 -207
  189. package/skills/prompt-techniques/references/few-shot.md +0 -174
  190. package/skills/prompt-techniques/references/least-to-most.md +0 -182
  191. package/skills/prompt-techniques/references/step-back.md +0 -160
  192. package/skills/prompt-techniques/references/tree-of-thought.md +0 -191
  193. package/skills/prompt-techniques/references/zero-shot.md +0 -97
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env node
2
- /** LoopForge MCP server — entry point.
3
- *
4
- * Usage:
5
- * npx loopforge-mcp
6
- * node dist/mcp-server.js
7
- *
8
- * Registers with Claude Code via:
9
- * claude mcp add loopforge -- npx loopforge-mcp
10
- */
11
- import { McpServer } from "./mcp/server.js";
12
- const server = new McpServer();
13
- server.start();
14
- //# sourceMappingURL=mcp-server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;AAC/B,MAAM,CAAC,KAAK,EAAE,CAAC"}
@@ -1,47 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,290 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"memory-bridge.js","sourceRoot":"","sources":["../src/memory-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACL,UAAU,EACV,WAAW,EACX,YAAY,EACZ,SAAS,EACT,aAAa,EACb,cAAc,EACd,MAAM,GACP,MAAM,SAAS,CAAC;AAIjB,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E;;iFAEiF;AACjF,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,OAAO,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;AAC/C,CAAC;AAED;wEACwE;AACxE,MAAM,UAAU,WAAW;IACzB,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;qEACqE;AACrE,MAAM,UAAU,eAAe;IAC7B,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACzE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAClE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAClC,CAAC;AAED,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,qEAAqE;AACrE,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI;SACR,WAAW,EAAE;SACb,KAAK,CAAC,YAAY,CAAC;SACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;AAClC,CAAC;AAED;;;gFAGgF;AAChF,SAAS,eAAe,CAAC,GAA0B;IACjD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACjD,IAAI,GAAG,CAAC,MAAM;QAAE,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAEnE,IAAI,GAAG,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QACpB,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,kBAAkB,CAAC,eAAe,EAAE,CAAC;YAC3D,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC;gBAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,cAAc,EAAE,CAAC;YACxD,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC;gBAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;SAAM,IAAI,GAAG,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,CAAC;YAC5D,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC;gBAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC;YACvD,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC;gBAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,qFAAqF;AACrF,SAAS,gBAAgB,CAAC,EAAU;IAClC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACzD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1C,CAAC;AAED;sEACsE;AACtE,SAAS,iBAAiB,CACxB,SAAiB,EACjB,UAAoB,EACpB,QAAgB,EAChB,eAAuB;IAEvB,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,CACnC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,WAAW,CAC9C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE7D,MAAM,MAAM,GAAsC,EAAE,CAAC;IACrD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACpC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,KAAK,EAAE,CAAC;QACpC,CAAC;QACD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEnC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,MAAM;SACV,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;SAClB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;SAC5C,IAAI,CAAC,aAAa,CAAC,CAAC;AACzB,CAAC;AAED;yDACyD;AACzD,MAAM,UAAU,oBAAoB,CAClC,SAAiB;IAEjB,OAAO,KAAK,EAAE,GAA0B,EAAmB,EAAE;QAC3D,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,iBAAiB,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1D,CAAC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,aAAa,GAAG,EAAE,CAAC;AAEzB;yFACyF;AACzF,SAAS,WAAW,CAAC,OAAe;IAClC,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,OAAe;IAClC,IAAI,CAAC;QACH,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,SAAS,eAAe,CACtB,SAAiB,EACjB,IAAY,EACZ,WAAmB,EACnB,OAA6C,EAC7C,IAAY;IAEZ,MAAM,QAAQ,GAAG,GAAG,IAAI,KAAK,CAAC;IAC9B,MAAM,WAAW,GAAG;QAClB,KAAK;QACL,SAAS,IAAI,EAAE;QACf,gBAAgB,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;QAC3C,WAAW;QACX,WAAW,OAAO,EAAE;QACpB,KAAK;QACL,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IACtE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;8DAC8D;AAC9D,MAAM,UAAU,kBAAkB,CAChC,SAAiB,EACjB,SAAiB;IAEjB,OAAO,KAAK,EAAE,OAA4B,EAAiB,EAAE;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;QAEtD,yEAAyE;QACzE,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;YAC7C,IAAI,WAAW,CAAC,OAAO,CAAC;gBAAE,MAAM;YAChC,IAAI,OAAO,KAAK,CAAC;gBAAE,OAAO,CAAC,4CAA4C;YACvE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,MAAM,UAAU,GAAa,EAAE,CAAC;YAEhC,mBAAmB;YACnB,MAAM,WAAW,GAAG,aAAa,OAAO,CAAC,MAAM,UAAU,CAAC;YAC1D,MAAM,WAAW,GAAG;gBAClB,KAAK,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE;gBACjC,EAAE;gBACF,gBAAgB,OAAO,CAAC,YAAY,CAAC,UAAU,EAAE;gBACjD,aAAa,IAAI,EAAE;gBACnB,eAAe,OAAO,CAAC,eAAe,EAAE;gBACxC,yBAAyB,OAAO,CAAC,eAAe,EAAE;gBAClD,EAAE;gBACF,OAAO,CAAC,YAAY,CAAC,SAAS;oBAC5B,CAAC,CAAC,kBAAkB,OAAO,CAAC,YAAY,CAAC,SAAS,IAAI;oBACtD,CAAC,CAAC,EAAE;gBACN,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;oBAC5C,CAAC,CAAC;wBACE,sBAAsB;wBACtB,GAAG,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC3D,EAAE;qBACH,CAAC,IAAI,CAAC,IAAI,CAAC;oBACd,CAAC,CAAC,EAAE;aACP;iBACE,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,MAAM,WAAW,GAAG,eAAe,CACjC,SAAS,EACT,WAAW,EACX,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EACxC,SAAS,EACT,WAAW,CACZ,CAAC;YACF,UAAU,CAAC,IAAI,CACb,iBAAiB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,WAAW,OAAO,OAAO,CAAC,OAAO,KAAK,IAAI,GAAG,CAC7F,CAAC;YAEF,sBAAsB;YACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxD,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;gBACtC,MAAM,MAAM,GAAG,aAAa,OAAO,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzD,MAAM,MAAM,GAAG;oBACb,KAAK,EAAE,CAAC,IAAI,EAAE;oBACd,EAAE;oBACF,YAAY,EAAE,CAAC,GAAG,EAAE;oBACpB,EAAE;oBACF,qBAAqB,EAAE,CAAC,UAAU,EAAE;oBACpC,EAAE;iBACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEb,MAAM,MAAM,GAAG,eAAe,CAC5B,SAAS,EACT,MAAM,EACN,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EACrB,UAAU,EACV,MAAM,CACP,CAAC;gBACF,UAAU,CAAC,IAAI,CACb,0BAA0B,MAAM,OAAO,OAAO,CAAC,OAAO,KAAK,IAAI,GAAG,CACnE,CAAC;YACJ,CAAC;YAED,qBAAqB;YACrB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;gBAC3B,MAAM,OAAO,GAAG,aAAa,OAAO,CAAC,MAAM,MAAM,CAAC;gBAClD,MAAM,OAAO,GAAG;oBACd,KAAK,OAAO,CAAC,cAAc,CAAC,WAAW,EAAE;oBACzC,EAAE;oBACF,uBAAuB,OAAO,CAAC,cAAc,CAAC,aAAa,EAAE;oBAC7D,EAAE;iBACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEb,MAAM,OAAO,GAAG,eAAe,CAC7B,SAAS,EACT,OAAO,EACP,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAChD,WAAW,EACX,OAAO,CACR,CAAC;gBACF,UAAU,CAAC,IAAI,CACb,2BAA2B,OAAO,OAAO,OAAO,CAAC,OAAO,KAAK,IAAI,GAAG,CACrE,CAAC;YACJ,CAAC;YAED,+BAA+B;YAC/B,cAAc,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QACnE,CAAC;gBAAS,CAAC;YACT,WAAW,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E;;uDAEuD;AACvD,MAAM,UAAU,mBAAmB,CAAC,GAAmB;IACrD,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,IAAI,CAAC,QAAQ;QAAE,OAAO;IAEtB,GAAG,CAAC,cAAc,GAAG,oBAAoB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC9D,GAAG,CAAC,YAAY,GAAG,kBAAkB,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;AAChF,CAAC;AAED;;;iDAGiD;AACjD,MAAM,UAAU,gBAAgB;IAI9B,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IAEzB,OAAO;QACL,cAAc,EAAE,oBAAoB,CAAC,QAAQ,CAAC,SAAS,CAAC;QACxD,YAAY,EAAE,kBAAkB,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC;KACzE,CAAC;AACJ,CAAC"}
package/dist/runtime.d.ts DELETED
@@ -1,80 +0,0 @@
1
- /** LoopForge — Loop Runtime (v1.2).
2
- *
3
- * Event-driven loop driver that wraps the compilation engine with
4
- * heartbeat monitoring, timeout/stall detection, and graceful shutdown.
5
- *
6
- * Primary API:
7
- * import { run } from 'loopforge';
8
- * const result = await run({ task: '...', execute: myAgent });
9
- *
10
- * Advanced API:
11
- * const rt = new LoopRuntime(config);
12
- * rt.on('round:complete', (info) => console.log(info));
13
- * const result = await rt.start();
14
- */
15
- import { EventEmitter } from "node:events";
16
- import { RuntimeStatus, type RuntimeConfig, type RunResult } from "./protocol.js";
17
- export declare class LoopRuntime extends EventEmitter {
18
- private config;
19
- private engine;
20
- private _status;
21
- private currentRound;
22
- private successTrajectory;
23
- private heartbeatTimer;
24
- private sigintHandler;
25
- private sigtermHandler;
26
- private lastSelfEval;
27
- private pendingVerificationFlags;
28
- private consecutiveRejections;
29
- private pendingRejectionNotice;
30
- private injectionCount;
31
- private lastInjectionRound;
32
- private injectedContexts;
33
- private phase2Triggered;
34
- private phase3Triggered;
35
- private pendingExternalContext;
36
- private roundStartTime;
37
- private lastProgressTime;
38
- private activeCtx;
39
- private timedOut;
40
- constructor(rawConfig: RuntimeConfig);
41
- get status(): RuntimeStatus;
42
- getCurrentRound(): number;
43
- getSuccessTrajectory(): boolean[];
44
- /** Derive the current progress estimate from the last self evaluation.
45
- * Returns -1 if no progress data is available. */
46
- private getCurrentProgress;
47
- /** Determine which memory injection phase (0/1/2/3) should fire this round.
48
- * Returns 0 if no injection should occur. Phase tracking (phase2Triggered /
49
- * phase3Triggered) is updated by the caller based on the returned phase. */
50
- private getInjectionPhase;
51
- /** Build the accumulated context for constructing a targeted memory query.
52
- * Delegates to the shared buildAccumulatedMemoryContext() utility. */
53
- private buildAccumulatedContext;
54
- /** Deduplicate external context against previously injected contexts.
55
- * Returns empty string if the new context is too similar to any prior. */
56
- private dedupAndStoreContext;
57
- /** Start the loop. Returns when the loop terminates (task complete,
58
- * circuit breaker, max rounds, stalled, or manual stop). */
59
- start(): Promise<RunResult>;
60
- /** Stop the loop gracefully. Safe to call from any thread/timer. */
61
- stop(): void;
62
- private buildCompileRequest;
63
- private startHeartbeat;
64
- private heartbeatTick;
65
- private stopHeartbeat;
66
- private registerSignalHandlers;
67
- private unregisterSignalHandlers;
68
- }
69
- /** Run a fully autonomous loop. Only `task` and `execute` are required.
70
- * All other configuration has sensible defaults from `loop_policy.json`.
71
- *
72
- * @example
73
- * const result = await run({
74
- * task: 'Audit ERC20 token for security vulnerabilities',
75
- * execute: async (prompt) => await myAgent.call(prompt),
76
- * });
77
- * // result: { success, stopReason, roundsCompleted, successTrajectory }
78
- */
79
- export declare function run(rawConfig: RuntimeConfig): Promise<RunResult>;
80
- //# sourceMappingURL=runtime.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAU3C,OAAO,EAEL,aAAa,EAab,KAAK,aAAa,EAClB,KAAK,SAAS,EAKf,MAAM,eAAe,CAAC;AA2IvB,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,iBAAiB,CAAiB;IAC1C,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,cAAc,CAA6B;IAGnD,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,wBAAwB,CAA0B;IAG1D,OAAO,CAAC,qBAAqB,CAAK;IAClC,OAAO,CAAC,sBAAsB,CAAM;IAGpC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,sBAAsB,CAAM;IAGpC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,QAAQ,CAAS;gBAEb,SAAS,EAAE,aAAa;IAMpC,IAAI,MAAM,IAAI,aAAa,CAE1B;IAED,eAAe,IAAI,MAAM;IAIzB,oBAAoB,IAAI,OAAO,EAAE;IAMjC;uDACmD;IACnD,OAAO,CAAC,kBAAkB;IAM1B;;iFAE6E;IAC7E,OAAO,CAAC,iBAAiB;IA+BzB;2EACuE;IACvE,OAAO,CAAC,uBAAuB;IAO/B;+EAC2E;IAC3E,OAAO,CAAC,oBAAoB;IAmB5B;iEAC6D;IACvD,KAAK,IAAI,OAAO,CAAC,SAAS,CAAC;IA4XjC,oEAAoE;IACpE,IAAI,IAAI,IAAI;IAWZ,OAAO,CAAC,mBAAmB;IAqD3B,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,aAAa;IAiErB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,sBAAsB;IAW9B,OAAO,CAAC,wBAAwB;CAUjC;AAMD;;;;;;;;;GASG;AACH,wBAAsB,GAAG,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAGtE"}