codeam-cli 2.60.28 → 2.60.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,22 @@ 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.60.29] — 2026-07-10
8
+
9
+ ### Added
10
+
11
+ - **shared:** Add CODERABBIT_* to USER_EVENTS (fix A↔B shared-drift)
12
+
13
+ ### Fixed
14
+
15
+ - **cli:** Route "Authentication required" to the re-auth bubble (kimi codespace)
16
+
17
+ ## [2.60.28] — 2026-07-09
18
+
19
+ ### Fixed
20
+
21
+ - **cli:** Coderabbit — don't emit status snapshot on review (clobbered linked)
22
+
7
23
  ## [2.60.27] — 2026-07-09
8
24
 
9
25
  ### Added
package/dist/index.js CHANGED
@@ -591,7 +591,12 @@ var USER_EVENTS = {
591
591
  AGENT_INSTALL_FAILED: "agent_install_failed",
592
592
  CLI_UPDATE_PROGRESS: "cli_update_progress",
593
593
  CLI_UPDATE_FAILED: "cli_update_failed",
594
- BATON_STATE: "baton_state"
594
+ BATON_STATE: "baton_state",
595
+ // CodeRabbit reviewer — the CLI posts these to /api/coderabbit/events; the
596
+ // backend re-publishes them on the per-user SSE bus (mirrored in repo A).
597
+ CODERABBIT_PROGRESS: "coderabbit_progress",
598
+ CODERABBIT_STATUS: "coderabbit_status",
599
+ CODERABBIT_REVIEW: "coderabbit_review"
595
600
  };
596
601
 
597
602
  // ../../packages/shared/src/preview-prompts.ts
@@ -5684,7 +5689,7 @@ function readAnonId() {
5684
5689
  }
