codeam-cli 2.27.9 → 2.27.10

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.27.9] — 2026-06-06
8
+
9
+ ### Fixed
10
+
11
+ - **cli:** ACP publishes to /api/commands/output (mobile's chat pipe)
12
+
7
13
  ## [2.27.8] — 2026-06-06
8
14
 
9
15
  ### Fixed
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.27.9",
501
+ version: "2.27.10",
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",
@@ -5873,7 +5873,7 @@ function readAnonId() {
5873
5873
  }
5874
5874
  function superProperties() {
5875
5875
  return {
5876
- cliVersion: true ? "2.27.9" : "0.0.0-dev",
5876
+ cliVersion: true ? "2.27.10" : "0.0.0-dev",
5877
5877
  nodeVersion: process.version,
5878
5878
  platform: process.platform,
5879
5879
  arch: process.arch,
@@ -12127,7 +12127,11 @@ var AcpClient = class {
12127
12127
  mcpServers: []
12128
12128
  });
12129
12129
  this.sessionId = newSession.sessionId;
12130
- log.info("acpClient", `newSession \u2190 ok sessionId=${newSession.sessionId.slice(0, 8)}`);
12130
+ const newSessionMeta = newSession;
12131
+ log.info(
12132
+ "acpClient",
12133
+ `newSession \u2190 ok sessionId=${newSession.sessionId.slice(0, 8)} model=${newSessionMeta.currentModelId ?? "?"} tier=${newSessionMeta.currentServiceTier ?? "?"}`
12134
+ );
12131
12135
  return { sessionId: newSession.sessionId, initialize };
12132
12136
  }
12133
12137
  /**
@@ -12154,15 +12158,15 @@ var AcpClient = class {
12154
12158
  sessionId: this.sessionId,
12155
12159
  prompt: [{ type: "text", text }]
12156
12160
  });
12161
+ let timeoutId;
12157
12162
  const timeout = new Promise((_resolve, reject) => {
12158
- const id = setTimeout(() => {
12163
+ timeoutId = setTimeout(() => {
12159
12164
  reject(
12160
12165
  new Error(
12161
12166
  `ACP prompt timed out after ${PROMPT_TIMEOUT_MS / 1e3}s \u2014 adapter never responded. Likely the underlying agent's auth or network is misconfigured; check the adapter stderr lines above (acpAdapter tag) for the actual error.`
12162
12167
  )
12163
12168
  );
12164
12169
  }, PROMPT_TIMEOUT_MS);
12165
- void send.finally(() => clearTimeout(id));
12166
12170
  });
12167
12171
  try {
12168
12172
  const result = await Promise.race([send, timeout]);
@@ -12177,6 +12181,8 @@ var AcpClient = class {
12177
12181
  `prompt \u2190 failed elapsedMs=${Date.now() - t0} err=${err instanceof Error ? err.message : String(err)}`
12178
12182
  );
12179
12183
  throw err;
12184
+ } finally {
12185
+ if (timeoutId !== void 0) clearTimeout(timeoutId);
12180
12186
  }
12181
12187
  }
12182
12188
  /**
@@ -12620,56 +12626,31 @@ var StreamingState = class {
12620
12626
  this.publisher = publisher;
12621
12627
  }
12622
12628
  publisher;
12623
- open = /* @__PURE__ */ new Map();
12629
+ text = "";
12624
12630
  /**
12625
12631
  * Boundary events emitted at the start of every turn so mobile
12626
12632
  * wipes the previous reply and shows "Agent is typing…". Mirrors
12627
- * the legacy `outputSvc.newTurn()` — `critical: true` on those
12628
- * sends is implicit here (publishOutput retries on transient
12629
- * failures so the boundary always lands).
12633
+ * the legacy `outputSvc.newTurn()`.
12630
12634
  */
12631
12635
  async beginTurn() {
12632
- this.open.clear();
12636
+ this.text = "";
12633
12637
  await this.publisher.publishOutput({ type: "clear" });
12634
12638
  await this.publisher.publishOutput({ type: "new_turn", done: false });
12635
12639
  }
12636
12640
  append(delta) {
12637
- const existing = this.open.get(delta.chunkId);
12638
- const content = (existing?.content ?? "") + delta.delta;
12639
- if (existing && existing.kind !== delta.kind) {
12640
- log.warn(
12641
- "acpRunner",
12642
- `chunk kind flip detected chunkId=${delta.chunkId.slice(0, 8)} from=${existing.kind} to=${delta.kind} \u2014 using new kind`
12643
- );
12644
- }
12645
- this.open.set(delta.chunkId, { kind: delta.kind, content });
12646
- void this.publisher.publishOutput({ type: "text", content, done: false });
12641
+ if (delta.kind !== "text") return;
12642
+ this.text += delta.delta;
12643
+ void this.publisher.publishOutput({ type: "text", content: this.text, done: false });
12647
12644
  }
12648
12645
  /**
12649
- * Flush every open buffer with `done: true` so mobile flips out
12650
- * of "Thinking…". Idempotent — safe to call multiple times per
12651
- * turn (prompt-completed, cancel, adapter-exit).
12652
- *
12653
- * Also emits an empty `{type:'text', content:'', done:true}` when
12654
- * the turn produced no text at all (e.g. Claude responded with
12655
- * tool calls only) so mobile doesn't sit on "Thinking…" forever
12656
- * waiting for content that will never arrive.
12646
+ * Flip the chat out of "Thinking…" with one final cumulative
12647
+ * `done: true`. Idempotent — safe to call from happy + error +
12648
+ * adapter-exit paths.
12657
12649
  */
12658
12650
  async closeAll() {
12659
- if (this.open.size === 0) {
12660
- await this.publisher.publishOutput({ type: "text", content: "", done: true });
12661
- return;
12662
- }
12663
- const closing = Array.from(this.open.values());
12664
- this.open.clear();
12665
- for (let i = 0; i < closing.length; i += 1) {
12666
- const isLast = i === closing.length - 1;
12667
- await this.publisher.publishOutput({
12668
- type: "text",
12669
- content: closing[i].content,
12670
- done: isLast
12671
- });
12672
- }
12651
+ const finalText = this.text;
12652
+ this.text = "";
12653
+ await this.publisher.publishOutput({ type: "text", content: finalText, done: true });
12673
12654
  }
12674
12655
  };
