@juanibiapina/pi-powerbar 0.4.0 → 0.5.0

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 CHANGED
@@ -18,7 +18,16 @@ The powerbar renders a widget with two sides, like tmux:
18
18
 
19
19
  ### Producing segments
20
20
 
21
- Any extension can update a segment:
21
+ Any extension can register and update a segment. First, register the segment so it appears in the settings menu:
22
+
23
+ ```typescript
24
+ pi.events.emit("powerbar:register-segment", {
25
+ id: "git-branch",
26
+ label: "Git Branch",
27
+ });
28
+ ```
29
+
30
+ Then update it with data:
22
31
 
23
32
  ```typescript
24
33
  pi.events.emit("powerbar:update", {
@@ -38,19 +47,31 @@ pi.events.emit("powerbar:update", {
38
47
  });
39
48
  ```
40
49
 
50
+ ### Built-in segments
51
+
52
+ | Segment ID | Description |
53
+ |------------|-------------|
54
+ | `git-branch` | Current git branch (refreshes after bash commands) |
55
+ | `tokens` | Cumulative input/output tokens and session cost (e.g. `↑9 ↓270 $0.11`) |
56
+ | `context-usage` | Context window usage as a progress bar with percentage |
57
+ | `provider` | Current LLM provider name (e.g. `anthropic`, `openai`) |
58
+ | `model` | Current model name and thinking level |
59
+ | `sub-hourly` | Hourly subscription usage from [pi-sub-core](https://github.com/marckrenn/pi-sub-core) |
60
+ | `sub-weekly` | Weekly subscription usage from pi-sub-core |
61
+
41
62
  ### Configuration
42
63
 
43
- Settings are managed through [`pi-extension-settings`](https://github.com/juanibiapina/pi-extension-settings) and can be changed via the `/settings` command in pi.
64
+ Settings are managed through [`pi-extension-settings`](https://github.com/juanibiapina/pi-extension-settings) and can be changed via the `/extension-settings` command in pi.
44
65
 
45
66
  | Setting | Description | Default |
46
67
  |---------|-------------|---------|
47
- | **Left segments** | Comma-separated segment IDs for the left side | `git-branch,tokens,context-usage` |
48
- | **Right segments** | Comma-separated segment IDs for the right side | `provider,model,sub-hourly,sub-weekly` |
68
+ | **Left segments** | Segments shown on the left side (ordered multi-select menu) | `git-branch,tokens,context-usage` |
69
+ | **Right segments** | Segments shown on the right side (ordered multi-select menu) | `provider,model,sub-hourly,sub-weekly` |
49
70
  | **Separator** | String drawn between segments on the same side | ` │ ` |
50
71
  | **Placement** | Where the powerbar appears (`belowEditor` or `aboveEditor`) | `belowEditor` |
51
72
  | **Bar width** | Width of progress bars in characters (4–24) | `10` |
52
73
 
53
- Segments not listed in either side are ignored.
74
+ The left and right segment settings open an interactive menu where you can toggle segments on/off and reorder them with Shift+↑/↓. All segments registered via `powerbar:register-segment` appear as options. Segments not listed in either side are ignored.
54
75
 
55
76
  ## Development
56
77
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/powerbar/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAA6B,MAAM,+BAA+B,CAAC;AAc7F,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA+E9D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/powerbar/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAA6B,MAAM,+BAA+B,CAAC;AAmB7F,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAwF9D"}
@@ -8,10 +8,18 @@ import { renderBar } from "./render.js";
8
8
  import { loadSettings, registerSettings } from "./settings.js";
9
9
  export default function createExtension(pi) {
10
10
  const segments = new Map();
11
+ const segmentCatalog = new Map();
11
12
  let settings;
12
13
  let currentCtx;
13
- // Register settings for the /settings UI
14
- registerSettings(pi);
14
+ // Register settings with empty options initially (no segments known yet)
15
+ registerSettings(pi, []);
16
+ // Listen for segment registrations from producer extensions
17
+ pi.events.on("powerbar:register-segment", (data) => {
18
+ const { id, label } = data;
19
+ segmentCatalog.set(id, { id, label });
20
+ // Re-register settings with updated segment options
21
+ registerSettings(pi, Array.from(segmentCatalog.values()));
22
+ });
15
23
  function refresh() {
16
24
  if (!currentCtx?.hasUI)
17
25
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/powerbar/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Powerbar Core Extension\n *\n * Listens for \"powerbar:update\" events from producer extensions,\n * maintains a segment store, and renders a powerline-style widget.\n */\n\nimport type { ExtensionAPI, ExtensionUIContext, Theme } from \"@mariozechner/pi-coding-agent\";\nimport type { Component, TUI } from \"@mariozechner/pi-tui\";\nimport { renderBar, type Segment } from \"./render.js\";\nimport { loadSettings, type PowerbarSettings, registerSettings } from \"./settings.js\";\n\ninterface PowerbarUpdatePayload {\n\tid: string;\n\ttext?: string;\n\tsuffix?: string;\n\ticon?: string;\n\tcolor?: string;\n\tbar?: number;\n}\n\nexport default function createExtension(pi: ExtensionAPI): void {\n\tconst segments: Map<string, Segment> = new Map();\n\tlet settings: PowerbarSettings;\n\tlet currentCtx: { ui: { setWidget: (...args: any[]) => void }; hasUI: boolean } | undefined;\n\n\t// Register settings for the /settings UI\n\tregisterSettings(pi);\n\n\tfunction refresh(): void {\n\t\tif (!currentCtx?.hasUI) return;\n\n\t\tcurrentCtx.ui.setWidget(\n\t\t\t\"powerbar\",\n\t\t\t(_tui: TUI, theme: Theme): Component & { dispose?(): void } => {\n\t\t\t\treturn {\n\t\t\t\t\trender(width: number): string[] {\n\t\t\t\t\t\tconst line = renderBar(segments, settings, theme, width);\n\t\t\t\t\t\treturn [line];\n\t\t\t\t\t},\n\t\t\t\t\tinvalidate(): void {\n\t\t\t\t\t\t// No cached state to clear\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t\t{ placement: settings.placement },\n\t\t);\n\t}\n\n\t// Listen for segment updates from any extension\n\tpi.events.on(\"powerbar:update\", (data: unknown) => {\n\t\tconst payload = data as PowerbarUpdatePayload;\n\t\tif (!payload?.id) return;\n\n\t\tif (!payload.text && payload.bar === undefined) {\n\t\t\tsegments.delete(payload.id);\n\t\t} else {\n\t\t\tsegments.set(payload.id, {\n\t\t\t\tid: payload.id,\n\t\t\t\ttext: payload.text ?? \"\",\n\t\t\t\tsuffix: payload.suffix,\n\t\t\t\ticon: payload.icon,\n\t\t\t\tcolor: payload.color,\n\t\t\t\tbar: payload.bar,\n\t\t\t});\n\t\t}\n\n\t\trefresh();\n\t});\n\n\tfunction hideFooter(ctx: { ui: ExtensionUIContext; hasUI: boolean }): void {\n\t\tif (!ctx.hasUI) return;\n\t\tctx.ui.setFooter((_tui, _theme, _footerData) => ({\n\t\t\trender(): string[] {\n\t\t\t\treturn [];\n\t\t\t},\n\t\t\tinvalidate(): void {},\n\t\t}));\n\t}\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tsettings = loadSettings();\n\t\tcurrentCtx = ctx;\n\t\thideFooter(ctx);\n\t\trefresh();\n\t});\n\n\tpi.on(\"session_switch\", async (_event, ctx) => {\n\t\tsettings = loadSettings();\n\t\tcurrentCtx = ctx;\n\t\thideFooter(ctx);\n\t\trefresh();\n\t});\n\n\tpi.on(\"session_shutdown\", async (_event, ctx) => {\n\t\tif (ctx.hasUI) {\n\t\t\tctx.ui.setWidget(\"powerbar\", undefined);\n\t\t}\n\t\tcurrentCtx = undefined;\n\t});\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/powerbar/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,SAAS,EAAgB,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,YAAY,EAAyB,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAgBtF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAgB;IACvD,MAAM,QAAQ,GAAyB,IAAI,GAAG,EAAE,CAAC;IACjD,MAAM,cAAc,GAAmC,IAAI,GAAG,EAAE,CAAC;IACjE,IAAI,QAA0B,CAAC;IAC/B,IAAI,UAAuF,CAAC;IAE5F,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAEzB,4DAA4D;IAC5D,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,2BAA2B,EAAE,CAAC,IAAa,EAAE,EAAE;QAC3D,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAA2B,CAAC;QAClD,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACtC,oDAAoD;QACpD,gBAAgB,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,SAAS,OAAO;QACf,IAAI,CAAC,UAAU,EAAE,KAAK;YAAE,OAAO;QAE/B,UAAU,CAAC,EAAE,CAAC,SAAS,CACtB,UAAU,EACV,CAAC,IAAS,EAAE,KAAY,EAAoC,EAAE;YAC7D,OAAO;gBACN,MAAM,CAAC,KAAa;oBACnB,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;oBACzD,OAAO,CAAC,IAAI,CAAC,CAAC;gBACf,CAAC;gBACD,UAAU;oBACT,2BAA2B;gBAC5B,CAAC;aACD,CAAC;QACH,CAAC,EACD,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,CACjC,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,IAAa,EAAE,EAAE;QACjD,MAAM,OAAO,GAAG,IAA6B,CAAC;QAC9C,IAAI,CAAC,OAAO,EAAE,EAAE;YAAE,OAAO;QAEzB,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAChD,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACP,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE;gBACxB,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;gBACxB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,GAAG,EAAE,OAAO,CAAC,GAAG;aAChB,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,CAAC;IACX,CAAC,CAAC,CAAC;IAEH,SAAS,UAAU,CAAC,GAA+C;QAClE,IAAI,CAAC,GAAG,CAAC,KAAK;YAAE,OAAO;QACvB,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;YAChD,MAAM;gBACL,OAAO,EAAE,CAAC;YACX,CAAC;YACD,UAAU,KAAU,CAAC;SACrB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC5C,QAAQ,GAAG,YAAY,EAAE,CAAC;QAC1B,UAAU,GAAG,GAAG,CAAC;QACjB,UAAU,CAAC,GAAG,CAAC,CAAC;QAChB,OAAO,EAAE,CAAC;IACX,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC7C,QAAQ,GAAG,YAAY,EAAE,CAAC;QAC1B,UAAU,GAAG,GAAG,CAAC;QACjB,UAAU,CAAC,GAAG,CAAC,CAAC;QAChB,OAAO,EAAE,CAAC;IACX,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,kBAAkB,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC/C,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACzC,CAAC;QACD,UAAU,GAAG,SAAS,CAAC;IACxB,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Powerbar Core Extension\n *\n * Listens for \"powerbar:update\" events from producer extensions,\n * maintains a segment store, and renders a powerline-style widget.\n */\n\nimport type { OrderedListOption } from \"@juanibiapina/pi-extension-settings\";\nimport type { ExtensionAPI, ExtensionUIContext, Theme } from \"@mariozechner/pi-coding-agent\";\nimport type { Component, TUI } from \"@mariozechner/pi-tui\";\nimport { renderBar, type Segment } from \"./render.js\";\nimport { loadSettings, type PowerbarSettings, registerSettings } from \"./settings.js\";\n\ninterface PowerbarUpdatePayload {\n\tid: string;\n\ttext?: string;\n\tsuffix?: string;\n\ticon?: string;\n\tcolor?: string;\n\tbar?: number;\n}\n\ninterface SegmentRegistration {\n\tid: string;\n\tlabel: string;\n}\n\nexport default function createExtension(pi: ExtensionAPI): void {\n\tconst segments: Map<string, Segment> = new Map();\n\tconst segmentCatalog: Map<string, OrderedListOption> = new Map();\n\tlet settings: PowerbarSettings;\n\tlet currentCtx: { ui: { setWidget: (...args: any[]) => void }; hasUI: boolean } | undefined;\n\n\t// Register settings with empty options initially (no segments known yet)\n\tregisterSettings(pi, []);\n\n\t// Listen for segment registrations from producer extensions\n\tpi.events.on(\"powerbar:register-segment\", (data: unknown) => {\n\t\tconst { id, label } = data as SegmentRegistration;\n\t\tsegmentCatalog.set(id, { id, label });\n\t\t// Re-register settings with updated segment options\n\t\tregisterSettings(pi, Array.from(segmentCatalog.values()));\n\t});\n\n\tfunction refresh(): void {\n\t\tif (!currentCtx?.hasUI) return;\n\n\t\tcurrentCtx.ui.setWidget(\n\t\t\t\"powerbar\",\n\t\t\t(_tui: TUI, theme: Theme): Component & { dispose?(): void } => {\n\t\t\t\treturn {\n\t\t\t\t\trender(width: number): string[] {\n\t\t\t\t\t\tconst line = renderBar(segments, settings, theme, width);\n\t\t\t\t\t\treturn [line];\n\t\t\t\t\t},\n\t\t\t\t\tinvalidate(): void {\n\t\t\t\t\t\t// No cached state to clear\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t\t{ placement: settings.placement },\n\t\t);\n\t}\n\n\t// Listen for segment updates from any extension\n\tpi.events.on(\"powerbar:update\", (data: unknown) => {\n\t\tconst payload = data as PowerbarUpdatePayload;\n\t\tif (!payload?.id) return;\n\n\t\tif (!payload.text && payload.bar === undefined) {\n\t\t\tsegments.delete(payload.id);\n\t\t} else {\n\t\t\tsegments.set(payload.id, {\n\t\t\t\tid: payload.id,\n\t\t\t\ttext: payload.text ?? \"\",\n\t\t\t\tsuffix: payload.suffix,\n\t\t\t\ticon: payload.icon,\n\t\t\t\tcolor: payload.color,\n\t\t\t\tbar: payload.bar,\n\t\t\t});\n\t\t}\n\n\t\trefresh();\n\t});\n\n\tfunction hideFooter(ctx: { ui: ExtensionUIContext; hasUI: boolean }): void {\n\t\tif (!ctx.hasUI) return;\n\t\tctx.ui.setFooter((_tui, _theme, _footerData) => ({\n\t\t\trender(): string[] {\n\t\t\t\treturn [];\n\t\t\t},\n\t\t\tinvalidate(): void {},\n\t\t}));\n\t}\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tsettings = loadSettings();\n\t\tcurrentCtx = ctx;\n\t\thideFooter(ctx);\n\t\trefresh();\n\t});\n\n\tpi.on(\"session_switch\", async (_event, ctx) => {\n\t\tsettings = loadSettings();\n\t\tcurrentCtx = ctx;\n\t\thideFooter(ctx);\n\t\trefresh();\n\t});\n\n\tpi.on(\"session_shutdown\", async (_event, ctx) => {\n\t\tif (ctx.hasUI) {\n\t\t\tctx.ui.setWidget(\"powerbar\", undefined);\n\t\t}\n\t\tcurrentCtx = undefined;\n\t});\n}\n"]}
@@ -1,10 +1,9 @@
1
1
  /**
2
2
  * Settings for the powerbar via pi-extension-settings.
3
3
  */
4
- import type { SettingDefinition } from "@juanibiapina/pi-extension-settings";
4
+ import type { OrderedListOption } from "@juanibiapina/pi-extension-settings";
5
5
  import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
6
6
  export declare const EXTENSION_NAME = "powerbar";
7
- export declare const SETTINGS_DEFINITIONS: SettingDefinition[];
8
7
  export interface PowerbarSettings {
9
8
  left: string[];
10
9
  right: string[];
@@ -12,6 +11,6 @@ export interface PowerbarSettings {
12
11
  placement: "aboveEditor" | "belowEditor";
13
12
  barWidth: number;
14
13
  }
15
- export declare function registerSettings(pi: ExtensionAPI): void;
14
+ export declare function registerSettings(pi: ExtensionAPI, segmentOptions: OrderedListOption[]): void;
16
15
  export declare function loadSettings(): PowerbarSettings;
17
16
  //# sourceMappingURL=settings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/powerbar/settings.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,eAAO,MAAM,cAAc,aAAa,CAAC;AAEzC,eAAO,MAAM,oBAAoB,EAAE,iBAAiB,EAkCnD,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,aAAa,GAAG,aAAa,CAAC;IACzC,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAKvD;AAED,wBAAgB,YAAY,IAAI,gBAAgB,CAoB/C"}
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/powerbar/settings.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAqB,MAAM,qCAAqC,CAAC;AAEhG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,eAAO,MAAM,cAAc,aAAa,CAAC;AAEzC,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,aAAa,GAAG,aAAa,CAAC;IACzC,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,GAAG,IAAI,CA2C5F;AAED,wBAAgB,YAAY,IAAI,gBAAgB,CAoB/C"}
@@ -3,45 +3,47 @@
3
3
  */
4
4
  import { getSetting } from "@juanibiapina/pi-extension-settings";
5
5
  export const EXTENSION_NAME = "powerbar";
6
- export const SETTINGS_DEFINITIONS = [
7
- {
8
- id: "left",
9
- label: "Left segments",
10
- description: "Comma-separated segment IDs for the left side",
11
- defaultValue: "git-branch,tokens,context-usage",
12
- },
13
- {
14
- id: "right",
15
- label: "Right segments",
16
- description: "Comma-separated segment IDs for the right side",
17
- defaultValue: "provider,model,sub-hourly,sub-weekly",
18
- },
19
- {
20
- id: "separator",
21
- label: "Separator",
22
- description: "Separator between segments",
23
- defaultValue: "",
24
- values: ["", " ┃ ", " | ", " · ", " "],
25
- },
26
- {
27
- id: "placement",
28
- label: "Placement",
29
- description: "Where the powerbar appears",
30
- defaultValue: "belowEditor",
31
- values: ["belowEditor", "aboveEditor"],
32
- },
33
- {
34
- id: "bar-width",
35
- label: "Bar width",
36
- description: "Width of progress bars in characters",
37
- defaultValue: "10",
38
- values: ["6", "8", "10", "12", "16"],
39
- },
40
- ];
41
- export function registerSettings(pi) {
6
+ export function registerSettings(pi, segmentOptions) {
7
+ const definitions = [
8
+ {
9
+ id: "left",
10
+ label: "Left segments",
11
+ description: "Segments shown on the left side of the powerbar",
12
+ defaultValue: "git-branch,tokens,context-usage",
13
+ options: segmentOptions,
14
+ },
15
+ {
16
+ id: "right",
17
+ label: "Right segments",
18
+ description: "Segments shown on the right side of the powerbar",
19
+ defaultValue: "provider,model,sub-hourly,sub-weekly",
20
+ options: segmentOptions,
21
+ },
22
+ {
23
+ id: "separator",
24
+ label: "Separator",
25
+ description: "Separator between segments",
26
+ defaultValue: " │ ",
27
+ values: ["", " ┃ ", " | ", " · ", " "],
28
+ },
29
+ {
30
+ id: "placement",
31
+ label: "Placement",
32
+ description: "Where the powerbar appears",
33
+ defaultValue: "belowEditor",
34
+ values: ["belowEditor", "aboveEditor"],
35
+ },
36
+ {
37
+ id: "bar-width",
38
+ label: "Bar width",
39
+ description: "Width of progress bars in characters",
40
+ defaultValue: "10",
41
+ values: ["6", "8", "10", "12", "16"],
42
+ },
43
+ ];
42
44
  pi.events.emit("pi-extension-settings:register", {
43
45
  name: EXTENSION_NAME,
44
- settings: SETTINGS_DEFINITIONS,
46
+ settings: definitions,
45
47
  });
46
48
  }
47
49
  export function loadSettings() {
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/powerbar/settings.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAGjE,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;AAEzC,MAAM,CAAC,MAAM,oBAAoB,GAAwB;IACxD;QACC,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,+CAA+C;QAC5D,YAAY,EAAE,iCAAiC;KAC/C;IACD;QACC,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,gDAAgD;QAC7D,YAAY,EAAE,sCAAsC;KACpD;IACD;QACC,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,4BAA4B;QACzC,YAAY,EAAE,KAAK;QACnB,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC;KAC1C;IACD;QACC,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,4BAA4B;QACzC,YAAY,EAAE,aAAa;QAC3B,MAAM,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC;KACtC;IACD;QACC,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,sCAAsC;QACnD,YAAY,EAAE,IAAI;QAClB,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;KACpC;CACD,CAAC;AAUF,MAAM,UAAU,gBAAgB,CAAC,EAAgB;IAChD,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE;QAChD,IAAI,EAAE,cAAc;QACpB,QAAQ,EAAE,oBAAoB;KAC9B,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY;IAC3B,MAAM,OAAO,GAAG,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,iCAAiC,CAAC,IAAI,EAAE,CAAC;IAC5F,MAAM,QAAQ,GAAG,UAAU,CAAC,cAAc,EAAE,OAAO,EAAE,sCAAsC,CAAC,IAAI,EAAE,CAAC;IACnG,MAAM,SAAS,GAAG,UAAU,CAAC,cAAc,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC;IAC1E,MAAM,SAAS,GAAG,UAAU,CAAC,cAAc,EAAE,WAAW,EAAE,aAAa,CAAC,IAAI,aAAa,CAAC;IAC1F,MAAM,WAAW,GAAG,UAAU,CAAC,cAAc,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC;IAE1E,OAAO;QACN,IAAI,EAAE,OAAO;aACX,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC;QACjB,KAAK,EAAE,QAAQ;aACb,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC;QACjB,SAAS;QACT,SAAS,EAAE,SAAS,KAAK,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa;QACtE,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;KAC3E,CAAC;AACH,CAAC","sourcesContent":["/**\n * Settings for the powerbar via pi-extension-settings.\n */\n\nimport type { SettingDefinition } from \"@juanibiapina/pi-extension-settings\";\nimport { getSetting } from \"@juanibiapina/pi-extension-settings\";\nimport type { ExtensionAPI } from \"@mariozechner/pi-coding-agent\";\n\nexport const EXTENSION_NAME = \"powerbar\";\n\nexport const SETTINGS_DEFINITIONS: SettingDefinition[] = [\n\t{\n\t\tid: \"left\",\n\t\tlabel: \"Left segments\",\n\t\tdescription: \"Comma-separated segment IDs for the left side\",\n\t\tdefaultValue: \"git-branch,tokens,context-usage\",\n\t},\n\t{\n\t\tid: \"right\",\n\t\tlabel: \"Right segments\",\n\t\tdescription: \"Comma-separated segment IDs for the right side\",\n\t\tdefaultValue: \"provider,model,sub-hourly,sub-weekly\",\n\t},\n\t{\n\t\tid: \"separator\",\n\t\tlabel: \"Separator\",\n\t\tdescription: \"Separator between segments\",\n\t\tdefaultValue: \" │ \",\n\t\tvalues: [\" │ \", \" ┃ \", \" | \", \" · \", \" \"],\n\t},\n\t{\n\t\tid: \"placement\",\n\t\tlabel: \"Placement\",\n\t\tdescription: \"Where the powerbar appears\",\n\t\tdefaultValue: \"belowEditor\",\n\t\tvalues: [\"belowEditor\", \"aboveEditor\"],\n\t},\n\t{\n\t\tid: \"bar-width\",\n\t\tlabel: \"Bar width\",\n\t\tdescription: \"Width of progress bars in characters\",\n\t\tdefaultValue: \"10\",\n\t\tvalues: [\"6\", \"8\", \"10\", \"12\", \"16\"],\n\t},\n];\n\nexport interface PowerbarSettings {\n\tleft: string[];\n\tright: string[];\n\tseparator: string;\n\tplacement: \"aboveEditor\" | \"belowEditor\";\n\tbarWidth: number;\n}\n\nexport function registerSettings(pi: ExtensionAPI): void {\n\tpi.events.emit(\"pi-extension-settings:register\", {\n\t\tname: EXTENSION_NAME,\n\t\tsettings: SETTINGS_DEFINITIONS,\n\t});\n}\n\nexport function loadSettings(): PowerbarSettings {\n\tconst leftStr = getSetting(EXTENSION_NAME, \"left\", \"git-branch,tokens,context-usage\") ?? \"\";\n\tconst rightStr = getSetting(EXTENSION_NAME, \"right\", \"provider,model,sub-hourly,sub-weekly\") ?? \"\";\n\tconst separator = getSetting(EXTENSION_NAME, \"separator\", \" │ \") ?? \" │ \";\n\tconst placement = getSetting(EXTENSION_NAME, \"placement\", \"belowEditor\") ?? \"belowEditor\";\n\tconst barWidthStr = getSetting(EXTENSION_NAME, \"bar-width\", \"10\") ?? \"10\";\n\n\treturn {\n\t\tleft: leftStr\n\t\t\t.split(\",\")\n\t\t\t.map((s) => s.trim())\n\t\t\t.filter(Boolean),\n\t\tright: rightStr\n\t\t\t.split(\",\")\n\t\t\t.map((s) => s.trim())\n\t\t\t.filter(Boolean),\n\t\tseparator,\n\t\tplacement: placement === \"aboveEditor\" ? \"aboveEditor\" : \"belowEditor\",\n\t\tbarWidth: Math.max(4, Math.min(24, Number.parseInt(barWidthStr, 10) || 10)),\n\t};\n}\n"]}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/powerbar/settings.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAGjE,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;AAUzC,MAAM,UAAU,gBAAgB,CAAC,EAAgB,EAAE,cAAmC;IACrF,MAAM,WAAW,GAAwB;QACxC;YACC,EAAE,EAAE,MAAM;YACV,KAAK,EAAE,eAAe;YACtB,WAAW,EAAE,iDAAiD;YAC9D,YAAY,EAAE,iCAAiC;YAC/C,OAAO,EAAE,cAAc;SACvB;QACD;YACC,EAAE,EAAE,OAAO;YACX,KAAK,EAAE,gBAAgB;YACvB,WAAW,EAAE,kDAAkD;YAC/D,YAAY,EAAE,sCAAsC;YACpD,OAAO,EAAE,cAAc;SACvB;QACD;YACC,EAAE,EAAE,WAAW;YACf,KAAK,EAAE,WAAW;YAClB,WAAW,EAAE,4BAA4B;YACzC,YAAY,EAAE,KAAK;YACnB,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC;SAC1C;QACD;YACC,EAAE,EAAE,WAAW;YACf,KAAK,EAAE,WAAW;YAClB,WAAW,EAAE,4BAA4B;YACzC,YAAY,EAAE,aAAa;YAC3B,MAAM,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC;SACtC;QACD;YACC,EAAE,EAAE,WAAW;YACf,KAAK,EAAE,WAAW;YAClB,WAAW,EAAE,sCAAsC;YACnD,YAAY,EAAE,IAAI;YAClB,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;SACpC;KACD,CAAC;IAEF,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE;QAChD,IAAI,EAAE,cAAc;QACpB,QAAQ,EAAE,WAAW;KACrB,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY;IAC3B,MAAM,OAAO,GAAG,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,iCAAiC,CAAC,IAAI,EAAE,CAAC;IAC5F,MAAM,QAAQ,GAAG,UAAU,CAAC,cAAc,EAAE,OAAO,EAAE,sCAAsC,CAAC,IAAI,EAAE,CAAC;IACnG,MAAM,SAAS,GAAG,UAAU,CAAC,cAAc,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC;IAC1E,MAAM,SAAS,GAAG,UAAU,CAAC,cAAc,EAAE,WAAW,EAAE,aAAa,CAAC,IAAI,aAAa,CAAC;IAC1F,MAAM,WAAW,GAAG,UAAU,CAAC,cAAc,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC;IAE1E,OAAO;QACN,IAAI,EAAE,OAAO;aACX,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC;QACjB,KAAK,EAAE,QAAQ;aACb,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC;QACjB,SAAS;QACT,SAAS,EAAE,SAAS,KAAK,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa;QACtE,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;KAC3E,CAAC;AACH,CAAC","sourcesContent":["/**\n * Settings for the powerbar via pi-extension-settings.\n */\n\nimport type { OrderedListOption, SettingDefinition } from \"@juanibiapina/pi-extension-settings\";\nimport { getSetting } from \"@juanibiapina/pi-extension-settings\";\nimport type { ExtensionAPI } from \"@mariozechner/pi-coding-agent\";\n\nexport const EXTENSION_NAME = \"powerbar\";\n\nexport interface PowerbarSettings {\n\tleft: string[];\n\tright: string[];\n\tseparator: string;\n\tplacement: \"aboveEditor\" | \"belowEditor\";\n\tbarWidth: number;\n}\n\nexport function registerSettings(pi: ExtensionAPI, segmentOptions: OrderedListOption[]): void {\n\tconst definitions: SettingDefinition[] = [\n\t\t{\n\t\t\tid: \"left\",\n\t\t\tlabel: \"Left segments\",\n\t\t\tdescription: \"Segments shown on the left side of the powerbar\",\n\t\t\tdefaultValue: \"git-branch,tokens,context-usage\",\n\t\t\toptions: segmentOptions,\n\t\t},\n\t\t{\n\t\t\tid: \"right\",\n\t\t\tlabel: \"Right segments\",\n\t\t\tdescription: \"Segments shown on the right side of the powerbar\",\n\t\t\tdefaultValue: \"provider,model,sub-hourly,sub-weekly\",\n\t\t\toptions: segmentOptions,\n\t\t},\n\t\t{\n\t\t\tid: \"separator\",\n\t\t\tlabel: \"Separator\",\n\t\t\tdescription: \"Separator between segments\",\n\t\t\tdefaultValue: \" │ \",\n\t\t\tvalues: [\" │ \", \" ┃ \", \" | \", \" · \", \" \"],\n\t\t},\n\t\t{\n\t\t\tid: \"placement\",\n\t\t\tlabel: \"Placement\",\n\t\t\tdescription: \"Where the powerbar appears\",\n\t\t\tdefaultValue: \"belowEditor\",\n\t\t\tvalues: [\"belowEditor\", \"aboveEditor\"],\n\t\t},\n\t\t{\n\t\t\tid: \"bar-width\",\n\t\t\tlabel: \"Bar width\",\n\t\t\tdescription: \"Width of progress bars in characters\",\n\t\t\tdefaultValue: \"10\",\n\t\t\tvalues: [\"6\", \"8\", \"10\", \"12\", \"16\"],\n\t\t},\n\t];\n\n\tpi.events.emit(\"pi-extension-settings:register\", {\n\t\tname: EXTENSION_NAME,\n\t\tsettings: definitions,\n\t});\n}\n\nexport function loadSettings(): PowerbarSettings {\n\tconst leftStr = getSetting(EXTENSION_NAME, \"left\", \"git-branch,tokens,context-usage\") ?? \"\";\n\tconst rightStr = getSetting(EXTENSION_NAME, \"right\", \"provider,model,sub-hourly,sub-weekly\") ?? \"\";\n\tconst separator = getSetting(EXTENSION_NAME, \"separator\", \" │ \") ?? \" │ \";\n\tconst placement = getSetting(EXTENSION_NAME, \"placement\", \"belowEditor\") ?? \"belowEditor\";\n\tconst barWidthStr = getSetting(EXTENSION_NAME, \"bar-width\", \"10\") ?? \"10\";\n\n\treturn {\n\t\tleft: leftStr\n\t\t\t.split(\",\")\n\t\t\t.map((s) => s.trim())\n\t\t\t.filter(Boolean),\n\t\tright: rightStr\n\t\t\t.split(\",\")\n\t\t\t.map((s) => s.trim())\n\t\t\t.filter(Boolean),\n\t\tseparator,\n\t\tplacement: placement === \"aboveEditor\" ? \"aboveEditor\" : \"belowEditor\",\n\t\tbarWidth: Math.max(4, Math.min(24, Number.parseInt(barWidthStr, 10) || 10)),\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/powerbar-context/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,+BAA+B,CAAC;AA6BpF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAS9D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/powerbar-context/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,+BAA+B,CAAC;AA6BpF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAW9D"}
@@ -32,6 +32,7 @@ function resetContextUsage(pi) {
32
32
  });
33
33
  }
34
34
  export default function createExtension(pi) {
35
+ pi.events.emit("powerbar:register-segment", { id: "context-usage", label: "Context Usage" });
35
36
  // Reset on new/switched session
36
37
  pi.on("session_start", async () => resetContextUsage(pi));
37
38
  pi.on("session_switch", async () => resetContextUsage(pi));
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/powerbar-context/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,SAAS,QAAQ,CAAC,GAAW;IAC5B,IAAI,GAAG,GAAG,EAAE;QAAE,OAAO,OAAO,CAAC;IAC7B,IAAI,GAAG,GAAG,EAAE;QAAE,OAAO,SAAS,CAAC;IAC/B,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAgB,EAAE,GAAqB;IAChE,MAAM,KAAK,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;IACpC,IAAI,KAAK,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC;QACnE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACjC,EAAE,EAAE,eAAe;YACnB,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,GAAG,GAAG,GAAG;YACjB,GAAG,EAAE,GAAG;YACR,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC;SACpB,CAAC,CAAC;IACJ,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CAAC,EAAgB;IAC1C,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;QACjC,EAAE,EAAE,eAAe;QACnB,IAAI,EAAE,SAAS;KACf,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAgB;IACvD,gCAAgC;IAChC,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,EAAE,CAAC,EAAE,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;IAE3D,sCAAsC;IACtC,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IACtE,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IACvE,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AACrE,CAAC","sourcesContent":["/**\n * Powerbar Context Producer\n *\n * Shows context window usage as a progress bar with percentage.\n * Color changes based on usage level: accent → warning → error.\n * Segment ID: \"context-usage\"\n */\n\nimport type { ExtensionAPI, ExtensionContext } from \"@mariozechner/pi-coding-agent\";\n\nfunction getColor(pct: number): string {\n\tif (pct > 80) return \"error\";\n\tif (pct > 60) return \"warning\";\n\treturn \"muted\";\n}\n\nfunction emitContextUsage(pi: ExtensionAPI, ctx: ExtensionContext): void {\n\tconst usage = ctx.getContextUsage();\n\tif (usage) {\n\t\tconst pct = Math.round((usage.tokens / usage.contextWindow) * 100);\n\t\tpi.events.emit(\"powerbar:update\", {\n\t\t\tid: \"context-usage\",\n\t\t\ttext: \"\",\n\t\t\tsuffix: `${pct}%`,\n\t\t\tbar: pct,\n\t\t\tcolor: getColor(pct),\n\t\t});\n\t}\n}\n\nfunction resetContextUsage(pi: ExtensionAPI): void {\n\tpi.events.emit(\"powerbar:update\", {\n\t\tid: \"context-usage\",\n\t\ttext: undefined,\n\t});\n}\n\nexport default function createExtension(pi: ExtensionAPI): void {\n\t// Reset on new/switched session\n\tpi.on(\"session_start\", async () => resetContextUsage(pi));\n\tpi.on(\"session_switch\", async () => resetContextUsage(pi));\n\n\t// Update frequently during agent work\n\tpi.on(\"turn_start\", async (_event, ctx) => emitContextUsage(pi, ctx));\n\tpi.on(\"tool_result\", async (_event, ctx) => emitContextUsage(pi, ctx));\n\tpi.on(\"turn_end\", async (_event, ctx) => emitContextUsage(pi, ctx));\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/powerbar-context/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,SAAS,QAAQ,CAAC,GAAW;IAC5B,IAAI,GAAG,GAAG,EAAE;QAAE,OAAO,OAAO,CAAC;IAC7B,IAAI,GAAG,GAAG,EAAE;QAAE,OAAO,SAAS,CAAC;IAC/B,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAgB,EAAE,GAAqB;IAChE,MAAM,KAAK,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;IACpC,IAAI,KAAK,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC;QACnE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACjC,EAAE,EAAE,eAAe;YACnB,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,GAAG,GAAG,GAAG;YACjB,GAAG,EAAE,GAAG;YACR,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC;SACpB,CAAC,CAAC;IACJ,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CAAC,EAAgB;IAC1C,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;QACjC,EAAE,EAAE,eAAe;QACnB,IAAI,EAAE,SAAS;KACf,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAgB;IACvD,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;IAE7F,gCAAgC;IAChC,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,EAAE,CAAC,EAAE,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;IAE3D,sCAAsC;IACtC,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IACtE,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IACvE,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AACrE,CAAC","sourcesContent":["/**\n * Powerbar Context Producer\n *\n * Shows context window usage as a progress bar with percentage.\n * Color changes based on usage level: accent → warning → error.\n * Segment ID: \"context-usage\"\n */\n\nimport type { ExtensionAPI, ExtensionContext } from \"@mariozechner/pi-coding-agent\";\n\nfunction getColor(pct: number): string {\n\tif (pct > 80) return \"error\";\n\tif (pct > 60) return \"warning\";\n\treturn \"muted\";\n}\n\nfunction emitContextUsage(pi: ExtensionAPI, ctx: ExtensionContext): void {\n\tconst usage = ctx.getContextUsage();\n\tif (usage) {\n\t\tconst pct = Math.round((usage.tokens / usage.contextWindow) * 100);\n\t\tpi.events.emit(\"powerbar:update\", {\n\t\t\tid: \"context-usage\",\n\t\t\ttext: \"\",\n\t\t\tsuffix: `${pct}%`,\n\t\t\tbar: pct,\n\t\t\tcolor: getColor(pct),\n\t\t});\n\t}\n}\n\nfunction resetContextUsage(pi: ExtensionAPI): void {\n\tpi.events.emit(\"powerbar:update\", {\n\t\tid: \"context-usage\",\n\t\ttext: undefined,\n\t});\n}\n\nexport default function createExtension(pi: ExtensionAPI): void {\n\tpi.events.emit(\"powerbar:register-segment\", { id: \"context-usage\", label: \"Context Usage\" });\n\n\t// Reset on new/switched session\n\tpi.on(\"session_start\", async () => resetContextUsage(pi));\n\tpi.on(\"session_switch\", async () => resetContextUsage(pi));\n\n\t// Update frequently during agent work\n\tpi.on(\"turn_start\", async (_event, ctx) => emitContextUsage(pi, ctx));\n\tpi.on(\"tool_result\", async (_event, ctx) => emitContextUsage(pi, ctx));\n\tpi.on(\"turn_end\", async (_event, ctx) => emitContextUsage(pi, ctx));\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/powerbar-git/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,+BAA+B,CAAC;AAkCpF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAe9D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/powerbar-git/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,+BAA+B,CAAC;AAkCpF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAiB9D"}
@@ -37,6 +37,7 @@ function emitBranch(pi, ctx) {
37
37
  }
38
38
  }
39
39
  export default function createExtension(pi) {
40
+ pi.events.emit("powerbar:register-segment", { id: "git-branch", label: "Git Branch" });
40
41
  pi.on("session_start", async (_event, ctx) => {
41
42
  emitBranch(pi, ctx);
42
43
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/powerbar-git/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,SAAS,YAAY,CAAC,GAAW;IAChC,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACrE,IAAI,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACzC,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;QACD,kCAAkC;QAClC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED,SAAS,UAAU,CAAC,EAAgB,EAAE,GAAqB;IAC1D,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,MAAM,EAAE,CAAC;QACZ,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACjC,EAAE,EAAE,YAAY;YAChB,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,GAAG;YACT,KAAK,EAAE,OAAO;SACd,CAAC,CAAC;IACJ,CAAC;SAAM,CAAC;QACP,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACjC,EAAE,EAAE,YAAY;YAChB,IAAI,EAAE,SAAS;SACf,CAAC,CAAC;IACJ,CAAC;AACF,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAgB;IACvD,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC5C,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC7C,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,+DAA+D;IAC/D,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACzC,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YAC/B,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACrB,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Powerbar Git Producer\n *\n * Shows the current git branch.\n * Segment ID: \"git-branch\"\n */\n\nimport type { ExtensionAPI, ExtensionContext } from \"@mariozechner/pi-coding-agent\";\nimport { readFileSync } from \"fs\";\nimport { join } from \"path\";\n\nfunction getGitBranch(cwd: string): string | undefined {\n\ttry {\n\t\tconst head = readFileSync(join(cwd, \".git\", \"HEAD\"), \"utf-8\").trim();\n\t\tif (head.startsWith(\"ref: refs/heads/\")) {\n\t\t\treturn head.slice(16);\n\t\t}\n\t\t// Detached HEAD — show short hash\n\t\treturn head.slice(0, 8);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction emitBranch(pi: ExtensionAPI, ctx: ExtensionContext): void {\n\tconst branch = getGitBranch(ctx.cwd);\n\tif (branch) {\n\t\tpi.events.emit(\"powerbar:update\", {\n\t\t\tid: \"git-branch\",\n\t\t\ttext: branch,\n\t\t\ticon: \"⎇\",\n\t\t\tcolor: \"muted\",\n\t\t});\n\t} else {\n\t\tpi.events.emit(\"powerbar:update\", {\n\t\t\tid: \"git-branch\",\n\t\t\ttext: undefined,\n\t\t});\n\t}\n}\n\nexport default function createExtension(pi: ExtensionAPI): void {\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\temitBranch(pi, ctx);\n\t});\n\n\tpi.on(\"session_switch\", async (_event, ctx) => {\n\t\temitBranch(pi, ctx);\n\t});\n\n\t// Refresh after bash commands (user may have changed branches)\n\tpi.on(\"tool_result\", async (event, ctx) => {\n\t\tif (event.toolName === \"bash\") {\n\t\t\temitBranch(pi, ctx);\n\t\t}\n\t});\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/powerbar-git/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,SAAS,YAAY,CAAC,GAAW;IAChC,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACrE,IAAI,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACzC,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;QACD,kCAAkC;QAClC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED,SAAS,UAAU,CAAC,EAAgB,EAAE,GAAqB;IAC1D,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,MAAM,EAAE,CAAC;QACZ,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACjC,EAAE,EAAE,YAAY;YAChB,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,GAAG;YACT,KAAK,EAAE,OAAO;SACd,CAAC,CAAC;IACJ,CAAC;SAAM,CAAC;QACP,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACjC,EAAE,EAAE,YAAY;YAChB,IAAI,EAAE,SAAS;SACf,CAAC,CAAC;IACJ,CAAC;AACF,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAgB;IACvD,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;IAEvF,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC5C,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC7C,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,+DAA+D;IAC/D,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACzC,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YAC/B,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACrB,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Powerbar Git Producer\n *\n * Shows the current git branch.\n * Segment ID: \"git-branch\"\n */\n\nimport type { ExtensionAPI, ExtensionContext } from \"@mariozechner/pi-coding-agent\";\nimport { readFileSync } from \"fs\";\nimport { join } from \"path\";\n\nfunction getGitBranch(cwd: string): string | undefined {\n\ttry {\n\t\tconst head = readFileSync(join(cwd, \".git\", \"HEAD\"), \"utf-8\").trim();\n\t\tif (head.startsWith(\"ref: refs/heads/\")) {\n\t\t\treturn head.slice(16);\n\t\t}\n\t\t// Detached HEAD — show short hash\n\t\treturn head.slice(0, 8);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction emitBranch(pi: ExtensionAPI, ctx: ExtensionContext): void {\n\tconst branch = getGitBranch(ctx.cwd);\n\tif (branch) {\n\t\tpi.events.emit(\"powerbar:update\", {\n\t\t\tid: \"git-branch\",\n\t\t\ttext: branch,\n\t\t\ticon: \"⎇\",\n\t\t\tcolor: \"muted\",\n\t\t});\n\t} else {\n\t\tpi.events.emit(\"powerbar:update\", {\n\t\t\tid: \"git-branch\",\n\t\t\ttext: undefined,\n\t\t});\n\t}\n}\n\nexport default function createExtension(pi: ExtensionAPI): void {\n\tpi.events.emit(\"powerbar:register-segment\", { id: \"git-branch\", label: \"Git Branch\" });\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\temitBranch(pi, ctx);\n\t});\n\n\tpi.on(\"session_switch\", async (_event, ctx) => {\n\t\temitBranch(pi, ctx);\n\t});\n\n\t// Refresh after bash commands (user may have changed branches)\n\tpi.on(\"tool_result\", async (event, ctx) => {\n\t\tif (event.toolName === \"bash\") {\n\t\t\temitBranch(pi, ctx);\n\t\t}\n\t});\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/powerbar-model/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,+BAA+B,CAAC;AAsBpF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAgB9D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/powerbar-model/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,+BAA+B,CAAC;AAsBpF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAkB9D"}
@@ -22,6 +22,7 @@ function emitModel(pi, ctx) {
22
22
  });
23
23
  }
24
24
  export default function createExtension(pi) {
25
+ pi.events.emit("powerbar:register-segment", { id: "model", label: "Model" });
25
26
  pi.on("session_start", async (_event, ctx) => {
26
27
  emitModel(pi, ctx);
27
28
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/powerbar-model/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,SAAS,SAAS,CAAC,EAAgB,EAAE,GAAqB;IACzD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IACxB,IAAI,CAAC,KAAK;QAAE,OAAO;IAEnB,MAAM,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC;IACzB,IAAI,IAAI,GAAG,OAAO,CAAC;IAEnB,iDAAiD;IACjD,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,EAAE,CAAC,gBAAgB,EAAE,CAAC;QACpC,IAAI,GAAG,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,MAAM,KAAK,EAAE,CAAC;IACvE,CAAC;IAED,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;QACjC,EAAE,EAAE,OAAO;QACX,IAAI;QACJ,KAAK,EAAE,KAAK;KACZ,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAgB;IACvD,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC5C,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC7C,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC3C,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QACzC,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Powerbar Model Producer\n *\n * Shows the current model name and thinking level.\n * Segment ID: \"model\"\n */\n\nimport type { ExtensionAPI, ExtensionContext } from \"@mariozechner/pi-coding-agent\";\n\nfunction emitModel(pi: ExtensionAPI, ctx: ExtensionContext): void {\n\tconst model = ctx.model;\n\tif (!model) return;\n\n\tconst modelId = model.id;\n\tlet text = modelId;\n\n\t// Add thinking level if model supports reasoning\n\tif (model.reasoning) {\n\t\tconst level = pi.getThinkingLevel();\n\t\ttext = level === \"off\" ? `${modelId} · off` : `${modelId} · ${level}`;\n\t}\n\n\tpi.events.emit(\"powerbar:update\", {\n\t\tid: \"model\",\n\t\ttext,\n\t\tcolor: \"dim\",\n\t});\n}\n\nexport default function createExtension(pi: ExtensionAPI): void {\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\temitModel(pi, ctx);\n\t});\n\n\tpi.on(\"session_switch\", async (_event, ctx) => {\n\t\temitModel(pi, ctx);\n\t});\n\n\tpi.on(\"model_select\", async (_event, ctx) => {\n\t\temitModel(pi, ctx);\n\t});\n\n\tpi.on(\"turn_start\", async (_event, ctx) => {\n\t\temitModel(pi, ctx);\n\t});\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/powerbar-model/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,SAAS,SAAS,CAAC,EAAgB,EAAE,GAAqB;IACzD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IACxB,IAAI,CAAC,KAAK;QAAE,OAAO;IAEnB,MAAM,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC;IACzB,IAAI,IAAI,GAAG,OAAO,CAAC;IAEnB,iDAAiD;IACjD,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,EAAE,CAAC,gBAAgB,EAAE,CAAC;QACpC,IAAI,GAAG,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,MAAM,KAAK,EAAE,CAAC;IACvE,CAAC;IAED,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;QACjC,EAAE,EAAE,OAAO;QACX,IAAI;QACJ,KAAK,EAAE,KAAK;KACZ,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAgB;IACvD,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAE7E,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC5C,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC7C,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC3C,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QACzC,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Powerbar Model Producer\n *\n * Shows the current model name and thinking level.\n * Segment ID: \"model\"\n */\n\nimport type { ExtensionAPI, ExtensionContext } from \"@mariozechner/pi-coding-agent\";\n\nfunction emitModel(pi: ExtensionAPI, ctx: ExtensionContext): void {\n\tconst model = ctx.model;\n\tif (!model) return;\n\n\tconst modelId = model.id;\n\tlet text = modelId;\n\n\t// Add thinking level if model supports reasoning\n\tif (model.reasoning) {\n\t\tconst level = pi.getThinkingLevel();\n\t\ttext = level === \"off\" ? `${modelId} · off` : `${modelId} · ${level}`;\n\t}\n\n\tpi.events.emit(\"powerbar:update\", {\n\t\tid: \"model\",\n\t\ttext,\n\t\tcolor: \"dim\",\n\t});\n}\n\nexport default function createExtension(pi: ExtensionAPI): void {\n\tpi.events.emit(\"powerbar:register-segment\", { id: \"model\", label: \"Model\" });\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\temitModel(pi, ctx);\n\t});\n\n\tpi.on(\"session_switch\", async (_event, ctx) => {\n\t\temitModel(pi, ctx);\n\t});\n\n\tpi.on(\"model_select\", async (_event, ctx) => {\n\t\temitModel(pi, ctx);\n\t});\n\n\tpi.on(\"turn_start\", async (_event, ctx) => {\n\t\temitModel(pi, ctx);\n\t});\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/powerbar-provider/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,+BAA+B,CAAC;AAapF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAgB9D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/powerbar-provider/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,+BAA+B,CAAC;AAapF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAkB9D"}
@@ -15,6 +15,7 @@ function emitProvider(pi, ctx) {
15
15
  });
16
16
  }
17
17
  export default function createExtension(pi) {
18
+ pi.events.emit("powerbar:register-segment", { id: "provider", label: "Provider" });
18
19
  pi.on("session_start", async (_event, ctx) => {
19
20
  emitProvider(pi, ctx);
20
21
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/powerbar-provider/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,SAAS,YAAY,CAAC,EAAgB,EAAE,GAAqB;IAC5D,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IACxB,IAAI,CAAC,KAAK;QAAE,OAAO;IAEnB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;QACjC,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,KAAK,CAAC,QAAQ;QACpB,KAAK,EAAE,KAAK;KACZ,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAgB;IACvD,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC5C,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC7C,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC3C,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QACzC,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Powerbar Provider Producer\n *\n * Shows the current LLM provider name.\n * Segment ID: \"provider\"\n */\n\nimport type { ExtensionAPI, ExtensionContext } from \"@mariozechner/pi-coding-agent\";\n\nfunction emitProvider(pi: ExtensionAPI, ctx: ExtensionContext): void {\n\tconst model = ctx.model;\n\tif (!model) return;\n\n\tpi.events.emit(\"powerbar:update\", {\n\t\tid: \"provider\",\n\t\ttext: model.provider,\n\t\tcolor: \"dim\",\n\t});\n}\n\nexport default function createExtension(pi: ExtensionAPI): void {\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\temitProvider(pi, ctx);\n\t});\n\n\tpi.on(\"session_switch\", async (_event, ctx) => {\n\t\temitProvider(pi, ctx);\n\t});\n\n\tpi.on(\"model_select\", async (_event, ctx) => {\n\t\temitProvider(pi, ctx);\n\t});\n\n\tpi.on(\"turn_start\", async (_event, ctx) => {\n\t\temitProvider(pi, ctx);\n\t});\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/powerbar-provider/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,SAAS,YAAY,CAAC,EAAgB,EAAE,GAAqB;IAC5D,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IACxB,IAAI,CAAC,KAAK;QAAE,OAAO;IAEnB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;QACjC,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,KAAK,CAAC,QAAQ;QACpB,KAAK,EAAE,KAAK;KACZ,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAgB;IACvD,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;IAEnF,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC5C,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC7C,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC3C,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QACzC,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Powerbar Provider Producer\n *\n * Shows the current LLM provider name.\n * Segment ID: \"provider\"\n */\n\nimport type { ExtensionAPI, ExtensionContext } from \"@mariozechner/pi-coding-agent\";\n\nfunction emitProvider(pi: ExtensionAPI, ctx: ExtensionContext): void {\n\tconst model = ctx.model;\n\tif (!model) return;\n\n\tpi.events.emit(\"powerbar:update\", {\n\t\tid: \"provider\",\n\t\ttext: model.provider,\n\t\tcolor: \"dim\",\n\t});\n}\n\nexport default function createExtension(pi: ExtensionAPI): void {\n\tpi.events.emit(\"powerbar:register-segment\", { id: \"provider\", label: \"Provider\" });\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\temitProvider(pi, ctx);\n\t});\n\n\tpi.on(\"session_switch\", async (_event, ctx) => {\n\t\temitProvider(pi, ctx);\n\t});\n\n\tpi.on(\"model_select\", async (_event, ctx) => {\n\t\temitProvider(pi, ctx);\n\t});\n\n\tpi.on(\"turn_start\", async (_event, ctx) => {\n\t\temitProvider(pi, ctx);\n\t});\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/powerbar-sub/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AA0ClE,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAgB9D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/powerbar-sub/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AA0ClE,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAmB9D"}
@@ -45,6 +45,8 @@ function emitUsage(pi, usage) {
45
45
  emitWindow(pi, "sub-weekly", usage.windows[1]);
46
46
  }
47
47
  export default function createExtension(pi) {
48
+ pi.events.emit("powerbar:register-segment", { id: "sub-hourly", label: "Sub Hourly" });
49
+ pi.events.emit("powerbar:register-segment", { id: "sub-weekly", label: "Sub Weekly" });
48
50
  pi.events.on("sub-core:ready", (payload) => {
49
51
  const data = payload;
50
52
  emitUsage(pi, data.state?.usage);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/powerbar-sub/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Powerbar Sub Producer\n *\n * Shows subscription usage from pi-sub-core.\n * Sub-core is loaded by pi as a sibling extension (declared in package.json pi.extensions).\n * This producer just listens to sub-core events and emits powerbar segments.\n *\n * Segment IDs: \"sub-hourly\", \"sub-weekly\"\n */\n\nimport type { RateWindow, SubCoreAllState, SubCoreState, UsageSnapshot } from \"@marckrenn/pi-sub-shared\";\nimport type { ExtensionAPI } from \"@mariozechner/pi-coding-agent\";\n\nfunction getColor(pct: number): string {\n\tif (pct > 80) return \"error\";\n\tif (pct > 60) return \"warning\";\n\treturn \"muted\";\n}\n\nfunction emitWindow(pi: ExtensionAPI, segmentId: string, window: RateWindow | undefined): void {\n\tif (!window) {\n\t\tpi.events.emit(\"powerbar:update\", { id: segmentId, text: undefined });\n\t\treturn;\n\t}\n\n\tconst pct = Math.round(window.usedPercent);\n\tconst label = window.label || \"\";\n\tconst reset = window.resetDescription || \"\";\n\n\tconst textParts: string[] = [];\n\tif (label) textParts.push(label);\n\tif (reset) textParts.push(reset);\n\n\tpi.events.emit(\"powerbar:update\", {\n\t\tid: segmentId,\n\t\ttext: textParts.join(\" \"),\n\t\tsuffix: `${pct}%`,\n\t\tbar: pct,\n\t\tcolor: getColor(pct),\n\t});\n}\n\nfunction emitUsage(pi: ExtensionAPI, usage: UsageSnapshot | undefined): void {\n\tif (!usage || usage.windows.length === 0) {\n\t\tpi.events.emit(\"powerbar:update\", { id: \"sub-hourly\", text: undefined });\n\t\tpi.events.emit(\"powerbar:update\", { id: \"sub-weekly\", text: undefined });\n\t\treturn;\n\t}\n\n\temitWindow(pi, \"sub-hourly\", usage.windows[0]);\n\temitWindow(pi, \"sub-weekly\", usage.windows[1]);\n}\n\nexport default function createExtension(pi: ExtensionAPI): void {\n\tpi.events.on(\"sub-core:ready\", (payload: unknown) => {\n\t\tconst data = payload as { state?: SubCoreState };\n\t\temitUsage(pi, data.state?.usage);\n\t});\n\n\tpi.events.on(\"sub-core:update-current\", (payload: unknown) => {\n\t\tconst data = payload as { state?: SubCoreState };\n\t\temitUsage(pi, data.state?.usage);\n\t});\n\n\tpi.events.on(\"sub-core:update-all\", (payload: unknown) => {\n\t\tconst data = payload as { state?: SubCoreAllState };\n\t\tconst entry = data.state?.entries?.[0];\n\t\temitUsage(pi, entry?.usage);\n\t});\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/powerbar-sub/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Powerbar Sub Producer\n *\n * Shows subscription usage from pi-sub-core.\n * Sub-core is loaded by pi as a sibling extension (declared in package.json pi.extensions).\n * This producer just listens to sub-core events and emits powerbar segments.\n *\n * Segment IDs: \"sub-hourly\", \"sub-weekly\"\n */\n\nimport type { RateWindow, SubCoreAllState, SubCoreState, UsageSnapshot } from \"@marckrenn/pi-sub-shared\";\nimport type { ExtensionAPI } from \"@mariozechner/pi-coding-agent\";\n\nfunction getColor(pct: number): string {\n\tif (pct > 80) return \"error\";\n\tif (pct > 60) return \"warning\";\n\treturn \"muted\";\n}\n\nfunction emitWindow(pi: ExtensionAPI, segmentId: string, window: RateWindow | undefined): void {\n\tif (!window) {\n\t\tpi.events.emit(\"powerbar:update\", { id: segmentId, text: undefined });\n\t\treturn;\n\t}\n\n\tconst pct = Math.round(window.usedPercent);\n\tconst label = window.label || \"\";\n\tconst reset = window.resetDescription || \"\";\n\n\tconst textParts: string[] = [];\n\tif (label) textParts.push(label);\n\tif (reset) textParts.push(reset);\n\n\tpi.events.emit(\"powerbar:update\", {\n\t\tid: segmentId,\n\t\ttext: textParts.join(\" \"),\n\t\tsuffix: `${pct}%`,\n\t\tbar: pct,\n\t\tcolor: getColor(pct),\n\t});\n}\n\nfunction emitUsage(pi: ExtensionAPI, usage: UsageSnapshot | undefined): void {\n\tif (!usage || usage.windows.length === 0) {\n\t\tpi.events.emit(\"powerbar:update\", { id: \"sub-hourly\", text: undefined });\n\t\tpi.events.emit(\"powerbar:update\", { id: \"sub-weekly\", text: undefined });\n\t\treturn;\n\t}\n\n\temitWindow(pi, \"sub-hourly\", usage.windows[0]);\n\temitWindow(pi, \"sub-weekly\", usage.windows[1]);\n}\n\nexport default function createExtension(pi: ExtensionAPI): void {\n\tpi.events.emit(\"powerbar:register-segment\", { id: \"sub-hourly\", label: \"Sub Hourly\" });\n\tpi.events.emit(\"powerbar:register-segment\", { id: \"sub-weekly\", label: \"Sub Weekly\" });\n\n\tpi.events.on(\"sub-core:ready\", (payload: unknown) => {\n\t\tconst data = payload as { state?: SubCoreState };\n\t\temitUsage(pi, data.state?.usage);\n\t});\n\n\tpi.events.on(\"sub-core:update-current\", (payload: unknown) => {\n\t\tconst data = payload as { state?: SubCoreState };\n\t\temitUsage(pi, data.state?.usage);\n\t});\n\n\tpi.events.on(\"sub-core:update-all\", (payload: unknown) => {\n\t\tconst data = payload as { state?: SubCoreAllState };\n\t\tconst entry = data.state?.entries?.[0];\n\t\temitUsage(pi, entry?.usage);\n\t});\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/powerbar-tokens/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,+BAA+B,CAAC;AAgDpF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAQ9D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/powerbar-tokens/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,+BAA+B,CAAC;AAgDpF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAU9D"}
@@ -48,6 +48,7 @@ function resetTokens(pi) {
48
48
  });
49
49
  }
50
50
  export default function createExtension(pi) {
51
+ pi.events.emit("powerbar:register-segment", { id: "tokens", label: "Tokens" });
51
52
  // Reset on new/switched session
52
53
  pi.on("session_start", async () => resetTokens(pi));
53
54
  pi.on("session_switch", async () => resetTokens(pi));
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/powerbar-tokens/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Powerbar Tokens Producer\n *\n * Shows cumulative token stats and session cost.\n * Segment ID: \"tokens\"\n */\n\nimport type { ExtensionAPI, ExtensionContext } from \"@mariozechner/pi-coding-agent\";\n\nfunction formatTokens(count: number): string {\n\tif (count < 1000) return count.toString();\n\tif (count < 10000) return `${(count / 1000).toFixed(1)}k`;\n\tif (count < 1000000) return `${Math.round(count / 1000)}k`;\n\tif (count < 10000000) return `${(count / 1000000).toFixed(1)}M`;\n\treturn `${Math.round(count / 1000000)}M`;\n}\n\nfunction emitTokens(pi: ExtensionAPI, ctx: ExtensionContext): void {\n\tconst entries = ctx.sessionManager.getEntries();\n\n\tlet totalInput = 0;\n\tlet totalOutput = 0;\n\tlet totalCost = 0;\n\n\tfor (const entry of entries) {\n\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\ttotalInput += entry.message.usage.input;\n\t\t\ttotalOutput += entry.message.usage.output;\n\t\t\ttotalCost += entry.message.usage.cost.total;\n\t\t}\n\t}\n\n\tif (totalInput === 0 && totalOutput === 0) return;\n\n\tconst parts: string[] = [];\n\tparts.push(`↑${formatTokens(totalInput)}`);\n\tparts.push(`↓${formatTokens(totalOutput)}`);\n\tif (totalCost > 0) {\n\t\tparts.push(`$${totalCost.toFixed(2)}`);\n\t}\n\n\tpi.events.emit(\"powerbar:update\", {\n\t\tid: \"tokens\",\n\t\ttext: parts.join(\" \"),\n\t\tcolor: \"dim\",\n\t});\n}\n\nfunction resetTokens(pi: ExtensionAPI): void {\n\tpi.events.emit(\"powerbar:update\", {\n\t\tid: \"tokens\",\n\t\ttext: undefined,\n\t});\n}\n\nexport default function createExtension(pi: ExtensionAPI): void {\n\t// Reset on new/switched session\n\tpi.on(\"session_start\", async () => resetTokens(pi));\n\tpi.on(\"session_switch\", async () => resetTokens(pi));\n\n\t// Update frequently during agent work\n\tpi.on(\"tool_result\", async (_event, ctx) => emitTokens(pi, ctx));\n\tpi.on(\"turn_end\", async (_event, ctx) => emitTokens(pi, ctx));\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/powerbar-tokens/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Powerbar Tokens Producer\n *\n * Shows cumulative token stats and session cost.\n * Segment ID: \"tokens\"\n */\n\nimport type { ExtensionAPI, ExtensionContext } from \"@mariozechner/pi-coding-agent\";\n\nfunction formatTokens(count: number): string {\n\tif (count < 1000) return count.toString();\n\tif (count < 10000) return `${(count / 1000).toFixed(1)}k`;\n\tif (count < 1000000) return `${Math.round(count / 1000)}k`;\n\tif (count < 10000000) return `${(count / 1000000).toFixed(1)}M`;\n\treturn `${Math.round(count / 1000000)}M`;\n}\n\nfunction emitTokens(pi: ExtensionAPI, ctx: ExtensionContext): void {\n\tconst entries = ctx.sessionManager.getEntries();\n\n\tlet totalInput = 0;\n\tlet totalOutput = 0;\n\tlet totalCost = 0;\n\n\tfor (const entry of entries) {\n\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\ttotalInput += entry.message.usage.input;\n\t\t\ttotalOutput += entry.message.usage.output;\n\t\t\ttotalCost += entry.message.usage.cost.total;\n\t\t}\n\t}\n\n\tif (totalInput === 0 && totalOutput === 0) return;\n\n\tconst parts: string[] = [];\n\tparts.push(`↑${formatTokens(totalInput)}`);\n\tparts.push(`↓${formatTokens(totalOutput)}`);\n\tif (totalCost > 0) {\n\t\tparts.push(`$${totalCost.toFixed(2)}`);\n\t}\n\n\tpi.events.emit(\"powerbar:update\", {\n\t\tid: \"tokens\",\n\t\ttext: parts.join(\" \"),\n\t\tcolor: \"dim\",\n\t});\n}\n\nfunction resetTokens(pi: ExtensionAPI): void {\n\tpi.events.emit(\"powerbar:update\", {\n\t\tid: \"tokens\",\n\t\ttext: undefined,\n\t});\n}\n\nexport default function createExtension(pi: ExtensionAPI): void {\n\tpi.events.emit(\"powerbar:register-segment\", { id: \"tokens\", label: \"Tokens\" });\n\n\t// Reset on new/switched session\n\tpi.on(\"session_start\", async () => resetTokens(pi));\n\tpi.on(\"session_switch\", async () => resetTokens(pi));\n\n\t// Update frequently during agent work\n\tpi.on(\"tool_result\", async (_event, ctx) => emitTokens(pi, ctx));\n\tpi.on(\"turn_end\", async (_event, ctx) => emitTokens(pi, ctx));\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@juanibiapina/pi-powerbar",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Pi extension that renders a persistent powerline status bar with left/right segments updated via events",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",