@herbertgao/pi-extensions 2026.9.18 → 2026.9.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/README.md +20 -28
  2. package/THIRD_PARTY_NOTICES.md +1 -1
  3. package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +76 -59
  4. package/node_modules/@herbertgao/pi-cc-extensions/README.md +76 -59
  5. package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/preview.webp +0 -0
  6. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +93 -34
  7. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +346 -117
  8. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/agent-summary/core.ts +6 -36
  9. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/agent-summary/index.ts +2 -2
  10. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +24 -29
  11. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/context.ts +330 -360
  12. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/reference/index.ts +56 -108
  13. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/reference/session.ts +97 -15
  14. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/reference/subagent.ts +80 -45
  15. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/flush-docked-bash.ts +36 -0
  16. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/footer-layout.ts +229 -0
  17. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/footer.ts +479 -0
  18. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/startup-header.ts +92 -61
  19. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/working-message.ts +75 -40
  20. package/node_modules/@herbertgao/pi-cc-extensions/extensions/index.ts +19 -3
  21. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +1080 -229
  22. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +232 -259
  23. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/index.ts +42 -41
  24. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/markdown-enhance.ts +8 -2
  25. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/hover.ts +2 -7
  26. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/interaction.ts +277 -113
  27. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/layout.ts +15 -6
  28. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/packets.ts +18 -72
  29. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/scroll.ts +61 -26
  30. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/ansi-utils.ts +25 -57
  31. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-component.ts +125 -0
  32. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-edit-render.ts +227 -0
  33. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-header.ts +136 -0
  34. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-highlight.ts +115 -0
  35. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-inline.ts +324 -0
  36. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-layout.ts +762 -0
  37. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-limits.ts +152 -0
  38. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-palette.ts +410 -0
  39. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-parse.ts +535 -0
  40. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-presentation.ts +2 -2
  41. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-renderer.ts +21 -3219
  42. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-text.ts +44 -0
  43. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-write-render.ts +568 -0
  44. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/index.ts +47 -10
  45. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/line-width-safety.ts +2 -2
  46. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/write-execution.ts +1 -0
  47. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +145 -190
  48. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/mcp-title.ts +39 -0
  49. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{message-display.ts → tool/message-display.ts} +24 -90
  50. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/names.ts +426 -0
  51. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/result.ts +90 -132
  52. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{show-more-hint.ts → tool/show-more-hint.ts} +10 -0
  53. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/transcript-refresh.ts +8 -26
  54. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/ansi-color.ts +44 -0
  55. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/ansi-text.ts +76 -0
  56. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/component-tree.ts +34 -0
  57. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/format.ts +28 -0
  58. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/fullscreen-detect.ts +51 -0
  59. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/patch-keys.ts +124 -0
  60. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/sgr-mouse.ts +70 -0
  61. package/node_modules/@herbertgao/pi-cc-extensions/package.json +8 -8
  62. package/node_modules/pi-antigravity/README.md +29 -6
  63. package/node_modules/pi-antigravity/package.json +12 -7
  64. package/node_modules/pi-antigravity/src/auth/accounts.ts +327 -0
  65. package/node_modules/pi-antigravity/src/auth/index.ts +9 -0
  66. package/node_modules/pi-antigravity/src/client/client.ts +1 -1
  67. package/node_modules/pi-antigravity/src/image/image.ts +4 -4
  68. package/node_modules/pi-antigravity/src/index.ts +203 -13
  69. package/node_modules/pi-antigravity/src/search/index.ts +1 -0
  70. package/node_modules/pi-antigravity/src/search/search.ts +325 -0
  71. package/node_modules/pi-antigravity/src/stream/stream.ts +191 -14
  72. package/node_modules/pi-antigravity/src/types/enums.ts +45 -36
  73. package/node_modules/pi-antigravity/src/types/types.ts +5 -12
  74. package/node_modules/pi-antigravity/src/utils/http.ts +7 -2
  75. package/node_modules/pi-antigravity/src/utils/util.ts +31 -3
  76. package/node_modules/pi-typesafe/README.md +2 -0
  77. package/node_modules/pi-typesafe/package.json +2 -1
  78. package/node_modules/pi-web-access/CHANGELOG.md +72 -0
  79. package/node_modules/pi-web-access/README.md +34 -13
  80. package/node_modules/pi-web-access/chrome-cookies.ts +79 -25
  81. package/node_modules/pi-web-access/curator-page.ts +5 -1
  82. package/node_modules/pi-web-access/curator-server.ts +2 -0
  83. package/node_modules/pi-web-access/dist/index.js +1337 -1009
  84. package/node_modules/pi-web-access/exa.ts +20 -52
  85. package/node_modules/pi-web-access/extract.ts +41 -4
  86. package/node_modules/pi-web-access/gemini-search.ts +12 -4
  87. package/node_modules/pi-web-access/index.ts +29 -37
  88. package/node_modules/pi-web-access/openai-search.ts +35 -7
  89. package/node_modules/pi-web-access/package.json +6 -5
  90. package/node_modules/pi-web-access/page-query.ts +2 -2
  91. package/node_modules/pi-web-access/query-rewrite.ts +2 -3
  92. package/node_modules/pi-web-access/ssrf-protection.ts +27 -10
  93. package/node_modules/pi-web-access/storage.ts +48 -77
  94. package/node_modules/pi-web-access/summary-model-scope.ts +6 -77
  95. package/node_modules/pi-web-access/summary-review.ts +3 -4
  96. package/node_modules/pi-web-access/tavily.ts +67 -20
  97. package/node_modules/pi-web-access/tool-activation.ts +53 -33
  98. package/node_modules/pi-web-access/utils.ts +1 -1
  99. package/node_modules/pi-web-access/you.ts +164 -0
  100. package/node_modules/pi-web-access/zai.ts +161 -0
  101. package/package.json +7 -11
  102. package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/hero.en.svg +0 -101
  103. package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/hero.svg +0 -101
  104. package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/welcome.webp +0 -0
  105. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/render-utils.ts +0 -5
  106. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/types.ts +0 -30
  107. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/write-display-utils.ts +0 -12
  108. package/node_modules/pi-footer/CHANGELOG.md +0 -145
  109. package/node_modules/pi-footer/LICENSE +0 -21
  110. package/node_modules/pi-footer/README.md +0 -354
  111. package/node_modules/pi-footer/package.json +0 -68
  112. package/node_modules/pi-footer/src/cache.ts +0 -106
  113. package/node_modules/pi-footer/src/colors.ts +0 -237
  114. package/node_modules/pi-footer/src/config.ts +0 -202
  115. package/node_modules/pi-footer/src/event-widgets.ts +0 -41
  116. package/node_modules/pi-footer/src/extension-statuses.ts +0 -102
  117. package/node_modules/pi-footer/src/git.ts +0 -135
  118. package/node_modules/pi-footer/src/index.ts +0 -268
  119. package/node_modules/pi-footer/src/metrics.ts +0 -141
  120. package/node_modules/pi-footer/src/presets.ts +0 -383
  121. package/node_modules/pi-footer/src/render.ts +0 -114
  122. package/node_modules/pi-footer/src/separators.ts +0 -52
  123. package/node_modules/pi-footer/src/types.ts +0 -122
  124. package/node_modules/pi-footer/src/ui/color-level-confirm.ts +0 -22
  125. package/node_modules/pi-footer/src/ui/color-options.ts +0 -195
  126. package/node_modules/pi-footer/src/ui/config-lifecycle.ts +0 -61
  127. package/node_modules/pi-footer/src/ui/edit-colors.ts +0 -13
  128. package/node_modules/pi-footer/src/ui/events.ts +0 -35
  129. package/node_modules/pi-footer/src/ui/extension-status-picker.ts +0 -60
  130. package/node_modules/pi-footer/src/ui/extension-statuses.ts +0 -73
  131. package/node_modules/pi-footer/src/ui/fields.ts +0 -252
  132. package/node_modules/pi-footer/src/ui/global-menu.ts +0 -126
  133. package/node_modules/pi-footer/src/ui/helpers.ts +0 -44
  134. package/node_modules/pi-footer/src/ui/layout.ts +0 -17
  135. package/node_modules/pi-footer/src/ui/line-list.ts +0 -19
  136. package/node_modules/pi-footer/src/ui/model.ts +0 -64
  137. package/node_modules/pi-footer/src/ui/navigation.ts +0 -29
  138. package/node_modules/pi-footer/src/ui/option-edit.ts +0 -93
  139. package/node_modules/pi-footer/src/ui/overlay-render.ts +0 -103
  140. package/node_modules/pi-footer/src/ui/screen-context.ts +0 -18
  141. package/node_modules/pi-footer/src/ui/screen-controller.ts +0 -27
  142. package/node_modules/pi-footer/src/ui/screen-render.ts +0 -32
  143. package/node_modules/pi-footer/src/ui/screen-state.ts +0 -20
  144. package/node_modules/pi-footer/src/ui/screen.ts +0 -243
  145. package/node_modules/pi-footer/src/ui/screens/add-widget.ts +0 -92
  146. package/node_modules/pi-footer/src/ui/screens/confirm-exit.ts +0 -52
  147. package/node_modules/pi-footer/src/ui/screens/controller.ts +0 -12
  148. package/node_modules/pi-footer/src/ui/screens/edit-colors.ts +0 -68
  149. package/node_modules/pi-footer/src/ui/screens/edit-widget.ts +0 -115
  150. package/node_modules/pi-footer/src/ui/screens/extension-status-row.ts +0 -61
  151. package/node_modules/pi-footer/src/ui/screens/global.ts +0 -75
  152. package/node_modules/pi-footer/src/ui/screens/line-list.ts +0 -108
  153. package/node_modules/pi-footer/src/ui/screens/main.ts +0 -99
  154. package/node_modules/pi-footer/src/ui/screens/terminal.ts +0 -121
  155. package/node_modules/pi-footer/src/ui/screens/widget-list.ts +0 -154
  156. package/node_modules/pi-footer/src/ui/terminal-menu.ts +0 -32
  157. package/node_modules/pi-footer/src/ui/theme.ts +0 -48
  158. package/node_modules/pi-footer/src/ui/title-bar.ts +0 -100
  159. package/node_modules/pi-footer/src/ui/widget-actions.ts +0 -76
  160. package/node_modules/pi-footer/src/ui.ts +0 -66
  161. package/node_modules/pi-footer/src/widgets/context.ts +0 -28
  162. package/node_modules/pi-footer/src/widgets/core/active-tools.ts +0 -17
  163. package/node_modules/pi-footer/src/widgets/core/context-window.ts +0 -24
  164. package/node_modules/pi-footer/src/widgets/core/cwd-basename.ts +0 -19
  165. package/node_modules/pi-footer/src/widgets/core/cwd.ts +0 -108
  166. package/node_modules/pi-footer/src/widgets/core/event.ts +0 -34
  167. package/node_modules/pi-footer/src/widgets/core/external-status.ts +0 -102
  168. package/node_modules/pi-footer/src/widgets/core/model-provider.ts +0 -20
  169. package/node_modules/pi-footer/src/widgets/core/model.ts +0 -35
  170. package/node_modules/pi-footer/src/widgets/core/provider.ts +0 -17
  171. package/node_modules/pi-footer/src/widgets/core/session-name.ts +0 -17
  172. package/node_modules/pi-footer/src/widgets/core/text-verbosity.ts +0 -17
  173. package/node_modules/pi-footer/src/widgets/core/thinking-level.ts +0 -17
  174. package/node_modules/pi-footer/src/widgets/git/ahead-behind.ts +0 -17
  175. package/node_modules/pi-footer/src/widgets/git/branch.ts +0 -81
  176. package/node_modules/pi-footer/src/widgets/git/clean.ts +0 -19
  177. package/node_modules/pi-footer/src/widgets/git/deletions.ts +0 -17
  178. package/node_modules/pi-footer/src/widgets/git/diff.ts +0 -38
  179. package/node_modules/pi-footer/src/widgets/git/insertions.ts +0 -17
  180. package/node_modules/pi-footer/src/widgets/git/remote.ts +0 -17
  181. package/node_modules/pi-footer/src/widgets/git/root.ts +0 -17
  182. package/node_modules/pi-footer/src/widgets/git/sha.ts +0 -17
  183. package/node_modules/pi-footer/src/widgets/git/staged.ts +0 -17
  184. package/node_modules/pi-footer/src/widgets/git/status.ts +0 -19
  185. package/node_modules/pi-footer/src/widgets/git/unstaged.ts +0 -17
  186. package/node_modules/pi-footer/src/widgets/git/untracked.ts +0 -17
  187. package/node_modules/pi-footer/src/widgets/instance.ts +0 -118
  188. package/node_modules/pi-footer/src/widgets/layout/custom-text.ts +0 -18
  189. package/node_modules/pi-footer/src/widgets/layout/flex-separator.ts +0 -32
  190. package/node_modules/pi-footer/src/widgets/layout/separator.ts +0 -57
  191. package/node_modules/pi-footer/src/widgets/layout/spacer.ts +0 -31
  192. package/node_modules/pi-footer/src/widgets/options.ts +0 -122
  193. package/node_modules/pi-footer/src/widgets/project/runtime.ts +0 -361
  194. package/node_modules/pi-footer/src/widgets/registry.ts +0 -223
  195. package/node_modules/pi-footer/src/widgets/session/assistant-messages.ts +0 -17
  196. package/node_modules/pi-footer/src/widgets/session/compactions.ts +0 -17
  197. package/node_modules/pi-footer/src/widgets/session/elapsed.ts +0 -18
  198. package/node_modules/pi-footer/src/widgets/session/last-activity.ts +0 -18
  199. package/node_modules/pi-footer/src/widgets/session/messages.ts +0 -19
  200. package/node_modules/pi-footer/src/widgets/session/session-id.ts +0 -17
  201. package/node_modules/pi-footer/src/widgets/session/session-start.ts +0 -18
  202. package/node_modules/pi-footer/src/widgets/session/tool-results.ts +0 -17
  203. package/node_modules/pi-footer/src/widgets/session/total-messages.ts +0 -19
  204. package/node_modules/pi-footer/src/widgets/session/total-time.ts +0 -18
  205. package/node_modules/pi-footer/src/widgets/session/user-messages.ts +0 -17
  206. package/node_modules/pi-footer/src/widgets/store.ts +0 -26
  207. package/node_modules/pi-footer/src/widgets/tokens/cache-hit-rate.ts +0 -55
  208. package/node_modules/pi-footer/src/widgets/tokens/cache-read.ts +0 -18
  209. package/node_modules/pi-footer/src/widgets/tokens/cache-write.ts +0 -18
  210. package/node_modules/pi-footer/src/widgets/tokens/context-bar.ts +0 -108
  211. package/node_modules/pi-footer/src/widgets/tokens/context-length.ts +0 -26
  212. package/node_modules/pi-footer/src/widgets/tokens/context-remaining.ts +0 -29
  213. package/node_modules/pi-footer/src/widgets/tokens/context.ts +0 -29
  214. package/node_modules/pi-footer/src/widgets/tokens/cost.ts +0 -51
  215. package/node_modules/pi-footer/src/widgets/tokens/input-speed.ts +0 -25
  216. package/node_modules/pi-footer/src/widgets/tokens/input-tokens.ts +0 -18
  217. package/node_modules/pi-footer/src/widgets/tokens/output-speed.ts +0 -25
  218. package/node_modules/pi-footer/src/widgets/tokens/output-tokens.ts +0 -18
  219. package/node_modules/pi-footer/src/widgets/tokens/tokens.ts +0 -20
  220. package/node_modules/pi-footer/src/widgets/tokens/total-speed.ts +0 -25
  221. package/node_modules/pi-footer/src/widgets/tokens/total-tokens.ts +0 -18
  222. package/node_modules/pi-footer/src/widgets/types.ts +0 -181
  223. package/node_modules/pi-footer/src/widgets/utils/colors.ts +0 -11
  224. package/node_modules/pi-footer/src/widgets/utils/context.ts +0 -112
  225. package/node_modules/pi-footer/src/widgets/utils/session.ts +0 -19
  226. package/node_modules/pi-footer/src/widgets/utils/token-format.ts +0 -78
