@herbertgao/pi-extensions 2026.8.6 → 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 +1 -1
- package/node_modules/@herbertgao/pi-cc-extensions/README.md +1 -1
- 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/renderer/compact-mode.ts +94 -77
- 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 +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 +1 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/ask-user-question.ts +26 -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 +2 -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 +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-lens/CHANGELOG.md +909 -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 +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 +285 -8
- 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 +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/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 +62 -13
- package/node_modules/pi-lens/dist/clients/dependency-checker.js +25 -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/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 +60 -53
- 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 +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 +72 -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 +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/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 +294 -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 +82 -6
- 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 +2 -0
- 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 +102 -7
- package/node_modules/pi-lens/dist/clients/lsp/client.js +1516 -159
- 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 +2274 -147
- 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 +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 +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 +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 +52 -4
- 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 +308 -45
- package/node_modules/pi-lens/dist/clients/runtime-session.js +332 -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 +575 -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/sg-runner.js +116 -22
- package/node_modules/pi-lens/dist/clients/single-flight.js +158 -0
- package/node_modules/pi-lens/dist/clients/stale-marker.js +17 -0
- 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-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 +67738 -55739
- package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +466 -54
- 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 +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 +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/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 +23 -0
- package/node_modules/pi-web-access/README.md +27 -9
- 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/curator-page.ts +6 -3
- package/node_modules/pi-web-access/curator-server.ts +4 -1
- package/node_modules/pi-web-access/exa.ts +18 -7
- package/node_modules/pi-web-access/extract.ts +28 -3
- package/node_modules/pi-web-access/gemini-search.ts +16 -4
- package/node_modules/pi-web-access/index.ts +41 -57
- 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/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 +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 +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.6.
|
|
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.0
|
|
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
|
|
|
@@ -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
|
|
@@ -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) {
|