@herbertgao/pi-extensions 2026.8.6 → 2026.8.8
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 +8 -6
- 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 +320 -22
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +94 -77
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/message-display.ts +79 -17
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/hover.ts +27 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/interaction.ts +66 -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 +6 -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 +17 -13
- 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 +21 -6
- package/node_modules/@herbertgao/pi-subagents/src/usage.ts +129 -1
- package/node_modules/@herbertgao/pi-subagents/src/worktree.ts +20 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/README.md +5 -4
- package/node_modules/@juicesharp/rpiv-ask-user-question/ask-user-question.ts +174 -100
- 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 +5 -1
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/keyboard.md +10 -2
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/localization.md +10 -6
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/tool-schema.md +11 -5
- package/node_modules/@juicesharp/rpiv-ask-user-question/locales/en.json +5 -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 +140 -97
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/questionnaire-session.ts +63 -28
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/selectors/projections.ts +22 -15
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/state-reducer.ts +11 -1
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/state.ts +14 -6
- package/node_modules/@juicesharp/rpiv-ask-user-question/tool/response-envelope.ts +11 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/tool/types.ts +11 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/view/components/multi-select-view.ts +31 -17
- package/node_modules/@juicesharp/rpiv-ask-user-question/view/components/preview/preview-block-renderer.ts +15 -6
- package/node_modules/@juicesharp/rpiv-ask-user-question/view/components/wrapping-select.ts +15 -6
- package/node_modules/@juicesharp/rpiv-ask-user-question/view/dialog-builder.ts +86 -38
- package/node_modules/@juicesharp/rpiv-ask-user-question/view/tab-content-strategy.ts +76 -9
- package/node_modules/@narumitw/pi-btw/README.md +120 -111
- 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 +10 -6
- package/node_modules/@narumitw/pi-btw/src/btw.ts +36 -40
- 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 +45 -2
- package/node_modules/@narumitw/pi-btw/src/transcript-pager.ts +136 -45
- package/node_modules/@pi-plugins/fast-mode/dist/index.mjs +44 -1856
- package/node_modules/@pi-plugins/fast-mode/dist/index.mjs.map +1 -1
- package/node_modules/@pi-plugins/fast-mode/package.json +4 -6
- package/node_modules/pi-lens/CHANGELOG.md +999 -0
- package/node_modules/pi-lens/README.md +117 -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 +126 -13
- package/node_modules/pi-lens/dist/clients/agent-nudge.js +67 -11
- 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 +381 -13
- package/node_modules/pi-lens/dist/clients/biome-client.js +61 -30
- package/node_modules/pi-lens/dist/clients/blocker-freshness.js +428 -0
- package/node_modules/pi-lens/dist/clients/blocker-past-eof.js +129 -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 +206 -0
- package/node_modules/pi-lens/dist/clients/cache-observability.js +353 -76
- package/node_modules/pi-lens/dist/clients/cascade-budget.js +196 -0
- package/node_modules/pi-lens/dist/clients/cascade-format.js +20 -1
- 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/dead-code-client.js +123 -31
- 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 +84 -14
- package/node_modules/pi-lens/dist/clients/demoted-finding-render.js +155 -0
- package/node_modules/pi-lens/dist/clients/dependency-checker.js +25 -3
- package/node_modules/pi-lens/dist/clients/deps/pi-tui.js +8 -2
- package/node_modules/pi-lens/dist/clients/deps/typebox.js +8 -3
- package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +147 -33
- package/node_modules/pi-lens/dist/clients/diagnostic-line-freshness.js +298 -0
- package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +52 -2
- package/node_modules/pi-lens/dist/clients/dispatch/integration.js +256 -88
- 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/detekt.js +9 -6
- 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/hadolint.js +9 -7
- package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-render.js +895 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/htmlhint.js +8 -6
- 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 +60 -53
- package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +16 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +25 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/oxlint.js +20 -5
- package/node_modules/pi-lens/dist/clients/dispatch/runners/phpstan.js +44 -11
- 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 +17 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +32 -4
- package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +47 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/swiftlint.js +14 -4
- package/node_modules/pi-lens/dist/clients/dispatch/runners/taplo.js +127 -28
- package/node_modules/pi-lens/dist/clients/dispatch/runners/tflint.js +12 -7
- 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 +275 -13
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +21 -6
- 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 +734 -64
- 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 +188 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +9 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/vale.js +21 -10
- package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +18 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +4 -2
- package/node_modules/pi-lens/dist/clients/event-loop-monitor.js +28 -5
- package/node_modules/pi-lens/dist/clients/extension-log.js +22 -1
- package/node_modules/pi-lens/dist/clients/file-kinds.js +8 -2
- package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +316 -0
- package/node_modules/pi-lens/dist/clients/finding-identity.js +88 -0
- 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 +31 -0
- package/node_modules/pi-lens/dist/clients/gitleaks-client.js +181 -8
- package/node_modules/pi-lens/dist/clients/govulncheck-client.js +109 -9
- package/node_modules/pi-lens/dist/clients/grammar-source.js +333 -10
- package/node_modules/pi-lens/dist/clients/host-ports.js +8 -0
- package/node_modules/pi-lens/dist/clients/installer/index.js +1114 -100
- 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 +87 -8
- package/node_modules/pi-lens/dist/clients/knip-client.js +310 -10
- package/node_modules/pi-lens/dist/clients/language-policy.js +8 -2
- package/node_modules/pi-lens/dist/clients/language-profile.js +9 -2
- package/node_modules/pi-lens/dist/clients/latency-logger.js +440 -11
- 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-flag-registry.js +8 -0
- package/node_modules/pi-lens/dist/clients/lsp/cascade-tier.js +128 -8
- package/node_modules/pi-lens/dist/clients/lsp/client.js +1660 -164
- package/node_modules/pi-lens/dist/clients/lsp/diagnostic-binding.js +83 -1
- package/node_modules/pi-lens/dist/clients/lsp/document-drift.js +389 -0
- package/node_modules/pi-lens/dist/clients/lsp/index.js +2423 -151
- 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 +277 -16
- 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 +79 -3
- package/node_modules/pi-lens/dist/clients/lsp/wait-policy/strategies.js +43 -0
- 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/session.js +10 -2
- package/node_modules/pi-lens/dist/clients/module-report.js +22 -1
- package/node_modules/pi-lens/dist/clients/ndjson-logger.js +114 -23
- 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 +154 -33
- 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 +84 -14
- 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/trivy.js +50 -2
- package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +23 -9
- package/node_modules/pi-lens/dist/clients/project-lens-config.js +3 -0
- package/node_modules/pi-lens/dist/clients/project-report.js +62 -27
- 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 +8 -3
- package/node_modules/pi-lens/dist/clients/read-guard.js +253 -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/builder.js +194 -31
- package/node_modules/pi-lens/dist/clients/review-graph/query.js +52 -4
- package/node_modules/pi-lens/dist/clients/review-graph/revision-drift.js +21 -0
- package/node_modules/pi-lens/dist/clients/review-graph/workspace-modules.js +6 -3
- package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +96 -7
- package/node_modules/pi-lens/dist/clients/runtime-context.js +8 -1
- package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +352 -45
- package/node_modules/pi-lens/dist/clients/runtime-session.js +373 -9
- package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +217 -22
- package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +212 -79
- package/node_modules/pi-lens/dist/clients/runtime-turn.js +620 -67
- 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 +157 -24
- package/node_modules/pi-lens/dist/clients/session-event-guard.js +184 -0
- package/node_modules/pi-lens/dist/clients/sg-runner.js +116 -22
- package/node_modules/pi-lens/dist/clients/single-flight.js +158 -0
- package/node_modules/pi-lens/dist/clients/source-filter.js +6 -2
- package/node_modules/pi-lens/dist/clients/stale-marker.js +17 -0
- package/node_modules/pi-lens/dist/clients/startup-scan.js +5 -2
- package/node_modules/pi-lens/dist/clients/startup-timing.js +19 -1
- package/node_modules/pi-lens/dist/clients/test-runner-client.js +151 -16
- package/node_modules/pi-lens/dist/clients/tool-event.js +56 -5
- package/node_modules/pi-lens/dist/clients/tool-policy.js +125 -20
- 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-logger.js +1 -0
- 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/widget-state.js +336 -36
- package/node_modules/pi-lens/dist/clients/zizmor-config.js +214 -14
- package/node_modules/pi-lens/dist/index.js +61407 -48577
- package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +476 -57
- package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +132 -43
- package/node_modules/pi-lens/dist/tools/lsp-navigation.js +46 -7
- package/node_modules/pi-lens/docs/agent-guide.md +6 -1
- package/node_modules/pi-lens/docs/ast-grep_rules_catalog.md +515 -506
- package/node_modules/pi-lens/docs/dispositions.md +21 -0
- package/node_modules/pi-lens/docs/features.md +19 -5
- package/node_modules/pi-lens/docs/globalconfig.md +3 -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 +19 -1
- package/node_modules/pi-lens/docs/usage.md +1 -0
- package/node_modules/pi-lens/package.json +27 -10
- 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 +15 -1
- 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-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 +2 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-apply-test.yml +2 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-get-js-test.yml +2 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-get-test.yml +2 -1
- 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-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 +57 -12
- 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-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 +22 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-apply.yml +23 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-get-js.yml +33 -5
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-get.yml +34 -8
- 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 +6 -1
- 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 +53 -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/scripts/install-selftest.mjs +99 -11
- package/node_modules/pi-lens/scripts/lib/host-provided-deps.mjs +75 -0
- package/node_modules/pi-lens/scripts/lib/warm-loader-cache.mjs +285 -0
- package/node_modules/pi-lens/scripts/warm-loader-cache.mjs +233 -0
- package/node_modules/pi-lens/skills/pi-lens-ast-grep/SKILL.md +2 -0
- package/node_modules/pi-lens/skills/pi-lens-write-ast-grep-rule/SKILL.md +80 -3
- package/node_modules/pi-lens/skills/pi-lens-write-ast-grep-rule/reference.md +41 -0
- package/node_modules/pi-lens/vendor/grammars/tree-sitter-cue.wasm +0 -0
- package/node_modules/pi-mcp-adapter/CHANGELOG.md +36 -0
- package/node_modules/pi-mcp-adapter/README.md +47 -5
- package/node_modules/pi-mcp-adapter/cli.js +163 -1
- package/node_modules/pi-mcp-adapter/commands.ts +128 -22
- package/node_modules/pi-mcp-adapter/config.ts +25 -7
- package/node_modules/pi-mcp-adapter/direct-tools.ts +5 -4
- 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/metadata-cache.ts +32 -21
- package/node_modules/pi-mcp-adapter/package-mcp-loader.ts +168 -0
- package/node_modules/pi-mcp-adapter/package.json +3 -1
- package/node_modules/pi-mcp-adapter/proxy-modes.ts +5 -4
- package/node_modules/pi-mcp-adapter/request-headers-command.ts +31 -37
- package/node_modules/pi-mcp-adapter/search-ranking.ts +92 -22
- package/node_modules/pi-mcp-adapter/server-manager.ts +140 -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-result-renderer.ts +44 -4
- package/node_modules/pi-mcp-adapter/types.ts +2 -0
- 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 +32 -13
- package/node_modules/pi-web-access/anysearch.ts +4 -2
- package/node_modules/pi-web-access/brave.ts +16 -4
- package/node_modules/pi-web-access/chrome-cookies.ts +86 -15
- package/node_modules/pi-web-access/curator-page.ts +6 -3
- package/node_modules/pi-web-access/curator-server.ts +4 -1
- package/node_modules/pi-web-access/data-uri-sanitize.ts +406 -0
- package/node_modules/pi-web-access/exa.ts +18 -7
- package/node_modules/pi-web-access/extract.ts +40 -5
- package/node_modules/pi-web-access/firecrawl.ts +18 -2
- package/node_modules/pi-web-access/gemini-search.ts +16 -4
- package/node_modules/pi-web-access/github-extract.ts +65 -36
- package/node_modules/pi-web-access/index.ts +60 -61
- package/node_modules/pi-web-access/openai-search.ts +17 -6
- package/node_modules/pi-web-access/package.json +1 -1
- 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/pdf-extract.ts +18 -5
- 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/ssrf-protection.ts +12 -2
- package/node_modules/pi-web-access/summary-model-scope.ts +12 -4
- package/node_modules/pi-web-access/summary-review.ts +44 -22
- 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/package.json +14 -14
package/README.md
CHANGED
|
@@ -11,18 +11,20 @@ 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.
|
|
16
|
-
- `@pi-plugins/fast-mode@0.1.
|
|
17
|
-
- `pi-mcp-adapter@2.
|
|
14
|
+
- `@juicesharp/rpiv-ask-user-question@2.7.0`
|
|
15
|
+
- `@narumitw/pi-btw@0.55.1`
|
|
16
|
+
- `@pi-plugins/fast-mode@0.1.10`
|
|
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.1`
|
|
20
|
+
- `pi-web-access@0.24.1`
|
|
21
21
|
- `remote-pi@0.7.0`
|
|
22
22
|
- `@czottmann/pi-automode@1.11.0`
|
|
23
23
|
|
|
24
24
|
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.
|
|
25
25
|
|
|
26
|
+
`pi-lens@4.1.1` improves diagnostics, cache, and LSP observability; prevents session-switch crashes; restores oxlint warnings; speeds large ignored-tree scans; and retries failed log writes once.
|
|
27
|
+
|
|
26
28
|
If `pi-footer` was installed separately before upgrading to an aggregate release that includes it, remove the standalone source shown by `pi list` so only the bundled copy loads. For the pinned standalone install used while preparing this integration:
|
|
27
29
|
|
|
28
30
|
```bash
|
|
@@ -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
|
|
@@ -101,5 +101,5 @@ bun run typecheck
|
|
|
101
101
|
|
|
102
102
|
## Credits
|
|
103
103
|
|
|
104
|
-
- Derived from [`minuque/pi-cc-extensions`](https://github.com/minuque/pi-cc-extensions) under the MIT license.
|
|
104
|
+
- Derived from [`minuque/pi-cc-extensions` v0.8.64](https://github.com/minuque/pi-cc-extensions/releases/tag/v0.8.64) (`4709081`) under the MIT license.
|
|
105
105
|
- 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).
|
|
@@ -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 摘要作为思考标题
|
|
@@ -101,5 +101,5 @@ bun run typecheck
|
|
|
101
101
|
|
|
102
102
|
## 致谢
|
|
103
103
|
|
|
104
|
-
- 基于 MIT 许可的 [`minuque/pi-cc-extensions`](https://github.com/minuque/pi-cc-extensions)
|
|
104
|
+
- 基于 MIT 许可的 [`minuque/pi-cc-extensions` v0.8.64](https://github.com/minuque/pi-cc-extensions/releases/tag/v0.8.64)(`4709081`)衍生维护。
|
|
105
105
|
- 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)。
|
|
@@ -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,316 @@ 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
|
+
expandedWrapCache.clear();
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
type ExpandedWrapEntry = { text: string; lines: string[] };
|
|
203
|
+
const expandedWrapCache = new Map<string, ExpandedWrapEntry>();
|
|
204
|
+
export const THINKING_EXPANDED_WRAP_CACHE_MAX = 64;
|
|
205
|
+
|
|
206
|
+
export function thinkingRunKey(messageTimestamp: number, runStartIndex: number): string {
|
|
207
|
+
return `${messageTimestamp}:${runStartIndex}`;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function expandedWrapKey(messageTimestamp: number, runStartIndex: number, width: number): string {
|
|
211
|
+
return `${thinkingRunKey(messageTimestamp, runStartIndex)}:${width}`;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function wrapExpandedThinking(
|
|
215
|
+
messageTimestamp: number,
|
|
216
|
+
runStartIndex: number,
|
|
217
|
+
text: string,
|
|
218
|
+
width: number,
|
|
219
|
+
): string[] {
|
|
220
|
+
const key = expandedWrapKey(messageTimestamp, runStartIndex, width);
|
|
221
|
+
const hit = expandedWrapCache.get(key);
|
|
222
|
+
if (hit && hit.text === text) {
|
|
223
|
+
expandedWrapCache.delete(key);
|
|
224
|
+
expandedWrapCache.set(key, hit);
|
|
225
|
+
return hit.lines;
|
|
226
|
+
}
|
|
227
|
+
const lines = wrapTextWithAnsi(text.replace(/\t/g, " "), Math.max(1, width));
|
|
228
|
+
expandedWrapCache.delete(key);
|
|
229
|
+
while (expandedWrapCache.size >= THINKING_EXPANDED_WRAP_CACHE_MAX) {
|
|
230
|
+
const oldest = expandedWrapCache.keys().next().value;
|
|
231
|
+
if (oldest === undefined) break;
|
|
232
|
+
expandedWrapCache.delete(oldest);
|
|
233
|
+
}
|
|
234
|
+
expandedWrapCache.set(key, { text, lines });
|
|
235
|
+
return lines;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function evictExpandedWraps(messageTimestamp: number, runStartIndex: number): void {
|
|
239
|
+
const prefix = `${thinkingRunKey(messageTimestamp, runStartIndex)}:`;
|
|
240
|
+
for (const key of expandedWrapCache.keys()) {
|
|
241
|
+
if (key.startsWith(prefix)) expandedWrapCache.delete(key);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
export function thinkingPreviewCacheSize(): number {
|
|
246
|
+
return previewCache.size;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
export function thinkingExpandedWrapCacheSize(): number {
|
|
250
|
+
return expandedWrapCache.size;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/** 按可见宽度估算折行数,不走 Text 全量 wrap。无换行长段也能计到隐藏行。 */
|
|
254
|
+
function countWrappedLines(text: string, contentWidth: number): number {
|
|
255
|
+
if (!text) return 0;
|
|
256
|
+
const width = Math.max(1, contentWidth);
|
|
257
|
+
let lines = 0;
|
|
258
|
+
for (const raw of text.replace(/\t/g, " ").split(/\r\n|\r|\n/)) {
|
|
259
|
+
const w = visibleWidth(raw);
|
|
260
|
+
lines += w === 0 ? 1 : Math.ceil(w / width);
|
|
261
|
+
}
|
|
262
|
+
return lines;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
function padPreviewLine(line: string, width: number, padding: number): string {
|
|
266
|
+
const left = padding > 0 ? " ".repeat(padding) : "";
|
|
267
|
+
const right = padding > 0 ? " ".repeat(padding) : "";
|
|
268
|
+
const withMargins = left + line + right;
|
|
269
|
+
return withMargins + " ".repeat(Math.max(0, width - visibleWidth(withMargins)));
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
function layoutThinkingPreview(
|
|
273
|
+
text: string,
|
|
274
|
+
width: number,
|
|
275
|
+
padding: number,
|
|
276
|
+
): { visible: string[]; hiddenLines: number } {
|
|
277
|
+
if (!text || config.previewLines <= 0) return { visible: [], hiddenLines: 0 };
|
|
278
|
+
const contentWidth = Math.max(1, width - padding * 2);
|
|
279
|
+
const budget = Math.max(
|
|
280
|
+
width * (config.previewLines + PREVIEW_BUDGET_SLACK_LINES),
|
|
281
|
+
PREVIEW_BUDGET_MIN_CHARS,
|
|
282
|
+
);
|
|
283
|
+
let source = text;
|
|
284
|
+
let cut = 0;
|
|
285
|
+
if (source.length > budget) {
|
|
286
|
+
const start = source.length - budget;
|
|
287
|
+
const newline = source.indexOf("\n", start);
|
|
288
|
+
cut = newline === -1 ? start : newline + 1;
|
|
289
|
+
if (cut < source.length) source = source.slice(cut);
|
|
290
|
+
else cut = 0;
|
|
291
|
+
}
|
|
292
|
+
const cacheKey = `${width}:${padding}:${cut}:${source}`;
|
|
293
|
+
let entry = getCachedPreview(cacheKey);
|
|
294
|
+
if (!entry) {
|
|
295
|
+
entry = {
|
|
296
|
+
lines: wrapTextWithAnsi(source.replace(/\t/g, " "), contentWidth),
|
|
297
|
+
hiddenBefore: cut > 0 ? countWrappedLines(text.slice(0, cut), contentWidth) : 0,
|
|
298
|
+
};
|
|
299
|
+
cachePreview(cacheKey, entry);
|
|
300
|
+
}
|
|
301
|
+
const hiddenLines = entry.hiddenBefore + Math.max(0, entry.lines.length - config.previewLines);
|
|
302
|
+
const visible = hiddenLines > 0 ? entry.lines.slice(-config.previewLines) : entry.lines;
|
|
303
|
+
return { visible, hiddenLines };
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
function hiddenPreviewHint(
|
|
307
|
+
hiddenLines: number,
|
|
308
|
+
forceExpandHint = false,
|
|
309
|
+
): { prefix: string; action: string; suffix: string } | undefined {
|
|
310
|
+
const action = thinkingExpandAction() ?? "";
|
|
311
|
+
if (hiddenLines > 0) {
|
|
312
|
+
const noun = hiddenLines === 1 ? "line" : "lines";
|
|
313
|
+
return {
|
|
314
|
+
prefix: ` • (${hiddenLines} more ${noun}${action ? ", " : ""}`,
|
|
315
|
+
action,
|
|
316
|
+
suffix: ")",
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
if (forceExpandHint && isToolTuiFullscreen()) {
|
|
320
|
+
return { prefix: " • ", action: "click to show more", suffix: "" };
|
|
321
|
+
}
|
|
322
|
+
return undefined;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
const expandedThinking = new Set<string>();
|
|
326
|
+
|
|
327
|
+
/** 折叠预览 + 展开全文。fullscreen 点击 hint 展开、双击整块收起,对齐工具卡。 */
|
|
328
|
+
export class ThinkingPreviewBlock implements Component {
|
|
329
|
+
private heading: string;
|
|
163
330
|
private text: string;
|
|
164
331
|
private padding: number;
|
|
332
|
+
readonly messageTimestamp: number;
|
|
333
|
+
readonly runStartIndex: number;
|
|
165
334
|
private style: (text: string) => string;
|
|
166
|
-
|
|
167
|
-
|
|
335
|
+
private theme: Theme | undefined;
|
|
336
|
+
private _expanded: boolean;
|
|
337
|
+
private hintHovered = false;
|
|
338
|
+
private collapsedMemo:
|
|
339
|
+
| {
|
|
340
|
+
width: number;
|
|
341
|
+
previewLines: number;
|
|
342
|
+
hintHovered: boolean;
|
|
343
|
+
expandAction: string | undefined;
|
|
344
|
+
lines: string[];
|
|
345
|
+
}
|
|
346
|
+
| undefined;
|
|
347
|
+
|
|
348
|
+
constructor(
|
|
349
|
+
heading: string,
|
|
350
|
+
text: string,
|
|
351
|
+
padding: number,
|
|
352
|
+
messageTimestamp: number,
|
|
353
|
+
style: (text: string) => string,
|
|
354
|
+
theme?: Theme,
|
|
355
|
+
runStartIndex = 0,
|
|
356
|
+
) {
|
|
357
|
+
this.heading = heading;
|
|
168
358
|
this.text = text;
|
|
169
359
|
this.padding = padding;
|
|
360
|
+
this.messageTimestamp = messageTimestamp;
|
|
361
|
+
this.runStartIndex = runStartIndex;
|
|
170
362
|
this.style = style;
|
|
363
|
+
this.theme = theme;
|
|
364
|
+
this._expanded = expandedThinking.has(thinkingRunKey(messageTimestamp, runStartIndex));
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
private paint(color: string, text: string): string {
|
|
368
|
+
return this.theme && typeof this.theme.fg === "function"
|
|
369
|
+
? this.theme.fg(color as never, text)
|
|
370
|
+
: text;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
get expanded(): boolean {
|
|
374
|
+
return this._expanded;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
setExpanded(expanded: boolean): void {
|
|
378
|
+
if (this._expanded !== expanded) this.collapsedMemo = undefined;
|
|
379
|
+
this._expanded = expanded;
|
|
380
|
+
const key = thinkingRunKey(this.messageTimestamp, this.runStartIndex);
|
|
381
|
+
if (expanded) expandedThinking.add(key);
|
|
382
|
+
else {
|
|
383
|
+
expandedThinking.delete(key);
|
|
384
|
+
evictExpandedWraps(this.messageTimestamp, this.runStartIndex);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
setHintHovered(hovered: boolean): void {
|
|
389
|
+
if (this.hintHovered !== hovered) this.collapsedMemo = undefined;
|
|
390
|
+
this.hintHovered = hovered;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
private headingLines(width: number, hiddenLines: number, padding: number): string[] {
|
|
394
|
+
const hint = this._expanded
|
|
395
|
+
? undefined
|
|
396
|
+
: hiddenPreviewHint(hiddenLines, Boolean(this.text) && config.previewLines <= 0);
|
|
397
|
+
if (!hint) return new Text(this.heading, padding, 0).render(width);
|
|
398
|
+
const rawHint = hint.prefix + hint.action + hint.suffix;
|
|
399
|
+
const contentWidth = Math.max(1, width - padding * 2);
|
|
400
|
+
const headingBudget = Math.max(0, contentWidth - visibleWidth(rawHint));
|
|
401
|
+
const clipped =
|
|
402
|
+
visibleWidth(this.heading) > headingBudget
|
|
403
|
+
? truncateToWidth(this.heading, headingBudget, "")
|
|
404
|
+
: this.heading;
|
|
405
|
+
const action = this.paint(this.hintHovered ? "text" : "dim", hint.action);
|
|
406
|
+
return new Text(
|
|
407
|
+
clipped + this.paint("dim", hint.prefix) + action + this.paint("dim", hint.suffix),
|
|
408
|
+
padding,
|
|
409
|
+
0,
|
|
410
|
+
).render(width);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
private bodyLines(width: number, padding: number): { lines: string[]; hiddenLines: number } {
|
|
414
|
+
if (!this.text || (config.previewLines <= 0 && !this._expanded)) {
|
|
415
|
+
return { lines: [], hiddenLines: 0 };
|
|
416
|
+
}
|
|
417
|
+
if (this._expanded) {
|
|
418
|
+
return {
|
|
419
|
+
lines: wrapExpandedThinking(this.messageTimestamp, this.runStartIndex, this.text, width),
|
|
420
|
+
hiddenLines: 0,
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
const preview = layoutThinkingPreview(this.text, width, padding);
|
|
424
|
+
return { lines: preview.visible, hiddenLines: preview.hiddenLines };
|
|
171
425
|
}
|
|
172
426
|
|
|
173
427
|
render(width: number) {
|
|
174
|
-
|
|
175
|
-
|
|
428
|
+
if (this._expanded) {
|
|
429
|
+
const innerWidth = Math.max(1, width - 2);
|
|
430
|
+
const body = this.bodyLines(innerWidth, 0);
|
|
431
|
+
const heading = this.headingLines(innerWidth, 0, 0);
|
|
432
|
+
const inner = body.lines.length
|
|
433
|
+
? [...heading, ...body.lines.map((line) => this.style(line))]
|
|
434
|
+
: heading;
|
|
435
|
+
const bgFn =
|
|
436
|
+
this.theme && typeof this.theme.bg === "function"
|
|
437
|
+
? (text: string) => this.theme!.bg("userMessageBg" as never, text)
|
|
438
|
+
: undefined;
|
|
439
|
+
const box = new Box(1, 1, bgFn);
|
|
440
|
+
box.addChild({
|
|
441
|
+
render: () => inner,
|
|
442
|
+
invalidate() {},
|
|
443
|
+
});
|
|
444
|
+
return box.render(width);
|
|
445
|
+
}
|
|
176
446
|
|
|
177
|
-
const
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
447
|
+
const expandAction = thinkingExpandAction();
|
|
448
|
+
if (
|
|
449
|
+
this.collapsedMemo?.width === width &&
|
|
450
|
+
this.collapsedMemo.previewLines === config.previewLines &&
|
|
451
|
+
this.collapsedMemo.hintHovered === this.hintHovered &&
|
|
452
|
+
this.collapsedMemo.expandAction === expandAction
|
|
453
|
+
) {
|
|
454
|
+
return this.collapsedMemo.lines;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
const body = this.bodyLines(width, this.padding);
|
|
458
|
+
const heading = this.headingLines(width, body.hiddenLines, this.padding);
|
|
459
|
+
const lines = body.lines.length
|
|
460
|
+
? [
|
|
461
|
+
...heading,
|
|
462
|
+
...body.lines.map((line) => padPreviewLine(this.style(line), width, this.padding)),
|
|
463
|
+
]
|
|
464
|
+
: heading;
|
|
465
|
+
this.collapsedMemo = {
|
|
466
|
+
width,
|
|
467
|
+
previewLines: config.previewLines,
|
|
468
|
+
hintHovered: this.hintHovered,
|
|
469
|
+
expandAction,
|
|
470
|
+
lines,
|
|
471
|
+
};
|
|
472
|
+
return lines;
|
|
183
473
|
}
|
|
184
474
|
|
|
185
|
-
invalidate() {
|
|
475
|
+
invalidate() {
|
|
476
|
+
this.collapsedMemo = undefined;
|
|
477
|
+
}
|
|
186
478
|
}
|
|
187
479
|
|
|
188
480
|
function parseSummaryPart(text: string): SummaryPart | undefined {
|
|
@@ -456,14 +748,18 @@ function compactThinking(pi: ExtensionAPI) {
|
|
|
456
748
|
durationText ? `Thought for ${durationText}` : (latestSummary?.title ?? "Thought"),
|
|
457
749
|
);
|
|
458
750
|
}
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
751
|
+
const previewSource = (latestSummary?.body ?? thinkingBlocks.join("\n\n")).trim();
|
|
752
|
+
self.contentContainer.addChild(
|
|
753
|
+
new ThinkingPreviewBlock(
|
|
754
|
+
heading,
|
|
755
|
+
previewSource,
|
|
756
|
+
self.outputPad,
|
|
757
|
+
message.timestamp,
|
|
758
|
+
thinkingStyle,
|
|
759
|
+
activeTheme,
|
|
760
|
+
runStartIndex,
|
|
761
|
+
),
|
|
762
|
+
);
|
|
467
763
|
|
|
468
764
|
const hasVisibleContentAfter = message.content
|
|
469
765
|
.slice(i + 1)
|
|
@@ -728,6 +1024,8 @@ function compactThinking(pi: ExtensionAPI) {
|
|
|
728
1024
|
latestComponentTimestamp = undefined;
|
|
729
1025
|
completedDurations.clear();
|
|
730
1026
|
streamingComponents.clear();
|
|
1027
|
+
expandedThinking.clear();
|
|
1028
|
+
clearThinkingPreviewCache();
|
|
731
1029
|
if (ctx.mode === "tui") ctx.ui.setWidget(WIDGET_ID, undefined);
|
|
732
1030
|
|
|
733
1031
|
if (patchInstalled) {
|