@herbertgao/pi-extensions 2026.8.6 → 2026.8.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -6
- package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +2 -2
- package/node_modules/@herbertgao/pi-cc-extensions/README.md +2 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +19 -7
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +30 -9
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +320 -22
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +94 -77
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/message-display.ts +79 -17
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/hover.ts +27 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/interaction.ts +66 -17
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/layout.ts +41 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-renderer.ts +75 -6
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/types.ts +7 -3
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +64 -1
- package/node_modules/@herbertgao/pi-cc-extensions/package.json +3 -3
- package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +6 -0
- package/node_modules/@herbertgao/pi-subagents/README.md +30 -22
- package/node_modules/@herbertgao/pi-subagents/examples/agent-tool-description.md +5 -5
- package/node_modules/@herbertgao/pi-subagents/package.json +7 -7
- package/node_modules/@herbertgao/pi-subagents/src/agent-file-toggle.ts +7 -1
- package/node_modules/@herbertgao/pi-subagents/src/agent-manager.ts +48 -19
- package/node_modules/@herbertgao/pi-subagents/src/agent-runner.ts +17 -13
- package/node_modules/@herbertgao/pi-subagents/src/custom-agents.ts +26 -2
- package/node_modules/@herbertgao/pi-subagents/src/index.ts +219 -40
- package/node_modules/@herbertgao/pi-subagents/src/invocation-config.ts +101 -3
- package/node_modules/@herbertgao/pi-subagents/src/nested-tools.ts +18 -4
- package/node_modules/@herbertgao/pi-subagents/src/settings.ts +99 -0
- package/node_modules/@herbertgao/pi-subagents/src/types.ts +22 -3
- package/node_modules/@herbertgao/pi-subagents/src/ui/agent-widget.ts +51 -3
- package/node_modules/@herbertgao/pi-subagents/src/ui/conversation-viewer.ts +20 -2
- package/node_modules/@herbertgao/pi-subagents/src/ui/fleet-list.ts +21 -6
- package/node_modules/@herbertgao/pi-subagents/src/usage.ts +129 -1
- package/node_modules/@herbertgao/pi-subagents/src/worktree.ts +20 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/README.md +5 -4
- package/node_modules/@juicesharp/rpiv-ask-user-question/ask-user-question.ts +174 -100
- package/node_modules/@juicesharp/rpiv-ask-user-question/config.ts +25 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/configuration.md +13 -4
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/hosts.md +5 -1
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/keyboard.md +10 -2
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/localization.md +10 -6
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/tool-schema.md +11 -5
- package/node_modules/@juicesharp/rpiv-ask-user-question/locales/en.json +5 -2
- package/node_modules/@juicesharp/rpiv-ask-user-question/locales/zh.json +2 -2
- package/node_modules/@juicesharp/rpiv-ask-user-question/package.json +3 -2
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/build-questionnaire.ts +10 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/key-router.ts +140 -97
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/questionnaire-session.ts +63 -28
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/selectors/projections.ts +22 -15
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/state-reducer.ts +11 -1
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/state.ts +14 -6
- package/node_modules/@juicesharp/rpiv-ask-user-question/tool/response-envelope.ts +11 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/tool/types.ts +11 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/view/components/multi-select-view.ts +31 -17
- package/node_modules/@juicesharp/rpiv-ask-user-question/view/components/preview/preview-block-renderer.ts +15 -6
- package/node_modules/@juicesharp/rpiv-ask-user-question/view/components/wrapping-select.ts +15 -6
- package/node_modules/@juicesharp/rpiv-ask-user-question/view/dialog-builder.ts +86 -38
- package/node_modules/@juicesharp/rpiv-ask-user-question/view/tab-content-strategy.ts +76 -9
- package/node_modules/@narumitw/pi-btw/README.md +120 -111
- package/node_modules/@narumitw/pi-btw/dist/index.ts +2898 -0
- package/node_modules/@narumitw/pi-btw/dist/index.ts.map +7 -0
- package/node_modules/@narumitw/pi-btw/package.json +10 -6
- package/node_modules/@narumitw/pi-btw/src/btw.ts +36 -40
- package/node_modules/@narumitw/pi-btw/src/fullscreen-ui.ts +55 -10
- package/node_modules/@narumitw/pi-btw/src/main-tree-picker.ts +390 -0
- package/node_modules/@narumitw/pi-btw/src/menu.ts +45 -2
- package/node_modules/@narumitw/pi-btw/src/transcript-pager.ts +136 -45
- package/node_modules/@pi-plugins/fast-mode/dist/index.mjs +44 -1856
- package/node_modules/@pi-plugins/fast-mode/dist/index.mjs.map +1 -1
- package/node_modules/@pi-plugins/fast-mode/package.json +4 -6
- package/node_modules/pi-lens/CHANGELOG.md +999 -0
- package/node_modules/pi-lens/README.md +117 -3
- package/node_modules/pi-lens/config/ruff/core.toml +42 -0
- package/node_modules/pi-lens/dist/clients/actionable-warnings.js +130 -27
- package/node_modules/pi-lens/dist/clients/advisory-provenance.js +126 -13
- package/node_modules/pi-lens/dist/clients/agent-nudge.js +67 -11
- package/node_modules/pi-lens/dist/clients/ast-grep-client.js +9 -3
- package/node_modules/pi-lens/dist/clients/atomic-write.js +9 -3
- package/node_modules/pi-lens/dist/clients/bash-file-access.js +381 -13
- package/node_modules/pi-lens/dist/clients/biome-client.js +61 -30
- package/node_modules/pi-lens/dist/clients/blocker-freshness.js +428 -0
- package/node_modules/pi-lens/dist/clients/blocker-past-eof.js +129 -0
- package/node_modules/pi-lens/dist/clients/bootstrap.js +12 -1
- package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +12 -3
- package/node_modules/pi-lens/dist/clients/bounded-telemetry.js +206 -0
- package/node_modules/pi-lens/dist/clients/cache-observability.js +353 -76
- package/node_modules/pi-lens/dist/clients/cascade-budget.js +196 -0
- package/node_modules/pi-lens/dist/clients/cascade-format.js +20 -1
- package/node_modules/pi-lens/dist/clients/cascade-types.js +9 -1
- package/node_modules/pi-lens/dist/clients/child-unref.js +54 -6
- package/node_modules/pi-lens/dist/clients/code-quality-warnings.js +76 -24
- package/node_modules/pi-lens/dist/clients/dead-code-client.js +123 -31
- package/node_modules/pi-lens/dist/clients/deadline-utils.js +8 -1
- package/node_modules/pi-lens/dist/clients/debug-handles.js +5 -0
- package/node_modules/pi-lens/dist/clients/degradation-ledger.js +84 -14
- package/node_modules/pi-lens/dist/clients/demoted-finding-render.js +155 -0
- package/node_modules/pi-lens/dist/clients/dependency-checker.js +25 -3
- package/node_modules/pi-lens/dist/clients/deps/pi-tui.js +8 -2
- package/node_modules/pi-lens/dist/clients/deps/typebox.js +8 -3
- package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +147 -33
- package/node_modules/pi-lens/dist/clients/diagnostic-line-freshness.js +298 -0
- package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +52 -2
- package/node_modules/pi-lens/dist/clients/dispatch/integration.js +256 -88
- package/node_modules/pi-lens/dist/clients/dispatch/lazy.js +7 -4
- package/node_modules/pi-lens/dist/clients/dispatch/plan.js +5 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ast-grep-napi.js +234 -18
- package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +187 -19
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +6 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/credo.js +11 -9
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cue-vet.js +398 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/detekt.js +9 -6
- package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +11 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +12 -7
- package/node_modules/pi-lens/dist/clients/dispatch/runners/go-vet.js +18 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/hadolint.js +9 -7
- package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-render.js +895 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/htmlhint.js +8 -6
- package/node_modules/pi-lens/dist/clients/dispatch/runners/index.js +4 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +16 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +60 -53
- package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +16 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +25 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/oxlint.js +20 -5
- package/node_modules/pi-lens/dist/clients/dispatch/runners/phpstan.js +44 -11
- package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +331 -55
- package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +38 -5
- package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +97 -19
- package/node_modules/pi-lens/dist/clients/dispatch/runners/spellcheck.js +17 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +32 -4
- package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +47 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/swiftlint.js +14 -4
- package/node_modules/pi-lens/dist/clients/dispatch/runners/taplo.js +127 -28
- package/node_modules/pi-lens/dist/clients/dispatch/runners/tflint.js +12 -7
- package/node_modules/pi-lens/dist/clients/dispatch/runners/trivy-config.js +73 -12
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/availability-policy.js +275 -13
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +21 -6
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +260 -27
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +734 -64
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +86 -11
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/tool-failure.js +188 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +9 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/vale.js +21 -10
- package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +18 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +4 -2
- package/node_modules/pi-lens/dist/clients/event-loop-monitor.js +28 -5
- package/node_modules/pi-lens/dist/clients/extension-log.js +22 -1
- package/node_modules/pi-lens/dist/clients/file-kinds.js +8 -2
- package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +316 -0
- package/node_modules/pi-lens/dist/clients/finding-identity.js +88 -0
- package/node_modules/pi-lens/dist/clients/formatters-lazy.js +3 -2
- package/node_modules/pi-lens/dist/clients/formatters.js +500 -115
- package/node_modules/pi-lens/dist/clients/generation-guard.js +216 -0
- package/node_modules/pi-lens/dist/clients/git-guard.js +31 -0
- package/node_modules/pi-lens/dist/clients/gitleaks-client.js +181 -8
- package/node_modules/pi-lens/dist/clients/govulncheck-client.js +109 -9
- package/node_modules/pi-lens/dist/clients/grammar-source.js +333 -10
- package/node_modules/pi-lens/dist/clients/host-ports.js +8 -0
- package/node_modules/pi-lens/dist/clients/installer/index.js +1114 -100
- package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh-session.js +58 -0
- package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh.js +715 -0
- package/node_modules/pi-lens/dist/clients/instance-reaper.js +643 -97
- package/node_modules/pi-lens/dist/clients/instance-registry.js +87 -17
- package/node_modules/pi-lens/dist/clients/jscpd-client.js +87 -8
- package/node_modules/pi-lens/dist/clients/knip-client.js +310 -10
- package/node_modules/pi-lens/dist/clients/language-policy.js +8 -2
- package/node_modules/pi-lens/dist/clients/language-profile.js +9 -2
- package/node_modules/pi-lens/dist/clients/latency-logger.js +440 -11
- package/node_modules/pi-lens/dist/clients/lazy-import.js +21 -0
- package/node_modules/pi-lens/dist/clients/ledger-bounds.js +21 -0
- package/node_modules/pi-lens/dist/clients/lens-flag-registry.js +8 -0
- package/node_modules/pi-lens/dist/clients/lsp/cascade-tier.js +128 -8
- package/node_modules/pi-lens/dist/clients/lsp/client.js +1660 -164
- package/node_modules/pi-lens/dist/clients/lsp/diagnostic-binding.js +83 -1
- package/node_modules/pi-lens/dist/clients/lsp/document-drift.js +389 -0
- package/node_modules/pi-lens/dist/clients/lsp/index.js +2423 -151
- package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +215 -0
- package/node_modules/pi-lens/dist/clients/lsp/jvm-runtime.js +146 -14
- package/node_modules/pi-lens/dist/clients/lsp/language.js +48 -4
- package/node_modules/pi-lens/dist/clients/lsp/server.js +277 -16
- package/node_modules/pi-lens/dist/clients/lsp/spawn-history.js +22 -0
- package/node_modules/pi-lens/dist/clients/lsp/sync-kind.js +43 -0
- package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +79 -3
- package/node_modules/pi-lens/dist/clients/lsp/wait-policy/strategies.js +43 -0
- package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +422 -28
- package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-session.js +30 -0
- package/node_modules/pi-lens/dist/clients/lsp/workspace-sweep-hold.js +175 -0
- package/node_modules/pi-lens/dist/clients/lsp-lazy.js +3 -2
- package/node_modules/pi-lens/dist/clients/mcp/session.js +10 -2
- package/node_modules/pi-lens/dist/clients/module-report.js +22 -1
- package/node_modules/pi-lens/dist/clients/ndjson-logger.js +114 -23
- package/node_modules/pi-lens/dist/clients/opengrep-client.js +15 -1
- package/node_modules/pi-lens/dist/clients/package-manager.js +170 -14
- package/node_modules/pi-lens/dist/clients/path-attribution-telemetry.js +27 -0
- package/node_modules/pi-lens/dist/clients/path-utils.js +160 -0
- package/node_modules/pi-lens/dist/clients/pipeline.js +154 -33
- package/node_modules/pi-lens/dist/clients/post-autofix-notice.js +37 -0
- package/node_modules/pi-lens/dist/clients/project-diagnostics/cache.js +17 -3
- package/node_modules/pi-lens/dist/clients/project-diagnostics/extractors.js +89 -22
- package/node_modules/pi-lens/dist/clients/project-diagnostics/fresh-fetch.js +84 -14
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +15 -3
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +50 -2
- package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +23 -9
- package/node_modules/pi-lens/dist/clients/project-lens-config.js +3 -0
- package/node_modules/pi-lens/dist/clients/project-report.js +62 -27
- package/node_modules/pi-lens/dist/clients/project-snapshot.js +299 -0
- package/node_modules/pi-lens/dist/clients/quiet-window-config.js +47 -0
- package/node_modules/pi-lens/dist/clients/quiet-window.js +11 -25
- package/node_modules/pi-lens/dist/clients/read-guard-logger.js +8 -3
- package/node_modules/pi-lens/dist/clients/read-guard.js +253 -10
- package/node_modules/pi-lens/dist/clients/resource-sampler.js +49 -17
- package/node_modules/pi-lens/dist/clients/reverse-deps.js +50 -11
- package/node_modules/pi-lens/dist/clients/review-graph/builder.js +194 -31
- package/node_modules/pi-lens/dist/clients/review-graph/query.js +52 -4
- package/node_modules/pi-lens/dist/clients/review-graph/revision-drift.js +21 -0
- package/node_modules/pi-lens/dist/clients/review-graph/workspace-modules.js +6 -3
- package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +96 -7
- package/node_modules/pi-lens/dist/clients/runtime-context.js +8 -1
- package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +352 -45
- package/node_modules/pi-lens/dist/clients/runtime-session.js +373 -9
- package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +217 -22
- package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +212 -79
- package/node_modules/pi-lens/dist/clients/runtime-turn.js +620 -67
- package/node_modules/pi-lens/dist/clients/safe-spawn.js +220 -7
- package/node_modules/pi-lens/dist/clients/scratch-tree-policy.js +161 -0
- package/node_modules/pi-lens/dist/clients/search-read-registration.js +34 -6
- package/node_modules/pi-lens/dist/clients/security-scan-client.js +157 -24
- package/node_modules/pi-lens/dist/clients/session-event-guard.js +184 -0
- package/node_modules/pi-lens/dist/clients/sg-runner.js +116 -22
- package/node_modules/pi-lens/dist/clients/single-flight.js +158 -0
- package/node_modules/pi-lens/dist/clients/source-filter.js +6 -2
- package/node_modules/pi-lens/dist/clients/stale-marker.js +17 -0
- package/node_modules/pi-lens/dist/clients/startup-scan.js +5 -2
- package/node_modules/pi-lens/dist/clients/startup-timing.js +19 -1
- package/node_modules/pi-lens/dist/clients/test-runner-client.js +151 -16
- package/node_modules/pi-lens/dist/clients/tool-event.js +56 -5
- package/node_modules/pi-lens/dist/clients/tool-policy.js +125 -20
- package/node_modules/pi-lens/dist/clients/tree-sitter-cache.js +75 -1
- package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +769 -64
- package/node_modules/pi-lens/dist/clients/tree-sitter-logger.js +1 -0
- package/node_modules/pi-lens/dist/clients/tree-sitter-shared.js +11 -0
- package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +90 -0
- package/node_modules/pi-lens/dist/clients/trivy-client.js +19 -1
- package/node_modules/pi-lens/dist/clients/widget-state.js +336 -36
- package/node_modules/pi-lens/dist/clients/zizmor-config.js +214 -14
- package/node_modules/pi-lens/dist/index.js +61407 -48577
- package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +476 -57
- package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +132 -43
- package/node_modules/pi-lens/dist/tools/lsp-navigation.js +46 -7
- package/node_modules/pi-lens/docs/agent-guide.md +6 -1
- package/node_modules/pi-lens/docs/ast-grep_rules_catalog.md +515 -506
- package/node_modules/pi-lens/docs/dispositions.md +21 -0
- package/node_modules/pi-lens/docs/features.md +19 -5
- package/node_modules/pi-lens/docs/globalconfig.md +3 -0
- package/node_modules/pi-lens/docs/language-coverage.md +71 -5
- package/node_modules/pi-lens/docs/mcp.md +2 -2
- package/node_modules/pi-lens/docs/servercapabilities.md +4 -1
- package/node_modules/pi-lens/docs/settings.md +19 -1
- package/node_modules/pi-lens/docs/usage.md +1 -0
- package/node_modules/pi-lens/package.json +27 -10
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/__snapshots__/no-reflect-get-js-snapshot.yml +23 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/__snapshots__/no-reflect-get-snapshot.yml +23 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/__snapshots__/ts-void-zero-snapshot.yml +23 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-bare-object-param-test.yml +16 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-chained-type-assertions-test.yml +15 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-compile-call-test.yml +29 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-dupe-class-members-test.yml +33 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-inner-html-js-test.yml +7 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-inner-html-test.yml +7 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-known-value-widening-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-non-null-assertion-test.yml +216 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-apply-js-test.yml +2 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-apply-test.yml +2 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-get-js-test.yml +2 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-get-test.yml +2 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-return-value-in-generator-test.yml +12 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-runtime-typeof-test.yml +33 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-server-bind-wildcard-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-shape-in-symbol-names-test.yml +13 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-sql-in-code-js-test.yml +5 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-sql-in-code-test.yml +5 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unknown-parameters-test.yml +12 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unknown-returns-test.yml +16 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unsafe-dictionary-any-test.yml +10 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unsafe-dictionary-unknown-test.yml +8 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/redundant-unsafe-function-test.yml +35 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/require-safety-comment-for-as-unknown-as-test.yml +177 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/ts-void-zero-test.yml +1 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-await-expression-member-js.yml +13 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-await-expression-member.yml +13 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-bare-host-path-in-win32-branch.yml +2 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-bare-object-param.yml +60 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-chained-type-assertions.yml +57 -12
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-compile-call.yml +63 -5
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-dupe-class-members.yml +52 -8
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-inner-html-js.yml +27 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-inner-html.yml +27 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-known-value-widening.yml +71 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-non-null-assertion.yml +316 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-raw-json-store-write.yml +7 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-apply-js.yml +22 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-apply.yml +23 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-get-js.yml +33 -5
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-get.yml +34 -8
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-return-value-in-generator.yml +22 -5
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-runtime-typeof.yml +121 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-server-bind-wildcard.yml +23 -7
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-shape-in-symbol-names.yml +68 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-sql-in-code-js.yml +41 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-sql-in-code.yml +41 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unknown-laundering.yml +6 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unknown-parameters.yml +67 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unknown-returns.yml +106 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unsafe-dictionary-any.yml +50 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unsafe-dictionary-unknown.yml +56 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-win32-isabsolute-for-qualification.yml +2 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/redundant-unsafe-function.yml +32 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/require-safety-comment-for-as-unknown-as.yml +184 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/ts-void-zero.yml +5 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/self-scan-baseline.json +5 -0
- package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +53 -1
- package/node_modules/pi-lens/scripts/download-grammars.js +25 -0
- package/node_modules/pi-lens/scripts/grammars.lock.json +9 -0
- package/node_modules/pi-lens/scripts/install-selftest.mjs +99 -11
- package/node_modules/pi-lens/scripts/lib/host-provided-deps.mjs +75 -0
- package/node_modules/pi-lens/scripts/lib/warm-loader-cache.mjs +285 -0
- package/node_modules/pi-lens/scripts/warm-loader-cache.mjs +233 -0
- package/node_modules/pi-lens/skills/pi-lens-ast-grep/SKILL.md +2 -0
- package/node_modules/pi-lens/skills/pi-lens-write-ast-grep-rule/SKILL.md +80 -3
- package/node_modules/pi-lens/skills/pi-lens-write-ast-grep-rule/reference.md +41 -0
- package/node_modules/pi-lens/vendor/grammars/tree-sitter-cue.wasm +0 -0
- package/node_modules/pi-mcp-adapter/CHANGELOG.md +36 -0
- package/node_modules/pi-mcp-adapter/README.md +47 -5
- package/node_modules/pi-mcp-adapter/cli.js +163 -1
- package/node_modules/pi-mcp-adapter/commands.ts +128 -22
- package/node_modules/pi-mcp-adapter/config.ts +25 -7
- package/node_modules/pi-mcp-adapter/direct-tools.ts +5 -4
- package/node_modules/pi-mcp-adapter/index.ts +219 -32
- package/node_modules/pi-mcp-adapter/init.ts +36 -4
- package/node_modules/pi-mcp-adapter/lifecycle.ts +315 -24
- package/node_modules/pi-mcp-adapter/mcp-auth-flow.ts +39 -6
- package/node_modules/pi-mcp-adapter/mcp-bearer-store.ts +387 -0
- package/node_modules/pi-mcp-adapter/mcp-callback-server.ts +27 -3
- package/node_modules/pi-mcp-adapter/mcp-code.ts +4 -0
- package/node_modules/pi-mcp-adapter/mcp-panel.ts +42 -13
- package/node_modules/pi-mcp-adapter/metadata-cache.ts +32 -21
- package/node_modules/pi-mcp-adapter/package-mcp-loader.ts +168 -0
- package/node_modules/pi-mcp-adapter/package.json +3 -1
- package/node_modules/pi-mcp-adapter/proxy-modes.ts +5 -4
- package/node_modules/pi-mcp-adapter/request-headers-command.ts +31 -37
- package/node_modules/pi-mcp-adapter/search-ranking.ts +92 -22
- package/node_modules/pi-mcp-adapter/server-manager.ts +140 -2
- package/node_modules/pi-mcp-adapter/session-recovery.ts +7 -0
- package/node_modules/pi-mcp-adapter/tool-approval.ts +15 -2
- package/node_modules/pi-mcp-adapter/tool-result-renderer.ts +44 -4
- package/node_modules/pi-mcp-adapter/types.ts +2 -0
- package/node_modules/pi-mcp-adapter/ui-server.ts +18 -16
- package/node_modules/pi-mcp-adapter/utils.ts +70 -0
- package/node_modules/pi-web-access/CHANGELOG.md +37 -0
- package/node_modules/pi-web-access/README.md +32 -13
- package/node_modules/pi-web-access/anysearch.ts +4 -2
- package/node_modules/pi-web-access/brave.ts +16 -4
- package/node_modules/pi-web-access/chrome-cookies.ts +86 -15
- package/node_modules/pi-web-access/curator-page.ts +6 -3
- package/node_modules/pi-web-access/curator-server.ts +4 -1
- package/node_modules/pi-web-access/data-uri-sanitize.ts +406 -0
- package/node_modules/pi-web-access/exa.ts +18 -7
- package/node_modules/pi-web-access/extract.ts +40 -5
- package/node_modules/pi-web-access/firecrawl.ts +18 -2
- package/node_modules/pi-web-access/gemini-search.ts +16 -4
- package/node_modules/pi-web-access/github-extract.ts +65 -36
- package/node_modules/pi-web-access/index.ts +60 -61
- package/node_modules/pi-web-access/openai-search.ts +17 -6
- package/node_modules/pi-web-access/package.json +1 -1
- package/node_modules/pi-web-access/page-query.ts +4 -2
- package/node_modules/pi-web-access/parallel-mcp.ts +249 -0
- package/node_modules/pi-web-access/parallel.ts +2 -2
- package/node_modules/pi-web-access/pdf-extract.ts +18 -5
- package/node_modules/pi-web-access/query-rewrite.ts +51 -0
- package/node_modules/pi-web-access/serper.ts +211 -0
- package/node_modules/pi-web-access/ssrf-protection.ts +12 -2
- package/node_modules/pi-web-access/summary-model-scope.ts +12 -4
- package/node_modules/pi-web-access/summary-review.ts +44 -22
- package/node_modules/pi-web-access/tavily.ts +16 -4
- package/node_modules/pi-web-access/utils.ts +87 -0
- package/node_modules/pi-web-access/valyu.ts +199 -0
- package/package.json +14 -14
package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-renderer.ts
CHANGED
|
@@ -1377,7 +1377,8 @@ function displayConfigCacheKey(config: ToolDisplayConfig): string {
|
|
|
1377
1377
|
config.diffViewMode,
|
|
1378
1378
|
config.diffIndicatorMode,
|
|
1379
1379
|
String(config.diffSplitMinWidth),
|
|
1380
|
-
String(config.
|
|
1380
|
+
String(config.editDiffCollapsedLines),
|
|
1381
|
+
String(config.writeDiffCollapsedLines),
|
|
1381
1382
|
config.diffWordWrap ? "1" : "0",
|
|
1382
1383
|
String(config.expandedPreviewMaxLines),
|
|
1383
1384
|
].join(":");
|
|
@@ -2232,10 +2233,22 @@ function resolveDiffDisplayLimit(
|
|
|
2232
2233
|
: DEFAULT_TOOL_DISPLAY_CONFIG.expandedPreviewMaxLines;
|
|
2233
2234
|
const collapsedLimit = Number.isFinite(maxCollapsedLines)
|
|
2234
2235
|
? maxCollapsedLines
|
|
2235
|
-
: DEFAULT_TOOL_DISPLAY_CONFIG.
|
|
2236
|
+
: DEFAULT_TOOL_DISPLAY_CONFIG.editDiffCollapsedLines;
|
|
2236
2237
|
return expanded ? Math.max(0, expandedLimit) : Math.max(1, collapsedLimit);
|
|
2237
2238
|
}
|
|
2238
2239
|
|
|
2240
|
+
/** Write collapsed body limit. Missing/NaN falls back to edit's limit. */
|
|
2241
|
+
function resolveWriteCollapsedLimit(config: ToolDisplayConfig): number {
|
|
2242
|
+
const value = config.writeDiffCollapsedLines;
|
|
2243
|
+
if (Number.isFinite(value)) {
|
|
2244
|
+
return Math.max(0, value);
|
|
2245
|
+
}
|
|
2246
|
+
const fallback = Number.isFinite(config.editDiffCollapsedLines)
|
|
2247
|
+
? config.editDiffCollapsedLines
|
|
2248
|
+
: DEFAULT_TOOL_DISPLAY_CONFIG.writeDiffCollapsedLines;
|
|
2249
|
+
return Math.max(0, fallback);
|
|
2250
|
+
}
|
|
2251
|
+
|
|
2239
2252
|
/**
|
|
2240
2253
|
* How many source rows/entries to fully highlight+render before applyLineLimit.
|
|
2241
2254
|
* Extra headroom covers word-wrap expansion so the display limit can still fill.
|
|
@@ -2602,7 +2615,7 @@ export function renderEditDiffResult(
|
|
|
2602
2615
|
const headerRows = renderHeaderRows(parsed.stats, mode, safeWidth, theme);
|
|
2603
2616
|
const displayLimit = resolveDiffDisplayLimit(
|
|
2604
2617
|
options.expanded,
|
|
2605
|
-
live.
|
|
2618
|
+
live.editDiffCollapsedLines,
|
|
2606
2619
|
live.expandedPreviewMaxLines,
|
|
2607
2620
|
);
|
|
2608
2621
|
const processBudget = resolveDiffProcessBudget(displayLimit, wordWrap);
|
|
@@ -2636,7 +2649,7 @@ export function renderEditDiffResult(
|
|
|
2636
2649
|
bodyRows,
|
|
2637
2650
|
safeWidth,
|
|
2638
2651
|
options.expanded,
|
|
2639
|
-
live.
|
|
2652
|
+
live.editDiffCollapsedLines,
|
|
2640
2653
|
live.expandedPreviewMaxLines,
|
|
2641
2654
|
parsed.stats.hunks,
|
|
2642
2655
|
theme,
|
|
@@ -2901,6 +2914,41 @@ function renderWriteOverwriteGuardRows(
|
|
|
2901
2914
|
return renderSingleDiffRow(buildWriteOverwriteGuardText(guard, width), "warning", width, theme);
|
|
2902
2915
|
}
|
|
2903
2916
|
|
|
2917
|
+
/** Folded write with a zero body limit: `↳ created • click to show more`. */
|
|
2918
|
+
function renderWriteCollapsedHintLine(
|
|
2919
|
+
wasOverwrite: boolean,
|
|
2920
|
+
width: number,
|
|
2921
|
+
theme: DiffTheme,
|
|
2922
|
+
hovered: boolean,
|
|
2923
|
+
headerLabel?: string,
|
|
2924
|
+
): string[] {
|
|
2925
|
+
const safeWidth = normalizeDiffRenderWidth(width);
|
|
2926
|
+
if (safeWidth === 0) {
|
|
2927
|
+
return [""];
|
|
2928
|
+
}
|
|
2929
|
+
const actionLabel = headerLabel?.trim() || (wasOverwrite ? "overwritten" : "created");
|
|
2930
|
+
const clickLabel = showMoreHintText();
|
|
2931
|
+
const candidates = [`↳ ${actionLabel} • ${clickLabel}`, `↳ ${actionLabel}`, actionLabel, "…"];
|
|
2932
|
+
let text = candidates[candidates.length - 1] ?? "…";
|
|
2933
|
+
for (const candidate of candidates) {
|
|
2934
|
+
if (visibleWidth(candidate) <= safeWidth) {
|
|
2935
|
+
text = candidate;
|
|
2936
|
+
break;
|
|
2937
|
+
}
|
|
2938
|
+
}
|
|
2939
|
+
if (visibleWidth(text) > safeWidth) {
|
|
2940
|
+
text = truncateToWidth(text, safeWidth, "");
|
|
2941
|
+
}
|
|
2942
|
+
const clickIndex = text.lastIndexOf(clickLabel);
|
|
2943
|
+
const styled =
|
|
2944
|
+
hovered && clickIndex >= 0
|
|
2945
|
+
? theme.fg("muted", text.slice(0, clickIndex)) +
|
|
2946
|
+
theme.fg("text", clickLabel) +
|
|
2947
|
+
theme.fg("muted", text.slice(clickIndex + clickLabel.length))
|
|
2948
|
+
: theme.fg("muted", text);
|
|
2949
|
+
return [clampDiffLineToWidth(styled, safeWidth)];
|
|
2950
|
+
}
|
|
2951
|
+
|
|
2904
2952
|
export function renderWriteDiffResult(
|
|
2905
2953
|
content: string | undefined,
|
|
2906
2954
|
options: DiffRenderOptions,
|
|
@@ -2977,6 +3025,27 @@ export function renderWriteDiffResult(
|
|
|
2977
3025
|
return cached;
|
|
2978
3026
|
}
|
|
2979
3027
|
|
|
3028
|
+
const writeCollapsedLimit = resolveWriteCollapsedLimit(live);
|
|
3029
|
+
if (!options.expanded && writeCollapsedLimit === 0) {
|
|
3030
|
+
return cache.set(
|
|
3031
|
+
safeWidth,
|
|
3032
|
+
options.expanded,
|
|
3033
|
+
mode,
|
|
3034
|
+
configKey,
|
|
3035
|
+
hovered,
|
|
3036
|
+
clampDiffLinesToWidth(
|
|
3037
|
+
renderWriteCollapsedHintLine(
|
|
3038
|
+
options.fileExistedBeforeWrite === true,
|
|
3039
|
+
safeWidth,
|
|
3040
|
+
theme,
|
|
3041
|
+
hovered,
|
|
3042
|
+
options.headerLabel,
|
|
3043
|
+
),
|
|
3044
|
+
safeWidth,
|
|
3045
|
+
),
|
|
3046
|
+
);
|
|
3047
|
+
}
|
|
3048
|
+
|
|
2980
3049
|
const header = renderWriteHeader(
|
|
2981
3050
|
options.fileExistedBeforeWrite === true,
|
|
2982
3051
|
safeWidth,
|
|
@@ -3027,7 +3096,7 @@ export function renderWriteDiffResult(
|
|
|
3027
3096
|
const data = getDetailedData();
|
|
3028
3097
|
const displayLimit = resolveDiffDisplayLimit(
|
|
3029
3098
|
options.expanded,
|
|
3030
|
-
|
|
3099
|
+
writeCollapsedLimit,
|
|
3031
3100
|
live.expandedPreviewMaxLines,
|
|
3032
3101
|
);
|
|
3033
3102
|
const processBudget = resolveDiffProcessBudget(displayLimit, wordWrap);
|
|
@@ -3065,7 +3134,7 @@ export function renderWriteDiffResult(
|
|
|
3065
3134
|
bodyRows,
|
|
3066
3135
|
safeWidth,
|
|
3067
3136
|
options.expanded,
|
|
3068
|
-
|
|
3137
|
+
writeCollapsedLimit,
|
|
3069
3138
|
live.expandedPreviewMaxLines,
|
|
3070
3139
|
data.hunkCount,
|
|
3071
3140
|
theme,
|
|
@@ -5,7 +5,9 @@ export interface ToolDisplayConfig {
|
|
|
5
5
|
diffViewMode: DiffViewMode;
|
|
6
6
|
diffIndicatorMode: DiffIndicatorMode;
|
|
7
7
|
diffSplitMinWidth: number;
|
|
8
|
-
|
|
8
|
+
editDiffCollapsedLines: number;
|
|
9
|
+
/** Write-only collapsed body lines. 0 = `↳ created • click to show more`. */
|
|
10
|
+
writeDiffCollapsedLines: number;
|
|
9
11
|
diffWordWrap: boolean;
|
|
10
12
|
expandedPreviewMaxLines: number;
|
|
11
13
|
}
|
|
@@ -14,8 +16,10 @@ export const DEFAULT_TOOL_DISPLAY_CONFIG: ToolDisplayConfig = {
|
|
|
14
16
|
diffViewMode: "auto",
|
|
15
17
|
diffIndicatorMode: "bars",
|
|
16
18
|
diffSplitMinWidth: 120,
|
|
17
|
-
/** Collapsed
|
|
18
|
-
|
|
19
|
+
/** Collapsed edit/diff body: ~half a typical terminal after chrome. */
|
|
20
|
+
editDiffCollapsedLines: 24,
|
|
21
|
+
/** Write create/overwrite collapsed body; 0 shows only the expand hint. */
|
|
22
|
+
writeDiffCollapsedLines: 0,
|
|
19
23
|
diffWordWrap: true,
|
|
20
24
|
/**
|
|
21
25
|
* Expanded tool/diff body cap. 40 ≈ one screen of content after title,
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
} from "@earendil-works/pi-tui";
|
|
9
9
|
import { TOOL_LOADING_INTERVAL_MS, toolLoadingIcon } from "../../utils/tool-loading-icon.ts";
|
|
10
10
|
import { sanitizeToolResultText } from "../../utils/tool-result-sanitize.ts";
|
|
11
|
-
import { showMoreHintText } from "../show-more-hint.ts";
|
|
11
|
+
import { isToolTuiFullscreen, showMoreHintText } from "../show-more-hint.ts";
|
|
12
12
|
|
|
13
13
|
const PATCH_KEY = Symbol.for("pi.ccstyle.tool-grouping-patch");
|
|
14
14
|
const PARENT_KEY = Symbol.for("pi.ccstyle.tool-grouping-parent");
|
|
@@ -274,6 +274,17 @@ function groupChildWidth(width: number): number {
|
|
|
274
274
|
return Math.max(1, panelInnerWidth(width));
|
|
275
275
|
}
|
|
276
276
|
|
|
277
|
+
type SettledGroupCache = {
|
|
278
|
+
width: number;
|
|
279
|
+
hover: boolean;
|
|
280
|
+
theme: unknown;
|
|
281
|
+
fullscreen: boolean;
|
|
282
|
+
children: readonly unknown[];
|
|
283
|
+
args: unknown[];
|
|
284
|
+
results: unknown[];
|
|
285
|
+
lines: string[];
|
|
286
|
+
};
|
|
287
|
+
|
|
277
288
|
export class ToolGroupComponent extends Container {
|
|
278
289
|
readonly toolCallId = `ccstyle-tool-group-${nextGroupId++}`;
|
|
279
290
|
readonly toolName = "Tool group";
|
|
@@ -284,6 +295,8 @@ export class ToolGroupComponent extends Container {
|
|
|
284
295
|
}
|
|
285
296
|
private hintHovered = false;
|
|
286
297
|
private readonly patch: Patch;
|
|
298
|
+
/** 仅缓存已完成且折叠的分组;pending / expanded 每帧现算。 */
|
|
299
|
+
private settledCache: SettledGroupCache | undefined;
|
|
287
300
|
|
|
288
301
|
constructor(patch: Patch) {
|
|
289
302
|
super();
|
|
@@ -292,11 +305,13 @@ export class ToolGroupComponent extends Container {
|
|
|
292
305
|
}
|
|
293
306
|
|
|
294
307
|
addTool(tool: any): void {
|
|
308
|
+
this.settledCache = undefined;
|
|
295
309
|
this.children.push(tool);
|
|
296
310
|
tool[PARENT_KEY] = this;
|
|
297
311
|
}
|
|
298
312
|
|
|
299
313
|
releaseTools(): any[] {
|
|
314
|
+
this.settledCache = undefined;
|
|
300
315
|
const tools = [...this.children];
|
|
301
316
|
this.children.length = 0;
|
|
302
317
|
this.patch.groups.delete(this);
|
|
@@ -304,18 +319,21 @@ export class ToolGroupComponent extends Container {
|
|
|
304
319
|
}
|
|
305
320
|
|
|
306
321
|
removeTool(tool: any): void {
|
|
322
|
+
this.settledCache = undefined;
|
|
307
323
|
const index = this.children.indexOf(tool);
|
|
308
324
|
if (index >= 0) this.children.splice(index, 1);
|
|
309
325
|
if (tool?.[PARENT_KEY] === this) delete tool[PARENT_KEY];
|
|
310
326
|
}
|
|
311
327
|
|
|
312
328
|
setExpanded(expanded: boolean): void {
|
|
329
|
+
if (this._expanded !== expanded) this.settledCache = undefined;
|
|
313
330
|
this._expanded = expanded;
|
|
314
331
|
for (const tool of this.children)
|
|
315
332
|
(tool as Component & { setExpanded?: (expanded: boolean) => void }).setExpanded?.(expanded);
|
|
316
333
|
}
|
|
317
334
|
|
|
318
335
|
setHintHovered(hovered: boolean): void {
|
|
336
|
+
if (this.hintHovered !== hovered) this.settledCache = undefined;
|
|
319
337
|
this.hintHovered = hovered;
|
|
320
338
|
}
|
|
321
339
|
|
|
@@ -344,10 +362,53 @@ export class ToolGroupComponent extends Container {
|
|
|
344
362
|
}
|
|
345
363
|
|
|
346
364
|
invalidate(): void {
|
|
365
|
+
this.settledCache = undefined;
|
|
347
366
|
for (const tool of this.children) tool.invalidate?.();
|
|
348
367
|
}
|
|
349
368
|
|
|
369
|
+
private settledCacheHit(width: number): string[] | undefined {
|
|
370
|
+
const cache = this.settledCache;
|
|
371
|
+
if (!cache || this._expanded) return;
|
|
372
|
+
if (
|
|
373
|
+
cache.width !== width ||
|
|
374
|
+
cache.hover !== this.hintHovered ||
|
|
375
|
+
cache.theme !== this.patch.theme ||
|
|
376
|
+
cache.fullscreen !== isToolTuiFullscreen()
|
|
377
|
+
) {
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
const tools = this.children as any[];
|
|
381
|
+
if (cache.children.length !== tools.length) return;
|
|
382
|
+
for (let i = 0; i < tools.length; i++) {
|
|
383
|
+
const tool = tools[i];
|
|
384
|
+
if (
|
|
385
|
+
cache.children[i] !== tool ||
|
|
386
|
+
cache.args[i] !== tool?.args ||
|
|
387
|
+
cache.results[i] !== tool?.result ||
|
|
388
|
+
status(tool) === "pending"
|
|
389
|
+
) {
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
return cache.lines;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
private storeSettledCache(width: number, lines: string[]): void {
|
|
397
|
+
this.settledCache = {
|
|
398
|
+
width,
|
|
399
|
+
hover: this.hintHovered,
|
|
400
|
+
theme: this.patch.theme,
|
|
401
|
+
fullscreen: isToolTuiFullscreen(),
|
|
402
|
+
children: [...this.children],
|
|
403
|
+
args: (this.children as any[]).map((tool) => tool?.args),
|
|
404
|
+
results: (this.children as any[]).map((tool) => tool?.result),
|
|
405
|
+
lines,
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
|
|
350
409
|
render(width: number): string[] {
|
|
410
|
+
const cached = this.settledCacheHit(width);
|
|
411
|
+
if (cached) return cached;
|
|
351
412
|
const theme = this.patch.theme;
|
|
352
413
|
const fg = (color: string, text: string) => theme?.fg?.(color, text) ?? text;
|
|
353
414
|
const counts = { pending: 0, success: 0, error: 0 };
|
|
@@ -420,6 +481,8 @@ export class ToolGroupComponent extends Container {
|
|
|
420
481
|
lines.push(paddedBackgroundRow(theme, backgroundSlot, line, width));
|
|
421
482
|
}
|
|
422
483
|
lines.push(paddedBackgroundRow(theme, backgroundSlot, "", width));
|
|
484
|
+
} else if (counts.pending === 0) {
|
|
485
|
+
this.storeSettledCache(width, lines);
|
|
423
486
|
}
|
|
424
487
|
return lines;
|
|
425
488
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@herbertgao/pi-cc-extensions",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.57",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "A Pi productivity suite with Claude Code-style UI, context inspection, and agent/session references",
|
|
6
6
|
"type": "module",
|
|
@@ -69,8 +69,8 @@
|
|
|
69
69
|
},
|
|
70
70
|
"x-upstream": {
|
|
71
71
|
"package": "pi-cc-extensions",
|
|
72
|
-
"version": "0.8.
|
|
72
|
+
"version": "0.8.64",
|
|
73
73
|
"repository": "https://github.com/minuque/pi-cc-extensions",
|
|
74
|
-
"commit": "
|
|
74
|
+
"commit": "4709081a28255b8bdfe610620a2a9ee8951013d6"
|
|
75
75
|
}
|
|
76
76
|
}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.16.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#90](https://github.com/HerbertGao/pi-extensions/pull/90) [`74b7bce`](https://github.com/HerbertGao/pi-extensions/commit/74b7bceac14c36961d25af9cbc6aecc502bdaf3b) Thanks [@HerbertGao](https://github.com/HerbertGao)! - Selectively sync pi-subagents with upstream 0.18.0, including worktree controls, background-by-default top-level agents, usage and cost reporting, programmatic activity tracking, child-session shutdown, and nested print-mode coverage.
|
|
8
|
+
|
|
3
9
|
## 0.15.5
|
|
4
10
|
|
|
5
11
|
### Patch Changes
|
|
@@ -13,7 +13,7 @@ Spawn specialized agents that run in isolated sessions — each with its own too
|
|
|
13
13
|
## Features
|
|
14
14
|
|
|
15
15
|
- **Claude Code look & feel** — same tool names, calling conventions, and UI patterns (`Agent`, `get_subagent_result`, `steer_subagent`) — feels native
|
|
16
|
-
- **Parallel background agents** —
|
|
16
|
+
- **Parallel background agents** — top-level agents run detached by default, with automatic queuing (configurable concurrency limit, default 10) and smart group join; nested delegation still defaults to foreground
|
|
17
17
|
- **Live widget UI** — persistent above-editor widget with animated spinners, live tool activity, token counts, and colored status icons. Configurable via `/agents → Settings → Widget`: `all` (every agent), `background` (default — hides foreground runs, which already render inline as the `Agent` tool result), or `off`
|
|
18
18
|
- **FleetView** — Claude Code-style navigable list of `main` + every running subagent rendered below the editor (earliest-launched first). Press `↓` (or `←`) at an empty prompt to jump in, `↑`/`↓` to move the selection, `Enter` to open the selected agent's live, auto-updating conversation, `Esc` to return. Finished agents linger briefly before dropping out, and a viewer stays open through completion so you can read the final output. Toggle via `/agents → Settings → Fleet view`
|
|
19
19
|
- **Conversation viewer** — select any agent in `/agents` to open a live-scrolling overlay of its full conversation (auto-follows new content, scroll up to pause). Steer a running agent inline by pressing `Enter` to open a composer, typing, then `Enter` to send (`Esc` or an empty submit returns) — the message appears as a user message and redirects the agent after its current tool. Stop a still-running agent by pressing `x` (then `x` again to confirm) — both work for background agents too
|
|
@@ -26,7 +26,8 @@ Spawn specialized agents that run in isolated sessions — each with its own too
|
|
|
26
26
|
- **Fuzzy model selection** — specify models by name (`"haiku"`, `"sonnet"`) instead of full IDs, with automatic filtering to only available/configured models
|
|
27
27
|
- **Context inheritance** — optionally fork the parent conversation into a sub-agent so it knows what's been discussed
|
|
28
28
|
- **Persistent agent memory** — three scopes (project, local, user) with automatic read-only fallback for agents without write tools
|
|
29
|
-
- **Git worktree isolation** — run agents in isolated repo copies;
|
|
29
|
+
- **Git worktree isolation** — run agents in isolated repo copies; `isolation: off` and the project-wide `worktreeIsolation` switch keep work in the current checkout, while preservation commits bypass interactive signing
|
|
30
|
+
- **Usage and cost reporting** — optionally include subagent spend in the parent session's stats (`reportUsage`) and show estimated USD cost across subagent UI surfaces (`showCost`)
|
|
30
31
|
- **Skill preloading** — inject named skills into agent system prompts, discovered from `.pi/skills/`, `.agents/skills/`, and global locations (Pi-standard `<name>/SKILL.md` directory layout supported)
|
|
31
32
|
- **Tool denylist** — block specific tools via `disallowed_tools` frontmatter
|
|
32
33
|
- **Styled completion notifications** — background agent results render as themed, compact notification boxes (icon, stats, result preview) instead of raw XML. Expandable to show full output. Group completions render each agent individually
|
|
@@ -60,7 +61,7 @@ Agent({
|
|
|
60
61
|
})
|
|
61
62
|
```
|
|
62
63
|
|
|
63
|
-
|
|
64
|
+
Agents run in the background by default: calls return an ID immediately and notify on completion. Pass `run_in_background: false` to block and return the full result inline. Nested spawns keep the safer foreground default unless explicitly overridden.
|
|
64
65
|
|
|
65
66
|
### Scheduling
|
|
66
67
|
|
|
@@ -227,7 +228,7 @@ All fields are optional — sensible defaults for everything.
|
|
|
227
228
|
| `skills` | `true` | Inherit skills from parent. Can be a comma-separated list of skill names to preload (see [Skill Preloading](#skill-preloading) for discovery locations) |
|
|
228
229
|
| `memory` | — | Persistent agent memory scope: `project`, `local`, or `user`. Auto-detects read-only agents |
|
|
229
230
|
| `disallowed_tools` | — | Comma-separated tools to deny even if extensions provide them |
|
|
230
|
-
| `isolation` | — |
|
|
231
|
+
| `isolation` | — | `worktree` runs in an isolated git worktree; `off` vetoes a caller-requested worktree |
|
|
231
232
|
| `model` | inherit parent | Model — `provider/modelId` or fuzzy name (`"haiku"`, `"sonnet"`). Resolved tolerantly (`.`/`-` and a trailing date stamp are interchangeable) and falls back to the same model under another provider if the named one doesn't have it |
|
|
232
233
|
| `thinking` | inherit | off, minimal, low, medium, high, xhigh, max — actual availability depends on your pi version and model; pi clamps unsupported levels down |
|
|
233
234
|
| `max_turns` | unlimited | Max agentic turns before graceful shutdown. `0` or omit for unlimited |
|
|
@@ -237,7 +238,7 @@ All fields are optional — sensible defaults for everything.
|
|
|
237
238
|
| `allowed_subagents` | none | Opt in to scoped nested `Agent`, `get_subagent_result`, and `steer_subagent` tools. Omitted / empty / `none` / `false` = no nesting; `all` (or `"*"` / `true`) = any enabled agent; comma-separated list = only those agent types |
|
|
238
239
|
| `prompt_mode` | `replace` | `replace`: body is the full system prompt (no AGENTS.md / CLAUDE.md inheritance). `append`: body appended to parent's prompt (agent acts as a "parent twin" — inherits parent's AGENTS.md / CLAUDE.md) |
|
|
239
240
|
| `inherit_context` | `false` | Fork parent conversation into agent |
|
|
240
|
-
| `run_in_background` | `
|
|
241
|
+
| `run_in_background` | `backgroundByDefault` | Pin this agent to background (`true`) or foreground (`false`); omit to follow the project default |
|
|
241
242
|
| `isolated` | `false` | Hermetic specialist mode: forces `extensions: false` + `skills: false` + drops `ext:` selectors. Only built-in tools. Distinct from `isolation: worktree` (filesystem) |
|
|
242
243
|
| `enabled` | `true` | Set to `false` to disable an agent (useful for hiding a default agent per-project) |
|
|
243
244
|
|
|
@@ -298,6 +299,7 @@ A few rules the examples don't make obvious:
|
|
|
298
299
|
- Any `ext:` entry flips extension tools to an explicit allowlist — unnamed extensions still load (handlers fire) but expose no tools. So `tools: "*, ext:mcp/search"` exposes only `search` from `mcp`, nothing from any other extension.
|
|
299
300
|
- Extension names match case-insensitively (`[Mcp]` = `[mcp]`); tool names in `ext:foo/bar` stay case-sensitive.
|
|
300
301
|
- Extensions that register tools **lazily** work too. MCP-backed extensions typically can't enumerate their tools until their servers connect, so they register from `session_start` or `before_agent_start` rather than at load. Subagent scoping is re-derived as tools appear, so these surface normally — including under `ext:` selectors, which keep narrowing correctly no matter when a tool shows up.
|
|
302
|
+
- Extensions bound into a child session receive `session_shutdown` before disposal, including record eviction and root-session shutdown; release per-session timers, watchers, sockets, and temp resources there.
|
|
301
303
|
- An installed **package** extension matches by its package short name (`@scope/pi-subagents` → `[pi-subagents]`), in addition to its path-derived name (a package whose entry is `src/index.ts` also answers to `[src]`). Prefer the package name — the path-derived one is incidental.
|
|
302
304
|
- Plain `tools:` typos fail loudly: `tools: reed, grep` fires `tools-error:…` instead of silently producing an under-tooled agent.
|
|
303
305
|
- `exclude_extensions:` wins over `extensions:` and over `ext:` selectors — an excluded extension never loads and a `tools: ext:` entry can't pull it back. Plain names only (no paths, no `*`); a name matching nothing fires an `extension-error:…` warning.
|
|
@@ -310,19 +312,19 @@ A few rules the examples don't make obvious:
|
|
|
310
312
|
|
|
311
313
|
Launch a sub-agent.
|
|
312
314
|
|
|
313
|
-
| Parameter | Type
|
|
314
|
-
| ------------------- |
|
|
315
|
-
| `prompt` | string
|
|
316
|
-
| `description` | string
|
|
317
|
-
| `subagent_type` | string
|
|
318
|
-
| `model` | string
|
|
319
|
-
| `thinking` | string
|
|
320
|
-
| `max_turns` | number
|
|
321
|
-
| `run_in_background` | boolean
|
|
322
|
-
| `resume` | string
|
|
323
|
-
| `isolated` | boolean
|
|
324
|
-
| `isolation` | `"worktree"` | no |
|
|
325
|
-
| `inherit_context` | boolean
|
|
315
|
+
| Parameter | Type | Required | Description |
|
|
316
|
+
| ------------------- | ----------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
317
|
+
| `prompt` | string | yes | The task for the agent |
|
|
318
|
+
| `description` | string | yes | Short 3-5 word summary (shown in UI) |
|
|
319
|
+
| `subagent_type` | string | yes | Agent type (built-in or custom) |
|
|
320
|
+
| `model` | string | no | Model — `provider/modelId` or fuzzy name (`"haiku"`, `"sonnet"`). Resolved tolerantly (`.`/`-` and a trailing date stamp interchangeable) with provider fallback |
|
|
321
|
+
| `thinking` | string | no | Thinking level: off, minimal, low, medium, high, xhigh, max (availability depends on pi version and model) |
|
|
322
|
+
| `max_turns` | number | no | Max agentic turns. Omit for unlimited (default) |
|
|
323
|
+
| `run_in_background` | boolean | no | Defaults to `true`; `false` blocks and returns the result inline |
|
|
324
|
+
| `resume` | string | no | Agent ID to resume a previous session |
|
|
325
|
+
| `isolated` | boolean | no | No extension/MCP tools |
|
|
326
|
+
| `isolation` | `"off"` \| `"worktree"` | no | `worktree` isolates; `off` keeps the current checkout. Omitted when worktree isolation is disabled |
|
|
327
|
+
| `inherit_context` | boolean | no | Fork parent conversation into agent |
|
|
326
328
|
|
|
327
329
|
### `get_subagent_result`
|
|
328
330
|
|
|
@@ -388,7 +390,7 @@ Instead of hard-aborting at the turn limit, agents get a graceful shutdown:
|
|
|
388
390
|
|
|
389
391
|
## Concurrency
|
|
390
392
|
|
|
391
|
-
Background agents are subject to a configurable concurrency limit (default:
|
|
393
|
+
Background agents are subject to a configurable concurrency limit (default: 10). Excess agents are automatically queued and start as running agents complete. The widget shows queued agents as a collapsed count.
|
|
392
394
|
|
|
393
395
|
Foreground agents bypass the queue — they block the parent anyway.
|
|
394
396
|
|
|
@@ -432,12 +434,18 @@ When on, each subagent spawn's effective model is validated against pi's own `en
|
|
|
432
434
|
|
|
433
435
|
## Persistent Settings
|
|
434
436
|
|
|
435
|
-
Runtime tuning values set via `/agents` → Settings (
|
|
437
|
+
Runtime tuning values set via `/agents` → Settings (including background default, worktree isolation, usage reporting, and cost display) persist across pi restarts. Two files, merged on load:
|
|
436
438
|
|
|
437
439
|
- **Global:** `~/.pi/agent/subagents.json` — your machine-wide defaults. Edit by hand; the `/agents` menu never writes here.
|
|
438
440
|
- **Project:** `<cwd>/.pi/subagents.json` — per-project overrides. Written by `/agents` → Settings.
|
|
439
441
|
|
|
440
|
-
**Precedence:** project overrides global on any field present in both. Missing fields fall back to the hardcoded defaults (max concurrency `
|
|
442
|
+
**Precedence:** project overrides global on any field present in both. Missing fields fall back to the hardcoded defaults (max concurrency `10`, background by default enabled, default max turns unlimited, grace turns `5`, nested depth `2`, join mode `smart`, worktree isolation enabled, usage/cost reporting disabled, strict agent files disabled, defaults enabled).
|
|
443
|
+
|
|
444
|
+
**Background by default** (`backgroundByDefault`, default `true`): unqualified top-level `Agent` calls run detached. Set `false` to restore foreground-by-default behavior. Explicit tool or agent-file `run_in_background` values win. Nested calls always default to foreground so a parent cannot finish and stop an uncollected child.
|
|
445
|
+
|
|
446
|
+
**Worktree isolation** (`worktreeIsolation`, default `true`): set `false` to reject worktree creation on every spawn path and remove the `isolation` parameter and guidance on the next Pi session. `isolation: off` in agent frontmatter vetoes a caller's `worktree` request.
|
|
447
|
+
|
|
448
|
+
**Usage and cost** (`reportUsage` and `showCost`, both default `false`): `reportUsage` attaches child usage to parent tool results so Pi session stats include delegated work; `showCost` renders Pi's estimated USD totals in subagent surfaces. They are independent.
|
|
441
449
|
|
|
442
450
|
**Strict agent files** (`strictAgentFiles`, default `false`): fail extension startup when any discovered agent file is unreadable or malformed. Enable via `/agents → Settings → Strict agent files` or set `true` in `subagents.json`. Strictness applies only to startup; reloads before later Agent calls remain tolerant so a file edited incorrectly mid-session is skipped with a warning instead of aborting the call.
|
|
443
451
|
|
|
@@ -460,7 +468,7 @@ Launch an autonomous agent. Available types:
|
|
|
460
468
|
Custom agents live in .pi/agents/ or {{agentDir}}/agents/.
|
|
461
469
|
```
|
|
462
470
|
|
|
463
|
-
Placeholders: `{{typeList}}` (full per-agent descriptions), `{{compactTypeList}}` (first sentence each), `{{agentDir}}`, `{{scheduleGuideline}}` (expands with its own leading newline + `-` bullet when scheduling is on — place it directly after your last rule line; empty when scheduling is off). Unknown placeholders are left verbatim with a stderr warning; a missing or empty file falls back to `"full"` with a warning. Note the usual trust umbrella: a project-level file shapes the orchestrator's prompt, same as project agents and extensions do.
|
|
471
|
+
Placeholders: `{{typeList}}` (full per-agent descriptions), `{{compactTypeList}}` (first sentence each), `{{agentDir}}`, `{{isolationGuideline}}` (empty when worktrees are disabled), `{{scheduleGuideline}}` (expands with its own leading newline + `-` bullet when scheduling is on — place it directly after your last rule line; empty when scheduling is off). Unknown placeholders are left verbatim with a stderr warning; a missing or empty file falls back to `"full"` with a warning. Note the usual trust umbrella: a project-level file shapes the orchestrator's prompt, same as project agents and extensions do.
|
|
464
472
|
|
|
465
473
|
**Starting point:** copy [`examples/agent-tool-description.md`](examples/agent-tool-description.md) — it reproduces the default full description exactly (a CI test keeps it in sync), so you can trim from a known-good baseline instead of writing from scratch.
|
|
466
474
|
|
|
@@ -14,19 +14,19 @@ If the target is already known, use a direct tool — `read` for a known path, `
|
|
|
14
14
|
## Usage notes
|
|
15
15
|
|
|
16
16
|
- Always include a short (3-5 word) description summarizing what the agent will do (shown in UI).
|
|
17
|
-
- When you launch multiple agents for independent work, send them in a single message with multiple tool uses
|
|
17
|
+
- When you launch multiple agents for independent work, send them in a single message with multiple tool uses so they run concurrently.
|
|
18
18
|
- When the agent is done, it returns a single message back to you. The result is not visible to the user — to show the user, send a text message with a concise summary.
|
|
19
19
|
- Trust but verify: an agent's summary describes what it intended to do, not necessarily what it did. When an agent writes or edits code, check the actual changes before reporting work as done.
|
|
20
|
-
-
|
|
21
|
-
-
|
|
20
|
+
- Agents run in the background by default. You will be notified when one completes — do NOT poll or sleep waiting for it.
|
|
21
|
+
- Pass `run_in_background: false` only when your very next action depends on the result and nothing else could usefully happen while it runs.
|
|
22
|
+
- Never fabricate or predict a pending agent's results; if asked before completion, say it is still running.
|
|
22
23
|
- Use resume with an agent ID to continue a previous agent's work. A new (non-resume) Agent call starts a fresh agent with no memory of prior runs, so the prompt must be self-contained.
|
|
23
24
|
- Use steer_subagent to send mid-run messages to a running background agent.
|
|
24
25
|
- Clearly tell the agent whether you expect it to write code or just to do research (search, file reads, etc.), since it is not aware of the user's intent.
|
|
25
26
|
- If an agent's description says it should be used proactively, try to use it without the user having to ask for it first.
|
|
26
27
|
- Use model to specify a different model (as "provider/modelId", or fuzzy e.g. "haiku", "sonnet").
|
|
27
28
|
- Use thinking to control extended thinking level.
|
|
28
|
-
- Use inherit_context if the agent needs the parent conversation history.
|
|
29
|
-
- Use isolation: "worktree" to run the agent in an isolated git worktree (safe parallel file modifications). The worktree is automatically cleaned up if the agent makes no changes; otherwise the path and branch are returned in the result.{{scheduleGuideline}}
|
|
29
|
+
- Use inherit_context if the agent needs the parent conversation history.{{isolationGuideline}}{{scheduleGuideline}}
|
|
30
30
|
|
|
31
31
|
## Writing the prompt
|
|
32
32
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@herbertgao/pi-subagents",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.0",
|
|
4
4
|
"description": "Claude Code-style autonomous subagents for Pi, with HerbertGao-maintained UI extensions.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agent",
|
|
@@ -46,15 +46,15 @@
|
|
|
46
46
|
"dependencies": {
|
|
47
47
|
"@sinclair/typebox": "^0.34.49",
|
|
48
48
|
"croner": "^10.0.1",
|
|
49
|
-
"nanoid": "^5.
|
|
49
|
+
"nanoid": "^5.1.16"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@vitest/coverage-istanbul": "^4.1.10"
|
|
53
53
|
},
|
|
54
54
|
"peerDependencies": {
|
|
55
|
-
"@earendil-works/pi-ai": ">=0.
|
|
56
|
-
"@earendil-works/pi-coding-agent": ">=0.
|
|
57
|
-
"@earendil-works/pi-tui": ">=0.
|
|
55
|
+
"@earendil-works/pi-ai": ">=0.81.0",
|
|
56
|
+
"@earendil-works/pi-coding-agent": ">=0.81.0",
|
|
57
|
+
"@earendil-works/pi-tui": ">=0.81.0"
|
|
58
58
|
},
|
|
59
59
|
"engines": {
|
|
60
60
|
"node": ">=22.19.0"
|
|
@@ -68,8 +68,8 @@
|
|
|
68
68
|
},
|
|
69
69
|
"x-upstream": {
|
|
70
70
|
"package": "@tintinweb/pi-subagents",
|
|
71
|
-
"version": "0.
|
|
71
|
+
"version": "0.18.0",
|
|
72
72
|
"repository": "https://github.com/tintinweb/pi-subagents",
|
|
73
|
-
"commit": "
|
|
73
|
+
"commit": "3f9d35cd078d18a141eb5a6d8f4fc5010d756280"
|
|
74
74
|
}
|
|
75
75
|
}
|
|
@@ -245,7 +245,13 @@ export function serializeAgentFile(cfg: AgentConfig): string {
|
|
|
245
245
|
if (cfg.disallowedTools?.length)
|
|
246
246
|
fmFields.push(`disallowed_tools: ${cfg.disallowedTools.join(", ")}`)
|
|
247
247
|
if (cfg.inheritContext) fmFields.push("inherit_context: true")
|
|
248
|
-
|
|
248
|
+
// Both cases, not just `true`: with `backgroundByDefault` on, omitting the
|
|
249
|
+
// field means background, so `false` is the only way to pin an agent file to
|
|
250
|
+
// foreground and is no longer interchangeable with absence. No caller can
|
|
251
|
+
// reach it yet — Eject only handles built-in defaults, which omit the field —
|
|
252
|
+
// so this keeps the writer symmetric with the loader, nothing more.
|
|
253
|
+
if (cfg.runInBackground !== undefined)
|
|
254
|
+
fmFields.push(`run_in_background: ${cfg.runInBackground}`)
|
|
249
255
|
if (cfg.outputTranscript === false) fmFields.push("output_transcript: false")
|
|
250
256
|
if (cfg.isolated) fmFields.push("isolated: true")
|
|
251
257
|
if (cfg.memory) fmFields.push(`memory: ${cfg.memory}`)
|