loopforge 1.12.0 → 2.0.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 (182) hide show
  1. package/README.md +172 -95
  2. package/dist/backends/interface.d.ts +3 -9
  3. package/dist/backends/interface.d.ts.map +1 -1
  4. package/dist/backends/interface.js +1 -5
  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 +44 -0
  15. package/dist/enforcement-gate.d.ts.map +1 -0
  16. package/dist/enforcement-gate.js +271 -0
  17. package/dist/enforcement-gate.js.map +1 -0
  18. package/dist/engine.d.ts +17 -7
  19. package/dist/engine.d.ts.map +1 -1
  20. package/dist/engine.js +158 -249
  21. package/dist/engine.js.map +1 -1
  22. package/dist/evidence-provider.d.ts +113 -0
  23. package/dist/evidence-provider.d.ts.map +1 -0
  24. package/dist/evidence-provider.js +419 -0
  25. package/dist/evidence-provider.js.map +1 -0
  26. package/dist/index.d.ts +19 -11
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +16 -10
  29. package/dist/index.js.map +1 -1
  30. package/dist/init.d.ts +15 -0
  31. package/dist/init.d.ts.map +1 -0
  32. package/dist/init.js +49 -0
  33. package/dist/init.js.map +1 -0
  34. package/dist/interop.d.ts +30 -0
  35. package/dist/interop.d.ts.map +1 -0
  36. package/dist/interop.js +29 -0
  37. package/dist/interop.js.map +1 -0
  38. package/dist/loop-compiler.d.ts +14 -64
  39. package/dist/loop-compiler.d.ts.map +1 -1
  40. package/dist/loop-compiler.js +307 -2001
  41. package/dist/loop-compiler.js.map +1 -1
  42. package/dist/loop-store.d.ts +82 -0
  43. package/dist/loop-store.d.ts.map +1 -0
  44. package/dist/loop-store.js +332 -0
  45. package/dist/loop-store.js.map +1 -0
  46. package/dist/mcp/server.d.ts +9 -6
  47. package/dist/mcp/server.d.ts.map +1 -1
  48. package/dist/mcp/server.js +109 -73
  49. package/dist/mcp/server.js.map +1 -1
  50. package/dist/mcp/session.d.ts +84 -20
  51. package/dist/mcp/session.d.ts.map +1 -1
  52. package/dist/mcp/session.js +718 -316
  53. package/dist/mcp/session.js.map +1 -1
  54. package/dist/mcp/tools.d.ts +18 -268
  55. package/dist/mcp/tools.d.ts.map +1 -1
  56. package/dist/mcp/tools.js +225 -12
  57. package/dist/mcp/tools.js.map +1 -1
  58. package/dist/observability.d.ts +36 -16
  59. package/dist/observability.d.ts.map +1 -1
  60. package/dist/observability.js +82 -23
  61. package/dist/observability.js.map +1 -1
  62. package/dist/policy-metrics.d.ts +46 -0
  63. package/dist/policy-metrics.d.ts.map +1 -0
  64. package/dist/policy-metrics.js +146 -0
  65. package/dist/policy-metrics.js.map +1 -0
  66. package/dist/policy.d.ts +58 -75
  67. package/dist/policy.d.ts.map +1 -1
  68. package/dist/policy.js +122 -93
  69. package/dist/policy.js.map +1 -1
  70. package/dist/prompt-assembler.d.ts +30 -0
  71. package/dist/prompt-assembler.d.ts.map +1 -0
  72. package/dist/prompt-assembler.js +257 -0
  73. package/dist/prompt-assembler.js.map +1 -0
  74. package/dist/prompt-policy.d.ts +29 -0
  75. package/dist/prompt-policy.d.ts.map +1 -0
  76. package/dist/prompt-policy.js +51 -0
  77. package/dist/prompt-policy.js.map +1 -0
  78. package/dist/protocol.d.ts +117 -91
  79. package/dist/protocol.d.ts.map +1 -1
  80. package/dist/protocol.js +40 -36
  81. package/dist/protocol.js.map +1 -1
  82. package/dist/replay.d.ts.map +1 -1
  83. package/dist/replay.js +1 -27
  84. package/dist/replay.js.map +1 -1
  85. package/dist/round-coordinator.d.ts +90 -0
  86. package/dist/round-coordinator.d.ts.map +1 -0
  87. package/dist/round-coordinator.js +186 -0
  88. package/dist/round-coordinator.js.map +1 -0
  89. package/dist/round-driver.d.ts +53 -0
  90. package/dist/round-driver.d.ts.map +1 -0
  91. package/dist/round-driver.js +101 -0
  92. package/dist/round-driver.js.map +1 -0
  93. package/dist/round-transaction.d.ts +70 -0
  94. package/dist/round-transaction.d.ts.map +1 -0
  95. package/dist/round-transaction.js +290 -0
  96. package/dist/round-transaction.js.map +1 -0
  97. package/dist/runtime.d.ts +35 -17
  98. package/dist/runtime.d.ts.map +1 -1
  99. package/dist/runtime.js +357 -344
  100. package/dist/runtime.js.map +1 -1
  101. package/dist/storage.d.ts +38 -0
  102. package/dist/storage.d.ts.map +1 -0
  103. package/dist/storage.js +201 -0
  104. package/dist/storage.js.map +1 -0
  105. package/dist/verification-gate.d.ts +39 -7
  106. package/dist/verification-gate.d.ts.map +1 -1
  107. package/dist/verification-gate.js +198 -9
  108. package/dist/verification-gate.js.map +1 -1
  109. package/loop_policy.json +26 -47
  110. package/package.json +13 -10
  111. package/skills/perception/SKILL.md +80 -249
  112. package/dist/backends/fs.d.ts +0 -36
  113. package/dist/backends/fs.d.ts.map +0 -1
  114. package/dist/backends/fs.js +0 -358
  115. package/dist/backends/fs.js.map +0 -1
  116. package/dist/builder.d.ts +0 -12
  117. package/dist/builder.d.ts.map +0 -1
  118. package/dist/builder.js +0 -259
  119. package/dist/builder.js.map +0 -1
  120. package/dist/mcp-server.d.ts +0 -12
  121. package/dist/mcp-server.d.ts.map +0 -1
  122. package/dist/mcp-server.js +0 -14
  123. package/dist/mcp-server.js.map +0 -1
  124. package/dist/memory-bridge.d.ts +0 -47
  125. package/dist/memory-bridge.d.ts.map +0 -1
  126. package/dist/memory-bridge.js +0 -290
  127. package/dist/memory-bridge.js.map +0 -1
  128. package/dist/tests/_helpers.d.ts +0 -25
  129. package/dist/tests/_helpers.d.ts.map +0 -1
  130. package/dist/tests/_helpers.js +0 -47
  131. package/dist/tests/_helpers.js.map +0 -1
  132. package/dist/tests/builder.test.d.ts +0 -2
  133. package/dist/tests/builder.test.d.ts.map +0 -1
  134. package/dist/tests/builder.test.js +0 -110
  135. package/dist/tests/builder.test.js.map +0 -1
  136. package/dist/tests/engine.test.d.ts +0 -2
  137. package/dist/tests/engine.test.d.ts.map +0 -1
  138. package/dist/tests/engine.test.js +0 -371
  139. package/dist/tests/engine.test.js.map +0 -1
  140. package/dist/tests/generate-schema.test.d.ts +0 -8
  141. package/dist/tests/generate-schema.test.d.ts.map +0 -1
  142. package/dist/tests/generate-schema.test.js +0 -199
  143. package/dist/tests/generate-schema.test.js.map +0 -1
  144. package/dist/tests/loop-compiler.test.d.ts +0 -2
  145. package/dist/tests/loop-compiler.test.d.ts.map +0 -1
  146. package/dist/tests/loop-compiler.test.js +0 -1051
  147. package/dist/tests/loop-compiler.test.js.map +0 -1
  148. package/dist/tests/mcp.test.d.ts +0 -7
  149. package/dist/tests/mcp.test.d.ts.map +0 -1
  150. package/dist/tests/mcp.test.js +0 -485
  151. package/dist/tests/mcp.test.js.map +0 -1
  152. package/dist/tests/memory-bridge.test.d.ts +0 -8
  153. package/dist/tests/memory-bridge.test.d.ts.map +0 -1
  154. package/dist/tests/memory-bridge.test.js +0 -383
  155. package/dist/tests/memory-bridge.test.js.map +0 -1
  156. package/dist/tests/policy.test.d.ts +0 -2
  157. package/dist/tests/policy.test.d.ts.map +0 -1
  158. package/dist/tests/policy.test.js +0 -49
  159. package/dist/tests/policy.test.js.map +0 -1
  160. package/dist/tests/protocol.test.d.ts +0 -2
  161. package/dist/tests/protocol.test.d.ts.map +0 -1
  162. package/dist/tests/protocol.test.js +0 -73
  163. package/dist/tests/protocol.test.js.map +0 -1
  164. package/dist/tests/replay.test.d.ts +0 -2
  165. package/dist/tests/replay.test.d.ts.map +0 -1
  166. package/dist/tests/replay.test.js +0 -222
  167. package/dist/tests/replay.test.js.map +0 -1
  168. package/dist/tests/runtime.test.d.ts +0 -7
  169. package/dist/tests/runtime.test.d.ts.map +0 -1
  170. package/dist/tests/runtime.test.js +0 -323
  171. package/dist/tests/runtime.test.js.map +0 -1
  172. package/dist/tests/verification-gate.test.d.ts +0 -2
  173. package/dist/tests/verification-gate.test.d.ts.map +0 -1
  174. package/dist/tests/verification-gate.test.js +0 -407
  175. package/dist/tests/verification-gate.test.js.map +0 -1
  176. package/skills/prompt-techniques/SKILL.md +0 -52
  177. package/skills/prompt-techniques/references/chain-of-thought.md +0 -207
  178. package/skills/prompt-techniques/references/few-shot.md +0 -174
  179. package/skills/prompt-techniques/references/least-to-most.md +0 -182
  180. package/skills/prompt-techniques/references/step-back.md +0 -160
  181. package/skills/prompt-techniques/references/tree-of-thought.md +0 -191
  182. package/skills/prompt-techniques/references/zero-shot.md +0 -97
