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.
- package/README.md +211 -0
- package/dist/cli/commands/diff.js +43 -0
- package/dist/cli/commands/diff.js.map +1 -0
- package/dist/cli/commands/doctor.js +90 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/logs.js +139 -0
- package/dist/cli/commands/logs.js.map +1 -0
- package/dist/cli/commands/ps.js +59 -0
- package/dist/cli/commands/ps.js.map +1 -0
- package/dist/cli/commands/run.js +145 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/send.js +29 -0
- package/dist/cli/commands/send.js.map +1 -0
- package/dist/cli/commands/show.js +99 -0
- package/dist/cli/commands/show.js.map +1 -0
- package/dist/cli/commands/stop.js +27 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/index.js +63 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/config.js +26 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/paths.js +43 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/core/capabilities.js +14 -0
- package/dist/core/capabilities.js.map +1 -0
- package/dist/core/driver.js +2 -0
- package/dist/core/driver.js.map +1 -0
- package/dist/core/errors.js +61 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/events.js +10 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/session.js +33 -0
- package/dist/core/session.js.map +1 -0
- package/dist/daemon/daemon.js +534 -0
- package/dist/daemon/daemon.js.map +1 -0
- package/dist/daemon/ipc.js +292 -0
- package/dist/daemon/ipc.js.map +1 -0
- package/dist/daemon/process-manager.js +55 -0
- package/dist/daemon/process-manager.js.map +1 -0
- package/dist/daemon/protocol.js +2 -0
- package/dist/daemon/protocol.js.map +1 -0
- package/dist/drivers/claude/driver.js +247 -0
- package/dist/drivers/claude/driver.js.map +1 -0
- package/dist/drivers/claude/parser.js +184 -0
- package/dist/drivers/claude/parser.js.map +1 -0
- package/dist/drivers/codex/driver.js +241 -0
- package/dist/drivers/codex/driver.js.map +1 -0
- package/dist/drivers/codex/parser.js +184 -0
- package/dist/drivers/codex/parser.js.map +1 -0
- package/dist/drivers/helpers.js +85 -0
- package/dist/drivers/helpers.js.map +1 -0
- package/dist/drivers/omp/driver.js +372 -0
- package/dist/drivers/omp/driver.js.map +1 -0
- package/dist/drivers/opencode/driver.js +307 -0
- package/dist/drivers/opencode/driver.js.map +1 -0
- package/dist/drivers/registry.js +48 -0
- package/dist/drivers/registry.js.map +1 -0
- package/dist/git/diff.js +100 -0
- package/dist/git/diff.js.map +1 -0
- package/dist/git/repository.js +68 -0
- package/dist/git/repository.js.map +1 -0
- package/dist/git/worktree.js +89 -0
- package/dist/git/worktree.js.map +1 -0
- package/dist/store/database.js +85 -0
- package/dist/store/database.js.map +1 -0
- package/dist/store/events.js +39 -0
- package/dist/store/events.js.map +1 -0
- package/dist/store/sessions.js +128 -0
- package/dist/store/sessions.js.map +1 -0
- package/dist/utils/process.js +35 -0
- package/dist/utils/process.js.map +1 -0
- 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
|
+
}
|