@pentoshi/clai 4.14.4 → 4.14.5

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 (129) hide show
  1. package/CONTRIBUTING.md +4 -0
  2. package/PROVIDERS.md +2 -0
  3. package/README.md +22 -0
  4. package/dist/agent/subagents/read-only-tools.js +2 -2
  5. package/dist/agent/subagents/read-only-tools.js.map +1 -1
  6. package/dist/app/adapters/current-updates-adapter.d.ts +1 -1
  7. package/dist/app/adapters/current-updates-adapter.js +4 -13
  8. package/dist/app/adapters/current-updates-adapter.js.map +1 -1
  9. package/dist/app/controllers/session-controller.d.ts +5 -0
  10. package/dist/app/controllers/session-controller.js +54 -7
  11. package/dist/app/controllers/session-controller.js.map +1 -1
  12. package/dist/app/ports/updates-port.d.ts +1 -1
  13. package/dist/classic/app/action-handlers.js +7 -0
  14. package/dist/classic/app/action-handlers.js.map +1 -1
  15. package/dist/commands/update/detection.d.ts +20 -0
  16. package/dist/commands/update/detection.js +207 -0
  17. package/dist/commands/update/detection.js.map +1 -0
  18. package/dist/commands/update/download.d.ts +3 -0
  19. package/dist/commands/update/download.js +63 -0
  20. package/dist/commands/update/download.js.map +1 -0
  21. package/dist/commands/update/installers.d.ts +16 -5
  22. package/dist/commands/update/installers.js +12 -513
  23. package/dist/commands/update/installers.js.map +1 -1
  24. package/dist/commands/update/lock.d.ts +6 -0
  25. package/dist/commands/update/lock.js +86 -0
  26. package/dist/commands/update/lock.js.map +1 -0
  27. package/dist/commands/update/metadata.d.ts +6 -0
  28. package/dist/commands/update/metadata.js +36 -0
  29. package/dist/commands/update/metadata.js.map +1 -0
  30. package/dist/commands/update/native.d.ts +3 -0
  31. package/dist/commands/update/native.js +179 -0
  32. package/dist/commands/update/native.js.map +1 -0
  33. package/dist/commands/update/package-managers.d.ts +4 -0
  34. package/dist/commands/update/package-managers.js +158 -0
  35. package/dist/commands/update/package-managers.js.map +1 -0
  36. package/dist/commands/update/process.d.ts +17 -0
  37. package/dist/commands/update/process.js +114 -0
  38. package/dist/commands/update/process.js.map +1 -0
  39. package/dist/commands/update/source-worker.d.ts +2 -0
  40. package/dist/commands/update/source-worker.js +71 -0
  41. package/dist/commands/update/source-worker.js.map +1 -0
  42. package/dist/commands/update/source.d.ts +2 -0
  43. package/dist/commands/update/source.js +79 -0
  44. package/dist/commands/update/source.js.map +1 -0
  45. package/dist/commands/update/verification.d.ts +7 -0
  46. package/dist/commands/update/verification.js +73 -0
  47. package/dist/commands/update/verification.js.map +1 -0
  48. package/dist/commands/update/windows-stage.d.ts +21 -0
  49. package/dist/commands/update/windows-stage.js +186 -0
  50. package/dist/commands/update/windows-stage.js.map +1 -0
  51. package/dist/commands/update-install.d.ts +4 -13
  52. package/dist/commands/update-install.js +20 -152
  53. package/dist/commands/update-install.js.map +1 -1
  54. package/dist/commands/update.d.ts +4 -9
  55. package/dist/commands/update.js +51 -103
  56. package/dist/commands/update.js.map +1 -1
  57. package/dist/index.js +1 -1
  58. package/dist/index.js.map +1 -1
  59. package/dist/llm/responses-error.d.ts +3 -0
  60. package/dist/llm/responses-error.js +37 -0
  61. package/dist/llm/responses-error.js.map +1 -0
  62. package/dist/llm/responses-http.js +5 -2
  63. package/dist/llm/responses-http.js.map +1 -1
  64. package/dist/llm/responses-replay.d.ts +2 -0
  65. package/dist/llm/responses-replay.js +37 -1
  66. package/dist/llm/responses-replay.js.map +1 -1
  67. package/dist/llm/responses-stream-events.js +3 -20
  68. package/dist/llm/responses-stream-events.js.map +1 -1
  69. package/dist/llm/responses-stream.js +2 -0
  70. package/dist/llm/responses-stream.js.map +1 -1
  71. package/dist/os/bun-runtime.js +2 -1
  72. package/dist/os/bun-runtime.js.map +1 -1
  73. package/dist/os/update-origin.d.ts +7 -0
  74. package/dist/os/update-origin.js +30 -0
  75. package/dist/os/update-origin.js.map +1 -0
  76. package/dist/prompts/embedded.js +2 -2
  77. package/dist/prompts/embedded.js.map +1 -1
  78. package/dist/prompts/index.js +2 -2
  79. package/dist/prompts/system.agent.md +1 -1
  80. package/dist/prompts/system.ask.md +1 -1
  81. package/dist/session-runtime/client.js +2 -1
  82. package/dist/session-runtime/client.js.map +1 -1
  83. package/dist/store/history/jsonl-lock.js +10 -7
  84. package/dist/store/history/jsonl-lock.js.map +1 -1
  85. package/dist/store/history/recovery.js +2 -1
  86. package/dist/store/history/recovery.js.map +1 -1
  87. package/dist/store/history.js +4 -2
  88. package/dist/store/history.js.map +1 -1
  89. package/dist/tools/definitions/fs-read.js +1 -1
  90. package/dist/tools/definitions/fs-read.js.map +1 -1
  91. package/dist/tools/fs/read-input.d.ts +1 -1
  92. package/dist/tools/fs/read-input.js +2 -2
  93. package/dist/tools/fs/read-input.js.map +1 -1
  94. package/dist/tui-v2/app/App.js +13 -5
  95. package/dist/tui-v2/app/App.js.map +1 -1
  96. package/dist/tui-v2/components/plan/plan-interaction.d.ts +11 -0
  97. package/dist/tui-v2/components/plan/plan-interaction.js +56 -0
  98. package/dist/tui-v2/components/plan/plan-interaction.js.map +1 -0
  99. package/dist/tui-v2/components/plan/plan-view.d.ts +7 -1
  100. package/dist/tui-v2/components/plan/plan-view.js +78 -175
  101. package/dist/tui-v2/components/plan/plan-view.js.map +1 -1
  102. package/dist/tui-v2/components/plan/task-title.d.ts +9 -0
  103. package/dist/tui-v2/components/plan/task-title.js +17 -0
  104. package/dist/tui-v2/components/plan/task-title.js.map +1 -0
  105. package/dist/tui-v2/components/plan/use-task-disclosure.d.ts +25 -0
  106. package/dist/tui-v2/components/plan/use-task-disclosure.js +125 -0
  107. package/dist/tui-v2/components/plan/use-task-disclosure.js.map +1 -0
  108. package/dist/tui-v2/composer/composer-editor.js +3 -0
  109. package/dist/tui-v2/composer/composer-editor.js.map +1 -1
  110. package/dist/ui-core/actions/action-id.d.ts +1 -1
  111. package/dist/ui-core/actions/action-id.js +7 -0
  112. package/dist/ui-core/actions/action-id.js.map +1 -1
  113. package/dist/ui-core/actions/format-shortcuts.js +7 -0
  114. package/dist/ui-core/actions/format-shortcuts.js.map +1 -1
  115. package/dist/ui-core/commands/config-commands.js +12 -6
  116. package/dist/ui-core/commands/config-commands.js.map +1 -1
  117. package/dist/ui-core/commands/prompt-commands.d.ts +1 -1
  118. package/dist/ui-core/commands/prompt-commands.js +12 -2
  119. package/dist/ui-core/commands/prompt-commands.js.map +1 -1
  120. package/dist/ui-core/controllers/toast-controller.js +4 -4
  121. package/dist/ui-core/controllers/toast-controller.js.map +1 -1
  122. package/dist/ui-core/rendering/plan-view.js +24 -12
  123. package/dist/ui-core/rendering/plan-view.js.map +1 -1
  124. package/dist/ui-core/rendering/task-disclosure.d.ts +19 -0
  125. package/dist/ui-core/rendering/task-disclosure.js +70 -0
  126. package/dist/ui-core/rendering/task-disclosure.js.map +1 -0
  127. package/dist/version.generated.d.ts +2 -2
  128. package/dist/version.generated.js +2 -2
  129. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock.js","sourceRoot":"","sources":["../../../src/commands/update/lock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface ReleaseMetadata {
2
+ readonly tag_name: string;
3
+ readonly html_url: string;
4
+ readonly published_at: string;
5
+ }
6
+ export declare function fetchLatestRelease(signal?: AbortSignal): Promise<ReleaseMetadata | null>;
@@ -0,0 +1,36 @@
1
+ import { downloadBinary } from "./download.js";
2
+ import { mirrorBaseUrl, REPO } from "./installers.js";
3
+ import { throwIfCancelled } from "./process.js";
4
+ import { releaseVersion } from "./verification.js";
5
+ async function metadata(url, signal) {
6
+ const bytes = await downloadBinary(url, 5000, undefined, signal, 256 * 1024);
7
+ return JSON.parse(bytes.toString("utf8"));
8
+ }
9
+ async function releaseFrom(url, mirror, signal) {
10
+ try {
11
+ const value = await metadata(url, signal);
12
+ if (!value || typeof value !== "object")
13
+ return null;
14
+ const tag = mirror ? ("version" in value ? value.version : undefined) : ("tag_name" in value ? value.tag_name : undefined);
15
+ const version = releaseVersion(tag);
16
+ if (!version)
17
+ return null;
18
+ const date = "published_at" in value && typeof value.published_at === "string" ? Date.parse(value.published_at) : NaN;
19
+ return {
20
+ tag_name: `v${version}`,
21
+ html_url: `https://github.com/${REPO}/releases/tag/v${version}`,
22
+ published_at: Number.isFinite(date) ? new Date(date).toISOString() : "",
23
+ };
24
+ }
25
+ catch {
26
+ throwIfCancelled(signal);
27
+ return null;
28
+ }
29
+ }
30
+ export async function fetchLatestRelease(signal) {
31
+ const release = await releaseFrom(`https://api.github.com/repos/${REPO}/releases/latest`, false, signal);
32
+ if (release || process.env.CLAI_NO_MIRROR === "1")
33
+ return release;
34
+ return releaseFrom(`${mirrorBaseUrl()}/version.json`, true, signal);
35
+ }
36
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../../src/commands/update/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAQnD,KAAK,UAAU,QAAQ,CAAC,GAAW,EAAE,MAAoB;IACvD,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC;IAC7E,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,MAAe,EAAE,MAAoB;IAC3E,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACrD,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC3H,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,MAAM,IAAI,GAAG,cAAc,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACtH,OAAO;YACL,QAAQ,EAAE,IAAI,OAAO,EAAE;YACvB,QAAQ,EAAE,sBAAsB,IAAI,kBAAkB,OAAO,EAAE;YAC/D,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE;SACxE,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAoB;IAC3D,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,gCAAgC,IAAI,kBAAkB,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACzG,IAAI,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,GAAG;QAAE,OAAO,OAAO,CAAC;IAClE,OAAO,WAAW,CAAC,GAAG,aAAa,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACtE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type PerformUpdateOptions, type UpdateInstallResult } from "./installers.js";
2
+ export declare function writableDirectory(path: string, platform?: NodeJS.Platform): boolean;
3
+ export declare function installDirectBinary(options: PerformUpdateOptions): Promise<UpdateInstallResult>;
@@ -0,0 +1,179 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { accessSync, chmodSync, constants, copyFileSync, mkdtempSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { dirname, join } from "node:path";
5
+ import { evictSudoSession, formatSudoStdinPassword, looksLikeSudoAuthError, obtainSudoPassword } from "../../tools/sudo-session.js";
6
+ import { canonicalPath } from "./detection.js";
7
+ import { downloadBinary } from "./download.js";
8
+ import { currentPlatformTarget, ELEVATION_TIMEOUT_MS, mirrorBaseUrl, REPO } from "./installers.js";
9
+ import { runUpdateCommand, throwIfCancelled } from "./process.js";
10
+ import { verifyExecutable } from "./verification.js";
11
+ import { stageWindowsUpdate } from "./windows-stage.js";
12
+ function digest(bytes) {
13
+ return createHash("sha256").update(bytes).digest("hex");
14
+ }
15
+ export function writableDirectory(path, platform = process.platform) {
16
+ try {
17
+ if (platform === "win32") {
18
+ const probe = mkdtempSync(join(path, ".clai-write-probe-"));
19
+ rmSync(probe, { recursive: true });
20
+ }
21
+ else
22
+ accessSync(path, constants.W_OK | constants.X_OK);
23
+ return true;
24
+ }
25
+ catch {
26
+ return false;
27
+ }
28
+ }
29
+ async function binaryChecksum(urls, options) {
30
+ for (const url of urls) {
31
+ try {
32
+ const value = (await downloadBinary(url, 20_000, undefined, options.signal, 4096)).toString("utf8").trim().split(/\s+/)[0];
33
+ if (value && /^[a-f\d]{64}$/i.test(value))
34
+ return value.toLowerCase();
35
+ }
36
+ catch (error) {
37
+ if (options.signal?.aborted)
38
+ throw error;
39
+ }
40
+ }
41
+ throw new Error("could not obtain a valid release checksum; existing installation was kept");
42
+ }
43
+ async function verifiedDownload(urls, expected, options) {
44
+ let failure = new Error("update download failed");
45
+ for (const [index, url] of urls.entries()) {
46
+ try {
47
+ const bytes = await downloadBinary(url, 120_000, (progress) => options.onProgress?.({ phase: "downloading", ...progress }), options.signal);
48
+ options.onProgress?.({ phase: "verifying" });
49
+ if (digest(bytes) !== expected)
50
+ throw new Error("checksum mismatch for update download");
51
+ return bytes;
52
+ }
53
+ catch (error) {
54
+ throwIfCancelled(options.signal);
55
+ failure = error instanceof Error ? error : new Error(String(error));
56
+ if (index + 1 < urls.length)
57
+ options.log?.("Mirror unavailable or invalid; trying GitHub releases…");
58
+ }
59
+ }
60
+ throw failure;
61
+ }
62
+ async function authorizeReplacement(destination, options) {
63
+ if (options.elevation?.auth.status === "cancelled")
64
+ throw new Error("update cancelled before replacing the executable");
65
+ if (options.elevation?.auth.status === "failed")
66
+ throw new Error("sudo authentication failed");
67
+ if (options.elevation || writableDirectory(dirname(destination)) || !options.requestSecret)
68
+ return options.elevation;
69
+ const auth = await obtainSudoPassword({
70
+ requestSecret: options.requestSecret,
71
+ operation: { name: "clai.update", args: { version: options.version, destination, elevation: "sudo", action: "install verified update atomically" } },
72
+ title: "Administrator access",
73
+ prompt: `Updating clai needs admin permission to replace ${destination}. Enter your sudo password; it is sent only to sudo stdin. Esc cancels.`,
74
+ ...(options.signal ? { signal: options.signal } : {}),
75
+ }, {});
76
+ if (auth.status === "failed")
77
+ throw new Error(`sudo authentication failed — could not replace ${destination}`);
78
+ if (auth.status === "cancelled")
79
+ throw new Error("update cancelled before replacing the executable");
80
+ return { auth };
81
+ }
82
+ async function promote(source, destination, options, elevation) {
83
+ const pending = `${destination}.update-${randomUUID()}`;
84
+ try {
85
+ copyFileSync(source, pending, constants.COPYFILE_EXCL);
86
+ chmodSync(pending, 0o755);
87
+ renameSync(pending, destination);
88
+ return;
89
+ }
90
+ catch (error) {
91
+ const code = error instanceof Error && "code" in error ? error.code : undefined;
92
+ if (code !== "EACCES" && code !== "EPERM")
93
+ throw error;
94
+ }
95
+ finally {
96
+ rmSync(pending, { force: true });
97
+ }
98
+ if (elevation?.auth.status === "cancelled")
99
+ throw new Error("update cancelled before replacing the executable");
100
+ const password = elevation?.auth.status === "granted" ? elevation.auth.password : undefined;
101
+ const args = password === undefined ? ["-n"] : ["-S", "-p", ""];
102
+ const script = 'set -eu; stage=$(mktemp "$2.update.XXXXXX"); trap \'rm -f "$stage"\' EXIT; install -m 755 "$1" "$stage"; mv -f "$stage" "$2"';
103
+ try {
104
+ await runUpdateCommand({ file: "sudo", args: [...args, "--", "sh", "-c", script, "clai-update", source, destination] }, {
105
+ signal: options.signal,
106
+ timeoutMs: password === undefined ? ELEVATION_TIMEOUT_MS : 30_000,
107
+ ...(password === undefined ? {} : { input: formatSudoStdinPassword(password) }),
108
+ });
109
+ }
110
+ catch (error) {
111
+ if (password && error instanceof Error && looksLikeSudoAuthError(error.message))
112
+ evictSudoSession(password);
113
+ throwIfCancelled(options.signal);
114
+ throw new Error(`needs elevated permission to replace ${destination} — run \`sudo clai update\` using this installation, or retry the admin prompt`);
115
+ }
116
+ }
117
+ export async function installDirectBinary(options) {
118
+ throwIfCancelled(options.signal);
119
+ const target = options.target ?? currentPlatformTarget();
120
+ const destination = canonicalPath(options.execPath ?? options.method.executablePath ?? process.execPath);
121
+ const base = `https://github.com/${options.repo ?? REPO}/releases/download/v${options.version}`;
122
+ const mirror = `${mirrorBaseUrl()}/v${options.version}`;
123
+ const useMirror = process.env.CLAI_NO_MIRROR !== "1";
124
+ const binaryUrls = useMirror ? [`${mirror}/${target.file}`, `${base}/${target.file}`] : [`${base}/${target.file}`];
125
+ const sums = useMirror ? [`${base}/${target.file}.sha256`, `${mirror}/${target.file}.sha256`] : [`${base}/${target.file}.sha256`];
126
+ const elevation = process.platform === "win32" ? undefined : await authorizeReplacement(destination, options);
127
+ const previous = readFileSync(destination);
128
+ const previousDigest = digest(previous);
129
+ const expected = await binaryChecksum(sums, options);
130
+ options.log?.(`Downloading ${target.file} (v${options.version})…`);
131
+ const bytes = await verifiedDownload(binaryUrls, expected, options);
132
+ const stage = mkdtempSync(join(tmpdir(), "clai-update-"));
133
+ let preserve = false;
134
+ try {
135
+ const source = join(stage, target.file);
136
+ const backup = join(stage, "previous-clai");
137
+ writeFileSync(source, bytes, { mode: 0o755 });
138
+ writeFileSync(backup, previous, { mode: 0o755 });
139
+ await verifyExecutable(source, options.version, { signal: options.signal });
140
+ if (digest(readFileSync(destination)) !== previousDigest)
141
+ throw new Error("installation changed during update; retry without other update processes");
142
+ throwIfCancelled(options.signal);
143
+ options.onProgress?.({ phase: "installing", detail: destination });
144
+ if (process.platform === "win32") {
145
+ const statusFile = await stageWindowsUpdate({ kind: "binary", source, destination, digest: expected, previousDigest, version: options.version }, { signal: options.signal, ...(options.lockFile ? { lockFile: options.lockFile, lockToken: options.lockToken } : {}) }, !writableDirectory(dirname(destination)));
146
+ return { ok: true, method: "binary", outcome: "staged", needsRestart: true, statusFile, message: `verified update staged; close this installation to apply it. Result: ${statusFile}` };
147
+ }
148
+ throwIfCancelled(options.signal);
149
+ try {
150
+ await promote(source, destination, { ...options, signal: undefined }, elevation);
151
+ if (digest(readFileSync(destination)) !== expected)
152
+ throw new Error("installed binary checksum mismatch");
153
+ const installedVersion = await verifyExecutable(destination, options.version);
154
+ return { ok: true, method: "binary", outcome: "applied", installedVersion, needsRestart: true, message: `installed and verified v${installedVersion} → ${destination}` };
155
+ }
156
+ catch (error) {
157
+ let unchanged = false;
158
+ try {
159
+ unchanged = digest(readFileSync(destination)) === previousDigest;
160
+ }
161
+ catch { }
162
+ if (unchanged)
163
+ throw error;
164
+ try {
165
+ await promote(backup, destination, { ...options, signal: undefined }, elevation);
166
+ }
167
+ catch {
168
+ preserve = true;
169
+ throw new Error(`update verification and rollback failed for ${destination}; recovery executable retained at ${backup}`);
170
+ }
171
+ throw new Error(`update verification failed; previous executable restored: ${error instanceof Error ? error.message : String(error)}`);
172
+ }
173
+ }
174
+ finally {
175
+ if (!preserve)
176
+ rmSync(stage, { recursive: true, force: true });
177
+ }
178
+ }
179
+ //# sourceMappingURL=native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.js","sourceRoot":"","sources":["../../../src/commands/update/native.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type InstallMethod, type PerformUpdateOptions, type UpdateInstallResult } from "./installers.js";
2
+ import { type UpdateCommand } from "./process.js";
3
+ export declare function managerUpdateCommands(method: InstallMethod, version: string, platform?: NodeJS.Platform, groupSpec?: string): readonly UpdateCommand[];
4
+ export declare function installViaPackageManager(options: PerformUpdateOptions): Promise<UpdateInstallResult>;
@@ -0,0 +1,158 @@
1
+ import { accessSync, constants, existsSync, readFileSync } from "node:fs";
2
+ import { delimiter, dirname, isAbsolute, join, posix, win32 } from "node:path";
3
+ import { formatSudoStdinPassword, obtainSudoPassword } from "../../tools/sudo-session.js";
4
+ import { PACKAGE_NAME, REPO } from "./installers.js";
5
+ import { writableDirectory } from "./native.js";
6
+ import { runUpdateCommand, throwIfCancelled, windowsCommand } from "./process.js";
7
+ import { installedVersionCommand, releaseVersion, verifyCommand } from "./verification.js";
8
+ import { stageWindowsUpdate } from "./windows-stage.js";
9
+ export function managerUpdateCommands(method, version, platform = process.platform, groupSpec) {
10
+ const api = platform === "win32" ? win32 : posix;
11
+ const suffix = platform === "win32" ? ".cmd" : "";
12
+ const file = method.managerPath ?? `${method.type}${suffix}`;
13
+ const spec = `${PACKAGE_NAME}@${version}`;
14
+ if (method.type === "brew") {
15
+ return [{ file: method.managerPath ?? "brew", args: ["update"] }, { file: method.managerPath ?? "brew", args: ["upgrade", `${REPO}/clai`] }];
16
+ }
17
+ if (!method.prefix)
18
+ throw new Error(`cannot safely target the active ${method.type} installation without its installation directory`);
19
+ const cwd = method.prefix;
20
+ if (method.type === "scoop") {
21
+ const env = method.scope === "global" ? { SCOOP_GLOBAL: cwd } : { SCOOP: cwd };
22
+ const scoop = method.managerPath ?? api.join(cwd, "apps", "scoop", "current", "bin", "scoop.ps1");
23
+ return [{ file: scoop, args: ["update"], env }, { file: scoop, args: ["update", "clai", ...(method.scope === "global" ? ["--global"] : [])], env }];
24
+ }
25
+ if (!method.packageRoot || !method.runtimePath)
26
+ throw new Error("cannot safely update an unidentified JS package installation");
27
+ switch (method.type) {
28
+ case "npm":
29
+ return [{ file, args: ["install", ...(method.scope === "global" ? ["--global"] : ["--save-exact"]), "--prefix", cwd, spec, "--no-audit", "--no-fund"], cwd }];
30
+ case "bun": {
31
+ const standardGlobal = method.scope === "global" && /[\\/]install[\\/]global$/.test(cwd);
32
+ const env = standardGlobal ? { BUN_INSTALL_GLOBAL_DIR: cwd, BUN_INSTALL_BIN: api.join(api.dirname(api.dirname(cwd)), "bin") } : undefined;
33
+ return [{ file: method.managerPath ?? (platform === "win32" ? "bun.exe" : "bun"), args: ["add", ...(standardGlobal ? ["--global"] : []), "--exact", spec], cwd, ...(env ? { env } : {}) }];
34
+ }
35
+ case "pnpm": {
36
+ if (method.scope !== "global")
37
+ return [{ file, args: ["add", "--save-exact", spec], cwd }];
38
+ const normalized = cwd.replace(/\\/g, "/");
39
+ const isolated = normalized.indexOf("/global/v");
40
+ const home = isolated >= 0 ? cwd.slice(0, isolated) : api.dirname(api.dirname(cwd));
41
+ const bin = isolated >= 0 ? api.join(home, "bin") : home;
42
+ const path = `${bin}${platform === "win32" ? ";" : ":"}${process.env.PATH ?? ""}`;
43
+ return [{ file, args: ["add", "--global", "--global-dir", api.join(home, "global"), groupSpec ?? spec], ...(isolated >= 0 ? { cwd } : {}), env: { PNPM_HOME: home, PNPM_SHIM_BYPASS: "1", PATH: path } }];
44
+ }
45
+ case "yarn":
46
+ return [{ file, args: ["--cwd", cwd, "add", "--exact", spec], cwd }];
47
+ default: throw new Error(`no package manager command for install method: ${method.type}`);
48
+ }
49
+ }
50
+ function absoluteManager(file) {
51
+ if (isAbsolute(file))
52
+ return file;
53
+ for (const directory of (process.env.PATH ?? "").split(delimiter)) {
54
+ const candidate = join(directory, file);
55
+ try {
56
+ accessSync(candidate, constants.X_OK);
57
+ return candidate;
58
+ }
59
+ catch { }
60
+ }
61
+ throw new Error(`could not locate ${file}; install the original package manager before updating`);
62
+ }
63
+ async function runManager(command, options) {
64
+ const method = options.method;
65
+ if (method.scope !== "global" || !method.packageRoot || writableDirectory(dirname(method.packageRoot))) {
66
+ await runUpdateCommand(command, { signal: options.signal, log: options.log });
67
+ return;
68
+ }
69
+ const auth = options.elevation?.auth ?? (options.requestSecret ? await obtainSudoPassword({
70
+ requestSecret: options.requestSecret,
71
+ title: "Administrator access",
72
+ prompt: `Updating this ${method.type} installation at ${method.packageRoot} needs sudo permission. Enter your password; Esc cancels.`,
73
+ operation: { name: "clai.update", args: { version: options.version, destination: method.packageRoot, manager: method.type, elevation: "sudo" } },
74
+ ...(options.signal ? { signal: options.signal } : {}),
75
+ }, {}) : undefined);
76
+ if (auth?.status === "cancelled")
77
+ throw new Error("update cancelled before the package-manager operation");
78
+ if (auth?.status === "failed")
79
+ throw new Error("sudo authentication failed before the package-manager operation");
80
+ throwIfCancelled(options.signal);
81
+ const args = auth?.status === "granted" ? ["-S", "-p", ""] : ["-n"];
82
+ const env = { PATH: process.env.PATH ?? "", ...command.env };
83
+ const environment = Object.entries(env).filter((entry) => entry[1] !== undefined).map(([key, value]) => `${key}=${value}`);
84
+ try {
85
+ await runUpdateCommand({ file: "sudo", args: [...args, "--", "env", ...environment, absoluteManager(command.file), ...command.args], ...(command.cwd ? { cwd: command.cwd } : {}) }, {
86
+ signal: options.signal, log: options.log, ...(auth?.status === "granted" ? { input: formatSudoStdinPassword(auth.password) } : {}),
87
+ });
88
+ }
89
+ catch (error) {
90
+ throwIfCancelled(options.signal);
91
+ throw new Error(`could not update protected ${method.type} installation at ${method.packageRoot}; retry the administrator prompt or run this installation's update with sudo: ${error instanceof Error ? error.message : String(error)}`);
92
+ }
93
+ }
94
+ const JS_MANAGER_ENTRIES = { npm: [["npm", "bin", "npm-cli.js"]], pnpm: [["pnpm", "bin", "pnpm.mjs"], ["pnpm", "bin", "pnpm.cjs"]], yarn: [["yarn", "bin", "yarn.js"]] };
95
+ function nativeManagerCommand(command, method) {
96
+ if (process.platform !== "win32" || !/\.cmd$/i.test(command.file))
97
+ return command;
98
+ if (method.type !== "npm" && method.type !== "pnpm" && method.type !== "yarn")
99
+ return command;
100
+ const file = absoluteManager(command.file);
101
+ const base = join(dirname(file), "node_modules");
102
+ const entries = [...JS_MANAGER_ENTRIES[method.type].map((relative) => join(base, ...relative)), join(base, "corepack", "dist", `${method.type}.js`)];
103
+ const entry = entries.find(existsSync);
104
+ const node = join(dirname(file), "node.exe");
105
+ const runtime = existsSync(node) ? node : method.runtimePath;
106
+ if (entry && runtime)
107
+ return { ...command, file: runtime, args: [entry, ...command.args] };
108
+ if (command.args.some((arg) => /%[^%]+%/.test(arg)))
109
+ throw new Error("cannot safely pass this Windows installation path through an unidentified .cmd wrapper; reinstall the original package manager");
110
+ return command;
111
+ }
112
+ function isolatedGroupSpec(method, version) {
113
+ if (method.type !== "pnpm" || method.scope !== "global" || !method.prefix || !/[\\/]global[\\/]v\d+[\\/]/.test(method.prefix))
114
+ return undefined;
115
+ const manifest = JSON.parse(readFileSync(join(method.prefix, "package.json"), "utf8"));
116
+ if (!manifest || typeof manifest !== "object" || !("dependencies" in manifest) || !manifest.dependencies || typeof manifest.dependencies !== "object" || !(PACKAGE_NAME in manifest.dependencies))
117
+ throw new Error("cannot safely identify clai's isolated global pnpm group");
118
+ const entries = Object.entries(manifest.dependencies);
119
+ const specs = entries.map(([name, selector]) => {
120
+ if (!/^(?:@[a-z0-9._-]+\/)?[a-z0-9][a-z0-9._-]*$/i.test(name) || typeof selector !== "string")
121
+ throw new Error("invalid isolated pnpm group dependency");
122
+ if (name === PACKAGE_NAME)
123
+ return `${name}@${version}`;
124
+ const installed = JSON.parse(readFileSync(join(method.prefix, "node_modules", name, "package.json"), "utf8"));
125
+ if (!installed || typeof installed !== "object" || !("version" in installed))
126
+ throw new Error(`cannot preserve bundled pnpm dependency: ${name}`);
127
+ const pinned = releaseVersion(installed.version);
128
+ if (!pinned || /^(?:file:|link:|workspace:|git|https?:)/.test(selector))
129
+ throw new Error(`bundled pnpm dependency ${name} needs a manual update; existing group was kept`);
130
+ if (selector.startsWith("npm:")) {
131
+ if (!("name" in installed) || typeof installed.name !== "string" || !/^(?:@[a-z0-9._-]+\/)?[a-z0-9][a-z0-9._-]*$/i.test(installed.name))
132
+ throw new Error("invalid bundled pnpm alias");
133
+ return `${name}@npm:${installed.name}@${pinned}`;
134
+ }
135
+ return `${name}@${pinned}`;
136
+ });
137
+ return specs.sort().join(",");
138
+ }
139
+ export async function installViaPackageManager(options) {
140
+ throwIfCancelled(options.signal);
141
+ const groupSpec = isolatedGroupSpec(options.method, options.version);
142
+ const commands = managerUpdateCommands(options.method, options.version, process.platform, groupSpec).map((command) => nativeManagerCommand(command, options.method));
143
+ const verification = installedVersionCommand(options.method);
144
+ const allowNewer = options.method.type === "brew" || options.method.type === "scoop";
145
+ options.onProgress?.({ phase: "installing", detail: `${options.method.type} · ${options.method.prefix ?? options.method.detail}` });
146
+ if (process.platform === "win32") {
147
+ const elevated = options.method.scope === "global" && options.method.prefix !== undefined && !writableDirectory(options.method.packageRoot ? dirname(options.method.packageRoot) : options.method.prefix);
148
+ const statusFile = await stageWindowsUpdate({ kind: "commands", commands: commands.map(windowsCommand), verification: windowsCommand(verification), version: options.version, allowNewer }, { signal: options.signal, ...(options.lockFile ? { lockFile: options.lockFile, lockToken: options.lockToken } : {}) }, elevated);
149
+ return { ok: true, method: options.method.type, outcome: "staged", needsRestart: true, statusFile, message: `update staged for this ${options.method.type} installation; close clai to apply and verify it. Result: ${statusFile}` };
150
+ }
151
+ for (const command of commands) {
152
+ options.log?.(`Running ${command.file} ${command.args.join(" ")}`);
153
+ await runManager(command, options);
154
+ }
155
+ const installedVersion = await verifyCommand(verification, options.version, {}, allowNewer);
156
+ return { ok: true, method: options.method.type, outcome: "applied", installedVersion, needsRestart: true, message: `updated and verified v${installedVersion} via ${options.method.type}` };
157
+ }
158
+ //# sourceMappingURL=package-managers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-managers.js","sourceRoot":"","sources":["../../../src/commands/update/package-managers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export interface UpdateCommand {
2
+ readonly file: string;
3
+ readonly args: readonly string[];
4
+ readonly cwd?: string;
5
+ readonly env?: NodeJS.ProcessEnv;
6
+ }
7
+ export interface RunOptions {
8
+ readonly signal?: AbortSignal | undefined;
9
+ readonly timeoutMs?: number;
10
+ readonly log?: ((line: string) => void) | undefined;
11
+ readonly input?: string;
12
+ readonly platform?: NodeJS.Platform;
13
+ }
14
+ export declare function throwIfCancelled(signal?: AbortSignal): void;
15
+ export declare function psQuote(value: string): string;
16
+ export declare function windowsCommand(command: UpdateCommand): UpdateCommand;
17
+ export declare function runUpdateCommand(command: UpdateCommand, options?: RunOptions): Promise<string>;
@@ -0,0 +1,114 @@
1
+ import { spawn } from "node:child_process";
2
+ export function throwIfCancelled(signal) {
3
+ if (signal?.aborted)
4
+ throw new Error("update cancelled");
5
+ }
6
+ export function psQuote(value) {
7
+ if (/[\0\r\n]/.test(value))
8
+ throw new Error("invalid update command argument");
9
+ return `'${value.replace(/'/g, "''")}'`;
10
+ }
11
+ export function windowsCommand(command) {
12
+ if (!/\.(?:cmd|bat|ps1)$/i.test(command.file))
13
+ return command;
14
+ if (/\.(?:cmd|bat)$/i.test(command.file) && [command.file, ...command.args].some((value) => value.includes("%"))) {
15
+ throw new Error("cannot safely pass percent-containing paths or arguments through an unidentified Windows command wrapper; use the original manager's Node/Bun entrypoint");
16
+ }
17
+ const invocation = `& ${psQuote(command.file)} ${command.args.map(psQuote).join(" ")}; if (-not $?) { exit 1 }; exit $LASTEXITCODE`;
18
+ return { ...command, file: "powershell.exe", args: ["-NoProfile", "-NonInteractive", "-Command", invocation] };
19
+ }
20
+ function killTree(child, platform, force) {
21
+ if (!child.pid) {
22
+ child.kill(force ? "SIGKILL" : "SIGTERM");
23
+ return;
24
+ }
25
+ try {
26
+ if (platform === "win32") {
27
+ const killer = spawn("taskkill.exe", ["/PID", String(child.pid), "/T", "/F"], { stdio: "ignore", windowsHide: true });
28
+ killer.on("error", () => child.kill("SIGKILL"));
29
+ return;
30
+ }
31
+ process.kill(-child.pid, force ? "SIGKILL" : "SIGTERM");
32
+ }
33
+ catch {
34
+ child.kill(force ? "SIGKILL" : "SIGTERM");
35
+ }
36
+ }
37
+ export function runUpdateCommand(command, options = {}) {
38
+ throwIfCancelled(options.signal);
39
+ const platform = options.platform ?? process.platform;
40
+ const launch = platform === "win32" ? windowsCommand(command) : command;
41
+ return new Promise((resolve, reject) => {
42
+ const child = spawn(launch.file, [...launch.args], {
43
+ ...(launch.cwd ? { cwd: launch.cwd } : {}),
44
+ env: { ...process.env, ...launch.env, CI: "1" },
45
+ stdio: [options.input === undefined ? "ignore" : "pipe", "pipe", "pipe"],
46
+ detached: platform !== "win32", windowsHide: true,
47
+ });
48
+ let stdout = "";
49
+ let stderr = "";
50
+ let outLine = "";
51
+ let errLine = "";
52
+ let failure;
53
+ let settled = false;
54
+ let killTimer;
55
+ let stopTimer;
56
+ const finish = (error) => {
57
+ if (settled)
58
+ return;
59
+ settled = true;
60
+ clearTimeout(timer);
61
+ clearTimeout(killTimer);
62
+ clearTimeout(stopTimer);
63
+ options.signal?.removeEventListener("abort", abort);
64
+ if (error)
65
+ reject(error);
66
+ else
67
+ resolve(stdout.trim());
68
+ };
69
+ const stop = (error) => {
70
+ if (settled || failure)
71
+ return;
72
+ failure = error;
73
+ killTree(child, platform, false);
74
+ killTimer = setTimeout(() => killTree(child, platform, true), 1000);
75
+ stopTimer = setTimeout(() => finish(error), 3000);
76
+ };
77
+ const abort = () => stop(new Error("update cancelled"));
78
+ const timer = setTimeout(() => stop(new Error(`${command.file} timed out during update`)), options.timeoutMs ?? 600_000);
79
+ options.signal?.addEventListener("abort", abort, { once: true });
80
+ const feed = (chunk, error) => {
81
+ const text = chunk.toString();
82
+ if (error)
83
+ stderr = (stderr + text).slice(-16_384);
84
+ else
85
+ stdout = (stdout + text).slice(-16_384);
86
+ const lines = ((error ? errLine : outLine) + text).split(/\r?\n/);
87
+ const tail = (lines.pop() ?? "").slice(-2048);
88
+ if (error)
89
+ errLine = tail;
90
+ else
91
+ outLine = tail;
92
+ for (const line of lines)
93
+ if (line.trim())
94
+ options.log?.(line.slice(-2048).trimEnd());
95
+ };
96
+ child.stdout?.on("data", (data) => feed(data, false));
97
+ child.stderr?.on("data", (data) => feed(data, true));
98
+ child.on("error", (error) => finish(failure ?? new Error(`could not run ${command.file}: ${error.message}`)));
99
+ child.on("close", (code) => {
100
+ for (const line of [outLine, errLine])
101
+ if (line.trim())
102
+ options.log?.(line.trimEnd());
103
+ const detail = (stderr || stdout).trim().split("\n").slice(-4).join(" ");
104
+ finish(failure ?? (code === 0 ? undefined : new Error(`${command.file} exited with status ${code ?? "error"}${detail ? ` — ${detail}` : ""}`)));
105
+ });
106
+ if (options.signal?.aborted)
107
+ abort();
108
+ if (options.input !== undefined) {
109
+ child.stdin?.on("error", () => { });
110
+ child.stdin?.end(options.input);
111
+ }
112
+ });
113
+ }
114
+ //# sourceMappingURL=process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../../src/commands/update/process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const sourceApplyWorker: string;
2
+ export declare const sourceCleanupWorker: string;