@herbertgao/pi-extensions 2026.8.1 → 2026.8.3

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 (403) hide show
  1. package/README.md +13 -3
  2. package/node_modules/@czottmann/pi-automode/README.md +16 -2
  3. package/node_modules/@czottmann/pi-automode/docs/GLOSSARY.md +35 -0
  4. package/node_modules/@czottmann/pi-automode/docs/automode-classifier-flow.md +18 -9
  5. package/node_modules/@czottmann/pi-automode/docs/defaults.md +6 -2
  6. package/node_modules/@czottmann/pi-automode/examples/automode.local.json +6 -0
  7. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/classifier.ts +11 -7
  8. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/config.ts +100 -0
  9. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/constants.ts +32 -0
  10. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/extension.ts +78 -3
  11. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/hard-deny.ts +16 -4
  12. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/paths.ts +23 -1
  13. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/permissions.ts +22 -1
  14. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/types.ts +18 -2
  15. package/node_modules/@czottmann/pi-automode/package.json +4 -4
  16. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-audit.md +5 -0
  17. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-debt.md +5 -0
  18. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-gain.md +5 -0
  19. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-help.md +5 -0
  20. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-review.md +5 -0
  21. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail.md +5 -0
  22. package/node_modules/@dietrichgebert/ponytail/.opencode/plugins/ponytail-frontmatter.cjs +23 -0
  23. package/node_modules/@dietrichgebert/ponytail/.opencode/plugins/ponytail.mjs +99 -0
  24. package/node_modules/@dietrichgebert/ponytail/.qoder/rules/ponytail.md +30 -0
  25. package/node_modules/@dietrichgebert/ponytail/.qoder-plugin/plugin.json +16 -0
  26. package/node_modules/@dietrichgebert/ponytail/AGENTS.md +32 -0
  27. package/node_modules/@dietrichgebert/ponytail/LICENSE +21 -0
  28. package/node_modules/@dietrichgebert/ponytail/README.es.md +298 -0
  29. package/node_modules/@dietrichgebert/ponytail/README.ko.md +315 -0
  30. package/node_modules/@dietrichgebert/ponytail/README.md +351 -0
  31. package/node_modules/@dietrichgebert/ponytail/assets/benchmark-3model.svg +21 -0
  32. package/node_modules/@dietrichgebert/ponytail/assets/benchmark-agentic.svg +62 -0
  33. package/node_modules/@dietrichgebert/ponytail/assets/logo-dark.png +0 -0
  34. package/node_modules/@dietrichgebert/ponytail/assets/logo-dark.svg +115 -0
  35. package/node_modules/@dietrichgebert/ponytail/assets/logo-greenpt-dark.svg +27 -0
  36. package/node_modules/@dietrichgebert/ponytail/assets/logo-greenpt.svg +27 -0
  37. package/node_modules/@dietrichgebert/ponytail/assets/logo.png +0 -0
  38. package/node_modules/@dietrichgebert/ponytail/assets/social-preview.png +0 -0
  39. package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner-es.png +0 -0
  40. package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner-ko.png +0 -0
  41. package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner.png +0 -0
  42. package/node_modules/@dietrichgebert/ponytail/hooks/claude-codex-hooks.json +44 -0
  43. package/node_modules/@dietrichgebert/ponytail/hooks/copilot-hooks.json +21 -0
  44. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-activate.js +96 -0
  45. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-config.js +169 -0
  46. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-instructions.js +98 -0
  47. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-mode-tracker.js +130 -0
  48. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-runtime.js +85 -0
  49. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-statusline.ps1 +24 -0
  50. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-statusline.sh +18 -0
  51. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-subagent.js +77 -0
  52. package/node_modules/@dietrichgebert/ponytail/hooks/qoder-hooks.json +26 -0
  53. package/node_modules/@dietrichgebert/ponytail/package.json +47 -0
  54. package/node_modules/@dietrichgebert/ponytail/pi-extension/index.js +211 -0
  55. package/node_modules/@dietrichgebert/ponytail/pi-extension/package.json +8 -0
  56. package/node_modules/@dietrichgebert/ponytail/scripts/uninstall.js +60 -0
  57. package/node_modules/@dietrichgebert/ponytail/skills/ponytail/SKILL.md +120 -0
  58. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-audit/SKILL.md +41 -0
  59. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-debt/SKILL.md +44 -0
  60. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-gain/SKILL.md +50 -0
  61. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-help/SKILL.md +71 -0
  62. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-review/SKILL.md +57 -0
  63. package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +6 -10
  64. package/node_modules/@herbertgao/pi-cc-extensions/README.md +5 -9
  65. package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/hero.en.svg +101 -0
  66. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +1 -17
  67. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +15 -9
  68. package/node_modules/@herbertgao/pi-cc-extensions/extensions/{utils/agent-summary.ts → feature/agent-summary/core.ts} +37 -35
  69. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{agent-summary.ts → agent-summary/index.ts} +3 -3
  70. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +24 -83
  71. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/context.ts +1 -1
  72. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{session-reference.ts → reference/index.ts} +1 -1
  73. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{agent-autocomplete.ts → reference/subagent.ts} +19 -9
  74. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{pi-startup-header.ts → shell/startup-header.ts} +1 -1
  75. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{working-message.ts → shell/working-message.ts} +5 -2
  76. package/node_modules/@herbertgao/pi-cc-extensions/extensions/index.ts +32 -28
  77. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +452 -94
  78. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +727 -0
  79. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/index.ts +66 -776
  80. package/node_modules/@herbertgao/pi-cc-extensions/extensions/{feature → renderer}/markdown-enhance.ts +134 -11
  81. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/hover.ts +130 -0
  82. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{mouse-interaction.ts → mouse/interaction.ts} +90 -568
  83. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/layout.ts +144 -0
  84. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/packets.ts +143 -0
  85. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/scroll.ts +195 -0
  86. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/ansi-utils.ts +56 -1
  87. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/diff-renderer.ts +4 -4
  88. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/line-width-safety.ts +1 -1
  89. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/write-display-utils.ts +12 -0
  90. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/write-execution.ts +1 -2
  91. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-grouping.ts → tool/grouping.ts} +27 -10
  92. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-result.ts → tool/result.ts} +4 -13
  93. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/transcript-refresh.ts +91 -0
  94. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/fullscreen-detect.ts +0 -27
  95. package/node_modules/@herbertgao/pi-cc-extensions/package.json +3 -3
  96. package/node_modules/@herbertgao/pi-cc-extensions/themes/cc-dark.json +1 -0
  97. package/node_modules/@herbertgao/pi-cc-extensions/themes/cc-light.json +2 -2
  98. package/node_modules/@herbertgao/pi-stash/README.md +9 -9
  99. package/node_modules/@herbertgao/pi-stash/package.json +1 -1
  100. package/node_modules/@herbertgao/pi-stash/src/index.ts +2 -1
  101. package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +20 -0
  102. package/node_modules/@herbertgao/pi-subagents/README.md +6 -2
  103. package/node_modules/@herbertgao/pi-subagents/package.json +3 -3
  104. package/node_modules/@herbertgao/pi-subagents/src/agent-manager.ts +1 -0
  105. package/node_modules/@herbertgao/pi-subagents/src/agent-runner.ts +3 -1
  106. package/node_modules/@herbertgao/pi-subagents/src/custom-agents.ts +85 -11
  107. package/node_modules/@herbertgao/pi-subagents/src/index.ts +61 -39
  108. package/node_modules/@herbertgao/pi-subagents/src/nested-tools.ts +26 -35
  109. package/node_modules/@herbertgao/pi-subagents/src/prompts.ts +15 -1
  110. package/node_modules/@herbertgao/pi-subagents/src/settings.ts +12 -0
  111. package/node_modules/@herbertgao/pi-subagents/src/types.ts +2 -0
  112. package/node_modules/@narumitw/pi-btw/LICENSE +21 -0
  113. package/node_modules/@narumitw/pi-btw/README.md +210 -0
  114. package/node_modules/@narumitw/pi-btw/package.json +53 -0
  115. package/node_modules/@narumitw/pi-btw/src/bring-to-main.ts +632 -0
  116. package/node_modules/@narumitw/pi-btw/src/btw.ts +996 -0
  117. package/node_modules/@narumitw/pi-btw/src/fullscreen-ui.ts +339 -0
  118. package/node_modules/@narumitw/pi-btw/src/index.ts +1 -0
  119. package/node_modules/@narumitw/pi-btw/src/menu.ts +296 -0
  120. package/node_modules/@narumitw/pi-btw/src/settings.ts +237 -0
  121. package/node_modules/@narumitw/pi-btw/src/side-thread.ts +238 -0
  122. package/node_modules/@narumitw/pi-btw/src/text.ts +10 -0
  123. package/node_modules/@narumitw/pi-btw/src/transcript-pager.ts +620 -0
  124. package/node_modules/@pi-plugins/fast-mode/LICENSE +21 -0
  125. package/node_modules/@pi-plugins/fast-mode/README.md +92 -0
  126. package/node_modules/@pi-plugins/fast-mode/dist/index.d.mts +6 -0
  127. package/node_modules/@pi-plugins/fast-mode/dist/index.d.mts.map +1 -0
  128. package/node_modules/@pi-plugins/fast-mode/dist/index.mjs +2026 -0
  129. package/node_modules/@pi-plugins/fast-mode/dist/index.mjs.map +1 -0
  130. package/node_modules/@pi-plugins/fast-mode/package.json +73 -0
  131. package/node_modules/pi-mcp-adapter/CHANGELOG.md +78 -0
  132. package/node_modules/pi-mcp-adapter/README.md +80 -16
  133. package/node_modules/pi-mcp-adapter/agent-dir.ts +40 -0
  134. package/node_modules/pi-mcp-adapter/agent-plugin-loader.ts +377 -0
  135. package/node_modules/pi-mcp-adapter/commands.ts +21 -9
  136. package/node_modules/pi-mcp-adapter/config.ts +110 -49
  137. package/node_modules/pi-mcp-adapter/direct-tools.ts +40 -27
  138. package/node_modules/pi-mcp-adapter/elicitation-handler.ts +37 -36
  139. package/node_modules/pi-mcp-adapter/errors.ts +21 -17
  140. package/node_modules/pi-mcp-adapter/host-html-template.ts +13 -7
  141. package/node_modules/pi-mcp-adapter/index.ts +52 -17
  142. package/node_modules/pi-mcp-adapter/init.ts +9 -7
  143. package/node_modules/pi-mcp-adapter/json-schema-validator.ts +2 -2
  144. package/node_modules/pi-mcp-adapter/lifecycle.ts +8 -8
  145. package/node_modules/pi-mcp-adapter/logger.ts +1 -1
  146. package/node_modules/pi-mcp-adapter/mcp-auth-flow.ts +122 -25
  147. package/node_modules/pi-mcp-adapter/mcp-auth.ts +120 -2
  148. package/node_modules/pi-mcp-adapter/mcp-callback-server.ts +138 -61
  149. package/node_modules/pi-mcp-adapter/mcp-code.ts +13 -11
  150. package/node_modules/pi-mcp-adapter/mcp-oauth-provider.ts +62 -17
  151. package/node_modules/pi-mcp-adapter/mcp-output-guard.ts +15 -11
  152. package/node_modules/pi-mcp-adapter/mcp-panel.ts +34 -15
  153. package/node_modules/pi-mcp-adapter/mcp-probe.ts +131 -34
  154. package/node_modules/pi-mcp-adapter/mcp-script-worker.mjs +2 -2
  155. package/node_modules/pi-mcp-adapter/mcp-setup-panel.ts +7 -4
  156. package/node_modules/pi-mcp-adapter/mcp-trace.ts +59 -64
  157. package/node_modules/pi-mcp-adapter/metadata-cache.ts +34 -26
  158. package/node_modules/pi-mcp-adapter/npx-resolver.ts +6 -4
  159. package/node_modules/pi-mcp-adapter/oauth-handler.ts +1 -1
  160. package/node_modules/pi-mcp-adapter/oauth.ts +48 -0
  161. package/node_modules/pi-mcp-adapter/onboarding-state.ts +19 -11
  162. package/node_modules/pi-mcp-adapter/package.json +20 -9
  163. package/node_modules/pi-mcp-adapter/panel-keys.ts +20 -4
  164. package/node_modules/pi-mcp-adapter/prompts.ts +2 -2
  165. package/node_modules/pi-mcp-adapter/proxy-modes.ts +56 -21
  166. package/node_modules/pi-mcp-adapter/sampling-handler.ts +22 -15
  167. package/node_modules/pi-mcp-adapter/search-ranking.ts +2 -1
  168. package/node_modules/pi-mcp-adapter/server-manager.ts +165 -113
  169. package/node_modules/pi-mcp-adapter/session-recovery.ts +11 -12
  170. package/node_modules/pi-mcp-adapter/skills/mcp-scripting/SKILL.md +3 -3
  171. package/node_modules/pi-mcp-adapter/state.ts +3 -1
  172. package/node_modules/pi-mcp-adapter/tool-approval.ts +67 -4
  173. package/node_modules/pi-mcp-adapter/tool-metadata.ts +6 -5
  174. package/node_modules/pi-mcp-adapter/tool-registrar.ts +187 -3
  175. package/node_modules/pi-mcp-adapter/tool-result-renderer.ts +14 -2
  176. package/node_modules/pi-mcp-adapter/ts-shape.ts +9 -2
  177. package/node_modules/pi-mcp-adapter/types.ts +111 -22
  178. package/node_modules/pi-mcp-adapter/ui-app-bridge-helpers.ts +40 -0
  179. package/node_modules/pi-mcp-adapter/ui-resource-handler.ts +28 -19
  180. package/node_modules/pi-mcp-adapter/ui-server.ts +90 -58
  181. package/node_modules/pi-mcp-adapter/ui-session.ts +16 -14
  182. package/node_modules/pi-mcp-adapter/unix-socket-transport.ts +4 -4
  183. package/node_modules/pi-mcp-adapter/utils.ts +23 -9
  184. package/node_modules/pi-web-access/CHANGELOG.md +45 -0
  185. package/node_modules/pi-web-access/README.md +104 -29
  186. package/node_modules/pi-web-access/bocha.ts +221 -0
  187. package/node_modules/pi-web-access/curator-page.ts +113 -12
  188. package/node_modules/pi-web-access/curator-server.ts +56 -20
  189. package/node_modules/pi-web-access/datalab-pdf-extract.ts +568 -0
  190. package/node_modules/pi-web-access/duckduckgo.ts +123 -0
  191. package/node_modules/pi-web-access/extract.ts +288 -143
  192. package/node_modules/pi-web-access/feature-config.ts +29 -0
  193. package/node_modules/pi-web-access/gemini-api.ts +4 -0
  194. package/node_modules/pi-web-access/gemini-search.ts +45 -12
  195. package/node_modules/pi-web-access/gemini-web.ts +68 -3
  196. package/node_modules/pi-web-access/index.ts +160 -71
  197. package/node_modules/pi-web-access/jina-search.ts +284 -0
  198. package/node_modules/pi-web-access/kagi.ts +12 -12
  199. package/node_modules/pi-web-access/openai-search.ts +12 -2
  200. package/node_modules/pi-web-access/package.json +4 -3
  201. package/node_modules/pi-web-access/pdf-extract.ts +327 -228
  202. package/node_modules/pi-web-access/storage.ts +440 -2
  203. package/node_modules/pi-web-access/summary-model-scope.ts +1 -1
  204. package/node_modules/pi-web-access/summary-review.ts +4 -2
  205. package/node_modules/pi-web-access/video-extract.ts +10 -8
  206. package/node_modules/pi-web-access/xai-search.ts +12 -2
  207. package/node_modules/pi-web-access/youtube-extract.ts +2 -1
  208. package/node_modules/remote-pi/LICENSE +21 -0
  209. package/node_modules/remote-pi/README.md +675 -0
  210. package/node_modules/remote-pi/dist/actions/handlers.d.ts +122 -0
  211. package/node_modules/remote-pi/dist/actions/handlers.js +160 -0
  212. package/node_modules/remote-pi/dist/actions/handlers.js.map +1 -0
  213. package/node_modules/remote-pi/dist/actions/registry.d.ts +39 -0
  214. package/node_modules/remote-pi/dist/actions/registry.js +58 -0
  215. package/node_modules/remote-pi/dist/actions/registry.js.map +1 -0
  216. package/node_modules/remote-pi/dist/bin/supervisord.d.ts +2 -0
  217. package/node_modules/remote-pi/dist/bin/supervisord.js +86 -0
  218. package/node_modules/remote-pi/dist/bin/supervisord.js.map +1 -0
  219. package/node_modules/remote-pi/dist/commands/builtin_mirror.d.ts +58 -0
  220. package/node_modules/remote-pi/dist/commands/builtin_mirror.js +71 -0
  221. package/node_modules/remote-pi/dist/commands/builtin_mirror.js.map +1 -0
  222. package/node_modules/remote-pi/dist/commands/list_commands.d.ts +60 -0
  223. package/node_modules/remote-pi/dist/commands/list_commands.js +73 -0
  224. package/node_modules/remote-pi/dist/commands/list_commands.js.map +1 -0
  225. package/node_modules/remote-pi/dist/config.d.ts +62 -0
  226. package/node_modules/remote-pi/dist/config.js +115 -0
  227. package/node_modules/remote-pi/dist/config.js.map +1 -0
  228. package/node_modules/remote-pi/dist/daemon/client.d.ts +20 -0
  229. package/node_modules/remote-pi/dist/daemon/client.js +131 -0
  230. package/node_modules/remote-pi/dist/daemon/client.js.map +1 -0
  231. package/node_modules/remote-pi/dist/daemon/control_protocol.d.ts +176 -0
  232. package/node_modules/remote-pi/dist/daemon/control_protocol.js +63 -0
  233. package/node_modules/remote-pi/dist/daemon/control_protocol.js.map +1 -0
  234. package/node_modules/remote-pi/dist/daemon/cron_log.d.ts +45 -0
  235. package/node_modules/remote-pi/dist/daemon/cron_log.js +72 -0
  236. package/node_modules/remote-pi/dist/daemon/cron_log.js.map +1 -0
  237. package/node_modules/remote-pi/dist/daemon/cron_registry.d.ts +80 -0
  238. package/node_modules/remote-pi/dist/daemon/cron_registry.js +194 -0
  239. package/node_modules/remote-pi/dist/daemon/cron_registry.js.map +1 -0
  240. package/node_modules/remote-pi/dist/daemon/id.d.ts +24 -0
  241. package/node_modules/remote-pi/dist/daemon/id.js +36 -0
  242. package/node_modules/remote-pi/dist/daemon/id.js.map +1 -0
  243. package/node_modules/remote-pi/dist/daemon/install.d.ts +170 -0
  244. package/node_modules/remote-pi/dist/daemon/install.js +547 -0
  245. package/node_modules/remote-pi/dist/daemon/install.js.map +1 -0
  246. package/node_modules/remote-pi/dist/daemon/registry.d.ts +63 -0
  247. package/node_modules/remote-pi/dist/daemon/registry.js +153 -0
  248. package/node_modules/remote-pi/dist/daemon/registry.js.map +1 -0
  249. package/node_modules/remote-pi/dist/daemon/rpc_child.d.ts +194 -0
  250. package/node_modules/remote-pi/dist/daemon/rpc_child.js +389 -0
  251. package/node_modules/remote-pi/dist/daemon/rpc_child.js.map +1 -0
  252. package/node_modules/remote-pi/dist/daemon/supervisor.d.ts +93 -0
  253. package/node_modules/remote-pi/dist/daemon/supervisor.js +596 -0
  254. package/node_modules/remote-pi/dist/daemon/supervisor.js.map +1 -0
  255. package/node_modules/remote-pi/dist/extension_ui_bridge.d.ts +26 -0
  256. package/node_modules/remote-pi/dist/extension_ui_bridge.js +341 -0
  257. package/node_modules/remote-pi/dist/extension_ui_bridge.js.map +1 -0
  258. package/node_modules/remote-pi/dist/index.d.ts +213 -0
  259. package/node_modules/remote-pi/dist/index.js +4996 -0
  260. package/node_modules/remote-pi/dist/index.js.map +1 -0
  261. package/node_modules/remote-pi/dist/mcp/mesh_result.d.ts +10 -0
  262. package/node_modules/remote-pi/dist/mcp/mesh_result.js +42 -0
  263. package/node_modules/remote-pi/dist/mcp/mesh_result.js.map +1 -0
  264. package/node_modules/remote-pi/dist/mcp/mesh_server.d.ts +16 -0
  265. package/node_modules/remote-pi/dist/mcp/mesh_server.js +327 -0
  266. package/node_modules/remote-pi/dist/mcp/mesh_server.js.map +1 -0
  267. package/node_modules/remote-pi/dist/mesh/canonical.d.ts +30 -0
  268. package/node_modules/remote-pi/dist/mesh/canonical.js +61 -0
  269. package/node_modules/remote-pi/dist/mesh/canonical.js.map +1 -0
  270. package/node_modules/remote-pi/dist/mesh/client.d.ts +18 -0
  271. package/node_modules/remote-pi/dist/mesh/client.js +125 -0
  272. package/node_modules/remote-pi/dist/mesh/client.js.map +1 -0
  273. package/node_modules/remote-pi/dist/mesh/encoding.d.ts +38 -0
  274. package/node_modules/remote-pi/dist/mesh/encoding.js +216 -0
  275. package/node_modules/remote-pi/dist/mesh/encoding.js.map +1 -0
  276. package/node_modules/remote-pi/dist/mesh/self_revoke.d.ts +73 -0
  277. package/node_modules/remote-pi/dist/mesh/self_revoke.js +401 -0
  278. package/node_modules/remote-pi/dist/mesh/self_revoke.js.map +1 -0
  279. package/node_modules/remote-pi/dist/mesh/siblings.d.ts +49 -0
  280. package/node_modules/remote-pi/dist/mesh/siblings.js +159 -0
  281. package/node_modules/remote-pi/dist/mesh/siblings.js.map +1 -0
  282. package/node_modules/remote-pi/dist/mesh/types.d.ts +34 -0
  283. package/node_modules/remote-pi/dist/mesh/types.js +11 -0
  284. package/node_modules/remote-pi/dist/mesh/types.js.map +1 -0
  285. package/node_modules/remote-pi/dist/mesh/verify.d.ts +17 -0
  286. package/node_modules/remote-pi/dist/mesh/verify.js +86 -0
  287. package/node_modules/remote-pi/dist/mesh/verify.js.map +1 -0
  288. package/node_modules/remote-pi/dist/pairing/crypto.d.ts +8 -0
  289. package/node_modules/remote-pi/dist/pairing/crypto.js +22 -0
  290. package/node_modules/remote-pi/dist/pairing/crypto.js.map +1 -0
  291. package/node_modules/remote-pi/dist/pairing/handshake.d.ts +28 -0
  292. package/node_modules/remote-pi/dist/pairing/handshake.js +113 -0
  293. package/node_modules/remote-pi/dist/pairing/handshake.js.map +1 -0
  294. package/node_modules/remote-pi/dist/pairing/noise-sha256.d.ts +16 -0
  295. package/node_modules/remote-pi/dist/pairing/noise-sha256.js +103 -0
  296. package/node_modules/remote-pi/dist/pairing/noise-sha256.js.map +1 -0
  297. package/node_modules/remote-pi/dist/pairing/qr.d.ts +59 -0
  298. package/node_modules/remote-pi/dist/pairing/qr.js +125 -0
  299. package/node_modules/remote-pi/dist/pairing/qr.js.map +1 -0
  300. package/node_modules/remote-pi/dist/pairing/storage.d.ts +120 -0
  301. package/node_modules/remote-pi/dist/pairing/storage.js +604 -0
  302. package/node_modules/remote-pi/dist/pairing/storage.js.map +1 -0
  303. package/node_modules/remote-pi/dist/protocol/codec.d.ts +7 -0
  304. package/node_modules/remote-pi/dist/protocol/codec.js +49 -0
  305. package/node_modules/remote-pi/dist/protocol/codec.js.map +1 -0
  306. package/node_modules/remote-pi/dist/protocol/types.d.ts +393 -0
  307. package/node_modules/remote-pi/dist/protocol/types.js +2 -0
  308. package/node_modules/remote-pi/dist/protocol/types.js.map +1 -0
  309. package/node_modules/remote-pi/dist/rooms.d.ts +29 -0
  310. package/node_modules/remote-pi/dist/rooms.js +57 -0
  311. package/node_modules/remote-pi/dist/rooms.js.map +1 -0
  312. package/node_modules/remote-pi/dist/session/address.d.ts +49 -0
  313. package/node_modules/remote-pi/dist/session/address.js +58 -0
  314. package/node_modules/remote-pi/dist/session/address.js.map +1 -0
  315. package/node_modules/remote-pi/dist/session/agent_bridge.d.ts +55 -0
  316. package/node_modules/remote-pi/dist/session/agent_bridge.js +146 -0
  317. package/node_modules/remote-pi/dist/session/agent_bridge.js.map +1 -0
  318. package/node_modules/remote-pi/dist/session/bridge.d.ts +37 -0
  319. package/node_modules/remote-pi/dist/session/bridge.js +130 -0
  320. package/node_modules/remote-pi/dist/session/bridge.js.map +1 -0
  321. package/node_modules/remote-pi/dist/session/broker.d.ts +189 -0
  322. package/node_modules/remote-pi/dist/session/broker.js +507 -0
  323. package/node_modules/remote-pi/dist/session/broker.js.map +1 -0
  324. package/node_modules/remote-pi/dist/session/broker_remote.d.ts +74 -0
  325. package/node_modules/remote-pi/dist/session/broker_remote.js +583 -0
  326. package/node_modules/remote-pi/dist/session/broker_remote.js.map +1 -0
  327. package/node_modules/remote-pi/dist/session/cwd_lock.d.ts +33 -0
  328. package/node_modules/remote-pi/dist/session/cwd_lock.js +126 -0
  329. package/node_modules/remote-pi/dist/session/cwd_lock.js.map +1 -0
  330. package/node_modules/remote-pi/dist/session/envelope.d.ts +33 -0
  331. package/node_modules/remote-pi/dist/session/envelope.js +117 -0
  332. package/node_modules/remote-pi/dist/session/envelope.js.map +1 -0
  333. package/node_modules/remote-pi/dist/session/global_config.d.ts +33 -0
  334. package/node_modules/remote-pi/dist/session/global_config.js +73 -0
  335. package/node_modules/remote-pi/dist/session/global_config.js.map +1 -0
  336. package/node_modules/remote-pi/dist/session/ipc.d.ts +27 -0
  337. package/node_modules/remote-pi/dist/session/ipc.js +22 -0
  338. package/node_modules/remote-pi/dist/session/ipc.js.map +1 -0
  339. package/node_modules/remote-pi/dist/session/leader_election.d.ts +32 -0
  340. package/node_modules/remote-pi/dist/session/leader_election.js +106 -0
  341. package/node_modules/remote-pi/dist/session/leader_election.js.map +1 -0
  342. package/node_modules/remote-pi/dist/session/local_config.d.ts +55 -0
  343. package/node_modules/remote-pi/dist/session/local_config.js +157 -0
  344. package/node_modules/remote-pi/dist/session/local_config.js.map +1 -0
  345. package/node_modules/remote-pi/dist/session/mesh_message.d.ts +20 -0
  346. package/node_modules/remote-pi/dist/session/mesh_message.js +28 -0
  347. package/node_modules/remote-pi/dist/session/mesh_message.js.map +1 -0
  348. package/node_modules/remote-pi/dist/session/mesh_node.d.ts +116 -0
  349. package/node_modules/remote-pi/dist/session/mesh_node.js +573 -0
  350. package/node_modules/remote-pi/dist/session/mesh_node.js.map +1 -0
  351. package/node_modules/remote-pi/dist/session/peer.d.ts +139 -0
  352. package/node_modules/remote-pi/dist/session/peer.js +451 -0
  353. package/node_modules/remote-pi/dist/session/peer.js.map +1 -0
  354. package/node_modules/remote-pi/dist/session/peer_inventory.d.ts +13 -0
  355. package/node_modules/remote-pi/dist/session/peer_inventory.js +48 -0
  356. package/node_modules/remote-pi/dist/session/peer_inventory.js.map +1 -0
  357. package/node_modules/remote-pi/dist/session/peer_limits.d.ts +9 -0
  358. package/node_modules/remote-pi/dist/session/peer_limits.js +21 -0
  359. package/node_modules/remote-pi/dist/session/peer_limits.js.map +1 -0
  360. package/node_modules/remote-pi/dist/session/setup_wizard.d.ts +39 -0
  361. package/node_modules/remote-pi/dist/session/setup_wizard.js +63 -0
  362. package/node_modules/remote-pi/dist/session/setup_wizard.js.map +1 -0
  363. package/node_modules/remote-pi/dist/session/tool_gate.d.ts +5 -0
  364. package/node_modules/remote-pi/dist/session/tool_gate.js +11 -0
  365. package/node_modules/remote-pi/dist/session/tool_gate.js.map +1 -0
  366. package/node_modules/remote-pi/dist/session/tools.d.ts +24 -0
  367. package/node_modules/remote-pi/dist/session/tools.js +252 -0
  368. package/node_modules/remote-pi/dist/session/tools.js.map +1 -0
  369. package/node_modules/remote-pi/dist/session/wizard.d.ts +13 -0
  370. package/node_modules/remote-pi/dist/session/wizard.js +20 -0
  371. package/node_modules/remote-pi/dist/session/wizard.js.map +1 -0
  372. package/node_modules/remote-pi/dist/settings.d.ts +15 -0
  373. package/node_modules/remote-pi/dist/settings.js +52 -0
  374. package/node_modules/remote-pi/dist/settings.js.map +1 -0
  375. package/node_modules/remote-pi/dist/transport/peer_channel.d.ts +37 -0
  376. package/node_modules/remote-pi/dist/transport/peer_channel.js +98 -0
  377. package/node_modules/remote-pi/dist/transport/peer_channel.js.map +1 -0
  378. package/node_modules/remote-pi/dist/transport/pi_forward_client.d.ts +29 -0
  379. package/node_modules/remote-pi/dist/transport/pi_forward_client.js +62 -0
  380. package/node_modules/remote-pi/dist/transport/pi_forward_client.js.map +1 -0
  381. package/node_modules/remote-pi/dist/transport/relay_client.d.ts +91 -0
  382. package/node_modules/remote-pi/dist/transport/relay_client.js +206 -0
  383. package/node_modules/remote-pi/dist/transport/relay_client.js.map +1 -0
  384. package/node_modules/remote-pi/dist/ui/footer.d.ts +32 -0
  385. package/node_modules/remote-pi/dist/ui/footer.js +34 -0
  386. package/node_modules/remote-pi/dist/ui/footer.js.map +1 -0
  387. package/node_modules/remote-pi/docs/daemon.md +289 -0
  388. package/node_modules/remote-pi/package.json +88 -0
  389. package/node_modules/remote-pi/service-templates/launchd.plist.template +35 -0
  390. package/node_modules/remote-pi/service-templates/systemd.service.template +19 -0
  391. package/node_modules/remote-pi/service-templates/task-launcher.vbs.template +10 -0
  392. package/node_modules/remote-pi/service-templates/task-scheduler.xml.template +38 -0
  393. package/node_modules/remote-pi/skills/agent-network/SKILL.md +310 -0
  394. package/package.json +37 -12
  395. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool-diff/write-display-utils.ts +0 -29
  396. /package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{session-reference-core.ts → reference/session.ts} +0 -0
  397. /package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{pi-aliases.ts → shell/aliases.ts} +0 -0
  398. /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/ATTRIBUTION.md +0 -0
  399. /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/diff-presentation.ts +0 -0
  400. /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/index.ts +0 -0
  401. /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/render-utils.ts +0 -0
  402. /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/shiki-highlight.ts +0 -0
  403. /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/types.ts +0 -0
