@herbertgao/pi-extensions 2026.9.19 → 2026.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.
Files changed (444) hide show
  1. package/README.md +14 -16
  2. package/THIRD_PARTY_NOTICES.md +29 -3
  3. package/node_modules/@herbertgao/pi-bark/README.md +39 -3
  4. package/node_modules/@herbertgao/pi-bark/package.json +1 -1
  5. package/node_modules/@herbertgao/pi-bark/src/index.ts +275 -15
  6. package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +85 -68
  7. package/node_modules/@herbertgao/pi-cc-extensions/README.md +79 -62
  8. package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/preview.webp +0 -0
  9. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +116 -34
  10. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +370 -118
  11. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/agent-summary/core.ts +6 -36
  12. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/agent-summary/index.ts +2 -2
  13. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +31 -33
  14. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/context.ts +330 -360
  15. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/reference/index.ts +56 -108
  16. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/reference/session.ts +97 -15
  17. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/reference/subagent.ts +80 -45
  18. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/flush-docked-bash.ts +36 -0
  19. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/footer-layout.ts +229 -0
  20. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/footer.ts +521 -0
  21. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/mcp-chip.ts +136 -0
  22. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/startup-header.ts +92 -61
  23. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/working-message.ts +58 -38
  24. package/node_modules/@herbertgao/pi-cc-extensions/extensions/index.ts +19 -3
  25. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +1127 -231
  26. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +267 -262
  27. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/index.ts +38 -48
  28. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/markdown-enhance.ts +8 -2
  29. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/hover.ts +2 -7
  30. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/interaction.ts +287 -114
  31. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/layout.ts +15 -6
  32. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/packets.ts +18 -72
  33. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/scroll.ts +61 -26
  34. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/codemode.ts +303 -0
  35. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/ansi-utils.ts +25 -57
  36. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-component.ts +125 -0
  37. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-edit-render.ts +227 -0
  38. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-header.ts +136 -0
  39. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-highlight.ts +151 -0
  40. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-inline.ts +324 -0
  41. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-layout.ts +762 -0
  42. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-limits.ts +152 -0
  43. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-palette.ts +410 -0
  44. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-parse.ts +535 -0
  45. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-presentation.ts +4 -4
  46. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-renderer.ts +21 -3219
  47. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-text.ts +44 -0
  48. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-write-render.ts +568 -0
  49. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/index.ts +103 -48
  50. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/line-width-safety.ts +8 -7
  51. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/write-execution.ts +2 -1
  52. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +171 -196
  53. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/mcp-title.ts +39 -0
  54. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{message-display.ts → tool/message-display.ts} +27 -93
  55. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/names.ts +429 -0
  56. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/result.ts +259 -164
  57. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{show-more-hint.ts → tool/show-more-hint.ts} +10 -0
  58. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/transcript-refresh.ts +8 -26
  59. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/ansi-color.ts +44 -0
  60. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/ansi-text.ts +77 -0
  61. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/component-tree.ts +34 -0
  62. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/format.ts +28 -0
  63. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/fullscreen-detect.ts +51 -0
  64. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/patch-keys.ts +124 -0
  65. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/sgr-mouse.ts +70 -0
  66. package/node_modules/@herbertgao/pi-cc-extensions/package.json +10 -8
  67. package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +6 -0
  68. package/node_modules/@herbertgao/pi-subagents/package.json +1 -1
  69. package/node_modules/@herbertgao/pi-subagents/src/mention-clone.ts +3 -2
  70. package/node_modules/@herbertgao/sol-pi/CONTRIBUTING.md +22 -0
  71. package/node_modules/@herbertgao/sol-pi/README.md +36 -17
  72. package/node_modules/@herbertgao/sol-pi/THIRD_PARTY_NOTICES.md +10 -6
  73. package/node_modules/@herbertgao/sol-pi/agents-install.md +15 -12
  74. package/node_modules/@herbertgao/sol-pi/docs/compatibility.md +24 -8
  75. package/node_modules/@herbertgao/sol-pi/docs/configuration.md +2 -2
  76. package/node_modules/@herbertgao/sol-pi/docs/star-history.md +18 -0
  77. package/node_modules/@herbertgao/sol-pi/package.json +4 -2
  78. package/node_modules/@herbertgao/sol-pi/scripts/check-sol-pi-config.mjs +1 -1
  79. package/node_modules/@herbertgao/sol-pi/src/sol-pi/config.ts +1 -1
  80. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/action-fusion/file-queue.ts +23 -4
  81. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/action-fusion/index.ts +32 -1
  82. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/action-fusion/then-run.ts +3 -2
  83. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/observation-pack/observation.ts +1 -1
  84. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/economics.ts +27 -7
  85. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/extension.ts +137 -41
  86. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/index.ts +1 -0
  87. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/plan.ts +2 -1
  88. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/projection.ts +58 -0
  89. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/state.ts +28 -6
  90. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/tools.ts +2 -1
  91. package/node_modules/@herbertgao/sol-pi/src/sol-pi/runtime-paths.ts +15 -2
  92. package/node_modules/@juicesharp/rpiv-ask-user-question/package.json +2 -2
  93. package/node_modules/@pi-plugins/fast-mode/README.md +7 -1
  94. package/node_modules/@pi-plugins/fast-mode/dist/index.d.mts.map +1 -1
  95. package/node_modules/@pi-plugins/fast-mode/dist/index.mjs +7 -1
  96. package/node_modules/@pi-plugins/fast-mode/dist/index.mjs.map +1 -1
  97. package/node_modules/@pi-plugins/fast-mode/package.json +5 -5
  98. package/node_modules/pi-antigravity/README.md +3 -0
  99. package/node_modules/pi-antigravity/package.json +8 -8
  100. package/node_modules/pi-antigravity/src/auth/oauth.ts +6 -3
  101. package/node_modules/pi-antigravity/src/index.ts +114 -110
  102. package/node_modules/pi-antigravity/src/stream/stream.ts +1 -1
  103. package/node_modules/pi-antigravity/src/utils/util.ts +18 -1
  104. package/node_modules/pi-multi-account/CHANGELOG.md +20 -0
  105. package/node_modules/pi-multi-account/README.md +46 -8
  106. package/node_modules/pi-multi-account/config-file-transaction.ts +42 -0
  107. package/node_modules/pi-multi-account/index.ts +255 -269
  108. package/node_modules/pi-multi-account/model-pins.ts +36 -0
  109. package/node_modules/pi-multi-account/package.json +9 -7
  110. package/node_modules/pi-multi-account/slot-proxy-auth.ts +12 -2
  111. package/node_modules/pi-multi-account/slot-proxy.ts +27 -5
  112. package/node_modules/pi-web-access/CHANGELOG.md +17 -0
  113. package/node_modules/pi-web-access/README.md +6 -3
  114. package/node_modules/pi-web-access/brave-rate-limit.ts +170 -0
  115. package/node_modules/pi-web-access/brave.ts +28 -11
  116. package/node_modules/pi-web-access/dist/index.js +202 -33
  117. package/node_modules/pi-web-access/gemini-search.ts +2 -5
  118. package/node_modules/pi-web-access/index.ts +13 -7
  119. package/node_modules/pi-web-access/openai-search.ts +24 -10
  120. package/node_modules/pi-web-access/package.json +1 -1
  121. package/node_modules/pi-web-access/summary-review.ts +8 -2
  122. package/node_modules/{@herbertgao/resume-from → resume-from}/README.md +16 -12
  123. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/adapter.d.ts +0 -5
  124. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/adapter.js +2 -3
  125. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/contract.d.ts +2 -2
  126. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/reader.d.ts +3 -0
  127. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/reader.js +27 -15
  128. package/node_modules/{@herbertgao/resume-from/dist/adapters/codex → resume-from/dist/adapters/claude-code}/redaction.js +16 -3
  129. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/writer.d.ts +2 -4
  130. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/writer.js +1 -1
  131. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/contract.d.ts +2 -4
  132. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/index.js +1 -2
  133. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/read.d.ts +16 -0
  134. package/node_modules/resume-from/dist/adapters/codex/read.js +723 -0
  135. package/node_modules/{@herbertgao/resume-from/dist/adapters/pi → resume-from/dist/adapters/codex}/redaction.js +16 -3
  136. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/rollout.d.ts +44 -4
  137. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/rollout.js +88 -4
  138. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/write.d.ts +2 -2
  139. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/write.js +2 -2
  140. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/contract.d.ts +5 -1
  141. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/adapter.js +10 -6
  142. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/contract.d.ts +2 -2
  143. package/node_modules/{@herbertgao/resume-from/dist/adapters/claude-code → resume-from/dist/adapters/pi}/redaction.js +16 -3
  144. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/serialize.d.ts +2 -4
  145. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/serialize.js +2 -2
  146. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/render.d.ts +1 -1
  147. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/render.js +4 -4
  148. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/runner.js +2 -2
  149. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/contract.d.ts +2 -2
  150. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/command.js +31 -8
  151. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/wiring.d.ts +1 -1
  152. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/wiring.js +1 -2
  153. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/confirmation.d.ts +4 -1
  154. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/confirmation.js +2 -2
  155. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/contract.d.ts +8 -6
  156. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/contract.d.ts +10 -5
  157. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/finder.d.ts +2 -1
  158. package/node_modules/resume-from/dist/import/discovery/finder.js +269 -0
  159. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/contract.d.ts +3 -3
  160. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/lander.js +3 -3
  161. package/node_modules/resume-from/dist/import/pipeline.d.ts +28 -0
  162. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/pipeline.js +31 -11
  163. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/builder.d.ts +2 -2
  164. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/builder.js +9 -5
  165. package/node_modules/resume-from/dist/import/preview/warnings.d.ts +14 -0
  166. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/warnings.js +26 -20
  167. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/wiring.js +12 -2
  168. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/contract.d.ts +9 -3
  169. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/git.d.ts +4 -4
  170. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/git.js +7 -4
  171. package/node_modules/resume-from/dist/platform/repo/reader.d.ts +3 -0
  172. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/reader.js +60 -20
  173. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/session/contract.d.ts +8 -1
  174. package/node_modules/{@herbertgao/resume-from → resume-from}/package.json +19 -32
  175. package/node_modules/{@herbertgao/resume-from → resume-from}/shims/pi/extensions/resume-from.js +2 -2
  176. package/package.json +18 -22
  177. package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/hero.en.svg +0 -101
  178. package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/hero.svg +0 -101
  179. package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/welcome.webp +0 -0
  180. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/render-utils.ts +0 -5
  181. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/types.ts +0 -30
  182. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/write-display-utils.ts +0 -12
  183. package/node_modules/@herbertgao/resume-from/dist/adapters/codex/read.js +0 -270
  184. package/node_modules/@herbertgao/resume-from/dist/import/discovery/finder.js +0 -129
  185. package/node_modules/@herbertgao/resume-from/dist/import/pipeline.d.ts +0 -17
  186. package/node_modules/@herbertgao/resume-from/dist/import/preview/warnings.d.ts +0 -11
  187. package/node_modules/@herbertgao/resume-from/dist/platform/repo/reader.d.ts +0 -8
  188. package/node_modules/pi-footer/CHANGELOG.md +0 -145
  189. package/node_modules/pi-footer/LICENSE +0 -21
  190. package/node_modules/pi-footer/README.md +0 -354
  191. package/node_modules/pi-footer/package.json +0 -68
  192. package/node_modules/pi-footer/src/cache.ts +0 -106
  193. package/node_modules/pi-footer/src/colors.ts +0 -237
  194. package/node_modules/pi-footer/src/config.ts +0 -202
  195. package/node_modules/pi-footer/src/event-widgets.ts +0 -41
  196. package/node_modules/pi-footer/src/extension-statuses.ts +0 -102
  197. package/node_modules/pi-footer/src/git.ts +0 -135
  198. package/node_modules/pi-footer/src/index.ts +0 -268
  199. package/node_modules/pi-footer/src/metrics.ts +0 -141
  200. package/node_modules/pi-footer/src/presets.ts +0 -383
  201. package/node_modules/pi-footer/src/render.ts +0 -114
  202. package/node_modules/pi-footer/src/separators.ts +0 -52
  203. package/node_modules/pi-footer/src/types.ts +0 -122
  204. package/node_modules/pi-footer/src/ui/color-level-confirm.ts +0 -22
  205. package/node_modules/pi-footer/src/ui/color-options.ts +0 -195
  206. package/node_modules/pi-footer/src/ui/config-lifecycle.ts +0 -61
  207. package/node_modules/pi-footer/src/ui/edit-colors.ts +0 -13
  208. package/node_modules/pi-footer/src/ui/events.ts +0 -35
  209. package/node_modules/pi-footer/src/ui/extension-status-picker.ts +0 -60
  210. package/node_modules/pi-footer/src/ui/extension-statuses.ts +0 -73
  211. package/node_modules/pi-footer/src/ui/fields.ts +0 -252
  212. package/node_modules/pi-footer/src/ui/global-menu.ts +0 -126
  213. package/node_modules/pi-footer/src/ui/helpers.ts +0 -44
  214. package/node_modules/pi-footer/src/ui/layout.ts +0 -17
  215. package/node_modules/pi-footer/src/ui/line-list.ts +0 -19
  216. package/node_modules/pi-footer/src/ui/model.ts +0 -64
  217. package/node_modules/pi-footer/src/ui/navigation.ts +0 -29
  218. package/node_modules/pi-footer/src/ui/option-edit.ts +0 -93
  219. package/node_modules/pi-footer/src/ui/overlay-render.ts +0 -103
  220. package/node_modules/pi-footer/src/ui/screen-context.ts +0 -18
  221. package/node_modules/pi-footer/src/ui/screen-controller.ts +0 -27
  222. package/node_modules/pi-footer/src/ui/screen-render.ts +0 -32
  223. package/node_modules/pi-footer/src/ui/screen-state.ts +0 -20
  224. package/node_modules/pi-footer/src/ui/screen.ts +0 -243
  225. package/node_modules/pi-footer/src/ui/screens/add-widget.ts +0 -92
  226. package/node_modules/pi-footer/src/ui/screens/confirm-exit.ts +0 -52
  227. package/node_modules/pi-footer/src/ui/screens/controller.ts +0 -12
  228. package/node_modules/pi-footer/src/ui/screens/edit-colors.ts +0 -68
  229. package/node_modules/pi-footer/src/ui/screens/edit-widget.ts +0 -115
  230. package/node_modules/pi-footer/src/ui/screens/extension-status-row.ts +0 -61
  231. package/node_modules/pi-footer/src/ui/screens/global.ts +0 -75
  232. package/node_modules/pi-footer/src/ui/screens/line-list.ts +0 -108
  233. package/node_modules/pi-footer/src/ui/screens/main.ts +0 -99
  234. package/node_modules/pi-footer/src/ui/screens/terminal.ts +0 -121
  235. package/node_modules/pi-footer/src/ui/screens/widget-list.ts +0 -154
  236. package/node_modules/pi-footer/src/ui/terminal-menu.ts +0 -32
  237. package/node_modules/pi-footer/src/ui/theme.ts +0 -48
  238. package/node_modules/pi-footer/src/ui/title-bar.ts +0 -100
  239. package/node_modules/pi-footer/src/ui/widget-actions.ts +0 -76
  240. package/node_modules/pi-footer/src/ui.ts +0 -66
  241. package/node_modules/pi-footer/src/widgets/context.ts +0 -28
  242. package/node_modules/pi-footer/src/widgets/core/active-tools.ts +0 -17
  243. package/node_modules/pi-footer/src/widgets/core/context-window.ts +0 -24
  244. package/node_modules/pi-footer/src/widgets/core/cwd-basename.ts +0 -19
  245. package/node_modules/pi-footer/src/widgets/core/cwd.ts +0 -108
  246. package/node_modules/pi-footer/src/widgets/core/event.ts +0 -34
  247. package/node_modules/pi-footer/src/widgets/core/external-status.ts +0 -102
  248. package/node_modules/pi-footer/src/widgets/core/model-provider.ts +0 -20
  249. package/node_modules/pi-footer/src/widgets/core/model.ts +0 -35
  250. package/node_modules/pi-footer/src/widgets/core/provider.ts +0 -17
  251. package/node_modules/pi-footer/src/widgets/core/session-name.ts +0 -17
  252. package/node_modules/pi-footer/src/widgets/core/text-verbosity.ts +0 -17
  253. package/node_modules/pi-footer/src/widgets/core/thinking-level.ts +0 -17
  254. package/node_modules/pi-footer/src/widgets/git/ahead-behind.ts +0 -17
  255. package/node_modules/pi-footer/src/widgets/git/branch.ts +0 -81
  256. package/node_modules/pi-footer/src/widgets/git/clean.ts +0 -19
  257. package/node_modules/pi-footer/src/widgets/git/deletions.ts +0 -17
  258. package/node_modules/pi-footer/src/widgets/git/diff.ts +0 -38
  259. package/node_modules/pi-footer/src/widgets/git/insertions.ts +0 -17
  260. package/node_modules/pi-footer/src/widgets/git/remote.ts +0 -17
  261. package/node_modules/pi-footer/src/widgets/git/root.ts +0 -17
  262. package/node_modules/pi-footer/src/widgets/git/sha.ts +0 -17
  263. package/node_modules/pi-footer/src/widgets/git/staged.ts +0 -17
  264. package/node_modules/pi-footer/src/widgets/git/status.ts +0 -19
  265. package/node_modules/pi-footer/src/widgets/git/unstaged.ts +0 -17
  266. package/node_modules/pi-footer/src/widgets/git/untracked.ts +0 -17
  267. package/node_modules/pi-footer/src/widgets/instance.ts +0 -118
  268. package/node_modules/pi-footer/src/widgets/layout/custom-text.ts +0 -18
  269. package/node_modules/pi-footer/src/widgets/layout/flex-separator.ts +0 -32
  270. package/node_modules/pi-footer/src/widgets/layout/separator.ts +0 -57
  271. package/node_modules/pi-footer/src/widgets/layout/spacer.ts +0 -31
  272. package/node_modules/pi-footer/src/widgets/options.ts +0 -122
  273. package/node_modules/pi-footer/src/widgets/project/runtime.ts +0 -361
  274. package/node_modules/pi-footer/src/widgets/registry.ts +0 -223
  275. package/node_modules/pi-footer/src/widgets/session/assistant-messages.ts +0 -17
  276. package/node_modules/pi-footer/src/widgets/session/compactions.ts +0 -17
  277. package/node_modules/pi-footer/src/widgets/session/elapsed.ts +0 -18
  278. package/node_modules/pi-footer/src/widgets/session/last-activity.ts +0 -18
  279. package/node_modules/pi-footer/src/widgets/session/messages.ts +0 -19
  280. package/node_modules/pi-footer/src/widgets/session/session-id.ts +0 -17
  281. package/node_modules/pi-footer/src/widgets/session/session-start.ts +0 -18
  282. package/node_modules/pi-footer/src/widgets/session/tool-results.ts +0 -17
  283. package/node_modules/pi-footer/src/widgets/session/total-messages.ts +0 -19
  284. package/node_modules/pi-footer/src/widgets/session/total-time.ts +0 -18
  285. package/node_modules/pi-footer/src/widgets/session/user-messages.ts +0 -17
  286. package/node_modules/pi-footer/src/widgets/store.ts +0 -26
  287. package/node_modules/pi-footer/src/widgets/tokens/cache-hit-rate.ts +0 -55
  288. package/node_modules/pi-footer/src/widgets/tokens/cache-read.ts +0 -18
  289. package/node_modules/pi-footer/src/widgets/tokens/cache-write.ts +0 -18
  290. package/node_modules/pi-footer/src/widgets/tokens/context-bar.ts +0 -108
  291. package/node_modules/pi-footer/src/widgets/tokens/context-length.ts +0 -26
  292. package/node_modules/pi-footer/src/widgets/tokens/context-remaining.ts +0 -29
  293. package/node_modules/pi-footer/src/widgets/tokens/context.ts +0 -29
  294. package/node_modules/pi-footer/src/widgets/tokens/cost.ts +0 -51
  295. package/node_modules/pi-footer/src/widgets/tokens/input-speed.ts +0 -25
  296. package/node_modules/pi-footer/src/widgets/tokens/input-tokens.ts +0 -18
  297. package/node_modules/pi-footer/src/widgets/tokens/output-speed.ts +0 -25
  298. package/node_modules/pi-footer/src/widgets/tokens/output-tokens.ts +0 -18
  299. package/node_modules/pi-footer/src/widgets/tokens/tokens.ts +0 -20
  300. package/node_modules/pi-footer/src/widgets/tokens/total-speed.ts +0 -25
  301. package/node_modules/pi-footer/src/widgets/tokens/total-tokens.ts +0 -18
  302. package/node_modules/pi-footer/src/widgets/types.ts +0 -181
  303. package/node_modules/pi-footer/src/widgets/utils/colors.ts +0 -11
  304. package/node_modules/pi-footer/src/widgets/utils/context.ts +0 -112
  305. package/node_modules/pi-footer/src/widgets/utils/session.ts +0 -19
  306. package/node_modules/pi-footer/src/widgets/utils/token-format.ts +0 -78
  307. /package/node_modules/{@herbertgao/resume-from → resume-from}/LICENSE +0 -0
  308. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/contract.js +0 -0
  309. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/entries.d.ts +0 -0
  310. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/entries.js +0 -0
  311. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/index.d.ts +0 -0
  312. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/index.js +0 -0
  313. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/layout.d.ts +0 -0
  314. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/layout.js +0 -0
  315. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/readback.d.ts +0 -0
  316. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/readback.js +0 -0
  317. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/redaction.d.ts +0 -0
  318. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/validation.d.ts +0 -0
  319. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/validation.js +0 -0
  320. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/contract.js +0 -0
  321. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/index.d.ts +0 -0
  322. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/readback.d.ts +0 -0
  323. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/readback.js +0 -0
  324. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/redaction.d.ts +0 -0
  325. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/validation.d.ts +0 -0
  326. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/validation.js +0 -0
  327. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/contract.js +0 -0
  328. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/adapter.d.ts +0 -0
  329. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/contract.js +0 -0
  330. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/format.d.ts +0 -0
  331. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/format.js +0 -0
  332. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/index.d.ts +0 -0
  333. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/index.js +0 -0
  334. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/parse.d.ts +0 -0
  335. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/parse.js +0 -0
  336. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/redaction.d.ts +0 -0
  337. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/validate.d.ts +0 -0
  338. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/validate.js +0 -0
  339. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/bin.d.ts +0 -0
  340. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/bin.js +0 -0
  341. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/contract.d.ts +0 -0
  342. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/contract.js +0 -0
  343. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/agents.d.ts +0 -0
  344. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/agents.js +0 -0
  345. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/args.d.ts +0 -0
  346. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/args.js +0 -0
  347. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/contract.d.ts +0 -0
  348. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/contract.js +0 -0
  349. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/index.d.ts +0 -0
  350. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/index.js +0 -0
  351. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/presentation.d.ts +0 -0
  352. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/presentation.js +0 -0
  353. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/runner.d.ts +0 -0
  354. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/contract.js +0 -0
  355. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/entry.d.ts +0 -0
  356. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/entry.js +0 -0
  357. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/index.d.ts +0 -0
  358. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/index.js +0 -0
  359. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/command.d.ts +0 -0
  360. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/contract.d.ts +0 -0
  361. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/contract.js +0 -0
  362. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/index.d.ts +0 -0
  363. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/index.js +0 -0
  364. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/picker.d.ts +0 -0
  365. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/picker.js +0 -0
  366. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/presentation.d.ts +0 -0
  367. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/presentation.js +0 -0
  368. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/register.d.ts +0 -0
  369. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/register.js +0 -0
  370. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/ui.d.ts +0 -0
  371. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/ui.js +0 -0
  372. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/profile.d.ts +0 -0
  373. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/profile.js +0 -0
  374. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/registry.d.ts +0 -0
  375. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/registry.js +0 -0
  376. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/contract.js +0 -0
  377. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/contract.js +0 -0
  378. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/errors.d.ts +0 -0
  379. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/errors.js +0 -0
  380. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/homes.d.ts +0 -0
  381. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/homes.js +0 -0
  382. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/index.d.ts +0 -0
  383. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/index.js +0 -0
  384. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/ordering.d.ts +0 -0
  385. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/ordering.js +0 -0
  386. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/errors.d.ts +0 -0
  387. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/errors.js +0 -0
  388. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/index.d.ts +0 -0
  389. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/index.js +0 -0
  390. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/contract.js +0 -0
  391. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/errors.d.ts +0 -0
  392. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/errors.js +0 -0
  393. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/handover.d.ts +0 -0
  394. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/handover.js +0 -0
  395. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/index.d.ts +0 -0
  396. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/index.js +0 -0
  397. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/lander.d.ts +0 -0
  398. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/marker.d.ts +0 -0
  399. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/marker.js +0 -0
  400. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/contract.d.ts +0 -0
  401. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/contract.js +0 -0
  402. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/format.d.ts +0 -0
  403. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/format.js +0 -0
  404. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/index.d.ts +0 -0
  405. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/index.js +0 -0
  406. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/contract.d.ts +0 -0
  407. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/contract.js +0 -0
  408. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/index.d.ts +0 -0
  409. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/index.js +0 -0
  410. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/rules.d.ts +0 -0
  411. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/rules.js +0 -0
  412. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/wiring.d.ts +0 -0
  413. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/index.d.ts +0 -0
  414. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/index.js +0 -0
  415. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/contract.d.ts +0 -0
  416. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/contract.js +0 -0
  417. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/defaults.d.ts +0 -0
  418. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/defaults.js +0 -0
  419. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/errors.d.ts +0 -0
  420. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/errors.js +0 -0
  421. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/index.d.ts +0 -0
  422. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/index.js +0 -0
  423. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/loader.d.ts +0 -0
  424. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/loader.js +0 -0
  425. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/paths.d.ts +0 -0
  426. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/paths.js +0 -0
  427. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/validate.d.ts +0 -0
  428. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/validate.js +0 -0
  429. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/contract.js +0 -0
  430. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/index.d.ts +0 -0
  431. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/index.js +0 -0
  432. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/contract.d.ts +0 -0
  433. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/contract.js +0 -0
  434. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/file-committer.d.ts +0 -0
  435. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/file-committer.js +0 -0
  436. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/index.d.ts +0 -0
  437. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/index.js +0 -0
  438. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/contract.d.ts +0 -0
  439. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/contract.js +0 -0
  440. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/estimator.d.ts +0 -0
  441. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/estimator.js +0 -0
  442. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/index.d.ts +0 -0
  443. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/index.js +0 -0
  444. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/session/contract.js +0 -0