5685
5690
  function superProperties() {
5686
5691
  return {
5687
- cliVersion: true ? "2.60.28" : "0.0.0-dev",
5692
+ cliVersion: true ? "2.60.31" : "0.0.0-dev",
5688
5693
  nodeVersion: process.version,
5689
5694
  platform: process.platform,
5690
5695
  arch: process.arch,
@@ -5865,7 +5870,7 @@ var os4 = __toESM(require("os"));
5865
5870
  // package.json
5866
5871
  var package_default = {
5867
5872
  name: "codeam-cli",
5868
- version: "2.60.28",
5873
+ version: "2.60.31",
5869
5874
  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.",
5870
5875
  type: "commonjs",
5871
5876
  main: "dist/index.js",
@@ -6958,7 +6963,7 @@ var CommandRelayService = class {
6958
6963
  // fresh + clear the "CLI update available" banner after a self-update
6959
6964
  // (a codespace that reinstalls @latest reconnects via heartbeat, not
6960
6965
  // pair/reconnect). Older backends ignore the extra field.
6961
- ..."2.60.28" ? { ideVersion: "2.60.28" } : {}
6966
+ ..."2.60.31" ? { ideVersion: "2.60.31" } : {}
6962
6967
  }).then(() => log.trace("relay", `heartbeat ok online=${online}`)).catch((err) => log.trace("relay", `heartbeat failed online=${online}`, err));
6963
6968
  }
6964
6969
  /**
@@ -15650,7 +15655,7 @@ async function configureCoderabbit(input, deps = {}) {
15650
15655
  }
15651
15656
 
15652
15657
  // src/commands/host-agent.ts
15653
- var import_node_child_process23 = require("child_process");
15658
+ var import_node_child_process22 = require("child_process");
15654
15659
  var os35 = __toESM(require("os"));
15655
15660
  var fs41 = __toESM(require("fs"));
15656
15661
  var path44 = __toESM(require("path"));
@@ -16069,7 +16074,6 @@ async function prepareWorkspace(repoOrPath, deployId, cloneToken) {
16069
16074
  var fs35 = __toESM(require("fs"));
16070
16075
  var os31 = __toESM(require("os"));
16071
16076
  var path39 = __toESM(require("path"));
16072
- var import_node_child_process17 = require("child_process");
16073
16077
  var PUBLIC_TO_INTERNAL_AGENT = {
16074
16078
  claude_code: "claude",
16075
16079
  claude: "claude",
@@ -16183,24 +16187,9 @@ var kimiProvisioner = {
16183
16187
  return { KIMI_API_KEY: auth.value };
16184
16188
  }
16185
16189
  credentialsFiles.forEach((f) => writeFile0600(f, auth.value));
16186
- provisionKimiConfig(home);
16187
16190
  return {};
16188
16191
  }
16189
16192
  };
16190
- function provisionKimiConfig(home) {
16191
- try {
16192
- const osStrat = createOsStrategy();
16193
- const binary = osStrat.findInPath("kimi");
16194
- if (!binary) return;
16195
- const launch = osStrat.buildLaunch(binary, ["login"]);
16196
- (0, import_node_child_process17.spawnSync)(launch.cmd, launch.args, {
16197
- stdio: "ignore",
16198
- timeout: 6e4,
16199
- env: { ...process.env, HOME: home, USERPROFILE: home }
16200
- });
16201
- } catch {
16202
- }
16203
- }
16204
16193
  var coderabbitProvisioner = {
16205
16194
  write(auth, home) {
16206
16195
  const dir = path39.join(home, ".coderabbit");
@@ -16251,7 +16240,7 @@ function provisionAgentCredentials(publicAgentId, auth, homeDir2 = os31.homedir(
16251
16240
  }
16252
16241
 
16253
16242
  // src/commands/host/git-tooling.ts
16254
- var import_node_child_process18 = require("child_process");
16243
+ var import_node_child_process17 = require("child_process");
16255
16244
  var fs36 = __toESM(require("fs"));
16256
16245
  var os32 = __toESM(require("os"));
16257
16246
  var path40 = __toESM(require("path"));
@@ -16365,7 +16354,7 @@ var defaultGitToolingRunner = {
16365
16354
  which(cmd) {
16366
16355
  try {
16367
16356
  const probe = process.platform === "win32" ? "where" : "which";
16368
- (0, import_node_child_process18.execFileSync)(probe, [cmd], { stdio: "ignore" });
16357
+ (0, import_node_child_process17.execFileSync)(probe, [cmd], { stdio: "ignore" });
16369
16358
  return true;
16370
16359
  } catch {
16371
16360
  return false;
@@ -16373,7 +16362,7 @@ var defaultGitToolingRunner = {
16373
16362
  },
16374
16363
  run(cmd, args2, opts = {}) {
16375
16364
  return new Promise((resolve7) => {
16376
- const child = (0, import_node_child_process18.spawn)(cmd, args2, {
16365
+ const child = (0, import_node_child_process17.spawn)(cmd, args2, {
16377
16366
  stdio: [opts.input !== void 0 ? "pipe" : "ignore", "ignore", "pipe"]
16378
16367
  });
16379
16368
  let stderr = "";
@@ -16527,12 +16516,12 @@ var HeadroomStatsReporter = class {
16527
16516
  };
16528
16517
 
16529
16518
  // src/commands/host/os-packages.ts
16530
- var import_node_child_process19 = require("child_process");
16519
+ var import_node_child_process18 = require("child_process");
16531
16520
  var PM_INSTALL_TIMEOUT_MS = 18e4;
16532
16521
  var defaultHeadroomRunner = {
16533
16522
  which(cmd) {
16534
16523
  try {
16535
- (0, import_node_child_process19.execFileSync)("which", [cmd], { stdio: "ignore" });
16524
+ (0, import_node_child_process18.execFileSync)("which", [cmd], { stdio: "ignore" });
16536
16525
  return true;
16537
16526
  } catch {
16538
16527
  return false;
@@ -16541,7 +16530,7 @@ var defaultHeadroomRunner = {
16541
16530
  run(cmd, args2, opts = {}) {
16542
16531
  return new Promise((resolve7) => {
16543
16532
  const spawnEnv = opts.env ?? process.env;
16544
- const child = (0, import_node_child_process19.spawn)(cmd, args2, { stdio: ["ignore", "pipe", "pipe"], env: spawnEnv });
16533
+ const child = (0, import_node_child_process18.spawn)(cmd, args2, { stdio: ["ignore", "pipe", "pipe"], env: spawnEnv });
16545
16534
  let stderrBuf = "";
16546
16535
  let stdoutBuf = "";
16547
16536
  let settled = false;
@@ -17048,14 +17037,14 @@ async function setupHeadroomForSelfHosted(agent, runner = defaultHeadroomRunner,
17048
17037
  }
17049
17038
 
17050
17039
  // src/commands/host/self-update.ts
17051
- var import_node_child_process21 = require("child_process");
17040
+ var import_node_child_process20 = require("child_process");
17052
17041
 
17053
17042
  // src/lib/updateNotifier.ts
17054
17043
  var fs39 = __toESM(require("fs"));
17055
17044
  var os34 = __toESM(require("os"));
17056
17045
  var path43 = __toESM(require("path"));
17057
17046
  var https6 = __toESM(require("https"));
17058
- var import_node_child_process20 = require("child_process");
17047
+ var import_node_child_process19 = require("child_process");
17059
17048
  var import_picocolors3 = __toESM(require("picocolors"));
17060
17049
  var PKG_NAME = "codeam-cli";
17061
17050
  var REGISTRY_URL = `https://registry.npmjs.org/${PKG_NAME}/latest`;
@@ -17149,7 +17138,7 @@ function notifyIfStale(currentVersion, latest) {
17149
17138
  }
17150
17139
  function isLinkedInstall() {
17151
17140
  try {
17152
- const root = (0, import_node_child_process20.execSync)("npm root -g", {
17141
+ const root = (0, import_node_child_process19.execSync)("npm root -g", {
17153
17142
  encoding: "utf8",
17154
17143
  stdio: ["ignore", "pipe", "ignore"],
17155
17144
  timeout: 2e3
@@ -17177,7 +17166,7 @@ function maybeAutoUpdate(currentVersion, latest) {
17177
17166
 
17178
17167
  `
17179
17168
  );
17180
- const install = (0, import_node_child_process20.spawnSync)("npm", ["install", "-g", `${PKG_NAME}@latest`], {
17169
+ const install = (0, import_node_child_process19.spawnSync)("npm", ["install", "-g", `${PKG_NAME}@latest`], {
17181
17170
  stdio: "inherit",
17182
17171
  env: process.env
17183
17172
  });
@@ -17198,7 +17187,7 @@ function maybeAutoUpdate(currentVersion, latest) {
17198
17187
  process.stderr.write(` ${import_picocolors3.default.green("\u2713")} Updated. Resuming session...
17199
17188
 
17200
17189
  `);
17201
- const child = (0, import_node_child_process20.spawnSync)("codeam", process.argv.slice(2), {
17190
+ const child = (0, import_node_child_process19.spawnSync)("codeam", process.argv.slice(2), {
17202
17191
  stdio: "inherit",
17203
17192
  env: process.env
17204
17193
  });
@@ -17208,7 +17197,7 @@ async function autoUpgradeBeforeCriticalCommand() {
17208
17197
  if (process.env.NODE_ENV === "test") return;
17209
17198
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
17210
17199
  if (process.env.CI) return;
17211
- const current = true ? "2.60.28" : null;
17200
+ const current = true ? "2.60.31" : null;
17212
17201
  if (!current) return;
17213
17202
  const cache = readCache();
17214
17203
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -17225,7 +17214,7 @@ function checkForUpdates() {
17225
17214
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
17226
17215
  if (process.env.CI) return;
17227
17216
  if (!process.stdout.isTTY) return;
17228
- const current = true ? "2.60.28" : null;
17217
+ const current = true ? "2.60.31" : null;
17229
17218
  if (!current) return;
17230
17219
  const cache = readCache();
17231
17220
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -17245,11 +17234,11 @@ var SELF_UPDATE_INTERVAL_MS = 60 * 60 * 1e3;
17245
17234
  var SELF_UPDATE_VIEW_TIMEOUT_MS = 3e4;
17246
17235
  var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
17247
17236
  function currentCliVersion() {
17248
- return true ? "2.60.28" : null;
17237
+ return true ? "2.60.31" : null;
17249
17238
  }
17250
17239
  function runCmd(cmd, args2, timeoutMs) {
17251
17240
  return new Promise((resolve7) => {
17252
- (0, import_node_child_process21.execFile)(cmd, args2, { timeout: timeoutMs }, (err, stdout, stderr) => {
17241
+ (0, import_node_child_process20.execFile)(cmd, args2, { timeout: timeoutMs }, (err, stdout, stderr) => {
17253
17242
  const code = err && typeof err.code === "number" ? err.code : err ? null : 0;
17254
17243
  resolve7({ code, stdout: stdout ?? "", stderr: stderr ?? "" });
17255
17244
  });
@@ -17311,11 +17300,11 @@ async function runSelfUpdate() {
17311
17300
  }
17312
17301
 
17313
17302
  // src/commands/host/teardown.ts
17314
- var import_node_child_process22 = require("child_process");
17303
+ var import_node_child_process21 = require("child_process");
17315
17304
  var fs40 = __toESM(require("fs"));
17316
17305
  var defaultDisableService = () => {
17317
17306
  try {
17318
- (0, import_node_child_process22.execFileSync)("systemctl", ["disable", "--now", "codeam-host-agent"], { stdio: "ignore" });
17307
+ (0, import_node_child_process21.execFileSync)("systemctl", ["disable", "--now", "codeam-host-agent"], { stdio: "ignore" });
17319
17308
  } catch {
17320
17309
  }
17321
17310
  };
@@ -17323,7 +17312,7 @@ var defaultTeardownHeadroom = () => {
17323
17312
  try {
17324
17313
  const kind = JSON.parse(fs40.readFileSync(headroomConfigPath(), "utf8")).agent;
17325
17314
  if (kind) {
17326
- (0, import_node_child_process22.execFileSync)("headroom", ["unwrap", kind], { stdio: "ignore", timeout: 15e3 });
17315
+ (0, import_node_child_process21.execFileSync)("headroom", ["unwrap", kind], { stdio: "ignore", timeout: 15e3 });
17327
17316
  }
17328
17317
  } catch {
17329
17318
  }
@@ -17481,7 +17470,7 @@ var CONTROL_AGENT_META = {
17481
17470
  headroomWrappable: false,
17482
17471
  acp: false
17483
17472
  };
17484
- var defaultSpawner = (env, cwd, args2 = []) => (0, import_node_child_process23.spawn)(process.execPath, [process.argv[1], "pair-auto", ...args2], {
17473
+ var defaultSpawner = (env, cwd, args2 = []) => (0, import_node_child_process22.spawn)(process.execPath, [process.argv[1], "pair-auto", ...args2], {
17485
17474
  cwd,
17486
17475
  env: { ...process.env, ...env },
17487
17476
  stdio: ["ignore", "pipe", "pipe"],
@@ -17961,7 +17950,7 @@ var HostAgentSupervisor = class {
17961
17950
  runAgentInstall(script) {
17962
17951
  return new Promise((resolve7) => {
17963
17952
  const home = process.env.HOME || os35.homedir();
17964
- const child = (0, import_node_child_process23.spawn)("sh", ["-c", script], {
17953
+ const child = (0, import_node_child_process22.spawn)("sh", ["-c", script], {
17965
17954
  env: { ...process.env, HOME: home },
17966
17955
  stdio: ["ignore", "pipe", "pipe"]
17967
17956
  });
@@ -18269,11 +18258,11 @@ function makeRealApplyBudgetDeps() {
18269
18258
  var import_child_process14 = require("child_process");
18270
18259
  var import_fs = require("fs");
18271
18260
  var import_promises = __toESM(require("fs/promises"));
18272
- var import_os9 = __toESM(require("os"));
18261
+ var import_os8 = __toESM(require("os"));
18273
18262
  var import_path4 = __toESM(require("path"));
18274
18263
  var import_promises2 = require("stream/promises");
18275
18264
  var import_which = __toESM(require("which"));
18276
- var CACHED_BINARY = import_path4.default.join(import_os9.default.homedir(), ".codeam", "bin", "cloudflared");
18265
+ var CACHED_BINARY = import_path4.default.join(import_os8.default.homedir(), ".codeam", "bin", "cloudflared");
18277
18266
  async function resolveCloudflared(opts = {}) {
18278
18267
  try {
18279
18268
  return await (0, import_which.default)("cloudflared");
@@ -18373,7 +18362,7 @@ function decodeTunnelToken(token) {
18373
18362
  }
18374
18363
  async function spawnNamedTunnel(bin, token, port) {
18375
18364
  const creds = decodeTunnelToken(token);
18376
- const credDir = import_path4.default.join(import_os9.default.homedir(), ".codeam");
18365
+ const credDir = import_path4.default.join(import_os8.default.homedir(), ".codeam");
18377
18366
  await import_promises.default.mkdir(credDir, { recursive: true });
18378
18367
  const credFile = import_path4.default.join(credDir, `tunnel-${creds.TunnelID}.json`);
18379
18368
  await import_promises.default.writeFile(credFile, JSON.stringify(creds), { mode: 384 });
@@ -22427,7 +22416,7 @@ async function pairAuto(args2) {
22427
22416
  }
22428
22417
 
22429
22418
  // src/services/headroom/wrap-launch.ts
22430
- var import_node_child_process24 = require("child_process");
22419
+ var import_node_child_process23 = require("child_process");
22431
22420
  function wrapWithHeadroom(launch, opts) {
22432
22421
  if (!opts.enabled || !opts.headroomPresent) return launch;
22433
22422
  return {
@@ -22440,7 +22429,7 @@ var _present;
22440
22429
  function headroomPresent() {
22441
22430
  if (_present !== void 0) return Promise.resolve(_present);
22442
22431
  return new Promise((resolve7) => {
22443
- (0, import_node_child_process24.execFile)("headroom", ["--version"], (err) => {
22432
+ (0, import_node_child_process23.execFile)("headroom", ["--version"], (err) => {
22444
22433
  _present = !err;
22445
22434
  resolve7(_present);
22446
22435
  });
@@ -22794,7 +22783,7 @@ var path60 = __toESM(require("path"));
22794
22783
 
22795
22784
  // src/agents/acp/agent-binary.ts
22796
22785
  var import_fs4 = __toESM(require("fs"));
22797
- var import_os11 = __toESM(require("os"));
22786
+ var import_os10 = __toESM(require("os"));
22798
22787
  var import_path8 = __toESM(require("path"));
22799
22788
  var import_child_process25 = require("child_process");
22800
22789
  function currentPlatformKey() {
@@ -22890,7 +22879,7 @@ function resolveCursorAgentBinary(deps = {}) {
22890
22879
  const exe = import_path8.default.win32.join(localAppData, "cursor-agent", "cursor-agent.exe");
22891
22880
  return existsSync26(exe) ? exe : null;
22892
22881
  }
22893
- const home = deps.homedir ?? import_os11.default.homedir();
22882
+ const home = deps.homedir ?? import_os10.default.homedir();
22894
22883
  const unix = import_path8.default.posix.join(home, ".local", "bin", "cursor-agent");
22895
22884
  return existsSync26(unix) ? unix : null;
22896
22885
  }
@@ -22964,7 +22953,7 @@ async function waitForAdapterModuleGraph(command2, args2, opts = {}) {
22964
22953
  }
22965
22954
 
22966
22955
  // src/agents/kimi/installer.ts
22967
- var import_node_child_process25 = require("child_process");
22956
+ var import_node_child_process24 = require("child_process");
22968
22957
  var import_node_os6 = require("os");
22969
22958
  var import_node_path6 = require("path");
22970
22959
  var INSTALL_URL2 = "https://code.kimi.com/kimi-code/install.sh";
@@ -22972,7 +22961,7 @@ function kimiBinDir() {
22972
22961
  return (0, import_node_path6.join)(process.env.KIMI_CODE_HOME || (0, import_node_path6.join)((0, import_node_os6.homedir)(), ".kimi-code"), "bin");
22973
22962
  }
22974
22963
  function kimiRuns() {
22975
- const r = (0, import_node_child_process25.spawnSync)("kimi", ["--version"], { stdio: "ignore", timeout: 15e3 });
22964
+ const r = (0, import_node_child_process24.spawnSync)("kimi", ["--version"], { stdio: "ignore", timeout: 15e3 });
22976
22965
  return !r.error && r.status === 0;
22977
22966
  }
22978
22967
  function augmentPath2() {
@@ -22982,7 +22971,7 @@ function augmentPath2() {
22982
22971
  }
22983
22972
  async function runInstaller2() {
22984
22973
  return new Promise((resolve7) => {
22985
- const proc = (0, import_node_child_process25.spawn)("sh", ["-c", `curl -fsSL ${INSTALL_URL2} | bash`], { stdio: "inherit" });
22974
+ const proc = (0, import_node_child_process24.spawn)("sh", ["-c", `curl -fsSL ${INSTALL_URL2} | bash`], { stdio: "inherit" });
22986
22975
  proc.on("close", (code) => resolve7(code === 0));
22987
22976
  proc.on("error", () => resolve7(false));
22988
22977
  });
@@ -23719,7 +23708,7 @@ var HistoryService = class _HistoryService {
23719
23708
  };
23720
23709
 
23721
23710
  // src/agents/acp/client.ts
23722
- var import_node_child_process26 = require("child_process");
23711
+ var import_node_child_process25 = require("child_process");
23723
23712
  var fs57 = __toESM(require("fs/promises"));
23724
23713
  var fsSync = __toESM(require("fs"));
23725
23714
  var os46 = __toESM(require("os"));
@@ -26323,7 +26312,7 @@ var AcpClient = class {
26323
26312
  "acpClient",
26324
26313
  `spawn cmd=${adapter.command} args=[${adapter.args.join(",")}] cwd=${cwd}`
26325
26314
  );
26326
- const child = (0, import_node_child_process26.spawn)(adapter.command, adapter.args, {
26315
+ const child = (0, import_node_child_process25.spawn)(adapter.command, adapter.args, {
26327
26316
  cwd,
26328
26317
  // extraEnv (e.g. CLAUDE_CODE_DISABLE_1M_CONTEXT=1 on an on-demand
26329
26318
  // re-spawn) layers over process.env; PATH stays last so the augmented
@@ -27707,7 +27696,7 @@ async function discoverRepos(workingDir, maxDepth = 4) {
27707
27696
  // src/services/turn-files/files-outbox.ts
27708
27697
  var fs60 = __toESM(require("fs/promises"));
27709
27698
  var path65 = __toESM(require("path"));
27710
- var import_os12 = require("os");
27699
+ var import_os11 = require("os");
27711
27700
  var HOME_OUTBOX_DIR = ".codeam/outbox";
27712
27701
  var MAX_AGE_MS = 24 * 60 * 60 * 1e3;
27713
27702
  var BACKOFF_STEPS_MS = [
@@ -27874,7 +27863,7 @@ function applyJitter(ms) {
27874
27863
  return Math.round(ms * factor);
27875
27864
  }
27876
27865
  function homeDir() {
27877
- return process.env.HOME ?? process.env.USERPROFILE ?? (0, import_os12.tmpdir)();
27866
+ return process.env.HOME ?? process.env.USERPROFILE ?? (0, import_os11.tmpdir)();
27878
27867
  }
27879
27868
 
27880
27869
  // src/services/turn-files/turn-file-aggregator.ts
@@ -28124,7 +28113,7 @@ function describeError(err) {
28124
28113
  if (err instanceof Error) return err.message;
28125
28114
  return String(err);
28126
28115
  }
28127
- var AUTH_FAILURE_RE = /invalid authentication credentials|authentication[_ ]error|please run \/login|\bunauthorized\b|\binvalid x-api-key\b|oauth token (?:expired|revoked)|(?:api error|http|status)[:\s]+401|\b401\b[^\n]{0,40}(?:unauthor|authenticat|credential|api[_ ]?key|login)/i;
28116
+ var AUTH_FAILURE_RE = /invalid authentication credentials|authentication[_ ](?:error|required)|please run \/login|\bunauthorized\b|\binvalid x-api-key\b|oauth token (?:expired|revoked)|(?:api error|http|status)[:\s]+401|\b401\b[^\n]{0,40}(?:unauthor|authenticat|credential|api[_ ]?key|login)/i;
28128
28117
  function looksLikeAuthFailure(text) {
28129
28118
  return AUTH_FAILURE_RE.test(text);
28130
28119
  }
@@ -34198,7 +34187,7 @@ function checkChokidar() {
34198
34187
  }
34199
34188
  async function doctor(args2 = []) {
34200
34189
  const json = args2.includes("--json");
34201
- const cliVersion = true ? "2.60.28" : "0.0.0-dev";
34190
+ const cliVersion = true ? "2.60.31" : "0.0.0-dev";
34202
34191
  const apiBase2 = resolveApiBaseUrl();
34203
34192
  const diagnosticId = (0, import_node_crypto12.randomUUID)();
34204
34193
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -34397,7 +34386,7 @@ async function completion(args2) {
34397
34386
  // src/commands/version.ts
34398
34387
  var import_picocolors15 = __toESM(require("picocolors"));
34399
34388
  function version2() {
34400
- const v = true ? "2.60.28" : "unknown";
34389
+ const v = true ? "2.60.31" : "unknown";
34401
34390
  console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
34402
34391
  }
34403
34392
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeam-cli",
3
- "version": "2.60.28",
3
+ "version": "2.60.31",
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",