codeam-cli 2.35.3 → 2.35.4

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,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.35.3] — 2026-06-10
8
+
9
+ ### Fixed
10
+
11
+ - **cli:** Symlink bd into a WRITABLE on-PATH dir (~/.local/bin) for codespaces
12
+
7
13
  ## [2.35.2] — 2026-06-10
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.35.3",
501
+ version: "2.35.4",
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",
@@ -5898,7 +5898,7 @@ function readAnonId() {
5898
5898
  }
5899
5899
  function superProperties() {
5900
5900
  return {
5901
- cliVersion: true ? "2.35.3" : "0.0.0-dev",
5901
+ cliVersion: true ? "2.35.4" : "0.0.0-dev",
5902
5902
  nodeVersion: process.version,
5903
5903
  platform: process.platform,
5904
5904
  arch: process.arch,
@@ -14601,9 +14601,49 @@ var RequestError = class _RequestError extends Error {
14601
14601
  }
14602
14602
  };
14603
14603
 
14604
+ // src/agents/acp/idleTimeout.ts
14605
+ function createIdleTimeout(idleMs, makeError) {
14606
+ let timer;
14607
+ let done = false;
14608
+ let reject;
14609
+ const promise = new Promise((_resolve, rej) => {
14610
+ reject = rej;
14611
+ });
14612
+ const stop = () => {
14613
+ if (timer !== void 0) {
14614
+ clearTimeout(timer);
14615
+ timer = void 0;
14616
+ }
14617
+ };
14618
+ const arm = () => {
14619
+ if (done) return;
14620
+ timer = setTimeout(() => {
14621
+ done = true;
14622
+ reject(makeError());
14623
+ }, idleMs);
14624
+ timer.unref?.();
14625
+ };
14626
+ arm();
14627
+ return {
14628
+ promise,
14629
+ bump: () => {
14630
+ if (done) return;
14631
+ stop();
14632
+ arm();
14633
+ },
14634
+ suspend: () => {
14635
+ stop();
14636
+ },
14637
+ clear: () => {
14638
+ done = true;
14639
+ stop();
14640
+ }
14641
+ };
14642
+ }
14643
+
14604
14644
  // src/agents/acp/client.ts
14605
14645
  var PROTOCOL_VERSION2 = 1;
14606
- var PROMPT_TIMEOUT_MS = 9e4;
14646
+ var PROMPT_IDLE_TIMEOUT_MS = 9e4;
14607
14647
  var CLIENT_CAPABILITIES = {
14608
14648
  fs: { readTextFile: true, writeTextFile: true },
14609
14649
  terminal: false
@@ -14617,6 +14657,11 @@ var AcpClient = class {
14617
14657
  connection = null;
14618
14658
  stopping = false;
14619
14659
  sessionId = null;
14660
+ /** Idle watchdog for the in-flight prompt. The `Client` handlers
14661
+ * (`sessionUpdate` / `requestPermission`) reach for this to keep
14662
+ * the turn alive while the adapter is demonstrably working. Null
14663
+ * between prompts. */
14664
+ promptIdle = null;
14620
14665
  /**
14621
14666
  * Spawn the adapter + perform the initial handshake (initialize
14622
14667
  * → newSession). Returns the ACP-assigned sessionId so the caller
@@ -14724,31 +14769,31 @@ var AcpClient = class {
14724
14769
  sessionId: this.sessionId,
14725
14770
  prompt: blocks
14726
14771
  });
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
- });
14772
+ const idle = createIdleTimeout(
14773
+ PROMPT_IDLE_TIMEOUT_MS,
14774
+ () => new Error(
14775
+ `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.`
14776
+ )
14777
+ );
14778
+ this.promptIdle = idle;
14737
14779
  try {
14738
- const result = await Promise.race([send, timeout]);
14780
+ const result = await Promise.race([send, idle.promise]);
14739
14781
  log.info(
14740
14782
  "acpClient",
14741
14783
  `prompt \u2190 ok stopReason=${result.stopReason ?? "?"} elapsedMs=${Date.now() - t0}`
14742
14784
  );
14743
14785
  return result;
14744
14786
  } catch (err) {
14787
+ void send.catch(() => {
14788
+ });
14745
14789
  log.warn(
14746
14790
  "acpClient",
14747
14791
  `prompt \u2190 failed elapsedMs=${Date.now() - t0} err=${err instanceof Error ? err.message : String(err)}`
14748
14792
  );
14749
14793
  throw err;
14750
14794
  } finally {
14751
- if (timeoutId !== void 0) clearTimeout(timeoutId);
14795
+ idle.clear();
14796
+ this.promptIdle = null;
14752
14797
  }
14753
14798
  }
14754
14799
  /**
@@ -14837,10 +14882,16 @@ var AcpClient = class {
14837
14882
  buildClient() {
14838
14883
  return {
14839
14884
  sessionUpdate: async (params) => {
14885
+ this.promptIdle?.bump();
14840
14886
  this.opts.onSessionUpdate(params);
14841
14887
  },
14842
- requestPermission: (params) => {
14843
- return this.opts.onRequestPermission(params);
14888
+ requestPermission: async (params) => {
14889
+ this.promptIdle?.suspend();
14890
+ try {
14891
+ return await this.opts.onRequestPermission(params);
14892
+ } finally {
14893
+ this.promptIdle?.bump();
14894
+ }
14844
14895
  },
14845
14896
  readTextFile: async (params) => {
14846
14897
  try {
@@ -26045,7 +26096,7 @@ function checkChokidar() {
26045
26096
  }
26046
26097
  async function doctor(args2 = []) {
26047
26098
  const json = args2.includes("--json");
26048
- const cliVersion = true ? "2.35.3" : "0.0.0-dev";
26099
+ const cliVersion = true ? "2.35.4" : "0.0.0-dev";
26049
26100
  const apiBase = resolveApiBaseUrl();
26050
26101
  const diagnosticId = (0, import_node_crypto8.randomUUID)();
26051
26102
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -26244,7 +26295,7 @@ async function completion(args2) {
26244
26295
  // src/commands/version.ts
26245
26296
  var import_picocolors13 = __toESM(require("picocolors"));
26246
26297
  function version2() {
26247
- const v = true ? "2.35.3" : "unknown";
26298
+ const v = true ? "2.35.4" : "unknown";
26248
26299
  console.log(`${import_picocolors13.default.bold("codeam-cli")} ${import_picocolors13.default.cyan(v)}`);
26249
26300
  }
26250
26301
 
@@ -26530,7 +26581,7 @@ function checkForUpdates() {
26530
26581
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
26531
26582
  if (process.env.CI) return;
26532
26583
  if (!process.stdout.isTTY) return;
26533
- const current = true ? "2.35.3" : null;
26584
+ const current = true ? "2.35.4" : null;
26534
26585
  if (!current) return;
26535
26586
  const cache = readCache();
26536
26587
  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.4",
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",