@pat-lewczuk/cezar 0.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 (45) hide show
  1. package/README.md +90 -0
  2. package/dist/core/agent-runner.d.ts +95 -0
  3. package/dist/core/agent-runner.js +8 -0
  4. package/dist/core/agent-runner.js.map +1 -0
  5. package/dist/core/backend-detect.d.ts +14 -0
  6. package/dist/core/backend-detect.js +78 -0
  7. package/dist/core/backend-detect.js.map +1 -0
  8. package/dist/core/claude-cli-runner.d.ts +68 -0
  9. package/dist/core/claude-cli-runner.js +424 -0
  10. package/dist/core/claude-cli-runner.js.map +1 -0
  11. package/dist/core/usage.d.ts +11 -0
  12. package/dist/core/usage.js +15 -0
  13. package/dist/core/usage.js.map +1 -0
  14. package/dist/index.d.ts +2 -0
  15. package/dist/index.js +294 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/runs/store.d.ts +218 -0
  18. package/dist/runs/store.js +286 -0
  19. package/dist/runs/store.js.map +1 -0
  20. package/dist/server/git.d.ts +21 -0
  21. package/dist/server/git.js +54 -0
  22. package/dist/server/git.js.map +1 -0
  23. package/dist/server/open-in-terminal.d.ts +11 -0
  24. package/dist/server/open-in-terminal.js +84 -0
  25. package/dist/server/open-in-terminal.js.map +1 -0
  26. package/dist/server/server.d.ts +12 -0
  27. package/dist/server/server.js +243 -0
  28. package/dist/server/server.js.map +1 -0
  29. package/dist/skills.d.ts +31 -0
  30. package/dist/skills.js +117 -0
  31. package/dist/skills.js.map +1 -0
  32. package/dist/workflows/load.d.ts +15 -0
  33. package/dist/workflows/load.js +58 -0
  34. package/dist/workflows/load.js.map +1 -0
  35. package/dist/workflows/run.d.ts +52 -0
  36. package/dist/workflows/run.js +452 -0
  37. package/dist/workflows/run.js.map +1 -0
  38. package/dist/workflows/types.d.ts +202 -0
  39. package/dist/workflows/types.js +56 -0
  40. package/dist/workflows/types.js.map +1 -0
  41. package/package.json +44 -0
  42. package/scripts/mock-claude.mjs +106 -0
  43. package/web/app.js +634 -0
  44. package/web/index.html +48 -0
  45. package/web/style.css +317 -0
