@ashx-j/lunr 0.2.26 → 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 (639) hide show
  1. package/CHANGELOG.md +16 -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/lunr-cron.d.ts +4 -5
  12. package/dist/builtin-extensions/lunr-cron.d.ts.map +1 -1
  13. package/dist/builtin-extensions/lunr-cron.js +94 -108
  14. package/dist/builtin-extensions/lunr-cron.js.map +1 -1
  15. package/dist/builtin-extensions/lunr-local-providers/local-servers.d.ts.map +1 -1
  16. package/dist/builtin-extensions/lunr-local-providers/local-servers.js +3 -1
  17. package/dist/builtin-extensions/lunr-local-providers/local-servers.js.map +1 -1
  18. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.d.ts.map +1 -1
  19. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js +2 -2
  20. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js.map +1 -1
  21. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.d.ts.map +1 -1
  22. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js +1 -1
  23. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js.map +1 -1
  24. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.d.ts.map +1 -1
  25. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js +1 -1
  26. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js.map +1 -1
  27. package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
  28. package/dist/builtin-extensions/pi-intercom/index.js +2 -2
  29. package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
  30. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts +1 -1
  31. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts.map +1 -1
  32. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js +1 -1
  33. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js.map +1 -1
  34. package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts.map +1 -1
  35. package/dist/builtin-extensions/pi-lsp-extension/src/index.js +1 -15
  36. package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
  37. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts +6 -0
  38. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts.map +1 -1
  39. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js +187 -132
  40. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js.map +1 -1
  41. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts +8 -0
  42. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts.map +1 -1
  43. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js +142 -112
  44. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js.map +1 -1
  45. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts +12 -1
  46. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts.map +1 -1
  47. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js +14 -7
  48. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js.map +1 -1
  49. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts +11 -3
  50. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts.map +1 -1
  51. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js +67 -41
  52. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js.map +1 -1
  53. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts +4 -2
  54. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts.map +1 -1
  55. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js +3 -0
  56. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js.map +1 -1
  57. package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts +2 -1
  58. package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts.map +1 -1
  59. package/dist/builtin-extensions/pi-mcp-adapter/commands.js +6 -6
  60. package/dist/builtin-extensions/pi-mcp-adapter/commands.js.map +1 -1
  61. package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts +1 -1
  62. package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts.map +1 -1
  63. package/dist/builtin-extensions/pi-mcp-adapter/config.js +11 -5
  64. package/dist/builtin-extensions/pi-mcp-adapter/config.js.map +1 -1
  65. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.d.ts.map +1 -1
  66. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js +2 -2
  67. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js.map +1 -1
  68. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.d.ts.map +1 -1
  69. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js +1 -1
  70. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js.map +1 -1
  71. package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
  72. package/dist/builtin-extensions/pi-mcp-adapter/index.js +48 -40
  73. package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
  74. package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts.map +1 -1
  75. package/dist/builtin-extensions/pi-mcp-adapter/init.js +3 -1
  76. package/dist/builtin-extensions/pi-mcp-adapter/init.js.map +1 -1
  77. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts +12 -40
  78. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts.map +1 -1
  79. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js +166 -235
  80. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js.map +1 -1
  81. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts +5 -0
  82. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts.map +1 -1
  83. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js +43 -13
  84. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js.map +1 -1
  85. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts +14 -3
  86. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts.map +1 -1
  87. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js +73 -21
  88. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js.map +1 -1
  89. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.d.ts.map +1 -1
  90. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js +4 -4
  91. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js.map +1 -1
  92. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts.map +1 -1
  93. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js +2 -2
  94. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js.map +1 -1
  95. package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts +2 -0
  96. package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts.map +1 -1
  97. package/dist/builtin-extensions/pi-mcp-adapter/state.js.map +1 -1
  98. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts +1 -1
  99. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts.map +1 -1
  100. package/dist/builtin-extensions/pi-ollama-cloud/index.js +1 -1
  101. package/dist/builtin-extensions/pi-ollama-cloud/index.js.map +1 -1
  102. package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts +11 -5
  103. package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts.map +1 -1
  104. package/dist/builtin-extensions/pi-ollama-cloud/models.js +12 -32
  105. package/dist/builtin-extensions/pi-ollama-cloud/models.js.map +1 -1
  106. package/dist/builtin-extensions/pi-prompt-template-model/index.d.ts.map +1 -1
  107. package/dist/builtin-extensions/pi-prompt-template-model/index.js +5 -3
  108. package/dist/builtin-extensions/pi-prompt-template-model/index.js.map +1 -1
  109. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts +2 -1
  110. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts.map +1 -1
  111. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js +21 -12
  112. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js.map +1 -1
  113. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts.map +1 -1
  114. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js +7 -24
  115. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js.map +1 -1
  116. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  117. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +39 -77
  118. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  119. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +1 -1
  120. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
  121. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js +15 -31
  122. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
  123. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts.map +1 -1
  124. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js +7 -2
  125. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js.map +1 -1
  126. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
  127. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +10 -2
  128. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
  129. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
  130. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +8 -1
  131. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
  132. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  133. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +106 -24
  134. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  135. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  136. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +25 -5
  137. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  138. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts +1 -1
  139. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts.map +1 -1
  140. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js +1 -1
  141. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js.map +1 -1
  142. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +7 -8
  143. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
  144. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js +60 -32
  145. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
  146. package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts +1 -1
  147. package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts.map +1 -1
  148. package/dist/builtin-extensions/pi-subagents/src/shared/utils.js +15 -5
  149. package/dist/builtin-extensions/pi-subagents/src/shared/utils.js.map +1 -1
  150. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
  151. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +4 -3
  152. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
  153. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +1 -1
  154. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  155. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +17 -8
  156. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  157. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts.map +1 -1
  158. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js +3 -3
  159. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js.map +1 -1
  160. package/dist/builtin-extensions/pi-tps.d.ts.map +1 -1
  161. package/dist/builtin-extensions/pi-tps.js +20 -17
  162. package/dist/builtin-extensions/pi-tps.js.map +1 -1
  163. package/dist/builtin-extensions/pi-web-access/activity.d.ts +1 -0
  164. package/dist/builtin-extensions/pi-web-access/activity.d.ts.map +1 -1
  165. package/dist/builtin-extensions/pi-web-access/activity.js +27 -5
  166. package/dist/builtin-extensions/pi-web-access/activity.js.map +1 -1
  167. package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts +3 -0
  168. package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts.map +1 -0
  169. package/dist/builtin-extensions/pi-web-access/bounded-body.js +43 -0
  170. package/dist/builtin-extensions/pi-web-access/bounded-body.js.map +1 -0
  171. package/dist/builtin-extensions/pi-web-access/content-page.d.ts +24 -0
  172. package/dist/builtin-extensions/pi-web-access/content-page.d.ts.map +1 -0
  173. package/dist/builtin-extensions/pi-web-access/content-page.js +57 -0
  174. package/dist/builtin-extensions/pi-web-access/content-page.js.map +1 -0
  175. package/dist/builtin-extensions/pi-web-access/extract.d.ts.map +1 -1
  176. package/dist/builtin-extensions/pi-web-access/extract.js +7 -2
  177. package/dist/builtin-extensions/pi-web-access/extract.js.map +1 -1
  178. package/dist/builtin-extensions/pi-web-access/github-extract.d.ts +0 -1
  179. package/dist/builtin-extensions/pi-web-access/github-extract.d.ts.map +1 -1
  180. package/dist/builtin-extensions/pi-web-access/github-extract.js +147 -36
  181. package/dist/builtin-extensions/pi-web-access/github-extract.js.map +1 -1
  182. package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
  183. package/dist/builtin-extensions/pi-web-access/index.js +48 -73
  184. package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
  185. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts +12 -4
  186. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts.map +1 -1
  187. package/dist/builtin-extensions/pi-web-access/session-cleanup.js +35 -12
  188. package/dist/builtin-extensions/pi-web-access/session-cleanup.js.map +1 -1
  189. package/dist/builtin-extensions/pi-web-access/storage.d.ts +9 -6
  190. package/dist/builtin-extensions/pi-web-access/storage.d.ts.map +1 -1
  191. package/dist/builtin-extensions/pi-web-access/storage.js +36 -24
  192. package/dist/builtin-extensions/pi-web-access/storage.js.map +1 -1
  193. package/dist/builtin-extensions/simple-pi-memory.d.ts +1 -1
  194. package/dist/builtin-extensions/simple-pi-memory.d.ts.map +1 -1
  195. package/dist/builtin-extensions/simple-pi-memory.js +1 -1
  196. package/dist/builtin-extensions/simple-pi-memory.js.map +1 -1
  197. package/dist/cli/install-cli.d.ts.map +1 -1
  198. package/dist/cli/install-cli.js +38 -30
  199. package/dist/cli/install-cli.js.map +1 -1
  200. package/dist/core/agent-session-runtime.d.ts +13 -0
  201. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  202. package/dist/core/agent-session-runtime.js +75 -11
  203. package/dist/core/agent-session-runtime.js.map +1 -1
  204. package/dist/core/agent-session-services.d.ts +1 -0
  205. package/dist/core/agent-session-services.d.ts.map +1 -1
  206. package/dist/core/agent-session-services.js +1 -0
  207. package/dist/core/agent-session-services.js.map +1 -1
  208. package/dist/core/agent-session.d.ts +40 -6
  209. package/dist/core/agent-session.d.ts.map +1 -1
  210. package/dist/core/agent-session.js +309 -76
  211. package/dist/core/agent-session.js.map +1 -1
  212. package/dist/core/browser/runtime.d.ts +2 -0
  213. package/dist/core/browser/runtime.d.ts.map +1 -1
  214. package/dist/core/browser/runtime.js +80 -45
  215. package/dist/core/browser/runtime.js.map +1 -1
  216. package/dist/core/browser/setup.d.ts.map +1 -1
  217. package/dist/core/browser/setup.js +12 -1
  218. package/dist/core/browser/setup.js.map +1 -1
  219. package/dist/core/computer-use/adapter.d.ts.map +1 -1
  220. package/dist/core/computer-use/adapter.js +7 -2
  221. package/dist/core/computer-use/adapter.js.map +1 -1
  222. package/dist/core/computer-use/image.d.ts.map +1 -1
  223. package/dist/core/computer-use/image.js +17 -5
  224. package/dist/core/computer-use/image.js.map +1 -1
  225. package/dist/core/computer-use/schemas.d.ts.map +1 -1
  226. package/dist/core/computer-use/schemas.js +23 -6
  227. package/dist/core/computer-use/schemas.js.map +1 -1
  228. package/dist/core/computer-use/workflow.d.ts.map +1 -1
  229. package/dist/core/computer-use/workflow.js +459 -119
  230. package/dist/core/computer-use/workflow.js.map +1 -1
  231. package/dist/core/cron/jobs.d.ts +26 -8
  232. package/dist/core/cron/jobs.d.ts.map +1 -1
  233. package/dist/core/cron/jobs.js +357 -232
  234. package/dist/core/cron/jobs.js.map +1 -1
  235. package/dist/core/cron/origin-context.d.ts +1 -0
  236. package/dist/core/cron/origin-context.d.ts.map +1 -1
  237. package/dist/core/cron/origin-context.js.map +1 -1
  238. package/dist/core/cron/scheduler.d.ts +22 -17
  239. package/dist/core/cron/scheduler.d.ts.map +1 -1
  240. package/dist/core/cron/scheduler.js +153 -73
  241. package/dist/core/cron/scheduler.js.map +1 -1
  242. package/dist/core/extensions/index.d.ts +1 -1
  243. package/dist/core/extensions/index.d.ts.map +1 -1
  244. package/dist/core/extensions/index.js.map +1 -1
  245. package/dist/core/extensions/runner.d.ts +1 -0
  246. package/dist/core/extensions/runner.d.ts.map +1 -1
  247. package/dist/core/extensions/runner.js +8 -0
  248. package/dist/core/extensions/runner.js.map +1 -1
  249. package/dist/core/extensions/types.d.ts +8 -0
  250. package/dist/core/extensions/types.d.ts.map +1 -1
  251. package/dist/core/extensions/types.js.map +1 -1
  252. package/dist/core/footer-data-provider.d.ts +4 -0
  253. package/dist/core/footer-data-provider.d.ts.map +1 -1
  254. package/dist/core/footer-data-provider.js +22 -1
  255. package/dist/core/footer-data-provider.js.map +1 -1
  256. package/dist/core/large-subagent-launch.d.ts +1 -1
  257. package/dist/core/large-subagent-launch.d.ts.map +1 -1
  258. package/dist/core/large-subagent-launch.js +7 -7
  259. package/dist/core/large-subagent-launch.js.map +1 -1
  260. package/dist/core/model-registry.d.ts +2 -0
  261. package/dist/core/model-registry.d.ts.map +1 -1
  262. package/dist/core/model-registry.js +5 -0
  263. package/dist/core/model-registry.js.map +1 -1
  264. package/dist/core/model-runtime.d.ts +4 -1
  265. package/dist/core/model-runtime.d.ts.map +1 -1
  266. package/dist/core/model-runtime.js +40 -4
  267. package/dist/core/model-runtime.js.map +1 -1
  268. package/dist/core/package-manager.d.ts.map +1 -1
  269. package/dist/core/package-manager.js.map +1 -1
  270. package/dist/core/permissions.d.ts +3 -3
  271. package/dist/core/permissions.d.ts.map +1 -1
  272. package/dist/core/permissions.js +11 -35
  273. package/dist/core/permissions.js.map +1 -1
  274. package/dist/core/plan-mode.d.ts +5 -13
  275. package/dist/core/plan-mode.d.ts.map +1 -1
  276. package/dist/core/plan-mode.js +126 -116
  277. package/dist/core/plan-mode.js.map +1 -1
  278. package/dist/core/project-trust.d.ts.map +1 -1
  279. package/dist/core/project-trust.js +1 -1
  280. package/dist/core/project-trust.js.map +1 -1
  281. package/dist/core/prompt-resource-bridge.d.ts +12 -0
  282. package/dist/core/prompt-resource-bridge.d.ts.map +1 -0
  283. package/dist/core/prompt-resource-bridge.js +9 -0
  284. package/dist/core/prompt-resource-bridge.js.map +1 -0
  285. package/dist/core/protected-targets.d.ts +6 -0
  286. package/dist/core/protected-targets.d.ts.map +1 -0
  287. package/dist/core/protected-targets.js +45 -0
  288. package/dist/core/protected-targets.js.map +1 -0
  289. package/dist/core/resource-loader.d.ts.map +1 -1
  290. package/dist/core/resource-loader.js +7 -0
  291. package/dist/core/resource-loader.js.map +1 -1
  292. package/dist/core/rollback.d.ts +19 -3
  293. package/dist/core/rollback.d.ts.map +1 -1
  294. package/dist/core/rollback.js +172 -56
  295. package/dist/core/rollback.js.map +1 -1
  296. package/dist/core/runtime-credentials.d.ts +3 -0
  297. package/dist/core/runtime-credentials.d.ts.map +1 -1
  298. package/dist/core/runtime-credentials.js +14 -1
  299. package/dist/core/runtime-credentials.js.map +1 -1
  300. package/dist/core/sdk.d.ts +3 -0
  301. package/dist/core/sdk.d.ts.map +1 -1
  302. package/dist/core/sdk.js +1 -0
  303. package/dist/core/sdk.js.map +1 -1
  304. package/dist/core/session-manager.d.ts +6 -0
  305. package/dist/core/session-manager.d.ts.map +1 -1
  306. package/dist/core/session-manager.js +95 -32
  307. package/dist/core/session-manager.js.map +1 -1
  308. package/dist/core/session-ownership.d.ts.map +1 -1
  309. package/dist/core/session-ownership.js +8 -3
  310. package/dist/core/session-ownership.js.map +1 -1
  311. package/dist/core/session-retention.d.ts.map +1 -1
  312. package/dist/core/session-retention.js +18 -7
  313. package/dist/core/session-retention.js.map +1 -1
  314. package/dist/core/session-startup-settings.d.ts +10 -0
  315. package/dist/core/session-startup-settings.d.ts.map +1 -0
  316. package/dist/core/session-startup-settings.js +70 -0
  317. package/dist/core/session-startup-settings.js.map +1 -0
  318. package/dist/core/subscriptions.d.ts +16 -7
  319. package/dist/core/subscriptions.d.ts.map +1 -1
  320. package/dist/core/subscriptions.js +96 -55
  321. package/dist/core/subscriptions.js.map +1 -1
  322. package/dist/core/trust-manager.d.ts +2 -1
  323. package/dist/core/trust-manager.d.ts.map +1 -1
  324. package/dist/core/trust-manager.js +6 -1
  325. package/dist/core/trust-manager.js.map +1 -1
  326. package/dist/core/update-check.d.ts.map +1 -1
  327. package/dist/core/update-check.js.map +1 -1
  328. package/dist/core/usage-adapters/kimi-coding.d.ts +2 -2
  329. package/dist/core/usage-adapters/kimi-coding.d.ts.map +1 -1
  330. package/dist/core/usage-adapters/kimi-coding.js +2 -2
  331. package/dist/core/usage-adapters/kimi-coding.js.map +1 -1
  332. package/dist/core/usage-adapters/openai-codex.d.ts +3 -2
  333. package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
  334. package/dist/core/usage-adapters/openai-codex.js +3 -3
  335. package/dist/core/usage-adapters/openai-codex.js.map +1 -1
  336. package/dist/core/usage-adapters/xai.d.ts +2 -2
  337. package/dist/core/usage-adapters/xai.d.ts.map +1 -1
  338. package/dist/core/usage-adapters/xai.js +3 -3
  339. package/dist/core/usage-adapters/xai.js.map +1 -1
  340. package/dist/core/usage-adapters/zai.d.ts +2 -2
  341. package/dist/core/usage-adapters/zai.d.ts.map +1 -1
  342. package/dist/core/usage-adapters/zai.js +2 -2
  343. package/dist/core/usage-adapters/zai.js.map +1 -1
  344. package/dist/core/usage-service.d.ts +9 -2
  345. package/dist/core/usage-service.d.ts.map +1 -1
  346. package/dist/core/usage-service.js +95 -50
  347. package/dist/core/usage-service.js.map +1 -1
  348. package/dist/gateway/agent-bridge.d.ts +9 -1
  349. package/dist/gateway/agent-bridge.d.ts.map +1 -1
  350. package/dist/gateway/agent-bridge.js +91 -37
  351. package/dist/gateway/agent-bridge.js.map +1 -1
  352. package/dist/gateway/buttons.d.ts +8 -1
  353. package/dist/gateway/buttons.d.ts.map +1 -1
  354. package/dist/gateway/buttons.js +76 -18
  355. package/dist/gateway/buttons.js.map +1 -1
  356. package/dist/gateway/commands.d.ts +1 -0
  357. package/dist/gateway/commands.d.ts.map +1 -1
  358. package/dist/gateway/commands.js +10 -4
  359. package/dist/gateway/commands.js.map +1 -1
  360. package/dist/gateway/cron.d.ts +12 -11
  361. package/dist/gateway/cron.d.ts.map +1 -1
  362. package/dist/gateway/cron.js +65 -56
  363. package/dist/gateway/cron.js.map +1 -1
  364. package/dist/gateway/index.d.ts.map +1 -1
  365. package/dist/gateway/index.js +2 -1
  366. package/dist/gateway/index.js.map +1 -1
  367. package/dist/gateway/mobile-commands.d.ts +1 -0
  368. package/dist/gateway/mobile-commands.d.ts.map +1 -1
  369. package/dist/gateway/mobile-commands.js +56 -14
  370. package/dist/gateway/mobile-commands.js.map +1 -1
  371. package/dist/gateway/presenter.d.ts +12 -2
  372. package/dist/gateway/presenter.d.ts.map +1 -1
  373. package/dist/gateway/presenter.js +73 -38
  374. package/dist/gateway/presenter.js.map +1 -1
  375. package/dist/gateway/router.d.ts +2 -2
  376. package/dist/gateway/router.d.ts.map +1 -1
  377. package/dist/gateway/router.js +17 -2
  378. package/dist/gateway/router.js.map +1 -1
  379. package/dist/gateway/service.d.ts +2 -0
  380. package/dist/gateway/service.d.ts.map +1 -1
  381. package/dist/gateway/service.js +153 -0
  382. package/dist/gateway/service.js.map +1 -1
  383. package/dist/main.d.ts.map +1 -1
  384. package/dist/main.js +86 -33
  385. package/dist/main.js.map +1 -1
  386. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  387. package/dist/modes/interactive/components/assistant-message.js +6 -4
  388. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  389. package/dist/modes/interactive/components/copyable-text.d.ts.map +1 -1
  390. package/dist/modes/interactive/components/copyable-text.js +3 -2
  391. package/dist/modes/interactive/components/copyable-text.js.map +1 -1
  392. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  393. package/dist/modes/interactive/components/extension-editor.js +1 -1
  394. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  395. package/dist/modes/interactive/interactive-mode.d.ts +2 -2
  396. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  397. package/dist/modes/interactive/interactive-mode.js +96 -109
  398. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  399. package/dist/modes/interactive/smooth-streaming.d.ts.map +1 -1
  400. package/dist/modes/interactive/smooth-streaming.js.map +1 -1
  401. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  402. package/dist/modes/rpc/rpc-mode.js +2 -1
  403. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  404. package/dist/node-runtime/{adapter-VFG7WNPX.js → adapter-247RTYLS.js} +4 -5
  405. package/dist/node-runtime/agent-session-services-KDMSPQDY.js +53 -0
  406. package/dist/node-runtime/{brave-UWDA3I22.js → brave-2AFFAXNN.js} +1 -1
  407. package/dist/node-runtime/{builtin-extensions-I2HIFEMY.js → builtin-extensions-OX6KELNX.js} +8 -7
  408. package/dist/node-runtime/{chunk-QH6YL7VK.js → chunk-252ZVPPF.js} +3 -3
  409. package/dist/node-runtime/{chunk-PCEW76PM.js → chunk-2OIPYKLZ.js} +6 -6
  410. package/dist/node-runtime/{chunk-XBWPBZBN.js → chunk-2SWW7KMW.js} +1 -1
  411. package/dist/node-runtime/{chunk-UQUCFAJ3.js → chunk-2VIW3IMF.js} +40 -7
  412. package/dist/node-runtime/{chunk-UOEDI7RP.js → chunk-4KNKQGHM.js} +2 -2
  413. package/dist/node-runtime/{chunk-FQMM2EZ2.js → chunk-64XTQNLA.js} +29 -7
  414. package/dist/node-runtime/{chunk-SPVDBUOS.js → chunk-6O3IW3IA.js} +2 -2
  415. package/dist/node-runtime/{chunk-5ZQXRPMC.js → chunk-6ZZHGUSA.js} +2 -2
  416. package/dist/node-runtime/chunk-A2WO6WIN.js +1197 -0
  417. package/dist/node-runtime/{chunk-WIF24I7G.js → chunk-APVM5NEU.js} +149 -144
  418. package/dist/node-runtime/{chunk-RCR3XAQY.js → chunk-AYHH7YSD.js} +177 -144
  419. package/dist/node-runtime/{chunk-LWYIVUGV.js → chunk-B2IBAXNX.js} +48 -31
  420. package/dist/node-runtime/{chunk-M3LZLQW2.js → chunk-BDRGN3L2.js} +1 -0
  421. package/dist/node-runtime/{chunk-GJ2RDBRL.js → chunk-BYC6RKCN.js} +4 -2
  422. package/dist/node-runtime/{chunk-UVWCDQYF.js → chunk-C3P6Q3B2.js} +455 -278
  423. package/dist/node-runtime/{chunk-SN2KSMPQ.js → chunk-DQSCFU7R.js} +13 -7
  424. package/dist/node-runtime/{chunk-4SBQAI4T.js → chunk-EBLAZVSA.js} +2058 -73
  425. package/dist/node-runtime/{chunk-2KIPT4HJ.js → chunk-EPR2F3GU.js} +68 -20
  426. package/dist/node-runtime/{chunk-CSFI6YXL.js → chunk-ES6PBSIE.js} +1 -1
  427. package/dist/node-runtime/{chunk-IF24A3FH.js → chunk-EVM653DD.js} +4 -4
  428. package/dist/node-runtime/{chunk-HTFRRDSF.js → chunk-F2SMQ6ES.js} +3 -2
  429. package/dist/node-runtime/chunk-F2V2F4ZG.js +114 -0
  430. package/dist/node-runtime/{chunk-IKU6Y7DL.js → chunk-FE3WZI7F.js} +9 -6
  431. package/dist/node-runtime/{chunk-GYIXXQAO.js → chunk-FIRA54AC.js} +2 -5
  432. package/dist/node-runtime/{chunk-6VYZ5UFP.js → chunk-FLGEEH27.js} +1 -1
  433. package/dist/node-runtime/{chunk-5EFIU3OM.js → chunk-FTKEZL27.js} +1 -1
  434. package/dist/node-runtime/{chunk-RGQAEOM5.js → chunk-FYIFPFXE.js} +23 -6
  435. package/dist/node-runtime/{chunk-HMBGROQK.js → chunk-GLDXBBL6.js} +3 -3
  436. package/dist/node-runtime/{chunk-KWA4OC2J.js → chunk-H6YBCWKG.js} +1 -1
  437. package/dist/node-runtime/{chunk-2MI5OPMN.js → chunk-HNNHHJAB.js} +68 -50
  438. package/dist/node-runtime/{chunk-I74LN5JG.js → chunk-HUD2RFJW.js} +2 -2
  439. package/dist/node-runtime/{chunk-I54LGHWM.js → chunk-I2H5QMWW.js} +3 -3
  440. package/dist/node-runtime/{chunk-XHIRAZ26.js → chunk-IAZSK7KK.js} +1 -1
  441. package/dist/node-runtime/{chunk-X3PGBLQ7.js → chunk-IHHTWSXN.js} +9 -9
  442. package/dist/node-runtime/{chunk-DAPBPCBP.js → chunk-IPP5BIV5.js} +25 -3
  443. package/dist/node-runtime/{chunk-QFWG2RVL.js → chunk-IXG6F4NT.js} +11 -0
  444. package/dist/node-runtime/{chunk-RDDAZOMU.js → chunk-JL4HYQXK.js} +1 -1
  445. package/dist/node-runtime/{chunk-CDVHZOOK.js → chunk-JQYNHAKX.js} +1 -1
  446. package/dist/node-runtime/{chunk-L24TPBS4.js → chunk-JWEVT363.js} +37 -29
  447. package/dist/node-runtime/{chunk-2HMIRK7W.js → chunk-LHV3V67B.js} +5 -5
  448. package/dist/node-runtime/{chunk-UAEOTO52.js → chunk-MNQXDFPV.js} +6 -2
  449. package/dist/node-runtime/{chunk-T4DA4XE7.js → chunk-MQPKUHRN.js} +162 -82
  450. package/dist/node-runtime/{chunk-MPKSOJBT.js → chunk-NHATCSOI.js} +4 -7
  451. package/dist/node-runtime/{chunk-RMQZU2YU.js → chunk-NNNR3QIY.js} +1 -1
  452. package/dist/node-runtime/{chunk-RWTKOC3B.js → chunk-QBTJG3UM.js} +1 -1
  453. package/dist/node-runtime/{chunk-P7XBVXGT.js → chunk-QNVMKNNN.js} +18 -14
  454. package/dist/node-runtime/{chunk-GS42T6MX.js → chunk-QW3AAHWN.js} +1 -1
  455. package/dist/node-runtime/{chunk-DVQSHCVP.js → chunk-R4WSB2MQ.js} +5 -5
  456. package/dist/node-runtime/{chunk-B4HP6ZWM.js → chunk-RHCGYWO7.js} +1 -1
  457. package/dist/node-runtime/{chunk-2CFDTH5B.js → chunk-RLGY2QIL.js} +45 -59
  458. package/dist/node-runtime/{chunk-KKUTQQV7.js → chunk-RYRGL7P4.js} +1 -1
  459. package/dist/node-runtime/{chunk-5Q4A37RB.js → chunk-TCT6PCUR.js} +32 -11
  460. package/dist/node-runtime/{chunk-D5UCKPBQ.js → chunk-UBWW2PID.js} +1 -1
  461. package/dist/node-runtime/{chunk-E75WFZ33.js → chunk-UNUZICC4.js} +3 -3
  462. package/dist/node-runtime/{chunk-RAK2QA2B.js → chunk-UYRKUKFE.js} +4 -4
  463. package/dist/node-runtime/{chunk-LWJXTA6Z.js → chunk-VSUEAI7O.js} +1377 -45
  464. package/dist/node-runtime/{chunk-NAY6UUQZ.js → chunk-WDIVLMOH.js} +1 -1
  465. package/dist/node-runtime/{chunk-E24EO34J.js → chunk-WPXUR3HE.js} +1 -1
  466. package/dist/node-runtime/{chunk-SLVOAQOY.js → chunk-WXYNALHD.js} +113 -1
  467. package/dist/node-runtime/{chunk-KJ6DWS3K.js → chunk-XEOCUEUJ.js} +121 -60
  468. package/dist/node-runtime/chunk-YD3IZAZ7.js +47 -0
  469. package/dist/node-runtime/chunk-YSB6URMT.js +41 -0
  470. package/dist/node-runtime/{chunk-LJTIVM7I.js → chunk-ZDJUR45D.js} +427 -126
  471. package/dist/node-runtime/{chunk-YWOJIGFY.js → chunk-ZEVFBFNF.js} +95 -142
  472. package/dist/node-runtime/{chunk-5B6VKFEV.js → chunk-ZIQUS5QO.js} +1 -1
  473. package/dist/node-runtime/cli-runtime.js +4 -4
  474. package/dist/node-runtime/{command-FSBU2EVZ.js → command-3HMSY6W2.js} +5 -5
  475. package/dist/node-runtime/{commands-EMBQQVVT.js → commands-D6A6H4TS.js} +11 -18
  476. package/dist/node-runtime/{commands-NAAL7KNT.js → commands-OCSSEEWJ.js} +16 -16
  477. package/dist/node-runtime/{config-QDD5PUE2.js → config-CU7M7BTK.js} +1 -1
  478. package/dist/node-runtime/{config-D4QUPAHX.js → config-DS7XLMEM.js} +2 -2
  479. package/dist/node-runtime/{direct-tool-executor-4D7UXYU4.js → direct-tool-executor-2QJXVQD2.js} +6 -11
  480. package/dist/node-runtime/{exa-LL64QZR2.js → exa-6VBZNPGE.js} +1 -1
  481. package/dist/node-runtime/{export-html-VM4J2MNR.js → export-html-BRWF5AHI.js} +4 -4
  482. package/dist/node-runtime/{extension-input-E7BJZ35H.js → extension-input-VBBMX7YV.js} +5 -5
  483. package/dist/node-runtime/{extension-selector-WU42XDTU.js → extension-selector-T5AOG5XB.js} +5 -5
  484. package/dist/node-runtime/{extract-EQJE7FZZ.js → extract-BFX2N35A.js} +3 -3
  485. package/dist/node-runtime/{gateway-DQM333YV.js → gateway-6623C2U3.js} +51 -42
  486. package/dist/node-runtime/{gemini-search-35OCRFLN.js → gemini-search-C66QHDT6.js} +2 -2
  487. package/dist/node-runtime/{gemini-url-context-UQY3PHHW.js → gemini-url-context-T7DEK73R.js} +3 -3
  488. package/dist/node-runtime/{github-extract-F64RZOEA.js → github-extract-HOGE3D6F.js} +107 -38
  489. package/dist/node-runtime/{goal-NJEE5CTU.js → goal-AIHEDUYA.js} +5 -5
  490. package/dist/node-runtime/index.js +50 -48
  491. package/dist/node-runtime/{init-P5AUV77I.js → init-JBQJIPYI.js} +3 -6
  492. package/dist/node-runtime/{install-cli-NN4YAU44.js → install-cli-INGHIVBY.js} +30 -25
  493. package/dist/node-runtime/interactive-mode-FM5DNUSW.js +74 -0
  494. package/dist/node-runtime/{interactive-view-NGFAMHPW.js → interactive-view-K33PM4OS.js} +8 -8
  495. package/dist/node-runtime/{lsp-manager-3ASUSO4T.js → lsp-manager-S554V5HR.js} +240 -155
  496. package/dist/node-runtime/{lunr-browser-IR7TL3J7.js → lunr-browser-H4FDOR3C.js} +7 -7
  497. package/dist/node-runtime/{lunr-computer-use-Y23CCDIJ.js → lunr-computer-use-VDP2QNRQ.js} +9 -9
  498. package/dist/node-runtime/{lunr-cron-USHC4LXH.js → lunr-cron-LKVA5CZZ.js} +93 -80
  499. package/dist/node-runtime/main.js +42 -41
  500. package/dist/node-runtime/{mobile-commands-O5LCHL32.js → mobile-commands-XT3NQXLD.js} +12 -12
  501. package/dist/node-runtime/{model-runtime-OO5HFLWE.js → model-runtime-MZ2JMDV4.js} +4 -4
  502. package/dist/node-runtime/{openai-search-B3MSNCQA.js → openai-search-K72LJDYN.js} +1 -1
  503. package/dist/node-runtime/{package-manager-cli-Q7BL6KZO.js → package-manager-cli-CYM262SI.js} +20 -20
  504. package/dist/node-runtime/{parallel-AI2MNSCU.js → parallel-X724NCNU.js} +1 -1
  505. package/dist/node-runtime/{perplexity-QVJW3I35.js → perplexity-RDHQHVMK.js} +2 -2
  506. package/dist/node-runtime/{pi-intercom-QM53RLTS.js → pi-intercom-NHHEPBMI.js} +2 -2
  507. package/dist/node-runtime/{pi-mcp-adapter-3PHF4KZ4.js → pi-mcp-adapter-PP3GQJQ2.js} +98 -94
  508. package/dist/node-runtime/{pi-ollama-cloud-2F3Y2QNM.js → pi-ollama-cloud-4MNWIMFN.js} +11 -24
  509. package/dist/node-runtime/{pi-prompt-template-model-QWTCGLJU.js → pi-prompt-template-model-FTGELLS5.js} +32 -36
  510. package/dist/node-runtime/{pi-subagents-7IBSSGEW.js → pi-subagents-LT3CTO4E.js} +98 -106
  511. package/dist/node-runtime/{pi-web-access-WTGMNZ32.js → pi-web-access-Z3LP246C.js} +144 -108
  512. package/dist/node-runtime/{print-mode-XQ76CYMT.js → print-mode-2XHN5SUA.js} +3 -3
  513. package/dist/node-runtime/{process-registry-4FAKZQOL.js → process-registry-Q4QWIU33.js} +3 -3
  514. package/dist/node-runtime/{proxy-modes-5FAPSZEZ.js → proxy-modes-VEGC6QG5.js} +8 -15
  515. package/dist/node-runtime/rpc-entry.js +42 -41
  516. package/dist/node-runtime/{rpc-mode-O3XV4SID.js → rpc-mode-32DHJPEJ.js} +4 -4
  517. package/dist/node-runtime/{runtime-4VA6JKNF.js → runtime-EDUUGAQD.js} +56 -46
  518. package/dist/node-runtime/{runtime-EFPPD2UW.js → runtime-UGXM4NPQ.js} +2 -2
  519. package/dist/node-runtime/{runtime-bridges-7WVCLI76.js → runtime-bridges-DNKMNJCF.js} +7 -7
  520. package/dist/node-runtime/{service-MDQIPQ26.js → service-IHLGFLBT.js} +6 -4
  521. package/dist/node-runtime/{session-handoff-GWARVEWT.js → session-handoff-LNSPDTKY.js} +4 -4
  522. package/dist/node-runtime/{session-manager-JB5J6XBN.js → session-manager-YIFIAVGC.js} +3 -3
  523. package/dist/node-runtime/{session-selector-GIM4DHQ2.js → session-selector-I73U3EIO.js} +7 -7
  524. package/dist/node-runtime/{settings-manager-DJDM5AHM.js → settings-manager-P2TKGYTR.js} +5 -5
  525. package/dist/node-runtime/{setup-JBKOLJ6F.js → setup-H7CCELIL.js} +15 -1
  526. package/dist/node-runtime/{setup-PFBWRNUI.js → setup-OLQ4GXWS.js} +17 -17
  527. package/dist/node-runtime/{src-IVPNZ2BX.js → src-6RV4PXKJ.js} +64 -36
  528. package/dist/node-runtime/{subagent-executor-LPZ4BHWE.js → subagent-executor-Q5F7DBVM.js} +119 -58
  529. package/dist/node-runtime/{tavily-WEZFVFP7.js → tavily-KZBFYQB6.js} +1 -1
  530. package/dist/node-runtime/{theme-UOO5RVFN.js → theme-YLVZKKZD.js} +2 -2
  531. package/dist/node-runtime/{trust-manager-MMISNCYO.js → trust-manager-ZCU76D23.js} +2 -2
  532. package/dist/node-runtime/{update-cli-HNMOTNGX.js → update-cli-F3XXJANQ.js} +6 -6
  533. package/dist/node-runtime/{usage-service-LFB2SWYV.js → usage-service-CPAGBED5.js} +1 -1
  534. package/dist/node-runtime/{video-extract-OOZHR7SU.js → video-extract-UPKYIBW3.js} +3 -3
  535. package/dist/node-runtime/{workflow-OHPBEFO4.js → workflow-ICDI4N3J.js} +208 -78
  536. package/dist/node-runtime/{youtube-extract-FNPAUNHU.js → youtube-extract-77NT7FWH.js} +4 -4
  537. package/dist/utils/clipboard-image.d.ts.map +1 -1
  538. package/dist/utils/clipboard-image.js.map +1 -1
  539. package/dist/utils/exif-orientation.d.ts.map +1 -1
  540. package/dist/utils/exif-orientation.js +25 -10
  541. package/dist/utils/exif-orientation.js.map +1 -1
  542. package/dist/utils/image-resize-core.d.ts.map +1 -1
  543. package/dist/utils/image-resize-core.js +2 -0
  544. package/dist/utils/image-resize-core.js.map +1 -1
  545. package/dist/utils/paths.d.ts +4 -0
  546. package/dist/utils/paths.d.ts.map +1 -1
  547. package/dist/utils/paths.js +33 -2
  548. package/dist/utils/paths.js.map +1 -1
  549. package/dist/utils/sanitize-terminal-text.d.ts +7 -0
  550. package/dist/utils/sanitize-terminal-text.d.ts.map +1 -0
  551. package/dist/utils/sanitize-terminal-text.js +67 -0
  552. package/dist/utils/sanitize-terminal-text.js.map +1 -0
  553. package/docs/browser.md +1 -1
  554. package/docs/custom-provider.md +3 -3
  555. package/docs/extensions.md +8 -4
  556. package/docs/features.md +15 -7
  557. package/docs/keybindings.md +1 -1
  558. package/docs/models.md +5 -5
  559. package/docs/packages.md +1 -1
  560. package/docs/providers.md +2 -2
  561. package/docs/rpc.md +7 -7
  562. package/docs/security.md +10 -5
  563. package/docs/sessions.md +2 -2
  564. package/docs/skills.md +1 -1
  565. package/docs/terminal-setup.md +7 -7
  566. package/docs/themes.md +1 -1
  567. package/docs/usage.md +1 -1
  568. package/examples/extensions/auto-commit-on-exit.ts +1 -1
  569. package/examples/extensions/bash-spawn-hook.ts +1 -1
  570. package/examples/extensions/built-in-tool-renderer.ts +1 -1
  571. package/examples/extensions/claude-rules.ts +1 -1
  572. package/examples/extensions/commands.ts +1 -1
  573. package/examples/extensions/custom-compaction.ts +1 -1
  574. package/examples/extensions/custom-provider-anthropic/index.ts +3 -3
  575. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  576. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  577. package/examples/extensions/custom-provider-gitlab-duo/index.ts +1 -1
  578. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  579. package/examples/extensions/doom-overlay/index.ts +1 -1
  580. package/examples/extensions/git-merge-and-resolve.ts +2 -2
  581. package/examples/extensions/gondolin/index.ts +1 -1
  582. package/examples/extensions/gondolin/package-lock.json +2 -2
  583. package/examples/extensions/gondolin/package.json +1 -1
  584. package/examples/extensions/hidden-thinking-label.ts +1 -1
  585. package/examples/extensions/inline-bash.ts +2 -2
  586. package/examples/extensions/input-transform-streaming.ts +2 -2
  587. package/examples/extensions/input-transform.ts +2 -2
  588. package/examples/extensions/interactive-shell.ts +1 -1
  589. package/examples/extensions/kimi-deferred-tools.ts +1 -1
  590. package/examples/extensions/mac-system-theme.ts +1 -1
  591. package/examples/extensions/minimal-mode.ts +1 -1
  592. package/examples/extensions/modal-editor.ts +1 -1
  593. package/examples/extensions/model-status.ts +1 -1
  594. package/examples/extensions/notify.ts +3 -3
  595. package/examples/extensions/overlay-qa-tests.ts +1 -1
  596. package/examples/extensions/overlay-test.ts +1 -1
  597. package/examples/extensions/pirate.ts +1 -1
  598. package/examples/extensions/preset.ts +3 -3
  599. package/examples/extensions/project-trust.ts +4 -4
  600. package/examples/extensions/prompt-customizer.ts +1 -1
  601. package/examples/extensions/rainbow-editor.ts +1 -1
  602. package/examples/extensions/rpc-demo.ts +1 -1
  603. package/examples/extensions/sandbox/index.ts +7 -7
  604. package/examples/extensions/sandbox/package-lock.json +2 -2
  605. package/examples/extensions/sandbox/package.json +1 -1
  606. package/examples/extensions/shutdown-command.ts +5 -5
  607. package/examples/extensions/ssh.ts +2 -2
  608. package/examples/extensions/subagent/README.md +3 -3
  609. package/examples/extensions/subagent/index.ts +2 -2
  610. package/examples/extensions/titlebar-spinner.ts +1 -1
  611. package/examples/extensions/tool-override.ts +1 -1
  612. package/examples/extensions/tools.ts +1 -1
  613. package/examples/extensions/with-deps/package-lock.json +2 -2
  614. package/examples/extensions/with-deps/package.json +1 -1
  615. package/examples/extensions/working-indicator.ts +1 -1
  616. package/examples/extensions/working-message-test.ts +1 -1
  617. package/examples/sdk/01-minimal.ts +1 -1
  618. package/examples/sdk/03-custom-prompt.ts +1 -1
  619. package/examples/sdk/04-skills.ts +1 -1
  620. package/examples/sdk/06-extensions.ts +2 -2
  621. package/examples/sdk/08-prompt-templates.ts +1 -1
  622. package/install-lock/package-lock.json +24 -24
  623. package/install-lock/package.json +2 -2
  624. package/npm-shrinkwrap.json +60 -24
  625. package/package.json +9 -9
  626. package/dist/modes/interactive/components/exit-card.d.ts +0 -22
  627. package/dist/modes/interactive/components/exit-card.d.ts.map +0 -1
  628. package/dist/modes/interactive/components/exit-card.js +0 -69
  629. package/dist/modes/interactive/components/exit-card.js.map +0 -1
  630. package/dist/node-runtime/agent-session-services-5YXS2PLF.js +0 -51
  631. package/dist/node-runtime/chunk-2IDTZAG5.js +0 -1415
  632. package/dist/node-runtime/chunk-3MISGG4S.js +0 -769
  633. package/dist/node-runtime/chunk-4HXHDDCF.js +0 -16
  634. package/dist/node-runtime/chunk-5B5QN3ZQ.js +0 -356
  635. package/dist/node-runtime/chunk-7IQGBKBJ.js +0 -2033
  636. package/dist/node-runtime/chunk-AUXVGBO4.js +0 -19
  637. package/dist/node-runtime/chunk-PTFBPO3C.js +0 -50
  638. package/dist/node-runtime/interactive-mode-YOHZVMKX.js +0 -74
  639. package/dist/node-runtime/mcp-auth-flow-QVLFVLEO.js +0 -33
