codeam-cli 2.65.15 → 2.65.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 +301 -202
  3. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -4,6 +4,12 @@ All notable changes to `codeam-cli` are documented here.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [2.65.15] — 2026-08-20
8
+
9
+ ### Fixed
10
+
11
+ - **cli:** Resume-spawn retry + visible failure; agent install dirs on every ACP spawn PATH (#645)
12
+
7
13
  ## [2.65.14] — 2026-08-20
8
14
 
9
15
  ### CI
package/dist/index.js CHANGED
@@ -948,6 +948,8 @@ function isKnownAgentId(id) {
948
948
 
949
949
  // ../../packages/shared/src/agents/identity.ts
950
950
  var HOUSE_AGENT_ID = "house-codeagent-cloud";
951
+ var HOUSE_AGENT_NAME = "CodeAgent Cloud";
952
+ var HOUSE_AGENT_SUBTITLE = "Included \u2014 no setup";
951
953
  var PUBLIC_TO_INTERNAL = {
952
954
  claude_code: "claude",
953
955
  // CLI-side extra: self-hosted deploy payloads may carry the internal id.
@@ -3154,11 +3156,11 @@ function quiet(fn) {
3154
3156
  log.debug(TAG, "ignored sync error", err);
3155
3157
  }
3156
3158
  }
3157
- function rmIfExistsQuiet(path93) {
3159
+ function rmIfExistsQuiet(path94) {
3158
3160
  try {
3159
- fs2.rmSync(path93, { force: true });
3161
+ fs2.rmSync(path94, { force: true });
3160
3162
  } catch (err) {
3161
- log.debug(TAG, `rmIfExists failed for ${path93}`, err);
3163
+ log.debug(TAG, `rmIfExists failed for ${path94}`, err);
3162
3164
  }
3163
3165
  }
3164
3166
  function killQuiet(target, signal = "SIGTERM") {
@@ -3365,8 +3367,8 @@ function createGetModuleFromFilename(basePath = process.argv[1] ? (0, import_pat
3365
3367
  return decodedFile;
3366
3368
  };
3367
3369
  }
3368
- function normalizeWindowsPath(path93) {
3369
- return path93.replace(/^[A-Z]:/, "").replace(/\\/g, "/");
3370
+ function normalizeWindowsPath(path94) {
3371
+ return path94.replace(/^[A-Z]:/, "").replace(/\\/g, "/");
3370
3372
  }
3371
3373
 
3372
3374
  // ../../node_modules/@posthog/core/dist/featureFlagUtils.mjs
@@ -5846,9 +5848,9 @@ async function addSourceContext(frames) {
5846
5848
  LRU_FILE_CONTENTS_CACHE.reduce();
5847
5849
  return frames;
5848
5850
  }
5849
- function getContextLinesFromFile(path93, ranges, output) {
5851
+ function getContextLinesFromFile(path94, ranges, output) {
5850
5852
  return new Promise((resolve10) => {
5851
- const stream = (0, import_node_fs.createReadStream)(path93);
5853
+ const stream = (0, import_node_fs.createReadStream)(path94);
5852
5854
  const lineReaded = (0, import_node_readline.createInterface)({
5853
5855
  input: stream
5854
5856
  });
@@ -5863,7 +5865,7 @@ function getContextLinesFromFile(path93, ranges, output) {
5863
5865
  let rangeStart = range[0];
5864
5866
  let rangeEnd = range[1];
5865
5867
  function onStreamError() {
5866
- LRU_FILE_CONTENTS_FS_READ_FAILED.set(path93, 1);
5868
+ LRU_FILE_CONTENTS_FS_READ_FAILED.set(path94, 1);
5867
5869
  lineReaded.close();
5868
5870
  lineReaded.removeAllListeners();
5869
5871
  destroyStreamAndResolve();
@@ -5924,8 +5926,8 @@ function clearLineContext(frame) {
5924
5926
  delete frame.context_line;
5925
5927
  delete frame.post_context;
5926
5928
  }
5927
- function shouldSkipContextLinesForFile(path93) {
5928
- return path93.startsWith("node:") || path93.endsWith(".min.js") || path93.endsWith(".min.cjs") || path93.endsWith(".min.mjs") || path93.startsWith("data:");
5929
+ function shouldSkipContextLinesForFile(path94) {
5930
+ return path94.startsWith("node:") || path94.endsWith(".min.js") || path94.endsWith(".min.cjs") || path94.endsWith(".min.mjs") || path94.startsWith("data:");
5929
5931
  }
5930
5932
  function shouldSkipContextLinesForFrame(frame) {
5931
5933
  if (void 0 !== frame.lineno && frame.lineno > MAX_CONTEXTLINES_LINENO) return true;
@@ -8079,7 +8081,7 @@ function readAnonId() {
8079
8081
  }
8080
8082
  function superProperties() {
8081
8083
  return {
8082
- cliVersion: true ? "2.65.15" : "0.0.0-dev",
8084
+ cliVersion: true ? "2.65.16" : "0.0.0-dev",
8083
8085
  nodeVersion: process.version,
8084
8086
  platform: process.platform,
8085
8087
  arch: process.arch,
@@ -8321,7 +8323,7 @@ var http = __toESM(require("http"));
8321
8323
  // package.json
8322
8324
  var package_default = {
8323
8325
  name: "codeam-cli",
8324
- version: "2.65.15",
8326
+ version: "2.65.16",
8325
8327
  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.",
8326
8328
  type: "commonjs",
8327
8329
  main: "dist/index.js",
@@ -8719,11 +8721,12 @@ async function fetchProvisionCredentialDetailed(input) {
8719
8721
  input.pluginAuthToken
8720
8722
  );
8721
8723
  const data = res?.data;
8722
- if (data && (data.method === "api_key" || data.method === "oauth") && typeof data.credential === "string" && data.credential.length > 0) {
8724
+ if (data && (data.method === "api_key" || data.method === "oauth" || data.method === "house_proxy") && typeof data.credential === "string" && data.credential.length > 0) {
8723
8725
  return {
8724
8726
  ok: true,
8725
8727
  method: data.method,
8726
8728
  credential: data.credential,
8729
+ ...typeof data.baseUrl === "string" && data.baseUrl.length > 0 ? { baseUrl: data.baseUrl } : {},
8727
8730
  ...typeof data.installScript === "string" && data.installScript.length > 0 ? { installScript: data.installScript } : {}
8728
8731
  };
8729
8732
  }
@@ -8737,7 +8740,7 @@ async function fetchProvisionCredentialDetailed(input) {
8737
8740
  }
8738
8741
  async function fetchProvisionCredential(input) {
8739
8742
  const res = await fetchProvisionCredentialDetailed(input);
8740
- if (!res.ok) return null;
8743
+ if (!res.ok || res.method === "house_proxy") return null;
8741
8744
  return {
8742
8745
  method: res.method,
8743
8746
  credential: res.credential,
@@ -9842,7 +9845,7 @@ var CommandRelayService = class _CommandRelayService {
9842
9845
  // fresh + clear the "CLI update available" banner after a self-update
9843
9846
  // (a codespace that reinstalls @latest reconnects via heartbeat, not
9844
9847
  // pair/reconnect). Older backends ignore the extra field.
9845
- ..."2.65.15" ? { ideVersion: "2.65.15" } : {}
9848
+ ..."2.65.16" ? { ideVersion: "2.65.16" } : {}
9846
9849
  }).then(() => log.trace("relay", `heartbeat ok online=${online}`)).catch((err) => log.trace("relay", `heartbeat failed online=${online}`, err));
9847
9850
  }
9848
9851
  /**
@@ -10102,10 +10105,10 @@ var WINDOWS_LEGACY_JUNCTIONS = [
10102
10105
  /[\\/]Start Menu([\\/]|$)/i,
10103
10106
  /[\\/]Templates([\\/]|$)/i
10104
10107
  ];
10105
- function isUnsafeWindowsWatchRoot(dir, homedir53) {
10108
+ function isUnsafeWindowsWatchRoot(dir, homedir54) {
10106
10109
  const norm = (p2) => p2.replace(/\//g, "\\").replace(/\\+$/, "").toLowerCase();
10107
10110
  const cwd = norm(dir);
10108
- const home = norm(homedir53);
10111
+ const home = norm(homedir54);
10109
10112
  if (cwd === home) return true;
10110
10113
  if (/^[a-z]:$/.test(cwd)) return true;
10111
10114
  const sysRoots = [
@@ -14761,10 +14764,10 @@ function buildForPlatform(platform3) {
14761
14764
  var import_node_crypto4 = require("crypto");
14762
14765
 
14763
14766
  // src/agents/claude/resolver.ts
14764
- function buildClaudeLaunch(extraArgs = [], os67 = createOsStrategy()) {
14765
- const found = os67.findInPath("claude") ?? os67.findInPath("claude-code");
14767
+ function buildClaudeLaunch(extraArgs = [], os68 = createOsStrategy()) {
14768
+ const found = os68.findInPath("claude") ?? os68.findInPath("claude-code");
14766
14769
  if (!found) return null;
14767
- return os67.buildLaunch(found, extraArgs);
14770
+ return os68.buildLaunch(found, extraArgs);
14768
14771
  }
14769
14772
 
14770
14773
  // src/agents/claude/installer.ts
@@ -15524,8 +15527,8 @@ var ClaudeRuntimeStrategy = class {
15524
15527
  meta = getAgent("claude");
15525
15528
  mode = "interactive";
15526
15529
  os;
15527
- constructor(os67) {
15528
- this.os = os67;
15530
+ constructor(os68) {
15531
+ this.os = os68;
15529
15532
  }
15530
15533
  /**
15531
15534
  * Claude Code's react-ink TUI enables bracketed-paste mode at
@@ -16613,8 +16616,8 @@ function codexCredentialLocator() {
16613
16616
  function codexLoginLauncher() {
16614
16617
  return {
16615
16618
  async ensureInstalled() {
16616
- const os67 = createOsStrategy();
16617
- return os67.findInPath("codex") !== null;
16619
+ const os68 = createOsStrategy();
16620
+ return os68.findInPath("codex") !== null;
16618
16621
  },
16619
16622
  launch() {
16620
16623
  return (0, import_node_child_process4.spawn)("codex", ["login"], { stdio: "inherit" });
@@ -16637,8 +16640,8 @@ var CodexRuntimeStrategy = class {
16637
16640
  meta = getAgent("codex");
16638
16641
  mode = "interactive";
16639
16642
  os;
16640
- constructor(os67) {
16641
- this.os = os67;
16643
+ constructor(os68) {
16644
+ this.os = os68;
16642
16645
  }
16643
16646
  async prepareLaunch() {
16644
16647
  let binary = this.os.findInPath("codex");
@@ -16747,12 +16750,12 @@ var CodexRuntimeStrategy = class {
16747
16750
  });
16748
16751
  }
16749
16752
  };
16750
- function resolveNpm(os67) {
16751
- return os67.id === "win32" ? "npm.cmd" : "npm";
16753
+ function resolveNpm(os68) {
16754
+ return os68.id === "win32" ? "npm.cmd" : "npm";
16752
16755
  }
16753
- async function installCodexViaNpm(os67) {
16756
+ async function installCodexViaNpm(os68) {
16754
16757
  return new Promise((resolve10, reject) => {
16755
- const proc = (0, import_node_child_process5.spawn)(resolveNpm(os67), ["install", "-g", "@openai/codex"], {
16758
+ const proc = (0, import_node_child_process5.spawn)(resolveNpm(os68), ["install", "-g", "@openai/codex"], {
16756
16759
  stdio: "inherit"
16757
16760
  });
16758
16761
  proc.on("close", (code) => {
@@ -16769,16 +16772,16 @@ async function installCodexViaNpm(os67) {
16769
16772
  });
16770
16773
  });
16771
16774
  }
16772
- function augmentNpmGlobalBin(os67) {
16775
+ function augmentNpmGlobalBin(os68) {
16773
16776
  try {
16774
- const result = (0, import_node_child_process5.spawnSync)(resolveNpm(os67), ["prefix", "-g"], {
16777
+ const result = (0, import_node_child_process5.spawnSync)(resolveNpm(os68), ["prefix", "-g"], {
16775
16778
  stdio: ["ignore", "pipe", "ignore"]
16776
16779
  });
16777
16780
  if (result.status !== 0) return;
16778
16781
  const prefix = result.stdout.toString().trim();
16779
16782
  if (!prefix) return;
16780
- const binDir = os67.id === "win32" ? prefix : path27.join(prefix, "bin");
16781
- os67.augmentPath([binDir]);
16783
+ const binDir = os68.id === "win32" ? prefix : path27.join(prefix, "bin");
16784
+ os68.augmentPath([binDir]);
16782
16785
  } catch {
16783
16786
  }
16784
16787
  }
@@ -17189,10 +17192,10 @@ function manualInstallHint(runner, tools) {
17189
17192
  const argv = osPackageInstallArgv(detectPackageManager(runner), [...tools]);
17190
17193
  return argv ? `\`sudo ${argv.join(" ")}\`` : `your package manager (e.g. \`${pkgs}\`)`;
17191
17194
  }
17192
- function writeUnzipShim(os67, runner) {
17195
+ function writeUnzipShim(os68, runner) {
17193
17196
  const python = ["python3", "python"].find((p2) => runner.which(p2));
17194
17197
  if (!python) return null;
17195
- const dir = os67.scratchPath("codeam-cr-prereq");
17198
+ const dir = os68.scratchPath("codeam-cr-prereq");
17196
17199
  const shim = path29.join(dir, "unzip");
17197
17200
  const script = `#!/bin/sh
17198
17201
  set -e
@@ -17214,9 +17217,9 @@ exec ${python} -m zipfile -e "$archive" "$dest"
17214
17217
  (0, import_node_fs5.chmodSync)(shim, 448);
17215
17218
  return dir;
17216
17219
  }
17217
- async function ensureInstallPrerequisites(os67, deps = {}) {
17220
+ async function ensureInstallPrerequisites(os68, deps = {}) {
17218
17221
  const runner = deps.runner ?? defaultHeadroomRunner;
17219
- const missing = REQUIRED_TOOLS.filter((t2) => os67.findInPath(t2) === null);
17222
+ const missing = REQUIRED_TOOLS.filter((t2) => os68.findInPath(t2) === null);
17220
17223
  if (missing.length === 0) return { ok: true, extraPath: [] };
17221
17224
  log.info(
17222
17225
  "coderabbit",
@@ -17235,10 +17238,10 @@ async function ensureInstallPrerequisites(os67, deps = {}) {
17235
17238
  );
17236
17239
  }
17237
17240
  }
17238
- const stillMissing = REQUIRED_TOOLS.filter((t2) => os67.findInPath(t2) === null);
17241
+ const stillMissing = REQUIRED_TOOLS.filter((t2) => os68.findInPath(t2) === null);
17239
17242
  if (stillMissing.length === 0) return { ok: true, extraPath: [] };
17240
17243
  if (stillMissing.length === 1 && stillMissing[0] === "unzip") {
17241
- const shimDir = writeUnzipShim(os67, runner);
17244
+ const shimDir = writeUnzipShim(os68, runner);
17242
17245
  if (shimDir) {
17243
17246
  log.info("coderabbit", "unzip is unavailable \u2014 using a scoped python zipfile shim");
17244
17247
  return { ok: true, extraPath: [shimDir] };
@@ -17301,15 +17304,15 @@ function summarizeInstallFailure(output) {
17301
17304
  }
17302
17305
  return lines.length > 0 ? lines[lines.length - 1] : null;
17303
17306
  }
17304
- async function ensureCoderabbitInstalled(os67, deps = {}) {
17305
- if (os67.findInPath("coderabbit")) return { ok: true };
17306
- if (os67.id === "win32") {
17307
+ async function ensureCoderabbitInstalled(os68, deps = {}) {
17308
+ if (os68.findInPath("coderabbit")) return { ok: true };
17309
+ if (os68.id === "win32") {
17307
17310
  return {
17308
17311
  ok: false,
17309
17312
  error: "CodeRabbit on Windows requires WSL. Install the CLI inside your WSL distribution (curl -fsSL https://cli.coderabbit.ai/install.sh | sh), then try again."
17310
17313
  };
17311
17314
  }
17312
- const prereq = await ensureInstallPrerequisites(os67, deps);
17315
+ const prereq = await ensureInstallPrerequisites(os68, deps);
17313
17316
  if (!prereq.ok) return { ok: false, error: prereq.error };
17314
17317
  const env = { ...process.env };
17315
17318
  if (prereq.extraPath.length > 0) {
@@ -17318,8 +17321,8 @@ async function ensureCoderabbitInstalled(os67, deps = {}) {
17318
17321
  log.info("coderabbit", "CodeRabbit CLI not found \u2014 installing via the official script");
17319
17322
  const run = deps.runInstallScript ?? defaultRunInstallScript;
17320
17323
  const { code, output } = await run(env);
17321
- os67.augmentPath([`${os67.homeDir()}/.local/bin`, "/opt/homebrew/bin"]);
17322
- const binary = os67.findInPath("coderabbit");
17324
+ os68.augmentPath([`${os68.homeDir()}/.local/bin`, "/opt/homebrew/bin"]);
17325
+ const binary = os68.findInPath("coderabbit");
17323
17326
  const detail = summarizeInstallFailure(output);
17324
17327
  if (binary !== null) {
17325
17328
  if (code === 0) return { ok: true };
@@ -17373,10 +17376,10 @@ function coderabbitCredentialLocator() {
17373
17376
  validate: validateNonEmptyCredential
17374
17377
  };
17375
17378
  }
17376
- function coderabbitLoginLauncher(os67) {
17379
+ function coderabbitLoginLauncher(os68) {
17377
17380
  return {
17378
17381
  async ensureInstalled() {
17379
- const result = await ensureCoderabbitInstalled(os67);
17382
+ const result = await ensureCoderabbitInstalled(os68);
17380
17383
  if (!result.ok && result.error) console.error(`
17381
17384
  \u2717 ${result.error}
17382
17385
  `);
@@ -17436,8 +17439,8 @@ function pickLine(obj) {
17436
17439
  function toHunk(raw, groupSeverity) {
17437
17440
  if (!raw || typeof raw !== "object") return null;
17438
17441
  const o = raw;
17439
- const path93 = asString(pick(o, ["file_path", "filePath", "file", "path", "filename", "fileName"])) ?? asString(pick(o, ["location"])?.path);
17440
- if (!path93) return null;
17442
+ const path94 = asString(pick(o, ["file_path", "filePath", "file", "path", "filename", "fileName"])) ?? asString(pick(o, ["location"])?.path);
17443
+ if (!path94) return null;
17441
17444
  const message = asString(
17442
17445
  pick(o, [
17443
17446
  "comment",
@@ -17454,7 +17457,7 @@ function toHunk(raw, groupSeverity) {
17454
17457
  const severity = normSeverity(pick(o, ["severity", "level", "priority", "impact"])) ?? normSeverity(groupSeverity);
17455
17458
  const locObj = pick(o, ["location"]) ?? o;
17456
17459
  return {
17457
- path: path93.trim(),
17460
+ path: path94.trim(),
17458
17461
  line: pickLine(o) ?? pickLine(locObj),
17459
17462
  severity,
17460
17463
  message: (title && message ? `${title}: ${message}` : title || message).trim() || "(no message)"
@@ -17537,10 +17540,10 @@ function parsePlain(stdout) {
17537
17540
  for (const line of stdout.split(/\r?\n/)) {
17538
17541
  const m = line.match(HUNK_LINE_RE);
17539
17542
  if (!m) continue;
17540
- const [, path93, lineNo, sevToken, message] = m;
17541
- if (!path93 || !lineNo || !message) continue;
17543
+ const [, path94, lineNo, sevToken, message] = m;
17544
+ if (!path94 || !lineNo || !message) continue;
17542
17545
  hunks.push({
17543
- path: path93.trim(),
17546
+ path: path94.trim(),
17544
17547
  line: Number(lineNo),
17545
17548
  severity: sevToken ? SEVERITY_MAP[sevToken.toLowerCase()] : void 0,
17546
17549
  message: message.trim().replace(/^[*-]\s+/, "")
@@ -17600,8 +17603,8 @@ var CoderabbitRuntimeStrategy = class {
17600
17603
  meta = getAgent("coderabbit");
17601
17604
  mode = "batch";
17602
17605
  os;
17603
- constructor(os67) {
17604
- this.os = os67;
17606
+ constructor(os68) {
17607
+ this.os = os68;
17605
17608
  }
17606
17609
  getDefaultArgs() {
17607
17610
  return ["review", "--agent"];
@@ -17872,10 +17875,10 @@ function cursorCredentialLocator() {
17872
17875
  validate: validateNonEmptyCredential
17873
17876
  };
17874
17877
  }
17875
- function cursorLoginLauncher(os67) {
17878
+ function cursorLoginLauncher(os68) {
17876
17879
  return {
17877
17880
  async ensureInstalled() {
17878
- if (os67.findInPath("cursor-agent")) return true;
17881
+ if (os68.findInPath("cursor-agent")) return true;
17879
17882
  console.error(
17880
17883
  "\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"
17881
17884
  );
@@ -17939,8 +17942,8 @@ var CursorRuntimeStrategy = class {
17939
17942
  meta = getAgent("cursor");
17940
17943
  mode = "interactive";
17941
17944
  os;
17942
- constructor(os67) {
17943
- this.os = os67;
17945
+ constructor(os68) {
17946
+ this.os = os68;
17944
17947
  }
17945
17948
  async prepareLaunch() {
17946
17949
  const binary = this.os.findInPath("cursor-agent");
@@ -18156,10 +18159,10 @@ function aiderCredentialLocator() {
18156
18159
  validate: validateNonEmptyCredential
18157
18160
  };
18158
18161
  }
18159
- function aiderLoginLauncher(os67) {
18162
+ function aiderLoginLauncher(os68) {
18160
18163
  return {
18161
18164
  async ensureInstalled() {
18162
- if (os67.findInPath("aider")) return true;
18165
+ if (os68.findInPath("aider")) return true;
18163
18166
  console.error(
18164
18167
  "\n \u2717 aider binary not on PATH.\n Install Aider:\n pip install aider-chat\n then re-run `codeam link aider`.\n"
18165
18168
  );
@@ -18169,7 +18172,7 @@ function aiderLoginLauncher(os67) {
18169
18172
  console.error(
18170
18173
  "\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"
18171
18174
  );
18172
- return (0, import_node_child_process12.spawn)(os67.id === "win32" ? "cmd.exe" : "sh", os67.id === "win32" ? ["/c", "exit", "0"] : ["-c", "exit 0"], {
18175
+ return (0, import_node_child_process12.spawn)(os68.id === "win32" ? "cmd.exe" : "sh", os68.id === "win32" ? ["/c", "exit", "0"] : ["-c", "exit 0"], {
18173
18176
  stdio: "ignore"
18174
18177
  });
18175
18178
  }
@@ -18444,8 +18447,8 @@ var AiderRuntimeStrategy = class {
18444
18447
  meta = getAgent("aider");
18445
18448
  mode = "interactive";
18446
18449
  os;
18447
- constructor(os67) {
18448
- this.os = os67;
18450
+ constructor(os68) {
18451
+ this.os = os68;
18449
18452
  }
18450
18453
  async prepareLaunch() {
18451
18454
  augmentUserLocalBinPaths();
@@ -18578,8 +18581,8 @@ function geminiCredentialLocator() {
18578
18581
  function geminiLoginLauncher() {
18579
18582
  return {
18580
18583
  async ensureInstalled() {
18581
- const os67 = createOsStrategy();
18582
- return os67.findInPath("gemini") !== null;
18584
+ const os68 = createOsStrategy();
18585
+ return os68.findInPath("gemini") !== null;
18583
18586
  },
18584
18587
  launch() {
18585
18588
  return (0, import_node_child_process13.spawn)("gemini", ["auth", "login"], { stdio: "inherit" });
@@ -18769,8 +18772,8 @@ var GeminiRuntimeStrategy = class {
18769
18772
  meta = getAgent("gemini");
18770
18773
  mode = "interactive";
18771
18774
  os;
18772
- constructor(os67) {
18773
- this.os = os67;
18775
+ constructor(os68) {
18776
+ this.os = os68;
18774
18777
  }
18775
18778
  async prepareLaunch() {
18776
18779
  const binary = this.os.findInPath("gemini");
@@ -19061,8 +19064,8 @@ var KimiRuntimeStrategy = class {
19061
19064
  meta = getAgent("kimi");
19062
19065
  mode = "interactive";
19063
19066
  os;
19064
- constructor(os67) {
19065
- this.os = os67;
19067
+ constructor(os68) {
19068
+ this.os = os68;
19066
19069
  }
19067
19070
  async prepareLaunch() {
19068
19071
  const binary = this.os.findInPath("kimi");
@@ -19204,8 +19207,8 @@ var OpencodeRuntimeStrategy = class {
19204
19207
  meta = getAgent("opencode");
19205
19208
  mode = "interactive";
19206
19209
  os;
19207
- constructor(os67) {
19208
- this.os = os67;
19210
+ constructor(os68) {
19211
+ this.os = os68;
19209
19212
  }
19210
19213
  async prepareLaunch() {
19211
19214
  const binary = this.os.findInPath("opencode");
@@ -19289,20 +19292,20 @@ var OpencodeRuntimeStrategy = class {
19289
19292
 
19290
19293
  // src/agents/registry.ts
19291
19294
  var runtimeBuilders = {
19292
- claude: (os67) => new ClaudeRuntimeStrategy(os67),
19293
- codex: (os67) => new CodexRuntimeStrategy(os67),
19294
- coderabbit: (os67) => new CoderabbitRuntimeStrategy(os67),
19295
- cursor: (os67) => new CursorRuntimeStrategy(os67),
19296
- aider: (os67) => new AiderRuntimeStrategy(os67),
19297
- gemini: (os67) => new GeminiRuntimeStrategy(os67),
19298
- kimi: (os67) => new KimiRuntimeStrategy(os67),
19299
- opencode: (os67) => new OpencodeRuntimeStrategy(os67)
19295
+ claude: (os68) => new ClaudeRuntimeStrategy(os68),
19296
+ codex: (os68) => new CodexRuntimeStrategy(os68),
19297
+ coderabbit: (os68) => new CoderabbitRuntimeStrategy(os68),
19298
+ cursor: (os68) => new CursorRuntimeStrategy(os68),
19299
+ aider: (os68) => new AiderRuntimeStrategy(os68),
19300
+ gemini: (os68) => new GeminiRuntimeStrategy(os68),
19301
+ kimi: (os68) => new KimiRuntimeStrategy(os68),
19302
+ opencode: (os68) => new OpencodeRuntimeStrategy(os68)
19300
19303
  };
19301
19304
  var deployBuilders = {
19302
19305
  claude: () => new ClaudeDeployStrategy(),
19303
19306
  codex: () => new CodexDeployStrategy()
19304
19307
  };
19305
- function createAgentStrategy(agent, os67 = createOsStrategy()) {
19308
+ function createAgentStrategy(agent, os68 = createOsStrategy()) {
19306
19309
  if (!AGENT_REGISTRY[agent]?.enabled) {
19307
19310
  throw new Error(
19308
19311
  `Agent "${agent}" is not supported in this codeam-cli version. Upgrade with 'npm i -g codeam-cli@latest'.`
@@ -19312,10 +19315,10 @@ function createAgentStrategy(agent, os67 = createOsStrategy()) {
19312
19315
  if (!build) {
19313
19316
  throw new Error(`No runtime strategy registered for agent "${agent}"`);
19314
19317
  }
19315
- return build(os67);
19318
+ return build(os68);
19316
19319
  }
19317
- function createInteractiveAgentStrategy(agent, os67 = createOsStrategy()) {
19318
- const s = createAgentStrategy(agent, os67);
19320
+ function createInteractiveAgentStrategy(agent, os68 = createOsStrategy()) {
19321
+ const s = createAgentStrategy(agent, os68);
19319
19322
  if (s.mode !== "interactive") {
19320
19323
  throw new Error(
19321
19324
  `Agent "${agent}" is a batch agent; use createAgentStrategy + .runOneShot for one-shot reviews.`
@@ -19993,8 +19996,8 @@ function collectChangedFiles(cwd) {
19993
19996
  }
19994
19997
  return [...byPath.values()];
19995
19998
  }
19996
- function restoreCoderabbitOauthBlob(os67, value) {
19997
- const dir = path41.join(os67.homeDir(), ".coderabbit");
19999
+ function restoreCoderabbitOauthBlob(os68, value) {
20000
+ const dir = path41.join(os68.homeDir(), ".coderabbit");
19998
20001
  (0, import_node_fs6.mkdirSync)(dir, { recursive: true });
19999
20002
  let file = "auth.json";
20000
20003
  let contents = value.trim();
@@ -20014,26 +20017,26 @@ function installFailureMessage(result) {
20014
20017
  return result.error ?? "CodeRabbit CLI could not be installed";
20015
20018
  }
20016
20019
  async function configureCoderabbit(input, deps = {}) {
20017
- const os67 = deps.os ?? createOsStrategy();
20020
+ const os68 = deps.os ?? createOsStrategy();
20018
20021
  const ensureInstalled = deps.ensureInstalled ?? ensureCoderabbitInstalled;
20019
20022
  const isLoggedIn = deps.isLoggedIn ?? defaultIsLoggedIn;
20020
20023
  const runOAuth = deps.runOAuthLogin ?? runCoderabbitOAuthLogin;
20021
20024
  const snapshot = deps.snapshotDir ?? (() => snapshotCredentialDir());
20022
20025
  const capture2 = deps.captureCredential ?? ((b) => diffCapturedCredential(b));
20023
20026
  const loginWithApiKey = deps.loginWithApiKey ?? defaultLoginWithApiKey;
20024
- const home = os67.homeDir();
20025
- os67.augmentPath(
20026
- os67.id === "win32" ? [
20027
+ const home = os68.homeDir();
20028
+ os68.augmentPath(
20029
+ os68.id === "win32" ? [
20027
20030
  path41.join(home, ".local", "bin"),
20028
20031
  path41.join(process.env.APPDATA ?? path41.join(home, "AppData", "Roaming"), "npm"),
20029
20032
  path41.join(home, "scoop", "shims")
20030
20033
  ] : [path41.join(home, ".local", "bin"), "/opt/homebrew/bin", "/usr/local/bin"]
20031
20034
  );
20032
- const installed2 = os67.findInPath("coderabbit") !== null;
20035
+ const installed2 = os68.findInPath("coderabbit") !== null;
20033
20036
  const base = () => ({
20034
20037
  action: input.action,
20035
20038
  supported: true,
20036
- installed: os67.findInPath("coderabbit") !== null,
20039
+ installed: os68.findInPath("coderabbit") !== null,
20037
20040
  loggedIn: false
20038
20041
  });
20039
20042
  if (input.action === "status") {
@@ -20047,7 +20050,7 @@ async function configureCoderabbit(input, deps = {}) {
20047
20050
  const key = (input.apiKey ?? "").trim();
20048
20051
  if (!key) return { ...res2, error: "No API key provided" };
20049
20052
  if (!res2.installed) {
20050
- const inst = await ensureInstalled(os67);
20053
+ const inst = await ensureInstalled(os68);
20051
20054
  res2.installed = inst.ok;
20052
20055
  if (!inst.ok) return { ...res2, error: installFailureMessage(inst) };
20053
20056
  }
@@ -20071,7 +20074,7 @@ async function configureCoderabbit(input, deps = {}) {
20071
20074
  }
20072
20075
  if (!res2.installed) {
20073
20076
  deps.onEvent?.({ kind: "installing" });
20074
- const inst = await ensureInstalled(os67);
20077
+ const inst = await ensureInstalled(os68);
20075
20078
  res2.installed = inst.ok;
20076
20079
  if (!inst.ok) return { ...res2, error: installFailureMessage(inst) };
20077
20080
  }
@@ -20088,7 +20091,7 @@ async function configureCoderabbit(input, deps = {}) {
20088
20091
  return { ...res2, loggedIn: true, linked: true };
20089
20092
  }
20090
20093
  try {
20091
- restoreCoderabbitOauthBlob(os67, cred.credential);
20094
+ restoreCoderabbitOauthBlob(os68, cred.credential);
20092
20095
  } catch (err) {
20093
20096
  return {
20094
20097
  ...res2,
@@ -20112,7 +20115,7 @@ async function configureCoderabbit(input, deps = {}) {
20112
20115
  const res2 = base();
20113
20116
  if (!installed2) {
20114
20117
  deps.onEvent?.({ kind: "installing" });
20115
- const inst = await ensureInstalled(os67);
20118
+ const inst = await ensureInstalled(os68);
20116
20119
  res2.installed = inst.ok;
20117
20120
  if (!inst.ok) return { ...res2, error: installFailureMessage(inst) };
20118
20121
  }
@@ -20152,7 +20155,7 @@ async function configureCoderabbit(input, deps = {}) {
20152
20155
  }
20153
20156
  const res = base();
20154
20157
  if (!res.installed) {
20155
- const inst = await ensureInstalled(os67);
20158
+ const inst = await ensureInstalled(os68);
20156
20159
  res.installed = inst.ok;
20157
20160
  if (!inst.ok) return { ...res, error: installFailureMessage(inst) };
20158
20161
  }
@@ -21823,28 +21826,64 @@ function readHouseProxyChildEnv() {
21823
21826
  const o = parsed;
21824
21827
  if (typeof o.baseUrl !== "string" || !o.baseUrl) return {};
21825
21828
  if (typeof o.token !== "string" || !o.token) return {};
21826
- const env = {
21827
- ANTHROPIC_BASE_URL: o.baseUrl,
21828
- ANTHROPIC_AUTH_TOKEN: o.token,
21829
- CLAUDE_CODE_AUTO_COMPACT_WINDOW: "512000",
21830
- API_TIMEOUT_MS: "3000000"
21831
- };
21832
- if (o.openRouter === true) {
21833
- env.ANTHROPIC_API_KEY = "";
21834
- } else {
21835
- env.ANTHROPIC_MODEL = "MiniMax-M3";
21836
- env.ANTHROPIC_DEFAULT_SONNET_MODEL = "MiniMax-M3";
21837
- env.ANTHROPIC_DEFAULT_OPUS_MODEL = "MiniMax-M3";
21838
- env.ANTHROPIC_DEFAULT_HAIKU_MODEL = "MiniMax-M3";
21839
- }
21840
- if (typeof o.claudeConfigDir === "string" && o.claudeConfigDir) {
21841
- env.CLAUDE_CONFIG_DIR = o.claudeConfigDir;
21842
- }
21843
- return env;
21829
+ return buildHouseProxyChildEnv({
21830
+ baseUrl: o.baseUrl,
21831
+ token: o.token,
21832
+ openRouter: o.openRouter === true,
21833
+ ...typeof o.claudeConfigDir === "string" && o.claudeConfigDir ? { claudeConfigDir: o.claudeConfigDir } : {}
21834
+ });
21844
21835
  } catch {
21845
21836
  return {};
21846
21837
  }
21847
21838
  }
21839
+ function buildHouseProxyChildEnv(cfg) {
21840
+ const env = {
21841
+ ANTHROPIC_BASE_URL: cfg.baseUrl,
21842
+ ANTHROPIC_AUTH_TOKEN: cfg.token,
21843
+ CLAUDE_CODE_AUTO_COMPACT_WINDOW: "512000",
21844
+ API_TIMEOUT_MS: "3000000"
21845
+ };
21846
+ if (cfg.openRouter === true) {
21847
+ env.ANTHROPIC_API_KEY = "";
21848
+ } else {
21849
+ env.ANTHROPIC_MODEL = "MiniMax-M3";
21850
+ env.ANTHROPIC_DEFAULT_SONNET_MODEL = "MiniMax-M3";
21851
+ env.ANTHROPIC_DEFAULT_OPUS_MODEL = "MiniMax-M3";
21852
+ env.ANTHROPIC_DEFAULT_HAIKU_MODEL = "MiniMax-M3";
21853
+ }
21854
+ if (typeof cfg.claudeConfigDir === "string" && cfg.claudeConfigDir) {
21855
+ env.CLAUDE_CONFIG_DIR = cfg.claudeConfigDir;
21856
+ }
21857
+ return env;
21858
+ }
21859
+ var HOUSE_PROXY_ENV_KEYS = [
21860
+ "ANTHROPIC_BASE_URL",
21861
+ "ANTHROPIC_AUTH_TOKEN",
21862
+ "ANTHROPIC_API_KEY",
21863
+ "ANTHROPIC_MODEL",
21864
+ "ANTHROPIC_DEFAULT_SONNET_MODEL",
21865
+ "ANTHROPIC_DEFAULT_OPUS_MODEL",
21866
+ "ANTHROPIC_DEFAULT_HAIKU_MODEL",
21867
+ "CLAUDE_CODE_AUTO_COMPACT_WINDOW",
21868
+ "API_TIMEOUT_MS",
21869
+ "CLAUDE_CONFIG_DIR"
21870
+ ];
21871
+ function clearHouseProxyEnvOverrides() {
21872
+ const out2 = {};
21873
+ for (const key of HOUSE_PROXY_ENV_KEYS) out2[key] = void 0;
21874
+ return out2;
21875
+ }
21876
+ function isHouseProxyEnv(env) {
21877
+ return typeof env.ANTHROPIC_AUTH_TOKEN === "string" && env.ANTHROPIC_AUTH_TOKEN.length > 0 && (env.ANTHROPIC_BASE_URL ?? "").includes("/api/v1/agent-proxy");
21878
+ }
21879
+ function pickHouseProxyEnv(env) {
21880
+ const out2 = {};
21881
+ for (const key of HOUSE_PROXY_ENV_KEYS) {
21882
+ const v = env[key];
21883
+ if (typeof v === "string") out2[key] = v;
21884
+ }
21885
+ return out2;
21886
+ }
21848
21887
 
21849
21888
  // src/commands/host/self-update.ts
21850
21889
  var import_node_child_process23 = require("child_process");
@@ -22007,7 +22046,7 @@ async function autoUpgradeBeforeCriticalCommand() {
22007
22046
  if (process.env.NODE_ENV === "test") return;
22008
22047
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
22009
22048
  if (process.env.CI) return;
22010
- const current2 = true ? "2.65.15" : null;
22049
+ const current2 = true ? "2.65.16" : null;
22011
22050
  if (!current2) return;
22012
22051
  const cache = readCache();
22013
22052
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -22024,7 +22063,7 @@ function checkForUpdates() {
22024
22063
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
22025
22064
  if (process.env.CI) return;
22026
22065
  if (!process.stdout.isTTY) return;
22027
- const current2 = true ? "2.65.15" : null;
22066
+ const current2 = true ? "2.65.16" : null;
22028
22067
  if (!current2) return;
22029
22068
  const cache = readCache();
22030
22069
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -22044,7 +22083,7 @@ var SELF_UPDATE_INTERVAL_MS = 60 * 60 * 1e3;
22044
22083
  var SELF_UPDATE_VIEW_TIMEOUT_MS = 3e4;
22045
22084
  var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
22046
22085
  function currentCliVersion() {
22047
- return true ? "2.65.15" : null;
22086
+ return true ? "2.65.16" : null;
22048
22087
  }
22049
22088
  function runCmd(cmd, args2, timeoutMs) {
22050
22089
  return new Promise((resolve10) => {
@@ -23820,7 +23859,7 @@ async function defaultFetchJson(url2) {
23820
23859
  async function readUsageReport(deps = {}) {
23821
23860
  const port = deps.port ?? HEADROOM_PROXY_PORT;
23822
23861
  const base = `http://127.0.0.1:${port}`;
23823
- const get2 = deps.fetchJson ?? ((path93) => defaultFetchJson(`${base}${path93}`));
23862
+ const get2 = deps.fetchJson ?? ((path94) => defaultFetchJson(`${base}${path94}`));
23824
23863
  let history;
23825
23864
  try {
23826
23865
  history = await get2("/stats-history");
@@ -25737,11 +25776,11 @@ function resolveDoltInstallStrategy(platform3) {
25737
25776
  }
25738
25777
  var DOLT_RELEASE_BASE = "https://github.com/dolthub/dolt/releases/latest/download";
25739
25778
  function doltPlatformTuple(platform3, arch2) {
25740
- const os67 = platform3 === "win32" ? "windows" : platform3 === "darwin" ? "darwin" : "linux";
25779
+ const os68 = platform3 === "win32" ? "windows" : platform3 === "darwin" ? "darwin" : "linux";
25741
25780
  const a = arch2 === "x64" ? "amd64" : arch2 === "arm64" ? "arm64" : null;
25742
25781
  if (!a) return null;
25743
- if (os67 === "windows" && a !== "amd64") return null;
25744
- return `${os67}-${a}`;
25782
+ if (os68 === "windows" && a !== "amd64") return null;
25783
+ return `${os68}-${a}`;
25745
25784
  }
25746
25785
  function resolveDoltTarballStrategy(targetDir, platform3, arch2) {
25747
25786
  const tuple = doltPlatformTuple(platform3, arch2);
@@ -27393,7 +27432,7 @@ var vcsAgentReviewH = async (ctx, cmd, parsed) => {
27393
27432
  });
27394
27433
  const token = ctx.pluginAuthToken;
27395
27434
  void (async () => {
27396
- const os67 = createOsStrategy();
27435
+ const os68 = createOsStrategy();
27397
27436
  try {
27398
27437
  const report = await reviewPullRequest(
27399
27438
  {
@@ -27402,7 +27441,7 @@ var vcsAgentReviewH = async (ctx, cmd, parsed) => {
27402
27441
  baseBranch: parsed.baseBranch
27403
27442
  },
27404
27443
  {
27405
- runReview: (input) => new CoderabbitRuntimeStrategy(os67).runOneShot(input),
27444
+ runReview: (input) => new CoderabbitRuntimeStrategy(os68).runOneShot(input),
27406
27445
  runGh: (args2) => defaultRunGh(args2),
27407
27446
  postReport: async (r) => {
27408
27447
  if (!token) return;
@@ -28505,11 +28544,11 @@ function resolveTokenValue(args2) {
28505
28544
  }
28506
28545
  const fileFlag = args2.find((a) => a.startsWith("--token-file="));
28507
28546
  if (fileFlag) {
28508
- const path93 = fileFlag.slice("--token-file=".length);
28547
+ const path94 = fileFlag.slice("--token-file=".length);
28509
28548
  try {
28510
- const content = fs65.readFileSync(path93, "utf8").trim();
28511
- if (content.length === 0) fail(`--token-file ${path93} is empty`);
28512
- rmIfExistsQuiet(path93);
28549
+ const content = fs65.readFileSync(path94, "utf8").trim();
28550
+ if (content.length === 0) fail(`--token-file ${path94} is empty`);
28551
+ rmIfExistsQuiet(path94);
28513
28552
  return content;
28514
28553
  } catch (err) {
28515
28554
  fail(`Could not read --token-file: ${err.message}`);
@@ -29429,6 +29468,9 @@ async function resolveAcpAdapterWithRetry(agent, opts = {}) {
29429
29468
 
29430
29469
  // src/agents/acp/runner.ts
29431
29470
  var import_node_crypto11 = require("crypto");
29471
+ var fs77 = __toESM(require("fs"));
29472
+ var os62 = __toESM(require("os"));
29473
+ var path85 = __toESM(require("path"));
29432
29474
 
29433
29475
  // src/services/history.service.ts
29434
29476
  var fs66 = __toESM(require("fs"));
@@ -35274,16 +35316,23 @@ var NON_SWITCHABLE = /* @__PURE__ */ new Set([
35274
35316
  "coderabbit"
35275
35317
  ]);
35276
35318
  function displayName(id) {
35319
+ if (id === HOUSE_AGENT_ID) return HOUSE_AGENT_NAME;
35277
35320
  return isKnownAgentId(id) ? AGENT_REGISTRY[id]?.displayName ?? id : id;
35278
35321
  }
35279
35322
  function credentialFailureMessage(agentId, failure) {
35280
35323
  if (failure.message) return failure.message;
35281
35324
  return `No linked credential for ${displayName(agentId)}. Link it in Profile \u203A Agents first.`;
35282
35325
  }
35283
- function resolveSwitchTarget(raw, currentAgent) {
35326
+ function resolveSwitchTarget(raw, currentAgent, currentIsHouse = false) {
35284
35327
  if (typeof raw !== "string" || raw.length === 0) {
35285
35328
  return { ok: false, error: "switch_agent: missing agentId" };
35286
35329
  }
35330
+ if (raw === HOUSE_AGENT_ID) {
35331
+ if (currentIsHouse) {
35332
+ return { ok: false, error: `${HOUSE_AGENT_NAME} is already this session's agent.` };
35333
+ }
35334
+ return { ok: true, agentId: "claude", wireId: HOUSE_AGENT_ID, house: true };
35335
+ }
35287
35336
  if (!isKnownAgentId(raw)) {
35288
35337
  return { ok: false, error: `Unknown agent "${raw}".` };
35289
35338
  }
@@ -35296,10 +35345,10 @@ function resolveSwitchTarget(raw, currentAgent) {
35296
35345
  error: `${displayName(raw)} can't be switched to in a live session yet.`
35297
35346
  };
35298
35347
  }
35299
- if (raw === currentAgent) {
35348
+ if (raw === currentAgent && !currentIsHouse) {
35300
35349
  return { ok: false, error: `${displayName(raw)} is already this session's agent.` };
35301
35350
  }
35302
- return { ok: true, agentId: raw };
35351
+ return { ok: true, agentId: raw, wireId: raw, house: false };
35303
35352
  }
35304
35353
  function toAgentAuth(method, credential) {
35305
35354
  return { kind: method === "api_key" ? "api_key" : "oauth_token", value: credential };
@@ -35374,7 +35423,8 @@ function makeSerializedSwitchEmitter(post2) {
35374
35423
  }
35375
35424
  async function performAgentSwitch(deps, rawAgentId, fastPath = {}) {
35376
35425
  const from = deps.currentAgent();
35377
- const target = resolveSwitchTarget(rawAgentId, from);
35426
+ const fromIsHouse = deps.currentIsHouse();
35427
+ const target = resolveSwitchTarget(rawAgentId, from, fromIsHouse);
35378
35428
  if (!target.ok) {
35379
35429
  return {
35380
35430
  ok: false,
@@ -35383,27 +35433,45 @@ async function performAgentSwitch(deps, rawAgentId, fastPath = {}) {
35383
35433
  };
35384
35434
  }
35385
35435
  const agentId = target.agentId;
35436
+ const wireId = target.wireId;
35437
+ const fromWireId = fromIsHouse ? HOUSE_AGENT_ID : from;
35438
+ const targetName = displayName(wireId);
35386
35439
  const emitStatus = (status2) => deps.postEvent("switch_agent_status", { ...status2 });
35387
- const emitStep = (step) => deps.postEvent("switch_agent_progress", { step, agentId });
35440
+ const emitStep = (step) => deps.postEvent("switch_agent_progress", { step, agentId: wireId });
35388
35441
  const fail2 = (error) => {
35389
- log.warn("switchAgent", `switch ${from} \u2192 ${agentId} failed: ${error}`);
35390
- void emitStatus({ state: "error", agentId, fromAgentId: from, error });
35391
- return { ok: false, agentId, error };
35442
+ log.warn("switchAgent", `switch ${fromWireId} \u2192 ${wireId} failed: ${error}`);
35443
+ void emitStatus({ state: "error", agentId: wireId, fromAgentId: fromWireId, error });
35444
+ return { ok: false, agentId: wireId, error };
35392
35445
  };
35393
- log.info("switchAgent", `switch requested ${from} \u2192 ${agentId}`);
35394
- void emitStatus({ state: "switching", agentId, fromAgentId: from });
35446
+ log.info("switchAgent", `switch requested ${fromWireId} \u2192 ${wireId}`);
35447
+ void emitStatus({ state: "switching", agentId: wireId, fromAgentId: fromWireId });
35395
35448
  let installScript;
35396
35449
  if (!fastPath.skipProvision) {
35397
35450
  void emitStep("credential");
35398
- const cred = await deps.fetchCredential(agentId);
35451
+ const cred = await deps.fetchCredential(wireId);
35399
35452
  if (!cred.ok) {
35400
- return fail2(credentialFailureMessage(agentId, cred));
35453
+ return fail2(credentialFailureMessage(wireId, cred));
35401
35454
  }
35402
- try {
35403
- deps.provisionCredential(agentId, toAgentAuth(cred.method, cred.credential));
35404
- } catch (err) {
35405
- log.warn("switchAgent", `credential provisioning failed: ${err.message}`);
35406
- return fail2(`Couldn't write the ${displayName(agentId)} credential on this machine.`);
35455
+ if (target.house) {
35456
+ if (cred.method !== "house_proxy" || !cred.baseUrl) {
35457
+ return fail2(`${targetName} isn't available on this backend yet.`);
35458
+ }
35459
+ try {
35460
+ deps.provisionHouseProxy({ baseUrl: cred.baseUrl, token: cred.credential });
35461
+ } catch (err) {
35462
+ log.warn("switchAgent", `house proxy provisioning failed: ${err.message}`);
35463
+ return fail2(`Couldn't configure ${targetName} on this machine.`);
35464
+ }
35465
+ } else {
35466
+ if (cred.method === "house_proxy") {
35467
+ return fail2(`Couldn't fetch the ${targetName} credential.`);
35468
+ }
35469
+ try {
35470
+ deps.provisionCredential(agentId, toAgentAuth(cred.method, cred.credential));
35471
+ } catch (err) {
35472
+ log.warn("switchAgent", `credential provisioning failed: ${err.message}`);
35473
+ return fail2(`Couldn't write the ${targetName} credential on this machine.`);
35474
+ }
35407
35475
  }
35408
35476
  installScript = cred.installScript;
35409
35477
  }
@@ -35416,19 +35484,19 @@ async function performAgentSwitch(deps, rawAgentId, fastPath = {}) {
35416
35484
  }
35417
35485
  void emitStep("restart");
35418
35486
  try {
35419
- await deps.swapRuntime(agentId);
35487
+ await deps.swapRuntime(agentId, { house: target.house });
35420
35488
  } catch (err) {
35421
- log.warn("switchAgent", `swap failed, reverting to ${from}: ${err.message}`);
35489
+ log.warn("switchAgent", `swap failed, reverting to ${fromWireId}: ${err.message}`);
35422
35490
  try {
35423
- await deps.revertRuntime(from);
35491
+ await deps.revertRuntime(from, { house: fromIsHouse });
35424
35492
  } catch (revertErr) {
35425
35493
  log.warn("switchAgent", `revert failed: ${revertErr.message}`);
35426
35494
  return fail2(
35427
- `Switching to ${displayName(agentId)} failed and ${displayName(from)} couldn't be restored \u2014 restart the session.`
35495
+ `Switching to ${targetName} failed and ${displayName(fromWireId)} couldn't be restored \u2014 restart the session.`
35428
35496
  );
35429
35497
  }
35430
35498
  return fail2(
35431
- `Couldn't start ${displayName(agentId)} \u2014 the session stays on ${displayName(from)}.`
35499
+ `Couldn't start ${targetName} \u2014 the session stays on ${displayName(fromWireId)}.`
35432
35500
  );
35433
35501
  }
35434
35502
  try {
@@ -35437,9 +35505,9 @@ async function performAgentSwitch(deps, rawAgentId, fastPath = {}) {
35437
35505
  log.warn("switchAgent", `persist failed (non-fatal): ${err.message}`);
35438
35506
  }
35439
35507
  deps.reannounce(agentId);
35440
- await emitStatus({ state: "ready", agentId, fromAgentId: from });
35441
- log.info("switchAgent", `switch complete ${from} \u2192 ${agentId}`);
35442
- return { ok: true, agentId };
35508
+ await emitStatus({ state: "ready", agentId: wireId, fromAgentId: fromWireId });
35509
+ log.info("switchAgent", `switch complete ${fromWireId} \u2192 ${wireId}`);
35510
+ return { ok: true, agentId: wireId };
35443
35511
  }
35444
35512
 
35445
35513
  // src/services/streaming/transport.ts
@@ -36716,7 +36784,7 @@ function defaultRunGit(cwd, args2) {
36716
36784
  });
36717
36785
  }
36718
36786
  async function discoverRepos(workingDir, maxDepth = 4) {
36719
- const fs81 = await import("fs/promises");
36787
+ const fs82 = await import("fs/promises");
36720
36788
  const out2 = [];
36721
36789
  await walk(workingDir, 0);
36722
36790
  return out2;
@@ -36724,7 +36792,7 @@ async function discoverRepos(workingDir, maxDepth = 4) {
36724
36792
  if (depth > maxDepth) return;
36725
36793
  let entries = [];
36726
36794
  try {
36727
- const dirents = await fs81.readdir(dir, { withFileTypes: true });
36795
+ const dirents = await fs82.readdir(dir, { withFileTypes: true });
36728
36796
  entries = dirents.filter((d3) => !d3.name.startsWith(".") || d3.name === ".git").map((d3) => ({ name: d3.name, isDirectory: d3.isDirectory() }));
36729
36797
  } catch {
36730
36798
  return;
@@ -40273,7 +40341,10 @@ async function runAcpSession(opts) {
40273
40341
  refreshSquadRoster();
40274
40342
  const pendingProposal = { current: null };
40275
40343
  let switchCredentialEnv = {};
40276
- const relaunchWith = async (nextAgent) => {
40344
+ let houseActive = isHouseProxyEnv(process.env);
40345
+ let houseEnv = houseActive ? pickHouseProxyEnv(process.env) : {};
40346
+ let pendingHouseConfig = null;
40347
+ const relaunchWith = async (nextAgent, swapOpts = { house: false }) => {
40277
40348
  try {
40278
40349
  await client3.cancel();
40279
40350
  } catch {
@@ -40287,13 +40358,15 @@ async function runAcpSession(opts) {
40287
40358
  if (!adapter) throw new Error(`no ACP adapter available for ${nextAgent}`);
40288
40359
  const disable1m = loadCliConfig().sessions.find((s) => s.pluginId === opts.pluginId)?.disable1mContext === true;
40289
40360
  clientOptions.adapter = adapter;
40361
+ const leavingHouseEnv = !swapOpts.house && (houseActive || isHouseProxyEnv(process.env) || Object.keys(houseEnv).length > 0) ? clearHouseProxyEnvOverrides() : {};
40290
40362
  clientOptions.extraEnv = {
40291
40363
  ...computeAdapterExtraEnv({
40292
40364
  agent: nextAgent,
40293
40365
  autoApprovePermissions: opts.autoApprovePermissions,
40294
40366
  disable1mContext: disable1m
40295
40367
  }),
40296
- ...switchCredentialEnv
40368
+ ...leavingHouseEnv,
40369
+ ...swapOpts.house ? houseEnv : switchCredentialEnv
40297
40370
  };
40298
40371
  const next = new AcpClient(clientOptions);
40299
40372
  const hs = await next.start();
@@ -40313,13 +40386,23 @@ async function runAcpSession(opts) {
40313
40386
  });
40314
40387
  budgetRecovery = makeBudgetRecovery();
40315
40388
  pendingHandoff.current = buildHandoffPreamble(prevAgent, nextAgent, transcript);
40389
+ const wasHouse = houseActive;
40390
+ houseActive = swapOpts.house;
40391
+ if (swapOpts.house) {
40392
+ if (pendingHouseConfig) {
40393
+ persistHouseProxyConfig(pendingHouseConfig);
40394
+ pendingHouseConfig = null;
40395
+ }
40396
+ } else if (wasHouse) {
40397
+ clearHouseProxyConfig();
40398
+ }
40316
40399
  void publisher.publishOutput({
40317
40400
  type: "agent_banner",
40318
- agentId: nextAgent,
40401
+ agentId: swapOpts.house ? HOUSE_AGENT_ID : nextAgent,
40319
40402
  // A switch starts a FRESH conversation with the new agent — never "back".
40320
- title: bannerTitle(false),
40321
- subtitle: buildBannerSubtitle(nextAgent, hs.sessionId, hs.model, hs.tier),
40322
- path: bannerLocation(opts.cwd),
40403
+ title: swapOpts.house ? HOUSE_AGENT_NAME : bannerTitle(false),
40404
+ subtitle: swapOpts.house ? HOUSE_AGENT_SUBTITLE : buildBannerSubtitle(nextAgent, hs.sessionId, hs.model, hs.tier),
40405
+ path: swapOpts.house ? "" : bannerLocation(opts.cwd),
40323
40406
  done: true
40324
40407
  });
40325
40408
  };
@@ -40334,6 +40417,7 @@ async function runAcpSession(opts) {
40334
40417
  );
40335
40418
  const switchDeps = {
40336
40419
  currentAgent: () => opts.agent,
40420
+ currentIsHouse: () => houseActive,
40337
40421
  postEvent: emitSwitchEvent,
40338
40422
  fetchCredential: (agentId) => fetchProvisionCredentialDetailed({
40339
40423
  agentId,
@@ -40345,6 +40429,21 @@ async function runAcpSession(opts) {
40345
40429
  provisionCredential: (agentId, auth) => {
40346
40430
  switchCredentialEnv = provisionAgentCredentials(agentId, auth);
40347
40431
  },
40432
+ provisionHouseProxy: ({ baseUrl, token }) => {
40433
+ const claudeConfigDir = path85.join(
40434
+ os62.homedir(),
40435
+ ".codeam",
40436
+ "house-claude",
40437
+ `switch-${opts.pluginId}`
40438
+ );
40439
+ try {
40440
+ fs77.mkdirSync(claudeConfigDir, { recursive: true, mode: 448 });
40441
+ } catch {
40442
+ }
40443
+ houseEnv = buildHouseProxyChildEnv({ baseUrl, token, claudeConfigDir });
40444
+ pendingHouseConfig = { baseUrl, token, claudeConfigDir };
40445
+ switchCredentialEnv = {};
40446
+ },
40348
40447
  ensureBinary: (agentId, installScript, onRetry) => ensureAgentBinaryForSwitch(agentId, installScript, { onRetry }),
40349
40448
  swapRuntime: relaunchWith,
40350
40449
  revertRuntime: relaunchWith,
@@ -41540,9 +41639,9 @@ function startClaudeCredentialSync(opts) {
41540
41639
  }
41541
41640
 
41542
41641
  // src/beads/workflow-hint.ts
41543
- var fs77 = __toESM(require("fs"));
41544
- var path85 = __toESM(require("path"));
41545
- var os62 = __toESM(require("os"));
41642
+ var fs78 = __toESM(require("fs"));
41643
+ var path86 = __toESM(require("path"));
41644
+ var os63 = __toESM(require("os"));
41546
41645
  var BEADS_HINT_MARKER = "<!-- codeam:beads-workflow -->";
41547
41646
  var BEADS_HINT = `${BEADS_HINT_MARKER}
41548
41647
  # Beads (bd) \u2014 task tracking + persistent memory (ALWAYS use it)
@@ -41556,22 +41655,22 @@ This environment uses **bd (beads)** for issue/task tracking and persistent memo
41556
41655
  - \`bd ready\` (available work) \xB7 \`bd show <id>\` \xB7 \`bd update <id> --claim\` \xB7 \`bd close <id>\`.
41557
41656
  - Use \`bd remember "..."\` for persistent knowledge \u2014 do NOT use MEMORY.md files.
41558
41657
  ${BEADS_HINT_MARKER}`;
41559
- function ensureBeadsWorkflowHint(homeDir2 = os62.homedir()) {
41658
+ function ensureBeadsWorkflowHint(homeDir2 = os63.homedir()) {
41560
41659
  try {
41561
- const file = path85.join(homeDir2, ".claude", "CLAUDE.md");
41660
+ const file = path86.join(homeDir2, ".claude", "CLAUDE.md");
41562
41661
  let existing = "";
41563
41662
  try {
41564
- existing = fs77.readFileSync(file, "utf8");
41663
+ existing = fs78.readFileSync(file, "utf8");
41565
41664
  } catch {
41566
41665
  }
41567
41666
  if (existing.includes(BEADS_HINT_MARKER)) return;
41568
- fs77.mkdirSync(path85.dirname(file), { recursive: true });
41667
+ fs78.mkdirSync(path86.dirname(file), { recursive: true });
41569
41668
  const next = existing.trim() ? `${existing.trimEnd()}
41570
41669
 
41571
41670
  ${BEADS_HINT}
41572
41671
  ` : `${BEADS_HINT}
41573
41672
  `;
41574
- fs77.writeFileSync(file, next);
41673
+ fs78.writeFileSync(file, next);
41575
41674
  } catch {
41576
41675
  }
41577
41676
  }
@@ -42082,7 +42181,7 @@ var AcpDriver = class {
42082
42181
  };
42083
42182
 
42084
42183
  // src/baton/transcript-mirror.ts
42085
- var fs78 = __toESM(require("fs"));
42184
+ var fs79 = __toESM(require("fs"));
42086
42185
  var TranscriptMirror = class {
42087
42186
  constructor(deps) {
42088
42187
  this.deps = deps;
@@ -42149,7 +42248,7 @@ var TranscriptMirror = class {
42149
42248
  }
42150
42249
  };
42151
42250
  function defaultWatch(file, onChange) {
42152
- const w3 = fs78.watch(file, { persistent: false }, () => onChange());
42251
+ const w3 = fs79.watch(file, { persistent: false }, () => onChange());
42153
42252
  return () => w3.close();
42154
42253
  }
42155
42254
 
@@ -42479,16 +42578,16 @@ function keepDeviceAwake(deps = {}) {
42479
42578
  }
42480
42579
 
42481
42580
  // src/agents/claude/onboarding.ts
42482
- var fs79 = __toESM(require("fs"));
42483
- var os64 = __toESM(require("os"));
42484
- var path86 = __toESM(require("path"));
42581
+ var fs80 = __toESM(require("fs"));
42582
+ var os65 = __toESM(require("os"));
42583
+ var path87 = __toESM(require("path"));
42485
42584
  var ONBOARDING_VERSION_SENTINEL = "9999.0.0";
42486
42585
  function ensureClaudeOnboarded(cwd) {
42487
42586
  try {
42488
- const file = path86.join(os64.homedir(), ".claude.json");
42587
+ const file = path87.join(os65.homedir(), ".claude.json");
42489
42588
  let config = {};
42490
42589
  try {
42491
- config = JSON.parse(fs79.readFileSync(file, "utf8"));
42590
+ config = JSON.parse(fs80.readFileSync(file, "utf8"));
42492
42591
  } catch {
42493
42592
  }
42494
42593
  let changed = false;
@@ -42513,8 +42612,8 @@ function ensureClaudeOnboarded(cwd) {
42513
42612
  }
42514
42613
  }
42515
42614
  if (!changed) return;
42516
- fs79.mkdirSync(path86.dirname(file), { recursive: true });
42517
- fs79.writeFileSync(file, JSON.stringify(config, null, 2));
42615
+ fs80.mkdirSync(path87.dirname(file), { recursive: true });
42616
+ fs80.writeFileSync(file, JSON.stringify(config, null, 2));
42518
42617
  log.info(
42519
42618
  "claude",
42520
42619
  `pre-completed Claude onboarding${cwd ? ` + trusted workspace ${cwd}` : ""}`
@@ -43251,7 +43350,7 @@ var import_picocolors11 = __toESM(require("picocolors"));
43251
43350
  var import_child_process31 = require("child_process");
43252
43351
  var import_util4 = require("util");
43253
43352
  var import_picocolors9 = __toESM(require("picocolors"));
43254
- var path87 = __toESM(require("path"));
43353
+ var path88 = __toESM(require("path"));
43255
43354
  var execFileP6 = (0, import_util4.promisify)(import_child_process31.execFile);
43256
43355
  var MAX_BUFFER = 8 * 1024 * 1024;
43257
43356
  function resetStdinForChild() {
@@ -43740,7 +43839,7 @@ var GitHubCodespacesProvider = class {
43740
43839
  });
43741
43840
  }
43742
43841
  async uploadFile(workspaceId, remotePath, contents, options = {}) {
43743
- const remoteDir = path87.posix.dirname(remotePath);
43842
+ const remoteDir = path88.posix.dirname(remotePath);
43744
43843
  const parts = [
43745
43844
  `mkdir -p ${shellQuote(remoteDir)}`,
43746
43845
  `cat > ${shellQuote(remotePath)}`
@@ -43810,7 +43909,7 @@ function shellQuote(s) {
43810
43909
  // src/services/providers/gitpod.ts
43811
43910
  var import_child_process32 = require("child_process");
43812
43911
  var import_util5 = require("util");
43813
- var path88 = __toESM(require("path"));
43912
+ var path89 = __toESM(require("path"));
43814
43913
  var import_picocolors10 = __toESM(require("picocolors"));
43815
43914
  var execFileP7 = (0, import_util5.promisify)(import_child_process32.execFile);
43816
43915
  var MAX_BUFFER2 = 8 * 1024 * 1024;
@@ -44050,7 +44149,7 @@ var GitpodProvider = class {
44050
44149
  });
44051
44150
  }
44052
44151
  async uploadFile(workspaceId, remotePath, contents, options = {}) {
44053
- const remoteDir = path88.posix.dirname(remotePath);
44152
+ const remoteDir = path89.posix.dirname(remotePath);
44054
44153
  const parts = [
44055
44154
  `mkdir -p ${shellQuote2(remoteDir)}`,
44056
44155
  `cat > ${shellQuote2(remotePath)}`
@@ -44086,7 +44185,7 @@ function shellQuote2(s) {
44086
44185
  // src/services/providers/gitlab-workspaces.ts
44087
44186
  var import_child_process33 = require("child_process");
44088
44187
  var import_util6 = require("util");
44089
- var path89 = __toESM(require("path"));
44188
+ var path90 = __toESM(require("path"));
44090
44189
  var execFileP8 = (0, import_util6.promisify)(import_child_process33.execFile);
44091
44190
  var MAX_BUFFER3 = 8 * 1024 * 1024;
44092
44191
  var GITLAB_API_BASE = process.env.CODEAM_GITLAB_API_URL ?? "https://gitlab.com/api/v4";
@@ -44346,7 +44445,7 @@ Docs: https://docs.gitlab.com/ee/user/workspace/configuration.html`
44346
44445
  }
44347
44446
  async uploadFile(workspaceId, remotePath, contents, options = {}) {
44348
44447
  const sshHost = process.env.CODEAM_GITLAB_SSH_HOST ?? "workspaces.gitlab.com";
44349
- const remoteDir = path89.posix.dirname(remotePath);
44448
+ const remoteDir = path90.posix.dirname(remotePath);
44350
44449
  const parts = [`mkdir -p ${shellQuote3(remoteDir)}`, `cat > ${shellQuote3(remotePath)}`];
44351
44450
  if (options.mode != null) {
44352
44451
  parts.push(`chmod ${options.mode.toString(8)} ${shellQuote3(remotePath)}`);
@@ -44414,7 +44513,7 @@ function shellQuote3(s) {
44414
44513
  // src/services/providers/railway.ts
44415
44514
  var import_child_process34 = require("child_process");
44416
44515
  var import_util7 = require("util");
44417
- var path90 = __toESM(require("path"));
44516
+ var path91 = __toESM(require("path"));
44418
44517
  var execFileP9 = (0, import_util7.promisify)(import_child_process34.execFile);
44419
44518
  var MAX_BUFFER4 = 8 * 1024 * 1024;
44420
44519
  function resetStdinForChild4() {
@@ -44650,7 +44749,7 @@ var RailwayProvider = class {
44650
44749
  if (!projectId || !serviceId) {
44651
44750
  throw new Error("Invalid Railway workspace id (expected projectId/serviceId).");
44652
44751
  }
44653
- const remoteDir = path90.posix.dirname(remotePath);
44752
+ const remoteDir = path91.posix.dirname(remotePath);
44654
44753
  const parts = [`mkdir -p ${shellQuote4(remoteDir)}`, `cat > ${shellQuote4(remotePath)}`];
44655
44754
  if (options.mode != null) {
44656
44755
  parts.push(`chmod ${options.mode.toString(8)} ${shellQuote4(remotePath)}`);
@@ -45296,8 +45395,8 @@ async function invite() {
45296
45395
  var import_node_dns = require("dns");
45297
45396
  var import_node_util5 = require("util");
45298
45397
  var import_node_crypto13 = require("crypto");
45299
- var fs80 = __toESM(require("fs"));
45300
- var path91 = __toESM(require("path"));
45398
+ var fs81 = __toESM(require("fs"));
45399
+ var path92 = __toESM(require("path"));
45301
45400
  var import_picocolors14 = __toESM(require("picocolors"));
45302
45401
  var dnsResolveP = (0, import_node_util5.promisify)(import_node_dns.resolve);
45303
45402
  async function checkDns(apiBase2) {
@@ -45353,13 +45452,13 @@ async function checkHealth(apiBase2) {
45353
45452
  }
45354
45453
  }
45355
45454
  function checkConfigDir() {
45356
- const dir = path91.join(require("os").homedir(), ".codeam");
45455
+ const dir = path92.join(require("os").homedir(), ".codeam");
45357
45456
  try {
45358
- fs80.mkdirSync(dir, { recursive: true, mode: 448 });
45359
- const probe = path91.join(dir, ".doctor-probe");
45360
- fs80.writeFileSync(probe, "ok", { mode: 384 });
45361
- const read2 = fs80.readFileSync(probe, "utf8");
45362
- fs80.unlinkSync(probe);
45457
+ fs81.mkdirSync(dir, { recursive: true, mode: 448 });
45458
+ const probe = path92.join(dir, ".doctor-probe");
45459
+ fs81.writeFileSync(probe, "ok", { mode: 384 });
45460
+ const read2 = fs81.readFileSync(probe, "utf8");
45461
+ fs81.unlinkSync(probe);
45363
45462
  if (read2 !== "ok") throw new Error("write/read round-trip mismatch");
45364
45463
  return {
45365
45464
  id: "config-dir",
@@ -45399,9 +45498,9 @@ function checkSessions() {
45399
45498
  }
45400
45499
  }
45401
45500
  function checkAgentBinaries() {
45402
- const os67 = createOsStrategy();
45501
+ const os68 = createOsStrategy();
45403
45502
  return getEnabledAgents().map((meta) => {
45404
- const found = os67.findInPath(meta.binaryName);
45503
+ const found = os68.findInPath(meta.binaryName);
45405
45504
  return {
45406
45505
  id: `agent-${meta.id}`,
45407
45506
  label: `Agent binary: ${meta.displayName} (${meta.binaryName})`,
@@ -45423,7 +45522,7 @@ function checkNodePty() {
45423
45522
  detail: "not required on this platform"
45424
45523
  };
45425
45524
  }
45426
- const vendoredPath = path91.join(__dirname, "vendor", "node-pty");
45525
+ const vendoredPath = path92.join(__dirname, "vendor", "node-pty");
45427
45526
  for (const target of [vendoredPath, "node-pty"]) {
45428
45527
  try {
45429
45528
  require(target);
@@ -45465,7 +45564,7 @@ function checkChokidar() {
45465
45564
  }
45466
45565
  async function doctor(args2 = []) {
45467
45566
  const json = args2.includes("--json");
45468
- const cliVersion = true ? "2.65.15" : "0.0.0-dev";
45567
+ const cliVersion = true ? "2.65.16" : "0.0.0-dev";
45469
45568
  const apiBase2 = resolveApiBaseUrl();
45470
45569
  const diagnosticId = (0, import_node_crypto13.randomUUID)();
45471
45570
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -45856,7 +45955,7 @@ async function mcpRun(args2) {
45856
45955
  // src/commands/version.ts
45857
45956
  var import_picocolors15 = __toESM(require("picocolors"));
45858
45957
  function version2() {
45859
- const v = true ? "2.65.15" : "unknown";
45958
+ const v = true ? "2.65.16" : "unknown";
45860
45959
  console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
45861
45960
  }
45862
45961
 
@@ -46005,10 +46104,10 @@ var EXIT_CODE_NAMES = {
46005
46104
  };
46006
46105
 
46007
46106
  // src/index.ts
46008
- var os66 = __toESM(require("os"));
46107
+ var os67 = __toESM(require("os"));
46009
46108
  if (!process.env.HOME) {
46010
46109
  try {
46011
- const home = os66.homedir();
46110
+ const home = os67.homedir();
46012
46111
  if (home) process.env.HOME = home;
46013
46112
  } catch {
46014
46113
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeam-cli",
3
- "version": "2.65.15",
3
+ "version": "2.65.16",
4
4
  "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 — async. The terminal companion for CodeAgent Mobile.",
5
5
  "type": "commonjs",
6
6
  "main": "dist/index.js",