@narumitw/pi-statusline 0.49.3 → 0.49.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -7
- package/package.json +4 -8
- package/src/ansi.ts +26 -0
- package/src/command-contract.ts +13 -0
- package/src/commands.ts +925 -0
- package/src/directory.ts +54 -0
- package/src/extension-status.ts +321 -0
- package/src/git-status.ts +148 -0
- package/src/index.ts +1 -1
- package/src/information-profiles.ts +40 -0
- package/src/powerline.ts +170 -0
- package/src/presets/candy.ts +9 -0
- package/src/presets/create-ramp.ts +41 -0
- package/src/presets/custom.ts +11 -0
- package/src/presets/forest.ts +9 -0
- package/src/presets/index.ts +55 -0
- package/src/presets/mono.ts +9 -0
- package/src/presets/neon.ts +9 -0
- package/src/presets/ocean.ts +9 -0
- package/src/presets/sunset.ts +9 -0
- package/src/presets/tokyo-night.ts +13 -0
- package/src/presets/types.ts +12 -0
- package/src/render.ts +357 -0
- package/src/settings.ts +702 -0
- package/src/statusline.ts +376 -0
- package/src/terminal.ts +60 -0
- package/src/types.ts +88 -0
- package/src/usage.ts +53 -0
- package/dist/chunks/chunk-6BDIM4OT.ts +0 -776
- package/dist/chunks/chunk-6BDIM4OT.ts.map +0 -7
- package/dist/chunks/commands-FUT5RTFK.ts +0 -774
- package/dist/chunks/commands-FUT5RTFK.ts.map +0 -7
- package/dist/statusline.ts +0 -1144
- package/dist/statusline.ts.map +0 -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} from \"@earendil-works/pi-coding-agent\";\nimport {\n\tContainer,\n\tKey,\n\tmatchesKey,\n\ttype SelectItem,\n\tSelectList,\n\tText,\n\ttruncateToWidth,\n\twrapTextWithAnsi,\n} from \"@earendil-works/pi-tui\";\nimport { completeStatuslineArguments } from \"./command-contract.js\";\nimport {\n\tINFORMATION_PROFILE_NAMES,\n\tINFORMATION_PROFILES,\n\ttype InformationProfileName,\n\tinferInformationProfile,\n} from \"./information-profiles.js\";\nimport { segmentPaletteForPreset } from \"./presets/index.js\";\nimport {\n\tDEFAULT_STATUSLINE_DOCUMENT,\n\ttype LoadedStatuslineSettings,\n\tremoveStatuslineSettingsDocumentIfMatches,\n\tsaveStatuslineSettingsDocument,\n} from \"./settings.js\";\nimport {\n\ttype ConfigSegmentName,\n\tLINE_BREAK_SEGMENT_NAME,\n\tPALETTE_NAMES,\n\tPALETTE_PRESET_NAMES,\n\ttype PaletteName,\n\ttype PalettePreset,\n\tSEGMENT_NAMES,\n\ttype SegmentName,\n} from \"./types.js\";\n\nconst EDIT_SETTINGS_LABEL = \"Edit settings JSON\";\nconst SEGMENT_VIEWPORT_SIZE = 6;\nconst NARROW_SEGMENT_VIEWPORT_SIZE = 3;\nconst SEGMENT_DESCRIPTIONS: Record<SegmentName, string> = {\n\tbrand: \"Pi brand mark\",\n\tprovider: \"Current model provider\",\n\tmodel: \"Current model name\",\n\tthinking: \"Current thinking level\",\n\tcwd: \"Current working directory\",\n\tbranch: \"Git branch, status, and linked pull request\",\n\ttools: \"Current tool and streaming activity\",\n\tcontext: \"Current context-window usage\",\n\ttokens: \"Session token totals\",\n\tcache: \"Prompt-cache reads, writes, and latest hit rate\",\n\tcost: \"Session cost\",\n\ttime: \"Current local time\",\n\tturn: \"Current session turn count\",\n};\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?(): { signal: AbortSignal; isCurrent(): boolean };\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);\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) {\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);\n\t} finally {\n\t\toptions.preview?.(undefined, ctx);\n\t}\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): Promise<PalettePreset | undefined> {\n\tconst items: SelectItem[] = PALETTE_PRESET_NAMES.map((palettePreset) => ({\n\t\tvalue: palettePreset,\n\t\tlabel: palettePreset,\n\t\tdescription:\n\t\t\t[\n\t\t\t\tpalettePreset === current ? \"current\" : undefined,\n\t\t\t\tpalettePreset === \"custom\" ? \"per-segment colors from settings JSON\" : undefined,\n\t\t\t]\n\t\t\t\t.filter((part): part is string => part !== undefined)\n\t\t\t\t.join(\" \u2022 \") || undefined,\n\t}));\n\tconst selectedIndex = PALETTE_PRESET_NAMES.indexOf(current);\n\tconst result = await ctx.ui.custom<PalettePreset | null>((tui, theme, _keybindings, done) => {\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\tconst list = new SelectList(items, Math.min(items.length, 10), {\n\t\t\tselectedPrefix: (text) => theme.fg(\"accent\", text),\n\t\t\tselectedText: (text) => theme.fg(\"accent\", text),\n\t\t\tdescription: (text) => theme.fg(\"muted\", text),\n\t\t\tscrollInfo: (text) => theme.fg(\"dim\", text),\n\t\t\tnoMatch: (text) => theme.fg(\"warning\", text),\n\t\t});\n\t\tlist.setSelectedIndex(selectedIndex);\n\t\tlist.onSelectionChange = (item) => {\n\t\t\toptions.preview?.(item.value as PalettePreset, ctx);\n\t\t};\n\t\tlist.onSelect = (item) => done(item.value as PalettePreset);\n\t\tlist.onCancel = () => done(null);\n\t\tcontainer.addChild(list);\n\t\tconst hint = new Text(\"\", 1, 0);\n\t\tcontainer.addChild(hint);\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(`Palette preset (current: ${current})`)));\n\t\t\thint.setText(theme.fg(\"dim\", \"\u2191\u2193 preview \u2022 enter apply \u2022 esc cancel\"));\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\tlist.handleInput(data);\n\t\t\t\ttui.requestRender();\n\t\t\t},\n\t\t};\n\t});\n\treturn result ?? undefined;\n}\n\nfunction applyInformationProfile(\n\tctx: ExtensionCommandContext,\n\toptions: StatuslineCommandOptions,\n\tselection: InformationProfileName,\n) {\n\tconst current = options.getLoaded();\n\ttry {\n\t\tconst change = informationProfileDocument(current, selection);\n\t\tconst loaded = applySegmentsDocumentChange(change, ctx, options);\n\t\tctx.ui.notify(\n\t\t\t`Information level applied: ${inferInformationProfile(loaded.config.segments)}.`,\n\t\t\t\"info\",\n\t\t);\n\t} catch (error) {\n\t\tctx.ui.notify(`Information level was not saved: ${formatError(error)}`, \"error\");\n\t}\n}\n\nasync function chooseSegments(ctx: ExtensionCommandContext, options: StatuslineCommandOptions) {\n\tif (ctx.mode !== \"tui\") {\n\t\tif (ctx.hasUI) ctx.ui.notify(`Edit segments manually: ${options.settingsPath}`, \"info\");\n\t\treturn;\n\t}\n\tlet current = options.getLoaded();\n\tlet names = segmentMenuOrder(current);\n\tlet selectedIndex = 0;\n\tlet moveMode = false;\n\tlet feedback: string | undefined;\n\n\tawait ctx.ui.custom((tui, theme, keybindings, done) => {\n\t\tconst commit = (\n\t\t\tname: SegmentName,\n\t\t\tchange: { nextDocument: string; previousDocument: string },\n\t\t): boolean => {\n\t\t\ttry {\n\t\t\t\tcurrent = applySegmentsDocumentChange(change, ctx, options);\n\t\t\t\tnames = segmentMenuOrder(current);\n\t\t\t\tselectedIndex = Math.max(0, names.indexOf(name));\n\t\t\t\tfeedback = undefined;\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tctx.ui.notify(`Statusline segments were not saved: ${formatError(error)}`, \"error\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t};\n\n\t\tconst toggleSelected = () => {\n\t\t\tconst name = names[selectedIndex];\n\t\t\tif (!name) return;\n\t\t\tmoveMode = false;\n\t\t\tcommit(name, segmentsDocument(current, name, !current.config.segments.includes(name)));\n\t\t};\n\n\t\tconst toggleLineBreakAfterSelected = () => {\n\t\t\tconst name = names[selectedIndex];\n\t\t\tif (!name) return;\n\t\t\tmoveMode = false;\n\t\t\tconst segmentIndex = current.config.segments.indexOf(name);\n\t\t\tif (segmentIndex < 0) {\n\t\t\t\tfeedback = `Show ${name} before adding a line break.`;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst hasLineBreak = current.config.segments[segmentIndex + 1] === LINE_BREAK_SEGMENT_NAME;\n\t\t\tconst hasFollowingSegment = current.config.segments\n\t\t\t\t.slice(segmentIndex + 1)\n\t\t\t\t.some((segment) => segment !== LINE_BREAK_SEGMENT_NAME);\n\t\t\tif (!hasLineBreak && !hasFollowingSegment) {\n\t\t\t\tfeedback = `Add another visible segment after ${name} before adding a line break.`;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcommit(name, lineBreakAfterDocument(current, name));\n\t\t};\n\n\t\tconst reorderSelected = (direction: -1 | 1) => {\n\t\t\tconst name = names[selectedIndex];\n\t\t\tif (!name) return;\n\t\t\tconst visibleNames = visibleSegmentNames(current);\n\t\t\tconst currentIndex = visibleNames.indexOf(name);\n\t\t\tif (currentIndex < 0) {\n\t\t\t\tfeedback = `Show ${name} before moving it.`;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst targetIndex = currentIndex + direction;\n\t\t\tif (targetIndex < 0 || targetIndex >= visibleNames.length) {\n\t\t\t\tfeedback = `${name} is already the ${direction < 0 ? \"first\" : \"last\"} visible segment.`;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst change = reorderedSegmentsDocument(current, name, direction);\n\t\t\tif (change) commit(name, change);\n\t\t};\n\n\t\tconst enterMoveMode = () => {\n\t\t\tconst name = names[selectedIndex];\n\t\t\tif (!name) return;\n\t\t\tif (!current.config.segments.includes(name)) {\n\t\t\t\tfeedback = `Show ${name} before moving it.`;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tmoveMode = true;\n\t\t\tfeedback = undefined;\n\t\t};\n\n\t\tconst moveSelection = (offset: number) => {\n\t\t\tselectedIndex = Math.max(0, Math.min(names.length - 1, selectedIndex + offset));\n\t\t\tfeedback = undefined;\n\t\t};\n\n\t\tconst renderList = (width: number): string[] => {\n\t\t\tconst safeWidth = Math.max(1, width);\n\t\t\tconst visibleNames = visibleSegmentNames(current);\n\t\t\tconst visible = new Set(visibleNames);\n\t\t\tconst placements = segmentPlacements(current.config.segments);\n\t\t\tconst viewportSize = safeWidth < 30 ? NARROW_SEGMENT_VIEWPORT_SIZE : SEGMENT_VIEWPORT_SIZE;\n\t\t\tconst startIndex = Math.max(\n\t\t\t\t0,\n\t\t\t\tMath.min(\n\t\t\t\t\tselectedIndex - Math.floor(viewportSize / 2),\n\t\t\t\t\tMath.max(0, names.length - viewportSize),\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst endIndex = Math.min(names.length, startIndex + viewportSize);\n\t\t\tconst lines: string[] = [];\n\t\t\tlet previousSection: \"visible\" | \"hidden\" | undefined;\n\t\t\tfor (let index = startIndex; index < endIndex; index += 1) {\n\t\t\t\tconst name = names[index];\n\t\t\t\tif (!name) continue;\n\t\t\t\tconst section = visible.has(name) ? \"visible\" : \"hidden\";\n\t\t\t\tif (section !== previousSection) {\n\t\t\t\t\tconst heading =\n\t\t\t\t\t\tsection === \"visible\" ? \"Visible \u2014 render order\" : \"Hidden \u2014 not rendered\";\n\t\t\t\t\tlines.push(theme.fg(\"muted\", theme.bold(truncateToWidth(` ${heading}`, safeWidth))));\n\t\t\t\t\tpreviousSection = section;\n\t\t\t\t}\n\t\t\t\tconst isSelected = index === selectedIndex;\n\t\t\t\tconst prefix = isSelected ? \"\u2192 \" : \" \";\n\t\t\t\tconst placement = placements.get(name);\n\t\t\t\tconst lineBreakLabel = hasLineBreakAfter(current.config.segments, name)\n\t\t\t\t\t? \" \u00B7 break after\"\n\t\t\t\t\t: \"\";\n\t\t\t\tconst row = placement\n\t\t\t\t\t? `${prefix}${`${placement.order}.`.padStart(3)} row ${placement.row} \u00B7 ${name.padEnd(8)} \u00B7 visible${lineBreakLabel}`\n\t\t\t\t\t: `${prefix} \u00B7 ${name.padEnd(8)} \u00B7 hidden`;\n\t\t\t\tconst truncated = truncateToWidth(row, safeWidth);\n\t\t\t\tif (isSelected) lines.push(theme.fg(\"accent\", truncated));\n\t\t\t\telse lines.push(section === \"visible\" ? truncated : theme.fg(\"muted\", truncated));\n\t\t\t}\n\t\t\tif (startIndex > 0 || endIndex < names.length) {\n\t\t\t\tlines.push(\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\ttruncateToWidth(` (${startIndex + 1}-${endIndex}/${names.length})`, safeWidth),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst selected = names[selectedIndex];\n\t\t\tif (selected) {\n\t\t\t\tlines.push(\"\");\n\t\t\t\tconst detail = feedback ?? SEGMENT_DESCRIPTIONS[selected];\n\t\t\t\tconst color = feedback ? \"warning\" : \"muted\";\n\t\t\t\tfor (const line of wrapTextWithAnsi(detail, Math.max(1, safeWidth - 2))) {\n\t\t\t\t\tlines.push(theme.fg(color, truncateToWidth(` ${line}`, safeWidth)));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlines.push(\"\");\n\t\t\tconst hints = segmentControlHints(safeWidth, moveMode, selected);\n\t\t\tfor (const hint of hints) {\n\t\t\t\tlines.push(theme.fg(\"dim\", truncateToWidth(` ${hint}`, safeWidth)));\n\t\t\t}\n\t\t\treturn lines;\n\t\t};\n\n\t\tconst container = new Container();\n\t\tcontainer.addChild(new DynamicBorder((text: string) => theme.fg(\"accent\", text)));\n\t\tconst title = new Text(\"\", 1, 0);\n\t\tcontainer.addChild(title);\n\t\tcontainer.addChild({ render: renderList, invalidate() {} });\n\t\tcontainer.addChild(new DynamicBorder((text: string) => theme.fg(\"accent\", text)));\n\t\tconst updateThemedText = () => {\n\t\t\ttitle.setText(theme.fg(\"accent\", theme.bold(\"Statusline segments\")));\n\t\t};\n\t\tupdateThemedText();\n\n\t\treturn {\n\t\t\trender: (width: number) => container.render(width),\n\t\t\tinvalidate() {\n\t\t\t\tcontainer.invalidate();\n\t\t\t\tupdateThemedText();\n\t\t\t},\n\t\t\thandleInput(data: string) {\n\t\t\t\tconst moveModeKey = matchesKey(data, \"m\") || matchesKey(data, Key.shift(\"m\"));\n\t\t\t\tconst lineBreakKey = matchesKey(data, \"b\") || matchesKey(data, Key.shift(\"b\"));\n\t\t\t\tif (matchesKey(data, Key.alt(\"up\"))) {\n\t\t\t\t\treorderSelected(-1);\n\t\t\t\t} else if (matchesKey(data, Key.alt(\"down\"))) {\n\t\t\t\t\treorderSelected(1);\n\t\t\t\t} else if (moveMode) {\n\t\t\t\t\tif (keybindings.matches(data, \"tui.select.up\")) {\n\t\t\t\t\t\treorderSelected(-1);\n\t\t\t\t\t} else if (keybindings.matches(data, \"tui.select.down\")) {\n\t\t\t\t\t\treorderSelected(1);\n\t\t\t\t\t} else if (\n\t\t\t\t\t\tmoveModeKey ||\n\t\t\t\t\t\tkeybindings.matches(data, \"tui.select.confirm\") ||\n\t\t\t\t\t\tdata === \" \" ||\n\t\t\t\t\t\tkeybindings.matches(data, \"tui.select.cancel\")\n\t\t\t\t\t) {\n\t\t\t\t\t\tmoveMode = false;\n\t\t\t\t\t\tfeedback = undefined;\n\t\t\t\t\t}\n\t\t\t\t} else if (keybindings.matches(data, \"tui.select.up\")) {\n\t\t\t\t\tselectedIndex = selectedIndex === 0 ? names.length - 1 : selectedIndex - 1;\n\t\t\t\t\tfeedback = undefined;\n\t\t\t\t} else if (keybindings.matches(data, \"tui.select.down\")) {\n\t\t\t\t\tselectedIndex = selectedIndex === names.length - 1 ? 0 : selectedIndex + 1;\n\t\t\t\t\tfeedback = undefined;\n\t\t\t\t} else if (keybindings.matches(data, \"tui.select.pageUp\")) {\n\t\t\t\t\tmoveSelection(-SEGMENT_VIEWPORT_SIZE);\n\t\t\t\t} else if (keybindings.matches(data, \"tui.select.pageDown\")) {\n\t\t\t\t\tmoveSelection(SEGMENT_VIEWPORT_SIZE);\n\t\t\t\t} else if (moveModeKey) {\n\t\t\t\t\tenterMoveMode();\n\t\t\t\t} else if (lineBreakKey) {\n\t\t\t\t\ttoggleLineBreakAfterSelected();\n\t\t\t\t} else if (keybindings.matches(data, \"tui.select.confirm\") || data === \" \") {\n\t\t\t\t\ttoggleSelected();\n\t\t\t\t} else if (keybindings.matches(data, \"tui.select.cancel\")) {\n\t\t\t\t\tdone(undefined);\n\t\t\t\t}\n\t\t\t\ttui.requestRender();\n\t\t\t},\n\t\t};\n\t});\n}\n\nasync function editSettings(ctx: ExtensionCommandContext, options: StatuslineCommandOptions) {\n\tif (ctx.mode !== \"tui\") {\n\t\tif (ctx.hasUI) ctx.ui.notify(`Edit settings manually: ${options.settingsPath}`, \"info\");\n\t\treturn;\n\t}\n\tconst current = options.getLoaded();\n\tconst edited = await ctx.ui.editor(\n\t\t\"pi-statusline.json \u2014 save and close to apply\",\n\t\tcurrent.rawDocument ?? DEFAULT_STATUSLINE_DOCUMENT,\n\t);\n\tif (edited === undefined) return;\n\tlet loaded: LoadedStatuslineSettings;\n\ttry {\n\t\tloaded = (options.save ?? saveStatuslineSettingsDocument)(options.settingsPath, edited);\n\t} catch (error) {\n\t\tctx.ui.notify(`pi-statusline settings were not saved: ${formatError(error)}`, \"error\");\n\t\treturn;\n\t}\n\ttry {\n\t\toptions.apply(loaded, ctx);\n\t} catch (error) {\n\t\tconst rollbackError = restoreStatuslineSettings(ctx, options, current, loaded);\n\t\tctx.ui.notify(\n\t\t\trollbackError\n\t\t\t\t? `pi-statusline settings could not be applied: ${formatError(error)}; rollback failed: ${formatError(rollbackError)}`\n\t\t\t\t: `pi-statusline settings could not be applied: ${formatError(error)}; previous settings restored.`,\n\t\t\t\"error\",\n\t\t);\n\t\treturn;\n\t}\n\tconst suffix =\n\t\tloaded.diagnostics.length > 0\n\t\t\t? ` (${loaded.diagnostics.length} warning${loaded.diagnostics.length === 1 ? \"\" : \"s\"})`\n\t\t\t: \"\";\n\tctx.ui.notify(`pi-statusline settings saved and applied${suffix}.`, \"info\");\n}\n\nfunction palettePresetDocument(\n\tcurrent: LoadedStatuslineSettings,\n\tpalettePreset: PalettePreset,\n): string {\n\tconst { parsed } = editableSettings(current, \"choosing a palette preset\");\n\tif (palettePreset === \"custom\" && !isRecord(parsed.palette)) {\n\t\tconst seedPreset = isPaletteName(current.config.palettePreset)\n\t\t\t? current.config.palettePreset\n\t\t\t: \"tokyo-night\";\n\t\tparsed.palette = segmentPaletteForPreset(seedPreset);\n\t} else if (palettePreset !== \"custom\" && typeof parsed.palette === \"string\") {\n\t\tdelete parsed.palette;\n\t}\n\tparsed.palettePreset = palettePreset;\n\treturn `${JSON.stringify(parsed, null, \"\\t\")}\\n`;\n}\n\nfunction informationProfileDocument(\n\tcurrent: LoadedStatuslineSettings,\n\tprofile: InformationProfileName,\n): { nextDocument: string; previousDocument: string } {\n\tconst { parsed, rawDocument: previousDocument } = editableSettings(\n\t\tcurrent,\n\t\t\"changing information level\",\n\t);\n\tparsed.segments = [...INFORMATION_PROFILES[profile]];\n\treturn {\n\t\tnextDocument: `${JSON.stringify(parsed, null, \"\\t\")}\\n`,\n\t\tpreviousDocument,\n\t};\n}\n\nfunction visibleSegmentNames(current: LoadedStatuslineSettings): SegmentName[] {\n\treturn current.config.segments.filter(\n\t\t(segment): segment is SegmentName => segment !== LINE_BREAK_SEGMENT_NAME,\n\t);\n}\n\nfunction segmentMenuOrder(current: LoadedStatuslineSettings): SegmentName[] {\n\tconst visible = visibleSegmentNames(current);\n\tconst visibleSet = new Set(visible);\n\treturn [...visible, ...SEGMENT_NAMES.filter((name) => !visibleSet.has(name))];\n}\n\nfunction hasLineBreakAfter(segments: readonly ConfigSegmentName[], name: SegmentName): boolean {\n\tconst index = segments.indexOf(name);\n\treturn index >= 0 && segments[index + 1] === LINE_BREAK_SEGMENT_NAME;\n}\n\nfunction segmentPlacements(\n\tsegments: readonly ConfigSegmentName[],\n): Map<SegmentName, { order: number; row: number }> {\n\tconst placements = new Map<SegmentName, { order: number; row: number }>();\n\tlet order = 0;\n\tlet row = 1;\n\tfor (const segment of segments) {\n\t\tif (segment === LINE_BREAK_SEGMENT_NAME) {\n\t\t\trow += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tplacements.set(segment, { order: ++order, row });\n\t}\n\treturn placements;\n}\n\nfunction segmentControlHints(\n\twidth: number,\n\tmoveMode: boolean,\n\tselected: SegmentName | undefined,\n): string[] {\n\tif (moveMode) {\n\t\treturn width < 30\n\t\t\t? [\n\t\t\t\t\t`Move mode: ${selected ?? \"segment\"}`,\n\t\t\t\t\t\"\u2191\u2193 move segment\",\n\t\t\t\t\t\"Enter/Space finish\",\n\t\t\t\t\t\"Esc leave move mode\",\n\t\t\t\t]\n\t\t\t: [\n\t\t\t\t\t`Move mode \u2014 ${selected ?? \"segment\"}`,\n\t\t\t\t\t\"\u2191\u2193 move \u00B7 Enter/Space finish \u00B7 Esc leave move mode\",\n\t\t\t\t];\n\t}\n\treturn width < 30\n\t\t? [\n\t\t\t\t\"\u2191\u2193 navigate\",\n\t\t\t\t\"Enter/Space toggle\",\n\t\t\t\t\"M move \u00B7 B line break\",\n\t\t\t\t\"Alt+\u2191/\u2193 quick move\",\n\t\t\t\t\"Esc close\",\n\t\t\t]\n\t\t: [\n\t\t\t\t\"\u2191\u2193 navigate \u00B7 Enter/Space show/hide \u00B7 M move mode\",\n\t\t\t\t\"B add/remove line break after \u00B7 Alt+\u2191/\u2193 quick move \u00B7 Esc close\",\n\t\t\t];\n}\n\nfunction segmentsDocument(\n\tcurrent: LoadedStatuslineSettings,\n\tname: SegmentName,\n\tshouldShow: boolean,\n): { nextDocument: string; previousDocument: string } {\n\tconst { parsed, rawDocument: previousDocument } = editableSettings(current, \"changing segments\");\n\tconst segments = shouldShow\n\t\t? [...current.config.segments, ...(current.config.segments.includes(name) ? [] : [name])]\n\t\t: current.config.segments.filter((segment) => segment !== name);\n\tparsed.segments = normalizeLineBreaks(segments);\n\treturn {\n\t\tnextDocument: `${JSON.stringify(parsed, null, \"\\t\")}\\n`,\n\t\tpreviousDocument,\n\t};\n}\n\nfunction lineBreakAfterDocument(\n\tcurrent: LoadedStatuslineSettings,\n\tname: SegmentName,\n): { nextDocument: string; previousDocument: string } {\n\tconst { parsed, rawDocument: previousDocument } = editableSettings(\n\t\tcurrent,\n\t\t\"changing line breaks\",\n\t);\n\tconst segments = [...current.config.segments];\n\tconst segmentIndex = segments.indexOf(name);\n\tif (segments[segmentIndex + 1] === LINE_BREAK_SEGMENT_NAME) {\n\t\tsegments.splice(segmentIndex + 1, 1);\n\t} else {\n\t\tsegments.splice(segmentIndex + 1, 0, LINE_BREAK_SEGMENT_NAME);\n\t}\n\tparsed.segments = segments;\n\treturn {\n\t\tnextDocument: `${JSON.stringify(parsed, null, \"\\t\")}\\n`,\n\t\tpreviousDocument,\n\t};\n}\n\nfunction reorderedSegmentsDocument(\n\tcurrent: LoadedStatuslineSettings,\n\tname: SegmentName,\n\tdirection: -1 | 1,\n): { nextDocument: string; previousDocument: string } | undefined {\n\tconst dataIndexes = current.config.segments.flatMap((segment, index) =>\n\t\tsegment === LINE_BREAK_SEGMENT_NAME ? [] : [index],\n\t);\n\tconst currentDataIndex = dataIndexes.findIndex(\n\t\t(index) => current.config.segments[index] === name,\n\t);\n\tconst targetDataIndex = currentDataIndex + direction;\n\tif (currentDataIndex < 0 || targetDataIndex < 0 || targetDataIndex >= dataIndexes.length) {\n\t\treturn undefined;\n\t}\n\tconst { parsed, rawDocument: previousDocument } = editableSettings(\n\t\tcurrent,\n\t\t\"reordering segments\",\n\t);\n\tconst segments = [...current.config.segments];\n\tconst currentIndex = dataIndexes[currentDataIndex];\n\tconst targetIndex = dataIndexes[targetDataIndex];\n\tif (currentIndex === undefined || targetIndex === undefined) return undefined;\n\t[segments[currentIndex], segments[targetIndex]] = [segments[targetIndex], segments[currentIndex]];\n\tparsed.segments = segments;\n\treturn {\n\t\tnextDocument: `${JSON.stringify(parsed, null, \"\\t\")}\\n`,\n\t\tpreviousDocument,\n\t};\n}\n\nfunction applySegmentsDocumentChange(\n\tchange: { nextDocument: string; previousDocument: string },\n\tctx: ExtensionCommandContext,\n\toptions: StatuslineCommandOptions,\n): LoadedStatuslineSettings {\n\tconst previous = options.getLoaded();\n\tconst save = options.save ?? saveStatuslineSettingsDocument;\n\tconst next = save(options.settingsPath, change.nextDocument);\n\ttry {\n\t\toptions.apply(next, ctx);\n\t} catch (applyError) {\n\t\tconst rollbackError = restoreStatuslineSettings(ctx, options, previous, next);\n\t\tif (rollbackError) {\n\t\t\tthrow new Error(\n\t\t\t\t`runtime update failed: ${formatError(applyError)}; rollback failed: ${formatError(rollbackError)}`,\n\t\t\t);\n\t\t}\n\t\tthrow applyError;\n\t}\n\treturn next;\n}\n\nfunction restoreStatuslineSettings(\n\tctx: ExtensionCommandContext,\n\toptions: StatuslineCommandOptions,\n\tprevious: LoadedStatuslineSettings,\n\tsaved: LoadedStatuslineSettings,\n): unknown {\n\ttry {\n\t\tif (saved.rawDocument === undefined || saved.fileIdentity === undefined) {\n\t\t\tthrow new Error(\"The saved settings document identity is unavailable\");\n\t\t}\n\t\tremoveStatuslineSettingsDocumentIfMatches(\n\t\t\toptions.settingsPath,\n\t\t\tsaved.rawDocument,\n\t\t\tsaved.fileIdentity,\n\t\t);\n\t\tif (previous.rawDocument === undefined || previous.settingsPath !== options.settingsPath) {\n\t\t\toptions.apply(previous, ctx);\n\t\t\treturn undefined;\n\t\t}\n\t\tconst restored = (options.save ?? saveStatuslineSettingsDocument)(\n\t\t\toptions.settingsPath,\n\t\t\tprevious.rawDocument,\n\t\t);\n\t\toptions.apply(restored, ctx);\n\t\treturn undefined;\n\t} catch (error) {\n\t\treturn error;\n\t}\n}\n\nfunction normalizeLineBreaks(segments: readonly ConfigSegmentName[]): ConfigSegmentName[] {\n\tconst normalized: ConfigSegmentName[] = [];\n\tfor (const segment of segments) {\n\t\tif (\n\t\t\tsegment === LINE_BREAK_SEGMENT_NAME &&\n\t\t\t(normalized.length === 0 || normalized.at(-1) === LINE_BREAK_SEGMENT_NAME)\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\t\tnormalized.push(segment);\n\t}\n\tif (normalized.at(-1) === LINE_BREAK_SEGMENT_NAME) normalized.pop();\n\treturn normalized;\n}\n\nfunction editableSettings(\n\tcurrent: LoadedStatuslineSettings,\n\taction: string,\n): { parsed: Record<string, unknown>; rawDocument: string } {\n\tconst rawDocument =\n\t\tcurrent.source === \"user\" && current.rawDocument !== undefined\n\t\t\t? current.rawDocument\n\t\t\t: current.source === \"built-in\" &&\n\t\t\t\t\tcurrent.rawDocument === undefined &&\n\t\t\t\t\tcurrent.diagnostics.length === 0\n\t\t\t\t? DEFAULT_STATUSLINE_DOCUMENT\n\t\t\t\t: undefined;\n\tif (rawDocument === undefined || current.diagnostics.some((item) => item.code !== \"unknown\")) {\n\t\tthrow new Error(`Fix pi-statusline.json before ${action}`);\n\t}\n\tconst parsed = JSON.parse(rawDocument) as unknown;\n\tif (!isRecord(parsed)) throw new Error(\"Settings must contain a JSON object\");\n\treturn { parsed, rawDocument };\n}\n\nfunction showStatus(ctx: ExtensionCommandContext, options: StatuslineCommandOptions) {\n\tif (!canNotify(ctx)) return;\n\tconst loaded = options.getLoaded();\n\tconst diagnostics = loaded.diagnostics\n\t\t.slice(0, 5)\n\t\t.map((item) => `${item.path || \"root\"}: ${item.message}`)\n\t\t.join(\"; \");\n\tctx.ui.notify(\n\t\t[\n\t\t\t`pi-statusline source: ${loaded.source}`,\n\t\t\t`active path: ${loaded.settingsPath}`,\n\t\t\t`save target: ${options.settingsPath}`,\n\t\t\t`palette preset: ${loaded.config.palettePreset}`,\n\t\t\t`density: ${loaded.config.density}`,\n\t\t\t`separator: ${loaded.config.separator}`,\n\t\t\t`information: ${inferInformationProfile(loaded.config.segments)}`,\n\t\t\t`segments: ${loaded.config.segments.join(\", \") || \"none\"}`,\n\t\t\tdiagnostics ? `warnings: ${diagnostics}` : \"warnings: none\",\n\t\t].join(\"\\n\"),\n\t\tloaded.diagnostics.length > 0 ? \"warning\" : \"info\",\n\t);\n}\n\nfunction showHelp(ctx: ExtensionCommandContext, settingsPath: string) {\n\tif (!canNotify(ctx)) return;\n\tctx.ui.notify(\n\t\t[\n\t\t\t\"/statusline \u2014 open Appearance, Information, Advanced, Status, and Help\",\n\t\t\t\"/statusline settings \u2014 edit and apply JSON\",\n\t\t\t\"/statusline status \u2014 show source, path, information level, and warnings\",\n\t\t\t\"/statusline help \u2014 show this help\",\n\t\t\t\"Menu actions: Appearance, Information, Advanced, Status, Help.\",\n\t\t\t\"Information levels: minimal, balanced, detailed; any other segment array is custom.\",\n\t\t\t\"Advanced actions: Custom layout, Edit settings JSON, Back.\",\n\t\t\t`Settings: ${settingsPath}`,\n\t\t\t\"Fields: palettePreset, palette, density, separator, segments, segmentText, extensionStatusIcons\",\n\t\t\t\"Named presets ignore but preserve palette; custom uses its per-segment fg/bg colors.\",\n\t\t\t\"Responsive rows retain context, model, location, and active work before decorative data.\",\n\t\t\t\"Custom layout can show, hide, reorder, or split data segments across rows.\",\n\t\t\t\"Press M for move mode, Alt+Up/Alt+Down for quick move, and B for a line break.\",\n\t\t\t\"Line breaks (line_break) may repeat when separated by data segments, but cannot be consecutive.\",\n\t\t\t\"segmentText supports prefix and suffix strings around Pi-owned dynamic values.\",\n\t\t\t\"segmentText.model also supports truncationLength, truncationSymbol, and truncationDirection (start, middle, end).\",\n\t\t].join(\"\\n\"),\n\t\t\"info\",\n\t);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isPaletteName(value: PalettePreset): value is PaletteName {\n\treturn (PALETTE_NAMES as readonly PalettePreset[]).includes(value);\n}\n\nfunction canNotify(ctx: ExtensionCommandContext): boolean {\n\treturn ctx.mode === \"tui\" || ctx.hasUI;\n}\n\nfunction formatError(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|