codeam-cli 2.60.15 → 2.60.16

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 +561 -420
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -778,11 +778,11 @@ function quiet(fn) {
778
778
  log.debug(TAG, "ignored sync error", err);
779
779
  }
780
780
  }
781
- function rmIfExistsQuiet(path69) {
781
+ function rmIfExistsQuiet(path70) {
782
782
  try {
783
- fs2.rmSync(path69, { force: true });
783
+ fs2.rmSync(path70, { force: true });
784
784
  } catch (err) {
785
- log.debug(TAG, `rmIfExists failed for ${path69}`, err);
785
+ log.debug(TAG, `rmIfExists failed for ${path70}`, err);
786
786
  }
787
787
  }
788
788
  function killQuiet(target, signal = "SIGTERM") {
@@ -928,9 +928,9 @@ var _default = makeConfig();
928
928
  var { getConfig, ensurePluginId, addSession, removeSession, setActiveSession, getActiveSession, getActiveSessionForAgent, setDisable1mContext, clearAll, saveCliConfig, loadCliConfig } = _default;
929
929
 
930
930
  // src/commands/pair-auto.ts
931
- var fs52 = __toESM(require("fs"));
932
- var os41 = __toESM(require("os"));
933
- var path55 = __toESM(require("path"));
931
+ var fs53 = __toESM(require("fs"));
932
+ var os42 = __toESM(require("os"));
933
+ var path56 = __toESM(require("path"));
934
934
  var import_crypto4 = require("crypto");
935
935
 
936
936
  // src/services/telemetry.service.ts
@@ -966,8 +966,8 @@ function createGetModuleFromFilename(basePath = process.argv[1] ? (0, import_pat
966
966
  return decodedFile;
967
967
  };
968
968
  }
969
- function normalizeWindowsPath(path69) {
970
- return path69.replace(/^[A-Z]:/, "").replace(/\\/g, "/");
969
+ function normalizeWindowsPath(path70) {
970
+ return path70.replace(/^[A-Z]:/, "").replace(/\\/g, "/");
971
971
  }
972
972
 
973
973
  // ../../node_modules/@posthog/core/dist/featureFlagUtils.mjs
@@ -3447,9 +3447,9 @@ async function addSourceContext(frames) {
3447
3447
  LRU_FILE_CONTENTS_CACHE.reduce();
3448
3448
  return frames;
3449
3449
  }
3450
- function getContextLinesFromFile(path69, ranges, output) {
3450
+ function getContextLinesFromFile(path70, ranges, output) {
3451
3451
  return new Promise((resolve7) => {
3452
- const stream = (0, import_node_fs.createReadStream)(path69);
3452
+ const stream = (0, import_node_fs.createReadStream)(path70);
3453
3453
  const lineReaded = (0, import_node_readline.createInterface)({
3454
3454
  input: stream
3455
3455
  });
@@ -3464,7 +3464,7 @@ function getContextLinesFromFile(path69, ranges, output) {
3464
3464
  let rangeStart = range[0];
3465
3465
  let rangeEnd = range[1];
3466
3466
  function onStreamError() {
3467
- LRU_FILE_CONTENTS_FS_READ_FAILED.set(path69, 1);
3467
+ LRU_FILE_CONTENTS_FS_READ_FAILED.set(path70, 1);
3468
3468
  lineReaded.close();
3469
3469
  lineReaded.removeAllListeners();
3470
3470
  destroyStreamAndResolve();
@@ -3525,8 +3525,8 @@ function clearLineContext(frame) {
3525
3525
  delete frame.context_line;
3526
3526
  delete frame.post_context;
3527
3527
  }
3528
- function shouldSkipContextLinesForFile(path69) {
3529
- return path69.startsWith("node:") || path69.endsWith(".min.js") || path69.endsWith(".min.cjs") || path69.endsWith(".min.mjs") || path69.startsWith("data:");
3528
+ function shouldSkipContextLinesForFile(path70) {
3529
+ return path70.startsWith("node:") || path70.endsWith(".min.js") || path70.endsWith(".min.cjs") || path70.endsWith(".min.mjs") || path70.startsWith("data:");
3530
3530
  }
3531
3531
  function shouldSkipContextLinesForFrame(frame) {
3532
3532
  if (void 0 !== frame.lineno && frame.lineno > MAX_CONTEXTLINES_LINENO) return true;
@@ -5680,7 +5680,7 @@ function readAnonId() {
5680
5680
  }
5681
5681
  function superProperties() {
5682
5682
  return {
5683
- cliVersion: true ? "2.60.15" : "0.0.0-dev",
5683
+ cliVersion: true ? "2.60.16" : "0.0.0-dev",
5684
5684
  nodeVersion: process.version,
5685
5685
  platform: process.platform,
5686
5686
  arch: process.arch,
@@ -5861,7 +5861,7 @@ var os4 = __toESM(require("os"));
5861
5861
  // package.json
5862
5862
  var package_default = {
5863
5863
  name: "codeam-cli",
5864
- version: "2.60.15",
5864
+ version: "2.60.16",
5865
5865
  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.",
5866
5866
  type: "commonjs",
5867
5867
  main: "dist/index.js",
@@ -6932,7 +6932,7 @@ var CommandRelayService = class {
6932
6932
  // fresh + clear the "CLI update available" banner after a self-update
6933
6933
  // (a codespace that reinstalls @latest reconnects via heartbeat, not
6934
6934
  // pair/reconnect). Older backends ignore the extra field.
6935
- ..."2.60.15" ? { ideVersion: "2.60.15" } : {}
6935
+ ..."2.60.16" ? { ideVersion: "2.60.16" } : {}
6936
6936
  }).then(() => log.trace("relay", `heartbeat ok online=${online}`)).catch((err) => log.trace("relay", `heartbeat failed online=${online}`, err));
6937
6937
  }
6938
6938
  /**
@@ -7159,10 +7159,10 @@ var WINDOWS_LEGACY_JUNCTIONS = [
7159
7159
  /[\\/]Start Menu([\\/]|$)/i,
7160
7160
  /[\\/]Templates([\\/]|$)/i
7161
7161
  ];
7162
- function isUnsafeWindowsWatchRoot(dir, homedir39) {
7162
+ function isUnsafeWindowsWatchRoot(dir, homedir40) {
7163
7163
  const norm = (p2) => p2.replace(/\//g, "\\").replace(/\\+$/, "").toLowerCase();
7164
7164
  const cwd = norm(dir);
7165
- const home = norm(homedir39);
7165
+ const home = norm(homedir40);
7166
7166
  if (cwd === home) return true;
7167
7167
  if (/^[a-z]:$/.test(cwd)) return true;
7168
7168
  const sysRoots = [
@@ -8306,9 +8306,9 @@ function closeAllTerminals() {
8306
8306
  }
8307
8307
 
8308
8308
  // src/commands/start/handlers.ts
8309
- var fs51 = __toESM(require("fs"));
8310
- var os40 = __toESM(require("os"));
8311
- var path54 = __toESM(require("path"));
8309
+ var fs52 = __toESM(require("fs"));
8310
+ var os41 = __toESM(require("os"));
8311
+ var path55 = __toESM(require("path"));
8312
8312
  var import_crypto3 = require("crypto");
8313
8313
  var import_child_process23 = require("child_process");
8314
8314
 
@@ -9089,9 +9089,9 @@ function findGitRoot2(startDir) {
9089
9089
  }
9090
9090
 
9091
9091
  // src/commands/link.ts
9092
- var import_node_crypto6 = require("crypto");
9093
- var fs29 = __toESM(require("fs"));
9094
- var path33 = __toESM(require("path"));
9092
+ var import_node_crypto7 = require("crypto");
9093
+ var fs30 = __toESM(require("fs"));
9094
+ var path34 = __toESM(require("path"));
9095
9095
  var import_chokidar = __toESM(require("chokidar"));
9096
9096
  var import_picocolors2 = __toESM(require("picocolors"));
9097
9097
 
@@ -11738,10 +11738,10 @@ function buildForPlatform(platform3) {
11738
11738
  var import_node_crypto4 = require("crypto");
11739
11739
 
11740
11740
  // src/agents/claude/resolver.ts
11741
- function buildClaudeLaunch(extraArgs = [], os48 = createOsStrategy()) {
11742
- const found = os48.findInPath("claude") ?? os48.findInPath("claude-code");
11741
+ function buildClaudeLaunch(extraArgs = [], os49 = createOsStrategy()) {
11742
+ const found = os49.findInPath("claude") ?? os49.findInPath("claude-code");
11743
11743
  if (!found) return null;
11744
- return os48.buildLaunch(found, extraArgs);
11744
+ return os49.buildLaunch(found, extraArgs);
11745
11745
  }
11746
11746
 
11747
11747
  // src/agents/claude/installer.ts
@@ -12331,8 +12331,8 @@ var ClaudeRuntimeStrategy = class {
12331
12331
  meta = getAgent("claude");
12332
12332
  mode = "interactive";
12333
12333
  os;
12334
- constructor(os48) {
12335
- this.os = os48;
12334
+ constructor(os49) {
12335
+ this.os = os49;
12336
12336
  }
12337
12337
  /**
12338
12338
  * Claude Code's react-ink TUI enables bracketed-paste mode at
@@ -13031,8 +13031,8 @@ function codexCredentialLocator() {
13031
13031
  function codexLoginLauncher() {
13032
13032
  return {
13033
13033
  async ensureInstalled() {
13034
- const os48 = createOsStrategy();
13035
- return os48.findInPath("codex") !== null;
13034
+ const os49 = createOsStrategy();
13035
+ return os49.findInPath("codex") !== null;
13036
13036
  },
13037
13037
  launch() {
13038
13038
  return (0, import_node_child_process4.spawn)("codex", ["login"], { stdio: "inherit" });
@@ -13055,8 +13055,8 @@ var CodexRuntimeStrategy = class {
13055
13055
  meta = getAgent("codex");
13056
13056
  mode = "interactive";
13057
13057
  os;
13058
- constructor(os48) {
13059
- this.os = os48;
13058
+ constructor(os49) {
13059
+ this.os = os49;
13060
13060
  }
13061
13061
  async prepareLaunch() {
13062
13062
  let binary = this.os.findInPath("codex");
@@ -13155,12 +13155,12 @@ var CodexRuntimeStrategy = class {
13155
13155
  });
13156
13156
  }
13157
13157
  };
13158
- function resolveNpm(os48) {
13159
- return os48.id === "win32" ? "npm.cmd" : "npm";
13158
+ function resolveNpm(os49) {
13159
+ return os49.id === "win32" ? "npm.cmd" : "npm";
13160
13160
  }
13161
- async function installCodexViaNpm(os48) {
13161
+ async function installCodexViaNpm(os49) {
13162
13162
  return new Promise((resolve7, reject) => {
13163
- const proc = (0, import_node_child_process5.spawn)(resolveNpm(os48), ["install", "-g", "@openai/codex"], {
13163
+ const proc = (0, import_node_child_process5.spawn)(resolveNpm(os49), ["install", "-g", "@openai/codex"], {
13164
13164
  stdio: "inherit"
13165
13165
  });
13166
13166
  proc.on("close", (code) => {
@@ -13177,16 +13177,16 @@ async function installCodexViaNpm(os48) {
13177
13177
  });
13178
13178
  });
13179
13179
  }
13180
- function augmentNpmGlobalBin(os48) {
13180
+ function augmentNpmGlobalBin(os49) {
13181
13181
  try {
13182
- const result = (0, import_node_child_process5.spawnSync)(resolveNpm(os48), ["prefix", "-g"], {
13182
+ const result = (0, import_node_child_process5.spawnSync)(resolveNpm(os49), ["prefix", "-g"], {
13183
13183
  stdio: ["ignore", "pipe", "ignore"]
13184
13184
  });
13185
13185
  if (result.status !== 0) return;
13186
13186
  const prefix = result.stdout.toString().trim();
13187
13187
  if (!prefix) return;
13188
- const binDir = os48.id === "win32" ? prefix : path24.join(prefix, "bin");
13189
- os48.augmentPath([binDir]);
13188
+ const binDir = os49.id === "win32" ? prefix : path24.join(prefix, "bin");
13189
+ os49.augmentPath([binDir]);
13190
13190
  } catch {
13191
13191
  }
13192
13192
  }
@@ -13270,9 +13270,9 @@ var import_node_child_process8 = require("child_process");
13270
13270
  // src/agents/coderabbit/installer.ts
13271
13271
  var import_node_child_process6 = require("child_process");
13272
13272
  var INSTALL_URL = "https://cli.coderabbit.ai/install.sh";
13273
- async function ensureCoderabbitInstalled(os48) {
13274
- if (os48.findInPath("coderabbit")) return true;
13275
- if (os48.id === "win32") {
13273
+ async function ensureCoderabbitInstalled(os49) {
13274
+ if (os49.findInPath("coderabbit")) return true;
13275
+ if (os49.id === "win32") {
13276
13276
  console.error(
13277
13277
  "\n \u2717 CodeRabbit on Windows requires WSL.\n Install the CLI inside your WSL distribution\n (curl -fsSL https://cli.coderabbit.ai/install.sh | sh)\n then re-run `codeam link coderabbit` from WSL.\n"
13278
13278
  );
@@ -13287,8 +13287,8 @@ async function ensureCoderabbitInstalled(os48) {
13287
13287
  proc.on("error", () => resolve7(false));
13288
13288
  });
13289
13289
  if (!ok) return false;
13290
- os48.augmentPath([`${os48.homeDir()}/.local/bin`, "/opt/homebrew/bin"]);
13291
- return os48.findInPath("coderabbit") !== null;
13290
+ os49.augmentPath([`${os49.homeDir()}/.local/bin`, "/opt/homebrew/bin"]);
13291
+ return os49.findInPath("coderabbit") !== null;
13292
13292
  }
13293
13293
 
13294
13294
  // src/agents/coderabbit/link.ts
@@ -13323,10 +13323,10 @@ function coderabbitCredentialLocator() {
13323
13323
  validate: validateNonEmptyCredential
13324
13324
  };
13325
13325
  }
13326
- function coderabbitLoginLauncher(os48) {
13326
+ function coderabbitLoginLauncher(os49) {
13327
13327
  return {
13328
13328
  async ensureInstalled() {
13329
- return ensureCoderabbitInstalled(os48);
13329
+ return ensureCoderabbitInstalled(os49);
13330
13330
  },
13331
13331
  launch() {
13332
13332
  return (0, import_node_child_process7.spawn)("coderabbit", ["login"], { stdio: "inherit" });
@@ -13349,11 +13349,11 @@ function parseReview(stdout) {
13349
13349
  for (const line of lines) {
13350
13350
  const m = line.match(HUNK_LINE_RE);
13351
13351
  if (!m) continue;
13352
- const [, path69, lineNo, sevToken, message] = m;
13353
- if (!path69 || !lineNo || !message) continue;
13352
+ const [, path70, lineNo, sevToken, message] = m;
13353
+ if (!path70 || !lineNo || !message) continue;
13354
13354
  const cleanedMessage = message.trim().replace(/^[*-]\s+/, "");
13355
13355
  hunks.push({
13356
- path: path69.trim(),
13356
+ path: path70.trim(),
13357
13357
  line: Number(lineNo),
13358
13358
  severity: sevToken ? SEVERITY_MAP[sevToken.toLowerCase()] : void 0,
13359
13359
  message: cleanedMessage
@@ -13372,8 +13372,8 @@ var CoderabbitRuntimeStrategy = class {
13372
13372
  meta = getAgent("coderabbit");
13373
13373
  mode = "batch";
13374
13374
  os;
13375
- constructor(os48) {
13376
- this.os = os48;
13375
+ constructor(os49) {
13376
+ this.os = os49;
13377
13377
  }
13378
13378
  getDefaultArgs() {
13379
13379
  return ["review"];
@@ -13547,10 +13547,10 @@ function cursorCredentialLocator() {
13547
13547
  validate: validateNonEmptyCredential
13548
13548
  };
13549
13549
  }
13550
- function cursorLoginLauncher(os48) {
13550
+ function cursorLoginLauncher(os49) {
13551
13551
  return {
13552
13552
  async ensureInstalled() {
13553
- if (os48.findInPath("cursor-agent")) return true;
13553
+ if (os49.findInPath("cursor-agent")) return true;
13554
13554
  console.error(
13555
13555
  "\n \u2717 cursor-agent binary not on PATH.\n Install Cursor (https://cursor.com/) and ensure the CLI\n plugin is enabled, then re-run `codeam link cursor`.\n"
13556
13556
  );
@@ -13612,8 +13612,8 @@ var CursorRuntimeStrategy = class {
13612
13612
  meta = getAgent("cursor");
13613
13613
  mode = "interactive";
13614
13614
  os;
13615
- constructor(os48) {
13616
- this.os = os48;
13615
+ constructor(os49) {
13616
+ this.os = os49;
13617
13617
  }
13618
13618
  async prepareLaunch() {
13619
13619
  const binary = this.os.findInPath("cursor-agent");
@@ -13759,10 +13759,10 @@ function aiderCredentialLocator() {
13759
13759
  validate: validateNonEmptyCredential
13760
13760
  };
13761
13761
  }
13762
- function aiderLoginLauncher(os48) {
13762
+ function aiderLoginLauncher(os49) {
13763
13763
  return {
13764
13764
  async ensureInstalled() {
13765
- if (os48.findInPath("aider")) return true;
13765
+ if (os49.findInPath("aider")) return true;
13766
13766
  console.error(
13767
13767
  "\n \u2717 aider binary not on PATH.\n Install Aider:\n pip install aider-chat\n then re-run `codeam link aider`.\n"
13768
13768
  );
@@ -13772,7 +13772,7 @@ function aiderLoginLauncher(os48) {
13772
13772
  console.error(
13773
13773
  "\n Aider has no interactive login flow.\n Set ANTHROPIC_API_KEY or OPENAI_API_KEY in your shell,\n or re-run `codeam link aider --api-key=<your-key>`.\n"
13774
13774
  );
13775
- return (0, import_node_child_process10.spawn)(os48.id === "win32" ? "cmd.exe" : "sh", os48.id === "win32" ? ["/c", "exit", "0"] : ["-c", "exit 0"], {
13775
+ return (0, import_node_child_process10.spawn)(os49.id === "win32" ? "cmd.exe" : "sh", os49.id === "win32" ? ["/c", "exit", "0"] : ["-c", "exit 0"], {
13776
13776
  stdio: "ignore"
13777
13777
  });
13778
13778
  }
@@ -13844,8 +13844,8 @@ var AiderRuntimeStrategy = class {
13844
13844
  meta = getAgent("aider");
13845
13845
  mode = "interactive";
13846
13846
  os;
13847
- constructor(os48) {
13848
- this.os = os48;
13847
+ constructor(os49) {
13848
+ this.os = os49;
13849
13849
  }
13850
13850
  async prepareLaunch() {
13851
13851
  const binary = this.os.findInPath("aider");
@@ -13977,8 +13977,8 @@ function geminiCredentialLocator() {
13977
13977
  function geminiLoginLauncher() {
13978
13978
  return {
13979
13979
  async ensureInstalled() {
13980
- const os48 = createOsStrategy();
13981
- return os48.findInPath("gemini") !== null;
13980
+ const os49 = createOsStrategy();
13981
+ return os49.findInPath("gemini") !== null;
13982
13982
  },
13983
13983
  launch() {
13984
13984
  return (0, import_node_child_process11.spawn)("gemini", ["auth", "login"], { stdio: "inherit" });
@@ -14168,8 +14168,8 @@ var GeminiRuntimeStrategy = class {
14168
14168
  meta = getAgent("gemini");
14169
14169
  mode = "interactive";
14170
14170
  os;
14171
- constructor(os48) {
14172
- this.os = os48;
14171
+ constructor(os49) {
14172
+ this.os = os49;
14173
14173
  }
14174
14174
  async prepareLaunch() {
14175
14175
  const binary = this.os.findInPath("gemini");
@@ -14280,6 +14280,135 @@ var GeminiRuntimeStrategy = class {
14280
14280
  var import_node_child_process12 = require("child_process");
14281
14281
  var import_node_os3 = require("os");
14282
14282
  var import_node_path4 = require("path");
14283
+
14284
+ // src/agents/kimi/history.ts
14285
+ var fs29 = __toESM(require("fs"));
14286
+ var os26 = __toESM(require("os"));
14287
+ var path33 = __toESM(require("path"));
14288
+ var import_node_crypto6 = require("crypto");
14289
+ function kimiHome() {
14290
+ return process.env.KIMI_CODE_HOME || path33.join(os26.homedir(), ".kimi-code");
14291
+ }
14292
+ function workDirKey(cwd) {
14293
+ const hash = (0, import_node_crypto6.createHash)("sha256").update(cwd).digest("hex").slice(0, 12);
14294
+ return `wd_${path33.basename(cwd)}_${hash}`;
14295
+ }
14296
+ function resolveHistoryDir6(cwd) {
14297
+ const dir = path33.join(kimiHome(), "sessions", workDirKey(cwd));
14298
+ if (!fs29.existsSync(dir)) {
14299
+ log.debug("kimi", `resolveHistoryDir \u2014 session bucket not present yet: ${dir}`);
14300
+ return null;
14301
+ }
14302
+ return dir;
14303
+ }
14304
+ var WIRE_REL = path33.join("agents", "main", "wire.jsonl");
14305
+ function resolveHistoryFile5(cwd, sessionId) {
14306
+ const fromIndex = sessionDirFromIndex(sessionId);
14307
+ if (fromIndex) {
14308
+ const p2 = path33.join(fromIndex, WIRE_REL);
14309
+ if (fs29.existsSync(p2)) return p2;
14310
+ }
14311
+ const bucket = path33.join(kimiHome(), "sessions", workDirKey(cwd));
14312
+ const computed = path33.join(bucket, sessionId, WIRE_REL);
14313
+ if (fs29.existsSync(computed)) return computed;
14314
+ const scanned = scanBucketsForSession(sessionId);
14315
+ if (scanned) return scanned;
14316
+ return null;
14317
+ }
14318
+ function sessionDirFromIndex(sessionId) {
14319
+ try {
14320
+ const raw = fs29.readFileSync(path33.join(kimiHome(), "session_index.jsonl"), "utf8");
14321
+ for (const line of raw.split("\n")) {
14322
+ if (!line.includes(sessionId)) continue;
14323
+ try {
14324
+ const rec = JSON.parse(line);
14325
+ if (rec.sessionId === sessionId && typeof rec.sessionDir === "string") {
14326
+ return rec.sessionDir;
14327
+ }
14328
+ } catch {
14329
+ }
14330
+ }
14331
+ } catch {
14332
+ }
14333
+ return null;
14334
+ }
14335
+ function scanBucketsForSession(sessionId) {
14336
+ const sessionsRoot = path33.join(kimiHome(), "sessions");
14337
+ let buckets;
14338
+ try {
14339
+ buckets = fs29.readdirSync(sessionsRoot, { withFileTypes: true });
14340
+ } catch {
14341
+ return null;
14342
+ }
14343
+ for (const b of buckets) {
14344
+ if (!b.isDirectory()) continue;
14345
+ const candidate = path33.join(sessionsRoot, b.name, sessionId, WIRE_REL);
14346
+ if (fs29.existsSync(candidate)) return candidate;
14347
+ }
14348
+ return null;
14349
+ }
14350
+ function joinTextParts(parts) {
14351
+ if (!Array.isArray(parts)) return "";
14352
+ return parts.filter((p2) => p2 && p2.type === "text" && typeof p2.text === "string").map((p2) => p2.text).join("").trim();
14353
+ }
14354
+ function parseHistoryFile6(filePath) {
14355
+ let raw;
14356
+ try {
14357
+ raw = fs29.readFileSync(filePath, "utf8");
14358
+ } catch {
14359
+ return [];
14360
+ }
14361
+ const out2 = [];
14362
+ let idx = 0;
14363
+ let assistantBuf = "";
14364
+ let assistantTime = 0;
14365
+ const flushAssistant = () => {
14366
+ const text = assistantBuf.trim();
14367
+ if (text) {
14368
+ out2.push({
14369
+ id: `kimi:${idx}`,
14370
+ role: "agent",
14371
+ text,
14372
+ timestamp: new Date(assistantTime || 0).toISOString()
14373
+ });
14374
+ idx += 1;
14375
+ }
14376
+ assistantBuf = "";
14377
+ assistantTime = 0;
14378
+ };
14379
+ for (const line of raw.split("\n")) {
14380
+ if (!line.trim()) continue;
14381
+ let rec;
14382
+ try {
14383
+ rec = JSON.parse(line);
14384
+ } catch {
14385
+ continue;
14386
+ }
14387
+ if (rec.type === "turn.prompt") {
14388
+ flushAssistant();
14389
+ const text = joinTextParts(rec.input);
14390
+ if (text) {
14391
+ out2.push({
14392
+ id: `kimi:${idx}`,
14393
+ role: "user",
14394
+ text,
14395
+ timestamp: new Date(rec.time || 0).toISOString()
14396
+ });
14397
+ idx += 1;
14398
+ }
14399
+ } else if (rec.type === "context.append_loop_event" && rec.event?.type === "content.part" && rec.event.part?.type === "text" && typeof rec.event.part.text === "string") {
14400
+ assistantBuf += rec.event.part.text;
14401
+ if (!assistantTime) assistantTime = rec.time || 0;
14402
+ }
14403
+ }
14404
+ flushAssistant();
14405
+ return out2;
14406
+ }
14407
+ function getCurrentUsage5(_historyDir) {
14408
+ return null;
14409
+ }
14410
+
14411
+ // src/agents/kimi/runtime.ts
14283
14412
  var KIMI_CONTEXT_WINDOW = 262144;
14284
14413
  var KIMI_MODELS = [
14285
14414
  { id: "kimi-for-coding", label: "Kimi for Coding", contextWindow: KIMI_CONTEXT_WINDOW }
@@ -14293,8 +14422,8 @@ var KimiRuntimeStrategy = class {
14293
14422
  meta = getAgent("kimi");
14294
14423
  mode = "interactive";
14295
14424
  os;
14296
- constructor(os48) {
14297
- this.os = os48;
14425
+ constructor(os49) {
14426
+ this.os = os49;
14298
14427
  }
14299
14428
  async prepareLaunch() {
14300
14429
  const binary = this.os.findInPath("kimi");
@@ -14306,17 +14435,29 @@ var KimiRuntimeStrategy = class {
14306
14435
  const launch = this.os.buildLaunch(binary, []);
14307
14436
  return { cmd: launch.cmd, args: launch.args };
14308
14437
  }
14309
- resumeLaunchArgs(_sessionId, _opts) {
14310
- return [];
14438
+ /** Re-attach the same conversation on baton hand-back — kimi resumes a session
14439
+ * by id with `kimi -S <id>` (`-S, --session [id]`). */
14440
+ resumeLaunchArgs(sessionId, _opts) {
14441
+ return ["-S", sessionId];
14311
14442
  }
14312
- resolveHistoryDir(_cwd) {
14313
- return null;
14443
+ resolveHistoryDir(cwd) {
14444
+ return resolveHistoryDir6(cwd);
14314
14445
  }
14315
- parseHistoryFile(_filePath) {
14316
- return [];
14446
+ /**
14447
+ * `<KIMI_CODE_HOME>/sessions/wd_<key>/<sessionId>/agents/main/wire.jsonl`.
14448
+ * Implementing this is what lets the baton engage for Kimi
14449
+ * (`runtimeSupportsBaton`), so LOCAL_DRIVE can tail the transcript and Take
14450
+ * Control resumes the SAME conversation over ACP `session/load` — verified
14451
+ * live: `kimi acp` advertises `loadSession:true`.
14452
+ */
14453
+ resolveHistoryFile(cwd, sessionId) {
14454
+ return resolveHistoryFile5(cwd, sessionId);
14317
14455
  }
14318
- getCurrentUsage(_historyDir) {
14319
- return null;
14456
+ parseHistoryFile(filePath) {
14457
+ return parseHistoryFile6(filePath);
14458
+ }
14459
+ getCurrentUsage(historyDir) {
14460
+ return getCurrentUsage5(historyDir);
14320
14461
  }
14321
14462
  async fetchWeeklyUsage() {
14322
14463
  return null;
@@ -14383,19 +14524,19 @@ var KimiRuntimeStrategy = class {
14383
14524
 
14384
14525
  // src/agents/registry.ts
14385
14526
  var runtimeBuilders = {
14386
- claude: (os48) => new ClaudeRuntimeStrategy(os48),
14387
- codex: (os48) => new CodexRuntimeStrategy(os48),
14388
- coderabbit: (os48) => new CoderabbitRuntimeStrategy(os48),
14389
- cursor: (os48) => new CursorRuntimeStrategy(os48),
14390
- aider: (os48) => new AiderRuntimeStrategy(os48),
14391
- gemini: (os48) => new GeminiRuntimeStrategy(os48),
14392
- kimi: (os48) => new KimiRuntimeStrategy(os48)
14527
+ claude: (os49) => new ClaudeRuntimeStrategy(os49),
14528
+ codex: (os49) => new CodexRuntimeStrategy(os49),
14529
+ coderabbit: (os49) => new CoderabbitRuntimeStrategy(os49),
14530
+ cursor: (os49) => new CursorRuntimeStrategy(os49),
14531
+ aider: (os49) => new AiderRuntimeStrategy(os49),
14532
+ gemini: (os49) => new GeminiRuntimeStrategy(os49),
14533
+ kimi: (os49) => new KimiRuntimeStrategy(os49)
14393
14534
  };
14394
14535
  var deployBuilders = {
14395
14536
  claude: () => new ClaudeDeployStrategy(),
14396
14537
  codex: () => new CodexDeployStrategy()
14397
14538
  };
14398
- function createAgentStrategy(agent, os48 = createOsStrategy()) {
14539
+ function createAgentStrategy(agent, os49 = createOsStrategy()) {
14399
14540
  if (!AGENT_REGISTRY[agent]?.enabled) {
14400
14541
  throw new Error(
14401
14542
  `Agent "${agent}" is not supported in this codeam-cli version. Upgrade with 'npm i -g codeam-cli@latest'.`
@@ -14405,10 +14546,10 @@ function createAgentStrategy(agent, os48 = createOsStrategy()) {
14405
14546
  if (!build) {
14406
14547
  throw new Error(`No runtime strategy registered for agent "${agent}"`);
14407
14548
  }
14408
- return build(os48);
14549
+ return build(os49);
14409
14550
  }
14410
- function createInteractiveAgentStrategy(agent, os48 = createOsStrategy()) {
14411
- const s = createAgentStrategy(agent, os48);
14551
+ function createInteractiveAgentStrategy(agent, os49 = createOsStrategy()) {
14552
+ const s = createAgentStrategy(agent, os49);
14412
14553
  if (s.mode !== "interactive") {
14413
14554
  throw new Error(
14414
14555
  `Agent "${agent}" is a batch agent; use createAgentStrategy + .runOneShot for one-shot reviews.`
@@ -14464,7 +14605,7 @@ function parseLinkArgs(args2) {
14464
14605
  if (apiKeyFileArg) {
14465
14606
  const filePath = apiKeyFileArg.slice("--api-key-file=".length);
14466
14607
  try {
14467
- apiKey = fs29.readFileSync(path33.resolve(filePath), "utf8").trim();
14608
+ apiKey = fs30.readFileSync(path34.resolve(filePath), "utf8").trim();
14468
14609
  } catch (err) {
14469
14610
  throw new Error(`Could not read --api-key-file ${filePath}: ${err.message}`);
14470
14611
  }
@@ -14491,9 +14632,9 @@ async function link(args2 = []) {
14491
14632
  await linkDryRunPreflight(ctx);
14492
14633
  return;
14493
14634
  }
14494
- const pluginId = (0, import_node_crypto6.randomUUID)();
14495
- const pollSecret = (0, import_node_crypto6.randomBytes)(32).toString("base64url");
14496
- const pluginSecretHash = (0, import_node_crypto6.createHash)("sha256").update(pollSecret).digest("hex");
14635
+ const pluginId = (0, import_node_crypto7.randomUUID)();
14636
+ const pollSecret = (0, import_node_crypto7.randomBytes)(32).toString("base64url");
14637
+ const pluginSecretHash = (0, import_node_crypto7.createHash)("sha256").update(pollSecret).digest("hex");
14497
14638
  const spin = dist_exports.spinner();
14498
14639
  spin.start("Requesting pairing code...");
14499
14640
  const pairing = await requestCode(pluginId, pluginSecretHash);
@@ -14591,7 +14732,7 @@ async function link(args2 = []) {
14591
14732
  return;
14592
14733
  }
14593
14734
  if (parsed.tokenFile) {
14594
- const credential = fs29.readFileSync(path33.resolve(parsed.tokenFile), "utf8").trim();
14735
+ const credential = fs30.readFileSync(path34.resolve(parsed.tokenFile), "utf8").trim();
14595
14736
  if (!credential) {
14596
14737
  showError(`--token-file ${parsed.tokenFile} is empty.`);
14597
14738
  process.exit(1);
@@ -14809,14 +14950,14 @@ async function linkDryRunPreflight(ctx) {
14809
14950
 
14810
14951
  // src/commands/host-agent.ts
14811
14952
  var import_node_child_process20 = require("child_process");
14812
- var os33 = __toESM(require("os"));
14813
- var fs39 = __toESM(require("fs"));
14814
- var path41 = __toESM(require("path"));
14953
+ var os34 = __toESM(require("os"));
14954
+ var fs40 = __toESM(require("fs"));
14955
+ var path42 = __toESM(require("path"));
14815
14956
 
14816
14957
  // src/commands/host/host-client.ts
14817
- var fs31 = __toESM(require("fs"));
14818
- var os27 = __toESM(require("os"));
14819
- var path34 = __toESM(require("path"));
14958
+ var fs32 = __toESM(require("fs"));
14959
+ var os28 = __toESM(require("os"));
14960
+ var path35 = __toESM(require("path"));
14820
14961
 
14821
14962
  // src/lib/restrict-to-owner.ts
14822
14963
  var import_node_fs5 = __toESM(require("fs"));
@@ -14855,7 +14996,7 @@ function restrictToOwner(filePath) {
14855
14996
  function sampleCpuTimes() {
14856
14997
  let idle = 0;
14857
14998
  let total = 0;
14858
- for (const cpu of os27.cpus()) {
14999
+ for (const cpu of os28.cpus()) {
14859
15000
  const t2 = cpu.times;
14860
15001
  idle += t2.idle;
14861
15002
  total += t2.user + t2.nice + t2.sys + t2.idle + t2.irq;
@@ -14874,8 +15015,8 @@ var MetricsCollector = class {
14874
15015
  const prev = this.prevCpu;
14875
15016
  this.prevCpu = current;
14876
15017
  if (!prev) {
14877
- const cores = os27.cpus().length || 1;
14878
- const proxy = os27.loadavg()[0] / cores * 100;
15018
+ const cores = os28.cpus().length || 1;
15019
+ const proxy = os28.loadavg()[0] / cores * 100;
14879
15020
  return Math.min(100, Math.max(0, Math.round(proxy)));
14880
15021
  }
14881
15022
  const idleDelta = current.idle - prev.idle;
@@ -14888,8 +15029,8 @@ var MetricsCollector = class {
14888
15029
  collect() {
14889
15030
  return {
14890
15031
  cpuPct: this.cpuPct(),
14891
- ramUsedMb: Math.round((os27.totalmem() - os27.freemem()) / 1048576),
14892
- ramTotalMb: Math.round(os27.totalmem() / 1048576),
15032
+ ramUsedMb: Math.round((os28.totalmem() - os28.freemem()) / 1048576),
15033
+ ramTotalMb: Math.round(os28.totalmem() / 1048576),
14893
15034
  latencyMs: this.lastLatencyMs
14894
15035
  };
14895
15036
  }
@@ -14898,19 +15039,19 @@ function apiBase() {
14898
15039
  return process.env.CODEAM_API_URL ?? resolveApiBaseUrl();
14899
15040
  }
14900
15041
  function hostIdentityPath() {
14901
- return path34.join(os27.homedir(), ".codeam", "host-agent.json");
15042
+ return path35.join(os28.homedir(), ".codeam", "host-agent.json");
14902
15043
  }
14903
15044
  function collectOsInfo() {
14904
15045
  return {
14905
- distro: os27.platform(),
14906
- arch: os27.arch(),
14907
- kernel: os27.release(),
15046
+ distro: os28.platform(),
15047
+ arch: os28.arch(),
15048
+ kernel: os28.release(),
14908
15049
  nodeVersion: process.versions.node
14909
15050
  };
14910
15051
  }
14911
15052
  function loadHostIdentity() {
14912
15053
  try {
14913
- const raw = fs31.readFileSync(hostIdentityPath(), "utf8");
15054
+ const raw = fs32.readFileSync(hostIdentityPath(), "utf8");
14914
15055
  const parsed = JSON.parse(raw);
14915
15056
  if (typeof parsed === "object" && parsed !== null && typeof parsed.hostId === "string" && typeof parsed.hostToken === "string" && typeof parsed.controlPluginId === "string") {
14916
15057
  const p2 = parsed;
@@ -14923,8 +15064,8 @@ function loadHostIdentity() {
14923
15064
  }
14924
15065
  function saveHostIdentity(identity) {
14925
15066
  const file = hostIdentityPath();
14926
- fs31.mkdirSync(path34.dirname(file), { recursive: true, mode: 448 });
14927
- fs31.writeFileSync(file, JSON.stringify(identity, null, 2), {
15067
+ fs32.mkdirSync(path35.dirname(file), { recursive: true, mode: 448 });
15068
+ fs32.writeFileSync(file, JSON.stringify(identity, null, 2), {
14928
15069
  encoding: "utf8",
14929
15070
  mode: 384
14930
15071
  });
@@ -14969,7 +15110,7 @@ function isTerminalEnrollError(err) {
14969
15110
  }
14970
15111
  function deleteHostIdentity() {
14971
15112
  try {
14972
- fs31.rmSync(hostIdentityPath(), { force: true });
15113
+ fs32.rmSync(hostIdentityPath(), { force: true });
14973
15114
  } catch {
14974
15115
  }
14975
15116
  }
@@ -15092,17 +15233,17 @@ async function reportDeployProgress(auth, deployId, step, message, sessionId) {
15092
15233
  }
15093
15234
 
15094
15235
  // src/commands/host/workspace.ts
15095
- var fs32 = __toESM(require("fs"));
15096
- var os28 = __toESM(require("os"));
15097
- var path35 = __toESM(require("path"));
15236
+ var fs33 = __toESM(require("fs"));
15237
+ var os29 = __toESM(require("os"));
15238
+ var path36 = __toESM(require("path"));
15098
15239
  var import_node_child_process14 = require("child_process");
15099
15240
  var import_node_util4 = require("util");
15100
15241
  var execFileP4 = (0, import_node_util4.promisify)(import_node_child_process14.execFile);
15101
15242
  function isAbsolutePathTarget(target) {
15102
- return path35.isAbsolute(target);
15243
+ return path36.isAbsolute(target);
15103
15244
  }
15104
15245
  function selfHostedWorkspaceRoot() {
15105
- return path35.join(os28.homedir(), ".codeam", "self-hosted");
15246
+ return path36.join(os29.homedir(), ".codeam", "self-hosted");
15106
15247
  }
15107
15248
  function nonInteractiveGitEnv() {
15108
15249
  return {
@@ -15155,13 +15296,13 @@ async function fetchGithubIdentity(token) {
15155
15296
  async function configureGitCredentials(dest, repoRef, cloneToken) {
15156
15297
  const gh = githubOwnerRepo(repoRef.trim());
15157
15298
  if (!gh || !cloneToken) return;
15158
- const credFile = path35.join(dest, ".git", "codeam-credentials");
15159
- fs32.writeFileSync(credFile, `https://x-access-token:${cloneToken}@github.com
15299
+ const credFile = path36.join(dest, ".git", "codeam-credentials");
15300
+ fs33.writeFileSync(credFile, `https://x-access-token:${cloneToken}@github.com
15160
15301
  `, { mode: 384 });
15161
15302
  restrictToOwner(credFile);
15162
15303
  const env = nonInteractiveGitEnv();
15163
15304
  const git2 = (args2) => execFileP4("git", ["-C", dest, ...args2], { timeout: 3e4, env });
15164
- const credFilePosix = credFile.split(path35.sep).join("/");
15305
+ const credFilePosix = credFile.split(path36.sep).join("/");
15165
15306
  await git2(["config", "--local", "--replace-all", "credential.helper", ""]).catch(() => {
15166
15307
  });
15167
15308
  await git2([
@@ -15197,17 +15338,17 @@ function maskToken(text, cloneToken) {
15197
15338
  }
15198
15339
  async function prepareWorkspace(repoOrPath, deployId, cloneToken) {
15199
15340
  if (isAbsolutePathTarget(repoOrPath)) {
15200
- if (!fs32.existsSync(repoOrPath)) {
15341
+ if (!fs33.existsSync(repoOrPath)) {
15201
15342
  throw new Error(`deploy target path does not exist: ${repoOrPath}`);
15202
15343
  }
15203
15344
  return repoOrPath;
15204
15345
  }
15205
- const dest = path35.join(selfHostedWorkspaceRoot(), deployId);
15206
- if (fs32.existsSync(path35.join(dest, ".git"))) {
15346
+ const dest = path36.join(selfHostedWorkspaceRoot(), deployId);
15347
+ if (fs33.existsSync(path36.join(dest, ".git"))) {
15207
15348
  if (cloneToken) await configureGitCredentials(dest, repoOrPath, cloneToken);
15208
15349
  return dest;
15209
15350
  }
15210
- fs32.mkdirSync(selfHostedWorkspaceRoot(), { recursive: true, mode: 448 });
15351
+ fs33.mkdirSync(selfHostedWorkspaceRoot(), { recursive: true, mode: 448 });
15211
15352
  const cloneUrl = repoCloneUrl(repoOrPath, cloneToken);
15212
15353
  try {
15213
15354
  await execFileP4("git", ["clone", "--depth", "1", cloneUrl, dest], {
@@ -15224,9 +15365,9 @@ async function prepareWorkspace(repoOrPath, deployId, cloneToken) {
15224
15365
  }
15225
15366
 
15226
15367
  // src/commands/host/agent-provisioning.ts
15227
- var fs33 = __toESM(require("fs"));
15228
- var os29 = __toESM(require("os"));
15229
- var path36 = __toESM(require("path"));
15368
+ var fs34 = __toESM(require("fs"));
15369
+ var os30 = __toESM(require("os"));
15370
+ var path37 = __toESM(require("path"));
15230
15371
  var PUBLIC_TO_INTERNAL_AGENT = {
15231
15372
  claude_code: "claude",
15232
15373
  claude: "claude",
@@ -15242,22 +15383,22 @@ function toInternalAgentId(publicAgentId) {
15242
15383
  return PUBLIC_TO_INTERNAL_AGENT[publicAgentId] ?? null;
15243
15384
  }
15244
15385
  function ensureDir(dir) {
15245
- fs33.mkdirSync(dir, { recursive: true, mode: 448 });
15386
+ fs34.mkdirSync(dir, { recursive: true, mode: 448 });
15246
15387
  }
15247
15388
  function writeFile0600(filePath, contents) {
15248
- ensureDir(path36.dirname(filePath));
15249
- fs33.writeFileSync(filePath, contents, { encoding: "utf8", mode: 384 });
15389
+ ensureDir(path37.dirname(filePath));
15390
+ fs34.writeFileSync(filePath, contents, { encoding: "utf8", mode: 384 });
15250
15391
  restrictToOwner(filePath);
15251
15392
  }
15252
15393
  function rmIfExists(filePath) {
15253
15394
  try {
15254
- fs33.rmSync(filePath, { force: true });
15395
+ fs34.rmSync(filePath, { force: true });
15255
15396
  } catch {
15256
15397
  }
15257
15398
  }
15258
15399
  var claudeProvisioner = {
15259
15400
  write(auth, home) {
15260
- const credentialsJson = path36.join(home, ".claude", ".credentials.json");
15401
+ const credentialsJson = path37.join(home, ".claude", ".credentials.json");
15261
15402
  if (auth.kind === "api_key") {
15262
15403
  rmIfExists(credentialsJson);
15263
15404
  return { ANTHROPIC_API_KEY: auth.value };
@@ -15269,8 +15410,8 @@ var claudeProvisioner = {
15269
15410
  } else {
15270
15411
  rmIfExists(credentialsJson);
15271
15412
  }
15272
- const claudeJson = path36.join(home, ".claude.json");
15273
- if (!fs33.existsSync(claudeJson)) {
15413
+ const claudeJson = path37.join(home, ".claude.json");
15414
+ if (!fs34.existsSync(claudeJson)) {
15274
15415
  writeFile0600(
15275
15416
  claudeJson,
15276
15417
  JSON.stringify({ hasCompletedOnboarding: true, customApiKeyResponses: { approved: [] } })
@@ -15281,7 +15422,7 @@ var claudeProvisioner = {
15281
15422
  };
15282
15423
  var codexProvisioner = {
15283
15424
  write(auth, home) {
15284
- const authJson = path36.join(home, ".codex", "auth.json");
15425
+ const authJson = path37.join(home, ".codex", "auth.json");
15285
15426
  if (auth.kind === "api_key") {
15286
15427
  rmIfExists(authJson);
15287
15428
  return { OPENAI_API_KEY: auth.value };
@@ -15292,8 +15433,8 @@ var codexProvisioner = {
15292
15433
  };
15293
15434
  var geminiProvisioner = {
15294
15435
  write(auth, home) {
15295
- const settingsJson = path36.join(home, ".gemini", "settings.json");
15296
- const oauthCreds = path36.join(home, ".gemini", "oauth_creds.json");
15436
+ const settingsJson = path37.join(home, ".gemini", "settings.json");
15437
+ const oauthCreds = path37.join(home, ".gemini", "oauth_creds.json");
15297
15438
  if (auth.kind === "api_key") {
15298
15439
  rmIfExists(oauthCreds);
15299
15440
  writeFile0600(settingsJson, '{"security":{"auth":{"selectedType":"gemini-api-key"}}}');
@@ -15306,7 +15447,7 @@ var geminiProvisioner = {
15306
15447
  };
15307
15448
  var cursorProvisioner = {
15308
15449
  write(auth, home) {
15309
- const authJson = path36.join(home, ".config", "cursor", "auth.json");
15450
+ const authJson = path37.join(home, ".config", "cursor", "auth.json");
15310
15451
  if (auth.kind === "api_key") {
15311
15452
  rmIfExists(authJson);
15312
15453
  return { CURSOR_API_KEY: auth.value };
@@ -15332,8 +15473,8 @@ var cursorProvisioner = {
15332
15473
  var kimiProvisioner = {
15333
15474
  write(auth, home) {
15334
15475
  const credentialsFiles = [
15335
- path36.join(home, ".kimi", "credentials", "kimi-code.json"),
15336
- path36.join(home, ".kimi-code", "credentials", "kimi-code.json")
15476
+ path37.join(home, ".kimi", "credentials", "kimi-code.json"),
15477
+ path37.join(home, ".kimi-code", "credentials", "kimi-code.json")
15337
15478
  ];
15338
15479
  if (auth.kind === "api_key") {
15339
15480
  credentialsFiles.forEach(rmIfExists);
@@ -15358,7 +15499,7 @@ var UnsupportedAgentError = class extends Error {
15358
15499
  this.agentId = agentId;
15359
15500
  }
15360
15501
  };
15361
- function provisionAgentCredentials(publicAgentId, auth, homeDir2 = os29.homedir()) {
15502
+ function provisionAgentCredentials(publicAgentId, auth, homeDir2 = os30.homedir()) {
15362
15503
  const internal = toInternalAgentId(publicAgentId);
15363
15504
  if (!internal) throw new UnsupportedAgentError(publicAgentId);
15364
15505
  const provisioner = PROVISIONERS[internal];
@@ -15368,11 +15509,11 @@ function provisionAgentCredentials(publicAgentId, auth, homeDir2 = os29.homedir(
15368
15509
 
15369
15510
  // src/commands/host/git-tooling.ts
15370
15511
  var import_node_child_process15 = require("child_process");
15371
- var fs34 = __toESM(require("fs"));
15372
- var os30 = __toESM(require("os"));
15373
- var path37 = __toESM(require("path"));
15512
+ var fs35 = __toESM(require("fs"));
15513
+ var os31 = __toESM(require("os"));
15514
+ var path38 = __toESM(require("path"));
15374
15515
  function codeamBinDir() {
15375
- return process.env.CODEAM_BIN_DIR ?? path37.join(os30.homedir(), ".codeam", "bin");
15516
+ return process.env.CODEAM_BIN_DIR ?? path38.join(os31.homedir(), ".codeam", "bin");
15376
15517
  }
15377
15518
  var FALLBACK_GH_VERSION = "2.62.0";
15378
15519
  var RELEASE_API = "https://api.github.com/repos/cli/cli/releases/latest";
@@ -15404,7 +15545,7 @@ async function download(url, dest) {
15404
15545
  const res = await fetch(url, { headers: { "User-Agent": "codeam-cli" } });
15405
15546
  if (!res.ok || !res.body) return false;
15406
15547
  const buf = Buffer.from(await res.arrayBuffer());
15407
- fs34.writeFileSync(dest, buf);
15548
+ fs35.writeFileSync(dest, buf);
15408
15549
  return true;
15409
15550
  } catch {
15410
15551
  return false;
@@ -15427,8 +15568,8 @@ async function ensureGhCli(runner, token, deps = {}) {
15427
15568
  const version3 = await resolveVersionFn(token);
15428
15569
  const asset = `gh_${version3}_${osToken}_${arch2}`;
15429
15570
  const url = `https://github.com/cli/cli/releases/download/v${version3}/${asset}.${ext}`;
15430
- const tmpRoot = fs34.mkdtempSync(path37.join(os30.tmpdir(), "codeam-gh-"));
15431
- const archive = path37.join(tmpRoot, `${asset}.${ext}`);
15571
+ const tmpRoot = fs35.mkdtempSync(path38.join(os31.tmpdir(), "codeam-gh-"));
15572
+ const archive = path38.join(tmpRoot, `${asset}.${ext}`);
15432
15573
  if (!await downloadFn(url, archive)) {
15433
15574
  log.warn("host-agent", "gh download failed \u2014 skipping (git pull/push still work via the credential helper)");
15434
15575
  return null;
@@ -15438,16 +15579,16 @@ async function ensureGhCli(runner, token, deps = {}) {
15438
15579
  log.warn("host-agent", `gh archive extraction failed (code=${String(extract.code)}) \u2014 skipping`);
15439
15580
  return null;
15440
15581
  }
15441
- const extractedBin = path37.join(tmpRoot, asset, "bin", binaryName);
15442
- if (!fs34.existsSync(extractedBin)) {
15582
+ const extractedBin = path38.join(tmpRoot, asset, "bin", binaryName);
15583
+ if (!fs35.existsSync(extractedBin)) {
15443
15584
  log.warn("host-agent", "gh binary not found in the extracted archive \u2014 skipping");
15444
15585
  return null;
15445
15586
  }
15446
15587
  const binDir = codeamBinDir();
15447
- fs34.mkdirSync(binDir, { recursive: true });
15448
- const target = path37.join(binDir, binaryName);
15449
- fs34.copyFileSync(extractedBin, target);
15450
- fs34.chmodSync(target, 493);
15588
+ fs35.mkdirSync(binDir, { recursive: true });
15589
+ const target = path38.join(binDir, binaryName);
15590
+ fs35.copyFileSync(extractedBin, target);
15591
+ fs35.chmodSync(target, 493);
15451
15592
  log.info("host-agent", `gh installed to ${target} (v${version3})`);
15452
15593
  return target;
15453
15594
  } catch (e) {
@@ -15934,23 +16075,23 @@ async function ensureModernPython(runner) {
15934
16075
  }
15935
16076
 
15936
16077
  // src/commands/host/headroom-bootstrap.ts
15937
- var fs36 = __toESM(require("fs"));
15938
- var path39 = __toESM(require("path"));
16078
+ var fs37 = __toESM(require("fs"));
16079
+ var path40 = __toESM(require("path"));
15939
16080
 
15940
16081
  // src/commands/host/headroom-config.ts
15941
- var fs35 = __toESM(require("fs"));
15942
- var os31 = __toESM(require("os"));
15943
- var path38 = __toESM(require("path"));
16082
+ var fs36 = __toESM(require("fs"));
16083
+ var os32 = __toESM(require("os"));
16084
+ var path39 = __toESM(require("path"));
15944
16085
  function headroomConfigPath() {
15945
- return path38.join(os31.homedir(), ".codeam", "headroom-config.json");
16086
+ return path39.join(os32.homedir(), ".codeam", "headroom-config.json");
15946
16087
  }
15947
16088
  function persistHeadroomConfig(config) {
15948
16089
  try {
15949
16090
  const file = headroomConfigPath();
15950
- fs35.mkdirSync(path38.dirname(file), { recursive: true, mode: 448 });
16091
+ fs36.mkdirSync(path39.dirname(file), { recursive: true, mode: 448 });
15951
16092
  const tmp = `${file}.tmp-${process.pid}`;
15952
- fs35.writeFileSync(tmp, JSON.stringify(config, null, 2), { encoding: "utf8", mode: 384 });
15953
- fs35.renameSync(tmp, file);
16093
+ fs36.writeFileSync(tmp, JSON.stringify(config, null, 2), { encoding: "utf8", mode: 384 });
16094
+ fs36.renameSync(tmp, file);
15954
16095
  restrictToOwner(file);
15955
16096
  } catch (err) {
15956
16097
  log.warn(
@@ -15960,21 +16101,21 @@ function persistHeadroomConfig(config) {
15960
16101
  }
15961
16102
  }
15962
16103
  function agentSettingsPath(kind) {
15963
- const home = os31.homedir();
15964
- if (kind === "claude") return path38.join(home, ".claude", "settings.json");
15965
- if (kind === "codex") return path38.join(home, ".codex", "auth.json");
15966
- if (kind === "copilot") return path38.join(home, ".config", "github-copilot", "hosts.json");
16104
+ const home = os32.homedir();
16105
+ if (kind === "claude") return path39.join(home, ".claude", "settings.json");
16106
+ if (kind === "codex") return path39.join(home, ".codex", "auth.json");
16107
+ if (kind === "copilot") return path39.join(home, ".config", "github-copilot", "hosts.json");
15967
16108
  return null;
15968
16109
  }
15969
16110
  function backupAgentHeadroomConfig(kind) {
15970
16111
  const src = agentSettingsPath(kind);
15971
16112
  if (!src) return;
15972
16113
  try {
15973
- if (!fs35.existsSync(src)) return;
15974
- const dest = path38.join(os31.homedir(), ".codeam", `headroom-backup-${kind}.json`);
15975
- fs35.mkdirSync(path38.dirname(dest), { recursive: true, mode: 448 });
15976
- fs35.copyFileSync(src, dest);
15977
- fs35.chmodSync(dest, 384);
16114
+ if (!fs36.existsSync(src)) return;
16115
+ const dest = path39.join(os32.homedir(), ".codeam", `headroom-backup-${kind}.json`);
16116
+ fs36.mkdirSync(path39.dirname(dest), { recursive: true, mode: 448 });
16117
+ fs36.copyFileSync(src, dest);
16118
+ fs36.chmodSync(dest, 384);
15978
16119
  log.info("host-agent", `headroom config backup: ${src} \u2192 ${dest}`);
15979
16120
  } catch (err) {
15980
16121
  log.warn(
@@ -15986,12 +16127,12 @@ function backupAgentHeadroomConfig(kind) {
15986
16127
  function restoreAgentHeadroomConfig(kind) {
15987
16128
  const dest = agentSettingsPath(kind);
15988
16129
  if (!dest) return false;
15989
- const src = path38.join(os31.homedir(), ".codeam", `headroom-backup-${kind}.json`);
15990
- if (!fs35.existsSync(src)) return false;
16130
+ const src = path39.join(os32.homedir(), ".codeam", `headroom-backup-${kind}.json`);
16131
+ if (!fs36.existsSync(src)) return false;
15991
16132
  try {
15992
- fs35.mkdirSync(path38.dirname(dest), { recursive: true, mode: 448 });
15993
- fs35.copyFileSync(src, dest);
15994
- fs35.chmodSync(dest, 384);
16133
+ fs36.mkdirSync(path39.dirname(dest), { recursive: true, mode: 448 });
16134
+ fs36.copyFileSync(src, dest);
16135
+ fs36.chmodSync(dest, 384);
15995
16136
  log.info("host-agent", `headroom config restored: ${src} \u2192 ${dest}`);
15996
16137
  return true;
15997
16138
  } catch (err) {
@@ -16004,7 +16145,7 @@ function restoreAgentHeadroomConfig(kind) {
16004
16145
  }
16005
16146
  function readHeadroomChildEnv() {
16006
16147
  try {
16007
- const raw = fs35.readFileSync(headroomConfigPath(), "utf8");
16148
+ const raw = fs36.readFileSync(headroomConfigPath(), "utf8");
16008
16149
  const parsed = JSON.parse(raw);
16009
16150
  if (typeof parsed !== "object" || parsed === null) return {};
16010
16151
  const o = parsed;
@@ -16040,37 +16181,37 @@ function bundledClaudeBinDir() {
16040
16181
  const roots = /* @__PURE__ */ new Set();
16041
16182
  let dir = __dirname;
16042
16183
  for (let i = 0; i < 6; i++) {
16043
- roots.add(path39.join(dir, "node_modules"));
16044
- const parent = path39.dirname(dir);
16184
+ roots.add(path40.join(dir, "node_modules"));
16185
+ const parent = path40.dirname(dir);
16045
16186
  if (parent === dir) break;
16046
16187
  dir = parent;
16047
16188
  }
16048
16189
  try {
16049
16190
  const main2 = require.resolve("@anthropic-ai/claude-agent-sdk");
16050
- const marker = `${path39.sep}@anthropic-ai${path39.sep}`;
16191
+ const marker = `${path40.sep}@anthropic-ai${path40.sep}`;
16051
16192
  const idx = main2.lastIndexOf(marker);
16052
16193
  if (idx !== -1) roots.add(main2.slice(0, idx));
16053
16194
  } catch {
16054
16195
  }
16055
16196
  for (const nm of roots) {
16056
- const atAnthropic = path39.join(nm, "@anthropic-ai");
16197
+ const atAnthropic = path40.join(nm, "@anthropic-ai");
16057
16198
  let entries;
16058
16199
  try {
16059
- entries = fs36.readdirSync(atAnthropic);
16200
+ entries = fs37.readdirSync(atAnthropic);
16060
16201
  } catch {
16061
16202
  continue;
16062
16203
  }
16063
16204
  for (const entry of entries) {
16064
16205
  if (!entry.startsWith("claude-agent-sdk-")) continue;
16065
- const bin = path39.join(atAnthropic, entry, "claude");
16066
- if (fs36.existsSync(bin)) return path39.dirname(bin);
16206
+ const bin = path40.join(atAnthropic, entry, "claude");
16207
+ if (fs37.existsSync(bin)) return path40.dirname(bin);
16067
16208
  }
16068
16209
  }
16069
16210
  return null;
16070
16211
  }
16071
16212
  async function getFreeDiskBytes(dir) {
16072
16213
  try {
16073
- const s = await fs36.promises.statfs(dir);
16214
+ const s = await fs37.promises.statfs(dir);
16074
16215
  return s.bsize * s.bavail;
16075
16216
  } catch {
16076
16217
  return null;
@@ -16132,7 +16273,7 @@ async function setupHeadroomForSelfHosted(agent, runner = defaultHeadroomRunner,
16132
16273
  if (initKind === "claude") {
16133
16274
  const claudeDir = bundledClaudeBinDir();
16134
16275
  if (claudeDir) {
16135
- initEnv.PATH = `${claudeDir}${path39.delimiter}${process.env["PATH"] ?? ""}`;
16276
+ initEnv.PATH = `${claudeDir}${path40.delimiter}${process.env["PATH"] ?? ""}`;
16136
16277
  log.info("host-agent", `headroom init: bundled claude on PATH (${claudeDir})`);
16137
16278
  } else {
16138
16279
  log.warn("host-agent", "headroom init: bundled claude binary not found \u2014 init may fail");
@@ -16167,9 +16308,9 @@ async function setupHeadroomForSelfHosted(agent, runner = defaultHeadroomRunner,
16167
16308
  var import_node_child_process18 = require("child_process");
16168
16309
 
16169
16310
  // src/lib/updateNotifier.ts
16170
- var fs37 = __toESM(require("fs"));
16171
- var os32 = __toESM(require("os"));
16172
- var path40 = __toESM(require("path"));
16311
+ var fs38 = __toESM(require("fs"));
16312
+ var os33 = __toESM(require("os"));
16313
+ var path41 = __toESM(require("path"));
16173
16314
  var https6 = __toESM(require("https"));
16174
16315
  var import_node_child_process17 = require("child_process");
16175
16316
  var import_picocolors3 = __toESM(require("picocolors"));
@@ -16178,12 +16319,12 @@ var REGISTRY_URL = `https://registry.npmjs.org/${PKG_NAME}/latest`;
16178
16319
  var TTL_MS = 24 * 60 * 60 * 1e3;
16179
16320
  var REQUEST_TIMEOUT_MS = 1500;
16180
16321
  function cachePath() {
16181
- const dir = path40.join(os32.homedir(), ".codeam");
16182
- return path40.join(dir, "update-check.json");
16322
+ const dir = path41.join(os33.homedir(), ".codeam");
16323
+ return path41.join(dir, "update-check.json");
16183
16324
  }
16184
16325
  function readCache() {
16185
16326
  try {
16186
- const raw = fs37.readFileSync(cachePath(), "utf8");
16327
+ const raw = fs38.readFileSync(cachePath(), "utf8");
16187
16328
  const parsed = JSON.parse(raw);
16188
16329
  if (typeof parsed.fetchedAt !== "number" || typeof parsed.latest !== "string") return null;
16189
16330
  return parsed;
@@ -16194,10 +16335,10 @@ function readCache() {
16194
16335
  function writeCache(cache) {
16195
16336
  try {
16196
16337
  const file = cachePath();
16197
- fs37.mkdirSync(path40.dirname(file), { recursive: true });
16338
+ fs38.mkdirSync(path41.dirname(file), { recursive: true });
16198
16339
  const tmp = `${file}.${process.pid}.tmp`;
16199
- fs37.writeFileSync(tmp, JSON.stringify(cache));
16200
- fs37.renameSync(tmp, file);
16340
+ fs38.writeFileSync(tmp, JSON.stringify(cache));
16341
+ fs38.renameSync(tmp, file);
16201
16342
  } catch {
16202
16343
  }
16203
16344
  }
@@ -16271,8 +16412,8 @@ function isLinkedInstall() {
16271
16412
  timeout: 2e3
16272
16413
  }).trim();
16273
16414
  if (!root) return false;
16274
- const pkgPath = path40.join(root, PKG_NAME);
16275
- return fs37.lstatSync(pkgPath).isSymbolicLink();
16415
+ const pkgPath = path41.join(root, PKG_NAME);
16416
+ return fs38.lstatSync(pkgPath).isSymbolicLink();
16276
16417
  } catch {
16277
16418
  return false;
16278
16419
  }
@@ -16308,7 +16449,7 @@ function maybeAutoUpdate(currentVersion, latest) {
16308
16449
  return;
16309
16450
  }
16310
16451
  try {
16311
- fs37.unlinkSync(cachePath());
16452
+ fs38.unlinkSync(cachePath());
16312
16453
  } catch {
16313
16454
  }
16314
16455
  process.stderr.write(` ${import_picocolors3.default.green("\u2713")} Updated. Resuming session...
@@ -16324,7 +16465,7 @@ async function autoUpgradeBeforeCriticalCommand() {
16324
16465
  if (process.env.NODE_ENV === "test") return;
16325
16466
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
16326
16467
  if (process.env.CI) return;
16327
- const current = true ? "2.60.15" : null;
16468
+ const current = true ? "2.60.16" : null;
16328
16469
  if (!current) return;
16329
16470
  const cache = readCache();
16330
16471
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -16341,7 +16482,7 @@ function checkForUpdates() {
16341
16482
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
16342
16483
  if (process.env.CI) return;
16343
16484
  if (!process.stdout.isTTY) return;
16344
- const current = true ? "2.60.15" : null;
16485
+ const current = true ? "2.60.16" : null;
16345
16486
  if (!current) return;
16346
16487
  const cache = readCache();
16347
16488
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -16361,7 +16502,7 @@ var SELF_UPDATE_INTERVAL_MS = 60 * 60 * 1e3;
16361
16502
  var SELF_UPDATE_VIEW_TIMEOUT_MS = 3e4;
16362
16503
  var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
16363
16504
  function currentCliVersion() {
16364
- return true ? "2.60.15" : null;
16505
+ return true ? "2.60.16" : null;
16365
16506
  }
16366
16507
  function runCmd(cmd, args2, timeoutMs) {
16367
16508
  return new Promise((resolve7) => {
@@ -16428,7 +16569,7 @@ async function runSelfUpdate() {
16428
16569
 
16429
16570
  // src/commands/host/teardown.ts
16430
16571
  var import_node_child_process19 = require("child_process");
16431
- var fs38 = __toESM(require("fs"));
16572
+ var fs39 = __toESM(require("fs"));
16432
16573
  var defaultDisableService = () => {
16433
16574
  try {
16434
16575
  (0, import_node_child_process19.execFileSync)("systemctl", ["disable", "--now", "codeam-host-agent"], { stdio: "ignore" });
@@ -16437,7 +16578,7 @@ var defaultDisableService = () => {
16437
16578
  };
16438
16579
  var defaultTeardownHeadroom = () => {
16439
16580
  try {
16440
- const kind = JSON.parse(fs38.readFileSync(headroomConfigPath(), "utf8")).agent;
16581
+ const kind = JSON.parse(fs39.readFileSync(headroomConfigPath(), "utf8")).agent;
16441
16582
  if (kind) {
16442
16583
  (0, import_node_child_process19.execFileSync)("headroom", ["unwrap", kind], { stdio: "ignore", timeout: 15e3 });
16443
16584
  }
@@ -16505,8 +16646,8 @@ function maybeResumeLocalHeadroomReporter(ctx) {
16505
16646
  if (process.env["HEADROOM_ENABLED"] === "1") return null;
16506
16647
  try {
16507
16648
  const file = headroomConfigPath();
16508
- if (!fs39.existsSync(file)) return null;
16509
- const cfg = JSON.parse(fs39.readFileSync(file, "utf8"));
16649
+ if (!fs40.existsSync(file)) return null;
16650
+ const cfg = JSON.parse(fs40.readFileSync(file, "utf8"));
16510
16651
  if (!cfg?.enabled) return null;
16511
16652
  const agent = cfg.agent ?? "claude";
16512
16653
  const ingestUrl = `${resolveApiBaseUrl()}/api/sessions/${ctx.sessionId}/headroom-savings`;
@@ -16911,9 +17052,9 @@ var HostAgentSupervisor = class {
16911
17052
  API_TIMEOUT_MS: "3000000",
16912
17053
  CODEAM_AUTO_TOKEN: payload.autoPairToken
16913
17054
  };
16914
- const houseConfigDir = path41.join(os33.homedir(), ".codeam", "house-claude");
17055
+ const houseConfigDir = path42.join(os34.homedir(), ".codeam", "house-claude");
16915
17056
  try {
16916
- fs39.mkdirSync(houseConfigDir, { recursive: true, mode: 448 });
17057
+ fs40.mkdirSync(houseConfigDir, { recursive: true, mode: 448 });
16917
17058
  } catch {
16918
17059
  }
16919
17060
  childEnv.CLAUDE_CONFIG_DIR = houseConfigDir;
@@ -16931,14 +17072,14 @@ var HostAgentSupervisor = class {
16931
17072
  report("installing", "installing agent CLI");
16932
17073
  await this.runAgentInstall(payload.agentInstallScript);
16933
17074
  }
16934
- const home = process.env.HOME || os33.homedir();
17075
+ const home = process.env.HOME || os34.homedir();
16935
17076
  childEnv.PATH = `${home}/.local/bin:${process.env.PATH ?? ""}`;
16936
17077
  if (payload.cloneToken) {
16937
17078
  try {
16938
17079
  report("preparing", "configuring git tooling");
16939
17080
  const ghCmd = await ensureGhCli(defaultGitToolingRunner, payload.cloneToken);
16940
17081
  if (ghCmd) {
16941
- childEnv.PATH = `${codeamBinDir()}${path41.delimiter}${childEnv.PATH}`;
17082
+ childEnv.PATH = `${codeamBinDir()}${path42.delimiter}${childEnv.PATH}`;
16942
17083
  await ensureGhAuth(defaultGitToolingRunner, ghCmd, payload.cloneToken);
16943
17084
  }
16944
17085
  } catch (e) {
@@ -16954,7 +17095,7 @@ var HostAgentSupervisor = class {
16954
17095
  }
16955
17096
  if (payload.headroomEnabled && payload.headroomAgent && payload.headroomSavingsIngestUrl && isHeadroomSupportedAgent(payload.headroomAgent)) {
16956
17097
  report("headroom", "setting up Headroom proxy");
16957
- const freeBytes = await this.getFreeDisk(os33.homedir());
17098
+ const freeBytes = await this.getFreeDisk(os34.homedir());
16958
17099
  const alreadyInstalled = this.isHeadroomInstalled();
16959
17100
  if (!alreadyInstalled && freeBytes !== null && freeBytes < HEADROOM_MIN_FREE_DISK_BYTES) {
16960
17101
  const freeGb = (freeBytes / 1e9).toFixed(1);
@@ -17076,7 +17217,7 @@ var HostAgentSupervisor = class {
17076
17217
  */
17077
17218
  runAgentInstall(script) {
17078
17219
  return new Promise((resolve7) => {
17079
- const home = process.env.HOME || os33.homedir();
17220
+ const home = process.env.HOME || os34.homedir();
17080
17221
  const child = (0, import_node_child_process20.spawn)("sh", ["-c", script], {
17081
17222
  env: { ...process.env, HOME: home },
17082
17223
  stdio: ["ignore", "pipe", "pipe"]
@@ -17260,9 +17401,9 @@ async function configureHeadroom(action, ctx, deps) {
17260
17401
  }
17261
17402
 
17262
17403
  // src/services/headroom/budget-relaunch.ts
17263
- var fs40 = __toESM(require("fs"));
17264
- var os34 = __toESM(require("os"));
17265
- var path42 = __toESM(require("path"));
17404
+ var fs41 = __toESM(require("fs"));
17405
+ var os35 = __toESM(require("os"));
17406
+ var path43 = __toESM(require("path"));
17266
17407
  var import_child_process13 = require("child_process");
17267
17408
  function amendDeploymentManifestBudget(manifest, budget) {
17268
17409
  const rawArgs = manifest.proxy_args ?? [];
@@ -17296,7 +17437,7 @@ function amendDeploymentManifestBudget(manifest, budget) {
17296
17437
  return { ...manifest, proxy_args: newArgs, base_env: newEnv };
17297
17438
  }
17298
17439
  function findHeadroomDeployments(homeDir2, deps) {
17299
- const deployDir = path42.join(homeDir2, ".headroom", "deploy");
17440
+ const deployDir = path43.join(homeDir2, ".headroom", "deploy");
17300
17441
  let profiles;
17301
17442
  try {
17302
17443
  profiles = deps.readDir(deployDir);
@@ -17305,7 +17446,7 @@ function findHeadroomDeployments(homeDir2, deps) {
17305
17446
  }
17306
17447
  const results = [];
17307
17448
  for (const profile of profiles) {
17308
- const manifestPath = path42.join(deployDir, profile, "manifest.json");
17449
+ const manifestPath = path43.join(deployDir, profile, "manifest.json");
17309
17450
  let raw;
17310
17451
  try {
17311
17452
  raw = deps.readJson(manifestPath);
@@ -17337,8 +17478,8 @@ async function applyBudgetToHeadroom(budget, deps) {
17337
17478
  }
17338
17479
  function writeManifestReal(manifestPath, manifest) {
17339
17480
  const tmp = manifestPath + ".codeam.tmp";
17340
- fs40.writeFileSync(tmp, JSON.stringify(manifest, null, 2) + "\n", { mode: 384 });
17341
- fs40.renameSync(tmp, manifestPath);
17481
+ fs41.writeFileSync(tmp, JSON.stringify(manifest, null, 2) + "\n", { mode: 384 });
17482
+ fs41.renameSync(tmp, manifestPath);
17342
17483
  }
17343
17484
  function restartDeploymentReal(profile) {
17344
17485
  try {
@@ -17368,11 +17509,11 @@ function spawnProxyReal2(_budget) {
17368
17509
  });
17369
17510
  }
17370
17511
  function makeRealApplyBudgetDeps() {
17371
- const homeDir2 = os34.homedir();
17512
+ const homeDir2 = os35.homedir();
17372
17513
  return {
17373
17514
  findDeployments: () => findHeadroomDeployments(homeDir2, {
17374
- readDir: (dir) => fs40.readdirSync(dir),
17375
- readJson: (filePath) => JSON.parse(fs40.readFileSync(filePath, "utf8"))
17515
+ readDir: (dir) => fs41.readdirSync(dir),
17516
+ readJson: (filePath) => JSON.parse(fs41.readFileSync(filePath, "utf8"))
17376
17517
  }),
17377
17518
  writeManifest: writeManifestReal,
17378
17519
  restartDeployment: restartDeploymentReal,
@@ -18052,8 +18193,8 @@ function activePreviewSessionIds() {
18052
18193
 
18053
18194
  // src/services/preview/start-orchestrator.ts
18054
18195
  var import_child_process17 = require("child_process");
18055
- var fs45 = __toESM(require("fs"));
18056
- var path47 = __toESM(require("path"));
18196
+ var fs46 = __toESM(require("fs"));
18197
+ var path48 = __toESM(require("path"));
18057
18198
  var import_which2 = __toESM(require("which"));
18058
18199
  var INSTALL_TIMEOUT_MS = 5 * 6e4;
18059
18200
  var SETUP_TIMEOUT_MS = 2 * 6e4;
@@ -18120,8 +18261,8 @@ function normalizeDetectionForSpawn(detection, cwd) {
18120
18261
  if (args2.length === 0) return detection;
18121
18262
  const binName = args2[0];
18122
18263
  if (binName.startsWith("-")) return detection;
18123
- const binPath = path47.join(cwd, "node_modules", ".bin", binName);
18124
- if (!fs45.existsSync(binPath)) return detection;
18264
+ const binPath = path48.join(cwd, "node_modules", ".bin", binName);
18265
+ if (!fs46.existsSync(binPath)) return detection;
18125
18266
  return {
18126
18267
  ...detection,
18127
18268
  command: binPath,
@@ -18471,9 +18612,9 @@ async function establishTunnel(ctx, dev) {
18471
18612
 
18472
18613
  // src/beads/bd-adapter.ts
18473
18614
  var import_child_process18 = require("child_process");
18474
- var fs46 = __toESM(require("fs"));
18475
- var os36 = __toESM(require("os"));
18476
- var path48 = __toESM(require("path"));
18615
+ var fs47 = __toESM(require("fs"));
18616
+ var os37 = __toESM(require("os"));
18617
+ var path49 = __toESM(require("path"));
18477
18618
  var BD_PACKAGE = "@beads/bd";
18478
18619
  function resolveBundledBdBinary() {
18479
18620
  return _resolveSeam.resolveBundled();
@@ -18485,11 +18626,11 @@ function _defaultResolveBundled() {
18485
18626
  } catch {
18486
18627
  return null;
18487
18628
  }
18488
- const binDir = path48.join(path48.dirname(pkgJsonPath), "bin");
18629
+ const binDir = path49.join(path49.dirname(pkgJsonPath), "bin");
18489
18630
  const binaryName = process.platform === "win32" ? "bd.exe" : "bd";
18490
- const binaryPath = path48.join(binDir, binaryName);
18631
+ const binaryPath = path49.join(binDir, binaryName);
18491
18632
  try {
18492
- fs46.accessSync(binaryPath, fs46.constants.F_OK);
18633
+ fs47.accessSync(binaryPath, fs47.constants.F_OK);
18493
18634
  return binaryPath;
18494
18635
  } catch {
18495
18636
  return null;
@@ -18499,13 +18640,13 @@ function resolveBdOnPath() {
18499
18640
  return _resolveSeam.resolveOnPath();
18500
18641
  }
18501
18642
  function _defaultResolveOnPath() {
18502
- const dirs = (process.env.PATH ?? "").split(path48.delimiter).filter(Boolean);
18643
+ const dirs = (process.env.PATH ?? "").split(path49.delimiter).filter(Boolean);
18503
18644
  const candidates = process.platform === "win32" ? ["bd.exe", "bd.cmd", "bd"] : ["bd"];
18504
18645
  for (const dir of dirs) {
18505
18646
  for (const candidate of candidates) {
18506
- const full = path48.join(dir, candidate);
18647
+ const full = path49.join(dir, candidate);
18507
18648
  try {
18508
- fs46.accessSync(full, fs46.constants.F_OK);
18649
+ fs47.accessSync(full, fs47.constants.F_OK);
18509
18650
  return full;
18510
18651
  } catch {
18511
18652
  }
@@ -18590,7 +18731,7 @@ var BdAdapter = class {
18590
18731
  const env = { ...process.env };
18591
18732
  if (!env.HOME) {
18592
18733
  try {
18593
- const home = os36.homedir();
18734
+ const home = os37.homedir();
18594
18735
  if (home) env.HOME = home;
18595
18736
  } catch {
18596
18737
  }
@@ -18682,9 +18823,9 @@ function coerceIssue(row, projectKey) {
18682
18823
 
18683
18824
  // src/beads/provisioner.ts
18684
18825
  var import_child_process22 = require("child_process");
18685
- var fs49 = __toESM(require("fs"));
18686
- var os38 = __toESM(require("os"));
18687
- var path51 = __toESM(require("path"));
18826
+ var fs50 = __toESM(require("fs"));
18827
+ var os39 = __toESM(require("os"));
18828
+ var path52 = __toESM(require("path"));
18688
18829
 
18689
18830
  // src/beads/install-bd.ts
18690
18831
  var import_child_process19 = require("child_process");
@@ -18749,9 +18890,9 @@ async function installBd(platform3 = process.platform) {
18749
18890
 
18750
18891
  // src/beads/install-dolt.ts
18751
18892
  var import_child_process20 = require("child_process");
18752
- var fs47 = __toESM(require("fs"));
18753
- var os37 = __toESM(require("os"));
18754
- var path49 = __toESM(require("path"));
18893
+ var fs48 = __toESM(require("fs"));
18894
+ var os38 = __toESM(require("os"));
18895
+ var path50 = __toESM(require("path"));
18755
18896
  var DOLT_INSTALL_SH_URL = "https://github.com/dolthub/dolt/releases/latest/download/install.sh";
18756
18897
  var DOLT_MSI_URL = "https://github.com/dolthub/dolt/releases/latest/download/dolt-windows-amd64.msi";
18757
18898
  function resolveDoltInstallStrategy(platform3) {
@@ -18791,11 +18932,11 @@ function resolveDoltInstallStrategy(platform3) {
18791
18932
  }
18792
18933
  var DOLT_RELEASE_BASE = "https://github.com/dolthub/dolt/releases/latest/download";
18793
18934
  function doltPlatformTuple(platform3, arch2) {
18794
- const os48 = platform3 === "win32" ? "windows" : platform3 === "darwin" ? "darwin" : "linux";
18935
+ const os49 = platform3 === "win32" ? "windows" : platform3 === "darwin" ? "darwin" : "linux";
18795
18936
  const a = arch2 === "x64" ? "amd64" : arch2 === "arm64" ? "arm64" : null;
18796
18937
  if (!a) return null;
18797
- if (os48 === "windows" && a !== "amd64") return null;
18798
- return `${os48}-${a}`;
18938
+ if (os49 === "windows" && a !== "amd64") return null;
18939
+ return `${os49}-${a}`;
18799
18940
  }
18800
18941
  function resolveDoltTarballStrategy(targetDir, platform3, arch2) {
18801
18942
  const tuple = doltPlatformTuple(platform3, arch2);
@@ -18840,14 +18981,14 @@ async function installDoltToDir(targetDir, platform3 = process.platform, arch2 =
18840
18981
  return result;
18841
18982
  }
18842
18983
  var _doltPathSeam = {
18843
- homedir: () => os37.homedir(),
18984
+ homedir: () => os38.homedir(),
18844
18985
  getPath: () => process.env.PATH ?? "",
18845
18986
  setPath: (p2) => {
18846
18987
  process.env.PATH = p2;
18847
18988
  },
18848
18989
  exists: (p2) => {
18849
18990
  try {
18850
- fs47.accessSync(p2, fs47.constants.F_OK);
18991
+ fs48.accessSync(p2, fs48.constants.F_OK);
18851
18992
  return true;
18852
18993
  } catch {
18853
18994
  return false;
@@ -18858,7 +18999,7 @@ function doltBinaryNames(platform3) {
18858
18999
  return platform3 === "win32" ? ["dolt.exe", "dolt.cmd", "dolt"] : ["dolt"];
18859
19000
  }
18860
19001
  function knownDoltDirs(platform3) {
18861
- const P3 = platform3 === "win32" ? path49.win32 : path49.posix;
19002
+ const P3 = platform3 === "win32" ? path50.win32 : path50.posix;
18862
19003
  const home = _doltPathSeam.homedir();
18863
19004
  if (platform3 === "win32") {
18864
19005
  return [
@@ -18874,7 +19015,7 @@ function knownDoltDirs(platform3) {
18874
19015
  ].filter(Boolean);
18875
19016
  }
18876
19017
  function ensureDoltResolvable(platform3 = process.platform) {
18877
- const P3 = platform3 === "win32" ? path49.win32 : path49.posix;
19018
+ const P3 = platform3 === "win32" ? path50.win32 : path50.posix;
18878
19019
  const delim = platform3 === "win32" ? ";" : ":";
18879
19020
  const names = doltBinaryNames(platform3);
18880
19021
  const pathDirs = _doltPathSeam.getPath().split(delim).filter(Boolean);
@@ -19010,8 +19151,8 @@ async function ensureSharedServer(adapter, options = {}) {
19010
19151
  // src/beads/project-key.ts
19011
19152
  var import_child_process21 = require("child_process");
19012
19153
  var crypto2 = __toESM(require("crypto"));
19013
- var fs48 = __toESM(require("fs"));
19014
- var path50 = __toESM(require("path"));
19154
+ var fs49 = __toESM(require("fs"));
19155
+ var path51 = __toESM(require("path"));
19015
19156
  function normalizeOrigin(raw) {
19016
19157
  const trimmed = raw.trim();
19017
19158
  if (!trimmed) return null;
@@ -19037,17 +19178,17 @@ function normalizeOrigin(raw) {
19037
19178
  return `${host2}/${pathPart}`;
19038
19179
  }
19039
19180
  function findRepoRoot(cwd) {
19040
- let dir = path50.resolve(cwd);
19181
+ let dir = path51.resolve(cwd);
19041
19182
  const seen = /* @__PURE__ */ new Set();
19042
19183
  for (let i = 0; i < 256; i++) {
19043
19184
  if (seen.has(dir)) return null;
19044
19185
  seen.add(dir);
19045
19186
  try {
19046
- const stat3 = fs48.statSync(path50.join(dir, ".git"), { throwIfNoEntry: false });
19187
+ const stat3 = fs49.statSync(path51.join(dir, ".git"), { throwIfNoEntry: false });
19047
19188
  if (stat3 && (stat3.isDirectory() || stat3.isFile())) return dir;
19048
19189
  } catch {
19049
19190
  }
19050
- const parent = path50.dirname(dir);
19191
+ const parent = path51.dirname(dir);
19051
19192
  if (parent === dir) return null;
19052
19193
  dir = parent;
19053
19194
  }
@@ -19058,7 +19199,7 @@ var _execSeam2 = {
19058
19199
  const out2 = (0, import_child_process21.execFileSync)(file, args2, opts);
19059
19200
  return typeof out2 === "string" ? out2 : out2.toString("utf8");
19060
19201
  },
19061
- realpath: (p2) => fs48.realpathSync(p2)
19202
+ realpath: (p2) => fs49.realpathSync(p2)
19062
19203
  };
19063
19204
  function readOrigin(cwd) {
19064
19205
  try {
@@ -19087,7 +19228,7 @@ function deriveProjectIdentity(cwd = process.cwd()) {
19087
19228
  } catch {
19088
19229
  }
19089
19230
  const hash = crypto2.createHash("sha256").update(real).digest("hex");
19090
- return { projectKey: `path:${hash}`, projectLabel: path50.basename(real) || "project" };
19231
+ return { projectKey: `path:${hash}`, projectLabel: path51.basename(real) || "project" };
19091
19232
  }
19092
19233
 
19093
19234
  // src/beads/project-prefix.ts
@@ -19132,17 +19273,17 @@ var _provisionSeam = {
19132
19273
  };
19133
19274
  var _linkSeam = {
19134
19275
  platform: () => process.platform,
19135
- homedir: () => os38.homedir(),
19276
+ homedir: () => os39.homedir(),
19136
19277
  isWritableDir: (dir) => {
19137
19278
  try {
19138
- fs49.accessSync(dir, fs49.constants.W_OK);
19279
+ fs50.accessSync(dir, fs50.constants.W_OK);
19139
19280
  return true;
19140
19281
  } catch {
19141
19282
  return false;
19142
19283
  }
19143
19284
  },
19144
19285
  ensureDir: (dir) => {
19145
- fs49.mkdirSync(dir, { recursive: true });
19286
+ fs50.mkdirSync(dir, { recursive: true });
19146
19287
  },
19147
19288
  /**
19148
19289
  * A directory to symlink `bd` into so the AGENT's shell + Claude Code's
@@ -19163,9 +19304,9 @@ var _linkSeam = {
19163
19304
  * which `linkBdOntoPath` creates if missing.
19164
19305
  */
19165
19306
  cliBinDir: () => {
19166
- const pathDirs = (process.env.PATH ?? "").split(path51.delimiter).filter(Boolean);
19307
+ const pathDirs = (process.env.PATH ?? "").split(path52.delimiter).filter(Boolean);
19167
19308
  const home = _linkSeam.homedir();
19168
- const localBin = home ? path51.join(home, ".local", "bin") : null;
19309
+ const localBin = home ? path52.join(home, ".local", "bin") : null;
19169
19310
  if (localBin) {
19170
19311
  try {
19171
19312
  _linkSeam.ensureDir(localBin);
@@ -19175,16 +19316,16 @@ var _linkSeam = {
19175
19316
  const candidates = [];
19176
19317
  if (localBin) candidates.push(localBin);
19177
19318
  try {
19178
- candidates.push(path51.dirname(process.execPath));
19319
+ candidates.push(path52.dirname(process.execPath));
19179
19320
  } catch {
19180
19321
  }
19181
19322
  candidates.push("/usr/local/bin");
19182
19323
  const entry = process.argv[1];
19183
19324
  if (entry) {
19184
19325
  try {
19185
- candidates.push(path51.dirname(fs49.realpathSync(entry)));
19326
+ candidates.push(path52.dirname(fs50.realpathSync(entry)));
19186
19327
  } catch {
19187
- candidates.push(path51.dirname(entry));
19328
+ candidates.push(path52.dirname(entry));
19188
19329
  }
19189
19330
  }
19190
19331
  const onPathWritable = candidates.find(
@@ -19196,20 +19337,20 @@ var _linkSeam = {
19196
19337
  /** Current symlink target at `linkPath`, or null when absent / not a link. */
19197
19338
  readlink: (linkPath) => {
19198
19339
  try {
19199
- return fs49.readlinkSync(linkPath);
19340
+ return fs50.readlinkSync(linkPath);
19200
19341
  } catch {
19201
19342
  return null;
19202
19343
  }
19203
19344
  },
19204
- unlink: (linkPath) => fs49.unlinkSync(linkPath),
19205
- symlink: (target, linkPath) => fs49.symlinkSync(target, linkPath)
19345
+ unlink: (linkPath) => fs50.unlinkSync(linkPath),
19346
+ symlink: (target, linkPath) => fs50.symlinkSync(target, linkPath)
19206
19347
  };
19207
19348
  function linkBdOntoPath(binaryPath) {
19208
19349
  if (_linkSeam.platform() === "win32") return;
19209
19350
  const binDir = _linkSeam.cliBinDir();
19210
19351
  if (!binDir) return;
19211
19352
  _linkSeam.ensureDir(binDir);
19212
- const linkPath = path51.join(binDir, "bd");
19353
+ const linkPath = path52.join(binDir, "bd");
19213
19354
  if (linkPath === binaryPath) return;
19214
19355
  const current = _linkSeam.readlink(linkPath);
19215
19356
  if (current === binaryPath) return;
@@ -19404,7 +19545,7 @@ function dedupeRecipes(agents) {
19404
19545
 
19405
19546
  // src/beads/watcher.ts
19406
19547
  var crypto4 = __toESM(require("crypto"));
19407
- var path52 = __toESM(require("path"));
19548
+ var path53 = __toESM(require("path"));
19408
19549
  var API_BASE6 = resolveApiBaseUrl();
19409
19550
  var DEBOUNCE_MS2 = 400;
19410
19551
  var ZERO_SUMMARY = {
@@ -19428,7 +19569,7 @@ var BeadsWatcher = class {
19428
19569
  constructor(opts) {
19429
19570
  this.opts = opts;
19430
19571
  this.bd = opts.adapter ?? new BdAdapter({ cwd: opts.cwd, beadsDir: opts.beadsDir });
19431
- this.feedPath = opts.feedPath ?? path52.join(opts.cwd ?? process.cwd(), ".beads", "last-touched");
19572
+ this.feedPath = opts.feedPath ?? path53.join(opts.cwd ?? process.cwd(), ".beads", "last-touched");
19432
19573
  this.apiBase = opts.apiBaseUrl ?? API_BASE6;
19433
19574
  }
19434
19575
  opts;
@@ -19845,8 +19986,8 @@ function cleanupAttachmentTempFiles() {
19845
19986
  function saveFilesTemp(files) {
19846
19987
  return files.filter(({ base64 }) => base64 && base64.length > 0).map(({ filename, base64 }) => {
19847
19988
  const safeName = filename.replace(/[^a-zA-Z0-9._-]/g, "_").slice(0, 80);
19848
- const tmpPath = path54.join(os40.tmpdir(), `codeam-${(0, import_crypto3.randomUUID)()}-${safeName}`);
19849
- fs51.writeFileSync(tmpPath, Buffer.from(base64, "base64"));
19989
+ const tmpPath = path55.join(os41.tmpdir(), `codeam-${(0, import_crypto3.randomUUID)()}-${safeName}`);
19990
+ fs52.writeFileSync(tmpPath, Buffer.from(base64, "base64"));
19850
19991
  pendingAttachmentFiles.add(tmpPath);
19851
19992
  return tmpPath;
19852
19993
  });
@@ -20058,9 +20199,9 @@ var listFiles = async (ctx, cmd, parsed) => {
20058
20199
  await ctx.relay.sendResult(cmd.id, "completed", result);
20059
20200
  };
20060
20201
  var envReadH = async (ctx, cmd) => {
20061
- const envPath = path54.join(process.cwd(), ".env");
20202
+ const envPath = path55.join(process.cwd(), ".env");
20062
20203
  try {
20063
- const raw = await fs51.promises.readFile(envPath, "utf8");
20204
+ const raw = await fs52.promises.readFile(envPath, "utf8");
20064
20205
  await ctx.relay.sendResult(cmd.id, "completed", {
20065
20206
  exists: true,
20066
20207
  vars: parseDotenv(raw)
@@ -20091,14 +20232,14 @@ var envWriteH = async (ctx, cmd, parsed) => {
20091
20232
  }
20092
20233
  seen.add(v.key);
20093
20234
  }
20094
- const envPath = path54.join(process.cwd(), ".env");
20095
- const tmpPath = path54.join(process.cwd(), ".env.codeam.tmp");
20235
+ const envPath = path55.join(process.cwd(), ".env");
20236
+ const tmpPath = path55.join(process.cwd(), ".env.codeam.tmp");
20096
20237
  try {
20097
- await fs51.promises.writeFile(tmpPath, serializeDotenv(vars), "utf8");
20098
- await fs51.promises.rename(tmpPath, envPath);
20238
+ await fs52.promises.writeFile(tmpPath, serializeDotenv(vars), "utf8");
20239
+ await fs52.promises.rename(tmpPath, envPath);
20099
20240
  await ctx.relay.sendResult(cmd.id, "completed", { ok: true, count: vars.length });
20100
20241
  } catch (err) {
20101
- await fs51.promises.rm(tmpPath, { force: true }).catch(() => void 0);
20242
+ await fs52.promises.rm(tmpPath, { force: true }).catch(() => void 0);
20102
20243
  await ctx.relay.sendResult(cmd.id, "failed", { error: err.message });
20103
20244
  }
20104
20245
  };
@@ -20142,7 +20283,7 @@ var headroomConfigureH = async (ctx, cmd, parsed) => {
20142
20283
  let configuredAgent = rawAgentId;
20143
20284
  if (!configuredAgent) {
20144
20285
  try {
20145
- const raw = JSON.parse(fs51.readFileSync(headroomConfigPath(), "utf8"));
20286
+ const raw = JSON.parse(fs52.readFileSync(headroomConfigPath(), "utf8"));
20146
20287
  configuredAgent = raw.agent ?? "";
20147
20288
  } catch {
20148
20289
  }
@@ -20176,7 +20317,7 @@ var headroomConfigureH = async (ctx, cmd, parsed) => {
20176
20317
  persist: persistHeadroomConfig,
20177
20318
  readEnabled: () => {
20178
20319
  try {
20179
- const raw = JSON.parse(fs51.readFileSync(headroomConfigPath(), "utf8"));
20320
+ const raw = JSON.parse(fs52.readFileSync(headroomConfigPath(), "utf8"));
20180
20321
  return raw.enabled === true;
20181
20322
  } catch {
20182
20323
  return false;
@@ -20265,7 +20406,7 @@ var headroomBudgetH = async (ctx, cmd) => {
20265
20406
  }
20266
20407
  let headroomActive = false;
20267
20408
  try {
20268
- const raw = JSON.parse(fs51.readFileSync(headroomConfigPath(), "utf8"));
20409
+ const raw = JSON.parse(fs52.readFileSync(headroomConfigPath(), "utf8"));
20269
20410
  headroomActive = raw.enabled === true;
20270
20411
  } catch {
20271
20412
  }
@@ -20275,7 +20416,7 @@ var headroomBudgetH = async (ctx, cmd) => {
20275
20416
  }
20276
20417
  let existingConfig = { enabled: true };
20277
20418
  try {
20278
- existingConfig = JSON.parse(fs51.readFileSync(headroomConfigPath(), "utf8"));
20419
+ existingConfig = JSON.parse(fs52.readFileSync(headroomConfigPath(), "utf8"));
20279
20420
  } catch {
20280
20421
  }
20281
20422
  if (payload.budgetEnabled && payload.budgetUsd != null) {
@@ -20388,13 +20529,13 @@ var CLI_UPDATE_MAX_ATTEMPTS = 3;
20388
20529
  function buildNpmInstallInvocation(opts) {
20389
20530
  const entryScript = opts?.entryScript ?? process.argv[1] ?? "";
20390
20531
  const execPath = opts?.execPath ?? process.execPath;
20391
- const exists2 = opts?.existsSync ?? fs51.existsSync;
20392
- const normalized = entryScript.split(path54.sep).join("/");
20532
+ const exists2 = opts?.existsSync ?? fs52.existsSync;
20533
+ const normalized = entryScript.split(path55.sep).join("/");
20393
20534
  const marker = "/lib/node_modules/codeam-cli/";
20394
20535
  const markerIdx = normalized.indexOf(marker);
20395
20536
  const prefix = markerIdx > 0 ? entryScript.slice(0, markerIdx) : null;
20396
- const siblingNpm = path54.join(
20397
- path54.dirname(execPath),
20537
+ const siblingNpm = path55.join(
20538
+ path55.dirname(execPath),
20398
20539
  process.platform === "win32" ? "npm.cmd" : "npm"
20399
20540
  );
20400
20541
  const command2 = exists2(siblingNpm) ? siblingNpm : "npm";
@@ -21236,11 +21377,11 @@ function resolveTokenValue(args2) {
21236
21377
  }
21237
21378
  const fileFlag = args2.find((a) => a.startsWith("--token-file="));
21238
21379
  if (fileFlag) {
21239
- const path69 = fileFlag.slice("--token-file=".length);
21380
+ const path70 = fileFlag.slice("--token-file=".length);
21240
21381
  try {
21241
- const content = fs52.readFileSync(path69, "utf8").trim();
21242
- if (content.length === 0) fail(`--token-file ${path69} is empty`);
21243
- rmIfExistsQuiet(path69);
21382
+ const content = fs53.readFileSync(path70, "utf8").trim();
21383
+ if (content.length === 0) fail(`--token-file ${path70} is empty`);
21384
+ rmIfExistsQuiet(path70);
21244
21385
  return content;
21245
21386
  } catch (err) {
21246
21387
  fail(`Could not read --token-file: ${err.message}`);
@@ -21269,7 +21410,7 @@ async function claimOnce(token, pluginId, pluginSecretHash) {
21269
21410
  pluginId,
21270
21411
  ideName: "codeam-cli (codespace)",
21271
21412
  ideVersion: process.env.npm_package_version ?? "unknown",
21272
- hostname: os41.hostname(),
21413
+ hostname: os42.hostname(),
21273
21414
  codespaceName: process.env.CODESPACE_NAME ?? "",
21274
21415
  // Current git branch of the codespace's working directory, so the
21275
21416
  // backend can populate `PairedSession.branch` for the codespace pair.
@@ -21330,7 +21471,7 @@ async function claim(token, pluginId, pluginSecretHash) {
21330
21471
  }
21331
21472
  }
21332
21473
  function pairAutoLockPath() {
21333
- return path55.join(os41.homedir(), ".codeam", "pair-auto.lock");
21474
+ return path56.join(os42.homedir(), ".codeam", "pair-auto.lock");
21334
21475
  }
21335
21476
  function isLivePairAuto(pid) {
21336
21477
  if (!Number.isInteger(pid) || pid <= 0 || pid === process.pid) return false;
@@ -21340,7 +21481,7 @@ function isLivePairAuto(pid) {
21340
21481
  if (e.code !== "EPERM") return false;
21341
21482
  }
21342
21483
  try {
21343
- return fs52.readFileSync(`/proc/${pid}/cmdline`, "utf8").includes("codeam");
21484
+ return fs53.readFileSync(`/proc/${pid}/cmdline`, "utf8").includes("codeam");
21344
21485
  } catch {
21345
21486
  return true;
21346
21487
  }
@@ -21350,24 +21491,24 @@ function isLiveCodeam(pid) {
21350
21491
  }
21351
21492
  function daemonLockPath(sessionId) {
21352
21493
  const safe = sessionId.replace(/[^a-zA-Z0-9_-]/g, "_");
21353
- return path55.join(os41.homedir(), ".codeam", `daemon-${safe}.lock`);
21494
+ return path56.join(os42.homedir(), ".codeam", `daemon-${safe}.lock`);
21354
21495
  }
21355
21496
  function acquireDaemonLock(sessionId) {
21356
21497
  const lockPath = daemonLockPath(sessionId);
21357
21498
  try {
21358
- fs52.mkdirSync(path55.dirname(lockPath), { recursive: true });
21499
+ fs53.mkdirSync(path56.dirname(lockPath), { recursive: true });
21359
21500
  try {
21360
- fs52.writeFileSync(lockPath, String(process.pid), { flag: "wx" });
21501
+ fs53.writeFileSync(lockPath, String(process.pid), { flag: "wx" });
21361
21502
  } catch (e) {
21362
21503
  if (e.code !== "EEXIST") throw e;
21363
- const holder = Number(fs52.readFileSync(lockPath, "utf8").trim());
21504
+ const holder = Number(fs53.readFileSync(lockPath, "utf8").trim());
21364
21505
  if (holder && holder !== process.pid && isLiveCodeam(holder)) return false;
21365
- fs52.writeFileSync(lockPath, String(process.pid));
21506
+ fs53.writeFileSync(lockPath, String(process.pid));
21366
21507
  }
21367
21508
  const release3 = () => {
21368
21509
  try {
21369
- if (fs52.existsSync(lockPath) && Number(fs52.readFileSync(lockPath, "utf8").trim()) === process.pid) {
21370
- fs52.unlinkSync(lockPath);
21510
+ if (fs53.existsSync(lockPath) && Number(fs53.readFileSync(lockPath, "utf8").trim()) === process.pid) {
21511
+ fs53.unlinkSync(lockPath);
21371
21512
  }
21372
21513
  } catch {
21373
21514
  }
@@ -21389,19 +21530,19 @@ function acquireDaemonLock(sessionId) {
21389
21530
  function acquireSingletonLock() {
21390
21531
  const lockPath = pairAutoLockPath();
21391
21532
  try {
21392
- fs52.mkdirSync(path55.dirname(lockPath), { recursive: true });
21533
+ fs53.mkdirSync(path56.dirname(lockPath), { recursive: true });
21393
21534
  try {
21394
- fs52.writeFileSync(lockPath, String(process.pid), { flag: "wx" });
21535
+ fs53.writeFileSync(lockPath, String(process.pid), { flag: "wx" });
21395
21536
  } catch (e) {
21396
21537
  if (e.code !== "EEXIST") throw e;
21397
- const holder = Number(fs52.readFileSync(lockPath, "utf8").trim());
21538
+ const holder = Number(fs53.readFileSync(lockPath, "utf8").trim());
21398
21539
  if (isLivePairAuto(holder)) return false;
21399
- fs52.writeFileSync(lockPath, String(process.pid));
21540
+ fs53.writeFileSync(lockPath, String(process.pid));
21400
21541
  }
21401
21542
  process.once("exit", () => {
21402
21543
  try {
21403
- if (fs52.existsSync(lockPath) && Number(fs52.readFileSync(lockPath, "utf8").trim()) === process.pid) {
21404
- fs52.unlinkSync(lockPath);
21544
+ if (fs53.existsSync(lockPath) && Number(fs53.readFileSync(lockPath, "utf8").trim()) === process.pid) {
21545
+ fs53.unlinkSync(lockPath);
21405
21546
  }
21406
21547
  } catch {
21407
21548
  }
@@ -21846,7 +21987,7 @@ var AgentService = class _AgentService {
21846
21987
  };
21847
21988
 
21848
21989
  // src/agents/acp/adapters.ts
21849
- var path57 = __toESM(require("path"));
21990
+ var path58 = __toESM(require("path"));
21850
21991
 
21851
21992
  // src/agents/acp/agent-binary.ts
21852
21993
  var import_fs4 = __toESM(require("fs"));
@@ -21879,14 +22020,14 @@ function defaultSdkDir() {
21879
22020
  return resolveSdkDirViaRequire();
21880
22021
  }
21881
22022
  function resolveClaudeNativeBinary(deps = {}) {
21882
- const existsSync25 = deps.existsSync ?? import_fs4.default.existsSync;
22023
+ const existsSync26 = deps.existsSync ?? import_fs4.default.existsSync;
21883
22024
  const platformKey = deps.platformKey ?? currentPlatformKey();
21884
22025
  const sdkDir = deps.sdkDir !== void 0 ? deps.sdkDir : defaultSdkDir();
21885
22026
  if (!sdkDir) return null;
21886
22027
  const scopeDir = import_path8.default.dirname(sdkDir);
21887
22028
  const binName = platformKey.startsWith("win32-") ? "claude.exe" : "claude";
21888
22029
  const candidate = import_path8.default.join(scopeDir, `claude-agent-sdk-${platformKey}`, binName);
21889
- return existsSync25(candidate) ? candidate : null;
22030
+ return existsSync26(candidate) ? candidate : null;
21890
22031
  }
21891
22032
  var realSleep = (ms) => new Promise((resolve7) => setTimeout(resolve7, ms));
21892
22033
  async function waitForClaudeNativeBinary(opts = {}) {
@@ -21937,18 +22078,18 @@ async function waitForCommandOnPath(cmd, opts = {}) {
21937
22078
  return check();
21938
22079
  }
21939
22080
  function resolveCursorAgentBinary(deps = {}) {
21940
- const existsSync25 = deps.existsSync ?? import_fs4.default.existsSync;
22081
+ const existsSync26 = deps.existsSync ?? import_fs4.default.existsSync;
21941
22082
  const platform3 = deps.platform ?? process.platform;
21942
22083
  const env = deps.env ?? process.env;
21943
22084
  if (platform3 === "win32") {
21944
22085
  const localAppData = env.LOCALAPPDATA;
21945
22086
  if (!localAppData) return null;
21946
22087
  const exe = import_path8.default.win32.join(localAppData, "cursor-agent", "cursor-agent.exe");
21947
- return existsSync25(exe) ? exe : null;
22088
+ return existsSync26(exe) ? exe : null;
21948
22089
  }
21949
22090
  const home = deps.homedir ?? import_os8.default.homedir();
21950
22091
  const unix = import_path8.default.posix.join(home, ".local", "bin", "cursor-agent");
21951
- return existsSync25(unix) ? unix : null;
22092
+ return existsSync26(unix) ? unix : null;
21952
22093
  }
21953
22094
  async function waitForCursorAgent(opts = {}) {
21954
22095
  const timeoutMs = opts.timeoutMs ?? 18e4;
@@ -22028,13 +22169,13 @@ function resolveBin(pkgName, binName) {
22028
22169
  try {
22029
22170
  const manifestPath = require_.resolve(`${pkgName}/package.json`);
22030
22171
  const manifest = require_(`${pkgName}/package.json`);
22031
- const pkgDir = path57.dirname(manifestPath);
22172
+ const pkgDir = path58.dirname(manifestPath);
22032
22173
  const bin = manifest.bin;
22033
22174
  if (!bin) return null;
22034
- if (typeof bin === "string") return path57.resolve(pkgDir, bin);
22175
+ if (typeof bin === "string") return path58.resolve(pkgDir, bin);
22035
22176
  const target = binName ?? Object.keys(bin)[0];
22036
22177
  if (!target || !bin[target]) return null;
22037
- return path57.resolve(pkgDir, bin[target]);
22178
+ return path58.resolve(pkgDir, bin[target]);
22038
22179
  } catch {
22039
22180
  return null;
22040
22181
  }
@@ -22127,12 +22268,12 @@ function requiresAcp(agent) {
22127
22268
  }
22128
22269
 
22129
22270
  // src/agents/acp/runner.ts
22130
- var import_node_crypto8 = require("crypto");
22271
+ var import_node_crypto9 = require("crypto");
22131
22272
 
22132
22273
  // src/services/history.service.ts
22133
- var fs54 = __toESM(require("fs"));
22134
- var path58 = __toESM(require("path"));
22135
- var os43 = __toESM(require("os"));
22274
+ var fs55 = __toESM(require("fs"));
22275
+ var path59 = __toESM(require("path"));
22276
+ var os44 = __toESM(require("os"));
22136
22277
  var https7 = __toESM(require("https"));
22137
22278
  var http6 = __toESM(require("http"));
22138
22279
  var import_zod2 = require("zod");
@@ -22159,7 +22300,7 @@ function parseJsonl(filePath) {
22159
22300
  const messages = [];
22160
22301
  let raw;
22161
22302
  try {
22162
- raw = fs54.readFileSync(filePath, "utf8");
22303
+ raw = fs55.readFileSync(filePath, "utf8");
22163
22304
  } catch (err) {
22164
22305
  if (err.code !== "ENOENT") {
22165
22306
  log.warn("history:parseJsonl", `read failed for ${filePath}`, err);
@@ -22300,7 +22441,7 @@ var HistoryService = class _HistoryService {
22300
22441
  return this._quotaPercent === null || Date.now() - this._quotaFetchedAt > ttlMs;
22301
22442
  }
22302
22443
  get projectDir() {
22303
- return this.runtime.resolveHistoryDir(this.cwd) ?? path58.join(os43.homedir(), ".claude", "projects", encodeCwd(this.cwd));
22444
+ return this.runtime.resolveHistoryDir(this.cwd) ?? path59.join(os44.homedir(), ".claude", "projects", encodeCwd(this.cwd));
22304
22445
  }
22305
22446
  /** Set the current Claude conversation ID (extracted from /cost command or session start) */
22306
22447
  setCurrentConversationId(id) {
@@ -22312,7 +22453,7 @@ var HistoryService = class _HistoryService {
22312
22453
  /** Return the current message count in the active conversation. */
22313
22454
  getCurrentMessageCount() {
22314
22455
  if (!this.currentConversationId) return 0;
22315
- const filePath = path58.join(this.projectDir, `${this.currentConversationId}.jsonl`);
22456
+ const filePath = path59.join(this.projectDir, `${this.currentConversationId}.jsonl`);
22316
22457
  return parseJsonl(filePath).length;
22317
22458
  }
22318
22459
  /**
@@ -22323,7 +22464,7 @@ var HistoryService = class _HistoryService {
22323
22464
  const deadline = Date.now() + timeoutMs;
22324
22465
  while (Date.now() < deadline) {
22325
22466
  if (!this.currentConversationId) return null;
22326
- const filePath = path58.join(this.projectDir, `${this.currentConversationId}.jsonl`);
22467
+ const filePath = path59.join(this.projectDir, `${this.currentConversationId}.jsonl`);
22327
22468
  const messages = parseJsonl(filePath);
22328
22469
  if (messages.length > previousCount) {
22329
22470
  for (let i = messages.length - 1; i >= previousCount; i--) {
@@ -22349,16 +22490,16 @@ var HistoryService = class _HistoryService {
22349
22490
  const dir = this.projectDir;
22350
22491
  const cutoff = this.bootTimeMs - _HistoryService.BIRTHTIME_GRACE_MS;
22351
22492
  try {
22352
- const files = fs54.readdirSync(dir, { withFileTypes: true }).filter((e) => e.isFile() && e.name.endsWith(".jsonl")).map((e) => {
22493
+ const files = fs55.readdirSync(dir, { withFileTypes: true }).filter((e) => e.isFile() && e.name.endsWith(".jsonl")).map((e) => {
22353
22494
  try {
22354
- const stat3 = fs54.statSync(path58.join(dir, e.name));
22495
+ const stat3 = fs55.statSync(path59.join(dir, e.name));
22355
22496
  return { name: e.name, mtime: stat3.mtimeMs, birthtime: stat3.birthtimeMs };
22356
22497
  } catch {
22357
22498
  return { name: e.name, mtime: 0, birthtime: 0 };
22358
22499
  }
22359
22500
  }).filter((f) => f.birthtime >= cutoff).sort((a, b) => b.mtime - a.mtime);
22360
22501
  if (files.length > 0) {
22361
- this.currentConversationId = path58.basename(files[0].name, ".jsonl");
22502
+ this.currentConversationId = path59.basename(files[0].name, ".jsonl");
22362
22503
  }
22363
22504
  } catch {
22364
22505
  }
@@ -22392,13 +22533,13 @@ var HistoryService = class _HistoryService {
22392
22533
  const cutoff = this.bootTimeMs - _HistoryService.BIRTHTIME_GRACE_MS;
22393
22534
  let entries;
22394
22535
  try {
22395
- entries = fs54.readdirSync(dir, { withFileTypes: true });
22536
+ entries = fs55.readdirSync(dir, { withFileTypes: true });
22396
22537
  } catch {
22397
22538
  return null;
22398
22539
  }
22399
22540
  const files = entries.filter((e) => e.isFile() && e.name.endsWith(".jsonl")).map((e) => {
22400
22541
  try {
22401
- const stat3 = fs54.statSync(path58.join(dir, e.name));
22542
+ const stat3 = fs55.statSync(path59.join(dir, e.name));
22402
22543
  return { name: e.name, mtime: stat3.mtimeMs, birthtime: stat3.birthtimeMs };
22403
22544
  } catch {
22404
22545
  return { name: e.name, mtime: 0, birthtime: 0 };
@@ -22407,12 +22548,12 @@ var HistoryService = class _HistoryService {
22407
22548
  if (files.length === 0) return null;
22408
22549
  const targetFile = this.currentConversationId ? `${this.currentConversationId}.jsonl` : files[0].name;
22409
22550
  if (!files.some((f) => f.name === targetFile)) return null;
22410
- return this.extractUsageFromFile(path58.join(dir, targetFile));
22551
+ return this.extractUsageFromFile(path59.join(dir, targetFile));
22411
22552
  }
22412
22553
  extractUsageFromFile(filePath) {
22413
22554
  let raw;
22414
22555
  try {
22415
- raw = fs54.readFileSync(filePath, "utf8");
22556
+ raw = fs55.readFileSync(filePath, "utf8");
22416
22557
  } catch {
22417
22558
  return null;
22418
22559
  }
@@ -22457,9 +22598,9 @@ var HistoryService = class _HistoryService {
22457
22598
  let totalCost = 0;
22458
22599
  let files;
22459
22600
  try {
22460
- files = fs54.readdirSync(projectDir).filter((f) => f.endsWith(".jsonl")).filter((f) => {
22601
+ files = fs55.readdirSync(projectDir).filter((f) => f.endsWith(".jsonl")).filter((f) => {
22461
22602
  try {
22462
- return fs54.statSync(path58.join(projectDir, f)).mtimeMs >= monthStartMs;
22603
+ return fs55.statSync(path59.join(projectDir, f)).mtimeMs >= monthStartMs;
22463
22604
  } catch {
22464
22605
  return false;
22465
22606
  }
@@ -22470,7 +22611,7 @@ var HistoryService = class _HistoryService {
22470
22611
  for (const file of files) {
22471
22612
  let raw;
22472
22613
  try {
22473
- raw = fs54.readFileSync(path58.join(projectDir, file), "utf8");
22614
+ raw = fs55.readFileSync(path59.join(projectDir, file), "utf8");
22474
22615
  } catch {
22475
22616
  continue;
22476
22617
  }
@@ -22549,7 +22690,7 @@ var HistoryService = class _HistoryService {
22549
22690
  if (this.runtime.resolveHistoryFile) {
22550
22691
  return this.runtime.resolveHistoryFile(this.cwd, sessionId);
22551
22692
  }
22552
- return path58.join(this.projectDir, `${sessionId}.jsonl`);
22693
+ return path59.join(this.projectDir, `${sessionId}.jsonl`);
22553
22694
  }
22554
22695
  /**
22555
22696
  * Parse a conversation's messages from disk, agent-aware. Claude uses the
@@ -22583,7 +22724,7 @@ var HistoryService = class _HistoryService {
22583
22724
  };
22584
22725
  });
22585
22726
  }
22586
- return parseJsonl(path58.join(this.projectDir, `${sessionId}.jsonl`));
22727
+ return parseJsonl(path59.join(this.projectDir, `${sessionId}.jsonl`));
22587
22728
  }
22588
22729
  async loadConversation(sessionId) {
22589
22730
  const messages = this.readConversation(sessionId);
@@ -22639,7 +22780,7 @@ var HistoryService = class _HistoryService {
22639
22780
  if (!filePath) return false;
22640
22781
  let mtimeMs;
22641
22782
  try {
22642
- mtimeMs = fs54.statSync(filePath).mtimeMs;
22783
+ mtimeMs = fs55.statSync(filePath).mtimeMs;
22643
22784
  } catch {
22644
22785
  return false;
22645
22786
  }
@@ -22708,10 +22849,10 @@ var HistoryService = class _HistoryService {
22708
22849
 
22709
22850
  // src/agents/acp/client.ts
22710
22851
  var import_node_child_process22 = require("child_process");
22711
- var fs55 = __toESM(require("fs/promises"));
22852
+ var fs56 = __toESM(require("fs/promises"));
22712
22853
  var fsSync = __toESM(require("fs"));
22713
- var os44 = __toESM(require("os"));
22714
- var path59 = __toESM(require("path"));
22854
+ var os45 = __toESM(require("os"));
22855
+ var path60 = __toESM(require("path"));
22715
22856
  var import_node_stream = require("stream");
22716
22857
 
22717
22858
  // ../../node_modules/@agentclientprotocol/sdk/dist/acp.js
@@ -25625,7 +25766,7 @@ var AcpClient = class {
25625
25766
  },
25626
25767
  readTextFile: async (params) => {
25627
25768
  try {
25628
- const content = await fs55.readFile(params.path, "utf8");
25769
+ const content = await fs56.readFile(params.path, "utf8");
25629
25770
  return applyLineRange(content, params.line ?? null, params.limit ?? null);
25630
25771
  } catch (err) {
25631
25772
  const code = err.code;
@@ -25645,7 +25786,7 @@ var AcpClient = class {
25645
25786
  },
25646
25787
  writeTextFile: async (params) => {
25647
25788
  try {
25648
- await fs55.writeFile(params.path, params.content, "utf8");
25789
+ await fs56.writeFile(params.path, params.content, "utf8");
25649
25790
  return {};
25650
25791
  } catch (err) {
25651
25792
  const code = err.code;
@@ -25694,29 +25835,29 @@ function applyLineRange(content, line, limit) {
25694
25835
  return { content: lines.slice(start2, end).join("\n") };
25695
25836
  }
25696
25837
  function knownAgentBinaryDirs() {
25697
- const home = os44.homedir();
25838
+ const home = os45.homedir();
25698
25839
  const out2 = [];
25699
25840
  out2.push("/tmp/codeam-node20/bin");
25700
25841
  for (const root of [
25701
25842
  "/usr/local/share/nvm/versions/node",
25702
- path59.join(home, ".nvm/versions/node")
25843
+ path60.join(home, ".nvm/versions/node")
25703
25844
  ]) {
25704
25845
  try {
25705
25846
  for (const child of fsSync.readdirSync(root)) {
25706
- out2.push(path59.join(root, child, "bin"));
25847
+ out2.push(path60.join(root, child, "bin"));
25707
25848
  }
25708
25849
  } catch {
25709
25850
  }
25710
25851
  }
25711
- out2.push(path59.join(home, ".volta/bin"));
25852
+ out2.push(path60.join(home, ".volta/bin"));
25712
25853
  out2.push("/usr/local/bin");
25713
25854
  out2.push("/usr/bin");
25714
- out2.push(path59.join(home, ".local/bin"));
25715
- out2.push(path59.join(home, "bin"));
25855
+ out2.push(path60.join(home, ".local/bin"));
25856
+ out2.push(path60.join(home, "bin"));
25716
25857
  if (process.platform === "win32") {
25717
25858
  const { LOCALAPPDATA, APPDATA } = process.env;
25718
- if (LOCALAPPDATA) out2.push(path59.join(LOCALAPPDATA, "cursor-agent"));
25719
- if (APPDATA) out2.push(path59.join(APPDATA, "npm"));
25859
+ if (LOCALAPPDATA) out2.push(path60.join(LOCALAPPDATA, "cursor-agent"));
25860
+ if (APPDATA) out2.push(path60.join(APPDATA, "npm"));
25720
25861
  }
25721
25862
  return out2.filter((p2) => {
25722
25863
  try {
@@ -25728,7 +25869,7 @@ function knownAgentBinaryDirs() {
25728
25869
  }
25729
25870
  function expandPathForAgentBinaries(existingPath) {
25730
25871
  const existing = new Set(
25731
- existingPath.split(path59.delimiter).filter((p2) => p2.length > 0)
25872
+ existingPath.split(path60.delimiter).filter((p2) => p2.length > 0)
25732
25873
  );
25733
25874
  const additions = [];
25734
25875
  for (const dir of knownAgentBinaryDirs()) {
@@ -25738,7 +25879,7 @@ function expandPathForAgentBinaries(existingPath) {
25738
25879
  }
25739
25880
  }
25740
25881
  if (additions.length === 0) return existingPath;
25741
- return [...additions, existingPath].filter((p2) => p2.length > 0).join(path59.delimiter);
25882
+ return [...additions, existingPath].filter((p2) => p2.length > 0).join(path60.delimiter);
25742
25883
  }
25743
25884
 
25744
25885
  // src/agents/acp/headroom-budget-proxy.ts
@@ -26220,15 +26361,15 @@ function commonPrefixLength(a, b) {
26220
26361
 
26221
26362
  // src/agents/acp/onboarding.ts
26222
26363
  var import_child_process26 = require("child_process");
26223
- var fs56 = __toESM(require("fs"));
26224
- var os45 = __toESM(require("os"));
26225
- var path60 = __toESM(require("path"));
26364
+ var fs57 = __toESM(require("fs"));
26365
+ var os46 = __toESM(require("os"));
26366
+ var path61 = __toESM(require("path"));
26226
26367
  var _onboardingSeam = {
26227
- markerPath: (sessionId) => path60.join(os45.homedir(), ".codeam", "welcomed", `${sessionId}.done`),
26228
- exists: (p2) => fs56.existsSync(p2),
26368
+ markerPath: (sessionId) => path61.join(os46.homedir(), ".codeam", "welcomed", `${sessionId}.done`),
26369
+ exists: (p2) => fs57.existsSync(p2),
26229
26370
  write: (p2) => {
26230
- fs56.mkdirSync(path60.dirname(p2), { recursive: true });
26231
- fs56.writeFileSync(p2, "");
26371
+ fs57.mkdirSync(path61.dirname(p2), { recursive: true });
26372
+ fs57.writeFileSync(p2, "");
26232
26373
  },
26233
26374
  disabled: () => {
26234
26375
  const v = process.env.CODEAM_ONBOARDING_DISABLED;
@@ -26265,7 +26406,7 @@ function resolveRepoName(cwd) {
26265
26406
  if (name) return name;
26266
26407
  }
26267
26408
  }
26268
- const base = path60.basename(cwd || "");
26409
+ const base = path61.basename(cwd || "");
26269
26410
  if (base && !isUuid(base)) return base;
26270
26411
  return "this project";
26271
26412
  }
@@ -26328,7 +26469,7 @@ async function runOnboardingTurn(opts) {
26328
26469
  }
26329
26470
 
26330
26471
  // src/agents/acp/mappers.ts
26331
- var import_node_crypto7 = require("crypto");
26472
+ var import_node_crypto8 = require("crypto");
26332
26473
  function mapSessionUpdate(notification) {
26333
26474
  const update = notification.update;
26334
26475
  switch (update.sessionUpdate) {
@@ -26391,7 +26532,7 @@ function mapPermissionRequest(request) {
26391
26532
  }
26392
26533
  return {
26393
26534
  event: {
26394
- questionId: (0, import_node_crypto7.randomUUID)(),
26535
+ questionId: (0, import_node_crypto8.randomUUID)(),
26395
26536
  prompt,
26396
26537
  options: labels.length > 0 ? labels : void 0
26397
26538
  },
@@ -26401,7 +26542,7 @@ function mapPermissionRequest(request) {
26401
26542
  }
26402
26543
  function messageChunkId(messageId) {
26403
26544
  if (typeof messageId === "string" && messageId.length > 0) return messageId;
26404
- return (0, import_node_crypto7.randomUUID)();
26545
+ return (0, import_node_crypto8.randomUUID)();
26405
26546
  }
26406
26547
  function extractText4(content) {
26407
26548
  if (!content || typeof content !== "object") return null;
@@ -26517,8 +26658,8 @@ var import_crypto5 = require("crypto");
26517
26658
 
26518
26659
  // src/services/turn-files/git-changeset.ts
26519
26660
  var import_child_process27 = require("child_process");
26520
- var fs57 = __toESM(require("fs/promises"));
26521
- var path61 = __toESM(require("path"));
26661
+ var fs58 = __toESM(require("fs/promises"));
26662
+ var path62 = __toESM(require("path"));
26522
26663
  async function collectRepoChangeset(opts) {
26523
26664
  const status2 = await runGit3(opts.repoRoot, ["status", "--porcelain=v1", "-z"]);
26524
26665
  if (status2 === null) return null;
@@ -26536,7 +26677,7 @@ async function collectRepoChangeset(opts) {
26536
26677
  let stats;
26537
26678
  if (row.fileStatus === "added" && numstatEntry === void 0) {
26538
26679
  const lineCount = await readUntrackedLineCount(
26539
- path61.join(opts.repoRoot, row.filePath)
26680
+ path62.join(opts.repoRoot, row.filePath)
26540
26681
  );
26541
26682
  stats = { added: lineCount, removed: 0 };
26542
26683
  } else {
@@ -26567,7 +26708,7 @@ function readUntrackedLineCount(absPath) {
26567
26708
  }
26568
26709
  async function defaultReadUntrackedLineCount(absPath) {
26569
26710
  try {
26570
- const content = await fs57.readFile(absPath, "utf8");
26711
+ const content = await fs58.readFile(absPath, "utf8");
26571
26712
  let count = 0;
26572
26713
  let pos = -1;
26573
26714
  while ((pos = content.indexOf("\n", pos + 1)) !== -1) {
@@ -26659,7 +26800,7 @@ function defaultRunGit(cwd, args2) {
26659
26800
  });
26660
26801
  }
26661
26802
  async function discoverRepos(workingDir, maxDepth = 4) {
26662
- const fs62 = await import("fs/promises");
26803
+ const fs63 = await import("fs/promises");
26663
26804
  const out2 = [];
26664
26805
  await walk(workingDir, 0);
26665
26806
  return out2;
@@ -26667,7 +26808,7 @@ async function discoverRepos(workingDir, maxDepth = 4) {
26667
26808
  if (depth > maxDepth) return;
26668
26809
  let entries = [];
26669
26810
  try {
26670
- const dirents = await fs62.readdir(dir, { withFileTypes: true });
26811
+ const dirents = await fs63.readdir(dir, { withFileTypes: true });
26671
26812
  entries = dirents.filter((d3) => !d3.name.startsWith(".") || d3.name === ".git").map((d3) => ({ name: d3.name, isDirectory: d3.isDirectory() }));
26672
26813
  } catch {
26673
26814
  return;
@@ -26678,8 +26819,8 @@ async function discoverRepos(workingDir, maxDepth = 4) {
26678
26819
  if (hasGit) {
26679
26820
  out2.push({
26680
26821
  repoRoot: dir,
26681
- repoPath: path61.relative(workingDir, dir),
26682
- repoName: path61.basename(dir)
26822
+ repoPath: path62.relative(workingDir, dir),
26823
+ repoName: path62.basename(dir)
26683
26824
  });
26684
26825
  return;
26685
26826
  }
@@ -26687,14 +26828,14 @@ async function discoverRepos(workingDir, maxDepth = 4) {
26687
26828
  if (!entry.isDirectory) continue;
26688
26829
  if (entry.name === "node_modules") continue;
26689
26830
  if (entry.name === "dist" || entry.name === "build") continue;
26690
- await walk(path61.join(dir, entry.name), depth + 1);
26831
+ await walk(path62.join(dir, entry.name), depth + 1);
26691
26832
  }
26692
26833
  }
26693
26834
  }
26694
26835
 
26695
26836
  // src/services/turn-files/files-outbox.ts
26696
- var fs58 = __toESM(require("fs/promises"));
26697
- var path62 = __toESM(require("path"));
26837
+ var fs59 = __toESM(require("fs/promises"));
26838
+ var path63 = __toESM(require("path"));
26698
26839
  var import_os9 = require("os");
26699
26840
  var HOME_OUTBOX_DIR = ".codeam/outbox";
26700
26841
  var MAX_AGE_MS = 24 * 60 * 60 * 1e3;
@@ -26727,16 +26868,16 @@ var FilesOutbox = class {
26727
26868
  backoffIndex = 0;
26728
26869
  stopped = false;
26729
26870
  constructor(opts) {
26730
- const base = opts.baseDir ?? path62.join(homeDir(), HOME_OUTBOX_DIR);
26731
- this.filePath = path62.join(base, `${opts.sessionId}.jsonl`);
26871
+ const base = opts.baseDir ?? path63.join(homeDir(), HOME_OUTBOX_DIR);
26872
+ this.filePath = path63.join(base, `${opts.sessionId}.jsonl`);
26732
26873
  this.post = opts.post;
26733
26874
  this.autoSchedule = opts.autoSchedule !== false;
26734
26875
  }
26735
26876
  /** Persist the entry to disk and trigger a flush. Returns once the
26736
26877
  * line is durable on disk (not once the POST succeeds). */
26737
26878
  async enqueue(entry) {
26738
- await fs58.mkdir(path62.dirname(this.filePath), { recursive: true });
26739
- await fs58.appendFile(this.filePath, JSON.stringify(entry) + "\n", "utf8");
26879
+ await fs59.mkdir(path63.dirname(this.filePath), { recursive: true });
26880
+ await fs59.appendFile(this.filePath, JSON.stringify(entry) + "\n", "utf8");
26740
26881
  this.backoffIndex = 0;
26741
26882
  if (this.autoSchedule) this.scheduleFlush(0);
26742
26883
  }
@@ -26825,7 +26966,7 @@ var FilesOutbox = class {
26825
26966
  async readAll() {
26826
26967
  let raw = "";
26827
26968
  try {
26828
- raw = await fs58.readFile(this.filePath, "utf8");
26969
+ raw = await fs59.readFile(this.filePath, "utf8");
26829
26970
  } catch {
26830
26971
  return [];
26831
26972
  }
@@ -26849,12 +26990,12 @@ var FilesOutbox = class {
26849
26990
  async rewrite(entries) {
26850
26991
  const tmpPath = `${this.filePath}.${process.pid}.tmp`;
26851
26992
  if (entries.length === 0) {
26852
- await fs58.unlink(this.filePath).catch(() => void 0);
26993
+ await fs59.unlink(this.filePath).catch(() => void 0);
26853
26994
  return;
26854
26995
  }
26855
26996
  const payload = entries.map((e) => JSON.stringify(e)).join("\n") + "\n";
26856
- await fs58.writeFile(tmpPath, payload, "utf8");
26857
- await fs58.rename(tmpPath, this.filePath);
26997
+ await fs59.writeFile(tmpPath, payload, "utf8");
26998
+ await fs59.rename(tmpPath, this.filePath);
26858
26999
  }
26859
27000
  };
26860
27001
  function applyJitter(ms) {
@@ -28214,7 +28355,7 @@ var AcpHistory = class {
28214
28355
  this.summary = trimmed.length > 120 ? trimmed.slice(0, 117) + "\u2026" : trimmed;
28215
28356
  }
28216
28357
  this.messages.push({
28217
- id: (0, import_node_crypto8.randomUUID)(),
28358
+ id: (0, import_node_crypto9.randomUUID)(),
28218
28359
  role: "user",
28219
28360
  text,
28220
28361
  timestamp: Date.now()
@@ -28223,7 +28364,7 @@ var AcpHistory = class {
28223
28364
  appendAgentReply(text) {
28224
28365
  if (text.length === 0) return;
28225
28366
  this.messages.push({
28226
- id: (0, import_node_crypto8.randomUUID)(),
28367
+ id: (0, import_node_crypto9.randomUUID)(),
28227
28368
  role: "agent",
28228
28369
  text,
28229
28370
  timestamp: Date.now()
@@ -28429,7 +28570,7 @@ async function runAcpSession(opts) {
28429
28570
  currentIndex: 0,
28430
28571
  done: true
28431
28572
  }),
28432
- publishAwaitingAnswer: (prompt, options) => publisher.publishAwaitingAnswer({ questionId: (0, import_node_crypto8.randomUUID)(), prompt, options }),
28573
+ publishAwaitingAnswer: (prompt, options) => publisher.publishAwaitingAnswer({ questionId: (0, import_node_crypto9.randomUUID)(), prompt, options }),
28433
28574
  publishRawChunk: (chunk) => publisher.publishOutput(chunk),
28434
28575
  sendResult: (commandId, status2, result) => relay.sendResult(commandId, status2, result),
28435
28576
  appendAgentReply: (text) => history.appendAgentReply(text),
@@ -29798,7 +29939,7 @@ var NativeTuiDriver = class {
29798
29939
  };
29799
29940
 
29800
29941
  // src/baton/acp-driver.ts
29801
- var import_node_crypto9 = require("crypto");
29942
+ var import_node_crypto10 = require("crypto");
29802
29943
  var AcpDriver = class {
29803
29944
  constructor(deps) {
29804
29945
  this.deps = deps;
@@ -29891,7 +30032,7 @@ var AcpDriver = class {
29891
30032
  currentIndex: 0,
29892
30033
  done: true
29893
30034
  }),
29894
- publishAwaitingAnswer: (prompt, options) => publisher.publishAwaitingAnswer({ questionId: (0, import_node_crypto9.randomUUID)(), prompt, options }),
30035
+ publishAwaitingAnswer: (prompt, options) => publisher.publishAwaitingAnswer({ questionId: (0, import_node_crypto10.randomUUID)(), prompt, options }),
29895
30036
  publishRawChunk: (chunk) => publisher.publishOutput(chunk),
29896
30037
  sendResult: (commandId, status2, result) => relay.sendResult(commandId, status2, result),
29897
30038
  appendAgentReply: (text) => history.appendAgentReply(text),
@@ -29934,7 +30075,7 @@ var AcpDriver = class {
29934
30075
  };
29935
30076
 
29936
30077
  // src/baton/transcript-mirror.ts
29937
- var fs59 = __toESM(require("fs"));
30078
+ var fs60 = __toESM(require("fs"));
29938
30079
  var TranscriptMirror = class {
29939
30080
  constructor(deps) {
29940
30081
  this.deps = deps;
@@ -30001,7 +30142,7 @@ var TranscriptMirror = class {
30001
30142
  }
30002
30143
  };
30003
30144
  function defaultWatch(file, onChange) {
30004
- const w3 = fs59.watch(file, { persistent: false }, () => onChange());
30145
+ const w3 = fs60.watch(file, { persistent: false }, () => onChange());
30005
30146
  return () => w3.close();
30006
30147
  }
30007
30148
 
@@ -30248,15 +30389,15 @@ function toEpochMs(ts) {
30248
30389
  }
30249
30390
 
30250
30391
  // src/agents/claude/onboarding.ts
30251
- var fs60 = __toESM(require("fs"));
30252
- var os46 = __toESM(require("os"));
30253
- var path63 = __toESM(require("path"));
30392
+ var fs61 = __toESM(require("fs"));
30393
+ var os47 = __toESM(require("os"));
30394
+ var path64 = __toESM(require("path"));
30254
30395
  function ensureClaudeOnboarded() {
30255
30396
  try {
30256
- const file = path63.join(os46.homedir(), ".claude.json");
30397
+ const file = path64.join(os47.homedir(), ".claude.json");
30257
30398
  let config = {};
30258
30399
  try {
30259
- config = JSON.parse(fs60.readFileSync(file, "utf8"));
30400
+ config = JSON.parse(fs61.readFileSync(file, "utf8"));
30260
30401
  } catch {
30261
30402
  }
30262
30403
  if (config.hasCompletedOnboarding === true && typeof config.theme === "string") {
@@ -30267,8 +30408,8 @@ function ensureClaudeOnboarded() {
30267
30408
  if (typeof config.lastOnboardingVersion !== "string") {
30268
30409
  config.lastOnboardingVersion = "2.1.177";
30269
30410
  }
30270
- fs60.mkdirSync(path63.dirname(file), { recursive: true });
30271
- fs60.writeFileSync(file, JSON.stringify(config, null, 2));
30411
+ fs61.mkdirSync(path64.dirname(file), { recursive: true });
30412
+ fs61.writeFileSync(file, JSON.stringify(config, null, 2));
30272
30413
  log.info("claude", "pre-completed Claude onboarding (skip first-run theme picker)");
30273
30414
  } catch (err) {
30274
30415
  log.warn("claude", `ensureClaudeOnboarded failed (non-fatal): ${err.message}`);
@@ -30942,7 +31083,7 @@ var import_picocolors11 = __toESM(require("picocolors"));
30942
31083
  var import_child_process28 = require("child_process");
30943
31084
  var import_util4 = require("util");
30944
31085
  var import_picocolors9 = __toESM(require("picocolors"));
30945
- var path64 = __toESM(require("path"));
31086
+ var path65 = __toESM(require("path"));
30946
31087
  var execFileP6 = (0, import_util4.promisify)(import_child_process28.execFile);
30947
31088
  var MAX_BUFFER = 8 * 1024 * 1024;
30948
31089
  function resetStdinForChild() {
@@ -31431,7 +31572,7 @@ var GitHubCodespacesProvider = class {
31431
31572
  });
31432
31573
  }
31433
31574
  async uploadFile(workspaceId, remotePath, contents, options = {}) {
31434
- const remoteDir = path64.posix.dirname(remotePath);
31575
+ const remoteDir = path65.posix.dirname(remotePath);
31435
31576
  const parts = [
31436
31577
  `mkdir -p ${shellQuote(remoteDir)}`,
31437
31578
  `cat > ${shellQuote(remotePath)}`
@@ -31501,7 +31642,7 @@ function shellQuote(s) {
31501
31642
  // src/services/providers/gitpod.ts
31502
31643
  var import_child_process29 = require("child_process");
31503
31644
  var import_util5 = require("util");
31504
- var path65 = __toESM(require("path"));
31645
+ var path66 = __toESM(require("path"));
31505
31646
  var import_picocolors10 = __toESM(require("picocolors"));
31506
31647
  var execFileP7 = (0, import_util5.promisify)(import_child_process29.execFile);
31507
31648
  var MAX_BUFFER2 = 8 * 1024 * 1024;
@@ -31741,7 +31882,7 @@ var GitpodProvider = class {
31741
31882
  });
31742
31883
  }
31743
31884
  async uploadFile(workspaceId, remotePath, contents, options = {}) {
31744
- const remoteDir = path65.posix.dirname(remotePath);
31885
+ const remoteDir = path66.posix.dirname(remotePath);
31745
31886
  const parts = [
31746
31887
  `mkdir -p ${shellQuote2(remoteDir)}`,
31747
31888
  `cat > ${shellQuote2(remotePath)}`
@@ -31777,7 +31918,7 @@ function shellQuote2(s) {
31777
31918
  // src/services/providers/gitlab-workspaces.ts
31778
31919
  var import_child_process30 = require("child_process");
31779
31920
  var import_util6 = require("util");
31780
- var path66 = __toESM(require("path"));
31921
+ var path67 = __toESM(require("path"));
31781
31922
  var execFileP8 = (0, import_util6.promisify)(import_child_process30.execFile);
31782
31923
  var MAX_BUFFER3 = 8 * 1024 * 1024;
31783
31924
  var GITLAB_API_BASE = process.env.CODEAM_GITLAB_API_URL ?? "https://gitlab.com/api/v4";
@@ -32037,7 +32178,7 @@ Docs: https://docs.gitlab.com/ee/user/workspace/configuration.html`
32037
32178
  }
32038
32179
  async uploadFile(workspaceId, remotePath, contents, options = {}) {
32039
32180
  const sshHost = process.env.CODEAM_GITLAB_SSH_HOST ?? "workspaces.gitlab.com";
32040
- const remoteDir = path66.posix.dirname(remotePath);
32181
+ const remoteDir = path67.posix.dirname(remotePath);
32041
32182
  const parts = [`mkdir -p ${shellQuote3(remoteDir)}`, `cat > ${shellQuote3(remotePath)}`];
32042
32183
  if (options.mode != null) {
32043
32184
  parts.push(`chmod ${options.mode.toString(8)} ${shellQuote3(remotePath)}`);
@@ -32105,7 +32246,7 @@ function shellQuote3(s) {
32105
32246
  // src/services/providers/railway.ts
32106
32247
  var import_child_process31 = require("child_process");
32107
32248
  var import_util7 = require("util");
32108
- var path67 = __toESM(require("path"));
32249
+ var path68 = __toESM(require("path"));
32109
32250
  var execFileP9 = (0, import_util7.promisify)(import_child_process31.execFile);
32110
32251
  var MAX_BUFFER4 = 8 * 1024 * 1024;
32111
32252
  function resetStdinForChild4() {
@@ -32341,7 +32482,7 @@ var RailwayProvider = class {
32341
32482
  if (!projectId || !serviceId) {
32342
32483
  throw new Error("Invalid Railway workspace id (expected projectId/serviceId).");
32343
32484
  }
32344
- const remoteDir = path67.posix.dirname(remotePath);
32485
+ const remoteDir = path68.posix.dirname(remotePath);
32345
32486
  const parts = [`mkdir -p ${shellQuote4(remoteDir)}`, `cat > ${shellQuote4(remotePath)}`];
32346
32487
  if (options.mode != null) {
32347
32488
  parts.push(`chmod ${options.mode.toString(8)} ${shellQuote4(remotePath)}`);
@@ -32986,9 +33127,9 @@ async function invite() {
32986
33127
  // src/commands/doctor.ts
32987
33128
  var import_node_dns = require("dns");
32988
33129
  var import_node_util5 = require("util");
32989
- var import_node_crypto10 = require("crypto");
32990
- var fs61 = __toESM(require("fs"));
32991
- var path68 = __toESM(require("path"));
33130
+ var import_node_crypto11 = require("crypto");
33131
+ var fs62 = __toESM(require("fs"));
33132
+ var path69 = __toESM(require("path"));
32992
33133
  var import_picocolors14 = __toESM(require("picocolors"));
32993
33134
  var dnsResolveP = (0, import_node_util5.promisify)(import_node_dns.resolve);
32994
33135
  async function checkDns(apiBase2) {
@@ -33044,13 +33185,13 @@ async function checkHealth(apiBase2) {
33044
33185
  }
33045
33186
  }
33046
33187
  function checkConfigDir() {
33047
- const dir = path68.join(require("os").homedir(), ".codeam");
33188
+ const dir = path69.join(require("os").homedir(), ".codeam");
33048
33189
  try {
33049
- fs61.mkdirSync(dir, { recursive: true, mode: 448 });
33050
- const probe = path68.join(dir, ".doctor-probe");
33051
- fs61.writeFileSync(probe, "ok", { mode: 384 });
33052
- const read2 = fs61.readFileSync(probe, "utf8");
33053
- fs61.unlinkSync(probe);
33190
+ fs62.mkdirSync(dir, { recursive: true, mode: 448 });
33191
+ const probe = path69.join(dir, ".doctor-probe");
33192
+ fs62.writeFileSync(probe, "ok", { mode: 384 });
33193
+ const read2 = fs62.readFileSync(probe, "utf8");
33194
+ fs62.unlinkSync(probe);
33054
33195
  if (read2 !== "ok") throw new Error("write/read round-trip mismatch");
33055
33196
  return {
33056
33197
  id: "config-dir",
@@ -33090,9 +33231,9 @@ function checkSessions() {
33090
33231
  }
33091
33232
  }
33092
33233
  function checkAgentBinaries() {
33093
- const os48 = createOsStrategy();
33234
+ const os49 = createOsStrategy();
33094
33235
  return getEnabledAgents().map((meta) => {
33095
- const found = os48.findInPath(meta.binaryName);
33236
+ const found = os49.findInPath(meta.binaryName);
33096
33237
  return {
33097
33238
  id: `agent-${meta.id}`,
33098
33239
  label: `Agent binary: ${meta.displayName} (${meta.binaryName})`,
@@ -33114,7 +33255,7 @@ function checkNodePty() {
33114
33255
  detail: "not required on this platform"
33115
33256
  };
33116
33257
  }
33117
- const vendoredPath = path68.join(__dirname, "vendor", "node-pty");
33258
+ const vendoredPath = path69.join(__dirname, "vendor", "node-pty");
33118
33259
  for (const target of [vendoredPath, "node-pty"]) {
33119
33260
  try {
33120
33261
  require(target);
@@ -33156,9 +33297,9 @@ function checkChokidar() {
33156
33297
  }
33157
33298
  async function doctor(args2 = []) {
33158
33299
  const json = args2.includes("--json");
33159
- const cliVersion = true ? "2.60.15" : "0.0.0-dev";
33300
+ const cliVersion = true ? "2.60.16" : "0.0.0-dev";
33160
33301
  const apiBase2 = resolveApiBaseUrl();
33161
- const diagnosticId = (0, import_node_crypto10.randomUUID)();
33302
+ const diagnosticId = (0, import_node_crypto11.randomUUID)();
33162
33303
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
33163
33304
  const [dns, health] = await Promise.all([
33164
33305
  checkDns(apiBase2),
@@ -33355,7 +33496,7 @@ async function completion(args2) {
33355
33496
  // src/commands/version.ts
33356
33497
  var import_picocolors15 = __toESM(require("picocolors"));
33357
33498
  function version2() {
33358
- const v = true ? "2.60.15" : "unknown";
33499
+ const v = true ? "2.60.16" : "unknown";
33359
33500
  console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
33360
33501
  }
33361
33502
 
@@ -33504,10 +33645,10 @@ var EXIT_CODE_NAMES = {
33504
33645
  };
33505
33646
 
33506
33647
  // src/index.ts
33507
- var os47 = __toESM(require("os"));
33648
+ var os48 = __toESM(require("os"));
33508
33649
  if (!process.env.HOME) {
33509
33650
  try {
33510
- const home = os47.homedir();
33651
+ const home = os48.homedir();
33511
33652
  if (home) process.env.HOME = home;
33512
33653
  } catch {
33513
33654
  }