codeam-cli 2.73.1 → 2.73.3

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,31 @@ 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.73.2] — 2026-09-02
8
+
9
+ ### CI
10
+
11
+ - **release:** Publish the release notes to #changelog and Discussions (#680)
12
+
13
+ ### Fixed
14
+
15
+ - **cli:** An MCP reprovision burst must not kill the session (#682)
16
+
17
+ ## [2.73.1] — 2026-09-02
18
+
19
+ ### Added
20
+
21
+ - **cli:** Env_parse — import a pasted .env instead of typing variables one by one (#675)
22
+ - **cli:** Fleet_migrate_box_image — re-point a sleeping box at :latest (#678)
23
+
24
+ ### Documentation
25
+
26
+ - **shared:** Warn that Trello's "Secret" is not the token (#676)
27
+
28
+ ### Fixed
29
+
30
+ - **cli:** Register a resumed child under its DEPLOY id, not the paired-session id (#679)
31
+
7
32
  ## [2.73.0] — 2026-09-02
8
33
 
9
34
  ### Added
package/dist/index.js CHANGED
@@ -8097,7 +8097,7 @@ function readAnonId() {
8097
8097
  }
8098
8098
  function superProperties() {
8099
8099
  return {
8100
- cliVersion: true ? "2.73.1" : "0.0.0-dev",
8100
+ cliVersion: true ? "2.73.3" : "0.0.0-dev",
8101
8101
  nodeVersion: process.version,
8102
8102
  platform: process.platform,
8103
8103
  arch: process.arch,
@@ -8339,7 +8339,7 @@ var http = __toESM(require("http"));
8339
8339
  // package.json
8340
8340
  var package_default = {
8341
8341
  name: "codeam-cli",
8342
- version: "2.73.1",
8342
+ version: "2.73.3",
8343
8343
  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.",
8344
8344
  type: "commonjs",
8345
8345
  main: "dist/index.js",
@@ -9932,7 +9932,7 @@ var CommandRelayService = class _CommandRelayService {
9932
9932
  // fresh + clear the "CLI update available" banner after a self-update
9933
9933
  // (a codespace that reinstalls @latest reconnects via heartbeat, not
9934
9934
  // pair/reconnect). Older backends ignore the extra field.
9935
- ..."2.73.1" ? { ideVersion: "2.73.1" } : {}
9935
+ ..."2.73.3" ? { ideVersion: "2.73.3" } : {}
9936
9936
  }).then(() => log.trace("relay", `heartbeat ok online=${online}`)).catch((err) => log.trace("relay", `heartbeat failed online=${online}`, err));
9937
9937
  }
9938
9938
  /**
@@ -22208,7 +22208,7 @@ async function autoUpgradeBeforeCriticalCommand() {
22208
22208
  if (process.env.NODE_ENV === "test") return;
22209
22209
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
22210
22210
  if (process.env.CI) return;
22211
- const current2 = true ? "2.73.1" : null;
22211
+ const current2 = true ? "2.73.3" : null;
22212
22212
  if (!current2) return;
22213
22213
  const cache = readCache();
22214
22214
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -22225,7 +22225,7 @@ function checkForUpdates() {
22225
22225
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
22226
22226
  if (process.env.CI) return;
22227
22227
  if (!process.stdout.isTTY) return;
22228
- const current2 = true ? "2.73.1" : null;
22228
+ const current2 = true ? "2.73.3" : null;
22229
22229
  if (!current2) return;
22230
22230
  const cache = readCache();
22231
22231
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -22248,7 +22248,7 @@ var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
22248
22248
  var SELF_UPDATE_LS_TIMEOUT_MS = 15e3;
22249
22249
  var SUDO_PREFLIGHT_TIMEOUT_MS = 5e3;
22250
22250
  function currentCliVersion() {
22251
- return true ? "2.73.1" : null;
22251
+ return true ? "2.73.3" : null;
22252
22252
  }
22253
22253
  async function installedVersion(deps) {
22254
22254
  const ls = await deps.run(
@@ -35684,6 +35684,7 @@ var CLIENT_CAPABILITIES = {
35684
35684
  fs: { readTextFile: true, writeTextFile: true },
35685
35685
  terminal: false
35686
35686
  };
35687
+ var MCP_REPROVISION_DEBOUNCE_MS = 1e4;
35687
35688
  var AcpClient = class {
35688
35689
  constructor(opts) {
35689
35690
  this.opts = opts;
@@ -35747,6 +35748,18 @@ var AcpClient = class {
35747
35748
  * them mid-turn and break turn A's idle watchdog (mobile "send-while-active"
35748
35749
  * can fire two prompts back-to-back). See {@link prompt}. */
35749
35750
  promptChain = Promise.resolve();
35751
+ /**
35752
+ * Coalescing state for {@link reprovisionMcp}. A burst of integration events
35753
+ * (the user linking several connectors in a row) used to fire one respawn per
35754
+ * event, each killing the adapter the previous had just started — see the
35755
+ * comment on that method.
35756
+ */
35757
+ /** True once a start has fully succeeded (handshake + session). Distinguishes
35758
+ * "never started" (a programming error) from "the adapter died" (recoverable). */
35759
+ startedOnce = false;
35760
+ mcpReprovisionPending = null;
35761
+ mcpDebounceTimer = null;
35762
+ mcpDebounceWaiters = [];
35750
35763
  /** Last few adapter stderr lines — so a startup failure surfaces the REAL
35751
35764
  * cause (e.g. gemini's `IneligibleTierError`) instead of a bare timeout. */
35752
35765
  recentStderr = [];
@@ -35938,6 +35951,7 @@ var AcpClient = class {
35938
35951
  }
35939
35952
  this.startAbortReject = null;
35940
35953
  this.sessionId = newSession.sessionId;
35954
+ this.startedOnce = true;
35941
35955
  this.captureModelConfig(newSession.configOptions ?? []);
35942
35956
  this.captureModes(newSession.modes ?? null);
35943
35957
  const tier = nonEmptyString(
@@ -35998,7 +36012,16 @@ var AcpClient = class {
35998
36012
  }
35999
36013
  async runPrompt(input) {
36000
36014
  if (!this.connection || !this.sessionId) {
36001
- throw new Error("AcpClient.prompt called before start()");
36015
+ if (!this.startedOnce) {
36016
+ throw new Error("AcpClient.prompt called before start()");
36017
+ }
36018
+ log.warn("acpClient", "adapter is gone \u2014 restarting it before this turn");
36019
+ this.stopping = false;
36020
+ await this.startOnce();
36021
+ if (!this.connection || !this.sessionId) {
36022
+ throw new Error("AcpClient.prompt: adapter could not be restarted");
36023
+ }
36024
+ log.info("acpClient", "adapter restarted \u2014 resuming the turn");
36002
36025
  }
36003
36026
  await ensureHeadroomProxyReady(makeRealProxySupervisorDeps()).catch(() => void 0);
36004
36027
  const blocks = typeof input === "string" ? [{ type: "text", text: input }] : input;
@@ -36244,6 +36267,37 @@ var AcpClient = class {
36244
36267
  * the caller can tell the user "active now" vs "active on next restart".
36245
36268
  */
36246
36269
  async reprovisionMcp(servers) {
36270
+ this.opts.mcpServers = servers;
36271
+ if (!this.connection || !this.sessionId) return "deferred";
36272
+ this.mcpReprovisionPending = servers;
36273
+ if (this.mcpDebounceTimer) clearTimeout(this.mcpDebounceTimer);
36274
+ const settled = new Promise((resolve11) => {
36275
+ this.mcpDebounceWaiters.push(resolve11);
36276
+ });
36277
+ this.mcpDebounceTimer = setTimeout(() => {
36278
+ this.mcpDebounceTimer = null;
36279
+ const latest = this.mcpReprovisionPending ?? servers;
36280
+ this.mcpReprovisionPending = null;
36281
+ const waiters = this.mcpDebounceWaiters;
36282
+ this.mcpDebounceWaiters = [];
36283
+ const run = this.promptChain.then(() => this.runReprovisionMcp(latest));
36284
+ this.promptChain = run.then(
36285
+ () => void 0,
36286
+ () => void 0
36287
+ );
36288
+ run.then(
36289
+ (result) => waiters.forEach((w3) => w3(result)),
36290
+ // `runReprovisionMcp` already swallows its own failures into
36291
+ // 'deferred'; this is the belt for anything the chain itself throws.
36292
+ () => waiters.forEach((w3) => w3("deferred"))
36293
+ );
36294
+ }, this.opts.mcpReprovisionDebounceMs ?? MCP_REPROVISION_DEBOUNCE_MS);
36295
+ this.mcpDebounceTimer.unref?.();
36296
+ return settled;
36297
+ }
36298
+ /** The actual respawn. Only ever called from {@link reprovisionMcp}'s queued
36299
+ * slot, so it can assume no turn and no other respawn is running. */
36300
+ async runReprovisionMcp(servers) {
36247
36301
  this.opts.mcpServers = servers;
36248
36302
  const prevConversationId = this.sessionId;
36249
36303
  if (!this.connection || !prevConversationId) return "deferred";
@@ -36439,6 +36493,14 @@ var AcpClient = class {
36439
36493
  */
36440
36494
  async stop() {
36441
36495
  this.stopping = true;
36496
+ if (this.mcpDebounceTimer) {
36497
+ clearTimeout(this.mcpDebounceTimer);
36498
+ this.mcpDebounceTimer = null;
36499
+ this.mcpReprovisionPending = null;
36500
+ const waiters = this.mcpDebounceWaiters;
36501
+ this.mcpDebounceWaiters = [];
36502
+ waiters.forEach((w3) => w3("deferred"));
36503
+ }
36442
36504
  const child = this.child;
36443
36505
  if (!child) return;
36444
36506
  this.child = null;
@@ -47024,7 +47086,7 @@ function checkChokidar() {
47024
47086
  }
47025
47087
  async function doctor(args2 = []) {
47026
47088
  const json = args2.includes("--json");
47027
- const cliVersion = true ? "2.73.1" : "0.0.0-dev";
47089
+ const cliVersion = true ? "2.73.3" : "0.0.0-dev";
47028
47090
  const apiBase2 = resolveApiBaseUrl();
47029
47091
  const diagnosticId = (0, import_node_crypto13.randomUUID)();
47030
47092
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -47415,7 +47477,7 @@ async function mcpRun(args2) {
47415
47477
  // src/commands/version.ts
47416
47478
  var import_picocolors15 = __toESM(require("picocolors"));
47417
47479
  function version2() {
47418
- const v = true ? "2.73.1" : "unknown";
47480
+ const v = true ? "2.73.3" : "unknown";
47419
47481
  console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
47420
47482
  }
47421
47483
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeam-cli",
3
- "version": "2.73.1",
3
+ "version": "2.73.3",
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",