@songsid/agend 2.1.10-beta.2 → 2.1.10-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/cli.js +80 -50
- package/dist/cli.js.map +1 -1
- package/dist/coredump-filter.d.ts +21 -0
- package/dist/coredump-filter.js +64 -0
- package/dist/coredump-filter.js.map +1 -0
- package/dist/daemon.js +5 -1
- package/dist/daemon.js.map +1 -1
- package/dist/paths.d.ts +15 -3
- package/dist/paths.js +45 -25
- package/dist/paths.js.map +1 -1
- package/dist/update-check.d.ts +22 -0
- package/dist/update-check.js +31 -0
- package/dist/update-check.js.map +1 -1
- package/package.json +1 -1
package/dist/paths.d.ts
CHANGED
|
@@ -1,11 +1,23 @@
|
|
|
1
1
|
/** Resolve the AgEnD data directory. Override with AGEND_HOME env var. */
|
|
2
2
|
export declare function getAgendHome(): string;
|
|
3
|
+
/**
|
|
4
|
+
* Whether this process's AgEnD home is the user's real default one — the only
|
|
5
|
+
* home that uses tmux's default socket and the plain "agend" session (#1126).
|
|
6
|
+
*
|
|
7
|
+
* Before, "default" meant `AGEND_HOME === $HOME/.agend`. A throwaway fleet run
|
|
8
|
+
* with HOME and AGEND_HOME both pointed at a scratch directory matched that,
|
|
9
|
+
* attached to the LIVE fleet's default tmux server, and its startup cleanup
|
|
10
|
+
* killed 16 live windows as "orphaned" (2026-10-03). Comparing against the
|
|
11
|
+
* real home closes that, and changes nothing for anyone whose AGEND_HOME is
|
|
12
|
+
* unset or set to their real ~/.agend: their socket and session names stay.
|
|
13
|
+
*/
|
|
14
|
+
export declare function isDefaultAgendHome(home?: string): boolean;
|
|
3
15
|
/** Tmux session name — unique per AGEND_HOME to avoid cross-instance interference. */
|
|
4
16
|
export declare function getTmuxSessionName(): string;
|
|
5
17
|
/**
|
|
6
|
-
* Tmux socket name for -L flag.
|
|
7
|
-
* (
|
|
8
|
-
*
|
|
18
|
+
* Tmux socket name for -L flag. Null only for the user's real default home
|
|
19
|
+
* (tmux's default socket, as always); any other AgEnD home gets a socket of
|
|
20
|
+
* its own, so it can never reach — and clean up — another fleet's server.
|
|
9
21
|
*/
|
|
10
22
|
export declare function getTmuxSocketName(): string | null;
|
|
11
23
|
/** Ensure an auto-created workspace has a .git directory (best effort). */
|
package/dist/paths.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { join } from "node:path";
|
|
2
|
-
import { homedir } from "node:os";
|
|
2
|
+
import { homedir, userInfo } from "node:os";
|
|
3
3
|
import { createHash } from "node:crypto";
|
|
4
4
|
import { existsSync } from "node:fs";
|
|
5
5
|
import { execFileSync } from "node:child_process";
|
|
@@ -7,39 +7,59 @@ import { execFileSync } from "node:child_process";
|
|
|
7
7
|
export function getAgendHome() {
|
|
8
8
|
return process.env.AGEND_HOME || join(homedir(), ".agend");
|
|
9
9
|
}
|
|
10
|
-
/**
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
/**
|
|
11
|
+
* The user's real AgEnD home: `.agend` in the home directory from the
|
|
12
|
+
* password database, NOT `$HOME`. A test or throwaway fleet that changes HOME
|
|
13
|
+
* (and AGEND_HOME with it) must not be mistaken for the user's own fleet.
|
|
14
|
+
* Null when the password database cannot be read: falling back to homedir()
|
|
15
|
+
* would trust `$HOME` again (#1128 review), so then no home is the default.
|
|
16
|
+
*/
|
|
17
|
+
function realDefaultAgendHome() {
|
|
18
|
+
try {
|
|
19
|
+
return join(userInfo().homedir, ".agend");
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Whether this process's AgEnD home is the user's real default one — the only
|
|
27
|
+
* home that uses tmux's default socket and the plain "agend" session (#1126).
|
|
28
|
+
*
|
|
29
|
+
* Before, "default" meant `AGEND_HOME === $HOME/.agend`. A throwaway fleet run
|
|
30
|
+
* with HOME and AGEND_HOME both pointed at a scratch directory matched that,
|
|
31
|
+
* attached to the LIVE fleet's default tmux server, and its startup cleanup
|
|
32
|
+
* killed 16 live windows as "orphaned" (2026-10-03). Comparing against the
|
|
33
|
+
* real home closes that, and changes nothing for anyone whose AGEND_HOME is
|
|
34
|
+
* unset or set to their real ~/.agend: their socket and session names stay.
|
|
35
|
+
*/
|
|
36
|
+
export function isDefaultAgendHome(home = getAgendHome()) {
|
|
37
|
+
// Exact string comparison, as before: only WHICH home it is compared with
|
|
38
|
+
// changed, so no existing AGEND_HOME value moves to another socket. An
|
|
39
|
+
// unknown real home is never matched: the fleet gets an isolated socket.
|
|
40
|
+
const real = realDefaultAgendHome();
|
|
41
|
+
return real !== null && home === real;
|
|
42
|
+
}
|
|
43
|
+
function isolatedSuffix(home) {
|
|
16
44
|
// sha256 instead of md5: this hash is not security-critical (we just need a
|
|
17
45
|
// short stable suffix so two custom AGEND_HOME values don't collide on the
|
|
18
46
|
// tmux session/socket namespace), but md5 trips FIPS-mode Node and security
|
|
19
|
-
// scanners.
|
|
20
|
-
// AGEND_HOME — that only affects an in-memory tmux session/socket name, so
|
|
21
|
-
// a single daemon restart resyncs cleanly (any orphan tmux session under
|
|
22
|
-
// the old name can be killed manually).
|
|
47
|
+
// scanners.
|
|
23
48
|
return "agend-" + createHash("sha256").update(home).digest("hex").slice(0, 6);
|
|
24
49
|
}
|
|
50
|
+
/** Tmux session name — unique per AGEND_HOME to avoid cross-instance interference. */
|
|
51
|
+
export function getTmuxSessionName() {
|
|
52
|
+
const home = getAgendHome();
|
|
53
|
+
return isDefaultAgendHome(home) ? "agend" : isolatedSuffix(home);
|
|
54
|
+
}
|
|
25
55
|
/**
|
|
26
|
-
* Tmux socket name for -L flag.
|
|
27
|
-
* (
|
|
28
|
-
*
|
|
56
|
+
* Tmux socket name for -L flag. Null only for the user's real default home
|
|
57
|
+
* (tmux's default socket, as always); any other AgEnD home gets a socket of
|
|
58
|
+
* its own, so it can never reach — and clean up — another fleet's server.
|
|
29
59
|
*/
|
|
30
60
|
export function getTmuxSocketName() {
|
|
31
61
|
const home = getAgendHome();
|
|
32
|
-
|
|
33
|
-
if (home === defaultHome)
|
|
34
|
-
return null;
|
|
35
|
-
// sha256 instead of md5: this hash is not security-critical (we just need a
|
|
36
|
-
// short stable suffix so two custom AGEND_HOME values don't collide on the
|
|
37
|
-
// tmux session/socket namespace), but md5 trips FIPS-mode Node and security
|
|
38
|
-
// scanners. The suffix value WILL change for users with a custom
|
|
39
|
-
// AGEND_HOME — that only affects an in-memory tmux session/socket name, so
|
|
40
|
-
// a single daemon restart resyncs cleanly (any orphan tmux session under
|
|
41
|
-
// the old name can be killed manually).
|
|
42
|
-
return "agend-" + createHash("sha256").update(home).digest("hex").slice(0, 6);
|
|
62
|
+
return isDefaultAgendHome(home) ? null : isolatedSuffix(home);
|
|
43
63
|
}
|
|
44
64
|
/** Ensure an auto-created workspace has a .git directory (best effort). */
|
|
45
65
|
export function ensureWorkspaceGit(dir) {
|
package/dist/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,0EAA0E;AAC1E,MAAM,UAAU,YAAY;IAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;;GAMG;AACH,SAAS,oBAAoB;IAC3B,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AAC3E,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe,YAAY,EAAE;IAC9D,0EAA0E;IAC1E,uEAAuE;IACvE,yEAAyE;IACzE,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC;AACxC,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,4EAA4E;IAC5E,2EAA2E;IAC3E,4EAA4E;IAC5E,YAAY;IACZ,OAAO,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,kBAAkB;IAChC,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;AACnE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;QACnC,4EAA4E;QAC5E,6EAA6E;QAC7E,IAAI,CAAC;YAAC,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IACpG,CAAC;AACH,CAAC"}
|
package/dist/update-check.d.ts
CHANGED
|
@@ -13,6 +13,28 @@ export declare function getUpdateSelector(opts: UpdateVersionOptions): string;
|
|
|
13
13
|
*/
|
|
14
14
|
export declare function lookupTargetVersion(selector: string, run?: typeof execFileSync): string | null;
|
|
15
15
|
export declare function shouldSkipUpdate(currentVersion: string, targetVersion: string | null, force?: boolean): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* The running fleet started before the installed package was written: it is
|
|
18
|
+
* still executing the previous version's code (#1113 hotfix). That happens
|
|
19
|
+
* when an update installed the package but its restart did not go through —
|
|
20
|
+
* a second `agend update` then saw "already up to date" and left the old
|
|
21
|
+
* process running against the new files on disk. Unknown (no pid, no start
|
|
22
|
+
* time) is false: never restart on a guess.
|
|
23
|
+
*/
|
|
24
|
+
export declare function runningFleetPredatesInstall(opts: {
|
|
25
|
+
pid: number | null;
|
|
26
|
+
installedAtMs: number;
|
|
27
|
+
processStartMs: (pid: number) => number | null;
|
|
28
|
+
/**
|
|
29
|
+
* Whether `pid` is an AgEnD fleet process (its command line). A stale
|
|
30
|
+
* fleet.pid can name a recycled pid — an unrelated process that a restart
|
|
31
|
+
* would signal (#1125 review) — so anything not confirmed is not a fleet.
|
|
32
|
+
*/
|
|
33
|
+
isFleetProcess: (pid: number) => boolean;
|
|
34
|
+
marginMs?: number;
|
|
35
|
+
}): boolean;
|
|
36
|
+
/** Start time of a live process, via `ps -o lstart=` (Linux and macOS); null if gone. */
|
|
37
|
+
export declare function processStartMs(pid: number, run?: (args: string[]) => string): number | null;
|
|
16
38
|
interface UpdateOutput {
|
|
17
39
|
log(message: string): void;
|
|
18
40
|
error(message: string): void;
|
package/dist/update-check.js
CHANGED
|
@@ -30,6 +30,37 @@ export function shouldSkipUpdate(currentVersion, targetVersion, force = false) {
|
|
|
30
30
|
&& targetVersion !== null
|
|
31
31
|
&& normalizeVersion(currentVersion) === normalizeVersion(targetVersion);
|
|
32
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* The running fleet started before the installed package was written: it is
|
|
35
|
+
* still executing the previous version's code (#1113 hotfix). That happens
|
|
36
|
+
* when an update installed the package but its restart did not go through —
|
|
37
|
+
* a second `agend update` then saw "already up to date" and left the old
|
|
38
|
+
* process running against the new files on disk. Unknown (no pid, no start
|
|
39
|
+
* time) is false: never restart on a guess.
|
|
40
|
+
*/
|
|
41
|
+
export function runningFleetPredatesInstall(opts) {
|
|
42
|
+
if (opts.pid === null || !Number.isFinite(opts.installedAtMs))
|
|
43
|
+
return false;
|
|
44
|
+
if (!opts.isFleetProcess(opts.pid))
|
|
45
|
+
return false;
|
|
46
|
+
const started = opts.processStartMs(opts.pid);
|
|
47
|
+
if (started === null)
|
|
48
|
+
return false;
|
|
49
|
+
return started < opts.installedAtMs - (opts.marginMs ?? 2_000);
|
|
50
|
+
}
|
|
51
|
+
/** Start time of a live process, via `ps -o lstart=` (Linux and macOS); null if gone. */
|
|
52
|
+
export function processStartMs(pid, run = args => execFileSync("ps", args, { encoding: "utf8", env: { ...process.env, LC_ALL: "C", TZ: process.env.TZ }, stdio: ["ignore", "pipe", "ignore"], timeout: 5000 })) {
|
|
53
|
+
try {
|
|
54
|
+
const text = run(["-o", "lstart=", "-p", String(pid)]).trim();
|
|
55
|
+
if (!text)
|
|
56
|
+
return null;
|
|
57
|
+
const ms = Date.parse(text);
|
|
58
|
+
return Number.isFinite(ms) ? ms : null;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
33
64
|
/** Report restart status and let the CLI translate failure into exit code 1. */
|
|
34
65
|
export function reportUpdateRestart(status, output = console) {
|
|
35
66
|
if (status === 0) {
|
package/dist/update-check.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQlD,uDAAuD;AACvD,MAAM,UAAU,iBAAiB,CAAC,IAA0B;IAC1D,OAAO,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AACzD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAAgB,EAChB,MAA2B,YAAY;IAEvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,GAAG,CAChB,KAAK,EACL,CAAC,MAAM,EAAE,kBAAkB,QAAQ,EAAE,EAAE,SAAS,CAAC,EACjD;YACE,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;YACnC,OAAO,EAAE,MAAM;SAChB,CACF,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,OAAO,OAAO,IAAI,IAAI,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,cAAsB,EACtB,aAA4B,EAC5B,KAAK,GAAG,KAAK;IAEb,OAAO,CAAC,KAAK;WACR,aAAa,KAAK,IAAI;WACtB,gBAAgB,CAAC,cAAc,CAAC,KAAK,gBAAgB,CAAC,aAAa,CAAC,CAAC;AAC5E,CAAC;AAOD,gFAAgF;AAChF,MAAM,UAAU,mBAAmB,CACjC,MAAqB,EACrB,SAAuB,OAAO;IAE9B,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACjE,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACnC,MAAM,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
1
|
+
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"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"}
|