@herbertgao/pi-extensions 2026.8.5 → 2026.8.7
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 +5 -5
- package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +2 -2
- package/node_modules/@herbertgao/pi-cc-extensions/README.md +2 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +19 -7
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +30 -9
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +272 -22
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/context.ts +74 -5
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +94 -77
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/markdown-enhance.ts +48 -6
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/message-display.ts +1 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/hover.ts +14 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/interaction.ts +55 -17
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/layout.ts +41 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-renderer.ts +75 -6
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/types.ts +7 -3
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +64 -1
- package/node_modules/@herbertgao/pi-cc-extensions/package.json +3 -3
- package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +16 -0
- package/node_modules/@herbertgao/pi-subagents/README.md +30 -22
- package/node_modules/@herbertgao/pi-subagents/examples/agent-tool-description.md +5 -5
- package/node_modules/@herbertgao/pi-subagents/package.json +7 -7
- package/node_modules/@herbertgao/pi-subagents/src/agent-file-toggle.ts +7 -1
- package/node_modules/@herbertgao/pi-subagents/src/agent-manager.ts +48 -19
- package/node_modules/@herbertgao/pi-subagents/src/agent-runner.ts +22 -15
- package/node_modules/@herbertgao/pi-subagents/src/custom-agents.ts +26 -2
- package/node_modules/@herbertgao/pi-subagents/src/index.ts +219 -40
- package/node_modules/@herbertgao/pi-subagents/src/invocation-config.ts +101 -3
- package/node_modules/@herbertgao/pi-subagents/src/nested-tools.ts +18 -4
- package/node_modules/@herbertgao/pi-subagents/src/settings.ts +99 -0
- package/node_modules/@herbertgao/pi-subagents/src/types.ts +22 -3
- package/node_modules/@herbertgao/pi-subagents/src/ui/agent-widget.ts +51 -3
- package/node_modules/@herbertgao/pi-subagents/src/ui/conversation-viewer.ts +20 -2
- package/node_modules/@herbertgao/pi-subagents/src/ui/fleet-list.ts +34 -10
- package/node_modules/@herbertgao/pi-subagents/src/usage.ts +129 -1
- package/node_modules/@herbertgao/pi-subagents/src/worktree.ts +29 -5
- package/node_modules/@juicesharp/rpiv-ask-user-question/README.md +3 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/ask-user-question.ts +46 -10
- package/node_modules/@juicesharp/rpiv-ask-user-question/config.ts +25 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/configuration.md +13 -4
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/hosts.md +8 -1
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/localization.md +3 -1
- package/node_modules/@juicesharp/rpiv-ask-user-question/locales/en.json +2 -2
- package/node_modules/@juicesharp/rpiv-ask-user-question/locales/zh.json +2 -2
- package/node_modules/@juicesharp/rpiv-ask-user-question/package.json +3 -2
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/build-questionnaire.ts +10 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/key-router.ts +3 -1
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/questionnaire-session.ts +30 -7
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/state.ts +14 -6
- package/node_modules/@juicesharp/rpiv-ask-user-question/view/dialog-builder.ts +30 -4
- package/node_modules/@juicesharp/rpiv-ask-user-question/view/tab-content-strategy.ts +26 -5
- package/node_modules/@narumitw/pi-btw/README.md +119 -103
- package/node_modules/@narumitw/pi-btw/dist/index.ts +2898 -0
- package/node_modules/@narumitw/pi-btw/dist/index.ts.map +7 -0
- package/node_modules/@narumitw/pi-btw/package.json +13 -9
- package/node_modules/@narumitw/pi-btw/src/btw.ts +40 -42
- package/node_modules/@narumitw/pi-btw/src/fullscreen-ui.ts +55 -10
- package/node_modules/@narumitw/pi-btw/src/main-tree-picker.ts +390 -0
- package/node_modules/@narumitw/pi-btw/src/menu.ts +78 -15
- package/node_modules/@narumitw/pi-btw/src/settings.ts +22 -2
- package/node_modules/@narumitw/pi-btw/src/transcript-pager.ts +136 -45
- package/node_modules/pi-lens/CHANGELOG.md +1004 -0
- package/node_modules/pi-lens/README.md +11 -3
- package/node_modules/pi-lens/config/ruff/core.toml +42 -0
- package/node_modules/pi-lens/dist/clients/actionable-warnings.js +130 -27
- package/node_modules/pi-lens/dist/clients/advisory-provenance.js +427 -0
- package/node_modules/pi-lens/dist/clients/agent-nudge.js +79 -16
- package/node_modules/pi-lens/dist/clients/ast-grep-client.js +9 -3
- package/node_modules/pi-lens/dist/clients/atomic-write.js +9 -3
- package/node_modules/pi-lens/dist/clients/bash-file-access.js +285 -8
- package/node_modules/pi-lens/dist/clients/biome-client.js +176 -37
- package/node_modules/pi-lens/dist/clients/blocker-freshness.js +428 -0
- package/node_modules/pi-lens/dist/clients/blocker-past-eof.js +119 -0
- package/node_modules/pi-lens/dist/clients/bootstrap.js +12 -1
- package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +12 -3
- package/node_modules/pi-lens/dist/clients/bounded-telemetry.js +192 -0
- package/node_modules/pi-lens/dist/clients/bus-events-logger.js +62 -6
- package/node_modules/pi-lens/dist/clients/bus-publish.js +11 -3
- package/node_modules/pi-lens/dist/clients/cascade-budget.js +196 -0
- package/node_modules/pi-lens/dist/clients/cascade-format.js +76 -2
- package/node_modules/pi-lens/dist/clients/cascade-types.js +9 -1
- package/node_modules/pi-lens/dist/clients/child-unref.js +54 -6
- package/node_modules/pi-lens/dist/clients/code-quality-warnings.js +76 -24
- package/node_modules/pi-lens/dist/clients/console-guard-install.js +16 -4
- package/node_modules/pi-lens/dist/clients/dead-code-client.js +249 -52
- package/node_modules/pi-lens/dist/clients/deadline-utils.js +8 -1
- package/node_modules/pi-lens/dist/clients/debug-handles.js +5 -0
- package/node_modules/pi-lens/dist/clients/degradation-ledger.js +62 -13
- package/node_modules/pi-lens/dist/clients/dependency-checker.js +43 -9
- package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +153 -37
- package/node_modules/pi-lens/dist/clients/diagnostic-line-freshness.js +298 -0
- package/node_modules/pi-lens/dist/clients/diagnostics-publish.js +10 -3
- package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +165 -11
- package/node_modules/pi-lens/dist/clients/dispatch/integration.js +325 -72
- package/node_modules/pi-lens/dist/clients/dispatch/lazy.js +7 -4
- package/node_modules/pi-lens/dist/clients/dispatch/plan.js +5 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ast-grep-napi.js +234 -18
- package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +187 -19
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +6 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/credo.js +11 -9
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cue-vet.js +398 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +11 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +12 -7
- package/node_modules/pi-lens/dist/clients/dispatch/runners/go-vet.js +18 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-render.js +895 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/index.js +4 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +16 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +81 -41
- package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +16 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +23 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +331 -55
- package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +38 -5
- package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +97 -19
- package/node_modules/pi-lens/dist/clients/dispatch/runners/spellcheck.js +14 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +20 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +22 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/swiftlint.js +10 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/taplo.js +18 -6
- package/node_modules/pi-lens/dist/clients/dispatch/runners/trivy-config.js +73 -12
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/availability-policy.js +488 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +84 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +260 -27
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +943 -93
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +86 -11
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/tool-failure.js +72 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +106 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/vale.js +9 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +18 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +4 -2
- package/node_modules/pi-lens/dist/clients/disposition-publish.js +10 -3
- package/node_modules/pi-lens/dist/clients/eval-timestamp.js +17 -0
- package/node_modules/pi-lens/dist/clients/event-loop-monitor.js +28 -5
- package/node_modules/pi-lens/dist/clients/extension-log.js +317 -3
- package/node_modules/pi-lens/dist/clients/file-kinds.js +8 -2
- package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +294 -0
- package/node_modules/pi-lens/dist/clients/finding-identity.js +88 -0
- package/node_modules/pi-lens/dist/clients/fix-worklog.js +5 -1
- package/node_modules/pi-lens/dist/clients/format-events-publish.js +39 -8
- package/node_modules/pi-lens/dist/clients/formatters-lazy.js +3 -2
- package/node_modules/pi-lens/dist/clients/formatters.js +500 -115
- package/node_modules/pi-lens/dist/clients/generation-guard.js +216 -0
- package/node_modules/pi-lens/dist/clients/git-guard.js +49 -21
- package/node_modules/pi-lens/dist/clients/gitleaks-client.js +181 -8
- package/node_modules/pi-lens/dist/clients/go-client.js +21 -39
- package/node_modules/pi-lens/dist/clients/govulncheck-client.js +219 -10
- package/node_modules/pi-lens/dist/clients/grammar-source.js +333 -10
- package/node_modules/pi-lens/dist/clients/host-ports.js +9 -1
- package/node_modules/pi-lens/dist/clients/installer/index.js +1119 -101
- package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh-session.js +58 -0
- package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh.js +715 -0
- package/node_modules/pi-lens/dist/clients/instance-reaper.js +643 -97
- package/node_modules/pi-lens/dist/clients/instance-registry.js +87 -17
- package/node_modules/pi-lens/dist/clients/jscpd-client.js +86 -15
- package/node_modules/pi-lens/dist/clients/knip-client.js +361 -24
- package/node_modules/pi-lens/dist/clients/language-policy.js +8 -2
- package/node_modules/pi-lens/dist/clients/language-profile.js +2 -0
- package/node_modules/pi-lens/dist/clients/latency-logger.js +487 -9
- package/node_modules/pi-lens/dist/clients/lazy-import.js +21 -0
- package/node_modules/pi-lens/dist/clients/ledger-bounds.js +21 -0
- package/node_modules/pi-lens/dist/clients/lens-events.js +56 -25
- package/node_modules/pi-lens/dist/clients/lens-flag-registry.js +16 -0
- package/node_modules/pi-lens/dist/clients/live-bus-emitter.js +45 -2
- package/node_modules/pi-lens/dist/clients/lsp/aggregation.js +30 -4
- package/node_modules/pi-lens/dist/clients/lsp/cascade-tier.js +160 -20
- package/node_modules/pi-lens/dist/clients/lsp/client.js +1666 -148
- package/node_modules/pi-lens/dist/clients/lsp/diagnostic-binding.js +111 -0
- package/node_modules/pi-lens/dist/clients/lsp/document-drift.js +389 -0
- package/node_modules/pi-lens/dist/clients/lsp/index.js +2496 -171
- package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +215 -0
- package/node_modules/pi-lens/dist/clients/lsp/jvm-runtime.js +146 -14
- package/node_modules/pi-lens/dist/clients/lsp/language.js +48 -4
- package/node_modules/pi-lens/dist/clients/lsp/server.js +517 -69
- package/node_modules/pi-lens/dist/clients/lsp/spawn-history.js +22 -0
- package/node_modules/pi-lens/dist/clients/lsp/sync-kind.js +43 -0
- package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +172 -0
- package/node_modules/pi-lens/dist/clients/lsp/wait-policy/classification.js +21 -5
- package/node_modules/pi-lens/dist/clients/lsp/wait-policy/strategies.js +61 -3
- package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +422 -28
- package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-session.js +30 -0
- package/node_modules/pi-lens/dist/clients/lsp/workspace-sweep-hold.js +175 -0
- package/node_modules/pi-lens/dist/clients/lsp-lazy.js +3 -2
- package/node_modules/pi-lens/dist/clients/mcp/analyze.js +4 -0
- package/node_modules/pi-lens/dist/clients/mcp/session.js +39 -18
- package/node_modules/pi-lens/dist/clients/model-provider.js +53 -0
- package/node_modules/pi-lens/dist/clients/module-report.js +8 -0
- package/node_modules/pi-lens/dist/clients/opengrep-client.js +15 -1
- package/node_modules/pi-lens/dist/clients/package-manager.js +170 -14
- package/node_modules/pi-lens/dist/clients/path-attribution-telemetry.js +27 -0
- package/node_modules/pi-lens/dist/clients/path-utils.js +160 -0
- package/node_modules/pi-lens/dist/clients/pipeline.js +178 -30
- package/node_modules/pi-lens/dist/clients/post-autofix-notice.js +37 -0
- package/node_modules/pi-lens/dist/clients/project-diagnostics/cache.js +17 -3
- package/node_modules/pi-lens/dist/clients/project-diagnostics/extractors.js +89 -22
- package/node_modules/pi-lens/dist/clients/project-diagnostics/fresh-fetch.js +85 -15
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +15 -3
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +23 -2
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +50 -2
- package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +5 -0
- package/node_modules/pi-lens/dist/clients/project-lens-config.js +3 -0
- package/node_modules/pi-lens/dist/clients/project-snapshot.js +299 -0
- package/node_modules/pi-lens/dist/clients/quiet-window-config.js +47 -0
- package/node_modules/pi-lens/dist/clients/quiet-window.js +11 -25
- package/node_modules/pi-lens/dist/clients/read-guard-logger.js +1 -1
- package/node_modules/pi-lens/dist/clients/read-guard.js +184 -10
- package/node_modules/pi-lens/dist/clients/resource-sampler.js +49 -17
- package/node_modules/pi-lens/dist/clients/reverse-deps.js +50 -11
- package/node_modules/pi-lens/dist/clients/review-graph/query.js +76 -4
- package/node_modules/pi-lens/dist/clients/run-duration.js +55 -0
- package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +248 -13
- package/node_modules/pi-lens/dist/clients/runtime-context.js +112 -12
- package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +472 -61
- package/node_modules/pi-lens/dist/clients/runtime-session.js +359 -13
- package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +217 -22
- package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +269 -22
- package/node_modules/pi-lens/dist/clients/runtime-turn.js +948 -87
- package/node_modules/pi-lens/dist/clients/rust-client.js +21 -37
- package/node_modules/pi-lens/dist/clients/safe-spawn.js +220 -7
- package/node_modules/pi-lens/dist/clients/scratch-tree-policy.js +161 -0
- package/node_modules/pi-lens/dist/clients/search-read-registration.js +34 -6
- package/node_modules/pi-lens/dist/clients/security-scan-client.js +224 -8
- package/node_modules/pi-lens/dist/clients/sg-runner.js +249 -37
- package/node_modules/pi-lens/dist/clients/single-flight.js +158 -0
- package/node_modules/pi-lens/dist/clients/smells-rollup.js +18 -11
- package/node_modules/pi-lens/dist/clients/stale-marker.js +17 -0
- package/node_modules/pi-lens/dist/clients/startup-timing.js +26 -2
- package/node_modules/pi-lens/dist/clients/test-runner-client.js +574 -32
- package/node_modules/pi-lens/dist/clients/tool-event.js +56 -5
- package/node_modules/pi-lens/dist/clients/tool-policy.js +127 -20
- package/node_modules/pi-lens/dist/clients/tool-set-policy.js +76 -0
- package/node_modules/pi-lens/dist/clients/tree-sitter-cache.js +75 -1
- package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +769 -64
- package/node_modules/pi-lens/dist/clients/tree-sitter-shared.js +11 -0
- package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +90 -0
- package/node_modules/pi-lens/dist/clients/trivy-client.js +19 -1
- package/node_modules/pi-lens/dist/clients/warm-attach.js +17 -0
- package/node_modules/pi-lens/dist/clients/widget-state.js +336 -36
- package/node_modules/pi-lens/dist/clients/word-index.js +305 -33
- package/node_modules/pi-lens/dist/clients/zizmor-config.js +214 -14
- package/node_modules/pi-lens/dist/index.js +64677 -49484
- package/node_modules/pi-lens/dist/mcp/server.js +8 -2
- package/node_modules/pi-lens/dist/tools/activate-tools.js +17 -5
- package/node_modules/pi-lens/dist/tools/ast-grep-replace.js +9 -4
- package/node_modules/pi-lens/dist/tools/lens-diagnostic-mark.js +5 -2
- package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +469 -56
- package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +190 -46
- package/node_modules/pi-lens/dist/tools/lsp-navigation.js +46 -7
- package/node_modules/pi-lens/dist/tools/symbol-search.js +1 -1
- package/node_modules/pi-lens/docs/agent-guide.md +44 -14
- package/node_modules/pi-lens/docs/ast-grep_rules_catalog.md +518 -501
- package/node_modules/pi-lens/docs/dispositions.md +21 -0
- package/node_modules/pi-lens/docs/features.md +33 -6
- package/node_modules/pi-lens/docs/globalconfig.md +14 -0
- package/node_modules/pi-lens/docs/language-coverage.md +71 -5
- package/node_modules/pi-lens/docs/mcp.md +2 -2
- package/node_modules/pi-lens/docs/servercapabilities.md +4 -1
- package/node_modules/pi-lens/docs/settings.md +25 -1
- package/node_modules/pi-lens/docs/usage.md +24 -5
- package/node_modules/pi-lens/docs/word-index.md +35 -0
- package/node_modules/pi-lens/package.json +10 -6
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/__snapshots__/no-reflect-get-js-snapshot.yml +23 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/__snapshots__/no-reflect-get-snapshot.yml +23 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/__snapshots__/ts-void-zero-snapshot.yml +23 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-bare-object-param-test.yml +16 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-chained-type-assertions-test.yml +22 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-compile-call-test.yml +29 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-conditional-empty-object-spread-js-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-conditional-empty-object-spread-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-dupe-class-members-test.yml +33 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-inner-html-js-test.yml +7 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-inner-html-test.yml +7 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-known-value-widening-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-non-null-assertion-test.yml +216 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-apply-js-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-apply-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-get-js-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-get-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-return-value-in-generator-test.yml +12 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-runtime-typeof-test.yml +33 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-server-bind-wildcard-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-shape-in-symbol-names-test.yml +13 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-sql-in-code-js-test.yml +5 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-sql-in-code-test.yml +5 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unknown-laundering-test.yml +11 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unknown-parameters-test.yml +12 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unknown-returns-test.yml +16 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unsafe-dictionary-any-test.yml +10 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unsafe-dictionary-unknown-test.yml +8 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/redundant-unsafe-function-test.yml +35 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/require-safety-comment-for-as-unknown-as-test.yml +177 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/ts-void-zero-test.yml +1 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-await-expression-member-js.yml +13 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-await-expression-member.yml +13 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-bare-host-path-in-win32-branch.yml +2 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-bare-object-param.yml +60 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-chained-type-assertions.yml +66 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-compile-call.yml +63 -5
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-conditional-empty-object-spread-js.yml +21 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-conditional-empty-object-spread.yml +29 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-dupe-class-members.yml +52 -8
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-inner-html-js.yml +27 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-inner-html.yml +27 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-known-value-widening.yml +71 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-non-null-assertion.yml +316 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-raw-json-store-write.yml +7 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-apply-js.yml +29 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-apply.yml +30 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-get-js.yml +41 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-get.yml +42 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-return-value-in-generator.yml +22 -5
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-runtime-typeof.yml +121 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-server-bind-wildcard.yml +23 -7
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-shape-in-symbol-names.yml +68 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-sql-in-code-js.yml +41 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-sql-in-code.yml +41 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unknown-laundering.yml +32 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unknown-parameters.yml +67 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unknown-returns.yml +106 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unsafe-dictionary-any.yml +50 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unsafe-dictionary-unknown.yml +56 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-win32-isabsolute-for-qualification.yml +2 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/redundant-unsafe-function.yml +32 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/require-safety-comment-for-as-unknown-as.yml +184 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/ts-void-zero.yml +5 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/self-scan-baseline.json +5 -0
- package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +132 -1
- package/node_modules/pi-lens/scripts/download-grammars.js +25 -0
- package/node_modules/pi-lens/scripts/grammars.lock.json +9 -0
- package/node_modules/pi-lens/skills/pi-lens-ast-grep/SKILL.md +12 -11
- package/node_modules/pi-lens/skills/pi-lens-lsp-navigation/SKILL.md +22 -22
- package/node_modules/pi-lens/skills/pi-lens-write-ast-grep-rule/SKILL.md +87 -116
- package/node_modules/pi-lens/skills/pi-lens-write-ast-grep-rule/reference.md +170 -0
- package/node_modules/pi-lens/skills/pi-lens-write-tree-sitter-rule/SKILL.md +3 -1
- package/node_modules/pi-lens/vendor/grammars/tree-sitter-cue.wasm +0 -0
- package/node_modules/pi-mcp-adapter/CHANGELOG.md +49 -0
- package/node_modules/pi-mcp-adapter/README.md +51 -6
- package/node_modules/pi-mcp-adapter/agent-dir.ts +12 -4
- package/node_modules/pi-mcp-adapter/cli.js +188 -5
- package/node_modules/pi-mcp-adapter/commands.ts +128 -22
- package/node_modules/pi-mcp-adapter/config.ts +28 -10
- package/node_modules/pi-mcp-adapter/direct-tools.ts +23 -19
- package/node_modules/pi-mcp-adapter/index.ts +219 -32
- package/node_modules/pi-mcp-adapter/init.ts +36 -4
- package/node_modules/pi-mcp-adapter/lifecycle.ts +315 -24
- package/node_modules/pi-mcp-adapter/mcp-auth-flow.ts +39 -6
- package/node_modules/pi-mcp-adapter/mcp-bearer-store.ts +387 -0
- package/node_modules/pi-mcp-adapter/mcp-callback-server.ts +27 -3
- package/node_modules/pi-mcp-adapter/mcp-code.ts +4 -0
- package/node_modules/pi-mcp-adapter/mcp-panel.ts +42 -13
- package/node_modules/pi-mcp-adapter/mcp-setup-panel.ts +2 -1
- package/node_modules/pi-mcp-adapter/metadata-cache.ts +46 -25
- package/node_modules/pi-mcp-adapter/package-mcp-loader.ts +168 -0
- package/node_modules/pi-mcp-adapter/package.json +4 -1
- package/node_modules/pi-mcp-adapter/proxy-modes.ts +5 -4
- package/node_modules/pi-mcp-adapter/request-headers-command.ts +330 -0
- package/node_modules/pi-mcp-adapter/search-ranking.ts +92 -22
- package/node_modules/pi-mcp-adapter/server-manager.ts +145 -2
- package/node_modules/pi-mcp-adapter/session-recovery.ts +7 -0
- package/node_modules/pi-mcp-adapter/tool-approval.ts +15 -2
- package/node_modules/pi-mcp-adapter/tool-metadata.ts +38 -18
- package/node_modules/pi-mcp-adapter/tool-result-renderer.ts +44 -4
- package/node_modules/pi-mcp-adapter/types.ts +95 -10
- package/node_modules/pi-mcp-adapter/ui-server.ts +18 -16
- package/node_modules/pi-mcp-adapter/utils.ts +70 -0
- package/node_modules/pi-web-access/CHANGELOG.md +37 -0
- package/node_modules/pi-web-access/README.md +38 -14
- package/node_modules/pi-web-access/anysearch.ts +4 -2
- package/node_modules/pi-web-access/auth-fetch.ts +148 -0
- package/node_modules/pi-web-access/brave.ts +16 -4
- package/node_modules/pi-web-access/chrome-cookies.ts +110 -23
- package/node_modules/pi-web-access/curator-page.ts +8 -3
- package/node_modules/pi-web-access/curator-server.ts +5 -1
- package/node_modules/pi-web-access/exa.ts +18 -7
- package/node_modules/pi-web-access/extract.ts +134 -37
- package/node_modules/pi-web-access/fetch-params.ts +17 -3
- package/node_modules/pi-web-access/firecrawl.ts +172 -12
- package/node_modules/pi-web-access/gemini-search.ts +33 -7
- package/node_modules/pi-web-access/index.ts +160 -104
- package/node_modules/pi-web-access/package.json +2 -2
- package/node_modules/pi-web-access/page-query.ts +4 -2
- package/node_modules/pi-web-access/parallel-mcp.ts +249 -0
- package/node_modules/pi-web-access/parallel.ts +2 -2
- package/node_modules/pi-web-access/query-rewrite.ts +51 -0
- package/node_modules/pi-web-access/serper.ts +211 -0
- package/node_modules/pi-web-access/summary-model-scope.ts +12 -4
- package/node_modules/pi-web-access/summary-review.ts +51 -23
- package/node_modules/pi-web-access/tavily.ts +16 -4
- package/node_modules/pi-web-access/utils.ts +87 -0
- package/node_modules/pi-web-access/valyu.ts +199 -0
- package/node_modules/pi-web-access/youtube-extract.ts +2 -2
- package/package.json +13 -13
package/README.md
CHANGED
|
@@ -11,13 +11,13 @@ pi install npm:@herbertgao/pi-extensions
|
|
|
11
11
|
The package bundles 11 active `@herbertgao/*` child packages, including `@herbertgao/pi-cc-extensions`, plus the following upstream packages under their original names:
|
|
12
12
|
|
|
13
13
|
- `@dietrichgebert/ponytail@4.9.0`
|
|
14
|
-
- `@juicesharp/rpiv-ask-user-question@2.
|
|
15
|
-
- `@narumitw/pi-btw@0.
|
|
14
|
+
- `@juicesharp/rpiv-ask-user-question@2.6.4`
|
|
15
|
+
- `@narumitw/pi-btw@0.55.0`
|
|
16
16
|
- `@pi-plugins/fast-mode@0.1.9`
|
|
17
|
-
- `pi-mcp-adapter@2.
|
|
17
|
+
- `pi-mcp-adapter@2.27.0`
|
|
18
18
|
- `pi-footer@0.5.1`
|
|
19
|
-
- `pi-lens@4.
|
|
20
|
-
- `pi-web-access@0.
|
|
19
|
+
- `pi-lens@4.1.0`
|
|
20
|
+
- `pi-web-access@0.24.0`
|
|
21
21
|
- `remote-pi@0.7.0`
|
|
22
22
|
- `@czottmann/pi-automode@1.11.0`
|
|
23
23
|
|
|
@@ -40,7 +40,7 @@ Run `/reload` after installation.
|
|
|
40
40
|
| Claude Code Output | Tool summaries, expand/collapse, rich edit/write diffs, and `on` / `compact` / `off` modes | `/ccstyle` |
|
|
41
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 with startup, wheel, and optional feature toggles | `/ccstyle` |
|
|
43
|
-
| Context inspection | Usage breakdown and previews for the system prompt, tools, skills, and messages
|
|
43
|
+
| Context inspection | Usage breakdown and previews for the system prompt, tools, tool results, skills, and messages | `/context` |
|
|
44
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
|
|
|
@@ -55,7 +55,7 @@ Run `/reload` after installation.
|
|
|
55
55
|
"diffViewMode": "auto", // diff layout: auto / split / unified
|
|
56
56
|
"diffIndicatorMode": "bars", // diff change indicators: bars / classic / none
|
|
57
57
|
"diffSplitMinWidth": 120, // min terminal width before auto layout uses side-by-side columns
|
|
58
|
-
"
|
|
58
|
+
"editDiffCollapsedLines": 24, // diff body lines shown when collapsed; beyond that shows the expand hint (Ctrl+O / click)
|
|
59
59
|
"diffWordWrap": true, // whether long diff lines wrap (otherwise truncated)
|
|
60
60
|
"expandedPreviewMaxLines": 40, // max body lines for expanded output/diff
|
|
61
61
|
"useSummaryTitlesAsThinkingTitle": true, // use the latest provider summary as the active thinking title
|
|
@@ -40,7 +40,7 @@ pi install npm:@herbertgao/pi-cc-extensions
|
|
|
40
40
|
| Claude Code UI | 工具摘要、折叠展开、rich edit/write diff,以及 `on` / `compact` / `off` 三种模式 | `/ccstyle` |
|
|
41
41
|
| Fullscreen mode | 工具卡/group 点击展开与收起、预览、hover 高亮、回到底部按钮 | `TUIMODE=fullscreen` 或 `--tui-mode fullscreen` |
|
|
42
42
|
| 配置面板 | `Style / Diff / Thinking / Feature` 四页签,含启动头、滚轮步进及可选功能开关 | `/ccstyle` |
|
|
43
|
-
| 上下文检查 | 查看上下文占用,并预览 System prompt、Tools、Skills 和消息内容
|
|
43
|
+
| 上下文检查 | 查看上下文占用,并预览 System prompt、Tools、Tool results、Skills 和消息内容 | `/context` |
|
|
44
44
|
| Session/Subagent 引用 | 搜索并注入历史 Session 或现有 SubAgent 的有效上下文 | `@` |
|
|
45
45
|
| 主题 | 随包提供内置 CC Dark、CC Light 主题 | `/theme` |
|
|
46
46
|
|
|
@@ -55,7 +55,7 @@ pi install npm:@herbertgao/pi-cc-extensions
|
|
|
55
55
|
"diffViewMode": "auto", // diff 布局:auto / split / unified
|
|
56
56
|
"diffIndicatorMode": "bars", // diff 变更指示:bars / classic / none
|
|
57
57
|
"diffSplitMinWidth": 120, // 自动布局下使用左右分栏的最小终端宽度
|
|
58
|
-
"
|
|
58
|
+
"editDiffCollapsedLines": 24, // 折叠时展示的 diff 行数,超出显示展开提示(Ctrl+O / 点击)
|
|
59
59
|
"diffWordWrap": true, // 长 diff 行是否换行(否则截断)
|
|
60
60
|
"expandedPreviewMaxLines": 40, // 展开后输出/diff 正文的最大行数
|
|
61
61
|
"useSummaryTitlesAsThinkingTitle": true, // 用最新 provider 摘要作为思考标题
|
|
@@ -17,7 +17,8 @@ export type Config = {
|
|
|
17
17
|
diffViewMode: DiffViewMode;
|
|
18
18
|
diffIndicatorMode: DiffIndicatorMode;
|
|
19
19
|
diffSplitMinWidth: number;
|
|
20
|
-
|
|
20
|
+
editDiffCollapsedLines: number;
|
|
21
|
+
writeDiffCollapsedLines: number;
|
|
21
22
|
diffWordWrap: boolean;
|
|
22
23
|
expandedPreviewMaxLines: number;
|
|
23
24
|
useSummaryTitlesAsThinkingTitle: boolean;
|
|
@@ -40,6 +41,8 @@ export const DIFF_VIEW_MODES: DiffViewMode[] = ["auto", "split", "unified"];
|
|
|
40
41
|
export const DIFF_INDICATOR_MODES: DiffIndicatorMode[] = ["bars", "classic", "none"];
|
|
41
42
|
export const DIFF_SPLIT_MIN_WIDTH_VALUES = ["80", "100", "120", "140", "160", "180"];
|
|
42
43
|
export const DIFF_COLLAPSED_LINES_VALUES = ["12", "24", "36", "48", "80", "120"];
|
|
44
|
+
/** Write collapsed presets. 0 = stats only (`+N -0` + expand hint). */
|
|
45
|
+
export const WRITE_DIFF_COLLAPSED_LINES_VALUES = ["0", "4", "8", "12", "24", "36"];
|
|
43
46
|
/** Presets for expanded body height — keep low options first so cycling stays TUI-friendly. */
|
|
44
47
|
export const EXPANDED_PREVIEW_MAX_LINES_VALUES = ["40", "60", "80", "120", "200", "500", "2000"];
|
|
45
48
|
export const THINKING_PREVIEW_LINES_VALUES = ["0", "1", "3", "5", "10"];
|
|
@@ -65,7 +68,8 @@ export const DEFAULT_CONFIG: Config = {
|
|
|
65
68
|
diffViewMode: DEFAULT_TOOL_DISPLAY_CONFIG.diffViewMode,
|
|
66
69
|
diffIndicatorMode: DEFAULT_TOOL_DISPLAY_CONFIG.diffIndicatorMode,
|
|
67
70
|
diffSplitMinWidth: DEFAULT_TOOL_DISPLAY_CONFIG.diffSplitMinWidth,
|
|
68
|
-
|
|
71
|
+
editDiffCollapsedLines: DEFAULT_TOOL_DISPLAY_CONFIG.editDiffCollapsedLines,
|
|
72
|
+
writeDiffCollapsedLines: DEFAULT_TOOL_DISPLAY_CONFIG.writeDiffCollapsedLines,
|
|
69
73
|
diffWordWrap: DEFAULT_TOOL_DISPLAY_CONFIG.diffWordWrap,
|
|
70
74
|
expandedPreviewMaxLines: DEFAULT_TOOL_DISPLAY_CONFIG.expandedPreviewMaxLines,
|
|
71
75
|
useSummaryTitlesAsThinkingTitle: true,
|
|
@@ -134,12 +138,18 @@ export function normalizeConfig(input: unknown): Config {
|
|
|
134
138
|
40,
|
|
135
139
|
300,
|
|
136
140
|
),
|
|
137
|
-
|
|
138
|
-
source.diffCollapsedLines,
|
|
139
|
-
DEFAULT_CONFIG.
|
|
141
|
+
editDiffCollapsedLines: pickPositiveInt(
|
|
142
|
+
source.editDiffCollapsedLines ?? source.diffCollapsedLines,
|
|
143
|
+
DEFAULT_CONFIG.editDiffCollapsedLines,
|
|
140
144
|
1,
|
|
141
145
|
500,
|
|
142
146
|
),
|
|
147
|
+
writeDiffCollapsedLines: pickPositiveInt(
|
|
148
|
+
source.writeDiffCollapsedLines,
|
|
149
|
+
DEFAULT_CONFIG.writeDiffCollapsedLines,
|
|
150
|
+
0,
|
|
151
|
+
500,
|
|
152
|
+
),
|
|
143
153
|
diffWordWrap: source.diffWordWrap !== false,
|
|
144
154
|
expandedPreviewMaxLines: pickPositiveInt(
|
|
145
155
|
source.expandedPreviewMaxLines,
|
|
@@ -182,7 +192,8 @@ export function getToolDisplayConfig(source: Config = config): ToolDisplayConfig
|
|
|
182
192
|
diffViewMode: source.diffViewMode,
|
|
183
193
|
diffIndicatorMode: source.diffIndicatorMode,
|
|
184
194
|
diffSplitMinWidth: source.diffSplitMinWidth,
|
|
185
|
-
|
|
195
|
+
editDiffCollapsedLines: source.editDiffCollapsedLines,
|
|
196
|
+
writeDiffCollapsedLines: source.writeDiffCollapsedLines,
|
|
186
197
|
diffWordWrap: source.diffWordWrap,
|
|
187
198
|
expandedPreviewMaxLines: source.expandedPreviewMaxLines,
|
|
188
199
|
};
|
|
@@ -199,7 +210,8 @@ export function formatConfigStatus(source: Config = config): string {
|
|
|
199
210
|
`diffView=${source.diffViewMode}`,
|
|
200
211
|
`diffIndicator=${source.diffIndicatorMode}`,
|
|
201
212
|
`diffSplitMin=${source.diffSplitMinWidth}`,
|
|
202
|
-
`
|
|
213
|
+
`editCollapsed=${source.editDiffCollapsedLines}`,
|
|
214
|
+
`writeCollapsed=${source.writeDiffCollapsedLines}`,
|
|
203
215
|
`diffWordWrap=${source.diffWordWrap ? "on" : "off"}`,
|
|
204
216
|
`expandedMax=${source.expandedPreviewMaxLines}`,
|
|
205
217
|
`thinkingTitle=${source.useSummaryTitlesAsThinkingTitle ? "summary" : "default"}`,
|
|
@@ -27,6 +27,7 @@ import {
|
|
|
27
27
|
SCROLL_STEP_LINES_VALUES,
|
|
28
28
|
THINKING_ANIMATION_INTERVAL_VALUES,
|
|
29
29
|
THINKING_PREVIEW_LINES_VALUES,
|
|
30
|
+
WRITE_DIFF_COLLAPSED_LINES_VALUES,
|
|
30
31
|
type CompactStyleMode,
|
|
31
32
|
} from "./config.ts";
|
|
32
33
|
|
|
@@ -38,7 +39,7 @@ export type CcstylePanelHooks = {
|
|
|
38
39
|
|
|
39
40
|
function modeSettingDescription(mode: CompactStyleMode): string {
|
|
40
41
|
if (mode === "compact") {
|
|
41
|
-
return "(Experimental) One summary line per assistant round;
|
|
42
|
+
return "(Experimental) One summary line per assistant round; edit/write stay single-line until expanded.";
|
|
42
43
|
}
|
|
43
44
|
if (mode === "off") {
|
|
44
45
|
return "Pi native tool rendering. Diff options below still apply independently.";
|
|
@@ -285,15 +286,25 @@ export async function showCcstylePanel(
|
|
|
285
286
|
buildNumberInputSubmenu(theme, diffSplitSetting, closeSubmenu),
|
|
286
287
|
};
|
|
287
288
|
const diffCollapsedSetting = {
|
|
288
|
-
id: "
|
|
289
|
-
label: "
|
|
289
|
+
id: "editDiffCollapsedLines",
|
|
290
|
+
label: "Edit collapsed lines",
|
|
290
291
|
description:
|
|
291
|
-
"How many diff body lines to show before the expand hint (Ctrl+O / click).
|
|
292
|
-
currentValue: String(config.
|
|
292
|
+
"How many edit/diff body lines to show before the expand hint (Ctrl+O / click). Write uses its own setting below.",
|
|
293
|
+
currentValue: String(config.editDiffCollapsedLines),
|
|
293
294
|
values: [...DIFF_COLLAPSED_LINES_VALUES],
|
|
294
295
|
submenu: (_current: string, closeSubmenu: (selected?: string) => void) =>
|
|
295
296
|
buildNumberInputSubmenu(theme, diffCollapsedSetting, closeSubmenu),
|
|
296
297
|
};
|
|
298
|
+
const writeDiffCollapsedSetting = {
|
|
299
|
+
id: "writeDiffCollapsedLines",
|
|
300
|
+
label: "Write collapsed lines",
|
|
301
|
+
description:
|
|
302
|
+
"Write-only collapsed body lines. 0 shows ↳ created + expand hint. Enter to type a custom value.",
|
|
303
|
+
currentValue: String(config.writeDiffCollapsedLines),
|
|
304
|
+
values: [...WRITE_DIFF_COLLAPSED_LINES_VALUES],
|
|
305
|
+
submenu: (_current: string, closeSubmenu: (selected?: string) => void) =>
|
|
306
|
+
buildNumberInputSubmenu(theme, writeDiffCollapsedSetting, closeSubmenu),
|
|
307
|
+
};
|
|
297
308
|
const diffWordWrapSetting = {
|
|
298
309
|
id: "diffWordWrap",
|
|
299
310
|
label: "Diff word wrap",
|
|
@@ -446,14 +457,23 @@ export async function showCcstylePanel(
|
|
|
446
457
|
);
|
|
447
458
|
diffSplitSetting.currentValue = String(config.diffSplitMinWidth);
|
|
448
459
|
break;
|
|
449
|
-
case "
|
|
450
|
-
config.
|
|
460
|
+
case "editDiffCollapsedLines":
|
|
461
|
+
config.editDiffCollapsedLines = pickPositiveInt(
|
|
451
462
|
value,
|
|
452
|
-
DEFAULT_CONFIG.
|
|
463
|
+
DEFAULT_CONFIG.editDiffCollapsedLines,
|
|
453
464
|
1,
|
|
454
465
|
500,
|
|
455
466
|
);
|
|
456
|
-
diffCollapsedSetting.currentValue = String(config.
|
|
467
|
+
diffCollapsedSetting.currentValue = String(config.editDiffCollapsedLines);
|
|
468
|
+
break;
|
|
469
|
+
case "writeDiffCollapsedLines":
|
|
470
|
+
config.writeDiffCollapsedLines = pickPositiveInt(
|
|
471
|
+
value,
|
|
472
|
+
DEFAULT_CONFIG.writeDiffCollapsedLines,
|
|
473
|
+
0,
|
|
474
|
+
500,
|
|
475
|
+
);
|
|
476
|
+
writeDiffCollapsedSetting.currentValue = String(config.writeDiffCollapsedLines);
|
|
457
477
|
break;
|
|
458
478
|
case "diffWordWrap":
|
|
459
479
|
config.diffWordWrap = value === "on";
|
|
@@ -519,6 +539,7 @@ export async function showCcstylePanel(
|
|
|
519
539
|
diffIndicatorSetting,
|
|
520
540
|
diffSplitSetting,
|
|
521
541
|
diffCollapsedSetting,
|
|
542
|
+
writeDiffCollapsedSetting,
|
|
522
543
|
diffWordWrapSetting,
|
|
523
544
|
expandedMaxSetting,
|
|
524
545
|
],
|
|
@@ -11,8 +11,14 @@ import {
|
|
|
11
11
|
type ExtensionAPI,
|
|
12
12
|
type Theme,
|
|
13
13
|
} from "@earendil-works/pi-coding-agent";
|
|
14
|
-
import {
|
|
15
|
-
|
|
14
|
+
import {
|
|
15
|
+
getKeybindings,
|
|
16
|
+
truncateToWidth,
|
|
17
|
+
visibleWidth,
|
|
18
|
+
wrapTextWithAnsi,
|
|
19
|
+
} from "@earendil-works/pi-tui";
|
|
20
|
+
import { Box, Markdown, Spacer, Text, type Component } from "@earendil-works/pi-tui";
|
|
21
|
+
import { isToolTuiFullscreen } from "../renderer/show-more-hint.ts";
|
|
16
22
|
import {
|
|
17
23
|
animateCompactThinkingText,
|
|
18
24
|
formatThoughtDuration,
|
|
@@ -159,30 +165,269 @@ function getThinkingToggleHint() {
|
|
|
159
165
|
return keys.length > 0 ? `${keys.join("/")} to expand` : undefined;
|
|
160
166
|
}
|
|
161
167
|
|
|
162
|
-
|
|
168
|
+
function thinkingExpandAction(): string | undefined {
|
|
169
|
+
return isToolTuiFullscreen() ? "click to show more" : getThinkingToggleHint();
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// 只 wrap 尾部窗口;缓存未着色折行,着色放到取出时做,避免主题切换命中旧 ANSI。
|
|
173
|
+
type PreviewCacheEntry = { lines: string[]; hiddenBefore: number };
|
|
174
|
+
const previewCache = new Map<string, PreviewCacheEntry>();
|
|
175
|
+
export const THINKING_PREVIEW_CACHE_MAX = 2_048;
|
|
176
|
+
const PREVIEW_BUDGET_MIN_CHARS = 2_000;
|
|
177
|
+
const PREVIEW_BUDGET_SLACK_LINES = 2;
|
|
178
|
+
|
|
179
|
+
function getCachedPreview(key: string): PreviewCacheEntry | undefined {
|
|
180
|
+
const entry = previewCache.get(key);
|
|
181
|
+
if (!entry) return undefined;
|
|
182
|
+
previewCache.delete(key);
|
|
183
|
+
previewCache.set(key, entry);
|
|
184
|
+
return entry;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function cachePreview(key: string, entry: PreviewCacheEntry): void {
|
|
188
|
+
previewCache.delete(key);
|
|
189
|
+
while (previewCache.size >= THINKING_PREVIEW_CACHE_MAX) {
|
|
190
|
+
const oldest = previewCache.keys().next().value;
|
|
191
|
+
if (oldest === undefined) break;
|
|
192
|
+
previewCache.delete(oldest);
|
|
193
|
+
}
|
|
194
|
+
previewCache.set(key, entry);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export function clearThinkingPreviewCache(): void {
|
|
198
|
+
previewCache.clear();
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export function thinkingPreviewCacheSize(): number {
|
|
202
|
+
return previewCache.size;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/** 按可见宽度估算折行数,不走 Text 全量 wrap。无换行长段也能计到隐藏行。 */
|
|
206
|
+
function countWrappedLines(text: string, contentWidth: number): number {
|
|
207
|
+
if (!text) return 0;
|
|
208
|
+
const width = Math.max(1, contentWidth);
|
|
209
|
+
let lines = 0;
|
|
210
|
+
for (const raw of text.replace(/\t/g, " ").split(/\r\n|\r|\n/)) {
|
|
211
|
+
const w = visibleWidth(raw);
|
|
212
|
+
lines += w === 0 ? 1 : Math.ceil(w / width);
|
|
213
|
+
}
|
|
214
|
+
return lines;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
function padPreviewLine(line: string, width: number, padding: number): string {
|
|
218
|
+
const left = padding > 0 ? " ".repeat(padding) : "";
|
|
219
|
+
const right = padding > 0 ? " ".repeat(padding) : "";
|
|
220
|
+
const withMargins = left + line + right;
|
|
221
|
+
return withMargins + " ".repeat(Math.max(0, width - visibleWidth(withMargins)));
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function layoutThinkingPreview(
|
|
225
|
+
text: string,
|
|
226
|
+
width: number,
|
|
227
|
+
padding: number,
|
|
228
|
+
): { visible: string[]; hiddenLines: number } {
|
|
229
|
+
if (!text || config.previewLines <= 0) return { visible: [], hiddenLines: 0 };
|
|
230
|
+
const contentWidth = Math.max(1, width - padding * 2);
|
|
231
|
+
const budget = Math.max(
|
|
232
|
+
width * (config.previewLines + PREVIEW_BUDGET_SLACK_LINES),
|
|
233
|
+
PREVIEW_BUDGET_MIN_CHARS,
|
|
234
|
+
);
|
|
235
|
+
let source = text;
|
|
236
|
+
let cut = 0;
|
|
237
|
+
if (source.length > budget) {
|
|
238
|
+
const start = source.length - budget;
|
|
239
|
+
const newline = source.indexOf("\n", start);
|
|
240
|
+
cut = newline === -1 ? start : newline + 1;
|
|
241
|
+
if (cut < source.length) source = source.slice(cut);
|
|
242
|
+
else cut = 0;
|
|
243
|
+
}
|
|
244
|
+
const cacheKey = `${width}:${padding}:${cut}:${source}`;
|
|
245
|
+
let entry = getCachedPreview(cacheKey);
|
|
246
|
+
if (!entry) {
|
|
247
|
+
entry = {
|
|
248
|
+
lines: wrapTextWithAnsi(source.replace(/\t/g, " "), contentWidth),
|
|
249
|
+
hiddenBefore: cut > 0 ? countWrappedLines(text.slice(0, cut), contentWidth) : 0,
|
|
250
|
+
};
|
|
251
|
+
cachePreview(cacheKey, entry);
|
|
252
|
+
}
|
|
253
|
+
const hiddenLines = entry.hiddenBefore + Math.max(0, entry.lines.length - config.previewLines);
|
|
254
|
+
const visible = hiddenLines > 0 ? entry.lines.slice(-config.previewLines) : entry.lines;
|
|
255
|
+
return { visible, hiddenLines };
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
function hiddenPreviewHint(
|
|
259
|
+
hiddenLines: number,
|
|
260
|
+
forceExpandHint = false,
|
|
261
|
+
): { prefix: string; action: string; suffix: string } | undefined {
|
|
262
|
+
const action = thinkingExpandAction() ?? "";
|
|
263
|
+
if (hiddenLines > 0) {
|
|
264
|
+
const noun = hiddenLines === 1 ? "line" : "lines";
|
|
265
|
+
return {
|
|
266
|
+
prefix: ` • (${hiddenLines} more ${noun}${action ? ", " : ""}`,
|
|
267
|
+
action,
|
|
268
|
+
suffix: ")",
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
if (forceExpandHint && isToolTuiFullscreen()) {
|
|
272
|
+
return { prefix: " • ", action: "click to show more", suffix: "" };
|
|
273
|
+
}
|
|
274
|
+
return undefined;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
const expandedThinking = new Set<number>();
|
|
278
|
+
|
|
279
|
+
/** 折叠预览 + 展开全文。fullscreen 点击 hint 展开、双击整块收起,对齐工具卡。 */
|
|
280
|
+
export class ThinkingPreviewBlock implements Component {
|
|
281
|
+
private heading: string;
|
|
163
282
|
private text: string;
|
|
164
283
|
private padding: number;
|
|
284
|
+
private messageTimestamp: number;
|
|
165
285
|
private style: (text: string) => string;
|
|
166
|
-
|
|
167
|
-
|
|
286
|
+
private theme: Theme | undefined;
|
|
287
|
+
private _expanded: boolean;
|
|
288
|
+
private hintHovered = false;
|
|
289
|
+
private expandedBody: { width: number; lines: string[] } | undefined;
|
|
290
|
+
private collapsedMemo:
|
|
291
|
+
| {
|
|
292
|
+
width: number;
|
|
293
|
+
previewLines: number;
|
|
294
|
+
hintHovered: boolean;
|
|
295
|
+
expandAction: string | undefined;
|
|
296
|
+
lines: string[];
|
|
297
|
+
}
|
|
298
|
+
| undefined;
|
|
299
|
+
|
|
300
|
+
constructor(
|
|
301
|
+
heading: string,
|
|
302
|
+
text: string,
|
|
303
|
+
padding: number,
|
|
304
|
+
messageTimestamp: number,
|
|
305
|
+
style: (text: string) => string,
|
|
306
|
+
theme?: Theme,
|
|
307
|
+
) {
|
|
308
|
+
this.heading = heading;
|
|
168
309
|
this.text = text;
|
|
169
310
|
this.padding = padding;
|
|
311
|
+
this.messageTimestamp = messageTimestamp;
|
|
170
312
|
this.style = style;
|
|
313
|
+
this.theme = theme;
|
|
314
|
+
this._expanded = expandedThinking.has(messageTimestamp);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
private paint(color: string, text: string): string {
|
|
318
|
+
return this.theme && typeof this.theme.fg === "function"
|
|
319
|
+
? this.theme.fg(color as never, text)
|
|
320
|
+
: text;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
get expanded(): boolean {
|
|
324
|
+
return this._expanded;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
setExpanded(expanded: boolean): void {
|
|
328
|
+
if (this._expanded !== expanded) this.collapsedMemo = undefined;
|
|
329
|
+
this._expanded = expanded;
|
|
330
|
+
if (expanded) expandedThinking.add(this.messageTimestamp);
|
|
331
|
+
else {
|
|
332
|
+
expandedThinking.delete(this.messageTimestamp);
|
|
333
|
+
this.expandedBody = undefined;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
setHintHovered(hovered: boolean): void {
|
|
338
|
+
if (this.hintHovered !== hovered) this.collapsedMemo = undefined;
|
|
339
|
+
this.hintHovered = hovered;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
private headingLines(width: number, hiddenLines: number, padding: number): string[] {
|
|
343
|
+
const hint = this._expanded
|
|
344
|
+
? undefined
|
|
345
|
+
: hiddenPreviewHint(hiddenLines, Boolean(this.text) && config.previewLines <= 0);
|
|
346
|
+
if (!hint) return new Text(this.heading, padding, 0).render(width);
|
|
347
|
+
const rawHint = hint.prefix + hint.action + hint.suffix;
|
|
348
|
+
const contentWidth = Math.max(1, width - padding * 2);
|
|
349
|
+
const headingBudget = Math.max(0, contentWidth - visibleWidth(rawHint));
|
|
350
|
+
const clipped =
|
|
351
|
+
visibleWidth(this.heading) > headingBudget
|
|
352
|
+
? truncateToWidth(this.heading, headingBudget, "")
|
|
353
|
+
: this.heading;
|
|
354
|
+
const action = this.paint(this.hintHovered ? "text" : "dim", hint.action);
|
|
355
|
+
return new Text(
|
|
356
|
+
clipped + this.paint("dim", hint.prefix) + action + this.paint("dim", hint.suffix),
|
|
357
|
+
padding,
|
|
358
|
+
0,
|
|
359
|
+
).render(width);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
private bodyLines(width: number, padding: number): { lines: string[]; hiddenLines: number } {
|
|
363
|
+
if (!this.text || (config.previewLines <= 0 && !this._expanded)) {
|
|
364
|
+
return { lines: [], hiddenLines: 0 };
|
|
365
|
+
}
|
|
366
|
+
if (this._expanded) {
|
|
367
|
+
if (this.expandedBody?.width !== width) {
|
|
368
|
+
this.expandedBody = {
|
|
369
|
+
width,
|
|
370
|
+
lines: wrapTextWithAnsi(this.text.replace(/\t/g, " "), Math.max(1, width)),
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
return { lines: this.expandedBody.lines, hiddenLines: 0 };
|
|
374
|
+
}
|
|
375
|
+
const preview = layoutThinkingPreview(this.text, width, padding);
|
|
376
|
+
return { lines: preview.visible, hiddenLines: preview.hiddenLines };
|
|
171
377
|
}
|
|
172
378
|
|
|
173
379
|
render(width: number) {
|
|
174
|
-
|
|
175
|
-
|
|
380
|
+
if (this._expanded) {
|
|
381
|
+
const innerWidth = Math.max(1, width - 2);
|
|
382
|
+
const body = this.bodyLines(innerWidth, 0);
|
|
383
|
+
const heading = this.headingLines(innerWidth, 0, 0);
|
|
384
|
+
const inner = body.lines.length
|
|
385
|
+
? [...heading, ...body.lines.map((line) => this.style(line))]
|
|
386
|
+
: heading;
|
|
387
|
+
const bgFn =
|
|
388
|
+
this.theme && typeof this.theme.bg === "function"
|
|
389
|
+
? (text: string) => this.theme!.bg("userMessageBg" as never, text)
|
|
390
|
+
: undefined;
|
|
391
|
+
const box = new Box(1, 1, bgFn);
|
|
392
|
+
box.addChild({
|
|
393
|
+
render: () => inner,
|
|
394
|
+
invalidate() {},
|
|
395
|
+
});
|
|
396
|
+
return box.render(width);
|
|
397
|
+
}
|
|
176
398
|
|
|
177
|
-
const
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
399
|
+
const expandAction = thinkingExpandAction();
|
|
400
|
+
if (
|
|
401
|
+
this.collapsedMemo?.width === width &&
|
|
402
|
+
this.collapsedMemo.previewLines === config.previewLines &&
|
|
403
|
+
this.collapsedMemo.hintHovered === this.hintHovered &&
|
|
404
|
+
this.collapsedMemo.expandAction === expandAction
|
|
405
|
+
) {
|
|
406
|
+
return this.collapsedMemo.lines;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
const body = this.bodyLines(width, this.padding);
|
|
410
|
+
const heading = this.headingLines(width, body.hiddenLines, this.padding);
|
|
411
|
+
const lines = body.lines.length
|
|
412
|
+
? [
|
|
413
|
+
...heading,
|
|
414
|
+
...body.lines.map((line) => padPreviewLine(this.style(line), width, this.padding)),
|
|
415
|
+
]
|
|
416
|
+
: heading;
|
|
417
|
+
this.collapsedMemo = {
|
|
418
|
+
width,
|
|
419
|
+
previewLines: config.previewLines,
|
|
420
|
+
hintHovered: this.hintHovered,
|
|
421
|
+
expandAction,
|
|
422
|
+
lines,
|
|
423
|
+
};
|
|
424
|
+
return lines;
|
|
183
425
|
}
|
|
184
426
|
|
|
185
|
-
invalidate() {
|
|
427
|
+
invalidate() {
|
|
428
|
+
this.collapsedMemo = undefined;
|
|
429
|
+
this.expandedBody = undefined;
|
|
430
|
+
}
|
|
186
431
|
}
|
|
187
432
|
|
|
188
433
|
function parseSummaryPart(text: string): SummaryPart | undefined {
|
|
@@ -456,14 +701,17 @@ function compactThinking(pi: ExtensionAPI) {
|
|
|
456
701
|
durationText ? `Thought for ${durationText}` : (latestSummary?.title ?? "Thought"),
|
|
457
702
|
);
|
|
458
703
|
}
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
704
|
+
const previewSource = (latestSummary?.body ?? thinkingBlocks.join("\n\n")).trim();
|
|
705
|
+
self.contentContainer.addChild(
|
|
706
|
+
new ThinkingPreviewBlock(
|
|
707
|
+
heading,
|
|
708
|
+
previewSource,
|
|
709
|
+
self.outputPad,
|
|
710
|
+
message.timestamp,
|
|
711
|
+
thinkingStyle,
|
|
712
|
+
activeTheme,
|
|
713
|
+
),
|
|
714
|
+
);
|
|
467
715
|
|
|
468
716
|
const hasVisibleContentAfter = message.content
|
|
469
717
|
.slice(i + 1)
|
|
@@ -728,6 +976,8 @@ function compactThinking(pi: ExtensionAPI) {
|
|
|
728
976
|
latestComponentTimestamp = undefined;
|
|
729
977
|
completedDurations.clear();
|
|
730
978
|
streamingComponents.clear();
|
|
979
|
+
expandedThinking.clear();
|
|
980
|
+
clearThinkingPreviewCache();
|
|
731
981
|
if (ctx.mode === "tui") ctx.ui.setWidget(WIDGET_ID, undefined);
|
|
732
982
|
|
|
733
983
|
if (patchInstalled) {
|