@@ -3,7 +3,7 @@ import { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync } from "
3
3
  import { dirname } from "node:path";
4
4
  import { getAgentPath } from "./agent-dir.ts";
5
5
  import { createHash } from "node:crypto";
6
- import { getToolUiResourceUri } from "@modelcontextprotocol/ext-apps/app-bridge";
6
+ import { getToolUiResourceUri } from "./ui-app-bridge-helpers.ts";
7
7
  import type {
8
8
  CachedPrompt,
9
9
  CachedResource,
@@ -91,6 +91,7 @@ export function computeServerHash(definition: ServerEntry): string {
91
91
  url: resolveServerUrl(definition),
92
92
  headers: interpolateEnvRecord(definition.headers),
93
93
  auth: definition.auth,
94
+ protocolVersion: definition.protocolVersion,
94
95
  bearerToken: resolveBearerToken(definition),
95
96
  bearerTokenEnv: definition.bearerTokenEnv,
96
97
  exposeResources: definition.exposeResources,
@@ -201,10 +202,10 @@ export function reconstructToolMetadata(
201
202
  name,
202
203
  originalName: tool.name,
203
204
  description: tool.description ?? "",
204
- inputSchema: tool.inputSchema,
205
- uiResourceUri: tool.uiResourceUri,
206
- uiVisibility: tool.uiVisibility,
207
- uiStreamMode: tool.uiStreamMode,
205
+ ...(tool.inputSchema !== undefined ? { inputSchema: tool.inputSchema } : {}),
206
+ ...(tool.uiResourceUri !== undefined ? { uiResourceUri: tool.uiResourceUri } : {}),
207
+ ...(tool.uiVisibility !== undefined ? { uiVisibility: tool.uiVisibility } : {}),
208
+ ...(tool.uiStreamMode !== undefined ? { uiStreamMode: tool.uiStreamMode } : {}),
208
209
  });
209
210
  }
