claude-use 11.5.0 → 11.5.2
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/dist/cli.cjs +36 -6
- package/dist/index.cjs +36 -6
- package/dist/index.mjs +36 -6
- package/dist/types/index.d.ts +8 -6
- package/package.json +1 -1
package/dist/cli.cjs
CHANGED
|
@@ -33976,7 +33976,7 @@ var init_package = __esm({
|
|
|
33976
33976
|
"package.json"() {
|
|
33977
33977
|
package_default = {
|
|
33978
33978
|
name: "claude-use",
|
|
33979
|
-
version: "11.5.
|
|
33979
|
+
version: "11.5.2",
|
|
33980
33980
|
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.",
|
|
33981
33981
|
license: "MIT",
|
|
33982
33982
|
author: "Joseph Mearman <joseph@mearman.co.uk>",
|
|
@@ -61807,6 +61807,10 @@ function ensureFrontDoor(params) {
|
|
|
61807
61807
|
let replaced = false;
|
|
61808
61808
|
const distrusted = /* @__PURE__ */ new Set();
|
|
61809
61809
|
let lastRejection;
|
|
61810
|
+
let busyDoor;
|
|
61811
|
+
const liveSessionsOn = (doorPid) => listFrontDoorSessions(ports.fs, paths.frontdoorSessionsDir).filter(
|
|
61812
|
+
(session) => session.pid !== params.launcherPid && ports.isRunning(session.pid) && (session.supervisorPid === void 0 || session.supervisorPid === doorPid)
|
|
61813
|
+
).length;
|
|
61810
61814
|
const verifyWithRetry = (port) => {
|
|
61811
61815
|
let verdict = ports.verifyListener(port);
|
|
61812
61816
|
for (let attempt = 1; !verdict.ok && attempt < FRONTDOOR_PROBE_ATTEMPTS; attempt += 1) {
|
|
@@ -61817,7 +61821,13 @@ function ensureFrontDoor(params) {
|
|
|
61817
61821
|
};
|
|
61818
61822
|
const stopAndAwaitExit = (supervisorPid, failure2) => {
|
|
61819
61823
|
ports.stopSupervisor(supervisorPid);
|
|
61824
|
+
const graceEnds = ports.now() + FRONTDOOR_EXIT_GRACE_MS;
|
|
61825
|
+
let killed = false;
|
|
61820
61826
|
while (ports.isRunning(supervisorPid)) {
|
|
61827
|
+
if (!killed && ports.now() >= graceEnds) {
|
|
61828
|
+
ports.killSupervisor(supervisorPid);
|
|
61829
|
+
killed = true;
|
|
61830
|
+
}
|
|
61821
61831
|
if (ports.now() >= deadline) {
|
|
61822
61832
|
throw new FrontDoorStartError(`${failure2}. Daemon log: ${paths.frontdoorLogPath}`);
|
|
61823
61833
|
}
|
|
@@ -61829,6 +61839,11 @@ function ensureFrontDoor(params) {
|
|
|
61829
61839
|
const supervisorPid = state?.supervisorPid;
|
|
61830
61840
|
if (supervisorPid !== void 0 && !distrusted.has(supervisorPid) && ports.isRunning(supervisorPid)) {
|
|
61831
61841
|
if (state?.port !== void 0 && state.connectPort !== void 0) {
|
|
61842
|
+
if (supervisorPid === params.launcherPid && params.replace !== true && ports.isFrontDoorSupervisor(supervisorPid)) {
|
|
61843
|
+
const token = (0, import_node_crypto10.randomUUID)();
|
|
61844
|
+
writeFrontDoorSession(ports.fs, paths.frontdoorSessionsDir, { pid: params.launcherPid, startedAt: ports.now(), token, supervisorPid });
|
|
61845
|
+
return { port: state.port, connectPort: state.connectPort, token };
|
|
61846
|
+
}
|
|
61832
61847
|
const verdict = verifyWithRetry(state.port);
|
|
61833
61848
|
if (verdict.ok && !replaced && !spawned && (params.replace === true || (state.protocol ?? 0) < FRONT_DOOR_PROTOCOL)) {
|
|
61834
61849
|
stopAndAwaitExit(
|
|
@@ -61848,11 +61863,22 @@ function ensureFrontDoor(params) {
|
|
|
61848
61863
|
throw new FrontDoorStartError(`${lastRejection}; refusing to send this session's credentials to it. Daemon log: ${paths.frontdoorLogPath}`);
|
|
61849
61864
|
}
|
|
61850
61865
|
if (ports.isFrontDoorSupervisor(supervisorPid)) {
|
|
61851
|
-
|
|
61866
|
+
const stranded = liveSessionsOn(supervisorPid);
|
|
61867
|
+
if (params.replace === true && !replaced) {
|
|
61868
|
+
stopAndAwaitExit(supervisorPid, `the front door (pid ${String(supervisorPid)}) stopped answering and did not exit when asked to`);
|
|
61869
|
+
replaced = true;
|
|
61870
|
+
continue;
|
|
61871
|
+
}
|
|
61872
|
+
if (stranded > 0) {
|
|
61873
|
+
busyDoor = { pid: supervisorPid, sessions: stranded };
|
|
61874
|
+
} else {
|
|
61875
|
+
stopAndAwaitExit(supervisorPid, `the front door (pid ${String(supervisorPid)}) stopped answering and did not exit when asked to`);
|
|
61876
|
+
continue;
|
|
61877
|
+
}
|
|
61878
|
+
} else {
|
|
61879
|
+
distrusted.add(supervisorPid);
|
|
61852
61880
|
continue;
|
|
61853
61881
|
}
|
|
61854
|
-
distrusted.add(supervisorPid);
|
|
61855
|
-
continue;
|
|
61856
61882
|
}
|
|
61857
61883
|
if (state?.lastError !== void 0) {
|
|
61858
61884
|
throw new FrontDoorStartError(`the front door reported a fatal error and is not serving: ${state.lastError} (daemon log: ${paths.frontdoorLogPath})`);
|
|
@@ -61875,7 +61901,7 @@ function ensureFrontDoor(params) {
|
|
|
61875
61901
|
if (ports.now() >= deadline) {
|
|
61876
61902
|
const lastError = state?.lastError;
|
|
61877
61903
|
throw new FrontDoorStartError(
|
|
61878
|
-
`the front door did not become ready within ${String(FRONTDOOR_START_TIMEOUT_MS)}ms` + (lastError === void 0 ? "" : ` (last error: ${lastError})`) + (lastRejection === void 0 ? "" : ` (${lastRejection})`) + `. Daemon log: ${paths.frontdoorLogPath}`
|
|
61904
|
+
`the front door did not become ready within ${String(FRONTDOOR_START_TIMEOUT_MS)}ms` + (lastError === void 0 ? "" : ` (last error: ${lastError})`) + (lastRejection === void 0 ? "" : ` (${lastRejection})`) + (busyDoor === void 0 ? "" : `. It was not replaced because ${String(busyDoor.sessions)} live session(s) are using it and would lose their connections; run \`agent-shim frontdoor restart\` to replace it deliberately`) + `. Daemon log: ${paths.frontdoorLogPath}`
|
|
61879
61905
|
);
|
|
61880
61906
|
}
|
|
61881
61907
|
ports.sleep(FRONTDOOR_LAUNCHER_POLL_MS);
|
|
@@ -61898,7 +61924,7 @@ function restartFrontDoor(params) {
|
|
|
61898
61924
|
}
|
|
61899
61925
|
return { action: "restarted", previousPid, pid };
|
|
61900
61926
|
}
|
|
61901
|
-
var import_node_crypto10, FRONTDOOR_START_TIMEOUT_MS, FRONTDOOR_LAUNCHER_POLL_MS, FRONTDOOR_PROBE_ATTEMPTS, FrontDoorStartError;
|
|
61927
|
+
var import_node_crypto10, FRONTDOOR_START_TIMEOUT_MS, FRONTDOOR_LAUNCHER_POLL_MS, FRONTDOOR_PROBE_ATTEMPTS, FRONTDOOR_EXIT_GRACE_MS, FrontDoorStartError;
|
|
61902
61928
|
var init_ensure2 = __esm({
|
|
61903
61929
|
"src/frontdoor/ensure.ts"() {
|
|
61904
61930
|
"use strict";
|
|
@@ -61909,6 +61935,7 @@ var init_ensure2 = __esm({
|
|
|
61909
61935
|
FRONTDOOR_START_TIMEOUT_MS = 3e4;
|
|
61910
61936
|
FRONTDOOR_LAUNCHER_POLL_MS = 100;
|
|
61911
61937
|
FRONTDOOR_PROBE_ATTEMPTS = 3;
|
|
61938
|
+
FRONTDOOR_EXIT_GRACE_MS = 5e3;
|
|
61912
61939
|
FrontDoorStartError = class extends CliError {
|
|
61913
61940
|
constructor(message) {
|
|
61914
61941
|
super(message);
|
|
@@ -62038,6 +62065,9 @@ function realEnsurePorts(paths, spawnDaemon) {
|
|
|
62038
62065
|
stopSupervisor: (pid) => {
|
|
62039
62066
|
process.kill(pid, "SIGTERM");
|
|
62040
62067
|
},
|
|
62068
|
+
killSupervisor: (pid) => {
|
|
62069
|
+
process.kill(pid, "SIGKILL");
|
|
62070
|
+
},
|
|
62041
62071
|
// 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.
|
|
62042
62072
|
verifyListener: (port) => probeFrontDoorSync(port, import_node_fs13.default.readFileSync(paths.frontdoorCaCertFile, "utf8"))
|
|
62043
62073
|
};
|
package/dist/index.cjs
CHANGED
|
@@ -2758,7 +2758,7 @@ var init_package = __esm({
|
|
|
2758
2758
|
"package.json"() {
|
|
2759
2759
|
package_default = {
|
|
2760
2760
|
name: "claude-use",
|
|
2761
|
-
version: "11.5.
|
|
2761
|
+
version: "11.5.2",
|
|
2762
2762
|
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.",
|
|
2763
2763
|
license: "MIT",
|
|
2764
2764
|
author: "Joseph Mearman <joseph@mearman.co.uk>",
|
|
@@ -6758,6 +6758,10 @@ function ensureFrontDoor(params) {
|
|
|
6758
6758
|
let replaced = false;
|
|
6759
6759
|
const distrusted = /* @__PURE__ */ new Set();
|
|
6760
6760
|
let lastRejection;
|
|
6761
|
+
let busyDoor;
|
|
6762
|
+
const liveSessionsOn = (doorPid) => listFrontDoorSessions(ports.fs, paths.frontdoorSessionsDir).filter(
|
|
6763
|
+
(session) => session.pid !== params.launcherPid && ports.isRunning(session.pid) && (session.supervisorPid === void 0 || session.supervisorPid === doorPid)
|
|
6764
|
+
).length;
|
|
6761
6765
|
const verifyWithRetry = (port) => {
|
|
6762
6766
|
let verdict = ports.verifyListener(port);
|
|
6763
6767
|
for (let attempt = 1; !verdict.ok && attempt < FRONTDOOR_PROBE_ATTEMPTS; attempt += 1) {
|
|
@@ -6768,7 +6772,13 @@ function ensureFrontDoor(params) {
|
|
|
6768
6772
|
};
|
|
6769
6773
|
const stopAndAwaitExit = (supervisorPid, failure) => {
|
|
6770
6774
|
ports.stopSupervisor(supervisorPid);
|
|
6775
|
+
const graceEnds = ports.now() + FRONTDOOR_EXIT_GRACE_MS;
|
|
6776
|
+
let killed = false;
|
|
6771
6777
|
while (ports.isRunning(supervisorPid)) {
|
|
6778
|
+
if (!killed && ports.now() >= graceEnds) {
|
|
6779
|
+
ports.killSupervisor(supervisorPid);
|
|
6780
|
+
killed = true;
|
|
6781
|
+
}
|
|
6772
6782
|
if (ports.now() >= deadline) {
|
|
6773
6783
|
throw new FrontDoorStartError(`${failure}. Daemon log: ${paths.frontdoorLogPath}`);
|
|
6774
6784
|
}
|
|
@@ -6780,6 +6790,11 @@ function ensureFrontDoor(params) {
|
|
|
6780
6790
|
const supervisorPid = state?.supervisorPid;
|
|
6781
6791
|
if (supervisorPid !== void 0 && !distrusted.has(supervisorPid) && ports.isRunning(supervisorPid)) {
|
|
6782
6792
|
if (state?.port !== void 0 && state.connectPort !== void 0) {
|
|
6793
|
+
if (supervisorPid === params.launcherPid && params.replace !== true && ports.isFrontDoorSupervisor(supervisorPid)) {
|
|
6794
|
+
const token = (0, import_node_crypto9.randomUUID)();
|
|
6795
|
+
writeFrontDoorSession(ports.fs, paths.frontdoorSessionsDir, { pid: params.launcherPid, startedAt: ports.now(), token, supervisorPid });
|
|
6796
|
+
return { port: state.port, connectPort: state.connectPort, token };
|
|
6797
|
+
}
|
|
6783
6798
|
const verdict = verifyWithRetry(state.port);
|
|
6784
6799
|
if (verdict.ok && !replaced && !spawned && (params.replace === true || (state.protocol ?? 0) < FRONT_DOOR_PROTOCOL)) {
|
|
6785
6800
|
stopAndAwaitExit(
|
|
@@ -6799,11 +6814,22 @@ function ensureFrontDoor(params) {
|
|
|
6799
6814
|
throw new FrontDoorStartError(`${lastRejection}; refusing to send this session's credentials to it. Daemon log: ${paths.frontdoorLogPath}`);
|
|
6800
6815
|
}
|
|
6801
6816
|
if (ports.isFrontDoorSupervisor(supervisorPid)) {
|
|
6802
|
-
|
|
6817
|
+
const stranded = liveSessionsOn(supervisorPid);
|
|
6818
|
+
if (params.replace === true && !replaced) {
|
|
6819
|
+
stopAndAwaitExit(supervisorPid, `the front door (pid ${String(supervisorPid)}) stopped answering and did not exit when asked to`);
|
|
6820
|
+
replaced = true;
|
|
6821
|
+
continue;
|
|
6822
|
+
}
|
|
6823
|
+
if (stranded > 0) {
|
|
6824
|
+
busyDoor = { pid: supervisorPid, sessions: stranded };
|
|
6825
|
+
} else {
|
|
6826
|
+
stopAndAwaitExit(supervisorPid, `the front door (pid ${String(supervisorPid)}) stopped answering and did not exit when asked to`);
|
|
6827
|
+
continue;
|
|
6828
|
+
}
|
|
6829
|
+
} else {
|
|
6830
|
+
distrusted.add(supervisorPid);
|
|
6803
6831
|
continue;
|
|
6804
6832
|
}
|
|
6805
|
-
distrusted.add(supervisorPid);
|
|
6806
|
-
continue;
|
|
6807
6833
|
}
|
|
6808
6834
|
if (state?.lastError !== void 0) {
|
|
6809
6835
|
throw new FrontDoorStartError(`the front door reported a fatal error and is not serving: ${state.lastError} (daemon log: ${paths.frontdoorLogPath})`);
|
|
@@ -6826,13 +6852,13 @@ function ensureFrontDoor(params) {
|
|
|
6826
6852
|
if (ports.now() >= deadline) {
|
|
6827
6853
|
const lastError = state?.lastError;
|
|
6828
6854
|
throw new FrontDoorStartError(
|
|
6829
|
-
`the front door did not become ready within ${String(FRONTDOOR_START_TIMEOUT_MS)}ms` + (lastError === void 0 ? "" : ` (last error: ${lastError})`) + (lastRejection === void 0 ? "" : ` (${lastRejection})`) + `. Daemon log: ${paths.frontdoorLogPath}`
|
|
6855
|
+
`the front door did not become ready within ${String(FRONTDOOR_START_TIMEOUT_MS)}ms` + (lastError === void 0 ? "" : ` (last error: ${lastError})`) + (lastRejection === void 0 ? "" : ` (${lastRejection})`) + (busyDoor === void 0 ? "" : `. It was not replaced because ${String(busyDoor.sessions)} live session(s) are using it and would lose their connections; run \`agent-shim frontdoor restart\` to replace it deliberately`) + `. Daemon log: ${paths.frontdoorLogPath}`
|
|
6830
6856
|
);
|
|
6831
6857
|
}
|
|
6832
6858
|
ports.sleep(FRONTDOOR_LAUNCHER_POLL_MS);
|
|
6833
6859
|
}
|
|
6834
6860
|
}
|
|
6835
|
-
var import_node_crypto9, FRONTDOOR_START_TIMEOUT_MS, FRONTDOOR_LAUNCHER_POLL_MS, FRONTDOOR_PROBE_ATTEMPTS, FrontDoorStartError;
|
|
6861
|
+
var import_node_crypto9, FRONTDOOR_START_TIMEOUT_MS, FRONTDOOR_LAUNCHER_POLL_MS, FRONTDOOR_PROBE_ATTEMPTS, FRONTDOOR_EXIT_GRACE_MS, FrontDoorStartError;
|
|
6836
6862
|
var init_ensure2 = __esm({
|
|
6837
6863
|
"src/frontdoor/ensure.ts"() {
|
|
6838
6864
|
"use strict";
|
|
@@ -6843,6 +6869,7 @@ var init_ensure2 = __esm({
|
|
|
6843
6869
|
FRONTDOOR_START_TIMEOUT_MS = 3e4;
|
|
6844
6870
|
FRONTDOOR_LAUNCHER_POLL_MS = 100;
|
|
6845
6871
|
FRONTDOOR_PROBE_ATTEMPTS = 3;
|
|
6872
|
+
FRONTDOOR_EXIT_GRACE_MS = 5e3;
|
|
6846
6873
|
FrontDoorStartError = class extends CliError {
|
|
6847
6874
|
constructor(message) {
|
|
6848
6875
|
super(message);
|
|
@@ -8130,6 +8157,9 @@ function realEnsurePorts(paths, spawnDaemon) {
|
|
|
8130
8157
|
stopSupervisor: (pid) => {
|
|
8131
8158
|
process.kill(pid, "SIGTERM");
|
|
8132
8159
|
},
|
|
8160
|
+
killSupervisor: (pid) => {
|
|
8161
|
+
process.kill(pid, "SIGKILL");
|
|
8162
|
+
},
|
|
8133
8163
|
// 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.
|
|
8134
8164
|
verifyListener: (port) => probeFrontDoorSync(port, import_node_fs11.default.readFileSync(paths.frontdoorCaCertFile, "utf8"))
|
|
8135
8165
|
};
|
package/dist/index.mjs
CHANGED
|
@@ -2734,7 +2734,7 @@ var init_package = __esm({
|
|
|
2734
2734
|
"package.json"() {
|
|
2735
2735
|
package_default = {
|
|
2736
2736
|
name: "claude-use",
|
|
2737
|
-
version: "11.5.
|
|
2737
|
+
version: "11.5.2",
|
|
2738
2738
|
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.",
|
|
2739
2739
|
license: "MIT",
|
|
2740
2740
|
author: "Joseph Mearman <joseph@mearman.co.uk>",
|
|
@@ -6732,6 +6732,10 @@ function ensureFrontDoor(params) {
|
|
|
6732
6732
|
let replaced = false;
|
|
6733
6733
|
const distrusted = /* @__PURE__ */ new Set();
|
|
6734
6734
|
let lastRejection;
|
|
6735
|
+
let busyDoor;
|
|
6736
|
+
const liveSessionsOn = (doorPid) => listFrontDoorSessions(ports.fs, paths.frontdoorSessionsDir).filter(
|
|
6737
|
+
(session) => session.pid !== params.launcherPid && ports.isRunning(session.pid) && (session.supervisorPid === void 0 || session.supervisorPid === doorPid)
|
|
6738
|
+
).length;
|
|
6735
6739
|
const verifyWithRetry = (port) => {
|
|
6736
6740
|
let verdict = ports.verifyListener(port);
|
|
6737
6741
|
for (let attempt = 1; !verdict.ok && attempt < FRONTDOOR_PROBE_ATTEMPTS; attempt += 1) {
|
|
@@ -6742,7 +6746,13 @@ function ensureFrontDoor(params) {
|
|
|
6742
6746
|
};
|
|
6743
6747
|
const stopAndAwaitExit = (supervisorPid, failure) => {
|
|
6744
6748
|
ports.stopSupervisor(supervisorPid);
|
|
6749
|
+
const graceEnds = ports.now() + FRONTDOOR_EXIT_GRACE_MS;
|
|
6750
|
+
let killed = false;
|
|
6745
6751
|
while (ports.isRunning(supervisorPid)) {
|
|
6752
|
+
if (!killed && ports.now() >= graceEnds) {
|
|
6753
|
+
ports.killSupervisor(supervisorPid);
|
|
6754
|
+
killed = true;
|
|
6755
|
+
}
|
|
6746
6756
|
if (ports.now() >= deadline) {
|
|
6747
6757
|
throw new FrontDoorStartError(`${failure}. Daemon log: ${paths.frontdoorLogPath}`);
|
|
6748
6758
|
}
|
|
@@ -6754,6 +6764,11 @@ function ensureFrontDoor(params) {
|
|
|
6754
6764
|
const supervisorPid = state?.supervisorPid;
|
|
6755
6765
|
if (supervisorPid !== void 0 && !distrusted.has(supervisorPid) && ports.isRunning(supervisorPid)) {
|
|
6756
6766
|
if (state?.port !== void 0 && state.connectPort !== void 0) {
|
|
6767
|
+
if (supervisorPid === params.launcherPid && params.replace !== true && ports.isFrontDoorSupervisor(supervisorPid)) {
|
|
6768
|
+
const token = randomUUID3();
|
|
6769
|
+
writeFrontDoorSession(ports.fs, paths.frontdoorSessionsDir, { pid: params.launcherPid, startedAt: ports.now(), token, supervisorPid });
|
|
6770
|
+
return { port: state.port, connectPort: state.connectPort, token };
|
|
6771
|
+
}
|
|
6757
6772
|
const verdict = verifyWithRetry(state.port);
|
|
6758
6773
|
if (verdict.ok && !replaced && !spawned && (params.replace === true || (state.protocol ?? 0) < FRONT_DOOR_PROTOCOL)) {
|
|
6759
6774
|
stopAndAwaitExit(
|
|
@@ -6773,11 +6788,22 @@ function ensureFrontDoor(params) {
|
|
|
6773
6788
|
throw new FrontDoorStartError(`${lastRejection}; refusing to send this session's credentials to it. Daemon log: ${paths.frontdoorLogPath}`);
|
|
6774
6789
|
}
|
|
6775
6790
|
if (ports.isFrontDoorSupervisor(supervisorPid)) {
|
|
6776
|
-
|
|
6791
|
+
const stranded = liveSessionsOn(supervisorPid);
|
|
6792
|
+
if (params.replace === true && !replaced) {
|
|
6793
|
+
stopAndAwaitExit(supervisorPid, `the front door (pid ${String(supervisorPid)}) stopped answering and did not exit when asked to`);
|
|
6794
|
+
replaced = true;
|
|
6795
|
+
continue;
|
|
6796
|
+
}
|
|
6797
|
+
if (stranded > 0) {
|
|
6798
|
+
busyDoor = { pid: supervisorPid, sessions: stranded };
|
|
6799
|
+
} else {
|
|
6800
|
+
stopAndAwaitExit(supervisorPid, `the front door (pid ${String(supervisorPid)}) stopped answering and did not exit when asked to`);
|
|
6801
|
+
continue;
|
|
6802
|
+
}
|
|
6803
|
+
} else {
|
|
6804
|
+
distrusted.add(supervisorPid);
|
|
6777
6805
|
continue;
|
|
6778
6806
|
}
|
|
6779
|
-
distrusted.add(supervisorPid);
|
|
6780
|
-
continue;
|
|
6781
6807
|
}
|
|
6782
6808
|
if (state?.lastError !== void 0) {
|
|
6783
6809
|
throw new FrontDoorStartError(`the front door reported a fatal error and is not serving: ${state.lastError} (daemon log: ${paths.frontdoorLogPath})`);
|
|
@@ -6800,13 +6826,13 @@ function ensureFrontDoor(params) {
|
|
|
6800
6826
|
if (ports.now() >= deadline) {
|
|
6801
6827
|
const lastError = state?.lastError;
|
|
6802
6828
|
throw new FrontDoorStartError(
|
|
6803
|
-
`the front door did not become ready within ${String(FRONTDOOR_START_TIMEOUT_MS)}ms` + (lastError === void 0 ? "" : ` (last error: ${lastError})`) + (lastRejection === void 0 ? "" : ` (${lastRejection})`) + `. Daemon log: ${paths.frontdoorLogPath}`
|
|
6829
|
+
`the front door did not become ready within ${String(FRONTDOOR_START_TIMEOUT_MS)}ms` + (lastError === void 0 ? "" : ` (last error: ${lastError})`) + (lastRejection === void 0 ? "" : ` (${lastRejection})`) + (busyDoor === void 0 ? "" : `. It was not replaced because ${String(busyDoor.sessions)} live session(s) are using it and would lose their connections; run \`agent-shim frontdoor restart\` to replace it deliberately`) + `. Daemon log: ${paths.frontdoorLogPath}`
|
|
6804
6830
|
);
|
|
6805
6831
|
}
|
|
6806
6832
|
ports.sleep(FRONTDOOR_LAUNCHER_POLL_MS);
|
|
6807
6833
|
}
|
|
6808
6834
|
}
|
|
6809
|
-
var FRONTDOOR_START_TIMEOUT_MS, FRONTDOOR_LAUNCHER_POLL_MS, FRONTDOOR_PROBE_ATTEMPTS, FrontDoorStartError;
|
|
6835
|
+
var FRONTDOOR_START_TIMEOUT_MS, FRONTDOOR_LAUNCHER_POLL_MS, FRONTDOOR_PROBE_ATTEMPTS, FRONTDOOR_EXIT_GRACE_MS, FrontDoorStartError;
|
|
6810
6836
|
var init_ensure2 = __esm({
|
|
6811
6837
|
"src/frontdoor/ensure.ts"() {
|
|
6812
6838
|
"use strict";
|
|
@@ -6816,6 +6842,7 @@ var init_ensure2 = __esm({
|
|
|
6816
6842
|
FRONTDOOR_START_TIMEOUT_MS = 3e4;
|
|
6817
6843
|
FRONTDOOR_LAUNCHER_POLL_MS = 100;
|
|
6818
6844
|
FRONTDOOR_PROBE_ATTEMPTS = 3;
|
|
6845
|
+
FRONTDOOR_EXIT_GRACE_MS = 5e3;
|
|
6819
6846
|
FrontDoorStartError = class extends CliError {
|
|
6820
6847
|
constructor(message) {
|
|
6821
6848
|
super(message);
|
|
@@ -8102,6 +8129,9 @@ function realEnsurePorts(paths, spawnDaemon) {
|
|
|
8102
8129
|
stopSupervisor: (pid) => {
|
|
8103
8130
|
process.kill(pid, "SIGTERM");
|
|
8104
8131
|
},
|
|
8132
|
+
killSupervisor: (pid) => {
|
|
8133
|
+
process.kill(pid, "SIGKILL");
|
|
8134
|
+
},
|
|
8105
8135
|
// 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.
|
|
8106
8136
|
verifyListener: (port) => probeFrontDoorSync(port, fs11.readFileSync(paths.frontdoorCaCertFile, "utf8"))
|
|
8107
8137
|
};
|
package/dist/types/index.d.ts
CHANGED
|
@@ -5656,7 +5656,6 @@ declare function createConfigApiRouter(deps: ConfigApiDeps): {
|
|
|
5656
5656
|
kind: zod.ZodLiteral<"profile">;
|
|
5657
5657
|
name: zod.ZodString;
|
|
5658
5658
|
value: zod.ZodObject<{
|
|
5659
|
-
description: zod.ZodOptional<zod.ZodString>;
|
|
5660
5659
|
entries: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnion<readonly [zod.ZodBoolean, zod.ZodObject<{
|
|
5661
5660
|
value: zod.ZodBoolean;
|
|
5662
5661
|
when: zod.ZodUnion<readonly [zod.ZodObject<{
|
|
@@ -5732,6 +5731,7 @@ declare function createConfigApiRouter(deps: ConfigApiDeps): {
|
|
|
5732
5731
|
key: zod.ZodType<trilean.JsonValue, unknown, zod_v4_core.$ZodTypeInternals<trilean.JsonValue, unknown>>;
|
|
5733
5732
|
}, zod_v4_core.$strip>], "kind">]>;
|
|
5734
5733
|
}, zod_v4_core.$strict>]>>>;
|
|
5734
|
+
description: zod.ZodOptional<zod.ZodString>;
|
|
5735
5735
|
extends: zod.ZodOptional<zod.ZodArray<zod.ZodString>>;
|
|
5736
5736
|
categories: zod.ZodOptional<zod.ZodPipe<zod.ZodObject<{
|
|
5737
5737
|
all: zod.ZodOptional<zod.ZodBoolean>;
|
|
@@ -5775,7 +5775,6 @@ declare function createConfigApiRouter(deps: ConfigApiDeps): {
|
|
|
5775
5775
|
kind: zod.ZodLiteral<"profile">;
|
|
5776
5776
|
name: zod.ZodString;
|
|
5777
5777
|
value: zod.ZodObject<{
|
|
5778
|
-
description: zod.ZodOptional<zod.ZodString>;
|
|
5779
5778
|
entries: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnion<readonly [zod.ZodBoolean, zod.ZodObject<{
|
|
5780
5779
|
value: zod.ZodBoolean;
|
|
5781
5780
|
when: zod.ZodUnion<readonly [zod.ZodObject<{
|
|
@@ -5851,6 +5850,7 @@ declare function createConfigApiRouter(deps: ConfigApiDeps): {
|
|
|
5851
5850
|
key: zod.ZodType<trilean.JsonValue, unknown, zod_v4_core.$ZodTypeInternals<trilean.JsonValue, unknown>>;
|
|
5852
5851
|
}, zod_v4_core.$strip>], "kind">]>;
|
|
5853
5852
|
}, zod_v4_core.$strict>]>>>;
|
|
5853
|
+
description: zod.ZodOptional<zod.ZodString>;
|
|
5854
5854
|
extends: zod.ZodOptional<zod.ZodArray<zod.ZodString>>;
|
|
5855
5855
|
categories: zod.ZodOptional<zod.ZodPipe<zod.ZodObject<{
|
|
5856
5856
|
all: zod.ZodOptional<zod.ZodBoolean>;
|
|
@@ -8606,7 +8606,6 @@ declare function createDoorApiRouter(deps: DoorApiDeps): {
|
|
|
8606
8606
|
kind: zod.ZodLiteral<"profile">;
|
|
8607
8607
|
name: zod.ZodString;
|
|
8608
8608
|
value: zod.ZodObject<{
|
|
8609
|
-
description: zod.ZodOptional<zod.ZodString>;
|
|
8610
8609
|
entries: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnion<readonly [zod.ZodBoolean, zod.ZodObject<{
|
|
8611
8610
|
value: zod.ZodBoolean;
|
|
8612
8611
|
when: zod.ZodUnion<readonly [zod.ZodObject<{
|
|
@@ -8682,6 +8681,7 @@ declare function createDoorApiRouter(deps: DoorApiDeps): {
|
|
|
8682
8681
|
key: zod.ZodType<trilean.JsonValue, unknown, zod_v4_core.$ZodTypeInternals<trilean.JsonValue, unknown>>;
|
|
8683
8682
|
}, zod_v4_core.$strip>], "kind">]>;
|
|
8684
8683
|
}, zod_v4_core.$strict>]>>>;
|
|
8684
|
+
description: zod.ZodOptional<zod.ZodString>;
|
|
8685
8685
|
extends: zod.ZodOptional<zod.ZodArray<zod.ZodString>>;
|
|
8686
8686
|
categories: zod.ZodOptional<zod.ZodPipe<zod.ZodObject<{
|
|
8687
8687
|
all: zod.ZodOptional<zod.ZodBoolean>;
|
|
@@ -8725,7 +8725,6 @@ declare function createDoorApiRouter(deps: DoorApiDeps): {
|
|
|
8725
8725
|
kind: zod.ZodLiteral<"profile">;
|
|
8726
8726
|
name: zod.ZodString;
|
|
8727
8727
|
value: zod.ZodObject<{
|
|
8728
|
-
description: zod.ZodOptional<zod.ZodString>;
|
|
8729
8728
|
entries: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnion<readonly [zod.ZodBoolean, zod.ZodObject<{
|
|
8730
8729
|
value: zod.ZodBoolean;
|
|
8731
8730
|
when: zod.ZodUnion<readonly [zod.ZodObject<{
|
|
@@ -8801,6 +8800,7 @@ declare function createDoorApiRouter(deps: DoorApiDeps): {
|
|
|
8801
8800
|
key: zod.ZodType<trilean.JsonValue, unknown, zod_v4_core.$ZodTypeInternals<trilean.JsonValue, unknown>>;
|
|
8802
8801
|
}, zod_v4_core.$strip>], "kind">]>;
|
|
8803
8802
|
}, zod_v4_core.$strict>]>>>;
|
|
8803
|
+
description: zod.ZodOptional<zod.ZodString>;
|
|
8804
8804
|
extends: zod.ZodOptional<zod.ZodArray<zod.ZodString>>;
|
|
8805
8805
|
categories: zod.ZodOptional<zod.ZodPipe<zod.ZodObject<{
|
|
8806
8806
|
all: zod.ZodOptional<zod.ZodBoolean>;
|
|
@@ -10714,7 +10714,6 @@ declare const ConfigProfileAddOutputSchema: z.ZodObject<{
|
|
|
10714
10714
|
kind: z.ZodLiteral<"profile">;
|
|
10715
10715
|
name: z.ZodString;
|
|
10716
10716
|
value: z.ZodObject<{
|
|
10717
|
-
description: z.ZodOptional<z.ZodString>;
|
|
10718
10717
|
entries: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
|
|
10719
10718
|
value: z.ZodBoolean;
|
|
10720
10719
|
when: z.ZodUnion<readonly [z.ZodObject<{
|
|
@@ -10790,6 +10789,7 @@ declare const ConfigProfileAddOutputSchema: z.ZodObject<{
|
|
|
10790
10789
|
key: z.ZodType<trilean.JsonValue, unknown, z.core.$ZodTypeInternals<trilean.JsonValue, unknown>>;
|
|
10791
10790
|
}, z.core.$strip>], "kind">]>;
|
|
10792
10791
|
}, z.core.$strict>]>>>;
|
|
10792
|
+
description: z.ZodOptional<z.ZodString>;
|
|
10793
10793
|
extends: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
10794
10794
|
categories: z.ZodOptional<z.ZodPipe<z.ZodObject<{
|
|
10795
10795
|
all: z.ZodOptional<z.ZodBoolean>;
|
|
@@ -10835,7 +10835,6 @@ declare const ConfigProfileSetOutputSchema: z.ZodObject<{
|
|
|
10835
10835
|
kind: z.ZodLiteral<"profile">;
|
|
10836
10836
|
name: z.ZodString;
|
|
10837
10837
|
value: z.ZodObject<{
|
|
10838
|
-
description: z.ZodOptional<z.ZodString>;
|
|
10839
10838
|
entries: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
|
|
10840
10839
|
value: z.ZodBoolean;
|
|
10841
10840
|
when: z.ZodUnion<readonly [z.ZodObject<{
|
|
@@ -10911,6 +10910,7 @@ declare const ConfigProfileSetOutputSchema: z.ZodObject<{
|
|
|
10911
10910
|
key: z.ZodType<trilean.JsonValue, unknown, z.core.$ZodTypeInternals<trilean.JsonValue, unknown>>;
|
|
10912
10911
|
}, z.core.$strip>], "kind">]>;
|
|
10913
10912
|
}, z.core.$strict>]>>>;
|
|
10913
|
+
description: z.ZodOptional<z.ZodString>;
|
|
10914
10914
|
extends: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
10915
10915
|
categories: z.ZodOptional<z.ZodPipe<z.ZodObject<{
|
|
10916
10916
|
all: z.ZodOptional<z.ZodBoolean>;
|
|
@@ -12533,6 +12533,8 @@ interface EnsureFrontDoorPorts {
|
|
|
12533
12533
|
readonly verifyListener: (port: number) => ListenerVerdict;
|
|
12534
12534
|
/** Asks a running front-door supervisor to exit, without waiting for it to: the caller polls `isRunning`. Only ever called for a pid whose recorded listener has just authenticated as agent-shim's own, or whose process is agent-shim's front-door supervisor (`isFrontDoorSupervisor`). */
|
|
12535
12535
|
readonly stopSupervisor: (pid: number) => void;
|
|
12536
|
+
/** Ends a supervisor that did not exit when asked to, without giving it the chance to refuse: a door whose event loop is blocked never runs its signal handler. Called only for a pid `isFrontDoorSupervisor` has just confirmed, after `stopSupervisor` and a grace period. */
|
|
12537
|
+
readonly killSupervisor: (pid: number) => void;
|
|
12536
12538
|
/** Whether `pid` is a live agent-shim front-door supervisor process, read from the process's own command line. This is what separates a wedged door of this tool, which a replacement must retire so the two never coexist, from an unrelated process that reuses the recorded pid, which must never be signalled. */
|
|
12537
12539
|
readonly isFrontDoorSupervisor: (pid: number) => boolean;
|
|
12538
12540
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-use",
|
|
3
|
-
"version": "11.5.
|
|
3
|
+
"version": "11.5.2",
|
|
4
4
|
"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.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Joseph Mearman <joseph@mearman.co.uk>",
|