codeam-cli 2.26.12 → 2.26.13

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,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.26.12] — 2026-06-04
8
+
9
+ ### Fixed
10
+
11
+ - **cli:** Gate preview_ready on DNS resolution via c-ares + 1.1.1.1 (#249)
12
+
7
13
  ## [2.26.11] — 2026-06-03
8
14
 
9
15
  ### Added
package/dist/index.js CHANGED
@@ -472,7 +472,7 @@ var import_qrcode_terminal = __toESM(require("qrcode-terminal"));
472
472
  // package.json
473
473
  var package_default = {
474
474
  name: "codeam-cli",
475
- version: "2.26.12",
475
+ version: "2.26.13",
476
476
  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.",
477
477
  type: "commonjs",
478
478
  main: "dist/index.js",
@@ -1115,8 +1115,8 @@ function createGetModuleFromFilename(basePath = process.argv[1] ? (0, import_pat
1115
1115
  return decodedFile;
1116
1116
  };
1117
1117
  }
1118
- function normalizeWindowsPath(path42) {
1119
- return path42.replace(/^[A-Z]:/, "").replace(/\\/g, "/");
1118
+ function normalizeWindowsPath(path43) {
1119
+ return path43.replace(/^[A-Z]:/, "").replace(/\\/g, "/");
1120
1120
  }
1121
1121
 
1122
1122
  // ../../node_modules/@posthog/core/dist/featureFlagUtils.mjs
@@ -3596,9 +3596,9 @@ async function addSourceContext(frames) {
3596
3596
  LRU_FILE_CONTENTS_CACHE.reduce();
3597
3597
  return frames;
3598
3598
  }
3599
- function getContextLinesFromFile(path42, ranges, output) {
3599
+ function getContextLinesFromFile(path43, ranges, output) {
3600
3600
  return new Promise((resolve5) => {
3601
- const stream = (0, import_node_fs.createReadStream)(path42);
3601
+ const stream = (0, import_node_fs.createReadStream)(path43);
3602
3602
  const lineReaded = (0, import_node_readline.createInterface)({
3603
3603
  input: stream
3604
3604
  });
@@ -3613,7 +3613,7 @@ function getContextLinesFromFile(path42, ranges, output) {
3613
3613
  let rangeStart = range[0];
3614
3614
  let rangeEnd = range[1];
3615
3615
  function onStreamError() {
3616
- LRU_FILE_CONTENTS_FS_READ_FAILED.set(path42, 1);
3616
+ LRU_FILE_CONTENTS_FS_READ_FAILED.set(path43, 1);
3617
3617
  lineReaded.close();
3618
3618
  lineReaded.removeAllListeners();
3619
3619
  destroyStreamAndResolve();
@@ -3674,8 +3674,8 @@ function clearLineContext(frame) {
3674
3674
  delete frame.context_line;
3675
3675
  delete frame.post_context;
3676
3676
  }
3677
- function shouldSkipContextLinesForFile(path42) {
3678
- return path42.startsWith("node:") || path42.endsWith(".min.js") || path42.endsWith(".min.cjs") || path42.endsWith(".min.mjs") || path42.startsWith("data:");
3677
+ function shouldSkipContextLinesForFile(path43) {
3678
+ return path43.startsWith("node:") || path43.endsWith(".min.js") || path43.endsWith(".min.cjs") || path43.endsWith(".min.mjs") || path43.startsWith("data:");
3679
3679
  }
3680
3680
  function shouldSkipContextLinesForFrame(frame) {
3681
3681
  if (void 0 !== frame.lineno && frame.lineno > MAX_CONTEXTLINES_LINENO) return true;
@@ -5829,7 +5829,7 @@ function readAnonId() {
5829
5829
  }
5830
5830
  function superProperties() {
5831
5831
  return {
5832
- cliVersion: true ? "2.26.12" : "0.0.0-dev",
5832
+ cliVersion: true ? "2.26.13" : "0.0.0-dev",
5833
5833
  nodeVersion: process.version,
5834
5834
  platform: process.platform,
5835
5835
  arch: process.arch,
@@ -9901,13 +9901,13 @@ function detectStartupBanner(lines) {
9901
9901
  while (artStart > 0 && BANNER_ART_RE.test(lines[artStart - 1])) artStart--;
9902
9902
  if (metaIdx - artStart < 2) return null;
9903
9903
  const pathLine = (lines[metaIdx + 1] ?? "").trim();
9904
- const path42 = pathLine && !BANNER_ART_RE.test(pathLine) ? pathLine : "";
9904
+ const path43 = pathLine && !BANNER_ART_RE.test(pathLine) ? pathLine : "";
9905
9905
  return {
9906
9906
  title: "",
9907
9907
  subtitle: lines[metaIdx].trim(),
9908
- path: path42,
9908
+ path: path43,
9909
9909
  startIdx: artStart,
9910
- endIdx: metaIdx + (path42 ? 1 : 0)
9910
+ endIdx: metaIdx + (path43 ? 1 : 0)
9911
9911
  };
9912
9912
  }
9913
9913
 
@@ -11205,11 +11205,11 @@ function parseReview(stdout) {
11205
11205
  for (const line of lines) {
11206
11206
  const m = line.match(HUNK_LINE_RE);
11207
11207
  if (!m) continue;
11208
- const [, path42, lineNo, sevToken, message] = m;
11209
- if (!path42 || !lineNo || !message) continue;
11208
+ const [, path43, lineNo, sevToken, message] = m;
11209
+ if (!path43 || !lineNo || !message) continue;
11210
11210
  const cleanedMessage = message.trim().replace(/^[*-]\s+/, "");
11211
11211
  hunks.push({
11212
- path: path42.trim(),
11212
+ path: path43.trim(),
11213
11213
  line: Number(lineNo),
11214
11214
  severity: sevToken ? SEVERITY_MAP[sevToken.toLowerCase()] : void 0,
11215
11215
  message: cleanedMessage
@@ -13845,7 +13845,7 @@ function defaultRunGit(cwd, args2) {
13845
13845
  });
13846
13846
  }
13847
13847
  async function discoverRepos(workingDir, maxDepth = 4) {
13848
- const fs33 = await import("fs/promises");
13848
+ const fs34 = await import("fs/promises");
13849
13849
  const out2 = [];
13850
13850
  await walk(workingDir, 0);
13851
13851
  return out2;
@@ -13853,7 +13853,7 @@ async function discoverRepos(workingDir, maxDepth = 4) {
13853
13853
  if (depth > maxDepth) return;
13854
13854
  let entries = [];
13855
13855
  try {
13856
- const dirents = await fs33.readdir(dir, { withFileTypes: true });
13856
+ const dirents = await fs34.readdir(dir, { withFileTypes: true });
13857
13857
  entries = dirents.filter((d3) => !d3.name.startsWith(".") || d3.name === ".git").map((d3) => ({ name: d3.name, isDirectory: d3.isDirectory() }));
13858
13858
  } catch {
13859
13859
  return;
@@ -14755,9 +14755,9 @@ function buildKeepAlive(ctx) {
14755
14755
  }
14756
14756
 
14757
14757
  // src/commands/start/handlers.ts
14758
- var fs29 = __toESM(require("fs"));
14758
+ var fs30 = __toESM(require("fs"));
14759
14759
  var os24 = __toESM(require("os"));
14760
- var path35 = __toESM(require("path"));
14760
+ var path36 = __toESM(require("path"));
14761
14761
  var import_crypto5 = require("crypto");
14762
14762
  var import_child_process15 = require("child_process");
14763
14763
 
@@ -16281,6 +16281,24 @@ function parseExpoUrl(stdout) {
16281
16281
  return match ? match[0] : null;
16282
16282
  }
16283
16283
 
16284
+ // src/services/preview/setup-deps.ts
16285
+ var import_fs2 = __toESM(require("fs"));
16286
+ var import_path6 = __toESM(require("path"));
16287
+ function detectMissingNodeDeps(cwd) {
16288
+ if (!import_fs2.default.existsSync(import_path6.default.join(cwd, "package.json"))) return null;
16289
+ if (import_fs2.default.existsSync(import_path6.default.join(cwd, "node_modules"))) return null;
16290
+ if (import_fs2.default.existsSync(import_path6.default.join(cwd, "pnpm-lock.yaml"))) {
16291
+ return { cmd: "pnpm", args: ["install"] };
16292
+ }
16293
+ if (import_fs2.default.existsSync(import_path6.default.join(cwd, "yarn.lock"))) {
16294
+ return { cmd: "yarn", args: ["install"] };
16295
+ }
16296
+ if (import_fs2.default.existsSync(import_path6.default.join(cwd, "bun.lockb")) || import_fs2.default.existsSync(import_path6.default.join(cwd, "bun.lock"))) {
16297
+ return { cmd: "bun", args: ["install"] };
16298
+ }
16299
+ return { cmd: "npm", args: ["install"] };
16300
+ }
16301
+
16284
16302
  // src/services/preview/index.ts
16285
16303
  var activePreviews = /* @__PURE__ */ new Map();
16286
16304
  function registerPreview(sessionId, preview) {
@@ -16326,7 +16344,7 @@ var pendingAttachmentFiles = /* @__PURE__ */ new Set();
16326
16344
  function cleanupAttachmentTempFiles() {
16327
16345
  for (const p2 of pendingAttachmentFiles) {
16328
16346
  try {
16329
- fs29.unlinkSync(p2);
16347
+ fs30.unlinkSync(p2);
16330
16348
  } catch {
16331
16349
  }
16332
16350
  }
@@ -16335,8 +16353,8 @@ function cleanupAttachmentTempFiles() {
16335
16353
  function saveFilesTemp(files) {
16336
16354
  return files.filter(({ base64 }) => base64 && base64.length > 0).map(({ filename, base64 }) => {
16337
16355
  const safeName = filename.replace(/[^a-zA-Z0-9._-]/g, "_").slice(0, 80);
16338
- const tmpPath = path35.join(os24.tmpdir(), `codeam-${(0, import_crypto5.randomUUID)()}-${safeName}`);
16339
- fs29.writeFileSync(tmpPath, Buffer.from(base64, "base64"));
16356
+ const tmpPath = path36.join(os24.tmpdir(), `codeam-${(0, import_crypto5.randomUUID)()}-${safeName}`);
16357
+ fs30.writeFileSync(tmpPath, Buffer.from(base64, "base64"));
16340
16358
  pendingAttachmentFiles.add(tmpPath);
16341
16359
  return tmpPath;
16342
16360
  });
@@ -16356,7 +16374,7 @@ var startTask = (ctx, _cmd, parsed) => {
16356
16374
  setTimeout(() => {
16357
16375
  for (const p2 of paths) {
16358
16376
  try {
16359
- fs29.unlinkSync(p2);
16377
+ fs30.unlinkSync(p2);
16360
16378
  } catch {
16361
16379
  }
16362
16380
  pendingAttachmentFiles.delete(p2);
@@ -16921,6 +16939,32 @@ var previewStartH = (ctx, _cmd, parsed) => {
16921
16939
  payload: { framework: detection.framework, port: detection.port }
16922
16940
  });
16923
16941
  emitProgress("ENV_DETECTED", `${detection.framework}`);
16942
+ const missingDeps = detectMissingNodeDeps(process.cwd());
16943
+ if (missingDeps) {
16944
+ emitProgress(
16945
+ "SETUP_RUN",
16946
+ `${missingDeps.cmd} ${missingDeps.args.join(" ")} (pre-flight \u2014 node_modules missing)`
16947
+ );
16948
+ const exitCode = await runOnce(
16949
+ missingDeps.cmd,
16950
+ missingDeps.args,
16951
+ process.cwd(),
16952
+ detection.env
16953
+ );
16954
+ if (exitCode !== 0) {
16955
+ void postPreviewEvent({
16956
+ sessionId: ctx.sessionId,
16957
+ pluginId: ctx.pluginId,
16958
+ pluginAuthToken,
16959
+ type: "preview_error",
16960
+ payload: {
16961
+ stage: "spawn",
16962
+ message: `Dependency install failed (${missingDeps.cmd} ${missingDeps.args.join(" ")}, exit ${exitCode}). Run it manually in this project and try again.`
16963
+ }
16964
+ });
16965
+ return;
16966
+ }
16967
+ }
16924
16968
  for (const setup of detection.setup_commands ?? []) {
16925
16969
  emitProgress("SETUP_RUN", `${setup.cmd} ${setup.args.join(" ")}`);
16926
16970
  const exitCode = await runOnce(setup.cmd, setup.args, process.cwd(), detection.env);
@@ -17636,7 +17680,7 @@ async function autoLinkAfterPair(opts) {
17636
17680
  }
17637
17681
 
17638
17682
  // src/commands/pair-auto.ts
17639
- var fs30 = __toESM(require("fs"));
17683
+ var fs31 = __toESM(require("fs"));
17640
17684
  var os25 = __toESM(require("os"));
17641
17685
  var import_crypto7 = require("crypto");
17642
17686
 
@@ -17805,12 +17849,12 @@ function readTokenFromArgs(args2) {
17805
17849
  }
17806
17850
  const fileFlag = args2.find((a) => a.startsWith("--token-file="));
17807
17851
  if (fileFlag) {
17808
- const path42 = fileFlag.slice("--token-file=".length);
17852
+ const path43 = fileFlag.slice("--token-file=".length);
17809
17853
  try {
17810
- const content = fs30.readFileSync(path42, "utf8").trim();
17811
- if (content.length === 0) fail(`--token-file ${path42} is empty`);
17854
+ const content = fs31.readFileSync(path43, "utf8").trim();
17855
+ if (content.length === 0) fail(`--token-file ${path43} is empty`);
17812
17856
  try {
17813
- fs30.unlinkSync(path42);
17857
+ fs31.unlinkSync(path43);
17814
17858
  } catch {
17815
17859
  }
17816
17860
  return content;
@@ -18076,7 +18120,7 @@ var import_picocolors10 = __toESM(require("picocolors"));
18076
18120
  var import_child_process16 = require("child_process");
18077
18121
  var import_util4 = require("util");
18078
18122
  var import_picocolors8 = __toESM(require("picocolors"));
18079
- var path36 = __toESM(require("path"));
18123
+ var path37 = __toESM(require("path"));
18080
18124
  var execFileP5 = (0, import_util4.promisify)(import_child_process16.execFile);
18081
18125
  var MAX_BUFFER = 8 * 1024 * 1024;
18082
18126
  function resetStdinForChild() {
@@ -18565,7 +18609,7 @@ var GitHubCodespacesProvider = class {
18565
18609
  });
18566
18610
  }
18567
18611
  async uploadFile(workspaceId, remotePath, contents, options = {}) {
18568
- const remoteDir = path36.posix.dirname(remotePath);
18612
+ const remoteDir = path37.posix.dirname(remotePath);
18569
18613
  const parts = [
18570
18614
  `mkdir -p ${shellQuote(remoteDir)}`,
18571
18615
  `cat > ${shellQuote(remotePath)}`
@@ -18635,7 +18679,7 @@ function shellQuote(s) {
18635
18679
  // src/services/providers/gitpod.ts
18636
18680
  var import_child_process17 = require("child_process");
18637
18681
  var import_util5 = require("util");
18638
- var path37 = __toESM(require("path"));
18682
+ var path38 = __toESM(require("path"));
18639
18683
  var import_picocolors9 = __toESM(require("picocolors"));
18640
18684
  var execFileP6 = (0, import_util5.promisify)(import_child_process17.execFile);
18641
18685
  var MAX_BUFFER2 = 8 * 1024 * 1024;
@@ -18875,7 +18919,7 @@ var GitpodProvider = class {
18875
18919
  });
18876
18920
  }
18877
18921
  async uploadFile(workspaceId, remotePath, contents, options = {}) {
18878
- const remoteDir = path37.posix.dirname(remotePath);
18922
+ const remoteDir = path38.posix.dirname(remotePath);
18879
18923
  const parts = [
18880
18924
  `mkdir -p ${shellQuote2(remoteDir)}`,
18881
18925
  `cat > ${shellQuote2(remotePath)}`
@@ -18911,7 +18955,7 @@ function shellQuote2(s) {
18911
18955
  // src/services/providers/gitlab-workspaces.ts
18912
18956
  var import_child_process18 = require("child_process");
18913
18957
  var import_util6 = require("util");
18914
- var path38 = __toESM(require("path"));
18958
+ var path39 = __toESM(require("path"));
18915
18959
  var execFileP7 = (0, import_util6.promisify)(import_child_process18.execFile);
18916
18960
  var MAX_BUFFER3 = 8 * 1024 * 1024;
18917
18961
  var GITLAB_API_BASE = process.env.CODEAM_GITLAB_API_URL ?? "https://gitlab.com/api/v4";
@@ -19171,7 +19215,7 @@ Docs: https://docs.gitlab.com/ee/user/workspace/configuration.html`
19171
19215
  }
19172
19216
  async uploadFile(workspaceId, remotePath, contents, options = {}) {
19173
19217
  const sshHost = process.env.CODEAM_GITLAB_SSH_HOST ?? "workspaces.gitlab.com";
19174
- const remoteDir = path38.posix.dirname(remotePath);
19218
+ const remoteDir = path39.posix.dirname(remotePath);
19175
19219
  const parts = [`mkdir -p ${shellQuote3(remoteDir)}`, `cat > ${shellQuote3(remotePath)}`];
19176
19220
  if (options.mode != null) {
19177
19221
  parts.push(`chmod ${options.mode.toString(8)} ${shellQuote3(remotePath)}`);
@@ -19239,7 +19283,7 @@ function shellQuote3(s) {
19239
19283
  // src/services/providers/railway.ts
19240
19284
  var import_child_process19 = require("child_process");
19241
19285
  var import_util7 = require("util");
19242
- var path39 = __toESM(require("path"));
19286
+ var path40 = __toESM(require("path"));
19243
19287
  var execFileP8 = (0, import_util7.promisify)(import_child_process19.execFile);
19244
19288
  var MAX_BUFFER4 = 8 * 1024 * 1024;
19245
19289
  function resetStdinForChild4() {
@@ -19475,7 +19519,7 @@ var RailwayProvider = class {
19475
19519
  if (!projectId || !serviceId) {
19476
19520
  throw new Error("Invalid Railway workspace id (expected projectId/serviceId).");
19477
19521
  }
19478
- const remoteDir = path39.posix.dirname(remotePath);
19522
+ const remoteDir = path40.posix.dirname(remotePath);
19479
19523
  const parts = [`mkdir -p ${shellQuote4(remoteDir)}`, `cat > ${shellQuote4(remotePath)}`];
19480
19524
  if (options.mode != null) {
19481
19525
  parts.push(`chmod ${options.mode.toString(8)} ${shellQuote4(remotePath)}`);
@@ -20018,8 +20062,8 @@ async function stopWorkspaceFromLocal(target) {
20018
20062
  var import_node_dns = require("dns");
20019
20063
  var import_node_util4 = require("util");
20020
20064
  var import_node_crypto6 = require("crypto");
20021
- var fs31 = __toESM(require("fs"));
20022
- var path40 = __toESM(require("path"));
20065
+ var fs32 = __toESM(require("fs"));
20066
+ var path41 = __toESM(require("path"));
20023
20067
  var import_picocolors12 = __toESM(require("picocolors"));
20024
20068
  var dnsResolveP = (0, import_node_util4.promisify)(import_node_dns.resolve);
20025
20069
  async function checkDns(apiBase) {
@@ -20075,13 +20119,13 @@ async function checkHealth(apiBase) {
20075
20119
  }
20076
20120
  }
20077
20121
  function checkConfigDir() {
20078
- const dir = path40.join(require("os").homedir(), ".codeam");
20122
+ const dir = path41.join(require("os").homedir(), ".codeam");
20079
20123
  try {
20080
- fs31.mkdirSync(dir, { recursive: true, mode: 448 });
20081
- const probe = path40.join(dir, ".doctor-probe");
20082
- fs31.writeFileSync(probe, "ok", { mode: 384 });
20083
- const read = fs31.readFileSync(probe, "utf8");
20084
- fs31.unlinkSync(probe);
20124
+ fs32.mkdirSync(dir, { recursive: true, mode: 448 });
20125
+ const probe = path41.join(dir, ".doctor-probe");
20126
+ fs32.writeFileSync(probe, "ok", { mode: 384 });
20127
+ const read = fs32.readFileSync(probe, "utf8");
20128
+ fs32.unlinkSync(probe);
20085
20129
  if (read !== "ok") throw new Error("write/read round-trip mismatch");
20086
20130
  return {
20087
20131
  id: "config-dir",
@@ -20145,7 +20189,7 @@ function checkNodePty() {
20145
20189
  detail: "not required on this platform"
20146
20190
  };
20147
20191
  }
20148
- const vendoredPath = path40.join(__dirname, "vendor", "node-pty");
20192
+ const vendoredPath = path41.join(__dirname, "vendor", "node-pty");
20149
20193
  for (const target of [vendoredPath, "node-pty"]) {
20150
20194
  try {
20151
20195
  require(target);
@@ -20187,7 +20231,7 @@ function checkChokidar() {
20187
20231
  }
20188
20232
  async function doctor(args2 = []) {
20189
20233
  const json = args2.includes("--json");
20190
- const cliVersion = true ? "2.26.12" : "0.0.0-dev";
20234
+ const cliVersion = true ? "2.26.13" : "0.0.0-dev";
20191
20235
  const apiBase = resolveApiBaseUrl();
20192
20236
  const diagnosticId = (0, import_node_crypto6.randomUUID)();
20193
20237
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -20386,7 +20430,7 @@ async function completion(args2) {
20386
20430
  // src/commands/version.ts
20387
20431
  var import_picocolors13 = __toESM(require("picocolors"));
20388
20432
  function version2() {
20389
- const v = true ? "2.26.12" : "unknown";
20433
+ const v = true ? "2.26.13" : "unknown";
20390
20434
  console.log(`${import_picocolors13.default.bold("codeam-cli")} ${import_picocolors13.default.cyan(v)}`);
20391
20435
  }
20392
20436
 
@@ -20514,9 +20558,9 @@ function tryShowSubcommandHelp(cmd, args2) {
20514
20558
  var _subcommandHelpKeys = Object.keys(HELPS);
20515
20559
 
20516
20560
  // src/lib/updateNotifier.ts
20517
- var fs32 = __toESM(require("fs"));
20561
+ var fs33 = __toESM(require("fs"));
20518
20562
  var os26 = __toESM(require("os"));
20519
- var path41 = __toESM(require("path"));
20563
+ var path42 = __toESM(require("path"));
20520
20564
  var https7 = __toESM(require("https"));
20521
20565
  var import_picocolors16 = __toESM(require("picocolors"));
20522
20566
  var PKG_NAME = "codeam-cli";
@@ -20524,12 +20568,12 @@ var REGISTRY_URL = `https://registry.npmjs.org/${PKG_NAME}/latest`;
20524
20568
  var TTL_MS = 24 * 60 * 60 * 1e3;
20525
20569
  var REQUEST_TIMEOUT_MS = 1500;
20526
20570
  function cachePath() {
20527
- const dir = path41.join(os26.homedir(), ".codeam");
20528
- return path41.join(dir, "update-check.json");
20571
+ const dir = path42.join(os26.homedir(), ".codeam");
20572
+ return path42.join(dir, "update-check.json");
20529
20573
  }
20530
20574
  function readCache() {
20531
20575
  try {
20532
- const raw = fs32.readFileSync(cachePath(), "utf8");
20576
+ const raw = fs33.readFileSync(cachePath(), "utf8");
20533
20577
  const parsed = JSON.parse(raw);
20534
20578
  if (typeof parsed.fetchedAt !== "number" || typeof parsed.latest !== "string") return null;
20535
20579
  return parsed;
@@ -20540,10 +20584,10 @@ function readCache() {
20540
20584
  function writeCache(cache) {
20541
20585
  try {
20542
20586
  const file = cachePath();
20543
- fs32.mkdirSync(path41.dirname(file), { recursive: true });
20587
+ fs33.mkdirSync(path42.dirname(file), { recursive: true });
20544
20588
  const tmp = `${file}.${process.pid}.tmp`;
20545
- fs32.writeFileSync(tmp, JSON.stringify(cache));
20546
- fs32.renameSync(tmp, file);
20589
+ fs33.writeFileSync(tmp, JSON.stringify(cache));
20590
+ fs33.renameSync(tmp, file);
20547
20591
  } catch {
20548
20592
  }
20549
20593
  }
@@ -20614,7 +20658,7 @@ function checkForUpdates() {
20614
20658
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
20615
20659
  if (process.env.CI) return;
20616
20660
  if (!process.stdout.isTTY) return;
20617
- const current = true ? "2.26.12" : null;
20661
+ const current = true ? "2.26.13" : null;
20618
20662
  if (!current) return;
20619
20663
  const cache = readCache();
20620
20664
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeam-cli",
3
- "version": "2.26.12",
3
+ "version": "2.26.13",
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",