@@ -15,35 +15,23 @@ export interface AuthenticateOptions {
15
15
  * Extract OAuth configuration from a ServerEntry.
16
16
  */
17
17
  export declare function extractOAuthConfig(definition: ServerEntry): McpOAuthConfig;
18
- /**
19
- * Start OAuth authentication flow for a server.
20
- * Returns the authorization URL when browser authorization is required.
21
- */
22
- export declare function startAuth(serverName: string, serverUrl: string, definition?: ServerEntry): Promise<{
23
- authorizationUrl: string;
24
- }>;
25
18
  /**
26
19
  * Extract an OAuth authorization code from either a raw code, a query string,
27
20
  * or the full localhost redirect URL copied from the browser address bar.
28
21
  */
29
22
  export declare function parseAuthorizationCodeInput(input: string, expectedState?: string): string;
30
- /**
31
- * Complete OAuth authentication from manual user input.
32
- */
33
- export declare function completeAuthFromInput(serverName: string, input: string): Promise<AuthStatus>;
34
- /**
35
- * Complete OAuth authentication with the authorization code.
36
- */
37
- export declare function completeAuth(serverName: string, authorizationCode: string): Promise<AuthStatus>;
38
- /**
39
- * Perform the complete OAuth authentication flow for a server.
40
- *
41
- * @param serverName - The name of the MCP server
42
- * @param serverUrl - The URL of the MCP server
43
- * @param definition - The server definition (optional)
44
- * @returns The final auth status
45
- */
46
- export declare function authenticate(serverName: string, serverUrl: string, definition?: ServerEntry, options?: AuthenticateOptions): Promise<AuthStatus>;
23
+ /** Each session owns its flows; only the callback listener is shared. */
24
+ export declare function createMcpAuthFlow(): {
25
+ startAuth: (serverName: string, serverUrl: string, definition?: ServerEntry | undefined) => Promise<{
26
+ authorizationUrl: string;
27
+ }>;
28
+ completeAuth: (serverName: string, code: string) => Promise<AuthStatus>;
29
+ completeAuthFromInput: (serverName: string, input: string) => Promise<AuthStatus>;
30
+ authenticate: (serverName: string, serverUrl: string, definition?: ServerEntry | undefined, options?: AuthenticateOptions) => Promise<AuthStatus>;
31
+ removeAuth: (serverName: string) => Promise<void>;
32
+ shutdown: () => Promise<void>;
33
+ };
34
+ export type McpAuthFlow = ReturnType<typeof createMcpAuthFlow>;
47
35
  /**
48
36
  * Get a valid access token for a server, refreshing if necessary.
49
37
  *
@@ -59,12 +47,6 @@ export declare function getValidToken(serverName: string, serverUrl: string): Pr
59
47
  * @returns The current auth status
60
48
  */
61
49
  export declare function getAuthStatus(serverName: string): Promise<AuthStatus>;
62
- /**
63
- * Remove all OAuth credentials for a server.
64
- *
65
- * @param serverName - The name of the MCP server
66
- */
67
- export declare function removeAuth(serverName: string): Promise<void>;
68
50
  /**
69
51
  * Check if OAuth is supported for a server configuration.
70
52
  * OAuth is supported for HTTP servers unless explicitly disabled.
@@ -73,14 +55,4 @@ export declare function removeAuth(serverName: string): Promise<void>;
73
55
  * @returns True if OAuth is supported
74
56
  */
75
57
  export declare function supportsOAuth(definition: ServerEntry): boolean;
76
- /**
77
- * Initialize the OAuth system on startup.
78
- * OAuth callback binding is lazy and starts from startAuth() only.
79
- */
80
- export declare function initializeOAuth(): Promise<void>;
81
- /**
82
- * Shutdown the OAuth system.
83
- * Stops the callback server and cancels pending auths.
84
- */
85
- export declare function shutdownOAuth(): Promise<void>;
86
58
  //# sourceMappingURL=mcp-auth-flow.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-auth-flow.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAQH,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAQ/E,OAAO,EAWL,KAAK,YAAY,EAClB,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,+BAA+B;AAC/B,MAAM,MAAM,UAAU,GAAG,eAAe,GAAG,SAAS,GAAG,mBAAmB,CAAA;AAE1E,MAAM,WAAW,mBAAmB;IAClC,kBAAkB,CAAC,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACxE;AAsBD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,WAAW,GAAG,cAAc,CAyC1E;AAqCD;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,WAAW,GACvB,OAAO,CAAC;IAAE,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAAC,CAiFvC;AA8DD;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CA+BzF;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,UAAU,CAAC,CAIrB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,UAAU,CAAC,CAerB;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,WAAW,EACxB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,UAAU,CAAC,CAmErB;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA2C9B;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAM3E;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASlE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,WAAW,GAAG,OAAO,CAc9D;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAAG;AAEzD;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAKnD","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.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAQH,OAAO,EAAoB,KAAK,cAAc,EAA0B,MAAM,yBAAyB,CAAA;AASvG,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,eAAe,CAAA;AAEtB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,+BAA+B;AAC/B,MAAM,MAAM,UAAU,GAAG,eAAe,GAAG,SAAS,GAAG,mBAAmB,CAAA;AAE1E,MAAM,WAAW,mBAAmB;IAClC,kBAAkB,CAAC,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACxE;AAcD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,WAAW,GAAG,cAAc,CAyC1E;AAwDD;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CA+BzF;AAUD,yEAAyE;AACzE,wBAAgB,iBAAiB;;;;;;;;;EA4KhC;AAED,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAE9D;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA2C9B;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAM3E;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,WAAW,GAAG,OAAO,CAc9D","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"]}
@@ -8,14 +8,9 @@ import { auth as runSdkAuth, UnauthorizedError, } from "@modelcontextprotocol/sd
8
8
  import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
9
9
  import open from "open";
10
10
  import { McpOAuthProvider } from "./mcp-oauth-provider.js";
11
- import { ensureCallbackServer, waitForCallback, cancelPendingCallback, stopCallbackServer, releaseCallbackServer, } from "./mcp-callback-server.js";
12
- import { getAuthForUrl, isTokenExpired, hasStoredTokens, clearAllCredentials, clearClientInfo, clearTokens, clearCodeVerifier, updateOAuthState, getOAuthState, clearOAuthState, } from "./mcp-auth.js";
13
- // Track pending transports for auth completion
14
- const pendingTransports = new Map();
15
- const pendingAuthStates = new Map();
16
- const pendingAuthCleanupTimers = new Map();
17
- // Deduplicate concurrent authenticate() calls per server.
18
- const pendingAuthentications = new Map();
11
+ import { ensureCallbackServer, waitForCallback, cancelPendingCallback, acquireCallbackServerOwner, releaseCallbackServerOwner, releaseCallbackServer, } from "./mcp-callback-server.js";
12
+ import { getAuthForUrl, isTokenExpired, hasStoredTokens, clearAllCredentials, } from "./mcp-auth.js";
13
+ import { abortable, throwIfAborted } from "./abort.js";
19
14
  /** Timeout for manual auth completion (5 minutes) */
20
15
  const MANUAL_AUTH_TIMEOUT_MS = 5 * 60 * 1000;
21
16
  /**
@@ -103,121 +98,6 @@ function parseOAuthRedirectUri(redirectUri) {
103
98
  const callbackHost = hostname === "[::1]" ? "::1" : hostname;
104
99
  return { port, callbackHost, callbackPath: url.pathname };
105
100
  }
106
- /**
107
- * Start OAuth authentication flow for a server.
108
- * Returns the authorization URL when browser authorization is required.
109
- */
110
- export async function startAuth(serverName, serverUrl, definition) {
111
- const config = definition ? extractOAuthConfig(definition) : {};
112
- if (config.grantType === "client_credentials") {
113
- const storedAuth = await getAuthForUrl(serverName, serverUrl);
114
- if (storedAuth?.clientInfo && !storedAuth.tokens && !config.clientId) {
115
- clearClientInfo(serverName);
116
- clearCodeVerifier(serverName);
117
- await clearOAuthState(serverName);
118
- }
119
- const authProvider = new McpOAuthProvider(serverName, serverUrl, config, {
120
- onRedirect: async () => {
121
- throw new Error("Browser redirect is not used for client_credentials flow");
122
- },
123
- });
124
- const result = await runSdkAuth(authProvider, { serverUrl });
125
- if (result !== "AUTHORIZED") {
126
- throw new UnauthorizedError("Failed to authorize");
127
- }
128
- return { authorizationUrl: "" };
129
- }
130
- const redirectCallback = config.redirectUri !== undefined ? parseOAuthRedirectUri(config.redirectUri) : undefined;
131
- const oauthState = generateState();
132
- try {
133
- await ensureCallbackServer({
134
- strictPort: Boolean(config.clientId) || config.redirectUri !== undefined,
135
- oauthState,
136
- reserveState: true,
137
- ...(redirectCallback ? { port: redirectCallback.port, callbackHost: redirectCallback.callbackHost, callbackPath: redirectCallback.callbackPath } : {}),
138
- });
139
- }
140
- catch (error) {
141
- await clearOAuthState(serverName);
142
- throw error;
143
- }
144
- let capturedUrl;
145
- const authProvider = new McpOAuthProvider(serverName, serverUrl, config, {
146
- onRedirect: async (url) => {
147
- capturedUrl = url;
148
- },
149
- });
150
- try {
151
- const storedAuth = await getAuthForUrl(serverName, serverUrl);
152
- if (storedAuth?.clientInfo && !config.clientId) {
153
- if (!storedAuth.tokens) {
154
- clearClientInfo(serverName);
155
- clearCodeVerifier(serverName);
156
- await clearOAuthState(serverName);
157
- }
158
- else {
159
- const redirectUris = storedAuth.clientInfo.redirectUris;
160
- if (!Array.isArray(redirectUris) || !redirectUris.includes(authProvider.redirectUrl ?? "")) {
161
- clearClientInfo(serverName);
162
- clearTokens(serverName);
163
- clearCodeVerifier(serverName);
164
- await clearOAuthState(serverName);
165
- }
166
- }
167
- }
168
- await updateOAuthState(serverName, oauthState, serverUrl);
169
- const result = await runSdkAuth(authProvider, { serverUrl });
170
- if (result === "AUTHORIZED") {
171
- releaseCallbackServer(oauthState);
172
- await clearOAuthState(serverName);
173
- return { authorizationUrl: "" };
174
- }
175
- if (!capturedUrl) {
176
- throw new UnauthorizedError("OAuth authorization URL was not provided");
177
- }
178
- const pendingTransport = new StreamableHTTPClientTransport(new URL(serverUrl), { authProvider });
179
- await setPendingTransport(serverName, pendingTransport, oauthState);
180
- return { authorizationUrl: capturedUrl.toString() };
181
- }
182
- catch (error) {
183
- await clearPendingAuth(serverName, oauthState);
184
- throw error;
185
- }
186
- }
187
- async function setPendingTransport(serverName, transport, oauthState) {
188
- await clearPendingAuth(serverName);
189
- pendingTransports.set(serverName, transport);
190
- pendingAuthStates.set(serverName, oauthState);
191
- const cleanupTimer = setTimeout(() => {
192
- void clearPendingAuth(serverName, oauthState);
193
- }, MANUAL_AUTH_TIMEOUT_MS);
194
- cleanupTimer.unref?.();
195
- pendingAuthCleanupTimers.set(serverName, cleanupTimer);
196
- }
197
- async function clearPendingAuth(serverName, oauthState) {
198
- const pendingState = pendingAuthStates.get(serverName);
199
- if (oauthState && pendingState && pendingState !== oauthState)
200
- return;
201
- const timer = pendingAuthCleanupTimers.get(serverName);
202
- if (timer) {
203
- clearTimeout(timer);
204
- pendingAuthCleanupTimers.delete(serverName);
205
- }
206
- const transport = pendingTransports.get(serverName);
207
- pendingTransports.delete(serverName);
208
- pendingAuthStates.delete(serverName);
209
- const stateToRelease = pendingState ?? oauthState;
210
- if (stateToRelease) {
211
- releaseCallbackServer(stateToRelease);
212
- const storedState = await getOAuthState(serverName);
213
- if (storedState === stateToRelease) {
214
- await clearOAuthState(serverName);
215
- }
216
- }
217
- if (transport) {
218
- await transport.close().catch(() => { });
219
- }
220
- }
221
101
  function getSearchParamsFromInput(input) {
222
102
  try {
223
103
  const url = new URL(input);
@@ -270,101 +150,182 @@ export function parseAuthorizationCodeInput(input, expectedState) {
270
150
  }
271
151
  throw new Error("Could not find an OAuth authorization code in the provided input");
272
152
  }
273
- /**
274
- * Complete OAuth authentication from manual user input.
275
- */
276
- export async function completeAuthFromInput(serverName, input) {
277
- const oauthState = await getOAuthState(serverName);
278
- const code = parseAuthorizationCodeInput(input, oauthState);
279
- return completeAuth(serverName, code);
280
- }
281
- /**
282
- * Complete OAuth authentication with the authorization code.
283
- */
284
- export async function completeAuth(serverName, authorizationCode) {
285
- const transport = pendingTransports.get(serverName);
286
- if (!transport) {
287
- throw new Error(`No pending OAuth flow for server: ${serverName}`);
288
- }
289
- const oauthState = await getOAuthState(serverName);
290
- try {
291
- // Complete the auth using the transport's finishAuth method
292
- await transport.finishAuth(authorizationCode);
293
- return "authenticated";
294
- }
295
- finally {
296
- await clearPendingAuth(serverName, oauthState);
297
- }
298
- }
299
- /**
300
- * Perform the complete OAuth authentication flow for a server.
301
- *
302
- * @param serverName - The name of the MCP server
303
- * @param serverUrl - The URL of the MCP server
304
- * @param definition - The server definition (optional)
305
- * @returns The final auth status
306
- */
307
- export async function authenticate(serverName, serverUrl, definition, options = {}) {
308
- const inFlight = pendingAuthentications.get(serverName);
309
- if (inFlight) {
310
- return inFlight;
311
- }
312
- const operation = (async () => {
313
- // Start auth flow
314
- const { authorizationUrl } = await startAuth(serverName, serverUrl, definition);
315
- // If no auth URL needed, already authenticated
316
- if (!authorizationUrl) {
317
- return "authenticated";
318
- }
319
- // Get the state that was already generated and stored in startAuth()
320
- const oauthState = await getOAuthState(serverName);
321
- if (!oauthState) {
322
- throw new Error("OAuth state not found - this should not happen");
153
+ /** Each session owns its flows; only the callback listener is shared. */
154
+ export function createMcpAuthFlow() {
155
+ const owner = acquireCallbackServerOwner();
156
+ const flows = new Map();
157
+ const authenticating = new Map();
158
+ let shutdownPromise;
159
+ let closed = false;
160
+ function assertOpen() {
161
+ if (closed)
162
+ throw new Error("MCP OAuth session closed");
163
+ }
164
+ async function clearPendingAuth(serverName, flow = flows.get(serverName)) {
165
+ if (!flow)
166
+ return;
167
+ if (!flow.cleanup) {
168
+ flow.cleanup = (async () => {
169
+ if (flows.get(serverName) === flow)
170
+ flows.delete(serverName);
171
+ if (flow.timer)
172
+ clearTimeout(flow.timer);
173
+ flow.controller.abort(new Error("Authorization cancelled"));
174
+ cancelPendingCallback(flow.state.oauthState);
175
+ releaseCallbackServer(flow.state.oauthState);
176
+ await flow.transport?.close().catch(() => { });
177
+ })();
323
178
  }
324
- // Register the callback BEFORE opening the browser
325
- const callbackPromise = waitForCallback(oauthState);
179
+ await flow.cleanup;
180
+ }
181
+ async function startAuth(serverName, serverUrl, definition) {
182
+ assertOpen();
183
+ const previous = flows.get(serverName);
184
+ if (previous)
185
+ await clearPendingAuth(serverName, previous);
186
+ assertOpen();
187
+ if (flows.has(serverName))
188
+ throw new Error(`OAuth flow already pending for server: ${serverName}`);
189
+ const controller = new AbortController();
190
+ const flow = { controller, state: { oauthState: generateState(), signal: controller.signal } };
191
+ flows.set(serverName, flow);
192
+ const signal = controller.signal;
193
+ const fetchFn = (input, init) => fetch(input, {
194
+ ...init, signal: init?.signal ? AbortSignal.any([init.signal, signal]) : signal,
195
+ });
326
196
  try {
327
- // Open browser. Always surface the URL first so remote/headless users can copy it
328
- // even when the OS browser handoff is unavailable or invisible.
329
- if (options.onAuthorizationUrl) {
330
- await options.onAuthorizationUrl(authorizationUrl);
197
+ const config = definition ? extractOAuthConfig(definition) : {};
198
+ const storedAuth = await getAuthForUrl(serverName, serverUrl);
199
+ throwIfAborted(signal);
200
+ flow.state.clientInfo = storedAuth?.clientInfo;
201
+ // Reuse the registered redirect endpoint and client ID, including clients
202
+ // without tokens. Display metadata changes never invalidate registrations.
203
+ if (config.grantType !== "client_credentials") {
204
+ if (!config.redirectUri && !config.clientId) {
205
+ const registeredRedirect = storedAuth?.clientInfo?.redirectUris?.[0];
206
+ if (registeredRedirect)
207
+ config.redirectUri = registeredRedirect;
208
+ }
209
+ const redirect = config.redirectUri ? parseOAuthRedirectUri(config.redirectUri) : undefined;
210
+ await ensureCallbackServer({
211
+ owner,
212
+ signal,
213
+ strictPort: Boolean(config.clientId || storedAuth?.clientInfo) || config.redirectUri !== undefined,
214
+ oauthState: flow.state.oauthState,
215
+ reserveState: true,
216
+ ...(redirect ? { port: redirect.port, callbackHost: redirect.callbackHost, callbackPath: redirect.callbackPath } : {}),
217
+ });
218
+ throwIfAborted(signal);
219
+ }
220
+ let capturedUrl;
221
+ const authProvider = new McpOAuthProvider(serverName, serverUrl, config, {
222
+ onRedirect: (url) => { throwIfAborted(signal); capturedUrl = url; },
223
+ }, flow.state);
224
+ const result = await abortable(runSdkAuth(authProvider, { serverUrl, fetchFn }), signal);
225
+ throwIfAborted(signal);
226
+ if (result === "AUTHORIZED") {
227
+ await clearPendingAuth(serverName, flow);
228
+ return { authorizationUrl: "" };
331
229
  }
332
- else {
333
- console.log(`MCP Auth: Open this URL to authenticate ${serverName}:\n${authorizationUrl}`);
230
+ if (config.grantType === "client_credentials" || !capturedUrl) {
231
+ throw new UnauthorizedError("OAuth authorization URL was not provided");
334
232
  }
233
+ flow.transport = new StreamableHTTPClientTransport(new URL(serverUrl), { authProvider, fetch: fetchFn });
234
+ flow.timer = setTimeout(() => { void clearPendingAuth(serverName, flow); }, MANUAL_AUTH_TIMEOUT_MS);
235
+ flow.timer.unref?.();
236
+ return { authorizationUrl: capturedUrl.toString() };
237
+ }
238
+ catch (error) {
239
+ await clearPendingAuth(serverName, flow);
240
+ throw error;
241
+ }
242
+ }
243
+ async function completeAuthFromInput(serverName, input) {
244
+ assertOpen();
245
+ const flow = flows.get(serverName);
246
+ if (!flow)
247
+ throw new Error(`No pending OAuth flow for server: ${serverName}`);
248
+ return completeAuth(serverName, parseAuthorizationCodeInput(input, flow.state.oauthState));
249
+ }
250
+ async function completeAuth(serverName, code) {
251
+ assertOpen();
252
+ const flow = flows.get(serverName);
253
+ if (!flow?.transport)
254
+ throw new Error(`No pending OAuth flow for server: ${serverName}`);
255
+ try {
256
+ await abortable(flow.transport.finishAuth(code), flow.state.signal);
257
+ throwIfAborted(flow.state.signal);
258
+ return "authenticated";
259
+ }
260
+ finally {
261
+ await clearPendingAuth(serverName, flow);
262
+ }
263
+ }
264
+ async function authenticate(serverName, serverUrl, definition, options = {}) {
265
+ assertOpen();
266
+ const pending = authenticating.get(serverName);
267
+ if (pending)
268
+ return pending;
269
+ const operation = (async () => {
270
+ const { authorizationUrl } = await startAuth(serverName, serverUrl, definition);
271
+ if (!authorizationUrl)
272
+ return "authenticated";
273
+ assertOpen();
274
+ const flow = flows.get(serverName);
275
+ if (!flow)
276
+ throw new Error(`No pending OAuth flow for server: ${serverName}`);
277
+ const callback = waitForCallback(flow.state.oauthState);
278
+ // Attach a rejection handler before asynchronous UI/browser handoffs.
279
+ void callback.catch(() => { });
335
280
  try {
336
- await open(authorizationUrl);
281
+ if (options.onAuthorizationUrl) {
282
+ await abortable(Promise.resolve(options.onAuthorizationUrl(authorizationUrl)), flow.state.signal);
283
+ }
284
+ else {
285
+ console.log(`MCP Auth: Open this URL to authenticate ${serverName}:\n${authorizationUrl}`);
286
+ }
287
+ throwIfAborted(flow.state.signal);
288
+ try {
289
+ await abortable(open(authorizationUrl), flow.state.signal);
290
+ }
291
+ catch (error) {
292
+ throwIfAborted(flow.state.signal);
293
+ console.warn(`MCP Auth: Failed to open browser for ${serverName}; waiting for manual callback`, { error });
294
+ }
295
+ const code = await callback;
296
+ return await completeAuth(serverName, code);
337
297
  }
338
298
  catch (error) {
339
- console.warn(`MCP Auth: Failed to open browser for ${serverName}; waiting for manual callback`, { error });
340
- }
341
- // Wait for callback
342
- const code = await callbackPromise;
343
- // Validate state
344
- const storedState = await getOAuthState(serverName);
345
- if (storedState !== oauthState) {
346
- await clearOAuthState(serverName);
347
- throw new Error("OAuth state mismatch - potential CSRF attack");
299
+ await clearPendingAuth(serverName, flow);
300
+ throw error;
348
301
  }
349
- await clearOAuthState(serverName);
350
- // Complete the auth
351
- return await completeAuth(serverName, code);
302
+ })();
303
+ authenticating.set(serverName, operation);
304
+ try {
305
+ return await operation;
352
306
  }
353
- catch (error) {
354
- cancelPendingCallback(oauthState);
355
- await clearPendingAuth(serverName, oauthState);
356
- throw error;
307
+ finally {
308
+ if (authenticating.get(serverName) === operation)
309
+ authenticating.delete(serverName);
357
310
  }
358
- })();
359
- pendingAuthentications.set(serverName, operation);
360
- try {
361
- return await operation;
362
311
  }
363
- finally {
364
- if (pendingAuthentications.get(serverName) === operation) {
365
- pendingAuthentications.delete(serverName);
312
+ async function removeAuth(serverName) {
313
+ assertOpen();
314
+ await clearPendingAuth(serverName);
315
+ clearAllCredentials(serverName);
316
+ }
317
+ function shutdown() {
318
+ if (!shutdownPromise) {
319
+ // Mark closed before cleanup can yield, so stale callers cannot start work.
320
+ closed = true;
321
+ shutdownPromise = (async () => {
322
+ await Promise.all([...flows].map(([name, flow]) => clearPendingAuth(name, flow)));
323
+ await releaseCallbackServerOwner(owner);
324
+ })();
366
325
  }
326
+ return shutdownPromise;
367
327
  }
328
+ return { startAuth, completeAuth, completeAuthFromInput, authenticate, removeAuth, shutdown };
368
329
  }
369
330
  /**
370
331
  * Get a valid access token for a server, refreshing if necessary.
@@ -425,21 +386,6 @@ export async function getAuthStatus(serverName) {
425
386
  const expired = await isTokenExpired(serverName);
426
387
  return expired ? "expired" : "authenticated";
427
388
  }
428
- /**
429
- * Remove all OAuth credentials for a server.
430
- *
431
- * @param serverName - The name of the MCP server
432
- */
433
- export async function removeAuth(serverName) {
434
- const oauthState = await getOAuthState(serverName);
435
- if (oauthState) {
436
- cancelPendingCallback(oauthState);
437
- }
438
- await clearPendingAuth(serverName, oauthState);
439
- clearAllCredentials(serverName);
440
- await clearOAuthState(serverName);
441
- console.log(`MCP Auth: Removed credentials for ${serverName}`);
442
- }
443
389
  /**
444
390
  * Check if OAuth is supported for a server configuration.
445
391
  * OAuth is supported for HTTP servers unless explicitly disabled.
@@ -464,19 +410,4 @@ export function supportsOAuth(definition) {
464
410
  // OAuth is enabled when auth is not specified (auto-detect)
465
411
  return definition.auth === undefined;
466
412
  }
467
- /**
468
- * Initialize the OAuth system on startup.
469
- * OAuth callback binding is lazy and starts from startAuth() only.
470
- */
471
- export async function initializeOAuth() { }
472
- /**
473
- * Shutdown the OAuth system.
474
- * Stops the callback server and cancels pending auths.
475
- */
476
- export async function shutdownOAuth() {
477
- for (const serverName of Array.from(pendingTransports.keys())) {
478
- await clearPendingAuth(serverName);
479
- }
480
- await stopCallbackServer();
481
- }
482
413
  //# sourceMappingURL=mcp-auth-flow.js.map