@@ -2,13 +2,14 @@
2
2
  * Agent 回合摘要:统计一次 agent 运行的工具使用并格式化成摘要文本。
3
3
  *
4
4
  * 分类:bash / read / edit / write / other(精确工具名;MCP 风格名归 other)。
5
- * 计数:bash 按调用次数;read/edit/write 按非空 path/file_path 去重;other 按调用次数。
5
+ * 计数:bash/powershell 按调用次数;read/edit/write 按非空 path/file_path 去重;other 按调用次数。
6
6
  * 失败单独累计;另记回合耗时。
7
7
  *
8
8
  * 呈现:`summaryLine` 纯文本,`summaryMarkdown` Markdown(可 box 引用块)。
9
9
  */
10
10
 
11
11
  import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
12
+ import { formatDuration } from "../../utils/format.ts";
12
13
 
13
14
  /** 工具分类。 */
14
15
  export type AgentToolCategory = "bash" | "read" | "edit" | "write" | "other";
@@ -38,6 +39,7 @@ function nonEmptyString(value: unknown): value is string {
38
39
  }
39
40
 
40
41
  function toolPath(args?: Record<string, unknown> | null): string | undefined {
42
+ // path 为空字符串时回退 file_path 别名,避免该文件不被计入去重集合。
41
43
  if (nonEmptyString(args?.path)) return args.path;
42
44
  return nonEmptyString(args?.file_path) ? args.file_path : undefined;
43
45
  }
