codeam-cli 2.76.13 → 2.76.14
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 +268 -244
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -358,7 +358,7 @@ function defaultSpawn(timeoutMs) {
|
|
|
358
358
|
}
|
|
359
359
|
function resolveConvexBin(cwd) {
|
|
360
360
|
const local = path112.join(cwd, "node_modules", ".bin", process.platform === "win32" ? "convex.cmd" : "convex");
|
|
361
|
-
if (
|
|
361
|
+
if (fs99.existsSync(local)) return { cmd: local, args: [] };
|
|
362
362
|
return { cmd: "npx", args: ["--yes", "convex"] };
|
|
363
363
|
}
|
|
364
364
|
function redact(text, key) {
|
|
@@ -489,12 +489,12 @@ async function runConvexAdminMcp(client3, id) {
|
|
|
489
489
|
});
|
|
490
490
|
await server.connect(new StdioServerTransport());
|
|
491
491
|
}
|
|
492
|
-
var import_node_child_process38,
|
|
492
|
+
var import_node_child_process38, fs99, path112, TOOLS;
|
|
493
493
|
var init_convex_admin_mcp = __esm({
|
|
494
494
|
"src/integrations/convex-admin-mcp.ts"() {
|
|
495
495
|
"use strict";
|
|
496
496
|
import_node_child_process38 = require("child_process");
|
|
497
|
-
|
|
497
|
+
fs99 = __toESM(require("fs"));
|
|
498
498
|
path112 = __toESM(require("path"));
|
|
499
499
|
TOOLS = [
|
|
500
500
|
{
|
|
@@ -3765,7 +3765,7 @@ var _default = makeConfig();
|
|
|
3765
3765
|
var { getConfig, ensurePluginId, addSession, removeSession, setActiveSession, getActiveSession, getActiveSessionForAgent, setDisable1mContext, setSessionAgent, setSquadAuto, getSquadAuto, clearAll, saveCliConfig, loadCliConfig } = _default;
|
|
3766
3766
|
|
|
3767
3767
|
// src/commands/pair-auto.ts
|
|
3768
|
-
var
|
|
3768
|
+
var fs66 = __toESM(require("fs"));
|
|
3769
3769
|
var os48 = __toESM(require("os"));
|
|
3770
3770
|
var path74 = __toESM(require("path"));
|
|
3771
3771
|
var import_crypto4 = require("crypto");
|
|
@@ -10579,7 +10579,7 @@ function readAnonId() {
|
|
|
10579
10579
|
}
|
|
10580
10580
|
function superProperties() {
|
|
10581
10581
|
return {
|
|
10582
|
-
cliVersion: true ? "2.76.
|
|
10582
|
+
cliVersion: true ? "2.76.14" : "0.0.0-dev",
|
|
10583
10583
|
nodeVersion: process.version,
|
|
10584
10584
|
platform: process.platform,
|
|
10585
10585
|
arch: process.arch,
|
|
@@ -10824,7 +10824,7 @@ var http = __toESM(require("http"));
|
|
|
10824
10824
|
// package.json
|
|
10825
10825
|
var package_default = {
|
|
10826
10826
|
name: "codeam-cli",
|
|
10827
|
-
version: "2.76.
|
|
10827
|
+
version: "2.76.14",
|
|
10828
10828
|
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.",
|
|
10829
10829
|
type: "commonjs",
|
|
10830
10830
|
main: "dist/index.js",
|
|
@@ -12160,7 +12160,7 @@ var CommandRelayService = class _CommandRelayService {
|
|
|
12160
12160
|
// fresh + clear the "CLI update available" banner after a self-update
|
|
12161
12161
|
// (a codespace that reinstalls @latest reconnects via heartbeat, not
|
|
12162
12162
|
// pair/reconnect). Older backends ignore the extra field.
|
|
12163
|
-
..."2.76.
|
|
12163
|
+
..."2.76.14" ? { ideVersion: "2.76.14" } : {}
|
|
12164
12164
|
};
|
|
12165
12165
|
try {
|
|
12166
12166
|
const res = await _postJson(`${API_BASE2}/api/plugin/heartbeat`, body);
|
|
@@ -13636,7 +13636,7 @@ function closeAllTerminals() {
|
|
|
13636
13636
|
}
|
|
13637
13637
|
|
|
13638
13638
|
// src/commands/start/handlers.ts
|
|
13639
|
-
var
|
|
13639
|
+
var fs65 = __toESM(require("fs"));
|
|
13640
13640
|
var os47 = __toESM(require("os"));
|
|
13641
13641
|
var path73 = __toESM(require("path"));
|
|
13642
13642
|
var import_crypto3 = require("crypto");
|
|
@@ -28295,10 +28295,12 @@ function persistBeadsConfig(cfg) {
|
|
|
28295
28295
|
}
|
|
28296
28296
|
|
|
28297
28297
|
// src/beads/provision-lock.ts
|
|
28298
|
-
var
|
|
28298
|
+
var import_fs8 = __toESM(require("fs"));
|
|
28299
28299
|
var import_os11 = __toESM(require("os"));
|
|
28300
28300
|
var import_path9 = __toESM(require("path"));
|
|
28301
|
-
|
|
28301
|
+
|
|
28302
|
+
// src/lib/process-identity.ts
|
|
28303
|
+
var import_fs7 = __toESM(require("fs"));
|
|
28302
28304
|
function pidIsAlive(pid) {
|
|
28303
28305
|
try {
|
|
28304
28306
|
process.kill(pid, 0);
|
|
@@ -28307,32 +28309,56 @@ function pidIsAlive(pid) {
|
|
|
28307
28309
|
return err.code === "EPERM";
|
|
28308
28310
|
}
|
|
28309
28311
|
}
|
|
28312
|
+
function procStartTime(pid) {
|
|
28313
|
+
try {
|
|
28314
|
+
const stat3 = import_fs7.default.readFileSync(`/proc/${pid}/stat`, "utf8");
|
|
28315
|
+
const rest = stat3.slice(stat3.lastIndexOf(")") + 2).split(" ");
|
|
28316
|
+
return rest[19] ?? "";
|
|
28317
|
+
} catch {
|
|
28318
|
+
return "";
|
|
28319
|
+
}
|
|
28320
|
+
}
|
|
28321
|
+
function ownerRecord(pid, deps = {}) {
|
|
28322
|
+
return `${pid} ${(deps.startTimeOf ?? procStartTime)(pid)}`.trim();
|
|
28323
|
+
}
|
|
28324
|
+
function ownerIsAlive(record2, deps = {}) {
|
|
28325
|
+
const [pidText, recordedStart = ""] = record2.trim().split(/\s+/);
|
|
28326
|
+
const pid = Number(pidText);
|
|
28327
|
+
if (!Number.isInteger(pid) || pid <= 0) return false;
|
|
28328
|
+
if (!(deps.isAlive ?? pidIsAlive)(pid)) return false;
|
|
28329
|
+
if (!recordedStart) return true;
|
|
28330
|
+
const now = (deps.startTimeOf ?? procStartTime)(pid);
|
|
28331
|
+
return now === "" || now === recordedStart;
|
|
28332
|
+
}
|
|
28333
|
+
|
|
28334
|
+
// src/beads/provision-lock.ts
|
|
28335
|
+
var STALE_LOCK_MS = 5 * 6e4;
|
|
28310
28336
|
function tryAcquire(lockDir, deps) {
|
|
28311
28337
|
const pid = deps.pid ?? process.pid;
|
|
28312
28338
|
try {
|
|
28313
|
-
|
|
28314
|
-
|
|
28315
|
-
|
|
28339
|
+
import_fs8.default.mkdirSync(import_path9.default.dirname(lockDir), { recursive: true });
|
|
28340
|
+
import_fs8.default.mkdirSync(lockDir);
|
|
28341
|
+
import_fs8.default.writeFileSync(import_path9.default.join(lockDir, "pid"), ownerRecord(pid, deps));
|
|
28316
28342
|
return true;
|
|
28317
28343
|
} catch (err) {
|
|
28318
28344
|
if (err.code !== "EEXIST") return true;
|
|
28319
28345
|
}
|
|
28320
28346
|
let age;
|
|
28321
28347
|
try {
|
|
28322
|
-
age = (deps.now ?? Date.now)() -
|
|
28348
|
+
age = (deps.now ?? Date.now)() - import_fs8.default.statSync(lockDir).mtimeMs;
|
|
28323
28349
|
} catch {
|
|
28324
28350
|
return tryAcquireOnce(lockDir, deps);
|
|
28325
28351
|
}
|
|
28326
|
-
let holder =
|
|
28352
|
+
let holder = "";
|
|
28327
28353
|
try {
|
|
28328
|
-
holder =
|
|
28354
|
+
holder = import_fs8.default.readFileSync(import_path9.default.join(lockDir, "pid"), "utf8");
|
|
28329
28355
|
} catch {
|
|
28330
28356
|
if (age <= 1e4) return false;
|
|
28331
28357
|
}
|
|
28332
|
-
const alive =
|
|
28358
|
+
const alive = holder !== "" && ownerIsAlive(holder, deps);
|
|
28333
28359
|
if (alive && age <= STALE_LOCK_MS) return false;
|
|
28334
28360
|
try {
|
|
28335
|
-
|
|
28361
|
+
import_fs8.default.rmSync(lockDir, { recursive: true, force: true });
|
|
28336
28362
|
} catch {
|
|
28337
28363
|
return false;
|
|
28338
28364
|
}
|
|
@@ -28340,8 +28366,8 @@ function tryAcquire(lockDir, deps) {
|
|
|
28340
28366
|
}
|
|
28341
28367
|
function tryAcquireOnce(lockDir, deps) {
|
|
28342
28368
|
try {
|
|
28343
|
-
|
|
28344
|
-
|
|
28369
|
+
import_fs8.default.mkdirSync(lockDir);
|
|
28370
|
+
import_fs8.default.writeFileSync(import_path9.default.join(lockDir, "pid"), ownerRecord(deps.pid ?? process.pid, deps));
|
|
28345
28371
|
return true;
|
|
28346
28372
|
} catch {
|
|
28347
28373
|
return false;
|
|
@@ -28362,8 +28388,8 @@ async function withBeadsProvisionLock(fn, deps = {}) {
|
|
|
28362
28388
|
} finally {
|
|
28363
28389
|
if (held) {
|
|
28364
28390
|
try {
|
|
28365
|
-
const owner = Number(
|
|
28366
|
-
if (owner === (deps.pid ?? process.pid))
|
|
28391
|
+
const owner = Number(import_fs8.default.readFileSync(import_path9.default.join(lockDir, "pid"), "utf8").trim().split(/\s+/)[0]);
|
|
28392
|
+
if (owner === (deps.pid ?? process.pid)) import_fs8.default.rmSync(lockDir, { recursive: true, force: true });
|
|
28367
28393
|
} catch {
|
|
28368
28394
|
}
|
|
28369
28395
|
}
|
|
@@ -28639,7 +28665,7 @@ function saveFilesTemp(files) {
|
|
|
28639
28665
|
return files.filter(({ base64 }) => base64 && base64.length > 0).map(({ filename, base64 }) => {
|
|
28640
28666
|
const safeName = filename.replace(/[^a-zA-Z0-9._-]/g, "_").slice(0, 80);
|
|
28641
28667
|
const tmpPath = path73.join(os47.tmpdir(), `codeam-${(0, import_crypto3.randomUUID)()}-${safeName}`);
|
|
28642
|
-
|
|
28668
|
+
fs65.writeFileSync(tmpPath, Buffer.from(base64, "base64"));
|
|
28643
28669
|
pendingAttachmentFiles.add(tmpPath);
|
|
28644
28670
|
return tmpPath;
|
|
28645
28671
|
});
|
|
@@ -28887,7 +28913,7 @@ var envReadH = async (ctx, cmd) => {
|
|
|
28887
28913
|
const envPath = path73.join(process.cwd(), ".env");
|
|
28888
28914
|
await restoreProjectEnvIfMissing(process.cwd(), ctx);
|
|
28889
28915
|
try {
|
|
28890
|
-
const raw = await
|
|
28916
|
+
const raw = await fs65.promises.readFile(envPath, "utf8");
|
|
28891
28917
|
await ctx.relay.sendResult(cmd.id, "completed", {
|
|
28892
28918
|
exists: true,
|
|
28893
28919
|
vars: parseDotenv(raw)
|
|
@@ -28916,7 +28942,7 @@ var envParseH = async (ctx, cmd, parsed) => {
|
|
|
28916
28942
|
const existing = /* @__PURE__ */ new Map();
|
|
28917
28943
|
if (!replace) {
|
|
28918
28944
|
try {
|
|
28919
|
-
const raw = await
|
|
28945
|
+
const raw = await fs65.promises.readFile(path73.join(process.cwd(), ".env"), "utf8");
|
|
28920
28946
|
for (const v of parseDotenv(raw)) existing.set(v.key, v.value);
|
|
28921
28947
|
} catch {
|
|
28922
28948
|
}
|
|
@@ -28959,12 +28985,12 @@ var envWriteH = async (ctx, cmd, parsed) => {
|
|
|
28959
28985
|
const envPath = path73.join(process.cwd(), ".env");
|
|
28960
28986
|
const tmpPath = path73.join(process.cwd(), ".env.codeam.tmp");
|
|
28961
28987
|
try {
|
|
28962
|
-
await
|
|
28963
|
-
await
|
|
28988
|
+
await fs65.promises.writeFile(tmpPath, serializeDotenv(vars), "utf8");
|
|
28989
|
+
await fs65.promises.rename(tmpPath, envPath);
|
|
28964
28990
|
await ctx.relay.sendResult(cmd.id, "completed", { ok: true, count: vars.length });
|
|
28965
28991
|
void syncProjectEnvUp(process.cwd(), ctx);
|
|
28966
28992
|
} catch (err) {
|
|
28967
|
-
await
|
|
28993
|
+
await fs65.promises.rm(tmpPath, { force: true }).catch(() => void 0);
|
|
28968
28994
|
await ctx.relay.sendResult(cmd.id, "failed", { error: err.message });
|
|
28969
28995
|
}
|
|
28970
28996
|
};
|
|
@@ -29313,7 +29339,7 @@ var CLI_UPDATE_MAX_ATTEMPTS = 3;
|
|
|
29313
29339
|
function buildNpmInstallInvocation(opts) {
|
|
29314
29340
|
const entryScript = opts?.entryScript ?? process.argv[1] ?? "";
|
|
29315
29341
|
const execPath = opts?.execPath ?? process.execPath;
|
|
29316
|
-
const exists2 = opts?.existsSync ??
|
|
29342
|
+
const exists2 = opts?.existsSync ?? fs65.existsSync;
|
|
29317
29343
|
const platform3 = opts?.platform ?? process.platform;
|
|
29318
29344
|
const p2 = platform3 === "win32" ? path73.win32 : path73.posix;
|
|
29319
29345
|
const normalized = entryScript.split(/[\\/]/).join("/");
|
|
@@ -29344,9 +29370,9 @@ function resolveGlobalNodeModulesDir(opts) {
|
|
|
29344
29370
|
var STALE_STAGING_AGE_MS = CLI_UPDATE_INSTALL_TIMEOUT_MS;
|
|
29345
29371
|
function sweepStaleCliStagingDirs(nodeModulesDir, now = Date.now(), deps) {
|
|
29346
29372
|
if (!nodeModulesDir) return 0;
|
|
29347
|
-
const readdirSync18 = deps?.readdirSync ??
|
|
29348
|
-
const statSync17 = deps?.statSync ??
|
|
29349
|
-
const rmSync14 = deps?.rmSync ??
|
|
29373
|
+
const readdirSync18 = deps?.readdirSync ?? fs65.readdirSync;
|
|
29374
|
+
const statSync17 = deps?.statSync ?? fs65.statSync;
|
|
29375
|
+
const rmSync14 = deps?.rmSync ?? fs65.rmSync;
|
|
29350
29376
|
let removed = 0;
|
|
29351
29377
|
let entries2;
|
|
29352
29378
|
try {
|
|
@@ -30481,7 +30507,7 @@ function resolveTokenValue(args2) {
|
|
|
30481
30507
|
if (fileFlag) {
|
|
30482
30508
|
const path114 = fileFlag.slice("--token-file=".length);
|
|
30483
30509
|
try {
|
|
30484
|
-
const content =
|
|
30510
|
+
const content = fs66.readFileSync(path114, "utf8").trim();
|
|
30485
30511
|
if (content.length === 0) fail(`--token-file ${path114} is empty`);
|
|
30486
30512
|
rmIfExistsQuiet(path114);
|
|
30487
30513
|
return content;
|
|
@@ -30580,7 +30606,7 @@ function pairAutoLockPath() {
|
|
|
30580
30606
|
var procRoot = "/proc";
|
|
30581
30607
|
function readProcFile(rel) {
|
|
30582
30608
|
try {
|
|
30583
|
-
return
|
|
30609
|
+
return fs66.readFileSync(path74.join(procRoot, rel), "utf8");
|
|
30584
30610
|
} catch {
|
|
30585
30611
|
return void 0;
|
|
30586
30612
|
}
|
|
@@ -30601,7 +30627,7 @@ function currentBootId() {
|
|
|
30601
30627
|
function readLockRecord(lockPath) {
|
|
30602
30628
|
let raw;
|
|
30603
30629
|
try {
|
|
30604
|
-
raw =
|
|
30630
|
+
raw = fs66.readFileSync(lockPath, "utf8");
|
|
30605
30631
|
} catch {
|
|
30606
30632
|
return void 0;
|
|
30607
30633
|
}
|
|
@@ -30650,7 +30676,7 @@ function isLiveLockHolder(rec) {
|
|
|
30650
30676
|
}
|
|
30651
30677
|
function releaseOwnLock(lockPath) {
|
|
30652
30678
|
try {
|
|
30653
|
-
if (readLockRecord(lockPath)?.pid === process.pid)
|
|
30679
|
+
if (readLockRecord(lockPath)?.pid === process.pid) fs66.unlinkSync(lockPath);
|
|
30654
30680
|
} catch {
|
|
30655
30681
|
}
|
|
30656
30682
|
}
|
|
@@ -30674,7 +30700,7 @@ function snapshotProcessTree(root) {
|
|
|
30674
30700
|
const children = /* @__PURE__ */ new Map();
|
|
30675
30701
|
let entries2 = [];
|
|
30676
30702
|
try {
|
|
30677
|
-
entries2 =
|
|
30703
|
+
entries2 = fs66.readdirSync(procRoot).filter((e) => /^\d+$/.test(e));
|
|
30678
30704
|
} catch {
|
|
30679
30705
|
}
|
|
30680
30706
|
for (const e of entries2) {
|
|
@@ -30714,13 +30740,13 @@ function daemonLockPath(sessionId) {
|
|
|
30714
30740
|
function acquireDaemonLock(sessionId) {
|
|
30715
30741
|
const lockPath = daemonLockPath(sessionId);
|
|
30716
30742
|
try {
|
|
30717
|
-
|
|
30743
|
+
fs66.mkdirSync(path74.dirname(lockPath), { recursive: true });
|
|
30718
30744
|
try {
|
|
30719
|
-
|
|
30745
|
+
fs66.writeFileSync(lockPath, ownLockBody(), { flag: "wx" });
|
|
30720
30746
|
} catch (e) {
|
|
30721
30747
|
if (e.code !== "EEXIST") throw e;
|
|
30722
30748
|
if (isLiveLockHolder(readLockRecord(lockPath))) return false;
|
|
30723
|
-
|
|
30749
|
+
fs66.writeFileSync(lockPath, ownLockBody());
|
|
30724
30750
|
}
|
|
30725
30751
|
const release3 = () => releaseOwnLock(lockPath);
|
|
30726
30752
|
process.once("exit", release3);
|
|
@@ -30740,13 +30766,13 @@ function acquireDaemonLock(sessionId) {
|
|
|
30740
30766
|
function acquireSingletonLock() {
|
|
30741
30767
|
const lockPath = pairAutoLockPath();
|
|
30742
30768
|
try {
|
|
30743
|
-
|
|
30769
|
+
fs66.mkdirSync(path74.dirname(lockPath), { recursive: true });
|
|
30744
30770
|
try {
|
|
30745
|
-
|
|
30771
|
+
fs66.writeFileSync(lockPath, ownLockBody(), { flag: "wx" });
|
|
30746
30772
|
} catch (e) {
|
|
30747
30773
|
if (e.code !== "EEXIST") throw e;
|
|
30748
30774
|
if (isLiveLockHolder(readLockRecord(lockPath))) return false;
|
|
30749
|
-
|
|
30775
|
+
fs66.writeFileSync(lockPath, ownLockBody());
|
|
30750
30776
|
}
|
|
30751
30777
|
process.once("exit", () => releaseOwnLock(lockPath));
|
|
30752
30778
|
return true;
|
|
@@ -31469,26 +31495,19 @@ async function resolveAcpAdapterWithRetry(agent, opts = {}) {
|
|
|
31469
31495
|
}
|
|
31470
31496
|
|
|
31471
31497
|
// src/commands/start/agent-startup-marks.ts
|
|
31472
|
-
var
|
|
31498
|
+
var import_fs9 = __toESM(require("fs"));
|
|
31473
31499
|
var import_os13 = __toESM(require("os"));
|
|
31474
31500
|
var import_path10 = __toESM(require("path"));
|
|
31475
31501
|
var STALE_MARK_MS = 18e4;
|
|
31476
31502
|
function marksDir(deps) {
|
|
31477
31503
|
return deps.dir ?? import_path10.default.join(import_os13.default.homedir(), ".codeam", "agent-startups");
|
|
31478
31504
|
}
|
|
31479
|
-
function pidIsAlive2(pid) {
|
|
31480
|
-
try {
|
|
31481
|
-
process.kill(pid, 0);
|
|
31482
|
-
return true;
|
|
31483
|
-
} catch (err) {
|
|
31484
|
-
return err.code === "EPERM";
|
|
31485
|
-
}
|
|
31486
|
-
}
|
|
31487
31505
|
function markAgentStarting(deps = {}) {
|
|
31488
|
-
const
|
|
31506
|
+
const pid = deps.pid ?? process.pid;
|
|
31507
|
+
const file = import_path10.default.join(marksDir(deps), String(pid));
|
|
31489
31508
|
try {
|
|
31490
|
-
|
|
31491
|
-
|
|
31509
|
+
import_fs9.default.mkdirSync(import_path10.default.dirname(file), { recursive: true });
|
|
31510
|
+
import_fs9.default.writeFileSync(file, ownerRecord(pid, deps));
|
|
31492
31511
|
} catch {
|
|
31493
31512
|
return () => void 0;
|
|
31494
31513
|
}
|
|
@@ -31497,7 +31516,7 @@ function markAgentStarting(deps = {}) {
|
|
|
31497
31516
|
if (released) return;
|
|
31498
31517
|
released = true;
|
|
31499
31518
|
try {
|
|
31500
|
-
|
|
31519
|
+
import_fs9.default.rmSync(file, { force: true });
|
|
31501
31520
|
} catch {
|
|
31502
31521
|
}
|
|
31503
31522
|
};
|
|
@@ -31506,10 +31525,9 @@ function otherAgentsStarting(deps = {}) {
|
|
|
31506
31525
|
const dir = marksDir(deps);
|
|
31507
31526
|
const self = deps.pid ?? process.pid;
|
|
31508
31527
|
const now = (deps.now ?? Date.now)();
|
|
31509
|
-
const isAlive = deps.isAlive ?? pidIsAlive2;
|
|
31510
31528
|
let names;
|
|
31511
31529
|
try {
|
|
31512
|
-
names =
|
|
31530
|
+
names = import_fs9.default.readdirSync(dir);
|
|
31513
31531
|
} catch {
|
|
31514
31532
|
return [];
|
|
31515
31533
|
}
|
|
@@ -31518,17 +31536,23 @@ function otherAgentsStarting(deps = {}) {
|
|
|
31518
31536
|
const pid = Number(name);
|
|
31519
31537
|
if (!Number.isInteger(pid) || pid <= 0 || pid === self) continue;
|
|
31520
31538
|
const file = import_path10.default.join(dir, name);
|
|
31521
|
-
let
|
|
31539
|
+
let record2 = "";
|
|
31540
|
+
try {
|
|
31541
|
+
record2 = import_fs9.default.readFileSync(file, "utf8");
|
|
31542
|
+
} catch {
|
|
31543
|
+
continue;
|
|
31544
|
+
}
|
|
31545
|
+
let stale = !ownerIsAlive(record2.trim() || String(pid), deps);
|
|
31522
31546
|
if (!stale) {
|
|
31523
31547
|
try {
|
|
31524
|
-
stale = now -
|
|
31548
|
+
stale = now - import_fs9.default.statSync(file).mtimeMs > STALE_MARK_MS;
|
|
31525
31549
|
} catch {
|
|
31526
31550
|
continue;
|
|
31527
31551
|
}
|
|
31528
31552
|
}
|
|
31529
31553
|
if (stale) {
|
|
31530
31554
|
try {
|
|
31531
|
-
|
|
31555
|
+
import_fs9.default.rmSync(file, { force: true });
|
|
31532
31556
|
} catch {
|
|
31533
31557
|
}
|
|
31534
31558
|
continue;
|
|
@@ -31548,7 +31572,7 @@ async function waitForNoAgentStarting(opts) {
|
|
|
31548
31572
|
|
|
31549
31573
|
// src/agents/acp/runner.ts
|
|
31550
31574
|
var import_node_crypto15 = require("crypto");
|
|
31551
|
-
var
|
|
31575
|
+
var fs86 = __toESM(require("fs"));
|
|
31552
31576
|
var os61 = __toESM(require("os"));
|
|
31553
31577
|
var path96 = __toESM(require("path"));
|
|
31554
31578
|
|
|
@@ -31582,7 +31606,7 @@ function noteProviderBillingSignal(opts) {
|
|
|
31582
31606
|
}
|
|
31583
31607
|
|
|
31584
31608
|
// src/services/history.service.ts
|
|
31585
|
-
var
|
|
31609
|
+
var fs68 = __toESM(require("fs"));
|
|
31586
31610
|
var path77 = __toESM(require("path"));
|
|
31587
31611
|
var https6 = __toESM(require("https"));
|
|
31588
31612
|
var http10 = __toESM(require("http"));
|
|
@@ -31644,7 +31668,7 @@ function parseJsonl(filePath) {
|
|
|
31644
31668
|
const messages = [];
|
|
31645
31669
|
let raw;
|
|
31646
31670
|
try {
|
|
31647
|
-
raw =
|
|
31671
|
+
raw = fs68.readFileSync(filePath, "utf8");
|
|
31648
31672
|
} catch (err) {
|
|
31649
31673
|
if (err.code !== "ENOENT") {
|
|
31650
31674
|
log.warn("history:parseJsonl", `read failed for ${filePath}`, err);
|
|
@@ -31854,11 +31878,11 @@ var HistoryService = class _HistoryService {
|
|
|
31854
31878
|
const cutoff = this.bootTimeMs - _HistoryService.BIRTHTIME_GRACE_MS;
|
|
31855
31879
|
const oneShots = readOneShotConversations(this.cwd);
|
|
31856
31880
|
try {
|
|
31857
|
-
const files =
|
|
31881
|
+
const files = fs68.readdirSync(dir, { withFileTypes: true }).filter(
|
|
31858
31882
|
(e) => e.isFile() && e.name.endsWith(".jsonl") && !oneShots.has(path77.basename(e.name, ".jsonl"))
|
|
31859
31883
|
).map((e) => {
|
|
31860
31884
|
try {
|
|
31861
|
-
const stat3 =
|
|
31885
|
+
const stat3 = fs68.statSync(path77.join(dir, e.name));
|
|
31862
31886
|
return { name: e.name, mtime: stat3.mtimeMs, birthtime: stat3.birthtimeMs };
|
|
31863
31887
|
} catch {
|
|
31864
31888
|
return { name: e.name, mtime: 0, birthtime: 0 };
|
|
@@ -31899,13 +31923,13 @@ var HistoryService = class _HistoryService {
|
|
|
31899
31923
|
const cutoff = this.bootTimeMs - _HistoryService.BIRTHTIME_GRACE_MS;
|
|
31900
31924
|
let entries2;
|
|
31901
31925
|
try {
|
|
31902
|
-
entries2 =
|
|
31926
|
+
entries2 = fs68.readdirSync(dir, { withFileTypes: true });
|
|
31903
31927
|
} catch {
|
|
31904
31928
|
return null;
|
|
31905
31929
|
}
|
|
31906
31930
|
const files = entries2.filter((e) => e.isFile() && e.name.endsWith(".jsonl")).map((e) => {
|
|
31907
31931
|
try {
|
|
31908
|
-
const stat3 =
|
|
31932
|
+
const stat3 = fs68.statSync(path77.join(dir, e.name));
|
|
31909
31933
|
return { name: e.name, mtime: stat3.mtimeMs, birthtime: stat3.birthtimeMs };
|
|
31910
31934
|
} catch {
|
|
31911
31935
|
return { name: e.name, mtime: 0, birthtime: 0 };
|
|
@@ -31919,7 +31943,7 @@ var HistoryService = class _HistoryService {
|
|
|
31919
31943
|
extractUsageFromFile(filePath) {
|
|
31920
31944
|
let raw;
|
|
31921
31945
|
try {
|
|
31922
|
-
raw =
|
|
31946
|
+
raw = fs68.readFileSync(filePath, "utf8");
|
|
31923
31947
|
} catch {
|
|
31924
31948
|
return null;
|
|
31925
31949
|
}
|
|
@@ -31971,9 +31995,9 @@ var HistoryService = class _HistoryService {
|
|
|
31971
31995
|
let totalCost = 0;
|
|
31972
31996
|
let files;
|
|
31973
31997
|
try {
|
|
31974
|
-
files =
|
|
31998
|
+
files = fs68.readdirSync(projectDir).filter((f) => f.endsWith(".jsonl")).filter((f) => {
|
|
31975
31999
|
try {
|
|
31976
|
-
return
|
|
32000
|
+
return fs68.statSync(path77.join(projectDir, f)).mtimeMs >= monthStartMs;
|
|
31977
32001
|
} catch {
|
|
31978
32002
|
return false;
|
|
31979
32003
|
}
|
|
@@ -31984,7 +32008,7 @@ var HistoryService = class _HistoryService {
|
|
|
31984
32008
|
for (const file of files) {
|
|
31985
32009
|
let raw;
|
|
31986
32010
|
try {
|
|
31987
|
-
raw =
|
|
32011
|
+
raw = fs68.readFileSync(path77.join(projectDir, file), "utf8");
|
|
31988
32012
|
} catch {
|
|
31989
32013
|
continue;
|
|
31990
32014
|
}
|
|
@@ -32183,7 +32207,7 @@ var HistoryService = class _HistoryService {
|
|
|
32183
32207
|
if (!filePath) return false;
|
|
32184
32208
|
let mtimeMs;
|
|
32185
32209
|
try {
|
|
32186
|
-
mtimeMs =
|
|
32210
|
+
mtimeMs = fs68.statSync(filePath).mtimeMs;
|
|
32187
32211
|
} catch {
|
|
32188
32212
|
return false;
|
|
32189
32213
|
}
|
|
@@ -32258,7 +32282,7 @@ var HistoryService = class _HistoryService {
|
|
|
32258
32282
|
|
|
32259
32283
|
// src/agents/acp/client.ts
|
|
32260
32284
|
var import_node_child_process27 = require("child_process");
|
|
32261
|
-
var
|
|
32285
|
+
var fs69 = __toESM(require("fs/promises"));
|
|
32262
32286
|
var fsSync = __toESM(require("fs"));
|
|
32263
32287
|
var os51 = __toESM(require("os"));
|
|
32264
32288
|
var path79 = __toESM(require("path"));
|
|
@@ -37402,7 +37426,7 @@ var AcpClient = class {
|
|
|
37402
37426
|
throw new RequestError(-32002, GUARDRAIL_SECRET_READ_BLOCK_REASON, { uri: params.path });
|
|
37403
37427
|
}
|
|
37404
37428
|
try {
|
|
37405
|
-
const content = await
|
|
37429
|
+
const content = await fs69.readFile(params.path, "utf8");
|
|
37406
37430
|
return applyLineRange(content, params.line ?? null, params.limit ?? null);
|
|
37407
37431
|
} catch (err) {
|
|
37408
37432
|
const code = err.code;
|
|
@@ -37423,7 +37447,7 @@ var AcpClient = class {
|
|
|
37423
37447
|
throw new RequestError(-32002, INTERNAL_BLOCK_REASON, { uri: params.path });
|
|
37424
37448
|
}
|
|
37425
37449
|
try {
|
|
37426
|
-
await
|
|
37450
|
+
await fs69.writeFile(params.path, params.content, "utf8");
|
|
37427
37451
|
return {};
|
|
37428
37452
|
} catch (err) {
|
|
37429
37453
|
const code = err.code;
|
|
@@ -37826,7 +37850,7 @@ async function performAgentSwitch(deps, rawAgentId, fastPath = {}) {
|
|
|
37826
37850
|
}
|
|
37827
37851
|
|
|
37828
37852
|
// src/commands/host/agent-provisioning.ts
|
|
37829
|
-
var
|
|
37853
|
+
var fs70 = __toESM(require("fs"));
|
|
37830
37854
|
var os53 = __toESM(require("os"));
|
|
37831
37855
|
var path80 = __toESM(require("path"));
|
|
37832
37856
|
var PUBLIC_TO_INTERNAL_AGENT = {
|
|
@@ -37845,16 +37869,16 @@ function toInternalAgentId(publicAgentId) {
|
|
|
37845
37869
|
return PUBLIC_TO_INTERNAL_AGENT[publicAgentId] ?? null;
|
|
37846
37870
|
}
|
|
37847
37871
|
function ensureDir(dir) {
|
|
37848
|
-
|
|
37872
|
+
fs70.mkdirSync(dir, { recursive: true, mode: 448 });
|
|
37849
37873
|
}
|
|
37850
37874
|
function writeFile0600(filePath, contents) {
|
|
37851
37875
|
ensureDir(path80.dirname(filePath));
|
|
37852
|
-
|
|
37876
|
+
fs70.writeFileSync(filePath, contents, { encoding: "utf8", mode: 384 });
|
|
37853
37877
|
restrictToOwner(filePath);
|
|
37854
37878
|
}
|
|
37855
37879
|
function rmIfExists(filePath) {
|
|
37856
37880
|
try {
|
|
37857
|
-
|
|
37881
|
+
fs70.rmSync(filePath, { force: true });
|
|
37858
37882
|
} catch {
|
|
37859
37883
|
}
|
|
37860
37884
|
}
|
|
@@ -37873,7 +37897,7 @@ var claudeProvisioner = {
|
|
|
37873
37897
|
rmIfExists(credentialsJson);
|
|
37874
37898
|
}
|
|
37875
37899
|
const claudeJson = path80.join(home, ".claude.json");
|
|
37876
|
-
if (!
|
|
37900
|
+
if (!fs70.existsSync(claudeJson)) {
|
|
37877
37901
|
writeFile0600(
|
|
37878
37902
|
claudeJson,
|
|
37879
37903
|
JSON.stringify({ hasCompletedOnboarding: true, customApiKeyResponses: { approved: [] } })
|
|
@@ -37907,7 +37931,7 @@ function codexLoginStamp(raw) {
|
|
|
37907
37931
|
function keepsFresherCodexLogin(authJsonPath, incoming) {
|
|
37908
37932
|
let onDisk;
|
|
37909
37933
|
try {
|
|
37910
|
-
onDisk =
|
|
37934
|
+
onDisk = fs70.readFileSync(authJsonPath, "utf8");
|
|
37911
37935
|
} catch {
|
|
37912
37936
|
return false;
|
|
37913
37937
|
}
|
|
@@ -38044,7 +38068,7 @@ function provisionAgentCredentials(publicAgentId, auth, homeDir2 = os53.homedir(
|
|
|
38044
38068
|
}
|
|
38045
38069
|
|
|
38046
38070
|
// src/beads/workflow-hint.ts
|
|
38047
|
-
var
|
|
38071
|
+
var fs71 = __toESM(require("fs"));
|
|
38048
38072
|
var path81 = __toESM(require("path"));
|
|
38049
38073
|
var BEADS_HINT_MARKER = "<!-- codeam:beads-workflow -->";
|
|
38050
38074
|
var BEADS_HINT = `${BEADS_HINT_MARKER}
|
|
@@ -38072,11 +38096,11 @@ function ensureBeadsWorkflowHint(homeDir2, file = claudeMemoryFile(homeDir2)) {
|
|
|
38072
38096
|
try {
|
|
38073
38097
|
let existing = "";
|
|
38074
38098
|
try {
|
|
38075
|
-
existing =
|
|
38099
|
+
existing = fs71.readFileSync(file, "utf8");
|
|
38076
38100
|
} catch {
|
|
38077
38101
|
}
|
|
38078
38102
|
if (existing.includes(BEADS_HINT)) return;
|
|
38079
|
-
|
|
38103
|
+
fs71.mkdirSync(path81.dirname(file), { recursive: true });
|
|
38080
38104
|
let next;
|
|
38081
38105
|
const open = existing.indexOf(BEADS_HINT_MARKER);
|
|
38082
38106
|
const close = open === -1 ? -1 : existing.indexOf(BEADS_HINT_MARKER, open + BEADS_HINT_MARKER.length);
|
|
@@ -38089,40 +38113,40 @@ ${BEADS_HINT}
|
|
|
38089
38113
|
` : `${BEADS_HINT}
|
|
38090
38114
|
`;
|
|
38091
38115
|
}
|
|
38092
|
-
|
|
38116
|
+
fs71.writeFileSync(file, next);
|
|
38093
38117
|
} catch {
|
|
38094
38118
|
}
|
|
38095
38119
|
}
|
|
38096
38120
|
|
|
38097
38121
|
// src/agents/agent-standard.ts
|
|
38098
|
-
var
|
|
38122
|
+
var fs72 = __toESM(require("fs"));
|
|
38099
38123
|
var path82 = __toESM(require("path"));
|
|
38100
38124
|
var os54 = __toESM(require("os"));
|
|
38101
38125
|
function ensureAgentStandard(homeDir2, file = claudeMemoryFile(homeDir2)) {
|
|
38102
38126
|
try {
|
|
38103
38127
|
let existing = "";
|
|
38104
38128
|
try {
|
|
38105
|
-
existing =
|
|
38129
|
+
existing = fs72.readFileSync(file, "utf8");
|
|
38106
38130
|
} catch {
|
|
38107
38131
|
}
|
|
38108
38132
|
if (existing.includes(AGENT_STANDARD_MARKER)) return;
|
|
38109
|
-
|
|
38133
|
+
fs72.mkdirSync(path82.dirname(file), { recursive: true });
|
|
38110
38134
|
const next = existing.trim() ? `${existing.trimEnd()}
|
|
38111
38135
|
|
|
38112
38136
|
${AGENT_STANDARD_BLOCK}
|
|
38113
38137
|
` : `${AGENT_STANDARD_BLOCK}
|
|
38114
38138
|
`;
|
|
38115
|
-
|
|
38139
|
+
fs72.writeFileSync(file, next);
|
|
38116
38140
|
} catch {
|
|
38117
38141
|
}
|
|
38118
38142
|
}
|
|
38119
38143
|
var _agentStandardSeam = {
|
|
38120
38144
|
isLocalSession: () => isLocalSession(),
|
|
38121
38145
|
markerPath: (sessionId) => path82.join(os54.homedir(), ".codeam", "agent-standard", `${sessionId}.done`),
|
|
38122
|
-
exists: (p2) =>
|
|
38146
|
+
exists: (p2) => fs72.existsSync(p2),
|
|
38123
38147
|
write: (p2) => {
|
|
38124
|
-
|
|
38125
|
-
|
|
38148
|
+
fs72.mkdirSync(path82.dirname(p2), { recursive: true });
|
|
38149
|
+
fs72.writeFileSync(p2, "");
|
|
38126
38150
|
}
|
|
38127
38151
|
};
|
|
38128
38152
|
function isClaude(agent) {
|
|
@@ -38857,15 +38881,15 @@ function withholdTrailingPartialFenceMarker(text) {
|
|
|
38857
38881
|
|
|
38858
38882
|
// src/agents/acp/onboarding.ts
|
|
38859
38883
|
var import_child_process28 = require("child_process");
|
|
38860
|
-
var
|
|
38884
|
+
var fs74 = __toESM(require("fs"));
|
|
38861
38885
|
var os55 = __toESM(require("os"));
|
|
38862
38886
|
var path84 = __toESM(require("path"));
|
|
38863
38887
|
var _onboardingSeam = {
|
|
38864
38888
|
markerPath: (sessionId) => path84.join(os55.homedir(), ".codeam", "welcomed", `${sessionId}.done`),
|
|
38865
|
-
exists: (p2) =>
|
|
38889
|
+
exists: (p2) => fs74.existsSync(p2),
|
|
38866
38890
|
write: (p2) => {
|
|
38867
|
-
|
|
38868
|
-
|
|
38891
|
+
fs74.mkdirSync(path84.dirname(p2), { recursive: true });
|
|
38892
|
+
fs74.writeFileSync(p2, "");
|
|
38869
38893
|
},
|
|
38870
38894
|
disabled: () => {
|
|
38871
38895
|
const v = process.env.CODEAM_ONBOARDING_DISABLED;
|
|
@@ -39294,13 +39318,13 @@ var import_crypto5 = require("crypto");
|
|
|
39294
39318
|
|
|
39295
39319
|
// src/services/turn-files/git-changeset.ts
|
|
39296
39320
|
var import_child_process29 = require("child_process");
|
|
39297
|
-
var
|
|
39298
|
-
var
|
|
39321
|
+
var fs76 = __toESM(require("fs/promises"));
|
|
39322
|
+
var import_fs10 = require("fs");
|
|
39299
39323
|
var path86 = __toESM(require("path"));
|
|
39300
39324
|
|
|
39301
39325
|
// src/services/turn-files/review-ignore.ts
|
|
39302
39326
|
var import_ignore2 = __toESM(require("ignore"));
|
|
39303
|
-
var
|
|
39327
|
+
var fs75 = __toESM(require("fs"));
|
|
39304
39328
|
var path85 = __toESM(require("path"));
|
|
39305
39329
|
var CURATED_REVIEW_IGNORE = [
|
|
39306
39330
|
// Google Cloud SDK (the incident) — installs a huge python tree.
|
|
@@ -39345,7 +39369,7 @@ var CURATED_REVIEW_IGNORE = [
|
|
|
39345
39369
|
function makeReviewIgnore(repoRoot) {
|
|
39346
39370
|
const ig = (0, import_ignore2.default)().add(CURATED_REVIEW_IGNORE);
|
|
39347
39371
|
try {
|
|
39348
|
-
const custom =
|
|
39372
|
+
const custom = fs75.readFileSync(path85.join(repoRoot, ".codeam", "reviewignore"), "utf8");
|
|
39349
39373
|
ig.add(custom);
|
|
39350
39374
|
} catch {
|
|
39351
39375
|
}
|
|
@@ -39428,7 +39452,7 @@ function readUntrackedLineCount(absPath) {
|
|
|
39428
39452
|
}
|
|
39429
39453
|
async function defaultReadUntrackedLineCount(absPath) {
|
|
39430
39454
|
try {
|
|
39431
|
-
const content = await
|
|
39455
|
+
const content = await fs76.readFile(absPath, "utf8");
|
|
39432
39456
|
let count = 0;
|
|
39433
39457
|
let pos = -1;
|
|
39434
39458
|
while ((pos = content.indexOf("\n", pos + 1)) !== -1) {
|
|
@@ -39520,7 +39544,7 @@ function defaultRunGit(cwd, args2) {
|
|
|
39520
39544
|
});
|
|
39521
39545
|
}
|
|
39522
39546
|
async function discoverRepos(workingDir, maxDepth = 4) {
|
|
39523
|
-
const
|
|
39547
|
+
const fs100 = await import("fs/promises");
|
|
39524
39548
|
const out2 = [];
|
|
39525
39549
|
await walk2(workingDir, 0);
|
|
39526
39550
|
return out2;
|
|
@@ -39528,7 +39552,7 @@ async function discoverRepos(workingDir, maxDepth = 4) {
|
|
|
39528
39552
|
if (depth2 > maxDepth) return;
|
|
39529
39553
|
let entries2 = [];
|
|
39530
39554
|
try {
|
|
39531
|
-
const dirents = await
|
|
39555
|
+
const dirents = await fs100.readdir(dir, { withFileTypes: true });
|
|
39532
39556
|
entries2 = dirents.filter((d3) => !d3.name.startsWith(".") || d3.name === ".git").map((d3) => ({ name: d3.name, isDirectory: d3.isDirectory() }));
|
|
39533
39557
|
} catch {
|
|
39534
39558
|
return;
|
|
@@ -39554,7 +39578,7 @@ async function discoverRepos(workingDir, maxDepth = 4) {
|
|
|
39554
39578
|
}
|
|
39555
39579
|
function isReviewablePath(absPath) {
|
|
39556
39580
|
try {
|
|
39557
|
-
const st3 = (0,
|
|
39581
|
+
const st3 = (0, import_fs10.lstatSync)(absPath);
|
|
39558
39582
|
return st3.isFile() || st3.isSymbolicLink();
|
|
39559
39583
|
} catch {
|
|
39560
39584
|
return true;
|
|
@@ -39562,7 +39586,7 @@ function isReviewablePath(absPath) {
|
|
|
39562
39586
|
}
|
|
39563
39587
|
|
|
39564
39588
|
// src/services/turn-files/files-outbox.ts
|
|
39565
|
-
var
|
|
39589
|
+
var fs77 = __toESM(require("fs/promises"));
|
|
39566
39590
|
var path87 = __toESM(require("path"));
|
|
39567
39591
|
var import_os14 = require("os");
|
|
39568
39592
|
var HOME_OUTBOX_DIR = ".codeam/outbox";
|
|
@@ -39604,8 +39628,8 @@ var FilesOutbox = class {
|
|
|
39604
39628
|
/** Persist the entry to disk and trigger a flush. Returns once the
|
|
39605
39629
|
* line is durable on disk (not once the POST succeeds). */
|
|
39606
39630
|
async enqueue(entry) {
|
|
39607
|
-
await
|
|
39608
|
-
await
|
|
39631
|
+
await fs77.mkdir(path87.dirname(this.filePath), { recursive: true });
|
|
39632
|
+
await fs77.appendFile(this.filePath, JSON.stringify(entry) + "\n", "utf8");
|
|
39609
39633
|
this.backoffIndex = 0;
|
|
39610
39634
|
if (this.autoSchedule) this.scheduleFlush(0);
|
|
39611
39635
|
}
|
|
@@ -39696,7 +39720,7 @@ var FilesOutbox = class {
|
|
|
39696
39720
|
async readAll() {
|
|
39697
39721
|
let raw = "";
|
|
39698
39722
|
try {
|
|
39699
|
-
raw = await
|
|
39723
|
+
raw = await fs77.readFile(this.filePath, "utf8");
|
|
39700
39724
|
} catch {
|
|
39701
39725
|
return [];
|
|
39702
39726
|
}
|
|
@@ -39720,12 +39744,12 @@ var FilesOutbox = class {
|
|
|
39720
39744
|
async rewrite(entries2) {
|
|
39721
39745
|
const tmpPath = `${this.filePath}.${process.pid}.tmp`;
|
|
39722
39746
|
if (entries2.length === 0) {
|
|
39723
|
-
await
|
|
39747
|
+
await fs77.unlink(this.filePath).catch(() => void 0);
|
|
39724
39748
|
return;
|
|
39725
39749
|
}
|
|
39726
39750
|
const payload = entries2.map((e) => JSON.stringify(e)).join("\n") + "\n";
|
|
39727
|
-
await
|
|
39728
|
-
await
|
|
39751
|
+
await fs77.writeFile(tmpPath, payload, "utf8");
|
|
39752
|
+
await fs77.rename(tmpPath, this.filePath);
|
|
39729
39753
|
}
|
|
39730
39754
|
};
|
|
39731
39755
|
function applyJitter(ms) {
|
|
@@ -40073,7 +40097,7 @@ async function readActiveConversationMarker(cwd, homeDir2) {
|
|
|
40073
40097
|
}
|
|
40074
40098
|
|
|
40075
40099
|
// src/services/turn-marker.ts
|
|
40076
|
-
var
|
|
40100
|
+
var fs79 = __toESM(require("fs"));
|
|
40077
40101
|
var os57 = __toESM(require("os"));
|
|
40078
40102
|
var path89 = __toESM(require("path"));
|
|
40079
40103
|
var depth = 0;
|
|
@@ -40086,14 +40110,14 @@ function turnMarkerPath(pid = process.pid, home = codeamHome()) {
|
|
|
40086
40110
|
function mark() {
|
|
40087
40111
|
try {
|
|
40088
40112
|
const file = turnMarkerPath();
|
|
40089
|
-
|
|
40090
|
-
|
|
40113
|
+
fs79.mkdirSync(path89.dirname(file), { recursive: true });
|
|
40114
|
+
fs79.writeFileSync(file, String(Date.now()));
|
|
40091
40115
|
} catch {
|
|
40092
40116
|
}
|
|
40093
40117
|
}
|
|
40094
40118
|
function clear() {
|
|
40095
40119
|
try {
|
|
40096
|
-
|
|
40120
|
+
fs79.rmSync(turnMarkerPath(), { force: true });
|
|
40097
40121
|
} catch {
|
|
40098
40122
|
}
|
|
40099
40123
|
}
|
|
@@ -40108,7 +40132,7 @@ async function withTurnMarker(fn) {
|
|
|
40108
40132
|
function isProcessMidTurn(pid, home) {
|
|
40109
40133
|
if (!pid) return false;
|
|
40110
40134
|
try {
|
|
40111
|
-
return
|
|
40135
|
+
return fs79.existsSync(turnMarkerPath(pid, home));
|
|
40112
40136
|
} catch {
|
|
40113
40137
|
return false;
|
|
40114
40138
|
}
|
|
@@ -40116,7 +40140,7 @@ function isProcessMidTurn(pid, home) {
|
|
|
40116
40140
|
|
|
40117
40141
|
// src/packs/gates.ts
|
|
40118
40142
|
var import_node_child_process28 = require("child_process");
|
|
40119
|
-
var
|
|
40143
|
+
var fs80 = __toESM(require("fs"));
|
|
40120
40144
|
var path90 = __toESM(require("path"));
|
|
40121
40145
|
var defaultCommandRunner = (file, args2, cwd, timeoutMs, env) => new Promise((resolve14) => {
|
|
40122
40146
|
(0, import_node_child_process28.execFile)(
|
|
@@ -40167,7 +40191,7 @@ async function changedFiles(run3, cwd, from, to) {
|
|
|
40167
40191
|
}
|
|
40168
40192
|
function readWorkspaceFile(cwd, relPath) {
|
|
40169
40193
|
try {
|
|
40170
|
-
return
|
|
40194
|
+
return fs80.readFileSync(path90.join(cwd, relPath), "utf8");
|
|
40171
40195
|
} catch {
|
|
40172
40196
|
return null;
|
|
40173
40197
|
}
|
|
@@ -40176,14 +40200,14 @@ var NO_TEST_PLACEHOLDER = 'echo "Error: no test specified"';
|
|
|
40176
40200
|
var CHECKS_TIMEOUT_MS = 5 * 6e4;
|
|
40177
40201
|
function detectChecksCommand(cwd) {
|
|
40178
40202
|
try {
|
|
40179
|
-
const cfg = JSON.parse(
|
|
40203
|
+
const cfg = JSON.parse(fs80.readFileSync(path90.join(cwd, ".codeam", "pack.json"), "utf8"));
|
|
40180
40204
|
if (typeof cfg.checksCommand === "string" && cfg.checksCommand.trim().length > 0) {
|
|
40181
40205
|
return cfg.checksCommand.trim();
|
|
40182
40206
|
}
|
|
40183
40207
|
} catch {
|
|
40184
40208
|
}
|
|
40185
40209
|
try {
|
|
40186
|
-
const pkg = JSON.parse(
|
|
40210
|
+
const pkg = JSON.parse(fs80.readFileSync(path90.join(cwd, "package.json"), "utf8"));
|
|
40187
40211
|
const test = pkg.scripts?.test;
|
|
40188
40212
|
if (typeof test === "string" && test.trim().length > 0 && !test.includes(NO_TEST_PLACEHOLDER)) {
|
|
40189
40213
|
return "npm test";
|
|
@@ -40201,7 +40225,7 @@ ${res.stderr}`.trim();
|
|
|
40201
40225
|
}
|
|
40202
40226
|
|
|
40203
40227
|
// src/packs/run-store.ts
|
|
40204
|
-
var
|
|
40228
|
+
var fs81 = __toESM(require("fs"));
|
|
40205
40229
|
var path91 = __toESM(require("path"));
|
|
40206
40230
|
var crypto5 = __toESM(require("crypto"));
|
|
40207
40231
|
function packsDir(cwd) {
|
|
@@ -40214,10 +40238,10 @@ function newRunId() {
|
|
|
40214
40238
|
return `pk_${Date.now().toString(36)}_${crypto5.randomBytes(4).toString("hex")}`;
|
|
40215
40239
|
}
|
|
40216
40240
|
function writeJsonAtomic(file, value) {
|
|
40217
|
-
|
|
40241
|
+
fs81.mkdirSync(path91.dirname(file), { recursive: true });
|
|
40218
40242
|
const tmp = `${file}.tmp`;
|
|
40219
|
-
|
|
40220
|
-
|
|
40243
|
+
fs81.writeFileSync(tmp, JSON.stringify(value, null, 2));
|
|
40244
|
+
fs81.renameSync(tmp, file);
|
|
40221
40245
|
}
|
|
40222
40246
|
function saveRun(cwd, state) {
|
|
40223
40247
|
writeJsonAtomic(path91.join(runDir(cwd, state.runId), "run.json"), state);
|
|
@@ -40229,11 +40253,11 @@ function saveStageHandoff(cwd, runId, stageIndex, role, handoff) {
|
|
|
40229
40253
|
function loadLatestRun(cwd) {
|
|
40230
40254
|
try {
|
|
40231
40255
|
const dir = packsDir(cwd);
|
|
40232
|
-
const entries2 =
|
|
40256
|
+
const entries2 = fs81.readdirSync(dir, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name).sort();
|
|
40233
40257
|
for (let i = entries2.length - 1; i >= 0; i--) {
|
|
40234
40258
|
const file = path91.join(dir, entries2[i], "run.json");
|
|
40235
40259
|
try {
|
|
40236
|
-
const parsed = JSON.parse(
|
|
40260
|
+
const parsed = JSON.parse(fs81.readFileSync(file, "utf8"));
|
|
40237
40261
|
if (parsed && typeof parsed.runId === "string") return parsed;
|
|
40238
40262
|
} catch {
|
|
40239
40263
|
}
|
|
@@ -40245,16 +40269,16 @@ function loadLatestRun(cwd) {
|
|
|
40245
40269
|
function ensureLedgerIgnored(cwd) {
|
|
40246
40270
|
try {
|
|
40247
40271
|
const gitDir = path91.join(cwd, ".git");
|
|
40248
|
-
if (!
|
|
40272
|
+
if (!fs81.existsSync(gitDir)) return;
|
|
40249
40273
|
const exclude = path91.join(gitDir, "info", "exclude");
|
|
40250
40274
|
let existing = "";
|
|
40251
40275
|
try {
|
|
40252
|
-
existing =
|
|
40276
|
+
existing = fs81.readFileSync(exclude, "utf8");
|
|
40253
40277
|
} catch {
|
|
40254
40278
|
}
|
|
40255
40279
|
if (existing.includes(".codeam/packs/")) return;
|
|
40256
|
-
|
|
40257
|
-
|
|
40280
|
+
fs81.mkdirSync(path91.dirname(exclude), { recursive: true });
|
|
40281
|
+
fs81.writeFileSync(exclude, `${existing.trimEnd()}
|
|
40258
40282
|
.codeam/packs/
|
|
40259
40283
|
`.trimStart());
|
|
40260
40284
|
} catch {
|
|
@@ -41235,7 +41259,7 @@ async function mcpRouter() {
|
|
|
41235
41259
|
}
|
|
41236
41260
|
|
|
41237
41261
|
// src/integrations/mcp-secrets.ts
|
|
41238
|
-
var
|
|
41262
|
+
var fs83 = __toESM(require("fs"));
|
|
41239
41263
|
var os59 = __toESM(require("os"));
|
|
41240
41264
|
var path93 = __toESM(require("path"));
|
|
41241
41265
|
var MCP_SECRETS_FILE_ENV = "CODEAM_MCP_SECRETS_FILE";
|
|
@@ -41248,7 +41272,7 @@ function mcpSecretsPath(scope, pid = process.pid) {
|
|
|
41248
41272
|
var registeredForCleanup = /* @__PURE__ */ new Set();
|
|
41249
41273
|
function readFileVars(file) {
|
|
41250
41274
|
try {
|
|
41251
|
-
const parsed = JSON.parse(
|
|
41275
|
+
const parsed = JSON.parse(fs83.readFileSync(file, "utf8"));
|
|
41252
41276
|
if (!parsed || typeof parsed !== "object") return {};
|
|
41253
41277
|
const out2 = {};
|
|
41254
41278
|
for (const [k2, v] of Object.entries(parsed)) {
|
|
@@ -41270,7 +41294,7 @@ function pidAlive2(pid) {
|
|
|
41270
41294
|
function pruneStale(dir) {
|
|
41271
41295
|
let names = [];
|
|
41272
41296
|
try {
|
|
41273
|
-
names =
|
|
41297
|
+
names = fs83.readdirSync(dir);
|
|
41274
41298
|
} catch {
|
|
41275
41299
|
return;
|
|
41276
41300
|
}
|
|
@@ -41280,7 +41304,7 @@ function pruneStale(dir) {
|
|
|
41280
41304
|
const pid = Number(m[1]);
|
|
41281
41305
|
if (pid === process.pid || pidAlive2(pid)) continue;
|
|
41282
41306
|
try {
|
|
41283
|
-
|
|
41307
|
+
fs83.unlinkSync(path93.join(dir, name));
|
|
41284
41308
|
} catch {
|
|
41285
41309
|
}
|
|
41286
41310
|
}
|
|
@@ -41288,17 +41312,17 @@ function pruneStale(dir) {
|
|
|
41288
41312
|
function writeMcpSecrets(vars, file) {
|
|
41289
41313
|
try {
|
|
41290
41314
|
const dir = path93.dirname(file);
|
|
41291
|
-
|
|
41315
|
+
fs83.mkdirSync(dir, { recursive: true, mode: 448 });
|
|
41292
41316
|
pruneStale(dir);
|
|
41293
41317
|
const tmp = `${file}.${process.pid}.tmp`;
|
|
41294
|
-
|
|
41295
|
-
|
|
41296
|
-
|
|
41318
|
+
fs83.writeFileSync(tmp, JSON.stringify(vars), { mode: 384 });
|
|
41319
|
+
fs83.renameSync(tmp, file);
|
|
41320
|
+
fs83.chmodSync(file, 384);
|
|
41297
41321
|
if (!registeredForCleanup.has(file)) {
|
|
41298
41322
|
registeredForCleanup.add(file);
|
|
41299
41323
|
process.once("exit", () => {
|
|
41300
41324
|
try {
|
|
41301
|
-
|
|
41325
|
+
fs83.unlinkSync(file);
|
|
41302
41326
|
} catch {
|
|
41303
41327
|
}
|
|
41304
41328
|
});
|
|
@@ -44432,7 +44456,7 @@ async function runAcpSession(opts) {
|
|
|
44432
44456
|
`switch-${opts.pluginId}`
|
|
44433
44457
|
);
|
|
44434
44458
|
try {
|
|
44435
|
-
|
|
44459
|
+
fs86.mkdirSync(claudeConfigDir2, { recursive: true, mode: 448 });
|
|
44436
44460
|
} catch {
|
|
44437
44461
|
}
|
|
44438
44462
|
const memoryFile = path96.join(claudeConfigDir2, "CLAUDE.md");
|
|
@@ -45666,7 +45690,7 @@ function pickPinnedSession(pinnedId, listSessions2) {
|
|
|
45666
45690
|
}
|
|
45667
45691
|
|
|
45668
45692
|
// src/agents/retired-proxy-cleanup.ts
|
|
45669
|
-
var
|
|
45693
|
+
var fs87 = __toESM(require("fs"));
|
|
45670
45694
|
var path97 = __toESM(require("path"));
|
|
45671
45695
|
var os62 = __toESM(require("os"));
|
|
45672
45696
|
var RETIRED_PROXY_RE = /^https?:\/\/(?:127\.0\.0\.1|localhost|\[::1\]):8787(?:[/?#]|$)/i;
|
|
@@ -45682,7 +45706,7 @@ function sanitizeRetiredProxyConfig(homeDir2 = os62.homedir()) {
|
|
|
45682
45706
|
const file = path97.join(homeDir2, ".claude", "settings.json");
|
|
45683
45707
|
let parsed;
|
|
45684
45708
|
try {
|
|
45685
|
-
parsed = JSON.parse(
|
|
45709
|
+
parsed = JSON.parse(fs87.readFileSync(file, "utf8"));
|
|
45686
45710
|
} catch {
|
|
45687
45711
|
return out2;
|
|
45688
45712
|
}
|
|
@@ -45724,9 +45748,9 @@ function sanitizeRetiredProxyConfig(homeDir2 = os62.homedir()) {
|
|
|
45724
45748
|
if (!out2.changed) return out2;
|
|
45725
45749
|
try {
|
|
45726
45750
|
const tmp = `${file}.codeam.tmp`;
|
|
45727
|
-
|
|
45751
|
+
fs87.writeFileSync(tmp, `${JSON.stringify(parsed, null, 2)}
|
|
45728
45752
|
`, { mode: 384 });
|
|
45729
|
-
|
|
45753
|
+
fs87.renameSync(tmp, file);
|
|
45730
45754
|
} catch {
|
|
45731
45755
|
out2.changed = false;
|
|
45732
45756
|
}
|
|
@@ -46258,7 +46282,7 @@ var AcpDriver = class {
|
|
|
46258
46282
|
};
|
|
46259
46283
|
|
|
46260
46284
|
// src/baton/transcript-mirror.ts
|
|
46261
|
-
var
|
|
46285
|
+
var fs88 = __toESM(require("fs"));
|
|
46262
46286
|
var TranscriptMirror = class {
|
|
46263
46287
|
constructor(deps) {
|
|
46264
46288
|
this.deps = deps;
|
|
@@ -46352,7 +46376,7 @@ var TranscriptMirror = class {
|
|
|
46352
46376
|
}
|
|
46353
46377
|
};
|
|
46354
46378
|
function defaultWatch(file, onChange) {
|
|
46355
|
-
const w3 =
|
|
46379
|
+
const w3 = fs88.watch(file, { persistent: false }, () => onChange());
|
|
46356
46380
|
return () => w3.close();
|
|
46357
46381
|
}
|
|
46358
46382
|
|
|
@@ -46698,7 +46722,7 @@ function keepDeviceAwake(deps = {}) {
|
|
|
46698
46722
|
}
|
|
46699
46723
|
|
|
46700
46724
|
// src/agents/claude/onboarding.ts
|
|
46701
|
-
var
|
|
46725
|
+
var fs89 = __toESM(require("fs"));
|
|
46702
46726
|
var os64 = __toESM(require("os"));
|
|
46703
46727
|
var path98 = __toESM(require("path"));
|
|
46704
46728
|
var ONBOARDING_VERSION_SENTINEL = "9999.0.0";
|
|
@@ -46707,7 +46731,7 @@ function ensureClaudeOnboarded(cwd) {
|
|
|
46707
46731
|
const file = path98.join(os64.homedir(), ".claude.json");
|
|
46708
46732
|
let config = {};
|
|
46709
46733
|
try {
|
|
46710
|
-
config = JSON.parse(
|
|
46734
|
+
config = JSON.parse(fs89.readFileSync(file, "utf8"));
|
|
46711
46735
|
} catch {
|
|
46712
46736
|
}
|
|
46713
46737
|
let changed = false;
|
|
@@ -46732,8 +46756,8 @@ function ensureClaudeOnboarded(cwd) {
|
|
|
46732
46756
|
}
|
|
46733
46757
|
}
|
|
46734
46758
|
if (!changed) return;
|
|
46735
|
-
|
|
46736
|
-
|
|
46759
|
+
fs89.mkdirSync(path98.dirname(file), { recursive: true });
|
|
46760
|
+
fs89.writeFileSync(file, JSON.stringify(config, null, 2));
|
|
46737
46761
|
log.info(
|
|
46738
46762
|
"claude",
|
|
46739
46763
|
`pre-completed Claude onboarding${cwd ? ` + trusted workspace ${cwd}` : ""}`
|
|
@@ -49489,7 +49513,7 @@ async function stopWorkspaceFromLocal(target) {
|
|
|
49489
49513
|
}
|
|
49490
49514
|
|
|
49491
49515
|
// src/commands/host/host-client.ts
|
|
49492
|
-
var
|
|
49516
|
+
var fs90 = __toESM(require("fs"));
|
|
49493
49517
|
var os65 = __toESM(require("os"));
|
|
49494
49518
|
var path103 = __toESM(require("path"));
|
|
49495
49519
|
var import_node_crypto16 = require("crypto");
|
|
@@ -49552,7 +49576,7 @@ function collectOsInfo() {
|
|
|
49552
49576
|
}
|
|
49553
49577
|
function loadHostIdentity() {
|
|
49554
49578
|
try {
|
|
49555
|
-
const raw =
|
|
49579
|
+
const raw = fs90.readFileSync(hostIdentityPath(), "utf8");
|
|
49556
49580
|
const parsed = JSON.parse(raw);
|
|
49557
49581
|
if (typeof parsed === "object" && parsed !== null && typeof parsed.hostId === "string" && typeof parsed.hostToken === "string" && typeof parsed.controlPluginId === "string") {
|
|
49558
49582
|
const p2 = parsed;
|
|
@@ -49580,8 +49604,8 @@ function ensureControlPollSecret(identity, save = saveHostIdentity) {
|
|
|
49580
49604
|
}
|
|
49581
49605
|
function saveHostIdentity(identity) {
|
|
49582
49606
|
const file = hostIdentityPath();
|
|
49583
|
-
|
|
49584
|
-
|
|
49607
|
+
fs90.mkdirSync(path103.dirname(file), { recursive: true, mode: 448 });
|
|
49608
|
+
fs90.writeFileSync(file, JSON.stringify(identity, null, 2), {
|
|
49585
49609
|
encoding: "utf8",
|
|
49586
49610
|
mode: 384
|
|
49587
49611
|
});
|
|
@@ -49626,7 +49650,7 @@ function isTerminalEnrollError(err) {
|
|
|
49626
49650
|
}
|
|
49627
49651
|
function deleteHostIdentity() {
|
|
49628
49652
|
try {
|
|
49629
|
-
|
|
49653
|
+
fs90.rmSync(hostIdentityPath(), { force: true });
|
|
49630
49654
|
} catch {
|
|
49631
49655
|
}
|
|
49632
49656
|
}
|
|
@@ -49844,7 +49868,7 @@ async function host(args2) {
|
|
|
49844
49868
|
// src/commands/host-agent.ts
|
|
49845
49869
|
var import_node_child_process36 = require("child_process");
|
|
49846
49870
|
var os71 = __toESM(require("os"));
|
|
49847
|
-
var
|
|
49871
|
+
var fs97 = __toESM(require("fs"));
|
|
49848
49872
|
var path110 = __toESM(require("path"));
|
|
49849
49873
|
|
|
49850
49874
|
// src/skills/persist-from-payload.ts
|
|
@@ -49854,7 +49878,7 @@ function persistOrClearSkillsFromPayload(skills) {
|
|
|
49854
49878
|
}
|
|
49855
49879
|
|
|
49856
49880
|
// src/commands/host/session-state.ts
|
|
49857
|
-
var
|
|
49881
|
+
var fs91 = __toESM(require("fs"));
|
|
49858
49882
|
var os66 = __toESM(require("os"));
|
|
49859
49883
|
var path104 = __toESM(require("path"));
|
|
49860
49884
|
function hostSessionStatePath(env = process.env) {
|
|
@@ -49871,7 +49895,7 @@ function fileSessionChildStore(file = hostSessionStatePath()) {
|
|
|
49871
49895
|
return {
|
|
49872
49896
|
load() {
|
|
49873
49897
|
try {
|
|
49874
|
-
const raw = JSON.parse(
|
|
49898
|
+
const raw = JSON.parse(fs91.readFileSync(file, "utf8"));
|
|
49875
49899
|
return Array.isArray(raw?.sessions) ? raw.sessions.filter(isRecord5) : null;
|
|
49876
49900
|
} catch {
|
|
49877
49901
|
return null;
|
|
@@ -49879,18 +49903,18 @@ function fileSessionChildStore(file = hostSessionStatePath()) {
|
|
|
49879
49903
|
},
|
|
49880
49904
|
save(list) {
|
|
49881
49905
|
try {
|
|
49882
|
-
|
|
49906
|
+
fs91.mkdirSync(path104.dirname(file), { recursive: true, mode: 448 });
|
|
49883
49907
|
const tmp = `${file}.${process.pid}.tmp`;
|
|
49884
|
-
|
|
49908
|
+
fs91.writeFileSync(tmp, JSON.stringify({ version: 1, sessions: list }, null, 2), {
|
|
49885
49909
|
mode: 384
|
|
49886
49910
|
});
|
|
49887
|
-
|
|
49911
|
+
fs91.renameSync(tmp, file);
|
|
49888
49912
|
} catch {
|
|
49889
49913
|
}
|
|
49890
49914
|
},
|
|
49891
49915
|
clear() {
|
|
49892
49916
|
try {
|
|
49893
|
-
|
|
49917
|
+
fs91.rmSync(file, { force: true });
|
|
49894
49918
|
} catch {
|
|
49895
49919
|
}
|
|
49896
49920
|
}
|
|
@@ -49928,7 +49952,7 @@ function pickSavedSessionForWorkspace(sessions3, cwd, deployId) {
|
|
|
49928
49952
|
|
|
49929
49953
|
// src/commands/host/git-tooling.ts
|
|
49930
49954
|
var import_node_child_process31 = require("child_process");
|
|
49931
|
-
var
|
|
49955
|
+
var fs92 = __toESM(require("fs"));
|
|
49932
49956
|
var os67 = __toESM(require("os"));
|
|
49933
49957
|
var path105 = __toESM(require("path"));
|
|
49934
49958
|
function codeamBinDir() {
|
|
@@ -49964,7 +49988,7 @@ async function download(url2, dest) {
|
|
|
49964
49988
|
const res = await fetch(url2, { headers: { "User-Agent": "codeam-cli" } });
|
|
49965
49989
|
if (!res.ok || !res.body) return false;
|
|
49966
49990
|
const buf = Buffer.from(await res.arrayBuffer());
|
|
49967
|
-
|
|
49991
|
+
fs92.writeFileSync(dest, buf);
|
|
49968
49992
|
return true;
|
|
49969
49993
|
} catch {
|
|
49970
49994
|
return false;
|
|
@@ -49987,7 +50011,7 @@ async function ensureGhCli(runner, token, deps = {}) {
|
|
|
49987
50011
|
const version3 = await resolveVersionFn(token);
|
|
49988
50012
|
const asset = `gh_${version3}_${osToken}_${arch2}`;
|
|
49989
50013
|
const url2 = `https://github.com/cli/cli/releases/download/v${version3}/${asset}.${ext}`;
|
|
49990
|
-
const tmpRoot =
|
|
50014
|
+
const tmpRoot = fs92.mkdtempSync(path105.join(os67.tmpdir(), "codeam-gh-"));
|
|
49991
50015
|
const archive = path105.join(tmpRoot, `${asset}.${ext}`);
|
|
49992
50016
|
if (!await downloadFn(url2, archive)) {
|
|
49993
50017
|
log.warn("host-agent", "gh download failed \u2014 skipping (git pull/push still work via the credential helper)");
|
|
@@ -49999,15 +50023,15 @@ async function ensureGhCli(runner, token, deps = {}) {
|
|
|
49999
50023
|
return null;
|
|
50000
50024
|
}
|
|
50001
50025
|
const extractedBin = path105.join(tmpRoot, asset, "bin", binaryName);
|
|
50002
|
-
if (!
|
|
50026
|
+
if (!fs92.existsSync(extractedBin)) {
|
|
50003
50027
|
log.warn("host-agent", "gh binary not found in the extracted archive \u2014 skipping");
|
|
50004
50028
|
return null;
|
|
50005
50029
|
}
|
|
50006
50030
|
const binDir = codeamBinDir();
|
|
50007
|
-
|
|
50031
|
+
fs92.mkdirSync(binDir, { recursive: true });
|
|
50008
50032
|
const target = path105.join(binDir, binaryName);
|
|
50009
|
-
|
|
50010
|
-
|
|
50033
|
+
fs92.copyFileSync(extractedBin, target);
|
|
50034
|
+
fs92.chmodSync(target, 493);
|
|
50011
50035
|
log.info("host-agent", `gh installed to ${target} (v${version3})`);
|
|
50012
50036
|
return target;
|
|
50013
50037
|
} catch (e) {
|
|
@@ -50054,9 +50078,9 @@ function writeGhHostsToken(token) {
|
|
|
50054
50078
|
try {
|
|
50055
50079
|
const dir = ghConfigDir();
|
|
50056
50080
|
const file = path105.join(dir, "hosts.yml");
|
|
50057
|
-
if (
|
|
50058
|
-
|
|
50059
|
-
|
|
50081
|
+
if (fs92.existsSync(file)) return false;
|
|
50082
|
+
fs92.mkdirSync(dir, { recursive: true, mode: 448 });
|
|
50083
|
+
fs92.writeFileSync(
|
|
50060
50084
|
file,
|
|
50061
50085
|
`github.com:
|
|
50062
50086
|
oauth_token: ${token}
|
|
@@ -50099,7 +50123,7 @@ async function ensureGlabCli(runner, deps = {}) {
|
|
|
50099
50123
|
const version3 = await resolveLatestGlabVersion();
|
|
50100
50124
|
const asset = `glab_${version3}_${osToken}_${arch2}`;
|
|
50101
50125
|
const url2 = `https://gitlab.com/gitlab-org/cli/-/releases/v${version3}/downloads/${asset}.${ext}`;
|
|
50102
|
-
const tmpRoot =
|
|
50126
|
+
const tmpRoot = fs92.mkdtempSync(path105.join(os67.tmpdir(), "codeam-glab-"));
|
|
50103
50127
|
const archive = path105.join(tmpRoot, `${asset}.${ext}`);
|
|
50104
50128
|
if (!await downloadFn(url2, archive)) {
|
|
50105
50129
|
log.warn("host-agent", "glab download failed \u2014 skipping (git push/pull still work)");
|
|
@@ -50115,16 +50139,16 @@ async function ensureGlabCli(runner, deps = {}) {
|
|
|
50115
50139
|
path105.join(tmpRoot, asset, "bin", binaryName),
|
|
50116
50140
|
path105.join(tmpRoot, binaryName)
|
|
50117
50141
|
];
|
|
50118
|
-
const extractedBin = candidates.find((c2) =>
|
|
50142
|
+
const extractedBin = candidates.find((c2) => fs92.existsSync(c2));
|
|
50119
50143
|
if (!extractedBin) {
|
|
50120
50144
|
log.warn("host-agent", "glab binary not found in the extracted archive \u2014 skipping");
|
|
50121
50145
|
return null;
|
|
50122
50146
|
}
|
|
50123
50147
|
const binDir = codeamBinDir();
|
|
50124
|
-
|
|
50148
|
+
fs92.mkdirSync(binDir, { recursive: true });
|
|
50125
50149
|
const target = path105.join(binDir, binaryName);
|
|
50126
|
-
|
|
50127
|
-
|
|
50150
|
+
fs92.copyFileSync(extractedBin, target);
|
|
50151
|
+
fs92.chmodSync(target, 493);
|
|
50128
50152
|
log.info("host-agent", `glab installed to ${target} (v${version3})`);
|
|
50129
50153
|
return target;
|
|
50130
50154
|
} catch (e) {
|
|
@@ -50203,12 +50227,12 @@ var defaultGitToolingRunner = {
|
|
|
50203
50227
|
};
|
|
50204
50228
|
|
|
50205
50229
|
// src/lib/cli-versions.ts
|
|
50206
|
-
var
|
|
50230
|
+
var fs94 = __toESM(require("fs"));
|
|
50207
50231
|
var os69 = __toESM(require("os"));
|
|
50208
50232
|
var path107 = __toESM(require("path"));
|
|
50209
50233
|
|
|
50210
50234
|
// src/lib/updateNotifier.ts
|
|
50211
|
-
var
|
|
50235
|
+
var fs93 = __toESM(require("fs"));
|
|
50212
50236
|
var os68 = __toESM(require("os"));
|
|
50213
50237
|
var path106 = __toESM(require("path"));
|
|
50214
50238
|
var https8 = __toESM(require("https"));
|
|
@@ -50224,7 +50248,7 @@ function cachePath() {
|
|
|
50224
50248
|
}
|
|
50225
50249
|
function readCache() {
|
|
50226
50250
|
try {
|
|
50227
|
-
const raw =
|
|
50251
|
+
const raw = fs93.readFileSync(cachePath(), "utf8");
|
|
50228
50252
|
const parsed = JSON.parse(raw);
|
|
50229
50253
|
if (typeof parsed.fetchedAt !== "number" || typeof parsed.latest !== "string") return null;
|
|
50230
50254
|
return parsed;
|
|
@@ -50235,10 +50259,10 @@ function readCache() {
|
|
|
50235
50259
|
function writeCache(cache) {
|
|
50236
50260
|
try {
|
|
50237
50261
|
const file = cachePath();
|
|
50238
|
-
|
|
50262
|
+
fs93.mkdirSync(path106.dirname(file), { recursive: true });
|
|
50239
50263
|
const tmp = `${file}.${process.pid}.tmp`;
|
|
50240
|
-
|
|
50241
|
-
|
|
50264
|
+
fs93.writeFileSync(tmp, JSON.stringify(cache));
|
|
50265
|
+
fs93.renameSync(tmp, file);
|
|
50242
50266
|
} catch {
|
|
50243
50267
|
}
|
|
50244
50268
|
}
|
|
@@ -50313,7 +50337,7 @@ function isLinkedInstall() {
|
|
|
50313
50337
|
}).trim();
|
|
50314
50338
|
if (!root) return false;
|
|
50315
50339
|
const pkgPath = path106.join(root, PKG_NAME);
|
|
50316
|
-
return
|
|
50340
|
+
return fs93.lstatSync(pkgPath).isSymbolicLink();
|
|
50317
50341
|
} catch {
|
|
50318
50342
|
return false;
|
|
50319
50343
|
}
|
|
@@ -50349,7 +50373,7 @@ function maybeAutoUpdate(currentVersion, latest) {
|
|
|
50349
50373
|
return;
|
|
50350
50374
|
}
|
|
50351
50375
|
try {
|
|
50352
|
-
|
|
50376
|
+
fs93.unlinkSync(cachePath());
|
|
50353
50377
|
} catch {
|
|
50354
50378
|
}
|
|
50355
50379
|
process.stderr.write(` ${import_picocolors12.default.green("\u2713")} Updated. Resuming session...
|
|
@@ -50365,7 +50389,7 @@ async function autoUpgradeBeforeCriticalCommand() {
|
|
|
50365
50389
|
if (process.env.NODE_ENV === "test") return;
|
|
50366
50390
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
50367
50391
|
if (process.env.CI) return;
|
|
50368
|
-
const current2 = true ? "2.76.
|
|
50392
|
+
const current2 = true ? "2.76.14" : null;
|
|
50369
50393
|
if (!current2) return;
|
|
50370
50394
|
const cache = readCache();
|
|
50371
50395
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -50382,7 +50406,7 @@ function checkForUpdates() {
|
|
|
50382
50406
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
50383
50407
|
if (process.env.CI) return;
|
|
50384
50408
|
if (!process.stdout.isTTY) return;
|
|
50385
|
-
const current2 = true ? "2.76.
|
|
50409
|
+
const current2 = true ? "2.76.14" : null;
|
|
50386
50410
|
if (!current2) return;
|
|
50387
50411
|
const cache = readCache();
|
|
50388
50412
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -50416,7 +50440,7 @@ function isRecord6(v) {
|
|
|
50416
50440
|
function readPkg2(versionDir) {
|
|
50417
50441
|
try {
|
|
50418
50442
|
const raw = JSON.parse(
|
|
50419
|
-
|
|
50443
|
+
fs94.readFileSync(path107.join(packageDirOf(versionDir), "package.json"), "utf8")
|
|
50420
50444
|
);
|
|
50421
50445
|
return isRecord6(raw) ? raw : null;
|
|
50422
50446
|
} catch {
|
|
@@ -50430,14 +50454,14 @@ function entryOf(versionDir) {
|
|
|
50430
50454
|
const named = isRecord6(bin) ? bin.codeam : void 0;
|
|
50431
50455
|
const rel = typeof bin === "string" ? bin : typeof named === "string" ? named : "dist/index.js";
|
|
50432
50456
|
const entry = path107.join(packageDirOf(versionDir), rel);
|
|
50433
|
-
return
|
|
50457
|
+
return fs94.existsSync(entry) ? entry : null;
|
|
50434
50458
|
}
|
|
50435
50459
|
function launcherOf(versionDir) {
|
|
50436
50460
|
const entry = entryOf(versionDir);
|
|
50437
50461
|
if (!entry) return null;
|
|
50438
50462
|
const bin = path107.join(versionDir, "node_modules", ".bin", "codeam");
|
|
50439
50463
|
try {
|
|
50440
|
-
return
|
|
50464
|
+
return fs94.realpathSync(bin) === fs94.realpathSync(entry) ? bin : entry;
|
|
50441
50465
|
} catch {
|
|
50442
50466
|
return entry;
|
|
50443
50467
|
}
|
|
@@ -50450,7 +50474,7 @@ var BAD_MARKER_TTL_MS = 24 * 60 * 6e4;
|
|
|
50450
50474
|
var PRE_READY_WINDOW_MS = 60 * 6e4;
|
|
50451
50475
|
function isBad(versionDir, now = Date.now()) {
|
|
50452
50476
|
try {
|
|
50453
|
-
return now -
|
|
50477
|
+
return now - fs94.statSync(path107.join(versionDir, ".bad")).mtimeMs < BAD_MARKER_TTL_MS;
|
|
50454
50478
|
} catch {
|
|
50455
50479
|
return false;
|
|
50456
50480
|
}
|
|
@@ -50459,7 +50483,7 @@ function recordPreReadyFailure(versionDir, now = Date.now()) {
|
|
|
50459
50483
|
const file = path107.join(versionDir, ".prefail");
|
|
50460
50484
|
let count = 0;
|
|
50461
50485
|
try {
|
|
50462
|
-
const [n, at3] =
|
|
50486
|
+
const [n, at3] = fs94.readFileSync(file, "utf8").trim().split(" ").map(Number);
|
|
50463
50487
|
if (Number.isFinite(n) && Number.isFinite(at3) && now - at3 < PRE_READY_WINDOW_MS) {
|
|
50464
50488
|
count = n;
|
|
50465
50489
|
}
|
|
@@ -50467,35 +50491,35 @@ function recordPreReadyFailure(versionDir, now = Date.now()) {
|
|
|
50467
50491
|
}
|
|
50468
50492
|
count += 1;
|
|
50469
50493
|
try {
|
|
50470
|
-
|
|
50494
|
+
fs94.writeFileSync(file, `${count} ${now}`);
|
|
50471
50495
|
} catch {
|
|
50472
50496
|
}
|
|
50473
50497
|
return count;
|
|
50474
50498
|
}
|
|
50475
50499
|
function clearPreReadyFailures(versionDir) {
|
|
50476
|
-
|
|
50500
|
+
fs94.rmSync(path107.join(versionDir, ".prefail"), { force: true });
|
|
50477
50501
|
}
|
|
50478
50502
|
function markBad(versionDir, reason) {
|
|
50479
50503
|
try {
|
|
50480
|
-
|
|
50504
|
+
fs94.writeFileSync(path107.join(versionDir, ".bad"), `${(/* @__PURE__ */ new Date()).toISOString()} ${reason}
|
|
50481
50505
|
`);
|
|
50482
50506
|
} catch {
|
|
50483
50507
|
}
|
|
50484
50508
|
}
|
|
50485
50509
|
function pointerTarget(root, name) {
|
|
50486
50510
|
try {
|
|
50487
|
-
return
|
|
50511
|
+
return fs94.realpathSync(path107.join(root, name));
|
|
50488
50512
|
} catch {
|
|
50489
50513
|
return null;
|
|
50490
50514
|
}
|
|
50491
50515
|
}
|
|
50492
50516
|
function atomicPoint(root, name, targetDir) {
|
|
50493
50517
|
const tmp = path107.join(root, `.${name}.tmp-${process.pid}-${Date.now()}`);
|
|
50494
|
-
|
|
50518
|
+
fs94.symlinkSync(path107.relative(root, targetDir), tmp, "dir");
|
|
50495
50519
|
try {
|
|
50496
|
-
|
|
50520
|
+
fs94.renameSync(tmp, path107.join(root, name));
|
|
50497
50521
|
} catch (err) {
|
|
50498
|
-
|
|
50522
|
+
fs94.rmSync(tmp, { force: true });
|
|
50499
50523
|
throw err;
|
|
50500
50524
|
}
|
|
50501
50525
|
}
|
|
@@ -50529,8 +50553,8 @@ function versionDirContaining(root, file) {
|
|
|
50529
50553
|
let real;
|
|
50530
50554
|
let realRoot;
|
|
50531
50555
|
try {
|
|
50532
|
-
real =
|
|
50533
|
-
realRoot =
|
|
50556
|
+
real = fs94.realpathSync(file);
|
|
50557
|
+
realRoot = fs94.realpathSync(root);
|
|
50534
50558
|
} catch {
|
|
50535
50559
|
return null;
|
|
50536
50560
|
}
|
|
@@ -50550,7 +50574,7 @@ function pidAlive3(pid) {
|
|
|
50550
50574
|
function livePids(versionDir) {
|
|
50551
50575
|
let names;
|
|
50552
50576
|
try {
|
|
50553
|
-
names =
|
|
50577
|
+
names = fs94.readdirSync(path107.join(versionDir, ".pids"));
|
|
50554
50578
|
} catch {
|
|
50555
50579
|
return [];
|
|
50556
50580
|
}
|
|
@@ -50561,9 +50585,9 @@ function registerRunningVersion(root = cliVersionsRoot(), entry = process.argv[1
|
|
|
50561
50585
|
if (!dir) return;
|
|
50562
50586
|
const file = path107.join(dir, ".pids", String(process.pid));
|
|
50563
50587
|
try {
|
|
50564
|
-
|
|
50565
|
-
|
|
50566
|
-
process.once("exit", () =>
|
|
50588
|
+
fs94.mkdirSync(path107.dirname(file), { recursive: true });
|
|
50589
|
+
fs94.writeFileSync(file, "");
|
|
50590
|
+
process.once("exit", () => fs94.rmSync(file, { force: true }));
|
|
50567
50591
|
} catch {
|
|
50568
50592
|
}
|
|
50569
50593
|
}
|
|
@@ -50571,7 +50595,7 @@ function gcVersions(root) {
|
|
|
50571
50595
|
const removed = [];
|
|
50572
50596
|
let names;
|
|
50573
50597
|
try {
|
|
50574
|
-
names =
|
|
50598
|
+
names = fs94.readdirSync(root).filter((n) => SEMVER_DIR.test(n));
|
|
50575
50599
|
} catch {
|
|
50576
50600
|
return removed;
|
|
50577
50601
|
}
|
|
@@ -50585,7 +50609,7 @@ function gcVersions(root) {
|
|
|
50585
50609
|
const dir = path107.join(root, name);
|
|
50586
50610
|
if (keep.has(name) || livePids(dir).length > 0) continue;
|
|
50587
50611
|
try {
|
|
50588
|
-
|
|
50612
|
+
fs94.rmSync(dir, { recursive: true, force: true });
|
|
50589
50613
|
removed.push(name);
|
|
50590
50614
|
} catch {
|
|
50591
50615
|
}
|
|
@@ -50596,22 +50620,22 @@ function acquireInstallLock(root) {
|
|
|
50596
50620
|
const lock = path107.join(root, ".install.lock");
|
|
50597
50621
|
for (let attempt = 0; attempt < 2; attempt++) {
|
|
50598
50622
|
try {
|
|
50599
|
-
const fd =
|
|
50600
|
-
|
|
50601
|
-
|
|
50602
|
-
return () =>
|
|
50623
|
+
const fd = fs94.openSync(lock, "wx");
|
|
50624
|
+
fs94.writeSync(fd, String(process.pid));
|
|
50625
|
+
fs94.closeSync(fd);
|
|
50626
|
+
return () => fs94.rmSync(lock, { force: true });
|
|
50603
50627
|
} catch (err) {
|
|
50604
50628
|
if (err.code !== "EEXIST") return null;
|
|
50605
50629
|
let stale = false;
|
|
50606
50630
|
try {
|
|
50607
|
-
const owner = Number(
|
|
50608
|
-
const age = Date.now() -
|
|
50631
|
+
const owner = Number(fs94.readFileSync(lock, "utf8"));
|
|
50632
|
+
const age = Date.now() - fs94.statSync(lock).mtimeMs;
|
|
50609
50633
|
stale = !Number.isInteger(owner) || !pidAlive3(owner) || age > LOCK_STALE_MS;
|
|
50610
50634
|
} catch {
|
|
50611
50635
|
stale = true;
|
|
50612
50636
|
}
|
|
50613
50637
|
if (!stale) return null;
|
|
50614
|
-
|
|
50638
|
+
fs94.rmSync(lock, { force: true });
|
|
50615
50639
|
}
|
|
50616
50640
|
}
|
|
50617
50641
|
return null;
|
|
@@ -50619,7 +50643,7 @@ function acquireInstallLock(root) {
|
|
|
50619
50643
|
|
|
50620
50644
|
// src/commands/host/host-launch.ts
|
|
50621
50645
|
var import_node_child_process34 = require("child_process");
|
|
50622
|
-
var
|
|
50646
|
+
var fs96 = __toESM(require("fs"));
|
|
50623
50647
|
var os70 = __toESM(require("os"));
|
|
50624
50648
|
var path109 = __toESM(require("path"));
|
|
50625
50649
|
|
|
@@ -50643,7 +50667,7 @@ var EXIT_CODE_NAMES = {
|
|
|
50643
50667
|
|
|
50644
50668
|
// src/commands/host/self-update.ts
|
|
50645
50669
|
var import_node_child_process33 = require("child_process");
|
|
50646
|
-
var
|
|
50670
|
+
var fs95 = __toESM(require("fs"));
|
|
50647
50671
|
var path108 = __toESM(require("path"));
|
|
50648
50672
|
var SELF_UPDATE_PKG = "codeam-cli";
|
|
50649
50673
|
var SELF_UPDATE_INTERVAL_MS = 60 * 60 * 1e3;
|
|
@@ -50653,7 +50677,7 @@ var SELF_UPDATE_VIEW_TIMEOUT_MS = 3e4;
|
|
|
50653
50677
|
var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
|
|
50654
50678
|
var SELF_UPDATE_LS_TIMEOUT_MS = 15e3;
|
|
50655
50679
|
function currentCliVersion() {
|
|
50656
|
-
return true ? "2.76.
|
|
50680
|
+
return true ? "2.76.14" : null;
|
|
50657
50681
|
}
|
|
50658
50682
|
async function installedVersion(deps) {
|
|
50659
50683
|
const ls = await deps.run(
|
|
@@ -50747,7 +50771,7 @@ async function installVersioned(deps, root, latest, running2) {
|
|
|
50747
50771
|
const node = deps.nodePath ?? process.execPath;
|
|
50748
50772
|
const target = path108.join(root, latest);
|
|
50749
50773
|
try {
|
|
50750
|
-
|
|
50774
|
+
fs95.mkdirSync(root, { recursive: true });
|
|
50751
50775
|
} catch {
|
|
50752
50776
|
return { status: "skipped" };
|
|
50753
50777
|
}
|
|
@@ -50767,7 +50791,7 @@ async function installVersioned(deps, root, latest, running2) {
|
|
|
50767
50791
|
if (runningDir && path108.resolve(runningDir) === path108.resolve(target)) {
|
|
50768
50792
|
return { status: "skipped" };
|
|
50769
50793
|
}
|
|
50770
|
-
|
|
50794
|
+
fs95.rmSync(target, { recursive: true, force: true });
|
|
50771
50795
|
const install = await deps.run(
|
|
50772
50796
|
"npm",
|
|
50773
50797
|
[
|
|
@@ -50782,7 +50806,7 @@ async function installVersioned(deps, root, latest, running2) {
|
|
|
50782
50806
|
SELF_UPDATE_INSTALL_TIMEOUT_MS
|
|
50783
50807
|
);
|
|
50784
50808
|
if (install.code !== 0) {
|
|
50785
|
-
|
|
50809
|
+
fs95.rmSync(target, { recursive: true, force: true });
|
|
50786
50810
|
log.warn(
|
|
50787
50811
|
"host-agent",
|
|
50788
50812
|
`self-update: versioned install exited ${String(install.code)} \u2014 staying on ${running2}: ` + install.stderr.slice(-300)
|
|
@@ -50793,7 +50817,7 @@ async function installVersioned(deps, root, latest, running2) {
|
|
|
50793
50817
|
const entry = entryOf(target);
|
|
50794
50818
|
const check = entry ? await deps.run(node, [entry, "--version"], VERIFY_TIMEOUT_MS) : { code: null, stdout: "", stderr: "no entry point" };
|
|
50795
50819
|
if (check.code !== 0 || !check.stdout.includes(latest)) {
|
|
50796
|
-
|
|
50820
|
+
fs95.rmSync(target, { recursive: true, force: true });
|
|
50797
50821
|
log.warn(
|
|
50798
50822
|
"host-agent",
|
|
50799
50823
|
`self-update: ${latest} failed verification (exit ${String(check.code)}: ${(check.stdout + check.stderr).trim().slice(-200)}) \u2014 staying on ${running2}`
|
|
@@ -50809,7 +50833,7 @@ async function installVersioned(deps, root, latest, running2) {
|
|
|
50809
50833
|
return { status: "updated", version: latest };
|
|
50810
50834
|
} catch (err) {
|
|
50811
50835
|
const cur = pointerTarget(root, "current");
|
|
50812
|
-
if (!cur || path108.basename(cur) !== latest)
|
|
50836
|
+
if (!cur || path108.basename(cur) !== latest) fs95.rmSync(target, { recursive: true, force: true });
|
|
50813
50837
|
log.warn(
|
|
50814
50838
|
"host-agent",
|
|
50815
50839
|
`self-update: versioned install failed: ${err instanceof Error ? err.message : String(err)}`
|
|
@@ -50848,7 +50872,7 @@ function signalHostReady(send = process.send?.bind(process)) {
|
|
|
50848
50872
|
}
|
|
50849
50873
|
function defaultDeps() {
|
|
50850
50874
|
return {
|
|
50851
|
-
ownVersion: true ? "2.76.
|
|
50875
|
+
ownVersion: true ? "2.76.14" : null,
|
|
50852
50876
|
root: cliVersionsRoot(),
|
|
50853
50877
|
args: process.argv.slice(3),
|
|
50854
50878
|
execPath: process.execPath,
|
|
@@ -50945,7 +50969,7 @@ function needsSelfRelaunch(env = process.env, pid = process.pid, ctx = {}) {
|
|
|
50945
50969
|
}
|
|
50946
50970
|
function readPid1Cmdline() {
|
|
50947
50971
|
try {
|
|
50948
|
-
return
|
|
50972
|
+
return fs96.readFileSync("/proc/1/cmdline", "utf8").split("\0").filter(Boolean);
|
|
50949
50973
|
} catch {
|
|
50950
50974
|
return [];
|
|
50951
50975
|
}
|
|
@@ -50984,7 +51008,7 @@ function defaultRestartForUpdate(version3, supervised, io = {}) {
|
|
|
50984
51008
|
}
|
|
50985
51009
|
exit(0);
|
|
50986
51010
|
}
|
|
50987
|
-
function isContainerEnvironment(existsSyncFn =
|
|
51011
|
+
function isContainerEnvironment(existsSyncFn = fs96.existsSync, readFileSyncFn = (p2) => fs96.readFileSync(p2, "utf8")) {
|
|
50988
51012
|
try {
|
|
50989
51013
|
if (existsSyncFn("/.dockerenv")) return true;
|
|
50990
51014
|
} catch {
|
|
@@ -51001,11 +51025,11 @@ function hostAgentPidFile(home = os70.homedir()) {
|
|
|
51001
51025
|
}
|
|
51002
51026
|
function writeHostAgentPidFile(file = hostAgentPidFile(), pid = process.pid) {
|
|
51003
51027
|
try {
|
|
51004
|
-
|
|
51005
|
-
|
|
51028
|
+
fs96.mkdirSync(path109.dirname(file), { recursive: true });
|
|
51029
|
+
fs96.writeFileSync(file, String(pid));
|
|
51006
51030
|
process.once("exit", () => {
|
|
51007
51031
|
try {
|
|
51008
|
-
if (
|
|
51032
|
+
if (fs96.readFileSync(file, "utf8").trim() === String(pid)) fs96.rmSync(file, { force: true });
|
|
51009
51033
|
} catch {
|
|
51010
51034
|
}
|
|
51011
51035
|
});
|
|
@@ -51765,7 +51789,7 @@ var HostAgentSupervisor = class {
|
|
|
51765
51789
|
const raw = cmd.payload?.path;
|
|
51766
51790
|
const target = typeof raw === "string" && raw.trim() ? path110.resolve(raw.trim()) : os71.homedir();
|
|
51767
51791
|
try {
|
|
51768
|
-
const dirents = await
|
|
51792
|
+
const dirents = await fs97.promises.readdir(target, { withFileTypes: true });
|
|
51769
51793
|
const entries2 = dirents.filter((d3) => !d3.name.startsWith(".")).map((d3) => ({ name: d3.name, isDir: d3.isDirectory() })).sort(
|
|
51770
51794
|
(a, b) => a.isDir === b.isDir ? a.name.localeCompare(b.name) : a.isDir ? -1 : 1
|
|
51771
51795
|
);
|
|
@@ -52247,7 +52271,7 @@ var HostAgentSupervisor = class {
|
|
|
52247
52271
|
payload.deployId
|
|
52248
52272
|
);
|
|
52249
52273
|
try {
|
|
52250
|
-
|
|
52274
|
+
fs97.mkdirSync(houseConfigDir, { recursive: true, mode: 448 });
|
|
52251
52275
|
} catch {
|
|
52252
52276
|
}
|
|
52253
52277
|
childEnv.CLAUDE_CONFIG_DIR = houseConfigDir;
|
|
@@ -52318,7 +52342,7 @@ var HostAgentSupervisor = class {
|
|
|
52318
52342
|
try {
|
|
52319
52343
|
const cfgDir = childEnv.CLAUDE_CONFIG_DIR || path110.join(os71.homedir(), ".claude");
|
|
52320
52344
|
const projectDir = path110.join(cfgDir, "projects", encodeCwd(cwd));
|
|
52321
|
-
const hasPriorConversation =
|
|
52345
|
+
const hasPriorConversation = fs97.existsSync(projectDir) && fs97.readdirSync(projectDir).some((f) => f.endsWith(".jsonl"));
|
|
52322
52346
|
if (hasPriorConversation) {
|
|
52323
52347
|
childEnv.CODEAM_RESUME_LATEST = "1";
|
|
52324
52348
|
log.info(
|
|
@@ -52472,7 +52496,7 @@ var HostAgentSupervisor = class {
|
|
|
52472
52496
|
fallbackResumeTarget() {
|
|
52473
52497
|
const session = getActiveSession();
|
|
52474
52498
|
if (!session || !session.pluginId || !session.pollSecret || !session.agent) return null;
|
|
52475
|
-
const cwd = session.cwd &&
|
|
52499
|
+
const cwd = session.cwd && fs97.existsSync(session.cwd) ? session.cwd : process.cwd();
|
|
52476
52500
|
if (isFilesystemRoot(cwd)) {
|
|
52477
52501
|
log.warn(
|
|
52478
52502
|
"host-agent",
|
|
@@ -52512,7 +52536,7 @@ var HostAgentSupervisor = class {
|
|
|
52512
52536
|
log.warn("host-agent", `self_hosted_resume ${sessionId.slice(0, 8)}: no saved pairing on this box`);
|
|
52513
52537
|
return;
|
|
52514
52538
|
}
|
|
52515
|
-
if (!session.cwd || !
|
|
52539
|
+
if (!session.cwd || !fs97.existsSync(session.cwd)) {
|
|
52516
52540
|
log.warn("host-agent", `self_hosted_resume ${sessionId.slice(0, 8)}: workspace is gone`);
|
|
52517
52541
|
return;
|
|
52518
52542
|
}
|
|
@@ -52554,7 +52578,7 @@ var HostAgentSupervisor = class {
|
|
|
52554
52578
|
const persisted = new Map((this.sessionStore.load() ?? []).map((r) => [r.deployId, r.agent]));
|
|
52555
52579
|
for (const c2 of this.children.values()) persisted.set(c2.deployId, c2.agent);
|
|
52556
52580
|
return this.listSavedSessions().map((s) => ({ s, deployId: deployIdFromWorkspace(s.cwd) })).filter(
|
|
52557
|
-
(x) => x.deployId !== null && !!x.s.cwd &&
|
|
52581
|
+
(x) => x.deployId !== null && !!x.s.cwd && fs97.existsSync(x.s.cwd)
|
|
52558
52582
|
).map(({ s, deployId }) => {
|
|
52559
52583
|
const agent = persisted.get(deployId);
|
|
52560
52584
|
return { deployId, sessionId: s.id, ...agent ? { agent } : {} };
|
|
@@ -52606,7 +52630,7 @@ var HostAgentSupervisor = class {
|
|
|
52606
52630
|
if (this.children.has(deployId)) return;
|
|
52607
52631
|
const st3 = this.resumeStateFor(target);
|
|
52608
52632
|
try {
|
|
52609
|
-
const cwd =
|
|
52633
|
+
const cwd = fs97.existsSync(target.cwd) ? target.cwd : process.cwd();
|
|
52610
52634
|
const proc = this.resumeSpawner(
|
|
52611
52635
|
{ ...readHouseProxyChildEnv(deployId), CODEAM_RESUME_SESSION_ID: session.id },
|
|
52612
52636
|
cwd
|
|
@@ -52830,7 +52854,7 @@ var HostAgentSupervisor = class {
|
|
|
52830
52854
|
];
|
|
52831
52855
|
for (const dir of dirs) {
|
|
52832
52856
|
try {
|
|
52833
|
-
|
|
52857
|
+
fs97.rmSync(dir, { recursive: true, force: true });
|
|
52834
52858
|
} catch (err) {
|
|
52835
52859
|
log.warn(
|
|
52836
52860
|
"host-agent",
|
|
@@ -52997,7 +53021,7 @@ async function invite() {
|
|
|
52997
53021
|
var import_node_dns = require("dns");
|
|
52998
53022
|
var import_node_util11 = require("util");
|
|
52999
53023
|
var import_node_crypto17 = require("crypto");
|
|
53000
|
-
var
|
|
53024
|
+
var fs98 = __toESM(require("fs"));
|
|
53001
53025
|
var path111 = __toESM(require("path"));
|
|
53002
53026
|
var import_picocolors14 = __toESM(require("picocolors"));
|
|
53003
53027
|
var dnsResolveP = (0, import_node_util11.promisify)(import_node_dns.resolve);
|
|
@@ -53056,11 +53080,11 @@ async function checkHealth(apiBase2) {
|
|
|
53056
53080
|
function checkConfigDir() {
|
|
53057
53081
|
const dir = path111.join(require("os").homedir(), ".codeam");
|
|
53058
53082
|
try {
|
|
53059
|
-
|
|
53083
|
+
fs98.mkdirSync(dir, { recursive: true, mode: 448 });
|
|
53060
53084
|
const probe = path111.join(dir, ".doctor-probe");
|
|
53061
|
-
|
|
53062
|
-
const read =
|
|
53063
|
-
|
|
53085
|
+
fs98.writeFileSync(probe, "ok", { mode: 384 });
|
|
53086
|
+
const read = fs98.readFileSync(probe, "utf8");
|
|
53087
|
+
fs98.unlinkSync(probe);
|
|
53064
53088
|
if (read !== "ok") throw new Error("write/read round-trip mismatch");
|
|
53065
53089
|
return {
|
|
53066
53090
|
id: "config-dir",
|
|
@@ -53166,7 +53190,7 @@ function checkChokidar() {
|
|
|
53166
53190
|
}
|
|
53167
53191
|
async function doctor(args2 = []) {
|
|
53168
53192
|
const json = args2.includes("--json");
|
|
53169
|
-
const cliVersion = true ? "2.76.
|
|
53193
|
+
const cliVersion = true ? "2.76.14" : "0.0.0-dev";
|
|
53170
53194
|
const apiBase2 = resolveApiBaseUrl();
|
|
53171
53195
|
const diagnosticId = (0, import_node_crypto17.randomUUID)();
|
|
53172
53196
|
log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
|
|
@@ -53690,7 +53714,7 @@ async function mcpWarm(argv = [], opts = {}) {
|
|
|
53690
53714
|
// src/commands/version.ts
|
|
53691
53715
|
var import_picocolors15 = __toESM(require("picocolors"));
|
|
53692
53716
|
function version2() {
|
|
53693
|
-
const v = true ? "2.76.
|
|
53717
|
+
const v = true ? "2.76.14" : "unknown";
|
|
53694
53718
|
console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
|
|
53695
53719
|
}
|
|
53696
53720
|
|