@narumitw/pi-statusline 0.49.15 → 0.50.1

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/src/types.ts CHANGED
@@ -1,34 +1,26 @@
1
1
  import type { ThemeColor } from "@earendil-works/pi-coding-agent";
2
2
 
3
3
  export const SEGMENT_NAMES = [
4
- "brand",
5
- "provider",
6
- "model",
7
- "thinking",
8
- "cwd",
9
- "branch",
10
- "tools",
11
- "context",
12
- "tokens",
13
- "cache",
14
- "cost",
15
- "time",
16
- "turn",
4
+ "brand",
5
+ "provider",
6
+ "model",
7
+ "thinking",
8
+ "cwd",
9
+ "branch",
10
+ "tools",
11
+ "context",
12
+ "tokens",
13
+ "cache",
14
+ "cost",
15
+ "time",
16
+ "turn",
17
17
  ] as const;
18
18
  export type SegmentName = (typeof SEGMENT_NAMES)[number];
19
19
 
20
20
  export const LINE_BREAK_SEGMENT_NAME = "line_break" as const;
21
21
  export type ConfigSegmentName = SegmentName | typeof LINE_BREAK_SEGMENT_NAME;
22
22
 
23
- export const PALETTE_NAMES = [
24
- "tokyo-night",
25
- "ocean",
26
- "sunset",
27
- "forest",
28
- "candy",
29
- "neon",
30
- "mono",
31
- ] as const;
23
+ export const PALETTE_NAMES = ["tokyo-night", "ocean", "sunset", "forest", "candy", "neon", "mono"] as const;
32
24
  export type PaletteName = (typeof PALETTE_NAMES)[number];
33
25
 
34
26
  export const PALETTE_PRESET_NAMES = [...PALETTE_NAMES, "custom"] as const;
@@ -46,43 +38,43 @@ export type TruncationDirection = (typeof TRUNCATION_DIRECTIONS)[number];
46
38
  export type PowerlineBlockName = "header" | "directory" | "git" | "runtime" | "meter";
47
39
 
48
40
  export interface SegmentTextConfig {
49
- prefix: string;
50
- suffix: string;
41
+ prefix: string;
42
+ suffix: string;
51
43
  }
52
44
 
53
45
  export interface ModelSegmentTextConfig extends SegmentTextConfig {
54
- truncationLength: number;
55
- truncationSymbol: string;
56
- truncationDirection: TruncationDirection;
46
+ truncationLength: number;
47
+ truncationSymbol: string;
48
+ truncationDirection: TruncationDirection;
57
49
  }
58
50
 
59
51
  export interface SegmentPaletteColor {
60
- fg?: string;
61
- bg?: string;
52
+ fg?: string;
53
+ bg?: string;
62
54
  }
63
55
 
64
56
  export type SegmentPalette = Partial<Record<SegmentName, SegmentPaletteColor>>;
65
57
 
66
58
  export interface StatuslineConfig {
67
- palettePreset: PalettePreset;
68
- palette: SegmentPalette;
69
- density: Density;
70
- separator: SeparatorName;
71
- segments: ConfigSegmentName[];
72
- segmentText: Record<SegmentName, SegmentTextConfig> & { model: ModelSegmentTextConfig };
73
- extensionStatusIcons: Record<string, string>;
59
+ palettePreset: PalettePreset;
60
+ palette: SegmentPalette;
61
+ density: Density;
62
+ separator: SeparatorName;
63
+ segments: ConfigSegmentName[];
64
+ segmentText: Record<SegmentName, SegmentTextConfig> & { model: ModelSegmentTextConfig };
65
+ extensionStatusIcons: Record<string, string>;
74
66
  }
75
67
 
76
68
  export interface RenderSegment {
77
- name: SegmentName;
78
- text: string;
79
- color: ThemeColor;
80
- block: PowerlineBlockName;
81
- emphasis?: boolean;
69
+ name: SegmentName;
70
+ text: string;
71
+ color: ThemeColor;
72
+ block: PowerlineBlockName;
73
+ emphasis?: boolean;
82
74
  }
83
75
 
84
76
  export interface RenderLineBreak {
85
- name: typeof LINE_BREAK_SEGMENT_NAME;
77
+ name: typeof LINE_BREAK_SEGMENT_NAME;
86
78
  }
87
79
 
88
80
  export type RenderItem = RenderSegment | RenderLineBreak;
package/src/usage.ts CHANGED
@@ -1,53 +1,53 @@
1
1
  import type { SessionEntry } from "@earendil-works/pi-coding-agent";
2
2
 
3
3
  interface UsageLike {
4
- input?: number;
5
- output?: number;
6
- cacheRead?: number;
7
- cacheWrite?: number;
8
- cost?: { total?: number };
4
+ input?: number;
5
+ output?: number;
6
+ cacheRead?: number;
7
+ cacheWrite?: number;
8
+ cost?: { total?: number };
9
9
  }
10
10
 
11
11
  export interface FooterUsageSummary {
12
- input: number;
13
- output: number;
14
- cacheRead: number;
15
- cacheWrite: number;
16
- cost: number;
17
- latestCacheHitRate?: number;
12
+ input: number;
13
+ output: number;
14
+ cacheRead: number;
15
+ cacheWrite: number;
16
+ cost: number;
17
+ latestCacheHitRate?: number;
18
18
  }
19
19
 
20
20
  export function summarizeFooterUsage(entries: readonly SessionEntry[]): FooterUsageSummary {
21
- const totals: FooterUsageSummary = {
22
- input: 0,
23
- output: 0,
24
- cacheRead: 0,
25
- cacheWrite: 0,
26
- cost: 0,
27
- };
21
+ const totals: FooterUsageSummary = {
22
+ input: 0,
23
+ output: 0,
24
+ cacheRead: 0,
25
+ cacheWrite: 0,
26
+ cost: 0,
27
+ };
28
28
 
29
- for (const entry of entries) {
30
- let usage: UsageLike | undefined;
31
- if (entry.type === "message" && entry.message.role === "assistant") {
32
- usage = entry.message.usage;
33
- const input = usage.input ?? 0;
34
- const cacheRead = usage.cacheRead ?? 0;
35
- const cacheWrite = usage.cacheWrite ?? 0;
36
- const promptTokens = input + cacheRead + cacheWrite;
37
- totals.latestCacheHitRate = promptTokens > 0 ? (cacheRead / promptTokens) * 100 : undefined;
38
- } else if (entry.type === "message" && entry.message.role === "toolResult") {
39
- usage = entry.message.usage;
40
- } else if (entry.type === "compaction" || entry.type === "branch_summary") {
41
- usage = entry.usage;
42
- }
43
- if (!usage) continue;
29
+ for (const entry of entries) {
30
+ let usage: UsageLike | undefined;
31
+ if (entry.type === "message" && entry.message.role === "assistant") {
32
+ usage = entry.message.usage;
33
+ const input = usage.input ?? 0;
34
+ const cacheRead = usage.cacheRead ?? 0;
35
+ const cacheWrite = usage.cacheWrite ?? 0;
36
+ const promptTokens = input + cacheRead + cacheWrite;
37
+ totals.latestCacheHitRate = promptTokens > 0 ? (cacheRead / promptTokens) * 100 : undefined;
38
+ } else if (entry.type === "message" && entry.message.role === "toolResult") {
39
+ usage = entry.message.usage;
40
+ } else if (entry.type === "compaction" || entry.type === "branch_summary" || entry.type === "usage") {
41
+ usage = entry.usage;
42
+ }
43
+ if (!usage) continue;
44
44
 
45
- totals.input += usage.input ?? 0;
46
- totals.output += usage.output ?? 0;
47
- totals.cacheRead += usage.cacheRead ?? 0;
48
- totals.cacheWrite += usage.cacheWrite ?? 0;
49
- totals.cost += usage.cost?.total ?? 0;
50
- }
45
+ totals.input += usage.input ?? 0;
46
+ totals.output += usage.output ?? 0;
47
+ totals.cacheRead += usage.cacheRead ?? 0;
48
+ totals.cacheWrite += usage.cacheWrite ?? 0;
49
+ totals.cost += usage.cost?.total ?? 0;
50
+ }
51
51
 
52
- return totals;
52
+ return totals;
53
53
  }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/command-contract.ts", "../../src/types.ts", "../../src/presets/create-ramp.ts", "../../src/presets/candy.ts", "../../src/presets/custom.ts", "../../src/presets/forest.ts", "../../src/presets/mono.ts", "../../src/presets/neon.ts", "../../src/presets/ocean.ts", "../../src/presets/sunset.ts", "../../src/presets/tokyo-night.ts", "../../src/presets/index.ts", "../../src/information-profiles.ts", "../../src/settings.ts"],