@@ -4,12 +4,27 @@
4
4
  * 渲染副作用(applyStyleMode / refreshCurrentTranscript)由 renderer 经
5
5
  * CcstylePanelHooks 注入,避免 config → renderer 循环依赖。
6
6
  */
7
- import { getSettingsListTheme } from "@earendil-works/pi-coding-agent";
7
+ import { getSettingsListTheme, type ThemeBg } from "@earendil-works/pi-coding-agent";
8
8
  import { Input, SettingsList, matchesKey, truncateToWidth } from "@earendil-works/pi-tui";
9
9
  import type { CompactThinkingController } from "../feature/compact-thinking.ts";
10
- import { applyStartupHeader } from "../feature/shell/startup-header.ts";
10
+ import {
11
+ applyCustomFooter,
12
+ clearCustomFooter,
13
+ getFooterStatusSnapshot,
14
+ } from "../feature/shell/footer.ts";
15
+ import {
16
+ footerChipDescription,
17
+ footerLineOfKey,
18
+ formatFooterChipSummary,
19
+ orderedFooterKeys,
20
+ reorderFooterKey,
21
+ resolveFooterChipLayout,
22
+ shiftFooterKeyLine,
23
+ toggleFooterKeyHidden,
24
+ type FooterChipLayout,
25
+ } from "../feature/shell/footer-layout.ts";
26
+ import { applyStartupHeader, clearStartupHeader } from "../feature/shell/startup-header.ts";
11
27
  import type { ToolGroupingHooks } from "../renderer/tool/grouping.ts";
