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 +6 -0
- package/dist/index.js +71 -20
- package/package.json +1 -1
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.
|
|
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.
|
|
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
|
|
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
|
-
|
|
14728
|
-
|
|
14729
|
-
|
|
14730
|
-
|
|
14731
|
-
|
|
14732
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
+
"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",
|