codeam-cli 2.61.8 → 2.61.9
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 +14 -0
- package/dist/index.js +41 -14
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,20 @@ 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.61.8] — 2026-07-16
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **cli:** Agent-agnostic RECENT list + auto-resume latest conversation (ACP session/list)
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
|
|
15
|
+
- **cli:** Wrap public loadSession() with the load-replay guard (keystone)
|
|
16
|
+
|
|
17
|
+
### Tests
|
|
18
|
+
|
|
19
|
+
- **cli:** Harness invariant — no unguarded connection.loadSession
|
|
20
|
+
|
|
7
21
|
## [2.61.7] — 2026-07-16
|
|
8
22
|
|
|
9
23
|
### Fixed
|
package/dist/index.js
CHANGED
|
@@ -5975,7 +5975,7 @@ function readAnonId() {
|
|
|
5975
5975
|
}
|
|
5976
5976
|
function superProperties() {
|
|
5977
5977
|
return {
|
|
5978
|
-
cliVersion: true ? "2.61.
|
|
5978
|
+
cliVersion: true ? "2.61.9" : "0.0.0-dev",
|
|
5979
5979
|
nodeVersion: process.version,
|
|
5980
5980
|
platform: process.platform,
|
|
5981
5981
|
arch: process.arch,
|
|
@@ -6156,7 +6156,7 @@ var os4 = __toESM(require("os"));
|
|
|
6156
6156
|
// package.json
|
|
6157
6157
|
var package_default = {
|
|
6158
6158
|
name: "codeam-cli",
|
|
6159
|
-
version: "2.61.
|
|
6159
|
+
version: "2.61.9",
|
|
6160
6160
|
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.",
|
|
6161
6161
|
type: "commonjs",
|
|
6162
6162
|
main: "dist/index.js",
|
|
@@ -7299,7 +7299,7 @@ var CommandRelayService = class _CommandRelayService {
|
|
|
7299
7299
|
// fresh + clear the "CLI update available" banner after a self-update
|
|
7300
7300
|
// (a codespace that reinstalls @latest reconnects via heartbeat, not
|
|
7301
7301
|
// pair/reconnect). Older backends ignore the extra field.
|
|
7302
|
-
..."2.61.
|
|
7302
|
+
..."2.61.9" ? { ideVersion: "2.61.9" } : {}
|
|
7303
7303
|
}).then(() => log.trace("relay", `heartbeat ok online=${online}`)).catch((err) => log.trace("relay", `heartbeat failed online=${online}`, err));
|
|
7304
7304
|
}
|
|
7305
7305
|
/**
|
|
@@ -17900,7 +17900,7 @@ async function autoUpgradeBeforeCriticalCommand() {
|
|
|
17900
17900
|
if (process.env.NODE_ENV === "test") return;
|
|
17901
17901
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
17902
17902
|
if (process.env.CI) return;
|
|
17903
|
-
const current = true ? "2.61.
|
|
17903
|
+
const current = true ? "2.61.9" : null;
|
|
17904
17904
|
if (!current) return;
|
|
17905
17905
|
const cache = readCache();
|
|
17906
17906
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -17917,7 +17917,7 @@ function checkForUpdates() {
|
|
|
17917
17917
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
17918
17918
|
if (process.env.CI) return;
|
|
17919
17919
|
if (!process.stdout.isTTY) return;
|
|
17920
|
-
const current = true ? "2.61.
|
|
17920
|
+
const current = true ? "2.61.9" : null;
|
|
17921
17921
|
if (!current) return;
|
|
17922
17922
|
const cache = readCache();
|
|
17923
17923
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -17937,7 +17937,7 @@ var SELF_UPDATE_INTERVAL_MS = 60 * 60 * 1e3;
|
|
|
17937
17937
|
var SELF_UPDATE_VIEW_TIMEOUT_MS = 3e4;
|
|
17938
17938
|
var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
|
|
17939
17939
|
function currentCliVersion() {
|
|
17940
|
-
return true ? "2.61.
|
|
17940
|
+
return true ? "2.61.9" : null;
|
|
17941
17941
|
}
|
|
17942
17942
|
function runCmd(cmd, args2, timeoutMs) {
|
|
17943
17943
|
return new Promise((resolve8) => {
|
|
@@ -22598,16 +22598,23 @@ function buildNpmInstallInvocation(opts) {
|
|
|
22598
22598
|
path59.dirname(execPath),
|
|
22599
22599
|
process.platform === "win32" ? "npm.cmd" : "npm"
|
|
22600
22600
|
);
|
|
22601
|
-
const
|
|
22602
|
-
const
|
|
22603
|
-
|
|
22601
|
+
const npmCommand = exists2(siblingNpm) ? siblingNpm : "npm";
|
|
22602
|
+
const npmArgs = prefix ? ["install", "-g", "--prefix", prefix, "codeam-cli@latest"] : ["install", "-g", "codeam-cli@latest"];
|
|
22603
|
+
if (opts?.sudo) {
|
|
22604
|
+
return { command: "sudo", args: ["-n", npmCommand, ...npmArgs] };
|
|
22605
|
+
}
|
|
22606
|
+
return { command: npmCommand, args: npmArgs };
|
|
22607
|
+
}
|
|
22608
|
+
function isPermissionError(stderr) {
|
|
22609
|
+
return /EACCES|permission denied|errno[\s"']*-13|operation not permitted/i.test(stderr);
|
|
22604
22610
|
}
|
|
22605
22611
|
async function runNpmInstallLatest() {
|
|
22606
22612
|
let lastError = "";
|
|
22607
|
-
|
|
22608
|
-
const useShell = process.platform === "win32";
|
|
22609
|
-
const command2 = useShell && invocation.command.includes(" ") ? `"${invocation.command}"` : invocation.command;
|
|
22613
|
+
let useSudo = false;
|
|
22610
22614
|
for (let attempt = 1; attempt <= CLI_UPDATE_MAX_ATTEMPTS; attempt++) {
|
|
22615
|
+
const invocation = buildNpmInstallInvocation({ sudo: useSudo });
|
|
22616
|
+
const useShell = process.platform === "win32";
|
|
22617
|
+
const command2 = useShell && invocation.command.includes(" ") ? `"${invocation.command}"` : invocation.command;
|
|
22611
22618
|
const result = await new Promise((resolve8) => {
|
|
22612
22619
|
(0, import_child_process24.execFile)(
|
|
22613
22620
|
command2,
|
|
@@ -22624,6 +22631,10 @@ async function runNpmInstallLatest() {
|
|
|
22624
22631
|
});
|
|
22625
22632
|
if (result.ok) return { ok: true };
|
|
22626
22633
|
lastError = result.error ?? "unknown";
|
|
22634
|
+
if (!useSudo && process.platform !== "win32" && isPermissionError(lastError)) {
|
|
22635
|
+
useSudo = true;
|
|
22636
|
+
continue;
|
|
22637
|
+
}
|
|
22627
22638
|
if (attempt < CLI_UPDATE_MAX_ATTEMPTS) {
|
|
22628
22639
|
await new Promise((r) => setTimeout(r, 1e3 * attempt));
|
|
22629
22640
|
}
|
|
@@ -32623,6 +32634,22 @@ async function runAcpSession(opts) {
|
|
|
32623
32634
|
const jsonlHistory = new HistoryService(runtime, opts.pluginId, opts.cwd, {
|
|
32624
32635
|
pluginAuthToken: opts.pluginAuthToken
|
|
32625
32636
|
});
|
|
32637
|
+
void (async () => {
|
|
32638
|
+
try {
|
|
32639
|
+
const listed = await client3.listSessions();
|
|
32640
|
+
if (listed && listed.length > 0) {
|
|
32641
|
+
await publisher.pushSessionList({ agentId: opts.agent, sessions: listed });
|
|
32642
|
+
log.info("acpRunner", `session-start: pushed ${listed.length} conversation(s) to RECENT`);
|
|
32643
|
+
}
|
|
32644
|
+
const uploaded = await jsonlHistory.uploadConversationIfChanged(acpSessionId);
|
|
32645
|
+
log.info(
|
|
32646
|
+
"acpRunner",
|
|
32647
|
+
`session-start: transcript upload ${acpSessionId.slice(0, 8)} \u2192 ${uploaded}`
|
|
32648
|
+
);
|
|
32649
|
+
} catch (err) {
|
|
32650
|
+
log.warn("acpRunner", `session-start push failed (best-effort): ${describeError(err)}`);
|
|
32651
|
+
}
|
|
32652
|
+
})();
|
|
32626
32653
|
const onboardingWelcomeDone = maybeSendOnboardingWelcome({
|
|
32627
32654
|
streaming,
|
|
32628
32655
|
history,
|
|
@@ -37394,7 +37421,7 @@ function checkChokidar() {
|
|
|
37394
37421
|
}
|
|
37395
37422
|
async function doctor(args2 = []) {
|
|
37396
37423
|
const json = args2.includes("--json");
|
|
37397
|
-
const cliVersion = true ? "2.61.
|
|
37424
|
+
const cliVersion = true ? "2.61.9" : "0.0.0-dev";
|
|
37398
37425
|
const apiBase2 = resolveApiBaseUrl();
|
|
37399
37426
|
const diagnosticId = (0, import_node_crypto12.randomUUID)();
|
|
37400
37427
|
log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
|
|
@@ -37905,7 +37932,7 @@ async function mcpRun(args2) {
|
|
|
37905
37932
|
// src/commands/version.ts
|
|
37906
37933
|
var import_picocolors15 = __toESM(require("picocolors"));
|
|
37907
37934
|
function version2() {
|
|
37908
|
-
const v = true ? "2.61.
|
|
37935
|
+
const v = true ? "2.61.9" : "unknown";
|
|
37909
37936
|
console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
|
|
37910
37937
|
}
|
|
37911
37938
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codeam-cli",
|
|
3
|
-
"version": "2.61.
|
|
3
|
+
"version": "2.61.9",
|
|
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",
|