@herbertgao/pi-extensions 2026.8.11 → 2026.8.13
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 +23 -10
- package/{node_modules/@herbertgao/pi-mermaid-open/LICENSE → THIRD_PARTY_NOTICES.md} +19 -1
- package/node_modules/@czottmann/pi-automode/CHANGELOG.md +15 -0
- package/node_modules/@czottmann/pi-automode/README.md +5 -3
- package/node_modules/@czottmann/pi-automode/docs/adr/ADR-001-permission-precedence-and-trust-boundaries.md +2 -0
- package/node_modules/@czottmann/pi-automode/docs/adr/ADR-002-global-config-in-extension-data-directory.md +60 -0
- package/node_modules/@czottmann/pi-automode/docs/adr/INDEX.md +1 -0
- package/node_modules/@czottmann/pi-automode/docs/automode-classifier-flow.md +4 -4
- package/node_modules/@czottmann/pi-automode/docs/configuration.md +20 -4
- package/node_modules/@czottmann/pi-automode/docs/observability-logging.md +1 -1
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/bash.ts +692 -0
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/config.ts +181 -3
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/constants.ts +4 -1
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/extension.ts +143 -36
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/hard-deny.ts +103 -148
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/paths.ts +32 -6
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/permissions.ts +344 -22
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode.ts +1 -0
- package/node_modules/@czottmann/pi-automode/package.json +4 -1
- package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +2 -1
- package/node_modules/@herbertgao/pi-cc-extensions/README.md +2 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +4 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +21 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/agent-summary/core.ts +1 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/context.ts +19 -19
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +4 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +2 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +10 -2
- package/node_modules/@herbertgao/pi-cc-extensions/package.json +3 -3
- package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +10 -0
- package/node_modules/@herbertgao/pi-subagents/README.md +21 -15
- package/node_modules/@herbertgao/pi-subagents/package.json +3 -3
- package/node_modules/@herbertgao/pi-subagents/src/agent-file-toggle.ts +11 -8
- package/node_modules/@herbertgao/pi-subagents/src/agent-manager.ts +184 -106
- package/node_modules/@herbertgao/pi-subagents/src/cross-extension-rpc.ts +31 -11
- package/node_modules/@herbertgao/pi-subagents/src/custom-agents.ts +9 -1
- package/node_modules/@herbertgao/pi-subagents/src/index.ts +156 -31
- package/node_modules/@herbertgao/pi-subagents/src/invocation-config.ts +17 -0
- package/node_modules/@herbertgao/pi-subagents/src/model-resolver.ts +14 -0
- package/node_modules/@herbertgao/pi-subagents/src/schedule.ts +8 -0
- package/node_modules/@herbertgao/pi-subagents/src/settings.ts +32 -1
- package/node_modules/@herbertgao/pi-subagents/src/types.ts +17 -2
- package/node_modules/@herbertgao/pi-subagents/src/ui/agent-widget.ts +23 -2
- package/node_modules/@herbertgao/pi-subagents/src/ui/conversation-viewer.ts +259 -24
- package/node_modules/@juicesharp/rpiv-ask-user-question/package.json +2 -2
- package/node_modules/@luxusai/pi-hindsight/CHANGELOG.md +376 -0
- package/node_modules/@luxusai/pi-hindsight/README.md +92 -0
- package/node_modules/@luxusai/pi-hindsight/docs/adr/001-memory-lifecycle-and-scope.md +56 -0
- package/node_modules/@luxusai/pi-hindsight/docs/adr/002-explicit-routing-strategy-seam.md +169 -0
- package/node_modules/@luxusai/pi-hindsight/docs/adr/003-tui-memory-mode-vocabulary.md +107 -0
- package/node_modules/@luxusai/pi-hindsight/docs/adr/004-lifeos-dual-bank-design.md +89 -0
- package/node_modules/@luxusai/pi-hindsight/docs/adr/005-domain-banks-and-agent-first-surface.md +189 -0
- package/node_modules/@luxusai/pi-hindsight/docs/assets/logos/pi-hindsight-logo-dark.webp +0 -0
- package/node_modules/@luxusai/pi-hindsight/docs/assets/logos/pi-hindsight-logo-dark@2x.webp +0 -0
- package/node_modules/@luxusai/pi-hindsight/docs/coding-memory-evaluation.md +54 -0
- package/node_modules/@luxusai/pi-hindsight/docs/compatibility.md +75 -0
- package/node_modules/@luxusai/pi-hindsight/docs/hindsight-core-functions.md +300 -0
- package/node_modules/@luxusai/pi-hindsight/docs/mission-and-mental-model-quality.md +158 -0
- package/node_modules/@luxusai/pi-hindsight/docs/next-opt-out-design.md +164 -0
- package/node_modules/@luxusai/pi-hindsight/docs/risky-memory-modes.md +139 -0
- package/node_modules/@luxusai/pi-hindsight/docs/starter-mental-model-suggestions.md +74 -0
- package/node_modules/@luxusai/pi-hindsight/docs/surface-reference.md +261 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-operations.ts +151 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-selection.ts +18 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-settings-presenter.ts +46 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-templates.ts +383 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/banking.ts +240 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/knowledge-page-seed.ts +176 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/retain-strategies.ts +178 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/client/client-retry.ts +41 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/client/client.ts +386 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/client/fetch-compat.ts +39 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/client/timeout.ts +34 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config-defaults.ts +140 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config-editing-model.ts +61 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config-editing-registry.ts +925 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config-field-paths.ts +247 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config-normalize.ts +547 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config-writer.ts +480 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config.ts +182 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/setup-gate.ts +86 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-execute.ts +1010 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-parse.ts +175 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-plan.ts +425 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-presentation.ts +210 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-sessions.ts +817 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/index.ts +25 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/git-seed.ts +319 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle-recall.ts +196 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle-retain.ts +189 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle-runtime.ts +65 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle.ts +260 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/mental-models.ts +244 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/observation-scopes.ts +59 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/recall-cleanup.ts +82 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/recall-visibility.ts +45 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/recall.ts +331 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain-cursor.ts +354 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain-job-builder.ts +66 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain-receipts.ts +132 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain.ts +228 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-bank-template-operations.ts +74 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-config-operations.ts +16 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-control-operations.ts +648 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-diagnostics-operations.ts +105 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-identity.ts +68 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-operation-service.ts +71 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-operation-types.ts +13 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-recall-operations.ts +162 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-retain-operations.ts +131 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-scope.ts +104 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-session-operations.ts +37 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/operation-catalog.ts +893 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/reflect-presenter.ts +35 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/scope-migrate.ts +177 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/tools.ts +7 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/queue/flush-presenter.ts +21 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/queue/jsonl-queue-store.ts +112 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue-delivery.ts +111 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue-lock.ts +214 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue-operations.ts +70 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue.ts +392 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/bank-template-presentation.ts +45 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/commands.ts +9 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/guided-setup.ts +860 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/prefill-input.ts +105 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-flow.ts +189 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-server-probe.ts +299 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-actions.ts +201 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-facts.ts +47 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-render.ts +239 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-types.ts +50 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui.ts +259 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/tool-presenters.ts +77 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/types.ts +534 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/diagnostics.ts +319 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/messages.ts +325 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/sanitize.ts +42 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/session-memory-meta.ts +244 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/session-operations.ts +56 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/session.ts +50 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/status-fields.ts +167 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/status-health.ts +207 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/status.ts +120 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/version.ts +8 -0
- package/node_modules/@luxusai/pi-hindsight/package.json +118 -0
- package/node_modules/@luxusai/pi-hindsight/skills/hindsight-memory-doctor/SKILL.md +75 -0
- package/node_modules/@narumitw/pi-btw/dist/index.ts +143 -46
- package/node_modules/@narumitw/pi-btw/dist/index.ts.map +3 -3
- package/node_modules/@narumitw/pi-btw/package.json +6 -6
- package/node_modules/@narumitw/pi-btw/src/fullscreen-ui.ts +136 -22
- package/node_modules/{@herbertgao → @tifan}/pi-copy-response/README.md +2 -4
- package/node_modules/{@herbertgao → @tifan}/pi-copy-response/package.json +5 -15
- package/node_modules/{@herbertgao → @tifan}/pi-handoff/README.md +4 -6
- package/node_modules/@tifan/pi-handoff/package.json +43 -0
- package/node_modules/{@herbertgao → @tifan}/pi-handoff/src/index.ts +1 -1
- package/node_modules/{@herbertgao → @tifan}/pi-inline-skills/README.md +2 -4
- package/node_modules/{@herbertgao → @tifan}/pi-inline-skills/package.json +5 -15
- package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/README.md +5 -7
- package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/package.json +5 -19
- package/node_modules/{@herbertgao → @tifan}/pi-preferred-thinking/README.md +4 -6
- package/node_modules/{@herbertgao → @tifan}/pi-preferred-thinking/package.json +6 -16
- package/node_modules/{@herbertgao → @tifan}/pi-preferred-thinking/src/index.ts +1 -6
- package/node_modules/{@herbertgao → @tifan}/pi-recap/README.md +4 -6
- package/node_modules/@tifan/pi-recap/package.json +42 -0
- package/node_modules/{@herbertgao → @tifan}/pi-recap/src/models.ts +1 -6
- package/node_modules/{@herbertgao → @tifan}/pi-rename/README.md +13 -8
- package/node_modules/@tifan/pi-rename/package.json +47 -0
- package/node_modules/@tifan/pi-rename/src/herdr-label.ts +4 -0
- package/node_modules/{@herbertgao → @tifan}/pi-rename/src/index.ts +4 -16
- package/node_modules/{@herbertgao → @tifan}/pi-rename/src/models.ts +1 -6
- package/node_modules/{@herbertgao → @tifan}/pi-titlebar-spinner/README.md +2 -4
- package/node_modules/{@herbertgao → @tifan}/pi-titlebar-spinner/package.json +5 -15
- package/node_modules/pi-lens/CHANGELOG.md +96 -1
- package/node_modules/pi-lens/dist/clients/actionable-warnings-logger.js +2 -1
- package/node_modules/pi-lens/dist/clients/actionable-warnings.js +14 -5
- package/node_modules/pi-lens/dist/clients/advisory-provenance.js +48 -18
- package/node_modules/pi-lens/dist/clients/ast-grep-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/atomic-write-staging.js +16 -4
- package/node_modules/pi-lens/dist/clients/bash-file-access.js +3 -1
- package/node_modules/pi-lens/dist/clients/biome-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/blocker-freshness.js +21 -8
- package/node_modules/pi-lens/dist/clients/bounded-cache.js +24 -8
- package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +4 -3
- package/node_modules/pi-lens/dist/clients/cache-manager.js +6 -7
- package/node_modules/pi-lens/dist/clients/cache-observability.js +461 -66
- package/node_modules/pi-lens/dist/clients/call-graph.js +238 -63
- package/node_modules/pi-lens/dist/clients/codebase-model.js +13 -5
- package/node_modules/pi-lens/dist/clients/complexity-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/dead-code-client.js +19 -8
- package/node_modules/pi-lens/dist/clients/dead-code-logger.js +1 -2
- package/node_modules/pi-lens/dist/clients/deadline-utils.js +3 -1
- package/node_modules/pi-lens/dist/clients/debug-heap.js +8 -1
- package/node_modules/pi-lens/dist/clients/degradation-ledger.js +1 -1
- package/node_modules/pi-lens/dist/clients/dependency-checker.js +11 -7
- package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +39 -2
- package/node_modules/pi-lens/dist/clients/diagnostic-line-freshness.js +5 -1
- package/node_modules/pi-lens/dist/clients/dispatch/auxiliary-lsp.js +2 -3
- package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +13 -1
- package/node_modules/pi-lens/dist/clients/dispatch/facts/function-facts.js +3 -1
- package/node_modules/pi-lens/dist/clients/dispatch/facts/import-facts.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/integration.js +9 -4
- package/node_modules/pi-lens/dist/clients/dispatch/rules/error-swallowing.js +3 -1
- package/node_modules/pi-lens/dist/clients/dispatch/rules/pass-through-wrappers.js +6 -2
- package/node_modules/pi-lens/dist/clients/dispatch/rules/unsafe-boundary.js +31 -7
- package/node_modules/pi-lens/dist/clients/dispatch/runners/actionlint.js +5 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +10 -14
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +5 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/dotnet-build.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +3 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +25 -6
- package/node_modules/pi-lens/dist/clients/dispatch/runners/fish-indent.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/gleam-check.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/golangci-lint.js +3 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/hadolint.js +13 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-lint.js +4 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/htmlhint.js +25 -10
- package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ktlint.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +28 -4
- package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +6 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/oxlint.js +212 -11
- package/node_modules/pi-lens/dist/clients/dispatch/runners/php-lint.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/phpstan.js +8 -4
- package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +10 -6
- package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +23 -14
- package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/shellcheck.js +7 -9
- package/node_modules/pi-lens/dist/clients/dispatch/runners/shfmt.js +5 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +7 -7
- package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +6 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/terragrunt.js +13 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/tflint.js +13 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/tree-sitter.js +17 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +7 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +24 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/tool-failure.js +35 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +1 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +6 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/suppress-writer.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/types.js +6 -1
- package/node_modules/pi-lens/dist/clients/dispatch/utils/lsp-diagnostics.js +6 -2
- package/node_modules/pi-lens/dist/clients/extension-log.js +5 -3
- package/node_modules/pi-lens/dist/clients/feature-hints.js +8 -1
- package/node_modules/pi-lens/dist/clients/file-kinds.js +34 -129
- package/node_modules/pi-lens/dist/clients/file-utils.js +17 -1
- package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +57 -2
- package/node_modules/pi-lens/dist/clients/formatters.js +144 -27
- package/node_modules/pi-lens/dist/clients/freshness.js +38 -0
- package/node_modules/pi-lens/dist/clients/git-guard.js +43 -13
- package/node_modules/pi-lens/dist/clients/go-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/grammar-source.js +1 -1
- package/node_modules/pi-lens/dist/clients/gzip-stage-write.js +30 -4
- package/node_modules/pi-lens/dist/clients/host-edit-normalize.js +1 -3
- package/node_modules/pi-lens/dist/clients/install-diagnostics.js +4 -2
- package/node_modules/pi-lens/dist/clients/installer/index.js +86 -77
- package/node_modules/pi-lens/dist/clients/instance-reaper.js +5 -2
- package/node_modules/pi-lens/dist/clients/instance-registry.js +4 -2
- package/node_modules/pi-lens/dist/clients/jscpd-client.js +6 -1
- package/node_modules/pi-lens/dist/clients/knip-client.js +29 -15
- package/node_modules/pi-lens/dist/clients/language-profile.js +4 -1
- package/node_modules/pi-lens/dist/clients/latency-logger.js +13 -2
- package/node_modules/pi-lens/dist/clients/lens-config.js +1 -1
- package/node_modules/pi-lens/dist/clients/lens-map.js +8 -3
- package/node_modules/pi-lens/dist/clients/live-bus-emitter.js +1 -1
- package/node_modules/pi-lens/dist/clients/lsp/config.js +4 -6
- package/node_modules/pi-lens/dist/clients/lsp/edits.js +119 -32
- package/node_modules/pi-lens/dist/clients/lsp/index.js +94 -35
- package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +2 -1
- package/node_modules/pi-lens/dist/clients/lsp/jvm-runtime.js +4 -1
- package/node_modules/pi-lens/dist/clients/lsp/launch.js +11 -3
- package/node_modules/pi-lens/dist/clients/lsp/pending-aux-coverage.js +152 -0
- package/node_modules/pi-lens/dist/clients/lsp/server.js +19 -7
- package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +10 -2
- package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +9 -4
- package/node_modules/pi-lens/dist/clients/lsp-document-symbols.js +1 -3
- package/node_modules/pi-lens/dist/clients/lsp-mutation.js +10 -20
- package/node_modules/pi-lens/dist/clients/mcp/host-shim.js +1 -1
- package/node_modules/pi-lens/dist/clients/memory-sampler.js +73 -7
- package/node_modules/pi-lens/dist/clients/metrics-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/middle-man-analysis.js +8 -3
- package/node_modules/pi-lens/dist/clients/module-report-lsp.js +7 -1
- package/node_modules/pi-lens/dist/clients/module-report.js +14 -17
- package/node_modules/pi-lens/dist/clients/ndjson-logger.js +3 -5
- package/node_modules/pi-lens/dist/clients/opaque-mutation-scan.js +220 -0
- package/node_modules/pi-lens/dist/clients/package-manager.js +6 -1
- package/node_modules/pi-lens/dist/clients/pipeline.js +57 -9
- package/node_modules/pi-lens/dist/clients/project-conventions.js +2 -8
- package/node_modules/pi-lens/dist/clients/project-diagnostics/cache.js +10 -7
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +2 -1
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +3 -1
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +13 -9
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +3 -1
- package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +5 -2
- package/node_modules/pi-lens/dist/clients/project-lens-config.js +12 -5
- package/node_modules/pi-lens/dist/clients/project-snapshot-fingerprint.js +48 -0
- package/node_modules/pi-lens/dist/clients/project-snapshot-persist-worker.js +15 -1
- package/node_modules/pi-lens/dist/clients/project-snapshot.js +472 -66
- package/node_modules/pi-lens/dist/clients/read-expansion.js +12 -2
- package/node_modules/pi-lens/dist/clients/read-guard-logger.js +5 -4
- package/node_modules/pi-lens/dist/clients/read-guard-tool-lines.js +5 -2
- package/node_modules/pi-lens/dist/clients/read-guard.js +1 -1
- package/node_modules/pi-lens/dist/clients/resource-sampler.js +1 -1
- package/node_modules/pi-lens/dist/clients/reverse-deps.js +6 -5
- package/node_modules/pi-lens/dist/clients/review-graph/builder.js +42 -17
- package/node_modules/pi-lens/dist/clients/review-graph/git-identity.js +8 -2
- package/node_modules/pi-lens/dist/clients/review-graph/import-resolvers.js +10 -1
- package/node_modules/pi-lens/dist/clients/review-graph/query.js +2 -1
- package/node_modules/pi-lens/dist/clients/review-graph/tsconfig-paths.js +4 -2
- package/node_modules/pi-lens/dist/clients/review-graph/workspace-modules.js +2 -2
- package/node_modules/pi-lens/dist/clients/ruff-client.js +6 -5
- package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +63 -31
- package/node_modules/pi-lens/dist/clients/runtime-context.js +12 -4
- package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +83 -4
- package/node_modules/pi-lens/dist/clients/runtime-session.js +14 -0
- package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +59 -3
- package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +148 -34
- package/node_modules/pi-lens/dist/clients/runtime-turn.js +147 -6
- package/node_modules/pi-lens/dist/clients/rust-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/safe-spawn.js +150 -11
- package/node_modules/pi-lens/dist/clients/security-scan-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/session-summary.js +3 -1
- package/node_modules/pi-lens/dist/clients/sg-runner.js +1 -3
- package/node_modules/pi-lens/dist/clients/source-filter.js +10 -6
- package/node_modules/pi-lens/dist/clients/source-walker.js +1 -1
- package/node_modules/pi-lens/dist/clients/spawn-timeout-cooldown.js +96 -0
- package/node_modules/pi-lens/dist/clients/startup-scan.js +4 -1
- package/node_modules/pi-lens/dist/clients/tool-definition.js +7 -0
- package/node_modules/pi-lens/dist/clients/tool-policy.js +26 -11
- package/node_modules/pi-lens/dist/clients/tool-render.js +2 -1
- package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +10 -4
- package/node_modules/pi-lens/dist/clients/tree-sitter-logger.js +2 -2
- package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +12 -5
- package/node_modules/pi-lens/dist/clients/warm-attach.js +12 -5
- package/node_modules/pi-lens/dist/clients/widget-state.js +27 -11
- package/node_modules/pi-lens/dist/clients/word-index.js +3 -1
- package/node_modules/pi-lens/dist/clients/workspace-topology.js +8 -2
- package/node_modules/pi-lens/dist/clients/zizmor-config.js +9 -1
- package/node_modules/pi-lens/dist/i18n.js +13 -5
- package/node_modules/pi-lens/dist/index.js +10797 -8627
- package/node_modules/pi-lens/dist/mcp/server.js +3 -1
- package/node_modules/pi-lens/dist/tools/ast-grep-replace.js +68 -12
- package/node_modules/pi-lens/dist/tools/lens-diagnostic-mark.js +21 -7
- package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +164 -35
- package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +24 -7
- package/node_modules/pi-lens/dist/tools/lsp-navigation.js +3 -1
- package/node_modules/pi-lens/dist/tools/module-report.js +1 -1
- package/node_modules/pi-lens/dist/tools/project-report.js +1 -1
- package/node_modules/pi-lens/dist/tools/symbol-search.js +5 -2
- package/node_modules/pi-lens/docs/durable-store-audit-1202.md +1 -1
- package/node_modules/pi-lens/docs/servercapabilities.md +1 -1
- package/node_modules/pi-lens/package.json +160 -156
- package/node_modules/pi-lens/rules/typos/_typos.toml +2 -2
- package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +31 -13
- package/node_modules/pi-lens/scripts/download-grammars.js +9 -3
- package/node_modules/pi-lens/scripts/rpc-load-check.mjs +30 -9
- package/node_modules/pi-mcp-adapter/CHANGELOG.md +47 -0
- package/node_modules/pi-mcp-adapter/README.md +42 -13
- package/node_modules/pi-mcp-adapter/commands.ts +4 -2
- package/node_modules/pi-mcp-adapter/config.ts +45 -5
- package/node_modules/pi-mcp-adapter/direct-tools.ts +103 -92
- package/node_modules/pi-mcp-adapter/dist/agent-dir.d.ts +10 -0
- package/node_modules/pi-mcp-adapter/dist/agent-dir.js +63 -0
- package/node_modules/pi-mcp-adapter/dist/agent-dir.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.d.ts +8 -0
- package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.js +356 -0
- package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/config.d.ts +123 -0
- package/node_modules/pi-mcp-adapter/dist/config.js +1087 -0
- package/node_modules/pi-mcp-adapter/dist/config.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/metadata-cache.d.ts +19 -0
- package/node_modules/pi-mcp-adapter/dist/metadata-cache.js +319 -0
- package/node_modules/pi-mcp-adapter/dist/metadata-cache.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.d.ts +2 -0
- package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.js +156 -0
- package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/resource-tools.d.ts +1 -0
- package/node_modules/pi-mcp-adapter/dist/resource-tools.js +15 -0
- package/node_modules/pi-mcp-adapter/dist/resource-tools.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/types.d.ts +564 -0
- package/node_modules/pi-mcp-adapter/dist/types.js +287 -0
- package/node_modules/pi-mcp-adapter/dist/types.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.d.ts +6 -0
- package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.js +37 -0
- package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/ui-stream-types.d.ts +104 -0
- package/node_modules/pi-mcp-adapter/dist/ui-stream-types.js +59 -0
- package/node_modules/pi-mcp-adapter/dist/ui-stream-types.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.d.ts +4 -0
- package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.js +27 -0
- package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/utils.d.ts +32 -0
- package/node_modules/pi-mcp-adapter/dist/utils.js +338 -0
- package/node_modules/pi-mcp-adapter/dist/utils.js.map +1 -0
- package/node_modules/pi-mcp-adapter/failure-backoff.ts +23 -0
- package/node_modules/pi-mcp-adapter/index.ts +204 -82
- package/node_modules/pi-mcp-adapter/init.ts +41 -30
- package/node_modules/pi-mcp-adapter/lifecycle.ts +16 -8
- package/node_modules/pi-mcp-adapter/mcp-code.ts +2 -0
- package/node_modules/pi-mcp-adapter/mcp-oauth-provider.ts +66 -16
- package/node_modules/pi-mcp-adapter/mcp-output-guard.ts +95 -7
- package/node_modules/pi-mcp-adapter/mcp-probe.ts +18 -4
- package/node_modules/pi-mcp-adapter/mcp-references.ts +368 -0
- package/node_modules/pi-mcp-adapter/mcp-status.ts +8 -19
- package/node_modules/pi-mcp-adapter/metadata-cache.ts +20 -12
- package/node_modules/pi-mcp-adapter/namespace-tools.ts +276 -0
- package/node_modules/pi-mcp-adapter/package.json +24 -6
- package/node_modules/pi-mcp-adapter/proxy-modes.ts +66 -10
- package/node_modules/pi-mcp-adapter/search-ranking.ts +2 -0
- package/node_modules/pi-mcp-adapter/server-manager.ts +63 -12
- package/node_modules/pi-mcp-adapter/state.ts +1 -3
- package/node_modules/pi-mcp-adapter/tool-result-renderer.ts +16 -2
- package/node_modules/pi-mcp-adapter/types.ts +48 -1
- package/node_modules/pi-mcp-adapter/ui-server.ts +3 -19
- package/node_modules/pi-mcp-adapter/ui-session.ts +2 -1
- package/node_modules/pi-mcp-adapter/utils.ts +21 -19
- package/node_modules/pi-web-access/CHANGELOG.md +26 -0
- package/node_modules/pi-web-access/README.md +71 -14
- package/node_modules/pi-web-access/chrome-cookies.ts +115 -35
- package/node_modules/pi-web-access/credential-source.ts +6 -2
- package/node_modules/pi-web-access/curator-page.ts +5 -3
- package/node_modules/pi-web-access/curator-server.ts +2 -1
- package/node_modules/pi-web-access/extract.ts +89 -9
- package/node_modules/pi-web-access/fetch-params.ts +13 -0
- package/node_modules/pi-web-access/gemini-adc.ts +298 -0
- package/node_modules/pi-web-access/gemini-api.ts +59 -15
- package/node_modules/pi-web-access/gemini-search.ts +58 -18
- package/node_modules/pi-web-access/gemini-url-context.ts +3 -2
- package/node_modules/pi-web-access/gemini-web-config.ts +57 -7
- package/node_modules/pi-web-access/gemini-web.ts +9 -3
- package/node_modules/pi-web-access/github-api.ts +5 -4
- package/node_modules/pi-web-access/github-issue-pr.ts +700 -0
- package/node_modules/pi-web-access/index.ts +403 -297
- package/node_modules/pi-web-access/kimi-search.ts +234 -0
- package/node_modules/pi-web-access/openai-search.ts +118 -21
- package/node_modules/pi-web-access/package.json +3 -2
- package/node_modules/pi-web-access/ssrf-protection.ts +4 -1
- package/node_modules/pi-web-access/utils.ts +307 -1
- package/node_modules/pi-web-access/youtube-extract.ts +2 -2
- package/package.json +46 -37
- package/node_modules/@herbertgao/pi-copy-response/CHANGELOG.md +0 -49
- package/node_modules/@herbertgao/pi-copy-response/LICENSE +0 -22
- package/node_modules/@herbertgao/pi-handoff/CHANGELOG.md +0 -83
- package/node_modules/@herbertgao/pi-handoff/LICENSE +0 -22
- package/node_modules/@herbertgao/pi-handoff/package.json +0 -60
- package/node_modules/@herbertgao/pi-inline-skills/CHANGELOG.md +0 -57
- package/node_modules/@herbertgao/pi-inline-skills/LICENSE +0 -22
- package/node_modules/@herbertgao/pi-mermaid-open/CHANGELOG.md +0 -39
- package/node_modules/@herbertgao/pi-preferred-thinking/CHANGELOG.md +0 -63
- package/node_modules/@herbertgao/pi-preferred-thinking/LICENSE +0 -22
- package/node_modules/@herbertgao/pi-recap/CHANGELOG.md +0 -101
- package/node_modules/@herbertgao/pi-recap/LICENSE +0 -22
- package/node_modules/@herbertgao/pi-recap/package.json +0 -55
- package/node_modules/@herbertgao/pi-rename/CHANGELOG.md +0 -49
- package/node_modules/@herbertgao/pi-rename/LICENSE +0 -22
- package/node_modules/@herbertgao/pi-rename/package.json +0 -63
- package/node_modules/@herbertgao/pi-titlebar-spinner/CHANGELOG.md +0 -25
- package/node_modules/@herbertgao/pi-titlebar-spinner/LICENSE +0 -22
- /package/node_modules/{@herbertgao → @tifan}/pi-copy-response/src/index.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-handoff/src/complete-text.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-handoff/src/session-query.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-inline-skills/src/index.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/herdr-plugin/herdr-plugin.toml +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/herdr-plugin/viewer.mjs +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/src/index.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/index.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/model-picker.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/sanitize.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/tui.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-rename/src/model-picker.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-rename/src/naming.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-rename/src/sanitize.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-titlebar-spinner/src/index.ts +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mkdirSync } from "node:fs";
|
|
1
|
+
import { mkdirSync, statSync } from "node:fs";
|
|
2
2
|
import { isDeepStrictEqual } from "node:util";
|
|
3
3
|
import {
|
|
4
4
|
Client,
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
StreamableHTTPClientTransport,
|
|
10
10
|
UnauthorizedError,
|
|
11
11
|
type GetPromptResult,
|
|
12
|
+
type ListToolsResult,
|
|
12
13
|
type ReadResourceResult,
|
|
13
14
|
type CacheableRequestOptions,
|
|
14
15
|
type RequestOptions,
|
|
@@ -128,6 +129,8 @@ export interface ServerConnection {
|
|
|
128
129
|
transport: Transport;
|
|
129
130
|
definition: ServerDefinition;
|
|
130
131
|
tools: McpTool[];
|
|
132
|
+
/** Cache hints from the server's aggregated tools/list result. */
|
|
133
|
+
toolListHints?: Partial<Pick<ListToolsResult, "ttlMs" | "cacheScope">> | undefined;
|
|
131
134
|
/** Monotonic guard against older refresh responses replacing newer notifications. */
|
|
132
135
|
toolsRevision?: number;
|
|
133
136
|
resources: McpResource[];
|
|
@@ -148,8 +151,20 @@ type MetadataListChangedListener = (serverName: string, reason: string) => void;
|
|
|
148
151
|
|
|
149
152
|
export type ToolRefreshResult = "updated" | "unchanged" | "superseded" | "refresh-timeout";
|
|
150
153
|
|
|
154
|
+
type ToolListCacheHints = Partial<Pick<ListToolsResult, "ttlMs" | "cacheScope">>;
|
|
155
|
+
type ToolListResult = { tools: McpTool[]; hints?: ToolListCacheHints };
|
|
156
|
+
|
|
151
157
|
const KEEP_ALIVE_REFRESH_TIMEOUT_MS = 5_000;
|
|
152
158
|
|
|
159
|
+
export function isTransientHttpConnectError(error: unknown): boolean {
|
|
160
|
+
let current: unknown = error;
|
|
161
|
+
while (current instanceof Error) {
|
|
162
|
+
if (current instanceof SdkHttpError && current.status === 503) return true;
|
|
163
|
+
current = current.cause;
|
|
164
|
+
}
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
|
|
153
168
|
export class McpServerManager {
|
|
154
169
|
private connections = new Map<string, ServerConnection>();
|
|
155
170
|
private connectPromises = new Map<string, Promise<ServerConnection>>();
|
|
@@ -375,9 +390,9 @@ export class McpServerManager {
|
|
|
375
390
|
|
|
376
391
|
const toolsRevision = expectedConnection.toolsRevision ?? 0;
|
|
377
392
|
const refreshSignal = combineAbortSignals(healthOptions.signal, AbortSignal.timeout(timeout));
|
|
378
|
-
let
|
|
393
|
+
let toolResult: ToolListResult;
|
|
379
394
|
try {
|
|
380
|
-
|
|
395
|
+
toolResult = await this.fetchAllTools(expectedConnection.client, {
|
|
381
396
|
...healthOptions,
|
|
382
397
|
...(refreshSignal ? { signal: refreshSignal } : {}),
|
|
383
398
|
cacheMode: "refresh",
|
|
@@ -401,20 +416,30 @@ export class McpServerManager {
|
|
|
401
416
|
return "superseded";
|
|
402
417
|
}
|
|
403
418
|
|
|
404
|
-
if (
|
|
419
|
+
if (
|
|
420
|
+
isDeepStrictEqual(expectedConnection.tools, toolResult.tools) &&
|
|
421
|
+
isDeepStrictEqual(expectedConnection.toolListHints, toolResult.hints)
|
|
422
|
+
) {
|
|
405
423
|
this.retryPendingMetadataPublication(name, expectedConnection);
|
|
406
424
|
return "unchanged";
|
|
407
425
|
}
|
|
408
426
|
|
|
409
427
|
const previousTools = expectedConnection.tools;
|
|
410
|
-
|
|
428
|
+
const previousToolListHints = expectedConnection.toolListHints;
|
|
429
|
+
expectedConnection.tools = toolResult.tools;
|
|
430
|
+
expectedConnection.toolListHints = toolResult.hints;
|
|
411
431
|
expectedConnection.toolsRevision = toolsRevision + 1;
|
|
412
432
|
try {
|
|
413
433
|
await this.metadataListChangedListener?.(name, "keep-alive-refresh");
|
|
414
434
|
this.pendingMetadataPublications.delete(name);
|
|
415
435
|
} catch (error) {
|
|
416
|
-
if (
|
|
436
|
+
if (
|
|
437
|
+
this.connections.get(name) === expectedConnection &&
|
|
438
|
+
expectedConnection.tools === toolResult.tools &&
|
|
439
|
+
expectedConnection.toolListHints === toolResult.hints
|
|
440
|
+
) {
|
|
417
441
|
expectedConnection.tools = previousTools;
|
|
442
|
+
expectedConnection.toolListHints = previousToolListHints;
|
|
418
443
|
expectedConnection.toolsRevision = toolsRevision;
|
|
419
444
|
}
|
|
420
445
|
throw error;
|
|
@@ -488,7 +513,13 @@ export class McpServerManager {
|
|
|
488
513
|
if (definition.command) {
|
|
489
514
|
client = this.createClient(name, definition);
|
|
490
515
|
let command = definition.command;
|
|
491
|
-
let args = (definition.args ?? []).map(interpolateEnvVars);
|
|
516
|
+
let args = (definition.args ?? []).map((argument) => interpolateEnvVars(argument));
|
|
517
|
+
const cwd = resolveConfigPath(definition.cwd) ?? this.defaultCwd;
|
|
518
|
+
if (cwd !== undefined) {
|
|
519
|
+
const cwdStats = statSync(cwd, { throwIfNoEntry: false });
|
|
520
|
+
if (!cwdStats) throw new Error(`MCP server "${name}" configured cwd does not exist: "${cwd}"`);
|
|
521
|
+
if (!cwdStats.isDirectory()) throw new Error(`MCP server "${name}" configured cwd is not a directory: "${cwd}"`);
|
|
522
|
+
}
|
|
492
523
|
|
|
493
524
|
if (command === "npx" || command === "npm") {
|
|
494
525
|
const resolved = await resolveNpxBinary(command, args, signal);
|
|
@@ -501,7 +532,6 @@ export class McpServerManager {
|
|
|
501
532
|
throwIfAborted(signal);
|
|
502
533
|
|
|
503
534
|
if (definition.pluginDataDir) mkdirSync(definition.pluginDataDir, { recursive: true });
|
|
504
|
-
const cwd = resolveConfigPath(definition.cwd) ?? this.defaultCwd;
|
|
505
535
|
const stdioTransport = new StdioClientTransport({
|
|
506
536
|
command,
|
|
507
537
|
args,
|
|
@@ -588,12 +618,13 @@ export class McpServerManager {
|
|
|
588
618
|
|
|
589
619
|
// Discover tools, resources, and prompts. Resource and prompt listing is
|
|
590
620
|
// optional: only servers advertising the capability are queried.
|
|
591
|
-
const [
|
|
621
|
+
const [toolResult, resources, promptResult] = await Promise.all([
|
|
592
622
|
this.fetchAllTools(client, requestOptions),
|
|
593
623
|
this.fetchAllResources(client, requestOptions),
|
|
594
624
|
this.fetchAllPrompts(client, requestOptions),
|
|
595
625
|
]);
|
|
596
|
-
connection.tools = tools;
|
|
626
|
+
connection.tools = toolResult.tools;
|
|
627
|
+
connection.toolListHints = toolResult.hints;
|
|
597
628
|
connection.resources = resources;
|
|
598
629
|
connection.prompts = promptResult.prompts;
|
|
599
630
|
connection.promptDiscoveryFailed = promptResult.failed;
|
|
@@ -651,6 +682,9 @@ export class McpServerManager {
|
|
|
651
682
|
|
|
652
683
|
private async enrichHttpConnectionError(definition: ServerDefinition, error: unknown): Promise<Error> {
|
|
653
684
|
const originalMessage = error instanceof Error ? error.message : String(error);
|
|
685
|
+
if (isTransientHttpConnectError(error)) {
|
|
686
|
+
return new Error(`${originalMessage} — endpoint is temporarily unavailable (HTTP 503)`, { cause: error });
|
|
687
|
+
}
|
|
654
688
|
try {
|
|
655
689
|
const probe = await probeMcpEndpoint(resolveServerUrl(definition)!);
|
|
656
690
|
return new Error(`${originalMessage} — probe: ${probe.classification}`, { cause: error });
|
|
@@ -987,17 +1021,34 @@ export class McpServerManager {
|
|
|
987
1021
|
}
|
|
988
1022
|
}
|
|
989
1023
|
|
|
990
|
-
private async fetchAllTools(client: Client, requestOptions?: CacheableRequestOptions): Promise<
|
|
1024
|
+
private async fetchAllTools(client: Client, requestOptions?: CacheableRequestOptions): Promise<ToolListResult> {
|
|
991
1025
|
const allTools: McpTool[] = [];
|
|
992
1026
|
let cursor: string | undefined;
|
|
1027
|
+
let hints: ToolListCacheHints | undefined;
|
|
1028
|
+
let firstPage = true;
|
|
993
1029
|
|
|
994
1030
|
do {
|
|
995
1031
|
const result = await client.listTools(cursor ? { cursor } : undefined, requestOptions);
|
|
1032
|
+
if (firstPage) {
|
|
1033
|
+
const ttlMs = typeof result.ttlMs === "number" && Number.isSafeInteger(result.ttlMs) && result.ttlMs >= 0
|
|
1034
|
+
? result.ttlMs
|
|
1035
|
+
: undefined;
|
|
1036
|
+
const cacheScope = result.cacheScope === "public" || result.cacheScope === "private"
|
|
1037
|
+
? result.cacheScope
|
|
1038
|
+
: undefined;
|
|
1039
|
+
if (ttlMs !== undefined || cacheScope !== undefined) {
|
|
1040
|
+
hints = {
|
|
1041
|
+
...(ttlMs !== undefined ? { ttlMs } : {}),
|
|
1042
|
+
...(cacheScope !== undefined ? { cacheScope } : {}),
|
|
1043
|
+
};
|
|
1044
|
+
}
|
|
1045
|
+
firstPage = false;
|
|
1046
|
+
}
|
|
996
1047
|
allTools.push(...(result.tools ?? []));
|
|
997
1048
|
cursor = result.nextCursor;
|
|
998
1049
|
} while (cursor);
|
|
999
1050
|
|
|
1000
|
-
return allTools;
|
|
1051
|
+
return { tools: allTools, ...(hints !== undefined ? { hints } : {}) };
|
|
1001
1052
|
}
|
|
1002
1053
|
|
|
1003
1054
|
private async fetchAllPrompts(
|
|
@@ -3,12 +3,10 @@ import type { ConsentManager } from "./consent-manager.ts";
|
|
|
3
3
|
import type { McpLifecycleManager } from "./lifecycle.ts";
|
|
4
4
|
import type { McpServerManager } from "./server-manager.ts";
|
|
5
5
|
import type { AuthStorageOptions } from "./mcp-auth.ts";
|
|
6
|
-
import type { ToolMetadata, PromptMetadata, McpConfig, UiSessionMessages, UiStreamSummary } from "./types.ts";
|
|
6
|
+
import type { ToolMetadata, PromptMetadata, McpConfig, UiSessionMessages, UiStreamSummary, McpStatusEventBus, UiServerHandle } from "./types.ts";
|
|
7
7
|
import type { UiResourceHandler } from "./ui-resource-handler.ts";
|
|
8
|
-
import type { UiServerHandle } from "./ui-server.ts";
|
|
9
8
|
import type { McpRuntimeOwner } from "./runtime-owner.ts";
|
|
10
9
|
import type { McpOAuthRuntime } from "./mcp-auth-flow.ts";
|
|
11
|
-
import type { McpStatusEventBus } from "./mcp-status.ts";
|
|
12
10
|
|
|
13
11
|
export interface CompletedUiSession {
|
|
14
12
|
serverName: string;
|
|
@@ -4,7 +4,7 @@ import { type Component, Text, truncateToWidth, visibleWidth } from "@earendil-w
|
|
|
4
4
|
type McpToolResultDetails = Record<string, unknown> & { error?: unknown };
|
|
5
5
|
type McpToolContentBlock = AgentToolResult<McpToolResultDetails>["content"][number];
|
|
6
6
|
|
|
7
|
-
interface RenderTheme {
|
|
7
|
+
export interface RenderTheme {
|
|
8
8
|
fg: (name: string, text: string) => string;
|
|
9
9
|
bold?: (text: string) => string;
|
|
10
10
|
}
|
|
@@ -28,7 +28,7 @@ interface McpToolRenderState {
|
|
|
28
28
|
compactInputPreview?: string;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
interface McpToolRenderContext {
|
|
31
|
+
export interface McpToolRenderContext {
|
|
32
32
|
isError: boolean;
|
|
33
33
|
isPartial?: boolean;
|
|
34
34
|
expanded?: boolean;
|
|
@@ -250,6 +250,13 @@ export function formatMcpDirectToolCallLines(
|
|
|
250
250
|
return [displayName, formatJsonish(args, maxInputChars)];
|
|
251
251
|
}
|
|
252
252
|
|
|
253
|
+
export function formatMcpScriptToolCallLines(
|
|
254
|
+
args: { code: string },
|
|
255
|
+
maxInputChars = DEFAULT_MAX_CALL_INPUT_CHARS,
|
|
256
|
+
): string[] {
|
|
257
|
+
return ["mcpScript", truncateText(args.code, maxInputChars)];
|
|
258
|
+
}
|
|
259
|
+
|
|
253
260
|
function renderToolCallLines(lines: string[], theme?: RenderTheme) {
|
|
254
261
|
const activeTheme = theme ?? plainTheme;
|
|
255
262
|
const [title = "mcp", ...rest] = lines;
|
|
@@ -314,6 +321,13 @@ export function createMcpDirectToolCallRenderer(displayName: string, options = r
|
|
|
314
321
|
};
|
|
315
322
|
}
|
|
316
323
|
|
|
324
|
+
export function createMcpScriptToolCallRenderer(options = resolveMcpToolRenderOptions()) {
|
|
325
|
+
return (args: { code: string }, theme?: RenderTheme, context?: McpToolRenderContext) => {
|
|
326
|
+
if (shouldUseCompactFinalRender(options, context)) return new EmptyComponent();
|
|
327
|
+
return renderToolCallLines(formatMcpScriptToolCallLines(args), theme);
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
|
|
317
331
|
function blockToLines(block: McpToolContentBlock): string[] {
|
|
318
332
|
if (block.type === "text") {
|
|
319
333
|
return block.text.split("\n");
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// types.ts - Core type definitions
|
|
2
2
|
import type {
|
|
3
|
+
CallToolResult,
|
|
3
4
|
ContentBlock as McpContentBlock,
|
|
4
5
|
ListPromptsResult,
|
|
5
6
|
ListResourcesResult,
|
|
@@ -7,7 +8,7 @@ import type {
|
|
|
7
8
|
Transport as McpTransport,
|
|
8
9
|
} from "@modelcontextprotocol/client";
|
|
9
10
|
import type { TextContent, ImageContent } from "@earendil-works/pi-ai";
|
|
10
|
-
import type { UiStreamMode } from "./ui-stream-types.ts";
|
|
11
|
+
import type { UiStreamMode, UiStreamSummary } from "./ui-stream-types.ts";
|
|
11
12
|
import type { UiToolVisibility } from "./ui-tool-visibility.ts";
|
|
12
13
|
|
|
13
14
|
export type Transport = McpTransport;
|
|
@@ -43,6 +44,15 @@ export interface McpStatusSnapshot {
|
|
|
43
44
|
readonly disabledCount: number;
|
|
44
45
|
}
|
|
45
46
|
|
|
47
|
+
/**
|
|
48
|
+
* Minimal event-bus surface the status publisher needs. Lives here (leaf
|
|
49
|
+
* module) so `state.ts` can reference it without importing `mcp-status.ts`,
|
|
50
|
+
* which imports the state type back — an import cycle at type level.
|
|
51
|
+
*/
|
|
52
|
+
export interface McpStatusEventBus {
|
|
53
|
+
emit(channel: string, data: unknown): void;
|
|
54
|
+
}
|
|
55
|
+
|
|
46
56
|
// Import sources for config
|
|
47
57
|
export type ImportKind =
|
|
48
58
|
| "cursor"
|
|
@@ -155,6 +165,30 @@ export interface UiHostContext {
|
|
|
155
165
|
|
|
156
166
|
export type UiDisplayMode = "inline" | "fullscreen" | "pip";
|
|
157
167
|
|
|
168
|
+
/**
|
|
169
|
+
* Live handle to a started UI tool session. Lives here (leaf module) so
|
|
170
|
+
* `state.ts` can reference it without importing `ui-server.ts`, which
|
|
171
|
+
* imports the state type back — an import cycle at type level.
|
|
172
|
+
*/
|
|
173
|
+
export interface UiServerHandle {
|
|
174
|
+
url: string;
|
|
175
|
+
port: number;
|
|
176
|
+
sessionToken: string;
|
|
177
|
+
serverName: string;
|
|
178
|
+
toolName: string;
|
|
179
|
+
viewer?: "browser" | "glimpse" | "suppressed";
|
|
180
|
+
windowOpen?: boolean;
|
|
181
|
+
close: (reason?: string) => void;
|
|
182
|
+
sendToolInput: (args: Record<string, unknown>) => void;
|
|
183
|
+
sendToolResult: (result: CallToolResult) => void;
|
|
184
|
+
sendResultPatch: (result: CallToolResult) => void;
|
|
185
|
+
sendToolCancelled: (reason: string) => void;
|
|
186
|
+
sendHostContext: (context: UiHostContext) => void;
|
|
187
|
+
/** Get accumulated messages from this session */
|
|
188
|
+
getSessionMessages: () => UiSessionMessages;
|
|
189
|
+
getStreamSummary: () => UiStreamSummary | undefined;
|
|
190
|
+
}
|
|
191
|
+
|
|
158
192
|
// Re-export stream types from the shared lightweight module.
|
|
159
193
|
// This allows the example package to import stream schemas without pulling the full types.ts dependency graph.
|
|
160
194
|
export {
|
|
@@ -506,6 +540,16 @@ export interface McpSettings {
|
|
|
506
540
|
idleTimeout?: number; // minutes, default 10, 0 to disable
|
|
507
541
|
requestTimeoutMs?: number; // milliseconds, overrides the SDK request timeout when > 0
|
|
508
542
|
directTools?: boolean;
|
|
543
|
+
/**
|
|
544
|
+
* Validate direct-tool inputs against the advertised schema after recovering
|
|
545
|
+
* one JSON string layer for object and array properties. Defaults to false.
|
|
546
|
+
*/
|
|
547
|
+
strictDirectToolArguments?: boolean;
|
|
548
|
+
/**
|
|
549
|
+
* Include the byte-bounded raw MCP result in direct-tool details. The default
|
|
550
|
+
* `lean` mode keeps the existing small details object.
|
|
551
|
+
*/
|
|
552
|
+
directToolResultDetails?: "lean" | "bounded";
|
|
509
553
|
/** Show the advisory when 75 or more direct tools resolve. Defaults to true. */
|
|
510
554
|
warnOnLargeDirectTools?: boolean;
|
|
511
555
|
/** Register the trusted MCP-only JavaScript scripting tool. Defaults to true; set false to hide it. */
|
|
@@ -642,6 +686,9 @@ export interface ServerCacheEntry {
|
|
|
642
686
|
resources: CachedResource[];
|
|
643
687
|
prompts?: CachedPrompt[];
|
|
644
688
|
instructions?: string;
|
|
689
|
+
/** Server-level hints from the aggregated tools/list result. */
|
|
690
|
+
ttlMs?: ListToolsResult["ttlMs"];
|
|
691
|
+
cacheScope?: ListToolsResult["cacheScope"];
|
|
645
692
|
cachedAt: number;
|
|
646
693
|
}
|
|
647
694
|
|
|
@@ -35,10 +35,13 @@ import {
|
|
|
35
35
|
type UiProxyRequestBody,
|
|
36
36
|
type UiProxyResult,
|
|
37
37
|
type UiResourceContent,
|
|
38
|
+
type UiServerHandle,
|
|
38
39
|
type UiSessionMessages,
|
|
39
40
|
type UiStreamSummary,
|
|
40
41
|
} from "./types.ts";
|
|
41
42
|
|
|
43
|
+
export type { UiServerHandle };
|
|
44
|
+
|
|
42
45
|
const MAX_BODY_SIZE = 2 * 1024 * 1024;
|
|
43
46
|
const ABANDONED_GRACE_MS = 60_000;
|
|
44
47
|
const WATCHDOG_INTERVAL_MS = 5_000;
|
|
@@ -75,25 +78,6 @@ export interface UiServerOptions {
|
|
|
75
78
|
onComplete?: (reason: string) => void;
|
|
76
79
|
}
|
|
77
80
|
|
|
78
|
-
export interface UiServerHandle {
|
|
79
|
-
url: string;
|
|
80
|
-
port: number;
|
|
81
|
-
sessionToken: string;
|
|
82
|
-
serverName: string;
|
|
83
|
-
toolName: string;
|
|
84
|
-
viewer?: "browser" | "glimpse" | "suppressed";
|
|
85
|
-
windowOpen?: boolean;
|
|
86
|
-
close: (reason?: string) => void;
|
|
87
|
-
sendToolInput: (args: Record<string, unknown>) => void;
|
|
88
|
-
sendToolResult: (result: CallToolResult) => void;
|
|
89
|
-
sendResultPatch: (result: CallToolResult) => void;
|
|
90
|
-
sendToolCancelled: (reason: string) => void;
|
|
91
|
-
sendHostContext: (context: UiHostContext) => void;
|
|
92
|
-
/** Get accumulated messages from this session */
|
|
93
|
-
getSessionMessages: () => UiSessionMessages;
|
|
94
|
-
getStreamSummary: () => UiStreamSummary | undefined;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
81
|
export async function startUiServer(options: UiServerOptions): Promise<UiServerHandle> {
|
|
98
82
|
const sessionToken = options.sessionToken ?? randomUUID();
|
|
99
83
|
const uiResourceToken = randomUUID();
|
|
@@ -15,7 +15,8 @@ import {
|
|
|
15
15
|
type UiStreamMode,
|
|
16
16
|
} from "./types.ts";
|
|
17
17
|
import { logger } from "./logger.ts";
|
|
18
|
-
import { startUiServer
|
|
18
|
+
import { startUiServer } from "./ui-server.ts";
|
|
19
|
+
import type { UiServerHandle } from "./types.ts";
|
|
19
20
|
import { isGlimpseAvailable, openGlimpseWindow } from "./glimpse-ui.ts";
|
|
20
21
|
import type { SessionRecoveryDeps } from "./session-recovery.ts";
|
|
21
22
|
import { combineAbortSignals, isAbortError } from "./runtime-owner.ts";
|
|
@@ -71,18 +71,20 @@ export function getConfigPathFromArgv(): string | undefined {
|
|
|
71
71
|
return undefined;
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
-
export function interpolateEnvVars(value: string): string
|
|
74
|
+
export function interpolateEnvVars(value: string): string;
|
|
75
|
+
export function interpolateEnvVars(value: string, environment: NodeJS.ProcessEnv): string;
|
|
76
|
+
export function interpolateEnvVars(value: string, environment: NodeJS.ProcessEnv = process.env): string {
|
|
75
77
|
return value
|
|
76
|
-
.replace(/\$\{(\w+)\}/g, (_, name) =>
|
|
77
|
-
.replace(/\$env:(\w+)/g, (_, name) =>
|
|
78
|
-
.replace(/\{env:(\w+)\}/g, (_, name) =>
|
|
78
|
+
.replace(/\$\{(\w+)\}/g, (_, name) => environment[name] ?? "")
|
|
79
|
+
.replace(/\$env:(\w+)/g, (_, name) => environment[name] ?? "")
|
|
80
|
+
.replace(/\{env:(\w+)\}/g, (_, name) => environment[name] ?? "");
|
|
79
81
|
}
|
|
80
82
|
|
|
81
|
-
function getMissingEnvVars(value: string): string[] {
|
|
83
|
+
function getMissingEnvVars(value: string, environment: NodeJS.ProcessEnv): string[] {
|
|
82
84
|
const missing = new Set<string>();
|
|
83
85
|
for (const match of value.matchAll(/\$\{(\w+)\}|\$env:(\w+)|\{env:(\w+)\}/g)) {
|
|
84
86
|
const name = match[1] ?? match[2] ?? match[3];
|
|
85
|
-
if (name &&
|
|
87
|
+
if (name && environment[name] === undefined) {
|
|
86
88
|
missing.add(name);
|
|
87
89
|
}
|
|
88
90
|
}
|
|
@@ -99,17 +101,17 @@ export function toStringRecord(value: unknown): Record<string, string> | undefin
|
|
|
99
101
|
return Object.keys(result).length > 0 ? result : undefined;
|
|
100
102
|
}
|
|
101
103
|
|
|
102
|
-
function interpolateSecretExpression(value: string): string {
|
|
103
|
-
if (value.startsWith("!!")) return interpolateEnvVars(value.slice(1));
|
|
104
|
-
return value.startsWith("!") ? value : interpolateEnvVars(value);
|
|
104
|
+
function interpolateSecretExpression(value: string, environment: NodeJS.ProcessEnv): string {
|
|
105
|
+
if (value.startsWith("!!")) return interpolateEnvVars(value.slice(1), environment);
|
|
106
|
+
return value.startsWith("!") ? value : interpolateEnvVars(value, environment);
|
|
105
107
|
}
|
|
106
108
|
|
|
107
|
-
export function interpolateEnvRecord(values: Record<string, string> | undefined): Record<string, string> | undefined {
|
|
109
|
+
export function interpolateEnvRecord(values: Record<string, string> | undefined, environment: NodeJS.ProcessEnv = process.env): Record<string, string> | undefined {
|
|
108
110
|
if (!values) return undefined;
|
|
109
111
|
|
|
110
112
|
return Object.fromEntries(Object.entries(values).map(([key, value]) => [
|
|
111
113
|
key,
|
|
112
|
-
interpolateSecretExpression(value),
|
|
114
|
+
interpolateSecretExpression(value, environment),
|
|
113
115
|
]));
|
|
114
116
|
}
|
|
115
117
|
|
|
@@ -164,18 +166,18 @@ export function resolveCommandSecretsRecord(
|
|
|
164
166
|
]));
|
|
165
167
|
}
|
|
166
168
|
|
|
167
|
-
export function resolveServerUrl(definition: Pick<ServerEntry, "url"
|
|
169
|
+
export function resolveServerUrl(definition: Pick<ServerEntry, "url">, environment: NodeJS.ProcessEnv = process.env): string | undefined {
|
|
168
170
|
if (definition.url == null) return undefined;
|
|
169
171
|
if (typeof definition.url !== "string") {
|
|
170
172
|
throw new Error("MCP server URL must be a string");
|
|
171
173
|
}
|
|
172
174
|
|
|
173
|
-
const missing = getMissingEnvVars(definition.url);
|
|
175
|
+
const missing = getMissingEnvVars(definition.url, environment);
|
|
174
176
|
if (missing.length > 0) {
|
|
175
177
|
throw new Error(`Missing environment variable${missing.length === 1 ? "" : "s"} in MCP server URL: ${missing.join(", ")}`);
|
|
176
178
|
}
|
|
177
179
|
|
|
178
|
-
const resolved = interpolateEnvVars(definition.url);
|
|
180
|
+
const resolved = interpolateEnvVars(definition.url, environment);
|
|
179
181
|
try {
|
|
180
182
|
new URL(resolved);
|
|
181
183
|
} catch (error) {
|
|
@@ -184,10 +186,10 @@ export function resolveServerUrl(definition: Pick<ServerEntry, "url">): string |
|
|
|
184
186
|
return resolved;
|
|
185
187
|
}
|
|
186
188
|
|
|
187
|
-
export function resolveConfigPath(value: string | undefined): string | undefined {
|
|
189
|
+
export function resolveConfigPath(value: string | undefined, environment: NodeJS.ProcessEnv = process.env): string | undefined {
|
|
188
190
|
if (value === undefined) return undefined;
|
|
189
191
|
|
|
190
|
-
const resolved = interpolateEnvVars(value);
|
|
192
|
+
const resolved = interpolateEnvVars(value, environment);
|
|
191
193
|
if (resolved === "~") return homedir();
|
|
192
194
|
if (resolved.startsWith("~/") || resolved.startsWith("~\\")) {
|
|
193
195
|
return join(homedir(), resolved.slice(2));
|
|
@@ -195,11 +197,11 @@ export function resolveConfigPath(value: string | undefined): string | undefined
|
|
|
195
197
|
return resolved;
|
|
196
198
|
}
|
|
197
199
|
|
|
198
|
-
export function resolveBearerToken(definition: Pick<ServerEntry, "bearerToken" | "bearerTokenEnv"
|
|
200
|
+
export function resolveBearerToken(definition: Pick<ServerEntry, "bearerToken" | "bearerTokenEnv">, environment: NodeJS.ProcessEnv = process.env): string | undefined {
|
|
199
201
|
if (definition.bearerToken !== undefined) {
|
|
200
|
-
return interpolateSecretExpression(definition.bearerToken);
|
|
202
|
+
return interpolateSecretExpression(definition.bearerToken, environment);
|
|
201
203
|
}
|
|
202
|
-
return definition.bearerTokenEnv ?
|
|
204
|
+
return definition.bearerTokenEnv ? environment[definition.bearerTokenEnv] : undefined;
|
|
203
205
|
}
|
|
204
206
|
|
|
205
207
|
/** Remove OSC control strings, including payloads that have no terminator. */
|
|
@@ -4,6 +4,32 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.25.0] - 2026-08-25
|
|
8
|
+
|
|
9
|
+
### Highlights
|
|
10
|
+
- `web_search`, `source_check`, and `fetch_content` can now use an explicit HTTP(S) proxy for restricted networks.
|
|
11
|
+
- `fetch_content` now gives useful GitHub PR and issue summaries, including comments, review threads, anchors, and truncation markers.
|
|
12
|
+
- Gemini users can choose browser cookie profiles more predictably and can use Google Application Default Credentials for Gemini generate-content calls.
|
|
13
|
+
- Kimi Code Plan users can run explicit Kimi web searches through Pi's `kimi-coding` login.
|
|
14
|
+
- HTML extraction, missing-page guidance, and stored-content lookup are more reliable.
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
- Added an optional `proxy` parameter to `web_search`, `source_check`, and `fetch_content`. When set, search APIs, page fetches, and content extraction use `curl` through that proxy. Localhost and `NO_PROXY` hosts still bypass the proxy. A default proxy can also be set with `"proxy"` in `~/.pi/web-search.json`. Thanks to [@mystery4f](https://github.com/mystery4f) for PR #307.
|
|
18
|
+
- Added deterministic Chromium cookie selection with `browserCookies.browser` and `browserCookies.profile`; arbitrary profile paths remain unsupported. Thanks to [@lmilojevicc](https://github.com/lmilojevicc) for issue #297.
|
|
19
|
+
- Added GitHub PR and issue specialization in `fetch_content`, with `gh`-first metadata, bounded REST fallback, comment anchors, review threads, truncation markers, and the `githubPrIssue.enabled` opt-out (#294).
|
|
20
|
+
- Added explicit-only Kimi Code Plan search using Pi's refreshed `kimi-coding` OAuth credentials. Thanks to [@lushangkan](https://github.com/lushangkan) for PR #275.
|
|
21
|
+
- Added opt-in `searchRouting.useCurrentModel` routing for automatic searches. Official OpenAI GPT Responses models can now fund Hosted Search with their current endpoint, credentials, and headers before configured fallbacks. Thanks to [@nyankosama](https://github.com/nyankosama) for PR #293.
|
|
22
|
+
- Added strict Hosted Search response validation and better fallback classification for unsupported Hosted Search tools.
|
|
23
|
+
- Added current-model Hosted Search routing for official `openai-codex` GPT Responses models through the Codex Responses endpoint.
|
|
24
|
+
- Added Google Application Default Credentials support for Gemini generate-content calls with `geminiAuth: "adc"`. This covers Gemini search, URL context, PDF, and inline-data extraction through Vertex AI. YouTube and local video analysis still require `GEMINI_API_KEY` because they use the Gemini Files API. Thanks to [@smazurov](https://github.com/smazurov) for PR #301.
|
|
25
|
+
|
|
26
|
+
### Fixed
|
|
27
|
+
- Added Defuddle as a local fallback when Readability and RSC extraction cannot recover useful HTML content. Thanks to [@tobru](https://github.com/tobru) for issue #300.
|
|
28
|
+
- Kept Gemini ADC config and credential errors, GitHub PR/issue REST fallback failures, and Defuddle fallback failures visible instead of silently downgrading them.
|
|
29
|
+
- Pointed definitive `fetch_content` 404/410 failures to search guidance instead of provider configuration. Thanks to [@Daniishkhan](https://github.com/Daniishkhan) for PR #308.
|
|
30
|
+
- Improved Gemini Web browser-cookie diagnostics so `/google-account` shows sanitized attempted browser/profile entries and distinguishes missing required cookies, password-store access, and decryption failures. Thanks to [@lmilojevicc](https://github.com/lmilojevicc) for issue #296.
|
|
31
|
+
- Made `get_search_content` tolerate bridge defaults when `findText` is supplied, while preserving ordinary pagination. Thanks to [@ZacharyQin](https://github.com/ZacharyQin) for PR #295.
|
|
32
|
+
|
|
7
33
|
## [0.24.2] - 2026-08-22
|
|
8
34
|
|
|
9
35
|
### Highlights
|