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.
- package/README.md +14 -6
- package/dist/components/claude-cli.d.ts +3 -3
- package/dist/components/claude-cli.d.ts.map +1 -1
- package/dist/components/claude-cli.js +171 -16
- package/dist/components/claude-cli.js.map +1 -1
- package/dist/components/cost-optimizer.d.ts +1 -1
- package/dist/components/cost-optimizer.d.ts.map +1 -1
- package/dist/components/cost-optimizer.js +10 -5
- package/dist/components/cost-optimizer.js.map +1 -1
- package/dist/components/executor.d.ts +10 -1
- package/dist/components/executor.d.ts.map +1 -1
- package/dist/components/executor.js +135 -29
- package/dist/components/executor.js.map +1 -1
- package/dist/components/interactive.d.ts +32 -0
- package/dist/components/interactive.d.ts.map +1 -0
- package/dist/components/interactive.js +149 -0
- package/dist/components/interactive.js.map +1 -0
- package/dist/components/planner.d.ts +2 -1
- package/dist/components/planner.d.ts.map +1 -1
- package/dist/components/planner.js +62 -7
- package/dist/components/planner.js.map +1 -1
- package/dist/components/reviewer.d.ts +2 -1
- package/dist/components/reviewer.d.ts.map +1 -1
- package/dist/components/reviewer.js +76 -20
- package/dist/components/reviewer.js.map +1 -1
- package/dist/components/task-queue.d.ts.map +1 -1
- package/dist/components/task-queue.js +30 -1
- package/dist/components/task-queue.js.map +1 -1
- package/dist/components/test-runner.d.ts.map +1 -1
- package/dist/components/test-runner.js +10 -9
- package/dist/components/test-runner.js.map +1 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +4 -3
- package/dist/core/config.js.map +1 -1
- package/dist/core/logger.d.ts +5 -4
- package/dist/core/logger.d.ts.map +1 -1
- package/dist/core/logger.js +98 -45
- package/dist/core/logger.js.map +1 -1
- package/dist/core/status-bar.d.ts +27 -0
- package/dist/core/status-bar.d.ts.map +1 -0
- package/dist/core/status-bar.js +192 -0
- package/dist/core/status-bar.js.map +1 -0
- package/dist/core/types.d.ts +2 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/index.js +489 -45
- package/dist/index.js.map +1 -1
- package/dist/loop-controller.d.ts +4 -1
- package/dist/loop-controller.d.ts.map +1 -1
- package/dist/loop-controller.js +191 -55
- package/dist/loop-controller.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -206,7 +206,7 @@ memory/
|
|
|
206
206
|
|
|
207
207
|
```
|
|
208
208
|
<project-root>/
|
|
209
|
-
|
|
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
|
-
|
|
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
|
|
286
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
*
|
|
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":"
|
|
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
|
-
*
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
39
|
-
|
|
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":"
|
|
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;
|
|
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
|
-
|
|
30
|
-
|
|
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
|
-
|
|
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":";;;AAAA,mCAAoC;AAEpC,2CAA0C;AAE1C,2CAA8C;AAE9C;;;GAGG;AACH,MAAa,aAAa;IAOxB,YACmB,MAAkB,EAClB,MAAmB;QADnB,WAAM,GAAN,MAAM,CAAY;QAClB,WAAM,GAAN,MAAM,CAAa;QAR9B,qBAAgB,GAAG,CAAC,CAAC;QACrB,sBAAiB,GAAG,CAAC,CAAC;QACtB,kBAAa,GAAG,CAAC,CAAC;QAClB,cAAS,GAAG,CAAC,CAAC;QACL,QAAG,GAAG,IAAA,qBAAY,EAAC,eAAe,CAAC,CAAC;IAKlD,CAAC;IAEJ,8EAA8E;IAE9E,sEAAsE;IACtE,aAAa,CAAC,MAAc,EAAE,GAAG,YAAsB;QACrD,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtD,OAAO,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,iBAAiB,CAAC,QAAgB;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,GAAG,
|
|
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;
|
|
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"}
|