agent-shim 11.80.0 → 11.81.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
@@ -85,7 +85,7 @@ agent-shim <noun> <verb> [name] [options] # nouns: identity, profile, pool,
85
85
  agent-shim identity add <name> [--json]
86
86
  agent-shim identity list [--json]
87
87
  agent-shim identity show <name> [--json]
88
- agent-shim identity set <name> [--default-profile <profile> | --no-default-profile] [--provider <provider> | --no-provider] [--[no-]allow-ambient-credential] [--json]
88
+ agent-shim identity set <name> [--label <text> | --no-label] [--default-profile <profile> | --no-default-profile] [--provider <provider> | --no-provider] [--[no-]allow-ambient-credential] [--json]
89
89
  agent-shim identity set <name> [--credential <source>]... [--credential-target <bearer|apiKey|oauthToken>] [--no-credential] [--json]
90
90
  agent-shim identity set <name> [--anchor <days>@<HH:MM>[/<zone>]]... [--no-anchor] [--json]
91
91
  agent-shim identity remove <name> [--yes] [--json]
package/dist/cli.cjs CHANGED
@@ -25123,7 +25123,7 @@ function providerFilePath(directory, name, source) {
25123
25123
  }
25124
25124
  return import_node_path4.default.join(directory, `${name}.json`);
25125
25125
  }
