codeam-cli 2.35.3 → 2.35.5

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,18 @@ 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.4] — 2026-06-10
8
+
9
+ ### Fixed
10
+
11
+ - **cli:** Make ACP prompt timeout idle-based, not total-elapsed (#310)
12
+
13
+ ## [2.35.3] — 2026-06-10
14
+
15
+ ### Fixed
16
+
17
+ - **cli:** Symlink bd into a WRITABLE on-PATH dir (~/.local/bin) for codespaces
18
+
7
19
  ## [2.35.2] — 2026-06-10
8
20
 
9
21
  ### 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.3",
501
+ version: "2.35.5",
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",
@@ -569,7 +569,6 @@ var package_default = {
569
569
  },
570
570
  dependencies: {
571
571
  "@agentclientprotocol/claude-agent-acp": "^0.42.0",
572
- "@beads/bd": "1.0.5",
573
572
  "@agentclientprotocol/codex-acp": "^0.0.45",
574
573
  "@agentclientprotocol/sdk": "^0.25.0",
575
574
  "@clack/prompts": "^1.2.0",
@@ -581,6 +580,9 @@ var package_default = {
581
580
  ws: "^8.18.0",
582
581
  zod: "^4.3.6"
583
582
  },
583
+ optionalDependencies: {
584
+ "@beads/bd": "1.0.5"
585
+ },
584
586
  devDependencies: {
585
587
  "@codeagent/shared": "*",
586
588
  "@types/node": "^22.0.0",
@@ -5898,7 +5900,7 @@ function readAnonId() {
5898
5900
  }
5899
5901
  function superProperties() {
5900
5902
  return {
5901
- cliVersion: true ? "2.35.3" : "0.0.0-dev",
5903
+ cliVersion: true ? "2.35.5" : "0.0.0-dev",
5902
5904
  nodeVersion: process.version,
5903
5905
  platform: process.platform,
5904
5906
  arch: process.arch,
@@ -14601,9 +14603,49 @@ var RequestError = class _RequestError extends Error {
14601
14603
  }
14602
14604
  };
14603
14605
 
14606
+ // src/agents/acp/idleTimeout.ts
14607
+ function createIdleTimeout(idleMs, makeError) {
14608
+ let timer;
14609
+ let done = false;
14610
+ let reject;
14611
+ const promise = new Promise((_resolve, rej) => {
14612
+ reject = rej;
14613
+ });
14614
+ const stop = () => {
14615
+ if (timer !== void 0) {
14616
+ clearTimeout(timer);
14617
+ timer = void 0;
14618
+ }
14619
+ };
14620
+ const arm = () => {
14621
+ if (done) return;
14622
+ timer = setTimeout(() => {
14623
+ done = true;
14624
+ reject(makeError());
14625
+ }, idleMs);
14626
+ timer.unref?.();
14627
+ };
14628
+ arm();
14629
+ return {
14630
+ promise,
14631
+ bump: () => {
14632
+ if (done) return;
14633
+ stop();
14634
+ arm();
14635
+ },
14636
+ suspend: () => {
14637
+ stop();
14638
+ },
14639
+ clear: () => {
14640
+ done = true;
14641
+ stop();
14642
+ }
14643
+ };
14644
+ }
14645
+
14604
14646
  // src/agents/acp/client.ts
14605
14647
  var PROTOCOL_VERSION2 = 1;
14606
- var PROMPT_TIMEOUT_MS = 9e4;
14648
+ var PROMPT_IDLE_TIMEOUT_MS = 9e4;
14607
14649
  var CLIENT_CAPABILITIES = {
14608
14650
  fs: { readTextFile: true, writeTextFile: true },
14609
14651
  terminal: false
@@ -14617,6 +14659,11 @@ var AcpClient = class {
14617
14659
  connection = null;
14618
14660
  stopping = false;
14619
14661
  sessionId = null;
14662
+ /** Idle watchdog for the in-flight prompt. The `Client` handlers
14663
+ * (`sessionUpdate` / `requestPermission`) reach for this to keep
14664
+ * the turn alive while the adapter is demonstrably working. Null
14665
+ * between prompts. */
14666
+ promptIdle = null;
14620
14667
  /**
14621
14668
  * Spawn the adapter + perform the initial handshake (initialize
14622
14669
  * → newSession). Returns the ACP-assigned sessionId so the caller
@@ -14724,31 +14771,31 @@ var AcpClient = class {
14724
14771
  sessionId: this.sessionId,
14725
14772
  prompt: blocks
14726
14773
  });
14727
- let timeoutId;
14728
- const timeout = new Promise((_resolve, reject) => {
14729
- timeoutId = setTimeout(() => {
14730
- reject(
14731
- new Error(
14732
- `ACP prompt timed out after ${PROMPT_TIMEOUT_MS / 1e3}s \u2014 adapter never responded. Likely the underlying agent's auth or network is misconfigured; check the adapter stderr lines above (acpAdapter tag) for the actual error.`
14733
- )
14734
- );
14735
- }, PROMPT_TIMEOUT_MS);
14736
- });
14774
+ const idle = createIdleTimeout(
14775
+ PROMPT_IDLE_TIMEOUT_MS,
14776
+ () => new Error(
14777
+ `ACP prompt idle for ${PROMPT_IDLE_TIMEOUT_MS / 1e3}s \u2014 adapter sent no updates. Likely the underlying agent's auth or network is misconfigured; check the adapter stderr lines above (acpAdapter tag) for the actual error.`
14778
+ )
14779
+ );
14780
+ this.promptIdle = idle;
14737
14781
  try {
14738
- const result = await Promise.race([send, timeout]);
14782
+ const result = await Promise.race([send, idle.promise]);
14739
14783
  log.info(
14740
14784
  "acpClient",
14741
14785
  `prompt \u2190 ok stopReason=${result.stopReason ?? "?"} elapsedMs=${Date.now() - t0}`
14742
14786
  );
14743
14787
  return result;
14744
14788
  } catch (err) {
14789
+ void send.catch(() => {
14790
+ });
14745
14791
  log.warn(
14746
14792
  "acpClient",
14747
14793
  `prompt \u2190 failed elapsedMs=${Date.now() - t0} err=${err instanceof Error ? err.message : String(err)}`
14748
14794
  );
14749
14795
  throw err;
14750
14796
  } finally {
14751
- if (timeoutId !== void 0) clearTimeout(timeoutId);
14797
+ idle.clear();
14798
+ this.promptIdle = null;
14752
14799
  }
14753
14800
  }
14754
14801
  /**
@@ -14837,10 +14884,16 @@ var AcpClient = class {
14837
14884
  buildClient() {
14838
14885
  return {
14839
14886
  sessionUpdate: async (params) => {
14887
+ this.promptIdle?.bump();
14840
14888
  this.opts.onSessionUpdate(params);
14841
14889
  },
14842
- requestPermission: (params) => {
14843
- return this.opts.onRequestPermission(params);
14890
+ requestPermission: async (params) => {
14891
+ this.promptIdle?.suspend();
14892
+ try {
14893
+ return await this.opts.onRequestPermission(params);
14894
+ } finally {
14895
+ this.promptIdle?.bump();
14896
+ }
14844
14897
  },
14845
14898
  readTextFile: async (params) => {
14846
14899
  try {
@@ -26045,7 +26098,7 @@ function checkChokidar() {
26045
26098
  }
26046
26099
  async function doctor(args2 = []) {
26047
26100
  const json = args2.includes("--json");
26048
- const cliVersion = true ? "2.35.3" : "0.0.0-dev";
26101
+ const cliVersion = true ? "2.35.5" : "0.0.0-dev";
26049
26102
  const apiBase = resolveApiBaseUrl();
26050
26103
  const diagnosticId = (0, import_node_crypto8.randomUUID)();
26051
26104
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -26244,7 +26297,7 @@ async function completion(args2) {
26244
26297
  // src/commands/version.ts
26245
26298
  var import_picocolors13 = __toESM(require("picocolors"));
26246
26299
  function version2() {
26247
- const v = true ? "2.35.3" : "unknown";
26300
+ const v = true ? "2.35.5" : "unknown";
26248
26301
  console.log(`${import_picocolors13.default.bold("codeam-cli")} ${import_picocolors13.default.cyan(v)}`);
26249
26302
  }
26250
26303
 
@@ -26530,7 +26583,7 @@ function checkForUpdates() {
26530
26583
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
26531
26584
  if (process.env.CI) return;
26532
26585
  if (!process.stdout.isTTY) return;
26533
- const current = true ? "2.35.3" : null;
26586
+ const current = true ? "2.35.5" : null;
26534
26587
  if (!current) return;
26535
26588
  const cache = readCache();
26536
26589
  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",
3
+ "version": "2.35.5",
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",
@@ -71,7 +71,6 @@
71
71
  },
72
72
  "dependencies": {
73
73
  "@agentclientprotocol/claude-agent-acp": "^0.42.0",
74
- "@beads/bd": "1.0.5",
75
74
  "@agentclientprotocol/codex-acp": "^0.0.45",
76
75
  "@agentclientprotocol/sdk": "^0.25.0",
77
76
  "@clack/prompts": "^1.2.0",
@@ -83,6 +82,9 @@
83
82
  "ws": "^8.18.0",
84
83
  "zod": "^4.3.6"
85
84
  },
85
+ "optionalDependencies": {
86
+ "@beads/bd": "1.0.5"
87
+ },
86
88
  "devDependencies": {
87
89
  "@codeagent/shared": "*",
88
90
  "@types/node": "^22.0.0",