@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.
@@ -0,0 +1,7 @@
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 { value: \"settings\", label: \"settings\", description: \"Edit pi-statusline.json\" },\n { value: \"status\", label: \"status\", description: \"Show effective statusline settings\" },\n { value: \"help\", label: \"help\", description: \"Show configuration help\" },\n];\n\nexport function completeStatuslineArguments(prefix: string): AutocompleteItem[] | null {\n const normalized = prefix.trim().toLowerCase();\n const matches = STATUSLINE_SUBCOMMANDS.filter((item) => item.value.startsWith(normalized));\n return matches.length > 0 ? [...matches] : null;\n}\n", "import type { ThemeColor } from \"@earendil-works/pi-coding-agent\";\n\nexport const SEGMENT_NAMES = [\n \"brand\",\n \"provider\",\n \"model\",\n \"thinking\",\n \"cwd\",\n \"branch\",\n \"tools\",\n \"context\",\n \"tokens\",\n \"cache\",\n \"cost\",\n \"time\",\n \"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 = [\"tokyo-night\", \"ocean\", \"sunset\", \"forest\", \"candy\", \"neon\", \"mono\"] 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 prefix: string;\n suffix: string;\n}\n\nexport interface ModelSegmentTextConfig extends SegmentTextConfig {\n truncationLength: number;\n truncationSymbol: string;\n truncationDirection: TruncationDirection;\n}\n\nexport interface SegmentPaletteColor {\n fg?: string;\n bg?: string;\n}\n\nexport type SegmentPalette = Partial<Record<SegmentName, SegmentPaletteColor>>;\n\nexport interface StatuslineConfig {\n palettePreset: PalettePreset;\n palette: SegmentPalette;\n density: Density;\n separator: SeparatorName;\n segments: ConfigSegmentName[];\n segmentText: Record<SegmentName, SegmentTextConfig> & { model: ModelSegmentTextConfig };\n extensionStatusIcons: Record<string, string>;\n}\n\nexport interface RenderSegment {\n name: SegmentName;\n text: string;\n color: ThemeColor;\n block: PowerlineBlockName;\n emphasis?: boolean;\n}\n\nexport interface RenderLineBreak {\n name: 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 return {\n lead: backgrounds[0],\n blocks: Object.fromEntries(\n BLOCK_NAMES.map((block, index) => {\n const background = backgrounds[index];\n return [block, { fg: contrastColor(background), bg: background }];\n }),\n ) as Record<PowerlineBlockName, { fg: string; bg: string }>,\n extensionSeparator: backgrounds[2],\n };\n}\n\nfunction contrastColor(hex: string): string {\n const background = relativeLuminance(hex);\n const dark = relativeLuminance(\"#090c0c\");\n const light = relativeLuminance(\"#f0f0f0\");\n return contrastRatio(background, dark) >= contrastRatio(background, light) ? \"#090c0c\" : \"#f0f0f0\";\n}\n\nfunction contrastRatio(left: number, right: number): number {\n return (Math.max(left, right) + 0.05) / (Math.min(left, right) + 0.05);\n}\n\nfunction relativeLuminance(hex: string): number {\n const normalized = hex.slice(1);\n const channels = [0, 2, 4].map((offset) => {\n const value = Number.parseInt(normalized.slice(offset, offset + 2), 16) / 255;\n return value <= 0.04045 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4;\n });\n return 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([\"#f5c2e7\", \"#cba6f7\", \"#89b4fa\", \"#745f9a\", \"#403a5c\"]);\n", "import type { PowerlinePreset } from \"./types.js\";\n\nexport const CUSTOM_PRESET: PowerlinePreset = {\n blocks: {\n header: {},\n directory: {},\n git: {},\n runtime: {},\n meter: {},\n },\n};\n", "import { createRampPreset } from \"./create-ramp.js\";\n\nexport const FOREST_PRESET = createRampPreset([\"#a7c080\", \"#83c092\", \"#5f9f75\", \"#3f6f55\", \"#293f35\"]);\n", "import { createRampPreset } from \"./create-ramp.js\";\n\nexport const MONO_PRESET = createRampPreset([\"#d4d4d4\", \"#a3a3a3\", \"#686868\", \"#404040\", \"#262626\"]);\n", "import { createRampPreset } from \"./create-ramp.js\";\n\nexport const NEON_PRESET = createRampPreset([\"#39ff14\", \"#00f5ff\", \"#ff4fd8\", \"#7a2cf3\", \"#29134f\"]);\n", "import { createRampPreset } from \"./create-ramp.js\";\n\nexport const OCEAN_PRESET = createRampPreset([\"#7dcfff\", \"#4f9fba\", \"#2d6f88\", \"#23475b\", \"#182b3a\"]);\n", "import { createRampPreset } from \"./create-ramp.js\";\n\nexport const SUNSET_PRESET = createRampPreset([\"#ffcf70\", \"#f59e6f\", \"#dc718a\", \"#8f5b78\", \"#493447\"]);\n", "import type { PowerlinePreset } from \"./types.js\";\n\nexport const TOKYO_NIGHT_PRESET: PowerlinePreset = {\n lead: \"#a3aed2\",\n blocks: {\n header: { fg: \"#090c0c\", bg: \"#a3aed2\" },\n directory: { fg: \"#e3e5e5\", bg: \"#769ff0\" },\n git: { fg: \"#769ff0\", bg: \"#394260\" },\n runtime: { fg: \"#769ff0\", bg: \"#212736\" },\n meter: { fg: \"#a0a9cb\", bg: \"#1d2230\" },\n },\n extensionSeparator: \"#394260\",\n};\n", "import {\n type PaletteName,\n type PalettePreset,\n type PowerlineBlockName,\n SEGMENT_NAMES,\n type SegmentName,\n type 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 \"tokyo-night\": TOKYO_NIGHT_PRESET,\n ocean: OCEAN_PRESET,\n sunset: SUNSET_PRESET,\n forest: FOREST_PRESET,\n candy: CANDY_PRESET,\n neon: NEON_PRESET,\n mono: MONO_PRESET,\n custom: CUSTOM_PRESET,\n} satisfies Record<PalettePreset, PowerlinePreset>;\n\nconst SEGMENT_BLOCKS: Record<SegmentName, PowerlineBlockName> = {\n brand: \"header\",\n provider: \"header\",\n model: \"header\",\n thinking: \"header\",\n cwd: \"directory\",\n branch: \"git\",\n tools: \"runtime\",\n context: \"runtime\",\n tokens: \"runtime\",\n cache: \"runtime\",\n cost: \"meter\",\n time: \"meter\",\n turn: \"meter\",\n};\n\nexport function resolvePreset(preset: PalettePreset): PowerlinePreset {\n return PRESETS[preset];\n}\n\nexport function segmentPaletteForPreset(preset: PaletteName): SegmentPalette {\n const blocks = PRESETS[preset].blocks;\n return Object.fromEntries(SEGMENT_NAMES.map((name) => [name, { ...blocks[SEGMENT_BLOCKS[name]] }])) 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<Record<InformationProfileName, readonly SegmentName[]>> = {\n minimal: [\"model\", \"cwd\", \"branch\", \"context\"],\n balanced: [\"model\", \"thinking\", \"cwd\", \"branch\", \"tools\", \"context\", \"time\"],\n detailed: [\"provider\", \"model\", \"thinking\", \"cwd\", \"branch\", \"tools\", \"context\", \"tokens\", \"cache\", \"cost\", \"time\"],\n};\n\nexport function inferInformationProfile(segments: readonly ConfigSegmentName[]): InformationProfile {\n for (const name of INFORMATION_PROFILE_NAMES) {\n const profile = INFORMATION_PROFILES[name];\n if (segments.length === profile.length && segments.every((segment, index) => segment === profile[index])) {\n return name;\n }\n }\n return \"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 type ConfigSegmentName,\n DENSITIES,\n LINE_BREAK_SEGMENT_NAME,\n PALETTE_NAMES,\n PALETTE_PRESET_NAMES,\n type PaletteName,\n SEGMENT_NAMES,\n SEPARATOR_NAMES,\n type SegmentName,\n type SegmentPalette,\n type StatuslineConfig,\n TRUNCATION_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 accounts: \"\uD83D\uDC64\",\n caffeinate: \"\uD83D\uDC8A\",\n \"chrome-devtools\": \"\uD83C\uDF10\",\n firecrawl: \"\uD83D\uDD25\",\n \"github-pr\": \"\uD83D\uDD0E\",\n goal: \"\uD83C\uDFAF\",\n \"google-genai\": \"\u2728\",\n lsp: \"\uD83E\uDDF0\",\n \"plan-mode\": \"\uD83D\uDCDD\",\n retry: \"\uD83D\uDD01\",\n subagents: \"\uD83E\uDDD1\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1\",\n sync: \"\uD83D\uDD04\",\n usage: \"\uD83D\uDCCA\",\n};\n\nexport const DEFAULT_EXTENSION_STATUS_ICONS: Record<string, string> = {\n ...DEFAULT_DOCUMENT_EXTENSION_STATUS_ICONS,\n \"codex-usage\": \"\uD83D\uDCCA\",\n pisync: \"\uD83D\uDD04\",\n \"unknown-error-retry\": \"\uD83D\uDD01\",\n};\n\nconst LEGACY_STATUS_ICON_KEYS = {\n pisync: \"sync\",\n \"unknown-error-retry\": \"retry\",\n} as const;\n\nconst DEFAULT_SEGMENTS: SegmentName[] = [...INFORMATION_PROFILES.balanced];\n\nexport const DEFAULT_STATUSLINE_CONFIG: StatuslineConfig = {\n palettePreset: \"tokyo-night\",\n palette: segmentPaletteForPreset(\"tokyo-night\"),\n density: \"compact\",\n separator: \"none\",\n segments: DEFAULT_SEGMENTS,\n segmentText: {\n brand: { prefix: \"\", suffix: \"\" },\n provider: { prefix: \"\uD83D\uDD0C \", suffix: \"\" },\n model: {\n prefix: \"\uD83E\uDD16 \",\n suffix: \"\",\n truncationLength: 36,\n truncationSymbol: \"\u2026\",\n truncationDirection: \"start\",\n },\n thinking: { prefix: \"\uD83E\uDDE0 \", suffix: \"\" },\n cwd: { prefix: \"\uD83D\uDCC1 \", suffix: \"\" },\n branch: { prefix: \"\uD83C\uDF3F \", suffix: \"\" },\n tools: { prefix: \"\", suffix: \"\" },\n context: { prefix: \"\uD83E\uDE9F ctx \", suffix: \"\" },\n tokens: { prefix: \"\uD83D\uDD22 \", suffix: \"\" },\n cache: { prefix: \"\uD83D\uDCE6 \", suffix: \"\" },\n cost: { prefix: \"\uD83D\uDCB8 $\", suffix: \"\" },\n time: { prefix: \"\uD83D\uDD52 \", suffix: \"\" },\n turn: { prefix: \"\uD83D\uDD01 #\", suffix: \"\" },\n },\n extensionStatusIcons: DEFAULT_EXTENSION_STATUS_ICONS,\n};\n\nconst DEFAULT_STATUSLINE_DOCUMENT_CONFIG = {\n palettePreset: DEFAULT_STATUSLINE_CONFIG.palettePreset,\n density: DEFAULT_STATUSLINE_CONFIG.density,\n separator: DEFAULT_STATUSLINE_CONFIG.separator,\n segments: DEFAULT_SEGMENTS,\n segmentText: DEFAULT_STATUSLINE_CONFIG.segmentText,\n extensionStatusIcons: DEFAULT_DOCUMENT_EXTENSION_STATUS_ICONS,\n} satisfies Omit<StatuslineConfig, \"palette\">;\n\nexport const DEFAULT_STATUSLINE_DOCUMENT = `${JSON.stringify(DEFAULT_STATUSLINE_DOCUMENT_CONFIG, null, \"\\t\")}\\n`;\n\nexport interface StatuslineConfigDiagnostic {\n severity: \"warning\" | \"error\";\n code: \"unknown\" | \"invalid\" | \"parse\" | \"io\";\n path: string;\n message: string;\n}\n\nexport interface LoadedStatuslineSettings {\n config: StatuslineConfig;\n source: \"built-in\" | \"user\";\n settingsPath: string;\n rawDocument?: string;\n fileIdentity?: { dev: number; ino: number };\n diagnostics: StatuslineConfigDiagnostic[];\n}\n\ninterface AtomicFileSystem {\n mkdirSync: typeof mkdirSync;\n writeFileSync: typeof writeFileSync;\n renameSync: typeof renameSync;\n rmSync: typeof rmSync;\n}\n\nlet pendingSettingsNotice: string | undefined;\n\nexport function settingsFilePath(agentDir = getAgentDir()): string {\n return join(agentDir, SETTINGS_FILE_NAME);\n}\n\nexport function createDefaultConfig(): StatuslineConfig {\n return cloneConfig(DEFAULT_STATUSLINE_CONFIG);\n}\n\nexport function normalizeStatuslineConfig(value: unknown): {\n config: StatuslineConfig;\n diagnostics: StatuslineConfigDiagnostic[];\n} {\n const config = createDefaultConfig();\n const diagnostics: StatuslineConfigDiagnostic[] = [];\n if (!isRecord(value)) {\n return {\n config,\n diagnostics: [invalidDiagnostic(\"\", \"Settings must contain a JSON object\", \"error\")],\n };\n }\n const knownRoot = new Set([\n \"palettePreset\",\n \"palette\",\n \"density\",\n \"separator\",\n \"segments\",\n \"segmentText\",\n \"extensionStatusIcons\",\n ]);\n for (const key of Object.keys(value)) {\n if (!knownRoot.has(key)) diagnostics.push(unknownDiagnostic(key));\n }\n\n normalizePalette(value.palette, config, diagnostics);\n normalizeEnum(value, \"palettePreset\", PALETTE_PRESET_NAMES, config, diagnostics);\n if (!isRecord(value.palette) && isPaletteName(config.palettePreset)) {\n config.palette = segmentPaletteForPreset(config.palettePreset);\n }\n normalizeEnum(value, \"density\", DENSITIES, config, diagnostics);\n normalizeEnum(value, \"separator\", SEPARATOR_NAMES, config, diagnostics);\n\n if (value.segments !== undefined) {\n if (!Array.isArray(value.segments)) {\n diagnostics.push(invalidDiagnostic(\"segments\", \"Expected an array of segment names\"));\n } else {\n const segments: ConfigSegmentName[] = [];\n const seen = new Set<SegmentName>();\n for (const [index, item] of value.segments.entries()) {\n const path = `segments[${index}]`;\n if (typeof item !== \"string\" || !isConfigSegmentName(item)) {\n diagnostics.push(invalidDiagnostic(path, \"Unknown or non-string segment name\"));\n continue;\n }\n if (item === LINE_BREAK_SEGMENT_NAME) {\n if (segments.at(-1) === LINE_BREAK_SEGMENT_NAME) {\n diagnostics.push(invalidDiagnostic(path, \"Consecutive line_break segments are not allowed\"));\n continue;\n }\n segments.push(item);\n continue;\n }\n if (seen.has(item)) {\n diagnostics.push(invalidDiagnostic(path, `Duplicate segment ${JSON.stringify(item)}`));\n continue;\n }\n seen.add(item);\n segments.push(item);\n }\n config.segments = segments;\n }\n }\n\n if (value.segmentText !== undefined) {\n if (!isRecord(value.segmentText)) {\n diagnostics.push(invalidDiagnostic(\"segmentText\", \"Expected an object\"));\n } else {\n for (const [name, presentation] of Object.entries(value.segmentText)) {\n const path = `segmentText.${name}`;\n if (!isSegmentName(name)) {\n diagnostics.push(unknownDiagnostic(path));\n continue;\n }\n if (!isRecord(presentation)) {\n diagnostics.push(invalidDiagnostic(path, \"Expected an object\"));\n continue;\n }\n const knownFields = new Set([\n \"prefix\",\n \"suffix\",\n ...(name === \"model\" ? [\"truncationLength\", \"truncationSymbol\", \"truncationDirection\"] : []),\n ]);\n for (const key of Object.keys(presentation)) {\n if (!knownFields.has(key)) diagnostics.push(unknownDiagnostic(`${path}.${key}`));\n }\n for (const field of [\"prefix\", \"suffix\"] as const) {\n const fieldValue = presentation[field];\n if (fieldValue === undefined) continue;\n if (!isSafeSegmentText(fieldValue, `${path}.${field}`, diagnostics)) continue;\n config.segmentText[name][field] = fieldValue;\n }\n if (name === \"model\") {\n normalizeModelTruncation(presentation, config, diagnostics);\n }\n }\n }\n }\n\n if (value.extensionStatusIcons !== undefined) {\n if (!isRecord(value.extensionStatusIcons)) {\n diagnostics.push(invalidDiagnostic(\"extensionStatusIcons\", \"Expected an object\"));\n } else {\n for (const [key, icon] of Object.entries(value.extensionStatusIcons)) {\n if (typeof icon !== \"string\") {\n diagnostics.push(invalidDiagnostic(`extensionStatusIcons.${key}`, \"Expected a string\"));\n continue;\n }\n Object.defineProperty(config.extensionStatusIcons, key, {\n value: icon,\n enumerable: true,\n configurable: true,\n writable: true,\n });\n }\n for (const [legacyKey, canonicalKey] of Object.entries(LEGACY_STATUS_ICON_KEYS)) {\n const legacyIcon = Object.hasOwn(value.extensionStatusIcons, legacyKey)\n ? value.extensionStatusIcons[legacyKey]\n : undefined;\n const canonicalIcon = Object.hasOwn(value.extensionStatusIcons, canonicalKey)\n ? value.extensionStatusIcons[canonicalKey]\n : undefined;\n const targetKey = typeof canonicalIcon === \"string\" ? legacyKey : canonicalKey;\n const inheritedIcon =\n typeof canonicalIcon === \"string\" ? canonicalIcon : typeof legacyIcon === \"string\" ? legacyIcon : undefined;\n if (inheritedIcon === undefined) continue;\n Object.defineProperty(config.extensionStatusIcons, targetKey, {\n value: inheritedIcon,\n enumerable: true,\n configurable: true,\n writable: true,\n });\n }\n }\n }\n\n return { config, diagnostics };\n}\n\nexport function loadStatuslineSettings(settingsPath: string): LoadedStatuslineSettings {\n let rawDocument: string;\n try {\n rawDocument = readFileSync(settingsPath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\" && !pathExists(settingsPath)) {\n return builtInSettings(settingsPath);\n }\n return builtInSettings(settingsPath, [\n diagnostic(\"error\", \"io\", \"\", `Unable to read settings: ${formatError(error)}`),\n ]);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(rawDocument);\n } catch (error) {\n return {\n ...builtInSettings(settingsPath, [\n diagnostic(\"error\", \"parse\", \"\", `Unable to parse JSON: ${formatError(error)}`),\n ]),\n rawDocument,\n };\n }\n const normalized = normalizeStatuslineConfig(parsed);\n return {\n config: normalized.config,\n source: normalized.diagnostics.some((item) => item.severity === \"error\") ? \"built-in\" : \"user\",\n settingsPath,\n rawDocument,\n diagnostics: normalized.diagnostics,\n };\n}\n\nexport function loadStatuslineSettingsForAgent(agentDir = getAgentDir()): LoadedStatuslineSettings {\n pendingSettingsNotice = undefined;\n const canonicalPath = settingsFilePath(agentDir);\n const legacyPath = join(agentDir, LEGACY_SETTINGS_FILE_NAME);\n const canonical = loadStatuslineSettings(canonicalPath);\n if (!isMissingStatuslineSettings(canonical)) {\n if (!isMissingStatuslineSettings(loadStatuslineSettings(legacyPath))) {\n pendingSettingsNotice = `${LEGACY_SETTINGS_FILE_NAME} ignored because ${SETTINGS_FILE_NAME} takes precedence.`;\n }\n return canonical;\n }\n const legacy = loadStatuslineSettings(legacyPath);\n return isMissingStatuslineSettings(legacy) ? canonical : migrateLegacySettings(canonicalPath, legacy);\n}\n\nfunction migrateLegacySettings(canonicalPath: string, legacy: LoadedStatuslineSettings): LoadedStatuslineSettings {\n const racedCanonical = loadStatuslineSettings(canonicalPath);\n if (!isMissingStatuslineSettings(racedCanonical)) {\n pendingSettingsNotice = `${LEGACY_SETTINGS_FILE_NAME} ignored because ${SETTINGS_FILE_NAME} was created concurrently.`;\n return racedCanonical;\n }\n if (\n legacy.source !== \"user\" ||\n legacy.rawDocument === undefined ||\n blockingDiagnostics(legacy.diagnostics).length > 0\n ) {\n pendingSettingsNotice = `${LEGACY_SETTINGS_FILE_NAME} is invalid and was ignored.`;\n return legacy;\n }\n pendingSettingsNotice = `Using legacy ${LEGACY_SETTINGS_FILE_NAME}; rename it to ${SETTINGS_FILE_NAME}. Future saves write ${SETTINGS_FILE_NAME} without modifying the legacy file.`;\n return legacy;\n}\n\nfunction isMissingStatuslineSettings(settings: LoadedStatuslineSettings): boolean {\n return settings.source === \"built-in\" && settings.rawDocument === undefined && settings.diagnostics.length === 0;\n}\n\nexport function saveStatuslineSettingsDocument(\n settingsPath: string,\n rawDocument: string,\n overrides: Partial<AtomicFileSystem> = {},\n): LoadedStatuslineSettings {\n let parsed: unknown;\n try {\n parsed = JSON.parse(rawDocument);\n } catch (error) {\n throw new Error(`Unable to parse JSON: ${formatError(error)}`);\n }\n const normalized = normalizeStatuslineConfig(parsed);\n const blocking = blockingDiagnostics(normalized.diagnostics);\n if (blocking.length > 0) {\n throw new Error(blocking.map((item) => `${item.path || \"root\"}: ${item.message}`).join(\"\\n\"));\n }\n\n const fs = { mkdirSync, writeFileSync, renameSync, rmSync, ...overrides };\n const replaceExisting = pathEntryExists(settingsPath);\n const temporaryPath = temporarySettingsPath(settingsPath);\n let fileIdentity: { dev: number; ino: number } | undefined;\n try {\n fs.mkdirSync(dirname(settingsPath), { recursive: true });\n fs.writeFileSync(temporaryPath, rawDocument, { encoding: \"utf8\", flag: \"wx\" });\n const info = lstatSync(temporaryPath);\n fileIdentity = { dev: info.dev, ino: info.ino };\n if (!replaceExisting && pathEntryExists(settingsPath)) {\n throw new Error(`${SETTINGS_FILE_NAME} was created concurrently; reopen settings and retry.`);\n }\n fs.renameSync(temporaryPath, settingsPath);\n } finally {\n removeTemporaryFile(fs.rmSync, temporaryPath);\n }\n return {\n config: normalized.config,\n source: \"user\",\n settingsPath,\n rawDocument,\n ...(fileIdentity ? { fileIdentity } : {}),\n diagnostics: normalized.diagnostics,\n };\n}\n\nexport function removeStatuslineSettingsDocumentIfMatches(\n settingsPath: string,\n expectedRawDocument: string,\n expectedIdentity: { dev: number; ino: number },\n): void {\n const quarantinePath = join(dirname(settingsPath), `.${SETTINGS_FILE_NAME}.${randomUUID()}.rollback`);\n const before = lstatSync(settingsPath);\n if (before.dev !== expectedIdentity.dev || before.ino !== expectedIdentity.ino) {\n throw new Error(\"Statusline settings changed concurrently; the newer file was preserved\");\n }\n renameSync(settingsPath, quarantinePath);\n const quarantined = lstatSync(quarantinePath);\n const quarantinedSavedFile =\n quarantined.isFile() &&\n !quarantined.isSymbolicLink() &&\n quarantined.dev === expectedIdentity.dev &&\n quarantined.ino === expectedIdentity.ino;\n if (quarantinedSavedFile && readFileSync(quarantinePath, \"utf8\") === expectedRawDocument) {\n rmSync(quarantinePath);\n return;\n }\n if (quarantinedSavedFile && !pathEntryExists(settingsPath)) {\n try {\n renameSync(quarantinePath, settingsPath);\n } catch {\n // Keep the quarantine for recovery when its atomic restoration fails.\n }\n }\n throw new Error(\"Statusline settings changed concurrently; the newer file was preserved\");\n}\n\nexport function consumeStatuslineSettingsNotice(): string | undefined {\n const notice = pendingSettingsNotice;\n pendingSettingsNotice = undefined;\n return notice;\n}\n\nexport function readStatuslineSettings(settingsPath?: string): StatuslineConfig {\n return settingsPath ? loadStatuslineSettings(settingsPath).config : loadStatuslineSettingsForAgent().config;\n}\n\nexport function normalizeStatuslineSettings(value: unknown): StatuslineConfig {\n return normalizeStatuslineConfig(value).config;\n}\n\nfunction normalizePalette(value: unknown, config: StatuslineConfig, diagnostics: StatuslineConfigDiagnostic[]) {\n if (value === undefined) return;\n if (typeof value === \"string\") {\n if (!(PALETTE_NAMES as readonly string[]).includes(value)) {\n diagnostics.push(\n invalidDiagnostic(\"palette\", `Expected a palette object or one of: ${PALETTE_NAMES.join(\", \")}`),\n );\n return;\n }\n config.palettePreset = value as (typeof PALETTE_NAMES)[number];\n return;\n }\n if (!isRecord(value)) {\n diagnostics.push(invalidDiagnostic(\"palette\", \"Expected a palette object\"));\n return;\n }\n\n const palette: SegmentPalette = {};\n config.palette = palette;\n for (const [name, colors] of Object.entries(value)) {\n const path = `palette.${name}`;\n if (!isSegmentName(name)) {\n diagnostics.push(unknownDiagnostic(path));\n continue;\n }\n if (!isRecord(colors)) {\n diagnostics.push(invalidDiagnostic(path, \"Expected an object\"));\n continue;\n }\n const normalizedColors: NonNullable<SegmentPalette[SegmentName]> = {};\n palette[name] = normalizedColors;\n for (const [field, color] of Object.entries(colors)) {\n const colorPath = `${path}.${field}`;\n if (field !== \"fg\" && field !== \"bg\") {\n diagnostics.push(unknownDiagnostic(colorPath));\n continue;\n }\n if (typeof color !== \"string\" || !/^#[0-9a-f]{6}$/iu.test(color)) {\n diagnostics.push(invalidDiagnostic(colorPath, \"Expected a full #RRGGBB hexadecimal color\"));\n continue;\n }\n normalizedColors[field] = color.toLowerCase();\n }\n }\n config.palette = palette;\n config.palettePreset = \"custom\";\n}\n\nfunction normalizeModelTruncation(\n presentation: Record<string, unknown>,\n config: StatuslineConfig,\n diagnostics: StatuslineConfigDiagnostic[],\n) {\n const path = \"segmentText.model\";\n const length = presentation.truncationLength;\n if (length !== undefined) {\n if (typeof length !== \"number\" || !Number.isInteger(length) || length < 0 || length > 1000) {\n diagnostics.push(invalidDiagnostic(`${path}.truncationLength`, \"Expected an integer from 0 through 1000\"));\n } else config.segmentText.model.truncationLength = length;\n }\n\n const symbol = presentation.truncationSymbol;\n if (symbol !== undefined && isSafeSegmentText(symbol, `${path}.truncationSymbol`, diagnostics)) {\n config.segmentText.model.truncationSymbol = symbol;\n }\n\n const direction = presentation.truncationDirection;\n if (direction !== undefined) {\n if (\n typeof direction !== \"string\" ||\n !TRUNCATION_DIRECTIONS.includes(direction as (typeof TRUNCATION_DIRECTIONS)[number])\n ) {\n diagnostics.push(\n invalidDiagnostic(`${path}.truncationDirection`, `Expected one of: ${TRUNCATION_DIRECTIONS.join(\", \")}`),\n );\n } else {\n config.segmentText.model.truncationDirection = direction as (typeof TRUNCATION_DIRECTIONS)[number];\n }\n }\n}\n\nfunction isSafeSegmentText(value: unknown, path: string, diagnostics: StatuslineConfigDiagnostic[]): value is string {\n if (typeof value !== \"string\") {\n diagnostics.push(invalidDiagnostic(path, \"Expected a string\"));\n return false;\n }\n if (/[\\r\\n\\u2028\\u2029]/u.test(value)) {\n diagnostics.push(invalidDiagnostic(path, \"Line breaks are not allowed; use line_break\"));\n return false;\n }\n if (hasControlCharacter(value)) {\n diagnostics.push(invalidDiagnostic(path, \"Control characters are not allowed\"));\n return false;\n }\n return true;\n}\n\nfunction normalizeEnum<K extends \"palettePreset\" | \"density\" | \"separator\", T extends StatuslineConfig[K]>(\n value: Record<string, unknown>,\n field: K,\n accepted: readonly T[],\n config: StatuslineConfig,\n diagnostics: StatuslineConfigDiagnostic[],\n) {\n const candidate = value[field];\n if (candidate === undefined) return;\n if (typeof candidate !== \"string\" || !accepted.includes(candidate as T)) {\n diagnostics.push(invalidDiagnostic(field, `Expected one of: ${accepted.map(String).join(\", \")}`));\n return;\n }\n config[field] = candidate as StatuslineConfig[K];\n}\n\nfunction cloneSegmentPalette(palette: SegmentPalette): SegmentPalette {\n return Object.fromEntries(Object.entries(palette).map(([name, colors]) => [name, { ...colors }])) as SegmentPalette;\n}\n\nfunction cloneConfig(config: StatuslineConfig): StatuslineConfig {\n return {\n ...config,\n palette: cloneSegmentPalette(config.palette),\n segments: [...config.segments],\n segmentText: Object.fromEntries(\n SEGMENT_NAMES.map((name) => [name, { ...config.segmentText[name] }]),\n ) as StatuslineConfig[\"segmentText\"],\n extensionStatusIcons: { ...config.extensionStatusIcons },\n };\n}\n\nfunction builtInSettings(\n settingsPath: string,\n diagnostics: StatuslineConfigDiagnostic[] = [],\n): LoadedStatuslineSettings {\n return {\n config: createDefaultConfig(),\n source: \"built-in\",\n settingsPath,\n diagnostics,\n };\n}\n\nfunction hasControlCharacter(value: string): boolean {\n for (const character of value) {\n const codePoint = character.codePointAt(0) ?? 0;\n if (codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f)) return true;\n }\n return false;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isConfigSegmentName(value: string): value is ConfigSegmentName {\n return value === LINE_BREAK_SEGMENT_NAME || isSegmentName(value);\n}\n\nfunction isPaletteName(value: StatuslineConfig[\"palettePreset\"]): value is PaletteName {\n return (PALETTE_NAMES as readonly StatuslineConfig[\"palettePreset\"][]).includes(value);\n}\n\nfunction isSegmentName(value: string): value is SegmentName {\n return (SEGMENT_NAMES as readonly string[]).includes(value);\n}\n\nfunction blockingDiagnostics(diagnostics: readonly StatuslineConfigDiagnostic[]): StatuslineConfigDiagnostic[] {\n return diagnostics.filter((item) => item.code !== \"unknown\");\n}\n\nfunction unknownDiagnostic(path: string): StatuslineConfigDiagnostic {\n return diagnostic(\"warning\", \"unknown\", path, `Unknown setting ${JSON.stringify(path)}`);\n}\n\nfunction invalidDiagnostic(\n path: string,\n message: string,\n severity: StatuslineConfigDiagnostic[\"severity\"] = \"warning\",\n): StatuslineConfigDiagnostic {\n return diagnostic(severity, \"invalid\", path, message);\n}\n\nfunction diagnostic(\n severity: StatuslineConfigDiagnostic[\"severity\"],\n code: StatuslineConfigDiagnostic[\"code\"],\n path: string,\n message: string,\n): StatuslineConfigDiagnostic {\n return { severity, code, path, message };\n}\n\nfunction temporarySettingsPath(settingsPath: string): string {\n return join(dirname(settingsPath), `.${SETTINGS_FILE_NAME}.${randomUUID()}.tmp`);\n}\n\nfunction removeTemporaryFile(remove: typeof rmSync, temporaryPath: string) {\n try {\n remove(temporaryPath, { force: true });\n } catch {\n // Best-effort cleanup must not replace the original operation result.\n }\n}\n\nfunction pathExists(path: string): boolean {\n try {\n lstatSync(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction pathEntryExists(path: string): boolean {\n try {\n lstatSync(path);\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n throw error;\n }\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -13,20 +13,13 @@ import {
13
13
  removeStatuslineSettingsDocumentIfMatches,
14
14
  saveStatuslineSettingsDocument,
15
15
  segmentPaletteForPreset
16
- } from "./chunk-74QZGJ7L.js";
16
+ } from "./chunk-J2ZSGEDQ.js";
17
17
 
