claude-use 11.24.0 → 11.25.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/README.md CHANGED
@@ -119,6 +119,7 @@ agent-shim provider add <name> --display-name <name> (--base-url <url> | --kind
119
119
  [--codex-default-model <model>] [--codex-model <tier=model>]... [--codex-effort <none|low|medium|high>] [--codex-login <codex-cli|chatgpt-sign-in>]
120
120
  agent-shim provider set <name> [--display-name <name>] ([--base-url <url>] | --kind codex) [--credential <source>]... [--credential-target <bearer|apiKey>] [--env KEY=VALUE]... [--unset-env KEY]... [--json]
121
121
  [--codex-default-model <model>] [--codex-model <tier=model>]... [--codex-effort <none|low|medium|high>] [--codex-login <codex-cli|chatgpt-sign-in>]
122
+ agent-shim provider add|set <name> [--picker-model <model=tier>]... # models /model lists beside the tier models; set also takes [--unset-picker-model <model>]...
122
123
  agent-shim provider list [--json]
123
124
  agent-shim provider show <name> [--json]
124
125
  agent-shim provider remove <name> [--yes] [--json]
package/dist/cli.cjs CHANGED
@@ -26987,7 +26987,7 @@ function isTimeZone(name) {
26987
26987
  return false;
26988
26988
  }
26989
26989
  }
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, ANTIGRAVITY_TIERS, ANTIGRAVITY_EFFORTS, ANTIGRAVITY_DEFAULT_MODE, ANTIGRAVITY_DEFAULT_MODEL, ANTIGRAVITY_DEFAULT_TIER_MODELS, ANTIGRAVITY_DEFAULT_EFFORT, AntigravityModelTargetSchema, AntigravityProviderConfigSchema, CODEX_TIERS, CODEX_EFFORTS, CODEX_LOGINS, CODEX_DEFAULT_LOGIN, CODEX_DEFAULT_MODEL, CODEX_DEFAULT_TIER_MODELS, CODEX_DEFAULT_EFFORT, CodexProviderConfigSchema, ProviderRouteSchema, HttpProviderSchema, CodexProviderSchema, AntigravityProviderSchema, ProviderSchema, 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;
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, HttpProviderSchema, CodexProviderSchema, AntigravityProviderSchema, ProviderSchema, 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
26991
  var init_schema = __esm({
26992
26992
  "src/config/schema.ts"() {
26993
26993
  "use strict";
@@ -27088,7 +27088,7 @@ var init_schema = __esm({
27088
27088
  });
27089
27089
  PROVIDER_KINDS = ["http", "codex", "antigravity"];
27090
27090
  ANTIGRAVITY_MODES = ["cloud", "local"];
27091
- ANTIGRAVITY_TIERS = ["fable", "opus", "sonnet", "haiku"];
27091
+ CLAUDE_TIERS = ["fable", "opus", "sonnet", "haiku"];
27092
27092
  ANTIGRAVITY_EFFORTS = ["none", "low", "medium", "high", "xhigh", "max"];
27093
27093
  ANTIGRAVITY_DEFAULT_MODE = "cloud";
27094
27094
  ANTIGRAVITY_DEFAULT_MODEL = "gemini-3.8-flash-high";
@@ -27105,7 +27105,7 @@ var init_schema = __esm({
27105
27105
  mode: external_exports.enum(ANTIGRAVITY_MODES).optional(),
27106
27106
  /** The model a request maps to when no tier matches its model name. */
27107
27107
  defaultModel: external_exports.string().min(1).optional(),
27108
- /** Model name mapping. A key naming a tier (`fable`, `opus`, `sonnet`, `haiku`) overrides that tier's shipped model and is matched by substring of the requested name in `ANTIGRAVITY_TIERS` order; any other key is an alias, matched against the whole requested name case-insensitively, so `/model <alias>` selects its backend model. An alias outranks every other rule, including the pass-through of backend names. A value is one model or an ordered list of candidates: the request goes to the first whose quota windows are not spent, and when every candidate is spent, to the one whose binding window lifts soonest. */
27108
+ /** Model name mapping. A key naming a tier (`fable`, `opus`, `sonnet`, `haiku`) overrides that tier's shipped model and is matched by substring of the requested name in `CLAUDE_TIERS` order; any other key is an alias, matched against the whole requested name case-insensitively, so `/model <alias>` selects its backend model. An alias outranks every other rule, including the pass-through of backend names. A value is one model or an ordered list of candidates: the request goes to the first whose quota windows are not spent, and when every candidate is spent, to the one whose binding window lifts soonest. */
27109
27109
  models: external_exports.record(external_exports.string().min(1), AntigravityModelTargetSchema).optional(),
27110
27110
  /** When every candidate of the tier a request names has no quota left, serve it from the next tier down, and onward through the lower tiers, instead of failing with the quota limit. Applies to a name that selects a tier (`/model fable`), not to an alias or a backend model name. Defaults to false. */
27111
27111
  degradeDownTiers: external_exports.boolean().optional(),
@@ -27128,7 +27128,6 @@ var init_schema = __esm({
27128
27128
  socketPath: external_exports.string().min(1).optional()
27129
27129
  }).optional()
27130
27130
  });
27131
- CODEX_TIERS = ["fable", "opus", "sonnet", "haiku"];
27132
27131
  CODEX_EFFORTS = ["none", "low", "medium", "high"];
27133
27132
  CODEX_LOGINS = ["codex-cli", "chatgpt-sign-in"];
27134
27133
  CODEX_DEFAULT_LOGIN = "codex-cli";
@@ -27143,7 +27142,7 @@ var init_schema = __esm({
27143
27142
  CodexProviderConfigSchema = external_exports.strictObject({
27144
27143
  /** The codex model a request maps to when no tier matches its model name. */
27145
27144
  defaultModel: external_exports.string().min(1).optional(),
27146
- /** Per-tier overrides of the shipped mapping, matched by substring of the requested model name in `CODEX_TIERS` order. */
27145
+ /** Per-tier overrides of the shipped mapping, matched by substring of the requested model name in `CLAUDE_TIERS` order. */
27147
27146
  models: external_exports.strictObject({
27148
27147
  fable: external_exports.string().min(1).optional(),
27149
27148
  opus: external_exports.string().min(1).optional(),
@@ -27163,6 +27162,13 @@ var init_schema = __esm({
27163
27162
  /** The model name to rewrite the request to before it reaches the target, for a provider that expects another form (OpenRouter's `anthropic/claude-...` for instance). A route that rewrites reads the whole body, the one copy the rewrite needs. */
27164
27163
  model: external_exports.string().min(1).optional()
27165
27164
  });
27165
+ PickerModelSchema = external_exports.strictObject({
27166
+ model: external_exports.string().min(1),
27167
+ tier: external_exports.enum(CLAUDE_TIERS),
27168
+ label: external_exports.string().min(1).optional(),
27169
+ description: external_exports.string().min(1).optional()
27170
+ });
27171
+ PickerModelsSchema = external_exports.array(PickerModelSchema).refine((models) => new Set(models.map((entry) => entry.model)).size === models.length, { message: "pickerModels names a model more than once" });
27166
27172
  HttpProviderSchema = external_exports.strictObject({
27167
27173
  $schema: external_exports.string().optional(),
27168
27174
  kind: external_exports.literal("http").optional(),
@@ -27170,6 +27176,8 @@ var init_schema = __esm({
27170
27176
  baseUrl: external_exports.url(),
27171
27177
  credential: ProviderCredentialSchema,
27172
27178
  env: ProviderEnvSchema.optional(),
27179
+ /** Extra models `/model` lists beside the ones the tier settings name. */
27180
+ pickerModels: PickerModelsSchema.optional(),
27173
27181
  /** Per-request routing: when present, each request this provider would serve is matched against the list in order, and the first definite match is sent to that entry's provider instead (itself resolved exactly as a directly dialled request would be). Unmatched requests stay on this provider. */
27174
27182
  routes: external_exports.array(ProviderRouteSchema).optional()
27175
27183
  });
@@ -27179,6 +27187,8 @@ var init_schema = __esm({
27179
27187
  displayName: external_exports.string().min(1),
27180
27188
  credential: ProviderCredentialSchema,
27181
27189
  env: ProviderEnvSchema.optional(),
27190
+ /** Extra models `/model` lists beside the ones the tier settings name. */
27191
+ pickerModels: PickerModelsSchema.optional(),
27182
27192
  codex: CodexProviderConfigSchema.optional()
27183
27193
  });
27184
27194
  AntigravityProviderSchema = external_exports.strictObject({
@@ -27187,6 +27197,8 @@ var init_schema = __esm({
27187
27197
  displayName: external_exports.string().min(1),
27188
27198
  credential: ProviderCredentialSchema,
27189
27199
  env: ProviderEnvSchema.optional(),
27200
+ /** Extra models `/model` lists beside the ones the tier settings name. */
27201
+ pickerModels: PickerModelsSchema.optional(),
27190
27202
  antigravity: AntigravityProviderConfigSchema.optional()
27191
27203
  });
27192
27204
  ProviderSchema = external_exports.discriminatedUnion("kind", [HttpProviderSchema, CodexProviderSchema, AntigravityProviderSchema]);
@@ -34181,7 +34193,7 @@ var init_package = __esm({
34181
34193
  "package.json"() {
34182
34194
  package_default = {
34183
34195
  name: "claude-use",
34184
- version: "11.24.0",
34196
+ version: "11.25.0",
34185
34197
  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.",
34186
34198
  license: "MIT",
34187
34199
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -35892,7 +35904,8 @@ function addProvider(paths, name, input2) {
35892
35904
  const shared = {
35893
35905
  displayName: input2.displayName,
35894
35906
  credential: { sources: input2.sources, ...input2.target === void 0 ? {} : { target: input2.target } },
35895
- ...input2.env === void 0 || Object.keys(input2.env).length === 0 ? {} : { env: input2.env }
35907
+ ...input2.env === void 0 || Object.keys(input2.env).length === 0 ? {} : { env: input2.env },
35908
+ ...input2.pickerModels === void 0 || input2.pickerModels.length === 0 ? {} : { pickerModels: input2.pickerModels }
35896
35909
  };
35897
35910
  const parsed = ProviderSchema.safeParse(
35898
35911
  kind === "codex" ? { kind, ...shared, ...isEmptyCodexConfig(input2.codex) ? {} : { codex: input2.codex } } : kind === "antigravity" ? { kind, ...shared, ...isEmptyAntigravityConfig(input2.antigravity) ? {} : { antigravity: input2.antigravity } } : { ...shared, baseUrl: input2.baseUrl }
@@ -35910,6 +35923,12 @@ function updateProvider(paths, name, input2) {
35910
35923
  }
35911
35924
  const unset = new Set(input2.unsetEnv);
35912
35925
  const env = Object.fromEntries(Object.entries({ ...existing.env, ...input2.env }).filter(([key]) => !unset.has(key)));
35926
+ const unsetPicker = new Set(input2.unsetPickerModels);
35927
+ const added = new Map((input2.pickerModels ?? []).map((entry) => [entry.model, entry]));
35928
+ const pickerModels = [
35929
+ ...(existing.pickerModels ?? []).filter((entry) => !unsetPicker.has(entry.model)).map((entry) => added.get(entry.model) ?? entry),
35930
+ ...[...added.values()].filter((entry) => !(existing.pickerModels ?? []).some((kept) => kept.model === entry.model))
35931
+ ];
35913
35932
  const target = input2.target ?? existing.credential.target;
35914
35933
  const cache = input2.cache === void 0 ? existing.credential.cache : input2.cache === false ? void 0 : input2.cache;
35915
35934
  if (isCodexProvider(existing) && input2.baseUrl !== void 0) {
@@ -35931,7 +35950,8 @@ function updateProvider(paths, name, input2) {
35931
35950
  ...target === void 0 ? {} : { target },
35932
35951
  ...cache === void 0 ? {} : { cache }
35933
35952
  },
35934
- env: Object.keys(env).length === 0 ? void 0 : env
35953
+ env: Object.keys(env).length === 0 ? void 0 : env,
35954
+ pickerModels: pickerModels.length === 0 ? void 0 : pickerModels
35935
35955
  };
35936
35956
  let candidate;
35937
35957
  if (isCodexProvider(existing)) {
@@ -63920,7 +63940,7 @@ function candidatesOf(target) {
63920
63940
  return typeof target === "string" ? [target] : target;
63921
63941
  }
63922
63942
  function isAntigravityTier(key) {
63923
- return ANTIGRAVITY_TIERS.some((tier) => tier === key);
63943
+ return CLAUDE_TIERS.some((tier) => tier === key);
63924
63944
  }
63925
63945
  function resolveAntigravityConfig(config2) {
63926
63946
  const overrides = config2?.models ?? {};
@@ -63965,7 +63985,7 @@ function resolveName(requested, config2) {
63965
63985
  if (isBackendModelName(stripped)) {
63966
63986
  return { candidates: [stripped], tier: void 0 };
63967
63987
  }
63968
- const tier = ANTIGRAVITY_TIERS.find((candidate) => lower.includes(candidate));
63988
+ const tier = CLAUDE_TIERS.find((candidate) => lower.includes(candidate));
63969
63989
  return tier === void 0 ? { candidates: [config2.defaultModel], tier: void 0 } : { candidates: config2.models[tier], tier };
63970
63990
  }
63971
63991
  function candidateStages(requested, config2) {
@@ -63973,7 +63993,7 @@ function candidateStages(requested, config2) {
63973
63993
  if (!config2.degradeDownTiers || tier === void 0) {
63974
63994
  return [candidates];
63975
63995
  }
63976
- return ANTIGRAVITY_TIERS.slice(ANTIGRAVITY_TIERS.indexOf(tier)).map((name) => config2.models[name]);
63996
+ return CLAUDE_TIERS.slice(CLAUDE_TIERS.indexOf(tier)).map((name) => config2.models[name]);
63977
63997
  }
63978
63998
  function chooseCandidate(candidates, routing) {
63979
63999
  const first = candidates[0];
@@ -64249,7 +64269,7 @@ function mapModel(requested, config2) {
64249
64269
  return requested;
64250
64270
  }
64251
64271
  const lower = requested.toLowerCase();
64252
- const tier = CODEX_TIERS.find((candidate) => lower.includes(candidate));
64272
+ const tier = CLAUDE_TIERS.find((candidate) => lower.includes(candidate));
64253
64273
  return tier === void 0 ? config2.defaultModel : config2.models[tier];
64254
64274
  }
64255
64275
  function isRequestableEffort(value2) {
@@ -64408,6 +64428,12 @@ var init_translate2 = __esm({
64408
64428
  });
64409
64429
 
64410
64430
  // src/launcher/modelPicker.ts
64431
+ function labelOf(model) {
64432
+ return model.toLowerCase().endsWith(CONTEXT_MARKER_1M2) ? model.slice(0, -CONTEXT_MARKER_1M2.length) : model;
64433
+ }
64434
+ function describedAs(model, description) {
64435
+ return model.toLowerCase().endsWith(CONTEXT_MARKER_1M2) ? `${description}; 1M context` : description;
64436
+ }
64411
64437
  function joined(parts) {
64412
64438
  const last = parts[parts.length - 1];
64413
64439
  return last === void 0 || parts.length === 1 ? last ?? "" : `${parts.slice(0, -1).join(", ")} and ${last}`;
@@ -64421,7 +64447,7 @@ function rowOf(model, reaches) {
64421
64447
  const fallbacks = reaches.filter((reach) => reach.standing === "fallback").map((reach) => reach.tier);
64422
64448
  const serves = firsts.length === 0 ? [] : [`Serves the ${joined(firsts)} tier${firsts.length === 1 ? "" : "s"}`];
64423
64449
  const falls = fallbacks.length === 0 ? [] : [`${serves.length === 0 ? "Fallback" : "fallback"} for ${joined(fallbacks)}`];
64424
- return { model, label: model, description: [...serves, ...falls].join("; "), behavesAs: TIER_BEHAVES_AS[lead.tier] };
64450
+ return { model, label: labelOf(model), description: describedAs(model, [...serves, ...falls].join("; ")), behavesAs: TIER_BEHAVES_AS[lead.tier] };
64425
64451
  }
64426
64452
  function rowsOfTable(table) {
64427
64453
  const reachesByModel = /* @__PURE__ */ new Map();
@@ -64438,47 +64464,53 @@ function rowsOfTable(table) {
64438
64464
  }
64439
64465
  function antigravityRows(provider) {
64440
64466
  const config2 = resolveAntigravityConfig(provider.antigravity);
64441
- const tiers = rowsOfTable(ANTIGRAVITY_TIERS.map((tier) => [tier, config2.models[tier]]));
64467
+ const tiers = rowsOfTable(CLAUDE_TIERS.map((tier) => [tier, config2.models[tier]]));
64442
64468
  const behavesAsOf = new Map(tiers.map((row) => [row.model, row.behavesAs]));
64443
64469
  const aliases = [...config2.aliases].flatMap(([alias, candidates]) => {
64444
64470
  const [first] = candidates;
64445
64471
  const behavesAs = first === void 0 ? void 0 : behavesAsOf.get(first);
64446
- return behavesAs === void 0 ? [] : [{ model: alias, label: alias, description: `Alias for ${candidates.join(", then ")}`, behavesAs }];
64472
+ return behavesAs === void 0 ? [] : [{ model: alias, label: labelOf(alias), description: `Alias for ${candidates.join(", then ")}`, behavesAs }];
64447
64473
  });
64448
64474
  return [...tiers, ...aliases];
64449
64475
  }
64450
64476
  function codexRows(provider) {
64451
64477
  const config2 = resolveCodexConfig(provider.codex);
64452
- return rowsOfTable(CODEX_TIERS.map((tier) => [tier, [config2.models[tier]]]));
64478
+ return rowsOfTable(CLAUDE_TIERS.map((tier) => [tier, [config2.models[tier]]]));
64453
64479
  }
64454
64480
  function httpRows(provider) {
64455
64481
  const env = provider.env ?? {};
64456
- const table = CODEX_TIERS.flatMap((tier) => {
64482
+ const table = CLAUDE_TIERS.flatMap((tier) => {
64457
64483
  const model = env[TIER_ENV_VARIABLES[tier]];
64458
64484
  return model === void 0 || model === "" ? [] : [[tier, [model]]];
64459
64485
  });
64460
64486
  return rowsOfTable(table);
64461
64487
  }
64488
+ function declaredRow(entry) {
64489
+ return {
64490
+ model: entry.model,
64491
+ label: entry.label ?? labelOf(entry.model),
64492
+ description: entry.description ?? describedAs(entry.model, `Declared by the provider for the ${entry.tier} tier`),
64493
+ behavesAs: TIER_BEHAVES_AS[entry.tier]
64494
+ };
64495
+ }
64462
64496
  function providerModelRows(provider) {
64463
- if (provider.kind === "codex") {
64464
- return codexRows(provider);
64465
- }
64466
- if (provider.kind === "antigravity") {
64467
- return antigravityRows(provider);
64468
- }
64469
- return httpRows(provider);
64497
+ const derived2 = provider.kind === "codex" ? codexRows(provider) : provider.kind === "antigravity" ? antigravityRows(provider) : httpRows(provider);
64498
+ const declared = (provider.pickerModels ?? []).map(declaredRow);
64499
+ const declaredModels = new Set(declared.map((row) => row.model));
64500
+ return [...derived2.filter((row) => !declaredModels.has(row.model)), ...declared];
64470
64501
  }
64471
64502
  function modelPickerSettings(provider) {
64472
64503
  const options = providerModelRows(provider);
64473
64504
  return options.length === 0 ? void 0 : JSON.stringify({ modelPicker: { options, replaceBuiltInOptions: true } });
64474
64505
  }
64475
- var TIER_BEHAVES_AS, TIER_ENV_VARIABLES;
64506
+ var CONTEXT_MARKER_1M2, TIER_BEHAVES_AS, TIER_ENV_VARIABLES;
64476
64507
  var init_modelPicker = __esm({
64477
64508
  "src/launcher/modelPicker.ts"() {
64478
64509
  "use strict";
64479
64510
  init_translate();
64480
64511
  init_translate2();
64481
64512
  init_schema();
64513
+ CONTEXT_MARKER_1M2 = "[1m]";
64482
64514
  TIER_BEHAVES_AS = Object.freeze({
64483
64515
  fable: "claude-fable-5-1",
64484
64516
  opus: "claude-opus-5-5",
@@ -145733,7 +145765,8 @@ function toProviderView(name, provider) {
145733
145765
  displayName: provider.displayName,
145734
145766
  ...isCodexProvider(provider) ? provider.codex === void 0 ? {} : { codex: provider.codex } : isAntigravityProvider(provider) ? provider.antigravity === void 0 ? {} : { antigravity: provider.antigravity } : { baseUrl: provider.baseUrl },
145735
145767
  credential: summariseCredential(provider.credential),
145736
- ...provider.env === void 0 ? {} : { env: provider.env }
145768
+ ...provider.env === void 0 ? {} : { env: provider.env },
145769
+ ...provider.pickerModels === void 0 ? {} : { pickerModels: provider.pickerModels }
145737
145770
  };
145738
145771
  }
145739
145772
  function antigravityConfigFromOptions(options) {
@@ -145764,6 +145797,15 @@ function antigravityConfigFromOptions(options) {
145764
145797
  }
145765
145798
  return parsed.data;
145766
145799
  }
145800
+ function pickerModelsFromOption(option) {
145801
+ return Object.entries(option).map(([model, tier]) => {
145802
+ const parsed = PickerModelSchema.safeParse({ model, tier });
145803
+ if (!parsed.success) {
145804
+ throw new UsageError(`Invalid --picker-model ${model}=${tier}: ${parsed.error.issues.map((issue2) => `${issue2.path.join(".")}: ${issue2.message}`).join("; ")}`);
145805
+ }
145806
+ return parsed.data;
145807
+ });
145808
+ }
145767
145809
  function codexConfigFromOptions(options) {
145768
145810
  if (options.codexDefaultModel === void 0 && options.codexModel === void 0 && options.codexEffort === void 0 && options.codexLogin === void 0) {
145769
145811
  return void 0;
@@ -145795,7 +145837,7 @@ function registerProviderCommand(program2, deps) {
145795
145837
  new Option("--credential-target <target>", "Where the token goes: bearer sets ANTHROPIC_AUTH_TOKEN (default), apiKey sets ANTHROPIC_API_KEY.").choices(
145796
145838
  PROVIDER_CREDENTIAL_TARGETS
145797
145839
  )
145798
- ).option("--env <KEY=VALUE>", "Extra environment entry for the child (repeatable).", collectStringPair).option("--codex-default-model <model>", "Codex providers: the codex model a request maps to when no tier matches.").option("--codex-model <tier=model>", "Codex providers: the codex model one tier (fable, opus, sonnet or haiku) maps to (repeatable).", collectStringPair).addOption(new Option("--codex-effort <effort>", "Codex providers: the reasoning effort when a request asks for none the backend accepts.").choices(CODEX_EFFORTS)).addOption(new Option("--codex-login <login>", "Codex providers: which login the upstream call uses, the Codex CLI's own login or a Sign in with ChatGPT grant from `agent-shim codex login`.").choices(CODEX_LOGINS)).addOption(new Option("--antigravity-mode <mode>", "Antigravity providers: cloud (direct Gemini/Vertex) or local (ACP daemon).").choices(ANTIGRAVITY_MODES)).option("--antigravity-default-model <model>", "Antigravity providers: the model a request maps to when no tier matches.").option("--antigravity-model <tier=model>", "Antigravity providers: the model a tier (fable, opus, sonnet or haiku, matched by substring) or an alias (any other name, matched whole, selectable with /model) maps to; a comma-separated list routes by available quota, first unspent first (repeatable).", collectStringPair).addOption(new Option("--antigravity-effort <effort>", "Antigravity providers: reasoning effort.").choices(ANTIGRAVITY_EFFORTS)).option("--antigravity-degrade-down-tiers", "Antigravity providers: when every candidate of a tier has no quota left, serve the request from the tiers below it instead of failing.").option("--no-antigravity-degrade-down-tiers", "Antigravity providers: fail with the quota limit when a tier has no quota left (the default).").option("--antigravity-endpoint <url>", "Antigravity cloud providers: custom API endpoint URL.").option("--antigravity-project-id <id>", "Antigravity cloud providers: Google Cloud project ID (for Vertex AI).").option("--antigravity-location <loc>", "Antigravity cloud providers: Google Cloud location (for Vertex AI).").option("--antigravity-command <cmd...>", "Antigravity local providers: command to spawn ACP server.", collectRepeated).option("--antigravity-socket <path>", "Antigravity local providers: path to existing Unix domain socket.").option("--json", "Print the result as JSON.").action((name, options) => {
145840
+ ).option("--env <KEY=VALUE>", "Extra environment entry for the child (repeatable).", collectStringPair).option("--picker-model <model=tier>", "A model /model lists beside the ones the tier settings name, with the Claude tier (fable, opus, sonnet or haiku) whose handling it borrows (repeatable).", collectStringPair).option("--codex-default-model <model>", "Codex providers: the codex model a request maps to when no tier matches.").option("--codex-model <tier=model>", "Codex providers: the codex model one tier (fable, opus, sonnet or haiku) maps to (repeatable).", collectStringPair).addOption(new Option("--codex-effort <effort>", "Codex providers: the reasoning effort when a request asks for none the backend accepts.").choices(CODEX_EFFORTS)).addOption(new Option("--codex-login <login>", "Codex providers: which login the upstream call uses, the Codex CLI's own login or a Sign in with ChatGPT grant from `agent-shim codex login`.").choices(CODEX_LOGINS)).addOption(new Option("--antigravity-mode <mode>", "Antigravity providers: cloud (direct Gemini/Vertex) or local (ACP daemon).").choices(ANTIGRAVITY_MODES)).option("--antigravity-default-model <model>", "Antigravity providers: the model a request maps to when no tier matches.").option("--antigravity-model <tier=model>", "Antigravity providers: the model a tier (fable, opus, sonnet or haiku, matched by substring) or an alias (any other name, matched whole, selectable with /model) maps to; a comma-separated list routes by available quota, first unspent first (repeatable).", collectStringPair).addOption(new Option("--antigravity-effort <effort>", "Antigravity providers: reasoning effort.").choices(ANTIGRAVITY_EFFORTS)).option("--antigravity-degrade-down-tiers", "Antigravity providers: when every candidate of a tier has no quota left, serve the request from the tiers below it instead of failing.").option("--no-antigravity-degrade-down-tiers", "Antigravity providers: fail with the quota limit when a tier has no quota left (the default).").option("--antigravity-endpoint <url>", "Antigravity cloud providers: custom API endpoint URL.").option("--antigravity-project-id <id>", "Antigravity cloud providers: Google Cloud project ID (for Vertex AI).").option("--antigravity-location <loc>", "Antigravity cloud providers: Google Cloud location (for Vertex AI).").option("--antigravity-command <cmd...>", "Antigravity local providers: command to spawn ACP server.", collectRepeated).option("--antigravity-socket <path>", "Antigravity local providers: path to existing Unix domain socket.").option("--json", "Print the result as JSON.").action((name, options) => {
145799
145841
  const codex = codexConfigFromOptions(options);
145800
145842
  const antigravity = antigravityConfigFromOptions(options);
145801
145843
  const created = addProvider(paths, name, {
@@ -145805,6 +145847,7 @@ function registerProviderCommand(program2, deps) {
145805
145847
  sources: options.credential,
145806
145848
  ...options.credentialTarget === void 0 ? {} : { target: options.credentialTarget },
145807
145849
  ...options.env === void 0 ? {} : { env: options.env },
145850
+ ...options.pickerModel === void 0 ? {} : { pickerModels: pickerModelsFromOption(options.pickerModel) },
145808
145851
  ...codex === void 0 ? {} : { codex },
145809
145852
  ...antigravity === void 0 ? {} : { antigravity }
145810
145853
  });
@@ -145831,14 +145874,14 @@ function registerProviderCommand(program2, deps) {
145831
145874
  new Option("--credential-target <target>", "Where the token goes: bearer sets ANTHROPIC_AUTH_TOKEN, apiKey sets ANTHROPIC_API_KEY.").choices(
145832
145875
  PROVIDER_CREDENTIAL_TARGETS
145833
145876
  )
145834
- ).option("--env <KEY=VALUE>", "Add or replace an environment entry for the child (repeatable).", collectStringPair).option("--unset-env <KEY>", "Remove an environment entry (repeatable).", collectRepeated).option("--codex-default-model <model>", "Codex providers: replace the model a request maps to when no tier matches.").option("--codex-model <tier=model>", "Codex providers: set the codex model one tier maps to (repeatable; other tiers are kept).", collectStringPair).addOption(new Option("--codex-effort <effort>", "Codex providers: replace the default reasoning effort.").choices(CODEX_EFFORTS)).addOption(new Option("--codex-login <login>", "Codex providers: replace which login the upstream call uses.").choices(CODEX_LOGINS)).addOption(new Option("--antigravity-mode <mode>", "Antigravity providers: cloud (direct Gemini/Vertex) or local (ACP daemon).").choices(ANTIGRAVITY_MODES)).option("--antigravity-default-model <model>", "Antigravity providers: the model a request maps to when no tier matches.").option("--antigravity-model <tier=model>", "Antigravity providers: set the model one tier maps to (repeatable; other tiers are kept).", collectStringPair).addOption(new Option("--antigravity-effort <effort>", "Antigravity providers: reasoning effort.").choices(ANTIGRAVITY_EFFORTS)).option("--antigravity-degrade-down-tiers", "Antigravity providers: when every candidate of a tier has no quota left, serve the request from the tiers below it instead of failing.").option("--no-antigravity-degrade-down-tiers", "Antigravity providers: fail with the quota limit when a tier has no quota left (the default).").option("--antigravity-endpoint <url>", "Antigravity cloud providers: custom API endpoint URL.").option("--antigravity-project-id <id>", "Antigravity cloud providers: Google Cloud project ID (for Vertex AI).").option("--antigravity-location <loc>", "Antigravity cloud providers: Google Cloud location (for Vertex AI).").option("--antigravity-command <cmd...>", "Antigravity local providers: command to spawn ACP server.", collectRepeated).option("--antigravity-socket <path>", "Antigravity local providers: path to existing Unix domain socket.");
145877
+ ).option("--env <KEY=VALUE>", "Add or replace an environment entry for the child (repeatable).", collectStringPair).option("--unset-env <KEY>", "Remove an environment entry (repeatable).", collectRepeated).option("--picker-model <model=tier>", "Add or replace a model /model lists beside the ones the tier settings name, with the Claude tier (fable, opus, sonnet or haiku) whose handling it borrows (repeatable).", collectStringPair).option("--unset-picker-model <model>", "Remove a model from the /model list (repeatable).", collectRepeated).option("--codex-default-model <model>", "Codex providers: replace the model a request maps to when no tier matches.").option("--codex-model <tier=model>", "Codex providers: set the codex model one tier maps to (repeatable; other tiers are kept).", collectStringPair).addOption(new Option("--codex-effort <effort>", "Codex providers: replace the default reasoning effort.").choices(CODEX_EFFORTS)).addOption(new Option("--codex-login <login>", "Codex providers: replace which login the upstream call uses.").choices(CODEX_LOGINS)).addOption(new Option("--antigravity-mode <mode>", "Antigravity providers: cloud (direct Gemini/Vertex) or local (ACP daemon).").choices(ANTIGRAVITY_MODES)).option("--antigravity-default-model <model>", "Antigravity providers: the model a request maps to when no tier matches.").option("--antigravity-model <tier=model>", "Antigravity providers: set the model one tier maps to (repeatable; other tiers are kept).", collectStringPair).addOption(new Option("--antigravity-effort <effort>", "Antigravity providers: reasoning effort.").choices(ANTIGRAVITY_EFFORTS)).option("--antigravity-degrade-down-tiers", "Antigravity providers: when every candidate of a tier has no quota left, serve the request from the tiers below it instead of failing.").option("--no-antigravity-degrade-down-tiers", "Antigravity providers: fail with the quota limit when a tier has no quota left (the default).").option("--antigravity-endpoint <url>", "Antigravity cloud providers: custom API endpoint URL.").option("--antigravity-project-id <id>", "Antigravity cloud providers: Google Cloud project ID (for Vertex AI).").option("--antigravity-location <loc>", "Antigravity cloud providers: Google Cloud location (for Vertex AI).").option("--antigravity-command <cmd...>", "Antigravity local providers: command to spawn ACP server.", collectRepeated).option("--antigravity-socket <path>", "Antigravity local providers: path to existing Unix domain socket.");
145835
145878
  addCredentialCacheOptions(providerSet);
145836
145879
  withExamples(
145837
145880
  providerSet.option("--json", "Print the result as JSON.").action((name, allOptions) => {
145838
145881
  const { json: json2, ...options } = allOptions;
145839
145882
  if (Object.entries(allOptions).every(([key, value2]) => key === "json" || value2 === void 0)) {
145840
145883
  throw new UsageError(
145841
- "Nothing to change: pass --display-name, --base-url, --credential, --credential-target, a --credential-cache option, --env, --unset-env, or codex/antigravity settings."
145884
+ "Nothing to change: pass --display-name, --base-url, --credential, --credential-target, a --credential-cache option, --env, --unset-env, --picker-model, --unset-picker-model, or codex/antigravity settings."
145842
145885
  );
145843
145886
  }
145844
145887
  const codex = codexConfigFromOptions(options);
@@ -145853,7 +145896,9 @@ function registerProviderCommand(program2, deps) {
145853
145896
  ...options.credential === void 0 ? {} : { sources: options.credential },
145854
145897
  ...options.credentialTarget === void 0 ? {} : { target: options.credentialTarget },
145855
145898
  ...options.env === void 0 ? {} : { env: options.env },
145856
- ...options.unsetEnv === void 0 ? {} : { unsetEnv: options.unsetEnv }
145899
+ ...options.unsetEnv === void 0 ? {} : { unsetEnv: options.unsetEnv },
145900
+ ...options.pickerModel === void 0 ? {} : { pickerModels: pickerModelsFromOption(options.pickerModel) },
145901
+ ...options.unsetPickerModel === void 0 ? {} : { unsetPickerModels: options.unsetPickerModel }
145857
145902
  });
145858
145903
  reportMutation(json2, { action: "updated", kind: "provider", name, value: updated }, () => {
145859
145904
  console.log(`Updated provider "${name}" (${describeProviderEndpoint(updated)}, credential ${describeCredential(updated.credential)}).`);
@@ -145865,7 +145910,8 @@ function registerProviderCommand(program2, deps) {
145865
145910
  "agent-shim provider set z --credential op:op://vault/z/credential --credential-cache-ttl 12h",
145866
145911
  "agent-shim provider set anthropic-api --credential-target apiKey",
145867
145912
  "agent-shim provider set codex --codex-model haiku=gpt-5.6-terra",
145868
- "agent-shim provider set agy --antigravity-model haiku=gemini-2.5-flash"
145913
+ "agent-shim provider set agy --antigravity-model haiku=gemini-2.5-flash",
145914
+ "agent-shim provider set o --picker-model deepseek/deepseek-r1=opus --picker-model qwen/qwen3-coder=sonnet"
145869
145915
  ]
145870
145916
  );
145871
145917
  withExamples(
@@ -145900,13 +145946,13 @@ function registerProviderCommand(program2, deps) {
145900
145946
  console.log(`Kind: ${found.kind ?? "http"}`);
145901
145947
  if (isCodexProvider(found)) {
145902
145948
  const config2 = resolveCodexConfig(found.codex);
145903
- console.log(`Codex models: ${CODEX_TIERS.map((tier) => `${tier}=${config2.models[tier]}`).join(", ")}, otherwise ${config2.defaultModel}`);
145949
+ console.log(`Codex models: ${CLAUDE_TIERS.map((tier) => `${tier}=${config2.models[tier]}`).join(", ")}, otherwise ${config2.defaultModel}`);
145904
145950
  console.log(`Codex effort: ${config2.effort}`);
145905
145951
  console.log(`Codex login: ${config2.login}`);
145906
145952
  } else if (isAntigravityProvider(found)) {
145907
145953
  const config2 = resolveAntigravityConfig(found.antigravity);
145908
145954
  console.log(`Antigravity mode: ${config2.mode}`);
145909
- console.log(`Antigravity models: ${ANTIGRAVITY_TIERS.map((tier) => `${tier}=${config2.models[tier].join(" > ")}`).join(", ")}, otherwise ${config2.defaultModel}`);
145955
+ console.log(`Antigravity models: ${CLAUDE_TIERS.map((tier) => `${tier}=${config2.models[tier].join(" > ")}`).join(", ")}, otherwise ${config2.defaultModel}`);
145910
145956
  if (config2.aliases.size > 0) {
145911
145957
  console.log(`Antigravity aliases: ${[...config2.aliases].map(([alias, model]) => `${alias}=${model.join(" > ")}`).join(", ")}`);
145912
145958
  }
@@ -145919,6 +145965,9 @@ function registerProviderCommand(program2, deps) {
145919
145965
  console.log(`Credential: ${describeCredential(found.credential)}`);
145920
145966
  const env = Object.entries(found.env ?? {});
145921
145967
  console.log(`Environment: ${env.length === 0 ? "(none)" : env.map(([key, value2]) => `${key}=${value2}`).join(", ")}`);
145968
+ if (found.pickerModels !== void 0) {
145969
+ console.log(`Picker models: ${found.pickerModels.map((entry) => `${entry.model} (${entry.tier})`).join(", ")}`);
145970
+ }
145922
145971
  }),
145923
145972
  ["agent-shim provider show z", "agent-shim provider show z --json"]
145924
145973
  );
package/dist/index.cjs CHANGED
@@ -242,7 +242,7 @@ function isTimeZone(name) {
242
242
  return false;
243
243
  }
244
244
  }
245
- var import_node_path2, import_zod, import_trilean, 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, ANTIGRAVITY_TIERS, ANTIGRAVITY_EFFORTS, ANTIGRAVITY_DEFAULT_MODE, ANTIGRAVITY_DEFAULT_MODEL, ANTIGRAVITY_DEFAULT_TIER_MODELS, ANTIGRAVITY_DEFAULT_EFFORT, AntigravityModelTargetSchema, AntigravityProviderConfigSchema, CODEX_TIERS, CODEX_EFFORTS, CODEX_LOGINS, CODEX_DEFAULT_LOGIN, CODEX_DEFAULT_MODEL, CODEX_DEFAULT_TIER_MODELS, CODEX_DEFAULT_EFFORT, CodexProviderConfigSchema, ProviderRouteSchema, HttpProviderSchema, CodexProviderSchema, AntigravityProviderSchema, ProviderSchema, 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, FrontDoorGlobalConfigSchema, UPDATE_MODES, UpdateGlobalConfigSchema, GlobalConfigSchema, IdentitySchema, CategoryClassificationSchema, CategoryClassificationOverlaySchema, SHIPPED_CATEGORY_DEFAULTS;
245
+ var import_node_path2, import_zod, import_trilean, 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, HttpProviderSchema, CodexProviderSchema, AntigravityProviderSchema, ProviderSchema, 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, FrontDoorGlobalConfigSchema, UPDATE_MODES, UpdateGlobalConfigSchema, GlobalConfigSchema, IdentitySchema, CategoryClassificationSchema, CategoryClassificationOverlaySchema, SHIPPED_CATEGORY_DEFAULTS;
246
246
  var init_schema = __esm({
247
247
  "src/config/schema.ts"() {
248
248
  "use strict";
@@ -343,7 +343,7 @@ var init_schema = __esm({
343
343
  });
344
344
  PROVIDER_KINDS = ["http", "codex", "antigravity"];
345
345
  ANTIGRAVITY_MODES = ["cloud", "local"];
346
- ANTIGRAVITY_TIERS = ["fable", "opus", "sonnet", "haiku"];
346
+ CLAUDE_TIERS = ["fable", "opus", "sonnet", "haiku"];
347
347
  ANTIGRAVITY_EFFORTS = ["none", "low", "medium", "high", "xhigh", "max"];
348
348
  ANTIGRAVITY_DEFAULT_MODE = "cloud";
349
349
  ANTIGRAVITY_DEFAULT_MODEL = "gemini-3.8-flash-high";
@@ -360,7 +360,7 @@ var init_schema = __esm({
360
360
  mode: import_zod.z.enum(ANTIGRAVITY_MODES).optional(),
361
361
  /** The model a request maps to when no tier matches its model name. */
362
362
  defaultModel: import_zod.z.string().min(1).optional(),
363
- /** Model name mapping. A key naming a tier (`fable`, `opus`, `sonnet`, `haiku`) overrides that tier's shipped model and is matched by substring of the requested name in `ANTIGRAVITY_TIERS` order; any other key is an alias, matched against the whole requested name case-insensitively, so `/model <alias>` selects its backend model. An alias outranks every other rule, including the pass-through of backend names. A value is one model or an ordered list of candidates: the request goes to the first whose quota windows are not spent, and when every candidate is spent, to the one whose binding window lifts soonest. */
363
+ /** Model name mapping. A key naming a tier (`fable`, `opus`, `sonnet`, `haiku`) overrides that tier's shipped model and is matched by substring of the requested name in `CLAUDE_TIERS` order; any other key is an alias, matched against the whole requested name case-insensitively, so `/model <alias>` selects its backend model. An alias outranks every other rule, including the pass-through of backend names. A value is one model or an ordered list of candidates: the request goes to the first whose quota windows are not spent, and when every candidate is spent, to the one whose binding window lifts soonest. */
364
364
  models: import_zod.z.record(import_zod.z.string().min(1), AntigravityModelTargetSchema).optional(),
365
365
  /** When every candidate of the tier a request names has no quota left, serve it from the next tier down, and onward through the lower tiers, instead of failing with the quota limit. Applies to a name that selects a tier (`/model fable`), not to an alias or a backend model name. Defaults to false. */
366
366
  degradeDownTiers: import_zod.z.boolean().optional(),
@@ -383,7 +383,6 @@ var init_schema = __esm({
383
383
  socketPath: import_zod.z.string().min(1).optional()
384
384
  }).optional()
385
385
  });
386
- CODEX_TIERS = ["fable", "opus", "sonnet", "haiku"];
387
386
  CODEX_EFFORTS = ["none", "low", "medium", "high"];
388
387
  CODEX_LOGINS = ["codex-cli", "chatgpt-sign-in"];
389
388
  CODEX_DEFAULT_LOGIN = "codex-cli";
@@ -398,7 +397,7 @@ var init_schema = __esm({
398
397
  CodexProviderConfigSchema = import_zod.z.strictObject({
399
398
  /** The codex model a request maps to when no tier matches its model name. */
400
399
  defaultModel: import_zod.z.string().min(1).optional(),
401
- /** Per-tier overrides of the shipped mapping, matched by substring of the requested model name in `CODEX_TIERS` order. */
400
+ /** Per-tier overrides of the shipped mapping, matched by substring of the requested model name in `CLAUDE_TIERS` order. */
402
401
  models: import_zod.z.strictObject({
403
402
  fable: import_zod.z.string().min(1).optional(),
404
403
  opus: import_zod.z.string().min(1).optional(),
@@ -418,6 +417,13 @@ var init_schema = __esm({
418
417
  /** The model name to rewrite the request to before it reaches the target, for a provider that expects another form (OpenRouter's `anthropic/claude-...` for instance). A route that rewrites reads the whole body, the one copy the rewrite needs. */
419
418
  model: import_zod.z.string().min(1).optional()
420
419
  });
420
+ PickerModelSchema = import_zod.z.strictObject({
421
+ model: import_zod.z.string().min(1),
422
+ tier: import_zod.z.enum(CLAUDE_TIERS),
423
+ label: import_zod.z.string().min(1).optional(),
424
+ description: import_zod.z.string().min(1).optional()
425
+ });
426
+ PickerModelsSchema = import_zod.z.array(PickerModelSchema).refine((models) => new Set(models.map((entry) => entry.model)).size === models.length, { message: "pickerModels names a model more than once" });
421
427
  HttpProviderSchema = import_zod.z.strictObject({
422
428
  $schema: import_zod.z.string().optional(),
423
429
  kind: import_zod.z.literal("http").optional(),
@@ -425,6 +431,8 @@ var init_schema = __esm({
425
431
  baseUrl: import_zod.z.url(),
426
432
  credential: ProviderCredentialSchema,
427
433
  env: ProviderEnvSchema.optional(),
434
+ /** Extra models `/model` lists beside the ones the tier settings name. */
435
+ pickerModels: PickerModelsSchema.optional(),
428
436
  /** Per-request routing: when present, each request this provider would serve is matched against the list in order, and the first definite match is sent to that entry's provider instead (itself resolved exactly as a directly dialled request would be). Unmatched requests stay on this provider. */
429
437
  routes: import_zod.z.array(ProviderRouteSchema).optional()
430
438
  });
@@ -434,6 +442,8 @@ var init_schema = __esm({
434
442
  displayName: import_zod.z.string().min(1),
435
443
  credential: ProviderCredentialSchema,
436
444
  env: ProviderEnvSchema.optional(),
445
+ /** Extra models `/model` lists beside the ones the tier settings name. */
446
+ pickerModels: PickerModelsSchema.optional(),
437
447
  codex: CodexProviderConfigSchema.optional()
438
448
  });
439
449
  AntigravityProviderSchema = import_zod.z.strictObject({
@@ -442,6 +452,8 @@ var init_schema = __esm({
442
452
  displayName: import_zod.z.string().min(1),
443
453
  credential: ProviderCredentialSchema,
444
454
  env: ProviderEnvSchema.optional(),
455
+ /** Extra models `/model` lists beside the ones the tier settings name. */
456
+ pickerModels: PickerModelsSchema.optional(),
445
457
  antigravity: AntigravityProviderConfigSchema.optional()
446
458
  });
447
459
  ProviderSchema = import_zod.z.discriminatedUnion("kind", [HttpProviderSchema, CodexProviderSchema, AntigravityProviderSchema]);
@@ -2935,7 +2947,7 @@ var init_package = __esm({
2935
2947
  "package.json"() {
2936
2948
  package_default = {
2937
2949
  name: "claude-use",
2938
- version: "11.24.0",
2950
+ version: "11.25.0",
2939
2951
  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.",
2940
2952
  license: "MIT",
2941
2953
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -6562,7 +6574,8 @@ function addProvider(paths, name, input) {
6562
6574
  const shared = {
6563
6575
  displayName: input.displayName,
6564
6576
  credential: { sources: input.sources, ...input.target === void 0 ? {} : { target: input.target } },
6565
- ...input.env === void 0 || Object.keys(input.env).length === 0 ? {} : { env: input.env }
6577
+ ...input.env === void 0 || Object.keys(input.env).length === 0 ? {} : { env: input.env },
6578
+ ...input.pickerModels === void 0 || input.pickerModels.length === 0 ? {} : { pickerModels: input.pickerModels }
6566
6579
  };
6567
6580
  const parsed = ProviderSchema.safeParse(
6568
6581
  kind === "codex" ? { kind, ...shared, ...isEmptyCodexConfig(input.codex) ? {} : { codex: input.codex } } : kind === "antigravity" ? { kind, ...shared, ...isEmptyAntigravityConfig(input.antigravity) ? {} : { antigravity: input.antigravity } } : { ...shared, baseUrl: input.baseUrl }
@@ -6580,6 +6593,12 @@ function updateProvider(paths, name, input) {
6580
6593
  }
6581
6594
  const unset = new Set(input.unsetEnv);
6582
6595
  const env = Object.fromEntries(Object.entries({ ...existing.env, ...input.env }).filter(([key]) => !unset.has(key)));
6596
+ const unsetPicker = new Set(input.unsetPickerModels);
6597
+ const added = new Map((input.pickerModels ?? []).map((entry) => [entry.model, entry]));
6598
+ const pickerModels = [
6599
+ ...(existing.pickerModels ?? []).filter((entry) => !unsetPicker.has(entry.model)).map((entry) => added.get(entry.model) ?? entry),
6600
+ ...[...added.values()].filter((entry) => !(existing.pickerModels ?? []).some((kept) => kept.model === entry.model))
6601
+ ];
6583
6602
  const target = input.target ?? existing.credential.target;
6584
6603
  const cache = input.cache === void 0 ? existing.credential.cache : input.cache === false ? void 0 : input.cache;
6585
6604
  if (isCodexProvider(existing) && input.baseUrl !== void 0) {
@@ -6601,7 +6620,8 @@ function updateProvider(paths, name, input) {
6601
6620
  ...target === void 0 ? {} : { target },
6602
6621
  ...cache === void 0 ? {} : { cache }
6603
6622
  },
6604
- env: Object.keys(env).length === 0 ? void 0 : env
6623
+ env: Object.keys(env).length === 0 ? void 0 : env,
6624
+ pickerModels: pickerModels.length === 0 ? void 0 : pickerModels
6605
6625
  };
6606
6626
  let candidate;
6607
6627
  if (isCodexProvider(existing)) {
@@ -7947,7 +7967,7 @@ function candidatesOf(target) {
7947
7967
  return typeof target === "string" ? [target] : target;
7948
7968
  }
7949
7969
  function isAntigravityTier(key) {
7950
- return ANTIGRAVITY_TIERS.some((tier) => tier === key);
7970
+ return CLAUDE_TIERS.some((tier) => tier === key);
7951
7971
  }
7952
7972
  function resolveAntigravityConfig(config) {
7953
7973
  const overrides = config?.models ?? {};
@@ -8013,6 +8033,12 @@ var init_translate2 = __esm({
8013
8033
  });
8014
8034
 
8015
8035
  // src/launcher/modelPicker.ts
8036
+ function labelOf(model) {
8037
+ return model.toLowerCase().endsWith(CONTEXT_MARKER_1M) ? model.slice(0, -CONTEXT_MARKER_1M.length) : model;
8038
+ }
8039
+ function describedAs(model, description) {
8040
+ return model.toLowerCase().endsWith(CONTEXT_MARKER_1M) ? `${description}; 1M context` : description;
8041
+ }
8016
8042
  function joined(parts) {
8017
8043
  const last = parts[parts.length - 1];
8018
8044
  return last === void 0 || parts.length === 1 ? last ?? "" : `${parts.slice(0, -1).join(", ")} and ${last}`;
@@ -8026,7 +8052,7 @@ function rowOf2(model, reaches) {
8026
8052
  const fallbacks = reaches.filter((reach) => reach.standing === "fallback").map((reach) => reach.tier);
8027
8053
  const serves = firsts.length === 0 ? [] : [`Serves the ${joined(firsts)} tier${firsts.length === 1 ? "" : "s"}`];
8028
8054
  const falls = fallbacks.length === 0 ? [] : [`${serves.length === 0 ? "Fallback" : "fallback"} for ${joined(fallbacks)}`];
8029
- return { model, label: model, description: [...serves, ...falls].join("; "), behavesAs: TIER_BEHAVES_AS[lead.tier] };
8055
+ return { model, label: labelOf(model), description: describedAs(model, [...serves, ...falls].join("; ")), behavesAs: TIER_BEHAVES_AS[lead.tier] };
8030
8056
  }
8031
8057
  function rowsOfTable(table) {
8032
8058
  const reachesByModel = /* @__PURE__ */ new Map();
@@ -8043,47 +8069,53 @@ function rowsOfTable(table) {
8043
8069
  }
8044
8070
  function antigravityRows(provider) {
8045
8071
  const config = resolveAntigravityConfig(provider.antigravity);
8046
- const tiers = rowsOfTable(ANTIGRAVITY_TIERS.map((tier) => [tier, config.models[tier]]));
8072
+ const tiers = rowsOfTable(CLAUDE_TIERS.map((tier) => [tier, config.models[tier]]));
8047
8073
  const behavesAsOf = new Map(tiers.map((row) => [row.model, row.behavesAs]));
8048
8074
  const aliases = [...config.aliases].flatMap(([alias, candidates]) => {
8049
8075
  const [first] = candidates;
8050
8076
  const behavesAs = first === void 0 ? void 0 : behavesAsOf.get(first);
8051
- return behavesAs === void 0 ? [] : [{ model: alias, label: alias, description: `Alias for ${candidates.join(", then ")}`, behavesAs }];
8077
+ return behavesAs === void 0 ? [] : [{ model: alias, label: labelOf(alias), description: `Alias for ${candidates.join(", then ")}`, behavesAs }];
8052
8078
  });
8053
8079
  return [...tiers, ...aliases];
8054
8080
  }
8055
8081
  function codexRows(provider) {
8056
8082
  const config = resolveCodexConfig(provider.codex);
8057
- return rowsOfTable(CODEX_TIERS.map((tier) => [tier, [config.models[tier]]]));
8083
+ return rowsOfTable(CLAUDE_TIERS.map((tier) => [tier, [config.models[tier]]]));
8058
8084
  }
8059
8085
  function httpRows(provider) {
8060
8086
  const env = provider.env ?? {};
8061
- const table = CODEX_TIERS.flatMap((tier) => {
8087
+ const table = CLAUDE_TIERS.flatMap((tier) => {
8062
8088
  const model = env[TIER_ENV_VARIABLES[tier]];
8063
8089
  return model === void 0 || model === "" ? [] : [[tier, [model]]];
8064
8090
  });
8065
8091
  return rowsOfTable(table);
8066
8092
  }
8093
+ function declaredRow(entry) {
8094
+ return {
8095
+ model: entry.model,
8096
+ label: entry.label ?? labelOf(entry.model),
8097
+ description: entry.description ?? describedAs(entry.model, `Declared by the provider for the ${entry.tier} tier`),
8098
+ behavesAs: TIER_BEHAVES_AS[entry.tier]
8099
+ };
8100
+ }
8067
8101
  function providerModelRows(provider) {
8068
- if (provider.kind === "codex") {
8069
- return codexRows(provider);
8070
- }
8071
- if (provider.kind === "antigravity") {
8072
- return antigravityRows(provider);
8073
- }
8074
- return httpRows(provider);
8102
+ const derived = provider.kind === "codex" ? codexRows(provider) : provider.kind === "antigravity" ? antigravityRows(provider) : httpRows(provider);
8103
+ const declared = (provider.pickerModels ?? []).map(declaredRow);
8104
+ const declaredModels = new Set(declared.map((row) => row.model));
8105
+ return [...derived.filter((row) => !declaredModels.has(row.model)), ...declared];
8075
8106
  }
8076
8107
  function modelPickerSettings(provider) {
8077
8108
  const options = providerModelRows(provider);
8078
8109
  return options.length === 0 ? void 0 : JSON.stringify({ modelPicker: { options, replaceBuiltInOptions: true } });
8079
8110
  }
8080
- var TIER_BEHAVES_AS, TIER_ENV_VARIABLES;
8111
+ var CONTEXT_MARKER_1M, TIER_BEHAVES_AS, TIER_ENV_VARIABLES;
8081
8112
  var init_modelPicker = __esm({
8082
8113
  "src/launcher/modelPicker.ts"() {
8083
8114
  "use strict";
8084
8115
  init_translate();
8085
8116
  init_translate2();
8086
8117
  init_schema();
8118
+ CONTEXT_MARKER_1M = "[1m]";
8087
8119
  TIER_BEHAVES_AS = Object.freeze({
8088
8120
  fable: "claude-fable-5-1",
8089
8121
  opus: "claude-opus-5-5",
package/dist/index.mjs CHANGED
@@ -223,7 +223,7 @@ function isTimeZone(name) {
223
223
  return false;
224
224
  }
225
225
  }
226
- var 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, ANTIGRAVITY_TIERS, ANTIGRAVITY_EFFORTS, ANTIGRAVITY_DEFAULT_MODE, ANTIGRAVITY_DEFAULT_MODEL, ANTIGRAVITY_DEFAULT_TIER_MODELS, ANTIGRAVITY_DEFAULT_EFFORT, AntigravityModelTargetSchema, AntigravityProviderConfigSchema, CODEX_TIERS, CODEX_EFFORTS, CODEX_LOGINS, CODEX_DEFAULT_LOGIN, CODEX_DEFAULT_MODEL, CODEX_DEFAULT_TIER_MODELS, CODEX_DEFAULT_EFFORT, CodexProviderConfigSchema, ProviderRouteSchema, HttpProviderSchema, CodexProviderSchema, AntigravityProviderSchema, ProviderSchema, 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, FrontDoorGlobalConfigSchema, UPDATE_MODES, UpdateGlobalConfigSchema, GlobalConfigSchema, IdentitySchema, CategoryClassificationSchema, CategoryClassificationOverlaySchema, SHIPPED_CATEGORY_DEFAULTS;
226
+ var 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, HttpProviderSchema, CodexProviderSchema, AntigravityProviderSchema, ProviderSchema, 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, FrontDoorGlobalConfigSchema, UPDATE_MODES, UpdateGlobalConfigSchema, GlobalConfigSchema, IdentitySchema, CategoryClassificationSchema, CategoryClassificationOverlaySchema, SHIPPED_CATEGORY_DEFAULTS;
227
227
  var init_schema = __esm({
228
228
  "src/config/schema.ts"() {
229
229
  "use strict";
@@ -321,7 +321,7 @@ var init_schema = __esm({
321
321
  });
322
322
  PROVIDER_KINDS = ["http", "codex", "antigravity"];
323
323
  ANTIGRAVITY_MODES = ["cloud", "local"];
324
- ANTIGRAVITY_TIERS = ["fable", "opus", "sonnet", "haiku"];
324
+ CLAUDE_TIERS = ["fable", "opus", "sonnet", "haiku"];
325
325
  ANTIGRAVITY_EFFORTS = ["none", "low", "medium", "high", "xhigh", "max"];
326
326
  ANTIGRAVITY_DEFAULT_MODE = "cloud";
327
327
  ANTIGRAVITY_DEFAULT_MODEL = "gemini-3.8-flash-high";
@@ -338,7 +338,7 @@ var init_schema = __esm({
338
338
  mode: z.enum(ANTIGRAVITY_MODES).optional(),
339
339
  /** The model a request maps to when no tier matches its model name. */
340
340
  defaultModel: z.string().min(1).optional(),
341
- /** Model name mapping. A key naming a tier (`fable`, `opus`, `sonnet`, `haiku`) overrides that tier's shipped model and is matched by substring of the requested name in `ANTIGRAVITY_TIERS` order; any other key is an alias, matched against the whole requested name case-insensitively, so `/model <alias>` selects its backend model. An alias outranks every other rule, including the pass-through of backend names. A value is one model or an ordered list of candidates: the request goes to the first whose quota windows are not spent, and when every candidate is spent, to the one whose binding window lifts soonest. */
341
+ /** Model name mapping. A key naming a tier (`fable`, `opus`, `sonnet`, `haiku`) overrides that tier's shipped model and is matched by substring of the requested name in `CLAUDE_TIERS` order; any other key is an alias, matched against the whole requested name case-insensitively, so `/model <alias>` selects its backend model. An alias outranks every other rule, including the pass-through of backend names. A value is one model or an ordered list of candidates: the request goes to the first whose quota windows are not spent, and when every candidate is spent, to the one whose binding window lifts soonest. */
342
342
  models: z.record(z.string().min(1), AntigravityModelTargetSchema).optional(),
343
343
  /** When every candidate of the tier a request names has no quota left, serve it from the next tier down, and onward through the lower tiers, instead of failing with the quota limit. Applies to a name that selects a tier (`/model fable`), not to an alias or a backend model name. Defaults to false. */
344
344
  degradeDownTiers: z.boolean().optional(),
@@ -361,7 +361,6 @@ var init_schema = __esm({
361
361
  socketPath: z.string().min(1).optional()
362
362
  }).optional()
363
363
  });
364
- CODEX_TIERS = ["fable", "opus", "sonnet", "haiku"];
365
364
  CODEX_EFFORTS = ["none", "low", "medium", "high"];
366
365
  CODEX_LOGINS = ["codex-cli", "chatgpt-sign-in"];
367
366
  CODEX_DEFAULT_LOGIN = "codex-cli";
@@ -376,7 +375,7 @@ var init_schema = __esm({
376
375
  CodexProviderConfigSchema = z.strictObject({
377
376
  /** The codex model a request maps to when no tier matches its model name. */
378
377
  defaultModel: z.string().min(1).optional(),
379
- /** Per-tier overrides of the shipped mapping, matched by substring of the requested model name in `CODEX_TIERS` order. */
378
+ /** Per-tier overrides of the shipped mapping, matched by substring of the requested model name in `CLAUDE_TIERS` order. */
380
379
  models: z.strictObject({
381
380
  fable: z.string().min(1).optional(),
382
381
  opus: z.string().min(1).optional(),
@@ -396,6 +395,13 @@ var init_schema = __esm({
396
395
  /** The model name to rewrite the request to before it reaches the target, for a provider that expects another form (OpenRouter's `anthropic/claude-...` for instance). A route that rewrites reads the whole body, the one copy the rewrite needs. */
397
396
  model: z.string().min(1).optional()
398
397
  });
398
+ PickerModelSchema = z.strictObject({
399
+ model: z.string().min(1),
400
+ tier: z.enum(CLAUDE_TIERS),
401
+ label: z.string().min(1).optional(),
402
+ description: z.string().min(1).optional()
403
+ });
404
+ PickerModelsSchema = z.array(PickerModelSchema).refine((models) => new Set(models.map((entry) => entry.model)).size === models.length, { message: "pickerModels names a model more than once" });
399
405
  HttpProviderSchema = z.strictObject({
400
406
  $schema: z.string().optional(),
401
407
  kind: z.literal("http").optional(),
@@ -403,6 +409,8 @@ var init_schema = __esm({
403
409
  baseUrl: z.url(),
404
410
  credential: ProviderCredentialSchema,
405
411
  env: ProviderEnvSchema.optional(),
412
+ /** Extra models `/model` lists beside the ones the tier settings name. */
413
+ pickerModels: PickerModelsSchema.optional(),
406
414
  /** Per-request routing: when present, each request this provider would serve is matched against the list in order, and the first definite match is sent to that entry's provider instead (itself resolved exactly as a directly dialled request would be). Unmatched requests stay on this provider. */
407
415
  routes: z.array(ProviderRouteSchema).optional()
408
416
  });
@@ -412,6 +420,8 @@ var init_schema = __esm({
412
420
  displayName: z.string().min(1),
413
421
  credential: ProviderCredentialSchema,
414
422
  env: ProviderEnvSchema.optional(),
423
+ /** Extra models `/model` lists beside the ones the tier settings name. */
424
+ pickerModels: PickerModelsSchema.optional(),
415
425
  codex: CodexProviderConfigSchema.optional()
416
426
  });
417
427
  AntigravityProviderSchema = z.strictObject({
@@ -420,6 +430,8 @@ var init_schema = __esm({
420
430
  displayName: z.string().min(1),
421
431
  credential: ProviderCredentialSchema,
422
432
  env: ProviderEnvSchema.optional(),
433
+ /** Extra models `/model` lists beside the ones the tier settings name. */
434
+ pickerModels: PickerModelsSchema.optional(),
423
435
  antigravity: AntigravityProviderConfigSchema.optional()
424
436
  });
425
437
  ProviderSchema = z.discriminatedUnion("kind", [HttpProviderSchema, CodexProviderSchema, AntigravityProviderSchema]);
@@ -2911,7 +2923,7 @@ var init_package = __esm({
2911
2923
  "package.json"() {
2912
2924
  package_default = {
2913
2925
  name: "claude-use",
2914
- version: "11.24.0",
2926
+ version: "11.25.0",
2915
2927
  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.",
2916
2928
  license: "MIT",
2917
2929
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -6537,7 +6549,8 @@ function addProvider(paths, name, input) {
6537
6549
  const shared = {
6538
6550
  displayName: input.displayName,
6539
6551
  credential: { sources: input.sources, ...input.target === void 0 ? {} : { target: input.target } },
6540
- ...input.env === void 0 || Object.keys(input.env).length === 0 ? {} : { env: input.env }
6552
+ ...input.env === void 0 || Object.keys(input.env).length === 0 ? {} : { env: input.env },
6553
+ ...input.pickerModels === void 0 || input.pickerModels.length === 0 ? {} : { pickerModels: input.pickerModels }
6541
6554
  };
6542
6555
  const parsed = ProviderSchema.safeParse(
6543
6556
  kind === "codex" ? { kind, ...shared, ...isEmptyCodexConfig(input.codex) ? {} : { codex: input.codex } } : kind === "antigravity" ? { kind, ...shared, ...isEmptyAntigravityConfig(input.antigravity) ? {} : { antigravity: input.antigravity } } : { ...shared, baseUrl: input.baseUrl }
@@ -6555,6 +6568,12 @@ function updateProvider(paths, name, input) {
6555
6568
  }
6556
6569
  const unset = new Set(input.unsetEnv);
6557
6570
  const env = Object.fromEntries(Object.entries({ ...existing.env, ...input.env }).filter(([key]) => !unset.has(key)));
6571
+ const unsetPicker = new Set(input.unsetPickerModels);
6572
+ const added = new Map((input.pickerModels ?? []).map((entry) => [entry.model, entry]));
6573
+ const pickerModels = [
6574
+ ...(existing.pickerModels ?? []).filter((entry) => !unsetPicker.has(entry.model)).map((entry) => added.get(entry.model) ?? entry),
6575
+ ...[...added.values()].filter((entry) => !(existing.pickerModels ?? []).some((kept) => kept.model === entry.model))
6576
+ ];
6558
6577
  const target = input.target ?? existing.credential.target;
6559
6578
  const cache = input.cache === void 0 ? existing.credential.cache : input.cache === false ? void 0 : input.cache;
6560
6579
  if (isCodexProvider(existing) && input.baseUrl !== void 0) {
@@ -6576,7 +6595,8 @@ function updateProvider(paths, name, input) {
6576
6595
  ...target === void 0 ? {} : { target },
6577
6596
  ...cache === void 0 ? {} : { cache }
6578
6597
  },
6579
- env: Object.keys(env).length === 0 ? void 0 : env
6598
+ env: Object.keys(env).length === 0 ? void 0 : env,
6599
+ pickerModels: pickerModels.length === 0 ? void 0 : pickerModels
6580
6600
  };
6581
6601
  let candidate;
6582
6602
  if (isCodexProvider(existing)) {
@@ -7919,7 +7939,7 @@ function candidatesOf(target) {
7919
7939
  return typeof target === "string" ? [target] : target;
7920
7940
  }
7921
7941
  function isAntigravityTier(key) {
7922
- return ANTIGRAVITY_TIERS.some((tier) => tier === key);
7942
+ return CLAUDE_TIERS.some((tier) => tier === key);
7923
7943
  }
7924
7944
  function resolveAntigravityConfig(config) {
7925
7945
  const overrides = config?.models ?? {};
@@ -7985,6 +8005,12 @@ var init_translate2 = __esm({
7985
8005
  });
7986
8006
 
7987
8007
  // src/launcher/modelPicker.ts
8008
+ function labelOf(model) {
8009
+ return model.toLowerCase().endsWith(CONTEXT_MARKER_1M) ? model.slice(0, -CONTEXT_MARKER_1M.length) : model;
8010
+ }
8011
+ function describedAs(model, description) {
8012
+ return model.toLowerCase().endsWith(CONTEXT_MARKER_1M) ? `${description}; 1M context` : description;
8013
+ }
7988
8014
  function joined(parts) {
7989
8015
  const last = parts[parts.length - 1];
7990
8016
  return last === void 0 || parts.length === 1 ? last ?? "" : `${parts.slice(0, -1).join(", ")} and ${last}`;
@@ -7998,7 +8024,7 @@ function rowOf2(model, reaches) {
7998
8024
  const fallbacks = reaches.filter((reach) => reach.standing === "fallback").map((reach) => reach.tier);
7999
8025
  const serves = firsts.length === 0 ? [] : [`Serves the ${joined(firsts)} tier${firsts.length === 1 ? "" : "s"}`];
8000
8026
  const falls = fallbacks.length === 0 ? [] : [`${serves.length === 0 ? "Fallback" : "fallback"} for ${joined(fallbacks)}`];
8001
- return { model, label: model, description: [...serves, ...falls].join("; "), behavesAs: TIER_BEHAVES_AS[lead.tier] };
8027
+ return { model, label: labelOf(model), description: describedAs(model, [...serves, ...falls].join("; ")), behavesAs: TIER_BEHAVES_AS[lead.tier] };
8002
8028
  }
8003
8029
  function rowsOfTable(table) {
8004
8030
  const reachesByModel = /* @__PURE__ */ new Map();
@@ -8015,47 +8041,53 @@ function rowsOfTable(table) {
8015
8041
  }
8016
8042
  function antigravityRows(provider) {
8017
8043
  const config = resolveAntigravityConfig(provider.antigravity);
8018
- const tiers = rowsOfTable(ANTIGRAVITY_TIERS.map((tier) => [tier, config.models[tier]]));
8044
+ const tiers = rowsOfTable(CLAUDE_TIERS.map((tier) => [tier, config.models[tier]]));
8019
8045
  const behavesAsOf = new Map(tiers.map((row) => [row.model, row.behavesAs]));
8020
8046
  const aliases = [...config.aliases].flatMap(([alias, candidates]) => {
8021
8047
  const [first] = candidates;
8022
8048
  const behavesAs = first === void 0 ? void 0 : behavesAsOf.get(first);
8023
- return behavesAs === void 0 ? [] : [{ model: alias, label: alias, description: `Alias for ${candidates.join(", then ")}`, behavesAs }];
8049
+ return behavesAs === void 0 ? [] : [{ model: alias, label: labelOf(alias), description: `Alias for ${candidates.join(", then ")}`, behavesAs }];
8024
8050
  });
8025
8051
  return [...tiers, ...aliases];
8026
8052
  }
8027
8053
  function codexRows(provider) {
8028
8054
  const config = resolveCodexConfig(provider.codex);
8029
- return rowsOfTable(CODEX_TIERS.map((tier) => [tier, [config.models[tier]]]));
8055
+ return rowsOfTable(CLAUDE_TIERS.map((tier) => [tier, [config.models[tier]]]));
8030
8056
  }
8031
8057
  function httpRows(provider) {
8032
8058
  const env = provider.env ?? {};
8033
- const table = CODEX_TIERS.flatMap((tier) => {
8059
+ const table = CLAUDE_TIERS.flatMap((tier) => {
8034
8060
  const model = env[TIER_ENV_VARIABLES[tier]];
8035
8061
  return model === void 0 || model === "" ? [] : [[tier, [model]]];
8036
8062
  });
8037
8063
  return rowsOfTable(table);
8038
8064
  }
8065
+ function declaredRow(entry) {
8066
+ return {
8067
+ model: entry.model,
8068
+ label: entry.label ?? labelOf(entry.model),
8069
+ description: entry.description ?? describedAs(entry.model, `Declared by the provider for the ${entry.tier} tier`),
8070
+ behavesAs: TIER_BEHAVES_AS[entry.tier]
8071
+ };
8072
+ }
8039
8073
  function providerModelRows(provider) {
8040
- if (provider.kind === "codex") {
8041
- return codexRows(provider);
8042
- }
8043
- if (provider.kind === "antigravity") {
8044
- return antigravityRows(provider);
8045
- }
8046
- return httpRows(provider);
8074
+ const derived = provider.kind === "codex" ? codexRows(provider) : provider.kind === "antigravity" ? antigravityRows(provider) : httpRows(provider);
8075
+ const declared = (provider.pickerModels ?? []).map(declaredRow);
8076
+ const declaredModels = new Set(declared.map((row) => row.model));
8077
+ return [...derived.filter((row) => !declaredModels.has(row.model)), ...declared];
8047
8078
  }
8048
8079
  function modelPickerSettings(provider) {
8049
8080
  const options = providerModelRows(provider);
8050
8081
  return options.length === 0 ? void 0 : JSON.stringify({ modelPicker: { options, replaceBuiltInOptions: true } });
8051
8082
  }
8052
- var TIER_BEHAVES_AS, TIER_ENV_VARIABLES;
8083
+ var CONTEXT_MARKER_1M, TIER_BEHAVES_AS, TIER_ENV_VARIABLES;
8053
8084
  var init_modelPicker = __esm({
8054
8085
  "src/launcher/modelPicker.ts"() {
8055
8086
  "use strict";
8056
8087
  init_translate();
8057
8088
  init_translate2();
8058
8089
  init_schema();
8090
+ CONTEXT_MARKER_1M = "[1m]";
8059
8091
  TIER_BEHAVES_AS = Object.freeze({
8060
8092
  fable: "claude-fable-5-1",
8061
8093
  opus: "claude-opus-5-5",
@@ -434,6 +434,21 @@ declare const CodexProviderConfigSchema: z.ZodObject<{
434
434
  }>>;
435
435
  }, z.core.$strict>;
436
436
  type CodexProviderConfig = z.infer<typeof CodexProviderConfigSchema>;
437
+ /**
438
+ * A model a provider serves that `/model` should list beside the ones its tier settings name. `tier` is the Claude tier whose client-side handling (prompt profile, effort defaults) the row borrows, since Claude Code knows no handling for a model it has not heard of. `label` defaults to the model name and `description` to a generic line.
439
+ */
440
+ declare const PickerModelSchema: z.ZodObject<{
441
+ model: z.ZodString;
442
+ tier: z.ZodEnum<{
443
+ fable: "fable";
444
+ opus: "opus";
445
+ sonnet: "sonnet";
446
+ haiku: "haiku";
447
+ }>;
448
+ label: z.ZodOptional<z.ZodString>;
449
+ description: z.ZodOptional<z.ZodString>;
450
+ }, z.core.$strict>;
451
+ type PickerModel = z.infer<typeof PickerModelSchema>;
437
452
  /** All kinds of provider; see `HttpProviderSchema` for the shared fields. */
438
453
  declare const ProviderSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
439
454
  $schema: z.ZodOptional<z.ZodString>;
@@ -476,6 +491,17 @@ declare const ProviderSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
476
491
  }>>;
477
492
  }, z.core.$strict>;
478
493
  env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
494
+ pickerModels: z.ZodOptional<z.ZodArray<z.ZodObject<{
495
+ model: z.ZodString;
496
+ tier: z.ZodEnum<{
497
+ fable: "fable";
498
+ opus: "opus";
499
+ sonnet: "sonnet";
500
+ haiku: "haiku";
501
+ }>;
502
+ label: z.ZodOptional<z.ZodString>;
503
+ description: z.ZodOptional<z.ZodString>;
504
+ }, z.core.$strict>>>;
479
505
  routes: z.ZodOptional<z.ZodArray<z.ZodObject<{
480
506
  when: z.ZodUnion<readonly [z.ZodObject<{
481
507
  newerThan: z.ZodOptional<z.ZodString>;
@@ -592,6 +618,17 @@ declare const ProviderSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
592
618
  }>>;
593
619
  }, z.core.$strict>;
594
620
  env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
621
+ pickerModels: z.ZodOptional<z.ZodArray<z.ZodObject<{
622
+ model: z.ZodString;
623
+ tier: z.ZodEnum<{
624
+ fable: "fable";
625
+ opus: "opus";
626
+ sonnet: "sonnet";
627
+ haiku: "haiku";
628
+ }>;
629
+ label: z.ZodOptional<z.ZodString>;
630
+ description: z.ZodOptional<z.ZodString>;
631
+ }, z.core.$strict>>>;
595
632
  codex: z.ZodOptional<z.ZodObject<{
596
633
  defaultModel: z.ZodOptional<z.ZodString>;
597
634
  models: z.ZodOptional<z.ZodObject<{
@@ -651,6 +688,17 @@ declare const ProviderSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
651
688
  }>>;
652
689
  }, z.core.$strict>;
653
690
  env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
691
+ pickerModels: z.ZodOptional<z.ZodArray<z.ZodObject<{
692
+ model: z.ZodString;
693
+ tier: z.ZodEnum<{
694
+ fable: "fable";
695
+ opus: "opus";
696
+ sonnet: "sonnet";
697
+ haiku: "haiku";
698
+ }>;
699
+ label: z.ZodOptional<z.ZodString>;
700
+ description: z.ZodOptional<z.ZodString>;
701
+ }, z.core.$strict>>>;
654
702
  antigravity: z.ZodOptional<z.ZodObject<{
655
703
  mode: z.ZodOptional<z.ZodEnum<{
656
704
  cloud: "cloud";
@@ -4323,10 +4371,10 @@ declare const CheckReportJsonSchema: z.ZodObject<{
4323
4371
  configProfile: z.ZodObject<{
4324
4372
  name: z.ZodNullable<z.ZodString>;
4325
4373
  source: z.ZodEnum<{
4326
- "directory-rule": "directory-rule";
4327
4374
  env: "env";
4328
4375
  none: "none";
4329
4376
  "cli-flag": "cli-flag";
4377
+ "directory-rule": "directory-rule";
4330
4378
  "identity-default": "identity-default";
4331
4379
  "global-default": "global-default";
4332
4380
  }>;
@@ -4334,9 +4382,9 @@ declare const CheckReportJsonSchema: z.ZodObject<{
4334
4382
  layers: z.ZodReadonly<z.ZodArray<z.ZodObject<{
4335
4383
  id: z.ZodInt;
4336
4384
  kind: z.ZodEnum<{
4385
+ "directory-rule": "directory-rule";
4337
4386
  "global-config": "global-config";
4338
4387
  "config-profile": "config-profile";
4339
- "directory-rule": "directory-rule";
4340
4388
  portable: "portable";
4341
4389
  "portable-local": "portable-local";
4342
4390
  "cli-override": "cli-override";
@@ -7378,10 +7426,10 @@ declare function createLaunchApiRouter(deps: LaunchApiDeps): {
7378
7426
  configDir: zod.ZodOptional<zod.ZodString>;
7379
7427
  configProfile: zod.ZodOptional<zod.ZodString>;
7380
7428
  configProfileSource: zod.ZodEnum<{
7381
- "directory-rule": "directory-rule";
7382
7429
  env: "env";
7383
7430
  none: "none";
7384
7431
  "cli-flag": "cli-flag";
7432
+ "directory-rule": "directory-rule";
7385
7433
  "identity-default": "identity-default";
7386
7434
  "global-default": "global-default";
7387
7435
  }>;
@@ -8015,10 +8063,10 @@ declare function createControlApiRouter(deps: ControlApiDeps): {
8015
8063
  configProfile: zod.ZodObject<{
8016
8064
  name: zod.ZodNullable<zod.ZodString>;
8017
8065
  source: zod.ZodEnum<{
8018
- "directory-rule": "directory-rule";
8019
8066
  env: "env";
8020
8067
  none: "none";
8021
8068
  "cli-flag": "cli-flag";
8069
+ "directory-rule": "directory-rule";
8022
8070
  "identity-default": "identity-default";
8023
8071
  "global-default": "global-default";
8024
8072
  }>;
@@ -8026,9 +8074,9 @@ declare function createControlApiRouter(deps: ControlApiDeps): {
8026
8074
  layers: zod.ZodReadonly<zod.ZodArray<zod.ZodObject<{
8027
8075
  id: zod.ZodInt;
8028
8076
  kind: zod.ZodEnum<{
8077
+ "directory-rule": "directory-rule";
8029
8078
  "global-config": "global-config";
8030
8079
  "config-profile": "config-profile";
8031
- "directory-rule": "directory-rule";
8032
8080
  portable: "portable";
8033
8081
  "portable-local": "portable-local";
8034
8082
  "cli-override": "cli-override";
@@ -8266,12 +8314,12 @@ declare function createControlApiRouter(deps: ControlApiDeps): {
8266
8314
  ok: zod.ZodBoolean;
8267
8315
  findings: zod.ZodReadonly<zod.ZodArray<zod.ZodObject<{
8268
8316
  section: zod.ZodEnum<{
8269
- "global-config": "global-config";
8270
- "config-profile": "config-profile";
8271
8317
  identity: "identity";
8272
8318
  provider: "provider";
8273
8319
  frontdoor: "frontdoor";
8274
8320
  pool: "pool";
8321
+ "global-config": "global-config";
8322
+ "config-profile": "config-profile";
8275
8323
  keychain: "keychain";
8276
8324
  "ambient-credential": "ambient-credential";
8277
8325
  "binary-discovery": "binary-discovery";
@@ -8494,10 +8542,10 @@ declare function createDoorApiRouter(deps: DoorApiDeps): {
8494
8542
  configDir: zod.ZodOptional<zod.ZodString>;
8495
8543
  configProfile: zod.ZodOptional<zod.ZodString>;
8496
8544
  configProfileSource: zod.ZodEnum<{
8497
- "directory-rule": "directory-rule";
8498
8545
  env: "env";
8499
8546
  none: "none";
8500
8547
  "cli-flag": "cli-flag";
8548
+ "directory-rule": "directory-rule";
8501
8549
  "identity-default": "identity-default";
8502
8550
  "global-default": "global-default";
8503
8551
  }>;
@@ -10128,10 +10176,10 @@ declare function createDoorApiRouter(deps: DoorApiDeps): {
10128
10176
  configProfile: zod.ZodObject<{
10129
10177
  name: zod.ZodNullable<zod.ZodString>;
10130
10178
  source: zod.ZodEnum<{
10131
- "directory-rule": "directory-rule";
10132
10179
  env: "env";
10133
10180
  none: "none";
10134
10181
  "cli-flag": "cli-flag";
10182
+ "directory-rule": "directory-rule";
10135
10183
  "identity-default": "identity-default";
10136
10184
  "global-default": "global-default";
10137
10185
  }>;
@@ -10139,9 +10187,9 @@ declare function createDoorApiRouter(deps: DoorApiDeps): {
10139
10187
  layers: zod.ZodReadonly<zod.ZodArray<zod.ZodObject<{
10140
10188
  id: zod.ZodInt;
10141
10189
  kind: zod.ZodEnum<{
10190
+ "directory-rule": "directory-rule";
10142
10191
  "global-config": "global-config";
10143
10192
  "config-profile": "config-profile";
10144
- "directory-rule": "directory-rule";
10145
10193
  portable: "portable";
10146
10194
  "portable-local": "portable-local";
10147
10195
  "cli-override": "cli-override";
@@ -10379,12 +10427,12 @@ declare function createDoorApiRouter(deps: DoorApiDeps): {
10379
10427
  ok: zod.ZodBoolean;
10380
10428
  findings: zod.ZodReadonly<zod.ZodArray<zod.ZodObject<{
10381
10429
  section: zod.ZodEnum<{
10382
- "global-config": "global-config";
10383
- "config-profile": "config-profile";
10384
10430
  identity: "identity";
10385
10431
  provider: "provider";
10386
10432
  frontdoor: "frontdoor";
10387
10433
  pool: "pool";
10434
+ "global-config": "global-config";
10435
+ "config-profile": "config-profile";
10388
10436
  keychain: "keychain";
10389
10437
  "ambient-credential": "ambient-credential";
10390
10438
  "binary-discovery": "binary-discovery";
@@ -12244,12 +12292,12 @@ declare const CheckRunInputSchema: z.ZodObject<{
12244
12292
  /** One line of the doctor report: the section it belongs to, its severity, its message, and the identity/profile/rule it is about when there is one. */
12245
12293
  declare const DoctorFindingSchema: z.ZodObject<{
12246
12294
  section: z.ZodEnum<{
12247
- "global-config": "global-config";
12248
- "config-profile": "config-profile";
12249
12295
  identity: "identity";
12250
12296
  provider: "provider";
12251
12297
  frontdoor: "frontdoor";
12252
12298
  pool: "pool";
12299
+ "global-config": "global-config";
12300
+ "config-profile": "config-profile";
12253
12301
  keychain: "keychain";
12254
12302
  "ambient-credential": "ambient-credential";
12255
12303
  "binary-discovery": "binary-discovery";
@@ -12275,12 +12323,12 @@ declare const DoctorRunOutputSchema: z.ZodObject<{
12275
12323
  ok: z.ZodBoolean;
12276
12324
  findings: z.ZodReadonly<z.ZodArray<z.ZodObject<{
12277
12325
  section: z.ZodEnum<{
12278
- "global-config": "global-config";
12279
- "config-profile": "config-profile";
12280
12326
  identity: "identity";
12281
12327
  provider: "provider";
12282
12328
  frontdoor: "frontdoor";
12283
12329
  pool: "pool";
12330
+ "global-config": "global-config";
12331
+ "config-profile": "config-profile";
12284
12332
  keychain: "keychain";
12285
12333
  "ambient-credential": "ambient-credential";
12286
12334
  "binary-discovery": "binary-discovery";
@@ -12383,10 +12431,10 @@ declare const LaunchResolveOutputSchema: z.ZodObject<{
12383
12431
  configDir: z.ZodOptional<z.ZodString>;
12384
12432
  configProfile: z.ZodOptional<z.ZodString>;
12385
12433
  configProfileSource: z.ZodEnum<{
12386
- "directory-rule": "directory-rule";
12387
12434
  env: "env";
12388
12435
  none: "none";
12389
12436
  "cli-flag": "cli-flag";
12437
+ "directory-rule": "directory-rule";
12390
12438
  "identity-default": "identity-default";
12391
12439
  "global-default": "global-default";
12392
12440
  }>;
@@ -13416,6 +13464,8 @@ interface AddProviderInput {
13416
13464
  readonly sources: readonly CredentialSource[];
13417
13465
  readonly target?: ProviderCredentialTarget;
13418
13466
  readonly env?: Readonly<Record<string, string>>;
13467
+ /** Extra models `/model` lists beside the ones the tier settings name; applies to every provider kind. */
13468
+ readonly pickerModels?: readonly PickerModel[];
13419
13469
  readonly codex?: CodexProviderConfig;
13420
13470
  readonly antigravity?: AntigravityProviderConfig;
13421
13471
  }
@@ -13439,6 +13489,10 @@ interface UpdateProviderInput {
13439
13489
  readonly cache?: CredentialCache | false;
13440
13490
  readonly env?: Readonly<Record<string, string>>;
13441
13491
  readonly unsetEnv?: readonly string[];
13492
+ /** Picker models to add; one for a model the provider already declares replaces that entry in place. */
13493
+ readonly pickerModels?: readonly PickerModel[];
13494
+ /** Models whose picker entries are removed. */
13495
+ readonly unsetPickerModels?: readonly string[];
13442
13496
  /** Merged over a codex provider's existing settings: a field given here replaces that field, and `models` entries merge per tier. */
13443
13497
  readonly codex?: CodexProviderConfig;
13444
13498
  /** Merged over an antigravity provider's existing settings: a field given here replaces that field, and `models` entries merge per tier. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-use",
3
- "version": "11.24.0",
3
+ "version": "11.25.0",
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>",