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 +12 -0
- package/dist/index.js +74 -21
- package/package.json +4 -2
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.
|
|
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.
|
|
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
|
|
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
|
-
|
|
14728
|
-
|
|
14729
|
-
|
|
14730
|
-
|
|
14731
|
-
|
|
14732
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
+
"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",
|