@narumitw/pi-statusline 0.49.12 → 0.49.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -276,8 +276,10 @@ Open **Advanced → Custom layout** when the curated levels are not enough.
276
276
  | Up/Down in Move mode | Reorder the selected visible segment |
277
277
  | `Alt+Up` / `Alt+Down` | Reorder without entering Move mode |
278
278
  | `B` | Add or remove a line break after the selected segment |
279
- | Escape | Leave Move mode first, then close the screen |
279
+ | Configured Back key (Escape by default) | Leave Move mode first, then close the screen |
280
+ | Ctrl+C | Close the screen immediately, including from Move mode |
280
281
 
282
+ The layout displays the effective Back key and keeps Ctrl+C available when Back is remapped.
281
283
  Every successful change saves and applies immediately; closing the screen does not roll it back.
282
284
 
283
285
  Available data segments:
@@ -1,5 +1,5 @@
1
1
  // @generated by scripts/build-runtime.mjs; do not edit.
2
- // @ts-nocheck -- generated JavaScript uses a .ts extension for Pi's Jiti loader.
2
+ // @ts-nocheck -- the generated entry uses a .ts extension for Pi's Jiti loader.
3
3
 
4
4
  // src/command-contract.ts
5
5
  var STATUSLINE_SUBCOMMANDS = [
@@ -765,4 +765,4 @@ export {
765
765
  removeStatuslineSettingsDocumentIfMatches,
766
766
  consumeStatuslineSettingsNotice
767
767
  };
768
- //# sourceMappingURL=chunk-4PIP7RGK.ts.map
768
+ //# sourceMappingURL=chunk-74QZGJ7L.js.map
@@ -1,5 +1,5 @@
1
1
  // @generated by scripts/build-runtime.mjs; do not edit.
2
- // @ts-nocheck -- generated JavaScript uses a .ts extension for Pi's Jiti loader.
2
+ // @ts-nocheck -- the generated entry uses a .ts extension for Pi's Jiti loader.
3
3
  import {
4
4
  DEFAULT_STATUSLINE_DOCUMENT,
5
5
  INFORMATION_PROFILES,
@@ -13,7 +13,7 @@ import {
13
13
  removeStatuslineSettingsDocumentIfMatches,
14
14
  saveStatuslineSettingsDocument,
15
15
  segmentPaletteForPreset
16
- } from "./chunk-4PIP7RGK.js";
16
+ } from "./chunk-74QZGJ7L.js";
17
17
 
18
18
  // src/commands.ts
19
19
  import {
@@ -27,6 +27,7 @@ import {
27
27
  truncateToWidth,
28
28
  wrapTextWithAnsi
29
29
  } from "@earendil-works/pi-tui";
30
+ import { sanitizeTerminalText } from "@narumitw/pi-tui-kit/terminal-text";
30
31
  var EDIT_SETTINGS_LABEL = "Edit settings JSON";
31
32
  var SEGMENT_VIEWPORT_SIZE = 6;
32
33
  var NARROW_SEGMENT_VIEWPORT_SIZE = 3;
@@ -405,7 +406,7 @@ async function chooseSegments(ctx, options) {
405
406
  }
406
407
  }
407
408
  lines.push("");
408
- const hints = segmentControlHints(safeWidth, moveMode, selected);
409
+ const hints = segmentControlHints(safeWidth, moveMode, selected, keybindings);
409
410
  for (const hint of hints) {
410
411
  lines.push(theme.fg("dim", truncateToWidth(` ${hint}`, safeWidth)));
411
412
  }
@@ -429,6 +430,10 @@ async function chooseSegments(ctx, options) {
429
430
  updateThemedText();
430
431
  },
431
432
  handleInput(data) {
433
+ if (matchesKey(data, Key.ctrl("c"))) {
434
+ done(void 0);
435
+ return;
436
+ }
432
437
  const moveModeKey = matchesKey(data, "m") || matchesKey(data, Key.shift("m"));
433
438
  const lineBreakKey = matchesKey(data, "b") || matchesKey(data, Key.shift("b"));
434
439
  if (matchesKey(data, Key.alt("up"))) {
@@ -550,29 +555,46 @@ function segmentPlacements(segments) {
550
555
  }
551
556
  return placements;
552
557
  }
553
- function segmentControlHints(width, moveMode, selected) {
558
+ function segmentControlHints(width, moveMode, selected, keybindings) {
559
+ const configuredCancel = [
560
+ ...new Set(
561
+ keybindings.getKeys("tui.select.cancel").filter((key) => key !== "ctrl+c").map(displayKey).filter(Boolean)
562
+ )
563
+ ];
564
+ const closeKeys = [.../* @__PURE__ */ new Set([...configuredCancel, "Ctrl+C"])].join("/");
554
565
  if (moveMode) {
566
+ const cancellation = [
567
+ ...configuredCancel.length > 0 ? [`${configuredCancel.join("/")} leave move mode`] : [],
568
+ "Ctrl+C close"
569
+ ].join(" \xB7 ");
555
570
  return width < 30 ? [
556
571
  `Move mode: ${selected ?? "segment"}`,
557
572
  "\u2191\u2193 move segment",
558
573
  "Enter/Space finish",
559
- "Esc leave move mode"
560
- ] : [
561
- `Move mode \u2014 ${selected ?? "segment"}`,
562
- "\u2191\u2193 move \xB7 Enter/Space finish \xB7 Esc leave move mode"
563
- ];
574
+ ...configuredCancel.length > 0 ? [`${configuredCancel.join("/")} leave move mode`] : [],
575
+ "Ctrl+C close"
576
+ ] : [`Move mode \u2014 ${selected ?? "segment"}`, "\u2191\u2193 move \xB7 Enter/Space finish", cancellation];
564
577
  }
565
578
  return width < 30 ? [
566
579
  "\u2191\u2193 navigate",
567
580
  "Enter/Space toggle",
568
581
  "M move \xB7 B line break",
569
582
  "Alt+\u2191/\u2193 quick move",
570
- "Esc close"
583
+ `${closeKeys} close`
571
584
  ] : [
572
585
  "\u2191\u2193 navigate \xB7 Enter/Space show/hide \xB7 M move mode",
573
- "B add/remove line break after \xB7 Alt+\u2191/\u2193 quick move \xB7 Esc close"
586
+ `B add/remove line break after \xB7 Alt+\u2191/\u2193 quick move \xB7 ${closeKeys} close`
574
587
  ];
575
588
  }
589
+ function displayKey(key) {
590
+ return sanitizeTerminalText(key).split("+").map((part) => {
591
+ if (part === "escape") return "Esc";
592
+ if (part === "ctrl") return "Ctrl";
593
+ if (part === "alt") return process.platform === "darwin" ? "Option" : "Alt";
594
+ if (part === "shift") return "Shift";
595
+ return part;
596
+ }).join("+");
597
+ }
576
598
  function segmentsDocument(current, name, shouldShow) {
577
599
  const { parsed, rawDocument: previousDocument } = editableSettings(current, "changing segments");
578
600
  const segments = shouldShow ? [...current.config.segments, ...current.config.segments.includes(name) ? [] : [name]] : current.config.segments.filter((segment) => segment !== name);
@@ -749,4 +771,4 @@ export {
749
771
  handleStatuslineCommand,
750
772
  registerStatuslineCommand
751
773
  };
752
- //# sourceMappingURL=commands-5CMKUNTM.ts.map
774
+ //# sourceMappingURL=commands-C2G2G7C6.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands.ts"],
4
+ "sourcesContent": ["import {\n\tDynamicBorder,\n\ttype ExtensionAPI,\n\ttype ExtensionCommandContext,\n\ttype KeybindingsManager,\n} from \"@earendil-works/pi-coding-agent\";\nimport {\n\tContainer,\n\tKey,\n\tmatchesKey,\n\tText,\n\ttruncateToWidth,\n\twrapTextWithAnsi,\n} from \"@earendil-works/pi-tui\";\nimport { sanitizeTerminalText } from \"@narumitw/pi-tui-kit/terminal-text\";\nimport { completeStatuslineArguments } from \"./command-contract.js\";\nimport {\n\tINFORMATION_PROFILE_NAMES,\n\tINFORMATION_PROFILES,\n\ttype InformationProfileName,\n\tinferInformationProfile,\n} from \"./information-profiles.js\";\nimport { segmentPaletteForPreset } from \"./presets/index.js\";\nimport {\n\tDEFAULT_STATUSLINE_DOCUMENT,\n\ttype LoadedStatuslineSettings,\n\tremoveStatuslineSettingsDocumentIfMatches,\n\tsaveStatuslineSettingsDocument,\n} from \"./settings.js\";\nimport {\n\ttype ConfigSegmentName,\n\tLINE_BREAK_SEGMENT_NAME,\n\tPALETTE_NAMES,\n\tPALETTE_PRESET_NAMES,\n\ttype PaletteName,\n\ttype PalettePreset,\n\tSEGMENT_NAMES,\n\ttype SegmentName,\n} from \"./types.js\";\n\nconst EDIT_SETTINGS_LABEL = \"Edit settings JSON\";\nconst SEGMENT_VIEWPORT_SIZE = 6;\nconst NARROW_SEGMENT_VIEWPORT_SIZE = 3;\nconst SEGMENT_DESCRIPTIONS: Record<SegmentName, string> = {\n\tbrand: \"Pi brand mark\",\n\tprovider: \"Current model provider\",\n\tmodel: \"Current model name\",\n\tthinking: \"Current thinking level\",\n\tcwd: \"Current working directory\",\n\tbranch: \"Git branch, status, and linked pull request\",\n\ttools: \"Current tool and streaming activity\",\n\tcontext: \"Current context-window usage\",\n\ttokens: \"Session token totals\",\n\tcache: \"Prompt-cache reads, writes, and latest hit rate\",\n\tcost: \"Session cost\",\n\ttime: \"Current local time\",\n\tturn: \"Current session turn count\",\n};\ninterface StatuslineMenuOwner {\n\tsignal: AbortSignal;\n\tisCurrent(): boolean;\n}\n\nexport interface StatuslineCommandOptions {\n\tsettingsPath: string;\n\tgetLoaded(): LoadedStatuslineSettings;\n\tapply(loaded: LoadedStatuslineSettings, ctx: ExtensionCommandContext): void;\n\tpreview?(palettePreset: PalettePreset | undefined, ctx: ExtensionCommandContext): void;\n\tsave?: (settingsPath: string, rawDocument: string) => LoadedStatuslineSettings;\n\tgetMenuOwner?(): StatuslineMenuOwner;\n}\n\nexport function registerStatuslineCommand(pi: ExtensionAPI, options: StatuslineCommandOptions) {\n\tpi.registerCommand(\"statusline\", {\n\t\tdescription: \"Open or inspect the statusline settings\",\n\t\tgetArgumentCompletions: completeStatuslineArguments,\n\t\thandler: (args, ctx) => handleStatuslineCommand(args, ctx, options),\n\t});\n}\n\nexport async function handleStatuslineCommand(\n\targs: string,\n\tctx: ExtensionCommandContext,\n\toptions: StatuslineCommandOptions,\n) {\n\tconst normalized = args.trim();\n\tif (!normalized) {\n\t\tawait showMainMenu(ctx, options);\n\t\treturn;\n\t}\n\n\tconst tokens = normalized.split(/\\s+/u);\n\tconst subcommand = tokens[0]?.toLowerCase() ?? \"\";\n\tif (tokens.length > 1) {\n\t\tif (canNotify(ctx)) {\n\t\t\tctx.ui.notify(`/statusline ${subcommand} does not accept trailing arguments.`, \"warning\");\n\t\t}\n\t\treturn;\n\t}\n\n\tswitch (subcommand) {\n\t\tcase \"settings\":\n\t\t\tawait editSettings(ctx, options);\n\t\t\treturn;\n\t\tcase \"status\":\n\t\t\tshowStatus(ctx, options);\n\t\t\treturn;\n\t\tcase \"help\":\n\t\t\tshowHelp(ctx, options.settingsPath);\n\t\t\treturn;\n\t\tdefault:\n\t\t\tif (canNotify(ctx)) {\n\t\t\t\tctx.ui.notify(`Unknown /statusline subcommand: ${subcommand}`, \"warning\");\n\t\t\t}\n\t}\n}\n\nasync function showMainMenu(ctx: ExtensionCommandContext, options: StatuslineCommandOptions) {\n\tif (ctx.mode !== \"tui\") {\n\t\tif (ctx.hasUI) ctx.ui.notify(\"/statusline requires an interactive Pi UI in TUI mode.\", \"error\");\n\t\treturn;\n\t}\n\tconst fallbackController = new AbortController();\n\tconst owner = options.getMenuOwner?.() ?? {\n\t\tsignal: fallbackController.signal,\n\t\tisCurrent: () => !fallbackController.signal.aborted,\n\t};\n\tconst { defineMenu, runMenu } = await import(\"@narumitw/pi-tui-kit\");\n\tif (owner.signal.aborted || !owner.isCurrent()) return;\n\ttype Screen = \"main\" | \"advanced\" | \"information\";\n\ttype Action = \"appearance\" | \"setInformation\" | \"layout\" | \"edit\" | \"status\" | \"help\" | \"back\";\n\tconst menu = defineMenu<undefined, Screen, Action, ExtensionCommandContext>({\n\t\tstart: \"main\",\n\t\tscreens: {\n\t\t\tmain: () => {\n\t\t\t\tconst config = options.getLoaded().config;\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\ttitle: \"pi-statusline\",\n\t\t\t\t\titems: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"appearance\",\n\t\t\t\t\t\t\tlabel: `Appearance (${config.palettePreset})`,\n\t\t\t\t\t\t\taction: \"appearance\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"information\",\n\t\t\t\t\t\t\tlabel: `Information (${inferInformationProfile(config.segments)})`,\n\t\t\t\t\t\t\tto: \"information\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ id: \"advanced\", label: \"Advanced\", to: \"advanced\" },\n\t\t\t\t\t\t{ id: \"status\", label: \"Status\", action: \"status\" },\n\t\t\t\t\t\t{ id: \"help\", label: \"Help\", action: \"help\" },\n\t\t\t\t\t],\n\t\t\t\t\thint: \"close\",\n\t\t\t\t};\n\t\t\t},\n\t\t\tinformation: () => {\n\t\t\t\tconst current = inferInformationProfile(options.getLoaded().config.segments);\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"choice\",\n\t\t\t\t\ttitle: \"Information level\",\n\t\t\t\t\tlines: [`Current profile: ${current}`],\n\t\t\t\t\titems: INFORMATION_PROFILE_NAMES.map((profile) => ({\n\t\t\t\t\t\tid: profile,\n\t\t\t\t\t\tlabel: `${profile[0]?.toUpperCase() ?? \"\"}${profile.slice(1)}`,\n\t\t\t\t\t\tdescription: `${INFORMATION_PROFILES[profile].length} segments`,\n\t\t\t\t\t\tdetails: [`Segments: ${INFORMATION_PROFILES[profile].join(\" \u00B7 \")}`],\n\t\t\t\t\t})),\n\t\t\t\t\taction: \"setInformation\",\n\t\t\t\t\tcurrentItemId: current,\n\t\t\t\t\tinitialItemId: current === \"custom\" ? \"balanced\" : current,\n\t\t\t\t\thint: \"close\",\n\t\t\t\t};\n\t\t\t},\n\t\t\tadvanced: () => {\n\t\t\t\tconst config = options.getLoaded().config;\n\t\t\t\tconst visibleSegmentCount = config.segments.filter(\n\t\t\t\t\t(segment): segment is SegmentName => segment !== LINE_BREAK_SEGMENT_NAME,\n\t\t\t\t).length;\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\ttitle: \"pi-statusline \u2014 Advanced\",\n\t\t\t\t\titems: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"layout\",\n\t\t\t\t\t\t\tlabel: `Custom layout (${visibleSegmentCount}/${SEGMENT_NAMES.length} shown)`,\n\t\t\t\t\t\t\taction: \"layout\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ id: \"edit\", label: EDIT_SETTINGS_LABEL, action: \"edit\" },\n\t\t\t\t\t\t{ id: \"back\", label: \"Back\", action: \"back\" },\n\t\t\t\t\t],\n\t\t\t\t\thint: \"back\",\n\t\t\t\t};\n\t\t\t},\n\t\t},\n\t\tactions: {\n\t\t\tappearance: async () => {\n\t\t\t\tawait choosePalettePreset(ctx, options, owner);\n\t\t\t\treturn { kind: \"close\" };\n\t\t\t},\n\t\t\tsetInformation: async ({ itemId }) => {\n\t\t\t\tconst profile = INFORMATION_PROFILE_NAMES.find((candidate) => candidate === itemId);\n\t\t\t\tif (!profile) return { kind: \"rejected\" };\n\t\t\t\tapplyInformationProfile(ctx, options, profile);\n\t\t\t\treturn { kind: \"close\" };\n\t\t\t},\n\t\t\tlayout: async () => {\n\t\t\t\tawait chooseSegments(ctx, options);\n\t\t\t\treturn { kind: \"close\" };\n\t\t\t},\n\t\t\tedit: async () => {\n\t\t\t\tawait editSettings(ctx, options);\n\t\t\t\treturn { kind: \"close\" };\n\t\t\t},\n\t\t\tstatus: async () => {\n\t\t\t\tshowStatus(ctx, options);\n\t\t\t\treturn { kind: \"close\" };\n\t\t\t},\n\t\t\thelp: async () => {\n\t\t\t\tshowHelp(ctx, options.settingsPath);\n\t\t\t\treturn { kind: \"close\" };\n\t\t\t},\n\t\t\tback: async () => ({ kind: \"back\" }),\n\t\t},\n\t});\n\ttry {\n\t\tawait runMenu(ctx, menu, {\n\t\t\tgetState: () => undefined,\n\t\t\tsignal: owner.signal,\n\t\t\tisCurrent: owner.isCurrent,\n\t\t});\n\t} finally {\n\t\tfallbackController.abort(new DOMException(\"Statusline menu closed\", \"AbortError\"));\n\t}\n}\n\nasync function choosePalettePreset(\n\tctx: ExtensionCommandContext,\n\toptions: StatuslineCommandOptions,\n\towner: StatuslineMenuOwner,\n) {\n\tif (ctx.mode !== \"tui\") {\n\t\tif (ctx.hasUI) ctx.ui.notify(`Edit palettePreset manually: ${options.settingsPath}`, \"info\");\n\t\treturn;\n\t}\n\tconst current = options.getLoaded();\n\tlet selection: PalettePreset | undefined;\n\ttry {\n\t\tselection = await showPalettePresetPicker(ctx, current.config.palettePreset, options, owner);\n\t} finally {\n\t\tif (!owner.signal.aborted && owner.isCurrent()) {\n\t\t\ttry {\n\t\t\t\toptions.preview?.(undefined, ctx);\n\t\t\t} catch (error) {\n\t\t\t\tif (canNotify(ctx)) {\n\t\t\t\t\tctx.ui.notify(`Palette preview could not be reset: ${formatError(error)}`, \"error\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif (owner.signal.aborted || !owner.isCurrent()) return;\n\tif (selection === undefined) return;\n\n\tlet loaded: LoadedStatuslineSettings;\n\ttry {\n\t\tconst rawDocument = palettePresetDocument(current, selection);\n\t\tloaded = (options.save ?? saveStatuslineSettingsDocument)(options.settingsPath, rawDocument);\n\t} catch (error) {\n\t\tctx.ui.notify(`Palette preset was not saved: ${formatError(error)}`, \"error\");\n\t\treturn;\n\t}\n\ttry {\n\t\toptions.apply(loaded, ctx);\n\t} catch (error) {\n\t\tconst rollbackError = restoreStatuslineSettings(ctx, options, current, loaded);\n\t\tctx.ui.notify(\n\t\t\trollbackError\n\t\t\t\t? `Palette preset could not be applied: ${formatError(error)}; rollback failed: ${formatError(rollbackError)}`\n\t\t\t\t: `Palette preset could not be applied: ${formatError(error)}; previous settings restored.`,\n\t\t\t\"error\",\n\t\t);\n\t\treturn;\n\t}\n\tconst message =\n\t\tloaded.config.palettePreset === \"custom\"\n\t\t\t? \"Custom palette applied. Edit colors via /statusline \u2192 Advanced \u2192 Edit settings JSON.\"\n\t\t\t: `Palette preset applied: ${loaded.config.palettePreset}.`;\n\tctx.ui.notify(message, \"info\");\n}\n\nasync function showPalettePresetPicker(\n\tctx: ExtensionCommandContext,\n\tcurrent: PalettePreset,\n\toptions: StatuslineCommandOptions,\n\towner: StatuslineMenuOwner,\n): Promise<PalettePreset | undefined> {\n\tconst { runLiveChoice } = await import(\"@narumitw/pi-tui-kit\");\n\tconst result = await runLiveChoice(ctx, {\n\t\ttitle: `Palette preset (current: ${current})`,\n\t\titems: PALETTE_PRESET_NAMES.map((palettePreset) => ({\n\t\t\tid: palettePreset,\n\t\t\tlabel: palettePreset,\n\t\t\tdescription: palettePreset === \"custom\" ? \"per-segment colors from settings JSON\" : undefined,\n\t\t})),\n\t\tcurrentItemId: current,\n\t\tinitialItemId: current,\n\t\tviewportSize: Math.min(PALETTE_PRESET_NAMES.length, 10),\n\t\thint: \"close\",\n\t\tnavigationLabel: \"preview\",\n\t\tconfirmLabel: \"apply\",\n\t\tonSelectionChange: ({ item }) => options.preview?.(item.id, ctx),\n\t\tsignal: owner.signal,\n\t\tisCurrent: owner.isCurrent,\n\t});\n\treturn result.kind === \"selected\" ? result.itemId : undefined;\n}\n\nfunction applyInformationProfile(\n\tctx: ExtensionCommandContext,\n\toptions: StatuslineCommandOptions,\n\tselection: InformationProfileName,\n) {\n\tconst current = options.getLoaded();\n\ttry {\n\t\tconst change = informationProfileDocument(current, selection);\n\t\tconst loaded = applySegmentsDocumentChange(change, ctx, options);\n\t\tctx.ui.notify(\n\t\t\t`Information level applied: ${inferInformationProfile(loaded.config.segments)}.`,\n\t\t\t\"info\",\n\t\t);\n\t} catch (error) {\n\t\tctx.ui.notify(`Information level was not saved: ${formatError(error)}`, \"error\");\n\t}\n}\n\nasync function chooseSegments(ctx: ExtensionCommandContext, options: StatuslineCommandOptions) {\n\tif (ctx.mode !== \"tui\") {\n\t\tif (ctx.hasUI) ctx.ui.notify(`Edit segments manually: ${options.settingsPath}`, \"info\");\n\t\treturn;\n\t}\n\tlet current = options.getLoaded();\n\tlet names = segmentMenuOrder(current);\n\tlet selectedIndex = 0;\n\tlet moveMode = false;\n\tlet feedback: string | undefined;\n\n\tawait ctx.ui.custom((tui, theme, keybindings, done) => {\n\t\tconst commit = (\n\t\t\tname: SegmentName,\n\t\t\tchange: { nextDocument: string; previousDocument: string },\n\t\t): boolean => {\n\t\t\ttry {\n\t\t\t\tcurrent = applySegmentsDocumentChange(change, ctx, options);\n\t\t\t\tnames = segmentMenuOrder(current);\n\t\t\t\tselectedIndex = Math.max(0, names.indexOf(name));\n\t\t\t\tfeedback = undefined;\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tctx.ui.notify(`Statusline segments were not saved: ${formatError(error)}`, \"error\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t};\n\n\t\tconst toggleSelected = () => {\n\t\t\tconst name = names[selectedIndex];\n\t\t\tif (!name) return;\n\t\t\tmoveMode = false;\n\t\t\tcommit(name, segmentsDocument(current, name, !current.config.segments.includes(name)));\n\t\t};\n\n\t\tconst toggleLineBreakAfterSelected = () => {\n\t\t\tconst name = names[selectedIndex];\n\t\t\tif (!name) return;\n\t\t\tmoveMode = false;\n\t\t\tconst segmentIndex = current.config.segments.indexOf(name);\n\t\t\tif (segmentIndex < 0) {\n\t\t\t\tfeedback = `Show ${name} before adding a line break.`;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst hasLineBreak = current.config.segments[segmentIndex + 1] === LINE_BREAK_SEGMENT_NAME;\n\t\t\tconst hasFollowingSegment = current.config.segments\n\t\t\t\t.slice(segmentIndex + 1)\n\t\t\t\t.some((segment) => segment !== LINE_BREAK_SEGMENT_NAME);\n\t\t\tif (!hasLineBreak && !hasFollowingSegment) {\n\t\t\t\tfeedback = `Add another visible segment after ${name} before adding a line break.`;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcommit(name, lineBreakAfterDocument(current, name));\n\t\t};\n\n\t\tconst reorderSelected = (direction: -1 | 1) => {\n\t\t\tconst name = names[selectedIndex];\n\t\t\tif (!name) return;\n\t\t\tconst visibleNames = visibleSegmentNames(current);\n\t\t\tconst currentIndex = visibleNames.indexOf(name);\n\t\t\tif (currentIndex < 0) {\n\t\t\t\tfeedback = `Show ${name} before moving it.`;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst targetIndex = currentIndex + direction;\n\t\t\tif (targetIndex < 0 || targetIndex >= visibleNames.length) {\n\t\t\t\tfeedback = `${name} is already the ${direction < 0 ? \"first\" : \"last\"} visible segment.`;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst change = reorderedSegmentsDocument(current, name, direction);\n\t\t\tif (change) commit(name, change);\n\t\t};\n\n\t\tconst enterMoveMode = () => {\n\t\t\tconst name = names[selectedIndex];\n\t\t\tif (!name) return;\n\t\t\tif (!current.config.segments.includes(name)) {\n\t\t\t\tfeedback = `Show ${name} before moving it.`;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tmoveMode = true;\n\t\t\tfeedback = undefined;\n\t\t};\n\n\t\tconst moveSelection = (offset: number) => {\n\t\t\tselectedIndex = Math.max(0, Math.min(names.length - 1, selectedIndex + offset));\n\t\t\tfeedback = undefined;\n\t\t};\n\n\t\tconst renderList = (width: number): string[] => {\n\t\t\tconst safeWidth = Math.max(1, width);\n\t\t\tconst visibleNames = visibleSegmentNames(current);\n\t\t\tconst visible = new Set(visibleNames);\n\t\t\tconst placements = segmentPlacements(current.config.segments);\n\t\t\tconst viewportSize = safeWidth < 30 ? NARROW_SEGMENT_VIEWPORT_SIZE : SEGMENT_VIEWPORT_SIZE;\n\t\t\tconst startIndex = Math.max(\n\t\t\t\t0,\n\t\t\t\tMath.min(\n\t\t\t\t\tselectedIndex - Math.floor(viewportSize / 2),\n\t\t\t\t\tMath.max(0, names.length - viewportSize),\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst endIndex = Math.min(names.length, startIndex + viewportSize);\n\t\t\tconst lines: string[] = [];\n\t\t\tlet previousSection: \"visible\" | \"hidden\" | undefined;\n\t\t\tfor (let index = startIndex; index < endIndex; index += 1) {\n\t\t\t\tconst name = names[index];\n\t\t\t\tif (!name) continue;\n\t\t\t\tconst section = visible.has(name) ? \"visible\" : \"hidden\";\n\t\t\t\tif (section !== previousSection) {\n\t\t\t\t\tconst heading =\n\t\t\t\t\t\tsection === \"visible\" ? \"Visible \u2014 render order\" : \"Hidden \u2014 not rendered\";\n\t\t\t\t\tlines.push(theme.fg(\"muted\", theme.bold(truncateToWidth(` ${heading}`, safeWidth))));\n\t\t\t\t\tpreviousSection = section;\n\t\t\t\t}\n\t\t\t\tconst isSelected = index === selectedIndex;\n\t\t\t\tconst prefix = isSelected ? \"\u2192 \" : \" \";\n\t\t\t\tconst placement = placements.get(name);\n\t\t\t\tconst lineBreakLabel = hasLineBreakAfter(current.config.segments, name)\n\t\t\t\t\t? \" \u00B7 break after\"\n\t\t\t\t\t: \"\";\n\t\t\t\tconst row = placement\n\t\t\t\t\t? `${prefix}${`${placement.order}.`.padStart(3)} row ${placement.row} \u00B7 ${name.padEnd(8)} \u00B7 visible${lineBreakLabel}`\n\t\t\t\t\t: `${prefix} \u00B7 ${name.padEnd(8)} \u00B7 hidden`;\n\t\t\t\tconst truncated = truncateToWidth(row, safeWidth);\n\t\t\t\tif (isSelected) lines.push(theme.fg(\"accent\", truncated));\n\t\t\t\telse lines.push(section === \"visible\" ? truncated : theme.fg(\"muted\", truncated));\n\t\t\t}\n\t\t\tif (startIndex > 0 || endIndex < names.length) {\n\t\t\t\tlines.push(\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\ttruncateToWidth(` (${startIndex + 1}-${endIndex}/${names.length})`, safeWidth),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst selected = names[selectedIndex];\n\t\t\tif (selected) {\n\t\t\t\tlines.push(\"\");\n\t\t\t\tconst detail = feedback ?? SEGMENT_DESCRIPTIONS[selected];\n\t\t\t\tconst color = feedback ? \"warning\" : \"muted\";\n\t\t\t\tfor (const line of wrapTextWithAnsi(detail, Math.max(1, safeWidth - 2))) {\n\t\t\t\t\tlines.push(theme.fg(color, truncateToWidth(` ${line}`, safeWidth)));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlines.push(\"\");\n\t\t\tconst hints = segmentControlHints(safeWidth, moveMode, selected, keybindings);\n\t\t\tfor (const hint of hints) {\n\t\t\t\tlines.push(theme.fg(\"dim\", truncateToWidth(` ${hint}`, safeWidth)));\n\t\t\t}\n\t\t\treturn lines;\n\t\t};\n\n\t\tconst container = new Container();\n\t\tcontainer.addChild(new DynamicBorder((text: string) => theme.fg(\"accent\", text)));\n\t\tconst title = new Text(\"\", 1, 0);\n\t\tcontainer.addChild(title);\n\t\tcontainer.addChild({ render: renderList, invalidate() {} });\n\t\tcontainer.addChild(new DynamicBorder((text: string) => theme.fg(\"accent\", text)));\n\t\tconst updateThemedText = () => {\n\t\t\ttitle.setText(theme.fg(\"accent\", theme.bold(\"Statusline segments\")));\n\t\t};\n\t\tupdateThemedText();\n\n\t\treturn {\n\t\t\trender: (width: number) => container.render(width),\n\t\t\tinvalidate() {\n\t\t\t\tcontainer.invalidate();\n\t\t\t\tupdateThemedText();\n\t\t\t},\n\t\t\thandleInput(data: string) {\n\t\t\t\tif (matchesKey(data, Key.ctrl(\"c\"))) {\n\t\t\t\t\tdone(undefined);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst moveModeKey = matchesKey(data, \"m\") || matchesKey(data, Key.shift(\"m\"));\n\t\t\t\tconst lineBreakKey = matchesKey(data, \"b\") || matchesKey(data, Key.shift(\"b\"));\n\t\t\t\tif (matchesKey(data, Key.alt(\"up\"))) {\n\t\t\t\t\treorderSelected(-1);\n\t\t\t\t} else if (matchesKey(data, Key.alt(\"down\"))) {\n\t\t\t\t\treorderSelected(1);\n\t\t\t\t} else if (moveMode) {\n\t\t\t\t\tif (keybindings.matches(data, \"tui.select.up\")) {\n\t\t\t\t\t\treorderSelected(-1);\n\t\t\t\t\t} else if (keybindings.matches(data, \"tui.select.down\")) {\n\t\t\t\t\t\treorderSelected(1);\n\t\t\t\t\t} else if (\n\t\t\t\t\t\tmoveModeKey ||\n\t\t\t\t\t\tkeybindings.matches(data, \"tui.select.confirm\") ||\n\t\t\t\t\t\tdata === \" \" ||\n\t\t\t\t\t\tkeybindings.matches(data, \"tui.select.cancel\")\n\t\t\t\t\t) {\n\t\t\t\t\t\tmoveMode = false;\n\t\t\t\t\t\tfeedback = undefined;\n\t\t\t\t\t}\n\t\t\t\t} else if (keybindings.matches(data, \"tui.select.up\")) {\n\t\t\t\t\tselectedIndex = selectedIndex === 0 ? names.length - 1 : selectedIndex - 1;\n\t\t\t\t\tfeedback = undefined;\n\t\t\t\t} else if (keybindings.matches(data, \"tui.select.down\")) {\n\t\t\t\t\tselectedIndex = selectedIndex === names.length - 1 ? 0 : selectedIndex + 1;\n\t\t\t\t\tfeedback = undefined;\n\t\t\t\t} else if (keybindings.matches(data, \"tui.select.pageUp\")) {\n\t\t\t\t\tmoveSelection(-SEGMENT_VIEWPORT_SIZE);\n\t\t\t\t} else if (keybindings.matches(data, \"tui.select.pageDown\")) {\n\t\t\t\t\tmoveSelection(SEGMENT_VIEWPORT_SIZE);\n\t\t\t\t} else if (moveModeKey) {\n\t\t\t\t\tenterMoveMode();\n\t\t\t\t} else if (lineBreakKey) {\n\t\t\t\t\ttoggleLineBreakAfterSelected();\n\t\t\t\t} else if (keybindings.matches(data, \"tui.select.confirm\") || data === \" \") {\n\t\t\t\t\ttoggleSelected();\n\t\t\t\t} else if (keybindings.matches(data, \"tui.select.cancel\")) {\n\t\t\t\t\tdone(undefined);\n\t\t\t\t}\n\t\t\t\ttui.requestRender();\n\t\t\t},\n\t\t};\n\t});\n}\n\nasync function editSettings(ctx: ExtensionCommandContext, options: StatuslineCommandOptions) {\n\tif (ctx.mode !== \"tui\") {\n\t\tif (ctx.hasUI) ctx.ui.notify(`Edit settings manually: ${options.settingsPath}`, \"info\");\n\t\treturn;\n\t}\n\tconst current = options.getLoaded();\n\tconst edited = await ctx.ui.editor(\n\t\t\"pi-statusline.json \u2014 save and close to apply\",\n\t\tcurrent.rawDocument ?? DEFAULT_STATUSLINE_DOCUMENT,\n\t);\n\tif (edited === undefined) return;\n\tlet loaded: LoadedStatuslineSettings;\n\ttry {\n\t\tloaded = (options.save ?? saveStatuslineSettingsDocument)(options.settingsPath, edited);\n\t} catch (error) {\n\t\tctx.ui.notify(`pi-statusline settings were not saved: ${formatError(error)}`, \"error\");\n\t\treturn;\n\t}\n\ttry {\n\t\toptions.apply(loaded, ctx);\n\t} catch (error) {\n\t\tconst rollbackError = restoreStatuslineSettings(ctx, options, current, loaded);\n\t\tctx.ui.notify(\n\t\t\trollbackError\n\t\t\t\t? `pi-statusline settings could not be applied: ${formatError(error)}; rollback failed: ${formatError(rollbackError)}`\n\t\t\t\t: `pi-statusline settings could not be applied: ${formatError(error)}; previous settings restored.`,\n\t\t\t\"error\",\n\t\t);\n\t\treturn;\n\t}\n\tconst suffix =\n\t\tloaded.diagnostics.length > 0\n\t\t\t? ` (${loaded.diagnostics.length} warning${loaded.diagnostics.length === 1 ? \"\" : \"s\"})`\n\t\t\t: \"\";\n\tctx.ui.notify(`pi-statusline settings saved and applied${suffix}.`, \"info\");\n}\n\nfunction palettePresetDocument(\n\tcurrent: LoadedStatuslineSettings,\n\tpalettePreset: PalettePreset,\n): string {\n\tconst { parsed } = editableSettings(current, \"choosing a palette preset\");\n\tif (palettePreset === \"custom\" && !isRecord(parsed.palette)) {\n\t\tconst seedPreset = isPaletteName(current.config.palettePreset)\n\t\t\t? current.config.palettePreset\n\t\t\t: \"tokyo-night\";\n\t\tparsed.palette = segmentPaletteForPreset(seedPreset);\n\t} else if (palettePreset !== \"custom\" && typeof parsed.palette === \"string\") {\n\t\tdelete parsed.palette;\n\t}\n\tparsed.palettePreset = palettePreset;\n\treturn `${JSON.stringify(parsed, null, \"\\t\")}\\n`;\n}\n\nfunction informationProfileDocument(\n\tcurrent: LoadedStatuslineSettings,\n\tprofile: InformationProfileName,\n): { nextDocument: string; previousDocument: string } {\n\tconst { parsed, rawDocument: previousDocument } = editableSettings(\n\t\tcurrent,\n\t\t\"changing information level\",\n\t);\n\tparsed.segments = [...INFORMATION_PROFILES[profile]];\n\treturn {\n\t\tnextDocument: `${JSON.stringify(parsed, null, \"\\t\")}\\n`,\n\t\tpreviousDocument,\n\t};\n}\n\nfunction visibleSegmentNames(current: LoadedStatuslineSettings): SegmentName[] {\n\treturn current.config.segments.filter(\n\t\t(segment): segment is SegmentName => segment !== LINE_BREAK_SEGMENT_NAME,\n\t);\n}\n\nfunction segmentMenuOrder(current: LoadedStatuslineSettings): SegmentName[] {\n\tconst visible = visibleSegmentNames(current);\n\tconst visibleSet = new Set(visible);\n\treturn [...visible, ...SEGMENT_NAMES.filter((name) => !visibleSet.has(name))];\n}\n\nfunction hasLineBreakAfter(segments: readonly ConfigSegmentName[], name: SegmentName): boolean {\n\tconst index = segments.indexOf(name);\n\treturn index >= 0 && segments[index + 1] === LINE_BREAK_SEGMENT_NAME;\n}\n\nfunction segmentPlacements(\n\tsegments: readonly ConfigSegmentName[],\n): Map<SegmentName, { order: number; row: number }> {\n\tconst placements = new Map<SegmentName, { order: number; row: number }>();\n\tlet order = 0;\n\tlet row = 1;\n\tfor (const segment of segments) {\n\t\tif (segment === LINE_BREAK_SEGMENT_NAME) {\n\t\t\trow += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tplacements.set(segment, { order: ++order, row });\n\t}\n\treturn placements;\n}\n\nfunction segmentControlHints(\n\twidth: number,\n\tmoveMode: boolean,\n\tselected: SegmentName | undefined,\n\tkeybindings: Pick<KeybindingsManager, \"getKeys\">,\n): string[] {\n\tconst configuredCancel = [\n\t\t...new Set(\n\t\t\tkeybindings\n\t\t\t\t.getKeys(\"tui.select.cancel\")\n\t\t\t\t.filter((key) => key !== \"ctrl+c\")\n\t\t\t\t.map(displayKey)\n\t\t\t\t.filter(Boolean),\n\t\t),\n\t];\n\tconst closeKeys = [...new Set([...configuredCancel, \"Ctrl+C\"])].join(\"/\");\n\tif (moveMode) {\n\t\tconst cancellation = [\n\t\t\t...(configuredCancel.length > 0 ? [`${configuredCancel.join(\"/\")} leave move mode`] : []),\n\t\t\t\"Ctrl+C close\",\n\t\t].join(\" \u00B7 \");\n\t\treturn width < 30\n\t\t\t? [\n\t\t\t\t\t`Move mode: ${selected ?? \"segment\"}`,\n\t\t\t\t\t\"\u2191\u2193 move segment\",\n\t\t\t\t\t\"Enter/Space finish\",\n\t\t\t\t\t...(configuredCancel.length > 0 ? [`${configuredCancel.join(\"/\")} leave move mode`] : []),\n\t\t\t\t\t\"Ctrl+C close\",\n\t\t\t\t]\n\t\t\t: [`Move mode \u2014 ${selected ?? \"segment\"}`, \"\u2191\u2193 move \u00B7 Enter/Space finish\", cancellation];\n\t}\n\treturn width < 30\n\t\t? [\n\t\t\t\t\"\u2191\u2193 navigate\",\n\t\t\t\t\"Enter/Space toggle\",\n\t\t\t\t\"M move \u00B7 B line break\",\n\t\t\t\t\"Alt+\u2191/\u2193 quick move\",\n\t\t\t\t`${closeKeys} close`,\n\t\t\t]\n\t\t: [\n\t\t\t\t\"\u2191\u2193 navigate \u00B7 Enter/Space show/hide \u00B7 M move mode\",\n\t\t\t\t`B add/remove line break after \u00B7 Alt+\u2191/\u2193 quick move \u00B7 ${closeKeys} close`,\n\t\t\t];\n}\n\nfunction displayKey(key: string): string {\n\treturn sanitizeTerminalText(key)\n\t\t.split(\"+\")\n\t\t.map((part) => {\n\t\t\tif (part === \"escape\") return \"Esc\";\n\t\t\tif (part === \"ctrl\") return \"Ctrl\";\n\t\t\tif (part === \"alt\") return process.platform === \"darwin\" ? \"Option\" : \"Alt\";\n\t\t\tif (part === \"shift\") return \"Shift\";\n\t\t\treturn part;\n\t\t})\n\t\t.join(\"+\");\n}\n\nfunction segmentsDocument(\n\tcurrent: LoadedStatuslineSettings,\n\tname: SegmentName,\n\tshouldShow: boolean,\n): { nextDocument: string; previousDocument: string } {\n\tconst { parsed, rawDocument: previousDocument } = editableSettings(current, \"changing segments\");\n\tconst segments = shouldShow\n\t\t? [...current.config.segments, ...(current.config.segments.includes(name) ? [] : [name])]\n\t\t: current.config.segments.filter((segment) => segment !== name);\n\tparsed.segments = normalizeLineBreaks(segments);\n\treturn {\n\t\tnextDocument: `${JSON.stringify(parsed, null, \"\\t\")}\\n`,\n\t\tpreviousDocument,\n\t};\n}\n\nfunction lineBreakAfterDocument(\n\tcurrent: LoadedStatuslineSettings,\n\tname: SegmentName,\n): { nextDocument: string; previousDocument: string } {\n\tconst { parsed, rawDocument: previousDocument } = editableSettings(\n\t\tcurrent,\n\t\t\"changing line breaks\",\n\t);\n\tconst segments = [...current.config.segments];\n\tconst segmentIndex = segments.indexOf(name);\n\tif (segments[segmentIndex + 1] === LINE_BREAK_SEGMENT_NAME) {\n\t\tsegments.splice(segmentIndex + 1, 1);\n\t} else {\n\t\tsegments.splice(segmentIndex + 1, 0, LINE_BREAK_SEGMENT_NAME);\n\t}\n\tparsed.segments = segments;\n\treturn {\n\t\tnextDocument: `${JSON.stringify(parsed, null, \"\\t\")}\\n`,\n\t\tpreviousDocument,\n\t};\n}\n\nfunction reorderedSegmentsDocument(\n\tcurrent: LoadedStatuslineSettings,\n\tname: SegmentName,\n\tdirection: -1 | 1,\n): { nextDocument: string; previousDocument: string } | undefined {\n\tconst dataIndexes = current.config.segments.flatMap((segment, index) =>\n\t\tsegment === LINE_BREAK_SEGMENT_NAME ? [] : [index],\n\t);\n\tconst currentDataIndex = dataIndexes.findIndex(\n\t\t(index) => current.config.segments[index] === name,\n\t);\n\tconst targetDataIndex = currentDataIndex + direction;\n\tif (currentDataIndex < 0 || targetDataIndex < 0 || targetDataIndex >= dataIndexes.length) {\n\t\treturn undefined;\n\t}\n\tconst { parsed, rawDocument: previousDocument } = editableSettings(\n\t\tcurrent,\n\t\t\"reordering segments\",\n\t);\n\tconst segments = [...current.config.segments];\n\tconst currentIndex = dataIndexes[currentDataIndex];\n\tconst targetIndex = dataIndexes[targetDataIndex];\n\tif (currentIndex === undefined || targetIndex === undefined) return undefined;\n\t[segments[currentIndex], segments[targetIndex]] = [segments[targetIndex], segments[currentIndex]];\n\tparsed.segments = segments;\n\treturn {\n\t\tnextDocument: `${JSON.stringify(parsed, null, \"\\t\")}\\n`,\n\t\tpreviousDocument,\n\t};\n}\n\nfunction applySegmentsDocumentChange(\n\tchange: { nextDocument: string; previousDocument: string },\n\tctx: ExtensionCommandContext,\n\toptions: StatuslineCommandOptions,\n): LoadedStatuslineSettings {\n\tconst previous = options.getLoaded();\n\tconst save = options.save ?? saveStatuslineSettingsDocument;\n\tconst next = save(options.settingsPath, change.nextDocument);\n\ttry {\n\t\toptions.apply(next, ctx);\n\t} catch (applyError) {\n\t\tconst rollbackError = restoreStatuslineSettings(ctx, options, previous, next);\n\t\tif (rollbackError) {\n\t\t\tthrow new Error(\n\t\t\t\t`runtime update failed: ${formatError(applyError)}; rollback failed: ${formatError(rollbackError)}`,\n\t\t\t);\n\t\t}\n\t\tthrow applyError;\n\t}\n\treturn next;\n}\n\nfunction restoreStatuslineSettings(\n\tctx: ExtensionCommandContext,\n\toptions: StatuslineCommandOptions,\n\tprevious: LoadedStatuslineSettings,\n\tsaved: LoadedStatuslineSettings,\n): unknown {\n\ttry {\n\t\tif (saved.rawDocument === undefined || saved.fileIdentity === undefined) {\n\t\t\tthrow new Error(\"The saved settings document identity is unavailable\");\n\t\t}\n\t\tremoveStatuslineSettingsDocumentIfMatches(\n\t\t\toptions.settingsPath,\n\t\t\tsaved.rawDocument,\n\t\t\tsaved.fileIdentity,\n\t\t);\n\t\tif (previous.rawDocument === undefined || previous.settingsPath !== options.settingsPath) {\n\t\t\toptions.apply(previous, ctx);\n\t\t\treturn undefined;\n\t\t}\n\t\tconst restored = (options.save ?? saveStatuslineSettingsDocument)(\n\t\t\toptions.settingsPath,\n\t\t\tprevious.rawDocument,\n\t\t);\n\t\toptions.apply(restored, ctx);\n\t\treturn undefined;\n\t} catch (error) {\n\t\treturn error;\n\t}\n}\n\nfunction normalizeLineBreaks(segments: readonly ConfigSegmentName[]): ConfigSegmentName[] {\n\tconst normalized: ConfigSegmentName[] = [];\n\tfor (const segment of segments) {\n\t\tif (\n\t\t\tsegment === LINE_BREAK_SEGMENT_NAME &&\n\t\t\t(normalized.length === 0 || normalized.at(-1) === LINE_BREAK_SEGMENT_NAME)\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\t\tnormalized.push(segment);\n\t}\n\tif (normalized.at(-1) === LINE_BREAK_SEGMENT_NAME) normalized.pop();\n\treturn normalized;\n}\n\nfunction editableSettings(\n\tcurrent: LoadedStatuslineSettings,\n\taction: string,\n): { parsed: Record<string, unknown>; rawDocument: string } {\n\tconst rawDocument =\n\t\tcurrent.source === \"user\" && current.rawDocument !== undefined\n\t\t\t? current.rawDocument\n\t\t\t: current.source === \"built-in\" &&\n\t\t\t\t\tcurrent.rawDocument === undefined &&\n\t\t\t\t\tcurrent.diagnostics.length === 0\n\t\t\t\t? DEFAULT_STATUSLINE_DOCUMENT\n\t\t\t\t: undefined;\n\tif (rawDocument === undefined || current.diagnostics.some((item) => item.code !== \"unknown\")) {\n\t\tthrow new Error(`Fix pi-statusline.json before ${action}`);\n\t}\n\tconst parsed = JSON.parse(rawDocument) as unknown;\n\tif (!isRecord(parsed)) throw new Error(\"Settings must contain a JSON object\");\n\treturn { parsed, rawDocument };\n}\n\nfunction showStatus(ctx: ExtensionCommandContext, options: StatuslineCommandOptions) {\n\tif (!canNotify(ctx)) return;\n\tconst loaded = options.getLoaded();\n\tconst diagnostics = loaded.diagnostics\n\t\t.slice(0, 5)\n\t\t.map((item) => `${item.path || \"root\"}: ${item.message}`)\n\t\t.join(\"; \");\n\tctx.ui.notify(\n\t\t[\n\t\t\t`pi-statusline source: ${loaded.source}`,\n\t\t\t`active path: ${loaded.settingsPath}`,\n\t\t\t`save target: ${options.settingsPath}`,\n\t\t\t`palette preset: ${loaded.config.palettePreset}`,\n\t\t\t`density: ${loaded.config.density}`,\n\t\t\t`separator: ${loaded.config.separator}`,\n\t\t\t`information: ${inferInformationProfile(loaded.config.segments)}`,\n\t\t\t`segments: ${loaded.config.segments.join(\", \") || \"none\"}`,\n\t\t\tdiagnostics ? `warnings: ${diagnostics}` : \"warnings: none\",\n\t\t].join(\"\\n\"),\n\t\tloaded.diagnostics.length > 0 ? \"warning\" : \"info\",\n\t);\n}\n\nfunction showHelp(ctx: ExtensionCommandContext, settingsPath: string) {\n\tif (!canNotify(ctx)) return;\n\tctx.ui.notify(\n\t\t[\n\t\t\t\"/statusline \u2014 open Appearance, Information, Advanced, Status, and Help\",\n\t\t\t\"/statusline settings \u2014 edit and apply JSON\",\n\t\t\t\"/statusline status \u2014 show source, path, information level, and warnings\",\n\t\t\t\"/statusline help \u2014 show this help\",\n\t\t\t\"Menu actions: Appearance, Information, Advanced, Status, Help.\",\n\t\t\t\"Information levels: minimal, balanced, detailed; any other segment array is custom.\",\n\t\t\t\"Advanced actions: Custom layout, Edit settings JSON, Back.\",\n\t\t\t`Settings: ${settingsPath}`,\n\t\t\t\"Fields: palettePreset, palette, density, separator, segments, segmentText, extensionStatusIcons\",\n\t\t\t\"Named presets ignore but preserve palette; custom uses its per-segment fg/bg colors.\",\n\t\t\t\"Responsive rows retain context, model, location, and active work before decorative data.\",\n\t\t\t\"Custom layout can show, hide, reorder, or split data segments across rows.\",\n\t\t\t\"Press M for move mode, Alt+Up/Alt+Down for quick move, and B for a line break.\",\n\t\t\t\"Line breaks (line_break) may repeat when separated by data segments, but cannot be consecutive.\",\n\t\t\t\"segmentText supports prefix and suffix strings around Pi-owned dynamic values.\",\n\t\t\t\"segmentText.model also supports truncationLength, truncationSymbol, and truncationDirection (start, middle, end).\",\n\t\t].join(\"\\n\"),\n\t\t\"info\",\n\t);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isPaletteName(value: PalettePreset): value is PaletteName {\n\treturn (PALETTE_NAMES as readonly PalettePreset[]).includes(value);\n}\n\nfunction canNotify(ctx: ExtensionCommandContext): boolean {\n\treturn ctx.mode === \"tui\" || ctx.hasUI;\n}\n\nfunction formatError(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/dist/index.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  // @generated by scripts/build-runtime.mjs; do not edit.
2
- // @ts-nocheck -- generated JavaScript uses a .ts extension for Pi's Jiti loader.
2
+ // @ts-nocheck -- the generated entry uses a .ts extension for Pi's Jiti loader.
3
3
  import {
4
4
  DEFAULT_EXTENSION_STATUS_ICONS,
5
5
  LINE_BREAK_SEGMENT_NAME,
@@ -9,7 +9,7 @@ import {
9
9
  loadStatuslineSettingsForAgent,
10
10
  resolvePreset,
11
11
  settingsFilePath
12
- } from "./chunks/chunk-4PIP7RGK.js";
12
+ } from "./chunks/chunk-74QZGJ7L.js";
13
13
 
14
14
  // src/statusline.ts
15
15
  import { homedir } from "node:os";
@@ -788,7 +788,7 @@ var EMPTY_EXTENSION_STATUS_ICON_ALIASES2 = /* @__PURE__ */ new Map();
788
788
  var statuslineCommandsPromise;
789
789
  function loadStatuslineCommands() {
790
790
  if (!statuslineCommandsPromise) {
791
- statuslineCommandsPromise = import("./chunks/commands-5CMKUNTM.js").catch((error) => {
791
+ statuslineCommandsPromise = import("./chunks/commands-C2G2G7C6.js").catch((error) => {
792
792
  statuslineCommandsPromise = void 0;
793
793
  throw error;
794
794
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@narumitw/pi-statusline",
3
- "version": "0.49.12",
3
+ "version": "0.49.14",
4
4
  "description": "Pi extension that replaces the footer with an information-rich statusline.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -38,9 +38,9 @@
38
38
  "@earendil-works/pi-tui": "*"
39
39
  },
40
40
  "devDependencies": {
41
- "@biomejs/biome": "2.5.9",
42
- "@earendil-works/pi-coding-agent": "0.84.2",
43
- "@earendil-works/pi-tui": "0.84.2",
41
+ "@biomejs/biome": "2.5.10",
42
+ "@earendil-works/pi-coding-agent": "0.84.3",
43
+ "@earendil-works/pi-tui": "0.84.3",
44
44
  "@types/node": "26.2.0",
45
45
  "esbuild": "0.28.2",
46
46
  "typescript": "7.0.2"
@@ -51,6 +51,6 @@
51
51
  "directory": "packages/pi-statusline"
52
52
  },
53
53
  "dependencies": {
54
- "@narumitw/pi-tui-kit": "^0.57.0"
54
+ "@narumitw/pi-tui-kit": "^0.58.1"
55
55
  }
56
56
  }
package/src/commands.ts CHANGED
@@ -2,6 +2,7 @@ import {
2
2
  DynamicBorder,
3
3
  type ExtensionAPI,
4
4
  type ExtensionCommandContext,
5
+ type KeybindingsManager,
5
6
  } from "@earendil-works/pi-coding-agent";
6
7
  import {
7
8
  Container,
@@ -11,6 +12,7 @@ import {
11
12
  truncateToWidth,
12
13
  wrapTextWithAnsi,
13
14
  } from "@earendil-works/pi-tui";
15
+ import { sanitizeTerminalText } from "@narumitw/pi-tui-kit/terminal-text";
14
16
  import { completeStatuslineArguments } from "./command-contract.js";
15
17
  import {
16
18
  INFORMATION_PROFILE_NAMES,
@@ -480,7 +482,7 @@ async function chooseSegments(ctx: ExtensionCommandContext, options: StatuslineC
480
482
  }
481
483
 
482
484
  lines.push("");
483
- const hints = segmentControlHints(safeWidth, moveMode, selected);
485
+ const hints = segmentControlHints(safeWidth, moveMode, selected, keybindings);
484
486
  for (const hint of hints) {
485
487
  lines.push(theme.fg("dim", truncateToWidth(` ${hint}`, safeWidth)));
486
488
  }
@@ -505,6 +507,10 @@ async function chooseSegments(ctx: ExtensionCommandContext, options: StatuslineC
505
507
  updateThemedText();
506
508
  },
507
509
  handleInput(data: string) {
510
+ if (matchesKey(data, Key.ctrl("c"))) {
511
+ done(undefined);
512
+ return;
513
+ }
508
514
  const moveModeKey = matchesKey(data, "m") || matchesKey(data, Key.shift("m"));
509
515
  const lineBreakKey = matchesKey(data, "b") || matchesKey(data, Key.shift("b"));
510
516
  if (matchesKey(data, Key.alt("up"))) {
@@ -656,19 +662,32 @@ function segmentControlHints(
656
662
  width: number,
657
663
  moveMode: boolean,
658
664
  selected: SegmentName | undefined,
665
+ keybindings: Pick<KeybindingsManager, "getKeys">,
659
666
  ): string[] {
667
+ const configuredCancel = [
668
+ ...new Set(
669
+ keybindings
670
+ .getKeys("tui.select.cancel")
671
+ .filter((key) => key !== "ctrl+c")
672
+ .map(displayKey)
673
+ .filter(Boolean),
674
+ ),
675
+ ];
676
+ const closeKeys = [...new Set([...configuredCancel, "Ctrl+C"])].join("/");
660
677
  if (moveMode) {
678
+ const cancellation = [
679
+ ...(configuredCancel.length > 0 ? [`${configuredCancel.join("/")} leave move mode`] : []),
680
+ "Ctrl+C close",
681
+ ].join(" · ");
661
682
  return width < 30
662
683
  ? [
663
684
  `Move mode: ${selected ?? "segment"}`,
664
685
  "↑↓ move segment",
665
686
  "Enter/Space finish",
666
- "Esc leave move mode",
687
+ ...(configuredCancel.length > 0 ? [`${configuredCancel.join("/")} leave move mode`] : []),
688
+ "Ctrl+C close",
667
689
  ]
668
- : [
669
- `Move mode — ${selected ?? "segment"}`,
670
- "↑↓ move · Enter/Space finish · Esc leave move mode",
671
- ];
690
+ : [`Move mode — ${selected ?? "segment"}`, "↑↓ move · Enter/Space finish", cancellation];
672
691
  }
673
692
  return width < 30
674
693
  ? [
@@ -676,14 +695,27 @@ function segmentControlHints(
676
695
  "Enter/Space toggle",
677
696
  "M move · B line break",
678
697
  "Alt+↑/↓ quick move",
679
- "Esc close",
698
+ `${closeKeys} close`,
680
699
  ]
681
700
  : [
682
701
  "↑↓ navigate · Enter/Space show/hide · M move mode",
683
- "B add/remove line break after · Alt+↑/↓ quick move · Esc close",
702
+ `B add/remove line break after · Alt+↑/↓ quick move · ${closeKeys} close`,
684
703
  ];
685
704
  }
686
705
 
706
+ function displayKey(key: string): string {
707
+ return sanitizeTerminalText(key)
708
+ .split("+")
709
+ .map((part) => {
710
+ if (part === "escape") return "Esc";
711
+ if (part === "ctrl") return "Ctrl";
712
+ if (part === "alt") return process.platform === "darwin" ? "Option" : "Alt";
713
+ if (part === "shift") return "Shift";
714
+ return part;
715
+ })
716
+ .join("+");
717
+ }
718
+
687
719
  function segmentsDocument(
688
720
  current: LoadedStatuslineSettings,
689
721
  name: SegmentName,
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/commands.ts"],
4
- "sourcesContent": ["import {\n\tDynamicBorder,\n\ttype ExtensionAPI,\n\ttype ExtensionCommandContext,\n} from \"@earendil-works/pi-coding-agent\";\nimport {\n\tContainer,\n\tKey,\n\tmatchesKey,\n\tText,\n\ttruncateToWidth,\n\twrapTextWithAnsi,\n} from \"@earendil-works/pi-tui\";\nimport { completeStatuslineArguments } from \"./command-contract.js\";\nimport {\n\tINFORMATION_PROFILE_NAMES,\n\tINFORMATION_PROFILES,\n\ttype InformationProfileName,\n\tinferInformationProfile,\n} from \"./information-profiles.js\";\nimport { segmentPaletteForPreset } from \"./presets/index.js\";\nimport {\n\tDEFAULT_STATUSLINE_DOCUMENT,\n\ttype LoadedStatuslineSettings,\n\tremoveStatuslineSettingsDocumentIfMatches,\n\tsaveStatuslineSettingsDocument,\n} from \"./settings.js\";\nimport {\n\ttype ConfigSegmentName,\n\tLINE_BREAK_SEGMENT_NAME,\n\tPALETTE_NAMES,\n\tPALETTE_PRESET_NAMES,\n\ttype PaletteName,\n\ttype PalettePreset,\n\tSEGMENT_NAMES,\n\ttype SegmentName,\n} from \"./types.js\";\n\nconst EDIT_SETTINGS_LABEL = \"Edit settings JSON\";\nconst SEGMENT_VIEWPORT_SIZE = 6;\nconst NARROW_SEGMENT_VIEWPORT_SIZE = 3;\nconst SEGMENT_DESCRIPTIONS: Record<SegmentName, string> = {\n\tbrand: \"Pi brand mark\",\n\tprovider: \"Current model provider\",\n\tmodel: \"Current model name\",\n\tthinking: \"Current thinking level\",\n\tcwd: \"Current working directory\",\n\tbranch: \"Git branch, status, and linked pull request\",\n\ttools: \"Current tool and streaming activity\",\n\tcontext: \"Current context-window usage\",\n\ttokens: \"Session token totals\",\n\tcache: \"Prompt-cache reads, writes, and latest hit rate\",\n\tcost: \"Session cost\",\n\ttime: \"Current local time\",\n\tturn: \"Current session turn count\",\n};\ninterface StatuslineMenuOwner {\n\tsignal: AbortSignal;\n\tisCurrent(): boolean;\n}\n\nexport interface StatuslineCommandOptions {\n\tsettingsPath: string;\n\tgetLoaded(): LoadedStatuslineSettings;\n\tapply(loaded: LoadedStatuslineSettings, ctx: ExtensionCommandContext): void;\n\tpreview?(palettePreset: PalettePreset | undefined, ctx: ExtensionCommandContext): void;\n\tsave?: (settingsPath: string, rawDocument: string) => LoadedStatuslineSettings;\n\tgetMenuOwner?(): StatuslineMenuOwner;\n}\n\nexport function registerStatuslineCommand(pi: ExtensionAPI, options: StatuslineCommandOptions) {\n\tpi.registerCommand(\"statusline\", {\n\t\tdescription: \"Open or inspect the statusline settings\",\n\t\tgetArgumentCompletions: completeStatuslineArguments,\n\t\thandler: (args, ctx) => handleStatuslineCommand(args, ctx, options),\n\t});\n}\n\nexport async function handleStatuslineCommand(\n\targs: string,\n\tctx: ExtensionCommandContext,\n\toptions: StatuslineCommandOptions,\n) {\n\tconst normalized = args.trim();\n\tif (!normalized) {\n\t\tawait showMainMenu(ctx, options);\n\t\treturn;\n\t}\n\n\tconst tokens = normalized.split(/\\s+/u);\n\tconst subcommand = tokens[0]?.toLowerCase() ?? \"\";\n\tif (tokens.length > 1) {\n\t\tif (canNotify(ctx)) {\n\t\t\tctx.ui.notify(`/statusline ${subcommand} does not accept trailing arguments.`, \"warning\");\n\t\t}\n\t\treturn;\n\t}\n\n\tswitch (subcommand) {\n\t\tcase \"settings\":\n\t\t\tawait editSettings(ctx, options);\n\t\t\treturn;\n\t\tcase \"status\":\n\t\t\tshowStatus(ctx, options);\n\t\t\treturn;\n\t\tcase \"help\":\n\t\t\tshowHelp(ctx, options.settingsPath);\n\t\t\treturn;\n\t\tdefault:\n\t\t\tif (canNotify(ctx)) {\n\t\t\t\tctx.ui.notify(`Unknown /statusline subcommand: ${subcommand}`, \"warning\");\n\t\t\t}\n\t}\n}\n\nasync function showMainMenu(ctx: ExtensionCommandContext, options: StatuslineCommandOptions) {\n\tif (ctx.mode !== \"tui\") {\n\t\tif (ctx.hasUI) ctx.ui.notify(\"/statusline requires an interactive Pi UI in TUI mode.\", \"error\");\n\t\treturn;\n\t}\n\tconst fallbackController = new AbortController();\n\tconst owner = options.getMenuOwner?.() ?? {\n\t\tsignal: fallbackController.signal,\n\t\tisCurrent: () => !fallbackController.signal.aborted,\n\t};\n\tconst { defineMenu, runMenu } = await import(\"@narumitw/pi-tui-kit\");\n\tif (owner.signal.aborted || !owner.isCurrent()) return;\n\ttype Screen = \"main\" | \"advanced\" | \"information\";\n\ttype Action = \"appearance\" | \"setInformation\" | \"layout\" | \"edit\" | \"status\" | \"help\" | \"back\";\n\tconst menu = defineMenu<undefined, Screen, Action, ExtensionCommandContext>({\n\t\tstart: \"main\",\n\t\tscreens: {\n\t\t\tmain: () => {\n\t\t\t\tconst config = options.getLoaded().config;\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\ttitle: \"pi-statusline\",\n\t\t\t\t\titems: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"appearance\",\n\t\t\t\t\t\t\tlabel: `Appearance (${config.palettePreset})`,\n\t\t\t\t\t\t\taction: \"appearance\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"information\",\n\t\t\t\t\t\t\tlabel: `Information (${inferInformationProfile(config.segments)})`,\n\t\t\t\t\t\t\tto: \"information\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ id: \"advanced\", label: \"Advanced\", to: \"advanced\" },\n\t\t\t\t\t\t{ id: \"status\", label: \"Status\", action: \"status\" },\n\t\t\t\t\t\t{ id: \"help\", label: \"Help\", action: \"help\" },\n\t\t\t\t\t],\n\t\t\t\t\thint: \"close\",\n\t\t\t\t};\n\t\t\t},\n\t\t\tinformation: () => {\n\t\t\t\tconst current = inferInformationProfile(options.getLoaded().config.segments);\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"choice\",\n\t\t\t\t\ttitle: \"Information level\",\n\t\t\t\t\tlines: [`Current profile: ${current}`],\n\t\t\t\t\titems: INFORMATION_PROFILE_NAMES.map((profile) => ({\n\t\t\t\t\t\tid: profile,\n\t\t\t\t\t\tlabel: `${profile[0]?.toUpperCase() ?? \"\"}${profile.slice(1)}`,\n\t\t\t\t\t\tdescription: `${INFORMATION_PROFILES[profile].length} segments`,\n\t\t\t\t\t\tdetails: [`Segments: ${INFORMATION_PROFILES[profile].join(\" \u00B7 \")}`],\n\t\t\t\t\t})),\n\t\t\t\t\taction: \"setInformation\",\n\t\t\t\t\tcurrentItemId: current,\n\t\t\t\t\tinitialItemId: current === \"custom\" ? \"balanced\" : current,\n\t\t\t\t\thint: \"close\",\n\t\t\t\t};\n\t\t\t},\n\t\t\tadvanced: () => {\n\t\t\t\tconst config = options.getLoaded().config;\n\t\t\t\tconst visibleSegmentCount = config.segments.filter(\n\t\t\t\t\t(segment): segment is SegmentName => segment !== LINE_BREAK_SEGMENT_NAME,\n\t\t\t\t).length;\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\ttitle: \"pi-statusline \u2014 Advanced\",\n\t\t\t\t\titems: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"layout\",\n\t\t\t\t\t\t\tlabel: `Custom layout (${visibleSegmentCount}/${SEGMENT_NAMES.length} shown)`,\n\t\t\t\t\t\t\taction: \"layout\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ id: \"edit\", label: EDIT_SETTINGS_LABEL, action: \"edit\" },\n\t\t\t\t\t\t{ id: \"back\", label: \"Back\", action: \"back\" },\n\t\t\t\t\t],\n\t\t\t\t\thint: \"back\",\n\t\t\t\t};\n\t\t\t},\n\t\t},\n\t\tactions: {\n\t\t\tappearance: async () => {\n\t\t\t\tawait choosePalettePreset(ctx, options, owner);\n\t\t\t\treturn { kind: \"close\" };\n\t\t\t},\n\t\t\tsetInformation: async ({ itemId }) => {\n\t\t\t\tconst profile = INFORMATION_PROFILE_NAMES.find((candidate) => candidate === itemId);\n\t\t\t\tif (!profile) return { kind: \"rejected\" };\n\t\t\t\tapplyInformationProfile(ctx, options, profile);\n\t\t\t\treturn { kind: \"close\" };\n\t\t\t},\n\t\t\tlayout: async () => {\n\t\t\t\tawait chooseSegments(ctx, options);\n\t\t\t\treturn { kind: \"close\" };\n\t\t\t},\n\t\t\tedit: async () => {\n\t\t\t\tawait editSettings(ctx, options);\n\t\t\t\treturn { kind: \"close\" };\n\t\t\t},\n\t\t\tstatus: async () => {\n\t\t\t\tshowStatus(ctx, options);\n\t\t\t\treturn { kind: \"close\" };\n\t\t\t},\n\t\t\thelp: async () => {\n\t\t\t\tshowHelp(ctx, options.settingsPath);\n\t\t\t\treturn { kind: \"close\" };\n\t\t\t},\n\t\t\tback: async () => ({ kind: \"back\" }),\n\t\t},\n\t});\n\ttry {\n\t\tawait runMenu(ctx, menu, {\n\t\t\tgetState: () => undefined,\n\t\t\tsignal: owner.signal,\n\t\t\tisCurrent: owner.isCurrent,\n\t\t});\n\t} finally {\n\t\tfallbackController.abort(new DOMException(\"Statusline menu closed\", \"AbortError\"));\n\t}\n}\n\nasync function choosePalettePreset(\n\tctx: ExtensionCommandContext,\n\toptions: StatuslineCommandOptions,\n\towner: StatuslineMenuOwner,\n) {\n\tif (ctx.mode !== \"tui\") {\n\t\tif (ctx.hasUI) ctx.ui.notify(`Edit palettePreset manually: ${options.settingsPath}`, \"info\");\n\t\treturn;\n\t}\n\tconst current = options.getLoaded();\n\tlet selection: PalettePreset | undefined;\n\ttry {\n\t\tselection = await showPalettePresetPicker(ctx, current.config.palettePreset, options, owner);\n\t} finally {\n\t\tif (!owner.signal.aborted && owner.isCurrent()) {\n\t\t\ttry {\n\t\t\t\toptions.preview?.(undefined, ctx);\n\t\t\t} catch (error) {\n\t\t\t\tif (canNotify(ctx)) {\n\t\t\t\t\tctx.ui.notify(`Palette preview could not be reset: ${formatError(error)}`, \"error\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif (owner.signal.aborted || !owner.isCurrent()) return;\n\tif (selection === undefined) return;\n\n\tlet loaded: LoadedStatuslineSettings;\n\ttry {\n\t\tconst rawDocument = palettePresetDocument(current, selection);\n\t\tloaded = (options.save ?? saveStatuslineSettingsDocument)(options.settingsPath, rawDocument);\n\t} catch (error) {\n\t\tctx.ui.notify(`Palette preset was not saved: ${formatError(error)}`, \"error\");\n\t\treturn;\n\t}\n\ttry {\n\t\toptions.apply(loaded, ctx);\n\t} catch (error) {\n\t\tconst rollbackError = restoreStatuslineSettings(ctx, options, current, loaded);\n\t\tctx.ui.notify(\n\t\t\trollbackError\n\t\t\t\t? `Palette preset could not be applied: ${formatError(error)}; rollback failed: ${formatError(rollbackError)}`\n\t\t\t\t: `Palette preset could not be applied: ${formatError(error)}; previous settings restored.`,\n\t\t\t\"error\",\n\t\t);\n\t\treturn;\n\t}\n\tconst message =\n\t\tloaded.config.palettePreset === \"custom\"\n\t\t\t? \"Custom palette applied. Edit colors via /statusline \u2192 Advanced \u2192 Edit settings JSON.\"\n\t\t\t: `Palette preset applied: ${loaded.config.palettePreset}.`;\n\tctx.ui.notify(message, \"info\");\n}\n\nasync function showPalettePresetPicker(\n\tctx: ExtensionCommandContext,\n\tcurrent: PalettePreset,\n\toptions: StatuslineCommandOptions,\n\towner: StatuslineMenuOwner,\n): Promise<PalettePreset | undefined> {\n\tconst { runLiveChoice } = await import(\"@narumitw/pi-tui-kit\");\n\tconst result = await runLiveChoice(ctx, {\n\t\ttitle: `Palette preset (current: ${current})`,\n\t\titems: PALETTE_PRESET_NAMES.map((palettePreset) => ({\n\t\t\tid: palettePreset,\n\t\t\tlabel: palettePreset,\n\t\t\tdescription: palettePreset === \"custom\" ? \"per-segment colors from settings JSON\" : undefined,\n\t\t})),\n\t\tcurrentItemId: current,\n\t\tinitialItemId: current,\n\t\tviewportSize: Math.min(PALETTE_PRESET_NAMES.length, 10),\n\t\thint: \"close\",\n\t\tnavigationLabel: \"preview\",\n\t\tconfirmLabel: \"apply\",\n\t\tonSelectionChange: ({ item }) => options.preview?.(item.id, ctx),\n\t\tsignal: owner.signal,\n\t\tisCurrent: owner.isCurrent,\n\t});\n\treturn result.kind === \"selected\" ? result.itemId : undefined;\n}\n\nfunction applyInformationProfile(\n\tctx: ExtensionCommandContext,\n\toptions: StatuslineCommandOptions,\n\tselection: InformationProfileName,\n) {\n\tconst current = options.getLoaded();\n\ttry {\n\t\tconst change = informationProfileDocument(current, selection);\n\t\tconst loaded = applySegmentsDocumentChange(change, ctx, options);\n\t\tctx.ui.notify(\n\t\t\t`Information level applied: ${inferInformationProfile(loaded.config.segments)}.`,\n\t\t\t\"info\",\n\t\t);\n\t} catch (error) {\n\t\tctx.ui.notify(`Information level was not saved: ${formatError(error)}`, \"error\");\n\t}\n}\n\nasync function chooseSegments(ctx: ExtensionCommandContext, options: StatuslineCommandOptions) {\n\tif (ctx.mode !== \"tui\") {\n\t\tif (ctx.hasUI) ctx.ui.notify(`Edit segments manually: ${options.settingsPath}`, \"info\");\n\t\treturn;\n\t}\n\tlet current = options.getLoaded();\n\tlet names = segmentMenuOrder(current);\n\tlet selectedIndex = 0;\n\tlet moveMode = false;\n\tlet feedback: string | undefined;\n\n\tawait ctx.ui.custom((tui, theme, keybindings, done) => {\n\t\tconst commit = (\n\t\t\tname: SegmentName,\n\t\t\tchange: { nextDocument: string; previousDocument: string },\n\t\t): boolean => {\n\t\t\ttry {\n\t\t\t\tcurrent = applySegmentsDocumentChange(change, ctx, options);\n\t\t\t\tnames = segmentMenuOrder(current);\n\t\t\t\tselectedIndex = Math.max(0, names.indexOf(name));\n\t\t\t\tfeedback = undefined;\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tctx.ui.notify(`Statusline segments were not saved: ${formatError(error)}`, \"error\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t};\n\n\t\tconst toggleSelected = () => {\n\t\t\tconst name = names[selectedIndex];\n\t\t\tif (!name) return;\n\t\t\tmoveMode = false;\n\t\t\tcommit(name, segmentsDocument(current, name, !current.config.segments.includes(name)));\n\t\t};\n\n\t\tconst toggleLineBreakAfterSelected = () => {\n\t\t\tconst name = names[selectedIndex];\n\t\t\tif (!name) return;\n\t\t\tmoveMode = false;\n\t\t\tconst segmentIndex = current.config.segments.indexOf(name);\n\t\t\tif (segmentIndex < 0) {\n\t\t\t\tfeedback = `Show ${name} before adding a line break.`;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst hasLineBreak = current.config.segments[segmentIndex + 1] === LINE_BREAK_SEGMENT_NAME;\n\t\t\tconst hasFollowingSegment = current.config.segments\n\t\t\t\t.slice(segmentIndex + 1)\n\t\t\t\t.some((segment) => segment !== LINE_BREAK_SEGMENT_NAME);\n\t\t\tif (!hasLineBreak && !hasFollowingSegment) {\n\t\t\t\tfeedback = `Add another visible segment after ${name} before adding a line break.`;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcommit(name, lineBreakAfterDocument(current, name));\n\t\t};\n\n\t\tconst reorderSelected = (direction: -1 | 1) => {\n\t\t\tconst name = names[selectedIndex];\n\t\t\tif (!name) return;\n\t\t\tconst visibleNames = visibleSegmentNames(current);\n\t\t\tconst currentIndex = visibleNames.indexOf(name);\n\t\t\tif (currentIndex < 0) {\n\t\t\t\tfeedback = `Show ${name} before moving it.`;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst targetIndex = currentIndex + direction;\n\t\t\tif (targetIndex < 0 || targetIndex >= visibleNames.length) {\n\t\t\t\tfeedback = `${name} is already the ${direction < 0 ? \"first\" : \"last\"} visible segment.`;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst change = reorderedSegmentsDocument(current, name, direction);\n\t\t\tif (change) commit(name, change);\n\t\t};\n\n\t\tconst enterMoveMode = () => {\n\t\t\tconst name = names[selectedIndex];\n\t\t\tif (!name) return;\n\t\t\tif (!current.config.segments.includes(name)) {\n\t\t\t\tfeedback = `Show ${name} before moving it.`;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tmoveMode = true;\n\t\t\tfeedback = undefined;\n\t\t};\n\n\t\tconst moveSelection = (offset: number) => {\n\t\t\tselectedIndex = Math.max(0, Math.min(names.length - 1, selectedIndex + offset));\n\t\t\tfeedback = undefined;\n\t\t};\n\n\t\tconst renderList = (width: number): string[] => {\n\t\t\tconst safeWidth = Math.max(1, width);\n\t\t\tconst visibleNames = visibleSegmentNames(current);\n\t\t\tconst visible = new Set(visibleNames);\n\t\t\tconst placements = segmentPlacements(current.config.segments);\n\t\t\tconst viewportSize = safeWidth < 30 ? NARROW_SEGMENT_VIEWPORT_SIZE : SEGMENT_VIEWPORT_SIZE;\n\t\t\tconst startIndex = Math.max(\n\t\t\t\t0,\n\t\t\t\tMath.min(\n\t\t\t\t\tselectedIndex - Math.floor(viewportSize / 2),\n\t\t\t\t\tMath.max(0, names.length - viewportSize),\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst endIndex = Math.min(names.length, startIndex + viewportSize);\n\t\t\tconst lines: string[] = [];\n\t\t\tlet previousSection: \"visible\" | \"hidden\" | undefined;\n\t\t\tfor (let index = startIndex; index < endIndex; index += 1) {\n\t\t\t\tconst name = names[index];\n\t\t\t\tif (!name) continue;\n\t\t\t\tconst section = visible.has(name) ? \"visible\" : \"hidden\";\n\t\t\t\tif (section !== previousSection) {\n\t\t\t\t\tconst heading =\n\t\t\t\t\t\tsection === \"visible\" ? \"Visible \u2014 render order\" : \"Hidden \u2014 not rendered\";\n\t\t\t\t\tlines.push(theme.fg(\"muted\", theme.bold(truncateToWidth(` ${heading}`, safeWidth))));\n\t\t\t\t\tpreviousSection = section;\n\t\t\t\t}\n\t\t\t\tconst isSelected = index === selectedIndex;\n\t\t\t\tconst prefix = isSelected ? \"\u2192 \" : \" \";\n\t\t\t\tconst placement = placements.get(name);\n\t\t\t\tconst lineBreakLabel = hasLineBreakAfter(current.config.segments, name)\n\t\t\t\t\t? \" \u00B7 break after\"\n\t\t\t\t\t: \"\";\n\t\t\t\tconst row = placement\n\t\t\t\t\t? `${prefix}${`${placement.order}.`.padStart(3)} row ${placement.row} \u00B7 ${name.padEnd(8)} \u00B7 visible${lineBreakLabel}`\n\t\t\t\t\t: `${prefix} \u00B7 ${name.padEnd(8)} \u00B7 hidden`;\n\t\t\t\tconst truncated = truncateToWidth(row, safeWidth);\n\t\t\t\tif (isSelected) lines.push(theme.fg(\"accent\", truncated));\n\t\t\t\telse lines.push(section === \"visible\" ? truncated : theme.fg(\"muted\", truncated));\n\t\t\t}\n\t\t\tif (startIndex > 0 || endIndex < names.length) {\n\t\t\t\tlines.push(\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\ttruncateToWidth(` (${startIndex + 1}-${endIndex}/${names.length})`, safeWidth),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst selected = names[selectedIndex];\n\t\t\tif (selected) {\n\t\t\t\tlines.push(\"\");\n\t\t\t\tconst detail = feedback ?? SEGMENT_DESCRIPTIONS[selected];\n\t\t\t\tconst color = feedback ? \"warning\" : \"muted\";\n\t\t\t\tfor (const line of wrapTextWithAnsi(detail, Math.max(1, safeWidth - 2))) {\n\t\t\t\t\tlines.push(theme.fg(color, truncateToWidth(` ${line}`, safeWidth)));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlines.push(\"\");\n\t\t\tconst hints = segmentControlHints(safeWidth, moveMode, selected);\n\t\t\tfor (const hint of hints) {\n\t\t\t\tlines.push(theme.fg(\"dim\", truncateToWidth(` ${hint}`, safeWidth)));\n\t\t\t}\n\t\t\treturn lines;\n\t\t};\n\n\t\tconst container = new Container();\n\t\tcontainer.addChild(new DynamicBorder((text: string) => theme.fg(\"accent\", text)));\n\t\tconst title = new Text(\"\", 1, 0);\n\t\tcontainer.addChild(title);\n\t\tcontainer.addChild({ render: renderList, invalidate() {} });\n\t\tcontainer.addChild(new DynamicBorder((text: string) => theme.fg(\"accent\", text)));\n\t\tconst updateThemedText = () => {\n\t\t\ttitle.setText(theme.fg(\"accent\", theme.bold(\"Statusline segments\")));\n\t\t};\n\t\tupdateThemedText();\n\n\t\treturn {\n\t\t\trender: (width: number) => container.render(width),\n\t\t\tinvalidate() {\n\t\t\t\tcontainer.invalidate();\n\t\t\t\tupdateThemedText();\n\t\t\t},\n\t\t\thandleInput(data: string) {\n\t\t\t\tconst moveModeKey = matchesKey(data, \"m\") || matchesKey(data, Key.shift(\"m\"));\n\t\t\t\tconst lineBreakKey = matchesKey(data, \"b\") || matchesKey(data, Key.shift(\"b\"));\n\t\t\t\tif (matchesKey(data, Key.alt(\"up\"))) {\n\t\t\t\t\treorderSelected(-1);\n\t\t\t\t} else if (matchesKey(data, Key.alt(\"down\"))) {\n\t\t\t\t\treorderSelected(1);\n\t\t\t\t} else if (moveMode) {\n\t\t\t\t\tif (keybindings.matches(data, \"tui.select.up\")) {\n\t\t\t\t\t\treorderSelected(-1);\n\t\t\t\t\t} else if (keybindings.matches(data, \"tui.select.down\")) {\n\t\t\t\t\t\treorderSelected(1);\n\t\t\t\t\t} else if (\n\t\t\t\t\t\tmoveModeKey ||\n\t\t\t\t\t\tkeybindings.matches(data, \"tui.select.confirm\") ||\n\t\t\t\t\t\tdata === \" \" ||\n\t\t\t\t\t\tkeybindings.matches(data, \"tui.select.cancel\")\n\t\t\t\t\t) {\n\t\t\t\t\t\tmoveMode = false;\n\t\t\t\t\t\tfeedback = undefined;\n\t\t\t\t\t}\n\t\t\t\t} else if (keybindings.matches(data, \"tui.select.up\")) {\n\t\t\t\t\tselectedIndex = selectedIndex === 0 ? names.length - 1 : selectedIndex - 1;\n\t\t\t\t\tfeedback = undefined;\n\t\t\t\t} else if (keybindings.matches(data, \"tui.select.down\")) {\n\t\t\t\t\tselectedIndex = selectedIndex === names.length - 1 ? 0 : selectedIndex + 1;\n\t\t\t\t\tfeedback = undefined;\n\t\t\t\t} else if (keybindings.matches(data, \"tui.select.pageUp\")) {\n\t\t\t\t\tmoveSelection(-SEGMENT_VIEWPORT_SIZE);\n\t\t\t\t} else if (keybindings.matches(data, \"tui.select.pageDown\")) {\n\t\t\t\t\tmoveSelection(SEGMENT_VIEWPORT_SIZE);\n\t\t\t\t} else if (moveModeKey) {\n\t\t\t\t\tenterMoveMode();\n\t\t\t\t} else if (lineBreakKey) {\n\t\t\t\t\ttoggleLineBreakAfterSelected();\n\t\t\t\t} else if (keybindings.matches(data, \"tui.select.confirm\") || data === \" \") {\n\t\t\t\t\ttoggleSelected();\n\t\t\t\t} else if (keybindings.matches(data, \"tui.select.cancel\")) {\n\t\t\t\t\tdone(undefined);\n\t\t\t\t}\n\t\t\t\ttui.requestRender();\n\t\t\t},\n\t\t};\n\t});\n}\n\nasync function editSettings(ctx: ExtensionCommandContext, options: StatuslineCommandOptions) {\n\tif (ctx.mode !== \"tui\") {\n\t\tif (ctx.hasUI) ctx.ui.notify(`Edit settings manually: ${options.settingsPath}`, \"info\");\n\t\treturn;\n\t}\n\tconst current = options.getLoaded();\n\tconst edited = await ctx.ui.editor(\n\t\t\"pi-statusline.json \u2014 save and close to apply\",\n\t\tcurrent.rawDocument ?? DEFAULT_STATUSLINE_DOCUMENT,\n\t);\n\tif (edited === undefined) return;\n\tlet loaded: LoadedStatuslineSettings;\n\ttry {\n\t\tloaded = (options.save ?? saveStatuslineSettingsDocument)(options.settingsPath, edited);\n\t} catch (error) {\n\t\tctx.ui.notify(`pi-statusline settings were not saved: ${formatError(error)}`, \"error\");\n\t\treturn;\n\t}\n\ttry {\n\t\toptions.apply(loaded, ctx);\n\t} catch (error) {\n\t\tconst rollbackError = restoreStatuslineSettings(ctx, options, current, loaded);\n\t\tctx.ui.notify(\n\t\t\trollbackError\n\t\t\t\t? `pi-statusline settings could not be applied: ${formatError(error)}; rollback failed: ${formatError(rollbackError)}`\n\t\t\t\t: `pi-statusline settings could not be applied: ${formatError(error)}; previous settings restored.`,\n\t\t\t\"error\",\n\t\t);\n\t\treturn;\n\t}\n\tconst suffix =\n\t\tloaded.diagnostics.length > 0\n\t\t\t? ` (${loaded.diagnostics.length} warning${loaded.diagnostics.length === 1 ? \"\" : \"s\"})`\n\t\t\t: \"\";\n\tctx.ui.notify(`pi-statusline settings saved and applied${suffix}.`, \"info\");\n}\n\nfunction palettePresetDocument(\n\tcurrent: LoadedStatuslineSettings,\n\tpalettePreset: PalettePreset,\n): string {\n\tconst { parsed } = editableSettings(current, \"choosing a palette preset\");\n\tif (palettePreset === \"custom\" && !isRecord(parsed.palette)) {\n\t\tconst seedPreset = isPaletteName(current.config.palettePreset)\n\t\t\t? current.config.palettePreset\n\t\t\t: \"tokyo-night\";\n\t\tparsed.palette = segmentPaletteForPreset(seedPreset);\n\t} else if (palettePreset !== \"custom\" && typeof parsed.palette === \"string\") {\n\t\tdelete parsed.palette;\n\t}\n\tparsed.palettePreset = palettePreset;\n\treturn `${JSON.stringify(parsed, null, \"\\t\")}\\n`;\n}\n\nfunction informationProfileDocument(\n\tcurrent: LoadedStatuslineSettings,\n\tprofile: InformationProfileName,\n): { nextDocument: string; previousDocument: string } {\n\tconst { parsed, rawDocument: previousDocument } = editableSettings(\n\t\tcurrent,\n\t\t\"changing information level\",\n\t);\n\tparsed.segments = [...INFORMATION_PROFILES[profile]];\n\treturn {\n\t\tnextDocument: `${JSON.stringify(parsed, null, \"\\t\")}\\n`,\n\t\tpreviousDocument,\n\t};\n}\n\nfunction visibleSegmentNames(current: LoadedStatuslineSettings): SegmentName[] {\n\treturn current.config.segments.filter(\n\t\t(segment): segment is SegmentName => segment !== LINE_BREAK_SEGMENT_NAME,\n\t);\n}\n\nfunction segmentMenuOrder(current: LoadedStatuslineSettings): SegmentName[] {\n\tconst visible = visibleSegmentNames(current);\n\tconst visibleSet = new Set(visible);\n\treturn [...visible, ...SEGMENT_NAMES.filter((name) => !visibleSet.has(name))];\n}\n\nfunction hasLineBreakAfter(segments: readonly ConfigSegmentName[], name: SegmentName): boolean {\n\tconst index = segments.indexOf(name);\n\treturn index >= 0 && segments[index + 1] === LINE_BREAK_SEGMENT_NAME;\n}\n\nfunction segmentPlacements(\n\tsegments: readonly ConfigSegmentName[],\n): Map<SegmentName, { order: number; row: number }> {\n\tconst placements = new Map<SegmentName, { order: number; row: number }>();\n\tlet order = 0;\n\tlet row = 1;\n\tfor (const segment of segments) {\n\t\tif (segment === LINE_BREAK_SEGMENT_NAME) {\n\t\t\trow += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tplacements.set(segment, { order: ++order, row });\n\t}\n\treturn placements;\n}\n\nfunction segmentControlHints(\n\twidth: number,\n\tmoveMode: boolean,\n\tselected: SegmentName | undefined,\n): string[] {\n\tif (moveMode) {\n\t\treturn width < 30\n\t\t\t? [\n\t\t\t\t\t`Move mode: ${selected ?? \"segment\"}`,\n\t\t\t\t\t\"\u2191\u2193 move segment\",\n\t\t\t\t\t\"Enter/Space finish\",\n\t\t\t\t\t\"Esc leave move mode\",\n\t\t\t\t]\n\t\t\t: [\n\t\t\t\t\t`Move mode \u2014 ${selected ?? \"segment\"}`,\n\t\t\t\t\t\"\u2191\u2193 move \u00B7 Enter/Space finish \u00B7 Esc leave move mode\",\n\t\t\t\t];\n\t}\n\treturn width < 30\n\t\t? [\n\t\t\t\t\"\u2191\u2193 navigate\",\n\t\t\t\t\"Enter/Space toggle\",\n\t\t\t\t\"M move \u00B7 B line break\",\n\t\t\t\t\"Alt+\u2191/\u2193 quick move\",\n\t\t\t\t\"Esc close\",\n\t\t\t]\n\t\t: [\n\t\t\t\t\"\u2191\u2193 navigate \u00B7 Enter/Space show/hide \u00B7 M move mode\",\n\t\t\t\t\"B add/remove line break after \u00B7 Alt+\u2191/\u2193 quick move \u00B7 Esc close\",\n\t\t\t];\n}\n\nfunction segmentsDocument(\n\tcurrent: LoadedStatuslineSettings,\n\tname: SegmentName,\n\tshouldShow: boolean,\n): { nextDocument: string; previousDocument: string } {\n\tconst { parsed, rawDocument: previousDocument } = editableSettings(current, \"changing segments\");\n\tconst segments = shouldShow\n\t\t? [...current.config.segments, ...(current.config.segments.includes(name) ? [] : [name])]\n\t\t: current.config.segments.filter((segment) => segment !== name);\n\tparsed.segments = normalizeLineBreaks(segments);\n\treturn {\n\t\tnextDocument: `${JSON.stringify(parsed, null, \"\\t\")}\\n`,\n\t\tpreviousDocument,\n\t};\n}\n\nfunction lineBreakAfterDocument(\n\tcurrent: LoadedStatuslineSettings,\n\tname: SegmentName,\n): { nextDocument: string; previousDocument: string } {\n\tconst { parsed, rawDocument: previousDocument } = editableSettings(\n\t\tcurrent,\n\t\t\"changing line breaks\",\n\t);\n\tconst segments = [...current.config.segments];\n\tconst segmentIndex = segments.indexOf(name);\n\tif (segments[segmentIndex + 1] === LINE_BREAK_SEGMENT_NAME) {\n\t\tsegments.splice(segmentIndex + 1, 1);\n\t} else {\n\t\tsegments.splice(segmentIndex + 1, 0, LINE_BREAK_SEGMENT_NAME);\n\t}\n\tparsed.segments = segments;\n\treturn {\n\t\tnextDocument: `${JSON.stringify(parsed, null, \"\\t\")}\\n`,\n\t\tpreviousDocument,\n\t};\n}\n\nfunction reorderedSegmentsDocument(\n\tcurrent: LoadedStatuslineSettings,\n\tname: SegmentName,\n\tdirection: -1 | 1,\n): { nextDocument: string; previousDocument: string } | undefined {\n\tconst dataIndexes = current.config.segments.flatMap((segment, index) =>\n\t\tsegment === LINE_BREAK_SEGMENT_NAME ? [] : [index],\n\t);\n\tconst currentDataIndex = dataIndexes.findIndex(\n\t\t(index) => current.config.segments[index] === name,\n\t);\n\tconst targetDataIndex = currentDataIndex + direction;\n\tif (currentDataIndex < 0 || targetDataIndex < 0 || targetDataIndex >= dataIndexes.length) {\n\t\treturn undefined;\n\t}\n\tconst { parsed, rawDocument: previousDocument } = editableSettings(\n\t\tcurrent,\n\t\t\"reordering segments\",\n\t);\n\tconst segments = [...current.config.segments];\n\tconst currentIndex = dataIndexes[currentDataIndex];\n\tconst targetIndex = dataIndexes[targetDataIndex];\n\tif (currentIndex === undefined || targetIndex === undefined) return undefined;\n\t[segments[currentIndex], segments[targetIndex]] = [segments[targetIndex], segments[currentIndex]];\n\tparsed.segments = segments;\n\treturn {\n\t\tnextDocument: `${JSON.stringify(parsed, null, \"\\t\")}\\n`,\n\t\tpreviousDocument,\n\t};\n}\n\nfunction applySegmentsDocumentChange(\n\tchange: { nextDocument: string; previousDocument: string },\n\tctx: ExtensionCommandContext,\n\toptions: StatuslineCommandOptions,\n): LoadedStatuslineSettings {\n\tconst previous = options.getLoaded();\n\tconst save = options.save ?? saveStatuslineSettingsDocument;\n\tconst next = save(options.settingsPath, change.nextDocument);\n\ttry {\n\t\toptions.apply(next, ctx);\n\t} catch (applyError) {\n\t\tconst rollbackError = restoreStatuslineSettings(ctx, options, previous, next);\n\t\tif (rollbackError) {\n\t\t\tthrow new Error(\n\t\t\t\t`runtime update failed: ${formatError(applyError)}; rollback failed: ${formatError(rollbackError)}`,\n\t\t\t);\n\t\t}\n\t\tthrow applyError;\n\t}\n\treturn next;\n}\n\nfunction restoreStatuslineSettings(\n\tctx: ExtensionCommandContext,\n\toptions: StatuslineCommandOptions,\n\tprevious: LoadedStatuslineSettings,\n\tsaved: LoadedStatuslineSettings,\n): unknown {\n\ttry {\n\t\tif (saved.rawDocument === undefined || saved.fileIdentity === undefined) {\n\t\t\tthrow new Error(\"The saved settings document identity is unavailable\");\n\t\t}\n\t\tremoveStatuslineSettingsDocumentIfMatches(\n\t\t\toptions.settingsPath,\n\t\t\tsaved.rawDocument,\n\t\t\tsaved.fileIdentity,\n\t\t);\n\t\tif (previous.rawDocument === undefined || previous.settingsPath !== options.settingsPath) {\n\t\t\toptions.apply(previous, ctx);\n\t\t\treturn undefined;\n\t\t}\n\t\tconst restored = (options.save ?? saveStatuslineSettingsDocument)(\n\t\t\toptions.settingsPath,\n\t\t\tprevious.rawDocument,\n\t\t);\n\t\toptions.apply(restored, ctx);\n\t\treturn undefined;\n\t} catch (error) {\n\t\treturn error;\n\t}\n}\n\nfunction normalizeLineBreaks(segments: readonly ConfigSegmentName[]): ConfigSegmentName[] {\n\tconst normalized: ConfigSegmentName[] = [];\n\tfor (const segment of segments) {\n\t\tif (\n\t\t\tsegment === LINE_BREAK_SEGMENT_NAME &&\n\t\t\t(normalized.length === 0 || normalized.at(-1) === LINE_BREAK_SEGMENT_NAME)\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\t\tnormalized.push(segment);\n\t}\n\tif (normalized.at(-1) === LINE_BREAK_SEGMENT_NAME) normalized.pop();\n\treturn normalized;\n}\n\nfunction editableSettings(\n\tcurrent: LoadedStatuslineSettings,\n\taction: string,\n): { parsed: Record<string, unknown>; rawDocument: string } {\n\tconst rawDocument =\n\t\tcurrent.source === \"user\" && current.rawDocument !== undefined\n\t\t\t? current.rawDocument\n\t\t\t: current.source === \"built-in\" &&\n\t\t\t\t\tcurrent.rawDocument === undefined &&\n\t\t\t\t\tcurrent.diagnostics.length === 0\n\t\t\t\t? DEFAULT_STATUSLINE_DOCUMENT\n\t\t\t\t: undefined;\n\tif (rawDocument === undefined || current.diagnostics.some((item) => item.code !== \"unknown\")) {\n\t\tthrow new Error(`Fix pi-statusline.json before ${action}`);\n\t}\n\tconst parsed = JSON.parse(rawDocument) as unknown;\n\tif (!isRecord(parsed)) throw new Error(\"Settings must contain a JSON object\");\n\treturn { parsed, rawDocument };\n}\n\nfunction showStatus(ctx: ExtensionCommandContext, options: StatuslineCommandOptions) {\n\tif (!canNotify(ctx)) return;\n\tconst loaded = options.getLoaded();\n\tconst diagnostics = loaded.diagnostics\n\t\t.slice(0, 5)\n\t\t.map((item) => `${item.path || \"root\"}: ${item.message}`)\n\t\t.join(\"; \");\n\tctx.ui.notify(\n\t\t[\n\t\t\t`pi-statusline source: ${loaded.source}`,\n\t\t\t`active path: ${loaded.settingsPath}`,\n\t\t\t`save target: ${options.settingsPath}`,\n\t\t\t`palette preset: ${loaded.config.palettePreset}`,\n\t\t\t`density: ${loaded.config.density}`,\n\t\t\t`separator: ${loaded.config.separator}`,\n\t\t\t`information: ${inferInformationProfile(loaded.config.segments)}`,\n\t\t\t`segments: ${loaded.config.segments.join(\", \") || \"none\"}`,\n\t\t\tdiagnostics ? `warnings: ${diagnostics}` : \"warnings: none\",\n\t\t].join(\"\\n\"),\n\t\tloaded.diagnostics.length > 0 ? \"warning\" : \"info\",\n\t);\n}\n\nfunction showHelp(ctx: ExtensionCommandContext, settingsPath: string) {\n\tif (!canNotify(ctx)) return;\n\tctx.ui.notify(\n\t\t[\n\t\t\t\"/statusline \u2014 open Appearance, Information, Advanced, Status, and Help\",\n\t\t\t\"/statusline settings \u2014 edit and apply JSON\",\n\t\t\t\"/statusline status \u2014 show source, path, information level, and warnings\",\n\t\t\t\"/statusline help \u2014 show this help\",\n\t\t\t\"Menu actions: Appearance, Information, Advanced, Status, Help.\",\n\t\t\t\"Information levels: minimal, balanced, detailed; any other segment array is custom.\",\n\t\t\t\"Advanced actions: Custom layout, Edit settings JSON, Back.\",\n\t\t\t`Settings: ${settingsPath}`,\n\t\t\t\"Fields: palettePreset, palette, density, separator, segments, segmentText, extensionStatusIcons\",\n\t\t\t\"Named presets ignore but preserve palette; custom uses its per-segment fg/bg colors.\",\n\t\t\t\"Responsive rows retain context, model, location, and active work before decorative data.\",\n\t\t\t\"Custom layout can show, hide, reorder, or split data segments across rows.\",\n\t\t\t\"Press M for move mode, Alt+Up/Alt+Down for quick move, and B for a line break.\",\n\t\t\t\"Line breaks (line_break) may repeat when separated by data segments, but cannot be consecutive.\",\n\t\t\t\"segmentText supports prefix and suffix strings around Pi-owned dynamic values.\",\n\t\t\t\"segmentText.model also supports truncationLength, truncationSymbol, and truncationDirection (start, middle, end).\",\n\t\t].join(\"\\n\"),\n\t\t\"info\",\n\t);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isPaletteName(value: PalettePreset): value is PaletteName {\n\treturn (PALETTE_NAMES as readonly PalettePreset[]).includes(value);\n}\n\nfunction canNotify(ctx: ExtensionCommandContext): boolean {\n\treturn ctx.mode === \"tui\" || ctx.hasUI;\n}\n\nfunction formatError(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }