codedeck 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.
Files changed (44) hide show
  1. package/README.md +50 -0
  2. package/dist/cli/commands/logs.js +5 -1
  3. package/dist/cli/commands/logs.js.map +1 -1
  4. package/dist/cli/commands/ps.js +40 -12
  5. package/dist/cli/commands/ps.js.map +1 -1
  6. package/dist/cli/commands/run.js +86 -24
  7. package/dist/cli/commands/run.js.map +1 -1
  8. package/dist/cli/commands/show.js +4 -0
  9. package/dist/cli/commands/show.js.map +1 -1
  10. package/dist/core/driver.js +9 -1
  11. package/dist/core/driver.js.map +1 -1
  12. package/dist/core/errors.js +56 -0
  13. package/dist/core/errors.js.map +1 -1
  14. package/dist/core/events.js.map +1 -1
  15. package/dist/core/session.js.map +1 -1
  16. package/dist/daemon/daemon.js +298 -71
  17. package/dist/daemon/daemon.js.map +1 -1
  18. package/dist/drivers/claude/driver.js +34 -205
  19. package/dist/drivers/claude/driver.js.map +1 -1
  20. package/dist/drivers/codex/driver.js +65 -205
  21. package/dist/drivers/codex/driver.js.map +1 -1
  22. package/dist/drivers/helpers.js +47 -37
  23. package/dist/drivers/helpers.js.map +1 -1
  24. package/dist/drivers/omp/driver.js +38 -206
  25. package/dist/drivers/omp/driver.js.map +1 -1
  26. package/dist/drivers/opencode/driver.js +30 -182
  27. package/dist/drivers/opencode/driver.js.map +1 -1
  28. package/dist/drivers/session-driver.js +122 -0
  29. package/dist/drivers/session-driver.js.map +1 -0
  30. package/dist/drivers/session-runtime.js +333 -0
  31. package/dist/drivers/session-runtime.js.map +1 -0
  32. package/dist/drivers/tailer.js +149 -0
  33. package/dist/drivers/tailer.js.map +1 -0
  34. package/dist/drivers/terminal.js +53 -0
  35. package/dist/drivers/terminal.js.map +1 -0
  36. package/dist/store/database.js +28 -1
  37. package/dist/store/database.js.map +1 -1
  38. package/dist/store/events.js +8 -3
  39. package/dist/store/events.js.map +1 -1
  40. package/dist/store/sessions.js +27 -4
  41. package/dist/store/sessions.js.map +1 -1
  42. package/dist/utils/process.js +104 -4
  43. package/dist/utils/process.js.map +1 -1
  44. package/package.json +10 -2
@@ -1,10 +1,37 @@
1
- import { spawn } from "node:child_process";
2
- import { createLineReader, detectBinary } from "../helpers.js";
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { detectBinary } from "../helpers.js";
3
5
  import { parseClaudeLine } from "./parser.js";