25126
- var import_node_path4, FILESYSTEM_COMPONENT_BYTES, MAX_PID_DIGITS, UUID_CHARS, ATOMIC_WRITE_OVERHEAD_BYTES, FARM_SWAP_OVERHEAD_BYTES, MAX_NAME_BYTES, FILE_NAME_PATTERN, FILE_NAME, FILE_NAME_RULE, STORED_NAME_RULE, FileNameSchema, StoredNameSchema, UnsafeNameError, InvalidProviderNameError;
25126
+ var import_node_path4, FILESYSTEM_COMPONENT_BYTES, MAX_PID_DIGITS, UUID_CHARS, ATOMIC_WRITE_OVERHEAD_BYTES, FARM_SWAP_OVERHEAD_BYTES, MAX_NAME_BYTES, FILE_NAME_PATTERN, FILE_NAME, FILE_NAME_RULE, STORED_NAME_RULE, FileNameSchema, StoredNameSchema, LABEL_FORBIDDEN, IDENTITY_LABEL_RULE, IdentityLabelSchema, UnsafeNameError, InvalidProviderNameError;
25127
25127
  var init_names = __esm({
25128
25128
  "src/config/names.ts"() {
25129
25129
  "use strict";
@@ -25142,6 +25142,9 @@ var init_names = __esm({
25142
25142
  STORED_NAME_RULE = `must be non-empty, at most ${String(MAX_NAME_BYTES)} bytes, not "." or "..", and contain no path separator or NUL`;
25143
25143
  FileNameSchema = external_exports.string().min(1).regex(FILE_NAME, FILE_NAME_RULE);
25144
25144
  StoredNameSchema = external_exports.string().min(1).max(MAX_NAME_BYTES).refine(isStoredName, STORED_NAME_RULE);
25145
+ LABEL_FORBIDDEN = /[\p{Cc}\p{Zl}\p{Zp}]/u;
25146
+ IDENTITY_LABEL_RULE = `must be non-empty single-line text of at most ${String(MAX_NAME_BYTES)} characters, with no control characters and no leading or trailing whitespace`;
25147
+ IdentityLabelSchema = external_exports.string().min(1).max(MAX_NAME_BYTES).refine((label2) => label2 === label2.trim() && !LABEL_FORBIDDEN.test(label2), IDENTITY_LABEL_RULE);
25145
25148
  UnsafeNameError = class extends CliError {
25146
25149
  constructor(attemptedName, kind, rule = STORED_NAME_RULE, source) {
25147
25150
  super(`${source === void 0 ? "" : `${source}: `}${JSON.stringify(attemptedName)} is not a valid ${kind} name: a name ${rule}.`);
@@ -28489,6 +28492,8 @@ var init_schema = __esm({
28489
28492
  IdentitySchema = external_exports.strictObject({
28490
28493
  $schema: external_exports.string().optional(),
28491
28494
  name: FileNameSchema,
28495
+ /** What the identity is for, in the person's words, drawn beside its name in `identity list` and `show`, the launch banner and the statusline. Display only: the name stays the key for lookup, paths, keychain service names and pools. */
28496
+ label: IdentityLabelSchema.optional(),
28492
28497
  defaultConfigProfile: StoredNameSchema.optional(),
28493
28498
  /** The provider this identity exists for: a launch on the identity routes through it unless `--provider`, `--no-provider` or a cascade layer's `launch.provider` says otherwise. Its sessions run on the provider's credential, so the identity needs no stored login. */
28494
28499
  provider: StoredNameSchema.optional(),
@@ -38280,7 +38285,7 @@ var init_package = __esm({
38280
38285
  "package.json"() {
38281
38286
  package_default = {
38282
38287
  name: "agent-shim",
38283
- version: "11.80.0",
38288
+ version: "11.81.0",
38284
38289
  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.",
38285
38290
  license: "MIT",
38286
38291
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -68108,9 +68113,15 @@ function movedRows(facts) {
68108
68113
  }
68109
68114
  return [];
68110
68115
  }
68116
+ function identityText(facts) {
68117
+ if (facts.identity === void 0) {
68118
+ return "(none)";
68119
+ }
68120
+ return facts.identityLabel === void 0 ? facts.identity : `${facts.identity} (${facts.identityLabel})`;
68121
+ }
68111
68122
  function decisionRows(facts) {
68112
68123
  return [
68113
- { label: "identity", value: facts.identity ?? "(none)", detail: facts.identitySource },
68124
+ { label: "identity", value: identityText(facts), detail: facts.identitySource },
68114
68125
  ...facts.pool === void 0 ? [] : [
68115
68126
  {
68116
68127
  label: "pool",
@@ -70276,6 +70287,7 @@ function decideLaunch(params, readOnly) {
70276
70287
  return {
70277
70288
  parsedArgv,
70278
70289
  identityDecision,
70290
+ identityLabel: loadedIdentity?.config.label,
70279
70291
  poolPick,
70280
70292
  poolRanking,
70281
70293
  lastRanAs,
@@ -70306,6 +70318,7 @@ function prepareLaunch(params) {
70306
70318
  const rows = [
70307
70319
  ...decisionRows({
70308
70320
  identity: identityDecision.name,
70321
+ identityLabel: decided.identityLabel,
70309
70322
  identitySource: identityDecision.source,
70310
70323
  pool: poolPick,
70311
70324
  ranking: resolvedFlags.explain ? poolRanking : void 0,
@@ -116668,6 +116681,12 @@ function setIdentityProvider(paths, identityName, providerName) {
116668
116681
  }
116669
116682
  return applyPatch(identityJsonPath(paths, identityName), IdentitySchema, { provider: providerName });
116670
116683
  }
116684
+ function setIdentityLabel(paths, identityName, label2) {
116685
+ if (!identityExists(paths, identityName)) {
116686
+ throw new IdentityNotFoundError(identityName);
116687
+ }
116688
+ return applyPatch(identityJsonPath(paths, identityName), IdentitySchema, { label: label2 });
116689
+ }
116671
116690
  function setAllowAmbientCredential(paths, identityName, allow) {
116672
116691
  if (!identityExists(paths, identityName)) {
116673
116692
  throw new IdentityNotFoundError(identityName);
@@ -117812,6 +117831,7 @@ function registerProfileCommand(program2, deps) {
117812
117831
  }
117813
117832
 
117814
117833
  // src/identityManager.ts
117834
+ init_names();
117815
117835
  init_providersStore();
117816
117836
  init_identity();
117817
117837
  init_realPorts();
@@ -117887,6 +117907,7 @@ function toIdentityView(paths, { entry, read }, sharesLoginWith) {
117887
117907
  active: entry.isActive,
117888
117908
  directory: import_node_path25.default.join(paths.identitiesDir, entry.name),
117889
117909
  ...entry.problem === void 0 ? {
117910
+ ...entry.identity.label === void 0 ? {} : { label: entry.identity.label },
117890
117911
  ...entry.identity.defaultConfigProfile === void 0 ? {} : { defaultConfigProfile: entry.identity.defaultConfigProfile },
117891
117912
  ...entry.identity.provider === void 0 ? {} : { provider: entry.identity.provider },
117892
117913
  allowAmbientCredential: entry.identity.allowAmbientCredential,
@@ -117914,11 +117935,12 @@ function formatIdentityLine(entry, view) {
117914
117935
  if (entry.problem !== void 0) {
117915
117936
  return `${marker}${entry.name} [unreadable: ${entry.problem}]${account}${accountProblem}`;
117916
117937
  }
117938
+ const label2 = entry.identity.label === void 0 ? "" : ` (label: ${entry.identity.label})`;
117917
117939
  const defaultProfile = entry.identity.defaultConfigProfile === void 0 ? "" : ` (default profile: ${entry.identity.defaultConfigProfile})`;
117918
117940
  const provider = entry.identity.provider === void 0 ? "" : ` (provider: ${entry.identity.provider})`;
117919
117941
  const ambient = entry.identity.allowAmbientCredential ? " [allows ambient credential]" : "";
117920
117942
  const credential = entry.identity.credential === void 0 ? "" : ` [credential ${describeCredential(entry.identity.credential)}]`;
117921
- return `${marker}${entry.name}${defaultProfile}${provider}${ambient}${credential}${account}${accountProblem}`;
117943
+ return `${marker}${entry.name}${label2}${defaultProfile}${provider}${ambient}${credential}${account}${accountProblem}`;
117922
117944
  }
117923
117945
  function registerIdentityCommand(program2, deps) {
117924
117946
  const { paths } = deps;
@@ -117990,6 +118012,7 @@ function registerIdentityCommand(program2, deps) {
117990
118012
  console.log(`Unreadable: ${view.problem}`);
117991
118013
  return;
117992
118014
  }
118015
+ console.log(`Label: ${view.label ?? "(none)"}`);
117993
118016
  console.log(`Default configuration profile: ${view.defaultConfigProfile ?? "(none)"}`);
117994
118017
  console.log(`Provider: ${view.provider ?? "(none)"}`);
117995
118018
  console.log(`Allows ambient credential: ${view.allowAmbientCredential === true ? "yes" : "no"}`);
@@ -117998,7 +118021,7 @@ function registerIdentityCommand(program2, deps) {
117998
118021
  }),
117999
118022
  ["agent-shim identity show work", "agent-shim identity show work --json"]
118000
118023
  );
118001
- const identitySet = identity.command("set <name>").description("Update an identity's settings.").option("--json", "Print the result as JSON.").option("--default-profile <profile>", "Configuration profile this identity uses when nothing more specific selects one.").option("--no-default-profile", "Clear this identity's default configuration profile.").option("--provider <provider>", "Provider this identity exists for: a launch on it routes through the provider unless a flag, directory rule or profile selects another, and doctor expects no stored login.").option("--no-provider", "Clear this identity's provider.").option("--allow-ambient-credential", "Allow this identity to launch even with an ambient credential env var set.").option("--no-allow-ambient-credential", "Disallow ambient credential env vars for this identity (the default).").option(
118024
+ const identitySet = identity.command("set <name>").description("Update an identity's settings.").option("--json", "Print the result as JSON.").option("--label <text>", "Free text shown beside this identity's name in `identity list` and `show`, the launch banner and the statusline. Display only: the name stays the key.").option("--no-label", "Clear this identity's label.").option("--default-profile <profile>", "Configuration profile this identity uses when nothing more specific selects one.").option("--no-default-profile", "Clear this identity's default configuration profile.").option("--provider <provider>", "Provider this identity exists for: a launch on it routes through the provider unless a flag, directory rule or profile selects another, and doctor expects no stored login.").option("--no-provider", "Clear this identity's provider.").option("--allow-ambient-credential", "Allow this identity to launch even with an ambient credential env var set.").option("--no-allow-ambient-credential", "Disallow ambient credential env vars for this identity (the default).").option(
118002
118025
  "--credential <source>",
118003
118026
  `Authenticate this identity from a token instead of its stored login, replacing any existing sources (repeatable, in the order tried): ${CREDENTIAL_SOURCE_SYNTAX}.`,
118004
118027
  collectCredentialSource
@@ -118018,16 +118041,25 @@ function registerIdentityCommand(program2, deps) {
118018
118041
  const { json: json2, ...options } = allOptions;
118019
118042
  if (Object.entries(allOptions).every(([key, value2]) => key === "json" || value2 === void 0)) {
118020
118043
  throw new UsageError(
118021
- "Nothing to change: pass --default-profile, --no-default-profile, --provider, --no-provider, --allow-ambient-credential, --no-allow-ambient-credential, --credential, --no-credential, --credential-target, --anchor, --no-anchor or a --credential-cache option."
118044
+ "Nothing to change: pass --label, --no-label, --default-profile, --no-default-profile, --provider, --no-provider, --allow-ambient-credential, --no-allow-ambient-credential, --credential, --no-credential, --credential-target, --anchor, --no-anchor or a --credential-cache option."
118022
118045
  );
118023
118046
  }
118024
118047
  if (!identityExists(paths, name)) {
118025
118048
  throw new IdentityNotFoundError(name);
118026
118049
  }
118050
+ const label2 = typeof options.label === "string" ? IdentityLabelSchema.safeParse(options.label) : void 0;
118051
+ if (label2?.success === false) {
118052
+ throw new UsageError(`Identity label ${JSON.stringify(options.label)} ${IDENTITY_LABEL_RULE}.`);
118053
+ }
118027
118054
  if (typeof options.provider === "string") {
118028
118055
  requireProviderExists(paths, options.provider);
118029
118056
  }
118030
118057
  const messages = [];
118058
+ if (options.label !== void 0) {
118059
+ const labelText = options.label === false ? void 0 : options.label;
118060
+ setIdentityLabel(paths, name, labelText);
118061
+ messages.push(labelText === void 0 ? `Identity "${name}" no longer has a label.` : `Identity "${name}" is now labelled ${JSON.stringify(labelText)}.`);
118062
+ }
118031
118063
  if (options.defaultProfile !== void 0) {
118032
118064
  const profileName = options.defaultProfile === false ? void 0 : options.defaultProfile;
118033
118065
  if (profileName !== void 0) {
@@ -118072,6 +118104,7 @@ function registerIdentityCommand(program2, deps) {
118072
118104
  });
118073
118105
  }),
118074
118106
  [
118107
+ 'agent-shim identity set work --label "Example Org"',
118075
118108
  "agent-shim identity set work --default-profile client-acme",
118076
118109
  "agent-shim identity set minimax --provider minimax",
118077
118110
  "agent-shim identity set work --allow-ambient-credential",
@@ -133252,6 +133285,7 @@ init_providersStore();
133252
133285
  // src/frontdoor/configSchemas.ts
133253
133286
  init_zod();
133254
133287
  init_schema();
133288
+ init_names();
133255
133289
  init_statusline();
133256
133290
  var RemovalConfirmationSchema = external_exports.boolean();
133257
133291
  var CredentialWriteSchema = (targets) => external_exports.strictObject({
@@ -133277,6 +133311,7 @@ var mutationOutput = (kind, action) => external_exports.strictObject({ action: e
133277
133311
  var storedMutationOutput = (kind, action, value2) => external_exports.strictObject({ action: external_exports.literal(action), kind: external_exports.literal(kind), name: external_exports.string(), value: value2 });
133278
133312
  var IdentityValueSchema = external_exports.strictObject({
133279
133313
  name: external_exports.string(),
133314
+ label: external_exports.string().optional(),
133280
133315
  defaultConfigProfile: external_exports.string().optional(),
133281
133316
  provider: external_exports.string().optional(),
133282
133317
  allowAmbientCredential: external_exports.boolean(),
@@ -133297,6 +133332,8 @@ var ConfigNameInputSchema = external_exports.strictObject({ name: external_expor
133297
133332
  var ConfigIdentityAddOutputSchema = storedMutationOutput("identity", "created", IdentityValueSchema);
133298
133333
  var ConfigIdentitySetInputSchema = external_exports.strictObject({
133299
133334
  name: external_exports.string().min(1),
133335
+ /** The identity's display label; `false` clears it. */
133336
+ label: external_exports.union([IdentityLabelSchema, external_exports.literal(false)]).optional(),
133300
133337
  defaultConfigProfile: external_exports.union([external_exports.string().min(1), external_exports.literal(false)]).optional(),
133301
133338
  /** The provider the identity exists for; `false` clears it. */
133302
133339
  provider: external_exports.union([external_exports.string().min(1), external_exports.literal(false)]).optional(),
@@ -133443,6 +133480,7 @@ function identityValue(name, paths) {
133443
133480
  }
133444
133481
  return {
133445
133482
  name: identity.name,
133483
+ ...identity.label === void 0 ? {} : { label: identity.label },
133446
133484
  ...identity.defaultConfigProfile === void 0 ? {} : { defaultConfigProfile: identity.defaultConfigProfile },
133447
133485
  ...identity.provider === void 0 ? {} : { provider: identity.provider },
133448
133486
  allowAmbientCredential: identity.allowAmbientCredential,
@@ -133477,9 +133515,9 @@ function createConfigApiRouter(deps) {
133477
133515
  return { action: "created", kind: "identity", name: input2.name, value: identityValue(input2.name, paths) };
133478
133516
  })
133479
133517
  ),
133480
- set: route("/rest/config/identity/set", "Update an identity's default profile, provider, ambient-credential setting, credential or anchors").input(ConfigIdentitySetInputSchema).output(ConfigIdentitySetOutputSchema).handler(
133518
+ set: route("/rest/config/identity/set", "Update an identity's label, default profile, provider, ambient-credential setting, credential or anchors").input(ConfigIdentitySetInputSchema).output(ConfigIdentitySetOutputSchema).handler(
133481
133519
  ({ input: input2 }) => guarded(() => {
133482
- requireChange(input2.defaultConfigProfile !== void 0 || input2.provider !== void 0 || input2.allowAmbientCredential !== void 0 || input2.credential !== void 0 || input2.anchors !== void 0, "defaultConfigProfile, provider, allowAmbientCredential, credential or anchors");
133520
+ requireChange(input2.label !== void 0 || input2.defaultConfigProfile !== void 0 || input2.provider !== void 0 || input2.allowAmbientCredential !== void 0 || input2.credential !== void 0 || input2.anchors !== void 0, "label, defaultConfigProfile, provider, allowAmbientCredential, credential or anchors");
133483
133521
  if (!identityExists(paths, input2.name)) {
133484
133522
  throw new IdentityNotFoundError(input2.name);
133485
133523
  }
@@ -133489,6 +133527,9 @@ function createConfigApiRouter(deps) {
133489
133527
  if (typeof input2.provider === "string") {
133490
133528
  requireProviderExists(paths, input2.provider);
133491
133529
  }
133530
+ if (input2.label !== void 0) {
133531
+ setIdentityLabel(paths, input2.name, input2.label === false ? void 0 : input2.label);
133532
+ }
133492
133533
  if (input2.defaultConfigProfile !== void 0) {
133493
133534
  setDefaultConfigProfile(paths, input2.name, input2.defaultConfigProfile === false ? void 0 : input2.defaultConfigProfile);
133494
133535
  }
@@ -141027,6 +141068,7 @@ function enrichStatuslinePayload(params) {
141027
141068
  const account = clientEmail === void 0 ? params.account : void 0;
141028
141069
  let summary = {
141029
141070
  identity,
141071
+ identityLabel: params.identityLabel,
141030
141072
  provider: params.env.AGENT_SHIM_PROVIDER === void 0 || params.env.AGENT_SHIM_PROVIDER === "" ? void 0 : params.env.AGENT_SHIM_PROVIDER,
141031
141073
  providerAccountEmail: void 0,
141032
141074
  providerAccountSub: void 0,
@@ -142349,7 +142391,13 @@ function headroomSegment({ summary, t: t10 }) {
142349
142391
 
142350
142392
  // src/statusline/elements/header/identity.ts
142351
142393
  function identitySegment({ summary }) {
142352
- if (summary.identity !== void 0 && summary.provider !== void 0 && summary.identity !== summary.providerAccountEmail && summary.identity !== summary.loginAccountEmail) {
142394
+ if (summary.identity === void 0) {
142395
+ return void 0;
142396
+ }
142397
+ if (summary.identityLabel !== void 0) {
142398
+ return `${summary.identity} (${summary.identityLabel})`;
142399
+ }
142400
+ if (summary.provider !== void 0 && summary.identity !== summary.providerAccountEmail && summary.identity !== summary.loginAccountEmail) {
142353
142401
  return summary.identity;
142354
142402
  }
142355
142403
  return void 0;
@@ -145383,7 +145431,13 @@ function registerStatuslineCommand(program2, deps) {
145383
145431
  const identity = identityOf(process.env);
145384
145432
  let snapshot;
145385
145433
  let account;
145434
+ let identityLabel;
145386
145435
  if (identity !== void 0) {
145436
+ try {
145437
+ identityLabel = readIdentity(deps.paths, identity)?.label;
145438
+ } catch {
145439
+ identityLabel = void 0;
145440
+ }
145387
145441
  try {
145388
145442
  snapshot = readUsageSnapshot(realFarmFs, deps.paths.usageSnapshotsDir, identity);
145389
145443
  } catch {
@@ -145435,7 +145489,7 @@ function registerStatuslineCommand(program2, deps) {
145435
145489
  }
145436
145490
  }
145437
145491
  const clientPayload = parseClientPayload(payload);
145438
- const enrichParams = { payload, env: process.env, snapshot, account, providerName, nowMs, headroom, routedTarget, ...modelChoice === void 0 ? {} : { modelChoice } };
145492
+ const enrichParams = { payload, env: process.env, identityLabel, snapshot, account, providerName, nowMs, headroom, routedTarget, ...modelChoice === void 0 ? {} : { modelChoice } };
145439
145493
  const renderer = process.env.AGENT_SHIM_STATUSLINE_CMD;
145440
145494
  if (renderer !== void 0 && renderer !== "") {
145441
145495
  const child = (0, import_node_child_process9.spawn)("/bin/sh", ["-c", renderer], { stdio: ["pipe", "inherit", "inherit"] });
package/dist/index.cjs CHANGED
@@ -183,7 +183,7 @@ function providerFilePath(directory, name, source) {
183
183
  }
184
184
  return import_node_path.default.join(directory, `${name}.json`);
185
185
  }
186
- var import_node_path, import_zod, FILESYSTEM_COMPONENT_BYTES, MAX_PID_DIGITS, UUID_CHARS, ATOMIC_WRITE_OVERHEAD_BYTES, FARM_SWAP_OVERHEAD_BYTES, MAX_NAME_BYTES, FILE_NAME_PATTERN, FILE_NAME, FILE_NAME_RULE, STORED_NAME_RULE, FileNameSchema, StoredNameSchema, UnsafeNameError, InvalidProviderNameError;
186
+ var import_node_path, import_zod, FILESYSTEM_COMPONENT_BYTES, MAX_PID_DIGITS, UUID_CHARS, ATOMIC_WRITE_OVERHEAD_BYTES, FARM_SWAP_OVERHEAD_BYTES, MAX_NAME_BYTES, FILE_NAME_PATTERN, FILE_NAME, FILE_NAME_RULE, STORED_NAME_RULE, FileNameSchema, StoredNameSchema, LABEL_FORBIDDEN, IDENTITY_LABEL_RULE, IdentityLabelSchema, UnsafeNameError, InvalidProviderNameError;
187
187
  var init_names = __esm({
188
188
  "src/config/names.ts"() {
189
189
  "use strict";
@@ -202,6 +202,9 @@ var init_names = __esm({
202
202
  STORED_NAME_RULE = `must be non-empty, at most ${String(MAX_NAME_BYTES)} bytes, not "." or "..", and contain no path separator or NUL`;
203
203
  FileNameSchema = import_zod.z.string().min(1).regex(FILE_NAME, FILE_NAME_RULE);
204
204
  StoredNameSchema = import_zod.z.string().min(1).max(MAX_NAME_BYTES).refine(isStoredName, STORED_NAME_RULE);
205
+ LABEL_FORBIDDEN = /[\p{Cc}\p{Zl}\p{Zp}]/u;
206
+ IDENTITY_LABEL_RULE = `must be non-empty single-line text of at most ${String(MAX_NAME_BYTES)} characters, with no control characters and no leading or trailing whitespace`;
207
+ IdentityLabelSchema = import_zod.z.string().min(1).max(MAX_NAME_BYTES).refine((label) => label === label.trim() && !LABEL_FORBIDDEN.test(label), IDENTITY_LABEL_RULE);
205
208
  UnsafeNameError = class extends CliError {
206
209
  constructor(attemptedName, kind, rule = STORED_NAME_RULE, source) {
207
210
  super(`${source === void 0 ? "" : `${source}: `}${JSON.stringify(attemptedName)} is not a valid ${kind} name: a name ${rule}.`);
@@ -1228,6 +1231,8 @@ var init_schema = __esm({
1228
1231
  IdentitySchema = import_zod3.z.strictObject({
1229
1232
  $schema: import_zod3.z.string().optional(),
1230
1233
  name: FileNameSchema,
1234
+ /** What the identity is for, in the person's words, drawn beside its name in `identity list` and `show`, the launch banner and the statusline. Display only: the name stays the key for lookup, paths, keychain service names and pools. */
1235
+ label: IdentityLabelSchema.optional(),
1231
1236
  defaultConfigProfile: StoredNameSchema.optional(),
1232
1237
  /** The provider this identity exists for: a launch on the identity routes through it unless `--provider`, `--no-provider` or a cascade layer's `launch.provider` says otherwise. Its sessions run on the provider's credential, so the identity needs no stored login. */
1233
1238
  provider: StoredNameSchema.optional(),
@@ -4764,7 +4769,7 @@ var init_package = __esm({
4764
4769
  "package.json"() {
4765
4770
  package_default = {
4766
4771
  name: "agent-shim",
4767
- version: "11.80.0",
4772
+ version: "11.81.0",
4768
4773
  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.",
4769
4774
  license: "MIT",
4770
4775
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -11594,9 +11599,15 @@ function movedRows(facts) {
11594
11599
  }
11595
11600
  return [];
11596
11601
  }
11602
+ function identityText(facts) {
11603
+ if (facts.identity === void 0) {
11604
+ return "(none)";
11605
+ }
11606
+ return facts.identityLabel === void 0 ? facts.identity : `${facts.identity} (${facts.identityLabel})`;
11607
+ }
11597
11608
  function decisionRows(facts) {
11598
11609
  return [
11599
- { label: "identity", value: facts.identity ?? "(none)", detail: facts.identitySource },
11610
+ { label: "identity", value: identityText(facts), detail: facts.identitySource },
11600
11611
  ...facts.pool === void 0 ? [] : [
11601
11612
  {
11602
11613
  label: "pool",
@@ -12122,6 +12133,7 @@ function decideLaunch(params, readOnly) {
12122
12133
  return {
12123
12134
  parsedArgv,
12124
12135
  identityDecision,
12136
+ identityLabel: loadedIdentity?.config.label,
12125
12137
  poolPick,
12126
12138
  poolRanking,
12127
12139
  lastRanAs,
@@ -12152,6 +12164,7 @@ function prepareLaunch(params) {
12152
12164
  const rows = [
12153
12165
  ...decisionRows({
12154
12166
  identity: identityDecision.name,
12167
+ identityLabel: decided.identityLabel,
12155
12168
  identitySource: identityDecision.source,
12156
12169
  pool: poolPick,
12157
12170
  ranking: resolvedFlags.explain ? poolRanking : void 0,
@@ -17137,6 +17150,12 @@ function setIdentityProvider(paths, identityName, providerName) {
17137
17150
  }
17138
17151
  return applyPatch(identityJsonPath(paths, identityName), IdentitySchema, { provider: providerName });
17139
17152
  }
17153
+ function setIdentityLabel(paths, identityName, label) {
17154
+ if (!identityExists(paths, identityName)) {
17155
+ throw new IdentityNotFoundError(identityName);
17156
+ }
17157
+ return applyPatch(identityJsonPath(paths, identityName), IdentitySchema, { label });
17158
+ }
17140
17159
  function setAllowAmbientCredential(paths, identityName, allow) {
17141
17160
  if (!identityExists(paths, identityName)) {
17142
17161
  throw new IdentityNotFoundError(identityName);
@@ -18531,6 +18550,7 @@ init_providersStore();
18531
18550
  // src/frontdoor/configSchemas.ts
18532
18551
  var import_zod30 = require("zod");
18533
18552
  init_schema();
18553
+ init_names();
18534
18554
  init_statusline();
18535
18555
  var RemovalConfirmationSchema = import_zod30.z.boolean();
18536
18556
  var CredentialWriteSchema = (targets) => import_zod30.z.strictObject({
@@ -18556,6 +18576,7 @@ var mutationOutput = (kind, action) => import_zod30.z.strictObject({ action: imp
18556
18576
  var storedMutationOutput = (kind, action, value) => import_zod30.z.strictObject({ action: import_zod30.z.literal(action), kind: import_zod30.z.literal(kind), name: import_zod30.z.string(), value });
18557
18577
  var IdentityValueSchema = import_zod30.z.strictObject({
18558
18578
  name: import_zod30.z.string(),
18579
+ label: import_zod30.z.string().optional(),
18559
18580
  defaultConfigProfile: import_zod30.z.string().optional(),
18560
18581
  provider: import_zod30.z.string().optional(),
18561
18582
  allowAmbientCredential: import_zod30.z.boolean(),
@@ -18576,6 +18597,8 @@ var ConfigNameInputSchema = import_zod30.z.strictObject({ name: import_zod30.z.s
18576
18597
  var ConfigIdentityAddOutputSchema = storedMutationOutput("identity", "created", IdentityValueSchema);
18577
18598
  var ConfigIdentitySetInputSchema = import_zod30.z.strictObject({
18578
18599
  name: import_zod30.z.string().min(1),
18600
+ /** The identity's display label; `false` clears it. */
18601
+ label: import_zod30.z.union([IdentityLabelSchema, import_zod30.z.literal(false)]).optional(),
18579
18602
  defaultConfigProfile: import_zod30.z.union([import_zod30.z.string().min(1), import_zod30.z.literal(false)]).optional(),
18580
18603
  /** The provider the identity exists for; `false` clears it. */
18581
18604
  provider: import_zod30.z.union([import_zod30.z.string().min(1), import_zod30.z.literal(false)]).optional(),
@@ -18722,6 +18745,7 @@ function identityValue(name, paths) {
18722
18745
  }
18723
18746
  return {
18724
18747
  name: identity.name,
18748
+ ...identity.label === void 0 ? {} : { label: identity.label },
18725
18749
  ...identity.defaultConfigProfile === void 0 ? {} : { defaultConfigProfile: identity.defaultConfigProfile },
18726
18750
  ...identity.provider === void 0 ? {} : { provider: identity.provider },
18727
18751
  allowAmbientCredential: identity.allowAmbientCredential,
@@ -18756,9 +18780,9 @@ function createConfigApiRouter(deps) {
18756
18780
  return { action: "created", kind: "identity", name: input.name, value: identityValue(input.name, paths) };
18757
18781
  })
18758
18782
  ),
18759
- set: route("/rest/config/identity/set", "Update an identity's default profile, provider, ambient-credential setting, credential or anchors").input(ConfigIdentitySetInputSchema).output(ConfigIdentitySetOutputSchema).handler(
18783
+ set: route("/rest/config/identity/set", "Update an identity's label, default profile, provider, ambient-credential setting, credential or anchors").input(ConfigIdentitySetInputSchema).output(ConfigIdentitySetOutputSchema).handler(
18760
18784
  ({ input }) => guarded(() => {
18761
- requireChange(input.defaultConfigProfile !== void 0 || input.provider !== void 0 || input.allowAmbientCredential !== void 0 || input.credential !== void 0 || input.anchors !== void 0, "defaultConfigProfile, provider, allowAmbientCredential, credential or anchors");
18785
+ requireChange(input.label !== void 0 || input.defaultConfigProfile !== void 0 || input.provider !== void 0 || input.allowAmbientCredential !== void 0 || input.credential !== void 0 || input.anchors !== void 0, "label, defaultConfigProfile, provider, allowAmbientCredential, credential or anchors");
18762
18786
  if (!identityExists(paths, input.name)) {
18763
18787
  throw new IdentityNotFoundError(input.name);
18764
18788
  }
@@ -18768,6 +18792,9 @@ function createConfigApiRouter(deps) {
18768
18792
  if (typeof input.provider === "string") {
18769
18793
  requireProviderExists(paths, input.provider);
18770
18794
  }
18795
+ if (input.label !== void 0) {
18796
+ setIdentityLabel(paths, input.name, input.label === false ? void 0 : input.label);
18797
+ }
18771
18798
  if (input.defaultConfigProfile !== void 0) {
18772
18799
  setDefaultConfigProfile(paths, input.name, input.defaultConfigProfile === false ? void 0 : input.defaultConfigProfile);
18773
18800
  }
package/dist/index.mjs CHANGED
@@ -163,7 +163,7 @@ function providerFilePath(directory, name, source) {
163
163
  }
164
164
  return path.join(directory, `${name}.json`);
165
165
  }
166
- var FILESYSTEM_COMPONENT_BYTES, MAX_PID_DIGITS, UUID_CHARS, ATOMIC_WRITE_OVERHEAD_BYTES, FARM_SWAP_OVERHEAD_BYTES, MAX_NAME_BYTES, FILE_NAME_PATTERN, FILE_NAME, FILE_NAME_RULE, STORED_NAME_RULE, FileNameSchema, StoredNameSchema, UnsafeNameError, InvalidProviderNameError;
166
+ var FILESYSTEM_COMPONENT_BYTES, MAX_PID_DIGITS, UUID_CHARS, ATOMIC_WRITE_OVERHEAD_BYTES, FARM_SWAP_OVERHEAD_BYTES, MAX_NAME_BYTES, FILE_NAME_PATTERN, FILE_NAME, FILE_NAME_RULE, STORED_NAME_RULE, FileNameSchema, StoredNameSchema, LABEL_FORBIDDEN, IDENTITY_LABEL_RULE, IdentityLabelSchema, UnsafeNameError, InvalidProviderNameError;
167
167
  var init_names = __esm({
168
168
  "src/config/names.ts"() {
169
169
  "use strict";
@@ -180,6 +180,9 @@ var init_names = __esm({
180
180
  STORED_NAME_RULE = `must be non-empty, at most ${String(MAX_NAME_BYTES)} bytes, not "." or "..", and contain no path separator or NUL`;
181
181
  FileNameSchema = z.string().min(1).regex(FILE_NAME, FILE_NAME_RULE);
182
182
  StoredNameSchema = z.string().min(1).max(MAX_NAME_BYTES).refine(isStoredName, STORED_NAME_RULE);
183
+ LABEL_FORBIDDEN = /[\p{Cc}\p{Zl}\p{Zp}]/u;
184
+ IDENTITY_LABEL_RULE = `must be non-empty single-line text of at most ${String(MAX_NAME_BYTES)} characters, with no control characters and no leading or trailing whitespace`;
185
+ IdentityLabelSchema = z.string().min(1).max(MAX_NAME_BYTES).refine((label) => label === label.trim() && !LABEL_FORBIDDEN.test(label), IDENTITY_LABEL_RULE);
183
186
  UnsafeNameError = class extends CliError {
184
187
  constructor(attemptedName, kind, rule = STORED_NAME_RULE, source) {
185
188
  super(`${source === void 0 ? "" : `${source}: `}${JSON.stringify(attemptedName)} is not a valid ${kind} name: a name ${rule}.`);
@@ -1206,6 +1209,8 @@ var init_schema = __esm({
1206
1209
  IdentitySchema = z3.strictObject({
1207
1210
  $schema: z3.string().optional(),
1208
1211
  name: FileNameSchema,
1212
+ /** What the identity is for, in the person's words, drawn beside its name in `identity list` and `show`, the launch banner and the statusline. Display only: the name stays the key for lookup, paths, keychain service names and pools. */
1213
+ label: IdentityLabelSchema.optional(),
1209
1214
  defaultConfigProfile: StoredNameSchema.optional(),
1210
1215
  /** The provider this identity exists for: a launch on the identity routes through it unless `--provider`, `--no-provider` or a cascade layer's `launch.provider` says otherwise. Its sessions run on the provider's credential, so the identity needs no stored login. */
1211
1216
  provider: StoredNameSchema.optional(),
@@ -4740,7 +4745,7 @@ var init_package = __esm({
4740
4745
  "package.json"() {
4741
4746
  package_default = {
4742
4747
  name: "agent-shim",
4743
- version: "11.80.0",
4748
+ version: "11.81.0",
4744
4749
  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.",
4745
4750
  license: "MIT",
4746
4751
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -11566,9 +11571,15 @@ function movedRows(facts) {
11566
11571
  }
11567
11572
  return [];
11568
11573
  }
11574
+ function identityText(facts) {
11575
+ if (facts.identity === void 0) {
11576
+ return "(none)";
11577
+ }
11578
+ return facts.identityLabel === void 0 ? facts.identity : `${facts.identity} (${facts.identityLabel})`;
11579
+ }
11569
11580
  function decisionRows(facts) {
11570
11581
  return [
11571
- { label: "identity", value: facts.identity ?? "(none)", detail: facts.identitySource },
11582
+ { label: "identity", value: identityText(facts), detail: facts.identitySource },
11572
11583
  ...facts.pool === void 0 ? [] : [
11573
11584
  {
11574
11585
  label: "pool",
@@ -12097,6 +12108,7 @@ function decideLaunch(params, readOnly) {
12097
12108
  return {
12098
12109
  parsedArgv,
12099
12110
  identityDecision,
12111
+ identityLabel: loadedIdentity?.config.label,
12100
12112
  poolPick,
12101
12113
  poolRanking,
12102
12114
  lastRanAs,
@@ -12127,6 +12139,7 @@ function prepareLaunch(params) {
12127
12139
  const rows = [
12128
12140
  ...decisionRows({
12129
12141
  identity: identityDecision.name,
12142
+ identityLabel: decided.identityLabel,
12130
12143
  identitySource: identityDecision.source,
12131
12144
  pool: poolPick,
12132
12145
  ranking: resolvedFlags.explain ? poolRanking : void 0,
@@ -16722,6 +16735,12 @@ function setIdentityProvider(paths, identityName, providerName) {
16722
16735
  }
16723
16736
  return applyPatch(identityJsonPath(paths, identityName), IdentitySchema, { provider: providerName });
16724
16737
  }
16738
+ function setIdentityLabel(paths, identityName, label) {
16739
+ if (!identityExists(paths, identityName)) {
16740
+ throw new IdentityNotFoundError(identityName);
16741
+ }
16742
+ return applyPatch(identityJsonPath(paths, identityName), IdentitySchema, { label });
16743
+ }
16725
16744
  function setAllowAmbientCredential(paths, identityName, allow) {
16726
16745
  if (!identityExists(paths, identityName)) {
16727
16746
  throw new IdentityNotFoundError(identityName);
@@ -18115,6 +18134,7 @@ init_providersStore();
18115
18134
 
18116
18135
  // src/frontdoor/configSchemas.ts
18117
18136
  init_schema();
18137
+ init_names();
18118
18138
  init_statusline();
18119
18139
  import { z as z30 } from "zod";
18120
18140
  var RemovalConfirmationSchema = z30.boolean();
@@ -18141,6 +18161,7 @@ var mutationOutput = (kind, action) => z30.strictObject({ action: z30.literal(ac
18141
18161
  var storedMutationOutput = (kind, action, value) => z30.strictObject({ action: z30.literal(action), kind: z30.literal(kind), name: z30.string(), value });
18142
18162
  var IdentityValueSchema = z30.strictObject({
18143
18163
  name: z30.string(),
18164
+ label: z30.string().optional(),
18144
18165
  defaultConfigProfile: z30.string().optional(),
18145
18166
  provider: z30.string().optional(),
18146
18167
  allowAmbientCredential: z30.boolean(),
@@ -18161,6 +18182,8 @@ var ConfigNameInputSchema = z30.strictObject({ name: z30.string().min(1) });
18161
18182
  var ConfigIdentityAddOutputSchema = storedMutationOutput("identity", "created", IdentityValueSchema);
18162
18183
  var ConfigIdentitySetInputSchema = z30.strictObject({
18163
18184
  name: z30.string().min(1),
18185
+ /** The identity's display label; `false` clears it. */
18186
+ label: z30.union([IdentityLabelSchema, z30.literal(false)]).optional(),
18164
18187
  defaultConfigProfile: z30.union([z30.string().min(1), z30.literal(false)]).optional(),
18165
18188
  /** The provider the identity exists for; `false` clears it. */
18166
18189
  provider: z30.union([z30.string().min(1), z30.literal(false)]).optional(),
@@ -18307,6 +18330,7 @@ function identityValue(name, paths) {
18307
18330
  }
18308
18331
  return {
18309
18332
  name: identity.name,
18333
+ ...identity.label === void 0 ? {} : { label: identity.label },
18310
18334
  ...identity.defaultConfigProfile === void 0 ? {} : { defaultConfigProfile: identity.defaultConfigProfile },
18311
18335
  ...identity.provider === void 0 ? {} : { provider: identity.provider },
18312
18336
  allowAmbientCredential: identity.allowAmbientCredential,
@@ -18341,9 +18365,9 @@ function createConfigApiRouter(deps) {
18341
18365
  return { action: "created", kind: "identity", name: input.name, value: identityValue(input.name, paths) };
18342
18366
  })
18343
18367
  ),
18344
- set: route("/rest/config/identity/set", "Update an identity's default profile, provider, ambient-credential setting, credential or anchors").input(ConfigIdentitySetInputSchema).output(ConfigIdentitySetOutputSchema).handler(
18368
+ set: route("/rest/config/identity/set", "Update an identity's label, default profile, provider, ambient-credential setting, credential or anchors").input(ConfigIdentitySetInputSchema).output(ConfigIdentitySetOutputSchema).handler(
18345
18369
  ({ input }) => guarded(() => {
18346
- requireChange(input.defaultConfigProfile !== void 0 || input.provider !== void 0 || input.allowAmbientCredential !== void 0 || input.credential !== void 0 || input.anchors !== void 0, "defaultConfigProfile, provider, allowAmbientCredential, credential or anchors");
18370
+ requireChange(input.label !== void 0 || input.defaultConfigProfile !== void 0 || input.provider !== void 0 || input.allowAmbientCredential !== void 0 || input.credential !== void 0 || input.anchors !== void 0, "label, defaultConfigProfile, provider, allowAmbientCredential, credential or anchors");
18347
18371
  if (!identityExists(paths, input.name)) {
18348
18372
  throw new IdentityNotFoundError(input.name);
18349
18373
  }
@@ -18353,6 +18377,9 @@ function createConfigApiRouter(deps) {
18353
18377
  if (typeof input.provider === "string") {
18354
18378
  requireProviderExists(paths, input.provider);
18355
18379
  }
18380
+ if (input.label !== void 0) {
18381
+ setIdentityLabel(paths, input.name, input.label === false ? void 0 : input.label);
18382
+ }
18356
18383
  if (input.defaultConfigProfile !== void 0) {
18357
18384
  setDefaultConfigProfile(paths, input.name, input.defaultConfigProfile === false ? void 0 : input.defaultConfigProfile);
18358
18385
  }
@@ -5412,6 +5412,7 @@ type GlobalConfig = z.infer<typeof GlobalConfigSchema>;
5412
5412
  declare const IdentitySchema: z.ZodObject<{
5413
5413
  $schema: z.ZodOptional<z.ZodString>;
5414
5414
  name: z.ZodString;
5415
+ label: z.ZodOptional<z.ZodString>;
5415
5416
  defaultConfigProfile: z.ZodOptional<z.ZodString>;
5416
5417
  provider: z.ZodOptional<z.ZodString>;
5417
5418
  allowAmbientCredential: z.ZodDefault<z.ZodBoolean>;
@@ -9476,6 +9477,7 @@ declare function createConfigApiRouter(deps: ConfigApiDeps): {
9476
9477
  name: zod.ZodString;
9477
9478
  value: zod.ZodObject<{
9478
9479
  name: zod.ZodString;
9480
+ label: zod.ZodOptional<zod.ZodString>;
9479
9481
  defaultConfigProfile: zod.ZodOptional<zod.ZodString>;
9480
9482
  provider: zod.ZodOptional<zod.ZodString>;
9481
9483
  allowAmbientCredential: zod.ZodBoolean;
@@ -9529,6 +9531,7 @@ declare function createConfigApiRouter(deps: ConfigApiDeps): {
9529
9531
  }, zod_v4_core.$strict>, MergedErrorMap<$ErrorMap, TErrorMap>>;
9530
9532
  set: _orpc_server.DecoratedProcedure<DoorApiContext & object, IntersectPick<TInitialContext, $OutContext>, zod.ZodObject<{
9531
9533
  name: zod.ZodString;
9534
+ label: zod.ZodOptional<zod.ZodUnion<readonly [zod.ZodString, zod.ZodLiteral<false>]>>;
9532
9535
  defaultConfigProfile: zod.ZodOptional<zod.ZodUnion<readonly [zod.ZodString, zod.ZodLiteral<false>]>>;
9533
9536
  provider: zod.ZodOptional<zod.ZodUnion<readonly [zod.ZodString, zod.ZodLiteral<false>]>>;
9534
9537
  allowAmbientCredential: zod.ZodOptional<zod.ZodBoolean>;
@@ -9583,6 +9586,7 @@ declare function createConfigApiRouter(deps: ConfigApiDeps): {
9583
9586
  name: zod.ZodString;
9584
9587
  value: zod.ZodObject<{
9585
9588
  name: zod.ZodString;
9589
+ label: zod.ZodOptional<zod.ZodString>;
9586
9590
  defaultConfigProfile: zod.ZodOptional<zod.ZodString>;
9587
9591
  provider: zod.ZodOptional<zod.ZodString>;
9588
9592
  allowAmbientCredential: zod.ZodBoolean;
@@ -16548,6 +16552,7 @@ declare function createDoorApiRouter(deps: DoorApiDeps): {
16548
16552
  name: zod.ZodString;
16549
16553
  value: zod.ZodObject<{
16550
16554
  name: zod.ZodString;
16555
+ label: zod.ZodOptional<zod.ZodString>;
16551
16556
  defaultConfigProfile: zod.ZodOptional<zod.ZodString>;
16552
16557
  provider: zod.ZodOptional<zod.ZodString>;
16553
16558
  allowAmbientCredential: zod.ZodBoolean;
@@ -16601,6 +16606,7 @@ declare function createDoorApiRouter(deps: DoorApiDeps): {
16601
16606
  }, zod_v4_core.$strict>, MergedErrorMap<$ErrorMap, TErrorMap>>;
16602
16607
  set: _orpc_server.DecoratedProcedure<DoorApiContext & object, IntersectPick<TInitialContext, $OutContext>, zod.ZodObject<{
16603
16608
  name: zod.ZodString;
16609
+ label: zod.ZodOptional<zod.ZodUnion<readonly [zod.ZodString, zod.ZodLiteral<false>]>>;
16604
16610
  defaultConfigProfile: zod.ZodOptional<zod.ZodUnion<readonly [zod.ZodString, zod.ZodLiteral<false>]>>;
16605
16611
  provider: zod.ZodOptional<zod.ZodUnion<readonly [zod.ZodString, zod.ZodLiteral<false>]>>;
16606
16612
  allowAmbientCredential: zod.ZodOptional<zod.ZodBoolean>;
@@ -16655,6 +16661,7 @@ declare function createDoorApiRouter(deps: DoorApiDeps): {
16655
16661
  name: zod.ZodString;
16656
16662
  value: zod.ZodObject<{
16657
16663
  name: zod.ZodString;
16664
+ label: zod.ZodOptional<zod.ZodString>;
16658
16665
  defaultConfigProfile: zod.ZodOptional<zod.ZodString>;
16659
16666
  provider: zod.ZodOptional<zod.ZodString>;
16660
16667
  allowAmbientCredential: zod.ZodBoolean;
@@ -21074,6 +21081,7 @@ declare const ConfigIdentityAddOutputSchema: z.ZodObject<{
21074
21081
  name: z.ZodString;
21075
21082
  value: z.ZodObject<{
21076
21083
  name: z.ZodString;
21084
+ label: z.ZodOptional<z.ZodString>;
21077
21085
  defaultConfigProfile: z.ZodOptional<z.ZodString>;
21078
21086
  provider: z.ZodOptional<z.ZodString>;
21079
21087
  allowAmbientCredential: z.ZodBoolean;
@@ -21128,6 +21136,7 @@ declare const ConfigIdentityAddOutputSchema: z.ZodObject<{
21128
21136
  /** `defaultConfigProfile: false` clears it; `credential: false` removes the credential block, returning the identity to its stored login. At least one field must be present. */
21129
21137
  declare const ConfigIdentitySetInputSchema: z.ZodObject<{
21130
21138
  name: z.ZodString;
21139
+ label: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<false>]>>;
21131
21140
  defaultConfigProfile: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<false>]>>;
21132
21141
  provider: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<false>]>>;
21133
21142
  allowAmbientCredential: z.ZodOptional<z.ZodBoolean>;
@@ -21183,6 +21192,7 @@ declare const ConfigIdentitySetOutputSchema: z.ZodObject<{
21183
21192
  name: z.ZodString;
21184
21193
  value: z.ZodObject<{
21185
21194
  name: z.ZodString;
21195
+ label: z.ZodOptional<z.ZodString>;
21186
21196
  defaultConfigProfile: z.ZodOptional<z.ZodString>;
21187
21197
  provider: z.ZodOptional<z.ZodString>;
21188
21198
  allowAmbientCredential: z.ZodBoolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-shim",
3
- "version": "11.80.0",
3
+ "version": "11.81.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>",