claude-code-infinite 1.0.19 → 1.0.21

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 (73) hide show
  1. package/README.md +95 -5
  2. package/dist/auto-update-runner.d.ts +52 -0
  3. package/dist/auto-update-runner.d.ts.map +1 -0
  4. package/dist/auto-update-runner.js +307 -0
  5. package/dist/auto-update-runner.js.map +1 -0
  6. package/dist/auto-update-setup.d.ts +38 -0
  7. package/dist/auto-update-setup.d.ts.map +1 -0
  8. package/dist/auto-update-setup.js +72 -0
  9. package/dist/auto-update-setup.js.map +1 -0
  10. package/dist/auto-update.d.ts +170 -0
  11. package/dist/auto-update.d.ts.map +1 -0
  12. package/dist/auto-update.js +401 -0
  13. package/dist/auto-update.js.map +1 -0
  14. package/dist/cc-request.d.ts +17 -0
  15. package/dist/cc-request.d.ts.map +1 -1
  16. package/dist/cc-request.js +22 -0
  17. package/dist/cc-request.js.map +1 -1
  18. package/dist/cli-main.js +35 -7
  19. package/dist/cli-main.js.map +1 -1
  20. package/dist/config.d.ts +4 -0
  21. package/dist/config.d.ts.map +1 -1
  22. package/dist/config.js.map +1 -1
  23. package/dist/count-tokens.d.ts +38 -3
  24. package/dist/count-tokens.d.ts.map +1 -1
  25. package/dist/count-tokens.js +88 -19
  26. package/dist/count-tokens.js.map +1 -1
  27. package/dist/memtree-finder.d.ts +11 -0
  28. package/dist/memtree-finder.d.ts.map +1 -1
  29. package/dist/memtree-finder.js +18 -0
  30. package/dist/memtree-finder.js.map +1 -1
  31. package/dist/memtree-mcp-config.d.ts.map +1 -1
  32. package/dist/memtree-mcp-config.js +4 -2
  33. package/dist/memtree-mcp-config.js.map +1 -1
  34. package/dist/memtree-mcp.d.ts +24 -4
  35. package/dist/memtree-mcp.d.ts.map +1 -1
  36. package/dist/memtree-mcp.js +47 -14
  37. package/dist/memtree-mcp.js.map +1 -1
  38. package/dist/memtree-tools.d.ts +17 -1
  39. package/dist/memtree-tools.d.ts.map +1 -1
  40. package/dist/memtree-tools.js +50 -2
  41. package/dist/memtree-tools.js.map +1 -1
  42. package/dist/memtree.d.ts +10 -1
  43. package/dist/memtree.d.ts.map +1 -1
  44. package/dist/memtree.js +54 -19
  45. package/dist/memtree.js.map +1 -1
  46. package/dist/notices.d.ts +6 -1
  47. package/dist/notices.d.ts.map +1 -1
  48. package/dist/notices.js +16 -4
  49. package/dist/notices.js.map +1 -1
  50. package/dist/proxy.d.ts +17 -1
  51. package/dist/proxy.d.ts.map +1 -1
  52. package/dist/proxy.js +137 -53
  53. package/dist/proxy.js.map +1 -1
  54. package/dist/reqlog.d.ts +10 -0
  55. package/dist/reqlog.d.ts.map +1 -1
  56. package/dist/reqlog.js.map +1 -1
  57. package/dist/request-sizing.d.ts +21 -2
  58. package/dist/request-sizing.d.ts.map +1 -1
  59. package/dist/request-sizing.js +60 -7
  60. package/dist/request-sizing.js.map +1 -1
  61. package/dist/token-estimate.d.ts +35 -0
  62. package/dist/token-estimate.d.ts.map +1 -0
  63. package/dist/token-estimate.js +97 -0
  64. package/dist/token-estimate.js.map +1 -0
  65. package/dist/update-check.d.ts +23 -4
  66. package/dist/update-check.d.ts.map +1 -1
  67. package/dist/update-check.js +79 -12
  68. package/dist/update-check.js.map +1 -1
  69. package/dist/update-lock.d.ts +68 -0
  70. package/dist/update-lock.d.ts.map +1 -0
  71. package/dist/update-lock.js +176 -0
  72. package/dist/update-lock.js.map +1 -0
  73. package/package.json +1 -1
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Automatic updates: when the startup check (update-check.ts) finds a newer
3
+ * release, install exactly that version in the background, the way Claude
4
+ * Code does ("✔ Update installed · Restart to update").
5
+ *
6
+ * Only when self-updating is safe: a plain global npm install whose package
7
+ * directory is physically inside `<prefix>/lib/node_modules` and writable by
8
+ * this user (no sudo, ever). npm-linked and git checkouts, npx and local
9
+ * installs, pnpm/yarn/bun/volta globals, root/sudo runs and Windows get the
10
+ * hint line only. The install runs in a detached runner (auto-update-runner.ts)
11
+ * that loads no file from the package, so it survives this ccc exiting and
12
+ * npm replacing the package under it.
13
+ *
14
+ * One install at a time across sessions (a lock file with a stale timeout).
15
+ * Every attempt is recorded in update-state.json: a failure backs off for a
16
+ * day, and no version is tried more than twice. The result reaches running
17
+ * sessions through the SessionStart hook (AutoUpdateNotices): "✔ ccc X
18
+ * installed · restart ccc to use it", or on failure today's hint.
19
+ *
20
+ * Running sessions keep the code they started with: the proxy loads all its
21
+ * modules at startup, and the hooks it registers are HTTP calls into it or
22
+ * files in its own temp plugin dir. See README "Automatic updates".
23
+ */
24
+ export { UPDATE_LOCK_STALE_MS, acquireUpdateLock, liveLockSince, releaseUpdateLock, } from "./update-lock.js";
25
+ import { type UpdateAvailable, type UpdateCheckConfig } from "./update-check.js";
26
+ export declare const DISABLE_AUTOUPDATE_ENV = "CCC_DISABLE_AUTOUPDATE";
27
+ /** Claude Code's own opt-out, honored too. */
28
+ export declare const CLAUDE_DISABLE_AUTOUPDATER_ENV = "DISABLE_AUTOUPDATER";
29
+ export declare const UPDATE_STATE_FILE = "update-state.json";
30
+ /** One entry per acquirer (update-lock.ts). */
31
+ export declare const UPDATE_LOCK_DIR = "update.lock.d";
32
+ export declare const UPDATE_LOG_FILE = "auto-update.log";
33
+ export declare const AUTO_UPDATE_BACKOFF_MS: number;
34
+ export declare const MAX_ATTEMPTS_PER_VERSION = 2;
35
+ export declare const INSTALL_TIMEOUT_MS: number;
36
+ /** Wait after launch so the install never competes with Claude Code starting. */
37
+ export declare const AUTO_UPDATE_DELAY_MS = 5000;
38
+ /** This package's own directory (dist/..), as Node resolved it. */
39
+ export declare const PACKAGE_DIR: string;
40
+ /** The config.json fields auto-update reads. */
41
+ export interface AutoUpdateConfig extends UpdateCheckConfig {
42
+ autoUpdate?: boolean;
43
+ }
44
+ export type InstallMethodKind = "npm-global" | "npm-link" | "git-checkout" | "npx" | "local" | "pnpm" | "yarn" | "bun" | "volta" | "not-writable" | "root" | "unsupported-platform" | "unknown";
45
+ export interface InstallMethod {
46
+ kind: InstallMethodKind;
47
+ /** The package directory, resolved through symlinks when possible. */
48
+ packageDir: string;
49
+ /** Why it is (or is not) self-updatable, for the debug log. */
50
+ detail: string;
51
+ /** npm-global only: `<prefix>/lib/node_modules`, `<prefix>`. */
52
+ npmRoot?: string;
53
+ prefix?: string;
54
+ }
55
+ export type AttemptStatus = "running" | "ok" | "failed";
56
+ export interface UpdateAttempt {
57
+ version: string;
58
+ status: AttemptStatus;
59
+ /** Start time while running, else completion time. */
60
+ at: number;
61
+ packageDir: string;
62
+ error?: string;
63
+ }
64
+ export interface UpdateState {
65
+ /** Install attempts per version (newest few kept). */
66
+ attempts: Record<string, number>;
67
+ last?: UpdateAttempt;
68
+ }
69
+ export type AutoUpdateDecision = {
70
+ action: "install";
71
+ version: string;
72
+ method: InstallMethod;
73
+ } | {
74
+ action: "installed";
75
+ version: string;
76
+ } | {
77
+ action: "skip";
78
+ reason: string;
79
+ };
80
+ export interface DetectInstallOptions {
81
+ packageDir: string;
82
+ platform?: NodeJS.Platform;
83
+ /** process.getuid(); undefined where there is none. */
84
+ uid?: number;
85
+ env?: NodeJS.ProcessEnv;
86
+ }
87
+ export interface PlanOptions {
88
+ update: UpdateAvailable | null;
89
+ method: InstallMethod;
90
+ state: UpdateState;
91
+ env: NodeJS.ProcessEnv;
92
+ config: AutoUpdateConfig;
93
+ now: number;
94
+ /** The version in the package's package.json now (may be newer than running). */
95
+ installedVersion: string | null;
96
+ /** liveLockSince: when the install lock was taken, if it is held. */
97
+ lockHeldSince?: number | null;
98
+ }
99
+ export interface UpdateFiles {
100
+ stateFile: string;
101
+ lockDir: string;
102
+ logFile: string;
103
+ }
104
+ export type SpawnLike = (command: string, args: string[], options: {
105
+ detached: boolean;
106
+ stdio: "ignore";
107
+ env: NodeJS.ProcessEnv;
108
+ }) => {
109
+ pid?: number;
110
+ unref(): void;
111
+ on(event: "error", cb: (err: Error) => void): unknown;
112
+ };
113
+ export interface StartInstallOptions {
114
+ decision: AutoUpdateDecision;
115
+ files: UpdateFiles;
116
+ spawnImpl: SpawnLike;
117
+ now?: () => number;
118
+ env?: NodeJS.ProcessEnv;
119
+ execPath?: string;
120
+ /** The npm to run; default the one beside this Node, else `npm` on PATH. */
121
+ npmPath?: string;
122
+ }
123
+ export type StartInstallResult = "started" | "locked" | "not-planned" | "spawn-failed"
124
+ /** Rechecked under the lock: backed off, tried enough, or already installed. */
125
+ | "skipped";
126
+ /** False when any opt-out is set: ccc's, Claude Code's, or the update check's. */
127
+ export declare function autoUpdateEnabled(env: NodeJS.ProcessEnv, config: AutoUpdateConfig): boolean;
128
+ /** A release version safe to hand to npm, or null. */
129
+ export declare function strictReleaseVersion(version: unknown): string | null;
130
+ /**
131
+ * How this copy of ccc was installed. Only "npm-global" self-updates; the
132
+ * runner re-checks the root against `npm root -g` before installing.
133
+ */
134
+ export declare function detectInstallMethod(opts: DetectInstallOptions): InstallMethod;
135
+ /** Decide what this launch does about an available update. */
136
+ export declare function planAutoUpdate(opts: PlanOptions): AutoUpdateDecision;
137
+ /**
138
+ * Take the lock, count the attempt, and start the detached runner. Never
139
+ * throws; a failure to start is recorded like a failed install.
140
+ */
141
+ export declare function startAutoUpdateInstall(opts: StartInstallOptions): StartInstallResult;
142
+ /**
143
+ * The SessionStart line about a background install, at most once per ccc
144
+ * process: "✔ ccc X installed · restart ccc to use it", or after a failure
145
+ * during this process the manual hint.
146
+ */
147
+ export declare class AutoUpdateNotices {
148
+ private readonly opts;
149
+ private shown;
150
+ constructor(opts: {
151
+ currentVersion: string;
152
+ packageDir: string;
153
+ stateFile: string;
154
+ startedAt: number;
155
+ installedText: (version: string) => string;
156
+ hintText: (update: UpdateAvailable) => string;
157
+ readInstalledVersion?: (packageDir: string) => string | null;
158
+ });
159
+ /** The banner already carried a line: nothing more this process. */
160
+ markShown(): void;
161
+ sessionStartLine(): string | undefined;
162
+ private pendingLine;
163
+ }
164
+ /** The version in `<packageDir>/package.json`, or null. */
165
+ export declare function readInstalledVersion(packageDir: string): string | null;
166
+ export declare function updateFiles(configDir: string): UpdateFiles;
167
+ export declare function readUpdateState(file: string): UpdateState;
168
+ /** Best effort and atomic: a failed write only loses bookkeeping. */
169
+ export declare function writeUpdateState(file: string, state: UpdateState): void;
170
+ //# sourceMappingURL=auto-update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-update.d.ts","sourceRoot":"","sources":["../src/auto-update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,401 @@
1
+ /**
2
+ * Automatic updates: when the startup check (update-check.ts) finds a newer
3
+ * release, install exactly that version in the background, the way Claude
4
+ * Code does ("✔ Update installed · Restart to update").
5
+ *
6
+ * Only when self-updating is safe: a plain global npm install whose package
7
+ * directory is physically inside `<prefix>/lib/node_modules` and writable by
8
+ * this user (no sudo, ever). npm-linked and git checkouts, npx and local
9
+ * installs, pnpm/yarn/bun/volta globals, root/sudo runs and Windows get the
10
+ * hint line only. The install runs in a detached runner (auto-update-runner.ts)
11
+ * that loads no file from the package, so it survives this ccc exiting and
12
+ * npm replacing the package under it.
13
+ *
14
+ * One install at a time across sessions (a lock file with a stale timeout).
15
+ * Every attempt is recorded in update-state.json: a failure backs off for a
16
+ * day, and no version is tried more than twice. The result reaches running
17
+ * sessions through the SessionStart hook (AutoUpdateNotices): "✔ ccc X
18
+ * installed · restart ccc to use it", or on failure today's hint.
19
+ *
20
+ * Running sessions keep the code they started with: the proxy loads all its
21
+ * modules at startup, and the hooks it registers are HTTP calls into it or
22
+ * files in its own temp plugin dir. See README "Automatic updates".
23
+ */
24
+ import { randomUUID } from "node:crypto";
25
+ import * as fs from "node:fs";
26
+ import * as path from "node:path";
27
+ import { fileURLToPath } from "node:url";
28
+ import { RUNNER_SOURCE } from "./auto-update-runner.js";
29
+ import { UPDATE_LOCK_STALE_MS, acquireUpdateLock, liveLockSince, releaseUpdateLock, setLockRunner, } from "./update-lock.js";
30
+ export { UPDATE_LOCK_STALE_MS, acquireUpdateLock, liveLockSince, releaseUpdateLock, } from "./update-lock.js";
31
+ import { PACKAGE_NAME, compareVersions, parseVersion, updateCheckEnabled, } from "./update-check.js";
32
+ export const DISABLE_AUTOUPDATE_ENV = "CCC_DISABLE_AUTOUPDATE";
33
+ /** Claude Code's own opt-out, honored too. */
34
+ export const CLAUDE_DISABLE_AUTOUPDATER_ENV = "DISABLE_AUTOUPDATER";
35
+ export const UPDATE_STATE_FILE = "update-state.json";
36
+ /** One entry per acquirer (update-lock.ts). */
37
+ export const UPDATE_LOCK_DIR = "update.lock.d";
38
+ export const UPDATE_LOG_FILE = "auto-update.log";
39
+ export const AUTO_UPDATE_BACKOFF_MS = 24 * 60 * 60 * 1000;
40
+ export const MAX_ATTEMPTS_PER_VERSION = 2;
41
+ export const INSTALL_TIMEOUT_MS = 10 * 60 * 1000;
42
+ /** Wait after launch so the install never competes with Claude Code starting. */
43
+ export const AUTO_UPDATE_DELAY_MS = 5_000;
44
+ const VERSIONS_KEPT = 8;
45
+ /** This package's own directory (dist/..), as Node resolved it. */
46
+ export const PACKAGE_DIR = fileURLToPath(new URL("..", import.meta.url));
47
+ // A plain release, nothing else: it becomes an npm argument, so no tag, range,
48
+ // prefix, prerelease, whitespace or shell metacharacter can pass.
49
+ const STRICT_VERSION_RE = /^(0|[1-9]\d{0,8})\.(0|[1-9]\d{0,8})\.(0|[1-9]\d{0,8})$/;
50
+ /** False when any opt-out is set: ccc's, Claude Code's, or the update check's. */
51
+ export function autoUpdateEnabled(env, config) {
52
+ if (!updateCheckEnabled(env, config))
53
+ return false;
54
+ if (envFlagSet(env[DISABLE_AUTOUPDATE_ENV]))
55
+ return false;
56
+ if (envFlagSet(env[CLAUDE_DISABLE_AUTOUPDATER_ENV]))
57
+ return false;
58
+ return config.autoUpdate !== false;
59
+ }
60
+ /** A release version safe to hand to npm, or null. */
61
+ export function strictReleaseVersion(version) {
62
+ return typeof version === "string" && STRICT_VERSION_RE.test(version) ? version : null;
63
+ }
64
+ /**
65
+ * How this copy of ccc was installed. Only "npm-global" self-updates; the
66
+ * runner re-checks the root against `npm root -g` before installing.
67
+ */
68
+ export function detectInstallMethod(opts) {
69
+ const env = opts.env ?? {};
70
+ const raw = opts.packageDir;
71
+ if ((opts.platform ?? process.platform) === "win32") {
72
+ return method("unsupported-platform", raw, "Windows: npm cannot safely replace a running ccc");
73
+ }
74
+ if (opts.uid === 0 || env.SUDO_UID !== undefined) {
75
+ return method("root", raw, "running as root or under sudo");
76
+ }
77
+ const real = realpathOrNull(raw);
78
+ if (real === null)
79
+ return method("unknown", raw, "package directory not found");
80
+ return classifyPackageDir(real, env);
81
+ }
82
+ /** Decide what this launch does about an available update. */
83
+ export function planAutoUpdate(opts) {
84
+ if (!opts.update)
85
+ return { action: "skip", reason: "no update available" };
86
+ if (!autoUpdateEnabled(opts.env, opts.config))
87
+ return { action: "skip", reason: "disabled" };
88
+ const version = strictReleaseVersion(opts.update.latest);
89
+ if (version === null)
90
+ return { action: "skip", reason: "version is not a plain release" };
91
+ if (opts.method.kind !== "npm-global") {
92
+ return { action: "skip", reason: `install method ${opts.method.kind}` };
93
+ }
94
+ if (opts.installedVersion === version && newerThan(version, opts.update.current)) {
95
+ return { action: "installed", version };
96
+ }
97
+ const blocked = attemptBlocked(opts.state, version, opts.now);
98
+ if (blocked)
99
+ return { action: "skip", reason: blocked };
100
+ const heldSince = opts.lockHeldSince ?? null;
101
+ if (heldSince !== null && opts.now - heldSince > UPDATE_LOCK_STALE_MS) {
102
+ // A live entry this old is a stuck installer or a reused pid: say so with the hint.
103
+ return { action: "skip", reason: "the install lock has been held for over an hour" };
104
+ }
105
+ return { action: "install", version, method: opts.method };
106
+ }
107
+ /**
108
+ * Take the lock, count the attempt, and start the detached runner. Never
109
+ * throws; a failure to start is recorded like a failed install.
110
+ */
111
+ export function startAutoUpdateInstall(opts) {
112
+ const decision = opts.decision;
113
+ if (decision.action !== "install" || decision.method.kind !== "npm-global")
114
+ return "not-planned";
115
+ const version = strictReleaseVersion(decision.version);
116
+ if (version === null)
117
+ return "not-planned";
118
+ const now = (opts.now ?? Date.now)();
119
+ const token = acquireUpdateLock(opts.files.lockDir, now);
120
+ if (token === null)
121
+ return "locked";
122
+ const packageDir = decision.method.packageDir;
123
+ // The plan was made before the launch delay; other sessions may have tried,
124
+ // failed or installed since. Only the lock holder's view is authoritative.
125
+ if (installBlockedNow(opts.files.stateFile, packageDir, version, now) !== null) {
126
+ releaseUpdateLock(opts.files.lockDir, token);
127
+ return "skipped";
128
+ }
129
+ recordAttemptStart(opts.files.stateFile, version, packageDir, now);
130
+ const config = runnerConfig(opts, decision.method, version, token);
131
+ try {
132
+ const child = opts.spawnImpl(opts.execPath ?? process.execPath, ["-e", RUNNER_SOURCE, JSON.stringify(config)], { detached: true, stdio: "ignore", env: runnerEnv(opts.env ?? process.env, opts.execPath) });
133
+ child.on("error", (err) => spawnFailed(opts.files, token, version, packageDir, err));
134
+ child.unref();
135
+ // The handoff the runner waits for: without it the runner never installs.
136
+ if (child.pid !== undefined)
137
+ setLockRunner(opts.files.lockDir, token, child.pid);
138
+ return "started";
139
+ }
140
+ catch (err) {
141
+ spawnFailed(opts.files, token, version, packageDir, err);
142
+ return "spawn-failed";
143
+ }
144
+ }
145
+ /**
146
+ * The SessionStart line about a background install, at most once per ccc
147
+ * process: "✔ ccc X installed · restart ccc to use it", or after a failure
148
+ * during this process the manual hint.
149
+ */
150
+ export class AutoUpdateNotices {
151
+ opts;
152
+ shown = false;
153
+ constructor(opts) {
154
+ this.opts = opts;
155
+ }
156
+ /** The banner already carried a line: nothing more this process. */
157
+ markShown() {
158
+ this.shown = true;
159
+ }
160
+ sessionStartLine() {
161
+ if (this.shown)
162
+ return undefined;
163
+ const line = this.pendingLine();
164
+ if (line !== undefined)
165
+ this.shown = true;
166
+ return line;
167
+ }
168
+ pendingLine() {
169
+ const last = readUpdateState(this.opts.stateFile).last;
170
+ if (!last || !samePackageDir(last.packageDir, this.opts.packageDir))
171
+ return undefined;
172
+ if (!newerThan(last.version, this.opts.currentVersion))
173
+ return undefined;
174
+ if (last.status === "ok") {
175
+ const read = this.opts.readInstalledVersion ?? readInstalledVersion;
176
+ const installed = read(this.opts.packageDir);
177
+ return installed === last.version ? this.opts.installedText(last.version) : undefined;
178
+ }
179
+ if (last.status === "failed" && last.at >= this.opts.startedAt) {
180
+ return this.opts.hintText({ latest: last.version, current: this.opts.currentVersion });
181
+ }
182
+ return undefined;
183
+ }
184
+ }
185
+ /** The version in `<packageDir>/package.json`, or null. */
186
+ export function readInstalledVersion(packageDir) {
187
+ try {
188
+ const pkg = JSON.parse(fs.readFileSync(path.join(packageDir, "package.json"), "utf8"));
189
+ return pkg?.name === PACKAGE_NAME ? strictReleaseVersion(pkg.version) : null;
190
+ }
191
+ catch {
192
+ return null;
193
+ }
194
+ }
195
+ export function updateFiles(configDir) {
196
+ return {
197
+ stateFile: path.join(configDir, UPDATE_STATE_FILE),
198
+ lockDir: path.join(configDir, UPDATE_LOCK_DIR),
199
+ logFile: path.join(configDir, UPDATE_LOG_FILE),
200
+ };
201
+ }
202
+ export function readUpdateState(file) {
203
+ try {
204
+ const data = JSON.parse(fs.readFileSync(file, "utf8"));
205
+ return { attempts: cleanAttempts(data?.attempts), last: cleanAttempt(data?.last) };
206
+ }
207
+ catch {
208
+ return { attempts: {} };
209
+ }
210
+ }
211
+ /** Best effort and atomic: a failed write only loses bookkeeping. */
212
+ export function writeUpdateState(file, state) {
213
+ const tmp = `${file}.${process.pid}.${randomUUID()}.tmp`;
214
+ try {
215
+ fs.mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 });
216
+ fs.writeFileSync(tmp, JSON.stringify(state), { mode: 0o600 });
217
+ fs.renameSync(tmp, file);
218
+ }
219
+ catch {
220
+ fs.rmSync(tmp, { force: true });
221
+ }
222
+ }
223
+ // ---------------------------------------------------------------------------
224
+ // Install-method detection
225
+ // ---------------------------------------------------------------------------
226
+ function classifyPackageDir(real, env) {
227
+ if (fs.existsSync(path.join(real, ".git"))) {
228
+ return method("git-checkout", real, "package directory is a git checkout");
229
+ }
230
+ const manager = otherPackageManager(real, env);
231
+ if (manager)
232
+ return method(manager, real, `installed by ${manager}`);
233
+ const parent = path.dirname(real);
234
+ if (path.basename(parent) !== "node_modules" || path.basename(real) !== PACKAGE_NAME) {
235
+ return method("npm-link", real, "package directory is outside node_modules (linked checkout)");
236
+ }
237
+ if (path.basename(path.dirname(parent)) !== "lib") {
238
+ return method("local", real, "not a global npm prefix (<prefix>/lib/node_modules)");
239
+ }
240
+ const prefix = path.dirname(path.dirname(parent));
241
+ const unwritable = firstUnwritable([parent, real, path.join(real, "dist"), path.join(prefix, "bin")]);
242
+ if (unwritable)
243
+ return method("not-writable", real, `${unwritable} is not writable without sudo`);
244
+ return { kind: "npm-global", packageDir: real, detail: `npm prefix ${prefix}`, npmRoot: parent, prefix };
245
+ }
246
+ function otherPackageManager(real, env) {
247
+ const p = real.split(path.sep).join("/");
248
+ if (p.includes("/_npx/"))
249
+ return "npx";
250
+ if (/\/\.?pnpm\//.test(p) || p.includes("/.pnpm-global/"))
251
+ return "pnpm";
252
+ if (/\/\.yarn\//.test(p) || /\/yarn\/global\//.test(p) || p.includes("/.config/yarn/"))
253
+ return "yarn";
254
+ if (p.includes("/.bun/"))
255
+ return "bun";
256
+ const volta = env.VOLTA_HOME && realpathOrNull(env.VOLTA_HOME);
257
+ if (p.includes("/.volta/") || (volta && isInside(real, volta)))
258
+ return "volta";
259
+ return null;
260
+ }
261
+ function firstUnwritable(dirs) {
262
+ for (const dir of dirs) {
263
+ try {
264
+ fs.accessSync(dir, fs.constants.W_OK);
265
+ }
266
+ catch {
267
+ return dir;
268
+ }
269
+ }
270
+ return null;
271
+ }
272
+ function method(kind, packageDir, detail) {
273
+ return { kind, packageDir, detail };
274
+ }
275
+ // ---------------------------------------------------------------------------
276
+ // Attempts, backoff and state
277
+ // ---------------------------------------------------------------------------
278
+ /** Why this version must not be tried now, or null. */
279
+ function attemptBlocked(state, version, now) {
280
+ if ((state.attempts[version] ?? 0) >= MAX_ATTEMPTS_PER_VERSION) {
281
+ return `already tried ${version} ${MAX_ATTEMPTS_PER_VERSION} times`;
282
+ }
283
+ const last = state.last;
284
+ if (!last)
285
+ return null;
286
+ // A run that never reported (killed, machine asleep) counts as a failure
287
+ // once its lock would be stale.
288
+ const failedAt = last.status === "failed" ? last.at
289
+ : last.status === "running" && now - last.at > UPDATE_LOCK_STALE_MS ? last.at
290
+ : null;
291
+ if (failedAt !== null && now - failedAt < AUTO_UPDATE_BACKOFF_MS) {
292
+ return "backing off for a day after a failed install";
293
+ }
294
+ return null;
295
+ }
296
+ /** attemptBlocked plus "the package is already at or past this version". */
297
+ function installBlockedNow(stateFile, packageDir, version, now) {
298
+ const installed = readInstalledVersion(packageDir);
299
+ if (installed !== null && !newerThan(version, installed))
300
+ return `${installed} is installed`;
301
+ return attemptBlocked(readUpdateState(stateFile), version, now);
302
+ }
303
+ function recordAttemptStart(file, version, packageDir, now) {
304
+ const state = readUpdateState(file);
305
+ state.attempts[version] = (state.attempts[version] ?? 0) + 1;
306
+ state.attempts = newestAttempts(state.attempts);
307
+ state.last = { version, status: "running", at: now, packageDir };
308
+ writeUpdateState(file, state);
309
+ }
310
+ function spawnFailed(files, token, version, packageDir, err) {
311
+ const state = readUpdateState(files.stateFile);
312
+ const error = `could not start the installer: ${String(err).slice(0, 200)}`;
313
+ state.last = { version, status: "failed", at: Date.now(), packageDir, error };
314
+ writeUpdateState(files.stateFile, state);
315
+ releaseUpdateLock(files.lockDir, token);
316
+ }
317
+ function newestAttempts(attempts) {
318
+ const versions = Object.keys(attempts).sort((a, b) => compareVersions(parseVersion(b), parseVersion(a)));
319
+ return Object.fromEntries(versions.slice(0, VERSIONS_KEPT).map((v) => [v, attempts[v]]));
320
+ }
321
+ function cleanAttempts(value) {
322
+ if (!value || typeof value !== "object")
323
+ return {};
324
+ const out = {};
325
+ for (const [version, count] of Object.entries(value)) {
326
+ if (strictReleaseVersion(version) && Number.isInteger(count) && count > 0) {
327
+ out[version] = count;
328
+ }
329
+ }
330
+ return out;
331
+ }
332
+ function cleanAttempt(value) {
333
+ if (!value || typeof value !== "object")
334
+ return undefined;
335
+ const version = strictReleaseVersion(value.version);
336
+ const status = ["running", "ok", "failed"].includes(value.status) ? value.status : null;
337
+ if (!version || !status || typeof value.at !== "number" || typeof value.packageDir !== "string") {
338
+ return undefined;
339
+ }
340
+ const error = typeof value.error === "string" ? value.error.slice(0, 300) : undefined;
341
+ return { version, status, at: value.at, packageDir: value.packageDir, ...(error ? { error } : {}) };
342
+ }
343
+ // ---------------------------------------------------------------------------
344
+ // Runner
345
+ // ---------------------------------------------------------------------------
346
+ function runnerConfig(opts, m, version, token) {
347
+ return {
348
+ npm: opts.npmPath ?? defaultNpmPath(opts.execPath ?? process.execPath),
349
+ packageName: PACKAGE_NAME,
350
+ version,
351
+ packageDir: m.packageDir,
352
+ npmRoot: m.npmRoot,
353
+ prefix: m.prefix,
354
+ stateFile: opts.files.stateFile,
355
+ lockDir: opts.files.lockDir,
356
+ logFile: opts.files.logFile,
357
+ token,
358
+ timeoutMs: INSTALL_TIMEOUT_MS,
359
+ };
360
+ }
361
+ /** The npm installed with this Node, so it targets the same prefix; else PATH's. */
362
+ function defaultNpmPath(execPath) {
363
+ const beside = path.join(path.dirname(execPath), "npm");
364
+ return fs.existsSync(beside) ? beside : "npm";
365
+ }
366
+ /** npm's `#!/usr/bin/env node` must find this same Node first. */
367
+ function runnerEnv(env, execPath = process.execPath) {
368
+ const bin = path.dirname(execPath);
369
+ return {
370
+ ...env,
371
+ PATH: env.PATH ? `${bin}${path.delimiter}${env.PATH}` : bin,
372
+ npm_config_update_notifier: "false",
373
+ };
374
+ }
375
+ // ---------------------------------------------------------------------------
376
+ // Small helpers
377
+ // ---------------------------------------------------------------------------
378
+ function newerThan(version, current) {
379
+ const a = parseVersion(version);
380
+ const b = parseVersion(current);
381
+ return a !== null && b !== null && compareVersions(a, b) > 0;
382
+ }
383
+ function envFlagSet(value) {
384
+ return value !== undefined && /^(1|true|yes|on)$/i.test(value.trim());
385
+ }
386
+ function realpathOrNull(p) {
387
+ try {
388
+ return fs.realpathSync(p);
389
+ }
390
+ catch {
391
+ return null;
392
+ }
393
+ }
394
+ function isInside(child, parent) {
395
+ const rel = path.relative(parent, child);
396
+ return rel !== "" && !rel.startsWith("..") && !path.isAbsolute(rel);
397
+ }
398
+ function samePackageDir(a, b) {
399
+ return (realpathOrNull(a) ?? a) === (realpathOrNull(b) ?? b);
400
+ }
401
+ //# sourceMappingURL=auto-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-update.js","sourceRoot":"","sources":["../src/auto-update.ts"],"names":[],"mappings":"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"}
@@ -61,7 +61,24 @@ export interface TranscriptShape {
61
61
  /** For a bad line: its 1-based index inside the block and its opening. */
62
62
  badLine?: number;
63
63
  sample?: string;
64
+ /** A recognised benign side request that has no transcript at all. */
65
+ knownKind?: KnownSideRequestKind;
64
66
  }
67
+ /**
68
+ * Side requests other than the monitor that share its header shape (no turn
69
+ * origin, no tools) and carry no `<transcript>` at all. Seen in the request
70
+ * log on haiku: the session-title request and WebFetch page summarisation.
71
+ */
72
+ export type KnownSideRequestKind = "session-title" | "webfetch-summary";
73
+ export declare function knownSideRequestKind(info: ClaudeCodeRequestInfo): KnownSideRequestKind | undefined;
74
+ /**
75
+ * The console warning for a suspected side request whose transcript did not
76
+ * match. Only a `<transcript>` block that exists but is malformed warns: that
77
+ * is a real format change. No transcript at all is an ordinary request (a
78
+ * title, a WebFetch summary, an older main request) and stays in the request
79
+ * log only, since console output lands in Claude Code's input box.
80
+ */
81
+ export declare function transcriptWarning(shape: TranscriptShape): string | undefined;
65
82
  export declare function inspectMonitorTranscript(body: Record<string, any>): TranscriptShape;
66
83
  /**
67
84
  * What the MemTree server stores about a request's client (usage_requests
@@ -1 +1 @@
1
- {"version":3,"file":"cc-request.d.ts","sourceRoot":"","sources":["../src/cc-request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAmBrD,8EAA8E;AAC9E,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC,MAAM,WAAW,qBAAqB;IACpC,mEAAmE;IACnE,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,QAAQ,EAAE,OAAO,CAAC;IAClB,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,oBAAoB,EAAE,OAAO,CAAC;IAC9B;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,qBAAqB,CAqC1F;AAED,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAE5E;AA6CD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAE5E;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,wDAAwD;IACxD,MAAM,CAAC,EAAE,eAAe,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAMD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,eAAe,CAgCnF;AAWD;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uFAAuF;IACvF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,IAAI,CAAC,EAAE,qBAAqB,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB,GAAG,iBAAiB,CAmBpB"}
1
+ {"version":3,"file":"cc-request.d.ts","sourceRoot":"","sources":["../src/cc-request.ts"],"names":[],"mappings":"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"}