goalforge-claude 1.0.0 → 1.1.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 (51) hide show
  1. package/README.md +14 -6
  2. package/dist/components/claude-cli.d.ts +3 -3
  3. package/dist/components/claude-cli.d.ts.map +1 -1
  4. package/dist/components/claude-cli.js +171 -16
  5. package/dist/components/claude-cli.js.map +1 -1
  6. package/dist/components/cost-optimizer.d.ts +1 -1
  7. package/dist/components/cost-optimizer.d.ts.map +1 -1
  8. package/dist/components/cost-optimizer.js +10 -5
  9. package/dist/components/cost-optimizer.js.map +1 -1
  10. package/dist/components/executor.d.ts +10 -1
  11. package/dist/components/executor.d.ts.map +1 -1
  12. package/dist/components/executor.js +135 -29
  13. package/dist/components/executor.js.map +1 -1
  14. package/dist/components/interactive.d.ts +32 -0
  15. package/dist/components/interactive.d.ts.map +1 -0
  16. package/dist/components/interactive.js +149 -0
  17. package/dist/components/interactive.js.map +1 -0
  18. package/dist/components/planner.d.ts +2 -1
  19. package/dist/components/planner.d.ts.map +1 -1
  20. package/dist/components/planner.js +62 -7
  21. package/dist/components/planner.js.map +1 -1
  22. package/dist/components/reviewer.d.ts +2 -1
  23. package/dist/components/reviewer.d.ts.map +1 -1
  24. package/dist/components/reviewer.js +76 -20
  25. package/dist/components/reviewer.js.map +1 -1
  26. package/dist/components/task-queue.d.ts.map +1 -1
  27. package/dist/components/task-queue.js +30 -1
  28. package/dist/components/task-queue.js.map +1 -1
  29. package/dist/components/test-runner.d.ts.map +1 -1
  30. package/dist/components/test-runner.js +10 -9
  31. package/dist/components/test-runner.js.map +1 -1
  32. package/dist/core/config.d.ts.map +1 -1
  33. package/dist/core/config.js +4 -3
  34. package/dist/core/config.js.map +1 -1
  35. package/dist/core/logger.d.ts +5 -4
  36. package/dist/core/logger.d.ts.map +1 -1
  37. package/dist/core/logger.js +98 -45
  38. package/dist/core/logger.js.map +1 -1
  39. package/dist/core/status-bar.d.ts +27 -0
  40. package/dist/core/status-bar.d.ts.map +1 -0
  41. package/dist/core/status-bar.js +192 -0
  42. package/dist/core/status-bar.js.map +1 -0
  43. package/dist/core/types.d.ts +2 -1
  44. package/dist/core/types.d.ts.map +1 -1
  45. package/dist/index.js +489 -45
  46. package/dist/index.js.map +1 -1
  47. package/dist/loop-controller.d.ts +4 -1
  48. package/dist/loop-controller.d.ts.map +1 -1
  49. package/dist/loop-controller.js +191 -55
  50. package/dist/loop-controller.js.map +1 -1
  51. package/package.json +1 -1
package/README.md CHANGED
@@ -206,7 +206,7 @@ memory/
206
206
 
207
207
  ```
208
208
  <project-root>/
209
- engine/
209
+ .goalforge/
210
210
  memory/
211
211
  state/project.json
212
212
  tasks/
@@ -214,11 +214,13 @@ memory/
214
214
  decisions/
215
215
  files/
216
216
  cache/
217
- workspace/ ← generated code lives here
217
+ <your generated code lives directly here, at the project root>
218
218
  ```
219
219
 
220
220
  Paths are configured via `workspaceDir` and `memoryDir` in `LoopConfig`. Tests write to isolated temp directories and clean up in `beforeEach` and `afterAll`.
221
221
 
222
+ > **Note**: `.goalforge` is automatically added to `.gitignore` on first run.
223
+
222
224
  ---
223
225
 
224
226
  ## Exit Conditions
@@ -231,6 +233,8 @@ The loop exits (returning a `LoopExitReason`) when the first of these is true:
231
233
  | `all-tasks-complete` | Queue is complete (all COMPLETE/FAILED) AND at least one task was completed |
