@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
@@ -6,6 +6,7 @@
6
6
  */
7
7
 
8
8
  import { createServer, type Server, type IncomingMessage, type ServerResponse } from "http"
9
+ import { getAppName } from "./agent-dir.ts"
9
10
  import {
10
11
  DEFAULT_OAUTH_CALLBACK_PATH,
11
12
  getConfiguredOAuthCallbackPort,
@@ -15,45 +16,106 @@ import {
15
16
  setOAuthCallbackPort,
16
17
  } from "./mcp-oauth-provider.ts"
17
18
 
18
- // HTML templates for callback responses
19
- const HTML_SUCCESS = `<!DOCTYPE html>
20
- <html>
21
- <head>
22
- <title>Pi - Authorization Successful</title>
23
- <style>
24
- body { font-family: system-ui, -apple-system, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #1a1a2e; color: #eee; }
25
- .container { text-align: center; padding: 2rem; }
26
- h1 { color: #4ade80; margin-bottom: 1rem; }
27
- p { color: #aaa; }
28
- </style>
29
- </head>
30
- <body>
31
- <div class="container">
32
- <h1>Authorization Successful</h1>
33
- <p>You can close this window and return to Pi.</p>
34
- </div>
35
- <script>setTimeout(() => window.close(), 2000);</script>
36
- </body>
37
- </html>`
38
-
39
- const HTML_MANUAL_SUCCESS = `<!DOCTYPE html>
40
- <html>
19
+ // HTML templates for callback responses.
20
+ //
21
+ // These pages are served from localhost during OAuth and are the last thing a
22
+ // user sees before returning to their terminal, so they are self-contained: no
23
+ // webfonts, no external assets, nothing that needs the network. They also name
24
+ // the host rather than hardcoding "Pi", so a distribution that rebrands pi
25
+ // (arc, tau, …) does not send its users back to an app they are not running.
26
+
27
+ /** Shared chrome: system fonts, a centred card, and light/dark support. */
28
+ const PAGE_STYLE = `
29
+ :root { color-scheme: light dark; }
30
+ * { box-sizing: border-box; }
31
+ body {
32
+ margin: 0;
33
+ min-height: 100vh;
34
+ display: flex;
35
+ align-items: center;
36
+ justify-content: center;
37
+ padding: 24px;
38
+ font: 15px/1.55 ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
39
+ background: #0f1117;
40
+ color: #e6e8ee;
41
+ }
42
+ .card {
43
+ width: 100%;
44
+ max-width: 26rem;
45
+ padding: 2.5rem 2rem;
46
+ text-align: center;
47
+ background: #161922;
48
+ border: 1px solid #242938;
49
+ border-radius: 14px;
50
+ box-shadow: 0 1px 2px rgba(0,0,0,.3), 0 12px 32px rgba(0,0,0,.25);
51
+ }
52
+ .badge {
53
+ width: 3rem; height: 3rem;
54
+ margin: 0 auto 1.25rem;
55
+ display: grid; place-items: center;
56
+ border-radius: 50%;
57
+ }
58
+ .badge svg { width: 1.5rem; height: 1.5rem; display: block; }
59
+ .ok { background: rgba(74,222,128,.12); color: #4ade80; }
60
+ .bad { background: rgba(248,113,113,.12); color: #f87171; }
61
+ h1 { margin: 0 0 .5rem; font-size: 1.15rem; font-weight: 600; letter-spacing: -0.01em; }
62
+ p { margin: 0; color: #9aa1b1; }
63
+ .app { color: #e6e8ee; font-weight: 500; }
64
+ .hint { margin-top: 1.25rem; font-size: .8125rem; color: #6b7280; }
65
+ code {
66
+ display: block;
67
+ margin-top: 1.25rem;
68
+ padding: .75rem .875rem;
69
+ text-align: left;
70
+ font: 12px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace;
71
+ color: #fca5a5;
72
+ background: rgba(248,113,113,.08);
73
+ border: 1px solid rgba(248,113,113,.2);
74
+ border-radius: 8px;
75
+ overflow-wrap: anywhere;
76
+ }
77
+ @media (prefers-color-scheme: light) {
78
+ body { background: #f6f7f9; color: #121620; }
79
+ .card { background: #fff; border-color: #e4e7ee; }
80
+ p { color: #5b6474; }
81
+ .app { color: #121620; }
82
+ .hint { color: #8b93a3; }
83
+ }`
84
+
85
+ const CHECK_ICON =
86
+ '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg>'
87
+
88
+ const CROSS_ICON =
89
+ '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M18 6 6 18M6 6l12 12"/></svg>'
90
+
91
+ function page(options: {
92
+ title: string
93
+ heading: string
94
+ body: string
95
+ icon: string
96
+ tone: "ok" | "bad"
97
+ extra?: string
98
+ autoClose?: boolean
99
+ }): string {
100
+ return `<!DOCTYPE html>
101
+ <html lang="en">
41
102
  <head>
42
- <title>Pi - Authorization Received</title>
43
- <style>
44
- body { font-family: system-ui, -apple-system, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #1a1a2e; color: #eee; }
45
- .container { text-align: center; padding: 2rem; }
46
- h1 { color: #4ade80; margin-bottom: 1rem; }
47
- p { color: #aaa; }
103
+ <meta charset="utf-8">
104
+ <meta name="viewport" content="width=device-width, initial-scale=1">
105
+ <title>${options.title}</title>
106
+ <style>${PAGE_STYLE}
48
107
  </style>
49
108
  </head>
50
109
  <body>
51
- <div class="container">
52
- <h1>Authorization Received</h1>
53
- <p>Copy the full callback URL from your browser address bar and paste it back into Pi with auth-complete.</p>
54
- </div>
55
- </body>
110
+ <main class="card">
111
+ <div class="badge ${options.tone}">${options.icon}</div>
112
+ <h1>${options.heading}</h1>
113
+ <p>${options.body}</p>
114
+ ${options.extra ?? ""}
115
+ </main>
116
+ ${options.autoClose ? " <script>setTimeout(() => window.close(), 2000);</script>\n" : ""}</body>
56
117
  </html>`
118
+ }
57
119
 
58
120
  function escapeHtml(value: string): string {
59
121
  return value
@@ -64,26 +126,41 @@ function escapeHtml(value: string): string {
64
126
  .replace(/'/g, "&#39;")
65
127
  }
66
128
 
67
- const HTML_ERROR = (error: string) => `<!DOCTYPE html>
68
- <html>
69
- <head>
70
- <title>Pi - Authorization Failed</title>
71
- <style>
72
- body { font-family: system-ui, -apple-system, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #1a1a2e; color: #eee; }
73
- .container { text-align: center; padding: 2rem; }
74
- h1 { color: #f87171; margin-bottom: 1rem; }
75
- p { color: #aaa; }
76
- .error { color: #fca5a5; font-family: monospace; margin-top: 1rem; padding: 1rem; background: rgba(248,113,113,0.1); border-radius: 0.5rem; }
77
- </style>
78
- </head>
79
- <body>
80
- <div class="container">
81
- <h1>Authorization Failed</h1>
82
- <p>An error occurred during authorization.</p>
83
- <div class="error">${escapeHtml(error)}</div>
84
- </div>
85
- </body>
86
- </html>`
129
+ /** Built per request so a host that sets PI_PACKAGE_DIR late is still named right. */
130
+ function htmlSuccess(): string {
131
+ const app = escapeHtml(getAppName())
132
+ return page({
133
+ title: `${app} — Authorization Successful`,
134
+ heading: "Authorization Successful",
135
+ body: `You can close this window and return to <span class="app">${app}</span>.`,
136
+ icon: CHECK_ICON,
137
+ tone: "ok",
138
+ autoClose: true,
139
+ })
140
+ }
141
+
142
+ function htmlManualSuccess(): string {
143
+ const app = escapeHtml(getAppName())
144
+ return page({
145
+ title: `${app} — Authorization Received`,
146
+ heading: "Authorization Received",
147
+ body: `Copy the full callback URL from your browser address bar and paste it back into <span class="app">${app}</span> with auth-complete.`,
148
+ icon: CHECK_ICON,
149
+ tone: "ok",
150
+ })
151
+ }
152
+
153
+ function htmlError(error: string): string {
154
+ const app = escapeHtml(getAppName())
155
+ return page({
156
+ title: `${app} — Authorization Failed`,
157
+ heading: "Authorization Failed",
158
+ body: `Something went wrong during authorization. You can close this window and try again from <span class="app">${app}</span>.`,
159
+ icon: CROSS_ICON,
160
+ tone: "bad",
161
+ extra: `<code>${escapeHtml(error)}</code>`,
162
+ })
163
+ }
87
164
 
88
165
  /** Result of a successful OAuth callback */
89
166
  export interface OAuthCallbackResult {
@@ -145,7 +222,7 @@ function handleRequest(req: IncomingMessage, res: ServerResponse): void {
145
222
  if (!state) {
146
223
  const errorMsg = "Missing required state parameter - potential CSRF attack"
147
224
  res.writeHead(400, { "Content-Type": "text/html" })
148
- res.end(HTML_ERROR(errorMsg))
225
+ res.end(htmlError(errorMsg))
149
226
  return
150
227
  }
151
228
 
@@ -157,14 +234,14 @@ function handleRequest(req: IncomingMessage, res: ServerResponse): void {
157
234
  if (!pending && !isReserved) {
158
235
  const errorMsg = "Invalid or expired state parameter - potential CSRF attack"
159
236
  res.writeHead(400, { "Content-Type": "text/html" })
160
- res.end(HTML_ERROR(errorMsg))
237
+ res.end(htmlError(errorMsg))
161
238
  return
162
239
  }
163
240
 
164
241
  const errorMsg = errorDescription || error
165
242
  // Send HTTP response first before rejecting promise
166
243
  res.writeHead(200, { "Content-Type": "text/html" })
167
- res.end(HTML_ERROR(errorMsg))
244
+ res.end(htmlError(errorMsg))
168
245
  // Reject promise after response is sent (defer to allow test to attach handler)
169
246
  if (pending) {
170
247
  reservedAuthStates.delete(state)
@@ -179,20 +256,20 @@ function handleRequest(req: IncomingMessage, res: ServerResponse): void {
179
256
  if (!pending && !isReserved) {
180
257
  const errorMsg = "Invalid or expired state parameter - potential CSRF attack"
181
258
  res.writeHead(400, { "Content-Type": "text/html" })
182
- res.end(HTML_ERROR(errorMsg))
259
+ res.end(htmlError(errorMsg))
183
260
  return
184
261
  }
185
262
 
186
263
  // Require authorization code
187
264
  if (!code) {
188
265
  res.writeHead(400, { "Content-Type": "text/html" })
189
- res.end(HTML_ERROR("No authorization code provided"))
266
+ res.end(htmlError("No authorization code provided"))
190
267
  return
191
268
  }
192
269
 
193
270
  if (!pending) {
194
271
  res.writeHead(200, { "Content-Type": "text/html" })
195
- res.end(HTML_MANUAL_SUCCESS)
272
+ res.end(htmlManualSuccess())
196
273
  return
197
274
  }
198
275
 
@@ -202,7 +279,7 @@ function handleRequest(req: IncomingMessage, res: ServerResponse): void {
202
279
  pending.resolve({ code, ...(iss !== null ? { iss } : {}) })
203
280
 
204
281
  res.writeHead(200, { "Content-Type": "text/html" })
205
- res.end(HTML_SUCCESS)
282
+ res.end(htmlSuccess())
206
283
  }
207
284
 
208
285
  /**
@@ -6,7 +6,7 @@ import { executeCall } from "./proxy-modes.ts";
6
6
  import { combineAbortSignals } from "./runtime-owner.ts";
7
7
  import { paginate, rankSuggestions, rankToolMatches } from "./search-ranking.ts";
8
8
  import type { McpExtensionState } from "./state.ts";
9
- import { findToolByName } from "./tool-metadata.ts";
9
+ import { findToolByName, formatSchema } from "./tool-metadata.ts";
10
10
  import { renderTsShape } from "./ts-shape.ts";
11
11
  import type { ContentBlock } from "./types.ts";
12
12
 
@@ -14,7 +14,7 @@ export const DEFAULT_MCP_SCRIPT_TIMEOUT_MS = 30_000;
14
14
 
15
15
  class McpScriptTimeoutError extends Error {
16
16
  constructor(timeoutMs: number) {
17
- super(`mcp_script timed out after ${timeoutMs}ms`);
17
+ super(`mcpScript timed out after ${timeoutMs}ms`);
18
18
  this.name = "McpScriptTimeoutError";
19
19
  }
20
20
  }
@@ -139,7 +139,7 @@ export async function runMcpScript(
139
139
  // Record before dispatch so calls still in flight at timeout/abort appear in the trace.
140
140
  const startedAt = Date.now();
141
141
  const index = calls.push({ operation: "call", path, ok: false, error: "incomplete", durationMs: 0, startedAt }) - 1;
142
- const result = await executeCall(state, path, args, undefined, getPiTools, callSignal);
142
+ const result = await executeCall(state, path, args, undefined, getPiTools, callSignal, "script");
143
143
  const details = result.details;
144
144
  if (details.error !== undefined) {
145
145
  const errorCode = String(details.error);
@@ -147,7 +147,7 @@ export async function runMcpScript(
147
147
  ? details.suggestions.filter((suggestion): suggestion is string => typeof suggestion === "string")
148
148
  : [];
149
149
  const message = errorCode === "tool_not_found"
150
- ? `Tool "${path}" not found. Use await tools.search({ query: "..." }) inside mcp_script.${suggestions.length > 0 ? ` Did you mean: ${suggestions.join(", ")}` : ""}`
150
+ ? `Tool "${path}" not found. Use await tools.search({ query: "..." }) inside mcpScript.${suggestions.length > 0 ? ` Did you mean: ${suggestions.join(", ")}` : ""}`
151
151
  : typeof details.message === "string"
152
152
  ? details.message
153
153
  : textFromContent(result.content);
@@ -172,9 +172,9 @@ export async function runMcpScript(
172
172
  if (query.trim() === "") {
173
173
  return { items: [], total: 0, hasMore: false, nextOffset: null };
174
174
  }
175
- const server = typeof input.server === "string" ? input.server : undefined;
176
- const limit = typeof input.limit === "number" ? input.limit : 12;
177
- const offset = typeof input.offset === "number" ? input.offset : 0;
175
+ const server = typeof input?.server === "string" ? input.server : undefined;
176
+ const limit = typeof input?.limit === "number" ? input.limit : 12;
177
+ const offset = typeof input?.offset === "number" ? input.offset : 0;
178
178
  const page = paginate(rankToolMatches(state, query, server), offset, limit);
179
179
  return {
180
180
  ...page,
@@ -204,7 +204,9 @@ export async function runMcpScript(
204
204
  for (const [server, metadata] of state.toolMetadata) {
205
205
  const tool = findToolByName(metadata, path);
206
206
  if (!tool) continue;
207
- const inputTypeScript = tool.inputSchema ? renderTsShape(tool.inputSchema) : null;
207
+ const inputTypeScript = tool.inputSchema
208
+ ? renderTsShape(tool.inputSchema) ?? formatSchema(tool.inputSchema)
209
+ : null;
208
210
  return {
209
211
  path: tool.name,
210
212
  name: tool.originalName,
@@ -285,7 +287,7 @@ export async function runMcpScript(
285
287
  });
286
288
  activeWorker.once("error", reject);
287
289
  activeWorker.once("exit", (code) => {
288
- if (!completed && code !== 0) reject(new Error(`mcp_script worker exited with code ${code}`));
290
+ if (!completed && code !== 0) reject(new Error(`mcpScript worker exited with code ${code}`));
289
291
  });
290
292
  });
291
293
  const timeoutError = new McpScriptTimeoutError(resolvedTimeoutMs);
@@ -313,7 +315,7 @@ export async function runMcpScript(
313
315
  } catch (error) {
314
316
  if (error instanceof McpScriptTimeoutError) {
315
317
  errorCode = "timeout";
316
- errorMessage = `mcp_script timed out after ${resolvedTimeoutMs}ms`;
318
+ errorMessage = `mcpScript timed out after ${resolvedTimeoutMs}ms`;
317
319
  } else if (externalSignal?.aborted) {
318
320
  errorCode = "aborted";
319
321
  errorMessage = error instanceof Error ? error.message : String(error);
@@ -330,7 +332,7 @@ export async function runMcpScript(
330
332
  callsSnapshot ??= snapshotCalls();
331
333
  // A script may finish without awaiting every call; abort leftovers so
332
334
  // parent-side dispatches do not outlive the script.
333
- timeoutController.abort(new Error("mcp_script finished"));
335
+ timeoutController.abort(new Error("mcpScript finished"));
334
336
  await worker?.terminate();
335
337
  }
336
338
 
@@ -10,12 +10,12 @@ import {
10
10
  type AddClientAuthentication,
11
11
  type OAuthClientProvider,
12
12
  type OAuthDiscoveryState,
13
- } from "@modelcontextprotocol/sdk/client/auth.js"
13
+ } from "@modelcontextprotocol/client"
14
14
  import type {
15
15
  OAuthClientInformationMixed,
16
16
  OAuthClientMetadata,
17
17
  OAuthTokens,
18
- } from "@modelcontextprotocol/sdk/shared/auth.js"
18
+ } from "@modelcontextprotocol/client"
19
19
  import {
20
20
  getAuthForUrl,
21
21
  updateTokens,
@@ -30,6 +30,37 @@ import {
30
30
  type StoredClientInfo,
31
31
  } from "./mcp-auth.ts"
32
32
  import { resolveCommandSecret } from "./utils.ts"
33
+ import { getAppClientUri, getAppName } from "./agent-dir.ts"
34
+
35
+ /**
36
+ * Client name advertised during Dynamic Client Registration.
37
+ *
38
+ * A distribution that rebrands pi (arc, tau, …) should register under its own
39
+ * name — otherwise every consent screen its users see asks them to authorize
40
+ * an app they have never run. Stock pi keeps the long-standing
41
+ * "Pi Coding Agent" so existing registrations are unaffected.
42
+ */
43
+ function defaultClientName(): string {
44
+ const app = getAppName()
45
+ return app === "pi" ? "Pi Coding Agent" : app
46
+ }
47
+
48
+ /**
49
+ * Client homepage advertised during Dynamic Client Registration.
50
+ *
51
+ * RFC 7591 defines client_uri as the home page *of the client*. Under a
52
+ * rebranded pi the client is that distribution, not this adapter, so pointing
53
+ * at the adapter's repository misidentifies it on the consent screen. There is
54
+ * no way to guess the right URL and a wrong one is worse than none, so the
55
+ * field is omitted unless a server config supplies oauth.clientUri.
56
+ *
57
+ * Stock pi keeps the historical value.
58
+ */
59
+ function defaultClientUri(): string | undefined {
60
+ const declared = getAppClientUri()
61
+ if (declared) return declared
62
+ return getAppName() === "pi" ? "https://github.com/nicobailon/pi-mcp-adapter" : undefined
63
+ }
33
64
 
34
65
  type IssuerBoundClientInformation = OAuthClientInformationMixed & { issuer?: string }
35
66
  type IssuerBoundTokens = OAuthTokens & { issuer?: string }
@@ -86,6 +117,8 @@ export interface McpOAuthConfig {
86
117
  redirectUri?: string
87
118
  clientName?: string
88
119
  clientUri?: string
120
+ logoUri?: string
121
+ skipIssuerMetadataValidation?: boolean
89
122
  }
90
123
 
91
124
  const reservedAuthorizationParams = new Set([
@@ -188,6 +221,11 @@ export class McpOAuthProvider implements OAuthClientProvider {
188
221
  return this.redirectUrlSnapshot
189
222
  }
190
223
 
224
+ /** Configured homepage, else the historical default on stock pi, else nothing. */
225
+ private get clientUri(): string | undefined {
226
+ return this.config.clientUri ?? defaultClientUri()
227
+ }
228
+
191
229
  /**
192
230
  * Client metadata for dynamic registration.
193
231
  * Describes this client to the OAuth authorization server.
@@ -195,8 +233,9 @@ export class McpOAuthProvider implements OAuthClientProvider {
195
233
  get clientMetadata(): OAuthClientMetadata {
196
234
  if (this.usesClientCredentials) {
197
235
  return {
198
- client_name: this.config.clientName ?? "Pi Coding Agent",
199
- client_uri: this.config.clientUri ?? "https://github.com/nicobailon/pi-mcp-adapter",
236
+ client_name: this.config.clientName ?? defaultClientName(),
237
+ ...(this.clientUri !== undefined ? { client_uri: this.clientUri } : {}),
238
+ ...(this.config.logoUri !== undefined ? { logo_uri: this.config.logoUri } : {}),
200
239
  redirect_uris: [],
201
240
  grant_types: ["client_credentials"],
202
241
  token_endpoint_auth_method: this.config.clientSecret ? "client_secret_post" : "none",
@@ -210,8 +249,9 @@ export class McpOAuthProvider implements OAuthClientProvider {
210
249
 
211
250
  return {
212
251
  redirect_uris: [redirectUrl],
213
- client_name: this.config.clientName ?? "Pi Coding Agent",
214
- client_uri: this.config.clientUri ?? "https://github.com/nicobailon/pi-mcp-adapter",
252
+ client_name: this.config.clientName ?? defaultClientName(),
253
+ ...(this.clientUri !== undefined ? { client_uri: this.clientUri } : {}),
254
+ ...(this.config.logoUri !== undefined ? { logo_uri: this.config.logoUri } : {}),
215
255
  grant_types: ["authorization_code", "refresh_token"],
216
256
  response_types: ["code"],
217
257
  token_endpoint_auth_method: this.config.clientSecret ? "client_secret_post" : "none",
@@ -288,7 +328,7 @@ export class McpOAuthProvider implements OAuthClientProvider {
288
328
  updateClientInfo(this.serverName, clientInfo, this.serverUrl, this.storageOptions)
289
329
  }
290
330
  // Return all registration metadata and the local issuer extension.
291
- // This keeps the SDK v1 view and the stored issuer binding consistent.
331
+ // This keeps the SDK OAuth view and the stored issuer binding consistent.
292
332
  return {
293
333
  client_id: clientInfo.clientId,
294
334
  client_secret: clientInfo.clientSecret,
@@ -318,7 +358,11 @@ export class McpOAuthProvider implements OAuthClientProvider {
318
358
  if (this.config.clientId && info.client_id === this.config.clientId) {
319
359
  updateClientInfo(
320
360
  this.serverName,
321
- { clientId: info.client_id, issuer, configPreRegistered: true },
361
+ {
362
+ clientId: info.client_id,
363
+ ...(issuer !== undefined ? { issuer } : {}),
364
+ configPreRegistered: true,
365
+ },
322
366
  this.serverUrl,
323
367
  this.storageOptions,
324
368
  )
@@ -329,11 +373,11 @@ export class McpOAuthProvider implements OAuthClientProvider {
329
373
  ?? (this.redirectUrl ? [this.redirectUrl] : undefined)
330
374
  const clientInfo: StoredClientInfo = {
331
375
  clientId: info.client_id,
332
- clientSecret: info.client_secret,
333
- clientIdIssuedAt: info.client_id_issued_at,
334
- clientSecretExpiresAt: info.client_secret_expires_at,
335
- redirectUris,
336
- issuer,
376
+ ...(info.client_secret !== undefined ? { clientSecret: info.client_secret } : {}),
377
+ ...(info.client_id_issued_at !== undefined ? { clientIdIssuedAt: info.client_id_issued_at } : {}),
378
+ ...(info.client_secret_expires_at !== undefined ? { clientSecretExpiresAt: info.client_secret_expires_at } : {}),
379
+ ...(redirectUris !== undefined ? { redirectUris } : {}),
380
+ ...(issuer !== undefined ? { issuer } : {}),
337
381
  }
338
382
  this.flowClientInfo = clientInfo
339
383
  updateClientInfo(this.serverName, clientInfo, this.serverUrl, this.storageOptions)
@@ -370,15 +414,16 @@ export class McpOAuthProvider implements OAuthClientProvider {
370
414
  * Save OAuth tokens.
371
415
  */
372
416
  async saveTokens(tokens: OAuthTokens): Promise<void> {
417
+ const issuer = this.discoveredIssuer ?? (tokens as IssuerBoundTokens).issuer
373
418
  const storedTokens: StoredTokens = {
374
419
  accessToken: tokens.access_token,
375
- refreshToken: tokens.refresh_token,
420
+ ...(tokens.refresh_token !== undefined ? { refreshToken: tokens.refresh_token } : {}),
376
421
  // Preserve expiry even when expires_in is 0 (e.g. the SDK re-saving an
377
422
  // already-expired token) so expired tokens stay expired instead of
378
423
  // being persisted as never-expiring.
379
- expiresAt: tokens.expires_in !== undefined ? Date.now() / 1000 + tokens.expires_in : undefined,
380
- scope: tokens.scope,
381
- issuer: this.discoveredIssuer ?? (tokens as IssuerBoundTokens).issuer,
424
+ ...(tokens.expires_in !== undefined ? { expiresAt: Date.now() / 1000 + tokens.expires_in } : {}),
425
+ ...(tokens.scope !== undefined ? { scope: tokens.scope } : {}),
426
+ ...(issuer !== undefined ? { issuer } : {}),
382
427
  }
383
428
  this.throwIfInactive()
384
429
  updateTokens(this.serverName, storedTokens, this.serverUrl, this.storageOptions)
@@ -107,7 +107,7 @@ export async function guardMcpOutput(
107
107
  if (options.enabled === false) {
108
108
  return {
109
109
  content: addAffixes(normalizedContent, prefix, suffix),
110
- mcpResult: options.rawMcpResult,
110
+ ...(options.rawMcpResult !== undefined ? { mcpResult: options.rawMcpResult } : {}),
111
111
  };
112
112
  }
113
113
 
@@ -138,8 +138,8 @@ export async function guardMcpOutput(
138
138
  originalLines: stats.lines,
139
139
  returnedLines: finalStats.lines,
140
140
  ...(imageBlocks.length > 0 ? { imageBlocksPassedThrough: imageBlocks.length } : {}),
141
- fullOutputPath,
142
- writeError,
141
+ ...(fullOutputPath !== undefined ? { fullOutputPath } : {}),
142
+ ...(writeError !== undefined ? { writeError } : {}),
143
143
  };
144
144
  }
145
145
 
@@ -147,7 +147,11 @@ export async function guardMcpOutput(
147
147
  ? undefined
148
148
  : await boundMcpResult(options.rawMcpResult, detailsMaxBytes);
149
149
 
150
- return { content: guardedContent, outputGuard, mcpResult };
150
+ return {
151
+ content: guardedContent,
152
+ ...(outputGuard ? { outputGuard } : {}),
153
+ ...(mcpResult !== undefined ? { mcpResult } : {}),
154
+ };
151
155
  }
152
156
 
153
157
  function sanitizeContent(content: ContentBlock[]): ContentBlock[] {
@@ -177,7 +181,7 @@ function addAffixes(content: ContentBlock[], prefix: string, suffix: string): Co
177
181
  if (prefix) {
178
182
  const index = next.findIndex((block) => block.type === "text");
179
183
  const block = next[index];
180
- if (index >= 0 && block.type === "text") {
184
+ if (block?.type === "text") {
181
185
  next[index] = { ...block, text: `${prefix}${block.text}` };
182
186
  } else {
183
187
  next.unshift({ type: "text", text: prefix });
@@ -187,13 +191,13 @@ function addAffixes(content: ContentBlock[], prefix: string, suffix: string): Co
187
191
  if (suffix) {
188
192
  let index = -1;
189
193
  for (let i = next.length - 1; i >= 0; i--) {
190
- if (next[i].type === "text") {
194
+ if (next[i]?.type === "text") {
191
195
  index = i;
192
196
  break;
193
197
  }
194
198
  }
195
199
  const block = next[index];
196
- if (index >= 0 && block.type === "text") {
200
+ if (block?.type === "text") {
197
201
  next[index] = { ...block, text: `${block.text}${suffix}` };
198
202
  } else {
199
203
  next.push({ type: "text", text: suffix });
@@ -239,8 +243,8 @@ function truncateHead(text: string, maxBytes: number, maxLines: number): { conte
239
243
  function truncateStringToBytes(value: string, maxBytes: number): string {
240
244
  if (byteLength(value) <= maxBytes) return value;
241
245
  const buffer = Buffer.from(value, "utf8");
242
- let end = Math.max(0, maxBytes);
243
- while (end > 0 && (buffer[end] & 0xc0) === 0x80) end--;
246
+ let end = Number.isFinite(maxBytes) ? Math.max(0, Math.floor(maxBytes)) : 0;
247
+ while (end > 0 && (buffer.readUInt8(end) & 0xc0) === 0x80) end--;
244
248
  return buffer.subarray(0, end).toString("utf8");
245
249
  }
246
250
 
@@ -280,8 +284,8 @@ async function summarizeMcpResult(result: unknown, raw: string, rawBytes: number
280
284
  contentBlocks: content.length,
281
285
  contentSummary: summarizeContent(content),
282
286
  rawResultBytes: rawBytes,
283
- fullResultPath,
284
- resultWriteError,
287
+ ...(fullResultPath !== undefined ? { fullResultPath } : {}),
288
+ ...(resultWriteError !== undefined ? { resultWriteError } : {}),
285
289
  };
286
290
 
287
291
  if (record && "structuredContent" in record) {