claude-use 11.17.0 → 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.0",
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];
@@ -128254,79 +128264,15 @@ function messagesToGeminiContents(messages, names, toolIdToName) {
128254
128264
  return contents;
128255
128265
  }
128256
128266
  var EMPTY_SCHEMA = { type: "object", properties: {} };
128257
- var GEMINI_SCHEMA_KEYS = /* @__PURE__ */ new Set(["type", "format", "description", "nullable", "enum", "anyOf", "items", "properties", "required", "minimum", "maximum", "minItems", "maxItems"]);
128258
- function describeSchemaValue(node2) {
128259
- if (!isRecord9(node2)) {
128260
- return "any value";
128261
- }
128262
- const type2 = node2.type;
128263
- const name = typeof type2 === "string" ? type2 : Array.isArray(type2) && typeof type2[0] === "string" ? type2[0] : "value";
128264
- if (name === "array") {
128265
- return `a list of ${describeSchemaValue(node2.items)}`;
128266
- }
128267
- return name === "object" ? "an object" : `a ${name}`;
128268
- }
128269
- function toGeminiSchema(node2) {
128270
- if (!isRecord9(node2)) {
128271
- return node2;
128272
- }
128273
- const out = {};
128274
- const notes = [];
128275
- let nullable2 = false;
128276
- for (const [key, value2] of Object.entries(node2)) {
128277
- if (key === "type" && Array.isArray(value2)) {
128278
- const named = value2.filter((entry) => entry !== "null");
128279
- if (named.length > 0 && typeof named[0] === "string") {
128280
- out.type = named[0];
128281
- }
128282
- nullable2 = value2.includes("null");
128283
- continue;
128284
- }
128285
- if (!GEMINI_SCHEMA_KEYS.has(key)) {
128286
- if (key === "additionalProperties" && value2 !== false) {
128287
- notes.push(`Each value is ${describeSchemaValue(value2)}.`);
128288
- } else if (key === "propertyNames" && isRecord9(value2) && typeof value2.pattern === "string") {
128289
- notes.push(`Keys match ${value2.pattern}.`);
128290
- }
128291
- continue;
128292
- }
128293
- out[key] = value2;
128294
- }
128295
- if (out.type === "null") {
128296
- delete out.type;
128297
- }
128298
- if (nullable2 && out.type !== void 0) {
128299
- out.nullable = true;
128300
- }
128301
- if (notes.length > 0) {
128302
- const description = typeof out.description === "string" ? out.description : "";
128303
- out.description = `${description}${description === "" ? "" : " "}${notes.join(" ")}`;
128304
- }
128305
- if ("properties" in out && isRecord9(out.properties)) {
128306
- out.properties = Object.fromEntries(Object.entries(out.properties).map(([name, child]) => [name, toGeminiSchema(child)]));
128307
- }
128308
- if ("items" in out) {
128309
- out.items = toGeminiSchema(out.items);
128310
- } else if (out.type === "array") {
128311
- out.items = {};
128312
- }
128313
- if (Array.isArray(out.anyOf)) {
128314
- out.anyOf = out.anyOf.map(toGeminiSchema);
128315
- }
128316
- return out;
128317
- }
128318
128267
  function mapTools2(tools, names) {
128319
128268
  if (tools === void 0 || tools.length === 0) {
128320
128269
  return void 0;
128321
128270
  }
128322
- const declarations = tools.map((tool) => {
128323
- const converted = tool.input_schema === void 0 ? void 0 : toGeminiSchema(tool.input_schema);
128324
- return {
128325
- name: shortToolName2(tool.name, names),
128326
- description: tool.description,
128327
- parameters: isRecord9(converted) ? converted : EMPTY_SCHEMA
128328
- };
128329
- });
128271
+ const declarations = tools.map((tool) => ({
128272
+ name: shortToolName2(tool.name, names),
128273
+ description: tool.description,
128274
+ parametersJsonSchema: tool.input_schema ?? EMPTY_SCHEMA
128275
+ }));
128330
128276
  return [{ functionDeclarations: declarations }];
128331
128277
  }