210
211
 
@@ -237,14 +238,19 @@ export function reconstructToolMetadata(
237
238
  export function serializeTools(tools: McpTool[]): CachedTool[] {
238
239
  return tools
239
240
  .filter(t => t?.name)
240
- .map(t => ({
241
- name: t.name,
242
- description: t.description,
243
- inputSchema: t.inputSchema,
244
- uiResourceUri: tryGetToolUiResourceUri(t),
245
- uiVisibility: extractUiToolVisibility(t._meta),
246
- uiStreamMode: extractToolUiStreamMode(t._meta),
247
- }));
241
+ .map(t => {
242
+ const uiResourceUri = tryGetToolUiResourceUri(t);
243
+ const uiVisibility = extractUiToolVisibility(t._meta);
244
+ const uiStreamMode = extractToolUiStreamMode(t._meta);
245
+ return {
246
+ name: t.name,
247
+ ...(t.description !== undefined ? { description: t.description } : {}),
248
+ ...(t.inputSchema !== undefined ? { inputSchema: t.inputSchema } : {}),
249
+ ...(uiResourceUri !== undefined ? { uiResourceUri } : {}),
250
+ ...(uiVisibility !== undefined ? { uiVisibility } : {}),
251
+ ...(uiStreamMode !== undefined ? { uiStreamMode } : {}),
252
+ };
253
+ });
248
254
  }
249
255
 
250
256
  export function serializeResources(resources: McpResource[]): CachedResource[] {
@@ -253,7 +259,7 @@ export function serializeResources(resources: McpResource[]): CachedResource[] {
253
259
  .map(r => ({
254
260
  uri: r.uri,
255
261
  name: r.name,
256
- description: r.description,
262
+ ...(r.description !== undefined ? { description: r.description } : {}),
257
263
  }));
258
264
  }
259
265
 
@@ -262,15 +268,17 @@ export function serializePrompts(prompts: McpPrompt[]): CachedPrompt[] {
262
268
  .filter(prompt => prompt?.name)
263
269
  .map(prompt => ({
264
270
  name: prompt.name,
265
- title: prompt.title,
266
- description: prompt.description,
267
- arguments: Array.isArray(prompt.arguments)
268
- ? prompt.arguments.filter(argument => argument?.name).map(argument => ({
269
- name: argument.name,
270
- description: argument.description,
271
- required: argument.required,
272
- }))
273
- : undefined,
271
+ ...(prompt.title !== undefined ? { title: prompt.title } : {}),
272
+ ...(prompt.description !== undefined ? { description: prompt.description } : {}),
273
+ ...(Array.isArray(prompt.arguments)
274
+ ? {
275
+ arguments: prompt.arguments.filter(argument => argument?.name).map(argument => ({
276
+ name: argument.name,
277
+ ...(argument.description !== undefined ? { description: argument.description } : {}),
278
+ ...(argument.required !== undefined ? { required: argument.required } : {}),
279
+ })),
280
+ }
281
+ : {}),
274
282
  }));
275
283
  }
276
284
 
@@ -285,15 +293,15 @@ export function reconstructPromptMetadata(
285
293
  const args: McpPromptArgument[] = Array.isArray(prompt.arguments)
286
294
  ? prompt.arguments.filter(argument => argument?.name).map(argument => ({
287
295
  name: argument.name,
288
- description: argument.description,
289
- required: argument.required,
296
+ ...(argument.description !== undefined ? { description: argument.description } : {}),
297
+ ...(argument.required !== undefined ? { required: argument.required } : {}),
290
298
  }))
291
299
  : [];
292
300
  return {
293
301
  serverName,
294
302
  originalName: prompt.name,
295
303
  commandName: formatPromptCommandName(prompt.name, serverName, effectivePrefix),
296
- title: prompt.title,
304
+ ...(prompt.title !== undefined ? { title: prompt.title } : {}),
297
305
  description: prompt.description ?? "",
298
306
  arguments: args,
299
307
  };
@@ -95,6 +95,7 @@ function parseNpxArgs(args: string[]): ParsedInvocation | null {
95
95
 
96
96
  for (let i = 0; i < before.length; i++) {
97
97
  const arg = before[i];
98
+ if (arg === undefined) return null;
98
99
  if (foundFirstPositional) {
99
100
  positionals.push(arg);
100
101
  continue;
@@ -149,6 +150,7 @@ function parseNpmExecArgs(args: string[]): ParsedInvocation | null {
149
150
  let packageSpec: string | undefined;
150
151
  for (let i = 0; i < before.length; i++) {
151
152
  const arg = before[i];
153
+ if (arg === undefined) return null;
152
154
  if (arg === "-y" || arg === "--yes") continue;
153
155
  if (arg === "--package") {
154
156
  const value = before[i + 1];
@@ -239,7 +241,7 @@ function resolveFromNpmCache(packageSpec: string, binName?: string): NpxCacheEnt
239
241
  return {
240
242
  resolvedBin,
241
243
  resolvedAt: Date.now(),
242
- packageVersion: pkg?.version,
244
+ ...(pkg?.version !== undefined ? { packageVersion: pkg.version } : {}),
243
245
  isJs,
244
246
  };
245
247
  }
@@ -329,9 +331,9 @@ function parsePackageSpec(spec: string): ParsedPackageSpec | null {
329
331
  const normalizedVersion = requestedVersion?.replace(/^=/, "").replace(/^v/i, "");
330
332
  return {
331
333
  packageName,
332
- exactVersion: normalizedVersion && EXACT_PACKAGE_VERSION_RE.test(normalizedVersion)
333
- ? normalizedVersion
334
- : undefined,
334
+ ...(normalizedVersion && EXACT_PACKAGE_VERSION_RE.test(normalizedVersion)
335
+ ? { exactVersion: normalizedVersion }
336
+ : {}),
335
337
  };
336
338
  }
337
339
 
@@ -1,5 +1,5 @@
1
1
  // oauth-handler.ts - OAuth token compatibility helpers for MCP servers
2
- import type { OAuthTokens } from "@modelcontextprotocol/sdk/shared/auth.js";
2
+ import type { OAuthTokens } from "@modelcontextprotocol/client";
3
3
  import { getAuthEntry } from "./mcp-auth.ts";
4
4
 
5
5
  /**
@@ -0,0 +1,48 @@
1
+ import { getValidToken } from "./mcp-auth-flow.ts";
2
+ import {
3
+ inspectAuthForUrl,
4
+ updateTokens,
5
+ type AuthStorageOptions,
6
+ type StoredTokens,
7
+ } from "./mcp-auth.ts";
8
+
9
+ export type McpOAuthTokens = StoredTokens;
10
+ export type McpOAuthStorageOptions = AuthStorageOptions;
11
+ export interface McpOAuthTokenOptions {
12
+ authStorageOptions?: McpOAuthStorageOptions;
13
+ signal?: AbortSignal;
14
+ skipIssuerMetadataValidation?: boolean;
15
+ }
16
+ export type McpOAuthTokenStatus =
17
+ | { status: "present"; tokens: McpOAuthTokens }
18
+ | { status: "absent" }
19
+ | { status: "unavailable"; message: string };
20
+
21
+ export async function getMcpOAuthTokensForUrl(
22
+ serverName: string,
23
+ serverUrl: string,
24
+ options: McpOAuthTokenOptions = {},
25
+ ): Promise<McpOAuthTokens | undefined> {
26
+ return (await getValidToken(serverName, serverUrl, options)) ?? undefined;
27
+ }
28
+
29
+ export function inspectMcpOAuthTokensForUrl(
30
+ serverName: string,
31
+ serverUrl: string,
32
+ options?: McpOAuthStorageOptions,
33
+ ): McpOAuthTokenStatus {
34
+ const status = inspectAuthForUrl(serverName, serverUrl, options);
35
+ if (status.status !== "present") return status;
36
+ return status.entry.tokens
37
+ ? { status: "present", tokens: status.entry.tokens }
38
+ : { status: "absent" };
39
+ }
40
+
41
+ export function updateMcpOAuthTokensForUrl(
42
+ serverName: string,
43
+ serverUrl: string,
44
+ tokens: McpOAuthTokens,
45
+ options?: McpOAuthStorageOptions,
46
+ ): void {
47
+ updateTokens(serverName, tokens, serverUrl, options);
48
+ }
@@ -30,7 +30,9 @@ export function loadOnboardingState(): McpOnboardingState {
30
30
  version: 1,
31
31
  sharedConfigHintShown: raw.sharedConfigHintShown === true,
32
32
  setupCompleted: raw.setupCompleted === true,
33
- lastDiscoveryFingerprint: typeof raw.lastDiscoveryFingerprint === "string" ? raw.lastDiscoveryFingerprint : undefined,
33
+ ...(typeof raw.lastDiscoveryFingerprint === "string"
34
+ ? { lastDiscoveryFingerprint: raw.lastDiscoveryFingerprint }
35
+ : {}),
34
36
  };
35
37
  } catch {
36
38
  return { ...DEFAULT_STATE };
@@ -52,17 +54,23 @@ export function updateOnboardingState(updater: (state: McpOnboardingState) => Mc
52
54
  }
53
55
 
54
56
  export function markSharedConfigHintShown(fingerprint?: string): McpOnboardingState {
55
- return updateOnboardingState((state) => ({
56
- ...state,
57
- sharedConfigHintShown: true,
58
- lastDiscoveryFingerprint: fingerprint ?? state.lastDiscoveryFingerprint,
59
- }));
57
+ return updateOnboardingState((state) => {
58
+ const lastDiscoveryFingerprint = fingerprint ?? state.lastDiscoveryFingerprint;
59
+ return {
60
+ ...state,
61
+ sharedConfigHintShown: true,
62
+ ...(lastDiscoveryFingerprint !== undefined ? { lastDiscoveryFingerprint } : {}),
63
+ };
64
+ });
60
65
  }
61
66
 
62
67
  export function markSetupCompleted(fingerprint?: string): McpOnboardingState {
63
- return updateOnboardingState((state) => ({
64
- ...state,
65
- setupCompleted: true,
66
- lastDiscoveryFingerprint: fingerprint ?? state.lastDiscoveryFingerprint,
67
- }));
68
+ return updateOnboardingState((state) => {
69
+ const lastDiscoveryFingerprint = fingerprint ?? state.lastDiscoveryFingerprint;
70
+ return {
71
+ ...state,
72
+ setupCompleted: true,
73
+ ...(lastDiscoveryFingerprint !== undefined ? { lastDiscoveryFingerprint } : {}),
74
+ };
75
+ });
68
76
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-mcp-adapter",
3
- "version": "2.19.0",
3
+ "version": "2.23.0",
4
4
  "description": "MCP (Model Context Protocol) adapter extension for Pi coding agent",
5
5
  "type": "module",
6
6
  "types": "./index.ts",
@@ -14,6 +14,11 @@
14
14
  "types": "./types.ts",
15
15
  "import": "./types.ts",
16
16
  "default": "./types.ts"
17
+ },
18
+ "./oauth": {
19
+ "types": "./oauth.ts",
20
+ "import": "./oauth.ts",
21
+ "default": "./oauth.ts"
17
22
  }
18
23
  },
19
24
  "license": "MIT",
@@ -25,10 +30,11 @@
25
30
  "pi-mcp-adapter": "cli.js"
26
31
  },
27
32
  "scripts": {
33
+ "typecheck": "tsc --noEmit",
28
34
  "test": "vitest run",
29
35
  "test:watch": "vitest",
30
36
  "test:coverage": "vitest run --coverage",
31
- "test:oauth": "PI_MCP_ADAPTER_TEST_AUTH_STORE=memory node --import tsx --test --test-concurrency=1 mcp-auth.test.ts mcp-auth-flow.test.ts mcp-callback-server.test.ts mcp-oauth-provider.test.ts",
37
+ "test:oauth": "PI_MCP_ADAPTER_TEST_AUTH_STORE=memory node --import tsx --test --test-concurrency=1 oauth-public-api.test.ts mcp-auth.test.ts mcp-auth-flow.test.ts mcp-callback-server.test.ts mcp-oauth-provider.test.ts",
32
38
  "test:oauth-provider": "PI_MCP_ADAPTER_TEST_AUTH_STORE=memory node --import tsx --test mcp-oauth-provider.test.ts",
33
39
  "test:conformance": "bash conformance/run.sh"
34
40
  },
@@ -80,6 +86,7 @@
80
86
  "types.ts",
81
87
  "ui-stream-types.ts",
82
88
  "ui-tool-visibility.ts",
89
+ "ui-app-bridge-helpers.ts",
83
90
  "config.ts",
84
91
  "server-manager.ts",
85
92
  "unix-socket-transport.ts",
@@ -93,6 +100,7 @@
93
100
  "mcp-code.ts",
94
101
  "mcp-script-worker.mjs",
95
102
  "mcp-probe.ts",
103
+ "agent-plugin-loader.ts",
96
104
  "resource-tools.ts",
97
105
  "lifecycle.ts",
98
106
  "mcp-status.ts",
@@ -104,6 +112,7 @@
104
112
  "glimpse-ui.ts",
105
113
  "npx-resolver.ts",
106
114
  "oauth-handler.ts",
115
+ "oauth.ts",
107
116
  "mcp-auth.ts",
108
117
  "mcp-keyring-helper.cjs",
109
118
  "mcp-oauth-provider.ts",
@@ -122,8 +131,9 @@
122
131
  "LICENSE"
123
132
  ],
124
133
  "dependencies": {
134
+ "@modelcontextprotocol/client": "2.0.0",
135
+ "@modelcontextprotocol/core": "2.0.0",
125
136
  "@modelcontextprotocol/ext-apps": "^1.2.2",
126
- "@modelcontextprotocol/sdk": "^1.30.0",
127
137
  "@napi-rs/keyring": "^1.3.0",
128
138
  "ajv": "^8.17.1",
129
139
  "ajv-formats": "^3.0.1",
@@ -135,7 +145,7 @@
135
145
  "zod": "^3.25.0 || ^4.0.0"
136
146
  },
137
147
  "peerDependencies": {
138
- "@earendil-works/pi-ai": "*",
148
+ "@earendil-works/pi-ai": "^0.84.1",
139
149
  "@earendil-works/pi-tui": "*",
140
150
  "typebox": "*",
141
151
  "zod": "^3.25.0 || ^4.0.0"
@@ -152,16 +162,17 @@
152
162
  }
153
163
  },
154
164
  "devDependencies": {
155
- "@earendil-works/pi-ai": "0.74.2",
156
- "@earendil-works/pi-coding-agent": "0.79.10",
157
- "@earendil-works/pi-tui": "0.74.2",
165
+ "@earendil-works/pi-ai": "0.84.1",
166
+ "@earendil-works/pi-coding-agent": "0.84.1",
167
+ "@earendil-works/pi-tui": "0.84.1",
158
168
  "@modelcontextprotocol/conformance": "0.1.16",
159
169
  "@types/bun": "^1.0.0",
160
- "@types/node": "^20.0.0",
170
+ "@types/cross-spawn": "6.0.6",
171
+ "@types/node": "20.19.43",
161
172
  "@types/open": "^6.2.1",
162
173
  "tsx": "^4.21.0",
163
174
  "typebox": "1.3.3",
164
- "typescript": "^5.0.0",
175
+ "typescript": "5.9.3",
165
176
  "vitest": "^3.0.0"
166
177
  }
167
178
  }
@@ -1,6 +1,6 @@
1
- import { matchesKey } from "@earendil-works/pi-tui";
1
+ import { matchesKey, type KeyId } from "@earendil-works/pi-tui";
2
2
 
3
- /** The `tui.select.*` keybinding ids the adapter panels resolve. */
3
+ /** The panel keybinding ids the adapter panels resolve through pi-tui. */
4
4
  export type PanelSelectKeybinding =
5
5
  | "tui.select.up"
6
6
  | "tui.select.down"
@@ -9,29 +9,45 @@ export type PanelSelectKeybinding =
9
9
  /** Structural subset of pi-tui's `KeybindingsManager` (which satisfies it). */
10
10
  export interface PanelKeybindings {
11
11
  matches(data: string, keybinding: PanelSelectKeybinding): boolean;
12
+ getUserBindings?(): Record<string, KeyId | KeyId[] | undefined>;
12
13
  }
13
14
 
14
15
  /**
15
- * Key matchers for list navigation: user's `tui.select.*` bindings when a
16
- * manager is provided, otherwise the previous hardcoded defaults.
16
+ * Key matchers for panel actions: user bindings when a manager is provided,
17
+ * otherwise the previous hardcoded defaults.
17
18
  */
18
19
  export interface PanelKeys {
19
20
  selectUp(data: string): boolean;
20
21
  selectDown(data: string): boolean;
21
22
  selectConfirm(data: string): boolean;
23
+ save(data: string): boolean;
24
+ saveLabel(): string | null;
25
+ }
26
+
27
+ function configuredSaveKeys(keybindings?: PanelKeybindings): { keys: KeyId[]; configured: boolean } {
28
+ const explicit = keybindings?.getUserBindings?.()["mcp.panel.save"];
29
+ if (explicit !== undefined) return { keys: Array.isArray(explicit) ? explicit : [explicit], configured: true };
30
+ return { keys: [], configured: false };
22
31
  }
23
32
 
24
33
  export function createPanelKeys(keybindings?: PanelKeybindings): PanelKeys {
34
+ const saveBinding = configuredSaveKeys(keybindings);
25
35
  if (keybindings) {
26
36
  return {
27
37
  selectUp: (data) => keybindings.matches(data, "tui.select.up"),
28
38
  selectDown: (data) => keybindings.matches(data, "tui.select.down"),
29
39
  selectConfirm: (data) => keybindings.matches(data, "tui.select.confirm"),
40
+ save: (data) => saveBinding.keys.length > 0
41
+ ? saveBinding.keys.some((key) => matchesKey(data, key))
42
+ : !saveBinding.configured && matchesKey(data, "ctrl+s"),
43
+ saveLabel: () => saveBinding.keys[0] ?? (saveBinding.configured ? null : "ctrl+s"),
30
44
  };
31
45
  }
32
46
  return {
33
47
  selectUp: (data) => matchesKey(data, "up"),
34
48
  selectDown: (data) => matchesKey(data, "down"),
35
49
  selectConfirm: (data) => matchesKey(data, "return"),
50
+ save: (data) => matchesKey(data, "ctrl+s"),
51
+ saveLabel: () => "ctrl+s",
36
52
  };
37
53
  }
@@ -2,7 +2,7 @@ import type { ExtensionAPI, ExtensionCommandContext } from "@earendil-works/pi-c
2
2
  import type {
3
3
  GetPromptResult,
4
4
  PromptMessage,
5
- } from "@modelcontextprotocol/sdk/types.js";
5
+ } from "@modelcontextprotocol/client";
6
6
  import type { McpExtensionState } from "./state.ts";
7
7
  import { isServerDisabled, type McpConfig, type PromptMetadata } from "./types.ts";
8
8
  import { formatPromptCommandName } from "./types.ts";
@@ -117,7 +117,7 @@ function findUnquotedEquals(token: string): number {
117
117
  }
118
118
 
119
119
  function stripQuotes(value: string): string {
120
- if (value.length >= 2 && (value.startsWith('"') || value.startsWith("'")) && value.endsWith(value[0])) {
120
+ if (value.length >= 2 && (value.startsWith('"') || value.startsWith("'")) && value.endsWith(value.charAt(0))) {
121
121
  return value.slice(1, -1);
122
122
  }
123
123
  return value;
@@ -1,5 +1,5 @@
1
1
  import type { AgentToolResult, ToolInfo } from "@earendil-works/pi-coding-agent";
2
- import { UrlElicitationRequiredError } from "@modelcontextprotocol/sdk/types.js";
2
+ import { UrlElicitationRequiredError, type Client } from "@modelcontextprotocol/client";
3
3
  import { createRequire } from "node:module";
4
4
  import type { McpExtensionState } from "./state.ts";
5
5
  import type { ToolMetadata, McpContent } from "./types.ts";
@@ -10,7 +10,7 @@ import { combineAbortSignals, isAbortError } from "./runtime-owner.ts";
10
10
  import { buildToolMetadata, getToolNames, findToolByName, formatSchema } from "./tool-metadata.ts";
11
11
  import { renderTsShape } from "./ts-shape.ts";
12
12
  import { reconstructPromptMetadata } from "./metadata-cache.ts";
13
- import { resolveMcpResultContent, transformMcpContent } from "./tool-registrar.ts";
13
+ import { resolveMcpResultContent, transformMcpContent, transformMcpResourceContents } from "./tool-registrar.ts";
14
14
  import { guardMcpOutput, guardedMcpDetails, resolveMcpOutputGuardOptions } from "./mcp-output-guard.ts";
15
15
  import { maybeStartUiSession, summarizeUiSessionResult, type UiSessionRuntime } from "./ui-session.ts";
16
16
  import { formatAuthRequiredMessage, formatMcpStatus, resolveServerUrl, truncateAtWord } from "./utils.ts";
@@ -20,6 +20,8 @@ import { paginate, rankSuggestions, rankToolMatches } from "./search-ranking.ts"
20
20
  import { ensureToolCallApproved, isToolCallApprovalRequired } from "./tool-approval.ts";
21
21
 
22
22
  type ProxyToolResult = AgentToolResult<Record<string, unknown>>;
23
+ type ClientCallToolResult = Awaited<ReturnType<Client["callTool"]>>;
24
+ type ClientReadResourceResult = Awaited<ReturnType<Client["readResource"]>>;
23
25
 
24
26
  const require = createRequire(import.meta.url);
25
27
  const MAX_REGEX_SEARCH_QUERY_LENGTH = 256;
@@ -524,10 +526,28 @@ export function executeSearch(
524
526
 
525
527
  const page = paginate(matches, offset, limit);
526
528
  if (page.total === 0) {
529
+ const connectingServers = server
530
+ ? state.config.mcpServers[server] && state.manager.isConnecting(server) ? [server] : []
531
+ : Object.keys(state.config.mcpServers)
532
+ .filter(name => !isServerDisabled(state.config.mcpServers[name]) && state.manager.isConnecting(name))
533
+ .sort((a, b) => a.localeCompare(b));
527
534
  const msg = server ? `No tools matching "${query}" in "${server}"` : `No tools matching "${query}"`;
535
+ const connectingMessage = connectingServers.length === 1
536
+ ? ` Server "${connectingServers[0]}" is still connecting; retry in a moment.`
537
+ : connectingServers.length > 1
538
+ ? ` Servers ${connectingServers.map(name => `"${name}"`).join(", ")} are still connecting; retry in a moment.`
539
+ : "";
528
540
  return {
529
- content: [{ type: "text" as const, text: msg }],
530
- details: { mode: "search", matches: [], count: 0, hasMore: false, nextOffset: null, query },
541
+ content: [{ type: "text" as const, text: `${msg}${connectingMessage}` }],
542
+ details: {
543
+ mode: "search",
544
+ matches: [],
545
+ count: 0,
546
+ hasMore: false,
547
+ nextOffset: null,
548
+ query,
549
+ ...(connectingServers.length > 0 ? { connectingServers } : {}),
550
+ },
531
551
  };
532
552
  }
533
553
 
@@ -748,6 +768,7 @@ export async function executeCall(
748
768
  serverOverride?: string,
749
769
  getPiTools?: () => ToolInfo[],
750
770
  signal?: AbortSignal,
771
+ origin?: "proxy" | "script",
751
772
  ): Promise<ProxyToolResult> {
752
773
  const ownedSignal = combineAbortSignals(state.owner?.signal, signal);
753
774
  throwIfAborted(ownedSignal);
@@ -1033,7 +1054,14 @@ export async function executeCall(
1033
1054
  return disabledCallResult(serverName, toolMeta);
1034
1055
  }
1035
1056
 
1036
- const approval = await ensureToolCallApproved(state, serverName, toolMeta, args, ownedSignal);
1057
+ const approval = await ensureToolCallApproved(
1058
+ state,
1059
+ serverName,
1060
+ toolMeta,
1061
+ args,
1062
+ ownedSignal,
1063
+ origin ?? (toolMeta.resourceUri ? "resource" : "proxy"),
1064
+ );
1037
1065
  if (approval.ok === false) {
1038
1066
  const denied = approval.reason === "denied";
1039
1067
  const message = denied
@@ -1085,15 +1113,17 @@ export async function executeCall(
1085
1113
  state.manager.incrementInFlight(serverName);
1086
1114
 
1087
1115
  if (toolMeta.resourceUri) {
1088
- const result = await withSessionRecovery(
1089
- { manager: state.manager, config: state.config, signal: ownedSignal, onNeedsAuth: recoverAuthConnection },
1116
+ const result = await withSessionRecovery<ClientReadResourceResult>(
1117
+ {
1118
+ manager: state.manager,
1119
+ config: state.config,
1120
+ ...(ownedSignal ? { signal: ownedSignal } : {}),
1121
+ onNeedsAuth: recoverAuthConnection,
1122
+ },
1090
1123
  serverName,
1091
1124
  (conn) => conn.client.readResource({ uri: toolMeta.resourceUri! }, requestOptions),
1092
1125
  );
1093
- const content = (result.contents ?? []).map(c => ({
1094
- type: "text" as const,
1095
- text: "text" in c ? c.text : ("blob" in c ? `[Binary data: ${(c as { mimeType?: string }).mimeType ?? "unknown"}]` : JSON.stringify(c)),
1096
- }));
1126
+ const content = transformMcpResourceContents(result.contents ?? [], state.owner?.signal);
1097
1127
  const guarded = await guardMcpOutput(content.length > 0 ? content : [{ type: "text" as const, text: "(empty resource)" }], outputGuardOptions);
1098
1128
  return {
1099
1129
  content: guarded.content,
@@ -1107,28 +1137,33 @@ export async function executeCall(
1107
1137
  toolName: toolMeta.originalName,
1108
1138
  toolArgs: args ?? {},
1109
1139
  uiResourceUri: toolMeta.uiResourceUri,
1110
- streamMode: toolMeta.uiStreamMode,
1111
- signal,
1140
+ ...(toolMeta.uiStreamMode !== undefined ? { streamMode: toolMeta.uiStreamMode } : {}),
1141
+ ...(signal ? { signal } : {}),
1112
1142
  onNeedsAuth: recoverAuthConnection,
1113
1143
  })
1114
1144
  : null;
1115
1145
 
1116
- const result = await withSessionRecovery(
1117
- { manager: state.manager, config: state.config, signal: ownedSignal, onNeedsAuth: recoverAuthConnection },
1146
+ const result = await withSessionRecovery<ClientCallToolResult>(
1147
+ {
1148
+ manager: state.manager,
1149
+ config: state.config,
1150
+ ...(ownedSignal ? { signal: ownedSignal } : {}),
1151
+ onNeedsAuth: recoverAuthConnection,
1152
+ },
1118
1153
  serverName,
1119
1154
  (conn) => abortable(conn.client.callTool({
1120
1155
  name: toolMeta.originalName,
1121
1156
  arguments: args ?? {},
1122
1157
  _meta: uiSession?.requestMeta,
1123
- }, undefined, requestOptions), ownedSignal),
1158
+ }, requestOptions), ownedSignal),
1124
1159
  );
1125
1160
 
1126
1161
  if (toolMeta.uiResourceUri) {
1127
- uiSession?.sendToolResult(result as unknown as import("@modelcontextprotocol/sdk/types.js").CallToolResult);
1162
+ uiSession?.sendToolResult(result as unknown as import("@modelcontextprotocol/client").CallToolResult);
1128
1163
 
1129
1164
  if (result.isError) {
1130
1165
  const mcpContent = (result.content ?? []) as McpContent[];
1131
- const content = transformMcpContent(mcpContent);
1166
+ const content = transformMcpContent(mcpContent, state.owner?.signal);
1132
1167
  const outputContent = content.length > 0 ? content : [{ type: "text" as const, text: "(empty result)" }];
1133
1168
  const schemaText = toolMeta.inputSchema ? `\n\nExpected parameters:\n${formatSchema(toolMeta.inputSchema)}` : "";
1134
1169
  const guarded = await guardMcpOutput(outputContent, { ...outputGuardOptions, prefix: "Error: ", suffix: schemaText, emptyTextFallback: "Tool execution failed", rawMcpResult: result });
@@ -1138,7 +1173,7 @@ export async function executeCall(
1138
1173
  };
1139
1174
  }
1140
1175
 
1141
- const content = resolveMcpResultContent(result as Record<string, unknown>);
1176
+ const content = resolveMcpResultContent(result as Record<string, unknown>, state.owner?.signal);
1142
1177
  const outputContent = content.length > 0 ? content : [{ type: "text" as const, text: "(empty result)" }];
1143
1178
  const uiSummary = summarizeUiSessionResult(uiSession);
1144
1179
  const guarded = await guardMcpOutput(outputContent, { ...outputGuardOptions, suffix: `\n\n${uiSummary.message}`, rawMcpResult: result });
@@ -1157,7 +1192,7 @@ export async function executeCall(
1157
1192
 
1158
1193
  if (result.isError) {
1159
1194
  const mcpContent = (result.content ?? []) as McpContent[];
1160
- const content = transformMcpContent(mcpContent);
1195
+ const content = transformMcpContent(mcpContent, state.owner?.signal);
1161
1196
  const outputContent = content.length > 0 ? content : [{ type: "text" as const, text: "(empty result)" }];
1162
1197
  const schemaText = toolMeta.inputSchema ? `\n\nExpected parameters:\n${formatSchema(toolMeta.inputSchema)}` : "";
1163
1198
  const guarded = await guardMcpOutput(outputContent, { ...outputGuardOptions, prefix: "Error: ", suffix: schemaText, emptyTextFallback: "Tool execution failed", rawMcpResult: result });
@@ -1167,7 +1202,7 @@ export async function executeCall(
1167
1202
  };
1168
1203
  }
1169
1204
 
1170
- const content = resolveMcpResultContent(result as Record<string, unknown>);
1205
+ const content = resolveMcpResultContent(result as Record<string, unknown>, state.owner?.signal);
1171
1206
  const outputContent = content.length > 0 ? content : [{ type: "text" as const, text: "(empty result)" }];
1172
1207
  const guarded = await guardMcpOutput(outputContent, { ...outputGuardOptions, rawMcpResult: result });
1173
1208
  return {