@ashx-j/lunr 0.2.25 → 0.2.27

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 (729) hide show
  1. package/CHANGELOG.md +31 -1
  2. package/LICENSE +22 -0
  3. package/dist/builtin-extensions/ashxj-thinking.d.ts +1 -1
  4. package/dist/builtin-extensions/ashxj-thinking.d.ts.map +1 -1
  5. package/dist/builtin-extensions/ashxj-thinking.js +1 -1
  6. package/dist/builtin-extensions/ashxj-thinking.js.map +1 -1
  7. package/dist/builtin-extensions/ashxj-tui.d.ts +11 -1
  8. package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
  9. package/dist/builtin-extensions/ashxj-tui.js +6 -10
  10. package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
  11. package/dist/builtin-extensions/index.d.ts.map +1 -1
  12. package/dist/builtin-extensions/index.js +1 -0
  13. package/dist/builtin-extensions/index.js.map +1 -1
  14. package/dist/builtin-extensions/lunr-computer-use.d.ts +3 -0
  15. package/dist/builtin-extensions/lunr-computer-use.d.ts.map +1 -0
  16. package/dist/builtin-extensions/lunr-computer-use.js +179 -0
  17. package/dist/builtin-extensions/lunr-computer-use.js.map +1 -0
  18. package/dist/builtin-extensions/lunr-cron.d.ts +4 -5
  19. package/dist/builtin-extensions/lunr-cron.d.ts.map +1 -1
  20. package/dist/builtin-extensions/lunr-cron.js +94 -108
  21. package/dist/builtin-extensions/lunr-cron.js.map +1 -1
  22. package/dist/builtin-extensions/lunr-local-providers/local-servers.d.ts.map +1 -1
  23. package/dist/builtin-extensions/lunr-local-providers/local-servers.js +3 -1
  24. package/dist/builtin-extensions/lunr-local-providers/local-servers.js.map +1 -1
  25. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.d.ts.map +1 -1
  26. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js +2 -2
  27. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js.map +1 -1
  28. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.d.ts.map +1 -1
  29. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js +1 -1
  30. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js.map +1 -1
  31. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.d.ts.map +1 -1
  32. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js +1 -1
  33. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js.map +1 -1
  34. package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
  35. package/dist/builtin-extensions/pi-intercom/index.js +2 -2
  36. package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
  37. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts +1 -1
  38. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts.map +1 -1
  39. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js +1 -1
  40. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js.map +1 -1
  41. package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts.map +1 -1
  42. package/dist/builtin-extensions/pi-lsp-extension/src/index.js +1 -15
  43. package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
  44. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts +6 -0
  45. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts.map +1 -1
  46. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js +187 -132
  47. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js.map +1 -1
  48. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts +8 -0
  49. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts.map +1 -1
  50. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js +142 -112
  51. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js.map +1 -1
  52. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts +12 -1
  53. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts.map +1 -1
  54. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js +14 -7
  55. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js.map +1 -1
  56. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts +11 -3
  57. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts.map +1 -1
  58. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js +67 -41
  59. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js.map +1 -1
  60. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts +4 -2
  61. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts.map +1 -1
  62. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js +3 -0
  63. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js.map +1 -1
  64. package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts +2 -1
  65. package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts.map +1 -1
  66. package/dist/builtin-extensions/pi-mcp-adapter/commands.js +6 -6
  67. package/dist/builtin-extensions/pi-mcp-adapter/commands.js.map +1 -1
  68. package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts +1 -1
  69. package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts.map +1 -1
  70. package/dist/builtin-extensions/pi-mcp-adapter/config.js +11 -5
  71. package/dist/builtin-extensions/pi-mcp-adapter/config.js.map +1 -1
  72. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.d.ts.map +1 -1
  73. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js +2 -2
  74. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js.map +1 -1
  75. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.d.ts.map +1 -1
  76. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js +1 -1
  77. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js.map +1 -1
  78. package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
  79. package/dist/builtin-extensions/pi-mcp-adapter/index.js +48 -40
  80. package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
  81. package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts.map +1 -1
  82. package/dist/builtin-extensions/pi-mcp-adapter/init.js +3 -1
  83. package/dist/builtin-extensions/pi-mcp-adapter/init.js.map +1 -1
  84. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts +12 -40
  85. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts.map +1 -1
  86. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js +166 -235
  87. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js.map +1 -1
  88. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts +5 -0
  89. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts.map +1 -1
  90. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js +43 -13
  91. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js.map +1 -1
  92. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts +14 -3
  93. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts.map +1 -1
  94. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js +73 -21
  95. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js.map +1 -1
  96. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.d.ts.map +1 -1
  97. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js +4 -4
  98. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js.map +1 -1
  99. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts.map +1 -1
  100. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js +2 -2
  101. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js.map +1 -1
  102. package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts +2 -0
  103. package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts.map +1 -1
  104. package/dist/builtin-extensions/pi-mcp-adapter/state.js.map +1 -1
  105. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts +1 -1
  106. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts.map +1 -1
  107. package/dist/builtin-extensions/pi-ollama-cloud/index.js +1 -1
  108. package/dist/builtin-extensions/pi-ollama-cloud/index.js.map +1 -1
  109. package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts +11 -5
  110. package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts.map +1 -1
  111. package/dist/builtin-extensions/pi-ollama-cloud/models.js +12 -32
  112. package/dist/builtin-extensions/pi-ollama-cloud/models.js.map +1 -1
  113. package/dist/builtin-extensions/pi-prompt-template-model/index.d.ts.map +1 -1
  114. package/dist/builtin-extensions/pi-prompt-template-model/index.js +5 -3
  115. package/dist/builtin-extensions/pi-prompt-template-model/index.js.map +1 -1
  116. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts +2 -1
  117. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts.map +1 -1
  118. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js +21 -12
  119. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js.map +1 -1
  120. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts.map +1 -1
  121. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js +7 -24
  122. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js.map +1 -1
  123. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  124. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +39 -77
  125. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  126. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts.map +1 -1
  127. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js +1 -1
  128. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js.map +1 -1
  129. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts +4 -4
  130. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts.map +1 -1
  131. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js +8 -5
  132. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js.map +1 -1
  133. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +1 -1
  134. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
  135. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js +15 -31
  136. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
  137. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts.map +1 -1
  138. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js +7 -2
  139. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js.map +1 -1
  140. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts +1 -0
  141. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
  142. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +21 -4
  143. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
  144. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
  145. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +11 -4
  146. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
  147. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  148. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +121 -25
  149. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  150. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  151. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +25 -5
  152. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  153. package/dist/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.d.ts +1 -0
  154. package/dist/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.d.ts.map +1 -1
  155. package/dist/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.js +5 -0
  156. package/dist/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.js.map +1 -1
  157. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts +1 -1
  158. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts.map +1 -1
  159. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js +2 -0
  160. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js.map +1 -1
  161. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts +1 -1
  162. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts.map +1 -1
  163. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js +1 -1
  164. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js.map +1 -1
  165. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +7 -8
  166. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
  167. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js +60 -32
  168. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
  169. package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts +1 -1
  170. package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts.map +1 -1
  171. package/dist/builtin-extensions/pi-subagents/src/shared/utils.js +15 -5
  172. package/dist/builtin-extensions/pi-subagents/src/shared/utils.js.map +1 -1
  173. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
  174. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +4 -3
  175. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
  176. package/dist/builtin-extensions/pi-subagents/src/tui/communication.d.ts.map +1 -1
  177. package/dist/builtin-extensions/pi-subagents/src/tui/communication.js +1 -1
  178. package/dist/builtin-extensions/pi-subagents/src/tui/communication.js.map +1 -1
  179. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +2 -1
  180. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  181. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +22 -11
  182. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  183. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts.map +1 -1
  184. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js +3 -3
  185. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js.map +1 -1
  186. package/dist/builtin-extensions/pi-tps.d.ts.map +1 -1
  187. package/dist/builtin-extensions/pi-tps.js +20 -17
  188. package/dist/builtin-extensions/pi-tps.js.map +1 -1
  189. package/dist/builtin-extensions/pi-web-access/activity.d.ts +1 -0
  190. package/dist/builtin-extensions/pi-web-access/activity.d.ts.map +1 -1
  191. package/dist/builtin-extensions/pi-web-access/activity.js +27 -5
  192. package/dist/builtin-extensions/pi-web-access/activity.js.map +1 -1
  193. package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts +3 -0
  194. package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts.map +1 -0
  195. package/dist/builtin-extensions/pi-web-access/bounded-body.js +43 -0
  196. package/dist/builtin-extensions/pi-web-access/bounded-body.js.map +1 -0
  197. package/dist/builtin-extensions/pi-web-access/content-page.d.ts +24 -0
  198. package/dist/builtin-extensions/pi-web-access/content-page.d.ts.map +1 -0
  199. package/dist/builtin-extensions/pi-web-access/content-page.js +57 -0
  200. package/dist/builtin-extensions/pi-web-access/content-page.js.map +1 -0
  201. package/dist/builtin-extensions/pi-web-access/extract.d.ts.map +1 -1
  202. package/dist/builtin-extensions/pi-web-access/extract.js +7 -2
  203. package/dist/builtin-extensions/pi-web-access/extract.js.map +1 -1
  204. package/dist/builtin-extensions/pi-web-access/github-extract.d.ts +0 -1
  205. package/dist/builtin-extensions/pi-web-access/github-extract.d.ts.map +1 -1
  206. package/dist/builtin-extensions/pi-web-access/github-extract.js +147 -36
  207. package/dist/builtin-extensions/pi-web-access/github-extract.js.map +1 -1
  208. package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
  209. package/dist/builtin-extensions/pi-web-access/index.js +48 -73
  210. package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
  211. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts +12 -4
  212. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts.map +1 -1
  213. package/dist/builtin-extensions/pi-web-access/session-cleanup.js +35 -12
  214. package/dist/builtin-extensions/pi-web-access/session-cleanup.js.map +1 -1
  215. package/dist/builtin-extensions/pi-web-access/storage.d.ts +9 -6
  216. package/dist/builtin-extensions/pi-web-access/storage.d.ts.map +1 -1
  217. package/dist/builtin-extensions/pi-web-access/storage.js +36 -24
  218. package/dist/builtin-extensions/pi-web-access/storage.js.map +1 -1
  219. package/dist/builtin-extensions/simple-pi-memory.d.ts +1 -1
  220. package/dist/builtin-extensions/simple-pi-memory.d.ts.map +1 -1
  221. package/dist/builtin-extensions/simple-pi-memory.js +1 -1
  222. package/dist/builtin-extensions/simple-pi-memory.js.map +1 -1
  223. package/dist/cli/install-cli.d.ts.map +1 -1
  224. package/dist/cli/install-cli.js +38 -30
  225. package/dist/cli/install-cli.js.map +1 -1
  226. package/dist/core/agent-session-runtime.d.ts +13 -0
  227. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  228. package/dist/core/agent-session-runtime.js +75 -11
  229. package/dist/core/agent-session-runtime.js.map +1 -1
  230. package/dist/core/agent-session-services.d.ts +1 -0
  231. package/dist/core/agent-session-services.d.ts.map +1 -1
  232. package/dist/core/agent-session-services.js +1 -0
  233. package/dist/core/agent-session-services.js.map +1 -1
  234. package/dist/core/agent-session.d.ts +40 -6
  235. package/dist/core/agent-session.d.ts.map +1 -1
  236. package/dist/core/agent-session.js +309 -76
  237. package/dist/core/agent-session.js.map +1 -1
  238. package/dist/core/browser/runtime.d.ts +2 -0
  239. package/dist/core/browser/runtime.d.ts.map +1 -1
  240. package/dist/core/browser/runtime.js +80 -45
  241. package/dist/core/browser/runtime.js.map +1 -1
  242. package/dist/core/browser/setup.d.ts.map +1 -1
  243. package/dist/core/browser/setup.js +12 -1
  244. package/dist/core/browser/setup.js.map +1 -1
  245. package/dist/core/computer-use/adapter.d.ts +28 -0
  246. package/dist/core/computer-use/adapter.d.ts.map +1 -0
  247. package/dist/core/computer-use/adapter.js +138 -0
  248. package/dist/core/computer-use/adapter.js.map +1 -0
  249. package/dist/core/computer-use/image.d.ts +27 -0
  250. package/dist/core/computer-use/image.d.ts.map +1 -0
  251. package/dist/core/computer-use/image.js +84 -0
  252. package/dist/core/computer-use/image.js.map +1 -0
  253. package/dist/core/computer-use/lease.d.ts +18 -0
  254. package/dist/core/computer-use/lease.d.ts.map +1 -0
  255. package/dist/core/computer-use/lease.js +129 -0
  256. package/dist/core/computer-use/lease.js.map +1 -0
  257. package/dist/core/computer-use/macos-runtime.d.ts +14 -0
  258. package/dist/core/computer-use/macos-runtime.d.ts.map +1 -0
  259. package/dist/core/computer-use/macos-runtime.js +148 -0
  260. package/dist/core/computer-use/macos-runtime.js.map +1 -0
  261. package/dist/core/computer-use/policy.d.ts +19 -0
  262. package/dist/core/computer-use/policy.d.ts.map +1 -0
  263. package/dist/core/computer-use/policy.js +67 -0
  264. package/dist/core/computer-use/policy.js.map +1 -0
  265. package/dist/core/computer-use/release.generated.d.ts +31 -0
  266. package/dist/core/computer-use/release.generated.d.ts.map +1 -0
  267. package/dist/core/computer-use/release.generated.js +36 -0
  268. package/dist/core/computer-use/release.generated.js.map +1 -0
  269. package/dist/core/computer-use/runtime.d.ts +13 -0
  270. package/dist/core/computer-use/runtime.d.ts.map +1 -0
  271. package/dist/core/computer-use/runtime.js +158 -0
  272. package/dist/core/computer-use/runtime.js.map +1 -0
  273. package/dist/core/computer-use/schemas.d.ts +100 -0
  274. package/dist/core/computer-use/schemas.d.ts.map +1 -0
  275. package/dist/core/computer-use/schemas.js +96 -0
  276. package/dist/core/computer-use/schemas.js.map +1 -0
  277. package/dist/core/computer-use/windows-desktop.d.ts +3 -0
  278. package/dist/core/computer-use/windows-desktop.d.ts.map +1 -0
  279. package/dist/core/computer-use/windows-desktop.js +48 -0
  280. package/dist/core/computer-use/windows-desktop.js.map +1 -0
  281. package/dist/core/computer-use/workflow.d.ts +38 -0
  282. package/dist/core/computer-use/workflow.d.ts.map +1 -0
  283. package/dist/core/computer-use/workflow.js +900 -0
  284. package/dist/core/computer-use/workflow.js.map +1 -0
  285. package/dist/core/cron/jobs.d.ts +26 -8
  286. package/dist/core/cron/jobs.d.ts.map +1 -1
  287. package/dist/core/cron/jobs.js +357 -232
  288. package/dist/core/cron/jobs.js.map +1 -1
  289. package/dist/core/cron/origin-context.d.ts +1 -0
  290. package/dist/core/cron/origin-context.d.ts.map +1 -1
  291. package/dist/core/cron/origin-context.js.map +1 -1
  292. package/dist/core/cron/scheduler.d.ts +22 -17
  293. package/dist/core/cron/scheduler.d.ts.map +1 -1
  294. package/dist/core/cron/scheduler.js +153 -73
  295. package/dist/core/cron/scheduler.js.map +1 -1
  296. package/dist/core/extensions/index.d.ts +1 -1
  297. package/dist/core/extensions/index.d.ts.map +1 -1
  298. package/dist/core/extensions/index.js.map +1 -1
  299. package/dist/core/extensions/loader.d.ts.map +1 -1
  300. package/dist/core/extensions/loader.js +4 -0
  301. package/dist/core/extensions/loader.js.map +1 -1
  302. package/dist/core/extensions/runner.d.ts +1 -0
  303. package/dist/core/extensions/runner.d.ts.map +1 -1
  304. package/dist/core/extensions/runner.js +8 -0
  305. package/dist/core/extensions/runner.js.map +1 -1
  306. package/dist/core/extensions/types.d.ts +8 -0
  307. package/dist/core/extensions/types.d.ts.map +1 -1
  308. package/dist/core/extensions/types.js.map +1 -1
  309. package/dist/core/footer-data-provider.d.ts +4 -0
  310. package/dist/core/footer-data-provider.d.ts.map +1 -1
  311. package/dist/core/footer-data-provider.js +22 -1
  312. package/dist/core/footer-data-provider.js.map +1 -1
  313. package/dist/core/large-subagent-launch.d.ts +1 -1
  314. package/dist/core/large-subagent-launch.d.ts.map +1 -1
  315. package/dist/core/large-subagent-launch.js +7 -7
  316. package/dist/core/large-subagent-launch.js.map +1 -1
  317. package/dist/core/model-registry.d.ts +2 -0
  318. package/dist/core/model-registry.d.ts.map +1 -1
  319. package/dist/core/model-registry.js +5 -0
  320. package/dist/core/model-registry.js.map +1 -1
  321. package/dist/core/model-runtime.d.ts +4 -1
  322. package/dist/core/model-runtime.d.ts.map +1 -1
  323. package/dist/core/model-runtime.js +40 -4
  324. package/dist/core/model-runtime.js.map +1 -1
  325. package/dist/core/package-manager.d.ts.map +1 -1
  326. package/dist/core/package-manager.js.map +1 -1
  327. package/dist/core/permissions.d.ts +4 -4
  328. package/dist/core/permissions.d.ts.map +1 -1
  329. package/dist/core/permissions.js +25 -38
  330. package/dist/core/permissions.js.map +1 -1
  331. package/dist/core/plan-mode.d.ts +5 -13
  332. package/dist/core/plan-mode.d.ts.map +1 -1
  333. package/dist/core/plan-mode.js +135 -116
  334. package/dist/core/plan-mode.js.map +1 -1
  335. package/dist/core/project-trust.d.ts.map +1 -1
  336. package/dist/core/project-trust.js +1 -1
  337. package/dist/core/project-trust.js.map +1 -1
  338. package/dist/core/prompt-resource-bridge.d.ts +12 -0
  339. package/dist/core/prompt-resource-bridge.d.ts.map +1 -0
  340. package/dist/core/prompt-resource-bridge.js +9 -0
  341. package/dist/core/prompt-resource-bridge.js.map +1 -0
  342. package/dist/core/protected-targets.d.ts +6 -0
  343. package/dist/core/protected-targets.d.ts.map +1 -0
  344. package/dist/core/protected-targets.js +45 -0
  345. package/dist/core/protected-targets.js.map +1 -0
  346. package/dist/core/resource-loader.d.ts.map +1 -1
  347. package/dist/core/resource-loader.js +7 -0
  348. package/dist/core/resource-loader.js.map +1 -1
  349. package/dist/core/rollback.d.ts +19 -3
  350. package/dist/core/rollback.d.ts.map +1 -1
  351. package/dist/core/rollback.js +172 -56
  352. package/dist/core/rollback.js.map +1 -1
  353. package/dist/core/runtime-credentials.d.ts +3 -0
  354. package/dist/core/runtime-credentials.d.ts.map +1 -1
  355. package/dist/core/runtime-credentials.js +14 -1
  356. package/dist/core/runtime-credentials.js.map +1 -1
  357. package/dist/core/sdk.d.ts +3 -0
  358. package/dist/core/sdk.d.ts.map +1 -1
  359. package/dist/core/sdk.js +1 -0
  360. package/dist/core/sdk.js.map +1 -1
  361. package/dist/core/session-manager.d.ts +6 -0
  362. package/dist/core/session-manager.d.ts.map +1 -1
  363. package/dist/core/session-manager.js +95 -32
  364. package/dist/core/session-manager.js.map +1 -1
  365. package/dist/core/session-ownership.d.ts.map +1 -1
  366. package/dist/core/session-ownership.js +8 -3
  367. package/dist/core/session-ownership.js.map +1 -1
  368. package/dist/core/session-retention.d.ts.map +1 -1
  369. package/dist/core/session-retention.js +18 -7
  370. package/dist/core/session-retention.js.map +1 -1
  371. package/dist/core/session-startup-settings.d.ts +10 -0
  372. package/dist/core/session-startup-settings.d.ts.map +1 -0
  373. package/dist/core/session-startup-settings.js +70 -0
  374. package/dist/core/session-startup-settings.js.map +1 -0
  375. package/dist/core/settings-manager.d.ts +6 -0
  376. package/dist/core/settings-manager.d.ts.map +1 -1
  377. package/dist/core/settings-manager.js +19 -0
  378. package/dist/core/settings-manager.js.map +1 -1
  379. package/dist/core/subagent-event-transport.d.ts +3 -0
  380. package/dist/core/subagent-event-transport.d.ts.map +1 -0
  381. package/dist/core/subagent-event-transport.js +61 -0
  382. package/dist/core/subagent-event-transport.js.map +1 -0
  383. package/dist/core/subscriptions.d.ts +16 -7
  384. package/dist/core/subscriptions.d.ts.map +1 -1
  385. package/dist/core/subscriptions.js +96 -55
  386. package/dist/core/subscriptions.js.map +1 -1
  387. package/dist/core/trust-manager.d.ts +2 -1
  388. package/dist/core/trust-manager.d.ts.map +1 -1
  389. package/dist/core/trust-manager.js +6 -1
  390. package/dist/core/trust-manager.js.map +1 -1
  391. package/dist/core/update-check.d.ts.map +1 -1
  392. package/dist/core/update-check.js.map +1 -1
  393. package/dist/core/usage-adapters/kimi-coding.d.ts +2 -2
  394. package/dist/core/usage-adapters/kimi-coding.d.ts.map +1 -1
  395. package/dist/core/usage-adapters/kimi-coding.js +2 -2
  396. package/dist/core/usage-adapters/kimi-coding.js.map +1 -1
  397. package/dist/core/usage-adapters/openai-codex.d.ts +3 -2
  398. package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
  399. package/dist/core/usage-adapters/openai-codex.js +3 -3
  400. package/dist/core/usage-adapters/openai-codex.js.map +1 -1
  401. package/dist/core/usage-adapters/xai.d.ts +2 -2
  402. package/dist/core/usage-adapters/xai.d.ts.map +1 -1
  403. package/dist/core/usage-adapters/xai.js +3 -3
  404. package/dist/core/usage-adapters/xai.js.map +1 -1
  405. package/dist/core/usage-adapters/zai.d.ts +2 -2
  406. package/dist/core/usage-adapters/zai.d.ts.map +1 -1
  407. package/dist/core/usage-adapters/zai.js +2 -2
  408. package/dist/core/usage-adapters/zai.js.map +1 -1
  409. package/dist/core/usage-service.d.ts +9 -2
  410. package/dist/core/usage-service.d.ts.map +1 -1
  411. package/dist/core/usage-service.js +95 -50
  412. package/dist/core/usage-service.js.map +1 -1
  413. package/dist/gateway/adapters/discord.d.ts.map +1 -1
  414. package/dist/gateway/adapters/discord.js +2 -2
  415. package/dist/gateway/adapters/discord.js.map +1 -1
  416. package/dist/gateway/agent-bridge.d.ts +9 -1
  417. package/dist/gateway/agent-bridge.d.ts.map +1 -1
  418. package/dist/gateway/agent-bridge.js +91 -37
  419. package/dist/gateway/agent-bridge.js.map +1 -1
  420. package/dist/gateway/approval.d.ts.map +1 -1
  421. package/dist/gateway/approval.js +3 -3
  422. package/dist/gateway/approval.js.map +1 -1
  423. package/dist/gateway/authz.d.ts +4 -4
  424. package/dist/gateway/authz.d.ts.map +1 -1
  425. package/dist/gateway/authz.js +8 -12
  426. package/dist/gateway/authz.js.map +1 -1
  427. package/dist/gateway/buttons.d.ts +8 -1
  428. package/dist/gateway/buttons.d.ts.map +1 -1
  429. package/dist/gateway/buttons.js +76 -18
  430. package/dist/gateway/buttons.js.map +1 -1
  431. package/dist/gateway/commands.d.ts +1 -0
  432. package/dist/gateway/commands.d.ts.map +1 -1
  433. package/dist/gateway/commands.js +12 -10
  434. package/dist/gateway/commands.js.map +1 -1
  435. package/dist/gateway/cron.d.ts +12 -11
  436. package/dist/gateway/cron.d.ts.map +1 -1
  437. package/dist/gateway/cron.js +85 -62
  438. package/dist/gateway/cron.js.map +1 -1
  439. package/dist/gateway/index.d.ts.map +1 -1
  440. package/dist/gateway/index.js +5 -4
  441. package/dist/gateway/index.js.map +1 -1
  442. package/dist/gateway/mobile-commands.d.ts +1 -0
  443. package/dist/gateway/mobile-commands.d.ts.map +1 -1
  444. package/dist/gateway/mobile-commands.js +64 -22
  445. package/dist/gateway/mobile-commands.js.map +1 -1
  446. package/dist/gateway/presenter.d.ts +12 -2
  447. package/dist/gateway/presenter.d.ts.map +1 -1
  448. package/dist/gateway/presenter.js +74 -39
  449. package/dist/gateway/presenter.js.map +1 -1
  450. package/dist/gateway/router.d.ts +2 -2
  451. package/dist/gateway/router.d.ts.map +1 -1
  452. package/dist/gateway/router.js +22 -9
  453. package/dist/gateway/router.js.map +1 -1
  454. package/dist/gateway/service.d.ts +2 -0
  455. package/dist/gateway/service.d.ts.map +1 -1
  456. package/dist/gateway/service.js +153 -0
  457. package/dist/gateway/service.js.map +1 -1
  458. package/dist/gateway/setup.d.ts.map +1 -1
  459. package/dist/gateway/setup.js +6 -4
  460. package/dist/gateway/setup.js.map +1 -1
  461. package/dist/main.d.ts.map +1 -1
  462. package/dist/main.js +86 -33
  463. package/dist/main.js.map +1 -1
  464. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  465. package/dist/modes/interactive/components/assistant-message.js +6 -4
  466. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  467. package/dist/modes/interactive/components/copyable-text.d.ts.map +1 -1
  468. package/dist/modes/interactive/components/copyable-text.js +3 -2
  469. package/dist/modes/interactive/components/copyable-text.js.map +1 -1
  470. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  471. package/dist/modes/interactive/components/extension-editor.js +1 -1
  472. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  473. package/dist/modes/interactive/components/settings-selector.d.ts +4 -0
  474. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  475. package/dist/modes/interactive/components/settings-selector.js +20 -0
  476. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  477. package/dist/modes/interactive/interactive-mode.d.ts +2 -2
  478. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  479. package/dist/modes/interactive/interactive-mode.js +104 -109
  480. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  481. package/dist/modes/interactive/smooth-streaming.d.ts.map +1 -1
  482. package/dist/modes/interactive/smooth-streaming.js.map +1 -1
  483. package/dist/modes/print-mode.d.ts.map +1 -1
  484. package/dist/modes/print-mode.js +9 -1
  485. package/dist/modes/print-mode.js.map +1 -1
  486. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  487. package/dist/modes/rpc/rpc-mode.js +2 -1
  488. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  489. package/dist/node-runtime/adapter-247RTYLS.js +16 -0
  490. package/dist/node-runtime/agent-session-services-KDMSPQDY.js +53 -0
  491. package/dist/node-runtime/{brave-UWDA3I22.js → brave-2AFFAXNN.js} +1 -1
  492. package/dist/node-runtime/{builtin-extensions-ZLAX7TUH.js → builtin-extensions-OX6KELNX.js} +9 -7
  493. package/dist/node-runtime/{chunk-QH6YL7VK.js → chunk-252ZVPPF.js} +3 -3
  494. package/dist/node-runtime/{chunk-PCEW76PM.js → chunk-2OIPYKLZ.js} +6 -6
  495. package/dist/node-runtime/{chunk-XBWPBZBN.js → chunk-2SWW7KMW.js} +1 -1
  496. package/dist/node-runtime/{chunk-UQUCFAJ3.js → chunk-2VIW3IMF.js} +40 -7
  497. package/dist/node-runtime/{chunk-UOEDI7RP.js → chunk-4KNKQGHM.js} +2 -2
  498. package/dist/node-runtime/{chunk-FQMM2EZ2.js → chunk-64XTQNLA.js} +29 -7
  499. package/dist/node-runtime/{chunk-NRKGMJYU.js → chunk-6O3IW3IA.js} +2 -2
  500. package/dist/node-runtime/{chunk-5ZQXRPMC.js → chunk-6ZZHGUSA.js} +2 -2
  501. package/dist/node-runtime/chunk-A2WO6WIN.js +1197 -0
  502. package/dist/node-runtime/{chunk-ZXSGTGJ6.js → chunk-APVM5NEU.js} +169 -148
  503. package/dist/node-runtime/{chunk-RC7DMV45.js → chunk-AYHH7YSD.js} +205 -144
  504. package/dist/node-runtime/{chunk-LWYIVUGV.js → chunk-B2IBAXNX.js} +48 -31
  505. package/dist/node-runtime/{chunk-M3LZLQW2.js → chunk-BDRGN3L2.js} +1 -0
  506. package/dist/node-runtime/{chunk-GJ2RDBRL.js → chunk-BYC6RKCN.js} +4 -2
  507. package/dist/node-runtime/{chunk-KWIYUUZK.js → chunk-C3P6Q3B2.js} +469 -283
  508. package/dist/node-runtime/{chunk-YCUZEGJG.js → chunk-DQSCFU7R.js} +17 -8
  509. package/dist/node-runtime/chunk-EBLAZVSA.js +4170 -0
  510. package/dist/node-runtime/{chunk-2KIPT4HJ.js → chunk-EPR2F3GU.js} +68 -20
  511. package/dist/node-runtime/{chunk-CSFI6YXL.js → chunk-ES6PBSIE.js} +1 -1
  512. package/dist/node-runtime/{chunk-IF24A3FH.js → chunk-EVM653DD.js} +4 -4
  513. package/dist/node-runtime/{chunk-HTFRRDSF.js → chunk-F2SMQ6ES.js} +3 -2
  514. package/dist/node-runtime/chunk-F2V2F4ZG.js +114 -0
  515. package/dist/node-runtime/chunk-FE3WZI7F.js +290 -0
  516. package/dist/node-runtime/{chunk-GYIXXQAO.js → chunk-FIRA54AC.js} +2 -5
  517. package/dist/node-runtime/{chunk-6VYZ5UFP.js → chunk-FLGEEH27.js} +1 -1
  518. package/dist/node-runtime/{chunk-5EFIU3OM.js → chunk-FTKEZL27.js} +1 -1
  519. package/dist/node-runtime/chunk-FY4A63RK.js +73 -0
  520. package/dist/node-runtime/chunk-FYIFPFXE.js +98 -0
  521. package/dist/node-runtime/{chunk-HMBGROQK.js → chunk-GLDXBBL6.js} +3 -3
  522. package/dist/node-runtime/{chunk-KWA4OC2J.js → chunk-H6YBCWKG.js} +1 -1
  523. package/dist/node-runtime/{chunk-2MI5OPMN.js → chunk-HNNHHJAB.js} +68 -50
  524. package/dist/node-runtime/{chunk-6XL67VVY.js → chunk-HUD2RFJW.js} +17 -2
  525. package/dist/node-runtime/{chunk-I54LGHWM.js → chunk-I2H5QMWW.js} +3 -3
  526. package/dist/node-runtime/chunk-IAZSK7KK.js +108 -0
  527. package/dist/node-runtime/{chunk-2HHLJWGD.js → chunk-IHHTWSXN.js} +9 -9
  528. package/dist/node-runtime/{chunk-DAPBPCBP.js → chunk-IPP5BIV5.js} +25 -3
  529. package/dist/node-runtime/{chunk-QFWG2RVL.js → chunk-IXG6F4NT.js} +11 -0
  530. package/dist/node-runtime/{chunk-RDDAZOMU.js → chunk-JL4HYQXK.js} +1 -1
  531. package/dist/node-runtime/{chunk-CDVHZOOK.js → chunk-JQYNHAKX.js} +1 -1
  532. package/dist/node-runtime/{chunk-WF7PGWRZ.js → chunk-JWEVT363.js} +37 -28
  533. package/dist/node-runtime/{chunk-2HMIRK7W.js → chunk-LHV3V67B.js} +5 -5
  534. package/dist/node-runtime/{chunk-UAEOTO52.js → chunk-MNQXDFPV.js} +6 -2
  535. package/dist/node-runtime/{chunk-IJIFHRTB.js → chunk-MQPKUHRN.js} +165 -85
  536. package/dist/node-runtime/{chunk-MPKSOJBT.js → chunk-NHATCSOI.js} +4 -7
  537. package/dist/node-runtime/{chunk-RMQZU2YU.js → chunk-NNNR3QIY.js} +1 -1
  538. package/dist/node-runtime/{chunk-RWTKOC3B.js → chunk-QBTJG3UM.js} +1 -1
  539. package/dist/node-runtime/{chunk-E4D3IGP2.js → chunk-QNVMKNNN.js} +20 -17
  540. package/dist/node-runtime/{chunk-GS42T6MX.js → chunk-QW3AAHWN.js} +1 -1
  541. package/dist/node-runtime/{chunk-7S3T6YEA.js → chunk-R4WSB2MQ.js} +5 -5
  542. package/dist/node-runtime/{chunk-B4HP6ZWM.js → chunk-RHCGYWO7.js} +1 -1
  543. package/dist/node-runtime/{chunk-3XPLBUEM.js → chunk-RLGY2QIL.js} +49 -59
  544. package/dist/node-runtime/{chunk-KKUTQQV7.js → chunk-RYRGL7P4.js} +1 -1
  545. package/dist/node-runtime/{chunk-AD6VXAO7.js → chunk-TCT6PCUR.js} +47 -115
  546. package/dist/node-runtime/chunk-U5F4IC7R.js +53 -0
  547. package/dist/node-runtime/{chunk-OCVIXVTZ.js → chunk-UBWW2PID.js} +13 -2
  548. package/dist/node-runtime/{chunk-HFVZUPFJ.js → chunk-UNUZICC4.js} +3 -3
  549. package/dist/node-runtime/{chunk-LQP3RB67.js → chunk-UYRKUKFE.js} +1 -1
  550. package/dist/node-runtime/{chunk-DSIKTUPW.js → chunk-VSUEAI7O.js} +2993 -3820
  551. package/dist/node-runtime/{chunk-NAY6UUQZ.js → chunk-WDIVLMOH.js} +1 -1
  552. package/dist/node-runtime/{chunk-E24EO34J.js → chunk-WPXUR3HE.js} +1 -1
  553. package/dist/node-runtime/{chunk-SLVOAQOY.js → chunk-WXYNALHD.js} +113 -1
  554. package/dist/node-runtime/{chunk-KJ6DWS3K.js → chunk-XEOCUEUJ.js} +121 -60
  555. package/dist/node-runtime/chunk-YD3IZAZ7.js +47 -0
  556. package/dist/node-runtime/chunk-YSB6URMT.js +41 -0
  557. package/dist/node-runtime/{chunk-VQFSUJJG.js → chunk-ZDJUR45D.js} +430 -129
  558. package/dist/node-runtime/{chunk-YDO2F2IA.js → chunk-ZEVFBFNF.js} +95 -142
  559. package/dist/node-runtime/chunk-ZIQUS5QO.js +180 -0
  560. package/dist/node-runtime/cli-runtime.js +4 -4
  561. package/dist/node-runtime/{command-6WDOYKS6.js → command-3HMSY6W2.js} +5 -5
  562. package/dist/node-runtime/{commands-NZLSOHPE.js → commands-D6A6H4TS.js} +11 -16
  563. package/dist/node-runtime/commands-OCSSEEWJ.js +37 -0
  564. package/dist/node-runtime/{config-QDD5PUE2.js → config-CU7M7BTK.js} +1 -1
  565. package/dist/node-runtime/{config-D4QUPAHX.js → config-DS7XLMEM.js} +2 -2
  566. package/dist/node-runtime/{direct-tool-executor-77GW4F5P.js → direct-tool-executor-2QJXVQD2.js} +8 -10
  567. package/dist/node-runtime/{exa-LL64QZR2.js → exa-6VBZNPGE.js} +1 -1
  568. package/dist/node-runtime/{export-html-VM4J2MNR.js → export-html-BRWF5AHI.js} +4 -4
  569. package/dist/node-runtime/{extension-input-E7BJZ35H.js → extension-input-VBBMX7YV.js} +5 -5
  570. package/dist/node-runtime/{extension-selector-WU42XDTU.js → extension-selector-T5AOG5XB.js} +5 -5
  571. package/dist/node-runtime/{extract-EQJE7FZZ.js → extract-BFX2N35A.js} +3 -3
  572. package/dist/node-runtime/{gateway-INAYBF4Q.js → gateway-6623C2U3.js} +61 -53
  573. package/dist/node-runtime/{gemini-search-35OCRFLN.js → gemini-search-C66QHDT6.js} +2 -2
  574. package/dist/node-runtime/{gemini-url-context-UQY3PHHW.js → gemini-url-context-T7DEK73R.js} +3 -3
  575. package/dist/node-runtime/{github-extract-F64RZOEA.js → github-extract-HOGE3D6F.js} +107 -38
  576. package/dist/node-runtime/{goal-NJEE5CTU.js → goal-AIHEDUYA.js} +5 -5
  577. package/dist/node-runtime/index.js +54 -48
  578. package/dist/node-runtime/{init-HS6NQXSK.js → init-JBQJIPYI.js} +3 -4
  579. package/dist/node-runtime/{install-cli-KL4UDDAD.js → install-cli-INGHIVBY.js} +30 -25
  580. package/dist/node-runtime/interactive-mode-FM5DNUSW.js +74 -0
  581. package/dist/node-runtime/{interactive-view-NGFAMHPW.js → interactive-view-K33PM4OS.js} +8 -8
  582. package/dist/node-runtime/{lsp-manager-3ASUSO4T.js → lsp-manager-S554V5HR.js} +240 -155
  583. package/dist/node-runtime/{lunr-browser-IR7TL3J7.js → lunr-browser-H4FDOR3C.js} +7 -7
  584. package/dist/node-runtime/lunr-computer-use-VDP2QNRQ.js +158 -0
  585. package/dist/node-runtime/{lunr-cron-LWIZJM2N.js → lunr-cron-LKVA5CZZ.js} +94 -79
  586. package/dist/node-runtime/main.js +42 -39
  587. package/dist/node-runtime/{mobile-commands-J7OJEKFO.js → mobile-commands-XT3NQXLD.js} +13 -12
  588. package/dist/node-runtime/{model-runtime-OO5HFLWE.js → model-runtime-MZ2JMDV4.js} +4 -4
  589. package/dist/node-runtime/{openai-search-B3MSNCQA.js → openai-search-K72LJDYN.js} +1 -1
  590. package/dist/node-runtime/{package-manager-cli-VYZM5WHN.js → package-manager-cli-CYM262SI.js} +20 -19
  591. package/dist/node-runtime/{parallel-AI2MNSCU.js → parallel-X724NCNU.js} +1 -1
  592. package/dist/node-runtime/{perplexity-QVJW3I35.js → perplexity-RDHQHVMK.js} +2 -2
  593. package/dist/node-runtime/{pi-intercom-QM53RLTS.js → pi-intercom-NHHEPBMI.js} +2 -2
  594. package/dist/node-runtime/{pi-mcp-adapter-5UKBZP44.js → pi-mcp-adapter-PP3GQJQ2.js} +98 -94
  595. package/dist/node-runtime/{pi-ollama-cloud-2F3Y2QNM.js → pi-ollama-cloud-4MNWIMFN.js} +11 -24
  596. package/dist/node-runtime/{pi-prompt-template-model-QWTCGLJU.js → pi-prompt-template-model-FTGELLS5.js} +32 -36
  597. package/dist/node-runtime/{pi-subagents-DNY7EAIG.js → pi-subagents-LT3CTO4E.js} +114 -116
  598. package/dist/node-runtime/{pi-web-access-WTGMNZ32.js → pi-web-access-Z3LP246C.js} +144 -108
  599. package/dist/node-runtime/{print-mode-XSFM26EL.js → print-mode-2XHN5SUA.js} +4 -3
  600. package/dist/node-runtime/{process-registry-4FAKZQOL.js → process-registry-Q4QWIU33.js} +3 -3
  601. package/dist/node-runtime/{proxy-modes-LGEUYD7R.js → proxy-modes-VEGC6QG5.js} +9 -13
  602. package/dist/node-runtime/rpc-entry.js +42 -39
  603. package/dist/node-runtime/{rpc-mode-O3XV4SID.js → rpc-mode-32DHJPEJ.js} +4 -4
  604. package/dist/node-runtime/{runtime-4VA6JKNF.js → runtime-EDUUGAQD.js} +56 -46
  605. package/dist/node-runtime/runtime-UGXM4NPQ.js +21 -0
  606. package/dist/node-runtime/{runtime-bridges-VRDDR73P.js → runtime-bridges-DNKMNJCF.js} +8 -7
  607. package/dist/node-runtime/{service-MDQIPQ26.js → service-IHLGFLBT.js} +6 -4
  608. package/dist/node-runtime/{session-handoff-GWARVEWT.js → session-handoff-LNSPDTKY.js} +4 -4
  609. package/dist/node-runtime/{session-manager-JB5J6XBN.js → session-manager-YIFIAVGC.js} +3 -3
  610. package/dist/node-runtime/{session-selector-GIM4DHQ2.js → session-selector-I73U3EIO.js} +7 -7
  611. package/dist/node-runtime/{settings-manager-J4SPQPDJ.js → settings-manager-P2TKGYTR.js} +6 -5
  612. package/dist/node-runtime/{setup-JBKOLJ6F.js → setup-H7CCELIL.js} +15 -1
  613. package/dist/node-runtime/{setup-CQ2NLVK5.js → setup-OLQ4GXWS.js} +22 -21
  614. package/dist/node-runtime/{src-IVPNZ2BX.js → src-6RV4PXKJ.js} +64 -36
  615. package/dist/node-runtime/{subagent-executor-KZZQGAKV.js → subagent-executor-Q5F7DBVM.js} +141 -62
  616. package/dist/node-runtime/{tavily-WEZFVFP7.js → tavily-KZBFYQB6.js} +1 -1
  617. package/dist/node-runtime/{theme-UOO5RVFN.js → theme-YLVZKKZD.js} +2 -2
  618. package/dist/node-runtime/{trust-manager-MMISNCYO.js → trust-manager-ZCU76D23.js} +2 -2
  619. package/dist/node-runtime/{update-cli-GTFJC7XK.js → update-cli-F3XXJANQ.js} +7 -6
  620. package/dist/node-runtime/{usage-service-LFB2SWYV.js → usage-service-CPAGBED5.js} +1 -1
  621. package/dist/node-runtime/{video-extract-OOZHR7SU.js → video-extract-UPKYIBW3.js} +3 -3
  622. package/dist/node-runtime/workflow-ICDI4N3J.js +767 -0
  623. package/dist/node-runtime/{youtube-extract-FNPAUNHU.js → youtube-extract-77NT7FWH.js} +4 -4
  624. package/dist/utils/clipboard-image.d.ts.map +1 -1
  625. package/dist/utils/clipboard-image.js.map +1 -1
  626. package/dist/utils/exif-orientation.d.ts.map +1 -1
  627. package/dist/utils/exif-orientation.js +25 -10
  628. package/dist/utils/exif-orientation.js.map +1 -1
  629. package/dist/utils/image-resize-core.d.ts +2 -0
  630. package/dist/utils/image-resize-core.d.ts.map +1 -1
  631. package/dist/utils/image-resize-core.js +12 -0
  632. package/dist/utils/image-resize-core.js.map +1 -1
  633. package/dist/utils/paths.d.ts +4 -0
  634. package/dist/utils/paths.d.ts.map +1 -1
  635. package/dist/utils/paths.js +33 -2
  636. package/dist/utils/paths.js.map +1 -1
  637. package/dist/utils/sanitize-terminal-text.d.ts +7 -0
  638. package/dist/utils/sanitize-terminal-text.d.ts.map +1 -0
  639. package/dist/utils/sanitize-terminal-text.js +67 -0
  640. package/dist/utils/sanitize-terminal-text.js.map +1 -0
  641. package/docs/browser.md +1 -1
  642. package/docs/computer-use.md +362 -0
  643. package/docs/custom-provider.md +3 -3
  644. package/docs/extensions.md +8 -4
  645. package/docs/features.md +22 -12
  646. package/docs/keybindings.md +1 -1
  647. package/docs/models.md +5 -5
  648. package/docs/packages.md +1 -1
  649. package/docs/providers.md +2 -2
  650. package/docs/rpc.md +7 -7
  651. package/docs/security.md +10 -5
  652. package/docs/sessions.md +2 -2
  653. package/docs/skills.md +1 -1
  654. package/docs/terminal-setup.md +7 -7
  655. package/docs/themes.md +1 -1
  656. package/docs/usage.md +1 -1
  657. package/examples/extensions/auto-commit-on-exit.ts +1 -1
  658. package/examples/extensions/bash-spawn-hook.ts +1 -1
  659. package/examples/extensions/built-in-tool-renderer.ts +1 -1
  660. package/examples/extensions/claude-rules.ts +1 -1
  661. package/examples/extensions/commands.ts +1 -1
  662. package/examples/extensions/custom-compaction.ts +1 -1
  663. package/examples/extensions/custom-provider-anthropic/index.ts +3 -3
  664. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  665. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  666. package/examples/extensions/custom-provider-gitlab-duo/index.ts +1 -1
  667. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  668. package/examples/extensions/doom-overlay/index.ts +1 -1
  669. package/examples/extensions/git-merge-and-resolve.ts +2 -2
  670. package/examples/extensions/gondolin/index.ts +1 -1
  671. package/examples/extensions/gondolin/package-lock.json +2 -2
  672. package/examples/extensions/gondolin/package.json +1 -1
  673. package/examples/extensions/hidden-thinking-label.ts +1 -1
  674. package/examples/extensions/inline-bash.ts +2 -2
  675. package/examples/extensions/input-transform-streaming.ts +2 -2
  676. package/examples/extensions/input-transform.ts +2 -2
  677. package/examples/extensions/interactive-shell.ts +1 -1
  678. package/examples/extensions/kimi-deferred-tools.ts +1 -1
  679. package/examples/extensions/mac-system-theme.ts +1 -1
  680. package/examples/extensions/minimal-mode.ts +1 -1
  681. package/examples/extensions/modal-editor.ts +1 -1
  682. package/examples/extensions/model-status.ts +1 -1
  683. package/examples/extensions/notify.ts +3 -3
  684. package/examples/extensions/overlay-qa-tests.ts +1 -1
  685. package/examples/extensions/overlay-test.ts +1 -1
  686. package/examples/extensions/pirate.ts +1 -1
  687. package/examples/extensions/preset.ts +3 -3
  688. package/examples/extensions/project-trust.ts +4 -4
  689. package/examples/extensions/prompt-customizer.ts +1 -1
  690. package/examples/extensions/rainbow-editor.ts +1 -1
  691. package/examples/extensions/rpc-demo.ts +1 -1
  692. package/examples/extensions/sandbox/index.ts +7 -7
  693. package/examples/extensions/sandbox/package-lock.json +2 -2
  694. package/examples/extensions/sandbox/package.json +1 -1
  695. package/examples/extensions/shutdown-command.ts +5 -5
  696. package/examples/extensions/ssh.ts +2 -2
  697. package/examples/extensions/subagent/README.md +3 -3
  698. package/examples/extensions/subagent/index.ts +2 -2
  699. package/examples/extensions/titlebar-spinner.ts +1 -1
  700. package/examples/extensions/tool-override.ts +1 -1
  701. package/examples/extensions/tools.ts +1 -1
  702. package/examples/extensions/with-deps/package-lock.json +2 -2
  703. package/examples/extensions/with-deps/package.json +1 -1
  704. package/examples/extensions/working-indicator.ts +1 -1
  705. package/examples/extensions/working-message-test.ts +1 -1
  706. package/examples/sdk/01-minimal.ts +1 -1
  707. package/examples/sdk/03-custom-prompt.ts +1 -1
  708. package/examples/sdk/04-skills.ts +1 -1
  709. package/examples/sdk/06-extensions.ts +2 -2
  710. package/examples/sdk/08-prompt-templates.ts +1 -1
  711. package/install-lock/package-lock.json +3841 -0
  712. package/install-lock/package.json +18 -0
  713. package/native/computer-use/LICENSE.md +21 -0
  714. package/npm-shrinkwrap.json +3858 -0
  715. package/package.json +15 -9
  716. package/dist/modes/interactive/components/exit-card.d.ts +0 -22
  717. package/dist/modes/interactive/components/exit-card.d.ts.map +0 -1
  718. package/dist/modes/interactive/components/exit-card.js +0 -69
  719. package/dist/modes/interactive/components/exit-card.js.map +0 -1
  720. package/dist/node-runtime/agent-session-services-YXXFCP5J.js +0 -49
  721. package/dist/node-runtime/chunk-4HXHDDCF.js +0 -16
  722. package/dist/node-runtime/chunk-4TLO4PO2.js +0 -3427
  723. package/dist/node-runtime/chunk-AUXVGBO4.js +0 -19
  724. package/dist/node-runtime/chunk-OVX6X377.js +0 -50
  725. package/dist/node-runtime/chunk-QTU6AKNJ.js +0 -773
  726. package/dist/node-runtime/chunk-TORR5XBV.js +0 -356
  727. package/dist/node-runtime/commands-QC6VUZJQ.js +0 -36
  728. package/dist/node-runtime/interactive-mode-Z5M7WYYZ.js +0 -72
  729. package/dist/node-runtime/mcp-auth-flow-QIXHW6QN.js +0 -32
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-auth-flow.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * MCP Auth Flow\n * \n * High-level OAuth flow management using the MCP SDK's built-in auth functions.\n */\n\nimport {\n auth as runSdkAuth,\n UnauthorizedError,\n} from \"@modelcontextprotocol/sdk/client/auth.js\"\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\"\nimport open from \"open\"\nimport { McpOAuthProvider, type McpOAuthConfig } from \"./mcp-oauth-provider.ts\"\nimport {\n ensureCallbackServer,\n waitForCallback,\n cancelPendingCallback,\n stopCallbackServer,\n releaseCallbackServer,\n} from \"./mcp-callback-server.ts\"\nimport {\n getAuthForUrl,\n isTokenExpired,\n hasStoredTokens,\n clearAllCredentials,\n clearClientInfo,\n clearTokens,\n clearCodeVerifier,\n updateOAuthState,\n getOAuthState,\n clearOAuthState,\n type StoredTokens,\n} from \"./mcp-auth.ts\"\nimport type { ServerEntry } from \"./types.ts\"\n\n/** Auth status for a server */\nexport type AuthStatus = \"authenticated\" | \"expired\" | \"not_authenticated\"\n\nexport interface AuthenticateOptions {\n onAuthorizationUrl?: (authorizationUrl: string) => void | Promise<void>\n}\n\n// Track pending transports for auth completion\nconst pendingTransports = new Map<string, StreamableHTTPClientTransport>()\nconst pendingAuthStates = new Map<string, string>()\nconst pendingAuthCleanupTimers = new Map<string, ReturnType<typeof setTimeout>>()\n\n// Deduplicate concurrent authenticate() calls per server.\nconst pendingAuthentications = new Map<string, Promise<AuthStatus>>()\n\n/** Timeout for manual auth completion (5 minutes) */\nconst MANUAL_AUTH_TIMEOUT_MS = 5 * 60 * 1000\n\n/**\n * Generate a cryptographically secure random state parameter.\n */\nfunction generateState(): string {\n return Array.from(crypto.getRandomValues(new Uint8Array(32)))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\")\n}\n\n/**\n * Extract OAuth configuration from a ServerEntry.\n */\nexport function extractOAuthConfig(definition: ServerEntry): McpOAuthConfig {\n if (definition.oauth === false) {\n return {}\n }\n\n const config: McpOAuthConfig = {}\n if (definition.oauth?.grantType !== undefined) config.grantType = definition.oauth.grantType\n if (definition.oauth?.clientId !== undefined) config.clientId = definition.oauth.clientId\n if (definition.oauth?.clientSecret !== undefined) config.clientSecret = definition.oauth.clientSecret\n if (definition.oauth?.scope !== undefined) config.scope = definition.oauth.scope\n if (definition.oauth?.redirectUri !== undefined) {\n if (typeof definition.oauth.redirectUri !== \"string\") {\n throw new Error(\"OAuth redirectUri must be a string\")\n }\n const redirectUri = definition.oauth.redirectUri.trim()\n if (!redirectUri) {\n throw new Error(\"OAuth redirectUri must not be empty\")\n }\n config.redirectUri = redirectUri\n }\n if (definition.oauth?.clientName !== undefined) {\n if (typeof definition.oauth.clientName !== \"string\") {\n throw new Error(\"OAuth clientName must be a string\")\n }\n const clientName = definition.oauth.clientName.trim()\n if (!clientName) {\n throw new Error(\"OAuth clientName must not be empty\")\n }\n config.clientName = clientName\n }\n if (definition.oauth?.clientUri !== undefined) {\n if (typeof definition.oauth.clientUri !== \"string\") {\n throw new Error(\"OAuth clientUri must be a string\")\n }\n const clientUri = definition.oauth.clientUri.trim()\n if (!clientUri) {\n throw new Error(\"OAuth clientUri must not be empty\")\n }\n config.clientUri = clientUri\n }\n return config\n}\n\nfunction parseOAuthRedirectUri(redirectUri: string): { port: number; callbackHost: string; callbackPath: string } {\n let url: URL\n try {\n url = new URL(redirectUri)\n } catch (error) {\n throw new Error(`Invalid OAuth redirectUri: ${redirectUri}`, { cause: error })\n }\n\n const hostname = url.hostname.toLowerCase()\n const isLocalhost = hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"[::1]\" || hostname === \"::1\"\n if (url.protocol !== \"http:\" || !isLocalhost) {\n throw new Error(\"OAuth redirectUri must be an http:// localhost or loopback URI\")\n }\n\n if (url.username || url.password) {\n throw new Error(\"OAuth redirectUri must not include username or password\")\n }\n\n if (url.hash) {\n throw new Error(\"OAuth redirectUri must not include a fragment\")\n }\n\n if (!url.port) {\n throw new Error(\"OAuth redirectUri must include an explicit numeric port\")\n }\n\n const port = Number.parseInt(url.port, 10)\n if (!Number.isInteger(port) || port <= 0 || port > 65535) {\n throw new Error(\"OAuth redirectUri must include an explicit numeric port\")\n }\n\n const callbackHost = hostname === \"[::1]\" ? \"::1\" : hostname\n return { port, callbackHost, callbackPath: url.pathname }\n}\n\n/**\n * Start OAuth authentication flow for a server.\n * Returns the authorization URL when browser authorization is required.\n */\nexport async function startAuth(\n serverName: string,\n serverUrl: string,\n definition?: ServerEntry\n): Promise<{ authorizationUrl: string }> {\n const config = definition ? extractOAuthConfig(definition) : {}\n\n if (config.grantType === \"client_credentials\") {\n const storedAuth = await getAuthForUrl(serverName, serverUrl)\n if (storedAuth?.clientInfo && !storedAuth.tokens && !config.clientId) {\n clearClientInfo(serverName)\n clearCodeVerifier(serverName)\n await clearOAuthState(serverName)\n }\n\n const authProvider = new McpOAuthProvider(serverName, serverUrl, config, {\n onRedirect: async () => {\n throw new Error(\"Browser redirect is not used for client_credentials flow\")\n },\n })\n const result = await runSdkAuth(authProvider, { serverUrl })\n if (result !== \"AUTHORIZED\") {\n throw new UnauthorizedError(\"Failed to authorize\")\n }\n return { authorizationUrl: \"\" }\n }\n\n const redirectCallback = config.redirectUri !== undefined ? parseOAuthRedirectUri(config.redirectUri) : undefined\n const oauthState = generateState()\n\n try {\n await ensureCallbackServer({\n strictPort: Boolean(config.clientId) || config.redirectUri !== undefined,\n oauthState,\n reserveState: true,\n ...(redirectCallback ? { port: redirectCallback.port, callbackHost: redirectCallback.callbackHost, callbackPath: redirectCallback.callbackPath } : {}),\n })\n } catch (error) {\n await clearOAuthState(serverName)\n throw error\n }\n\n let capturedUrl: URL | undefined\n const authProvider = new McpOAuthProvider(serverName, serverUrl, config, {\n onRedirect: async (url) => {\n capturedUrl = url\n },\n })\n\n try {\n const storedAuth = await getAuthForUrl(serverName, serverUrl)\n if (storedAuth?.clientInfo && !config.clientId) {\n if (!storedAuth.tokens) {\n clearClientInfo(serverName)\n clearCodeVerifier(serverName)\n await clearOAuthState(serverName)\n } else {\n const redirectUris = storedAuth.clientInfo.redirectUris\n if (!Array.isArray(redirectUris) || !redirectUris.includes(authProvider.redirectUrl ?? \"\")) {\n clearClientInfo(serverName)\n clearTokens(serverName)\n clearCodeVerifier(serverName)\n await clearOAuthState(serverName)\n }\n }\n }\n\n await updateOAuthState(serverName, oauthState, serverUrl)\n\n const result = await runSdkAuth(authProvider, { serverUrl })\n if (result === \"AUTHORIZED\") {\n releaseCallbackServer(oauthState)\n await clearOAuthState(serverName)\n return { authorizationUrl: \"\" }\n }\n if (!capturedUrl) {\n throw new UnauthorizedError(\"OAuth authorization URL was not provided\")\n }\n const pendingTransport = new StreamableHTTPClientTransport(new URL(serverUrl), { authProvider })\n await setPendingTransport(serverName, pendingTransport, oauthState)\n return { authorizationUrl: capturedUrl.toString() }\n } catch (error) {\n await clearPendingAuth(serverName, oauthState)\n throw error\n }\n}\n\nasync function setPendingTransport(\n serverName: string,\n transport: StreamableHTTPClientTransport,\n oauthState: string,\n): Promise<void> {\n await clearPendingAuth(serverName)\n pendingTransports.set(serverName, transport)\n pendingAuthStates.set(serverName, oauthState)\n const cleanupTimer = setTimeout(() => {\n void clearPendingAuth(serverName, oauthState)\n }, MANUAL_AUTH_TIMEOUT_MS)\n cleanupTimer.unref?.()\n pendingAuthCleanupTimers.set(serverName, cleanupTimer)\n}\n\nasync function clearPendingAuth(serverName: string, oauthState?: string): Promise<void> {\n const pendingState = pendingAuthStates.get(serverName)\n if (oauthState && pendingState && pendingState !== oauthState) return\n\n const timer = pendingAuthCleanupTimers.get(serverName)\n if (timer) {\n clearTimeout(timer)\n pendingAuthCleanupTimers.delete(serverName)\n }\n\n const transport = pendingTransports.get(serverName)\n pendingTransports.delete(serverName)\n pendingAuthStates.delete(serverName)\n const stateToRelease = pendingState ?? oauthState\n if (stateToRelease) {\n releaseCallbackServer(stateToRelease)\n const storedState = await getOAuthState(serverName)\n if (storedState === stateToRelease) {\n await clearOAuthState(serverName)\n }\n }\n if (transport) {\n await transport.close().catch(() => {})\n }\n}\n\nfunction getSearchParamsFromInput(input: string): URLSearchParams | undefined {\n try {\n const url = new URL(input)\n const params = new URLSearchParams(url.search)\n if (url.hash) {\n const hash = url.hash.startsWith(\"#\") ? url.hash.slice(1) : url.hash\n const hashParams = new URLSearchParams(hash)\n for (const [key, value] of hashParams) {\n if (!params.has(key)) params.set(key, value)\n }\n }\n return params\n } catch {\n const query = input.includes(\"?\") ? input.slice(input.indexOf(\"?\") + 1) : input\n const params = new URLSearchParams(query.startsWith(\"#\") ? query.slice(1) : query)\n return params.has(\"code\") || params.has(\"state\") || params.has(\"error\") ? params : undefined\n }\n}\n\n/**\n * Extract an OAuth authorization code from either a raw code, a query string,\n * or the full localhost redirect URL copied from the browser address bar.\n */\nexport function parseAuthorizationCodeInput(input: string, expectedState?: string): string {\n const trimmed = input.trim()\n if (!trimmed) {\n throw new Error(\"Authorization code or redirect URL is required\")\n }\n\n const params = getSearchParamsFromInput(trimmed)\n if (params) {\n const error = params.get(\"error\")\n if (error) {\n const description = params.get(\"error_description\")\n throw new Error(description ? `${error}: ${description}` : error)\n }\n\n const state = params.get(\"state\")\n if (expectedState && !state) {\n throw new Error(\"OAuth state missing from redirect URL\")\n }\n if (expectedState && state !== expectedState) {\n throw new Error(\"OAuth state mismatch - potential CSRF attack\")\n }\n\n const code = params.get(\"code\")\n if (code) return code\n }\n\n if (/^[A-Za-z0-9._~+/=-]+$/.test(trimmed)) {\n return trimmed\n }\n\n throw new Error(\"Could not find an OAuth authorization code in the provided input\")\n}\n\n/**\n * Complete OAuth authentication from manual user input.\n */\nexport async function completeAuthFromInput(\n serverName: string,\n input: string,\n): Promise<AuthStatus> {\n const oauthState = await getOAuthState(serverName)\n const code = parseAuthorizationCodeInput(input, oauthState)\n return completeAuth(serverName, code)\n}\n\n/**\n * Complete OAuth authentication with the authorization code.\n */\nexport async function completeAuth(\n serverName: string,\n authorizationCode: string\n): Promise<AuthStatus> {\n const transport = pendingTransports.get(serverName)\n if (!transport) {\n throw new Error(`No pending OAuth flow for server: ${serverName}`)\n }\n\n const oauthState = await getOAuthState(serverName)\n\n try {\n // Complete the auth using the transport's finishAuth method\n await transport.finishAuth(authorizationCode)\n return \"authenticated\"\n } finally {\n await clearPendingAuth(serverName, oauthState)\n }\n}\n\n/**\n * Perform the complete OAuth authentication flow for a server.\n * \n * @param serverName - The name of the MCP server\n * @param serverUrl - The URL of the MCP server \n * @param definition - The server definition (optional)\n * @returns The final auth status\n */\nexport async function authenticate(\n serverName: string,\n serverUrl: string,\n definition?: ServerEntry,\n options: AuthenticateOptions = {},\n): Promise<AuthStatus> {\n const inFlight = pendingAuthentications.get(serverName)\n if (inFlight) {\n return inFlight\n }\n\n const operation = (async (): Promise<AuthStatus> => {\n // Start auth flow\n const { authorizationUrl } = await startAuth(serverName, serverUrl, definition)\n\n // If no auth URL needed, already authenticated\n if (!authorizationUrl) {\n return \"authenticated\"\n }\n\n // Get the state that was already generated and stored in startAuth()\n const oauthState = await getOAuthState(serverName)\n if (!oauthState) {\n throw new Error(\"OAuth state not found - this should not happen\")\n }\n\n // Register the callback BEFORE opening the browser\n const callbackPromise = waitForCallback(oauthState)\n\n try {\n // Open browser. Always surface the URL first so remote/headless users can copy it\n // even when the OS browser handoff is unavailable or invisible.\n if (options.onAuthorizationUrl) {\n await options.onAuthorizationUrl(authorizationUrl)\n } else {\n console.log(`MCP Auth: Open this URL to authenticate ${serverName}:\\n${authorizationUrl}`)\n }\n try {\n await open(authorizationUrl)\n } catch (error) {\n console.warn(`MCP Auth: Failed to open browser for ${serverName}; waiting for manual callback`, { error })\n }\n\n // Wait for callback\n const code = await callbackPromise\n\n // Validate state\n const storedState = await getOAuthState(serverName)\n if (storedState !== oauthState) {\n await clearOAuthState(serverName)\n throw new Error(\"OAuth state mismatch - potential CSRF attack\")\n }\n await clearOAuthState(serverName)\n\n // Complete the auth\n return await completeAuth(serverName, code)\n } catch (error) {\n cancelPendingCallback(oauthState)\n await clearPendingAuth(serverName, oauthState)\n throw error\n }\n })()\n\n pendingAuthentications.set(serverName, operation)\n\n try {\n return await operation\n } finally {\n if (pendingAuthentications.get(serverName) === operation) {\n pendingAuthentications.delete(serverName)\n }\n }\n}\n\n/**\n * Get a valid access token for a server, refreshing if necessary.\n * \n * @param serverName - The name of the MCP server\n * @param serverUrl - The URL of the MCP server\n * @returns The valid tokens or null if not authenticated\n */\nexport async function getValidToken(\n serverName: string,\n serverUrl: string,\n): Promise<StoredTokens | null> {\n // Check if we have valid tokens\n const entry = await getAuthForUrl(serverName, serverUrl)\n if (!entry?.tokens) {\n return null\n }\n\n // Check expiration\n const expired = await isTokenExpired(serverName)\n if (expired === false) {\n return entry.tokens\n }\n\n if (expired === true && entry.tokens.refreshToken) {\n // Token is expired, try to refresh\n console.log(`MCP Auth: Token expired for ${serverName}, attempting refresh`)\n\n try {\n // Create auth provider for token refresh\n const authProvider = new McpOAuthProvider(serverName, serverUrl, {}, {\n onRedirect: async () => {},\n })\n\n const clientInfo = await authProvider.clientInformation()\n if (!clientInfo) {\n console.log(`MCP Auth: No client info for refresh for ${serverName}`)\n return null\n }\n\n const result = await runSdkAuth(authProvider, { serverUrl })\n if (result !== \"AUTHORIZED\") {\n return null\n }\n const refreshed = await getAuthForUrl(serverName, serverUrl)\n return refreshed?.tokens ?? null\n } catch (error) {\n console.error(`MCP Auth: Token refresh failed for ${serverName}`, { error })\n return null\n }\n }\n\n // No expiration info or no refresh token, assume valid\n return entry.tokens\n}\n\n/**\n * Check the authentication status for a server.\n * \n * @param serverName - The name of the MCP server\n * @returns The current auth status\n */\nexport async function getAuthStatus(serverName: string): Promise<AuthStatus> {\n const hasTokens = await hasStoredTokens(serverName)\n if (!hasTokens) return \"not_authenticated\"\n\n const expired = await isTokenExpired(serverName)\n return expired ? \"expired\" : \"authenticated\"\n}\n\n/**\n * Remove all OAuth credentials for a server.\n * \n * @param serverName - The name of the MCP server\n */\nexport async function removeAuth(serverName: string): Promise<void> {\n const oauthState = await getOAuthState(serverName)\n if (oauthState) {\n cancelPendingCallback(oauthState)\n }\n await clearPendingAuth(serverName, oauthState)\n clearAllCredentials(serverName)\n await clearOAuthState(serverName)\n console.log(`MCP Auth: Removed credentials for ${serverName}`)\n}\n\n/**\n * Check if OAuth is supported for a server configuration.\n * OAuth is supported for HTTP servers unless explicitly disabled.\n * \n * @param definition - The server definition\n * @returns True if OAuth is supported\n */\nexport function supportsOAuth(definition: ServerEntry): boolean {\n // OAuth requires a URL\n if (!definition.url) return false\n \n // Explicitly disabled via auth: false or oauth: false\n if (definition.auth === false) return false\n if (definition.oauth === false) return false\n if (definition.auth === \"oauth\") return true\n \n // Configured custom headers take precedence over implicit OAuth auto-detection.\n if (definition.headers && Object.keys(definition.headers).length > 0) return false\n\n // OAuth is enabled when auth is not specified (auto-detect)\n return definition.auth === undefined\n}\n\n/**\n * Initialize the OAuth system on startup.\n * OAuth callback binding is lazy and starts from startAuth() only.\n */\nexport async function initializeOAuth(): Promise<void> {}\n\n/**\n * Shutdown the OAuth system.\n * Stops the callback server and cancels pending auths.\n */\nexport async function shutdownOAuth(): Promise<void> {\n for (const serverName of Array.from(pendingTransports.keys())) {\n await clearPendingAuth(serverName)\n }\n await stopCallbackServer()\n}\n"]}
1
+ {"version":3,"file":"mcp-auth-flow.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * MCP Auth Flow\n * \n * High-level OAuth flow management using the MCP SDK's built-in auth functions.\n */\n\nimport {\n auth as runSdkAuth,\n UnauthorizedError,\n} from \"@modelcontextprotocol/sdk/client/auth.js\"\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\"\nimport open from \"open\"\nimport { McpOAuthProvider, type McpOAuthConfig, type McpOAuthFlowState } from \"./mcp-oauth-provider.ts\"\nimport {\n ensureCallbackServer,\n waitForCallback,\n cancelPendingCallback,\n acquireCallbackServerOwner,\n releaseCallbackServerOwner,\n releaseCallbackServer,\n} from \"./mcp-callback-server.ts\"\nimport {\n getAuthForUrl,\n isTokenExpired,\n hasStoredTokens,\n clearAllCredentials,\n type StoredTokens,\n} from \"./mcp-auth.ts\"\nimport { abortable, throwIfAborted } from \"./abort.ts\"\nimport type { ServerEntry } from \"./types.ts\"\n\n/** Auth status for a server */\nexport type AuthStatus = \"authenticated\" | \"expired\" | \"not_authenticated\"\n\nexport interface AuthenticateOptions {\n onAuthorizationUrl?: (authorizationUrl: string) => void | Promise<void>\n}\n\n/** Timeout for manual auth completion (5 minutes) */\nconst MANUAL_AUTH_TIMEOUT_MS = 5 * 60 * 1000\n\n/**\n * Generate a cryptographically secure random state parameter.\n */\nfunction generateState(): string {\n return Array.from(crypto.getRandomValues(new Uint8Array(32)))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\")\n}\n\n/**\n * Extract OAuth configuration from a ServerEntry.\n */\nexport function extractOAuthConfig(definition: ServerEntry): McpOAuthConfig {\n if (definition.oauth === false) {\n return {}\n }\n\n const config: McpOAuthConfig = {}\n if (definition.oauth?.grantType !== undefined) config.grantType = definition.oauth.grantType\n if (definition.oauth?.clientId !== undefined) config.clientId = definition.oauth.clientId\n if (definition.oauth?.clientSecret !== undefined) config.clientSecret = definition.oauth.clientSecret\n if (definition.oauth?.scope !== undefined) config.scope = definition.oauth.scope\n if (definition.oauth?.redirectUri !== undefined) {\n if (typeof definition.oauth.redirectUri !== \"string\") {\n throw new Error(\"OAuth redirectUri must be a string\")\n }\n const redirectUri = definition.oauth.redirectUri.trim()\n if (!redirectUri) {\n throw new Error(\"OAuth redirectUri must not be empty\")\n }\n config.redirectUri = redirectUri\n }\n if (definition.oauth?.clientName !== undefined) {\n if (typeof definition.oauth.clientName !== \"string\") {\n throw new Error(\"OAuth clientName must be a string\")\n }\n const clientName = definition.oauth.clientName.trim()\n if (!clientName) {\n throw new Error(\"OAuth clientName must not be empty\")\n }\n config.clientName = clientName\n }\n if (definition.oauth?.clientUri !== undefined) {\n if (typeof definition.oauth.clientUri !== \"string\") {\n throw new Error(\"OAuth clientUri must be a string\")\n }\n const clientUri = definition.oauth.clientUri.trim()\n if (!clientUri) {\n throw new Error(\"OAuth clientUri must not be empty\")\n }\n config.clientUri = clientUri\n }\n return config\n}\n\nfunction parseOAuthRedirectUri(redirectUri: string): { port: number; callbackHost: string; callbackPath: string } {\n let url: URL\n try {\n url = new URL(redirectUri)\n } catch (error) {\n throw new Error(`Invalid OAuth redirectUri: ${redirectUri}`, { cause: error })\n }\n\n const hostname = url.hostname.toLowerCase()\n const isLocalhost = hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"[::1]\" || hostname === \"::1\"\n if (url.protocol !== \"http:\" || !isLocalhost) {\n throw new Error(\"OAuth redirectUri must be an http:// localhost or loopback URI\")\n }\n\n if (url.username || url.password) {\n throw new Error(\"OAuth redirectUri must not include username or password\")\n }\n\n if (url.hash) {\n throw new Error(\"OAuth redirectUri must not include a fragment\")\n }\n\n if (!url.port) {\n throw new Error(\"OAuth redirectUri must include an explicit numeric port\")\n }\n\n const port = Number.parseInt(url.port, 10)\n if (!Number.isInteger(port) || port <= 0 || port > 65535) {\n throw new Error(\"OAuth redirectUri must include an explicit numeric port\")\n }\n\n const callbackHost = hostname === \"[::1]\" ? \"::1\" : hostname\n return { port, callbackHost, callbackPath: url.pathname }\n}\n\nfunction getSearchParamsFromInput(input: string): URLSearchParams | undefined {\n try {\n const url = new URL(input)\n const params = new URLSearchParams(url.search)\n if (url.hash) {\n const hash = url.hash.startsWith(\"#\") ? url.hash.slice(1) : url.hash\n const hashParams = new URLSearchParams(hash)\n for (const [key, value] of hashParams) {\n if (!params.has(key)) params.set(key, value)\n }\n }\n return params\n } catch {\n const query = input.includes(\"?\") ? input.slice(input.indexOf(\"?\") + 1) : input\n const params = new URLSearchParams(query.startsWith(\"#\") ? query.slice(1) : query)\n return params.has(\"code\") || params.has(\"state\") || params.has(\"error\") ? params : undefined\n }\n}\n\n/**\n * Extract an OAuth authorization code from either a raw code, a query string,\n * or the full localhost redirect URL copied from the browser address bar.\n */\nexport function parseAuthorizationCodeInput(input: string, expectedState?: string): string {\n const trimmed = input.trim()\n if (!trimmed) {\n throw new Error(\"Authorization code or redirect URL is required\")\n }\n\n const params = getSearchParamsFromInput(trimmed)\n if (params) {\n const error = params.get(\"error\")\n if (error) {\n const description = params.get(\"error_description\")\n throw new Error(description ? `${error}: ${description}` : error)\n }\n\n const state = params.get(\"state\")\n if (expectedState && !state) {\n throw new Error(\"OAuth state missing from redirect URL\")\n }\n if (expectedState && state !== expectedState) {\n throw new Error(\"OAuth state mismatch - potential CSRF attack\")\n }\n\n const code = params.get(\"code\")\n if (code) return code\n }\n\n if (/^[A-Za-z0-9._~+/=-]+$/.test(trimmed)) {\n return trimmed\n }\n\n throw new Error(\"Could not find an OAuth authorization code in the provided input\")\n}\n\ninterface PendingAuthFlow {\n state: McpOAuthFlowState\n controller: AbortController\n transport?: StreamableHTTPClientTransport\n timer?: ReturnType<typeof setTimeout>\n cleanup?: Promise<void>\n}\n\n/** Each session owns its flows; only the callback listener is shared. */\nexport function createMcpAuthFlow() {\n const owner = acquireCallbackServerOwner()\n const flows = new Map<string, PendingAuthFlow>()\n const authenticating = new Map<string, Promise<AuthStatus>>()\n let shutdownPromise: Promise<void> | undefined\n let closed = false\n\n function assertOpen(): void {\n if (closed) throw new Error(\"MCP OAuth session closed\")\n }\n\n async function clearPendingAuth(serverName: string, flow = flows.get(serverName)): Promise<void> {\n if (!flow) return\n if (!flow.cleanup) {\n flow.cleanup = (async () => {\n if (flows.get(serverName) === flow) flows.delete(serverName)\n if (flow.timer) clearTimeout(flow.timer)\n flow.controller.abort(new Error(\"Authorization cancelled\"))\n cancelPendingCallback(flow.state.oauthState)\n releaseCallbackServer(flow.state.oauthState)\n await flow.transport?.close().catch(() => {})\n })()\n }\n await flow.cleanup\n }\n\n async function startAuth(\n serverName: string,\n serverUrl: string,\n definition?: ServerEntry,\n ): Promise<{ authorizationUrl: string }> {\n assertOpen()\n const previous = flows.get(serverName)\n if (previous) await clearPendingAuth(serverName, previous)\n assertOpen()\n if (flows.has(serverName)) throw new Error(`OAuth flow already pending for server: ${serverName}`)\n const controller = new AbortController()\n const flow: PendingAuthFlow = { controller, state: { oauthState: generateState(), signal: controller.signal } }\n flows.set(serverName, flow)\n const signal = controller.signal\n const fetchFn: typeof fetch = (input, init) => fetch(input, {\n ...init, signal: init?.signal ? AbortSignal.any([init.signal, signal]) : signal,\n })\n try {\n const config = definition ? extractOAuthConfig(definition) : {}\n const storedAuth = await getAuthForUrl(serverName, serverUrl)\n throwIfAborted(signal)\n flow.state.clientInfo = storedAuth?.clientInfo\n // Reuse the registered redirect endpoint and client ID, including clients\n // without tokens. Display metadata changes never invalidate registrations.\n if (config.grantType !== \"client_credentials\") {\n if (!config.redirectUri && !config.clientId) {\n const registeredRedirect = storedAuth?.clientInfo?.redirectUris?.[0]\n if (registeredRedirect) config.redirectUri = registeredRedirect\n }\n const redirect = config.redirectUri ? parseOAuthRedirectUri(config.redirectUri) : undefined\n await ensureCallbackServer({\n owner,\n signal,\n strictPort: Boolean(config.clientId || storedAuth?.clientInfo) || config.redirectUri !== undefined,\n oauthState: flow.state.oauthState,\n reserveState: true,\n ...(redirect ? { port: redirect.port, callbackHost: redirect.callbackHost, callbackPath: redirect.callbackPath } : {}),\n })\n throwIfAborted(signal)\n }\n let capturedUrl: URL | undefined\n const authProvider = new McpOAuthProvider(serverName, serverUrl, config, {\n onRedirect: (url) => { throwIfAborted(signal); capturedUrl = url },\n }, flow.state)\n const result = await abortable(runSdkAuth(authProvider, { serverUrl, fetchFn }), signal)\n throwIfAborted(signal)\n if (result === \"AUTHORIZED\") {\n await clearPendingAuth(serverName, flow)\n return { authorizationUrl: \"\" }\n }\n if (config.grantType === \"client_credentials\" || !capturedUrl) {\n throw new UnauthorizedError(\"OAuth authorization URL was not provided\")\n }\n flow.transport = new StreamableHTTPClientTransport(new URL(serverUrl), { authProvider, fetch: fetchFn })\n flow.timer = setTimeout(() => { void clearPendingAuth(serverName, flow) }, MANUAL_AUTH_TIMEOUT_MS)\n flow.timer.unref?.()\n return { authorizationUrl: capturedUrl.toString() }\n } catch (error) {\n await clearPendingAuth(serverName, flow)\n throw error\n }\n }\n\n async function completeAuthFromInput(serverName: string, input: string): Promise<AuthStatus> {\n assertOpen()\n const flow = flows.get(serverName)\n if (!flow) throw new Error(`No pending OAuth flow for server: ${serverName}`)\n return completeAuth(serverName, parseAuthorizationCodeInput(input, flow.state.oauthState))\n }\n\n async function completeAuth(serverName: string, code: string): Promise<AuthStatus> {\n assertOpen()\n const flow = flows.get(serverName)\n if (!flow?.transport) throw new Error(`No pending OAuth flow for server: ${serverName}`)\n try {\n await abortable(flow.transport.finishAuth(code), flow.state.signal)\n throwIfAborted(flow.state.signal)\n return \"authenticated\"\n } finally {\n await clearPendingAuth(serverName, flow)\n }\n }\n\n async function authenticate(\n serverName: string,\n serverUrl: string,\n definition?: ServerEntry,\n options: AuthenticateOptions = {},\n ): Promise<AuthStatus> {\n assertOpen()\n const pending = authenticating.get(serverName)\n if (pending) return pending\n const operation = (async (): Promise<AuthStatus> => {\n const { authorizationUrl } = await startAuth(serverName, serverUrl, definition)\n if (!authorizationUrl) return \"authenticated\"\n assertOpen()\n const flow = flows.get(serverName)\n if (!flow) throw new Error(`No pending OAuth flow for server: ${serverName}`)\n const callback = waitForCallback(flow.state.oauthState)\n // Attach a rejection handler before asynchronous UI/browser handoffs.\n void callback.catch(() => {})\n try {\n if (options.onAuthorizationUrl) {\n await abortable(Promise.resolve(options.onAuthorizationUrl(authorizationUrl)), flow.state.signal)\n } else {\n console.log(`MCP Auth: Open this URL to authenticate ${serverName}:\\n${authorizationUrl}`)\n }\n throwIfAborted(flow.state.signal)\n try {\n await abortable(open(authorizationUrl), flow.state.signal)\n } catch (error) {\n throwIfAborted(flow.state.signal)\n console.warn(`MCP Auth: Failed to open browser for ${serverName}; waiting for manual callback`, { error })\n }\n const code = await callback\n return await completeAuth(serverName, code)\n } catch (error) {\n await clearPendingAuth(serverName, flow)\n throw error\n }\n })()\n authenticating.set(serverName, operation)\n try { return await operation } finally {\n if (authenticating.get(serverName) === operation) authenticating.delete(serverName)\n }\n }\n\n async function removeAuth(serverName: string): Promise<void> {\n assertOpen()\n await clearPendingAuth(serverName)\n clearAllCredentials(serverName)\n }\n\n function shutdown(): Promise<void> {\n if (!shutdownPromise) {\n // Mark closed before cleanup can yield, so stale callers cannot start work.\n closed = true\n shutdownPromise = (async () => {\n await Promise.all([...flows].map(([name, flow]) => clearPendingAuth(name, flow)))\n await releaseCallbackServerOwner(owner)\n })()\n }\n return shutdownPromise\n }\n\n return { startAuth, completeAuth, completeAuthFromInput, authenticate, removeAuth, shutdown }\n}\n\nexport type McpAuthFlow = ReturnType<typeof createMcpAuthFlow>\n\n/**\n * Get a valid access token for a server, refreshing if necessary.\n * \n * @param serverName - The name of the MCP server\n * @param serverUrl - The URL of the MCP server\n * @returns The valid tokens or null if not authenticated\n */\nexport async function getValidToken(\n serverName: string,\n serverUrl: string,\n): Promise<StoredTokens | null> {\n // Check if we have valid tokens\n const entry = await getAuthForUrl(serverName, serverUrl)\n if (!entry?.tokens) {\n return null\n }\n\n // Check expiration\n const expired = await isTokenExpired(serverName)\n if (expired === false) {\n return entry.tokens\n }\n\n if (expired === true && entry.tokens.refreshToken) {\n // Token is expired, try to refresh\n console.log(`MCP Auth: Token expired for ${serverName}, attempting refresh`)\n\n try {\n // Create auth provider for token refresh\n const authProvider = new McpOAuthProvider(serverName, serverUrl, {}, {\n onRedirect: async () => {},\n })\n\n const clientInfo = await authProvider.clientInformation()\n if (!clientInfo) {\n console.log(`MCP Auth: No client info for refresh for ${serverName}`)\n return null\n }\n\n const result = await runSdkAuth(authProvider, { serverUrl })\n if (result !== \"AUTHORIZED\") {\n return null\n }\n const refreshed = await getAuthForUrl(serverName, serverUrl)\n return refreshed?.tokens ?? null\n } catch (error) {\n console.error(`MCP Auth: Token refresh failed for ${serverName}`, { error })\n return null\n }\n }\n\n // No expiration info or no refresh token, assume valid\n return entry.tokens\n}\n\n/**\n * Check the authentication status for a server.\n * \n * @param serverName - The name of the MCP server\n * @returns The current auth status\n */\nexport async function getAuthStatus(serverName: string): Promise<AuthStatus> {\n const hasTokens = await hasStoredTokens(serverName)\n if (!hasTokens) return \"not_authenticated\"\n\n const expired = await isTokenExpired(serverName)\n return expired ? \"expired\" : \"authenticated\"\n}\n\n/**\n * Check if OAuth is supported for a server configuration.\n * OAuth is supported for HTTP servers unless explicitly disabled.\n * \n * @param definition - The server definition\n * @returns True if OAuth is supported\n */\nexport function supportsOAuth(definition: ServerEntry): boolean {\n // OAuth requires a URL\n if (!definition.url) return false\n \n // Explicitly disabled via auth: false or oauth: false\n if (definition.auth === false) return false\n if (definition.oauth === false) return false\n if (definition.auth === \"oauth\") return true\n \n // Configured custom headers take precedence over implicit OAuth auto-detection.\n if (definition.headers && Object.keys(definition.headers).length > 0) return false\n\n // OAuth is enabled when auth is not specified (auto-detect)\n return definition.auth === undefined\n}\n"]}
@@ -5,6 +5,8 @@
5
5
  * Uses Node.js http module for compatibility.
