@claudexor/core 3.0.4 → 3.1.1

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 (45) hide show
  1. package/dist/answer-assembly.d.ts +17 -1
  2. package/dist/answer-assembly.d.ts.map +1 -1
  3. package/dist/answer-assembly.js +36 -10
  4. package/dist/answer-assembly.js.map +1 -1
  5. package/dist/effort.d.ts +54 -12
  6. package/dist/effort.d.ts.map +1 -1
  7. package/dist/effort.js +60 -39
  8. package/dist/effort.js.map +1 -1
  9. package/dist/env-scope.d.ts +1 -1
  10. package/dist/env-scope.d.ts.map +1 -1
  11. package/dist/env-scope.js +2 -2
  12. package/dist/env-scope.js.map +1 -1
  13. package/dist/errors.d.ts +11 -0
  14. package/dist/errors.d.ts.map +1 -1
  15. package/dist/errors.js +11 -0
  16. package/dist/errors.js.map +1 -1
  17. package/dist/inactivity.d.ts +7 -14
  18. package/dist/inactivity.d.ts.map +1 -1
  19. package/dist/inactivity.js +97 -10
  20. package/dist/inactivity.js.map +1 -1
  21. package/dist/index.d.ts +1 -0
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +1 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/native/claudexor-process-identity +0 -0
  26. package/dist/proc.d.ts +53 -0
  27. package/dist/proc.d.ts.map +1 -1
  28. package/dist/proc.js +150 -42
  29. package/dist/proc.js.map +1 -1
  30. package/dist/process-identity.d.ts.map +1 -1
  31. package/dist/process-identity.js +17 -7
  32. package/dist/process-identity.js.map +1 -1
  33. package/dist/process-tree.d.ts +116 -0
  34. package/dist/process-tree.d.ts.map +1 -0
  35. package/dist/process-tree.js +258 -0
  36. package/dist/process-tree.js.map +1 -0
  37. package/dist/runloop.d.ts +5 -0
  38. package/dist/runloop.d.ts.map +1 -1
  39. package/dist/runloop.js +41 -0
  40. package/dist/runloop.js.map +1 -1
  41. package/dist/runtime-env.d.ts +57 -3
  42. package/dist/runtime-env.d.ts.map +1 -1
  43. package/dist/runtime-env.js +187 -10
  44. package/dist/runtime-env.js.map +1 -1
  45. package/package.json +3 -3
@@ -1,14 +1,75 @@
1
+ import { existsSync, lstatSync, readlinkSync, realpathSync, statSync } from "node:fs";
1
2
  import { homedir } from "node:os";
2
- import { delimiter, isAbsolute, join } from "node:path";
3
+ import { basename, delimiter, dirname, isAbsolute, join } from "node:path";
3
4
  import { isLaunchableExecutable } from "./executable-inspection.js";
5
+ /**
6
+ * The directory of the Node binary Claudexor ITSELF is running on, when that
7
+ * binary is safe to expose to a harness's inner login shell. In production this
8
+ * is the notarized app-bundled runtime
9
+ * (`.../Claudexor.app/Contents/Resources`); a CLI/dev daemon runs on the
10
+ * managed `~/.claudexor/node/bin/node`. Putting this dir FIRST on the harness
11
+ * PATH is the QA-022 fix: a vendor tool's inner `/bin/bash -lc` grandchild
12
+ * re-sources login profiles (`path_helper`, `brew shellenv`) and would
13
+ * otherwise resolve an ad-hoc Homebrew Node that macOS's code-signing monitor
14
+ * SIGKILLs (`Killed: 9`). Anchoring the SAME Node the daemon already proved
15
+ * runnable — by executing on it — lets the grandchild resolve a working Node
16
+ * even after the login shell reshuffles PATH.
17
+ *
18
+ * Guarded so the prepend can never make things worse:
19
+ * - the path must be absolute and a spawnable regular file (the running
20
+ * process is itself proof the bytes launch — "self-contained/valid");
21
+ * - it must NOT itself be an at-risk Homebrew Node — prepending a killable
22
+ * Node's dir would poison the very shell we are trying to protect;
23
+ * - the REAL binary's dir (symlinks followed) is what we anchor — a symlinked
24
+ * launcher must not put the WRONG dir first on the harness PATH;
25
+ * - that dir must NOT be group/world-writable — prepending a dir any non-owner
26
+ * can write to lets a local attacker drop a malicious `node`/`bash` that then
27
+ * SHADOWS the system tools for every harness child.
28
+ * Returns null when any guard fails; the guessed `preferred` entries still apply.
29
+ */
30
+ export function managedRunnerNodeDir(execPath = process.execPath, platform = process.platform) {
31
+ if (!execPath || !isAbsolute(execPath))
32
+ return null;
33
+ if (atRiskNodeAdvisory(execPath, platform) !== null)
34
+ return null;
35
+ // realpath + regular-file + executable facts (identity-stable, bounded).
36
+ if (!isLaunchableExecutable(execPath))
37
+ return null;
38
+ // Anchor the REAL binary's dir (follow symlinks) rather than the launcher's.
39
+ let runnerDir;
40
+ try {
41
+ runnerDir = dirname(realpathSync(execPath));
42
+ }
43
+ catch {
44
+ return null;
45
+ }
46
+ // A group/world-writable runner dir is an injection surface — skip the prepend.
47
+ if (platform !== "win32" && dirIsGroupOrWorldWritable(runnerDir))
48
+ return null;
49
+ return runnerDir;
50
+ }
51
+ /** True when `dir` is writable by group or other (POSIX mode & 0o022), or cannot
52
+ * be stat'd (an undeterminable dir is not provably safe — treat as unsafe). */
53
+ function dirIsGroupOrWorldWritable(dir) {
54
+ try {
55
+ return (statSync(dir).mode & 0o022) !== 0;
56
+ }
57
+ catch {
58
+ return true;
59
+ }
60
+ }
4
61
  /**
5
62
  * Single producer for the PATH every local harness discovery/run surface should
6
63
  * use. Surfaces may still inherit other env vars, but binary resolution must not
7
64
  * depend on whether the daemon was launched from a GUI app, login shell, or CLI.
65
+ * Existing inherited entries are never dropped (only de-duplicated); the only
66
+ * additions are the trusted `preferred` prefixes.
8
67
  */
