codeam-cli 2.35.7 → 2.35.9
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 +16 -0
- package/dist/index.js +84 -6
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,22 @@ 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.35.8] — 2026-06-10
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **cli:** Handle group_mention_task (@codeagent runs + replies to group) (#316)
|
|
12
|
+
|
|
13
|
+
## [2.35.7] — 2026-06-10
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
|
|
17
|
+
- **cli:** Keep ACP thought + reply on distinct chunkIds (no kind flip) (#314)
|
|
18
|
+
|
|
19
|
+
### Tests
|
|
20
|
+
|
|
21
|
+
- **cli:** Make cliBinDir tests pass on the Windows shard (#313)
|
|
22
|
+
|
|
7
23
|
## [2.35.6] — 2026-06-10
|
|
8
24
|
|
|
9
25
|
### 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.35.
|
|
501
|
+
version: "2.35.9",
|
|
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",
|
|
@@ -5900,7 +5900,7 @@ function readAnonId() {
|
|
|
5900
5900
|
}
|
|
5901
5901
|
function superProperties() {
|
|
5902
5902
|
return {
|
|
5903
|
-
cliVersion: true ? "2.35.
|
|
5903
|
+
cliVersion: true ? "2.35.9" : "0.0.0-dev",
|
|
5904
5904
|
nodeVersion: process.version,
|
|
5905
5905
|
platform: process.platform,
|
|
5906
5906
|
arch: process.arch,
|
|
@@ -14664,6 +14664,14 @@ var AcpClient = class {
|
|
|
14664
14664
|
* the turn alive while the adapter is demonstrably working. Null
|
|
14665
14665
|
* between prompts. */
|
|
14666
14666
|
promptIdle = null;
|
|
14667
|
+
/** Tool calls the adapter has started but not yet reported terminal
|
|
14668
|
+
* (`completed`/`failed`). A long-running tool — typecheck, build,
|
|
14669
|
+
* install, a big test run — emits NO `session/update` for its whole
|
|
14670
|
+
* duration, which can exceed the idle window and falsely trip the
|
|
14671
|
+
* watchdog. While ANY tool is outstanding we SUSPEND the watchdog
|
|
14672
|
+
* (the agent is demonstrably working, just blocked on the tool), and
|
|
14673
|
+
* re-arm only once the last one finishes. Reset per prompt. */
|
|
14674
|
+
pendingToolCalls = /* @__PURE__ */ new Set();
|
|
14667
14675
|
/**
|
|
14668
14676
|
* Spawn the adapter + perform the initial handshake (initialize
|
|
14669
14677
|
* → newSession). Returns the ACP-assigned sessionId so the caller
|
|
@@ -14778,6 +14786,7 @@ var AcpClient = class {
|
|
|
14778
14786
|
)
|
|
14779
14787
|
);
|
|
14780
14788
|
this.promptIdle = idle;
|
|
14789
|
+
this.pendingToolCalls.clear();
|
|
14781
14790
|
try {
|
|
14782
14791
|
const result = await Promise.race([send, idle.promise]);
|
|
14783
14792
|
log.info(
|
|
@@ -14880,11 +14889,35 @@ var AcpClient = class {
|
|
|
14880
14889
|
log.trace("acpClient", "stop teardown error", err);
|
|
14881
14890
|
}
|
|
14882
14891
|
}
|
|
14892
|
+
/**
|
|
14893
|
+
* Drive the idle watchdog off the tool-call lifecycle so a long but
|
|
14894
|
+
* alive tool (typecheck / build / install) can't trip it.
|
|
14895
|
+
*
|
|
14896
|
+
* - `tool_call` (a tool starts) → track + suspend
|
|
14897
|
+
* - `tool_call_update` completed/failed → untrack; re-arm iff
|
|
14898
|
+
* no tool still running
|
|
14899
|
+
* - anything else (thought / message / …) → re-arm, unless a tool
|
|
14900
|
+
* is still outstanding
|
|
14901
|
+
*/
|
|
14902
|
+
trackToolCallIdle(params) {
|
|
14903
|
+
const u2 = params.update;
|
|
14904
|
+
if (u2.sessionUpdate === "tool_call" && typeof u2.toolCallId === "string") {
|
|
14905
|
+
this.pendingToolCalls.add(u2.toolCallId);
|
|
14906
|
+
this.promptIdle?.suspend();
|
|
14907
|
+
return;
|
|
14908
|
+
}
|
|
14909
|
+
if (u2.sessionUpdate === "tool_call_update" && (u2.status === "completed" || u2.status === "failed")) {
|
|
14910
|
+
if (typeof u2.toolCallId === "string") this.pendingToolCalls.delete(u2.toolCallId);
|
|
14911
|
+
if (this.pendingToolCalls.size === 0) this.promptIdle?.bump();
|
|
14912
|
+
return;
|
|
14913
|
+
}
|
|
14914
|
+
if (this.pendingToolCalls.size === 0) this.promptIdle?.bump();
|
|
14915
|
+
}
|
|
14883
14916
|
// ─── Client surface (what the agent calls into) ───────────────────
|
|
14884
14917
|
buildClient() {
|
|
14885
14918
|
return {
|
|
14886
14919
|
sessionUpdate: async (params) => {
|
|
14887
|
-
this.
|
|
14920
|
+
this.trackToolCallIdle(params);
|
|
14888
14921
|
this.opts.onSessionUpdate(params);
|
|
14889
14922
|
},
|
|
14890
14923
|
requestPermission: async (params) => {
|
|
@@ -21116,6 +21149,51 @@ async function handleCommand(cmd, client2, relay, acpSessionId, models, streamin
|
|
|
21116
21149
|
}
|
|
21117
21150
|
return;
|
|
21118
21151
|
}
|
|
21152
|
+
case "group_mention_task": {
|
|
21153
|
+
const payload = cmd.payload;
|
|
21154
|
+
const taskId = typeof payload?.taskId === "string" ? payload.taskId : "";
|
|
21155
|
+
const promptText = typeof payload?.prompt === "string" ? payload.prompt : "";
|
|
21156
|
+
if (!taskId || !promptText.trim()) {
|
|
21157
|
+
await relay.sendResult(cmd.id, "failed", {
|
|
21158
|
+
error: "invalid group_mention_task payload"
|
|
21159
|
+
});
|
|
21160
|
+
return;
|
|
21161
|
+
}
|
|
21162
|
+
await streaming.beginTurn();
|
|
21163
|
+
history.appendUserPrompt(promptText);
|
|
21164
|
+
let response = "";
|
|
21165
|
+
let status2 = "completed";
|
|
21166
|
+
try {
|
|
21167
|
+
await client2.prompt(promptText);
|
|
21168
|
+
response = streaming.getCurrentText();
|
|
21169
|
+
await streaming.closeTurnWithInteractiveDetection();
|
|
21170
|
+
history.appendAgentReply(response);
|
|
21171
|
+
void history.flush();
|
|
21172
|
+
} catch (err) {
|
|
21173
|
+
status2 = "failed";
|
|
21174
|
+
response = describeError(err);
|
|
21175
|
+
await recoverFromFailedTurn(client2, streaming);
|
|
21176
|
+
}
|
|
21177
|
+
try {
|
|
21178
|
+
await _postJsonAuthed(
|
|
21179
|
+
`${resolveApiBaseUrl()}/api/agent-tasks/${encodeURIComponent(taskId)}/complete`,
|
|
21180
|
+
{
|
|
21181
|
+
sessionId: opts.sessionId,
|
|
21182
|
+
pluginId: opts.pluginId,
|
|
21183
|
+
response: response.slice(0, 32 * 1024),
|
|
21184
|
+
status: status2
|
|
21185
|
+
},
|
|
21186
|
+
opts.pluginAuthToken
|
|
21187
|
+
);
|
|
21188
|
+
} catch (err) {
|
|
21189
|
+
log.warn(
|
|
21190
|
+
"acpRunner",
|
|
21191
|
+
`group_mention_task ${taskId.slice(0, 8)} complete POST failed: ${describeError(err)}`
|
|
21192
|
+
);
|
|
21193
|
+
}
|
|
21194
|
+
await relay.sendResult(cmd.id, status2, { taskId });
|
|
21195
|
+
return;
|
|
21196
|
+
}
|
|
21119
21197
|
case "stop_task":
|
|
21120
21198
|
case "escape_key": {
|
|
21121
21199
|
try {
|
|
@@ -26112,7 +26190,7 @@ function checkChokidar() {
|
|
|
26112
26190
|
}
|
|
26113
26191
|
async function doctor(args2 = []) {
|
|
26114
26192
|
const json = args2.includes("--json");
|
|
26115
|
-
const cliVersion = true ? "2.35.
|
|
26193
|
+
const cliVersion = true ? "2.35.9" : "0.0.0-dev";
|
|
26116
26194
|
const apiBase = resolveApiBaseUrl();
|
|
26117
26195
|
const diagnosticId = (0, import_node_crypto8.randomUUID)();
|
|
26118
26196
|
log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
|
|
@@ -26311,7 +26389,7 @@ async function completion(args2) {
|
|
|
26311
26389
|
// src/commands/version.ts
|
|
26312
26390
|
var import_picocolors13 = __toESM(require("picocolors"));
|
|
26313
26391
|
function version2() {
|
|
26314
|
-
const v = true ? "2.35.
|
|
26392
|
+
const v = true ? "2.35.9" : "unknown";
|
|
26315
26393
|
console.log(`${import_picocolors13.default.bold("codeam-cli")} ${import_picocolors13.default.cyan(v)}`);
|
|
26316
26394
|
}
|
|
26317
26395
|
|
|
@@ -26597,7 +26675,7 @@ function checkForUpdates() {
|
|
|
26597
26675
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
26598
26676
|
if (process.env.CI) return;
|
|
26599
26677
|
if (!process.stdout.isTTY) return;
|
|
26600
|
-
const current = true ? "2.35.
|
|
26678
|
+
const current = true ? "2.35.9" : null;
|
|
26601
26679
|
if (!current) return;
|
|
26602
26680
|
const cache = readCache();
|
|
26603
26681
|
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.35.
|
|
3
|
+
"version": "2.35.9",
|
|
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",
|