@pentoshi/clai 4.13.1 → 4.14.1

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 (344) hide show
  1. package/CONTRIBUTING.md +9 -4
  2. package/MCP.md +182 -0
  3. package/PROVIDERS.md +69 -0
  4. package/README.md +19 -6
  5. package/dist/agent/runner.js +1 -1
  6. package/dist/agent/runner.js.map +1 -1
  7. package/dist/agent/stream-recovery.d.ts +1 -1
  8. package/dist/agent/stream-recovery.js +10 -4
  9. package/dist/agent/stream-recovery.js.map +1 -1
  10. package/dist/agent/turn/mcp-agent-tools.d.ts +4 -2
  11. package/dist/agent/turn/mcp-agent-tools.js +15 -6
  12. package/dist/agent/turn/mcp-agent-tools.js.map +1 -1
  13. package/dist/agent/turn/tool-call-preparation.d.ts +2 -1
  14. package/dist/agent/turn/tool-call-preparation.js +20 -4
  15. package/dist/agent/turn/tool-call-preparation.js.map +1 -1
  16. package/dist/agent/turn/tool-execution/single-tool.js +1 -1
  17. package/dist/agent/turn/tool-execution/single-tool.js.map +1 -1
  18. package/dist/app/commands/catalog.js +1 -0
  19. package/dist/app/commands/catalog.js.map +1 -1
  20. package/dist/classic/app/action-handlers.js +2 -1
  21. package/dist/classic/app/action-handlers.js.map +1 -1
  22. package/dist/classic/app/app-wiring.js +2 -0
  23. package/dist/classic/app/app-wiring.js.map +1 -1
  24. package/dist/classic/bootstrap/runtime-view.d.ts +6 -0
  25. package/dist/classic/bootstrap/runtime-view.js +46 -0
  26. package/dist/classic/bootstrap/runtime-view.js.map +1 -0
  27. package/dist/classic/bootstrap/terminal-session.d.ts +3 -0
  28. package/dist/classic/bootstrap/terminal-session.js +3 -0
  29. package/dist/classic/bootstrap/terminal-session.js.map +1 -1
  30. package/dist/classic/chrome/composer-controller.d.ts +2 -1
  31. package/dist/classic/chrome/composer-controller.js +36 -19
  32. package/dist/classic/chrome/composer-controller.js.map +1 -1
  33. package/dist/classic/chrome/composer-frame.js +1 -1
  34. package/dist/classic/chrome/composer-frame.js.map +1 -1
  35. package/dist/classic/input/input-router.d.ts +2 -1
  36. package/dist/classic/input/input-router.js +9 -0
  37. package/dist/classic/input/input-router.js.map +1 -1
  38. package/dist/classic/input/key-event.d.ts +3 -0
  39. package/dist/classic/input/key-event.js.map +1 -1
  40. package/dist/classic/input/paste-burst.js +5 -0
  41. package/dist/classic/input/paste-burst.js.map +1 -1
  42. package/dist/classic/input/raw-decoder.d.ts +1 -0
  43. package/dist/classic/input/raw-decoder.js +15 -10
  44. package/dist/classic/input/raw-decoder.js.map +1 -1
  45. package/dist/classic/input/terminal-sequences.d.ts +0 -1
  46. package/dist/classic/input/terminal-sequences.js +0 -1
  47. package/dist/classic/input/terminal-sequences.js.map +1 -1
  48. package/dist/commands/providers.js +2 -0
  49. package/dist/commands/providers.js.map +1 -1
  50. package/dist/index.js +7 -1
  51. package/dist/index.js.map +1 -1
  52. package/dist/llm/adapters/mistral-messages.d.ts +1 -0
  53. package/dist/llm/adapters/mistral-messages.js +56 -0
  54. package/dist/llm/adapters/mistral-messages.js.map +1 -0
  55. package/dist/llm/capabilities.js +63 -1
  56. package/dist/llm/capabilities.js.map +1 -1
  57. package/dist/llm/capability/state.d.ts +1 -1
  58. package/dist/llm/capability/tool-dialect.js +8 -1
  59. package/dist/llm/capability/tool-dialect.js.map +1 -1
  60. package/dist/llm/capability/vision-patterns.js +6 -0
  61. package/dist/llm/capability/vision-patterns.js.map +1 -1
  62. package/dist/llm/capability/vision-registry.js +11 -1
  63. package/dist/llm/capability/vision-registry.js.map +1 -1
  64. package/dist/llm/catalog-context.d.ts +6 -0
  65. package/dist/llm/catalog-context.js +15 -0
  66. package/dist/llm/catalog-context.js.map +1 -0
  67. package/dist/llm/catalog-facts.d.ts +2 -0
  68. package/dist/llm/catalog-facts.js.map +1 -1
  69. package/dist/llm/cline-model-catalog.d.ts +4 -0
  70. package/dist/llm/cline-model-catalog.js +197 -0
  71. package/dist/llm/cline-model-catalog.js.map +1 -0
  72. package/dist/llm/cline.d.ts +1 -0
  73. package/dist/llm/cline.js +69 -17
  74. package/dist/llm/cline.js.map +1 -1
  75. package/dist/llm/free-model-limits.d.ts +1 -0
  76. package/dist/llm/free-model-limits.js +101 -0
  77. package/dist/llm/free-model-limits.js.map +1 -0
  78. package/dist/llm/free.js +136 -103
  79. package/dist/llm/free.js.map +1 -1
  80. package/dist/llm/http.d.ts +2 -1
  81. package/dist/llm/http.js +3 -1
  82. package/dist/llm/http.js.map +1 -1
  83. package/dist/llm/mistral-models.d.ts +2 -0
  84. package/dist/llm/mistral-models.js +23 -0
  85. package/dist/llm/mistral-models.js.map +1 -0
  86. package/dist/llm/mistral.d.ts +2 -0
  87. package/dist/llm/mistral.js +129 -0
  88. package/dist/llm/mistral.js.map +1 -0
  89. package/dist/llm/profile/layer-merge.js +3 -3
  90. package/dist/llm/profile/layer-merge.js.map +1 -1
  91. package/dist/llm/provider-identity.js +5 -0
  92. package/dist/llm/provider-identity.js.map +1 -1
  93. package/dist/llm/provider-info-text.js +26 -0
  94. package/dist/llm/provider-info-text.js.map +1 -1
  95. package/dist/llm/provider-model-layers.js +45 -0
  96. package/dist/llm/provider-model-layers.js.map +1 -1
  97. package/dist/llm/provider-profile-layers.js +25 -0
  98. package/dist/llm/provider-profile-layers.js.map +1 -1
  99. package/dist/llm/provider-profiles.js +28 -4
  100. package/dist/llm/provider-profiles.js.map +1 -1
  101. package/dist/llm/qoder/qoder-catalog.d.ts +15 -0
  102. package/dist/llm/qoder/qoder-catalog.js +56 -0
  103. package/dist/llm/qoder/qoder-catalog.js.map +1 -0
  104. package/dist/llm/qoder/qoder-http.d.ts +13 -0
  105. package/dist/llm/qoder/qoder-http.js +55 -0
  106. package/dist/llm/qoder/qoder-http.js.map +1 -0
  107. package/dist/llm/qoder/qoder-queue.d.ts +15 -0
  108. package/dist/llm/qoder/qoder-queue.js +169 -0
  109. package/dist/llm/qoder/qoder-queue.js.map +1 -0
  110. package/dist/llm/qoder/qoder-response.d.ts +19 -0
  111. package/dist/llm/qoder/qoder-response.js +98 -0
  112. package/dist/llm/qoder/qoder-response.js.map +1 -0
  113. package/dist/llm/qoder/qoder-stream.d.ts +23 -0
  114. package/dist/llm/qoder/qoder-stream.js +75 -0
  115. package/dist/llm/qoder/qoder-stream.js.map +1 -0
  116. package/dist/llm/qoder/qoder.d.ts +4 -4
  117. package/dist/llm/qoder/qoder.js +71 -189
  118. package/dist/llm/qoder/qoder.js.map +1 -1
  119. package/dist/llm/quota-signals.d.ts +1 -0
  120. package/dist/llm/quota-signals.js +8 -0
  121. package/dist/llm/quota-signals.js.map +1 -1
  122. package/dist/llm/reasoning-capability.js +1 -0
  123. package/dist/llm/reasoning-capability.js.map +1 -1
  124. package/dist/llm/request-plan.js +15 -6
  125. package/dist/llm/request-plan.js.map +1 -1
  126. package/dist/llm/router.js +1 -1
  127. package/dist/llm/router.js.map +1 -1
  128. package/dist/llm/routing/attempt-complete.js +4 -3
  129. package/dist/llm/routing/attempt-complete.js.map +1 -1
  130. package/dist/llm/routing/attempt-request.d.ts +5 -1
  131. package/dist/llm/routing/attempt-request.js +22 -2
  132. package/dist/llm/routing/attempt-request.js.map +1 -1
  133. package/dist/llm/routing/attempt-stream.js +4 -3
  134. package/dist/llm/routing/attempt-stream.js.map +1 -1
  135. package/dist/llm/routing/error-classification.js +2 -0
  136. package/dist/llm/routing/error-classification.js.map +1 -1
  137. package/dist/llm/routing/failure-report.d.ts +1 -1
  138. package/dist/llm/routing/failure-report.js +11 -5
  139. package/dist/llm/routing/failure-report.js.map +1 -1
  140. package/dist/llm/routing/provider-selection.js +3 -0
  141. package/dist/llm/routing/provider-selection.js.map +1 -1
  142. package/dist/llm/tool-protocol.d.ts +1 -1
  143. package/dist/llm/tool-protocol.js +4 -1
  144. package/dist/llm/tool-protocol.js.map +1 -1
  145. package/dist/llm/wire/chat-body.js +51 -28
  146. package/dist/llm/wire/chat-body.js.map +1 -1
  147. package/dist/llm/wire/effort-preflight.js +4 -1
  148. package/dist/llm/wire/effort-preflight.js.map +1 -1
  149. package/dist/llm/wire/mistral-content.d.ts +19 -0
  150. package/dist/llm/wire/mistral-content.js +106 -0
  151. package/dist/llm/wire/mistral-content.js.map +1 -0
  152. package/dist/llm/wire/mistral-model-catalog.d.ts +2 -0
  153. package/dist/llm/wire/mistral-model-catalog.js +73 -0
  154. package/dist/llm/wire/mistral-model-catalog.js.map +1 -0
  155. package/dist/llm/wire/openai-complete.js +10 -4
  156. package/dist/llm/wire/openai-complete.js.map +1 -1
  157. package/dist/llm/wire/openai-stream.js +38 -16
  158. package/dist/llm/wire/openai-stream.js.map +1 -1
  159. package/dist/llm/wire/response-errors.d.ts +1 -0
  160. package/dist/llm/wire/response-errors.js +1 -1
  161. package/dist/llm/wire/response-errors.js.map +1 -1
  162. package/dist/mcp/auth/device.d.ts +7 -3
  163. package/dist/mcp/auth/device.js +55 -32
  164. package/dist/mcp/auth/device.js.map +1 -1
  165. package/dist/mcp/auth/http.d.ts +12 -0
  166. package/dist/mcp/auth/http.js +62 -0
  167. package/dist/mcp/auth/http.js.map +1 -0
  168. package/dist/mcp/auth/loopback.d.ts +9 -1
  169. package/dist/mcp/auth/loopback.js +80 -8
  170. package/dist/mcp/auth/loopback.js.map +1 -1
  171. package/dist/mcp/auth/metadata.d.ts +2 -3
  172. package/dist/mcp/auth/metadata.js +25 -25
  173. package/dist/mcp/auth/metadata.js.map +1 -1
  174. package/dist/mcp/auth/provider.d.ts +1 -0
  175. package/dist/mcp/auth/provider.js +215 -42
  176. package/dist/mcp/auth/provider.js.map +1 -1
  177. package/dist/mcp/auth/registration.d.ts +2 -3
  178. package/dist/mcp/auth/registration.js +10 -14
  179. package/dist/mcp/auth/registration.js.map +1 -1
  180. package/dist/mcp/auth/token-exchange.d.ts +5 -3
  181. package/dist/mcp/auth/token-exchange.js +15 -15
  182. package/dist/mcp/auth/token-exchange.js.map +1 -1
  183. package/dist/mcp/auth/token-store.d.ts +1 -1
  184. package/dist/mcp/auth/token-store.js +105 -54
  185. package/dist/mcp/auth/token-store.js.map +1 -1
  186. package/dist/mcp/auth/types.d.ts +11 -2
  187. package/dist/mcp/catalog.d.ts +11 -0
  188. package/dist/mcp/catalog.js +58 -0
  189. package/dist/mcp/catalog.js.map +1 -0
  190. package/dist/mcp/client.d.ts +10 -1
  191. package/dist/mcp/client.js +93 -29
  192. package/dist/mcp/client.js.map +1 -1
  193. package/dist/mcp/coerce.js +4 -4
  194. package/dist/mcp/coerce.js.map +1 -1
  195. package/dist/mcp/config-file.js +53 -10
  196. package/dist/mcp/config-file.js.map +1 -1
  197. package/dist/mcp/discovery.js +2 -0
  198. package/dist/mcp/discovery.js.map +1 -1
  199. package/dist/mcp/jsonrpc.js +28 -18
  200. package/dist/mcp/jsonrpc.js.map +1 -1
  201. package/dist/mcp/manager.d.ts +17 -0
  202. package/dist/mcp/manager.js +211 -29
  203. package/dist/mcp/manager.js.map +1 -1
  204. package/dist/mcp/results.js +25 -10
  205. package/dist/mcp/results.js.map +1 -1
  206. package/dist/mcp/runtime.d.ts +6 -6
  207. package/dist/mcp/runtime.js +168 -60
  208. package/dist/mcp/runtime.js.map +1 -1
  209. package/dist/mcp/schema-compact.js +3 -29
  210. package/dist/mcp/schema-compact.js.map +1 -1
  211. package/dist/mcp/storage-lock.d.ts +1 -0
  212. package/dist/mcp/storage-lock.js +80 -0
  213. package/dist/mcp/storage-lock.js.map +1 -0
  214. package/dist/mcp/transport-http.d.ts +13 -2
  215. package/dist/mcp/transport-http.js +245 -77
  216. package/dist/mcp/transport-http.js.map +1 -1
  217. package/dist/mcp/transport-stdio.d.ts +5 -2
  218. package/dist/mcp/transport-stdio.js +96 -52
  219. package/dist/mcp/transport-stdio.js.map +1 -1
  220. package/dist/mcp/transport.d.ts +9 -1
  221. package/dist/mcp/transport.js +38 -0
  222. package/dist/mcp/transport.js.map +1 -1
  223. package/dist/mcp/types.d.ts +8 -2
  224. package/dist/mcp/types.js +1 -5
  225. package/dist/mcp/types.js.map +1 -1
  226. package/dist/mcp/validation.js +81 -12
  227. package/dist/mcp/validation.js.map +1 -1
  228. package/dist/noninteractive/stream-renderer.d.ts +1 -0
  229. package/dist/noninteractive/stream-renderer.js +13 -0
  230. package/dist/noninteractive/stream-renderer.js.map +1 -1
  231. package/dist/session-runtime/child-bridge.d.ts +10 -4
  232. package/dist/session-runtime/child-bridge.js +34 -6
  233. package/dist/session-runtime/child-bridge.js.map +1 -1
  234. package/dist/session-runtime/client.d.ts +3 -2
  235. package/dist/session-runtime/client.js +22 -9
  236. package/dist/session-runtime/client.js.map +1 -1
  237. package/dist/session-runtime/host.d.ts +4 -0
  238. package/dist/session-runtime/host.js +108 -16
  239. package/dist/session-runtime/host.js.map +1 -1
  240. package/dist/session-runtime/launch.d.ts +1 -0
  241. package/dist/session-runtime/launch.js +3 -1
  242. package/dist/session-runtime/launch.js.map +1 -1
  243. package/dist/session-runtime/start-runtime.d.ts +12 -0
  244. package/dist/session-runtime/start-runtime.js +69 -0
  245. package/dist/session-runtime/start-runtime.js.map +1 -0
  246. package/dist/session-runtime/store.js +1 -0
  247. package/dist/session-runtime/store.js.map +1 -1
  248. package/dist/session-runtime/terminal-options.d.ts +4 -0
  249. package/dist/session-runtime/terminal-options.js +49 -0
  250. package/dist/session-runtime/terminal-options.js.map +1 -0
  251. package/dist/session-runtime/types.d.ts +38 -1
  252. package/dist/session-runtime/view-manager.d.ts +38 -0
  253. package/dist/session-runtime/view-manager.js +189 -0
  254. package/dist/session-runtime/view-manager.js.map +1 -0
  255. package/dist/session-runtime/view-services.d.ts +14 -0
  256. package/dist/session-runtime/view-services.js +83 -0
  257. package/dist/session-runtime/view-services.js.map +1 -0
  258. package/dist/session-runtime/view-terminal.d.ts +29 -0
  259. package/dist/session-runtime/view-terminal.js +51 -0
  260. package/dist/session-runtime/view-terminal.js.map +1 -0
  261. package/dist/store/config/endpoints.js +1 -0
  262. package/dist/store/config/endpoints.js.map +1 -1
  263. package/dist/store/config.js +2 -0
  264. package/dist/store/config.js.map +1 -1
  265. package/dist/store/rtk-usage.d.ts +1 -0
  266. package/dist/store/rtk-usage.js +8 -3
  267. package/dist/store/rtk-usage.js.map +1 -1
  268. package/dist/tools/definitions/aggregate.js +4 -1
  269. package/dist/tools/definitions/aggregate.js.map +1 -1
  270. package/dist/tools/rtk/binary.d.ts +2 -2
  271. package/dist/tools/rtk/binary.js +12 -4
  272. package/dist/tools/rtk/binary.js.map +1 -1
  273. package/dist/tools/rtk/rewrite.js +13 -3
  274. package/dist/tools/rtk/rewrite.js.map +1 -1
  275. package/dist/tui-v2/bootstrap/runtime-view.d.ts +6 -0
  276. package/dist/tui-v2/bootstrap/runtime-view.js +54 -0
  277. package/dist/tui-v2/bootstrap/runtime-view.js.map +1 -0
  278. package/dist/tui-v2/components/composer/composer-input-box.d.ts +6 -1
  279. package/dist/tui-v2/components/composer/composer-input-box.js +27 -18
  280. package/dist/tui-v2/components/composer/composer-input-box.js.map +1 -1
  281. package/dist/tui-v2/components/composer/paste-chip.d.ts +3 -2
  282. package/dist/tui-v2/components/composer/paste-chip.js +17 -48
  283. package/dist/tui-v2/components/composer/paste-chip.js.map +1 -1
  284. package/dist/tui-v2/composer/composer-cursor.d.ts +3 -0
  285. package/dist/tui-v2/composer/composer-cursor.js +21 -0
  286. package/dist/tui-v2/composer/composer-cursor.js.map +1 -0
  287. package/dist/tui-v2/composer/composer-editor.js +91 -100
  288. package/dist/tui-v2/composer/composer-editor.js.map +1 -1
  289. package/dist/tui-v2/composer/composer-highlight.d.ts +6 -1
  290. package/dist/tui-v2/composer/composer-highlight.js +9 -2
  291. package/dist/tui-v2/composer/composer-highlight.js.map +1 -1
  292. package/dist/tui-v2/composer/composer-wheel.js +2 -1
  293. package/dist/tui-v2/composer/composer-wheel.js.map +1 -1
  294. package/dist/tui-v2/composer/expand-paste.d.ts +4 -0
  295. package/dist/tui-v2/composer/expand-paste.js +34 -0
  296. package/dist/tui-v2/composer/expand-paste.js.map +1 -0
  297. package/dist/tui-v2/composer/paste-hit-test.d.ts +28 -0
  298. package/dist/tui-v2/composer/paste-hit-test.js +25 -0
  299. package/dist/tui-v2/composer/paste-hit-test.js.map +1 -0
  300. package/dist/tui-v2/composer/use-draft-actions.js +3 -1
  301. package/dist/tui-v2/composer/use-draft-actions.js.map +1 -1
  302. package/dist/tui-v2/input/paste-burst-guard.js +3 -0
  303. package/dist/tui-v2/input/paste-burst-guard.js.map +1 -1
  304. package/dist/types.d.ts +4 -3
  305. package/dist/types.js +1 -0
  306. package/dist/types.js.map +1 -1
  307. package/dist/ui/mentions.js +12 -1
  308. package/dist/ui/mentions.js.map +1 -1
  309. package/dist/ui-core/actions/action-id.d.ts +1 -1
  310. package/dist/ui-core/actions/action-id.js +1 -0
  311. package/dist/ui-core/actions/action-id.js.map +1 -1
  312. package/dist/ui-core/actions/format-shortcuts.js +3 -2
  313. package/dist/ui-core/actions/format-shortcuts.js.map +1 -1
  314. package/dist/ui-core/actions/keymap.js +2 -0
  315. package/dist/ui-core/actions/keymap.js.map +1 -1
  316. package/dist/ui-core/bootstrap/composition-root.d.ts +4 -1
  317. package/dist/ui-core/bootstrap/composition-root.js +33 -14
  318. package/dist/ui-core/bootstrap/composition-root.js.map +1 -1
  319. package/dist/ui-core/commands/mcp-commands.js +3 -3
  320. package/dist/ui-core/commands/mcp-commands.js.map +1 -1
  321. package/dist/ui-core/commands/pickers/search-reasoning.js +21 -6
  322. package/dist/ui-core/commands/pickers/search-reasoning.js.map +1 -1
  323. package/dist/ui-core/commands/rtk-commands.js +3 -3
  324. package/dist/ui-core/commands/rtk-commands.js.map +1 -1
  325. package/dist/ui-core/commands/session-commands.js +1 -1
  326. package/dist/ui-core/commands/session-commands.js.map +1 -1
  327. package/dist/ui-core/composer/completion.d.ts +1 -0
  328. package/dist/ui-core/composer/completion.js +31 -3
  329. package/dist/ui-core/composer/completion.js.map +1 -1
  330. package/dist/ui-core/composer/composer-height.d.ts +1 -1
  331. package/dist/ui-core/composer/composer-height.js +26 -3
  332. package/dist/ui-core/composer/composer-height.js.map +1 -1
  333. package/dist/ui-core/composer/paste-placeholder.d.ts +10 -0
  334. package/dist/ui-core/composer/paste-placeholder.js +60 -12
  335. package/dist/ui-core/composer/paste-placeholder.js.map +1 -1
  336. package/dist/ui-core/input/paste-burst.d.ts +2 -1
  337. package/dist/ui-core/input/paste-burst.js +20 -0
  338. package/dist/ui-core/input/paste-burst.js.map +1 -1
  339. package/dist/ui-core/state/transcript-store.d.ts +7 -0
  340. package/dist/ui-core/state/transcript-store.js +53 -0
  341. package/dist/ui-core/state/transcript-store.js.map +1 -1
  342. package/dist/version.generated.d.ts +2 -2
  343. package/dist/version.generated.js +2 -2
  344. package/package.json +3 -2
