@narumitw/pi-statusline 0.50.0 → 0.50.2
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 +29 -209
- package/dist/chunks/{chunk-74QZGJ7L.js → chunk-LARLXEUL.ts} +18 -97
- package/dist/chunks/chunk-LARLXEUL.ts.map +7 -0
- package/dist/chunks/{commands-C2G2G7C6.js → commands-KDWSOSZZ.ts} +14 -58
- package/dist/chunks/commands-KDWSOSZZ.ts.map +7 -0
- package/dist/index.ts +21 -76
- package/dist/index.ts.map +2 -2
- package/docs/configuration.md +194 -0
- package/package.json +51 -51
- package/src/ansi.ts +18 -24
- package/src/command-contract.ts +6 -6
- package/src/commands.ts +759 -818
- package/src/directory.ts +27 -31
- package/src/extension-status.ts +186 -219
- package/src/git-status.ts +103 -111
- package/src/information-profiles.ts +12 -31
- package/src/powerline.ts +120 -127
- package/src/presets/candy.ts +1 -7
- package/src/presets/create-ramp.ts +21 -23
- package/src/presets/custom.ts +7 -7
- package/src/presets/forest.ts +1 -7
- package/src/presets/index.ts +30 -32
- package/src/presets/mono.ts +1 -7
- package/src/presets/neon.ts +1 -7
- package/src/presets/ocean.ts +1 -7
- package/src/presets/sunset.ts +1 -7
- package/src/presets/tokyo-night.ts +9 -9
- package/src/presets/types.ts +5 -5
- package/src/render.ts +277 -306
- package/src/settings.ts +516 -568
- package/src/statusline.ts +347 -372
- package/src/types.ts +34 -42
- package/src/usage.ts +40 -40
- package/dist/chunks/chunk-74QZGJ7L.js.map +0 -7
- package/dist/chunks/commands-C2G2G7C6.js.map +0 -7
|
@@ -13,20 +13,13 @@ import {
|
|
|
13
13
|
removeStatuslineSettingsDocumentIfMatches,
|
|
14
14
|
saveStatuslineSettingsDocument,
|
|
15
15
|
segmentPaletteForPreset
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-LARLXEUL.ts";
|
|
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-
|
|
730
|
+
//# sourceMappingURL=commands-KDWSOSZZ.ts.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
|
+
}
|
package/dist/index.ts
CHANGED
|
@@ -9,13 +9,11 @@ import {
|
|
|
9
9
|
loadStatuslineSettingsForAgent,
|
|
10
10
|
resolvePreset,
|
|
11
11
|
settingsFilePath
|
|
12
|
-
} from "./chunks/chunk-
|
|
12
|
+
} from "./chunks/chunk-LARLXEUL.ts";
|
|
13
13
|
|
|
14
14
|
// src/statusline.ts
|
|
15
15
|
import { homedir } from "node:os";
|
|
16
|
-
import {
|
|
17
|
-
getAgentDir as getAgentDir2
|
|
18
|
-
} from "@earendil-works/pi-coding-agent";
|
|
16
|
+
import { getAgentDir as getAgentDir2 } from "@earendil-works/pi-coding-agent";
|
|
19
17
|
import { getCapabilities } from "@earendil-works/pi-tui";
|
|
20
18
|
|
|
21
19
|
// src/extension-status.ts
|
|
@@ -175,11 +173,7 @@ function formatExtensionStatuses(statuses, theme, config, runtime, hiddenKeys =
|
|
|
175
173
|
const separator = extensionStatusSeparator(config, theme, trueColor);
|
|
176
174
|
const visibleStatuses = [
|
|
177
175
|
...formatDuplicateExtensionStatus(runtime, theme),
|
|
178
|
-
...[...statuses.entries()].filter(
|
|
179
|
-
([key, value]) => key !== STATUSLINE_KEY && !hiddenKeys.has(key) && value.trim().length > 0
|
|
180
|
-
).map(
|
|
181
|
-
([key, value]) => formatExtensionStatus(key, value, theme, config, runtime.extensionStatusIconAliases)
|
|
182
|
-
)
|
|
176
|
+
...[...statuses.entries()].filter(([key, value]) => key !== STATUSLINE_KEY && !hiddenKeys.has(key) && value.trim().length > 0).map(([key, value]) => formatExtensionStatus(key, value, theme, config, runtime.extensionStatusIconAliases))
|
|
183
177
|
].slice(0, 5);
|
|
184
178
|
return visibleStatuses.join(separator);
|
|
185
179
|
}
|
|
@@ -188,12 +182,7 @@ function formatExtensionStatus(key, value, theme, config, extensionStatusIconAli
|
|
|
188
182
|
const text = simplifyExtensionStatusText(status.text);
|
|
189
183
|
const color = extensionColor(key, value);
|
|
190
184
|
const textColor = color === "warning" ? "warning" : "muted";
|
|
191
|
-
const icon = extensionStatusIcon(
|
|
192
|
-
key,
|
|
193
|
-
status.icon,
|
|
194
|
-
config.extensionStatusIcons,
|
|
195
|
-
extensionStatusIconAliases
|
|
196
|
-
);
|
|
185
|
+
const icon = extensionStatusIcon(key, status.icon, config.extensionStatusIcons, extensionStatusIconAliases);
|
|
197
186
|
const renderedText = theme.fg(textColor, text);
|
|
198
187
|
return icon ? `${theme.fg(color, icon)} ${renderedText}` : renderedText;
|
|
199
188
|
}
|
|
@@ -284,9 +273,7 @@ function readInstalledExtensionPackages(cwd) {
|
|
|
284
273
|
return packages;
|
|
285
274
|
}
|
|
286
275
|
function extensionSettingsFiles(cwd) {
|
|
287
|
-
return [join(getAgentDir(), "settings.json"), join(cwd, ".pi", "settings.json")].filter(
|
|
288
|
-
(file) => existsSync(file)
|
|
289
|
-
);
|
|
276
|
+
return [join(getAgentDir(), "settings.json"), join(cwd, ".pi", "settings.json")].filter((file) => existsSync(file));
|
|
290
277
|
}
|
|
291
278
|
function findDuplicateExtensions(installedPackages) {
|
|
292
279
|
const sourcesByPackage = /* @__PURE__ */ new Map();
|
|
@@ -300,23 +287,16 @@ function findDuplicateExtensions(installedPackages) {
|
|
|
300
287
|
function buildExtensionStatusIconAliases(installedPackages) {
|
|
301
288
|
const packageAliasesByStatusBase = /* @__PURE__ */ new Map();
|
|
302
289
|
for (const extensionPackage of installedPackages) {
|
|
303
|
-
const candidate = extensionStatusIconAliasCandidate(
|
|
304
|
-
extensionPackage.packageName,
|
|
305
|
-
extensionPackage.source
|
|
306
|
-
);
|
|
290
|
+
const candidate = extensionStatusIconAliasCandidate(extensionPackage.packageName, extensionPackage.source);
|
|
307
291
|
if (!candidate) continue;
|
|
308
292
|
const aliasesByPackage = packageAliasesByStatusBase.get(candidate.statusBase) ?? /* @__PURE__ */ new Map();
|
|
309
293
|
const existingAliases = aliasesByPackage.get(extensionPackage.packageName) ?? [];
|
|
310
|
-
aliasesByPackage.set(
|
|
311
|
-
extensionPackage.packageName,
|
|
312
|
-
uniqueStrings([...existingAliases, ...candidate.aliases])
|
|
313
|
-
);
|
|
294
|
+
aliasesByPackage.set(extensionPackage.packageName, uniqueStrings([...existingAliases, ...candidate.aliases]));
|
|
314
295
|
packageAliasesByStatusBase.set(candidate.statusBase, aliasesByPackage);
|
|
315
296
|
}
|
|
316
297
|
const aliases = /* @__PURE__ */ new Map();
|
|
317
298
|
for (const [statusBase, aliasesByPackage] of packageAliasesByStatusBase) {
|
|
318
|
-
if (aliasesByPackage.size === 1)
|
|
319
|
-
aliases.set(statusBase, [...aliasesByPackage.values()][0] ?? []);
|
|
299
|
+
if (aliasesByPackage.size === 1) aliases.set(statusBase, [...aliasesByPackage.values()][0] ?? []);
|
|
320
300
|
}
|
|
321
301
|
return aliases;
|
|
322
302
|
}
|
|
@@ -382,11 +362,11 @@ import { isAbsolute as isAbsolute2 } from "node:path";
|
|
|
382
362
|
var GIT_STATUS_TIMEOUT_MS = 3e3;
|
|
383
363
|
async function readGitStatus(pi, cwd, signal) {
|
|
384
364
|
const [statusResult, rootResult] = await Promise.all([
|
|
385
|
-
pi.exec(
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
),
|
|
365
|
+
pi.exec("git", ["--no-optional-locks", "status", "--porcelain=v1", "--branch", "--untracked-files=normal"], {
|
|
366
|
+
cwd,
|
|
367
|
+
timeout: GIT_STATUS_TIMEOUT_MS,
|
|
368
|
+
signal
|
|
369
|
+
}),
|
|
390
370
|
pi.exec("git", ["rev-parse", "--path-format=absolute", "--show-toplevel"], {
|
|
391
371
|
cwd,
|
|
392
372
|
timeout: GIT_STATUS_TIMEOUT_MS,
|
|
@@ -531,7 +511,7 @@ function summarizeFooterUsage(entries) {
|
|
|
531
511
|
totals.latestCacheHitRate = promptTokens > 0 ? cacheRead / promptTokens * 100 : void 0;
|
|
532
512
|
} else if (entry.type === "message" && entry.message.role === "toolResult") {
|
|
533
513
|
usage = entry.message.usage;
|
|
534
|
-
} else if (entry.type === "compaction" || entry.type === "branch_summary") {
|
|
514
|
+
} else if (entry.type === "compaction" || entry.type === "branch_summary" || entry.type === "usage") {
|
|
535
515
|
usage = entry.usage;
|
|
536
516
|
}
|
|
537
517
|
if (!usage) continue;
|
|
@@ -565,9 +545,7 @@ function renderStatusline(width, ctx, footerData, _theme, config, runtime, trueC
|
|
|
565
545
|
if (rendered && rendered.text.length > 0) row.segments.push(rendered);
|
|
566
546
|
}
|
|
567
547
|
const segments = [];
|
|
568
|
-
const renderedRows = rows.filter(
|
|
569
|
-
(row) => row.configuredSegments === 0 || row.segments.length > 0
|
|
570
|
-
);
|
|
548
|
+
const renderedRows = rows.filter((row) => row.configuredSegments === 0 || row.segments.length > 0);
|
|
571
549
|
for (const [index, row] of renderedRows.entries()) {
|
|
572
550
|
if (index > 0) segments.push({ name: LINE_BREAK_SEGMENT_NAME });
|
|
573
551
|
segments.push(...row.segments);
|
|
@@ -605,23 +583,11 @@ function buildSegment(name, ctx, footerData, config, runtime, usageSummary) {
|
|
|
605
583
|
return segment(name, model, config, "accent", "header");
|
|
606
584
|
}
|
|
607
585
|
case "thinking":
|
|
608
|
-
return segment(
|
|
609
|
-
name,
|
|
610
|
-
runtime.thinkingLevel,
|
|
611
|
-
config,
|
|
612
|
-
thinkingColor(runtime.thinkingLevel),
|
|
613
|
-
"header"
|
|
614
|
-
);
|
|
586
|
+
return segment(name, runtime.thinkingLevel, config, thinkingColor(runtime.thinkingLevel), "header");
|
|
615
587
|
case "branch": {
|
|
616
588
|
const branch = footerData.getGitBranch();
|
|
617
589
|
const pr = branch ? prContextFromStatuses(footerData.getExtensionStatuses()) : void 0;
|
|
618
|
-
return segment(
|
|
619
|
-
name,
|
|
620
|
-
formatGitBranchValue(branch, runtime.gitStatus, pr),
|
|
621
|
-
config,
|
|
622
|
-
"accent",
|
|
623
|
-
"git"
|
|
624
|
-
);
|
|
590
|
+
return segment(name, formatGitBranchValue(branch, runtime.gitStatus, pr), config, "accent", "git");
|
|
625
591
|
}
|
|
626
592
|
case "cwd":
|
|
627
593
|
return segment(
|
|
@@ -826,7 +792,7 @@ var EMPTY_EXTENSION_STATUS_ICON_ALIASES2 = /* @__PURE__ */ new Map();
|
|
|
826
792
|
var statuslineCommandsPromise;
|
|
827
793
|
function loadStatuslineCommands() {
|
|
828
794
|
if (!statuslineCommandsPromise) {
|
|
829
|
-
statuslineCommandsPromise = import("./chunks/commands-
|
|
795
|
+
statuslineCommandsPromise = import("./chunks/commands-KDWSOSZZ.ts").catch((error) => {
|
|
830
796
|
statuslineCommandsPromise = void 0;
|
|
831
797
|
throw error;
|
|
832
798
|
});
|
|
@@ -966,27 +932,9 @@ function statusline(pi) {
|
|
|
966
932
|
if (!loaded) return [];
|
|
967
933
|
const config = previewPalettePreset ? { ...loaded.config, palettePreset: previewPalettePreset } : loaded.config;
|
|
968
934
|
const trueColor = getCapabilities().trueColor;
|
|
969
|
-
const mainLine = renderStatusline(
|
|
970
|
-
width,
|
|
971
|
-
ctx,
|
|
972
|
-
footerData,
|
|
973
|
-
theme,
|
|
974
|
-
config,
|
|
975
|
-
runtime,
|
|
976
|
-
trueColor
|
|
977
|
-
);
|
|
935
|
+
const mainLine = renderStatusline(width, ctx, footerData, theme, config, runtime, trueColor);
|
|
978
936
|
const lines = mainLine ? mainLine.split("\n") : [];
|
|
979
|
-
lines.push(
|
|
980
|
-
...renderExtensionStatusline(
|
|
981
|
-
width,
|
|
982
|
-
footerData,
|
|
983
|
-
theme,
|
|
984
|
-
config,
|
|
985
|
-
runtime,
|
|
986
|
-
mainLine,
|
|
987
|
-
trueColor
|
|
988
|
-
)
|
|
989
|
-
);
|
|
937
|
+
lines.push(...renderExtensionStatusline(width, footerData, theme, config, runtime, mainLine, trueColor));
|
|
990
938
|
return lines;
|
|
991
939
|
}
|
|
992
940
|
};
|
|
@@ -1125,10 +1073,7 @@ function statusline(pi) {
|
|
|
1125
1073
|
function formatSettingsDiagnostics(loaded) {
|
|
1126
1074
|
const details = loaded.diagnostics.slice(0, 5).map((item) => item.message);
|
|
1127
1075
|
const remaining = loaded.diagnostics.length - details.length;
|
|
1128
|
-
return [
|
|
1129
|
-
`pi-statusline settings: ${details.join("; ")}`,
|
|
1130
|
-
...remaining > 0 ? [`+${remaining} more`] : []
|
|
1131
|
-
].join(" ");
|
|
1076
|
+
return [`pi-statusline settings: ${details.join("; ")}`, ...remaining > 0 ? [`+${remaining} more`] : []].join(" ");
|
|
1132
1077
|
}
|
|
1133
1078
|
export {
|
|
1134
1079
|
statusline as default
|