codeam-cli 2.75.16 → 2.75.18
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 -17
- package/package.json +1 -1
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.75.17] — 2026-09-25
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **cli:** Host-agent respawns a session child that crashed after it was up
|
|
12
|
+
|
|
13
|
+
## [2.75.16] — 2026-09-25
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
|
|
17
|
+
- **cli:** One-shots (Preview detect, summaries) run as the CURRENT agent, not the deploy one
|
|
18
|
+
|
|
7
19
|
## [2.75.15] — 2026-09-25
|
|
8
20
|
|
|
9
21
|
### Fixed
|
package/dist/index.js
CHANGED
|
@@ -10509,7 +10509,7 @@ function readAnonId() {
|
|
|
10509
10509
|
}
|
|
10510
10510
|
function superProperties() {
|
|
10511
10511
|
return {
|
|
10512
|
-
cliVersion: true ? "2.75.
|
|
10512
|
+
cliVersion: true ? "2.75.18" : "0.0.0-dev",
|
|
10513
10513
|
nodeVersion: process.version,
|
|
10514
10514
|
platform: process.platform,
|
|
10515
10515
|
arch: process.arch,
|
|
@@ -10751,7 +10751,7 @@ var http = __toESM(require("http"));
|
|
|
10751
10751
|
// package.json
|
|
10752
10752
|
var package_default = {
|
|
10753
10753
|
name: "codeam-cli",
|
|
10754
|
-
version: "2.75.
|
|
10754
|
+
version: "2.75.18",
|
|
10755
10755
|
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.",
|
|
10756
10756
|
type: "commonjs",
|
|
10757
10757
|
main: "dist/index.js",
|
|
@@ -12081,7 +12081,7 @@ var CommandRelayService = class _CommandRelayService {
|
|
|
12081
12081
|
// fresh + clear the "CLI update available" banner after a self-update
|
|
12082
12082
|
// (a codespace that reinstalls @latest reconnects via heartbeat, not
|
|
12083
12083
|
// pair/reconnect). Older backends ignore the extra field.
|
|
12084
|
-
..."2.75.
|
|
12084
|
+
..."2.75.18" ? { ideVersion: "2.75.18" } : {}
|
|
12085
12085
|
};
|
|
12086
12086
|
try {
|
|
12087
12087
|
const res = await _postJson(`${API_BASE2}/api/plugin/heartbeat`, body);
|
|
@@ -25634,8 +25634,25 @@ var _provisionSeam = {
|
|
|
25634
25634
|
/** GAP 1 — symlink the resolved bd onto PATH for the agent's own shell. */
|
|
25635
25635
|
linkBdOntoPath,
|
|
25636
25636
|
/** Silence bd's `beads.role not configured` warning. */
|
|
25637
|
-
setGitBeadsRole
|
|
25637
|
+
setGitBeadsRole,
|
|
25638
|
+
/** Does the project's git remote carry Dolt data (`refs/dolt/data`)? */
|
|
25639
|
+
remoteHasDoltData
|
|
25638
25640
|
};
|
|
25641
|
+
function remoteHasDoltData(cwd) {
|
|
25642
|
+
try {
|
|
25643
|
+
const out2 = (0, import_child_process24.execFileSync)("git", ["ls-remote", "origin", "refs/dolt/data"], {
|
|
25644
|
+
cwd,
|
|
25645
|
+
encoding: "utf8",
|
|
25646
|
+
timeout: 1e4,
|
|
25647
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
25648
|
+
// Never block on a credential prompt in a headless box.
|
|
25649
|
+
env: { ...process.env, GIT_TERMINAL_PROMPT: "0" }
|
|
25650
|
+
});
|
|
25651
|
+
return out2.trim().length > 0;
|
|
25652
|
+
} catch {
|
|
25653
|
+
return null;
|
|
25654
|
+
}
|
|
25655
|
+
}
|
|
25639
25656
|
var _linkSeam = {
|
|
25640
25657
|
platform: () => process.platform,
|
|
25641
25658
|
homedir: () => os33.homedir(),
|
|
@@ -25816,12 +25833,16 @@ async function provisionBeads(opts = {}) {
|
|
|
25816
25833
|
"beads",
|
|
25817
25834
|
`prefix DB '${prefix}' not reachable on shared server \u2014 self-healing via bd bootstrap`
|
|
25818
25835
|
);
|
|
25819
|
-
|
|
25820
|
-
|
|
25821
|
-
|
|
25822
|
-
|
|
25823
|
-
|
|
25824
|
-
|
|
25836
|
+
if (_provisionSeam.remoteHasDoltData(opts.cwd) === false) {
|
|
25837
|
+
log.info("beads", "remote has no Dolt data \u2014 skipping bd bootstrap");
|
|
25838
|
+
} else {
|
|
25839
|
+
const boot = await bd.run(["bootstrap", "--non-interactive"]);
|
|
25840
|
+
if (boot.code !== 0) {
|
|
25841
|
+
log.warn(
|
|
25842
|
+
"beads",
|
|
25843
|
+
`bd bootstrap failed (code=${boot.code}): ${boot.stderr.slice(0, 200)} \u2014 prefix DB may be absent`
|
|
25844
|
+
);
|
|
25845
|
+
}
|
|
25825
25846
|
}
|
|
25826
25847
|
if (!await projectDbReachable(bd)) {
|
|
25827
25848
|
log.info(
|
|
@@ -25836,6 +25857,12 @@ async function provisionBeads(opts = {}) {
|
|
|
25836
25857
|
"--reinit-local",
|
|
25837
25858
|
"--discard-remote",
|
|
25838
25859
|
`--destroy-token=DESTROY-${prefix}`,
|
|
25860
|
+
// Same as Step 3: without these the mint wrote AGENTS.md/CLAUDE.md,
|
|
25861
|
+
// .codex/.cursor setup and set core.hooksPath to .beads/hooks in the
|
|
25862
|
+
// USER's repo — whose LFS-wrapped pre-push then blocked every
|
|
25863
|
+
// `git push` on a box without git-lfs (fleet box 2026-09-24).
|
|
25864
|
+
"--skip-agents",
|
|
25865
|
+
"--skip-hooks",
|
|
25839
25866
|
"--non-interactive"
|
|
25840
25867
|
]);
|
|
25841
25868
|
if (mint.code !== 0) {
|
|
@@ -42815,6 +42842,11 @@ This environment uses **bd (beads)** for issue/task tracking and persistent memo
|
|
|
42815
42842
|
- Use \`bd remember "..."\` for persistent knowledge \u2014 do NOT use MEMORY.md files.
|
|
42816
42843
|
- Run \`bd\` commands through your shell tool and summarize the outcome. Never
|
|
42817
42844
|
paste \`bd\` commands or their raw output into your reply.
|
|
42845
|
+
- CodeAgent installs, starts and repairs beads \u2014 not you. If a \`bd\` command
|
|
42846
|
+
fails, carry on with the user's task without task tracking and try \`bd\`
|
|
42847
|
+
again later. Never run \`bd init\`, \`bd bootstrap\`, \`bd doctor --fix\` or
|
|
42848
|
+
\`dolt\` commands yourself: they race the provisioning and can wipe the
|
|
42849
|
+
project's issues.
|
|
42818
42850
|
${BEADS_HINT_MARKER}`;
|
|
42819
42851
|
function ensureBeadsWorkflowHint(homeDir2 = os53.homedir()) {
|
|
42820
42852
|
try {
|
|
@@ -47616,7 +47648,7 @@ async function autoUpgradeBeforeCriticalCommand() {
|
|
|
47616
47648
|
if (process.env.NODE_ENV === "test") return;
|
|
47617
47649
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
47618
47650
|
if (process.env.CI) return;
|
|
47619
|
-
const current2 = true ? "2.75.
|
|
47651
|
+
const current2 = true ? "2.75.18" : null;
|
|
47620
47652
|
if (!current2) return;
|
|
47621
47653
|
const cache = readCache();
|
|
47622
47654
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -47633,7 +47665,7 @@ function checkForUpdates() {
|
|
|
47633
47665
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
47634
47666
|
if (process.env.CI) return;
|
|
47635
47667
|
if (!process.stdout.isTTY) return;
|
|
47636
|
-
const current2 = true ? "2.75.
|
|
47668
|
+
const current2 = true ? "2.75.18" : null;
|
|
47637
47669
|
if (!current2) return;
|
|
47638
47670
|
const cache = readCache();
|
|
47639
47671
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -47656,7 +47688,7 @@ var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
|
|
|
47656
47688
|
var SELF_UPDATE_LS_TIMEOUT_MS = 15e3;
|
|
47657
47689
|
var SUDO_PREFLIGHT_TIMEOUT_MS = 5e3;
|
|
47658
47690
|
function currentCliVersion() {
|
|
47659
|
-
return true ? "2.75.
|
|
47691
|
+
return true ? "2.75.18" : null;
|
|
47660
47692
|
}
|
|
47661
47693
|
async function installedVersion(deps) {
|
|
47662
47694
|
const ls = await deps.run(
|
|
@@ -47768,6 +47800,7 @@ var defaultDisableService = () => {
|
|
|
47768
47800
|
// src/commands/host-agent.ts
|
|
47769
47801
|
var HEARTBEAT_INTERVAL_MS = 2e4;
|
|
47770
47802
|
var RESUME_RETRY_BACKOFF_MS = [15e3, 3e4, 6e4, 12e4];
|
|
47803
|
+
var CRASH_RESPAWN_MIN_UPTIME_MS = 6e4;
|
|
47771
47804
|
var RESUME_REPROBE_INTERVAL_MS = 5 * 6e4;
|
|
47772
47805
|
var RESUME_HEALTHY_AFTER_MS = 10 * 6e4;
|
|
47773
47806
|
function isRefreshCredentialsPayload(p2) {
|
|
@@ -48846,8 +48879,9 @@ var HostAgentSupervisor = class {
|
|
|
48846
48879
|
proc.stdout?.on("data", appendTail);
|
|
48847
48880
|
proc.stderr?.on("data", appendTail);
|
|
48848
48881
|
report("agent_starting", "agent process started");
|
|
48849
|
-
proc.once("exit", (code) => {
|
|
48882
|
+
proc.once("exit", (code, signal) => {
|
|
48850
48883
|
const tracked = this.untrackChild(payload.deployId, proc);
|
|
48884
|
+
if (tracked && this.respawnCrashedChild(child, code, signal, tail)) return;
|
|
48851
48885
|
if (tracked) {
|
|
48852
48886
|
void reportSessionEvent(
|
|
48853
48887
|
{ hostId: this.identity.hostId, hostToken: this.identity.hostToken },
|
|
@@ -49008,11 +49042,15 @@ var HostAgentSupervisor = class {
|
|
|
49008
49042
|
proc.stdout?.on("data", appendTail);
|
|
49009
49043
|
proc.stderr?.on("data", appendTail);
|
|
49010
49044
|
proc.once("exit", (code, signal) => {
|
|
49011
|
-
this.untrackChild(deployId, proc);
|
|
49045
|
+
const tracked = this.untrackChild(deployId, proc);
|
|
49012
49046
|
if (typeof code === "number" && code !== 0) {
|
|
49013
49047
|
this.onResumeChildExit(target, code, tail.trim().slice(-300));
|
|
49014
49048
|
return;
|
|
49015
49049
|
}
|
|
49050
|
+
if (tracked && signal) {
|
|
49051
|
+
this.onResumeChildExit(target, 128 + (os62.constants.signals[signal] ?? 9), `signal ${signal}`);
|
|
49052
|
+
return;
|
|
49053
|
+
}
|
|
49016
49054
|
log.warn(
|
|
49017
49055
|
"host-agent",
|
|
49018
49056
|
`resumed session ${session.id.slice(0, 8)} exited ${signal ?? code ?? 0} without taking over \u2014 tail: ${tail.trim().slice(-300) || "(no output)"}`
|
|
@@ -49042,6 +49080,25 @@ var HostAgentSupervisor = class {
|
|
|
49042
49080
|
* ({@link resumeRecoveryTick}) so an externally-fixed cause heals without a
|
|
49043
49081
|
* manual restart.
|
|
49044
49082
|
*/
|
|
49083
|
+
/**
|
|
49084
|
+
* A deploy child that was UP (≥ {@link CRASH_RESPAWN_MIN_UPTIME_MS}) died on
|
|
49085
|
+
* its own → resume its paired session with the bounded retry path. Returns
|
|
49086
|
+
* false when it must be treated as before (early start failure, supervisor
|
|
49087
|
+
* stopping, or no saved paired session for that workspace).
|
|
49088
|
+
*/
|
|
49089
|
+
respawnCrashedChild(child, code, signal, tail) {
|
|
49090
|
+
if (this.stopped) return false;
|
|
49091
|
+
if (Date.now() - child.startedAt < CRASH_RESPAWN_MIN_UPTIME_MS) return false;
|
|
49092
|
+
const session = pickSavedSessionForWorkspace(this.listSavedSessions(), child.cwd);
|
|
49093
|
+
if (!session) return false;
|
|
49094
|
+
const exitCode = typeof code === "number" ? code : 128 + (signal ? os62.constants.signals[signal] ?? 9 : 9);
|
|
49095
|
+
log.warn(
|
|
49096
|
+
"host-agent",
|
|
49097
|
+
`session deploy=${child.deployId.slice(0, 8)} died (${signal ?? code}) after ${Math.round((Date.now() - child.startedAt) / 1e3)}s \u2014 respawning it (resume)`
|
|
49098
|
+
);
|
|
49099
|
+
this.onResumeChildExit({ deployId: child.deployId, cwd: child.cwd, session }, exitCode, tail.trim().slice(-300));
|
|
49100
|
+
return true;
|
|
49101
|
+
}
|
|
49045
49102
|
onResumeChildExit(target, code, detail) {
|
|
49046
49103
|
if (this.stopped) return;
|
|
49047
49104
|
const { session } = target;
|
|
@@ -49517,7 +49574,7 @@ function checkChokidar() {
|
|
|
49517
49574
|
}
|
|
49518
49575
|
async function doctor(args2 = []) {
|
|
49519
49576
|
const json = args2.includes("--json");
|
|
49520
|
-
const cliVersion = true ? "2.75.
|
|
49577
|
+
const cliVersion = true ? "2.75.18" : "0.0.0-dev";
|
|
49521
49578
|
const apiBase2 = resolveApiBaseUrl();
|
|
49522
49579
|
const diagnosticId = (0, import_node_crypto12.randomUUID)();
|
|
49523
49580
|
log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
|
|
@@ -50041,7 +50098,7 @@ async function mcpWarm(argv = [], opts = {}) {
|
|
|
50041
50098
|
// src/commands/version.ts
|
|
50042
50099
|
var import_picocolors15 = __toESM(require("picocolors"));
|
|
50043
50100
|
function version2() {
|
|
50044
|
-
const v = true ? "2.75.
|
|
50101
|
+
const v = true ? "2.75.18" : "unknown";
|
|
50045
50102
|
console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
|
|
50046
50103
|
}
|
|
50047
50104
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codeam-cli",
|
|
3
|
-
"version": "2.75.
|
|
3
|
+
"version": "2.75.18",
|
|
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",
|