@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
@@ -6,23 +6,32 @@ import { Type } from "typebox";
6
6
  import type { TSchema } from "typebox";
7
7
  import { showStatus, showTools, showPrompts, reconnectServer, reconnectServers, authenticateServer, logoutServer, manageBearerToken, openMcpAuthPanel, openMcpPanel, openMcpSetup } from "./commands.ts";
8
8
  import { cloneMcpConfig, loadMcpConfig, writeProjectServerDisabledOverride } from "./config.ts";
9
- import { buildProxyDescription, createDirectToolExecutor, getMissingConfiguredDirectToolServers, resolveDirectTools } from "./direct-tools.ts";
9
+ import { buildProxyDescription, createDirectToolExecutor, getMissingConfiguredDirectToolServers, prepareDirectToolArguments, resolveDirectTools } from "./direct-tools.ts";
10
10
  import { flushMetadataCache, initializeMcp, updateStatusBar } from "./init.ts";
11
- import { loadMetadataCache, type MetadataCache } from "./metadata-cache.ts";
11
+ import { isServerInActiveFailureBackoff } from "./failure-backoff.ts";
12
+ import { loadMetadataCache, parseDirectToolSelectors, type MetadataCache } from "./metadata-cache.ts";
12
13
  import { createPromptCommand, resolveCachedPrompts } from "./prompts.ts";
13
14
  import { logger } from "./logger.ts";
14
15
  import { executeAuthComplete, executeAuthStart, executeCall, executeConnect, executeDescribe, executeInstructions, executeList, executeSearch, executeStatus, executeUiMessages } from "./proxy-modes.ts";
15
16
  import { formatTerminalError, getConfigPathFromArgv, normalizeDirectToolInputSchema, truncateAtWord } from "./utils.ts";
16
17
  import { createOAuthRuntime, shutdownOAuth } from "./mcp-auth-flow.ts";
17
- import { createMcpDirectToolCallRenderer, createMcpProxyToolCallRenderer, createMcpToolResultRenderer, resolveMcpToolRenderOptions } from "./tool-result-renderer.ts";
18
+ import { createMcpDirectToolCallRenderer, createMcpProxyToolCallRenderer, createMcpScriptToolCallRenderer, createMcpToolResultRenderer, resolveMcpToolRenderOptions } from "./tool-result-renderer.ts";
18
19
  import { toolErrorOverride } from "./error-signal.ts";
19
20
  import { createMcpRuntimeOwner, createOwnedUi, isAbortError, type McpRuntimeOwner } from "./runtime-owner.ts";
20
21
  import { publishMcpStatusShutdown } from "./mcp-status.ts";
21
22
  import { runMcpScript } from "./mcp-code.ts";
22
23
  import { cleanupMaterializedBinaryResources } from "./tool-registrar.ts";
24
+ import { syncNamespaceProxyTools } from "./namespace-tools.ts";
23
25
 
24
26
  export type { McpAdapterOptions } from "./types.ts";
25
27
  export type { ServerEntry } from "./types.ts";
