frely-cli 0.6.1 → 0.6.6
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/README.md +188 -38
- package/dist/agent-help.d.ts +287 -0
- package/dist/agent-help.js +64 -0
- package/dist/agent-help.js.map +1 -0
- package/dist/auth.d.ts +3 -1
- package/dist/auth.js +3 -2
- package/dist/auth.js.map +1 -1
- package/dist/cloud.d.ts +7 -0
- package/dist/cloud.js +263 -0
- package/dist/cloud.js.map +1 -0
- package/dist/device/connection-status.d.ts +42 -0
- package/dist/device/connection-status.js +112 -0
- package/dist/device/connection-status.js.map +1 -0
- package/dist/device/relay-client.d.ts +7 -0
- package/dist/device/relay-client.js +124 -56
- package/dist/device/relay-client.js.map +1 -1
- package/dist/diagnostics.d.ts +66 -4
- package/dist/diagnostics.js +133 -25
- package/dist/diagnostics.js.map +1 -1
- package/dist/index.js +157 -38
- package/dist/index.js.map +1 -1
- package/dist/key-budget.d.ts +22 -0
- package/dist/key-budget.js +97 -0
- package/dist/key-budget.js.map +1 -0
- package/dist/mcp-authorization.js +3 -3
- package/dist/mcp-authorization.js.map +1 -1
- package/dist/mcp-command.d.ts +9 -0
- package/dist/mcp-command.js +68 -0
- package/dist/mcp-command.js.map +1 -0
- package/dist/runtime/diagnostics.d.ts +17 -0
- package/dist/runtime/diagnostics.js +84 -0
- package/dist/runtime/diagnostics.js.map +1 -0
- package/dist/runtime/mcp.d.ts +3 -0
- package/dist/runtime/mcp.js +40 -23
- package/dist/runtime/mcp.js.map +1 -1
- package/dist/runtime/relay-mcp.d.ts +9 -3
- package/dist/runtime/relay-mcp.js +66 -19
- package/dist/runtime/relay-mcp.js.map +1 -1
- package/dist/service.d.ts +4 -0
- package/dist/service.js +28 -4
- package/dist/service.js.map +1 -1
- package/dist/skill/access.d.ts +70 -0
- package/dist/skill/access.js +292 -0
- package/dist/skill/access.js.map +1 -0
- package/dist/skill/managed.d.ts +32 -0
- package/dist/skill/managed.js +152 -0
- package/dist/skill/managed.js.map +1 -0
- package/dist/upgrade/installation.d.ts +24 -0
- package/dist/upgrade/installation.js +137 -0
- package/dist/upgrade/installation.js.map +1 -0
- package/dist/upgrade/maintenance.d.ts +15 -0
- package/dist/upgrade/maintenance.js +133 -0
- package/dist/upgrade/maintenance.js.map +1 -0
- package/dist/upgrade/release.d.ts +9 -0
- package/dist/upgrade/release.js +45 -0
- package/dist/upgrade/release.js.map +1 -0
- package/dist/upgrade/service-refresh.d.ts +38 -0
- package/dist/upgrade/service-refresh.js +138 -0
- package/dist/upgrade/service-refresh.js.map +1 -0
- package/dist/upgrade/update.d.ts +49 -0
- package/dist/upgrade/update.js +228 -0
- package/dist/upgrade/update.js.map +1 -0
- package/package.json +3 -2
- package/skills/frely-cli/SKILL.md +8 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export function stableVersion(value) {
|
|
2
|
+
if (typeof value !== "string" || !/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/u.test(value))
|
|
3
|
+
throw new Error("Release source did not return a stable version.");
|
|
4
|
+
return value;
|
|
5
|
+
}
|
|
6
|
+
export function compareVersions(a, b) {
|
|
7
|
+
const parse = (v) => {
|
|
8
|
+
const core = v.split("-")[0].split("+")[0];
|
|
9
|
+
return stableVersion(core).split(".").map(BigInt);
|
|
10
|
+
};
|
|
11
|
+
const aa = parse(a), bb = parse(b);
|
|
12
|
+
for (let i = 0; i < 3; i++)
|
|
13
|
+
if (aa[i] !== bb[i])
|
|
14
|
+
return aa[i] > bb[i] ? 1 : -1;
|
|
15
|
+
return a.includes("-") === b.includes("-") ? 0 : a.includes("-") ? -1 : 1;
|
|
16
|
+
}
|
|
17
|
+
export async function latestRelease(installation, request = fetch) {
|
|
18
|
+
const standalone = installation.method === "standalone";
|
|
19
|
+
const response = await request(standalone
|
|
20
|
+
? "https://api.github.com/repos/FrelyHQ/frely-cli/releases/latest"
|
|
21
|
+
: "https://registry.npmjs.org/frely-cli/latest", {
|
|
22
|
+
headers: { accept: "application/json", "user-agent": "frely-cli" },
|
|
23
|
+
signal: AbortSignal.timeout(4000), redirect: "error",
|
|
24
|
+
});
|
|
25
|
+
if (!response.ok)
|
|
26
|
+
throw new Error(`Release lookup failed (HTTP ${response.status}).`);
|
|
27
|
+
const text = await response.text();
|
|
28
|
+
if (text.length > 1024 * 1024)
|
|
29
|
+
throw new Error("Release metadata is too large.");
|
|
30
|
+
const data = JSON.parse(text);
|
|
31
|
+
if (standalone && (data.draft !== false || data.prerelease !== false))
|
|
32
|
+
throw new Error("GitHub release is not a stable published release.");
|
|
33
|
+
const version = stableVersion(standalone ? String(data.tag_name).replace(/^v/u, "") : data.version);
|
|
34
|
+
if (!standalone && data.name !== "frely-cli")
|
|
35
|
+
throw new Error("Release package name does not match frely-cli.");
|
|
36
|
+
return { version, ...(standalone ? { baseUrl: `https://github.com/FrelyHQ/frely-cli/releases/download/v${version}` } : {}) };
|
|
37
|
+
}
|
|
38
|
+
export function standaloneAsset(platform = process.platform, arch = process.arch, target = typeof FRELY_BUILD_TARGET === "string" ? FRELY_BUILD_TARGET : undefined) {
|
|
39
|
+
// Compiled target includes libc, so an Alpine executable never changes distribution during an upgrade.
|
|
40
|
+
const value = target ?? `${platform === "win32" ? "windows" : platform}-${arch}`;
|
|
41
|
+
if (!/^(?:darwin-(?:arm64|x64)|linux-(?:arm64|x64)(?:-musl)?|windows-(?:arm64|x64))$/u.test(value))
|
|
42
|
+
throw new Error("This platform has no standalone release.");
|
|
43
|
+
return `frely-${value}${value.startsWith("windows") ? ".exe" : ""}`;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=release.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release.js","sourceRoot":"","sources":["../../src/upgrade/release.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,6CAA6C,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IAChK,OAAO,KAAK,CAAC;AACf,CAAC;AACD,MAAM,UAAU,eAAe,CAAC,CAAS,EAAE,CAAS;IAClD,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QAC7C,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpD,CAAC,CAAC;IACF,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC,CAAC,CAAE,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,YAA0B,EAAE,UAAwB,KAAK;IAC3F,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,KAAK,YAAY,CAAC;IACxD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,UAAU;QACvC,CAAC,CAAC,gEAAgE;QAClE,CAAC,CAAC,6CAA6C,EAAE;QACjD,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,WAAW,EAAE;QAClE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO;KACrD,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;IACtF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACjF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;IACzD,IAAI,UAAU,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IAC5I,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAChH,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,2DAA2D,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC/H,CAAC;AAGD,MAAM,UAAU,eAAe,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,kBAAkB,KAAK,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS;IAChK,uGAAuG;IACvG,MAAM,KAAK,GAAG,MAAM,IAAI,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;IACjF,IAAI,CAAC,iFAAiF,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAChK,OAAO,SAAS,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type DiagnosticLog } from "../runtime/diagnostics.js";
|
|
2
|
+
import { type Installation } from "./installation.js";
|
|
3
|
+
import type { MaintenanceGate } from "./maintenance.js";
|
|
4
|
+
export interface InstalledCandidate {
|
|
5
|
+
fingerprint: string;
|
|
6
|
+
version: string;
|
|
7
|
+
}
|
|
8
|
+
export interface RefreshProbe {
|
|
9
|
+
read(): Promise<InstalledCandidate>;
|
|
10
|
+
verify(candidate: InstalledCandidate): Promise<boolean>;
|
|
11
|
+
}
|
|
12
|
+
/** Inspect only the installation this process already runs; never follow PATH or download code. */
|
|
13
|
+
export declare function installationProbe(installation: Installation): RefreshProbe;
|
|
14
|
+
/** One tick at a time. Busy work keeps its connection and admission; only idle runtimes drain. */
|
|
15
|
+
export declare class ServiceRefresh {
|
|
16
|
+
private readonly options;
|
|
17
|
+
private candidate;
|
|
18
|
+
private checking;
|
|
19
|
+
private restarting;
|
|
20
|
+
private deferredFingerprint;
|
|
21
|
+
constructor(options: {
|
|
22
|
+
probe: RefreshProbe;
|
|
23
|
+
gate: MaintenanceGate;
|
|
24
|
+
signal: AbortSignal;
|
|
25
|
+
restart: () => void;
|
|
26
|
+
log?: DiagnosticLog;
|
|
27
|
+
currentVersion?: string;
|
|
28
|
+
});
|
|
29
|
+
check(): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
/** Only an already-running managed POSIX service watches its supported installation. */
|
|
32
|
+
export declare function watchServiceInstallation(options: {
|
|
33
|
+
gate: MaintenanceGate;
|
|
34
|
+
signal: AbortSignal;
|
|
35
|
+
restart: () => void;
|
|
36
|
+
log?: DiagnosticLog;
|
|
37
|
+
onEnabled?: () => void;
|
|
38
|
+
}): Promise<() => void>;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { execFile as execFileCallback } from "node:child_process";
|
|
2
|
+
import { readFile, stat } from "node:fs/promises";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
import { VERSION } from "../version.js";
|
|
7
|
+
import { diagnostic } from "../runtime/diagnostics.js";
|
|
8
|
+
import { inspectInstallation } from "./installation.js";
|
|
9
|
+
const execFile = promisify(execFileCallback);
|
|
10
|
+
/** Inspect only the installation this process already runs; never follow PATH or download code. */
|
|
11
|
+
export function installationProbe(installation) {
|
|
12
|
+
let standaloneCache;
|
|
13
|
+
const version = async () => {
|
|
14
|
+
const standalone = installation.method === "standalone";
|
|
15
|
+
const result = await execFile(standalone ? installation.entry : process.execPath, standalone ? ["--version"] : [installation.entry, "--version"], { cwd: homedir(), timeout: 10000, maxBuffer: 65536 });
|
|
16
|
+
const value = result.stdout.trim();
|
|
17
|
+
if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/u.test(value))
|
|
18
|
+
throw new Error("Invalid installed CLI version.");
|
|
19
|
+
return value;
|
|
20
|
+
};
|
|
21
|
+
const fingerprint = async () => {
|
|
22
|
+
const files = installation.method === "standalone" ? [installation.entry]
|
|
23
|
+
: [installation.entry, join(dirname(dirname(installation.entry)), "package.json")];
|
|
24
|
+
return (await Promise.all(files.map(async (path) => {
|
|
25
|
+
const info = await stat(path, { bigint: true });
|
|
26
|
+
if (!info.isFile())
|
|
27
|
+
throw new Error("Installed CLI file is unavailable.");
|
|
28
|
+
return [info.dev, info.ino, info.size, info.mtimeNs, info.ctimeNs].join(":");
|
|
29
|
+
}))).join("|");
|
|
30
|
+
};
|
|
31
|
+
return {
|
|
32
|
+
async read() {
|
|
33
|
+
const before = await fingerprint();
|
|
34
|
+
let installed;
|
|
35
|
+
if (installation.method === "standalone") {
|
|
36
|
+
if (standaloneCache?.fingerprint === before)
|
|
37
|
+
return standaloneCache;
|
|
38
|
+
installed = await version();
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
const metadata = JSON.parse(await readFile(join(dirname(dirname(installation.entry)), "package.json"), "utf8"));
|
|
42
|
+
if (metadata.name !== "frely-cli" || typeof metadata.version !== "string")
|
|
43
|
+
throw new Error("Installed package is unavailable.");
|
|
44
|
+
installed = metadata.version;
|
|
45
|
+
}
|
|
46
|
+
if (before !== await fingerprint())
|
|
47
|
+
throw new Error("Installation is changing.");
|
|
48
|
+
const candidate = { fingerprint: before, version: installed };
|
|
49
|
+
if (installation.method === "standalone")
|
|
50
|
+
standaloneCache = candidate;
|
|
51
|
+
return candidate;
|
|
52
|
+
},
|
|
53
|
+
async verify(candidate) {
|
|
54
|
+
return await fingerprint() === candidate.fingerprint && await version() === candidate.version
|
|
55
|
+
&& await fingerprint() === candidate.fingerprint;
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/** One tick at a time. Busy work keeps its connection and admission; only idle runtimes drain. */
|
|
60
|
+
export class ServiceRefresh {
|
|
61
|
+
options;
|
|
62
|
+
candidate;
|
|
63
|
+
checking = false;
|
|
64
|
+
restarting = false;
|
|
65
|
+
deferredFingerprint;
|
|
66
|
+
constructor(options) {
|
|
67
|
+
this.options = options;
|
|
68
|
+
}
|
|
69
|
+
async check() {
|
|
70
|
+
if (this.checking || this.restarting || this.options.signal.aborted)
|
|
71
|
+
return;
|
|
72
|
+
this.checking = true;
|
|
73
|
+
let paused = false;
|
|
74
|
+
const { probe, gate, signal, restart, log } = this.options;
|
|
75
|
+
try {
|
|
76
|
+
const candidate = await probe.read();
|
|
77
|
+
if (candidate.version === (this.options.currentVersion ?? VERSION)) {
|
|
78
|
+
this.candidate = undefined;
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
// Two observations, separated by the polling interval, avoid switching during package extraction.
|
|
82
|
+
if (this.candidate?.fingerprint !== candidate.fingerprint || this.candidate.version !== candidate.version) {
|
|
83
|
+
this.candidate = candidate;
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (signal.aborted)
|
|
87
|
+
return;
|
|
88
|
+
if (!gate.idle) {
|
|
89
|
+
if (this.deferredFingerprint !== candidate.fingerprint) {
|
|
90
|
+
diagnostic(log, "relay.upgrade_deferred");
|
|
91
|
+
this.deferredFingerprint = candidate.fingerprint;
|
|
92
|
+
}
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
// An explicit frely upgrade may already own maintenance. Never resume another owner's gate.
|
|
96
|
+
try {
|
|
97
|
+
gate.pause();
|
|
98
|
+
paused = true;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (!await probe.verify(candidate) || signal.aborted || !gate.idle)
|
|
104
|
+
return;
|
|
105
|
+
diagnostic(log, "relay.upgrade_restart");
|
|
106
|
+
restart();
|
|
107
|
+
this.restarting = true;
|
|
108
|
+
// Keep admission closed while the relay flushes and exits. Its existing supervisor restarts it.
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// Missing files and unsuccessful startup are expected during external installation.
|
|
112
|
+
// Keep the loaded runtime alive and require two fresh observations before retrying.
|
|
113
|
+
this.candidate = undefined;
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
if (paused && !this.restarting)
|
|
117
|
+
gate.resume();
|
|
118
|
+
this.checking = false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** Only an already-running managed POSIX service watches its supported installation. */
|
|
123
|
+
export async function watchServiceInstallation(options) {
|
|
124
|
+
if (options.signal.aborted || !["darwin", "linux"].includes(process.platform))
|
|
125
|
+
return () => { };
|
|
126
|
+
const installation = await inspectInstallation();
|
|
127
|
+
if (options.signal.aborted || !["standalone", "npm", "bun"].includes(installation.method))
|
|
128
|
+
return () => { };
|
|
129
|
+
options.onEnabled?.();
|
|
130
|
+
const refresh = new ServiceRefresh({ ...options, probe: installationProbe(installation) });
|
|
131
|
+
const timer = setInterval(() => { void refresh.check(); }, 5000);
|
|
132
|
+
timer.unref();
|
|
133
|
+
const close = () => { clearInterval(timer); options.signal.removeEventListener("abort", close); };
|
|
134
|
+
options.signal.addEventListener("abort", close, { once: true });
|
|
135
|
+
void refresh.check();
|
|
136
|
+
return close;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=service-refresh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-refresh.js","sourceRoot":"","sources":["../../src/upgrade/service-refresh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,UAAU,EAAsB,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAqB,MAAM,mBAAmB,CAAC;AAG3E,MAAM,QAAQ,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC;AAO7C,mGAAmG;AACnG,MAAM,UAAU,iBAAiB,CAAC,YAA0B;IAC1D,IAAI,eAA+C,CAAC;IACpD,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,KAAK,YAAY,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAC9E,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,WAAW,CAAC,EAC9D,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,2DAA2D,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAChI,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IACF,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE;QAC7B,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC;YACvE,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACjD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;YAC1E,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/E,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC,CAAC;IACF,OAAO;QACL,KAAK,CAAC,IAAI;YACR,MAAM,MAAM,GAAG,MAAM,WAAW,EAAE,CAAC;YACnC,IAAI,SAAiB,CAAC;YACtB,IAAI,YAAY,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;gBACzC,IAAI,eAAe,EAAE,WAAW,KAAK,MAAM;oBAAE,OAAO,eAAe,CAAC;gBACpE,SAAS,GAAG,MAAM,OAAO,EAAE,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAwC,CAAC;gBACvJ,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ;oBAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;gBAChI,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC;YAC/B,CAAC;YACD,IAAI,MAAM,KAAK,MAAM,WAAW,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YACjF,MAAM,SAAS,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;YAC9D,IAAI,YAAY,CAAC,MAAM,KAAK,YAAY;gBAAE,eAAe,GAAG,SAAS,CAAC;YACtE,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,SAAS;YACpB,OAAO,MAAM,WAAW,EAAE,KAAK,SAAS,CAAC,WAAW,IAAI,MAAM,OAAO,EAAE,KAAK,SAAS,CAAC,OAAO;mBACxF,MAAM,WAAW,EAAE,KAAK,SAAS,CAAC,WAAW,CAAC;QACrD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,kGAAkG;AAClG,MAAM,OAAO,cAAc;IAMI;IALrB,SAAS,CAAiC;IAC1C,QAAQ,GAAG,KAAK,CAAC;IACjB,UAAU,GAAG,KAAK,CAAC;IACnB,mBAAmB,CAAqB;IAEhD,YAA6B,OAG5B;QAH4B,YAAO,GAAP,OAAO,CAGnC;IAAG,CAAC;IAEL,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO;QAC5E,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAC3D,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;YACrC,IAAI,SAAS,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;gBAAC,OAAO;YAAC,CAAC;YAC3G,kGAAkG;YAClG,IAAI,IAAI,CAAC,SAAS,EAAE,WAAW,KAAK,SAAS,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC;gBAC1G,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;gBAC3B,OAAO;YACT,CAAC;YACD,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO;YAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACf,IAAI,IAAI,CAAC,mBAAmB,KAAK,SAAS,CAAC,WAAW,EAAE,CAAC;oBACvD,UAAU,CAAC,GAAG,EAAE,wBAAwB,CAAC,CAAC;oBAC1C,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC,WAAW,CAAC;gBACnD,CAAC;gBACD,OAAO;YACT,CAAC;YACD,4FAA4F;YAC5F,IAAI,CAAC;gBAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAAC,MAAM,GAAG,IAAI,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO;YAAC,CAAC;YACtD,IAAI,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI;gBAAE,OAAO;YAC3E,UAAU,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;YACzC,OAAO,EAAE,CAAC;YACV,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,gGAAgG;QAClG,CAAC;QAAC,MAAM,CAAC;YACP,oFAAoF;YACpF,oFAAoF;YACpF,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7B,CAAC;gBAAS,CAAC;YACT,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU;gBAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9C,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;CACF;AAED,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,OAE9C;IACC,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAC/F,MAAM,YAAY,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACjD,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC;QAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAC3G,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;IACtB,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,iBAAiB,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC3F,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjE,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,MAAM,KAAK,GAAG,GAAG,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAClG,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC;IACrB,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { readDeviceBinding } from "../device/state.js";
|
|
2
|
+
import { readConnectionStatus } from "../device/connection-status.js";
|
|
3
|
+
import { serviceCommand, serviceStatus, startMcpService, stopMcpService } from "../service.js";
|
|
4
|
+
import { inspectInstallation, type Installation } from "./installation.js";
|
|
5
|
+
import { latestRelease, type Release } from "./release.js";
|
|
6
|
+
import { acquireMaintenance } from "./maintenance.js";
|
|
7
|
+
export interface UpgradeResult {
|
|
8
|
+
state: "current" | "manual" | "upgraded";
|
|
9
|
+
message: string;
|
|
10
|
+
}
|
|
11
|
+
export interface UpgradeInspection {
|
|
12
|
+
currentVersion: string;
|
|
13
|
+
latestVersion?: string;
|
|
14
|
+
installation: Installation;
|
|
15
|
+
state: "unsupported" | "available" | "current" | "unavailable";
|
|
16
|
+
message: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function inspectUpgrade(): Promise<UpgradeInspection>;
|
|
19
|
+
export declare function installedVersion(installation: Installation): Promise<string>;
|
|
20
|
+
declare function download(url: string, destination: string, maxBytes: number): Promise<void>;
|
|
21
|
+
export declare function validateStandalone(path: string, checksum: string, version: string, execute?: typeof installedVersion): Promise<void>;
|
|
22
|
+
export interface PreparedUpdate {
|
|
23
|
+
apply(): Promise<void>;
|
|
24
|
+
restore(): Promise<void>;
|
|
25
|
+
cleanup(): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
export declare function prepareStandalone(installation: Installation, release: Release, fetchFile?: typeof download, execute?: typeof installedVersion): Promise<PreparedUpdate>;
|
|
28
|
+
declare function installPackage(installation: Installation, version: string): Promise<void>;
|
|
29
|
+
declare function lockInstallation(installation: Installation): Promise<() => Promise<void>>;
|
|
30
|
+
declare const defaults: {
|
|
31
|
+
inspectInstallation: typeof inspectInstallation;
|
|
32
|
+
latestRelease: typeof latestRelease;
|
|
33
|
+
installedVersion: typeof installedVersion;
|
|
34
|
+
serviceStatus: typeof serviceStatus;
|
|
35
|
+
serviceCommand: typeof serviceCommand;
|
|
36
|
+
stopMcpService: typeof stopMcpService;
|
|
37
|
+
startMcpService: typeof startMcpService;
|
|
38
|
+
readDeviceBinding: typeof readDeviceBinding;
|
|
39
|
+
readConnectionStatus: typeof readConnectionStatus;
|
|
40
|
+
acquireMaintenance: typeof acquireMaintenance;
|
|
41
|
+
prepareStandalone: typeof prepareStandalone;
|
|
42
|
+
installPackage: typeof installPackage;
|
|
43
|
+
lockInstallation: typeof lockInstallation;
|
|
44
|
+
pause: (ms: number) => Promise<unknown>;
|
|
45
|
+
};
|
|
46
|
+
export type UpgradeDependencies = typeof defaults;
|
|
47
|
+
/** Upgrade in the calling terminal. Busy MCP callers fail before any service stop or package write. */
|
|
48
|
+
export declare function upgrade(write: (message: string) => void, dependencies?: UpgradeDependencies): Promise<UpgradeResult>;
|
|
49
|
+
export {};
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { execFile as execFileCallback } from "node:child_process";
|
|
3
|
+
import { chmod, copyFile, lstat, mkdtemp, open, readFile, realpath, rename, rm } from "node:fs/promises";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { homedir } from "node:os";
|
|
6
|
+
import { promisify } from "node:util";
|
|
7
|
+
import { VERSION } from "../version.js";
|
|
8
|
+
import { readDeviceBinding } from "../device/state.js";
|
|
9
|
+
import { connectionIsLive, readConnectionStatus } from "../device/connection-status.js";
|
|
10
|
+
import { serviceCommand, serviceStatus, startMcpService, stopMcpService } from "../service.js";
|
|
11
|
+
import { inspectInstallation, manualUpgradeCommand, packageArguments } from "./installation.js";
|
|
12
|
+
import { compareVersions, latestRelease, standaloneAsset } from "./release.js";
|
|
13
|
+
import { acquireMaintenance } from "./maintenance.js";
|
|
14
|
+
const execFile = promisify(execFileCallback);
|
|
15
|
+
const pause = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
16
|
+
export async function inspectUpgrade() {
|
|
17
|
+
const installation = await inspectInstallation().catch(() => ({ method: "unknown", entry: process.argv[1] ?? process.execPath, platform: process.platform, reason: "Installation could not be inspected." }));
|
|
18
|
+
if (installation.method === "unknown" || installation.method === "source") {
|
|
19
|
+
return { currentVersion: VERSION, installation, state: "unsupported", message: installation.reason };
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
const release = await latestRelease(installation);
|
|
23
|
+
const available = compareVersions(release.version, VERSION) > 0;
|
|
24
|
+
return { currentVersion: VERSION, latestVersion: release.version, installation, state: available ? "available" : "current",
|
|
25
|
+
message: available ? `${VERSION} → ${release.version}. Run frely upgrade.` : `${VERSION} is up to date.` };
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return { currentVersion: VERSION, installation, state: "unavailable", message: "Version lookup unavailable. Check connectivity and run frely doctor again." };
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export async function installedVersion(installation) {
|
|
32
|
+
const file = installation.method === "standalone" ? installation.entry : process.execPath;
|
|
33
|
+
const args = installation.method === "standalone" ? ["--version"] : [installation.entry, "--version"];
|
|
34
|
+
return (await execFile(file, args, { cwd: homedir(), timeout: 10000, maxBuffer: 65536 })).stdout.trim();
|
|
35
|
+
}
|
|
36
|
+
async function download(url, destination, maxBytes) {
|
|
37
|
+
const signal = AbortSignal.timeout(60000);
|
|
38
|
+
let response;
|
|
39
|
+
for (let redirects = 0; redirects < 5; redirects++) {
|
|
40
|
+
const parsed = new URL(url);
|
|
41
|
+
if (parsed.protocol !== "https:" || parsed.username || parsed.password || !["github.com", "release-assets.githubusercontent.com", "objects.githubusercontent.com"].includes(parsed.hostname))
|
|
42
|
+
throw new Error("Unsupported release download location.");
|
|
43
|
+
response = await fetch(url, { signal, redirect: "manual" });
|
|
44
|
+
if ([301, 302, 303, 307, 308].includes(response.status)) {
|
|
45
|
+
const location = response.headers.get("location");
|
|
46
|
+
await response.body?.cancel();
|
|
47
|
+
if (!location)
|
|
48
|
+
throw new Error("Missing release redirect.");
|
|
49
|
+
url = new URL(location, url).toString();
|
|
50
|
+
}
|
|
51
|
+
else
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
if (!response?.ok || !response.body)
|
|
55
|
+
throw new Error("Release download failed.");
|
|
56
|
+
const file = await open(destination, "wx", 0o600);
|
|
57
|
+
let bytes = 0;
|
|
58
|
+
try {
|
|
59
|
+
for await (const chunk of response.body) {
|
|
60
|
+
bytes += chunk.byteLength;
|
|
61
|
+
if (bytes > maxBytes)
|
|
62
|
+
throw new Error("Release download exceeds its size limit.");
|
|
63
|
+
await file.writeFile(chunk);
|
|
64
|
+
}
|
|
65
|
+
await file.sync();
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
await file.close();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export async function validateStandalone(path, checksum, version, execute = installedVersion) {
|
|
72
|
+
const match = /^([a-fA-F0-9]{64})(?:\s|$)/u.exec(checksum);
|
|
73
|
+
if (!match)
|
|
74
|
+
throw new Error("Invalid release checksum.");
|
|
75
|
+
const hash = createHash("sha256").update(await readFile(path)).digest("hex");
|
|
76
|
+
if (hash !== match[1].toLowerCase())
|
|
77
|
+
throw new Error("Release checksum mismatch; the installed executable was not changed.");
|
|
78
|
+
await chmod(path, 0o755);
|
|
79
|
+
if (await execute({ method: "standalone", platform: process.platform, entry: path }) !== version)
|
|
80
|
+
throw new Error("Downloaded executable did not report the target version.");
|
|
81
|
+
}
|
|
82
|
+
export async function prepareStandalone(installation, release, fetchFile = download, execute = installedVersion) {
|
|
83
|
+
const target = installation.entry;
|
|
84
|
+
if (!(await lstat(target)).isFile())
|
|
85
|
+
throw new Error("The installation is not a regular file.");
|
|
86
|
+
const stage = await mkdtemp(join(dirname(target), ".frely-upgrade-"));
|
|
87
|
+
const next = join(stage, "frely"), backup = join(stage, "previous");
|
|
88
|
+
try {
|
|
89
|
+
const asset = standaloneAsset();
|
|
90
|
+
await fetchFile(`${release.baseUrl}/${asset}.sha256`, join(stage, "checksum"), 1024);
|
|
91
|
+
await fetchFile(`${release.baseUrl}/${asset}`, next, 200 * 1024 * 1024);
|
|
92
|
+
await validateStandalone(next, await readFile(join(stage, "checksum"), "utf8"), release.version, execute);
|
|
93
|
+
await copyFile(target, backup);
|
|
94
|
+
return {
|
|
95
|
+
apply: () => rename(next, target),
|
|
96
|
+
restore: () => rename(backup, target),
|
|
97
|
+
cleanup: () => rm(stage, { recursive: true, force: true }),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
await rm(stage, { recursive: true, force: true });
|
|
102
|
+
throw error;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async function installPackage(installation, version) {
|
|
106
|
+
// Installation failures may contain registry credentials. Expose a bounded generic error instead.
|
|
107
|
+
try {
|
|
108
|
+
await execFile(installation.manager, packageArguments(installation, version), { cwd: homedir(), timeout: 180000, maxBuffer: 1024 * 1024 });
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
throw new Error("The package manager could not update frely-cli. Check its registry, permissions and global installation; no other manager was tried.");
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async function lockInstallation(installation) {
|
|
115
|
+
const directory = installation.method === "standalone" ? dirname(installation.entry) : dirname(dirname(dirname(installation.entry)));
|
|
116
|
+
const path = join(directory, ".frely-upgrade.lock");
|
|
117
|
+
const file = await open(path, "wx", 0o600).catch(() => { throw new Error(`Cannot acquire upgrade lock: ${path}. Check directory permissions or another upgrade. Remove a stale lock only after confirming no upgrade is running.`); });
|
|
118
|
+
await file.writeFile(`${process.pid}\n`);
|
|
119
|
+
return async () => { await file.close(); await rm(path, { force: true }); };
|
|
120
|
+
}
|
|
121
|
+
const defaults = { inspectInstallation, latestRelease, installedVersion, serviceStatus, serviceCommand, stopMcpService, startMcpService,
|
|
122
|
+
readDeviceBinding, readConnectionStatus, acquireMaintenance, prepareStandalone, installPackage, lockInstallation, pause };
|
|
123
|
+
/** Upgrade in the calling terminal. Busy MCP callers fail before any service stop or package write. */
|
|
124
|
+
export async function upgrade(write, dependencies = defaults) {
|
|
125
|
+
const d = dependencies, installation = await d.inspectInstallation();
|
|
126
|
+
if (installation.method === "source" || installation.method === "unknown")
|
|
127
|
+
throw new Error(installation.reason);
|
|
128
|
+
const release = await d.latestRelease(installation);
|
|
129
|
+
if (compareVersions(release.version, VERSION) <= 0)
|
|
130
|
+
return { state: "current", message: `Frely ${VERSION} is up to date.` };
|
|
131
|
+
const service = await d.serviceStatus();
|
|
132
|
+
if (installation.platform === "win32")
|
|
133
|
+
return { state: "manual", message: `Update ${VERSION} → ${release.version}. Finish any running Frely tasks, then run this command in a local PowerShell terminal:\n\n${manualUpgradeCommand(installation, release.version, service.active)}\n\nAfter installation, run frely doctor. No files or services were changed by frely upgrade.` };
|
|
134
|
+
if (!["darwin", "linux"].includes(installation.platform))
|
|
135
|
+
throw new Error("This platform requires a manual update.");
|
|
136
|
+
if (service.active) {
|
|
137
|
+
const command = await d.serviceCommand();
|
|
138
|
+
const entry = command?.[installation.method === "standalone" ? 0 : 1];
|
|
139
|
+
if (!service.pid || !entry || await realpath(entry).catch(() => entry) !== installation.entry)
|
|
140
|
+
throw new Error("The running service does not match this installation. Inspect frely doctor -v before upgrading.");
|
|
141
|
+
}
|
|
142
|
+
const unlock = await d.lockInstallation(installation);
|
|
143
|
+
let prepared, releaseMaintenance;
|
|
144
|
+
let attempted = false, stopped = false, preserveRecovery = false;
|
|
145
|
+
try {
|
|
146
|
+
write(`Updating Frely ${VERSION} → ${release.version} (${installation.method}).\n`);
|
|
147
|
+
prepared = installation.method === "standalone" ? await d.prepareStandalone(installation, release) : {
|
|
148
|
+
apply: () => d.installPackage(installation, release.version), restore: () => d.installPackage(installation, VERSION), cleanup: async () => { },
|
|
149
|
+
};
|
|
150
|
+
// Prepare downloads before pausing admission. A command inside this MCP is itself busy and cannot stop its parent.
|
|
151
|
+
if (service.active)
|
|
152
|
+
releaseMaintenance = await d.acquireMaintenance(service.pid);
|
|
153
|
+
if (service.active) {
|
|
154
|
+
const current = await d.serviceStatus();
|
|
155
|
+
if (!current.active || current.pid !== service.pid)
|
|
156
|
+
throw new Error("The service changed during upgrade preparation. Run frely doctor, then retry.");
|
|
157
|
+
stopped = true;
|
|
158
|
+
await d.stopMcpService();
|
|
159
|
+
for (let i = 0; i < 30 && (await d.serviceStatus()).active; i++)
|
|
160
|
+
await d.pause(100);
|
|
161
|
+
if ((await d.serviceStatus()).active)
|
|
162
|
+
throw new Error("The service did not stop; the installation was not changed.");
|
|
163
|
+
}
|
|
164
|
+
attempted = true;
|
|
165
|
+
await prepared.apply();
|
|
166
|
+
if (await d.installedVersion(installation) !== release.version)
|
|
167
|
+
throw new Error("Installed executable did not report the target version.");
|
|
168
|
+
attempted = false; // Installation verified. Service/network failures must not revert a working binary.
|
|
169
|
+
if (stopped) {
|
|
170
|
+
await d.startMcpService();
|
|
171
|
+
const binding = await d.readDeviceBinding();
|
|
172
|
+
let started = false, connected = false;
|
|
173
|
+
for (let i = 0; i < 40; i++) {
|
|
174
|
+
const active = await d.serviceStatus();
|
|
175
|
+
const observation = binding ? await d.readConnectionStatus(binding) : null;
|
|
176
|
+
if (active.active && observation && observation.pid === active.pid && observation.cliVersion === release.version && observation.entry === installation.entry) {
|
|
177
|
+
started = true;
|
|
178
|
+
connected = connectionIsLive(observation);
|
|
179
|
+
if (connected)
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
await d.pause(250);
|
|
183
|
+
}
|
|
184
|
+
if (!started) {
|
|
185
|
+
// Authentication/network can prevent ensureDevice and its reporter. Keep a verified installed binary.
|
|
186
|
+
return { state: "upgraded", message: `Frely ${release.version} is installed. A service restart was requested, but its new runtime could not be verified. Run frely doctor -v.` };
|
|
187
|
+
}
|
|
188
|
+
return { state: "upgraded", message: `Frely ${release.version} is installed; the service is using the new version. ${connected ? "Relay connection verified." : "Relay connection is not yet verified. Run frely doctor."}` };
|
|
189
|
+
}
|
|
190
|
+
return { state: "upgraded", message: `Frely ${release.version} is installed. The background service remains ${service.installed ? "stopped" : "uninstalled"}.` };
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
let recovery = "";
|
|
194
|
+
if (attempted && prepared) {
|
|
195
|
+
try {
|
|
196
|
+
await prepared.restore();
|
|
197
|
+
if (await d.installedVersion(installation) !== VERSION)
|
|
198
|
+
throw new Error("Old version not restored.");
|
|
199
|
+
recovery = ` Restored Frely ${VERSION}.`;
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
preserveRecovery = true;
|
|
203
|
+
recovery = " Recovery failed; the backup (if any) was retained. Use the original installer to repair this installation.";
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
if (stopped) {
|
|
207
|
+
try {
|
|
208
|
+
await d.startMcpService();
|
|
209
|
+
recovery += " Requested restart of the original service.";
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
recovery += " The service could not restart. Run frely doctor -v.";
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
throw new Error(`${error instanceof Error ? error.message : "Upgrade failed."}${recovery}`);
|
|
216
|
+
}
|
|
217
|
+
finally {
|
|
218
|
+
releaseMaintenance?.();
|
|
219
|
+
try {
|
|
220
|
+
if (!preserveRecovery)
|
|
221
|
+
await prepared?.cleanup();
|
|
222
|
+
}
|
|
223
|
+
finally {
|
|
224
|
+
await unlock();
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/upgrade/update.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "frely-cli",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.6",
|
|
4
4
|
"description": "Frely account CLI and local MCP runtime",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -19,7 +19,8 @@
|
|
|
19
19
|
"dist",
|
|
20
20
|
"README.md",
|
|
21
21
|
"NOTICE",
|
|
22
|
-
"TRADEMARKS.md"
|
|
22
|
+
"TRADEMARKS.md",
|
|
23
|
+
"skills"
|
|
23
24
|
],
|
|
24
25
|
"scripts": {
|
|
25
26
|
"build": "node scripts/clean.mjs dist && tsc -p tsconfig.build.json",
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: frely-cli
|
|
3
|
+
description: Use the installed Frely CLI to access Frely Agents, manage their local Skills, or inspect Frely access and usage.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Run `frely help --agent --json` for the installed CLI's current capabilities and instructions.
|
|
7
|
+
|
|
8
|
+
Follow the returned command contract instead of remembered command syntax. If the command is unavailable, report that the installed CLI needs an update.
|