@pat-lewczuk/cezar 0.1.1 → 0.1.3
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 +249 -45
- package/dist/config.d.ts +15 -0
- package/dist/config.js +11 -0
- package/dist/config.js.map +1 -1
- package/dist/core/agent-runner.d.ts +44 -2
- package/dist/core/agent-runner.js +8 -2
- package/dist/core/agent-runner.js.map +1 -1
- package/dist/core/backend-detect.d.ts +6 -4
- package/dist/core/backend-detect.js +44 -4
- package/dist/core/backend-detect.js.map +1 -1
- package/dist/core/claude-cli-runner.d.ts +3 -25
- package/dist/core/claude-cli-runner.js +2 -19
- package/dist/core/claude-cli-runner.js.map +1 -1
- package/dist/core/codex-app-server-runner.d.ts +29 -0
- package/dist/core/codex-app-server-runner.js +452 -0
- package/dist/core/codex-app-server-runner.js.map +1 -0
- package/dist/core/ndjson.d.ts +6 -0
- package/dist/core/ndjson.js +23 -0
- package/dist/core/ndjson.js.map +1 -0
- package/dist/core/opencode-server-runner.d.ts +30 -0
- package/dist/core/opencode-server-runner.js +451 -0
- package/dist/core/opencode-server-runner.js.map +1 -0
- package/dist/core/runner-factory.d.ts +8 -0
- package/dist/core/runner-factory.js +22 -0
- package/dist/core/runner-factory.js.map +1 -0
- package/dist/git-worktree.d.ts +7 -0
- package/dist/git-worktree.js +14 -0
- package/dist/git-worktree.js.map +1 -1
- package/dist/planner.js +7 -3
- package/dist/planner.js.map +1 -1
- package/dist/runs/store.d.ts +7 -2
- package/dist/runs/store.js +3 -0
- package/dist/runs/store.js.map +1 -1
- package/dist/server/git.d.ts +5 -0
- package/dist/server/git.js +38 -0
- package/dist/server/git.js.map +1 -1
- package/dist/server/github.d.ts +2 -1
- package/dist/server/github.js +17 -10
- package/dist/server/github.js.map +1 -1
- package/dist/server/pr.js +7 -1
- package/dist/server/pr.js.map +1 -1
- package/dist/server/server.js +207 -20
- package/dist/server/server.js.map +1 -1
- package/dist/skills.d.ts +11 -9
- package/dist/skills.js +74 -13
- package/dist/skills.js.map +1 -1
- package/dist/workflows/load.js +5 -3
- package/dist/workflows/load.js.map +1 -1
- package/dist/workflows/run.d.ts +3 -0
- package/dist/workflows/run.js +43 -11
- package/dist/workflows/run.js.map +1 -1
- package/dist/workflows/types.d.ts +87 -8
- package/dist/workflows/types.js +54 -2
- package/dist/workflows/types.js.map +1 -1
- package/package.json +1 -1
- package/web/app.js +1180 -88
- package/web/index.html +16 -7
- package/web/open-mercato.svg +11 -0
- package/web/style.css +458 -56
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { AgentEvent, AgentRunResult, AgentRunSpec, AgentRunner } from './agent-runner.js';
|
|
2
|
+
import type { AgentSession, SessionOptions } from './agent-runner.js';
|
|
3
|
+
export interface OpencodeRunnerOptions {
|
|
4
|
+
/** Override the binary name/path; defaults to `opencode` on PATH. */
|
|
5
|
+
bin?: string;
|
|
6
|
+
/** Wall-clock timeout for a run (ms); per-spec `timeoutMs` still wins. */
|
|
7
|
+
timeoutMs?: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* `AgentRunner` over `opencode serve` — a headless HTTP server (the same one
|
|
11
|
+
* the opencode TUI talks to) with an SSE event stream. One server per session,
|
|
12
|
+
* bound to the run's `cwd` (worktree), gives OpenCode the same multi-turn shape
|
|
13
|
+
* as the Claude runner: each `sendMessage` posts another prompt to the same
|
|
14
|
+
* session (history is kept server-side), `session/abort` cancels, and reusing
|
|
15
|
+
* the session id resumes for "Continue".
|
|
16
|
+
*
|
|
17
|
+
* Auth = the host's opencode config/logins. The agent runs autonomously
|
|
18
|
+
* (auto-approved permissions); OpenCode has no per-tool allowlist, so
|
|
19
|
+
* `spec.allowedTools` is ignored. `spec.model` is `provider/model`.
|
|
20
|
+
*/
|
|
21
|
+
export declare class OpencodeServerRunner implements AgentRunner {
|
|
22
|
+
readonly backend: "opencode";
|
|
23
|
+
private readonly bin;
|
|
24
|
+
private readonly timeoutMs;
|
|
25
|
+
private lastSession;
|
|
26
|
+
constructor(opts?: OpencodeRunnerOptions);
|
|
27
|
+
run(spec: AgentRunSpec, onEvent?: (event: AgentEvent) => void): Promise<AgentRunResult>;
|
|
28
|
+
interrupt(): Promise<void>;
|
|
29
|
+
startSession(spec: AgentRunSpec, onEvent?: (event: AgentEvent) => void, opts?: SessionOptions): AgentSession;
|
|
30
|
+
}
|
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
import { spawn as nodeSpawn } from 'node:child_process';
|
|
2
|
+
import { AUTO_END_DELAY_MS, DEFAULT_RUN_TIMEOUT_MS } from './claude-cli-runner.js';
|
|
3
|
+
const SERVER_START_TIMEOUT_MS = 30_000;
|
|
4
|
+
/**
|
|
5
|
+
* `AgentRunner` over `opencode serve` — a headless HTTP server (the same one
|
|
6
|
+
* the opencode TUI talks to) with an SSE event stream. One server per session,
|
|
7
|
+
* bound to the run's `cwd` (worktree), gives OpenCode the same multi-turn shape
|
|
8
|
+
* as the Claude runner: each `sendMessage` posts another prompt to the same
|
|
9
|
+
* session (history is kept server-side), `session/abort` cancels, and reusing
|
|
10
|
+
* the session id resumes for "Continue".
|
|
11
|
+
*
|
|
12
|
+
* Auth = the host's opencode config/logins. The agent runs autonomously
|
|
13
|
+
* (auto-approved permissions); OpenCode has no per-tool allowlist, so
|
|
14
|
+
* `spec.allowedTools` is ignored. `spec.model` is `provider/model`.
|
|
15
|
+
*/
|
|
16
|
+
export class OpencodeServerRunner {
|
|
17
|
+
backend = 'opencode';
|
|
18
|
+
bin;
|
|
19
|
+
timeoutMs;
|
|
20
|
+
lastSession = null;
|
|
21
|
+
constructor(opts = {}) {
|
|
22
|
+
this.bin = opts.bin ?? process.env.CEZ_OPENCODE_BIN ?? 'opencode';
|
|
23
|
+
this.timeoutMs = opts.timeoutMs ?? DEFAULT_RUN_TIMEOUT_MS;
|
|
24
|
+
}
|
|
25
|
+
run(spec, onEvent) {
|
|
26
|
+
return this.startSession(spec, onEvent, { autoEndAfterFirstTurn: true }).result;
|
|
27
|
+
}
|
|
28
|
+
async interrupt() {
|
|
29
|
+
this.lastSession?.interrupt();
|
|
30
|
+
}
|
|
31
|
+
startSession(spec, onEvent, opts = {}) {
|
|
32
|
+
const session = new OpencodeSession(this.bin, this.timeoutMs, spec, onEvent, opts);
|
|
33
|
+
this.lastSession = session;
|
|
34
|
+
return session;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** One live `opencode serve` process driving a single session. */
|
|
38
|
+
class OpencodeSession {
|
|
39
|
+
bin;
|
|
40
|
+
spec;
|
|
41
|
+
onEvent;
|
|
42
|
+
opts;
|
|
43
|
+
result;
|
|
44
|
+
child;
|
|
45
|
+
serverOpen = true;
|
|
46
|
+
baseUrl;
|
|
47
|
+
sessionId;
|
|
48
|
+
ready;
|
|
49
|
+
resolveExit;
|
|
50
|
+
exited;
|
|
51
|
+
sse = new AbortController();
|
|
52
|
+
toolCalls = [];
|
|
53
|
+
textChunks = [];
|
|
54
|
+
/** Per text-part cursor so we emit only newly-appended text (deltas). */
|
|
55
|
+
textSeen = new Map();
|
|
56
|
+
toolsSeen = new Set();
|
|
57
|
+
/** messageID → role. Parts carry no role; only assistant parts are surfaced
|
|
58
|
+
* (the user's own message also streams as parts over the same SSE feed). */
|
|
59
|
+
msgRole = new Map();
|
|
60
|
+
tokensUsed = 0;
|
|
61
|
+
lastCost = 0;
|
|
62
|
+
turnInFlight = false;
|
|
63
|
+
autoEndTimer;
|
|
64
|
+
spawnFailed = null;
|
|
65
|
+
timedOut = false;
|
|
66
|
+
constructor(bin, timeoutMs, spec, onEvent, opts) {
|
|
67
|
+
this.bin = bin;
|
|
68
|
+
this.spec = spec;
|
|
69
|
+
this.onEvent = onEvent;
|
|
70
|
+
this.opts = opts;
|
|
71
|
+
// Random high port; the actual bound URL is read back from stdout.
|
|
72
|
+
const port = 40000 + Math.floor(Math.random() * 20000);
|
|
73
|
+
try {
|
|
74
|
+
this.child = nodeSpawn(bin, ['serve', '--hostname', '127.0.0.1', '--port', String(port)], {
|
|
75
|
+
cwd: spec.cwd,
|
|
76
|
+
env: { ...process.env, ...spec.env },
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
throw wrapSpawnError(err, bin);
|
|
81
|
+
}
|
|
82
|
+
this.child.on('error', (err) => {
|
|
83
|
+
this.spawnFailed = wrapSpawnError(err, bin);
|
|
84
|
+
});
|
|
85
|
+
this.exited = new Promise((resolve) => {
|
|
86
|
+
this.resolveExit = resolve;
|
|
87
|
+
});
|
|
88
|
+
this.child.once('exit', () => this.resolveExit());
|
|
89
|
+
this.child.once('close', () => this.resolveExit());
|
|
90
|
+
const stderrChunks = [];
|
|
91
|
+
this.child.stderr.setEncoding('utf8');
|
|
92
|
+
this.child.stderr.on('data', (chunk) => stderrChunks.push(chunk));
|
|
93
|
+
// The server prints its URL on stdout once listening.
|
|
94
|
+
const urlReady = this.waitForServerUrl(port);
|
|
95
|
+
const limitMs = spec.timeoutMs ?? timeoutMs;
|
|
96
|
+
let deadline;
|
|
97
|
+
if (limitMs > 0) {
|
|
98
|
+
deadline = setTimeout(() => {
|
|
99
|
+
this.timedOut = true;
|
|
100
|
+
this.interrupt();
|
|
101
|
+
}, limitMs);
|
|
102
|
+
deadline.unref?.();
|
|
103
|
+
}
|
|
104
|
+
this.ready = (async () => {
|
|
105
|
+
this.baseUrl = await urlReady;
|
|
106
|
+
await this.bootstrap();
|
|
107
|
+
})();
|
|
108
|
+
this.result = (async () => {
|
|
109
|
+
try {
|
|
110
|
+
await this.ready;
|
|
111
|
+
// Live for the whole session; the SSE loop runs until end()/interrupt.
|
|
112
|
+
await this.exited;
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
if (!this.timedOut) {
|
|
116
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
117
|
+
this.emit({ type: 'error', message: `opencode: ${message}` });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
if (deadline)
|
|
122
|
+
clearTimeout(deadline);
|
|
123
|
+
if (this.autoEndTimer)
|
|
124
|
+
clearTimeout(this.autoEndTimer);
|
|
125
|
+
this.sse.abort();
|
|
126
|
+
this.serverOpen = false;
|
|
127
|
+
if (!this.child.killed)
|
|
128
|
+
this.child.kill('SIGTERM');
|
|
129
|
+
}
|
|
130
|
+
await this.exited;
|
|
131
|
+
if (this.spawnFailed)
|
|
132
|
+
throw this.spawnFailed;
|
|
133
|
+
const text = this.textChunks.join('').trim();
|
|
134
|
+
const base = {
|
|
135
|
+
text,
|
|
136
|
+
toolCalls: this.toolCalls,
|
|
137
|
+
tokensUsed: this.tokensUsed,
|
|
138
|
+
sessionId: this.sessionId ?? spec.sessionId,
|
|
139
|
+
};
|
|
140
|
+
if (this.timedOut) {
|
|
141
|
+
const mins = Math.round((limitMs / 60_000) * 10) / 10;
|
|
142
|
+
this.emit({ type: 'error', message: `opencode timed out after ${mins}m and was killed` });
|
|
143
|
+
}
|
|
144
|
+
this.emit({ type: 'done' });
|
|
145
|
+
return base;
|
|
146
|
+
})();
|
|
147
|
+
}
|
|
148
|
+
get open() {
|
|
149
|
+
return this.serverOpen;
|
|
150
|
+
}
|
|
151
|
+
sendMessage(content) {
|
|
152
|
+
if (!this.serverOpen)
|
|
153
|
+
return false;
|
|
154
|
+
if (this.autoEndTimer) {
|
|
155
|
+
clearTimeout(this.autoEndTimer);
|
|
156
|
+
this.autoEndTimer = undefined;
|
|
157
|
+
}
|
|
158
|
+
const text = textOf(content);
|
|
159
|
+
if (!text)
|
|
160
|
+
return true;
|
|
161
|
+
void this.ready
|
|
162
|
+
.then(() => this.prompt(text))
|
|
163
|
+
.catch((err) => {
|
|
164
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
165
|
+
this.emit({ type: 'note', message: `opencode: prompt failed: ${message}` });
|
|
166
|
+
});
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
end() {
|
|
170
|
+
if (!this.serverOpen)
|
|
171
|
+
return;
|
|
172
|
+
this.serverOpen = false;
|
|
173
|
+
this.sse.abort();
|
|
174
|
+
if (!this.child.killed)
|
|
175
|
+
this.child.kill('SIGTERM');
|
|
176
|
+
setTimeout(() => {
|
|
177
|
+
if (this.child.exitCode == null && !this.child.killed)
|
|
178
|
+
this.child.kill('SIGKILL');
|
|
179
|
+
}, 4_000).unref?.();
|
|
180
|
+
}
|
|
181
|
+
interrupt() {
|
|
182
|
+
this.serverOpen = false;
|
|
183
|
+
if (this.baseUrl && this.sessionId) {
|
|
184
|
+
void this.http('POST', `/session/${this.sessionId}/abort`, undefined).catch(() => undefined);
|
|
185
|
+
}
|
|
186
|
+
this.sse.abort();
|
|
187
|
+
if (!this.child.killed)
|
|
188
|
+
this.child.kill('SIGTERM');
|
|
189
|
+
}
|
|
190
|
+
// ---- server lifecycle ---------------------------------------------------
|
|
191
|
+
waitForServerUrl(fallbackPort) {
|
|
192
|
+
return new Promise((resolve, reject) => {
|
|
193
|
+
let buffer = '';
|
|
194
|
+
const timer = setTimeout(() => {
|
|
195
|
+
cleanup();
|
|
196
|
+
// Nothing parsed — try the port we asked for.
|
|
197
|
+
resolve(`http://127.0.0.1:${fallbackPort}`);
|
|
198
|
+
}, SERVER_START_TIMEOUT_MS);
|
|
199
|
+
timer.unref?.();
|
|
200
|
+
const onData = (chunk) => {
|
|
201
|
+
buffer += chunk;
|
|
202
|
+
const m = /https?:\/\/[\d.]+:\d+/.exec(buffer);
|
|
203
|
+
if (m) {
|
|
204
|
+
cleanup();
|
|
205
|
+
resolve(m[0]);
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
const onExit = () => {
|
|
209
|
+
cleanup();
|
|
210
|
+
reject(new Error('opencode serve exited before it started listening'));
|
|
211
|
+
};
|
|
212
|
+
const cleanup = () => {
|
|
213
|
+
clearTimeout(timer);
|
|
214
|
+
this.child.stdout.off('data', onData);
|
|
215
|
+
this.child.off('exit', onExit);
|
|
216
|
+
};
|
|
217
|
+
this.child.stdout.setEncoding('utf8');
|
|
218
|
+
this.child.stdout.on('data', onData);
|
|
219
|
+
this.child.once('exit', onExit);
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
async bootstrap() {
|
|
223
|
+
const created = await this.http('POST', '/session', { title: 'cezar task' });
|
|
224
|
+
this.sessionId = stringField(created, 'id');
|
|
225
|
+
if (!this.sessionId)
|
|
226
|
+
throw new Error('opencode did not return a session id');
|
|
227
|
+
this.emit({ type: 'session', sessionId: this.sessionId });
|
|
228
|
+
void this.consumeEvents();
|
|
229
|
+
const first = this.spec.systemPrompt
|
|
230
|
+
? `${this.spec.systemPrompt}\n\n---\n\n${this.spec.userPrompt}`
|
|
231
|
+
: this.spec.userPrompt;
|
|
232
|
+
await this.prompt(first);
|
|
233
|
+
}
|
|
234
|
+
async prompt(text) {
|
|
235
|
+
if (!this.sessionId)
|
|
236
|
+
return;
|
|
237
|
+
this.turnInFlight = true;
|
|
238
|
+
const body = { parts: [{ type: 'text', text }] };
|
|
239
|
+
const model = parseModel(this.spec.model);
|
|
240
|
+
if (model)
|
|
241
|
+
body.model = model;
|
|
242
|
+
try {
|
|
243
|
+
const res = await this.http('POST', `/session/${this.sessionId}/message`, body);
|
|
244
|
+
this.absorbUsage(res);
|
|
245
|
+
}
|
|
246
|
+
finally {
|
|
247
|
+
this.turnInFlight = false;
|
|
248
|
+
this.emit({ type: 'turn-end' });
|
|
249
|
+
if (this.opts.autoEndAfterFirstTurn && this.serverOpen && !this.autoEndTimer) {
|
|
250
|
+
this.autoEndTimer = setTimeout(() => this.end(), AUTO_END_DELAY_MS);
|
|
251
|
+
this.autoEndTimer.unref?.();
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
// ---- SSE stream ---------------------------------------------------------
|
|
256
|
+
async consumeEvents() {
|
|
257
|
+
if (!this.baseUrl)
|
|
258
|
+
return;
|
|
259
|
+
let res;
|
|
260
|
+
try {
|
|
261
|
+
res = await fetch(`${this.baseUrl}/event`, {
|
|
262
|
+
headers: { accept: 'text/event-stream' },
|
|
263
|
+
signal: this.sse.signal,
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
return; // aborted or server gone — the turn response still carries results
|
|
268
|
+
}
|
|
269
|
+
if (!res.body)
|
|
270
|
+
return;
|
|
271
|
+
const reader = res.body.getReader();
|
|
272
|
+
const decoder = new TextDecoder();
|
|
273
|
+
let buffer = '';
|
|
274
|
+
try {
|
|
275
|
+
for (;;) {
|
|
276
|
+
const { done, value } = await reader.read();
|
|
277
|
+
if (done)
|
|
278
|
+
break;
|
|
279
|
+
buffer += decoder.decode(value, { stream: true });
|
|
280
|
+
let sep;
|
|
281
|
+
while ((sep = buffer.indexOf('\n\n')) >= 0) {
|
|
282
|
+
const frame = buffer.slice(0, sep);
|
|
283
|
+
buffer = buffer.slice(sep + 2);
|
|
284
|
+
this.handleFrame(frame);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
// aborted — normal on end()/interrupt
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
handleFrame(frame) {
|
|
293
|
+
const dataLines = frame
|
|
294
|
+
.split('\n')
|
|
295
|
+
.filter((l) => l.startsWith('data:'))
|
|
296
|
+
.map((l) => l.slice(5).trim());
|
|
297
|
+
if (dataLines.length === 0)
|
|
298
|
+
return;
|
|
299
|
+
let evt;
|
|
300
|
+
try {
|
|
301
|
+
evt = JSON.parse(dataLines.join('\n'));
|
|
302
|
+
}
|
|
303
|
+
catch {
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
this.handleEvent(evt);
|
|
307
|
+
}
|
|
308
|
+
handleEvent(evt) {
|
|
309
|
+
const type = evt.type ?? '';
|
|
310
|
+
const props = evt.properties ?? {};
|
|
311
|
+
if (type === 'message.updated' || type === 'message.created' || type === 'message.completed') {
|
|
312
|
+
const info = props.info ?? props;
|
|
313
|
+
const mid = stringField(info, 'id');
|
|
314
|
+
const role = stringField(info, 'role');
|
|
315
|
+
if (mid && role)
|
|
316
|
+
this.msgRole.set(mid, role);
|
|
317
|
+
this.absorbUsage(info);
|
|
318
|
+
}
|
|
319
|
+
else if (type === 'message.part.updated' || type === 'message.part.created') {
|
|
320
|
+
this.handlePart(props.part ?? props);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
handlePart(part) {
|
|
324
|
+
// Only surface parts of assistant messages — the user's own message streams
|
|
325
|
+
// over the same feed. Role is known early (the message.updated event
|
|
326
|
+
// precedes its parts); an unknown role means "not assistant yet" → skip.
|
|
327
|
+
const messageID = stringField(part, 'messageID');
|
|
328
|
+
if (messageID && this.msgRole.get(messageID) !== 'assistant')
|
|
329
|
+
return;
|
|
330
|
+
const kind = stringField(part, 'type');
|
|
331
|
+
const id = stringField(part, 'id') ?? messageID ?? '';
|
|
332
|
+
if (kind === 'text') {
|
|
333
|
+
const full = stringField(part, 'text') ?? '';
|
|
334
|
+
const seen = this.textSeen.get(id) ?? 0;
|
|
335
|
+
if (full.length > seen) {
|
|
336
|
+
const delta = full.slice(seen);
|
|
337
|
+
this.textSeen.set(id, full.length);
|
|
338
|
+
this.textChunks.push(delta);
|
|
339
|
+
this.emit({ type: 'text', text: delta });
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
else if (kind === 'tool') {
|
|
343
|
+
const state = part.state ?? {};
|
|
344
|
+
const status = stringField(state, 'status');
|
|
345
|
+
const name = stringField(part, 'tool') ?? stringField(part, 'name') ?? 'tool';
|
|
346
|
+
const callId = id || `${name}-${this.toolsSeen.size}`;
|
|
347
|
+
if (!this.toolsSeen.has(callId)) {
|
|
348
|
+
this.toolsSeen.add(callId);
|
|
349
|
+
this.toolCalls.push({ id: callId, name, input: state.input ?? state });
|
|
350
|
+
this.emit({ type: 'tool-call', id: callId, tool: name, input: state.input ?? state });
|
|
351
|
+
}
|
|
352
|
+
if (status === 'completed' || status === 'error') {
|
|
353
|
+
this.emit({
|
|
354
|
+
type: 'tool-result',
|
|
355
|
+
toolCallId: callId,
|
|
356
|
+
result: safeStringify(state.output ?? state.result ?? state),
|
|
357
|
+
isError: status === 'error',
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
/** Pull cumulative tokens/cost out of an assistant message info object. */
|
|
363
|
+
absorbUsage(info) {
|
|
364
|
+
if (!info)
|
|
365
|
+
return;
|
|
366
|
+
const tokens = info.tokens;
|
|
367
|
+
if (tokens) {
|
|
368
|
+
const input = numField(tokens, 'input');
|
|
369
|
+
const output = numField(tokens, 'output');
|
|
370
|
+
const reasoning = numField(tokens, 'reasoning');
|
|
371
|
+
const total = input + output + reasoning;
|
|
372
|
+
if (total > this.tokensUsed) {
|
|
373
|
+
this.tokensUsed = total;
|
|
374
|
+
this.emit({ type: 'token-usage', tokensUsed: this.tokensUsed });
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
const cost = numField(info, 'cost');
|
|
378
|
+
if (cost > this.lastCost) {
|
|
379
|
+
this.emit({ type: 'cost', usd: cost - this.lastCost });
|
|
380
|
+
this.lastCost = cost;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
// ---- http ---------------------------------------------------------------
|
|
384
|
+
async http(method, path, body) {
|
|
385
|
+
if (!this.baseUrl)
|
|
386
|
+
throw new Error('opencode server not ready');
|
|
387
|
+
const res = await fetch(`${this.baseUrl}${path}`, {
|
|
388
|
+
method,
|
|
389
|
+
headers: body !== undefined ? { 'content-type': 'application/json' } : {},
|
|
390
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
391
|
+
});
|
|
392
|
+
if (!res.ok) {
|
|
393
|
+
const detail = await res.text().catch(() => '');
|
|
394
|
+
throw new Error(`${method} ${path} → ${res.status} ${detail.slice(0, 200)}`);
|
|
395
|
+
}
|
|
396
|
+
const text = await res.text();
|
|
397
|
+
if (!text)
|
|
398
|
+
return {};
|
|
399
|
+
try {
|
|
400
|
+
return JSON.parse(text);
|
|
401
|
+
}
|
|
402
|
+
catch {
|
|
403
|
+
return {};
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
emit(event) {
|
|
407
|
+
this.onEvent?.(event);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
function textOf(content) {
|
|
411
|
+
return content
|
|
412
|
+
.filter((b) => b.type === 'text')
|
|
413
|
+
.map((b) => b.text)
|
|
414
|
+
.join('\n')
|
|
415
|
+
.trim();
|
|
416
|
+
}
|
|
417
|
+
/** `provider/model` → `{ providerID, modelID }`; undefined for auto/empty. */
|
|
418
|
+
function parseModel(model) {
|
|
419
|
+
if (!model)
|
|
420
|
+
return undefined;
|
|
421
|
+
const idx = model.indexOf('/');
|
|
422
|
+
if (idx <= 0)
|
|
423
|
+
return undefined; // not in provider/model form — let opencode pick
|
|
424
|
+
return { providerID: model.slice(0, idx), modelID: model.slice(idx + 1) };
|
|
425
|
+
}
|
|
426
|
+
function stringField(obj, key) {
|
|
427
|
+
const v = obj[key];
|
|
428
|
+
return typeof v === 'string' ? v : undefined;
|
|
429
|
+
}
|
|
430
|
+
function numField(obj, key) {
|
|
431
|
+
const v = obj[key];
|
|
432
|
+
return typeof v === 'number' ? v : 0;
|
|
433
|
+
}
|
|
434
|
+
function safeStringify(value) {
|
|
435
|
+
if (typeof value === 'string')
|
|
436
|
+
return value;
|
|
437
|
+
try {
|
|
438
|
+
return JSON.stringify(value);
|
|
439
|
+
}
|
|
440
|
+
catch {
|
|
441
|
+
return String(value);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
function wrapSpawnError(err, bin) {
|
|
445
|
+
const code = err?.code;
|
|
446
|
+
if (code === 'ENOENT') {
|
|
447
|
+
return new Error(`\`${bin}\` not found on PATH — install OpenCode (https://opencode.ai) and run \`opencode\` once to configure a provider`);
|
|
448
|
+
}
|
|
449
|
+
return err instanceof Error ? err : new Error(String(err));
|
|
450
|
+
}
|
|
451
|
+
//# sourceMappingURL=opencode-server-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-server-runner.js","sourceRoot":"","sources":["../../src/core/opencode-server-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AgentBackend, AgentRunner, RunnerId } from './agent-runner.js';
|
|
2
|
+
/**
|
|
3
|
+
* The single place that maps a backend id onto a concrete runner. Everything
|
|
4
|
+
* that used to `new ClaudeCliRunner()` (the planner and the workflow engine)
|
|
5
|
+
* goes through here so switching the agent backend is one function call.
|
|
6
|
+
* `claude-cli` is the legacy id for `claude`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createRunner(backend: AgentBackend | RunnerId | undefined): AgentRunner;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ClaudeCliRunner } from './claude-cli-runner.js';
|
|
2
|
+
import { CodexAppServerRunner } from './codex-app-server-runner.js';
|
|
3
|
+
import { OpencodeServerRunner } from './opencode-server-runner.js';
|
|
4
|
+
/**
|
|
5
|
+
* The single place that maps a backend id onto a concrete runner. Everything
|
|
6
|
+
* that used to `new ClaudeCliRunner()` (the planner and the workflow engine)
|
|
7
|
+
* goes through here so switching the agent backend is one function call.
|
|
8
|
+
* `claude-cli` is the legacy id for `claude`.
|
|
9
|
+
*/
|
|
10
|
+
export function createRunner(backend) {
|
|
11
|
+
switch (backend) {
|
|
12
|
+
case 'codex':
|
|
13
|
+
return new CodexAppServerRunner();
|
|
14
|
+
case 'opencode':
|
|
15
|
+
return new OpencodeServerRunner();
|
|
16
|
+
case 'claude':
|
|
17
|
+
case 'claude-cli':
|
|
18
|
+
default:
|
|
19
|
+
return new ClaudeCliRunner();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=runner-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner-factory.js","sourceRoot":"","sources":["../../src/core/runner-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,OAA4C;IACvE,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,OAAO,IAAI,oBAAoB,EAAE,CAAC;QACpC,KAAK,UAAU;YACb,OAAO,IAAI,oBAAoB,EAAE,CAAC;QACpC,KAAK,QAAQ,CAAC;QACd,KAAK,YAAY,CAAC;QAClB;YACE,OAAO,IAAI,eAAe,EAAE,CAAC;IACjC,CAAC;AACH,CAAC"}
|
package/dist/git-worktree.d.ts
CHANGED
|
@@ -9,6 +9,13 @@
|
|
|
9
9
|
/** Repo-relative home of all task worktrees (gitignored via .ai/cezar/.gitignore). */
|
|
10
10
|
export declare const WORKTREES_DIR = ".ai/cezar/worktrees";
|
|
11
11
|
export declare function branchFor(runId: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Resolve the configured base branch to something `git worktree add` can
|
|
14
|
+
* fork from: the branch itself, else its remote-tracking ref (base exists
|
|
15
|
+
* only on origin), else null — the caller falls back to the current branch
|
|
16
|
+
* with a note. Never throws.
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolveBaseRef(repoRoot: string, base: string): Promise<string | null>;
|
|
12
19
|
export declare function worktreePathFor(repoRoot: string, runId: string): string;
|
|
13
20
|
export interface WorktreeInfo {
|
|
14
21
|
path: string;
|
package/dist/git-worktree.js
CHANGED
|
@@ -21,6 +21,20 @@ function git(cwd, args) {
|
|
|
21
21
|
export function branchFor(runId) {
|
|
22
22
|
return `cez/${runId.slice(0, 8)}`;
|
|
23
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Resolve the configured base branch to something `git worktree add` can
|
|
26
|
+
* fork from: the branch itself, else its remote-tracking ref (base exists
|
|
27
|
+
* only on origin), else null — the caller falls back to the current branch
|
|
28
|
+
* with a note. Never throws.
|
|
29
|
+
*/
|
|
30
|
+
export async function resolveBaseRef(repoRoot, base) {
|
|
31
|
+
for (const ref of [base, `origin/${base}`]) {
|
|
32
|
+
const res = await git(repoRoot, ['rev-parse', '--verify', '--quiet', `${ref}^{commit}`]);
|
|
33
|
+
if (res.ok)
|
|
34
|
+
return ref;
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
24
38
|
export function worktreePathFor(repoRoot, runId) {
|
|
25
39
|
return join(repoRoot, WORKTREES_DIR, runId);
|
|
26
40
|
}
|
package/dist/git-worktree.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-worktree.js","sourceRoot":"","sources":["../src/git-worktree.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"git-worktree.js","sourceRoot":"","sources":["../src/git-worktree.ts"],"names":[],"mappings":"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"}
|
package/dist/planner.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { readFile } from 'node:fs/promises';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
-
import {
|
|
4
|
+
import { createRunner } from './core/runner-factory.js';
|
|
5
5
|
import { loadConfig } from './config.js';
|
|
6
6
|
import { discoverSkills } from './skills.js';
|
|
7
7
|
import { workflowStepSchema } from './workflows/types.js';
|
|
@@ -38,7 +38,11 @@ export async function planChain(repoRoot, task) {
|
|
|
38
38
|
]);
|
|
39
39
|
const skillNames = new Set(skills.map((s) => s.name));
|
|
40
40
|
const userPrompt = buildPlannerPrompt(task, skills, verifyCommands);
|
|
41
|
-
|
|
41
|
+
// Plan with the configured default runner. `plannerModel` ("sonnet") is a
|
|
42
|
+
// Claude alias, so only pass it when the planner runs on Claude — Codex /
|
|
43
|
+
// OpenCode pick their own default model instead.
|
|
44
|
+
const runner = createRunner(config.defaultRunner);
|
|
45
|
+
const plannerModel = config.defaultRunner === 'claude' ? config.plannerModel : undefined;
|
|
42
46
|
// One retry on an unparseable answer; a runner error goes straight to fallback.
|
|
43
47
|
for (let attempt = 0; attempt < 2; attempt++) {
|
|
44
48
|
let text;
|
|
@@ -48,7 +52,7 @@ export async function planChain(repoRoot, task) {
|
|
|
48
52
|
userPrompt,
|
|
49
53
|
cwd: repoRoot,
|
|
50
54
|
allowedTools: [],
|
|
51
|
-
model:
|
|
55
|
+
model: plannerModel,
|
|
52
56
|
timeoutMs: PLANNER_TIMEOUT_MS,
|
|
53
57
|
});
|
|
54
58
|
text = result.text;
|