28
+ export {
29
+ namespaceProxyName,
30
+ parseMcpReference,
31
+ resolveMcpToolReferences,
32
+ type McpReferenceResolution,
33
+ type ParsedMcpReference,
34
+ } from "./mcp-references.ts";
26
35
  export {
27
36
  MCP_STATUS_EVENT,
28
37
  MCP_STATUS_SNAPSHOT_VERSION,
@@ -37,14 +46,28 @@ export {
37
46
  } from "./types.ts";
38
47
 
39
48
  const INIT_WAIT_TIMEOUT_MS = 30_000;
49
+ const INIT_FAILURE_MESSAGE_MAX_CHARS = 1_000;
40
50
  const INIT_WAIT_TIMED_OUT: unique symbol = Symbol("init-wait-timed-out");
41
51
 
42
52
  export interface McpServerRegistration {
43
53
  dispose(): Promise<void>;
44
54
  }
45
55
 
46
- // Routes runtime registrations to the adapter installed for a specific Pi
47
- // instance, so a process with several adapters cannot cross-register.
56
+ export const MCP_RUNTIME_REGISTER_EVENT = "pi-mcp-adapter:runtime-register:v1" as const;
57
+ export const MCP_RUNTIME_REGISTER_VERSION = 1 as const;
58
+
59
+ export type McpRuntimeRegistrationResult =
60
+ | { ok: true; registration: McpServerRegistration }
61
+ | { ok: false; error: Error };
62
+
63
+ export interface McpRuntimeRegistrationRequest {
64
+ version: typeof MCP_RUNTIME_REGISTER_VERSION;
65
+ name: string;
66
+ definition: ServerEntry;
67
+ result?: McpRuntimeRegistrationResult;
68
+ }
69
+
70
+ // Fast path for callers that share the adapter's module and ExtensionAPI.
48
71
  const runtimeRegistrars = new WeakMap<ExtensionAPI, (name: string, definition: ServerEntry) => McpServerRegistration>();
49
72
 
50
73
  async function awaitWithTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T | typeof INIT_WAIT_TIMED_OUT> {
@@ -74,6 +97,18 @@ function optionalNumber(options: { minimum?: number; description: string }): TSc
74
97
  : ({ type: "number", ...options } as unknown as TSchema);
75
98
  }
76
99
 
100
+ function parseEnvDirectToolOverride(raw: string | undefined): string[] | undefined {
101
+ return raw?.split(",").map(s => s.trim()).filter(Boolean);
102
+ }
103
+
104
+ function resolveNamespaceEnvOverride(
105
+ raw: string | undefined,
106
+ selectors: string[] | undefined,
107
+ ): ReturnType<typeof parseDirectToolSelectors> | null {
108
+ if (raw === "__none__") return { servers: new Set<string>(), tools: new Map<string, Set<string>>() };
109
+ return selectors ? parseDirectToolSelectors(selectors) : null;
110
+ }
111
+
77
112
  function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
78
113
  const sessionConfig = options.config !== undefined ? cloneMcpConfig(options.config) : undefined;
79
114
  const programmaticConfig = sessionConfig !== undefined;
@@ -82,6 +117,41 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
82
117
  let currentOwner: McpRuntimeOwner | null = null;
83
118
  let currentOAuthRuntime: McpOAuthRuntime | null = null;
84
119
  let lifecycleGeneration = 0;
120
+ let retainedInitFailure: string | null = null;
121
+
122
+ function retainInitFailure(error: unknown): string {
123
+ const message = truncateAtWord(formatTerminalError(error), INIT_FAILURE_MESSAGE_MAX_CHARS);
124
+ retainedInitFailure = message;
125
+ return message;
126
+ }
127
+
128
+ function clearRetainedInitFailure(): void {
129
+ retainedInitFailure = null;
130
+ }
131
+
132
+ function buildInitRetryInstruction(prefix: string, failure: string | null = retainedInitFailure): string {
133
+ const retry = "Fix the MCP server configuration or startup failure, then call mcp(...) again to retry initialization.";
134
+ return failure ? `${prefix}: ${failure}. ${retry}` : `${prefix}. ${retry}`;
135
+ }
136
+
137
+ function isOwnerAbortError(error: unknown, owner: McpRuntimeOwner): boolean {
138
+ if (!owner.signal.aborted) return isAbortError(error);
139
+ const reason = owner.signal.reason;
140
+ if (reason instanceof Error && reason.message === "MCP initialization failed" && error !== reason) {
141
+ return isAbortError(error);
142
+ }
143
+ return true;
144
+ }
145
+
146
+ function startGatewayRetryInitialization(ctx: ExtensionContext): void {
147
+ const generation = ++lifecycleGeneration;
148
+ const owner = createMcpRuntimeOwner();
149
+ const oauthRuntime = createOAuthRuntime(owner.signal);
150
+ currentOwner = owner;
151
+ currentOAuthRuntime = oauthRuntime;
152
+ state = null;
153
+ startInitialization(ctx, owner, oauthRuntime, generation, "stale_gateway_retry_initialization");
154
+ }
85
155
 
86
156
  async function shutdownState(currentState: McpExtensionState | null, reason: string): Promise<void> {
87
157
  if (!currentState) {
@@ -130,8 +200,10 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
130
200
  : loadMcpConfig(earlyConfigPath);
131
201
  const earlyCache = loadMetadataCache();
132
202
  const envRaw = process.env.MCP_DIRECT_TOOLS;
133
- const envDirectToolOverride = envRaw?.split(",").map(s => s.trim()).filter(Boolean);
203
+ const envDirectToolOverride = parseEnvDirectToolOverride(envRaw);
204
+ const namespaceEnvOverride = resolveNamespaceEnvOverride(envRaw, envDirectToolOverride);
134
205
  const registeredDirectTools = new Map<string, string>();
206
+ const registeredNamespaceProxyTools = new Set<string>();
135
207
  const fallbackDeactivatedTools = new Set<string>();
136
208
  const toolRenderOptions = resolveMcpToolRenderOptions(earlyConfig.settings);
137
209
  const toolRenderShell = toolRenderOptions.resultRendering === "compact" ? "self" : "default";
@@ -175,13 +247,16 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
175
247
  });
176
248
  }
