codeam-cli 2.75.27 → 2.75.28

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.75.27] — 2026-09-25
8
+
9
+ ### Fixed
10
+
11
+ - **cli:** On-demand Box session resume, link reporting, per-boot logs, MCP secrets off argv (#818)
12
+
7
13
  ## [2.75.26] — 2026-09-25
8
14
 
9
15
  ### Added
package/dist/index.js CHANGED
@@ -10516,7 +10516,7 @@ function readAnonId() {
10516
10516
  }
10517
10517
  function superProperties() {
10518
10518
  return {
10519
- cliVersion: true ? "2.75.27" : "0.0.0-dev",
10519
+ cliVersion: true ? "2.75.28" : "0.0.0-dev",
10520
10520
  nodeVersion: process.version,
10521
10521
  platform: process.platform,
10522
10522
  arch: process.arch,
@@ -10758,7 +10758,7 @@ var http = __toESM(require("http"));
10758
10758
  // package.json
10759
10759
  var package_default = {
10760
10760
  name: "codeam-cli",
10761
- version: "2.75.27",
10761
+ version: "2.75.28",
10762
10762
  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.",
10763
10763
  type: "commonjs",
10764
10764
  main: "dist/index.js",
@@ -12088,7 +12088,7 @@ var CommandRelayService = class _CommandRelayService {
12088
12088
  // fresh + clear the "CLI update available" banner after a self-update
12089
12089
  // (a codespace that reinstalls @latest reconnects via heartbeat, not
12090
12090
  // pair/reconnect). Older backends ignore the extra field.
12091
- ..."2.75.27" ? { ideVersion: "2.75.27" } : {}
12091
+ ..."2.75.28" ? { ideVersion: "2.75.28" } : {}
12092
12092
  };
12093
12093
  try {
12094
12094
  const res = await _postJson(`${API_BASE2}/api/plugin/heartbeat`, body);
@@ -24868,9 +24868,10 @@ async function bringUpInspector(targetPort, deps = {}) {
24868
24868
  const start2 = deps.start ?? startInspectorProxy;
24869
24869
  const proxy = await start2({
24870
24870
  targetPort,
24871
+ ...deps.targetHost ? { targetHost: deps.targetHost } : {},
24871
24872
  script: inspectorClientSource({ allowedOrigins: resolveInspectorOrigins(env) })
24872
24873
  });
24873
- log2(`preview inspector proxy on :${proxy.port} \u2192 :${targetPort}`);
24874
+ log2(`preview inspector proxy on :${proxy.port} \u2192 ${deps.targetHost ?? "127.0.0.1"}:${targetPort}`);
24874
24875
  return { port: proxy.port, proxy };
24875
24876
  } catch (e) {
24876
24877
  log2(`preview inspector unavailable (${e.message}) \u2014 going direct`);
@@ -24878,6 +24879,30 @@ async function bringUpInspector(targetPort, deps = {}) {
24878
24879
  }
24879
24880
  }
24880
24881
 
24882
+ // src/services/preview/served-address.ts
24883
+ var LOOPBACK_HOSTS = ["127.0.0.1", "::1"];
24884
+ var ANSI_RE2 = /\x1b\[[0-9;]*m/g;
24885
+ var LOCAL_URL_RE = /https?:\/\/(?:localhost|127\.0\.0\.1|0\.0\.0\.0|\[::1?\]|\[::\]):(\d{2,5})\b/gi;
24886
+ function announcedPorts(output) {
24887
+ const clean = output.replace(ANSI_RE2, "");
24888
+ const ports = [];
24889
+ for (const m of clean.matchAll(LOCAL_URL_RE)) {
24890
+ const port = Number(m[1]);
24891
+ if (port > 0 && port < 65536) ports.push(port);
24892
+ }
24893
+ return [...new Set(ports.reverse())];
24894
+ }
24895
+ async function resolveServedAddress(output, detectedPort, deps = {}) {
24896
+ const listening = deps.listening ?? isPortListening;
24897
+ const candidates = [.../* @__PURE__ */ new Set([...announcedPorts(output), detectedPort])];
24898
+ for (const port of candidates) {
24899
+ for (const host2 of LOOPBACK_HOSTS) {
24900
+ if (await listening(port, host2)) return { host: host2, port };
24901
+ }
24902
+ }
24903
+ return { host: "127.0.0.1", port: detectedPort };
24904
+ }
24905
+
24881
24906
  // src/services/preview/start-orchestrator.ts
24882
24907
  var INSTALL_TIMEOUT_MS2 = 5 * 6e4;
24883
24908
  var SETUP_TIMEOUT_MS = 2 * 6e4;
@@ -25186,7 +25211,10 @@ async function startDevServer(ctx, extraEnv = {}) {
25186
25211
  if (verdict.adopt) {
25187
25212
  log.info("preview", `adopting the dev server already serving on port ${detection.port}`);
25188
25213
  emitProgress("READY_DETECTED", `adopted the server already on port ${detection.port}`);
25189
- return { devServer: null };
25214
+ return {
25215
+ devServer: null,
25216
+ served: await resolveServedAddress("", detection.port)
25217
+ };
25190
25218
  }
25191
25219
  emit2(USER_EVENTS.PREVIEW_ERROR, {
25192
25220
  stage: "spawn",
@@ -25249,15 +25277,23 @@ async function startDevServer(ctx, extraEnv = {}) {
25249
25277
  });
25250
25278
  return null;
25251
25279
  }
25252
- emitProgress("READY_DETECTED", `port ${detection.port}`);
25253
- return { devServer };
25280
+ const served = await resolveServedAddress(outputTail, detection.port);
25281
+ if (served.port !== detection.port || served.host !== "127.0.0.1") {
25282
+ log.info(
25283
+ "preview",
25284
+ `dev server serves on ${served.host}:${served.port} (detection said :${detection.port})`
25285
+ );
25286
+ }
25287
+ emitProgress("READY_DETECTED", `port ${served.port}`);
25288
+ return { devServer, served };
25254
25289
  }
25255
25290
  var MAX_TUNNEL_ATTEMPTS = 3;
25256
25291
  async function establishTunnel(ctx, dev) {
25257
25292
  const { detection, emit: emit2, emitProgress } = ctx;
25258
25293
  const { devServer } = dev;
25259
25294
  emitProgress("TUNNEL_STARTING", "cloudflared quick tunnel");
25260
- const inspection = await bringUpInspector(detection.port, {
25295
+ const inspection = await bringUpInspector(dev.served.port, {
25296
+ targetHost: dev.served.host,
25261
25297
  log: (m) => log.info("preview", m)
25262
25298
  });
25263
25299
  const pub = await bringUpPublicUrl(ctx, inspection.port);
@@ -48578,7 +48614,7 @@ async function autoUpgradeBeforeCriticalCommand() {
48578
48614
  if (process.env.NODE_ENV === "test") return;
48579
48615
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
48580
48616
  if (process.env.CI) return;
48581
- const current2 = true ? "2.75.27" : null;
48617
+ const current2 = true ? "2.75.28" : null;
48582
48618
  if (!current2) return;
48583
48619
  const cache = readCache();
48584
48620
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -48595,7 +48631,7 @@ function checkForUpdates() {
48595
48631
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
48596
48632
  if (process.env.CI) return;
48597
48633
  if (!process.stdout.isTTY) return;
48598
- const current2 = true ? "2.75.27" : null;
48634
+ const current2 = true ? "2.75.28" : null;
48599
48635
  if (!current2) return;
48600
48636
  const cache = readCache();
48601
48637
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -48618,7 +48654,7 @@ var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
48618
48654
  var SELF_UPDATE_LS_TIMEOUT_MS = 15e3;
48619
48655
  var SUDO_PREFLIGHT_TIMEOUT_MS = 5e3;
48620
48656
  function currentCliVersion() {
48621
- return true ? "2.75.27" : null;
48657
+ return true ? "2.75.28" : null;
48622
48658
  }
48623
48659
  async function installedVersion(deps) {
48624
48660
  const ls = await deps.run(
@@ -50583,7 +50619,7 @@ function checkChokidar() {
50583
50619
  }
50584
50620
  async function doctor(args2 = []) {
50585
50621
  const json = args2.includes("--json");
50586
- const cliVersion = true ? "2.75.27" : "0.0.0-dev";
50622
+ const cliVersion = true ? "2.75.28" : "0.0.0-dev";
50587
50623
  const apiBase2 = resolveApiBaseUrl();
50588
50624
  const diagnosticId = (0, import_node_crypto13.randomUUID)();
50589
50625
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -51107,7 +51143,7 @@ async function mcpWarm(argv = [], opts = {}) {
51107
51143
  // src/commands/version.ts
51108
51144
  var import_picocolors15 = __toESM(require("picocolors"));
51109
51145
  function version2() {
51110
- const v = true ? "2.75.27" : "unknown";
51146
+ const v = true ? "2.75.28" : "unknown";
51111
51147
  console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
51112
51148
  }
51113
51149
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeam-cli",
3
- "version": "2.75.27",
3
+ "version": "2.75.28",
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",
@@ -1,33 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
-
4
- // src/postinstall.ts
5
- var c = {
6
- reset: "\x1B[0m",
7
- bold: "\x1B[1m",
8
- dim: "\x1B[2m",
9
- green: "\x1B[32m",
10
- cyan: "\x1B[36m",
11
- violet: "\x1B[35m",
12
- white: "\x1B[97m"
13
- };
14
- var lines = [
15
- "",
16
- ` ${c.violet}${c.bold}codeam-cli${c.reset} ${c.dim}\u2014 Claude Code remote control${c.reset}`,
17
- "",
18
- ` ${c.dim}1.${c.reset} Pair your phone:`,
19
- ` ${c.cyan}codeam pair${c.reset}`,
20
- "",
21
- ` ${c.dim}2.${c.reset} Launch Claude Code with mobile control:`,
22
- ` ${c.cyan}codeam${c.reset}`,
23
- "",
24
- ` ${c.dim}Other commands:${c.reset}`,
25
- ` ${c.white}codeam sessions${c.reset} ${c.dim}list paired devices${c.reset}`,
26
- ` ${c.white}codeam status${c.reset} ${c.dim}show connection info${c.reset}`,
27
- ` ${c.white}codeam logout${c.reset} ${c.dim}remove all sessions${c.reset}`,
28
- "",
29
- ` ${c.dim}Requires Claude Code:${c.reset} ${c.green}npm install -g @anthropic-ai/claude-code${c.reset}`,
30
- ` ${c.dim}Mobile app:${c.reset} ${c.green}https://www.codeagent-mobile.com${c.reset}`,
31
- ""
32
- ];
33
- process.stdout.write(lines.join("\n") + "\n");