@@ -1,9 +1,11 @@
1
1
  import { McpTransportError } from "../transport.js";
2
+ import { fetchOAuthJson } from "./http.js";
2
3
  import { assertSafeDiscoveryUrl } from "./security.js";
4
+ import { applyClientAuthentication } from "./token-exchange.js";
5
+ import { setTimeout as delay } from "node:timers/promises";
3
6
  const DEFAULT_INTERVAL_SECONDS = 5;
4
7
  const DEFAULT_EXPIRES_SECONDS = 900;
5
8
  const SLOW_DOWN_EXTRA_SECONDS = 5;
6
- const MAX_POLL_INTERVAL_SECONDS = 60;
7
9
  function defaultSleep(ms) {
8
10
  return new Promise((resolve) => {
9
11
  const timer = setTimeout(resolve, ms);
@@ -11,38 +13,28 @@ function defaultSleep(ms) {
11
13
  timer.unref();
12
14
  });
13
15
  }
14
- async function postForm(url, form, deps) {
15
- const validate = deps.validateUrl ?? assertSafeDiscoveryUrl;
16
- const target = validate(url);
17
- const impl = deps.fetchImpl ?? fetch;
18
- const response = await impl(target.toString(), {
16
+ async function postForm(url, form, deps, headers = {}) {
17
+ const response = await fetchOAuthJson(url, {
19
18
  method: "POST",
20
19
  headers: {
21
20
  "content-type": "application/x-www-form-urlencoded",
22
21
  accept: "application/json",
22
+ ...headers,
23
23
  },
24
24
  body: form.toString(),
25
- redirect: "manual",
26
- });
27
- const text = await response.text().catch(() => "");
28
- let record;
29
- try {
30
- const parsed = JSON.parse(text);
31
- if (typeof parsed === "object" && parsed !== null) {
32
- record = parsed;
33
- }
34
- }
35
- catch {
36
- record = undefined;
37
- }
38
- return { status: response.status, record };
25
+ }, deps);
26
+ return { status: response.status, record: response.record };
39
27
  }
40
28
  export async function requestDeviceAuthorization(params, deps = {}) {
41
29
  const form = new URLSearchParams();
42
30
  form.set("client_id", params.clientId);
43
31
  if (params.scope)
44
32
  form.set("scope", params.scope);
45
- const { status, record } = await postForm(params.deviceAuthorizationEndpoint, form, deps);
33
+ if (params.resource)
34
+ form.set("resource", params.resource);
35
+ const headers = {};
36
+ applyClientAuthentication(form, headers, params.clientId, params.clientSecret, params.authMethod);
37
+ const { status, record } = await postForm(params.deviceAuthorizationEndpoint, form, deps, headers);
46
38
  const deviceCode = record?.device_code;
47
39
  const userCode = record?.user_code;
48
40
  const verificationUri = record?.verification_uri ?? record?.verification_url;
@@ -61,15 +53,18 @@ export async function requestDeviceAuthorization(params, deps = {}) {
61
53
  const complete = record?.verification_uri_complete;
62
54
  const interval = record?.interval;
63
55
  const expiresIn = record?.expires_in;
56
+ const validateUrl = deps.validateUrl ?? assertSafeDiscoveryUrl;
57
+ const verifiedUri = validateUrl(verificationUri).toString();
58
+ const verifiedComplete = typeof complete === "string" ? validateUrl(complete).toString() : undefined;
64
59
  return {
65
60
  deviceCode,
66
61
  userCode,
67
- verificationUri,
68
- ...(typeof complete === "string" ? { verificationUriComplete: complete } : {}),
69
- intervalSeconds: typeof interval === "number" && interval > 0
70
- ? Math.min(interval, MAX_POLL_INTERVAL_SECONDS)
62
+ verificationUri: verifiedUri,
63
+ ...(verifiedComplete ? { verificationUriComplete: verifiedComplete } : {}),
64
+ intervalSeconds: typeof interval === "number" && Number.isFinite(interval) && interval > 0
65
+ ? interval
71
66
  : DEFAULT_INTERVAL_SECONDS,
72
- expiresInSeconds: typeof expiresIn === "number" && expiresIn > 0
67
+ expiresInSeconds: typeof expiresIn === "number" && Number.isFinite(expiresIn) && expiresIn > 0
73
68
  ? expiresIn
74
69
  : DEFAULT_EXPIRES_SECONDS,
75
70
  };
@@ -79,20 +74,48 @@ export async function pollDeviceTokens(params, deps = {}) {
79
74
  const deadline = Date.now() + params.expiresInSeconds * 1000;
80
75
  let intervalMs = Math.max(1, params.intervalSeconds) * 1000;
81
76
  for (;;) {
77
+ if (deps.signal?.aborted)
78
+ throw new McpTransportError("cancelled", "MCP OAuth device sign-in cancelled.");
82
79
  if (Date.now() >= deadline) {
83
80
  throw new McpTransportError("timeout", "MCP OAuth device authorization expired before sign-in completed.");
84
81
  }
85
- await sleep(Math.min(intervalMs, Math.max(0, deadline - Date.now())));
82
+ const waitMs = Math.min(intervalMs, Math.max(0, deadline - Date.now()));
83
+ if (deps.signal && !deps.sleep)
84
+ await delay(waitMs, undefined, { signal: deps.signal, ref: false });
85
+ else
86
+ await sleep(waitMs);
87
+ if (deps.signal?.aborted)
88
+ throw new McpTransportError("cancelled", "MCP OAuth device sign-in cancelled.");
89
+ if (Date.now() >= deadline)
90
+ throw new McpTransportError("timeout", "MCP OAuth device authorization expired before sign-in completed.");
86
91
  const form = new URLSearchParams();
87
92
  form.set("grant_type", "urn:ietf:params:oauth:grant-type:device_code");
88
93
  form.set("device_code", params.deviceCode);
89
94
  form.set("client_id", params.clientId);
90
- if (params.clientSecret !== undefined) {
91
- form.set("client_secret", params.clientSecret);
95
+ if (params.resource)
96
+ form.set("resource", params.resource);
97
+ const headers = {};
98
+ applyClientAuthentication(form, headers, params.clientId, params.clientSecret, params.authMethod);
99
+ let response;
100
+ try {
101
+ response = await postForm(params.tokenEndpoint, form, deps, headers);
102
+ }
103
+ catch (error) {
104
+ if (deps.signal?.aborted)
105
+ throw error;
106
+ if (error instanceof TypeError ||
107
+ (error instanceof McpTransportError && ["timeout", "network"].includes(error.kind))) {
108
+ intervalMs *= 2;
109
+ continue;
110
+ }
111
+ throw error;
92
112
  }
93
- const { status, record } = await postForm(params.tokenEndpoint, form, deps);
113
+ const { status, record } = response;
94
114
  const accessToken = record?.access_token;
95
- if (status >= 200 && status < 300 && typeof accessToken === "string" && accessToken.length > 0) {
115
+ if (status >= 200 &&
116
+ status < 300 &&
117
+ typeof accessToken === "string" &&
118
+ accessToken.length > 0) {
96
119
  return {
97
120
  accessToken,
98
121
  tokenType: typeof record?.token_type === "string" ? record.token_type : "Bearer",
@@ -107,7 +130,7 @@ export async function pollDeviceTokens(params, deps = {}) {
107
130
  if (error === "authorization_pending")
108
131
  continue;
109
132
  if (error === "slow_down") {
110
- intervalMs = Math.min((intervalMs + SLOW_DOWN_EXTRA_SECONDS * 1000), MAX_POLL_INTERVAL_SECONDS * 1000);
133
+ intervalMs += SLOW_DOWN_EXTRA_SECONDS * 1000;
111
134
  continue;
112
135
  }
113
136
  if (error === "access_denied") {
@@ -1 +1 @@
1
- {"version":3,"file":"device.js","sourceRoot":"","sources":["../../../src/mcp/auth/device.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"device.js","sourceRoot":"","sources":["../../../src/mcp/auth/device.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface OAuthHttpDeps {
2
+ readonly fetchImpl?: typeof fetch | undefined;
3
+ readonly validateUrl?: ((url: string) => URL) | undefined;
4
+ readonly signal?: AbortSignal | undefined;
5
+ readonly timeoutMs?: number | undefined;
6
+ }
7
+ export declare function fetchOAuthJson(url: string, init: RequestInit, deps: OAuthHttpDeps): Promise<{
8
+ status: number;
9
+ ok: boolean;
10
+ record: Record<string, unknown> | undefined;
11
+ }>;
12
+ export declare function oauthErrorDetail(record: Record<string, unknown> | undefined): string;
@@ -0,0 +1,62 @@
1
+ import { McpTransportError, withTimeout } from "../transport.js";
2
+ import { assertSafeDiscoveryUrl } from "./security.js";
3
+ export async function fetchOAuthJson(url, init, deps) {
4
+ const target = (deps.validateUrl ?? assertSafeDiscoveryUrl)(url);
5
+ const { signal, dispose } = withTimeout(deps.signal, deps.timeoutMs ?? 15_000);
6
+ let reader;
7
+ try {
8
+ const response = await (deps.fetchImpl ?? fetch)(target.toString(), {
9
+ ...init,
10
+ redirect: "manual",
11
+ signal,
12
+ });
13
+ if (response.status >= 300 && response.status < 400) {
14
+ await response.body?.cancel().catch(() => undefined);
15
+ throw new McpTransportError("protocol", "MCP OAuth endpoint attempted a redirect; use its final URL.");
16
+ }
17
+ const decoder = new TextDecoder();
18
+ let text = "";
19
+ let bytes = 0;
20
+ if (response.body) {
21
+ reader = response.body.getReader();
22
+ for (;;) {
23
+ const { value, done } = await reader.read();
24
+ if (done)
25
+ break;
26
+ if (!value)
27
+ continue;
28
+ bytes += value.byteLength;
29
+ if (bytes > 256 * 1024)
30
+ throw new McpTransportError("too-large", "MCP OAuth document exceeded the size limit.");
31
+ text += decoder.decode(value, { stream: true });
32
+ }
33
+ text += decoder.decode();
34
+ }
35
+ let record;
36
+ try {
37
+ const parsed = JSON.parse(text);
38
+ if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed))
39
+ record = parsed;
40
+ }
41
+ catch {
42
+ record = undefined;
43
+ }
44
+ return { status: response.status, ok: response.ok, record };
45
+ }
46
+ catch (error) {
47
+ if (signal.aborted)
48
+ throw signal.reason instanceof McpTransportError
49
+ ? signal.reason
50
+ : new McpTransportError("cancelled", "MCP OAuth request cancelled.");
51
+ throw error;
52
+ }
53
+ finally {
54
+ await reader?.cancel().catch(() => undefined);
55
+ dispose();
56
+ }
57
+ }
58
+ export function oauthErrorDetail(record) {
59
+ const detail = record?.error_description ?? record?.error;
60
+ return typeof detail === "string" ? `: ${detail.slice(0, 200)}` : "";
61
+ }
62
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/mcp/auth/http.ts"],"names":[],"mappings":"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"}
@@ -4,14 +4,22 @@ export interface OpenBrowserDeps {
4
4
  readonly platform?: NodeJS.Platform | undefined;
5
5
  readonly spawnImpl?: typeof spawn | undefined;
6
6
  }
7
+ export declare function systemBrowserAvailable(env?: Readonly<Record<string, string | undefined>>, platform?: NodeJS.Platform): boolean;
7
8
  export declare function openSystemBrowser(rawUrl: string, deps?: OpenBrowserDeps): Promise<void>;
8
9
  export interface LoopbackAuthorizationParams {
9
10
  buildAuthorizationUrl(redirectUri: string, state: string): string | Promise<string>;
10
- openBrowser(url: string): Promise<void>;
11
+ readonly openBrowser?: ((url: string) => Promise<void>) | undefined;
11
12
  readonly timeoutMs?: number | undefined;
12
13
  readonly host?: string | undefined;
14
+ readonly port?: number | undefined;
13
15
  readonly callbackPath?: string | undefined;
14
16
  readonly successHtml?: string | undefined;
15
17
  readonly onAuthorizationUrl?: ((url: string) => void) | undefined;
18
+ readonly signal?: AbortSignal | undefined;
19
+ readonly readCallbackUrl?: ((info: {
20
+ url: string;
21
+ redirectUri: string;
22
+ signal: AbortSignal;
23
+ }) => Promise<string | undefined>) | undefined;
16
24
  }
17
25
  export declare function runLoopbackAuthorization(params: LoopbackAuthorizationParams): Promise<LoopbackAuthorizationResult>;
@@ -4,7 +4,7 @@ import { classifyHost } from "../../tools/web/ssrf-guard.js";
4
4
  import { McpTransportError } from "../transport.js";
5
5
  import { randomState } from "./pkce.js";
6
6
  const DEFAULT_TIMEOUT_MS = 300_000;
7
- const DEFAULT_SUCCESS_HTML = "<!doctype html><html><head><meta charset=\"utf-8\"><title>clai</title></head>" +
7
+ const DEFAULT_SUCCESS_HTML = '<!doctype html><html><head><meta charset="utf-8"><title>clai</title></head>' +
8
8
  "<body><p>Authorization complete. You can close this tab and return to clai.</p></body></html>";
9
9
  function assertBrowserUrl(raw) {
10
10
  let url;
@@ -23,6 +23,13 @@ function assertBrowserUrl(raw) {
23
23
  }
24
24
  throw new McpTransportError("protocol", `Refusing to open a browser for scheme "${url.protocol}"; only https or loopback http are allowed.`);
25
25
  }
26
+ export function systemBrowserAvailable(env = process.env, platform = process.platform) {
27
+ if (env.SSH_CONNECTION || env.SSH_TTY)
28
+ return false;
29
+ return (platform === "darwin" ||
30
+ platform === "win32" ||
31
+ Boolean(env.DISPLAY || env.WAYLAND_DISPLAY || env.TERMUX_VERSION));
32
+ }
26
33
  function browserCommand(platform, url) {
27
34
  if (platform === "darwin")
28
35
  return { command: "open", args: [url] };
@@ -65,16 +72,25 @@ export async function openSystemBrowser(rawUrl, deps = {}) {
65
72
  function readCallback(requestUrl, callbackPath, expectedState) {
66
73
  if (requestUrl.pathname !== callbackPath)
67
74
  return { kind: "ignore" };
68
- const error = requestUrl.searchParams.get("error");
69
- if (error)
70
- return { kind: "error", reason: `authorization server returned error "${error}"` };
71
75
  const returnedState = requestUrl.searchParams.get("state");
72
76
  if (!returnedState || returnedState !== expectedState) {
73
- return { kind: "error", reason: "authorization state did not match the request (possible CSRF)" };
77
+ return {
78
+ kind: "error",
79
+ reason: "authorization state did not match the request (possible CSRF)",
80
+ };
74
81
  }
82
+ const error = requestUrl.searchParams.get("error");
83
+ if (error)
84
+ return {
85
+ kind: "error",
86
+ reason: `authorization server returned error "${error}"`,
87
+ };
75
88
  const code = requestUrl.searchParams.get("code");
76
89
  if (!code)
77
- return { kind: "error", reason: "authorization response contained no code" };
90
+ return {
91
+ kind: "error",
92
+ reason: "authorization response contained no code",
93
+ };
78
94
  return { kind: "ok", code };
79
95
  }
80
96
  export function runLoopbackAuthorization(params) {
@@ -86,6 +102,7 @@ export function runLoopbackAuthorization(params) {
86
102
  const server = createServer();
87
103
  let redirectUri = "";
88
104
  let settled = false;
105
+ const controller = new AbortController();
89
106
  const timer = setTimeout(() => {
90
107
  finishReject(new McpTransportError("timeout", "MCP OAuth authorization timed out waiting for the browser callback."));
91
108
  }, params.timeoutMs ?? DEFAULT_TIMEOUT_MS);
@@ -95,6 +112,8 @@ export function runLoopbackAuthorization(params) {
95
112
  clearTimeout(timer);
96
113
  server.closeAllConnections?.();
97
114
  server.close(() => undefined);
115
+ params.signal?.removeEventListener("abort", onAbort);
116
+ controller.abort();
98
117
  };
99
118
  function finishResolve(result) {
100
119
  if (settled)
@@ -110,6 +129,12 @@ export function runLoopbackAuthorization(params) {
110
129
  close();
111
130
  reject(error);
112
131
  }
132
+ const onAbort = () => finishReject(new McpTransportError("cancelled", "MCP OAuth authorization cancelled."));
133
+ if (params.signal?.aborted) {
134
+ onAbort();
135
+ return;
136
+ }
137
+ params.signal?.addEventListener("abort", onAbort, { once: true });
113
138
  server.on("request", (req, res) => {
114
139
  const requestUrl = new URL(req.url ?? "/", redirectUri || `http://${host}`);
115
140
  const reading = readCallback(requestUrl, callbackPath, state);
@@ -130,14 +155,61 @@ export function runLoopbackAuthorization(params) {
130
155
  }
131
156
  });
132
157
  server.on("error", (error) => finishReject(error));
133
- server.listen(0, host, () => {
158
+ server.listen(params.port ?? 0, host, () => {
134
159
  const port = server.address().port;
135
160
  redirectUri = `http://${host}:${port}${callbackPath}`;
136
161
  Promise.resolve()
137
162
  .then(() => params.buildAuthorizationUrl(redirectUri, state))
138
163
  .then((authUrl) => {
164
+ if (settled)
165
+ return;
139
166
  params.onAuthorizationUrl?.(authUrl);
140
- return params.openBrowser(authUrl);
167
+ if (params.readCallbackUrl) {
168
+ void params
169
+ .readCallbackUrl({
170
+ url: authUrl,
171
+ redirectUri,
172
+ signal: controller.signal,
173
+ })
174
+ .then((callbackUrl) => {
175
+ if (settled)
176
+ return;
177
+ if (callbackUrl === undefined) {
178
+ finishReject(new McpTransportError("cancelled", "MCP OAuth authorization cancelled."));
179
+ return;
180
+ }
181
+ let callback;
182
+ try {
183
+ callback = new URL(callbackUrl.trim());
184
+ }
185
+ catch {
186
+ throw new McpTransportError("protocol", "Paste the complete OAuth callback URL, including code and state.");
187
+ }
188
+ const expected = new URL(redirectUri);
189
+ if (callback.origin !== expected.origin ||
190
+ callback.pathname !== expected.pathname ||
191
+ callback.username ||
192
+ callback.password) {
193
+ throw new McpTransportError("protocol", "OAuth callback URL did not match this sign-in request.");
194
+ }
195
+ const reading = readCallback(callback, callbackPath, state);
196
+ if (reading.kind === "ok")
197
+ finishResolve({ code: reading.code, state, redirectUri });
198
+ else
199
+ finishReject(new McpTransportError("protocol", reading.kind === "error"
200
+ ? `MCP OAuth ${reading.reason}.`
201
+ : "OAuth callback URL did not match this sign-in request."));
202
+ })
203
+ .catch((error) => finishReject(error instanceof Error ? error : new Error(String(error))));
204
+ }
205
+ if (params.openBrowser) {
206
+ return params.openBrowser(authUrl).catch((error) => {
207
+ if (!params.readCallbackUrl)
208
+ throw error;
209
+ });
210
+ }
211
+ if (!params.readCallbackUrl)
212
+ throw new McpTransportError("browser", "No browser or callback input is available for OAuth sign-in.");
141
213
  })
142
214
  .catch((error) => finishReject(error instanceof Error ? error : new Error(String(error))));
143
215
  });
@@ -1 +1 @@
1
- {"version":3,"file":"loopback.js","sourceRoot":"","sources":["../../../src/mcp/auth/loopback.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loopback.js","sourceRoot":"","sources":["../../../src/mcp/auth/loopback.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,6 @@
1
+ import { type OAuthHttpDeps } from "./http.js";
1
2
  import type { AuthorizationServerMetadata, ProtectedResourceMetadata } from "./types.js";
2
- export interface MetadataFetchDeps {
3
- readonly fetchImpl?: typeof fetch | undefined;
4
- readonly validateUrl?: ((url: string) => URL) | undefined;
3
+ export interface MetadataFetchDeps extends OAuthHttpDeps {
5
4
  }
6
5
  export declare function buildProtectedResourceMetadataUrl(resource: string): string;
7
6
  export declare function discoverProtectedResourceMetadata(metadataUrl: string, deps?: MetadataFetchDeps): Promise<ProtectedResourceMetadata>;
@@ -1,38 +1,19 @@
1
1
  import { McpTransportError } from "../transport.js";
2
2
  import { assertSafeDiscoveryUrl } from "./security.js";
3
- const MAX_METADATA_BYTES = 256 * 1024;
3
+ import { fetchOAuthJson } from "./http.js";
4
4
  function stringArray(value) {
5
5
  if (!Array.isArray(value))
6
6
  return [];
7
7
  return value.filter((entry) => typeof entry === "string");
8
8
  }
9
9
  async function fetchJson(url, deps) {
10
- const validate = deps.validateUrl ?? assertSafeDiscoveryUrl;
11
- const target = validate(url);
12
- const impl = deps.fetchImpl ?? fetch;
13
- const response = await impl(target.toString(), {
10
+ const response = await fetchOAuthJson(url, {
14
11
  method: "GET",
15
12
  headers: { accept: "application/json" },
16
- redirect: "manual",
17
- });
18
- if (response.status >= 300 && response.status < 400) {
19
- throw new McpTransportError("protocol", `MCP OAuth discovery refused a redirect from ${url}.`);
20
- }
13
+ }, deps);
21
14
  if (!response.ok)
22
15
  return undefined;
23
- const text = await response.text();
24
- if (text.length > MAX_METADATA_BYTES) {
25
- throw new McpTransportError("too-large", "MCP OAuth metadata document exceeded the size limit.");
26
- }
27
- try {
28
- const parsed = JSON.parse(text);
29
- return typeof parsed === "object" && parsed !== null
30
- ? parsed
31
- : undefined;
32
- }
33
- catch {
34
- return undefined;
35
- }
16
+ return response.record;
36
17
  }
37
18
  export function buildProtectedResourceMetadataUrl(resource) {
38
19
  const url = new URL(resource);
@@ -89,16 +70,35 @@ function parseAuthorizationServerMetadata(record) {
89
70
  : {}),
90
71
  scopesSupported: stringArray(record.scopes_supported),
91
72
  codeChallengeMethodsSupported: stringArray(record.code_challenge_methods_supported),
73
+ tokenEndpointAuthMethodsSupported: stringArray(record.token_endpoint_auth_methods_supported),
92
74
  };
93
75
  }
94
76
  export async function discoverAuthorizationServerMetadata(issuer, deps = {}) {
95
77
  for (const candidate of authorizationServerMetadataCandidates(issuer)) {
96
- const record = await fetchJson(candidate, deps).catch(() => undefined);
78
+ deps.signal?.throwIfAborted();
79
+ const record = await fetchJson(candidate, deps).catch((error) => {
80
+ if (deps.signal?.aborted ||
81
+ (error instanceof McpTransportError &&
82
+ ["too-large", "timeout", "cancelled"].includes(error.kind)))
83
+ throw error;
84
+ return undefined;
85
+ });
97
86
  if (!record)
98
87
  continue;
99
88
  const parsed = parseAuthorizationServerMetadata(record);
100
- if (parsed)
89
+ if (parsed) {
90
+ if (parsed.issuer && parsed.issuer.replace(/\/+$/, "") !== issuer.replace(/\/+$/, "")) {
91
+ throw new McpTransportError("protocol", "MCP authorization-server metadata issuer did not match the requested issuer.");
92
+ }
93
+ const validate = deps.validateUrl ?? assertSafeDiscoveryUrl;
94
+ validate(parsed.authorizationEndpoint);
95
+ validate(parsed.tokenEndpoint);
96
+ if (parsed.registrationEndpoint)
97
+ validate(parsed.registrationEndpoint);
98
+ if (parsed.deviceAuthorizationEndpoint)
99
+ validate(parsed.deviceAuthorizationEndpoint);
101
100
  return parsed;
101
+ }
102
102
  }
103
103
  throw new McpTransportError("protocol", `MCP authorization-server metadata was unavailable for issuer ${issuer}.`);
104
104
  }
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../../src/mcp/auth/metadata.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../../src/mcp/auth/metadata.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,7 @@ export interface AuthProviderDeps {
24
24
  serverUrl: string;
25
25
  url: string;
26
26
  }) => void) | undefined;
27
+ readonly readCallbackUrl?: LoopbackAuthorizationParams["readCallbackUrl"];
27
28
  readonly env?: Record<string, string | undefined> | undefined;
28
29
  readonly readHostToken?: (() => Promise<string | undefined>) | undefined;
29
30
  }