codeam-cli 2.39.32 → 2.39.33

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.32] — 2026-06-18
8
+
9
+ ### Fixed
10
+
11
+ - **cli:** Host-agent deploy clones private repos + reports progress, no silent hang
12
+
7
13
  ## [2.39.31] — 2026-06-18
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.39.32",
501
+ version: "2.39.33",
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.32" : "0.0.0-dev",
5911
+ cliVersion: true ? "2.39.33" : "0.0.0-dev",
5912
5912
  nodeVersion: process.version,
5913
5913
  platform: process.platform,
5914
5914
  arch: process.arch,
@@ -14705,6 +14705,14 @@ function buildAcpPromptBlocks(payload) {
14705
14705
  return blocks;
14706
14706
  }
14707
14707
 
14708
+ // src/agents/acp/reconcileDelta.ts
14709
+ function reconcileCumulative(existing, incoming) {
14710
+ if (incoming.length === 0) return existing;
14711
+ if (incoming.startsWith(existing)) return incoming;
14712
+ if (existing.startsWith(incoming)) return existing;
14713
+ return existing + incoming;
14714
+ }
14715
+
14708
14716
  // src/agents/acp/onboarding.ts
14709
14717
  var fs22 = __toESM(require("fs"));
14710
14718
  var os23 = __toESM(require("os"));
@@ -20639,6 +20647,18 @@ var StreamingState = class {
20639
20647
  this.publisher = publisher;
20640
20648
  }
20641
20649
  publisher;
20650
+ /**
20651
+ * Cumulative agent reply for the in-progress turn — the body of the
20652
+ * chat bubble (`/api/commands/output` text events). DERIVED from the
20653
+ * per-chunkId text buffers in {@link streamingChunks} via
20654
+ * {@link recomputeText} on every `append`, NOT accumulated with a
20655
+ * blind `+=`. That derivation is what makes the chat pipe correct for
20656
+ * adapters that send cumulative snapshots (a self-hosted MiniMax proxy
20657
+ * behind claude-agent-acp) as well as true-delta adapters (Anthropic
20658
+ * Claude): `reconcileCumulative` collapses a re-sent snapshot instead
20659
+ * of concatenating the reply with itself (the "…hoy?¡Hola!…hoy?"
20660
+ * intra-reply duplication bug).
20661
+ */
20642
20662
  text = "";
20643
20663
  pending = null;
20644
20664
  /**
@@ -20754,19 +20774,19 @@ var StreamingState = class {
20754
20774
  await this.publisher.publishOutput({ type: "new_turn", done: false });
20755
20775
  }
20756
20776
  append(delta) {
20757
- if (delta.kind === "text") {
20758
- this.text += delta.delta;
20759
- void this.publisher.publishOutput({ type: "text", content: this.text, done: false });
20760
- }
20761
20777
  const existing = this.streamingChunks.get(delta.chunkId);
20762
- const cumulativeContent = (existing?.content ?? "") + delta.delta;
20763
20778
  if (existing && existing.kind !== delta.kind) {
20764
20779
  log.warn(
20765
20780
  "acpRunner",
20766
20781
  `streaming-chunk kind flip chunkId=${delta.chunkId.slice(0, 8)} from=${existing.kind} to=${delta.kind}`
20767
20782
  );
20768
20783
  }
20784
+ const cumulativeContent = reconcileCumulative(existing?.content ?? "", delta.delta);
20769
20785
  this.streamingChunks.set(delta.chunkId, { kind: delta.kind, content: cumulativeContent });
20786
+ if (delta.kind === "text") {
20787
+ this.recomputeText();
20788
+ void this.publisher.publishOutput({ type: "text", content: this.text, done: false });
20789
+ }
20770
20790
  void this.publisher.publishStreamingChunk({
20771
20791
  chunkId: delta.chunkId,
20772
20792
  kind: delta.kind,
@@ -20774,6 +20794,20 @@ var StreamingState = class {
20774
20794
  isFinal: false
20775
20795
  });
20776
20796
  }
20797
+ /**
20798
+ * Rebuild the cumulative chat-bubble text from the per-chunkId text
20799
+ * buffers, in arrival order (Map preserves insertion order). Source
20800
+ * of truth for the `text` field — never accumulated incrementally, so
20801
+ * a re-sent snapshot updates its own chunk in place rather than
20802
+ * lengthening the reply.
20803
+ */
20804
+ recomputeText() {
20805
+ let next = "";
20806
+ for (const { kind, content } of this.streamingChunks.values()) {
20807
+ if (kind === "text") next += content;
20808
+ }
20809
+ this.text = next;
20810
+ }
20777
20811
  /**
20778
20812
  * Flip the chat out of "Thinking…" with one final cumulative
20779
20813
  * `done: true`. Idempotent — safe to call from happy + error +
@@ -27113,7 +27147,7 @@ function checkChokidar() {
27113
27147
  }
27114
27148
  async function doctor(args2 = []) {
27115
27149
  const json = args2.includes("--json");
27116
- const cliVersion = true ? "2.39.32" : "0.0.0-dev";
27150
+ const cliVersion = true ? "2.39.33" : "0.0.0-dev";
27117
27151
  const apiBase2 = resolveApiBaseUrl();
27118
27152
  const diagnosticId = (0, import_node_crypto8.randomUUID)();
27119
27153
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -27312,7 +27346,7 @@ async function completion(args2) {
27312
27346
  // src/commands/version.ts
27313
27347
  var import_picocolors13 = __toESM(require("picocolors"));
27314
27348
  function version2() {
27315
- const v = true ? "2.39.32" : "unknown";
27349
+ const v = true ? "2.39.33" : "unknown";
27316
27350
  console.log(`${import_picocolors13.default.bold("codeam-cli")} ${import_picocolors13.default.cyan(v)}`);
27317
27351
  }
27318
27352
 
@@ -27598,7 +27632,7 @@ function checkForUpdates() {
27598
27632
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
27599
27633
  if (process.env.CI) return;
27600
27634
  if (!process.stdout.isTTY) return;
27601
- const current = true ? "2.39.32" : null;
27635
+ const current = true ? "2.39.33" : null;
27602
27636
  if (!current) return;
27603
27637
  const cache = readCache();
27604
27638
  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.32",
3
+ "version": "2.39.33",
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",