177
249
 
178
- function registerDirectTool(spec: DirectToolSpec): void {
250
+ function registerDirectTool(spec: DirectToolSpec, config: McpConfig): void {
179
251
  (pi.registerTool as (tool: unknown) => unknown)({
180
252
  name: spec.prefixedName,
181
253
  label: `MCP: ${spec.originalName}`,
182
254
  description: spec.description || "(no description)",
183
255
  promptSnippet: truncateAtWord(spec.description, 100) || `MCP tool from ${spec.serverName}`,
184
256
  parameters: toToolParameters(normalizeDirectToolInputSchema(spec.inputSchema)),
257
+ ...(config.settings?.strictDirectToolArguments === true
258
+ ? { prepareArguments: (args: unknown) => prepareDirectToolArguments(spec.inputSchema, args) }
259
+ : {}),
185
260
  execute: createDirectToolExecutor(() => state, () => initPromise, spec),
186
261
  renderShell: toolRenderShell,
187
262
  renderCall: createMcpDirectToolCallRenderer(spec.prefixedName, toolRenderOptions),
@@ -189,10 +264,16 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
189
264
  });
190
265
  }
191
266
 
192
- function resolveCurrentDirectTools(config: McpConfig, cache: MetadataCache | null): DirectToolSpec[] {
267
+ function activeFailureServers(): Set<string> {
268
+ const currentState = state;
269
+ if (!currentState) return new Set();
270
+ return new Set(Object.keys(currentState.config.mcpServers).filter((serverName) => isServerInActiveFailureBackoff(currentState, serverName)));
271
+ }
272
+
273
+ function resolveCurrentDirectTools(config: McpConfig, cache: MetadataCache | null, reservedNames?: Set<string>): DirectToolSpec[] {
193
274
  if (envRaw === "__none__") return [];
194
275
  const prefix = config.settings?.toolPrefix ?? "server";
195
- return resolveDirectTools(config, cache, prefix, envDirectToolOverride);
276
+ return resolveDirectTools(config, cache, prefix, envDirectToolOverride, activeFailureServers(), reservedNames);
196
277
  }
197
278
 
198
279
  function getActiveToolsIfReady(): string[] | undefined {
@@ -226,11 +307,14 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
226
307
 
227
308
  function syncDirectTools(config: McpConfig, cache: MetadataCache | null): {
228
309
  specs: DirectToolSpec[];
310
+ reservedDirectNames: Set<string>;
311
+ activeDirectNames: Set<string>;
229
312
  added: string[];
230
313
  updated: string[];
231
314
  deactivated: string[];
232
315
  } {
233
- const specs = resolveCurrentDirectTools(config, cache);
316
+ const reservedDirectNames = new Set<string>();
317
+ const specs = resolveCurrentDirectTools(config, cache, reservedDirectNames);
234
318
  const nextNames = new Set(specs.map((spec) => spec.prefixedName));
235
319
  const added: string[] = [];
236
320
  const updated: string[] = [];
@@ -240,7 +324,7 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
240
324
  const fingerprint = directToolFingerprint(spec);
241
325
  const previous = registeredDirectTools.get(spec.prefixedName);
242
326
  if (previous !== fingerprint) {
243
- registerDirectTool(spec);
327
+ registerDirectTool(spec, config);
244
328
  registeredDirectTools.set(spec.prefixedName, fingerprint);
245
329
  if (fallbackDeactivatedTools.delete(spec.prefixedName)) {
246
330
  const activeTools = getActiveToolsIfReady();
@@ -259,7 +343,7 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
259
343
  }
260
344
 
261
345
  deactivateTools(deactivated);
262
- return { specs, added, updated, deactivated };
346
+ return { specs, reservedDirectNames, activeDirectNames: nextNames, added, updated, deactivated };
263
347
  }
264
348
 
265
349
  function applyDirectToolConfigChanges(changes: Map<string, true | string[] | false>): void {
@@ -276,6 +360,7 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
276
360
  const cache = loadMetadataCache();
277
361
  const result = syncDirectTools(config, cache);
278
362
  syncProxyTool(config, cache, result.specs);
363
+ syncNamespaceTools(config, cache, result.reservedDirectNames, result.activeDirectNames);
279
364
  const changed = result.added.length + result.updated.length + result.deactivated.length;
280
365
  if (changed > 0 && ctx?.hasUI) {
281
366
  ctx.ui.notify(
@@ -285,6 +370,32 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
285
370
  }
286
371
  }
287
372
 
373
+ function syncNamespaceTools(
374
+ config: McpConfig,
375
+ cache: MetadataCache | null,
376
+ reservedDirectNames: Set<string> = new Set(registeredDirectTools.keys()),
377
+ activeDirectNames: Set<string> = new Set(registeredDirectTools.keys()),
378
+ ): void {
379
+ const result = syncNamespaceProxyTools({
380
+ config,
381
+ cache,
382
+ envOverride: namespaceEnvOverride,
383
+ existingDirectNames: reservedDirectNames,
384
+ activeDirectNames,
385
+ existingNamespaceNames: registeredNamespaceProxyTools,
386
+ unavailableServers: activeFailureServers(),
387
+ pi,
388
+ getState: () => state,
389
+ getInitPromise: () => initPromise,
390
+ getPiTools: () => pi.getAllTools(),
391
+ renderOptions: toolRenderOptions,
392
+ renderShell: toolRenderShell,
393
+ renderResult: renderMcpToolResult,
394
+ });
395
+ for (const name of result.added) registeredNamespaceProxyTools.add(name);
396
+ for (const name of result.deactivated) registeredNamespaceProxyTools.delete(name);
397
+ }
398
+
288
399
  const registeredPromptCommands = new Set<string>();
289
400
 
290
401
  function registerPromptCommands(specs: Iterable<PromptMetadata>): void {
@@ -304,7 +415,7 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
304
415
 
305
416
  registerPromptCommands(resolveCachedPrompts(earlyConfig));
306
417
 
307
- runtimeRegistrars.set(pi, (name: string, definition: ServerEntry): McpServerRegistration => {
418
+ const registerRuntimeServer = (name: string, definition: ServerEntry): McpServerRegistration => {
308
419
  if (typeof name !== "string" || name.trim() === "") {
309
420
  throw new Error("MCP server name must be a non-empty string");
310
421
  }
@@ -341,6 +452,21 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
341
452
  updateStatusBar(currentState);
342
453
  },
343
454
  };
455
+ };
456
+ runtimeRegistrars.set(pi, registerRuntimeServer);
457
+ pi.events.on(MCP_RUNTIME_REGISTER_EVENT, (rawRequest: unknown) => {
458
+ if (typeof rawRequest !== "object" || rawRequest === null || Array.isArray(rawRequest)) return;
459
+ const request = rawRequest as McpRuntimeRegistrationRequest;
460
+ if (request.result !== undefined) return;
461
+ if (request.version !== MCP_RUNTIME_REGISTER_VERSION) {
462
+ request.result = { ok: false, error: new Error(`Unsupported MCP runtime registration version: ${String(request.version)}`) };
463
+ return;
464
+ }
465
+ try {
466
+ request.result = { ok: true, registration: registerRuntimeServer(request.name, request.definition) };
467
+ } catch (error) {
468
+ request.result = { ok: false, error: error instanceof Error ? error : new Error(String(error)) };
469
+ }
344
470
  });
345
471
 
346
472
  const getPiTools = (): ToolInfo[] => pi.getAllTools();
@@ -374,6 +500,7 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
374
500
  }
375
501
 
376
502
  state = nextState;
503
+ clearRetainedInitFailure();
377
504
  for (const [name, definition] of runtimeServers) {
378
505
  if (Object.hasOwn(nextState.config.mcpServers, name)) {
379
506
  console.error(`MCP: runtime-registered server "${name}" now collides with a configured server; keeping the configured server`);
@@ -409,7 +536,8 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
409
536
  if (initPromise !== promise && initPromise !== null) {
410
537
  return;
411
538
  }
412
- console.error(`MCP initialization failed: ${formatTerminalError(err)}`);
539
+ const message = retainInitFailure(err);
540
+ console.error(`MCP initialization failed: ${message}`);
413
541
  initPromise = null;
414
542
  if (state) return;
415
543
 
@@ -459,6 +587,7 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
459
587
  currentOAuthRuntime = oauthRuntime;
460
588
  state = null;
461
589
  initPromise = null;
590
+ clearRetainedInitFailure();
462
591
 
463
592
  // Abort synchronously before awaiting cleanup so old callbacks and startup
464
593
  // work cannot resume into a stale ExtensionContext.
@@ -520,6 +649,7 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
520
649
  currentOAuthRuntime = null;
521
650
  state = null;
522
651
  initPromise = null;
652
+ clearRetainedInitFailure();
523
653
 
524
654
  // Abort before awaiting cleanup so delayed initialization cannot touch stale
525
655
  // Pi context after session shutdown.
@@ -786,6 +916,7 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
786
916
  code: Type.String({ description: "Trusted JavaScript MCP script. Use tools.<prefixedToolName>(args) and emit(value)." }),
787
917
  timeoutMs: optionalNumber({ minimum: 1, description: "Execution timeout in milliseconds (default: 30000)" }),
788
918
  }),
919
+ renderCall: createMcpScriptToolCallRenderer(toolRenderOptions),
789
920
  renderResult: renderMcpToolResult,
790
921
  async execute(_toolCallId: string, params: { code: string; timeoutMs?: number }, signal: AbortSignal | undefined) {
791
922
  const executeOwner = currentOwner;
@@ -801,7 +932,7 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
801
932
  executeOwner?.throwIfInactive();
802
933
  state = initialized;
803
934
  } catch (error) {
804
- if (executeOwner && isAbortError(error, executeOwner.signal)) throw error;
935
+ if (executeOwner && isOwnerAbortError(error, executeOwner)) throw error;
805
936
  const message = error instanceof Error ? error.message : String(error);
806
937
  return {
807
938
  content: [{ type: "text" as const, text: `MCP initialization failed: ${message}` }],
@@ -811,8 +942,10 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
811
942
  }
812
943
  if (!state) {
813
944
  return {
814
- content: [{ type: "text" as const, text: "MCP not initialized" }],
815
- details: { mode: "script", error: "not_initialized" },
945
+ content: [{ type: "text" as const, text: retainedInitFailure
946
+ ? buildInitRetryInstruction("MCP is not initialized after an earlier initialization failure")
947
+ : "MCP not initialized" }],
948
+ details: { mode: "script", error: "not_initialized", ...(retainedInitFailure ? { message: retainedInitFailure } : {}) },
816
949
  };
817
950
  }
818
951
  executeOwner?.throwIfInactive();
@@ -864,7 +997,7 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
864
997
  server?: string;
865
998
  action?: string;
866
999
  }, signal: AbortSignal | undefined, _onUpdate: AgentToolUpdateCallback<Record<string, unknown>> | undefined, _ctx: ExtensionContext) {
867
- const executeOwner = currentOwner;
1000
+ let executeOwner = currentOwner;
868
1001
  const parseArgs = (value: string | Record<string, unknown> | undefined): Record<string, unknown> | undefined => {
869
1002
  if (value === undefined || value === "") return undefined;
870
1003
  let args: unknown;
@@ -887,30 +1020,7 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
887
1020
  }
888
1021
  return args as Record<string, unknown>;
889
1022
  };
890
- const validateNestedGatewayParams = (value: Record<string, unknown>): typeof params => {
891
- for (const key of ["tool", "connect", "describe", "instructions", "search", "server", "action"] as const) {
892
- if (value[key] !== undefined && typeof value[key] !== "string") {
893
- throw new Error(`Invalid nested gateway param \`${key}\`: expected string, got ${Array.isArray(value[key]) ? "array" : typeof value[key]}`);
894
- }
895
- }
896
- for (const key of ["regex", "includeSchemas"] as const) {
897
- if (value[key] !== undefined && typeof value[key] !== "boolean") {
898
- throw new Error(`Invalid nested gateway param \`${key}\`: expected boolean, got ${Array.isArray(value[key]) ? "array" : typeof value[key]}`);
899
- }
900
- }
901
- for (const key of ["limit", "offset"] as const) {
902
- if (value[key] !== undefined && typeof value[key] !== "number") {
903
- throw new Error(`Invalid nested gateway param \`${key}\`: expected number, got ${Array.isArray(value[key]) ? "array" : typeof value[key]}`);
904
- }
905
- }
906
- const args = value.args;
907
- if (args !== undefined && typeof args !== "string" && (typeof args !== "object" || args === null || Array.isArray(args))) {
908
- throw new Error(`Invalid nested gateway param \`args\`: expected JSON object or JSON string, got ${Array.isArray(args) ? "array" : args === null ? "null" : typeof args}`);
909
- }
910
- return value as typeof params;
911
- };
912
- let parsedArgs = parseArgs(params.args);
913
- let dispatchParams = params;
1023
+ const parsedArgs = parseArgs(params.args);
914
1024
  const hasGatewayMode = (value: typeof params): boolean =>
915
1025
  value.tool !== undefined
916
1026
  || value.connect !== undefined
@@ -919,18 +1029,15 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
919
1029
  || value.search !== undefined
920
1030
  || value.server !== undefined
921
1031
  || value.action !== undefined;
922
- if (!hasGatewayMode(params) && parsedArgs) {
923
- const nestedParams = validateNestedGatewayParams(parsedArgs);
924
- if (hasGatewayMode(nestedParams)) {
925
- dispatchParams = nestedParams;
926
- parsedArgs = parseArgs(nestedParams.args);
927
- } else {
928
- throw new Error("Gateway params were nested inside `args`; pass them top-level (for example, mcp({ search: \"...\" }) or mcp({ tool: \"...\", args: {} })).");
929
- }
930
- } else if (!hasGatewayMode(params) && params.args !== undefined) {
1032
+ if (!hasGatewayMode(params) && params.args !== undefined) {
931
1033
  throw new Error("Gateway params were nested inside `args`; pass them top-level (for example, mcp({ search: \"...\" }) or mcp({ tool: \"...\", args: {} })).");
932
1034
  }
933
1035
 
1036
+ if (!state && !initPromise && retainedInitFailure) {
1037
+ startGatewayRetryInitialization(_ctx);
1038
+ executeOwner = currentOwner;
1039
+ }
1040
+
934
1041
  if (!state && initPromise) {
935
1042
  try {
936
1043
  const initialized = await awaitWithTimeout(initPromise, INIT_WAIT_TIMEOUT_MS);
@@ -943,38 +1050,40 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
943
1050
  executeOwner?.throwIfInactive();
944
1051
  state = initialized;
945
1052
  } catch (error) {
946
- if (executeOwner && isAbortError(error, executeOwner.signal)) throw error;
947
- const message = error instanceof Error ? error.message : String(error);
1053
+ if (executeOwner && isOwnerAbortError(error, executeOwner)) throw error;
1054
+ const message = retainInitFailure(error);
948
1055
  return {
949
- content: [{ type: "text" as const, text: `MCP initialization failed: ${message}` }],
1056
+ content: [{ type: "text" as const, text: buildInitRetryInstruction("MCP initialization failed", message) }],
950
1057
  details: { error: "init_failed", message },
951
1058
  };
952
1059
  }
953
1060
  }
954
1061
  if (!state) {
955
1062
  return {
956
- content: [{ type: "text" as const, text: "MCP not initialized" }],
957
- details: { error: "not_initialized" },
1063
+ content: [{ type: "text" as const, text: retainedInitFailure
1064
+ ? buildInitRetryInstruction("MCP is not initialized after an earlier initialization failure")
1065
+ : "MCP not initialized" }],
1066
+ details: { error: "not_initialized", ...(retainedInitFailure ? { message: retainedInitFailure } : {}) },
958
1067
  };
959
1068
  }
960
1069
  executeOwner?.throwIfInactive();
961
1070
 
962
- if (dispatchParams.action === "ui-messages") {
1071
+ if (params.action === "ui-messages") {
963
1072
  return executeUiMessages(state);
964
1073
  }
965
- if (dispatchParams.action === "auth-start") {
966
- if (!dispatchParams.server) {
1074
+ if (params.action === "auth-start") {
1075
+ if (!params.server) {
967
1076
  return {
968
1077
  content: [{ type: "text" as const, text: "auth-start requires `server`. Example: mcp({ action: \"auth-start\", server: \"linear-server\" })" }],
969
1078
  details: { mode: "auth-start", error: "missing_server" },
970
1079
  };
971
1080
  }
972
1081
  return signal
973
- ? executeAuthStart(state, dispatchParams.server, signal)
974
- : executeAuthStart(state, dispatchParams.server);
1082
+ ? executeAuthStart(state, params.server, signal)
1083
+ : executeAuthStart(state, params.server);
975
1084
  }
976
- if (dispatchParams.action === "auth-complete") {
977
- if (!dispatchParams.server) {
1085
+ if (params.action === "auth-complete") {
1086
+ if (!params.server) {
978
1087
  return {
979
1088
  content: [{ type: "text" as const, text: "auth-complete requires `server`." }],
980
1089
  details: { mode: "auth-complete", error: "missing_server" },
@@ -988,28 +1097,28 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
988
1097
  };
989
1098
  }
990
1099
  return signal
991
- ? executeAuthComplete(state, dispatchParams.server, input, signal)
992
- : executeAuthComplete(state, dispatchParams.server, input);
1100
+ ? executeAuthComplete(state, params.server, input, signal)
1101
+ : executeAuthComplete(state, params.server, input);
993
1102
  }
994
- if (dispatchParams.tool) {
995
- return executeCall(state, dispatchParams.tool, parsedArgs, dispatchParams.server, getPiTools, signal);
1103
+ if (params.tool) {
1104
+ return executeCall(state, params.tool, parsedArgs, params.server, getPiTools, signal);
996
1105
  }
997
- if (dispatchParams.connect) {
998
- const result = await executeConnect(state, dispatchParams.connect, signal);
1106
+ if (params.connect) {
1107
+ const result = await executeConnect(state, params.connect, signal);
999
1108
  syncToolSurface(_ctx as ExtensionContext);
1000
1109
  return result;
1001
1110
  }
1002
- if (dispatchParams.describe) {
1003
- return executeDescribe(state, dispatchParams.describe);
1111
+ if (params.describe) {
1112
+ return executeDescribe(state, params.describe);
1004
1113
  }
1005
- if (dispatchParams.instructions) {
1006
- return executeInstructions(state, dispatchParams.instructions);
1114
+ if (params.instructions) {
1115
+ return executeInstructions(state, params.instructions);
1007
1116
  }
1008
- if (dispatchParams.search !== undefined) {
1009
- return executeSearch(state, dispatchParams.search, dispatchParams.regex, dispatchParams.server, dispatchParams.includeSchemas, dispatchParams.limit, dispatchParams.offset);
1117
+ if (params.search !== undefined) {
1118
+ return executeSearch(state, params.search, params.regex, params.server, params.includeSchemas, params.limit, params.offset);
1010
1119
  }
1011
- if (dispatchParams.server) {
1012
- return executeList(state, dispatchParams.server);
1120
+ if (params.server) {
1121
+ return executeList(state, params.server);
1013
1122
  }
1014
1123
  return executeStatus(state);
1015
1124
  },
@@ -1030,7 +1139,7 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
1030
1139
  || missingConfiguredDirectToolServers.length > 0;
1031
1140
 
1032
1141
  if (shouldRegisterProxyTool) {
1033
- const description = buildProxyDescription(config, cache, directSpecs);
1142
+ const description = buildProxyDescription(config);
1034
1143
  if (!proxyToolRegistered || proxyToolDescription !== description) {
1035
1144
  registerProxyTool(description);
1036
1145
  return;
@@ -1051,8 +1160,13 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
1051
1160
  }
1052
1161
  }
1053
1162
 
1054
- const initialDirectTools = syncDirectTools(earlyConfig, earlyCache).specs;
1055
- syncProxyTool(earlyConfig, earlyCache, initialDirectTools);
1163
+ const initialDirectResult = syncDirectTools(earlyConfig, earlyCache);
1164
+ syncProxyTool(earlyConfig, earlyCache, initialDirectResult.specs);
1165
+ // Register namespace-proxy tools eagerly so tool-groups/slow-mode can validate
1166
+ // `mcp:<server>` references on the first session_start turn. Without this
1167
+ // eager call, the tool-groups expansion runs before MCP initialization
1168
+ // completes and emits false `[unknown-tool] mcp__<server>` diagnostics.
1169
+ syncNamespaceTools(earlyConfig, earlyCache, initialDirectResult.reservedDirectNames, initialDirectResult.activeDirectNames);
1056
1170
  startLoadTimeInitialization();
1057
1171
  }
1058
1172
 
@@ -1076,10 +1190,18 @@ export function createMcpAdapter(options: McpAdapterOptions = {}) {
1076
1190
  export function registerMcpServer(options: { pi: ExtensionAPI; name: string; definition: ServerEntry }): McpServerRegistration {
1077
1191
  const { pi, name, definition } = options;
1078
1192
  const register = runtimeRegistrars.get(pi);
1079
- if (!register) {
1193
+ if (register) return register(name, definition);
1194
+ const request: McpRuntimeRegistrationRequest = {
1195
+ version: MCP_RUNTIME_REGISTER_VERSION,
1196
+ name,
1197
+ definition,
1198
+ };
1199
+ pi.events.emit(MCP_RUNTIME_REGISTER_EVENT, request);
1200
+ if (!request.result) {
1080
1201
  throw new Error("pi-mcp-adapter is not installed for this Pi instance");
1081
1202
  }
1082
- return register(name, definition);
1203
+ if (!request.result.ok) throw request.result.error;
1204
+ return request.result.registration;
1083
1205
  }
1084
1206
 
1085
1207
  export default createMcpAdapter();