@herbertgao/pi-extensions 2026.9.18 → 2026.9.20

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.
Files changed (226) hide show
  1. package/README.md +20 -28
  2. package/THIRD_PARTY_NOTICES.md +1 -1
  3. package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +76 -59
  4. package/node_modules/@herbertgao/pi-cc-extensions/README.md +76 -59
  5. package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/preview.webp +0 -0
  6. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +93 -34
  7. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +346 -117
  8. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/agent-summary/core.ts +6 -36
  9. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/agent-summary/index.ts +2 -2
  10. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +24 -29
  11. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/context.ts +330 -360
  12. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/reference/index.ts +56 -108
  13. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/reference/session.ts +97 -15
  14. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/reference/subagent.ts +80 -45
  15. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/flush-docked-bash.ts +36 -0
  16. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/footer-layout.ts +229 -0
  17. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/footer.ts +479 -0
  18. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/startup-header.ts +92 -61
  19. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/working-message.ts +75 -40
  20. package/node_modules/@herbertgao/pi-cc-extensions/extensions/index.ts +19 -3
  21. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +1080 -229
  22. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +232 -259
  23. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/index.ts +42 -41
  24. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/markdown-enhance.ts +8 -2
  25. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/hover.ts +2 -7
  26. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/interaction.ts +277 -113
  27. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/layout.ts +15 -6
  28. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/packets.ts +18 -72
  29. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/scroll.ts +61 -26
  30. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/ansi-utils.ts +25 -57
  31. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-component.ts +125 -0
  32. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-edit-render.ts +227 -0
  33. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-header.ts +136 -0
  34. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-highlight.ts +115 -0
  35. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-inline.ts +324 -0
  36. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-layout.ts +762 -0
  37. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-limits.ts +152 -0
  38. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-palette.ts +410 -0
  39. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-parse.ts +535 -0
  40. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-presentation.ts +2 -2
  41. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-renderer.ts +21 -3219
  42. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-text.ts +44 -0
  43. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-write-render.ts +568 -0
  44. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/index.ts +47 -10
  45. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/line-width-safety.ts +2 -2
  46. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/write-execution.ts +1 -0
  47. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +145 -190
  48. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/mcp-title.ts +39 -0
  49. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{message-display.ts → tool/message-display.ts} +24 -90
  50. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/names.ts +426 -0
  51. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/result.ts +90 -132
  52. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{show-more-hint.ts → tool/show-more-hint.ts} +10 -0
  53. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/transcript-refresh.ts +8 -26
  54. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/ansi-color.ts +44 -0
  55. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/ansi-text.ts +76 -0
  56. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/component-tree.ts +34 -0
  57. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/format.ts +28 -0
  58. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/fullscreen-detect.ts +51 -0
  59. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/patch-keys.ts +124 -0
  60. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/sgr-mouse.ts +70 -0
  61. package/node_modules/@herbertgao/pi-cc-extensions/package.json +8 -8
  62. package/node_modules/pi-antigravity/README.md +29 -6
  63. package/node_modules/pi-antigravity/package.json +12 -7
  64. package/node_modules/pi-antigravity/src/auth/accounts.ts +327 -0
  65. package/node_modules/pi-antigravity/src/auth/index.ts +9 -0
  66. package/node_modules/pi-antigravity/src/client/client.ts +1 -1
  67. package/node_modules/pi-antigravity/src/image/image.ts +4 -4
  68. package/node_modules/pi-antigravity/src/index.ts +203 -13
  69. package/node_modules/pi-antigravity/src/search/index.ts +1 -0
  70. package/node_modules/pi-antigravity/src/search/search.ts +325 -0
  71. package/node_modules/pi-antigravity/src/stream/stream.ts +191 -14
  72. package/node_modules/pi-antigravity/src/types/enums.ts +45 -36
  73. package/node_modules/pi-antigravity/src/types/types.ts +5 -12
  74. package/node_modules/pi-antigravity/src/utils/http.ts +7 -2
  75. package/node_modules/pi-antigravity/src/utils/util.ts +31 -3
  76. package/node_modules/pi-typesafe/README.md +2 -0
  77. package/node_modules/pi-typesafe/package.json +2 -1
  78. package/node_modules/pi-web-access/CHANGELOG.md +72 -0
  79. package/node_modules/pi-web-access/README.md +34 -13
  80. package/node_modules/pi-web-access/chrome-cookies.ts +79 -25
  81. package/node_modules/pi-web-access/curator-page.ts +5 -1
  82. package/node_modules/pi-web-access/curator-server.ts +2 -0
  83. package/node_modules/pi-web-access/dist/index.js +1337 -1009
  84. package/node_modules/pi-web-access/exa.ts +20 -52
  85. package/node_modules/pi-web-access/extract.ts +41 -4
  86. package/node_modules/pi-web-access/gemini-search.ts +12 -4
  87. package/node_modules/pi-web-access/index.ts +29 -37
  88. package/node_modules/pi-web-access/openai-search.ts +35 -7
  89. package/node_modules/pi-web-access/package.json +6 -5
  90. package/node_modules/pi-web-access/page-query.ts +2 -2
  91. package/node_modules/pi-web-access/query-rewrite.ts +2 -3
  92. package/node_modules/pi-web-access/ssrf-protection.ts +27 -10
  93. package/node_modules/pi-web-access/storage.ts +48 -77
  94. package/node_modules/pi-web-access/summary-model-scope.ts +6 -77
  95. package/node_modules/pi-web-access/summary-review.ts +3 -4
  96. package/node_modules/pi-web-access/tavily.ts +67 -20
  97. package/node_modules/pi-web-access/tool-activation.ts +53 -33
  98. package/node_modules/pi-web-access/utils.ts +1 -1
  99. package/node_modules/pi-web-access/you.ts +164 -0
  100. package/node_modules/pi-web-access/zai.ts +161 -0
  101. package/package.json +7 -11
  102. package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/hero.en.svg +0 -101
  103. package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/hero.svg +0 -101
  104. package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/welcome.webp +0 -0
  105. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/render-utils.ts +0 -5
  106. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/types.ts +0 -30
  107. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/write-display-utils.ts +0 -12
  108. package/node_modules/pi-footer/CHANGELOG.md +0 -145
  109. package/node_modules/pi-footer/LICENSE +0 -21
  110. package/node_modules/pi-footer/README.md +0 -354
  111. package/node_modules/pi-footer/package.json +0 -68
  112. package/node_modules/pi-footer/src/cache.ts +0 -106
  113. package/node_modules/pi-footer/src/colors.ts +0 -237
  114. package/node_modules/pi-footer/src/config.ts +0 -202
  115. package/node_modules/pi-footer/src/event-widgets.ts +0 -41
  116. package/node_modules/pi-footer/src/extension-statuses.ts +0 -102
  117. package/node_modules/pi-footer/src/git.ts +0 -135
  118. package/node_modules/pi-footer/src/index.ts +0 -268
  119. package/node_modules/pi-footer/src/metrics.ts +0 -141
  120. package/node_modules/pi-footer/src/presets.ts +0 -383
  121. package/node_modules/pi-footer/src/render.ts +0 -114
  122. package/node_modules/pi-footer/src/separators.ts +0 -52
  123. package/node_modules/pi-footer/src/types.ts +0 -122
  124. package/node_modules/pi-footer/src/ui/color-level-confirm.ts +0 -22
  125. package/node_modules/pi-footer/src/ui/color-options.ts +0 -195
  126. package/node_modules/pi-footer/src/ui/config-lifecycle.ts +0 -61
  127. package/node_modules/pi-footer/src/ui/edit-colors.ts +0 -13
  128. package/node_modules/pi-footer/src/ui/events.ts +0 -35
  129. package/node_modules/pi-footer/src/ui/extension-status-picker.ts +0 -60
  130. package/node_modules/pi-footer/src/ui/extension-statuses.ts +0 -73
  131. package/node_modules/pi-footer/src/ui/fields.ts +0 -252
  132. package/node_modules/pi-footer/src/ui/global-menu.ts +0 -126
  133. package/node_modules/pi-footer/src/ui/helpers.ts +0 -44
  134. package/node_modules/pi-footer/src/ui/layout.ts +0 -17
  135. package/node_modules/pi-footer/src/ui/line-list.ts +0 -19
  136. package/node_modules/pi-footer/src/ui/model.ts +0 -64
  137. package/node_modules/pi-footer/src/ui/navigation.ts +0 -29
  138. package/node_modules/pi-footer/src/ui/option-edit.ts +0 -93
  139. package/node_modules/pi-footer/src/ui/overlay-render.ts +0 -103
  140. package/node_modules/pi-footer/src/ui/screen-context.ts +0 -18
  141. package/node_modules/pi-footer/src/ui/screen-controller.ts +0 -27
  142. package/node_modules/pi-footer/src/ui/screen-render.ts +0 -32
  143. package/node_modules/pi-footer/src/ui/screen-state.ts +0 -20
  144. package/node_modules/pi-footer/src/ui/screen.ts +0 -243
  145. package/node_modules/pi-footer/src/ui/screens/add-widget.ts +0 -92
  146. package/node_modules/pi-footer/src/ui/screens/confirm-exit.ts +0 -52
  147. package/node_modules/pi-footer/src/ui/screens/controller.ts +0 -12
  148. package/node_modules/pi-footer/src/ui/screens/edit-colors.ts +0 -68
  149. package/node_modules/pi-footer/src/ui/screens/edit-widget.ts +0 -115
  150. package/node_modules/pi-footer/src/ui/screens/extension-status-row.ts +0 -61
  151. package/node_modules/pi-footer/src/ui/screens/global.ts +0 -75
  152. package/node_modules/pi-footer/src/ui/screens/line-list.ts +0 -108
  153. package/node_modules/pi-footer/src/ui/screens/main.ts +0 -99
  154. package/node_modules/pi-footer/src/ui/screens/terminal.ts +0 -121
  155. package/node_modules/pi-footer/src/ui/screens/widget-list.ts +0 -154
  156. package/node_modules/pi-footer/src/ui/terminal-menu.ts +0 -32
  157. package/node_modules/pi-footer/src/ui/theme.ts +0 -48
  158. package/node_modules/pi-footer/src/ui/title-bar.ts +0 -100
  159. package/node_modules/pi-footer/src/ui/widget-actions.ts +0 -76
  160. package/node_modules/pi-footer/src/ui.ts +0 -66
  161. package/node_modules/pi-footer/src/widgets/context.ts +0 -28
  162. package/node_modules/pi-footer/src/widgets/core/active-tools.ts +0 -17
  163. package/node_modules/pi-footer/src/widgets/core/context-window.ts +0 -24
  164. package/node_modules/pi-footer/src/widgets/core/cwd-basename.ts +0 -19
  165. package/node_modules/pi-footer/src/widgets/core/cwd.ts +0 -108
  166. package/node_modules/pi-footer/src/widgets/core/event.ts +0 -34
  167. package/node_modules/pi-footer/src/widgets/core/external-status.ts +0 -102
  168. package/node_modules/pi-footer/src/widgets/core/model-provider.ts +0 -20
  169. package/node_modules/pi-footer/src/widgets/core/model.ts +0 -35
  170. package/node_modules/pi-footer/src/widgets/core/provider.ts +0 -17
  171. package/node_modules/pi-footer/src/widgets/core/session-name.ts +0 -17
  172. package/node_modules/pi-footer/src/widgets/core/text-verbosity.ts +0 -17
  173. package/node_modules/pi-footer/src/widgets/core/thinking-level.ts +0 -17
  174. package/node_modules/pi-footer/src/widgets/git/ahead-behind.ts +0 -17
  175. package/node_modules/pi-footer/src/widgets/git/branch.ts +0 -81
  176. package/node_modules/pi-footer/src/widgets/git/clean.ts +0 -19
  177. package/node_modules/pi-footer/src/widgets/git/deletions.ts +0 -17
  178. package/node_modules/pi-footer/src/widgets/git/diff.ts +0 -38
  179. package/node_modules/pi-footer/src/widgets/git/insertions.ts +0 -17
  180. package/node_modules/pi-footer/src/widgets/git/remote.ts +0 -17
  181. package/node_modules/pi-footer/src/widgets/git/root.ts +0 -17
  182. package/node_modules/pi-footer/src/widgets/git/sha.ts +0 -17
  183. package/node_modules/pi-footer/src/widgets/git/staged.ts +0 -17
  184. package/node_modules/pi-footer/src/widgets/git/status.ts +0 -19
  185. package/node_modules/pi-footer/src/widgets/git/unstaged.ts +0 -17
  186. package/node_modules/pi-footer/src/widgets/git/untracked.ts +0 -17
  187. package/node_modules/pi-footer/src/widgets/instance.ts +0 -118
  188. package/node_modules/pi-footer/src/widgets/layout/custom-text.ts +0 -18
  189. package/node_modules/pi-footer/src/widgets/layout/flex-separator.ts +0 -32
  190. package/node_modules/pi-footer/src/widgets/layout/separator.ts +0 -57
  191. package/node_modules/pi-footer/src/widgets/layout/spacer.ts +0 -31
  192. package/node_modules/pi-footer/src/widgets/options.ts +0 -122
  193. package/node_modules/pi-footer/src/widgets/project/runtime.ts +0 -361
  194. package/node_modules/pi-footer/src/widgets/registry.ts +0 -223
  195. package/node_modules/pi-footer/src/widgets/session/assistant-messages.ts +0 -17
  196. package/node_modules/pi-footer/src/widgets/session/compactions.ts +0 -17
  197. package/node_modules/pi-footer/src/widgets/session/elapsed.ts +0 -18
  198. package/node_modules/pi-footer/src/widgets/session/last-activity.ts +0 -18
  199. package/node_modules/pi-footer/src/widgets/session/messages.ts +0 -19
  200. package/node_modules/pi-footer/src/widgets/session/session-id.ts +0 -17
  201. package/node_modules/pi-footer/src/widgets/session/session-start.ts +0 -18
  202. package/node_modules/pi-footer/src/widgets/session/tool-results.ts +0 -17
  203. package/node_modules/pi-footer/src/widgets/session/total-messages.ts +0 -19
  204. package/node_modules/pi-footer/src/widgets/session/total-time.ts +0 -18
  205. package/node_modules/pi-footer/src/widgets/session/user-messages.ts +0 -17
  206. package/node_modules/pi-footer/src/widgets/store.ts +0 -26
  207. package/node_modules/pi-footer/src/widgets/tokens/cache-hit-rate.ts +0 -55
  208. package/node_modules/pi-footer/src/widgets/tokens/cache-read.ts +0 -18
  209. package/node_modules/pi-footer/src/widgets/tokens/cache-write.ts +0 -18
  210. package/node_modules/pi-footer/src/widgets/tokens/context-bar.ts +0 -108
  211. package/node_modules/pi-footer/src/widgets/tokens/context-length.ts +0 -26
  212. package/node_modules/pi-footer/src/widgets/tokens/context-remaining.ts +0 -29
  213. package/node_modules/pi-footer/src/widgets/tokens/context.ts +0 -29
  214. package/node_modules/pi-footer/src/widgets/tokens/cost.ts +0 -51
  215. package/node_modules/pi-footer/src/widgets/tokens/input-speed.ts +0 -25
  216. package/node_modules/pi-footer/src/widgets/tokens/input-tokens.ts +0 -18
  217. package/node_modules/pi-footer/src/widgets/tokens/output-speed.ts +0 -25
  218. package/node_modules/pi-footer/src/widgets/tokens/output-tokens.ts +0 -18
  219. package/node_modules/pi-footer/src/widgets/tokens/tokens.ts +0 -20
  220. package/node_modules/pi-footer/src/widgets/tokens/total-speed.ts +0 -25
  221. package/node_modules/pi-footer/src/widgets/tokens/total-tokens.ts +0 -18
  222. package/node_modules/pi-footer/src/widgets/types.ts +0 -181
  223. package/node_modules/pi-footer/src/widgets/utils/colors.ts +0 -11
  224. package/node_modules/pi-footer/src/widgets/utils/context.ts +0 -112
  225. package/node_modules/pi-footer/src/widgets/utils/session.ts +0 -19
  226. package/node_modules/pi-footer/src/widgets/utils/token-format.ts +0 -78
