codedeck 0.7.3 → 0.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,328 +0,0 @@
1
- import http from "node:http";
2
- import { spawn } from "node:child_process";
3
- import { InvalidArgumentError } from "commander";
4
- import { IpcClient } from "../../daemon/ipc.js";
5
- import { CANVAS_PAGE } from "../../web/canvas-page.js";
6
- import { REVIEW_PAGE } from "../../web/review-page.js";
7
- import { getLocalReview } from "../../git/review.js";
8
- export const DEFAULT_WEB_PORT = 3100;
9
- export function parseWebPort(raw) {
10
- if (raw === undefined)
11
- return DEFAULT_WEB_PORT;
12
- if (!/^\d+$/.test(raw)) {
13
- throw new InvalidArgumentError("--port must be a positive integer");
14
- }
15
- const port = Number(raw);
16
- if (!Number.isInteger(port) || port <= 0 || port > 65535) {
17
- throw new InvalidArgumentError("--port must be a positive integer");
18
- }
19
- return port;
20
- }
21
- /**
22
- * Pure route split for /api/sessions/:id[/stream|/logs|/get|/send|/release].
23
- * More specific routes must be tried before this one so "stream" never lands
24
- * in :id handling. "send"/"release" are the only POST routes; the method
25
- * check lives at the callsite, so a GET to either parses here and then falls
26
- * through to 404.
27
- */
28
- export function parseSessionSubpath(parts) {
29
- if (parts.length < 3 || parts[0] !== "api" || parts[1] !== "sessions" || !parts[2]) {
30
- return null;
31
- }
32
- const id = decodeURIComponent(parts[2]);
33
- if (parts.length === 3)
34
- return { action: "get", id };
35
- if (parts.length === 4 && parts[3] === "stream")
36
- return { action: "stream", id };
37
- if (parts.length === 4 && parts[3] === "logs")
38
- return { action: "logs", id };
39
- if (parts.length === 4 && parts[3] === "send")
40
- return { action: "send", id };
41
- if (parts.length === 4 && parts[3] === "release")
42
- return { action: "release", id };
43
- return null;
44
- }
45
- export function sseData(data) {
46
- return `data: ${JSON.stringify(data)}\n\n`;
47
- }
48
- export function sseNamed(name, data) {
49
- return `event: ${name}\n${sseData(data)}`;
50
- }
51
- export function sseComment(text = "connected") {
52
- return `: ${text}\n\n`;
53
- }
54
- // POST /api/sessions/:id/send body cap. A turn prompt larger than this is
55
- // almost always a mistake; the drain (no req.destroy) keeps the socket clean.
56
- export const MAX_SEND_BODY_BYTES = 64 * 1024;
57
- /** Validates the parsed /send body: returns the trimmed message or null. */
58
- export function parseSendBody(body) {
59
- if (typeof body !== "object" || body === null || !("message" in body))
60
- return null;
61
- const message = body.message;
62
- if (typeof message !== "string")
63
- return null;
64
- const trimmed = message.trim();
65
- return trimmed === "" ? null : trimmed;
66
- }
67
- function sendErrorStatus(code) {
68
- if (code === "SESSION_NOT_FOUND")
69
- return 404;
70
- if (code === "SESSION_BUSY")
71
- return 409;
72
- if (code === "CAPABILITY_NOT_SUPPORTED")
73
- return 400;
74
- if (code === "INVALID")
75
- return 400;
76
- return 502;
77
- }
78
- export function openBrowser(url) {
79
- const opener = process.platform === "darwin"
80
- ? "open"
81
- : process.platform === "win32"
82
- ? "cmd"
83
- : "xdg-open";
84
- const args = process.platform === "win32" ? ["/c", "start", "", url] : [url];
85
- try {
86
- const child = spawn(opener, args, { detached: true, stdio: "ignore" });
87
- child.unref();
88
- return true;
89
- }
90
- catch {
91
- return false;
92
- }
93
- }
94
- function sendJson(res, code, value) {
95
- res.writeHead(code, { "content-type": "application/json; charset=utf-8" });
96
- res.end(JSON.stringify(value));
97
- }
98
- export function createWebHandler(bridge, reviewDeps) {
99
- return (req, res) => {
100
- void (async () => {
101
- try {
102
- // Loopback base: only the path and query of the incoming request are
103
- // read, nothing is ever fetched. (A non-loopback dummy base trips
104
- // the S5332 cleartext-protocol rule.)
105
- const url = new URL(req.url || "/", "http://127.0.0.1");
106
- const parts = url.pathname.split("/").filter(Boolean);
107
- if (req.method === "GET" && url.pathname === "/") {
108
- res.writeHead(200, { "content-type": "text/html; charset=utf-8" });
109
- res.end(CANVAS_PAGE);
110
- return;
111
- }
112
- if (req.method === "GET" && url.pathname === "/api/health") {
113
- sendJson(res, 200, { ok: true });
114
- return;
115
- }
116
- if (req.method === "GET" && url.pathname === "/api/status") {
117
- sendJson(res, 200, await bridge.request("daemon.status", {}));
118
- return;
119
- }
120
- if (req.method === "GET" && url.pathname === "/api/sessions") {
121
- const all = url.searchParams.get("all") === "1";
122
- sendJson(res, 200, await bridge.request("session.list", { all }));
123
- return;
124
- }
125
- if (req.method === "GET" && url.pathname === "/api/usage") {
126
- const period = url.searchParams.get("period") || "today";
127
- sendJson(res, 200, await bridge.request("usage.query", { period }));
128
- return;
129
- }
130
- if (req.method === "GET" && url.pathname === "/review") {
131
- res.writeHead(200, { "content-type": "text/html; charset=utf-8" });
132
- res.end(REVIEW_PAGE);
133
- return;
134
- }
135
- if (req.method === "GET" && url.pathname === "/api/review") {
136
- const ref = url.searchParams.get("ref") || "HEAD";
137
- const file = url.searchParams.get("file") || undefined;
138
- const root = reviewDeps?.root ?? process.cwd();
139
- try {
140
- const load = reviewDeps?.loadReview ?? ((r, q, f) => getLocalReview(r, { ref: q, file: f }));
141
- sendJson(res, 200, await load(root, ref, file));
142
- }
143
- catch (error) {
144
- const message = error instanceof Error ? error.message : String(error);
145
- sendJson(res, message.includes("not a git repository") ? 404 : 500, { error: message });
146
- }
147
- return;
148
- }
149
- const sub = parseSessionSubpath(parts);
150
- if (req.method === "POST" && sub?.action === "send") {
151
- // Body cap: stop buffering past the limit but keep draining so the
152
- // socket closes cleanly; a loopback client has nothing to gain.
153
- const raw = await new Promise((resolve, reject) => {
154
- const chunks = [];
155
- let size = 0;
156
- req.on("data", (chunk) => {
157
- size += chunk.length;
158
- if (size <= MAX_SEND_BODY_BYTES)
159
- chunks.push(chunk);
160
- });
161
- req.on("end", () => resolve(size > MAX_SEND_BODY_BYTES ? null : Buffer.concat(chunks).toString("utf8")));
162
- req.on("error", reject);
163
- });
164
- if (raw === null) {
165
- sendJson(res, 413, { error: "message body too large" });
166
- return;
167
- }
168
- let parsed;
169
- try {
170
- parsed = JSON.parse(raw);
171
- }
172
- catch {
173
- sendJson(res, 400, { error: "invalid JSON body" });
174
- return;
175
- }
176
- const message = parseSendBody(parsed);
177
- if (message === null) {
178
- sendJson(res, 400, { error: "message required" });
179
- return;
180
- }
181
- try {
182
- const result = await bridge.request("session.send", { id: sub.id, message });
183
- sendJson(res, 200, result);
184
- }
185
- catch (error) {
186
- const code = error instanceof Error && "code" in error ? String(error.code) : undefined;
187
- sendJson(res, sendErrorStatus(code), { error: error instanceof Error ? error.message : String(error) });
188
- }
189
- return;
190
- }
191
- if (req.method === "POST" && sub?.action === "release") {
192
- try {
193
- const result = await bridge.request("session.release", { id: sub.id });
194
- sendJson(res, 200, result);
195
- }
196
- catch (error) {
197
- const code = error instanceof Error && "code" in error ? String(error.code) : undefined;
198
- sendJson(res, sendErrorStatus(code), { error: error instanceof Error ? error.message : String(error) });
199
- }
200
- return;
201
- }
202
- if (req.method === "GET" && sub?.action === "stream") {
203
- // Pre-flight before the 200: otherwise the browser holds an
204
- // EventSource open on pings with no visible error when the daemon
205
- // is down or the session does not exist.
206
- try {
207
- await bridge.request("session.get", { id: sub.id });
208
- }
209
- catch {
210
- sendJson(res, 404, { error: "session not found or daemon unavailable" });
211
- return;
212
- }
213
- res.writeHead(200, {
214
- "content-type": "text/event-stream; charset=utf-8",
215
- "cache-control": "no-cache",
216
- connection: "keep-alive",
217
- });
218
- res.write(sseComment());
219
- const keepalive = setInterval(() => {
220
- try {
221
- res.write(sseComment("ping"));
222
- }
223
- catch {
224
- // Client is gone; req close below owns the cleanup.
225
- }
226
- }, 25000);
227
- const off = bridge.subscribe(sub.id, (event) => {
228
- try {
229
- res.write(sseData(event));
230
- }
231
- catch {
232
- // Client is gone; req close below owns the cleanup.
233
- }
234
- }, () => {
235
- try {
236
- res.write(sseNamed("done", {}));
237
- }
238
- catch {
239
- // Client is gone; req close below owns the cleanup.
240
- }
241
- }, () => {
242
- try {
243
- res.write(sseNamed("error", { error: "daemon disconnected" }));
244
- }
245
- catch {
246
- // Client is gone; req close below owns the cleanup.
247
- }
248
- });
249
- req.on("close", () => {
250
- clearInterval(keepalive);
251
- off();
252
- });
253
- return;
254
- }
255
- if (req.method === "GET" && sub?.action === "logs") {
256
- sendJson(res, 200, await bridge.request("session.logs", { id: sub.id }));
257
- return;
258
- }
259
- if (req.method === "GET" && sub?.action === "get") {
260
- sendJson(res, 200, await bridge.request("session.get", { id: sub.id }));
261
- return;
262
- }
263
- sendJson(res, 404, { error: "not found" });
264
- }
265
- catch (error) {
266
- // The pre-flight and stream branches answer above, so reaching here
267
- // means no bytes were written yet and a JSON error is still safe.
268
- try {
269
- sendJson(res, 500, { error: error instanceof Error ? error.message : String(error) });
270
- }
271
- catch {
272
- try {
273
- res.end();
274
- }
275
- catch {
276
- // Last resort: the socket is already unusable.
277
- }
278
- }
279
- }
280
- })();
281
- };
282
- }
283
- export function registerWebCommand(program) {
284
- program
285
- .command("web")
286
- .description("Serve the realtime runs canvas in the browser (localhost only, no auth)")
287
- .option("--port <n>", "port to listen on (default: 3100)", String(DEFAULT_WEB_PORT))
288
- .option("--open", "open the canvas in the default browser")
289
- .action(async (opts) => {
290
- let port;
291
- try {
292
- port = parseWebPort(opts.port);
293
- }
294
- catch (error) {
295
- console.error(error instanceof Error ? error.message : String(error));
296
- process.exit(1);
297
- throw error;
298
- }
299
- const client = new IpcClient();
300
- try {
301
- await client.ensureDaemonStarted();
302
- }
303
- catch {
304
- // The bridge answers with JSON errors when the daemon is down, so a
305
- // cold start failing here must not take the page down with it.
306
- }
307
- const server = http.createServer(createWebHandler(client));
308
- await new Promise((resolve, reject) => {
309
- server.once("error", reject);
310
- server.listen(port, "127.0.0.1", () => resolve());
311
- }).catch((error) => {
312
- console.error(`Failed to listen on 127.0.0.1:${port}: ${error instanceof Error ? error.message : String(error)}`);
313
- process.exit(1);
314
- });
315
- const url = `http://127.0.0.1:${port}/`;
316
- console.log(`CodeDeck web on ${url}`);
317
- if (opts.open && !openBrowser(url)) {
318
- console.log(`Could not open a browser, visit ${url} manually.`);
319
- }
320
- const shutdown = () => {
321
- server.close(() => process.exit(0));
322
- setTimeout(() => process.exit(0), 1000).unref?.();
323
- };
324
- process.on("SIGINT", shutdown);
325
- process.on("SIGTERM", shutdown);
326
- });
327
- }
328
- //# sourceMappingURL=web.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"web.js","sourceRoot":"","sources":["../../../src/cli/commands/web.ts"],"names":[],"mappings":"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"}
@@ -1,55 +0,0 @@
1
- export class ProcessManager {
2
- processes = new Map();
3
- register(sessionId, proc) {
4
- this.processes.set(sessionId, { sessionId, pid: proc.pid, proc, startedAt: new Date() });
5
- proc.on("close", () => {
6
- // Keep entry for a bit for status, but mark as done
7
- // Don't delete immediately so daemon can know exit code
8
- });
9
- }
10
- get(sessionId) {
11
- return this.processes.get(sessionId);
12
- }
13
- has(sessionId) {
14
- return this.processes.has(sessionId);
15
- }
16
- async stop(sessionId, gracefulMs = 3000) {
17
- const mp = this.processes.get(sessionId);
18
- if (!mp)
19
- return false;
20
- const proc = mp.proc;
21
- if (proc.killed || proc.exitCode !== null)
22
- return true;
23
- try {
24
- proc.kill("SIGTERM");
25
- }
26
- catch { }
27
- const start = Date.now();
28
- while (Date.now() - start < gracefulMs) {
29
- if (proc.exitCode !== null || proc.killed)
30
- return true;
31
- await new Promise((r) => setTimeout(r, 200));
32
- }
33
- try {
34
- if (proc.exitCode === null)
35
- proc.kill("SIGKILL");
36
- }
37
- catch { }
38
- await new Promise((r) => setTimeout(r, 500));
39
- return true;
40
- }
41
- unregister(sessionId) {
42
- this.processes.delete(sessionId);
43
- }
44
- list() {
45
- return [...this.processes.values()];
46
- }
47
- isAlive(sessionId) {
48
- const mp = this.processes.get(sessionId);
49
- if (!mp)
50
- return false;
51
- const proc = mp.proc;
52
- return proc.exitCode === null && !proc.killed;
53
- }
54
- }
55
- //# sourceMappingURL=process-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"process-manager.js","sourceRoot":"","sources":["../../src/daemon/process-manager.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,cAAc;IACjB,SAAS,GAAG,IAAI,GAAG,EAA0B,CAAC;IAEtD,QAAQ,CAAC,SAAiB,EAAE,IAAkB;QAC5C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QACzF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACpB,oDAAoD;YACpD,wDAAwD;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,GAAG,CAAC,SAAiB;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAED,GAAG,CAAC,SAAiB;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAiB,EAAE,UAAU,GAAG,IAAI;QAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,CAAC,EAAE;YAAE,OAAO,KAAK,CAAC;QACtB,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;QACrB,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACvD,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,UAAU,EAAE,CAAC;YACvC,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YACvD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;gBAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,UAAU,CAAC,SAAiB;QAC1B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,CAAC,SAAiB;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,CAAC,EAAE;YAAE,OAAO,KAAK,CAAC;QACtB,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;QACrB,OAAO,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAChD,CAAC;CACF"}