switchroom 0.17.2 → 0.17.4

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.
@@ -28666,8 +28666,10 @@ function emitAgentService(lines, a, imageTag, buildMode, buildContext, homePrefi
28666
28666
  env2.SWITCHROOM_WEBHOOK_RECEIVER_UID = String(operatorUid);
28667
28667
  }
28668
28668
  if (a.litellm.enabled && a.litellm.keyConfirmed && a.litellm.baseUrl) {
28669
+ const root = a.litellm.baseUrl.replace(/\/+$/, "");
28669
28670
  env2.SWITCHROOM_LITELLM = "1";
28670
- env2.ANTHROPIC_BASE_URL = a.litellm.baseUrl;
28671
+ env2.SWITCHROOM_LITELLM_BASE = root;
28672
+ env2.ANTHROPIC_BASE_URL = `${root}/anthropic`;
28671
28673
  env2.ANTHROPIC_SMALL_FAST_MODEL = a.litellm.smallFastModel;
28672
28674
  }
28673
28675
  env2.SWITCHROOM_VOICE_ENGINE = voiceEngine;
@@ -63735,8 +63737,8 @@ import { existsSync, readFileSync } from "node:fs";
63735
63737
  import { dirname, join } from "node:path";
63736
63738
 
63737
63739
  // src/build-info.ts
63738
- var VERSION = "0.17.2";
63739
- var COMMIT_SHA = "f06074f4";
63740
+ var VERSION = "0.17.4";
63741
+ var COMMIT_SHA = "b842b0c9";
63740
63742
 
63741
63743
  // src/cli/resolve-version.ts
