@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.
- package/README.md +20 -28
- package/THIRD_PARTY_NOTICES.md +1 -1
- package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +76 -59
- package/node_modules/@herbertgao/pi-cc-extensions/README.md +76 -59
- package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/preview.webp +0 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +93 -34
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +346 -117
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/agent-summary/core.ts +6 -36
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/agent-summary/index.ts +2 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +24 -29
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/context.ts +330 -360
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/reference/index.ts +56 -108
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/reference/session.ts +97 -15
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/reference/subagent.ts +80 -45
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/flush-docked-bash.ts +36 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/footer-layout.ts +229 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/footer.ts +479 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/startup-header.ts +92 -61
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/working-message.ts +75 -40
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/index.ts +19 -3
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +1080 -229
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +232 -259
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/index.ts +42 -41
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/markdown-enhance.ts +8 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/hover.ts +2 -7
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/interaction.ts +277 -113
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/layout.ts +15 -6
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/packets.ts +18 -72
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/scroll.ts +61 -26
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/ansi-utils.ts +25 -57
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-component.ts +125 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-edit-render.ts +227 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-header.ts +136 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-highlight.ts +115 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-inline.ts +324 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-layout.ts +762 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-limits.ts +152 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-palette.ts +410 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-parse.ts +535 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-presentation.ts +2 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-renderer.ts +21 -3219
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-text.ts +44 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-write-render.ts +568 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/index.ts +47 -10
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/line-width-safety.ts +2 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/write-execution.ts +1 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +145 -190
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/mcp-title.ts +39 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{message-display.ts → tool/message-display.ts} +24 -90
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/names.ts +426 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/result.ts +90 -132
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{show-more-hint.ts → tool/show-more-hint.ts} +10 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/transcript-refresh.ts +8 -26
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/ansi-color.ts +44 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/ansi-text.ts +76 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/component-tree.ts +34 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/format.ts +28 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/fullscreen-detect.ts +51 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/patch-keys.ts +124 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/sgr-mouse.ts +70 -0
- package/node_modules/@herbertgao/pi-cc-extensions/package.json +8 -8
- package/node_modules/pi-antigravity/README.md +29 -6
- package/node_modules/pi-antigravity/package.json +12 -7
- package/node_modules/pi-antigravity/src/auth/accounts.ts +327 -0
- package/node_modules/pi-antigravity/src/auth/index.ts +9 -0
- package/node_modules/pi-antigravity/src/client/client.ts +1 -1
- package/node_modules/pi-antigravity/src/image/image.ts +4 -4
- package/node_modules/pi-antigravity/src/index.ts +203 -13
- package/node_modules/pi-antigravity/src/search/index.ts +1 -0
- package/node_modules/pi-antigravity/src/search/search.ts +325 -0
- package/node_modules/pi-antigravity/src/stream/stream.ts +191 -14
- package/node_modules/pi-antigravity/src/types/enums.ts +45 -36
- package/node_modules/pi-antigravity/src/types/types.ts +5 -12
- package/node_modules/pi-antigravity/src/utils/http.ts +7 -2
- package/node_modules/pi-antigravity/src/utils/util.ts +31 -3
- package/node_modules/pi-typesafe/README.md +2 -0
- package/node_modules/pi-typesafe/package.json +2 -1
- package/node_modules/pi-web-access/CHANGELOG.md +72 -0
- package/node_modules/pi-web-access/README.md +34 -13
- package/node_modules/pi-web-access/chrome-cookies.ts +79 -25
- package/node_modules/pi-web-access/curator-page.ts +5 -1
- package/node_modules/pi-web-access/curator-server.ts +2 -0
- package/node_modules/pi-web-access/dist/index.js +1337 -1009
- package/node_modules/pi-web-access/exa.ts +20 -52
- package/node_modules/pi-web-access/extract.ts +41 -4
- package/node_modules/pi-web-access/gemini-search.ts +12 -4
- package/node_modules/pi-web-access/index.ts +29 -37
- package/node_modules/pi-web-access/openai-search.ts +35 -7
- package/node_modules/pi-web-access/package.json +6 -5
- package/node_modules/pi-web-access/page-query.ts +2 -2
- package/node_modules/pi-web-access/query-rewrite.ts +2 -3
- package/node_modules/pi-web-access/ssrf-protection.ts +27 -10
- package/node_modules/pi-web-access/storage.ts +48 -77
- package/node_modules/pi-web-access/summary-model-scope.ts +6 -77
- package/node_modules/pi-web-access/summary-review.ts +3 -4
- package/node_modules/pi-web-access/tavily.ts +67 -20
- package/node_modules/pi-web-access/tool-activation.ts +53 -33
- package/node_modules/pi-web-access/utils.ts +1 -1
- package/node_modules/pi-web-access/you.ts +164 -0
- package/node_modules/pi-web-access/zai.ts +161 -0
- package/package.json +7 -11
- package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/hero.en.svg +0 -101
- package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/hero.svg +0 -101
- package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/welcome.webp +0 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/render-utils.ts +0 -5
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/types.ts +0 -30
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/write-display-utils.ts +0 -12
- package/node_modules/pi-footer/CHANGELOG.md +0 -145
- package/node_modules/pi-footer/LICENSE +0 -21
- package/node_modules/pi-footer/README.md +0 -354
- package/node_modules/pi-footer/package.json +0 -68
- package/node_modules/pi-footer/src/cache.ts +0 -106
- package/node_modules/pi-footer/src/colors.ts +0 -237
- package/node_modules/pi-footer/src/config.ts +0 -202
- package/node_modules/pi-footer/src/event-widgets.ts +0 -41
- package/node_modules/pi-footer/src/extension-statuses.ts +0 -102
- package/node_modules/pi-footer/src/git.ts +0 -135
- package/node_modules/pi-footer/src/index.ts +0 -268
- package/node_modules/pi-footer/src/metrics.ts +0 -141
- package/node_modules/pi-footer/src/presets.ts +0 -383
- package/node_modules/pi-footer/src/render.ts +0 -114
- package/node_modules/pi-footer/src/separators.ts +0 -52
- package/node_modules/pi-footer/src/types.ts +0 -122
- package/node_modules/pi-footer/src/ui/color-level-confirm.ts +0 -22
- package/node_modules/pi-footer/src/ui/color-options.ts +0 -195
- package/node_modules/pi-footer/src/ui/config-lifecycle.ts +0 -61
- package/node_modules/pi-footer/src/ui/edit-colors.ts +0 -13
- package/node_modules/pi-footer/src/ui/events.ts +0 -35
- package/node_modules/pi-footer/src/ui/extension-status-picker.ts +0 -60
- package/node_modules/pi-footer/src/ui/extension-statuses.ts +0 -73
- package/node_modules/pi-footer/src/ui/fields.ts +0 -252
- package/node_modules/pi-footer/src/ui/global-menu.ts +0 -126
- package/node_modules/pi-footer/src/ui/helpers.ts +0 -44
- package/node_modules/pi-footer/src/ui/layout.ts +0 -17
- package/node_modules/pi-footer/src/ui/line-list.ts +0 -19
- package/node_modules/pi-footer/src/ui/model.ts +0 -64
- package/node_modules/pi-footer/src/ui/navigation.ts +0 -29
- package/node_modules/pi-footer/src/ui/option-edit.ts +0 -93
- package/node_modules/pi-footer/src/ui/overlay-render.ts +0 -103
- package/node_modules/pi-footer/src/ui/screen-context.ts +0 -18
- package/node_modules/pi-footer/src/ui/screen-controller.ts +0 -27
- package/node_modules/pi-footer/src/ui/screen-render.ts +0 -32
- package/node_modules/pi-footer/src/ui/screen-state.ts +0 -20
- package/node_modules/pi-footer/src/ui/screen.ts +0 -243
- package/node_modules/pi-footer/src/ui/screens/add-widget.ts +0 -92
- package/node_modules/pi-footer/src/ui/screens/confirm-exit.ts +0 -52
- package/node_modules/pi-footer/src/ui/screens/controller.ts +0 -12
- package/node_modules/pi-footer/src/ui/screens/edit-colors.ts +0 -68
- package/node_modules/pi-footer/src/ui/screens/edit-widget.ts +0 -115
- package/node_modules/pi-footer/src/ui/screens/extension-status-row.ts +0 -61
- package/node_modules/pi-footer/src/ui/screens/global.ts +0 -75
- package/node_modules/pi-footer/src/ui/screens/line-list.ts +0 -108
- package/node_modules/pi-footer/src/ui/screens/main.ts +0 -99
- package/node_modules/pi-footer/src/ui/screens/terminal.ts +0 -121
- package/node_modules/pi-footer/src/ui/screens/widget-list.ts +0 -154
- package/node_modules/pi-footer/src/ui/terminal-menu.ts +0 -32
- package/node_modules/pi-footer/src/ui/theme.ts +0 -48
- package/node_modules/pi-footer/src/ui/title-bar.ts +0 -100
- package/node_modules/pi-footer/src/ui/widget-actions.ts +0 -76
- package/node_modules/pi-footer/src/ui.ts +0 -66
- package/node_modules/pi-footer/src/widgets/context.ts +0 -28
- package/node_modules/pi-footer/src/widgets/core/active-tools.ts +0 -17
- package/node_modules/pi-footer/src/widgets/core/context-window.ts +0 -24
- package/node_modules/pi-footer/src/widgets/core/cwd-basename.ts +0 -19
- package/node_modules/pi-footer/src/widgets/core/cwd.ts +0 -108
- package/node_modules/pi-footer/src/widgets/core/event.ts +0 -34
- package/node_modules/pi-footer/src/widgets/core/external-status.ts +0 -102
- package/node_modules/pi-footer/src/widgets/core/model-provider.ts +0 -20
- package/node_modules/pi-footer/src/widgets/core/model.ts +0 -35
- package/node_modules/pi-footer/src/widgets/core/provider.ts +0 -17
- package/node_modules/pi-footer/src/widgets/core/session-name.ts +0 -17
- package/node_modules/pi-footer/src/widgets/core/text-verbosity.ts +0 -17
- package/node_modules/pi-footer/src/widgets/core/thinking-level.ts +0 -17
- package/node_modules/pi-footer/src/widgets/git/ahead-behind.ts +0 -17
- package/node_modules/pi-footer/src/widgets/git/branch.ts +0 -81
- package/node_modules/pi-footer/src/widgets/git/clean.ts +0 -19
- package/node_modules/pi-footer/src/widgets/git/deletions.ts +0 -17
- package/node_modules/pi-footer/src/widgets/git/diff.ts +0 -38
- package/node_modules/pi-footer/src/widgets/git/insertions.ts +0 -17
- package/node_modules/pi-footer/src/widgets/git/remote.ts +0 -17
- package/node_modules/pi-footer/src/widgets/git/root.ts +0 -17
- package/node_modules/pi-footer/src/widgets/git/sha.ts +0 -17
- package/node_modules/pi-footer/src/widgets/git/staged.ts +0 -17
- package/node_modules/pi-footer/src/widgets/git/status.ts +0 -19
- package/node_modules/pi-footer/src/widgets/git/unstaged.ts +0 -17
- package/node_modules/pi-footer/src/widgets/git/untracked.ts +0 -17
- package/node_modules/pi-footer/src/widgets/instance.ts +0 -118
- package/node_modules/pi-footer/src/widgets/layout/custom-text.ts +0 -18
- package/node_modules/pi-footer/src/widgets/layout/flex-separator.ts +0 -32
- package/node_modules/pi-footer/src/widgets/layout/separator.ts +0 -57
- package/node_modules/pi-footer/src/widgets/layout/spacer.ts +0 -31
- package/node_modules/pi-footer/src/widgets/options.ts +0 -122
- package/node_modules/pi-footer/src/widgets/project/runtime.ts +0 -361
- package/node_modules/pi-footer/src/widgets/registry.ts +0 -223
- package/node_modules/pi-footer/src/widgets/session/assistant-messages.ts +0 -17
- package/node_modules/pi-footer/src/widgets/session/compactions.ts +0 -17
- package/node_modules/pi-footer/src/widgets/session/elapsed.ts +0 -18
- package/node_modules/pi-footer/src/widgets/session/last-activity.ts +0 -18
- package/node_modules/pi-footer/src/widgets/session/messages.ts +0 -19
- package/node_modules/pi-footer/src/widgets/session/session-id.ts +0 -17
- package/node_modules/pi-footer/src/widgets/session/session-start.ts +0 -18
- package/node_modules/pi-footer/src/widgets/session/tool-results.ts +0 -17
- package/node_modules/pi-footer/src/widgets/session/total-messages.ts +0 -19
- package/node_modules/pi-footer/src/widgets/session/total-time.ts +0 -18
- package/node_modules/pi-footer/src/widgets/session/user-messages.ts +0 -17
- package/node_modules/pi-footer/src/widgets/store.ts +0 -26
- package/node_modules/pi-footer/src/widgets/tokens/cache-hit-rate.ts +0 -55
- package/node_modules/pi-footer/src/widgets/tokens/cache-read.ts +0 -18
- package/node_modules/pi-footer/src/widgets/tokens/cache-write.ts +0 -18
- package/node_modules/pi-footer/src/widgets/tokens/context-bar.ts +0 -108
- package/node_modules/pi-footer/src/widgets/tokens/context-length.ts +0 -26
- package/node_modules/pi-footer/src/widgets/tokens/context-remaining.ts +0 -29
- package/node_modules/pi-footer/src/widgets/tokens/context.ts +0 -29
- package/node_modules/pi-footer/src/widgets/tokens/cost.ts +0 -51
- package/node_modules/pi-footer/src/widgets/tokens/input-speed.ts +0 -25
- package/node_modules/pi-footer/src/widgets/tokens/input-tokens.ts +0 -18
- package/node_modules/pi-footer/src/widgets/tokens/output-speed.ts +0 -25
- package/node_modules/pi-footer/src/widgets/tokens/output-tokens.ts +0 -18
- package/node_modules/pi-footer/src/widgets/tokens/tokens.ts +0 -20
- package/node_modules/pi-footer/src/widgets/tokens/total-speed.ts +0 -25
- package/node_modules/pi-footer/src/widgets/tokens/total-tokens.ts +0 -18
- package/node_modules/pi-footer/src/widgets/types.ts +0 -181
- package/node_modules/pi-footer/src/widgets/utils/colors.ts +0 -11
- package/node_modules/pi-footer/src/widgets/utils/context.ts +0 -112
- package/node_modules/pi-footer/src/widgets/utils/session.ts +0 -19
- 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
|
|
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
|
-
|
|
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 >=
|
|
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,
|
|
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
|
-
|
|
29
|
-
|
|
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 `${
|
|
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
|
-
|
|
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<
|
|
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(
|
|
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
|
-
|
|
381
|
-
if (expanded) expandedThinking.add(key);
|
|
379
|
+
if (expanded) expandedThinking.add(this.messageTimestamp);
|
|
382
380
|
else {
|
|
383
|
-
expandedThinking.delete(
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
1130
|
+
if (patchRegistry.get<CompactThinkingOwner>(COMPACT_THINKING_OWNER)?.owner === owner)
|
|
1131
|
+
stop(event, ctx);
|
|
1137
1132
|
session = undefined;
|
|
1138
1133
|
});
|
|
1139
1134
|
|