loopforge 1.3.1 → 1.8.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 (91) hide show
  1. package/README.md +64 -3
  2. package/dist/backends/fs.d.ts +5 -0
  3. package/dist/backends/fs.d.ts.map +1 -1
  4. package/dist/backends/fs.js +66 -16
  5. package/dist/backends/fs.js.map +1 -1
  6. package/dist/builder.d.ts +0 -1
  7. package/dist/builder.d.ts.map +1 -1
  8. package/dist/builder.js +14 -25
  9. package/dist/builder.js.map +1 -1
  10. package/dist/engine.d.ts +28 -5
  11. package/dist/engine.d.ts.map +1 -1
  12. package/dist/engine.js +303 -105
  13. package/dist/engine.js.map +1 -1
  14. package/dist/index.d.ts +9 -12
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +7 -10
  17. package/dist/index.js.map +1 -1
  18. package/dist/loop-compiler.d.ts +28 -2
  19. package/dist/loop-compiler.d.ts.map +1 -1
  20. package/dist/loop-compiler.js +718 -38
  21. package/dist/loop-compiler.js.map +1 -1
  22. package/dist/mcp/server.d.ts.map +1 -1
  23. package/dist/mcp/server.js +6 -4
  24. package/dist/mcp/server.js.map +1 -1
  25. package/dist/mcp/session.d.ts +24 -4
  26. package/dist/mcp/session.d.ts.map +1 -1
  27. package/dist/mcp/session.js +303 -34
  28. package/dist/mcp/session.js.map +1 -1
  29. package/dist/mcp/tools.d.ts +165 -1
  30. package/dist/mcp/tools.d.ts.map +1 -1
  31. package/dist/mcp/tools.js +144 -15
  32. package/dist/mcp/tools.js.map +1 -1
  33. package/dist/memory-bridge.d.ts +47 -0
  34. package/dist/memory-bridge.d.ts.map +1 -0
  35. package/dist/memory-bridge.js +290 -0
  36. package/dist/memory-bridge.js.map +1 -0
  37. package/dist/observability.d.ts +23 -0
  38. package/dist/observability.d.ts.map +1 -0
  39. package/dist/observability.js +29 -0
  40. package/dist/observability.js.map +1 -0
  41. package/dist/policy.d.ts +72 -0
  42. package/dist/policy.d.ts.map +1 -1
  43. package/dist/policy.js +44 -0
  44. package/dist/policy.js.map +1 -1
  45. package/dist/protocol.d.ts +197 -7
  46. package/dist/protocol.d.ts.map +1 -1
  47. package/dist/protocol.js +48 -5
  48. package/dist/protocol.js.map +1 -1
  49. package/dist/runtime.d.ts +19 -0
  50. package/dist/runtime.d.ts.map +1 -1
  51. package/dist/runtime.js +446 -142
  52. package/dist/runtime.js.map +1 -1
  53. package/dist/tests/builder.test.js +1 -25
  54. package/dist/tests/builder.test.js.map +1 -1
  55. package/dist/tests/engine.test.js +213 -38
  56. package/dist/tests/engine.test.js.map +1 -1
  57. package/dist/tests/generate-schema.test.js +4 -4
  58. package/dist/tests/generate-schema.test.js.map +1 -1
  59. package/dist/tests/loop-compiler.test.js +427 -2
  60. package/dist/tests/loop-compiler.test.js.map +1 -1
  61. package/dist/tests/mcp.test.js +166 -79
  62. package/dist/tests/mcp.test.js.map +1 -1
  63. package/dist/tests/memory-bridge.test.d.ts +8 -0
  64. package/dist/tests/memory-bridge.test.d.ts.map +1 -0
  65. package/dist/tests/memory-bridge.test.js +384 -0
  66. package/dist/tests/memory-bridge.test.js.map +1 -0
  67. package/dist/tests/protocol.test.js +14 -5
  68. package/dist/tests/protocol.test.js.map +1 -1
  69. package/dist/tests/verification-gate.test.d.ts +2 -0
  70. package/dist/tests/verification-gate.test.d.ts.map +1 -0
  71. package/dist/tests/verification-gate.test.js +407 -0
  72. package/dist/tests/verification-gate.test.js.map +1 -0
  73. package/dist/verification-gate.d.ts +26 -0
  74. package/dist/verification-gate.d.ts.map +1 -0
  75. package/dist/verification-gate.js +232 -0
  76. package/dist/verification-gate.js.map +1 -0
  77. package/loop_policy.json +31 -0
  78. package/package.json +1 -2
  79. package/skills/perception/SKILL.md +147 -55
  80. package/dist/adapter.d.ts +0 -17
  81. package/dist/adapter.d.ts.map +0 -1
  82. package/dist/adapter.js +0 -228
  83. package/dist/adapter.js.map +0 -1
  84. package/dist/cli.d.ts +0 -7
  85. package/dist/cli.d.ts.map +0 -1
  86. package/dist/cli.js +0 -458
  87. package/dist/cli.js.map +0 -1
  88. package/dist/tests/adapter.test.d.ts +0 -2
  89. package/dist/tests/adapter.test.d.ts.map +0 -1
  90. package/dist/tests/adapter.test.js +0 -104
  91. package/dist/tests/adapter.test.js.map +0 -1
