@herbertgao/pi-extensions 2026.8.2 → 2026.8.3
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 +9 -2
- package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +6 -8
- package/node_modules/@herbertgao/pi-cc-extensions/README.md +5 -7
- package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/hero.en.svg +101 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +1 -17
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +5 -3
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/{utils/agent-summary.ts → feature/agent-summary/core.ts} +37 -35
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{agent-summary.ts → agent-summary/index.ts} +2 -6
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{session-reference.ts → reference/index.ts} +1 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{agent-autocomplete.ts → reference/subagent.ts} +19 -9
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{pi-startup-header.ts → shell/startup-header.ts} +1 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{working-message.ts → shell/working-message.ts} +5 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/index.ts +32 -28
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +379 -85
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +727 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/index.ts +65 -775
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/{feature → renderer}/markdown-enhance.ts +35 -31
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{mouse-hover.ts → mouse/hover.ts} +5 -5
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{mouse-interaction.ts → mouse/interaction.ts} +34 -35
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{mouse-layout.ts → mouse/layout.ts} +5 -21
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{mouse-packets.ts → mouse/packets.ts} +1 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{mouse-scroll.ts → mouse/scroll.ts} +48 -37
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/ansi-utils.ts +56 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/diff-renderer.ts +2 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/line-width-safety.ts +1 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/write-display-utils.ts +12 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/write-execution.ts +1 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-grouping.ts → tool/grouping.ts} +18 -8
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-result.ts → tool/result.ts} +4 -13
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/fullscreen-detect.ts +0 -27
- package/node_modules/@herbertgao/pi-cc-extensions/package.json +3 -3
- package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +6 -0
- package/node_modules/@herbertgao/pi-subagents/package.json +2 -2
- package/node_modules/@herbertgao/pi-subagents/src/agent-manager.ts +1 -0
- package/node_modules/@herbertgao/pi-subagents/src/agent-runner.ts +3 -1
- package/node_modules/@herbertgao/pi-subagents/src/index.ts +33 -35
- package/node_modules/@herbertgao/pi-subagents/src/nested-tools.ts +26 -35
- package/node_modules/@herbertgao/pi-subagents/src/prompts.ts +15 -1
- package/node_modules/pi-mcp-adapter/CHANGELOG.md +19 -0
- package/node_modules/pi-mcp-adapter/README.md +19 -4
- package/node_modules/pi-mcp-adapter/agent-dir.ts +40 -0
- package/node_modules/pi-mcp-adapter/commands.ts +12 -2
- package/node_modules/pi-mcp-adapter/direct-tools.ts +6 -8
- package/node_modules/pi-mcp-adapter/index.ts +15 -3
- package/node_modules/pi-mcp-adapter/mcp-auth-flow.ts +87 -4
- package/node_modules/pi-mcp-adapter/mcp-callback-server.ts +138 -61
- package/node_modules/pi-mcp-adapter/mcp-oauth-provider.ts +43 -4
- package/node_modules/pi-mcp-adapter/oauth.ts +48 -0
- package/node_modules/pi-mcp-adapter/package.json +8 -2
- package/node_modules/pi-mcp-adapter/proxy-modes.ts +8 -10
- package/node_modules/pi-mcp-adapter/tool-registrar.ts +187 -3
- package/node_modules/pi-mcp-adapter/types.ts +2 -0
- package/node_modules/pi-web-access/CHANGELOG.md +45 -0
- package/node_modules/pi-web-access/README.md +104 -29
- package/node_modules/pi-web-access/bocha.ts +221 -0
- package/node_modules/pi-web-access/curator-page.ts +113 -12
- package/node_modules/pi-web-access/curator-server.ts +56 -20
- package/node_modules/pi-web-access/datalab-pdf-extract.ts +568 -0
- package/node_modules/pi-web-access/duckduckgo.ts +123 -0
- package/node_modules/pi-web-access/extract.ts +288 -143
- package/node_modules/pi-web-access/feature-config.ts +29 -0
- package/node_modules/pi-web-access/gemini-api.ts +4 -0
- package/node_modules/pi-web-access/gemini-search.ts +45 -12
- package/node_modules/pi-web-access/gemini-web.ts +68 -3
- package/node_modules/pi-web-access/index.ts +160 -71
- package/node_modules/pi-web-access/jina-search.ts +284 -0
- package/node_modules/pi-web-access/kagi.ts +12 -12
- package/node_modules/pi-web-access/openai-search.ts +12 -2
- package/node_modules/pi-web-access/package.json +4 -3
- package/node_modules/pi-web-access/pdf-extract.ts +327 -228
- package/node_modules/pi-web-access/storage.ts +440 -2
- package/node_modules/pi-web-access/summary-model-scope.ts +1 -1
- package/node_modules/pi-web-access/summary-review.ts +4 -2
- package/node_modules/pi-web-access/video-extract.ts +10 -8
- package/node_modules/pi-web-access/xai-search.ts +12 -2
- package/node_modules/pi-web-access/youtube-extract.ts +2 -1
- package/node_modules/remote-pi/LICENSE +21 -0
- package/node_modules/remote-pi/README.md +675 -0
- package/node_modules/remote-pi/dist/actions/handlers.d.ts +122 -0
- package/node_modules/remote-pi/dist/actions/handlers.js +160 -0
- package/node_modules/remote-pi/dist/actions/handlers.js.map +1 -0
- package/node_modules/remote-pi/dist/actions/registry.d.ts +39 -0
- package/node_modules/remote-pi/dist/actions/registry.js +58 -0
- package/node_modules/remote-pi/dist/actions/registry.js.map +1 -0
- package/node_modules/remote-pi/dist/bin/supervisord.d.ts +2 -0
- package/node_modules/remote-pi/dist/bin/supervisord.js +86 -0
- package/node_modules/remote-pi/dist/bin/supervisord.js.map +1 -0
- package/node_modules/remote-pi/dist/commands/builtin_mirror.d.ts +58 -0
- package/node_modules/remote-pi/dist/commands/builtin_mirror.js +71 -0
- package/node_modules/remote-pi/dist/commands/builtin_mirror.js.map +1 -0
- package/node_modules/remote-pi/dist/commands/list_commands.d.ts +60 -0
- package/node_modules/remote-pi/dist/commands/list_commands.js +73 -0
- package/node_modules/remote-pi/dist/commands/list_commands.js.map +1 -0
- package/node_modules/remote-pi/dist/config.d.ts +62 -0
- package/node_modules/remote-pi/dist/config.js +115 -0
- package/node_modules/remote-pi/dist/config.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/client.d.ts +20 -0
- package/node_modules/remote-pi/dist/daemon/client.js +131 -0
- package/node_modules/remote-pi/dist/daemon/client.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/control_protocol.d.ts +176 -0
- package/node_modules/remote-pi/dist/daemon/control_protocol.js +63 -0
- package/node_modules/remote-pi/dist/daemon/control_protocol.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/cron_log.d.ts +45 -0
- package/node_modules/remote-pi/dist/daemon/cron_log.js +72 -0
- package/node_modules/remote-pi/dist/daemon/cron_log.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/cron_registry.d.ts +80 -0
- package/node_modules/remote-pi/dist/daemon/cron_registry.js +194 -0
- package/node_modules/remote-pi/dist/daemon/cron_registry.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/id.d.ts +24 -0
- package/node_modules/remote-pi/dist/daemon/id.js +36 -0
- package/node_modules/remote-pi/dist/daemon/id.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/install.d.ts +170 -0
- package/node_modules/remote-pi/dist/daemon/install.js +547 -0
- package/node_modules/remote-pi/dist/daemon/install.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/registry.d.ts +63 -0
- package/node_modules/remote-pi/dist/daemon/registry.js +153 -0
- package/node_modules/remote-pi/dist/daemon/registry.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/rpc_child.d.ts +194 -0
- package/node_modules/remote-pi/dist/daemon/rpc_child.js +389 -0
- package/node_modules/remote-pi/dist/daemon/rpc_child.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/supervisor.d.ts +93 -0
- package/node_modules/remote-pi/dist/daemon/supervisor.js +596 -0
- package/node_modules/remote-pi/dist/daemon/supervisor.js.map +1 -0
- package/node_modules/remote-pi/dist/extension_ui_bridge.d.ts +26 -0
- package/node_modules/remote-pi/dist/extension_ui_bridge.js +341 -0
- package/node_modules/remote-pi/dist/extension_ui_bridge.js.map +1 -0
- package/node_modules/remote-pi/dist/index.d.ts +213 -0
- package/node_modules/remote-pi/dist/index.js +4996 -0
- package/node_modules/remote-pi/dist/index.js.map +1 -0
- package/node_modules/remote-pi/dist/mcp/mesh_result.d.ts +10 -0
- package/node_modules/remote-pi/dist/mcp/mesh_result.js +42 -0
- package/node_modules/remote-pi/dist/mcp/mesh_result.js.map +1 -0
- package/node_modules/remote-pi/dist/mcp/mesh_server.d.ts +16 -0
- package/node_modules/remote-pi/dist/mcp/mesh_server.js +327 -0
- package/node_modules/remote-pi/dist/mcp/mesh_server.js.map +1 -0
- package/node_modules/remote-pi/dist/mesh/canonical.d.ts +30 -0
- package/node_modules/remote-pi/dist/mesh/canonical.js +61 -0
- package/node_modules/remote-pi/dist/mesh/canonical.js.map +1 -0
- package/node_modules/remote-pi/dist/mesh/client.d.ts +18 -0
- package/node_modules/remote-pi/dist/mesh/client.js +125 -0
- package/node_modules/remote-pi/dist/mesh/client.js.map +1 -0
- package/node_modules/remote-pi/dist/mesh/encoding.d.ts +38 -0
- package/node_modules/remote-pi/dist/mesh/encoding.js +216 -0
- package/node_modules/remote-pi/dist/mesh/encoding.js.map +1 -0
- package/node_modules/remote-pi/dist/mesh/self_revoke.d.ts +73 -0
- package/node_modules/remote-pi/dist/mesh/self_revoke.js +401 -0
- package/node_modules/remote-pi/dist/mesh/self_revoke.js.map +1 -0
- package/node_modules/remote-pi/dist/mesh/siblings.d.ts +49 -0
- package/node_modules/remote-pi/dist/mesh/siblings.js +159 -0
- package/node_modules/remote-pi/dist/mesh/siblings.js.map +1 -0
- package/node_modules/remote-pi/dist/mesh/types.d.ts +34 -0
- package/node_modules/remote-pi/dist/mesh/types.js +11 -0
- package/node_modules/remote-pi/dist/mesh/types.js.map +1 -0
- package/node_modules/remote-pi/dist/mesh/verify.d.ts +17 -0
- package/node_modules/remote-pi/dist/mesh/verify.js +86 -0
- package/node_modules/remote-pi/dist/mesh/verify.js.map +1 -0
- package/node_modules/remote-pi/dist/pairing/crypto.d.ts +8 -0
- package/node_modules/remote-pi/dist/pairing/crypto.js +22 -0
- package/node_modules/remote-pi/dist/pairing/crypto.js.map +1 -0
- package/node_modules/remote-pi/dist/pairing/handshake.d.ts +28 -0
- package/node_modules/remote-pi/dist/pairing/handshake.js +113 -0
- package/node_modules/remote-pi/dist/pairing/handshake.js.map +1 -0
- package/node_modules/remote-pi/dist/pairing/noise-sha256.d.ts +16 -0
- package/node_modules/remote-pi/dist/pairing/noise-sha256.js +103 -0
- package/node_modules/remote-pi/dist/pairing/noise-sha256.js.map +1 -0
- package/node_modules/remote-pi/dist/pairing/qr.d.ts +59 -0
- package/node_modules/remote-pi/dist/pairing/qr.js +125 -0
- package/node_modules/remote-pi/dist/pairing/qr.js.map +1 -0
- package/node_modules/remote-pi/dist/pairing/storage.d.ts +120 -0
- package/node_modules/remote-pi/dist/pairing/storage.js +604 -0
- package/node_modules/remote-pi/dist/pairing/storage.js.map +1 -0
- package/node_modules/remote-pi/dist/protocol/codec.d.ts +7 -0
- package/node_modules/remote-pi/dist/protocol/codec.js +49 -0
- package/node_modules/remote-pi/dist/protocol/codec.js.map +1 -0
- package/node_modules/remote-pi/dist/protocol/types.d.ts +393 -0
- package/node_modules/remote-pi/dist/protocol/types.js +2 -0
- package/node_modules/remote-pi/dist/protocol/types.js.map +1 -0
- package/node_modules/remote-pi/dist/rooms.d.ts +29 -0
- package/node_modules/remote-pi/dist/rooms.js +57 -0
- package/node_modules/remote-pi/dist/rooms.js.map +1 -0
- package/node_modules/remote-pi/dist/session/address.d.ts +49 -0
- package/node_modules/remote-pi/dist/session/address.js +58 -0
- package/node_modules/remote-pi/dist/session/address.js.map +1 -0
- package/node_modules/remote-pi/dist/session/agent_bridge.d.ts +55 -0
- package/node_modules/remote-pi/dist/session/agent_bridge.js +146 -0
- package/node_modules/remote-pi/dist/session/agent_bridge.js.map +1 -0
- package/node_modules/remote-pi/dist/session/bridge.d.ts +37 -0
- package/node_modules/remote-pi/dist/session/bridge.js +130 -0
- package/node_modules/remote-pi/dist/session/bridge.js.map +1 -0
- package/node_modules/remote-pi/dist/session/broker.d.ts +189 -0
- package/node_modules/remote-pi/dist/session/broker.js +507 -0
- package/node_modules/remote-pi/dist/session/broker.js.map +1 -0
- package/node_modules/remote-pi/dist/session/broker_remote.d.ts +74 -0
- package/node_modules/remote-pi/dist/session/broker_remote.js +583 -0
- package/node_modules/remote-pi/dist/session/broker_remote.js.map +1 -0
- package/node_modules/remote-pi/dist/session/cwd_lock.d.ts +33 -0
- package/node_modules/remote-pi/dist/session/cwd_lock.js +126 -0
- package/node_modules/remote-pi/dist/session/cwd_lock.js.map +1 -0
- package/node_modules/remote-pi/dist/session/envelope.d.ts +33 -0
- package/node_modules/remote-pi/dist/session/envelope.js +117 -0
- package/node_modules/remote-pi/dist/session/envelope.js.map +1 -0
- package/node_modules/remote-pi/dist/session/global_config.d.ts +33 -0
- package/node_modules/remote-pi/dist/session/global_config.js +73 -0
- package/node_modules/remote-pi/dist/session/global_config.js.map +1 -0
- package/node_modules/remote-pi/dist/session/ipc.d.ts +27 -0
- package/node_modules/remote-pi/dist/session/ipc.js +22 -0
- package/node_modules/remote-pi/dist/session/ipc.js.map +1 -0
- package/node_modules/remote-pi/dist/session/leader_election.d.ts +32 -0
- package/node_modules/remote-pi/dist/session/leader_election.js +106 -0
- package/node_modules/remote-pi/dist/session/leader_election.js.map +1 -0
- package/node_modules/remote-pi/dist/session/local_config.d.ts +55 -0
- package/node_modules/remote-pi/dist/session/local_config.js +157 -0
- package/node_modules/remote-pi/dist/session/local_config.js.map +1 -0
- package/node_modules/remote-pi/dist/session/mesh_message.d.ts +20 -0
- package/node_modules/remote-pi/dist/session/mesh_message.js +28 -0
- package/node_modules/remote-pi/dist/session/mesh_message.js.map +1 -0
- package/node_modules/remote-pi/dist/session/mesh_node.d.ts +116 -0
- package/node_modules/remote-pi/dist/session/mesh_node.js +573 -0
- package/node_modules/remote-pi/dist/session/mesh_node.js.map +1 -0
- package/node_modules/remote-pi/dist/session/peer.d.ts +139 -0
- package/node_modules/remote-pi/dist/session/peer.js +451 -0
- package/node_modules/remote-pi/dist/session/peer.js.map +1 -0
- package/node_modules/remote-pi/dist/session/peer_inventory.d.ts +13 -0
- package/node_modules/remote-pi/dist/session/peer_inventory.js +48 -0
- package/node_modules/remote-pi/dist/session/peer_inventory.js.map +1 -0
- package/node_modules/remote-pi/dist/session/peer_limits.d.ts +9 -0
- package/node_modules/remote-pi/dist/session/peer_limits.js +21 -0
- package/node_modules/remote-pi/dist/session/peer_limits.js.map +1 -0
- package/node_modules/remote-pi/dist/session/setup_wizard.d.ts +39 -0
- package/node_modules/remote-pi/dist/session/setup_wizard.js +63 -0
- package/node_modules/remote-pi/dist/session/setup_wizard.js.map +1 -0
- package/node_modules/remote-pi/dist/session/tool_gate.d.ts +5 -0
- package/node_modules/remote-pi/dist/session/tool_gate.js +11 -0
- package/node_modules/remote-pi/dist/session/tool_gate.js.map +1 -0
- package/node_modules/remote-pi/dist/session/tools.d.ts +24 -0
- package/node_modules/remote-pi/dist/session/tools.js +252 -0
- package/node_modules/remote-pi/dist/session/tools.js.map +1 -0
- package/node_modules/remote-pi/dist/session/wizard.d.ts +13 -0
- package/node_modules/remote-pi/dist/session/wizard.js +20 -0
- package/node_modules/remote-pi/dist/session/wizard.js.map +1 -0
- package/node_modules/remote-pi/dist/settings.d.ts +15 -0
- package/node_modules/remote-pi/dist/settings.js +52 -0
- package/node_modules/remote-pi/dist/settings.js.map +1 -0
- package/node_modules/remote-pi/dist/transport/peer_channel.d.ts +37 -0
- package/node_modules/remote-pi/dist/transport/peer_channel.js +98 -0
- package/node_modules/remote-pi/dist/transport/peer_channel.js.map +1 -0
- package/node_modules/remote-pi/dist/transport/pi_forward_client.d.ts +29 -0
- package/node_modules/remote-pi/dist/transport/pi_forward_client.js +62 -0
- package/node_modules/remote-pi/dist/transport/pi_forward_client.js.map +1 -0
- package/node_modules/remote-pi/dist/transport/relay_client.d.ts +91 -0
- package/node_modules/remote-pi/dist/transport/relay_client.js +206 -0
- package/node_modules/remote-pi/dist/transport/relay_client.js.map +1 -0
- package/node_modules/remote-pi/dist/ui/footer.d.ts +32 -0
- package/node_modules/remote-pi/dist/ui/footer.js +34 -0
- package/node_modules/remote-pi/dist/ui/footer.js.map +1 -0
- package/node_modules/remote-pi/docs/daemon.md +289 -0
- package/node_modules/remote-pi/package.json +88 -0
- package/node_modules/remote-pi/service-templates/launchd.plist.template +35 -0
- package/node_modules/remote-pi/service-templates/systemd.service.template +19 -0
- package/node_modules/remote-pi/service-templates/task-launcher.vbs.template +10 -0
- package/node_modules/remote-pi/service-templates/task-scheduler.xml.template +38 -0
- package/node_modules/remote-pi/skills/agent-network/SKILL.md +310 -0
- package/package.json +19 -9
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool-diff/write-display-utils.ts +0 -29
- /package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{session-reference-core.ts → reference/session.ts} +0 -0
- /package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{pi-aliases.ts → shell/aliases.ts} +0 -0
- /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/ATTRIBUTION.md +0 -0
- /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/diff-presentation.ts +0 -0
- /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/index.ts +0 -0
- /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/render-utils.ts +0 -0
- /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/shiki-highlight.ts +0 -0
- /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/types.ts +0 -0
package/README.md
CHANGED
|
@@ -14,15 +14,22 @@ The package bundles 11 active `@herbertgao/*` child packages, including `@herber
|
|
|
14
14
|
- `@juicesharp/rpiv-ask-user-question@2.4.0`
|
|
15
15
|
- `@narumitw/pi-btw@0.50.0`
|
|
16
16
|
- `@pi-plugins/fast-mode@0.1.9`
|
|
17
|
-
- `pi-mcp-adapter@2.
|
|
17
|
+
- `pi-mcp-adapter@2.23.0`
|
|
18
18
|
- `pi-lens@3.8.74`
|
|
19
|
-
- `pi-web-access@0.
|
|
19
|
+
- `pi-web-access@0.22.0`
|
|
20
|
+
- `remote-pi@0.7.0`
|
|
20
21
|
- `@czottmann/pi-automode@1.11.0`
|
|
21
22
|
|
|
22
23
|
Pi loads their extensions and skills through `node_modules/` paths inside one package root. The upstream companions are pinned and bundled, not forked or renamed.
|
|
23
24
|
|
|
24
25
|
Pi 0.84.1 or newer should use native `fullscreen` TUI mode. The deprecated `@herbertgao/pi-fixed-editor` legacy package is intentionally not bundled.
|
|
25
26
|
|
|
27
|
+
### Remote Pi trust boundary
|
|
28
|
+
|
|
29
|
+
Configure `REMOTE_PI_RELAY` to a private relay, preferably reachable only through Tailscale or another private network, **before** first running `/remote-pi`. TLS/Tailscale protects traffic in transit but the relay process can read routed content; `remote-pi@0.7.0` is not end-to-end encrypted.
|
|
30
|
+
|
|
31
|
+
Known accepted `0.7.0` limitations: pairing URI/token data is persisted in Pi session data and may enter model context during its short validity window; local broker/supervisor IPC trusts processes running as the same OS user; cancelling first-time setup can retain its cwd lock until Pi exits. Do not use the public relay or run untrusted local processes if those boundaries are unacceptable.
|
|
32
|
+
|
|
26
33
|
See the [repository README](https://github.com/HerbertGao/pi-extensions#readme) for the complete package list and provenance.
|
|
27
34
|
|
|
28
35
|
## License
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="./assets/readme/hero.svg" width="100%" alt="pi-cc-extensions: a productivity extension suite for Pi">
|
|
2
|
+
<img src="./assets/readme/hero.en.svg" width="100%" alt="pi-cc-extensions: a productivity extension suite for Pi">
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
<p align="center">
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
</p>
|
|
11
11
|
|
|
12
12
|
<p align="center">
|
|
13
|
-
Claude Code-style output
|
|
13
|
+
Claude Code-style TUI output with some personal touches and handy utilities.
|
|
14
14
|
</p>
|
|
15
15
|
|
|
16
16
|
<p align="center">
|
|
@@ -37,11 +37,11 @@ Run `/reload` after installation.
|
|
|
37
37
|
|
|
38
38
|
| Feature | Description | Entry point |
|
|
39
39
|
| ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- |
|
|
40
|
-
| Claude Code
|
|
41
|
-
| Fullscreen
|
|
40
|
+
| Claude Code Output | Tool summaries, expand/collapse, rich edit/write diffs, and `on` / `compact` / `off` modes | `/ccstyle` |
|
|
41
|
+
| Fullscreen mode | Tool card/group click-to-toggle, previews, hover highlight, and a back-to-bottom button | `TUIMODE=fullscreen` or `--tui-mode fullscreen` |
|
|
42
42
|
| Settings panel | `Style / Diff / Thinking / Feature` tabs: startup header toggle and wheel step | `/ccstyle` |
|
|
43
43
|
| Context inspection | Usage breakdown and previews for the system prompt, tools, skills, and messages | `/context` |
|
|
44
|
-
| Session references | Search and inject effective context from previous Sessions or existing SubAgents |
|
|
44
|
+
| Session/Subagent references | Search and inject effective context from previous Sessions or existing SubAgents | `@` |
|
|
45
45
|
| Theme | Bundled CC Dark and CC Light themes | `/theme` |
|
|
46
46
|
|
|
47
47
|
## Configuration
|
|
@@ -74,8 +74,6 @@ bun run typecheck
|
|
|
74
74
|
./test.bat # or pi -e .
|
|
75
75
|
```
|
|
76
76
|
|
|
77
|
-
Run `/reload` after changing extensions.
|
|
78
|
-
|
|
79
77
|
## Compatibility
|
|
80
78
|
|
|
81
79
|
- Node.js `>=22.19.0`, Pi `^0.84.0` (loaded through `pi.extensions` and `pi.themes` in the root `package.json`)
|
|
@@ -96,4 +94,4 @@ Run `/reload` after changing extensions.
|
|
|
96
94
|
## Credits
|
|
97
95
|
|
|
98
96
|
- Derived from [`minuque/pi-cc-extensions`](https://github.com/minuque/pi-cc-extensions) under the MIT license.
|
|
99
|
-
- Rich diffs are adapted from [`MasuRii/pi-tool-display`](https://github.com/MasuRii/pi-tool-display) (MIT). See [`extensions/tool
|
|
97
|
+
- Rich diffs are adapted from [`MasuRii/pi-tool-display`](https://github.com/MasuRii/pi-tool-display) (MIT). See [`extensions/renderer/tool/diff/ATTRIBUTION.md`](./extensions/renderer/tool/diff/ATTRIBUTION.md).
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
</p>
|
|
11
11
|
|
|
12
12
|
<p align="center">
|
|
13
|
-
类 Claude Code TUI
|
|
13
|
+
类 Claude Code TUI 输出风格,并融入了一些个人喜好,和一些实用小功能。
|
|
14
14
|
</p>
|
|
15
15
|
|
|
16
16
|
<p align="center">
|
|
@@ -37,11 +37,11 @@ pi install npm:@herbertgao/pi-cc-extensions
|
|
|
37
37
|
|
|
38
38
|
| 功能 | 说明 | 入口 |
|
|
39
39
|
| ---------------------- | ---------------------------------------------------------------------------------------------------------- | ------------- |
|
|
40
|
-
| Claude Code
|
|
41
|
-
| Fullscreen
|
|
40
|
+
| Claude Code UI | 工具摘要、折叠展开、rich edit/write diff,以及 `on` / `compact` / `off` 三种模式 | `/ccstyle` |
|
|
41
|
+
| Fullscreen mode | 工具卡/group 点击展开与收起、预览、hover 高亮、回到底部按钮 | `TUIMODE=fullscreen` 或 `--tui-mode fullscreen` |
|
|
42
42
|
| 配置面板 | `Style / Diff / Thinking / Feature` 四页签,含启动头开关与滚轮步进 | `/ccstyle` |
|
|
43
43
|
| 上下文检查 | 查看上下文占用,并预览 System prompt、Tools、Skills 和消息内容 | `/context` |
|
|
44
|
-
| Session 引用 | 搜索并注入历史 Session 或现有 SubAgent 的有效上下文 |
|
|
44
|
+
| Session/Subagent 引用 | 搜索并注入历史 Session 或现有 SubAgent 的有效上下文 | `@` |
|
|
45
45
|
| 主题 | 随包提供内置 CC Dark、CC Light 主题 | `/theme` |
|
|
46
46
|
|
|
47
47
|
## 配置
|
|
@@ -74,8 +74,6 @@ bun run typecheck
|
|
|
74
74
|
./test.bat # or pi -e .
|
|
75
75
|
```
|
|
76
76
|
|
|
77
|
-
修改扩展后执行 `/reload`。
|
|
78
|
-
|
|
79
77
|
## 兼容性
|
|
80
78
|
|
|
81
79
|
- Node.js `>=22.19.0`,Pi `^0.84.0`(通过根目录 `package.json` 的 `pi.extensions` 和 `pi.themes` 加载)
|
|
@@ -96,4 +94,4 @@ bun run typecheck
|
|
|
96
94
|
## 致谢
|
|
97
95
|
|
|
98
96
|
- 基于 MIT 许可的 [`minuque/pi-cc-extensions`](https://github.com/minuque/pi-cc-extensions) 衍生维护。
|
|
99
|
-
- Rich diff 改编自 [`MasuRii/pi-tool-display`](https://github.com/MasuRii/pi-tool-display)(MIT);详见 [`extensions/tool
|
|
97
|
+
- Rich diff 改编自 [`MasuRii/pi-tool-display`](https://github.com/MasuRii/pi-tool-display)(MIT);详见 [`extensions/renderer/tool/diff/ATTRIBUTION.md`](./extensions/renderer/tool/diff/ATTRIBUTION.md)。
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="400" viewBox="0 0 1200 400" role="img" aria-labelledby="title desc">
|
|
2
|
+
<title id="title">pi-cc-extensions
|
|
3
|
+
</title>
|
|
4
|
+
<desc id="desc">The Claude and Pi brand marks together connect three extension capabilities: Claude Code-style output, context inspection, and historical Session references.
|
|
5
|
+
</desc>
|
|
6
|
+
<defs>
|
|
7
|
+
<linearGradient id="panel" x1="0" y1="0" x2="1" y2="1">
|
|
8
|
+
<stop offset="0" stop-color="#0D131B"/>
|
|
9
|
+
<stop offset="1" stop-color="#090D12"/>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
</defs>
|
|
12
|
+
<rect width="1200" height="400" rx="28" fill="url(#panel)"/>
|
|
13
|
+
<rect x="1" y="1" width="1198" height="398" rx="27" fill="none" stroke="#263241" stroke-width="2"/>
|
|
14
|
+
<g id="title-block" transform="translate(64 58)" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', sans-serif">
|
|
15
|
+
<g font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="16" font-weight="600" letter-spacing="1.4">
|
|
16
|
+
<text x="0" y="0" fill="#66E3C4">PI EXTENSION
|
|
17
|
+
</text>
|
|
18
|
+
</g>
|
|
19
|
+
<text x="0" y="82" fill="#F4F7FA" font-size="54" font-weight="750" letter-spacing="-1.5">pi-cc-extensions
|
|
20
|
+
</text>
|
|
21
|
+
<text x="0" y="130" fill="#B8C3CF" font-size="23">Make Pi work like Claude Code 🙃
|
|
22
|
+
</text>
|
|
23
|
+
<g transform="translate(0 180)" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="17">
|
|
24
|
+
<rect width="488" height="58" rx="12" fill="#111923" stroke="#2B3948"/>
|
|
25
|
+
<text x="20" y="36" fill="#66E3C4">›
|
|
26
|
+
</text>
|
|
27
|
+
<text x="44" y="36" fill="#F4F7FA">/ccstyle
|
|
28
|
+
</text>
|
|
29
|
+
<text x="155" y="36" fill="#536172">·
|
|
30
|
+
</text>
|
|
31
|
+
<text x="178" y="36" fill="#7CC7FF">/context
|
|
32
|
+
</text>
|
|
33
|
+
<text x="292" y="36" fill="#536172">·
|
|
34
|
+
</text>
|
|
35
|
+
<text x="315" y="36" fill="#F2C879">@session:
|
|
36
|
+
</text>
|
|
37
|
+
<rect x="411" y="22" width="9" height="20" rx="2" fill="#66E3C4"/>
|
|
38
|
+
</g>
|
|
39
|
+
<g transform="translate(0 282)" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="15">
|
|
40
|
+
<circle cx="6" cy="-5" r="6" fill="#66E3C4"/>
|
|
41
|
+
<text x="22" y="0" fill="#8B9AAD">3 EXTENSIONS
|
|
42
|
+
</text>
|
|
43
|
+
<text x="160" y="0" fill="#3B4857">•
|
|
44
|
+
</text>
|
|
45
|
+
<text x="183" y="0" fill="#8B9AAD">TYPESCRIPT
|
|
46
|
+
</text>
|
|
47
|
+
<text x="303" y="0" fill="#3B4857">•
|
|
48
|
+
</text>
|
|
49
|
+
<text x="326" y="0" fill="#8B9AAD">NODE ≥ 22.19
|
|
50
|
+
</text>
|
|
51
|
+
</g>
|
|
52
|
+
</g>
|
|
53
|
+
<g id="extension-map" transform="translate(662 48)" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', sans-serif">
|
|
54
|
+
<g id="claude-pi-mark" transform="translate(0 0)">
|
|
55
|
+
<!-- Official Claude starburst vector; source: Anthropic Claude brand mark. -->
|
|
56
|
+
<path transform="translate(2 2) scale(.34)" fill="#D97757" d="m19.6 66.5 19.7-11 .3-1-.3-.5h-1l-3.3-.2-11.2-.3L14 53l-9.5-.5-2.4-.5L0 49l.2-1.5 2-1.3 2.9.2 6.3.5 9.5.6 6.9.4L38 49.1h1.6l.2-.7-.5-.4-.4-.4L29 41l-10.6-7-5.6-4.1-3-2-1.5-2-.6-4.2 2.7-3 3.7.3.9.2 3.7 2.9 8 6.1L37 36l1.5 1.2.6-.4.1-.3-.7-1.1L33 25l-6-10.4-2.7-4.3-.7-2.6c-.3-1-.4-2-.4-3l3-4.2L28 0l4.2.6L33.8 2l2.6 6 4.1 9.3L47 29.9l2 3.8 1 3.4.3 1h.7v-.5l.5-7.2 1-8.7 1-11.2.3-3.2 1.6-3.8 3-2L61 2.6l2 2.9-.3 1.8-1.1 7.7L59 27.1l-1.5 8.2h.9l1-1.1 4.1-5.4 6.9-8.6 3-3.5L77 13l2.3-1.8h4.3l3.1 4.7-1.4 4.9-4.4 5.6-3.7 4.7-5.3 7.1-3.2 5.7.3.4h.7l12-2.6 6.4-1.1 7.6-1.3 3.5 1.6.4 1.6-1.4 3.4-8.2 2-9.6 2-14.3 3.3-.2.1.2.3 6.4.6 2.8.2h6.8l12.6 1 3.3 2 1.9 2.7-.3 2-5.1 2.6-6.8-1.6-16-3.8-5.4-1.3h-.8v.4l4.6 4.5 8.3 7.5L89 80.1l.5 2.4-1.3 2-1.4-.2-9.2-7-3.6-3-8-6.8h-.5v.7l1.8 2.7 9.8 14.7.5 4.5-.7 1.4-2.6 1-2.7-.6-5.8-8-6-9-4.7-8.2-.5.4-2.9 30.2-1.3 1.5-3 1.2-2.5-2-1.4-3 1.4-6.2 1.6-8 1.3-6.4 1.2-7.9.7-2.6v-.2H49L43 72l-9 12.3-7.2 7.6-1.7.7-3-1.5.3-2.8L24 86l10-12.8 6-7.9 4-4.6-.1-.5h-.3L17.2 77.4l-4.7.6-2-2 .2-3 1-1 8-5.5Z"/>
|
|
57
|
+
<path d="M50 3V35" stroke="#3A4857" stroke-width="2"/>
|
|
58
|
+
<!-- Official Pi logo vectors; source: https://pi.dev/logo-auto.svg -->
|
|
59
|
+
<g transform="translate(52 -5) scale(.06)" fill="#F4F7FA">
|
|
60
|
+
<path fill-rule="evenodd" d="M165.29 165.29H517.36V400H400V517.36H282.65V634.72H165.29ZM282.65 282.65V400H400V282.65Z"/>
|
|
61
|
+
<path d="M517.36 400H634.72V634.72H517.36Z"/>
|
|
62
|
+
</g>
|
|
63
|
+
<text x="104" y="15" fill="#F4F7FA" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="15" font-weight="700" letter-spacing=".8">CLAUDE CODE UX
|
|
64
|
+
</text>
|
|
65
|
+
<text x="104" y="34" fill="#7F8D9C" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="13" letter-spacing="1.2">FOR PI
|
|
66
|
+
</text>
|
|
67
|
+
</g>
|
|
68
|
+
<g transform="translate(0 52)">
|
|
69
|
+
<rect width="474" height="82" rx="14" fill="#101821" stroke="#2C3A48"/>
|
|
70
|
+
<rect width="5" height="82" rx="2.5" fill="#66E3C4"/>
|
|
71
|
+
<text x="26" y="32" fill="#F4F7FA" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="18" font-weight="700">/ccstyle
|
|
72
|
+
</text>
|
|
73
|
+
<text x="26" y="59" fill="#8B9AAD" font-size="16">Tool summaries · Diffs · Status bar
|
|
74
|
+
</text>
|
|
75
|
+
<circle cx="438" cy="29" r="9" fill="#66E3C4" opacity=".18"/>
|
|
76
|
+
<path d="M434 29l3 3 6-7" fill="none" stroke="#66E3C4" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
77
|
+
</g>
|
|
78
|
+
<g transform="translate(0 144)">
|
|
79
|
+
<rect width="474" height="82" rx="14" fill="#101821" stroke="#2C3A48"/>
|
|
80
|
+
<rect width="5" height="82" rx="2.5" fill="#7CC7FF"/>
|
|
81
|
+
<text x="26" y="32" fill="#F4F7FA" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="18" font-weight="700">/context
|
|
82
|
+
</text>
|
|
83
|
+
<text x="26" y="59" fill="#8B9AAD" font-size="16">Usage breakdown · Injected content preview
|
|
84
|
+
</text>
|
|
85
|
+
<g transform="translate(416 23)">
|
|
86
|
+
<rect width="42" height="14" rx="7" fill="#1C2B38"/>
|
|
87
|
+
<rect width="27" height="14" rx="7" fill="#7CC7FF"/>
|
|
88
|
+
</g>
|
|
89
|
+
</g>
|
|
90
|
+
<g transform="translate(0 236)">
|
|
91
|
+
<rect width="474" height="82" rx="14" fill="#101821" stroke="#2C3A48"/>
|
|
92
|
+
<rect width="5" height="82" rx="2.5" fill="#F2C879"/>
|
|
93
|
+
<text x="26" y="32" fill="#F4F7FA" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="18" font-weight="700">@session:
|
|
94
|
+
</text>
|
|
95
|
+
<text x="26" y="59" fill="#8B9AAD" font-size="16">History completion · Cross-session references
|
|
96
|
+
</text>
|
|
97
|
+
<text x="431" y="40" fill="#F2C879" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="26">@
|
|
98
|
+
</text>
|
|
99
|
+
</g>
|
|
100
|
+
</g>
|
|
101
|
+
</svg>
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
type DiffIndicatorMode,
|
|
5
5
|
type DiffViewMode,
|
|
6
6
|
type ToolDisplayConfig,
|
|
7
|
-
} from "../renderer/tool
|
|
7
|
+
} from "../renderer/tool/diff/index.ts";
|
|
8
8
|
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
9
9
|
import { homedir } from "node:os";
|
|
10
10
|
import { join } from "node:path";
|
|
@@ -86,22 +86,6 @@ export function pickPositiveNumber(value: unknown, fallback: number, min = 1): n
|
|
|
86
86
|
return Number.isFinite(n) ? Math.max(min, n) : fallback;
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
-
export function nearestPreset(value: number, presets: readonly string[]): string {
|
|
90
|
-
const numeric = presets.map((p) => Number(p));
|
|
91
|
-
let best = presets[0] ?? String(value);
|
|
92
|
-
let bestDist = Number.POSITIVE_INFINITY;
|
|
93
|
-
for (let i = 0; i < numeric.length; i++) {
|
|
94
|
-
const dist = Math.abs((numeric[i] ?? 0) - value);
|
|
95
|
-
if (dist < bestDist) {
|
|
96
|
-
bestDist = dist;
|
|
97
|
-
best = presets[i] ?? best;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
// Prefer exact match when value is already a preset.
|
|
101
|
-
const exact = presets.find((p) => Number(p) === value);
|
|
102
|
-
return exact ?? best;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
89
|
export function normalizeConfig(input: unknown): Config {
|
|
106
90
|
const source = (input && typeof input === "object" ? input : {}) as Record<string, unknown>;
|
|
107
91
|
const mode = source.mode;
|
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
import { getSettingsListTheme } from "@earendil-works/pi-coding-agent";
|
|
8
8
|
import { Input, SettingsList, matchesKey, truncateToWidth } from "@earendil-works/pi-tui";
|
|
9
9
|
import type { CompactThinkingController } from "../feature/compact-thinking.ts";
|
|
10
|
-
import { applyStartupHeader } from "../feature/
|
|
11
|
-
import type { ToolGroupingHooks } from "../renderer/tool
|
|
12
|
-
import type { DiffIndicatorMode, DiffViewMode } from "../renderer/tool
|
|
10
|
+
import { applyStartupHeader } from "../feature/shell/startup-header.ts";
|
|
11
|
+
import type { ToolGroupingHooks } from "../renderer/tool/grouping.ts";
|
|
12
|
+
import type { DiffIndicatorMode, DiffViewMode } from "../renderer/tool/diff/index.ts";
|
|
13
13
|
import {
|
|
14
14
|
config,
|
|
15
15
|
DEFAULT_CONFIG,
|
|
@@ -553,4 +553,6 @@ export async function showCcstylePanel(
|
|
|
553
553
|
},
|
|
554
554
|
};
|
|
555
555
|
});
|
|
556
|
+
// 面板卸下后主 transcript 重新挂载;再刷一次,吃掉打开期间扫树失败的切换。
|
|
557
|
+
hooks.refreshCurrentTranscript(ctx, toolGrouping);
|
|
556
558
|
}
|
|
@@ -1,26 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Agent 回合摘要:统计一次 agent 运行的工具使用并格式化成摘要文本。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* (MCP 风格 `server__read` 归入 other)。
|
|
4
|
+
* 分类:bash / read / edit / write / other(精确工具名;MCP 风格名归 other)。
|
|
5
|
+
* 计数:bash 按调用次数;read/edit/write 按非空 path/file_path 去重;other 按调用次数。
|
|
6
|
+
* 失败单独累计;另记回合耗时。
|
|
8
7
|
*
|
|
9
|
-
* 呈现:`summaryLine`
|
|
10
|
-
* 增强版——加粗统计词,box 模式包 `> [!TIP]` 提示框(由 markdown-enhance 渲染
|
|
11
|
-
* 成带图标的表格框),供当前 Markdown 渲染管线使用。
|
|
8
|
+
* 呈现:`summaryLine` 纯文本,`summaryMarkdown` Markdown(可 box 引用块)。
|
|
12
9
|
*/
|
|
13
10
|
|
|
14
11
|
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
15
12
|
|
|
16
|
-
/**
|
|
17
|
-
export type AgentToolCategory = "read" | "edit" | "
|
|
13
|
+
/** 工具分类。 */
|
|
14
|
+
export type AgentToolCategory = "bash" | "read" | "edit" | "write" | "other";
|
|
18
15
|
|
|
19
16
|
/** 一次 agent 回合的统计快照。 */
|
|
20
17
|
export type AgentSummaryData = {
|
|
18
|
+
commands: number;
|
|
21
19
|
reads: number;
|
|
22
20
|
edits: number;
|
|
23
|
-
|
|
21
|
+
writes: number;
|
|
24
22
|
others: number;
|
|
25
23
|
failed: number;
|
|
26
24
|
durationMs: number;
|
|
@@ -28,9 +26,10 @@ export type AgentSummaryData = {
|
|
|
28
26
|
|
|
29
27
|
export function classifyTool(toolName: string): AgentToolCategory {
|
|
30
28
|
const base = toolName.split(".").pop() ?? toolName;
|
|
31
|
-
if (base === "read") return "read";
|
|
32
|
-
if (base === "edit" || base === "write") return "edit";
|
|
33
29
|
if (base === "bash") return "bash";
|
|
30
|
+
if (base === "read") return "read";
|
|
31
|
+
if (base === "edit") return "edit";
|
|
32
|
+
if (base === "write") return "write";
|
|
34
33
|
return "other";
|
|
35
34
|
}
|
|
36
35
|
|
|
@@ -38,12 +37,18 @@ function nonEmptyString(value: unknown): value is string {
|
|
|
38
37
|
return typeof value === "string" && value.length > 0;
|
|
39
38
|
}
|
|
40
39
|
|
|
40
|
+
function toolPath(args?: Record<string, unknown> | null): string | undefined {
|
|
41
|
+
if (nonEmptyString(args?.path)) return args.path;
|
|
42
|
+
return nonEmptyString(args?.file_path) ? args.file_path : undefined;
|
|
43
|
+
}
|
|
44
|
+
|
|
41
45
|
/** 累积一次 agent 回合的工具统计;agent_start 时新建实例。 */
|
|
42
46
|
export class AgentRunSummary {
|
|
43
47
|
toolCount = 0;
|
|
48
|
+
commandCount = 0;
|
|
44
49
|
readFiles = new Set<string>();
|
|
45
50
|
editFiles = new Set<string>();
|
|
46
|
-
|
|
51
|
+
writeFiles = new Set<string>();
|
|
47
52
|
otherCount = 0;
|
|
48
53
|
failedCount = 0;
|
|
49
54
|
|
|
@@ -56,16 +61,19 @@ export class AgentRunSummary {
|
|
|
56
61
|
/** tool_execution_start 时调用。 */
|
|
57
62
|
recordToolStart(toolName: string, args?: Record<string, unknown> | null): void {
|
|
58
63
|
this.toolCount++;
|
|
59
|
-
const path = args
|
|
64
|
+
const path = toolPath(args);
|
|
60
65
|
switch (classifyTool(toolName)) {
|
|
66
|
+
case "bash":
|
|
67
|
+
this.commandCount++;
|
|
68
|
+
break;
|
|
61
69
|
case "read":
|
|
62
|
-
if (
|
|
70
|
+
if (path) this.readFiles.add(path);
|
|
63
71
|
break;
|
|
64
72
|
case "edit":
|
|
65
|
-
if (
|
|
73
|
+
if (path) this.editFiles.add(path);
|
|
66
74
|
break;
|
|
67
|
-
case "
|
|
68
|
-
this.
|
|
75
|
+
case "write":
|
|
76
|
+
if (path) this.writeFiles.add(path);
|
|
69
77
|
break;
|
|
70
78
|
default:
|
|
71
79
|
this.otherCount++;
|
|
@@ -79,9 +87,10 @@ export class AgentRunSummary {
|
|
|
79
87
|
|
|
80
88
|
snapshot(now = Date.now()): AgentSummaryData {
|
|
81
89
|
return {
|
|
90
|
+
commands: this.commandCount,
|
|
82
91
|
reads: this.readFiles.size,
|
|
83
92
|
edits: this.editFiles.size,
|
|
84
|
-
|
|
93
|
+
writes: this.writeFiles.size,
|
|
85
94
|
others: this.otherCount,
|
|
86
95
|
failed: this.failedCount,
|
|
87
96
|
durationMs: now - this.startedAt,
|
|
@@ -103,17 +112,19 @@ export function formatDuration(ms: number): string {
|
|
|
103
112
|
|
|
104
113
|
const plural = (count: number) => (count === 1 ? "" : "s");
|
|
105
114
|
|
|
115
|
+
/** 输出顺序:bash → read → edit → write → other → failed。 */
|
|
106
116
|
function summaryParts(data: AgentSummaryData): string[] {
|
|
107
117
|
const parts: string[] = [];
|
|
118
|
+
if (data.commands) parts.push(`ran ${data.commands} command${plural(data.commands)}`);
|
|
108
119
|
if (data.reads) parts.push(`read ${data.reads} file${plural(data.reads)}`);
|
|
109
120
|
if (data.edits) parts.push(`edited ${data.edits} file${plural(data.edits)}`);
|
|
121
|
+
if (data.writes) parts.push(`wrote ${data.writes} file${plural(data.writes)}`);
|
|
110
122
|
if (data.others) parts.push(`${data.others} other tool${plural(data.others)}`);
|
|
111
|
-
if (data.commands) parts.push(`ran ${data.commands} command${plural(data.commands)}`);
|
|
112
123
|
if (data.failed) parts.push(`${data.failed} failed`);
|
|
113
124
|
return parts;
|
|
114
125
|
}
|
|
115
126
|
|
|
116
|
-
/**
|
|
127
|
+
/** 纯文本摘要行:句首大写 + 可选耗时。 */
|
|
117
128
|
export function summaryLine(data: AgentSummaryData): string {
|
|
118
129
|
const parts = summaryParts(data);
|
|
119
130
|
if (parts.length === 0) return "";
|
|
@@ -125,13 +136,8 @@ export function summaryLine(data: AgentSummaryData): string {
|
|
|
125
136
|
|
|
126
137
|
/**
|
|
127
138
|
* Markdown 摘要行。
|
|
128
|
-
* `box` 为 true
|
|
129
|
-
*
|
|
130
|
-
* `box` 为 false:整体加粗单行。
|
|
131
|
-
* `colors`:成功/失败计数的 ANSI 前缀,取自主题(`theme.getFgAnsi("success")` /
|
|
132
|
-
* `theme.getFgAnsi("error")`),缺省不染色。仅数字染色:成功计数的数字染
|
|
133
|
-
* success 色、failed 计数的数字染 error 色,文本与时长不染色。颜色 span 以
|
|
134
|
-
* `\x1b[0m` 复位,引用块渲染器会在复位后重贴引用样式,后续文本不受影响。
|
|
139
|
+
* `box` 为 true:引用块 `> *斜体*`;false:整体加粗。
|
|
140
|
+
* `colors`:仅数字染色(success / failed)。
|
|
135
141
|
*/
|
|
136
142
|
export function summaryMarkdown(
|
|
137
143
|
data: AgentSummaryData,
|
|
@@ -140,12 +146,10 @@ export function summaryMarkdown(
|
|
|
140
146
|
): string {
|
|
141
147
|
const parts = summaryParts(data);
|
|
142
148
|
if (parts.length === 0) return "";
|
|
143
|
-
// 仅首段动词大写(与纯文本版“句首大写”一致)
|
|
144
149
|
const capitalizeFirst = (part: string, first: boolean) => {
|
|
145
150
|
const verb = part.match(/^[a-z]+/)?.[0] ?? "";
|
|
146
151
|
return first && verb ? verb[0].toUpperCase() + verb.slice(1) + part.slice(verb.length) : part;
|
|
147
152
|
};
|
|
148
|
-
// 仅染数字:`Read 2 files` → `Read <色>2</色> files`
|
|
149
153
|
const paintNumber = (code: string, part: string) =>
|
|
150
154
|
code ? part.replace(/(\d+)/, `${code}$1\x1b[0m`) : part;
|
|
151
155
|
const text = parts
|
|
@@ -159,11 +163,9 @@ export function summaryMarkdown(
|
|
|
159
163
|
|
|
160
164
|
/**
|
|
161
165
|
* 绑定 pi 事件到摘要统计:
|
|
162
|
-
* - agent_start
|
|
163
|
-
* - tool_execution_start /
|
|
164
|
-
* - agent_end
|
|
165
|
-
*
|
|
166
|
-
* 返回取消函数:清除当前统计引用(pi.on 不支持解绑,取消后不再产生回调)。
|
|
166
|
+
* - agent_start 重置
|
|
167
|
+
* - tool_execution_start / end 累计
|
|
168
|
+
* - agent_end 回调(toolCount < minToolCount 跳过)
|
|
167
169
|
*/
|
|
168
170
|
export function bindAgentSummary(
|
|
169
171
|
pi: ExtensionAPI,
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Agent 回合摘要展示:agent_end 时把本回合工具统计写入会话条目,
|
|
3
3
|
* 由 entry renderer 渲染为 markdown 引用块 `> [!TIP] *斜体内容*`。
|
|
4
4
|
*
|
|
5
|
-
* 统计复用
|
|
5
|
+
* 统计复用 ./core.ts(bash/read/edit/write/other)。
|
|
6
6
|
* appendEntry 不进 LLM 上下文,只显示在聊天区。
|
|
7
7
|
* 引用块文字色取主题 mdQuote(cc 主题下为 muted 灰),内容用 *斜体* 语法。
|
|
8
8
|
*/
|
|
@@ -10,11 +10,7 @@
|
|
|
10
10
|
import { Markdown } from "@earendil-works/pi-tui";
|
|
11
11
|
import { getMarkdownTheme } from "@earendil-works/pi-coding-agent";
|
|
12
12
|
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
13
|
-
import {
|
|
14
|
-
bindAgentSummary,
|
|
15
|
-
summaryMarkdown,
|
|
16
|
-
type AgentSummaryData,
|
|
17
|
-
} from "../utils/agent-summary.ts";
|
|
13
|
+
import { bindAgentSummary, summaryMarkdown, type AgentSummaryData } from "./core.ts";
|
|
18
14
|
|
|
19
15
|
export const AGENT_SUMMARY_ENTRY_TYPE = "agent-summary";
|
|
20
16
|
|
|
@@ -23,8 +23,8 @@ const MAX_SUGGESTIONS = 2;
|
|
|
23
23
|
const AGENT_NAME_PATTERN = /(?:^|[\t ])@((?:[^\s:@][^\s:]*)?)$/;
|
|
24
24
|
|
|
25
25
|
function getAgentDir(): string {
|
|
26
|
-
const
|
|
27
|
-
return join(
|
|
26
|
+
const root = process.env.PI_CODING_AGENT_DIR ?? join(homedir(), ".pi", "agent");
|
|
27
|
+
return join(root, "agents");
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
function parseFrontmatter(content: string): Record<string, string> {
|
|
@@ -41,23 +41,34 @@ function parseFrontmatter(content: string): Record<string, string> {
|
|
|
41
41
|
function loadAgents(): AgentInfo[] {
|
|
42
42
|
const dir = getAgentDir();
|
|
43
43
|
if (!existsSync(dir)) return [];
|
|
44
|
+
let files: string[];
|
|
45
|
+
try {
|
|
46
|
+
files = readdirSync(dir);
|
|
47
|
+
} catch {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
44
50
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
.
|
|
51
|
+
const agents: AgentInfo[] = [];
|
|
52
|
+
for (const file of files) {
|
|
53
|
+
if (!file.endsWith(".md")) continue;
|
|
54
|
+
try {
|
|
48
55
|
const filePath = join(dir, file);
|
|
49
56
|
const content = readFileSync(filePath, "utf-8");
|
|
50
57
|
const fm = parseFrontmatter(content);
|
|
51
58
|
const name = file.replace(/\.md$/, "");
|
|
52
|
-
|
|
59
|
+
agents.push({
|
|
53
60
|
name,
|
|
54
61
|
displayName: fm.display_name || name,
|
|
55
62
|
description: fm.description || "",
|
|
56
63
|
model: fm.model,
|
|
57
64
|
thinking: fm.thinking,
|
|
58
65
|
filePath,
|
|
59
|
-
};
|
|
60
|
-
}
|
|
66
|
+
});
|
|
67
|
+
} catch {
|
|
68
|
+
// One unreadable agent file must not break autocomplete or prompt submission.
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return agents;
|
|
61
72
|
}
|
|
62
73
|
|
|
63
74
|
export function createAgentAutocompleteProvider(
|
|
@@ -184,7 +195,6 @@ export default function agentAutocompleteExtension(pi: ExtensionAPI): void {
|
|
|
184
195
|
|
|
185
196
|
const agentMap = new Map(agents.map((a) => [a.name, a]));
|
|
186
197
|
const agentList = mentions.map((n) => `"${n}" (${agentMap.get(n)!.displayName})`).join(", ");
|
|
187
|
-
const agentTypes = mentions.map((n) => `"${n}"`).join(" | ");
|
|
188
198
|
|
|
189
199
|
return {
|
|
190
200
|
systemPrompt:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { VERSION, type AppKeybinding } from "@earendil-works/pi-coding-agent";
|
|
2
2
|
import { getKeybindings } from "@earendil-works/pi-tui";
|
|
3
3
|
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
4
|
-
import { config } from "
|
|
4
|
+
import { config } from "../../config/config.ts";
|
|
5
5
|
|
|
6
6
|
type Rgb = [number, number, number];
|
|
7
7
|
type StyledPart = {
|
|
@@ -87,7 +87,10 @@ export default function (pi: ExtensionAPI): void {
|
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
function buildWorkingMessage(): string {
|
|
90
|
-
|
|
90
|
+
if (!turnActive) return "";
|
|
91
|
+
const startedAt = agentStartTime || turnStartTime;
|
|
92
|
+
if (!startedAt) return "";
|
|
93
|
+
const elapsed = Date.now() - startedAt;
|
|
91
94
|
const tokens = tokenCount();
|
|
92
95
|
const parts: string[] = [];
|
|
93
96
|
if (tokens > 0) parts.push(`↓ ${formatCount(tokens)} tokens`);
|
|
@@ -185,7 +188,7 @@ export default function (pi: ExtensionAPI): void {
|
|
|
185
188
|
} else if (evt.type === "done") {
|
|
186
189
|
resetResponseTracking(evt.message);
|
|
187
190
|
} else if (evt.type === "error") {
|
|
188
|
-
resetResponseTracking(
|
|
191
|
+
resetResponseTracking();
|
|
189
192
|
} else {
|
|
190
193
|
updateProviderUsage(evt.partial);
|
|
191
194
|
}
|
|
@@ -1,43 +1,47 @@
|
|
|
1
1
|
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import
|
|
2
|
+
|
|
3
|
+
// shell
|
|
4
|
+
import piAliases from "./feature/shell/aliases.ts";
|
|
5
|
+
import piStartupHeader from "./feature/shell/startup-header.ts";
|
|
6
|
+
import workingMessage from "./feature/shell/working-message.ts";
|
|
7
|
+
|
|
8
|
+
// feature
|
|
9
|
+
import agentAutocomplete from "./feature/reference/subagent.ts";
|
|
10
|
+
import agentSummary from "./feature/agent-summary/index.ts";
|
|
11
|
+
import context from "./feature/context.ts";
|
|
12
|
+
import sessionReference from "./feature/reference/index.ts";
|
|
5
13
|
import {
|
|
6
14
|
installCompactThinking,
|
|
7
15
|
type CompactThinkingController,
|
|
8
16
|
} from "./feature/compact-thinking.ts";
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
import
|
|
12
|
-
import
|
|
13
|
-
import sessionReference from "./feature/session-reference.ts";
|
|
14
|
-
import workingMessage from "./feature/working-message.ts";
|
|
17
|
+
|
|
18
|
+
// renderer
|
|
19
|
+
import claudeCodeStyle, { getCompactThinkingConfig } from "./renderer/index.ts";
|
|
20
|
+
import markdownEnhance from "./renderer/markdown-enhance.ts";
|
|
15
21
|
|
|
16
22
|
export default function (pi: ExtensionAPI): void {
|
|
23
|
+
// shell chrome
|
|
17
24
|
piAliases(pi);
|
|
18
25
|
piStartupHeader(pi);
|
|
19
|
-
|
|
26
|
+
workingMessage(pi);
|
|
27
|
+
|
|
28
|
+
// Renderer 必须先注册 lifecycle handler,shutdown 时才能先解开外层 compact
|
|
29
|
+
// patch;bridge 让稍后安装的 thinking controller 仍可直接供 renderer query。
|
|
20
30
|
let compactThinking: CompactThinkingController | undefined;
|
|
21
|
-
const
|
|
22
|
-
updateConfig(next)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
return compactThinking?.isMessageThinkingActive?.(messageTimestamp) ?? false;
|
|
30
|
-
},
|
|
31
|
-
getThinkingAnimationFrame() {
|
|
32
|
-
return compactThinking?.getThinkingAnimationFrame?.() ?? 0;
|
|
33
|
-
},
|
|
34
|
-
setCompactSummaryActive(active) {
|
|
35
|
-
compactThinking?.setCompactSummaryActive?.(active);
|
|
36
|
-
},
|
|
31
|
+
const compactThinkingQuery: CompactThinkingController = {
|
|
32
|
+
updateConfig: (next) => compactThinking?.updateConfig(next),
|
|
33
|
+
getMessageThinkingDurationMs: (timestamp) =>
|
|
34
|
+
compactThinking?.getMessageThinkingDurationMs?.(timestamp),
|
|
35
|
+
isMessageThinkingActive: (timestamp) =>
|
|
36
|
+
compactThinking?.isMessageThinkingActive?.(timestamp) ?? false,
|
|
37
|
+
getThinkingAnimationFrame: () => compactThinking?.getThinkingAnimationFrame?.() ?? 0,
|
|
38
|
+
setCompactSummaryActive: (active) => compactThinking?.setCompactSummaryActive?.(active),
|
|
37
39
|
};
|
|
38
|
-
|
|
40
|
+
markdownEnhance(pi);
|
|
41
|
+
claudeCodeStyle(pi, undefined, compactThinkingQuery);
|
|
39
42
|
compactThinking = installCompactThinking(pi, getCompactThinkingConfig());
|
|
40
|
-
|
|
43
|
+
|
|
44
|
+
// features
|
|
41
45
|
context(pi);
|
|
42
46
|
sessionReference(pi);
|
|
43
47
|
agentAutocomplete(pi);
|