codeam-cli 2.65.17 → 2.66.0
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 +54 -8
- 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.65.17] — 2026-08-21
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **cli:** Install Headroom without root by resolving uv before sudo (#648)
|
|
12
|
+
|
|
7
13
|
## [2.65.16] — 2026-08-20
|
|
8
14
|
|
|
9
15
|
### Added
|
package/dist/index.js
CHANGED
|
@@ -8081,7 +8081,7 @@ function readAnonId() {
|
|
|
8081
8081
|
}
|
|
8082
8082
|
function superProperties() {
|
|
8083
8083
|
return {
|
|
8084
|
-
cliVersion: true ? "2.
|
|
8084
|
+
cliVersion: true ? "2.66.0" : "0.0.0-dev",
|
|
8085
8085
|
nodeVersion: process.version,
|
|
8086
8086
|
platform: process.platform,
|
|
8087
8087
|
arch: process.arch,
|
|
@@ -8323,7 +8323,7 @@ var http = __toESM(require("http"));
|
|
|
8323
8323
|
// package.json
|
|
8324
8324
|
var package_default = {
|
|
8325
8325
|
name: "codeam-cli",
|
|
8326
|
-
version: "2.
|
|
8326
|
+
version: "2.66.0",
|
|
8327
8327
|
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.",
|
|
8328
8328
|
type: "commonjs",
|
|
8329
8329
|
main: "dist/index.js",
|
|
@@ -9845,7 +9845,7 @@ var CommandRelayService = class _CommandRelayService {
|
|
|
9845
9845
|
// fresh + clear the "CLI update available" banner after a self-update
|
|
9846
9846
|
// (a codespace that reinstalls @latest reconnects via heartbeat, not
|
|
9847
9847
|
// pair/reconnect). Older backends ignore the extra field.
|
|
9848
|
-
..."2.
|
|
9848
|
+
..."2.66.0" ? { ideVersion: "2.66.0" } : {}
|
|
9849
9849
|
}).then(() => log.trace("relay", `heartbeat ok online=${online}`)).catch((err) => log.trace("relay", `heartbeat failed online=${online}`, err));
|
|
9850
9850
|
}
|
|
9851
9851
|
/**
|
|
@@ -22070,7 +22070,7 @@ async function autoUpgradeBeforeCriticalCommand() {
|
|
|
22070
22070
|
if (process.env.NODE_ENV === "test") return;
|
|
22071
22071
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
22072
22072
|
if (process.env.CI) return;
|
|
22073
|
-
const current2 = true ? "2.
|
|
22073
|
+
const current2 = true ? "2.66.0" : null;
|
|
22074
22074
|
if (!current2) return;
|
|
22075
22075
|
const cache = readCache();
|
|
22076
22076
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -22087,7 +22087,7 @@ function checkForUpdates() {
|
|
|
22087
22087
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
22088
22088
|
if (process.env.CI) return;
|
|
22089
22089
|
if (!process.stdout.isTTY) return;
|
|
22090
|
-
const current2 = true ? "2.
|
|
22090
|
+
const current2 = true ? "2.66.0" : null;
|
|
22091
22091
|
if (!current2) return;
|
|
22092
22092
|
const cache = readCache();
|
|
22093
22093
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -22107,7 +22107,7 @@ var SELF_UPDATE_INTERVAL_MS = 60 * 60 * 1e3;
|
|
|
22107
22107
|
var SELF_UPDATE_VIEW_TIMEOUT_MS = 3e4;
|
|
22108
22108
|
var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
|
|
22109
22109
|
function currentCliVersion() {
|
|
22110
|
-
return true ? "2.
|
|
22110
|
+
return true ? "2.66.0" : null;
|
|
22111
22111
|
}
|
|
22112
22112
|
function runCmd(cmd, args2, timeoutMs) {
|
|
22113
22113
|
return new Promise((resolve10) => {
|
|
@@ -22385,6 +22385,11 @@ function fleetUserIdFromContainerName(containerName) {
|
|
|
22385
22385
|
function isMissingContainerError(stderr) {
|
|
22386
22386
|
return /no such container/i.test(stderr);
|
|
22387
22387
|
}
|
|
22388
|
+
function isFleetPruneHostPayload(v) {
|
|
22389
|
+
if (typeof v !== "object" || v === null) return false;
|
|
22390
|
+
const p2 = v;
|
|
22391
|
+
return typeof p2.images === "boolean" && typeof p2.buildCache === "boolean";
|
|
22392
|
+
}
|
|
22388
22393
|
function isMissingVolumeError(stderr) {
|
|
22389
22394
|
return /no such volume/i.test(stderr);
|
|
22390
22395
|
}
|
|
@@ -22800,6 +22805,14 @@ var HostAgentSupervisor = class {
|
|
|
22800
22805
|
await this.fleetDeleteBox(cmd.payload);
|
|
22801
22806
|
return;
|
|
22802
22807
|
}
|
|
22808
|
+
if (cmd.type === "fleet_prune_host") {
|
|
22809
|
+
if (!isFleetPruneHostPayload(cmd.payload)) {
|
|
22810
|
+
log.warn("host-agent", `ignoring malformed fleet_prune_host id=${cmd.id}`);
|
|
22811
|
+
return;
|
|
22812
|
+
}
|
|
22813
|
+
await this.fleetPruneHost(cmd.payload);
|
|
22814
|
+
return;
|
|
22815
|
+
}
|
|
22803
22816
|
if (cmd.type === "self_hosted_deploy") {
|
|
22804
22817
|
if (!isDeployPayload(cmd.payload)) {
|
|
22805
22818
|
log.warn("host-agent", `ignoring malformed self_hosted_deploy id=${cmd.id}`);
|
|
@@ -23011,6 +23024,39 @@ var HostAgentSupervisor = class {
|
|
|
23011
23024
|
/** `fleet_stop_box` — sleep an idle box (`docker stop`). MUST be
|
|
23012
23025
|
* idempotent — the backend's reap sweeps may re-send a stop for a box
|
|
23013
23026
|
* the host already stopped/removed; "No such container" is success. */
|
|
23027
|
+
/**
|
|
23028
|
+
* `fleet_prune_host` — reclaim Docker residue. Best-effort and idempotent: a
|
|
23029
|
+
* prune with nothing to collect exits 0 with "Total reclaimed space: 0B".
|
|
23030
|
+
*
|
|
23031
|
+
* ⚠️ Only ever `image prune` (dangling) and `builder prune`. NEVER
|
|
23032
|
+
* `container prune` (a stopped fleet container is a SLEEPING BOX) and NEVER
|
|
23033
|
+
* `volume prune` (a box's volume is the user's workspace and outlives its
|
|
23034
|
+
* container by design). See `FleetPruneHostPayload`.
|
|
23035
|
+
*/
|
|
23036
|
+
async fleetPruneHost(payload) {
|
|
23037
|
+
log.info(
|
|
23038
|
+
"host-agent",
|
|
23039
|
+
`fleet_prune_host images=${payload.images} buildCache=${payload.buildCache}`
|
|
23040
|
+
);
|
|
23041
|
+
const steps = [];
|
|
23042
|
+
if (payload.images) steps.push({ label: "image", args: ["image", "prune", "-f"] });
|
|
23043
|
+
if (payload.buildCache) steps.push({ label: "builder", args: ["builder", "prune", "-f"] });
|
|
23044
|
+
for (const step of steps) {
|
|
23045
|
+
const res = await this.docker.run(step.args);
|
|
23046
|
+
if (res.code !== 0) {
|
|
23047
|
+
log.warn(
|
|
23048
|
+
"host-agent",
|
|
23049
|
+
`fleet_prune_host ${step.label} failed (code=${res.code}): ${res.stderr.trim().slice(-300)}`
|
|
23050
|
+
);
|
|
23051
|
+
continue;
|
|
23052
|
+
}
|
|
23053
|
+
const reclaimed = /Total reclaimed space:\s*(.+)/i.exec(res.stdout || "");
|
|
23054
|
+
log.info(
|
|
23055
|
+
"host-agent",
|
|
23056
|
+
`fleet_prune_host ${step.label} ok${reclaimed ? ` reclaimed=${reclaimed[1].trim()}` : ""}`
|
|
23057
|
+
);
|
|
23058
|
+
}
|
|
23059
|
+
}
|
|
23014
23060
|
async fleetStopBox(payload) {
|
|
23015
23061
|
log.info("host-agent", `fleet_stop_box id=${payload.boxId} name=${payload.containerName}`);
|
|
23016
23062
|
const res = await this.docker.run(["stop", payload.containerName]);
|
|
@@ -45588,7 +45634,7 @@ function checkChokidar() {
|
|
|
45588
45634
|
}
|
|
45589
45635
|
async function doctor(args2 = []) {
|
|
45590
45636
|
const json = args2.includes("--json");
|
|
45591
|
-
const cliVersion = true ? "2.
|
|
45637
|
+
const cliVersion = true ? "2.66.0" : "0.0.0-dev";
|
|
45592
45638
|
const apiBase2 = resolveApiBaseUrl();
|
|
45593
45639
|
const diagnosticId = (0, import_node_crypto13.randomUUID)();
|
|
45594
45640
|
log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
|
|
@@ -45979,7 +46025,7 @@ async function mcpRun(args2) {
|
|
|
45979
46025
|
// src/commands/version.ts
|
|
45980
46026
|
var import_picocolors15 = __toESM(require("picocolors"));
|
|
45981
46027
|
function version2() {
|
|
45982
|
-
const v = true ? "2.
|
|
46028
|
+
const v = true ? "2.66.0" : "unknown";
|
|
45983
46029
|
console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
|
|
45984
46030
|
}
|
|
45985
46031
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codeam-cli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.66.0",
|
|
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",
|