4
- import { EventEmitter } from "node:events";
5
- export class ClaudeDriver {
6
+ import { createRuntimeHooks, SessionDriver } from "../session-driver.js";
7
+ // Pure so the flag spellings are testable without spawning claude.
8
+ export function buildClaudeArgs(options) {
9
+ const args = ["-p", "--output-format", "stream-json", "--verbose"];
10
+ // Bypass permissions for automation (as spec allows).
11
+ args.push("--dangerously-skip-permissions");
12
+ if (options.model)
13
+ args.push("--model", options.model);
14
+ // Claude spells effort as a first-class flag and accepts the same levels as
15
+ // the others. It has NO service-tier equivalent, so `options.fast` is
16
+ // deliberately dropped here rather than translated into an invalid flag.
17
+ if (options.effort)
18
+ args.push("--effort", options.effort);
19
+ if (options.resumeSessionId)
20
+ args.push("--resume", options.resumeSessionId);
21
+ args.push(options.prompt);
22
+ return args;
23
+ }
24
+ export class ClaudeDriver extends SessionDriver {
6
25
  id = "claude";
7
- handles = new Map();
26
+ hooks = createRuntimeHooks({
27
+ parse: parseClaudeLine,
28
+ nativeKeys: ["session_id", "sessionId"],
29
+ harness: "Claude",
30
+ });
31
+ resumeError = "No native session id available for resume";
32
+ buildArgs(options) {
33
+ return buildClaudeArgs(options);
34
+ }
8
35
  capabilities() {
9
36
  return {
10
37
  streaming: true,
@@ -22,16 +49,10 @@ export class ClaudeDriver {
22
49
  const res = await detectBinary("claude");
23
50
  if (!res.installed)
24
51
  return { installed: false, error: "claude binary not found" };
25
- // Try to check auth via claude --version? Or check config
26
- // Do a lightweight check: try to run claude --help quickly
27
- // For auth, we can check if ANTHROPIC_API_KEY or OAuth token exists
28
- // Simplify: if binary exists, authenticated = true if we can run a dummy print? Too heavy
29
- // Check for ~/.claude/.credentials.json or ANTHROPIC_API_KEY
52
+ // Lightweight auth heuristic: a credentials file or an env token counts as
53
+ // authenticated; otherwise unknown driving decides.
30
54
  let authenticated;
31
55
  try {
32
- const fs = await import("node:fs");
33
- const os = await import("node:os");
34
- const path = await import("node:path");
35
56
  const credPath = path.join(os.homedir(), ".claude", ".credentials.json");
36
57
  if (fs.existsSync(credPath))
37
58
  authenticated = true;
@@ -51,197 +72,5 @@ export class ClaudeDriver {
51
72
  details: "stream-json via claude -p",
52
73
  };
53
74
  }
54
- async start(options) {
55
- const args = ["-p", "--output-format", "stream-json", "--verbose"];
56
- // Use bypass permissions for automation (as spec allows)
57
- args.push("--dangerously-skip-permissions");
58
- if (options.model) {
59
- args.push("--model", options.model);
60
- }
61
- if (options.resumeSessionId) {
62
- args.push("--resume", options.resumeSessionId);
63
- }
64
- // prompt as final arg
65
- args.push(options.prompt);
66
- const proc = spawn("claude", args, {
67
- cwd: options.cwd,
68
- env: { ...process.env },
69
- stdio: ["pipe", "pipe", "pipe"],
70
- });
71
- proc.stdin?.end();
72
- const emitter = new EventEmitter();
73
- const buffer = [];
74
- let nativeSessionId = options.resumeSessionId;
75
- let done = false;
76
- let exitCode = null;
77
- const push = (ev) => {
78
- // Enrich sessionId
79
- ev.sessionId = options.sessionId;
80
- if (ev.nativeSessionId)
81
- nativeSessionId = ev.nativeSessionId;
82
- // Also try to extract session_id from raw
83
- if (!nativeSessionId && ev.raw?.session_id)
84
- nativeSessionId = ev.raw.session_id;
85
- if (!nativeSessionId && ev.raw?.sessionId)
86
- nativeSessionId = ev.raw.sessionId;
87
- buffer.push(ev);
88
- emitter.emit("event", ev);
89
- };
90
- // Handle stdout lines
91
- createLineReader(proc.stdout, (line) => {
92
- const evs = parseClaudeLine(line, options.sessionId);
93
- for (const ev of evs)
94
- push(ev);
95
- // Fallback: try to extract session_id even if no event
96
- try {
97
- const obj = JSON.parse(line);
98
- if (obj.session_id && !nativeSessionId)
99
- nativeSessionId = obj.session_id;
100
- if (obj.sessionId && !nativeSessionId)
101
- nativeSessionId = obj.sessionId;
102
- }
103
- catch { }
104
- });
105
- let stderrBuf = "";
106
- proc.stderr?.on("data", (c) => (stderrBuf += c.toString()));
107
- proc.on("close", (code) => {
108
- exitCode = code;
109
- done = true;
110
- if (buffer.length === 0 || !buffer.some((e) => e.type === "session.completed" || e.type === "session.failed")) {
111
- if (code === 0) {
112
- push({
113
- type: "session.completed",
114
- sessionId: options.sessionId,
115
- timestamp: new Date().toISOString(),
116
- reason: "exit 0",
117
- exitCode: 0,
118
- raw: { stderr: stderrBuf.slice(0, 2000) },
119
- });
120
- }
121
- else {
122
- push({
123
- type: "session.failed",
124
- sessionId: options.sessionId,
125
- timestamp: new Date().toISOString(),
126
- error: stderrBuf.slice(0, 2000) || `Claude exited with code ${code}`,
127
- exitCode: code ?? 1,
128
- raw: { stderr: stderrBuf.slice(0, 2000) },
129
- });
130
- }
131
- }
132
- emitter.emit("done");
133
- });
134
- proc.on("error", (err) => {
135
- push({
136
- type: "session.failed",
137
- sessionId: options.sessionId,
138
- timestamp: new Date().toISOString(),
139
- error: err.message,
140
- raw: err,
141
- });
142
- done = true;
143
- emitter.emit("done");
144
- });
145
- const handle = { proc, emitter, buffer, done, exitCode, nativeSessionId };
146
- this.handles.set(options.sessionId, handle);
147
- // Wait a tick to capture initial events? Return immediately
148
- // Native session id will be discovered asynchronously; daemon can poll handle.nativeSessionId
149
- return {
150
- id: options.sessionId,
151
- nativeSessionId,
152
- pid: proc.pid,
153
- cwd: options.cwd,
154
- model: options.model,
155
- handle,
156
- };
157
- }
158
- async send(session, message) {
159
- const h = this.handles.get(session.id);
160
- // For claude, send means resume with new message as new process
161
- // We don't have persistent stdin; we start a new process with --resume
162
- if (!session.nativeSessionId && h?.nativeSessionId) {
163
- session.nativeSessionId = h.nativeSessionId;
164
- }
165
- // If no nativeSessionId, we can't resume; throw
166
- if (!session.nativeSessionId) {
167
- throw new Error("No native session id available for resume");
168
- }
169
- // Spawn a new process for the follow-up turn, replace handle
170
- const newSession = await this.start({
171
- sessionId: session.id,
172
- prompt: message,
173
- cwd: session.cwd,
174
- model: session.model,
175
- resumeSessionId: session.nativeSessionId,
176
- });
177
- // Update session handle reference
178
- session.pid = newSession.pid;
179
- session.handle = newSession.handle;
180
- session.nativeSessionId = newSession.nativeSessionId || session.nativeSessionId;
181
- }
182
- async stop(session) {
183
- const h = this.handles.get(session.id);
184
- const proc = (h?.proc ?? session.handle?.proc);
185
- if (!proc || proc.killed)
186
- return;
187
- try {
188
- proc.kill("SIGTERM");
189
- await new Promise((resolve) => {
190
- let done = false;
191
- const t = setTimeout(() => {
192
- if (!done) {
193
- try {
194
- proc.kill("SIGKILL");
195
- }
196
- catch { }
197
- done = true;
198
- resolve();
199
- }
200
- }, 3000);
201
- proc.once("close", () => {
202
- if (!done) {
203
- clearTimeout(t);
204
- done = true;
205
- resolve();
206
- }
207
- });
208
- });
209
- }
210
- catch { }
211
- }
212
- async *events(session) {
213
- const h = this.handles.get(session.id);
214
- if (!h)
215
- return;
216
- let idx = 0;
217
- while (true) {
218
- while (idx < h.buffer.length) {
219
- yield h.buffer[idx++];
220
- }
221
- if (h.done && idx >= h.buffer.length)
222
- break;
223
- await new Promise((resolve) => {
224
- const onEvent = () => {
225
- h.emitter.off("event", onEvent);
226
- h.emitter.off("done", onDone);
227
- resolve();
228
- };
229
- const onDone = () => {
230
- h.emitter.off("event", onEvent);
231
- h.emitter.off("done", onDone);
232
- resolve();
233
- };
234
- h.emitter.once("event", onEvent);
235
- h.emitter.once("done", onDone);
236
- });
237
- }
238
- }
239
- // Helper for daemon to poll native id
240
- getNativeId(sessionId) {
241
- return this.handles.get(sessionId)?.nativeSessionId;
242
- }
243
- getHandle(sessionId) {
244
- return this.handles.get(sessionId);
245
- }
246
75
  }
247
76
  //# sourceMappingURL=driver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"driver.js","sourceRoot":"","sources":["../../../src/drivers/claude/driver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"driver.js","sourceRoot":"","sources":["../../../src/drivers/claude/driver.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,70 @@
1
- import { spawn } from "node:child_process";
2
- import { detectBinary, createLineReader } from "../helpers.js";
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { detectBinary } from "../helpers.js";
3
5
  import { parseCodexLine } from "./parser.js";
4
- import { EventEmitter } from "node:events";
5
- export class CodexDriver {
6
+ import { createRuntimeHooks, SessionDriver } from "../session-driver.js";
7
+ // Arg building is a pure function so the flag spellings can be tested without
8
+ // spawning codex. Measured against codex-cli 0.150.1.
9
+ export function buildCodexArgs(options) {
10
+ // resume is a SUBCOMMAND with its own arg list; every flag below has to be
11
+ // mirrored onto it or `send()` silently runs with different settings than
12
+ // `start()` did.
13
+ const args = options.resumeSessionId
14
+ ? ["exec", "resume", options.resumeSessionId, "--json"]
15
+ : ["exec", "--json"];
16
+ if (options.model)
17
+ args.push("-m", options.model);
18
+ // Without this codex uses its read-only default and rejects every patch with
19
+ // "writing is blocked by read-only sandbox" -- while still exiting 0, so the
20
+ // session is recorded as completed despite having written nothing.
21
+ args.push("-s", "workspace-write");
22
+ // codex has no dedicated flags for these; both are config overrides whose
23
+ // values are parsed as TOML, hence the embedded quotes.
24
+ if (options.effort)
25
+ args.push("-c", `model_reasoning_effort="${options.effort}"`);
26
+ if (options.fast)
27
+ args.push("-c", 'service_tier="priority"');
28
+ args.push("--skip-git-repo-check");
29
+ args.push("-C", options.cwd);
30
+ args.push(options.prompt);
31
+ return args;
32
+ }
33
+ // Tool-level failures (sandbox denials, approval refusals) are logged to stderr
34
+ // by the Rust core and NEVER appear as JSON frames on stdout. Without this the
35
+ // only trace is an agent message saying it could not do the work, followed by a
36
+ // clean turn.completed.
37
+ export function parseCodexStderrLine(line, sessionId) {
38
+ const match = /\bERROR\b\s+(.+)$/.exec(line);
39
+ if (!match)
40
+ return null;
41
+ let message = match[1].trim();
42
+ // Drop the `<rust::module::path>: error=` prefix; keep the human part.
43
+ const marker = message.indexOf("error=");
44
+ if (marker !== -1)
45
+ message = message.slice(marker + "error=".length).trim();
46
+ if (!message)
47
+ return null;
48
+ return {
49
+ type: "error",
50
+ sessionId,
51
+ timestamp: new Date().toISOString(),
52
+ error: message,
53
+ raw: { stderr: line },
54
+ };
55
+ }
56
+ export class CodexDriver extends SessionDriver {
6
57
  id = "codex";
7
- handles = new Map();
58
+ hooks = createRuntimeHooks({
59
+ parse: parseCodexLine,
60
+ parseStderr: parseCodexStderrLine,
61
+ nativeKeys: ["thread_id", "threadId"],
62
+ harness: "Codex",
63
+ });
64
+ resumeError = "No native session id for Codex resume";
65
+ buildArgs(options) {
66
+ return buildCodexArgs(options);
67
+ }
8
68
  capabilities() {
9
69
  return {
10
70
  streaming: true,
@@ -26,9 +86,6 @@ export class CodexDriver {
26
86
  // Simplify: check CODEX env or config
27
87
  let authenticated;
28
88
  try {
29
- const fs = await import("node:fs");
30
- const os = await import("node:os");
31
- const path = await import("node:path");
32
89
  const home = process.env.CODEX_HOME || path.join(os.homedir(), ".codex");
33
90
  if (fs.existsSync(path.join(home, "auth.json")) || fs.existsSync(path.join(home, "config.toml"))) {
34
91
  // not definitive but assume authenticated if file exists
@@ -40,202 +97,5 @@ export class CodexDriver {
40
97
  catch { }
41
98
  return { installed: true, path: res.path, version: res.version, authenticated, details: "codex exec --json" };
42
99
  }
43
- async start(options) {
44
- const args = ["exec", "--json"];
45
- // Model
46
- if (options.model)
47
- args.push("-m", options.model);
48
- // Sandbox: use workspace-write for automation; allow tests to run
49
- args.push("--skip-git-repo-check");
50
- // Ensure cwd
51
- args.push("-C", options.cwd);
52
- // If resume, we need to use codex exec resume <id> instead
53
- // But for MVP start with prompt arg; codex exec resume expects prior thread id
54
- if (options.resumeSessionId) {
55
- // Use resume subcommand: codex exec resume --json <id> "prompt"
56
- // Actually shape: codex exec resume <thread_id> --json?
57
- // Check help: codex exec resume --help shows?
58
- // We observed: codex exec resume <id>
59
- // Simpler: try codex exec resume <nativeId> --json
60
- // We'll build alternative arg list
61
- const resumeArgs = ["exec", "resume", options.resumeSessionId, "--json", "--skip-git-repo-check", "-C", options.cwd];
62
- if (options.model)
63
- resumeArgs.push("-m", options.model);
64
- resumeArgs.push(options.prompt);
65
- return this.spawnWithArgs(resumeArgs, options);
66
- }
67
- args.push(options.prompt);
68
- return this.spawnWithArgs(args, options);
69
- }
70
- async spawnWithArgs(args, options) {
71
- const proc = spawn("codex", args, {
72
- cwd: options.cwd,
73
- env: { ...process.env },
74
- stdio: ["pipe", "pipe", "pipe"],
75
- });
76
- proc.stdin?.end();
77
- const emitter = new EventEmitter();
78
- const buffer = [];
79
- let nativeId = options.resumeSessionId;
80
- let done = false;
81
- let exitCode = null;
82
- const push = (ev) => {
83
- ev.sessionId = options.sessionId;
84
- if (ev.nativeSessionId)
85
- nativeId = ev.nativeSessionId;
86
- if (!nativeId && ev.raw?.thread_id)
87
- nativeId = ev.raw.thread_id;
88
- if (!nativeId && ev.raw?.threadId)
89
- nativeId = ev.raw.threadId;
90
- buffer.push(ev);
91
- emitter.emit("event", ev);
92
- };
93
- createLineReader(proc.stdout, (line) => {
94
- // Codex may emit empty or prefix "Reading additional input" on stderr, not stdout
95
- // Assume JSON lines
96
- const evs = parseCodexLine(line, options.sessionId);
97
- if (evs.length) {
98
- for (const ev of evs)
99
- push(ev);
100
- }
101
- else {
102
- // Try to extract thread_id anyway
103
- try {
104
- const obj = JSON.parse(line);
105
- if (obj.thread_id && !nativeId)
106
- nativeId = obj.thread_id;
107
- if (obj.threadId && !nativeId)
108
- nativeId = obj.threadId;
109
- }
110
- catch { }
111
- }
112
- });
113
- let stderrBuf = "";
114
- proc.stderr?.on("data", (c) => (stderrBuf += c.toString()));
115
- proc.on("close", (code) => {
116
- exitCode = code;
117
- done = true;
118
- // If not already completed/failed, emit final
119
- const hasTerminal = buffer.some((e) => e.type === "session.completed" || e.type === "session.failed");
120
- if (!hasTerminal) {
121
- if (code === 0) {
122
- push({
123
- type: "session.completed",
124
- sessionId: options.sessionId,
125
- timestamp: new Date().toISOString(),
126
- reason: "exit 0",
127
- exitCode: 0,
128
- raw: { stderr: stderrBuf.slice(0, 2000) },
129
- });
130
- }
131
- else {
132
- push({
133
- type: "session.failed",
134
- sessionId: options.sessionId,
135
- timestamp: new Date().toISOString(),
136
- error: stderrBuf.slice(0, 2000) || `Codex exited with code ${code}`,
137
- exitCode: code ?? 1,
138
- raw: { stderr: stderrBuf.slice(0, 2000) },
139
- });
140
- }
141
- }
142
- emitter.emit("done");
143
- });
144
- proc.on("error", (err) => {
145
- push({
146
- type: "session.failed",
147
- sessionId: options.sessionId,
148
- timestamp: new Date().toISOString(),
149
- error: err.message,
150
- raw: err,
151
- });
152
- done = true;
153
- emitter.emit("done");
154
- });
155
- const handle = { proc, emitter, buffer, done, exitCode, nativeSessionId: nativeId };
156
- this.handles.set(options.sessionId, handle);
157
- // Also watch for nativeId extracted lazily; update handle reference
158
- const pollNative = setInterval(() => {
159
- if (nativeId)
160
- handle.nativeSessionId = nativeId;
161
- if (done)
162
- clearInterval(pollNative);
163
- }, 100);
164
- setTimeout(() => clearInterval(pollNative), 5000);
165
- return {
166
- id: options.sessionId,
167
- nativeSessionId: nativeId,
168
- pid: proc.pid,
169
- cwd: options.cwd,
170
- model: options.model,
171
- handle,
172
- };
173
- }
174
- async send(session, message) {
175
- const h = this.handles.get(session.id);
176
- let nativeId = session.nativeSessionId || h?.nativeSessionId;
177
- if (!nativeId)
178
- throw new Error("No native session id for Codex resume");
179
- const newSession = await this.start({
180
- sessionId: session.id,
181
- prompt: message,
182
- cwd: session.cwd,
183
- model: session.model,
184
- resumeSessionId: nativeId,
185
- });
186
- session.pid = newSession.pid;
187
- session.handle = newSession.handle;
188
- session.nativeSessionId = newSession.handle?.nativeSessionId || nativeId;
189
- }
190
- async stop(session) {
191
- const h = this.handles.get(session.id);
192
- const proc = (h?.proc ?? session.handle?.proc);
193
- if (!proc || proc.killed)
194
- return;
195
- try {
196
- proc.kill("SIGTERM");
197
- await new Promise((resolve) => {
198
- let done = false;
199
- const t = setTimeout(() => {
200
- if (!done) {
201
- try {
202
- proc.kill("SIGKILL");
203
- }
204
- catch { }
205
- ;
206
- done = true;
207
- resolve();
208
- }
209
- }, 3000);
210
- proc.once("close", () => { if (!done) {
211
- clearTimeout(t);
212
- done = true;
213
- resolve();
214
- } });
215
- });
216
- }
217
- catch { }
218
- }
219
- async *events(session) {
220
- const h = this.handles.get(session.id);
221
- if (!h)
222
- return;
223
- let idx = 0;
224
- while (true) {
225
- while (idx < h.buffer.length)
226
- yield h.buffer[idx++];
227
- if (h.done && idx >= h.buffer.length)
228
- break;
229
- await new Promise((resolve) => {
230
- const onEvent = () => { h.emitter.off("event", onEvent); h.emitter.off("done", onDone); resolve(); };
231
- const onDone = () => { h.emitter.off("event", onEvent); h.emitter.off("done", onDone); resolve(); };
232
- h.emitter.once("event", onEvent);
233
- h.emitter.once("done", onDone);
234
- });
235
- }
236
- }
237
- getHandle(sessionId) {
238
- return this.handles.get(sessionId);
239
- }
240
100
  }
241
101
  //# sourceMappingURL=driver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"driver.js","sourceRoot":"","sources":["../../../src/drivers/codex/driver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"driver.js","sourceRoot":"","sources":["../../../src/drivers/codex/driver.ts"],"names":[],"mappings":"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"}