codedeck 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 (72) hide show
  1. package/README.md +211 -0
  2. package/dist/cli/commands/diff.js +43 -0
  3. package/dist/cli/commands/diff.js.map +1 -0
  4. package/dist/cli/commands/doctor.js +90 -0
  5. package/dist/cli/commands/doctor.js.map +1 -0
  6. package/dist/cli/commands/logs.js +139 -0
  7. package/dist/cli/commands/logs.js.map +1 -0
  8. package/dist/cli/commands/ps.js +59 -0
  9. package/dist/cli/commands/ps.js.map +1 -0
  10. package/dist/cli/commands/run.js +145 -0
  11. package/dist/cli/commands/run.js.map +1 -0
  12. package/dist/cli/commands/send.js +29 -0
  13. package/dist/cli/commands/send.js.map +1 -0
  14. package/dist/cli/commands/show.js +99 -0
  15. package/dist/cli/commands/show.js.map +1 -0
  16. package/dist/cli/commands/stop.js +27 -0
  17. package/dist/cli/commands/stop.js.map +1 -0
  18. package/dist/cli/index.js +63 -0
  19. package/dist/cli/index.js.map +1 -0
  20. package/dist/config/config.js +26 -0
  21. package/dist/config/config.js.map +1 -0
  22. package/dist/config/paths.js +43 -0
  23. package/dist/config/paths.js.map +1 -0
  24. package/dist/core/capabilities.js +14 -0
  25. package/dist/core/capabilities.js.map +1 -0
  26. package/dist/core/driver.js +2 -0
  27. package/dist/core/driver.js.map +1 -0
  28. package/dist/core/errors.js +61 -0
  29. package/dist/core/errors.js.map +1 -0
  30. package/dist/core/events.js +10 -0
  31. package/dist/core/events.js.map +1 -0
  32. package/dist/core/session.js +33 -0
  33. package/dist/core/session.js.map +1 -0
  34. package/dist/daemon/daemon.js +534 -0
  35. package/dist/daemon/daemon.js.map +1 -0
  36. package/dist/daemon/ipc.js +292 -0
  37. package/dist/daemon/ipc.js.map +1 -0
  38. package/dist/daemon/process-manager.js +55 -0
  39. package/dist/daemon/process-manager.js.map +1 -0
  40. package/dist/daemon/protocol.js +2 -0
  41. package/dist/daemon/protocol.js.map +1 -0
  42. package/dist/drivers/claude/driver.js +247 -0
  43. package/dist/drivers/claude/driver.js.map +1 -0
  44. package/dist/drivers/claude/parser.js +184 -0
  45. package/dist/drivers/claude/parser.js.map +1 -0
  46. package/dist/drivers/codex/driver.js +241 -0
  47. package/dist/drivers/codex/driver.js.map +1 -0
  48. package/dist/drivers/codex/parser.js +184 -0
  49. package/dist/drivers/codex/parser.js.map +1 -0
  50. package/dist/drivers/helpers.js +85 -0
  51. package/dist/drivers/helpers.js.map +1 -0
  52. package/dist/drivers/omp/driver.js +372 -0
  53. package/dist/drivers/omp/driver.js.map +1 -0
  54. package/dist/drivers/opencode/driver.js +307 -0
  55. package/dist/drivers/opencode/driver.js.map +1 -0
  56. package/dist/drivers/registry.js +48 -0
  57. package/dist/drivers/registry.js.map +1 -0
  58. package/dist/git/diff.js +100 -0
  59. package/dist/git/diff.js.map +1 -0
  60. package/dist/git/repository.js +68 -0
  61. package/dist/git/repository.js.map +1 -0
  62. package/dist/git/worktree.js +89 -0
  63. package/dist/git/worktree.js.map +1 -0
  64. package/dist/store/database.js +85 -0
  65. package/dist/store/database.js.map +1 -0
  66. package/dist/store/events.js +39 -0
  67. package/dist/store/events.js.map +1 -0
  68. package/dist/store/sessions.js +128 -0
  69. package/dist/store/sessions.js.map +1 -0
  70. package/dist/utils/process.js +35 -0
  71. package/dist/utils/process.js.map +1 -0
  72. package/package.json +43 -0
