@herbertgao/pi-extensions 2026.10.4 → 2026.10.5

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 (30) hide show
  1. package/README.md +1 -1
  2. package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +12 -7
  3. package/node_modules/@herbertgao/pi-cc-extensions/README.md +12 -7
  4. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +67 -16
  5. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +240 -48
  6. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/footer-currency.ts +29 -0
  7. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/footer.ts +92 -59
  8. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/git-stats.ts +162 -0
  9. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/token-rate.ts +192 -0
  10. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/working-message.ts +51 -65
  11. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +113 -25
  12. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +160 -24
  13. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/index.ts +30 -1
  14. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/interaction.ts +26 -24
  15. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/sticky-prompt.ts +402 -0
  16. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/ask-user-question.ts +173 -0
  17. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/codemode.ts +4 -8
  18. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-edit-render.ts +64 -11
  19. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-presentation.ts +41 -0
  20. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-renderer.ts +5 -1
  21. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-write-render.ts +35 -9
  22. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +101 -31
  23. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/names.ts +3 -3
  24. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/result.ts +106 -15
  25. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/format.ts +9 -0
  26. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/patch-keys.ts +5 -0
  27. package/node_modules/@herbertgao/pi-cc-extensions/package.json +4 -4
  28. package/node_modules/@herbertgao/pi-cc-extensions/themes/cc-dark.json +1 -1
  29. package/node_modules/@herbertgao/pi-cc-extensions/themes/cc-light.json +1 -1
  30. package/package.json +2 -2
package/README.md CHANGED
@@ -46,7 +46,7 @@ Pi loads their extensions and skills through `node_modules/` paths inside one pa
46
46
 
47
47
  The local `@herbertgao/resume-from` fork is retired. If it is installed separately, remove that package before upgrading the aggregate to avoid registering `/resume-from` twice. The aggregate now uses upstream `resume-from@0.4.1`; its v0.4.0 start-directory fix supersedes our local patch.
48
48
 
49
- The locally customized CC and SoL-Pi packages now follow complete upstream baselines `pi-cc-extensions@0.9.10` and SoL-Pi main `e1a586af`, with local behavior replayed on top. Action Fusion and ccstyle write rich diffs coexist without disabling either feature. All four SoL-Pi features remain opt-in; its new non-persistent-session evidence archives remain on disk for consumers and require host or caller cleanup.
49
+ The locally customized CC and SoL-Pi packages now follow complete upstream baselines `pi-cc-extensions@1.0.1` and SoL-Pi main `e1a586af`, with local behavior replayed on top. Action Fusion and ccstyle write rich diffs coexist without disabling either feature. All four SoL-Pi features remain opt-in; its new non-persistent-session evidence archives remain on disk for consumers and require host or caller cleanup.
50
50
 
51
51
  ### Agency Agents
52
52
 
