loopforge 1.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 (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +75 -0
  3. package/dist/adapter.d.ts +17 -0
  4. package/dist/adapter.d.ts.map +1 -0
  5. package/dist/adapter.js +228 -0
  6. package/dist/adapter.js.map +1 -0
  7. package/dist/backends/fs.d.ts +31 -0
  8. package/dist/backends/fs.d.ts.map +1 -0
  9. package/dist/backends/fs.js +308 -0
  10. package/dist/backends/fs.js.map +1 -0
  11. package/dist/backends/interface.d.ts +42 -0
  12. package/dist/backends/interface.d.ts.map +1 -0
  13. package/dist/backends/interface.js +7 -0
  14. package/dist/backends/interface.js.map +1 -0
  15. package/dist/builder.d.ts +17 -0
  16. package/dist/builder.d.ts.map +1 -0
  17. package/dist/builder.js +205 -0
  18. package/dist/builder.js.map +1 -0
  19. package/dist/cli.d.ts +7 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +360 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/engine.d.ts +42 -0
  24. package/dist/engine.d.ts.map +1 -0
  25. package/dist/engine.js +595 -0
  26. package/dist/engine.js.map +1 -0
  27. package/dist/generate-schema.d.ts +12 -0
  28. package/dist/generate-schema.d.ts.map +1 -0
  29. package/dist/generate-schema.js +278 -0
  30. package/dist/generate-schema.js.map +1 -0
  31. package/dist/index.d.ts +27 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +30 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/loop-compiler.d.ts +37 -0
  36. package/dist/loop-compiler.d.ts.map +1 -0
  37. package/dist/loop-compiler.js +1232 -0
  38. package/dist/loop-compiler.js.map +1 -0
  39. package/dist/policy.d.ts +44 -0
  40. package/dist/policy.d.ts.map +1 -0
  41. package/dist/policy.js +111 -0
  42. package/dist/policy.js.map +1 -0
  43. package/dist/protocol.d.ts +167 -0
  44. package/dist/protocol.d.ts.map +1 -0
  45. package/dist/protocol.js +198 -0
  46. package/dist/protocol.js.map +1 -0
  47. package/dist/replay.d.ts +19 -0
  48. package/dist/replay.d.ts.map +1 -0
  49. package/dist/replay.js +198 -0
  50. package/dist/replay.js.map +1 -0
  51. package/dist/tests/adapter.test.d.ts +2 -0
  52. package/dist/tests/adapter.test.d.ts.map +1 -0
  53. package/dist/tests/adapter.test.js +104 -0
  54. package/dist/tests/adapter.test.js.map +1 -0
  55. package/dist/tests/builder.test.d.ts +2 -0
  56. package/dist/tests/builder.test.d.ts.map +1 -0
  57. package/dist/tests/builder.test.js +122 -0
  58. package/dist/tests/builder.test.js.map +1 -0
  59. package/dist/tests/engine.test.d.ts +2 -0
  60. package/dist/tests/engine.test.d.ts.map +1 -0
  61. package/dist/tests/engine.test.js +200 -0
  62. package/dist/tests/engine.test.js.map +1 -0
  63. package/dist/tests/generate-schema.test.d.ts +8 -0
  64. package/dist/tests/generate-schema.test.d.ts.map +1 -0
  65. package/dist/tests/generate-schema.test.js +196 -0
  66. package/dist/tests/generate-schema.test.js.map +1 -0
  67. package/dist/tests/loop-compiler.test.d.ts +2 -0
  68. package/dist/tests/loop-compiler.test.d.ts.map +1 -0
  69. package/dist/tests/loop-compiler.test.js +387 -0
  70. package/dist/tests/loop-compiler.test.js.map +1 -0
  71. package/dist/tests/policy.test.d.ts +2 -0
  72. package/dist/tests/policy.test.d.ts.map +1 -0
  73. package/dist/tests/policy.test.js +59 -0
  74. package/dist/tests/policy.test.js.map +1 -0
  75. package/dist/tests/protocol.test.d.ts +2 -0
  76. package/dist/tests/protocol.test.d.ts.map +1 -0
  77. package/dist/tests/protocol.test.js +63 -0
  78. package/dist/tests/protocol.test.js.map +1 -0
  79. package/dist/tests/replay.test.d.ts +2 -0
  80. package/dist/tests/replay.test.d.ts.map +1 -0
  81. package/dist/tests/replay.test.js +194 -0
  82. package/dist/tests/replay.test.js.map +1 -0
  83. package/loop_policy.json +44 -0
  84. package/package.json +58 -0
@@ -0,0 +1,308 @@
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, } 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
+ quality_score: metadata.quality_score,
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
+ quality_score: metadata.quality_score,
212
+ output_summary: metadata.output_summary,
213
+ constraint_violations: metadata.constraint_violations,
214
+ },
215
+ loop_id: loopId,
216
+ task: metadata.task,
217
+ output_summary: metadata.output_summary,
218
+ constraint_violations: metadata
219
+ .constraint_violations,
220
+ });
221
+ }
222
+ }
223
+ catch {
224
+ // Directory doesn't exist or can't be read
225
+ }
226
+ return entries;
227
+ }
228
+ // ═══════════════════════════════════════════════════════════════════════════
229
+ // FSBackend
230
+ // ═══════════════════════════════════════════════════════════════════════════
231
+ export class FSBackend {
232
+ vaultPath;
233
+ globalVaultPath;
234
+ constructor(vaultPath = ".promptcraft/prompt_vault.json", globalVaultPath = "~/.promptcraft/global_vault.json") {
235
+ this.vaultPath = vaultPath;
236
+ this.globalVaultPath = globalVaultPath;
237
+ }
238
+ // ── JSON vault ────────────────────────────────────────────────────────
239
+ readVault() {
240
+ const resolved = resolveVaultPath(this.vaultPath);
241
+ try {
242
+ const raw = readFileSync(resolved, "utf-8");
243
+ return JSON.parse(raw);
244
+ }
245
+ catch {
246
+ return { entries: [] };
247
+ }
248
+ }
249
+ writeVault(data) {
250
+ const resolved = resolveVaultPath(this.vaultPath);
251
+ mkdirSync(dirname(resolved), { recursive: true });
252
+ writeFileSync(resolved, JSON.stringify(data, null, 2), "utf-8");
253
+ }
254
+ // ── Entry queries ─────────────────────────────────────────────────────
255
+ queryEntries(opts) {
256
+ const vault = this.readVault();
257
+ const entries = vault.entries || [];
258
+ return entries.filter((entry) => {
259
+ const taskId = String(entry.task_id ?? "");
260
+ // Feedback-only filter
261
+ if (opts?.feedbackOnly && !taskId.endsWith(":feedback")) {
262
+ return false;
263
+ }
264
+ // Exclude feedback entries when not feedbackOnly
265
+ if (!opts?.feedbackOnly && taskId.endsWith(":feedback")) {
266
+ return false;
267
+ }
268
+ // Prefix filter
269
+ if (opts?.prefix && !taskId.startsWith(opts.prefix)) {
270
+ return false;
271
+ }
272
+ // Pattern filter (simple substring match)
273
+ if (opts?.taskIdPattern &&
274
+ !taskId.includes(opts.taskIdPattern)) {
275
+ return false;
276
+ }
277
+ return true;
278
+ });
279
+ }
280
+ appendEntry(entry) {
281
+ const vault = this.readVault();
282
+ const entries = vault.entries || [];
283
+ entries.push(entry);
284
+ vault.entries = entries;
285
+ this.writeVault(vault);
286
+ }
287
+ appendEntries(entries) {
288
+ if (entries.length === 0)
289
+ return 0;
290
+ const vault = this.readVault();
291
+ const existing = vault.entries || [];
292
+ vault.entries = [...existing, ...entries];
293
+ this.writeVault(vault);
294
+ return entries.length;
295
+ }
296
+ // ── Markdown lineage ──────────────────────────────────────────────────
297
+ writeLineageMd(loopId, roundNum, content, metadata) {
298
+ return writeLineageMd(loopId, roundNum, content, metadata, this.vaultPath);
299
+ }
300
+ readLineageMd(loopId, roundNum) {
301
+ const result = readLineageMd(loopId, roundNum, this.vaultPath);
302
+ return result?.full_prompt ?? null;
303
+ }
304
+ scanLineageMd(loopId) {
305
+ return scanLineageMd(loopId, this.vaultPath);
306
+ }
307
+ }
308
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/backends/fs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /** VaultBackend — storage abstraction interface.
2
+ *
3
+ * 9 methods that define the storage contract. All engine I/O goes through
4
+ * this interface — no direct filesystem access outside of backend implementations.
5
+ */
6
+ export interface VaultEntry {
7
+ id?: string;
8
+ task_id?: string;
9
+ version_tag?: string;
10
+ is_active?: boolean;
11
+ timestamp?: string;
12
+ user_intent?: string;
13
+ task_type?: string;
14
+ quality_score?: number;
15
+ skill_used?: string;
16
+ technique_used?: string;
17
+ loop_id?: string;
18
+ loop_lineage?: Record<string, unknown>;
19
+ loop_objective?: Record<string, unknown> | null;
20
+ execution_feedback?: string;
21
+ task?: string;
22
+ output_summary?: string;
23
+ constraint_violations?: string[];
24
+ tags?: string[];
25
+ full_prompt?: string;
26
+ [key: string]: unknown;
27
+ }
28
+ export interface VaultBackend {
29
+ readVault(): Record<string, unknown>;
30
+ writeVault(data: Record<string, unknown>): void;
31
+ queryEntries(opts?: {
32
+ prefix?: string;
33
+ taskIdPattern?: string;
34
+ feedbackOnly?: boolean;
35
+ }): VaultEntry[];
36
+ appendEntry(entry: VaultEntry): void;
37
+ appendEntries(entries: VaultEntry[]): number;
38
+ writeLineageMd(loopId: string, roundNum: number, content: string, metadata: Record<string, unknown>): string | null;
39
+ readLineageMd(loopId: string, roundNum: number): string | null;
40
+ scanLineageMd(loopId: string): VaultEntry[];
41
+ }
42
+ //# sourceMappingURL=interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/backends/interface.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,UAAU;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAE3B,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAGhD,YAAY,CAAC,IAAI,CAAC,EAAE;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,GAAG,UAAU,EAAE,CAAC;IAEjB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACrC,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAG7C,cAAc,CACZ,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,MAAM,GAAG,IAAI,CAAC;IAEjB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/D,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE,CAAC;CAC7C"}
@@ -0,0 +1,7 @@
1
+ /** VaultBackend — storage abstraction interface.
2
+ *
3
+ * 9 methods that define the storage contract. All engine I/O goes through
4
+ * this interface — no direct filesystem access outside of backend implementations.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/backends/interface.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,17 @@
1
+ /** LoopForge Agent — Technique router + quality scoring.
2
+ *
3
+ * Two pure-function responsibilities:
4
+ * 1. Technique selection — keyword heuristic, fast + zero-cost
5
+ * 2. Quality scoring — deterministic 1-5 from feedback signals
6
+ */
7
+ import { type Analysis } from "./protocol.js";
8
+ export declare const TECHNIQUE_REFERENCE: Record<string, string>;
9
+ export declare function routeTechnique(task: string): Analysis;
10
+ export declare function scoreQuality(feedback: {
11
+ success: boolean;
12
+ constraint_violations?: unknown[];
13
+ manual_fixes_needed?: string;
14
+ } | null): number;
15
+ export declare function routeTechniqueAdaptive(task: string, vaultContext?: Record<string, unknown> | null, loopId?: string): Analysis;
16
+ export declare function extractGlobalConstraints(hydrateResults: Record<string, unknown> | null): string[];
17
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,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;AAMD,wBAAgB,YAAY,CAC1B,QAAQ,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,qBAAqB,CAAC,EAAE,OAAO,EAAE,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GACrG,MAAM,CAYR;AA4CD,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,YAAY,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAW,EACnD,MAAM,SAAK,GACV,QAAQ,CAqCV;AAMD,wBAAgB,wBAAwB,CACtC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAC7C,MAAM,EAAE,CAeV"}
@@ -0,0 +1,205 @@
1
+ /** LoopForge Agent — Technique router + quality scoring.
2
+ *
3
+ * Two pure-function responsibilities:
4
+ * 1. Technique selection — keyword heuristic, fast + zero-cost
5
+ * 2. Quality scoring — deterministic 1-5 from feedback signals
6
+ */
7
+ import { getPolicy } from "./policy.js";
8
+ import { makeAnalysis, Technique, } from "./protocol.js";
9
+ // ═══════════════════════════════════════════════════════════════════════════
10
+ // Routing table
11
+ // ═══════════════════════════════════════════════════════════════════════════
12
+ const ROUTING_TABLE = {
13
+ continuous_low: Technique.ZERO_SHOT,
14
+ independent_low: Technique.ZERO_SHOT,
15
+ continuous_medium: Technique.FEW_SHOT,
16
+ independent_medium: Technique.ZERO_SHOT_COT,
17
+ continuous_high: Technique.FEW_SHOT_COT,
18
+ independent_high: Technique.TREE_OF_THOUGHT,
19
+ };
20
+ const RATIONALE = {
21
+ [Technique.ZERO_SHOT]: "Low load — direct instruction suffices.",
22
+ [Technique.FEW_SHOT]: "Fixed I/O pattern expected — examples anchor output format.",
23
+ [Technique.ZERO_SHOT_COT]: "Multi-step reasoning needed, no examples provided.",
24
+ [Technique.FEW_SHOT_COT]: "Complex reasoning with provided examples — relay pattern.",
25
+ [Technique.STEP_BACK]: "Vague or legacy — abstract to principles first.",
26
+ [Technique.LEAST_TO_MOST]: "Decomposable into ordered subproblems.",
27
+ [Technique.TREE_OF_THOUGHT]: "High risk, multi-path — explore + evaluate + prune.",
28
+ };
29
+ export const TECHNIQUE_REFERENCE = {
30
+ "zero-shot": "skills/prompt-techniques/references/zero-shot.md",
31
+ "few-shot": "skills/prompt-techniques/references/few-shot.md",
32
+ "zero-shot-cot": "skills/prompt-techniques/references/chain-of-thought.md",
33
+ "few-shot-cot": "skills/prompt-techniques/references/chain-of-thought.md",
34
+ "step-back": "skills/prompt-techniques/references/step-back.md",
35
+ "least-to-most": "skills/prompt-techniques/references/least-to-most.md",
36
+ "tree-of-thought": "skills/prompt-techniques/references/tree-of-thought.md",
37
+ };
38
+ // Keyword sets for heuristic classification
39
+ const HIGH_LOAD_WORDS = new Set([
40
+ "security", "audit", "crypto", "encrypt", "concurrent",
41
+ "thread", "transaction", "rollback", "compile", "protocol",
42
+ "安全", "审计", "加密", "并发", "签名", "校验", "默克尔",
43
+ "assembly", "重放攻击", "共识", "虚拟机", "字节码",
44
+ ]);
45
+ const LOW_LOAD_WORDS = new Set([
46
+ "rename", "format", "comment", "config", "readme", "simple", "basic",
47
+ ]);
48
+ const CONTINUOUS_WORDS = new Set([
49
+ "fix", "modify", "update", "change", "refactor", "extend",
50
+ "add", "improve", "debug",
51
+ ]);
52
+ // v1.1: Keywords that trigger specialist techniques (override routing table)
53
+ const STEP_BACK_WORDS = new Set([
54
+ "重构", "排查", "legacy", "原则", "抽象", "根本原因", "root cause",
55
+ "报错", "逻辑混乱", "含糊", "vague", "审计方法", "底层",
56
+ ]);
57
+ const LEAST_TO_MOST_WORDS = new Set([
58
+ "逐步", "搭建", "实现系统", "build system", "pipeline", "编译器",
59
+ "逐步求解", "有序", "从简单到复杂", "数据采集", "完整模块",
60
+ "多步骤", "部署流程", "子问题",
61
+ ]);
62
+ // ═══════════════════════════════════════════════════════════════════════════
63
+ // Keyword heuristic router
64
+ // ═══════════════════════════════════════════════════════════════════════════
65
+ export function routeTechnique(task) {
66
+ const taskLower = task.toLowerCase();
67
+ // Independence — check if any continuous word appears in task
68
+ const continuous = [...CONTINUOUS_WORDS].some((w) => taskLower.includes(w));
69
+ const independence = continuous ? "continuous" : "independent";
70
+ // Cognitive load — check keyword presence
71
+ let load;
72
+ if ([...HIGH_LOAD_WORDS].some((w) => taskLower.includes(w))) {
73
+ load = "high";
74
+ }
75
+ else if ([...LOW_LOAD_WORDS].some((w) => taskLower.includes(w))) {
76
+ load = "low";
77
+ }
78
+ else {
79
+ load = task.split(/\s+/).length > 8 ? "medium" : "low";
80
+ }
81
+ let technique = ROUTING_TABLE[`${independence}_${load}`] ?? Technique.ZERO_SHOT;
82
+ // v1.1: Keyword overrides for specialist techniques
83
+ if ([...STEP_BACK_WORDS].some((w) => taskLower.includes(w))) {
84
+ technique = Technique.STEP_BACK;
85
+ load = "high";
86
+ }
87
+ else if ([...LEAST_TO_MOST_WORDS].some((w) => taskLower.includes(w))) {
88
+ technique = Technique.LEAST_TO_MOST;
89
+ load = "high";
90
+ }
91
+ return makeAnalysis({
92
+ technique: technique,
93
+ rationale: RATIONALE[technique] ?? "Default route.",
94
+ independence,
95
+ cognitive_load: load,
96
+ reference_file: TECHNIQUE_REFERENCE[technique] ?? "",
97
+ });
98
+ }
99
+ // ═══════════════════════════════════════════════════════════════════════════
100
+ // Quality scoring
101
+ // ═══════════════════════════════════════════════════════════════════════════
102
+ export function scoreQuality(feedback) {
103
+ if (feedback === null)
104
+ return 0;
105
+ const success = feedback.success;
106
+ const violations = feedback.constraint_violations ?? [];
107
+ const fixes = feedback.manual_fixes_needed ?? "";
108
+ if (success && violations.length === 0 && !fixes)
109
+ return 5;
110
+ if (success && violations.length === 0)
111
+ return 4;
112
+ if (success)
113
+ return 3;
114
+ if (violations.length > 0)
115
+ return 2;
116
+ return 1;
117
+ }
118
+ // ═══════════════════════════════════════════════════════════════════════════
119
+ // Adaptive routing (v3.5)
120
+ // ═══════════════════════════════════════════════════════════════════════════
121
+ function countConsecutiveLowQuality(technique, loopId, vaultContext) {
122
+ if (vaultContext === null)
123
+ return 0;
124
+ const results = vaultContext.results || [];
125
+ if (!results.length)
126
+ return 0;
127
+ const policy = getPolicy();
128
+ const threshold = policy.technique.adaptive_quality_threshold;
129
+ // Filter to this loop, sort by round descending
130
+ const rounds = [];
131
+ for (const r of results) {
132
+ const lineage = (r.loop_lineage || r.lineage || {});
133
+ if (lineage.loop_id !== loopId)
134
+ continue;
135
+ rounds.push({
136
+ round: lineage.round ?? 0,
137
+ quality_score: r.quality_score ?? lineage.quality_score ?? 0,
138
+ technique_used: r.technique_used ?? r.skill_used ?? "",
139
+ });
140
+ }
141
+ rounds.sort((a, b) => b.round - a.round);
142
+ let count = 0;
143
+ for (const rnd of rounds) {
144
+ if (rnd.technique_used && rnd.technique_used !== technique)
145
+ break;
146
+ if (rnd.quality_score > 0 && rnd.quality_score < threshold) {
147
+ count++;
148
+ }
149
+ else {
150
+ break;
151
+ }
152
+ }
153
+ return count;
154
+ }
155
+ export function routeTechniqueAdaptive(task, vaultContext = null, loopId = "") {
156
+ // Step 1: Keyword heuristic (always)
157
+ const analysis = routeTechnique(task);
158
+ if (!vaultContext || !loopId)
159
+ return analysis;
160
+ // Step 2: Check if current technique needs rotation
161
+ const technique = analysis.technique;
162
+ const policy = getPolicy();
163
+ const lowCount = countConsecutiveLowQuality(technique, loopId, vaultContext);
164
+ if (lowCount < policy.technique.adaptive_consecutive_rounds) {
165
+ return analysis;
166
+ }
167
+ // Step 3: Rotate
168
+ const fallback = policy.technique.fallback_chain[technique] ?? technique;
169
+ if (fallback === technique)
170
+ return analysis; // Already at ceiling
171
+ const originalTechnique = technique;
172
+ const originalRationale = analysis.rationale;
173
+ return makeAnalysis({
174
+ technique: fallback,
175
+ rationale: `${originalRationale} [ROTATED: ${originalTechnique} → ${fallback} — ` +
176
+ `${lowCount} consecutive low-quality rounds (score < ${policy.technique.adaptive_quality_threshold})]`,
177
+ independence: analysis.independence,
178
+ cognitive_load: fallback === "tree-of-thought" || fallback === "few-shot-cot"
179
+ ? "high"
180
+ : fallback === "zero-shot-cot" || fallback === "least-to-most"
181
+ ? "medium"
182
+ : analysis.cognitive_load,
183
+ reference_file: TECHNIQUE_REFERENCE[fallback] ?? analysis.reference_file,
184
+ was_rotated: true,
185
+ });
186
+ }
187
+ // ═══════════════════════════════════════════════════════════════════════════
188
+ // Global constraints extraction
189
+ // ═══════════════════════════════════════════════════════════════════════════
190
+ export function extractGlobalConstraints(hydrateResults) {
191
+ const constraints = [];
192
+ if (!hydrateResults)
193
+ return constraints;
194
+ const globalEntries = hydrateResults.global_entries || [];
195
+ for (const entry of globalEntries) {
196
+ const added = entry.hard_constraints_added || [];
197
+ for (const c of added) {
198
+ if (!constraints.includes(c)) {
199
+ constraints.push(c);
200
+ }
201
+ }
202
+ }
203
+ return constraints;
204
+ }
205
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /** LoopForge CLI — command-line interface for the loop compiler.
3
+ *
4
+ * v1.0 — npm install loopforge
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;GAGG"}