@@ -98,18 +100,6 @@ export class AgentRunSummary {
98
100
  }
99
101
  }
100
102
 
101
- /** 毫秒 → "1h 2m 3s"/"2m 3s"/"3s";低于 1 秒返回 ""(省略)。 */
102
- export function formatDuration(ms: number): string {
103
- const totalSec = Math.floor(ms / 1000);
104
- if (totalSec < 1) return "";
105
- const hours = Math.floor(totalSec / 3600);
106
- const minutes = Math.floor((totalSec % 3600) / 60);
107
- const seconds = totalSec % 60;
108
- if (hours > 0) return `${hours}h ${minutes}m ${seconds}s`;
109
- if (minutes > 0) return `${minutes}m ${seconds}s`;
110
- return `${seconds}s`;
111
- }
112
-
113
103
  const plural = (count: number) => (count === 1 ? "" : "s");
114
104
 
115
105
  /** 输出顺序:bash → read → edit → write → other → failed。 */
@@ -124,24 +114,8 @@ function summaryParts(data: AgentSummaryData): string[] {
124
114
  return parts;
125
115
  }
126
116
 
127
- /** 纯文本摘要行:句首大写 + 可选耗时。 */
128
- export function summaryLine(data: AgentSummaryData): string {
129
- const parts = summaryParts(data);
130
- if (parts.length === 0) return "";
131
- const text = parts.join(", ");
132
- const capitalized = text[0].toUpperCase() + text.slice(1);
133
- const duration = formatDuration(data.durationMs);
134
- return duration ? `${capitalized} · ${duration}` : capitalized;
135
- }
136
-
137
- /**
138
- * Markdown 摘要行。
139
- * `box` 为 true:引用块 `> *斜体*`;false:整体加粗。
140
- * `colors`:仅数字染色(success / failed)。
141
- */
142
117
  export function summaryMarkdown(
143
118
  data: AgentSummaryData,
144
- box = false,
145
119
  colors: { success: string; failed: string } = { success: "", failed: "" },
146
120
  ): string {
147
121
  const parts = summaryParts(data);
@@ -158,7 +132,7 @@ export function summaryMarkdown(
158
132
  .join(", ");
159
133
  const duration = formatDuration(data.durationMs);
160
134
  const line = duration ? `${text} · ${duration}` : text;
161
- return box ? `> *${line}*` : `**${line}**`;
135
+ return `> *${line}*`;
162
136
  }
163
137
 
164
138
  /**
@@ -170,8 +144,7 @@ export function summaryMarkdown(
170
144
  export function bindAgentSummary(
171
145
  pi: ExtensionAPI,
172
146
  onSummary: (data: AgentSummaryData) => void,
173
- minToolCount = 2,
174
- ): () => void {
147
+ ): void {
175
148
  let summary = new AgentRunSummary();
176
149
  pi.on("agent_start", async () => {
177
150
  summary = new AgentRunSummary();
@@ -183,9 +156,6 @@ export function bindAgentSummary(
183
156
  summary.recordToolResult(event.isError === true);
184
157
  });
185
158
  pi.on("agent_end", async () => {
186
- if (summary.toolCount >= minToolCount) onSummary(summary.snapshot());
159
+ if (summary.toolCount >= 2) onSummary(summary.snapshot());
187
160
  });
188
- return () => {
189
- summary = new AgentRunSummary();
190
- };
191
161
  }
@@ -2,7 +2,7 @@
2
2
  * Agent 回合摘要展示:agent_end 时把本回合工具统计写入会话条目,
3
3
  * 由 entry renderer 渲染为 markdown 引用块 `> [!TIP] *斜体内容*`。
4
4
  *
5
- * 统计复用 ./core.ts(bash/read/edit/write/other)。
5
+ * 统计复用 ./core.ts(bash|powershell/read/edit/write/other)。
6
6
  * appendEntry 不进 LLM 上下文,只显示在聊天区。
7
7
  * 引用块文字色取主题 mdQuote(cc 主题下为 muted 灰),内容用 *斜体* 语法。
8
8
  */
@@ -16,7 +16,7 @@ export const AGENT_SUMMARY_ENTRY_TYPE = "agent-summary";
16
16
 
17
17
  export default function (pi: ExtensionAPI): void {
18
18
  pi.registerEntryRenderer(AGENT_SUMMARY_ENTRY_TYPE, (entry, _options, theme) => {
19
- const line = summaryMarkdown(entry.data as AgentSummaryData, true, {
19
+ const line = summaryMarkdown(entry.data as AgentSummaryData, {
20
20
  success: theme.getFgAnsi("success"),
21
21
  failed: theme.getFgAnsi("error"),
22
22
  });
@@ -18,16 +18,19 @@ import {
18
18
  wrapTextWithAnsi,
19
19
  } from "@earendil-works/pi-tui";
20
20
  import { Box, Markdown, Spacer, Text, type Component } from "@earendil-works/pi-tui";
21
- import { isToolTuiFullscreen } from "../renderer/show-more-hint.ts";
21
+ import { isToolTuiFullscreen } from "../renderer/tool/show-more-hint.ts";
22
22
  import {
23
23
  animateCompactThinkingText,
24
24
  formatThoughtDuration,
25
25
  styleCompactThinkingText,
26
26
  } from "../renderer/compact-mode.ts";
27
27
  import { refreshMountedTranscript } from "../renderer/transcript-refresh.ts";
28
- // 保持导出兼容:渲染函数已并入 renderer/compact-mode.ts,这里 re-export。
29
- export { animateCompactThinkingText, formatThoughtDuration, styleCompactThinkingText };
30
-
28
+ import {
29
+ COMPACT_THINKING_OWNER,
30
+ COMPACT_THINKING_PATCH_KEY,
31
+ patchRegistry,
32
+ PROTOTYPE_ORIGINAL_KEY,
33
+ } from "../utils/patch-keys.ts";
31
34
  // pi-tui 类型声明中 TUI 的 re-export 解析失败,本地用最小结构化类型(只用到 requestRender)。
32
35
  type RenderTui = { requestRender(force?: boolean): void };
33
36
 
@@ -112,8 +115,6 @@ const config: CompactThinkingConfig = {
112
115
  };
113
116
 
114
117
  const DURATION_ENTRY_TYPE = "compact-thinking-duration";
115
- const COMPACT_THINKING_PATCH_KEY = Symbol.for("pi.ccstyle.compact-thinking-update");
116
- const PROTOTYPE_ORIGINAL_KEY = Symbol.for("pi.ccstyle.prototype-original");
117
118
 
118
119
  /** 当前激活 session 的只读查询委托(compact 渲染层使用)。 */
119
120
  type ThinkingDurationQuery = (messageTimestamp: number) => number | undefined;
@@ -203,12 +204,8 @@ type ExpandedWrapEntry = { text: string; lines: string[] };
203
204
  const expandedWrapCache = new Map<string, ExpandedWrapEntry>();
204
205
  export const THINKING_EXPANDED_WRAP_CACHE_MAX = 64;
205
206
 
206
- export function thinkingRunKey(messageTimestamp: number, runStartIndex: number): string {
207
- return `${messageTimestamp}:${runStartIndex}`;
208
- }
209
-
210
207
  function expandedWrapKey(messageTimestamp: number, runStartIndex: number, width: number): string {
211
- return `${thinkingRunKey(messageTimestamp, runStartIndex)}:${width}`;
208
+ return `${messageTimestamp}:${runStartIndex}:${width}`;
212
209
  }
213
210
 
214
211
  function wrapExpandedThinking(
@@ -236,9 +233,11 @@ function wrapExpandedThinking(
236
233
  }
237
234
 
238
235
  function evictExpandedWraps(messageTimestamp: number, runStartIndex: number): void {
239
- const prefix = `${thinkingRunKey(messageTimestamp, runStartIndex)}:`;
240
236
  for (const key of expandedWrapCache.keys()) {
241
- if (key.startsWith(prefix)) expandedWrapCache.delete(key);
237
+ const [ts, run] = key.split(":");
238
+ if (Number(ts) === messageTimestamp && Number(run) === runStartIndex) {
239
+ expandedWrapCache.delete(key);
240
+ }
242
241
  }
243
242
  }
244
243
 
@@ -322,9 +321,9 @@ function hiddenPreviewHint(
322
321
  return undefined;
323
322
  }
324
323
 
325
- const expandedThinking = new Set<string>();
324
+ const expandedThinking = new Set<number>();
326
325
 
327
- /** 折叠预览 + 展开全文。fullscreen 点击 hint 展开、双击整块收起,对齐工具卡。 */
326
+ /** 折叠预览 + 展开全文。fullscreen 点击 hint 展开、展开卡单击整块收起(拖动选择文本时不收起)。 */
328
327
  export class ThinkingPreviewBlock implements Component {
329
328
  private heading: string;
330
329
  private text: string;
@@ -361,7 +360,7 @@ export class ThinkingPreviewBlock implements Component {
361
360
  this.runStartIndex = runStartIndex;
362
361
  this.style = style;
363
362
  this.theme = theme;
364
- this._expanded = expandedThinking.has(thinkingRunKey(messageTimestamp, runStartIndex));
363
+ this._expanded = expandedThinking.has(messageTimestamp);
365
364
  }
366
365
 
367
366
  private paint(color: string, text: string): string {
@@ -377,10 +376,9 @@ export class ThinkingPreviewBlock implements Component {
377
376
  setExpanded(expanded: boolean): void {
378
377
  if (this._expanded !== expanded) this.collapsedMemo = undefined;
379
378
  this._expanded = expanded;
380
- const key = thinkingRunKey(this.messageTimestamp, this.runStartIndex);
381
- if (expanded) expandedThinking.add(key);
379
+ if (expanded) expandedThinking.add(this.messageTimestamp);
382
380
  else {
383
- expandedThinking.delete(key);
381
+ expandedThinking.delete(this.messageTimestamp);
384
382
  evictExpandedWraps(this.messageTimestamp, this.runStartIndex);
385
383
  }
386
384
  }
@@ -632,6 +630,7 @@ function compactThinking(pi: ExtensionAPI) {
632
630
  ) {
633
631
  const component = this as AssistantMessageComponentLike;
634
632
  const self = this as unknown as AssistantInternals;
633
+ // isStreaming 丢失 → mermaid 流式误渲染来回闪。
635
634
  self.isStreaming = isStreaming ?? self.isStreaming;
636
635
  self.lastMessage = message;
637
636
  latestComponent = component;
@@ -1044,8 +1043,6 @@ type CompactThinkingOwner = {
1044
1043
  stop(event?: any, ctx?: any): void;
1045
1044
  };
1046
1045
 
1047
- const COMPACT_THINKING_OWNER = Symbol.for("pi.ccstyle.compact-thinking-owner");
1048
-
1049
1046
  type UpstreamHandler = (event: any, ctx: any) => void;
1050
1047
 
1051
1048
  export function installCompactThinking(
@@ -1053,10 +1050,6 @@ export function installCompactThinking(
1053
1050
  initialConfig: CompactThinkingConfig,
1054
1051
  ): CompactThinkingController {
1055
1052
  const owner = {};
1056
- const host = globalThis as typeof globalThis & {
1057
- [COMPACT_THINKING_OWNER]?: CompactThinkingOwner;
1058
- };
1059
-
1060
1053
  let session: { event: any; ctx: any } | undefined;
1061
1054
  let active = false;
1062
1055
  // Stable pi.on wrappers delegate here so activate/reload never double-binds.
@@ -1092,7 +1085,8 @@ export function installCompactThinking(
1092
1085
  const shutdown = delegates.get("session_shutdown");
1093
1086
  delegates.clear();
1094
1087
  shutdown?.(event ?? session?.event ?? {}, ctx ?? session?.ctx ?? { mode: "rpc", ui: {} });
1095
- if (host[COMPACT_THINKING_OWNER]?.owner === owner) delete host[COMPACT_THINKING_OWNER];
1088
+ if (patchRegistry.get<CompactThinkingOwner>(COMPACT_THINKING_OWNER)?.owner === owner)
1089
+ patchRegistry.delete(COMPACT_THINKING_OWNER);
1096
1090
  };
1097
1091
 
1098
1092
  const activate = (event: any, ctx: any) => {
@@ -1100,7 +1094,7 @@ export function installCompactThinking(
1100
1094
  // TUI prototype patch or kill its thinking ticker.
1101
1095
  if (ctx?.mode !== "tui") return;
1102
1096
 
1103
- host[COMPACT_THINKING_OWNER]?.stop(event, ctx);
1097
+ patchRegistry.get<CompactThinkingOwner>(COMPACT_THINKING_OWNER)?.stop(event, ctx);
1104
1098
  session = { event, ctx };
1105
1099
 
1106
1100
  // 配置统一由 claude-code-style 管控,加载时覆盖库默认值。
@@ -1125,7 +1119,7 @@ export function installCompactThinking(
1125
1119
  } as unknown as ExtensionAPI);
1126
1120
 
1127
1121
  active = true;
1128
- host[COMPACT_THINKING_OWNER] = { owner, stop };
1122
+ patchRegistry.install(COMPACT_THINKING_OWNER, { owner, stop });
1129
1123
  };
1130
1124
 
1131
1125
  pi.on("session_start", (event, ctx) => {
@@ -1133,7 +1127,8 @@ export function installCompactThinking(
1133
1127
  activate(event, ctx);
1134
1128
  });
1135
1129
  pi.on("session_shutdown", (event, ctx) => {
1136
- if (host[COMPACT_THINKING_OWNER]?.owner === owner) stop(event, ctx);
1130
+ if (patchRegistry.get<CompactThinkingOwner>(COMPACT_THINKING_OWNER)?.owner === owner)
1131
+ stop(event, ctx);
1137
1132
  session = undefined;
1138
1133
  });
1139
1134