232
234
  | `cost-exceeded` | `totalSpendUsd >= maxCostUsd` (checked after execute phase and after cost phase) |
233
235
  | `max-iterations` | Loop counter reaches `maxIterations` |
236
+ | `user-quit` | User typed `quit` at the interactive pause or finish prompt |
237
+ | `user-redo` | User typed `redo` at the interactive pause or finish prompt; the outer `main()` loop restarts with an updated goal |
234
238
 
235
239
  ---
236
240
 
@@ -282,14 +286,18 @@ npm run build
282
286
  # Dry run (no Claude calls, no file writes)
283
287
  DRY_RUN=true npm start
284
288
 
285
- # Real run with a custom goal
286
- GOAL="Build a REST API for user authentication" npm start
289
+ # Real run run from your project directory, files land in place
290
+ cd ~/my-project
291
+ GOAL="Build a REST API for user authentication" goalforge "Build a REST API for user authentication"
287
292
 
288
293
  # Override budget and iteration limit
289
- GOAL="..." MAX_COST_USD=5 MAX_ITERATIONS=10 npm start
294
+ goalforge --iter 10 --cost 5 "Build a REST API for user authentication"
295
+
296
+ # Resume an interrupted run
297
+ goalforge resume
290
298
  ```
291
299
 
292
- Generated code is written to `../workspace/` (sibling of the `engine/` directory).
300
+ Generated code is written into `process.cwd()` the directory you run the command from. Persistent state is stored in `.goalforge/memory/` inside the same directory.
293
301
 
294
302
  ---
295
303
 
@@ -6,9 +6,9 @@ export interface CliResult {
6
6
  * Call Claude via the `claude` CLI (uses Claude.ai subscription auth —
7
7
  * no ANTHROPIC_API_KEY required).
8
8
  *
9
- * Spawns: claude -p --output-format json --dangerously-skip-permissions
10
- * Sends the combined system+user prompt via stdin.
11
- * Returns the result text and reported cost.
9
+ * Spawns: claude -p --output-format stream-json --dangerously-skip-permissions
10
+ * Streams NDJSON events so the user sees Claude's response as it generates.
11
+ * Returns the result text and reported cost from the final `result` event.
12
12
  */
13
13
  export declare function callClaude(systemPrompt: string, userPrompt: string, timeoutMs?: number): Promise<CliResult>;
14
14
  //# sourceMappingURL=claude-cli.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude-cli.d.ts","sourceRoot":"","sources":["../../src/components/claude-cli.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC9B,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,SAAS,SAAU,GAClB,OAAO,CAAC,SAAS,CAAC,CA8CpB"}
1
+ {"version":3,"file":"claude-cli.d.ts","sourceRoot":"","sources":["../../src/components/claude-cli.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAKD;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC9B,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,SAAS,SAAmD,GAC3D,OAAO,CAAC,SAAS,CAAC,CAyJpB"}
@@ -1,22 +1,149 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.callClaude = callClaude;
4
37
  const child_process_1 = require("child_process");
38
+ const logger_1 = require("../core/logger");
39
+ const StatusBar = __importStar(require("../core/status-bar"));
40
+ const log = (0, logger_1.createLogger)('ClaudeCLI');
41
+ // Max chars of Claude's streaming response to echo to the terminal.
42
+ const STREAM_PREVIEW_LIMIT = 500;
43
+ const DIM = '\x1b[2m';
44
+ const R = '\x1b[0m';
45
+ const CYAN = '\x1b[36m';
46
+ const BOLD = '\x1b[1m';
47
+ const SYS_PREVIEW_CHARS = 120;
48
+ const USER_PREVIEW_CHARS = 400;
49
+ function logPromptToTUI(systemPrompt, userPrompt, taskId) {
50
+ const label = taskId ? ` ${DIM}[${taskId}]${R}` : '';
51
+ const sysLine = systemPrompt.slice(0, SYS_PREVIEW_CHARS).replace(/\n/g, ' ').trim()
52
+ + (systemPrompt.length > SYS_PREVIEW_CHARS ? '…' : '');
53
+ const userLine = userPrompt.slice(0, USER_PREVIEW_CHARS).replace(/\n/g, '↵').trim()
54
+ + (userPrompt.length > USER_PREVIEW_CHARS ? '…' : '');
55
+ StatusBar.wrapLog(() => {
56
+ process.stdout.write(`${CYAN}${BOLD}⟡ Claude prompt${R}${label}\n`
57
+ + ` ${DIM}sys: ${sysLine}${R}\n`
58
+ + ` ${DIM}usr: ${userLine}${R}\n`);
59
+ });
60
+ }
5
61
  /**
6
62
  * Call Claude via the `claude` CLI (uses Claude.ai subscription auth —
7
63
  * no ANTHROPIC_API_KEY required).
8
64
  *
9
- * Spawns: claude -p --output-format json --dangerously-skip-permissions
10
- * Sends the combined system+user prompt via stdin.
11
- * Returns the result text and reported cost.
65
+ * Spawns: claude -p --output-format stream-json --dangerously-skip-permissions
66
+ * Streams NDJSON events so the user sees Claude's response as it generates.
67
+ * Returns the result text and reported cost from the final `result` event.
12
68
  */
13
- async function callClaude(systemPrompt, userPrompt, timeoutMs = 180000) {
69
+ async function callClaude(systemPrompt, userPrompt, timeoutMs = Number(process.env.CLAUDE_TIMEOUT_MS ?? 600000), taskId // when set, streaming goes to the task panel instead of stdout
70
+ ) {
14
71
  const fullPrompt = `${systemPrompt}\n\n---\n\n${userPrompt}`;
72
+ const debug = process.env.GOALFORGE_DEBUG === 'true';
73
+ // Always log prompts to TUI so the user can see what is being sent to Claude.
74
+ logPromptToTUI(systemPrompt, userPrompt, taskId);
75
+ if (debug) {
76
+ log.debug('Claude call starting', {
77
+ promptChars: fullPrompt.length,
78
+ timeoutMs,
79
+ });
80
+ }
15
81
  return new Promise((resolve, reject) => {
16
- const child = (0, child_process_1.spawn)('claude', ['-p', '--output-format', 'json', '--dangerously-skip-permissions'], { stdio: ['pipe', 'pipe', 'pipe'] });
17
- let stdout = '';
82
+ const child = (0, child_process_1.spawn)('claude', ['-p', '--output-format', 'stream-json', '--verbose', '--dangerously-skip-permissions'], { stdio: ['pipe', 'pipe', 'pipe'] });
83
+ // Track streaming state
84
+ let lastTextLength = 0; // for cumulative assistant events (delta = text.slice(lastTextLength))
85
+ let shownChars = 0;
86
+ let streamStarted = false;
87
+ let resultEvent = null;
18
88
  let stderr = '';
19
- child.stdout.on('data', (chunk) => { stdout += chunk.toString(); });
89
+ let lineBuffer = '';
90
+ // Heartbeat: redraw status bar every 5 s so the elapsed timer stays live.
91
+ const heartbeat = setInterval(() => StatusBar.update({}), 5000);
92
+ const processLine = (line) => {
93
+ if (!line.trim())
94
+ return;
95
+ let event;
96
+ try {
97
+ event = JSON.parse(line);
98
+ }
99
+ catch {
100
+ return; // non-JSON line (rare); ignore
101
+ }
102
+ if (event.type === 'assistant') {
103
+ const msg = event.message;
104
+ const content = (msg?.content ?? []);
105
+ for (const block of content) {
106
+ if (block.type !== 'text' || !block.text)
107
+ continue;
108
+ const newChars = block.text.length > lastTextLength
109
+ ? block.text.slice(lastTextLength) // cumulative mode
110
+ : block.text; // incremental mode
111
+ lastTextLength = Math.max(lastTextLength, block.text.length);
112
+ if (!newChars)
113
+ continue;
114
+ if (taskId) {
115
+ // Route to task panel row — no char limit, panel truncates visually.
116
+ StatusBar.streamTask(taskId, newChars);
117
+ }
118
+ else {
119
+ // Legacy: stream directly to stdout up to STREAM_PREVIEW_LIMIT.
120
+ if (shownChars >= STREAM_PREVIEW_LIMIT)
121
+ continue;
122
+ const toShow = newChars.slice(0, STREAM_PREVIEW_LIMIT - shownChars);
123
+ if (!toShow)
124
+ continue;
125
+ if (!streamStarted) {
126
+ streamStarted = true;
127
+ StatusBar.wrapLog(() => process.stdout.write('\n'));
128
+ }
129
+ StatusBar.wrapLog(() => process.stdout.write(toShow));
130
+ shownChars += toShow.length;
131
+ if (shownChars >= STREAM_PREVIEW_LIMIT) {
132
+ StatusBar.wrapLog(() => process.stdout.write('…\n'));
133
+ }
134
+ }
135
+ }
136
+ }
137
+ else if (event.type === 'result') {
138
+ resultEvent = event;
139
+ }
140
+ };
141
+ child.stdout.on('data', (chunk) => {
142
+ lineBuffer += chunk.toString();
143
+ const lines = lineBuffer.split('\n');
144
+ lineBuffer = lines.pop() ?? '';
145
+ lines.forEach(processLine);
146
+ });
20
147
  child.stderr.on('data', (chunk) => { stderr += chunk.toString(); });
21
148
  const timer = setTimeout(() => {
22
149
  child.kill('SIGTERM');
@@ -24,23 +151,51 @@ async function callClaude(systemPrompt, userPrompt, timeoutMs = 180000) {
24
151
  }, timeoutMs);
25
152
  child.on('close', (code) => {
26
153
  clearTimeout(timer);
154
+ clearInterval(heartbeat);
155
+ // Flush any remaining partial line
156
+ if (lineBuffer.trim())
157
+ processLine(lineBuffer);
158
+ // Ensure direct-stdout streaming ends on a clean line (task panel handles its own layout).
159
+ if (!taskId && streamStarted && shownChars < STREAM_PREVIEW_LIMIT) {
160
+ StatusBar.wrapLog(() => process.stdout.write('\n'));
161
+ }
162
+ if (debug) {
163
+ log.debug('Claude call finished', {
164
+ exitCode: code,
165
+ resultChars: typeof resultEvent?.result === 'string' ? resultEvent.result.length : 0,
166
+ costUsd: resultEvent?.total_cost_usd,
167
+ });
168
+ }
169
+ // Use the result event as the authoritative source of truth.
170
+ const res = resultEvent;
27
171
  if (code !== 0) {
28
- reject(new Error(`claude exited ${code}: ${stderr.slice(0, 500)}`));
172
+ const message = (typeof res?.result === 'string' && res.result.trim())
173
+ ? res.result.trim()
174
+ : (stderr.trim() || '(no output captured)');
175
+ reject(new Error(`claude exited ${code}: ${message.slice(0, 500)}`));
29
176
  return;
30
177
  }
31
- try {
32
- const envelope = JSON.parse(stdout.trim());
33
- resolve({
34
- text: envelope.result ?? '',
35
- costUsd: typeof envelope.total_cost_usd === 'number' ? envelope.total_cost_usd : 0,
36
- });
178
+ if (!res) {
179
+ reject(new Error(`claude produced no result event. stderr: ${stderr.slice(0, 300)}`));
180
+ return;
181
+ }
182
+ if (res.is_error === true) {
183
+ const msg = typeof res.result === 'string' ? res.result.trim() : 'unknown error';
184
+ reject(new Error(`claude returned an error: ${msg}`));
185
+ return;
37
186
  }
38
- catch (err) {
39
- reject(new Error(`Failed to parse claude CLI output: ${err}. stdout: ${stdout.slice(0, 300)}`));
187
+ const costUsd = typeof res.total_cost_usd === 'number' ? res.total_cost_usd : 0;
188
+ if (typeof res.total_cost_usd !== 'number') {
189
+ log.warn('total_cost_usd missing — cost tracking may be inaccurate (subscription billing)');
40
190
  }
191
+ resolve({
192
+ text: typeof res.result === 'string' ? res.result : '',
193
+ costUsd,
194
+ });
41
195
  });
42
196
  child.on('error', (err) => {
43
197
  clearTimeout(timer);
198
+ clearInterval(heartbeat);
44
199
  reject(new Error(`Failed to spawn claude CLI: ${err.message}. Is claude installed and on PATH?`));
45
200
  });
46
201
  child.stdin.write(fullPrompt);
@@ -1 +1 @@
1
- {"version":3,"file":"claude-cli.js","sourceRoot":"","sources":["../../src/components/claude-cli.ts"],"names":[],"mappings":";;AAeA,gCAkDC;AAjED,iDAAsC;AAOtC;;;;;;;GAOG;AACI,KAAK,UAAU,UAAU,CAC9B,YAAoB,EACpB,UAAkB,EAClB,SAAS,GAAG,MAAO;IAEnB,MAAM,UAAU,GAAG,GAAG,YAAY,cAAc,UAAU,EAAE,CAAC;IAE7D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,IAAA,qBAAK,EACjB,QAAQ,EACR,CAAC,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,gCAAgC,CAAC,EACnE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CACpC,CAAC;QAEF,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5E,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtB,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,SAAS,IAAI,CAAC,CAAC,CAAC;QACjE,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBACpE,OAAO;YACT,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC3C,OAAO,CAAC;oBACN,IAAI,EAAE,QAAQ,CAAC,MAAM,IAAI,EAAE;oBAC3B,OAAO,EAAE,OAAO,QAAQ,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;iBACnF,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,KAAK,CAAC,sCAAsC,GAAG,aAAa,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAClG,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,GAAG,CAAC,OAAO,oCAAoC,CAAC,CAAC,CAAC;QACpG,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC9B,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"claude-cli.js","sourceRoot":"","sources":["../../src/components/claude-cli.ts"],"names":[],"mappings":"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"}
@@ -38,6 +38,6 @@ export declare class CostOptimizer {
38
38
  cacheEntries: number;
39
39
  };
40
40
  /** Sync cumulative totals from a ProjectState so they survive process restarts. */
41
- restoreFromState(inputTokens: number, outputTokens: number): void;
41
+ restoreFromState(inputTokens: number, outputTokens: number, directCostUsd?: number): void;
42
42
  }
43
43
  //# sourceMappingURL=cost-optimizer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cost-optimizer.d.ts","sourceRoot":"","sources":["../../src/components/cost-optimizer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAErE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C;;;GAGG;AACH,qBAAa,aAAa;IAQtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IARzB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAiC;gBAGlC,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,WAAW;IAKtC,sEAAsE;IACtE,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM;IAKhE,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQlD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAM3D;;;;OAIG;IACH,QAAQ,CACN,UAAU,EAAE,MAAM,EAClB,qBAAqB,EAAE,MAAM,EAC7B,QAAQ,EAAE,MAAM,GACf,YAAY;IA2Df,6EAA6E;IAC7E,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAYpC,8EAA8E;IAC9E,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAY7B,UAAU,IAAI,MAAM;IAIpB,gBAAgB,IAAI,OAAO;IAI3B,QAAQ,IAAI;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,EAAE,MAAM,CAAC;QACzB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC;QACtB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,YAAY,EAAE,MAAM,CAAC;KACtB;IAYD,mFAAmF;IACnF,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;CAIlE"}
1
+ {"version":3,"file":"cost-optimizer.d.ts","sourceRoot":"","sources":["../../src/components/cost-optimizer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAErE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C;;;GAGG;AACH,qBAAa,aAAa;IAQtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IARzB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAiC;gBAGlC,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,WAAW;IAKtC,sEAAsE;IACtE,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM;IAKhE,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQlD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAS3D;;;;OAIG;IACH,QAAQ,CACN,UAAU,EAAE,MAAM,EAClB,qBAAqB,EAAE,MAAM,EAC7B,QAAQ,EAAE,MAAM,GACf,YAAY;IA2Df,6EAA6E;IAC7E,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAYpC,8EAA8E;IAC9E,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAY7B,UAAU,IAAI,MAAM;IAIpB,gBAAgB,IAAI,OAAO;IAI3B,QAAQ,IAAI;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,EAAE,MAAM,CAAC;QACzB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC;QACtB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,YAAY,EAAE,MAAM,CAAC;KACtB;IAYD,mFAAmF;IACnF,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,SAAI,GAAG,IAAI;CAKrF"}
@@ -26,13 +26,17 @@ class CostOptimizer {
26
26
  }
27
27
  getCachedResponse(cacheKey) {
28
28
  const hit = this.memory.getCached(cacheKey);
29
- if (hit) {
30
- this.log.debug('Cache hit', { cacheKey: cacheKey.slice(0, 8) + '' });
31
- }
29
+ // Treat entries that contain no JSON object as stale/corrupt cache misses.
30
+ if (!hit || !hit.includes('{'))
31
+ return null;
32
+ this.log.debug('Cache hit', { cacheKey: cacheKey.slice(0, 8) + '…' });
32
33
  return hit;
33
34
  }
34
35
  putCachedResponse(cacheKey, response) {
35
- this.memory.putCache(cacheKey, response);
36
+ // Only cache responses that actually contain a JSON object.
37
+ if (response && response.includes('{')) {
38
+ this.memory.putCache(cacheKey, response);
39
+ }
36
40
  }
37
41
  // ── Budget ─────────────────────────────────────────────────────────────────
38
42
  /**
@@ -131,9 +135,10 @@ class CostOptimizer {
131
135
  };
132
136
  }
133
137
  /** Sync cumulative totals from a ProjectState so they survive process restarts. */
134
- restoreFromState(inputTokens, outputTokens) {
138
+ restoreFromState(inputTokens, outputTokens, directCostUsd = 0) {
135
139
  this.totalInputTokens = inputTokens;
136
140
  this.totalOutputTokens = outputTokens;
141
+ this.directCostUsd = directCostUsd;
137
142
  }
138
143
  }
139
144
  exports.CostOptimizer = CostOptimizer;
@@ -1 +1 @@
1
- {"version":3,"file":"cost-optimizer.js","sourceRoot":"","sources":["../../src/components/cost-optimizer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cost-optimizer.js","sourceRoot":"","sources":["../../src/components/cost-optimizer.ts"],"names":[],"mappings":"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"}
@@ -6,13 +6,22 @@ export declare class Executor {
6
6
  private readonly optimizer;
7
7
  private readonly memory;
8
8
  private readonly dryRun;
9
+ private readonly timeoutMs;
9
10
  private readonly log;
10
- constructor(workspaceDir: string, optimizer: CostOptimizer, memory: MemoryStore, dryRun?: boolean);
11
+ constructor(workspaceDir: string, optimizer: CostOptimizer, memory: MemoryStore, dryRun?: boolean, timeoutMs?: number);
11
12
  execute(task: Task): Promise<TaskResult>;
12
13
  private buildContext;
13
14
  private callApi;
14
15
  private parse;
15
16
  private apply;
17
+ /**
18
+ * Analyse why a task failed and return a revised objective.
19
+ * Called before retry so the next attempt has a better goal.
20
+ */
21
+ repair(task: Task, error: string): Promise<{
22
+ rootCause: string;
23
+ revisedObjective: string | null;
24
+ }>;
16
25
  private dryRunResponse;
17
26
  }
18
27
  //# sourceMappingURL=executor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/components/executor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAiC7C,qBAAa,QAAQ;IAIjB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IANzB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA4B;gBAG7B,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,aAAa,EACxB,MAAM,EAAE,WAAW,EACnB,MAAM,UAAQ;IAK3B,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC;IA0C9C,OAAO,CAAC,YAAY;YAuBN,OAAO;IASrB,OAAO,CAAC,KAAK;YAKC,KAAK;IA0CnB,OAAO,CAAC,cAAc;CAavB"}
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/components/executor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAkC7C,qBAAa,QAAQ;IAIjB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAP5B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA4B;gBAG7B,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,aAAa,EACxB,MAAM,EAAE,WAAW,EACnB,MAAM,UAAQ,EACd,SAAS,SAAU;IAKhC,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC;IA0C9C,OAAO,CAAC,YAAY;YAuBN,OAAO;IAarB,OAAO,CAAC,KAAK;YAmBC,KAAK;IAkDnB;;;OAGG;IACG,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IA8CxG,OAAO,CAAC,cAAc;CAavB"}