claude-use 11.44.5 → 11.45.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
@@ -196,7 +196,7 @@ agent-shim run [@<identity>] [launch flags] [claude arguments]
196
196
  # --claude-version <version> run exactly this installed Claude Code version
197
197
  # --delay <duration> wait this long after the launcher's own output before starting claude; --[no-]pause waits for a key press instead
198
198
  # --[no-]explain with @pool:<name>, list every member the pick ranked and why, not only the one picked
199
- # --[no-]route-by-name route provider-qualified model names through the models block to the provider that serves them
199
+ # --[no-]route-by-name also route bare virtual-model names through the models block (qualified names route on every session)
200
200
  # --native run the real claude with nothing from agent-shim applied; cannot be combined with the flags above
201
201
  claude @<identity> ... # the same, once `agent-shim shim enable` has run
202
202
  ```
package/dist/cli.cjs CHANGED
@@ -34701,7 +34701,7 @@ var init_package = __esm({
34701
34701
  "package.json"() {
34702
34702
  package_default = {
34703
34703
  name: "claude-use",
34704
- version: "11.44.5",
34704
+ version: "11.45.0",
34705
34705
  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.",
34706
34706
  license: "MIT",
34707
34707
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -65950,25 +65950,25 @@ function providerModelRows(provider, catalogue = []) {
65950
65950
  const taken = new Set(named.map((row) => labelOf(row.model)));
65951
65951
  return [...named, ...catalogueRows(provider, catalogue).filter((row) => !taken.has(labelOf(row.model)))];
65952
65952
  }
65953
- function routedModelRows(models, providers) {
65953
+ function routedModelRows(models, providers, bare = true) {
65954
65954
  const hidden = new Set(models.hide ?? []);
65955
65955
  const shown = models.show === void 0 ? void 0 : new Set(models.show);
65956
65956
  const visible = (model) => shown === void 0 ? !hidden.has(model) : shown.has(model);
65957
- const concrete = providers.flatMap(([name, provider]) => providerModelRows(provider).map((row) => ({ ...row, model: `${name}/${row.model}`, label: `${name} / ${row.label}`, description: `${name}: ${row.description}` })));
65957
+ const concrete = providers.flatMap(([name, provider, catalogue]) => providerModelRows(provider, catalogue).map((row) => ({ ...row, model: `${name}/${row.model}`, label: `${name} / ${row.label}`, description: `${name}: ${row.description}` })));
65958
65958
  const concreteByRef = new Map(concrete.map((row) => [row.model, row]));
65959
65959
  const families = buildFamilies([...concrete.map((row) => row.model), ...accountRefsOf(models)], models);
65960
65960
  const handlingOf = (refs) => refs.map((ref) => concreteByRef.get(ref)?.behavesAs).find((behavesAs) => behavesAs !== void 0) ?? TIER_BEHAVES_AS.sonnet;
65961
- const virtual = Object.entries(models.virtual ?? {}).flatMap(([name, definition]) => {
65961
+ const virtual = bare ? Object.entries(models.virtual ?? {}).flatMap(([name, definition]) => {
65962
65962
  if (!visible(name)) {
65963
65963
  return [];
65964
65964
  }
65965
65965
  const targets = expandFamilyMembers(safeExpand(name, models), families);
65966
65966
  return [{ model: name, label: name, description: `Virtual (${definition.mode})`, behavesAs: handlingOf(targets) }];
65967
- });
65968
- const familyRows = sharedFamilies(families).flatMap((family) => {
65967
+ }) : [];
65968
+ const familyRows = bare ? sharedFamilies(families).flatMap((family) => {
65969
65969
  const member = `${FAMILY_PREFIX}${family.key}`;
65970
65970
  return visible(member) ? [{ model: member, label: family.key, description: `Family (${familyMode(family.settings)}): ${family.refs.join(", ")}`, behavesAs: handlingOf(family.refs) }] : [];
65971
- });
65971
+ }) : [];
65972
65972
  return [...virtual, ...familyRows, ...concrete.filter((row) => visible(row.model))];
65973
65973
  }
65974
65974
  function safeExpand(name, models) {
@@ -65978,9 +65978,6 @@ function safeExpand(name, models) {
65978
65978
  return models.virtual?.[name]?.members ?? [];
65979
65979
  }
65980
65980
  }
65981
- function modelPickerSettings(provider, catalogue = []) {
65982
- return modelPickerSettingsFromRows(providerModelRows(provider, catalogue), true);
65983
- }
65984
65981
  function modelPickerSettingsFromRows(options, replaceBuiltInOptions) {
65985
65982
  return options.length === 0 ? void 0 : JSON.stringify({ modelPicker: { options, replaceBuiltInOptions } });
65986
65983
  }
@@ -66452,11 +66449,18 @@ function decideLaunch(params, readOnly) {
66452
66449
  notes.push(`${loginlessProvider.identity} has no stored login, so Remote Control is off; provider ${loginlessProvider.provider} runs without it`);
66453
66450
  }
66454
66451
  const flags = loginlessProvider === void 0 ? requestedFlags : { ...requestedFlags, remoteControl: false };
66455
- const catalogue = selectedProvider === void 0 ? void 0 : parseCatalogueCache(params.fs.readFileUtf8(catalogueCachePath(paths, selectedProvider.name)));
66456
66452
  const routesByName = flags.routeByName || selectedProvider !== void 0 && isRouterProvider(selectedProvider.definition);
66457
66453
  const globalModels = loadConfigFile(paths.globalConfigFile, GlobalConfigSchema, params.fs.readConfigFile)?.config.models;
66458
66454
  const models = launchCascade !== void 0 && params.farm !== void 0 ? cascadeModels : globalModels;
66459
- const pickerSettings = routesByName ? modelPickerSettingsFromRows(routedModelRows(models ?? {}, listProviders(paths).map((entry) => [entry.name, entry.provider])), selectedProvider !== void 0) : selectedProvider === void 0 ? void 0 : modelPickerSettings(selectedProvider.definition, catalogue?.models);
66455
+ const listedProviders = listProviderNames(fs26.readdir, paths.providersDir).flatMap((name) => {
66456
+ try {
66457
+ const definition = loadProvider(paths.providersDir, name, fs26);
66458
+ return definition === void 0 ? [] : [[name, definition, parseCatalogueCache(params.fs.readFileUtf8(catalogueCachePath(paths, name)))?.models ?? []]];
66459
+ } catch {
66460
+ return [];
66461
+ }
66462
+ });
66463
+ const pickerSettings = modelPickerSettingsFromRows(routedModelRows(models ?? {}, listedProviders, routesByName), selectedProvider !== void 0);
66460
66464
  const callerSettings = hasSettingsArgument(parsedArgv.rest);
66461
66465
  if (pickerSettings !== void 0 && callerSettings) {
66462
66466
  notes.push("--settings was passed, so /model keeps Claude Code's own model names");
@@ -131990,17 +131994,17 @@ var CHARS_PER_TOKEN2 = 4;
131990
131994
  function needsOf(scan) {
131991
131995
  return { hasImage: scan.hasImage === true, hasTools: scan.toolsPresent === true, thinking: scan.thinking === true, contextTokens: Math.ceil((scan.text?.length ?? 0) / CHARS_PER_TOKEN2) };
131992
131996
  }
131993
- function resolveRoutedModel(model, providerName, session, deps, memory, rotations, needs) {
131997
+ function resolveRoutedModel(model, providerName, session, deps, byName, memory, rotations, needs) {
131994
131998
  const models = deps.models?.(session);
131995
131999
  const qualified = model.includes("/") && !model.startsWith("acct:") ? model : void 0;
131996
132000
  if (qualified !== void 0) {
131997
132001
  const [provider2, ...rest2] = qualified.split("/");
131998
132002
  const named = rest2.join("/");
131999
- return provider2 === void 0 || named === "" ? void 0 : { provider: provider2, model: withoutContextMarker(named), ref: qualified };
132003
+ return provider2 === void 0 || named === "" || deps.definesProvider !== void 0 && !deps.definesProvider(provider2) ? void 0 : { provider: provider2, model: withoutContextMarker(named), ref: qualified };
132000
132004
  }
132001
132005
  const isFamily = model.startsWith(FAMILY_PREFIX);
132002
132006
  const virtual = isFamily ? void 0 : models?.virtual?.[model];
132003
- if (virtual === void 0 && !isFamily) {
132007
+ if (!byName || virtual === void 0 && !isFamily) {
132004
132008
  return void 0;
132005
132009
  }
132006
132010
  const declared = isFamily ? [model] : expandMembers(model, models);
@@ -132048,6 +132052,13 @@ function createProviderRouteResolver(deps) {
132048
132052
  const oauthRoute = createPassthroughRoute("anthropic", { baseUrl: `https://${CONNECT_INTERCEPT_HOST}:${String(HTTPS_PORT)}`, stripPrefix: void 0, headroomUpstream: void 0 });