128332
128278
  var EFFORT_SUFFIXES = /* @__PURE__ */ new Set(["low", "medium", "high"]);
@@ -128354,10 +128300,29 @@ function completeEffortSuffix(model, request7, config2) {
128354
128300
  const suffixed = `${model}-${effortSuffixOf(level)}`;
128355
128301
  return configured.some((entry) => entry === suffixed || splitEffortSuffix(entry)?.base === model) ? suffixed : model;
128356
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
+ }
128357
128319
  function translateRequest2(request7, config2, routing) {
128358
128320
  const toolNames = /* @__PURE__ */ new Map();
128359
128321
  const toolIdToName = /* @__PURE__ */ new Map();
128360
- 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
+ );
128361
128326
  const thinkingBudget = mapEffort2(request7, config2);
128362
128327
  const systemInstruction = systemToInstruction(request7.system);
128363
128328
  const contents = messagesToGeminiContents(request7.messages, toolNames, toolIdToName);
@@ -145128,7 +145093,7 @@ function toProviderView(name, provider) {
145128
145093
  };
145129
145094
  }
145130
145095
  function antigravityConfigFromOptions(options) {
145131
- 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) {
145132
145097
  return void 0;
145133
145098
  }
145134
145099
  const cloud = options.antigravityEndpoint !== void 0 || options.antigravityProjectId !== void 0 || options.antigravityLocation !== void 0 ? {
@@ -145145,6 +145110,7 @@ function antigravityConfigFromOptions(options) {
145145
145110
  ...options.antigravityDefaultModel === void 0 ? {} : { defaultModel: options.antigravityDefaultModel },
145146
145111
  ...options.antigravityModel === void 0 ? {} : { models: Object.fromEntries(Object.entries(options.antigravityModel).map(([name, target]) => [name, target.includes(",") ? target.split(",") : target])) },
145147
145112
  ...options.antigravityEffort === void 0 ? {} : { effort: options.antigravityEffort },
145113
+ ...options.antigravityDegradeDownTiers === void 0 ? {} : { degradeDownTiers: options.antigravityDegradeDownTiers },
145148
145114
  ...cloud === void 0 ? {} : { cloud },
145149
145115
  ...local === void 0 ? {} : { local }
145150
145116
  };
@@ -145185,7 +145151,7 @@ function registerProviderCommand(program2, deps) {
145185
145151
  new Option("--credential-target <target>", "Where the token goes: bearer sets ANTHROPIC_AUTH_TOKEN (default), apiKey sets ANTHROPIC_API_KEY.").choices(
145186
145152
  PROVIDER_CREDENTIAL_TARGETS
145187
145153
  )
145188
- ).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) => {
145189
145155
  const codex = codexConfigFromOptions(options);
145190
145156
  const antigravity = antigravityConfigFromOptions(options);
145191
145157
  const created = addProvider(paths, name, {
@@ -145221,7 +145187,7 @@ function registerProviderCommand(program2, deps) {
145221
145187
  new Option("--credential-target <target>", "Where the token goes: bearer sets ANTHROPIC_AUTH_TOKEN, apiKey sets ANTHROPIC_API_KEY.").choices(
145222
145188
  PROVIDER_CREDENTIAL_TARGETS
145223
145189
  )
145224
- ).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.");
145225
145191
  addCredentialCacheOptions(providerSet);
145226
145192
  withExamples(
145227
145193
  providerSet.option("--json", "Print the result as JSON.").action((name, allOptions) => {
@@ -145301,6 +145267,7 @@ function registerProviderCommand(program2, deps) {
145301
145267
  console.log(`Antigravity aliases: ${[...config2.aliases].map(([alias, model]) => `${alias}=${model.join(" > ")}`).join(", ")}`);
145302
145268
  }
145303
145269
  console.log(`Antigravity effort: ${config2.effort}`);
145270
+ console.log(`Antigravity degrade down tiers: ${config2.degradeDownTiers ? "on" : "off"}`);
145304
145271
  console.log(`Endpoint: ${describeProviderEndpoint(found)}`);
145305
145272
  } else {
145306
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.0",
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.0",
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.0",
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>",