codeam-cli 2.75.30 → 2.75.32

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,18 @@ 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.31] — 2026-09-26
8
+
9
+ ### Fixed
10
+
11
+ - **cli:** Prewarm installs yarn projects' deps at session start too (#826)
12
+
13
+ ## [2.75.30] — 2026-09-25
14
+
15
+ ### Fixed
16
+
17
+ - **cli:** Preview error log tail without terminal escape codes (#823)
18
+
7
19
  ## [2.75.29] — 2026-09-25
8
20
 
9
21
  ### Fixed
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.30" : "0.0.0-dev",
10519
+ cliVersion: true ? "2.75.32" : "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.30",
10761
+ version: "2.75.32",
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.30" ? { ideVersion: "2.75.30" } : {}
12091
+ ..."2.75.32" ? { ideVersion: "2.75.32" } : {}
12092
12092
  };
12093
12093
  try {
12094
12094
  const res = await _postJson(`${API_BASE2}/api/plugin/heartbeat`, body);
@@ -21910,8 +21910,12 @@ function makePreviewHeartbeatReaffirm(deps) {
21910
21910
  const now = deps.now ?? Date.now;
21911
21911
  const intervalMs = deps.intervalMs ?? PREVIEW_REAFFIRM_INTERVAL_MS;
21912
21912
  let lastAffirmedAt = null;
21913
+ let firstBeat = true;
21913
21914
  return ({ firstAfterConnect }) => {
21914
21915
  const current2 = deps.serving();
21916
+ const isFirstBeat = firstBeat;
21917
+ firstBeat = false;
21918
+ if (!current2 && isFirstBeat) deps.clearStale?.();
21915
21919
  if (!current2) {
21916
21920
  lastAffirmedAt = null;
21917
21921
  return;
@@ -23925,19 +23929,36 @@ function listScriptCandidates(root) {
23925
23929
  }
23926
23930
 
23927
23931
  // src/services/preview/prewarm-deps.ts
23932
+ var import_which2 = __toESM(require("which"));
23928
23933
  var inFlight = null;
23929
23934
  var PREWARM_INSTALL_TIMEOUT_MS = 5 * 6e4;
23930
23935
  function prewarmNodeDeps(cwd) {
23931
23936
  if (inFlight) return inFlight;
23932
23937
  const missing = detectMissingNodeDeps(cwd);
23933
- if (!missing || missing.cmd !== "npm") return Promise.resolve();
23938
+ if (!missing) return Promise.resolve();
23934
23939
  log.info("preview", `prewarm: installing deps (${missing.cmd} ${missing.args.join(" ")})`);
23935
23940
  const started = Date.now();
23936
- inFlight = runSetupCommand(missing.cmd, missing.args, cwd, void 0, {
23937
- timeoutMs: PREWARM_INSTALL_TIMEOUT_MS
23938
- }).then((r) => {
23941
+ inFlight = (async () => {
23942
+ if (missing.cmd === "yarn") {
23943
+ const ensured = await ensureYarnInstalled({
23944
+ hasYarn: async () => Boolean(await (0, import_which2.default)("yarn", { nothrow: true })),
23945
+ installYarn: async () => {
23946
+ const r2 = await runSetupCommand("npm", ["install", "-g", "yarn"], cwd, void 0, {
23947
+ timeoutMs: PREWARM_INSTALL_TIMEOUT_MS
23948
+ });
23949
+ return { ok: r2.status === "ok", code: r2.code };
23950
+ }
23951
+ });
23952
+ if (!ensured.ok) {
23953
+ log.info("preview", `prewarm: yarn unavailable (exit ${ensured.code}) \u2014 Preview will retry`);
23954
+ return;
23955
+ }
23956
+ }
23957
+ const r = await runSetupCommand(missing.cmd, missing.args, cwd, void 0, {
23958
+ timeoutMs: PREWARM_INSTALL_TIMEOUT_MS
23959
+ });
23939
23960
  log.info("preview", `prewarm: deps ${r.status} after ${Date.now() - started}ms`);
23940
- }).catch((err) => {
23961
+ })().catch((err) => {
23941
23962
  log.info("preview", `prewarm: deps install threw (${String(err)})`);
23942
23963
  }).finally(() => {
23943
23964
  inFlight = null;
@@ -24086,7 +24107,7 @@ function activePreviewSessionIds() {
24086
24107
  var import_child_process20 = require("child_process");
24087
24108
  var fs43 = __toESM(require("fs"));
24088
24109
  var path51 = __toESM(require("path"));
24089
- var import_which2 = __toESM(require("which"));
24110
+ var import_which3 = __toESM(require("which"));
24090
24111
 
24091
24112
  // src/services/project-env/index.ts
24092
24113
  var import_fs6 = require("fs");
@@ -25102,7 +25123,7 @@ async function provisionDeps(ctx) {
25102
25123
  if (missingDeps) {
25103
25124
  if (missingDeps.cmd === "yarn") {
25104
25125
  const ensured = await ensureYarnInstalled({
25105
- hasYarn: async () => Boolean(await (0, import_which2.default)("yarn", { nothrow: true })),
25126
+ hasYarn: async () => Boolean(await (0, import_which3.default)("yarn", { nothrow: true })),
25106
25127
  installYarn: async () => {
25107
25128
  emitProgress("SETUP_RUN", "installing yarn (not found on PATH) \u2014 npm install -g yarn");
25108
25129
  const r = await runSetupCommand(
@@ -28047,7 +28068,9 @@ ${failure?.rawExcerpt ?? ""}`
28047
28068
  });
28048
28069
  return detection;
28049
28070
  }
28071
+ var previewRequestedInProcess = false;
28050
28072
  var requestPreviewDetectH = (ctx) => {
28073
+ previewRequestedInProcess = true;
28051
28074
  if (!ctx.pluginAuthToken) {
28052
28075
  log.info("preview", "no pluginAuthToken \u2014 skipping detect");
28053
28076
  return;
@@ -28097,6 +28120,16 @@ function makePreviewReaffirm(args2) {
28097
28120
  type: USER_EVENTS.PREVIEW_READY,
28098
28121
  payload
28099
28122
  });
28123
+ },
28124
+ clearStale: () => {
28125
+ if (previewRequestedInProcess) return;
28126
+ emitPreviewEvent({
28127
+ sessionId,
28128
+ pluginId: args2.pluginId,
28129
+ pluginAuthToken: token,
28130
+ type: USER_EVENTS.PREVIEW_STOPPED,
28131
+ payload: { reason: "restart" }
28132
+ });
28100
28133
  }
28101
28134
  });
28102
28135
  }
@@ -28141,6 +28174,7 @@ var previewStartH = (ctx, _cmd, parsed) => {
28141
28174
  void startPreviewFromDetection(ctx, rawDetection, ctx.pluginAuthToken);
28142
28175
  };
28143
28176
  function startPreviewFromDetection(ctx, detection, pluginAuthToken, opts = {}) {
28177
+ previewRequestedInProcess = true;
28144
28178
  const emit2 = (type, payload) => {
28145
28179
  const tagged = originPayload(payload, opts.origin) ?? {};
28146
28180
  opts.onEvent?.(type, tagged);
@@ -48640,7 +48674,7 @@ async function autoUpgradeBeforeCriticalCommand() {
48640
48674
  if (process.env.NODE_ENV === "test") return;
48641
48675
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
48642
48676
  if (process.env.CI) return;
48643
- const current2 = true ? "2.75.30" : null;
48677
+ const current2 = true ? "2.75.32" : null;
48644
48678
  if (!current2) return;
48645
48679
  const cache = readCache();
48646
48680
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -48657,7 +48691,7 @@ function checkForUpdates() {
48657
48691
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
48658
48692
  if (process.env.CI) return;
48659
48693
  if (!process.stdout.isTTY) return;
48660
- const current2 = true ? "2.75.30" : null;
48694
+ const current2 = true ? "2.75.32" : null;
48661
48695
  if (!current2) return;
48662
48696
  const cache = readCache();
48663
48697
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -48680,7 +48714,7 @@ var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
48680
48714
  var SELF_UPDATE_LS_TIMEOUT_MS = 15e3;
48681
48715
  var SUDO_PREFLIGHT_TIMEOUT_MS = 5e3;
48682
48716
  function currentCliVersion() {
48683
- return true ? "2.75.30" : null;
48717
+ return true ? "2.75.32" : null;
48684
48718
  }
48685
48719
  async function installedVersion(deps) {
48686
48720
  const ls = await deps.run(
@@ -50645,7 +50679,7 @@ function checkChokidar() {
50645
50679
  }
50646
50680
  async function doctor(args2 = []) {
50647
50681
  const json = args2.includes("--json");
50648
- const cliVersion = true ? "2.75.30" : "0.0.0-dev";
50682
+ const cliVersion = true ? "2.75.32" : "0.0.0-dev";
50649
50683
  const apiBase2 = resolveApiBaseUrl();
50650
50684
  const diagnosticId = (0, import_node_crypto13.randomUUID)();
50651
50685
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -51169,7 +51203,7 @@ async function mcpWarm(argv = [], opts = {}) {
51169
51203
  // src/commands/version.ts
51170
51204
  var import_picocolors15 = __toESM(require("picocolors"));
51171
51205
  function version2() {
51172
- const v = true ? "2.75.30" : "unknown";
51206
+ const v = true ? "2.75.32" : "unknown";
51173
51207
  console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
51174
51208
  }
51175
51209
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeam-cli",
3
- "version": "2.75.30",
3
+ "version": "2.75.32",
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",