codeam-cli 2.76.13 → 2.76.14

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 (3) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/index.js +268 -244
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -358,7 +358,7 @@ function defaultSpawn(timeoutMs) {
358
358
  }
359
359
  function resolveConvexBin(cwd) {
360
360
  const local = path112.join(cwd, "node_modules", ".bin", process.platform === "win32" ? "convex.cmd" : "convex");
361
- if (fs98.existsSync(local)) return { cmd: local, args: [] };
361
+ if (fs99.existsSync(local)) return { cmd: local, args: [] };
362
362
  return { cmd: "npx", args: ["--yes", "convex"] };
363
363
  }
364
364
  function redact(text, key) {
@@ -489,12 +489,12 @@ async function runConvexAdminMcp(client3, id) {
489
489
  });
490
490
  await server.connect(new StdioServerTransport());
491
491
  }
492
- var import_node_child_process38, fs98, path112, TOOLS;
492
+ var import_node_child_process38, fs99, path112, TOOLS;
493
493
  var init_convex_admin_mcp = __esm({
494
494
  "src/integrations/convex-admin-mcp.ts"() {
495
495
  "use strict";
496
496
  import_node_child_process38 = require("child_process");
497
- fs98 = __toESM(require("fs"));
497
+ fs99 = __toESM(require("fs"));
498
498
  path112 = __toESM(require("path"));
499
499
  TOOLS = [
500
500
  {
@@ -3765,7 +3765,7 @@ var _default = makeConfig();
3765
3765
  var { getConfig, ensurePluginId, addSession, removeSession, setActiveSession, getActiveSession, getActiveSessionForAgent, setDisable1mContext, setSessionAgent, setSquadAuto, getSquadAuto, clearAll, saveCliConfig, loadCliConfig } = _default;
3766
3766
 
3767
3767
  // src/commands/pair-auto.ts
3768
- var fs65 = __toESM(require("fs"));
3768
+ var fs66 = __toESM(require("fs"));
3769
3769
  var os48 = __toESM(require("os"));
3770
3770
  var path74 = __toESM(require("path"));
3771
3771
  var import_crypto4 = require("crypto");
@@ -10579,7 +10579,7 @@ function readAnonId() {
10579
10579
  }
10580
10580
  function superProperties() {
10581
10581
  return {
10582
- cliVersion: true ? "2.76.13" : "0.0.0-dev",
10582
+ cliVersion: true ? "2.76.14" : "0.0.0-dev",
10583
10583
  nodeVersion: process.version,
10584
10584
  platform: process.platform,
10585
10585
  arch: process.arch,
@@ -10824,7 +10824,7 @@ var http = __toESM(require("http"));
10824
10824
  // package.json
10825
10825
  var package_default = {
10826
10826
  name: "codeam-cli",
10827
- version: "2.76.13",
10827
+ version: "2.76.14",
10828
10828
  description: "Workflow-continuity bridge for AI coding agents. Wrap Claude Code or Codex in a PTY and supervise, approve, and redirect the session from any device \u2014 async. The terminal companion for CodeAgent Mobile.",
10829
10829
  type: "commonjs",
10830
10830
  main: "dist/index.js",
@@ -12160,7 +12160,7 @@ var CommandRelayService = class _CommandRelayService {
12160
12160
  // fresh + clear the "CLI update available" banner after a self-update
12161
12161
  // (a codespace that reinstalls @latest reconnects via heartbeat, not
12162
12162
  // pair/reconnect). Older backends ignore the extra field.
12163
- ..."2.76.13" ? { ideVersion: "2.76.13" } : {}
12163
+ ..."2.76.14" ? { ideVersion: "2.76.14" } : {}
12164
12164
  };
12165
12165
  try {
12166
12166
  const res = await _postJson(`${API_BASE2}/api/plugin/heartbeat`, body);
@@ -13636,7 +13636,7 @@ function closeAllTerminals() {
13636
13636
  }
13637
13637
 
13638
13638
  // src/commands/start/handlers.ts
13639
- var fs64 = __toESM(require("fs"));
13639
+ var fs65 = __toESM(require("fs"));
13640
13640
  var os47 = __toESM(require("os"));
13641
13641
  var path73 = __toESM(require("path"));
13642
13642
  var import_crypto3 = require("crypto");
@@ -28295,10 +28295,12 @@ function persistBeadsConfig(cfg) {
28295
28295
  }
28296
28296
 
28297
28297
  // src/beads/provision-lock.ts
28298
- var import_fs7 = __toESM(require("fs"));
28298
+ var import_fs8 = __toESM(require("fs"));
28299
28299
  var import_os11 = __toESM(require("os"));
28300
28300
  var import_path9 = __toESM(require("path"));
28301
- var STALE_LOCK_MS = 5 * 6e4;
28301
+
28302
+ // src/lib/process-identity.ts
28303
+ var import_fs7 = __toESM(require("fs"));
28302
28304
  function pidIsAlive(pid) {
28303
28305
  try {
28304
28306
  process.kill(pid, 0);
@@ -28307,32 +28309,56 @@ function pidIsAlive(pid) {
28307
28309
  return err.code === "EPERM";
28308
28310
  }
28309
28311
  }
28312
+ function procStartTime(pid) {
28313
+ try {
28314
+ const stat3 = import_fs7.default.readFileSync(`/proc/${pid}/stat`, "utf8");
28315
+ const rest = stat3.slice(stat3.lastIndexOf(")") + 2).split(" ");
28316
+ return rest[19] ?? "";
28317
+ } catch {
28318
+ return "";
28319
+ }
28320
+ }
28321
+ function ownerRecord(pid, deps = {}) {
28322
+ return `${pid} ${(deps.startTimeOf ?? procStartTime)(pid)}`.trim();
28323
+ }
28324
+ function ownerIsAlive(record2, deps = {}) {
28325
+ const [pidText, recordedStart = ""] = record2.trim().split(/\s+/);
28326
+ const pid = Number(pidText);
28327
+ if (!Number.isInteger(pid) || pid <= 0) return false;
28328
+ if (!(deps.isAlive ?? pidIsAlive)(pid)) return false;
28329
+ if (!recordedStart) return true;
28330
+ const now = (deps.startTimeOf ?? procStartTime)(pid);
28331
+ return now === "" || now === recordedStart;
28332
+ }
28333
+
28334
+ // src/beads/provision-lock.ts
28335
+ var STALE_LOCK_MS = 5 * 6e4;
28310
28336
  function tryAcquire(lockDir, deps) {
28311
28337
  const pid = deps.pid ?? process.pid;
28312
28338
  try {
28313
- import_fs7.default.mkdirSync(import_path9.default.dirname(lockDir), { recursive: true });
28314
- import_fs7.default.mkdirSync(lockDir);
28315
- import_fs7.default.writeFileSync(import_path9.default.join(lockDir, "pid"), String(pid));
28339
+ import_fs8.default.mkdirSync(import_path9.default.dirname(lockDir), { recursive: true });
28340
+ import_fs8.default.mkdirSync(lockDir);
28341
+ import_fs8.default.writeFileSync(import_path9.default.join(lockDir, "pid"), ownerRecord(pid, deps));
28316
28342
  return true;
28317
28343
  } catch (err) {
28318
28344
  if (err.code !== "EEXIST") return true;
28319
28345
  }
28320
28346
  let age;
28321
28347
  try {
28322
- age = (deps.now ?? Date.now)() - import_fs7.default.statSync(lockDir).mtimeMs;
28348
+ age = (deps.now ?? Date.now)() - import_fs8.default.statSync(lockDir).mtimeMs;
28323
28349
  } catch {
28324
28350
  return tryAcquireOnce(lockDir, deps);
28325
28351
  }
28326
- let holder = NaN;
28352
+ let holder = "";
28327
28353
  try {
28328
- holder = Number(import_fs7.default.readFileSync(import_path9.default.join(lockDir, "pid"), "utf8"));
28354
+ holder = import_fs8.default.readFileSync(import_path9.default.join(lockDir, "pid"), "utf8");
28329
28355
  } catch {
28330
28356
  if (age <= 1e4) return false;
28331
28357
  }
28332
- const alive = Number.isInteger(holder) && (deps.isAlive ?? pidIsAlive)(holder);
28358
+ const alive = holder !== "" && ownerIsAlive(holder, deps);
28333
28359
  if (alive && age <= STALE_LOCK_MS) return false;
28334
28360
  try {
28335
- import_fs7.default.rmSync(lockDir, { recursive: true, force: true });
28361
+ import_fs8.default.rmSync(lockDir, { recursive: true, force: true });
28336
28362
  } catch {
28337
28363
  return false;
28338
28364
  }
@@ -28340,8 +28366,8 @@ function tryAcquire(lockDir, deps) {
28340
28366
  }
28341
28367
  function tryAcquireOnce(lockDir, deps) {
28342
28368
  try {
28343
- import_fs7.default.mkdirSync(lockDir);
28344
- import_fs7.default.writeFileSync(import_path9.default.join(lockDir, "pid"), String(deps.pid ?? process.pid));
28369
+ import_fs8.default.mkdirSync(lockDir);
28370
+ import_fs8.default.writeFileSync(import_path9.default.join(lockDir, "pid"), ownerRecord(deps.pid ?? process.pid, deps));
28345
28371
  return true;
28346
28372
  } catch {
28347
28373
  return false;
@@ -28362,8 +28388,8 @@ async function withBeadsProvisionLock(fn, deps = {}) {
28362
28388
  } finally {
28363
28389
  if (held) {
28364
28390
  try {
28365
- const owner = Number(import_fs7.default.readFileSync(import_path9.default.join(lockDir, "pid"), "utf8"));
28366
- if (owner === (deps.pid ?? process.pid)) import_fs7.default.rmSync(lockDir, { recursive: true, force: true });
28391
+ const owner = Number(import_fs8.default.readFileSync(import_path9.default.join(lockDir, "pid"), "utf8").trim().split(/\s+/)[0]);
28392
+ if (owner === (deps.pid ?? process.pid)) import_fs8.default.rmSync(lockDir, { recursive: true, force: true });
28367
28393
  } catch {
28368
28394
  }
28369
28395
  }
@@ -28639,7 +28665,7 @@ function saveFilesTemp(files) {
28639
28665
  return files.filter(({ base64 }) => base64 && base64.length > 0).map(({ filename, base64 }) => {
28640
28666
  const safeName = filename.replace(/[^a-zA-Z0-9._-]/g, "_").slice(0, 80);
28641
28667
  const tmpPath = path73.join(os47.tmpdir(), `codeam-${(0, import_crypto3.randomUUID)()}-${safeName}`);
28642
- fs64.writeFileSync(tmpPath, Buffer.from(base64, "base64"));
28668
+ fs65.writeFileSync(tmpPath, Buffer.from(base64, "base64"));
28643
28669
  pendingAttachmentFiles.add(tmpPath);
28644
28670
  return tmpPath;
28645
28671
  });
@@ -28887,7 +28913,7 @@ var envReadH = async (ctx, cmd) => {
28887
28913
  const envPath = path73.join(process.cwd(), ".env");
28888
28914
  await restoreProjectEnvIfMissing(process.cwd(), ctx);
28889
28915
  try {
28890
- const raw = await fs64.promises.readFile(envPath, "utf8");
28916
+ const raw = await fs65.promises.readFile(envPath, "utf8");
28891
28917
  await ctx.relay.sendResult(cmd.id, "completed", {
28892
28918
  exists: true,
28893
28919
  vars: parseDotenv(raw)
@@ -28916,7 +28942,7 @@ var envParseH = async (ctx, cmd, parsed) => {
28916
28942
  const existing = /* @__PURE__ */ new Map();
28917
28943
  if (!replace) {
28918
28944
  try {
28919
- const raw = await fs64.promises.readFile(path73.join(process.cwd(), ".env"), "utf8");
28945
+ const raw = await fs65.promises.readFile(path73.join(process.cwd(), ".env"), "utf8");
28920
28946
  for (const v of parseDotenv(raw)) existing.set(v.key, v.value);
28921
28947
  } catch {
28922
28948
  }
@@ -28959,12 +28985,12 @@ var envWriteH = async (ctx, cmd, parsed) => {
28959
28985
  const envPath = path73.join(process.cwd(), ".env");
28960
28986
  const tmpPath = path73.join(process.cwd(), ".env.codeam.tmp");
28961
28987
  try {
28962
- await fs64.promises.writeFile(tmpPath, serializeDotenv(vars), "utf8");
28963
- await fs64.promises.rename(tmpPath, envPath);
28988
+ await fs65.promises.writeFile(tmpPath, serializeDotenv(vars), "utf8");
28989
+ await fs65.promises.rename(tmpPath, envPath);
28964
28990
  await ctx.relay.sendResult(cmd.id, "completed", { ok: true, count: vars.length });
28965
28991
  void syncProjectEnvUp(process.cwd(), ctx);
28966
28992
  } catch (err) {
28967
- await fs64.promises.rm(tmpPath, { force: true }).catch(() => void 0);
28993
+ await fs65.promises.rm(tmpPath, { force: true }).catch(() => void 0);
28968
28994
  await ctx.relay.sendResult(cmd.id, "failed", { error: err.message });
28969
28995
  }
28970
28996
  };
@@ -29313,7 +29339,7 @@ var CLI_UPDATE_MAX_ATTEMPTS = 3;
29313
29339
  function buildNpmInstallInvocation(opts) {
29314
29340
  const entryScript = opts?.entryScript ?? process.argv[1] ?? "";
29315
29341
  const execPath = opts?.execPath ?? process.execPath;
29316
- const exists2 = opts?.existsSync ?? fs64.existsSync;
29342
+ const exists2 = opts?.existsSync ?? fs65.existsSync;
29317
29343
  const platform3 = opts?.platform ?? process.platform;
29318
29344
  const p2 = platform3 === "win32" ? path73.win32 : path73.posix;
29319
29345
  const normalized = entryScript.split(/[\\/]/).join("/");
@@ -29344,9 +29370,9 @@ function resolveGlobalNodeModulesDir(opts) {
29344
29370
  var STALE_STAGING_AGE_MS = CLI_UPDATE_INSTALL_TIMEOUT_MS;
29345
29371
  function sweepStaleCliStagingDirs(nodeModulesDir, now = Date.now(), deps) {
29346
29372
  if (!nodeModulesDir) return 0;
29347
- const readdirSync18 = deps?.readdirSync ?? fs64.readdirSync;
29348
- const statSync17 = deps?.statSync ?? fs64.statSync;
29349
- const rmSync14 = deps?.rmSync ?? fs64.rmSync;
29373
+ const readdirSync18 = deps?.readdirSync ?? fs65.readdirSync;
29374
+ const statSync17 = deps?.statSync ?? fs65.statSync;
29375
+ const rmSync14 = deps?.rmSync ?? fs65.rmSync;
29350
29376
  let removed = 0;
29351
29377
  let entries2;
29352
29378
  try {
@@ -30481,7 +30507,7 @@ function resolveTokenValue(args2) {
30481
30507
  if (fileFlag) {
30482
30508
  const path114 = fileFlag.slice("--token-file=".length);
30483
30509
  try {
30484
- const content = fs65.readFileSync(path114, "utf8").trim();
30510
+ const content = fs66.readFileSync(path114, "utf8").trim();
30485
30511
  if (content.length === 0) fail(`--token-file ${path114} is empty`);
30486
30512
  rmIfExistsQuiet(path114);
30487
30513
  return content;
@@ -30580,7 +30606,7 @@ function pairAutoLockPath() {
30580
30606
  var procRoot = "/proc";
30581
30607
  function readProcFile(rel) {
30582
30608
  try {
30583
- return fs65.readFileSync(path74.join(procRoot, rel), "utf8");
30609
+ return fs66.readFileSync(path74.join(procRoot, rel), "utf8");
30584
30610
  } catch {
30585
30611
  return void 0;
30586
30612
  }
@@ -30601,7 +30627,7 @@ function currentBootId() {
30601
30627
  function readLockRecord(lockPath) {
30602
30628
  let raw;
30603
30629
  try {
30604
- raw = fs65.readFileSync(lockPath, "utf8");
30630
+ raw = fs66.readFileSync(lockPath, "utf8");
30605
30631
  } catch {
30606
30632
  return void 0;
30607
30633
  }
@@ -30650,7 +30676,7 @@ function isLiveLockHolder(rec) {
30650
30676
  }
30651
30677
  function releaseOwnLock(lockPath) {
30652
30678
  try {
30653
- if (readLockRecord(lockPath)?.pid === process.pid) fs65.unlinkSync(lockPath);
30679
+ if (readLockRecord(lockPath)?.pid === process.pid) fs66.unlinkSync(lockPath);
30654
30680
  } catch {
30655
30681
  }
30656
30682
  }
@@ -30674,7 +30700,7 @@ function snapshotProcessTree(root) {
30674
30700
  const children = /* @__PURE__ */ new Map();
30675
30701
  let entries2 = [];
30676
30702
  try {
30677
- entries2 = fs65.readdirSync(procRoot).filter((e) => /^\d+$/.test(e));
30703
+ entries2 = fs66.readdirSync(procRoot).filter((e) => /^\d+$/.test(e));
30678
30704
  } catch {
30679
30705
  }
30680
30706
  for (const e of entries2) {
@@ -30714,13 +30740,13 @@ function daemonLockPath(sessionId) {
30714
30740
  function acquireDaemonLock(sessionId) {
30715
30741
  const lockPath = daemonLockPath(sessionId);
30716
30742
  try {
30717
- fs65.mkdirSync(path74.dirname(lockPath), { recursive: true });
30743
+ fs66.mkdirSync(path74.dirname(lockPath), { recursive: true });
30718
30744
  try {
30719
- fs65.writeFileSync(lockPath, ownLockBody(), { flag: "wx" });
30745
+ fs66.writeFileSync(lockPath, ownLockBody(), { flag: "wx" });
30720
30746
  } catch (e) {
30721
30747
  if (e.code !== "EEXIST") throw e;
30722
30748
  if (isLiveLockHolder(readLockRecord(lockPath))) return false;
30723
- fs65.writeFileSync(lockPath, ownLockBody());
30749
+ fs66.writeFileSync(lockPath, ownLockBody());
30724
30750
  }
30725
30751
  const release3 = () => releaseOwnLock(lockPath);
30726
30752
  process.once("exit", release3);
@@ -30740,13 +30766,13 @@ function acquireDaemonLock(sessionId) {
30740
30766
  function acquireSingletonLock() {
30741
30767
  const lockPath = pairAutoLockPath();
30742
30768
  try {
30743
- fs65.mkdirSync(path74.dirname(lockPath), { recursive: true });
30769
+ fs66.mkdirSync(path74.dirname(lockPath), { recursive: true });
30744
30770
  try {
30745
- fs65.writeFileSync(lockPath, ownLockBody(), { flag: "wx" });
30771
+ fs66.writeFileSync(lockPath, ownLockBody(), { flag: "wx" });
30746
30772
  } catch (e) {
30747
30773
  if (e.code !== "EEXIST") throw e;
30748
30774
  if (isLiveLockHolder(readLockRecord(lockPath))) return false;
30749
- fs65.writeFileSync(lockPath, ownLockBody());
30775
+ fs66.writeFileSync(lockPath, ownLockBody());
30750
30776
  }
30751
30777
  process.once("exit", () => releaseOwnLock(lockPath));
30752
30778
  return true;
@@ -31469,26 +31495,19 @@ async function resolveAcpAdapterWithRetry(agent, opts = {}) {
31469
31495
  }
31470
31496
 
31471
31497
  // src/commands/start/agent-startup-marks.ts
31472
- var import_fs8 = __toESM(require("fs"));
31498
+ var import_fs9 = __toESM(require("fs"));
31473
31499
  var import_os13 = __toESM(require("os"));
31474
31500
  var import_path10 = __toESM(require("path"));
31475
31501
  var STALE_MARK_MS = 18e4;
31476
31502
  function marksDir(deps) {
31477
31503
  return deps.dir ?? import_path10.default.join(import_os13.default.homedir(), ".codeam", "agent-startups");
31478
31504
  }
31479
- function pidIsAlive2(pid) {
31480
- try {
31481
- process.kill(pid, 0);
31482
- return true;
31483
- } catch (err) {
31484
- return err.code === "EPERM";
31485
- }
31486
- }
31487
31505
  function markAgentStarting(deps = {}) {
31488
- const file = import_path10.default.join(marksDir(deps), String(deps.pid ?? process.pid));
31506
+ const pid = deps.pid ?? process.pid;
31507
+ const file = import_path10.default.join(marksDir(deps), String(pid));
31489
31508
  try {
31490
- import_fs8.default.mkdirSync(import_path10.default.dirname(file), { recursive: true });
31491
- import_fs8.default.writeFileSync(file, "");
31509
+ import_fs9.default.mkdirSync(import_path10.default.dirname(file), { recursive: true });
31510
+ import_fs9.default.writeFileSync(file, ownerRecord(pid, deps));
31492
31511
  } catch {
31493
31512
  return () => void 0;
31494
31513
  }
@@ -31497,7 +31516,7 @@ function markAgentStarting(deps = {}) {
31497
31516
  if (released) return;
31498
31517
  released = true;
31499
31518
  try {
31500
- import_fs8.default.rmSync(file, { force: true });
31519
+ import_fs9.default.rmSync(file, { force: true });
31501
31520
  } catch {
31502
31521
  }
31503
31522
  };
@@ -31506,10 +31525,9 @@ function otherAgentsStarting(deps = {}) {
31506
31525
  const dir = marksDir(deps);
31507
31526
  const self = deps.pid ?? process.pid;
31508
31527
  const now = (deps.now ?? Date.now)();
31509
- const isAlive = deps.isAlive ?? pidIsAlive2;
31510
31528
  let names;
31511
31529
  try {
31512
- names = import_fs8.default.readdirSync(dir);
31530
+ names = import_fs9.default.readdirSync(dir);
31513
31531
  } catch {
31514
31532
  return [];
31515
31533
  }
@@ -31518,17 +31536,23 @@ function otherAgentsStarting(deps = {}) {
31518
31536
  const pid = Number(name);
31519
31537
  if (!Number.isInteger(pid) || pid <= 0 || pid === self) continue;
31520
31538
  const file = import_path10.default.join(dir, name);
31521
- let stale = !isAlive(pid);
31539
+ let record2 = "";
31540
+ try {
31541
+ record2 = import_fs9.default.readFileSync(file, "utf8");
31542
+ } catch {
31543
+ continue;
31544
+ }
31545
+ let stale = !ownerIsAlive(record2.trim() || String(pid), deps);
31522
31546
  if (!stale) {
31523
31547
  try {
31524
- stale = now - import_fs8.default.statSync(file).mtimeMs > STALE_MARK_MS;
31548
+ stale = now - import_fs9.default.statSync(file).mtimeMs > STALE_MARK_MS;
31525
31549
  } catch {
31526
31550
  continue;
31527
31551
  }
31528
31552
  }
31529
31553
  if (stale) {
31530
31554
  try {
31531
- import_fs8.default.rmSync(file, { force: true });
31555
+ import_fs9.default.rmSync(file, { force: true });
31532
31556
  } catch {
31533
31557
  }
31534
31558
  continue;
@@ -31548,7 +31572,7 @@ async function waitForNoAgentStarting(opts) {
31548
31572
 
31549
31573
  // src/agents/acp/runner.ts
31550
31574
  var import_node_crypto15 = require("crypto");
31551
- var fs85 = __toESM(require("fs"));
31575
+ var fs86 = __toESM(require("fs"));
31552
31576
  var os61 = __toESM(require("os"));
31553
31577
  var path96 = __toESM(require("path"));
31554
31578
 
@@ -31582,7 +31606,7 @@ function noteProviderBillingSignal(opts) {
31582
31606
  }
31583
31607
 
31584
31608
  // src/services/history.service.ts
31585
- var fs67 = __toESM(require("fs"));
31609
+ var fs68 = __toESM(require("fs"));
31586
31610
  var path77 = __toESM(require("path"));
31587
31611
  var https6 = __toESM(require("https"));
31588
31612
  var http10 = __toESM(require("http"));
@@ -31644,7 +31668,7 @@ function parseJsonl(filePath) {
31644
31668
  const messages = [];
31645
31669
  let raw;
31646
31670
  try {
31647
- raw = fs67.readFileSync(filePath, "utf8");
31671
+ raw = fs68.readFileSync(filePath, "utf8");
31648
31672
  } catch (err) {
31649
31673
  if (err.code !== "ENOENT") {
31650
31674
  log.warn("history:parseJsonl", `read failed for ${filePath}`, err);
@@ -31854,11 +31878,11 @@ var HistoryService = class _HistoryService {
31854
31878
  const cutoff = this.bootTimeMs - _HistoryService.BIRTHTIME_GRACE_MS;
31855
31879
  const oneShots = readOneShotConversations(this.cwd);
31856
31880
  try {
31857
- const files = fs67.readdirSync(dir, { withFileTypes: true }).filter(
31881
+ const files = fs68.readdirSync(dir, { withFileTypes: true }).filter(
31858
31882
  (e) => e.isFile() && e.name.endsWith(".jsonl") && !oneShots.has(path77.basename(e.name, ".jsonl"))
31859
31883
  ).map((e) => {
31860
31884
  try {
31861
- const stat3 = fs67.statSync(path77.join(dir, e.name));
31885
+ const stat3 = fs68.statSync(path77.join(dir, e.name));
31862
31886
  return { name: e.name, mtime: stat3.mtimeMs, birthtime: stat3.birthtimeMs };
31863
31887
  } catch {
31864
31888
  return { name: e.name, mtime: 0, birthtime: 0 };
@@ -31899,13 +31923,13 @@ var HistoryService = class _HistoryService {
31899
31923
  const cutoff = this.bootTimeMs - _HistoryService.BIRTHTIME_GRACE_MS;
31900
31924
  let entries2;
31901
31925
  try {
31902
- entries2 = fs67.readdirSync(dir, { withFileTypes: true });
31926
+ entries2 = fs68.readdirSync(dir, { withFileTypes: true });
31903
31927
  } catch {
31904
31928
  return null;
31905
31929
  }
31906
31930
  const files = entries2.filter((e) => e.isFile() && e.name.endsWith(".jsonl")).map((e) => {
31907
31931
  try {
31908
- const stat3 = fs67.statSync(path77.join(dir, e.name));
31932
+ const stat3 = fs68.statSync(path77.join(dir, e.name));
31909
31933
  return { name: e.name, mtime: stat3.mtimeMs, birthtime: stat3.birthtimeMs };
31910
31934
  } catch {
31911
31935
  return { name: e.name, mtime: 0, birthtime: 0 };
@@ -31919,7 +31943,7 @@ var HistoryService = class _HistoryService {
31919
31943
  extractUsageFromFile(filePath) {
31920
31944
  let raw;
31921
31945
  try {
31922
- raw = fs67.readFileSync(filePath, "utf8");
31946
+ raw = fs68.readFileSync(filePath, "utf8");
31923
31947
  } catch {
31924
31948
  return null;
31925
31949
  }
@@ -31971,9 +31995,9 @@ var HistoryService = class _HistoryService {
31971
31995
  let totalCost = 0;
31972
31996
  let files;
31973
31997
  try {
31974
- files = fs67.readdirSync(projectDir).filter((f) => f.endsWith(".jsonl")).filter((f) => {
31998
+ files = fs68.readdirSync(projectDir).filter((f) => f.endsWith(".jsonl")).filter((f) => {
31975
31999
  try {
31976
- return fs67.statSync(path77.join(projectDir, f)).mtimeMs >= monthStartMs;
32000
+ return fs68.statSync(path77.join(projectDir, f)).mtimeMs >= monthStartMs;
31977
32001
  } catch {
31978
32002
  return false;
31979
32003
  }
@@ -31984,7 +32008,7 @@ var HistoryService = class _HistoryService {
31984
32008
  for (const file of files) {
31985
32009
  let raw;
31986
32010
  try {
31987
- raw = fs67.readFileSync(path77.join(projectDir, file), "utf8");
32011
+ raw = fs68.readFileSync(path77.join(projectDir, file), "utf8");
31988
32012
  } catch {
31989
32013
  continue;
31990
32014
  }
@@ -32183,7 +32207,7 @@ var HistoryService = class _HistoryService {
32183
32207
  if (!filePath) return false;
32184
32208
  let mtimeMs;
32185
32209
  try {
32186
- mtimeMs = fs67.statSync(filePath).mtimeMs;
32210
+ mtimeMs = fs68.statSync(filePath).mtimeMs;
32187
32211
  } catch {
32188
32212
  return false;
32189
32213
  }
@@ -32258,7 +32282,7 @@ var HistoryService = class _HistoryService {
32258
32282
 
32259
32283
  // src/agents/acp/client.ts
32260
32284
  var import_node_child_process27 = require("child_process");
32261
- var fs68 = __toESM(require("fs/promises"));
32285
+ var fs69 = __toESM(require("fs/promises"));
32262
32286
  var fsSync = __toESM(require("fs"));
32263
32287
  var os51 = __toESM(require("os"));
32264
32288
  var path79 = __toESM(require("path"));
@@ -37402,7 +37426,7 @@ var AcpClient = class {
37402
37426
  throw new RequestError(-32002, GUARDRAIL_SECRET_READ_BLOCK_REASON, { uri: params.path });
37403
37427
  }
37404
37428
  try {
37405
- const content = await fs68.readFile(params.path, "utf8");
37429
+ const content = await fs69.readFile(params.path, "utf8");
37406
37430
  return applyLineRange(content, params.line ?? null, params.limit ?? null);
37407
37431
  } catch (err) {
37408
37432
  const code = err.code;
@@ -37423,7 +37447,7 @@ var AcpClient = class {
37423
37447
  throw new RequestError(-32002, INTERNAL_BLOCK_REASON, { uri: params.path });
37424
37448
  }
37425
37449
  try {
37426
- await fs68.writeFile(params.path, params.content, "utf8");
37450
+ await fs69.writeFile(params.path, params.content, "utf8");
37427
37451
  return {};
37428
37452
  } catch (err) {
37429
37453
  const code = err.code;
@@ -37826,7 +37850,7 @@ async function performAgentSwitch(deps, rawAgentId, fastPath = {}) {
37826
37850
  }
37827
37851
 
37828
37852
  // src/commands/host/agent-provisioning.ts
37829
- var fs69 = __toESM(require("fs"));
37853
+ var fs70 = __toESM(require("fs"));
37830
37854
  var os53 = __toESM(require("os"));
37831
37855
  var path80 = __toESM(require("path"));
37832
37856
  var PUBLIC_TO_INTERNAL_AGENT = {
@@ -37845,16 +37869,16 @@ function toInternalAgentId(publicAgentId) {
37845
37869
  return PUBLIC_TO_INTERNAL_AGENT[publicAgentId] ?? null;
37846
37870
  }
37847
37871
  function ensureDir(dir) {
37848
- fs69.mkdirSync(dir, { recursive: true, mode: 448 });
37872
+ fs70.mkdirSync(dir, { recursive: true, mode: 448 });
37849
37873
  }
37850
37874
  function writeFile0600(filePath, contents) {
37851
37875
  ensureDir(path80.dirname(filePath));
37852
- fs69.writeFileSync(filePath, contents, { encoding: "utf8", mode: 384 });
37876
+ fs70.writeFileSync(filePath, contents, { encoding: "utf8", mode: 384 });
37853
37877
  restrictToOwner(filePath);
37854
37878
  }
37855
37879
  function rmIfExists(filePath) {
37856
37880
  try {
37857
- fs69.rmSync(filePath, { force: true });
37881
+ fs70.rmSync(filePath, { force: true });
37858
37882
  } catch {
37859
37883
  }
37860
37884
  }
@@ -37873,7 +37897,7 @@ var claudeProvisioner = {
37873
37897
  rmIfExists(credentialsJson);
37874
37898
  }
37875
37899
  const claudeJson = path80.join(home, ".claude.json");
37876
- if (!fs69.existsSync(claudeJson)) {
37900
+ if (!fs70.existsSync(claudeJson)) {
37877
37901
  writeFile0600(
37878
37902
  claudeJson,
37879
37903
  JSON.stringify({ hasCompletedOnboarding: true, customApiKeyResponses: { approved: [] } })
@@ -37907,7 +37931,7 @@ function codexLoginStamp(raw) {
37907
37931
  function keepsFresherCodexLogin(authJsonPath, incoming) {
37908
37932
  let onDisk;
37909
37933
  try {
37910
- onDisk = fs69.readFileSync(authJsonPath, "utf8");
37934
+ onDisk = fs70.readFileSync(authJsonPath, "utf8");
37911
37935
  } catch {
37912
37936
  return false;
37913
37937
  }
@@ -38044,7 +38068,7 @@ function provisionAgentCredentials(publicAgentId, auth, homeDir2 = os53.homedir(
38044
38068
  }
38045
38069
 
38046
38070
  // src/beads/workflow-hint.ts
38047
- var fs70 = __toESM(require("fs"));
38071
+ var fs71 = __toESM(require("fs"));
38048
38072
  var path81 = __toESM(require("path"));
38049
38073
  var BEADS_HINT_MARKER = "<!-- codeam:beads-workflow -->";
38050
38074
  var BEADS_HINT = `${BEADS_HINT_MARKER}
@@ -38072,11 +38096,11 @@ function ensureBeadsWorkflowHint(homeDir2, file = claudeMemoryFile(homeDir2)) {
38072
38096
  try {
38073
38097
  let existing = "";
38074
38098
  try {
38075
- existing = fs70.readFileSync(file, "utf8");
38099
+ existing = fs71.readFileSync(file, "utf8");
38076
38100
  } catch {
38077
38101
  }
38078
38102
  if (existing.includes(BEADS_HINT)) return;
38079
- fs70.mkdirSync(path81.dirname(file), { recursive: true });
38103
+ fs71.mkdirSync(path81.dirname(file), { recursive: true });
38080
38104
  let next;
38081
38105
  const open = existing.indexOf(BEADS_HINT_MARKER);
38082
38106
  const close = open === -1 ? -1 : existing.indexOf(BEADS_HINT_MARKER, open + BEADS_HINT_MARKER.length);
@@ -38089,40 +38113,40 @@ ${BEADS_HINT}
38089
38113
  ` : `${BEADS_HINT}
38090
38114
  `;
38091
38115
  }
38092
- fs70.writeFileSync(file, next);
38116
+ fs71.writeFileSync(file, next);
38093
38117
  } catch {
38094
38118
  }
38095
38119
  }
38096
38120
 
38097
38121
  // src/agents/agent-standard.ts
38098
- var fs71 = __toESM(require("fs"));
38122
+ var fs72 = __toESM(require("fs"));
38099
38123
  var path82 = __toESM(require("path"));
38100
38124
  var os54 = __toESM(require("os"));
38101
38125
  function ensureAgentStandard(homeDir2, file = claudeMemoryFile(homeDir2)) {
38102
38126
  try {
38103
38127
  let existing = "";
38104
38128
  try {
38105
- existing = fs71.readFileSync(file, "utf8");
38129
+ existing = fs72.readFileSync(file, "utf8");
38106
38130
  } catch {
38107
38131
  }
38108
38132
  if (existing.includes(AGENT_STANDARD_MARKER)) return;
38109
- fs71.mkdirSync(path82.dirname(file), { recursive: true });
38133
+ fs72.mkdirSync(path82.dirname(file), { recursive: true });
38110
38134
  const next = existing.trim() ? `${existing.trimEnd()}
38111
38135
 
38112
38136
  ${AGENT_STANDARD_BLOCK}
38113
38137
  ` : `${AGENT_STANDARD_BLOCK}
38114
38138
  `;
38115
- fs71.writeFileSync(file, next);
38139
+ fs72.writeFileSync(file, next);
38116
38140
  } catch {
38117
38141
  }
38118
38142
  }
38119
38143
  var _agentStandardSeam = {
38120
38144
  isLocalSession: () => isLocalSession(),
38121
38145
  markerPath: (sessionId) => path82.join(os54.homedir(), ".codeam", "agent-standard", `${sessionId}.done`),
38122
- exists: (p2) => fs71.existsSync(p2),
38146
+ exists: (p2) => fs72.existsSync(p2),
38123
38147
  write: (p2) => {
38124
- fs71.mkdirSync(path82.dirname(p2), { recursive: true });
38125
- fs71.writeFileSync(p2, "");
38148
+ fs72.mkdirSync(path82.dirname(p2), { recursive: true });
38149
+ fs72.writeFileSync(p2, "");
38126
38150
  }
38127
38151
  };
38128
38152
  function isClaude(agent) {
@@ -38857,15 +38881,15 @@ function withholdTrailingPartialFenceMarker(text) {
38857
38881
 
38858
38882
  // src/agents/acp/onboarding.ts
38859
38883
  var import_child_process28 = require("child_process");
38860
- var fs73 = __toESM(require("fs"));
38884
+ var fs74 = __toESM(require("fs"));
38861
38885
  var os55 = __toESM(require("os"));
38862
38886
  var path84 = __toESM(require("path"));
38863
38887
  var _onboardingSeam = {
38864
38888
  markerPath: (sessionId) => path84.join(os55.homedir(), ".codeam", "welcomed", `${sessionId}.done`),
38865
- exists: (p2) => fs73.existsSync(p2),
38889
+ exists: (p2) => fs74.existsSync(p2),
38866
38890
  write: (p2) => {
38867
- fs73.mkdirSync(path84.dirname(p2), { recursive: true });
38868
- fs73.writeFileSync(p2, "");
38891
+ fs74.mkdirSync(path84.dirname(p2), { recursive: true });
38892
+ fs74.writeFileSync(p2, "");
38869
38893
  },
38870
38894
  disabled: () => {
38871
38895
  const v = process.env.CODEAM_ONBOARDING_DISABLED;
@@ -39294,13 +39318,13 @@ var import_crypto5 = require("crypto");
39294
39318
 
39295
39319
  // src/services/turn-files/git-changeset.ts
39296
39320
  var import_child_process29 = require("child_process");
39297
- var fs75 = __toESM(require("fs/promises"));
39298
- var import_fs9 = require("fs");
39321
+ var fs76 = __toESM(require("fs/promises"));
39322
+ var import_fs10 = require("fs");
39299
39323
  var path86 = __toESM(require("path"));
39300
39324
 
39301
39325
  // src/services/turn-files/review-ignore.ts
39302
39326
  var import_ignore2 = __toESM(require("ignore"));
39303
- var fs74 = __toESM(require("fs"));
39327
+ var fs75 = __toESM(require("fs"));
39304
39328
  var path85 = __toESM(require("path"));
39305
39329
  var CURATED_REVIEW_IGNORE = [
39306
39330
  // Google Cloud SDK (the incident) — installs a huge python tree.
@@ -39345,7 +39369,7 @@ var CURATED_REVIEW_IGNORE = [
39345
39369
  function makeReviewIgnore(repoRoot) {
39346
39370
  const ig = (0, import_ignore2.default)().add(CURATED_REVIEW_IGNORE);
39347
39371
  try {
39348
- const custom = fs74.readFileSync(path85.join(repoRoot, ".codeam", "reviewignore"), "utf8");
39372
+ const custom = fs75.readFileSync(path85.join(repoRoot, ".codeam", "reviewignore"), "utf8");
39349
39373
  ig.add(custom);
39350
39374
  } catch {
39351
39375
  }
@@ -39428,7 +39452,7 @@ function readUntrackedLineCount(absPath) {
39428
39452
  }
39429
39453
  async function defaultReadUntrackedLineCount(absPath) {
39430
39454
  try {
39431
- const content = await fs75.readFile(absPath, "utf8");
39455
+ const content = await fs76.readFile(absPath, "utf8");
39432
39456
  let count = 0;
39433
39457
  let pos = -1;
39434
39458
  while ((pos = content.indexOf("\n", pos + 1)) !== -1) {
@@ -39520,7 +39544,7 @@ function defaultRunGit(cwd, args2) {
39520
39544
  });
39521
39545
  }
39522
39546
  async function discoverRepos(workingDir, maxDepth = 4) {
39523
- const fs99 = await import("fs/promises");
39547
+ const fs100 = await import("fs/promises");
39524
39548
  const out2 = [];
39525
39549
  await walk2(workingDir, 0);
39526
39550
  return out2;
@@ -39528,7 +39552,7 @@ async function discoverRepos(workingDir, maxDepth = 4) {
39528
39552
  if (depth2 > maxDepth) return;
39529
39553
  let entries2 = [];
39530
39554
  try {
39531
- const dirents = await fs99.readdir(dir, { withFileTypes: true });
39555
+ const dirents = await fs100.readdir(dir, { withFileTypes: true });
39532
39556
  entries2 = dirents.filter((d3) => !d3.name.startsWith(".") || d3.name === ".git").map((d3) => ({ name: d3.name, isDirectory: d3.isDirectory() }));
39533
39557
  } catch {
39534
39558
  return;
@@ -39554,7 +39578,7 @@ async function discoverRepos(workingDir, maxDepth = 4) {
39554
39578
  }
39555
39579
  function isReviewablePath(absPath) {
39556
39580
  try {
39557
- const st3 = (0, import_fs9.lstatSync)(absPath);
39581
+ const st3 = (0, import_fs10.lstatSync)(absPath);
39558
39582
  return st3.isFile() || st3.isSymbolicLink();
39559
39583
  } catch {
39560
39584
  return true;
@@ -39562,7 +39586,7 @@ function isReviewablePath(absPath) {
39562
39586
  }
39563
39587
 
39564
39588
  // src/services/turn-files/files-outbox.ts
39565
- var fs76 = __toESM(require("fs/promises"));
39589
+ var fs77 = __toESM(require("fs/promises"));
39566
39590
  var path87 = __toESM(require("path"));
39567
39591
  var import_os14 = require("os");
39568
39592
  var HOME_OUTBOX_DIR = ".codeam/outbox";
@@ -39604,8 +39628,8 @@ var FilesOutbox = class {
39604
39628
  /** Persist the entry to disk and trigger a flush. Returns once the
39605
39629
  * line is durable on disk (not once the POST succeeds). */
39606
39630
  async enqueue(entry) {
39607
- await fs76.mkdir(path87.dirname(this.filePath), { recursive: true });
39608
- await fs76.appendFile(this.filePath, JSON.stringify(entry) + "\n", "utf8");
39631
+ await fs77.mkdir(path87.dirname(this.filePath), { recursive: true });
39632
+ await fs77.appendFile(this.filePath, JSON.stringify(entry) + "\n", "utf8");
39609
39633
  this.backoffIndex = 0;
39610
39634
  if (this.autoSchedule) this.scheduleFlush(0);
39611
39635
  }
@@ -39696,7 +39720,7 @@ var FilesOutbox = class {
39696
39720
  async readAll() {
39697
39721
  let raw = "";
39698
39722
  try {
39699
- raw = await fs76.readFile(this.filePath, "utf8");
39723
+ raw = await fs77.readFile(this.filePath, "utf8");
39700
39724
  } catch {
39701
39725
  return [];
39702
39726
  }
@@ -39720,12 +39744,12 @@ var FilesOutbox = class {
39720
39744
  async rewrite(entries2) {
39721
39745
  const tmpPath = `${this.filePath}.${process.pid}.tmp`;
39722
39746
  if (entries2.length === 0) {
39723
- await fs76.unlink(this.filePath).catch(() => void 0);
39747
+ await fs77.unlink(this.filePath).catch(() => void 0);
39724
39748
  return;
39725
39749
  }
39726
39750
  const payload = entries2.map((e) => JSON.stringify(e)).join("\n") + "\n";
39727
- await fs76.writeFile(tmpPath, payload, "utf8");
39728
- await fs76.rename(tmpPath, this.filePath);
39751
+ await fs77.writeFile(tmpPath, payload, "utf8");
39752
+ await fs77.rename(tmpPath, this.filePath);
39729
39753
  }
39730
39754
  };
39731
39755
  function applyJitter(ms) {
@@ -40073,7 +40097,7 @@ async function readActiveConversationMarker(cwd, homeDir2) {
40073
40097
  }
40074
40098
 
40075
40099
  // src/services/turn-marker.ts
40076
- var fs78 = __toESM(require("fs"));
40100
+ var fs79 = __toESM(require("fs"));
40077
40101
  var os57 = __toESM(require("os"));
40078
40102
  var path89 = __toESM(require("path"));
40079
40103
  var depth = 0;
@@ -40086,14 +40110,14 @@ function turnMarkerPath(pid = process.pid, home = codeamHome()) {
40086
40110
  function mark() {
40087
40111
  try {
40088
40112
  const file = turnMarkerPath();
40089
- fs78.mkdirSync(path89.dirname(file), { recursive: true });
40090
- fs78.writeFileSync(file, String(Date.now()));
40113
+ fs79.mkdirSync(path89.dirname(file), { recursive: true });
40114
+ fs79.writeFileSync(file, String(Date.now()));
40091
40115
  } catch {
40092
40116
  }
40093
40117
  }
40094
40118
  function clear() {
40095
40119
  try {
40096
- fs78.rmSync(turnMarkerPath(), { force: true });
40120
+ fs79.rmSync(turnMarkerPath(), { force: true });
40097
40121
  } catch {
40098
40122
  }
40099
40123
  }
@@ -40108,7 +40132,7 @@ async function withTurnMarker(fn) {
40108
40132
  function isProcessMidTurn(pid, home) {
40109
40133
  if (!pid) return false;
40110
40134
  try {
40111
- return fs78.existsSync(turnMarkerPath(pid, home));
40135
+ return fs79.existsSync(turnMarkerPath(pid, home));
40112
40136
  } catch {
40113
40137
  return false;
40114
40138
  }
@@ -40116,7 +40140,7 @@ function isProcessMidTurn(pid, home) {
40116
40140
 
40117
40141
  // src/packs/gates.ts
40118
40142
  var import_node_child_process28 = require("child_process");
40119
- var fs79 = __toESM(require("fs"));
40143
+ var fs80 = __toESM(require("fs"));
40120
40144
  var path90 = __toESM(require("path"));
40121
40145
  var defaultCommandRunner = (file, args2, cwd, timeoutMs, env) => new Promise((resolve14) => {
40122
40146
  (0, import_node_child_process28.execFile)(
@@ -40167,7 +40191,7 @@ async function changedFiles(run3, cwd, from, to) {
40167
40191
  }
40168
40192
  function readWorkspaceFile(cwd, relPath) {
40169
40193
  try {
40170
- return fs79.readFileSync(path90.join(cwd, relPath), "utf8");
40194
+ return fs80.readFileSync(path90.join(cwd, relPath), "utf8");
40171
40195
  } catch {
40172
40196
  return null;
40173
40197
  }
@@ -40176,14 +40200,14 @@ var NO_TEST_PLACEHOLDER = 'echo "Error: no test specified"';
40176
40200
  var CHECKS_TIMEOUT_MS = 5 * 6e4;
40177
40201
  function detectChecksCommand(cwd) {
40178
40202
  try {
40179
- const cfg = JSON.parse(fs79.readFileSync(path90.join(cwd, ".codeam", "pack.json"), "utf8"));
40203
+ const cfg = JSON.parse(fs80.readFileSync(path90.join(cwd, ".codeam", "pack.json"), "utf8"));
40180
40204
  if (typeof cfg.checksCommand === "string" && cfg.checksCommand.trim().length > 0) {
40181
40205
  return cfg.checksCommand.trim();
40182
40206
  }
40183
40207
  } catch {
40184
40208
  }
40185
40209
  try {
40186
- const pkg = JSON.parse(fs79.readFileSync(path90.join(cwd, "package.json"), "utf8"));
40210
+ const pkg = JSON.parse(fs80.readFileSync(path90.join(cwd, "package.json"), "utf8"));
40187
40211
  const test = pkg.scripts?.test;
40188
40212
  if (typeof test === "string" && test.trim().length > 0 && !test.includes(NO_TEST_PLACEHOLDER)) {
40189
40213
  return "npm test";
@@ -40201,7 +40225,7 @@ ${res.stderr}`.trim();
40201
40225
  }
40202
40226
 
40203
40227
  // src/packs/run-store.ts
40204
- var fs80 = __toESM(require("fs"));
40228
+ var fs81 = __toESM(require("fs"));
40205
40229
  var path91 = __toESM(require("path"));
40206
40230
  var crypto5 = __toESM(require("crypto"));
40207
40231
  function packsDir(cwd) {
@@ -40214,10 +40238,10 @@ function newRunId() {
40214
40238
  return `pk_${Date.now().toString(36)}_${crypto5.randomBytes(4).toString("hex")}`;
40215
40239
  }
40216
40240
  function writeJsonAtomic(file, value) {
40217
- fs80.mkdirSync(path91.dirname(file), { recursive: true });
40241
+ fs81.mkdirSync(path91.dirname(file), { recursive: true });
40218
40242
  const tmp = `${file}.tmp`;
40219
- fs80.writeFileSync(tmp, JSON.stringify(value, null, 2));
40220
- fs80.renameSync(tmp, file);
40243
+ fs81.writeFileSync(tmp, JSON.stringify(value, null, 2));
40244
+ fs81.renameSync(tmp, file);
40221
40245
  }
40222
40246
  function saveRun(cwd, state) {
40223
40247
  writeJsonAtomic(path91.join(runDir(cwd, state.runId), "run.json"), state);
@@ -40229,11 +40253,11 @@ function saveStageHandoff(cwd, runId, stageIndex, role, handoff) {
40229
40253
  function loadLatestRun(cwd) {
40230
40254
  try {
40231
40255
  const dir = packsDir(cwd);
40232
- const entries2 = fs80.readdirSync(dir, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name).sort();
40256
+ const entries2 = fs81.readdirSync(dir, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name).sort();
40233
40257
  for (let i = entries2.length - 1; i >= 0; i--) {
40234
40258
  const file = path91.join(dir, entries2[i], "run.json");
40235
40259
  try {
40236
- const parsed = JSON.parse(fs80.readFileSync(file, "utf8"));
40260
+ const parsed = JSON.parse(fs81.readFileSync(file, "utf8"));
40237
40261
  if (parsed && typeof parsed.runId === "string") return parsed;
40238
40262
  } catch {
40239
40263
  }
@@ -40245,16 +40269,16 @@ function loadLatestRun(cwd) {
40245
40269
  function ensureLedgerIgnored(cwd) {
40246
40270
  try {
40247
40271
  const gitDir = path91.join(cwd, ".git");
40248
- if (!fs80.existsSync(gitDir)) return;
40272
+ if (!fs81.existsSync(gitDir)) return;
40249
40273
  const exclude = path91.join(gitDir, "info", "exclude");
40250
40274
  let existing = "";
40251
40275
  try {
40252
- existing = fs80.readFileSync(exclude, "utf8");
40276
+ existing = fs81.readFileSync(exclude, "utf8");
40253
40277
  } catch {
40254
40278
  }
40255
40279
  if (existing.includes(".codeam/packs/")) return;
40256
- fs80.mkdirSync(path91.dirname(exclude), { recursive: true });
40257
- fs80.writeFileSync(exclude, `${existing.trimEnd()}
40280
+ fs81.mkdirSync(path91.dirname(exclude), { recursive: true });
40281
+ fs81.writeFileSync(exclude, `${existing.trimEnd()}
40258
40282
  .codeam/packs/
40259
40283
  `.trimStart());
40260
40284
  } catch {
@@ -41235,7 +41259,7 @@ async function mcpRouter() {
41235
41259
  }
41236
41260
 
41237
41261
  // src/integrations/mcp-secrets.ts
41238
- var fs82 = __toESM(require("fs"));
41262
+ var fs83 = __toESM(require("fs"));
41239
41263
  var os59 = __toESM(require("os"));
41240
41264
  var path93 = __toESM(require("path"));
41241
41265
  var MCP_SECRETS_FILE_ENV = "CODEAM_MCP_SECRETS_FILE";
@@ -41248,7 +41272,7 @@ function mcpSecretsPath(scope, pid = process.pid) {
41248
41272
  var registeredForCleanup = /* @__PURE__ */ new Set();
41249
41273
  function readFileVars(file) {
41250
41274
  try {
41251
- const parsed = JSON.parse(fs82.readFileSync(file, "utf8"));
41275
+ const parsed = JSON.parse(fs83.readFileSync(file, "utf8"));
41252
41276
  if (!parsed || typeof parsed !== "object") return {};
41253
41277
  const out2 = {};
41254
41278
  for (const [k2, v] of Object.entries(parsed)) {
@@ -41270,7 +41294,7 @@ function pidAlive2(pid) {
41270
41294
  function pruneStale(dir) {
41271
41295
  let names = [];
41272
41296
  try {
41273
- names = fs82.readdirSync(dir);
41297
+ names = fs83.readdirSync(dir);
41274
41298
  } catch {
41275
41299
  return;
41276
41300
  }
@@ -41280,7 +41304,7 @@ function pruneStale(dir) {
41280
41304
  const pid = Number(m[1]);
41281
41305
  if (pid === process.pid || pidAlive2(pid)) continue;
41282
41306
  try {
41283
- fs82.unlinkSync(path93.join(dir, name));
41307
+ fs83.unlinkSync(path93.join(dir, name));
41284
41308
  } catch {
41285
41309
  }
41286
41310
  }
@@ -41288,17 +41312,17 @@ function pruneStale(dir) {
41288
41312
  function writeMcpSecrets(vars, file) {
41289
41313
  try {
41290
41314
  const dir = path93.dirname(file);
41291
- fs82.mkdirSync(dir, { recursive: true, mode: 448 });
41315
+ fs83.mkdirSync(dir, { recursive: true, mode: 448 });
41292
41316
  pruneStale(dir);
41293
41317
  const tmp = `${file}.${process.pid}.tmp`;
41294
- fs82.writeFileSync(tmp, JSON.stringify(vars), { mode: 384 });
41295
- fs82.renameSync(tmp, file);
41296
- fs82.chmodSync(file, 384);
41318
+ fs83.writeFileSync(tmp, JSON.stringify(vars), { mode: 384 });
41319
+ fs83.renameSync(tmp, file);
41320
+ fs83.chmodSync(file, 384);
41297
41321
  if (!registeredForCleanup.has(file)) {
41298
41322
  registeredForCleanup.add(file);
41299
41323
  process.once("exit", () => {
41300
41324
  try {
41301
- fs82.unlinkSync(file);
41325
+ fs83.unlinkSync(file);
41302
41326
  } catch {
41303
41327
  }
41304
41328
  });
@@ -44432,7 +44456,7 @@ async function runAcpSession(opts) {
44432
44456
  `switch-${opts.pluginId}`
44433
44457
  );
44434
44458
  try {
44435
- fs85.mkdirSync(claudeConfigDir2, { recursive: true, mode: 448 });
44459
+ fs86.mkdirSync(claudeConfigDir2, { recursive: true, mode: 448 });
44436
44460
  } catch {
44437
44461
  }
44438
44462
  const memoryFile = path96.join(claudeConfigDir2, "CLAUDE.md");
@@ -45666,7 +45690,7 @@ function pickPinnedSession(pinnedId, listSessions2) {
45666
45690
  }
45667
45691
 
45668
45692
  // src/agents/retired-proxy-cleanup.ts
45669
- var fs86 = __toESM(require("fs"));
45693
+ var fs87 = __toESM(require("fs"));
45670
45694
  var path97 = __toESM(require("path"));
45671
45695
  var os62 = __toESM(require("os"));
45672
45696
  var RETIRED_PROXY_RE = /^https?:\/\/(?:127\.0\.0\.1|localhost|\[::1\]):8787(?:[/?#]|$)/i;
@@ -45682,7 +45706,7 @@ function sanitizeRetiredProxyConfig(homeDir2 = os62.homedir()) {
45682
45706
  const file = path97.join(homeDir2, ".claude", "settings.json");
45683
45707
  let parsed;
45684
45708
  try {
45685
- parsed = JSON.parse(fs86.readFileSync(file, "utf8"));
45709
+ parsed = JSON.parse(fs87.readFileSync(file, "utf8"));
45686
45710
  } catch {
45687
45711
  return out2;
45688
45712
  }
@@ -45724,9 +45748,9 @@ function sanitizeRetiredProxyConfig(homeDir2 = os62.homedir()) {
45724
45748
  if (!out2.changed) return out2;
45725
45749
  try {
45726
45750
  const tmp = `${file}.codeam.tmp`;
45727
- fs86.writeFileSync(tmp, `${JSON.stringify(parsed, null, 2)}
45751
+ fs87.writeFileSync(tmp, `${JSON.stringify(parsed, null, 2)}
45728
45752
  `, { mode: 384 });
45729
- fs86.renameSync(tmp, file);
45753
+ fs87.renameSync(tmp, file);
45730
45754
  } catch {
45731
45755
  out2.changed = false;
45732
45756
  }
@@ -46258,7 +46282,7 @@ var AcpDriver = class {
46258
46282
  };
46259
46283
 
46260
46284
  // src/baton/transcript-mirror.ts
46261
- var fs87 = __toESM(require("fs"));
46285
+ var fs88 = __toESM(require("fs"));
46262
46286
  var TranscriptMirror = class {
46263
46287
  constructor(deps) {
46264
46288
  this.deps = deps;
@@ -46352,7 +46376,7 @@ var TranscriptMirror = class {
46352
46376
  }
46353
46377
  };
46354
46378
  function defaultWatch(file, onChange) {
46355
- const w3 = fs87.watch(file, { persistent: false }, () => onChange());
46379
+ const w3 = fs88.watch(file, { persistent: false }, () => onChange());
46356
46380
  return () => w3.close();
46357
46381
  }
46358
46382
 
@@ -46698,7 +46722,7 @@ function keepDeviceAwake(deps = {}) {
46698
46722
  }
46699
46723
 
46700
46724
  // src/agents/claude/onboarding.ts
46701
- var fs88 = __toESM(require("fs"));
46725
+ var fs89 = __toESM(require("fs"));
46702
46726
  var os64 = __toESM(require("os"));
46703
46727
  var path98 = __toESM(require("path"));
46704
46728
  var ONBOARDING_VERSION_SENTINEL = "9999.0.0";
@@ -46707,7 +46731,7 @@ function ensureClaudeOnboarded(cwd) {
46707
46731
  const file = path98.join(os64.homedir(), ".claude.json");
46708
46732
  let config = {};
46709
46733
  try {
46710
- config = JSON.parse(fs88.readFileSync(file, "utf8"));
46734
+ config = JSON.parse(fs89.readFileSync(file, "utf8"));
46711
46735
  } catch {
46712
46736
  }
46713
46737
  let changed = false;
@@ -46732,8 +46756,8 @@ function ensureClaudeOnboarded(cwd) {
46732
46756
  }
46733
46757
  }
46734
46758
  if (!changed) return;
46735
- fs88.mkdirSync(path98.dirname(file), { recursive: true });
46736
- fs88.writeFileSync(file, JSON.stringify(config, null, 2));
46759
+ fs89.mkdirSync(path98.dirname(file), { recursive: true });
46760
+ fs89.writeFileSync(file, JSON.stringify(config, null, 2));
46737
46761
  log.info(
46738
46762
  "claude",
46739
46763
  `pre-completed Claude onboarding${cwd ? ` + trusted workspace ${cwd}` : ""}`
@@ -49489,7 +49513,7 @@ async function stopWorkspaceFromLocal(target) {
49489
49513
  }
49490
49514
 
49491
49515
  // src/commands/host/host-client.ts
49492
- var fs89 = __toESM(require("fs"));
49516
+ var fs90 = __toESM(require("fs"));
49493
49517
  var os65 = __toESM(require("os"));
49494
49518
  var path103 = __toESM(require("path"));
49495
49519
  var import_node_crypto16 = require("crypto");
@@ -49552,7 +49576,7 @@ function collectOsInfo() {
49552
49576
  }
49553
49577
  function loadHostIdentity() {
49554
49578
  try {
49555
- const raw = fs89.readFileSync(hostIdentityPath(), "utf8");
49579
+ const raw = fs90.readFileSync(hostIdentityPath(), "utf8");
49556
49580
  const parsed = JSON.parse(raw);
49557
49581
  if (typeof parsed === "object" && parsed !== null && typeof parsed.hostId === "string" && typeof parsed.hostToken === "string" && typeof parsed.controlPluginId === "string") {
49558
49582
  const p2 = parsed;
@@ -49580,8 +49604,8 @@ function ensureControlPollSecret(identity, save = saveHostIdentity) {
49580
49604
  }
49581
49605
  function saveHostIdentity(identity) {
49582
49606
  const file = hostIdentityPath();
49583
- fs89.mkdirSync(path103.dirname(file), { recursive: true, mode: 448 });
49584
- fs89.writeFileSync(file, JSON.stringify(identity, null, 2), {
49607
+ fs90.mkdirSync(path103.dirname(file), { recursive: true, mode: 448 });
49608
+ fs90.writeFileSync(file, JSON.stringify(identity, null, 2), {
49585
49609
  encoding: "utf8",
49586
49610
  mode: 384
49587
49611
  });
@@ -49626,7 +49650,7 @@ function isTerminalEnrollError(err) {
49626
49650
  }
49627
49651
  function deleteHostIdentity() {
49628
49652
  try {
49629
- fs89.rmSync(hostIdentityPath(), { force: true });
49653
+ fs90.rmSync(hostIdentityPath(), { force: true });
49630
49654
  } catch {
49631
49655
  }
49632
49656
  }
@@ -49844,7 +49868,7 @@ async function host(args2) {
49844
49868
  // src/commands/host-agent.ts
49845
49869
  var import_node_child_process36 = require("child_process");
49846
49870
  var os71 = __toESM(require("os"));
49847
- var fs96 = __toESM(require("fs"));
49871
+ var fs97 = __toESM(require("fs"));
49848
49872
  var path110 = __toESM(require("path"));
49849
49873
 
49850
49874
  // src/skills/persist-from-payload.ts
@@ -49854,7 +49878,7 @@ function persistOrClearSkillsFromPayload(skills) {
49854
49878
  }
49855
49879
 
49856
49880
  // src/commands/host/session-state.ts
49857
- var fs90 = __toESM(require("fs"));
49881
+ var fs91 = __toESM(require("fs"));
49858
49882
  var os66 = __toESM(require("os"));
49859
49883
  var path104 = __toESM(require("path"));
49860
49884
  function hostSessionStatePath(env = process.env) {
@@ -49871,7 +49895,7 @@ function fileSessionChildStore(file = hostSessionStatePath()) {
49871
49895
  return {
49872
49896
  load() {
49873
49897
  try {
49874
- const raw = JSON.parse(fs90.readFileSync(file, "utf8"));
49898
+ const raw = JSON.parse(fs91.readFileSync(file, "utf8"));
49875
49899
  return Array.isArray(raw?.sessions) ? raw.sessions.filter(isRecord5) : null;
49876
49900
  } catch {
49877
49901
  return null;
@@ -49879,18 +49903,18 @@ function fileSessionChildStore(file = hostSessionStatePath()) {
49879
49903
  },
49880
49904
  save(list) {
49881
49905
  try {
49882
- fs90.mkdirSync(path104.dirname(file), { recursive: true, mode: 448 });
49906
+ fs91.mkdirSync(path104.dirname(file), { recursive: true, mode: 448 });
49883
49907
  const tmp = `${file}.${process.pid}.tmp`;
49884
- fs90.writeFileSync(tmp, JSON.stringify({ version: 1, sessions: list }, null, 2), {
49908
+ fs91.writeFileSync(tmp, JSON.stringify({ version: 1, sessions: list }, null, 2), {
49885
49909
  mode: 384
49886
49910
  });
49887
- fs90.renameSync(tmp, file);
49911
+ fs91.renameSync(tmp, file);
49888
49912
  } catch {
49889
49913
  }
49890
49914
  },
49891
49915
  clear() {
49892
49916
  try {
49893
- fs90.rmSync(file, { force: true });
49917
+ fs91.rmSync(file, { force: true });
49894
49918
  } catch {
49895
49919
  }
49896
49920
  }
@@ -49928,7 +49952,7 @@ function pickSavedSessionForWorkspace(sessions3, cwd, deployId) {
49928
49952
 
49929
49953
  // src/commands/host/git-tooling.ts
49930
49954
  var import_node_child_process31 = require("child_process");
49931
- var fs91 = __toESM(require("fs"));
49955
+ var fs92 = __toESM(require("fs"));
49932
49956
  var os67 = __toESM(require("os"));
49933
49957
  var path105 = __toESM(require("path"));
49934
49958
  function codeamBinDir() {
@@ -49964,7 +49988,7 @@ async function download(url2, dest) {
49964
49988
  const res = await fetch(url2, { headers: { "User-Agent": "codeam-cli" } });
49965
49989
  if (!res.ok || !res.body) return false;
49966
49990
  const buf = Buffer.from(await res.arrayBuffer());
49967
- fs91.writeFileSync(dest, buf);
49991
+ fs92.writeFileSync(dest, buf);
49968
49992
  return true;
49969
49993
  } catch {
49970
49994
  return false;
@@ -49987,7 +50011,7 @@ async function ensureGhCli(runner, token, deps = {}) {
49987
50011
  const version3 = await resolveVersionFn(token);
49988
50012
  const asset = `gh_${version3}_${osToken}_${arch2}`;
49989
50013
  const url2 = `https://github.com/cli/cli/releases/download/v${version3}/${asset}.${ext}`;
49990
- const tmpRoot = fs91.mkdtempSync(path105.join(os67.tmpdir(), "codeam-gh-"));
50014
+ const tmpRoot = fs92.mkdtempSync(path105.join(os67.tmpdir(), "codeam-gh-"));
49991
50015
  const archive = path105.join(tmpRoot, `${asset}.${ext}`);
49992
50016
  if (!await downloadFn(url2, archive)) {
49993
50017
  log.warn("host-agent", "gh download failed \u2014 skipping (git pull/push still work via the credential helper)");
@@ -49999,15 +50023,15 @@ async function ensureGhCli(runner, token, deps = {}) {
49999
50023
  return null;
50000
50024
  }
50001
50025
  const extractedBin = path105.join(tmpRoot, asset, "bin", binaryName);
50002
- if (!fs91.existsSync(extractedBin)) {
50026
+ if (!fs92.existsSync(extractedBin)) {
50003
50027
  log.warn("host-agent", "gh binary not found in the extracted archive \u2014 skipping");
50004
50028
  return null;
50005
50029
  }
50006
50030
  const binDir = codeamBinDir();
50007
- fs91.mkdirSync(binDir, { recursive: true });
50031
+ fs92.mkdirSync(binDir, { recursive: true });
50008
50032
  const target = path105.join(binDir, binaryName);
50009
- fs91.copyFileSync(extractedBin, target);
50010
- fs91.chmodSync(target, 493);
50033
+ fs92.copyFileSync(extractedBin, target);
50034
+ fs92.chmodSync(target, 493);
50011
50035
  log.info("host-agent", `gh installed to ${target} (v${version3})`);
50012
50036
  return target;
50013
50037
  } catch (e) {
@@ -50054,9 +50078,9 @@ function writeGhHostsToken(token) {
50054
50078
  try {
50055
50079
  const dir = ghConfigDir();
50056
50080
  const file = path105.join(dir, "hosts.yml");
50057
- if (fs91.existsSync(file)) return false;
50058
- fs91.mkdirSync(dir, { recursive: true, mode: 448 });
50059
- fs91.writeFileSync(
50081
+ if (fs92.existsSync(file)) return false;
50082
+ fs92.mkdirSync(dir, { recursive: true, mode: 448 });
50083
+ fs92.writeFileSync(
50060
50084
  file,
50061
50085
  `github.com:
50062
50086
  oauth_token: ${token}
@@ -50099,7 +50123,7 @@ async function ensureGlabCli(runner, deps = {}) {
50099
50123
  const version3 = await resolveLatestGlabVersion();
50100
50124
  const asset = `glab_${version3}_${osToken}_${arch2}`;
50101
50125
  const url2 = `https://gitlab.com/gitlab-org/cli/-/releases/v${version3}/downloads/${asset}.${ext}`;
50102
- const tmpRoot = fs91.mkdtempSync(path105.join(os67.tmpdir(), "codeam-glab-"));
50126
+ const tmpRoot = fs92.mkdtempSync(path105.join(os67.tmpdir(), "codeam-glab-"));
50103
50127
  const archive = path105.join(tmpRoot, `${asset}.${ext}`);
50104
50128
  if (!await downloadFn(url2, archive)) {
50105
50129
  log.warn("host-agent", "glab download failed \u2014 skipping (git push/pull still work)");
@@ -50115,16 +50139,16 @@ async function ensureGlabCli(runner, deps = {}) {
50115
50139
  path105.join(tmpRoot, asset, "bin", binaryName),
50116
50140
  path105.join(tmpRoot, binaryName)
50117
50141
  ];
50118
- const extractedBin = candidates.find((c2) => fs91.existsSync(c2));
50142
+ const extractedBin = candidates.find((c2) => fs92.existsSync(c2));
50119
50143
  if (!extractedBin) {
50120
50144
  log.warn("host-agent", "glab binary not found in the extracted archive \u2014 skipping");
50121
50145
  return null;
50122
50146
  }
50123
50147
  const binDir = codeamBinDir();
50124
- fs91.mkdirSync(binDir, { recursive: true });
50148
+ fs92.mkdirSync(binDir, { recursive: true });
50125
50149
  const target = path105.join(binDir, binaryName);
50126
- fs91.copyFileSync(extractedBin, target);
50127
- fs91.chmodSync(target, 493);
50150
+ fs92.copyFileSync(extractedBin, target);
50151
+ fs92.chmodSync(target, 493);
50128
50152
  log.info("host-agent", `glab installed to ${target} (v${version3})`);
50129
50153
  return target;
50130
50154
  } catch (e) {
@@ -50203,12 +50227,12 @@ var defaultGitToolingRunner = {
50203
50227
  };
50204
50228
 
50205
50229
  // src/lib/cli-versions.ts
50206
- var fs93 = __toESM(require("fs"));
50230
+ var fs94 = __toESM(require("fs"));
50207
50231
  var os69 = __toESM(require("os"));
50208
50232
  var path107 = __toESM(require("path"));
50209
50233
 
50210
50234
  // src/lib/updateNotifier.ts
50211
- var fs92 = __toESM(require("fs"));
50235
+ var fs93 = __toESM(require("fs"));
50212
50236
  var os68 = __toESM(require("os"));
50213
50237
  var path106 = __toESM(require("path"));
50214
50238
  var https8 = __toESM(require("https"));
@@ -50224,7 +50248,7 @@ function cachePath() {
50224
50248
  }
50225
50249
  function readCache() {
50226
50250
  try {
50227
- const raw = fs92.readFileSync(cachePath(), "utf8");
50251
+ const raw = fs93.readFileSync(cachePath(), "utf8");
50228
50252
  const parsed = JSON.parse(raw);
50229
50253
  if (typeof parsed.fetchedAt !== "number" || typeof parsed.latest !== "string") return null;
50230
50254
  return parsed;
@@ -50235,10 +50259,10 @@ function readCache() {
50235
50259
  function writeCache(cache) {
50236
50260
  try {
50237
50261
  const file = cachePath();
50238
- fs92.mkdirSync(path106.dirname(file), { recursive: true });
50262
+ fs93.mkdirSync(path106.dirname(file), { recursive: true });
50239
50263
  const tmp = `${file}.${process.pid}.tmp`;
50240
- fs92.writeFileSync(tmp, JSON.stringify(cache));
50241
- fs92.renameSync(tmp, file);
50264
+ fs93.writeFileSync(tmp, JSON.stringify(cache));
50265
+ fs93.renameSync(tmp, file);
50242
50266
  } catch {
50243
50267
  }
50244
50268
  }
@@ -50313,7 +50337,7 @@ function isLinkedInstall() {
50313
50337
  }).trim();
50314
50338
  if (!root) return false;
50315
50339
  const pkgPath = path106.join(root, PKG_NAME);
50316
- return fs92.lstatSync(pkgPath).isSymbolicLink();
50340
+ return fs93.lstatSync(pkgPath).isSymbolicLink();
50317
50341
  } catch {
50318
50342
  return false;
50319
50343
  }
@@ -50349,7 +50373,7 @@ function maybeAutoUpdate(currentVersion, latest) {
50349
50373
  return;
50350
50374
  }
50351
50375
  try {
50352
- fs92.unlinkSync(cachePath());
50376
+ fs93.unlinkSync(cachePath());
50353
50377
  } catch {
50354
50378
  }
50355
50379
  process.stderr.write(` ${import_picocolors12.default.green("\u2713")} Updated. Resuming session...
@@ -50365,7 +50389,7 @@ async function autoUpgradeBeforeCriticalCommand() {
50365
50389
  if (process.env.NODE_ENV === "test") return;
50366
50390
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
50367
50391
  if (process.env.CI) return;
50368
- const current2 = true ? "2.76.13" : null;
50392
+ const current2 = true ? "2.76.14" : null;
50369
50393
  if (!current2) return;
50370
50394
  const cache = readCache();
50371
50395
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -50382,7 +50406,7 @@ function checkForUpdates() {
50382
50406
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
50383
50407
  if (process.env.CI) return;
50384
50408
  if (!process.stdout.isTTY) return;
50385
- const current2 = true ? "2.76.13" : null;
50409
+ const current2 = true ? "2.76.14" : null;
50386
50410
  if (!current2) return;
50387
50411
  const cache = readCache();
50388
50412
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -50416,7 +50440,7 @@ function isRecord6(v) {
50416
50440
  function readPkg2(versionDir) {
50417
50441
  try {
50418
50442
  const raw = JSON.parse(
50419
- fs93.readFileSync(path107.join(packageDirOf(versionDir), "package.json"), "utf8")
50443
+ fs94.readFileSync(path107.join(packageDirOf(versionDir), "package.json"), "utf8")
50420
50444
  );
50421
50445
  return isRecord6(raw) ? raw : null;
50422
50446
  } catch {
@@ -50430,14 +50454,14 @@ function entryOf(versionDir) {
50430
50454
  const named = isRecord6(bin) ? bin.codeam : void 0;
50431
50455
  const rel = typeof bin === "string" ? bin : typeof named === "string" ? named : "dist/index.js";
50432
50456
  const entry = path107.join(packageDirOf(versionDir), rel);
50433
- return fs93.existsSync(entry) ? entry : null;
50457
+ return fs94.existsSync(entry) ? entry : null;
50434
50458
  }
50435
50459
  function launcherOf(versionDir) {
50436
50460
  const entry = entryOf(versionDir);
50437
50461
  if (!entry) return null;
50438
50462
  const bin = path107.join(versionDir, "node_modules", ".bin", "codeam");
50439
50463
  try {
50440
- return fs93.realpathSync(bin) === fs93.realpathSync(entry) ? bin : entry;
50464
+ return fs94.realpathSync(bin) === fs94.realpathSync(entry) ? bin : entry;
50441
50465
  } catch {
50442
50466
  return entry;
50443
50467
  }
@@ -50450,7 +50474,7 @@ var BAD_MARKER_TTL_MS = 24 * 60 * 6e4;
50450
50474
  var PRE_READY_WINDOW_MS = 60 * 6e4;
50451
50475
  function isBad(versionDir, now = Date.now()) {
50452
50476
  try {
50453
- return now - fs93.statSync(path107.join(versionDir, ".bad")).mtimeMs < BAD_MARKER_TTL_MS;
50477
+ return now - fs94.statSync(path107.join(versionDir, ".bad")).mtimeMs < BAD_MARKER_TTL_MS;
50454
50478
  } catch {
50455
50479
  return false;
50456
50480
  }
@@ -50459,7 +50483,7 @@ function recordPreReadyFailure(versionDir, now = Date.now()) {
50459
50483
  const file = path107.join(versionDir, ".prefail");
50460
50484
  let count = 0;
50461
50485
  try {
50462
- const [n, at3] = fs93.readFileSync(file, "utf8").trim().split(" ").map(Number);
50486
+ const [n, at3] = fs94.readFileSync(file, "utf8").trim().split(" ").map(Number);
50463
50487
  if (Number.isFinite(n) && Number.isFinite(at3) && now - at3 < PRE_READY_WINDOW_MS) {
50464
50488
  count = n;
50465
50489
  }
@@ -50467,35 +50491,35 @@ function recordPreReadyFailure(versionDir, now = Date.now()) {
50467
50491
  }
50468
50492
  count += 1;
50469
50493
  try {
50470
- fs93.writeFileSync(file, `${count} ${now}`);
50494
+ fs94.writeFileSync(file, `${count} ${now}`);
50471
50495
  } catch {
50472
50496
  }
50473
50497
  return count;
50474
50498
  }
50475
50499
  function clearPreReadyFailures(versionDir) {
50476
- fs93.rmSync(path107.join(versionDir, ".prefail"), { force: true });
50500
+ fs94.rmSync(path107.join(versionDir, ".prefail"), { force: true });
50477
50501
  }
50478
50502
  function markBad(versionDir, reason) {
50479
50503
  try {
50480
- fs93.writeFileSync(path107.join(versionDir, ".bad"), `${(/* @__PURE__ */ new Date()).toISOString()} ${reason}
50504
+ fs94.writeFileSync(path107.join(versionDir, ".bad"), `${(/* @__PURE__ */ new Date()).toISOString()} ${reason}
50481
50505
  `);
50482
50506
  } catch {
50483
50507
  }
50484
50508
  }
50485
50509
  function pointerTarget(root, name) {
50486
50510
  try {
50487
- return fs93.realpathSync(path107.join(root, name));
50511
+ return fs94.realpathSync(path107.join(root, name));
50488
50512
  } catch {
50489
50513
  return null;
50490
50514
  }
50491
50515
  }
50492
50516
  function atomicPoint(root, name, targetDir) {
50493
50517
  const tmp = path107.join(root, `.${name}.tmp-${process.pid}-${Date.now()}`);
50494
- fs93.symlinkSync(path107.relative(root, targetDir), tmp, "dir");
50518
+ fs94.symlinkSync(path107.relative(root, targetDir), tmp, "dir");
50495
50519
  try {
50496
- fs93.renameSync(tmp, path107.join(root, name));
50520
+ fs94.renameSync(tmp, path107.join(root, name));
50497
50521
  } catch (err) {
50498
- fs93.rmSync(tmp, { force: true });
50522
+ fs94.rmSync(tmp, { force: true });
50499
50523
  throw err;
50500
50524
  }
50501
50525
  }
@@ -50529,8 +50553,8 @@ function versionDirContaining(root, file) {
50529
50553
  let real;
50530
50554
  let realRoot;
50531
50555
  try {
50532
- real = fs93.realpathSync(file);
50533
- realRoot = fs93.realpathSync(root);
50556
+ real = fs94.realpathSync(file);
50557
+ realRoot = fs94.realpathSync(root);
50534
50558
  } catch {
50535
50559
  return null;
50536
50560
  }
@@ -50550,7 +50574,7 @@ function pidAlive3(pid) {
50550
50574
  function livePids(versionDir) {
50551
50575
  let names;
50552
50576
  try {
50553
- names = fs93.readdirSync(path107.join(versionDir, ".pids"));
50577
+ names = fs94.readdirSync(path107.join(versionDir, ".pids"));
50554
50578
  } catch {
50555
50579
  return [];
50556
50580
  }
@@ -50561,9 +50585,9 @@ function registerRunningVersion(root = cliVersionsRoot(), entry = process.argv[1
50561
50585
  if (!dir) return;
50562
50586
  const file = path107.join(dir, ".pids", String(process.pid));
50563
50587
  try {
50564
- fs93.mkdirSync(path107.dirname(file), { recursive: true });
50565
- fs93.writeFileSync(file, "");
50566
- process.once("exit", () => fs93.rmSync(file, { force: true }));
50588
+ fs94.mkdirSync(path107.dirname(file), { recursive: true });
50589
+ fs94.writeFileSync(file, "");
50590
+ process.once("exit", () => fs94.rmSync(file, { force: true }));
50567
50591
  } catch {
50568
50592
  }
50569
50593
  }
@@ -50571,7 +50595,7 @@ function gcVersions(root) {
50571
50595
  const removed = [];
50572
50596
  let names;
50573
50597
  try {
50574
- names = fs93.readdirSync(root).filter((n) => SEMVER_DIR.test(n));
50598
+ names = fs94.readdirSync(root).filter((n) => SEMVER_DIR.test(n));
50575
50599
  } catch {
50576
50600
  return removed;
50577
50601
  }
@@ -50585,7 +50609,7 @@ function gcVersions(root) {
50585
50609
  const dir = path107.join(root, name);
50586
50610
  if (keep.has(name) || livePids(dir).length > 0) continue;
50587
50611
  try {
50588
- fs93.rmSync(dir, { recursive: true, force: true });
50612
+ fs94.rmSync(dir, { recursive: true, force: true });
50589
50613
  removed.push(name);
50590
50614
  } catch {
50591
50615
  }
@@ -50596,22 +50620,22 @@ function acquireInstallLock(root) {
50596
50620
  const lock = path107.join(root, ".install.lock");
50597
50621
  for (let attempt = 0; attempt < 2; attempt++) {
50598
50622
  try {
50599
- const fd = fs93.openSync(lock, "wx");
50600
- fs93.writeSync(fd, String(process.pid));
50601
- fs93.closeSync(fd);
50602
- return () => fs93.rmSync(lock, { force: true });
50623
+ const fd = fs94.openSync(lock, "wx");
50624
+ fs94.writeSync(fd, String(process.pid));
50625
+ fs94.closeSync(fd);
50626
+ return () => fs94.rmSync(lock, { force: true });
50603
50627
  } catch (err) {
50604
50628
  if (err.code !== "EEXIST") return null;
50605
50629
  let stale = false;
50606
50630
  try {
50607
- const owner = Number(fs93.readFileSync(lock, "utf8"));
50608
- const age = Date.now() - fs93.statSync(lock).mtimeMs;
50631
+ const owner = Number(fs94.readFileSync(lock, "utf8"));
50632
+ const age = Date.now() - fs94.statSync(lock).mtimeMs;
50609
50633
  stale = !Number.isInteger(owner) || !pidAlive3(owner) || age > LOCK_STALE_MS;
50610
50634
  } catch {
50611
50635
  stale = true;
50612
50636
  }
50613
50637
  if (!stale) return null;
50614
- fs93.rmSync(lock, { force: true });
50638
+ fs94.rmSync(lock, { force: true });
50615
50639
  }
50616
50640
  }
50617
50641
  return null;
@@ -50619,7 +50643,7 @@ function acquireInstallLock(root) {
50619
50643
 
50620
50644
  // src/commands/host/host-launch.ts
50621
50645
  var import_node_child_process34 = require("child_process");
50622
- var fs95 = __toESM(require("fs"));
50646
+ var fs96 = __toESM(require("fs"));
50623
50647
  var os70 = __toESM(require("os"));
50624
50648
  var path109 = __toESM(require("path"));
50625
50649
 
@@ -50643,7 +50667,7 @@ var EXIT_CODE_NAMES = {
50643
50667
 
50644
50668
  // src/commands/host/self-update.ts
50645
50669
  var import_node_child_process33 = require("child_process");
50646
- var fs94 = __toESM(require("fs"));
50670
+ var fs95 = __toESM(require("fs"));
50647
50671
  var path108 = __toESM(require("path"));
50648
50672
  var SELF_UPDATE_PKG = "codeam-cli";
50649
50673
  var SELF_UPDATE_INTERVAL_MS = 60 * 60 * 1e3;
@@ -50653,7 +50677,7 @@ var SELF_UPDATE_VIEW_TIMEOUT_MS = 3e4;
50653
50677
  var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
50654
50678
  var SELF_UPDATE_LS_TIMEOUT_MS = 15e3;
50655
50679
  function currentCliVersion() {
50656
- return true ? "2.76.13" : null;
50680
+ return true ? "2.76.14" : null;
50657
50681
  }
50658
50682
  async function installedVersion(deps) {
50659
50683
  const ls = await deps.run(
@@ -50747,7 +50771,7 @@ async function installVersioned(deps, root, latest, running2) {
50747
50771
  const node = deps.nodePath ?? process.execPath;
50748
50772
  const target = path108.join(root, latest);
50749
50773
  try {
50750
- fs94.mkdirSync(root, { recursive: true });
50774
+ fs95.mkdirSync(root, { recursive: true });
50751
50775
  } catch {
50752
50776
  return { status: "skipped" };
50753
50777
  }
@@ -50767,7 +50791,7 @@ async function installVersioned(deps, root, latest, running2) {
50767
50791
  if (runningDir && path108.resolve(runningDir) === path108.resolve(target)) {
50768
50792
  return { status: "skipped" };
50769
50793
  }
50770
- fs94.rmSync(target, { recursive: true, force: true });
50794
+ fs95.rmSync(target, { recursive: true, force: true });
50771
50795
  const install = await deps.run(
50772
50796
  "npm",
50773
50797
  [
@@ -50782,7 +50806,7 @@ async function installVersioned(deps, root, latest, running2) {
50782
50806
  SELF_UPDATE_INSTALL_TIMEOUT_MS
50783
50807
  );
50784
50808
  if (install.code !== 0) {
50785
- fs94.rmSync(target, { recursive: true, force: true });
50809
+ fs95.rmSync(target, { recursive: true, force: true });
50786
50810
  log.warn(
50787
50811
  "host-agent",
50788
50812
  `self-update: versioned install exited ${String(install.code)} \u2014 staying on ${running2}: ` + install.stderr.slice(-300)
@@ -50793,7 +50817,7 @@ async function installVersioned(deps, root, latest, running2) {
50793
50817
  const entry = entryOf(target);
50794
50818
  const check = entry ? await deps.run(node, [entry, "--version"], VERIFY_TIMEOUT_MS) : { code: null, stdout: "", stderr: "no entry point" };
50795
50819
  if (check.code !== 0 || !check.stdout.includes(latest)) {
50796
- fs94.rmSync(target, { recursive: true, force: true });
50820
+ fs95.rmSync(target, { recursive: true, force: true });
50797
50821
  log.warn(
50798
50822
  "host-agent",
50799
50823
  `self-update: ${latest} failed verification (exit ${String(check.code)}: ${(check.stdout + check.stderr).trim().slice(-200)}) \u2014 staying on ${running2}`
@@ -50809,7 +50833,7 @@ async function installVersioned(deps, root, latest, running2) {
50809
50833
  return { status: "updated", version: latest };
50810
50834
  } catch (err) {
50811
50835
  const cur = pointerTarget(root, "current");
50812
- if (!cur || path108.basename(cur) !== latest) fs94.rmSync(target, { recursive: true, force: true });
50836
+ if (!cur || path108.basename(cur) !== latest) fs95.rmSync(target, { recursive: true, force: true });
50813
50837
  log.warn(
50814
50838
  "host-agent",
50815
50839
  `self-update: versioned install failed: ${err instanceof Error ? err.message : String(err)}`
@@ -50848,7 +50872,7 @@ function signalHostReady(send = process.send?.bind(process)) {
50848
50872
  }
50849
50873
  function defaultDeps() {
50850
50874
  return {
50851
- ownVersion: true ? "2.76.13" : null,
50875
+ ownVersion: true ? "2.76.14" : null,
50852
50876
  root: cliVersionsRoot(),
50853
50877
  args: process.argv.slice(3),
50854
50878
  execPath: process.execPath,
@@ -50945,7 +50969,7 @@ function needsSelfRelaunch(env = process.env, pid = process.pid, ctx = {}) {
50945
50969
  }
50946
50970
  function readPid1Cmdline() {
50947
50971
  try {
50948
- return fs95.readFileSync("/proc/1/cmdline", "utf8").split("\0").filter(Boolean);
50972
+ return fs96.readFileSync("/proc/1/cmdline", "utf8").split("\0").filter(Boolean);
50949
50973
  } catch {
50950
50974
  return [];
50951
50975
  }
@@ -50984,7 +51008,7 @@ function defaultRestartForUpdate(version3, supervised, io = {}) {
50984
51008
  }
50985
51009
  exit(0);
50986
51010
  }
50987
- function isContainerEnvironment(existsSyncFn = fs95.existsSync, readFileSyncFn = (p2) => fs95.readFileSync(p2, "utf8")) {
51011
+ function isContainerEnvironment(existsSyncFn = fs96.existsSync, readFileSyncFn = (p2) => fs96.readFileSync(p2, "utf8")) {
50988
51012
  try {
50989
51013
  if (existsSyncFn("/.dockerenv")) return true;
50990
51014
  } catch {
@@ -51001,11 +51025,11 @@ function hostAgentPidFile(home = os70.homedir()) {
51001
51025
  }
51002
51026
  function writeHostAgentPidFile(file = hostAgentPidFile(), pid = process.pid) {
51003
51027
  try {
51004
- fs95.mkdirSync(path109.dirname(file), { recursive: true });
51005
- fs95.writeFileSync(file, String(pid));
51028
+ fs96.mkdirSync(path109.dirname(file), { recursive: true });
51029
+ fs96.writeFileSync(file, String(pid));
51006
51030
  process.once("exit", () => {
51007
51031
  try {
51008
- if (fs95.readFileSync(file, "utf8").trim() === String(pid)) fs95.rmSync(file, { force: true });
51032
+ if (fs96.readFileSync(file, "utf8").trim() === String(pid)) fs96.rmSync(file, { force: true });
51009
51033
  } catch {
51010
51034
  }
51011
51035
  });
@@ -51765,7 +51789,7 @@ var HostAgentSupervisor = class {
51765
51789
  const raw = cmd.payload?.path;
51766
51790
  const target = typeof raw === "string" && raw.trim() ? path110.resolve(raw.trim()) : os71.homedir();
51767
51791
  try {
51768
- const dirents = await fs96.promises.readdir(target, { withFileTypes: true });
51792
+ const dirents = await fs97.promises.readdir(target, { withFileTypes: true });
51769
51793
  const entries2 = dirents.filter((d3) => !d3.name.startsWith(".")).map((d3) => ({ name: d3.name, isDir: d3.isDirectory() })).sort(
51770
51794
  (a, b) => a.isDir === b.isDir ? a.name.localeCompare(b.name) : a.isDir ? -1 : 1
51771
51795
  );
@@ -52247,7 +52271,7 @@ var HostAgentSupervisor = class {
52247
52271
  payload.deployId
52248
52272
  );
52249
52273
  try {
52250
- fs96.mkdirSync(houseConfigDir, { recursive: true, mode: 448 });
52274
+ fs97.mkdirSync(houseConfigDir, { recursive: true, mode: 448 });
52251
52275
  } catch {
52252
52276
  }
52253
52277
  childEnv.CLAUDE_CONFIG_DIR = houseConfigDir;
@@ -52318,7 +52342,7 @@ var HostAgentSupervisor = class {
52318
52342
  try {
52319
52343
  const cfgDir = childEnv.CLAUDE_CONFIG_DIR || path110.join(os71.homedir(), ".claude");
52320
52344
  const projectDir = path110.join(cfgDir, "projects", encodeCwd(cwd));
52321
- const hasPriorConversation = fs96.existsSync(projectDir) && fs96.readdirSync(projectDir).some((f) => f.endsWith(".jsonl"));
52345
+ const hasPriorConversation = fs97.existsSync(projectDir) && fs97.readdirSync(projectDir).some((f) => f.endsWith(".jsonl"));
52322
52346
  if (hasPriorConversation) {
52323
52347
  childEnv.CODEAM_RESUME_LATEST = "1";
52324
52348
  log.info(
@@ -52472,7 +52496,7 @@ var HostAgentSupervisor = class {
52472
52496
  fallbackResumeTarget() {
52473
52497
  const session = getActiveSession();
52474
52498
  if (!session || !session.pluginId || !session.pollSecret || !session.agent) return null;
52475
- const cwd = session.cwd && fs96.existsSync(session.cwd) ? session.cwd : process.cwd();
52499
+ const cwd = session.cwd && fs97.existsSync(session.cwd) ? session.cwd : process.cwd();
52476
52500
  if (isFilesystemRoot(cwd)) {
52477
52501
  log.warn(
52478
52502
  "host-agent",
@@ -52512,7 +52536,7 @@ var HostAgentSupervisor = class {
52512
52536
  log.warn("host-agent", `self_hosted_resume ${sessionId.slice(0, 8)}: no saved pairing on this box`);
52513
52537
  return;
52514
52538
  }
52515
- if (!session.cwd || !fs96.existsSync(session.cwd)) {
52539
+ if (!session.cwd || !fs97.existsSync(session.cwd)) {
52516
52540
  log.warn("host-agent", `self_hosted_resume ${sessionId.slice(0, 8)}: workspace is gone`);
52517
52541
  return;
52518
52542
  }
@@ -52554,7 +52578,7 @@ var HostAgentSupervisor = class {
52554
52578
  const persisted = new Map((this.sessionStore.load() ?? []).map((r) => [r.deployId, r.agent]));
52555
52579
  for (const c2 of this.children.values()) persisted.set(c2.deployId, c2.agent);
52556
52580
  return this.listSavedSessions().map((s) => ({ s, deployId: deployIdFromWorkspace(s.cwd) })).filter(
52557
- (x) => x.deployId !== null && !!x.s.cwd && fs96.existsSync(x.s.cwd)
52581
+ (x) => x.deployId !== null && !!x.s.cwd && fs97.existsSync(x.s.cwd)
52558
52582
  ).map(({ s, deployId }) => {
52559
52583
  const agent = persisted.get(deployId);
52560
52584
  return { deployId, sessionId: s.id, ...agent ? { agent } : {} };
@@ -52606,7 +52630,7 @@ var HostAgentSupervisor = class {
52606
52630
  if (this.children.has(deployId)) return;
52607
52631
  const st3 = this.resumeStateFor(target);
52608
52632
  try {
52609
- const cwd = fs96.existsSync(target.cwd) ? target.cwd : process.cwd();
52633
+ const cwd = fs97.existsSync(target.cwd) ? target.cwd : process.cwd();
52610
52634
  const proc = this.resumeSpawner(
52611
52635
  { ...readHouseProxyChildEnv(deployId), CODEAM_RESUME_SESSION_ID: session.id },
52612
52636
  cwd
@@ -52830,7 +52854,7 @@ var HostAgentSupervisor = class {
52830
52854
  ];
52831
52855
  for (const dir of dirs) {
52832
52856
  try {
52833
- fs96.rmSync(dir, { recursive: true, force: true });
52857
+ fs97.rmSync(dir, { recursive: true, force: true });
52834
52858
  } catch (err) {
52835
52859
  log.warn(
52836
52860
  "host-agent",
@@ -52997,7 +53021,7 @@ async function invite() {
52997
53021
  var import_node_dns = require("dns");
52998
53022
  var import_node_util11 = require("util");
52999
53023
  var import_node_crypto17 = require("crypto");
53000
- var fs97 = __toESM(require("fs"));
53024
+ var fs98 = __toESM(require("fs"));
53001
53025
  var path111 = __toESM(require("path"));
53002
53026
  var import_picocolors14 = __toESM(require("picocolors"));
53003
53027
  var dnsResolveP = (0, import_node_util11.promisify)(import_node_dns.resolve);
@@ -53056,11 +53080,11 @@ async function checkHealth(apiBase2) {
53056
53080
  function checkConfigDir() {
53057
53081
  const dir = path111.join(require("os").homedir(), ".codeam");
53058
53082
  try {
53059
- fs97.mkdirSync(dir, { recursive: true, mode: 448 });
53083
+ fs98.mkdirSync(dir, { recursive: true, mode: 448 });
53060
53084
  const probe = path111.join(dir, ".doctor-probe");
53061
- fs97.writeFileSync(probe, "ok", { mode: 384 });
53062
- const read = fs97.readFileSync(probe, "utf8");
53063
- fs97.unlinkSync(probe);
53085
+ fs98.writeFileSync(probe, "ok", { mode: 384 });
53086
+ const read = fs98.readFileSync(probe, "utf8");
53087
+ fs98.unlinkSync(probe);
53064
53088
  if (read !== "ok") throw new Error("write/read round-trip mismatch");
53065
53089
  return {
53066
53090
  id: "config-dir",
@@ -53166,7 +53190,7 @@ function checkChokidar() {
53166
53190
  }
53167
53191
  async function doctor(args2 = []) {
53168
53192
  const json = args2.includes("--json");
53169
- const cliVersion = true ? "2.76.13" : "0.0.0-dev";
53193
+ const cliVersion = true ? "2.76.14" : "0.0.0-dev";
53170
53194
  const apiBase2 = resolveApiBaseUrl();
53171
53195
  const diagnosticId = (0, import_node_crypto17.randomUUID)();
53172
53196
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -53690,7 +53714,7 @@ async function mcpWarm(argv = [], opts = {}) {
53690
53714
  // src/commands/version.ts
53691
53715
  var import_picocolors15 = __toESM(require("picocolors"));
53692
53716
  function version2() {
53693
- const v = true ? "2.76.13" : "unknown";
53717
+ const v = true ? "2.76.14" : "unknown";
53694
53718
  console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
53695
53719
  }
53696
53720