@@ -1,358 +0,0 @@
1
- /** FSBackend — filesystem implementation of VaultBackend.
2
- *
3
- * Wraps Node.js fs for JSON vault read/write and Markdown lineage I/O.
4
- * All file I/O is contained in this single module — engine.ts never
5
- * touches the filesystem directly.
6
- */
7
- import { readFileSync, writeFileSync, mkdirSync, readdirSync, existsSync, rmSync, } from "node:fs";
8
- import { resolve, dirname } from "node:path";
9
- import { homedir } from "node:os";
10
- // ═══════════════════════════════════════════════════════════════════════════
11
- // YAML frontmatter helpers (lightweight, no dependency)
12
- // ═══════════════════════════════════════════════════════════════════════════
13
- const FRONTMATTER_DELIM = "---";
14
- function escapeYamlString(value) {
15
- if (/[":{}[\],&\*\#\?\-<>=!%@`]/.test(value) || value.includes("\n")) {
16
- return `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
17
- }
18
- return value;
19
- }
20
- function buildYamlFrontmatter(metadata) {
21
- const lines = [FRONTMATTER_DELIM];
22
- for (const [key, value] of Object.entries(metadata)) {
23
- if (value === null || value === undefined)
24
- continue;
25
- if (Array.isArray(value)) {
26
- if (value.length === 0) {
27
- lines.push(`${key}: []`);
28
- }
29
- else {
30
- lines.push(`${key}:`);
31
- for (const item of value) {
32
- lines.push(` - ${escapeYamlString(String(item))}`);
33
- }
34
- }
35
- }
36
- else if (typeof value === "object") {
37
- lines.push(`${key}:`);
38
- for (const [subKey, subValue] of Object.entries(value)) {
39
- if (subValue !== null && subValue !== undefined) {
40
- if (Array.isArray(subValue)) {
41
- lines.push(` ${subKey}:`);
42
- for (const item of subValue) {
43
- lines.push(` - ${escapeYamlString(String(item))}`);
44
- }
45
- }
46
- else {
47
- lines.push(` ${subKey}: ${escapeYamlString(String(subValue))}`);
48
- }
49
- }
50
- }
51
- }
52
- else if (typeof value === "boolean") {
53
- lines.push(`${key}: ${value}`);
54
- }
55
- else if (typeof value === "number") {
56
- lines.push(`${key}: ${value}`);
57
- }
58
- else {
59
- lines.push(`${key}: ${escapeYamlString(String(value))}`);
60
- }
61
- }
62
- lines.push(FRONTMATTER_DELIM);
63
- return lines.join("\n") + "\n";
64
- }
65
- function parseYamlFrontmatter(text) {
66
- const metadata = {};
67
- let body = text;
68
- if (!text.startsWith(FRONTMATTER_DELIM)) {
69
- return { metadata, body };
70
- }
71
- const endIdx = text.indexOf(FRONTMATTER_DELIM, 3);
72
- if (endIdx === -1) {
73
- return { metadata, body };
74
- }
75
- const fmBlock = text.slice(3, endIdx).trim();
76
- body = text.slice(endIdx + 3).trim();
77
- // Simple YAML key: value parser (covers our subset)
78
- let currentKey = "";
79
- for (const line of fmBlock.split("\n")) {
80
- const trimmed = line.trim();
81
- if (!trimmed)
82
- continue;
83
- // List item
84
- if (trimmed.startsWith("- ")) {
85
- const item = trimmed.slice(2).trim().replace(/^"(.*)"$/, "$1");
86
- if (currentKey && metadata[currentKey]) {
87
- metadata[currentKey].push(item);
88
- }
89
- else if (currentKey) {
90
- metadata[currentKey] = [item];
91
- }
92
- continue;
93
- }
94
- // Nested key (indented)
95
- if (line.startsWith(" ") && !line.startsWith(" ")) {
96
- const nestedMatch = trimmed.match(/^([a-z_]+):\s*(.*)/i);
97
- if (nestedMatch && currentKey) {
98
- const nKey = nestedMatch[1];
99
- const nVal = nestedMatch[2].trim().replace(/^"(.*)"$/, "$1");
100
- if (!metadata[currentKey]) {
101
- metadata[currentKey] = {};
102
- }
103
- metadata[currentKey][nKey] =
104
- coerceYamlScalar(nVal);
105
- }
106
- continue;
107
- }
108
- // Top-level key: value
109
- const match = trimmed.match(/^([a-z_]+):\s*(.*)/i);
110
- if (match) {
111
- currentKey = match[1];
112
- const val = match[2].trim();
113
- if (val) {
114
- metadata[currentKey] = coerceYamlScalar(val.replace(/^"(.*)"$/, "$1"));
115
- }
116
- else {
117
- metadata[currentKey] = "";
118
- }
119
- }
120
- }
121
- return { metadata, body };
122
- }
123
- function coerceYamlScalar(value) {
124
- if (value === "true" || value === "True")
125
- return true;
126
- if (value === "false" || value === "False")
127
- return false;
128
- const num = Number(value);
129
- if (!Number.isNaN(num) && value.trim() !== "")
130
- return num;
131
- return value;
132
- }
133
- // ═══════════════════════════════════════════════════════════════════════════
134
- // Path helpers
135
- // ═══════════════════════════════════════════════════════════════════════════
136
- function lineageDirName(loopId) {
137
- return `loop-${loopId.replace(/:/g, "-")}`;
138
- }
139
- function resolveVaultPath(rawPath) {
140
- if (rawPath.startsWith("~")) {
141
- return resolve(homedir(), rawPath.slice(2));
142
- }
143
- return resolve(rawPath);
144
- }
145
- // ═══════════════════════════════════════════════════════════════════════════
146
- // Markdown lineage I/O (module-level functions)
147
- // ═══════════════════════════════════════════════════════════════════════════
148
- export function readLineageMd(loopId, roundNum, vaultPath) {
149
- const baseDir = vaultPath
150
- ? dirname(resolveVaultPath(vaultPath))
151
- : resolve(".promptcraft");
152
- const mdPath = resolve(baseDir, "prompts", lineageDirName(loopId), `r${roundNum}.md`);
153
- try {
154
- const raw = readFileSync(mdPath, "utf-8");
155
- const { metadata, body } = parseYamlFrontmatter(raw);
156
- return { full_prompt: body, metadata };
157
- }
158
- catch {
159
- return null;
160
- }
161
- }
162
- export function writeLineageMd(loopId, roundNum, content, metadata, vaultPath) {
163
- const baseDir = vaultPath
164
- ? dirname(resolveVaultPath(vaultPath))
165
- : resolve(".promptcraft");
166
- const dir = resolve(baseDir, "prompts", lineageDirName(loopId));
167
- const mdPath = resolve(dir, `r${roundNum}.md`);
168
- try {
169
- mkdirSync(dir, { recursive: true });
170
- const fm = buildYamlFrontmatter(metadata);
171
- writeFileSync(mdPath, fm + "\n" + content, "utf-8");
172
- return mdPath;
173
- }
174
- catch {
175
- return null;
176
- }
177
- }
178
- export function scanLineageMd(loopId, vaultPath) {
179
- const baseDir = vaultPath
180
- ? dirname(resolveVaultPath(vaultPath))
181
- : resolve(".promptcraft");
182
- const dir = resolve(baseDir, "prompts", lineageDirName(loopId));
183
- const entries = [];
184
- try {
185
- if (!existsSync(dir))
186
- return entries;
187
- const files = readdirSync(dir).filter((f) => f.startsWith("r") && f.endsWith(".md"));
188
- for (const file of files) {
189
- const roundMatch = file.match(/^r(\d+)\.md$/);
190
- if (!roundMatch)
191
- continue;
192
- const roundNum = parseInt(roundMatch[1], 10);
193
- const fullPath = resolve(dir, file);
194
- const raw = readFileSync(fullPath, "utf-8");
195
- const { metadata, body } = parseYamlFrontmatter(raw);
196
- entries.push({
197
- task_id: `loop:${loopId}:r${roundNum}`,
198
- full_prompt: body,
199
- technique_used: metadata.technique_used,
200
- success: metadata.success ?? true,
201
- loop_lineage: {
202
- loop_id: loopId,
203
- round: roundNum,
204
- goal_id: metadata.goal_id,
205
- goal_text_hash: metadata.goal_text_hash,
206
- recompile_level: metadata.recompile_level,
207
- constraints_active: metadata.constraints_active,
208
- task: metadata.task,
209
- technique_used: metadata.technique_used,
210
- success: metadata.success,
211
- output_summary: metadata.output_summary,
212
- constraint_violations: metadata.constraint_violations,
213
- },
214
- loop_id: loopId,
215
- task: metadata.task,
216
- output_summary: metadata.output_summary,
217
- constraint_violations: metadata
218
- .constraint_violations,
219
- });
220
- }
221
- }
222
- catch {
223
- // Directory doesn't exist or can't be read
224
- }
225
- return entries;
226
- }
227
- // ═══════════════════════════════════════════════════════════════════════════
228
- // FSBackend
229
- // ═══════════════════════════════════════════════════════════════════════════
230
- export class FSBackend {
231
- vaultPath;
232
- // v2: federation — global vault for cross-project constraints (not yet implemented)
233
- globalVaultPath;
234
- /** Re-entrant lock depth — >0 means this process holds the lock. */
235
- lockDepth = 0;
236
- constructor(vaultPath = ".promptcraft/prompt_vault.json", globalVaultPath = "~/.promptcraft/global_vault.json") {
237
- this.vaultPath = vaultPath;
238
- this.globalVaultPath = globalVaultPath;
239
- }
240
- /** File-system mutex via mkdir (atomic on POSIX and Windows).
241
- * Re-entrant: nested calls from the same process bypass the lock. */
242
- withLock(fn) {
243
- if (this.lockDepth > 0) {
244
- this.lockDepth++;
245
- try {
246
- return fn();
247
- }
248
- finally {
249
- this.lockDepth--;
250
- }
251
- }
252
- const lockPath = resolveVaultPath(this.vaultPath).replace(/\.json$/, ".lock");
253
- for (let i = 0; i < 100; i++) {
254
- try {
255
- mkdirSync(lockPath);
256
- break;
257
- }
258
- catch {
259
- if (i === 99)
260
- throw new Error("Vault lock timeout");
261
- }
262
- // spin-wait 10ms
263
- const start = Date.now();
264
- while (Date.now() - start < 10) {
265
- /* spin */
266
- }
267
- }
268
- this.lockDepth = 1;
269
- try {
270
- return fn();
271
- }
272
- finally {
273
- this.lockDepth = 0;
274
- try {
275
- rmSync(lockPath, { recursive: true });
276
- }
277
- catch {
278
- /* orphaned lock — next process cleans up via timeout */
279
- }
280
- }
281
- }
282
- // ── JSON vault ────────────────────────────────────────────────────────
283
- readVault() {
284
- const resolved = resolveVaultPath(this.vaultPath);
285
- try {
286
- const raw = readFileSync(resolved, "utf-8");
287
- return JSON.parse(raw);
288
- }
289
- catch {
290
- return { entries: [] };
291
- }
292
- }
293
- writeVault(data) {
294
- this.withLock(() => {
295
- const resolved = resolveVaultPath(this.vaultPath);
296
- mkdirSync(dirname(resolved), { recursive: true });
297
- writeFileSync(resolved, JSON.stringify(data, null, 2), "utf-8");
298
- });
299
- }
300
- // ── Entry queries ─────────────────────────────────────────────────────
301
- queryEntries(opts) {
302
- const vault = this.readVault();
303
- const entries = vault.entries || [];
304
- return entries.filter((entry) => {
305
- const taskId = String(entry.task_id ?? "");
306
- // Feedback-only filter
307
- if (opts?.feedbackOnly && !taskId.endsWith(":feedback")) {
308
- return false;
309
- }
310
- // Exclude feedback entries when not feedbackOnly
311
- if (!opts?.feedbackOnly && taskId.endsWith(":feedback")) {
312
- return false;
313
- }
314
- // Prefix filter
315
- if (opts?.prefix && !taskId.startsWith(opts.prefix)) {
316
- return false;
317
- }
318
- // Pattern filter (simple substring match)
319
- if (opts?.taskIdPattern &&
320
- !taskId.includes(opts.taskIdPattern)) {
321
- return false;
322
- }
323
- return true;
324
- });
325
- }
326
- appendEntry(entry) {
327
- this.withLock(() => {
328
- const vault = this.readVault();
329
- const entries = vault.entries || [];
330
- entries.push(entry);
331
- vault.entries = entries;
332
- this.writeVault(vault);
333
- });
334
- }
335
- appendEntries(entries) {
336
- return this.withLock(() => {
337
- if (entries.length === 0)
338
- return 0;
339
- const vault = this.readVault();
340
- const existing = vault.entries || [];
341
- vault.entries = [...existing, ...entries];
342
- this.writeVault(vault);
343
- return entries.length;
344
- });
345
- }
346
- // ── Markdown lineage ──────────────────────────────────────────────────
347
- writeLineageMd(loopId, roundNum, content, metadata) {
348
- return writeLineageMd(loopId, roundNum, content, metadata, this.vaultPath);
349
- }
350
- readLineageMd(loopId, roundNum) {
351
- const result = readLineageMd(loopId, roundNum, this.vaultPath);
352
- return result?.full_prompt ?? null;
353
- }
354
- scanLineageMd(loopId) {
355
- return scanLineageMd(loopId, this.vaultPath);
356
- }
357
- }
358
- //# sourceMappingURL=fs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/backends/fs.ts"],"names":[],"mappings":"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"}
package/dist/builder.d.ts DELETED
@@ -1,12 +0,0 @@
1
- /** LoopForge Agent — Technique router.
2
- *
3
- * Pure-function technique selection via keyword heuristic with tier gating.
4
- * Tier 1 (zero-shot / few-shot / CoT): always available.
5
- * Tier 2 (step-back / least-to-most / ToT): checkpoint boundaries or
6
- * after consecutive failures only.
7
- */
8
- import { type Analysis } from "./protocol.js";
9
- export declare const TECHNIQUE_REFERENCE: Record<string, string>;
10
- export declare function routeTechnique(task: string): Analysis;
11
- export declare function routeTechniqueAdaptive(task: string, vaultContext?: Record<string, unknown> | null, loopId?: string, isCheckpoint?: boolean): Analysis;
12
- //# sourceMappingURL=builder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAGL,KAAK,QAAQ,EACd,MAAM,eAAe,CAAC;AA+BvB,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQtD,CAAC;AAgCF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAmCrD;AAsHD,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,YAAY,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAW,EACnD,MAAM,SAAK,EACX,YAAY,UAAQ,GACnB,QAAQ,CA+DV"}
package/dist/builder.js DELETED
@@ -1,259 +0,0 @@
1
- /** LoopForge Agent — Technique router.
2
- *
3
- * Pure-function technique selection via keyword heuristic with tier gating.
4
- * Tier 1 (zero-shot / few-shot / CoT): always available.
5
- * Tier 2 (step-back / least-to-most / ToT): checkpoint boundaries or
6
- * after consecutive failures only.
7
- */
8
- import { getPolicy } from "./policy.js";
9
- import { logEvent } from "./observability.js";
10
- import { makeAnalysis, Technique, } from "./protocol.js";
11
- // ═══════════════════════════════════════════════════════════════════════════
12
- // Routing table
13
- // ═══════════════════════════════════════════════════════════════════════════
14
- const ROUTING_TABLE = {
15
- continuous_low: Technique.ZERO_SHOT,
16
- independent_low: Technique.ZERO_SHOT,
17
- continuous_medium: Technique.FEW_SHOT,
18
- independent_medium: Technique.ZERO_SHOT_COT,
19
- continuous_high: Technique.FEW_SHOT_COT,
20
- independent_high: Technique.TREE_OF_THOUGHT,
21
- };
22
- const RATIONALE = {
23
- [Technique.ZERO_SHOT]: "Low load — direct instruction suffices.",
24
- [Technique.FEW_SHOT]: "Fixed I/O pattern expected — examples anchor output format.",
25
- [Technique.ZERO_SHOT_COT]: "Multi-step reasoning needed, no examples provided.",
26
- [Technique.FEW_SHOT_COT]: "Complex reasoning with provided examples — relay pattern.",
27
- [Technique.STEP_BACK]: "Vague or legacy — abstract to principles first.",
28
- [Technique.LEAST_TO_MOST]: "Decomposable into ordered subproblems.",
29
- [Technique.TREE_OF_THOUGHT]: "High risk, multi-path — explore + evaluate + prune.",
30
- };
31
- export const TECHNIQUE_REFERENCE = {
32
- "zero-shot": "loopforge/skills/prompt-techniques/references/zero-shot.md",
33
- "few-shot": "loopforge/skills/prompt-techniques/references/few-shot.md",
34
- "zero-shot-cot": "loopforge/skills/prompt-techniques/references/chain-of-thought.md",
35
- "few-shot-cot": "loopforge/skills/prompt-techniques/references/chain-of-thought.md",
36
- "step-back": "loopforge/skills/prompt-techniques/references/step-back.md",
37
- "least-to-most": "loopforge/skills/prompt-techniques/references/least-to-most.md",
38
- "tree-of-thought": "loopforge/skills/prompt-techniques/references/tree-of-thought.md",
39
- };
40
- // Keyword sets for heuristic classification
41
- const HIGH_LOAD_WORDS = new Set([
42
- "security", "audit", "crypto", "encrypt", "concurrent",
43
- "thread", "transaction", "rollback", "compile", "protocol",
44
- "安全", "审计", "加密", "并发", "签名", "校验", "默克尔",
45
- "assembly", "重放攻击", "共识", "虚拟机", "字节码",
46
- ]);
47
- const LOW_LOAD_WORDS = new Set([
48
- "rename", "format", "comment", "config", "readme", "simple", "basic",
49
- ]);
50
- const CONTINUOUS_WORDS = new Set([
51
- "fix", "modify", "update", "change", "refactor", "extend",
52
- "add", "improve", "debug",
53
- ]);
54
- // v1.1: Keywords that trigger specialist techniques (override routing table)
55
- const STEP_BACK_WORDS = new Set([
56
- "重构", "排查", "legacy", "原则", "抽象", "根本原因", "root cause",
57
- "报错", "逻辑混乱", "含糊", "vague", "审计方法", "底层",
58
- ]);
59
- const LEAST_TO_MOST_WORDS = new Set([
60
- "逐步", "搭建", "实现系统", "build system", "pipeline", "编译器",
61
- "逐步求解", "有序", "从简单到复杂", "数据采集", "完整模块",
62
- "多步骤", "部署流程", "子问题",
63
- ]);
64
- // ═══════════════════════════════════════════════════════════════════════════
65
- // Keyword heuristic router
66
- // ═══════════════════════════════════════════════════════════════════════════
67
- export function routeTechnique(task) {
68
- const taskLower = task.toLowerCase();
69
- // Independence — check if any continuous word appears in task
70
- const continuous = [...CONTINUOUS_WORDS].some((w) => taskLower.includes(w));
71
- const independence = continuous ? "continuous" : "independent";
72
- // Cognitive load — check keyword presence
73
- let load;
74
- if ([...HIGH_LOAD_WORDS].some((w) => taskLower.includes(w))) {
75
- load = "high";
76
- }
77
- else if ([...LOW_LOAD_WORDS].some((w) => taskLower.includes(w))) {
78
- load = "low";
79
- }
80
- else {
81
- load = task.split(/\s+/).length > 8 ? "medium" : "low";
82
- }
83
- let technique = ROUTING_TABLE[`${independence}_${load}`] ?? Technique.ZERO_SHOT;
84
- // v1.1: Keyword overrides for specialist techniques
85
- if ([...STEP_BACK_WORDS].some((w) => taskLower.includes(w))) {
86
- technique = Technique.STEP_BACK;
87
- load = "high";
88
- }
89
- else if ([...LEAST_TO_MOST_WORDS].some((w) => taskLower.includes(w))) {
90
- technique = Technique.LEAST_TO_MOST;
91
- load = "high";
92
- }
93
- return makeAnalysis({
94
- technique: technique,
95
- rationale: RATIONALE[technique] ?? "Default route.",
96
- independence,
97
- cognitive_load: load,
98
- reference_file: TECHNIQUE_REFERENCE[technique] ?? "",
99
- });
100
- }
101
- // ═══════════════════════════════════════════════════════════════════════════
102
- // Tier definitions
103
- // ═══════════════════════════════════════════════════════════════════════════
104
- const TIER_1_TECHNIQUES = new Set([
105
- Technique.ZERO_SHOT,
106
- Technique.FEW_SHOT,
107
- Technique.ZERO_SHOT_COT,
108
- Technique.FEW_SHOT_COT,
109
- ]);
110
- const TIER_2_TECHNIQUES = new Set([
111
- Technique.STEP_BACK,
112
- Technique.LEAST_TO_MOST,
113
- Technique.TREE_OF_THOUGHT,
114
- ]);
115
- function isTier2Technique(t) {
116
- return TIER_2_TECHNIQUES.has(t);
117
- }
118
- // Downgrade map: Tier 2 → nearest Tier 1 equivalent
119
- const DOWNGRADE_TIER2_TO_TIER1 = {
120
- [Technique.STEP_BACK]: Technique.FEW_SHOT_COT,
121
- [Technique.LEAST_TO_MOST]: Technique.ZERO_SHOT_COT,
122
- [Technique.TREE_OF_THOUGHT]: Technique.FEW_SHOT_COT,
123
- };
124
- function downgradeToTier1(technique) {
125
- return DOWNGRADE_TIER2_TO_TIER1[technique] ?? Technique.FEW_SHOT;
126
- }
127
- // ═══════════════════════════════════════════════════════════════════════════
128
- // Consecutive failure detection
129
- // ═══════════════════════════════════════════════════════════════════════════
130
- function countConsecutiveFailures(loopId, vaultContext) {
131
- if (vaultContext === null)
132
- return 0;
133
- const results = vaultContext.results || [];
134
- if (!results.length)
135
- return 0;
136
- // Collect rounds with success field from feedback entries
137
- const rounds = [];
138
- for (const r of results) {
139
- const lineage = (r.loop_lineage || r.lineage || {});
140
- if (lineage.loop_id !== loopId)
141
- continue;
142
- const success = r.success !== undefined
143
- ? r.success
144
- : lineage.success;
145
- if (success === undefined)
146
- continue; // lineage entries without merged feedback — skip
147
- rounds.push({
148
- round: lineage.round ?? 0,
149
- success,
150
- });
151
- }
152
- rounds.sort((a, b) => b.round - a.round);
153
- let count = 0;
154
- for (const rnd of rounds) {
155
- if (rnd.success === false) {
156
- count++;
157
- }
158
- else {
159
- break;
160
- }
161
- }
162
- return count;
163
- }
164
- // ═══════════════════════════════════════════════════════════════════════════
165
- // Keyword routing restricted to a subset of techniques
166
- // ═══════════════════════════════════════════════════════════════════════════
167
- function keywordRouteRestricted(task, allowedTechniques) {
168
- // Run full keyword routing first
169
- const full = routeTechnique(task);
170
- const technique = full.technique;
171
- // If the keyword result is already in the allowed set, use it
172
- if (allowedTechniques.includes(technique))
173
- return full;
174
- // If it's Tier 2 downgraded to Tier 1, map to the nearest Tier 1
175
- if (isTier2Technique(technique)) {
176
- const downgraded = downgradeToTier1(technique);
177
- if (allowedTechniques.includes(downgraded)) {
178
- return makeAnalysis({
179
- technique: downgraded,
180
- rationale: `${full.rationale} [DOWNGRADED: ${technique} → ${downgraded} — Tier 2 not available this round]`,
181
- independence: full.independence,
182
- cognitive_load: full.cognitive_load,
183
- reference_file: TECHNIQUE_REFERENCE[downgraded] ?? full.reference_file,
184
- });
185
- }
186
- }
187
- // Fallback: pick the first technique in the allowed set
188
- const fallback = allowedTechniques[0];
189
- return makeAnalysis({
190
- technique: fallback,
191
- rationale: `${RATIONALE[fallback] ?? "Tier-restricted route."} [RESTRICTED: keyword ${technique} not in allowed set [${allowedTechniques.join(", ")}]]`,
192
- independence: full.independence,
193
- cognitive_load: full.cognitive_load,
194
- reference_file: TECHNIQUE_REFERENCE[fallback] ?? "",
195
- });
196
- }
197
- // ═══════════════════════════════════════════════════════════════════════════
198
- // Tier-gated technique router (v4.0)
199
- // ═══════════════════════════════════════════════════════════════════════════
200
- export function routeTechniqueAdaptive(task, vaultContext = null, loopId = "", isCheckpoint = false) {
201
- // Step 1: Full keyword routing over all 7 techniques
202
- const keyword = routeTechnique(task);
203
- const technique = keyword.technique;
204
- // Step 2: Determine which tier is allowed this round
205
- const policy = getPolicy();
206
- const tier2Failures = policy.technique.tier2_escalation_failures ?? 3;
207
- const consecutiveFailures = vaultContext && loopId
208
- ? countConsecutiveFailures(loopId, vaultContext)
209
- : 0;
210
- let allowedTechniques;
211
- let tierLabel;
212
- if (isCheckpoint) {
213
- // Checkpoint boundary: full access to all 7 techniques
214
- allowedTechniques = [
215
- Technique.ZERO_SHOT, Technique.FEW_SHOT,
216
- Technique.ZERO_SHOT_COT, Technique.FEW_SHOT_COT,
217
- Technique.STEP_BACK, Technique.LEAST_TO_MOST, Technique.TREE_OF_THOUGHT,
218
- ];
219
- tierLabel = "checkpoint";
220
- }
221
- else if (consecutiveFailures >= tier2Failures) {
222
- // Escalation: Tier 2 only
223
- allowedTechniques = [
224
- Technique.STEP_BACK, Technique.LEAST_TO_MOST, Technique.TREE_OF_THOUGHT,
225
- ];
226
- tierLabel = `escalated (${consecutiveFailures} consecutive failures)`;
227
- logEvent("tier2_escalation", {
228
- loopId,
229
- consecutiveFailures,
230
- keywordTechnique: technique,
231
- });
232
- }
233
- else {
234
- // Normal: Tier 1 only
235
- allowedTechniques = [
236
- Technique.ZERO_SHOT, Technique.FEW_SHOT,
237
- Technique.ZERO_SHOT_COT, Technique.FEW_SHOT_COT,
238
- ];
239
- tierLabel = "default";
240
- }
241
- // Step 3: Apply gate — if keyword result is in allowed set, use it
242
- if (allowedTechniques.includes(technique)) {
243
- if (tierLabel === "default")
244
- return keyword; // Most common path — no overhead
245
- const label = tierLabel === "checkpoint"
246
- ? `${keyword.rationale} [CHECKPOINT: full technique access]`
247
- : `${keyword.rationale} [ESCALATED: Tier 2 — ${consecutiveFailures} consecutive failures]`;
248
- return makeAnalysis({
249
- technique,
250
- rationale: label,
251
- independence: keyword.independence,
252
- cognitive_load: keyword.cognitive_load,
253
- reference_file: keyword.reference_file,
254
- });
255
- }
256
- // Step 4: Keyword result outside allowed set — downgrade or restrict
257
- return keywordRouteRestricted(task, allowedTechniques);
258
- }
259
- //# sourceMappingURL=builder.js.map