@felan-ai/ext-powerline 0.1.0-alpha.1 → 0.1.0-alpha.3

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/LICENSE CHANGED
@@ -1,6 +1,8 @@
1
1
  MIT License
2
2
 
3
3
  Copyright (c) 2026 Felan contributors
4
+ Copyright (c) 2026 Marc Krenn
5
+ Copyright (c) 2026 Milko Slavov
4
6
 
5
7
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
8
  of this software and associated documentation files (the "Software"), to deal
package/NOTICE ADDED
@@ -0,0 +1,13 @@
1
+ @felan-ai/ext-powerline
2
+
3
+ Portions of this package are adapted from packages/pi-powerline in
4
+ https://github.com/mslavov/pi-extensions at commit
5
+ 7e72e509fe45a5a87c4c2e176cb711de994a8c1d.
6
+ Copyright (c) 2026 Milko Slavov.
7
+
8
+ The pi-powerline source credits packages/sub-core from
9
+ https://github.com/marckrenn/pi-sub, licensed under the MIT License, for
10
+ subscription provider and usage logic. Copyright (c) 2026 Marc Krenn. Felan
11
+ does not include the credential loading or subscription network implementation.
12
+
13
+ All adaptations remain available under the MIT License in LICENSE.
package/README.md CHANGED
@@ -1,3 +1,62 @@
1
1
  # @felan-ai/ext-powerline
2
2
 
