claude-use 11.61.0 → 11.62.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/index.cjs CHANGED
@@ -250,6 +250,15 @@ var init_graphemes = __esm({
250
250
  }
251
251
  });
252
252
 
253
+ // src/statusline/messages/languages.ts
254
+ var STATUSLINE_LANGUAGES;
255
+ var init_languages = __esm({
256
+ "src/statusline/messages/languages.ts"() {
257
+ "use strict";
258
+ STATUSLINE_LANGUAGES = ["en", "zh-Hans", "zh-Hant"];
259
+ }
260
+ });
261
+
253
262
  // src/config/statusline.ts
254
263
  function distinctList(member) {
255
264
  return import_zod2.z.array(member).refine((items) => new Set(items).size === items.length, "must not repeat an entry");
@@ -260,10 +269,13 @@ function isSingleVisibleGrapheme(text) {
260
269
  function unsettable(setting) {
261
270
  return setting.unwrap().nullable().optional().describe(`${setting.description ?? ""} ${UNSET_NOTE}`);
262
271
  }
272
+ function canonicalLanguage(tag) {
273
+ return tag === "zh" || tag === "zh-TW" ? LANGUAGE_ALIASES[tag] : tag;
274
+ }
263
275
  function isPlainObject(value) {
264
276
  return typeof value === "object" && value !== null && !Array.isArray(value);
265
277
  }
266
- function mergeStatuslineSettings(base, over) {
278
+ function mergeKeys(base, over) {
267
279
  if (!isPlainObject(over)) {
268
280
  return over === void 0 ? base : over;
269
281
  }
@@ -272,7 +284,7 @@ function mergeStatuslineSettings(base, over) {
272
284
  if (value === null) {
273
285
  Reflect.deleteProperty(merged, key);
274
286
  } else {
275
- merged[key] = mergeStatuslineSettings(merged[key], value);
287
+ merged[key] = mergeKeys(merged[key], value);
276
288
  }
277
289
  }
278
290
  return merged;
@@ -280,6 +292,13 @@ function mergeStatuslineSettings(base, over) {
280
292
  function contextBands({ bands, context }) {
281
293
  return { warnAt: context.warnAt ?? bands.warnAt, criticalAt: context.criticalAt ?? bands.criticalAt };
282
294
  }
295
+ function isPresetName(value) {
296
+ return STATUSLINE_PRESETS.some((name) => name === value);
297
+ }
298
+ function mergeStatuslineSettings(base, over) {
299
+ const preset = isPlainObject(over) ? over.preset : void 0;
300
+ return mergeKeys(isPresetName(preset) ? mergeKeys(base, PRESET_BUNDLES[preset]) : base, over);
301
+ }
283
302
  function resolveStatusline(settings) {
284
303
  const resolved = ResolvedStatuslineSchema.parse(mergeStatuslineSettings(STATUSLINE_DEFAULTS, settings));
285
304
  if (resolved.bands.warnAt >= resolved.bands.criticalAt) {
@@ -299,7 +318,7 @@ function resolveStatusline(settings) {
299
318
  }
300
319
  return resolved;
301
320
  }
302
- var import_string_width2, import_zod2, STATUSLINE_HEADER_SEGMENTS, STATUSLINE_ROWS, STATUSLINE_SESSION_TIME_PARTS, PROMPT_CACHE_TTL_SECONDS, STATUSLINE_COLOUR_NAMES, DEFAULT_HEADER_SEGMENTS, DEFAULT_ROWS, STATUSLINE_PATH_LEVELS, STATUSLINE_USAGE_VALUES, STATUSLINE_TIME_FORMATS, STATUSLINE_HOUR_CYCLES, MAX_PERCENT, MAX_STATUSLINE_PALETTE_INDEX, MAX_STATUSLINE_LABEL_COLUMNS, MIN_STATUSLINE_COLUMNS, MAX_STATUSLINE_COLUMNS, MAX_BAR_CELLS, MAX_ACCOUNT_USER_CHARS, MAX_DISPLAY_TEXT_CHARS, LABEL_RE2, OPTIONAL_LABEL_RE, mergeGroups, colourValue, barCharacter, STATUSLINE_CONTEXT_VALUES, STATUSLINE_CONTEXT_ESTIMATES, AUTOCOMPACT_RESERVE_FRACTION, AUTOCOMPACT_RESERVE_RAMP_START, AUTOCOMPACT_RESERVE_RAMP_END, labelText, overrideText, wholePercent, thresholdPercent, SHAPES, UNSET_NOTE, StatuslineSchema, ResolvedStatuslineSchema, STATUSLINE_DEFAULTS, STATUSLINE_ENV;
321
+ var import_string_width2, import_zod2, STATUSLINE_HEADER_SEGMENTS, STATUSLINE_ROWS, STATUSLINE_SESSION_TIME_PARTS, PROMPT_CACHE_TTL_SECONDS, STATUSLINE_COLOUR_NAMES, DEFAULT_HEADER_SEGMENTS, DEFAULT_ROWS, STATUSLINE_PRESETS, GIT_WITH_DIRTY_MARKER, JJ_OFF, PRESET_BUNDLES, STATUSLINE_PATH_LEVELS, STATUSLINE_USAGE_VALUES, STATUSLINE_TIME_FORMATS, STATUSLINE_HOUR_CYCLES, MAX_PERCENT, MAX_STATUSLINE_PALETTE_INDEX, MAX_STATUSLINE_LABEL_COLUMNS, MIN_STATUSLINE_COLUMNS, MAX_STATUSLINE_COLUMNS, MAX_BAR_CELLS, MAX_ACCOUNT_USER_CHARS, MAX_DISPLAY_TEXT_CHARS, LABEL_RE2, OPTIONAL_LABEL_RE, mergeGroups, colourValue, barCharacter, STATUSLINE_CONTEXT_VALUES, STATUSLINE_CONTEXT_ESTIMATES, AUTOCOMPACT_RESERVE_FRACTION, AUTOCOMPACT_RESERVE_RAMP_START, AUTOCOMPACT_RESERVE_RAMP_END, labelWithinColumns, labelWithinColumnsMessage, labelShowsSomething, labelShowsSomethingMessage, labelIsPlainText, labelIsPlainTextMessage, windowLabel, overrideText, wholePercent, thresholdPercent, SHAPES, UNSET_NOTE, LANGUAGE_DESCRIPTION, LANGUAGE_TAGS, LANGUAGE_ALIASES, TOP_LEVEL, StatuslineSchema, ResolvedStatuslineSchema, STATUSLINE_DEFAULTS, STATUSLINE_ENV;
303
322
  var init_statusline = __esm({
304
323
  "src/config/statusline.ts"() {
305
324
  "use strict";
@@ -307,6 +326,7 @@ var init_statusline = __esm({
307
326
  import_zod2 = require("zod");
308
327
  init_blank();
309
328
  init_graphemes();
329
+ init_languages();
310
330
  STATUSLINE_HEADER_SEGMENTS = ["model", "provider", "route", "account", "identity", "headroom", "project", "vcs", "effort", "advisor", "version", "outputStyle", "cost", "dailyCost", "sessionName", "duration", "speed"];
311
331
  STATUSLINE_ROWS = ["context", "quota", "addedDirs", "gitFiles", "memory", "environment", "sessionTime", "promptCache", "compactions", "tokens"];
312
332
  STATUSLINE_SESSION_TIME_PARTS = ["started", "lastReply"];
@@ -333,6 +353,21 @@ var init_statusline = __esm({
333
353
  ];
334
354
  DEFAULT_HEADER_SEGMENTS = ["model", "provider", "route", "account", "identity", "headroom"];
335
355
  DEFAULT_ROWS = ["context", "quota"];
356
+ STATUSLINE_PRESETS = ["standard", "full", "essential", "minimal"];
357
+ GIT_WITH_DIRTY_MARKER = { enabled: true, showDirty: true, showAheadBehind: false, showLineDiff: false };
358
+ JJ_OFF = { enabled: false, showDirty: true, showConflicts: true };
359
+ PRESET_BUNDLES = {
360
+ standard: { layout: { header: DEFAULT_HEADER_SEGMENTS, rows: DEFAULT_ROWS }, git: GIT_WITH_DIRTY_MARKER, jj: JJ_OFF, usage: { resetLabel: false }, context: { breakdown: "never" } },
361
+ full: {
362
+ layout: { header: ["model", "project", "vcs", "effort", "advisor", "version", "outputStyle", "cost", "sessionName", "duration"], rows: ["context", "quota", "addedDirs", "memory", "environment", "promptCache", "compactions", "tokens"] },
363
+ git: GIT_WITH_DIRTY_MARKER,
364
+ jj: { enabled: true, showDirty: true, showConflicts: true },
365
+ usage: { resetLabel: true },
366
+ context: { breakdown: "critical" }
367
+ },
368
+ essential: { layout: { header: ["model", "project", "vcs", "duration"], rows: ["context", "addedDirs"] }, git: GIT_WITH_DIRTY_MARKER, jj: JJ_OFF, usage: { resetLabel: true }, context: { breakdown: "never" } },
369
+ minimal: { layout: { header: ["model", "project", "vcs"], rows: ["context", "addedDirs"] }, git: GIT_WITH_DIRTY_MARKER, jj: JJ_OFF, usage: { resetLabel: true }, context: { breakdown: "never" } }
370
+ };
336
371
  STATUSLINE_PATH_LEVELS = ["1", "2", "3", "full"];
337
372
  STATUSLINE_USAGE_VALUES = ["used", "remaining"];
338
373
  STATUSLINE_TIME_FORMATS = ["relative", "absolute", "both", "elapsed", "elapsedAndAbsolute"];
@@ -358,7 +393,13 @@ var init_statusline = __esm({
358
393
  AUTOCOMPACT_RESERVE_FRACTION = 0.165;
359
394
  AUTOCOMPACT_RESERVE_RAMP_START = 0.05;
360
395
  AUTOCOMPACT_RESERVE_RAMP_END = 0.5;
361
- labelText = import_zod2.z.string().refine((text) => (0, import_string_width2.default)(text) <= MAX_STATUSLINE_LABEL_COLUMNS, `must take no more than ${String(MAX_STATUSLINE_LABEL_COLUMNS)} terminal columns`).refine((text) => !drawsNothing(text), "must show something: a label of only combining marks or blank characters draws nothing").regex(LABEL_RE2, "must be visible text without control characters");
396
+ labelWithinColumns = (text) => (0, import_string_width2.default)(text) <= MAX_STATUSLINE_LABEL_COLUMNS;
397
+ labelWithinColumnsMessage = `must take no more than ${String(MAX_STATUSLINE_LABEL_COLUMNS)} terminal columns`;
398
+ labelShowsSomething = (text) => !drawsNothing(text);
399
+ labelShowsSomethingMessage = "must show something: a label of only combining marks or blank characters draws nothing";
400
+ labelIsPlainText = (text) => LABEL_RE2.test(text);
401
+ labelIsPlainTextMessage = "must be visible text without control characters";
402
+ windowLabel = import_zod2.z.string().refine((text) => text === "" || labelWithinColumns(text), labelWithinColumnsMessage).refine((text) => text === "" || labelShowsSomething(text), labelShowsSomethingMessage).refine((text) => text === "" || labelIsPlainText(text), labelIsPlainTextMessage);
362
403
  overrideText = import_zod2.z.string().max(MAX_DISPLAY_TEXT_CHARS).regex(OPTIONAL_LABEL_RE, "must be visible text without control characters");
363
404
  wholePercent = import_zod2.z.number().int().min(1).max(MAX_PERCENT);
364
405
  thresholdPercent = import_zod2.z.number().int().min(0).max(MAX_PERCENT);
@@ -406,8 +447,8 @@ var init_statusline = __esm({
406
447
  criticalAt: wholePercent.describe("The whole percentage of use at which a bar turns red.")
407
448
  },
408
449
  labels: {
409
- fiveHour: labelText.describe("The name of the five-hour subscription window."),
410
- sevenDay: labelText.describe("The name of the weekly subscription window.")
450
+ fiveHour: windowLabel.describe("The name of the five-hour subscription window; empty uses the language's own name for it."),
451
+ sevenDay: windowLabel.describe("The name of the weekly subscription window; empty uses the language's own name for it.")
411
452
  },
412
453
  bar: {
413
454
  width: import_zod2.z.number().int().min(1).max(MAX_BAR_CELLS).describe("A bar's width in cells before the line's spare width is shared out among the bars."),
@@ -473,7 +514,16 @@ var init_statusline = __esm({
473
514
  }
474
515
  };
475
516
  UNSET_NOTE = "A layer may write null to return it to unset when a shallower layer sets it.";
517
+ LANGUAGE_DESCRIPTION = "The language of the words the statusline writes (labels, units of waiting such as `ago`, the names of effort levels): en, zh-Hans for Chinese in simplified characters, and zh-Hant for traditional; zh and zh-TW are read as zh-Hans and zh-Hant, and any other tag is refused. Durations, token counts, the dollar sign and clock times are written the same in every language, and a clock time follows the system locale and the clock settings.";
518
+ LANGUAGE_TAGS = [...STATUSLINE_LANGUAGES, "zh", "zh-TW"];
519
+ LANGUAGE_ALIASES = { zh: "zh-Hans", "zh-TW": "zh-Hant" };
520
+ TOP_LEVEL = {
521
+ language: import_zod2.z.enum(STATUSLINE_LANGUAGES).describe(LANGUAGE_DESCRIPTION),
522
+ preset: import_zod2.z.enum(STATUSLINE_PRESETS).describe("A named bundle of settings (layout.header, layout.rows, git.enabled, git.showDirty, git.showAheadBehind, git.showLineDiff, jj.enabled, jj.showDirty, jj.showConflicts, usage.resetLabel and context.breakdown) that this layer sets beneath the keys it names itself and above everything the shallower layers set: standard is the statusline's own; full, essential and minimal are claude-hud's presets. Each draws the model, project and version control segments and the context row; full adds the effort, advisor, version, output style, cost, session name and duration segments and the quota, added directories, memory, environment, prompt cache, compactions and session tokens rows, with the token breakdown at high use, essential adds the duration and the added directories row, and minimal adds the added directories row alone.")
523
+ };
476
524
  StatuslineSchema = import_zod2.z.strictObject({
525
+ language: import_zod2.z.enum(LANGUAGE_TAGS).transform(canonicalLanguage).describe(LANGUAGE_DESCRIPTION).optional(),
526
+ preset: TOP_LEVEL.preset.optional(),
477
527
  layout: import_zod2.z.strictObject(SHAPES.layout).partial().optional(),
478
528
  model: import_zod2.z.strictObject(SHAPES.model).partial().optional(),
479
529
  provider: import_zod2.z.strictObject(SHAPES.provider).partial().optional(),
@@ -496,6 +546,8 @@ var init_statusline = __esm({
496
546
  jj: import_zod2.z.strictObject(SHAPES.jj).partial().optional()
497
547
  });
498
548
  ResolvedStatuslineSchema = import_zod2.z.strictObject({
549
+ language: TOP_LEVEL.language,
550
+ preset: TOP_LEVEL.preset,
499
551
  layout: import_zod2.z.strictObject(SHAPES.layout),
500
552
  model: import_zod2.z.strictObject(SHAPES.model),
501
553
  provider: import_zod2.z.strictObject(SHAPES.provider),
@@ -518,6 +570,8 @@ var init_statusline = __esm({
518
570
  jj: import_zod2.z.strictObject(SHAPES.jj)
519
571
  });
520
572
  STATUSLINE_DEFAULTS = {
573
+ language: "en",
574
+ preset: "standard",
521
575
  layout: { header: [...DEFAULT_HEADER_SEGMENTS], rows: [...DEFAULT_ROWS], mode: "expanded", rule: "none", mergeBars: true, merge: [], rightAlign: [], maxWidth: 0, forceMaxWidth: false },
522
576
  model: { format: "full", override: "", source: "client" },
523
577
  provider: { name: "" },
@@ -526,7 +580,7 @@ var init_statusline = __esm({
526
580
  advisor: { override: "" },
527
581
  context: { bar: "shown", value: "both", estimate: "never", breakdown: "never" },
528
582
  bands: { warnAt: 70, criticalAt: 90 },
529
- labels: { fiveHour: "5h", sevenDay: "Wk" },
583
+ labels: { fiveHour: "", sevenDay: "" },
530
584
  bar: { width: 10, filled: "\u2588", empty: "\u2591" },
531
585
  usage: { value: "used", bar: true, compact: false, resetLabel: false, modelScoped: false, timeFormat: "relative", threshold: 0, sevenDayThreshold: 0 },
532
586
  clock: { hourCycle: "auto", seconds: false },
@@ -4598,7 +4652,7 @@ var init_package = __esm({
4598
4652
  "package.json"() {
4599
4653
  package_default = {
4600
4654
  name: "claude-use",
4601
- version: "11.61.0",
4655
+ version: "11.62.0",
4602
4656
  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.",
4603
4657
  license: "MIT",
4604
4658
  author: "Joseph Mearman <joseph@mearman.co.uk>",
package/dist/index.mjs CHANGED
@@ -228,6 +228,15 @@ var init_graphemes = __esm({
228
228
  }
229
229
  });
230
230
 
231
+ // src/statusline/messages/languages.ts
232
+ var STATUSLINE_LANGUAGES;
233
+ var init_languages = __esm({
234
+ "src/statusline/messages/languages.ts"() {
235
+ "use strict";
236
+ STATUSLINE_LANGUAGES = ["en", "zh-Hans", "zh-Hant"];
237
+ }
238
+ });
239
+
231
240
  // src/config/statusline.ts
232
241
  import stringWidth2 from "string-width";
233
242
  import { z as z2 } from "zod";
@@ -240,10 +249,13 @@ function isSingleVisibleGrapheme(text) {
240
249
  function unsettable(setting) {
241
250
  return setting.unwrap().nullable().optional().describe(`${setting.description ?? ""} ${UNSET_NOTE}`);
242
251
  }
252
+ function canonicalLanguage(tag) {
253
+ return tag === "zh" || tag === "zh-TW" ? LANGUAGE_ALIASES[tag] : tag;
254
+ }
243
255
  function isPlainObject(value) {
244
256
  return typeof value === "object" && value !== null && !Array.isArray(value);
245
257
  }
246
- function mergeStatuslineSettings(base, over) {
258
+ function mergeKeys(base, over) {
247
259
  if (!isPlainObject(over)) {
248
260
  return over === void 0 ? base : over;
249
261
  }
@@ -252,7 +264,7 @@ function mergeStatuslineSettings(base, over) {
252
264
  if (value === null) {
253
265
  Reflect.deleteProperty(merged, key);
254
266
  } else {
255
- merged[key] = mergeStatuslineSettings(merged[key], value);
267
+ merged[key] = mergeKeys(merged[key], value);
256
268
  }
257
269
  }
258
270
  return merged;
@@ -260,6 +272,13 @@ function mergeStatuslineSettings(base, over) {
260
272
  function contextBands({ bands, context }) {
261
273
  return { warnAt: context.warnAt ?? bands.warnAt, criticalAt: context.criticalAt ?? bands.criticalAt };
262
274
  }
275
+ function isPresetName(value) {
276
+ return STATUSLINE_PRESETS.some((name) => name === value);
277
+ }
278
+ function mergeStatuslineSettings(base, over) {
279
+ const preset = isPlainObject(over) ? over.preset : void 0;
280
+ return mergeKeys(isPresetName(preset) ? mergeKeys(base, PRESET_BUNDLES[preset]) : base, over);
281
+ }
263
282
  function resolveStatusline(settings) {
264
283
  const resolved = ResolvedStatuslineSchema.parse(mergeStatuslineSettings(STATUSLINE_DEFAULTS, settings));
265
284
  if (resolved.bands.warnAt >= resolved.bands.criticalAt) {
@@ -279,12 +298,13 @@ function resolveStatusline(settings) {
279
298
  }
280
299
  return resolved;
281
300
  }
282
- var STATUSLINE_HEADER_SEGMENTS, STATUSLINE_ROWS, STATUSLINE_SESSION_TIME_PARTS, PROMPT_CACHE_TTL_SECONDS, STATUSLINE_COLOUR_NAMES, DEFAULT_HEADER_SEGMENTS, DEFAULT_ROWS, STATUSLINE_PATH_LEVELS, STATUSLINE_USAGE_VALUES, STATUSLINE_TIME_FORMATS, STATUSLINE_HOUR_CYCLES, MAX_PERCENT, MAX_STATUSLINE_PALETTE_INDEX, MAX_STATUSLINE_LABEL_COLUMNS, MIN_STATUSLINE_COLUMNS, MAX_STATUSLINE_COLUMNS, MAX_BAR_CELLS, MAX_ACCOUNT_USER_CHARS, MAX_DISPLAY_TEXT_CHARS, LABEL_RE2, OPTIONAL_LABEL_RE, mergeGroups, colourValue, barCharacter, STATUSLINE_CONTEXT_VALUES, STATUSLINE_CONTEXT_ESTIMATES, AUTOCOMPACT_RESERVE_FRACTION, AUTOCOMPACT_RESERVE_RAMP_START, AUTOCOMPACT_RESERVE_RAMP_END, labelText, overrideText, wholePercent, thresholdPercent, SHAPES, UNSET_NOTE, StatuslineSchema, ResolvedStatuslineSchema, STATUSLINE_DEFAULTS, STATUSLINE_ENV;
301
+ var STATUSLINE_HEADER_SEGMENTS, STATUSLINE_ROWS, STATUSLINE_SESSION_TIME_PARTS, PROMPT_CACHE_TTL_SECONDS, STATUSLINE_COLOUR_NAMES, DEFAULT_HEADER_SEGMENTS, DEFAULT_ROWS, STATUSLINE_PRESETS, GIT_WITH_DIRTY_MARKER, JJ_OFF, PRESET_BUNDLES, STATUSLINE_PATH_LEVELS, STATUSLINE_USAGE_VALUES, STATUSLINE_TIME_FORMATS, STATUSLINE_HOUR_CYCLES, MAX_PERCENT, MAX_STATUSLINE_PALETTE_INDEX, MAX_STATUSLINE_LABEL_COLUMNS, MIN_STATUSLINE_COLUMNS, MAX_STATUSLINE_COLUMNS, MAX_BAR_CELLS, MAX_ACCOUNT_USER_CHARS, MAX_DISPLAY_TEXT_CHARS, LABEL_RE2, OPTIONAL_LABEL_RE, mergeGroups, colourValue, barCharacter, STATUSLINE_CONTEXT_VALUES, STATUSLINE_CONTEXT_ESTIMATES, AUTOCOMPACT_RESERVE_FRACTION, AUTOCOMPACT_RESERVE_RAMP_START, AUTOCOMPACT_RESERVE_RAMP_END, labelWithinColumns, labelWithinColumnsMessage, labelShowsSomething, labelShowsSomethingMessage, labelIsPlainText, labelIsPlainTextMessage, windowLabel, overrideText, wholePercent, thresholdPercent, SHAPES, UNSET_NOTE, LANGUAGE_DESCRIPTION, LANGUAGE_TAGS, LANGUAGE_ALIASES, TOP_LEVEL, StatuslineSchema, ResolvedStatuslineSchema, STATUSLINE_DEFAULTS, STATUSLINE_ENV;
283
302
  var init_statusline = __esm({
284
303
  "src/config/statusline.ts"() {
285
304
  "use strict";
286
305
  init_blank();
287
306
  init_graphemes();
307
+ init_languages();
288
308
  STATUSLINE_HEADER_SEGMENTS = ["model", "provider", "route", "account", "identity", "headroom", "project", "vcs", "effort", "advisor", "version", "outputStyle", "cost", "dailyCost", "sessionName", "duration", "speed"];
289
309
  STATUSLINE_ROWS = ["context", "quota", "addedDirs", "gitFiles", "memory", "environment", "sessionTime", "promptCache", "compactions", "tokens"];
290
310
  STATUSLINE_SESSION_TIME_PARTS = ["started", "lastReply"];
@@ -311,6 +331,21 @@ var init_statusline = __esm({
311
331
  ];
312
332
  DEFAULT_HEADER_SEGMENTS = ["model", "provider", "route", "account", "identity", "headroom"];
313
333
  DEFAULT_ROWS = ["context", "quota"];
334
+ STATUSLINE_PRESETS = ["standard", "full", "essential", "minimal"];
335
+ GIT_WITH_DIRTY_MARKER = { enabled: true, showDirty: true, showAheadBehind: false, showLineDiff: false };
336
+ JJ_OFF = { enabled: false, showDirty: true, showConflicts: true };
337
+ PRESET_BUNDLES = {
338
+ standard: { layout: { header: DEFAULT_HEADER_SEGMENTS, rows: DEFAULT_ROWS }, git: GIT_WITH_DIRTY_MARKER, jj: JJ_OFF, usage: { resetLabel: false }, context: { breakdown: "never" } },
339
+ full: {
340
+ layout: { header: ["model", "project", "vcs", "effort", "advisor", "version", "outputStyle", "cost", "sessionName", "duration"], rows: ["context", "quota", "addedDirs", "memory", "environment", "promptCache", "compactions", "tokens"] },
341
+ git: GIT_WITH_DIRTY_MARKER,
342
+ jj: { enabled: true, showDirty: true, showConflicts: true },
343
+ usage: { resetLabel: true },
344
+ context: { breakdown: "critical" }
345
+ },
346
+ essential: { layout: { header: ["model", "project", "vcs", "duration"], rows: ["context", "addedDirs"] }, git: GIT_WITH_DIRTY_MARKER, jj: JJ_OFF, usage: { resetLabel: true }, context: { breakdown: "never" } },
347
+ minimal: { layout: { header: ["model", "project", "vcs"], rows: ["context", "addedDirs"] }, git: GIT_WITH_DIRTY_MARKER, jj: JJ_OFF, usage: { resetLabel: true }, context: { breakdown: "never" } }
348
+ };
314
349
  STATUSLINE_PATH_LEVELS = ["1", "2", "3", "full"];
315
350
  STATUSLINE_USAGE_VALUES = ["used", "remaining"];
316
351
  STATUSLINE_TIME_FORMATS = ["relative", "absolute", "both", "elapsed", "elapsedAndAbsolute"];
@@ -336,7 +371,13 @@ var init_statusline = __esm({
336
371
  AUTOCOMPACT_RESERVE_FRACTION = 0.165;
337
372
  AUTOCOMPACT_RESERVE_RAMP_START = 0.05;
338
373
  AUTOCOMPACT_RESERVE_RAMP_END = 0.5;
339
- labelText = z2.string().refine((text) => stringWidth2(text) <= MAX_STATUSLINE_LABEL_COLUMNS, `must take no more than ${String(MAX_STATUSLINE_LABEL_COLUMNS)} terminal columns`).refine((text) => !drawsNothing(text), "must show something: a label of only combining marks or blank characters draws nothing").regex(LABEL_RE2, "must be visible text without control characters");
374
+ labelWithinColumns = (text) => stringWidth2(text) <= MAX_STATUSLINE_LABEL_COLUMNS;
375
+ labelWithinColumnsMessage = `must take no more than ${String(MAX_STATUSLINE_LABEL_COLUMNS)} terminal columns`;
376
+ labelShowsSomething = (text) => !drawsNothing(text);
377
+ labelShowsSomethingMessage = "must show something: a label of only combining marks or blank characters draws nothing";
378
+ labelIsPlainText = (text) => LABEL_RE2.test(text);
379
+ labelIsPlainTextMessage = "must be visible text without control characters";
380
+ windowLabel = z2.string().refine((text) => text === "" || labelWithinColumns(text), labelWithinColumnsMessage).refine((text) => text === "" || labelShowsSomething(text), labelShowsSomethingMessage).refine((text) => text === "" || labelIsPlainText(text), labelIsPlainTextMessage);
340
381
  overrideText = z2.string().max(MAX_DISPLAY_TEXT_CHARS).regex(OPTIONAL_LABEL_RE, "must be visible text without control characters");
341
382
  wholePercent = z2.number().int().min(1).max(MAX_PERCENT);
342
383
  thresholdPercent = z2.number().int().min(0).max(MAX_PERCENT);
@@ -384,8 +425,8 @@ var init_statusline = __esm({
384
425
  criticalAt: wholePercent.describe("The whole percentage of use at which a bar turns red.")
385
426
  },
386
427
  labels: {
387
- fiveHour: labelText.describe("The name of the five-hour subscription window."),
388
- sevenDay: labelText.describe("The name of the weekly subscription window.")
428
+ fiveHour: windowLabel.describe("The name of the five-hour subscription window; empty uses the language's own name for it."),
429
+ sevenDay: windowLabel.describe("The name of the weekly subscription window; empty uses the language's own name for it.")
389
430
  },
390
431
  bar: {
391
432
  width: z2.number().int().min(1).max(MAX_BAR_CELLS).describe("A bar's width in cells before the line's spare width is shared out among the bars."),
@@ -451,7 +492,16 @@ var init_statusline = __esm({
451
492
  }
452
493
  };
453
494
  UNSET_NOTE = "A layer may write null to return it to unset when a shallower layer sets it.";
495
+ LANGUAGE_DESCRIPTION = "The language of the words the statusline writes (labels, units of waiting such as `ago`, the names of effort levels): en, zh-Hans for Chinese in simplified characters, and zh-Hant for traditional; zh and zh-TW are read as zh-Hans and zh-Hant, and any other tag is refused. Durations, token counts, the dollar sign and clock times are written the same in every language, and a clock time follows the system locale and the clock settings.";
496
+ LANGUAGE_TAGS = [...STATUSLINE_LANGUAGES, "zh", "zh-TW"];
497
+ LANGUAGE_ALIASES = { zh: "zh-Hans", "zh-TW": "zh-Hant" };
498
+ TOP_LEVEL = {
499
+ language: z2.enum(STATUSLINE_LANGUAGES).describe(LANGUAGE_DESCRIPTION),
500
+ preset: z2.enum(STATUSLINE_PRESETS).describe("A named bundle of settings (layout.header, layout.rows, git.enabled, git.showDirty, git.showAheadBehind, git.showLineDiff, jj.enabled, jj.showDirty, jj.showConflicts, usage.resetLabel and context.breakdown) that this layer sets beneath the keys it names itself and above everything the shallower layers set: standard is the statusline's own; full, essential and minimal are claude-hud's presets. Each draws the model, project and version control segments and the context row; full adds the effort, advisor, version, output style, cost, session name and duration segments and the quota, added directories, memory, environment, prompt cache, compactions and session tokens rows, with the token breakdown at high use, essential adds the duration and the added directories row, and minimal adds the added directories row alone.")
501
+ };
454
502
  StatuslineSchema = z2.strictObject({
503
+ language: z2.enum(LANGUAGE_TAGS).transform(canonicalLanguage).describe(LANGUAGE_DESCRIPTION).optional(),
504
+ preset: TOP_LEVEL.preset.optional(),
455
505
  layout: z2.strictObject(SHAPES.layout).partial().optional(),
456
506
  model: z2.strictObject(SHAPES.model).partial().optional(),
457
507
  provider: z2.strictObject(SHAPES.provider).partial().optional(),
@@ -474,6 +524,8 @@ var init_statusline = __esm({
474
524
  jj: z2.strictObject(SHAPES.jj).partial().optional()
475
525
  });
476
526
  ResolvedStatuslineSchema = z2.strictObject({
527
+ language: TOP_LEVEL.language,
528
+ preset: TOP_LEVEL.preset,
477
529
  layout: z2.strictObject(SHAPES.layout),
478
530
  model: z2.strictObject(SHAPES.model),
479
531
  provider: z2.strictObject(SHAPES.provider),
@@ -496,6 +548,8 @@ var init_statusline = __esm({
496
548
  jj: z2.strictObject(SHAPES.jj)
497
549
  });
498
550
  STATUSLINE_DEFAULTS = {
551
+ language: "en",
552
+ preset: "standard",
499
553
  layout: { header: [...DEFAULT_HEADER_SEGMENTS], rows: [...DEFAULT_ROWS], mode: "expanded", rule: "none", mergeBars: true, merge: [], rightAlign: [], maxWidth: 0, forceMaxWidth: false },
500
554
  model: { format: "full", override: "", source: "client" },
501
555
  provider: { name: "" },
@@ -504,7 +558,7 @@ var init_statusline = __esm({
504
558
  advisor: { override: "" },
505
559
  context: { bar: "shown", value: "both", estimate: "never", breakdown: "never" },
506
560
  bands: { warnAt: 70, criticalAt: 90 },
507
- labels: { fiveHour: "5h", sevenDay: "Wk" },
561
+ labels: { fiveHour: "", sevenDay: "" },
508
562
  bar: { width: 10, filled: "\u2588", empty: "\u2591" },
509
563
  usage: { value: "used", bar: true, compact: false, resetLabel: false, modelScoped: false, timeFormat: "relative", threshold: 0, sevenDayThreshold: 0 },
510
564
  clock: { hourCycle: "auto", seconds: false },
@@ -4574,7 +4628,7 @@ var init_package = __esm({
4574
4628
  "package.json"() {
4575
4629
  package_default = {
4576
4630
  name: "claude-use",
4577
- version: "11.61.0",
4631
+ version: "11.62.0",
4578
4632
  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.",
4579
4633
  license: "MIT",
4580
4634
  author: "Joseph Mearman <joseph@mearman.co.uk>",