codedeck 0.1.2 → 0.1.4

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 (48) hide show
  1. package/README.md +61 -3
  2. package/dist/cli/commands/logs.js +5 -1
  3. package/dist/cli/commands/logs.js.map +1 -1
  4. package/dist/cli/commands/run.js +91 -28
  5. package/dist/cli/commands/run.js.map +1 -1
  6. package/dist/cli/commands/show.js +4 -0
  7. package/dist/cli/commands/show.js.map +1 -1
  8. package/dist/cli/commands/wait.js +57 -0
  9. package/dist/cli/commands/wait.js.map +1 -0
  10. package/dist/cli/index.js +10 -1
  11. package/dist/cli/index.js.map +1 -1
  12. package/dist/cli/wait.js +44 -0
  13. package/dist/cli/wait.js.map +1 -0
  14. package/dist/core/driver.js +9 -1
  15. package/dist/core/driver.js.map +1 -1
  16. package/dist/core/errors.js +56 -0
  17. package/dist/core/errors.js.map +1 -1
  18. package/dist/core/events.js.map +1 -1
  19. package/dist/core/session.js.map +1 -1
  20. package/dist/daemon/daemon.js +316 -71
  21. package/dist/daemon/daemon.js.map +1 -1
  22. package/dist/drivers/claude/driver.js +34 -205
  23. package/dist/drivers/claude/driver.js.map +1 -1
  24. package/dist/drivers/codex/driver.js +65 -205
  25. package/dist/drivers/codex/driver.js.map +1 -1
  26. package/dist/drivers/helpers.js +47 -37
  27. package/dist/drivers/helpers.js.map +1 -1
  28. package/dist/drivers/omp/driver.js +38 -206
  29. package/dist/drivers/omp/driver.js.map +1 -1
  30. package/dist/drivers/opencode/driver.js +30 -182
  31. package/dist/drivers/opencode/driver.js.map +1 -1
  32. package/dist/drivers/session-driver.js +122 -0
  33. package/dist/drivers/session-driver.js.map +1 -0
  34. package/dist/drivers/session-runtime.js +333 -0
  35. package/dist/drivers/session-runtime.js.map +1 -0
  36. package/dist/drivers/tailer.js +149 -0
  37. package/dist/drivers/tailer.js.map +1 -0
  38. package/dist/drivers/terminal.js +53 -0
  39. package/dist/drivers/terminal.js.map +1 -0
  40. package/dist/store/database.js +28 -1
  41. package/dist/store/database.js.map +1 -1
  42. package/dist/store/events.js +8 -3
  43. package/dist/store/events.js.map +1 -1
  44. package/dist/store/sessions.js +27 -4
  45. package/dist/store/sessions.js.map +1 -1
  46. package/dist/utils/process.js +104 -4
  47. package/dist/utils/process.js.map +1 -1
  48. package/package.json +10 -2