@@ -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
+ `**Quality Trajectory**: [${payload.qualityTrajectory.join(", ")}]`,
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":"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,4BAA4B,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;gBACnE,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"}
@@ -0,0 +1,23 @@
1
+ /** LoopForge — Structured event logging (v1.7).
2
+ *
3
+ * JSON-line events to stderr for key lifecycle moments.
4
+ * Gated behind process.env.LOOPFORGE_LOG — silent by default.
5
+ *
6
+ * Events:
7
+ * round_complete — engine/runtime after feedback processed
8
+ * circuit_breaker — shouldBreak() returns true
9
+ * gate_contradicted — verification gate returns contradicted verdict
10
+ * strategy_rotated — adaptive technique routing rotates
11
+ * vault_write_error — any catch in vault write paths
12
+ * session_start / session_end — MCP session lifecycle
13
+ *
14
+ * Usage:
15
+ * LOOPFORGE_LOG=1 npm test
16
+ * LOOPFORGE_LOG=1 node my_script.js 2>&1 | grep '\[loopforge\]'
17
+ */
18
+ export interface LogEventData {
19
+ [key: string]: unknown;
20
+ }
21
+ /** Emit a structured JSON event to stderr when LOOPFORGE_LOG is set. */
22
+ export declare function logEvent(event: string, data?: LogEventData): void;
23
+ //# sourceMappingURL=observability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../src/observability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,YAAY;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wEAAwE;AACxE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,YAAiB,GAAG,IAAI,CAQrE"}
@@ -0,0 +1,29 @@
1
+ /** LoopForge — Structured event logging (v1.7).
2
+ *
3
+ * JSON-line events to stderr for key lifecycle moments.
4
+ * Gated behind process.env.LOOPFORGE_LOG — silent by default.
5
+ *
6
+ * Events:
7
+ * round_complete — engine/runtime after feedback processed
8
+ * circuit_breaker — shouldBreak() returns true
9
+ * gate_contradicted — verification gate returns contradicted verdict
10
+ * strategy_rotated — adaptive technique routing rotates
11
+ * vault_write_error — any catch in vault write paths
12
+ * session_start / session_end — MCP session lifecycle
13
+ *
14
+ * Usage:
15
+ * LOOPFORGE_LOG=1 npm test
16
+ * LOOPFORGE_LOG=1 node my_script.js 2>&1 | grep '\[loopforge\]'
17
+ */
18
+ /** Emit a structured JSON event to stderr when LOOPFORGE_LOG is set. */
19
+ export function logEvent(event, data = {}) {
20
+ if (!process.env.LOOPFORGE_LOG)
21
+ return;
22
+ const record = {
23
+ ts: new Date().toISOString(),
24
+ event,
25
+ ...data,
26
+ };
27
+ process.stderr.write(`[loopforge] ${JSON.stringify(record)}\n`);
28
+ }
29
+ //# sourceMappingURL=observability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.js","sourceRoot":"","sources":["../src/observability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,wEAAwE;AACxE,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,OAAqB,EAAE;IAC7D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa;QAAE,OAAO;IACvC,MAAM,MAAM,GAAG;QACb,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5B,KAAK;QACL,GAAG,IAAI;KACR,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAClE,CAAC"}
package/dist/policy.d.ts CHANGED
@@ -35,6 +35,75 @@ export interface BackendPolicy {
35
35
  vault_path: string;
36
36
  global_vault_path: string;
37
37
  }
