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,145 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { IpcClient } from "../../daemon/ipc.js";
|
|
3
|
+
import { loadConfig } from "../../config/config.js";
|
|
4
|
+
export function registerRunCommand(program) {
|
|
5
|
+
program
|
|
6
|
+
.command("run")
|
|
7
|
+
.description("Start a new agent session (creates a CodeDeck session, not a raw harness call)")
|
|
8
|
+
.argument("<prompt>", "prompt for the agent (e.g. \"implement authentication\")")
|
|
9
|
+
.option("--agent <agent>", "agent to use: claude | codex | opencode | omp (default: claude or config.defaultAgent)")
|
|
10
|
+
.option("--model <model>", "model to use (e.g. claude-opus-5, gpt-5, anthropic/claude-sonnet)")
|
|
11
|
+
.option("--name <name>", "human-readable session name (slug for branch)")
|
|
12
|
+
.option("--cwd <cwd>", "working directory (default: current directory)")
|
|
13
|
+
.option("--worktree", "create isolated git worktree at ~/.run-agent/worktrees/<hash>/<id>")
|
|
14
|
+
.option("--no-worktree", "do not create worktree, run in current directory")
|
|
15
|
+
.option("--detach", "run detached: print session id and exit, keep agent running in daemon")
|
|
16
|
+
.option("--json", "output JSON instead of human-readable text")
|
|
17
|
+
.addHelpText("after", `
|
|
18
|
+
Examples:
|
|
19
|
+
$ npx codedeck run "implement authentication" --agent claude
|
|
20
|
+
$ npx codedeck run "fix the tests" --agent codex --model gpt-5 --detach
|
|
21
|
+
$ npx codedeck run "refactor module" --agent opencode --worktree --name refactor
|
|
22
|
+
$ npx codedeck run "investigate bug" --agent omp --cwd ./my-project --json
|
|
23
|
+
`)
|
|
24
|
+
.action(async (prompt, opts) => {
|
|
25
|
+
const cwd = opts.cwd ? path.resolve(opts.cwd) : process.cwd();
|
|
26
|
+
const cfg = loadConfig();
|
|
27
|
+
const agent = opts.agent || cfg.defaultAgent || "claude";
|
|
28
|
+
const client = new IpcClient();
|
|
29
|
+
try {
|
|
30
|
+
await client.ensureDaemonStarted();
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
console.error(`Failed to start daemon: ${e instanceof Error ? e.message : String(e)}`);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
const params = {
|
|
37
|
+
prompt,
|
|
38
|
+
agent,
|
|
39
|
+
model: opts.model,
|
|
40
|
+
name: opts.name,
|
|
41
|
+
cwd,
|
|
42
|
+
worktree: opts.worktree,
|
|
43
|
+
noWorktree: opts.noWorktree,
|
|
44
|
+
detach: !!opts.detach,
|
|
45
|
+
};
|
|
46
|
+
let result;
|
|
47
|
+
try {
|
|
48
|
+
result = await client.request("session.create", params);
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
console.error(`Failed to create session: ${e instanceof Error ? e.message : String(e)}`);
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
const session = result.session;
|
|
55
|
+
if (opts.json) {
|
|
56
|
+
console.log(JSON.stringify(session, null, 2));
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
console.log(`Session ${session.id} created (${session.agent})`);
|
|
60
|
+
if (session.worktree)
|
|
61
|
+
console.log(`Worktree: ${session.worktree} Branch: ${session.branch}`);
|
|
62
|
+
}
|
|
63
|
+
if (opts.detach) {
|
|
64
|
+
// Just show id and exit
|
|
65
|
+
if (!opts.json)
|
|
66
|
+
console.log(`\nUse: npx codedeck logs ${session.id} --follow`);
|
|
67
|
+
process.exit(0);
|
|
68
|
+
}
|
|
69
|
+
// Follow logs
|
|
70
|
+
console.log(`\nFollowing logs for ${session.id} (Ctrl+C to detach)...\n`);
|
|
71
|
+
let followDone = false;
|
|
72
|
+
const onEvent = (ev) => {
|
|
73
|
+
if (ev.type === "message" && ev.content) {
|
|
74
|
+
console.log(`[${ev.role || "assistant"}] ${ev.content.slice(0, 500)}`);
|
|
75
|
+
}
|
|
76
|
+
else if (ev.type === "text.delta" && ev.delta) {
|
|
77
|
+
process.stdout.write(ev.delta);
|
|
78
|
+
}
|
|
79
|
+
else if (ev.type === "tool.started") {
|
|
80
|
+
console.log(`\n→ tool: ${ev.tool.name} ${ev.tool.input ? JSON.stringify(ev.tool.input).slice(0, 200) : ""}`);
|
|
81
|
+
}
|
|
82
|
+
else if (ev.type === "tool.completed") {
|
|
83
|
+
console.log(`✓ tool: ${ev.tool.name} ${ev.tool.success === false ? "failed" : "completed"}`);
|
|
84
|
+
}
|
|
85
|
+
else if (ev.type === "session.completed") {
|
|
86
|
+
console.log(`\n✓ Session ${session.id} completed`);
|
|
87
|
+
followDone = true;
|
|
88
|
+
}
|
|
89
|
+
else if (ev.type === "session.failed") {
|
|
90
|
+
console.log(`\n✗ Session ${session.id} failed: ${ev.error}`);
|
|
91
|
+
followDone = true;
|
|
92
|
+
}
|
|
93
|
+
else if (ev.type === "error") {
|
|
94
|
+
console.log(`\n! Error: ${ev.error}`);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const unsubscribe = client.subscribe(session.id, onEvent, () => {
|
|
98
|
+
if (!followDone)
|
|
99
|
+
console.log(`\n— log stream ended —`);
|
|
100
|
+
process.exit(followDone ? 0 : 0);
|
|
101
|
+
}, (err) => {
|
|
102
|
+
console.error(`Subscribe error: ${err.message}`);
|
|
103
|
+
});
|
|
104
|
+
// Also fetch initial logs that may have been missed before subscribe
|
|
105
|
+
try {
|
|
106
|
+
const logs = await client.request("session.logs", { id: session.id });
|
|
107
|
+
for (const ev of logs.events || []) {
|
|
108
|
+
onEvent(ev);
|
|
109
|
+
if (ev.type === "session.completed" || ev.type === "session.failed")
|
|
110
|
+
followDone = true;
|
|
111
|
+
}
|
|
112
|
+
if (followDone) {
|
|
113
|
+
unsubscribe();
|
|
114
|
+
process.exit(0);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch { }
|
|
118
|
+
// Handle Ctrl+C: detach but keep session running
|
|
119
|
+
process.on("SIGINT", () => {
|
|
120
|
+
console.log(`\nDetached from ${session.id}. Session continues in background.`);
|
|
121
|
+
console.log(`Run: npx codedeck logs ${session.id} --follow to reattach`);
|
|
122
|
+
console.log(` npx codedeck stop ${session.id} to stop`);
|
|
123
|
+
unsubscribe();
|
|
124
|
+
process.exit(0);
|
|
125
|
+
});
|
|
126
|
+
// Poll status until terminal if subscribe fails
|
|
127
|
+
const poll = async () => {
|
|
128
|
+
while (!followDone) {
|
|
129
|
+
await new Promise((r) => setTimeout(r, 2000));
|
|
130
|
+
try {
|
|
131
|
+
const info = await client.request("session.get", { id: session.id });
|
|
132
|
+
const status = info.session.status;
|
|
133
|
+
if (["completed", "failed", "stopped", "orphaned"].includes(status)) {
|
|
134
|
+
console.log(`\nSession ${session.id} is ${status}`);
|
|
135
|
+
unsubscribe();
|
|
136
|
+
process.exit(status === "failed" ? 1 : 0);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch { }
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
poll();
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { IpcClient } from "../../daemon/ipc.js";
|
|
2
|
+
export function registerSendCommand(program) {
|
|
3
|
+
program
|
|
4
|
+
.command("send")
|
|
5
|
+
.description("Continue a session with a new message (new turn, uses native resume when available)")
|
|
6
|
+
.argument("<id>", "session id (prefix allowed, e.g. a83f)")
|
|
7
|
+
.argument("<message>", "message to send (e.g. \"add tests\")")
|
|
8
|
+
.option("--json", "output JSON")
|
|
9
|
+
.action(async (id, message, opts) => {
|
|
10
|
+
const client = new IpcClient();
|
|
11
|
+
try {
|
|
12
|
+
await client.ensureDaemonStarted();
|
|
13
|
+
}
|
|
14
|
+
catch { }
|
|
15
|
+
let result;
|
|
16
|
+
try {
|
|
17
|
+
result = await client.request("session.send", { id, message });
|
|
18
|
+
}
|
|
19
|
+
catch (e) {
|
|
20
|
+
console.error(`Failed to send: ${e instanceof Error ? e.message : String(e)}`);
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
if (opts.json)
|
|
24
|
+
console.log(JSON.stringify(result, null, 2));
|
|
25
|
+
else
|
|
26
|
+
console.log(`Message sent to ${id}`);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=send.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../../src/cli/commands/send.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,qFAAqF,CAAC;SAClG,QAAQ,CAAC,MAAM,EAAE,wCAAwC,CAAC;SAC1D,QAAQ,CAAC,WAAW,EAAE,sCAAsC,CAAC;SAC7D,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;SAC/B,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,OAAe,EAAE,IAAS,EAAE,EAAE;QACvD,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC;YAAC,MAAM,MAAM,CAAC,mBAAmB,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACpD,IAAI,MAAW,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;;YACvD,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { IpcClient } from "../../daemon/ipc.js";
|
|
2
|
+
export function registerShowCommand(program) {
|
|
3
|
+
program
|
|
4
|
+
.command("show")
|
|
5
|
+
.description("Show full session details (status, worktree, usage, recent events)")
|
|
6
|
+
.argument("<id>", "session id (prefix allowed, e.g. a83f)")
|
|
7
|
+
.option("--json", "output JSON with session + events")
|
|
8
|
+
.action(async (id, opts) => {
|
|
9
|
+
const client = new IpcClient();
|
|
10
|
+
try {
|
|
11
|
+
await client.ensureDaemonStarted();
|
|
12
|
+
}
|
|
13
|
+
catch { }
|
|
14
|
+
let result;
|
|
15
|
+
try {
|
|
16
|
+
result = await client.request("session.get", { id });
|
|
17
|
+
}
|
|
18
|
+
catch (e) {
|
|
19
|
+
console.error(e instanceof Error ? e.message : String(e));
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
const s = result.session;
|
|
23
|
+
if (!s) {
|
|
24
|
+
console.error(`Session ${id} not found`);
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
if (opts.json) {
|
|
28
|
+
console.log(JSON.stringify(result, null, 2));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const age = (() => {
|
|
32
|
+
const diff = Date.now() - new Date(s.createdAt).getTime();
|
|
33
|
+
const m = Math.floor(diff / 60000);
|
|
34
|
+
if (m < 1)
|
|
35
|
+
return "just now";
|
|
36
|
+
if (m < 60)
|
|
37
|
+
return `${m}m ago`;
|
|
38
|
+
return `${Math.floor(m / 60)}h ago`;
|
|
39
|
+
})();
|
|
40
|
+
console.log(`Session ${s.id}`);
|
|
41
|
+
if (s.name)
|
|
42
|
+
console.log(`Name ${s.name}`);
|
|
43
|
+
console.log(`Agent ${s.agent}`);
|
|
44
|
+
console.log(`Status ${s.status}`);
|
|
45
|
+
if (s.model)
|
|
46
|
+
console.log(`Model ${s.model}`);
|
|
47
|
+
console.log(``);
|
|
48
|
+
if (s.repository)
|
|
49
|
+
console.log(`Repository ${s.repository}`);
|
|
50
|
+
console.log(`Working dir ${s.worktree || s.cwd}`);
|
|
51
|
+
if (s.branch)
|
|
52
|
+
console.log(`Branch ${s.branch}`);
|
|
53
|
+
if (s.baseCommit)
|
|
54
|
+
console.log(`Base commit ${s.baseCommit.slice(0, 12)}`);
|
|
55
|
+
if (s.nativeSessionId)
|
|
56
|
+
console.log(`Native ID ${s.nativeSessionId}`);
|
|
57
|
+
if (s.pid)
|
|
58
|
+
console.log(`PID ${s.pid}`);
|
|
59
|
+
console.log(``);
|
|
60
|
+
console.log(`Started ${age}`);
|
|
61
|
+
if (s.lastEvent)
|
|
62
|
+
console.log(`Last event ${s.lastEvent.slice(0, 80)}`);
|
|
63
|
+
if (s.completedAt)
|
|
64
|
+
console.log(`Completed ${new Date(s.completedAt).toLocaleString()}`);
|
|
65
|
+
console.log(``);
|
|
66
|
+
if (s.usage) {
|
|
67
|
+
if (s.usage.inputTokens != null)
|
|
68
|
+
console.log(`Input tokens ${s.usage.inputTokens.toLocaleString()}`);
|
|
69
|
+
if (s.usage.outputTokens != null)
|
|
70
|
+
console.log(`Output tokens ${s.usage.outputTokens.toLocaleString()}`);
|
|
71
|
+
if (s.usage.cachedTokens != null)
|
|
72
|
+
console.log(`Cached tokens ${s.usage.cachedTokens.toLocaleString()}`);
|
|
73
|
+
if (s.usage.cost != null)
|
|
74
|
+
console.log(`Cost $${s.usage.cost}`);
|
|
75
|
+
else
|
|
76
|
+
console.log(`Cost unavailable`);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
console.log(`Cost unavailable`);
|
|
80
|
+
}
|
|
81
|
+
console.log(``);
|
|
82
|
+
console.log(`Events ${result.eventCount ?? (result.events?.length ?? 0)}`);
|
|
83
|
+
if (result.events?.length) {
|
|
84
|
+
console.log(`\nRecent events:`);
|
|
85
|
+
for (const ev of result.events.slice(-10)) {
|
|
86
|
+
const t = new Date(ev.timestamp).toLocaleTimeString();
|
|
87
|
+
if (ev.type === "message")
|
|
88
|
+
console.log(` [${t}] ${ev.type}: ${(ev.content || "").slice(0, 100)}`);
|
|
89
|
+
else if (ev.type === "tool.started")
|
|
90
|
+
console.log(` [${t}] → ${ev.tool.name}`);
|
|
91
|
+
else if (ev.type === "tool.completed")
|
|
92
|
+
console.log(` [${t}] ✓ ${ev.tool.name}`);
|
|
93
|
+
else
|
|
94
|
+
console.log(` [${t}] ${ev.type}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=show.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show.js","sourceRoot":"","sources":["../../../src/cli/commands/show.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { IpcClient } from "../../daemon/ipc.js";
|
|
2
|
+
export function registerStopCommand(program) {
|
|
3
|
+
program
|
|
4
|
+
.command("stop")
|
|
5
|
+
.description("Stop a running session (graceful interrupt → SIGTERM → SIGKILL)")
|
|
6
|
+
.argument("<id>", "session id (prefix allowed, e.g. a83f)")
|
|
7
|
+
.option("--json", "output JSON")
|
|
8
|
+
.action(async (id, opts) => {
|
|
9
|
+
const client = new IpcClient();
|
|
10
|
+
try {
|
|
11
|
+
await client.ensureDaemonStarted();
|
|
12
|
+
}
|
|
13
|
+
catch { }
|
|
14
|
+
try {
|
|
15
|
+
const result = await client.request("session.stop", { id });
|
|
16
|
+
if (opts.json)
|
|
17
|
+
console.log(JSON.stringify(result, null, 2));
|
|
18
|
+
else
|
|
19
|
+
console.log(`Session ${id} stopped`);
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
console.error(`Failed to stop: ${e instanceof Error ? e.message : String(e)}`);
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=stop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/cli/commands/stop.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iEAAiE,CAAC;SAC9E,QAAQ,CAAC,MAAM,EAAE,wCAAwC,CAAC;SAC1D,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;SAC/B,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,IAAS,EAAE,EAAE;QACtC,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC;YAAC,MAAM,MAAM,CAAC,mBAAmB,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5D,IAAI,IAAI,CAAC,IAAI;gBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;;gBACvD,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { readFileSync } from "node:fs";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { registerRunCommand } from "./commands/run.js";
|
|
7
|
+
import { registerPsCommand } from "./commands/ps.js";
|
|
8
|
+
import { registerShowCommand } from "./commands/show.js";
|
|
9
|
+
import { registerLogsCommand } from "./commands/logs.js";
|
|
10
|
+
import { registerSendCommand } from "./commands/send.js";
|
|
11
|
+
import { registerStopCommand } from "./commands/stop.js";
|
|
12
|
+
import { registerDiffCommand } from "./commands/diff.js";
|
|
13
|
+
import { registerDoctorCommand } from "./commands/doctor.js";
|
|
14
|
+
function getVersion() {
|
|
15
|
+
try {
|
|
16
|
+
const pkgPath = path.join(path.dirname(fileURLToPath(import.meta.url)), "../../package.json");
|
|
17
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
18
|
+
return pkg.version || "0.1.0";
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return "0.1.0";
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const program = new Command();
|
|
25
|
+
program
|
|
26
|
+
.name("codedeck")
|
|
27
|
+
.description("CodeDeck — local runtime for coding agents\nManage Claude, Codex, OpenCode and OMP through a single session interface")
|
|
28
|
+
.version(getVersion())
|
|
29
|
+
.helpOption("-h, --help", "display help for command")
|
|
30
|
+
.showHelpAfterError("(add --help for details)")
|
|
31
|
+
.showSuggestionAfterError(true)
|
|
32
|
+
.addHelpText("after", `
|
|
33
|
+
Examples:
|
|
34
|
+
$ npx codedeck run "implement authentication" --agent claude --worktree
|
|
35
|
+
$ npx codedeck run "fix the tests" --agent codex --detach
|
|
36
|
+
$ npx codedeck ps
|
|
37
|
+
$ npx codedeck ps --json
|
|
38
|
+
$ npx codedeck show a83f
|
|
39
|
+
$ npx codedeck logs a83f --follow
|
|
40
|
+
$ npx codedeck logs a83f --json
|
|
41
|
+
$ npx codedeck send a83f "add tests"
|
|
42
|
+
$ npx codedeck stop a83f
|
|
43
|
+
$ npx codedeck diff a83f --stat
|
|
44
|
+
$ npx codedeck doctor
|
|
45
|
+
|
|
46
|
+
Run 'npx codedeck <command> --help' for command-specific options.
|
|
47
|
+
Docs: https://github.com/4ndreello/run-agent
|
|
48
|
+
`);
|
|
49
|
+
registerRunCommand(program);
|
|
50
|
+
registerPsCommand(program);
|
|
51
|
+
registerShowCommand(program);
|
|
52
|
+
registerLogsCommand(program);
|
|
53
|
+
registerSendCommand(program);
|
|
54
|
+
registerStopCommand(program);
|
|
55
|
+
registerDiffCommand(program);
|
|
56
|
+
registerDoctorCommand(program);
|
|
57
|
+
// Make `codedeck help` behave like `codedeck --help`
|
|
58
|
+
program.command("help", { hidden: true }).action(() => program.outputHelp());
|
|
59
|
+
program.parseAsync(process.argv).catch((err) => {
|
|
60
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
61
|
+
process.exit(1);
|
|
62
|
+
});
|
|
63
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;QAC9F,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QACvD,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,uHAAuH,CAAC;KACpI,OAAO,CAAC,UAAU,EAAE,CAAC;KACrB,UAAU,CAAC,YAAY,EAAE,0BAA0B,CAAC;KACpD,kBAAkB,CAAC,0BAA0B,CAAC;KAC9C,wBAAwB,CAAC,IAAI,CAAC;KAC9B,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;;CAgBvB,CAAC,CAAC;AAEH,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAC3B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAE/B,qDAAqD;AACrD,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;AAE7E,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { getPaths } from "./paths.js";
|
|
4
|
+
const DEFAULT_CONFIG = {
|
|
5
|
+
defaultAgent: "claude",
|
|
6
|
+
worktree: false,
|
|
7
|
+
};
|
|
8
|
+
export function loadConfig() {
|
|
9
|
+
const { configFile } = getPaths();
|
|
10
|
+
try {
|
|
11
|
+
if (!fs.existsSync(configFile))
|
|
12
|
+
return { ...DEFAULT_CONFIG };
|
|
13
|
+
const raw = fs.readFileSync(configFile, "utf-8");
|
|
14
|
+
const parsed = JSON.parse(raw);
|
|
15
|
+
return { ...DEFAULT_CONFIG, ...parsed };
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return { ...DEFAULT_CONFIG };
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function saveConfig(cfg) {
|
|
22
|
+
const { configFile } = getPaths();
|
|
23
|
+
fs.mkdirSync(path.dirname(configFile), { recursive: true });
|
|
24
|
+
fs.writeFileSync(configFile, JSON.stringify(cfg, null, 2), "utf-8");
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAStC,MAAM,cAAc,GAAmB;IACrC,YAAY,EAAE,QAAQ;IACtB,QAAQ,EAAE,KAAK;CAChB,CAAC;AAEF,MAAM,UAAU,UAAU;IACxB,MAAM,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,CAAC;IAClC,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;QAC7D,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;QACjD,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAmB;IAC5C,MAAM,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,CAAC;IAClC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
export function getHomeDir() {
|
|
5
|
+
return os.homedir();
|
|
6
|
+
}
|
|
7
|
+
export function getRunAgentDir() {
|
|
8
|
+
// Allow override via env for testing
|
|
9
|
+
if (process.env.RUN_AGENT_DIR)
|
|
10
|
+
return process.env.RUN_AGENT_DIR;
|
|
11
|
+
// Respect XDG_DATA_HOME if set, otherwise ~/.run-agent as per spec
|
|
12
|
+
// Spec says ~/.run-agent, we honor that
|
|
13
|
+
return path.join(getHomeDir(), ".run-agent");
|
|
14
|
+
}
|
|
15
|
+
export function getConfigDir() {
|
|
16
|
+
if (process.env.RUN_AGENT_CONFIG_DIR)
|
|
17
|
+
return process.env.RUN_AGENT_CONFIG_DIR;
|
|
18
|
+
const xdg = process.env.XDG_CONFIG_HOME;
|
|
19
|
+
if (xdg)
|
|
20
|
+
return path.join(xdg, "run-agent");
|
|
21
|
+
return path.join(getHomeDir(), ".config", "run-agent");
|
|
22
|
+
}
|
|
23
|
+
export function getPaths() {
|
|
24
|
+
const base = getRunAgentDir();
|
|
25
|
+
const configBase = getConfigDir();
|
|
26
|
+
return {
|
|
27
|
+
base,
|
|
28
|
+
db: path.join(base, "run-agent.db"),
|
|
29
|
+
daemonSock: path.join(base, "daemon.sock"),
|
|
30
|
+
daemonPid: path.join(base, "daemon.pid"),
|
|
31
|
+
daemonLog: path.join(base, "daemon.log"),
|
|
32
|
+
logsDir: path.join(base, "logs"),
|
|
33
|
+
worktreesDir: path.join(base, "worktrees"),
|
|
34
|
+
configFile: path.join(configBase, "config.json"),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export function ensureDirs() {
|
|
38
|
+
const p = getPaths();
|
|
39
|
+
for (const dir of [p.base, p.logsDir, p.worktreesDir, path.dirname(p.configFile)]) {
|
|
40
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,UAAU,UAAU;IACxB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,qCAAqC;IACrC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IAChE,mEAAmE;IACnE,wCAAwC;IACxC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,YAAY,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAC9E,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IACxC,IAAI,GAAG;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAC9B,MAAM,UAAU,GAAG,YAAY,EAAE,CAAC;IAClC,OAAO;QACL,IAAI;QACJ,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC;QACnC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC;QAC1C,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC;QACxC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC;QACxC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;QAChC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;QAC1C,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;IACrB,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QAClF,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function defaultCapabilities() {
|
|
2
|
+
return {
|
|
3
|
+
streaming: false,
|
|
4
|
+
resume: false,
|
|
5
|
+
fork: false,
|
|
6
|
+
approvals: false,
|
|
7
|
+
usage: false,
|
|
8
|
+
cost: false,
|
|
9
|
+
modelSelection: false,
|
|
10
|
+
nativeDiff: false,
|
|
11
|
+
interrupt: false,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/core/capabilities.ts"],"names":[],"mappings":"AAcA,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,SAAS,EAAE,KAAK;QAChB,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,KAAK;QACX,SAAS,EAAE,KAAK;QAChB,KAAK,EAAE,KAAK;QACZ,IAAI,EAAE,KAAK;QACX,cAAc,EAAE,KAAK;QACrB,UAAU,EAAE,KAAK;QACjB,SAAS,EAAE,KAAK;KACjB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../../src/core/driver.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export class RunAgentError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
details;
|
|
4
|
+
constructor(message, code, details) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.details = details;
|
|
8
|
+
this.name = this.constructor.name;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class AgentNotInstalledError extends RunAgentError {
|
|
12
|
+
constructor(agent) {
|
|
13
|
+
super(`Agent "${agent}" is not installed`, "AGENT_NOT_INSTALLED", { agent });
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export class AgentAuthenticationRequiredError extends RunAgentError {
|
|
17
|
+
constructor(agent) {
|
|
18
|
+
super(`Agent "${agent}" requires authentication`, "AGENT_AUTH_REQUIRED", { agent });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export class AgentStartFailedError extends RunAgentError {
|
|
22
|
+
constructor(agent, cause) {
|
|
23
|
+
super(`Failed to start agent "${agent}"`, "AGENT_START_FAILED", { agent, cause });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export class SessionNotFoundError extends RunAgentError {
|
|
27
|
+
constructor(id) {
|
|
28
|
+
super(`Session "${id}" not found`, "SESSION_NOT_FOUND", { id });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class SessionNotRunningError extends RunAgentError {
|
|
32
|
+
constructor(id) {
|
|
33
|
+
super(`Session "${id}" is not running`, "SESSION_NOT_RUNNING", { id });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export class CapabilityNotSupportedError extends RunAgentError {
|
|
37
|
+
constructor(agent, capability) {
|
|
38
|
+
super(`Agent "${agent}" does not support "${capability}"`, "CAPABILITY_NOT_SUPPORTED", { agent, capability });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export class RepositoryNotFoundError extends RunAgentError {
|
|
42
|
+
constructor(cwd) {
|
|
43
|
+
super(`No git repository found at "${cwd}"`, "REPOSITORY_NOT_FOUND", { cwd });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export class WorktreeCreationFailedError extends RunAgentError {
|
|
47
|
+
constructor(cause) {
|
|
48
|
+
super("Failed to create git worktree", "WORKTREE_CREATION_FAILED", { cause });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export class DaemonUnavailableError extends RunAgentError {
|
|
52
|
+
constructor(cause) {
|
|
53
|
+
super("CodeDeck daemon is unavailable", "DAEMON_UNAVAILABLE", { cause });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export class ProtocolError extends RunAgentError {
|
|
57
|
+
constructor(message, cause) {
|
|
58
|
+
super(message, "PROTOCOL_ERROR", { cause });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,aAAc,SAAQ,KAAK;IAGpB;IACA;IAHlB,YACE,OAAe,EACC,IAAY,EACZ,OAAiB;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAQ;QACZ,YAAO,GAAP,OAAO,CAAU;QAGjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,aAAa;IACvD,YAAY,KAAa;QACvB,KAAK,CAAC,UAAU,KAAK,oBAAoB,EAAE,qBAAqB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/E,CAAC;CACF;AAED,MAAM,OAAO,gCAAiC,SAAQ,aAAa;IACjE,YAAY,KAAa;QACvB,KAAK,CAAC,UAAU,KAAK,2BAA2B,EAAE,qBAAqB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACtF,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,aAAa;IACtD,YAAY,KAAa,EAAE,KAAe;QACxC,KAAK,CAAC,0BAA0B,KAAK,GAAG,EAAE,oBAAoB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACpF,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,aAAa;IACrD,YAAY,EAAU;QACpB,KAAK,CAAC,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAClE,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,aAAa;IACvD,YAAY,EAAU;QACpB,KAAK,CAAC,YAAY,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACzE,CAAC;CACF;AAED,MAAM,OAAO,2BAA4B,SAAQ,aAAa;IAC5D,YAAY,KAAa,EAAE,UAAkB;QAC3C,KAAK,CAAC,UAAU,KAAK,uBAAuB,UAAU,GAAG,EAAE,0BAA0B,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;IAChH,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,aAAa;IACxD,YAAY,GAAW;QACrB,KAAK,CAAC,+BAA+B,GAAG,GAAG,EAAE,sBAAsB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAChF,CAAC;CACF;AAED,MAAM,OAAO,2BAA4B,SAAQ,aAAa;IAC5D,YAAY,KAAe;QACzB,KAAK,CAAC,+BAA+B,EAAE,0BAA0B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAChF,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,aAAa;IACvD,YAAY,KAAe;QACzB,KAAK,CAAC,gCAAgC,EAAE,oBAAoB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3E,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,aAAa;IAC9C,YAAY,OAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9C,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function createEvent(base) {
|
|
2
|
+
return {
|
|
3
|
+
timestamp: new Date().toISOString(),
|
|
4
|
+
...base,
|
|
5
|
+
};
|
|
6
|
+
}
|
|
7
|
+
export function isTerminalEvent(event) {
|
|
8
|
+
return event.type === "session.completed" || event.type === "session.failed";
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/core/events.ts"],"names":[],"mappings":"AA8IA,MAAM,UAAU,WAAW,CACzB,IAAmD;IAEnD,OAAO;QACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,GAAG,IAAI;KACH,CAAC;AACT,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAiB;IAC/C,OAAO,KAAK,CAAC,IAAI,KAAK,mBAAmB,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,CAAC;AAC/E,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export function isTerminalStatus(status) {
|
|
2
|
+
return status === "completed" || status === "failed" || status === "stopped" || status === "orphaned";
|
|
3
|
+
}
|
|
4
|
+
export function isActiveStatus(status) {
|
|
5
|
+
return status === "starting" || status === "working" || status === "needs_input" || status === "idle";
|
|
6
|
+
}
|
|
7
|
+
export function generateSessionId() {
|
|
8
|
+
// 4-char hex like spec (a83f) but ensure uniqueness with 8 chars if needed
|
|
9
|
+
// Use 8 hex chars, display first 4 but store full
|
|
10
|
+
const bytes = new Uint8Array(4);
|
|
11
|
+
// Node crypto
|
|
12
|
+
// Use simple random for now; crypto available globally
|
|
13
|
+
try {
|
|
14
|
+
// @ts-ignore
|
|
15
|
+
globalThis.crypto?.getRandomValues?.(bytes);
|
|
16
|
+
if (bytes[0] === 0 && bytes[1] === 0 && bytes[2] === 0 && bytes[3] === 0)
|
|
17
|
+
throw new Error("zero");
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
for (let i = 0; i < 4; i++)
|
|
21
|
+
bytes[i] = Math.floor(Math.random() * 256);
|
|
22
|
+
}
|
|
23
|
+
return Array.from(bytes).map((b) => b.toString(16).padStart(2, "0")).join("").slice(0, 4);
|
|
24
|
+
}
|
|
25
|
+
export function generateBranchName(slug, sessionId) {
|
|
26
|
+
const clean = slug
|
|
27
|
+
.toLowerCase()
|
|
28
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
29
|
+
.replace(/^-|-$/g, "")
|
|
30
|
+
.slice(0, 30) || "task";
|
|
31
|
+
return `ra/${clean}-${sessionId}`;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"AAkDA,MAAM,UAAU,gBAAgB,CAAC,MAAqB;IACpD,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,UAAU,CAAC;AACxG,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAqB;IAClD,OAAO,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,aAAa,IAAI,MAAM,KAAK,MAAM,CAAC;AACxG,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,2EAA2E;IAC3E,kDAAkD;IAClD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAChC,cAAc;IACd,uDAAuD;IACvD,IAAI,CAAC;QACH,aAAa;QACb,UAAU,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IACpG,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,SAAiB;IAChE,MAAM,KAAK,GAAG,IAAI;SACf,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC;IAC1B,OAAO,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;AACpC,CAAC"}
|