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.
Files changed (64) hide show
  1. package/README.md +188 -38
  2. package/dist/agent-help.d.ts +287 -0
  3. package/dist/agent-help.js +64 -0
  4. package/dist/agent-help.js.map +1 -0
  5. package/dist/auth.d.ts +3 -1
  6. package/dist/auth.js +3 -2
  7. package/dist/auth.js.map +1 -1
  8. package/dist/cloud.d.ts +7 -0
  9. package/dist/cloud.js +263 -0
  10. package/dist/cloud.js.map +1 -0
  11. package/dist/device/connection-status.d.ts +42 -0
  12. package/dist/device/connection-status.js +112 -0
  13. package/dist/device/connection-status.js.map +1 -0
  14. package/dist/device/relay-client.d.ts +7 -0
  15. package/dist/device/relay-client.js +124 -56
  16. package/dist/device/relay-client.js.map +1 -1
  17. package/dist/diagnostics.d.ts +66 -4
  18. package/dist/diagnostics.js +133 -25
  19. package/dist/diagnostics.js.map +1 -1
  20. package/dist/index.js +157 -38
  21. package/dist/index.js.map +1 -1
  22. package/dist/key-budget.d.ts +22 -0
  23. package/dist/key-budget.js +97 -0
  24. package/dist/key-budget.js.map +1 -0
  25. package/dist/mcp-authorization.js +3 -3
  26. package/dist/mcp-authorization.js.map +1 -1
  27. package/dist/mcp-command.d.ts +9 -0
  28. package/dist/mcp-command.js +68 -0
  29. package/dist/mcp-command.js.map +1 -0
  30. package/dist/runtime/diagnostics.d.ts +17 -0
  31. package/dist/runtime/diagnostics.js +84 -0
  32. package/dist/runtime/diagnostics.js.map +1 -0
  33. package/dist/runtime/mcp.d.ts +3 -0
  34. package/dist/runtime/mcp.js +40 -23
  35. package/dist/runtime/mcp.js.map +1 -1
  36. package/dist/runtime/relay-mcp.d.ts +9 -3
  37. package/dist/runtime/relay-mcp.js +66 -19
  38. package/dist/runtime/relay-mcp.js.map +1 -1
  39. package/dist/service.d.ts +4 -0
  40. package/dist/service.js +28 -4
  41. package/dist/service.js.map +1 -1
  42. package/dist/skill/access.d.ts +70 -0
  43. package/dist/skill/access.js +292 -0
  44. package/dist/skill/access.js.map +1 -0
  45. package/dist/skill/managed.d.ts +32 -0
  46. package/dist/skill/managed.js +152 -0
  47. package/dist/skill/managed.js.map +1 -0
  48. package/dist/upgrade/installation.d.ts +24 -0
  49. package/dist/upgrade/installation.js +137 -0
  50. package/dist/upgrade/installation.js.map +1 -0
  51. package/dist/upgrade/maintenance.d.ts +15 -0
  52. package/dist/upgrade/maintenance.js +133 -0
  53. package/dist/upgrade/maintenance.js.map +1 -0
  54. package/dist/upgrade/release.d.ts +9 -0
  55. package/dist/upgrade/release.js +45 -0
  56. package/dist/upgrade/release.js.map +1 -0
  57. package/dist/upgrade/service-refresh.d.ts +38 -0
  58. package/dist/upgrade/service-refresh.js +138 -0
  59. package/dist/upgrade/service-refresh.js.map +1 -0
  60. package/dist/upgrade/update.d.ts +49 -0
  61. package/dist/upgrade/update.js +228 -0
  62. package/dist/upgrade/update.js.map +1 -0
  63. package/package.json +3 -2
  64. package/skills/frely-cli/SKILL.md +8 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access.js","sourceRoot":"","sources":["../../src/skill/access.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export type SkillHost = "chatgpt" | "codex" | "claude-code" | "pi" | "generic";