@@ -0,0 +1,53 @@
1
+ import { classifyFailure } from "../core/errors.js";
2
+ // Pure so the exit-handler decision is testable without spawning a harness.
3
+ // When a harness dies it often does so WITHOUT emitting a terminal frame —
4
+ // the EPIPE/signal class of crash. This decides what the driver reports
5
+ // instead. A ghost "completed" is the one outcome it refuses to produce: an
6
+ // agent that sees completed proceeds on missing work, while a false "failed"
7
+ // only costs one retry of a retryable session.
8
+ export function synthesizeTerminalEvent(input) {
9
+ if (input.hasTerminal)
10
+ return null;
11
+ const ts = new Date().toISOString();
12
+ if (input.exitCode === 0) {
13
+ // Exit 0 with produced output is completion. Exit 0 with NO output but
14
+ // stderr content is how "exit 0 anyway" crashes look — treat as failure.
15
+ if (!input.hasMessage && input.stderr.trim()) {
16
+ return {
17
+ type: "session.failed",
18
+ sessionId: input.sessionId,
19
+ timestamp: ts,
20
+ error: input.stderr.slice(0, 2000),
21
+ exitCode: 0,
22
+ failure: classifyFailure(input.stderr, 0, input.signal ?? null),
23
+ raw: { stderr: input.stderr.slice(0, 2000) },
24
+ };
25
+ }
26
+ return {
27
+ type: "session.completed",
28
+ sessionId: input.sessionId,
29
+ timestamp: ts,
30
+ reason: "exit 0",
31
+ exitCode: 0,
32
+ raw: { stderr: input.stderr.slice(0, 2000) },
33
+ };
34
+ }
35
+ // exitCode null (signal death, or daemon was restarted and only learned of
36
+ // the death by polling the pid): there is no exit code to report — say so
37
+ // instead of inventing one.
38
+ const errorText = input.stderr.trim()
39
+ ? input.stderr.slice(0, 2000)
40
+ : input.exitCode != null
41
+ ? `${input.harness} exited with code ${input.exitCode}`
42
+ : `${input.harness} exited without reporting a terminal event`;
43
+ return {
44
+ type: "session.failed",
45
+ sessionId: input.sessionId,
46
+ timestamp: ts,
47
+ error: errorText,
48
+ exitCode: input.exitCode ?? 1,
49
+ failure: classifyFailure(input.stderr, input.exitCode, input.signal ?? null),
50
+ raw: { stderr: input.stderr.slice(0, 2000) },
51
+ };
52
+ }
53
+ //# sourceMappingURL=terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/drivers/terminal.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,4EAA4E;AAC5E,2EAA2E;AAC3E,wEAAwE;AACxE,4EAA4E;AAC5E,6EAA6E;AAC7E,+CAA+C;AAC/C,MAAM,UAAU,uBAAuB,CAAC,KAQvC;IACC,IAAI,KAAK,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpC,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QACzB,uEAAuE;QACvE,yEAAyE;QACzE,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7C,OAAO;gBACL,IAAI,EAAE,gBAAgB;gBACtB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,SAAS,EAAE,EAAE;gBACb,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;gBAClC,QAAQ,EAAE,CAAC;gBACX,OAAO,EAAE,eAAe,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC;gBAC/D,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE;aAC/B,CAAC;QAClB,CAAC;QACD,OAAO;YACL,IAAI,EAAE,mBAAmB;YACzB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,CAAC;YACX,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE;SAC/B,CAAC;IAClB,CAAC;IACD,2EAA2E;IAC3E,0EAA0E;IAC1E,4BAA4B;IAC5B,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;QACnC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;QAC7B,CAAC,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI;YACtB,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,qBAAqB,KAAK,CAAC,QAAQ,EAAE;YACvD,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,4CAA4C,CAAC;IACnE,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,EAAE;QACb,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,CAAC;QAC7B,OAAO,EAAE,eAAe,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC;QAC5E,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE;KAC/B,CAAC;AAClB,CAAC"}
@@ -32,6 +32,7 @@ export class Database {
32
32
  branch TEXT,
33
33
  base_commit TEXT,
34
34
  pid INTEGER,
35
+ pid_start_time TEXT,
35
36
  created_at TEXT NOT NULL,
36
37
  updated_at TEXT NOT NULL,
37
38
  completed_at TEXT,
@@ -39,7 +40,9 @@ export class Database {
39
40
  usage_output_tokens INTEGER,
40
41
  usage_cached_tokens INTEGER,
41
42
  usage_cost REAL,
42
- last_event TEXT
43
+ last_event TEXT,
44
+ effort TEXT,
45
+ fast INTEGER NOT NULL DEFAULT 0
43
46
  );
44
47
 
45
48
  CREATE TABLE IF NOT EXISTS events (
@@ -50,6 +53,7 @@ export class Database {
50
53
  timestamp TEXT NOT NULL,
51
54
  normalized_payload TEXT NOT NULL,
52
55
  raw_payload TEXT,
56
+ source_key TEXT,
53
57
  FOREIGN KEY(session_id) REFERENCES sessions(id) ON DELETE CASCADE
54
58
  );
55
59
 
@@ -57,6 +61,29 @@ export class Database {
57
61
  CREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions(status);
58
62
  CREATE INDEX IF NOT EXISTS idx_sessions_created ON sessions(created_at DESC);
59
63
  `);
64
+ this.addMissingColumns();
65
+ }
66
+ // CREATE TABLE IF NOT EXISTS is a no-op on databases that already exist, so
67
+ // columns added after the first release have to be applied explicitly or
68
+ // every existing ~/.run-agent/run-agent.db throws "no such column".
69
+ addMissingColumns() {
70
+ const existing = new Set(this.db.prepare(`PRAGMA table_info(sessions)`).all().map((c) => c.name));
71
+ const additions = [
72
+ ["effort", "TEXT"],
73
+ ["fast", "INTEGER NOT NULL DEFAULT 0"],
74
+ ["failure", "TEXT"],
75
+ ["log_offset", "INTEGER"],
76
+ ["stderr_offset", "INTEGER"],
77
+ ["pid_start_time", "TEXT"],
78
+ ];
79
+ for (const [name, type] of additions) {
80
+ if (!existing.has(name))
81
+ this.db.exec(`ALTER TABLE sessions ADD COLUMN ${name} ${type}`);
82
+ }
83
+ const eventColumns = new Set(this.db.prepare(`PRAGMA table_info(events)`).all().map((c) => c.name));
84
+ if (!eventColumns.has("source_key"))
85
+ this.db.exec(`ALTER TABLE events ADD COLUMN source_key TEXT`);
86
+ this.db.exec(`CREATE UNIQUE INDEX IF NOT EXISTS idx_events_source_key ON events(session_id, source_key) WHERE source_key IS NOT NULL`);
60
87
  }
61
88
  getHandle() {
62
89
  return this.db;
@@ -1 +1 @@
1
- {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/store/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,OAAO,QAAQ;IACX,EAAE,CAAe;IACjB,MAAM,CAAS;IAEvB,YAAY,MAAe;QACzB,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC;QAC7B,UAAU,EAAE,CAAC;QACb,2BAA2B;QAC3B,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,EAAE,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAEO,OAAO;QACb,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAyCZ,CAAC,CAAC;IACL,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AAED,IAAI,SAAS,GAAoB,IAAI,CAAC;AAEtC,MAAM,UAAU,WAAW,CAAC,MAAe;IACzC,IAAI,MAAM;QAAE,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,SAAS;QAAE,SAAS,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC3C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,IAAI,SAAS,EAAE,CAAC;QACd,SAAS,CAAC,KAAK,EAAE,CAAC;QAClB,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/store/database.ts"],"names":[],"mappings":"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"}
@@ -4,16 +4,21 @@ export class EventStore {
4
4
  this.db = db;
5
5
  }
6
6
  append(sessionId, event, raw) {
7
+ if (event.sourceKey) {
8
+ const existing = this.db.prepare(`SELECT sequence FROM events WHERE session_id = ? AND source_key = ? LIMIT 1`).get(sessionId, event.sourceKey);
9
+ if (existing)
10
+ return 0;
11
+ }
7
12
  // Get next sequence
8
13
  const row = this.db.prepare(`SELECT COALESCE(MAX(sequence), 0) as maxSeq FROM events WHERE session_id = ?`).get(sessionId);
9
14
  const nextSeq = (row?.maxSeq ?? 0) + 1;
10
15
  const normalized = JSON.stringify(event);
11
16
  const rawStr = raw !== undefined ? JSON.stringify(raw) : event.raw !== undefined ? JSON.stringify(event.raw) : null;
12
17
  const stmt = this.db.prepare(`
13
- INSERT INTO events (session_id, sequence, type, timestamp, normalized_payload, raw_payload)
14
- VALUES (?, ?, ?, ?, ?, ?)
18
+ INSERT INTO events (session_id, sequence, type, timestamp, normalized_payload, raw_payload, source_key)
19
+ VALUES (?, ?, ?, ?, ?, ?, ?)
15
20
  `);
16
- const info = stmt.run(sessionId, nextSeq, event.type, event.timestamp, normalized, rawStr);
21
+ stmt.run(sessionId, nextSeq, event.type, event.timestamp, normalized, rawStr, event.sourceKey ?? null);
17
22
  // Update session last_event and updatedAt?
18
23
  // Let daemon do it
19
24
  return nextSeq;
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/store/events.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,UAAU;IACD;IAApB,YAAoB,EAAgB;QAAhB,OAAE,GAAF,EAAE,CAAc;IAAG,CAAC;IAExC,MAAM,CAAC,SAAiB,EAAE,KAAiB,EAAE,GAAa;QACxD,oBAAoB;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,8EAA8E,CAAC,CAAC,GAAG,CAAC,SAAS,CAAuB,CAAC;QACjJ,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEpH,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAG5B,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAC3F,2CAA2C;QAC3C,mBAAmB;QACnB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,CAAC,SAAiB,EAAE,KAAK,GAAG,GAAG,EAAE,MAAM,GAAG,CAAC;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,kFAAkF,CACnF,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAA0B,CAAC;QACzD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAe,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,CAAC,SAAiB;QACvB,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,iEAAiE,CAAC,CAAC,GAAG,CAAC,SAAS,CAA0B,CAAC;IACpI,CAAC;IAED,KAAK,CAAC,SAAiB;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC,GAAG,CAAC,SAAS,CAAkB,CAAC;QACrH,OAAO,GAAG,CAAC,CAAC,CAAC;IACf,CAAC;IAED,IAAI,CAAC,SAAiB;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,0EAA0E,CAAC,CAAC,GAAG,CAAC,SAAS,CAAyB,CAAC;QAC/I,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAe,CAAC;IAC1D,CAAC;CACF"}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/store/events.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,UAAU;IACD;IAApB,YAAoB,EAAgB;QAAhB,OAAE,GAAF,EAAE,CAAc;IAAG,CAAC;IAExC,MAAM,CAAC,SAAiB,EAAE,KAAiB,EAAE,GAAa;QACxD,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC9B,6EAA6E,CAC9E,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAqC,CAAC;YACtE,IAAI,QAAQ;gBAAE,OAAO,CAAC,CAAC;QACzB,CAAC;QACD,oBAAoB;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,8EAA8E,CAAC,CAAC,GAAG,CAAC,SAAS,CAAuB,CAAC;QACjJ,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEpH,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAG5B,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;QACvG,2CAA2C;QAC3C,mBAAmB;QACnB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,CAAC,SAAiB,EAAE,KAAK,GAAG,GAAG,EAAE,MAAM,GAAG,CAAC;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,kFAAkF,CACnF,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAA0B,CAAC;QACzD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAe,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,CAAC,SAAiB;QACvB,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,iEAAiE,CAAC,CAAC,GAAG,CAAC,SAAS,CAA0B,CAAC;IACpI,CAAC;IAED,KAAK,CAAC,SAAiB;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC,GAAG,CAAC,SAAS,CAAkB,CAAC;QACrH,OAAO,GAAG,CAAC,CAAC,CAAC;IACf,CAAC;IAED,IAAI,CAAC,SAAiB;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,0EAA0E,CAAC,CAAC,GAAG,CAAC,SAAS,CAAyB,CAAC;QAC/I,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAe,CAAC;IAC1D,CAAC;CACF"}
@@ -1,10 +1,23 @@
1
1
  function rowToSession(row) {
2
+ // `failure` is stored as JSON text; tolerate a corrupt blob rather than
3
+ // losing the whole session row over it.
4
+ let failure;
5
+ if (row.failure) {
6
+ try {
7
+ failure = JSON.parse(row.failure);
8
+ }
9
+ catch { }
10
+ }
2
11
  return {
3
12
  id: row.id,
4
13
  name: row.name ?? undefined,
5
14
  agent: row.agent,
6
15
  nativeSessionId: row.native_session_id ?? undefined,
7
16
  model: row.model ?? undefined,
17
+ effort: row.effort ?? undefined,
18
+ // Stored as INTEGER; normalise to a real boolean so `ps --json` and the
19
+ // resume path never see 0/1/null.
20
+ fast: !!row.fast,
8
21
  status: row.status,
9
22
  repository: row.repository ?? undefined,
10
23
  cwd: row.cwd,
@@ -12,6 +25,7 @@ function rowToSession(row) {
12
25
  branch: row.branch ?? undefined,
13
26
  baseCommit: row.base_commit ?? undefined,
14
27
  pid: row.pid ?? undefined,
28
+ pidStartTime: row.pid_start_time ?? undefined,
15
29
  createdAt: new Date(row.created_at),
16
30
  updatedAt: new Date(row.updated_at),
17
31
  completedAt: row.completed_at ? new Date(row.completed_at) : undefined,
@@ -26,6 +40,9 @@ function rowToSession(row) {
26
40
  }
27
41
  : undefined,
28
42
  lastEvent: row.last_event ?? undefined,
43
+ failure,
44
+ logOffset: row.log_offset ?? undefined,
45
+ stderrOffset: row.stderr_offset ?? undefined,
29
46
  };
30
47
  }
31
48
  export class SessionStore {
@@ -38,12 +55,12 @@ export class SessionStore {
38
55
  INSERT INTO sessions (
39
56
  id, name, agent, native_session_id, model, status,
40
57
  repository, cwd, worktree, branch, base_commit, pid,
41
- created_at, updated_at, completed_at,
58
+ pid_start_time, created_at, updated_at, completed_at,
42
59
  usage_input_tokens, usage_output_tokens, usage_cached_tokens, usage_cost,
43
- last_event
44
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
60
+ last_event, effort, fast, failure, log_offset, stderr_offset
61
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
45
62
  `);
46
- stmt.run(session.id, session.name ?? null, session.agent, session.nativeSessionId ?? null, session.model ?? null, session.status, session.repository ?? null, session.cwd, session.worktree ?? null, session.branch ?? null, session.baseCommit ?? null, session.pid ?? null, session.createdAt.toISOString(), session.updatedAt.toISOString(), session.completedAt ? session.completedAt.toISOString() : null, session.usage?.inputTokens ?? null, session.usage?.outputTokens ?? null, session.usage?.cachedTokens ?? null, session.usage?.cost ?? null, session.lastEvent ?? null);
63
+ stmt.run(session.id, session.name ?? null, session.agent, session.nativeSessionId ?? null, session.model ?? null, session.status, session.repository ?? null, session.cwd, session.worktree ?? null, session.branch ?? null, session.baseCommit ?? null, session.pid ?? null, session.pidStartTime ?? null, session.createdAt.toISOString(), session.updatedAt.toISOString(), session.completedAt ? session.completedAt.toISOString() : null, session.usage?.inputTokens ?? null, session.usage?.outputTokens ?? null, session.usage?.cachedTokens ?? null, session.usage?.cost ?? null, session.lastEvent ?? null, session.effort ?? null, session.fast ? 1 : 0, session.failure ? JSON.stringify(session.failure) : null, session.logOffset ?? null, session.stderrOffset ?? null);
47
64
  }
48
65
  get(id) {
49
66
  // Support prefix matching like git short hash: if exact not found, try prefix
@@ -93,6 +110,12 @@ export class SessionStore {
93
110
  usage_cached_tokens: patch.usage?.cachedTokens,
94
111
  usage_cost: patch.usage?.cost,
95
112
  last_event: patch.lastEvent,
113
+ effort: patch.effort,
114
+ fast: patch.fast === undefined ? undefined : patch.fast ? 1 : 0,
115
+ pid_start_time: patch.pidStartTime,
116
+ log_offset: patch.logOffset,
117
+ stderr_offset: patch.stderrOffset,
118
+ failure: patch.failure === undefined ? undefined : JSON.stringify(patch.failure),
96
119
  };
97
120
  for (const [col, val] of Object.entries(map)) {
98
121
  if (val !== undefined) {
@@ -1 +1 @@
1
- {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/store/sessions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/store/sessions.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,7 @@
1
- import { execSync } from "node:child_process";
1
+ import { execFile, execSync } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import { promisify } from "node:util";
4
+ const execFileAsync = promisify(execFile);
2
5
  export function which(cmd) {
3
6
  try {
4
7
  const out = execSync(`which ${cmd} 2>/dev/null`, { encoding: "utf-8" }).trim();
@@ -8,15 +11,112 @@ export function which(cmd) {
8
11
  return null;
9
12
  }
10
13
  }
14
+ export function sleep(ms) {
15
+ const { promise, resolve } = Promise.withResolvers();
16
+ setTimeout(resolve, ms);
17
+ return promise;
18
+ }
19
+ export function processAlive(pid) {
20
+ try {
21
+ process.kill(pid, 0);
22
+ return true;
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ export function processGroupAlive(pid) {
29
+ try {
30
+ process.kill(-pid, 0);
31
+ return true;
32
+ }
33
+ catch {
34
+ return false;
35
+ }
36
+ }
37
+ // Linux exposes a monotonic process start tick in /proc/<pid>/stat. Persisting
38
+ // it beside the PID closes the reuse race: after a daemon restart, a recycled
39
+ // PID is not mistaken for the harness that CodeDeck launched.
40
+ export function processStartTime(pid) {
41
+ try {
42
+ const stat = fs.readFileSync(`/proc/${pid}/stat`, "utf8");
43
+ const commEnd = stat.lastIndexOf(")");
44
+ if (commEnd < 0)
45
+ return undefined;
46
+ const fields = stat.slice(commEnd + 2).trim().split(/\s+/);
47
+ // The slice starts at field 3 (state); starttime is field 22.
48
+ return fields[19] || undefined;
49
+ }
50
+ catch {
51
+ return undefined;
52
+ }
53
+ }
54
+ // Harnesses run detached in their own process group, so signal the GROUP:
55
+ // they spawn children of their own (omp sub-agents) that must die with them.
56
+ // If an expected start time is supplied, refuse to signal a recycled PID.
57
+ export async function killTree(pid, graceMs = 3000, expectedStartTime) {
58
+ const matchesExpectedLeader = () => {
59
+ if (expectedStartTime === undefined)
60
+ return true;
61
+ const current = processStartTime(pid);
62
+ return current !== undefined && current === expectedStartTime;
63
+ };
64
+ let groupSignaled = false;
65
+ const canSignalGroup = () => matchesExpectedLeader() || (!processAlive(pid) && processGroupAlive(pid));
66
+ const signal = (sig, allowGroupAfterLeaderExit = false) => {
67
+ if (!allowGroupAfterLeaderExit && !canSignalGroup())
68
+ return false;
69
+ try {
70
+ process.kill(-pid, sig);
71
+ if (sig === "SIGTERM")
72
+ groupSignaled = true;
73
+ return true;
74
+ }
75
+ catch {
76
+ if (allowGroupAfterLeaderExit)
77
+ return false;
78
+ // The group may disappear between the group signal and this fallback.
79
+ // Recheck identity immediately before signaling a positive PID.
80
+ if (!matchesExpectedLeader())
81
+ return false;
82
+ try {
83
+ process.kill(pid, sig);
84
+ return true;
85
+ }
86
+ catch {
87
+ return false;
88
+ }
89
+ }
90
+ };
91
+ if (!signal("SIGTERM"))
92
+ return;
93
+ const deadline = Date.now() + graceMs;
94
+ while (Date.now() < deadline) {
95
+ const leaderAlive = processAlive(pid);
96
+ const groupAlive = processGroupAlive(pid);
97
+ if (!leaderAlive && !groupAlive)
98
+ break;
99
+ if (leaderAlive && !matchesExpectedLeader())
100
+ break;
101
+ await sleep(150);
102
+ }
103
+ // If TERM let the leader exit but a sub-process remains in its original
104
+ // group, escalate the already-signaled group. Do not guess at a new PID.
105
+ if (processGroupAlive(pid) && (groupSignaled || expectedStartTime === undefined)) {
106
+ signal("SIGKILL", true);
107
+ }
108
+ else if (processAlive(pid) && matchesExpectedLeader()) {
109
+ signal("SIGKILL");
110
+ }
111
+ // Settle window so a follow-up start() doesn't race the dying process.
112
+ await sleep(100);
113
+ }
11
114
  export async function detectBinary(cmd) {
12
115
  const path = which(cmd);
13
116
  if (!path)
14
117
  return { installed: false };
15
118
  let version;
16
119
  try {
17
- const { execFile } = await import("node:child_process");
18
- const { promisify } = await import("node:util");
19
- const execFileAsync = promisify(execFile);
20
120
  try {
21
121
  const { stdout } = await execFileAsync(cmd, ["--version"], { timeout: 5000 });
22
122
  version = stdout.trim().split("\n")[0].slice(0, 100);
@@ -1 +1 @@
1
- {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/utils/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAOxE,MAAM,UAAU,KAAK,CAAC,GAAW;IAC/B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,GAAG,cAAc,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/E,OAAO,GAAG,IAAI,IAAI,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACvC,IAAI,OAA2B,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACxD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9E,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC;gBACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC3E,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACvD,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/utils/process.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codedeck",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "CodeDeck, a local runtime for coding agents with session management, process supervision, event normalization, and git isolation",
5
5
  "type": "module",
6
6
  "bin": {
@@ -18,7 +18,15 @@
18
18
  "doctor": "node dist/cli/index.js doctor",
19
19
  "prepublishOnly": "npm run build && npm test"
20
20
  },
21
- "keywords": ["agent", "coding-agent", "runtime", "claude", "codex", "opencode", "omp"],
21
+ "keywords": [
22
+ "agent",
23
+ "coding-agent",
24
+ "runtime",
25
+ "claude",
26
+ "codex",
27
+ "opencode",
28
+ "omp"
29
+ ],
22
30
  "author": "",
23
31
  "license": "MIT",
24
32
  "repository": {