claude-cac 1.4.3 → 1.4.4-beta.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 CHANGED
@@ -15,6 +15,7 @@
15
15
  [![npm version](https://img.shields.io/npm/v/claude-cac.svg)](https://www.npmjs.com/package/claude-cac)
16
16
  [![GitHub stars](https://img.shields.io/github/stars/nmhjklnm/cac?style=social)](https://github.com/nmhjklnm/cac)
17
17
  [![Docs](https://img.shields.io/badge/Docs-cac.nextmind.space-D97706.svg)](https://cac.nextmind.space/docs)
18
+ [![Telegram](https://img.shields.io/badge/Telegram-Community-2CA5E0?logo=telegram)](https://t.me/claudecodecloak)
18
19
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
19
20
  [![Platform](https://img.shields.io/badge/Platform-macOS%20%7C%20Linux%20%7C%20Windows-lightgrey.svg)]()
20
21
 
package/cac CHANGED
@@ -11,7 +11,7 @@ VERSIONS_DIR="$CAC_DIR/versions"
11
11
  # ── utils: colors, read/write, UUID, proxy parsing ───────────────────────
12
12
 
13
13
  # shellcheck disable=SC2034 # used in build-concatenated cac script
14
- CAC_VERSION="1.4.3"
14
+ CAC_VERSION="1.4.4-beta.1"
15
15
 
16
16
  _read() { [[ -f "$1" ]] && tr -d '[:space:]' < "$1" || echo "${2:-}"; }
17
17
  _die() { printf '%b\n' "$(_red "error:") $*" >&2; exit 1; }
@@ -1280,21 +1280,38 @@ fi
1280
1280
  [[ -x "$_real" ]] || { echo "[cac] error: claude not found, run 'cac claude install latest'" >&2; exit 1; }
1281
1281
 
1282
1282
  # ── Relay local forwarding (always enabled when proxy is set) ──
1283
+ # Relay lifecycle: ENVIRONMENT-level, not session-level.
1284
+ # - Started on demand by the first session that needs it
1285
+ # - Persists across sessions (no cleanup on exit)
1286
+ # - Restarted if proxy changes (relay.proxy mismatch)
1287
+ # - Stopped by: cac env activate (switch), cac self delete, or machine reboot
1283
1288
  _relay_active=false
1284
1289
  if [[ -n "$PROXY" ]] && [[ -f "$CAC_DIR/relay.js" ]]; then
1285
1290
  _relay_js="$CAC_DIR/relay.js"
1286
1291
  _relay_pid_file="$CAC_DIR/relay.pid"
1287
1292
  _relay_port_file="$CAC_DIR/relay.port"
1293
+ _relay_proxy_file="$CAC_DIR/relay.proxy"
1288
1294
 
1289
1295
  # check if relay is already running
1290
1296
  _relay_running=false
1291
1297
  if [[ -f "$_relay_pid_file" ]]; then
1292
1298
  _rpid=$(tr -d '[:space:]' < "$_relay_pid_file")
1293
- kill -0 "$_rpid" 2>/dev/null && _relay_running=true
1299
+ [[ -n "$_rpid" ]] && kill -0 "$_rpid" 2>/dev/null && _relay_running=true
1300
+ fi
1301
+
1302
+ # kill stale relay if proxy changed (env switch without going through cac activate)
1303
+ # skip if relay.proxy absent (first run after upgrade — assume match)
1304
+ if [[ "$_relay_running" == "true" ]] && [[ -f "$_relay_proxy_file" ]]; then
1305
+ _old_proxy=$(tr -d '[:space:]' < "$_relay_proxy_file")
1306
+ if [[ "$_old_proxy" != "$PROXY" ]]; then
1307
+ kill "$_rpid" 2>/dev/null || true
1308
+ rm -f "$_relay_pid_file" "$_relay_port_file" "$_relay_proxy_file"
1309
+ _relay_running=false
1310
+ fi
1294
1311
  fi
1295
1312
 
1296
1313
  # start if not running
1297
- if [[ "$_relay_running" != "true" ]] && [[ -f "$_relay_js" ]]; then
1314
+ if [[ "$_relay_running" != "true" ]]; then
1298
1315
  _rport=17890
1299
1316
  while (echo >/dev/tcp/127.0.0.1/$_rport) 2>/dev/null; do
1300
1317
  (( _rport++ ))
@@ -1306,6 +1323,7 @@ if [[ -n "$PROXY" ]] && [[ -f "$CAC_DIR/relay.js" ]]; then
1306
1323
  (echo >/dev/tcp/127.0.0.1/$_rport) 2>/dev/null && break
1307
1324
  sleep 0.1
1308
1325
  done
1326
+ echo "$PROXY" > "$_relay_proxy_file"
1309
1327
  echo "$_rport" > "$_relay_port_file"
1310
1328
  fi
1311
1329
 
@@ -1319,40 +1337,6 @@ if [[ -n "$PROXY" ]] && [[ -f "$CAC_DIR/relay.js" ]]; then
1319
1337
  fi
1320
1338
  fi
1321
1339
 
1322
- # cleanup function
1323
- _cleanup_all() {
1324
- # stop watchdog
1325
- [[ -n "${_watchdog_pid:-}" ]] && kill "$_watchdog_pid" 2>/dev/null || true
1326
- # cleanup relay
1327
- if [[ "$_relay_active" == "true" ]] && [[ -f "$CAC_DIR/relay.pid" ]]; then
1328
- local _p; _p=$(cat "$CAC_DIR/relay.pid" 2>/dev/null) || true
1329
- [[ -n "$_p" ]] && kill "$_p" 2>/dev/null || true
1330
- rm -f "$CAC_DIR/relay.pid" "$CAC_DIR/relay.port"
1331
- fi
1332
- }
1333
-
1334
- trap _cleanup_all EXIT INT TERM
1335
-
1336
- # ── Relay watchdog: auto-restart relay if it crashes ──
1337
- if [[ "$_relay_active" == "true" ]]; then
1338
- (while true; do
1339
- sleep 10
1340
- [[ -f "$_relay_pid_file" ]] || break # pid file gone = intentional shutdown
1341
- _wpid=$(tr -d '[:space:]' < "$_relay_pid_file" 2>/dev/null) || break
1342
- if ! kill -0 "$_wpid" 2>/dev/null; then
1343
- echo "[cac] relay crashed, restarting..." >&2
1344
- node "$_relay_js" "$_rport" "$PROXY" "$_relay_pid_file" </dev/null >>"$CAC_DIR/relay.log" 2>&1 &
1345
- disown
1346
- for _wi in {1..30}; do
1347
- (echo >/dev/tcp/127.0.0.1/$_rport) 2>/dev/null && break
1348
- sleep 0.1
1349
- done
1350
- fi
1351
- done) &
1352
- _watchdog_pid=$!
1353
- disown
1354
- fi
1355
-
1356
1340
  # ── Concurrent session check ──
1357
1341
  _max_sessions=10
1358
1342
  [[ -f "$CAC_DIR/max_sessions" ]] && _ms=$(tr -d '[:space:]' < "$CAC_DIR/max_sessions") && [[ -n "$_ms" ]] && _max_sessions="$_ms"
@@ -1370,7 +1354,6 @@ set +e
1370
1354
  "$_real" "$@"
1371
1355
  _ec=$?
1372
1356
  set -e
1373
- _cleanup_all
1374
1357
  exit "$_ec"
1375
1358
  WRAPPER_EOF
1376
1359
  local _tmp="$CAC_DIR/bin/claude.tmp"
@@ -1997,6 +1980,7 @@ _relay_start() {
1997
1980
  return 1
1998
1981
  fi
1999
1982
 
1983
+ echo "$proxy" > "$CAC_DIR/relay.proxy"
2000
1984
  echo "$port" > "$CAC_DIR/relay.port"
2001
1985
  return 0
2002
1986
  }
@@ -2016,7 +2000,7 @@ _relay_stop() {
2016
2000
  fi
2017
2001
  rm -f "$pid_file"
2018
2002
  fi
2019
- rm -f "$CAC_DIR/relay.port"
2003
+ rm -f "$CAC_DIR/relay.port" "$CAC_DIR/relay.proxy"
2020
2004
 
2021
2005
  # cleanup route
2022
2006
  _relay_remove_route 2>/dev/null || true
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-cac",
3
- "version": "1.4.3",
3
+ "version": "1.4.4-beta.1",
4
4
  "description": "Isolate, protect, and manage your Claude Code — versions, environments, identity, and proxy.",
5
5
  "bin": {
6
6
  "cac": "cac"
@@ -42,6 +42,12 @@ if (home && fs.existsSync(wrapperPath)) {
42
42
  if (patched.indexOf(buggyPgrep) !== -1 && patched.indexOf(fixedPgrep) === -1) {
43
43
  patched = patched.replace(buggyPgrep, fixedPgrep);
44
44
  }
45
+ // Fix: session exit killed the shared relay, breaking all other sessions.
46
+ // Remove the trap so _cleanup_all never fires on exit.
47
+ var buggyTrap = 'trap _cleanup_all EXIT INT TERM';
48
+ if (patched.indexOf(buggyTrap) !== -1) {
49
+ patched = patched.replace(buggyTrap, '');
50
+ }
45
51
  if (patched !== wrapperContent) {
46
52
  fs.writeFileSync(wrapperPath, patched);
47
53
  }