codeam-cli 2.5.0 → 2.5.2
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 +42 -6
- 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.4.39] — 2026-05-06
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **cli:** Per-turn delta upload to keep canonical conversation fresh
|
|
12
|
+
|
|
7
13
|
## [2.4.37] — 2026-05-06
|
|
8
14
|
|
|
9
15
|
### Fixed
|
package/dist/index.js
CHANGED
|
@@ -1477,7 +1477,7 @@ var import_qrcode_terminal = __toESM(require("qrcode-terminal"));
|
|
|
1477
1477
|
// package.json
|
|
1478
1478
|
var package_default = {
|
|
1479
1479
|
name: "codeam-cli",
|
|
1480
|
-
version: "2.5.
|
|
1480
|
+
version: "2.5.2",
|
|
1481
1481
|
description: "Remote control Claude Code (and other AI coding agents) from your mobile phone. Pair your device, send prompts, stream responses in real-time, and approve commands \u2014 from anywhere.",
|
|
1482
1482
|
type: "commonjs",
|
|
1483
1483
|
main: "dist/index.js",
|
|
@@ -4490,8 +4490,14 @@ var ClaudeService = class {
|
|
|
4490
4490
|
constructor(opts) {
|
|
4491
4491
|
this.opts = opts;
|
|
4492
4492
|
this.strategyOpts = {
|
|
4493
|
-
onData:
|
|
4494
|
-
|
|
4493
|
+
onData: (d3) => {
|
|
4494
|
+
if (!this.claudeReady && d3.length > 0) {
|
|
4495
|
+
this.claudeReady = true;
|
|
4496
|
+
setTimeout(() => this.drainPending(), 250);
|
|
4497
|
+
}
|
|
4498
|
+
(opts.onData ?? (() => {
|
|
4499
|
+
}))(d3);
|
|
4500
|
+
},
|
|
4495
4501
|
onExit: opts.onExit
|
|
4496
4502
|
};
|
|
4497
4503
|
}
|
|
@@ -4501,6 +4507,30 @@ var ClaudeService = class {
|
|
|
4501
4507
|
// Methods called before spawn() (e.g. early kill/SIGINT) no-op safely.
|
|
4502
4508
|
strategy = null;
|
|
4503
4509
|
strategyOpts;
|
|
4510
|
+
/**
|
|
4511
|
+
* Set once the PTY emits its FIRST batch of output — proxy for
|
|
4512
|
+
* "Claude has rendered its input box and is ready to read keystrokes."
|
|
4513
|
+
* Before this, remote `sendCommand`s are buffered (`pendingInputs`)
|
|
4514
|
+
* and replayed in order on first data. Without this guard, the very
|
|
4515
|
+
* first prompt right after `codeam pair` on Windows lands while
|
|
4516
|
+
* Claude's React Ink tree is still mounting — the input bytes are
|
|
4517
|
+
* accepted by the PTY but never make it to the input field, and
|
|
4518
|
+
* the prompt silently vanishes.
|
|
4519
|
+
*/
|
|
4520
|
+
claudeReady = false;
|
|
4521
|
+
pendingInputs = [];
|
|
4522
|
+
drainPending() {
|
|
4523
|
+
if (!this.strategy || this.pendingInputs.length === 0) return;
|
|
4524
|
+
const s = this.strategy;
|
|
4525
|
+
log.trace("claude", `drain pending=${this.pendingInputs.length}`);
|
|
4526
|
+
let offset = 0;
|
|
4527
|
+
for (const text of this.pendingInputs) {
|
|
4528
|
+
setTimeout(() => s.write(text), offset);
|
|
4529
|
+
setTimeout(() => s.write("\r"), offset + 50);
|
|
4530
|
+
offset += 200;
|
|
4531
|
+
}
|
|
4532
|
+
this.pendingInputs.length = 0;
|
|
4533
|
+
}
|
|
4504
4534
|
async spawn() {
|
|
4505
4535
|
let launch = buildClaudeLaunch();
|
|
4506
4536
|
if (!launch) {
|
|
@@ -4569,6 +4599,11 @@ var ClaudeService = class {
|
|
|
4569
4599
|
log.trace("claude", "sendCommand dropped (no strategy)");
|
|
4570
4600
|
return;
|
|
4571
4601
|
}
|
|
4602
|
+
if (!this.claudeReady) {
|
|
4603
|
+
log.trace("claude", `sendCommand buffered (not ready) text=${text.length}B`);
|
|
4604
|
+
this.pendingInputs.push(text);
|
|
4605
|
+
return;
|
|
4606
|
+
}
|
|
4572
4607
|
const s = this.strategy;
|
|
4573
4608
|
log.trace("claude", `sendCommand text=${text.length}B`);
|
|
4574
4609
|
s.write(text);
|
|
@@ -6865,8 +6900,9 @@ async function start() {
|
|
|
6865
6900
|
process.exit(0);
|
|
6866
6901
|
}
|
|
6867
6902
|
process.once("SIGINT", sigintHandler);
|
|
6868
|
-
relay.start();
|
|
6869
6903
|
await claude.spawn();
|
|
6904
|
+
await outputSvc.startTerminalTurn();
|
|
6905
|
+
relay.start();
|
|
6870
6906
|
setTimeout(() => {
|
|
6871
6907
|
historySvc.detectCurrentConversation();
|
|
6872
6908
|
historySvc.load().catch(() => {
|
|
@@ -9193,7 +9229,7 @@ async function stopWorkspaceFromLocal(target) {
|
|
|
9193
9229
|
// src/commands/version.ts
|
|
9194
9230
|
var import_picocolors11 = __toESM(require("picocolors"));
|
|
9195
9231
|
function version() {
|
|
9196
|
-
const v = true ? "2.5.
|
|
9232
|
+
const v = true ? "2.5.2" : "unknown";
|
|
9197
9233
|
console.log(`${import_picocolors11.default.bold("codeam-cli")} ${import_picocolors11.default.cyan(v)}`);
|
|
9198
9234
|
}
|
|
9199
9235
|
|
|
@@ -9328,7 +9364,7 @@ function checkForUpdates() {
|
|
|
9328
9364
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
9329
9365
|
if (process.env.CI) return;
|
|
9330
9366
|
if (!process.stdout.isTTY) return;
|
|
9331
|
-
const current = true ? "2.5.
|
|
9367
|
+
const current = true ? "2.5.2" : null;
|
|
9332
9368
|
if (!current) return;
|
|
9333
9369
|
const cache = readCache();
|
|
9334
9370
|
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.5.
|
|
3
|
+
"version": "2.5.2",
|
|
4
4
|
"description": "Remote control Claude Code (and other AI coding agents) from your mobile phone. Pair your device, send prompts, stream responses in real-time, and approve commands — from anywhere.",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"main": "dist/index.js",
|