codeam-cli 2.39.79 → 2.39.81
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 +26 -0
- package/dist/index.js +40 -14
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,32 @@ 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.80] — 2026-06-22
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **cli:** Report Headroom's authoritative compression savings (not prompt-cache)
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
|
|
15
|
+
- **cli:** Always publish a visible terminal frame on a failed turn (no more silent first message)
|
|
16
|
+
|
|
17
|
+
## [2.39.79] — 2026-06-22
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
|
|
21
|
+
- **cli:** Report Headroom's authoritative compression savings (not prompt-cache)
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
|
|
25
|
+
- **cli:** Keep Headroom savings reporting on a low-disk box that's already installed
|
|
26
|
+
|
|
27
|
+
## [2.39.78] — 2026-06-21
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
|
|
31
|
+
- **cli:** Keep Headroom savings reporting on a low-disk box that's already installed
|
|
32
|
+
|
|
7
33
|
## [2.39.77] — 2026-06-21
|
|
8
34
|
|
|
9
35
|
### Added
|
package/dist/index.js
CHANGED
|
@@ -5390,7 +5390,7 @@ function readAnonId() {
|
|
|
5390
5390
|
}
|
|
5391
5391
|
function superProperties() {
|
|
5392
5392
|
return {
|
|
5393
|
-
cliVersion: true ? "2.39.
|
|
5393
|
+
cliVersion: true ? "2.39.81" : "0.0.0-dev",
|
|
5394
5394
|
nodeVersion: process.version,
|
|
5395
5395
|
platform: process.platform,
|
|
5396
5396
|
arch: process.arch,
|
|
@@ -5549,7 +5549,7 @@ var os4 = __toESM(require("os"));
|
|
|
5549
5549
|
// package.json
|
|
5550
5550
|
var package_default = {
|
|
5551
5551
|
name: "codeam-cli",
|
|
5552
|
-
version: "2.39.
|
|
5552
|
+
version: "2.39.81",
|
|
5553
5553
|
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.",
|
|
5554
5554
|
type: "commonjs",
|
|
5555
5555
|
main: "dist/index.js",
|
|
@@ -17456,7 +17456,7 @@ function checkForUpdates() {
|
|
|
17456
17456
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
17457
17457
|
if (process.env.CI) return;
|
|
17458
17458
|
if (!process.stdout.isTTY) return;
|
|
17459
|
-
const current = true ? "2.39.
|
|
17459
|
+
const current = true ? "2.39.81" : null;
|
|
17460
17460
|
if (!current) return;
|
|
17461
17461
|
const cache = readCache();
|
|
17462
17462
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -17894,7 +17894,7 @@ var defaultSpawner = (env, cwd, args2 = []) => (0, import_node_child_process13.s
|
|
|
17894
17894
|
detached: false
|
|
17895
17895
|
});
|
|
17896
17896
|
function currentCliVersion() {
|
|
17897
|
-
return true ? "2.39.
|
|
17897
|
+
return true ? "2.39.81" : null;
|
|
17898
17898
|
}
|
|
17899
17899
|
function runCmd(cmd, args2, timeoutMs) {
|
|
17900
17900
|
return new Promise((resolve7) => {
|
|
@@ -23366,6 +23366,20 @@ var StreamingState = class {
|
|
|
23366
23366
|
* no matter how many message ids the adapter spreads it across.
|
|
23367
23367
|
*/
|
|
23368
23368
|
turnTextChunkId = null;
|
|
23369
|
+
/**
|
|
23370
|
+
* Monotonic turn counter, bumped each {@link beginTurn}. Used to NAMESPACE
|
|
23371
|
+
* every streaming-chunk id so an id the ACP adapter REUSES across turns can't
|
|
23372
|
+
* collide on the mobile feed. `claude-agent-acp` emits `toolu_01` for the
|
|
23373
|
+
* first tool of EVERY turn (and reuses it for sequential tools), so without a
|
|
23374
|
+
* per-turn prefix, once turn 1's `toolu_01` chunk was flushed `isFinal:true`,
|
|
23375
|
+
* a later turn's `toolu_01` was treated as the already-final chunk and
|
|
23376
|
+
* DROPPED — thinking/tool-call chips rendered on the first turn then
|
|
23377
|
+
* disappeared on subsequent ones (the "tool calls stop showing after a couple
|
|
23378
|
+
* messages" bug). Text is unaffected (it collapses onto a per-turn-reset
|
|
23379
|
+
* {@link turnTextChunkId}); this protects the thinking/tool_use/tool_result
|
|
23380
|
+
* kinds that key purely off the adapter id.
|
|
23381
|
+
*/
|
|
23382
|
+
turnSeq = 0;
|
|
23369
23383
|
/**
|
|
23370
23384
|
* Register a permission Promise. The Promise stays pending until
|
|
23371
23385
|
* `resolveSelection(index)` is called from the relay handler, OR
|
|
@@ -23458,6 +23472,7 @@ var StreamingState = class {
|
|
|
23458
23472
|
this.text = "";
|
|
23459
23473
|
this.streamingChunks.clear();
|
|
23460
23474
|
this.turnTextChunkId = null;
|
|
23475
|
+
this.turnSeq += 1;
|
|
23461
23476
|
if (this.pending?.kind === "permission") {
|
|
23462
23477
|
clearTimeout(this.pending.timeoutTimer);
|
|
23463
23478
|
}
|
|
@@ -23468,7 +23483,8 @@ var StreamingState = class {
|
|
|
23468
23483
|
await this.publisher.publishOutput({ type: "new_turn", done: false });
|
|
23469
23484
|
}
|
|
23470
23485
|
append(delta) {
|
|
23471
|
-
const
|
|
23486
|
+
const baseId = delta.kind === "text" ? this.turnTextChunkId ??= delta.chunkId : delta.chunkId;
|
|
23487
|
+
const chunkId = `t${this.turnSeq}:${baseId}`;
|
|
23472
23488
|
const existing = this.streamingChunks.get(chunkId);
|
|
23473
23489
|
if (existing && existing.kind !== delta.kind) {
|
|
23474
23490
|
log.warn(
|
|
@@ -23691,6 +23707,14 @@ function looksLikeAuthFailure(text) {
|
|
|
23691
23707
|
return AUTH_FAILURE_RE.test(text);
|
|
23692
23708
|
}
|
|
23693
23709
|
var AUTH_FAILURE_MESSAGE = "\u{1F512} **Authentication failed \u2014 your agent credentials are invalid or expired (API 401).**\n\nTap [Re-authenticate this agent](codeam://reauth) to renew your credentials in Profile \u203A Agents, then send your message again.";
|
|
23710
|
+
var TURN_FAILURE_MESSAGE = "\u26A0\uFE0F **The agent hit an error and couldn\u2019t finish this turn.** Please send your message again.";
|
|
23711
|
+
function failureBubble(opts) {
|
|
23712
|
+
if (looksLikeAuthFailure(opts.detail) || looksLikeAuthFailure(opts.recentStderr)) {
|
|
23713
|
+
return AUTH_FAILURE_MESSAGE;
|
|
23714
|
+
}
|
|
23715
|
+
if (!opts.hadText) return TURN_FAILURE_MESSAGE;
|
|
23716
|
+
return null;
|
|
23717
|
+
}
|
|
23694
23718
|
async function runAcpSession(opts) {
|
|
23695
23719
|
const publisher = new AcpPublisher({
|
|
23696
23720
|
sessionId: opts.sessionId,
|
|
@@ -23952,16 +23976,18 @@ async function handleCommand(cmd, client2, relay, acpSessionId, models, streamin
|
|
|
23952
23976
|
log.info("acpRunner", `start_task \u2190 done stopReason=${reply.stopReason ?? "?"} id=${cmd.id.slice(0, 8)}`);
|
|
23953
23977
|
await relay.sendResult(cmd.id, "completed", { stopReason: reply.stopReason });
|
|
23954
23978
|
} catch (err) {
|
|
23979
|
+
const hadText = streaming.getCurrentText().trim().length > 0;
|
|
23955
23980
|
await recoverFromFailedTurn(client2, streaming);
|
|
23956
23981
|
const detail = describeError(err);
|
|
23957
23982
|
log.warn("acpRunner", `prompt failed: ${detail}`);
|
|
23958
|
-
|
|
23959
|
-
|
|
23960
|
-
|
|
23961
|
-
|
|
23962
|
-
|
|
23963
|
-
|
|
23964
|
-
|
|
23983
|
+
const bubble = failureBubble({
|
|
23984
|
+
detail,
|
|
23985
|
+
recentStderr: recentStderr.join("\n"),
|
|
23986
|
+
hadText
|
|
23987
|
+
});
|
|
23988
|
+
if (bubble) {
|
|
23989
|
+
await publisher.publishOutput({ type: "text", content: bubble, done: true });
|
|
23990
|
+
history.appendAgentReply(bubble);
|
|
23965
23991
|
void history.flush();
|
|
23966
23992
|
}
|
|
23967
23993
|
await relay.sendResult(cmd.id, "failed", { error: detail });
|
|
@@ -28599,7 +28625,7 @@ function checkChokidar() {
|
|
|
28599
28625
|
}
|
|
28600
28626
|
async function doctor(args2 = []) {
|
|
28601
28627
|
const json = args2.includes("--json");
|
|
28602
|
-
const cliVersion = true ? "2.39.
|
|
28628
|
+
const cliVersion = true ? "2.39.81" : "0.0.0-dev";
|
|
28603
28629
|
const apiBase2 = resolveApiBaseUrl();
|
|
28604
28630
|
const diagnosticId = (0, import_node_crypto8.randomUUID)();
|
|
28605
28631
|
log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
|
|
@@ -28798,7 +28824,7 @@ async function completion(args2) {
|
|
|
28798
28824
|
// src/commands/version.ts
|
|
28799
28825
|
var import_picocolors14 = __toESM(require("picocolors"));
|
|
28800
28826
|
function version2() {
|
|
28801
|
-
const v = true ? "2.39.
|
|
28827
|
+
const v = true ? "2.39.81" : "unknown";
|
|
28802
28828
|
console.log(`${import_picocolors14.default.bold("codeam-cli")} ${import_picocolors14.default.cyan(v)}`);
|
|
28803
28829
|
}
|
|
28804
28830
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codeam-cli",
|
|
3
|
-
"version": "2.39.
|
|
3
|
+
"version": "2.39.81",
|
|
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",
|