claude-code-infinite 1.0.34 → 1.0.35

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.
@@ -0,0 +1,103 @@
1
+ /**
2
+ * The session's newest MemTree link, cached on disk for Claude Code's status line.
3
+ *
4
+ * The end-of-turn link shows only when a turn ends after a new tree finished, so in long
5
+ * sessions it rarely appears, and the newest-tree lookup behind it (memtree-newest.ts) can
6
+ * take 7-22 s on the server. A status line must never wait on that: Claude Code runs it
7
+ * after every message. So the proxy writes the link to one small file per session whenever
8
+ * it learns a newer one (a compress answer's page, or the newest-tree lookup answering in
9
+ * the background), and the status line only reads that file (statusline.ts, or the shell
10
+ * one-liner in the README).
11
+ *
12
+ * `<config dir>/statusline/<session id>.url`: the URL and a newline. Written then renamed,
13
+ * so a reader never sees half a file; bounded to the newest MAX_FILES sessions. Every
14
+ * failure is swallowed: the link is a convenience.
15
+ */
16
+ import fs from "node:fs";
17
+ import path from "node:path";
18
+ import { getConfigDir } from "./config.js";
19
+ export const STATUS_LINK_DIR = "statusline";
20
+ export const STATUS_LINK_SUFFIX = ".url";
21
+ /** Session ids Claude Code uses (UUIDs); anything else never names a file. */
22
+ const SESSION_ID = /^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/;
23
+ const MAX_FILES = 200;
24
+ /** Prune at most this often (a directory listing per write would be wasteful). */
25
+ const PRUNE_EVERY_WRITES = 20;
26
+ export function statusLinkDir() {
27
+ return path.join(getConfigDir(), STATUS_LINK_DIR);
28
+ }
29
+ /** The cached link for `sessionId`, or undefined. Never throws. */
30
+ export function readStatusLink(sessionId, dir = statusLinkDir()) {
31
+ if (typeof sessionId !== "string" || !SESSION_ID.test(sessionId))
32
+ return undefined;
33
+ try {
34
+ const url = fs.readFileSync(path.join(dir, `${sessionId}${STATUS_LINK_SUFFIX}`), "utf-8")
35
+ .trim();
36
+ return /^https?:\/\/\S+$/.test(url) ? url : undefined;
37
+ }
38
+ catch {
39
+ return undefined;
40
+ }
41
+ }
42
+ export class StatusLinkFiles {
43
+ dir;
44
+ maxFiles;
45
+ written = new Map();
46
+ writes = 0;
47
+ constructor(dir = statusLinkDir(), maxFiles = MAX_FILES) {
48
+ this.dir = dir;
49
+ this.maxFiles = maxFiles;
50
+ }
51
+ /** Record `url` as the session's link; writes only when it changed. Never throws. */
52
+ write(sessionId, url) {
53
+ if (!sessionId || !SESSION_ID.test(sessionId) || !url || !/^https?:\/\/\S+$/.test(url))
54
+ return;
55
+ // Unchanged and still on disk as written (another ccc process may have pruned it, or
56
+ // written an older link for the same resumed session).
57
+ if (this.written.get(sessionId) === url && readStatusLink(sessionId, this.dir) === url)
58
+ return;
59
+ const file = path.join(this.dir, `${sessionId}${STATUS_LINK_SUFFIX}`);
60
+ try {
61
+ fs.mkdirSync(this.dir, { recursive: true });
62
+ const tmp = `${file}.${process.pid}.tmp`;
63
+ fs.writeFileSync(tmp, `${url}\n`, { mode: 0o600 });
64
+ fs.renameSync(tmp, file);
65
+ this.remember(sessionId, url);
66
+ if (++this.writes % PRUNE_EVERY_WRITES === 1)
67
+ this.prune();
68
+ }
69
+ catch {
70
+ // A missed status-line link is never an error.
71
+ }
72
+ }
73
+ remember(sessionId, url) {
74
+ this.written.delete(sessionId);
75
+ this.written.set(sessionId, url);
76
+ while (this.written.size > this.maxFiles)
77
+ this.written.delete(this.written.keys().next().value);
78
+ }
79
+ /** Keep the newest maxFiles links (by modification time). */
80
+ prune() {
81
+ const files = fs.readdirSync(this.dir)
82
+ .filter((name) => name.endsWith(STATUS_LINK_SUFFIX))
83
+ .map((name) => ({ name, at: mtime(path.join(this.dir, name)) }))
84
+ .sort((a, b) => b.at - a.at);
85
+ for (const { name } of files.slice(this.maxFiles)) {
86
+ try {
87
+ fs.unlinkSync(path.join(this.dir, name));
88
+ }
89
+ catch {
90
+ // Another process pruned it first.
91
+ }
92
+ }
93
+ }
94
+ }
95
+ function mtime(file) {
96
+ try {
97
+ return fs.statSync(file).mtimeMs;
98
+ }
99
+ catch {
100
+ return 0;
101
+ }
102
+ }
103
+ //# sourceMappingURL=status-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-link.js","sourceRoot":"","sources":["../src/status-link.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /** What `install` puts in settings.json. */
2
+ export declare const STATUSLINE_COMMAND = "ccc statusline";
3
+ /** The link's text where the terminal shows OSC 8 hyperlinks. */
4
+ export declare const STATUSLINE_LABEL = "\uD83C\uDF3F tree";
5
+ export declare const STATUSLINE_SEPARATOR = " | ";
6
+ /**
7
+ * Set for the wrapped command: a `ccc statusline` inside it (a wrapped command that itself
8
+ * calls ccc's, under another spelling) prints nothing instead of recursing.
9
+ */
10
+ export declare const WRAPPED_ENV = "CCC_STATUSLINE_WRAPPED";
11
+ export interface StatuslinePaths {
12
+ /** Claude Code's user settings (CLAUDE_CONFIG_DIR/settings.json or ~/.claude/settings.json). */
13
+ settings: string;
14
+ /** The wrapped original statusLine, saved by install (in ccc's config dir). */
15
+ saved: string;
16
+ /** The cached links (status-link.ts). */
17
+ links?: string;
18
+ }
19
+ export declare function statuslinePaths(env?: NodeJS.ProcessEnv): StatuslinePaths;
20
+ /** `ccc statusline [install|uninstall]`; returns the exit code. */
21
+ export declare function statuslineMain(args: string[], paths?: StatuslinePaths, out?: (text: string) => boolean): Promise<number>;
22
+ /** The status line: the wrapped command's output, then the session's link. */
23
+ export declare function renderStatusline(input: string, paths: StatuslinePaths, env?: NodeJS.ProcessEnv): Promise<string>;
24
+ /** ` 🌿 tree` linked to the session's page, or the URL; "" with no cached link. */
25
+ export declare function linkSegment(sessionId: unknown, env?: NodeJS.ProcessEnv, dir?: string): string;
26
+ /**
27
+ * Point Claude Code's statusLine at `ccc statusline`, saving the current one to wrap.
28
+ * Re-running is harmless; a statusLine that is not a command is left alone.
29
+ */
30
+ export declare function installStatusline(paths: StatuslinePaths, platform?: NodeJS.Platform): {
31
+ ok: boolean;
32
+ message: string;
33
+ };
34
+ /** Put back the statusLine install replaced (or remove ours when there was none). */
35
+ export declare function uninstallStatusline(paths: StatuslinePaths): {
36
+ ok: boolean;
37
+ message: string;
38
+ };
39
+ /**
40
+ * The wrapped command's stdout, trailing newlines trimmed ("" if it fails). Run in its own
41
+ * process group, so a timeout kills everything it started (no pile-up across refreshes).
42
+ */
43
+ export declare function runWrapped(command: string, input: string, timeoutMs?: number): Promise<string>;
44
+ /** `pid` and every descendant (from `ps`; just `pid` where there is none, e.g. Windows). */
45
+ export declare function processTree(pid: number | undefined): number[];
46
+ /**
47
+ * Whether Claude Code's status line reads ccc's link (installed, or the README snippet):
48
+ * only then does the proxy keep the link fresh in the background. Read at startup.
49
+ */
50
+ export declare function statusLineWantsLink(settingsFile?: string): boolean;
51
+ //# sourceMappingURL=statusline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statusline.d.ts","sourceRoot":"","sources":["../src/statusline.ts"],"names":[],"mappings":"AAwBA,4CAA4C;AAC5C,eAAO,MAAM,kBAAkB,mBAAmB,CAAC;AACnD,iEAAiE;AACjE,eAAO,MAAM,gBAAgB,sBAAY,CAAC;AAC1C,eAAO,MAAM,oBAAoB,QAAQ,CAAC;AAK1C;;;GAGG;AACH,eAAO,MAAM,WAAW,2BAA2B,CAAC;AAIpD,MAAM,WAAW,eAAe;IAC9B,gGAAgG;IAChG,QAAQ,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,eAAe,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,eAAe,CAOrF;AAED,mEAAmE;AACnE,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,kBAAoB,EAAE,GAAG,IAAI,MAAM,MAAM,YAA+B,GAC5F,OAAO,CAAC,MAAM,CAAC,CAUjB;AAED,8EAA8E;AAC9E,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAC1E,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED,mFAAmF;AACnF,wBAAgB,WAAW,CACzB,SAAS,EAAE,OAAO,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,EAAE,GAAG,CAAC,EAAE,MAAM,GACrE,MAAM,CAMR;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,eAAe,EAAE,QAAQ,GAAE,MAAM,CAAC,QAA2B,GACnE;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAiClC;AAED,qFAAqF;AACrF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA4B5F;AAqDD;;;GAGG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,SAAqB,GAC7D,OAAO,CAAC,MAAM,CAAC,CAgCjB;AAED,4FAA4F;AAC5F,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAoB7D;AA6FD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,SAA6B,GAAG,OAAO,CAKtF"}
@@ -0,0 +1,379 @@
1
+ /**
2
+ * `ccc statusline`: this session's MemTree link in Claude Code's status line.
3
+ *
4
+ * - `ccc statusline` is a status-line command: it reads Claude Code's JSON from stdin,
5
+ * runs the user's own status-line command (if `install` wrapped one) with the same
6
+ * input, and appends ` | 🌿 tree` (an OSC 8 link to the session's newest MemTree page;
7
+ * the bare URL where the terminal has no hyperlinks). It only reads the cached link the
8
+ * proxy writes (status-link.ts): never a server call, so the status line stays fast.
9
+ * - `ccc statusline install` (opt-in) points Claude Code's `statusLine` at it, keeping the
10
+ * existing command, which it wraps rather than replaces; settings.json is backed up first.
11
+ * - `ccc statusline uninstall` puts the original back.
12
+ *
13
+ * Loaded straight from cli.ts (no proxy, no update check): Claude Code runs a status line
14
+ * after every message.
15
+ */
16
+ import { spawn, spawnSync } from "node:child_process";
17
+ import { createHash } from "node:crypto";
18
+ import fs from "node:fs";
19
+ import os from "node:os";
20
+ import path from "node:path";
21
+ import { getConfigDir } from "./config.js";
22
+ import { terminalSupportsHyperlinks } from "./hooks.js";
23
+ import { readStatusLink } from "./status-link.js";
24
+ /** What `install` puts in settings.json. */
25
+ export const STATUSLINE_COMMAND = "ccc statusline";
26
+ /** The link's text where the terminal shows OSC 8 hyperlinks. */
27
+ export const STATUSLINE_LABEL = "🌿 tree";
28
+ export const STATUSLINE_SEPARATOR = " | ";
29
+ /** The wrapped command gets this long; Claude Code drops a slow status line anyway. */
30
+ const WRAPPED_TIMEOUT_MS = 5_000;
31
+ /** After SIGTERM, how long the wrapped command's group gets before SIGKILL. */
32
+ const KILL_GRACE_MS = 500;
33
+ /**
34
+ * Set for the wrapped command: a `ccc statusline` inside it (a wrapped command that itself
35
+ * calls ccc's, under another spelling) prints nothing instead of recursing.
36
+ */
37
+ export const WRAPPED_ENV = "CCC_STATUSLINE_WRAPPED";
38
+ /** A command that runs ccc's status line, however ccc is spelled (path, npx, a shell). */
39
+ const CCC_STATUSLINE = /(^|[\s/\\'"])(ccc|claude-code-infinite)(\.cmd|\.js)?['"]?\s+statusline\b/;
40
+ export function statuslinePaths(env = process.env) {
41
+ const dir = env.CLAUDE_CONFIG_DIR?.trim() || path.join(os.homedir(), ".claude");
42
+ const settings = path.join(dir, "settings.json");
43
+ // One saved original per settings file, however it is reached (aliases, symlinks).
44
+ const resolved = resolvedPath(settings);
45
+ const key = createHash("sha256").update(resolved).digest("hex").slice(0, 12);
46
+ return { settings, saved: path.join(getConfigDir(), `statusline-${key}.json`) };
47
+ }
48
+ /** `ccc statusline [install|uninstall]`; returns the exit code. */
49
+ export async function statuslineMain(args, paths = statuslinePaths(), out = (text) => process.stdout.write(text)) {
50
+ const command = args[0];
51
+ if (command === "install")
52
+ return report(installStatusline(paths), out);
53
+ if (command === "uninstall")
54
+ return report(uninstallStatusline(paths), out);
55
+ if (command !== undefined) {
56
+ out("Usage: ccc statusline [install|uninstall]\n");
57
+ return 2;
58
+ }
59
+ out(await renderStatusline(await readStdin(), paths));
60
+ return 0;
61
+ }
62
+ /** The status line: the wrapped command's output, then the session's link. */
63
+ export async function renderStatusline(input, paths, env = process.env) {
64
+ if (env[WRAPPED_ENV])
65
+ return "";
66
+ const wrapped = savedStatusLine(savedFile(paths));
67
+ const base = wrapped ? await runWrapped(wrapped.command, input) : "";
68
+ const segment = linkSegment(sessionIdOf(input), env, paths.links);
69
+ if (!segment)
70
+ return base;
71
+ return base ? `${base}${STATUSLINE_SEPARATOR}${segment}` : segment;
72
+ }
73
+ /** ` 🌿 tree` linked to the session's page, or the URL; "" with no cached link. */
74
+ export function linkSegment(sessionId, env = process.env, dir) {
75
+ const url = readStatusLink(sessionId, dir);
76
+ if (!url)
77
+ return "";
78
+ const mode = env.CCC_STATUSLINE_LINK;
79
+ const osc8 = mode === "osc8" || (mode !== "url" && terminalSupportsHyperlinks(env, { isTTY: true }));
80
+ return osc8 ? `\x1b]8;;${url}\x1b\\${STATUSLINE_LABEL}\x1b]8;;\x1b\\` : url;
81
+ }
82
+ /**
83
+ * Point Claude Code's statusLine at `ccc statusline`, saving the current one to wrap.
84
+ * Re-running is harmless; a statusLine that is not a command is left alone.
85
+ */
86
+ export function installStatusline(paths, platform = process.platform) {
87
+ // Claude Code runs a statusLine through Git Bash there; ccc would run it under cmd.exe.
88
+ if (platform === "win32") {
89
+ return { ok: false, message: "ccc statusline install is not supported on Windows yet. " +
90
+ "Add the link with the snippet in ccc's README instead." };
91
+ }
92
+ const settings = readSettings(paths.settings);
93
+ if (!settings.ok)
94
+ return { ok: false, message: settings.message };
95
+ const current = settings.value.statusLine;
96
+ if (isOurs(current)) {
97
+ return { ok: true, message: "ccc statusline is already installed. Restart Claude Code to see it." };
98
+ }
99
+ if (runsCccStatusline(current)) {
100
+ return { ok: false, message: `${paths.settings}: your statusLine already runs ccc statusline; ` +
101
+ "left unchanged." };
102
+ }
103
+ if (current !== undefined && (typeof current !== "object" || current.type !== "command" ||
104
+ typeof current.command !== "string")) {
105
+ return { ok: false, message: `${paths.settings}: statusLine is not a command; left unchanged.` };
106
+ }
107
+ const failed = attempt(() => {
108
+ writeJson(paths.saved, { settings: path.resolve(paths.settings),
109
+ resolved: resolvedPath(paths.settings),
110
+ statusLine: current ?? null });
111
+ backup(paths.settings);
112
+ // Its other options (padding, refreshInterval, hideVimModeIndicator, ...) stay.
113
+ settings.value.statusLine = { ...current, type: "command", command: STATUSLINE_COMMAND };
114
+ writeJson(paths.settings, settings.value);
115
+ });
116
+ if (failed)
117
+ return { ok: false, message: `Could not install: ${failed}` };
118
+ const kept = current ? " It runs your existing status line and adds the link." : "";
119
+ return { ok: true, message: `Installed: ${paths.settings} statusLine is now ` +
120
+ `"${STATUSLINE_COMMAND}".${kept} Undo: ccc statusline uninstall.` };
121
+ }
122
+ /** Put back the statusLine install replaced (or remove ours when there was none). */
123
+ export function uninstallStatusline(paths) {
124
+ const settings = readSettings(paths.settings);
125
+ if (!settings.ok)
126
+ return { ok: false, message: settings.message };
127
+ if (!isOurs(settings.value.statusLine)) {
128
+ return { ok: true, message: "ccc statusline is not installed; nothing changed." };
129
+ }
130
+ const file = savedFile(paths);
131
+ const saved = readJson(file);
132
+ // No record of what install replaced: guessing could delete the user's own status line.
133
+ if (!saved || !("statusLine" in saved)) {
134
+ return { ok: false, message: `No saved original for ${paths.settings} (${paths.saved}); ` +
135
+ "set statusLine yourself." };
136
+ }
137
+ const failed = attempt(() => {
138
+ backup(paths.settings);
139
+ if (saved.statusLine && typeof saved.statusLine === "object") {
140
+ // The original command back; options changed since install stay as they are now.
141
+ const original = saved.statusLine;
142
+ settings.value.statusLine = { ...settings.value.statusLine,
143
+ type: original.type, command: original.command };
144
+ }
145
+ else {
146
+ delete settings.value.statusLine;
147
+ }
148
+ writeJson(paths.settings, settings.value);
149
+ fs.unlinkSync(file);
150
+ });
151
+ if (failed)
152
+ return { ok: false, message: `Could not uninstall: ${failed}` };
153
+ return { ok: true, message: `Restored ${paths.settings} statusLine.` };
154
+ }
155
+ /** Exactly what install writes: only this is ccc's to replace or remove. */
156
+ function isOurs(statusLine) {
157
+ const command = statusLine?.command;
158
+ return typeof command === "string" && command.trim() === STATUSLINE_COMMAND;
159
+ }
160
+ /** Any command that runs ccc's status line (never wrapped: it would recurse). */
161
+ function runsCccStatusline(statusLine) {
162
+ const command = statusLine?.command;
163
+ return typeof command === "string" && CCC_STATUSLINE.test(command.trim());
164
+ }
165
+ /** `run`'s error message, or undefined when it succeeded. */
166
+ function attempt(run) {
167
+ try {
168
+ run();
169
+ return undefined;
170
+ }
171
+ catch (error) {
172
+ return error instanceof Error ? error.message : String(error);
173
+ }
174
+ }
175
+ /**
176
+ * The saved original for this settings file: under its key, else (the file was turned into
177
+ * a symlink, or replaced by a regular one, after install) the one that recorded its path.
178
+ */
179
+ function savedFile(paths) {
180
+ if (fs.existsSync(paths.saved))
181
+ return paths.saved;
182
+ const dir = path.dirname(paths.saved);
183
+ const wanted = new Set([path.resolve(paths.settings), resolvedPath(paths.settings)]);
184
+ try {
185
+ for (const name of fs.readdirSync(dir)) {
186
+ if (!/^statusline-[0-9a-f]+\.json$/.test(name))
187
+ continue;
188
+ const saved = readJson(path.join(dir, name));
189
+ if ([saved?.settings, saved?.resolved].some((p) => typeof p === "string" && wanted.has(p))) {
190
+ return path.join(dir, name);
191
+ }
192
+ }
193
+ }
194
+ catch {
195
+ // No config dir yet.
196
+ }
197
+ return paths.saved;
198
+ }
199
+ /** The statusLine install saved, when it was a command to wrap (never ccc's own). */
200
+ function savedStatusLine(file) {
201
+ const saved = readJson(file)?.statusLine;
202
+ return typeof saved?.command === "string" && !CCC_STATUSLINE.test(saved.command)
203
+ ? { command: saved.command } : undefined;
204
+ }
205
+ /**
206
+ * The wrapped command's stdout, trailing newlines trimmed ("" if it fails). Run in its own
207
+ * process group, so a timeout kills everything it started (no pile-up across refreshes).
208
+ */
209
+ export function runWrapped(command, input, timeoutMs = WRAPPED_TIMEOUT_MS) {
210
+ return new Promise((resolve) => {
211
+ // Not detached: a new session would lose the controlling terminal (`stty size </dev/tty`).
212
+ const child = spawn(command, { shell: true, stdio: ["pipe", "pipe", "ignore"],
213
+ env: { ...process.env, [WRAPPED_ENV]: "1" } });
214
+ const chunks = [];
215
+ let done = false;
216
+ const finish = (text) => {
217
+ if (done)
218
+ return;
219
+ done = true;
220
+ clearTimeout(timer);
221
+ resolve(text);
222
+ };
223
+ const timer = setTimeout(() => {
224
+ const tree = processTree(child.pid);
225
+ killAll(tree, "SIGTERM");
226
+ // Kept referenced: ccc waits the grace out so the forced kill is sent.
227
+ setTimeout(() => {
228
+ killAll(tree, "SIGKILL");
229
+ child.stdout.destroy();
230
+ child.unref();
231
+ }, KILL_GRACE_MS);
232
+ finish("");
233
+ }, timeoutMs);
234
+ child.stdout.on("data", (chunk) => chunks.push(chunk));
235
+ child.on("error", () => finish(""));
236
+ // As Claude Code does: a failed or killed command shows nothing (the link still shows).
237
+ child.on("close", (code, signal) => finish(code === 0 && !signal
238
+ ? Buffer.concat(chunks).toString("utf-8").replace(/[\r\n]+$/, "") : ""));
239
+ child.stdin.on("error", () => { });
240
+ child.stdin.end(input);
241
+ });
242
+ }
243
+ /** `pid` and every descendant (from `ps`; just `pid` where there is none, e.g. Windows). */
244
+ export function processTree(pid) {
245
+ if (pid === undefined)
246
+ return [];
247
+ const children = new Map();
248
+ if (process.platform !== "win32") {
249
+ const listing = spawnSync("ps", ["-A", "-o", "pid=,ppid="], { encoding: "utf-8", timeout: 2_000 });
250
+ for (const line of (listing.stdout ?? "").split("\n")) {
251
+ const [child, parent] = line.trim().split(/\s+/).map(Number);
252
+ if (!Number.isFinite(child) || !Number.isFinite(parent))
253
+ continue;
254
+ children.set(parent, [...(children.get(parent) ?? []), child]);
255
+ }
256
+ }
257
+ const tree = [];
258
+ const queue = [pid];
259
+ while (queue.length) {
260
+ const next = queue.shift();
261
+ if (tree.includes(next))
262
+ continue;
263
+ tree.push(next);
264
+ queue.push(...(children.get(next) ?? []));
265
+ }
266
+ return tree;
267
+ }
268
+ function killAll(pids, signal) {
269
+ for (const pid of pids) {
270
+ try {
271
+ process.kill(pid, signal);
272
+ }
273
+ catch {
274
+ // Already gone.
275
+ }
276
+ }
277
+ }
278
+ function sessionIdOf(input) {
279
+ try {
280
+ return JSON.parse(input)?.session_id;
281
+ }
282
+ catch {
283
+ return undefined;
284
+ }
285
+ }
286
+ function readSettings(file) {
287
+ if (!fs.existsSync(file))
288
+ return { ok: true, value: {} };
289
+ const value = readJson(file);
290
+ return value && typeof value === "object" && !Array.isArray(value)
291
+ ? { ok: true, value: value }
292
+ : { ok: false, message: `${file} is not valid JSON; left unchanged.` };
293
+ }
294
+ function readJson(file) {
295
+ try {
296
+ return JSON.parse(fs.readFileSync(file, "utf-8"));
297
+ }
298
+ catch {
299
+ return undefined;
300
+ }
301
+ }
302
+ /**
303
+ * Write-then-rename, so Claude Code never reads a half-written settings file. A symlink
304
+ * (dotfile managers) is followed so the link stays, and the file keeps its mode (it can
305
+ * hold secrets in `env`); a new file is owner-only.
306
+ */
307
+ function writeJson(file, value) {
308
+ const target = realTarget(file);
309
+ fs.mkdirSync(path.dirname(target), { recursive: true });
310
+ const mode = fileMode(target) ?? 0o600;
311
+ const tmp = `${target}.${process.pid}.tmp`;
312
+ fs.writeFileSync(tmp, `${JSON.stringify(value, null, 2)}\n`, { mode });
313
+ fs.chmodSync(tmp, mode);
314
+ fs.renameSync(tmp, target);
315
+ }
316
+ /** `file` with symlinks resolved, through its nearest existing ancestor if it is missing. */
317
+ function resolvedPath(file) {
318
+ const missing = [];
319
+ let current = path.resolve(file);
320
+ for (;;) {
321
+ try {
322
+ return path.join(fs.realpathSync(current), ...missing.reverse());
323
+ }
324
+ catch {
325
+ const parent = path.dirname(current);
326
+ if (parent === current)
327
+ return path.resolve(file);
328
+ missing.push(path.basename(current));
329
+ current = parent;
330
+ }
331
+ }
332
+ }
333
+ function realTarget(file) {
334
+ try {
335
+ return fs.realpathSync(file);
336
+ }
337
+ catch {
338
+ return file;
339
+ }
340
+ }
341
+ function fileMode(file) {
342
+ try {
343
+ return fs.statSync(file).mode & 0o777;
344
+ }
345
+ catch {
346
+ return undefined;
347
+ }
348
+ }
349
+ function backup(file) {
350
+ if (!fs.existsSync(file))
351
+ return;
352
+ const stamp = new Date().toISOString().replace(/[:.]/g, "-");
353
+ const copy = `${file}.ccc-backup-${stamp}`;
354
+ fs.copyFileSync(file, copy);
355
+ fs.chmodSync(copy, fileMode(realTarget(file)) ?? 0o600);
356
+ }
357
+ /**
358
+ * Whether Claude Code's status line reads ccc's link (installed, or the README snippet):
359
+ * only then does the proxy keep the link fresh in the background. Read at startup.
360
+ */
361
+ export function statusLineWantsLink(settingsFile = statuslinePaths().settings) {
362
+ const command = (readJson(settingsFile)
363
+ ?.statusLine)?.command;
364
+ return typeof command === "string" &&
365
+ (CCC_STATUSLINE.test(command) || command.includes(".claude-code-infinite/statusline"));
366
+ }
367
+ function report(result, out) {
368
+ out(`${result.message}\n`);
369
+ return result.ok ? 0 : 1;
370
+ }
371
+ async function readStdin() {
372
+ if (process.stdin.isTTY)
373
+ return "";
374
+ const chunks = [];
375
+ for await (const chunk of process.stdin)
376
+ chunks.push(chunk);
377
+ return Buffer.concat(chunks).toString("utf-8");
378
+ }
379
+ //# sourceMappingURL=statusline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statusline.js","sourceRoot":"","sources":["../src/statusline.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-code-infinite",
3
- "version": "1.0.34",
3
+ "version": "1.0.35",
4
4
  "description": "Wrapper for Claude Code CLI",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",