codeam-cli 2.65.15 → 2.65.16
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 +301 -202
- 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.15] — 2026-08-20
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **cli:** Resume-spawn retry + visible failure; agent install dirs on every ACP spawn PATH (#645)
|
|
12
|
+
|
|
7
13
|
## [2.65.14] — 2026-08-20
|
|
8
14
|
|
|
9
15
|
### CI
|
package/dist/index.js
CHANGED
|
@@ -948,6 +948,8 @@ function isKnownAgentId(id) {
|
|
|
948
948
|
|
|
949
949
|
// ../../packages/shared/src/agents/identity.ts
|
|
950
950
|
var HOUSE_AGENT_ID = "house-codeagent-cloud";
|
|
951
|
+
var HOUSE_AGENT_NAME = "CodeAgent Cloud";
|
|
952
|
+
var HOUSE_AGENT_SUBTITLE = "Included \u2014 no setup";
|
|
951
953
|
var PUBLIC_TO_INTERNAL = {
|
|
952
954
|
claude_code: "claude",
|
|
953
955
|
// CLI-side extra: self-hosted deploy payloads may carry the internal id.
|
|
@@ -3154,11 +3156,11 @@ function quiet(fn) {
|
|
|
3154
3156
|
log.debug(TAG, "ignored sync error", err);
|
|
3155
3157
|
}
|
|
3156
3158
|
}
|
|
3157
|
-
function rmIfExistsQuiet(
|
|
3159
|
+
function rmIfExistsQuiet(path94) {
|
|
3158
3160
|
try {
|
|
3159
|
-
fs2.rmSync(
|
|
3161
|
+
fs2.rmSync(path94, { force: true });
|
|
3160
3162
|
} catch (err) {
|
|
3161
|
-
log.debug(TAG, `rmIfExists failed for ${
|
|
3163
|
+
log.debug(TAG, `rmIfExists failed for ${path94}`, err);
|
|
3162
3164
|
}
|
|
3163
3165
|
}
|
|
3164
3166
|
function killQuiet(target, signal = "SIGTERM") {
|
|
@@ -3365,8 +3367,8 @@ function createGetModuleFromFilename(basePath = process.argv[1] ? (0, import_pat
|
|
|
3365
3367
|
return decodedFile;
|
|
3366
3368
|
};
|
|
3367
3369
|
}
|
|
3368
|
-
function normalizeWindowsPath(
|
|
3369
|
-
return
|
|
3370
|
+
function normalizeWindowsPath(path94) {
|
|
3371
|
+
return path94.replace(/^[A-Z]:/, "").replace(/\\/g, "/");
|
|
3370
3372
|
}
|
|
3371
3373
|
|
|
3372
3374
|
// ../../node_modules/@posthog/core/dist/featureFlagUtils.mjs
|
|
@@ -5846,9 +5848,9 @@ async function addSourceContext(frames) {
|
|
|
5846
5848
|
LRU_FILE_CONTENTS_CACHE.reduce();
|
|
5847
5849
|
return frames;
|
|
5848
5850
|
}
|
|
5849
|
-
function getContextLinesFromFile(
|
|
5851
|
+
function getContextLinesFromFile(path94, ranges, output) {
|
|
5850
5852
|
return new Promise((resolve10) => {
|
|
5851
|
-
const stream = (0, import_node_fs.createReadStream)(
|
|
5853
|
+
const stream = (0, import_node_fs.createReadStream)(path94);
|
|
5852
5854
|
const lineReaded = (0, import_node_readline.createInterface)({
|
|
5853
5855
|
input: stream
|
|
5854
5856
|
});
|
|
@@ -5863,7 +5865,7 @@ function getContextLinesFromFile(path93, ranges, output) {
|
|
|
5863
5865
|
let rangeStart = range[0];
|
|
5864
5866
|
let rangeEnd = range[1];
|
|
5865
5867
|
function onStreamError() {
|
|
5866
|
-
LRU_FILE_CONTENTS_FS_READ_FAILED.set(
|
|
5868
|
+
LRU_FILE_CONTENTS_FS_READ_FAILED.set(path94, 1);
|
|
5867
5869
|
lineReaded.close();
|
|
5868
5870
|
lineReaded.removeAllListeners();
|
|
5869
5871
|
destroyStreamAndResolve();
|
|
@@ -5924,8 +5926,8 @@ function clearLineContext(frame) {
|
|
|
5924
5926
|
delete frame.context_line;
|
|
5925
5927
|
delete frame.post_context;
|
|
5926
5928
|
}
|
|
5927
|
-
function shouldSkipContextLinesForFile(
|
|
5928
|
-
return
|
|
5929
|
+
function shouldSkipContextLinesForFile(path94) {
|
|
5930
|
+
return path94.startsWith("node:") || path94.endsWith(".min.js") || path94.endsWith(".min.cjs") || path94.endsWith(".min.mjs") || path94.startsWith("data:");
|
|
5929
5931
|
}
|
|
5930
5932
|
function shouldSkipContextLinesForFrame(frame) {
|
|
5931
5933
|
if (void 0 !== frame.lineno && frame.lineno > MAX_CONTEXTLINES_LINENO) return true;
|
|
@@ -8079,7 +8081,7 @@ function readAnonId() {
|
|
|
8079
8081
|
}
|
|
8080
8082
|
function superProperties() {
|
|
8081
8083
|
return {
|
|
8082
|
-
cliVersion: true ? "2.65.
|
|
8084
|
+
cliVersion: true ? "2.65.16" : "0.0.0-dev",
|
|
8083
8085
|
nodeVersion: process.version,
|
|
8084
8086
|
platform: process.platform,
|
|
8085
8087
|
arch: process.arch,
|
|
@@ -8321,7 +8323,7 @@ var http = __toESM(require("http"));
|
|
|
8321
8323
|
// package.json
|
|
8322
8324
|
var package_default = {
|
|
8323
8325
|
name: "codeam-cli",
|
|
8324
|
-
version: "2.65.
|
|
8326
|
+
version: "2.65.16",
|
|
8325
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.",
|
|
8326
8328
|
type: "commonjs",
|
|
8327
8329
|
main: "dist/index.js",
|
|
@@ -8719,11 +8721,12 @@ async function fetchProvisionCredentialDetailed(input) {
|
|
|
8719
8721
|
input.pluginAuthToken
|
|
8720
8722
|
);
|
|
8721
8723
|
const data = res?.data;
|
|
8722
|
-
if (data && (data.method === "api_key" || data.method === "oauth") && typeof data.credential === "string" && data.credential.length > 0) {
|
|
8724
|
+
if (data && (data.method === "api_key" || data.method === "oauth" || data.method === "house_proxy") && typeof data.credential === "string" && data.credential.length > 0) {
|
|
8723
8725
|
return {
|
|
8724
8726
|
ok: true,
|
|
8725
8727
|
method: data.method,
|
|
8726
8728
|
credential: data.credential,
|
|
8729
|
+
...typeof data.baseUrl === "string" && data.baseUrl.length > 0 ? { baseUrl: data.baseUrl } : {},
|
|
8727
8730
|
...typeof data.installScript === "string" && data.installScript.length > 0 ? { installScript: data.installScript } : {}
|
|
8728
8731
|
};
|
|
8729
8732
|
}
|
|
@@ -8737,7 +8740,7 @@ async function fetchProvisionCredentialDetailed(input) {
|
|
|
8737
8740
|
}
|
|
8738
8741
|
async function fetchProvisionCredential(input) {
|
|
8739
8742
|
const res = await fetchProvisionCredentialDetailed(input);
|
|
8740
|
-
if (!res.ok) return null;
|
|
8743
|
+
if (!res.ok || res.method === "house_proxy") return null;
|
|
8741
8744
|
return {
|
|
8742
8745
|
method: res.method,
|
|
8743
8746
|
credential: res.credential,
|
|
@@ -9842,7 +9845,7 @@ var CommandRelayService = class _CommandRelayService {
|
|
|
9842
9845
|
// fresh + clear the "CLI update available" banner after a self-update
|
|
9843
9846
|
// (a codespace that reinstalls @latest reconnects via heartbeat, not
|
|
9844
9847
|
// pair/reconnect). Older backends ignore the extra field.
|
|
9845
|
-
..."2.65.
|
|
9848
|
+
..."2.65.16" ? { ideVersion: "2.65.16" } : {}
|
|
9846
9849
|
}).then(() => log.trace("relay", `heartbeat ok online=${online}`)).catch((err) => log.trace("relay", `heartbeat failed online=${online}`, err));
|
|
9847
9850
|
}
|
|
9848
9851
|
/**
|
|
@@ -10102,10 +10105,10 @@ var WINDOWS_LEGACY_JUNCTIONS = [
|
|
|
10102
10105
|
/[\\/]Start Menu([\\/]|$)/i,
|
|
10103
10106
|
/[\\/]Templates([\\/]|$)/i
|
|
10104
10107
|
];
|
|
10105
|
-
function isUnsafeWindowsWatchRoot(dir,
|
|
10108
|
+
function isUnsafeWindowsWatchRoot(dir, homedir54) {
|
|
10106
10109
|
const norm = (p2) => p2.replace(/\//g, "\\").replace(/\\+$/, "").toLowerCase();
|
|
10107
10110
|
const cwd = norm(dir);
|
|
10108
|
-
const home = norm(
|
|
10111
|
+
const home = norm(homedir54);
|
|
10109
10112
|
if (cwd === home) return true;
|
|
10110
10113
|
if (/^[a-z]:$/.test(cwd)) return true;
|
|
10111
10114
|
const sysRoots = [
|
|
@@ -14761,10 +14764,10 @@ function buildForPlatform(platform3) {
|
|
|
14761
14764
|
var import_node_crypto4 = require("crypto");
|
|
14762
14765
|
|
|
14763
14766
|
// src/agents/claude/resolver.ts
|
|
14764
|
-
function buildClaudeLaunch(extraArgs = [],
|
|
14765
|
-
const found =
|
|
14767
|
+
function buildClaudeLaunch(extraArgs = [], os68 = createOsStrategy()) {
|
|
14768
|
+
const found = os68.findInPath("claude") ?? os68.findInPath("claude-code");
|
|
14766
14769
|
if (!found) return null;
|
|
14767
|
-
return
|
|
14770
|
+
return os68.buildLaunch(found, extraArgs);
|
|
14768
14771
|
}
|
|
14769
14772
|
|
|
14770
14773
|
// src/agents/claude/installer.ts
|
|
@@ -15524,8 +15527,8 @@ var ClaudeRuntimeStrategy = class {
|
|
|
15524
15527
|
meta = getAgent("claude");
|
|
15525
15528
|
mode = "interactive";
|
|
15526
15529
|
os;
|
|
15527
|
-
constructor(
|
|
15528
|
-
this.os =
|
|
15530
|
+
constructor(os68) {
|
|
15531
|
+
this.os = os68;
|
|
15529
15532
|
}
|
|
15530
15533
|
/**
|
|
15531
15534
|
* Claude Code's react-ink TUI enables bracketed-paste mode at
|
|
@@ -16613,8 +16616,8 @@ function codexCredentialLocator() {
|
|
|
16613
16616
|
function codexLoginLauncher() {
|
|
16614
16617
|
return {
|
|
16615
16618
|
async ensureInstalled() {
|
|
16616
|
-
const
|
|
16617
|
-
return
|
|
16619
|
+
const os68 = createOsStrategy();
|
|
16620
|
+
return os68.findInPath("codex") !== null;
|
|
16618
16621
|
},
|
|
16619
16622
|
launch() {
|
|
16620
16623
|
return (0, import_node_child_process4.spawn)("codex", ["login"], { stdio: "inherit" });
|
|
@@ -16637,8 +16640,8 @@ var CodexRuntimeStrategy = class {
|
|
|
16637
16640
|
meta = getAgent("codex");
|
|
16638
16641
|
mode = "interactive";
|
|
16639
16642
|
os;
|
|
16640
|
-
constructor(
|
|
16641
|
-
this.os =
|
|
16643
|
+
constructor(os68) {
|
|
16644
|
+
this.os = os68;
|
|
16642
16645
|
}
|
|
16643
16646
|
async prepareLaunch() {
|
|
16644
16647
|
let binary = this.os.findInPath("codex");
|
|
@@ -16747,12 +16750,12 @@ var CodexRuntimeStrategy = class {
|
|
|
16747
16750
|
});
|
|
16748
16751
|
}
|
|
16749
16752
|
};
|
|
16750
|
-
function resolveNpm(
|
|
16751
|
-
return
|
|
16753
|
+
function resolveNpm(os68) {
|
|
16754
|
+
return os68.id === "win32" ? "npm.cmd" : "npm";
|
|
16752
16755
|
}
|
|
16753
|
-
async function installCodexViaNpm(
|
|
16756
|
+
async function installCodexViaNpm(os68) {
|
|
16754
16757
|
return new Promise((resolve10, reject) => {
|
|
16755
|
-
const proc = (0, import_node_child_process5.spawn)(resolveNpm(
|
|
16758
|
+
const proc = (0, import_node_child_process5.spawn)(resolveNpm(os68), ["install", "-g", "@openai/codex"], {
|
|
16756
16759
|
stdio: "inherit"
|
|
16757
16760
|
});
|
|
16758
16761
|
proc.on("close", (code) => {
|
|
@@ -16769,16 +16772,16 @@ async function installCodexViaNpm(os67) {
|
|
|
16769
16772
|
});
|
|
16770
16773
|
});
|
|
16771
16774
|
}
|
|
16772
|
-
function augmentNpmGlobalBin(
|
|
16775
|
+
function augmentNpmGlobalBin(os68) {
|
|
16773
16776
|
try {
|
|
16774
|
-
const result = (0, import_node_child_process5.spawnSync)(resolveNpm(
|
|
16777
|
+
const result = (0, import_node_child_process5.spawnSync)(resolveNpm(os68), ["prefix", "-g"], {
|
|
16775
16778
|
stdio: ["ignore", "pipe", "ignore"]
|
|
16776
16779
|
});
|
|
16777
16780
|
if (result.status !== 0) return;
|
|
16778
16781
|
const prefix = result.stdout.toString().trim();
|
|
16779
16782
|
if (!prefix) return;
|
|
16780
|
-
const binDir =
|
|
16781
|
-
|
|
16783
|
+
const binDir = os68.id === "win32" ? prefix : path27.join(prefix, "bin");
|
|
16784
|
+
os68.augmentPath([binDir]);
|
|
16782
16785
|
} catch {
|
|
16783
16786
|
}
|
|
16784
16787
|
}
|
|
@@ -17189,10 +17192,10 @@ function manualInstallHint(runner, tools) {
|
|
|
17189
17192
|
const argv = osPackageInstallArgv(detectPackageManager(runner), [...tools]);
|
|
17190
17193
|
return argv ? `\`sudo ${argv.join(" ")}\`` : `your package manager (e.g. \`${pkgs}\`)`;
|
|
17191
17194
|
}
|
|
17192
|
-
function writeUnzipShim(
|
|
17195
|
+
function writeUnzipShim(os68, runner) {
|
|
17193
17196
|
const python = ["python3", "python"].find((p2) => runner.which(p2));
|
|
17194
17197
|
if (!python) return null;
|
|
17195
|
-
const dir =
|
|
17198
|
+
const dir = os68.scratchPath("codeam-cr-prereq");
|
|
17196
17199
|
const shim = path29.join(dir, "unzip");
|
|
17197
17200
|
const script = `#!/bin/sh
|
|
17198
17201
|
set -e
|
|
@@ -17214,9 +17217,9 @@ exec ${python} -m zipfile -e "$archive" "$dest"
|
|
|
17214
17217
|
(0, import_node_fs5.chmodSync)(shim, 448);
|
|
17215
17218
|
return dir;
|
|
17216
17219
|
}
|
|
17217
|
-
async function ensureInstallPrerequisites(
|
|
17220
|
+
async function ensureInstallPrerequisites(os68, deps = {}) {
|
|
17218
17221
|
const runner = deps.runner ?? defaultHeadroomRunner;
|
|
17219
|
-
const missing = REQUIRED_TOOLS.filter((t2) =>
|
|
17222
|
+
const missing = REQUIRED_TOOLS.filter((t2) => os68.findInPath(t2) === null);
|
|
17220
17223
|
if (missing.length === 0) return { ok: true, extraPath: [] };
|
|
17221
17224
|
log.info(
|
|
17222
17225
|
"coderabbit",
|
|
@@ -17235,10 +17238,10 @@ async function ensureInstallPrerequisites(os67, deps = {}) {
|
|
|
17235
17238
|
);
|
|
17236
17239
|
}
|
|
17237
17240
|
}
|
|
17238
|
-
const stillMissing = REQUIRED_TOOLS.filter((t2) =>
|
|
17241
|
+
const stillMissing = REQUIRED_TOOLS.filter((t2) => os68.findInPath(t2) === null);
|
|
17239
17242
|
if (stillMissing.length === 0) return { ok: true, extraPath: [] };
|
|
17240
17243
|
if (stillMissing.length === 1 && stillMissing[0] === "unzip") {
|
|
17241
|
-
const shimDir = writeUnzipShim(
|
|
17244
|
+
const shimDir = writeUnzipShim(os68, runner);
|
|
17242
17245
|
if (shimDir) {
|
|
17243
17246
|
log.info("coderabbit", "unzip is unavailable \u2014 using a scoped python zipfile shim");
|
|
17244
17247
|
return { ok: true, extraPath: [shimDir] };
|
|
@@ -17301,15 +17304,15 @@ function summarizeInstallFailure(output) {
|
|
|
17301
17304
|
}
|
|
17302
17305
|
return lines.length > 0 ? lines[lines.length - 1] : null;
|
|
17303
17306
|
}
|
|
17304
|
-
async function ensureCoderabbitInstalled(
|
|
17305
|
-
if (
|
|
17306
|
-
if (
|
|
17307
|
+
async function ensureCoderabbitInstalled(os68, deps = {}) {
|
|
17308
|
+
if (os68.findInPath("coderabbit")) return { ok: true };
|
|
17309
|
+
if (os68.id === "win32") {
|
|
17307
17310
|
return {
|
|
17308
17311
|
ok: false,
|
|
17309
17312
|
error: "CodeRabbit on Windows requires WSL. Install the CLI inside your WSL distribution (curl -fsSL https://cli.coderabbit.ai/install.sh | sh), then try again."
|
|
17310
17313
|
};
|
|
17311
17314
|
}
|
|
17312
|
-
const prereq = await ensureInstallPrerequisites(
|
|
17315
|
+
const prereq = await ensureInstallPrerequisites(os68, deps);
|
|
17313
17316
|
if (!prereq.ok) return { ok: false, error: prereq.error };
|
|
17314
17317
|
const env = { ...process.env };
|
|
17315
17318
|
if (prereq.extraPath.length > 0) {
|
|
@@ -17318,8 +17321,8 @@ async function ensureCoderabbitInstalled(os67, deps = {}) {
|
|
|
17318
17321
|
log.info("coderabbit", "CodeRabbit CLI not found \u2014 installing via the official script");
|
|
17319
17322
|
const run = deps.runInstallScript ?? defaultRunInstallScript;
|
|
17320
17323
|
const { code, output } = await run(env);
|
|
17321
|
-
|
|
17322
|
-
const binary =
|
|
17324
|
+
os68.augmentPath([`${os68.homeDir()}/.local/bin`, "/opt/homebrew/bin"]);
|
|
17325
|
+
const binary = os68.findInPath("coderabbit");
|
|
17323
17326
|
const detail = summarizeInstallFailure(output);
|
|
17324
17327
|
if (binary !== null) {
|
|
17325
17328
|
if (code === 0) return { ok: true };
|
|
@@ -17373,10 +17376,10 @@ function coderabbitCredentialLocator() {
|
|
|
17373
17376
|
validate: validateNonEmptyCredential
|
|
17374
17377
|
};
|
|
17375
17378
|
}
|
|
17376
|
-
function coderabbitLoginLauncher(
|
|
17379
|
+
function coderabbitLoginLauncher(os68) {
|
|
17377
17380
|
return {
|
|
17378
17381
|
async ensureInstalled() {
|
|
17379
|
-
const result = await ensureCoderabbitInstalled(
|
|
17382
|
+
const result = await ensureCoderabbitInstalled(os68);
|
|
17380
17383
|
if (!result.ok && result.error) console.error(`
|
|
17381
17384
|
\u2717 ${result.error}
|
|
17382
17385
|
`);
|
|
@@ -17436,8 +17439,8 @@ function pickLine(obj) {
|
|
|
17436
17439
|
function toHunk(raw, groupSeverity) {
|
|
17437
17440
|
if (!raw || typeof raw !== "object") return null;
|
|
17438
17441
|
const o = raw;
|
|
17439
|
-
const
|
|
17440
|
-
if (!
|
|
17442
|
+
const path94 = asString(pick(o, ["file_path", "filePath", "file", "path", "filename", "fileName"])) ?? asString(pick(o, ["location"])?.path);
|
|
17443
|
+
if (!path94) return null;
|
|
17441
17444
|
const message = asString(
|
|
17442
17445
|
pick(o, [
|
|
17443
17446
|
"comment",
|
|
@@ -17454,7 +17457,7 @@ function toHunk(raw, groupSeverity) {
|
|
|
17454
17457
|
const severity = normSeverity(pick(o, ["severity", "level", "priority", "impact"])) ?? normSeverity(groupSeverity);
|
|
17455
17458
|
const locObj = pick(o, ["location"]) ?? o;
|
|
17456
17459
|
return {
|
|
17457
|
-
path:
|
|
17460
|
+
path: path94.trim(),
|
|
17458
17461
|
line: pickLine(o) ?? pickLine(locObj),
|
|
17459
17462
|
severity,
|
|
17460
17463
|
message: (title && message ? `${title}: ${message}` : title || message).trim() || "(no message)"
|
|
@@ -17537,10 +17540,10 @@ function parsePlain(stdout) {
|
|
|
17537
17540
|
for (const line of stdout.split(/\r?\n/)) {
|
|
17538
17541
|
const m = line.match(HUNK_LINE_RE);
|
|
17539
17542
|
if (!m) continue;
|
|
17540
|
-
const [,
|
|
17541
|
-
if (!
|
|
17543
|
+
const [, path94, lineNo, sevToken, message] = m;
|
|
17544
|
+
if (!path94 || !lineNo || !message) continue;
|
|
17542
17545
|
hunks.push({
|
|
17543
|
-
path:
|
|
17546
|
+
path: path94.trim(),
|
|
17544
17547
|
line: Number(lineNo),
|
|
17545
17548
|
severity: sevToken ? SEVERITY_MAP[sevToken.toLowerCase()] : void 0,
|
|
17546
17549
|
message: message.trim().replace(/^[*-]\s+/, "")
|
|
@@ -17600,8 +17603,8 @@ var CoderabbitRuntimeStrategy = class {
|
|
|
17600
17603
|
meta = getAgent("coderabbit");
|
|
17601
17604
|
mode = "batch";
|
|
17602
17605
|
os;
|
|
17603
|
-
constructor(
|
|
17604
|
-
this.os =
|
|
17606
|
+
constructor(os68) {
|
|
17607
|
+
this.os = os68;
|
|
17605
17608
|
}
|
|
17606
17609
|
getDefaultArgs() {
|
|
17607
17610
|
return ["review", "--agent"];
|
|
@@ -17872,10 +17875,10 @@ function cursorCredentialLocator() {
|
|
|
17872
17875
|
validate: validateNonEmptyCredential
|
|
17873
17876
|
};
|
|
17874
17877
|
}
|
|
17875
|
-
function cursorLoginLauncher(
|
|
17878
|
+
function cursorLoginLauncher(os68) {
|
|
17876
17879
|
return {
|
|
17877
17880
|
async ensureInstalled() {
|
|
17878
|
-
if (
|
|
17881
|
+
if (os68.findInPath("cursor-agent")) return true;
|
|
17879
17882
|
console.error(
|
|
17880
17883
|
"\n \u2717 cursor-agent binary not on PATH.\n Install Cursor (https://cursor.com/) and ensure the CLI\n plugin is enabled, then re-run `codeam link cursor`.\n"
|
|
17881
17884
|
);
|
|
@@ -17939,8 +17942,8 @@ var CursorRuntimeStrategy = class {
|
|
|
17939
17942
|
meta = getAgent("cursor");
|
|
17940
17943
|
mode = "interactive";
|
|
17941
17944
|
os;
|
|
17942
|
-
constructor(
|
|
17943
|
-
this.os =
|
|
17945
|
+
constructor(os68) {
|
|
17946
|
+
this.os = os68;
|
|
17944
17947
|
}
|
|
17945
17948
|
async prepareLaunch() {
|
|
17946
17949
|
const binary = this.os.findInPath("cursor-agent");
|
|
@@ -18156,10 +18159,10 @@ function aiderCredentialLocator() {
|
|
|
18156
18159
|
validate: validateNonEmptyCredential
|
|
18157
18160
|
};
|
|
18158
18161
|
}
|
|
18159
|
-
function aiderLoginLauncher(
|
|
18162
|
+
function aiderLoginLauncher(os68) {
|
|
18160
18163
|
return {
|
|
18161
18164
|
async ensureInstalled() {
|
|
18162
|
-
if (
|
|
18165
|
+
if (os68.findInPath("aider")) return true;
|
|
18163
18166
|
console.error(
|
|
18164
18167
|
"\n \u2717 aider binary not on PATH.\n Install Aider:\n pip install aider-chat\n then re-run `codeam link aider`.\n"
|
|
18165
18168
|
);
|
|
@@ -18169,7 +18172,7 @@ function aiderLoginLauncher(os67) {
|
|
|
18169
18172
|
console.error(
|
|
18170
18173
|
"\n Aider has no interactive login flow.\n Set ANTHROPIC_API_KEY or OPENAI_API_KEY in your shell,\n or re-run `codeam link aider --api-key=<your-key>`.\n"
|
|
18171
18174
|
);
|
|
18172
|
-
return (0, import_node_child_process12.spawn)(
|
|
18175
|
+
return (0, import_node_child_process12.spawn)(os68.id === "win32" ? "cmd.exe" : "sh", os68.id === "win32" ? ["/c", "exit", "0"] : ["-c", "exit 0"], {
|
|
18173
18176
|
stdio: "ignore"
|
|
18174
18177
|
});
|
|
18175
18178
|
}
|
|
@@ -18444,8 +18447,8 @@ var AiderRuntimeStrategy = class {
|
|
|
18444
18447
|
meta = getAgent("aider");
|
|
18445
18448
|
mode = "interactive";
|
|
18446
18449
|
os;
|
|
18447
|
-
constructor(
|
|
18448
|
-
this.os =
|
|
18450
|
+
constructor(os68) {
|
|
18451
|
+
this.os = os68;
|
|
18449
18452
|
}
|
|
18450
18453
|
async prepareLaunch() {
|
|
18451
18454
|
augmentUserLocalBinPaths();
|
|
@@ -18578,8 +18581,8 @@ function geminiCredentialLocator() {
|
|
|
18578
18581
|
function geminiLoginLauncher() {
|
|
18579
18582
|
return {
|
|
18580
18583
|
async ensureInstalled() {
|
|
18581
|
-
const
|
|
18582
|
-
return
|
|
18584
|
+
const os68 = createOsStrategy();
|
|
18585
|
+
return os68.findInPath("gemini") !== null;
|
|
18583
18586
|
},
|
|
18584
18587
|
launch() {
|
|
18585
18588
|
return (0, import_node_child_process13.spawn)("gemini", ["auth", "login"], { stdio: "inherit" });
|
|
@@ -18769,8 +18772,8 @@ var GeminiRuntimeStrategy = class {
|
|
|
18769
18772
|
meta = getAgent("gemini");
|
|
18770
18773
|
mode = "interactive";
|
|
18771
18774
|
os;
|
|
18772
|
-
constructor(
|
|
18773
|
-
this.os =
|
|
18775
|
+
constructor(os68) {
|
|
18776
|
+
this.os = os68;
|
|
18774
18777
|
}
|
|
18775
18778
|
async prepareLaunch() {
|
|
18776
18779
|
const binary = this.os.findInPath("gemini");
|
|
@@ -19061,8 +19064,8 @@ var KimiRuntimeStrategy = class {
|
|
|
19061
19064
|
meta = getAgent("kimi");
|
|
19062
19065
|
mode = "interactive";
|
|
19063
19066
|
os;
|
|
19064
|
-
constructor(
|
|
19065
|
-
this.os =
|
|
19067
|
+
constructor(os68) {
|
|
19068
|
+
this.os = os68;
|
|
19066
19069
|
}
|
|
19067
19070
|
async prepareLaunch() {
|
|
19068
19071
|
const binary = this.os.findInPath("kimi");
|
|
@@ -19204,8 +19207,8 @@ var OpencodeRuntimeStrategy = class {
|
|
|
19204
19207
|
meta = getAgent("opencode");
|
|
19205
19208
|
mode = "interactive";
|
|
19206
19209
|
os;
|
|
19207
|
-
constructor(
|
|
19208
|
-
this.os =
|
|
19210
|
+
constructor(os68) {
|
|
19211
|
+
this.os = os68;
|
|
19209
19212
|
}
|
|
19210
19213
|
async prepareLaunch() {
|
|
19211
19214
|
const binary = this.os.findInPath("opencode");
|
|
@@ -19289,20 +19292,20 @@ var OpencodeRuntimeStrategy = class {
|
|
|
19289
19292
|
|
|
19290
19293
|
// src/agents/registry.ts
|
|
19291
19294
|
var runtimeBuilders = {
|
|
19292
|
-
claude: (
|
|
19293
|
-
codex: (
|
|
19294
|
-
coderabbit: (
|
|
19295
|
-
cursor: (
|
|
19296
|
-
aider: (
|
|
19297
|
-
gemini: (
|
|
19298
|
-
kimi: (
|
|
19299
|
-
opencode: (
|
|
19295
|
+
claude: (os68) => new ClaudeRuntimeStrategy(os68),
|
|
19296
|
+
codex: (os68) => new CodexRuntimeStrategy(os68),
|
|
19297
|
+
coderabbit: (os68) => new CoderabbitRuntimeStrategy(os68),
|
|
19298
|
+
cursor: (os68) => new CursorRuntimeStrategy(os68),
|
|
19299
|
+
aider: (os68) => new AiderRuntimeStrategy(os68),
|
|
19300
|
+
gemini: (os68) => new GeminiRuntimeStrategy(os68),
|
|
19301
|
+
kimi: (os68) => new KimiRuntimeStrategy(os68),
|
|
19302
|
+
opencode: (os68) => new OpencodeRuntimeStrategy(os68)
|
|
19300
19303
|
};
|
|
19301
19304
|
var deployBuilders = {
|
|
19302
19305
|
claude: () => new ClaudeDeployStrategy(),
|
|
19303
19306
|
codex: () => new CodexDeployStrategy()
|
|
19304
19307
|
};
|
|
19305
|
-
function createAgentStrategy(agent,
|
|
19308
|
+
function createAgentStrategy(agent, os68 = createOsStrategy()) {
|
|
19306
19309
|
if (!AGENT_REGISTRY[agent]?.enabled) {
|
|
19307
19310
|
throw new Error(
|
|
19308
19311
|
`Agent "${agent}" is not supported in this codeam-cli version. Upgrade with 'npm i -g codeam-cli@latest'.`
|
|
@@ -19312,10 +19315,10 @@ function createAgentStrategy(agent, os67 = createOsStrategy()) {
|
|
|
19312
19315
|
if (!build) {
|
|
19313
19316
|
throw new Error(`No runtime strategy registered for agent "${agent}"`);
|
|
19314
19317
|
}
|
|
19315
|
-
return build(
|
|
19318
|
+
return build(os68);
|
|
19316
19319
|
}
|
|
19317
|
-
function createInteractiveAgentStrategy(agent,
|
|
19318
|
-
const s = createAgentStrategy(agent,
|
|
19320
|
+
function createInteractiveAgentStrategy(agent, os68 = createOsStrategy()) {
|
|
19321
|
+
const s = createAgentStrategy(agent, os68);
|
|
19319
19322
|
if (s.mode !== "interactive") {
|
|
19320
19323
|
throw new Error(
|
|
19321
19324
|
`Agent "${agent}" is a batch agent; use createAgentStrategy + .runOneShot for one-shot reviews.`
|
|
@@ -19993,8 +19996,8 @@ function collectChangedFiles(cwd) {
|
|
|
19993
19996
|
}
|
|
19994
19997
|
return [...byPath.values()];
|
|
19995
19998
|
}
|
|
19996
|
-
function restoreCoderabbitOauthBlob(
|
|
19997
|
-
const dir = path41.join(
|
|
19999
|
+
function restoreCoderabbitOauthBlob(os68, value) {
|
|
20000
|
+
const dir = path41.join(os68.homeDir(), ".coderabbit");
|
|
19998
20001
|
(0, import_node_fs6.mkdirSync)(dir, { recursive: true });
|
|
19999
20002
|
let file = "auth.json";
|
|
20000
20003
|
let contents = value.trim();
|
|
@@ -20014,26 +20017,26 @@ function installFailureMessage(result) {
|
|
|
20014
20017
|
return result.error ?? "CodeRabbit CLI could not be installed";
|
|
20015
20018
|
}
|
|
20016
20019
|
async function configureCoderabbit(input, deps = {}) {
|
|
20017
|
-
const
|
|
20020
|
+
const os68 = deps.os ?? createOsStrategy();
|
|
20018
20021
|
const ensureInstalled = deps.ensureInstalled ?? ensureCoderabbitInstalled;
|
|
20019
20022
|
const isLoggedIn = deps.isLoggedIn ?? defaultIsLoggedIn;
|
|
20020
20023
|
const runOAuth = deps.runOAuthLogin ?? runCoderabbitOAuthLogin;
|
|
20021
20024
|
const snapshot = deps.snapshotDir ?? (() => snapshotCredentialDir());
|
|
20022
20025
|
const capture2 = deps.captureCredential ?? ((b) => diffCapturedCredential(b));
|
|
20023
20026
|
const loginWithApiKey = deps.loginWithApiKey ?? defaultLoginWithApiKey;
|
|
20024
|
-
const home =
|
|
20025
|
-
|
|
20026
|
-
|
|
20027
|
+
const home = os68.homeDir();
|
|
20028
|
+
os68.augmentPath(
|
|
20029
|
+
os68.id === "win32" ? [
|
|
20027
20030
|
path41.join(home, ".local", "bin"),
|
|
20028
20031
|
path41.join(process.env.APPDATA ?? path41.join(home, "AppData", "Roaming"), "npm"),
|
|
20029
20032
|
path41.join(home, "scoop", "shims")
|
|
20030
20033
|
] : [path41.join(home, ".local", "bin"), "/opt/homebrew/bin", "/usr/local/bin"]
|
|
20031
20034
|
);
|
|
20032
|
-
const installed2 =
|
|
20035
|
+
const installed2 = os68.findInPath("coderabbit") !== null;
|
|
20033
20036
|
const base = () => ({
|
|
20034
20037
|
action: input.action,
|
|
20035
20038
|
supported: true,
|
|
20036
|
-
installed:
|
|
20039
|
+
installed: os68.findInPath("coderabbit") !== null,
|
|
20037
20040
|
loggedIn: false
|
|
20038
20041
|
});
|
|
20039
20042
|
if (input.action === "status") {
|
|
@@ -20047,7 +20050,7 @@ async function configureCoderabbit(input, deps = {}) {
|
|
|
20047
20050
|
const key = (input.apiKey ?? "").trim();
|
|
20048
20051
|
if (!key) return { ...res2, error: "No API key provided" };
|
|
20049
20052
|
if (!res2.installed) {
|
|
20050
|
-
const inst = await ensureInstalled(
|
|
20053
|
+
const inst = await ensureInstalled(os68);
|
|
20051
20054
|
res2.installed = inst.ok;
|
|
20052
20055
|
if (!inst.ok) return { ...res2, error: installFailureMessage(inst) };
|
|
20053
20056
|
}
|
|
@@ -20071,7 +20074,7 @@ async function configureCoderabbit(input, deps = {}) {
|
|
|
20071
20074
|
}
|
|
20072
20075
|
if (!res2.installed) {
|
|
20073
20076
|
deps.onEvent?.({ kind: "installing" });
|
|
20074
|
-
const inst = await ensureInstalled(
|
|
20077
|
+
const inst = await ensureInstalled(os68);
|
|
20075
20078
|
res2.installed = inst.ok;
|
|
20076
20079
|
if (!inst.ok) return { ...res2, error: installFailureMessage(inst) };
|
|
20077
20080
|
}
|
|
@@ -20088,7 +20091,7 @@ async function configureCoderabbit(input, deps = {}) {
|
|
|
20088
20091
|
return { ...res2, loggedIn: true, linked: true };
|
|
20089
20092
|
}
|
|
20090
20093
|
try {
|
|
20091
|
-
restoreCoderabbitOauthBlob(
|
|
20094
|
+
restoreCoderabbitOauthBlob(os68, cred.credential);
|
|
20092
20095
|
} catch (err) {
|
|
20093
20096
|
return {
|
|
20094
20097
|
...res2,
|
|
@@ -20112,7 +20115,7 @@ async function configureCoderabbit(input, deps = {}) {
|
|
|
20112
20115
|
const res2 = base();
|
|
20113
20116
|
if (!installed2) {
|
|
20114
20117
|
deps.onEvent?.({ kind: "installing" });
|
|
20115
|
-
const inst = await ensureInstalled(
|
|
20118
|
+
const inst = await ensureInstalled(os68);
|
|
20116
20119
|
res2.installed = inst.ok;
|
|
20117
20120
|
if (!inst.ok) return { ...res2, error: installFailureMessage(inst) };
|
|
20118
20121
|
}
|
|
@@ -20152,7 +20155,7 @@ async function configureCoderabbit(input, deps = {}) {
|
|
|
20152
20155
|
}
|
|
20153
20156
|
const res = base();
|
|
20154
20157
|
if (!res.installed) {
|
|
20155
|
-
const inst = await ensureInstalled(
|
|
20158
|
+
const inst = await ensureInstalled(os68);
|
|
20156
20159
|
res.installed = inst.ok;
|
|
20157
20160
|
if (!inst.ok) return { ...res, error: installFailureMessage(inst) };
|
|
20158
20161
|
}
|
|
@@ -21823,28 +21826,64 @@ function readHouseProxyChildEnv() {
|
|
|
21823
21826
|
const o = parsed;
|
|
21824
21827
|
if (typeof o.baseUrl !== "string" || !o.baseUrl) return {};
|
|
21825
21828
|
if (typeof o.token !== "string" || !o.token) return {};
|
|
21826
|
-
|
|
21827
|
-
|
|
21828
|
-
|
|
21829
|
-
|
|
21830
|
-
|
|
21831
|
-
};
|
|
21832
|
-
if (o.openRouter === true) {
|
|
21833
|
-
env.ANTHROPIC_API_KEY = "";
|
|
21834
|
-
} else {
|
|
21835
|
-
env.ANTHROPIC_MODEL = "MiniMax-M3";
|
|
21836
|
-
env.ANTHROPIC_DEFAULT_SONNET_MODEL = "MiniMax-M3";
|
|
21837
|
-
env.ANTHROPIC_DEFAULT_OPUS_MODEL = "MiniMax-M3";
|
|
21838
|
-
env.ANTHROPIC_DEFAULT_HAIKU_MODEL = "MiniMax-M3";
|
|
21839
|
-
}
|
|
21840
|
-
if (typeof o.claudeConfigDir === "string" && o.claudeConfigDir) {
|
|
21841
|
-
env.CLAUDE_CONFIG_DIR = o.claudeConfigDir;
|
|
21842
|
-
}
|
|
21843
|
-
return env;
|
|
21829
|
+
return buildHouseProxyChildEnv({
|
|
21830
|
+
baseUrl: o.baseUrl,
|
|
21831
|
+
token: o.token,
|
|
21832
|
+
openRouter: o.openRouter === true,
|
|
21833
|
+
...typeof o.claudeConfigDir === "string" && o.claudeConfigDir ? { claudeConfigDir: o.claudeConfigDir } : {}
|
|
21834
|
+
});
|
|
21844
21835
|
} catch {
|
|
21845
21836
|
return {};
|
|
21846
21837
|
}
|
|
21847
21838
|
}
|
|
21839
|
+
function buildHouseProxyChildEnv(cfg) {
|
|
21840
|
+
const env = {
|
|
21841
|
+
ANTHROPIC_BASE_URL: cfg.baseUrl,
|
|
21842
|
+
ANTHROPIC_AUTH_TOKEN: cfg.token,
|
|
21843
|
+
CLAUDE_CODE_AUTO_COMPACT_WINDOW: "512000",
|
|
21844
|
+
API_TIMEOUT_MS: "3000000"
|
|
21845
|
+
};
|
|
21846
|
+
if (cfg.openRouter === true) {
|
|
21847
|
+
env.ANTHROPIC_API_KEY = "";
|
|
21848
|
+
} else {
|
|
21849
|
+
env.ANTHROPIC_MODEL = "MiniMax-M3";
|
|
21850
|
+
env.ANTHROPIC_DEFAULT_SONNET_MODEL = "MiniMax-M3";
|
|
21851
|
+
env.ANTHROPIC_DEFAULT_OPUS_MODEL = "MiniMax-M3";
|
|
21852
|
+
env.ANTHROPIC_DEFAULT_HAIKU_MODEL = "MiniMax-M3";
|
|
21853
|
+
}
|
|
21854
|
+
if (typeof cfg.claudeConfigDir === "string" && cfg.claudeConfigDir) {
|
|
21855
|
+
env.CLAUDE_CONFIG_DIR = cfg.claudeConfigDir;
|
|
21856
|
+
}
|
|
21857
|
+
return env;
|
|
21858
|
+
}
|
|
21859
|
+
var HOUSE_PROXY_ENV_KEYS = [
|
|
21860
|
+
"ANTHROPIC_BASE_URL",
|
|
21861
|
+
"ANTHROPIC_AUTH_TOKEN",
|
|
21862
|
+
"ANTHROPIC_API_KEY",
|
|
21863
|
+
"ANTHROPIC_MODEL",
|
|
21864
|
+
"ANTHROPIC_DEFAULT_SONNET_MODEL",
|
|
21865
|
+
"ANTHROPIC_DEFAULT_OPUS_MODEL",
|
|
21866
|
+
"ANTHROPIC_DEFAULT_HAIKU_MODEL",
|
|
21867
|
+
"CLAUDE_CODE_AUTO_COMPACT_WINDOW",
|
|
21868
|
+
"API_TIMEOUT_MS",
|
|
21869
|
+
"CLAUDE_CONFIG_DIR"
|
|
21870
|
+
];
|
|
21871
|
+
function clearHouseProxyEnvOverrides() {
|
|
21872
|
+
const out2 = {};
|
|
21873
|
+
for (const key of HOUSE_PROXY_ENV_KEYS) out2[key] = void 0;
|
|
21874
|
+
return out2;
|
|
21875
|
+
}
|
|
21876
|
+
function isHouseProxyEnv(env) {
|
|
21877
|
+
return typeof env.ANTHROPIC_AUTH_TOKEN === "string" && env.ANTHROPIC_AUTH_TOKEN.length > 0 && (env.ANTHROPIC_BASE_URL ?? "").includes("/api/v1/agent-proxy");
|
|
21878
|
+
}
|
|
21879
|
+
function pickHouseProxyEnv(env) {
|
|
21880
|
+
const out2 = {};
|
|
21881
|
+
for (const key of HOUSE_PROXY_ENV_KEYS) {
|
|
21882
|
+
const v = env[key];
|
|
21883
|
+
if (typeof v === "string") out2[key] = v;
|
|
21884
|
+
}
|
|
21885
|
+
return out2;
|
|
21886
|
+
}
|
|
21848
21887
|
|
|
21849
21888
|
// src/commands/host/self-update.ts
|
|
21850
21889
|
var import_node_child_process23 = require("child_process");
|
|
@@ -22007,7 +22046,7 @@ async function autoUpgradeBeforeCriticalCommand() {
|
|
|
22007
22046
|
if (process.env.NODE_ENV === "test") return;
|
|
22008
22047
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
22009
22048
|
if (process.env.CI) return;
|
|
22010
|
-
const current2 = true ? "2.65.
|
|
22049
|
+
const current2 = true ? "2.65.16" : null;
|
|
22011
22050
|
if (!current2) return;
|
|
22012
22051
|
const cache = readCache();
|
|
22013
22052
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -22024,7 +22063,7 @@ function checkForUpdates() {
|
|
|
22024
22063
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
22025
22064
|
if (process.env.CI) return;
|
|
22026
22065
|
if (!process.stdout.isTTY) return;
|
|
22027
|
-
const current2 = true ? "2.65.
|
|
22066
|
+
const current2 = true ? "2.65.16" : null;
|
|
22028
22067
|
if (!current2) return;
|
|
22029
22068
|
const cache = readCache();
|
|
22030
22069
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -22044,7 +22083,7 @@ var SELF_UPDATE_INTERVAL_MS = 60 * 60 * 1e3;
|
|
|
22044
22083
|
var SELF_UPDATE_VIEW_TIMEOUT_MS = 3e4;
|
|
22045
22084
|
var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
|
|
22046
22085
|
function currentCliVersion() {
|
|
22047
|
-
return true ? "2.65.
|
|
22086
|
+
return true ? "2.65.16" : null;
|
|
22048
22087
|
}
|
|
22049
22088
|
function runCmd(cmd, args2, timeoutMs) {
|
|
22050
22089
|
return new Promise((resolve10) => {
|
|
@@ -23820,7 +23859,7 @@ async function defaultFetchJson(url2) {
|
|
|
23820
23859
|
async function readUsageReport(deps = {}) {
|
|
23821
23860
|
const port = deps.port ?? HEADROOM_PROXY_PORT;
|
|
23822
23861
|
const base = `http://127.0.0.1:${port}`;
|
|
23823
|
-
const get2 = deps.fetchJson ?? ((
|
|
23862
|
+
const get2 = deps.fetchJson ?? ((path94) => defaultFetchJson(`${base}${path94}`));
|
|
23824
23863
|
let history;
|
|
23825
23864
|
try {
|
|
23826
23865
|
history = await get2("/stats-history");
|
|
@@ -25737,11 +25776,11 @@ function resolveDoltInstallStrategy(platform3) {
|
|
|
25737
25776
|
}
|
|
25738
25777
|
var DOLT_RELEASE_BASE = "https://github.com/dolthub/dolt/releases/latest/download";
|
|
25739
25778
|
function doltPlatformTuple(platform3, arch2) {
|
|
25740
|
-
const
|
|
25779
|
+
const os68 = platform3 === "win32" ? "windows" : platform3 === "darwin" ? "darwin" : "linux";
|
|
25741
25780
|
const a = arch2 === "x64" ? "amd64" : arch2 === "arm64" ? "arm64" : null;
|
|
25742
25781
|
if (!a) return null;
|
|
25743
|
-
if (
|
|
25744
|
-
return `${
|
|
25782
|
+
if (os68 === "windows" && a !== "amd64") return null;
|
|
25783
|
+
return `${os68}-${a}`;
|
|
25745
25784
|
}
|
|
25746
25785
|
function resolveDoltTarballStrategy(targetDir, platform3, arch2) {
|
|
25747
25786
|
const tuple = doltPlatformTuple(platform3, arch2);
|
|
@@ -27393,7 +27432,7 @@ var vcsAgentReviewH = async (ctx, cmd, parsed) => {
|
|
|
27393
27432
|
});
|
|
27394
27433
|
const token = ctx.pluginAuthToken;
|
|
27395
27434
|
void (async () => {
|
|
27396
|
-
const
|
|
27435
|
+
const os68 = createOsStrategy();
|
|
27397
27436
|
try {
|
|
27398
27437
|
const report = await reviewPullRequest(
|
|
27399
27438
|
{
|
|
@@ -27402,7 +27441,7 @@ var vcsAgentReviewH = async (ctx, cmd, parsed) => {
|
|
|
27402
27441
|
baseBranch: parsed.baseBranch
|
|
27403
27442
|
},
|
|
27404
27443
|
{
|
|
27405
|
-
runReview: (input) => new CoderabbitRuntimeStrategy(
|
|
27444
|
+
runReview: (input) => new CoderabbitRuntimeStrategy(os68).runOneShot(input),
|
|
27406
27445
|
runGh: (args2) => defaultRunGh(args2),
|
|
27407
27446
|
postReport: async (r) => {
|
|
27408
27447
|
if (!token) return;
|
|
@@ -28505,11 +28544,11 @@ function resolveTokenValue(args2) {
|
|
|
28505
28544
|
}
|
|
28506
28545
|
const fileFlag = args2.find((a) => a.startsWith("--token-file="));
|
|
28507
28546
|
if (fileFlag) {
|
|
28508
|
-
const
|
|
28547
|
+
const path94 = fileFlag.slice("--token-file=".length);
|
|
28509
28548
|
try {
|
|
28510
|
-
const content = fs65.readFileSync(
|
|
28511
|
-
if (content.length === 0) fail(`--token-file ${
|
|
28512
|
-
rmIfExistsQuiet(
|
|
28549
|
+
const content = fs65.readFileSync(path94, "utf8").trim();
|
|
28550
|
+
if (content.length === 0) fail(`--token-file ${path94} is empty`);
|
|
28551
|
+
rmIfExistsQuiet(path94);
|
|
28513
28552
|
return content;
|
|
28514
28553
|
} catch (err) {
|
|
28515
28554
|
fail(`Could not read --token-file: ${err.message}`);
|
|
@@ -29429,6 +29468,9 @@ async function resolveAcpAdapterWithRetry(agent, opts = {}) {
|
|
|
29429
29468
|
|
|
29430
29469
|
// src/agents/acp/runner.ts
|
|
29431
29470
|
var import_node_crypto11 = require("crypto");
|
|
29471
|
+
var fs77 = __toESM(require("fs"));
|
|
29472
|
+
var os62 = __toESM(require("os"));
|
|
29473
|
+
var path85 = __toESM(require("path"));
|
|
29432
29474
|
|
|
29433
29475
|
// src/services/history.service.ts
|
|
29434
29476
|
var fs66 = __toESM(require("fs"));
|
|
@@ -35274,16 +35316,23 @@ var NON_SWITCHABLE = /* @__PURE__ */ new Set([
|
|
|
35274
35316
|
"coderabbit"
|
|
35275
35317
|
]);
|
|
35276
35318
|
function displayName(id) {
|
|
35319
|
+
if (id === HOUSE_AGENT_ID) return HOUSE_AGENT_NAME;
|
|
35277
35320
|
return isKnownAgentId(id) ? AGENT_REGISTRY[id]?.displayName ?? id : id;
|
|
35278
35321
|
}
|
|
35279
35322
|
function credentialFailureMessage(agentId, failure) {
|
|
35280
35323
|
if (failure.message) return failure.message;
|
|
35281
35324
|
return `No linked credential for ${displayName(agentId)}. Link it in Profile \u203A Agents first.`;
|
|
35282
35325
|
}
|
|
35283
|
-
function resolveSwitchTarget(raw, currentAgent) {
|
|
35326
|
+
function resolveSwitchTarget(raw, currentAgent, currentIsHouse = false) {
|
|
35284
35327
|
if (typeof raw !== "string" || raw.length === 0) {
|
|
35285
35328
|
return { ok: false, error: "switch_agent: missing agentId" };
|
|
35286
35329
|
}
|
|
35330
|
+
if (raw === HOUSE_AGENT_ID) {
|
|
35331
|
+
if (currentIsHouse) {
|
|
35332
|
+
return { ok: false, error: `${HOUSE_AGENT_NAME} is already this session's agent.` };
|
|
35333
|
+
}
|
|
35334
|
+
return { ok: true, agentId: "claude", wireId: HOUSE_AGENT_ID, house: true };
|
|
35335
|
+
}
|
|
35287
35336
|
if (!isKnownAgentId(raw)) {
|
|
35288
35337
|
return { ok: false, error: `Unknown agent "${raw}".` };
|
|
35289
35338
|
}
|
|
@@ -35296,10 +35345,10 @@ function resolveSwitchTarget(raw, currentAgent) {
|
|
|
35296
35345
|
error: `${displayName(raw)} can't be switched to in a live session yet.`
|
|
35297
35346
|
};
|
|
35298
35347
|
}
|
|
35299
|
-
if (raw === currentAgent) {
|
|
35348
|
+
if (raw === currentAgent && !currentIsHouse) {
|
|
35300
35349
|
return { ok: false, error: `${displayName(raw)} is already this session's agent.` };
|
|
35301
35350
|
}
|
|
35302
|
-
return { ok: true, agentId: raw };
|
|
35351
|
+
return { ok: true, agentId: raw, wireId: raw, house: false };
|
|
35303
35352
|
}
|
|
35304
35353
|
function toAgentAuth(method, credential) {
|
|
35305
35354
|
return { kind: method === "api_key" ? "api_key" : "oauth_token", value: credential };
|
|
@@ -35374,7 +35423,8 @@ function makeSerializedSwitchEmitter(post2) {
|
|
|
35374
35423
|
}
|
|
35375
35424
|
async function performAgentSwitch(deps, rawAgentId, fastPath = {}) {
|
|
35376
35425
|
const from = deps.currentAgent();
|
|
35377
|
-
const
|
|
35426
|
+
const fromIsHouse = deps.currentIsHouse();
|
|
35427
|
+
const target = resolveSwitchTarget(rawAgentId, from, fromIsHouse);
|
|
35378
35428
|
if (!target.ok) {
|
|
35379
35429
|
return {
|
|
35380
35430
|
ok: false,
|
|
@@ -35383,27 +35433,45 @@ async function performAgentSwitch(deps, rawAgentId, fastPath = {}) {
|
|
|
35383
35433
|
};
|
|
35384
35434
|
}
|
|
35385
35435
|
const agentId = target.agentId;
|
|
35436
|
+
const wireId = target.wireId;
|
|
35437
|
+
const fromWireId = fromIsHouse ? HOUSE_AGENT_ID : from;
|
|
35438
|
+
const targetName = displayName(wireId);
|
|
35386
35439
|
const emitStatus = (status2) => deps.postEvent("switch_agent_status", { ...status2 });
|
|
35387
|
-
const emitStep = (step) => deps.postEvent("switch_agent_progress", { step, agentId });
|
|
35440
|
+
const emitStep = (step) => deps.postEvent("switch_agent_progress", { step, agentId: wireId });
|
|
35388
35441
|
const fail2 = (error) => {
|
|
35389
|
-
log.warn("switchAgent", `switch ${
|
|
35390
|
-
void emitStatus({ state: "error", agentId, fromAgentId:
|
|
35391
|
-
return { ok: false, agentId, error };
|
|
35442
|
+
log.warn("switchAgent", `switch ${fromWireId} \u2192 ${wireId} failed: ${error}`);
|
|
35443
|
+
void emitStatus({ state: "error", agentId: wireId, fromAgentId: fromWireId, error });
|
|
35444
|
+
return { ok: false, agentId: wireId, error };
|
|
35392
35445
|
};
|
|
35393
|
-
log.info("switchAgent", `switch requested ${
|
|
35394
|
-
void emitStatus({ state: "switching", agentId, fromAgentId:
|
|
35446
|
+
log.info("switchAgent", `switch requested ${fromWireId} \u2192 ${wireId}`);
|
|
35447
|
+
void emitStatus({ state: "switching", agentId: wireId, fromAgentId: fromWireId });
|
|
35395
35448
|
let installScript;
|
|
35396
35449
|
if (!fastPath.skipProvision) {
|
|
35397
35450
|
void emitStep("credential");
|
|
35398
|
-
const cred = await deps.fetchCredential(
|
|
35451
|
+
const cred = await deps.fetchCredential(wireId);
|
|
35399
35452
|
if (!cred.ok) {
|
|
35400
|
-
return fail2(credentialFailureMessage(
|
|
35453
|
+
return fail2(credentialFailureMessage(wireId, cred));
|
|
35401
35454
|
}
|
|
35402
|
-
|
|
35403
|
-
|
|
35404
|
-
|
|
35405
|
-
|
|
35406
|
-
|
|
35455
|
+
if (target.house) {
|
|
35456
|
+
if (cred.method !== "house_proxy" || !cred.baseUrl) {
|
|
35457
|
+
return fail2(`${targetName} isn't available on this backend yet.`);
|
|
35458
|
+
}
|
|
35459
|
+
try {
|
|
35460
|
+
deps.provisionHouseProxy({ baseUrl: cred.baseUrl, token: cred.credential });
|
|
35461
|
+
} catch (err) {
|
|
35462
|
+
log.warn("switchAgent", `house proxy provisioning failed: ${err.message}`);
|
|
35463
|
+
return fail2(`Couldn't configure ${targetName} on this machine.`);
|
|
35464
|
+
}
|
|
35465
|
+
} else {
|
|
35466
|
+
if (cred.method === "house_proxy") {
|
|
35467
|
+
return fail2(`Couldn't fetch the ${targetName} credential.`);
|
|
35468
|
+
}
|
|
35469
|
+
try {
|
|
35470
|
+
deps.provisionCredential(agentId, toAgentAuth(cred.method, cred.credential));
|
|
35471
|
+
} catch (err) {
|
|
35472
|
+
log.warn("switchAgent", `credential provisioning failed: ${err.message}`);
|
|
35473
|
+
return fail2(`Couldn't write the ${targetName} credential on this machine.`);
|
|
35474
|
+
}
|
|
35407
35475
|
}
|
|
35408
35476
|
installScript = cred.installScript;
|
|
35409
35477
|
}
|
|
@@ -35416,19 +35484,19 @@ async function performAgentSwitch(deps, rawAgentId, fastPath = {}) {
|
|
|
35416
35484
|
}
|
|
35417
35485
|
void emitStep("restart");
|
|
35418
35486
|
try {
|
|
35419
|
-
await deps.swapRuntime(agentId);
|
|
35487
|
+
await deps.swapRuntime(agentId, { house: target.house });
|
|
35420
35488
|
} catch (err) {
|
|
35421
|
-
log.warn("switchAgent", `swap failed, reverting to ${
|
|
35489
|
+
log.warn("switchAgent", `swap failed, reverting to ${fromWireId}: ${err.message}`);
|
|
35422
35490
|
try {
|
|
35423
|
-
await deps.revertRuntime(from);
|
|
35491
|
+
await deps.revertRuntime(from, { house: fromIsHouse });
|
|
35424
35492
|
} catch (revertErr) {
|
|
35425
35493
|
log.warn("switchAgent", `revert failed: ${revertErr.message}`);
|
|
35426
35494
|
return fail2(
|
|
35427
|
-
`Switching to ${
|
|
35495
|
+
`Switching to ${targetName} failed and ${displayName(fromWireId)} couldn't be restored \u2014 restart the session.`
|
|
35428
35496
|
);
|
|
35429
35497
|
}
|
|
35430
35498
|
return fail2(
|
|
35431
|
-
`Couldn't start ${
|
|
35499
|
+
`Couldn't start ${targetName} \u2014 the session stays on ${displayName(fromWireId)}.`
|
|
35432
35500
|
);
|
|
35433
35501
|
}
|
|
35434
35502
|
try {
|
|
@@ -35437,9 +35505,9 @@ async function performAgentSwitch(deps, rawAgentId, fastPath = {}) {
|
|
|
35437
35505
|
log.warn("switchAgent", `persist failed (non-fatal): ${err.message}`);
|
|
35438
35506
|
}
|
|
35439
35507
|
deps.reannounce(agentId);
|
|
35440
|
-
await emitStatus({ state: "ready", agentId, fromAgentId:
|
|
35441
|
-
log.info("switchAgent", `switch complete ${
|
|
35442
|
-
return { ok: true, agentId };
|
|
35508
|
+
await emitStatus({ state: "ready", agentId: wireId, fromAgentId: fromWireId });
|
|
35509
|
+
log.info("switchAgent", `switch complete ${fromWireId} \u2192 ${wireId}`);
|
|
35510
|
+
return { ok: true, agentId: wireId };
|
|
35443
35511
|
}
|
|
35444
35512
|
|
|
35445
35513
|
// src/services/streaming/transport.ts
|
|
@@ -36716,7 +36784,7 @@ function defaultRunGit(cwd, args2) {
|
|
|
36716
36784
|
});
|
|
36717
36785
|
}
|
|
36718
36786
|
async function discoverRepos(workingDir, maxDepth = 4) {
|
|
36719
|
-
const
|
|
36787
|
+
const fs82 = await import("fs/promises");
|
|
36720
36788
|
const out2 = [];
|
|
36721
36789
|
await walk(workingDir, 0);
|
|
36722
36790
|
return out2;
|
|
@@ -36724,7 +36792,7 @@ async function discoverRepos(workingDir, maxDepth = 4) {
|
|
|
36724
36792
|
if (depth > maxDepth) return;
|
|
36725
36793
|
let entries = [];
|
|
36726
36794
|
try {
|
|
36727
|
-
const dirents = await
|
|
36795
|
+
const dirents = await fs82.readdir(dir, { withFileTypes: true });
|
|
36728
36796
|
entries = dirents.filter((d3) => !d3.name.startsWith(".") || d3.name === ".git").map((d3) => ({ name: d3.name, isDirectory: d3.isDirectory() }));
|
|
36729
36797
|
} catch {
|
|
36730
36798
|
return;
|
|
@@ -40273,7 +40341,10 @@ async function runAcpSession(opts) {
|
|
|
40273
40341
|
refreshSquadRoster();
|
|
40274
40342
|
const pendingProposal = { current: null };
|
|
40275
40343
|
let switchCredentialEnv = {};
|
|
40276
|
-
|
|
40344
|
+
let houseActive = isHouseProxyEnv(process.env);
|
|
40345
|
+
let houseEnv = houseActive ? pickHouseProxyEnv(process.env) : {};
|
|
40346
|
+
let pendingHouseConfig = null;
|
|
40347
|
+
const relaunchWith = async (nextAgent, swapOpts = { house: false }) => {
|
|
40277
40348
|
try {
|
|
40278
40349
|
await client3.cancel();
|
|
40279
40350
|
} catch {
|
|
@@ -40287,13 +40358,15 @@ async function runAcpSession(opts) {
|
|
|
40287
40358
|
if (!adapter) throw new Error(`no ACP adapter available for ${nextAgent}`);
|
|
40288
40359
|
const disable1m = loadCliConfig().sessions.find((s) => s.pluginId === opts.pluginId)?.disable1mContext === true;
|
|
40289
40360
|
clientOptions.adapter = adapter;
|
|
40361
|
+
const leavingHouseEnv = !swapOpts.house && (houseActive || isHouseProxyEnv(process.env) || Object.keys(houseEnv).length > 0) ? clearHouseProxyEnvOverrides() : {};
|
|
40290
40362
|
clientOptions.extraEnv = {
|
|
40291
40363
|
...computeAdapterExtraEnv({
|
|
40292
40364
|
agent: nextAgent,
|
|
40293
40365
|
autoApprovePermissions: opts.autoApprovePermissions,
|
|
40294
40366
|
disable1mContext: disable1m
|
|
40295
40367
|
}),
|
|
40296
|
-
...
|
|
40368
|
+
...leavingHouseEnv,
|
|
40369
|
+
...swapOpts.house ? houseEnv : switchCredentialEnv
|
|
40297
40370
|
};
|
|
40298
40371
|
const next = new AcpClient(clientOptions);
|
|
40299
40372
|
const hs = await next.start();
|
|
@@ -40313,13 +40386,23 @@ async function runAcpSession(opts) {
|
|
|
40313
40386
|
});
|
|
40314
40387
|
budgetRecovery = makeBudgetRecovery();
|
|
40315
40388
|
pendingHandoff.current = buildHandoffPreamble(prevAgent, nextAgent, transcript);
|
|
40389
|
+
const wasHouse = houseActive;
|
|
40390
|
+
houseActive = swapOpts.house;
|
|
40391
|
+
if (swapOpts.house) {
|
|
40392
|
+
if (pendingHouseConfig) {
|
|
40393
|
+
persistHouseProxyConfig(pendingHouseConfig);
|
|
40394
|
+
pendingHouseConfig = null;
|
|
40395
|
+
}
|
|
40396
|
+
} else if (wasHouse) {
|
|
40397
|
+
clearHouseProxyConfig();
|
|
40398
|
+
}
|
|
40316
40399
|
void publisher.publishOutput({
|
|
40317
40400
|
type: "agent_banner",
|
|
40318
|
-
agentId: nextAgent,
|
|
40401
|
+
agentId: swapOpts.house ? HOUSE_AGENT_ID : nextAgent,
|
|
40319
40402
|
// A switch starts a FRESH conversation with the new agent — never "back".
|
|
40320
|
-
title: bannerTitle(false),
|
|
40321
|
-
subtitle: buildBannerSubtitle(nextAgent, hs.sessionId, hs.model, hs.tier),
|
|
40322
|
-
path: bannerLocation(opts.cwd),
|
|
40403
|
+
title: swapOpts.house ? HOUSE_AGENT_NAME : bannerTitle(false),
|
|
40404
|
+
subtitle: swapOpts.house ? HOUSE_AGENT_SUBTITLE : buildBannerSubtitle(nextAgent, hs.sessionId, hs.model, hs.tier),
|
|
40405
|
+
path: swapOpts.house ? "" : bannerLocation(opts.cwd),
|
|
40323
40406
|
done: true
|
|
40324
40407
|
});
|
|
40325
40408
|
};
|
|
@@ -40334,6 +40417,7 @@ async function runAcpSession(opts) {
|
|
|
40334
40417
|
);
|
|
40335
40418
|
const switchDeps = {
|
|
40336
40419
|
currentAgent: () => opts.agent,
|
|
40420
|
+
currentIsHouse: () => houseActive,
|
|
40337
40421
|
postEvent: emitSwitchEvent,
|
|
40338
40422
|
fetchCredential: (agentId) => fetchProvisionCredentialDetailed({
|
|
40339
40423
|
agentId,
|
|
@@ -40345,6 +40429,21 @@ async function runAcpSession(opts) {
|
|
|
40345
40429
|
provisionCredential: (agentId, auth) => {
|
|
40346
40430
|
switchCredentialEnv = provisionAgentCredentials(agentId, auth);
|
|
40347
40431
|
},
|
|
40432
|
+
provisionHouseProxy: ({ baseUrl, token }) => {
|
|
40433
|
+
const claudeConfigDir = path85.join(
|
|
40434
|
+
os62.homedir(),
|
|
40435
|
+
".codeam",
|
|
40436
|
+
"house-claude",
|
|
40437
|
+
`switch-${opts.pluginId}`
|
|
40438
|
+
);
|
|
40439
|
+
try {
|
|
40440
|
+
fs77.mkdirSync(claudeConfigDir, { recursive: true, mode: 448 });
|
|
40441
|
+
} catch {
|
|
40442
|
+
}
|
|
40443
|
+
houseEnv = buildHouseProxyChildEnv({ baseUrl, token, claudeConfigDir });
|
|
40444
|
+
pendingHouseConfig = { baseUrl, token, claudeConfigDir };
|
|
40445
|
+
switchCredentialEnv = {};
|
|
40446
|
+
},
|
|
40348
40447
|
ensureBinary: (agentId, installScript, onRetry) => ensureAgentBinaryForSwitch(agentId, installScript, { onRetry }),
|
|
40349
40448
|
swapRuntime: relaunchWith,
|
|
40350
40449
|
revertRuntime: relaunchWith,
|
|
@@ -41540,9 +41639,9 @@ function startClaudeCredentialSync(opts) {
|
|
|
41540
41639
|
}
|
|
41541
41640
|
|
|
41542
41641
|
// src/beads/workflow-hint.ts
|
|
41543
|
-
var
|
|
41544
|
-
var
|
|
41545
|
-
var
|
|
41642
|
+
var fs78 = __toESM(require("fs"));
|
|
41643
|
+
var path86 = __toESM(require("path"));
|
|
41644
|
+
var os63 = __toESM(require("os"));
|
|
41546
41645
|
var BEADS_HINT_MARKER = "<!-- codeam:beads-workflow -->";
|
|
41547
41646
|
var BEADS_HINT = `${BEADS_HINT_MARKER}
|
|
41548
41647
|
# Beads (bd) \u2014 task tracking + persistent memory (ALWAYS use it)
|
|
@@ -41556,22 +41655,22 @@ This environment uses **bd (beads)** for issue/task tracking and persistent memo
|
|
|
41556
41655
|
- \`bd ready\` (available work) \xB7 \`bd show <id>\` \xB7 \`bd update <id> --claim\` \xB7 \`bd close <id>\`.
|
|
41557
41656
|
- Use \`bd remember "..."\` for persistent knowledge \u2014 do NOT use MEMORY.md files.
|
|
41558
41657
|
${BEADS_HINT_MARKER}`;
|
|
41559
|
-
function ensureBeadsWorkflowHint(homeDir2 =
|
|
41658
|
+
function ensureBeadsWorkflowHint(homeDir2 = os63.homedir()) {
|
|
41560
41659
|
try {
|
|
41561
|
-
const file =
|
|
41660
|
+
const file = path86.join(homeDir2, ".claude", "CLAUDE.md");
|
|
41562
41661
|
let existing = "";
|
|
41563
41662
|
try {
|
|
41564
|
-
existing =
|
|
41663
|
+
existing = fs78.readFileSync(file, "utf8");
|
|
41565
41664
|
} catch {
|
|
41566
41665
|
}
|
|
41567
41666
|
if (existing.includes(BEADS_HINT_MARKER)) return;
|
|
41568
|
-
|
|
41667
|
+
fs78.mkdirSync(path86.dirname(file), { recursive: true });
|
|
41569
41668
|
const next = existing.trim() ? `${existing.trimEnd()}
|
|
41570
41669
|
|
|
41571
41670
|
${BEADS_HINT}
|
|
41572
41671
|
` : `${BEADS_HINT}
|
|
41573
41672
|
`;
|
|
41574
|
-
|
|
41673
|
+
fs78.writeFileSync(file, next);
|
|
41575
41674
|
} catch {
|
|
41576
41675
|
}
|
|
41577
41676
|
}
|
|
@@ -42082,7 +42181,7 @@ var AcpDriver = class {
|
|
|
42082
42181
|
};
|
|
42083
42182
|
|
|
42084
42183
|
// src/baton/transcript-mirror.ts
|
|
42085
|
-
var
|
|
42184
|
+
var fs79 = __toESM(require("fs"));
|
|
42086
42185
|
var TranscriptMirror = class {
|
|
42087
42186
|
constructor(deps) {
|
|
42088
42187
|
this.deps = deps;
|
|
@@ -42149,7 +42248,7 @@ var TranscriptMirror = class {
|
|
|
42149
42248
|
}
|
|
42150
42249
|
};
|
|
42151
42250
|
function defaultWatch(file, onChange) {
|
|
42152
|
-
const w3 =
|
|
42251
|
+
const w3 = fs79.watch(file, { persistent: false }, () => onChange());
|
|
42153
42252
|
return () => w3.close();
|
|
42154
42253
|
}
|
|
42155
42254
|
|
|
@@ -42479,16 +42578,16 @@ function keepDeviceAwake(deps = {}) {
|
|
|
42479
42578
|
}
|
|
42480
42579
|
|
|
42481
42580
|
// src/agents/claude/onboarding.ts
|
|
42482
|
-
var
|
|
42483
|
-
var
|
|
42484
|
-
var
|
|
42581
|
+
var fs80 = __toESM(require("fs"));
|
|
42582
|
+
var os65 = __toESM(require("os"));
|
|
42583
|
+
var path87 = __toESM(require("path"));
|
|
42485
42584
|
var ONBOARDING_VERSION_SENTINEL = "9999.0.0";
|
|
42486
42585
|
function ensureClaudeOnboarded(cwd) {
|
|
42487
42586
|
try {
|
|
42488
|
-
const file =
|
|
42587
|
+
const file = path87.join(os65.homedir(), ".claude.json");
|
|
42489
42588
|
let config = {};
|
|
42490
42589
|
try {
|
|
42491
|
-
config = JSON.parse(
|
|
42590
|
+
config = JSON.parse(fs80.readFileSync(file, "utf8"));
|
|
42492
42591
|
} catch {
|
|
42493
42592
|
}
|
|
42494
42593
|
let changed = false;
|
|
@@ -42513,8 +42612,8 @@ function ensureClaudeOnboarded(cwd) {
|
|
|
42513
42612
|
}
|
|
42514
42613
|
}
|
|
42515
42614
|
if (!changed) return;
|
|
42516
|
-
|
|
42517
|
-
|
|
42615
|
+
fs80.mkdirSync(path87.dirname(file), { recursive: true });
|
|
42616
|
+
fs80.writeFileSync(file, JSON.stringify(config, null, 2));
|
|
42518
42617
|
log.info(
|
|
42519
42618
|
"claude",
|
|
42520
42619
|
`pre-completed Claude onboarding${cwd ? ` + trusted workspace ${cwd}` : ""}`
|
|
@@ -43251,7 +43350,7 @@ var import_picocolors11 = __toESM(require("picocolors"));
|
|
|
43251
43350
|
var import_child_process31 = require("child_process");
|
|
43252
43351
|
var import_util4 = require("util");
|
|
43253
43352
|
var import_picocolors9 = __toESM(require("picocolors"));
|
|
43254
|
-
var
|
|
43353
|
+
var path88 = __toESM(require("path"));
|
|
43255
43354
|
var execFileP6 = (0, import_util4.promisify)(import_child_process31.execFile);
|
|
43256
43355
|
var MAX_BUFFER = 8 * 1024 * 1024;
|
|
43257
43356
|
function resetStdinForChild() {
|
|
@@ -43740,7 +43839,7 @@ var GitHubCodespacesProvider = class {
|
|
|
43740
43839
|
});
|
|
43741
43840
|
}
|
|
43742
43841
|
async uploadFile(workspaceId, remotePath, contents, options = {}) {
|
|
43743
|
-
const remoteDir =
|
|
43842
|
+
const remoteDir = path88.posix.dirname(remotePath);
|
|
43744
43843
|
const parts = [
|
|
43745
43844
|
`mkdir -p ${shellQuote(remoteDir)}`,
|
|
43746
43845
|
`cat > ${shellQuote(remotePath)}`
|
|
@@ -43810,7 +43909,7 @@ function shellQuote(s) {
|
|
|
43810
43909
|
// src/services/providers/gitpod.ts
|
|
43811
43910
|
var import_child_process32 = require("child_process");
|
|
43812
43911
|
var import_util5 = require("util");
|
|
43813
|
-
var
|
|
43912
|
+
var path89 = __toESM(require("path"));
|
|
43814
43913
|
var import_picocolors10 = __toESM(require("picocolors"));
|
|
43815
43914
|
var execFileP7 = (0, import_util5.promisify)(import_child_process32.execFile);
|
|
43816
43915
|
var MAX_BUFFER2 = 8 * 1024 * 1024;
|
|
@@ -44050,7 +44149,7 @@ var GitpodProvider = class {
|
|
|
44050
44149
|
});
|
|
44051
44150
|
}
|
|
44052
44151
|
async uploadFile(workspaceId, remotePath, contents, options = {}) {
|
|
44053
|
-
const remoteDir =
|
|
44152
|
+
const remoteDir = path89.posix.dirname(remotePath);
|
|
44054
44153
|
const parts = [
|
|
44055
44154
|
`mkdir -p ${shellQuote2(remoteDir)}`,
|
|
44056
44155
|
`cat > ${shellQuote2(remotePath)}`
|
|
@@ -44086,7 +44185,7 @@ function shellQuote2(s) {
|
|
|
44086
44185
|
// src/services/providers/gitlab-workspaces.ts
|
|
44087
44186
|
var import_child_process33 = require("child_process");
|
|
44088
44187
|
var import_util6 = require("util");
|
|
44089
|
-
var
|
|
44188
|
+
var path90 = __toESM(require("path"));
|
|
44090
44189
|
var execFileP8 = (0, import_util6.promisify)(import_child_process33.execFile);
|
|
44091
44190
|
var MAX_BUFFER3 = 8 * 1024 * 1024;
|
|
44092
44191
|
var GITLAB_API_BASE = process.env.CODEAM_GITLAB_API_URL ?? "https://gitlab.com/api/v4";
|
|
@@ -44346,7 +44445,7 @@ Docs: https://docs.gitlab.com/ee/user/workspace/configuration.html`
|
|
|
44346
44445
|
}
|
|
44347
44446
|
async uploadFile(workspaceId, remotePath, contents, options = {}) {
|
|
44348
44447
|
const sshHost = process.env.CODEAM_GITLAB_SSH_HOST ?? "workspaces.gitlab.com";
|
|
44349
|
-
const remoteDir =
|
|
44448
|
+
const remoteDir = path90.posix.dirname(remotePath);
|
|
44350
44449
|
const parts = [`mkdir -p ${shellQuote3(remoteDir)}`, `cat > ${shellQuote3(remotePath)}`];
|
|
44351
44450
|
if (options.mode != null) {
|
|
44352
44451
|
parts.push(`chmod ${options.mode.toString(8)} ${shellQuote3(remotePath)}`);
|
|
@@ -44414,7 +44513,7 @@ function shellQuote3(s) {
|
|
|
44414
44513
|
// src/services/providers/railway.ts
|
|
44415
44514
|
var import_child_process34 = require("child_process");
|
|
44416
44515
|
var import_util7 = require("util");
|
|
44417
|
-
var
|
|
44516
|
+
var path91 = __toESM(require("path"));
|
|
44418
44517
|
var execFileP9 = (0, import_util7.promisify)(import_child_process34.execFile);
|
|
44419
44518
|
var MAX_BUFFER4 = 8 * 1024 * 1024;
|
|
44420
44519
|
function resetStdinForChild4() {
|
|
@@ -44650,7 +44749,7 @@ var RailwayProvider = class {
|
|
|
44650
44749
|
if (!projectId || !serviceId) {
|
|
44651
44750
|
throw new Error("Invalid Railway workspace id (expected projectId/serviceId).");
|
|
44652
44751
|
}
|
|
44653
|
-
const remoteDir =
|
|
44752
|
+
const remoteDir = path91.posix.dirname(remotePath);
|
|
44654
44753
|
const parts = [`mkdir -p ${shellQuote4(remoteDir)}`, `cat > ${shellQuote4(remotePath)}`];
|
|
44655
44754
|
if (options.mode != null) {
|
|
44656
44755
|
parts.push(`chmod ${options.mode.toString(8)} ${shellQuote4(remotePath)}`);
|
|
@@ -45296,8 +45395,8 @@ async function invite() {
|
|
|
45296
45395
|
var import_node_dns = require("dns");
|
|
45297
45396
|
var import_node_util5 = require("util");
|
|
45298
45397
|
var import_node_crypto13 = require("crypto");
|
|
45299
|
-
var
|
|
45300
|
-
var
|
|
45398
|
+
var fs81 = __toESM(require("fs"));
|
|
45399
|
+
var path92 = __toESM(require("path"));
|
|
45301
45400
|
var import_picocolors14 = __toESM(require("picocolors"));
|
|
45302
45401
|
var dnsResolveP = (0, import_node_util5.promisify)(import_node_dns.resolve);
|
|
45303
45402
|
async function checkDns(apiBase2) {
|
|
@@ -45353,13 +45452,13 @@ async function checkHealth(apiBase2) {
|
|
|
45353
45452
|
}
|
|
45354
45453
|
}
|
|
45355
45454
|
function checkConfigDir() {
|
|
45356
|
-
const dir =
|
|
45455
|
+
const dir = path92.join(require("os").homedir(), ".codeam");
|
|
45357
45456
|
try {
|
|
45358
|
-
|
|
45359
|
-
const probe =
|
|
45360
|
-
|
|
45361
|
-
const read2 =
|
|
45362
|
-
|
|
45457
|
+
fs81.mkdirSync(dir, { recursive: true, mode: 448 });
|
|
45458
|
+
const probe = path92.join(dir, ".doctor-probe");
|
|
45459
|
+
fs81.writeFileSync(probe, "ok", { mode: 384 });
|
|
45460
|
+
const read2 = fs81.readFileSync(probe, "utf8");
|
|
45461
|
+
fs81.unlinkSync(probe);
|
|
45363
45462
|
if (read2 !== "ok") throw new Error("write/read round-trip mismatch");
|
|
45364
45463
|
return {
|
|
45365
45464
|
id: "config-dir",
|
|
@@ -45399,9 +45498,9 @@ function checkSessions() {
|
|
|
45399
45498
|
}
|
|
45400
45499
|
}
|
|
45401
45500
|
function checkAgentBinaries() {
|
|
45402
|
-
const
|
|
45501
|
+
const os68 = createOsStrategy();
|
|
45403
45502
|
return getEnabledAgents().map((meta) => {
|
|
45404
|
-
const found =
|
|
45503
|
+
const found = os68.findInPath(meta.binaryName);
|
|
45405
45504
|
return {
|
|
45406
45505
|
id: `agent-${meta.id}`,
|
|
45407
45506
|
label: `Agent binary: ${meta.displayName} (${meta.binaryName})`,
|
|
@@ -45423,7 +45522,7 @@ function checkNodePty() {
|
|
|
45423
45522
|
detail: "not required on this platform"
|
|
45424
45523
|
};
|
|
45425
45524
|
}
|
|
45426
|
-
const vendoredPath =
|
|
45525
|
+
const vendoredPath = path92.join(__dirname, "vendor", "node-pty");
|
|
45427
45526
|
for (const target of [vendoredPath, "node-pty"]) {
|
|
45428
45527
|
try {
|
|
45429
45528
|
require(target);
|
|
@@ -45465,7 +45564,7 @@ function checkChokidar() {
|
|
|
45465
45564
|
}
|
|
45466
45565
|
async function doctor(args2 = []) {
|
|
45467
45566
|
const json = args2.includes("--json");
|
|
45468
|
-
const cliVersion = true ? "2.65.
|
|
45567
|
+
const cliVersion = true ? "2.65.16" : "0.0.0-dev";
|
|
45469
45568
|
const apiBase2 = resolveApiBaseUrl();
|
|
45470
45569
|
const diagnosticId = (0, import_node_crypto13.randomUUID)();
|
|
45471
45570
|
log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
|
|
@@ -45856,7 +45955,7 @@ async function mcpRun(args2) {
|
|
|
45856
45955
|
// src/commands/version.ts
|
|
45857
45956
|
var import_picocolors15 = __toESM(require("picocolors"));
|
|
45858
45957
|
function version2() {
|
|
45859
|
-
const v = true ? "2.65.
|
|
45958
|
+
const v = true ? "2.65.16" : "unknown";
|
|
45860
45959
|
console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
|
|
45861
45960
|
}
|
|
45862
45961
|
|
|
@@ -46005,10 +46104,10 @@ var EXIT_CODE_NAMES = {
|
|
|
46005
46104
|
};
|
|
46006
46105
|
|
|
46007
46106
|
// src/index.ts
|
|
46008
|
-
var
|
|
46107
|
+
var os67 = __toESM(require("os"));
|
|
46009
46108
|
if (!process.env.HOME) {
|
|
46010
46109
|
try {
|
|
46011
|
-
const home =
|
|
46110
|
+
const home = os67.homedir();
|
|
46012
46111
|
if (home) process.env.HOME = home;
|
|
46013
46112
|
} catch {
|
|
46014
46113
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codeam-cli",
|
|
3
|
-
"version": "2.65.
|
|
3
|
+
"version": "2.65.16",
|
|
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",
|