claude-use 11.17.1 → 11.18.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
@@ -27012,10 +27012,10 @@ var init_schema = __esm({
27012
27012
  ANTIGRAVITY_DEFAULT_MODE = "cloud";
27013
27013
  ANTIGRAVITY_DEFAULT_MODEL = "gemini-3.8-flash-high";
27014
27014
  ANTIGRAVITY_DEFAULT_TIER_MODELS = Object.freeze({
27015
- fable: ["claude-opus-5-5-high", "gemini-4-argon-high", "gemini-3.8-flash-high"],
27015
+ fable: ["gemini-4-argon-high", "claude-opus-5-5-high", "gemini-3.8-flash-high"],
27016
27016
  opus: ["claude-opus-5-5-high", "gemini-4-argon-high", "gemini-3.8-flash-high"],
27017
27017
  sonnet: ["claude-sonnet-5-5-medium", "gemini-4-argon-medium", "gemini-3.8-flash-medium"],
27018
- haiku: ["gemini-3.8-flash-low", "gemini-4-argon-low", "gpt-oss-120b-medium"]
27018
+ haiku: ["gemini-3.8-flash-low", "gemini-4-argon-low", "claude-sonnet-5-5-low"]
27019
27019
  });
27020
27020
  ANTIGRAVITY_DEFAULT_EFFORT = "low";
27021
27021
  AntigravityModelTargetSchema = external_exports.union([external_exports.string().min(1), external_exports.array(external_exports.string().min(1)).min(1)]);
@@ -27026,6 +27026,8 @@ var init_schema = __esm({
27026
27026
  defaultModel: external_exports.string().min(1).optional(),
27027
27027
  /** 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. */
27028
27028
  models: external_exports.record(external_exports.string().min(1), AntigravityModelTargetSchema).optional(),
27029
+ /** 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. */
27030
+ degradeDownTiers: external_exports.boolean().optional(),
27029
27031
  /** The reasoning effort used when the request's own effort is not one the backend accepts. */
27030
27032
  effort: external_exports.enum(ANTIGRAVITY_EFFORTS).optional(),
27031
27033
  /** Cloud-specific settings (for `mode: "cloud"`). */
@@ -34089,7 +34091,7 @@ var init_package = __esm({
34089
34091
  "package.json"() {
34090
34092
  package_default = {
34091
34093
  name: "claude-use",
34092
- version: "11.17.1",
34094
+ version: "11.18.0",
34093
34095
  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.",
34094
34096
  license: "MIT",
34095
34097
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -35768,7 +35770,7 @@ function isEmptyCodexConfig(config2) {
35768
35770
  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);
35769
35771
  }
35770
35772
  function isEmptyAntigravityConfig(config2) {
35771
- return config2 === void 0 || config2.mode === void 0 && config2.defaultModel === void 0 && config2.effort === void 0 && config2.cloud === void 0 && config2.local === void 0 && (config2.models === void 0 || Object.keys(config2.models).length === 0);
35773
+ return config2 === void 0 || config2.mode === void 0 && config2.defaultModel === void 0 && config2.effort === void 0 && config2.degradeDownTiers === void 0 && config2.cloud === void 0 && config2.local === void 0 && (config2.models === void 0 || Object.keys(config2.models).length === 0);
35772
35774
  }
35773
35775
  function addProvider(paths, name, input2) {
35774
35776
  if (providerExists(paths, name)) {
@@ -128059,6 +128061,7 @@ function resolveAntigravityConfig(config2) {
128059
128061
  defaultModel: config2?.defaultModel ?? ANTIGRAVITY_DEFAULT_MODEL,
128060
128062
  models: { fable: tierModel("fable"), opus: tierModel("opus"), sonnet: tierModel("sonnet"), haiku: tierModel("haiku") },
128061
128063
  aliases,
128064
+ degradeDownTiers: config2?.degradeDownTiers ?? false,
128062
128065
  effort: config2?.effort ?? ANTIGRAVITY_DEFAULT_EFFORT,
128063
128066
  cloud: {
128064
128067
  endpoint: config2?.cloud?.endpoint,
@@ -128077,18 +128080,25 @@ var BACKEND_CLAUDE_NAME = /^claude-.+-(?:low|medium|high|thinking)$/;
128077
128080
  function isBackendModelName(name) {
128078
128081
  return BACKEND_FAMILY_PREFIXES.some((prefix) => name.startsWith(prefix)) || BACKEND_CLAUDE_NAME.test(name);
128079
128082
  }
128080
- function mapModel2(requested, config2) {
128083
+ function resolveName(requested, config2) {
128081
128084
  const stripped = requested.toLowerCase().endsWith(CONTEXT_MARKER_1M) ? requested.slice(0, -CONTEXT_MARKER_1M.length) : requested;
128082
128085
  const lower = stripped.toLowerCase();
128083
128086
  const alias = config2.aliases.get(lower);
128084
128087
  if (alias !== void 0) {
128085
- return alias;
128088
+ return { candidates: alias, tier: void 0 };
128086
128089
  }
128087
128090
  if (isBackendModelName(stripped)) {
128088
- return [stripped];
128091
+ return { candidates: [stripped], tier: void 0 };
128089
128092
  }
128090
128093
  const tier = ANTIGRAVITY_TIERS.find((candidate) => lower.includes(candidate));
128091
- return tier === void 0 ? [config2.defaultModel] : config2.models[tier];
128094
+ return tier === void 0 ? { candidates: [config2.defaultModel], tier: void 0 } : { candidates: config2.models[tier], tier };
128095
+ }
128096
+ function candidateStages(requested, config2) {
128097
+ const { candidates, tier } = resolveName(requested, config2);
128098
+ if (!config2.degradeDownTiers || tier === void 0) {
128099
+ return [candidates];
128100
+ }
128101
+ return ANTIGRAVITY_TIERS.slice(ANTIGRAVITY_TIERS.indexOf(tier)).map((name) => config2.models[name]);
128092
128102
  }
128093
128103
  function chooseCandidate(candidates, routing) {
128094
128104
  const first = candidates[0];
@@ -128290,10 +128300,29 @@ function completeEffortSuffix(model, request7, config2) {
128290
128300
  const suffixed = `${model}-${effortSuffixOf(level)}`;
128291
128301
  return configured.some((entry) => entry === suffixed || splitEffortSuffix(entry)?.base === model) ? suffixed : model;
128292
128302
  }
128303
+ function chooseAcrossStages(stages, routing) {
128304
+ const own2 = stages[0];
128305
+ if (own2 === void 0) {
128306
+ throw new Error("A request resolves to at least one candidate list");
128307
+ }
128308
+ if (routing === void 0) {
128309
+ return chooseCandidate(own2, void 0);
128310
+ }
128311
+ for (const [index, stage] of stages.entries()) {
128312
+ const picked = chooseCandidate(stage, index === 0 ? routing : { quota: routing.quota, nowMs: routing.nowMs });
128313
+ if (antigravityQuotaExhaustion(routing.quota, picked, routing.nowMs) === void 0) {
128314
+ return picked;
128315
+ }
128316
+ }
128317
+ return chooseCandidate(own2, routing);
128318
+ }
128293
128319
  function translateRequest2(request7, config2, routing) {
128294
128320
  const toolNames = /* @__PURE__ */ new Map();
128295
128321
  const toolIdToName = /* @__PURE__ */ new Map();
128296
- const model = chooseCandidate(mapModel2(request7.model ?? "", config2).map((candidate) => completeEffortSuffix(candidate, request7, config2)), routing);
128322
+ const model = chooseAcrossStages(
128323
+ candidateStages(request7.model ?? "", config2).map((stage) => stage.map((candidate) => completeEffortSuffix(candidate, request7, config2))),
128324
+ routing
128325
+ );
128297
128326
  const thinkingBudget = mapEffort2(request7, config2);
128298
128327
  const systemInstruction = systemToInstruction(request7.system);
128299
128328
  const contents = messagesToGeminiContents(request7.messages, toolNames, toolIdToName);
@@ -145064,7 +145093,7 @@ function toProviderView(name, provider) {
145064
145093
  };
145065
145094
  }
145066
145095
  function antigravityConfigFromOptions(options) {
145067
- if (options.antigravityMode === void 0 && options.antigravityDefaultModel === void 0 && options.antigravityModel === void 0 && options.antigravityEffort === void 0 && options.antigravityEndpoint === void 0 && options.antigravityProjectId === void 0 && options.antigravityLocation === void 0 && options.antigravityCommand === void 0 && options.antigravitySocket === void 0) {
145096
+ if (options.antigravityMode === void 0 && options.antigravityDefaultModel === void 0 && options.antigravityModel === void 0 && options.antigravityEffort === void 0 && options.antigravityDegradeDownTiers === void 0 && options.antigravityEndpoint === void 0 && options.antigravityProjectId === void 0 && options.antigravityLocation === void 0 && options.antigravityCommand === void 0 && options.antigravitySocket === void 0) {
145068
145097
  return void 0;
145069
145098
  }
145070
145099
  const cloud = options.antigravityEndpoint !== void 0 || options.antigravityProjectId !== void 0 || options.antigravityLocation !== void 0 ? {
@@ -145081,6 +145110,7 @@ function antigravityConfigFromOptions(options) {
145081
145110
  ...options.antigravityDefaultModel === void 0 ? {} : { defaultModel: options.antigravityDefaultModel },
145082
145111
  ...options.antigravityModel === void 0 ? {} : { models: Object.fromEntries(Object.entries(options.antigravityModel).map(([name, target]) => [name, target.includes(",") ? target.split(",") : target])) },
145083
145112
  ...options.antigravityEffort === void 0 ? {} : { effort: options.antigravityEffort },
145113
+ ...options.antigravityDegradeDownTiers === void 0 ? {} : { degradeDownTiers: options.antigravityDegradeDownTiers },
145084
145114
  ...cloud === void 0 ? {} : { cloud },
145085
145115
  ...local === void 0 ? {} : { local }
145086
145116
  };
@@ -145121,7 +145151,7 @@ function registerProviderCommand(program2, deps) {
145121
145151
  new Option("--credential-target <target>", "Where the token goes: bearer sets ANTHROPIC_AUTH_TOKEN (default), apiKey sets ANTHROPIC_API_KEY.").choices(
145122
145152
  PROVIDER_CREDENTIAL_TARGETS
145123
145153
  )
145124
- ).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-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) => {
145154
+ ).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) => {
145125
145155
  const codex = codexConfigFromOptions(options);
145126
145156
  const antigravity = antigravityConfigFromOptions(options);
145127
145157
  const created = addProvider(paths, name, {
@@ -145157,7 +145187,7 @@ function registerProviderCommand(program2, deps) {
145157
145187
  new Option("--credential-target <target>", "Where the token goes: bearer sets ANTHROPIC_AUTH_TOKEN, apiKey sets ANTHROPIC_API_KEY.").choices(
145158
145188
  PROVIDER_CREDENTIAL_TARGETS
145159
145189
  )
145160
- ).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-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.");
145190
+ ).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.");
145161
145191
  addCredentialCacheOptions(providerSet);
145162
145192
  withExamples(
145163
145193
  providerSet.option("--json", "Print the result as JSON.").action((name, allOptions) => {
@@ -145237,6 +145267,7 @@ function registerProviderCommand(program2, deps) {
145237
145267
  console.log(`Antigravity aliases: ${[...config2.aliases].map(([alias, model]) => `${alias}=${model.join(" > ")}`).join(", ")}`);
145238
145268
  }
145239
145269
  console.log(`Antigravity effort: ${config2.effort}`);
145270
+ console.log(`Antigravity degrade down tiers: ${config2.degradeDownTiers ? "on" : "off"}`);
145240
145271
  console.log(`Endpoint: ${describeProviderEndpoint(found)}`);
145241
145272
  } else {
145242
145273
  console.log(`Base URL: ${found.baseUrl}`);
package/dist/index.cjs CHANGED
@@ -346,10 +346,10 @@ var init_schema = __esm({
346
346
  ANTIGRAVITY_EFFORTS = ["none", "low", "medium", "high", "xhigh", "max"];
347
347
  ANTIGRAVITY_DEFAULT_MODE = "cloud";
348
348
  ANTIGRAVITY_DEFAULT_TIER_MODELS = Object.freeze({
349
- fable: ["claude-opus-5-5-high", "gemini-4-argon-high", "gemini-3.8-flash-high"],
349
+ fable: ["gemini-4-argon-high", "claude-opus-5-5-high", "gemini-3.8-flash-high"],
350
350
  opus: ["claude-opus-5-5-high", "gemini-4-argon-high", "gemini-3.8-flash-high"],
351
351
  sonnet: ["claude-sonnet-5-5-medium", "gemini-4-argon-medium", "gemini-3.8-flash-medium"],
352
- haiku: ["gemini-3.8-flash-low", "gemini-4-argon-low", "gpt-oss-120b-medium"]
352
+ haiku: ["gemini-3.8-flash-low", "gemini-4-argon-low", "claude-sonnet-5-5-low"]
353
353
  });
354
354
  AntigravityModelTargetSchema = import_zod.z.union([import_zod.z.string().min(1), import_zod.z.array(import_zod.z.string().min(1)).min(1)]);
355
355
  AntigravityProviderConfigSchema = import_zod.z.strictObject({
@@ -359,6 +359,8 @@ var init_schema = __esm({
359
359
  defaultModel: import_zod.z.string().min(1).optional(),
360
360
  /** 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. */
361
361
  models: import_zod.z.record(import_zod.z.string().min(1), AntigravityModelTargetSchema).optional(),
362
+ /** 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. */
363
+ degradeDownTiers: import_zod.z.boolean().optional(),
362
364
  /** The reasoning effort used when the request's own effort is not one the backend accepts. */
363
365
  effort: import_zod.z.enum(ANTIGRAVITY_EFFORTS).optional(),
364
366
  /** Cloud-specific settings (for `mode: "cloud"`). */
@@ -2837,7 +2839,7 @@ var init_package = __esm({
2837
2839
  "package.json"() {
2838
2840
  package_default = {
2839
2841
  name: "claude-use",
2840
- version: "11.17.1",
2842
+ version: "11.18.0",
2841
2843
  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.",
2842
2844
  license: "MIT",
2843
2845
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -6431,7 +6433,7 @@ function isEmptyCodexConfig(config) {
6431
6433
  return config === void 0 || config.defaultModel === void 0 && config.effort === void 0 && config.login === void 0 && (config.models === void 0 || Object.keys(config.models).length === 0);
6432
6434
  }
6433
6435
  function isEmptyAntigravityConfig(config) {
6434
- return config === void 0 || config.mode === void 0 && config.defaultModel === void 0 && config.effort === void 0 && config.cloud === void 0 && config.local === void 0 && (config.models === void 0 || Object.keys(config.models).length === 0);
6436
+ return config === void 0 || config.mode === void 0 && config.defaultModel === void 0 && config.effort === void 0 && config.degradeDownTiers === void 0 && config.cloud === void 0 && config.local === void 0 && (config.models === void 0 || Object.keys(config.models).length === 0);
6435
6437
  }
6436
6438
  function addProvider(paths, name, input) {
6437
6439
  if (providerExists(paths, name)) {
package/dist/index.mjs CHANGED
@@ -324,10 +324,10 @@ var init_schema = __esm({
324
324
  ANTIGRAVITY_EFFORTS = ["none", "low", "medium", "high", "xhigh", "max"];
325
325
  ANTIGRAVITY_DEFAULT_MODE = "cloud";
326
326
  ANTIGRAVITY_DEFAULT_TIER_MODELS = Object.freeze({
327
- fable: ["claude-opus-5-5-high", "gemini-4-argon-high", "gemini-3.8-flash-high"],
327
+ fable: ["gemini-4-argon-high", "claude-opus-5-5-high", "gemini-3.8-flash-high"],
328
328
  opus: ["claude-opus-5-5-high", "gemini-4-argon-high", "gemini-3.8-flash-high"],
329
329
  sonnet: ["claude-sonnet-5-5-medium", "gemini-4-argon-medium", "gemini-3.8-flash-medium"],
330
- haiku: ["gemini-3.8-flash-low", "gemini-4-argon-low", "gpt-oss-120b-medium"]
330
+ haiku: ["gemini-3.8-flash-low", "gemini-4-argon-low", "claude-sonnet-5-5-low"]
331
331
  });
332
332
  AntigravityModelTargetSchema = z.union([z.string().min(1), z.array(z.string().min(1)).min(1)]);
333
333
  AntigravityProviderConfigSchema = z.strictObject({
@@ -337,6 +337,8 @@ var init_schema = __esm({
337
337
  defaultModel: z.string().min(1).optional(),
338
338
  /** 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. */
339
339
  models: z.record(z.string().min(1), AntigravityModelTargetSchema).optional(),
340
+ /** 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. */
341
+ degradeDownTiers: z.boolean().optional(),
340
342
  /** The reasoning effort used when the request's own effort is not one the backend accepts. */
341
343
  effort: z.enum(ANTIGRAVITY_EFFORTS).optional(),
342
344
  /** Cloud-specific settings (for `mode: "cloud"`). */
@@ -2813,7 +2815,7 @@ var init_package = __esm({
2813
2815
  "package.json"() {
2814
2816
  package_default = {
2815
2817
  name: "claude-use",
2816
- version: "11.17.1",
2818
+ version: "11.18.0",
2817
2819
  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.",
2818
2820
  license: "MIT",
2819
2821
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -6406,7 +6408,7 @@ function isEmptyCodexConfig(config) {
6406
6408
  return config === void 0 || config.defaultModel === void 0 && config.effort === void 0 && config.login === void 0 && (config.models === void 0 || Object.keys(config.models).length === 0);
6407
6409
  }
6408
6410
  function isEmptyAntigravityConfig(config) {
6409
- return config === void 0 || config.mode === void 0 && config.defaultModel === void 0 && config.effort === void 0 && config.cloud === void 0 && config.local === void 0 && (config.models === void 0 || Object.keys(config.models).length === 0);
6411
+ return config === void 0 || config.mode === void 0 && config.defaultModel === void 0 && config.effort === void 0 && config.degradeDownTiers === void 0 && config.cloud === void 0 && config.local === void 0 && (config.models === void 0 || Object.keys(config.models).length === 0);
6410
6412
  }
6411
6413
  function addProvider(paths, name, input) {
6412
6414
  if (providerExists(paths, name)) {
@@ -391,6 +391,7 @@ declare const AntigravityProviderConfigSchema: z.ZodObject<{
391
391
  }>>;
392
392
  defaultModel: z.ZodOptional<z.ZodString>;
393
393
  models: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>>;
394
+ degradeDownTiers: z.ZodOptional<z.ZodBoolean>;
394
395
  effort: z.ZodOptional<z.ZodEnum<{
395
396
  none: "none";
396
397
  max: "max";
@@ -657,6 +658,7 @@ declare const ProviderSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
657
658
  }>>;
658
659
  defaultModel: z.ZodOptional<z.ZodString>;
659
660
  models: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>>;
661
+ degradeDownTiers: z.ZodOptional<z.ZodBoolean>;
660
662
  effort: z.ZodOptional<z.ZodEnum<{
661
663
  none: "none";
662
664
  max: "max";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-use",
3
- "version": "11.17.1",
3
+ "version": "11.18.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>",