@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.
- package/README.md +14 -16
- package/THIRD_PARTY_NOTICES.md +29 -3
- package/node_modules/@herbertgao/pi-bark/README.md +39 -3
- package/node_modules/@herbertgao/pi-bark/package.json +1 -1
- package/node_modules/@herbertgao/pi-bark/src/index.ts +275 -15
- package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +85 -68
- package/node_modules/@herbertgao/pi-cc-extensions/README.md +79 -62
- package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/preview.webp +0 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +116 -34
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +370 -118
- 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 +31 -33
- 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 +521 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/mcp-chip.ts +136 -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 +58 -38
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/index.ts +19 -3
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +1127 -231
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +267 -262
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/index.ts +38 -48
- 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 +287 -114
- 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/codemode.ts +303 -0
- 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 +151 -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 +4 -4
- 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 +103 -48
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/line-width-safety.ts +8 -7
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/write-execution.ts +2 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +171 -196
- 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} +27 -93
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/names.ts +429 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/result.ts +259 -164
- 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 +77 -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 +10 -8
- package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +6 -0
- package/node_modules/@herbertgao/pi-subagents/package.json +1 -1
- package/node_modules/@herbertgao/pi-subagents/src/mention-clone.ts +3 -2
- package/node_modules/@herbertgao/sol-pi/CONTRIBUTING.md +22 -0
- package/node_modules/@herbertgao/sol-pi/README.md +36 -17
- package/node_modules/@herbertgao/sol-pi/THIRD_PARTY_NOTICES.md +10 -6
- package/node_modules/@herbertgao/sol-pi/agents-install.md +15 -12
- package/node_modules/@herbertgao/sol-pi/docs/compatibility.md +24 -8
- package/node_modules/@herbertgao/sol-pi/docs/configuration.md +2 -2
- package/node_modules/@herbertgao/sol-pi/docs/star-history.md +18 -0
- package/node_modules/@herbertgao/sol-pi/package.json +4 -2
- package/node_modules/@herbertgao/sol-pi/scripts/check-sol-pi-config.mjs +1 -1
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/config.ts +1 -1
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/action-fusion/file-queue.ts +23 -4
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/action-fusion/index.ts +32 -1
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/action-fusion/then-run.ts +3 -2
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/observation-pack/observation.ts +1 -1
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/economics.ts +27 -7
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/extension.ts +137 -41
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/index.ts +1 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/plan.ts +2 -1
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/projection.ts +58 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/state.ts +28 -6
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/tools.ts +2 -1
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/runtime-paths.ts +15 -2
- package/node_modules/@juicesharp/rpiv-ask-user-question/package.json +2 -2
- package/node_modules/@pi-plugins/fast-mode/README.md +7 -1
- package/node_modules/@pi-plugins/fast-mode/dist/index.d.mts.map +1 -1
- package/node_modules/@pi-plugins/fast-mode/dist/index.mjs +7 -1
- package/node_modules/@pi-plugins/fast-mode/dist/index.mjs.map +1 -1
- package/node_modules/@pi-plugins/fast-mode/package.json +5 -5
- package/node_modules/pi-antigravity/README.md +3 -0
- package/node_modules/pi-antigravity/package.json +8 -8
- package/node_modules/pi-antigravity/src/auth/oauth.ts +6 -3
- package/node_modules/pi-antigravity/src/index.ts +114 -110
- package/node_modules/pi-antigravity/src/stream/stream.ts +1 -1
- package/node_modules/pi-antigravity/src/utils/util.ts +18 -1
- package/node_modules/pi-multi-account/CHANGELOG.md +20 -0
- package/node_modules/pi-multi-account/README.md +46 -8
- package/node_modules/pi-multi-account/config-file-transaction.ts +42 -0
- package/node_modules/pi-multi-account/index.ts +255 -269
- package/node_modules/pi-multi-account/model-pins.ts +36 -0
- package/node_modules/pi-multi-account/package.json +9 -7
- package/node_modules/pi-multi-account/slot-proxy-auth.ts +12 -2
- package/node_modules/pi-multi-account/slot-proxy.ts +27 -5
- package/node_modules/pi-web-access/CHANGELOG.md +17 -0
- package/node_modules/pi-web-access/README.md +6 -3
- package/node_modules/pi-web-access/brave-rate-limit.ts +170 -0
- package/node_modules/pi-web-access/brave.ts +28 -11
- package/node_modules/pi-web-access/dist/index.js +202 -33
- package/node_modules/pi-web-access/gemini-search.ts +2 -5
- package/node_modules/pi-web-access/index.ts +13 -7
- package/node_modules/pi-web-access/openai-search.ts +24 -10
- package/node_modules/pi-web-access/package.json +1 -1
- package/node_modules/pi-web-access/summary-review.ts +8 -2
- package/node_modules/{@herbertgao/resume-from → resume-from}/README.md +16 -12
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/adapter.d.ts +0 -5
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/adapter.js +2 -3
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/contract.d.ts +2 -2
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/reader.d.ts +3 -0
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/reader.js +27 -15
- package/node_modules/{@herbertgao/resume-from/dist/adapters/codex → resume-from/dist/adapters/claude-code}/redaction.js +16 -3
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/writer.d.ts +2 -4
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/writer.js +1 -1
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/contract.d.ts +2 -4
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/index.js +1 -2
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/read.d.ts +16 -0
- package/node_modules/resume-from/dist/adapters/codex/read.js +723 -0
- package/node_modules/{@herbertgao/resume-from/dist/adapters/pi → resume-from/dist/adapters/codex}/redaction.js +16 -3
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/rollout.d.ts +44 -4
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/rollout.js +88 -4
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/write.d.ts +2 -2
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/write.js +2 -2
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/contract.d.ts +5 -1
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/adapter.js +10 -6
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/contract.d.ts +2 -2
- package/node_modules/{@herbertgao/resume-from/dist/adapters/claude-code → resume-from/dist/adapters/pi}/redaction.js +16 -3
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/serialize.d.ts +2 -4
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/serialize.js +2 -2
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/render.d.ts +1 -1
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/render.js +4 -4
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/runner.js +2 -2
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/contract.d.ts +2 -2
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/command.js +31 -8
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/wiring.d.ts +1 -1
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/wiring.js +1 -2
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/confirmation.d.ts +4 -1
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/confirmation.js +2 -2
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/contract.d.ts +8 -6
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/contract.d.ts +10 -5
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/finder.d.ts +2 -1
- package/node_modules/resume-from/dist/import/discovery/finder.js +269 -0
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/contract.d.ts +3 -3
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/lander.js +3 -3
- package/node_modules/resume-from/dist/import/pipeline.d.ts +28 -0
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/pipeline.js +31 -11
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/builder.d.ts +2 -2
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/builder.js +9 -5
- package/node_modules/resume-from/dist/import/preview/warnings.d.ts +14 -0
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/warnings.js +26 -20
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/wiring.js +12 -2
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/contract.d.ts +9 -3
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/git.d.ts +4 -4
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/git.js +7 -4
- package/node_modules/resume-from/dist/platform/repo/reader.d.ts +3 -0
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/reader.js +60 -20
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/session/contract.d.ts +8 -1
- package/node_modules/{@herbertgao/resume-from → resume-from}/package.json +19 -32
- package/node_modules/{@herbertgao/resume-from → resume-from}/shims/pi/extensions/resume-from.js +2 -2
- package/package.json +18 -22
- 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/@herbertgao/resume-from/dist/adapters/codex/read.js +0 -270
- package/node_modules/@herbertgao/resume-from/dist/import/discovery/finder.js +0 -129
- package/node_modules/@herbertgao/resume-from/dist/import/pipeline.d.ts +0 -17
- package/node_modules/@herbertgao/resume-from/dist/import/preview/warnings.d.ts +0 -11
- package/node_modules/@herbertgao/resume-from/dist/platform/repo/reader.d.ts +0 -8
- 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
- /package/node_modules/{@herbertgao/resume-from → resume-from}/LICENSE +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/entries.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/entries.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/layout.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/layout.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/readback.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/readback.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/redaction.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/validation.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/validation.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/readback.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/readback.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/redaction.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/validation.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/validation.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/adapter.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/format.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/format.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/parse.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/parse.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/redaction.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/validate.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/validate.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/bin.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/bin.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/contract.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/agents.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/agents.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/args.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/args.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/contract.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/presentation.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/presentation.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/runner.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/entry.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/entry.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/command.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/contract.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/picker.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/picker.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/presentation.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/presentation.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/register.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/register.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/ui.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/ui.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/profile.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/profile.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/registry.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/registry.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/errors.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/errors.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/homes.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/homes.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/ordering.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/ordering.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/errors.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/errors.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/errors.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/errors.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/handover.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/handover.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/lander.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/marker.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/marker.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/contract.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/format.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/format.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/contract.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/rules.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/rules.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/wiring.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/contract.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/defaults.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/defaults.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/errors.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/errors.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/loader.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/loader.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/paths.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/paths.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/validate.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/validate.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/contract.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/file-committer.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/file-committer.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/contract.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/estimator.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/estimator.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/session/contract.js +0 -0
|
@@ -4,8 +4,10 @@ import {
|
|
|
4
4
|
SkillInvocationMessageComponent,
|
|
5
5
|
} from "@earendil-works/pi-coding-agent";
|
|
6
6
|
import { Markdown, Spacer, Text } from "@earendil-works/pi-tui";
|
|
7
|
-
import {
|
|
7
|
+
import { MESSAGE_DISPLAY_PATCH, patchRegistry } from "../../utils/patch-keys.ts";
|
|
8
|
+
import { config } from "../../config/config.ts";
|
|
8
9
|
import { showMoreHintText } from "./show-more-hint.ts";
|
|
10
|
+
import { walkComponentTree } from "../../utils/component-tree.ts";
|
|
9
11
|
|
|
10
12
|
/**
|
|
11
13
|
* 接管三个消息组件(`<skill>` 块、压缩摘要、分支摘要),ccstyle on 时渲染为
|
|
@@ -16,11 +18,6 @@ import { showMoreHintText } from "./show-more-hint.ts";
|
|
|
16
18
|
* ToolExecutionComponent,无法复用其原型 patch,这里单独统一管理。
|
|
17
19
|
*/
|
|
18
20
|
|
|
19
|
-
const MESSAGE_DISPLAY_PATCH = Symbol.for("pi.ccstyle.message-display-patch");
|
|
20
|
-
const MESSAGE_DISPLAY_ORIGINAL_BG = Symbol.for("pi.ccstyle.message-display-original-bg");
|
|
21
|
-
const MESSAGE_DISPLAY_ORIGINAL_PADDING = Symbol.for("pi.ccstyle.message-display-original-padding");
|
|
22
|
-
const MESSAGE_DISPLAY_ORIGINAL_SAVED = Symbol.for("pi.ccstyle.message-display-original-saved");
|
|
23
|
-
|
|
24
21
|
// 与 renderer/index.ts renderCall 的成功勾一致:亮绿 ✓(truecolor ANSI)。
|
|
25
22
|
const BRIGHT_GREEN = "\x1b[38;2;80;220;100m";
|
|
26
23
|
const ANSI_FG_RESET = "\x1b[39m";
|
|
@@ -67,45 +64,29 @@ function ensureHintHover(component: any): void {
|
|
|
67
64
|
};
|
|
68
65
|
}
|
|
69
66
|
|
|
70
|
-
function
|
|
71
|
-
if (component[MESSAGE_DISPLAY_ORIGINAL_SAVED]) return;
|
|
72
|
-
component[MESSAGE_DISPLAY_ORIGINAL_BG] = component.bgFn;
|
|
73
|
-
component[MESSAGE_DISPLAY_ORIGINAL_PADDING] = [component.paddingX, component.paddingY];
|
|
74
|
-
component[MESSAGE_DISPLAY_ORIGINAL_SAVED] = true;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
function restoreMessageDisplay(component: any): void {
|
|
78
|
-
if (!component[MESSAGE_DISPLAY_ORIGINAL_SAVED]) return;
|
|
79
|
-
const [paddingX, paddingY] = component[MESSAGE_DISPLAY_ORIGINAL_PADDING];
|
|
80
|
-
component.paddingX = paddingX;
|
|
81
|
-
component.paddingY = paddingY;
|
|
82
|
-
component.setBgFn?.(component[MESSAGE_DISPLAY_ORIGINAL_BG]);
|
|
83
|
-
delete component[MESSAGE_DISPLAY_ORIGINAL_BG];
|
|
84
|
-
delete component[MESSAGE_DISPLAY_ORIGINAL_PADDING];
|
|
85
|
-
delete component[MESSAGE_DISPLAY_ORIGINAL_SAVED];
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function renderCcstyle(component: any, kind: DisplayKind): boolean {
|
|
67
|
+
function renderCcstyle(component: any, kind: DisplayKind): void {
|
|
89
68
|
const theme = displayTheme;
|
|
90
|
-
if (!theme) return
|
|
91
|
-
rememberMessageDisplay(component);
|
|
69
|
+
if (!theme) return; // 主题未就绪时保留原生渲染
|
|
92
70
|
if (component.bgFn) component.setBgFn?.(undefined); // 与工具调用一致,去掉灰底
|
|
93
|
-
component.paddingY
|
|
71
|
+
if (component.paddingY !== 0) {
|
|
72
|
+
component._ccstyleOriginalPaddingY = component.paddingY;
|
|
73
|
+
component.paddingY = 0; // 工具组件 paddingY=0;原生 Box 默认 1,会上下各留一个空行
|
|
74
|
+
}
|
|
94
75
|
component.clear();
|
|
95
76
|
ensureHintHover(component);
|
|
96
77
|
const icon = `${BRIGHT_GREEN}✓${ANSI_FG_RESET}`; // 已完成消息,等同工具成功态
|
|
97
78
|
const title = theme.fg("toolTitle", kind.title(component));
|
|
98
79
|
if (!component.expanded) {
|
|
99
80
|
const hovered = component.hintHovered === true;
|
|
100
|
-
const hint = `${theme.fg("dim", "
|
|
81
|
+
const hint = `${theme.fg("dim", " · ")}${theme.fg(hovered ? "text" : "dim", showMoreHintText())}`;
|
|
101
82
|
component.addChild(new Text(`${icon} ${title}${hint}`, 0, 0));
|
|
102
|
-
return
|
|
83
|
+
return;
|
|
103
84
|
}
|
|
104
|
-
// 展开卡与 tool
|
|
85
|
+
// 展开卡与 tool 一致:同一个展开卡背景 + 上下左右 1 格
|
|
105
86
|
component.paddingX = 1;
|
|
106
87
|
component.paddingY = 1;
|
|
107
88
|
if (typeof theme.bg === "function" && typeof component.setBgFn === "function") {
|
|
108
|
-
component.setBgFn((text: string) => theme.bg(
|
|
89
|
+
component.setBgFn((text: string) => theme.bg(config.expandedCardBackground, text));
|
|
109
90
|
}
|
|
110
91
|
component.addChild(new Text(`${icon} ${title}`, 0, 0));
|
|
111
92
|
component.addChild(new Spacer(1));
|
|
@@ -114,7 +95,6 @@ function renderCcstyle(component: any, kind: DisplayKind): boolean {
|
|
|
114
95
|
color: (text: string) => theme.fg("customMessageText", text),
|
|
115
96
|
}),
|
|
116
97
|
);
|
|
117
|
-
return true;
|
|
118
98
|
}
|
|
119
99
|
|
|
120
100
|
type PatchEntry = {
|
|
@@ -125,45 +105,30 @@ type PatchEntry = {
|
|
|
125
105
|
|
|
126
106
|
/** patch 三个消息组件的 updateDisplay,返回统一 dispose(/reload 链安全)。 */
|
|
127
107
|
export function installMessageDisplayRendering(): () => void {
|
|
128
|
-
const
|
|
129
|
-
const previous = host[MESSAGE_DISPLAY_PATCH];
|
|
108
|
+
const previous = patchRegistry.get<{ dispose: () => void }>(MESSAGE_DISPLAY_PATCH);
|
|
130
109
|
if (previous) previous.dispose();
|
|
131
|
-
const patch: {
|
|
132
|
-
active: boolean;
|
|
133
|
-
entries: PatchEntry[];
|
|
134
|
-
components: Set<WeakRef<any>>;
|
|
135
|
-
tracked: WeakSet<object>;
|
|
136
|
-
dispose: () => void;
|
|
137
|
-
} = {
|
|
110
|
+
const patch: { active: boolean; entries: PatchEntry[]; dispose: () => void } = {
|
|
138
111
|
active: true,
|
|
139
112
|
entries: [],
|
|
140
|
-
components: new Set(),
|
|
141
|
-
tracked: new WeakSet(),
|
|
142
113
|
dispose: () => {},
|
|
143
114
|
};
|
|
144
|
-
const track = (component: Record<PropertyKey, unknown>): void => {
|
|
145
|
-
for (const ref of patch.components) {
|
|
146
|
-
if (!ref.deref()) patch.components.delete(ref);
|
|
147
|
-
}
|
|
148
|
-
if (patch.tracked.has(component)) return;
|
|
149
|
-
patch.tracked.add(component);
|
|
150
|
-
patch.components.add(new WeakRef(component));
|
|
151
|
-
};
|
|
152
115
|
const installOne = (ComponentClass: any, kind: DisplayKind): void => {
|
|
153
116
|
const prototype = ComponentClass.prototype;
|
|
154
117
|
const original = prototype.updateDisplay;
|
|
155
118
|
const installed = function (this: any) {
|
|
156
119
|
if (patch.active && config.mode !== "off") {
|
|
157
120
|
try {
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
121
|
+
renderCcstyle(this, kind);
|
|
122
|
+
return;
|
|
162
123
|
} catch {
|
|
163
124
|
// 渲染失败回退原生
|
|
164
125
|
}
|
|
165
126
|
}
|
|
166
|
-
|
|
127
|
+
// 回退原生前恢复 paddingY,避免原生渲染丢失上下内边距
|
|
128
|
+
if (this._ccstyleOriginalPaddingY !== undefined) {
|
|
129
|
+
this.paddingY = this._ccstyleOriginalPaddingY;
|
|
130
|
+
delete this._ccstyleOriginalPaddingY;
|
|
131
|
+
}
|
|
167
132
|
original.call(this);
|
|
168
133
|
};
|
|
169
134
|
prototype.updateDisplay = installed;
|
|
@@ -179,20 +144,9 @@ export function installMessageDisplayRendering(): () => void {
|
|
|
179
144
|
entry.prototype.updateDisplay = entry.original;
|
|
180
145
|
}
|
|
181
146
|
}
|
|
182
|
-
|
|
183
|
-
const component = ref.deref();
|
|
184
|
-
if (!component) continue;
|
|
185
|
-
try {
|
|
186
|
-
restoreMessageDisplay(component);
|
|
187
|
-
component.updateDisplay();
|
|
188
|
-
} catch {
|
|
189
|
-
// 单个陈旧组件不应阻断其余原型与组件恢复
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
patch.components.clear();
|
|
193
|
-
if (host[MESSAGE_DISPLAY_PATCH] === patch) delete host[MESSAGE_DISPLAY_PATCH];
|
|
147
|
+
patchRegistry.dispose(MESSAGE_DISPLAY_PATCH, patch);
|
|
194
148
|
};
|
|
195
|
-
|
|
149
|
+
patchRegistry.install(MESSAGE_DISPLAY_PATCH, patch);
|
|
196
150
|
return patch.dispose;
|
|
197
151
|
}
|
|
198
152
|
|
|
@@ -210,30 +164,10 @@ export function isMessageDisplayComponent(value: any): boolean {
|
|
|
210
164
|
|
|
211
165
|
/** 遍历当前 transcript,让已挂载的消息组件按当前 mode 重渲染(/ccstyle on|off 切换)。 */
|
|
212
166
|
export function refreshMessageDisplays(root: any): void {
|
|
213
|
-
|
|
214
|
-
const visit = (value: any): void => {
|
|
215
|
-
if (!value || typeof value !== "object" || seen.has(value)) return;
|
|
216
|
-
seen.add(value);
|
|
217
|
-
if (Array.isArray(value)) {
|
|
218
|
-
for (const child of value) visit(child);
|
|
219
|
-
return;
|
|
220
|
-
}
|
|
167
|
+
walkComponentTree(root, (value: any) => {
|
|
221
168
|
if (isMessageDisplayComponent(value)) {
|
|
222
169
|
value.invalidate?.();
|
|
223
|
-
return;
|
|
170
|
+
return false;
|
|
224
171
|
}
|
|
225
|
-
|
|
226
|
-
if (Array.isArray(children)) {
|
|
227
|
-
for (const child of children) visit(child);
|
|
228
|
-
}
|
|
229
|
-
try {
|
|
230
|
-
const mounted = value.getMountedRoots?.();
|
|
231
|
-
if (Array.isArray(mounted)) {
|
|
232
|
-
for (const root of mounted) visit(root);
|
|
233
|
-
}
|
|
234
|
-
} catch {
|
|
235
|
-
// 惰性 Proxy 可能暂时没有 mounted roots
|
|
236
|
-
}
|
|
237
|
-
};
|
|
238
|
-
visit(root);
|
|
172
|
+
});
|
|
239
173
|
}
|
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
import { posix, win32 } from "node:path";
|
|
2
|
+
import type { ThemeColor } from "@earendil-works/pi-coding-agent";
|
|
3
|
+
import { visibleWidth } from "@earendil-works/pi-tui";
|
|
4
|
+
import { config } from "../../config/config.ts";
|
|
5
|
+
import { oneLine } from "../../utils/format.ts";
|
|
6
|
+
import { headTruncateToWidth } from "./result.ts";
|
|
7
|
+
|
|
8
|
+
/** inputClip=0 时不设字符上限,交给渲染时的实际宽度截断。 */
|
|
9
|
+
function clipLimit(): number {
|
|
10
|
+
return config.inputClip > 0 ? config.inputClip : Number.POSITIVE_INFINITY;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function clip(value: unknown): string {
|
|
14
|
+
return oneLine(value, clipLimit());
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** 载荷(入参 JSON / 脚本代码)至少留出这么多宽度才显示,否则整段省略(避免只剩一个孤零零的 " {…")。 */
|
|
18
|
+
const MIN_PAYLOAD_WIDTH = 10;
|
|
19
|
+
|
|
20
|
+
/** 品牌大小写固定写法;humanize 推导不出来的工具名写在这里。 */
|
|
21
|
+
const TOOL_LABEL_OVERRIDES: Readonly<Record<string, string>> = {
|
|
22
|
+
powershell: "PowerShell",
|
|
23
|
+
// MCP 入口两个没有具体工具名,跟普通工具一样人性化;缩写固定大写
|
|
24
|
+
mcp: "MCP",
|
|
25
|
+
mcpscript: "MCP Script",
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* 工具名/标签人性化:与 default-mode 的 humanizeToolLabel、grouping 的 humanizeToolName
|
|
30
|
+
* 逐字相同,收敛为一个共享实现。
|
|
31
|
+
*/
|
|
32
|
+
export function humanizeToolLabel(label: string): string {
|
|
33
|
+
const brand = TOOL_LABEL_OVERRIDES[label.toLowerCase()];
|
|
34
|
+
if (brand) return brand;
|
|
35
|
+
return label
|
|
36
|
+
.replace(/([a-z0-9])([A-Z])/g, "$1 $2")
|
|
37
|
+
.replace(/[_-]+/g, " ")
|
|
38
|
+
.replace(/\b\w/g, (char) => char.toUpperCase());
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const AGENT_FAMILY_TOOL_NAMES = new Set([
|
|
42
|
+
"Agent",
|
|
43
|
+
"Agents",
|
|
44
|
+
"get_subagent_result",
|
|
45
|
+
"steer_subagent",
|
|
46
|
+
]);
|
|
47
|
+
|
|
48
|
+
/** default-mode(单工具卡)与 grouping(分组卡)在 agent/bash/grep/find/read/fallback 文案上不同。 */
|
|
49
|
+
export type ToolCallSummaryVariant = "default" | "grouping";
|
|
50
|
+
|
|
51
|
+
export type ToolCallSummaryOptions = {
|
|
52
|
+
/** 已解析标题;缺省为 humanizeToolLabel(toolName)。 */
|
|
53
|
+
title?: string;
|
|
54
|
+
/** 文案变体;缺省 "default"。 */
|
|
55
|
+
variant?: ToolCallSummaryVariant;
|
|
56
|
+
/** 工具执行目录;仅用于生成展示路径,不修改调用参数。 */
|
|
57
|
+
cwd?: string;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
export type ToolCallSummary = {
|
|
61
|
+
main: string;
|
|
62
|
+
detail: string;
|
|
63
|
+
/** 路径摘要保留结构,供最终渲染按实际宽度优先保留文件名。 */
|
|
64
|
+
path?: { prefix: string; value: string };
|
|
65
|
+
/** 标题之外的原始载荷(完整入参 JSON、脚本代码…),已压成单行,渲染时用 dim 接在标题后。 */
|
|
66
|
+
payload?: string;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
function pathApi(value: string) {
|
|
70
|
+
if (posix.isAbsolute(value)) return posix;
|
|
71
|
+
if (win32.isAbsolute(value)) return win32;
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** cwd 内绝对路径转相对路径;cwd 外路径保持不变。 */
|
|
76
|
+
export function displayPath(value: unknown, cwd?: string): string {
|
|
77
|
+
const text = oneLine(value, 4096);
|
|
78
|
+
const base = cwd ? oneLine(cwd, 4096) : "";
|
|
79
|
+
const api = pathApi(text);
|
|
80
|
+
if (!api || !base || !api.isAbsolute(base)) return text;
|
|
81
|
+
const relative = api.relative(base, text);
|
|
82
|
+
if (!relative) return api.basename(text) || ".";
|
|
83
|
+
if (relative === ".." || relative.startsWith(`..${api.sep}`) || api.isAbsolute(relative)) {
|
|
84
|
+
return text;
|
|
85
|
+
}
|
|
86
|
+
return relative;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function headToWidth(text: string, width: number, ellipsis = ""): string {
|
|
90
|
+
if (visibleWidth(text) <= width) return text;
|
|
91
|
+
if (width <= 0) return "";
|
|
92
|
+
const suffix = visibleWidth(ellipsis) <= width ? ellipsis : "";
|
|
93
|
+
const contentWidth = width - visibleWidth(suffix);
|
|
94
|
+
let head = "";
|
|
95
|
+
for (const char of Array.from(text)) {
|
|
96
|
+
if (visibleWidth(head + char) > contentWidth) break;
|
|
97
|
+
head += char;
|
|
98
|
+
}
|
|
99
|
+
return head + suffix;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function tailToWidth(text: string, width: number): string {
|
|
103
|
+
if (width <= 0) return "";
|
|
104
|
+
let tail = "";
|
|
105
|
+
for (const char of Array.from(text).reverse()) {
|
|
106
|
+
if (visibleWidth(char + tail) > width) break;
|
|
107
|
+
tail = char + tail;
|
|
108
|
+
}
|
|
109
|
+
return tail;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** 中间截断路径:目录保留开头,末尾优先完整保留文件名。 */
|
|
113
|
+
export function truncatePathToWidth(path: string, width: number): string {
|
|
114
|
+
if (visibleWidth(path) <= width) return path;
|
|
115
|
+
if (width <= 1) return width === 1 ? "…" : "";
|
|
116
|
+
const separatorIndex = Math.max(path.lastIndexOf("/"), path.lastIndexOf("\\"));
|
|
117
|
+
const filename = separatorIndex >= 0 ? path.slice(separatorIndex + 1) : path;
|
|
118
|
+
const filenameWidth = visibleWidth(filename);
|
|
119
|
+
if (separatorIndex >= 0 && filenameWidth + 1 <= width) {
|
|
120
|
+
const separator = path[separatorIndex]!;
|
|
121
|
+
const suffix = `${separator}${filename}`;
|
|
122
|
+
const prefixWidth = width - visibleWidth(suffix) - 1;
|
|
123
|
+
const prefix = headToWidth(path.slice(0, separatorIndex), Math.max(0, prefixWidth));
|
|
124
|
+
return `${prefix}…${prefix ? suffix : filename}`;
|
|
125
|
+
}
|
|
126
|
+
const leftWidth = Math.max(1, Math.floor((width - 1) * 0.45));
|
|
127
|
+
const rightWidth = Math.max(0, width - leftWidth - 1);
|
|
128
|
+
return `${headToWidth(filename, leftWidth)}…${tailToWidth(filename, rightWidth)}`;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** 路径展示的统一入口:相对化后按配置和当前可用宽度截断。 */
|
|
132
|
+
export function formatDisplayPath(value: unknown, cwd: string | undefined, width: number): string {
|
|
133
|
+
return truncatePathToWidth(displayPath(value, cwd), Math.min(width, clipLimit()));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** 按最终终端宽度渲染摘要;路径摘要不会再被整行头部截断。 */
|
|
137
|
+
export function fitToolCallSummary(summary: ToolCallSummary, width: number): string {
|
|
138
|
+
if (!summary.path) return headToWidth(summary.main, width, "…");
|
|
139
|
+
const prefix = summary.path.prefix;
|
|
140
|
+
const pathWidth = Math.max(0, width - visibleWidth(prefix) - 1);
|
|
141
|
+
if (pathWidth <= 0) return headToWidth(prefix, width, "…");
|
|
142
|
+
return `${prefix} ${truncatePathToWidth(summary.path.value, Math.min(pathWidth, clipLimit()))}`;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function pathSummary(
|
|
146
|
+
prefix: string,
|
|
147
|
+
value: unknown,
|
|
148
|
+
cwd: string | undefined,
|
|
149
|
+
detail = "",
|
|
150
|
+
): ToolCallSummary {
|
|
151
|
+
const path = displayPath(value, cwd);
|
|
152
|
+
return {
|
|
153
|
+
main: `${prefix} ${truncatePathToWidth(path, clipLimit())}`,
|
|
154
|
+
detail,
|
|
155
|
+
path: { prefix, value: path },
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** 入参是 shell 命令的工具。 */
|
|
160
|
+
const SHELL_TOOL_NAMES = new Set(["bash", "powershell", "pwsh", "sh", "zsh", "cmd"]);
|
|
161
|
+
|
|
162
|
+
/** 内置检索工具:pattern 缺失(无效调用)时保留 "…" 占位。 */
|
|
163
|
+
const SEARCH_TOOL_NAMES = new Set(["grep", "find"]);
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* 通用摘要字段优先级:default 与 grouping 共用同一份取值链。
|
|
167
|
+
* 两处曾各自维护,grouping 因此漏掉 command(powershell)和数组型入参;
|
|
168
|
+
* 路径不在链上,由 pathSummary 兜底,以便按 cwd 相对化并中间截断。
|
|
169
|
+
*/
|
|
170
|
+
const GENERIC_SUMMARY_FIELDS = [
|
|
171
|
+
"agent_id",
|
|
172
|
+
"command",
|
|
173
|
+
"query",
|
|
174
|
+
"queries",
|
|
175
|
+
"claim",
|
|
176
|
+
"question",
|
|
177
|
+
"questions",
|
|
178
|
+
"url",
|
|
179
|
+
"urls",
|
|
180
|
+
"responseId",
|
|
181
|
+
"findText",
|
|
182
|
+
"name",
|
|
183
|
+
"tool_use_id",
|
|
184
|
+
"toolCallId",
|
|
185
|
+
"id",
|
|
186
|
+
"subject",
|
|
187
|
+
"taskId",
|
|
188
|
+
"task_id",
|
|
189
|
+
"message",
|
|
190
|
+
"description",
|
|
191
|
+
"prompt",
|
|
192
|
+
] as const;
|
|
193
|
+
|
|
194
|
+
/** 通用字段链取值:字符串直接用;数组取首个可展示项并标注剩余条数。 */
|
|
195
|
+
type SummaryValue = { text: string; more: number };
|
|
196
|
+
|
|
197
|
+
function arrayItemText(item: unknown): string | undefined {
|
|
198
|
+
if (typeof item === "string" && item) return item;
|
|
199
|
+
if (!item || typeof item !== "object") return undefined;
|
|
200
|
+
for (const key of ["query", "url", "question", "header", "name"] as const) {
|
|
201
|
+
const text = (item as Record<string, unknown>)[key];
|
|
202
|
+
if (typeof text === "string" && text) return text;
|
|
203
|
+
}
|
|
204
|
+
return undefined;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
function summaryFieldValue(value: unknown): SummaryValue | undefined {
|
|
208
|
+
if (typeof value === "string" && value) return { text: value, more: 0 };
|
|
209
|
+
if (!Array.isArray(value)) return undefined;
|
|
210
|
+
let first: string | undefined;
|
|
211
|
+
let count = 0;
|
|
212
|
+
for (const item of value) {
|
|
213
|
+
const text = arrayItemText(item);
|
|
214
|
+
if (!text) continue;
|
|
215
|
+
count += 1;
|
|
216
|
+
first ??= text;
|
|
217
|
+
}
|
|
218
|
+
return first === undefined ? undefined : { text: first, more: count - 1 };
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/** 通用字段链取值;无可用字段时返回 undefined,交给调用方继续降级。 */
|
|
222
|
+
function genericSummary(title: string, args: any): ToolCallSummary | undefined {
|
|
223
|
+
for (const key of GENERIC_SUMMARY_FIELDS) {
|
|
224
|
+
const found = summaryFieldValue(args[key]);
|
|
225
|
+
if (!found) continue;
|
|
226
|
+
// (+N) 追加在截断之后,避免首个元素过长时把条数挤没
|
|
227
|
+
const more = found.more > 0 ? ` (+${found.more})` : "";
|
|
228
|
+
return { main: `${title} ${clip(found.text)}${more}`, detail: "" };
|
|
229
|
+
}
|
|
230
|
+
return undefined;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* 单工具调用摘要({ main, detail })。
|
|
235
|
+
*
|
|
236
|
+
* 两个变体共用同一份取值链,只有 read/agent/skill/task 等具名分支存在必要差异。
|
|
237
|
+
*/
|
|
238
|
+
export function toolCallSummary(
|
|
239
|
+
toolName: string,
|
|
240
|
+
args: any,
|
|
241
|
+
opts: ToolCallSummaryOptions = {},
|
|
242
|
+
): ToolCallSummary {
|
|
243
|
+
const title = opts.title ?? humanizeToolLabel(toolName);
|
|
244
|
+
const variant = opts.variant ?? "default";
|
|
245
|
+
if (!args || typeof args !== "object") return { main: title, detail: "" };
|
|
246
|
+
const name = toolName.toLowerCase();
|
|
247
|
+
|
|
248
|
+
// MCP 入口沿用 mcp-adapter 自己的标题风格(adapter 的 formatMcpProxyToolCallLines):
|
|
249
|
+
// `MCP <动作> <目标>` / `MCP Script <代码>`,比把整包参数摊成 JSON 好读
|
|
250
|
+
if (name === "mcp") {
|
|
251
|
+
const gateway = mcpGatewaySummary(title, args);
|
|
252
|
+
if (gateway) return gateway;
|
|
253
|
+
}
|
|
254
|
+
if (name === "mcpscript") {
|
|
255
|
+
const code = typeof args.code === "string" && args.code ? clip(args.code) : "";
|
|
256
|
+
return code ? { main: title, detail: "", payload: code } : { main: title, detail: "" };
|
|
257
|
+
}
|
|
258
|
+
// 内置 codemode:标题只报工具名。脚本很长,塞进行首既挤又读不出重点;
|
|
259
|
+
// 要看代码展开 Input,要看跑了什么看子调用行。
|
|
260
|
+
if (name === "codemode") return { main: title, detail: "" };
|
|
261
|
+
|
|
262
|
+
const value = (fallback: string, ...keys: string[]) => {
|
|
263
|
+
const found = keys.map((key) => args[key]).find((item) => typeof item === "string" && item);
|
|
264
|
+
return `${title} ${clip(found || fallback)}`;
|
|
265
|
+
};
|
|
266
|
+
|
|
267
|
+
if (variant === "default" && AGENT_FAMILY_TOOL_NAMES.has(toolName) && args.agent_id) {
|
|
268
|
+
return { main: `${title} ${clip(args.agent_id)}`, detail: "" };
|
|
269
|
+
}
|
|
270
|
+
if (variant === "grouping" && (name === "agent" || name === "agents")) {
|
|
271
|
+
const displayName = args.subagent_type ?? args.agent_type ?? args.agent;
|
|
272
|
+
if (typeof displayName === "string" && displayName) {
|
|
273
|
+
return { main: `${title} ${displayName}`, detail: "" };
|
|
274
|
+
}
|
|
275
|
+
return {
|
|
276
|
+
main: value(name === "agent" ? "launch agent" : "launch agents", "description", "prompt"),
|
|
277
|
+
detail: "",
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
if (variant === "grouping" && (name === "get_subagent_result" || name === "steer_subagent")) {
|
|
281
|
+
return {
|
|
282
|
+
main: value(name === "get_subagent_result" ? "agent result" : "steer agent", "agent_id"),
|
|
283
|
+
detail: "",
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
if (variant === "default" && name === "agents") {
|
|
287
|
+
return { main: value("launch agents", "description", "prompt"), detail: "" };
|
|
288
|
+
}
|
|
289
|
+
if (name === "skill") return { main: value("run skill", "name"), detail: "" };
|
|
290
|
+
if (name === "enterplanmode" || name === "enter_plan_mode") {
|
|
291
|
+
return { main: `${title} enable read-only planning`, detail: "" };
|
|
292
|
+
}
|
|
293
|
+
if (name === "exitplanmode" || name === "exit_plan_mode") {
|
|
294
|
+
return { main: `${title} present plan`, detail: "" };
|
|
295
|
+
}
|
|
296
|
+
if (name === "taskcreate") return { main: value("create task", "subject"), detail: "" };
|
|
297
|
+
if (name === "tasklist") return { main: `${title} task list`, detail: "" };
|
|
298
|
+
if (name === "taskget" || name === "taskupdate") {
|
|
299
|
+
return { main: value("task", "taskId", "task_id"), detail: "" };
|
|
300
|
+
}
|
|
301
|
+
if (name === "taskoutput" || name === "taskstop") {
|
|
302
|
+
return { main: value("background task", "task_id", "taskId"), detail: "" };
|
|
303
|
+
}
|
|
304
|
+
if (name === "taskexecute") {
|
|
305
|
+
const ids = Array.isArray(args.task_ids)
|
|
306
|
+
? args.task_ids
|
|
307
|
+
: Array.isArray(args.taskIds)
|
|
308
|
+
? args.taskIds
|
|
309
|
+
: [];
|
|
310
|
+
const summary = ids.length
|
|
311
|
+
? `${ids[0]}${ids.length > 1 ? ` (+${ids.length - 1} tasks)` : ""}`
|
|
312
|
+
: "start tasks";
|
|
313
|
+
return { main: `${title} ${summary}`, detail: "" };
|
|
314
|
+
}
|
|
315
|
+
if (toolName === "read") {
|
|
316
|
+
const details = [
|
|
317
|
+
args.offset !== undefined ? `offset=${args.offset}` : "",
|
|
318
|
+
args.limit !== undefined ? `limit=${args.limit}` : "",
|
|
319
|
+
].filter(Boolean);
|
|
320
|
+
const detail = details.length ? ` (${details.join(", ")})` : "";
|
|
321
|
+
if (typeof args.path === "string" && args.path) {
|
|
322
|
+
return pathSummary(variant === "grouping" ? "Read" : title, args.path, opts.cwd, detail);
|
|
323
|
+
}
|
|
324
|
+
return {
|
|
325
|
+
main: variant === "grouping" ? "Read ..." : title,
|
|
326
|
+
detail,
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
if (variant === "grouping" && SHELL_TOOL_NAMES.has(name)) {
|
|
330
|
+
// 分组行缺 command 时保留占位,避免与单工具卡一样只剩标题
|
|
331
|
+
return { main: value("...", "command"), detail: "" };
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// 检索类:pattern 是正文,path 只是范围;两个变体同格式
|
|
335
|
+
if (typeof args.pattern === "string" || SEARCH_TOOL_NAMES.has(name)) {
|
|
336
|
+
const pattern = clip(args.pattern || "...");
|
|
337
|
+
const scope = typeof args.path === "string" && args.path ? ` in ${clip(args.path)}` : "";
|
|
338
|
+
return { main: `${title} ${JSON.stringify(pattern)}${scope}`, detail: "" };
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
const generic = genericSummary(title, args);
|
|
342
|
+
if (generic) return generic;
|
|
343
|
+
|
|
344
|
+
const preferredPath = args.path ?? args.file_path;
|
|
345
|
+
if (typeof preferredPath === "string" && preferredPath) {
|
|
346
|
+
return pathSummary(title, preferredPath, opts.cwd);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// 字段链认不出的参数(命名空间代理的 tool+args、第三方工具的自定义键…)展开完整入参 JSON,
|
|
350
|
+
// 而不是只剩一个标题;网关与脚本的专属形状在上面处理
|
|
351
|
+
const payload = jsonArgs(args);
|
|
352
|
+
return payload ? { main: title, detail: "", payload } : { main: title, detail: "" };
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* MCP 网关注解 `mcp <动作> <目标>`:动作与目标照搬 mcp-adapter 的 formatMcpProxyToolCallLines,
|
|
357
|
+
* 人眼读起来比参数 JSON 快;`instructions` 是 adapter 自己漏掉的一档(它那里会落到 mcp status)。
|
|
358
|
+
* 认不出的入参返回 undefined,交给通用 JSON 回退,不猜成 status。
|
|
359
|
+
*/
|
|
360
|
+
function mcpGatewaySummary(title: string, args: any): ToolCallSummary | undefined {
|
|
361
|
+
const text = (value: unknown) => (typeof value === "string" && value ? value : "");
|
|
362
|
+
const tool = text(args.tool);
|
|
363
|
+
const connect = text(args.connect);
|
|
364
|
+
const describe = text(args.describe);
|
|
365
|
+
const instructions = text(args.instructions);
|
|
366
|
+
const search = text(args.search);
|
|
367
|
+
const server = text(args.server);
|
|
368
|
+
const action = text(args.action);
|
|
369
|
+
const scoped = (target: string) => (server ? `${target} @ ${server}` : target);
|
|
370
|
+
|
|
371
|
+
if (action === "ui-messages") return { main: `${title} ${action}`, detail: "" };
|
|
372
|
+
if (tool) {
|
|
373
|
+
const main = `${title} call ${scoped(tool)}`;
|
|
374
|
+
const payload = innerArgsPayload(args.args);
|
|
375
|
+
return payload ? { main, detail: "", payload } : { main, detail: "" };
|
|
376
|
+
}
|
|
377
|
+
if (connect) return { main: `${title} connect ${connect}`, detail: "" };
|
|
378
|
+
if (describe) return { main: `${title} describe ${scoped(describe)}`, detail: "" };
|
|
379
|
+
if (instructions) return { main: `${title} instructions ${instructions}`, detail: "" };
|
|
380
|
+
if (search) {
|
|
381
|
+
const flags = [
|
|
382
|
+
args.regex === true ? "regex" : "",
|
|
383
|
+
args.includeSchemas === false ? "schemas hidden" : "",
|
|
384
|
+
].filter(Boolean);
|
|
385
|
+
return {
|
|
386
|
+
main: `${title} search ${scoped(search)}`,
|
|
387
|
+
detail: flags.length ? ` (${flags.join(", ")})` : "",
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
if (server) return { main: `${title} list ${server}`, detail: "" };
|
|
391
|
+
if (action) return { main: `${title} ${action}`, detail: "" };
|
|
392
|
+
if (Object.keys(args).length === 0) return { main: `${title} status`, detail: "" };
|
|
393
|
+
return undefined;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/** 网关 call 的内层工具入参:对象转单行 JSON;网关允许传 JSON 字符串,就原样取用不再转义。 */
|
|
397
|
+
function innerArgsPayload(value: unknown): string {
|
|
398
|
+
if (typeof value === "string") return value ? clip(value) : "";
|
|
399
|
+
if (!value || typeof value !== "object") return "";
|
|
400
|
+
return jsonArgs(value);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/** 入参序列化成单行 JSON;空对象或不可序列化时返回 ""。 */
|
|
404
|
+
function jsonArgs(args: any): string {
|
|
405
|
+
try {
|
|
406
|
+
const json = JSON.stringify(args);
|
|
407
|
+
return json && json !== "{}" ? clip(json) : "";
|
|
408
|
+
} catch {
|
|
409
|
+
return "";
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/**
|
|
414
|
+
* 标题行内容:标题用调用方的 toolTitle 色,原始载荷(入参 JSON / 脚本代码)单独用 dim。
|
|
415
|
+
* 标题优先占宽(它是身份),剩下的宽度给载荷;载荷超宽时尾部省略,连
|
|
416
|
+
* MIN_PAYLOAD_WIDTH 都放不下时整段省略。
|
|
417
|
+
*/
|
|
418
|
+
export function renderToolSummary(
|
|
419
|
+
summary: ToolCallSummary,
|
|
420
|
+
width: number,
|
|
421
|
+
fg: (color: ThemeColor, text: string) => string,
|
|
422
|
+
): string {
|
|
423
|
+
const title = fitToolCallSummary(summary, width);
|
|
424
|
+
if (!summary.payload) return fg("toolTitle", title);
|
|
425
|
+
const room = width - visibleWidth(title);
|
|
426
|
+
return room >= MIN_PAYLOAD_WIDTH
|
|
427
|
+
? `${fg("toolTitle", title)}${fg("dim", headTruncateToWidth(` ${summary.payload}`, room))}`
|
|
428
|
+
: fg("toolTitle", title);
|
|
429
|
+
}
|