6
6
  */
7
7
  interface EnsureCallbackServerOptions {
8
+ owner?: symbol;
9
+ signal?: AbortSignal;
8
10
  strictPort?: boolean;
9
11
  port?: number;
10
12
  callbackHost?: string;
@@ -12,6 +14,9 @@ interface EnsureCallbackServerOptions {
12
14
  oauthState?: string;
13
15
  reserveState?: boolean;
14
16
  }
17
+ /** Listener ownership survives a completed callback until its session closes. */
18
+ export declare function acquireCallbackServerOwner(): symbol;
19
+ export declare function releaseCallbackServerOwner(owner: symbol): Promise<void>;
15
20
  /**
16
21
  * Ensure the callback server is running.
17
22
  * If strictPort is true, requires binding on the configured callback port.
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-callback-server.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/mcp-callback-server.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AA+EH,UAAU,2BAA2B;IACnC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAiFD;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,GAAE,2BAAgC,GAAG,OAAO,CAAC,IAAI,CAAC,CAcnG;AAoGD,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAE9D;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAE9D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAYnE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAQ9D;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAwBxD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C","sourcesContent":["// @ts-nocheck\n/**\n * MCP OAuth Callback Server\n * \n * HTTP server that handles OAuth callbacks from the authorization server.\n * Uses Node.js http module for compatibility.\n */\n\nimport { createServer, type Server, type IncomingMessage, type ServerResponse } from \"http\"\nimport {\n DEFAULT_OAUTH_CALLBACK_PATH,\n getConfiguredOAuthCallbackPort,\n getOAuthCallbackPath,\n getOAuthCallbackPort,\n setOAuthCallbackPath,\n setOAuthCallbackPort,\n} from \"./mcp-oauth-provider.ts\"\n\n// HTML templates for callback responses\nconst HTML_SUCCESS = `<!DOCTYPE html>\n<html>\n<head>\n <title>Pi - Authorization Successful</title>\n <style>\n 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; }\n .container { text-align: center; padding: 2rem; }\n h1 { color: #4ade80; margin-bottom: 1rem; }\n p { color: #aaa; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h1>Authorization Successful</h1>\n <p>You can close this window and return to Pi.</p>\n </div>\n <script>setTimeout(() => window.close(), 2000);</script>\n</body>\n</html>`\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\")\n}\n\nconst HTML_ERROR = (error: string) => `<!DOCTYPE html>\n<html>\n<head>\n <title>Pi - Authorization Failed</title>\n <style>\n 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; }\n .container { text-align: center; padding: 2rem; }\n h1 { color: #f87171; margin-bottom: 1rem; }\n p { color: #aaa; }\n .error { color: #fca5a5; font-family: monospace; margin-top: 1rem; padding: 1rem; background: rgba(248,113,113,0.1); border-radius: 0.5rem; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h1>Authorization Failed</h1>\n <p>An error occurred during authorization.</p>\n <div class=\"error\">${escapeHtml(error)}</div>\n </div>\n</body>\n</html>`\n\n/** Pending authorization request */\ninterface PendingAuth {\n resolve: (code: string) => void\n reject: (error: Error) => void\n timeout: ReturnType<typeof setTimeout>\n}\n\n/** Server singleton state */\nlet server: Server | undefined\nlet bindingPromise: Promise<void> | undefined\nconst pendingAuths = new Map<string, PendingAuth>()\nconst reservedAuthStates = new Set<string>()\n\n/** Timeout for callback completion (5 minutes) */\nconst CALLBACK_TIMEOUT_MS = 5 * 60 * 1000\n\ninterface EnsureCallbackServerOptions {\n strictPort?: boolean\n port?: number\n callbackHost?: string\n callbackPath?: string\n oauthState?: string\n reserveState?: boolean\n}\n\nconst DEFAULT_OAUTH_CALLBACK_HOST = \"localhost\"\nlet callbackServerHost = DEFAULT_OAUTH_CALLBACK_HOST\n\n/**\n * Handle incoming HTTP requests to the callback server.\n */\nfunction handleRequest(req: IncomingMessage, res: ServerResponse): void {\n const url = new URL(req.url || \"/\", `http://${req.headers.host}`)\n\n // Only handle the callback path\n if (url.pathname !== getOAuthCallbackPath()) {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" })\n res.end(\"Not found\")\n return\n }\n\n const code = url.searchParams.get(\"code\")\n const state = url.searchParams.get(\"state\")\n const error = url.searchParams.get(\"error\")\n const errorDescription = url.searchParams.get(\"error_description\")\n\n // Enforce state parameter presence for CSRF protection\n if (!state) {\n const errorMsg = \"Missing required state parameter - potential CSRF attack\"\n res.writeHead(400, { \"Content-Type\": \"text/html\" })\n res.end(HTML_ERROR(errorMsg))\n return\n }\n\n const pending = pendingAuths.get(state)\n const isReserved = reservedAuthStates.has(state)\n\n // Handle OAuth errors only for a state that belongs to an active flow.\n if (error) {\n if (!pending && !isReserved) {\n const errorMsg = \"Invalid or expired state parameter - potential CSRF attack\"\n res.writeHead(400, { \"Content-Type\": \"text/html\" })\n res.end(HTML_ERROR(errorMsg))\n return\n }\n\n const errorMsg = errorDescription || error\n // Send HTTP response first before rejecting promise\n res.writeHead(200, { \"Content-Type\": \"text/html\" })\n res.end(HTML_ERROR(errorMsg))\n reservedAuthStates.delete(state)\n // Reject promise after response is sent (defer to allow test to attach handler)\n if (pending) {\n clearTimeout(pending.timeout)\n pendingAuths.delete(state)\n setTimeout(() => pending.reject(new Error(errorMsg)), 0)\n }\n return\n }\n\n // Validate state parameter\n if (!pending) {\n const errorMsg = \"Invalid or expired state parameter - potential CSRF attack\"\n res.writeHead(400, { \"Content-Type\": \"text/html\" })\n res.end(HTML_ERROR(errorMsg))\n return\n }\n\n // Require authorization code\n if (!code) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" })\n res.end(HTML_ERROR(\"No authorization code provided\"))\n return\n }\n\n // Clear timeout and resolve the pending promise\n clearTimeout(pending.timeout)\n pendingAuths.delete(state)\n pending.resolve(code)\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" })\n res.end(HTML_SUCCESS)\n}\n\n/**\n * Ensure the callback server is running.\n * If strictPort is true, requires binding on the configured callback port.\n * If strictPort is false, asks the OS for an available local port.\n */\nexport async function ensureCallbackServer(options: EnsureCallbackServerOptions = {}): Promise<void> {\n while (bindingPromise) {\n await bindingPromise\n }\n\n const operation = ensureCallbackServerLocked(options)\n bindingPromise = operation\n try {\n await operation\n } finally {\n if (bindingPromise === operation) {\n bindingPromise = undefined\n }\n }\n}\n\nasync function ensureCallbackServerLocked(options: EnsureCallbackServerOptions = {}): Promise<void> {\n const requiredPort = options.port ?? getConfiguredOAuthCallbackPort()\n const strictPort = options.strictPort === true\n const requestedHost = options.callbackHost ?? DEFAULT_OAUTH_CALLBACK_HOST\n const rawRequestedPath = options.callbackPath ?? DEFAULT_OAUTH_CALLBACK_PATH\n const requestedPath = rawRequestedPath.startsWith(\"/\") ? rawRequestedPath : `/${rawRequestedPath}`\n if (options.reserveState && !options.oauthState) {\n throw new Error(\"OAuth callback reservation requires an oauthState\")\n }\n let reservedState: string | undefined\n\n const previousServer = server\n const needsStrictRebind = Boolean(previousServer && strictPort && getOAuthCallbackPort() !== requiredPort)\n const needsHostSwitch = Boolean(previousServer && callbackServerHost !== requestedHost)\n const needsPathSwitch = Boolean(previousServer && getOAuthCallbackPath() !== requestedPath)\n\n if (previousServer) {\n if (!needsStrictRebind && !needsHostSwitch) {\n if (needsPathSwitch) {\n if (pendingAuths.size > 0 || reservedAuthStates.size > 0) {\n throw new Error(\n `OAuth callback server is using path ${getOAuthCallbackPath()}, but callback path ${requestedPath} is required and cannot be switched while authorizations are pending`\n )\n }\n setOAuthCallbackPath(requestedPath)\n }\n if (options.reserveState && options.oauthState) {\n reservedAuthStates.add(options.oauthState)\n reservedState = options.oauthState\n }\n return\n }\n\n if (pendingAuths.size > 0 || reservedAuthStates.size > 0) {\n throw new Error(\n `OAuth callback server is running on ${callbackServerHost}:${getOAuthCallbackPort()}, but strict callback endpoint ${requestedHost}:${requiredPort} is required and cannot be switched while authorizations are pending`\n )\n }\n }\n\n const candidateServer = createServer(handleRequest)\n const listenPort = strictPort ? requiredPort : 0\n\n try {\n await new Promise<void>((resolve, reject) => {\n candidateServer.once(\"error\", (err) => {\n reject(err)\n })\n\n candidateServer.listen(listenPort, requestedHost, () => {\n resolve()\n })\n })\n\n if (strictPort) {\n setOAuthCallbackPort(requiredPort)\n } else {\n const address = candidateServer.address()\n if (!address || typeof address === \"string\" || typeof address.port !== \"number\") {\n throw new Error(\"OAuth callback server did not report an assigned port\")\n }\n setOAuthCallbackPort(address.port)\n }\n\n if (previousServer && (needsStrictRebind || needsHostSwitch)) {\n await new Promise<void>((resolve) => {\n previousServer.close(() => resolve())\n })\n }\n\n callbackServerHost = requestedHost\n setOAuthCallbackPath(requestedPath)\n server = candidateServer\n if (options.reserveState && options.oauthState) {\n reservedAuthStates.add(options.oauthState)\n reservedState = options.oauthState\n }\n server.unref()\n } catch (error) {\n if (reservedState) {\n reservedAuthStates.delete(reservedState)\n }\n const nodeError = error as NodeJS.ErrnoException\n await new Promise<void>((resolve) => {\n candidateServer.close(() => resolve())\n })\n\n if (strictPort && nodeError.code === \"EADDRINUSE\") {\n throw new Error(\n `OAuth callback port ${requiredPort} is already in use. Pre-registered OAuth clients require an exact redirect URI; set MCP_OAUTH_CALLBACK_PORT to your registered port or free port ${requiredPort}`,\n { cause: error }\n )\n }\n\n throw error\n }\n}\n\nexport function reserveCallbackServer(oauthState: string): void {\n reservedAuthStates.add(oauthState)\n}\n\nexport function releaseCallbackServer(oauthState: string): void {\n reservedAuthStates.delete(oauthState)\n}\n\n/**\n * Wait for a callback with the given OAuth state.\n * Returns a promise that resolves with the authorization code.\n */\nexport function waitForCallback(oauthState: string): Promise<string> {\n reservedAuthStates.delete(oauthState)\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n if (pendingAuths.has(oauthState)) {\n pendingAuths.delete(oauthState)\n reject(new Error(\"OAuth callback timeout - authorization took too long\"))\n }\n }, CALLBACK_TIMEOUT_MS)\n\n pendingAuths.set(oauthState, { resolve, reject, timeout })\n })\n}\n\n/**\n * Cancel a pending authorization by state.\n */\nexport function cancelPendingCallback(oauthState: string): void {\n reservedAuthStates.delete(oauthState)\n const pending = pendingAuths.get(oauthState)\n if (pending) {\n clearTimeout(pending.timeout)\n pendingAuths.delete(oauthState)\n pending.reject(new Error(\"Authorization cancelled\"))\n }\n}\n\n/**\n * Stop the callback server and reject all pending authorizations.\n */\nexport async function stopCallbackServer(): Promise<void> {\n if (server) {\n await new Promise<void>((resolve) => {\n server!.close(() => {\n resolve()\n })\n })\n server = undefined\n }\n\n setOAuthCallbackPort(getConfiguredOAuthCallbackPort())\n callbackServerHost = DEFAULT_OAUTH_CALLBACK_HOST\n setOAuthCallbackPath(DEFAULT_OAUTH_CALLBACK_PATH)\n\n // Reject all pending auths (defer to allow any pending operations to complete)\n const pendingList = Array.from(pendingAuths.entries())\n pendingAuths.clear()\n reservedAuthStates.clear()\n setTimeout(() => {\n for (const [, pending] of pendingList) {\n clearTimeout(pending.timeout)\n pending.reject(new Error(\"OAuth callback server stopped\"))\n }\n }, 0)\n}\n\n/**\n * Check if the callback server is running.\n */\nexport function isCallbackServerRunning(): boolean {\n return server !== undefined\n}\n\n/**\n * Get the number of pending authorizations.\n */\nexport function getPendingAuthCount(): number {\n return pendingAuths.size\n}\n"]}
1
+ {"version":3,"file":"mcp-callback-server.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/mcp-callback-server.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAiFH,UAAU,2BAA2B;IACnC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAmGD,iFAAiF;AACjF,wBAAgB,0BAA0B,IAAI,MAAM,CAInD;AAED,wBAAsB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK7E;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,GAAE,2BAAgC,GAAG,OAAO,CAAC,IAAI,CAAC,CAOnG;AAqGD,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAE9D;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAE9D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAYnE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAQ9D;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAExD;AA4BD;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C","sourcesContent":["// @ts-nocheck\n/**\n * MCP OAuth Callback Server\n * \n * HTTP server that handles OAuth callbacks from the authorization server.\n * Uses Node.js http module for compatibility.\n */\n\nimport { createServer, type Server, type IncomingMessage, type ServerResponse } from \"http\"\nimport { throwIfAborted } from \"./abort.ts\"\nimport {\n DEFAULT_OAUTH_CALLBACK_PATH,\n getConfiguredOAuthCallbackPort,\n getOAuthCallbackPath,\n getOAuthCallbackPort,\n setOAuthCallbackPath,\n setOAuthCallbackPort,\n} from \"./mcp-oauth-provider.ts\"\n\n// HTML templates for callback responses\nconst HTML_SUCCESS = `<!DOCTYPE html>\n<html>\n<head>\n <title>lunR - Authorization Successful</title>\n <style>\n 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; }\n .container { text-align: center; padding: 2rem; }\n h1 { color: #4ade80; margin-bottom: 1rem; }\n p { color: #aaa; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h1>Authorization Successful</h1>\n <p>You can close this window and return to lunR.</p>\n </div>\n <script>setTimeout(() => window.close(), 2000);</script>\n</body>\n</html>`\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\")\n}\n\nconst HTML_ERROR = (error: string) => `<!DOCTYPE html>\n<html>\n<head>\n <title>lunR - Authorization Failed</title>\n <style>\n 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; }\n .container { text-align: center; padding: 2rem; }\n h1 { color: #f87171; margin-bottom: 1rem; }\n p { color: #aaa; }\n .error { color: #fca5a5; font-family: monospace; margin-top: 1rem; padding: 1rem; background: rgba(248,113,113,0.1); border-radius: 0.5rem; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h1>Authorization Failed</h1>\n <p>An error occurred during authorization.</p>\n <div class=\"error\">${escapeHtml(error)}</div>\n </div>\n</body>\n</html>`\n\n/** Pending authorization request */\ninterface PendingAuth {\n resolve: (code: string) => void\n reject: (error: Error) => void\n timeout: ReturnType<typeof setTimeout>\n}\n\n/** Server singleton state */\nlet server: Server | undefined\nlet bindingPromise: Promise<void> | undefined\nconst pendingAuths = new Map<string, PendingAuth>()\nconst reservedAuthStates = new Set<string>()\nconst callbackOwners = new Set<symbol>()\n\n/** Timeout for callback completion (5 minutes) */\nconst CALLBACK_TIMEOUT_MS = 5 * 60 * 1000\n\ninterface EnsureCallbackServerOptions {\n owner?: symbol\n signal?: AbortSignal\n strictPort?: boolean\n port?: number\n callbackHost?: string\n callbackPath?: string\n oauthState?: string\n reserveState?: boolean\n}\n\nconst DEFAULT_OAUTH_CALLBACK_HOST = \"localhost\"\nlet callbackServerHost = DEFAULT_OAUTH_CALLBACK_HOST\n\n/**\n * Handle incoming HTTP requests to the callback server.\n */\nfunction handleRequest(req: IncomingMessage, res: ServerResponse): void {\n const url = new URL(req.url || \"/\", `http://${req.headers.host}`)\n\n // Only handle the callback path\n if (url.pathname !== getOAuthCallbackPath()) {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" })\n res.end(\"Not found\")\n return\n }\n\n const code = url.searchParams.get(\"code\")\n const state = url.searchParams.get(\"state\")\n const error = url.searchParams.get(\"error\")\n const errorDescription = url.searchParams.get(\"error_description\")\n\n // Enforce state parameter presence for CSRF protection\n if (!state) {\n const errorMsg = \"Missing required state parameter - potential CSRF attack\"\n res.writeHead(400, { \"Content-Type\": \"text/html\" })\n res.end(HTML_ERROR(errorMsg))\n return\n }\n\n const pending = pendingAuths.get(state)\n const isReserved = reservedAuthStates.has(state)\n\n // Handle OAuth errors only for a state that belongs to an active flow.\n if (error) {\n if (!pending && !isReserved) {\n const errorMsg = \"Invalid or expired state parameter - potential CSRF attack\"\n res.writeHead(400, { \"Content-Type\": \"text/html\" })\n res.end(HTML_ERROR(errorMsg))\n return\n }\n\n const errorMsg = errorDescription || error\n // Send HTTP response first before rejecting promise\n res.writeHead(200, { \"Content-Type\": \"text/html\" })\n res.end(HTML_ERROR(errorMsg))\n reservedAuthStates.delete(state)\n // Reject promise after response is sent (defer to allow test to attach handler)\n if (pending) {\n clearTimeout(pending.timeout)\n pendingAuths.delete(state)\n setTimeout(() => pending.reject(new Error(errorMsg)), 0)\n }\n return\n }\n\n // Validate state parameter\n if (!pending) {\n const errorMsg = \"Invalid or expired state parameter - potential CSRF attack\"\n res.writeHead(400, { \"Content-Type\": \"text/html\" })\n res.end(HTML_ERROR(errorMsg))\n return\n }\n\n // Require authorization code\n if (!code) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" })\n res.end(HTML_ERROR(\"No authorization code provided\"))\n return\n }\n\n // Clear timeout and resolve the pending promise\n clearTimeout(pending.timeout)\n pendingAuths.delete(state)\n pending.resolve(code)\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" })\n res.end(HTML_SUCCESS)\n}\n\n/** Serialize listener binding and final-owner release. */\nasync function withCallbackLock(action: () => Promise<void>): Promise<void> {\n while (bindingPromise) {\n // A failed bind belongs to its caller, not to the next owner in the queue.\n await bindingPromise.catch(() => {})\n }\n\n const operation = action()\n bindingPromise = operation\n try {\n await operation\n } finally {\n if (bindingPromise === operation) {\n bindingPromise = undefined\n }\n }\n}\n\n/** Listener ownership survives a completed callback until its session closes. */\nexport function acquireCallbackServerOwner(): symbol {\n const owner = Symbol(\"MCP OAuth owner\")\n callbackOwners.add(owner)\n return owner\n}\n\nexport async function releaseCallbackServerOwner(owner: symbol): Promise<void> {\n await withCallbackLock(async () => {\n callbackOwners.delete(owner)\n if (callbackOwners.size === 0) await stopCallbackServerLocked()\n })\n}\n\n/**\n * Ensure the callback server is running.\n * If strictPort is true, requires binding on the configured callback port.\n * If strictPort is false, asks the OS for an available local port.\n */\nexport async function ensureCallbackServer(options: EnsureCallbackServerOptions = {}): Promise<void> {\n await withCallbackLock(async () => {\n throwIfAborted(options.signal)\n if (options.owner && !callbackOwners.has(options.owner)) throw new Error(\"MCP OAuth session closed\")\n await ensureCallbackServerLocked(options)\n throwIfAborted(options.signal)\n })\n}\n\nasync function ensureCallbackServerLocked(options: EnsureCallbackServerOptions = {}): Promise<void> {\n const requiredPort = options.port ?? getConfiguredOAuthCallbackPort()\n const strictPort = options.strictPort === true\n const requestedHost = options.callbackHost ?? DEFAULT_OAUTH_CALLBACK_HOST\n const rawRequestedPath = options.callbackPath ?? DEFAULT_OAUTH_CALLBACK_PATH\n const requestedPath = rawRequestedPath.startsWith(\"/\") ? rawRequestedPath : `/${rawRequestedPath}`\n if (options.reserveState && !options.oauthState) {\n throw new Error(\"OAuth callback reservation requires an oauthState\")\n }\n let reservedState: string | undefined\n\n const previousServer = server\n const needsStrictRebind = Boolean(previousServer && strictPort && getOAuthCallbackPort() !== requiredPort)\n const needsHostSwitch = Boolean(previousServer && callbackServerHost !== requestedHost)\n const needsPathSwitch = Boolean(previousServer && getOAuthCallbackPath() !== requestedPath)\n\n if (previousServer) {\n if (!needsStrictRebind && !needsHostSwitch) {\n if (needsPathSwitch) {\n if (pendingAuths.size > 0 || reservedAuthStates.size > 0) {\n throw new Error(\n `OAuth callback server is using path ${getOAuthCallbackPath()}, but callback path ${requestedPath} is required and cannot be switched while authorizations are pending`\n )\n }\n setOAuthCallbackPath(requestedPath)\n }\n if (options.reserveState && options.oauthState && !options.signal?.aborted) {\n reservedAuthStates.add(options.oauthState)\n reservedState = options.oauthState\n }\n return\n }\n\n if (pendingAuths.size > 0 || reservedAuthStates.size > 0) {\n throw new Error(\n `OAuth callback server is running on ${callbackServerHost}:${getOAuthCallbackPort()}, but strict callback endpoint ${requestedHost}:${requiredPort} is required and cannot be switched while authorizations are pending`\n )\n }\n }\n\n const candidateServer = createServer(handleRequest)\n const listenPort = strictPort ? requiredPort : 0\n\n try {\n await new Promise<void>((resolve, reject) => {\n candidateServer.once(\"error\", (err) => {\n reject(err)\n })\n\n candidateServer.listen(listenPort, requestedHost, () => {\n resolve()\n })\n })\n\n if (strictPort) {\n setOAuthCallbackPort(requiredPort)\n } else {\n const address = candidateServer.address()\n if (!address || typeof address === \"string\" || typeof address.port !== \"number\") {\n throw new Error(\"OAuth callback server did not report an assigned port\")\n }\n setOAuthCallbackPort(address.port)\n }\n\n if (previousServer && (needsStrictRebind || needsHostSwitch)) {\n await new Promise<void>((resolve) => {\n previousServer.close(() => resolve())\n })\n }\n\n callbackServerHost = requestedHost\n setOAuthCallbackPath(requestedPath)\n server = candidateServer\n // Flow cleanup can finish while binding yields. Never reserve its canceled state afterward.\n if (options.reserveState && options.oauthState && !options.signal?.aborted) {\n reservedAuthStates.add(options.oauthState)\n reservedState = options.oauthState\n }\n server.unref()\n } catch (error) {\n if (reservedState) {\n reservedAuthStates.delete(reservedState)\n }\n const nodeError = error as NodeJS.ErrnoException\n await new Promise<void>((resolve) => {\n candidateServer.close(() => resolve())\n })\n\n if (strictPort && nodeError.code === \"EADDRINUSE\") {\n throw new Error(\n `OAuth callback port ${requiredPort} is already in use. Pre-registered OAuth clients require an exact redirect URI; set MCP_OAUTH_CALLBACK_PORT to your registered port or free port ${requiredPort}`,\n { cause: error }\n )\n }\n\n throw error\n }\n}\n\nexport function reserveCallbackServer(oauthState: string): void {\n reservedAuthStates.add(oauthState)\n}\n\nexport function releaseCallbackServer(oauthState: string): void {\n reservedAuthStates.delete(oauthState)\n}\n\n/**\n * Wait for a callback with the given OAuth state.\n * Returns a promise that resolves with the authorization code.\n */\nexport function waitForCallback(oauthState: string): Promise<string> {\n reservedAuthStates.delete(oauthState)\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n if (pendingAuths.has(oauthState)) {\n pendingAuths.delete(oauthState)\n reject(new Error(\"OAuth callback timeout - authorization took too long\"))\n }\n }, CALLBACK_TIMEOUT_MS)\n\n pendingAuths.set(oauthState, { resolve, reject, timeout })\n })\n}\n\n/**\n * Cancel a pending authorization by state.\n */\nexport function cancelPendingCallback(oauthState: string): void {\n reservedAuthStates.delete(oauthState)\n const pending = pendingAuths.get(oauthState)\n if (pending) {\n clearTimeout(pending.timeout)\n pendingAuths.delete(oauthState)\n pending.reject(new Error(\"Authorization cancelled\"))\n }\n}\n\n/**\n * Stop the callback server and reject all pending authorizations.\n */\nexport async function stopCallbackServer(): Promise<void> {\n await withCallbackLock(stopCallbackServerLocked)\n}\n\nasync function stopCallbackServerLocked(): Promise<void> {\n if (server) {\n await new Promise<void>((resolve) => {\n server!.close(() => {\n resolve()\n })\n })\n server = undefined\n }\n\n setOAuthCallbackPort(getConfiguredOAuthCallbackPort())\n callbackServerHost = DEFAULT_OAUTH_CALLBACK_HOST\n setOAuthCallbackPath(DEFAULT_OAUTH_CALLBACK_PATH)\n\n // Reject all pending auths (defer to allow any pending operations to complete)\n const pendingList = Array.from(pendingAuths.entries())\n pendingAuths.clear()\n reservedAuthStates.clear()\n setTimeout(() => {\n for (const [, pending] of pendingList) {\n clearTimeout(pending.timeout)\n pending.reject(new Error(\"OAuth callback server stopped\"))\n }\n }, 0)\n}\n\n/**\n * Check if the callback server is running.\n */\nexport function isCallbackServerRunning(): boolean {\n return server !== undefined\n}\n\n/**\n * Get the number of pending authorizations.\n */\nexport function getPendingAuthCount(): number {\n return pendingAuths.size\n}\n"]}
@@ -6,12 +6,13 @@
6
6
  * Uses Node.js http module for compatibility.
7
7
  */
8
8
  import { createServer } from "http";
9
+ import { throwIfAborted } from "./abort.js";
9
10
  import { DEFAULT_OAUTH_CALLBACK_PATH, getConfiguredOAuthCallbackPort, getOAuthCallbackPath, getOAuthCallbackPort, setOAuthCallbackPath, setOAuthCallbackPort, } from "./mcp-oauth-provider.js";
10
11
  // HTML templates for callback responses
11
12
  const HTML_SUCCESS = `<!DOCTYPE html>
12
13
  <html>
13
14
  <head>
14
- <title>Pi - Authorization Successful</title>
15
+ <title>lunR - Authorization Successful</title>
15
16
  <style>
16
17
  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; }
17
18
  .container { text-align: center; padding: 2rem; }
@@ -22,7 +23,7 @@ const HTML_SUCCESS = `<!DOCTYPE html>
22
23
  <body>
23
24
  <div class="container">
24
25
  <h1>Authorization Successful</h1>
25
- <p>You can close this window and return to Pi.</p>
26
+ <p>You can close this window and return to lunR.</p>
26
27
  </div>
27
28
  <script>setTimeout(() => window.close(), 2000);</script>
28
29
  </body>
@@ -38,7 +39,7 @@ function escapeHtml(value) {
38
39
  const HTML_ERROR = (error) => `<!DOCTYPE html>
39
40
  <html>
40
41
  <head>
41
- <title>Pi - Authorization Failed</title>
42
+ <title>lunR - Authorization Failed</title>
42
43
  <style>
43
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; }
44
45
  .container { text-align: center; padding: 2rem; }
@@ -60,6 +61,7 @@ let server;
60
61
  let bindingPromise;
61
62
  const pendingAuths = new Map();
62
63
  const reservedAuthStates = new Set();
64
+ const callbackOwners = new Set();
63
65
  /** Timeout for callback completion (5 minutes) */
64
66
  const CALLBACK_TIMEOUT_MS = 5 * 60 * 1000;
65
67
  const DEFAULT_OAUTH_CALLBACK_HOST = "localhost";
@@ -129,16 +131,13 @@ function handleRequest(req, res) {
129
131
  res.writeHead(200, { "Content-Type": "text/html" });
130
132
  res.end(HTML_SUCCESS);
131
133
  }
132
- /**
133
- * Ensure the callback server is running.
134
- * If strictPort is true, requires binding on the configured callback port.
135
- * If strictPort is false, asks the OS for an available local port.
136
- */
137
- export async function ensureCallbackServer(options = {}) {
134
+ /** Serialize listener binding and final-owner release. */
135
+ async function withCallbackLock(action) {
138
136
  while (bindingPromise) {
139
- await bindingPromise;
137
+ // A failed bind belongs to its caller, not to the next owner in the queue.
138
+ await bindingPromise.catch(() => { });
140
139
  }
141
- const operation = ensureCallbackServerLocked(options);
140
+ const operation = action();
142
141
  bindingPromise = operation;
143
142
  try {
144
143
  await operation;
@@ -149,6 +148,33 @@ export async function ensureCallbackServer(options = {}) {
149
148
  }
150
149
  }
151
150
  }
151
+ /** Listener ownership survives a completed callback until its session closes. */
152
+ export function acquireCallbackServerOwner() {
153
+ const owner = Symbol("MCP OAuth owner");
154
+ callbackOwners.add(owner);
155
+ return owner;
156
+ }
157
+ export async function releaseCallbackServerOwner(owner) {
158
+ await withCallbackLock(async () => {
159
+ callbackOwners.delete(owner);
160
+ if (callbackOwners.size === 0)
161
+ await stopCallbackServerLocked();
162
+ });
163
+ }
164
+ /**
165
+ * Ensure the callback server is running.
166
+ * If strictPort is true, requires binding on the configured callback port.
167
+ * If strictPort is false, asks the OS for an available local port.
168
+ */
169
+ export async function ensureCallbackServer(options = {}) {
170
+ await withCallbackLock(async () => {
171
+ throwIfAborted(options.signal);
172
+ if (options.owner && !callbackOwners.has(options.owner))
173
+ throw new Error("MCP OAuth session closed");
174
+ await ensureCallbackServerLocked(options);
175
+ throwIfAborted(options.signal);
176
+ });
177
+ }
152
178
  async function ensureCallbackServerLocked(options = {}) {
153
179
  const requiredPort = options.port ?? getConfiguredOAuthCallbackPort();
154
180
  const strictPort = options.strictPort === true;
@@ -171,7 +197,7 @@ async function ensureCallbackServerLocked(options = {}) {
171
197
  }
172
198
  setOAuthCallbackPath(requestedPath);
173
199
  }
174
- if (options.reserveState && options.oauthState) {
200
+ if (options.reserveState && options.oauthState && !options.signal?.aborted) {
175
201
  reservedAuthStates.add(options.oauthState);
176
202
  reservedState = options.oauthState;
177
203
  }
@@ -210,7 +236,8 @@ async function ensureCallbackServerLocked(options = {}) {
210
236
  callbackServerHost = requestedHost;
211
237
  setOAuthCallbackPath(requestedPath);
212
238
  server = candidateServer;
213
- if (options.reserveState && options.oauthState) {
239
+ // Flow cleanup can finish while binding yields. Never reserve its canceled state afterward.
240
+ if (options.reserveState && options.oauthState && !options.signal?.aborted) {
214
241
  reservedAuthStates.add(options.oauthState);
215
242
  reservedState = options.oauthState;
216
243
  }
@@ -268,6 +295,9 @@ export function cancelPendingCallback(oauthState) {
268
295
  * Stop the callback server and reject all pending authorizations.
269
296
  */
270
297
  export async function stopCallbackServer() {
298
+ await withCallbackLock(stopCallbackServerLocked);
299
+ }
300
+ async function stopCallbackServerLocked() {
271
301
  if (server) {
272
302
  await new Promise((resolve) => {
273
303
  server.close(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-callback-server.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/mcp-callback-server.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * MCP OAuth Callback Server\n * \n * HTTP server that handles OAuth callbacks from the authorization server.\n * Uses Node.js http module for compatibility.\n */\n\nimport { createServer, type Server, type IncomingMessage, type ServerResponse } from \"http\"\nimport {\n DEFAULT_OAUTH_CALLBACK_PATH,\n getConfiguredOAuthCallbackPort,\n getOAuthCallbackPath,\n getOAuthCallbackPort,\n setOAuthCallbackPath,\n setOAuthCallbackPort,\n} from \"./mcp-oauth-provider.ts\"\n\n// HTML templates for callback responses\nconst HTML_SUCCESS = `<!DOCTYPE html>\n<html>\n<head>\n <title>Pi - Authorization Successful</title>\n <style>\n 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; }\n .container { text-align: center; padding: 2rem; }\n h1 { color: #4ade80; margin-bottom: 1rem; }\n p { color: #aaa; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h1>Authorization Successful</h1>\n <p>You can close this window and return to Pi.</p>\n </div>\n <script>setTimeout(() => window.close(), 2000);</script>\n</body>\n</html>`\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\")\n}\n\nconst HTML_ERROR = (error: string) => `<!DOCTYPE html>\n<html>\n<head>\n <title>Pi - Authorization Failed</title>\n <style>\n 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; }\n .container { text-align: center; padding: 2rem; }\n h1 { color: #f87171; margin-bottom: 1rem; }\n p { color: #aaa; }\n .error { color: #fca5a5; font-family: monospace; margin-top: 1rem; padding: 1rem; background: rgba(248,113,113,0.1); border-radius: 0.5rem; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h1>Authorization Failed</h1>\n <p>An error occurred during authorization.</p>\n <div class=\"error\">${escapeHtml(error)}</div>\n </div>\n</body>\n</html>`\n\n/** Pending authorization request */\ninterface PendingAuth {\n resolve: (code: string) => void\n reject: (error: Error) => void\n timeout: ReturnType<typeof setTimeout>\n}\n\n/** Server singleton state */\nlet server: Server | undefined\nlet bindingPromise: Promise<void> | undefined\nconst pendingAuths = new Map<string, PendingAuth>()\nconst reservedAuthStates = new Set<string>()\n\n/** Timeout for callback completion (5 minutes) */\nconst CALLBACK_TIMEOUT_MS = 5 * 60 * 1000\n\ninterface EnsureCallbackServerOptions {\n strictPort?: boolean\n port?: number\n callbackHost?: string\n callbackPath?: string\n oauthState?: string\n reserveState?: boolean\n}\n\nconst DEFAULT_OAUTH_CALLBACK_HOST = \"localhost\"\nlet callbackServerHost = DEFAULT_OAUTH_CALLBACK_HOST\n\n/**\n * Handle incoming HTTP requests to the callback server.\n */\nfunction handleRequest(req: IncomingMessage, res: ServerResponse): void {\n const url = new URL(req.url || \"/\", `http://${req.headers.host}`)\n\n // Only handle the callback path\n if (url.pathname !== getOAuthCallbackPath()) {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" })\n res.end(\"Not found\")\n return\n }\n\n const code = url.searchParams.get(\"code\")\n const state = url.searchParams.get(\"state\")\n const error = url.searchParams.get(\"error\")\n const errorDescription = url.searchParams.get(\"error_description\")\n\n // Enforce state parameter presence for CSRF protection\n if (!state) {\n const errorMsg = \"Missing required state parameter - potential CSRF attack\"\n res.writeHead(400, { \"Content-Type\": \"text/html\" })\n res.end(HTML_ERROR(errorMsg))\n return\n }\n\n const pending = pendingAuths.get(state)\n const isReserved = reservedAuthStates.has(state)\n\n // Handle OAuth errors only for a state that belongs to an active flow.\n if (error) {\n if (!pending && !isReserved) {\n const errorMsg = \"Invalid or expired state parameter - potential CSRF attack\"\n res.writeHead(400, { \"Content-Type\": \"text/html\" })\n res.end(HTML_ERROR(errorMsg))\n return\n }\n\n const errorMsg = errorDescription || error\n // Send HTTP response first before rejecting promise\n res.writeHead(200, { \"Content-Type\": \"text/html\" })\n res.end(HTML_ERROR(errorMsg))\n reservedAuthStates.delete(state)\n // Reject promise after response is sent (defer to allow test to attach handler)\n if (pending) {\n clearTimeout(pending.timeout)\n pendingAuths.delete(state)\n setTimeout(() => pending.reject(new Error(errorMsg)), 0)\n }\n return\n }\n\n // Validate state parameter\n if (!pending) {\n const errorMsg = \"Invalid or expired state parameter - potential CSRF attack\"\n res.writeHead(400, { \"Content-Type\": \"text/html\" })\n res.end(HTML_ERROR(errorMsg))\n return\n }\n\n // Require authorization code\n if (!code) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" })\n res.end(HTML_ERROR(\"No authorization code provided\"))\n return\n }\n\n // Clear timeout and resolve the pending promise\n clearTimeout(pending.timeout)\n pendingAuths.delete(state)\n pending.resolve(code)\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" })\n res.end(HTML_SUCCESS)\n}\n\n/**\n * Ensure the callback server is running.\n * If strictPort is true, requires binding on the configured callback port.\n * If strictPort is false, asks the OS for an available local port.\n */\nexport async function ensureCallbackServer(options: EnsureCallbackServerOptions = {}): Promise<void> {\n while (bindingPromise) {\n await bindingPromise\n }\n\n const operation = ensureCallbackServerLocked(options)\n bindingPromise = operation\n try {\n await operation\n } finally {\n if (bindingPromise === operation) {\n bindingPromise = undefined\n }\n }\n}\n\nasync function ensureCallbackServerLocked(options: EnsureCallbackServerOptions = {}): Promise<void> {\n const requiredPort = options.port ?? getConfiguredOAuthCallbackPort()\n const strictPort = options.strictPort === true\n const requestedHost = options.callbackHost ?? DEFAULT_OAUTH_CALLBACK_HOST\n const rawRequestedPath = options.callbackPath ?? DEFAULT_OAUTH_CALLBACK_PATH\n const requestedPath = rawRequestedPath.startsWith(\"/\") ? rawRequestedPath : `/${rawRequestedPath}`\n if (options.reserveState && !options.oauthState) {\n throw new Error(\"OAuth callback reservation requires an oauthState\")\n }\n let reservedState: string | undefined\n\n const previousServer = server\n const needsStrictRebind = Boolean(previousServer && strictPort && getOAuthCallbackPort() !== requiredPort)\n const needsHostSwitch = Boolean(previousServer && callbackServerHost !== requestedHost)\n const needsPathSwitch = Boolean(previousServer && getOAuthCallbackPath() !== requestedPath)\n\n if (previousServer) {\n if (!needsStrictRebind && !needsHostSwitch) {\n if (needsPathSwitch) {\n if (pendingAuths.size > 0 || reservedAuthStates.size > 0) {\n throw new Error(\n `OAuth callback server is using path ${getOAuthCallbackPath()}, but callback path ${requestedPath} is required and cannot be switched while authorizations are pending`\n )\n }\n setOAuthCallbackPath(requestedPath)\n }\n if (options.reserveState && options.oauthState) {\n reservedAuthStates.add(options.oauthState)\n reservedState = options.oauthState\n }\n return\n }\n\n if (pendingAuths.size > 0 || reservedAuthStates.size > 0) {\n throw new Error(\n `OAuth callback server is running on ${callbackServerHost}:${getOAuthCallbackPort()}, but strict callback endpoint ${requestedHost}:${requiredPort} is required and cannot be switched while authorizations are pending`\n )\n }\n }\n\n const candidateServer = createServer(handleRequest)\n const listenPort = strictPort ? requiredPort : 0\n\n try {\n await new Promise<void>((resolve, reject) => {\n candidateServer.once(\"error\", (err) => {\n reject(err)\n })\n\n candidateServer.listen(listenPort, requestedHost, () => {\n resolve()\n })\n })\n\n if (strictPort) {\n setOAuthCallbackPort(requiredPort)\n } else {\n const address = candidateServer.address()\n if (!address || typeof address === \"string\" || typeof address.port !== \"number\") {\n throw new Error(\"OAuth callback server did not report an assigned port\")\n }\n setOAuthCallbackPort(address.port)\n }\n\n if (previousServer && (needsStrictRebind || needsHostSwitch)) {\n await new Promise<void>((resolve) => {\n previousServer.close(() => resolve())\n })\n }\n\n callbackServerHost = requestedHost\n setOAuthCallbackPath(requestedPath)\n server = candidateServer\n if (options.reserveState && options.oauthState) {\n reservedAuthStates.add(options.oauthState)\n reservedState = options.oauthState\n }\n server.unref()\n } catch (error) {\n if (reservedState) {\n reservedAuthStates.delete(reservedState)\n }\n const nodeError = error as NodeJS.ErrnoException\n await new Promise<void>((resolve) => {\n candidateServer.close(() => resolve())\n })\n\n if (strictPort && nodeError.code === \"EADDRINUSE\") {\n throw new Error(\n `OAuth callback port ${requiredPort} is already in use. Pre-registered OAuth clients require an exact redirect URI; set MCP_OAUTH_CALLBACK_PORT to your registered port or free port ${requiredPort}`,\n { cause: error }\n )\n }\n\n throw error\n }\n}\n\nexport function reserveCallbackServer(oauthState: string): void {\n reservedAuthStates.add(oauthState)\n}\n\nexport function releaseCallbackServer(oauthState: string): void {\n reservedAuthStates.delete(oauthState)\n}\n\n/**\n * Wait for a callback with the given OAuth state.\n * Returns a promise that resolves with the authorization code.\n */\nexport function waitForCallback(oauthState: string): Promise<string> {\n reservedAuthStates.delete(oauthState)\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n if (pendingAuths.has(oauthState)) {\n pendingAuths.delete(oauthState)\n reject(new Error(\"OAuth callback timeout - authorization took too long\"))\n }\n }, CALLBACK_TIMEOUT_MS)\n\n pendingAuths.set(oauthState, { resolve, reject, timeout })\n })\n}\n\n/**\n * Cancel a pending authorization by state.\n */\nexport function cancelPendingCallback(oauthState: string): void {\n reservedAuthStates.delete(oauthState)\n const pending = pendingAuths.get(oauthState)\n if (pending) {\n clearTimeout(pending.timeout)\n pendingAuths.delete(oauthState)\n pending.reject(new Error(\"Authorization cancelled\"))\n }\n}\n\n/**\n * Stop the callback server and reject all pending authorizations.\n */\nexport async function stopCallbackServer(): Promise<void> {\n if (server) {\n await new Promise<void>((resolve) => {\n server!.close(() => {\n resolve()\n })\n })\n server = undefined\n }\n\n setOAuthCallbackPort(getConfiguredOAuthCallbackPort())\n callbackServerHost = DEFAULT_OAUTH_CALLBACK_HOST\n setOAuthCallbackPath(DEFAULT_OAUTH_CALLBACK_PATH)\n\n // Reject all pending auths (defer to allow any pending operations to complete)\n const pendingList = Array.from(pendingAuths.entries())\n pendingAuths.clear()\n reservedAuthStates.clear()\n setTimeout(() => {\n for (const [, pending] of pendingList) {\n clearTimeout(pending.timeout)\n pending.reject(new Error(\"OAuth callback server stopped\"))\n }\n }, 0)\n}\n\n/**\n * Check if the callback server is running.\n */\nexport function isCallbackServerRunning(): boolean {\n return server !== undefined\n}\n\n/**\n * Get the number of pending authorizations.\n */\nexport function getPendingAuthCount(): number {\n return pendingAuths.size\n}\n"]}
1
+ {"version":3,"file":"mcp-callback-server.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/mcp-callback-server.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * MCP OAuth Callback Server\n * \n * HTTP server that handles OAuth callbacks from the authorization server.\n * Uses Node.js http module for compatibility.\n */\n\nimport { createServer, type Server, type IncomingMessage, type ServerResponse } from \"http\"\nimport { throwIfAborted } from \"./abort.ts\"\nimport {\n DEFAULT_OAUTH_CALLBACK_PATH,\n getConfiguredOAuthCallbackPort,\n getOAuthCallbackPath,\n getOAuthCallbackPort,\n setOAuthCallbackPath,\n setOAuthCallbackPort,\n} from \"./mcp-oauth-provider.ts\"\n\n// HTML templates for callback responses\nconst HTML_SUCCESS = `<!DOCTYPE html>\n<html>\n<head>\n <title>lunR - Authorization Successful</title>\n <style>\n 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; }\n .container { text-align: center; padding: 2rem; }\n h1 { color: #4ade80; margin-bottom: 1rem; }\n p { color: #aaa; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h1>Authorization Successful</h1>\n <p>You can close this window and return to lunR.</p>\n </div>\n <script>setTimeout(() => window.close(), 2000);</script>\n</body>\n</html>`\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\")\n}\n\nconst HTML_ERROR = (error: string) => `<!DOCTYPE html>\n<html>\n<head>\n <title>lunR - Authorization Failed</title>\n <style>\n 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; }\n .container { text-align: center; padding: 2rem; }\n h1 { color: #f87171; margin-bottom: 1rem; }\n p { color: #aaa; }\n .error { color: #fca5a5; font-family: monospace; margin-top: 1rem; padding: 1rem; background: rgba(248,113,113,0.1); border-radius: 0.5rem; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h1>Authorization Failed</h1>\n <p>An error occurred during authorization.</p>\n <div class=\"error\">${escapeHtml(error)}</div>\n </div>\n</body>\n</html>`\n\n/** Pending authorization request */\ninterface PendingAuth {\n resolve: (code: string) => void\n reject: (error: Error) => void\n timeout: ReturnType<typeof setTimeout>\n}\n\n/** Server singleton state */\nlet server: Server | undefined\nlet bindingPromise: Promise<void> | undefined\nconst pendingAuths = new Map<string, PendingAuth>()\nconst reservedAuthStates = new Set<string>()\nconst callbackOwners = new Set<symbol>()\n\n/** Timeout for callback completion (5 minutes) */\nconst CALLBACK_TIMEOUT_MS = 5 * 60 * 1000\n\ninterface EnsureCallbackServerOptions {\n owner?: symbol\n signal?: AbortSignal\n strictPort?: boolean\n port?: number\n callbackHost?: string\n callbackPath?: string\n oauthState?: string\n reserveState?: boolean\n}\n\nconst DEFAULT_OAUTH_CALLBACK_HOST = \"localhost\"\nlet callbackServerHost = DEFAULT_OAUTH_CALLBACK_HOST\n\n/**\n * Handle incoming HTTP requests to the callback server.\n */\nfunction handleRequest(req: IncomingMessage, res: ServerResponse): void {\n const url = new URL(req.url || \"/\", `http://${req.headers.host}`)\n\n // Only handle the callback path\n if (url.pathname !== getOAuthCallbackPath()) {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" })\n res.end(\"Not found\")\n return\n }\n\n const code = url.searchParams.get(\"code\")\n const state = url.searchParams.get(\"state\")\n const error = url.searchParams.get(\"error\")\n const errorDescription = url.searchParams.get(\"error_description\")\n\n // Enforce state parameter presence for CSRF protection\n if (!state) {\n const errorMsg = \"Missing required state parameter - potential CSRF attack\"\n res.writeHead(400, { \"Content-Type\": \"text/html\" })\n res.end(HTML_ERROR(errorMsg))\n return\n }\n\n const pending = pendingAuths.get(state)\n const isReserved = reservedAuthStates.has(state)\n\n // Handle OAuth errors only for a state that belongs to an active flow.\n if (error) {\n if (!pending && !isReserved) {\n const errorMsg = \"Invalid or expired state parameter - potential CSRF attack\"\n res.writeHead(400, { \"Content-Type\": \"text/html\" })\n res.end(HTML_ERROR(errorMsg))\n return\n }\n\n const errorMsg = errorDescription || error\n // Send HTTP response first before rejecting promise\n res.writeHead(200, { \"Content-Type\": \"text/html\" })\n res.end(HTML_ERROR(errorMsg))\n reservedAuthStates.delete(state)\n // Reject promise after response is sent (defer to allow test to attach handler)\n if (pending) {\n clearTimeout(pending.timeout)\n pendingAuths.delete(state)\n setTimeout(() => pending.reject(new Error(errorMsg)), 0)\n }\n return\n }\n\n // Validate state parameter\n if (!pending) {\n const errorMsg = \"Invalid or expired state parameter - potential CSRF attack\"\n res.writeHead(400, { \"Content-Type\": \"text/html\" })\n res.end(HTML_ERROR(errorMsg))\n return\n }\n\n // Require authorization code\n if (!code) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" })\n res.end(HTML_ERROR(\"No authorization code provided\"))\n return\n }\n\n // Clear timeout and resolve the pending promise\n clearTimeout(pending.timeout)\n pendingAuths.delete(state)\n pending.resolve(code)\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" })\n res.end(HTML_SUCCESS)\n}\n\n/** Serialize listener binding and final-owner release. */\nasync function withCallbackLock(action: () => Promise<void>): Promise<void> {\n while (bindingPromise) {\n // A failed bind belongs to its caller, not to the next owner in the queue.\n await bindingPromise.catch(() => {})\n }\n\n const operation = action()\n bindingPromise = operation\n try {\n await operation\n } finally {\n if (bindingPromise === operation) {\n bindingPromise = undefined\n }\n }\n}\n\n/** Listener ownership survives a completed callback until its session closes. */\nexport function acquireCallbackServerOwner(): symbol {\n const owner = Symbol(\"MCP OAuth owner\")\n callbackOwners.add(owner)\n return owner\n}\n\nexport async function releaseCallbackServerOwner(owner: symbol): Promise<void> {\n await withCallbackLock(async () => {\n callbackOwners.delete(owner)\n if (callbackOwners.size === 0) await stopCallbackServerLocked()\n })\n}\n\n/**\n * Ensure the callback server is running.\n * If strictPort is true, requires binding on the configured callback port.\n * If strictPort is false, asks the OS for an available local port.\n */\nexport async function ensureCallbackServer(options: EnsureCallbackServerOptions = {}): Promise<void> {\n await withCallbackLock(async () => {\n throwIfAborted(options.signal)\n if (options.owner && !callbackOwners.has(options.owner)) throw new Error(\"MCP OAuth session closed\")\n await ensureCallbackServerLocked(options)\n throwIfAborted(options.signal)\n })\n}\n\nasync function ensureCallbackServerLocked(options: EnsureCallbackServerOptions = {}): Promise<void> {\n const requiredPort = options.port ?? getConfiguredOAuthCallbackPort()\n const strictPort = options.strictPort === true\n const requestedHost = options.callbackHost ?? DEFAULT_OAUTH_CALLBACK_HOST\n const rawRequestedPath = options.callbackPath ?? DEFAULT_OAUTH_CALLBACK_PATH\n const requestedPath = rawRequestedPath.startsWith(\"/\") ? rawRequestedPath : `/${rawRequestedPath}`\n if (options.reserveState && !options.oauthState) {\n throw new Error(\"OAuth callback reservation requires an oauthState\")\n }\n let reservedState: string | undefined\n\n const previousServer = server\n const needsStrictRebind = Boolean(previousServer && strictPort && getOAuthCallbackPort() !== requiredPort)\n const needsHostSwitch = Boolean(previousServer && callbackServerHost !== requestedHost)\n const needsPathSwitch = Boolean(previousServer && getOAuthCallbackPath() !== requestedPath)\n\n if (previousServer) {\n if (!needsStrictRebind && !needsHostSwitch) {\n if (needsPathSwitch) {\n if (pendingAuths.size > 0 || reservedAuthStates.size > 0) {\n throw new Error(\n `OAuth callback server is using path ${getOAuthCallbackPath()}, but callback path ${requestedPath} is required and cannot be switched while authorizations are pending`\n )\n }\n setOAuthCallbackPath(requestedPath)\n }\n if (options.reserveState && options.oauthState && !options.signal?.aborted) {\n reservedAuthStates.add(options.oauthState)\n reservedState = options.oauthState\n }\n return\n }\n\n if (pendingAuths.size > 0 || reservedAuthStates.size > 0) {\n throw new Error(\n `OAuth callback server is running on ${callbackServerHost}:${getOAuthCallbackPort()}, but strict callback endpoint ${requestedHost}:${requiredPort} is required and cannot be switched while authorizations are pending`\n )\n }\n }\n\n const candidateServer = createServer(handleRequest)\n const listenPort = strictPort ? requiredPort : 0\n\n try {\n await new Promise<void>((resolve, reject) => {\n candidateServer.once(\"error\", (err) => {\n reject(err)\n })\n\n candidateServer.listen(listenPort, requestedHost, () => {\n resolve()\n })\n })\n\n if (strictPort) {\n setOAuthCallbackPort(requiredPort)\n } else {\n const address = candidateServer.address()\n if (!address || typeof address === \"string\" || typeof address.port !== \"number\") {\n throw new Error(\"OAuth callback server did not report an assigned port\")\n }\n setOAuthCallbackPort(address.port)\n }\n\n if (previousServer && (needsStrictRebind || needsHostSwitch)) {\n await new Promise<void>((resolve) => {\n previousServer.close(() => resolve())\n })\n }\n\n callbackServerHost = requestedHost\n setOAuthCallbackPath(requestedPath)\n server = candidateServer\n // Flow cleanup can finish while binding yields. Never reserve its canceled state afterward.\n if (options.reserveState && options.oauthState && !options.signal?.aborted) {\n reservedAuthStates.add(options.oauthState)\n reservedState = options.oauthState\n }\n server.unref()\n } catch (error) {\n if (reservedState) {\n reservedAuthStates.delete(reservedState)\n }\n const nodeError = error as NodeJS.ErrnoException\n await new Promise<void>((resolve) => {\n candidateServer.close(() => resolve())\n })\n\n if (strictPort && nodeError.code === \"EADDRINUSE\") {\n throw new Error(\n `OAuth callback port ${requiredPort} is already in use. Pre-registered OAuth clients require an exact redirect URI; set MCP_OAUTH_CALLBACK_PORT to your registered port or free port ${requiredPort}`,\n { cause: error }\n )\n }\n\n throw error\n }\n}\n\nexport function reserveCallbackServer(oauthState: string): void {\n reservedAuthStates.add(oauthState)\n}\n\nexport function releaseCallbackServer(oauthState: string): void {\n reservedAuthStates.delete(oauthState)\n}\n\n/**\n * Wait for a callback with the given OAuth state.\n * Returns a promise that resolves with the authorization code.\n */\nexport function waitForCallback(oauthState: string): Promise<string> {\n reservedAuthStates.delete(oauthState)\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n if (pendingAuths.has(oauthState)) {\n pendingAuths.delete(oauthState)\n reject(new Error(\"OAuth callback timeout - authorization took too long\"))\n }\n }, CALLBACK_TIMEOUT_MS)\n\n pendingAuths.set(oauthState, { resolve, reject, timeout })\n })\n}\n\n/**\n * Cancel a pending authorization by state.\n */\nexport function cancelPendingCallback(oauthState: string): void {\n reservedAuthStates.delete(oauthState)\n const pending = pendingAuths.get(oauthState)\n if (pending) {\n clearTimeout(pending.timeout)\n pendingAuths.delete(oauthState)\n pending.reject(new Error(\"Authorization cancelled\"))\n }\n}\n\n/**\n * Stop the callback server and reject all pending authorizations.\n */\nexport async function stopCallbackServer(): Promise<void> {\n await withCallbackLock(stopCallbackServerLocked)\n}\n\nasync function stopCallbackServerLocked(): Promise<void> {\n if (server) {\n await new Promise<void>((resolve) => {\n server!.close(() => {\n resolve()\n })\n })\n server = undefined\n }\n\n setOAuthCallbackPort(getConfiguredOAuthCallbackPort())\n callbackServerHost = DEFAULT_OAUTH_CALLBACK_HOST\n setOAuthCallbackPath(DEFAULT_OAUTH_CALLBACK_PATH)\n\n // Reject all pending auths (defer to allow any pending operations to complete)\n const pendingList = Array.from(pendingAuths.entries())\n pendingAuths.clear()\n reservedAuthStates.clear()\n setTimeout(() => {\n for (const [, pending] of pendingList) {\n clearTimeout(pending.timeout)\n pending.reject(new Error(\"OAuth callback server stopped\"))\n }\n }, 0)\n}\n\n/**\n * Check if the callback server is running.\n */\nexport function isCallbackServerRunning(): boolean {\n return server !== undefined\n}\n\n/**\n * Get the number of pending authorizations.\n */\nexport function getPendingAuthCount(): number {\n return pendingAuths.size\n}\n"]}
@@ -6,6 +6,14 @@
6
6
  */
7
7
  import type { AddClientAuthentication, OAuthClientProvider } from "@modelcontextprotocol/sdk/client/auth.js";
8
8
  import type { OAuthClientMetadata, OAuthTokens, OAuthClientInformation, OAuthClientInformationFull } from "@modelcontextprotocol/sdk/shared/auth.js";
9
+ import { type StoredClientInfo } from "./mcp-auth.ts";
10
+ /** Temporary authorization state belongs to one flow, never the credential cache. */
11
+ export interface McpOAuthFlowState {
12
+ oauthState: string;
13
+ codeVerifier?: string;
14
+ signal: AbortSignal;
15
+ clientInfo?: StoredClientInfo;
16
+ }
9
17
  declare const DEFAULT_OAUTH_CALLBACK_PORT = 19876;
10
18
  declare const DEFAULT_OAUTH_CALLBACK_PATH = "/callback";
11
19
  export declare function getConfiguredOAuthCallbackPort(): number;
@@ -36,8 +44,11 @@ export declare class McpOAuthProvider implements OAuthClientProvider {
36
44
  private serverUrl;
37
45
  private config;
38
46
  private callbacks;
47
+ private flowState?;
39
48
  private readonly redirectUrlSnapshot;
40
- constructor(serverName: string, serverUrl: string, config: McpOAuthConfig, callbacks: McpOAuthCallbacks);
49
+ private flowClientInfo?;
50
+ private flowClientInfoLoaded;
51
+ constructor(serverName: string, serverUrl: string, config: McpOAuthConfig, callbacks: McpOAuthCallbacks, flowState?: McpOAuthFlowState | undefined);
41
52
  private get usesClientCredentials();
42
53
  /**
43
54
  * The redirect URL for OAuth callbacks.
@@ -71,8 +82,8 @@ export declare class McpOAuthProvider implements OAuthClientProvider {
71
82
  * Redirect the user to the authorization URL.
72
83
  * This opens the browser for the user to authenticate.
73
84
  *
74
- * Throws UnauthorizedError when called outside of a user-initiated flow
75
- * (no oauthState saved by startAuth). That path is reached when the SDK
85
+ * Throws UnauthorizedError when called without owned or legacy flow state.
86
+ * That path is reached when the SDK
76
87
  * falls through from a failed refresh into a fresh authorization_code
77
88
  * flow, which library hosts cannot complete in-process.
78
89
  */