4
- "sourcesContent": ["import type { AutocompleteItem } from \"@earendil-works/pi-tui\";\n\nexport const STATUSLINE_SUBCOMMANDS: readonly AutocompleteItem[] = [\n\t{ value: \"settings\", label: \"settings\", description: \"Edit pi-statusline.json\" },\n\t{ value: \"status\", label: \"status\", description: \"Show effective statusline settings\" },\n\t{ value: \"help\", label: \"help\", description: \"Show configuration help\" },\n];\n\nexport function completeStatuslineArguments(prefix: string): AutocompleteItem[] | null {\n\tconst normalized = prefix.trim().toLowerCase();\n\tconst matches = STATUSLINE_SUBCOMMANDS.filter((item) => item.value.startsWith(normalized));\n\treturn matches.length > 0 ? [...matches] : null;\n}\n", "import type { ThemeColor } from \"@earendil-works/pi-coding-agent\";\n\nexport const SEGMENT_NAMES = [\n\t\"brand\",\n\t\"provider\",\n\t\"model\",\n\t\"thinking\",\n\t\"cwd\",\n\t\"branch\",\n\t\"tools\",\n\t\"context\",\n\t\"tokens\",\n\t\"cache\",\n\t\"cost\",\n\t\"time\",\n\t\"turn\",\n] as const;\nexport type SegmentName = (typeof SEGMENT_NAMES)[number];\n\nexport const LINE_BREAK_SEGMENT_NAME = \"line_break\" as const;\nexport type ConfigSegmentName = SegmentName | typeof LINE_BREAK_SEGMENT_NAME;\n\nexport const PALETTE_NAMES = [\n\t\"tokyo-night\",\n\t\"ocean\",\n\t\"sunset\",\n\t\"forest\",\n\t\"candy\",\n\t\"neon\",\n\t\"mono\",\n] as const;\nexport type PaletteName = (typeof PALETTE_NAMES)[number];\n\nexport const PALETTE_PRESET_NAMES = [...PALETTE_NAMES, \"custom\"] as const;\nexport type PalettePreset = (typeof PALETTE_PRESET_NAMES)[number];\n\nexport const DENSITIES = [\"compact\", \"cozy\"] as const;\nexport type Density = (typeof DENSITIES)[number];\n\nexport const SEPARATOR_NAMES = [\"none\", \"dot\", \"bar\", \"powerline\", \"round\"] as const;\nexport type SeparatorName = (typeof SEPARATOR_NAMES)[number];\n\nexport const TRUNCATION_DIRECTIONS = [\"start\", \"middle\", \"end\"] as const;\nexport type TruncationDirection = (typeof TRUNCATION_DIRECTIONS)[number];\n\nexport type PowerlineBlockName = \"header\" | \"directory\" | \"git\" | \"runtime\" | \"meter\";\n\nexport interface SegmentTextConfig {\n\tprefix: string;\n\tsuffix: string;\n}\n\nexport interface ModelSegmentTextConfig extends SegmentTextConfig {\n\ttruncationLength: number;\n\ttruncationSymbol: string;\n\ttruncationDirection: TruncationDirection;\n}\n\nexport interface SegmentPaletteColor {\n\tfg?: string;\n\tbg?: string;\n}\n\nexport type SegmentPalette = Partial<Record<SegmentName, SegmentPaletteColor>>;\n\nexport interface StatuslineConfig {\n\tpalettePreset: PalettePreset;\n\tpalette: SegmentPalette;\n\tdensity: Density;\n\tseparator: SeparatorName;\n\tsegments: ConfigSegmentName[];\n\tsegmentText: Record<SegmentName, SegmentTextConfig> & { model: ModelSegmentTextConfig };\n\textensionStatusIcons: Record<string, string>;\n}\n\nexport interface RenderSegment {\n\tname: SegmentName;\n\ttext: string;\n\tcolor: ThemeColor;\n\tblock: PowerlineBlockName;\n\temphasis?: boolean;\n}\n\nexport interface RenderLineBreak {\n\tname: typeof LINE_BREAK_SEGMENT_NAME;\n}\n\nexport type RenderItem = RenderSegment | RenderLineBreak;\n", "import type { PowerlineBlockName } from \"../types.js\";\nimport type { PowerlinePreset } from \"./types.js\";\n\nconst BLOCK_NAMES: PowerlineBlockName[] = [\"header\", \"directory\", \"git\", \"runtime\", \"meter\"];\n\ntype PaletteRamp = readonly [string, string, string, string, string];\n\nexport function createRampPreset(backgrounds: PaletteRamp): PowerlinePreset {\n\treturn {\n\t\tlead: backgrounds[0],\n\t\tblocks: Object.fromEntries(\n\t\t\tBLOCK_NAMES.map((block, index) => {\n\t\t\t\tconst background = backgrounds[index];\n\t\t\t\treturn [block, { fg: contrastColor(background), bg: background }];\n\t\t\t}),\n\t\t) as Record<PowerlineBlockName, { fg: string; bg: string }>,\n\t\textensionSeparator: backgrounds[2],\n\t};\n}\n\nfunction contrastColor(hex: string): string {\n\tconst background = relativeLuminance(hex);\n\tconst dark = relativeLuminance(\"#090c0c\");\n\tconst light = relativeLuminance(\"#f0f0f0\");\n\treturn contrastRatio(background, dark) >= contrastRatio(background, light)\n\t\t? \"#090c0c\"\n\t\t: \"#f0f0f0\";\n}\n\nfunction contrastRatio(left: number, right: number): number {\n\treturn (Math.max(left, right) + 0.05) / (Math.min(left, right) + 0.05);\n}\n\nfunction relativeLuminance(hex: string): number {\n\tconst normalized = hex.slice(1);\n\tconst channels = [0, 2, 4].map((offset) => {\n\t\tconst value = Number.parseInt(normalized.slice(offset, offset + 2), 16) / 255;\n\t\treturn value <= 0.04045 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4;\n\t});\n\treturn 0.2126 * (channels[0] ?? 0) + 0.7152 * (channels[1] ?? 0) + 0.0722 * (channels[2] ?? 0);\n}\n", "import { createRampPreset } from \"./create-ramp.js\";\n\nexport const CANDY_PRESET = createRampPreset([\n\t\"#f5c2e7\",\n\t\"#cba6f7\",\n\t\"#89b4fa\",\n\t\"#745f9a\",\n\t\"#403a5c\",\n]);\n", "import type { PowerlinePreset } from \"./types.js\";\n\nexport const CUSTOM_PRESET: PowerlinePreset = {\n\tblocks: {\n\t\theader: {},\n\t\tdirectory: {},\n\t\tgit: {},\n\t\truntime: {},\n\t\tmeter: {},\n\t},\n};\n", "import { createRampPreset } from \"./create-ramp.js\";\n\nexport const FOREST_PRESET = createRampPreset([\n\t\"#a7c080\",\n\t\"#83c092\",\n\t\"#5f9f75\",\n\t\"#3f6f55\",\n\t\"#293f35\",\n]);\n", "import { createRampPreset } from \"./create-ramp.js\";\n\nexport const MONO_PRESET = createRampPreset([\n\t\"#d4d4d4\",\n\t\"#a3a3a3\",\n\t\"#686868\",\n\t\"#404040\",\n\t\"#262626\",\n]);\n", "import { createRampPreset } from \"./create-ramp.js\";\n\nexport const NEON_PRESET = createRampPreset([\n\t\"#39ff14\",\n\t\"#00f5ff\",\n\t\"#ff4fd8\",\n\t\"#7a2cf3\",\n\t\"#29134f\",\n]);\n", "import { createRampPreset } from \"./create-ramp.js\";\n\nexport const OCEAN_PRESET = createRampPreset([\n\t\"#7dcfff\",\n\t\"#4f9fba\",\n\t\"#2d6f88\",\n\t\"#23475b\",\n\t\"#182b3a\",\n]);\n", "import { createRampPreset } from \"./create-ramp.js\";\n\nexport const SUNSET_PRESET = createRampPreset([\n\t\"#ffcf70\",\n\t\"#f59e6f\",\n\t\"#dc718a\",\n\t\"#8f5b78\",\n\t\"#493447\",\n]);\n", "import type { PowerlinePreset } from \"./types.js\";\n\nexport const TOKYO_NIGHT_PRESET: PowerlinePreset = {\n\tlead: \"#a3aed2\",\n\tblocks: {\n\t\theader: { fg: \"#090c0c\", bg: \"#a3aed2\" },\n\t\tdirectory: { fg: \"#e3e5e5\", bg: \"#769ff0\" },\n\t\tgit: { fg: \"#769ff0\", bg: \"#394260\" },\n\t\truntime: { fg: \"#769ff0\", bg: \"#212736\" },\n\t\tmeter: { fg: \"#a0a9cb\", bg: \"#1d2230\" },\n\t},\n\textensionSeparator: \"#394260\",\n};\n", "import {\n\ttype PaletteName,\n\ttype PalettePreset,\n\ttype PowerlineBlockName,\n\tSEGMENT_NAMES,\n\ttype SegmentName,\n\ttype SegmentPalette,\n} from \"../types.js\";\nimport { CANDY_PRESET } from \"./candy.js\";\nimport { CUSTOM_PRESET } from \"./custom.js\";\nimport { FOREST_PRESET } from \"./forest.js\";\nimport { MONO_PRESET } from \"./mono.js\";\nimport { NEON_PRESET } from \"./neon.js\";\nimport { OCEAN_PRESET } from \"./ocean.js\";\nimport { SUNSET_PRESET } from \"./sunset.js\";\nimport { TOKYO_NIGHT_PRESET } from \"./tokyo-night.js\";\nimport type { PowerlinePreset } from \"./types.js\";\n\nconst PRESETS = {\n\t\"tokyo-night\": TOKYO_NIGHT_PRESET,\n\tocean: OCEAN_PRESET,\n\tsunset: SUNSET_PRESET,\n\tforest: FOREST_PRESET,\n\tcandy: CANDY_PRESET,\n\tneon: NEON_PRESET,\n\tmono: MONO_PRESET,\n\tcustom: CUSTOM_PRESET,\n} satisfies Record<PalettePreset, PowerlinePreset>;\n\nconst SEGMENT_BLOCKS: Record<SegmentName, PowerlineBlockName> = {\n\tbrand: \"header\",\n\tprovider: \"header\",\n\tmodel: \"header\",\n\tthinking: \"header\",\n\tcwd: \"directory\",\n\tbranch: \"git\",\n\ttools: \"runtime\",\n\tcontext: \"runtime\",\n\ttokens: \"runtime\",\n\tcache: \"runtime\",\n\tcost: \"meter\",\n\ttime: \"meter\",\n\tturn: \"meter\",\n};\n\nexport function resolvePreset(preset: PalettePreset): PowerlinePreset {\n\treturn PRESETS[preset];\n}\n\nexport function segmentPaletteForPreset(preset: PaletteName): SegmentPalette {\n\tconst blocks = PRESETS[preset].blocks;\n\treturn Object.fromEntries(\n\t\tSEGMENT_NAMES.map((name) => [name, { ...blocks[SEGMENT_BLOCKS[name]] }]),\n\t) as SegmentPalette;\n}\n", "import type { ConfigSegmentName, SegmentName } from \"./types.js\";\n\nexport const INFORMATION_PROFILE_NAMES = [\"minimal\", \"balanced\", \"detailed\"] as const;\nexport type InformationProfileName = (typeof INFORMATION_PROFILE_NAMES)[number];\nexport type InformationProfile = InformationProfileName | \"custom\";\n\nexport const INFORMATION_PROFILES: Readonly<\n\tRecord<InformationProfileName, readonly SegmentName[]>\n> = {\n\tminimal: [\"model\", \"cwd\", \"branch\", \"context\"],\n\tbalanced: [\"model\", \"thinking\", \"cwd\", \"branch\", \"tools\", \"context\", \"time\"],\n\tdetailed: [\n\t\t\"provider\",\n\t\t\"model\",\n\t\t\"thinking\",\n\t\t\"cwd\",\n\t\t\"branch\",\n\t\t\"tools\",\n\t\t\"context\",\n\t\t\"tokens\",\n\t\t\"cache\",\n\t\t\"cost\",\n\t\t\"time\",\n\t],\n};\n\nexport function inferInformationProfile(\n\tsegments: readonly ConfigSegmentName[],\n): InformationProfile {\n\tfor (const name of INFORMATION_PROFILE_NAMES) {\n\t\tconst profile = INFORMATION_PROFILES[name];\n\t\tif (\n\t\t\tsegments.length === profile.length &&\n\t\t\tsegments.every((segment, index) => segment === profile[index])\n\t\t) {\n\t\t\treturn name;\n\t\t}\n\t}\n\treturn \"custom\";\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { lstatSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { getAgentDir } from \"@earendil-works/pi-coding-agent\";\nimport { INFORMATION_PROFILES } from \"./information-profiles.js\";\nimport { segmentPaletteForPreset } from \"./presets/index.js\";\nimport {\n\ttype ConfigSegmentName,\n\tDENSITIES,\n\tLINE_BREAK_SEGMENT_NAME,\n\tPALETTE_NAMES,\n\tPALETTE_PRESET_NAMES,\n\ttype PaletteName,\n\tSEGMENT_NAMES,\n\tSEPARATOR_NAMES,\n\ttype SegmentName,\n\ttype SegmentPalette,\n\ttype StatuslineConfig,\n\tTRUNCATION_DIRECTIONS,\n} from \"./types.js\";\n\nexport const SETTINGS_FILE_NAME = \"pi-statusline.json\";\nconst LEGACY_SETTINGS_FILE_NAME = \"pi-statusline-settings.json\";\n\nconst DEFAULT_DOCUMENT_EXTENSION_STATUS_ICONS: Record<string, string> = {\n\taccounts: \"\uD83D\uDC64\",\n\tcaffeinate: \"\uD83D\uDC8A\",\n\t\"chrome-devtools\": \"\uD83C\uDF10\",\n\tfirecrawl: \"\uD83D\uDD25\",\n\t\"github-pr\": \"\uD83D\uDD0E\",\n\tgoal: \"\uD83C\uDFAF\",\n\t\"google-genai\": \"\u2728\",\n\tlsp: \"\uD83E\uDDF0\",\n\t\"plan-mode\": \"\uD83D\uDCDD\",\n\tretry: \"\uD83D\uDD01\",\n\tsubagents: \"\uD83E\uDDD1\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1\",\n\tsync: \"\uD83D\uDD04\",\n\tusage: \"\uD83D\uDCCA\",\n};\n\nexport const DEFAULT_EXTENSION_STATUS_ICONS: Record<string, string> = {\n\t...DEFAULT_DOCUMENT_EXTENSION_STATUS_ICONS,\n\t\"codex-usage\": \"\uD83D\uDCCA\",\n\tpisync: \"\uD83D\uDD04\",\n\t\"unknown-error-retry\": \"\uD83D\uDD01\",\n};\n\nconst LEGACY_STATUS_ICON_KEYS = {\n\tpisync: \"sync\",\n\t\"unknown-error-retry\": \"retry\",\n} as const;\n\nconst DEFAULT_SEGMENTS: SegmentName[] = [...INFORMATION_PROFILES.balanced];\n\nexport const DEFAULT_STATUSLINE_CONFIG: StatuslineConfig = {\n\tpalettePreset: \"tokyo-night\",\n\tpalette: segmentPaletteForPreset(\"tokyo-night\"),\n\tdensity: \"compact\",\n\tseparator: \"none\",\n\tsegments: DEFAULT_SEGMENTS,\n\tsegmentText: {\n\t\tbrand: { prefix: \"\", suffix: \"\" },\n\t\tprovider: { prefix: \"\uD83D\uDD0C \", suffix: \"\" },\n\t\tmodel: {\n\t\t\tprefix: \"\uD83E\uDD16 \",\n\t\t\tsuffix: \"\",\n\t\t\ttruncationLength: 36,\n\t\t\ttruncationSymbol: \"\u2026\",\n\t\t\ttruncationDirection: \"start\",\n\t\t},\n\t\tthinking: { prefix: \"\uD83E\uDDE0 \", suffix: \"\" },\n\t\tcwd: { prefix: \"\uD83D\uDCC1 \", suffix: \"\" },\n\t\tbranch: { prefix: \"\uD83C\uDF3F \", suffix: \"\" },\n\t\ttools: { prefix: \"\", suffix: \"\" },\n\t\tcontext: { prefix: \"\uD83E\uDE9F ctx \", suffix: \"\" },\n\t\ttokens: { prefix: \"\uD83D\uDD22 \", suffix: \"\" },\n\t\tcache: { prefix: \"\uD83D\uDCE6 \", suffix: \"\" },\n\t\tcost: { prefix: \"\uD83D\uDCB8 $\", suffix: \"\" },\n\t\ttime: { prefix: \"\uD83D\uDD52 \", suffix: \"\" },\n\t\tturn: { prefix: \"\uD83D\uDD01 #\", suffix: \"\" },\n\t},\n\textensionStatusIcons: DEFAULT_EXTENSION_STATUS_ICONS,\n};\n\nconst DEFAULT_STATUSLINE_DOCUMENT_CONFIG = {\n\tpalettePreset: DEFAULT_STATUSLINE_CONFIG.palettePreset,\n\tdensity: DEFAULT_STATUSLINE_CONFIG.density,\n\tseparator: DEFAULT_STATUSLINE_CONFIG.separator,\n\tsegments: DEFAULT_SEGMENTS,\n\tsegmentText: DEFAULT_STATUSLINE_CONFIG.segmentText,\n\textensionStatusIcons: DEFAULT_DOCUMENT_EXTENSION_STATUS_ICONS,\n} satisfies Omit<StatuslineConfig, \"palette\">;\n\nexport const DEFAULT_STATUSLINE_DOCUMENT = `${JSON.stringify(\n\tDEFAULT_STATUSLINE_DOCUMENT_CONFIG,\n\tnull,\n\t\"\\t\",\n)}\\n`;\n\nexport interface StatuslineConfigDiagnostic {\n\tseverity: \"warning\" | \"error\";\n\tcode: \"unknown\" | \"invalid\" | \"parse\" | \"io\";\n\tpath: string;\n\tmessage: string;\n}\n\nexport interface LoadedStatuslineSettings {\n\tconfig: StatuslineConfig;\n\tsource: \"built-in\" | \"user\";\n\tsettingsPath: string;\n\trawDocument?: string;\n\tfileIdentity?: { dev: number; ino: number };\n\tdiagnostics: StatuslineConfigDiagnostic[];\n}\n\ninterface AtomicFileSystem {\n\tmkdirSync: typeof mkdirSync;\n\twriteFileSync: typeof writeFileSync;\n\trenameSync: typeof renameSync;\n\trmSync: typeof rmSync;\n}\n\nlet pendingSettingsNotice: string | undefined;\n\nexport function settingsFilePath(agentDir = getAgentDir()): string {\n\treturn join(agentDir, SETTINGS_FILE_NAME);\n}\n\nexport function createDefaultConfig(): StatuslineConfig {\n\treturn cloneConfig(DEFAULT_STATUSLINE_CONFIG);\n}\n\nexport function normalizeStatuslineConfig(value: unknown): {\n\tconfig: StatuslineConfig;\n\tdiagnostics: StatuslineConfigDiagnostic[];\n} {\n\tconst config = createDefaultConfig();\n\tconst diagnostics: StatuslineConfigDiagnostic[] = [];\n\tif (!isRecord(value)) {\n\t\treturn {\n\t\t\tconfig,\n\t\t\tdiagnostics: [invalidDiagnostic(\"\", \"Settings must contain a JSON object\", \"error\")],\n\t\t};\n\t}\n\tconst knownRoot = new Set([\n\t\t\"palettePreset\",\n\t\t\"palette\",\n\t\t\"density\",\n\t\t\"separator\",\n\t\t\"segments\",\n\t\t\"segmentText\",\n\t\t\"extensionStatusIcons\",\n\t]);\n\tfor (const key of Object.keys(value)) {\n\t\tif (!knownRoot.has(key)) diagnostics.push(unknownDiagnostic(key));\n\t}\n\n\tnormalizePalette(value.palette, config, diagnostics);\n\tnormalizeEnum(value, \"palettePreset\", PALETTE_PRESET_NAMES, config, diagnostics);\n\tif (!isRecord(value.palette) && isPaletteName(config.palettePreset)) {\n\t\tconfig.palette = segmentPaletteForPreset(config.palettePreset);\n\t}\n\tnormalizeEnum(value, \"density\", DENSITIES, config, diagnostics);\n\tnormalizeEnum(value, \"separator\", SEPARATOR_NAMES, config, diagnostics);\n\n\tif (value.segments !== undefined) {\n\t\tif (!Array.isArray(value.segments)) {\n\t\t\tdiagnostics.push(invalidDiagnostic(\"segments\", \"Expected an array of segment names\"));\n\t\t} else {\n\t\t\tconst segments: ConfigSegmentName[] = [];\n\t\t\tconst seen = new Set<SegmentName>();\n\t\t\tfor (const [index, item] of value.segments.entries()) {\n\t\t\t\tconst path = `segments[${index}]`;\n\t\t\t\tif (typeof item !== \"string\" || !isConfigSegmentName(item)) {\n\t\t\t\t\tdiagnostics.push(invalidDiagnostic(path, \"Unknown or non-string segment name\"));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (item === LINE_BREAK_SEGMENT_NAME) {\n\t\t\t\t\tif (segments.at(-1) === LINE_BREAK_SEGMENT_NAME) {\n\t\t\t\t\t\tdiagnostics.push(\n\t\t\t\t\t\t\tinvalidDiagnostic(path, \"Consecutive line_break segments are not allowed\"),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tsegments.push(item);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (seen.has(item)) {\n\t\t\t\t\tdiagnostics.push(invalidDiagnostic(path, `Duplicate segment ${JSON.stringify(item)}`));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tseen.add(item);\n\t\t\t\tsegments.push(item);\n\t\t\t}\n\t\t\tconfig.segments = segments;\n\t\t}\n\t}\n\n\tif (value.segmentText !== undefined) {\n\t\tif (!isRecord(value.segmentText)) {\n\t\t\tdiagnostics.push(invalidDiagnostic(\"segmentText\", \"Expected an object\"));\n\t\t} else {\n\t\t\tfor (const [name, presentation] of Object.entries(value.segmentText)) {\n\t\t\t\tconst path = `segmentText.${name}`;\n\t\t\t\tif (!isSegmentName(name)) {\n\t\t\t\t\tdiagnostics.push(unknownDiagnostic(path));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (!isRecord(presentation)) {\n\t\t\t\t\tdiagnostics.push(invalidDiagnostic(path, \"Expected an object\"));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst knownFields = new Set([\n\t\t\t\t\t\"prefix\",\n\t\t\t\t\t\"suffix\",\n\t\t\t\t\t...(name === \"model\"\n\t\t\t\t\t\t? [\"truncationLength\", \"truncationSymbol\", \"truncationDirection\"]\n\t\t\t\t\t\t: []),\n\t\t\t\t]);\n\t\t\t\tfor (const key of Object.keys(presentation)) {\n\t\t\t\t\tif (!knownFields.has(key)) diagnostics.push(unknownDiagnostic(`${path}.${key}`));\n\t\t\t\t}\n\t\t\t\tfor (const field of [\"prefix\", \"suffix\"] as const) {\n\t\t\t\t\tconst fieldValue = presentation[field];\n\t\t\t\t\tif (fieldValue === undefined) continue;\n\t\t\t\t\tif (!isSafeSegmentText(fieldValue, `${path}.${field}`, diagnostics)) continue;\n\t\t\t\t\tconfig.segmentText[name][field] = fieldValue;\n\t\t\t\t}\n\t\t\t\tif (name === \"model\") {\n\t\t\t\t\tnormalizeModelTruncation(presentation, config, diagnostics);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (value.extensionStatusIcons !== undefined) {\n\t\tif (!isRecord(value.extensionStatusIcons)) {\n\t\t\tdiagnostics.push(invalidDiagnostic(\"extensionStatusIcons\", \"Expected an object\"));\n\t\t} else {\n\t\t\tfor (const [key, icon] of Object.entries(value.extensionStatusIcons)) {\n\t\t\t\tif (typeof icon !== \"string\") {\n\t\t\t\t\tdiagnostics.push(invalidDiagnostic(`extensionStatusIcons.${key}`, \"Expected a string\"));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tObject.defineProperty(config.extensionStatusIcons, key, {\n\t\t\t\t\tvalue: icon,\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t});\n\t\t\t}\n\t\t\tfor (const [legacyKey, canonicalKey] of Object.entries(LEGACY_STATUS_ICON_KEYS)) {\n\t\t\t\tconst legacyIcon = Object.hasOwn(value.extensionStatusIcons, legacyKey)\n\t\t\t\t\t? value.extensionStatusIcons[legacyKey]\n\t\t\t\t\t: undefined;\n\t\t\t\tconst canonicalIcon = Object.hasOwn(value.extensionStatusIcons, canonicalKey)\n\t\t\t\t\t? value.extensionStatusIcons[canonicalKey]\n\t\t\t\t\t: undefined;\n\t\t\t\tconst targetKey = typeof canonicalIcon === \"string\" ? legacyKey : canonicalKey;\n\t\t\t\tconst inheritedIcon =\n\t\t\t\t\ttypeof canonicalIcon === \"string\"\n\t\t\t\t\t\t? canonicalIcon\n\t\t\t\t\t\t: typeof legacyIcon === \"string\"\n\t\t\t\t\t\t\t? legacyIcon\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\tif (inheritedIcon === undefined) continue;\n\t\t\t\tObject.defineProperty(config.extensionStatusIcons, targetKey, {\n\t\t\t\t\tvalue: inheritedIcon,\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { config, diagnostics };\n}\n\nexport function loadStatuslineSettings(settingsPath: string): LoadedStatuslineSettings {\n\tlet rawDocument: string;\n\ttry {\n\t\trawDocument = readFileSync(settingsPath, \"utf8\");\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\" && !pathExists(settingsPath)) {\n\t\t\treturn builtInSettings(settingsPath);\n\t\t}\n\t\treturn builtInSettings(settingsPath, [\n\t\t\tdiagnostic(\"error\", \"io\", \"\", `Unable to read settings: ${formatError(error)}`),\n\t\t]);\n\t}\n\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(rawDocument);\n\t} catch (error) {\n\t\treturn {\n\t\t\t...builtInSettings(settingsPath, [\n\t\t\t\tdiagnostic(\"error\", \"parse\", \"\", `Unable to parse JSON: ${formatError(error)}`),\n\t\t\t]),\n\t\t\trawDocument,\n\t\t};\n\t}\n\tconst normalized = normalizeStatuslineConfig(parsed);\n\treturn {\n\t\tconfig: normalized.config,\n\t\tsource: normalized.diagnostics.some((item) => item.severity === \"error\") ? \"built-in\" : \"user\",\n\t\tsettingsPath,\n\t\trawDocument,\n\t\tdiagnostics: normalized.diagnostics,\n\t};\n}\n\nexport function loadStatuslineSettingsForAgent(agentDir = getAgentDir()): LoadedStatuslineSettings {\n\tpendingSettingsNotice = undefined;\n\tconst canonicalPath = settingsFilePath(agentDir);\n\tconst legacyPath = join(agentDir, LEGACY_SETTINGS_FILE_NAME);\n\tconst canonical = loadStatuslineSettings(canonicalPath);\n\tif (!isMissingStatuslineSettings(canonical)) {\n\t\tif (!isMissingStatuslineSettings(loadStatuslineSettings(legacyPath))) {\n\t\t\tpendingSettingsNotice = `${LEGACY_SETTINGS_FILE_NAME} ignored because ${SETTINGS_FILE_NAME} takes precedence.`;\n\t\t}\n\t\treturn canonical;\n\t}\n\tconst legacy = loadStatuslineSettings(legacyPath);\n\treturn isMissingStatuslineSettings(legacy)\n\t\t? canonical\n\t\t: migrateLegacySettings(canonicalPath, legacy);\n}\n\nfunction migrateLegacySettings(\n\tcanonicalPath: string,\n\tlegacy: LoadedStatuslineSettings,\n): LoadedStatuslineSettings {\n\tconst racedCanonical = loadStatuslineSettings(canonicalPath);\n\tif (!isMissingStatuslineSettings(racedCanonical)) {\n\t\tpendingSettingsNotice = `${LEGACY_SETTINGS_FILE_NAME} ignored because ${SETTINGS_FILE_NAME} was created concurrently.`;\n\t\treturn racedCanonical;\n\t}\n\tif (\n\t\tlegacy.source !== \"user\" ||\n\t\tlegacy.rawDocument === undefined ||\n\t\tblockingDiagnostics(legacy.diagnostics).length > 0\n\t) {\n\t\tpendingSettingsNotice = `${LEGACY_SETTINGS_FILE_NAME} is invalid and was ignored.`;\n\t\treturn legacy;\n\t}\n\tpendingSettingsNotice = `Using legacy ${LEGACY_SETTINGS_FILE_NAME}; rename it to ${SETTINGS_FILE_NAME}. Future saves write ${SETTINGS_FILE_NAME} without modifying the legacy file.`;\n\treturn legacy;\n}\n\nfunction isMissingStatuslineSettings(settings: LoadedStatuslineSettings): boolean {\n\treturn (\n\t\tsettings.source === \"built-in\" &&\n\t\tsettings.rawDocument === undefined &&\n\t\tsettings.diagnostics.length === 0\n\t);\n}\n\nexport function saveStatuslineSettingsDocument(\n\tsettingsPath: string,\n\trawDocument: string,\n\toverrides: Partial<AtomicFileSystem> = {},\n): LoadedStatuslineSettings {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(rawDocument);\n\t} catch (error) {\n\t\tthrow new Error(`Unable to parse JSON: ${formatError(error)}`);\n\t}\n\tconst normalized = normalizeStatuslineConfig(parsed);\n\tconst blocking = blockingDiagnostics(normalized.diagnostics);\n\tif (blocking.length > 0) {\n\t\tthrow new Error(blocking.map((item) => `${item.path || \"root\"}: ${item.message}`).join(\"\\n\"));\n\t}\n\n\tconst fs = { mkdirSync, writeFileSync, renameSync, rmSync, ...overrides };\n\tconst replaceExisting = pathEntryExists(settingsPath);\n\tconst temporaryPath = temporarySettingsPath(settingsPath);\n\tlet fileIdentity: { dev: number; ino: number } | undefined;\n\ttry {\n\t\tfs.mkdirSync(dirname(settingsPath), { recursive: true });\n\t\tfs.writeFileSync(temporaryPath, rawDocument, { encoding: \"utf8\", flag: \"wx\" });\n\t\tconst info = lstatSync(temporaryPath);\n\t\tfileIdentity = { dev: info.dev, ino: info.ino };\n\t\tif (!replaceExisting && pathEntryExists(settingsPath)) {\n\t\t\tthrow new Error(`${SETTINGS_FILE_NAME} was created concurrently; reopen settings and retry.`);\n\t\t}\n\t\tfs.renameSync(temporaryPath, settingsPath);\n\t} finally {\n\t\tremoveTemporaryFile(fs.rmSync, temporaryPath);\n\t}\n\treturn {\n\t\tconfig: normalized.config,\n\t\tsource: \"user\",\n\t\tsettingsPath,\n\t\trawDocument,\n\t\t...(fileIdentity ? { fileIdentity } : {}),\n\t\tdiagnostics: normalized.diagnostics,\n\t};\n}\n\nexport function removeStatuslineSettingsDocumentIfMatches(\n\tsettingsPath: string,\n\texpectedRawDocument: string,\n\texpectedIdentity: { dev: number; ino: number },\n): void {\n\tconst quarantinePath = join(\n\t\tdirname(settingsPath),\n\t\t`.${SETTINGS_FILE_NAME}.${randomUUID()}.rollback`,\n\t);\n\tconst before = lstatSync(settingsPath);\n\tif (before.dev !== expectedIdentity.dev || before.ino !== expectedIdentity.ino) {\n\t\tthrow new Error(\"Statusline settings changed concurrently; the newer file was preserved\");\n\t}\n\trenameSync(settingsPath, quarantinePath);\n\tconst quarantined = lstatSync(quarantinePath);\n\tconst quarantinedSavedFile =\n\t\tquarantined.isFile() &&\n\t\t!quarantined.isSymbolicLink() &&\n\t\tquarantined.dev === expectedIdentity.dev &&\n\t\tquarantined.ino === expectedIdentity.ino;\n\tif (quarantinedSavedFile && readFileSync(quarantinePath, \"utf8\") === expectedRawDocument) {\n\t\trmSync(quarantinePath);\n\t\treturn;\n\t}\n\tif (quarantinedSavedFile && !pathEntryExists(settingsPath)) {\n\t\ttry {\n\t\t\trenameSync(quarantinePath, settingsPath);\n\t\t} catch {\n\t\t\t// Keep the quarantine for recovery when its atomic restoration fails.\n\t\t}\n\t}\n\tthrow new Error(\"Statusline settings changed concurrently; the newer file was preserved\");\n}\n\nexport function consumeStatuslineSettingsNotice(): string | undefined {\n\tconst notice = pendingSettingsNotice;\n\tpendingSettingsNotice = undefined;\n\treturn notice;\n}\n\nexport function readStatuslineSettings(settingsPath?: string): StatuslineConfig {\n\treturn settingsPath\n\t\t? loadStatuslineSettings(settingsPath).config\n\t\t: loadStatuslineSettingsForAgent().config;\n}\n\nexport function normalizeStatuslineSettings(value: unknown): StatuslineConfig {\n\treturn normalizeStatuslineConfig(value).config;\n}\n\nfunction normalizePalette(\n\tvalue: unknown,\n\tconfig: StatuslineConfig,\n\tdiagnostics: StatuslineConfigDiagnostic[],\n) {\n\tif (value === undefined) return;\n\tif (typeof value === \"string\") {\n\t\tif (!(PALETTE_NAMES as readonly string[]).includes(value)) {\n\t\t\tdiagnostics.push(\n\t\t\t\tinvalidDiagnostic(\n\t\t\t\t\t\"palette\",\n\t\t\t\t\t`Expected a palette object or one of: ${PALETTE_NAMES.join(\", \")}`,\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tconfig.palettePreset = value as (typeof PALETTE_NAMES)[number];\n\t\treturn;\n\t}\n\tif (!isRecord(value)) {\n\t\tdiagnostics.push(invalidDiagnostic(\"palette\", \"Expected a palette object\"));\n\t\treturn;\n\t}\n\n\tconst palette: SegmentPalette = {};\n\tconfig.palette = palette;\n\tfor (const [name, colors] of Object.entries(value)) {\n\t\tconst path = `palette.${name}`;\n\t\tif (!isSegmentName(name)) {\n\t\t\tdiagnostics.push(unknownDiagnostic(path));\n\t\t\tcontinue;\n\t\t}\n\t\tif (!isRecord(colors)) {\n\t\t\tdiagnostics.push(invalidDiagnostic(path, \"Expected an object\"));\n\t\t\tcontinue;\n\t\t}\n\t\tconst normalizedColors: NonNullable<SegmentPalette[SegmentName]> = {};\n\t\tpalette[name] = normalizedColors;\n\t\tfor (const [field, color] of Object.entries(colors)) {\n\t\t\tconst colorPath = `${path}.${field}`;\n\t\t\tif (field !== \"fg\" && field !== \"bg\") {\n\t\t\t\tdiagnostics.push(unknownDiagnostic(colorPath));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (typeof color !== \"string\" || !/^#[0-9a-f]{6}$/iu.test(color)) {\n\t\t\t\tdiagnostics.push(invalidDiagnostic(colorPath, \"Expected a full #RRGGBB hexadecimal color\"));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tnormalizedColors[field] = color.toLowerCase();\n\t\t}\n\t}\n\tconfig.palette = palette;\n\tconfig.palettePreset = \"custom\";\n}\n\nfunction normalizeModelTruncation(\n\tpresentation: Record<string, unknown>,\n\tconfig: StatuslineConfig,\n\tdiagnostics: StatuslineConfigDiagnostic[],\n) {\n\tconst path = \"segmentText.model\";\n\tconst length = presentation.truncationLength;\n\tif (length !== undefined) {\n\t\tif (typeof length !== \"number\" || !Number.isInteger(length) || length < 0 || length > 1000) {\n\t\t\tdiagnostics.push(\n\t\t\t\tinvalidDiagnostic(`${path}.truncationLength`, \"Expected an integer from 0 through 1000\"),\n\t\t\t);\n\t\t} else config.segmentText.model.truncationLength = length;\n\t}\n\n\tconst symbol = presentation.truncationSymbol;\n\tif (symbol !== undefined && isSafeSegmentText(symbol, `${path}.truncationSymbol`, diagnostics)) {\n\t\tconfig.segmentText.model.truncationSymbol = symbol;\n\t}\n\n\tconst direction = presentation.truncationDirection;\n\tif (direction !== undefined) {\n\t\tif (\n\t\t\ttypeof direction !== \"string\" ||\n\t\t\t!TRUNCATION_DIRECTIONS.includes(direction as (typeof TRUNCATION_DIRECTIONS)[number])\n\t\t) {\n\t\t\tdiagnostics.push(\n\t\t\t\tinvalidDiagnostic(\n\t\t\t\t\t`${path}.truncationDirection`,\n\t\t\t\t\t`Expected one of: ${TRUNCATION_DIRECTIONS.join(\", \")}`,\n\t\t\t\t),\n\t\t\t);\n\t\t} else {\n\t\t\tconfig.segmentText.model.truncationDirection =\n\t\t\t\tdirection as (typeof TRUNCATION_DIRECTIONS)[number];\n\t\t}\n\t}\n}\n\nfunction isSafeSegmentText(\n\tvalue: unknown,\n\tpath: string,\n\tdiagnostics: StatuslineConfigDiagnostic[],\n): value is string {\n\tif (typeof value !== \"string\") {\n\t\tdiagnostics.push(invalidDiagnostic(path, \"Expected a string\"));\n\t\treturn false;\n\t}\n\tif (/[\\r\\n\\u2028\\u2029]/u.test(value)) {\n\t\tdiagnostics.push(invalidDiagnostic(path, \"Line breaks are not allowed; use line_break\"));\n\t\treturn false;\n\t}\n\tif (hasControlCharacter(value)) {\n\t\tdiagnostics.push(invalidDiagnostic(path, \"Control characters are not allowed\"));\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nfunction normalizeEnum<\n\tK extends \"palettePreset\" | \"density\" | \"separator\",\n\tT extends StatuslineConfig[K],\n>(\n\tvalue: Record<string, unknown>,\n\tfield: K,\n\taccepted: readonly T[],\n\tconfig: StatuslineConfig,\n\tdiagnostics: StatuslineConfigDiagnostic[],\n) {\n\tconst candidate = value[field];\n\tif (candidate === undefined) return;\n\tif (typeof candidate !== \"string\" || !accepted.includes(candidate as T)) {\n\t\tdiagnostics.push(\n\t\t\tinvalidDiagnostic(field, `Expected one of: ${accepted.map(String).join(\", \")}`),\n\t\t);\n\t\treturn;\n\t}\n\tconfig[field] = candidate as StatuslineConfig[K];\n}\n\nfunction cloneSegmentPalette(palette: SegmentPalette): SegmentPalette {\n\treturn Object.fromEntries(\n\t\tObject.entries(palette).map(([name, colors]) => [name, { ...colors }]),\n\t) as SegmentPalette;\n}\n\nfunction cloneConfig(config: StatuslineConfig): StatuslineConfig {\n\treturn {\n\t\t...config,\n\t\tpalette: cloneSegmentPalette(config.palette),\n\t\tsegments: [...config.segments],\n\t\tsegmentText: Object.fromEntries(\n\t\t\tSEGMENT_NAMES.map((name) => [name, { ...config.segmentText[name] }]),\n\t\t) as StatuslineConfig[\"segmentText\"],\n\t\textensionStatusIcons: { ...config.extensionStatusIcons },\n\t};\n}\n\nfunction builtInSettings(\n\tsettingsPath: string,\n\tdiagnostics: StatuslineConfigDiagnostic[] = [],\n): LoadedStatuslineSettings {\n\treturn {\n\t\tconfig: createDefaultConfig(),\n\t\tsource: \"built-in\",\n\t\tsettingsPath,\n\t\tdiagnostics,\n\t};\n}\n\nfunction hasControlCharacter(value: string): boolean {\n\tfor (const character of value) {\n\t\tconst codePoint = character.codePointAt(0) ?? 0;\n\t\tif (codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f)) return true;\n\t}\n\treturn false;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isConfigSegmentName(value: string): value is ConfigSegmentName {\n\treturn value === LINE_BREAK_SEGMENT_NAME || isSegmentName(value);\n}\n\nfunction isPaletteName(value: StatuslineConfig[\"palettePreset\"]): value is PaletteName {\n\treturn (PALETTE_NAMES as readonly StatuslineConfig[\"palettePreset\"][]).includes(value);\n}\n\nfunction isSegmentName(value: string): value is SegmentName {\n\treturn (SEGMENT_NAMES as readonly string[]).includes(value);\n}\n\nfunction blockingDiagnostics(\n\tdiagnostics: readonly StatuslineConfigDiagnostic[],\n): StatuslineConfigDiagnostic[] {\n\treturn diagnostics.filter((item) => item.code !== \"unknown\");\n}\n\nfunction unknownDiagnostic(path: string): StatuslineConfigDiagnostic {\n\treturn diagnostic(\"warning\", \"unknown\", path, `Unknown setting ${JSON.stringify(path)}`);\n}\n\nfunction invalidDiagnostic(\n\tpath: string,\n\tmessage: string,\n\tseverity: StatuslineConfigDiagnostic[\"severity\"] = \"warning\",\n): StatuslineConfigDiagnostic {\n\treturn diagnostic(severity, \"invalid\", path, message);\n}\n\nfunction diagnostic(\n\tseverity: StatuslineConfigDiagnostic[\"severity\"],\n\tcode: StatuslineConfigDiagnostic[\"code\"],\n\tpath: string,\n\tmessage: string,\n): StatuslineConfigDiagnostic {\n\treturn { severity, code, path, message };\n}\n\nfunction temporarySettingsPath(settingsPath: string): string {\n\treturn join(dirname(settingsPath), `.${SETTINGS_FILE_NAME}.${randomUUID()}.tmp`);\n}\n\nfunction removeTemporaryFile(remove: typeof rmSync, temporaryPath: string) {\n\ttry {\n\t\tremove(temporaryPath, { force: true });\n\t} catch {\n\t\t// Best-effort cleanup must not replace the original operation result.\n\t}\n}\n\nfunction pathExists(path: string): boolean {\n\ttry {\n\t\tlstatSync(path);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction pathEntryExists(path: string): boolean {\n\ttry {\n\t\tlstatSync(path);\n\t\treturn true;\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n\t\tthrow error;\n\t}\n}\n\nfunction formatError(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n"],
5
- "mappings": ";;;;AAEO,IAAM,yBAAsD;AAAA,EAClE,EAAE,OAAO,YAAY,OAAO,YAAY,aAAa,0BAA0B;AAAA,EAC/E,EAAE,OAAO,UAAU,OAAO,UAAU,aAAa,qCAAqC;AAAA,EACtF,EAAE,OAAO,QAAQ,OAAO,QAAQ,aAAa,0BAA0B;AACxE;AAEO,SAAS,4BAA4B,QAA2C;AACtF,QAAM,aAAa,OAAO,KAAK,EAAE,YAAY;AAC7C,QAAM,UAAU,uBAAuB,OAAO,CAAC,SAAS,KAAK,MAAM,WAAW,UAAU,CAAC;AACzF,SAAO,QAAQ,SAAS,IAAI,CAAC,GAAG,OAAO,IAAI;AAC5C;;;ACVO,IAAM,gBAAgB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAGO,IAAM,0BAA0B;AAGhC,IAAM,gBAAgB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAGO,IAAM,uBAAuB,CAAC,GAAG,eAAe,QAAQ;AAGxD,IAAM,YAAY,CAAC,WAAW,MAAM;AAGpC,IAAM,kBAAkB,CAAC,QAAQ,OAAO,OAAO,aAAa,OAAO;AAGnE,IAAM,wBAAwB,CAAC,SAAS,UAAU,KAAK;;;ACvC9D,IAAM,cAAoC,CAAC,UAAU,aAAa,OAAO,WAAW,OAAO;AAIpF,SAAS,iBAAiB,aAA2C;AAC3E,SAAO;AAAA,IACN,MAAM,YAAY,CAAC;AAAA,IACnB,QAAQ,OAAO;AAAA,MACd,YAAY,IAAI,CAAC,OAAO,UAAU;AACjC,cAAM,aAAa,YAAY,KAAK;AACpC,eAAO,CAAC,OAAO,EAAE,IAAI,cAAc,UAAU,GAAG,IAAI,WAAW,CAAC;AAAA,MACjE,CAAC;AAAA,IACF;AAAA,IACA,oBAAoB,YAAY,CAAC;AAAA,EAClC;AACD;AAEA,SAAS,cAAc,KAAqB;AAC3C,QAAM,aAAa,kBAAkB,GAAG;AACxC,QAAM,OAAO,kBAAkB,SAAS;AACxC,QAAM,QAAQ,kBAAkB,SAAS;AACzC,SAAO,cAAc,YAAY,IAAI,KAAK,cAAc,YAAY,KAAK,IACtE,YACA;AACJ;AAEA,SAAS,cAAc,MAAc,OAAuB;AAC3D,UAAQ,KAAK,IAAI,MAAM,KAAK,IAAI,SAAS,KAAK,IAAI,MAAM,KAAK,IAAI;AAClE;AAEA,SAAS,kBAAkB,KAAqB;AAC/C,QAAM,aAAa,IAAI,MAAM,CAAC;AAC9B,QAAM,WAAW,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,WAAW;AAC1C,UAAM,QAAQ,OAAO,SAAS,WAAW,MAAM,QAAQ,SAAS,CAAC,GAAG,EAAE,IAAI;AAC1E,WAAO,SAAS,UAAU,QAAQ,UAAU,QAAQ,SAAS,UAAU;AAAA,EACxE,CAAC;AACD,SAAO,UAAU,SAAS,CAAC,KAAK,KAAK,UAAU,SAAS,CAAC,KAAK,KAAK,UAAU,SAAS,CAAC,KAAK;AAC7F;;;ACtCO,IAAM,eAAe,iBAAiB;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,CAAC;;;ACNM,IAAM,gBAAiC;AAAA,EAC7C,QAAQ;AAAA,IACP,QAAQ,CAAC;AAAA,IACT,WAAW,CAAC;AAAA,IACZ,KAAK,CAAC;AAAA,IACN,SAAS,CAAC;AAAA,IACV,OAAO,CAAC;AAAA,EACT;AACD;;;ACRO,IAAM,gBAAgB,iBAAiB;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,CAAC;;;ACNM,IAAM,cAAc,iBAAiB;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,CAAC;;;ACNM,IAAM,cAAc,iBAAiB;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,CAAC;;;ACNM,IAAM,eAAe,iBAAiB;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,CAAC;;;ACNM,IAAM,gBAAgB,iBAAiB;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,CAAC;;;ACNM,IAAM,qBAAsC;AAAA,EAClD,MAAM;AAAA,EACN,QAAQ;AAAA,IACP,QAAQ,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,IACvC,WAAW,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,IAC1C,KAAK,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,IACpC,SAAS,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,IACxC,OAAO,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,EACvC;AAAA,EACA,oBAAoB;AACrB;;;ACMA,IAAM,UAAU;AAAA,EACf,eAAe;AAAA,EACf,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AACT;AAEA,IAAM,iBAA0D;AAAA,EAC/D,OAAO;AAAA,EACP,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACP;AAEO,SAAS,cAAc,QAAwC;AACrE,SAAO,QAAQ,MAAM;AACtB;AAEO,SAAS,wBAAwB,QAAqC;AAC5E,QAAM,SAAS,QAAQ,MAAM,EAAE;AAC/B,SAAO,OAAO;AAAA,IACb,cAAc,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,OAAO,eAAe,IAAI,CAAC,EAAE,CAAC,CAAC;AAAA,EACxE;AACD;;;ACpDO,IAAM,4BAA4B,CAAC,WAAW,YAAY,UAAU;AAIpE,IAAM,uBAET;AAAA,EACH,SAAS,CAAC,SAAS,OAAO,UAAU,SAAS;AAAA,EAC7C,UAAU,CAAC,SAAS,YAAY,OAAO,UAAU,SAAS,WAAW,MAAM;AAAA,EAC3E,UAAU;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;AAEO,SAAS,wBACf,UACqB;AACrB,aAAW,QAAQ,2BAA2B;AAC7C,UAAM,UAAU,qBAAqB,IAAI;AACzC,QACC,SAAS,WAAW,QAAQ,UAC5B,SAAS,MAAM,CAAC,SAAS,UAAU,YAAY,QAAQ,KAAK,CAAC,GAC5D;AACD,aAAO;AAAA,IACR;AAAA,EACD;AACA,SAAO;AACR;;;ACvCA,SAAS,kBAAkB;AAC3B,SAAS,WAAW,WAAW,cAAc,YAAY,QAAQ,qBAAqB;AACtF,SAAS,SAAS,YAAY;AAC9B,SAAS,mBAAmB;AAkBrB,IAAM,qBAAqB;AAClC,IAAM,4BAA4B;AAElC,IAAM,0CAAkE;AAAA,EACvE,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,WAAW;AAAA,EACX,aAAa;AAAA,EACb,MAAM;AAAA,EACN,gBAAgB;AAAA,EAChB,KAAK;AAAA,EACL,aAAa;AAAA,EACb,OAAO;AAAA,EACP,WAAW;AAAA,EACX,MAAM;AAAA,EACN,OAAO;AACR;AAEO,IAAM,iCAAyD;AAAA,EACrE,GAAG;AAAA,EACH,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,uBAAuB;AACxB;AAEA,IAAM,0BAA0B;AAAA,EAC/B,QAAQ;AAAA,EACR,uBAAuB;AACxB;AAEA,IAAM,mBAAkC,CAAC,GAAG,qBAAqB,QAAQ;AAElE,IAAM,4BAA8C;AAAA,EAC1D,eAAe;AAAA,EACf,SAAS,wBAAwB,aAAa;AAAA,EAC9C,SAAS;AAAA,EACT,WAAW;AAAA,EACX,UAAU;AAAA,EACV,aAAa;AAAA,IACZ,OAAO,EAAE,QAAQ,IAAI,QAAQ,GAAG;AAAA,IAChC,UAAU,EAAE,QAAQ,cAAO,QAAQ,GAAG;AAAA,IACtC,OAAO;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,qBAAqB;AAAA,IACtB;AAAA,IACA,UAAU,EAAE,QAAQ,cAAO,QAAQ,GAAG;AAAA,IACtC,KAAK,EAAE,QAAQ,cAAO,QAAQ,GAAG;AAAA,IACjC,QAAQ,EAAE,QAAQ,cAAO,QAAQ,GAAG;AAAA,IACpC,OAAO,EAAE,QAAQ,IAAI,QAAQ,GAAG;AAAA,IAChC,SAAS,EAAE,QAAQ,kBAAW,QAAQ,GAAG;AAAA,IACzC,QAAQ,EAAE,QAAQ,cAAO,QAAQ,GAAG;AAAA,IACpC,OAAO,EAAE,QAAQ,cAAO,QAAQ,GAAG;AAAA,IACnC,MAAM,EAAE,QAAQ,eAAQ,QAAQ,GAAG;AAAA,IACnC,MAAM,EAAE,QAAQ,cAAO,QAAQ,GAAG;AAAA,IAClC,MAAM,EAAE,QAAQ,eAAQ,QAAQ,GAAG;AAAA,EACpC;AAAA,EACA,sBAAsB;AACvB;AAEA,IAAM,qCAAqC;AAAA,EAC1C,eAAe,0BAA0B;AAAA,EACzC,SAAS,0BAA0B;AAAA,EACnC,WAAW,0BAA0B;AAAA,EACrC,UAAU;AAAA,EACV,aAAa,0BAA0B;AAAA,EACvC,sBAAsB;AACvB;AAEO,IAAM,8BAA8B,GAAG,KAAK;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AACD,CAAC;AAAA;AAyBD,IAAI;AAEG,SAAS,iBAAiB,WAAW,YAAY,GAAW;AAClE,SAAO,KAAK,UAAU,kBAAkB;AACzC;AAEO,SAAS,sBAAwC;AACvD,SAAO,YAAY,yBAAyB;AAC7C;AAEO,SAAS,0BAA0B,OAGxC;AACD,QAAM,SAAS,oBAAoB;AACnC,QAAM,cAA4C,CAAC;AACnD,MAAI,CAAC,SAAS,KAAK,GAAG;AACrB,WAAO;AAAA,MACN;AAAA,MACA,aAAa,CAAC,kBAAkB,IAAI,uCAAuC,OAAO,CAAC;AAAA,IACpF;AAAA,EACD;AACA,QAAM,YAAY,oBAAI,IAAI;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAC;AACD,aAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AACrC,QAAI,CAAC,UAAU,IAAI,GAAG,EAAG,aAAY,KAAK,kBAAkB,GAAG,CAAC;AAAA,EACjE;AAEA,mBAAiB,MAAM,SAAS,QAAQ,WAAW;AACnD,gBAAc,OAAO,iBAAiB,sBAAsB,QAAQ,WAAW;AAC/E,MAAI,CAAC,SAAS,MAAM,OAAO,KAAK,cAAc,OAAO,aAAa,GAAG;AACpE,WAAO,UAAU,wBAAwB,OAAO,aAAa;AAAA,EAC9D;AACA,gBAAc,OAAO,WAAW,WAAW,QAAQ,WAAW;AAC9D,gBAAc,OAAO,aAAa,iBAAiB,QAAQ,WAAW;AAEtE,MAAI,MAAM,aAAa,QAAW;AACjC,QAAI,CAAC,MAAM,QAAQ,MAAM,QAAQ,GAAG;AACnC,kBAAY,KAAK,kBAAkB,YAAY,oCAAoC,CAAC;AAAA,IACrF,OAAO;AACN,YAAM,WAAgC,CAAC;AACvC,YAAM,OAAO,oBAAI,IAAiB;AAClC,iBAAW,CAAC,OAAO,IAAI,KAAK,MAAM,SAAS,QAAQ,GAAG;AACrD,cAAM,OAAO,YAAY,KAAK;AAC9B,YAAI,OAAO,SAAS,YAAY,CAAC,oBAAoB,IAAI,GAAG;AAC3D,sBAAY,KAAK,kBAAkB,MAAM,oCAAoC,CAAC;AAC9E;AAAA,QACD;AACA,YAAI,SAAS,yBAAyB;AACrC,cAAI,SAAS,GAAG,EAAE,MAAM,yBAAyB;AAChD,wBAAY;AAAA,cACX,kBAAkB,MAAM,iDAAiD;AAAA,YAC1E;AACA;AAAA,UACD;AACA,mBAAS,KAAK,IAAI;AAClB;AAAA,QACD;AACA,YAAI,KAAK,IAAI,IAAI,GAAG;AACnB,sBAAY,KAAK,kBAAkB,MAAM,qBAAqB,KAAK,UAAU,IAAI,CAAC,EAAE,CAAC;AACrF;AAAA,QACD;AACA,aAAK,IAAI,IAAI;AACb,iBAAS,KAAK,IAAI;AAAA,MACnB;AACA,aAAO,WAAW;AAAA,IACnB;AAAA,EACD;AAEA,MAAI,MAAM,gBAAgB,QAAW;AACpC,QAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AACjC,kBAAY,KAAK,kBAAkB,eAAe,oBAAoB,CAAC;AAAA,IACxE,OAAO;AACN,iBAAW,CAAC,MAAM,YAAY,KAAK,OAAO,QAAQ,MAAM,WAAW,GAAG;AACrE,cAAM,OAAO,eAAe,IAAI;AAChC,YAAI,CAAC,cAAc,IAAI,GAAG;AACzB,sBAAY,KAAK,kBAAkB,IAAI,CAAC;AACxC;AAAA,QACD;AACA,YAAI,CAAC,SAAS,YAAY,GAAG;AAC5B,sBAAY,KAAK,kBAAkB,MAAM,oBAAoB,CAAC;AAC9D;AAAA,QACD;AACA,cAAM,cAAc,oBAAI,IAAI;AAAA,UAC3B;AAAA,UACA;AAAA,UACA,GAAI,SAAS,UACV,CAAC,oBAAoB,oBAAoB,qBAAqB,IAC9D,CAAC;AAAA,QACL,CAAC;AACD,mBAAW,OAAO,OAAO,KAAK,YAAY,GAAG;AAC5C,cAAI,CAAC,YAAY,IAAI,GAAG,EAAG,aAAY,KAAK,kBAAkB,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC;AAAA,QAChF;AACA,mBAAW,SAAS,CAAC,UAAU,QAAQ,GAAY;AAClD,gBAAM,aAAa,aAAa,KAAK;AACrC,cAAI,eAAe,OAAW;AAC9B,cAAI,CAAC,kBAAkB,YAAY,GAAG,IAAI,IAAI,KAAK,IAAI,WAAW,EAAG;AACrE,iBAAO,YAAY,IAAI,EAAE,KAAK,IAAI;AAAA,QACnC;AACA,YAAI,SAAS,SAAS;AACrB,mCAAyB,cAAc,QAAQ,WAAW;AAAA,QAC3D;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAEA,MAAI,MAAM,yBAAyB,QAAW;AAC7C,QAAI,CAAC,SAAS,MAAM,oBAAoB,GAAG;AAC1C,kBAAY,KAAK,kBAAkB,wBAAwB,oBAAoB,CAAC;AAAA,IACjF,OAAO;AACN,iBAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,MAAM,oBAAoB,GAAG;AACrE,YAAI,OAAO,SAAS,UAAU;AAC7B,sBAAY,KAAK,kBAAkB,wBAAwB,GAAG,IAAI,mBAAmB,CAAC;AACtF;AAAA,QACD;AACA,eAAO,eAAe,OAAO,sBAAsB,KAAK;AAAA,UACvD,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,UAAU;AAAA,QACX,CAAC;AAAA,MACF;AACA,iBAAW,CAAC,WAAW,YAAY,KAAK,OAAO,QAAQ,uBAAuB,GAAG;AAChF,cAAM,aAAa,OAAO,OAAO,MAAM,sBAAsB,SAAS,IACnE,MAAM,qBAAqB,SAAS,IACpC;AACH,cAAM,gBAAgB,OAAO,OAAO,MAAM,sBAAsB,YAAY,IACzE,MAAM,qBAAqB,YAAY,IACvC;AACH,cAAM,YAAY,OAAO,kBAAkB,WAAW,YAAY;AAClE,cAAM,gBACL,OAAO,kBAAkB,WACtB,gBACA,OAAO,eAAe,WACrB,aACA;AACL,YAAI,kBAAkB,OAAW;AACjC,eAAO,eAAe,OAAO,sBAAsB,WAAW;AAAA,UAC7D,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,UAAU;AAAA,QACX,CAAC;AAAA,MACF;AAAA,IACD;AAAA,EACD;AAEA,SAAO,EAAE,QAAQ,YAAY;AAC9B;AAEO,SAAS,uBAAuB,cAAgD;AACtF,MAAI;AACJ,MAAI;AACH,kBAAc,aAAa,cAAc,MAAM;AAAA,EAChD,SAAS,OAAO;AACf,QAAK,MAAgC,SAAS,YAAY,CAAC,WAAW,YAAY,GAAG;AACpF,aAAO,gBAAgB,YAAY;AAAA,IACpC;AACA,WAAO,gBAAgB,cAAc;AAAA,MACpC,WAAW,SAAS,MAAM,IAAI,4BAA4B,YAAY,KAAK,CAAC,EAAE;AAAA,IAC/E,CAAC;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACH,aAAS,KAAK,MAAM,WAAW;AAAA,EAChC,SAAS,OAAO;AACf,WAAO;AAAA,MACN,GAAG,gBAAgB,cAAc;AAAA,QAChC,WAAW,SAAS,SAAS,IAAI,yBAAyB,YAAY,KAAK,CAAC,EAAE;AAAA,MAC/E,CAAC;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACA,QAAM,aAAa,0BAA0B,MAAM;AACnD,SAAO;AAAA,IACN,QAAQ,WAAW;AAAA,IACnB,QAAQ,WAAW,YAAY,KAAK,CAAC,SAAS,KAAK,aAAa,OAAO,IAAI,aAAa;AAAA,IACxF;AAAA,IACA;AAAA,IACA,aAAa,WAAW;AAAA,EACzB;AACD;AAEO,SAAS,+BAA+B,WAAW,YAAY,GAA6B;AAClG,0BAAwB;AACxB,QAAM,gBAAgB,iBAAiB,QAAQ;AAC/C,QAAM,aAAa,KAAK,UAAU,yBAAyB;AAC3D,QAAM,YAAY,uBAAuB,aAAa;AACtD,MAAI,CAAC,4BAA4B,SAAS,GAAG;AAC5C,QAAI,CAAC,4BAA4B,uBAAuB,UAAU,CAAC,GAAG;AACrE,8BAAwB,GAAG,yBAAyB,oBAAoB,kBAAkB;AAAA,IAC3F;AACA,WAAO;AAAA,EACR;AACA,QAAM,SAAS,uBAAuB,UAAU;AAChD,SAAO,4BAA4B,MAAM,IACtC,YACA,sBAAsB,eAAe,MAAM;AAC/C;AAEA,SAAS,sBACR,eACA,QAC2B;AAC3B,QAAM,iBAAiB,uBAAuB,aAAa;AAC3D,MAAI,CAAC,4BAA4B,cAAc,GAAG;AACjD,4BAAwB,GAAG,yBAAyB,oBAAoB,kBAAkB;AAC1F,WAAO;AAAA,EACR;AACA,MACC,OAAO,WAAW,UAClB,OAAO,gBAAgB,UACvB,oBAAoB,OAAO,WAAW,EAAE,SAAS,GAChD;AACD,4BAAwB,GAAG,yBAAyB;AACpD,WAAO;AAAA,EACR;AACA,0BAAwB,gBAAgB,yBAAyB,kBAAkB,kBAAkB,wBAAwB,kBAAkB;AAC/I,SAAO;AACR;AAEA,SAAS,4BAA4B,UAA6C;AACjF,SACC,SAAS,WAAW,cACpB,SAAS,gBAAgB,UACzB,SAAS,YAAY,WAAW;AAElC;AAEO,SAAS,+BACf,cACA,aACA,YAAuC,CAAC,GACb;AAC3B,MAAI;AACJ,MAAI;AACH,aAAS,KAAK,MAAM,WAAW;AAAA,EAChC,SAAS,OAAO;AACf,UAAM,IAAI,MAAM,yBAAyB,YAAY,KAAK,CAAC,EAAE;AAAA,EAC9D;AACA,QAAM,aAAa,0BAA0B,MAAM;AACnD,QAAM,WAAW,oBAAoB,WAAW,WAAW;AAC3D,MAAI,SAAS,SAAS,GAAG;AACxB,UAAM,IAAI,MAAM,SAAS,IAAI,CAAC,SAAS,GAAG,KAAK,QAAQ,MAAM,KAAK,KAAK,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,EAC7F;AAEA,QAAM,KAAK,EAAE,WAAW,eAAe,YAAY,QAAQ,GAAG,UAAU;AACxE,QAAM,kBAAkB,gBAAgB,YAAY;AACpD,QAAM,gBAAgB,sBAAsB,YAAY;AACxD,MAAI;AACJ,MAAI;AACH,OAAG,UAAU,QAAQ,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AACvD,OAAG,cAAc,eAAe,aAAa,EAAE,UAAU,QAAQ,MAAM,KAAK,CAAC;AAC7E,UAAM,OAAO,UAAU,aAAa;AACpC,mBAAe,EAAE,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI;AAC9C,QAAI,CAAC,mBAAmB,gBAAgB,YAAY,GAAG;AACtD,YAAM,IAAI,MAAM,GAAG,kBAAkB,uDAAuD;AAAA,IAC7F;AACA,OAAG,WAAW,eAAe,YAAY;AAAA,EAC1C,UAAE;AACD,wBAAoB,GAAG,QAAQ,aAAa;AAAA,EAC7C;AACA,SAAO;AAAA,IACN,QAAQ,WAAW;AAAA,IACnB,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,IACvC,aAAa,WAAW;AAAA,EACzB;AACD;AAEO,SAAS,0CACf,cACA,qBACA,kBACO;AACP,QAAM,iBAAiB;AAAA,IACtB,QAAQ,YAAY;AAAA,IACpB,IAAI,kBAAkB,IAAI,WAAW,CAAC;AAAA,EACvC;AACA,QAAM,SAAS,UAAU,YAAY;AACrC,MAAI,OAAO,QAAQ,iBAAiB,OAAO,OAAO,QAAQ,iBAAiB,KAAK;AAC/E,UAAM,IAAI,MAAM,wEAAwE;AAAA,EACzF;AACA,aAAW,cAAc,cAAc;AACvC,QAAM,cAAc,UAAU,cAAc;AAC5C,QAAM,uBACL,YAAY,OAAO,KACnB,CAAC,YAAY,eAAe,KAC5B,YAAY,QAAQ,iBAAiB,OACrC,YAAY,QAAQ,iBAAiB;AACtC,MAAI,wBAAwB,aAAa,gBAAgB,MAAM,MAAM,qBAAqB;AACzF,WAAO,cAAc;AACrB;AAAA,EACD;AACA,MAAI,wBAAwB,CAAC,gBAAgB,YAAY,GAAG;AAC3D,QAAI;AACH,iBAAW,gBAAgB,YAAY;AAAA,IACxC,QAAQ;AAAA,IAER;AAAA,EACD;AACA,QAAM,IAAI,MAAM,wEAAwE;AACzF;AAEO,SAAS,kCAAsD;AACrE,QAAM,SAAS;AACf,0BAAwB;AACxB,SAAO;AACR;AAYA,SAAS,iBACR,OACA,QACA,aACC;AACD,MAAI,UAAU,OAAW;AACzB,MAAI,OAAO,UAAU,UAAU;AAC9B,QAAI,CAAE,cAAoC,SAAS,KAAK,GAAG;AAC1D,kBAAY;AAAA,QACX;AAAA,UACC;AAAA,UACA,wCAAwC,cAAc,KAAK,IAAI,CAAC;AAAA,QACjE;AAAA,MACD;AACA;AAAA,IACD;AACA,WAAO,gBAAgB;AACvB;AAAA,EACD;AACA,MAAI,CAAC,SAAS,KAAK,GAAG;AACrB,gBAAY,KAAK,kBAAkB,WAAW,2BAA2B,CAAC;AAC1E;AAAA,EACD;AAEA,QAAM,UAA0B,CAAC;AACjC,SAAO,UAAU;AACjB,aAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,KAAK,GAAG;AACnD,UAAM,OAAO,WAAW,IAAI;AAC5B,QAAI,CAAC,cAAc,IAAI,GAAG;AACzB,kBAAY,KAAK,kBAAkB,IAAI,CAAC;AACxC;AAAA,IACD;AACA,QAAI,CAAC,SAAS,MAAM,GAAG;AACtB,kBAAY,KAAK,kBAAkB,MAAM,oBAAoB,CAAC;AAC9D;AAAA,IACD;AACA,UAAM,mBAA6D,CAAC;AACpE,YAAQ,IAAI,IAAI;AAChB,eAAW,CAAC,OAAO,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACpD,YAAM,YAAY,GAAG,IAAI,IAAI,KAAK;AAClC,UAAI,UAAU,QAAQ,UAAU,MAAM;AACrC,oBAAY,KAAK,kBAAkB,SAAS,CAAC;AAC7C;AAAA,MACD;AACA,UAAI,OAAO,UAAU,YAAY,CAAC,mBAAmB,KAAK,KAAK,GAAG;AACjE,oBAAY,KAAK,kBAAkB,WAAW,2CAA2C,CAAC;AAC1F;AAAA,MACD;AACA,uBAAiB,KAAK,IAAI,MAAM,YAAY;AAAA,IAC7C;AAAA,EACD;AACA,SAAO,UAAU;AACjB,SAAO,gBAAgB;AACxB;AAEA,SAAS,yBACR,cACA,QACA,aACC;AACD,QAAM,OAAO;AACb,QAAM,SAAS,aAAa;AAC5B,MAAI,WAAW,QAAW;AACzB,QAAI,OAAO,WAAW,YAAY,CAAC,OAAO,UAAU,MAAM,KAAK,SAAS,KAAK,SAAS,KAAM;AAC3F,kBAAY;AAAA,QACX,kBAAkB,GAAG,IAAI,qBAAqB,yCAAyC;AAAA,MACxF;AAAA,IACD,MAAO,QAAO,YAAY,MAAM,mBAAmB;AAAA,EACpD;AAEA,QAAM,SAAS,aAAa;AAC5B,MAAI,WAAW,UAAa,kBAAkB,QAAQ,GAAG,IAAI,qBAAqB,WAAW,GAAG;AAC/F,WAAO,YAAY,MAAM,mBAAmB;AAAA,EAC7C;AAEA,QAAM,YAAY,aAAa;AAC/B,MAAI,cAAc,QAAW;AAC5B,QACC,OAAO,cAAc,YACrB,CAAC,sBAAsB,SAAS,SAAmD,GAClF;AACD,kBAAY;AAAA,QACX;AAAA,UACC,GAAG,IAAI;AAAA,UACP,oBAAoB,sBAAsB,KAAK,IAAI,CAAC;AAAA,QACrD;AAAA,MACD;AAAA,IACD,OAAO;AACN,aAAO,YAAY,MAAM,sBACxB;AAAA,IACF;AAAA,EACD;AACD;AAEA,SAAS,kBACR,OACA,MACA,aACkB;AAClB,MAAI,OAAO,UAAU,UAAU;AAC9B,gBAAY,KAAK,kBAAkB,MAAM,mBAAmB,CAAC;AAC7D,WAAO;AAAA,EACR;AACA,MAAI,sBAAsB,KAAK,KAAK,GAAG;AACtC,gBAAY,KAAK,kBAAkB,MAAM,6CAA6C,CAAC;AACvF,WAAO;AAAA,EACR;AACA,MAAI,oBAAoB,KAAK,GAAG;AAC/B,gBAAY,KAAK,kBAAkB,MAAM,oCAAoC,CAAC;AAC9E,WAAO;AAAA,EACR;AACA,SAAO;AACR;AAEA,SAAS,cAIR,OACA,OACA,UACA,QACA,aACC;AACD,QAAM,YAAY,MAAM,KAAK;AAC7B,MAAI,cAAc,OAAW;AAC7B,MAAI,OAAO,cAAc,YAAY,CAAC,SAAS,SAAS,SAAc,GAAG;AACxE,gBAAY;AAAA,MACX,kBAAkB,OAAO,oBAAoB,SAAS,IAAI,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,IAC/E;AACA;AAAA,EACD;AACA,SAAO,KAAK,IAAI;AACjB;AAEA,SAAS,oBAAoB,SAAyC;AACrE,SAAO,OAAO;AAAA,IACb,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC;AAAA,EACtE;AACD;AAEA,SAAS,YAAY,QAA4C;AAChE,SAAO;AAAA,IACN,GAAG;AAAA,IACH,SAAS,oBAAoB,OAAO,OAAO;AAAA,IAC3C,UAAU,CAAC,GAAG,OAAO,QAAQ;AAAA,IAC7B,aAAa,OAAO;AAAA,MACnB,cAAc,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,OAAO,YAAY,IAAI,EAAE,CAAC,CAAC;AAAA,IACpE;AAAA,IACA,sBAAsB,EAAE,GAAG,OAAO,qBAAqB;AAAA,EACxD;AACD;AAEA,SAAS,gBACR,cACA,cAA4C,CAAC,GAClB;AAC3B,SAAO;AAAA,IACN,QAAQ,oBAAoB;AAAA,IAC5B,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACD;AACD;AAEA,SAAS,oBAAoB,OAAwB;AACpD,aAAW,aAAa,OAAO;AAC9B,UAAM,YAAY,UAAU,YAAY,CAAC,KAAK;AAC9C,QAAI,aAAa,MAAS,aAAa,OAAQ,aAAa,IAAO,QAAO;AAAA,EAC3E;AACA,SAAO;AACR;AAEA,SAAS,SAAS,OAAkD;AACnE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC3E;AAEA,SAAS,oBAAoB,OAA2C;AACvE,SAAO,UAAU,2BAA2B,cAAc,KAAK;AAChE;AAEA,SAAS,cAAc,OAAgE;AACtF,SAAQ,cAA+D,SAAS,KAAK;AACtF;AAEA,SAAS,cAAc,OAAqC;AAC3D,SAAQ,cAAoC,SAAS,KAAK;AAC3D;AAEA,SAAS,oBACR,aAC+B;AAC/B,SAAO,YAAY,OAAO,CAAC,SAAS,KAAK,SAAS,SAAS;AAC5D;AAEA,SAAS,kBAAkB,MAA0C;AACpE,SAAO,WAAW,WAAW,WAAW,MAAM,mBAAmB,KAAK,UAAU,IAAI,CAAC,EAAE;AACxF;AAEA,SAAS,kBACR,MACA,SACA,WAAmD,WACtB;AAC7B,SAAO,WAAW,UAAU,WAAW,MAAM,OAAO;AACrD;AAEA,SAAS,WACR,UACA,MACA,MACA,SAC6B;AAC7B,SAAO,EAAE,UAAU,MAAM,MAAM,QAAQ;AACxC;AAEA,SAAS,sBAAsB,cAA8B;AAC5D,SAAO,KAAK,QAAQ,YAAY,GAAG,IAAI,kBAAkB,IAAI,WAAW,CAAC,MAAM;AAChF;AAEA,SAAS,oBAAoB,QAAuB,eAAuB;AAC1E,MAAI;AACH,WAAO,eAAe,EAAE,OAAO,KAAK,CAAC;AAAA,EACtC,QAAQ;AAAA,EAER;AACD;AAEA,SAAS,WAAW,MAAuB;AAC1C,MAAI;AACH,cAAU,IAAI;AACd,WAAO;AAAA,EACR,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAEA,SAAS,gBAAgB,MAAuB;AAC/C,MAAI;AACH,cAAU,IAAI;AACd,WAAO;AAAA,EACR,SAAS,OAAO;AACf,QAAK,MAAgC,SAAS,SAAU,QAAO;AAC/D,UAAM;AAAA,EACP;AACD;AAEA,SAAS,YAAY,OAAwB;AAC5C,SAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC7D;",
6
- "names": []
7
- }
@@ -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\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
- }