18
18
  // src/commands.ts
19
19
  import {
20
20
  DynamicBorder
21
21
  } from "@earendil-works/pi-coding-agent";
22
- import {
23
- Container,
24
- Key,
25
- matchesKey,
26
- Text,
27
- truncateToWidth,
28
- wrapTextWithAnsi
29
- } from "@earendil-works/pi-tui";
22
+ import { Container, Key, matchesKey, Text, truncateToWidth, wrapTextWithAnsi } from "@earendil-works/pi-tui";
30
23
  import { sanitizeTerminalText } from "@narumitw/pi-tui-kit/terminal-text";
31
24
  var EDIT_SETTINGS_LABEL = "Edit settings JSON";
32
25
  var SEGMENT_VIEWPORT_SIZE = 6;
@@ -269,10 +262,7 @@ function applyInformationProfile(ctx, options, selection) {
269
262
  try {
270
263
  const change = informationProfileDocument(current, selection);
271
264
  const loaded = applySegmentsDocumentChange(change, ctx, options);
272
- ctx.ui.notify(
273
- `Information level applied: ${inferInformationProfile(loaded.config.segments)}.`,
274
- "info"
275
- );
265
+ ctx.ui.notify(`Information level applied: ${inferInformationProfile(loaded.config.segments)}.`, "info");
276
266
  } catch (error) {
277
267
  ctx.ui.notify(`Information level was not saved: ${formatError(error)}`, "error");
278
268
  }
@@ -362,10 +352,7 @@ async function chooseSegments(ctx, options) {
362
352
  const viewportSize = safeWidth < 30 ? NARROW_SEGMENT_VIEWPORT_SIZE : SEGMENT_VIEWPORT_SIZE;
363
353
  const startIndex = Math.max(
364
354
  0,
365
- Math.min(
366
- selectedIndex - Math.floor(viewportSize / 2),
367
- Math.max(0, names.length - viewportSize)
368
- )
355
+ Math.min(selectedIndex - Math.floor(viewportSize / 2), Math.max(0, names.length - viewportSize))
369
356
  );
370
357
  const endIndex = Math.min(names.length, startIndex + viewportSize);
371
358
  const lines = [];
@@ -389,12 +376,7 @@ async function chooseSegments(ctx, options) {
389
376
  else lines.push(section === "visible" ? truncated : theme.fg("muted", truncated));
390
377
  }
391
378
  if (startIndex > 0 || endIndex < names.length) {
392
- lines.push(
393
- theme.fg(
394
- "dim",
395
- truncateToWidth(` (${startIndex + 1}-${endIndex}/${names.length})`, safeWidth)
396
- )
397
- );
379
+ lines.push(theme.fg("dim", truncateToWidth(` (${startIndex + 1}-${endIndex}/${names.length})`, safeWidth)));
398
380
  }
399
381
  const selected = names[selectedIndex];
400
382
  if (selected) {
@@ -517,10 +499,7 @@ function palettePresetDocument(current, palettePreset) {
517
499
  `;
518
500
  }
519
501
  function informationProfileDocument(current, profile) {
520
- const { parsed, rawDocument: previousDocument } = editableSettings(
521
- current,
522
- "changing information level"
523
- );
502
+ const { parsed, rawDocument: previousDocument } = editableSettings(current, "changing information level");
524
503
  parsed.segments = [...INFORMATION_PROFILES[profile]];
525
504
  return {
526
505
  nextDocument: `${JSON.stringify(parsed, null, " ")}
@@ -529,9 +508,7 @@ function informationProfileDocument(current, profile) {
529
508
  };
530
509
  }
531
510
  function visibleSegmentNames(current) {
532
- return current.config.segments.filter(
533
- (segment) => segment !== LINE_BREAK_SEGMENT_NAME
534
- );
511
+ return current.config.segments.filter((segment) => segment !== LINE_BREAK_SEGMENT_NAME);
535
512
  }
536
513
  function segmentMenuOrder(current) {
537
514
  const visible = visibleSegmentNames(current);
@@ -575,13 +552,7 @@ function segmentControlHints(width, moveMode, selected, keybindings) {
575
552
  "Ctrl+C close"
576
553
  ] : [`Move mode \u2014 ${selected ?? "segment"}`, "\u2191\u2193 move \xB7 Enter/Space finish", cancellation];
577
554
  }
578
- return width < 30 ? [
579
- "\u2191\u2193 navigate",
580
- "Enter/Space toggle",
581
- "M move \xB7 B line break",
582
- "Alt+\u2191/\u2193 quick move",
583
- `${closeKeys} close`
584
- ] : [
555
+ return width < 30 ? ["\u2191\u2193 navigate", "Enter/Space toggle", "M move \xB7 B line break", "Alt+\u2191/\u2193 quick move", `${closeKeys} close`] : [
585
556
  "\u2191\u2193 navigate \xB7 Enter/Space show/hide \xB7 M move mode",
586
557
  `B add/remove line break after \xB7 Alt+\u2191/\u2193 quick move \xB7 ${closeKeys} close`
587
558
  ];
@@ -606,10 +577,7 @@ function segmentsDocument(current, name, shouldShow) {
606
577
  };
607
578
  }
608
579
  function lineBreakAfterDocument(current, name) {
609
- const { parsed, rawDocument: previousDocument } = editableSettings(
610
- current,
611
- "changing line breaks"
612
- );
580
+ const { parsed, rawDocument: previousDocument } = editableSettings(current, "changing line breaks");
613
581
  const segments = [...current.config.segments];
614
582
  const segmentIndex = segments.indexOf(name);
615
583
  if (segments[segmentIndex + 1] === LINE_BREAK_SEGMENT_NAME) {
@@ -628,17 +596,12 @@ function reorderedSegmentsDocument(current, name, direction) {
628
596
  const dataIndexes = current.config.segments.flatMap(
629
597
  (segment, index) => segment === LINE_BREAK_SEGMENT_NAME ? [] : [index]
630
598
  );
631
- const currentDataIndex = dataIndexes.findIndex(
632
- (index) => current.config.segments[index] === name
633
- );
599
+ const currentDataIndex = dataIndexes.findIndex((index) => current.config.segments[index] === name);
634
600
  const targetDataIndex = currentDataIndex + direction;
635
601
  if (currentDataIndex < 0 || targetDataIndex < 0 || targetDataIndex >= dataIndexes.length) {
636
602
  return void 0;
637
603
  }
638
- const { parsed, rawDocument: previousDocument } = editableSettings(
639
- current,
640
- "reordering segments"
641
- );
604
+ const { parsed, rawDocument: previousDocument } = editableSettings(current, "reordering segments");
642
605
  const segments = [...current.config.segments];
643
606
  const currentIndex = dataIndexes[currentDataIndex];
644
607
  const targetIndex = dataIndexes[targetDataIndex];
@@ -673,19 +636,12 @@ function restoreStatuslineSettings(ctx, options, previous, saved) {
673
636
  if (saved.rawDocument === void 0 || saved.fileIdentity === void 0) {
674
637
  throw new Error("The saved settings document identity is unavailable");
675
638
  }
676
- removeStatuslineSettingsDocumentIfMatches(
677
- options.settingsPath,
678
- saved.rawDocument,
679
- saved.fileIdentity
680
- );
639
+ removeStatuslineSettingsDocumentIfMatches(options.settingsPath, saved.rawDocument, saved.fileIdentity);
681
640
  if (previous.rawDocument === void 0 || previous.settingsPath !== options.settingsPath) {
682
641
  options.apply(previous, ctx);
683
642
  return void 0;
684
643
  }
685
- const restored = (options.save ?? saveStatuslineSettingsDocument)(
686
- options.settingsPath,
687
- previous.rawDocument
688
- );
644
+ const restored = (options.save ?? saveStatuslineSettingsDocument)(options.settingsPath, previous.rawDocument);
689
645
  options.apply(restored, ctx);
690
646
  return void 0;
691
647
  } catch (error) {
@@ -771,4 +727,4 @@ export {
771
727
  handleStatuslineCommand,
772
728
  registerStatuslineCommand
773
729
  };
774
- //# sourceMappingURL=commands-C2G2G7C6.js.map
730
+ //# sourceMappingURL=commands-PPT3AJTL.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands.ts"],
4
+ "sourcesContent": ["import {\n DynamicBorder,\n type ExtensionAPI,\n type ExtensionCommandContext,\n type KeybindingsManager,\n} from \"@earendil-works/pi-coding-agent\";\nimport { Container, Key, matchesKey, Text, truncateToWidth, wrapTextWithAnsi } from \"@earendil-works/pi-tui\";\nimport { sanitizeTerminalText } from \"@narumitw/pi-tui-kit/terminal-text\";\nimport { completeStatuslineArguments } from \"./command-contract.js\";\nimport {\n INFORMATION_PROFILE_NAMES,\n INFORMATION_PROFILES,\n type InformationProfileName,\n inferInformationProfile,\n} from \"./information-profiles.js\";\nimport { segmentPaletteForPreset } from \"./presets/index.js\";\nimport {\n DEFAULT_STATUSLINE_DOCUMENT,\n type LoadedStatuslineSettings,\n removeStatuslineSettingsDocumentIfMatches,\n saveStatuslineSettingsDocument,\n} from \"./settings.js\";\nimport {\n type ConfigSegmentName,\n LINE_BREAK_SEGMENT_NAME,\n PALETTE_NAMES,\n PALETTE_PRESET_NAMES,\n type PaletteName,\n type PalettePreset,\n SEGMENT_NAMES,\n type 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 brand: \"Pi brand mark\",\n provider: \"Current model provider\",\n model: \"Current model name\",\n thinking: \"Current thinking level\",\n cwd: \"Current working directory\",\n branch: \"Git branch, status, and linked pull request\",\n tools: \"Current tool and streaming activity\",\n context: \"Current context-window usage\",\n tokens: \"Session token totals\",\n cache: \"Prompt-cache reads, writes, and latest hit rate\",\n cost: \"Session cost\",\n time: \"Current local time\",\n turn: \"Current session turn count\",\n};\ninterface StatuslineMenuOwner {\n signal: AbortSignal;\n isCurrent(): boolean;\n}\n\nexport interface StatuslineCommandOptions {\n settingsPath: string;\n getLoaded(): LoadedStatuslineSettings;\n apply(loaded: LoadedStatuslineSettings, ctx: ExtensionCommandContext): void;\n preview?(palettePreset: PalettePreset | undefined, ctx: ExtensionCommandContext): void;\n save?: (settingsPath: string, rawDocument: string) => LoadedStatuslineSettings;\n getMenuOwner?(): StatuslineMenuOwner;\n}\n\nexport function registerStatuslineCommand(pi: ExtensionAPI, options: StatuslineCommandOptions) {\n pi.registerCommand(\"statusline\", {\n description: \"Open or inspect the statusline settings\",\n getArgumentCompletions: completeStatuslineArguments,\n handler: (args, ctx) => handleStatuslineCommand(args, ctx, options),\n });\n}\n\nexport async function handleStatuslineCommand(\n args: string,\n ctx: ExtensionCommandContext,\n options: StatuslineCommandOptions,\n) {\n const normalized = args.trim();\n if (!normalized) {\n await showMainMenu(ctx, options);\n return;\n }\n\n const tokens = normalized.split(/\\s+/u);\n const subcommand = tokens[0]?.toLowerCase() ?? \"\";\n if (tokens.length > 1) {\n if (canNotify(ctx)) {\n ctx.ui.notify(`/statusline ${subcommand} does not accept trailing arguments.`, \"warning\");\n }\n return;\n }\n\n switch (subcommand) {\n case \"settings\":\n await editSettings(ctx, options);\n return;\n case \"status\":\n showStatus(ctx, options);\n return;\n case \"help\":\n showHelp(ctx, options.settingsPath);\n return;\n default:\n if (canNotify(ctx)) {\n ctx.ui.notify(`Unknown /statusline subcommand: ${subcommand}`, \"warning\");\n }\n }\n}\n\nasync function showMainMenu(ctx: ExtensionCommandContext, options: StatuslineCommandOptions) {\n if (ctx.mode !== \"tui\") {\n if (ctx.hasUI) ctx.ui.notify(\"/statusline requires an interactive Pi UI in TUI mode.\", \"error\");\n return;\n }\n const fallbackController = new AbortController();\n const owner = options.getMenuOwner?.() ?? {\n signal: fallbackController.signal,\n isCurrent: () => !fallbackController.signal.aborted,\n };\n const { defineMenu, runMenu } = await import(\"@narumitw/pi-tui-kit\");\n if (owner.signal.aborted || !owner.isCurrent()) return;\n type Screen = \"main\" | \"advanced\" | \"information\";\n type Action = \"appearance\" | \"setInformation\" | \"layout\" | \"edit\" | \"status\" | \"help\" | \"back\";\n const menu = defineMenu<undefined, Screen, Action, ExtensionCommandContext>({\n start: \"main\",\n screens: {\n main: () => {\n const config = options.getLoaded().config;\n return {\n kind: \"actions\",\n title: \"pi-statusline\",\n items: [\n {\n id: \"appearance\",\n label: `Appearance (${config.palettePreset})`,\n action: \"appearance\",\n },\n {\n id: \"information\",\n label: `Information (${inferInformationProfile(config.segments)})`,\n to: \"information\",\n },\n { id: \"advanced\", label: \"Advanced\", to: \"advanced\" },\n { id: \"status\", label: \"Status\", action: \"status\" },\n { id: \"help\", label: \"Help\", action: \"help\" },\n ],\n hint: \"close\",\n };\n },\n information: () => {\n const current = inferInformationProfile(options.getLoaded().config.segments);\n return {\n kind: \"choice\",\n title: \"Information level\",\n lines: [`Current profile: ${current}`],\n items: INFORMATION_PROFILE_NAMES.map((profile) => ({\n id: profile,\n label: `${profile[0]?.toUpperCase() ?? \"\"}${profile.slice(1)}`,\n description: `${INFORMATION_PROFILES[profile].length} segments`,\n details: [`Segments: ${INFORMATION_PROFILES[profile].join(\" \u00B7 \")}`],\n })),\n action: \"setInformation\",\n currentItemId: current,\n initialItemId: current === \"custom\" ? \"balanced\" : current,\n hint: \"close\",\n };\n },\n advanced: () => {\n const config = options.getLoaded().config;\n const visibleSegmentCount = config.segments.filter(\n (segment): segment is SegmentName => segment !== LINE_BREAK_SEGMENT_NAME,\n ).length;\n return {\n kind: \"actions\",\n title: \"pi-statusline \u2014 Advanced\",\n items: [\n {\n id: \"layout\",\n label: `Custom layout (${visibleSegmentCount}/${SEGMENT_NAMES.length} shown)`,\n action: \"layout\",\n },\n { id: \"edit\", label: EDIT_SETTINGS_LABEL, action: \"edit\" },\n { id: \"back\", label: \"Back\", action: \"back\" },\n ],\n hint: \"back\",\n };\n },\n },\n actions: {\n appearance: async () => {\n await choosePalettePreset(ctx, options, owner);\n return { kind: \"close\" };\n },\n setInformation: async ({ itemId }) => {\n const profile = INFORMATION_PROFILE_NAMES.find((candidate) => candidate === itemId);\n if (!profile) return { kind: \"rejected\" };\n applyInformationProfile(ctx, options, profile);\n return { kind: \"close\" };\n },\n layout: async () => {\n await chooseSegments(ctx, options);\n return { kind: \"close\" };\n },\n edit: async () => {\n await editSettings(ctx, options);\n return { kind: \"close\" };\n },\n status: async () => {\n showStatus(ctx, options);\n return { kind: \"close\" };\n },\n help: async () => {\n showHelp(ctx, options.settingsPath);\n return { kind: \"close\" };\n },\n back: async () => ({ kind: \"back\" }),\n },\n });\n try {\n await runMenu(ctx, menu, {\n getState: () => undefined,\n signal: owner.signal,\n isCurrent: owner.isCurrent,\n });\n } finally {\n fallbackController.abort(new DOMException(\"Statusline menu closed\", \"AbortError\"));\n }\n}\n\nasync function choosePalettePreset(\n ctx: ExtensionCommandContext,\n options: StatuslineCommandOptions,\n owner: StatuslineMenuOwner,\n) {\n if (ctx.mode !== \"tui\") {\n if (ctx.hasUI) ctx.ui.notify(`Edit palettePreset manually: ${options.settingsPath}`, \"info\");\n return;\n }\n const current = options.getLoaded();\n let selection: PalettePreset | undefined;\n try {\n selection = await showPalettePresetPicker(ctx, current.config.palettePreset, options, owner);\n } finally {\n if (!owner.signal.aborted && owner.isCurrent()) {\n try {\n options.preview?.(undefined, ctx);\n } catch (error) {\n if (canNotify(ctx)) {\n ctx.ui.notify(`Palette preview could not be reset: ${formatError(error)}`, \"error\");\n }\n }\n }\n }\n if (owner.signal.aborted || !owner.isCurrent()) return;\n if (selection === undefined) return;\n\n let loaded: LoadedStatuslineSettings;\n try {\n const rawDocument = palettePresetDocument(current, selection);\n loaded = (options.save ?? saveStatuslineSettingsDocument)(options.settingsPath, rawDocument);\n } catch (error) {\n ctx.ui.notify(`Palette preset was not saved: ${formatError(error)}`, \"error\");\n return;\n }\n try {\n options.apply(loaded, ctx);\n } catch (error) {\n const rollbackError = restoreStatuslineSettings(ctx, options, current, loaded);\n ctx.ui.notify(\n rollbackError\n ? `Palette preset could not be applied: ${formatError(error)}; rollback failed: ${formatError(rollbackError)}`\n : `Palette preset could not be applied: ${formatError(error)}; previous settings restored.`,\n \"error\",\n );\n return;\n }\n const message =\n loaded.config.palettePreset === \"custom\"\n ? \"Custom palette applied. Edit colors via /statusline \u2192 Advanced \u2192 Edit settings JSON.\"\n : `Palette preset applied: ${loaded.config.palettePreset}.`;\n ctx.ui.notify(message, \"info\");\n}\n\nasync function showPalettePresetPicker(\n ctx: ExtensionCommandContext,\n current: PalettePreset,\n options: StatuslineCommandOptions,\n owner: StatuslineMenuOwner,\n): Promise<PalettePreset | undefined> {\n const { runLiveChoice } = await import(\"@narumitw/pi-tui-kit\");\n const result = await runLiveChoice(ctx, {\n title: `Palette preset (current: ${current})`,\n items: PALETTE_PRESET_NAMES.map((palettePreset) => ({\n id: palettePreset,\n label: palettePreset,\n description: palettePreset === \"custom\" ? \"per-segment colors from settings JSON\" : undefined,\n })),\n currentItemId: current,\n initialItemId: current,\n viewportSize: Math.min(PALETTE_PRESET_NAMES.length, 10),\n hint: \"close\",\n navigationLabel: \"preview\",\n confirmLabel: \"apply\",\n onSelectionChange: ({ item }) => options.preview?.(item.id, ctx),\n signal: owner.signal,\n isCurrent: owner.isCurrent,\n });\n return result.kind === \"selected\" ? result.itemId : undefined;\n}\n\nfunction applyInformationProfile(\n ctx: ExtensionCommandContext,\n options: StatuslineCommandOptions,\n selection: InformationProfileName,\n) {\n const current = options.getLoaded();\n try {\n const change = informationProfileDocument(current, selection);\n const loaded = applySegmentsDocumentChange(change, ctx, options);\n ctx.ui.notify(`Information level applied: ${inferInformationProfile(loaded.config.segments)}.`, \"info\");\n } catch (error) {\n ctx.ui.notify(`Information level was not saved: ${formatError(error)}`, \"error\");\n }\n}\n\nasync function chooseSegments(ctx: ExtensionCommandContext, options: StatuslineCommandOptions) {\n if (ctx.mode !== \"tui\") {\n if (ctx.hasUI) ctx.ui.notify(`Edit segments manually: ${options.settingsPath}`, \"info\");\n return;\n }\n let current = options.getLoaded();\n let names = segmentMenuOrder(current);\n let selectedIndex = 0;\n let moveMode = false;\n let feedback: string | undefined;\n\n await ctx.ui.custom((tui, theme, keybindings, done) => {\n const commit = (name: SegmentName, change: { nextDocument: string; previousDocument: string }): boolean => {\n try {\n current = applySegmentsDocumentChange(change, ctx, options);\n names = segmentMenuOrder(current);\n selectedIndex = Math.max(0, names.indexOf(name));\n feedback = undefined;\n return true;\n } catch (error) {\n ctx.ui.notify(`Statusline segments were not saved: ${formatError(error)}`, \"error\");\n return false;\n }\n };\n\n const toggleSelected = () => {\n const name = names[selectedIndex];\n if (!name) return;\n moveMode = false;\n commit(name, segmentsDocument(current, name, !current.config.segments.includes(name)));\n };\n\n const toggleLineBreakAfterSelected = () => {\n const name = names[selectedIndex];\n if (!name) return;\n moveMode = false;\n const segmentIndex = current.config.segments.indexOf(name);\n if (segmentIndex < 0) {\n feedback = `Show ${name} before adding a line break.`;\n return;\n }\n const hasLineBreak = current.config.segments[segmentIndex + 1] === LINE_BREAK_SEGMENT_NAME;\n const hasFollowingSegment = current.config.segments\n .slice(segmentIndex + 1)\n .some((segment) => segment !== LINE_BREAK_SEGMENT_NAME);\n if (!hasLineBreak && !hasFollowingSegment) {\n feedback = `Add another visible segment after ${name} before adding a line break.`;\n return;\n }\n commit(name, lineBreakAfterDocument(current, name));\n };\n\n const reorderSelected = (direction: -1 | 1) => {\n const name = names[selectedIndex];\n if (!name) return;\n const visibleNames = visibleSegmentNames(current);\n const currentIndex = visibleNames.indexOf(name);\n if (currentIndex < 0) {\n feedback = `Show ${name} before moving it.`;\n return;\n }\n const targetIndex = currentIndex + direction;\n if (targetIndex < 0 || targetIndex >= visibleNames.length) {\n feedback = `${name} is already the ${direction < 0 ? \"first\" : \"last\"} visible segment.`;\n return;\n }\n const change = reorderedSegmentsDocument(current, name, direction);\n if (change) commit(name, change);\n };\n\n const enterMoveMode = () => {\n const name = names[selectedIndex];\n if (!name) return;\n if (!current.config.segments.includes(name)) {\n feedback = `Show ${name} before moving it.`;\n return;\n }\n moveMode = true;\n feedback = undefined;\n };\n\n const moveSelection = (offset: number) => {\n selectedIndex = Math.max(0, Math.min(names.length - 1, selectedIndex + offset));\n feedback = undefined;\n };\n\n const renderList = (width: number): string[] => {\n const safeWidth = Math.max(1, width);\n const visibleNames = visibleSegmentNames(current);\n const visible = new Set(visibleNames);\n const placements = segmentPlacements(current.config.segments);\n const viewportSize = safeWidth < 30 ? NARROW_SEGMENT_VIEWPORT_SIZE : SEGMENT_VIEWPORT_SIZE;\n const startIndex = Math.max(\n 0,\n Math.min(selectedIndex - Math.floor(viewportSize / 2), Math.max(0, names.length - viewportSize)),\n );\n const endIndex = Math.min(names.length, startIndex + viewportSize);\n const lines: string[] = [];\n let previousSection: \"visible\" | \"hidden\" | undefined;\n for (let index = startIndex; index < endIndex; index += 1) {\n const name = names[index];\n if (!name) continue;\n const section = visible.has(name) ? \"visible\" : \"hidden\";\n if (section !== previousSection) {\n const heading = section === \"visible\" ? \"Visible \u2014 render order\" : \"Hidden \u2014 not rendered\";\n lines.push(theme.fg(\"muted\", theme.bold(truncateToWidth(` ${heading}`, safeWidth))));\n previousSection = section;\n }\n const isSelected = index === selectedIndex;\n const prefix = isSelected ? \"\u2192 \" : \" \";\n const placement = placements.get(name);\n const lineBreakLabel = hasLineBreakAfter(current.config.segments, name) ? \" \u00B7 break after\" : \"\";\n const row = placement\n ? `${prefix}${`${placement.order}.`.padStart(3)} row ${placement.row} \u00B7 ${name.padEnd(8)} \u00B7 visible${lineBreakLabel}`\n : `${prefix} \u00B7 ${name.padEnd(8)} \u00B7 hidden`;\n const truncated = truncateToWidth(row, safeWidth);\n if (isSelected) lines.push(theme.fg(\"accent\", truncated));\n else lines.push(section === \"visible\" ? truncated : theme.fg(\"muted\", truncated));\n }\n if (startIndex > 0 || endIndex < names.length) {\n lines.push(theme.fg(\"dim\", truncateToWidth(` (${startIndex + 1}-${endIndex}/${names.length})`, safeWidth)));\n }\n\n const selected = names[selectedIndex];\n if (selected) {\n lines.push(\"\");\n const detail = feedback ?? SEGMENT_DESCRIPTIONS[selected];\n const color = feedback ? \"warning\" : \"muted\";\n for (const line of wrapTextWithAnsi(detail, Math.max(1, safeWidth - 2))) {\n lines.push(theme.fg(color, truncateToWidth(` ${line}`, safeWidth)));\n }\n }\n\n lines.push(\"\");\n const hints = segmentControlHints(safeWidth, moveMode, selected, keybindings);\n for (const hint of hints) {\n lines.push(theme.fg(\"dim\", truncateToWidth(` ${hint}`, safeWidth)));\n }\n return lines;\n };\n\n const container = new Container();\n container.addChild(new DynamicBorder((text: string) => theme.fg(\"accent\", text)));\n const title = new Text(\"\", 1, 0);\n container.addChild(title);\n container.addChild({ render: renderList, invalidate() {} });\n container.addChild(new DynamicBorder((text: string) => theme.fg(\"accent\", text)));\n const updateThemedText = () => {\n title.setText(theme.fg(\"accent\", theme.bold(\"Statusline segments\")));\n };\n updateThemedText();\n\n return {\n render: (width: number) => container.render(width),\n invalidate() {\n container.invalidate();\n updateThemedText();\n },\n handleInput(data: string) {\n if (matchesKey(data, Key.ctrl(\"c\"))) {\n done(undefined);\n return;\n }\n const moveModeKey = matchesKey(data, \"m\") || matchesKey(data, Key.shift(\"m\"));\n const lineBreakKey = matchesKey(data, \"b\") || matchesKey(data, Key.shift(\"b\"));\n if (matchesKey(data, Key.alt(\"up\"))) {\n reorderSelected(-1);\n } else if (matchesKey(data, Key.alt(\"down\"))) {\n reorderSelected(1);\n } else if (moveMode) {\n if (keybindings.matches(data, \"tui.select.up\")) {\n reorderSelected(-1);\n } else if (keybindings.matches(data, \"tui.select.down\")) {\n reorderSelected(1);\n } else if (\n moveModeKey ||\n keybindings.matches(data, \"tui.select.confirm\") ||\n data === \" \" ||\n keybindings.matches(data, \"tui.select.cancel\")\n ) {\n moveMode = false;\n feedback = undefined;\n }\n } else if (keybindings.matches(data, \"tui.select.up\")) {\n selectedIndex = selectedIndex === 0 ? names.length - 1 : selectedIndex - 1;\n feedback = undefined;\n } else if (keybindings.matches(data, \"tui.select.down\")) {\n selectedIndex = selectedIndex === names.length - 1 ? 0 : selectedIndex + 1;\n feedback = undefined;\n } else if (keybindings.matches(data, \"tui.select.pageUp\")) {\n moveSelection(-SEGMENT_VIEWPORT_SIZE);\n } else if (keybindings.matches(data, \"tui.select.pageDown\")) {\n moveSelection(SEGMENT_VIEWPORT_SIZE);\n } else if (moveModeKey) {\n enterMoveMode();\n } else if (lineBreakKey) {\n toggleLineBreakAfterSelected();\n } else if (keybindings.matches(data, \"tui.select.confirm\") || data === \" \") {\n toggleSelected();\n } else if (keybindings.matches(data, \"tui.select.cancel\")) {\n done(undefined);\n }\n tui.requestRender();\n },\n };\n });\n}\n\nasync function editSettings(ctx: ExtensionCommandContext, options: StatuslineCommandOptions) {\n if (ctx.mode !== \"tui\") {\n if (ctx.hasUI) ctx.ui.notify(`Edit settings manually: ${options.settingsPath}`, \"info\");\n return;\n }\n const current = options.getLoaded();\n const edited = await ctx.ui.editor(\n \"pi-statusline.json \u2014 save and close to apply\",\n current.rawDocument ?? DEFAULT_STATUSLINE_DOCUMENT,\n );\n if (edited === undefined) return;\n let loaded: LoadedStatuslineSettings;\n try {\n loaded = (options.save ?? saveStatuslineSettingsDocument)(options.settingsPath, edited);\n } catch (error) {\n ctx.ui.notify(`pi-statusline settings were not saved: ${formatError(error)}`, \"error\");\n return;\n }\n try {\n options.apply(loaded, ctx);\n } catch (error) {\n const rollbackError = restoreStatuslineSettings(ctx, options, current, loaded);\n ctx.ui.notify(\n rollbackError\n ? `pi-statusline settings could not be applied: ${formatError(error)}; rollback failed: ${formatError(rollbackError)}`\n : `pi-statusline settings could not be applied: ${formatError(error)}; previous settings restored.`,\n \"error\",\n );\n return;\n }\n const suffix =\n loaded.diagnostics.length > 0\n ? ` (${loaded.diagnostics.length} warning${loaded.diagnostics.length === 1 ? \"\" : \"s\"})`\n : \"\";\n ctx.ui.notify(`pi-statusline settings saved and applied${suffix}.`, \"info\");\n}\n\nfunction palettePresetDocument(current: LoadedStatuslineSettings, palettePreset: PalettePreset): string {\n const { parsed } = editableSettings(current, \"choosing a palette preset\");\n if (palettePreset === \"custom\" && !isRecord(parsed.palette)) {\n const seedPreset = isPaletteName(current.config.palettePreset) ? current.config.palettePreset : \"tokyo-night\";\n parsed.palette = segmentPaletteForPreset(seedPreset);\n } else if (palettePreset !== \"custom\" && typeof parsed.palette === \"string\") {\n delete parsed.palette;\n }\n parsed.palettePreset = palettePreset;\n return `${JSON.stringify(parsed, null, \"\\t\")}\\n`;\n}\n\nfunction informationProfileDocument(\n current: LoadedStatuslineSettings,\n profile: InformationProfileName,\n): { nextDocument: string; previousDocument: string } {\n const { parsed, rawDocument: previousDocument } = editableSettings(current, \"changing information level\");\n parsed.segments = [...INFORMATION_PROFILES[profile]];\n return {\n nextDocument: `${JSON.stringify(parsed, null, \"\\t\")}\\n`,\n previousDocument,\n };\n}\n\nfunction visibleSegmentNames(current: LoadedStatuslineSettings): SegmentName[] {\n return current.config.segments.filter((segment): segment is SegmentName => segment !== LINE_BREAK_SEGMENT_NAME);\n}\n\nfunction segmentMenuOrder(current: LoadedStatuslineSettings): SegmentName[] {\n const visible = visibleSegmentNames(current);\n const visibleSet = new Set(visible);\n return [...visible, ...SEGMENT_NAMES.filter((name) => !visibleSet.has(name))];\n}\n\nfunction hasLineBreakAfter(segments: readonly ConfigSegmentName[], name: SegmentName): boolean {\n const index = segments.indexOf(name);\n return index >= 0 && segments[index + 1] === LINE_BREAK_SEGMENT_NAME;\n}\n\nfunction segmentPlacements(segments: readonly ConfigSegmentName[]): Map<SegmentName, { order: number; row: number }> {\n const placements = new Map<SegmentName, { order: number; row: number }>();\n let order = 0;\n let row = 1;\n for (const segment of segments) {\n if (segment === LINE_BREAK_SEGMENT_NAME) {\n row += 1;\n continue;\n }\n placements.set(segment, { order: ++order, row });\n }\n return placements;\n}\n\nfunction segmentControlHints(\n width: number,\n moveMode: boolean,\n selected: SegmentName | undefined,\n keybindings: Pick<KeybindingsManager, \"getKeys\">,\n): string[] {\n const configuredCancel = [\n ...new Set(\n keybindings\n .getKeys(\"tui.select.cancel\")\n .filter((key) => key !== \"ctrl+c\")\n .map(displayKey)\n .filter(Boolean),\n ),\n ];\n const closeKeys = [...new Set([...configuredCancel, \"Ctrl+C\"])].join(\"/\");\n if (moveMode) {\n const cancellation = [\n ...(configuredCancel.length > 0 ? [`${configuredCancel.join(\"/\")} leave move mode`] : []),\n \"Ctrl+C close\",\n ].join(\" \u00B7 \");\n return width < 30\n ? [\n `Move mode: ${selected ?? \"segment\"}`,\n \"\u2191\u2193 move segment\",\n \"Enter/Space finish\",\n ...(configuredCancel.length > 0 ? [`${configuredCancel.join(\"/\")} leave move mode`] : []),\n \"Ctrl+C close\",\n ]\n : [`Move mode \u2014 ${selected ?? \"segment\"}`, \"\u2191\u2193 move \u00B7 Enter/Space finish\", cancellation];\n }\n return width < 30\n ? [\"\u2191\u2193 navigate\", \"Enter/Space toggle\", \"M move \u00B7 B line break\", \"Alt+\u2191/\u2193 quick move\", `${closeKeys} close`]\n : [\n \"\u2191\u2193 navigate \u00B7 Enter/Space show/hide \u00B7 M move mode\",\n `B add/remove line break after \u00B7 Alt+\u2191/\u2193 quick move \u00B7 ${closeKeys} close`,\n ];\n}\n\nfunction displayKey(key: string): string {\n return sanitizeTerminalText(key)\n .split(\"+\")\n .map((part) => {\n if (part === \"escape\") return \"Esc\";\n if (part === \"ctrl\") return \"Ctrl\";\n if (part === \"alt\") return process.platform === \"darwin\" ? \"Option\" : \"Alt\";\n if (part === \"shift\") return \"Shift\";\n return part;\n })\n .join(\"+\");\n}\n\nfunction segmentsDocument(\n current: LoadedStatuslineSettings,\n name: SegmentName,\n shouldShow: boolean,\n): { nextDocument: string; previousDocument: string } {\n const { parsed, rawDocument: previousDocument } = editableSettings(current, \"changing segments\");\n const segments = shouldShow\n ? [...current.config.segments, ...(current.config.segments.includes(name) ? [] : [name])]\n : current.config.segments.filter((segment) => segment !== name);\n parsed.segments = normalizeLineBreaks(segments);\n return {\n nextDocument: `${JSON.stringify(parsed, null, \"\\t\")}\\n`,\n previousDocument,\n };\n}\n\nfunction lineBreakAfterDocument(\n current: LoadedStatuslineSettings,\n name: SegmentName,\n): { nextDocument: string; previousDocument: string } {\n const { parsed, rawDocument: previousDocument } = editableSettings(current, \"changing line breaks\");\n const segments = [...current.config.segments];\n const segmentIndex = segments.indexOf(name);\n if (segments[segmentIndex + 1] === LINE_BREAK_SEGMENT_NAME) {\n segments.splice(segmentIndex + 1, 1);\n } else {\n segments.splice(segmentIndex + 1, 0, LINE_BREAK_SEGMENT_NAME);\n }\n parsed.segments = segments;\n return {\n nextDocument: `${JSON.stringify(parsed, null, \"\\t\")}\\n`,\n previousDocument,\n };\n}\n\nfunction reorderedSegmentsDocument(\n current: LoadedStatuslineSettings,\n name: SegmentName,\n direction: -1 | 1,\n): { nextDocument: string; previousDocument: string } | undefined {\n const dataIndexes = current.config.segments.flatMap((segment, index) =>\n segment === LINE_BREAK_SEGMENT_NAME ? [] : [index],\n );\n const currentDataIndex = dataIndexes.findIndex((index) => current.config.segments[index] === name);\n const targetDataIndex = currentDataIndex + direction;\n if (currentDataIndex < 0 || targetDataIndex < 0 || targetDataIndex >= dataIndexes.length) {\n return undefined;\n }\n const { parsed, rawDocument: previousDocument } = editableSettings(current, \"reordering segments\");\n const segments = [...current.config.segments];\n const currentIndex = dataIndexes[currentDataIndex];\n const targetIndex = dataIndexes[targetDataIndex];\n if (currentIndex === undefined || targetIndex === undefined) return undefined;\n [segments[currentIndex], segments[targetIndex]] = [segments[targetIndex], segments[currentIndex]];\n parsed.segments = segments;\n return {\n nextDocument: `${JSON.stringify(parsed, null, \"\\t\")}\\n`,\n previousDocument,\n };\n}\n\nfunction applySegmentsDocumentChange(\n change: { nextDocument: string; previousDocument: string },\n ctx: ExtensionCommandContext,\n options: StatuslineCommandOptions,\n): LoadedStatuslineSettings {\n const previous = options.getLoaded();\n const save = options.save ?? saveStatuslineSettingsDocument;\n const next = save(options.settingsPath, change.nextDocument);\n try {\n options.apply(next, ctx);\n } catch (applyError) {\n const rollbackError = restoreStatuslineSettings(ctx, options, previous, next);\n if (rollbackError) {\n throw new Error(\n `runtime update failed: ${formatError(applyError)}; rollback failed: ${formatError(rollbackError)}`,\n );\n }\n throw applyError;\n }\n return next;\n}\n\nfunction restoreStatuslineSettings(\n ctx: ExtensionCommandContext,\n options: StatuslineCommandOptions,\n previous: LoadedStatuslineSettings,\n saved: LoadedStatuslineSettings,\n): unknown {\n try {\n if (saved.rawDocument === undefined || saved.fileIdentity === undefined) {\n throw new Error(\"The saved settings document identity is unavailable\");\n }\n removeStatuslineSettingsDocumentIfMatches(options.settingsPath, saved.rawDocument, saved.fileIdentity);\n if (previous.rawDocument === undefined || previous.settingsPath !== options.settingsPath) {\n options.apply(previous, ctx);\n return undefined;\n }\n const restored = (options.save ?? saveStatuslineSettingsDocument)(options.settingsPath, previous.rawDocument);\n options.apply(restored, ctx);\n return undefined;\n } catch (error) {\n return error;\n }\n}\n\nfunction normalizeLineBreaks(segments: readonly ConfigSegmentName[]): ConfigSegmentName[] {\n const normalized: ConfigSegmentName[] = [];\n for (const segment of segments) {\n if (\n segment === LINE_BREAK_SEGMENT_NAME &&\n (normalized.length === 0 || normalized.at(-1) === LINE_BREAK_SEGMENT_NAME)\n ) {\n continue;\n }\n normalized.push(segment);\n }\n if (normalized.at(-1) === LINE_BREAK_SEGMENT_NAME) normalized.pop();\n return normalized;\n}\n\nfunction editableSettings(\n current: LoadedStatuslineSettings,\n action: string,\n): { parsed: Record<string, unknown>; rawDocument: string } {\n const rawDocument =\n current.source === \"user\" && current.rawDocument !== undefined\n ? current.rawDocument\n : current.source === \"built-in\" && current.rawDocument === undefined && current.diagnostics.length === 0\n ? DEFAULT_STATUSLINE_DOCUMENT\n : undefined;\n if (rawDocument === undefined || current.diagnostics.some((item) => item.code !== \"unknown\")) {\n throw new Error(`Fix pi-statusline.json before ${action}`);\n }\n const parsed = JSON.parse(rawDocument) as unknown;\n if (!isRecord(parsed)) throw new Error(\"Settings must contain a JSON object\");\n return { parsed, rawDocument };\n}\n\nfunction showStatus(ctx: ExtensionCommandContext, options: StatuslineCommandOptions) {\n if (!canNotify(ctx)) return;\n const loaded = options.getLoaded();\n const diagnostics = loaded.diagnostics\n .slice(0, 5)\n .map((item) => `${item.path || \"root\"}: ${item.message}`)\n .join(\"; \");\n ctx.ui.notify(\n [\n `pi-statusline source: ${loaded.source}`,\n `active path: ${loaded.settingsPath}`,\n `save target: ${options.settingsPath}`,\n `palette preset: ${loaded.config.palettePreset}`,\n `density: ${loaded.config.density}`,\n `separator: ${loaded.config.separator}`,\n `information: ${inferInformationProfile(loaded.config.segments)}`,\n `segments: ${loaded.config.segments.join(\", \") || \"none\"}`,\n diagnostics ? `warnings: ${diagnostics}` : \"warnings: none\",\n ].join(\"\\n\"),\n loaded.diagnostics.length > 0 ? \"warning\" : \"info\",\n );\n}\n\nfunction showHelp(ctx: ExtensionCommandContext, settingsPath: string) {\n if (!canNotify(ctx)) return;\n ctx.ui.notify(\n [\n \"/statusline \u2014 open Appearance, Information, Advanced, Status, and Help\",\n \"/statusline settings \u2014 edit and apply JSON\",\n \"/statusline status \u2014 show source, path, information level, and warnings\",\n \"/statusline help \u2014 show this help\",\n \"Menu actions: Appearance, Information, Advanced, Status, Help.\",\n \"Information levels: minimal, balanced, detailed; any other segment array is custom.\",\n \"Advanced actions: Custom layout, Edit settings JSON, Back.\",\n `Settings: ${settingsPath}`,\n \"Fields: palettePreset, palette, density, separator, segments, segmentText, extensionStatusIcons\",\n \"Named presets ignore but preserve palette; custom uses its per-segment fg/bg colors.\",\n \"Responsive rows retain context, model, location, and active work before decorative data.\",\n \"Custom layout can show, hide, reorder, or split data segments across rows.\",\n \"Press M for move mode, Alt+Up/Alt+Down for quick move, and B for a line break.\",\n \"Line breaks (line_break) may repeat when separated by data segments, but cannot be consecutive.\",\n \"segmentText supports prefix and suffix strings around Pi-owned dynamic values.\",\n \"segmentText.model also supports truncationLength, truncationSymbol, and truncationDirection (start, middle, end).\",\n ].join(\"\\n\"),\n \"info\",\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isPaletteName(value: PalettePreset): value is PaletteName {\n return (PALETTE_NAMES as readonly PalettePreset[]).includes(value);\n}\n\nfunction canNotify(ctx: ExtensionCommandContext): boolean {\n return ctx.mode === \"tui\" || ctx.hasUI;\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }