poly-weaver 0.9.3 → 0.9.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auto-update/check-agent-updates.d.ts +28 -0
- package/dist/auto-update/check-agent-updates.d.ts.map +1 -0
- package/dist/auto-update/check-agent-updates.js +130 -0
- package/dist/auto-update/check-agent-updates.js.map +1 -0
- package/dist/auto-update/detect-agents.d.ts +77 -0
- package/dist/auto-update/detect-agents.d.ts.map +1 -0
- package/dist/auto-update/detect-agents.js +333 -0
- package/dist/auto-update/detect-agents.js.map +1 -0
- package/dist/auto-update/gate.d.ts +20 -0
- package/dist/auto-update/gate.d.ts.map +1 -0
- package/dist/auto-update/gate.js +85 -0
- package/dist/auto-update/gate.js.map +1 -0
- package/dist/auto-update/install-agents.d.ts +12 -0
- package/dist/auto-update/install-agents.d.ts.map +1 -0
- package/dist/auto-update/install-agents.js +75 -0
- package/dist/auto-update/install-agents.js.map +1 -0
- package/dist/auto-update/install-method.d.ts +2 -0
- package/dist/auto-update/install-method.d.ts.map +1 -0
- package/dist/auto-update/install-method.js +16 -0
- package/dist/auto-update/install-method.js.map +1 -0
- package/dist/auto-update/semver.d.ts +9 -0
- package/dist/auto-update/semver.d.ts.map +1 -0
- package/dist/auto-update/semver.js +72 -0
- package/dist/auto-update/semver.js.map +1 -0
- package/dist/auto-update/timeouts.d.ts +2 -0
- package/dist/auto-update/timeouts.d.ts.map +1 -0
- package/dist/auto-update/timeouts.js +2 -0
- package/dist/auto-update/timeouts.js.map +1 -0
- package/dist/auto-update/tui.d.ts +38 -0
- package/dist/auto-update/tui.d.ts.map +1 -0
- package/dist/auto-update/tui.js +140 -0
- package/dist/auto-update/tui.js.map +1 -0
- package/dist/auto-update/winget-retry.d.ts +22 -0
- package/dist/auto-update/winget-retry.d.ts.map +1 -0
- package/dist/auto-update/winget-retry.js +40 -0
- package/dist/auto-update/winget-retry.js.map +1 -0
- package/dist/cli.js +37 -25
- package/dist/cli.js.map +1 -1
- package/dist/preflight.d.ts +1 -40
- package/dist/preflight.d.ts.map +1 -1
- package/dist/preflight.js +1 -135
- package/dist/preflight.js.map +1 -1
- package/dist/preview-panel.d.ts +2 -0
- package/dist/preview-panel.d.ts.map +1 -1
- package/dist/preview-panel.js +28 -7
- package/dist/preview-panel.js.map +1 -1
- package/dist/providers/option-catalog.d.ts.map +1 -1
- package/dist/providers/option-catalog.js +42 -1
- package/dist/providers/option-catalog.js.map +1 -1
- package/dist/resume-tui.d.ts +3 -3
- package/dist/resume-tui.d.ts.map +1 -1
- package/dist/resume-tui.js +4 -14
- package/dist/resume-tui.js.map +1 -1
- package/dist/startup-tui.d.ts +5 -11
- package/dist/startup-tui.d.ts.map +1 -1
- package/dist/startup-tui.js +8 -28
- package/dist/startup-tui.js.map +1 -1
- package/dist/update-check.d.ts.map +1 -1
- package/dist/update-check.js +20 -6
- package/dist/update-check.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { setProviderVersions as setProviderVersionsDefault } from "../providers/registry.js";
|
|
2
|
+
import { isGlobalNpmInstall } from "./install-method.js";
|
|
3
|
+
import { showAutoUpdateTui } from "./tui.js";
|
|
4
|
+
import { AGENT_INSTALL_HINT, AGENT_ORDER, detectAgents, } from "./detect-agents.js";
|
|
5
|
+
import { checkAllUpdates } from "./check-agent-updates.js";
|
|
6
|
+
import { installAgents } from "./install-agents.js";
|
|
7
|
+
export async function runAutoUpdateGate(cwd = process.cwd(), deps = {}) {
|
|
8
|
+
const runDetection = deps.detectAgents ?? (() => detectAgents());
|
|
9
|
+
const exit = deps.exit ?? ((code) => { process.exit(code); });
|
|
10
|
+
const stderr = deps.stderr ?? process.stderr;
|
|
11
|
+
const showProgress = stderr.isTTY === true;
|
|
12
|
+
let progressShown = false;
|
|
13
|
+
const clearProgress = () => {
|
|
14
|
+
if (!progressShown)
|
|
15
|
+
return;
|
|
16
|
+
stderr.write("\r\x1b[2K");
|
|
17
|
+
progressShown = false;
|
|
18
|
+
};
|
|
19
|
+
if (showProgress) {
|
|
20
|
+
// The trailing glyph is U+2026, not three periods.
|
|
21
|
+
stderr.write("Detecting installed agents…");
|
|
22
|
+
progressShown = true;
|
|
23
|
+
}
|
|
24
|
+
let detected;
|
|
25
|
+
try {
|
|
26
|
+
detected = await runDetection();
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
clearProgress();
|
|
30
|
+
}
|
|
31
|
+
if (!detected.nodePty.ok) {
|
|
32
|
+
stderr.write(`${detected.nodePty.error}\n`);
|
|
33
|
+
exit(1);
|
|
34
|
+
return emptyGateResult();
|
|
35
|
+
}
|
|
36
|
+
if (detected.agents.length === 0) {
|
|
37
|
+
stderr.write(`${zeroAgentsMessage()}\n`);
|
|
38
|
+
exit(1);
|
|
39
|
+
return emptyGateResult();
|
|
40
|
+
}
|
|
41
|
+
const installedAgents = new Set(detected.agents.map((agent) => agent.name));
|
|
42
|
+
const versions = new Map(detected.agents.map((agent) => [agent.name, agent.version]));
|
|
43
|
+
const setProviderVersions = deps.setProviderVersions ?? setProviderVersionsDefault;
|
|
44
|
+
setProviderVersions(versions);
|
|
45
|
+
const detectInstall = deps.isGlobalNpmInstall ?? isGlobalNpmInstall;
|
|
46
|
+
const checkUpdates = deps.checkAllUpdates ?? checkAllUpdates;
|
|
47
|
+
const outdated = await checkUpdates(detected, detectInstall());
|
|
48
|
+
const updateInfo = polyWeaverUpdateInfo(outdated);
|
|
49
|
+
const result = { installedAgents, updateInfo };
|
|
50
|
+
if (outdated.length === 0) {
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
const showTui = deps.showAutoUpdateTui ?? showAutoUpdateTui;
|
|
54
|
+
const choice = await showTui(outdated, cwd);
|
|
55
|
+
if (choice === null) {
|
|
56
|
+
exit(0);
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
if (choice.kind === "continue") {
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
const targets = choice.kind === "update-all" ? outdated : [choice.target];
|
|
63
|
+
const runInstallers = deps.installAgents ?? installAgents;
|
|
64
|
+
const exitCodes = await runInstallers(targets);
|
|
65
|
+
exit(firstNonZero(exitCodes) ?? 0);
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
function emptyGateResult() {
|
|
69
|
+
return { installedAgents: new Set(), updateInfo: null };
|
|
70
|
+
}
|
|
71
|
+
function zeroAgentsMessage() {
|
|
72
|
+
return AGENT_ORDER.map((name) => AGENT_INSTALL_HINT[name]).join("\n\n");
|
|
73
|
+
}
|
|
74
|
+
function polyWeaverUpdateInfo(outdated) {
|
|
75
|
+
const target = outdated.find((item) => item.kind === "poly-weaver");
|
|
76
|
+
return target ? { current: target.current, latest: target.latest } : null;
|
|
77
|
+
}
|
|
78
|
+
function firstNonZero(exitCodes) {
|
|
79
|
+
for (const code of exitCodes.values()) {
|
|
80
|
+
if (code !== 0)
|
|
81
|
+
return code;
|
|
82
|
+
}
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/auto-update/gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import type { OutdatedTarget } from "./check-agent-updates.js";
|
|
3
|
+
export type SpawnFactory = typeof spawn;
|
|
4
|
+
export interface InstallAgentsDeps {
|
|
5
|
+
spawn?: SpawnFactory;
|
|
6
|
+
stdout?: Pick<NodeJS.WriteStream, "write">;
|
|
7
|
+
stderr?: Pick<NodeJS.WriteStream, "write">;
|
|
8
|
+
platform?: NodeJS.Platform;
|
|
9
|
+
}
|
|
10
|
+
export declare function installAgents(targets: readonly OutdatedTarget[], deps?: InstallAgentsDeps): Promise<Map<string, number>>;
|
|
11
|
+
export declare function targetInstallName(target: OutdatedTarget): string;
|
|
12
|
+
//# sourceMappingURL=install-agents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-agents.d.ts","sourceRoot":"","sources":["../../src/auto-update/install-agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAM9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,MAAM,YAAY,GAAG,OAAO,KAAK,CAAC;AAExC,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;CAC5B;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,SAAS,cAAc,EAAE,EAClC,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAK9B;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAEhE"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { createInterface } from "node:readline";
|
|
3
|
+
import { AGENT_PACKAGE_NPM, AGENT_PACKAGE_WINGET, } from "./detect-agents.js";
|
|
4
|
+
export async function installAgents(targets, deps = {}) {
|
|
5
|
+
const results = await Promise.all(targets.map(async (target) => [targetInstallName(target), await installTarget(target, deps)]));
|
|
6
|
+
return new Map(results);
|
|
7
|
+
}
|
|
8
|
+
export function targetInstallName(target) {
|
|
9
|
+
return target.kind === "poly-weaver" ? "poly-weaver" : target.name;
|
|
10
|
+
}
|
|
11
|
+
async function installTarget(target, deps) {
|
|
12
|
+
const spawnFactory = deps.spawn ?? spawn;
|
|
13
|
+
const command = commandForTarget(target);
|
|
14
|
+
const child = spawnFactory(formatShellCommand(command.file, command.args), {
|
|
15
|
+
stdio: "pipe",
|
|
16
|
+
shell: true,
|
|
17
|
+
});
|
|
18
|
+
const prefix = targetInstallName(target);
|
|
19
|
+
const stdoutDone = pipePrefixedLines(child.stdout, deps.stdout ?? process.stdout, prefix);
|
|
20
|
+
const stderrDone = pipePrefixedLines(child.stderr, deps.stderr ?? process.stderr, prefix);
|
|
21
|
+
const exitCode = await waitForChild(child);
|
|
22
|
+
await Promise.all([stdoutDone, stderrDone]);
|
|
23
|
+
return exitCode;
|
|
24
|
+
}
|
|
25
|
+
function commandForTarget(target) {
|
|
26
|
+
if (target.installMethod === "npm") {
|
|
27
|
+
const packageName = target.kind === "poly-weaver"
|
|
28
|
+
? "poly-weaver"
|
|
29
|
+
: AGENT_PACKAGE_NPM[target.name];
|
|
30
|
+
return {
|
|
31
|
+
file: "npm",
|
|
32
|
+
args: ["install", "-g", `${packageName}@latest`],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
file: "winget",
|
|
37
|
+
args: [
|
|
38
|
+
"upgrade",
|
|
39
|
+
"--id",
|
|
40
|
+
AGENT_PACKAGE_WINGET[target.name],
|
|
41
|
+
"--exact",
|
|
42
|
+
"--accept-source-agreements",
|
|
43
|
+
"--accept-package-agreements",
|
|
44
|
+
],
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function formatShellCommand(file, args) {
|
|
48
|
+
return [file, ...args].map(formatShellToken).join(" ");
|
|
49
|
+
}
|
|
50
|
+
function formatShellToken(value) {
|
|
51
|
+
if (!needsShellQuoting(value))
|
|
52
|
+
return value;
|
|
53
|
+
return `"${value.replace(/(["\\$`])/g, "\\$1")}"`;
|
|
54
|
+
}
|
|
55
|
+
function needsShellQuoting(value) {
|
|
56
|
+
return value.length === 0 || /[\s@/.:\\]/.test(value);
|
|
57
|
+
}
|
|
58
|
+
function pipePrefixedLines(stream, out, prefix) {
|
|
59
|
+
if (!stream)
|
|
60
|
+
return Promise.resolve();
|
|
61
|
+
const lines = createInterface({ input: stream });
|
|
62
|
+
lines.on("line", (line) => {
|
|
63
|
+
out.write(`[${prefix}] ${line}\n`);
|
|
64
|
+
});
|
|
65
|
+
return new Promise((resolve) => {
|
|
66
|
+
lines.once("close", () => resolve());
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
function waitForChild(child) {
|
|
70
|
+
return new Promise((resolve) => {
|
|
71
|
+
child.once("error", () => resolve(1));
|
|
72
|
+
child.once("exit", (code) => resolve(code ?? 1));
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=install-agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-agents.js","sourceRoot":"","sources":["../../src/auto-update/install-agents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-method.d.ts","sourceRoot":"","sources":["../../src/auto-update/install-method.ts"],"names":[],"mappings":"AAGA,wBAAgB,kBAAkB,CAChC,QAAQ,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAwC,GACnE,OAAO,CAWT"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
export function isGlobalNpmInstall(realpath = (path) => fs.realpathSync(path)) {
|
|
4
|
+
try {
|
|
5
|
+
const realPath = realpath(fileURLToPath(import.meta.url));
|
|
6
|
+
const normalized = realPath.replace(/\\/g, "/");
|
|
7
|
+
const comparable = process.platform === "win32"
|
|
8
|
+
? normalized.toLowerCase()
|
|
9
|
+
: normalized;
|
|
10
|
+
return comparable.includes("/node_modules/poly-weaver/");
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=install-method.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-method.js","sourceRoot":"","sources":["../../src/auto-update/install-method.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,kBAAkB,CAChC,WAAqC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC;IAEpE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC7C,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE;YAC1B,CAAC,CAAC,UAAU,CAAC;QACf,OAAO,UAAU,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface SemverParts {
|
|
2
|
+
major: number;
|
|
3
|
+
minor: number;
|
|
4
|
+
patch: number;
|
|
5
|
+
prerelease: Array<string | number>;
|
|
6
|
+
}
|
|
7
|
+
export declare function parseSemver(s: string): SemverParts | null;
|
|
8
|
+
export declare function compareSemver(a: string, b: string): -1 | 0 | 1 | null;
|
|
9
|
+
//# sourceMappingURL=semver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semver.d.ts","sourceRoot":"","sources":["../../src/auto-update/semver.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;CACpC;AAMD,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAgBzD;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAarE"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
const SEMVER_RE = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
|
|
2
|
+
const NUMERIC_IDENTIFIER_RE = /^(0|[1-9]\d*)$/;
|
|
3
|
+
export function parseSemver(s) {
|
|
4
|
+
const match = SEMVER_RE.exec(s);
|
|
5
|
+
if (!match)
|
|
6
|
+
return null;
|
|
7
|
+
const prerelease = match[4]
|
|
8
|
+
? match[4].split(".").map((part) => NUMERIC_IDENTIFIER_RE.test(part) ? Number(part) : part)
|
|
9
|
+
: [];
|
|
10
|
+
return {
|
|
11
|
+
major: Number(match[1]),
|
|
12
|
+
minor: Number(match[2]),
|
|
13
|
+
patch: Number(match[3]),
|
|
14
|
+
prerelease,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export function compareSemver(a, b) {
|
|
18
|
+
const parsedA = parseSemver(a);
|
|
19
|
+
const parsedB = parseSemver(b);
|
|
20
|
+
if (!parsedA || !parsedB)
|
|
21
|
+
return null;
|
|
22
|
+
const major = compareNumber(parsedA.major, parsedB.major);
|
|
23
|
+
if (major !== 0)
|
|
24
|
+
return major;
|
|
25
|
+
const minor = compareNumber(parsedA.minor, parsedB.minor);
|
|
26
|
+
if (minor !== 0)
|
|
27
|
+
return minor;
|
|
28
|
+
const patch = compareNumber(parsedA.patch, parsedB.patch);
|
|
29
|
+
if (patch !== 0)
|
|
30
|
+
return patch;
|
|
31
|
+
return comparePrerelease(parsedA.prerelease, parsedB.prerelease);
|
|
32
|
+
}
|
|
33
|
+
function compareNumber(a, b) {
|
|
34
|
+
if (a < b)
|
|
35
|
+
return -1;
|
|
36
|
+
if (a > b)
|
|
37
|
+
return 1;
|
|
38
|
+
return 0;
|
|
39
|
+
}
|
|
40
|
+
function comparePrerelease(a, b) {
|
|
41
|
+
if (a.length === 0 && b.length === 0)
|
|
42
|
+
return 0;
|
|
43
|
+
if (a.length === 0)
|
|
44
|
+
return 1;
|
|
45
|
+
if (b.length === 0)
|
|
46
|
+
return -1;
|
|
47
|
+
const len = Math.max(a.length, b.length);
|
|
48
|
+
for (let i = 0; i < len; i++) {
|
|
49
|
+
const left = a[i];
|
|
50
|
+
const right = b[i];
|
|
51
|
+
if (left === undefined)
|
|
52
|
+
return -1;
|
|
53
|
+
if (right === undefined)
|
|
54
|
+
return 1;
|
|
55
|
+
if (typeof left === "number" && typeof right === "number") {
|
|
56
|
+
const numeric = compareNumber(left, right);
|
|
57
|
+
if (numeric !== 0)
|
|
58
|
+
return numeric;
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
if (typeof left === "number")
|
|
62
|
+
return -1;
|
|
63
|
+
if (typeof right === "number")
|
|
64
|
+
return 1;
|
|
65
|
+
if (left < right)
|
|
66
|
+
return -1;
|
|
67
|
+
if (left > right)
|
|
68
|
+
return 1;
|
|
69
|
+
}
|
|
70
|
+
return 0;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=semver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semver.js","sourceRoot":"","sources":["../../src/auto-update/semver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeouts.d.ts","sourceRoot":"","sources":["../../src/auto-update/timeouts.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,OAAQ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeouts.js","sourceRoot":"","sources":["../../src/auto-update/timeouts.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type GitInfo } from "../git-info.js";
|
|
2
|
+
import { type KeyEvent } from "../text-editing/emacs-input.js";
|
|
3
|
+
import type { OutdatedTarget } from "./check-agent-updates.js";
|
|
4
|
+
export type AutoUpdateChoice = {
|
|
5
|
+
kind: "update-all";
|
|
6
|
+
} | {
|
|
7
|
+
kind: "update-one";
|
|
8
|
+
target: OutdatedTarget;
|
|
9
|
+
} | {
|
|
10
|
+
kind: "continue";
|
|
11
|
+
};
|
|
12
|
+
export interface AutoUpdateTuiState {
|
|
13
|
+
outdated: OutdatedTarget[];
|
|
14
|
+
showUpdateAll: boolean;
|
|
15
|
+
selectedIndex: number;
|
|
16
|
+
termRows: number;
|
|
17
|
+
termCols: number;
|
|
18
|
+
gitInfo: GitInfo | null;
|
|
19
|
+
lastDrawnOutput?: string;
|
|
20
|
+
}
|
|
21
|
+
export type AutoUpdateRow = {
|
|
22
|
+
kind: "update-all";
|
|
23
|
+
label: string;
|
|
24
|
+
} | {
|
|
25
|
+
kind: "target";
|
|
26
|
+
label: string;
|
|
27
|
+
target: OutdatedTarget;
|
|
28
|
+
} | {
|
|
29
|
+
kind: "continue";
|
|
30
|
+
label: string;
|
|
31
|
+
};
|
|
32
|
+
export declare function buildInitialState(outdated: OutdatedTarget[], rows: number, cols: number, gitInfo: GitInfo | null): AutoUpdateTuiState;
|
|
33
|
+
export declare function buildRows(state: AutoUpdateTuiState): AutoUpdateRow[];
|
|
34
|
+
export declare function handleEvent(state: AutoUpdateTuiState, event: KeyEvent): AutoUpdateChoice | "cancel" | "handled";
|
|
35
|
+
export declare function render(state: AutoUpdateTuiState, out: NodeJS.WriteStream): void;
|
|
36
|
+
export declare function showAutoUpdateTui(outdated: OutdatedTarget[], cwd?: string): Promise<AutoUpdateChoice | null>;
|
|
37
|
+
export declare function updateTargetLabel(target: OutdatedTarget): string;
|
|
38
|
+
//# sourceMappingURL=tui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/auto-update/tui.ts"],"names":[],"mappings":"AAaA,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AACjF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAEzB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,cAAc,EAAE,EAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,GAAG,IAAI,GACtB,kBAAkB,CASpB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,kBAAkB,GAAG,aAAa,EAAE,CAQpE;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,kBAAkB,EACzB,KAAK,EAAE,QAAQ,GACd,gBAAgB,GAAG,QAAQ,GAAG,SAAS,CAgBzC;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,CAAC,WAAW,GAAG,IAAI,CAsB/E;AAED,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,cAAc,EAAE,EAC1B,GAAG,SAAgB,GAClB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAalC;AAyED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAGhE"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { ALT_SCREEN_OFF, ALT_SCREEN_ON, CSI, HIDE_CURSOR, bold, cyan, dim, invert, padToWidth, reset, } from "../ansi.js";
|
|
2
|
+
import { renderAppHeader } from "../app-header.js";
|
|
3
|
+
import { getGitInfo } from "../git-info.js";
|
|
4
|
+
import { createKeyEventSource } from "../terminal/key-event-source.js";
|
|
5
|
+
import { EmacsInputParser } from "../text-editing/emacs-input.js";
|
|
6
|
+
export function buildInitialState(outdated, rows, cols, gitInfo) {
|
|
7
|
+
return {
|
|
8
|
+
outdated,
|
|
9
|
+
showUpdateAll: outdated.length >= 2,
|
|
10
|
+
selectedIndex: 0,
|
|
11
|
+
termRows: rows,
|
|
12
|
+
termCols: cols,
|
|
13
|
+
gitInfo,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export function buildRows(state) {
|
|
17
|
+
const rows = [];
|
|
18
|
+
if (state.showUpdateAll)
|
|
19
|
+
rows.push({ kind: "update-all", label: "Update all" });
|
|
20
|
+
for (const target of state.outdated) {
|
|
21
|
+
rows.push({ kind: "target", label: updateTargetLabel(target), target });
|
|
22
|
+
}
|
|
23
|
+
rows.push({ kind: "continue", label: "Continue without updating" });
|
|
24
|
+
return rows;
|
|
25
|
+
}
|
|
26
|
+
export function handleEvent(state, event) {
|
|
27
|
+
if (event.type === "ctrl-c" || event.type === "escape")
|
|
28
|
+
return "cancel";
|
|
29
|
+
const rows = buildRows(state);
|
|
30
|
+
if (event.type === "arrow" && (event.direction === "up" || event.direction === "down")) {
|
|
31
|
+
const direction = event.direction === "up" ? -1 : 1;
|
|
32
|
+
state.selectedIndex =
|
|
33
|
+
(state.selectedIndex + direction + rows.length) % rows.length;
|
|
34
|
+
return "handled";
|
|
35
|
+
}
|
|
36
|
+
if (event.type === "enter") {
|
|
37
|
+
return choiceForRow(rows[state.selectedIndex]);
|
|
38
|
+
}
|
|
39
|
+
return "handled";
|
|
40
|
+
}
|
|
41
|
+
export function render(state, out) {
|
|
42
|
+
const cols = state.termCols;
|
|
43
|
+
const pad = (line) => padToWidth(line, cols);
|
|
44
|
+
const lines = [];
|
|
45
|
+
lines.push(...renderAppHeader(cols, state.gitInfo, null));
|
|
46
|
+
lines.push(pad(""));
|
|
47
|
+
lines.push(pad(` ${bold}Updates are available.${reset}`));
|
|
48
|
+
lines.push(pad(""));
|
|
49
|
+
const rows = buildRows(state);
|
|
50
|
+
for (let i = 0; i < rows.length; i++) {
|
|
51
|
+
lines.push(renderOption(rows[i].label, state.selectedIndex === i, cols));
|
|
52
|
+
}
|
|
53
|
+
lines.push(pad(""));
|
|
54
|
+
lines.push(pad(` ${dim}Latest versions will be installed with the manager shown on each row.${reset}`));
|
|
55
|
+
const output = HIDE_CURSOR + `${CSI}H` + lines.join("\n") + `${CSI}J`;
|
|
56
|
+
if (output !== state.lastDrawnOutput) {
|
|
57
|
+
state.lastDrawnOutput = output;
|
|
58
|
+
out.write(output);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export async function showAutoUpdateTui(outdated, cwd = process.cwd()) {
|
|
62
|
+
const rows = process.stdout.rows ?? 24;
|
|
63
|
+
const cols = process.stdout.columns ?? 80;
|
|
64
|
+
const gitInfo = await getGitInfo(cwd);
|
|
65
|
+
const state = buildInitialState(outdated, rows, cols, gitInfo);
|
|
66
|
+
process.stdout.write(ALT_SCREEN_ON);
|
|
67
|
+
try {
|
|
68
|
+
render(state, process.stdout);
|
|
69
|
+
return await inputLoop(state);
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
process.stdout.write(ALT_SCREEN_OFF);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async function inputLoop(state, opts = {}) {
|
|
76
|
+
const stdout = opts.stdout ?? process.stdout;
|
|
77
|
+
const parser = new EmacsInputParser();
|
|
78
|
+
const source = opts.source ?? createKeyEventSource();
|
|
79
|
+
let lastResizeSize;
|
|
80
|
+
source.start();
|
|
81
|
+
return new Promise((resolve) => {
|
|
82
|
+
const unsubscribe = source.onEvents((keys) => {
|
|
83
|
+
for (const event of parser.mapKeys(keys)) {
|
|
84
|
+
const result = handleEvent(state, event);
|
|
85
|
+
if (result === "cancel") {
|
|
86
|
+
cleanup();
|
|
87
|
+
resolve(null);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (result !== "handled") {
|
|
91
|
+
cleanup();
|
|
92
|
+
resolve(result);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
render(state, stdout);
|
|
97
|
+
});
|
|
98
|
+
const handleResize = (size) => {
|
|
99
|
+
const next = size ?? {
|
|
100
|
+
columns: stdout.columns ?? 80,
|
|
101
|
+
rows: stdout.rows ?? 24,
|
|
102
|
+
};
|
|
103
|
+
if (lastResizeSize !== undefined
|
|
104
|
+
&& next.columns === lastResizeSize.columns
|
|
105
|
+
&& next.rows === lastResizeSize.rows) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
lastResizeSize = next;
|
|
109
|
+
state.termRows = next.rows;
|
|
110
|
+
state.termCols = next.columns;
|
|
111
|
+
state.lastDrawnOutput = undefined;
|
|
112
|
+
render(state, stdout);
|
|
113
|
+
};
|
|
114
|
+
const onResize = () => handleResize();
|
|
115
|
+
stdout.on("resize", onResize);
|
|
116
|
+
const sourceResizeUnsubscribe = source.onResize((size) => handleResize(size));
|
|
117
|
+
function cleanup() {
|
|
118
|
+
sourceResizeUnsubscribe();
|
|
119
|
+
unsubscribe();
|
|
120
|
+
source.stop();
|
|
121
|
+
stdout.removeListener("resize", onResize);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
function choiceForRow(row) {
|
|
126
|
+
if (row.kind === "update-all")
|
|
127
|
+
return { kind: "update-all" };
|
|
128
|
+
if (row.kind === "continue")
|
|
129
|
+
return { kind: "continue" };
|
|
130
|
+
return { kind: "update-one", target: row.target };
|
|
131
|
+
}
|
|
132
|
+
export function updateTargetLabel(target) {
|
|
133
|
+
const name = target.kind === "poly-weaver" ? "poly-weaver" : target.productName;
|
|
134
|
+
return `Update ${name} (${target.current} -> ${target.latest}, via ${target.installMethod})`;
|
|
135
|
+
}
|
|
136
|
+
function renderOption(label, selected, cols) {
|
|
137
|
+
const line = ` ${selected ? `${cyan}${invert}${label}${reset}` : label}`;
|
|
138
|
+
return padToWidth(line, cols);
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=tui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/auto-update/tui.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ExecAsync } from "./detect-agents.js";
|
|
2
|
+
export interface WingetRetryDeps {
|
|
3
|
+
execAsync: ExecAsync;
|
|
4
|
+
sleep?: (ms: number) => Promise<void>;
|
|
5
|
+
random?: () => number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Run a `winget` exec with bounded retries. `shouldRetry` decides whether to
|
|
9
|
+
* retry after a rejection — typically used to skip retry when (a) we killed
|
|
10
|
+
* the child for timeout (retry would just waste another timeout window) or
|
|
11
|
+
* (b) the caller can already parse a usable value from `err.stdout`.
|
|
12
|
+
*
|
|
13
|
+
* Re-throws the last error on exhaustion so existing `catch (err)` blocks see
|
|
14
|
+
* the original `child_process` exception shape (with `err.stdout`).
|
|
15
|
+
*/
|
|
16
|
+
export declare function wingetExecWithRetry(command: string, execOptions: Parameters<ExecAsync>[1], shouldRetry: (err: unknown) => boolean, deps: WingetRetryDeps, maxAttempts?: number): Promise<{
|
|
17
|
+
stdout: string;
|
|
18
|
+
stderr: string;
|
|
19
|
+
}>;
|
|
20
|
+
/** True when the process was killed by us (e.g. exec timeout) — retry is wasted. */
|
|
21
|
+
export declare function isKilledByParent(err: unknown): boolean;
|
|
22
|
+
//# sourceMappingURL=winget-retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"winget-retry.d.ts","sourceRoot":"","sources":["../../src/auto-update/winget-retry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;CACvB;AAMD;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EACrC,WAAW,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,EACtC,IAAI,EAAE,eAAe,EACrB,WAAW,GAAE,MAA6B,GACzC,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAgB7C;AAED,oFAAoF;AACpF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAItD"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
const DEFAULT_MAX_ATTEMPTS = 2;
|
|
2
|
+
const BACKOFF_BASE_MS = 50;
|
|
3
|
+
const BACKOFF_JITTER_MS = 100;
|
|
4
|
+
/**
|
|
5
|
+
* Run a `winget` exec with bounded retries. `shouldRetry` decides whether to
|
|
6
|
+
* retry after a rejection — typically used to skip retry when (a) we killed
|
|
7
|
+
* the child for timeout (retry would just waste another timeout window) or
|
|
8
|
+
* (b) the caller can already parse a usable value from `err.stdout`.
|
|
9
|
+
*
|
|
10
|
+
* Re-throws the last error on exhaustion so existing `catch (err)` blocks see
|
|
11
|
+
* the original `child_process` exception shape (with `err.stdout`).
|
|
12
|
+
*/
|
|
13
|
+
export async function wingetExecWithRetry(command, execOptions, shouldRetry, deps, maxAttempts = DEFAULT_MAX_ATTEMPTS) {
|
|
14
|
+
const sleep = deps.sleep ?? defaultSleep;
|
|
15
|
+
const random = deps.random ?? Math.random;
|
|
16
|
+
let lastErr;
|
|
17
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
18
|
+
try {
|
|
19
|
+
return await deps.execAsync(command, execOptions);
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
lastErr = err;
|
|
23
|
+
const isLastAttempt = attempt === maxAttempts - 1;
|
|
24
|
+
if (isLastAttempt || !shouldRetry(err))
|
|
25
|
+
break;
|
|
26
|
+
await sleep(BACKOFF_BASE_MS + Math.floor(random() * BACKOFF_JITTER_MS));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
throw lastErr;
|
|
30
|
+
}
|
|
31
|
+
/** True when the process was killed by us (e.g. exec timeout) — retry is wasted. */
|
|
32
|
+
export function isKilledByParent(err) {
|
|
33
|
+
return Boolean(err && typeof err === "object" && err.killed === true);
|
|
34
|
+
}
|
|
35
|
+
function defaultSleep(ms) {
|
|
36
|
+
return new Promise((resolve) => {
|
|
37
|
+
setTimeout(resolve, ms);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=winget-retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"winget-retry.js","sourceRoot":"","sources":["../../src/auto-update/winget-retry.ts"],"names":[],"mappings":"AAQA,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAC/B,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAE9B;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAe,EACf,WAAqC,EACrC,WAAsC,EACtC,IAAqB,EACrB,cAAsB,oBAAoB;IAE1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;IAE1C,IAAI,OAAgB,CAAC;IACrB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,GAAG,GAAG,CAAC;YACd,MAAM,aAAa,GAAG,OAAO,KAAK,WAAW,GAAG,CAAC,CAAC;YAClD,IAAI,aAAa,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;gBAAE,MAAM;YAC9C,MAAM,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,iBAAiB,CAAC,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IACD,MAAM,OAAO,CAAC;AAChB,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,OAAO,OAAO,CACZ,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAK,GAA4B,CAAC,MAAM,KAAK,IAAI,CAChF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC"}
|