codeam-cli 2.39.27 → 2.39.29
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 +16 -0
- package/dist/index.js +58 -5
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,22 @@ 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.39.28] — 2026-06-18
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **cli,vsc-plugin,jetbrains-plugin:** Add show_install_command relay handler (#355)
|
|
12
|
+
|
|
13
|
+
## [2.39.27] — 2026-06-17
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- **cli:** Run the managed house agent on self-hosted host deploys (#330) (#353)
|
|
18
|
+
|
|
19
|
+
### Chore
|
|
20
|
+
|
|
21
|
+
- **deps:** Bump ACP adapters + resync lockfile (supersedes #324, #325) (#352)
|
|
22
|
+
|
|
7
23
|
## [2.39.26] — 2026-06-17
|
|
8
24
|
|
|
9
25
|
### Documentation
|
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.39.
|
|
501
|
+
version: "2.39.29",
|
|
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",
|
|
@@ -5908,7 +5908,7 @@ function readAnonId() {
|
|
|
5908
5908
|
}
|
|
5909
5909
|
function superProperties() {
|
|
5910
5910
|
return {
|
|
5911
|
-
cliVersion: true ? "2.39.
|
|
5911
|
+
cliVersion: true ? "2.39.29" : "0.0.0-dev",
|
|
5912
5912
|
nodeVersion: process.version,
|
|
5913
5913
|
platform: process.platform,
|
|
5914
5914
|
arch: process.arch,
|
|
@@ -15279,6 +15279,11 @@ var startCommandSchema = import_zod.z.object({
|
|
|
15279
15279
|
query: import_zod.z.string().max(256).optional(),
|
|
15280
15280
|
message: import_zod.z.string().max(8e3).optional(),
|
|
15281
15281
|
paths: import_zod.z.array(import_zod.z.string().max(4096)).optional(),
|
|
15282
|
+
// `show_install_command` — backend pushes the self-hosted install
|
|
15283
|
+
// one-liner the user copies onto their own box. DISPLAY-ONLY: the
|
|
15284
|
+
// CLI prints it to the terminal and never executes it. Bounded to
|
|
15285
|
+
// 8192 chars so a malformed payload can't flood the terminal.
|
|
15286
|
+
command: import_zod.z.string().min(1).max(8192).optional(),
|
|
15282
15287
|
side: import_zod.z.enum(["ours", "theirs"]).optional(),
|
|
15283
15288
|
limit: import_zod.z.number().int().min(1).max(500).optional(),
|
|
15284
15289
|
// search_files options. `query` is the haystack/needle string,
|
|
@@ -18450,6 +18455,18 @@ var shutdownSession = async (ctx, cmd) => {
|
|
|
18450
18455
|
ctx.relay.stop();
|
|
18451
18456
|
process.exit(0);
|
|
18452
18457
|
};
|
|
18458
|
+
var showInstallCommand = async (ctx, cmd, parsed) => {
|
|
18459
|
+
const command2 = parsed.command;
|
|
18460
|
+
if (!command2) {
|
|
18461
|
+
await ctx.relay.sendResult(cmd.id, "failed", { error: "Missing command" });
|
|
18462
|
+
return;
|
|
18463
|
+
}
|
|
18464
|
+
showInfo("CodeAgent \u2014 self-hosted install. Run this on your box:");
|
|
18465
|
+
showInfo("");
|
|
18466
|
+
showInfo(` ${command2}`);
|
|
18467
|
+
showInfo("");
|
|
18468
|
+
await ctx.relay.sendResult(cmd.id, "completed", {});
|
|
18469
|
+
};
|
|
18453
18470
|
var readFile4 = async (ctx, cmd, parsed) => {
|
|
18454
18471
|
if (!parsed.path) {
|
|
18455
18472
|
await ctx.relay.sendResult(cmd.id, "failed", { error: "Missing path" });
|
|
@@ -19273,6 +19290,7 @@ var handlers = {
|
|
|
19273
19290
|
set_keep_alive: setKeepAlive,
|
|
19274
19291
|
session_terminated: sessionTerminated,
|
|
19275
19292
|
shutdown_session: shutdownSession,
|
|
19293
|
+
show_install_command: showInstallCommand,
|
|
19276
19294
|
read_file: readFile4,
|
|
19277
19295
|
write_file: writeFile3,
|
|
19278
19296
|
list_files: listFiles,
|
|
@@ -26284,6 +26302,25 @@ async function unsealAgentAuth(identity, sealedAgentAuth) {
|
|
|
26284
26302
|
}
|
|
26285
26303
|
return data;
|
|
26286
26304
|
}
|
|
26305
|
+
var PROGRESS_TIMEOUT_MS = 3e3;
|
|
26306
|
+
async function reportProgress(auth, step, message) {
|
|
26307
|
+
try {
|
|
26308
|
+
const controller = new AbortController();
|
|
26309
|
+
const timer = setTimeout(() => controller.abort(), PROGRESS_TIMEOUT_MS);
|
|
26310
|
+
timer.unref?.();
|
|
26311
|
+
try {
|
|
26312
|
+
await fetch(`${apiBase()}/api/self-hosted/enroll-progress`, {
|
|
26313
|
+
method: "POST",
|
|
26314
|
+
headers: { "Content-Type": "application/json", ...vercelBypassHeader() },
|
|
26315
|
+
body: JSON.stringify({ ...auth, step, message }),
|
|
26316
|
+
signal: controller.signal
|
|
26317
|
+
});
|
|
26318
|
+
} finally {
|
|
26319
|
+
clearTimeout(timer);
|
|
26320
|
+
}
|
|
26321
|
+
} catch {
|
|
26322
|
+
}
|
|
26323
|
+
}
|
|
26287
26324
|
|
|
26288
26325
|
// src/commands/host.ts
|
|
26289
26326
|
function readTokenFlag(args2) {
|
|
@@ -26486,6 +26523,8 @@ var HostAgentSupervisor = class {
|
|
|
26486
26523
|
resolveAgentAuth;
|
|
26487
26524
|
relay = null;
|
|
26488
26525
|
heartbeatTimer = null;
|
|
26526
|
+
/** Guards the one-shot 'connected' telemetry on the first heartbeat. */
|
|
26527
|
+
reportedConnected = false;
|
|
26489
26528
|
/** Open the control channel (reusing the relay) + start heartbeats. */
|
|
26490
26529
|
start() {
|
|
26491
26530
|
const make = this.deps.makeRelay ?? ((pluginId, onCommand, meta) => new CommandRelayService(pluginId, onCommand, meta));
|
|
@@ -26518,6 +26557,14 @@ var HostAgentSupervisor = class {
|
|
|
26518
26557
|
async beat() {
|
|
26519
26558
|
try {
|
|
26520
26559
|
await sendHostHeartbeat(this.identity);
|
|
26560
|
+
if (!this.reportedConnected) {
|
|
26561
|
+
this.reportedConnected = true;
|
|
26562
|
+
void reportProgress(
|
|
26563
|
+
{ hostId: this.identity.hostId, hostToken: this.identity.hostToken },
|
|
26564
|
+
"connected",
|
|
26565
|
+
"host-agent connected"
|
|
26566
|
+
);
|
|
26567
|
+
}
|
|
26521
26568
|
} catch (err) {
|
|
26522
26569
|
log.trace("host-agent", "heartbeat failed", err);
|
|
26523
26570
|
}
|
|
@@ -26624,8 +26671,14 @@ async function resolveHostIdentity(enrollToken) {
|
|
|
26624
26671
|
const existing = loadHostIdentity();
|
|
26625
26672
|
if (existing) return existing;
|
|
26626
26673
|
if (!enrollToken) return null;
|
|
26674
|
+
await reportProgress({ enrollToken }, "redeeming", "redeeming enrollment token\u2026");
|
|
26627
26675
|
const identity = await redeemEnrollToken(enrollToken);
|
|
26628
26676
|
saveHostIdentity(identity);
|
|
26677
|
+
await reportProgress(
|
|
26678
|
+
{ hostId: identity.hostId, hostToken: identity.hostToken },
|
|
26679
|
+
"enrolled",
|
|
26680
|
+
"host enrolled"
|
|
26681
|
+
);
|
|
26629
26682
|
return identity;
|
|
26630
26683
|
}
|
|
26631
26684
|
async function hostAgent(args2 = []) {
|
|
@@ -26822,7 +26875,7 @@ function checkChokidar() {
|
|
|
26822
26875
|
}
|
|
26823
26876
|
async function doctor(args2 = []) {
|
|
26824
26877
|
const json = args2.includes("--json");
|
|
26825
|
-
const cliVersion = true ? "2.39.
|
|
26878
|
+
const cliVersion = true ? "2.39.29" : "0.0.0-dev";
|
|
26826
26879
|
const apiBase2 = resolveApiBaseUrl();
|
|
26827
26880
|
const diagnosticId = (0, import_node_crypto8.randomUUID)();
|
|
26828
26881
|
log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
|
|
@@ -27021,7 +27074,7 @@ async function completion(args2) {
|
|
|
27021
27074
|
// src/commands/version.ts
|
|
27022
27075
|
var import_picocolors13 = __toESM(require("picocolors"));
|
|
27023
27076
|
function version2() {
|
|
27024
|
-
const v = true ? "2.39.
|
|
27077
|
+
const v = true ? "2.39.29" : "unknown";
|
|
27025
27078
|
console.log(`${import_picocolors13.default.bold("codeam-cli")} ${import_picocolors13.default.cyan(v)}`);
|
|
27026
27079
|
}
|
|
27027
27080
|
|
|
@@ -27307,7 +27360,7 @@ function checkForUpdates() {
|
|
|
27307
27360
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
27308
27361
|
if (process.env.CI) return;
|
|
27309
27362
|
if (!process.stdout.isTTY) return;
|
|
27310
|
-
const current = true ? "2.39.
|
|
27363
|
+
const current = true ? "2.39.29" : null;
|
|
27311
27364
|
if (!current) return;
|
|
27312
27365
|
const cache = readCache();
|
|
27313
27366
|
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.39.
|
|
3
|
+
"version": "2.39.29",
|
|
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",
|