@songsid/agend 2.1.1-beta.1 → 2.1.1-beta.3
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/backend/types.d.ts +1 -6
- package/dist/backend/types.js +48 -4
- package/dist/backend/types.js.map +1 -1
- package/dist/cli.js +16 -8
- package/dist/cli.js.map +1 -1
- package/dist/fleet-manager.d.ts +11 -0
- package/dist/fleet-manager.js +86 -9
- package/dist/fleet-manager.js.map +1 -1
- package/dist/service-installer.d.ts +7 -0
- package/dist/service-installer.js +43 -3
- package/dist/service-installer.js.map +1 -1
- package/dist/update-check.d.ts +22 -0
- package/dist/update-check.js +44 -0
- package/dist/update-check.js.map +1 -0
- package/package.json +1 -1
package/dist/backend/types.d.ts
CHANGED
|
@@ -165,12 +165,7 @@ export interface CliBackend {
|
|
|
165
165
|
models: ModelOption[];
|
|
166
166
|
}>;
|
|
167
167
|
}
|
|
168
|
-
|
|
169
|
-
* Resolve the full path to a CLI binary.
|
|
170
|
-
* tmux new-window runs commands in a minimal shell without user PATH,
|
|
171
|
-
* so we resolve at daemon startup time when the full PATH is available.
|
|
172
|
-
*/
|
|
173
|
-
export declare function resolveBinary(name: string): string;
|
|
168
|
+
export declare function resolveBinary(name: string, fallbackDirs?: readonly string[]): string;
|
|
174
169
|
export declare function validateModel(model: string): string;
|
|
175
170
|
/** Check if a model name is compatible with the given backend. */
|
|
176
171
|
export declare function isModelCompatible(backendName: string, model: string): boolean;
|
package/dist/backend/types.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { accessSync, constants, readdirSync, statSync } from "node:fs";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
2
5
|
/** Best-effort `<binary> --version` (first line, trimmed). Never throws. */
|
|
3
6
|
export function probeCliVersion(binaryPath) {
|
|
4
7
|
try {
|
|
@@ -14,13 +17,54 @@ export function probeCliVersion(binaryPath) {
|
|
|
14
17
|
* tmux new-window runs commands in a minimal shell without user PATH,
|
|
15
18
|
* so we resolve at daemon startup time when the full PATH is available.
|
|
16
19
|
*/
|
|
17
|
-
|
|
20
|
+
function commonBinaryDirs() {
|
|
21
|
+
const dirs = [
|
|
22
|
+
dirname(process.execPath),
|
|
23
|
+
join(homedir(), ".local", "bin"),
|
|
24
|
+
join(homedir(), ".npm-global", "bin"),
|
|
25
|
+
"/usr/local/bin",
|
|
26
|
+
"/usr/bin",
|
|
27
|
+
"/bin",
|
|
28
|
+
];
|
|
29
|
+
// Root installations often retain Codex under an nvm prefix while sudo's
|
|
30
|
+
// secure_path omits it. Probe every installed nvm Node bin as a fallback.
|
|
18
31
|
try {
|
|
19
|
-
|
|
32
|
+
const nvmVersions = join(homedir(), ".nvm", "versions", "node");
|
|
33
|
+
for (const version of readdirSync(nvmVersions).sort().reverse()) {
|
|
34
|
+
dirs.push(join(nvmVersions, version, "bin"));
|
|
35
|
+
}
|
|
20
36
|
}
|
|
21
|
-
catch {
|
|
22
|
-
|
|
37
|
+
catch { /* nvm is optional */ }
|
|
38
|
+
// Also cover custom npm prefixes such as ~/.npm-global.
|
|
39
|
+
try {
|
|
40
|
+
const prefix = execFileSync("npm", ["prefix", "-g"], {
|
|
41
|
+
encoding: "utf-8",
|
|
42
|
+
timeout: 3000,
|
|
43
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
44
|
+
}).trim();
|
|
45
|
+
if (prefix)
|
|
46
|
+
dirs.push(join(prefix, "bin"));
|
|
47
|
+
}
|
|
48
|
+
catch { /* npm may not be in the restricted PATH */ }
|
|
49
|
+
return [...new Set(dirs)];
|
|
50
|
+
}
|
|
51
|
+
export function resolveBinary(name, fallbackDirs) {
|
|
52
|
+
try {
|
|
53
|
+
const resolved = execFileSync("which", [name], { encoding: "utf-8" }).trim();
|
|
54
|
+
if (resolved)
|
|
55
|
+
return resolved;
|
|
56
|
+
}
|
|
57
|
+
catch { /* search common absolute locations below */ }
|
|
58
|
+
for (const dir of fallbackDirs ?? commonBinaryDirs()) {
|
|
59
|
+
const candidate = join(dir, name);
|
|
60
|
+
try {
|
|
61
|
+
accessSync(candidate, constants.X_OK);
|
|
62
|
+
if (statSync(candidate).isFile())
|
|
63
|
+
return candidate;
|
|
64
|
+
}
|
|
65
|
+
catch { /* try next candidate */ }
|
|
23
66
|
}
|
|
67
|
+
return name; // final fallback keeps the previous shell-PATH behavior
|
|
24
68
|
}
|
|
25
69
|
/**
|
|
26
70
|
* Whitelist for model names embedded into the shell command line.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/backend/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/backend/types.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -13,6 +13,7 @@ import { spawn, execSync, execFileSync } from "node:child_process";
|
|
|
13
13
|
import { getAgendHome, getTmuxSocketName } from "./paths.js";
|
|
14
14
|
import { readClassicLastActivityAt } from "./classic-channel-manager.js";
|
|
15
15
|
import { hasPausedMarker } from "./pause-marker.js";
|
|
16
|
+
import { getUpdateSelector, lookupTargetVersion, reportUpdateRestart, shouldSkipUpdate, } from "./update-check.js";
|
|
16
17
|
/** Prefix tmux args with -L when socket isolation is active. */
|
|
17
18
|
function tmuxArgs(args) {
|
|
18
19
|
const socket = getTmuxSocketName();
|
|
@@ -1088,11 +1089,22 @@ program
|
|
|
1088
1089
|
.description("Update AgEnD to latest version and restart service")
|
|
1089
1090
|
.option("--version <ver>", "Specific version to install")
|
|
1090
1091
|
.option("--beta", "Install beta version")
|
|
1092
|
+
.option("--force", "Force reinstall and restart even when already up to date")
|
|
1091
1093
|
.action(async (opts) => {
|
|
1092
1094
|
const { spawnSync } = await import("node:child_process");
|
|
1093
|
-
const tag =
|
|
1095
|
+
const tag = getUpdateSelector(opts);
|
|
1094
1096
|
const pkg = `@songsid/agend@${tag}`;
|
|
1095
|
-
|
|
1097
|
+
const targetVersion = lookupTargetVersion(tag);
|
|
1098
|
+
if (shouldSkipUpdate(pkgVersion, targetVersion, opts.force)) {
|
|
1099
|
+
console.log(`\n ✓ Already up to date (v${pkgVersion})\n`);
|
|
1100
|
+
return;
|
|
1101
|
+
}
|
|
1102
|
+
if (targetVersion) {
|
|
1103
|
+
console.log(`\n Updating AgEnD v${pkgVersion} → v${targetVersion}...\n`);
|
|
1104
|
+
}
|
|
1105
|
+
else {
|
|
1106
|
+
console.log(`\n Updating AgEnD to ${tag}...\n`);
|
|
1107
|
+
}
|
|
1096
1108
|
// Detect and remove stale npm link (local build that shadows global install)
|
|
1097
1109
|
try {
|
|
1098
1110
|
const agendPath = execSync("which agend", { encoding: "utf-8", stdio: "pipe" }).trim();
|
|
@@ -1204,12 +1216,8 @@ program
|
|
|
1204
1216
|
// systemd → user systemd → launchd → detached pid).
|
|
1205
1217
|
console.log(" Restarting fleet...");
|
|
1206
1218
|
const restartResult = spawnSync(agendPath, ["restart"], { encoding: "utf-8", timeout: 30000, stdio: "inherit" });
|
|
1207
|
-
if (restartResult.status
|
|
1208
|
-
|
|
1209
|
-
}
|
|
1210
|
-
else {
|
|
1211
|
-
console.log(" ⚠ Auto-restart failed. Run: agend start");
|
|
1212
|
-
}
|
|
1219
|
+
if (!reportUpdateRestart(restartResult.status))
|
|
1220
|
+
process.exitCode = 1;
|
|
1213
1221
|
});
|
|
1214
1222
|
program
|
|
1215
1223
|
.command("reload")
|