@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.
Files changed (476) hide show
  1. package/README.md +23 -10
  2. package/{node_modules/@herbertgao/pi-mermaid-open/LICENSE → THIRD_PARTY_NOTICES.md} +19 -1
  3. package/node_modules/@czottmann/pi-automode/CHANGELOG.md +15 -0
  4. package/node_modules/@czottmann/pi-automode/README.md +5 -3
  5. package/node_modules/@czottmann/pi-automode/docs/adr/ADR-001-permission-precedence-and-trust-boundaries.md +2 -0
  6. package/node_modules/@czottmann/pi-automode/docs/adr/ADR-002-global-config-in-extension-data-directory.md +60 -0
  7. package/node_modules/@czottmann/pi-automode/docs/adr/INDEX.md +1 -0
  8. package/node_modules/@czottmann/pi-automode/docs/automode-classifier-flow.md +4 -4
  9. package/node_modules/@czottmann/pi-automode/docs/configuration.md +20 -4
  10. package/node_modules/@czottmann/pi-automode/docs/observability-logging.md +1 -1
  11. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/bash.ts +692 -0
  12. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/config.ts +181 -3
  13. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/constants.ts +4 -1
  14. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/extension.ts +143 -36
  15. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/hard-deny.ts +103 -148
  16. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/paths.ts +32 -6
  17. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/permissions.ts +344 -22
  18. package/node_modules/@czottmann/pi-automode/extensions/auto-mode.ts +1 -0
  19. package/node_modules/@czottmann/pi-automode/package.json +4 -1
  20. package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +2 -1
  21. package/node_modules/@herbertgao/pi-cc-extensions/README.md +2 -1
  22. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +4 -0
  23. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +21 -1
  24. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/agent-summary/core.ts +1 -1
  25. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/context.ts +19 -19
  26. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +4 -2
  27. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +2 -1
  28. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +10 -2
  29. package/node_modules/@herbertgao/pi-cc-extensions/package.json +3 -3
  30. package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +10 -0
  31. package/node_modules/@herbertgao/pi-subagents/README.md +21 -15
  32. package/node_modules/@herbertgao/pi-subagents/package.json +3 -3
  33. package/node_modules/@herbertgao/pi-subagents/src/agent-file-toggle.ts +11 -8
  34. package/node_modules/@herbertgao/pi-subagents/src/agent-manager.ts +184 -106
  35. package/node_modules/@herbertgao/pi-subagents/src/cross-extension-rpc.ts +31 -11
  36. package/node_modules/@herbertgao/pi-subagents/src/custom-agents.ts +9 -1
  37. package/node_modules/@herbertgao/pi-subagents/src/index.ts +156 -31
  38. package/node_modules/@herbertgao/pi-subagents/src/invocation-config.ts +17 -0
  39. package/node_modules/@herbertgao/pi-subagents/src/model-resolver.ts +14 -0
  40. package/node_modules/@herbertgao/pi-subagents/src/schedule.ts +8 -0
  41. package/node_modules/@herbertgao/pi-subagents/src/settings.ts +32 -1
  42. package/node_modules/@herbertgao/pi-subagents/src/types.ts +17 -2
  43. package/node_modules/@herbertgao/pi-subagents/src/ui/agent-widget.ts +23 -2
  44. package/node_modules/@herbertgao/pi-subagents/src/ui/conversation-viewer.ts +259 -24
  45. package/node_modules/@juicesharp/rpiv-ask-user-question/package.json +2 -2
  46. package/node_modules/@luxusai/pi-hindsight/CHANGELOG.md +376 -0
  47. package/node_modules/@luxusai/pi-hindsight/README.md +92 -0
  48. package/node_modules/@luxusai/pi-hindsight/docs/adr/001-memory-lifecycle-and-scope.md +56 -0
  49. package/node_modules/@luxusai/pi-hindsight/docs/adr/002-explicit-routing-strategy-seam.md +169 -0
  50. package/node_modules/@luxusai/pi-hindsight/docs/adr/003-tui-memory-mode-vocabulary.md +107 -0
  51. package/node_modules/@luxusai/pi-hindsight/docs/adr/004-lifeos-dual-bank-design.md +89 -0
  52. package/node_modules/@luxusai/pi-hindsight/docs/adr/005-domain-banks-and-agent-first-surface.md +189 -0
  53. package/node_modules/@luxusai/pi-hindsight/docs/assets/logos/pi-hindsight-logo-dark.webp +0 -0
  54. package/node_modules/@luxusai/pi-hindsight/docs/assets/logos/pi-hindsight-logo-dark@2x.webp +0 -0
  55. package/node_modules/@luxusai/pi-hindsight/docs/coding-memory-evaluation.md +54 -0
  56. package/node_modules/@luxusai/pi-hindsight/docs/compatibility.md +75 -0
  57. package/node_modules/@luxusai/pi-hindsight/docs/hindsight-core-functions.md +300 -0
  58. package/node_modules/@luxusai/pi-hindsight/docs/mission-and-mental-model-quality.md +158 -0
  59. package/node_modules/@luxusai/pi-hindsight/docs/next-opt-out-design.md +164 -0
  60. package/node_modules/@luxusai/pi-hindsight/docs/risky-memory-modes.md +139 -0
  61. package/node_modules/@luxusai/pi-hindsight/docs/starter-mental-model-suggestions.md +74 -0
  62. package/node_modules/@luxusai/pi-hindsight/docs/surface-reference.md +261 -0
  63. package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-operations.ts +151 -0
  64. package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-selection.ts +18 -0
  65. package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-settings-presenter.ts +46 -0
  66. package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-templates.ts +383 -0
  67. package/node_modules/@luxusai/pi-hindsight/extensions/banks/banking.ts +240 -0
  68. package/node_modules/@luxusai/pi-hindsight/extensions/banks/knowledge-page-seed.ts +176 -0
  69. package/node_modules/@luxusai/pi-hindsight/extensions/banks/retain-strategies.ts +178 -0
  70. package/node_modules/@luxusai/pi-hindsight/extensions/client/client-retry.ts +41 -0
  71. package/node_modules/@luxusai/pi-hindsight/extensions/client/client.ts +386 -0
  72. package/node_modules/@luxusai/pi-hindsight/extensions/client/fetch-compat.ts +39 -0
  73. package/node_modules/@luxusai/pi-hindsight/extensions/client/timeout.ts +34 -0
  74. package/node_modules/@luxusai/pi-hindsight/extensions/config/config-defaults.ts +140 -0
  75. package/node_modules/@luxusai/pi-hindsight/extensions/config/config-editing-model.ts +61 -0
  76. package/node_modules/@luxusai/pi-hindsight/extensions/config/config-editing-registry.ts +925 -0
  77. package/node_modules/@luxusai/pi-hindsight/extensions/config/config-field-paths.ts +247 -0
  78. package/node_modules/@luxusai/pi-hindsight/extensions/config/config-normalize.ts +547 -0
  79. package/node_modules/@luxusai/pi-hindsight/extensions/config/config-writer.ts +480 -0
  80. package/node_modules/@luxusai/pi-hindsight/extensions/config/config.ts +182 -0
  81. package/node_modules/@luxusai/pi-hindsight/extensions/config/setup-gate.ts +86 -0
  82. package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-execute.ts +1010 -0
  83. package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-parse.ts +175 -0
  84. package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-plan.ts +425 -0
  85. package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-presentation.ts +210 -0
  86. package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-sessions.ts +817 -0
  87. package/node_modules/@luxusai/pi-hindsight/extensions/index.ts +25 -0
  88. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/git-seed.ts +319 -0
  89. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle-recall.ts +196 -0
  90. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle-retain.ts +189 -0
  91. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle-runtime.ts +65 -0
  92. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle.ts +260 -0
  93. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/mental-models.ts +244 -0
  94. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/observation-scopes.ts +59 -0
  95. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/recall-cleanup.ts +82 -0
  96. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/recall-visibility.ts +45 -0
  97. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/recall.ts +331 -0
  98. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain-cursor.ts +354 -0
  99. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain-job-builder.ts +66 -0
  100. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain-receipts.ts +132 -0
  101. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain.ts +228 -0
  102. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-bank-template-operations.ts +74 -0
  103. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-config-operations.ts +16 -0
  104. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-control-operations.ts +648 -0
  105. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-diagnostics-operations.ts +105 -0
  106. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-identity.ts +68 -0
  107. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-operation-service.ts +71 -0
  108. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-operation-types.ts +13 -0
  109. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-recall-operations.ts +162 -0
  110. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-retain-operations.ts +131 -0
  111. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-scope.ts +104 -0
  112. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-session-operations.ts +37 -0
  113. package/node_modules/@luxusai/pi-hindsight/extensions/operations/operation-catalog.ts +893 -0
  114. package/node_modules/@luxusai/pi-hindsight/extensions/operations/reflect-presenter.ts +35 -0
  115. package/node_modules/@luxusai/pi-hindsight/extensions/operations/scope-migrate.ts +177 -0
  116. package/node_modules/@luxusai/pi-hindsight/extensions/operations/tools.ts +7 -0
  117. package/node_modules/@luxusai/pi-hindsight/extensions/queue/flush-presenter.ts +21 -0
  118. package/node_modules/@luxusai/pi-hindsight/extensions/queue/jsonl-queue-store.ts +112 -0
  119. package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue-delivery.ts +111 -0
  120. package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue-lock.ts +214 -0
  121. package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue-operations.ts +70 -0
  122. package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue.ts +392 -0
  123. package/node_modules/@luxusai/pi-hindsight/extensions/tui/bank-template-presentation.ts +45 -0
  124. package/node_modules/@luxusai/pi-hindsight/extensions/tui/commands.ts +9 -0
  125. package/node_modules/@luxusai/pi-hindsight/extensions/tui/guided-setup.ts +860 -0
  126. package/node_modules/@luxusai/pi-hindsight/extensions/tui/prefill-input.ts +105 -0
  127. package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-flow.ts +189 -0
  128. package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-server-probe.ts +299 -0
  129. package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-actions.ts +201 -0
  130. package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-facts.ts +47 -0
  131. package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-render.ts +239 -0
  132. package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-types.ts +50 -0
  133. package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui.ts +259 -0
  134. package/node_modules/@luxusai/pi-hindsight/extensions/tui/tool-presenters.ts +77 -0
  135. package/node_modules/@luxusai/pi-hindsight/extensions/types.ts +534 -0
  136. package/node_modules/@luxusai/pi-hindsight/extensions/utils/diagnostics.ts +319 -0
  137. package/node_modules/@luxusai/pi-hindsight/extensions/utils/messages.ts +325 -0
  138. package/node_modules/@luxusai/pi-hindsight/extensions/utils/sanitize.ts +42 -0
  139. package/node_modules/@luxusai/pi-hindsight/extensions/utils/session-memory-meta.ts +244 -0
  140. package/node_modules/@luxusai/pi-hindsight/extensions/utils/session-operations.ts +56 -0
  141. package/node_modules/@luxusai/pi-hindsight/extensions/utils/session.ts +50 -0
  142. package/node_modules/@luxusai/pi-hindsight/extensions/utils/status-fields.ts +167 -0
  143. package/node_modules/@luxusai/pi-hindsight/extensions/utils/status-health.ts +207 -0
  144. package/node_modules/@luxusai/pi-hindsight/extensions/utils/status.ts +120 -0
  145. package/node_modules/@luxusai/pi-hindsight/extensions/version.ts +8 -0
  146. package/node_modules/@luxusai/pi-hindsight/package.json +118 -0
  147. package/node_modules/@luxusai/pi-hindsight/skills/hindsight-memory-doctor/SKILL.md +75 -0
  148. package/node_modules/@narumitw/pi-btw/dist/index.ts +143 -46
  149. package/node_modules/@narumitw/pi-btw/dist/index.ts.map +3 -3
  150. package/node_modules/@narumitw/pi-btw/package.json +6 -6
  151. package/node_modules/@narumitw/pi-btw/src/fullscreen-ui.ts +136 -22
  152. package/node_modules/{@herbertgao → @tifan}/pi-copy-response/README.md +2 -4
  153. package/node_modules/{@herbertgao → @tifan}/pi-copy-response/package.json +5 -15
  154. package/node_modules/{@herbertgao → @tifan}/pi-handoff/README.md +4 -6
  155. package/node_modules/@tifan/pi-handoff/package.json +43 -0
  156. package/node_modules/{@herbertgao → @tifan}/pi-handoff/src/index.ts +1 -1
  157. package/node_modules/{@herbertgao → @tifan}/pi-inline-skills/README.md +2 -4
  158. package/node_modules/{@herbertgao → @tifan}/pi-inline-skills/package.json +5 -15
  159. package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/README.md +5 -7
  160. package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/package.json +5 -19
  161. package/node_modules/{@herbertgao → @tifan}/pi-preferred-thinking/README.md +4 -6
  162. package/node_modules/{@herbertgao → @tifan}/pi-preferred-thinking/package.json +6 -16
  163. package/node_modules/{@herbertgao → @tifan}/pi-preferred-thinking/src/index.ts +1 -6
  164. package/node_modules/{@herbertgao → @tifan}/pi-recap/README.md +4 -6
  165. package/node_modules/@tifan/pi-recap/package.json +42 -0
  166. package/node_modules/{@herbertgao → @tifan}/pi-recap/src/models.ts +1 -6
  167. package/node_modules/{@herbertgao → @tifan}/pi-rename/README.md +13 -8
  168. package/node_modules/@tifan/pi-rename/package.json +47 -0
  169. package/node_modules/@tifan/pi-rename/src/herdr-label.ts +4 -0
  170. package/node_modules/{@herbertgao → @tifan}/pi-rename/src/index.ts +4 -16
  171. package/node_modules/{@herbertgao → @tifan}/pi-rename/src/models.ts +1 -6
  172. package/node_modules/{@herbertgao → @tifan}/pi-titlebar-spinner/README.md +2 -4
  173. package/node_modules/{@herbertgao → @tifan}/pi-titlebar-spinner/package.json +5 -15
  174. package/node_modules/pi-lens/CHANGELOG.md +96 -1
  175. package/node_modules/pi-lens/dist/clients/actionable-warnings-logger.js +2 -1
  176. package/node_modules/pi-lens/dist/clients/actionable-warnings.js +14 -5
  177. package/node_modules/pi-lens/dist/clients/advisory-provenance.js +48 -18
  178. package/node_modules/pi-lens/dist/clients/ast-grep-client.js +1 -3
  179. package/node_modules/pi-lens/dist/clients/atomic-write-staging.js +16 -4
  180. package/node_modules/pi-lens/dist/clients/bash-file-access.js +3 -1
  181. package/node_modules/pi-lens/dist/clients/biome-client.js +1 -3
  182. package/node_modules/pi-lens/dist/clients/blocker-freshness.js +21 -8
  183. package/node_modules/pi-lens/dist/clients/bounded-cache.js +24 -8
  184. package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +4 -3
  185. package/node_modules/pi-lens/dist/clients/cache-manager.js +6 -7
  186. package/node_modules/pi-lens/dist/clients/cache-observability.js +461 -66
  187. package/node_modules/pi-lens/dist/clients/call-graph.js +238 -63
  188. package/node_modules/pi-lens/dist/clients/codebase-model.js +13 -5
  189. package/node_modules/pi-lens/dist/clients/complexity-client.js +1 -3
  190. package/node_modules/pi-lens/dist/clients/dead-code-client.js +19 -8
  191. package/node_modules/pi-lens/dist/clients/dead-code-logger.js +1 -2
  192. package/node_modules/pi-lens/dist/clients/deadline-utils.js +3 -1
  193. package/node_modules/pi-lens/dist/clients/debug-heap.js +8 -1
  194. package/node_modules/pi-lens/dist/clients/degradation-ledger.js +1 -1
  195. package/node_modules/pi-lens/dist/clients/dependency-checker.js +11 -7
  196. package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +39 -2
  197. package/node_modules/pi-lens/dist/clients/diagnostic-line-freshness.js +5 -1
  198. package/node_modules/pi-lens/dist/clients/dispatch/auxiliary-lsp.js +2 -3
  199. package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +13 -1
  200. package/node_modules/pi-lens/dist/clients/dispatch/facts/function-facts.js +3 -1
  201. package/node_modules/pi-lens/dist/clients/dispatch/facts/import-facts.js +2 -1
  202. package/node_modules/pi-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +1 -1
  203. package/node_modules/pi-lens/dist/clients/dispatch/integration.js +9 -4
  204. package/node_modules/pi-lens/dist/clients/dispatch/rules/error-swallowing.js +3 -1
  205. package/node_modules/pi-lens/dist/clients/dispatch/rules/pass-through-wrappers.js +6 -2
  206. package/node_modules/pi-lens/dist/clients/dispatch/rules/unsafe-boundary.js +31 -7
  207. package/node_modules/pi-lens/dist/clients/dispatch/runners/actionlint.js +5 -2
  208. package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +10 -14
  209. package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +5 -1
  210. package/node_modules/pi-lens/dist/clients/dispatch/runners/dotnet-build.js +1 -1
  211. package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +3 -1
  212. package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +25 -6
  213. package/node_modules/pi-lens/dist/clients/dispatch/runners/fish-indent.js +1 -1
  214. package/node_modules/pi-lens/dist/clients/dispatch/runners/gleam-check.js +1 -1
  215. package/node_modules/pi-lens/dist/clients/dispatch/runners/golangci-lint.js +3 -1
  216. package/node_modules/pi-lens/dist/clients/dispatch/runners/hadolint.js +13 -8
  217. package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-lint.js +4 -1
  218. package/node_modules/pi-lens/dist/clients/dispatch/runners/htmlhint.js +25 -10
  219. package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +1 -1
  220. package/node_modules/pi-lens/dist/clients/dispatch/runners/ktlint.js +1 -1
  221. package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +1 -1
  222. package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +28 -4
  223. package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +6 -8
  224. package/node_modules/pi-lens/dist/clients/dispatch/runners/oxlint.js +212 -11
  225. package/node_modules/pi-lens/dist/clients/dispatch/runners/php-lint.js +1 -1
  226. package/node_modules/pi-lens/dist/clients/dispatch/runners/phpstan.js +8 -4
  227. package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +10 -6
  228. package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +23 -14
  229. package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +1 -1
  230. package/node_modules/pi-lens/dist/clients/dispatch/runners/shellcheck.js +7 -9
  231. package/node_modules/pi-lens/dist/clients/dispatch/runners/shfmt.js +5 -2
  232. package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +7 -7
  233. package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +6 -8
  234. package/node_modules/pi-lens/dist/clients/dispatch/runners/terragrunt.js +13 -8
  235. package/node_modules/pi-lens/dist/clients/dispatch/runners/tflint.js +13 -8
  236. package/node_modules/pi-lens/dist/clients/dispatch/runners/tree-sitter.js +17 -3
  237. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +7 -1
  238. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +24 -1
  239. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/tool-failure.js +35 -0
  240. package/node_modules/pi-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +1 -3
  241. package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +6 -8
  242. package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +1 -1
  243. package/node_modules/pi-lens/dist/clients/dispatch/suppress-writer.js +2 -1
  244. package/node_modules/pi-lens/dist/clients/dispatch/types.js +6 -1
  245. package/node_modules/pi-lens/dist/clients/dispatch/utils/lsp-diagnostics.js +6 -2
  246. package/node_modules/pi-lens/dist/clients/extension-log.js +5 -3
  247. package/node_modules/pi-lens/dist/clients/feature-hints.js +8 -1
  248. package/node_modules/pi-lens/dist/clients/file-kinds.js +34 -129
  249. package/node_modules/pi-lens/dist/clients/file-utils.js +17 -1
  250. package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +57 -2
  251. package/node_modules/pi-lens/dist/clients/formatters.js +144 -27
  252. package/node_modules/pi-lens/dist/clients/freshness.js +38 -0
  253. package/node_modules/pi-lens/dist/clients/git-guard.js +43 -13
  254. package/node_modules/pi-lens/dist/clients/go-client.js +1 -3
  255. package/node_modules/pi-lens/dist/clients/grammar-source.js +1 -1
  256. package/node_modules/pi-lens/dist/clients/gzip-stage-write.js +30 -4
  257. package/node_modules/pi-lens/dist/clients/host-edit-normalize.js +1 -3
  258. package/node_modules/pi-lens/dist/clients/install-diagnostics.js +4 -2
  259. package/node_modules/pi-lens/dist/clients/installer/index.js +86 -77
  260. package/node_modules/pi-lens/dist/clients/instance-reaper.js +5 -2
  261. package/node_modules/pi-lens/dist/clients/instance-registry.js +4 -2
  262. package/node_modules/pi-lens/dist/clients/jscpd-client.js +6 -1
  263. package/node_modules/pi-lens/dist/clients/knip-client.js +29 -15
  264. package/node_modules/pi-lens/dist/clients/language-profile.js +4 -1
  265. package/node_modules/pi-lens/dist/clients/latency-logger.js +13 -2
  266. package/node_modules/pi-lens/dist/clients/lens-config.js +1 -1
  267. package/node_modules/pi-lens/dist/clients/lens-map.js +8 -3
  268. package/node_modules/pi-lens/dist/clients/live-bus-emitter.js +1 -1
  269. package/node_modules/pi-lens/dist/clients/lsp/config.js +4 -6
  270. package/node_modules/pi-lens/dist/clients/lsp/edits.js +119 -32
  271. package/node_modules/pi-lens/dist/clients/lsp/index.js +94 -35
  272. package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +2 -1
  273. package/node_modules/pi-lens/dist/clients/lsp/jvm-runtime.js +4 -1
  274. package/node_modules/pi-lens/dist/clients/lsp/launch.js +11 -3
  275. package/node_modules/pi-lens/dist/clients/lsp/pending-aux-coverage.js +152 -0
  276. package/node_modules/pi-lens/dist/clients/lsp/server.js +19 -7
  277. package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +10 -2
  278. package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +9 -4
  279. package/node_modules/pi-lens/dist/clients/lsp-document-symbols.js +1 -3
  280. package/node_modules/pi-lens/dist/clients/lsp-mutation.js +10 -20
  281. package/node_modules/pi-lens/dist/clients/mcp/host-shim.js +1 -1
  282. package/node_modules/pi-lens/dist/clients/memory-sampler.js +73 -7
  283. package/node_modules/pi-lens/dist/clients/metrics-client.js +1 -3
  284. package/node_modules/pi-lens/dist/clients/middle-man-analysis.js +8 -3
  285. package/node_modules/pi-lens/dist/clients/module-report-lsp.js +7 -1
  286. package/node_modules/pi-lens/dist/clients/module-report.js +14 -17
  287. package/node_modules/pi-lens/dist/clients/ndjson-logger.js +3 -5
  288. package/node_modules/pi-lens/dist/clients/opaque-mutation-scan.js +220 -0
  289. package/node_modules/pi-lens/dist/clients/package-manager.js +6 -1
  290. package/node_modules/pi-lens/dist/clients/pipeline.js +57 -9
  291. package/node_modules/pi-lens/dist/clients/project-conventions.js +2 -8
  292. package/node_modules/pi-lens/dist/clients/project-diagnostics/cache.js +10 -7
  293. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +2 -1
  294. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +3 -1
  295. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +13 -9
  296. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +3 -1
  297. package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +5 -2
  298. package/node_modules/pi-lens/dist/clients/project-lens-config.js +12 -5
  299. package/node_modules/pi-lens/dist/clients/project-snapshot-fingerprint.js +48 -0
  300. package/node_modules/pi-lens/dist/clients/project-snapshot-persist-worker.js +15 -1
  301. package/node_modules/pi-lens/dist/clients/project-snapshot.js +472 -66
  302. package/node_modules/pi-lens/dist/clients/read-expansion.js +12 -2
  303. package/node_modules/pi-lens/dist/clients/read-guard-logger.js +5 -4
  304. package/node_modules/pi-lens/dist/clients/read-guard-tool-lines.js +5 -2
  305. package/node_modules/pi-lens/dist/clients/read-guard.js +1 -1
  306. package/node_modules/pi-lens/dist/clients/resource-sampler.js +1 -1
  307. package/node_modules/pi-lens/dist/clients/reverse-deps.js +6 -5
  308. package/node_modules/pi-lens/dist/clients/review-graph/builder.js +42 -17
  309. package/node_modules/pi-lens/dist/clients/review-graph/git-identity.js +8 -2
  310. package/node_modules/pi-lens/dist/clients/review-graph/import-resolvers.js +10 -1
  311. package/node_modules/pi-lens/dist/clients/review-graph/query.js +2 -1
  312. package/node_modules/pi-lens/dist/clients/review-graph/tsconfig-paths.js +4 -2
  313. package/node_modules/pi-lens/dist/clients/review-graph/workspace-modules.js +2 -2
  314. package/node_modules/pi-lens/dist/clients/ruff-client.js +6 -5
  315. package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +63 -31
  316. package/node_modules/pi-lens/dist/clients/runtime-context.js +12 -4
  317. package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +83 -4
  318. package/node_modules/pi-lens/dist/clients/runtime-session.js +14 -0
  319. package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +59 -3
  320. package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +148 -34
  321. package/node_modules/pi-lens/dist/clients/runtime-turn.js +147 -6
  322. package/node_modules/pi-lens/dist/clients/rust-client.js +1 -3
  323. package/node_modules/pi-lens/dist/clients/safe-spawn.js +150 -11
  324. package/node_modules/pi-lens/dist/clients/security-scan-client.js +1 -3
  325. package/node_modules/pi-lens/dist/clients/session-summary.js +3 -1
  326. package/node_modules/pi-lens/dist/clients/sg-runner.js +1 -3
  327. package/node_modules/pi-lens/dist/clients/source-filter.js +10 -6
  328. package/node_modules/pi-lens/dist/clients/source-walker.js +1 -1
  329. package/node_modules/pi-lens/dist/clients/spawn-timeout-cooldown.js +96 -0
  330. package/node_modules/pi-lens/dist/clients/startup-scan.js +4 -1
  331. package/node_modules/pi-lens/dist/clients/tool-definition.js +7 -0
  332. package/node_modules/pi-lens/dist/clients/tool-policy.js +26 -11
  333. package/node_modules/pi-lens/dist/clients/tool-render.js +2 -1
  334. package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +10 -4
  335. package/node_modules/pi-lens/dist/clients/tree-sitter-logger.js +2 -2
  336. package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +12 -5
  337. package/node_modules/pi-lens/dist/clients/warm-attach.js +12 -5
  338. package/node_modules/pi-lens/dist/clients/widget-state.js +27 -11
  339. package/node_modules/pi-lens/dist/clients/word-index.js +3 -1
  340. package/node_modules/pi-lens/dist/clients/workspace-topology.js +8 -2
  341. package/node_modules/pi-lens/dist/clients/zizmor-config.js +9 -1
  342. package/node_modules/pi-lens/dist/i18n.js +13 -5
  343. package/node_modules/pi-lens/dist/index.js +10797 -8627
  344. package/node_modules/pi-lens/dist/mcp/server.js +3 -1
  345. package/node_modules/pi-lens/dist/tools/ast-grep-replace.js +68 -12
  346. package/node_modules/pi-lens/dist/tools/lens-diagnostic-mark.js +21 -7
  347. package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +164 -35
  348. package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +24 -7
  349. package/node_modules/pi-lens/dist/tools/lsp-navigation.js +3 -1
  350. package/node_modules/pi-lens/dist/tools/module-report.js +1 -1
  351. package/node_modules/pi-lens/dist/tools/project-report.js +1 -1
  352. package/node_modules/pi-lens/dist/tools/symbol-search.js +5 -2
  353. package/node_modules/pi-lens/docs/durable-store-audit-1202.md +1 -1
  354. package/node_modules/pi-lens/docs/servercapabilities.md +1 -1
  355. package/node_modules/pi-lens/package.json +160 -156
  356. package/node_modules/pi-lens/rules/typos/_typos.toml +2 -2
  357. package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +31 -13
  358. package/node_modules/pi-lens/scripts/download-grammars.js +9 -3
  359. package/node_modules/pi-lens/scripts/rpc-load-check.mjs +30 -9
  360. package/node_modules/pi-mcp-adapter/CHANGELOG.md +47 -0
  361. package/node_modules/pi-mcp-adapter/README.md +42 -13
  362. package/node_modules/pi-mcp-adapter/commands.ts +4 -2
  363. package/node_modules/pi-mcp-adapter/config.ts +45 -5
  364. package/node_modules/pi-mcp-adapter/direct-tools.ts +103 -92
  365. package/node_modules/pi-mcp-adapter/dist/agent-dir.d.ts +10 -0
  366. package/node_modules/pi-mcp-adapter/dist/agent-dir.js +63 -0
  367. package/node_modules/pi-mcp-adapter/dist/agent-dir.js.map +1 -0
  368. package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.d.ts +8 -0
  369. package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.js +356 -0
  370. package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.js.map +1 -0
  371. package/node_modules/pi-mcp-adapter/dist/config.d.ts +123 -0
  372. package/node_modules/pi-mcp-adapter/dist/config.js +1087 -0
  373. package/node_modules/pi-mcp-adapter/dist/config.js.map +1 -0
  374. package/node_modules/pi-mcp-adapter/dist/metadata-cache.d.ts +19 -0
  375. package/node_modules/pi-mcp-adapter/dist/metadata-cache.js +319 -0
  376. package/node_modules/pi-mcp-adapter/dist/metadata-cache.js.map +1 -0
  377. package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.d.ts +2 -0
  378. package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.js +156 -0
  379. package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.js.map +1 -0
  380. package/node_modules/pi-mcp-adapter/dist/resource-tools.d.ts +1 -0
  381. package/node_modules/pi-mcp-adapter/dist/resource-tools.js +15 -0
  382. package/node_modules/pi-mcp-adapter/dist/resource-tools.js.map +1 -0
  383. package/node_modules/pi-mcp-adapter/dist/types.d.ts +564 -0
  384. package/node_modules/pi-mcp-adapter/dist/types.js +287 -0
  385. package/node_modules/pi-mcp-adapter/dist/types.js.map +1 -0
  386. package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.d.ts +6 -0
  387. package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.js +37 -0
  388. package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.js.map +1 -0
  389. package/node_modules/pi-mcp-adapter/dist/ui-stream-types.d.ts +104 -0
  390. package/node_modules/pi-mcp-adapter/dist/ui-stream-types.js +59 -0
  391. package/node_modules/pi-mcp-adapter/dist/ui-stream-types.js.map +1 -0
  392. package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.d.ts +4 -0
  393. package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.js +27 -0
  394. package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.js.map +1 -0
  395. package/node_modules/pi-mcp-adapter/dist/utils.d.ts +32 -0
  396. package/node_modules/pi-mcp-adapter/dist/utils.js +338 -0
  397. package/node_modules/pi-mcp-adapter/dist/utils.js.map +1 -0
  398. package/node_modules/pi-mcp-adapter/failure-backoff.ts +23 -0
  399. package/node_modules/pi-mcp-adapter/index.ts +204 -82
  400. package/node_modules/pi-mcp-adapter/init.ts +41 -30
  401. package/node_modules/pi-mcp-adapter/lifecycle.ts +16 -8
  402. package/node_modules/pi-mcp-adapter/mcp-code.ts +2 -0
  403. package/node_modules/pi-mcp-adapter/mcp-oauth-provider.ts +66 -16
  404. package/node_modules/pi-mcp-adapter/mcp-output-guard.ts +95 -7
  405. package/node_modules/pi-mcp-adapter/mcp-probe.ts +18 -4
  406. package/node_modules/pi-mcp-adapter/mcp-references.ts +368 -0
  407. package/node_modules/pi-mcp-adapter/mcp-status.ts +8 -19
  408. package/node_modules/pi-mcp-adapter/metadata-cache.ts +20 -12
  409. package/node_modules/pi-mcp-adapter/namespace-tools.ts +276 -0
  410. package/node_modules/pi-mcp-adapter/package.json +24 -6
  411. package/node_modules/pi-mcp-adapter/proxy-modes.ts +66 -10
  412. package/node_modules/pi-mcp-adapter/search-ranking.ts +2 -0
  413. package/node_modules/pi-mcp-adapter/server-manager.ts +63 -12
  414. package/node_modules/pi-mcp-adapter/state.ts +1 -3
  415. package/node_modules/pi-mcp-adapter/tool-result-renderer.ts +16 -2
  416. package/node_modules/pi-mcp-adapter/types.ts +48 -1
  417. package/node_modules/pi-mcp-adapter/ui-server.ts +3 -19
  418. package/node_modules/pi-mcp-adapter/ui-session.ts +2 -1
  419. package/node_modules/pi-mcp-adapter/utils.ts +21 -19
  420. package/node_modules/pi-web-access/CHANGELOG.md +26 -0
  421. package/node_modules/pi-web-access/README.md +71 -14
  422. package/node_modules/pi-web-access/chrome-cookies.ts +115 -35
  423. package/node_modules/pi-web-access/credential-source.ts +6 -2
  424. package/node_modules/pi-web-access/curator-page.ts +5 -3
  425. package/node_modules/pi-web-access/curator-server.ts +2 -1
  426. package/node_modules/pi-web-access/extract.ts +89 -9
  427. package/node_modules/pi-web-access/fetch-params.ts +13 -0
  428. package/node_modules/pi-web-access/gemini-adc.ts +298 -0
  429. package/node_modules/pi-web-access/gemini-api.ts +59 -15
  430. package/node_modules/pi-web-access/gemini-search.ts +58 -18
  431. package/node_modules/pi-web-access/gemini-url-context.ts +3 -2
  432. package/node_modules/pi-web-access/gemini-web-config.ts +57 -7
  433. package/node_modules/pi-web-access/gemini-web.ts +9 -3
  434. package/node_modules/pi-web-access/github-api.ts +5 -4
  435. package/node_modules/pi-web-access/github-issue-pr.ts +700 -0
  436. package/node_modules/pi-web-access/index.ts +403 -297
  437. package/node_modules/pi-web-access/kimi-search.ts +234 -0
  438. package/node_modules/pi-web-access/openai-search.ts +118 -21
  439. package/node_modules/pi-web-access/package.json +3 -2
  440. package/node_modules/pi-web-access/ssrf-protection.ts +4 -1
  441. package/node_modules/pi-web-access/utils.ts +307 -1
  442. package/node_modules/pi-web-access/youtube-extract.ts +2 -2
  443. package/package.json +46 -37
  444. package/node_modules/@herbertgao/pi-copy-response/CHANGELOG.md +0 -49
  445. package/node_modules/@herbertgao/pi-copy-response/LICENSE +0 -22
  446. package/node_modules/@herbertgao/pi-handoff/CHANGELOG.md +0 -83
  447. package/node_modules/@herbertgao/pi-handoff/LICENSE +0 -22
  448. package/node_modules/@herbertgao/pi-handoff/package.json +0 -60
  449. package/node_modules/@herbertgao/pi-inline-skills/CHANGELOG.md +0 -57
  450. package/node_modules/@herbertgao/pi-inline-skills/LICENSE +0 -22
  451. package/node_modules/@herbertgao/pi-mermaid-open/CHANGELOG.md +0 -39
  452. package/node_modules/@herbertgao/pi-preferred-thinking/CHANGELOG.md +0 -63
  453. package/node_modules/@herbertgao/pi-preferred-thinking/LICENSE +0 -22
  454. package/node_modules/@herbertgao/pi-recap/CHANGELOG.md +0 -101
  455. package/node_modules/@herbertgao/pi-recap/LICENSE +0 -22
  456. package/node_modules/@herbertgao/pi-recap/package.json +0 -55
  457. package/node_modules/@herbertgao/pi-rename/CHANGELOG.md +0 -49
  458. package/node_modules/@herbertgao/pi-rename/LICENSE +0 -22
  459. package/node_modules/@herbertgao/pi-rename/package.json +0 -63
  460. package/node_modules/@herbertgao/pi-titlebar-spinner/CHANGELOG.md +0 -25
  461. package/node_modules/@herbertgao/pi-titlebar-spinner/LICENSE +0 -22
  462. /package/node_modules/{@herbertgao → @tifan}/pi-copy-response/src/index.ts +0 -0
  463. /package/node_modules/{@herbertgao → @tifan}/pi-handoff/src/complete-text.ts +0 -0
  464. /package/node_modules/{@herbertgao → @tifan}/pi-handoff/src/session-query.ts +0 -0
  465. /package/node_modules/{@herbertgao → @tifan}/pi-inline-skills/src/index.ts +0 -0
  466. /package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/herdr-plugin/herdr-plugin.toml +0 -0
  467. /package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/herdr-plugin/viewer.mjs +0 -0
  468. /package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/src/index.ts +0 -0
  469. /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/index.ts +0 -0
  470. /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/model-picker.ts +0 -0
  471. /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/sanitize.ts +0 -0
  472. /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/tui.ts +0 -0
  473. /package/node_modules/{@herbertgao → @tifan}/pi-rename/src/model-picker.ts +0 -0
  474. /package/node_modules/{@herbertgao → @tifan}/pi-rename/src/naming.ts +0 -0
  475. /package/node_modules/{@herbertgao → @tifan}/pi-rename/src/sanitize.ts +0 -0
  476. /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 tools: McpTool[];
393
+ let toolResult: ToolListResult;
379
394
  try {
380
- tools = await this.fetchAllTools(expectedConnection.client, {
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 (isDeepStrictEqual(expectedConnection.tools, tools)) {
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
- expectedConnection.tools = tools;
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 (this.connections.get(name) === expectedConnection && expectedConnection.tools === tools) {
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 [tools, resources, promptResult] = await Promise.all([
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<McpTool[]> {
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, type UiServerHandle } from "./ui-server.ts";
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) => process.env[name] ?? "")
77
- .replace(/\$env:(\w+)/g, (_, name) => process.env[name] ?? "")
78
- .replace(/\{env:(\w+)\}/g, (_, name) => process.env[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 && process.env[name] === undefined) {
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">): string | undefined {
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">): string | undefined {
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 ? process.env[definition.bearerTokenEnv] : undefined;
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