@@ -61,15 +61,15 @@ Renderer snapshots for `on` / `compact` modes: [default](./docs/tool-render-exam
61
61
  "expandedOutputMaxLines": 10, // expanded tool Output lines; overflow shows a footer hint
62
62
  "expandedPreviewMaxLines": 40, // max lines for expanded TaskList bodies (expanded diffs always show all)
63
63
  "expandedCardBackground": "userMessageBg", // expanded card background slot: userMessageBg (same as user prompts) / toolPendingBg (neutral) etc.
64
- "inputClip": 0, // tool summary path/command clip length; 0 = fit width
64
+ "toolLabelClip": 0, // tool summary path/command clip length; 0 = fit width
65
65
  "showStartupHeader": true, // startup header (logo + tips) toggle
66
- "scrollStepLines": 3, // fullscreen wheel scroll step
66
+ "stickyUserMessage": true, // fullscreen: pin a user message's first line once it scrolls off the top edge, until the next one takes over
67
67
 
68
68
  // diff
69
69
  "diffViewMode": "auto", // layout: auto / split / unified
70
70
  "diffIndicatorMode": "bars", // change indicators: bars / classic / none
71
71
  "diffSplitMinWidth": 120, // min terminal width for side-by-side columns
72
- "editDiffCollapsedLines": 24, // Edit collapse lines; beyond that shows the expand hint
72
+ "editDiffCollapsedLines": 24, // edit collapse lines; 0 = change-count summary only
73
73
  "writeDiffCollapsedLines": 0, // write collapse lines; 0 = creation summary only
74
74
  "diffWordWrap": true, // wrap long diff lines
75
75
 
@@ -81,7 +81,12 @@ Renderer snapshots for `on` / `compact` modes: [default](./docs/tool-render-exam
81
81
 
82
82
  // footer
83
83
  "enableCustomFooter": true, // custom status bar
84
+ "footerTokenRate": true, // output rate chip; false hides it
85
+ "footerTokenRateMode": "average", // average: whole-prompt avg; live: trailing 1s rate
86
+ "footerCurrency": "USD", // display currency for the footer cost
87
+ "footerCurrencyRate": null, // display units per 1 cost unit; null changes the symbol only
84
88
  "footerNerdIcons": true, // Nerd Font glyphs for git/cache; false = plain text
89
+ "footerGitStatsMode": "working", // working (default): uncommitted; branch: cumulative net changes
85
90
  "footerHiddenKeys": [], // hidden plugin chip keys
86
91
  "footerLine1Keys": ["pi-usage"], // line1 plugin chip order; pi-usage is shown by default, data from @narumitw/pi-usage
87
92
  "footerLine2Keys": [], // line2 plugin chip order (after cwd/git)
@@ -90,7 +95,7 @@ Renderer snapshots for `on` / `compact` modes: [default](./docs/tool-render-exam
90
95
  ```
91
96
 
92
97
  > [!TIP]
93
- > **Fullscreen**: click `click to show more` to expand tool cards, thinking, Skill, and compact summaries. An expanded diff always shows every line; when expanded Input/Output exceeds the line cap, the footer `… +N more lines · click to show more` opens a full preview. Click to collapse (dragging inside the card selects text).
98
+ > **Fullscreen**: click `click to show more` to expand tool cards, thinking, Skill, and compact summaries. An expanded diff always shows every line; when expanded Input/Output exceeds the line cap, the footer `… +N more lines · click to show more` opens a full preview. Click to collapse.
94
99
 
95
100
  > [!NOTE]
96
101
  > **Mermaid rendering**: set `markdown.mermaid` to `final` via `~/.pi/agent/settings.json` or the Mermaid diagrams option in `/settings`. Default `streaming` redraws per frame; `final` renders once at completion.
@@ -100,9 +105,9 @@ Renderer snapshots for `on` / `compact` modes: [default](./docs/tool-render-exam
100
105
  ```bash
101
106
  npm test
102
107
  npm run typecheck
103
- ./test.sh # macOS/Linux: load the local checkout for one run, then restore
104
- test.bat # Windows: same (calls test.ps1)
105
- # one-off run without touching settings: pi -e .
108
+ ./test.sh # macOS/Linux: load the local checkout for one run, then restore
109
+ ./test.bat # Windows: runs test.sh through Git Bash
110
+ pi -e . # one run, does not edit settings.json
106
111
  ```
107
112
 
108
113
  ## Compatibility
@@ -61,15 +61,15 @@ pi install git:github.com/HerbertGao/pi-extensions
61
61
  "expandedOutputMaxLines": 10, // 展开工具卡 Output 可见行数,超出在末行显示展开提示
62
62
  "expandedPreviewMaxLines": 40, // 展开 TaskList 正文最大行数(展开 diff 始终全量)
63
63
  "expandedCardBackground": "userMessageBg", // 展开卡背景槽位;userMessageBg 与用户消息同色,toolPendingBg 为中性灰
64
- "inputClip": 0, // 工具摘要 path/command 折叠字符数;0 = 按可用宽度
64
+ "toolLabelClip": 0, // 工具摘要 path/command 折叠字符数;0 = 按可用宽度
65
65
  "showStartupHeader": true, // 启动头(logo + tips)开关
66
- "scrollStepLines": 3, // fullscreen 滚轮步进
66
+ "stickyUserMessage": true, // fullscreen:userMessage 正文首行滚出视口上沿后钉住,直到下一条指令接手
67
67
 
68
68
  // diff
69
69
  "diffViewMode": "auto", // 布局:auto / split / unified
70
70
  "diffIndicatorMode": "bars", // 变更指示:bars / classic / none
71
71
  "diffSplitMinWidth": 120, // 左右分栏的最小终端宽度
72
- "editDiffCollapsedLines": 24, // Edit 折叠行数,超出显示展开提示
72
+ "editDiffCollapsedLines": 24, // edit 折叠行数;0 仅显示变更统计摘要
73
73
  "writeDiffCollapsedLines": 0, // write 折叠行数,0 仅显示创建摘要
74
74
  "diffWordWrap": true, // 长 diff 行换行
75
75
 
@@ -81,7 +81,12 @@ pi install git:github.com/HerbertGao/pi-extensions
81
81
 
82
82
  // footer
83
83
  "enableCustomFooter": true, // 自定义状态栏
84
+ "footerTokenRate": true, // 输出速率芯片;false 隐藏
85
+ "footerTokenRateMode": "average", // average:整段指令平均(avg);live:最近 1 秒瞬时(live)
86
+ "footerCurrency": "USD", // 底栏费用的显示币种
87
+ "footerCurrencyRate": null, // 1 单位费用换成多少显示币种;null 只换符号、不乘倍率
84
88
  "footerNerdIcons": true, // git/缓存用 Nerd Font 图标;false 为纯文本
89
+ "footerGitStatsMode": "working", // working(默认):未提交改动;branch:分支累计净改动
85
90
  "footerHiddenKeys": [], // 隐藏的插件芯片 key
86
91
  "footerLine1Keys": ["pi-usage"], // line1 插件芯片顺序;pi-usage 默认显示,数据来自 @narumitw/pi-usage
87
92
  "footerLine2Keys": [], // line2 插件芯片顺序(接在 cwd/git 后)
@@ -90,7 +95,7 @@ pi install git:github.com/HerbertGao/pi-extensions
90
95
  ```
91
96
 
92
97
  > [!TIP]
93
- > **全屏模式**:单击 `click to show more` 展开工具卡、思考、Skill 和 compact 摘要;工具卡展开态 diff 全量显示,Input/Output 超行时末行 `… +N more lines · click to show more` 打开全量预览,单击收起(卡内拖动为选中文本)。
98
+ > **全屏模式**:单击 `click to show more` 展开工具卡、思考、Skill 和 compact 摘要;工具卡展开态 diff 全量显示,Input/Output 超行时末行 `… +N more lines · click to show more` 打开全量预览,单击收起。
94
99
 
95
100
  > [!NOTE]
96
101
  > **Mermaid 渲染**:建议把 `markdown.mermaid` 设为 `final`(`~/.pi/agent/settings.json` 或 `/settings` 面板的 Mermaid diagrams 选项)。默认 `streaming` 逐帧重绘,`final` 渲染最终版更稳定。
@@ -100,9 +105,9 @@ pi install git:github.com/HerbertGao/pi-extensions
100
105
  ```bash
101
106
  npm test
102
107
  npm run typecheck
103
- ./test.sh # macOS/Linux:临时加载本地检出,退出后还原
104
- test.bat # Windows:同上(调用 test.ps1)
105
- # 只想跑一次、不改配置:pi -e .
108
+ ./test.sh # macOS/Linux:临时加载本地检出,退出后还原
109
+ ./test.bat # Windows:经 Git Bash 运行 test.sh
110
+ pi -e . # 只跑一次,不改 settings.json
106
111
  ```
107
112
 
108
113
  ## 兼容性
@@ -13,11 +13,14 @@ export type CompactStyleMode = "on" | "compact" | "off";
13
13
 
14
14
  export type DiffViewMode = "auto" | "split" | "unified";
15
15
  export type DiffIndicatorMode = "bars" | "classic" | "none";
16
+ export type FooterGitStatsMode = "working" | "branch";
17
+ export type FooterTokenRateMode = "average" | "live";
16
18
 
17
19
  export interface ToolDisplayConfig {
18
20
  diffViewMode: DiffViewMode;
19
21
  diffIndicatorMode: DiffIndicatorMode;
20
22
  diffSplitMinWidth: number;
23
+ /** Edit-only collapsed body lines. 0 = change counts and an expand hint. */
21
24
  editDiffCollapsedLines: number;
22
25
  /** Write-only collapsed body lines. 0 = `↳ created · click to show more`. */
23
26
  writeDiffCollapsedLines: number;
@@ -57,13 +60,14 @@ export type Config = {
57
60
  expandedCardBackground: ThemeBg;
58
61
  expandedInputMaxLines: number;
59
62
  expandedOutputMaxLines: number;
60
- inputClip: number;
63
+ toolLabelClip: number;
61
64
  useSummaryTitlesAsThinkingTitle: boolean;
62
65
  previewLines: number;
63
66
  animationIntervalMs: number;
64
67
  dimThinkingText: boolean;
65
68
  showStartupHeader: boolean;
66
- scrollStepLines: number;
69
+ /** fullscreen:userMessage 正文首行滚出视口上沿后钉住,直到下一条指令接手。 */
70
+ stickyUserMessage: boolean;
67
71
  enableSessionReference: boolean;
68
72
  enableSubagentAutocomplete: boolean;
69
73
  enableContextCommand: boolean;
@@ -71,7 +75,16 @@ export type Config = {
71
75
  enableWorkingMessage: boolean;
72
76
  enableAliases: boolean;
73
77
  enableCustomFooter: boolean;
78
+ /** footer 输出速率芯片。关则不显示。 */
79
+ footerTokenRate: boolean;
80
+ /** average:整段指令墙钟平均;live:最近 1 秒瞬时速率,空档回退平均。 */
81
+ footerTokenRateMode: FooterTokenRateMode;
82
+ /** ISO 4217 显示币种。USD 时不换算。 */
83
+ footerCurrency: string;
84
+ /** 1 单位费用对应的显示币种数量。null 只换符号、不乘倍率。 */
85
+ footerCurrencyRate: number | null;
74
86
  footerNerdIcons: boolean;
87
+ footerGitStatsMode: FooterGitStatsMode;
75
88
  footerHiddenKeys: string[];
76
89
  footerLine1Keys: string[];
77
90
  footerLine2Keys: string[];
@@ -84,8 +97,10 @@ const LEGACY_CONFIG_PATH = join(AGENT_DIR, "claude-code-style.json");
84
97
 
85
98
  export const DIFF_VIEW_MODES: DiffViewMode[] = ["auto", "split", "unified"];
86
99
  export const DIFF_INDICATOR_MODES: DiffIndicatorMode[] = ["bars", "classic", "none"];
100
+ export const FOOTER_GIT_STATS_MODES: FooterGitStatsMode[] = ["working", "branch"];
101
+ export const FOOTER_TOKEN_RATE_MODES: FooterTokenRateMode[] = ["average", "live"];
87
102
  export const DIFF_SPLIT_MIN_WIDTH_VALUES = ["80", "100", "120", "140", "160", "180"];
88
- export const DIFF_COLLAPSED_LINES_VALUES = ["12", "24", "36", "48", "80", "120"];
103
+ export const DIFF_COLLAPSED_LINES_VALUES = ["0", "12", "24", "36", "48", "80", "120"];
89
104
  /** Write collapsed presets. 0 = stats only (`+N -0` + expand hint). */
90
105
  export const WRITE_DIFF_COLLAPSED_LINES_VALUES = ["0", "4", "8", "12", "24", "36"];
91
106
  /** Presets for expanded body height — keep low options first so cycling stays TUI-friendly. */
@@ -109,11 +124,9 @@ export const EXPANDED_INPUT_MAX_LINES_VALUES = ["5", "10", "20", "40", "80"];
109
124
  /** 展开工具卡 Output 可见行数预设。 */
110
125
  export const EXPANDED_OUTPUT_MAX_LINES_VALUES = ["10", "20", "40", "80", "120"];
111
126
  /** 工具摘要里 path/command 等输入的折叠字符数;0 = 只按可用宽度截断。 */
112
- export const INPUT_CLIP_VALUES = ["0", "40", "60", "80", "100", "120", "160"];
127
+ export const TOOL_LABEL_CLIP_VALUES = ["0", "40", "60", "80", "100", "120", "160"];
113
128
  export const THINKING_PREVIEW_LINES_VALUES = ["0", "1", "3", "5", "10"];
114
129
  export const THINKING_ANIMATION_INTERVAL_VALUES = ["40", "60", "90", "120", "180"];
115
- /** fullscreen 滚轮步进行数预设。 */
116
- export const SCROLL_STEP_LINES_VALUES = ["1", "2", "3", "5", "10"];
117
130
  /** Tools commonly toggled in excludeRenderers via the settings panel. */
118
131
  export const EXCLUDE_RENDERER_CANDIDATES = [
119
132
  "bash",
@@ -142,13 +155,13 @@ export const DEFAULT_CONFIG: Config = {
142
155
  expandedCardBackground: "userMessageBg",
143
156
  expandedInputMaxLines: 5,
144
157
  expandedOutputMaxLines: 10,
145
- inputClip: 0,
158
+ toolLabelClip: 0,
146
159
  useSummaryTitlesAsThinkingTitle: true,
147
160
  previewLines: 3,
148
161
  animationIntervalMs: 90,
149
162
  dimThinkingText: false,
150
163
  showStartupHeader: true,
151
- scrollStepLines: 3,
164
+ stickyUserMessage: true,
152
165
  enableSessionReference: true,
153
166
  enableSubagentAutocomplete: true,
154
167
  enableContextCommand: true,
@@ -156,7 +169,12 @@ export const DEFAULT_CONFIG: Config = {
156
169
  enableWorkingMessage: true,
157
170
  enableAliases: true,
158
171
  enableCustomFooter: true,
172
+ footerTokenRate: true,
173
+ footerTokenRateMode: "average",
174
+ footerCurrency: "USD",
175
+ footerCurrencyRate: null,
159
176
  footerNerdIcons: true,
177
+ footerGitStatsMode: "working",
160
178
  ...DEFAULT_FOOTER_CHIP_LAYOUT,
161
179
  };
162
180
 
@@ -172,10 +190,10 @@ export function pickPositiveInt(value: unknown, fallback: number, min = 1, max =
172
190
  return Math.min(max, Math.max(min, Math.floor(n)));
173
191
  }
174
192
 
175
- /** inputClip:0 表示按宽度自适应,其余夹到 8..500。 */
176
- export function pickInputClip(value: unknown): number {
193
+ /** toolLabelClip:0 表示按宽度自适应,其余夹到 8..500。 */
194
+ export function pickToolLabelClip(value: unknown): number {
177
195
  const n = typeof value === "number" ? value : typeof value === "string" ? Number(value) : NaN;
178
- return n === 0 ? 0 : pickPositiveInt(value, DEFAULT_CONFIG.inputClip, 8, 500);
196
+ return n === 0 ? 0 : pickPositiveInt(value, DEFAULT_CONFIG.toolLabelClip, 8, 500);
179
197
  }
180
198
 
181
199
  export function pickPositiveNumber(value: unknown, fallback: number, min = 1): number {
@@ -183,6 +201,19 @@ export function pickPositiveNumber(value: unknown, fallback: number, min = 1): n
183
201
  return Number.isFinite(n) ? Math.max(min, n) : fallback;
184
202
  }
185
203
 
204
+ function normalizeCurrency(value: unknown): string {
205
+ return typeof value === "string" && /^[A-Za-z]{3}$/.test(value.trim())
206
+ ? value.trim().toUpperCase()
207
+ : "USD";
208
+ }
209
+
210
+ /** 缺失、空串、非正数都视为不换算。 */
211
+ function normalizeFooterCurrencyRate(value: unknown): number | null {
212
+ if (value === undefined || value === null || value === "") return null;
213
+ const n = typeof value === "number" ? value : typeof value === "string" ? Number(value) : NaN;
214
+ return Number.isFinite(n) && n > 0 ? n : null;
215
+ }
216
+
186
217
  export function normalizeConfig(input: unknown): Config {
187
218
  const source = (input && typeof input === "object" ? input : {}) as Record<string, unknown>;
188
219
  const mode = pickEnum(source.mode, ["on", "compact", "off"], DEFAULT_CONFIG.mode);
@@ -213,7 +244,7 @@ export function normalizeConfig(input: unknown): Config {
213
244
  editDiffCollapsedLines: pickPositiveInt(
214
245
  source.editDiffCollapsedLines,
215
246
  DEFAULT_CONFIG.editDiffCollapsedLines,
216
- 1,
247
+ 0,
217
248
  500,
218
249
  ),
219
250
  writeDiffCollapsedLines: pickPositiveInt(
@@ -246,7 +277,9 @@ export function normalizeConfig(input: unknown): Config {
246
277
  1,
247
278
  5_000,
248
279
  ),
249
- inputClip: pickInputClip(source.inputClip),
280
+ toolLabelClip: pickToolLabelClip(
281
+ source.toolLabelClip ?? source.inputClip, // 兼容旧配置键
282
+ ),
250
283
  useSummaryTitlesAsThinkingTitle: source.useSummaryTitlesAsThinkingTitle !== false,
251
284
  previewLines: pickPositiveInt(
252
285
  source.previewLines,
@@ -260,7 +293,7 @@ export function normalizeConfig(input: unknown): Config {
260
293
  ),
261
294
  dimThinkingText: source.dimThinkingText === true,
262
295
  showStartupHeader: source.showStartupHeader !== false,
263
- scrollStepLines: pickPositiveInt(source.scrollStepLines, DEFAULT_CONFIG.scrollStepLines, 1, 50),
296
+ stickyUserMessage: source.stickyUserMessage !== false,
264
297
  enableSessionReference: source.enableSessionReference !== false,
265
298
  enableSubagentAutocomplete: source.enableSubagentAutocomplete !== false,
266
299
  enableContextCommand: source.enableContextCommand !== false,
@@ -268,7 +301,20 @@ export function normalizeConfig(input: unknown): Config {
268
301
  enableWorkingMessage: source.enableWorkingMessage !== false,
269
302
  enableAliases: source.enableAliases !== false,
270
303
  enableCustomFooter: source.enableCustomFooter !== false,
304
+ footerTokenRate: source.footerTokenRate !== false,
305
+ footerTokenRateMode: pickEnum(
306
+ source.footerTokenRateMode,
307
+ FOOTER_TOKEN_RATE_MODES,
308
+ DEFAULT_CONFIG.footerTokenRateMode,
309
+ ),
310
+ footerCurrency: normalizeCurrency(source.footerCurrency),
311
+ footerCurrencyRate: normalizeFooterCurrencyRate(source.footerCurrencyRate),
271
312
  footerNerdIcons: source.footerNerdIcons !== false,
313
+ footerGitStatsMode: pickEnum(
314
+ source.footerGitStatsMode,
315
+ FOOTER_GIT_STATS_MODES,
316
+ DEFAULT_CONFIG.footerGitStatsMode,
317
+ ),
272
318
  ...normalizeFooterChipLayout(source),
273
319
  };
274
320
  }
@@ -310,13 +356,13 @@ export function formatConfigStatus(source: Config = config): string {
310
356
  `expandedMax=${source.expandedPreviewMaxLines}`,
311
357
  `expandedInput=${source.expandedInputMaxLines}`,
312
358
  `expandedOutput=${source.expandedOutputMaxLines}`,
313
- `inputClip=${source.inputClip}`,
359
+ `toolLabelClip=${source.toolLabelClip}`,
314
360
  `thinkingTitle=${source.useSummaryTitlesAsThinkingTitle ? "summary" : "default"}`,
315
361
  `thinkingPreview=${source.previewLines}`,
316
362
  `thinkingAnimation=${source.animationIntervalMs}ms`,
317
363
  `thinkingDim=${source.dimThinkingText ? "on" : "off"}`,
318
364
  `startupHeader=${source.showStartupHeader ? "on" : "off"}`,
319
- `scrollStep=${source.scrollStepLines}`,
365
+ `stickyUserMessage=${source.stickyUserMessage ? "on" : "off"}`,
320
366
  `sessionRef=${source.enableSessionReference ? "on" : "off"}`,
321
367
  `subagentAuto=${source.enableSubagentAutocomplete ? "on" : "off"}`,
322
368
  `context=${source.enableContextCommand ? "on" : "off"}`,
@@ -324,7 +370,12 @@ export function formatConfigStatus(source: Config = config): string {
324
370
  `workingMsg=${source.enableWorkingMessage ? "on" : "off"}`,
325
371
  `aliases=${source.enableAliases ? "on" : "off"}`,
326
372
  `footer=${source.enableCustomFooter ? "on" : "off"}`,
373
+ `footerTokenRate=${source.footerTokenRate ? "on" : "off"}`,
374
+ `footerTokenRateMode=${source.footerTokenRateMode}`,
375
+ `footerCurrency=${source.footerCurrency}`,
376
+ `footerRate=${source.footerCurrencyRate ?? "-"}`,
327
377
  `footerIcons=${source.footerNerdIcons ? "nerd" : "plain"}`,
378
+ `footerGitStats=${source.footerGitStatsMode}`,
328
379
  formatFooterChipSummary(source),
329
380
  ].join(" · ");
330
381
  }