claude-use 11.5.1 → 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 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.1",
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>",
@@ -61821,7 +61821,13 @@ function ensureFrontDoor(params) {
61821
61821
  };
61822
61822
  const stopAndAwaitExit = (supervisorPid, failure2) => {
61823
61823
  ports.stopSupervisor(supervisorPid);
61824
+ const graceEnds = ports.now() + FRONTDOOR_EXIT_GRACE_MS;
61825
+ let killed = false;
61824
61826
  while (ports.isRunning(supervisorPid)) {
61827
+ if (!killed && ports.now() >= graceEnds) {
61828
+ ports.killSupervisor(supervisorPid);
61829
+ killed = true;
61830
+ }
61825
61831
  if (ports.now() >= deadline) {
61826
61832
  throw new FrontDoorStartError(`${failure2}. Daemon log: ${paths.frontdoorLogPath}`);
61827
61833
  }
@@ -61833,6 +61839,11 @@ function ensureFrontDoor(params) {
61833
61839
  const supervisorPid = state?.supervisorPid;
61834
61840
  if (supervisorPid !== void 0 && !distrusted.has(supervisorPid) && ports.isRunning(supervisorPid)) {
61835
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
+ }
61836
61847
  const verdict = verifyWithRetry(state.port);
61837
61848
  if (verdict.ok && !replaced && !spawned && (params.replace === true || (state.protocol ?? 0) < FRONT_DOOR_PROTOCOL)) {
61838
61849
  stopAndAwaitExit(
@@ -61853,6 +61864,11 @@ function ensureFrontDoor(params) {
61853
61864
  }
61854
61865
  if (ports.isFrontDoorSupervisor(supervisorPid)) {
61855
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
+ }
61856
61872
  if (stranded > 0) {
61857
61873
  busyDoor = { pid: supervisorPid, sessions: stranded };
61858
61874
  } else {
@@ -61908,7 +61924,7 @@ function restartFrontDoor(params) {
61908
61924
  }
61909
61925
  return { action: "restarted", previousPid, pid };
61910
61926
  }
61911
- 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;
61912
61928
  var init_ensure2 = __esm({
61913
61929
  "src/frontdoor/ensure.ts"() {
61914
61930
  "use strict";
@@ -61919,6 +61935,7 @@ var init_ensure2 = __esm({
61919
61935
  FRONTDOOR_START_TIMEOUT_MS = 3e4;
61920
61936
  FRONTDOOR_LAUNCHER_POLL_MS = 100;
61921
61937
  FRONTDOOR_PROBE_ATTEMPTS = 3;
61938
+ FRONTDOOR_EXIT_GRACE_MS = 5e3;
61922
61939
  FrontDoorStartError = class extends CliError {
61923
61940
  constructor(message) {
61924
61941
  super(message);
@@ -62048,6 +62065,9 @@ function realEnsurePorts(paths, spawnDaemon) {
62048
62065
  stopSupervisor: (pid) => {
62049
62066
  process.kill(pid, "SIGTERM");
62050
62067
  },
62068
+ killSupervisor: (pid) => {
62069
+ process.kill(pid, "SIGKILL");
62070
+ },
62051
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.
62052
62072
  verifyListener: (port) => probeFrontDoorSync(port, import_node_fs13.default.readFileSync(paths.frontdoorCaCertFile, "utf8"))
62053
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.1",
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>",
@@ -6772,7 +6772,13 @@ function ensureFrontDoor(params) {
6772
6772
  };
6773
6773
  const stopAndAwaitExit = (supervisorPid, failure) => {
6774
6774
  ports.stopSupervisor(supervisorPid);
6775
+ const graceEnds = ports.now() + FRONTDOOR_EXIT_GRACE_MS;
6776
+ let killed = false;
6775
6777
  while (ports.isRunning(supervisorPid)) {
6778
+ if (!killed && ports.now() >= graceEnds) {
6779
+ ports.killSupervisor(supervisorPid);
6780
+ killed = true;
6781
+ }
6776
6782
  if (ports.now() >= deadline) {
6777
6783
  throw new FrontDoorStartError(`${failure}. Daemon log: ${paths.frontdoorLogPath}`);
6778
6784
  }
@@ -6784,6 +6790,11 @@ function ensureFrontDoor(params) {
6784
6790
  const supervisorPid = state?.supervisorPid;
6785
6791
  if (supervisorPid !== void 0 && !distrusted.has(supervisorPid) && ports.isRunning(supervisorPid)) {
6786
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
+ }
6787
6798
  const verdict = verifyWithRetry(state.port);
6788
6799
  if (verdict.ok && !replaced && !spawned && (params.replace === true || (state.protocol ?? 0) < FRONT_DOOR_PROTOCOL)) {
6789
6800
  stopAndAwaitExit(
@@ -6804,6 +6815,11 @@ function ensureFrontDoor(params) {
6804
6815
  }
6805
6816
  if (ports.isFrontDoorSupervisor(supervisorPid)) {
6806
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
+ }
6807
6823
  if (stranded > 0) {
6808
6824
  busyDoor = { pid: supervisorPid, sessions: stranded };
6809
6825
  } else {
@@ -6842,7 +6858,7 @@ function ensureFrontDoor(params) {
6842
6858
  ports.sleep(FRONTDOOR_LAUNCHER_POLL_MS);
6843
6859
  }
6844
6860
  }
6845
- 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;
6846
6862
  var init_ensure2 = __esm({
6847
6863
  "src/frontdoor/ensure.ts"() {
6848
6864
  "use strict";
@@ -6853,6 +6869,7 @@ var init_ensure2 = __esm({
6853
6869
  FRONTDOOR_START_TIMEOUT_MS = 3e4;
6854
6870
  FRONTDOOR_LAUNCHER_POLL_MS = 100;
6855
6871
  FRONTDOOR_PROBE_ATTEMPTS = 3;
6872
+ FRONTDOOR_EXIT_GRACE_MS = 5e3;
6856
6873
  FrontDoorStartError = class extends CliError {
6857
6874
  constructor(message) {
6858
6875
  super(message);
@@ -8140,6 +8157,9 @@ function realEnsurePorts(paths, spawnDaemon) {
8140
8157
  stopSupervisor: (pid) => {
8141
8158
  process.kill(pid, "SIGTERM");
8142
8159
  },
8160
+ killSupervisor: (pid) => {
8161
+ process.kill(pid, "SIGKILL");
8162
+ },
8143
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.
8144
8164
  verifyListener: (port) => probeFrontDoorSync(port, import_node_fs11.default.readFileSync(paths.frontdoorCaCertFile, "utf8"))
8145
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.1",
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>",
@@ -6746,7 +6746,13 @@ function ensureFrontDoor(params) {
6746
6746
  };
6747
6747
  const stopAndAwaitExit = (supervisorPid, failure) => {
6748
6748
  ports.stopSupervisor(supervisorPid);
6749
+ const graceEnds = ports.now() + FRONTDOOR_EXIT_GRACE_MS;
6750
+ let killed = false;
6749
6751
  while (ports.isRunning(supervisorPid)) {
6752
+ if (!killed && ports.now() >= graceEnds) {
6753
+ ports.killSupervisor(supervisorPid);
6754
+ killed = true;
6755
+ }
6750
6756
  if (ports.now() >= deadline) {
6751
6757
  throw new FrontDoorStartError(`${failure}. Daemon log: ${paths.frontdoorLogPath}`);
6752
6758
  }
@@ -6758,6 +6764,11 @@ function ensureFrontDoor(params) {
6758
6764
  const supervisorPid = state?.supervisorPid;
6759
6765
  if (supervisorPid !== void 0 && !distrusted.has(supervisorPid) && ports.isRunning(supervisorPid)) {
6760
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
+ }
6761
6772
  const verdict = verifyWithRetry(state.port);
6762
6773
  if (verdict.ok && !replaced && !spawned && (params.replace === true || (state.protocol ?? 0) < FRONT_DOOR_PROTOCOL)) {
6763
6774
  stopAndAwaitExit(
@@ -6778,6 +6789,11 @@ function ensureFrontDoor(params) {
6778
6789
  }
6779
6790
  if (ports.isFrontDoorSupervisor(supervisorPid)) {
6780
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
+ }
6781
6797
  if (stranded > 0) {
6782
6798
  busyDoor = { pid: supervisorPid, sessions: stranded };
6783
6799
  } else {
@@ -6816,7 +6832,7 @@ function ensureFrontDoor(params) {
6816
6832
  ports.sleep(FRONTDOOR_LAUNCHER_POLL_MS);
6817
6833
  }
6818
6834
  }
6819
- 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;
6820
6836
  var init_ensure2 = __esm({
6821
6837
  "src/frontdoor/ensure.ts"() {
6822
6838
  "use strict";
@@ -6826,6 +6842,7 @@ var init_ensure2 = __esm({
6826
6842
  FRONTDOOR_START_TIMEOUT_MS = 3e4;
6827
6843
  FRONTDOOR_LAUNCHER_POLL_MS = 100;
6828
6844
  FRONTDOOR_PROBE_ATTEMPTS = 3;
6845
+ FRONTDOOR_EXIT_GRACE_MS = 5e3;
6829
6846
  FrontDoorStartError = class extends CliError {
6830
6847
  constructor(message) {
6831
6848
  super(message);
@@ -8112,6 +8129,9 @@ function realEnsurePorts(paths, spawnDaemon) {
8112
8129
  stopSupervisor: (pid) => {
8113
8130
  process.kill(pid, "SIGTERM");
8114
8131
  },
8132
+ killSupervisor: (pid) => {
8133
+ process.kill(pid, "SIGKILL");
8134
+ },
8115
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.
8116
8136
  verifyListener: (port) => probeFrontDoorSync(port, fs11.readFileSync(paths.frontdoorCaCertFile, "utf8"))
8117
8137
  };
@@ -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.1",
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>",