3
- Package foundation for the Felan terminal powerline extension.
3
+ Default local TUI footer extension for Felan, targeting Pi 0.82.1.
4
+
5
+ The footer displays:
6
+
7
+ - current directory
8
+ - cached Git branch, revision, working-tree status, tag, age, stash, upstream, and repository name
9
+ - active model and thinking level
10
+ - session token and cost totals
11
+ - context-window usage
12
+ - statuses published by other Pi extensions
13
+
14
+ Rendering is ANSI-width-aware and supports left/right alignment, wrapping,
15
+ `minimal`, `powerline`, and `capsule` styles, plus text and Powerline Unicode
16
+ charsets. Git probes are asynchronous, cached, coalesced, time-bounded, and
17
+ executed exclusively through `pi.exec`.
18
+
19
+ The extension installs its footer on `session_start` only when `ctx.mode` is
20
+ `tui`, redraws for model, thinking, agent, turn, tool, compaction, tree, and Git
21
+ branch changes, and removes and disposes the footer on `session_shutdown`.
22
+ Headless Pi modes perform no footer or Git work.
23
+
24
+ ## Display flags
25
+
26
+ Configuration is inert for the process lifetime. These Pi flags are read when
27
+ the TUI footer is installed:
28
+
29
+ | Flag | Supported values | Default |
30
+ | --- | --- | --- |
31
+ | `--felan-powerline-theme` | `dark`, `light`, `nord`, `tokyo-night`, `rose-pine`, `gruvbox` | `dark` |
32
+ | `--felan-powerline-style` | `minimal`, `powerline`, `capsule` | `powerline` |
33
+ | `--felan-powerline-charset` | `text`, `unicode` | `text` |
34
+ | `--felan-powerline-color` | `auto`, `none`, `ansi`, `ansi256`, `truecolor` | `auto` |
35
+ | `--felan-powerline-wrap` | boolean | `true` |
36
+ | `--felan-powerline-directory-style` | `full`, `fish`, `basename` | `fish` |
37
+ | `--felan-powerline-session-type` | `tokens`, `cost`, `both`, `breakdown` | `tokens` |
38
+ | `--felan-powerline-context-style` | `text`, `bar`, `blocks`, `blocks-line`, `dots` | `bar` |
39
+
40
+ The portable subset does not read or watch configuration files, inspect private
41
+ authentication files or JWTs, call subscription services, or depend on tmux or
42
+ private environment conventions.
43
+
44
+ ## Development
45
+
46
+ Source: `packages/ext-powerline` in <https://github.com/felan-ai/felan>.
47
+
48
+ ```sh
49
+ corepack enable
50
+ pnpm install --frozen-lockfile
51
+ pnpm --filter @felan-ai/ext-powerline build
52
+ pnpm --filter @felan-ai/ext-powerline type-check
53
+ pnpm --filter @felan-ai/ext-powerline test
54
+ ```
55
+
56
+ ## Attribution
57
+
58
+ The rendering, theme, segment, lifecycle, and Git-cache design is adapted from
59
+ the MIT-licensed `pi-powerline` source by Milko Slavov. That source credits the
60
+ MIT-licensed `marckrenn/pi-sub` `packages/sub-core` for subscription provider
61
+ and usage logic. Felan excludes that credential and network functionality.
62
+ See [NOTICE](NOTICE).
@@ -0,0 +1,15 @@
1
+ import type { ColorCompatibility, PowerlineConfig, ThemeColorKey } from './config.js';
2
+ export type ColorMode = 'none' | 'ansi' | 'ansi256' | 'truecolor';
3
+ export interface ColorPair {
4
+ fg: string;
5
+ bg: string;
6
+ }
7
+ export interface ThemePalette {
8
+ colors: Record<ThemeColorKey, ColorPair>;
9
+ }
10
+ export declare function resolveColorMode(compatibility: ColorCompatibility): ColorMode;
11
+ export declare function getThemePalette(config: PowerlineConfig): ThemePalette;
12
+ export declare function colorBlock(text: string, pair: ColorPair, mode: ColorMode): string;
13
+ export declare function colorForeground(text: string, color: string, mode: ColorMode): string;
14
+ export declare function colorPairText(text: string, pair: ColorPair, mode: ColorMode): string;
15
+ //# sourceMappingURL=colors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../src/colors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEtF,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;AAElE,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;CAC1C;AA+CD,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,kBAAkB,GAAG,SAAS,CAO7E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,YAAY,CAErE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,CAEjF;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,CAEpF;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,CAEpF"}
package/dist/colors.js ADDED
@@ -0,0 +1,123 @@
1
+ const THEMES = {
2
+ dark: makeTheme({
3
+ directory: ['#f8fafc', '#2563eb'], git: ['#052e16', '#22c55e'], model: ['#ffffff', '#7c3aed'],
4
+ session: ['#111827', '#f59e0b'], context: ['#ecfeff', '#0891b2'], status: ['#f8fafc', '#334155'],
5
+ warning: ['#111827', '#fbbf24'], critical: ['#ffffff', '#dc2626'], muted: ['#cbd5e1', '#1f2937'],
6
+ extensionStatus1: ['#cbd5e1', '#1f2937'], extensionStatus2: ['#bfdbfe', '#1e3a5f'],
7
+ extensionStatus3: ['#ddd6fe', '#3b2f5f'], extensionStatus4: ['#99f6e4', '#134e4a'],
8
+ }),
9
+ light: makeTheme({
10
+ directory: ['#ffffff', '#1d4ed8'], git: ['#052e16', '#86efac'], model: ['#ffffff', '#6d28d9'],
11
+ session: ['#451a03', '#fcd34d'], context: ['#083344', '#67e8f9'], status: ['#111827', '#e5e7eb'],
12
+ warning: ['#451a03', '#fde68a'], critical: ['#ffffff', '#ef4444'], muted: ['#374151', '#e5e7eb'],
13
+ extensionStatus1: ['#374151', '#e5e7eb'], extensionStatus2: ['#1e3a8a', '#dbeafe'],
14
+ extensionStatus3: ['#581c87', '#ede9fe'], extensionStatus4: ['#134e4a', '#ccfbf1'],
15
+ }),
16
+ nord: makeTheme({
17
+ directory: ['#eceff4', '#5e81ac'], git: ['#2e3440', '#a3be8c'], model: ['#2e3440', '#b48ead'],
18
+ session: ['#2e3440', '#ebcb8b'], context: ['#2e3440', '#88c0d0'], status: ['#d8dee9', '#434c5e'],
19
+ warning: ['#2e3440', '#ebcb8b'], critical: ['#eceff4', '#bf616a'], muted: ['#d8dee9', '#3b4252'],
20
+ extensionStatus1: ['#d8dee9', '#3b4252'], extensionStatus2: ['#d8dee9', '#434c5e'],
21
+ extensionStatus3: ['#2e3440', '#8fbcbb'], extensionStatus4: ['#2e3440', '#81a1c1'],
22
+ }),
23
+ 'tokyo-night': makeTheme({
24
+ directory: ['#c0caf5', '#2f7dc8'], git: ['#1a1b26', '#9ece6a'], model: ['#c0caf5', '#7aa2f7'],
25
+ session: ['#1a1b26', '#e0af68'], context: ['#1a1b26', '#7dcfff'], status: ['#c0caf5', '#24283b'],
26
+ warning: ['#1a1b26', '#e0af68'], critical: ['#c0caf5', '#f7768e'], muted: ['#a9b1d6', '#1f2335'],
27
+ extensionStatus1: ['#a9b1d6', '#1f2335'], extensionStatus2: ['#c0caf5', '#24283b'],
28
+ extensionStatus3: ['#1a1b26', '#7aa2f7'], extensionStatus4: ['#1a1b26', '#73daca'],
29
+ }),
30
+ 'rose-pine': makeTheme({
31
+ directory: ['#e0def4', '#31748f'], git: ['#191724', '#9ccfd8'], model: ['#e0def4', '#c4a7e7'],
32
+ session: ['#191724', '#f6c177'], context: ['#191724', '#ebbcba'], status: ['#e0def4', '#26233a'],
33
+ warning: ['#191724', '#f6c177'], critical: ['#e0def4', '#eb6f92'], muted: ['#908caa', '#21202e'],
34
+ extensionStatus1: ['#908caa', '#21202e'], extensionStatus2: ['#e0def4', '#26233a'],
35
+ extensionStatus3: ['#191724', '#9ccfd8'], extensionStatus4: ['#191724', '#c4a7e7'],
36
+ }),
37
+ gruvbox: makeTheme({
38
+ directory: ['#fbf1c7', '#458588'], git: ['#282828', '#98971a'], model: ['#fbf1c7', '#b16286'],
39
+ session: ['#282828', '#d79921'], context: ['#282828', '#83a598'], status: ['#ebdbb2', '#3c3836'],
40
+ warning: ['#282828', '#fabd2f'], critical: ['#fbf1c7', '#cc241d'], muted: ['#d5c4a1', '#3c3836'],
41
+ extensionStatus1: ['#d5c4a1', '#3c3836'], extensionStatus2: ['#ebdbb2', '#504945'],
42
+ extensionStatus3: ['#282828', '#83a598'], extensionStatus4: ['#282828', '#8ec07c'],
43
+ }),
44
+ };
45
+ export function resolveColorMode(compatibility) {
46
+ if (compatibility !== 'auto')
47
+ return compatibility;
48
+ if (process.env.NO_COLOR || process.env.TERM === 'dumb' || process.env.FORCE_COLOR === '0')
49
+ return 'none';
50
+ const colorTerm = (process.env.COLORTERM ?? '').toLowerCase();
51
+ if (colorTerm.includes('truecolor') || colorTerm.includes('24bit'))
52
+ return 'truecolor';
53
+ if ((process.env.TERM ?? '').includes('256color'))
54
+ return 'ansi256';
55
+ return 'ansi';
56
+ }
57
+ export function getThemePalette(config) {
58
+ return THEMES[config.theme];
59
+ }
60
+ export function colorBlock(text, pair, mode) {
61
+ return applyAnsi(text, mode, pair.fg, pair.bg);
62
+ }
63
+ export function colorForeground(text, color, mode) {
64
+ return applyAnsi(text, mode, color);
65
+ }
66
+ export function colorPairText(text, pair, mode) {
67
+ return applyAnsi(text, mode, pair.fg);
68
+ }
69
+ function makeTheme(colors) {
70
+ return { colors: Object.fromEntries(Object.entries(colors).map(([key, [fg, bg]]) => [key, { fg, bg }])) };
71
+ }
72
+ function applyAnsi(text, mode, fg, bg) {
73
+ if (mode === 'none')
74
+ return text;
75
+ const codes = [fg ? colorCode(fg, false, mode) : '', bg ? colorCode(bg, true, mode) : ''].filter(Boolean);
76
+ return codes.length > 0 ? `\x1b[${codes.join(';')}m${text}\x1b[0m` : text;
77
+ }
78
+ function colorCode(hex, background, mode) {
79
+ const rgb = hexToRgb(hex);
80
+ if (mode === 'truecolor')
81
+ return `${background ? 48 : 38};2;${rgb.r};${rgb.g};${rgb.b}`;
82
+ if (mode === 'ansi256')
83
+ return `${background ? 48 : 38};5;${rgbToAnsi256(rgb.r, rgb.g, rgb.b)}`;
84
+ return String(nearestAnsi16(rgb.r, rgb.g, rgb.b, background));
85
+ }
86
+ function hexToRgb(hex) {
87
+ const value = hex.slice(1);
88
+ return { r: Number.parseInt(value.slice(0, 2), 16), g: Number.parseInt(value.slice(2, 4), 16), b: Number.parseInt(value.slice(4, 6), 16) };
89
+ }
90
+ function rgbToAnsi256(r, g, b) {
91
+ if (r === g && g === b) {
92
+ if (r < 8)
93
+ return 16;
94
+ if (r > 248)
95
+ return 231;
96
+ return Math.round(((r - 8) / 247) * 24) + 232;
97
+ }
98
+ return 16 + 36 * Math.round((r / 255) * 5) + 6 * Math.round((g / 255) * 5) + Math.round((b / 255) * 5);
99
+ }
100
+ const ANSI16_COLORS = [
101
+ { rgb: [0, 0, 0], fg: 30, bg: 40 }, { rgb: [128, 0, 0], fg: 31, bg: 41 },
102
+ { rgb: [0, 128, 0], fg: 32, bg: 42 }, { rgb: [128, 128, 0], fg: 33, bg: 43 },
103
+ { rgb: [0, 0, 128], fg: 34, bg: 44 }, { rgb: [128, 0, 128], fg: 35, bg: 45 },
104
+ { rgb: [0, 128, 128], fg: 36, bg: 46 }, { rgb: [192, 192, 192], fg: 37, bg: 47 },
105
+ { rgb: [128, 128, 128], fg: 90, bg: 100 }, { rgb: [255, 0, 0], fg: 91, bg: 101 },
106
+ { rgb: [0, 255, 0], fg: 92, bg: 102 }, { rgb: [255, 255, 0], fg: 93, bg: 103 },
107
+ { rgb: [0, 0, 255], fg: 94, bg: 104 }, { rgb: [255, 0, 255], fg: 95, bg: 105 },
108
+ { rgb: [0, 255, 255], fg: 96, bg: 106 }, { rgb: [255, 255, 255], fg: 97, bg: 107 },
109
+ ];
110
+ function nearestAnsi16(r, g, b, background) {
111
+ let best = ANSI16_COLORS[0];
112
+ let distance = Number.POSITIVE_INFINITY;
113
+ for (const candidate of ANSI16_COLORS) {
114
+ const [red, green, blue] = candidate.rgb;
115
+ const candidateDistance = (r - red) ** 2 + (g - green) ** 2 + (b - blue) ** 2;
116
+ if (candidateDistance < distance) {
117
+ best = candidate;
118
+ distance = candidateDistance;
119
+ }
120
+ }
121
+ return background ? best.bg : best.fg;
122
+ }
123
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../src/colors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { FelanExtensionAPI } from '@felan-ai/agent-core';
2
+ export type ThemeName = 'dark' | 'light' | 'nord' | 'tokyo-night' | 'rose-pine' | 'gruvbox';
3
+ export type FooterStyle = 'minimal' | 'powerline' | 'capsule';
4
+ export type Charset = 'unicode' | 'text';
5
+ export type ColorCompatibility = 'auto' | 'none' | 'ansi' | 'ansi256' | 'truecolor';
6
+ export type DirectoryStyle = 'full' | 'fish' | 'basename';
7
+ export type SessionDisplayType = 'cost' | 'tokens' | 'both' | 'breakdown';
8
+ export type ContextDisplayStyle = 'text' | 'bar' | 'blocks' | 'blocks-line' | 'dots';
9
+ export type SegmentAlignment = 'left' | 'right';
10
+ export type SegmentName = 'directory' | 'git' | 'model' | 'session' | 'context' | 'status';
11
+ export type ThemeColorKey = SegmentName | 'warning' | 'critical' | 'muted' | 'extensionStatus1' | 'extensionStatus2' | 'extensionStatus3' | 'extensionStatus4';
12
+ export interface SegmentConfig {
13
+ enabled: boolean;
14
+ align?: SegmentAlignment;
15
+ style?: DirectoryStyle;
16
+ showSha?: boolean;
17
+ showWorkingTree?: boolean;
18
+ showTag?: boolean;
19
+ showTimeSinceCommit?: boolean;
20
+ showStashCount?: boolean;
21
+ showUpstream?: boolean;
22
+ showRepoName?: boolean;
23
+ type?: SessionDisplayType;
24
+ displayStyle?: ContextDisplayStyle;
25
+ showPercentageOnly?: boolean;
26
+ showTokensOnly?: boolean;
27
+ width?: number;
28
+ warningThreshold?: number;
29
+ criticalThreshold?: number;
30
+ }
31
+ export interface DisplayLineConfig {
32
+ segments: Partial<Record<SegmentName, SegmentConfig>>;
33
+ }
34
+ export interface PowerlineConfig {
35
+ theme: ThemeName;
36
+ display: {
37
+ style: FooterStyle;
38
+ charset: Charset;
39
+ colorCompatibility: ColorCompatibility;
40
+ autoWrap: boolean;
41
+ padding: number;
42
+ lines: DisplayLineConfig[];
43
+ };
44
+ }
45
+ export declare const POWERLINE_FLAGS: {
46
+ readonly theme: "felan-powerline-theme";
47
+ readonly style: "felan-powerline-style";
48
+ readonly charset: "felan-powerline-charset";
49
+ readonly color: "felan-powerline-color";
50
+ readonly wrap: "felan-powerline-wrap";
51
+ readonly directoryStyle: "felan-powerline-directory-style";
52
+ readonly sessionType: "felan-powerline-session-type";
53
+ readonly contextStyle: "felan-powerline-context-style";
54
+ };
55
+ export declare function registerPowerlineFlags(pi: FelanExtensionAPI): void;
56
+ export declare function configFromFlags(pi: Pick<FelanExtensionAPI, 'getFlag'>): PowerlineConfig;
57
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,aAAa,GAAG,WAAW,GAAG,SAAS,CAAC;AAC5F,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAC9D,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AACzC,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;AACpF,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AAC1D,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAC1E,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,aAAa,GAAG,MAAM,CAAC;AACrF,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,OAAO,CAAC;AAChD,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,KAAK,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAC3F,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,kBAAkB,GAAG,kBAAkB,GAAG,kBAAkB,GAAG,kBAAkB,CAAC;AAE/J,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE;QACP,KAAK,EAAE,WAAW,CAAC;QACnB,OAAO,EAAE,OAAO,CAAC;QACjB,kBAAkB,EAAE,kBAAkB,CAAC;QACvC,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,iBAAiB,EAAE,CAAC;KAC5B,CAAC;CACH;AAED,eAAO,MAAM,eAAe;;;;;;;;;CASlB,CAAC;AAqCX,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,iBAAiB,GAAG,IAAI,CASlE;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,GAAG,eAAe,CAevF"}
package/dist/config.js ADDED
@@ -0,0 +1,91 @@
1
+ export const POWERLINE_FLAGS = {
2
+ theme: 'felan-powerline-theme',
3
+ style: 'felan-powerline-style',
4
+ charset: 'felan-powerline-charset',
5
+ color: 'felan-powerline-color',
6
+ wrap: 'felan-powerline-wrap',
7
+ directoryStyle: 'felan-powerline-directory-style',
8
+ sessionType: 'felan-powerline-session-type',
9
+ contextStyle: 'felan-powerline-context-style',
10
+ };
11
+ const DEFAULT_CONFIG = {
12
+ theme: 'dark',
13
+ display: {
14
+ style: 'powerline',
15
+ charset: 'text',
16
+ colorCompatibility: 'auto',
17
+ autoWrap: true,
18
+ padding: 1,
19
+ lines: [
20
+ {
21
+ segments: {
22
+ directory: { enabled: true, style: 'fish' },
23
+ git: { enabled: true, showSha: true, showWorkingTree: true },
24
+ model: { enabled: true, align: 'right' },
25
+ },
26
+ },
27
+ {
28
+ segments: {
29
+ session: { enabled: true, type: 'tokens' },
30
+ context: { enabled: true, displayStyle: 'bar' },
31
+ status: { enabled: true, align: 'right' },
32
+ },
33
+ },
34
+ ],
35
+ },
36
+ };
37
+ const THEMES = new Set(['dark', 'light', 'nord', 'tokyo-night', 'rose-pine', 'gruvbox']);
38
+ const STYLES = new Set(['minimal', 'powerline', 'capsule']);
39
+ const CHARSETS = new Set(['unicode', 'text']);
40
+ const COLORS = new Set(['auto', 'none', 'ansi', 'ansi256', 'truecolor']);
41
+ const DIRECTORY_STYLES = new Set(['full', 'fish', 'basename']);
42
+ const SESSION_TYPES = new Set(['cost', 'tokens', 'both', 'breakdown']);
43
+ const CONTEXT_STYLES = new Set(['text', 'bar', 'blocks', 'blocks-line', 'dots']);
44
+ export function registerPowerlineFlags(pi) {
45
+ pi.registerFlag(POWERLINE_FLAGS.theme, { type: 'string', default: DEFAULT_CONFIG.theme, description: 'Powerline color theme' });
46
+ pi.registerFlag(POWERLINE_FLAGS.style, { type: 'string', default: DEFAULT_CONFIG.display.style, description: 'Powerline footer style' });
47
+ pi.registerFlag(POWERLINE_FLAGS.charset, { type: 'string', default: DEFAULT_CONFIG.display.charset, description: 'Powerline footer charset' });
48
+ pi.registerFlag(POWERLINE_FLAGS.color, { type: 'string', default: DEFAULT_CONFIG.display.colorCompatibility, description: 'Powerline ANSI color mode' });
49
+ pi.registerFlag(POWERLINE_FLAGS.wrap, { type: 'boolean', default: DEFAULT_CONFIG.display.autoWrap, description: 'Wrap long powerline segments' });
50
+ pi.registerFlag(POWERLINE_FLAGS.directoryStyle, { type: 'string', default: 'fish', description: 'Powerline directory display style' });
51
+ pi.registerFlag(POWERLINE_FLAGS.sessionType, { type: 'string', default: 'tokens', description: 'Powerline session usage display' });
52
+ pi.registerFlag(POWERLINE_FLAGS.contextStyle, { type: 'string', default: 'bar', description: 'Powerline context usage display' });
53
+ }
54
+ export function configFromFlags(pi) {
55
+ const config = cloneConfig(DEFAULT_CONFIG);
56
+ config.theme = enumFlag(pi, POWERLINE_FLAGS.theme, THEMES, config.theme);
57
+ config.display.style = enumFlag(pi, POWERLINE_FLAGS.style, STYLES, config.display.style);
58
+ config.display.charset = enumFlag(pi, POWERLINE_FLAGS.charset, CHARSETS, config.display.charset);
59
+ config.display.colorCompatibility = enumFlag(pi, POWERLINE_FLAGS.color, COLORS, config.display.colorCompatibility);
60
+ config.display.autoWrap = booleanFlag(pi, POWERLINE_FLAGS.wrap, config.display.autoWrap);
61
+ const directory = config.display.lines[0]?.segments.directory;
62
+ if (directory)
63
+ directory.style = enumFlag(pi, POWERLINE_FLAGS.directoryStyle, DIRECTORY_STYLES, directory.style ?? 'fish');
64
+ const session = config.display.lines[1]?.segments.session;
65
+ if (session)
66
+ session.type = enumFlag(pi, POWERLINE_FLAGS.sessionType, SESSION_TYPES, session.type ?? 'tokens');
67
+ const context = config.display.lines[1]?.segments.context;
68
+ if (context)
69
+ context.displayStyle = enumFlag(pi, POWERLINE_FLAGS.contextStyle, CONTEXT_STYLES, context.displayStyle ?? 'bar');
70
+ return config;
71
+ }
72
+ function enumFlag(pi, name, values, fallback) {
73
+ const value = pi.getFlag(name);
74
+ return typeof value === 'string' && values.has(value) ? value : fallback;
75
+ }
76
+ function booleanFlag(pi, name, fallback) {
77
+ const value = pi.getFlag(name);
78
+ return typeof value === 'boolean' ? value : fallback;
79
+ }
80
+ function cloneConfig(config) {
81
+ return {
82
+ theme: config.theme,
83
+ display: {
84
+ ...config.display,
85
+ lines: config.display.lines.map((line) => ({
86
+ segments: Object.fromEntries(Object.entries(line.segments).map(([name, segment]) => [name, segment ? { ...segment } : segment])),
87
+ })),
88
+ },
89
+ };
90
+ }
91
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { ExtensionContext, FelanExtensionAPI } from '@felan-ai/agent-core';
2
+ import { type Component, type TUI } from '@earendil-works/pi-tui';
3
+ import { type ColorMode, type ThemePalette } from './colors.js';
4
+ import type { PowerlineConfig } from './config.js';
5
+ import { type FooterDataLike, type RenderedSegment } from './segments.js';
6
+ import { type PowerlineSymbols } from './symbols.js';
7
+ export interface PowerlineFooterOptions {
8
+ pi: FelanExtensionAPI;
9
+ ctx: ExtensionContext;
10
+ tui: TUI;
11
+ footerData: FooterDataLike;
12
+ config: PowerlineConfig;
13
+ }
14
+ export declare class PowerlineFooter implements Component {
15
+ private readonly options;
16
+ private readonly gitCache;
17
+ private readonly unsubscribeBranch;
18
+ private disposed;
19
+ constructor(options: PowerlineFooterOptions);
20
+ invalidate(): void;
21
+ dispose(): void;
22
+ render(width: number): string[];
23
+ private refreshGit;
24
+ private requestRender;
25
+ }
26
+ export declare function renderFooterLine(segments: RenderedSegment[], config: PowerlineConfig, palette: ThemePalette, mode: ColorMode, symbols: PowerlineSymbols, width: number): string[];
27
+ export declare function renderStyledSegments(segments: RenderedSegment[], config: PowerlineConfig, palette: ThemePalette, mode: ColorMode, symbols: PowerlineSymbols): string;
28
+ //# sourceMappingURL=footer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"footer.d.ts","sourceRoot":"","sources":["../src/footer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAiC,KAAK,SAAS,EAAE,KAAK,GAAG,EAAE,MAAM,wBAAwB,CAAC;AACjG,OAAO,EAML,KAAK,SAAS,EACd,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EAAkB,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAc,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEjE,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,iBAAiB,CAAC;IACtB,GAAG,EAAE,gBAAgB,CAAC;IACtB,GAAG,EAAE,GAAG,CAAC;IACT,UAAU,EAAE,cAAc,CAAC;IAC3B,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,qBAAa,eAAgB,YAAW,SAAS;IAKnC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAa;IAC/C,OAAO,CAAC,QAAQ,CAAS;gBAEI,OAAO,EAAE,sBAAsB;IAM5D,UAAU,IAAI,IAAI;IAKlB,OAAO,IAAI,IAAI;IAOf,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAwB/B,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,aAAa;CAGtB;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,eAAe,EAAE,EAC3B,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,YAAY,EACrB,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,MAAM,GACZ,MAAM,EAAE,CAmBV;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,eAAe,EAAE,EAC3B,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,YAAY,EACrB,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,gBAAgB,GACxB,MAAM,CAIR"}
package/dist/footer.js ADDED
@@ -0,0 +1,132 @@
1
+ import { truncateToWidth, visibleWidth } from '@earendil-works/pi-tui';
2
+ import { colorBlock, colorForeground, colorPairText, getThemePalette, resolveColorMode, } from './colors.js';
3
+ import { GitCache } from './git.js';
4
+ import { renderSegments } from './segments.js';
5
+ import { getSymbols } from './symbols.js';
6
+ export class PowerlineFooter {
7
+ options;
8
+ gitCache;
9
+ unsubscribeBranch;
10
+ disposed = false;
11
+ constructor(options) {
12
+ this.options = options;
13
+ this.gitCache = new GitCache(options.pi, options.ctx.cwd);
14
+ this.unsubscribeBranch = options.footerData.onBranchChange(() => this.invalidate());
15
+ this.refreshGit();
16
+ }
17
+ invalidate() {
18
+ this.refreshGit();
19
+ this.requestRender();
20
+ }
21
+ dispose() {
22
+ if (this.disposed)
23
+ return;
24
+ this.disposed = true;
25
+ this.unsubscribeBranch();
26
+ this.gitCache.dispose();
27
+ }
28
+ render(width) {
29
+ const safeWidth = Math.max(0, Math.floor(width));
30
+ if (safeWidth === 0)
31
+ return [''];
32
+ const { config } = this.options;
33
+ const symbols = getSymbols(config.display.charset);
34
+ const palette = getThemePalette(config);
35
+ const mode = resolveColorMode(config.display.colorCompatibility);
36
+ const lines = [];
37
+ for (const line of config.display.lines) {
38
+ const gitDetails = this.gitCache.get();
39
+ const segments = renderSegments(line, {
40
+ ctx: this.options.ctx,
41
+ footerData: this.options.footerData,
42
+ ...(gitDetails === undefined ? {} : { gitDetails }),
43
+ symbols,
44
+ });
45
+ if (segments.length > 0)
46
+ lines.push(...renderFooterLine(segments, config, palette, mode, symbols, safeWidth));
47
+ }
48
+ return (lines.length > 0 ? lines : ['']).map((line) => ensureWidth(line, safeWidth));
49
+ }
50
+ refreshGit() {
51
+ void this.gitCache.refresh().then(() => this.requestRender());
52
+ }
53
+ requestRender() {
54
+ if (!this.disposed)
55
+ this.options.tui.requestRender();
56
+ }
57
+ }
58
+ export function renderFooterLine(segments, config, palette, mode, symbols, width) {
59
+ const left = segments.filter((segment) => segment.align === 'left');
60
+ const right = segments.filter((segment) => segment.align === 'right');
61
+ if (right.length > 0)
62
+ return [renderAlignedLine(left, right, config, palette, mode, symbols, width)];
63
+ if (!config.display.autoWrap)
64
+ return [ensureWidth(renderStyledSegments(segments, config, palette, mode, symbols), width)];
65
+ const lines = [];
66
+ let current = [];
67
+ for (const segment of segments) {
68
+ const candidate = [...current, segment];
69
+ if (current.length > 0 && visibleWidth(renderStyledSegments(candidate, config, palette, mode, symbols)) > width) {
70
+ lines.push(ensureWidth(renderStyledSegments(current, config, palette, mode, symbols), width));
71
+ current = [segment];
72
+ }
73
+ else {
74
+ current = candidate;
75
+ }
76
+ }
77
+ if (current.length > 0)
78
+ lines.push(ensureWidth(renderStyledSegments(current, config, palette, mode, symbols), width));
79
+ return lines;
80
+ }
81
+ export function renderStyledSegments(segments, config, palette, mode, symbols) {
82
+ if (config.display.style === 'minimal')
83
+ return renderMinimal(segments, config, palette, mode, symbols);
84
+ if (config.display.style === 'capsule')
85
+ return renderCapsule(segments, config, palette, mode, symbols);
86
+ return renderPowerline(segments, config, palette, mode, symbols);
87
+ }
88
+ function renderAlignedLine(leftSegments, rightSegments, config, palette, mode, symbols, width) {
89
+ const right = ensureWidth(renderStyledSegments(rightSegments, config, palette, mode, symbols), width);
90
+ const rightWidth = visibleWidth(right);
91
+ const leftAvailable = Math.max(0, width - rightWidth - (leftSegments.length > 0 ? 1 : 0));
92
+ const left = leftAvailable > 0
93
+ ? ensureWidth(renderStyledSegments(leftSegments, config, palette, mode, symbols), leftAvailable)
94
+ : '';
95
+ if (!left)
96
+ return ' '.repeat(Math.max(0, width - rightWidth)) + right;
97
+ return ensureWidth(left + ' '.repeat(Math.max(1, width - visibleWidth(left) - rightWidth)) + right, width);
98
+ }
99
+ function renderMinimal(segments, config, palette, mode, symbols) {
100
+ const separator = colorForeground(` ${symbols.separatorThin} `, palette.colors.muted.fg, mode);
101
+ return segments
102
+ .map((segment) => colorPairText(pad(segment.text, config.display.padding), palette.colors[segment.colorKey], mode))
103
+ .join(separator);
104
+ }
105
+ function renderPowerline(segments, config, palette, mode, symbols) {
106
+ let output = '';
107
+ for (let index = 0; index < segments.length; index += 1) {
108
+ const segment = segments[index];
109
+ const pair = palette.colors[segment.colorKey];
110
+ const next = segments[index + 1];
111
+ output += colorBlock(pad(segment.text, config.display.padding), pair, mode);
112
+ output += next
113
+ ? colorBlock(symbols.separator, { fg: pair.bg, bg: palette.colors[next.colorKey].bg }, mode)
114
+ : colorForeground(symbols.separator, pair.bg, mode);
115
+ }
116
+ return output;
117
+ }
118
+ function renderCapsule(segments, config, palette, mode, symbols) {
119
+ return segments.map((segment) => {
120
+ const pair = palette.colors[segment.colorKey];
121
+ return colorForeground(symbols.capsuleLeft, pair.bg, mode)
122
+ + colorBlock(pad(segment.text, config.display.padding), pair, mode)
123
+ + colorForeground(symbols.capsuleRight, pair.bg, mode);
124
+ }).join(' ');
125
+ }
126
+ function pad(text, padding) {
127
+ return padding > 0 ? `${' '.repeat(padding)}${text}${' '.repeat(padding)}` : text;
128
+ }
129
+ function ensureWidth(line, width) {
130
+ return visibleWidth(line) <= width ? line : truncateToWidth(line, width, '…');
131
+ }
132
+ //# sourceMappingURL=footer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"footer.js","sourceRoot":"","sources":["../src/footer.ts"],"names":[],"mappings":"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"}