@@ -1,18 +0,0 @@
1
- import { defineWidget } from "../types.js";
2
- import { formatTokenCount, tokenFormatStyleProperty } from "../utils/token-format.js";
3
-
4
- export const OutputTokensWidget = defineWidget({
5
- type: "output-tokens",
6
- label: "Output Tokens",
7
- category: "Tokens",
8
- description: "Output token total",
9
- dependencies: ["metrics"],
10
- baseOptions: ["raw", "hideWhenZero", "icon"],
11
- baseOptionDefaults: {},
12
- properties: [tokenFormatStyleProperty()],
13
- icons: { emoji: "⬇️", nerd: "󰧚", text: "out" },
14
- defaultStyle: { fg: "white", bg: "default", bold: false },
15
- render({ ctx, options, renderWidget }) {
16
- return renderWidget(formatTokenCount(ctx.metrics.outputTokens, options.tokenFormatStyle));
17
- },
18
- });
@@ -1,20 +0,0 @@
1
- import { defineWidget } from "../types.js";
2
- import { formatTokenCount, tokenFormatStyleProperty } from "../utils/token-format.js";
3
-
4
- export const TokensWidget = defineWidget({
5
- type: "tokens",
6
- label: "Input/Output Tokens",
7
- category: "Tokens",
8
- description: "Input and output token totals",
9
- dependencies: ["metrics"],
10
- baseOptions: ["raw", "icon"],
11
- baseOptionDefaults: {},
12
- properties: [tokenFormatStyleProperty()],
13
- icons: { emoji: "🔢", nerd: "󰓹", text: "tok" },
14
- defaultStyle: { fg: "cyan", bg: "default", bold: false },
15
- render({ ctx, options, renderWidget }) {
16
- return renderWidget(
17
- `↑${formatTokenCount(ctx.metrics.inputTokens, options.tokenFormatStyle)} ↓${formatTokenCount(ctx.metrics.outputTokens, options.tokenFormatStyle)}`,
18
- );
19
- },
20
- });
@@ -1,25 +0,0 @@
1
- import { defineWidget } from "../types.js";
2
- import { formatTokenSpeed, tokenFormatStyleProperty } from "../utils/token-format.js";
3
-
4
- export const TotalSpeedWidget = defineWidget({
5
- type: "total-speed",
6
- label: "Total Speed",
7
- category: "Tokens",
8
- description: "Average total tokens per minute",
9
- dependencies: ["metrics"],
10
- baseOptions: ["raw", "hideWhenZero", "icon"],
11
- baseOptionDefaults: {},
12
- properties: [tokenFormatStyleProperty()],
13
- icons: { emoji: "⚡", nerd: "↕", text: "tok/min" },
14
- defaultStyle: { fg: "brightGreen", bg: "default", bold: false },
15
- render({ ctx, options, renderWidget }) {
16
- return renderWidget(
17
- formatTokenSpeed(
18
- ctx.metrics.totalTokens,
19
- ctx.metrics.firstTimestampMs,
20
- ctx.metrics.lastTimestampMs,
21
- options.tokenFormatStyle,
22
- ),
23
- );
24
- },
25
- });
@@ -1,18 +0,0 @@
1
- import { defineWidget } from "../types.js";
2
- import { formatTokenCount, tokenFormatStyleProperty } from "../utils/token-format.js";
3
-
4
- export const TotalTokensWidget = defineWidget({
5
- type: "total-tokens",
6
- label: "Total Tokens",
7
- category: "Tokens",
8
- description: "Total token count",
9
- dependencies: ["metrics"],
10
- baseOptions: ["raw", "hideWhenZero", "icon"],
11
- baseOptionDefaults: {},
12
- properties: [tokenFormatStyleProperty()],
13
- icons: { emoji: "🔢", nerd: "󰓹", text: "tok" },
14
- defaultStyle: { fg: "cyan", bg: "default", bold: false },
15
- render({ ctx, options, renderWidget }) {
16
- return renderWidget(formatTokenCount(ctx.metrics.totalTokens, options.tokenFormatStyle));
17
- },
18
- });
@@ -1,181 +0,0 @@
1
- import type { Theme } from "@earendil-works/pi-coding-agent";
2
-
3
- import type { ColorLevel } from "../colors.js";
4
- import type { GetExtensionStatuses } from "../extension-statuses.js";
5
- import type {
6
- IconMode,
7
- StatuslineData,
8
- WidgetEntry,
9
- WidgetOptions,
10
- WidgetStyle,
11
- } from "../types.js";
12
-
13
- export interface WidgetIconSet {
14
- emoji: string;
15
- nerd: string;
16
- text: string;
17
- }
18
-
19
- export type PropertyKind = "boolean" | "number" | "choice" | "text";
20
-
21
- export interface ChoiceOption<TId extends string = string> {
22
- id: TId;
23
- label: string;
24
- list: string;
25
- }
26
-
27
- export type WidgetPropertyDefault = string | number | boolean;
28
-
29
- // Edit-action discriminant for properties that open a dedicated editor flow. Extend as needed.
30
- export type WidgetEditAction = "external-status-key";
31
-
32
- export interface WidgetProperty {
33
- id: string;
34
- label: string;
35
- kind: PropertyKind;
36
- description: string;
37
- default: WidgetPropertyDefault;
38
- showWhen?: {
39
- property: string;
40
- equals: string | number | boolean;
41
- };
42
- options?: {
43
- min?: number;
44
- max?: number;
45
- choices?: readonly ChoiceOption[];
46
- label?: string;
47
- showInFields?: boolean;
48
- showInWidgets?: boolean;
49
- showInColors?: boolean;
50
- listProperty?: string;
51
- quoteValue?: boolean;
52
- editAction?: WidgetEditAction;
53
- };
54
- }
55
-
56
- export type WidgetBaseOption = "raw" | "hideWhenEmpty" | "hideWhenZero" | "text" | "icon";
57
-
58
- export interface WidgetRenderOptions extends WidgetStyle {
59
- icons?: WidgetIconSet;
60
- preservedTrimStyles?: string;
61
- stripIncomingStyles?: boolean;
62
- }
63
-
64
- // The widget dependency set is the materialized snapshot (StatuslineData) plus the one live
65
- // accessor that must never enter the snapshot — see F1 / pi live-accessor rule.
66
- export type WidgetDependencyValues = StatuslineData & {
67
- getExtensionStatuses: GetExtensionStatuses | undefined;
68
- };
69
-
70
- export type WidgetDependency = keyof WidgetDependencyValues;
71
-
72
- export interface BaseWidgetContext {
73
- iconMode: IconMode;
74
- minimalist: boolean;
75
- colorLevel: ColorLevel;
76
- theme?: Theme;
77
- requestRender?: () => void;
78
- }
79
-
80
- export type WidgetContext<TDeps extends readonly WidgetDependency[] = readonly []> =
81
- BaseWidgetContext & Pick<WidgetDependencyValues, TDeps[number]>;
82
-
83
- export type WidgetInstanceOptions<TOptions extends object> = WidgetOptions & TOptions;
84
-
85
- export interface Widget<TOptions extends object = {}> {
86
- readonly entry: WidgetEntry;
87
- readonly id: string;
88
- readonly type: WidgetEntry["type"];
89
- enabled: boolean;
90
- options: WidgetInstanceOptions<TOptions>;
91
-
92
- render(ctx: WidgetContext): string | undefined;
93
- toggle(enabled?: boolean): void;
94
- update(options: Partial<WidgetInstanceOptions<TOptions>>): void;
95
- toEntry(): WidgetEntry;
96
- }
97
-
98
- type BaseOptionsToObject<TBaseOptions extends readonly WidgetBaseOption[]> = Required<
99
- Pick<WidgetOptions, TBaseOptions[number]>
100
- >;
101
-
102
- type WidgetChoiceValue<TProperty> = TProperty extends {
103
- readonly kind: "choice";
104
- readonly options: { readonly choices: readonly (infer TChoice)[] };
105
- }
106
- ? TChoice extends { readonly id: infer TId extends string }
107
- ? TId
108
- : string
109
- : string;
110
-
111
- type WidgetPropertyValue<TProperty extends Pick<WidgetProperty, "kind">> =
112
- TProperty["kind"] extends "boolean"
113
- ? boolean
114
- : TProperty["kind"] extends "number"
115
- ? number
116
- : TProperty["kind"] extends "choice"
117
- ? WidgetChoiceValue<TProperty>
118
- : string;
119
-
120
- type PropertiesToObject<TProperties extends readonly WidgetProperty[]> = {
121
- [TProperty in TProperties[number] as TProperty["id"]]: WidgetPropertyValue<TProperty>;
122
- };
123
-
124
- export type OptionsFor<TSpec extends Pick<WidgetSpec, "baseOptions" | "properties">> =
125
- WidgetOptions &
126
- BaseOptionsToObject<TSpec["baseOptions"]> &
127
- PropertiesToObject<TSpec["properties"]> &
128
- WidgetStyle;
129
-
130
- export type ContextFor<TSpec extends Pick<WidgetSpec, "dependencies">> = BaseWidgetContext &
131
- Pick<WidgetDependencyValues, TSpec["dependencies"][number]>;
132
-
133
- export interface TypedWidgetRenderArgs<
134
- TSpec extends Pick<WidgetSpec, "dependencies" | "baseOptions" | "properties">,
135
- > {
136
- readonly ctx: ContextFor<TSpec>;
137
- readonly options: OptionsFor<TSpec>;
138
- readonly renderWidget: (
139
- value: string | undefined,
140
- renderOptions?: WidgetRenderOptions,
141
- ) => string | undefined;
142
- }
143
-
144
- export interface WidgetSpec<
145
- TType extends string = string,
146
- TCategory extends string = string,
147
- TDependencies extends readonly WidgetDependency[] = readonly WidgetDependency[],
148
- TBaseOptions extends readonly WidgetBaseOption[] = readonly WidgetBaseOption[],
149
- TProperties extends readonly WidgetProperty[] = readonly WidgetProperty[],
150
- > {
151
- readonly type: TType;
152
- readonly label: string;
153
- readonly category: TCategory;
154
- readonly description: string;
155
- readonly dependencies: TDependencies;
156
- readonly baseOptions: TBaseOptions;
157
- readonly baseOptionDefaults?: Partial<WidgetOptions>;
158
- readonly properties: TProperties;
159
- readonly icons: WidgetIconSet;
160
- readonly defaultStyle: WidgetStyle;
161
- readonly createOptionDefaults?: () => Partial<WidgetOptions>;
162
- render(
163
- args: TypedWidgetRenderArgs<{
164
- readonly dependencies: TDependencies;
165
- readonly baseOptions: TBaseOptions;
166
- readonly properties: TProperties;
167
- }>,
168
- ): string | undefined;
169
- }
170
-
171
- export function defineWidget<
172
- const TType extends string,
173
- const TCategory extends string,
174
- const TDependencies extends readonly WidgetDependency[],
175
- const TBaseOptions extends readonly WidgetBaseOption[],
176
- const TProperties extends readonly WidgetProperty[],
177
- >(
178
- spec: WidgetSpec<TType, TCategory, TDependencies, TBaseOptions, TProperties>,
179
- ): WidgetSpec<TType, TCategory, TDependencies, TBaseOptions, TProperties> {
180
- return spec;
181
- }
@@ -1,11 +0,0 @@
1
- import type { ColorName } from "../../colors.js";
2
-
3
- export function colorPair(
4
- fg: ColorName | undefined,
5
- bg: ColorName | undefined,
6
- ): { fg?: ColorName; bg?: ColorName } {
7
- return {
8
- ...(fg === undefined ? {} : { fg }),
9
- ...(bg === undefined ? {} : { bg }),
10
- };
11
- }
@@ -1,112 +0,0 @@
1
- import { normalizeColor, type ConditionalColorFields } from "../../colors.js";
2
- import type { WidgetOptions } from "../../types.js";
3
- import { colorPair } from "./colors.js";
4
-
5
- export function contextPercent(tokens: number | undefined, maxTokens: number | undefined) {
6
- if (tokens === undefined || maxTokens === undefined || maxTokens <= 0) return undefined;
7
- return Math.min(100, Math.max(0, (tokens / maxTokens) * 100));
8
- }
9
-
10
- interface ContextColorOptions extends WidgetOptions, ConditionalColorFields {
11
- contextConditionalColors: boolean;
12
- contextWarningPercent: number;
13
- contextDangerPercent: number;
14
- }
15
-
16
- export function contextColors(
17
- options: ContextColorOptions,
18
- contextTokens: number | undefined,
19
- contextMaxTokens: number | undefined,
20
- ) {
21
- if (!options.contextConditionalColors) return colorPair(options.fg, options.bg);
22
- const percent = contextPercent(contextTokens, contextMaxTokens);
23
- if (percent === undefined) return colorPair(options.fg, options.bg);
24
-
25
- if (percent >= options.contextDangerPercent) {
26
- return colorPair(
27
- normalizeColor(options.dangerFg) ?? options.fg,
28
- normalizeColor(options.dangerBg) ?? options.bg,
29
- );
30
- }
31
-
32
- if (percent >= options.contextWarningPercent) {
33
- return colorPair(
34
- normalizeColor(options.warningFg) ?? options.fg,
35
- normalizeColor(options.warningBg) ?? options.bg,
36
- );
37
- }
38
-
39
- return colorPair(options.fg, options.bg);
40
- }
41
-
42
- export function contextColorProperties() {
43
- return [
44
- {
45
- id: "contextConditionalColors",
46
- label: "Conditional colors",
47
- kind: "boolean",
48
- description: "Use warning/danger colors based on context usage",
49
- default: false,
50
- options: {
51
- label: "with-colors",
52
- showInWidgets: true,
53
- showInColors: true,
54
- listProperty: "",
55
- },
56
- },
57
- {
58
- id: "contextWarningPercent",
59
- label: "Warning zone threshold",
60
- kind: "number",
61
- description: "Context usage percentage for warning colors",
62
- default: 70,
63
- showWhen: { property: "contextConditionalColors", equals: true },
64
- options: { min: 0, max: 100, showInWidgets: false, showInColors: false },
65
- },
66
- {
67
- id: "contextDangerPercent",
68
- label: "Danger zone threshold",
69
- kind: "number",
70
- description: "Context usage percentage for danger colors",
71
- default: 90,
72
- showWhen: { property: "contextConditionalColors", equals: true },
73
- options: { min: 0, max: 100, showInWidgets: false, showInColors: false },
74
- },
75
- {
76
- id: "warningFg",
77
- label: "Warning foreground",
78
- kind: "text",
79
- description: "Warning foreground",
80
- default: "yellow",
81
- showWhen: { property: "contextConditionalColors", equals: true },
82
- options: { showInFields: false, showInWidgets: false, showInColors: false },
83
- },
84
- {
85
- id: "warningBg",
86
- label: "Warning background",
87
- kind: "text",
88
- description: "Warning background",
89
- default: "default",
90
- showWhen: { property: "contextConditionalColors", equals: true },
91
- options: { showInFields: false, showInWidgets: false, showInColors: false },
92
- },
93
- {
94
- id: "dangerFg",
95
- label: "Danger foreground",
96
- kind: "text",
97
- description: "Danger foreground",
98
- default: "red",
99
- showWhen: { property: "contextConditionalColors", equals: true },
100
- options: { showInFields: false, showInWidgets: false, showInColors: false },
101
- },
102
- {
103
- id: "dangerBg",
104
- label: "Danger background",
105
- kind: "text",
106
- description: "Danger background",
107
- default: "default",
108
- showWhen: { property: "contextConditionalColors", equals: true },
109
- options: { showInFields: false, showInWidgets: false, showInColors: false },
110
- },
111
- ] as const;
112
- }
@@ -1,19 +0,0 @@
1
- export function formatTime(timestamp: number | undefined): string {
2
- if (timestamp === undefined) return "";
3
- return new Date(timestamp).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" });
4
- }
5
-
6
- function formatDuration(ms: number): string {
7
- if (!Number.isFinite(ms) || ms <= 0) return "0m";
8
- const totalMinutes = Math.max(1, Math.floor(ms / 60_000));
9
- const hours = Math.floor(totalMinutes / 60);
10
- const minutes = totalMinutes % 60;
11
- if (hours === 0) return `${minutes}m`;
12
- return minutes === 0 ? `${hours}h` : `${hours}h ${minutes}m`;
13
- }
14
-
15
- export function formatElapsed(first: number | undefined, last: number | undefined): string {
16
- if (first === undefined) return "0m";
17
- const end = last === undefined || last < first ? Date.now() : last;
18
- return formatDuration(end - first);
19
- }
@@ -1,78 +0,0 @@
1
- export function formatCount(value: number) {
2
- if (value < 1000) return `${value}`;
3
- if (value < 1000000) return `${trimFixed(value / 1000, 1)}k`;
4
- return `${trimFixed(value / 1000000, 1)}m`;
5
- }
6
-
7
- export function formatPiTokenCount(value: number) {
8
- if (value < 1000) return `${value}`;
9
- if (value < 10000) return `${(value / 1000).toFixed(1)}k`;
10
- if (value < 1000000) return `${Math.round(value / 1000)}k`;
11
- if (value < 10000000) return `${(value / 1000000).toFixed(1)}M`;
12
- return `${Math.round(value / 1000000)}M`;
13
- }
14
-
15
- function trimFixed(value: number, digits: number) {
16
- return value.toFixed(digits).replace(/\.0$/, "");
17
- }
18
- const TOKEN_FORMAT_STYLES = {
19
- default: {
20
- label: "Default",
21
- list: "Default",
22
- format: formatCount,
23
- },
24
- compact: {
25
- label: "Compact",
26
- list: "Compact",
27
- format: formatPiTokenCount,
28
- },
29
- } as const;
30
-
31
- export type TokenFormatStyle = keyof typeof TOKEN_FORMAT_STYLES;
32
-
33
- const TOKEN_FORMAT_STYLE_VALUES = Object.keys(TOKEN_FORMAT_STYLES) as TokenFormatStyle[];
34
-
35
- const TOKEN_FORMAT_CHOICES = TOKEN_FORMAT_STYLE_VALUES.map((style) => ({
36
- id: style,
37
- label: TOKEN_FORMAT_STYLES[style].label,
38
- list: TOKEN_FORMAT_STYLES[style].list,
39
- }));
40
-
41
- export function formatTokenCount(value: number, style: TokenFormatStyle) {
42
- return TOKEN_FORMAT_STYLES[style].format(value);
43
- }
44
-
45
- export function formatTokenSpeed(
46
- tokens: number,
47
- first: number | undefined,
48
- last: number | undefined,
49
- tokenFormatStyle: TokenFormatStyle,
50
- ) {
51
- if (
52
- first === undefined ||
53
- last === undefined ||
54
- !Number.isFinite(first) ||
55
- !Number.isFinite(last) ||
56
- last <= first
57
- ) {
58
- return "0/min";
59
- }
60
- const minutes = Math.max((last - first) / 60000, 1 / 60);
61
- return `${formatTokenCount(Math.round(tokens / minutes), tokenFormatStyle)}/min`;
62
- }
63
-
64
- export function tokenFormatStyleProperty() {
65
- return {
66
- id: "tokenFormatStyle",
67
- label: "Token format",
68
- kind: "choice",
69
- description: "Token display format",
70
- default: "default",
71
- options: {
72
- choices: TOKEN_FORMAT_CHOICES,
73
- showInWidgets: true,
74
- showInColors: false,
75
- listProperty: "format",
76
- },
77
- } as const;
78
- }