@@ -0,0 +1,85 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { DatabaseSync } from "node:sqlite";
4
+ import { getPaths, ensureDirs } from "../config/paths.js";
5
+ export class Database {
6
+ db;
7
+ dbPath;
8
+ constructor(dbPath) {
9
+ const p = getPaths();
10
+ this.dbPath = dbPath ?? p.db;
11
+ ensureDirs();
12
+ // Ensure parent dir exists
13
+ fs.mkdirSync(path.dirname(this.dbPath), { recursive: true });
14
+ this.db = new DatabaseSync(this.dbPath);
15
+ this.migrate();
16
+ }
17
+ migrate() {
18
+ this.db.exec(`
19
+ PRAGMA journal_mode = WAL;
20
+ PRAGMA foreign_keys = ON;
21
+
22
+ CREATE TABLE IF NOT EXISTS sessions (
23
+ id TEXT PRIMARY KEY,
24
+ name TEXT,
25
+ agent TEXT NOT NULL,
26
+ native_session_id TEXT,
27
+ model TEXT,
28
+ status TEXT NOT NULL,
29
+ repository TEXT,
30
+ cwd TEXT NOT NULL,
31
+ worktree TEXT,
32
+ branch TEXT,
33
+ base_commit TEXT,
34
+ pid INTEGER,
35
+ created_at TEXT NOT NULL,
36
+ updated_at TEXT NOT NULL,
37
+ completed_at TEXT,
38
+ usage_input_tokens INTEGER,
39
+ usage_output_tokens INTEGER,
40
+ usage_cached_tokens INTEGER,
41
+ usage_cost REAL,
42
+ last_event TEXT
43
+ );
44
+
45
+ CREATE TABLE IF NOT EXISTS events (
46
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
47
+ session_id TEXT NOT NULL,
48
+ sequence INTEGER NOT NULL,
49
+ type TEXT NOT NULL,
50
+ timestamp TEXT NOT NULL,
51
+ normalized_payload TEXT NOT NULL,
52
+ raw_payload TEXT,
53
+ FOREIGN KEY(session_id) REFERENCES sessions(id) ON DELETE CASCADE
54
+ );
55
+
56
+ CREATE INDEX IF NOT EXISTS idx_events_session_seq ON events(session_id, sequence);
57
+ CREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions(status);
58
+ CREATE INDEX IF NOT EXISTS idx_sessions_created ON sessions(created_at DESC);
59
+ `);
60
+ }
61
+ getHandle() {
62
+ return this.db;
63
+ }
64
+ close() {
65
+ this.db.close();
66
+ }
67
+ getPath() {
68
+ return this.dbPath;
69
+ }
70
+ }
71
+ let singleton = null;
72
+ export function getDatabase(dbPath) {
73
+ if (dbPath)
74
+ return new Database(dbPath);
75
+ if (!singleton)
76
+ singleton = new Database();
77
+ return singleton;
78
+ }
79
+ export function closeDatabase() {
80
+ if (singleton) {
81
+ singleton.close();
82
+ singleton = null;
83
+ }
84
+ }
85
+ //# sourceMappingURL=database.js.map
@@ -0,0 +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"}
@@ -0,0 +1,39 @@
1
+ export class EventStore {
2
+ db;
3
+ constructor(db) {
4
+ this.db = db;
5
+ }
6
+ append(sessionId, event, raw) {
7
+ // Get next sequence
8
+ const row = this.db.prepare(`SELECT COALESCE(MAX(sequence), 0) as maxSeq FROM events WHERE session_id = ?`).get(sessionId);
9
+ const nextSeq = (row?.maxSeq ?? 0) + 1;
10
+ const normalized = JSON.stringify(event);
11
+ const rawStr = raw !== undefined ? JSON.stringify(raw) : event.raw !== undefined ? JSON.stringify(event.raw) : null;
12
+ const stmt = this.db.prepare(`
13
+ INSERT INTO events (session_id, sequence, type, timestamp, normalized_payload, raw_payload)
14
+ VALUES (?, ?, ?, ?, ?, ?)
15
+ `);
16
+ const info = stmt.run(sessionId, nextSeq, event.type, event.timestamp, normalized, rawStr);
17
+ // Update session last_event and updatedAt?
18
+ // Let daemon do it
19
+ return nextSeq;
20
+ }
21
+ list(sessionId, limit = 200, offset = 0) {
22
+ const rows = this.db.prepare(`SELECT * FROM events WHERE session_id = ? ORDER BY sequence ASC LIMIT ? OFFSET ?`).all(sessionId, limit, offset);
23
+ return rows.map((r) => JSON.parse(r.normalized_payload));
24
+ }
25
+ listRaw(sessionId) {
26
+ return this.db.prepare(`SELECT * FROM events WHERE session_id = ? ORDER BY sequence ASC`).all(sessionId);
27
+ }
28
+ count(sessionId) {
29
+ const row = this.db.prepare(`SELECT COUNT(*) as c FROM events WHERE session_id = ?`).get(sessionId);
30
+ return row.c;
31
+ }
32
+ last(sessionId) {
33
+ const row = this.db.prepare(`SELECT * FROM events WHERE session_id = ? ORDER BY sequence DESC LIMIT 1`).get(sessionId);
34
+ if (!row)
35
+ return null;
36
+ return JSON.parse(row.normalized_payload);
37
+ }
38
+ }
39
+ //# sourceMappingURL=events.js.map
@@ -0,0 +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"}
@@ -0,0 +1,128 @@
1
+ function rowToSession(row) {
2
+ return {
3
+ id: row.id,
4
+ name: row.name ?? undefined,
5
+ agent: row.agent,
6
+ nativeSessionId: row.native_session_id ?? undefined,
7
+ model: row.model ?? undefined,
8
+ status: row.status,
9
+ repository: row.repository ?? undefined,
10
+ cwd: row.cwd,
11
+ worktree: row.worktree ?? undefined,
12
+ branch: row.branch ?? undefined,
13
+ baseCommit: row.base_commit ?? undefined,
14
+ pid: row.pid ?? undefined,
15
+ createdAt: new Date(row.created_at),
16
+ updatedAt: new Date(row.updated_at),
17
+ completedAt: row.completed_at ? new Date(row.completed_at) : undefined,
18
+ usage: row.usage_input_tokens != null ||
19
+ row.usage_output_tokens != null ||
20
+ row.usage_cost != null
21
+ ? {
22
+ inputTokens: row.usage_input_tokens ?? undefined,
23
+ outputTokens: row.usage_output_tokens ?? undefined,
24
+ cachedTokens: row.usage_cached_tokens ?? undefined,
25
+ cost: row.usage_cost ?? undefined,
26
+ }
27
+ : undefined,
28
+ lastEvent: row.last_event ?? undefined,
29
+ };
30
+ }
31
+ export class SessionStore {
32
+ db;
33
+ constructor(db) {
34
+ this.db = db;
35
+ }
36
+ create(session) {
37
+ const stmt = this.db.prepare(`
38
+ INSERT INTO sessions (
39
+ id, name, agent, native_session_id, model, status,
40
+ repository, cwd, worktree, branch, base_commit, pid,
41
+ created_at, updated_at, completed_at,
42
+ usage_input_tokens, usage_output_tokens, usage_cached_tokens, usage_cost,
43
+ last_event
44
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
45
+ `);
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);
47
+ }
48
+ get(id) {
49
+ // Support prefix matching like git short hash: if exact not found, try prefix
50
+ let row = this.db.prepare(`SELECT * FROM sessions WHERE id = ?`).get(id);
51
+ if (!row && id.length >= 2) {
52
+ row = this.db.prepare(`SELECT * FROM sessions WHERE id LIKE ? LIMIT 1`).get(`${id}%`);
53
+ }
54
+ if (!row)
55
+ return null;
56
+ return rowToSession(row);
57
+ }
58
+ list(limit = 50, includeAll = false) {
59
+ let sql = `SELECT * FROM sessions ORDER BY created_at DESC LIMIT ?`;
60
+ if (!includeAll) {
61
+ // Show recent regardless of status, but spec ps shows recent/actives
62
+ // For now list all
63
+ }
64
+ const rows = this.db.prepare(sql).all(limit);
65
+ return rows.map(rowToSession);
66
+ }
67
+ listActive() {
68
+ const rows = this.db.prepare(`SELECT * FROM sessions WHERE status IN ('starting','working','needs_input','idle') ORDER BY updated_at DESC`).all();
69
+ return rows.map(rowToSession);
70
+ }
71
+ update(id, patch) {
72
+ const existing = this.get(id);
73
+ if (!existing)
74
+ throw new Error(`Session ${id} not found`);
75
+ const now = new Date().toISOString();
76
+ const fields = [];
77
+ const values = [];
78
+ const map = {
79
+ name: patch.name,
80
+ agent: patch.agent,
81
+ native_session_id: patch.nativeSessionId,
82
+ model: patch.model,
83
+ status: patch.status,
84
+ repository: patch.repository,
85
+ cwd: patch.cwd,
86
+ worktree: patch.worktree,
87
+ branch: patch.branch,
88
+ base_commit: patch.baseCommit,
89
+ pid: patch.pid,
90
+ completed_at: patch.completedAt ? patch.completedAt.toISOString() : undefined,
91
+ usage_input_tokens: patch.usage?.inputTokens,
92
+ usage_output_tokens: patch.usage?.outputTokens,
93
+ usage_cached_tokens: patch.usage?.cachedTokens,
94
+ usage_cost: patch.usage?.cost,
95
+ last_event: patch.lastEvent,
96
+ };
97
+ for (const [col, val] of Object.entries(map)) {
98
+ if (val !== undefined) {
99
+ fields.push(`${col} = ?`);
100
+ values.push(val);
101
+ }
102
+ }
103
+ // Always update updated_at unless explicitly set
104
+ if (!fields.includes("updated_at = ?")) {
105
+ fields.push("updated_at = ?");
106
+ values.push(patch.updatedAt ? patch.updatedAt.toISOString() : now);
107
+ }
108
+ if (fields.length === 0)
109
+ return;
110
+ values.push(id);
111
+ this.db.prepare(`UPDATE sessions SET ${fields.join(", ")} WHERE id = ?`).run(...values);
112
+ }
113
+ setStatus(id, status, extra) {
114
+ const patch = { status, updatedAt: new Date(), ...extra };
115
+ if (status === "completed" || status === "failed" || status === "stopped" || status === "orphaned") {
116
+ patch.completedAt = new Date();
117
+ }
118
+ this.update(id, patch);
119
+ }
120
+ delete(id) {
121
+ this.db.prepare(`DELETE FROM sessions WHERE id = ?`).run(id);
122
+ }
123
+ findByNativeId(nativeId) {
124
+ const row = this.db.prepare(`SELECT * FROM sessions WHERE native_session_id = ? LIMIT 1`).get(nativeId);
125
+ return row ? rowToSession(row) : null;
126
+ }
127
+ }
128
+ //# sourceMappingURL=sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/store/sessions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { execSync } from "node:child_process";
2
+ export function which(cmd) {
3
+ try {
4
+ const out = execSync(`which ${cmd} 2>/dev/null`, { encoding: "utf-8" }).trim();
5
+ return out || null;
6
+ }
7
+ catch {
8
+ return null;
9
+ }
10
+ }
11
+ export async function detectBinary(cmd) {
12
+ const path = which(cmd);
13
+ if (!path)
14
+ return { installed: false };
15
+ let version;
16
+ try {
17
+ const { execFile } = await import("node:child_process");
18
+ const { promisify } = await import("node:util");
19
+ const execFileAsync = promisify(execFile);
20
+ try {
21
+ const { stdout } = await execFileAsync(cmd, ["--version"], { timeout: 5000 });
22
+ version = stdout.trim().split("\n")[0].slice(0, 100);
23
+ }
24
+ catch {
25
+ try {
26
+ const { stdout } = await execFileAsync(cmd, ["--help"], { timeout: 5000 });
27
+ version = stdout.trim().split("\n")[0].slice(0, 100);
28
+ }
29
+ catch { }
30
+ }
31
+ }
32
+ catch { }
33
+ return { installed: true, path, version };
34
+ }
35
+ //# sourceMappingURL=process.js.map
@@ -0,0 +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"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "codedeck",
3
+ "version": "0.1.0",
4
+ "description": "CodeDeck, a local runtime for coding agents with session management, process supervision, event normalization, and git isolation",
5
+ "type": "module",
6
+ "bin": {
7
+ "codedeck": "./dist/cli/index.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "README.md"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "dev": "tsc --watch",
16
+ "start": "node dist/cli/index.js",
17
+ "test": "vitest run",
18
+ "doctor": "node dist/cli/index.js doctor",
19
+ "prepublishOnly": "npm run build && npm test"
20
+ },
21
+ "keywords": ["agent", "coding-agent", "runtime", "claude", "codex", "opencode", "omp"],
22
+ "author": "",
23
+ "license": "MIT",
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "https://github.com/4ndreello/run-agent.git"
27
+ },
28
+ "homepage": "https://github.com/4ndreello/run-agent#readme",
29
+ "bugs": {
30
+ "url": "https://github.com/4ndreello/run-agent/issues"
31
+ },
32
+ "engines": {
33
+ "node": ">=20.0.0"
34
+ },
35
+ "dependencies": {
36
+ "commander": "^12.1.0"
37
+ },
38
+ "devDependencies": {
39
+ "@types/node": "^22.10.0",
40
+ "typescript": "^5.7.0",
41
+ "vitest": "^2.1.0"
42
+ }
43
+ }