claude-use 11.28.0 → 11.29.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
@@ -28687,20 +28687,53 @@ var init_supervisor = __esm({
28687
28687
  }
28688
28688
  });
28689
28689
 
28690
- // src/logStyle.ts
28691
- function styledDiagnostic(style, colour, line) {
28692
- const lead = DIAGNOSTIC_LEAD.exec(line);
28693
- if (lead === null) {
28694
- return style([colour], line);
28690
+ // src/launcher/report.ts
28691
+ function renderReport(rows, style) {
28692
+ if (rows.length === 0) {
28693
+ return [];
28694
+ }
28695
+ const labelWidth = Math.max(...rows.map((row) => row.label.length));
28696
+ const indent = " ".repeat(COLUMN_GAP.length);
28697
+ const lines = [style(["bold"], REPORT_HEADING)];
28698
+ for (const row of rows) {
28699
+ const detail = row.detail === void 0 ? "" : ` ${style(["dim"], `(${row.detail})`)}`;
28700
+ lines.push(`${indent}${style(["dim"], row.label.padEnd(labelWidth))}${COLUMN_GAP}${row.value}${detail}`);
28701
+ for (const note of row.notes ?? []) {
28702
+ lines.push(`${indent}${" ".repeat(labelWidth)}${COLUMN_GAP}${style(["dim"], note)}`);
28703
+ }
28704
+ }
28705
+ return lines;
28706
+ }
28707
+ var REPORT_HEADING, COLUMN_GAP;
28708
+ var init_report = __esm({
28709
+ "src/launcher/report.ts"() {
28710
+ "use strict";
28711
+ REPORT_HEADING = "agent-shim";
28712
+ COLUMN_GAP = " ";
28695
28713
  }
28696
- const [whole, prefix = "", code = "", separator = ""] = lead;
28697
- return `${style([colour], prefix)}${style([colour, "bold"], code)}${style([colour], `${separator}${line.slice(whole.length)}`)}`;
28714
+ });
28715
+
28716
+ // src/logStyle.ts
28717
+ function styledDiagnostic(style, colour, text2) {
28718
+ return text2.split("\n").map((line, index) => {
28719
+ const lead = index === 0 ? DIAGNOSTIC_LEAD.exec(line) : null;
28720
+ if (lead === null) {
28721
+ return style([colour], line);
28722
+ }
28723
+ const [whole, prefix = "", code = "", separator = ""] = lead;
28724
+ return `${style([colour], prefix)}${style([colour, "bold"], code)}${style([colour], `${separator}${line.slice(whole.length)}`)}`;
28725
+ }).join("\n");
28698
28726
  }
28699
28727
  function createLogPort(sinks, styleFor) {
28700
28728
  return {
28701
28729
  info: (message) => {
28702
28730
  sinks.out(styleFor.out(["dim"], message));
28703
28731
  },
28732
+ report: (rows) => {
28733
+ for (const line of renderReport(rows, styleFor.out)) {
28734
+ sinks.out(line);
28735
+ }
28736
+ },
28704
28737
  warn: (message) => {
28705
28738
  sinks.warn(styledDiagnostic(styleFor.err, "yellow", message));
28706
28739
  },
@@ -28717,6 +28750,7 @@ var init_logStyle = __esm({
28717
28750
  "src/logStyle.ts"() {
28718
28751
  "use strict";
28719
28752
  import_node_util3 = require("node:util");
28753
+ init_report();
28720
28754
  DIAGNOSTIC_LEAD = /^(agent-shim: )([A-Z][A-Z0-9_]*)(: )/;
28721
28755
  }
28722
28756
  });
@@ -32635,11 +32669,15 @@ var init_flatten = __esm({
32635
32669
  });
32636
32670
 
32637
32671
  // src/resolve/decide.ts
32638
- function unclassifiedEntryMessage(names) {
32672
+ function unclassifiedEntrySummary(names) {
32639
32673
  const quoted = names.map((name) => `"${name}"`).join(", ");
32640
- const subject = names.length === 1 ? `${quoted} is not` : `${String(names.length)} entries are not`;
32641
- const excluded = names.length === 1 ? "it is excluded" : `they are excluded: ${quoted}`;
32642
- return `${subject} in the category map, so ${excluded}. Run \`agent-shim configure\` to classify ${names.length === 1 ? "it" : "them"}, which records the answer in the local overlay without touching the shipped default map.`;
32674
+ return names.length === 1 ? `${quoted} is not in the category map, so it is excluded` : `${String(names.length)} entries are not in the category map, so they are excluded: ${quoted}`;
32675
+ }
32676
+ function unclassifiedEntryFix(names) {
32677
+ return `Run \`agent-shim configure\` to classify ${names.length === 1 ? "it" : "them"}`;
32678
+ }
32679
+ function unclassifiedEntryMessage(names) {
32680
+ return `${unclassifiedEntrySummary(names)}. ${unclassifiedEntryFix(names)}.`;
32643
32681
  }
32644
32682
  function selectRule(relPath, flattened, context) {
32645
32683
  const eliminated = [];
@@ -34280,7 +34318,7 @@ var init_package = __esm({
34280
34318
  "package.json"() {
34281
34319
  package_default = {
34282
34320
  name: "claude-use",
34283
- version: "11.28.0",
34321
+ version: "11.29.0",
34284
34322
  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.",
34285
34323
  license: "MIT",
34286
34324
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -63595,7 +63633,9 @@ function diagnosticLines(diagnostics) {
63595
63633
  if (diagnostic.code === "UNCLASSIFIED_ENTRY") {
63596
63634
  if (!unclassifiedReported) {
63597
63635
  unclassifiedReported = true;
63598
- lines.push({ severity: diagnostic.severity, text: `agent-shim: ${diagnostic.code}: ${unclassifiedEntryMessage(unclassified.filter((name) => name !== void 0))}` });
63636
+ const names = unclassified.filter((name) => name !== void 0);
63637
+ lines.push({ severity: diagnostic.severity, text: `agent-shim: ${diagnostic.code}: ${unclassifiedEntrySummary(names)}
63638
+ ${unclassifiedEntryFix(names)}.` });
63599
63639
  }
63600
63640
  continue;
63601
63641
  }
@@ -63603,8 +63643,8 @@ function diagnosticLines(diagnostics) {
63603
63643
  }
63604
63644
  return lines;
63605
63645
  }
63606
- function reportDiagnostics(log, diagnostics, options) {
63607
- for (const line of diagnosticLines(diagnostics)) {
63646
+ function printDiagnosticLines(log, lines, options) {
63647
+ for (const line of lines) {
63608
63648
  if (line.severity === "error" && !options.errorsAsWarnings) {
63609
63649
  log.error(line.text);
63610
63650
  } else {
@@ -63612,6 +63652,9 @@ function reportDiagnostics(log, diagnostics, options) {
63612
63652
  }
63613
63653
  }
63614
63654
  }
63655
+ function reportDiagnostics(log, diagnostics, options) {
63656
+ printDiagnosticLines(log, diagnosticLines(diagnostics), options);
63657
+ }
63615
63658
  var init_diagnostics = __esm({
63616
63659
  "src/launcher/diagnostics.ts"() {
63617
63660
  "use strict";
@@ -63644,6 +63687,59 @@ var init_hold = __esm({
63644
63687
  }
63645
63688
  });
63646
63689
 
63690
+ // src/launcher/launchReport.ts
63691
+ function poolDetail(pool) {
63692
+ const [reason] = pool.reasons;
63693
+ if (pool.movedOff !== void 0) {
63694
+ return { detail: `moved off ${pool.movedOff.identity}: ${pool.movedOff.reason}`, ...reason === void 0 ? {} : { notes: [reason] } };
63695
+ }
63696
+ return reason === void 0 ? {} : { detail: reason };
63697
+ }
63698
+ function decisionRows(facts) {
63699
+ return [
63700
+ { label: "identity", value: facts.identity ?? "(none)", detail: facts.identitySource },
63701
+ ...facts.pool === void 0 ? [] : [
63702
+ {
63703
+ label: "pool",
63704
+ value: facts.pool.name,
63705
+ ...poolDetail(facts.pool)
63706
+ }
63707
+ ],
63708
+ ...facts.profile === void 0 ? [] : [{ label: "profile", value: facts.profile.name, detail: facts.profile.source }],
63709
+ ...facts.provider === void 0 ? [] : [{ label: "provider", value: facts.provider.name, detail: `credential ${facts.provider.credential}` }],
63710
+ ...facts.identityCredential === void 0 ? [] : [{ label: "credential", value: facts.identityCredential, detail: "the identity's own" }]
63711
+ ];
63712
+ }
63713
+ function pinnedVersionRow(version2, source) {
63714
+ return { label: "claude", value: version2, detail: `pinned by ${source}` };
63715
+ }
63716
+ function routingRows(facts) {
63717
+ if (facts.frontDoor === void 0) {
63718
+ return [];
63719
+ }
63720
+ return [
63721
+ {
63722
+ label: "routing",
63723
+ value: `front door 127.0.0.1:${String(facts.frontDoor.port)}`,
63724
+ ...facts.provider ? {} : { detail: `OAuth via CONNECT 127.0.0.1:${String(facts.frontDoor.connectPort)}` }
63725
+ },
63726
+ ...facts.headroom === void 0 ? [] : [{ label: "headroom", value: "on", detail: `project ${facts.headroom.projectId}` }]
63727
+ ];
63728
+ }
63729
+ function farmRow(links, builtDirectories, adopted) {
63730
+ const counted = (count, singular, plural2) => `${String(count)} ${count === 1 ? singular : plural2}`;
63731
+ const parts = [counted(links, "link", "links"), counted(builtDirectories, "built directory", "built directories"), ...adopted === 0 ? [] : [`${String(adopted)} adopted`]];
63732
+ return { label: "farm", value: "resynced", detail: parts.join(", ") };
63733
+ }
63734
+ function noteRow(text2) {
63735
+ return { label: "note", value: text2 };
63736
+ }
63737
+ var init_launchReport = __esm({
63738
+ "src/launcher/launchReport.ts"() {
63739
+ "use strict";
63740
+ }
63741
+ });
63742
+
63647
63743
  // src/antigravity/cloudUpstream.ts
63648
63744
  function isCcpaEndpoint(endpoint) {
63649
63745
  return endpoint.includes("cloudcode-pa.googleapis.com");
@@ -65038,7 +65134,7 @@ function pickFromPool(decided, params, parsedArgv, readOnly) {
65038
65134
  }
65039
65135
  if (params.supervised?.member !== void 0) {
65040
65136
  const reasons = ["resumed here by the supervising launcher after the previous member ran out of quota"];
65041
- return { identityDecision: { ...decided, name: params.supervised.member }, poolExplanation: `pool ${decided.pool}: ${reasons.join("; ")}`, poolPick: { name: decided.pool, reasons } };
65137
+ return { identityDecision: { ...decided, name: params.supervised.member }, poolPick: { name: decided.pool, reasons } };
65042
65138
  }
65043
65139
  const farmRuntime = params.farm;
65044
65140
  if (farmRuntime === void 0) {
@@ -65069,7 +65165,6 @@ function pickFromPool(decided, params, parsedArgv, readOnly) {
65069
65165
  }
65070
65166
  return {
65071
65167
  identityDecision: { ...decided, name: resolution.identity },
65072
- poolExplanation: resolution.explanation,
65073
65168
  poolPick: { name: decided.pool, reasons: resolution.reasons, ...resolution.movedOff === void 0 ? {} : { movedOff: resolution.movedOff } }
65074
65169
  };
65075
65170
  }
@@ -65097,7 +65192,7 @@ function decideLaunch(params, readOnly) {
65097
65192
  return trimmed === "" ? void 0 : trimmed;
65098
65193
  }
65099
65194
  });
65100
- const { identityDecision, poolExplanation, poolPick } = pickFromPool(decidedIdentity, params, parsedArgv, readOnly);
65195
+ const { identityDecision, poolPick } = pickFromPool(decidedIdentity, params, parsedArgv, readOnly);
65101
65196
  const farmIdentity = configDirEscapeHatchApplies ? void 0 : identityDecision.name;
65102
65197
  const farm = farmIdentity === void 0 ? void 0 : params.farm;
65103
65198
  if (!readOnly && farm !== void 0 && farmIdentity !== void 0) {
@@ -65237,15 +65332,16 @@ function decideLaunch(params, readOnly) {
65237
65332
  }
65238
65333
  });
65239
65334
  const loginlessProvider = requestedFlags.remoteControl && selectedProvider !== void 0 && farmIdentity !== void 0 && params.hasStoredLogin?.(farmIdentity) === false ? { identity: farmIdentity, provider: selectedProvider.name } : void 0;
65240
- if (loginlessProvider !== void 0 && !readOnly) {
65241
- log.info(`agent-shim: identity ${loginlessProvider.identity} has no stored login, so Remote Control, which needs one, is off for this launch; provider ${loginlessProvider.provider} runs without it`);
65335
+ const notes = [];
65336
+ if (loginlessProvider !== void 0) {
65337
+ notes.push(`${loginlessProvider.identity} has no stored login, so Remote Control is off; provider ${loginlessProvider.provider} runs without it`);
65242
65338
  }
65243
65339
  const flags = loginlessProvider === void 0 ? requestedFlags : { ...requestedFlags, remoteControl: false };
65244
65340
  const catalogue = selectedProvider === void 0 ? void 0 : parseCatalogueCache(params.fs.readFileUtf8(catalogueCachePath(paths, selectedProvider.name)));
65245
65341
  const pickerSettings = selectedProvider === void 0 ? void 0 : modelPickerSettings(selectedProvider.definition, catalogue?.models);
65246
65342
  const callerSettings = hasSettingsArgument(parsedArgv.rest);
65247
- if (pickerSettings !== void 0 && callerSettings && !readOnly) {
65248
- log.info("agent-shim: this launch passes its own --settings, so /model keeps Claude Code's own model names instead of listing the provider's models");
65343
+ if (pickerSettings !== void 0 && callerSettings) {
65344
+ notes.push("--settings was passed, so /model keeps Claude Code's own model names");
65249
65345
  }
65250
65346
  const launcherSettings = mergeSettings([params.supervised?.settings, callerSettings ? void 0 : pickerSettings]);
65251
65347
  const args = buildArgv({
@@ -65267,8 +65363,8 @@ function decideLaunch(params, readOnly) {
65267
65363
  return {
65268
65364
  parsedArgv,
65269
65365
  identityDecision,
65270
- poolExplanation,
65271
65366
  poolPick,
65367
+ notes,
65272
65368
  configDirEscapeHatch: configDirEscapeHatchApplies,
65273
65369
  farmIdentity,
65274
65370
  farmContext,
@@ -65288,10 +65384,18 @@ function prepareLaunch(params) {
65288
65384
  const { paths, proc, log } = params;
65289
65385
  const { env } = proc;
65290
65386
  const decided = decideLaunch(params, false);
65291
- const { identityDecision, configProfileDecision, resolvedProvider, identityCredential, poolExplanation, flags: resolvedFlags, args: finalArgv, configDirEscapeHatch: configDirEscapeHatchApplies, decision } = decided;
65292
- log.info(
65293
- `agent-shim: identity ${identityDecision.name ?? "(none)"} (${identityDecision.source}${poolExplanation === void 0 ? "" : `, ${poolExplanation}`}), config profile ${configProfileDecision.name ?? "(none)"} (${configProfileDecision.source})` + (resolvedProvider === void 0 ? "" : `, provider ${resolvedProvider.name} (credential ${resolvedProvider.credential.target} from ${describeSource(resolvedProvider.credential.source)})`) + (identityCredential === void 0 ? "" : `, identity credential ${identityCredential.target} from ${describeSource(identityCredential.source)}`)
65294
- );
65387
+ const { identityDecision, configProfileDecision, resolvedProvider, identityCredential, poolPick, notes, flags: resolvedFlags, args: finalArgv, configDirEscapeHatch: configDirEscapeHatchApplies, decision } = decided;
65388
+ const rows = [
65389
+ ...decisionRows({
65390
+ identity: identityDecision.name,
65391
+ identitySource: identityDecision.source,
65392
+ pool: poolPick,
65393
+ profile: configProfileDecision.name === void 0 ? void 0 : { name: configProfileDecision.name, source: configProfileDecision.source },
65394
+ provider: resolvedProvider === void 0 ? void 0 : { name: resolvedProvider.name, credential: `${resolvedProvider.credential.target} from ${describeSource(resolvedProvider.credential.source)}` },
65395
+ identityCredential: identityCredential === void 0 ? void 0 : `${identityCredential.target} from ${describeSource(identityCredential.source)}`
65396
+ })
65397
+ ];
65398
+ let warnings = [];
65295
65399
  const updateCheck = runLaunchUpdateCheck({
65296
65400
  mode: params.updateMode ?? "off",
65297
65401
  checkPath: import_node_path43.default.join(paths.root, "update.check"),
@@ -65326,15 +65430,13 @@ function prepareLaunch(params) {
65326
65430
  }
65327
65431
  throw error63;
65328
65432
  }
65329
- reportDiagnostics(log, result.diagnostics, { errorsAsWarnings: false });
65433
+ warnings = diagnosticLines(result.diagnostics);
65330
65434
  if (!result.noOp) {
65331
- log.info(
65332
- `agent-shim: farm at ${result.farmRoot} resynced (${String(result.manifest.links.length)} link(s), ${String(result.manifest.materialised.length)} built director(ies)${result.adopted.length === 0 ? "" : `, ${String(result.adopted.length)} adopted into ${resyncFarmRuntime.claudeHome}`})`
65333
- );
65435
+ rows.push(farmRow(result.manifest.links.length, result.manifest.materialised.length, result.adopted.length));
65334
65436
  }
65335
65437
  }
65336
65438
  if (decided.pinnedVersion !== void 0) {
65337
- log.info(`agent-shim: Claude Code ${decided.pinnedVersion.version} (pinned by ${decided.pinnedVersion.source})`);
65439
+ rows.push(pinnedVersionRow(decided.pinnedVersion.version, decided.pinnedVersion.source));
65338
65440
  }
65339
65441
  const frontDoorPort = params.frontdoor;
65340
65442
  const frontDoorEngaged = resolvedProvider !== void 0 || resolvedFlags.headroom || resolvedFlags.trackUsage;
@@ -65350,14 +65452,11 @@ function prepareLaunch(params) {
65350
65452
  const headroomPort = params.headroom;
65351
65453
  if (resolvedFlags.headroom && headroomPort !== void 0) {
65352
65454
  headroom = headroomPort.ensure({ routesProvider: resolvedProvider !== void 0 });
65353
- const via = resolvedProvider === void 0 ? `OAuth via the door's CONNECT surface on 127.0.0.1:${String(frontDoor?.connectPort ?? 0)}` : `provider ${resolvedProvider.name}`;
65354
- log.info(`agent-shim: routing through the front door on 127.0.0.1:${String(frontDoor?.port ?? 0)} with headroom on unix socket ${headroom.socketPath} (${via}, project ${headroom.projectId})`);
65355
65455
  } else if (resolvedFlags.headroom) {
65356
65456
  log.error("agent-shim: headroom routing was requested but this launcher has no headroom port wired; refusing to launch without it.");
65357
65457
  proc.exit(1);
65358
- } else if (frontDoor !== void 0) {
65359
- log.info(`agent-shim: routing through the front door on 127.0.0.1:${String(frontDoor.port)}${resolvedProvider === void 0 ? ` (OAuth via the door's CONNECT surface on 127.0.0.1:${String(frontDoor.connectPort)}, usage recorded)` : ` (provider ${resolvedProvider.name})`}`);
65360
65458
  }
65459
+ rows.push(...routingRows({ frontDoor, headroom, provider: resolvedProvider !== void 0 }));
65361
65460
  const frontDoorRelease = frontDoor === void 0 ? void 0 : frontDoorPort?.release;
65362
65461
  const sessionId = params.supervised?.sessionId ?? (0, import_node_crypto18.randomUUID)();
65363
65462
  const finalEnv = buildEnv({
@@ -65378,6 +65477,9 @@ function prepareLaunch(params) {
65378
65477
  registered();
65379
65478
  }
65380
65479
  };
65480
+ rows.push(...notes.map(noteRow));
65481
+ log.report(rows);
65482
+ printDiagnosticLines(log, warnings, { errorsAsWarnings: false });
65381
65483
  const hold = () => holdBeforeLaunch({ delayMs: resolvedFlags.delayMs, pause: resolvedFlags.pause }, params.hold, log);
65382
65484
  return { bin: decided.bin, args: finalArgv, env: finalEnv, sessionId, release, markChildStarted: updateCheck.markChildStarted, hold, decision };
65383
65485
  }
@@ -65446,6 +65548,7 @@ var init_launcher = __esm({
65446
65548
  init_claudeSession();
65447
65549
  init_diagnostics();
65448
65550
  init_hold();
65551
+ init_launchReport();
65449
65552
  init_modelPicker();
65450
65553
  init_providerCatalogue();
65451
65554
  init_pool();
@@ -65537,6 +65640,7 @@ function resolveClaudeLaunch(options) {
65537
65640
  const warnings = [];
65538
65641
  const log = {
65539
65642
  info: () => void 0,
65643
+ report: () => void 0,
65540
65644
  warn: (message) => {
65541
65645
  warnings.push(message);
65542
65646
  },
@@ -65607,6 +65711,7 @@ async function withIdentityClaude(params, identity, flags, use2) {
65607
65711
  },
65608
65712
  log: {
65609
65713
  info: () => void 0,
65714
+ report: () => void 0,
65610
65715
  warn: () => void 0,
65611
65716
  error: (message) => {
65612
65717
  refusals.push(message);
package/dist/index.cjs CHANGED
@@ -1496,11 +1496,15 @@ var init_flatten = __esm({
1496
1496
  });
1497
1497
 
1498
1498
  // src/resolve/decide.ts
1499
- function unclassifiedEntryMessage(names) {
1499
+ function unclassifiedEntrySummary(names) {
1500
1500
  const quoted = names.map((name) => `"${name}"`).join(", ");
1501
- const subject = names.length === 1 ? `${quoted} is not` : `${String(names.length)} entries are not`;
1502
- const excluded = names.length === 1 ? "it is excluded" : `they are excluded: ${quoted}`;
1503
- return `${subject} in the category map, so ${excluded}. Run \`agent-shim configure\` to classify ${names.length === 1 ? "it" : "them"}, which records the answer in the local overlay without touching the shipped default map.`;
1501
+ return names.length === 1 ? `${quoted} is not in the category map, so it is excluded` : `${String(names.length)} entries are not in the category map, so they are excluded: ${quoted}`;
1502
+ }
1503
+ function unclassifiedEntryFix(names) {
1504
+ return `Run \`agent-shim configure\` to classify ${names.length === 1 ? "it" : "them"}`;
1505
+ }
1506
+ function unclassifiedEntryMessage(names) {
1507
+ return `${unclassifiedEntrySummary(names)}. ${unclassifiedEntryFix(names)}.`;
1504
1508
  }
1505
1509
  function selectRule(relPath, flattened, context) {
1506
1510
  const eliminated = [];
@@ -2974,7 +2978,7 @@ var init_package = __esm({
2974
2978
  "package.json"() {
2975
2979
  package_default = {
2976
2980
  name: "claude-use",
2977
- version: "11.28.0",
2981
+ version: "11.29.0",
2978
2982
  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.",
2979
2983
  license: "MIT",
2980
2984
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -4140,20 +4144,53 @@ var init_supervisor = __esm({
4140
4144
  }
4141
4145
  });
4142
4146
 
4143
- // src/logStyle.ts
4144
- function styledDiagnostic(style, colour, line) {
4145
- const lead = DIAGNOSTIC_LEAD.exec(line);
4146
- if (lead === null) {
4147
- return style([colour], line);
4147
+ // src/launcher/report.ts
4148
+ function renderReport(rows, style) {
4149
+ if (rows.length === 0) {
4150
+ return [];
4151
+ }
4152
+ const labelWidth = Math.max(...rows.map((row) => row.label.length));
4153
+ const indent = " ".repeat(COLUMN_GAP.length);
4154
+ const lines = [style(["bold"], REPORT_HEADING)];
4155
+ for (const row of rows) {
4156
+ const detail = row.detail === void 0 ? "" : ` ${style(["dim"], `(${row.detail})`)}`;
4157
+ lines.push(`${indent}${style(["dim"], row.label.padEnd(labelWidth))}${COLUMN_GAP}${row.value}${detail}`);
4158
+ for (const note of row.notes ?? []) {
4159
+ lines.push(`${indent}${" ".repeat(labelWidth)}${COLUMN_GAP}${style(["dim"], note)}`);
4160
+ }
4161
+ }
4162
+ return lines;
4163
+ }
4164
+ var REPORT_HEADING, COLUMN_GAP;
4165
+ var init_report = __esm({
4166
+ "src/launcher/report.ts"() {
4167
+ "use strict";
4168
+ REPORT_HEADING = "agent-shim";
4169
+ COLUMN_GAP = " ";
4148
4170
  }
4149
- const [whole, prefix = "", code = "", separator = ""] = lead;
4150
- return `${style([colour], prefix)}${style([colour, "bold"], code)}${style([colour], `${separator}${line.slice(whole.length)}`)}`;
4171
+ });
4172
+
4173
+ // src/logStyle.ts
4174
+ function styledDiagnostic(style, colour, text) {
4175
+ return text.split("\n").map((line, index) => {
4176
+ const lead = index === 0 ? DIAGNOSTIC_LEAD.exec(line) : null;
4177
+ if (lead === null) {
4178
+ return style([colour], line);
4179
+ }
4180
+ const [whole, prefix = "", code = "", separator = ""] = lead;
4181
+ return `${style([colour], prefix)}${style([colour, "bold"], code)}${style([colour], `${separator}${line.slice(whole.length)}`)}`;
4182
+ }).join("\n");
4151
4183
  }
4152
4184
  function createLogPort(sinks, styleFor) {
4153
4185
  return {
4154
4186
  info: (message) => {
4155
4187
  sinks.out(styleFor.out(["dim"], message));
4156
4188
  },
4189
+ report: (rows) => {
4190
+ for (const line of renderReport(rows, styleFor.out)) {
4191
+ sinks.out(line);
4192
+ }
4193
+ },
4157
4194
  warn: (message) => {
4158
4195
  sinks.warn(styledDiagnostic(styleFor.err, "yellow", message));
4159
4196
  },
@@ -4170,6 +4207,7 @@ var init_logStyle = __esm({
4170
4207
  "src/logStyle.ts"() {
4171
4208
  "use strict";
4172
4209
  import_node_util = require("node:util");
4210
+ init_report();
4173
4211
  DIAGNOSTIC_LEAD = /^(agent-shim: )([A-Z][A-Z0-9_]*)(: )/;
4174
4212
  }
4175
4213
  });
@@ -8014,7 +8052,9 @@ function diagnosticLines(diagnostics) {
8014
8052
  if (diagnostic.code === "UNCLASSIFIED_ENTRY") {
8015
8053
  if (!unclassifiedReported) {
8016
8054
  unclassifiedReported = true;
8017
- lines.push({ severity: diagnostic.severity, text: `agent-shim: ${diagnostic.code}: ${unclassifiedEntryMessage(unclassified.filter((name) => name !== void 0))}` });
8055
+ const names = unclassified.filter((name) => name !== void 0);
8056
+ lines.push({ severity: diagnostic.severity, text: `agent-shim: ${diagnostic.code}: ${unclassifiedEntrySummary(names)}
8057
+ ${unclassifiedEntryFix(names)}.` });
8018
8058
  }
8019
8059
  continue;
8020
8060
  }
@@ -8022,8 +8062,8 @@ function diagnosticLines(diagnostics) {
8022
8062
  }
8023
8063
  return lines;
8024
8064
  }
8025
- function reportDiagnostics(log, diagnostics, options) {
8026
- for (const line of diagnosticLines(diagnostics)) {
8065
+ function printDiagnosticLines(log, lines, options) {
8066
+ for (const line of lines) {
8027
8067
  if (line.severity === "error" && !options.errorsAsWarnings) {
8028
8068
  log.error(line.text);
8029
8069
  } else {
@@ -8031,6 +8071,9 @@ function reportDiagnostics(log, diagnostics, options) {
8031
8071
  }
8032
8072
  }
8033
8073
  }
8074
+ function reportDiagnostics(log, diagnostics, options) {
8075
+ printDiagnosticLines(log, diagnosticLines(diagnostics), options);
8076
+ }
8034
8077
  var init_diagnostics = __esm({
8035
8078
  "src/launcher/diagnostics.ts"() {
8036
8079
  "use strict";
@@ -8063,6 +8106,59 @@ var init_hold = __esm({
8063
8106
  }
8064
8107
  });
8065
8108
 
8109
+ // src/launcher/launchReport.ts
8110
+ function poolDetail(pool) {
8111
+ const [reason] = pool.reasons;
8112
+ if (pool.movedOff !== void 0) {
8113
+ return { detail: `moved off ${pool.movedOff.identity}: ${pool.movedOff.reason}`, ...reason === void 0 ? {} : { notes: [reason] } };
8114
+ }
8115
+ return reason === void 0 ? {} : { detail: reason };
8116
+ }
8117
+ function decisionRows(facts) {
8118
+ return [
8119
+ { label: "identity", value: facts.identity ?? "(none)", detail: facts.identitySource },
8120
+ ...facts.pool === void 0 ? [] : [
8121
+ {
8122
+ label: "pool",
8123
+ value: facts.pool.name,
8124
+ ...poolDetail(facts.pool)
8125
+ }
8126
+ ],
8127
+ ...facts.profile === void 0 ? [] : [{ label: "profile", value: facts.profile.name, detail: facts.profile.source }],
8128
+ ...facts.provider === void 0 ? [] : [{ label: "provider", value: facts.provider.name, detail: `credential ${facts.provider.credential}` }],
8129
+ ...facts.identityCredential === void 0 ? [] : [{ label: "credential", value: facts.identityCredential, detail: "the identity's own" }]
8130
+ ];
8131
+ }
8132
+ function pinnedVersionRow(version, source) {
8133
+ return { label: "claude", value: version, detail: `pinned by ${source}` };
8134
+ }
8135
+ function routingRows(facts) {
8136
+ if (facts.frontDoor === void 0) {
8137
+ return [];
8138
+ }
8139
+ return [
8140
+ {
8141
+ label: "routing",
8142
+ value: `front door 127.0.0.1:${String(facts.frontDoor.port)}`,
8143
+ ...facts.provider ? {} : { detail: `OAuth via CONNECT 127.0.0.1:${String(facts.frontDoor.connectPort)}` }
8144
+ },
8145
+ ...facts.headroom === void 0 ? [] : [{ label: "headroom", value: "on", detail: `project ${facts.headroom.projectId}` }]
8146
+ ];
8147
+ }
8148
+ function farmRow(links, builtDirectories, adopted) {
8149
+ const counted = (count, singular, plural) => `${String(count)} ${count === 1 ? singular : plural}`;
8150
+ const parts = [counted(links, "link", "links"), counted(builtDirectories, "built directory", "built directories"), ...adopted === 0 ? [] : [`${String(adopted)} adopted`]];
8151
+ return { label: "farm", value: "resynced", detail: parts.join(", ") };
8152
+ }
8153
+ function noteRow(text) {
8154
+ return { label: "note", value: text };
8155
+ }
8156
+ var init_launchReport = __esm({
8157
+ "src/launcher/launchReport.ts"() {
8158
+ "use strict";
8159
+ }
8160
+ });
8161
+
8066
8162
  // src/antigravity/cloudUpstream.ts
8067
8163
  var init_cloudUpstream = __esm({
8068
8164
  "src/antigravity/cloudUpstream.ts"() {
@@ -8588,7 +8684,7 @@ function pickFromPool(decided, params, parsedArgv, readOnly) {
8588
8684
  }
8589
8685
  if (params.supervised?.member !== void 0) {
8590
8686
  const reasons = ["resumed here by the supervising launcher after the previous member ran out of quota"];
8591
- return { identityDecision: { ...decided, name: params.supervised.member }, poolExplanation: `pool ${decided.pool}: ${reasons.join("; ")}`, poolPick: { name: decided.pool, reasons } };
8687
+ return { identityDecision: { ...decided, name: params.supervised.member }, poolPick: { name: decided.pool, reasons } };
8592
8688
  }
8593
8689
  const farmRuntime = params.farm;
8594
8690
  if (farmRuntime === void 0) {
@@ -8619,7 +8715,6 @@ function pickFromPool(decided, params, parsedArgv, readOnly) {
8619
8715
  }
8620
8716
  return {
8621
8717
  identityDecision: { ...decided, name: resolution.identity },
8622
- poolExplanation: resolution.explanation,
8623
8718
  poolPick: { name: decided.pool, reasons: resolution.reasons, ...resolution.movedOff === void 0 ? {} : { movedOff: resolution.movedOff } }
8624
8719
  };
8625
8720
  }
@@ -8647,7 +8742,7 @@ function decideLaunch(params, readOnly) {
8647
8742
  return trimmed === "" ? void 0 : trimmed;
8648
8743
  }
8649
8744
  });
8650
- const { identityDecision, poolExplanation, poolPick } = pickFromPool(decidedIdentity, params, parsedArgv, readOnly);
8745
+ const { identityDecision, poolPick } = pickFromPool(decidedIdentity, params, parsedArgv, readOnly);
8651
8746
  const farmIdentity = configDirEscapeHatchApplies ? void 0 : identityDecision.name;
8652
8747
  const farm = farmIdentity === void 0 ? void 0 : params.farm;
8653
8748
  if (!readOnly && farm !== void 0 && farmIdentity !== void 0) {
@@ -8787,15 +8882,16 @@ function decideLaunch(params, readOnly) {
8787
8882
  }
8788
8883
  });
8789
8884
  const loginlessProvider = requestedFlags.remoteControl && selectedProvider !== void 0 && farmIdentity !== void 0 && params.hasStoredLogin?.(farmIdentity) === false ? { identity: farmIdentity, provider: selectedProvider.name } : void 0;
8790
- if (loginlessProvider !== void 0 && !readOnly) {
8791
- log.info(`agent-shim: identity ${loginlessProvider.identity} has no stored login, so Remote Control, which needs one, is off for this launch; provider ${loginlessProvider.provider} runs without it`);
8885
+ const notes = [];
8886
+ if (loginlessProvider !== void 0) {
8887
+ notes.push(`${loginlessProvider.identity} has no stored login, so Remote Control is off; provider ${loginlessProvider.provider} runs without it`);
8792
8888
  }
8793
8889
  const flags = loginlessProvider === void 0 ? requestedFlags : { ...requestedFlags, remoteControl: false };
8794
8890
  const catalogue = selectedProvider === void 0 ? void 0 : parseCatalogueCache(params.fs.readFileUtf8(catalogueCachePath(paths, selectedProvider.name)));
8795
8891
  const pickerSettings = selectedProvider === void 0 ? void 0 : modelPickerSettings(selectedProvider.definition, catalogue?.models);
8796
8892
  const callerSettings = hasSettingsArgument(parsedArgv.rest);
8797
- if (pickerSettings !== void 0 && callerSettings && !readOnly) {
8798
- log.info("agent-shim: this launch passes its own --settings, so /model keeps Claude Code's own model names instead of listing the provider's models");
8893
+ if (pickerSettings !== void 0 && callerSettings) {
8894
+ notes.push("--settings was passed, so /model keeps Claude Code's own model names");
8799
8895
  }
8800
8896
  const launcherSettings = mergeSettings([params.supervised?.settings, callerSettings ? void 0 : pickerSettings]);
8801
8897
  const args = buildArgv({
@@ -8817,8 +8913,8 @@ function decideLaunch(params, readOnly) {
8817
8913
  return {
8818
8914
  parsedArgv,
8819
8915
  identityDecision,
8820
- poolExplanation,
8821
8916
  poolPick,
8917
+ notes,
8822
8918
  configDirEscapeHatch: configDirEscapeHatchApplies,
8823
8919
  farmIdentity,
8824
8920
  farmContext,
@@ -8838,10 +8934,18 @@ function prepareLaunch(params) {
8838
8934
  const { paths, proc, log } = params;
8839
8935
  const { env } = proc;
8840
8936
  const decided = decideLaunch(params, false);
8841
- const { identityDecision, configProfileDecision, resolvedProvider, identityCredential, poolExplanation, flags: resolvedFlags, args: finalArgv, configDirEscapeHatch: configDirEscapeHatchApplies, decision } = decided;
8842
- log.info(
8843
- `agent-shim: identity ${identityDecision.name ?? "(none)"} (${identityDecision.source}${poolExplanation === void 0 ? "" : `, ${poolExplanation}`}), config profile ${configProfileDecision.name ?? "(none)"} (${configProfileDecision.source})` + (resolvedProvider === void 0 ? "" : `, provider ${resolvedProvider.name} (credential ${resolvedProvider.credential.target} from ${describeSource(resolvedProvider.credential.source)})`) + (identityCredential === void 0 ? "" : `, identity credential ${identityCredential.target} from ${describeSource(identityCredential.source)}`)
8844
- );
8937
+ const { identityDecision, configProfileDecision, resolvedProvider, identityCredential, poolPick, notes, flags: resolvedFlags, args: finalArgv, configDirEscapeHatch: configDirEscapeHatchApplies, decision } = decided;
8938
+ const rows = [
8939
+ ...decisionRows({
8940
+ identity: identityDecision.name,
8941
+ identitySource: identityDecision.source,
8942
+ pool: poolPick,
8943
+ profile: configProfileDecision.name === void 0 ? void 0 : { name: configProfileDecision.name, source: configProfileDecision.source },
8944
+ provider: resolvedProvider === void 0 ? void 0 : { name: resolvedProvider.name, credential: `${resolvedProvider.credential.target} from ${describeSource(resolvedProvider.credential.source)}` },
8945
+ identityCredential: identityCredential === void 0 ? void 0 : `${identityCredential.target} from ${describeSource(identityCredential.source)}`
8946
+ })
8947
+ ];
8948
+ let warnings = [];
8845
8949
  const updateCheck = runLaunchUpdateCheck({
8846
8950
  mode: params.updateMode ?? "off",
8847
8951
  checkPath: import_node_path39.default.join(paths.root, "update.check"),
@@ -8876,15 +8980,13 @@ function prepareLaunch(params) {
8876
8980
  }
8877
8981
  throw error;
8878
8982
  }
8879
- reportDiagnostics(log, result.diagnostics, { errorsAsWarnings: false });
8983
+ warnings = diagnosticLines(result.diagnostics);
8880
8984
  if (!result.noOp) {
8881
- log.info(
8882
- `agent-shim: farm at ${result.farmRoot} resynced (${String(result.manifest.links.length)} link(s), ${String(result.manifest.materialised.length)} built director(ies)${result.adopted.length === 0 ? "" : `, ${String(result.adopted.length)} adopted into ${resyncFarmRuntime.claudeHome}`})`
8883
- );
8985
+ rows.push(farmRow(result.manifest.links.length, result.manifest.materialised.length, result.adopted.length));
8884
8986
  }
8885
8987
  }
8886
8988
  if (decided.pinnedVersion !== void 0) {
8887
- log.info(`agent-shim: Claude Code ${decided.pinnedVersion.version} (pinned by ${decided.pinnedVersion.source})`);
8989
+ rows.push(pinnedVersionRow(decided.pinnedVersion.version, decided.pinnedVersion.source));
8888
8990
  }
8889
8991
  const frontDoorPort = params.frontdoor;
8890
8992
  const frontDoorEngaged = resolvedProvider !== void 0 || resolvedFlags.headroom || resolvedFlags.trackUsage;
@@ -8900,14 +9002,11 @@ function prepareLaunch(params) {
8900
9002
  const headroomPort = params.headroom;
8901
9003
  if (resolvedFlags.headroom && headroomPort !== void 0) {
8902
9004
  headroom = headroomPort.ensure({ routesProvider: resolvedProvider !== void 0 });
8903
- const via = resolvedProvider === void 0 ? `OAuth via the door's CONNECT surface on 127.0.0.1:${String(frontDoor?.connectPort ?? 0)}` : `provider ${resolvedProvider.name}`;
8904
- log.info(`agent-shim: routing through the front door on 127.0.0.1:${String(frontDoor?.port ?? 0)} with headroom on unix socket ${headroom.socketPath} (${via}, project ${headroom.projectId})`);
8905
9005
  } else if (resolvedFlags.headroom) {
8906
9006
  log.error("agent-shim: headroom routing was requested but this launcher has no headroom port wired; refusing to launch without it.");
8907
9007
  proc.exit(1);
8908
- } else if (frontDoor !== void 0) {
8909
- log.info(`agent-shim: routing through the front door on 127.0.0.1:${String(frontDoor.port)}${resolvedProvider === void 0 ? ` (OAuth via the door's CONNECT surface on 127.0.0.1:${String(frontDoor.connectPort)}, usage recorded)` : ` (provider ${resolvedProvider.name})`}`);
8910
9008
  }
9009
+ rows.push(...routingRows({ frontDoor, headroom, provider: resolvedProvider !== void 0 }));
8911
9010
  const frontDoorRelease = frontDoor === void 0 ? void 0 : frontDoorPort?.release;
8912
9011
  const sessionId = params.supervised?.sessionId ?? (0, import_node_crypto11.randomUUID)();
8913
9012
  const finalEnv = buildEnv({
@@ -8928,6 +9027,9 @@ function prepareLaunch(params) {
8928
9027
  registered();
8929
9028
  }
8930
9029
  };
9030
+ rows.push(...notes.map(noteRow));
9031
+ log.report(rows);
9032
+ printDiagnosticLines(log, warnings, { errorsAsWarnings: false });
8931
9033
  const hold = () => holdBeforeLaunch({ delayMs: resolvedFlags.delayMs, pause: resolvedFlags.pause }, params.hold, log);
8932
9034
  return { bin: decided.bin, args: finalArgv, env: finalEnv, sessionId, release, markChildStarted: updateCheck.markChildStarted, hold, decision };
8933
9035
  }
@@ -8996,6 +9098,7 @@ var init_launcher = __esm({
8996
9098
  init_claudeSession();
8997
9099
  init_diagnostics();
8998
9100
  init_hold();
9101
+ init_launchReport();
8999
9102
  init_modelPicker();
9000
9103
  init_providerCatalogue();
9001
9104
  init_pool();
@@ -9219,6 +9322,7 @@ function prepareClaudeLaunch(options) {
9219
9322
  const refusals = [];
9220
9323
  const log = {
9221
9324
  info: () => void 0,
9325
+ report: () => void 0,
9222
9326
  warn: () => void 0,
9223
9327
  error: (message) => {
9224
9328
  refusals.push(message);
@@ -9240,6 +9344,7 @@ function resolveClaudeLaunch(options) {
9240
9344
  const warnings = [];
9241
9345
  const log = {
9242
9346
  info: () => void 0,
9347
+ report: () => void 0,
9243
9348
  warn: (message) => {
9244
9349
  warnings.push(message);
9245
9350
  },
@@ -9448,6 +9553,7 @@ async function withIdentityClaude(params, identity, flags, use) {
9448
9553
  },
9449
9554
  log: {
9450
9555
  info: () => void 0,
9556
+ report: () => void 0,
9451
9557
  warn: () => void 0,
9452
9558
  error: (message) => {
9453
9559
  refusals.push(message);
package/dist/index.mjs CHANGED
@@ -1474,11 +1474,15 @@ var init_flatten = __esm({
1474
1474
  });
1475
1475
 
1476
1476
  // src/resolve/decide.ts
1477
- function unclassifiedEntryMessage(names) {
1477
+ function unclassifiedEntrySummary(names) {
1478
1478
  const quoted = names.map((name) => `"${name}"`).join(", ");
1479
- const subject = names.length === 1 ? `${quoted} is not` : `${String(names.length)} entries are not`;
1480
- const excluded = names.length === 1 ? "it is excluded" : `they are excluded: ${quoted}`;
1481
- return `${subject} in the category map, so ${excluded}. Run \`agent-shim configure\` to classify ${names.length === 1 ? "it" : "them"}, which records the answer in the local overlay without touching the shipped default map.`;
1479
+ return names.length === 1 ? `${quoted} is not in the category map, so it is excluded` : `${String(names.length)} entries are not in the category map, so they are excluded: ${quoted}`;
1480
+ }
1481
+ function unclassifiedEntryFix(names) {
1482
+ return `Run \`agent-shim configure\` to classify ${names.length === 1 ? "it" : "them"}`;
1483
+ }
1484
+ function unclassifiedEntryMessage(names) {
1485
+ return `${unclassifiedEntrySummary(names)}. ${unclassifiedEntryFix(names)}.`;
1482
1486
  }
1483
1487
  function selectRule(relPath, flattened, context) {
1484
1488
  const eliminated = [];
@@ -2950,7 +2954,7 @@ var init_package = __esm({
2950
2954
  "package.json"() {
2951
2955
  package_default = {
2952
2956
  name: "claude-use",
2953
- version: "11.28.0",
2957
+ version: "11.29.0",
2954
2958
  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.",
2955
2959
  license: "MIT",
2956
2960
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -4115,21 +4119,54 @@ var init_supervisor = __esm({
4115
4119
  }
4116
4120
  });
4117
4121
 
4122
+ // src/launcher/report.ts
4123
+ function renderReport(rows, style) {
4124
+ if (rows.length === 0) {
4125
+ return [];
4126
+ }
4127
+ const labelWidth = Math.max(...rows.map((row) => row.label.length));
4128
+ const indent = " ".repeat(COLUMN_GAP.length);
4129
+ const lines = [style(["bold"], REPORT_HEADING)];
4130
+ for (const row of rows) {
4131
+ const detail = row.detail === void 0 ? "" : ` ${style(["dim"], `(${row.detail})`)}`;
4132
+ lines.push(`${indent}${style(["dim"], row.label.padEnd(labelWidth))}${COLUMN_GAP}${row.value}${detail}`);
4133
+ for (const note of row.notes ?? []) {
4134
+ lines.push(`${indent}${" ".repeat(labelWidth)}${COLUMN_GAP}${style(["dim"], note)}`);
4135
+ }
4136
+ }
4137
+ return lines;
4138
+ }
4139
+ var REPORT_HEADING, COLUMN_GAP;
4140
+ var init_report = __esm({
4141
+ "src/launcher/report.ts"() {
4142
+ "use strict";
4143
+ REPORT_HEADING = "agent-shim";
4144
+ COLUMN_GAP = " ";
4145
+ }
4146
+ });
4147
+
4118
4148
  // src/logStyle.ts
4119
4149
  import { styleText } from "node:util";
4120
- function styledDiagnostic(style, colour, line) {
4121
- const lead = DIAGNOSTIC_LEAD.exec(line);
4122
- if (lead === null) {
4123
- return style([colour], line);
4124
- }
4125
- const [whole, prefix = "", code = "", separator = ""] = lead;
4126
- return `${style([colour], prefix)}${style([colour, "bold"], code)}${style([colour], `${separator}${line.slice(whole.length)}`)}`;
4150
+ function styledDiagnostic(style, colour, text) {
4151
+ return text.split("\n").map((line, index) => {
4152
+ const lead = index === 0 ? DIAGNOSTIC_LEAD.exec(line) : null;
4153
+ if (lead === null) {
4154
+ return style([colour], line);
4155
+ }
4156
+ const [whole, prefix = "", code = "", separator = ""] = lead;
4157
+ return `${style([colour], prefix)}${style([colour, "bold"], code)}${style([colour], `${separator}${line.slice(whole.length)}`)}`;
4158
+ }).join("\n");
4127
4159
  }
4128
4160
  function createLogPort(sinks, styleFor) {
4129
4161
  return {
4130
4162
  info: (message) => {
4131
4163
  sinks.out(styleFor.out(["dim"], message));
4132
4164
  },
4165
+ report: (rows) => {
4166
+ for (const line of renderReport(rows, styleFor.out)) {
4167
+ sinks.out(line);
4168
+ }
4169
+ },
4133
4170
  warn: (message) => {
4134
4171
  sinks.warn(styledDiagnostic(styleFor.err, "yellow", message));
4135
4172
  },
@@ -4145,6 +4182,7 @@ var DIAGNOSTIC_LEAD;
4145
4182
  var init_logStyle = __esm({
4146
4183
  "src/logStyle.ts"() {
4147
4184
  "use strict";
4185
+ init_report();
4148
4186
  DIAGNOSTIC_LEAD = /^(agent-shim: )([A-Z][A-Z0-9_]*)(: )/;
4149
4187
  }
4150
4188
  });
@@ -7986,7 +8024,9 @@ function diagnosticLines(diagnostics) {
7986
8024
  if (diagnostic.code === "UNCLASSIFIED_ENTRY") {
7987
8025
  if (!unclassifiedReported) {
7988
8026
  unclassifiedReported = true;
7989
- lines.push({ severity: diagnostic.severity, text: `agent-shim: ${diagnostic.code}: ${unclassifiedEntryMessage(unclassified.filter((name) => name !== void 0))}` });
8027
+ const names = unclassified.filter((name) => name !== void 0);
8028
+ lines.push({ severity: diagnostic.severity, text: `agent-shim: ${diagnostic.code}: ${unclassifiedEntrySummary(names)}
8029
+ ${unclassifiedEntryFix(names)}.` });
7990
8030
  }
7991
8031
  continue;
7992
8032
  }
@@ -7994,8 +8034,8 @@ function diagnosticLines(diagnostics) {
7994
8034
  }
7995
8035
  return lines;
7996
8036
  }
7997
- function reportDiagnostics(log, diagnostics, options) {
7998
- for (const line of diagnosticLines(diagnostics)) {
8037
+ function printDiagnosticLines(log, lines, options) {
8038
+ for (const line of lines) {
7999
8039
  if (line.severity === "error" && !options.errorsAsWarnings) {
8000
8040
  log.error(line.text);
8001
8041
  } else {
@@ -8003,6 +8043,9 @@ function reportDiagnostics(log, diagnostics, options) {
8003
8043
  }
8004
8044
  }
8005
8045
  }
8046
+ function reportDiagnostics(log, diagnostics, options) {
8047
+ printDiagnosticLines(log, diagnosticLines(diagnostics), options);
8048
+ }
8006
8049
  var init_diagnostics = __esm({
8007
8050
  "src/launcher/diagnostics.ts"() {
8008
8051
  "use strict";
@@ -8035,6 +8078,59 @@ var init_hold = __esm({
8035
8078
  }
8036
8079
  });
8037
8080
 
8081
+ // src/launcher/launchReport.ts
8082
+ function poolDetail(pool) {
8083
+ const [reason] = pool.reasons;
8084
+ if (pool.movedOff !== void 0) {
8085
+ return { detail: `moved off ${pool.movedOff.identity}: ${pool.movedOff.reason}`, ...reason === void 0 ? {} : { notes: [reason] } };
8086
+ }
8087
+ return reason === void 0 ? {} : { detail: reason };
8088
+ }
8089
+ function decisionRows(facts) {
8090
+ return [
8091
+ { label: "identity", value: facts.identity ?? "(none)", detail: facts.identitySource },
8092
+ ...facts.pool === void 0 ? [] : [
8093
+ {
8094
+ label: "pool",
8095
+ value: facts.pool.name,
8096
+ ...poolDetail(facts.pool)
8097
+ }
8098
+ ],
8099
+ ...facts.profile === void 0 ? [] : [{ label: "profile", value: facts.profile.name, detail: facts.profile.source }],
8100
+ ...facts.provider === void 0 ? [] : [{ label: "provider", value: facts.provider.name, detail: `credential ${facts.provider.credential}` }],
8101
+ ...facts.identityCredential === void 0 ? [] : [{ label: "credential", value: facts.identityCredential, detail: "the identity's own" }]
8102
+ ];
8103
+ }
8104
+ function pinnedVersionRow(version, source) {
8105
+ return { label: "claude", value: version, detail: `pinned by ${source}` };
8106
+ }
8107
+ function routingRows(facts) {
8108
+ if (facts.frontDoor === void 0) {
8109
+ return [];
8110
+ }
8111
+ return [
8112
+ {
8113
+ label: "routing",
8114
+ value: `front door 127.0.0.1:${String(facts.frontDoor.port)}`,
8115
+ ...facts.provider ? {} : { detail: `OAuth via CONNECT 127.0.0.1:${String(facts.frontDoor.connectPort)}` }
8116
+ },
8117
+ ...facts.headroom === void 0 ? [] : [{ label: "headroom", value: "on", detail: `project ${facts.headroom.projectId}` }]
8118
+ ];
8119
+ }
8120
+ function farmRow(links, builtDirectories, adopted) {
8121
+ const counted = (count, singular, plural) => `${String(count)} ${count === 1 ? singular : plural}`;
8122
+ const parts = [counted(links, "link", "links"), counted(builtDirectories, "built directory", "built directories"), ...adopted === 0 ? [] : [`${String(adopted)} adopted`]];
8123
+ return { label: "farm", value: "resynced", detail: parts.join(", ") };
8124
+ }
8125
+ function noteRow(text) {
8126
+ return { label: "note", value: text };
8127
+ }
8128
+ var init_launchReport = __esm({
8129
+ "src/launcher/launchReport.ts"() {
8130
+ "use strict";
8131
+ }
8132
+ });
8133
+
8038
8134
  // src/antigravity/cloudUpstream.ts
8039
8135
  var init_cloudUpstream = __esm({
8040
8136
  "src/antigravity/cloudUpstream.ts"() {
@@ -8562,7 +8658,7 @@ function pickFromPool(decided, params, parsedArgv, readOnly) {
8562
8658
  }
8563
8659
  if (params.supervised?.member !== void 0) {
8564
8660
  const reasons = ["resumed here by the supervising launcher after the previous member ran out of quota"];
8565
- return { identityDecision: { ...decided, name: params.supervised.member }, poolExplanation: `pool ${decided.pool}: ${reasons.join("; ")}`, poolPick: { name: decided.pool, reasons } };
8661
+ return { identityDecision: { ...decided, name: params.supervised.member }, poolPick: { name: decided.pool, reasons } };
8566
8662
  }
8567
8663
  const farmRuntime = params.farm;
8568
8664
  if (farmRuntime === void 0) {
@@ -8593,7 +8689,6 @@ function pickFromPool(decided, params, parsedArgv, readOnly) {
8593
8689
  }
8594
8690
  return {
8595
8691
  identityDecision: { ...decided, name: resolution.identity },
8596
- poolExplanation: resolution.explanation,
8597
8692
  poolPick: { name: decided.pool, reasons: resolution.reasons, ...resolution.movedOff === void 0 ? {} : { movedOff: resolution.movedOff } }
8598
8693
  };
8599
8694
  }
@@ -8621,7 +8716,7 @@ function decideLaunch(params, readOnly) {
8621
8716
  return trimmed === "" ? void 0 : trimmed;
8622
8717
  }
8623
8718
  });
8624
- const { identityDecision, poolExplanation, poolPick } = pickFromPool(decidedIdentity, params, parsedArgv, readOnly);
8719
+ const { identityDecision, poolPick } = pickFromPool(decidedIdentity, params, parsedArgv, readOnly);
8625
8720
  const farmIdentity = configDirEscapeHatchApplies ? void 0 : identityDecision.name;
8626
8721
  const farm = farmIdentity === void 0 ? void 0 : params.farm;
8627
8722
  if (!readOnly && farm !== void 0 && farmIdentity !== void 0) {
@@ -8761,15 +8856,16 @@ function decideLaunch(params, readOnly) {
8761
8856
  }
8762
8857
  });
8763
8858
  const loginlessProvider = requestedFlags.remoteControl && selectedProvider !== void 0 && farmIdentity !== void 0 && params.hasStoredLogin?.(farmIdentity) === false ? { identity: farmIdentity, provider: selectedProvider.name } : void 0;
8764
- if (loginlessProvider !== void 0 && !readOnly) {
8765
- log.info(`agent-shim: identity ${loginlessProvider.identity} has no stored login, so Remote Control, which needs one, is off for this launch; provider ${loginlessProvider.provider} runs without it`);
8859
+ const notes = [];
8860
+ if (loginlessProvider !== void 0) {
8861
+ notes.push(`${loginlessProvider.identity} has no stored login, so Remote Control is off; provider ${loginlessProvider.provider} runs without it`);
8766
8862
  }
8767
8863
  const flags = loginlessProvider === void 0 ? requestedFlags : { ...requestedFlags, remoteControl: false };
8768
8864
  const catalogue = selectedProvider === void 0 ? void 0 : parseCatalogueCache(params.fs.readFileUtf8(catalogueCachePath(paths, selectedProvider.name)));
8769
8865
  const pickerSettings = selectedProvider === void 0 ? void 0 : modelPickerSettings(selectedProvider.definition, catalogue?.models);
8770
8866
  const callerSettings = hasSettingsArgument(parsedArgv.rest);
8771
- if (pickerSettings !== void 0 && callerSettings && !readOnly) {
8772
- log.info("agent-shim: this launch passes its own --settings, so /model keeps Claude Code's own model names instead of listing the provider's models");
8867
+ if (pickerSettings !== void 0 && callerSettings) {
8868
+ notes.push("--settings was passed, so /model keeps Claude Code's own model names");
8773
8869
  }
8774
8870
  const launcherSettings = mergeSettings([params.supervised?.settings, callerSettings ? void 0 : pickerSettings]);
8775
8871
  const args = buildArgv({
@@ -8791,8 +8887,8 @@ function decideLaunch(params, readOnly) {
8791
8887
  return {
8792
8888
  parsedArgv,
8793
8889
  identityDecision,
8794
- poolExplanation,
8795
8890
  poolPick,
8891
+ notes,
8796
8892
  configDirEscapeHatch: configDirEscapeHatchApplies,
8797
8893
  farmIdentity,
8798
8894
  farmContext,
@@ -8812,10 +8908,18 @@ function prepareLaunch(params) {
8812
8908
  const { paths, proc, log } = params;
8813
8909
  const { env } = proc;
8814
8910
  const decided = decideLaunch(params, false);
8815
- const { identityDecision, configProfileDecision, resolvedProvider, identityCredential, poolExplanation, flags: resolvedFlags, args: finalArgv, configDirEscapeHatch: configDirEscapeHatchApplies, decision } = decided;
8816
- log.info(
8817
- `agent-shim: identity ${identityDecision.name ?? "(none)"} (${identityDecision.source}${poolExplanation === void 0 ? "" : `, ${poolExplanation}`}), config profile ${configProfileDecision.name ?? "(none)"} (${configProfileDecision.source})` + (resolvedProvider === void 0 ? "" : `, provider ${resolvedProvider.name} (credential ${resolvedProvider.credential.target} from ${describeSource(resolvedProvider.credential.source)})`) + (identityCredential === void 0 ? "" : `, identity credential ${identityCredential.target} from ${describeSource(identityCredential.source)}`)
8818
- );
8911
+ const { identityDecision, configProfileDecision, resolvedProvider, identityCredential, poolPick, notes, flags: resolvedFlags, args: finalArgv, configDirEscapeHatch: configDirEscapeHatchApplies, decision } = decided;
8912
+ const rows = [
8913
+ ...decisionRows({
8914
+ identity: identityDecision.name,
8915
+ identitySource: identityDecision.source,
8916
+ pool: poolPick,
8917
+ profile: configProfileDecision.name === void 0 ? void 0 : { name: configProfileDecision.name, source: configProfileDecision.source },
8918
+ provider: resolvedProvider === void 0 ? void 0 : { name: resolvedProvider.name, credential: `${resolvedProvider.credential.target} from ${describeSource(resolvedProvider.credential.source)}` },
8919
+ identityCredential: identityCredential === void 0 ? void 0 : `${identityCredential.target} from ${describeSource(identityCredential.source)}`
8920
+ })
8921
+ ];
8922
+ let warnings = [];
8819
8923
  const updateCheck = runLaunchUpdateCheck({
8820
8924
  mode: params.updateMode ?? "off",
8821
8925
  checkPath: path39.join(paths.root, "update.check"),
@@ -8850,15 +8954,13 @@ function prepareLaunch(params) {
8850
8954
  }
8851
8955
  throw error;
8852
8956
  }
8853
- reportDiagnostics(log, result.diagnostics, { errorsAsWarnings: false });
8957
+ warnings = diagnosticLines(result.diagnostics);
8854
8958
  if (!result.noOp) {
8855
- log.info(
8856
- `agent-shim: farm at ${result.farmRoot} resynced (${String(result.manifest.links.length)} link(s), ${String(result.manifest.materialised.length)} built director(ies)${result.adopted.length === 0 ? "" : `, ${String(result.adopted.length)} adopted into ${resyncFarmRuntime.claudeHome}`})`
8857
- );
8959
+ rows.push(farmRow(result.manifest.links.length, result.manifest.materialised.length, result.adopted.length));
8858
8960
  }
8859
8961
  }
8860
8962
  if (decided.pinnedVersion !== void 0) {
8861
- log.info(`agent-shim: Claude Code ${decided.pinnedVersion.version} (pinned by ${decided.pinnedVersion.source})`);
8963
+ rows.push(pinnedVersionRow(decided.pinnedVersion.version, decided.pinnedVersion.source));
8862
8964
  }
8863
8965
  const frontDoorPort = params.frontdoor;
8864
8966
  const frontDoorEngaged = resolvedProvider !== void 0 || resolvedFlags.headroom || resolvedFlags.trackUsage;
@@ -8874,14 +8976,11 @@ function prepareLaunch(params) {
8874
8976
  const headroomPort = params.headroom;
8875
8977
  if (resolvedFlags.headroom && headroomPort !== void 0) {
8876
8978
  headroom = headroomPort.ensure({ routesProvider: resolvedProvider !== void 0 });
8877
- const via = resolvedProvider === void 0 ? `OAuth via the door's CONNECT surface on 127.0.0.1:${String(frontDoor?.connectPort ?? 0)}` : `provider ${resolvedProvider.name}`;
8878
- log.info(`agent-shim: routing through the front door on 127.0.0.1:${String(frontDoor?.port ?? 0)} with headroom on unix socket ${headroom.socketPath} (${via}, project ${headroom.projectId})`);
8879
8979
  } else if (resolvedFlags.headroom) {
8880
8980
  log.error("agent-shim: headroom routing was requested but this launcher has no headroom port wired; refusing to launch without it.");
8881
8981
  proc.exit(1);
8882
- } else if (frontDoor !== void 0) {
8883
- log.info(`agent-shim: routing through the front door on 127.0.0.1:${String(frontDoor.port)}${resolvedProvider === void 0 ? ` (OAuth via the door's CONNECT surface on 127.0.0.1:${String(frontDoor.connectPort)}, usage recorded)` : ` (provider ${resolvedProvider.name})`}`);
8884
8982
  }
8983
+ rows.push(...routingRows({ frontDoor, headroom, provider: resolvedProvider !== void 0 }));
8885
8984
  const frontDoorRelease = frontDoor === void 0 ? void 0 : frontDoorPort?.release;
8886
8985
  const sessionId = params.supervised?.sessionId ?? randomUUID4();
8887
8986
  const finalEnv = buildEnv({
@@ -8902,6 +9001,9 @@ function prepareLaunch(params) {
8902
9001
  registered();
8903
9002
  }
8904
9003
  };
9004
+ rows.push(...notes.map(noteRow));
9005
+ log.report(rows);
9006
+ printDiagnosticLines(log, warnings, { errorsAsWarnings: false });
8905
9007
  const hold = () => holdBeforeLaunch({ delayMs: resolvedFlags.delayMs, pause: resolvedFlags.pause }, params.hold, log);
8906
9008
  return { bin: decided.bin, args: finalArgv, env: finalEnv, sessionId, release, markChildStarted: updateCheck.markChildStarted, hold, decision };
8907
9009
  }
@@ -8967,6 +9069,7 @@ var init_launcher = __esm({
8967
9069
  init_claudeSession();
8968
9070
  init_diagnostics();
8969
9071
  init_hold();
9072
+ init_launchReport();
8970
9073
  init_modelPicker();
8971
9074
  init_providerCatalogue();
8972
9075
  init_pool();
@@ -9193,6 +9296,7 @@ function prepareClaudeLaunch(options) {
9193
9296
  const refusals = [];
9194
9297
  const log = {
9195
9298
  info: () => void 0,
9299
+ report: () => void 0,
9196
9300
  warn: () => void 0,
9197
9301
  error: (message) => {
9198
9302
  refusals.push(message);
@@ -9214,6 +9318,7 @@ function resolveClaudeLaunch(options) {
9214
9318
  const warnings = [];
9215
9319
  const log = {
9216
9320
  info: () => void 0,
9321
+ report: () => void 0,
9217
9322
  warn: (message) => {
9218
9323
  warnings.push(message);
9219
9324
  },
@@ -9419,6 +9524,7 @@ async function withIdentityClaude(params, identity, flags, use) {
9419
9524
  },
9420
9525
  log: {
9421
9526
  info: () => void 0,
9527
+ report: () => void 0,
9422
9528
  warn: () => void 0,
9423
9529
  error: (message) => {
9424
9530
  refusals.push(message);
@@ -2390,9 +2390,22 @@ interface ProcPort {
2390
2390
  readonly argv: readonly string[];
2391
2391
  readonly exit: (code: number) => never;
2392
2392
  }
2393
+ /** One fact the launcher reports about the launch it is about to start. */
2394
+ interface ReportRow {
2395
+ /** What the fact is about (`identity`, `routing`), in a column of its own. */
2396
+ readonly label: string;
2397
+ /** The fact itself. */
2398
+ readonly value: string;
2399
+ /** What qualifies the value, after it and dimmed: where it came from, or how it was reached. */
2400
+ readonly detail?: string;
2401
+ /** Further lines under the row, lined up under its value and dimmed. */
2402
+ readonly notes?: readonly string[];
2403
+ }
2393
2404
  /** Where the launcher reports what it decided and why — refusals, warnings about an identity that could not be loaded, and (per the "strictly-better than the legacy script" goal) which identity/profile ended up selected. */
2394
2405
  interface LogPort {
2395
2406
  readonly info: (message: string) => void;
2407
+ /** Prints the facts a launch reports about itself as one block, with the formatting the output takes. */
2408
+ readonly report: (rows: readonly ReportRow[]) => void;
2396
2409
  readonly warn: (message: string) => void;
2397
2410
  readonly error: (message: string) => void;
2398
2411
  }
@@ -5878,7 +5891,6 @@ declare function createConfigApiRouter(deps: ConfigApiDeps): {
5878
5891
  kind: zod.ZodLiteral<"profile">;
5879
5892
  name: zod.ZodString;
5880
5893
  value: zod.ZodObject<{
5881
- description: zod.ZodOptional<zod.ZodString>;
5882
5894
  entries: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnion<readonly [zod.ZodBoolean, zod.ZodObject<{
5883
5895
  value: zod.ZodBoolean;
5884
5896
  when: zod.ZodUnion<readonly [zod.ZodObject<{
@@ -5954,6 +5966,7 @@ declare function createConfigApiRouter(deps: ConfigApiDeps): {
5954
5966
  key: zod.ZodType<trilean.JsonValue, unknown, zod_v4_core.$ZodTypeInternals<trilean.JsonValue, unknown>>;
5955
5967
  }, zod_v4_core.$strip>], "kind">]>;
5956
5968
  }, zod_v4_core.$strict>]>>>;
5969
+ description: zod.ZodOptional<zod.ZodString>;
5957
5970
  extends: zod.ZodOptional<zod.ZodArray<zod.ZodString>>;
5958
5971
  categories: zod.ZodOptional<zod.ZodPipe<zod.ZodObject<{
5959
5972
  all: zod.ZodOptional<zod.ZodBoolean>;
@@ -6001,7 +6014,6 @@ declare function createConfigApiRouter(deps: ConfigApiDeps): {
6001
6014
  kind: zod.ZodLiteral<"profile">;
6002
6015
  name: zod.ZodString;
6003
6016
  value: zod.ZodObject<{
6004
- description: zod.ZodOptional<zod.ZodString>;
6005
6017
  entries: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnion<readonly [zod.ZodBoolean, zod.ZodObject<{
6006
6018
  value: zod.ZodBoolean;
6007
6019
  when: zod.ZodUnion<readonly [zod.ZodObject<{
@@ -6077,6 +6089,7 @@ declare function createConfigApiRouter(deps: ConfigApiDeps): {
6077
6089
  key: zod.ZodType<trilean.JsonValue, unknown, zod_v4_core.$ZodTypeInternals<trilean.JsonValue, unknown>>;
6078
6090
  }, zod_v4_core.$strip>], "kind">]>;
6079
6091
  }, zod_v4_core.$strict>]>>>;
6092
+ description: zod.ZodOptional<zod.ZodString>;
6080
6093
  extends: zod.ZodOptional<zod.ZodArray<zod.ZodString>>;
6081
6094
  categories: zod.ZodOptional<zod.ZodPipe<zod.ZodObject<{
6082
6095
  all: zod.ZodOptional<zod.ZodBoolean>;
@@ -7385,7 +7398,7 @@ interface LaunchPlan {
7385
7398
  readonly sessionId: string;
7386
7399
  /** Releases the daemon session registrations this launch holds. Call it when the child has exited; it is safe to call more than once. */
7387
7400
  readonly release: () => void;
7388
- /** What the launch resolved to, as data: the facts the launcher's decision line reports. */
7401
+ /** What the launch resolved to, as data: the facts the launcher's report states. */
7389
7402
  readonly decision: LaunchDecision;
7390
7403
  /** Marks the moment this plan's child is spawned: the launch-time update check suppresses its notify line from then on, since a line printed after the child took over the terminal would land mid-session. Call it immediately before spawning; it is safe to call more than once. */
7391
7404
  readonly markChildStarted: () => void;
@@ -8900,7 +8913,6 @@ declare function createDoorApiRouter(deps: DoorApiDeps): {
8900
8913
  kind: zod.ZodLiteral<"profile">;
8901
8914
  name: zod.ZodString;
8902
8915
  value: zod.ZodObject<{
8903
- description: zod.ZodOptional<zod.ZodString>;
8904
8916
  entries: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnion<readonly [zod.ZodBoolean, zod.ZodObject<{
8905
8917
  value: zod.ZodBoolean;
8906
8918
  when: zod.ZodUnion<readonly [zod.ZodObject<{
@@ -8976,6 +8988,7 @@ declare function createDoorApiRouter(deps: DoorApiDeps): {
8976
8988
  key: zod.ZodType<trilean.JsonValue, unknown, zod_v4_core.$ZodTypeInternals<trilean.JsonValue, unknown>>;
8977
8989
  }, zod_v4_core.$strip>], "kind">]>;
8978
8990
  }, zod_v4_core.$strict>]>>>;
8991
+ description: zod.ZodOptional<zod.ZodString>;
8979
8992
  extends: zod.ZodOptional<zod.ZodArray<zod.ZodString>>;
8980
8993
  categories: zod.ZodOptional<zod.ZodPipe<zod.ZodObject<{
8981
8994
  all: zod.ZodOptional<zod.ZodBoolean>;
@@ -9023,7 +9036,6 @@ declare function createDoorApiRouter(deps: DoorApiDeps): {
9023
9036
  kind: zod.ZodLiteral<"profile">;
9024
9037
  name: zod.ZodString;
9025
9038
  value: zod.ZodObject<{
9026
- description: zod.ZodOptional<zod.ZodString>;
9027
9039
  entries: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodUnion<readonly [zod.ZodBoolean, zod.ZodObject<{
9028
9040
  value: zod.ZodBoolean;
9029
9041
  when: zod.ZodUnion<readonly [zod.ZodObject<{
@@ -9099,6 +9111,7 @@ declare function createDoorApiRouter(deps: DoorApiDeps): {
9099
9111
  key: zod.ZodType<trilean.JsonValue, unknown, zod_v4_core.$ZodTypeInternals<trilean.JsonValue, unknown>>;
9100
9112
  }, zod_v4_core.$strip>], "kind">]>;
9101
9113
  }, zod_v4_core.$strict>]>>>;
9114
+ description: zod.ZodOptional<zod.ZodString>;
9102
9115
  extends: zod.ZodOptional<zod.ZodArray<zod.ZodString>>;
9103
9116
  categories: zod.ZodOptional<zod.ZodPipe<zod.ZodObject<{
9104
9117
  all: zod.ZodOptional<zod.ZodBoolean>;
@@ -11037,7 +11050,6 @@ declare const ConfigProfileAddOutputSchema: z.ZodObject<{
11037
11050
  kind: z.ZodLiteral<"profile">;
11038
11051
  name: z.ZodString;
11039
11052
  value: z.ZodObject<{
11040
- description: z.ZodOptional<z.ZodString>;
11041
11053
  entries: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
11042
11054
  value: z.ZodBoolean;
11043
11055
  when: z.ZodUnion<readonly [z.ZodObject<{
@@ -11113,6 +11125,7 @@ declare const ConfigProfileAddOutputSchema: z.ZodObject<{
11113
11125
  key: z.ZodType<trilean.JsonValue, unknown, z.core.$ZodTypeInternals<trilean.JsonValue, unknown>>;
11114
11126
  }, z.core.$strip>], "kind">]>;
11115
11127
  }, z.core.$strict>]>>>;
11128
+ description: z.ZodOptional<z.ZodString>;
11116
11129
  extends: z.ZodOptional<z.ZodArray<z.ZodString>>;
11117
11130
  categories: z.ZodOptional<z.ZodPipe<z.ZodObject<{
11118
11131
  all: z.ZodOptional<z.ZodBoolean>;
@@ -11162,7 +11175,6 @@ declare const ConfigProfileSetOutputSchema: z.ZodObject<{
11162
11175
  kind: z.ZodLiteral<"profile">;
11163
11176
  name: z.ZodString;
11164
11177
  value: z.ZodObject<{
11165
- description: z.ZodOptional<z.ZodString>;
11166
11178
  entries: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
11167
11179
  value: z.ZodBoolean;
11168
11180
  when: z.ZodUnion<readonly [z.ZodObject<{
@@ -11238,6 +11250,7 @@ declare const ConfigProfileSetOutputSchema: z.ZodObject<{
11238
11250
  key: z.ZodType<trilean.JsonValue, unknown, z.core.$ZodTypeInternals<trilean.JsonValue, unknown>>;
11239
11251
  }, z.core.$strip>], "kind">]>;
11240
11252
  }, z.core.$strict>]>>>;
11253
+ description: z.ZodOptional<z.ZodString>;
11241
11254
  extends: z.ZodOptional<z.ZodArray<z.ZodString>>;
11242
11255
  categories: z.ZodOptional<z.ZodPipe<z.ZodObject<{
11243
11256
  all: z.ZodOptional<z.ZodBoolean>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-use",
3
- "version": "11.28.0",
3
+ "version": "11.29.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>",