claude-use 11.7.0 → 11.8.1
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/README.md +1 -1
- package/dist/cli.cjs +406 -315
- package/dist/index.cjs +419 -336
- package/dist/index.mjs +416 -333
- package/dist/types/index.d.ts +22 -8
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -2043,8 +2043,8 @@ var init_lock = __esm({
|
|
|
2043
2043
|
});
|
|
2044
2044
|
|
|
2045
2045
|
// src/launcher/farm.ts
|
|
2046
|
-
function readFarmManifest(
|
|
2047
|
-
const raw =
|
|
2046
|
+
function readFarmManifest(fs13, farmRoot) {
|
|
2047
|
+
const raw = fs13.readFileUtf8(import_node_path7.default.join(farmRoot, FARM_MANIFEST_FILENAME)) ?? fs13.readFileUtf8(import_node_path7.default.join(farmRoot, LEGACY_FARM_MANIFEST_FILENAME));
|
|
2048
2048
|
if (raw === void 0) {
|
|
2049
2049
|
return void 0;
|
|
2050
2050
|
}
|
|
@@ -2102,9 +2102,9 @@ function buildEntryFacts(params) {
|
|
|
2102
2102
|
entries
|
|
2103
2103
|
};
|
|
2104
2104
|
}
|
|
2105
|
-
function listSubtree(
|
|
2105
|
+
function listSubtree(fs13, root, rel) {
|
|
2106
2106
|
const absolute = import_node_path7.default.join(root, rel);
|
|
2107
|
-
const stat =
|
|
2107
|
+
const stat = fs13.lstat(absolute);
|
|
2108
2108
|
if (stat === void 0) {
|
|
2109
2109
|
return [];
|
|
2110
2110
|
}
|
|
@@ -2112,10 +2112,10 @@ function listSubtree(fs12, root, rel) {
|
|
|
2112
2112
|
return [{ rel, kind: "symlink" }];
|
|
2113
2113
|
}
|
|
2114
2114
|
if (stat.kind === "dir") {
|
|
2115
|
-
const children = [...
|
|
2115
|
+
const children = [...fs13.readdir(absolute)].sort().flatMap((name) => listSubtree(fs13, root, `${rel}/${name}`));
|
|
2116
2116
|
return [{ rel, kind: "dir" }, ...children];
|
|
2117
2117
|
}
|
|
2118
|
-
const contentHash =
|
|
2118
|
+
const contentHash = fs13.hashFile(absolute);
|
|
2119
2119
|
return [{ rel, kind: "file", ...contentHash === void 0 ? {} : { contentHash } }];
|
|
2120
2120
|
}
|
|
2121
2121
|
function topLevelScopeRoots(roots) {
|
|
@@ -2129,25 +2129,25 @@ function topLevelScopeRoots(roots) {
|
|
|
2129
2129
|
}
|
|
2130
2130
|
return kept;
|
|
2131
2131
|
}
|
|
2132
|
-
function reconciliationScope(
|
|
2132
|
+
function reconciliationScope(fs13, farmRoot, manifest) {
|
|
2133
2133
|
if (manifest !== void 0) {
|
|
2134
2134
|
return topLevelScopeRoots(manifest.materialised);
|
|
2135
2135
|
}
|
|
2136
|
-
return [...
|
|
2136
|
+
return [...fs13.readdir(farmRoot)].filter((name) => name !== FARM_MANIFEST_FILENAME && name !== LEGACY_FARM_MANIFEST_FILENAME && fs13.lstat(import_node_path7.default.join(farmRoot, name))?.kind === "dir").sort();
|
|
2137
2137
|
}
|
|
2138
|
-
function collectFarmListing(
|
|
2139
|
-
return scopeRoots.flatMap((root) => listSubtree(
|
|
2138
|
+
function collectFarmListing(fs13, farmRoot, scopeRoots) {
|
|
2139
|
+
return scopeRoots.flatMap((root) => listSubtree(fs13, farmRoot, root));
|
|
2140
2140
|
}
|
|
2141
|
-
function collectCanonicalCounterparts(
|
|
2141
|
+
function collectCanonicalCounterparts(fs13, claudeHome, farmListing) {
|
|
2142
2142
|
const out = [];
|
|
2143
2143
|
for (const entry of farmListing) {
|
|
2144
2144
|
const absolute = import_node_path7.default.join(claudeHome, entry.rel);
|
|
2145
|
-
const stat =
|
|
2145
|
+
const stat = fs13.lstat(absolute);
|
|
2146
2146
|
if (stat === void 0) {
|
|
2147
2147
|
continue;
|
|
2148
2148
|
}
|
|
2149
2149
|
if (stat.kind === "file") {
|
|
2150
|
-
const contentHash =
|
|
2150
|
+
const contentHash = fs13.hashFile(absolute);
|
|
2151
2151
|
out.push({ rel: entry.rel, kind: "file", ...contentHash === void 0 ? {} : { contentHash } });
|
|
2152
2152
|
continue;
|
|
2153
2153
|
}
|
|
@@ -2585,10 +2585,10 @@ var init_route = __esm({
|
|
|
2585
2585
|
});
|
|
2586
2586
|
|
|
2587
2587
|
// src/frontdoor/state.ts
|
|
2588
|
-
function readFrontDoorState(
|
|
2588
|
+
function readFrontDoorState(fs13, stateFile) {
|
|
2589
2589
|
let raw;
|
|
2590
2590
|
try {
|
|
2591
|
-
raw =
|
|
2591
|
+
raw = fs13.readFileUtf8(stateFile);
|
|
2592
2592
|
} catch {
|
|
2593
2593
|
return void 0;
|
|
2594
2594
|
}
|
|
@@ -2602,9 +2602,9 @@ function readFrontDoorState(fs12, stateFile) {
|
|
|
2602
2602
|
return void 0;
|
|
2603
2603
|
}
|
|
2604
2604
|
}
|
|
2605
|
-
function writeFrontDoorState(
|
|
2606
|
-
|
|
2607
|
-
|
|
2605
|
+
function writeFrontDoorState(fs13, stateFile, state) {
|
|
2606
|
+
fs13.mkdirp(import_node_path8.default.dirname(stateFile));
|
|
2607
|
+
fs13.writeFilePrivate(stateFile, `${JSON.stringify(state, null, 2)}
|
|
2608
2608
|
`);
|
|
2609
2609
|
}
|
|
2610
2610
|
function directOrigin(port) {
|
|
@@ -2614,27 +2614,27 @@ function frontDoorOrigin(state) {
|
|
|
2614
2614
|
const port = state?.directPort ?? state?.lastDirectPort;
|
|
2615
2615
|
return port === void 0 ? void 0 : directOrigin(port);
|
|
2616
2616
|
}
|
|
2617
|
-
function writeFrontDoorDirectRecord(
|
|
2618
|
-
|
|
2619
|
-
|
|
2617
|
+
function writeFrontDoorDirectRecord(fs13, recordsDir, record) {
|
|
2618
|
+
fs13.mkdirp(recordsDir);
|
|
2619
|
+
fs13.writeFilePrivate(import_node_path8.default.join(recordsDir, `${String(record.pid)}.json`), `${JSON.stringify({ directPort: record.directPort })}
|
|
2620
2620
|
`);
|
|
2621
2621
|
}
|
|
2622
|
-
function removeFrontDoorDirectRecord(
|
|
2623
|
-
|
|
2622
|
+
function removeFrontDoorDirectRecord(fs13, recordsDir, pid) {
|
|
2623
|
+
fs13.removeRecursive(import_node_path8.default.join(recordsDir, `${String(pid)}.json`));
|
|
2624
2624
|
}
|
|
2625
2625
|
function recordPid(file) {
|
|
2626
2626
|
const pidText = /^([1-9]\d*)\.json$/.exec(file)?.[1];
|
|
2627
2627
|
const pid = pidText === void 0 ? void 0 : Number(pidText);
|
|
2628
2628
|
return pid !== void 0 && Number.isSafeInteger(pid) ? pid : void 0;
|
|
2629
2629
|
}
|
|
2630
|
-
function readDirectRecordEntry(
|
|
2630
|
+
function readDirectRecordEntry(fs13, recordsDir, file) {
|
|
2631
2631
|
const pid = recordPid(file);
|
|
2632
2632
|
if (pid === void 0) {
|
|
2633
2633
|
return void 0;
|
|
2634
2634
|
}
|
|
2635
2635
|
let raw;
|
|
2636
2636
|
try {
|
|
2637
|
-
raw =
|
|
2637
|
+
raw = fs13.readFileUtf8(import_node_path8.default.join(recordsDir, file));
|
|
2638
2638
|
} catch {
|
|
2639
2639
|
return void 0;
|
|
2640
2640
|
}
|
|
@@ -2648,44 +2648,44 @@ function readDirectRecordEntry(fs12, recordsDir, file) {
|
|
|
2648
2648
|
return { malformed: true };
|
|
2649
2649
|
}
|
|
2650
2650
|
}
|
|
2651
|
-
function listFrontDoorDirectRecords(
|
|
2652
|
-
return
|
|
2653
|
-
const entry = readDirectRecordEntry(
|
|
2651
|
+
function listFrontDoorDirectRecords(fs13, recordsDir) {
|
|
2652
|
+
return fs13.readdir(recordsDir).flatMap((file) => {
|
|
2653
|
+
const entry = readDirectRecordEntry(fs13, recordsDir, file);
|
|
2654
2654
|
return entry?.record === void 0 ? [] : [entry.record];
|
|
2655
2655
|
}).sort((a, b) => a.pid - b.pid);
|
|
2656
2656
|
}
|
|
2657
|
-
function pruneMalformedFrontDoorDirectFiles(
|
|
2658
|
-
for (const file of
|
|
2657
|
+
function pruneMalformedFrontDoorDirectFiles(fs13, recordsDir, isRunning) {
|
|
2658
|
+
for (const file of fs13.readdir(recordsDir)) {
|
|
2659
2659
|
const writer = RECORD_TEMPORARY_FILE.exec(file)?.[1];
|
|
2660
2660
|
const stale = writer !== void 0 && !isRunning(Number(writer));
|
|
2661
|
-
if (stale || readDirectRecordEntry(
|
|
2662
|
-
|
|
2661
|
+
if (stale || readDirectRecordEntry(fs13, recordsDir, file)?.malformed === true) {
|
|
2662
|
+
fs13.removeRecursive(import_node_path8.default.join(recordsDir, file));
|
|
2663
2663
|
}
|
|
2664
2664
|
}
|
|
2665
2665
|
}
|
|
2666
2666
|
function liveFrontDoorDirectRecords(records, liveness) {
|
|
2667
2667
|
return records.filter((record) => liveness.doors.has(record.pid) || liveness.unknown.has(record.pid));
|
|
2668
2668
|
}
|
|
2669
|
-
function pruneDeadFrontDoorDirectRecords(
|
|
2669
|
+
function pruneDeadFrontDoorDirectRecords(fs13, recordsDir, records, liveness) {
|
|
2670
2670
|
for (const record of records) {
|
|
2671
2671
|
if (!liveness.doors.has(record.pid) && !liveness.unknown.has(record.pid)) {
|
|
2672
|
-
removeFrontDoorDirectRecord(
|
|
2672
|
+
removeFrontDoorDirectRecord(fs13, recordsDir, record.pid);
|
|
2673
2673
|
}
|
|
2674
2674
|
}
|
|
2675
2675
|
}
|
|
2676
|
-
function writeFrontDoorSession(
|
|
2677
|
-
|
|
2678
|
-
|
|
2676
|
+
function writeFrontDoorSession(fs13, sessionsDir, session) {
|
|
2677
|
+
fs13.mkdirPrivate(sessionsDir);
|
|
2678
|
+
fs13.writeFilePrivate(import_node_path8.default.join(sessionsDir, `${String(session.pid)}.json`), `${JSON.stringify(session, null, 2)}
|
|
2679
2679
|
`);
|
|
2680
2680
|
}
|
|
2681
|
-
function listFrontDoorSessions(
|
|
2681
|
+
function listFrontDoorSessions(fs13, sessionsDir) {
|
|
2682
2682
|
const sessions = [];
|
|
2683
|
-
for (const name of
|
|
2683
|
+
for (const name of fs13.readdir(sessionsDir)) {
|
|
2684
2684
|
if (!name.endsWith(".json")) {
|
|
2685
2685
|
continue;
|
|
2686
2686
|
}
|
|
2687
2687
|
try {
|
|
2688
|
-
const parsed = FrontDoorSessionSchema.safeParse(JSON.parse(
|
|
2688
|
+
const parsed = FrontDoorSessionSchema.safeParse(JSON.parse(fs13.readFileUtf8(import_node_path8.default.join(sessionsDir, name)) ?? ""));
|
|
2689
2689
|
if (parsed.success) {
|
|
2690
2690
|
sessions.push({ pid: parsed.data.pid, startedAt: parsed.data.startedAt, ...parsed.data.supervisorPid === void 0 ? {} : { supervisorPid: parsed.data.supervisorPid } });
|
|
2691
2691
|
}
|
|
@@ -2695,14 +2695,14 @@ function listFrontDoorSessions(fs12, sessionsDir) {
|
|
|
2695
2695
|
}
|
|
2696
2696
|
return sessions.sort((a, b) => a.pid - b.pid);
|
|
2697
2697
|
}
|
|
2698
|
-
function removeFrontDoorSession(
|
|
2699
|
-
|
|
2698
|
+
function removeFrontDoorSession(fs13, sessionsDir, pid) {
|
|
2699
|
+
fs13.removeRecursive(import_node_path8.default.join(sessionsDir, `${String(pid)}.json`));
|
|
2700
2700
|
}
|
|
2701
|
-
function pruneDeadFrontDoorSessions(
|
|
2701
|
+
function pruneDeadFrontDoorSessions(fs13, sessionsDir, isRunning) {
|
|
2702
2702
|
const removed = [];
|
|
2703
|
-
for (const session of listFrontDoorSessions(
|
|
2703
|
+
for (const session of listFrontDoorSessions(fs13, sessionsDir)) {
|
|
2704
2704
|
if (!isRunning(session.pid)) {
|
|
2705
|
-
removeFrontDoorSession(
|
|
2705
|
+
removeFrontDoorSession(fs13, sessionsDir, session.pid);
|
|
2706
2706
|
removed.push(session.pid);
|
|
2707
2707
|
}
|
|
2708
2708
|
}
|
|
@@ -2787,7 +2787,7 @@ var init_package = __esm({
|
|
|
2787
2787
|
"package.json"() {
|
|
2788
2788
|
package_default = {
|
|
2789
2789
|
name: "claude-use",
|
|
2790
|
-
version: "11.
|
|
2790
|
+
version: "11.8.1",
|
|
2791
2791
|
description: "A profile manager and launcher for Claude Code that lets one person run multiple logins from one machine while controlling what gets shared between them.",
|
|
2792
2792
|
license: "MIT",
|
|
2793
2793
|
author: "Joseph Mearman <joseph@mearman.co.uk>",
|
|
@@ -2992,43 +2992,43 @@ function parseJson(raw, schema) {
|
|
|
2992
2992
|
const parsed = schema.safeParse(JSON.parse(raw));
|
|
2993
2993
|
return parsed.success ? parsed.data : void 0;
|
|
2994
2994
|
}
|
|
2995
|
-
function readHeadroomState(
|
|
2995
|
+
function readHeadroomState(fs13, stateFile) {
|
|
2996
2996
|
try {
|
|
2997
|
-
return parseJson(
|
|
2997
|
+
return parseJson(fs13.readFileUtf8(stateFile), HeadroomStateSchema);
|
|
2998
2998
|
} catch {
|
|
2999
2999
|
return void 0;
|
|
3000
3000
|
}
|
|
3001
3001
|
}
|
|
3002
|
-
function writeHeadroomState(
|
|
3003
|
-
|
|
3004
|
-
|
|
3002
|
+
function writeHeadroomState(fs13, stateFile, state) {
|
|
3003
|
+
fs13.mkdirp(import_node_path11.default.dirname(stateFile));
|
|
3004
|
+
fs13.writeFilePrivate(stateFile, `${JSON.stringify(state, null, 2)}
|
|
3005
3005
|
`);
|
|
3006
3006
|
}
|
|
3007
|
-
function resolveServingHeadroomState(
|
|
3008
|
-
const current = readHeadroomState(
|
|
3007
|
+
function resolveServingHeadroomState(fs13, files, isRunning) {
|
|
3008
|
+
const current = readHeadroomState(fs13, files.stateFile);
|
|
3009
3009
|
if (current !== void 0) {
|
|
3010
3010
|
return { path: files.stateFile, state: current };
|
|
3011
3011
|
}
|
|
3012
|
-
const legacy = readHeadroomState(
|
|
3012
|
+
const legacy = readHeadroomState(fs13, files.legacyStateFile);
|
|
3013
3013
|
if (legacy?.supervisorPid !== void 0 && isRunning(legacy.supervisorPid)) {
|
|
3014
3014
|
return { path: files.legacyStateFile, state: legacy };
|
|
3015
3015
|
}
|
|
3016
3016
|
return void 0;
|
|
3017
3017
|
}
|
|
3018
|
-
function migrateHeadroomState(
|
|
3019
|
-
const legacy = readHeadroomState(
|
|
3018
|
+
function migrateHeadroomState(fs13, files, isRunning) {
|
|
3019
|
+
const legacy = readHeadroomState(fs13, files.legacyStateFile);
|
|
3020
3020
|
const legacyLive = legacy?.supervisorPid !== void 0 && isRunning(legacy.supervisorPid);
|
|
3021
|
-
const current = readHeadroomState(
|
|
3021
|
+
const current = readHeadroomState(fs13, files.stateFile);
|
|
3022
3022
|
if (current !== void 0 || legacyLive) {
|
|
3023
|
-
if (!legacyLive &&
|
|
3024
|
-
|
|
3023
|
+
if (!legacyLive && fs13.readFileUtf8(files.legacyStateFile) !== void 0) {
|
|
3024
|
+
fs13.removeRecursive(files.legacyStateFile);
|
|
3025
3025
|
}
|
|
3026
3026
|
return;
|
|
3027
3027
|
}
|
|
3028
3028
|
if (legacy !== void 0) {
|
|
3029
|
-
writeHeadroomState(
|
|
3029
|
+
writeHeadroomState(fs13, files.stateFile, legacy);
|
|
3030
3030
|
}
|
|
3031
|
-
|
|
3031
|
+
fs13.removeRecursive(files.legacyStateFile);
|
|
3032
3032
|
}
|
|
3033
3033
|
function hashAllowlist(allowlist) {
|
|
3034
3034
|
return (0, import_node_crypto6.createHash)("sha256").update(allowlist.join("\n")).digest("hex");
|
|
@@ -3061,27 +3061,27 @@ function isAdmissibleUrl(entry) {
|
|
|
3061
3061
|
function parseAllowlistFile(content) {
|
|
3062
3062
|
return content.replace(/^\uFEFF/, "").replace(ALLOWLIST_FILE_COMMENT, "").split(ALLOWLIST_FILE_SEPARATORS).map((entry) => entry.replace(ALLOWLIST_SURROUNDING_WHITESPACE, "")).filter((entry) => entry !== "" && !ALLOWLIST_ENTRY_WHITESPACE.test(entry) && (entry.includes("://") ? isAdmissibleUrl(entry) : isBareHost(entry)));
|
|
3063
3063
|
}
|
|
3064
|
-
function writeAllowlistFile(
|
|
3065
|
-
|
|
3066
|
-
|
|
3064
|
+
function writeAllowlistFile(fs13, allowlistFile, allowlist) {
|
|
3065
|
+
fs13.mkdirPrivate(import_node_path11.default.dirname(allowlistFile));
|
|
3066
|
+
fs13.writeFilePrivate(allowlistFile, formatAllowlistFile(allowlist));
|
|
3067
3067
|
}
|
|
3068
|
-
function pruneStaleAllowlistTemporaries(
|
|
3068
|
+
function pruneStaleAllowlistTemporaries(fs13, allowlistFile, isRunning) {
|
|
3069
3069
|
const prefix = `${import_node_path11.default.basename(allowlistFile)}.`;
|
|
3070
|
-
for (const name of
|
|
3070
|
+
for (const name of fs13.readdir(import_node_path11.default.dirname(allowlistFile))) {
|
|
3071
3071
|
const writer = name.startsWith(prefix) ? /^([1-9]\d*)\.tmp$/.exec(name.slice(prefix.length))?.[1] : void 0;
|
|
3072
3072
|
if (writer !== void 0 && !isRunning(Number(writer))) {
|
|
3073
|
-
|
|
3073
|
+
fs13.removeRecursive(import_node_path11.default.join(import_node_path11.default.dirname(allowlistFile), name));
|
|
3074
3074
|
}
|
|
3075
3075
|
}
|
|
3076
3076
|
}
|
|
3077
|
-
function readAllProviders(
|
|
3077
|
+
function readAllProviders(fs13, providersDir) {
|
|
3078
3078
|
const result = [];
|
|
3079
|
-
for (const name of
|
|
3079
|
+
for (const name of fs13.readdir(providersDir)) {
|
|
3080
3080
|
if (!name.endsWith(".json")) {
|
|
3081
3081
|
continue;
|
|
3082
3082
|
}
|
|
3083
3083
|
try {
|
|
3084
|
-
const parsed = parseJson(
|
|
3084
|
+
const parsed = parseJson(fs13.readFileUtf8(import_node_path11.default.join(providersDir, name)), ProviderSchema);
|
|
3085
3085
|
if (parsed !== void 0) {
|
|
3086
3086
|
result.push({ name: name.slice(0, -".json".length), provider: parsed });
|
|
3087
3087
|
}
|
|
@@ -3091,22 +3091,22 @@ function readAllProviders(fs12, providersDir) {
|
|
|
3091
3091
|
}
|
|
3092
3092
|
return result;
|
|
3093
3093
|
}
|
|
3094
|
-
function writeSession(
|
|
3095
|
-
|
|
3096
|
-
|
|
3094
|
+
function writeSession(fs13, sessionsDir, session) {
|
|
3095
|
+
fs13.mkdirp(sessionsDir);
|
|
3096
|
+
fs13.writeFileUtf8(import_node_path11.default.join(sessionsDir, `${String(session.pid)}.json`), `${JSON.stringify(session, null, 2)}
|
|
3097
3097
|
`);
|
|
3098
3098
|
}
|
|
3099
|
-
function removeSession(
|
|
3100
|
-
|
|
3099
|
+
function removeSession(fs13, sessionsDir, pid) {
|
|
3100
|
+
fs13.removeRecursive(import_node_path11.default.join(sessionsDir, `${String(pid)}.json`));
|
|
3101
3101
|
}
|
|
3102
|
-
function listSessions(
|
|
3102
|
+
function listSessions(fs13, sessionsDir) {
|
|
3103
3103
|
const sessions = [];
|
|
3104
|
-
for (const name of
|
|
3104
|
+
for (const name of fs13.readdir(sessionsDir)) {
|
|
3105
3105
|
if (!name.endsWith(".json")) {
|
|
3106
3106
|
continue;
|
|
3107
3107
|
}
|
|
3108
3108
|
try {
|
|
3109
|
-
const parsed = parseJson(
|
|
3109
|
+
const parsed = parseJson(fs13.readFileUtf8(import_node_path11.default.join(sessionsDir, name)), HeadroomSessionSchema);
|
|
3110
3110
|
if (parsed !== void 0) {
|
|
3111
3111
|
sessions.push(parsed);
|
|
3112
3112
|
}
|
|
@@ -3116,22 +3116,22 @@ function listSessions(fs12, sessionsDir) {
|
|
|
3116
3116
|
}
|
|
3117
3117
|
return sessions.sort((a, b) => a.pid - b.pid);
|
|
3118
3118
|
}
|
|
3119
|
-
function sessionsForSupervisor(
|
|
3120
|
-
return listSessions(
|
|
3119
|
+
function sessionsForSupervisor(fs13, sessionsDir, supervisorPid) {
|
|
3120
|
+
return listSessions(fs13, sessionsDir).filter((session) => session.supervisorPid === supervisorPid);
|
|
3121
3121
|
}
|
|
3122
|
-
function pruneDeadSessions(
|
|
3122
|
+
function pruneDeadSessions(fs13, sessionsDir, isRunning) {
|
|
3123
3123
|
const removed = [];
|
|
3124
|
-
for (const session of listSessions(
|
|
3124
|
+
for (const session of listSessions(fs13, sessionsDir)) {
|
|
3125
3125
|
if (!isRunning(session.pid)) {
|
|
3126
|
-
removeSession(
|
|
3126
|
+
removeSession(fs13, sessionsDir, session.pid);
|
|
3127
3127
|
removed.push(session.pid);
|
|
3128
3128
|
}
|
|
3129
3129
|
}
|
|
3130
3130
|
return removed;
|
|
3131
3131
|
}
|
|
3132
|
-
function readStartLock(
|
|
3132
|
+
function readStartLock(fs13, lockFile) {
|
|
3133
3133
|
try {
|
|
3134
|
-
return parseJson(
|
|
3134
|
+
return parseJson(fs13.readFileUtf8(lockFile), HeadroomLockSchema);
|
|
3135
3135
|
} catch {
|
|
3136
3136
|
return void 0;
|
|
3137
3137
|
}
|
|
@@ -3224,12 +3224,12 @@ function earlierReleaseAllowlistHash(providers, doorOrigin) {
|
|
|
3224
3224
|
}
|
|
3225
3225
|
return hashAllowlist([...entries].sort());
|
|
3226
3226
|
}
|
|
3227
|
-
function earlierReleaseDaemon(
|
|
3227
|
+
function earlierReleaseDaemon(fs13, paths, daemon) {
|
|
3228
3228
|
if (daemonIdentity(daemon.commandLine, daemon.socketPath) !== "earlier-release") {
|
|
3229
3229
|
return void 0;
|
|
3230
3230
|
}
|
|
3231
|
-
const providers = readAllProviders(
|
|
3232
|
-
const expected = earlierReleaseAllowlistHash(providers, frontDoorOrigin(readFrontDoorState(
|
|
3231
|
+
const providers = readAllProviders(fs13, paths.providersDir).map((entry) => entry.provider);
|
|
3232
|
+
const expected = earlierReleaseAllowlistHash(providers, frontDoorOrigin(readFrontDoorState(fs13, paths.frontdoorStateFile)));
|
|
3233
3233
|
return { admitsServingDoor: daemon.recordedHash === expected };
|
|
3234
3234
|
}
|
|
3235
3235
|
var EARLIER_RELEASE_ALLOWLIST, EARLIER_RELEASE_ANTHROPIC_UPSTREAM;
|
|
@@ -3254,8 +3254,8 @@ function awaitingCause(daemonPid, identity, allowlistFile) {
|
|
|
3254
3254
|
}
|
|
3255
3255
|
return `the headroom supervisor has not written an allowlist admitting this launch's upstreams to ${allowlistFile} within ${String(HEADROOM_START_TIMEOUT_MS)}ms`;
|
|
3256
3256
|
}
|
|
3257
|
-
function daemonAdmits(
|
|
3258
|
-
const content =
|
|
3257
|
+
function daemonAdmits(fs13, allowlistFile, recordedHash, required) {
|
|
3258
|
+
const content = fs13.readFileUtf8(allowlistFile);
|
|
3259
3259
|
if (content === void 0 || recordedHash === void 0) {
|
|
3260
3260
|
return false;
|
|
3261
3261
|
}
|
|
@@ -3518,7 +3518,7 @@ function verifyAllowlistFile(allowlistFile, ports) {
|
|
|
3518
3518
|
const replaceable = fileStat === void 0 || fileStat.kind === "file" || fileStat.kind === "symlink";
|
|
3519
3519
|
return { message: refusal2, repairable: replaceable };
|
|
3520
3520
|
}
|
|
3521
|
-
function prepareHeadroomSocket(
|
|
3521
|
+
function prepareHeadroomSocket(fs13, ports, paths, supervisorPid) {
|
|
3522
3522
|
const unsupported = platformRefusal(ports.platform);
|
|
3523
3523
|
if (unsupported !== void 0) {
|
|
3524
3524
|
return { refused: unsupported };
|
|
@@ -3533,18 +3533,18 @@ function prepareHeadroomSocket(fs12, ports, paths, supervisorPid) {
|
|
|
3533
3533
|
if (ports.lstat(paths.headroomSocketDir)?.kind === "symlink") {
|
|
3534
3534
|
return { refused: `the headroom socket directory ${paths.headroomSocketDir} is a symlink; it must be the real directory` };
|
|
3535
3535
|
}
|
|
3536
|
-
|
|
3536
|
+
fs13.mkdirPrivate(paths.headroomSocketDir);
|
|
3537
3537
|
const refusal2 = ownerOnlyRefusal("socket directory", paths.headroomSocketDir, ports.lstat(paths.headroomSocketDir), "dir", ports.currentUid());
|
|
3538
3538
|
return refusal2 === void 0 ? { socketPath } : { refused: refusal2 };
|
|
3539
3539
|
}
|
|
3540
|
-
function pruneStaleHeadroomSockets(
|
|
3540
|
+
function pruneStaleHeadroomSockets(fs13, paths, isRunning) {
|
|
3541
3541
|
const removed = [];
|
|
3542
|
-
for (const name of
|
|
3542
|
+
for (const name of fs13.readdir(paths.headroomSocketDir)) {
|
|
3543
3543
|
const pid = HEADROOM_SOCKET_NAME.exec(name)?.[1];
|
|
3544
3544
|
if (pid === void 0 || isRunning(Number.parseInt(pid, 10))) {
|
|
3545
3545
|
continue;
|
|
3546
3546
|
}
|
|
3547
|
-
|
|
3547
|
+
fs13.removeRecursive(import_node_path12.default.join(paths.headroomSocketDir, name));
|
|
3548
3548
|
removed.push(name);
|
|
3549
3549
|
}
|
|
3550
3550
|
return removed;
|
|
@@ -3656,37 +3656,37 @@ function compareVersions2(a, b) {
|
|
|
3656
3656
|
return 0;
|
|
3657
3657
|
}
|
|
3658
3658
|
async function runSupervisor(initialConfig, ports, options = {}) {
|
|
3659
|
-
const { fs:
|
|
3659
|
+
const { fs: fs13, paths } = ports;
|
|
3660
3660
|
let config = initialConfig;
|
|
3661
|
-
migrateHeadroomState(
|
|
3662
|
-
const previousState = resolveServingHeadroomState(
|
|
3661
|
+
migrateHeadroomState(fs13, { stateFile: paths.headroomStateFile, legacyStateFile: paths.headroomLegacyStateFile }, ports.isRunning);
|
|
3662
|
+
const previousState = resolveServingHeadroomState(fs13, { stateFile: paths.headroomStateFile, legacyStateFile: paths.headroomLegacyStateFile }, ports.isRunning)?.state;
|
|
3663
3663
|
if (previousState?.supervisorPid !== void 0 && previousState.supervisorPid !== ports.ownPid && ports.isRunning(previousState.supervisorPid)) {
|
|
3664
3664
|
ports.log(`agent-shim headroom supervisor ${String(ports.ownPid)}: supervisor ${String(previousState.supervisorPid)} already owns the daemon; exiting`);
|
|
3665
3665
|
return 0;
|
|
3666
3666
|
}
|
|
3667
3667
|
let installedSource = previousState?.installedSource;
|
|
3668
3668
|
const ownsState = () => {
|
|
3669
|
-
const owner = readHeadroomState(
|
|
3669
|
+
const owner = readHeadroomState(fs13, paths.headroomStateFile)?.supervisorPid;
|
|
3670
3670
|
return owner === void 0 || owner === ports.ownPid || !ports.isRunning(owner);
|
|
3671
3671
|
};
|
|
3672
3672
|
const writeOwnState = (state) => {
|
|
3673
3673
|
if (!ownsState()) {
|
|
3674
3674
|
return false;
|
|
3675
3675
|
}
|
|
3676
|
-
writeHeadroomState(
|
|
3676
|
+
writeHeadroomState(fs13, paths.headroomStateFile, state);
|
|
3677
3677
|
return true;
|
|
3678
3678
|
};
|
|
3679
3679
|
const fail = (message) => {
|
|
3680
3680
|
if (writeOwnState({ lastError: message })) {
|
|
3681
|
-
|
|
3681
|
+
fs13.removeRecursive(paths.headroomLockFile);
|
|
3682
3682
|
}
|
|
3683
3683
|
ports.log(`agent-shim headroom supervisor: ${message}`);
|
|
3684
3684
|
return 1;
|
|
3685
3685
|
};
|
|
3686
3686
|
const syncAllowlistFile = (allowlist) => {
|
|
3687
3687
|
try {
|
|
3688
|
-
if (
|
|
3689
|
-
writeAllowlistFile(
|
|
3688
|
+
if (fs13.readFileUtf8(paths.headroomAllowlistFile) !== formatAllowlistFile(allowlist)) {
|
|
3689
|
+
writeAllowlistFile(fs13, paths.headroomAllowlistFile, allowlist);
|
|
3690
3690
|
ports.log(`agent-shim headroom supervisor: wrote allowlist [${allowlist.join(", ")}] to ${paths.headroomAllowlistFile}`);
|
|
3691
3691
|
}
|
|
3692
3692
|
return void 0;
|
|
@@ -3704,9 +3704,9 @@ async function runSupervisor(initialConfig, ports, options = {}) {
|
|
|
3704
3704
|
}
|
|
3705
3705
|
ports.log(`agent-shim headroom supervisor: repairing the allowlist file: ${problem.message}`);
|
|
3706
3706
|
try {
|
|
3707
|
-
|
|
3708
|
-
|
|
3709
|
-
writeAllowlistFile(
|
|
3707
|
+
fs13.mkdirPrivate(paths.headroomDir);
|
|
3708
|
+
fs13.mkdirPrivate(import_node_path13.default.dirname(paths.headroomAllowlistFile));
|
|
3709
|
+
writeAllowlistFile(fs13, paths.headroomAllowlistFile, allowlist);
|
|
3710
3710
|
} catch (error) {
|
|
3711
3711
|
return `could not write the headroom allowlist file ${paths.headroomAllowlistFile}: ${error instanceof Error ? error.message : String(error)}`;
|
|
3712
3712
|
}
|
|
@@ -3731,20 +3731,20 @@ async function runSupervisor(initialConfig, ports, options = {}) {
|
|
|
3731
3731
|
installedSource = config.source;
|
|
3732
3732
|
return void 0;
|
|
3733
3733
|
};
|
|
3734
|
-
const socket = prepareHeadroomSocket(
|
|
3734
|
+
const socket = prepareHeadroomSocket(fs13, ports.socketTrust, paths, ports.ownPid);
|
|
3735
3735
|
if (socket.refused !== void 0) {
|
|
3736
3736
|
return fail(socket.refused);
|
|
3737
3737
|
}
|
|
3738
3738
|
const { socketPath } = socket;
|
|
3739
|
-
pruneStaleHeadroomSockets(
|
|
3740
|
-
pruneStaleAllowlistTemporaries(
|
|
3739
|
+
pruneStaleHeadroomSockets(fs13, paths, ports.isRunning);
|
|
3740
|
+
pruneStaleAllowlistTemporaries(fs13, paths.headroomAllowlistFile, ports.isRunning);
|
|
3741
3741
|
const installFailure = ensureInstalled();
|
|
3742
3742
|
if (installFailure !== void 0) {
|
|
3743
3743
|
return fail(installFailure);
|
|
3744
3744
|
}
|
|
3745
3745
|
const version = ports.headroomVersion() ?? "unknown";
|
|
3746
3746
|
writeOwnState({ supervisorPid: ports.ownPid, version, installedSource });
|
|
3747
|
-
ports.log(`agent-shim headroom supervisor ${String(ports.ownPid)}: managing headroom on allowlist [${currentHeadroomAllowlistInputs(
|
|
3747
|
+
ports.log(`agent-shim headroom supervisor ${String(ports.ownPid)}: managing headroom on allowlist [${currentHeadroomAllowlistInputs(fs13, paths, ports.frontDoorLiveness).frontDoorOrigins.join(", ")}]`);
|
|
3748
3748
|
const orphanPid = previousState?.headroomPid;
|
|
3749
3749
|
const orphanSocket = previousState?.socketPath ?? (previousState?.supervisorPid === void 0 ? void 0 : headroomSocketPath(paths, previousState.supervisorPid));
|
|
3750
3750
|
const orphanIdentity = orphanPid === void 0 || orphanSocket === void 0 || !ports.isRunning(orphanPid) ? void 0 : daemonIdentity(ports.daemonCommandLine(orphanPid), orphanSocket);
|
|
@@ -3779,12 +3779,12 @@ async function runSupervisor(initialConfig, ports, options = {}) {
|
|
|
3779
3779
|
ticks += 1;
|
|
3780
3780
|
config = ports.readConfig();
|
|
3781
3781
|
const settingsHash = hashSettings(config.settings);
|
|
3782
|
-
const inputs = currentHeadroomAllowlistInputs(
|
|
3783
|
-
pruneDeadFrontDoorDirectRecords(
|
|
3784
|
-
pruneMalformedFrontDoorDirectFiles(
|
|
3782
|
+
const inputs = currentHeadroomAllowlistInputs(fs13, paths, ports.frontDoorLiveness);
|
|
3783
|
+
pruneDeadFrontDoorDirectRecords(fs13, paths.frontdoorDirectRecordsDir, inputs.frontDoorRecords, inputs.frontDoorLiveness);
|
|
3784
|
+
pruneMalformedFrontDoorDirectFiles(fs13, paths.frontdoorDirectRecordsDir, ports.isRunning);
|
|
3785
3785
|
const allowlist = inputs.frontDoorOrigins;
|
|
3786
3786
|
const allowlistHash = hashAllowlist(allowlist);
|
|
3787
|
-
pruneDeadSessions(
|
|
3787
|
+
pruneDeadSessions(fs13, paths.headroomSessionsDir, ports.isRunning);
|
|
3788
3788
|
const ownsNow = ownsState();
|
|
3789
3789
|
if (!ownsNow && !superseded) {
|
|
3790
3790
|
ports.log("agent-shim headroom supervisor: another supervisor now owns the state file; serving this daemon's own sessions until they end");
|
|
@@ -3831,7 +3831,7 @@ async function runSupervisor(initialConfig, ports, options = {}) {
|
|
|
3831
3831
|
runningSettingsHash = settingsHash;
|
|
3832
3832
|
const recorded = writeOwnState(servingState(pid));
|
|
3833
3833
|
if (recorded) {
|
|
3834
|
-
|
|
3834
|
+
fs13.removeRecursive(paths.headroomLockFile);
|
|
3835
3835
|
}
|
|
3836
3836
|
idleSince = void 0;
|
|
3837
3837
|
ports.log(`agent-shim headroom supervisor: headroom pid ${String(pid)} ready on unix socket ${socketPath}`);
|
|
@@ -3859,7 +3859,7 @@ async function runSupervisor(initialConfig, ports, options = {}) {
|
|
|
3859
3859
|
ports.log(`agent-shim headroom supervisor: headroom pid ${String(headroomPid)} now serves allowlist [${allowlist.join(", ")}]`);
|
|
3860
3860
|
}
|
|
3861
3861
|
if (runningSettingsHash !== settingsHash || installedSource !== config.source) {
|
|
3862
|
-
if (sessionsForSupervisor(
|
|
3862
|
+
if (sessionsForSupervisor(fs13, paths.headroomSessionsDir, ports.ownPid).length === 0) {
|
|
3863
3863
|
ports.log("agent-shim headroom supervisor: configuration drifted and no sessions are live; restarting headroom");
|
|
3864
3864
|
ports.stopProcess(headroomPid);
|
|
3865
3865
|
headroomPid = void 0;
|
|
@@ -3868,7 +3868,7 @@ async function runSupervisor(initialConfig, ports, options = {}) {
|
|
|
3868
3868
|
continue;
|
|
3869
3869
|
}
|
|
3870
3870
|
}
|
|
3871
|
-
const sessions = sessionsForSupervisor(
|
|
3871
|
+
const sessions = sessionsForSupervisor(fs13, paths.headroomSessionsDir, ports.ownPid);
|
|
3872
3872
|
if (sessions.length === 0) {
|
|
3873
3873
|
idleSince ??= ports.now();
|
|
3874
3874
|
const idleMs = ports.now() - idleSince;
|
|
@@ -3893,9 +3893,9 @@ function undeterminedFrontDoors(inputs) {
|
|
|
3893
3893
|
return reason === void 0 ? [] : [{ pid: record.pid, origin: directOrigin(record.directPort), reason }];
|
|
3894
3894
|
});
|
|
3895
3895
|
}
|
|
3896
|
-
function currentHeadroomAllowlistInputs(
|
|
3897
|
-
const named = frontDoorOrigin(readFrontDoorState(
|
|
3898
|
-
const records = listFrontDoorDirectRecords(
|
|
3896
|
+
function currentHeadroomAllowlistInputs(fs13, paths, frontDoorLiveness) {
|
|
3897
|
+
const named = frontDoorOrigin(readFrontDoorState(fs13, paths.frontdoorStateFile));
|
|
3898
|
+
const records = listFrontDoorDirectRecords(fs13, paths.frontdoorDirectRecordsDir);
|
|
3899
3899
|
const liveness = frontDoorLiveness(records.map((record) => record.pid));
|
|
3900
3900
|
const live = liveFrontDoorDirectRecords(records, liveness).map((record) => directOrigin(record.directPort));
|
|
3901
3901
|
return {
|
|
@@ -3904,8 +3904,8 @@ function currentHeadroomAllowlistInputs(fs12, paths, frontDoorLiveness) {
|
|
|
3904
3904
|
frontDoorOrigins: [.../* @__PURE__ */ new Set([...named === void 0 ? [] : [named], ...live])].sort()
|
|
3905
3905
|
};
|
|
3906
3906
|
}
|
|
3907
|
-
function launchRequiredUpstreams(
|
|
3908
|
-
const door = frontDoorOrigin(readFrontDoorState(
|
|
3907
|
+
function launchRequiredUpstreams(fs13, paths) {
|
|
3908
|
+
const door = frontDoorOrigin(readFrontDoorState(fs13, paths.frontdoorStateFile));
|
|
3909
3909
|
return door === void 0 ? [] : [door];
|
|
3910
3910
|
}
|
|
3911
3911
|
async function waitUntilReady(ports, socketPath, pid) {
|
|
@@ -4526,8 +4526,8 @@ var init_cascade = __esm({
|
|
|
4526
4526
|
function poolNameOf(selector) {
|
|
4527
4527
|
return selector.startsWith(POOL_SELECTOR_PREFIX) ? selector.slice(POOL_SELECTOR_PREFIX.length) : void 0;
|
|
4528
4528
|
}
|
|
4529
|
-
function readActiveIdentity(
|
|
4530
|
-
const trimmed =
|
|
4529
|
+
function readActiveIdentity(fs13, activeIdentityFile) {
|
|
4530
|
+
const trimmed = fs13.readFileUtf8(activeIdentityFile)?.trim();
|
|
4531
4531
|
return trimmed === void 0 || trimmed === "" ? void 0 : trimmed;
|
|
4532
4532
|
}
|
|
4533
4533
|
function isNonEmpty(value) {
|
|
@@ -4574,8 +4574,8 @@ function decideConfigProfile(params) {
|
|
|
4574
4574
|
}
|
|
4575
4575
|
return { source: "none" };
|
|
4576
4576
|
}
|
|
4577
|
-
function loadIdentity(identitiesDir, name,
|
|
4578
|
-
return loadConfigFile(import_node_path17.default.join(identitiesDir, name, "identity.json"), IdentitySchema,
|
|
4577
|
+
function loadIdentity(identitiesDir, name, fs13) {
|
|
4578
|
+
return loadConfigFile(import_node_path17.default.join(identitiesDir, name, "identity.json"), IdentitySchema, fs13.readConfigFile);
|
|
4579
4579
|
}
|
|
4580
4580
|
var import_node_path17, IDENTITY_DECISION_SOURCES, CONFIG_PROFILE_DECISION_SOURCES;
|
|
4581
4581
|
var init_identity = __esm({
|
|
@@ -4807,12 +4807,12 @@ function isIdentityName(name) {
|
|
|
4807
4807
|
function claudeJsonPath(identitiesDir, identity) {
|
|
4808
4808
|
return import_node_path18.default.join(identitiesDir, identity, CLAUDE_JSON);
|
|
4809
4809
|
}
|
|
4810
|
-
function readAccountMetadata(
|
|
4810
|
+
function readAccountMetadata(fs13, identitiesDir, identity) {
|
|
4811
4811
|
if (!isIdentityName(identity)) {
|
|
4812
4812
|
throw new Error(`"${identity}" is not a valid identity name.`);
|
|
4813
4813
|
}
|
|
4814
4814
|
const file = claudeJsonPath(identitiesDir, identity);
|
|
4815
|
-
const raw =
|
|
4815
|
+
const raw = fs13.readFileUtf8(file);
|
|
4816
4816
|
if (raw === void 0) {
|
|
4817
4817
|
return void 0;
|
|
4818
4818
|
}
|
|
@@ -4842,19 +4842,19 @@ function readAccountMetadata(fs12, identitiesDir, identity) {
|
|
|
4842
4842
|
}
|
|
4843
4843
|
return account.data;
|
|
4844
4844
|
}
|
|
4845
|
-
function createAccountReader(
|
|
4845
|
+
function createAccountReader(fs13, identitiesDir) {
|
|
4846
4846
|
const cache = /* @__PURE__ */ new Map();
|
|
4847
4847
|
return (identity) => {
|
|
4848
4848
|
if (!isIdentityName(identity)) {
|
|
4849
4849
|
throw new Error(`"${identity}" is not a valid identity name.`);
|
|
4850
4850
|
}
|
|
4851
|
-
const stat =
|
|
4851
|
+
const stat = fs13.lstat(claudeJsonPath(identitiesDir, identity));
|
|
4852
4852
|
const stamp = stat === void 0 ? "absent" : `${String(stat.mtimeMs)}:${String(stat.sizeBytes)}`;
|
|
4853
4853
|
const cached = cache.get(identity);
|
|
4854
4854
|
if (cached?.stamp === stamp) {
|
|
4855
4855
|
return cached.account;
|
|
4856
4856
|
}
|
|
4857
|
-
const account = readAccountMetadata(
|
|
4857
|
+
const account = readAccountMetadata(fs13, identitiesDir, identity);
|
|
4858
4858
|
cache.set(identity, { stamp, account });
|
|
4859
4859
|
return account;
|
|
4860
4860
|
};
|
|
@@ -5436,8 +5436,8 @@ function segmentDay(epochMs) {
|
|
|
5436
5436
|
function segmentName(day, pid) {
|
|
5437
5437
|
return `${day}.${String(pid)}.jsonl`;
|
|
5438
5438
|
}
|
|
5439
|
-
function listLogSegments(
|
|
5440
|
-
return
|
|
5439
|
+
function listLogSegments(fs13, logDir) {
|
|
5440
|
+
return fs13.readdir(logDir).flatMap((name) => {
|
|
5441
5441
|
const match = SEGMENT_RE.exec(name);
|
|
5442
5442
|
const day = match?.[1];
|
|
5443
5443
|
if (day === void 0) {
|
|
@@ -5446,15 +5446,15 @@ function listLogSegments(fs12, logDir) {
|
|
|
5446
5446
|
return [{ name, day, endsAt: Date.parse(`${day}T00:00:00.000Z`) + DAY_MS }];
|
|
5447
5447
|
}).sort((left, right) => left.day.localeCompare(right.day) || left.name.localeCompare(right.name));
|
|
5448
5448
|
}
|
|
5449
|
-
function readUsageLog(
|
|
5449
|
+
function readUsageLog(fs13, logDir, options = {}) {
|
|
5450
5450
|
const { sinceMs } = options;
|
|
5451
5451
|
const records = [];
|
|
5452
5452
|
let invalidLines = 0;
|
|
5453
|
-
for (const segment of listLogSegments(
|
|
5453
|
+
for (const segment of listLogSegments(fs13, logDir)) {
|
|
5454
5454
|
if (sinceMs !== void 0 && segment.endsAt <= sinceMs) {
|
|
5455
5455
|
continue;
|
|
5456
5456
|
}
|
|
5457
|
-
const contents =
|
|
5457
|
+
const contents = fs13.readFileUtf8(import_node_path19.default.join(logDir, segment.name));
|
|
5458
5458
|
if (contents === void 0) {
|
|
5459
5459
|
continue;
|
|
5460
5460
|
}
|
|
@@ -5490,9 +5490,9 @@ function snapshotPath(snapshotsDir, identity) {
|
|
|
5490
5490
|
}
|
|
5491
5491
|
return import_node_path19.default.join(snapshotsDir, `${identity}.json`);
|
|
5492
5492
|
}
|
|
5493
|
-
function readUsageSnapshot(
|
|
5493
|
+
function readUsageSnapshot(fs13, snapshotsDir, identity) {
|
|
5494
5494
|
const file = snapshotPath(snapshotsDir, identity);
|
|
5495
|
-
const raw =
|
|
5495
|
+
const raw = fs13.readFileUtf8(file);
|
|
5496
5496
|
if (raw === void 0) {
|
|
5497
5497
|
return void 0;
|
|
5498
5498
|
}
|
|
@@ -5508,8 +5508,8 @@ function readUsageSnapshot(fs12, snapshotsDir, identity) {
|
|
|
5508
5508
|
}
|
|
5509
5509
|
return snapshot.data;
|
|
5510
5510
|
}
|
|
5511
|
-
function listUsageSnapshots(
|
|
5512
|
-
return
|
|
5511
|
+
function listUsageSnapshots(fs13, snapshotsDir) {
|
|
5512
|
+
return fs13.readdir(snapshotsDir).flatMap((name) => {
|
|
5513
5513
|
if (!name.endsWith(".json")) {
|
|
5514
5514
|
return [];
|
|
5515
5515
|
}
|
|
@@ -5517,7 +5517,7 @@ function listUsageSnapshots(fs12, snapshotsDir) {
|
|
|
5517
5517
|
if (!isIdentityName(identity)) {
|
|
5518
5518
|
return [];
|
|
5519
5519
|
}
|
|
5520
|
-
const snapshot = readUsageSnapshot(
|
|
5520
|
+
const snapshot = readUsageSnapshot(fs13, snapshotsDir, identity);
|
|
5521
5521
|
return snapshot === void 0 ? [] : [snapshot];
|
|
5522
5522
|
}).sort((left, right) => left.identity.localeCompare(right.identity));
|
|
5523
5523
|
}
|
|
@@ -5542,11 +5542,11 @@ var init_read = __esm({
|
|
|
5542
5542
|
});
|
|
5543
5543
|
|
|
5544
5544
|
// src/usage/store.ts
|
|
5545
|
-
function pruneUsageLog(
|
|
5545
|
+
function pruneUsageLog(fs13, logDir, nowMs) {
|
|
5546
5546
|
const cutoff = nowMs - USAGE_RETENTION_MS;
|
|
5547
|
-
for (const segment of listLogSegments(
|
|
5547
|
+
for (const segment of listLogSegments(fs13, logDir)) {
|
|
5548
5548
|
if (segment.endsAt <= cutoff) {
|
|
5549
|
-
|
|
5549
|
+
fs13.removeRecursive(import_node_path20.default.join(logDir, segment.name));
|
|
5550
5550
|
}
|
|
5551
5551
|
}
|
|
5552
5552
|
}
|
|
@@ -5575,7 +5575,7 @@ function foldProviderState(current, record) {
|
|
|
5575
5575
|
};
|
|
5576
5576
|
}
|
|
5577
5577
|
function createUsageStore(deps) {
|
|
5578
|
-
const { fs:
|
|
5578
|
+
const { fs: fs13, paths } = deps;
|
|
5579
5579
|
let prunedDay;
|
|
5580
5580
|
const rewriteSnapshot = (identity, fold) => {
|
|
5581
5581
|
if (!isIdentityName(identity)) {
|
|
@@ -5584,7 +5584,7 @@ function createUsageStore(deps) {
|
|
|
5584
5584
|
}
|
|
5585
5585
|
let current;
|
|
5586
5586
|
try {
|
|
5587
|
-
current = readUsageSnapshot(
|
|
5587
|
+
current = readUsageSnapshot(fs13, paths.usageSnapshotsDir, identity);
|
|
5588
5588
|
} catch (error) {
|
|
5589
5589
|
if (!(error instanceof UsageSnapshotError)) {
|
|
5590
5590
|
throw error;
|
|
@@ -5611,8 +5611,8 @@ function createUsageStore(deps) {
|
|
|
5611
5611
|
...account === void 0 ? {} : { account },
|
|
5612
5612
|
providers
|
|
5613
5613
|
});
|
|
5614
|
-
|
|
5615
|
-
|
|
5614
|
+
fs13.mkdirPrivate(paths.usageSnapshotsDir);
|
|
5615
|
+
fs13.writeFilePrivate(snapshotPath(paths.usageSnapshotsDir, identity), `${JSON.stringify(snapshot, null, 2)}
|
|
5616
5616
|
`);
|
|
5617
5617
|
deps.publish?.(snapshot);
|
|
5618
5618
|
return true;
|
|
@@ -5621,14 +5621,14 @@ function createUsageStore(deps) {
|
|
|
5621
5621
|
record: (input) => {
|
|
5622
5622
|
const record = UsageRecordSchema.parse(input);
|
|
5623
5623
|
const nowMs = deps.now();
|
|
5624
|
-
|
|
5625
|
-
|
|
5624
|
+
fs13.mkdirPrivate(paths.usageDir);
|
|
5625
|
+
fs13.mkdirPrivate(paths.usageLogDir);
|
|
5626
5626
|
const day = segmentDay(nowMs);
|
|
5627
5627
|
if (prunedDay !== day) {
|
|
5628
|
-
pruneUsageLog(
|
|
5628
|
+
pruneUsageLog(fs13, paths.usageLogDir, nowMs);
|
|
5629
5629
|
prunedDay = day;
|
|
5630
5630
|
}
|
|
5631
|
-
|
|
5631
|
+
fs13.appendFilePrivate(import_node_path20.default.join(paths.usageLogDir, segmentName(day, deps.pid)), `${JSON.stringify(record)}
|
|
5632
5632
|
`);
|
|
5633
5633
|
if (record.identity !== void 0) {
|
|
5634
5634
|
rewriteSnapshot(record.identity, (current) => ({ ...current?.providers, [record.provider]: foldProviderState(current?.providers[record.provider], record) }));
|
|
@@ -5670,14 +5670,14 @@ var init_store2 = __esm({
|
|
|
5670
5670
|
function errorMessage(error) {
|
|
5671
5671
|
return error instanceof Error ? error.message : String(error);
|
|
5672
5672
|
}
|
|
5673
|
-
function loadPoolMembers(
|
|
5673
|
+
function loadPoolMembers(fs13, paths, identities, nowMs) {
|
|
5674
5674
|
const windowStartMs = nowMs - FIVE_HOUR_WINDOW_MS;
|
|
5675
|
-
const log = readUsageLog(
|
|
5675
|
+
const log = readUsageLog(fs13, paths.usageLogDir, { sinceMs: windowStartMs });
|
|
5676
5676
|
return identities.map((identity) => {
|
|
5677
5677
|
const records = log.records.filter((record) => record.identity === identity && record.provider === ANTHROPIC_PROVIDER && Date.parse(record.at) >= windowStartMs);
|
|
5678
5678
|
try {
|
|
5679
|
-
const snapshot = readUsageSnapshot(
|
|
5680
|
-
const account = readAccountMetadata(
|
|
5679
|
+
const snapshot = readUsageSnapshot(fs13, paths.usageSnapshotsDir, identity);
|
|
5680
|
+
const account = readAccountMetadata(fs13, paths.identitiesDir, identity) ?? snapshot?.account;
|
|
5681
5681
|
return { identity, records, ...snapshot === void 0 ? {} : { snapshot }, ...account === void 0 ? {} : { account } };
|
|
5682
5682
|
} catch (error) {
|
|
5683
5683
|
if (error instanceof UsageSnapshotError || error instanceof AccountMetadataError) {
|
|
@@ -5770,9 +5770,9 @@ function collectPoolIdentities(pools, poolName, stack, found) {
|
|
|
5770
5770
|
collectPoolIdentities(pools, nestedName, childStack, found);
|
|
5771
5771
|
}
|
|
5772
5772
|
}
|
|
5773
|
-
function readPicksFile(
|
|
5773
|
+
function readPicksFile(fs13, file) {
|
|
5774
5774
|
const empty = { schemaVersion: SCHEMA_VERSION, picks: {} };
|
|
5775
|
-
const raw =
|
|
5775
|
+
const raw = fs13.readFileUtf8(file);
|
|
5776
5776
|
if (raw === void 0) {
|
|
5777
5777
|
return { file: empty };
|
|
5778
5778
|
}
|
|
@@ -5785,17 +5785,17 @@ function readPicksFile(fs12, file) {
|
|
|
5785
5785
|
const result = PicksFileSchema.safeParse(parsed);
|
|
5786
5786
|
return result.success ? { file: result.data } : { file: empty, problem: `${file} is not a picks file this agent-shim can read` };
|
|
5787
5787
|
}
|
|
5788
|
-
function readStickyPick(
|
|
5789
|
-
const read = readPicksFile(
|
|
5788
|
+
function readStickyPick(fs13, picksFile, directory) {
|
|
5789
|
+
const read = readPicksFile(fs13, picksFile);
|
|
5790
5790
|
const entry = read.file.picks[directory];
|
|
5791
5791
|
return { ...entry === void 0 ? {} : { sticky: entry }, ...read.problem === void 0 ? {} : { problem: read.problem } };
|
|
5792
5792
|
}
|
|
5793
|
-
function recordStickyPick(
|
|
5794
|
-
const current = readPicksFile(
|
|
5793
|
+
function recordStickyPick(fs13, picksFile, directory, identity, nowMs) {
|
|
5794
|
+
const current = readPicksFile(fs13, picksFile).file.picks;
|
|
5795
5795
|
const kept = Object.entries(current).filter(([, entry]) => nowMs - Date.parse(entry.at) <= USAGE_RETENTION_MS);
|
|
5796
5796
|
const next = { schemaVersion: SCHEMA_VERSION, picks: { ...Object.fromEntries(kept), [directory]: { identity, at: new Date(nowMs).toISOString() } } };
|
|
5797
|
-
|
|
5798
|
-
|
|
5797
|
+
fs13.mkdirPrivate(import_node_path21.default.dirname(picksFile));
|
|
5798
|
+
fs13.writeFilePrivate(picksFile, `${JSON.stringify(next, null, 2)}
|
|
5799
5799
|
`);
|
|
5800
5800
|
}
|
|
5801
5801
|
var import_node_path21, import_zod13, PoolGraphError, SCHEMA_VERSION, PickEntrySchema, PicksFileSchema;
|
|
@@ -6736,6 +6736,106 @@ var init_claudeShim = __esm({
|
|
|
6736
6736
|
}
|
|
6737
6737
|
});
|
|
6738
6738
|
|
|
6739
|
+
// src/frontdoor/probe.ts
|
|
6740
|
+
function probeFrontDoorSync(port, caPem) {
|
|
6741
|
+
refuseToBlockInRole("a synchronous probe of the front door");
|
|
6742
|
+
return runProbeWorker(PROBE_SOURCE, { port, ca: caPem });
|
|
6743
|
+
}
|
|
6744
|
+
function probeListenerAcceptSync(port) {
|
|
6745
|
+
refuseToBlockInRole("a synchronous probe of a front door listener");
|
|
6746
|
+
return runProbeWorker(ACCEPT_PROBE_SOURCE, { port });
|
|
6747
|
+
}
|
|
6748
|
+
function runProbeWorker(source, data) {
|
|
6749
|
+
const shared = new SharedArrayBuffer(HEADER_SLOTS * INT32_BYTES + REASON_BYTES);
|
|
6750
|
+
const header = new Int32Array(shared, 0, HEADER_SLOTS);
|
|
6751
|
+
const worker = new import_node_worker_threads.Worker(source, {
|
|
6752
|
+
eval: true,
|
|
6753
|
+
workerData: { ...data, timeoutMs: PROBE_TIMEOUT_MS, shared, ok: VERDICT_OK, failed: VERDICT_FAILED, headerSlots: HEADER_SLOTS }
|
|
6754
|
+
});
|
|
6755
|
+
worker.unref();
|
|
6756
|
+
try {
|
|
6757
|
+
const waited = Atomics.wait(header, 0, VERDICT_PENDING, PROBE_TIMEOUT_MS + PROBE_WAIT_MARGIN_MS);
|
|
6758
|
+
const verdict = Atomics.load(header, 0);
|
|
6759
|
+
if (waited === "timed-out" || verdict === VERDICT_PENDING) {
|
|
6760
|
+
return { ok: false, reason: `the probe did not finish within ${String(PROBE_TIMEOUT_MS + PROBE_WAIT_MARGIN_MS)}ms` };
|
|
6761
|
+
}
|
|
6762
|
+
if (verdict === VERDICT_OK) {
|
|
6763
|
+
return { ok: true };
|
|
6764
|
+
}
|
|
6765
|
+
const length = Atomics.load(header, 1);
|
|
6766
|
+
return { ok: false, reason: Buffer.from(new Uint8Array(shared, HEADER_SLOTS * INT32_BYTES, length)).toString("utf8") };
|
|
6767
|
+
} finally {
|
|
6768
|
+
void worker.terminate();
|
|
6769
|
+
}
|
|
6770
|
+
}
|
|
6771
|
+
var import_node_worker_threads, PROBE_TIMEOUT_MS, PROBE_WAIT_MARGIN_MS, REASON_BYTES, HEADER_SLOTS, INT32_BYTES, VERDICT_PENDING, VERDICT_OK, VERDICT_FAILED, PROBE_SOURCE, ACCEPT_PROBE_SOURCE;
|
|
6772
|
+
var init_probe = __esm({
|
|
6773
|
+
"src/frontdoor/probe.ts"() {
|
|
6774
|
+
"use strict";
|
|
6775
|
+
init_processRole();
|
|
6776
|
+
import_node_worker_threads = require("node:worker_threads");
|
|
6777
|
+
PROBE_TIMEOUT_MS = 2e3;
|
|
6778
|
+
PROBE_WAIT_MARGIN_MS = 1e3;
|
|
6779
|
+
REASON_BYTES = 1024;
|
|
6780
|
+
HEADER_SLOTS = 2;
|
|
6781
|
+
INT32_BYTES = 4;
|
|
6782
|
+
VERDICT_PENDING = 0;
|
|
6783
|
+
VERDICT_OK = 1;
|
|
6784
|
+
VERDICT_FAILED = 2;
|
|
6785
|
+
PROBE_SOURCE = `
|
|
6786
|
+
const { workerData } = require("node:worker_threads");
|
|
6787
|
+
const https = require("node:https");
|
|
6788
|
+
const { port, ca, timeoutMs, shared, ok, failed, headerSlots } = workerData;
|
|
6789
|
+
const header = new Int32Array(shared, 0, headerSlots);
|
|
6790
|
+
const reason = new Uint8Array(shared, headerSlots * 4);
|
|
6791
|
+
let done = false;
|
|
6792
|
+
const finish = (verdict, message) => {
|
|
6793
|
+
if (done) return;
|
|
6794
|
+
done = true;
|
|
6795
|
+
const bytes = Buffer.from(String(message), "utf8").subarray(0, reason.length);
|
|
6796
|
+
reason.set(bytes);
|
|
6797
|
+
Atomics.store(header, 1, bytes.length);
|
|
6798
|
+
Atomics.store(header, 0, verdict);
|
|
6799
|
+
Atomics.notify(header, 0);
|
|
6800
|
+
};
|
|
6801
|
+
const request = https.get({ host: "127.0.0.1", port, path: "/healthz", ca: [ca], agent: false }, (response) => {
|
|
6802
|
+
let body = "";
|
|
6803
|
+
response.setEncoding("utf8");
|
|
6804
|
+
response.on("data", (chunk) => { body += chunk; });
|
|
6805
|
+
response.on("end", () => {
|
|
6806
|
+
if (response.statusCode === 200 && body === "ok") finish(ok, "");
|
|
6807
|
+
else finish(failed, "the listener answered its health probe with HTTP " + String(response.statusCode));
|
|
6808
|
+
});
|
|
6809
|
+
response.on("error", (error) => finish(failed, error.message));
|
|
6810
|
+
});
|
|
6811
|
+
// A hard deadline over the whole exchange, handshake included: a listener that accepts the connection and then says nothing must still fail the probe.
|
|
6812
|
+
setTimeout(() => { request.destroy(new Error("no answer within " + String(timeoutMs) + "ms")); }, timeoutMs);
|
|
6813
|
+
request.on("error", (error) => finish(failed, (error.code ? error.code + ": " : "") + error.message));
|
|
6814
|
+
`;
|
|
6815
|
+
ACCEPT_PROBE_SOURCE = `
|
|
6816
|
+
const { workerData } = require("node:worker_threads");
|
|
6817
|
+
const net = require("node:net");
|
|
6818
|
+
const { port, timeoutMs, shared, ok, failed, headerSlots } = workerData;
|
|
6819
|
+
const header = new Int32Array(shared, 0, headerSlots);
|
|
6820
|
+
const reason = new Uint8Array(shared, headerSlots * 4);
|
|
6821
|
+
let done = false;
|
|
6822
|
+
const finish = (verdict, message) => {
|
|
6823
|
+
if (done) return;
|
|
6824
|
+
done = true;
|
|
6825
|
+
const bytes = Buffer.from(String(message), "utf8").subarray(0, reason.length);
|
|
6826
|
+
reason.set(bytes);
|
|
6827
|
+
Atomics.store(header, 1, bytes.length);
|
|
6828
|
+
Atomics.store(header, 0, verdict);
|
|
6829
|
+
Atomics.notify(header, 0);
|
|
6830
|
+
};
|
|
6831
|
+
const socket = net.connect({ host: "127.0.0.1", port });
|
|
6832
|
+
socket.once("connect", () => { socket.destroy(); finish(ok, ""); });
|
|
6833
|
+
socket.once("error", (error) => finish(failed, (error.code ? error.code + ": " : "") + error.message));
|
|
6834
|
+
setTimeout(() => { socket.destroy(); finish(failed, "no connection accepted within " + String(timeoutMs) + "ms"); }, timeoutMs);
|
|
6835
|
+
`;
|
|
6836
|
+
}
|
|
6837
|
+
});
|
|
6838
|
+
|
|
6739
6839
|
// src/update/update.ts
|
|
6740
6840
|
function compareVersions3(left, right) {
|
|
6741
6841
|
const parse = (version) => {
|
|
@@ -7487,7 +7587,7 @@ function contextTokensOfTranscript(text) {
|
|
|
7487
7587
|
}
|
|
7488
7588
|
return void 0;
|
|
7489
7589
|
}
|
|
7490
|
-
function resumedContextTokens(
|
|
7590
|
+
function resumedContextTokens(fs13, params) {
|
|
7491
7591
|
const target = resumeTargetOf(params.passthrough);
|
|
7492
7592
|
if (target === void 0) {
|
|
7493
7593
|
return void 0;
|
|
@@ -7498,19 +7598,19 @@ function resumedContextTokens(fs12, params) {
|
|
|
7498
7598
|
file = import_node_path37.default.join(projectDir, `${target.id}.jsonl`);
|
|
7499
7599
|
} else {
|
|
7500
7600
|
let newestMs = -Infinity;
|
|
7501
|
-
for (const name of
|
|
7601
|
+
for (const name of fs13.readdir(projectDir)) {
|
|
7502
7602
|
if (!name.endsWith(".jsonl")) {
|
|
7503
7603
|
continue;
|
|
7504
7604
|
}
|
|
7505
7605
|
const candidate = import_node_path37.default.join(projectDir, name);
|
|
7506
|
-
const stat =
|
|
7606
|
+
const stat = fs13.lstat(candidate);
|
|
7507
7607
|
if (stat?.kind === "file" && stat.mtimeMs > newestMs) {
|
|
7508
7608
|
newestMs = stat.mtimeMs;
|
|
7509
7609
|
file = candidate;
|
|
7510
7610
|
}
|
|
7511
7611
|
}
|
|
7512
7612
|
}
|
|
7513
|
-
const text = file === void 0 ? void 0 :
|
|
7613
|
+
const text = file === void 0 ? void 0 : fs13.readFileUtf8(file);
|
|
7514
7614
|
return text === void 0 ? void 0 : contextTokensOfTranscript(text);
|
|
7515
7615
|
}
|
|
7516
7616
|
var import_node_path37;
|
|
@@ -7628,7 +7728,7 @@ function resolveIdentityCredential(identity, credential, env, port) {
|
|
|
7628
7728
|
return resolution.ok ? resolution : { ok: false, status: CREDENTIAL_UNAVAILABLE_EXIT, message: resolution.message };
|
|
7629
7729
|
}
|
|
7630
7730
|
function pickFromPool(decided, params, parsedArgv, readOnly) {
|
|
7631
|
-
const { paths, fs:
|
|
7731
|
+
const { paths, fs: fs13, proc, log } = params;
|
|
7632
7732
|
if (decided.pool === void 0) {
|
|
7633
7733
|
return { identityDecision: decided };
|
|
7634
7734
|
}
|
|
@@ -7643,7 +7743,7 @@ function pickFromPool(decided, params, parsedArgv, readOnly) {
|
|
|
7643
7743
|
selectedVia: decided.source,
|
|
7644
7744
|
pools: params.pools,
|
|
7645
7745
|
paths,
|
|
7646
|
-
fs:
|
|
7746
|
+
fs: fs13,
|
|
7647
7747
|
usageFs: farmRuntime.fs,
|
|
7648
7748
|
cwd: farmRuntime.cwd,
|
|
7649
7749
|
now: farmRuntime.now,
|
|
@@ -7666,7 +7766,7 @@ function pickFromPool(decided, params, parsedArgv, readOnly) {
|
|
|
7666
7766
|
};
|
|
7667
7767
|
}
|
|
7668
7768
|
function decideLaunch(params, readOnly) {
|
|
7669
|
-
const { paths, fs:
|
|
7769
|
+
const { paths, fs: fs13, proc, log } = params;
|
|
7670
7770
|
const { env, argv } = proc;
|
|
7671
7771
|
const parsedArgv = parseLauncherArgv(argv);
|
|
7672
7772
|
const cliOverride = buildCliOverride({
|
|
@@ -7681,7 +7781,7 @@ function decideLaunch(params, readOnly) {
|
|
|
7681
7781
|
argv0Identity: parsedArgv.identity,
|
|
7682
7782
|
directoryPinnedIdentity: params.directoryPinnedIdentity,
|
|
7683
7783
|
readActiveIdentityFile: () => {
|
|
7684
|
-
const raw =
|
|
7784
|
+
const raw = fs13.readFileUtf8(paths.activeIdentityFile);
|
|
7685
7785
|
if (raw === void 0) {
|
|
7686
7786
|
return void 0;
|
|
7687
7787
|
}
|
|
@@ -7716,7 +7816,7 @@ function decideLaunch(params, readOnly) {
|
|
|
7716
7816
|
}
|
|
7717
7817
|
let loadedIdentity;
|
|
7718
7818
|
if (identityDecision.name !== void 0) {
|
|
7719
|
-
loadedIdentity = loadIdentity(paths.identitiesDir, identityDecision.name,
|
|
7819
|
+
loadedIdentity = loadIdentity(paths.identitiesDir, identityDecision.name, fs13);
|
|
7720
7820
|
if (loadedIdentity === void 0) {
|
|
7721
7821
|
log.error(
|
|
7722
7822
|
`agent-shim: no identity named "${identityDecision.name}" (selected via ${identityDecision.source}). Run \`agent-shim identity add ${identityDecision.name}\` first.`
|
|
@@ -7731,7 +7831,7 @@ function decideLaunch(params, readOnly) {
|
|
|
7731
7831
|
identityDefaultConfigProfile: loadedIdentity?.config.defaultConfigProfile,
|
|
7732
7832
|
globalDefaultConfigProfile: params.globalDefaultConfigProfile
|
|
7733
7833
|
});
|
|
7734
|
-
if (configProfileDecision.name !== void 0 && params.allowMissingConfigProfile !== true &&
|
|
7834
|
+
if (configProfileDecision.name !== void 0 && params.allowMissingConfigProfile !== true && fs13.readConfigFile(import_node_path38.default.join(paths.configProfilesDir, `${configProfileDecision.name}.json`)) === void 0) {
|
|
7735
7835
|
log.error(
|
|
7736
7836
|
`agent-shim: no configuration profile named "${configProfileDecision.name}" (selected via ${configProfileDecision.source}). Run \`agent-shim profile add ${configProfileDecision.name}\` first.`
|
|
7737
7837
|
);
|
|
@@ -7740,7 +7840,7 @@ function decideLaunch(params, readOnly) {
|
|
|
7740
7840
|
const farmContext = farm !== void 0 && farmIdentity !== void 0 ? { farm, identity: farmIdentity, cascade: farm.loadCascade(configProfileDecision.name, cliOverride) } : void 0;
|
|
7741
7841
|
const providerParams = {
|
|
7742
7842
|
paths,
|
|
7743
|
-
port:
|
|
7843
|
+
port: fs13,
|
|
7744
7844
|
...parsedArgv.provider === void 0 || parsedArgv.provider === false ? {} : { cliProvider: parsedArgv.provider },
|
|
7745
7845
|
...farmContext === void 0 ? {} : { cascade: farmContext.cascade }
|
|
7746
7846
|
};
|
|
@@ -8068,78 +8168,6 @@ var init_ownCli = __esm({
|
|
|
8068
8168
|
}
|
|
8069
8169
|
});
|
|
8070
8170
|
|
|
8071
|
-
// src/frontdoor/probe.ts
|
|
8072
|
-
function probeFrontDoorSync(port, caPem) {
|
|
8073
|
-
refuseToBlockInRole("a synchronous probe of the front door");
|
|
8074
|
-
const shared = new SharedArrayBuffer(HEADER_SLOTS * INT32_BYTES + REASON_BYTES);
|
|
8075
|
-
const header = new Int32Array(shared, 0, HEADER_SLOTS);
|
|
8076
|
-
const worker = new import_node_worker_threads.Worker(PROBE_SOURCE, {
|
|
8077
|
-
eval: true,
|
|
8078
|
-
workerData: { port, ca: caPem, timeoutMs: PROBE_TIMEOUT_MS, shared, ok: VERDICT_OK, failed: VERDICT_FAILED, headerSlots: HEADER_SLOTS }
|
|
8079
|
-
});
|
|
8080
|
-
worker.unref();
|
|
8081
|
-
try {
|
|
8082
|
-
const waited = Atomics.wait(header, 0, VERDICT_PENDING, PROBE_TIMEOUT_MS + PROBE_WAIT_MARGIN_MS);
|
|
8083
|
-
const verdict = Atomics.load(header, 0);
|
|
8084
|
-
if (waited === "timed-out" || verdict === VERDICT_PENDING) {
|
|
8085
|
-
return { ok: false, reason: `the probe did not finish within ${String(PROBE_TIMEOUT_MS + PROBE_WAIT_MARGIN_MS)}ms` };
|
|
8086
|
-
}
|
|
8087
|
-
if (verdict === VERDICT_OK) {
|
|
8088
|
-
return { ok: true };
|
|
8089
|
-
}
|
|
8090
|
-
const length = Atomics.load(header, 1);
|
|
8091
|
-
return { ok: false, reason: Buffer.from(new Uint8Array(shared, HEADER_SLOTS * INT32_BYTES, length)).toString("utf8") };
|
|
8092
|
-
} finally {
|
|
8093
|
-
void worker.terminate();
|
|
8094
|
-
}
|
|
8095
|
-
}
|
|
8096
|
-
var import_node_worker_threads, PROBE_TIMEOUT_MS, PROBE_WAIT_MARGIN_MS, REASON_BYTES, HEADER_SLOTS, INT32_BYTES, VERDICT_PENDING, VERDICT_OK, VERDICT_FAILED, PROBE_SOURCE;
|
|
8097
|
-
var init_probe = __esm({
|
|
8098
|
-
"src/frontdoor/probe.ts"() {
|
|
8099
|
-
"use strict";
|
|
8100
|
-
init_processRole();
|
|
8101
|
-
import_node_worker_threads = require("node:worker_threads");
|
|
8102
|
-
PROBE_TIMEOUT_MS = 2e3;
|
|
8103
|
-
PROBE_WAIT_MARGIN_MS = 1e3;
|
|
8104
|
-
REASON_BYTES = 1024;
|
|
8105
|
-
HEADER_SLOTS = 2;
|
|
8106
|
-
INT32_BYTES = 4;
|
|
8107
|
-
VERDICT_PENDING = 0;
|
|
8108
|
-
VERDICT_OK = 1;
|
|
8109
|
-
VERDICT_FAILED = 2;
|
|
8110
|
-
PROBE_SOURCE = `
|
|
8111
|
-
const { workerData } = require("node:worker_threads");
|
|
8112
|
-
const https = require("node:https");
|
|
8113
|
-
const { port, ca, timeoutMs, shared, ok, failed, headerSlots } = workerData;
|
|
8114
|
-
const header = new Int32Array(shared, 0, headerSlots);
|
|
8115
|
-
const reason = new Uint8Array(shared, headerSlots * 4);
|
|
8116
|
-
let done = false;
|
|
8117
|
-
const finish = (verdict, message) => {
|
|
8118
|
-
if (done) return;
|
|
8119
|
-
done = true;
|
|
8120
|
-
const bytes = Buffer.from(String(message), "utf8").subarray(0, reason.length);
|
|
8121
|
-
reason.set(bytes);
|
|
8122
|
-
Atomics.store(header, 1, bytes.length);
|
|
8123
|
-
Atomics.store(header, 0, verdict);
|
|
8124
|
-
Atomics.notify(header, 0);
|
|
8125
|
-
};
|
|
8126
|
-
const request = https.get({ host: "127.0.0.1", port, path: "/healthz", ca: [ca], agent: false }, (response) => {
|
|
8127
|
-
let body = "";
|
|
8128
|
-
response.setEncoding("utf8");
|
|
8129
|
-
response.on("data", (chunk) => { body += chunk; });
|
|
8130
|
-
response.on("end", () => {
|
|
8131
|
-
if (response.statusCode === 200 && body === "ok") finish(ok, "");
|
|
8132
|
-
else finish(failed, "the listener answered its health probe with HTTP " + String(response.statusCode));
|
|
8133
|
-
});
|
|
8134
|
-
response.on("error", (error) => finish(failed, error.message));
|
|
8135
|
-
});
|
|
8136
|
-
// A hard deadline over the whole exchange, handshake included: a listener that accepts the connection and then says nothing must still fail the probe.
|
|
8137
|
-
setTimeout(() => { request.destroy(new Error("no answer within " + String(timeoutMs) + "ms")); }, timeoutMs);
|
|
8138
|
-
request.on("error", (error) => finish(failed, (error.code ? error.code + ": " : "") + error.message));
|
|
8139
|
-
`;
|
|
8140
|
-
}
|
|
8141
|
-
});
|
|
8142
|
-
|
|
8143
8171
|
// src/frontdoor/selfIdentity.ts
|
|
8144
8172
|
function isFrontDoorSupervisorPid(pid, identify) {
|
|
8145
8173
|
return declaredPid !== void 0 && pid === declaredPid && pid === process.pid || identify(pid);
|
|
@@ -8153,14 +8181,14 @@ var init_selfIdentity = __esm({
|
|
|
8153
8181
|
|
|
8154
8182
|
// src/frontdoor/trust.ts
|
|
8155
8183
|
function resolveTrustBundle(params) {
|
|
8156
|
-
const { caCertFile, bundlesDir, variable, inherited, fs:
|
|
8184
|
+
const { caCertFile, bundlesDir, variable, inherited, fs: fs13 } = params;
|
|
8157
8185
|
if (inherited === void 0 || inherited === "" || import_node_path40.default.resolve(inherited) === import_node_path40.default.resolve(caCertFile)) {
|
|
8158
8186
|
return { path: caCertFile };
|
|
8159
8187
|
}
|
|
8160
|
-
const caPem =
|
|
8188
|
+
const caPem = fs13.readFileUtf8(caCertFile);
|
|
8161
8189
|
let inheritedPem;
|
|
8162
8190
|
try {
|
|
8163
|
-
inheritedPem =
|
|
8191
|
+
inheritedPem = fs13.readFileUtf8(inherited);
|
|
8164
8192
|
} catch (error) {
|
|
8165
8193
|
return {
|
|
8166
8194
|
path: caCertFile,
|
|
@@ -8173,9 +8201,9 @@ function resolveTrustBundle(params) {
|
|
|
8173
8201
|
const combined = `${inheritedPem.trimEnd()}
|
|
8174
8202
|
${caPem}`;
|
|
8175
8203
|
const bundle = import_node_path40.default.join(bundlesDir, `${(0, import_node_crypto11.createHash)("sha256").update(combined).digest("hex").slice(0, BUNDLE_NAME_HEX_DIGITS)}.pem`);
|
|
8176
|
-
if (!
|
|
8177
|
-
|
|
8178
|
-
|
|
8204
|
+
if (!fs13.exists(bundle)) {
|
|
8205
|
+
fs13.mkdirp(bundlesDir);
|
|
8206
|
+
fs13.writeFileAtomic(bundle, combined);
|
|
8179
8207
|
}
|
|
8180
8208
|
return { path: bundle };
|
|
8181
8209
|
}
|
|
@@ -8205,7 +8233,7 @@ function realEnsurePorts(paths, spawnDaemon) {
|
|
|
8205
8233
|
process.kill(pid, "SIGKILL");
|
|
8206
8234
|
},
|
|
8207
8235
|
// Read fresh for each probe: a replacement supervisor may have regenerated an unparseable CA, and the probe must trust exactly what the serving door's leaf chains to.
|
|
8208
|
-
verifyListener: (port) => probeFrontDoorSync(port,
|
|
8236
|
+
verifyListener: (port) => probeFrontDoorSync(port, import_node_fs12.default.readFileSync(paths.frontdoorCaCertFile, "utf8"))
|
|
8209
8237
|
};
|
|
8210
8238
|
}
|
|
8211
8239
|
function realFrontDoorPort(paths, spawnDaemon) {
|
|
@@ -8226,11 +8254,11 @@ function realFrontDoorPort(paths, spawnDaemon) {
|
|
|
8226
8254
|
}
|
|
8227
8255
|
};
|
|
8228
8256
|
}
|
|
8229
|
-
var
|
|
8257
|
+
var import_node_fs12, realTrustBundleFs;
|
|
8230
8258
|
var init_realFrontDoorPort = __esm({
|
|
8231
8259
|
"src/frontdoor/realFrontDoorPort.ts"() {
|
|
8232
8260
|
"use strict";
|
|
8233
|
-
|
|
8261
|
+
import_node_fs12 = __toESM(require("node:fs"), 1);
|
|
8234
8262
|
init_realPorts();
|
|
8235
8263
|
init_ensure2();
|
|
8236
8264
|
init_state();
|
|
@@ -8238,10 +8266,10 @@ var init_realFrontDoorPort = __esm({
|
|
|
8238
8266
|
init_selfIdentity();
|
|
8239
8267
|
init_trust();
|
|
8240
8268
|
realTrustBundleFs = {
|
|
8241
|
-
readFileUtf8: (file) =>
|
|
8242
|
-
exists: (file) =>
|
|
8269
|
+
readFileUtf8: (file) => import_node_fs12.default.readFileSync(file, "utf8"),
|
|
8270
|
+
exists: (file) => import_node_fs12.default.existsSync(file),
|
|
8243
8271
|
mkdirp: (dir) => {
|
|
8244
|
-
|
|
8272
|
+
import_node_fs12.default.mkdirSync(dir, { recursive: true });
|
|
8245
8273
|
},
|
|
8246
8274
|
writeFileAtomic: (file, contents) => {
|
|
8247
8275
|
realFarmFs.writeFilePrivate(file, contents);
|
|
@@ -9449,9 +9477,9 @@ async function runFrontDoorSupervisor(idleShutdownMinutes, ports, options = {})
|
|
|
9449
9477
|
}
|
|
9450
9478
|
}
|
|
9451
9479
|
async function serveFrontDoor(idleShutdownMinutes, ports, options) {
|
|
9452
|
-
const { fs:
|
|
9480
|
+
const { fs: fs13, paths } = ports;
|
|
9453
9481
|
const servingBinary = ports.statOwnExecutable();
|
|
9454
|
-
const previous = readFrontDoorState(
|
|
9482
|
+
const previous = readFrontDoorState(fs13, paths.frontdoorStateFile);
|
|
9455
9483
|
let lastPort = previous?.lastPort;
|
|
9456
9484
|
let lastConnectPort = previous?.lastConnectPort;
|
|
9457
9485
|
let lastDirectPort = previous?.lastDirectPort;
|
|
@@ -9462,12 +9490,12 @@ async function serveFrontDoor(idleShutdownMinutes, ports, options) {
|
|
|
9462
9490
|
});
|
|
9463
9491
|
const fail = (message) => {
|
|
9464
9492
|
ports.closeRcStreamHub();
|
|
9465
|
-
writeFrontDoorState(
|
|
9466
|
-
|
|
9493
|
+
writeFrontDoorState(fs13, paths.frontdoorStateFile, { lastError: message, ...sticky() });
|
|
9494
|
+
fs13.removeRecursive(paths.frontdoorLockFile);
|
|
9467
9495
|
ports.log(`agent-shim frontdoor supervisor: ${message}`);
|
|
9468
9496
|
return 1;
|
|
9469
9497
|
};
|
|
9470
|
-
writeFrontDoorState(
|
|
9498
|
+
writeFrontDoorState(fs13, paths.frontdoorStateFile, { supervisorPid: ports.ownPid, ...sticky() });
|
|
9471
9499
|
const previousSticky = lastPort;
|
|
9472
9500
|
let http3;
|
|
9473
9501
|
try {
|
|
@@ -9507,16 +9535,16 @@ async function serveFrontDoor(idleShutdownMinutes, ports, options) {
|
|
|
9507
9535
|
ports.log(`agent-shim frontdoor supervisor: sticky direct port ${String(previousStickyDirect)} was occupied; moving to ${String(direct.port)} (headroom admits the new address once its supervisor rewrites the allowlist file)`);
|
|
9508
9536
|
}
|
|
9509
9537
|
lastDirectPort = direct.port;
|
|
9510
|
-
writeFrontDoorDirectRecord(
|
|
9511
|
-
writeFrontDoorState(
|
|
9538
|
+
writeFrontDoorDirectRecord(fs13, paths.frontdoorDirectRecordsDir, { pid: ports.ownPid, directPort: direct.port });
|
|
9539
|
+
writeFrontDoorState(fs13, paths.frontdoorStateFile, { protocol: FRONT_DOOR_PROTOCOL, supervisorPid: ports.ownPid, port: http3.port, connectPort: connect3.port, directPort: direct.port, ...sticky() });
|
|
9512
9540
|
ports.doorHealth.generation({ providerPort: http3.port, connectPort: connect3.port, directPort: direct.port });
|
|
9513
|
-
|
|
9541
|
+
fs13.removeRecursive(paths.frontdoorLockFile);
|
|
9514
9542
|
ports.log(`agent-shim frontdoor supervisor ${String(ports.ownPid)}: front door on 127.0.0.1:${String(http3.port)}, CONNECT surface on 127.0.0.1:${String(connect3.port)}`);
|
|
9515
9543
|
const watchdog = ports.startWatchdog?.();
|
|
9516
9544
|
let idleSince;
|
|
9517
9545
|
let ticks = 0;
|
|
9518
9546
|
const supersedingOwner = () => {
|
|
9519
|
-
const owner = readFrontDoorState(
|
|
9547
|
+
const owner = readFrontDoorState(fs13, paths.frontdoorStateFile)?.supervisorPid;
|
|
9520
9548
|
return owner !== void 0 && owner !== ports.ownPid && ports.isRunning(owner) ? owner : void 0;
|
|
9521
9549
|
};
|
|
9522
9550
|
let supersededBy;
|
|
@@ -9531,12 +9559,12 @@ async function serveFrontDoor(idleShutdownMinutes, ports, options) {
|
|
|
9531
9559
|
await connect3.close();
|
|
9532
9560
|
await http3.close();
|
|
9533
9561
|
ports.closeRcStreamHub();
|
|
9534
|
-
removeFrontDoorDirectRecord(
|
|
9562
|
+
removeFrontDoorDirectRecord(fs13, paths.frontdoorDirectRecordsDir, ports.ownPid);
|
|
9535
9563
|
};
|
|
9536
9564
|
const shutdown = async () => {
|
|
9537
9565
|
await closeServing();
|
|
9538
9566
|
if (supersedingOwner() === void 0) {
|
|
9539
|
-
writeFrontDoorState(
|
|
9567
|
+
writeFrontDoorState(fs13, paths.frontdoorStateFile, sticky());
|
|
9540
9568
|
}
|
|
9541
9569
|
return 0;
|
|
9542
9570
|
};
|
|
@@ -9547,8 +9575,8 @@ async function serveFrontDoor(idleShutdownMinutes, ports, options) {
|
|
|
9547
9575
|
return FRONTDOOR_SUPERVISOR_STILL_RUNNING;
|
|
9548
9576
|
}
|
|
9549
9577
|
ticks += 1;
|
|
9550
|
-
const listed = listFrontDoorSessions(
|
|
9551
|
-
const pruned = pruneDeadFrontDoorSessions(
|
|
9578
|
+
const listed = listFrontDoorSessions(fs13, paths.frontdoorSessionsDir);
|
|
9579
|
+
const pruned = pruneDeadFrontDoorSessions(fs13, paths.frontdoorSessionsDir, ports.isRunning);
|
|
9552
9580
|
ports.observeLaunchRegistry(listed, pruned);
|
|
9553
9581
|
ports.checkQuotaExpiry();
|
|
9554
9582
|
const prunedPids = new Set(pruned);
|
|
@@ -12044,11 +12072,11 @@ function credentialOfJson(parsed) {
|
|
|
12044
12072
|
function sequenceNumOfJson(value) {
|
|
12045
12073
|
return typeof value === "number" && Number.isInteger(value) && value >= 0 ? value : void 0;
|
|
12046
12074
|
}
|
|
12047
|
-
function createRcCredentialStore(
|
|
12048
|
-
|
|
12075
|
+
function createRcCredentialStore(fs13, dir) {
|
|
12076
|
+
fs13.mkdirPrivate(dir);
|
|
12049
12077
|
const fileFor = (sessionId) => import_node_path10.default.join(dir, `${sessionId}.json`);
|
|
12050
12078
|
const readParsed = (sessionId) => {
|
|
12051
|
-
const raw =
|
|
12079
|
+
const raw = fs13.readFileUtf8(fileFor(sessionId));
|
|
12052
12080
|
if (raw === void 0) {
|
|
12053
12081
|
return void 0;
|
|
12054
12082
|
}
|
|
@@ -12073,7 +12101,7 @@ function createRcCredentialStore(fs12, dir) {
|
|
|
12073
12101
|
}
|
|
12074
12102
|
const cursor = sequenceNumOfJson(readParsed(sessionId)?.highestSequenceNum);
|
|
12075
12103
|
const record = { ...credential, ...cursor === void 0 ? {} : { highestSequenceNum: cursor } };
|
|
12076
|
-
|
|
12104
|
+
fs13.writeFilePrivate(fileFor(sessionId), `${JSON.stringify(record, null, 2)}
|
|
12077
12105
|
`);
|
|
12078
12106
|
},
|
|
12079
12107
|
readCursor: (sessionId) => {
|
|
@@ -12088,14 +12116,14 @@ function createRcCredentialStore(fs12, dir) {
|
|
|
12088
12116
|
}
|
|
12089
12117
|
const credential = credentialOfJson(readParsed(sessionId));
|
|
12090
12118
|
const record = credential === void 0 ? { highestSequenceNum } : { ...credential, highestSequenceNum };
|
|
12091
|
-
|
|
12119
|
+
fs13.writeFilePrivate(fileFor(sessionId), `${JSON.stringify(record, null, 2)}
|
|
12092
12120
|
`);
|
|
12093
12121
|
},
|
|
12094
12122
|
remove: (sessionId) => {
|
|
12095
12123
|
if (!isSafeSessionId(sessionId)) {
|
|
12096
12124
|
return;
|
|
12097
12125
|
}
|
|
12098
|
-
|
|
12126
|
+
fs13.removeRecursive(fileFor(sessionId));
|
|
12099
12127
|
}
|
|
12100
12128
|
};
|
|
12101
12129
|
}
|
|
@@ -13891,7 +13919,7 @@ function removeIdentity(paths, name) {
|
|
|
13891
13919
|
|
|
13892
13920
|
// src/doctorReport.ts
|
|
13893
13921
|
init_realPorts();
|
|
13894
|
-
var
|
|
13922
|
+
var import_node_fs10 = __toESM(require("node:fs"), 1);
|
|
13895
13923
|
var import_node_path30 = __toESM(require("node:path"), 1);
|
|
13896
13924
|
|
|
13897
13925
|
// src/usage/signIn.ts
|
|
@@ -14114,6 +14142,53 @@ function pushFrontDoor(push, supervisors, registeredPid, liveSessions) {
|
|
|
14114
14142
|
);
|
|
14115
14143
|
}
|
|
14116
14144
|
}
|
|
14145
|
+
var LISTENER_ROUTES = {
|
|
14146
|
+
provider: "provider sessions (`z`, `m` and the like)",
|
|
14147
|
+
connect: "every plain OAuth session, which reaches Anthropic through it"
|
|
14148
|
+
};
|
|
14149
|
+
function pushFrontDoorListeners(push, readings) {
|
|
14150
|
+
for (const reading of readings) {
|
|
14151
|
+
const where = `127.0.0.1:${String(reading.port)}`;
|
|
14152
|
+
if (reading.ok) {
|
|
14153
|
+
push("frontdoor", "pass", `The front door's ${reading.listener} listener on ${where} accepted a probe in ${String(Math.round(reading.elapsedMs))} ms.`, reading.listener);
|
|
14154
|
+
continue;
|
|
14155
|
+
}
|
|
14156
|
+
push(
|
|
14157
|
+
"frontdoor",
|
|
14158
|
+
"fail",
|
|
14159
|
+
`The front door's ${reading.listener} listener on ${where} did not accept a probe${reading.reason === void 0 ? "" : ` (${reading.reason})`}, so ${LISTENER_ROUTES[reading.listener]} cannot get through while it stays like this. The supervisor is alive but is not serving: \`agent-shim frontdoor restart\` replaces it.`,
|
|
14160
|
+
reading.listener
|
|
14161
|
+
);
|
|
14162
|
+
}
|
|
14163
|
+
}
|
|
14164
|
+
|
|
14165
|
+
// src/frontdoor/listenerReadings.ts
|
|
14166
|
+
var import_node_fs9 = __toESM(require("node:fs"), 1);
|
|
14167
|
+
init_probe();
|
|
14168
|
+
function readFrontDoorListeners(state, supervisorAlive, probes) {
|
|
14169
|
+
if (!supervisorAlive) {
|
|
14170
|
+
return [];
|
|
14171
|
+
}
|
|
14172
|
+
const readings = [];
|
|
14173
|
+
const take = (listener, port, probe) => {
|
|
14174
|
+
if (port === void 0) {
|
|
14175
|
+
return;
|
|
14176
|
+
}
|
|
14177
|
+
const started = probes.now();
|
|
14178
|
+
const verdict = probe(port);
|
|
14179
|
+
readings.push({ listener, port, ok: verdict.ok, ...verdict.ok ? {} : { reason: verdict.reason }, elapsedMs: Math.max(0, probes.now() - started) });
|
|
14180
|
+
};
|
|
14181
|
+
take("provider", state.port, probes.authenticateProvider);
|
|
14182
|
+
take("connect", state.connectPort, probes.connect);
|
|
14183
|
+
return readings;
|
|
14184
|
+
}
|
|
14185
|
+
function realFrontDoorListenerProbes(paths) {
|
|
14186
|
+
return {
|
|
14187
|
+
authenticateProvider: (port) => probeFrontDoorSync(port, import_node_fs9.default.readFileSync(paths.frontdoorCaCertFile, "utf8")),
|
|
14188
|
+
connect: probeListenerAcceptSync,
|
|
14189
|
+
now: () => performance.now()
|
|
14190
|
+
};
|
|
14191
|
+
}
|
|
14117
14192
|
|
|
14118
14193
|
// src/doctorReport.ts
|
|
14119
14194
|
init_supervisorProcesses();
|
|
@@ -14558,6 +14633,9 @@ function runDoctor(params) {
|
|
|
14558
14633
|
if (params.frontDoor !== void 0) {
|
|
14559
14634
|
const validated3 = params.frontDoor.state.raw === void 0 ? void 0 : validateJson(FrontDoorStateSchema, params.frontDoor.state);
|
|
14560
14635
|
pushFrontDoor(push, params.frontDoor.supervisors, validated3?.ok === true ? validated3.data.supervisorPid : void 0, params.frontDoor.liveSessions);
|
|
14636
|
+
if (params.frontDoor.listeners !== void 0) {
|
|
14637
|
+
pushFrontDoorListeners(push, params.frontDoor.listeners);
|
|
14638
|
+
}
|
|
14561
14639
|
}
|
|
14562
14640
|
if (params.activeIdentity.raw === void 0) {
|
|
14563
14641
|
push("active-identity", "pass", "No active identity set.");
|
|
@@ -14641,25 +14719,30 @@ function formatDoctorReport(report) {
|
|
|
14641
14719
|
}
|
|
14642
14720
|
function realpathOrSelf(target) {
|
|
14643
14721
|
try {
|
|
14644
|
-
return
|
|
14722
|
+
return import_node_fs10.default.realpathSync(target);
|
|
14645
14723
|
} catch {
|
|
14646
14724
|
return target;
|
|
14647
14725
|
}
|
|
14648
14726
|
}
|
|
14727
|
+
function servingDoorListeners(paths) {
|
|
14728
|
+
const state = readFrontDoorState(realFarmFs, paths.frontdoorStateFile) ?? {};
|
|
14729
|
+
const alive = state.supervisorPid !== void 0 && realIsProcessRunning(state.supervisorPid);
|
|
14730
|
+
return readFrontDoorListeners(state, alive, realFrontDoorListenerProbes(paths));
|
|
14731
|
+
}
|
|
14649
14732
|
function collectDoctorReport(params) {
|
|
14650
14733
|
const { paths } = params;
|
|
14651
|
-
const identityNames =
|
|
14734
|
+
const identityNames = import_node_fs10.default.existsSync(paths.identitiesDir) ? import_node_fs10.default.readdirSync(paths.identitiesDir, { withFileTypes: true }).filter((entry) => entry.isDirectory() && isIdentityDirectoryName(entry.name)).map((entry) => entry.name).sort() : [];
|
|
14652
14735
|
const identities = identityNames.map((name) => {
|
|
14653
14736
|
const farmRoot = import_node_path30.default.join(paths.identitiesDir, name);
|
|
14654
14737
|
const identityPath = import_node_path30.default.join(farmRoot, "identity.json");
|
|
14655
|
-
return { name, path: identityPath, raw: realFsPort.readFileUtf8(identityPath), farmRoot, credentialsFilePresent:
|
|
14738
|
+
return { name, path: identityPath, raw: realFsPort.readFileUtf8(identityPath), farmRoot, credentialsFilePresent: import_node_fs10.default.existsSync(credentialsFilePath(farmRoot)) };
|
|
14656
14739
|
});
|
|
14657
|
-
const profileNames =
|
|
14740
|
+
const profileNames = import_node_fs10.default.existsSync(paths.configProfilesDir) ? import_node_fs10.default.readdirSync(paths.configProfilesDir, { withFileTypes: true }).filter((entry) => entry.isFile() && entry.name.endsWith(".json")).map((entry) => entry.name.slice(0, -".json".length)).sort() : [];
|
|
14658
14741
|
const configProfiles = profileNames.map((name) => {
|
|
14659
14742
|
const profilePath = import_node_path30.default.join(paths.configProfilesDir, `${name}.json`);
|
|
14660
14743
|
return { name, path: profilePath, raw: realFsPort.readFileUtf8(profilePath) };
|
|
14661
14744
|
});
|
|
14662
|
-
const providerNames =
|
|
14745
|
+
const providerNames = import_node_fs10.default.existsSync(paths.providersDir) ? import_node_fs10.default.readdirSync(paths.providersDir, { withFileTypes: true }).filter((entry) => entry.isFile() && entry.name.endsWith(".json")).map((entry) => entry.name.slice(0, -".json".length)).sort() : [];
|
|
14663
14746
|
const providers = providerNames.map((name) => {
|
|
14664
14747
|
const providerPath = import_node_path30.default.join(paths.providersDir, `${name}.json`);
|
|
14665
14748
|
return { name, path: providerPath, raw: realFsPort.readFileUtf8(providerPath) };
|
|
@@ -14704,7 +14787,7 @@ function collectDoctorReport(params) {
|
|
|
14704
14787
|
categoriesLocal: { path: paths.categoriesLocalFile, raw: realFsPort.readFileUtf8(paths.categoriesLocalFile) },
|
|
14705
14788
|
activeIdentity: { path: paths.activeIdentityFile, raw: realFsPort.readFileUtf8(paths.activeIdentityFile) },
|
|
14706
14789
|
binaryDiscovery,
|
|
14707
|
-
claudeShim: { state: shimState, targetExists: shimState !== void 0 &&
|
|
14790
|
+
claudeShim: { state: shimState, targetExists: shimState !== void 0 && import_node_fs10.default.existsSync(shimState.targetPath) },
|
|
14708
14791
|
rootPath: paths.root,
|
|
14709
14792
|
pathResolution: {
|
|
14710
14793
|
ownExecutablePath,
|
|
@@ -14744,7 +14827,7 @@ function collectDoctorReport(params) {
|
|
|
14744
14827
|
logPath: paths.headroomLogPath
|
|
14745
14828
|
}
|
|
14746
14829
|
},
|
|
14747
|
-
...uid === void 0 ? {} : { frontDoor: { state: { path: paths.frontdoorStateFile, raw: realFsPort.readFileUtf8(paths.frontdoorStateFile) }, supervisors: listFrontDoorSupervisors(realRunPort, uid), liveSessions: listFrontDoorSessions(realFarmFs, paths.frontdoorSessionsDir).filter((session) => realIsProcessRunning(session.pid)) } }
|
|
14830
|
+
...uid === void 0 ? {} : { frontDoor: { state: { path: paths.frontdoorStateFile, raw: realFsPort.readFileUtf8(paths.frontdoorStateFile) }, supervisors: listFrontDoorSupervisors(realRunPort, uid), liveSessions: listFrontDoorSessions(realFarmFs, paths.frontdoorSessionsDir).filter((session) => realIsProcessRunning(session.pid)), listeners: servingDoorListeners(paths) } }
|
|
14748
14831
|
});
|
|
14749
14832
|
return report;
|
|
14750
14833
|
}
|
|
@@ -17735,8 +17818,8 @@ var SELF_HOST_SUBSCRIPTION_TYPE = "max";
|
|
|
17735
17818
|
function isRecord12(value) {
|
|
17736
17819
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
17737
17820
|
}
|
|
17738
|
-
function readJsonObject(
|
|
17739
|
-
const raw =
|
|
17821
|
+
function readJsonObject(fs13, file) {
|
|
17822
|
+
const raw = fs13.readFileUtf8(file);
|
|
17740
17823
|
if (raw === void 0) {
|
|
17741
17824
|
return void 0;
|
|
17742
17825
|
}
|
|
@@ -17748,8 +17831,8 @@ function readJsonObject(fs12, file) {
|
|
|
17748
17831
|
}
|
|
17749
17832
|
return isRecord12(parsed) ? parsed : void 0;
|
|
17750
17833
|
}
|
|
17751
|
-
function readRcSelfHostRecord(
|
|
17752
|
-
const parsed = readJsonObject(
|
|
17834
|
+
function readRcSelfHostRecord(fs13, frontdoorDir) {
|
|
17835
|
+
const parsed = readJsonObject(fs13, import_node_path33.default.join(frontdoorDir, RC_SELF_HOST_RECORD_DIR, RC_SELF_HOST_RECORD_FILE));
|
|
17753
17836
|
if (parsed === void 0) {
|
|
17754
17837
|
return void 0;
|
|
17755
17838
|
}
|
|
@@ -17849,17 +17932,17 @@ function parseEntry2(project, entry) {
|
|
|
17849
17932
|
const base = match?.[1];
|
|
17850
17933
|
return base === void 0 ? { project, sessionId: entry, superseded: false, entry } : { project, sessionId: base, superseded: true, entry };
|
|
17851
17934
|
}
|
|
17852
|
-
function listSessions2(
|
|
17935
|
+
function listSessions2(fs13, configDir) {
|
|
17853
17936
|
const found = [];
|
|
17854
|
-
for (const project of
|
|
17937
|
+
for (const project of fs13.readdir(import_node_path34.default.join(configDir, PROJECTS_DIR))) {
|
|
17855
17938
|
const projectDir = import_node_path34.default.join(configDir, PROJECTS_DIR, project);
|
|
17856
17939
|
const entries = /* @__PURE__ */ new Set();
|
|
17857
|
-
for (const name of
|
|
17940
|
+
for (const name of fs13.readdir(projectDir)) {
|
|
17858
17941
|
if (name.endsWith(TRANSCRIPT_SUFFIX)) {
|
|
17859
17942
|
entries.add(name.slice(0, -TRANSCRIPT_SUFFIX.length));
|
|
17860
17943
|
continue;
|
|
17861
17944
|
}
|
|
17862
|
-
const children =
|
|
17945
|
+
const children = fs13.readdir(import_node_path34.default.join(projectDir, name));
|
|
17863
17946
|
if (children.includes(SUBAGENTS_DIR) || children.includes(WORKFLOWS_DIR)) {
|
|
17864
17947
|
entries.add(name);
|
|
17865
17948
|
}
|
|
@@ -17870,9 +17953,9 @@ function listSessions2(fs12, configDir) {
|
|
|
17870
17953
|
}
|
|
17871
17954
|
return found.sort((left, right) => left.project.localeCompare(right.project) || left.entry.localeCompare(right.entry));
|
|
17872
17955
|
}
|
|
17873
|
-
function locateAgents(
|
|
17956
|
+
function locateAgents(fs13, configDir, relativeDir, workflowRunId, report) {
|
|
17874
17957
|
const located = [];
|
|
17875
|
-
for (const name of listDirOrReport(
|
|
17958
|
+
for (const name of listDirOrReport(fs13, configDir, relativeDir, report)) {
|
|
17876
17959
|
if (!name.startsWith(AGENT_FILE_PREFIX) || !name.endsWith(META_SUFFIX)) {
|
|
17877
17960
|
continue;
|
|
17878
17961
|
}
|
|
@@ -17921,17 +18004,17 @@ function toNode(read, children) {
|
|
|
17921
18004
|
function describeFailure(error) {
|
|
17922
18005
|
return error instanceof Error ? error.message : String(error);
|
|
17923
18006
|
}
|
|
17924
|
-
function readFileOrReport(
|
|
18007
|
+
function readFileOrReport(fs13, configDir, relative, report) {
|
|
17925
18008
|
try {
|
|
17926
|
-
return
|
|
18009
|
+
return fs13.readFileUtf8(import_node_path34.default.join(configDir, relative));
|
|
17927
18010
|
} catch (error) {
|
|
17928
18011
|
report({ path: relative, reason: `could not be read: ${describeFailure(error)}` });
|
|
17929
18012
|
return void 0;
|
|
17930
18013
|
}
|
|
17931
18014
|
}
|
|
17932
|
-
function listDirOrReport(
|
|
18015
|
+
function listDirOrReport(fs13, configDir, relative, report) {
|
|
17933
18016
|
try {
|
|
17934
|
-
return
|
|
18017
|
+
return fs13.readdir(import_node_path34.default.join(configDir, relative));
|
|
17935
18018
|
} catch (error) {
|
|
17936
18019
|
report({ path: relative, reason: `could not be listed: ${describeFailure(error)}` });
|
|
17937
18020
|
return [];
|
|
@@ -17954,22 +18037,22 @@ var WorkflowRunFileSchema = import_zod28.z.object({
|
|
|
17954
18037
|
phases: import_zod28.z.array(import_zod28.z.object({ title: import_zod28.z.string() })).default([]),
|
|
17955
18038
|
summary: import_zod28.z.string().optional()
|
|
17956
18039
|
});
|
|
17957
|
-
function summariseSession(
|
|
18040
|
+
function summariseSession(fs13, configDir, ref) {
|
|
17958
18041
|
const sessionRelative = import_node_path34.default.join(PROJECTS_DIR, ref.project, ref.entry);
|
|
17959
18042
|
const subagentsRelative = import_node_path34.default.join(sessionRelative, SUBAGENTS_DIR);
|
|
17960
18043
|
const workflowsUnderSubagents = import_node_path34.default.join(subagentsRelative, WORKFLOWS_DIR);
|
|
17961
18044
|
const isMeta = (name) => name.startsWith(AGENT_FILE_PREFIX) && name.endsWith(META_SUFFIX);
|
|
17962
|
-
let agentCount =
|
|
17963
|
-
for (const runDir of
|
|
18045
|
+
let agentCount = fs13.readdir(import_node_path34.default.join(configDir, subagentsRelative)).filter(isMeta).length;
|
|
18046
|
+
for (const runDir of fs13.readdir(import_node_path34.default.join(configDir, workflowsUnderSubagents))) {
|
|
17964
18047
|
if (runDir.startsWith(WORKFLOW_RUN_PREFIX)) {
|
|
17965
|
-
agentCount +=
|
|
18048
|
+
agentCount += fs13.readdir(import_node_path34.default.join(configDir, workflowsUnderSubagents, runDir)).filter(isMeta).length;
|
|
17966
18049
|
}
|
|
17967
18050
|
}
|
|
17968
|
-
const workflowRunCount =
|
|
17969
|
-
const transcript =
|
|
18051
|
+
const workflowRunCount = fs13.readdir(import_node_path34.default.join(configDir, sessionRelative, WORKFLOWS_DIR)).filter((name) => name.startsWith(WORKFLOW_RUN_PREFIX) && name.endsWith(JSON_SUFFIX)).length;
|
|
18052
|
+
const transcript = fs13.lstat(import_node_path34.default.join(configDir, PROJECTS_DIR, ref.project, `${ref.entry}${TRANSCRIPT_SUFFIX}`));
|
|
17970
18053
|
return { ...ref, agentCount, workflowRunCount, ...transcript === void 0 ? {} : { updatedAt: new Date(transcript.mtimeMs).toISOString() } };
|
|
17971
18054
|
}
|
|
17972
|
-
function readSessionAgentTree(
|
|
18055
|
+
function readSessionAgentTree(fs13, configDir, ref, options = {}) {
|
|
17973
18056
|
const problems = [];
|
|
17974
18057
|
const report = (problem) => {
|
|
17975
18058
|
problems.push(problem);
|
|
@@ -17977,15 +18060,15 @@ function readSessionAgentTree(fs12, configDir, ref, options = {}) {
|
|
|
17977
18060
|
const sessionRelative = import_node_path34.default.join(PROJECTS_DIR, ref.project, ref.entry);
|
|
17978
18061
|
const subagentsRelative = import_node_path34.default.join(sessionRelative, SUBAGENTS_DIR);
|
|
17979
18062
|
const workflowsUnderSubagents = import_node_path34.default.join(subagentsRelative, WORKFLOWS_DIR);
|
|
17980
|
-
const located = locateAgents(
|
|
17981
|
-
for (const runDir of listDirOrReport(
|
|
18063
|
+
const located = locateAgents(fs13, configDir, subagentsRelative, void 0, report);
|
|
18064
|
+
for (const runDir of listDirOrReport(fs13, configDir, workflowsUnderSubagents, report)) {
|
|
17982
18065
|
if (runDir.startsWith(WORKFLOW_RUN_PREFIX)) {
|
|
17983
|
-
located.push(...locateAgents(
|
|
18066
|
+
located.push(...locateAgents(fs13, configDir, import_node_path34.default.join(workflowsUnderSubagents, runDir), runDir, report));
|
|
17984
18067
|
}
|
|
17985
18068
|
}
|
|
17986
18069
|
const agents = /* @__PURE__ */ new Map();
|
|
17987
18070
|
for (const candidate of located) {
|
|
17988
|
-
const text = readFileOrReport(
|
|
18071
|
+
const text = readFileOrReport(fs13, configDir, candidate.metaPath, report);
|
|
17989
18072
|
if (text === void 0) {
|
|
17990
18073
|
continue;
|
|
17991
18074
|
}
|
|
@@ -17997,7 +18080,7 @@ function readSessionAgentTree(fs12, configDir, ref, options = {}) {
|
|
|
17997
18080
|
agents.set(candidate.id, { located: candidate, meta: parsed.data });
|
|
17998
18081
|
}
|
|
17999
18082
|
const teamNames = [...new Set([...agents.values()].flatMap((agent) => agent.meta.teamName === void 0 ? [] : [agent.meta.teamName]))].sort();
|
|
18000
|
-
const parentOf3 = resolveParents(
|
|
18083
|
+
const parentOf3 = resolveParents(fs13, configDir, agents, report);
|
|
18001
18084
|
const childrenOf = /* @__PURE__ */ new Map();
|
|
18002
18085
|
const roots = [];
|
|
18003
18086
|
for (const id of agents.keys()) {
|
|
@@ -18020,12 +18103,12 @@ function readSessionAgentTree(fs12, configDir, ref, options = {}) {
|
|
|
18020
18103
|
sessionId: ref.sessionId,
|
|
18021
18104
|
superseded: ref.superseded,
|
|
18022
18105
|
agents: roots.sort().map(build),
|
|
18023
|
-
tasks: readTasks(
|
|
18024
|
-
workflowRuns: readWorkflowRuns(
|
|
18106
|
+
tasks: readTasks(fs13, configDir, ownTaskLists(ref.sessionId), [.../* @__PURE__ */ new Set([...teamNames, ...options.taskListIds ?? []])].filter((id) => !ownTaskLists(ref.sessionId).includes(id)), report),
|
|
18107
|
+
workflowRuns: readWorkflowRuns(fs13, configDir, import_node_path34.default.join(sessionRelative, WORKFLOWS_DIR), report),
|
|
18025
18108
|
problems
|
|
18026
18109
|
};
|
|
18027
18110
|
}
|
|
18028
|
-
function resolveParents(
|
|
18111
|
+
function resolveParents(fs13, configDir, agents, report) {
|
|
18029
18112
|
const parentOf3 = /* @__PURE__ */ new Map();
|
|
18030
18113
|
const transcriptCache = /* @__PURE__ */ new Map();
|
|
18031
18114
|
const transcriptOf = (agent) => {
|
|
@@ -18033,7 +18116,7 @@ function resolveParents(fs12, configDir, agents, report) {
|
|
|
18033
18116
|
if (cached !== void 0) {
|
|
18034
18117
|
return cached;
|
|
18035
18118
|
}
|
|
18036
|
-
const text = readFileOrReport(
|
|
18119
|
+
const text = readFileOrReport(fs13, configDir, agent.located.transcriptPath, report) ?? "";
|
|
18037
18120
|
transcriptCache.set(agent.located.id, text);
|
|
18038
18121
|
return text;
|
|
18039
18122
|
};
|
|
@@ -18083,16 +18166,16 @@ function resolveParents(fs12, configDir, agents, report) {
|
|
|
18083
18166
|
function ownTaskLists(sessionId) {
|
|
18084
18167
|
return [sessionId, `${SHORT_SESSION_LIST_PREFIX}${sessionId.slice(0, SHORT_SESSION_ID_LENGTH)}`];
|
|
18085
18168
|
}
|
|
18086
|
-
function readTasks(
|
|
18169
|
+
function readTasks(fs13, configDir, ownLists, sharedLists, report) {
|
|
18087
18170
|
const tasks = [];
|
|
18088
18171
|
[...ownLists, ...sharedLists].forEach((scope, index) => {
|
|
18089
18172
|
const relativeDir = import_node_path34.default.join(TASKS_DIR, scope);
|
|
18090
|
-
for (const name of [...listDirOrReport(
|
|
18173
|
+
for (const name of [...listDirOrReport(fs13, configDir, relativeDir, report)].sort()) {
|
|
18091
18174
|
if (name.startsWith(".") || !name.endsWith(JSON_SUFFIX)) {
|
|
18092
18175
|
continue;
|
|
18093
18176
|
}
|
|
18094
18177
|
const relative = import_node_path34.default.join(relativeDir, name);
|
|
18095
|
-
const text = readFileOrReport(
|
|
18178
|
+
const text = readFileOrReport(fs13, configDir, relative, report);
|
|
18096
18179
|
const parsed = TaskFileSchema.safeParse(text === void 0 ? void 0 : parseJson2(text));
|
|
18097
18180
|
if (parsed.success) {
|
|
18098
18181
|
tasks.push(index < ownLists.length ? parsed.data : { ...parsed.data, taskList: scope });
|
|
@@ -18103,14 +18186,14 @@ function readTasks(fs12, configDir, ownLists, sharedLists, report) {
|
|
|
18103
18186
|
});
|
|
18104
18187
|
return tasks;
|
|
18105
18188
|
}
|
|
18106
|
-
function readWorkflowRuns(
|
|
18189
|
+
function readWorkflowRuns(fs13, configDir, relativeDir, report) {
|
|
18107
18190
|
const runs = [];
|
|
18108
|
-
for (const name of [...listDirOrReport(
|
|
18191
|
+
for (const name of [...listDirOrReport(fs13, configDir, relativeDir, report)].sort()) {
|
|
18109
18192
|
if (!name.startsWith(WORKFLOW_RUN_PREFIX) || !name.endsWith(JSON_SUFFIX)) {
|
|
18110
18193
|
continue;
|
|
18111
18194
|
}
|
|
18112
18195
|
const relative = import_node_path34.default.join(relativeDir, name);
|
|
18113
|
-
const text = readFileOrReport(
|
|
18196
|
+
const text = readFileOrReport(fs13, configDir, relative, report);
|
|
18114
18197
|
const parsed = WorkflowRunFileSchema.safeParse(text === void 0 ? void 0 : parseJson2(text));
|
|
18115
18198
|
if (!parsed.success) {
|
|
18116
18199
|
if (text !== void 0) {
|
|
@@ -18136,11 +18219,11 @@ var SessionLookupError = class extends CliError {
|
|
|
18136
18219
|
function identityConfigDir(identitiesDir, identity) {
|
|
18137
18220
|
return import_node_path35.default.join(identitiesDir, identity);
|
|
18138
18221
|
}
|
|
18139
|
-
function historyStores(
|
|
18222
|
+
function historyStores(fs13, identitiesDir, identities) {
|
|
18140
18223
|
const byRealPath = /* @__PURE__ */ new Map();
|
|
18141
18224
|
for (const identity of identities) {
|
|
18142
18225
|
const configDir = identityConfigDir(identitiesDir, identity);
|
|
18143
|
-
const real =
|
|
18226
|
+
const real = fs13.realpath(import_node_path35.default.join(configDir, "projects"));
|
|
18144
18227
|
if (real === void 0) {
|
|
18145
18228
|
continue;
|
|
18146
18229
|
}
|
|
@@ -18153,15 +18236,15 @@ function historyStores(fs12, identitiesDir, identities) {
|
|
|
18153
18236
|
}
|
|
18154
18237
|
return [...byRealPath.values()];
|
|
18155
18238
|
}
|
|
18156
|
-
function collectSessionList(
|
|
18239
|
+
function collectSessionList(fs13, identitiesDir, identities, filters) {
|
|
18157
18240
|
const names = filters.identity === void 0 ? identities : identities.filter((name) => name === filters.identity);
|
|
18158
18241
|
if (filters.identity !== void 0 && names.length === 0) {
|
|
18159
18242
|
throw new SessionLookupError(`no identity named "${filters.identity}"`);
|
|
18160
18243
|
}
|
|
18161
18244
|
const sessions = [];
|
|
18162
|
-
for (const store of historyStores(
|
|
18163
|
-
for (const ref of listSessions2(
|
|
18164
|
-
const summary = summariseSession(
|
|
18245
|
+
for (const store of historyStores(fs13, identitiesDir, names)) {
|
|
18246
|
+
for (const ref of listSessions2(fs13, store.configDir)) {
|
|
18247
|
+
const summary = summariseSession(fs13, store.configDir, ref);
|
|
18165
18248
|
if (filters.all === true || summary.agentCount > 0 || summary.workflowRunCount > 0) {
|
|
18166
18249
|
sessions.push({ ...summary, identities: store.identities });
|
|
18167
18250
|
}
|
|
@@ -18169,14 +18252,14 @@ function collectSessionList(fs12, identitiesDir, identities, filters) {
|
|
|
18169
18252
|
}
|
|
18170
18253
|
return sessions.sort((left, right) => (right.updatedAt ?? "").localeCompare(left.updatedAt ?? "") || left.sessionId.localeCompare(right.sessionId));
|
|
18171
18254
|
}
|
|
18172
|
-
function locateSession(
|
|
18255
|
+
function locateSession(fs13, identitiesDir, identities, query, onlyIdentity) {
|
|
18173
18256
|
const names = onlyIdentity === void 0 ? identities : identities.filter((name) => name === onlyIdentity);
|
|
18174
18257
|
if (onlyIdentity !== void 0 && names.length === 0) {
|
|
18175
18258
|
throw new SessionLookupError(`no identity named "${onlyIdentity}"`);
|
|
18176
18259
|
}
|
|
18177
18260
|
const matches = [];
|
|
18178
|
-
for (const store of historyStores(
|
|
18179
|
-
for (const ref of listSessions2(
|
|
18261
|
+
for (const store of historyStores(fs13, identitiesDir, names)) {
|
|
18262
|
+
for (const ref of listSessions2(fs13, store.configDir)) {
|
|
18180
18263
|
if (ref.sessionId.startsWith(query)) {
|
|
18181
18264
|
matches.push({ identities: store.identities, configDir: store.configDir, ref });
|
|
18182
18265
|
}
|
|
@@ -18193,19 +18276,19 @@ function locateSession(fs12, identitiesDir, identities, query, onlyIdentity) {
|
|
|
18193
18276
|
}
|
|
18194
18277
|
throw new SessionLookupError(`"${query}" matches ${String(candidates.length)} sessions: ${candidates.map((match) => `${match.ref.sessionId} (${match.identities.join(", ")})`).join("; ")}; give more of the id or pass --identity`);
|
|
18195
18278
|
}
|
|
18196
|
-
function showSession(
|
|
18197
|
-
const located = locateSession(
|
|
18198
|
-
return { identities: located.identities, tree: readSessionAgentTree(
|
|
18279
|
+
function showSession(fs13, identitiesDir, identities, query, onlyIdentity) {
|
|
18280
|
+
const located = locateSession(fs13, identitiesDir, identities, query, onlyIdentity);
|
|
18281
|
+
return { identities: located.identities, tree: readSessionAgentTree(fs13, located.configDir, located.ref) };
|
|
18199
18282
|
}
|
|
18200
18283
|
|
|
18201
18284
|
// src/agents/realFs.ts
|
|
18202
|
-
var
|
|
18285
|
+
var import_node_fs11 = __toESM(require("node:fs"), 1);
|
|
18203
18286
|
init_realPorts();
|
|
18204
18287
|
var realSessionFs = {
|
|
18205
18288
|
...realFarmFs,
|
|
18206
18289
|
realpath: (candidate) => {
|
|
18207
18290
|
try {
|
|
18208
|
-
return
|
|
18291
|
+
return import_node_fs11.default.realpathSync(candidate);
|
|
18209
18292
|
} catch {
|
|
18210
18293
|
return void 0;
|
|
18211
18294
|
}
|