9
- export function normalizedHarnessPath(source = process.env) {
68
+ export function normalizedHarnessPath(source = process.env, execPath = process.execPath, platform = process.platform) {
10
69
  const home = source.HOME || homedir();
70
+ const runnerDir = managedRunnerNodeDir(execPath, platform);
11
71
  const preferred = [
72
+ ...(runnerDir ? [runnerDir] : []),
12
73
  join(home, ".claudexor", "node", "bin"),
13
74
  join(home, ".local", "bin"),
14
75
  join(home, ".npm-global", "bin"),
@@ -31,8 +92,8 @@ export function normalizedHarnessPath(source = process.env) {
31
92
  })
32
93
  .join(delimiter);
33
94
  }
34
- export function harnessRuntimeEnv(source = process.env) {
35
- return { ...source, PATH: normalizedHarnessPath(source) };
95
+ export function harnessRuntimeEnv(source = process.env, execPath = process.execPath, platform = process.platform) {
96
+ return { ...source, PATH: normalizedHarnessPath(source, execPath, platform) };
36
97
  }
37
98
  /**
38
99
  * Resolve which binary a harness child will ACTUALLY execute, using the same
@@ -40,16 +101,23 @@ export function harnessRuntimeEnv(source = process.env) {
40
101
  * stale pinned shim (e.g. `~/.claudexor/node/bin/codex` shadowing a newer
41
102
  * install) is visible instead of silently answering for the wrong version.
42
103
  * Returns null when the binary is not on the harness PATH.
104
+ *
105
+ * `execPath`/`platform` are forwarded to `normalizedHarnessPath` (same defaults,
106
+ * so production behavior is unchanged). Forwarding them is what lets a test
107
+ * fully control the resolution PATH: without it the resolver always anchors the
108
+ * REAL `process.execPath` dir (e.g. `~/.claudexor/node/bin`) first, and any
109
+ * `claude`/`codex` living beside the running Node shadows an injected fixture —
110
+ * the machine-specific parity failure this seam closes.
43
111
  */
44
- export function resolveHarnessBinary(bin, source = process.env) {
45
- const names = binaryNameCandidates(bin, source);
112
+ export function resolveHarnessBinary(bin, source = process.env, execPath = process.execPath, platform = process.platform) {
113
+ const names = binaryNameCandidates(bin, source, platform);
46
114
  if (isAbsolute(bin)) {
47
115
  for (const name of names)
48
116
  if (isLaunchableExecutable(name))
49
117
  return name;
50
118
  return null;
51
119
  }
52
- for (const dir of normalizedHarnessPath(source).split(delimiter)) {
120
+ for (const dir of normalizedHarnessPath(source, execPath, platform).split(delimiter)) {
53
121
  if (!dir)
54
122
  continue;
55
123
  for (const name of names) {
@@ -64,10 +132,12 @@ export function resolveHarnessBinary(bin, source = process.env) {
64
132
  * Name candidates in cmd.exe lookup order: on Windows a bare `codex` is
65
133
  * spawnable as `codex.exe`/`codex.cmd` via PATHEXT, so the resolver must try
66
134
  * those too or doctor reports null for a perfectly runnable CLI. Elsewhere the
67
- * name is used as-is.
135
+ * name is used as-is. `platform` is forwarded from the resolver (same default,
136
+ * so production is unchanged) so an injected win32 gets win32 name candidates,
137
+ * not just win32 PATH ordering.
68
138
  */
69
- function binaryNameCandidates(bin, source) {
70
- if (process.platform !== "win32")
139
+ function binaryNameCandidates(bin, source, platform = process.platform) {
140
+ if (platform !== "win32")
71
141
  return [bin];
72
142
  const exts = (source.PATHEXT ?? ".COM;.EXE;.BAT;.CMD").split(";").filter(Boolean);
73
143
  const lower = bin.toLowerCase();
@@ -75,6 +145,113 @@ function binaryNameCandidates(bin, source) {
75
145
  return [bin];
76
146
  return [bin, ...exts.map((e) => bin + e)];
77
147
  }
148
+ const HOMEBREW_PREFIXES = ["/opt/homebrew", "/usr/local", "/home/linuxbrew/.linuxbrew"];
149
+ /**
150
+ * Advisory explaining WHY a harness binary failed to resolve when the
151
+ * filesystem still holds evidence of an install. The live incident this
152
+ * guards: Homebrew's codex cask stayed registered (Caskroom dir present,
153
+ * version pinned) while its payload and bin link had vanished, so every
154
+ * surface dead-ended at "not found on PATH"/ENOENT with no path to repair.
155
+ * Two evidence classes, checked in order:
156
+ *
157
+ * 1. an entry named like the binary exists on the harness PATH (or at the
158
+ * configured absolute override) but is not spawnable — dangling symlink,
159
+ * exec bit stripped, or a directory shadowing the name;
160
+ * 2. nothing is on PATH at all, but a Homebrew Caskroom/Cellar dir still
161
+ * lists the binary as installed.
162
+ *
163
+ * Diagnostic only (doctor/discover append it); never gates a run and never
164
+ * executes a package manager. Returns null when the binary resolves or when
165
+ * there is nothing better to say than "not installed".
166
+ */
167
+ export function brokenInstallAdvisory(bin, source = process.env, brewPrefixes = HOMEBREW_PREFIXES) {
168
+ if (resolveHarnessBinary(bin, source) !== null)
169
+ return null;
170
+ const name = basename(bin);
171
+ const names = binaryNameCandidates(bin, source);
172
+ const candidates = isAbsolute(bin)
173
+ ? names
174
+ : normalizedHarnessPath(source)
175
+ .split(delimiter)
176
+ .filter(Boolean)
177
+ .flatMap((dir) => names.map((n) => join(dir, n)));
178
+ for (const candidate of candidates) {
179
+ const kind = lstatKind(candidate);
180
+ if (kind === null)
181
+ continue;
182
+ const target = kind === "symlink" ? readlinkOrNull(candidate) : null;
183
+ const where = target === null ? candidate : `${candidate} (symlink to ${target})`;
184
+ const how = kind === "symlink" && !existsSync(candidate)
185
+ ? "its target is missing"
186
+ : kind === "dir"
187
+ ? "it is a directory, not a binary"
188
+ : "it is not executable";
189
+ const fix = brewRemediation(target ?? candidate) ??
190
+ `reinstall ${name} or point the binary override at a working install`;
191
+ return `${where} exists but ${how} — ${fix}`;
192
+ }
193
+ if (!SAFE_BREW_NAME.test(name))
194
+ return null;
195
+ for (const prefix of brewPrefixes) {
196
+ for (const [room, flag] of [
197
+ ["Caskroom", " --cask"],
198
+ ["Cellar", ""],
199
+ ]) {
200
+ const dir = join(prefix, room, name);
201
+ if (lstatKind(dir) === "dir") {
202
+ // An absolute override never scanned PATH, so say what was actually
203
+ // checked instead of claiming a PATH sweep that did not happen.
204
+ const evidence = isAbsolute(bin)
205
+ ? `the configured override ${bin} does not exist`
206
+ : `no runnable binary is on the harness PATH`;
207
+ return `Homebrew still lists ${name} as installed (${dir}) but ${evidence} — broken install; run \`brew reinstall${flag} ${name}\`${isAbsolute(bin) ? " or fix the binary override" : ""}`;
208
+ }
209
+ }
210
+ }
211
+ return null;
212
+ }
213
+ function lstatKind(path) {
214
+ try {
215
+ const s = lstatSync(path);
216
+ return s.isSymbolicLink() ? "symlink" : s.isDirectory() ? "dir" : "file";
217
+ }
218
+ catch {
219
+ return null;
220
+ }
221
+ }
222
+ function readlinkOrNull(path) {
223
+ try {
224
+ return readlinkSync(path);
225
+ }
226
+ catch {
227
+ return null;
228
+ }
229
+ }
230
+ /** A copyable `brew` command is emitted only for names shaped like real
231
+ * Homebrew tokens: a configured override whose basename carries whitespace,
232
+ * quotes, or shell metacharacters must never become a pasteable command. */
233
+ const SAFE_BREW_NAME = /^[A-Za-z0-9][A-Za-z0-9@+._-]*$/;
234
+ /** The brew package token is the path segment AFTER Caskroom/Cellar — a
235
+ * binary's name can differ from the package that ships it, and the
236
+ * remediation must name the package. */
237
+ function brewToken(pathish, room) {
238
+ const marker = `/${room}/`;
239
+ const idx = pathish.indexOf(marker);
240
+ if (idx === -1)
241
+ return null;
242
+ const token = pathish.slice(idx + marker.length).split("/")[0] ?? "";
243
+ return SAFE_BREW_NAME.test(token) ? token : null;
244
+ }
245
+ /** Attribute a broken entry to Homebrew via its canonical payload dirs. */
246
+ function brewRemediation(pathish) {
247
+ const cask = brewToken(pathish, "Caskroom");
248
+ if (cask)
249
+ return `run \`brew reinstall --cask ${cask}\``;
250
+ const formula = brewToken(pathish, "Cellar");
251
+ if (formula)
252
+ return `run \`brew reinstall ${formula}\``;
253
+ return null;
254
+ }
78
255
  /**
79
256
  * Advisory when the Node binary running Claudexor is one macOS's code-signing
80
257
  * monitor is known to SIGKILL (Homebrew's adhoc-signed node). The daemon spawns
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-env.js","sourceRoot":"","sources":["../src/runtime-env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEpE;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAA4B,OAAO,CAAC,GAAG;IAC3E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG;QAChB,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC;QACvC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC;QAC3B,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC;QACzB,mBAAmB;QACnB,gBAAgB;QAChB,UAAU;QACV,MAAM;QACN,WAAW;QACX,OAAO;KACR,CAAC;IACF,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,OAAO,CAAC,GAAG,SAAS,EAAE,GAAG,SAAS,CAAC;SAChC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QAChB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC5C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;SACD,IAAI,CAAC,SAAS,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAA4B,OAAO,CAAC,GAAG;IACvE,OAAO,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC;AAC5D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,GAAW,EACX,SAA4B,OAAO,CAAC,GAAG;IAEvC,MAAM,KAAK,GAAG,oBAAoB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAChD,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,IAAI,sBAAsB,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;QACxE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,qBAAqB,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QACjE,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAClC,IAAI,sBAAsB,CAAC,SAAS,CAAC;gBAAE,OAAO,SAAS,CAAC;QAC1D,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAS,oBAAoB,CAAC,GAAW,EAAE,MAAyB;IAClE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,qBAAqB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClF,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAChC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,WAAmB,OAAO,CAAC,QAAQ,EACnC,WAA4B,OAAO,CAAC,QAAQ;IAE5C,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,MAAM,GACV,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC;QACjC,QAAQ,CAAC,UAAU,CAAC,gBAAgB,CAAC;QACrC,QAAQ,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,WAAW,QAAQ,yIAAyI,CAAC;AACtK,CAAC"}
1
+ {"version":3,"file":"runtime-env.js","sourceRoot":"","sources":["../src/runtime-env.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@claudexor/core",
3
- "version": "3.0.4",
3
+ "version": "3.1.1",
4
4
  "license": "MIT",
5
5
  "description": "HarnessAdapter contract, process helpers, typed errors, and low-level execution utilities.",
6
6
  "type": "module",
@@ -20,8 +20,8 @@
20
20
  ],
21
21
  "dependencies": {
22
22
  "@playwright/mcp": "0.0.78",
23
- "@claudexor/schema": "3.0.4",
24
- "@claudexor/util": "3.0.4"
23
+ "@claudexor/util": "3.1.1",
24
+ "@claudexor/schema": "3.1.1"
25
25
  },
26
26
  "repository": {
27
27
  "type": "git",