@herbertgao/pi-extensions 2026.8.5 → 2026.8.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +2 -2
- package/node_modules/@herbertgao/pi-cc-extensions/README.md +2 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +19 -7
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +30 -9
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +272 -22
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/context.ts +74 -5
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +94 -77
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/markdown-enhance.ts +48 -6
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/message-display.ts +1 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/hover.ts +14 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/interaction.ts +55 -17
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/layout.ts +41 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-renderer.ts +75 -6
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/types.ts +7 -3
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +64 -1
- package/node_modules/@herbertgao/pi-cc-extensions/package.json +3 -3
- package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +16 -0
- package/node_modules/@herbertgao/pi-subagents/README.md +30 -22
- package/node_modules/@herbertgao/pi-subagents/examples/agent-tool-description.md +5 -5
- package/node_modules/@herbertgao/pi-subagents/package.json +7 -7
- package/node_modules/@herbertgao/pi-subagents/src/agent-file-toggle.ts +7 -1
- package/node_modules/@herbertgao/pi-subagents/src/agent-manager.ts +48 -19
- package/node_modules/@herbertgao/pi-subagents/src/agent-runner.ts +22 -15
- package/node_modules/@herbertgao/pi-subagents/src/custom-agents.ts +26 -2
- package/node_modules/@herbertgao/pi-subagents/src/index.ts +219 -40
- package/node_modules/@herbertgao/pi-subagents/src/invocation-config.ts +101 -3
- package/node_modules/@herbertgao/pi-subagents/src/nested-tools.ts +18 -4
- package/node_modules/@herbertgao/pi-subagents/src/settings.ts +99 -0
- package/node_modules/@herbertgao/pi-subagents/src/types.ts +22 -3
- package/node_modules/@herbertgao/pi-subagents/src/ui/agent-widget.ts +51 -3
- package/node_modules/@herbertgao/pi-subagents/src/ui/conversation-viewer.ts +20 -2
- package/node_modules/@herbertgao/pi-subagents/src/ui/fleet-list.ts +34 -10
- package/node_modules/@herbertgao/pi-subagents/src/usage.ts +129 -1
- package/node_modules/@herbertgao/pi-subagents/src/worktree.ts +29 -5
- package/node_modules/@juicesharp/rpiv-ask-user-question/README.md +3 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/ask-user-question.ts +46 -10
- package/node_modules/@juicesharp/rpiv-ask-user-question/config.ts +25 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/configuration.md +13 -4
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/hosts.md +8 -1
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/localization.md +3 -1
- package/node_modules/@juicesharp/rpiv-ask-user-question/locales/en.json +2 -2
- package/node_modules/@juicesharp/rpiv-ask-user-question/locales/zh.json +2 -2
- package/node_modules/@juicesharp/rpiv-ask-user-question/package.json +3 -2
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/build-questionnaire.ts +10 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/key-router.ts +3 -1
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/questionnaire-session.ts +30 -7
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/state.ts +14 -6
- package/node_modules/@juicesharp/rpiv-ask-user-question/view/dialog-builder.ts +30 -4
- package/node_modules/@juicesharp/rpiv-ask-user-question/view/tab-content-strategy.ts +26 -5
- package/node_modules/@narumitw/pi-btw/README.md +119 -103
- package/node_modules/@narumitw/pi-btw/dist/index.ts +2898 -0
- package/node_modules/@narumitw/pi-btw/dist/index.ts.map +7 -0
- package/node_modules/@narumitw/pi-btw/package.json +13 -9
- package/node_modules/@narumitw/pi-btw/src/btw.ts +40 -42
- package/node_modules/@narumitw/pi-btw/src/fullscreen-ui.ts +55 -10
- package/node_modules/@narumitw/pi-btw/src/main-tree-picker.ts +390 -0
- package/node_modules/@narumitw/pi-btw/src/menu.ts +78 -15
- package/node_modules/@narumitw/pi-btw/src/settings.ts +22 -2
- package/node_modules/@narumitw/pi-btw/src/transcript-pager.ts +136 -45
- package/node_modules/pi-lens/CHANGELOG.md +1004 -0
- package/node_modules/pi-lens/README.md +11 -3
- package/node_modules/pi-lens/config/ruff/core.toml +42 -0
- package/node_modules/pi-lens/dist/clients/actionable-warnings.js +130 -27
- package/node_modules/pi-lens/dist/clients/advisory-provenance.js +427 -0
- package/node_modules/pi-lens/dist/clients/agent-nudge.js +79 -16
- package/node_modules/pi-lens/dist/clients/ast-grep-client.js +9 -3
- package/node_modules/pi-lens/dist/clients/atomic-write.js +9 -3
- package/node_modules/pi-lens/dist/clients/bash-file-access.js +285 -8
- package/node_modules/pi-lens/dist/clients/biome-client.js +176 -37
- package/node_modules/pi-lens/dist/clients/blocker-freshness.js +428 -0
- package/node_modules/pi-lens/dist/clients/blocker-past-eof.js +119 -0
- package/node_modules/pi-lens/dist/clients/bootstrap.js +12 -1
- package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +12 -3
- package/node_modules/pi-lens/dist/clients/bounded-telemetry.js +192 -0
- package/node_modules/pi-lens/dist/clients/bus-events-logger.js +62 -6
- package/node_modules/pi-lens/dist/clients/bus-publish.js +11 -3
- package/node_modules/pi-lens/dist/clients/cascade-budget.js +196 -0
- package/node_modules/pi-lens/dist/clients/cascade-format.js +76 -2
- package/node_modules/pi-lens/dist/clients/cascade-types.js +9 -1
- package/node_modules/pi-lens/dist/clients/child-unref.js +54 -6
- package/node_modules/pi-lens/dist/clients/code-quality-warnings.js +76 -24
- package/node_modules/pi-lens/dist/clients/console-guard-install.js +16 -4
- package/node_modules/pi-lens/dist/clients/dead-code-client.js +249 -52
- package/node_modules/pi-lens/dist/clients/deadline-utils.js +8 -1
- package/node_modules/pi-lens/dist/clients/debug-handles.js +5 -0
- package/node_modules/pi-lens/dist/clients/degradation-ledger.js +62 -13
- package/node_modules/pi-lens/dist/clients/dependency-checker.js +43 -9
- package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +153 -37
- package/node_modules/pi-lens/dist/clients/diagnostic-line-freshness.js +298 -0
- package/node_modules/pi-lens/dist/clients/diagnostics-publish.js +10 -3
- package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +165 -11
- package/node_modules/pi-lens/dist/clients/dispatch/integration.js +325 -72
- package/node_modules/pi-lens/dist/clients/dispatch/lazy.js +7 -4
- package/node_modules/pi-lens/dist/clients/dispatch/plan.js +5 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ast-grep-napi.js +234 -18
- package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +187 -19
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +6 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/credo.js +11 -9
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cue-vet.js +398 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +11 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +12 -7
- package/node_modules/pi-lens/dist/clients/dispatch/runners/go-vet.js +18 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-render.js +895 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/index.js +4 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +16 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +81 -41
- package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +16 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +23 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +331 -55
- package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +38 -5
- package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +97 -19
- package/node_modules/pi-lens/dist/clients/dispatch/runners/spellcheck.js +14 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +20 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +22 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/swiftlint.js +10 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/taplo.js +18 -6
- package/node_modules/pi-lens/dist/clients/dispatch/runners/trivy-config.js +73 -12
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/availability-policy.js +488 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +84 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +260 -27
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +943 -93
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +86 -11
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/tool-failure.js +72 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +106 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/vale.js +9 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +18 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +4 -2
- package/node_modules/pi-lens/dist/clients/disposition-publish.js +10 -3
- package/node_modules/pi-lens/dist/clients/eval-timestamp.js +17 -0
- package/node_modules/pi-lens/dist/clients/event-loop-monitor.js +28 -5
- package/node_modules/pi-lens/dist/clients/extension-log.js +317 -3
- package/node_modules/pi-lens/dist/clients/file-kinds.js +8 -2
- package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +294 -0
- package/node_modules/pi-lens/dist/clients/finding-identity.js +88 -0
- package/node_modules/pi-lens/dist/clients/fix-worklog.js +5 -1
- package/node_modules/pi-lens/dist/clients/format-events-publish.js +39 -8
- package/node_modules/pi-lens/dist/clients/formatters-lazy.js +3 -2
- package/node_modules/pi-lens/dist/clients/formatters.js +500 -115
- package/node_modules/pi-lens/dist/clients/generation-guard.js +216 -0
- package/node_modules/pi-lens/dist/clients/git-guard.js +49 -21
- package/node_modules/pi-lens/dist/clients/gitleaks-client.js +181 -8
- package/node_modules/pi-lens/dist/clients/go-client.js +21 -39
- package/node_modules/pi-lens/dist/clients/govulncheck-client.js +219 -10
- package/node_modules/pi-lens/dist/clients/grammar-source.js +333 -10
- package/node_modules/pi-lens/dist/clients/host-ports.js +9 -1
- package/node_modules/pi-lens/dist/clients/installer/index.js +1119 -101
- package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh-session.js +58 -0
- package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh.js +715 -0
- package/node_modules/pi-lens/dist/clients/instance-reaper.js +643 -97
- package/node_modules/pi-lens/dist/clients/instance-registry.js +87 -17
- package/node_modules/pi-lens/dist/clients/jscpd-client.js +86 -15
- package/node_modules/pi-lens/dist/clients/knip-client.js +361 -24
- package/node_modules/pi-lens/dist/clients/language-policy.js +8 -2
- package/node_modules/pi-lens/dist/clients/language-profile.js +2 -0
- package/node_modules/pi-lens/dist/clients/latency-logger.js +487 -9
- package/node_modules/pi-lens/dist/clients/lazy-import.js +21 -0
- package/node_modules/pi-lens/dist/clients/ledger-bounds.js +21 -0
- package/node_modules/pi-lens/dist/clients/lens-events.js +56 -25
- package/node_modules/pi-lens/dist/clients/lens-flag-registry.js +16 -0
- package/node_modules/pi-lens/dist/clients/live-bus-emitter.js +45 -2
- package/node_modules/pi-lens/dist/clients/lsp/aggregation.js +30 -4
- package/node_modules/pi-lens/dist/clients/lsp/cascade-tier.js +160 -20
- package/node_modules/pi-lens/dist/clients/lsp/client.js +1666 -148
- package/node_modules/pi-lens/dist/clients/lsp/diagnostic-binding.js +111 -0
- package/node_modules/pi-lens/dist/clients/lsp/document-drift.js +389 -0
- package/node_modules/pi-lens/dist/clients/lsp/index.js +2496 -171
- package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +215 -0
- package/node_modules/pi-lens/dist/clients/lsp/jvm-runtime.js +146 -14
- package/node_modules/pi-lens/dist/clients/lsp/language.js +48 -4
- package/node_modules/pi-lens/dist/clients/lsp/server.js +517 -69
- package/node_modules/pi-lens/dist/clients/lsp/spawn-history.js +22 -0
- package/node_modules/pi-lens/dist/clients/lsp/sync-kind.js +43 -0
- package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +172 -0
- package/node_modules/pi-lens/dist/clients/lsp/wait-policy/classification.js +21 -5
- package/node_modules/pi-lens/dist/clients/lsp/wait-policy/strategies.js +61 -3
- package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +422 -28
- package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-session.js +30 -0
- package/node_modules/pi-lens/dist/clients/lsp/workspace-sweep-hold.js +175 -0
- package/node_modules/pi-lens/dist/clients/lsp-lazy.js +3 -2
- package/node_modules/pi-lens/dist/clients/mcp/analyze.js +4 -0
- package/node_modules/pi-lens/dist/clients/mcp/session.js +39 -18
- package/node_modules/pi-lens/dist/clients/model-provider.js +53 -0
- package/node_modules/pi-lens/dist/clients/module-report.js +8 -0
- package/node_modules/pi-lens/dist/clients/opengrep-client.js +15 -1
- package/node_modules/pi-lens/dist/clients/package-manager.js +170 -14
- package/node_modules/pi-lens/dist/clients/path-attribution-telemetry.js +27 -0
- package/node_modules/pi-lens/dist/clients/path-utils.js +160 -0
- package/node_modules/pi-lens/dist/clients/pipeline.js +178 -30
- package/node_modules/pi-lens/dist/clients/post-autofix-notice.js +37 -0
- package/node_modules/pi-lens/dist/clients/project-diagnostics/cache.js +17 -3
- package/node_modules/pi-lens/dist/clients/project-diagnostics/extractors.js +89 -22
- package/node_modules/pi-lens/dist/clients/project-diagnostics/fresh-fetch.js +85 -15
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +15 -3
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +23 -2
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +50 -2
- package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +5 -0
- package/node_modules/pi-lens/dist/clients/project-lens-config.js +3 -0
- package/node_modules/pi-lens/dist/clients/project-snapshot.js +299 -0
- package/node_modules/pi-lens/dist/clients/quiet-window-config.js +47 -0
- package/node_modules/pi-lens/dist/clients/quiet-window.js +11 -25
- package/node_modules/pi-lens/dist/clients/read-guard-logger.js +1 -1
- package/node_modules/pi-lens/dist/clients/read-guard.js +184 -10
- package/node_modules/pi-lens/dist/clients/resource-sampler.js +49 -17
- package/node_modules/pi-lens/dist/clients/reverse-deps.js +50 -11
- package/node_modules/pi-lens/dist/clients/review-graph/query.js +76 -4
- package/node_modules/pi-lens/dist/clients/run-duration.js +55 -0
- package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +248 -13
- package/node_modules/pi-lens/dist/clients/runtime-context.js +112 -12
- package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +472 -61
- package/node_modules/pi-lens/dist/clients/runtime-session.js +359 -13
- package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +217 -22
- package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +269 -22
- package/node_modules/pi-lens/dist/clients/runtime-turn.js +948 -87
- package/node_modules/pi-lens/dist/clients/rust-client.js +21 -37
- package/node_modules/pi-lens/dist/clients/safe-spawn.js +220 -7
- package/node_modules/pi-lens/dist/clients/scratch-tree-policy.js +161 -0
- package/node_modules/pi-lens/dist/clients/search-read-registration.js +34 -6
- package/node_modules/pi-lens/dist/clients/security-scan-client.js +224 -8
- package/node_modules/pi-lens/dist/clients/sg-runner.js +249 -37
- package/node_modules/pi-lens/dist/clients/single-flight.js +158 -0
- package/node_modules/pi-lens/dist/clients/smells-rollup.js +18 -11
- package/node_modules/pi-lens/dist/clients/stale-marker.js +17 -0
- package/node_modules/pi-lens/dist/clients/startup-timing.js +26 -2
- package/node_modules/pi-lens/dist/clients/test-runner-client.js +574 -32
- package/node_modules/pi-lens/dist/clients/tool-event.js +56 -5
- package/node_modules/pi-lens/dist/clients/tool-policy.js +127 -20
- package/node_modules/pi-lens/dist/clients/tool-set-policy.js +76 -0
- package/node_modules/pi-lens/dist/clients/tree-sitter-cache.js +75 -1
- package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +769 -64
- package/node_modules/pi-lens/dist/clients/tree-sitter-shared.js +11 -0
- package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +90 -0
- package/node_modules/pi-lens/dist/clients/trivy-client.js +19 -1
- package/node_modules/pi-lens/dist/clients/warm-attach.js +17 -0
- package/node_modules/pi-lens/dist/clients/widget-state.js +336 -36
- package/node_modules/pi-lens/dist/clients/word-index.js +305 -33
- package/node_modules/pi-lens/dist/clients/zizmor-config.js +214 -14
- package/node_modules/pi-lens/dist/index.js +64677 -49484
- package/node_modules/pi-lens/dist/mcp/server.js +8 -2
- package/node_modules/pi-lens/dist/tools/activate-tools.js +17 -5
- package/node_modules/pi-lens/dist/tools/ast-grep-replace.js +9 -4
- package/node_modules/pi-lens/dist/tools/lens-diagnostic-mark.js +5 -2
- package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +469 -56
- package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +190 -46
- package/node_modules/pi-lens/dist/tools/lsp-navigation.js +46 -7
- package/node_modules/pi-lens/dist/tools/symbol-search.js +1 -1
- package/node_modules/pi-lens/docs/agent-guide.md +44 -14
- package/node_modules/pi-lens/docs/ast-grep_rules_catalog.md +518 -501
- package/node_modules/pi-lens/docs/dispositions.md +21 -0
- package/node_modules/pi-lens/docs/features.md +33 -6
- package/node_modules/pi-lens/docs/globalconfig.md +14 -0
- package/node_modules/pi-lens/docs/language-coverage.md +71 -5
- package/node_modules/pi-lens/docs/mcp.md +2 -2
- package/node_modules/pi-lens/docs/servercapabilities.md +4 -1
- package/node_modules/pi-lens/docs/settings.md +25 -1
- package/node_modules/pi-lens/docs/usage.md +24 -5
- package/node_modules/pi-lens/docs/word-index.md +35 -0
- package/node_modules/pi-lens/package.json +10 -6
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/__snapshots__/no-reflect-get-js-snapshot.yml +23 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/__snapshots__/no-reflect-get-snapshot.yml +23 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/__snapshots__/ts-void-zero-snapshot.yml +23 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-bare-object-param-test.yml +16 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-chained-type-assertions-test.yml +22 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-compile-call-test.yml +29 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-conditional-empty-object-spread-js-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-conditional-empty-object-spread-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-dupe-class-members-test.yml +33 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-inner-html-js-test.yml +7 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-inner-html-test.yml +7 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-known-value-widening-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-non-null-assertion-test.yml +216 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-apply-js-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-apply-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-get-js-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-get-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-return-value-in-generator-test.yml +12 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-runtime-typeof-test.yml +33 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-server-bind-wildcard-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-shape-in-symbol-names-test.yml +13 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-sql-in-code-js-test.yml +5 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-sql-in-code-test.yml +5 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unknown-laundering-test.yml +11 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unknown-parameters-test.yml +12 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unknown-returns-test.yml +16 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unsafe-dictionary-any-test.yml +10 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unsafe-dictionary-unknown-test.yml +8 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/redundant-unsafe-function-test.yml +35 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/require-safety-comment-for-as-unknown-as-test.yml +177 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/ts-void-zero-test.yml +1 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-await-expression-member-js.yml +13 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-await-expression-member.yml +13 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-bare-host-path-in-win32-branch.yml +2 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-bare-object-param.yml +60 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-chained-type-assertions.yml +66 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-compile-call.yml +63 -5
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-conditional-empty-object-spread-js.yml +21 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-conditional-empty-object-spread.yml +29 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-dupe-class-members.yml +52 -8
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-inner-html-js.yml +27 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-inner-html.yml +27 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-known-value-widening.yml +71 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-non-null-assertion.yml +316 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-raw-json-store-write.yml +7 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-apply-js.yml +29 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-apply.yml +30 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-get-js.yml +41 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-get.yml +42 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-return-value-in-generator.yml +22 -5
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-runtime-typeof.yml +121 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-server-bind-wildcard.yml +23 -7
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-shape-in-symbol-names.yml +68 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-sql-in-code-js.yml +41 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-sql-in-code.yml +41 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unknown-laundering.yml +32 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unknown-parameters.yml +67 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unknown-returns.yml +106 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unsafe-dictionary-any.yml +50 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unsafe-dictionary-unknown.yml +56 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-win32-isabsolute-for-qualification.yml +2 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/redundant-unsafe-function.yml +32 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/require-safety-comment-for-as-unknown-as.yml +184 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/ts-void-zero.yml +5 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/self-scan-baseline.json +5 -0
- package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +132 -1
- package/node_modules/pi-lens/scripts/download-grammars.js +25 -0
- package/node_modules/pi-lens/scripts/grammars.lock.json +9 -0
- package/node_modules/pi-lens/skills/pi-lens-ast-grep/SKILL.md +12 -11
- package/node_modules/pi-lens/skills/pi-lens-lsp-navigation/SKILL.md +22 -22
- package/node_modules/pi-lens/skills/pi-lens-write-ast-grep-rule/SKILL.md +87 -116
- package/node_modules/pi-lens/skills/pi-lens-write-ast-grep-rule/reference.md +170 -0
- package/node_modules/pi-lens/skills/pi-lens-write-tree-sitter-rule/SKILL.md +3 -1
- package/node_modules/pi-lens/vendor/grammars/tree-sitter-cue.wasm +0 -0
- package/node_modules/pi-mcp-adapter/CHANGELOG.md +49 -0
- package/node_modules/pi-mcp-adapter/README.md +51 -6
- package/node_modules/pi-mcp-adapter/agent-dir.ts +12 -4
- package/node_modules/pi-mcp-adapter/cli.js +188 -5
- package/node_modules/pi-mcp-adapter/commands.ts +128 -22
- package/node_modules/pi-mcp-adapter/config.ts +28 -10
- package/node_modules/pi-mcp-adapter/direct-tools.ts +23 -19
- package/node_modules/pi-mcp-adapter/index.ts +219 -32
- package/node_modules/pi-mcp-adapter/init.ts +36 -4
- package/node_modules/pi-mcp-adapter/lifecycle.ts +315 -24
- package/node_modules/pi-mcp-adapter/mcp-auth-flow.ts +39 -6
- package/node_modules/pi-mcp-adapter/mcp-bearer-store.ts +387 -0
- package/node_modules/pi-mcp-adapter/mcp-callback-server.ts +27 -3
- package/node_modules/pi-mcp-adapter/mcp-code.ts +4 -0
- package/node_modules/pi-mcp-adapter/mcp-panel.ts +42 -13
- package/node_modules/pi-mcp-adapter/mcp-setup-panel.ts +2 -1
- package/node_modules/pi-mcp-adapter/metadata-cache.ts +46 -25
- package/node_modules/pi-mcp-adapter/package-mcp-loader.ts +168 -0
- package/node_modules/pi-mcp-adapter/package.json +4 -1
- package/node_modules/pi-mcp-adapter/proxy-modes.ts +5 -4
- package/node_modules/pi-mcp-adapter/request-headers-command.ts +330 -0
- package/node_modules/pi-mcp-adapter/search-ranking.ts +92 -22
- package/node_modules/pi-mcp-adapter/server-manager.ts +145 -2
- package/node_modules/pi-mcp-adapter/session-recovery.ts +7 -0
- package/node_modules/pi-mcp-adapter/tool-approval.ts +15 -2
- package/node_modules/pi-mcp-adapter/tool-metadata.ts +38 -18
- package/node_modules/pi-mcp-adapter/tool-result-renderer.ts +44 -4
- package/node_modules/pi-mcp-adapter/types.ts +95 -10
- package/node_modules/pi-mcp-adapter/ui-server.ts +18 -16
- package/node_modules/pi-mcp-adapter/utils.ts +70 -0
- package/node_modules/pi-web-access/CHANGELOG.md +37 -0
- package/node_modules/pi-web-access/README.md +38 -14
- package/node_modules/pi-web-access/anysearch.ts +4 -2
- package/node_modules/pi-web-access/auth-fetch.ts +148 -0
- package/node_modules/pi-web-access/brave.ts +16 -4
- package/node_modules/pi-web-access/chrome-cookies.ts +110 -23
- package/node_modules/pi-web-access/curator-page.ts +8 -3
- package/node_modules/pi-web-access/curator-server.ts +5 -1
- package/node_modules/pi-web-access/exa.ts +18 -7
- package/node_modules/pi-web-access/extract.ts +134 -37
- package/node_modules/pi-web-access/fetch-params.ts +17 -3
- package/node_modules/pi-web-access/firecrawl.ts +172 -12
- package/node_modules/pi-web-access/gemini-search.ts +33 -7
- package/node_modules/pi-web-access/index.ts +160 -104
- package/node_modules/pi-web-access/package.json +2 -2
- package/node_modules/pi-web-access/page-query.ts +4 -2
- package/node_modules/pi-web-access/parallel-mcp.ts +249 -0
- package/node_modules/pi-web-access/parallel.ts +2 -2
- package/node_modules/pi-web-access/query-rewrite.ts +51 -0
- package/node_modules/pi-web-access/serper.ts +211 -0
- package/node_modules/pi-web-access/summary-model-scope.ts +12 -4
- package/node_modules/pi-web-access/summary-review.ts +51 -23
- package/node_modules/pi-web-access/tavily.ts +16 -4
- package/node_modules/pi-web-access/utils.ts +87 -0
- package/node_modules/pi-web-access/valyu.ts +199 -0
- package/node_modules/pi-web-access/youtube-extract.ts +2 -2
- package/package.json +13 -13
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { DynamicBorder, type Theme } from "@earendil-works/pi-coding-agent";
|
|
2
2
|
import { type Component, Container, type Editor, Spacer } from "@earendil-works/pi-tui";
|
|
3
|
+
import { DEFAULT_COLLAPSE_KEY, formatKeySpecForDisplay } from "../config.js";
|
|
3
4
|
import type { QuestionnaireState } from "../state/state.js";
|
|
4
5
|
import type { QuestionData } from "../tool/types.js";
|
|
5
6
|
import type { PreviewPaneProps } from "./components/preview/preview-pane.js";
|
|
@@ -16,8 +17,21 @@ export const HINT_PART_TOGGLE = "Space to toggle";
|
|
|
16
17
|
export const HINT_PART_NOTES = "n to add notes";
|
|
17
18
|
export const HINT_PART_TAB = "Tab to switch questions";
|
|
18
19
|
export const HINT_PART_CANCEL = "Esc to cancel";
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
/**
|
|
21
|
+
* Collapse/expand hint copy is templated on `KEY_PLACEHOLDER` because the
|
|
22
|
+
* shortcut is configurable (`collapseKey`) and `rpiv-i18n`'s `tr` has no
|
|
23
|
+
* interpolation — locale entries carry the same `{key}` placeholder and call
|
|
24
|
+
* sites `.replace()` it with `formatKeySpecForDisplay(collapseKey)` after
|
|
25
|
+
* lookup, so per-locale word order is preserved.
|
|
26
|
+
*/
|
|
27
|
+
export const KEY_PLACEHOLDER = "{key}";
|
|
28
|
+
export const HINT_PART_COLLAPSE_TEMPLATE = `${KEY_PLACEHOLDER} to collapse`;
|
|
29
|
+
export const HINT_PART_EXPAND_TEMPLATE = `${KEY_PLACEHOLDER} to expand`;
|
|
30
|
+
/** Default-key (`Ctrl+]`) rendering of the collapse template, for tests and default-config assertions. */
|
|
31
|
+
export const HINT_PART_COLLAPSE = HINT_PART_COLLAPSE_TEMPLATE.replace(
|
|
32
|
+
KEY_PLACEHOLDER,
|
|
33
|
+
formatKeySpecForDisplay(DEFAULT_COLLAPSE_KEY),
|
|
34
|
+
);
|
|
21
35
|
/**
|
|
22
36
|
* `HINT_SINGLE` / `HINT_MULTI` are the resting core hint for NON-multiSelect
|
|
23
37
|
* question tabs only: `buildHintText` drops `NOTES` while the notes editor is
|
|
@@ -33,8 +47,12 @@ export const HINT_SINGLE = [HINT_PART_ENTER, HINT_PART_NAV, HINT_PART_NOTES, HIN
|
|
|
33
47
|
export const HINT_MULTI = [HINT_PART_ENTER, HINT_PART_NAV, HINT_PART_NOTES, HINT_PART_TAB, HINT_PART_CANCEL].join(
|
|
34
48
|
" · ",
|
|
35
49
|
);
|
|
36
|
-
/**
|
|
37
|
-
|
|
50
|
+
/**
|
|
51
|
+
* Template for the single-line footer shown by `QuestionnaireSession` when
|
|
52
|
+
* `state.collapsed === true`. Bypasses `buildHintText`; the session replaces
|
|
53
|
+
* `KEY_PLACEHOLDER` with the configured key's display form.
|
|
54
|
+
*/
|
|
55
|
+
export const COLLAPSED_HINT_TEMPLATE = [HINT_PART_EXPAND_TEMPLATE, HINT_PART_CANCEL].join(" · ");
|
|
38
56
|
export const REVIEW_HEADING = "Review your answers";
|
|
39
57
|
export const READY_PROMPT = "Ready to submit your answers?";
|
|
40
58
|
export const INCOMPLETE_WARNING_PREFIX = "⚠ Answer remaining questions before submitting:";
|
|
@@ -67,6 +85,13 @@ export interface DialogConfig {
|
|
|
67
85
|
getCurrentBodyHeight: (width: number) => number;
|
|
68
86
|
/** Terminal height getter. Mirrors `getTerminalWidth` — reads `tui.terminal.rows` at render time. */
|
|
69
87
|
getTerminalRows: () => number;
|
|
88
|
+
/**
|
|
89
|
+
* Resolved collapse/expand key spec (`resolveCollapseKey` output: `"ctrl+]"`,
|
|
90
|
+
* `"alt+o"`, or `"off"`). Construction-time config, NOT canonical state —
|
|
91
|
+
* `QuestionnaireRuntime.collapseKey` must never reach view setProps consumers.
|
|
92
|
+
* The footer hint interpolates it, and drops the collapse part when `"off"`.
|
|
93
|
+
*/
|
|
94
|
+
collapseKey: string;
|
|
70
95
|
}
|
|
71
96
|
|
|
72
97
|
/**
|
|
@@ -95,6 +120,7 @@ export class DialogView implements StatefulView<DialogProps> {
|
|
|
95
120
|
notesInput: config.notesInput,
|
|
96
121
|
isMulti: config.isMulti,
|
|
97
122
|
getCurrentBodyHeight: config.getCurrentBodyHeight,
|
|
123
|
+
collapseKey: config.collapseKey,
|
|
98
124
|
});
|
|
99
125
|
this.submitStrategy = config.isMulti
|
|
100
126
|
? new SubmitTabStrategy({
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Theme } from "@earendil-works/pi-coding-agent";
|
|
2
2
|
import { type Component, Container, type Editor, Spacer, Text, truncateToWidth } from "@earendil-works/pi-tui";
|
|
3
|
+
import { COLLAPSE_KEY_OFF, formatKeySpecForDisplay } from "../config.js";
|
|
3
4
|
import { t } from "../state/i18n-bridge.js";
|
|
4
5
|
import { formatAnswerScalar } from "../tool/format-answer.js";
|
|
5
6
|
import type { QuestionData } from "../tool/types.js";
|
|
@@ -8,7 +9,7 @@ import {
|
|
|
8
9
|
type DialogState,
|
|
9
10
|
HINT_PART_CANCEL,
|
|
10
11
|
HINT_PART_CLEAR,
|
|
11
|
-
|
|
12
|
+
HINT_PART_COLLAPSE_TEMPLATE,
|
|
12
13
|
HINT_PART_ENTER,
|
|
13
14
|
HINT_PART_NAV,
|
|
14
15
|
HINT_PART_NEW_LINE,
|
|
@@ -16,6 +17,7 @@ import {
|
|
|
16
17
|
HINT_PART_TAB,
|
|
17
18
|
HINT_PART_TOGGLE,
|
|
18
19
|
INCOMPLETE_WARNING_PREFIX,
|
|
20
|
+
KEY_PLACEHOLDER,
|
|
19
21
|
READY_PROMPT,
|
|
20
22
|
REVIEW_HEADING,
|
|
21
23
|
} from "./dialog-builder.js";
|
|
@@ -86,6 +88,8 @@ export interface QuestionTabStrategyConfig {
|
|
|
86
88
|
notesInput: Editor;
|
|
87
89
|
isMulti: boolean;
|
|
88
90
|
getCurrentBodyHeight: (width: number) => number;
|
|
91
|
+
/** Resolved collapse key spec (`"ctrl+]"`, `"alt+o"`, or `"off"`). Drives the footer's collapse hint. */
|
|
92
|
+
collapseKey: string;
|
|
89
93
|
}
|
|
90
94
|
|
|
91
95
|
export class QuestionTabStrategy implements TabContentStrategy {
|
|
@@ -137,7 +141,10 @@ export class QuestionTabStrategy implements TabContentStrategy {
|
|
|
137
141
|
// drops the trailing parts (collapse hint first, then cancel) with `…`.
|
|
138
142
|
return [
|
|
139
143
|
new Spacer(1),
|
|
140
|
-
new OneLineClippedText(
|
|
144
|
+
new OneLineClippedText(
|
|
145
|
+
this.config.theme.fg("dim", buildHintText(question, this.config.isMulti, state, this.config.collapseKey)),
|
|
146
|
+
1,
|
|
147
|
+
),
|
|
141
148
|
];
|
|
142
149
|
}
|
|
143
150
|
|
|
@@ -228,21 +235,35 @@ export class SubmitTabStrategy implements TabContentStrategy {
|
|
|
228
235
|
|
|
229
236
|
/**
|
|
230
237
|
* Build the controls hint line. Order:
|
|
231
|
-
* Enter · ↑/↓ [· Space toggle] [· n notes] [· Tab switch] · Esc ·
|
|
238
|
+
* Enter · ↑/↓ [· Space toggle] [· n notes] [· Tab switch] · Esc [· <key> collapse]
|
|
232
239
|
* [· Shift+Enter newline] [· Ctrl+U clear]
|
|
233
240
|
*
|
|
234
241
|
* `NOTES` is part of the resting (notes-closed) core — it drops while the notes
|
|
235
242
|
* editor or custom-answer input has the keyboard. Ctrl+G is Pi's global external-
|
|
236
243
|
* editor shortcut and needs no local hint; the context-specific clear shortcut is
|
|
237
244
|
* appended at the far right while input mode is active.
|
|
245
|
+
*
|
|
246
|
+
* The collapse part interpolates the configured `collapseKey` (display-cased)
|
|
247
|
+
* and is omitted entirely when the shortcut is `"off"` — `routeKey` and the raw
|
|
248
|
+
* terminal listener both refuse to collapse in that case, so advertising a key
|
|
249
|
+
* would be a lie.
|
|
238
250
|
*/
|
|
239
|
-
export function buildHintText(
|
|
251
|
+
export function buildHintText(
|
|
252
|
+
question: QuestionData | undefined,
|
|
253
|
+
isMulti: boolean,
|
|
254
|
+
state: DialogState,
|
|
255
|
+
collapseKey: string,
|
|
256
|
+
): string {
|
|
240
257
|
const parts: string[] = [t("hint.enter", HINT_PART_ENTER), t("hint.navigate", HINT_PART_NAV)];
|
|
241
258
|
if (question?.multiSelect === true) parts.push(t("hint.toggle", HINT_PART_TOGGLE));
|
|
242
259
|
if (question && !state.notesVisible && !state.inputMode) parts.push(t("hint.notes", HINT_PART_NOTES));
|
|
243
260
|
if (isMulti) parts.push(t("hint.tab", HINT_PART_TAB));
|
|
244
261
|
parts.push(t("hint.cancel", HINT_PART_CANCEL));
|
|
245
|
-
|
|
262
|
+
if (collapseKey !== COLLAPSE_KEY_OFF) {
|
|
263
|
+
parts.push(
|
|
264
|
+
t("hint.collapse", HINT_PART_COLLAPSE_TEMPLATE).replace(KEY_PLACEHOLDER, formatKeySpecForDisplay(collapseKey)),
|
|
265
|
+
);
|
|
266
|
+
}
|
|
246
267
|
if (state.notesVisible || state.inputMode) parts.push(t("hint.newline", HINT_PART_NEW_LINE));
|
|
247
268
|
if (state.inputMode) parts.push(t("hint.clear", HINT_PART_CLEAR));
|
|
248
269
|
return parts.join(" · ");
|
|
@@ -1,26 +1,19 @@
|
|
|
1
|
-
# 💬 pi-btw — Side Questions
|
|
1
|
+
# 💬 pi-btw — Ask Side Questions Without Derailing the Main Task
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@narumitw/pi-btw) [](https://pi.dev) [](./LICENSE)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Ask temporary questions in a separate side thread while the main Pi conversation and coding task stay focused.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Bring back only the answer or context you explicitly choose.
|
|
8
8
|
|
|
9
9
|
## ✨ Features
|
|
10
10
|
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
- Keeps
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
- Queues Pi-style `Steering` questions while an answer is running and processes them one at a time.
|
|
18
|
-
- Optionally brings the latest answer, a question-to-end suffix, an exact line range, or the entire side thread into the main editor.
|
|
19
|
-
- Uses the current session branch as context.
|
|
20
|
-
- Uses Pi's current model or an independent model selected in `pi-btw.json`.
|
|
21
|
-
- Uses a pi-btw thinking level that can be changed with Pi's configured thinking shortcut and remembered for next time.
|
|
22
|
-
- Does not append the side question or answer to the main conversation.
|
|
23
|
-
- Works as an independently installable npm Pi extension package.
|
|
11
|
+
- Starts a fresh side thread immediately with `/btw <question>` or opens the manager with `/btw`.
|
|
12
|
+
- Uses any persisted main-session branch as context without switching that branch.
|
|
13
|
+
- Supports scrollable answers, follow-up questions, queued steering, and resumable in-memory threads.
|
|
14
|
+
- Keeps side questions and answers out of the main conversation by default.
|
|
15
|
+
- Brings back only the latest answer, a selected range, a question suffix, or the complete side thread when requested.
|
|
16
|
+
- Uses Pi's current model and thinking level or independent saved choices.
|
|
24
17
|
|
|
25
18
|
## 📦 Install
|
|
26
19
|
|
|
@@ -34,13 +27,21 @@ Try without installing permanently:
|
|
|
34
27
|
pi -e npm:@narumitw/pi-btw
|
|
35
28
|
```
|
|
36
29
|
|
|
37
|
-
|
|
30
|
+
Build and try this package locally from the repository root:
|
|
38
31
|
|
|
39
32
|
```bash
|
|
33
|
+
npm --workspace @narumitw/pi-btw run build
|
|
40
34
|
pi -e ./packages/pi-btw
|
|
41
35
|
```
|
|
42
36
|
|
|
43
|
-
|
|
37
|
+
The package declares `dist/index.ts`, so an unbuilt local checkout must run the build before Pi loads the package directory.
|
|
38
|
+
|
|
39
|
+
## 🚀 Quick start
|
|
40
|
+
|
|
41
|
+
Run `/btw <question>` to start a side thread immediately, or run `/btw` to choose context and settings first.
|
|
42
|
+
Side-thread questions and answers remain separate from the main conversation unless you explicitly bring selected context back.
|
|
43
|
+
|
|
44
|
+
## 💬 Commands
|
|
44
45
|
|
|
45
46
|
Open the pi-btw menu or provide the first question immediately:
|
|
46
47
|
|
|
@@ -59,79 +60,83 @@ Examples:
|
|
|
59
60
|
```
|
|
60
61
|
|
|
61
62
|
Running `/btw` alone opens a menu with **Start side thread** selected first.
|
|
63
|
+
**Start from main thread tree…** opens Pi's native session tree and uses the root-to-selected-entry path, including the selected entry, as the new side thread's context.
|
|
64
|
+
Selecting context does not navigate, fork, append to, or switch the main conversation, and it preserves the main editor draft.
|
|
65
|
+
The selector is a snapshot of entries persisted when it opens, while the resulting side thread keeps an immutable context snapshot even if the main conversation later changes.
|
|
66
|
+
Press `Escape` to return to the `/btw` menu or `Ctrl+C` to close the flow.
|
|
67
|
+
The native tree controls remain available: copying reports success or failure, and an explicit `Shift+L` label edit persists through Pi as the only main-session mutation available from this selector.
|
|
62
68
|
When the current Pi session has non-empty side threads in memory, **Resume side thread** opens a bounded searchable choice list.
|
|
63
69
|
Search matches the displayed first question and question count while returning the thread's raw in-memory ID.
|
|
64
|
-
**Settings** changes the starting thinking level and whether shortcut changes are remembered.
|
|
70
|
+
**Settings** changes the starting thinking level and whether shortcut changes for fixed levels are remembered.
|
|
65
71
|
Each Resume row keeps the first question as its fixed title, shows its question count, and the list is ordered by the newest recorded answer or visible error.
|
|
66
72
|
Opening and closing a thread without a new result does not reorder it.
|
|
67
73
|
`/btw <question>` bypasses this menu and always starts a fresh side thread.
|
|
68
74
|
Its answer opens above the side-thread editor.
|
|
69
75
|
The side thread uses a dedicated full-screen terminal view.
|
|
70
|
-
The main agent continues running in the background, but its screen rendering stays suspended until
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
`
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
submission order and answered one at a time after the active response completes.
|
|
76
|
+
The main agent continues running in the background, but its screen rendering stays suspended until `/btw` closes, so new main-thread output cannot move a mouse selection inside the side thread.
|
|
77
|
+
Drag the primary mouse button across side-thread text to request a copy through Pi's host clipboard helper.
|
|
78
|
+
The view reports `Copied!` when Pi accepts the copy and `Copy failed` when Pi reports failure; actual clipboard availability still depends on operating-system and terminal support.
|
|
79
|
+
Returning from `/btw` redraws the main view with everything produced while it was hidden.
|
|
80
|
+
A compact `btw · side thread` header stays fixed above the content so the ephemeral workspace remains recognizable while scrolling.
|
|
81
|
+
Messages use Pi's normal user and assistant presentation without numbered turns or role labels.
|
|
82
|
+
Type each question and press `Enter`; no follow-up shortcut is required.
|
|
83
|
+
Press `Ctrl+Shift+F` to search completed or answering transcript content.
|
|
84
|
+
Press `Enter` or `Ctrl+G` for the next match, `Shift+Enter` or `Ctrl+Shift+G` for the previous match, and `Escape` to close search.
|
|
85
|
+
Search uses Pi's active theme, keeps the composer available after closing the search overlay, and does not include fixed header or footer chrome.
|
|
86
|
+
Previous side questions and answers remain available to the model and visible for that invocation.
|
|
87
|
+
The side-thread header shows its current thinking level.
|
|
88
|
+
Press Pi's configured `app.thinking.cycle` shortcut (`Shift+Tab` by default) in the composer to cycle the levels supported by the side-thread model; every later question uses the displayed level until it is changed again.
|
|
89
|
+
When a fixed thinking level is selected, each shortcut change is also written to `pi-btw.json` for the next invocation by default.
|
|
90
|
+
Turn **Remember thinking level changes** off in Settings to keep fixed-level changes local to the current side thread.
|
|
91
|
+
When **Same as main thread** is selected, shortcut changes are always local to the current side thread.
|
|
92
|
+
Neither path changes the main session's thinking level.
|
|
93
|
+
While a response is running, the transcript and composer remain visible above an `Answering…` status.
|
|
94
|
+
Type another question and press `Enter` to queue it as `Steering`; queued questions are shown in submission order and answered one at a time after the active response completes.
|
|
89
95
|
A queued question uses the side thread's thinking level when its turn begins.
|
|
90
96
|
A failed active response is shown in the transcript and does not discard later steering questions.
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
question onward, an exact text range, or the entire side thread.
|
|
100
|
-
and entire-thread choices preview the exact editable context block before the side thread closes
|
|
101
|
-
`Escape` returns
|
|
97
|
+
Use the mouse wheel or trackpad to scroll transcript history like Pi's main thread.
|
|
98
|
+
Keyboard `PgUp`/`PgDn` history navigation remains available and appears in the footer only when the transcript can scroll.
|
|
99
|
+
Press `Ctrl+C` to cancel the active response and discard the ephemeral side-thread draft and steering queue.
|
|
100
|
+
Completed questions, answers, and visible errors remain available through Resume until the current extension instance ends.
|
|
101
|
+
Steering remains entirely inside pi-btw and never appends to the main conversation or editor.
|
|
102
|
+
|
|
103
|
+
After at least one successful answer, press `Ctrl+R` to bring selected context to the main editor.
|
|
104
|
+
The scope menu shows the size of the latest question and answer and the entire side thread before you choose.
|
|
105
|
+
Bring the latest question and answer, everything from a chosen question onward, an exact text range, or the entire side thread.
|
|
106
|
+
Question-suffix, exact-range, and entire-thread choices preview the exact editable context block before the side thread closes.
|
|
107
|
+
Pressing `Escape` returns, while `Ctrl+C` closes without bringing anything to main.
|
|
102
108
|
|
|
103
109
|
The text-range selector supports both fast line selection and editor-style character selection.
|
|
104
|
-
It reports whether anything is selected plus the selected line, message, and approximate token
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
Pi's configured keys control vertical navigation, bringing, and going back (`Up`/`Down`, `Enter`,
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
questions, create:
|
|
110
|
+
It reports whether anything is selected plus the selected line, message, and approximate token counts.
|
|
111
|
+
Press `Space` to select the current raw source line, then use `Up`/`Down` to extend by whole lines; press `Space` again to clear it.
|
|
112
|
+
Alternatively, use the arrow keys to move the cursor and `Shift`+arrow keys to extend a character-level selection.
|
|
113
|
+
Starting a Shift selection replaces any active line selection.
|
|
114
|
+
Selected lines include a visible `●` marker in addition to highlighting.
|
|
115
|
+
Pi's configured keys control vertical navigation, bringing, and going back (`Up`/`Down`, `Enter`, and `Escape` by default), and the selector displays the active keys.
|
|
116
|
+
Selection follows raw source text rather than terminal-wrapped visual rows.
|
|
117
|
+
|
|
118
|
+
Bringing context to main closes the side thread and loads a deterministic, editable context block into Pi's main editor.
|
|
119
|
+
It never sends the draft automatically.
|
|
120
|
+
If the main editor already has a draft, append is the recommended default.
|
|
121
|
+
Replace is labeled as destructive and requires a second confirmation; Cancel returns to the side thread without changing either draft.
|
|
122
|
+
Concurrent editor updates made while these menus are open are preserved.
|
|
123
|
+
A success message reports whether context was loaded, appended, or replaced and its approximate size.
|
|
124
|
+
Without an explicit bring-to-main action, closing `/btw` never adds the side thread to the main conversation.
|
|
125
|
+
Non-empty threads remain only in memory for Resume within the current Pi session.
|
|
126
|
+
`/new`, Pi `/resume`, `/reload`, extension replacement, and process restart discard every retained thread.
|
|
127
|
+
Unsent drafts, steering queues, interrupted answers, and model credentials are never retained.
|
|
128
|
+
|
|
129
|
+
## ⚙️ Settings
|
|
130
|
+
|
|
131
|
+
By default, `/btw` uses the current session model.
|
|
132
|
+
To use an independent model for side questions, create:
|
|
128
133
|
|
|
129
134
|
```text
|
|
130
135
|
$PI_CODING_AGENT_DIR/pi-btw.json
|
|
131
136
|
```
|
|
132
137
|
|
|
133
|
-
The normal location is `~/.pi/agent/pi-btw.json`.
|
|
134
|
-
setting; pi-btw does not add any environment variables.
|
|
138
|
+
The normal location is `~/.pi/agent/pi-btw.json`.
|
|
139
|
+
`PI_CODING_AGENT_DIR` is an existing Pi setting; pi-btw does not add any environment variables.
|
|
135
140
|
|
|
136
141
|
```json
|
|
137
142
|
{
|
|
@@ -141,46 +146,54 @@ setting; pi-btw does not add any environment variables.
|
|
|
141
146
|
}
|
|
142
147
|
```
|
|
143
148
|
|
|
144
|
-
The `model` value uses `provider/model-id` format.
|
|
145
|
-
model IDs may contain additional slashes, such as `openrouter/anthropic/claude-sonnet`.
|
|
146
|
-
The configured model must exist in Pi's model registry and have usable credentials.
|
|
147
|
-
cannot be found or authenticated, pi-btw warns and falls back to the current session model.
|
|
148
|
-
If neither model is available, `/btw` reports an error and stops.
|
|
149
|
-
`/btw`; it does not change the main session model.
|
|
150
|
-
|
|
151
|
-
Pi calls its reasoning setting the **thinking level**.
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
`
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
149
|
+
The `model` value uses `provider/model-id` format.
|
|
150
|
+
Only the first `/` is the separator, so model IDs may contain additional slashes, such as `openrouter/anthropic/claude-sonnet`.
|
|
151
|
+
The configured model must exist in Pi's model registry and have usable credentials.
|
|
152
|
+
If it cannot be found or authenticated, pi-btw warns and falls back to the current session model.
|
|
153
|
+
If neither model is available, `/btw` reports an error and stops.
|
|
154
|
+
This selection affects only `/btw`; it does not change the main session model.
|
|
155
|
+
|
|
156
|
+
Pi calls its reasoning setting the **thinking level**.
|
|
157
|
+
In Settings, choose **Same as main thread** to start each new side thread from the main thread's current thinking level.
|
|
158
|
+
This is stored by omitting `thinkingLevel` from `pi-btw.json`.
|
|
159
|
+
|
|
160
|
+
Set `thinkingLevel` only when you want a fixed pi-btw starting level.
|
|
161
|
+
Accepted fixed values are `off`, `minimal`, `low`, `medium`, `high`, `xhigh`, and `max`.
|
|
162
|
+
The initial value and shortcut cycle are clamped to the selected side model's capabilities using Pi's model rules.
|
|
163
|
+
Resumed side threads keep their own local thinking level instead of re-syncing with the main thread.
|
|
164
|
+
Pi-btw does not read, write, or change the main session's `defaultThinkingLevel`.
|
|
165
|
+
|
|
166
|
+
`rememberThinkingLevelChanges` controls only persistence for fixed thinking levels and defaults to `true` when omitted.
|
|
167
|
+
A side-thread shortcut always changes that side thread immediately.
|
|
168
|
+
When a fixed thinking level is selected and remembering is on, the concrete level is written for the next invocation; when off, `pi-btw.json` stays unchanged.
|
|
169
|
+
When **Same as main thread** is selected, shortcut changes stay local even when remembering is on.
|
|
170
|
+
If a shortcut write fails, the local change remains active and pi-btw warns that it was not remembered.
|
|
162
171
|
A failed Settings-screen save instead restores the previous displayed value.
|
|
163
172
|
|
|
164
|
-
A missing settings file is a side-effect-free read: pi-btw creates it only after a Settings change
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
is read for each `/btw` invocation, so edits apply without `/reload`.
|
|
173
|
+
A missing settings file is a side-effect-free read: pi-btw creates it only after a Settings change or a remembered shortcut change.
|
|
174
|
+
Saves are ordered within the Pi process and published atomically with a same-directory temporary file and rename.
|
|
175
|
+
They preserve `model` and unknown fields; malformed or invalid files block saves and remain unchanged.
|
|
176
|
+
Settings must be valid UTF-8 and no larger than 64 KiB, so unexpectedly large or invalidly encoded files are rejected without being rewritten.
|
|
177
|
+
Separate Pi processes and external editors are outside this in-process ordering boundary.
|
|
178
|
+
The file is read for each `/btw` invocation, so edits apply without `/reload`.
|
|
171
179
|
|
|
172
180
|
## 🧠 Why use pi-btw?
|
|
173
181
|
|
|
174
|
-
Normal assistant messages become part of the main Pi conversation and can distract the coding agent from the task.
|
|
182
|
+
Normal assistant messages become part of the main Pi conversation and can distract the coding agent from the task.
|
|
183
|
+
`pi-btw` creates a lightweight side channel for context-aware questions, making it useful for pair programming, debugging, code review, and repository exploration.
|
|
175
184
|
|
|
176
185
|
## 🗂️ Package layout
|
|
177
186
|
|
|
178
187
|
```txt
|
|
179
188
|
packages/pi-btw/
|
|
189
|
+
├── dist/ # Generated TypeScript runtime loaded by Jiti
|
|
190
|
+
├── scripts/
|
|
191
|
+
│ └── build-runtime.mjs # Deterministic runtime builder and boundary validator
|
|
180
192
|
├── src/
|
|
181
193
|
│ ├── index.ts
|
|
182
194
|
│ ├── btw.ts
|
|
183
195
|
│ ├── bring-to-main.ts
|
|
196
|
+
│ ├── main-tree-picker.ts
|
|
184
197
|
│ ├── menu.ts
|
|
185
198
|
│ ├── settings.ts
|
|
186
199
|
│ ├── side-thread.ts
|
|
@@ -197,15 +210,18 @@ The package exposes its Pi extension through `package.json`:
|
|
|
197
210
|
```json
|
|
198
211
|
{
|
|
199
212
|
"pi": {
|
|
200
|
-
"extensions": ["./
|
|
213
|
+
"extensions": ["./dist/index.ts"]
|
|
201
214
|
}
|
|
202
215
|
}
|
|
203
216
|
```
|
|
204
217
|
|
|
218
|
+
The generated runtime is built from the authoritative `src/index.ts` graph and does not import back into `src`.
|
|
219
|
+
|
|
205
220
|
## 🔎 Keywords
|
|
206
221
|
|
|
207
222
|
Pi extension, Pi coding agent, AI coding agent, side question command, agent chat workflow, TypeScript Pi package, npm Pi extension.
|
|
208
223
|
|
|
209
224
|
## 📄 License
|
|
210
225
|
|
|
211
|
-
MIT.
|
|
226
|
+
MIT.
|
|
227
|
+
See [`LICENSE`](./LICENSE).
|