132049
132053
  const antigravityQuotaSources = /* @__PURE__ */ new Map();
132050
132054
  const antigravityRoutingMemory = /* @__PURE__ */ new Map();
132055
+ const definesProvider = (name) => {
132056
+ try {
132057
+ return loadProvider(deps.providersDir, name, deps.fs) !== void 0;
132058
+ } catch {
132059
+ return false;
132060
+ }
132061
+ };
132051
132062
  const routingMemory = /* @__PURE__ */ new Map();
132052
132063
  const rotations = /* @__PURE__ */ new Map();
132053
132064
  const memoryFor = (provider) => {
@@ -132211,8 +132222,8 @@ function createProviderRouteResolver(deps) {
132211
132222
  routes = void 0;
132212
132223
  isRouter = false;
132213
132224
  }
132214
- const routesByName = !nameResolved && (isRouter || current.session.routeByName) && !isRcSelfHostPath(path65);
132215
- if (routesByName) {
132225
+ const resolvesNames = !nameResolved && !isRcSelfHostPath(path65);
132226
+ if (resolvesNames) {
132216
132227
  const scan2 = await scanRequestHead(current, true);
132217
132228
  if (scan2.replayed === void 0) {
132218
132229
  const resolution = resolve2(current);
@@ -132229,8 +132240,11 @@ function createProviderRouteResolver(deps) {
132229
132240
  message: moved ? `model "${account.model}" runs under identity "${account.identity}"; this session is being moved there and will resume with it` : `model "${account.model}" runs under identity "${account.identity}", which needs a relaunch this session cannot make; start it there with: claude @${account.identity} --resume`
132230
132241
  };
132231
132242
  }
132232
- const routed = scan2.model === void 0 ? void 0 : resolveRoutedModel(scan2.model, providerName, current.session, deps, routingMemory, rotations, needsOf(scan2));
132243
+ const routed = scan2.model === void 0 ? void 0 : resolveRoutedModel(scan2.model, providerName, current.session, { ...deps, definesProvider }, isRouter || current.session.routeByName, routingMemory, rotations, needsOf(scan2));
132233
132244
  const requested = scan2.model;
132245
+ if (routed === void 0) {
132246
+ current = scan2.replayed;
132247
+ }
132234
132248
  if (routed !== void 0) {
132235
132249
  routingMemory.set(current.session.sessionId ?? "", routed.ref);
132236
132250
  if (routed.requested !== void 0) {
package/dist/index.cjs CHANGED
@@ -3151,7 +3151,7 @@ var init_package = __esm({
3151
3151
  "package.json"() {
3152
3152
  package_default = {
3153
3153
  name: "claude-use",
3154
- version: "11.44.5",
3154
+ version: "11.45.0",
3155
3155
  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.",
3156
3156
  license: "MIT",
3157
3157
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -8162,25 +8162,25 @@ function providerModelRows(provider, catalogue = []) {
8162
8162
  const taken = new Set(named.map((row) => labelOf(row.model)));
8163
8163
  return [...named, ...catalogueRows(provider, catalogue).filter((row) => !taken.has(labelOf(row.model)))];
8164
8164
  }
8165
- function routedModelRows(models, providers) {
8165
+ function routedModelRows(models, providers, bare = true) {
8166
8166
  const hidden = new Set(models.hide ?? []);
8167
8167
  const shown = models.show === void 0 ? void 0 : new Set(models.show);
8168
8168
  const visible = (model) => shown === void 0 ? !hidden.has(model) : shown.has(model);
8169
- const concrete = providers.flatMap(([name, provider]) => providerModelRows(provider).map((row) => ({ ...row, model: `${name}/${row.model}`, label: `${name} / ${row.label}`, description: `${name}: ${row.description}` })));
8169
+ const concrete = providers.flatMap(([name, provider, catalogue]) => providerModelRows(provider, catalogue).map((row) => ({ ...row, model: `${name}/${row.model}`, label: `${name} / ${row.label}`, description: `${name}: ${row.description}` })));
8170
8170
  const concreteByRef = new Map(concrete.map((row) => [row.model, row]));
8171
8171
  const families = buildFamilies([...concrete.map((row) => row.model), ...accountRefsOf(models)], models);
8172
8172
  const handlingOf = (refs) => refs.map((ref) => concreteByRef.get(ref)?.behavesAs).find((behavesAs) => behavesAs !== void 0) ?? TIER_BEHAVES_AS.sonnet;
8173
- const virtual = Object.entries(models.virtual ?? {}).flatMap(([name, definition]) => {
8173
+ const virtual = bare ? Object.entries(models.virtual ?? {}).flatMap(([name, definition]) => {
8174
8174
  if (!visible(name)) {
8175
8175
  return [];
8176
8176
  }
8177
8177
  const targets = expandFamilyMembers(safeExpand(name, models), families);
8178
8178
  return [{ model: name, label: name, description: `Virtual (${definition.mode})`, behavesAs: handlingOf(targets) }];
8179
- });
8180
- const familyRows = sharedFamilies(families).flatMap((family) => {
8179
+ }) : [];
8180
+ const familyRows = bare ? sharedFamilies(families).flatMap((family) => {
8181
8181
  const member = `${FAMILY_PREFIX}${family.key}`;
8182
8182
  return visible(member) ? [{ model: member, label: family.key, description: `Family (${familyMode(family.settings)}): ${family.refs.join(", ")}`, behavesAs: handlingOf(family.refs) }] : [];
8183
- });
8183
+ }) : [];
8184
8184
  return [...virtual, ...familyRows, ...concrete.filter((row) => visible(row.model))];
8185
8185
  }
8186
8186
  function safeExpand(name, models) {
@@ -8190,9 +8190,6 @@ function safeExpand(name, models) {
8190
8190
  return models.virtual?.[name]?.members ?? [];
8191
8191
  }
8192
8192
  }
8193
- function modelPickerSettings(provider, catalogue = []) {
8194
- return modelPickerSettingsFromRows(providerModelRows(provider, catalogue), true);
8195
- }
8196
8193
  function modelPickerSettingsFromRows(options, replaceBuiltInOptions) {
8197
8194
  return options.length === 0 ? void 0 : JSON.stringify({ modelPicker: { options, replaceBuiltInOptions } });
8198
8195
  }
@@ -9720,11 +9717,18 @@ function decideLaunch(params, readOnly) {
9720
9717
  notes.push(`${loginlessProvider.identity} has no stored login, so Remote Control is off; provider ${loginlessProvider.provider} runs without it`);
9721
9718
  }
9722
9719
  const flags = loginlessProvider === void 0 ? requestedFlags : { ...requestedFlags, remoteControl: false };
9723
- const catalogue = selectedProvider === void 0 ? void 0 : parseCatalogueCache(params.fs.readFileUtf8(catalogueCachePath(paths, selectedProvider.name)));
9724
9720
  const routesByName = flags.routeByName || selectedProvider !== void 0 && isRouterProvider(selectedProvider.definition);
9725
9721
  const globalModels = loadConfigFile(paths.globalConfigFile, GlobalConfigSchema, params.fs.readConfigFile)?.config.models;
9726
9722
  const models = launchCascade !== void 0 && params.farm !== void 0 ? cascadeModels : globalModels;
9727
- const pickerSettings = routesByName ? modelPickerSettingsFromRows(routedModelRows(models ?? {}, listProviders(paths).map((entry) => [entry.name, entry.provider])), selectedProvider !== void 0) : selectedProvider === void 0 ? void 0 : modelPickerSettings(selectedProvider.definition, catalogue?.models);
9723
+ const listedProviders = listProviderNames(fs13.readdir, paths.providersDir).flatMap((name) => {
9724
+ try {
9725
+ const definition = loadProvider(paths.providersDir, name, fs13);
9726
+ return definition === void 0 ? [] : [[name, definition, parseCatalogueCache(params.fs.readFileUtf8(catalogueCachePath(paths, name)))?.models ?? []]];
9727
+ } catch {
9728
+ return [];
9729
+ }
9730
+ });
9731
+ const pickerSettings = modelPickerSettingsFromRows(routedModelRows(models ?? {}, listedProviders, routesByName), selectedProvider !== void 0);
9728
9732
  const callerSettings = hasSettingsArgument(parsedArgv.rest);
9729
9733
  if (pickerSettings !== void 0 && callerSettings) {
9730
9734
  notes.push("--settings was passed, so /model keeps Claude Code's own model names");
package/dist/index.mjs CHANGED
@@ -3127,7 +3127,7 @@ var init_package = __esm({
3127
3127
  "package.json"() {
3128
3128
  package_default = {
3129
3129
  name: "claude-use",
3130
- version: "11.44.5",
3130
+ version: "11.45.0",
3131
3131
  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.",
3132
3132
  license: "MIT",
3133
3133
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -8135,25 +8135,25 @@ function providerModelRows(provider, catalogue = []) {
8135
8135
  const taken = new Set(named.map((row) => labelOf(row.model)));
8136
8136
  return [...named, ...catalogueRows(provider, catalogue).filter((row) => !taken.has(labelOf(row.model)))];
8137
8137
  }
8138
- function routedModelRows(models, providers) {
8138
+ function routedModelRows(models, providers, bare = true) {
8139
8139
  const hidden = new Set(models.hide ?? []);
8140
8140
  const shown = models.show === void 0 ? void 0 : new Set(models.show);
8141
8141
  const visible = (model) => shown === void 0 ? !hidden.has(model) : shown.has(model);
8142
- const concrete = providers.flatMap(([name, provider]) => providerModelRows(provider).map((row) => ({ ...row, model: `${name}/${row.model}`, label: `${name} / ${row.label}`, description: `${name}: ${row.description}` })));
8142
+ const concrete = providers.flatMap(([name, provider, catalogue]) => providerModelRows(provider, catalogue).map((row) => ({ ...row, model: `${name}/${row.model}`, label: `${name} / ${row.label}`, description: `${name}: ${row.description}` })));
8143
8143
  const concreteByRef = new Map(concrete.map((row) => [row.model, row]));
8144
8144
  const families = buildFamilies([...concrete.map((row) => row.model), ...accountRefsOf(models)], models);
8145
8145
  const handlingOf = (refs) => refs.map((ref) => concreteByRef.get(ref)?.behavesAs).find((behavesAs) => behavesAs !== void 0) ?? TIER_BEHAVES_AS.sonnet;
8146
- const virtual = Object.entries(models.virtual ?? {}).flatMap(([name, definition]) => {
8146
+ const virtual = bare ? Object.entries(models.virtual ?? {}).flatMap(([name, definition]) => {
8147
8147
  if (!visible(name)) {
8148
8148
  return [];
8149
8149
  }
8150
8150
  const targets = expandFamilyMembers(safeExpand(name, models), families);
8151
8151
  return [{ model: name, label: name, description: `Virtual (${definition.mode})`, behavesAs: handlingOf(targets) }];
8152
- });
8153
- const familyRows = sharedFamilies(families).flatMap((family) => {
8152
+ }) : [];
8153
+ const familyRows = bare ? sharedFamilies(families).flatMap((family) => {
8154
8154
  const member = `${FAMILY_PREFIX}${family.key}`;
8155
8155
  return visible(member) ? [{ model: member, label: family.key, description: `Family (${familyMode(family.settings)}): ${family.refs.join(", ")}`, behavesAs: handlingOf(family.refs) }] : [];
8156
- });
8156
+ }) : [];
8157
8157
  return [...virtual, ...familyRows, ...concrete.filter((row) => visible(row.model))];
8158
8158
  }
8159
8159
  function safeExpand(name, models) {
@@ -8163,9 +8163,6 @@ function safeExpand(name, models) {
8163
8163
  return models.virtual?.[name]?.members ?? [];
8164
8164
  }
8165
8165
  }
8166
- function modelPickerSettings(provider, catalogue = []) {
8167
- return modelPickerSettingsFromRows(providerModelRows(provider, catalogue), true);
8168
- }
8169
8166
  function modelPickerSettingsFromRows(options, replaceBuiltInOptions) {
8170
8167
  return options.length === 0 ? void 0 : JSON.stringify({ modelPicker: { options, replaceBuiltInOptions } });
8171
8168
  }
@@ -9695,11 +9692,18 @@ function decideLaunch(params, readOnly) {
9695
9692
  notes.push(`${loginlessProvider.identity} has no stored login, so Remote Control is off; provider ${loginlessProvider.provider} runs without it`);
9696
9693
  }
9697
9694
  const flags = loginlessProvider === void 0 ? requestedFlags : { ...requestedFlags, remoteControl: false };
9698
- const catalogue = selectedProvider === void 0 ? void 0 : parseCatalogueCache(params.fs.readFileUtf8(catalogueCachePath(paths, selectedProvider.name)));
9699
9695
  const routesByName = flags.routeByName || selectedProvider !== void 0 && isRouterProvider(selectedProvider.definition);
9700
9696
  const globalModels = loadConfigFile(paths.globalConfigFile, GlobalConfigSchema, params.fs.readConfigFile)?.config.models;
9701
9697
  const models = launchCascade !== void 0 && params.farm !== void 0 ? cascadeModels : globalModels;
9702
- const pickerSettings = routesByName ? modelPickerSettingsFromRows(routedModelRows(models ?? {}, listProviders(paths).map((entry) => [entry.name, entry.provider])), selectedProvider !== void 0) : selectedProvider === void 0 ? void 0 : modelPickerSettings(selectedProvider.definition, catalogue?.models);
9698
+ const listedProviders = listProviderNames(fs13.readdir, paths.providersDir).flatMap((name) => {
9699
+ try {
9700
+ const definition = loadProvider(paths.providersDir, name, fs13);
9701
+ return definition === void 0 ? [] : [[name, definition, parseCatalogueCache(params.fs.readFileUtf8(catalogueCachePath(paths, name)))?.models ?? []]];
9702
+ } catch {
9703
+ return [];
9704
+ }
9705
+ });
9706
+ const pickerSettings = modelPickerSettingsFromRows(routedModelRows(models ?? {}, listedProviders, routesByName), selectedProvider !== void 0);
9703
9707
  const callerSettings = hasSettingsArgument(parsedArgv.rest);
9704
9708
  if (pickerSettings !== void 0 && callerSettings) {
9705
9709
  notes.push("--settings was passed, so /model keeps Claude Code's own model names");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-use",
3
- "version": "11.44.5",
3
+ "version": "11.45.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>",