12
- import type { DiffIndicatorMode, DiffViewMode } from "../renderer/tool/diff/index.ts";
13
28
  import {
14
29
  config,
15
30
  DEFAULT_CONFIG,
@@ -18,19 +33,25 @@ import {
18
33
  DIFF_SPLIT_MIN_WIDTH_VALUES,
19
34
  DIFF_VIEW_MODES,
20
35
  EXCLUDE_RENDERER_CANDIDATES,
36
+ EXPANDED_CARD_BACKGROUND_SLOTS,
21
37
  EXPANDED_INPUT_MAX_LINES_VALUES,
22
38
  EXPANDED_OUTPUT_MAX_LINES_VALUES,
23
39
  EXPANDED_PREVIEW_MAX_LINES_VALUES,
24
40
  formatExcludeRenderers,
25
41
  getCompactThinkingConfig,
42
+ pickInputClip,
26
43
  pickPositiveInt,
27
44
  pickPositiveNumber,
28
- saveConfig,
29
45
  SCROLL_STEP_LINES_VALUES,
30
46
  THINKING_ANIMATION_INTERVAL_VALUES,
31
47
  THINKING_PREVIEW_LINES_VALUES,
48
+ INPUT_CLIP_VALUES,
32
49
  WRITE_DIFF_COLLAPSED_LINES_VALUES,
50
+ updateConfig,
33
51
  type CompactStyleMode,
52
+ type Config,
53
+ type DiffIndicatorMode,
54
+ type DiffViewMode,
34
55
  } from "./config.ts";
35
56
 
36
57
  /** renderer 注入的渲染副作用,面板自身不触碰渲染状态。 */
@@ -41,7 +62,7 @@ export type CcstylePanelHooks = {
41
62
 
42
63
  function modeSettingDescription(mode: CompactStyleMode): string {
43
64
  if (mode === "compact") {
44
- return "(Experimental) One summary line per assistant round; edit/write stay single-line until expanded.";
65
+ return "(Experimental) One summary line per assistant round; edit/write reuse the same Diff preview settings as on.";
45
66
  }
46
67
  if (mode === "off") {
47
68
  return "Pi native tool rendering. Diff options below still apply independently.";
@@ -55,6 +76,120 @@ function excludeRenderersDescription(names: readonly string[]): string {
55
76
  : `Native renderer for: ${names.join(", ")}. Agent is always native. Enter to toggle.`;
56
77
  }
57
78
 
79
+ function customFooterDescription(enabled: boolean): string {
80
+ if (!enabled) return "Pi native footer restored. Chip layout below still applies when turned on.";
81
+ return "Custom status bar with model, context, cache, cost, git, and plugin chips.";
82
+ }
83
+
84
+ function pluginChipsDescription(): string {
85
+ return `Arrange plugin chips: ${formatFooterChipSummary(config)}. Enter to edit.`;
86
+ }
87
+
88
+ function footerLayoutFromConfig(): FooterChipLayout {
89
+ return {
90
+ footerHiddenKeys: config.footerHiddenKeys,
91
+ footerLine1Keys: config.footerLine1Keys,
92
+ footerLine2Keys: config.footerLine2Keys,
93
+ footerLine3Keys: config.footerLine3Keys,
94
+ };
95
+ }
96
+
97
+ function persistFooterLayout(layout: FooterChipLayout): void {
98
+ updateConfig({
99
+ footerHiddenKeys: layout.footerHiddenKeys,
100
+ footerLine1Keys: layout.footerLine1Keys,
101
+ footerLine2Keys: layout.footerLine2Keys,
102
+ footerLine3Keys: layout.footerLine3Keys,
103
+ });
104
+ }
105
+
106
+ function footerChipItem(
107
+ key: string,
108
+ layout: FooterChipLayout,
109
+ snapshot: ReadonlyMap<string, string>,
110
+ ) {
111
+ const line = footerLineOfKey(layout, key) ?? 2;
112
+ const hidden = layout.footerHiddenKeys.includes(key);
113
+ const live = snapshot.get(key)?.trim() ?? "";
114
+ return {
115
+ id: key,
116
+ label: key,
117
+ description: footerChipDescription(key, live),
118
+ currentValue: hidden ? `line${line} · hidden` : `line${line}`,
119
+ };
120
+ }
121
+
122
+ function buildFooterChipsSubmenu(
123
+ onClose: () => void,
124
+ onLiveChange: () => void,
125
+ ): {
126
+ render: (width: number) => string[];
127
+ invalidate: () => void;
128
+ handleInput: (data: string) => void;
129
+ } {
130
+ const snapshot = () => getFooterStatusSnapshot();
131
+ const resolved = () => resolveFooterChipLayout(footerLayoutFromConfig(), [...snapshot().keys()]);
132
+ const items: ReturnType<typeof footerChipItem>[] = [];
133
+ const rebuildItems = (layout: FooterChipLayout, selectedKey?: string) => {
134
+ const next = orderedFooterKeys(layout).map((key) => footerChipItem(key, layout, snapshot()));
135
+ items.length = 0;
136
+ items.push(...next);
137
+ if (!selectedKey) return 0;
138
+ const index = items.findIndex((item) => item.id === selectedKey);
139
+ return index >= 0 ? index : 0;
140
+ };
141
+ rebuildItems(resolved());
142
+ const list = new SettingsList(
143
+ items,
144
+ Math.min(8, Math.max(4, items.length)),
145
+ getSettingsListTheme(),
146
+ () => {},
147
+ () => onClose(),
148
+ { enableSearch: false },
149
+ );
150
+ const listState = list as unknown as { selectedIndex: number; items: typeof items };
151
+
152
+ const mutate = (transform: (layout: FooterChipLayout, key: string) => FooterChipLayout) => {
153
+ const key = listState.items[listState.selectedIndex]?.id;
154
+ if (!key) return;
155
+ const next = transform(resolved(), key);
156
+ persistFooterLayout(next);
157
+ listState.selectedIndex = rebuildItems(
158
+ resolveFooterChipLayout(next, [...snapshot().keys()]),
159
+ key,
160
+ );
161
+ onLiveChange();
162
+ };
163
+
164
+ return {
165
+ render: (width: number) => list.render(width),
166
+ invalidate: () => list.invalidate(),
167
+ handleInput: (data: string) => {
168
+ if (matchesKey(data, "left")) {
169
+ mutate((layout, key) => shiftFooterKeyLine(layout, key, -1));
170
+ return;
171
+ }
172
+ if (matchesKey(data, "right")) {
173
+ mutate((layout, key) => shiftFooterKeyLine(layout, key, 1));
174
+ return;
175
+ }
176
+ if (data === "[") {
177
+ mutate((layout, key) => reorderFooterKey(layout, key, -1));
178
+ return;
179
+ }
180
+ if (data === "]") {
181
+ mutate((layout, key) => reorderFooterKey(layout, key, 1));
182
+ return;
183
+ }
184
+ if (data === " " || matchesKey(data, "space")) {
185
+ mutate((layout, key) => toggleFooterKeyHidden(layout, key));
186
+ return;
187
+ }
188
+ list.handleInput(data);
189
+ },
190
+ };
191
+ }
192
+
58
193
  function diffViewModeDescription(mode: DiffViewMode): string {
59
194
  if (mode === "split") return "Force side-by-side diff when width allows; otherwise unified.";
60
195
  if (mode === "unified") return "Always render a single unified diff column.";
@@ -67,6 +202,15 @@ function diffIndicatorDescription(mode: DiffIndicatorMode): string {
67
202
  return "Vertical bar indicators on changed lines (default).";
68
203
  }
69
204
 
205
+ function expandedCardBackgroundDescription(slot: ThemeBg): string {
206
+ if (slot === "userMessageBg") {
207
+ return "Expanded cards share the user message background. Pick another slot to tell them apart.";
208
+ }
209
+ if (slot === "toolPendingBg") return "Expanded cards use the theme's neutral tool background.";
210
+ return `Expanded cards use the theme's ${slot} background.`;
211
+ }
212
+
213
+ /** 额外功能开关项:on/off 二值,描述随状态切换;切换后需重启生效。 */
70
214
  function featureToggleSetting(
71
215
  id: string,
72
216
  label: string,
@@ -119,8 +263,7 @@ function buildExcludeRenderersSubmenu(
119
263
  const excluded = new Set(config.excludeRenderers);
120
264
  if (value === "exclude") excluded.add(id);
121
265
  else excluded.delete(id);
122
- config.excludeRenderers = [...excluded].sort((a, b) => a.localeCompare(b));
123
- saveConfig();
266
+ updateConfig({ excludeRenderers: [...excluded].sort((a, b) => a.localeCompare(b)) });
124
267
  onLiveChange();
125
268
  },
126
269
  () => onClose(),
@@ -182,7 +325,7 @@ function buildNumberInputSubmenu(
182
325
 
183
326
  /** Section tabs for /ccstyle — matches Zentui-style "A / B / C" headers. */
184
327
  type CcstyleSection = {
185
- id: "style" | "diff" | "thinking" | "ui" | "feature";
328
+ id: "style" | "diff" | "thinking" | "ui" | "feature" | "footer";
186
329
  label: string;
187
330
  items: any[];
188
331
  };
@@ -238,19 +381,22 @@ export async function showCcstylePanel(
238
381
  currentValue: config.mode === "compact" ? "compact (Experimental)" : config.mode,
239
382
  values: ["on", "compact (Experimental)", "off"],
240
383
  };
241
- // Tracks whether the Exclude-tools submenu is open so Tab switches sections
384
+ // Tracks whether a nested submenu is open so Tab switches sections
242
385
  // only at the top level (mirrors Zentui settings: Tab = switch sections).
243
- let excludeSubmenuOpen = false;
386
+ let nestedSubmenuOpen = false;
387
+ let nestedHint = "";
244
388
  const excludeSetting = {
245
389
  id: "excludeRenderers",
246
390
  label: "Exclude tools",
247
391
  description: excludeRenderersDescription(config.excludeRenderers),
248
392
  currentValue: formatExcludeRenderers(config.excludeRenderers),
249
393
  submenu: (_current: string, closeSubmenu: (selected?: string) => void) => {
250
- excludeSubmenuOpen = true;
394
+ nestedSubmenuOpen = true;
395
+ nestedHint = " Enter/Space to toggle · Esc back to Style";
251
396
  return buildExcludeRenderersSubmenu(
252
397
  () => {
253
- excludeSubmenuOpen = false;
398
+ nestedSubmenuOpen = false;
399
+ nestedHint = "";
254
400
  excludeSetting.currentValue = formatExcludeRenderers(config.excludeRenderers);
255
401
  excludeSetting.description = excludeRenderersDescription(config.excludeRenderers);
256
402
  closeSubmenu();
@@ -263,6 +409,16 @@ export async function showCcstylePanel(
263
409
  );
264
410
  },
265
411
  };
412
+ const inputClipSetting = {
413
+ id: "inputClip",
414
+ label: "Input clip",
415
+ description:
416
+ "Max characters for path/command/name in single and grouped tool summaries; 0 fits available width. Enter to type a custom value.",
417
+ currentValue: String(config.inputClip),
418
+ values: [...INPUT_CLIP_VALUES],
419
+ submenu: (_current: string, closeSubmenu: (selected?: string) => void) =>
420
+ buildNumberInputSubmenu(theme, inputClipSetting, closeSubmenu),
421
+ };
266
422
  const diffViewSetting = {
267
423
  id: "diffViewMode",
268
424
  label: "Diff layout",
@@ -301,7 +457,7 @@ export async function showCcstylePanel(
301
457
  id: "writeDiffCollapsedLines",
302
458
  label: "Write collapsed lines",
303
459
  description:
304
- "Write-only collapsed body lines. 0 shows ↳ created + expand hint. Enter to type a custom value.",
460
+ "Write-only collapsed body lines. 0 shows ↳ created + expand hint (stats stay on the title). Enter to type a custom value.",
305
461
  currentValue: String(config.writeDiffCollapsedLines),
306
462
  values: [...WRITE_DIFF_COLLAPSED_LINES_VALUES],
307
463
  submenu: (_current: string, closeSubmenu: (selected?: string) => void) =>
@@ -316,20 +472,11 @@ export async function showCcstylePanel(
316
472
  currentValue: config.diffWordWrap ? "on" : "off",
317
473
  values: ["on", "off"],
318
474
  };
319
- const expandedMaxSetting = {
320
- id: "expandedPreviewMaxLines",
321
- label: "Expanded max lines",
322
- description:
323
- "Max Output/diff body lines when expanded. Default 40 keeps the TUI compact; raise for large dumps.",
324
- currentValue: String(config.expandedPreviewMaxLines),
325
- values: [...EXPANDED_PREVIEW_MAX_LINES_VALUES],
326
- submenu: (_current: string, closeSubmenu: (selected?: string) => void) =>
327
- buildNumberInputSubmenu(theme, expandedMaxSetting, closeSubmenu),
328
- };
329
475
  const expandedInputSetting = {
330
476
  id: "expandedInputMaxLines",
331
- label: "Expanded Input max lines",
332
- description: "Max Input body lines before the show-more footer appears.",
477
+ label: "Expanded input lines",
478
+ description:
479
+ "Max Input section lines in an expanded tool card. Overflow shows click to show more. Default 5.",
333
480
  currentValue: String(config.expandedInputMaxLines),
334
481
  values: [...EXPANDED_INPUT_MAX_LINES_VALUES],
335
482
  submenu: (_current: string, closeSubmenu: (selected?: string) => void) =>
@@ -337,13 +484,30 @@ export async function showCcstylePanel(
337
484
  };
338
485
  const expandedOutputSetting = {
339
486
  id: "expandedOutputMaxLines",
340
- label: "Expanded Output max lines",
341
- description: "Max Output body lines before the show-more footer appears.",
487
+ label: "Expanded output lines",
488
+ description:
489
+ "Max Output section lines in an expanded tool card. Overflow shows click to show more. Default 10.",
342
490
  currentValue: String(config.expandedOutputMaxLines),
343
491
  values: [...EXPANDED_OUTPUT_MAX_LINES_VALUES],
344
492
  submenu: (_current: string, closeSubmenu: (selected?: string) => void) =>
345
493
  buildNumberInputSubmenu(theme, expandedOutputSetting, closeSubmenu),
346
494
  };
495
+ const expandedMaxSetting = {
496
+ id: "expandedPreviewMaxLines",
497
+ label: "Expanded max lines",
498
+ description: "Max TaskList body lines when expanded. Expanded diffs show every line.",
499
+ currentValue: String(config.expandedPreviewMaxLines),
500
+ values: [...EXPANDED_PREVIEW_MAX_LINES_VALUES],
501
+ submenu: (_current: string, closeSubmenu: (selected?: string) => void) =>
502
+ buildNumberInputSubmenu(theme, expandedMaxSetting, closeSubmenu),
503
+ };
504
+ const expandedCardBgSetting = {
505
+ id: "expandedCardBackground",
506
+ label: "Expanded card bg",
507
+ description: expandedCardBackgroundDescription(config.expandedCardBackground),
508
+ currentValue: config.expandedCardBackground,
509
+ values: [...EXPANDED_CARD_BACKGROUND_SLOTS],
510
+ };
347
511
  const thinkingTitleSetting = {
348
512
  id: "useSummaryTitlesAsThinkingTitle",
349
513
  label: "Summary title",
@@ -396,48 +560,89 @@ export async function showCcstylePanel(
396
560
  submenu: (_current: string, closeSubmenu: (selected?: string) => void) =>
397
561
  buildNumberInputSubmenu(theme, scrollStepSetting, closeSubmenu),
398
562
  };
563
+
564
+ // 额外功能开关:注册于扩展加载期,切换后需重启(/reload)生效。
399
565
  const sessionReferenceToggle = featureToggleSetting(
400
566
  "enableSessionReference",
401
567
  "Session reference",
402
- "@ session mentions search and inject referenced context after restart.",
568
+ "@ session mentions search & inject referenced session context. Next restart applies.",
403
569
  "Session reference disabled.",
404
570
  config.enableSessionReference,
405
571
  );
406
572
  const subagentAutocompleteToggle = featureToggleSetting(
407
573
  "enableSubagentAutocomplete",
408
574
  "Subagent autocomplete",
409
- "@ subagent mentions suggest agents and delegation instructions after restart.",
575
+ "@subagent:[name] mentions suggest agents and inject delegation instructions. Next restart applies.",
410
576
  "Subagent autocomplete disabled.",
411
577
  config.enableSubagentAutocomplete,
412
578
  );
413
579
  const contextCommandToggle = featureToggleSetting(
414
580
  "enableContextCommand",
415
581
  "Context usage",
416
- "/context shows context-window distribution after restart.",
582
+ "/context shows context-window distribution with previews. Next restart applies.",
417
583
  "Context command disabled.",
418
584
  config.enableContextCommand,
419
585
  );
420
586
  const agentSummaryToggle = featureToggleSetting(
421
587
  "enableAgentSummary",
422
588
  "Agent summary",
423
- "Append per-round tool stats after each agent turn after restart.",
589
+ "Append per-round tool stats after each agent turn. Next restart applies.",
424
590
  "Agent summary disabled.",
425
591
  config.enableAgentSummary,
426
592
  );
427
593
  const workingMessageToggle = featureToggleSetting(
428
594
  "enableWorkingMessage",
429
595
  "Working message",
430
- "Extend Working... with token count and elapsed time after restart.",
596
+ "Extend Working... footer with token count and elapsed time. Next restart applies.",
431
597
  "Native Working... footer only.",
432
598
  config.enableWorkingMessage,
433
599
  );
434
600
  const aliasesToggle = featureToggleSetting(
435
601
  "enableAliases",
436
602
  "Aliases",
437
- "/clear and /exit aliases enabled after restart.",
603
+ "/clear and /exit aliases enabled. Next restart applies.",
438
604
  "Aliases disabled.",
439
605
  config.enableAliases,
440
606
  );
607
+ const footerNerdIconsSetting = {
608
+ id: "footerNerdIcons",
609
+ label: "Nerd Font icons",
610
+ description: config.footerNerdIcons
611
+ ? "Git and cache chips use Nerd Font glyphs. Turn off for plain text."
612
+ : "Git and cache chips use plain text. No Nerd Font required.",
613
+ currentValue: config.footerNerdIcons ? "on" : "off",
614
+ values: ["on", "off"],
615
+ };
616
+ const customFooterSetting = {
617
+ id: "enableCustomFooter",
618
+ label: "Status bar",
619
+ description: customFooterDescription(config.enableCustomFooter),
620
+ currentValue: config.enableCustomFooter ? "on" : "off",
621
+ values: ["on", "off"],
622
+ };
623
+ const pluginChipsSetting = {
624
+ id: "footerPluginChips",
625
+ label: "Plugin chips",
626
+ description: pluginChipsDescription(),
627
+ currentValue: formatFooterChipSummary(config),
628
+ submenu: (_current: string, closeSubmenu: (selected?: string) => void) => {
629
+ nestedSubmenuOpen = true;
630
+ nestedHint = " ←→ line · [ ] reorder · Space hide · Esc back to Footer";
631
+ return buildFooterChipsSubmenu(
632
+ () => {
633
+ nestedSubmenuOpen = false;
634
+ nestedHint = "";
635
+ pluginChipsSetting.currentValue = formatFooterChipSummary(config);
636
+ pluginChipsSetting.description = pluginChipsDescription();
637
+ closeSubmenu();
638
+ },
639
+ () => {
640
+ pluginChipsSetting.currentValue = formatFooterChipSummary(config);
641
+ pluginChipsSetting.description = pluginChipsDescription();
642
+ },
643
+ );
644
+ },
645
+ };
441
646
  const featureToggles: Record<string, { apply: (on: boolean) => void }> = {
442
647
  enableSessionReference: sessionReferenceToggle,
443
648
  enableSubagentAutocomplete: subagentAutocompleteToggle,
@@ -448,16 +653,41 @@ export async function showCcstylePanel(
448
653
  };
449
654
 
450
655
  const onSettingChange = (id: string, value: string) => {
656
+ if (id === "enableCustomFooter") {
657
+ const enabled = value === "on";
658
+ updateConfig({ enableCustomFooter: enabled });
659
+ customFooterSetting.currentValue = enabled ? "on" : "off";
660
+ customFooterSetting.description = customFooterDescription(enabled);
661
+ if (enabled) applyCustomFooter(ctx);
662
+ else clearCustomFooter(ctx);
663
+ ctx.ui.notify(`Updated ${id}: ${value}`, "info");
664
+ return;
665
+ }
666
+ if (id === "footerNerdIcons") {
667
+ const enabled = value === "on";
668
+ updateConfig({ footerNerdIcons: enabled });
669
+ footerNerdIconsSetting.currentValue = enabled ? "on" : "off";
670
+ footerNerdIconsSetting.description = enabled
671
+ ? "Git and cache chips use Nerd Font glyphs. Turn off for plain text."
672
+ : "Git and cache chips use plain text. No Nerd Font required.";
673
+ ctx.ui.notify(`Updated ${id}: ${value}`, "info");
674
+ return;
675
+ }
676
+ // 额外功能开关:字段名与配置布尔字段一一对应,切换后重启生效。
451
677
  const featureToggle = featureToggles[id];
452
678
  if (featureToggle) {
453
- // SAFETY: featureToggles contains only boolean keys from Config.
454
- (config as unknown as Record<string, boolean>)[id] = value === "on";
679
+ updateConfig({ [id]: value === "on" } as Partial<Config>);
455
680
  featureToggle.apply(value === "on");
456
- saveConfig();
457
681
  ctx.ui.notify(`Updated ${id}: ${value} (next restart)`, "info");
458
682
  return;
459
683
  }
460
684
  switch (id) {
685
+ case "inputClip":
686
+ updateConfig({
687
+ inputClip: pickInputClip(value),
688
+ });
689
+ inputClipSetting.currentValue = String(config.inputClip);
690
+ break;
461
691
  case "mode": {
462
692
  // 选项值带 Experimental 标记,选择后还原为真实 mode 值。
463
693
  const mode: CompactStyleMode =
@@ -471,109 +701,124 @@ export async function showCcstylePanel(
471
701
  excludeSetting.description = excludeRenderersDescription(config.excludeRenderers);
472
702
  return;
473
703
  case "diffViewMode":
474
- config.diffViewMode = value as DiffViewMode;
704
+ updateConfig({ diffViewMode: value as DiffViewMode });
475
705
  diffViewSetting.description = diffViewModeDescription(config.diffViewMode);
476
706
  break;
477
707
  case "diffIndicatorMode":
478
- config.diffIndicatorMode = value as DiffIndicatorMode;
708
+ updateConfig({ diffIndicatorMode: value as DiffIndicatorMode });
479
709
  diffIndicatorSetting.description = diffIndicatorDescription(config.diffIndicatorMode);
480
710
  break;
481
711
  case "diffSplitMinWidth":
482
- config.diffSplitMinWidth = pickPositiveInt(
483
- value,
484
- DEFAULT_CONFIG.diffSplitMinWidth,
485
- 40,
486
- 300,
487
- );
712
+ updateConfig({
713
+ diffSplitMinWidth: pickPositiveInt(value, DEFAULT_CONFIG.diffSplitMinWidth, 40, 300),
714
+ });
488
715
  diffSplitSetting.currentValue = String(config.diffSplitMinWidth);
489
716
  break;
490
717
  case "editDiffCollapsedLines":
491
- config.editDiffCollapsedLines = pickPositiveInt(
492
- value,
493
- DEFAULT_CONFIG.editDiffCollapsedLines,
494
- 1,
495
- 500,
496
- );
718
+ updateConfig({
719
+ editDiffCollapsedLines: pickPositiveInt(
720
+ value,
721
+ DEFAULT_CONFIG.editDiffCollapsedLines,
722
+ 1,
723
+ 500,
724
+ ),
725
+ });
497
726
  diffCollapsedSetting.currentValue = String(config.editDiffCollapsedLines);
498
727
  break;
499
728
  case "writeDiffCollapsedLines":
500
- config.writeDiffCollapsedLines = pickPositiveInt(
501
- value,
502
- DEFAULT_CONFIG.writeDiffCollapsedLines,
503
- 0,
504
- 500,
505
- );
729
+ updateConfig({
730
+ writeDiffCollapsedLines: pickPositiveInt(
731
+ value,
732
+ DEFAULT_CONFIG.writeDiffCollapsedLines,
733
+ 0,
734
+ 500,
735
+ ),
736
+ });
506
737
  writeDiffCollapsedSetting.currentValue = String(config.writeDiffCollapsedLines);
507
738
  break;
508
739
  case "diffWordWrap":
509
- config.diffWordWrap = value === "on";
740
+ updateConfig({ diffWordWrap: value === "on" });
510
741
  diffWordWrapSetting.description = config.diffWordWrap
511
742
  ? "Long diff lines wrap within the panel width."
512
743
  : "Long diff lines are truncated to the panel width.";
513
744
  break;
514
- case "expandedPreviewMaxLines":
515
- config.expandedPreviewMaxLines = pickPositiveInt(
516
- value,
517
- DEFAULT_CONFIG.expandedPreviewMaxLines,
518
- 10,
519
- 50_000,
520
- );
521
- expandedMaxSetting.currentValue = String(config.expandedPreviewMaxLines);
522
- break;
523
745
  case "expandedInputMaxLines":
524
- config.expandedInputMaxLines = pickPositiveInt(
525
- value,
526
- DEFAULT_CONFIG.expandedInputMaxLines,
527
- 1,
528
- 5_000,
529
- );
746
+ updateConfig({
747
+ expandedInputMaxLines: pickPositiveInt(
748
+ value,
749
+ DEFAULT_CONFIG.expandedInputMaxLines,
750
+ 1,
751
+ 5_000,
752
+ ),
753
+ });
530
754
  expandedInputSetting.currentValue = String(config.expandedInputMaxLines);
531
755
  break;
532
756
  case "expandedOutputMaxLines":
533
- config.expandedOutputMaxLines = pickPositiveInt(
534
- value,
535
- DEFAULT_CONFIG.expandedOutputMaxLines,
536
- 1,
537
- 5_000,
538
- );
757
+ updateConfig({
758
+ expandedOutputMaxLines: pickPositiveInt(
759
+ value,
760
+ DEFAULT_CONFIG.expandedOutputMaxLines,
761
+ 1,
762
+ 5_000,
763
+ ),
764
+ });
539
765
  expandedOutputSetting.currentValue = String(config.expandedOutputMaxLines);
540
766
  break;
767
+ case "expandedPreviewMaxLines":
768
+ updateConfig({
769
+ expandedPreviewMaxLines: pickPositiveInt(
770
+ value,
771
+ DEFAULT_CONFIG.expandedPreviewMaxLines,
772
+ 10,
773
+ 50_000,
774
+ ),
775
+ });
776
+ expandedMaxSetting.currentValue = String(config.expandedPreviewMaxLines);
777
+ break;
778
+ case "expandedCardBackground":
779
+ updateConfig({ expandedCardBackground: value as ThemeBg });
780
+ expandedCardBgSetting.description = expandedCardBackgroundDescription(
781
+ config.expandedCardBackground,
782
+ );
783
+ break;
541
784
  case "useSummaryTitlesAsThinkingTitle":
542
- config.useSummaryTitlesAsThinkingTitle = value === "on";
785
+ updateConfig({ useSummaryTitlesAsThinkingTitle: value === "on" });
543
786
  break;
544
787
  case "previewLines":
545
- config.previewLines = pickPositiveInt(value, DEFAULT_CONFIG.previewLines, 0);
788
+ updateConfig({ previewLines: pickPositiveInt(value, DEFAULT_CONFIG.previewLines, 0) });
546
789
  thinkingPreviewSetting.currentValue = String(config.previewLines);
547
790
  break;
548
791
  case "animationIntervalMs":
549
- config.animationIntervalMs = pickPositiveNumber(
550
- value,
551
- DEFAULT_CONFIG.animationIntervalMs,
552
- );
792
+ updateConfig({
793
+ animationIntervalMs: pickPositiveNumber(value, DEFAULT_CONFIG.animationIntervalMs),
794
+ });
553
795
  thinkingAnimationSetting.currentValue = String(config.animationIntervalMs);
554
796
  break;
555
797
  case "dimThinkingText":
556
- config.dimThinkingText = value === "on";
798
+ updateConfig({ dimThinkingText: value === "on" });
557
799
  thinkingDimSetting.description = config.dimThinkingText
558
800
  ? "Thinking text uses the theme's dim color."
559
801
  : "Keep the default thinking text color.";
560
802
  break;
561
- case "showStartupHeader":
562
- config.showStartupHeader = value === "on";
803
+ case "showStartupHeader": {
804
+ const enabled = value === "on";
805
+ updateConfig({ showStartupHeader: enabled });
563
806
  startupHeaderSetting.description = config.showStartupHeader
564
807
  ? "Show the custom startup header (logo + tips) on new sessions."
565
808
  : "Use Pi's native startup header instead.";
566
- // 实时切换:on → 自定义 header;off → 官方默认 header。
567
- applyStartupHeader(ctx);
809
+ if (enabled) applyStartupHeader(ctx);
810
+ else clearStartupHeader(ctx);
568
811
  break;
812
+ }
569
813
  case "scrollStepLines":
570
- config.scrollStepLines = pickPositiveInt(value, DEFAULT_CONFIG.scrollStepLines, 1, 50);
814
+ updateConfig({
815
+ scrollStepLines: pickPositiveInt(value, DEFAULT_CONFIG.scrollStepLines, 1, 50),
816
+ });
571
817
  scrollStepSetting.currentValue = String(config.scrollStepLines);
572
818
  break;
573
819
  default:
574
820
  return;
575
821
  }
576
- saveConfig();
577
822
  compactThinking?.updateConfig(getCompactThinkingConfig());
578
823
  hooks.refreshCurrentTranscript(ctx);
579
824
  ctx.ui.notify(`Updated ${id}: ${value}`, "info");
@@ -585,6 +830,31 @@ export async function showCcstylePanel(
585
830
  label: "Style",
586
831
  items: [modeSetting, excludeSetting],
587
832
  },
833
+ {
834
+ id: "feature",
835
+ label: "Features",
836
+ items: [
837
+ sessionReferenceToggle.setting,
838
+ subagentAutocompleteToggle.setting,
839
+ contextCommandToggle.setting,
840
+ agentSummaryToggle.setting,
841
+ workingMessageToggle.setting,
842
+ aliasesToggle.setting,
843
+ ],
844
+ },
845
+ {
846
+ id: "ui",
847
+ label: "UI",
848
+ items: [
849
+ expandedInputSetting,
850
+ expandedOutputSetting,
851
+ expandedMaxSetting,
852
+ expandedCardBgSetting,
853
+ inputClipSetting,
854
+ startupHeaderSetting,
855
+ scrollStepSetting,
856
+ ],
857
+ },
588
858
  {
589
859
  id: "diff",
590
860
  label: "Diff",
@@ -592,6 +862,7 @@ export async function showCcstylePanel(
592
862
  diffViewSetting,
593
863
  diffIndicatorSetting,
594
864
  diffSplitSetting,
865
+ diffCollapsedSetting,
595
866
  writeDiffCollapsedSetting,
596
867
  diffWordWrapSetting,
597
868
  ],
@@ -607,28 +878,9 @@ export async function showCcstylePanel(
607
878
  ],
608
879
  },
609
880
  {
610
- id: "ui",
611
- label: "UI",
612
- items: [
613
- expandedMaxSetting,
614
- expandedInputSetting,
615
- expandedOutputSetting,
616
- diffCollapsedSetting,
617
- startupHeaderSetting,
618
- scrollStepSetting,
619
- ],
620
- },
621
- {
622
- id: "feature",
623
- label: "Feature",
624
- items: [
625
- sessionReferenceToggle.setting,
626
- subagentAutocompleteToggle.setting,
627
- contextCommandToggle.setting,
628
- agentSummaryToggle.setting,
629
- workingMessageToggle.setting,
630
- aliasesToggle.setting,
631
- ],
881
+ id: "footer",
882
+ label: "Footer",
883
+ items: [customFooterSetting, footerNerdIconsSetting, pluginChipsSetting],
632
884
  },
633
885
  ];
634
886
 
@@ -649,13 +901,12 @@ export async function showCcstylePanel(
649
901
  const activeList = () => lists[activeSection]!;
650
902
 
651
903
  const switchSection = (delta: number) => {
652
- if (excludeSubmenuOpen) return;
904
+ if (nestedSubmenuOpen) return;
653
905
  activeSection = (activeSection + delta + sections.length) % sections.length;
654
906
  };
655
907
 
656
908
  /** 数值项:当前选中项有 submenu + values 时,Space 仅循环预设,不打开子面板。 */
657
909
  const cyclePresetInList = (list: InstanceType<typeof SettingsList>): boolean => {
658
- // SAFETY: SettingsList owns these stable fields used by its built-in input handler.
659
910
  const internal = list as unknown as {
660
911
  submenuComponent: unknown;
661
912
  items: {
@@ -700,7 +951,8 @@ export async function showCcstylePanel(
700
951
  truncateToWidth(
701
952
  theme.fg(
702
953
  "dim",
703
- " Enter/Space to change · Enter on numbers types a custom value · Tab/Shift+Tab to switch sections · Esc to close",
954
+ nestedHint ||
955
+ " Enter/Space to change · Enter on numbers types a custom value · Tab/Shift+Tab to switch sections · Esc to close",
704
956
  ),
705
957
  safeWidth,
706
958
  ),
@@ -711,12 +963,12 @@ export async function showCcstylePanel(
711
963
  for (const list of lists) list.invalidate();
712
964
  },
713
965
  handleInput(data: string) {
714
- if (!excludeSubmenuOpen && isForwardTabKey(data)) {
966
+ if (!nestedSubmenuOpen && isForwardTabKey(data)) {
715
967
  switchSection(1);
716
968
  tui.requestRender();
717
969
  return;
718
970
  }
719
- if (!excludeSubmenuOpen && isBackTabKey(data)) {
971
+ if (!nestedSubmenuOpen && isBackTabKey(data)) {
720
972
  switchSection(-1);
721
973
  tui.requestRender();
722
974
  return;