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 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.7",
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.7" : "0.0.0-dev",
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.promptIdle?.bump();
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.7" : "0.0.0-dev";
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.7" : "unknown";
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.7" : null;
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.7",
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",