claude-use 11.33.0 → 11.35.0

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
@@ -26973,6 +26973,9 @@ function isHttpProvider(provider) {
26973
26973
  function isCodexProvider(provider) {
26974
26974
  return provider.kind === "codex";
26975
26975
  }
26976
+ function isRouterProvider(provider) {
26977
+ return provider.kind === "router";
26978
+ }
26976
26979
  function isAntigravityProvider(provider) {
26977
26980
  return provider.kind === "antigravity";
26978
26981
  }
@@ -26987,7 +26990,7 @@ function isTimeZone(name) {
26987
26990
  return false;
26988
26991
  }
26989
26992
  }
26990
- var import_node_path4, CATEGORY_NAMES, OVERRIDABLE_CATEGORIES, CategoryMapSchema, DURATION_RE, DurationSchema, WhenConditionObjectSchema, WhenSchema, EntryValueSchema, ENTRY_KEY_RE, EntriesSchema, LaunchSchema, CREDENTIAL_TARGETS, PROVIDER_CREDENTIAL_TARGETS, CREDENTIAL_TARGET_VARS, ArgvSchema, CommandSourceOptions, EnvCredentialSourceSchema, FileCredentialSourceSchema, CommandCredentialSourceSchema, OpCredentialSourceSchema, KeychainCredentialSourceSchema, LiteralCredentialSourceSchema, CredentialSourceSchema, RemoteCredentialSourceSchema, CREDENTIAL_CACHE_STORES, CredentialCacheSchema, CredentialSchema, ProviderCredentialSchema, RESERVED_PROVIDER_ENV_KEYS, ProviderEnvSchema, PROVIDER_KINDS, ANTIGRAVITY_MODES, CLAUDE_TIERS, ANTIGRAVITY_EFFORTS, ANTIGRAVITY_DEFAULT_MODE, ANTIGRAVITY_DEFAULT_MODEL, ANTIGRAVITY_DEFAULT_TIER_MODELS, ANTIGRAVITY_DEFAULT_EFFORT, AntigravityModelTargetSchema, AntigravityProviderConfigSchema, CODEX_EFFORTS, CODEX_LOGINS, CODEX_DEFAULT_LOGIN, CODEX_DEFAULT_MODEL, CODEX_DEFAULT_TIER_MODELS, CODEX_DEFAULT_EFFORT, CodexProviderConfigSchema, ProviderRouteSchema, PickerModelSchema, PickerModelsSchema, ProviderCatalogueSchema, HttpProviderSchema, CodexProviderSchema, AntigravityProviderSchema, ProviderSchema, SELECTION_MODES, VirtualModelSchema, ModelPricesSchema, ModelsConfigSchema, ModelsLayerSchema, ConfigProfileSchema, POOL_SELECTOR_PREFIX, POOL_NAME_PATTERN, IDENTITY_NAME_PATTERN, PoolNameSchema, SELECTOR_RE, IdentitySelectorSchema, PoolMemberSchema, POOL_PREFERENCES, PoolPreferenceSchema, WHOLE_PERCENT_MAX, CompactAtUtilisationSchema, PoolSchema, WEEKDAYS, AnchorSchema, JOB_WINDOWS, JobTriggerSchema, JobTargetSchema, JobSchema, DirectoryRuleSchema, DirectoryRulesSchema, PortableConfigSchema, HEADROOM_MODES, HEADROOM_CCR_MODES, HEADROOM_ROLLOUT_CHANNELS, INTERCEPT_CHANNELS, READ_MATURATION_CHANNELS, HeadroomGlobalConfigObjectSchema, HeadroomGlobalConfigSchema, HEADROOM_DEFAULT_SOURCE, HEADROOM_DEFAULT_IDLE_SHUTDOWN_MINUTES, FRONTDOOR_DEFAULT_IDLE_SHUTDOWN_MINUTES, FrontDoorGlobalConfigSchema, UPDATE_MODES, UpdateGlobalConfigSchema, GlobalConfigSchema, IdentitySchema, CategoryClassificationSchema, CategoryClassificationOverlaySchema, SHIPPED_CATEGORY_DEFAULTS;
26993
+ var import_node_path4, CATEGORY_NAMES, OVERRIDABLE_CATEGORIES, CategoryMapSchema, DURATION_RE, DurationSchema, WhenConditionObjectSchema, WhenSchema, EntryValueSchema, ENTRY_KEY_RE, EntriesSchema, LaunchSchema, CREDENTIAL_TARGETS, PROVIDER_CREDENTIAL_TARGETS, CREDENTIAL_TARGET_VARS, ArgvSchema, CommandSourceOptions, EnvCredentialSourceSchema, FileCredentialSourceSchema, CommandCredentialSourceSchema, OpCredentialSourceSchema, KeychainCredentialSourceSchema, LiteralCredentialSourceSchema, CredentialSourceSchema, RemoteCredentialSourceSchema, CREDENTIAL_CACHE_STORES, CredentialCacheSchema, CredentialSchema, ProviderCredentialSchema, RESERVED_PROVIDER_ENV_KEYS, ProviderEnvSchema, PROVIDER_KINDS, ANTIGRAVITY_MODES, CLAUDE_TIERS, ANTIGRAVITY_EFFORTS, ANTIGRAVITY_DEFAULT_MODE, ANTIGRAVITY_DEFAULT_MODEL, ANTIGRAVITY_DEFAULT_TIER_MODELS, ANTIGRAVITY_DEFAULT_EFFORT, AntigravityModelTargetSchema, AntigravityProviderConfigSchema, CODEX_EFFORTS, CODEX_LOGINS, CODEX_DEFAULT_LOGIN, CODEX_DEFAULT_MODEL, CODEX_DEFAULT_TIER_MODELS, CODEX_DEFAULT_EFFORT, CodexProviderConfigSchema, ProviderRouteSchema, PickerModelSchema, PickerModelsSchema, ProviderCatalogueSchema, HttpProviderSchema, CodexProviderSchema, RouterProviderSchema, AntigravityProviderSchema, ProviderSchema, SELECTION_MODES, VirtualModelSchema, ModelPricesSchema, ModelsConfigSchema, ModelsLayerSchema, ConfigProfileSchema, POOL_SELECTOR_PREFIX, POOL_NAME_PATTERN, IDENTITY_NAME_PATTERN, PoolNameSchema, SELECTOR_RE, IdentitySelectorSchema, PoolMemberSchema, POOL_PREFERENCES, PoolPreferenceSchema, WHOLE_PERCENT_MAX, CompactAtUtilisationSchema, PoolSchema, WEEKDAYS, AnchorSchema, JOB_WINDOWS, JobTriggerSchema, JobTargetSchema, JobSchema, DirectoryRuleSchema, DirectoryRulesSchema, PortableConfigSchema, HEADROOM_MODES, HEADROOM_CCR_MODES, HEADROOM_ROLLOUT_CHANNELS, INTERCEPT_CHANNELS, READ_MATURATION_CHANNELS, HeadroomGlobalConfigObjectSchema, HeadroomGlobalConfigSchema, HEADROOM_DEFAULT_SOURCE, HEADROOM_DEFAULT_IDLE_SHUTDOWN_MINUTES, FRONTDOOR_DEFAULT_IDLE_SHUTDOWN_MINUTES, FrontDoorGlobalConfigSchema, UPDATE_MODES, UpdateGlobalConfigSchema, GlobalConfigSchema, IdentitySchema, CategoryClassificationSchema, CategoryClassificationOverlaySchema, SHIPPED_CATEGORY_DEFAULTS;
26991
26994
  var init_schema = __esm({
26992
26995
  "src/config/schema.ts"() {
26993
26996
  "use strict";
@@ -27032,6 +27035,8 @@ var init_schema = __esm({
27032
27035
  delay: external_exports.string().regex(DURATION_RE, "must be a duration such as 5s or 500ms").optional(),
27033
27036
  /** Whether the launcher waits for a key press after its own output before it starts claude. Takes the place of `delay` when both are set. Applies only when a terminal is watching. */
27034
27037
  pause: external_exports.boolean().optional(),
27038
+ /** Whether a provider session routes provider-qualified model names (`z/glm-5.3`, `auto`) through the `models` block to the provider that serves them, instead of sending every request to the launch provider. */
27039
+ routeByName: external_exports.boolean().optional(),
27035
27040
  /** Whether the launcher's report, for a launch that picks from a pool, lists every member the pick ranked with why each stands where it does, and not only the member it picked. */
27036
27041
  explain: external_exports.boolean().optional()
27037
27042
  });
@@ -27092,7 +27097,7 @@ var init_schema = __esm({
27092
27097
  ProviderEnvSchema = external_exports.record(external_exports.string().min(1), external_exports.string()).refine((env) => !Object.keys(env).some((key) => RESERVED_PROVIDER_ENV_KEYS.includes(key)), {
27093
27098
  message: `env may not set ${RESERVED_PROVIDER_ENV_KEYS.join(", ")}: the credential block's target sets one and agent-shim removes the others`
27094
27099
  });
27095
- PROVIDER_KINDS = ["http", "codex", "antigravity"];
27100
+ PROVIDER_KINDS = ["http", "codex", "antigravity", "router"];
27096
27101
  ANTIGRAVITY_MODES = ["cloud", "local"];
27097
27102
  CLAUDE_TIERS = ["fable", "opus", "sonnet", "haiku"];
27098
27103
  ANTIGRAVITY_EFFORTS = ["none", "low", "medium", "high", "xhigh", "max"];
@@ -27205,6 +27210,11 @@ var init_schema = __esm({
27205
27210
  pickerModels: PickerModelsSchema.optional(),
27206
27211
  codex: CodexProviderConfigSchema.optional()
27207
27212
  });
27213
+ RouterProviderSchema = external_exports.strictObject({
27214
+ $schema: external_exports.string().optional(),
27215
+ kind: external_exports.literal("router"),
27216
+ displayName: external_exports.string().min(1)
27217
+ });
27208
27218
  AntigravityProviderSchema = external_exports.strictObject({
27209
27219
  $schema: external_exports.string().optional(),
27210
27220
  kind: external_exports.literal("antigravity"),
@@ -27215,7 +27225,7 @@ var init_schema = __esm({
27215
27225
  pickerModels: PickerModelsSchema.optional(),
27216
27226
  antigravity: AntigravityProviderConfigSchema.optional()
27217
27227
  });
27218
- ProviderSchema = external_exports.discriminatedUnion("kind", [HttpProviderSchema, CodexProviderSchema, AntigravityProviderSchema]);
27228
+ ProviderSchema = external_exports.discriminatedUnion("kind", [HttpProviderSchema, CodexProviderSchema, AntigravityProviderSchema, RouterProviderSchema]);
27219
27229
  SELECTION_MODES = ["ordered", "most-allowance", "soonest-reset", "spread", "adaptive", "lowest-latency", "highest-success", "cheapest"];
27220
27230
  VirtualModelSchema = external_exports.strictObject({
27221
27231
  /** How the virtual model chooses its member for a request. */
@@ -32621,6 +32631,9 @@ function flattenLayers(layers, options) {
32621
32631
  if (layer.launch.explain !== void 0) {
32622
32632
  launch.explain = layer.launch.explain;
32623
32633
  }
32634
+ if (layer.launch.routeByName !== void 0) {
32635
+ launch.routeByName = layer.launch.routeByName;
32636
+ }
32624
32637
  }
32625
32638
  if (layer.models !== void 0) {
32626
32639
  models = mergeModels(models, layer.models);
@@ -34432,7 +34445,7 @@ var init_package = __esm({
34432
34445
  "package.json"() {
34433
34446
  package_default = {
34434
34447
  name: "claude-use",
34435
- version: "11.33.0",
34448
+ version: "11.35.0",
34436
34449
  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.",
34437
34450
  license: "MIT",
34438
34451
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -34697,6 +34710,7 @@ function identifyRequest(headers) {
34697
34710
  sessionId: internalHeaderValue(headers, SESSION_HEADER),
34698
34711
  provider: internalHeaderValue(headers, PROVIDER_HEADER),
34699
34712
  headroom: internalHeaderValue(headers, HEADROOM_FLAG_HEADER) === "1",
34713
+ routeByName: internalHeaderValue(headers, ROUTE_BY_NAME_HEADER) === "1",
34700
34714
  projectId: internalHeaderValue(headers, PROJECT_ID_HEADER)
34701
34715
  },
34702
34716
  forwardableHeaders: forwardable
@@ -34716,7 +34730,7 @@ function parseProviderPath(path65) {
34716
34730
  }
34717
34731
  return { provider: decodeURIComponent(tail.slice(0, slash)), rest: tail.slice(slash) };
34718
34732
  }
34719
- var HEADROOM_SESSION_HEADER, INTERNAL_HEADER_NAMES, IDENTITY_HEADER, SESSION_HEADER, PROVIDER_HEADER, HEADROOM_FLAG_HEADER, PROJECT_ID_HEADER, CLIENT_SESSION_HEADER, HEADROOM_BASE_URL_HEADER, AUTH_HEADER, HOP_SECRET_HEADER, HOP_ID_HEADER, PROVIDER_PATH_PREFIX;
34733
+ var HEADROOM_SESSION_HEADER, INTERNAL_HEADER_NAMES, IDENTITY_HEADER, SESSION_HEADER, PROVIDER_HEADER, HEADROOM_FLAG_HEADER, ROUTE_BY_NAME_HEADER, PROJECT_ID_HEADER, CLIENT_SESSION_HEADER, HEADROOM_BASE_URL_HEADER, AUTH_HEADER, HOP_SECRET_HEADER, HOP_ID_HEADER, PROVIDER_PATH_PREFIX;
34720
34734
  var init_route = __esm({
34721
34735
  "src/frontdoor/route.ts"() {
34722
34736
  "use strict";
@@ -34725,6 +34739,7 @@ var init_route = __esm({
34725
34739
  "x-agent-shim-identity",
34726
34740
  "x-agent-shim-session",
34727
34741
  "x-agent-shim-headroom",
34742
+ "x-agent-shim-route-by-name",
34728
34743
  "x-agent-shim-auth",
34729
34744
  "x-agent-shim-provider",
34730
34745
  "x-agent-shim-hop",
@@ -34737,6 +34752,7 @@ var init_route = __esm({
34737
34752
  SESSION_HEADER = "x-agent-shim-session";
34738
34753
  PROVIDER_HEADER = "x-agent-shim-provider";
34739
34754
  HEADROOM_FLAG_HEADER = "x-agent-shim-headroom";
34755
+ ROUTE_BY_NAME_HEADER = "x-agent-shim-route-by-name";
34740
34756
  PROJECT_ID_HEADER = "x-headroom-project-id";
34741
34757
  CLIENT_SESSION_HEADER = "x-claude-code-session-id";
34742
34758
  HEADROOM_BASE_URL_HEADER = "x-headroom-base-url";
@@ -36112,7 +36128,7 @@ function describeProviderEndpoint(provider) {
36112
36128
  if (isAntigravityProvider(provider)) {
36113
36129
  return (provider.antigravity?.mode ?? ANTIGRAVITY_DEFAULT_MODE) === "local" ? "antigravity local (ACP daemon)" : "antigravity cloud (Gemini API)";
36114
36130
  }
36115
- return provider.baseUrl;
36131
+ return isRouterProvider(provider) ? "the models block" : provider.baseUrl;
36116
36132
  }
36117
36133
  function isEmptyCodexConfig(config2) {
36118
36134
  return config2 === void 0 || config2.defaultModel === void 0 && config2.effort === void 0 && config2.login === void 0 && (config2.models === void 0 || Object.keys(config2.models).length === 0);
@@ -36134,10 +36150,16 @@ function addProvider(paths, name, input2) {
36134
36150
  if (kind === "antigravity" && input2.baseUrl !== void 0) {
36135
36151
  throw new ProviderKindMismatchError("An antigravity provider has no base URL: the launcher points its sessions at the front-door daemon. Drop --base-url.");
36136
36152
  }
36153
+ if (kind === "router" && input2.baseUrl !== void 0) {
36154
+ throw new ProviderKindMismatchError("A router provider has no base URL: it resolves each request's model name through the models block. Drop --base-url.");
36155
+ }
36137
36156
  if (kind === "http" && input2.baseUrl === void 0) {
36138
36157
  throw new ProviderKindMismatchError("An http provider needs --base-url.");
36139
36158
  }
36140
- if (kind !== "http" && input2.catalogue !== void 0) {
36159
+ if (kind === "router" && (input2.sources.length > 0 || input2.target !== void 0 || input2.env !== void 0 || input2.pickerModels !== void 0)) {
36160
+ throw new ProviderKindMismatchError("A router provider has no credential, env or picker models of its own: the models block's targets carry their own.");
36161
+ }
36162
+ if (kind !== "http" && kind !== "router" && input2.catalogue !== void 0) {
36141
36163
  throw new ProviderKindMismatchError("A model catalogue applies only to an http provider.");
36142
36164
  }
36143
36165
  if (kind !== "codex" && !isEmptyCodexConfig(input2.codex)) {
@@ -36153,7 +36175,7 @@ function addProvider(paths, name, input2) {
36153
36175
  ...input2.pickerModels === void 0 || input2.pickerModels.length === 0 ? {} : { pickerModels: input2.pickerModels }
36154
36176
  };
36155
36177
  const parsed = ProviderSchema.safeParse(
36156
- kind === "codex" ? { kind, ...shared, ...isEmptyCodexConfig(input2.codex) ? {} : { codex: input2.codex } } : kind === "antigravity" ? { kind, ...shared, ...isEmptyAntigravityConfig(input2.antigravity) ? {} : { antigravity: input2.antigravity } } : { ...shared, baseUrl: input2.baseUrl, ...input2.catalogue === void 0 ? {} : { catalogue: input2.catalogue } }
36178
+ kind === "router" ? { kind, displayName: input2.displayName } : kind === "codex" ? { kind, ...shared, ...isEmptyCodexConfig(input2.codex) ? {} : { codex: input2.codex } } : kind === "antigravity" ? { kind, ...shared, ...isEmptyAntigravityConfig(input2.antigravity) ? {} : { antigravity: input2.antigravity } } : { ...shared, baseUrl: input2.baseUrl, ...input2.catalogue === void 0 ? {} : { catalogue: input2.catalogue } }
36157
36179
  );
36158
36180
  if (!parsed.success) {
36159
36181
  throw new ConfigValidationError(providerJsonPath(paths, name), parsed.error.issues);
@@ -36167,15 +36189,18 @@ function updateProvider(paths, name, input2) {
36167
36189
  throw new ProviderNotFoundError(name);
36168
36190
  }
36169
36191
  const unset = new Set(input2.unsetEnv);
36170
- const env = Object.fromEntries(Object.entries({ ...existing.env, ...input2.env }).filter(([key]) => !unset.has(key)));
36192
+ const existingEnv = isRouterProvider(existing) ? {} : existing.env;
36193
+ const env = Object.fromEntries(Object.entries({ ...existingEnv, ...input2.env }).filter(([key]) => !unset.has(key)));
36171
36194
  const unsetPicker = new Set(input2.unsetPickerModels);
36172
36195
  const added = new Map((input2.pickerModels ?? []).map((entry) => [entry.model, entry]));
36196
+ const existingPicker = isRouterProvider(existing) ? [] : existing.pickerModels;
36173
36197
  const pickerModels = [
36174
- ...(existing.pickerModels ?? []).filter((entry) => !unsetPicker.has(entry.model)).map((entry) => added.get(entry.model) ?? entry),
36175
- ...[...added.values()].filter((entry) => !(existing.pickerModels ?? []).some((kept) => kept.model === entry.model))
36198
+ ...(existingPicker ?? []).filter((entry) => !unsetPicker.has(entry.model)).map((entry) => added.get(entry.model) ?? entry),
36199
+ ...[...added.values()].filter((entry) => !(existingPicker ?? []).some((kept) => kept.model === entry.model))
36176
36200
  ];
36177
- const target = input2.target ?? existing.credential.target;
36178
- const cache = input2.cache === void 0 ? existing.credential.cache : input2.cache === false ? void 0 : input2.cache;
36201
+ const router = isRouterProvider(existing);
36202
+ const target = router ? void 0 : input2.target ?? existing.credential.target;
36203
+ const cache = router ? void 0 : input2.cache === void 0 ? existing.credential.cache : input2.cache === false ? void 0 : input2.cache;
36179
36204
  if (isCodexProvider(existing) && input2.baseUrl !== void 0) {
36180
36205
  throw new ProviderKindMismatchError(`Provider "${name}" is a codex provider, which has no base URL.`);
36181
36206
  }
@@ -36193,10 +36218,12 @@ function updateProvider(paths, name, input2) {
36193
36218
  }
36194
36219
  const shared = {
36195
36220
  ...input2.displayName === void 0 ? {} : { displayName: input2.displayName },
36196
- credential: {
36197
- sources: input2.sources ?? existing.credential.sources,
36198
- ...target === void 0 ? {} : { target },
36199
- ...cache === void 0 ? {} : { cache }
36221
+ ...router ? {} : {
36222
+ credential: {
36223
+ sources: input2.sources ?? existing.credential.sources,
36224
+ ...target === void 0 ? {} : { target },
36225
+ ...cache === void 0 ? {} : { cache }
36226
+ }
36200
36227
  },
36201
36228
  env: Object.keys(env).length === 0 ? void 0 : env,
36202
36229
  pickerModels: pickerModels.length === 0 ? void 0 : pickerModels
@@ -36216,6 +36243,8 @@ function updateProvider(paths, name, input2) {
36216
36243
  ...existing.antigravity?.models === void 0 && input2.antigravity?.models === void 0 ? {} : { models: { ...existing.antigravity?.models, ...input2.antigravity?.models } }
36217
36244
  };
36218
36245
  candidate = { ...existing, ...shared, antigravity: isEmptyAntigravityConfig(antigravity) ? void 0 : antigravity };
36246
+ } else if (router) {
36247
+ candidate = { kind: "router", ...shared };
36219
36248
  } else {
36220
36249
  const catalogue = input2.catalogue === void 0 ? existing.catalogue : input2.catalogue === false ? void 0 : input2.catalogue;
36221
36250
  candidate = { ...existing, ...shared, catalogue, ...input2.baseUrl === void 0 ? {} : { baseUrl: input2.baseUrl } };
@@ -36265,6 +36294,9 @@ function resolveProvider(params) {
36265
36294
  return selection;
36266
36295
  }
36267
36296
  const { name, definition } = selection.provider;
36297
+ if (isRouterProvider(definition)) {
36298
+ return { ok: true, provider: { name, definition, credential: { target: "bearer", token: "", source: { env: "AGENT_SHIM_ROUTER" }, warnings: [] } }, warnings: [] };
36299
+ }
36268
36300
  if (params.credentials === void 0) {
36269
36301
  return { ok: false, status: 1, message: `agent-shim: provider ${name} needs its credential resolved, but this launcher has no credential port wired` };
36270
36302
  }
@@ -63240,7 +63272,8 @@ var init_argv = __esm({
63240
63272
  { flag: "--remote-control", key: "remoteControl" },
63241
63273
  { flag: "--wait", key: "wait" },
63242
63274
  { flag: "--pause", key: "pause" },
63243
- { flag: "--explain", key: "explain" }
63275
+ { flag: "--explain", key: "explain" },
63276
+ { flag: "--route-by-name", key: "routeByName" }
63244
63277
  ];
63245
63278
  LAUNCHER_FLAG_NAMES = [
63246
63279
  ...VALUED_FLAGS,
@@ -63430,6 +63463,7 @@ function resolveLaunchFlags(params) {
63430
63463
  trackUsage: params.flags?.trackUsage ?? parseEnvBool("AGENT_SHIM_TRACK_USAGE", params.env.AGENT_SHIM_TRACK_USAGE) ?? params.cascade?.trackUsage ?? true,
63431
63464
  pause: params.flags?.pause ?? parseEnvBool("AGENT_SHIM_PAUSE", params.env.AGENT_SHIM_PAUSE) ?? params.cascade?.pause ?? false,
63432
63465
  explain: params.flags?.explain ?? parseEnvBool("AGENT_SHIM_EXPLAIN", params.env.AGENT_SHIM_EXPLAIN) ?? params.cascade?.explain ?? false,
63466
+ routeByName: params.flags?.routeByName ?? parseEnvBool("AGENT_SHIM_ROUTE_BY_NAME", params.env.AGENT_SHIM_ROUTE_BY_NAME) ?? params.cascade?.routeByName ?? false,
63433
63467
  delayMs: resolveDelayMs(params)
63434
63468
  };
63435
63469
  }
@@ -63470,7 +63504,7 @@ function buildEnv(params) {
63470
63504
  env.CLAUDE_CONFIG_DIR = import_node_path40.default.join(params.identitiesDir, params.resolvedIdentityName);
63471
63505
  }
63472
63506
  if (params.provider !== void 0) {
63473
- const providerEnv = params.provider.definition.env ?? {};
63507
+ const providerEnv = params.provider.definition.kind !== void 0 && params.provider.definition.kind !== "http" ? {} : params.provider.definition.env ?? {};
63474
63508
  providerCustomHeaders = providerEnv.ANTHROPIC_CUSTOM_HEADERS;
63475
63509
  env.ANTHROPIC_BASE_URL = void 0;
63476
63510
  env.AGENT_SHIM_PROVIDER = params.provider.definition.displayName;
@@ -63498,6 +63532,7 @@ function buildEnv(params) {
63498
63532
  { name: SESSION_HEADER, value: params.sessionId },
63499
63533
  { name: AUTH_HEADER, value: params.frontdoor.sessionToken },
63500
63534
  ...params.provider === void 0 ? [] : [{ name: PROVIDER_HEADER, value: params.provider.name }],
63535
+ ...params.routeByName ? [{ name: ROUTE_BY_NAME_HEADER, value: "1" }] : [],
63501
63536
  ...params.headroom === void 0 ? [] : [
63502
63537
  { name: HEADROOM_FLAG_HEADER, value: "1" },
63503
63538
  { name: PROJECT_ID_HEADER, value: params.headroom.projectId }
@@ -65174,8 +65209,8 @@ function catalogueRows(provider, models) {
65174
65209
  return filterCatalogue(models, provider.catalogue).map((model) => ({ model: model.id, label: labelOf(model.id), description: describedAs(model.id, model.name === void 0 ? "Listed by the provider" : `Listed by the provider as ${model.name}`), behavesAs: TIER_BEHAVES_AS[tier] })).sort((left, right) => left.model.localeCompare(right.model));
65175
65210
  }
65176
65211
  function providerModelRows(provider, catalogue = []) {
65177
- const derived2 = provider.kind === "codex" ? codexRows(provider) : provider.kind === "antigravity" ? antigravityRows(provider) : httpRows(provider);
65178
- const declared = (provider.pickerModels ?? []).map(declaredRow);
65212
+ const derived2 = provider.kind === "codex" ? codexRows(provider) : provider.kind === "antigravity" ? antigravityRows(provider) : provider.kind === "router" ? [] : httpRows(provider);
65213
+ const declared = provider.kind === "router" ? [] : (provider.pickerModels ?? []).map(declaredRow);
65179
65214
  const declaredModels = new Set(declared.map((row) => row.model));
65180
65215
  const named = [...derived2.filter((row) => !declaredModels.has(row.model)), ...declared];
65181
65216
  const taken = new Set(named.map((row) => labelOf(row.model)));
@@ -65619,6 +65654,7 @@ function decideLaunch(params, readOnly) {
65619
65654
  ...parsedArgv.trackUsage === void 0 ? {} : { trackUsage: parsedArgv.trackUsage },
65620
65655
  ...parsedArgv.pause === void 0 ? {} : { pause: parsedArgv.pause },
65621
65656
  ...parsedArgv.explain === void 0 ? {} : { explain: parsedArgv.explain },
65657
+ ...parsedArgv.routeByName === void 0 ? {} : { routeByName: parsedArgv.routeByName },
65622
65658
  ...parsedArgv.delay === void 0 ? {} : { delay: parsedArgv.delay }
65623
65659
  }
65624
65660
  });
@@ -65762,7 +65798,8 @@ function prepareLaunch(params) {
65762
65798
  ...frontDoor === void 0 ? {} : { frontdoor: frontDoor },
65763
65799
  ...headroom === void 0 ? {} : { headroom },
65764
65800
  sessionId,
65765
- remoteControl: resolvedFlags.remoteControl
65801
+ remoteControl: resolvedFlags.remoteControl,
65802
+ routeByName: resolvedFlags.routeByName || resolvedProvider !== void 0 && isRouterProvider(resolvedProvider.definition)
65766
65803
  });
65767
65804
  const releases = [...headroom === void 0 || headroomPort === void 0 ? [] : [headroomPort.release], ...frontDoorRelease === void 0 ? [] : [frontDoorRelease]];
65768
65805
  const release = () => {
@@ -65789,11 +65826,12 @@ function resolveLaunch(params) {
65789
65826
  ...frontDoor ? { frontdoor: { port: 0, connectPort: 0, trustBundlePath: "", sessionToken: "" } } : {},
65790
65827
  ...decided.flags.headroom ? { headroom: { socketPath: "", projectId: "" } } : {},
65791
65828
  sessionId: "",
65792
- remoteControl: decided.flags.remoteControl
65829
+ remoteControl: decided.flags.remoteControl,
65830
+ routeByName: decided.flags.routeByName
65793
65831
  });
65794
65832
  const credentialNames = decided.identityCredentialBlock === void 0 ? [] : Object.keys(credentialVariables(decided.identityCredentialBlock.target ?? "bearer", ""));
65795
65833
  const environment = [.../* @__PURE__ */ new Set([...Object.keys(built).filter((name) => built[name] !== env[name]), ...credentialNames])].sort();
65796
- const credential = decided.provider !== void 0 ? { subject: "provider", name: decided.provider.name, summary: summariseCredential(decided.provider.definition.credential) } : decided.identityCredentialBlock !== void 0 && decided.farmIdentity !== void 0 ? { subject: "identity", name: decided.farmIdentity, summary: summariseCredential(decided.identityCredentialBlock) } : void 0;
65834
+ const credential = decided.provider !== void 0 ? isRouterProvider(decided.provider.definition) ? void 0 : { subject: "provider", name: decided.provider.name, summary: summariseCredential(decided.provider.definition.credential) } : decided.identityCredentialBlock !== void 0 && decided.farmIdentity !== void 0 ? { subject: "identity", name: decided.farmIdentity, summary: summariseCredential(decided.identityCredentialBlock) } : void 0;
65797
65835
  return {
65798
65836
  decision: decided.decision,
65799
65837
  flags: decided.flags,
@@ -65801,7 +65839,7 @@ function resolveLaunch(params) {
65801
65839
  bin: decided.bin,
65802
65840
  args: decided.args,
65803
65841
  ...credential === void 0 ? {} : { credential },
65804
- routing: { frontDoor, headroom: decided.flags.headroom },
65842
+ routing: { frontDoor, headroom: decided.flags.headroom, routeByName: decided.flags.routeByName },
65805
65843
  environment
65806
65844
  };
65807
65845
  }
@@ -66365,7 +66403,7 @@ function createProviderLookup(ports) {
66365
66403
  return {
66366
66404
  baseUrl,
66367
66405
  apiKey: () => {
66368
- const resolution = resolveCredential({ credential: definition.credential, env: ports.env, port: ports.credentials, subject: `provider ${name}` });
66406
+ const resolution = resolveCredential({ credential: isRouterProvider(definition) ? { sources: [] } : definition.credential, env: ports.env, port: ports.credentials, subject: `provider ${name}` });
66369
66407
  if (!resolution.ok) {
66370
66408
  throw new Error(resolution.message);
66371
66409
  }
@@ -111816,6 +111854,9 @@ function applyProfileChange(paths, name, change) {
111816
111854
  if (change.launchExplain !== void 0) {
111817
111855
  launchPatch.explain = change.launchExplain;
111818
111856
  }
111857
+ if (change.launchRouteByName !== void 0) {
111858
+ launchPatch.routeByName = change.launchRouteByName;
111859
+ }
111819
111860
  if (Object.keys(launchPatch).length > 0) {
111820
111861
  setProfileLaunchFlags(paths, name, launchPatch);
111821
111862
  touched = true;
@@ -113102,7 +113143,7 @@ function registerProfileCommand(program2, deps) {
113102
113143
  withExamples(
113103
113144
  profile.command("set <name>").description(
113104
113145
  "Update a configuration profile's categories, entries, extends list, description or launch settings. With no options on a terminal, walks through its categories."
113105
- ).option("--category <category=bool>", "Share (true) or hide (false) a whole category (repeatable).", collectBoolPair).option("--entry <path=bool>", "Share (true) or hide (false) one <category>/<path> entry (repeatable).", collectBoolPair).option("--extends <profile>", "Replace the extends list with these profiles (repeatable, in order).", collectRepeated).option("--no-extends", "Clear the extends list.").option("--description <text>", "Replace the description.").option("--no-description", "Clear the description.").option("--launch-skip-permissions", "Launches under this profile skip permission prompts.").option("--no-launch-skip-permissions", "Launches under this profile keep permission prompts.").option("--launch-remote-control", "Launches under this profile enable Remote Control.").option("--no-launch-remote-control", "Launches under this profile leave Remote Control off.").option("--launch-headroom", "Launches under this profile route through headroom.").option("--no-launch-headroom", "Launches under this profile route direct.").option("--launch-track-usage", "Launches under this profile route through the front door so their requests and quota are recorded, with no headroom needed.").option("--no-launch-track-usage", "Launches under this profile are not recorded unless a provider or headroom routes them anyway.").option("--launch-provider <provider>", "Launches under this profile route through this provider.").option("--no-launch-provider", "Clear this profile's provider selection.").option("--launch-claude-version <version>", "Launches under this profile run exactly this installed Claude Code version (such as 2.1.220); a version that is not installed fails the launch.").option("--no-launch-claude-version", "Clear this profile's Claude Code version pin.").option("--launch-delay <duration>", "Launches under this profile wait this long (such as 5s) after the launcher's own output before starting claude, so the output can be read.", parseDurationLiteral).option("--no-launch-delay", "Clear this profile's launch delay.").option("--launch-pause", "Launches under this profile wait for a key press after the launcher's own output before starting claude.").option("--no-launch-pause", "Launches under this profile start claude without waiting for a key press.").option("--launch-explain", "Launches under this profile that pick from a pool list every member the pick ranked and why, in the launcher's report.").option("--no-launch-explain", "Launches under this profile name only the member a pool pick chose.").option("--json", "Print the result as JSON.").action(async (name, allOptions) => {
113146
+ ).option("--category <category=bool>", "Share (true) or hide (false) a whole category (repeatable).", collectBoolPair).option("--entry <path=bool>", "Share (true) or hide (false) one <category>/<path> entry (repeatable).", collectBoolPair).option("--extends <profile>", "Replace the extends list with these profiles (repeatable, in order).", collectRepeated).option("--no-extends", "Clear the extends list.").option("--description <text>", "Replace the description.").option("--no-description", "Clear the description.").option("--launch-skip-permissions", "Launches under this profile skip permission prompts.").option("--no-launch-skip-permissions", "Launches under this profile keep permission prompts.").option("--launch-remote-control", "Launches under this profile enable Remote Control.").option("--no-launch-remote-control", "Launches under this profile leave Remote Control off.").option("--launch-headroom", "Launches under this profile route through headroom.").option("--no-launch-headroom", "Launches under this profile route direct.").option("--launch-track-usage", "Launches under this profile route through the front door so their requests and quota are recorded, with no headroom needed.").option("--no-launch-track-usage", "Launches under this profile are not recorded unless a provider or headroom routes them anyway.").option("--launch-provider <provider>", "Launches under this profile route through this provider.").option("--no-launch-provider", "Clear this profile's provider selection.").option("--launch-claude-version <version>", "Launches under this profile run exactly this installed Claude Code version (such as 2.1.220); a version that is not installed fails the launch.").option("--no-launch-claude-version", "Clear this profile's Claude Code version pin.").option("--launch-delay <duration>", "Launches under this profile wait this long (such as 5s) after the launcher's own output before starting claude, so the output can be read.", parseDurationLiteral).option("--no-launch-delay", "Clear this profile's launch delay.").option("--launch-pause", "Launches under this profile wait for a key press after the launcher's own output before starting claude.").option("--no-launch-pause", "Launches under this profile start claude without waiting for a key press.").option("--launch-explain", "Launches under this profile that pick from a pool list every member the pick ranked and why, in the launcher's report.").option("--no-launch-explain", "Launches under this profile name only the member a pool pick chose.").option("--launch-route-by-name", "Launches under this profile route provider-qualified model names through the models block to the provider that serves them.").option("--no-launch-route-by-name", "Launches under this profile send every request to the launch provider.").option("--json", "Print the result as JSON.").action(async (name, allOptions) => {
113106
113147
  const { json: json2, ...options } = allOptions;
113107
113148
  requireProfileExists(paths, name);
113108
113149
  if (Object.entries(allOptions).every(([key, value2]) => key === "json" || value2 === void 0)) {
@@ -113732,11 +113773,12 @@ function cachedState(cacheEnv, owner, block2) {
113732
113773
  function buildCredentialReport(provider, identity, identityName, cacheEnv) {
113733
113774
  const identityCredential = identity?.credential === void 0 ? void 0 : summariseCredential(identity.credential);
113734
113775
  const identityCached = identity?.credential === void 0 || identityName === void 0 ? void 0 : cachedState(cacheEnv, `identity ${identityName}`, identity.credential);
113735
- const providerCached = provider?.definition === void 0 ? void 0 : cachedState(cacheEnv, `provider ${provider.name}`, provider.definition.credential);
113776
+ const providerCredential = provider?.definition !== void 0 && !isRouterProvider(provider.definition) ? provider.definition.credential : void 0;
113777
+ const providerCached = providerCredential === void 0 || provider === void 0 ? void 0 : cachedState(cacheEnv, `provider ${provider.name}`, providerCredential);
113736
113778
  return {
113737
113779
  applies: provider !== void 0 ? "provider" : identityCredential !== void 0 ? "identity" : "stored-login",
113738
113780
  ...provider === void 0 ? {} : {
113739
- provider: provider.problem === void 0 ? { name: provider.name, credential: summariseCredential(provider.definition.credential), ...providerCached === void 0 ? {} : { cached: providerCached } } : { name: provider.name, problem: provider.problem }
113781
+ provider: provider.problem === void 0 ? { name: provider.name, ...providerCredential === void 0 ? {} : { credential: summariseCredential(providerCredential), ...providerCached === void 0 ? {} : { cached: providerCached } } } : { name: provider.name, problem: provider.problem }
113740
113782
  },
113741
113783
  ...identityCredential === void 0 ? {} : { identity: identityCredential },
113742
113784
  ...identityCached === void 0 ? {} : { identityCached }
@@ -113831,7 +113873,7 @@ function formatCheckReport(report) {
113831
113873
  const { credential } = report;
113832
113874
  if (credential.provider !== void 0) {
113833
113875
  lines.push(
113834
- ` Provider ${credential.provider.name}: ${credential.provider.credential === void 0 ? `unusable: ${credential.provider.problem}` : formatCredentialSummary(credential.provider.credential)}${credential.provider.cached === void 0 ? "" : `; ${formatCachedCredentialState(credential.provider.cached)}`}`
113876
+ ` Provider ${credential.provider.name}: ${credential.provider.credential === void 0 ? `unusable: ${credential.provider.problem ?? ""}` : formatCredentialSummary(credential.provider.credential)}${credential.provider.cached === void 0 ? "" : `; ${formatCachedCredentialState(credential.provider.cached)}`}`
113835
113877
  );
113836
113878
  }
113837
113879
  if (credential.identity !== void 0) {
@@ -119586,9 +119628,11 @@ function pushProvider(push, entry, cacheEnv, signIn) {
119586
119628
  if (validated2.ignored.length > 0) {
119587
119629
  push("provider", "warn", describeIgnoredKeys(entry.path, validated2.ignored), entry.name);
119588
119630
  }
119589
- const cache = cacheClause(cacheEnv, `provider ${entry.name}`, validated2.data.credential);
119590
- push("provider", cache.unreadable ? "fail" : "pass", `${entry.name} is valid (${describeProviderEndpoint(validated2.data)}, credential ${describeCredential(validated2.data.credential)})${cache.text}.`, entry.name);
119591
- if (validated2.data.env?.ENABLE_TOOL_SEARCH === void 0) {
119631
+ const router = isRouterProvider(validated2.data);
119632
+ const noCache = { unreadable: false, text: "" };
119633
+ const cache = router ? noCache : cacheClause(cacheEnv, `provider ${entry.name}`, validated2.data.credential);
119634
+ push("provider", cache.unreadable ? "fail" : "pass", router ? `${entry.name} is valid (${describeProviderEndpoint(validated2.data)})` : `${entry.name} is valid (${describeProviderEndpoint(validated2.data)}, credential ${describeCredential(validated2.data.credential)})${cache.text}.`, entry.name);
119635
+ if (!router && validated2.data.env?.ENABLE_TOOL_SEARCH === void 0) {
119592
119636
  push("provider", "warn", `${entry.name} does not set ENABLE_TOOL_SEARCH: a session on this provider keeps Claude Code's own API as its base URL, so it defers MCP tool loading and sends tool_reference payloads the upstream backend must understand. Set ENABLE_TOOL_SEARCH=false in the provider's env block to load tools upfront instead, when the backend does not support them.`, entry.name);
119593
119637
  }
119594
119638
  if (signIn !== void 0 && isCodexProvider(validated2.data) && validated2.data.codex?.login === "chatgpt-sign-in") {
@@ -125491,7 +125535,7 @@ var CachedCredentialStateSchema = external_exports.union([
125491
125535
  external_exports.strictObject({ store: external_exports.enum(CREDENTIAL_CACHE_STORES), status: external_exports.enum(["fresh", "expired"]), ageMs: external_exports.number(), expiresInMs: external_exports.number().optional() })
125492
125536
  ]);
125493
125537
  var CheckCredentialProviderSchema = external_exports.union([
125494
- external_exports.strictObject({ name: external_exports.string(), credential: CredentialSummarySchema, cached: CachedCredentialStateSchema.optional() }),
125538
+ external_exports.strictObject({ name: external_exports.string(), credential: CredentialSummarySchema.optional(), cached: CachedCredentialStateSchema.optional() }),
125495
125539
  external_exports.strictObject({ name: external_exports.string(), problem: external_exports.string() })
125496
125540
  ]);
125497
125541
  var CheckCredentialSchema = external_exports.strictObject({
@@ -128140,7 +128184,7 @@ var ProviderValueSchema = external_exports.strictObject({
128140
128184
  displayName: external_exports.string(),
128141
128185
  baseUrl: external_exports.string().optional(),
128142
128186
  codex: CodexProviderConfigSchema.optional(),
128143
- credential: CredentialSummarySchema2,
128187
+ credential: CredentialSummarySchema2.optional(),
128144
128188
  env: external_exports.record(external_exports.string(), external_exports.string()).optional()
128145
128189
  });
128146
128190
  var ConfigNameInputSchema = external_exports.strictObject({ name: external_exports.string().min(1) });
@@ -128178,7 +128222,8 @@ var ConfigProfileSetInputSchema = external_exports.strictObject({
128178
128222
  claudeVersion: external_exports.union([external_exports.string().min(1), external_exports.literal(false)]).optional(),
128179
128223
  delay: external_exports.union([external_exports.string().regex(DURATION_RE), external_exports.literal(false)]).optional(),
128180
128224
  pause: external_exports.boolean().optional(),
128181
- explain: external_exports.boolean().optional()
128225
+ explain: external_exports.boolean().optional(),
128226
+ routeByName: external_exports.boolean().optional()
128182
128227
  }).optional()
128183
128228
  });
128184
128229
  var ConfigProfileSetOutputSchema = storedMutationOutput("profile", "updated", ProfileValueSchema);
@@ -128290,9 +128335,8 @@ function providerValue(name, provider) {
128290
128335
  name,
128291
128336
  kind: provider.kind ?? "http",
128292
128337
  displayName: provider.displayName,
128293
- ...isCodexProvider(provider) ? provider.codex === void 0 ? {} : { codex: provider.codex } : isAntigravityProvider(provider) ? provider.antigravity === void 0 ? {} : { antigravity: provider.antigravity } : { baseUrl: provider.baseUrl },
128294
- credential: summariseCredential(provider.credential),
128295
- ...provider.env === void 0 ? {} : { env: provider.env }
128338
+ ...isCodexProvider(provider) ? provider.codex === void 0 ? {} : { codex: provider.codex } : isAntigravityProvider(provider) ? provider.antigravity === void 0 ? {} : { antigravity: provider.antigravity } : isRouterProvider(provider) ? {} : { baseUrl: provider.baseUrl },
128339
+ ...isRouterProvider(provider) ? {} : { credential: summariseCredential(provider.credential), ...provider.env === void 0 ? {} : { env: provider.env } }
128296
128340
  };
128297
128341
  }
128298
128342
  function profileValue(name, paths) {
@@ -128391,7 +128435,8 @@ function createConfigApiRouter(deps) {
128391
128435
  ...launch?.claudeVersion === void 0 ? {} : { launchClaudeVersion: launch.claudeVersion },
128392
128436
  ...launch?.delay === void 0 ? {} : { launchDelay: launch.delay },
128393
128437
  ...launch?.pause === void 0 ? {} : { launchPause: launch.pause },
128394
- ...launch?.explain === void 0 ? {} : { launchExplain: launch.explain }
128438
+ ...launch?.explain === void 0 ? {} : { launchExplain: launch.explain },
128439
+ ...launch?.routeByName === void 0 ? {} : { launchRouteByName: launch.routeByName }
128395
128440
  });
128396
128441
  return { action: "updated", kind: "profile", name: input2.name, value: profileValue(input2.name, paths) };
128397
128442
  })
@@ -128474,7 +128519,7 @@ function createConfigApiRouter(deps) {
128474
128519
  if (input2.baseUrl !== void 0 && isHttpProvider(existing) && input2.baseUrl !== existing.baseUrl && credential?.sources === void 0) {
128475
128520
  throw new ORPCError("BAD_REQUEST", { message: `Changing the base URL of provider "${input2.name}" requires a credential block in the same call: the stored credential is not sent to a different endpoint.` });
128476
128521
  }
128477
- const cache = credential?.cache === void 0 ? void 0 : mergeCredentialCache(credential.cache === false ? { enabled: false } : { ...credential.cache, enabled: true }, existing.credential.cache);
128522
+ const cache = credential?.cache === void 0 || isRouterProvider(existing) ? void 0 : mergeCredentialCache(credential.cache === false ? { enabled: false } : { ...credential.cache, enabled: true }, isRouterProvider(existing) ? void 0 : existing.credential.cache);
128478
128523
  const updated = updateProvider(paths, input2.name, {
128479
128524
  ...input2.displayName === void 0 ? {} : { displayName: input2.displayName },
128480
128525
  ...input2.baseUrl === void 0 ? {} : { baseUrl: input2.baseUrl },
@@ -128693,6 +128738,7 @@ var LaunchFlagsSchema = external_exports.strictObject({
128693
128738
  trackUsage: external_exports.boolean(),
128694
128739
  pause: external_exports.boolean(),
128695
128740
  explain: external_exports.boolean(),
128741
+ routeByName: external_exports.boolean(),
128696
128742
  /** How long the launch waits after its own output before it starts claude, in milliseconds. */
128697
128743
  delayMs: external_exports.number()
128698
128744
  });
@@ -128706,7 +128752,7 @@ var LaunchResolveOutputSchema = external_exports.strictObject({
128706
128752
  args: external_exports.readonly(external_exports.array(external_exports.string())),
128707
128753
  /** The credential the launch would authenticate with, by target and source kinds. Absent when none applies. */
128708
128754
  credential: external_exports.strictObject({ subject: external_exports.enum(["provider", "identity"]), name: external_exports.string(), summary: CredentialSummarySchema }).optional(),
128709
- routing: external_exports.strictObject({ frontDoor: external_exports.boolean(), headroom: external_exports.boolean() }),
128755
+ routing: external_exports.strictObject({ frontDoor: external_exports.boolean(), headroom: external_exports.boolean(), routeByName: external_exports.boolean() }),
128710
128756
  /** The names of the environment variables the launch would set or unset, sorted. Values are not reported. */
128711
128757
  environment: external_exports.readonly(external_exports.array(external_exports.string())),
128712
128758
  warnings: external_exports.readonly(external_exports.array(external_exports.string()))
@@ -131080,6 +131126,23 @@ function scopeSessionProviderPath(request7) {
131080
131126
  }
131081
131127
  return { ...request7, url: `${PROVIDER_PATH_PREFIX}${encodeURIComponent(request7.session.provider)}${request7.url}` };
131082
131128
  }
131129
+ function resolveModelTarget(model, models, includeUnqualified) {
131130
+ if (models === void 0) {
131131
+ return model.includes("/") && !model.startsWith("acct:") ? model.split("/")[0] : void 0;
131132
+ }
131133
+ if (model.includes("/") && !model.startsWith("acct:")) {
131134
+ return model.split("/")[0];
131135
+ }
131136
+ if (!includeUnqualified) {
131137
+ return void 0;
131138
+ }
131139
+ const virtual = models.virtual?.[model];
131140
+ const first = virtual?.members.find((member) => !member.startsWith("acct:") && !member.startsWith("family:"));
131141
+ if (first === void 0) {
131142
+ return void 0;
131143
+ }
131144
+ return first.includes("/") ? first.split("/")[0] : resolveModelTarget(first, models, true);
131145
+ }
131083
131146
  function createProviderRouteResolver(deps) {
131084
131147
  const oauthRoute = createPassthroughRoute("anthropic", { baseUrl: `https://${CONNECT_INTERCEPT_HOST}:${String(HTTPS_PORT)}`, stripPrefix: void 0, headroomUpstream: void 0 });
131085
131148
  const antigravityQuotaSources = /* @__PURE__ */ new Map();
@@ -131192,6 +131255,9 @@ function createProviderRouteResolver(deps) {
131192
131255
  )
131193
131256
  };
131194
131257
  }
131258
+ if (isRouterProvider(definition)) {
131259
+ return { ok: true, route: passthroughFor(`router:${provider}`, { baseUrl: `http://127.0.0.1:${String(deps.directPort())}`, stripPrefix: `${PROVIDER_PATH_PREFIX}${encodeURIComponent(provider)}`, headroomUpstream: directOrigin2(deps.directPort()) }) };
131260
+ }
131195
131261
  const httpProvider = definition;
131196
131262
  return {
131197
131263
  ok: true,
@@ -131231,11 +131297,33 @@ function createProviderRouteResolver(deps) {
131231
131297
  visited.add(providerName);
131232
131298
  }
131233
131299
  let routes;
131300
+ let isRouter;
131234
131301
  try {
131235
131302
  const definition = providerName === void 0 ? void 0 : loadProvider(deps.providersDir, providerName, deps.fs);
131236
131303
  routes = definition === void 0 || !isHttpProvider(definition) ? void 0 : definition.routes;
131304
+ isRouter = definition !== void 0 && isRouterProvider(definition);
131237
131305
  } catch {
131238
131306
  routes = void 0;
131307
+ isRouter = false;
131308
+ }
131309
+ const routesByName = isRouter || current.session.routeByName && providerName !== void 0;
131310
+ if (routesByName) {
131311
+ const scan2 = await scanRequestHead(current, false);
131312
+ if (scan2.replayed !== void 0) {
131313
+ replay = scan2.replayed;
131314
+ }
131315
+ const target = scan2.model === void 0 || providerName === void 0 ? void 0 : resolveModelTarget(scan2.model, deps.models?.(), isRouter || current.session.routeByName);
131316
+ if (target === providerName) {
131317
+ const resolution = resolve2(current);
131318
+ return resolution.ok && replay !== void 0 ? { ok: true, route: servingRewritten(resolution.route, { ...replay, url: current.url }), request: { ...replay, url: current.url } } : resolution.ok ? serveScoped(resolution) : resolution;
131319
+ }
131320
+ if (target !== void 0) {
131321
+ const rest2 = path65.slice(`${PROVIDER_PATH_PREFIX}${encodeURIComponent(providerName ?? "")}`.length);
131322
+ const query2 = current.url.includes("?") ? current.url.slice(current.url.indexOf("?")) : "";
131323
+ const carried = scan2.replayed ?? current;
131324
+ current = { ...current, url: `${PROVIDER_PATH_PREFIX}${encodeURIComponent(target)}${rest2}${query2}`, body: carried.body, headers: carried.headers };
131325
+ continue;
131326
+ }
131239
131327
  }
131240
131328
  if (routes === void 0 || routes.length === 0) {
131241
131329
  const resolution = resolve2(current);
@@ -134453,6 +134541,8 @@ function realFrontDoorSupervisorPorts(paths) {
134453
134541
  const rcControlToken = (0, import_node_crypto25.randomUUID)();
134454
134542
  const resolveRoute = rcObservingResolver(
134455
134543
  createProviderRouteResolver({
134544
+ // Read live so a models-block edit reaches the next request without a door restart.
134545
+ models: () => readModels(paths),
134456
134546
  fs: realFsPort,
134457
134547
  providersDir: paths.providersDir,
134458
134548
  codexPorts,
@@ -145715,6 +145805,7 @@ function registerCompletionCommand(program2) {
145715
145805
  var import_node_child_process8 = require("node:child_process");
145716
145806
  init_commandDeps();
145717
145807
  init_cliError();
145808
+ init_schema();
145718
145809
  init_credential();
145719
145810
  init_credentialCache();
145720
145811
 
@@ -145783,6 +145874,9 @@ function credentialSubject(deps, name, asProvider) {
145783
145874
  if (provider === void 0) {
145784
145875
  throw new ProviderNotFoundError(name);
145785
145876
  }
145877
+ if (isRouterProvider(provider)) {
145878
+ throw new UsageError(`Provider "${name}" is a router: it has no credential of its own.`);
145879
+ }
145786
145880
  return { name, subject: `provider ${name}`, credential: provider.credential };
145787
145881
  }
145788
145882
  const identity = readIdentity(deps.paths, name);
@@ -146821,11 +146915,11 @@ function toProviderView(name, provider) {
146821
146915
  name,
146822
146916
  kind: provider.kind ?? "http",
146823
146917
  displayName: provider.displayName,
146824
- ...isCodexProvider(provider) ? provider.codex === void 0 ? {} : { codex: provider.codex } : isAntigravityProvider(provider) ? provider.antigravity === void 0 ? {} : { antigravity: provider.antigravity } : { baseUrl: provider.baseUrl },
146825
- credential: summariseCredential(provider.credential),
146826
- ...provider.env === void 0 ? {} : { env: provider.env },
146827
- ...provider.pickerModels === void 0 ? {} : { pickerModels: provider.pickerModels },
146828
- ...isCodexProvider(provider) || isAntigravityProvider(provider) || provider.catalogue === void 0 ? {} : { catalogue: provider.catalogue }
146918
+ ...isCodexProvider(provider) ? provider.codex === void 0 ? {} : { codex: provider.codex } : isAntigravityProvider(provider) ? provider.antigravity === void 0 ? {} : { antigravity: provider.antigravity } : isRouterProvider(provider) ? {} : { baseUrl: provider.baseUrl },
146919
+ ...isRouterProvider(provider) ? {} : { credential: summariseCredential(provider.credential) },
146920
+ ...!isRouterProvider(provider) && provider.env !== void 0 ? { env: provider.env } : {},
146921
+ ...!isRouterProvider(provider) && provider.pickerModels !== void 0 ? { pickerModels: provider.pickerModels } : {},
146922
+ ...isCodexProvider(provider) || isAntigravityProvider(provider) || isRouterProvider(provider) || provider.catalogue === void 0 ? {} : { catalogue: provider.catalogue }
146829
146923
  };
146830
146924
  }
146831
146925
  function antigravityConfigFromOptions(options) {
@@ -146933,7 +147027,7 @@ function registerProviderCommand(program2, deps) {
146933
147027
  ...antigravity === void 0 ? {} : { antigravity }
146934
147028
  });
146935
147029
  reportMutation(options.json, { action: "created", kind: "provider", name, value: created }, () => {
146936
- console.log(`Created provider "${name}" (${describeProviderEndpoint(created)}, credential ${describeCredential(created.credential)}).`);
147030
+ console.log(`Created provider "${name}" (${describeProviderEndpoint(created)}${isRouterProvider(created) ? "" : `, credential ${describeCredential(created.credential)}`}).`);
146937
147031
  });
146938
147032
  }),
146939
147033
  [
@@ -146967,12 +147061,13 @@ function registerProviderCommand(program2, deps) {
146967
147061
  }
146968
147062
  const codex = codexConfigFromOptions(options);
146969
147063
  const antigravity = antigravityConfigFromOptions(options);
146970
- const cache = cacheChange(options, readProvider(paths, name)?.credential.cache);
147064
+ const existingForCache = readProvider(paths, name);
147065
+ const cache = cacheChange(options, existingForCache !== void 0 && !isRouterProvider(existingForCache) ? existingForCache.credential.cache : void 0);
146971
147066
  if (options.unsetCatalogue === true && hasCatalogueOptions(options)) {
146972
147067
  throw new UsageError("--unset-catalogue cannot be combined with another --catalogue option.");
146973
147068
  }
146974
147069
  const existingProvider = readProvider(paths, name);
146975
- const catalogue = options.unsetCatalogue === true ? false : catalogueFromOptions(options, existingProvider !== void 0 && !isCodexProvider(existingProvider) && !isAntigravityProvider(existingProvider) ? existingProvider.catalogue : void 0);
147070
+ const catalogue = options.unsetCatalogue === true ? false : catalogueFromOptions(options, existingProvider !== void 0 && !isCodexProvider(existingProvider) && !isAntigravityProvider(existingProvider) && !isRouterProvider(existingProvider) ? existingProvider.catalogue : void 0);
146976
147071
  const updated = updateProvider(paths, name, {
146977
147072
  ...codex === void 0 ? {} : { codex },
146978
147073
  ...antigravity === void 0 ? {} : { antigravity },
@@ -146988,7 +147083,7 @@ function registerProviderCommand(program2, deps) {
146988
147083
  ...catalogue === void 0 ? {} : { catalogue }
146989
147084
  });
146990
147085
  reportMutation(json2, { action: "updated", kind: "provider", name, value: updated }, () => {
146991
- console.log(`Updated provider "${name}" (${describeProviderEndpoint(updated)}, credential ${describeCredential(updated.credential)}).`);
147086
+ console.log(`Updated provider "${name}" (${describeProviderEndpoint(updated)}${isRouterProvider(updated) ? "" : `, credential ${describeCredential(updated.credential)}`}).`);
146992
147087
  });
146993
147088
  }),
146994
147089
  [
@@ -147046,16 +147141,18 @@ function registerProviderCommand(program2, deps) {
147046
147141
  console.log(`Antigravity effort: ${config2.effort}`);
147047
147142
  console.log(`Antigravity degrade down tiers: ${config2.degradeDownTiers ? "on" : "off"}`);
147048
147143
  console.log(`Endpoint: ${describeProviderEndpoint(found)}`);
147049
- } else {
147144
+ } else if (!isRouterProvider(found)) {
147050
147145
  console.log(`Base URL: ${found.baseUrl}`);
147051
147146
  }
147052
- console.log(`Credential: ${describeCredential(found.credential)}`);
147053
- const env = Object.entries(found.env ?? {});
147147
+ if (!isRouterProvider(found)) {
147148
+ console.log(`Credential: ${describeCredential(found.credential)}`);
147149
+ }
147150
+ const env = Object.entries(isRouterProvider(found) ? {} : found.env ?? {});
147054
147151
  console.log(`Environment: ${env.length === 0 ? "(none)" : env.map(([key, value2]) => `${key}=${value2}`).join(", ")}`);
147055
- if (found.pickerModels !== void 0) {
147152
+ if (!isRouterProvider(found) && found.pickerModels !== void 0) {
147056
147153
  console.log(`Picker models: ${found.pickerModels.map((entry) => `${entry.model} (${entry.tier})`).join(", ")}`);
147057
147154
  }
147058
- if (!isCodexProvider(found) && !isAntigravityProvider(found) && found.catalogue !== void 0) {
147155
+ if (!isCodexProvider(found) && !isAntigravityProvider(found) && !isRouterProvider(found) && found.catalogue !== void 0) {
147059
147156
  const { tier, include, exclude, url: url2 } = found.catalogue;
147060
147157
  console.log(`Catalogue: tier ${tier}${include === void 0 ? "" : `, include ${include.join(" ")}`}${exclude === void 0 ? "" : `, exclude ${exclude.join(" ")}`}${url2 === void 0 ? "" : `, url ${url2}`} (see \`provider models ${name}\`)`);
147061
147158
  }
@@ -147068,7 +147165,7 @@ function registerProviderCommand(program2, deps) {
147068
147165
  if (found === void 0) {
147069
147166
  throw new ProviderNotFoundError(name);
147070
147167
  }
147071
- if (isCodexProvider(found) || isAntigravityProvider(found) || found.catalogue === void 0) {
147168
+ if (isCodexProvider(found) || isAntigravityProvider(found) || isRouterProvider(found) || found.catalogue === void 0) {
147072
147169
  throw new UsageError(`Provider "${name}" has no catalogue setting. Set one with \`agent-shim provider set ${name} --catalogue-tier <tier>\`.`);
147073
147170
  }
147074
147171
  const catalogueSetting = found.catalogue;
@@ -147865,11 +147962,12 @@ Launching:
147865
147962
  --delay <duration> wait this long (5s, 500ms) after the launcher's own output before starting claude
147866
147963
  --[no-]pause wait for a key press after the launcher's own output before starting claude
147867
147964
  --[no-]explain with @pool:<name>, list every member the pick ranked and why, not only the one picked
147965
+ --[no-]route-by-name route provider-qualified model names through the models block to the provider that serves them
147868
147966
  --native run the real claude with nothing from agent-shim applied (no other launch flag allowed)
147869
147967
 
147870
147968
  Environment:
147871
147969
  AGENT_SHIM_IDENTITY, AGENT_SHIM_CONFIG_PROFILE, AGENT_SHIM_SKIP_PERMISSIONS,
147872
- AGENT_SHIM_REMOTE_CONTROL, AGENT_SHIM_HEADROOM, AGENT_SHIM_TRACK_USAGE, AGENT_SHIM_DELAY, AGENT_SHIM_PAUSE, AGENT_SHIM_EXPLAIN, AGENT_SHIM_ALLOW_AMBIENT_CREDENTIAL,
147970
+ AGENT_SHIM_REMOTE_CONTROL, AGENT_SHIM_HEADROOM, AGENT_SHIM_TRACK_USAGE, AGENT_SHIM_DELAY, AGENT_SHIM_PAUSE, AGENT_SHIM_EXPLAIN, AGENT_SHIM_ROUTE_BY_NAME, AGENT_SHIM_ALLOW_AMBIENT_CREDENTIAL,
147873
147971
  AGENT_SHIM_CATEGORY_OVERRIDE, AGENT_SHIM_ENTRY_OVERRIDE, AGENT_SHIM_HOME,
147874
147972
  AGENT_SHIM_DEBUG (print stack traces), NO_COLOR. Booleans are true, false, 1 or 0.
147875
147973
 
@@ -148593,6 +148691,7 @@ function otherLaunchFlags(parsed) {
148593
148691
  ...parsed.delay === void 0 ? [] : ["--delay"],
148594
148692
  ...parsed.pause === void 0 ? [] : ["--[no-]pause"],
148595
148693
  ...parsed.explain === void 0 ? [] : ["--[no-]explain"],
148694
+ ...parsed.routeByName === void 0 ? [] : ["--[no-]route-by-name"],
148596
148695
  ...parsed.headroom === void 0 ? [] : ["--[no-]headroom"],
148597
148696
  ...parsed.trackUsage === void 0 ? [] : ["--[no-]track-usage"],
148598
148697
  ...parsed.skipPermissions === void 0 ? [] : ["--[no-]skip-permissions"],