63742
63744
  function readPackageVersion() {
@@ -77584,7 +77586,7 @@ function startHindsight(ports, litellm, imageTag) {
77584
77586
  `HINDSIGHT_API_CONSOLIDATION_MAX_MEMORIES_PER_ROUND=${HINDSIGHT_DEFAULT_CONSOLIDATION_MAX_MEMORIES_PER_ROUND}`
77585
77587
  ];
77586
77588
  if (litellm) {
77587
- envArgs.push("-e", `HINDSIGHT_API_PORT=${apiPort}`, "-e", `ANTHROPIC_BASE_URL=${litellm.baseUrl}`, "-e", `ANTHROPIC_CUSTOM_HEADERS=x-litellm-api-key: Bearer ${litellm.apiKey}
77589
+ envArgs.push("-e", `HINDSIGHT_API_PORT=${apiPort}`, "-e", `ANTHROPIC_BASE_URL=${litellm.baseUrl.replace(/\/+$/, "")}/anthropic`, "-e", `ANTHROPIC_CUSTOM_HEADERS=x-litellm-api-key: Bearer ${litellm.apiKey}
77588
77590
  x-litellm-customer-id: hindsight
77589
77591
  x-litellm-tags: service:hindsight`);
77590
77592
  }
@@ -22670,7 +22670,7 @@ import { existsSync as existsSync6, readFileSync as readFileSync4 } from "node:f
22670
22670
  import { dirname as dirname4, join as join2 } from "node:path";
22671
22671
 
22672
22672
  // src/build-info.ts
22673
- var VERSION = "0.17.2";
22673
+ var VERSION = "0.17.4";
22674
22674
 
22675
22675
  // src/cli/resolve-version.ts
22676
22676
  function readPackageVersion() {
@@ -24819,7 +24819,7 @@ class HostdServer {
24819
24819
  });
24820
24820
  return this.reconcileFailedRolledBack(`write failed: ${e.message}`, req, caller, started);
24821
24821
  }
24822
- const runner = this.opts.runReconcile ?? (async () => this.runSwitchroom(["apply"]));
24822
+ const runner = this.opts.runReconcile ?? (async () => this.runSwitchroom(caller.kind === "agent" ? ["apply", "--only", callerName, "--non-interactive"] : ["apply", "--non-interactive"]));
24823
24823
  const recRes = await runner({ requestId: approvalId });
24824
24824
  if (recRes.exit_code === 0) {
24825
24825
  const blast = classifyBlastRadius(snapshot, postApply);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "switchroom",
3
3
  "//version": "NOT the release version — source of truth is the git tag, resolved by scripts/build.mjs:resolveVersion() (see CLAUDE.md > Standard release process). This field is stale by design and only the Layer-4 dev/non-tag fallback for build.mjs + src/cli/resolve-version.ts; do NOT bump it expecting a release to pick it up. npm-pack tarball naming needs a real version — do that as an UNCOMMITTED pack-time bump (see release step 6), never a committed one.",
4
- "version": "0.17.2",
4
+ "version": "0.17.4",
5
5
  "description": "Run Claude Code 24/7 on your Claude Pro/Max subscription over Telegram. Open-source alternative to OpenClaw and NanoClaw — no API keys.",
6
6
  "type": "module",
7
7
  "bin": {
@@ -101,8 +101,8 @@ if [ -n "${SWITCHROOM_LITELLM:-}" ] && command -v switchroom >/dev/null 2>&1; th
101
101
  if [ -z "$sr_ll_key" ]; then
102
102
  echo "litellm: no virtual key for cron '{{name}}' — falling back to direct OAuth (no tracking/guardrail)" >&2
103
103
  elif command -v curl >/dev/null 2>&1 && [ -n "$ANTHROPIC_BASE_URL" ] \
104
- && ! curl -fsS -m 5 -o /dev/null "${ANTHROPIC_BASE_URL%/}/health/liveliness" 2>/dev/null; then
105
- echo "litellm: proxy unreachable at $ANTHROPIC_BASE_URL — falling back to direct OAuth (no tracking/guardrail this session)" >&2
104
+ && ! curl -fsS -m 5 -o /dev/null "${SWITCHROOM_LITELLM_BASE:-${ANTHROPIC_BASE_URL%/anthropic}}/health/liveliness" 2>/dev/null; then
105
+ echo "litellm: proxy unreachable at ${SWITCHROOM_LITELLM_BASE:-$ANTHROPIC_BASE_URL} — falling back to direct OAuth (no tracking/guardrail this session)" >&2
106
106
  else
107
107
  sr_ll_ok="1"
108
108
  fi
@@ -114,7 +114,7 @@ x-litellm-tags: agent:$SWITCHROOM_AGENT_NAME,profile:${SWITCHROOM_AGENT_PROFILE:
114
114
  else
115
115
  # Fail-open: drop every routing var so the claude CLI talks to Anthropic
116
116
  # directly on its OAuth credential (subscription path), unproxied.
117
- unset ANTHROPIC_BASE_URL ANTHROPIC_SMALL_FAST_MODEL SWITCHROOM_LITELLM
117
+ unset ANTHROPIC_BASE_URL ANTHROPIC_SMALL_FAST_MODEL SWITCHROOM_LITELLM SWITCHROOM_LITELLM_BASE
118
118
  fi
119
119
  unset sr_ll_key sr_ll_ok
120
120
  fi
@@ -70,8 +70,8 @@ if [ "$SWITCHROOM_RUNTIME" = "docker" ] && [ -z "$SWITCHROOM_DOCKER_TMUX_INNER"
70
70
  if [ -z "$sr_ll_key" ]; then
71
71
  echo "litellm(outer): no virtual key for agent '$SWITCHROOM_AGENT_NAME' — gateway will use direct OAuth (no tracking/guardrail)" >&2
72
72
  elif command -v curl >/dev/null 2>&1 && [ -n "$ANTHROPIC_BASE_URL" ] \
73
- && ! curl -fsS -m 5 -o /dev/null "${ANTHROPIC_BASE_URL%/}/health/liveliness" 2>/dev/null; then
74
- echo "litellm(outer): proxy unreachable at $ANTHROPIC_BASE_URL — falling back to direct OAuth (no tracking/guardrail this session)" >&2
73
+ && ! curl -fsS -m 5 -o /dev/null "${SWITCHROOM_LITELLM_BASE:-${ANTHROPIC_BASE_URL%/anthropic}}/health/liveliness" 2>/dev/null; then
74
+ echo "litellm(outer): proxy unreachable at ${SWITCHROOM_LITELLM_BASE:-$ANTHROPIC_BASE_URL} — falling back to direct OAuth (no tracking/guardrail this session)" >&2
75
75
  else
76
76
  sr_ll_ok="1"
77
77
  fi
@@ -81,7 +81,7 @@ x-litellm-customer-id: $SWITCHROOM_AGENT_NAME
81
81
  x-litellm-tags: agent:$SWITCHROOM_AGENT_NAME,profile:${SWITCHROOM_AGENT_PROFILE:-default}"
82
82
  export CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1
83
83
  else
84
- unset ANTHROPIC_BASE_URL ANTHROPIC_SMALL_FAST_MODEL SWITCHROOM_LITELLM
84
+ unset ANTHROPIC_BASE_URL ANTHROPIC_SMALL_FAST_MODEL SWITCHROOM_LITELLM SWITCHROOM_LITELLM_BASE
85
85
  fi
86
86
  unset sr_ll_key sr_ll_ok
87
87
  fi
@@ -890,8 +890,8 @@ if [ -n "${SWITCHROOM_LITELLM:-}" ] && command -v switchroom >/dev/null 2>&1; th
890
890
  if [ -z "$sr_ll_key" ]; then
891
891
  echo "litellm: no virtual key for agent '$SWITCHROOM_AGENT_NAME' — falling back to direct OAuth (no tracking/guardrail)" >&2
892
892
  elif command -v curl >/dev/null 2>&1 && [ -n "$ANTHROPIC_BASE_URL" ] \
893
- && ! curl -fsS -m 5 -o /dev/null "${ANTHROPIC_BASE_URL%/}/health/liveliness" 2>/dev/null; then
894
- echo "litellm: proxy unreachable at $ANTHROPIC_BASE_URL — falling back to direct OAuth (no tracking/guardrail this session)" >&2
893
+ && ! curl -fsS -m 5 -o /dev/null "${SWITCHROOM_LITELLM_BASE:-${ANTHROPIC_BASE_URL%/anthropic}}/health/liveliness" 2>/dev/null; then
894
+ echo "litellm: proxy unreachable at ${SWITCHROOM_LITELLM_BASE:-$ANTHROPIC_BASE_URL} — falling back to direct OAuth (no tracking/guardrail this session)" >&2
895
895
  else
896
896
  sr_ll_ok="1"
897
897
  fi
@@ -912,7 +912,7 @@ x-litellm-tags: agent:$SWITCHROOM_AGENT_NAME,profile:${SWITCHROOM_AGENT_PROFILE:
912
912
  else
913
913
  # Fail-open: drop every routing var so the claude CLI talks to Anthropic
914
914
  # directly on its OAuth credential (subscription path), unproxied.
915
- unset ANTHROPIC_BASE_URL ANTHROPIC_SMALL_FAST_MODEL SWITCHROOM_LITELLM
915
+ unset ANTHROPIC_BASE_URL ANTHROPIC_SMALL_FAST_MODEL SWITCHROOM_LITELLM SWITCHROOM_LITELLM_BASE
916
916
  fi
917
917
  unset sr_ll_key sr_ll_ok
918
918
  fi
@@ -58590,10 +58590,10 @@ function readTurnActiveMarkerAgeMs(stateDir, now) {
58590
58590
  }
58591
58591
 
58592
58592
  // ../src/build-info.ts
58593
- var VERSION = "0.17.2";
58594
- var COMMIT_SHA = "f06074f4";
58595
- var COMMIT_DATE = "2026-07-05T09:04:48Z";
58596
- var LATEST_PR = 2834;
58593
+ var VERSION = "0.17.4";
58594
+ var COMMIT_SHA = "b842b0c9";
58595
+ var COMMIT_DATE = "2026-07-05T11:15:53Z";
58596
+ var LATEST_PR = 2839;
58597
58597
  var COMMITS_AHEAD_OF_TAG = 0;
58598
58598
 
58599
58599
  // gateway/boot-version.ts
@@ -68108,7 +68108,7 @@ function buildModelDeps(restartCtx) {
68108
68108
  return {
68109
68109
  discover: (a) => discoverModels(a),
68110
68110
  discoverSrModels: async () => {
68111
- const base = process.env.ANTHROPIC_BASE_URL;
68111
+ const base = process.env.SWITCHROOM_LITELLM_BASE ?? process.env.ANTHROPIC_BASE_URL?.replace(/\/anthropic\/?$/, "");
68112
68112
  const headers = process.env.ANTHROPIC_CUSTOM_HEADERS;
68113
68113
  if (!base || !headers)
68114
68114
  return [];
@@ -17177,7 +17177,14 @@ function buildModelDeps(restartCtx?: ModelDepsRestartContext): ModelMenuDeps & M
17177
17177
  return {
17178
17178
  discover: (a) => discoverModels(a),
17179
17179
  discoverSrModels: async () => {
17180
- const base = process.env.ANTHROPIC_BASE_URL
17180
+ // /model/info lives on the ROOT proxy (model-mapped surface), NOT the
17181
+ // Anthropic pass-through that ANTHROPIC_BASE_URL now points at
17182
+ // (<root>/anthropic). Prefer SWITCHROOM_LITELLM_BASE (the root emitted
17183
+ // by compose.ts); fall back to stripping a trailing /anthropic off
17184
+ // ANTHROPIC_BASE_URL so an agent booted from a pre-passthrough compose
17185
+ // (base_url == root) still resolves correctly.
17186
+ const base = process.env.SWITCHROOM_LITELLM_BASE
17187
+ ?? process.env.ANTHROPIC_BASE_URL?.replace(/\/anthropic\/?$/, '')
17181
17188
  const headers = process.env.ANTHROPIC_CUSTOM_HEADERS
17182
17189
  if (!base || !headers) return []
17183
17190
  const keyMatch = headers.match(/x-litellm-api-key:\s*Bearer\s*(\S+)/)