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,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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=driver.js.map
@@ -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"}