@@ -0,0 +1,424 @@
1
+ import { spawn as nodeSpawn } from 'node:child_process';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { dirname, resolve as resolvePath } from 'node:path';
4
+ import { costWeightedTokens } from './usage.js';
5
+ /** Default wall-clock cap for a single run before SIGTERM → SIGKILL.
6
+ * Interactive sessions pass `timeoutMs: 0` to disable it entirely. */
7
+ export const DEFAULT_RUN_TIMEOUT_MS = 30 * 60_000;
8
+ /** Grace period between SIGTERM and SIGKILL when a timeout fires. */
9
+ export const KILL_GRACE_MS = 10_000;
10
+ /** After `end()` closes stdin: claude in stream-json mode can ignore EOF and
11
+ * hang (janitor-confirmed CLI bug) — escalate SIGTERM, then SIGKILL. */
12
+ export const EOF_TERM_GRACE_MS = 8_000;
13
+ export const EOF_KILL_GRACE_MS = 4_000;
14
+ /** Reopen window after a turn ends before an auto-ended session closes stdin. */
15
+ export const AUTO_END_DELAY_MS = 250;
16
+ /**
17
+ * `AgentRunner` over the Claude Code CLI in headless stream-json mode. Auth =
18
+ * the host's logged-in Pro/Max subscription (no API key needed). Sandboxing is
19
+ * `--allowedTools` (default-deny) + running inside the repo `cwd`; `Bash` is
20
+ * narrowed to `Bash(<prefix>:*)` patterns when `bashAllowlist` is set.
21
+ *
22
+ * Session mechanics (multi-turn stdin, EOF watchdog, reopen window) follow
23
+ * github-janitor's `claudeRunner.ts`; the original single-turn adaptation
24
+ * came from @cezar/core's `ClaudeCodeCliRunner`.
25
+ */
26
+ export class ClaudeCliRunner {
27
+ backend = 'claude-cli';
28
+ bin;
29
+ timeoutMs;
30
+ lastSession = null;
31
+ constructor(opts = {}) {
32
+ // CEZ_DRY_RUN=1 swaps in the bundled mock so the cockpit / store /
33
+ // GUI can be exercised without a logged-in claude or burning tokens.
34
+ const defaultBin = process.env.CEZ_CLAUDE_BIN ??
35
+ (process.env.CEZ_DRY_RUN === '1' ? mockClaudePath() : 'claude');
36
+ this.bin = opts.bin ?? defaultBin;
37
+ this.timeoutMs = opts.timeoutMs ?? DEFAULT_RUN_TIMEOUT_MS;
38
+ }
39
+ /** One-shot run: start a session and auto-end it after the first turn. */
40
+ run(spec, onEvent) {
41
+ return this.startSession(spec, onEvent, { autoEndAfterFirstTurn: true }).result;
42
+ }
43
+ async interrupt() {
44
+ this.lastSession?.interrupt();
45
+ }
46
+ startSession(spec, onEvent, opts = {}) {
47
+ const args = buildClaudeArgs(spec);
48
+ let child;
49
+ try {
50
+ child = nodeSpawn(this.bin, args, { cwd: spec.cwd, env: process.env });
51
+ }
52
+ catch (err) {
53
+ throw wrapSpawnError(err, this.bin);
54
+ }
55
+ let stdinOpen = true;
56
+ let autoEndTimer;
57
+ let eofTermTimer;
58
+ let eofKillTimer;
59
+ const sendMessage = (content) => {
60
+ if (!stdinOpen)
61
+ return false;
62
+ // A follow-up inside the reopen window cancels the scheduled close.
63
+ if (autoEndTimer) {
64
+ clearTimeout(autoEndTimer);
65
+ autoEndTimer = undefined;
66
+ }
67
+ const line = JSON.stringify({
68
+ type: 'user',
69
+ message: { role: 'user', content },
70
+ session_id: spec.sessionId,
71
+ });
72
+ try {
73
+ child.stdin.write(`${line}\n`);
74
+ return true;
75
+ }
76
+ catch (err) {
77
+ const message = err instanceof Error ? err.message : String(err);
78
+ onEvent?.({ type: 'note', message: `claude: stdin write failed: ${message}` });
79
+ return false;
80
+ }
81
+ };
82
+ const end = () => {
83
+ if (!stdinOpen)
84
+ return;
85
+ stdinOpen = false;
86
+ try {
87
+ child.stdin.end();
88
+ }
89
+ catch {
90
+ // already gone
91
+ }
92
+ eofTermTimer = setTimeout(() => {
93
+ if (child.exitCode == null && !child.killed)
94
+ child.kill('SIGTERM');
95
+ eofKillTimer = setTimeout(() => {
96
+ if (child.exitCode == null && !child.killed)
97
+ child.kill('SIGKILL');
98
+ }, EOF_KILL_GRACE_MS);
99
+ eofKillTimer.unref?.();
100
+ }, EOF_TERM_GRACE_MS);
101
+ eofTermTimer.unref?.();
102
+ };
103
+ const interrupt = () => {
104
+ stdinOpen = false;
105
+ if (!child.killed)
106
+ child.kill('SIGTERM');
107
+ };
108
+ // Seed the first user message — the same path every follow-up takes.
109
+ sendMessage([{ type: 'text', text: spec.userPrompt }]);
110
+ const toolCalls = [];
111
+ const textChunks = [];
112
+ let tokensUsed = 0;
113
+ let sawUsage = false;
114
+ let spawnFailed = null;
115
+ child.on('error', (err) => {
116
+ spawnFailed = wrapSpawnError(err, this.bin);
117
+ });
118
+ const stderrChunks = [];
119
+ child.stderr.setEncoding('utf8');
120
+ child.stderr.on('data', (chunk) => stderrChunks.push(chunk));
121
+ // Optional wall-clock kill switch (disabled for interactive sessions).
122
+ const limitMs = spec.timeoutMs ?? this.timeoutMs;
123
+ let timedOut = false;
124
+ let killTimer;
125
+ let deadline;
126
+ if (limitMs > 0) {
127
+ deadline = setTimeout(() => {
128
+ timedOut = true;
129
+ interrupt();
130
+ child.stdout.destroy();
131
+ killTimer = setTimeout(() => {
132
+ if (child.exitCode == null && !child.killed)
133
+ child.kill('SIGKILL');
134
+ }, KILL_GRACE_MS);
135
+ killTimer.unref?.();
136
+ }, limitMs);
137
+ deadline.unref?.();
138
+ }
139
+ const result = (async () => {
140
+ try {
141
+ for await (const line of readNdjson(child.stdout)) {
142
+ if (timedOut)
143
+ break;
144
+ let msg;
145
+ try {
146
+ msg = JSON.parse(line);
147
+ }
148
+ catch {
149
+ onEvent?.({ type: 'note', message: `claude: skipped unparseable stream line: ${truncate(line)}` });
150
+ continue;
151
+ }
152
+ let delta = 0;
153
+ try {
154
+ delta = handleClaudeMessage(msg, { toolCalls, textChunks, onEvent });
155
+ }
156
+ catch (err) {
157
+ const message = err instanceof Error ? err.message : String(err);
158
+ onEvent?.({ type: 'note', message: `claude: skipped malformed event (${msg.type ?? 'unknown'}): ${message}` });
159
+ continue;
160
+ }
161
+ if (delta > 0) {
162
+ sawUsage = true;
163
+ tokensUsed += delta;
164
+ onEvent?.({ type: 'token-usage', tokensUsed });
165
+ }
166
+ if (msg.type === 'result') {
167
+ if (typeof msg.total_cost_usd === 'number' && msg.total_cost_usd > 0) {
168
+ onEvent?.({ type: 'cost', usd: msg.total_cost_usd });
169
+ }
170
+ onEvent?.({ type: 'turn-end' });
171
+ if (opts.autoEndAfterFirstTurn && stdinOpen && !autoEndTimer) {
172
+ autoEndTimer = setTimeout(end, AUTO_END_DELAY_MS);
173
+ autoEndTimer.unref?.();
174
+ }
175
+ }
176
+ }
177
+ }
178
+ catch (err) {
179
+ // A timeout destroys stdout, which surfaces here as a premature-close
180
+ // error — expected; rethrow anything else.
181
+ if (!timedOut)
182
+ throw err;
183
+ }
184
+ finally {
185
+ if (deadline)
186
+ clearTimeout(deadline);
187
+ if (killTimer)
188
+ clearTimeout(killTimer);
189
+ if (autoEndTimer)
190
+ clearTimeout(autoEndTimer);
191
+ stdinOpen = false;
192
+ }
193
+ const exitCode = await waitForExit(child);
194
+ if (eofTermTimer)
195
+ clearTimeout(eofTermTimer);
196
+ if (eofKillTimer)
197
+ clearTimeout(eofKillTimer);
198
+ if (spawnFailed)
199
+ throw spawnFailed;
200
+ const text = textChunks.join('\n').trim();
201
+ if (timedOut) {
202
+ const mins = Math.round((limitMs / 60_000) * 10) / 10;
203
+ onEvent?.({ type: 'error', message: `claude CLI timed out after ${mins}m and was killed` });
204
+ onEvent?.({ type: 'done' });
205
+ return { text, toolCalls, tokensUsed, sessionId: spec.sessionId };
206
+ }
207
+ if (exitCode !== 0 && exitCode !== null) {
208
+ const stderr = stderrChunks.join('').trim();
209
+ const detail = stderr ? ` — ${stderr.split('\n').slice(-3).join(' | ')}` : '';
210
+ const msg = `claude CLI exited with code ${exitCode}${detail}`;
211
+ onEvent?.({ type: 'error', message: msg });
212
+ throw new Error(msg);
213
+ }
214
+ if (!sawUsage) {
215
+ onEvent?.({ type: 'note', message: 'token usage not reported by claude CLI' });
216
+ }
217
+ onEvent?.({ type: 'done' });
218
+ return { text, toolCalls, tokensUsed, sessionId: spec.sessionId };
219
+ })();
220
+ const session = {
221
+ result,
222
+ sendMessage,
223
+ end,
224
+ interrupt,
225
+ get open() {
226
+ return stdinOpen;
227
+ },
228
+ };
229
+ this.lastSession = session;
230
+ return session;
231
+ }
232
+ }
233
+ /**
234
+ * Build the headless argv. `--input-format stream-json` reads user messages
235
+ * from stdin; `--output-format stream-json --verbose` gives per-event NDJSON;
236
+ * `--permission-mode acceptEdits` lets edits through without a TTY prompt.
237
+ */
238
+ function buildClaudeArgs(spec) {
239
+ const args = [
240
+ '--input-format',
241
+ 'stream-json',
242
+ '--output-format',
243
+ 'stream-json',
244
+ '--verbose',
245
+ '--permission-mode',
246
+ 'acceptEdits',
247
+ ];
248
+ if (spec.systemPrompt) {
249
+ args.push('--append-system-prompt', spec.systemPrompt);
250
+ }
251
+ // Pin the session so the user can `claude --resume <sessionId>` in the repo
252
+ // to take over interactively after a run. With `resume` we reopen the
253
+ // existing on-disk conversation instead.
254
+ if (spec.sessionId) {
255
+ if (spec.resume) {
256
+ args.push('--resume', spec.sessionId);
257
+ }
258
+ else {
259
+ args.push('--session-id', spec.sessionId);
260
+ }
261
+ }
262
+ const allowed = buildAllowedTools(spec.allowedTools ?? [], spec.bashAllowlist);
263
+ if (allowed.length > 0) {
264
+ args.push('--allowedTools', allowed.join(','));
265
+ }
266
+ if (spec.model) {
267
+ args.push('--model', spec.model);
268
+ }
269
+ for (const dir of spec.additionalDirectories ?? []) {
270
+ args.push('--add-dir', dir);
271
+ }
272
+ return args;
273
+ }
274
+ /**
275
+ * Map `allowedTools` onto claude's `--allowedTools` syntax. `Bash` with a
276
+ * `bashAllowlist` becomes one `Bash(<prefix>:*)` entry per allowed prefix;
277
+ * `Bash` with no allowlist stays plain `Bash`.
278
+ */
279
+ export function buildAllowedTools(allowedTools, bashAllowlist) {
280
+ const out = [];
281
+ for (const tool of allowedTools) {
282
+ if (tool === 'Bash' && bashAllowlist && bashAllowlist.length > 0) {
283
+ for (const prefix of bashAllowlist) {
284
+ const p = prefix.trim();
285
+ if (p)
286
+ out.push(`Bash(${p}:*)`);
287
+ }
288
+ }
289
+ else {
290
+ out.push(tool);
291
+ }
292
+ }
293
+ return out;
294
+ }
295
+ function truncate(s, max = 200) {
296
+ return s.length > max ? `${s.slice(0, max)}…` : s;
297
+ }
298
+ /** Path to the bundled mock (`scripts/mock-claude.mjs`), for CEZ_DRY_RUN=1. */
299
+ function mockClaudePath() {
300
+ const here = dirname(fileURLToPath(import.meta.url));
301
+ // here = <pkg>/dist/core (built) or <pkg>/src/core (tsx dev).
302
+ return resolvePath(here, '..', '..', 'scripts', 'mock-claude.mjs');
303
+ }
304
+ function handleClaudeMessage(msg, ctx) {
305
+ if (msg.type === 'assistant' && msg.message?.content) {
306
+ for (const block of msg.message.content) {
307
+ const b = block;
308
+ if (b.type === 'text' && typeof b.text === 'string') {
309
+ ctx.textChunks.push(b.text);
310
+ ctx.onEvent?.({ type: 'text', text: b.text });
311
+ }
312
+ else if (b.type === 'tool_use' && b.id && b.name) {
313
+ ctx.toolCalls.push({ id: b.id, name: b.name, input: b.input });
314
+ ctx.onEvent?.({ type: 'tool-call', id: b.id, tool: b.name, input: b.input });
315
+ }
316
+ }
317
+ return costWeightedTokens(msg.message.usage);
318
+ }
319
+ if (msg.type === 'user' && msg.message?.content) {
320
+ for (const block of msg.message.content) {
321
+ const b = block;
322
+ if (b.type === 'tool_result' && typeof b.tool_use_id === 'string') {
323
+ ctx.onEvent?.({
324
+ type: 'tool-result',
325
+ toolCallId: b.tool_use_id,
326
+ result: stringifyContent(b.content),
327
+ isError: b.is_error === true,
328
+ });
329
+ }
330
+ }
331
+ return 0;
332
+ }
333
+ if (msg.type === 'result') {
334
+ // Final message of a turn: `result` is the full assistant text; only fall
335
+ // back to it if we never saw streamed assistant text blocks.
336
+ if (typeof msg.result === 'string' && ctx.textChunks.length === 0) {
337
+ ctx.textChunks.push(msg.result);
338
+ ctx.onEvent?.({ type: 'text', text: msg.result });
339
+ }
340
+ if (msg.is_error) {
341
+ ctx.onEvent?.({
342
+ type: 'note',
343
+ message: `claude reported result error${msg.subtype ? ` (${msg.subtype})` : ''}`,
344
+ });
345
+ }
346
+ return costWeightedTokens(msg.usage);
347
+ }
348
+ // system/init and anything else: nothing actionable.
349
+ return 0;
350
+ }
351
+ function stringifyContent(content) {
352
+ if (typeof content === 'string')
353
+ return content;
354
+ if (Array.isArray(content)) {
355
+ return content
356
+ .map((c) => {
357
+ const b = c;
358
+ if (b.type === 'text' && typeof b.text === 'string')
359
+ return b.text;
360
+ try {
361
+ return JSON.stringify(b);
362
+ }
363
+ catch {
364
+ return String(b);
365
+ }
366
+ })
367
+ .join('\n');
368
+ }
369
+ try {
370
+ return JSON.stringify(content);
371
+ }
372
+ catch {
373
+ return String(content);
374
+ }
375
+ }
376
+ // ---- subprocess plumbing --------------------------------------------------
377
+ /** Async line iterator over a readable stream of UTF-8 NDJSON. */
378
+ async function* readNdjson(stream) {
379
+ stream.setEncoding('utf8');
380
+ let buffer = '';
381
+ for await (const chunk of stream) {
382
+ buffer += chunk;
383
+ let idx;
384
+ while ((idx = buffer.indexOf('\n')) >= 0) {
385
+ const line = buffer.slice(0, idx).trim();
386
+ buffer = buffer.slice(idx + 1);
387
+ if (line)
388
+ yield line;
389
+ }
390
+ }
391
+ const tail = buffer.trim();
392
+ if (tail)
393
+ yield tail;
394
+ }
395
+ function waitForExit(child) {
396
+ if (child.exitCode != null)
397
+ return Promise.resolve(child.exitCode);
398
+ return new Promise((resolve) => {
399
+ let done = false;
400
+ const fin = (code) => {
401
+ if (done)
402
+ return;
403
+ done = true;
404
+ clearTimeout(safety);
405
+ resolve(code);
406
+ };
407
+ child.once('close', (code) => fin(code));
408
+ child.once('exit', (code) => fin(code));
409
+ // Don't swallow a late error as a clean null exit — fall back to the
410
+ // child's own exit code (which is non-null/non-zero on failure).
411
+ child.once('error', () => fin(child.exitCode ?? null));
412
+ // A SIGKILLed process may never emit 'close' through some edge cases.
413
+ const safety = setTimeout(() => fin(child.exitCode ?? null), EOF_TERM_GRACE_MS + EOF_KILL_GRACE_MS + KILL_GRACE_MS + 5_000);
414
+ safety.unref?.();
415
+ });
416
+ }
417
+ function wrapSpawnError(err, bin) {
418
+ const code = err?.code;
419
+ if (code === 'ENOENT') {
420
+ return new Error(`\`${bin}\` not found on PATH — install Claude Code (https://claude.com/claude-code) and run \`claude\` once to log in`);
421
+ }
422
+ return err instanceof Error ? err : new Error(String(err));
423
+ }
424
+ //# sourceMappingURL=claude-cli-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-cli-runner.js","sourceRoot":"","sources":["../../src/core/claude-cli-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare const CACHE_READ_WEIGHT = 0.1;
2
+ export declare const CACHE_CREATION_WEIGHT = 1.25;
3
+ /** A loosely-typed usage record as emitted by the claude CLI stream. */
4
+ export interface RawUsage {
5
+ input_tokens?: number;
6
+ output_tokens?: number;
7
+ cache_creation_input_tokens?: number;
8
+ cache_read_input_tokens?: number;
9
+ }
10
+ /** Collapse a raw usage record into a single cost-weighted token count. */
11
+ export declare function costWeightedTokens(usage: RawUsage | undefined | null): number;
@@ -0,0 +1,15 @@
1
+ // Anthropic bills cache-read input at ~10% of standard input cost and cache
2
+ // creation at ~125%. Weighting raw counts by these keeps the token number
3
+ // shown in the cockpit roughly proportional to dollar cost.
4
+ export const CACHE_READ_WEIGHT = 0.1;
5
+ export const CACHE_CREATION_WEIGHT = 1.25;
6
+ /** Collapse a raw usage record into a single cost-weighted token count. */
7
+ export function costWeightedTokens(usage) {
8
+ if (!usage)
9
+ return 0;
10
+ return Math.round((usage.input_tokens ?? 0) +
11
+ (usage.output_tokens ?? 0) +
12
+ (usage.cache_creation_input_tokens ?? 0) * CACHE_CREATION_WEIGHT +
13
+ (usage.cache_read_input_tokens ?? 0) * CACHE_READ_WEIGHT);
14
+ }
15
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/core/usage.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,0EAA0E;AAC1E,4DAA4D;AAC5D,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AACrC,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAU1C,2EAA2E;AAC3E,MAAM,UAAU,kBAAkB,CAAC,KAAkC;IACnE,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC;IACrB,OAAO,IAAI,CAAC,KAAK,CACf,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;QACvB,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC;QAC1B,CAAC,KAAK,CAAC,2BAA2B,IAAI,CAAC,CAAC,GAAG,qBAAqB;QAChE,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC,CAAC,GAAG,iBAAiB,CAC3D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};