12675
12656
  var ANSWER_POLL_MS = 1500;
@@ -21297,7 +21278,7 @@ function checkChokidar() {
21297
21278
  }
21298
21279
  async function doctor(args2 = []) {
21299
21280
  const json = args2.includes("--json");
21300
- const cliVersion = true ? "2.27.9" : "0.0.0-dev";
21281
+ const cliVersion = true ? "2.27.10" : "0.0.0-dev";
21301
21282
  const apiBase = resolveApiBaseUrl();
21302
21283
  const diagnosticId = (0, import_node_crypto7.randomUUID)();
21303
21284
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -21496,7 +21477,7 @@ async function completion(args2) {
21496
21477
  // src/commands/version.ts
21497
21478
  var import_picocolors13 = __toESM(require("picocolors"));
21498
21479
  function version2() {
21499
- const v = true ? "2.27.9" : "unknown";
21480
+ const v = true ? "2.27.10" : "unknown";
21500
21481
  console.log(`${import_picocolors13.default.bold("codeam-cli")} ${import_picocolors13.default.cyan(v)}`);
21501
21482
  }
21502
21483
 
@@ -21724,7 +21705,7 @@ function checkForUpdates() {
21724
21705
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
21725
21706
  if (process.env.CI) return;
21726
21707
  if (!process.stdout.isTTY) return;
21727
- const current = true ? "2.27.9" : null;
21708
+ const current = true ? "2.27.10" : null;
21728
21709
  if (!current) return;
21729
21710
  const cache = readCache();
21730
21711
  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.27.9",
3
+ "version": "2.27.10",
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",