@juanibiapina/pi-powerbar 0.9.1 → 0.10.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/dist/powerbar/index.d.ts +1 -1
- package/dist/powerbar/index.d.ts.map +1 -1
- package/dist/powerbar/index.js.map +1 -1
- package/dist/powerbar/render.d.ts +1 -1
- package/dist/powerbar/render.d.ts.map +1 -1
- package/dist/powerbar/render.js +1 -1
- package/dist/powerbar/render.js.map +1 -1
- package/dist/powerbar/settings.d.ts +1 -1
- package/dist/powerbar/settings.d.ts.map +1 -1
- package/dist/powerbar/settings.js.map +1 -1
- package/dist/powerbar-context/index.d.ts +1 -1
- package/dist/powerbar-context/index.d.ts.map +1 -1
- package/dist/powerbar-context/index.js.map +1 -1
- package/dist/powerbar-git/index.d.ts +1 -1
- package/dist/powerbar-git/index.d.ts.map +1 -1
- package/dist/powerbar-git/index.js.map +1 -1
- package/dist/powerbar-model/index.d.ts +1 -1
- package/dist/powerbar-model/index.d.ts.map +1 -1
- package/dist/powerbar-model/index.js.map +1 -1
- package/dist/powerbar-provider/index.d.ts +1 -1
- package/dist/powerbar-provider/index.d.ts.map +1 -1
- package/dist/powerbar-provider/index.js.map +1 -1
- package/dist/powerbar-sub/index.d.ts +1 -1
- package/dist/powerbar-sub/index.d.ts.map +1 -1
- package/dist/powerbar-sub/index.js.map +1 -1
- package/dist/powerbar-tokens/index.d.ts +1 -1
- package/dist/powerbar-tokens/index.d.ts.map +1 -1
- package/dist/powerbar-tokens/index.js +2 -1
- package/dist/powerbar-tokens/index.js.map +1 -1
- package/package.json +6 -6
package/dist/powerbar/index.d.ts
CHANGED
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
* Listens for "powerbar:update" events from producer extensions,
|
|
5
5
|
* maintains a segment store, and renders a powerline-style widget.
|
|
6
6
|
*/
|
|
7
|
-
import type { ExtensionAPI } from "@
|
|
7
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
8
8
|
export default function createExtension(pi: ExtensionAPI): void;
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/powerbar/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAA6B,MAAM
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/powerbar/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAA6B,MAAM,iCAAiC,CAAC;AA+B/F,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAqF9D"}
|
|
@@ -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 { OrderedListOption } from \"@juanibiapina/pi-extension-settings\";\nimport type { ExtensionAPI, ExtensionUIContext, Theme } from \"@
|
|
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 { OrderedListOption } from \"@juanibiapina/pi-extension-settings\";\nimport type { ExtensionAPI, ExtensionUIContext, Theme } from \"@earendil-works/pi-coding-agent\";\nimport type { Component, TUI } from \"@earendil-works/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\tbarSegments?: number;\n}\n\ninterface SegmentRegistration {\n\tid: string;\n\tlabel: string;\n}\n\nfunction segmentEquals(left: Segment | undefined, right: Segment): boolean {\n\treturn (\n\t\tleft?.text === right.text &&\n\t\tleft.suffix === right.suffix &&\n\t\tleft.icon === right.icon &&\n\t\tleft.color === right.color &&\n\t\tleft.bar === right.bar &&\n\t\tleft.barSegments === right.barSegments\n\t);\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\tconst changed = segments.delete(payload.id);\n\t\t\tif (!changed) return;\n\t\t} else {\n\t\t\tconst nextSegment: Segment = {\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\tbarSegments: payload.barSegments,\n\t\t\t};\n\t\t\tif (segmentEquals(segments.get(payload.id), nextSegment)) return;\n\t\t\tsegments.set(payload.id, nextSegment);\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_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"]}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* continuous (█ + partial-width glyphs ▏▎▍▌▋▊▉) and blocks
|
|
7
7
|
* (discrete partial-height glyphs ▁▂▃▄▅▆▇█ with dim background).
|
|
8
8
|
*/
|
|
9
|
-
import type { Theme } from "@
|
|
9
|
+
import type { Theme } from "@earendil-works/pi-coding-agent";
|
|
10
10
|
import type { PowerbarSettings } from "./settings.js";
|
|
11
11
|
export interface Segment {
|
|
12
12
|
id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/powerbar/render.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAc,MAAM
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/powerbar/render.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAc,MAAM,iCAAiC,CAAC;AAEzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,MAAM,WAAW,OAAO;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+FAA+F;IAC/F,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAqJD,wBAAgB,SAAS,CACxB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,QAAQ,EAAE,gBAAgB,EAC1B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,GACX,MAAM,CAoCR"}
|
package/dist/powerbar/render.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* continuous (█ + partial-width glyphs ▏▎▍▌▋▊▉) and blocks
|
|
7
7
|
* (discrete partial-height glyphs ▁▂▃▄▅▆▇█ with dim background).
|
|
8
8
|
*/
|
|
9
|
-
import { truncateToWidth, visibleWidth } from "@
|
|
9
|
+
import { truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
|
|
10
10
|
/**
|
|
11
11
|
* Render a continuous progress bar using full-width block characters.
|
|
12
12
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/powerbar/render.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAiBrE;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,OAAe,EAAE,KAAa,EAAE,KAAY,EAAE,KAAa;IACrF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC;IAE3C,yEAAyE;IACzE,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAEnD,MAAM,UAAU,GAAG,KAAmB,CAAC;IACvC,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAEzC,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,UAAU,GAAG,KAAK,GAAG,UAAU,CAAC;IAEpC,IAAI,SAAS,IAAI,MAAM,IAAI,UAAU,GAAG,KAAK,EAAE,CAAC;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3F,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QAC7B,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAExC,OAAO,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,GAAG,QAAQ,CAAC;AAC7D,CAAC;AAED,kFAAkF;AAClF,SAAS,UAAU,CAAC,MAAc;IACjC,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,eAAe,CAAC,OAAe,EAAE,QAAgB,EAAE,KAAY,EAAE,KAAa;IACtF,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,IAAI,OAAO,CAAe,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,kBAAkB,CAAC;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC;IAE/C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,OAAgB,EAAE,QAA0B,EAAE,KAAY;IACpF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAe,CAAC;IAE5D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC;QACvC,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACpC,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,IAAI,QAAQ,CAAC,QAAQ,CAAC;YAC5D,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACP,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAC7E,CAAC;IACF,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAOD,SAAS,kBAAkB,CAC1B,GAAa,EACb,QAA8B,EAC9B,QAA0B,EAC1B,KAAY;IAEZ,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC;YAAE,SAAS;QAC1E,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QACrD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,SAAS,YAAY,CAAC,QAA2B,EAAE,SAAiB,EAAE,cAAsB;IAC3F,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,cAAc,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrG,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,QAA2B,EAAE,QAAgB;IAClE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAElC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC;YACnD,SAAS,GAAG,CAAC,CAAC;QACf,CAAC;IACF,CAAC;IAED,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC;IACtD,QAAQ,CAAC,SAAS,CAAC,GAAG;QACrB,IAAI,EAAE,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC;QACjD,KAAK,EAAE,WAAW;KAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CACxB,QAA8B,EAC9B,QAA0B,EAC1B,KAAY,EACZ,KAAa;IAEb,MAAM,SAAS,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IACtD,MAAM,cAAc,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IAE/C,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC9E,MAAM,SAAS,GAAG,kBAAkB,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAChF,MAAM,OAAO,GAAG,CAAC,GAAG,QAAQ,EAAE,GAAG,SAAS,CAAC,CAAC;IAE5C,iGAAiG;IACjG,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,CAAC,YAAY,GAAG,aAAa,CAAC,GAAG,cAAc,CAAC;IACtE,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACnE,MAAM,UAAU,GAAG,CAAC,CAAC;IACrB,MAAM,WAAW,GAAG,aAAa,GAAG,aAAa,GAAG,UAAU,CAAC;IAE/D,6CAA6C;IAC7C,IAAI,WAAW,GAAG,KAAK,EAAE,CAAC;QACzB,IAAI,QAAQ,GAAG,WAAW,GAAG,KAAK,CAAC;QACnC,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;QACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACpD,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAChC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACjE,QAAQ,GAAG,WAAW,GAAG,aAAa,GAAG,UAAU,GAAG,KAAK,CAAC;QAC7D,CAAC;IACF,CAAC;IAED,4DAA4D;IAC5D,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IACxF,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IAEtF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAE/D,aAAa;IACb,OAAO,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AAC1C,CAAC","sourcesContent":["/**\n * Rendering logic for the powerbar.\n *\n * Builds a single line with left-aligned and right-aligned segments,\n * joined by themed separators. Supports two progress bar styles:\n * continuous (█ + partial-width glyphs ▏▎▍▌▋▊▉) and blocks\n * (discrete partial-height glyphs ▁▂▃▄▅▆▇█ with dim background).\n */\n\nimport type { Theme, ThemeColor } from \"@mariozechner/pi-coding-agent\";\nimport { truncateToWidth, visibleWidth } from \"@mariozechner/pi-tui\";\nimport type { PowerbarSettings } from \"./settings.js\";\n\nexport interface Segment {\n\tid: string;\n\t/** Primary text, rendered before the bar. */\n\ttext: string;\n\t/** Text rendered after the bar (e.g., \"59%\"). */\n\tsuffix?: string;\n\ticon?: string;\n\tcolor?: string;\n\t/** If set, renders a progress bar. Value is 0–100. */\n\tbar?: number;\n\t/** Hint for how many discrete blocks to use in blocks mode. Falls back to barWidth setting. */\n\tbarSegments?: number;\n}\n\n/**\n * Render a continuous progress bar using full-width block characters.\n *\n * █ for filled columns, ▏▎▍▌▋▊▉ for the partial column, space for empty.\n */\nfunction renderProgressBar(percent: number, width: number, theme: Theme, color: string): string {\n\tconst clamped = Math.max(0, Math.min(100, percent));\n\tconst filledFloat = (clamped / 100) * width;\n\tconst filledFull = Math.floor(filledFloat);\n\tconst remainder = filledFloat - filledFull;\n\n\t// Partial block levels: ▏(1/8) ▎(2/8) ▍(3/8) ▌(4/8) ▋(5/8) ▊(6/8) ▉(7/8)\n\tconst levels = [\"▏\", \"▎\", \"▍\", \"▌\", \"▋\", \"▊\", \"▉\"];\n\n\tconst themeColor = color as ThemeColor;\n\tconst filledStr = \"█\".repeat(filledFull);\n\n\tlet partial = \"\";\n\tlet emptyCount = width - filledFull;\n\n\tif (remainder >= 0.0625 && filledFull < width) {\n\t\tconst levelIndex = Math.max(0, Math.min(levels.length - 1, Math.round(remainder * 8) - 1));\n\t\tpartial = levels[levelIndex];\n\t\temptyCount = Math.max(0, emptyCount - 1);\n\t}\n\n\tconst emptyStr = \" \".repeat(emptyCount);\n\n\treturn theme.fg(themeColor, filledStr + partial) + emptyStr;\n}\n\n/** Convert a foreground ANSI escape to background by replacing SGR 38 with 48. */\nfunction fgToBgAnsi(fgAnsi: string): string {\n\treturn fgAnsi.replace(\"\\x1b[38;\", \"\\x1b[48;\");\n}\n\n/**\n * Render a bar of discrete block characters with a dim background track.\n *\n * Splits the 0–100 percent range evenly across `segments` blocks and\n * computes a fill level (0–8) per block. The dim theme color provides\n * the background \"track\"; partial block glyphs fill from the bottom\n * in the segment color.\n */\nfunction renderBlocksBar(percent: number, segments: number, theme: Theme, color: string): string {\n\tconst glyphs = [\" \", \"▁\", \"▂\", \"▃\", \"▄\", \"▅\", \"▆\", \"▇\", \"█\"];\n\tconst dimBg = fgToBgAnsi(theme.getFgAnsi(\"dim\"));\n\tconst fgColor = theme.getFgAnsi((color || \"muted\") as ThemeColor);\n\tconst reset = \"\\x1b[39m\\x1b[49m\";\n\tconst clamped = Math.max(0, Math.min(100, percent));\n\tconst filledFloat = (clamped / 100) * segments;\n\n\tconst result: string[] = [];\n\tfor (let i = 0; i < segments; i++) {\n\t\tconst blockFill = Math.max(0, Math.min(1, filledFloat - i));\n\t\tconst level = Math.round(blockFill * 8);\n\t\tconst glyph = glyphs[level];\n\t\tresult.push(level > 0 ? `${dimBg}${fgColor}${glyph}${reset}` : `${dimBg}${glyph}${reset}`);\n\t}\n\n\treturn result.join(\" \");\n}\n\n/**\n * Render a single segment.\n *\n * Layout: [icon] [text] [bar] [suffix]\n */\nfunction renderSegmentText(segment: Segment, settings: PowerbarSettings, theme: Theme): string {\n\tconst parts: string[] = [];\n\tconst themeColor = (segment.color || \"muted\") as ThemeColor;\n\n\tif (segment.icon) {\n\t\tparts.push(theme.fg(themeColor, segment.icon));\n\t}\n\n\tif (segment.text) {\n\t\tparts.push(theme.fg(themeColor, segment.text));\n\t}\n\n\tif (segment.bar !== undefined) {\n\t\tconst color = segment.color || \"muted\";\n\t\tif (settings.barStyle === \"blocks\") {\n\t\t\tconst blockCount = segment.barSegments ?? settings.barWidth;\n\t\t\tparts.push(renderBlocksBar(segment.bar, blockCount, theme, color));\n\t\t} else {\n\t\t\tparts.push(renderProgressBar(segment.bar, settings.barWidth, theme, color));\n\t\t}\n\t}\n\n\tif (segment.suffix) {\n\t\tparts.push(theme.fg(themeColor, segment.suffix));\n\t}\n\n\treturn parts.join(\" \");\n}\n\ninterface RenderedSegment {\n\ttext: string;\n\twidth: number;\n}\n\nfunction renderSideSegments(\n\tids: string[],\n\tsegments: Map<string, Segment>,\n\tsettings: PowerbarSettings,\n\ttheme: Theme,\n): RenderedSegment[] {\n\tconst rendered: RenderedSegment[] = [];\n\tfor (const id of ids) {\n\t\tconst seg = segments.get(id);\n\t\tif (!seg || (!seg.text && !seg.suffix && seg.bar === undefined)) continue;\n\t\tconst text = renderSegmentText(seg, settings, theme);\n\t\trendered.push({ text, width: visibleWidth(text) });\n\t}\n\treturn rendered;\n}\n\nfunction joinSegments(segments: RenderedSegment[], separator: string, separatorWidth: number): RenderedSegment {\n\tif (segments.length === 0) return { text: \"\", width: 0 };\n\tconst text = segments.map((s) => s.text).join(separator);\n\tconst width = segments.reduce((sum, s) => sum + s.width, 0) + separatorWidth * (segments.length - 1);\n\treturn { text, width };\n}\n\n/**\n * Truncate the widest segment to reclaim overflow space.\n * Mutates the array in place and returns the new total width.\n */\nfunction shrinkWidest(segments: RenderedSegment[], overflow: number): void {\n\tif (segments.length === 0) return;\n\n\tlet widestIdx = 0;\n\tfor (let i = 1; i < segments.length; i++) {\n\t\tif (segments[i].width > segments[widestIdx].width) {\n\t\t\twidestIdx = i;\n\t\t}\n\t}\n\n\tconst seg = segments[widestIdx];\n\tconst targetWidth = Math.max(1, seg.width - overflow);\n\tsegments[widestIdx] = {\n\t\ttext: truncateToWidth(seg.text, targetWidth, \"…\"),\n\t\twidth: targetWidth,\n\t};\n}\n\nexport function renderBar(\n\tsegments: Map<string, Segment>,\n\tsettings: PowerbarSettings,\n\ttheme: Theme,\n\twidth: number,\n): string {\n\tconst separator = theme.fg(\"dim\", settings.separator);\n\tconst separatorWidth = visibleWidth(separator);\n\n\tconst leftSegs = renderSideSegments(settings.left, segments, settings, theme);\n\tconst rightSegs = renderSideSegments(settings.right, segments, settings, theme);\n\tconst allSegs = [...leftSegs, ...rightSegs];\n\n\t// Calculate total content width (segments + separators within each side + 1 for minimum padding)\n\tconst leftSepCount = Math.max(0, leftSegs.length - 1);\n\tconst rightSepCount = Math.max(0, rightSegs.length - 1);\n\tconst totalSepWidth = (leftSepCount + rightSepCount) * separatorWidth;\n\tconst totalSegWidth = allSegs.reduce((sum, s) => sum + s.width, 0);\n\tconst minPadding = 1;\n\tconst totalNeeded = totalSegWidth + totalSepWidth + minPadding;\n\n\t// Shrink the widest segment(s) until it fits\n\tif (totalNeeded > width) {\n\t\tlet overflow = totalNeeded - width;\n\t\tconst maxPasses = allSegs.length;\n\t\tfor (let i = 0; i < maxPasses && overflow > 0; i++) {\n\t\t\tshrinkWidest(allSegs, overflow);\n\t\t\tconst newSegWidth = allSegs.reduce((sum, s) => sum + s.width, 0);\n\t\t\toverflow = newSegWidth + totalSepWidth + minPadding - width;\n\t\t}\n\t}\n\n\t// Rebuild left/right from the (possibly truncated) segments\n\tconst left = joinSegments(allSegs.slice(0, leftSegs.length), separator, separatorWidth);\n\tconst right = joinSegments(allSegs.slice(leftSegs.length), separator, separatorWidth);\n\n\tconst padding = Math.max(minPadding, width - left.width - right.width);\n\tconst line = `${left.text}${\" \".repeat(padding)}${right.text}`;\n\n\t// Safety net\n\treturn truncateToWidth(line, width, \"…\");\n}\n"]}
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/powerbar/render.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Rendering logic for the powerbar.\n *\n * Builds a single line with left-aligned and right-aligned segments,\n * joined by themed separators. Supports two progress bar styles:\n * continuous (█ + partial-width glyphs ▏▎▍▌▋▊▉) and blocks\n * (discrete partial-height glyphs ▁▂▃▄▅▆▇█ with dim background).\n */\n\nimport type { Theme, ThemeColor } from \"@earendil-works/pi-coding-agent\";\nimport { truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport type { PowerbarSettings } from \"./settings.js\";\n\nexport interface Segment {\n\tid: string;\n\t/** Primary text, rendered before the bar. */\n\ttext: string;\n\t/** Text rendered after the bar (e.g., \"59%\"). */\n\tsuffix?: string;\n\ticon?: string;\n\tcolor?: string;\n\t/** If set, renders a progress bar. Value is 0–100. */\n\tbar?: number;\n\t/** Hint for how many discrete blocks to use in blocks mode. Falls back to barWidth setting. */\n\tbarSegments?: number;\n}\n\n/**\n * Render a continuous progress bar using full-width block characters.\n *\n * █ for filled columns, ▏▎▍▌▋▊▉ for the partial column, space for empty.\n */\nfunction renderProgressBar(percent: number, width: number, theme: Theme, color: string): string {\n\tconst clamped = Math.max(0, Math.min(100, percent));\n\tconst filledFloat = (clamped / 100) * width;\n\tconst filledFull = Math.floor(filledFloat);\n\tconst remainder = filledFloat - filledFull;\n\n\t// Partial block levels: ▏(1/8) ▎(2/8) ▍(3/8) ▌(4/8) ▋(5/8) ▊(6/8) ▉(7/8)\n\tconst levels = [\"▏\", \"▎\", \"▍\", \"▌\", \"▋\", \"▊\", \"▉\"];\n\n\tconst themeColor = color as ThemeColor;\n\tconst filledStr = \"█\".repeat(filledFull);\n\n\tlet partial = \"\";\n\tlet emptyCount = width - filledFull;\n\n\tif (remainder >= 0.0625 && filledFull < width) {\n\t\tconst levelIndex = Math.max(0, Math.min(levels.length - 1, Math.round(remainder * 8) - 1));\n\t\tpartial = levels[levelIndex];\n\t\temptyCount = Math.max(0, emptyCount - 1);\n\t}\n\n\tconst emptyStr = \" \".repeat(emptyCount);\n\n\treturn theme.fg(themeColor, filledStr + partial) + emptyStr;\n}\n\n/** Convert a foreground ANSI escape to background by replacing SGR 38 with 48. */\nfunction fgToBgAnsi(fgAnsi: string): string {\n\treturn fgAnsi.replace(\"\\x1b[38;\", \"\\x1b[48;\");\n}\n\n/**\n * Render a bar of discrete block characters with a dim background track.\n *\n * Splits the 0–100 percent range evenly across `segments` blocks and\n * computes a fill level (0–8) per block. The dim theme color provides\n * the background \"track\"; partial block glyphs fill from the bottom\n * in the segment color.\n */\nfunction renderBlocksBar(percent: number, segments: number, theme: Theme, color: string): string {\n\tconst glyphs = [\" \", \"▁\", \"▂\", \"▃\", \"▄\", \"▅\", \"▆\", \"▇\", \"█\"];\n\tconst dimBg = fgToBgAnsi(theme.getFgAnsi(\"dim\"));\n\tconst fgColor = theme.getFgAnsi((color || \"muted\") as ThemeColor);\n\tconst reset = \"\\x1b[39m\\x1b[49m\";\n\tconst clamped = Math.max(0, Math.min(100, percent));\n\tconst filledFloat = (clamped / 100) * segments;\n\n\tconst result: string[] = [];\n\tfor (let i = 0; i < segments; i++) {\n\t\tconst blockFill = Math.max(0, Math.min(1, filledFloat - i));\n\t\tconst level = Math.round(blockFill * 8);\n\t\tconst glyph = glyphs[level];\n\t\tresult.push(level > 0 ? `${dimBg}${fgColor}${glyph}${reset}` : `${dimBg}${glyph}${reset}`);\n\t}\n\n\treturn result.join(\" \");\n}\n\n/**\n * Render a single segment.\n *\n * Layout: [icon] [text] [bar] [suffix]\n */\nfunction renderSegmentText(segment: Segment, settings: PowerbarSettings, theme: Theme): string {\n\tconst parts: string[] = [];\n\tconst themeColor = (segment.color || \"muted\") as ThemeColor;\n\n\tif (segment.icon) {\n\t\tparts.push(theme.fg(themeColor, segment.icon));\n\t}\n\n\tif (segment.text) {\n\t\tparts.push(theme.fg(themeColor, segment.text));\n\t}\n\n\tif (segment.bar !== undefined) {\n\t\tconst color = segment.color || \"muted\";\n\t\tif (settings.barStyle === \"blocks\") {\n\t\t\tconst blockCount = segment.barSegments ?? settings.barWidth;\n\t\t\tparts.push(renderBlocksBar(segment.bar, blockCount, theme, color));\n\t\t} else {\n\t\t\tparts.push(renderProgressBar(segment.bar, settings.barWidth, theme, color));\n\t\t}\n\t}\n\n\tif (segment.suffix) {\n\t\tparts.push(theme.fg(themeColor, segment.suffix));\n\t}\n\n\treturn parts.join(\" \");\n}\n\ninterface RenderedSegment {\n\ttext: string;\n\twidth: number;\n}\n\nfunction renderSideSegments(\n\tids: string[],\n\tsegments: Map<string, Segment>,\n\tsettings: PowerbarSettings,\n\ttheme: Theme,\n): RenderedSegment[] {\n\tconst rendered: RenderedSegment[] = [];\n\tfor (const id of ids) {\n\t\tconst seg = segments.get(id);\n\t\tif (!seg || (!seg.text && !seg.suffix && seg.bar === undefined)) continue;\n\t\tconst text = renderSegmentText(seg, settings, theme);\n\t\trendered.push({ text, width: visibleWidth(text) });\n\t}\n\treturn rendered;\n}\n\nfunction joinSegments(segments: RenderedSegment[], separator: string, separatorWidth: number): RenderedSegment {\n\tif (segments.length === 0) return { text: \"\", width: 0 };\n\tconst text = segments.map((s) => s.text).join(separator);\n\tconst width = segments.reduce((sum, s) => sum + s.width, 0) + separatorWidth * (segments.length - 1);\n\treturn { text, width };\n}\n\n/**\n * Truncate the widest segment to reclaim overflow space.\n * Mutates the array in place and returns the new total width.\n */\nfunction shrinkWidest(segments: RenderedSegment[], overflow: number): void {\n\tif (segments.length === 0) return;\n\n\tlet widestIdx = 0;\n\tfor (let i = 1; i < segments.length; i++) {\n\t\tif (segments[i].width > segments[widestIdx].width) {\n\t\t\twidestIdx = i;\n\t\t}\n\t}\n\n\tconst seg = segments[widestIdx];\n\tconst targetWidth = Math.max(1, seg.width - overflow);\n\tsegments[widestIdx] = {\n\t\ttext: truncateToWidth(seg.text, targetWidth, \"…\"),\n\t\twidth: targetWidth,\n\t};\n}\n\nexport function renderBar(\n\tsegments: Map<string, Segment>,\n\tsettings: PowerbarSettings,\n\ttheme: Theme,\n\twidth: number,\n): string {\n\tconst separator = theme.fg(\"dim\", settings.separator);\n\tconst separatorWidth = visibleWidth(separator);\n\n\tconst leftSegs = renderSideSegments(settings.left, segments, settings, theme);\n\tconst rightSegs = renderSideSegments(settings.right, segments, settings, theme);\n\tconst allSegs = [...leftSegs, ...rightSegs];\n\n\t// Calculate total content width (segments + separators within each side + 1 for minimum padding)\n\tconst leftSepCount = Math.max(0, leftSegs.length - 1);\n\tconst rightSepCount = Math.max(0, rightSegs.length - 1);\n\tconst totalSepWidth = (leftSepCount + rightSepCount) * separatorWidth;\n\tconst totalSegWidth = allSegs.reduce((sum, s) => sum + s.width, 0);\n\tconst minPadding = 1;\n\tconst totalNeeded = totalSegWidth + totalSepWidth + minPadding;\n\n\t// Shrink the widest segment(s) until it fits\n\tif (totalNeeded > width) {\n\t\tlet overflow = totalNeeded - width;\n\t\tconst maxPasses = allSegs.length;\n\t\tfor (let i = 0; i < maxPasses && overflow > 0; i++) {\n\t\t\tshrinkWidest(allSegs, overflow);\n\t\t\tconst newSegWidth = allSegs.reduce((sum, s) => sum + s.width, 0);\n\t\t\toverflow = newSegWidth + totalSepWidth + minPadding - width;\n\t\t}\n\t}\n\n\t// Rebuild left/right from the (possibly truncated) segments\n\tconst left = joinSegments(allSegs.slice(0, leftSegs.length), separator, separatorWidth);\n\tconst right = joinSegments(allSegs.slice(leftSegs.length), separator, separatorWidth);\n\n\tconst padding = Math.max(minPadding, width - left.width - right.width);\n\tconst line = `${left.text}${\" \".repeat(padding)}${right.text}`;\n\n\t// Safety net\n\treturn truncateToWidth(line, width, \"…\");\n}\n"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Settings for the powerbar via pi-extension-settings.
|
|
3
3
|
*/
|
|
4
4
|
import type { OrderedListOption } from "@juanibiapina/pi-extension-settings";
|
|
5
|
-
import type { ExtensionAPI } from "@
|
|
5
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
6
6
|
export declare const EXTENSION_NAME = "powerbar";
|
|
7
7
|
export interface PowerbarSettings {
|
|
8
8
|
left: string[];
|
|
@@ -1 +1 @@
|
|
|
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
|
|
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,iCAAiC,CAAC;AAEpE,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;IACjB,QAAQ,EAAE,YAAY,GAAG,QAAQ,CAAC;CAClC;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAkD5F;AAED,wBAAgB,YAAY,IAAI,gBAAgB,CAsB/C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/powerbar/settings.ts"],"names":[],"mappings":"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","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 \"@
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/powerbar/settings.ts"],"names":[],"mappings":"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","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 \"@earendil-works/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\tbarStyle: \"continuous\" | \"blocks\";\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-style\",\n\t\t\tlabel: \"Bar style\",\n\t\t\tdescription: \"Visual style of progress bars\",\n\t\t\tdefaultValue: \"blocks\",\n\t\t\tvalues: [\"continuous\", \"blocks\"],\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 barStyle = getSetting(EXTENSION_NAME, \"bar-style\", \"blocks\") ?? \"blocks\";\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\tbarStyle: barStyle === \"continuous\" ? \"continuous\" : \"blocks\",\n\t\tbarWidth: Math.max(4, Math.min(24, Number.parseInt(barWidthStr, 10) || 10)),\n\t};\n}\n"]}
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
* Color changes based on usage level: accent → warning → error.
|
|
6
6
|
* Segment ID: "context-usage"
|
|
7
7
|
*/
|
|
8
|
-
import type { ExtensionAPI } from "@
|
|
8
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
9
9
|
export default function createExtension(pi: ExtensionAPI): void;
|
|
10
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -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
|
|
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,iCAAiC,CAAC;AAgCtF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAU9D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/powerbar-context/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,UAAU,GAAG,OAAO,CAAC;AAE3B,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,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;QACnC,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,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,UAAU,CAAC;YACxD,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;IAE1D,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 \"@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/powerbar-context/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,UAAU,GAAG,OAAO,CAAC;AAE3B,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,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;QACnC,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,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,UAAU,CAAC;YACxD,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;IAE1D,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 \"@earendil-works/pi-coding-agent\";\n\nconst CHUNK_SIZE = 100_000;\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 && usage.tokens != null) {\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\tbarSegments: Math.ceil(usage.contextWindow / CHUNK_SIZE),\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\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"]}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
* Shows the current git branch.
|
|
5
5
|
* Segment ID: "git-branch"
|
|
6
6
|
*/
|
|
7
|
-
import type { ExtensionAPI } from "@
|
|
7
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
8
8
|
export default function createExtension(pi: ExtensionAPI): void;
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -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
|
|
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,iCAAiC,CAAC;AAkCtF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAa9D"}
|
|
@@ -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,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,+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 \"@
|
|
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,+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 \"@earendil-works/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\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"]}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
* Shows the current model name and thinking level.
|
|
5
5
|
* Segment ID: "model"
|
|
6
6
|
*/
|
|
7
|
-
import type { ExtensionAPI } from "@
|
|
7
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
8
8
|
export default function createExtension(pi: ExtensionAPI): void;
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -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
|
|
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,iCAAiC,CAAC;AAsBtF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAc9D"}
|
|
@@ -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,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,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 \"@
|
|
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,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 \"@earendil-works/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(\"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"]}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
* Shows the current LLM provider name.
|
|
5
5
|
* Segment ID: "provider"
|
|
6
6
|
*/
|
|
7
|
-
import type { ExtensionAPI } from "@
|
|
7
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
8
8
|
export default function createExtension(pi: ExtensionAPI): void;
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -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
|
|
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,iCAAiC,CAAC;AAatF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAc9D"}
|
|
@@ -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,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,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 \"@
|
|
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,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 \"@earendil-works/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(\"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"]}
|
|
@@ -14,6 +14,6 @@
|
|
|
14
14
|
*
|
|
15
15
|
* Segment IDs: "sub-hourly", "sub-weekly"
|
|
16
16
|
*/
|
|
17
|
-
import type { ExtensionAPI } from "@
|
|
17
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
18
18
|
export default function createExtension(pi: ExtensionAPI): void;
|
|
19
19
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/powerbar-sub/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/powerbar-sub/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AA4CpE,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAW9D"}
|
|
@@ -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 *\n * We listen only to `sub-core:ready` and `sub-core:update-current`. We intentionally\n * skip `sub-core:update-all`: its entries list filters providers by cache TTL, so the\n * current provider can be missing whenever its `fetchedAt` drifts past the refresh\n * interval (e.g. during anthropic 429s, see https://github.com/marckrenn/pi-sub/issues/58).\n * `update-current` is authoritative for the current provider's usage in every case,\n * including when other pi instances refresh the shared cache (sub-core re-emits\n * `update-current` from its `onCacheUpdate` listener).\n *\n * Segment IDs: \"sub-hourly\", \"sub-weekly\"\n */\n\nimport type { RateWindow, SubCoreState } from \"@marckrenn/pi-sub-shared\";\nimport type { ExtensionAPI } from \"@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/powerbar-sub/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,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,UAAU,CAAC,EAAgB,EAAE,SAAiB,EAAE,MAA8B,EAAE,WAAmB;IAC3G,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACtE,OAAO;IACR,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,IAAI,EAAE,CAAC;IAE5C,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,KAAK;QAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,KAAK;QAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEjC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;QACjC,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;QACzB,MAAM,EAAE,GAAG,GAAG,GAAG;QACjB,GAAG,EAAE,GAAG;QACR,WAAW;QACX,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC;KACpB,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,EAAgB,EAAE,KAA+B;IACnE,MAAM,KAAK,GAAG,KAAK,EAAE,KAAK,CAAC;IAC3B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1C,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACzE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACzE,OAAO;IACR,CAAC;IAED,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClD,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACnD,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;IACvF,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;IAEvF,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,OAAgB,EAAE,EAAE;QACnD,SAAS,CAAC,EAAE,EAAG,OAAoC,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,yBAAyB,EAAE,CAAC,OAAgB,EAAE,EAAE;QAC5D,SAAS,CAAC,EAAE,EAAG,OAAoC,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACJ,CAAC","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 *\n * We listen only to `sub-core:ready` and `sub-core:update-current`. We intentionally\n * skip `sub-core:update-all`: its entries list filters providers by cache TTL, so the\n * current provider can be missing whenever its `fetchedAt` drifts past the refresh\n * interval (e.g. during anthropic 429s, see https://github.com/marckrenn/pi-sub/issues/58).\n * `update-current` is authoritative for the current provider's usage in every case,\n * including when other pi instances refresh the shared cache (sub-core re-emits\n * `update-current` from its `onCacheUpdate` listener).\n *\n * Segment IDs: \"sub-hourly\", \"sub-weekly\"\n */\n\nimport type { RateWindow, SubCoreState } from \"@marckrenn/pi-sub-shared\";\nimport type { ExtensionAPI } from \"@earendil-works/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, barSegments: number): 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\tbarSegments,\n\t\tcolor: getColor(pct),\n\t});\n}\n\nfunction emitUsage(pi: ExtensionAPI, state: SubCoreState | undefined): void {\n\tconst usage = state?.usage;\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], 5);\n\temitWindow(pi, \"sub-weekly\", usage.windows[1], 7);\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\temitUsage(pi, (payload as { state?: SubCoreState }).state);\n\t});\n\n\tpi.events.on(\"sub-core:update-current\", (payload: unknown) => {\n\t\temitUsage(pi, (payload as { state?: SubCoreState }).state);\n\t});\n}\n"]}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
* Shows cumulative token stats and session cost.
|
|
5
5
|
* Segment ID: "tokens"
|
|
6
6
|
*/
|
|
7
|
-
import type { ExtensionAPI } from "@
|
|
7
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
8
8
|
export default function createExtension(pi: ExtensionAPI): void;
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -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
|
|
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,iCAAiC,CAAC;AAkDtF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAS9D"}
|
|
@@ -27,8 +27,9 @@ function emitTokens(pi, ctx) {
|
|
|
27
27
|
totalCost += entry.message.usage.cost.total;
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
-
if (totalInput === 0 && totalOutput === 0)
|
|
30
|
+
if (totalInput === 0 && totalOutput === 0) {
|
|
31
31
|
return;
|
|
32
|
+
}
|
|
32
33
|
const parts = [];
|
|
33
34
|
parts.push(`↑${formatTokens(totalInput)}`);
|
|
34
35
|
parts.push(`↓${formatTokens(totalOutput)}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/powerbar-tokens/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,SAAS,YAAY,CAAC,KAAa;IAClC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1C,IAAI,KAAK,GAAG,KAAK;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1D,IAAI,KAAK,GAAG,OAAO;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC;IAC3D,IAAI,KAAK,GAAG,QAAQ;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAChE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC;AAC1C,CAAC;AAED,SAAS,UAAU,CAAC,EAAgB,EAAE,GAAqB;IAC1D,MAAM,OAAO,GAAG,GAAG,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC;IAEhD,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACpE,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;YACxC,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;YAC1C,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QAC7C,CAAC;IACF,CAAC;IAED,IAAI,UAAU,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC;
|
|
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 \"@earendil-works/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) {\n\t\treturn;\n\t}\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\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.
|
|
3
|
+
"version": "0.10.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",
|
|
@@ -40,18 +40,18 @@
|
|
|
40
40
|
"node": ">=20.0.0"
|
|
41
41
|
},
|
|
42
42
|
"peerDependencies": {
|
|
43
|
-
"@
|
|
44
|
-
"@
|
|
43
|
+
"@earendil-works/pi-coding-agent": "*",
|
|
44
|
+
"@earendil-works/pi-tui": "*"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
47
|
"@juanibiapina/pi-extension-settings": "^0.6.1",
|
|
48
48
|
"@marckrenn/pi-sub-core": "^1.5.0"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
|
-
"@biomejs/biome": "2.4.
|
|
51
|
+
"@biomejs/biome": "2.4.15",
|
|
52
52
|
"@marckrenn/pi-sub-shared": "^1.5.0",
|
|
53
|
-
"@
|
|
54
|
-
"@types/node": "^25.
|
|
53
|
+
"@earendil-works/pi-coding-agent": "^0.75.3",
|
|
54
|
+
"@types/node": "^25.9.1",
|
|
55
55
|
"typescript": "^6.0.3"
|
|
56
56
|
}
|
|
57
57
|
}
|