2
+ export type SkillScope = "global" | "project";
3
+ export interface ManagedSkillRecord {
4
+ readonly version: 1;
5
+ readonly distributionId: string;
6
+ readonly manifestUrl: string;
7
+ readonly modelId: string;
8
+ readonly mcpUrl: string;
9
+ readonly name: string;
10
+ readonly slug: string;
11
+ readonly host: SkillHost;
12
+ readonly scope: SkillScope;
13
+ readonly authMode: "account" | "api-key";
14
+ readonly skillPath: string;
15
+ readonly sha256: string;
16
+ readonly installedAt: string;
17
+ }
18
+ export declare class ManagedSkillError extends Error {
19
+ readonly code: "unmanaged_skill_exists" | "managed_skill_modified" | "local_state_invalid";
20
+ constructor(code: "unmanaged_skill_exists" | "managed_skill_modified" | "local_state_invalid", message: string);
21
+ }
22
+ export declare function managedSkillRoot(host: SkillHost, scope: SkillScope, cwd?: string, home?: string): string;
23
+ export declare function skillSlug(name: string, distributionId: string): string;
24
+ export declare function writeManagedSkill(input: {
25
+ readonly record: Omit<ManagedSkillRecord, "sha256" | "installedAt">;
26
+ readonly content: string;
27
+ readonly home?: string;
28
+ }): Promise<ManagedSkillRecord>;
29
+ export declare function readManagedSkill(distributionId: string, home?: string): Promise<ManagedSkillRecord | null>;
30
+ export declare function managedSkillState(record: ManagedSkillRecord): Promise<"managed" | "modified" | "missing">;
31
+ export declare function removeManagedSkill(record: ManagedSkillRecord, home?: string): Promise<void>;
32
+ export declare function assertManagedSkillPath(path: string): Promise<void>;
@@ -0,0 +1,152 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { constants } from "node:fs";
3
+ import { lstat, mkdir, open, rename, unlink } from "node:fs/promises";
4
+ import { homedir } from "node:os";
5
+ import { dirname, join, resolve } from "node:path";
6
+ export class ManagedSkillError extends Error {
7
+ code;
8
+ constructor(code, message) {
9
+ super(message);
10
+ this.code = code;
11
+ this.name = "ManagedSkillError";
12
+ }
13
+ }
14
+ export function managedSkillRoot(host, scope, cwd = process.cwd(), home = homedir()) {
15
+ if (scope === "project") {
16
+ if (host === "claude-code")
17
+ return join(resolve(cwd), ".claude", "skills");
18
+ if (host === "pi")
19
+ return join(resolve(cwd), ".pi", "skills");
20
+ return join(resolve(cwd), ".agents", "skills");
21
+ }
22
+ if (host === "claude-code")
23
+ return join(home, ".claude", "skills");
24
+ if (host === "pi")
25
+ return join(home, ".pi", "agent", "skills");
26
+ return join(home, ".agents", "skills");
27
+ }
28
+ export function skillSlug(name, distributionId) {
29
+ const base = name.toLowerCase().replace(/[^a-z0-9]+/gu, "-").replace(/^-+|-+$/gu, "").replace(/-+/gu, "-").slice(0, 44) || "agent";
30
+ return `frely-${base}-${distributionId.slice(-8)}`.slice(0, 64).replace(/-+$/u, "");
31
+ }
32
+ export async function writeManagedSkill(input) {
33
+ const metadataPath = join(dirname(input.record.skillPath), ".frely-managed.json");
34
+ const current = await readOwnedFile(input.record.skillPath);
35
+ const metadata = await readOwnedFile(metadataPath, 4096);
36
+ let marker = null;
37
+ if (metadata !== null) {
38
+ try {
39
+ marker = recordValue(JSON.parse(metadata));
40
+ }
41
+ catch {
42
+ marker = null;
43
+ }
44
+ if (!marker || marker.version !== 1 || marker.owner !== "frely-cli-skill" || marker.distributionId !== input.record.distributionId) {
45
+ throw new ManagedSkillError("unmanaged_skill_exists", "An unmanaged Skill already exists at the target path.");
46
+ }
47
+ }
48
+ if (current !== null && (!marker || (hashText(current) !== marker.sha256 && hashText(current) !== marker.pendingSha256))) {
49
+ throw new ManagedSkillError("managed_skill_modified", "The managed Skill was modified; refusing to overwrite it.");
50
+ }
51
+ const sha256 = hashText(input.content);
52
+ await atomicWrite(metadataPath, JSON.stringify({ version: 1, owner: "frely-cli-skill", distributionId: input.record.distributionId, sha256: current === null ? null : hashText(current), pendingSha256: sha256 }));
53
+ await atomicWrite(input.record.skillPath, input.content);
54
+ await atomicWrite(metadataPath, JSON.stringify({ version: 1, owner: "frely-cli-skill", distributionId: input.record.distributionId, sha256 }));
55
+ const record = Object.freeze({ ...input.record, sha256, installedAt: new Date().toISOString() });
56
+ await atomicWrite(recordPath(input.home ?? homedir(), record.distributionId), `${JSON.stringify(record, null, 2)}\n`);
57
+ return record;
58
+ }
59
+ export async function readManagedSkill(distributionId, home = homedir()) {
60
+ const text = await readOwnedFile(recordPath(home, distributionId), 64 * 1024);
61
+ if (text === null)
62
+ return null;
63
+ let value;
64
+ try {
65
+ value = JSON.parse(text);
66
+ }
67
+ catch {
68
+ throw new ManagedSkillError("local_state_invalid", "Installed Frely Skill metadata is invalid.");
69
+ }
70
+ const item = recordValue(value);
71
+ const authMode = item?.authMode === undefined ? "account" : item.authMode;
72
+ if (!item || item.version !== 1 || item.distributionId !== distributionId || typeof item.manifestUrl !== "string" || typeof item.modelId !== "string" || typeof item.mcpUrl !== "string" || typeof item.name !== "string" || typeof item.slug !== "string" || typeof item.skillPath !== "string" || typeof item.sha256 !== "string" || typeof item.installedAt !== "string" || !["chatgpt", "codex", "claude-code", "pi", "generic"].includes(String(item.host)) || !["global", "project"].includes(String(item.scope)) || !["account", "api-key"].includes(String(authMode))) {
73
+ throw new ManagedSkillError("local_state_invalid", "Installed Frely Skill metadata is invalid.");
74
+ }
75
+ return Object.freeze({ ...item, authMode });
76
+ }
77
+ export async function managedSkillState(record) {
78
+ const text = await readOwnedFile(record.skillPath);
79
+ if (text === null)
80
+ return "missing";
81
+ return hashText(text) === record.sha256 ? "managed" : "modified";
82
+ }
83
+ export async function removeManagedSkill(record, home = homedir()) {
84
+ const state = await managedSkillState(record);
85
+ if (state === "modified")
86
+ throw new ManagedSkillError("managed_skill_modified", "Managed Skill was modified; refusing to remove it.");
87
+ await unlink(record.skillPath).catch(ignoreAbsent);
88
+ await unlink(join(dirname(record.skillPath), ".frely-managed.json")).catch(ignoreAbsent);
89
+ await unlink(recordPath(home, record.distributionId)).catch(ignoreAbsent);
90
+ }
91
+ export async function assertManagedSkillPath(path) {
92
+ let current = resolve(path);
93
+ while (true) {
94
+ const stat = await lstat(current).catch((error) => { if (isAbsent(error))
95
+ return null; throw error; });
96
+ if (stat?.isSymbolicLink())
97
+ throw new ManagedSkillError("unmanaged_skill_exists", "Refusing to traverse a symbolic link while managing a Skill.");
98
+ const parent = dirname(current);
99
+ if (parent === current)
100
+ break;
101
+ current = parent;
102
+ }
103
+ }
104
+ async function readOwnedFile(path, maxBytes = 512 * 1024) {
105
+ await assertManagedSkillPath(path);
106
+ let file;
107
+ try {
108
+ file = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
109
+ }
110
+ catch (error) {
111
+ if (isAbsent(error))
112
+ return null;
113
+ throw error;
114
+ }
115
+ try {
116
+ const stat = await file.stat();
117
+ if (!stat.isFile() || stat.size > maxBytes)
118
+ throw new ManagedSkillError("local_state_invalid", "Managed Skill file is invalid.");
119
+ return await file.readFile("utf8");
120
+ }
121
+ finally {
122
+ await file.close();
123
+ }
124
+ }
125
+ async function atomicWrite(path, value) {
126
+ await assertManagedSkillPath(path);
127
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
128
+ await assertManagedSkillPath(path);
129
+ const temporary = `${path}.${randomUUID()}.tmp`;
130
+ const file = await open(temporary, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, 0o600);
131
+ try {
132
+ await file.writeFile(value, "utf8");
133
+ await file.sync();
134
+ }
135
+ finally {
136
+ await file.close();
137
+ }
138
+ try {
139
+ await assertManagedSkillPath(path);
140
+ await rename(temporary, path);
141
+ }
142
+ finally {
143
+ await unlink(temporary).catch(() => undefined);
144
+ }
145
+ }
146
+ function recordPath(home, distributionId) { return join(home, ".config", "frely", "skills", `${distributionId}.json`); }
147
+ function hashText(value) { return createHash("sha256").update(value).digest("hex"); }
148
+ function recordValue(value) { return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null; }
149
+ function isAbsent(error) { return error.code === "ENOENT"; }
150
+ function ignoreAbsent(error) { if (!isAbsent(error))
151
+ throw error; }
152
+ //# sourceMappingURL=managed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managed.js","sourceRoot":"","sources":["../../src/skill/managed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export type InstallMethod = "standalone" | "npm" | "bun" | "source" | "unknown";
2
+ export interface Installation {
3
+ method: InstallMethod;
4
+ entry: string;
5
+ platform: NodeJS.Platform;
6
+ manager?: string;
7
+ prefix?: string;
8
+ reason?: string;
9
+ }
10
+ export type CommandRunner = (file: string, args: string[]) => Promise<string>;
11
+ export declare const runCommand: CommandRunner;
12
+ export declare function findExecutable(name: string): Promise<string | undefined>;
13
+ export declare function inspectInstallation(options?: {
14
+ entry?: string;
15
+ executable?: string;
16
+ standalone?: boolean;
17
+ platform?: NodeJS.Platform;
18
+ find?: typeof findExecutable;
19
+ run?: CommandRunner;
20
+ }): Promise<Installation>;
21
+ export declare function packageArguments(installation: Installation, version: string): string[];
22
+ export declare function shellQuote(value: string, windows?: boolean): string;
23
+ /** Copyable instructions only: no self-replacement process on Windows. */
24
+ export declare function manualUpgradeCommand(installation: Installation, version: string, serviceActive?: boolean): string;
@@ -0,0 +1,137 @@
1
+ import { execFile as execFileCallback } from "node:child_process";
2
+ import { access, lstat, readFile, realpath } from "node:fs/promises";
3
+ import { constants } from "node:fs";
4
+ import { homedir } from "node:os";
5
+ import { basename, delimiter, dirname, join, resolve } from "node:path";
6
+ import { promisify } from "node:util";
7
+ import { IS_STANDALONE } from "../cli-launch.js";
8
+ const execFile = promisify(execFileCallback);
9
+ export const runCommand = async (file, args) => {
10
+ // npm's Windows shim is not an executable. Invoke the packaged npm CLI with Node.
11
+ if (process.platform === "win32" && /npm\.cmd$/iu.test(file)) {
12
+ const cli = join(dirname(file), "node_modules", "npm", "bin", "npm-cli.js");
13
+ return (await execFile(process.execPath, [cli, ...args], { cwd: homedir(), timeout: 5000, maxBuffer: 1024 * 1024 })).stdout.trim();
14
+ }
15
+ return (await execFile(file, args, { cwd: homedir(), timeout: 5000, maxBuffer: 1024 * 1024 })).stdout.trim();
16
+ };
17
+ export async function findExecutable(name) {
18
+ for (const directory of (process.env.PATH ?? "").split(delimiter).filter(Boolean)) {
19
+ for (const suffix of process.platform === "win32" ? [".exe", ".cmd", ""] : [""]) {
20
+ const path = resolve(directory, name + suffix);
21
+ if (await access(path, constants.X_OK).then(() => true, () => false))
22
+ return path;
23
+ }
24
+ }
25
+ return undefined;
26
+ }
27
+ export async function inspectInstallation(options = {}) {
28
+ const platform = options.platform ?? process.platform;
29
+ const standalone = options.standalone ?? IS_STANDALONE;
30
+ const original = standalone ? options.executable ?? process.execPath : options.entry ?? process.argv[1] ?? "";
31
+ const entry = await realpath(original).catch(() => resolve(original));
32
+ const base = { entry, platform };
33
+ if (standalone) {
34
+ if ((await lstat(original)).isSymbolicLink())
35
+ return { ...base, method: "unknown", reason: "The executable is managed through a symbolic link. Update it using its owner." };
36
+ return { ...base, method: "standalone" };
37
+ }
38
+ const root = dirname(dirname(entry));
39
+ const metadata = await readFile(join(root, "package.json"), "utf8").then((raw) => JSON.parse(raw), () => null).catch(() => null);
40
+ if (metadata?.name !== "frely-cli")
41
+ return { ...base, method: "unknown", reason: "Cannot identify this installation's package root." };
42
+ if (await lstat(join(root, ".git")).then(() => true, () => false))
43
+ return { ...base, method: "source", reason: "Source checkout or local link. Update and build the checkout using its development workflow." };
44
+ const find = options.find ?? findExecutable, run = options.run ?? runCommand;
45
+ const candidates = [];
46
+ const npm = await find("npm");
47
+ if (npm) {
48
+ try {
49
+ const globalRoot = await run(npm, ["root", "--global"]);
50
+ const expected = join(globalRoot, "frely-cli");
51
+ if (!(await lstat(expected)).isSymbolicLink() && await realpath(expected) === root) {
52
+ const prefix = await run(npm, ["prefix", "--global"]);
53
+ candidates.push({ ...base, method: "npm", manager: npm, prefix });
54
+ }
55
+ }
56
+ catch { /* A missing/broken manager is not proof of ownership. */ }
57
+ if (!candidates.length && basename(dirname(root)) === "node_modules") {
58
+ // An explicit `npm install -g --prefix ...` need not be the manager's current default.
59
+ const prefix = platform === "win32" ? dirname(dirname(root)) : basename(dirname(dirname(root))) === "lib" ? dirname(dirname(dirname(root))) : undefined;
60
+ if (prefix)
61
+ try {
62
+ const wrapper = platform === "win32" ? join(prefix, "frely.cmd") : join(prefix, "bin", "frely");
63
+ const wrapperMatches = platform === "win32"
64
+ ? /node_modules[\\/]+frely-cli[\\/]+dist[\\/]+index\.js/iu.test(await readFile(wrapper, "utf8"))
65
+ : await realpath(wrapper) === entry;
66
+ const globalRoot = await run(npm, ["root", "--global", "--prefix", prefix]);
67
+ const expected = join(globalRoot, "frely-cli");
68
+ if (wrapperMatches && !(await lstat(expected)).isSymbolicLink() && await realpath(expected) === root) {
69
+ candidates.push({ ...base, method: "npm", manager: npm, prefix });
70
+ }
71
+ }
72
+ catch { /* No matching global wrapper: leave project dependencies untouched. */ }
73
+ }
74
+ }
75
+ const bun = await find("bun");
76
+ if (bun) {
77
+ try {
78
+ const bin = await run(bun, ["pm", "bin", "--global"]);
79
+ let linkedEntry;
80
+ if (platform === "win32") {
81
+ // Bun uses an executable shim on Windows. Recognize its standard global tree;
82
+ // an unrecognized custom layout stays manual rather than guessing ownership.
83
+ const expected = join(process.env.BUN_INSTALL || join(homedir(), ".bun"), "install", "global", "node_modules", "frely-cli");
84
+ if (await realpath(expected) !== root || !(await lstat(join(bin, "frely.exe"))).isFile())
85
+ throw new Error("Unknown Bun shim.");
86
+ linkedEntry = entry;
87
+ }
88
+ else
89
+ linkedEntry = await realpath(join(bin, "frely"));
90
+ // Bun links its global bin to dist/index.js on POSIX. A source/file dependency is not a registry install.
91
+ const globalMetadata = JSON.parse(await readFile(join(dirname(dirname(root)), "package.json"), "utf8"));
92
+ const spec = globalMetadata.dependencies?.["frely-cli"];
93
+ if (linkedEntry === entry && spec && /^(?:[~^]?[0-9]|latest$|next$)/u.test(spec) && !(await lstat(root)).isSymbolicLink()) {
94
+ candidates.push({ ...base, method: "bun", manager: bun });
95
+ }
96
+ }
97
+ catch { /* Never guess Bun ownership from the runtime or PATH alone. */ }
98
+ }
99
+ return candidates.length === 1 ? candidates[0] : { ...base, method: "unknown", reason: "This is a project, temporary runner, local link, or unrecognized global installation. Update it with the original installer." };
100
+ }
101
+ export function packageArguments(installation, version) {
102
+ return installation.method === "npm"
103
+ ? ["install", "--global", "--ignore-scripts", "--prefix", installation.prefix, `frely-cli@${version}`]
104
+ : ["add", "--global", "--ignore-scripts", `frely-cli@${version}`];
105
+ }
106
+ export function shellQuote(value, windows = false) {
107
+ return "'" + value.replace(/'/gu, windows ? "''" : "'\\''") + "'";
108
+ }
109
+ /** Copyable instructions only: no self-replacement process on Windows. */
110
+ export function manualUpgradeCommand(installation, version, serviceActive = false) {
111
+ const windows = installation.platform === "win32";
112
+ const quote = (s) => shellQuote(s, windows);
113
+ let command;
114
+ if (installation.method === "npm" || installation.method === "bun") {
115
+ command = `${windows ? "& " : ""}${quote(installation.manager)} ${packageArguments(installation, version).map(quote).join(" ")}`;
116
+ if (windows)
117
+ command += "; if ($LASTEXITCODE -ne 0) { throw 'Frely installation failed' }";
118
+ }
119
+ else if (installation.method === "standalone") {
120
+ const base = `https://github.com/FrelyHQ/frely-cli/releases/download/v${version}`;
121
+ command = windows
122
+ ? `$env:FRELY_CLI_VERSION = ${quote(version)}; $env:FRELY_INSTALL_DIR = ${quote(dirname(installation.entry))}; $env:FRELY_INSTALL_NO_PROFILE = '1'; & ([scriptblock]::Create((Invoke-WebRequest ${quote(base + "/install.ps1")} -UseBasicParsing).Content))`
123
+ : `curl -fsSL ${quote(base + "/install.sh")} | FRELY_CLI_VERSION=${quote(version)} FRELY_INSTALL_DIR=${quote(dirname(installation.entry))} FRELY_INSTALL_NO_PROFILE=1 sh`;
124
+ }
125
+ else
126
+ return installation.reason ?? "Update this installation using its original installer.";
127
+ if (windows) {
128
+ const frely = installation.method === "standalone" ? `& ${quote(installation.entry)}` : `& ${quote(process.execPath)} ${quote(installation.entry)}`;
129
+ const body = serviceActive
130
+ ? `${frely} mcp service stop; if ($LASTEXITCODE -ne 0) { throw 'Could not stop Frely service' }; try { ${command} } finally { ${frely} mcp service start }`
131
+ : command;
132
+ // Child PowerShell keeps installer environment changes out of the user's shell.
133
+ return `powershell -NoProfile -Command ${quote(`$ErrorActionPreference = 'Stop'; ${body}`)}`;
134
+ }
135
+ return command;
136
+ }
137
+ //# sourceMappingURL=installation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installation.js","sourceRoot":"","sources":["../../src/upgrade/installation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /** An existing relay owns this gate; no updater daemon or remote upgrade jobs. */
2
+ export declare class MaintenanceGate {
3
+ private paused;
4
+ private requests;
5
+ private readonly processes;
6
+ enter(): () => void;
7
+ track(): () => void;
8
+ registerProcesses(count: () => number): () => void;
9
+ pause(): void;
10
+ resume(): void;
11
+ get idle(): boolean;
12
+ }
13
+ export declare function maintenancePath(pid: number): string;
14
+ export declare function serveMaintenance(gate: MaintenanceGate, path?: string): Promise<() => Promise<void>>;
15
+ export declare function acquireMaintenance(pid: number, path?: string): Promise<() => void>;
@@ -0,0 +1,133 @@
1
+ import { createConnection, createServer } from "node:net";
2
+ import { chmod, lstat, mkdir, rm } from "node:fs/promises";
3
+ import { homedir } from "node:os";
4
+ import { dirname, join } from "node:path";
5
+ /** An existing relay owns this gate; no updater daemon or remote upgrade jobs. */
6
+ export class MaintenanceGate {
7
+ paused = false;
8
+ requests = 0;
9
+ processes = new Set();
10
+ enter() {
11
+ if (this.paused)
12
+ throw new Error("Frely is preparing an upgrade. Retry after it completes.");
13
+ return this.track();
14
+ }
15
+ track() {
16
+ this.requests++;
17
+ let done = false;
18
+ return () => { if (!done) {
19
+ done = true;
20
+ this.requests--;
21
+ } };
22
+ }
23
+ registerProcesses(count) {
24
+ this.processes.add(count);
25
+ return () => this.processes.delete(count);
26
+ }
27
+ pause() {
28
+ if (this.paused)
29
+ throw new Error("Another upgrade holds this service.");
30
+ this.paused = true;
31
+ }
32
+ resume() { this.paused = false; }
33
+ get idle() { return this.requests === 0 && [...this.processes].every((count) => count() === 0); }
34
+ }
35
+ export function maintenancePath(pid) {
36
+ return join(process.env.XDG_CONFIG_HOME || join(homedir(), ".config"), "frely", `upgrade-${pid}.sock`);
37
+ }
38
+ export async function serveMaintenance(gate, path = maintenancePath(process.pid)) {
39
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
40
+ const directory = await lstat(dirname(path));
41
+ if (directory.isSymbolicLink() || !directory.isDirectory() || directory.uid !== process.getuid?.())
42
+ throw new Error("Unsafe maintenance directory.");
43
+ await chmod(dirname(path), 0o700);
44
+ let owner;
45
+ const sockets = new Set();
46
+ const server = createServer((socket) => {
47
+ sockets.add(socket);
48
+ socket.on("error", () => socket.destroy());
49
+ socket.on("close", () => { sockets.delete(socket); if (owner === socket) {
50
+ owner = undefined;
51
+ gate.resume();
52
+ } });
53
+ socket.setTimeout(2000, () => socket.destroy());
54
+ let input = "";
55
+ socket.on("data", (data) => {
56
+ input += data.toString("utf8");
57
+ if (input.length > 32 || owner === socket) {
58
+ socket.destroy();
59
+ return;
60
+ }
61
+ if (!input.includes("\n"))
62
+ return;
63
+ if (input !== "drain\n" || owner) {
64
+ socket.end("busy\n");
65
+ return;
66
+ }
67
+ // The runtime may own maintenance for an external installation refresh.
68
+ try {
69
+ gate.pause();
70
+ }
71
+ catch {
72
+ socket.end("busy\n");
73
+ return;
74
+ }
75
+ owner = socket;
76
+ socket.setTimeout(0);
77
+ const deadline = Date.now() + 3000;
78
+ const interval = setInterval(() => {
79
+ if (gate.idle) {
80
+ clearInterval(interval);
81
+ socket.write("ready\n");
82
+ }
83
+ else if (Date.now() >= deadline) {
84
+ clearInterval(interval);
85
+ socket.end("busy\n");
86
+ }
87
+ }, 50);
88
+ socket.once("close", () => clearInterval(interval));
89
+ });
90
+ });
91
+ server.maxConnections = 4;
92
+ // Refuse an existing socket instead of unlinking another runtime's endpoint.
93
+ await new Promise((resolve, reject) => {
94
+ server.once("error", reject);
95
+ server.listen(path, () => { server.off("error", reject); resolve(); });
96
+ });
97
+ await chmod(path, 0o600);
98
+ return async () => {
99
+ for (const socket of sockets)
100
+ socket.destroy();
101
+ await new Promise((resolve) => server.close(() => resolve()));
102
+ await rm(path, { force: true });
103
+ };
104
+ }
105
+ export async function acquireMaintenance(pid, path = maintenancePath(pid)) {
106
+ const info = await lstat(path).catch(() => null);
107
+ if (!info?.isSocket() || info.uid !== process.getuid?.() || (info.mode & 0o077) !== 0) {
108
+ throw new Error("The running service has no private upgrade endpoint. Finish its tasks and restart it from a local terminal before upgrading.");
109
+ }
110
+ return new Promise((resolve, reject) => {
111
+ const socket = createConnection(path);
112
+ const fail = () => { socket.destroy(); reject(new Error("The service is busy or cannot enter maintenance. Finish its tasks, then run frely upgrade in a local terminal.")); };
113
+ socket.setTimeout(5000, fail);
114
+ socket.once("error", fail);
115
+ socket.once("connect", () => socket.write("drain\n"));
116
+ let text = "", ready = false;
117
+ socket.on("data", (data) => {
118
+ text += data.toString("utf8");
119
+ if (text.length > 32 || (text.includes("\n") && text !== "ready\n")) {
120
+ fail();
121
+ return;
122
+ }
123
+ if (text === "ready\n") {
124
+ ready = true;
125
+ socket.setTimeout(0);
126
+ resolve(() => socket.destroy());
127
+ }
128
+ });
129
+ socket.once("close", () => { if (!ready)
130
+ fail(); });
131
+ });
132
+ }
133
+ //# sourceMappingURL=maintenance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maintenance.js","sourceRoot":"","sources":["../../src/upgrade/maintenance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Installation } from "./installation.js";
2
+ export interface Release {
3
+ version: string;
4
+ baseUrl?: string;
5
+ }
6
+ export declare function stableVersion(value: unknown): string;
7
+ export declare function compareVersions(a: string, b: string): number;
8
+ export declare function latestRelease(installation: Installation, request?: typeof fetch): Promise<Release>;
9
+ export declare function standaloneAsset(platform?: NodeJS.Platform, arch?: NodeJS.Architecture, target?: string | undefined): string;