@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/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. Returns null for default AGEND_HOME
7
- * (backward compatible — uses tmux's default socket). Custom AGEND_HOME
8
- * gets a unique socket to isolate tmux servers.
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
- /** Tmux session name — unique per AGEND_HOME to avoid cross-instance interference. */
11
- export function getTmuxSessionName() {
12
- const home = getAgendHome();
13
- const defaultHome = join(homedir(), ".agend");
14
- if (home === defaultHome)
15
- return "agend";
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. The suffix value WILL change for users with a custom
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. Returns null for default AGEND_HOME
27
- * (backward compatible — uses tmux's default socket). Custom AGEND_HOME
28
- * gets a unique socket to isolate tmux servers.
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
- const defaultHome = join(homedir(), ".agend");
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;AAClC,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,sFAAsF;AACtF,MAAM,UAAU,kBAAkB;IAChC,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC9C,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,OAAO,CAAC;IACzC,4EAA4E;IAC5E,2EAA2E;IAC3E,4EAA4E;IAC5E,iEAAiE;IACjE,2EAA2E;IAC3E,yEAAyE;IACzE,wCAAwC;IACxC,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;;;;GAIG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC9C,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IACtC,4EAA4E;IAC5E,2EAA2E;IAC3E,4EAA4E;IAC5E,iEAAiE;IACjE,2EAA2E;IAC3E,yEAAyE;IACzE,wCAAwC;IACxC,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,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"}
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"}
@@ -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;
@@ -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) {
@@ -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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@songsid/agend",
3
- "version": "2.1.10-beta.2",
3
+ "version": "2.1.10-beta.3",
4
4
  "description": "Multi-agent fleet daemon — run any coding CLI (Claude, Gemini, Codex, OpenCode) from Telegram",
5
5
  "type": "module",
6
6
  "bin": {