38
+ export interface EvolutionPolicy {
39
+ /** P0: Max new constraints the agent can discover per round. */
40
+ max_discovered_constraints_per_round: number;
41
+ /** P0: Hard upper bound on total active constraints. */
42
+ max_active_constraints: number;
43
+ /** P1: Max versions of the loop objective to retain in history. */
44
+ max_objective_versions: number;
45
+ /** P4: Minimum progress delta to not be considered stalled. */
46
+ progress_stall_threshold: number;
47
+ /** P4: Consecutive rounds below stall threshold before warning. */
48
+ progress_stall_rounds: number;
49
+ /** P4: Max allowed difference between objective and subjective progress. */
50
+ progress_mismatch_threshold: number;
51
+ }
52
+ /** A tier in the round-based injection strategy.
53
+ * Each tier defines how many and which injection phases are allowed
54
+ * based on the loop's maxRounds. */
55
+ export interface MemoryInjectionTier {
56
+ /** Upper bound of maxRounds for this tier (inclusive). */
57
+ max_rounds: number;
58
+ /** Which phases are allowed in this tier: [1], [1,3], or [1,2,3]. */
59
+ allowed_phases: number[];
60
+ }
61
+ export interface MemoryInjectionPolicy {
62
+ /** Master toggle for memory injection. */
63
+ enabled: boolean;
64
+ /** Minimum rounds between two consecutive injections. */
65
+ min_rounds_between_injections: number;
66
+ /** Phase trigger configuration. */
67
+ phase_thresholds: {
68
+ phase1: {
69
+ trigger: "round_1";
70
+ };
71
+ phase2: {
72
+ trigger: "progress";
73
+ threshold: number;
74
+ };
75
+ phase3: {
76
+ trigger: "progress";
77
+ threshold: number;
78
+ };
79
+ };
80
+ /** Round-based tiered injection strategy. Each tier defines which phases
81
+ * are allowed based on maxRounds. The first matching tier wins.
82
+ * Tiers should be ordered by max_rounds ascending. */
83
+ round_tiers: MemoryInjectionTier[];
84
+ /** Jaccard similarity threshold above which a new context is considered
85
+ * duplicate and skipped. */
86
+ dedup_threshold: number;
87
+ /** Maximum characters of memory context to inject (truncated if longer). */
88
+ max_context_length: number;
89
+ /** Section header for the injected context block in the L2 prompt. */
90
+ section_title: string;
91
+ }
92
+ /** Resolve which injection phases are allowed for a given maxRounds.
93
+ * Uses the tiered strategy: finds the first tier where maxRounds ≤ tier.max_rounds,
94
+ * and returns its allowed_phases. If maxRounds exceeds all tiers, returns the
95
+ * last tier's phases. */
96
+ export declare function resolveAllowedPhases(maxRounds: number, tiers: MemoryInjectionTier[]): number[];
97
+ export interface MemoryWritebackPolicy {
98
+ /** Master toggle for memory writeback on loop end. */
99
+ enabled: boolean;
100
+ /** Maximum number of feedback entries to write back. */
101
+ max_feedback_entries: number;
102
+ /** Maximum number of discoveries in the project entry. */
103
+ max_discoveries_in_project: number;
104
+ /** Only write back for these stop reasons. */
105
+ write_on_outcomes: string[];
106
+ }
38
107
  export interface LoopPolicy {
39
108
  version: string;
40
109
  constraints: ConstraintsPolicy;
@@ -44,6 +113,9 @@ export interface LoopPolicy {
44
113
  engine: EnginePolicy;
45
114
  runtime: RuntimePolicy;
46
115
  backend: BackendPolicy;
116
+ evolution: EvolutionPolicy;
117
+ memory_injection: MemoryInjectionPolicy;
118
+ memory_writeback: MemoryWritebackPolicy;
47
119
  }
48
120
  export declare const DEFAULT_POLICY: LoopPolicy;
49
121
  export declare function loadPolicy(path?: string): LoopPolicy;
@@ -1 +1 @@
1
- {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,EAAE,CAAC;IACb,EAAE,EAAE,MAAM,EAAE,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,0BAA0B,EAAE,MAAM,CAAC;IACnC,2BAA2B,EAAE,MAAM,CAAC;IACpC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,YAAY;IAC3B,uBAAuB,EAAE,MAAM,CAAC;IAChC,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IAEnB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,OAAO,EAAE,aAAa,CAAC;IACvB,kBAAkB,EAAE,uBAAuB,CAAC;IAC5C,SAAS,EAAE,eAAe,CAAC;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE,aAAa,CAAC;CACxB;AAMD,eAAO,MAAM,cAAc,EAAE,UAuD5B,CAAC;AAmCF,wBAAgB,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAmBpD;AAQD,wBAAgB,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAKnD;AAED,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"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"}
package/dist/policy.js CHANGED
@@ -4,6 +4,19 @@
4
4
  */
5
5
  import { readFileSync } from "node:fs";
6
6
  import { resolve } from "node:path";
7
+ /** Resolve which injection phases are allowed for a given maxRounds.
8
+ * Uses the tiered strategy: finds the first tier where maxRounds ≤ tier.max_rounds,
9
+ * and returns its allowed_phases. If maxRounds exceeds all tiers, returns the
10
+ * last tier's phases. */
11
+ export function resolveAllowedPhases(maxRounds, tiers) {
12
+ if (tiers.length === 0)
13
+ return [1]; // safety fallback
14
+ for (const tier of tiers) {
15
+ if (maxRounds <= tier.max_rounds)
16
+ return tier.allowed_phases;
17
+ }
18
+ return tiers[tiers.length - 1].allowed_phases;
19
+ }
7
20
  // ═══════════════════════════════════════════════════════════════════════════
8
21
  // Default policy
9
22
  // ═══════════════════════════════════════════════════════════════════════════
@@ -62,6 +75,37 @@ export const DEFAULT_POLICY = {
62
75
  vault_path: ".promptcraft/prompt_vault.json",
63
76
  global_vault_path: "~/.promptcraft/global_vault.json",
64
77
  },
78
+ evolution: {
79
+ max_discovered_constraints_per_round: 5,
80
+ max_active_constraints: 15,
81
+ max_objective_versions: 10,
82
+ progress_stall_threshold: 0.05,
83
+ progress_stall_rounds: 2,
84
+ progress_mismatch_threshold: 0.3,
85
+ },
86
+ memory_injection: {
87
+ enabled: true,
88
+ min_rounds_between_injections: 1,
89
+ phase_thresholds: {
90
+ phase1: { trigger: "round_1" },
91
+ phase2: { trigger: "progress", threshold: 0.40 },
92
+ phase3: { trigger: "progress", threshold: 0.70 },
93
+ },
94
+ round_tiers: [
95
+ { max_rounds: 10, allowed_phases: [1] },
96
+ { max_rounds: 20, allowed_phases: [1, 3] },
97
+ { max_rounds: 30, allowed_phases: [1, 2, 3] },
98
+ ],
99
+ dedup_threshold: 0.6,
100
+ max_context_length: 2000,
101
+ section_title: "### Background Context (Long-Term Memory)",
102
+ },
103
+ memory_writeback: {
104
+ enabled: true,
105
+ max_feedback_entries: 5,
106
+ max_discoveries_in_project: 3,
107
+ write_on_outcomes: ["completed", "circuit_breaker", "max_rounds"],
108
+ },
65
109
  };
66
110
  // ═══════════════════════════════════════════════════════════════════════════
67
111
  // Deep merge — custom values override defaults, unset fields retain defaults
@@ -1 +1 @@
1
- {"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"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"}