codeam-cli 2.60.34 → 2.60.35
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 +142 -82
- 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.60.34] — 2026-07-10
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **cli:** CodeRabbit session-relay OAuth — deliver mobile-intercepted redirect to host loopback
|
|
12
|
+
|
|
7
13
|
## [2.60.33] — 2026-07-10
|
|
8
14
|
|
|
9
15
|
### Fixed
|
package/dist/index.js
CHANGED
|
@@ -5689,7 +5689,7 @@ function readAnonId() {
|
|
|
5689
5689
|
}
|
|
5690
5690
|
function superProperties() {
|
|
5691
5691
|
return {
|
|
5692
|
-
cliVersion: true ? "2.60.
|
|
5692
|
+
cliVersion: true ? "2.60.35" : "0.0.0-dev",
|
|
5693
5693
|
nodeVersion: process.version,
|
|
5694
5694
|
platform: process.platform,
|
|
5695
5695
|
arch: process.arch,
|
|
@@ -5870,7 +5870,7 @@ var os4 = __toESM(require("os"));
|
|
|
5870
5870
|
// package.json
|
|
5871
5871
|
var package_default = {
|
|
5872
5872
|
name: "codeam-cli",
|
|
5873
|
-
version: "2.60.
|
|
5873
|
+
version: "2.60.35",
|
|
5874
5874
|
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.",
|
|
5875
5875
|
type: "commonjs",
|
|
5876
5876
|
main: "dist/index.js",
|
|
@@ -6963,7 +6963,7 @@ var CommandRelayService = class {
|
|
|
6963
6963
|
// fresh + clear the "CLI update available" banner after a self-update
|
|
6964
6964
|
// (a codespace that reinstalls @latest reconnects via heartbeat, not
|
|
6965
6965
|
// pair/reconnect). Older backends ignore the extra field.
|
|
6966
|
-
..."2.60.
|
|
6966
|
+
..."2.60.35" ? { ideVersion: "2.60.35" } : {}
|
|
6967
6967
|
}).then(() => log.trace("relay", `heartbeat ok online=${online}`)).catch((err) => log.trace("relay", `heartbeat failed online=${online}`, err));
|
|
6968
6968
|
}
|
|
6969
6969
|
/**
|
|
@@ -15413,16 +15413,16 @@ async function linkDryRunPreflight(ctx) {
|
|
|
15413
15413
|
}
|
|
15414
15414
|
|
|
15415
15415
|
// src/agents/coderabbit/configure.ts
|
|
15416
|
-
var
|
|
15416
|
+
var import_node_child_process15 = require("child_process");
|
|
15417
15417
|
var path36 = __toESM(require("path"));
|
|
15418
15418
|
|
|
15419
15419
|
// src/agents/coderabbit/oauth.ts
|
|
15420
|
+
var import_node_child_process14 = require("child_process");
|
|
15420
15421
|
var fs31 = __toESM(require("fs"));
|
|
15421
|
-
var http6 = __toESM(require("http"));
|
|
15422
15422
|
var os27 = __toESM(require("os"));
|
|
15423
15423
|
var path35 = __toESM(require("path"));
|
|
15424
15424
|
function parseCoderabbitAuthEvent(line) {
|
|
15425
|
-
const l = line.trim();
|
|
15425
|
+
const l = line.replace(/\x1b\[[0-9;?]*[A-Za-z]/g, "").trim();
|
|
15426
15426
|
if (!l || l[0] !== "{") return null;
|
|
15427
15427
|
let rec;
|
|
15428
15428
|
try {
|
|
@@ -15456,8 +15456,64 @@ function parseCoderabbitAuthEvent(line) {
|
|
|
15456
15456
|
return rec.status ? { kind: "other", status: rec.status } : null;
|
|
15457
15457
|
}
|
|
15458
15458
|
}
|
|
15459
|
+
function resolvePython() {
|
|
15460
|
+
for (const bin of ["python3", "python"]) {
|
|
15461
|
+
try {
|
|
15462
|
+
const r = (0, import_node_child_process14.spawnSync)(bin, ["--version"], { stdio: "ignore", timeout: 4e3 });
|
|
15463
|
+
if (!r.error && r.status === 0) return bin;
|
|
15464
|
+
} catch {
|
|
15465
|
+
}
|
|
15466
|
+
}
|
|
15467
|
+
return null;
|
|
15468
|
+
}
|
|
15469
|
+
function spawnCoderabbitLoginProc(cmd, args2) {
|
|
15470
|
+
const python = resolvePython();
|
|
15471
|
+
if (python) {
|
|
15472
|
+
const helper = path35.join(os27.tmpdir(), "codeam-cr-pty.py");
|
|
15473
|
+
fs31.writeFileSync(helper, PYTHON_PTY_HELPER, { mode: 420 });
|
|
15474
|
+
return (0, import_node_child_process14.spawn)(python, [helper, cmd, ...args2], {
|
|
15475
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
15476
|
+
env: { ...process.env, TERM: "xterm-256color", COLUMNS: "220", LINES: "50" },
|
|
15477
|
+
shell: false
|
|
15478
|
+
});
|
|
15479
|
+
}
|
|
15480
|
+
return (0, import_node_child_process14.spawn)(cmd, args2, { stdio: ["pipe", "pipe", "pipe"], shell: false });
|
|
15481
|
+
}
|
|
15482
|
+
var pendingCoderabbitLogin = null;
|
|
15483
|
+
function setPendingCoderabbitLogin(handle) {
|
|
15484
|
+
pendingCoderabbitLogin = handle;
|
|
15485
|
+
}
|
|
15486
|
+
function normalizeCoderabbitCallback(input) {
|
|
15487
|
+
const s = (input ?? "").trim();
|
|
15488
|
+
if (!s) return null;
|
|
15489
|
+
if (/^coderabbit-cli:\/\/auth-callback/i.test(s) || /^http:\/\/(127\.0\.0\.1|localhost|\[::1\])(:\d+)?\//i.test(s)) {
|
|
15490
|
+
return s;
|
|
15491
|
+
}
|
|
15492
|
+
if (/^[A-Za-z0-9+/=]+$/.test(s) && s.length >= 40) {
|
|
15493
|
+
try {
|
|
15494
|
+
const decoded = Buffer.from(s, "base64").toString("utf8");
|
|
15495
|
+
if (/^coderabbit-cli:\/\/auth-callback/i.test(decoded)) return decoded;
|
|
15496
|
+
} catch {
|
|
15497
|
+
}
|
|
15498
|
+
}
|
|
15499
|
+
return null;
|
|
15500
|
+
}
|
|
15501
|
+
function deliverPendingCoderabbitCallback(callbackUrl) {
|
|
15502
|
+
const url = normalizeCoderabbitCallback(callbackUrl);
|
|
15503
|
+
if (!url) return { ok: false, error: "not a CodeRabbit callback token/URL" };
|
|
15504
|
+
if (!pendingCoderabbitLogin) {
|
|
15505
|
+
return { ok: false, error: "no CodeRabbit login is awaiting a callback" };
|
|
15506
|
+
}
|
|
15507
|
+
try {
|
|
15508
|
+
pendingCoderabbitLogin.deliver(url);
|
|
15509
|
+
return { ok: true };
|
|
15510
|
+
} catch (err) {
|
|
15511
|
+
return { ok: false, error: err instanceof Error ? err.message : "deliver failed" };
|
|
15512
|
+
}
|
|
15513
|
+
}
|
|
15459
15514
|
function runCoderabbitOAuthLogin(deps) {
|
|
15460
15515
|
const timeoutMs = deps.timeoutMs ?? 18e4;
|
|
15516
|
+
const spawnProc = deps.spawn ?? spawnCoderabbitLoginProc;
|
|
15461
15517
|
return new Promise((resolve7) => {
|
|
15462
15518
|
let settled = false;
|
|
15463
15519
|
let stdout = "";
|
|
@@ -15466,6 +15522,7 @@ function runCoderabbitOAuthLogin(deps) {
|
|
|
15466
15522
|
if (settled) return;
|
|
15467
15523
|
settled = true;
|
|
15468
15524
|
clearTimeout(timer);
|
|
15525
|
+
setPendingCoderabbitLogin(null);
|
|
15469
15526
|
try {
|
|
15470
15527
|
child.kill("SIGKILL");
|
|
15471
15528
|
} catch {
|
|
@@ -15474,7 +15531,7 @@ function runCoderabbitOAuthLogin(deps) {
|
|
|
15474
15531
|
};
|
|
15475
15532
|
let child;
|
|
15476
15533
|
try {
|
|
15477
|
-
child =
|
|
15534
|
+
child = spawnProc("coderabbit", ["auth", "login", "--agent"]);
|
|
15478
15535
|
} catch (err) {
|
|
15479
15536
|
resolve7({ ok: false, error: err instanceof Error ? err.message : "spawn failed" });
|
|
15480
15537
|
return;
|
|
@@ -15487,7 +15544,14 @@ function runCoderabbitOAuthLogin(deps) {
|
|
|
15487
15544
|
const e = parseCoderabbitAuthEvent(line);
|
|
15488
15545
|
if (!e) return;
|
|
15489
15546
|
deps.onEvent?.(e);
|
|
15490
|
-
if (e.kind === "
|
|
15547
|
+
if (e.kind === "awaiting_browser") {
|
|
15548
|
+
setPendingCoderabbitLogin({
|
|
15549
|
+
deliver: (callbackUrl) => {
|
|
15550
|
+
child.stdin?.write(`${callbackUrl}
|
|
15551
|
+
`);
|
|
15552
|
+
}
|
|
15553
|
+
});
|
|
15554
|
+
} else if (e.kind === "authenticated") {
|
|
15491
15555
|
last = e;
|
|
15492
15556
|
finish({ ok: true, user: e.user, authType: e.authType, provider: e.provider, org: e.org });
|
|
15493
15557
|
} else if (e.kind === "failed") {
|
|
@@ -15550,38 +15614,10 @@ function diffCapturedCredential(before, home) {
|
|
|
15550
15614
|
return null;
|
|
15551
15615
|
}
|
|
15552
15616
|
}
|
|
15553
|
-
function deliverLoopbackCallback(callbackUrl, opts = {}) {
|
|
15554
|
-
return new Promise((resolve7) => {
|
|
15555
|
-
let url;
|
|
15556
|
-
try {
|
|
15557
|
-
url = new URL(callbackUrl);
|
|
15558
|
-
} catch {
|
|
15559
|
-
resolve7({ ok: false, error: "invalid callback URL" });
|
|
15560
|
-
return;
|
|
15561
|
-
}
|
|
15562
|
-
const host2 = url.hostname.replace(/^\[|\]$/g, "");
|
|
15563
|
-
const isLoopback = url.protocol === "http:" && (host2 === "127.0.0.1" || host2 === "localhost" || host2 === "::1");
|
|
15564
|
-
if (!isLoopback) {
|
|
15565
|
-
resolve7({ ok: false, error: `refusing non-loopback callback host: ${url.hostname}` });
|
|
15566
|
-
return;
|
|
15567
|
-
}
|
|
15568
|
-
const get3 = opts.get ?? http6.get;
|
|
15569
|
-
const req = get3(url, { timeout: opts.timeoutMs ?? 1e4 }, (res) => {
|
|
15570
|
-
res.resume();
|
|
15571
|
-
const status2 = res.statusCode ?? 0;
|
|
15572
|
-
resolve7({ ok: status2 >= 200 && status2 < 400, status: status2 });
|
|
15573
|
-
});
|
|
15574
|
-
req.on("timeout", () => {
|
|
15575
|
-
req.destroy();
|
|
15576
|
-
resolve7({ ok: false, error: "callback delivery timed out" });
|
|
15577
|
-
});
|
|
15578
|
-
req.on("error", (err) => resolve7({ ok: false, error: err.message }));
|
|
15579
|
-
});
|
|
15580
|
-
}
|
|
15581
15617
|
|
|
15582
15618
|
// src/agents/coderabbit/configure.ts
|
|
15583
15619
|
function defaultIsLoggedIn() {
|
|
15584
|
-
const r = (0,
|
|
15620
|
+
const r = (0, import_node_child_process15.spawnSync)("coderabbit", ["auth", "status", "--agent"], {
|
|
15585
15621
|
encoding: "utf8",
|
|
15586
15622
|
timeout: 15e3
|
|
15587
15623
|
});
|
|
@@ -15598,6 +15634,18 @@ function defaultIsLoggedIn() {
|
|
|
15598
15634
|
}
|
|
15599
15635
|
return false;
|
|
15600
15636
|
}
|
|
15637
|
+
function defaultLoginWithApiKey(key) {
|
|
15638
|
+
const r = (0, import_node_child_process15.spawnSync)("coderabbit", ["auth", "login", "--api-key", key], {
|
|
15639
|
+
encoding: "utf8",
|
|
15640
|
+
timeout: 3e4
|
|
15641
|
+
});
|
|
15642
|
+
const out2 = `${typeof r.stdout === "string" ? r.stdout : ""}${typeof r.stderr === "string" ? r.stderr : ""}`;
|
|
15643
|
+
if (r.error) return { ok: false, error: r.error.message };
|
|
15644
|
+
const failLine = out2.match(/API key authentication failed:[^\n]*/i);
|
|
15645
|
+
if (failLine) return { ok: false, error: failLine[0].replace(/^[✗\s]+/, "").trim() };
|
|
15646
|
+
if (r.status !== 0) return { ok: false, error: out2.trim() || "API key authentication failed" };
|
|
15647
|
+
return { ok: true };
|
|
15648
|
+
}
|
|
15601
15649
|
async function configureCoderabbit(input, deps = {}) {
|
|
15602
15650
|
const os50 = deps.os ?? createOsStrategy();
|
|
15603
15651
|
const ensureInstalled = deps.ensureInstalled ?? ensureCoderabbitInstalled;
|
|
@@ -15605,6 +15653,7 @@ async function configureCoderabbit(input, deps = {}) {
|
|
|
15605
15653
|
const runOAuth = deps.runOAuthLogin ?? runCoderabbitOAuthLogin;
|
|
15606
15654
|
const snapshot = deps.snapshotDir ?? (() => snapshotCredentialDir());
|
|
15607
15655
|
const capture2 = deps.captureCredential ?? ((b) => diffCapturedCredential(b));
|
|
15656
|
+
const loginWithApiKey = deps.loginWithApiKey ?? defaultLoginWithApiKey;
|
|
15608
15657
|
const home = os50.homeDir();
|
|
15609
15658
|
os50.augmentPath(
|
|
15610
15659
|
os50.id === "win32" ? [
|
|
@@ -15630,8 +15679,22 @@ async function configureCoderabbit(input, deps = {}) {
|
|
|
15630
15679
|
const res2 = base();
|
|
15631
15680
|
const key = (input.apiKey ?? "").trim();
|
|
15632
15681
|
if (!key) return { ...res2, error: "No API key provided" };
|
|
15682
|
+
if (!res2.installed) {
|
|
15683
|
+
const ok = await ensureInstalled(os50);
|
|
15684
|
+
res2.installed = ok;
|
|
15685
|
+
if (!ok) return { ...res2, error: "CodeRabbit CLI could not be installed" };
|
|
15686
|
+
}
|
|
15687
|
+
const login = loginWithApiKey(key);
|
|
15688
|
+
if (!login.ok) {
|
|
15689
|
+
return { ...res2, loggedIn: false, linked: false, error: login.error ?? "Invalid or expired API key" };
|
|
15690
|
+
}
|
|
15633
15691
|
const stored = deps.uploadCredential ? await deps.uploadCredential("api_key", key) : false;
|
|
15634
|
-
return {
|
|
15692
|
+
return {
|
|
15693
|
+
...res2,
|
|
15694
|
+
loggedIn: true,
|
|
15695
|
+
linked: stored,
|
|
15696
|
+
...stored ? {} : { error: "Signed in, but storing the API key for reuse failed" }
|
|
15697
|
+
};
|
|
15635
15698
|
}
|
|
15636
15699
|
if (input.action === "link_oauth") {
|
|
15637
15700
|
const res2 = base();
|
|
@@ -15641,10 +15704,7 @@ async function configureCoderabbit(input, deps = {}) {
|
|
|
15641
15704
|
if (!ok) return { ...res2, error: "CodeRabbit CLI could not be installed" };
|
|
15642
15705
|
}
|
|
15643
15706
|
const before = snapshot();
|
|
15644
|
-
const login = await runOAuth({
|
|
15645
|
-
spawn: (cmd, args2) => (0, import_node_child_process14.spawn)(cmd, args2, { stdio: ["ignore", "pipe", "pipe"] }),
|
|
15646
|
-
onEvent: deps.onEvent
|
|
15647
|
-
});
|
|
15707
|
+
const login = await runOAuth({ onEvent: deps.onEvent });
|
|
15648
15708
|
if (!login.ok) {
|
|
15649
15709
|
return { ...res2, loggedIn: false, linked: false, error: login.error ?? "CodeRabbit login failed" };
|
|
15650
15710
|
}
|
|
@@ -15691,7 +15751,7 @@ async function configureCoderabbit(input, deps = {}) {
|
|
|
15691
15751
|
}
|
|
15692
15752
|
|
|
15693
15753
|
// src/commands/host-agent.ts
|
|
15694
|
-
var
|
|
15754
|
+
var import_node_child_process23 = require("child_process");
|
|
15695
15755
|
var os35 = __toESM(require("os"));
|
|
15696
15756
|
var fs41 = __toESM(require("fs"));
|
|
15697
15757
|
var path44 = __toESM(require("path"));
|
|
@@ -15704,7 +15764,7 @@ var path37 = __toESM(require("path"));
|
|
|
15704
15764
|
// src/lib/restrict-to-owner.ts
|
|
15705
15765
|
var import_node_fs5 = __toESM(require("fs"));
|
|
15706
15766
|
var import_node_os4 = __toESM(require("os"));
|
|
15707
|
-
var
|
|
15767
|
+
var import_node_child_process16 = require("child_process");
|
|
15708
15768
|
var BROAD_WINDOWS_SIDS = [
|
|
15709
15769
|
"*S-1-1-0",
|
|
15710
15770
|
"*S-1-5-11",
|
|
@@ -15716,7 +15776,7 @@ function restrictToOwner(filePath) {
|
|
|
15716
15776
|
try {
|
|
15717
15777
|
if (process.platform === "win32") {
|
|
15718
15778
|
const username = import_node_os4.default.userInfo().username;
|
|
15719
|
-
(0,
|
|
15779
|
+
(0, import_node_child_process16.execFileSync)(
|
|
15720
15780
|
"icacls",
|
|
15721
15781
|
[
|
|
15722
15782
|
filePath,
|
|
@@ -15978,9 +16038,9 @@ async function reportDeployProgress(auth, deployId, step, message, sessionId) {
|
|
|
15978
16038
|
var fs34 = __toESM(require("fs"));
|
|
15979
16039
|
var os30 = __toESM(require("os"));
|
|
15980
16040
|
var path38 = __toESM(require("path"));
|
|
15981
|
-
var
|
|
16041
|
+
var import_node_child_process17 = require("child_process");
|
|
15982
16042
|
var import_node_util4 = require("util");
|
|
15983
|
-
var execFileP4 = (0, import_node_util4.promisify)(
|
|
16043
|
+
var execFileP4 = (0, import_node_util4.promisify)(import_node_child_process17.execFile);
|
|
15984
16044
|
function isAbsolutePathTarget(target) {
|
|
15985
16045
|
return path38.isAbsolute(target);
|
|
15986
16046
|
}
|
|
@@ -16276,7 +16336,7 @@ function provisionAgentCredentials(publicAgentId, auth, homeDir2 = os31.homedir(
|
|
|
16276
16336
|
}
|
|
16277
16337
|
|
|
16278
16338
|
// src/commands/host/git-tooling.ts
|
|
16279
|
-
var
|
|
16339
|
+
var import_node_child_process18 = require("child_process");
|
|
16280
16340
|
var fs36 = __toESM(require("fs"));
|
|
16281
16341
|
var os32 = __toESM(require("os"));
|
|
16282
16342
|
var path40 = __toESM(require("path"));
|
|
@@ -16390,7 +16450,7 @@ var defaultGitToolingRunner = {
|
|
|
16390
16450
|
which(cmd) {
|
|
16391
16451
|
try {
|
|
16392
16452
|
const probe = process.platform === "win32" ? "where" : "which";
|
|
16393
|
-
(0,
|
|
16453
|
+
(0, import_node_child_process18.execFileSync)(probe, [cmd], { stdio: "ignore" });
|
|
16394
16454
|
return true;
|
|
16395
16455
|
} catch {
|
|
16396
16456
|
return false;
|
|
@@ -16398,7 +16458,7 @@ var defaultGitToolingRunner = {
|
|
|
16398
16458
|
},
|
|
16399
16459
|
run(cmd, args2, opts = {}) {
|
|
16400
16460
|
return new Promise((resolve7) => {
|
|
16401
|
-
const child = (0,
|
|
16461
|
+
const child = (0, import_node_child_process18.spawn)(cmd, args2, {
|
|
16402
16462
|
stdio: [opts.input !== void 0 ? "pipe" : "ignore", "ignore", "pipe"]
|
|
16403
16463
|
});
|
|
16404
16464
|
let stderr = "";
|
|
@@ -16552,12 +16612,12 @@ var HeadroomStatsReporter = class {
|
|
|
16552
16612
|
};
|
|
16553
16613
|
|
|
16554
16614
|
// src/commands/host/os-packages.ts
|
|
16555
|
-
var
|
|
16615
|
+
var import_node_child_process19 = require("child_process");
|
|
16556
16616
|
var PM_INSTALL_TIMEOUT_MS = 18e4;
|
|
16557
16617
|
var defaultHeadroomRunner = {
|
|
16558
16618
|
which(cmd) {
|
|
16559
16619
|
try {
|
|
16560
|
-
(0,
|
|
16620
|
+
(0, import_node_child_process19.execFileSync)("which", [cmd], { stdio: "ignore" });
|
|
16561
16621
|
return true;
|
|
16562
16622
|
} catch {
|
|
16563
16623
|
return false;
|
|
@@ -16566,7 +16626,7 @@ var defaultHeadroomRunner = {
|
|
|
16566
16626
|
run(cmd, args2, opts = {}) {
|
|
16567
16627
|
return new Promise((resolve7) => {
|
|
16568
16628
|
const spawnEnv = opts.env ?? process.env;
|
|
16569
|
-
const child = (0,
|
|
16629
|
+
const child = (0, import_node_child_process19.spawn)(cmd, args2, { stdio: ["ignore", "pipe", "pipe"], env: spawnEnv });
|
|
16570
16630
|
let stderrBuf = "";
|
|
16571
16631
|
let stdoutBuf = "";
|
|
16572
16632
|
let settled = false;
|
|
@@ -17073,14 +17133,14 @@ async function setupHeadroomForSelfHosted(agent, runner = defaultHeadroomRunner,
|
|
|
17073
17133
|
}
|
|
17074
17134
|
|
|
17075
17135
|
// src/commands/host/self-update.ts
|
|
17076
|
-
var
|
|
17136
|
+
var import_node_child_process21 = require("child_process");
|
|
17077
17137
|
|
|
17078
17138
|
// src/lib/updateNotifier.ts
|
|
17079
17139
|
var fs39 = __toESM(require("fs"));
|
|
17080
17140
|
var os34 = __toESM(require("os"));
|
|
17081
17141
|
var path43 = __toESM(require("path"));
|
|
17082
17142
|
var https6 = __toESM(require("https"));
|
|
17083
|
-
var
|
|
17143
|
+
var import_node_child_process20 = require("child_process");
|
|
17084
17144
|
var import_picocolors3 = __toESM(require("picocolors"));
|
|
17085
17145
|
var PKG_NAME = "codeam-cli";
|
|
17086
17146
|
var REGISTRY_URL = `https://registry.npmjs.org/${PKG_NAME}/latest`;
|
|
@@ -17174,7 +17234,7 @@ function notifyIfStale(currentVersion, latest) {
|
|
|
17174
17234
|
}
|
|
17175
17235
|
function isLinkedInstall() {
|
|
17176
17236
|
try {
|
|
17177
|
-
const root = (0,
|
|
17237
|
+
const root = (0, import_node_child_process20.execSync)("npm root -g", {
|
|
17178
17238
|
encoding: "utf8",
|
|
17179
17239
|
stdio: ["ignore", "pipe", "ignore"],
|
|
17180
17240
|
timeout: 2e3
|
|
@@ -17202,7 +17262,7 @@ function maybeAutoUpdate(currentVersion, latest) {
|
|
|
17202
17262
|
|
|
17203
17263
|
`
|
|
17204
17264
|
);
|
|
17205
|
-
const install = (0,
|
|
17265
|
+
const install = (0, import_node_child_process20.spawnSync)("npm", ["install", "-g", `${PKG_NAME}@latest`], {
|
|
17206
17266
|
stdio: "inherit",
|
|
17207
17267
|
env: process.env
|
|
17208
17268
|
});
|
|
@@ -17223,7 +17283,7 @@ function maybeAutoUpdate(currentVersion, latest) {
|
|
|
17223
17283
|
process.stderr.write(` ${import_picocolors3.default.green("\u2713")} Updated. Resuming session...
|
|
17224
17284
|
|
|
17225
17285
|
`);
|
|
17226
|
-
const child = (0,
|
|
17286
|
+
const child = (0, import_node_child_process20.spawnSync)("codeam", process.argv.slice(2), {
|
|
17227
17287
|
stdio: "inherit",
|
|
17228
17288
|
env: process.env
|
|
17229
17289
|
});
|
|
@@ -17233,7 +17293,7 @@ async function autoUpgradeBeforeCriticalCommand() {
|
|
|
17233
17293
|
if (process.env.NODE_ENV === "test") return;
|
|
17234
17294
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
17235
17295
|
if (process.env.CI) return;
|
|
17236
|
-
const current = true ? "2.60.
|
|
17296
|
+
const current = true ? "2.60.35" : null;
|
|
17237
17297
|
if (!current) return;
|
|
17238
17298
|
const cache = readCache();
|
|
17239
17299
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -17250,7 +17310,7 @@ function checkForUpdates() {
|
|
|
17250
17310
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
17251
17311
|
if (process.env.CI) return;
|
|
17252
17312
|
if (!process.stdout.isTTY) return;
|
|
17253
|
-
const current = true ? "2.60.
|
|
17313
|
+
const current = true ? "2.60.35" : null;
|
|
17254
17314
|
if (!current) return;
|
|
17255
17315
|
const cache = readCache();
|
|
17256
17316
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -17270,11 +17330,11 @@ var SELF_UPDATE_INTERVAL_MS = 60 * 60 * 1e3;
|
|
|
17270
17330
|
var SELF_UPDATE_VIEW_TIMEOUT_MS = 3e4;
|
|
17271
17331
|
var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
|
|
17272
17332
|
function currentCliVersion() {
|
|
17273
|
-
return true ? "2.60.
|
|
17333
|
+
return true ? "2.60.35" : null;
|
|
17274
17334
|
}
|
|
17275
17335
|
function runCmd(cmd, args2, timeoutMs) {
|
|
17276
17336
|
return new Promise((resolve7) => {
|
|
17277
|
-
(0,
|
|
17337
|
+
(0, import_node_child_process21.execFile)(cmd, args2, { timeout: timeoutMs }, (err, stdout, stderr) => {
|
|
17278
17338
|
const code = err && typeof err.code === "number" ? err.code : err ? null : 0;
|
|
17279
17339
|
resolve7({ code, stdout: stdout ?? "", stderr: stderr ?? "" });
|
|
17280
17340
|
});
|
|
@@ -17336,11 +17396,11 @@ async function runSelfUpdate() {
|
|
|
17336
17396
|
}
|
|
17337
17397
|
|
|
17338
17398
|
// src/commands/host/teardown.ts
|
|
17339
|
-
var
|
|
17399
|
+
var import_node_child_process22 = require("child_process");
|
|
17340
17400
|
var fs40 = __toESM(require("fs"));
|
|
17341
17401
|
var defaultDisableService = () => {
|
|
17342
17402
|
try {
|
|
17343
|
-
(0,
|
|
17403
|
+
(0, import_node_child_process22.execFileSync)("systemctl", ["disable", "--now", "codeam-host-agent"], { stdio: "ignore" });
|
|
17344
17404
|
} catch {
|
|
17345
17405
|
}
|
|
17346
17406
|
};
|
|
@@ -17348,7 +17408,7 @@ var defaultTeardownHeadroom = () => {
|
|
|
17348
17408
|
try {
|
|
17349
17409
|
const kind = JSON.parse(fs40.readFileSync(headroomConfigPath(), "utf8")).agent;
|
|
17350
17410
|
if (kind) {
|
|
17351
|
-
(0,
|
|
17411
|
+
(0, import_node_child_process22.execFileSync)("headroom", ["unwrap", kind], { stdio: "ignore", timeout: 15e3 });
|
|
17352
17412
|
}
|
|
17353
17413
|
} catch {
|
|
17354
17414
|
}
|
|
@@ -17506,7 +17566,7 @@ var CONTROL_AGENT_META = {
|
|
|
17506
17566
|
headroomWrappable: false,
|
|
17507
17567
|
acp: false
|
|
17508
17568
|
};
|
|
17509
|
-
var defaultSpawner = (env, cwd, args2 = []) => (0,
|
|
17569
|
+
var defaultSpawner = (env, cwd, args2 = []) => (0, import_node_child_process23.spawn)(process.execPath, [process.argv[1], "pair-auto", ...args2], {
|
|
17510
17570
|
cwd,
|
|
17511
17571
|
env: { ...process.env, ...env },
|
|
17512
17572
|
stdio: ["ignore", "pipe", "pipe"],
|
|
@@ -17986,7 +18046,7 @@ var HostAgentSupervisor = class {
|
|
|
17986
18046
|
runAgentInstall(script) {
|
|
17987
18047
|
return new Promise((resolve7) => {
|
|
17988
18048
|
const home = process.env.HOME || os35.homedir();
|
|
17989
|
-
const child = (0,
|
|
18049
|
+
const child = (0, import_node_child_process23.spawn)("sh", ["-c", script], {
|
|
17990
18050
|
env: { ...process.env, HOME: home },
|
|
17991
18051
|
stdio: ["ignore", "pipe", "pipe"]
|
|
17992
18052
|
});
|
|
@@ -21175,7 +21235,7 @@ var coderabbitConfigureH = async (ctx, cmd, parsed) => {
|
|
|
21175
21235
|
);
|
|
21176
21236
|
};
|
|
21177
21237
|
if (rawAction === "link_deliver_callback") {
|
|
21178
|
-
const r =
|
|
21238
|
+
const r = deliverPendingCoderabbitCallback(parsed.callbackUrl ?? "");
|
|
21179
21239
|
await ctx.relay.sendResult(cmd.id, r.ok ? "completed" : "failed", {
|
|
21180
21240
|
action: "link_deliver_callback",
|
|
21181
21241
|
supported: true,
|
|
@@ -22496,7 +22556,7 @@ async function pairAuto(args2) {
|
|
|
22496
22556
|
}
|
|
22497
22557
|
|
|
22498
22558
|
// src/services/headroom/wrap-launch.ts
|
|
22499
|
-
var
|
|
22559
|
+
var import_node_child_process24 = require("child_process");
|
|
22500
22560
|
function wrapWithHeadroom(launch, opts) {
|
|
22501
22561
|
if (!opts.enabled || !opts.headroomPresent) return launch;
|
|
22502
22562
|
return {
|
|
@@ -22509,7 +22569,7 @@ var _present;
|
|
|
22509
22569
|
function headroomPresent() {
|
|
22510
22570
|
if (_present !== void 0) return Promise.resolve(_present);
|
|
22511
22571
|
return new Promise((resolve7) => {
|
|
22512
|
-
(0,
|
|
22572
|
+
(0, import_node_child_process24.execFile)("headroom", ["--version"], (err) => {
|
|
22513
22573
|
_present = !err;
|
|
22514
22574
|
resolve7(_present);
|
|
22515
22575
|
});
|
|
@@ -23033,7 +23093,7 @@ async function waitForAdapterModuleGraph(command2, args2, opts = {}) {
|
|
|
23033
23093
|
}
|
|
23034
23094
|
|
|
23035
23095
|
// src/agents/kimi/installer.ts
|
|
23036
|
-
var
|
|
23096
|
+
var import_node_child_process25 = require("child_process");
|
|
23037
23097
|
var import_node_os6 = require("os");
|
|
23038
23098
|
var import_node_path6 = require("path");
|
|
23039
23099
|
var INSTALL_URL2 = "https://code.kimi.com/kimi-code/install.sh";
|
|
@@ -23041,7 +23101,7 @@ function kimiBinDir() {
|
|
|
23041
23101
|
return (0, import_node_path6.join)(process.env.KIMI_CODE_HOME || (0, import_node_path6.join)((0, import_node_os6.homedir)(), ".kimi-code"), "bin");
|
|
23042
23102
|
}
|
|
23043
23103
|
function kimiRuns() {
|
|
23044
|
-
const r = (0,
|
|
23104
|
+
const r = (0, import_node_child_process25.spawnSync)("kimi", ["--version"], { stdio: "ignore", timeout: 15e3 });
|
|
23045
23105
|
return !r.error && r.status === 0;
|
|
23046
23106
|
}
|
|
23047
23107
|
function augmentPath2() {
|
|
@@ -23051,7 +23111,7 @@ function augmentPath2() {
|
|
|
23051
23111
|
}
|
|
23052
23112
|
async function runInstaller2() {
|
|
23053
23113
|
return new Promise((resolve7) => {
|
|
23054
|
-
const proc = (0,
|
|
23114
|
+
const proc = (0, import_node_child_process25.spawn)("sh", ["-c", `curl -fsSL ${INSTALL_URL2} | bash`], { stdio: "inherit" });
|
|
23055
23115
|
proc.on("close", (code) => resolve7(code === 0));
|
|
23056
23116
|
proc.on("error", () => resolve7(false));
|
|
23057
23117
|
});
|
|
@@ -23215,7 +23275,7 @@ var fs56 = __toESM(require("fs"));
|
|
|
23215
23275
|
var path61 = __toESM(require("path"));
|
|
23216
23276
|
var os45 = __toESM(require("os"));
|
|
23217
23277
|
var https7 = __toESM(require("https"));
|
|
23218
|
-
var
|
|
23278
|
+
var http6 = __toESM(require("http"));
|
|
23219
23279
|
var import_zod2 = require("zod");
|
|
23220
23280
|
var historyRecordSchema = import_zod2.z.object({
|
|
23221
23281
|
type: import_zod2.z.string().optional(),
|
|
@@ -23280,7 +23340,7 @@ function post(endpoint, body, pluginAuthToken) {
|
|
|
23280
23340
|
return new Promise((resolve7) => {
|
|
23281
23341
|
const payload = JSON.stringify(body);
|
|
23282
23342
|
const u2 = new URL(`${API_BASE8}${endpoint}`);
|
|
23283
|
-
const transport = u2.protocol === "https:" ? https7 :
|
|
23343
|
+
const transport = u2.protocol === "https:" ? https7 : http6;
|
|
23284
23344
|
const req = transport.request(
|
|
23285
23345
|
{
|
|
23286
23346
|
hostname: u2.hostname,
|
|
@@ -23788,7 +23848,7 @@ var HistoryService = class _HistoryService {
|
|
|
23788
23848
|
};
|
|
23789
23849
|
|
|
23790
23850
|
// src/agents/acp/client.ts
|
|
23791
|
-
var
|
|
23851
|
+
var import_node_child_process26 = require("child_process");
|
|
23792
23852
|
var fs57 = __toESM(require("fs/promises"));
|
|
23793
23853
|
var fsSync = __toESM(require("fs"));
|
|
23794
23854
|
var os46 = __toESM(require("os"));
|
|
@@ -26413,7 +26473,7 @@ var AcpClient = class {
|
|
|
26413
26473
|
"acpClient",
|
|
26414
26474
|
`spawn cmd=${adapter.command} args=[${adapter.args.join(",")}] cwd=${cwd}`
|
|
26415
26475
|
);
|
|
26416
|
-
const child = (0,
|
|
26476
|
+
const child = (0, import_node_child_process26.spawn)(adapter.command, adapter.args, {
|
|
26417
26477
|
cwd,
|
|
26418
26478
|
// extraEnv (e.g. CLAUDE_CODE_DISABLE_1M_CONTEXT=1 on an on-demand
|
|
26419
26479
|
// re-spawn) layers over process.env; PATH stays last so the augmented
|
|
@@ -26895,7 +26955,7 @@ var relaunchProxyWithoutBudget = async () => {
|
|
|
26895
26955
|
};
|
|
26896
26956
|
|
|
26897
26957
|
// src/services/streaming/transport.ts
|
|
26898
|
-
var
|
|
26958
|
+
var http7 = __toESM(require("http"));
|
|
26899
26959
|
var https8 = __toESM(require("https"));
|
|
26900
26960
|
var _transport4 = {
|
|
26901
26961
|
post: _post3,
|
|
@@ -26905,7 +26965,7 @@ function _post3(url, headers, payload) {
|
|
|
26905
26965
|
return new Promise((resolve7, reject) => {
|
|
26906
26966
|
let settled = false;
|
|
26907
26967
|
const u2 = new URL(url);
|
|
26908
|
-
const lib = u2.protocol === "https:" ? https8 :
|
|
26968
|
+
const lib = u2.protocol === "https:" ? https8 : http7;
|
|
26909
26969
|
const req = lib.request(
|
|
26910
26970
|
{
|
|
26911
26971
|
hostname: u2.hostname,
|
|
@@ -26947,7 +27007,7 @@ function _get(url, headers) {
|
|
|
26947
27007
|
return new Promise((resolve7, reject) => {
|
|
26948
27008
|
let settled = false;
|
|
26949
27009
|
const u2 = new URL(url);
|
|
26950
|
-
const lib = u2.protocol === "https:" ? https8 :
|
|
27010
|
+
const lib = u2.protocol === "https:" ? https8 : http7;
|
|
26951
27011
|
const req = lib.request(
|
|
26952
27012
|
{
|
|
26953
27013
|
hostname: u2.hostname,
|
|
@@ -34323,7 +34383,7 @@ function checkChokidar() {
|
|
|
34323
34383
|
}
|
|
34324
34384
|
async function doctor(args2 = []) {
|
|
34325
34385
|
const json = args2.includes("--json");
|
|
34326
|
-
const cliVersion = true ? "2.60.
|
|
34386
|
+
const cliVersion = true ? "2.60.35" : "0.0.0-dev";
|
|
34327
34387
|
const apiBase2 = resolveApiBaseUrl();
|
|
34328
34388
|
const diagnosticId = (0, import_node_crypto12.randomUUID)();
|
|
34329
34389
|
log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
|
|
@@ -34522,7 +34582,7 @@ async function completion(args2) {
|
|
|
34522
34582
|
// src/commands/version.ts
|
|
34523
34583
|
var import_picocolors15 = __toESM(require("picocolors"));
|
|
34524
34584
|
function version2() {
|
|
34525
|
-
const v = true ? "2.60.
|
|
34585
|
+
const v = true ? "2.60.35" : "unknown";
|
|
34526
34586
|
console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
|
|
34527
34587
|
}
|
|
34528
34588
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codeam-cli",
|
|
3
|
-
"version": "2.60.
|
|
3
|
+
"version": "2.60.35",
|
|
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",
|