codeam-cli 2.39.43 → 2.39.44

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.39.43] — 2026-06-19
8
+
9
+ ### Fixed
10
+
11
+ - **cli:** Extract macOS cloudflared .tgz + self-heal gzip-corrupt cache
12
+
7
13
  ## [2.39.42] — 2026-06-19
8
14
 
9
15
  ### Added
package/dist/index.js CHANGED
@@ -498,7 +498,7 @@ var import_qrcode_terminal = __toESM(require("qrcode-terminal"));
498
498
  // package.json
499
499
  var package_default = {
500
500
  name: "codeam-cli",
501
- version: "2.39.43",
501
+ version: "2.39.44",
502
502
  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.",
503
503
  type: "commonjs",
504
504
  main: "dist/index.js",
@@ -5908,7 +5908,7 @@ function readAnonId() {
5908
5908
  }
5909
5909
  function superProperties() {
5910
5910
  return {
5911
- cliVersion: true ? "2.39.43" : "0.0.0-dev",
5911
+ cliVersion: true ? "2.39.44" : "0.0.0-dev",
5912
5912
  nodeVersion: process.version,
5913
5913
  platform: process.platform,
5914
5914
  arch: process.arch,
@@ -20253,6 +20253,7 @@ var import_crypto4 = require("crypto");
20253
20253
 
20254
20254
  // src/services/turn-files/git-changeset.ts
20255
20255
  var import_child_process21 = require("child_process");
20256
+ var fs37 = __toESM(require("fs/promises"));
20256
20257
  var path44 = __toESM(require("path"));
20257
20258
  async function collectRepoChangeset(opts) {
20258
20259
  const status2 = await runGit3(opts.repoRoot, ["status", "--porcelain=v1", "-z"]);
@@ -20267,7 +20268,16 @@ async function collectRepoChangeset(opts) {
20267
20268
  const entries = [];
20268
20269
  for (const row of parseStatus(status2)) {
20269
20270
  if (isIgnoredFilePath(row.filePath)) continue;
20270
- const stats = numstat.get(row.filePath) ?? { added: 0, removed: 0 };
20271
+ const numstatEntry = numstat.get(row.filePath);
20272
+ let stats;
20273
+ if (row.fileStatus === "added" && numstatEntry === void 0) {
20274
+ const lineCount = await readUntrackedLineCount(
20275
+ path44.join(opts.repoRoot, row.filePath)
20276
+ );
20277
+ stats = { added: lineCount, removed: 0 };
20278
+ } else {
20279
+ stats = numstatEntry ?? { added: 0, removed: 0 };
20280
+ }
20271
20281
  entries.push({
20272
20282
  filePath: row.filePath,
20273
20283
  fileStatus: row.fileStatus,
@@ -20284,6 +20294,27 @@ async function collectRepoChangeset(opts) {
20284
20294
  }
20285
20295
  return entries;
20286
20296
  }
20297
+ var MAX_UNTRACKED_LINE_SCAN = 1e5;
20298
+ var _readUntrackedLineCountImpl = {
20299
+ read: defaultReadUntrackedLineCount
20300
+ };
20301
+ function readUntrackedLineCount(absPath) {
20302
+ return _readUntrackedLineCountImpl.read(absPath);
20303
+ }
20304
+ async function defaultReadUntrackedLineCount(absPath) {
20305
+ try {
20306
+ const content = await fs37.readFile(absPath, "utf8");
20307
+ let count = 0;
20308
+ let pos = -1;
20309
+ while ((pos = content.indexOf("\n", pos + 1)) !== -1) {
20310
+ count += 1;
20311
+ if (count >= MAX_UNTRACKED_LINE_SCAN) return count;
20312
+ }
20313
+ return content.length > 0 ? Math.max(count, 1) : 0;
20314
+ } catch {
20315
+ return 0;
20316
+ }
20317
+ }
20287
20318
  function parseStatus(raw) {
20288
20319
  const tokens = raw.split("\0");
20289
20320
  const rows = [];
@@ -20364,7 +20395,7 @@ function defaultRunGit(cwd, args2) {
20364
20395
  });
20365
20396
  }
20366
20397
  async function discoverRepos(workingDir, maxDepth = 4) {
20367
- const fs46 = await import("fs/promises");
20398
+ const fs47 = await import("fs/promises");
20368
20399
  const out2 = [];
20369
20400
  await walk(workingDir, 0);
20370
20401
  return out2;
@@ -20372,7 +20403,7 @@ async function discoverRepos(workingDir, maxDepth = 4) {
20372
20403
  if (depth > maxDepth) return;
20373
20404
  let entries = [];
20374
20405
  try {
20375
- const dirents = await fs46.readdir(dir, { withFileTypes: true });
20406
+ const dirents = await fs47.readdir(dir, { withFileTypes: true });
20376
20407
  entries = dirents.filter((d3) => !d3.name.startsWith(".") || d3.name === ".git").map((d3) => ({ name: d3.name, isDirectory: d3.isDirectory() }));
20377
20408
  } catch {
20378
20409
  return;
@@ -20398,7 +20429,7 @@ async function discoverRepos(workingDir, maxDepth = 4) {
20398
20429
  }
20399
20430
 
20400
20431
  // src/services/turn-files/files-outbox.ts
20401
- var fs37 = __toESM(require("fs/promises"));
20432
+ var fs38 = __toESM(require("fs/promises"));
20402
20433
  var path45 = __toESM(require("path"));
20403
20434
  var import_os7 = require("os");
20404
20435
  var HOME_OUTBOX_DIR = ".codeam/outbox";
@@ -20440,8 +20471,8 @@ var FilesOutbox = class {
20440
20471
  /** Persist the entry to disk and trigger a flush. Returns once the
20441
20472
  * line is durable on disk (not once the POST succeeds). */
20442
20473
  async enqueue(entry) {
20443
- await fs37.mkdir(path45.dirname(this.filePath), { recursive: true });
20444
- await fs37.appendFile(this.filePath, JSON.stringify(entry) + "\n", "utf8");
20474
+ await fs38.mkdir(path45.dirname(this.filePath), { recursive: true });
20475
+ await fs38.appendFile(this.filePath, JSON.stringify(entry) + "\n", "utf8");
20445
20476
  this.backoffIndex = 0;
20446
20477
  if (this.autoSchedule) this.scheduleFlush(0);
20447
20478
  }
@@ -20530,7 +20561,7 @@ var FilesOutbox = class {
20530
20561
  async readAll() {
20531
20562
  let raw = "";
20532
20563
  try {
20533
- raw = await fs37.readFile(this.filePath, "utf8");
20564
+ raw = await fs38.readFile(this.filePath, "utf8");
20534
20565
  } catch {
20535
20566
  return [];
20536
20567
  }
@@ -20554,12 +20585,12 @@ var FilesOutbox = class {
20554
20585
  async rewrite(entries) {
20555
20586
  const tmpPath = `${this.filePath}.${process.pid}.tmp`;
20556
20587
  if (entries.length === 0) {
20557
- await fs37.unlink(this.filePath).catch(() => void 0);
20588
+ await fs38.unlink(this.filePath).catch(() => void 0);
20558
20589
  return;
20559
20590
  }
20560
20591
  const payload = entries.map((e) => JSON.stringify(e)).join("\n") + "\n";
20561
- await fs37.writeFile(tmpPath, payload, "utf8");
20562
- await fs37.rename(tmpPath, this.filePath);
20592
+ await fs38.writeFile(tmpPath, payload, "utf8");
20593
+ await fs38.rename(tmpPath, this.filePath);
20563
20594
  }
20564
20595
  };
20565
20596
  function applyJitter(ms) {
@@ -22457,7 +22488,7 @@ var OutputService = class _OutputService {
22457
22488
  };
22458
22489
 
22459
22490
  // src/services/history.service.ts
22460
- var fs38 = __toESM(require("fs"));
22491
+ var fs39 = __toESM(require("fs"));
22461
22492
  var path46 = __toESM(require("path"));
22462
22493
  var os30 = __toESM(require("os"));
22463
22494
  var https7 = __toESM(require("https"));
@@ -22486,7 +22517,7 @@ function parseJsonl(filePath) {
22486
22517
  const messages = [];
22487
22518
  let raw;
22488
22519
  try {
22489
- raw = fs38.readFileSync(filePath, "utf8");
22520
+ raw = fs39.readFileSync(filePath, "utf8");
22490
22521
  } catch (err) {
22491
22522
  if (err.code !== "ENOENT") {
22492
22523
  log.warn("history:parseJsonl", `read failed for ${filePath}`, err);
@@ -22676,9 +22707,9 @@ var HistoryService = class _HistoryService {
22676
22707
  const dir = this.projectDir;
22677
22708
  const cutoff = this.bootTimeMs - _HistoryService.BIRTHTIME_GRACE_MS;
22678
22709
  try {
22679
- const files = fs38.readdirSync(dir, { withFileTypes: true }).filter((e) => e.isFile() && e.name.endsWith(".jsonl")).map((e) => {
22710
+ const files = fs39.readdirSync(dir, { withFileTypes: true }).filter((e) => e.isFile() && e.name.endsWith(".jsonl")).map((e) => {
22680
22711
  try {
22681
- const stat3 = fs38.statSync(path46.join(dir, e.name));
22712
+ const stat3 = fs39.statSync(path46.join(dir, e.name));
22682
22713
  return { name: e.name, mtime: stat3.mtimeMs, birthtime: stat3.birthtimeMs };
22683
22714
  } catch {
22684
22715
  return { name: e.name, mtime: 0, birthtime: 0 };
@@ -22719,13 +22750,13 @@ var HistoryService = class _HistoryService {
22719
22750
  const cutoff = this.bootTimeMs - _HistoryService.BIRTHTIME_GRACE_MS;
22720
22751
  let entries;
22721
22752
  try {
22722
- entries = fs38.readdirSync(dir, { withFileTypes: true });
22753
+ entries = fs39.readdirSync(dir, { withFileTypes: true });
22723
22754
  } catch {
22724
22755
  return null;
22725
22756
  }
22726
22757
  const files = entries.filter((e) => e.isFile() && e.name.endsWith(".jsonl")).map((e) => {
22727
22758
  try {
22728
- const stat3 = fs38.statSync(path46.join(dir, e.name));
22759
+ const stat3 = fs39.statSync(path46.join(dir, e.name));
22729
22760
  return { name: e.name, mtime: stat3.mtimeMs, birthtime: stat3.birthtimeMs };
22730
22761
  } catch {
22731
22762
  return { name: e.name, mtime: 0, birthtime: 0 };
@@ -22739,7 +22770,7 @@ var HistoryService = class _HistoryService {
22739
22770
  extractUsageFromFile(filePath) {
22740
22771
  let raw;
22741
22772
  try {
22742
- raw = fs38.readFileSync(filePath, "utf8");
22773
+ raw = fs39.readFileSync(filePath, "utf8");
22743
22774
  } catch {
22744
22775
  return null;
22745
22776
  }
@@ -22784,9 +22815,9 @@ var HistoryService = class _HistoryService {
22784
22815
  let totalCost = 0;
22785
22816
  let files;
22786
22817
  try {
22787
- files = fs38.readdirSync(projectDir).filter((f) => f.endsWith(".jsonl")).filter((f) => {
22818
+ files = fs39.readdirSync(projectDir).filter((f) => f.endsWith(".jsonl")).filter((f) => {
22788
22819
  try {
22789
- return fs38.statSync(path46.join(projectDir, f)).mtimeMs >= monthStartMs;
22820
+ return fs39.statSync(path46.join(projectDir, f)).mtimeMs >= monthStartMs;
22790
22821
  } catch {
22791
22822
  return false;
22792
22823
  }
@@ -22797,7 +22828,7 @@ var HistoryService = class _HistoryService {
22797
22828
  for (const file of files) {
22798
22829
  let raw;
22799
22830
  try {
22800
- raw = fs38.readFileSync(path46.join(projectDir, file), "utf8");
22831
+ raw = fs39.readFileSync(path46.join(projectDir, file), "utf8");
22801
22832
  } catch {
22802
22833
  continue;
22803
22834
  }
@@ -23388,7 +23419,7 @@ function buildKeepAlive(ctx) {
23388
23419
  }
23389
23420
 
23390
23421
  // src/agents/claude/onboarding.ts
23391
- var fs39 = __toESM(require("fs"));
23422
+ var fs40 = __toESM(require("fs"));
23392
23423
  var os31 = __toESM(require("os"));
23393
23424
  var path47 = __toESM(require("path"));
23394
23425
  function ensureClaudeOnboarded() {
@@ -23396,7 +23427,7 @@ function ensureClaudeOnboarded() {
23396
23427
  const file = path47.join(os31.homedir(), ".claude.json");
23397
23428
  let config = {};
23398
23429
  try {
23399
- config = JSON.parse(fs39.readFileSync(file, "utf8"));
23430
+ config = JSON.parse(fs40.readFileSync(file, "utf8"));
23400
23431
  } catch {
23401
23432
  }
23402
23433
  if (config.hasCompletedOnboarding === true && typeof config.theme === "string") {
@@ -23407,8 +23438,8 @@ function ensureClaudeOnboarded() {
23407
23438
  if (typeof config.lastOnboardingVersion !== "string") {
23408
23439
  config.lastOnboardingVersion = "2.1.177";
23409
23440
  }
23410
- fs39.mkdirSync(path47.dirname(file), { recursive: true });
23411
- fs39.writeFileSync(file, JSON.stringify(config, null, 2));
23441
+ fs40.mkdirSync(path47.dirname(file), { recursive: true });
23442
+ fs40.writeFileSync(file, JSON.stringify(config, null, 2));
23412
23443
  log.info("claude", "pre-completed Claude onboarding (skip first-run theme picker)");
23413
23444
  } catch (err) {
23414
23445
  log.warn("claude", `ensureClaudeOnboarded failed (non-fatal): ${err.message}`);
@@ -23899,7 +23930,7 @@ async function autoLinkAfterPair(opts) {
23899
23930
  }
23900
23931
 
23901
23932
  // src/commands/pair-auto.ts
23902
- var fs40 = __toESM(require("fs"));
23933
+ var fs41 = __toESM(require("fs"));
23903
23934
  var os32 = __toESM(require("os"));
23904
23935
  var path48 = __toESM(require("path"));
23905
23936
  var import_crypto7 = require("crypto");
@@ -24098,10 +24129,10 @@ function readTokenFromArgs(args2) {
24098
24129
  if (fileFlag) {
24099
24130
  const path58 = fileFlag.slice("--token-file=".length);
24100
24131
  try {
24101
- const content = fs40.readFileSync(path58, "utf8").trim();
24132
+ const content = fs41.readFileSync(path58, "utf8").trim();
24102
24133
  if (content.length === 0) fail(`--token-file ${path58} is empty`);
24103
24134
  try {
24104
- fs40.unlinkSync(path58);
24135
+ fs41.unlinkSync(path58);
24105
24136
  } catch {
24106
24137
  }
24107
24138
  return content;
@@ -24198,7 +24229,7 @@ function isLivePairAuto(pid) {
24198
24229
  if (e.code !== "EPERM") return false;
24199
24230
  }
24200
24231
  try {
24201
- return fs40.readFileSync(`/proc/${pid}/cmdline`, "utf8").includes("codeam");
24232
+ return fs41.readFileSync(`/proc/${pid}/cmdline`, "utf8").includes("codeam");
24202
24233
  } catch {
24203
24234
  return true;
24204
24235
  }
@@ -24206,19 +24237,19 @@ function isLivePairAuto(pid) {
24206
24237
  function acquireSingletonLock() {
24207
24238
  const lockPath = pairAutoLockPath();
24208
24239
  try {
24209
- fs40.mkdirSync(path48.dirname(lockPath), { recursive: true });
24240
+ fs41.mkdirSync(path48.dirname(lockPath), { recursive: true });
24210
24241
  try {
24211
- fs40.writeFileSync(lockPath, String(process.pid), { flag: "wx" });
24242
+ fs41.writeFileSync(lockPath, String(process.pid), { flag: "wx" });
24212
24243
  } catch (e) {
24213
24244
  if (e.code !== "EEXIST") throw e;
24214
- const holder = Number(fs40.readFileSync(lockPath, "utf8").trim());
24245
+ const holder = Number(fs41.readFileSync(lockPath, "utf8").trim());
24215
24246
  if (isLivePairAuto(holder)) return false;
24216
- fs40.writeFileSync(lockPath, String(process.pid));
24247
+ fs41.writeFileSync(lockPath, String(process.pid));
24217
24248
  }
24218
24249
  process.once("exit", () => {
24219
24250
  try {
24220
- if (fs40.existsSync(lockPath) && Number(fs40.readFileSync(lockPath, "utf8").trim()) === process.pid) {
24221
- fs40.unlinkSync(lockPath);
24251
+ if (fs41.existsSync(lockPath) && Number(fs41.readFileSync(lockPath, "utf8").trim()) === process.pid) {
24252
+ fs41.unlinkSync(lockPath);
24222
24253
  }
24223
24254
  } catch {
24224
24255
  }
@@ -26360,7 +26391,7 @@ async function stopWorkspaceFromLocal(target) {
26360
26391
  }
26361
26392
 
26362
26393
  // src/commands/host/host-client.ts
26363
- var fs41 = __toESM(require("fs"));
26394
+ var fs42 = __toESM(require("fs"));
26364
26395
  var os33 = __toESM(require("os"));
26365
26396
  var path53 = __toESM(require("path"));
26366
26397
  function sampleCpuTimes() {
@@ -26421,7 +26452,7 @@ function collectOsInfo() {
26421
26452
  }
26422
26453
  function loadHostIdentity() {
26423
26454
  try {
26424
- const raw = fs41.readFileSync(hostIdentityPath(), "utf8");
26455
+ const raw = fs42.readFileSync(hostIdentityPath(), "utf8");
26425
26456
  const parsed = JSON.parse(raw);
26426
26457
  if (typeof parsed === "object" && parsed !== null && typeof parsed.hostId === "string" && typeof parsed.hostToken === "string" && typeof parsed.controlPluginId === "string") {
26427
26458
  const p2 = parsed;
@@ -26434,12 +26465,12 @@ function loadHostIdentity() {
26434
26465
  }
26435
26466
  function saveHostIdentity(identity) {
26436
26467
  const file = hostIdentityPath();
26437
- fs41.mkdirSync(path53.dirname(file), { recursive: true, mode: 448 });
26438
- fs41.writeFileSync(file, JSON.stringify(identity, null, 2), {
26468
+ fs42.mkdirSync(path53.dirname(file), { recursive: true, mode: 448 });
26469
+ fs42.writeFileSync(file, JSON.stringify(identity, null, 2), {
26439
26470
  encoding: "utf8",
26440
26471
  mode: 384
26441
26472
  });
26442
- fs41.chmodSync(file, 384);
26473
+ fs42.chmodSync(file, 384);
26443
26474
  }
26444
26475
  var HostHttpError = class extends Error {
26445
26476
  constructor(message, status2) {
@@ -26462,7 +26493,7 @@ function isHostAuthRejection(err) {
26462
26493
  }
26463
26494
  function deleteHostIdentity() {
26464
26495
  try {
26465
- fs41.rmSync(hostIdentityPath(), { force: true });
26496
+ fs42.rmSync(hostIdentityPath(), { force: true });
26466
26497
  } catch {
26467
26498
  }
26468
26499
  }
@@ -26626,7 +26657,7 @@ var import_node_child_process13 = require("child_process");
26626
26657
  var os36 = __toESM(require("os"));
26627
26658
 
26628
26659
  // src/commands/host/workspace.ts
26629
- var fs42 = __toESM(require("fs"));
26660
+ var fs43 = __toESM(require("fs"));
26630
26661
  var os34 = __toESM(require("os"));
26631
26662
  var path54 = __toESM(require("path"));
26632
26663
  var import_node_child_process12 = require("child_process");
@@ -26679,16 +26710,16 @@ function maskToken(text, cloneToken) {
26679
26710
  }
26680
26711
  async function prepareWorkspace(repoOrPath, deployId, cloneToken) {
26681
26712
  if (isAbsolutePathTarget(repoOrPath)) {
26682
- if (!fs42.existsSync(repoOrPath)) {
26713
+ if (!fs43.existsSync(repoOrPath)) {
26683
26714
  throw new Error(`deploy target path does not exist: ${repoOrPath}`);
26684
26715
  }
26685
26716
  return repoOrPath;
26686
26717
  }
26687
26718
  const dest = path54.join(selfHostedWorkspaceRoot(), deployId);
26688
- if (fs42.existsSync(path54.join(dest, ".git"))) {
26719
+ if (fs43.existsSync(path54.join(dest, ".git"))) {
26689
26720
  return dest;
26690
26721
  }
26691
- fs42.mkdirSync(selfHostedWorkspaceRoot(), { recursive: true, mode: 448 });
26722
+ fs43.mkdirSync(selfHostedWorkspaceRoot(), { recursive: true, mode: 448 });
26692
26723
  const cloneUrl = repoCloneUrl(repoOrPath, cloneToken);
26693
26724
  try {
26694
26725
  await execFileP9("git", ["clone", "--depth", "1", cloneUrl, dest], {
@@ -26704,7 +26735,7 @@ async function prepareWorkspace(repoOrPath, deployId, cloneToken) {
26704
26735
  }
26705
26736
 
26706
26737
  // src/commands/host/agent-provisioning.ts
26707
- var fs43 = __toESM(require("fs"));
26738
+ var fs44 = __toESM(require("fs"));
26708
26739
  var os35 = __toESM(require("os"));
26709
26740
  var path55 = __toESM(require("path"));
26710
26741
  var PUBLIC_TO_INTERNAL_AGENT = {
@@ -26721,12 +26752,12 @@ function toInternalAgentId(publicAgentId) {
26721
26752
  return PUBLIC_TO_INTERNAL_AGENT[publicAgentId] ?? null;
26722
26753
  }
26723
26754
  function ensureDir(dir) {
26724
- fs43.mkdirSync(dir, { recursive: true, mode: 448 });
26755
+ fs44.mkdirSync(dir, { recursive: true, mode: 448 });
26725
26756
  }
26726
26757
  function writeFile0600(filePath, contents) {
26727
26758
  ensureDir(path55.dirname(filePath));
26728
- fs43.writeFileSync(filePath, contents, { encoding: "utf8", mode: 384 });
26729
- fs43.chmodSync(filePath, 384);
26759
+ fs44.writeFileSync(filePath, contents, { encoding: "utf8", mode: 384 });
26760
+ fs44.chmodSync(filePath, 384);
26730
26761
  }
26731
26762
  var claudeProvisioner = {
26732
26763
  write(auth, home) {
@@ -26735,7 +26766,7 @@ var claudeProvisioner = {
26735
26766
  }
26736
26767
  writeFile0600(path55.join(home, ".claude", ".credentials.json"), auth.value);
26737
26768
  const claudeJson = path55.join(home, ".claude.json");
26738
- if (!fs43.existsSync(claudeJson)) {
26769
+ if (!fs44.existsSync(claudeJson)) {
26739
26770
  writeFile0600(
26740
26771
  claudeJson,
26741
26772
  JSON.stringify({ hasCompletedOnboarding: true, customApiKeyResponses: { approved: [] } })
@@ -27165,7 +27196,7 @@ async function hostAgent(args2 = []) {
27165
27196
  var import_node_dns = require("dns");
27166
27197
  var import_node_util5 = require("util");
27167
27198
  var import_node_crypto8 = require("crypto");
27168
- var fs44 = __toESM(require("fs"));
27199
+ var fs45 = __toESM(require("fs"));
27169
27200
  var path56 = __toESM(require("path"));
27170
27201
  var import_picocolors12 = __toESM(require("picocolors"));
27171
27202
  var dnsResolveP = (0, import_node_util5.promisify)(import_node_dns.resolve);
@@ -27224,11 +27255,11 @@ async function checkHealth(apiBase2) {
27224
27255
  function checkConfigDir() {
27225
27256
  const dir = path56.join(require("os").homedir(), ".codeam");
27226
27257
  try {
27227
- fs44.mkdirSync(dir, { recursive: true, mode: 448 });
27258
+ fs45.mkdirSync(dir, { recursive: true, mode: 448 });
27228
27259
  const probe = path56.join(dir, ".doctor-probe");
27229
- fs44.writeFileSync(probe, "ok", { mode: 384 });
27230
- const read = fs44.readFileSync(probe, "utf8");
27231
- fs44.unlinkSync(probe);
27260
+ fs45.writeFileSync(probe, "ok", { mode: 384 });
27261
+ const read = fs45.readFileSync(probe, "utf8");
27262
+ fs45.unlinkSync(probe);
27232
27263
  if (read !== "ok") throw new Error("write/read round-trip mismatch");
27233
27264
  return {
27234
27265
  id: "config-dir",
@@ -27334,7 +27365,7 @@ function checkChokidar() {
27334
27365
  }
27335
27366
  async function doctor(args2 = []) {
27336
27367
  const json = args2.includes("--json");
27337
- const cliVersion = true ? "2.39.43" : "0.0.0-dev";
27368
+ const cliVersion = true ? "2.39.44" : "0.0.0-dev";
27338
27369
  const apiBase2 = resolveApiBaseUrl();
27339
27370
  const diagnosticId = (0, import_node_crypto8.randomUUID)();
27340
27371
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -27533,7 +27564,7 @@ async function completion(args2) {
27533
27564
  // src/commands/version.ts
27534
27565
  var import_picocolors13 = __toESM(require("picocolors"));
27535
27566
  function version2() {
27536
- const v = true ? "2.39.43" : "unknown";
27567
+ const v = true ? "2.39.44" : "unknown";
27537
27568
  console.log(`${import_picocolors13.default.bold("codeam-cli")} ${import_picocolors13.default.cyan(v)}`);
27538
27569
  }
27539
27570
 
@@ -27661,7 +27692,7 @@ function tryShowSubcommandHelp(cmd, args2) {
27661
27692
  var _subcommandHelpKeys = Object.keys(HELPS);
27662
27693
 
27663
27694
  // src/lib/updateNotifier.ts
27664
- var fs45 = __toESM(require("fs"));
27695
+ var fs46 = __toESM(require("fs"));
27665
27696
  var os37 = __toESM(require("os"));
27666
27697
  var path57 = __toESM(require("path"));
27667
27698
  var https8 = __toESM(require("https"));
@@ -27677,7 +27708,7 @@ function cachePath() {
27677
27708
  }
27678
27709
  function readCache() {
27679
27710
  try {
27680
- const raw = fs45.readFileSync(cachePath(), "utf8");
27711
+ const raw = fs46.readFileSync(cachePath(), "utf8");
27681
27712
  const parsed = JSON.parse(raw);
27682
27713
  if (typeof parsed.fetchedAt !== "number" || typeof parsed.latest !== "string") return null;
27683
27714
  return parsed;
@@ -27688,10 +27719,10 @@ function readCache() {
27688
27719
  function writeCache(cache) {
27689
27720
  try {
27690
27721
  const file = cachePath();
27691
- fs45.mkdirSync(path57.dirname(file), { recursive: true });
27722
+ fs46.mkdirSync(path57.dirname(file), { recursive: true });
27692
27723
  const tmp = `${file}.${process.pid}.tmp`;
27693
- fs45.writeFileSync(tmp, JSON.stringify(cache));
27694
- fs45.renameSync(tmp, file);
27724
+ fs46.writeFileSync(tmp, JSON.stringify(cache));
27725
+ fs46.renameSync(tmp, file);
27695
27726
  } catch {
27696
27727
  }
27697
27728
  }
@@ -27766,7 +27797,7 @@ function isLinkedInstall() {
27766
27797
  }).trim();
27767
27798
  if (!root) return false;
27768
27799
  const pkgPath = path57.join(root, PKG_NAME);
27769
- return fs45.lstatSync(pkgPath).isSymbolicLink();
27800
+ return fs46.lstatSync(pkgPath).isSymbolicLink();
27770
27801
  } catch {
27771
27802
  return false;
27772
27803
  }
@@ -27802,7 +27833,7 @@ function maybeAutoUpdate(currentVersion, latest) {
27802
27833
  return;
27803
27834
  }
27804
27835
  try {
27805
- fs45.unlinkSync(cachePath());
27836
+ fs46.unlinkSync(cachePath());
27806
27837
  } catch {
27807
27838
  }
27808
27839
  process.stderr.write(` ${import_picocolors16.default.green("\u2713")} Updated. Resuming session...
@@ -27819,7 +27850,7 @@ function checkForUpdates() {
27819
27850
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
27820
27851
  if (process.env.CI) return;
27821
27852
  if (!process.stdout.isTTY) return;
27822
- const current = true ? "2.39.43" : null;
27853
+ const current = true ? "2.39.44" : null;
27823
27854
  if (!current) return;
27824
27855
  const cache = readCache();
27825
27856
  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.39.43",
3
+ "version": "2.39.44",
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",