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 +6 -0
- package/dist/index.js +44 -10
- package/package.json +1 -1
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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",
|