@jini-ai/agent-runtime 0.1.0

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 (399) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +43 -0
  3. package/dist/acp-model-probe.d.ts +48 -0
  4. package/dist/acp-model-probe.d.ts.map +1 -0
  5. package/dist/acp-model-probe.js +15 -0
  6. package/dist/acp-model-probe.js.map +1 -0
  7. package/dist/agent-protocol/acp/account-failure.d.ts +54 -0
  8. package/dist/agent-protocol/acp/account-failure.d.ts.map +1 -0
  9. package/dist/agent-protocol/acp/account-failure.js +37 -0
  10. package/dist/agent-protocol/acp/account-failure.js.map +1 -0
  11. package/dist/agent-protocol/acp/constants.d.ts +26 -0
  12. package/dist/agent-protocol/acp/constants.d.ts.map +1 -0
  13. package/dist/agent-protocol/acp/constants.js +39 -0
  14. package/dist/agent-protocol/acp/constants.js.map +1 -0
  15. package/dist/agent-protocol/acp/index.d.ts +14 -0
  16. package/dist/agent-protocol/acp/index.d.ts.map +1 -0
  17. package/dist/agent-protocol/acp/index.js +14 -0
  18. package/dist/agent-protocol/acp/index.js.map +1 -0
  19. package/dist/agent-protocol/acp/json.d.ts +82 -0
  20. package/dist/agent-protocol/acp/json.d.ts.map +1 -0
  21. package/dist/agent-protocol/acp/json.js +144 -0
  22. package/dist/agent-protocol/acp/json.js.map +1 -0
  23. package/dist/agent-protocol/acp/models.d.ts +112 -0
  24. package/dist/agent-protocol/acp/models.d.ts.map +1 -0
  25. package/dist/agent-protocol/acp/models.js +293 -0
  26. package/dist/agent-protocol/acp/models.js.map +1 -0
  27. package/dist/agent-protocol/acp/rpc.d.ts +107 -0
  28. package/dist/agent-protocol/acp/rpc.d.ts.map +1 -0
  29. package/dist/agent-protocol/acp/rpc.js +162 -0
  30. package/dist/agent-protocol/acp/rpc.js.map +1 -0
  31. package/dist/agent-protocol/acp/session-params.d.ts +55 -0
  32. package/dist/agent-protocol/acp/session-params.d.ts.map +1 -0
  33. package/dist/agent-protocol/acp/session-params.js +81 -0
  34. package/dist/agent-protocol/acp/session-params.js.map +1 -0
  35. package/dist/agent-protocol/acp/session.d.ts +101 -0
  36. package/dist/agent-protocol/acp/session.d.ts.map +1 -0
  37. package/dist/agent-protocol/acp/session.js +832 -0
  38. package/dist/agent-protocol/acp/session.js.map +1 -0
  39. package/dist/agent-protocol/acp/text-suppression.d.ts +73 -0
  40. package/dist/agent-protocol/acp/text-suppression.d.ts.map +1 -0
  41. package/dist/agent-protocol/acp/text-suppression.js +229 -0
  42. package/dist/agent-protocol/acp/text-suppression.js.map +1 -0
  43. package/dist/agent-protocol/acp/types.d.ts +27 -0
  44. package/dist/agent-protocol/acp/types.d.ts.map +1 -0
  45. package/dist/agent-protocol/acp/types.js +2 -0
  46. package/dist/agent-protocol/acp/types.js.map +1 -0
  47. package/dist/agent-protocol/acp/updates.d.ts +166 -0
  48. package/dist/agent-protocol/acp/updates.d.ts.map +1 -0
  49. package/dist/agent-protocol/acp/updates.js +268 -0
  50. package/dist/agent-protocol/acp/updates.js.map +1 -0
  51. package/dist/agent-protocol/core/index.d.ts +6 -0
  52. package/dist/agent-protocol/core/index.d.ts.map +1 -0
  53. package/dist/agent-protocol/core/index.js +6 -0
  54. package/dist/agent-protocol/core/index.js.map +1 -0
  55. package/dist/agent-protocol/core/json-line-stream.d.ts +42 -0
  56. package/dist/agent-protocol/core/json-line-stream.d.ts.map +1 -0
  57. package/dist/agent-protocol/core/json-line-stream.js +333 -0
  58. package/dist/agent-protocol/core/json-line-stream.js.map +1 -0
  59. package/dist/agent-protocol/index.d.ts +8 -0
  60. package/dist/agent-protocol/index.d.ts.map +1 -0
  61. package/dist/agent-protocol/index.js +8 -0
  62. package/dist/agent-protocol/index.js.map +1 -0
  63. package/dist/agent-protocol/pi-rpc/events.d.ts +26 -0
  64. package/dist/agent-protocol/pi-rpc/events.d.ts.map +1 -0
  65. package/dist/agent-protocol/pi-rpc/events.js +167 -0
  66. package/dist/agent-protocol/pi-rpc/events.js.map +1 -0
  67. package/dist/agent-protocol/pi-rpc/index.d.ts +11 -0
  68. package/dist/agent-protocol/pi-rpc/index.d.ts.map +1 -0
  69. package/dist/agent-protocol/pi-rpc/index.js +11 -0
  70. package/dist/agent-protocol/pi-rpc/index.js.map +1 -0
  71. package/dist/agent-protocol/pi-rpc/internal.d.ts +45 -0
  72. package/dist/agent-protocol/pi-rpc/internal.d.ts.map +1 -0
  73. package/dist/agent-protocol/pi-rpc/internal.js +41 -0
  74. package/dist/agent-protocol/pi-rpc/internal.js.map +1 -0
  75. package/dist/agent-protocol/pi-rpc/models.d.ts +21 -0
  76. package/dist/agent-protocol/pi-rpc/models.d.ts.map +1 -0
  77. package/dist/agent-protocol/pi-rpc/models.js +48 -0
  78. package/dist/agent-protocol/pi-rpc/models.js.map +1 -0
  79. package/dist/agent-protocol/pi-rpc/session.d.ts +106 -0
  80. package/dist/agent-protocol/pi-rpc/session.d.ts.map +1 -0
  81. package/dist/agent-protocol/pi-rpc/session.js +371 -0
  82. package/dist/agent-protocol/pi-rpc/session.js.map +1 -0
  83. package/dist/amr-model-cache.d.ts +40 -0
  84. package/dist/amr-model-cache.d.ts.map +1 -0
  85. package/dist/amr-model-cache.js +79 -0
  86. package/dist/amr-model-cache.js.map +1 -0
  87. package/dist/amr-profile-resolver.d.ts +21 -0
  88. package/dist/amr-profile-resolver.d.ts.map +1 -0
  89. package/dist/amr-profile-resolver.js +4 -0
  90. package/dist/amr-profile-resolver.js.map +1 -0
  91. package/dist/artifact-taxonomy.d.ts +27 -0
  92. package/dist/artifact-taxonomy.d.ts.map +1 -0
  93. package/dist/artifact-taxonomy.js +5 -0
  94. package/dist/artifact-taxonomy.js.map +1 -0
  95. package/dist/auth.d.ts +25 -0
  96. package/dist/auth.d.ts.map +1 -0
  97. package/dist/auth.js +332 -0
  98. package/dist/auth.js.map +1 -0
  99. package/dist/capabilities.d.ts +9 -0
  100. package/dist/capabilities.d.ts.map +1 -0
  101. package/dist/capabilities.js +2 -0
  102. package/dist/capabilities.js.map +1 -0
  103. package/dist/claude-stream.d.ts +37 -0
  104. package/dist/claude-stream.d.ts.map +1 -0
  105. package/dist/claude-stream.js +660 -0
  106. package/dist/claude-stream.js.map +1 -0
  107. package/dist/copilot-stream.d.ts +37 -0
  108. package/dist/copilot-stream.d.ts.map +1 -0
  109. package/dist/copilot-stream.js +136 -0
  110. package/dist/copilot-stream.js.map +1 -0
  111. package/dist/defs/aider.d.ts +13 -0
  112. package/dist/defs/aider.d.ts.map +1 -0
  113. package/dist/defs/aider.js +63 -0
  114. package/dist/defs/aider.js.map +1 -0
  115. package/dist/defs/amp.d.ts +12 -0
  116. package/dist/defs/amp.d.ts.map +1 -0
  117. package/dist/defs/amp.js +56 -0
  118. package/dist/defs/amp.js.map +1 -0
  119. package/dist/defs/amr.d.ts +37 -0
  120. package/dist/defs/amr.d.ts.map +1 -0
  121. package/dist/defs/amr.js +303 -0
  122. package/dist/defs/amr.js.map +1 -0
  123. package/dist/defs/antigravity.d.ts +25 -0
  124. package/dist/defs/antigravity.d.ts.map +1 -0
  125. package/dist/defs/antigravity.js +213 -0
  126. package/dist/defs/antigravity.js.map +1 -0
  127. package/dist/defs/claude.d.ts +30 -0
  128. package/dist/defs/claude.d.ts.map +1 -0
  129. package/dist/defs/claude.js +130 -0
  130. package/dist/defs/claude.js.map +1 -0
  131. package/dist/defs/codebuddy.d.ts +26 -0
  132. package/dist/defs/codebuddy.d.ts.map +1 -0
  133. package/dist/defs/codebuddy.js +124 -0
  134. package/dist/defs/codebuddy.js.map +1 -0
  135. package/dist/defs/codex.d.ts +30 -0
  136. package/dist/defs/codex.d.ts.map +1 -0
  137. package/dist/defs/codex.js +196 -0
  138. package/dist/defs/codex.js.map +1 -0
  139. package/dist/defs/copilot.d.ts +12 -0
  140. package/dist/defs/copilot.d.ts.map +1 -0
  141. package/dist/defs/copilot.js +88 -0
  142. package/dist/defs/copilot.js.map +1 -0
  143. package/dist/defs/cursor-agent.d.ts +27 -0
  144. package/dist/defs/cursor-agent.d.ts.map +1 -0
  145. package/dist/defs/cursor-agent.js +93 -0
  146. package/dist/defs/cursor-agent.js.map +1 -0
  147. package/dist/defs/deepseek.d.ts +12 -0
  148. package/dist/defs/deepseek.d.ts.map +1 -0
  149. package/dist/defs/deepseek.js +53 -0
  150. package/dist/defs/deepseek.js.map +1 -0
  151. package/dist/defs/devin.d.ts +12 -0
  152. package/dist/defs/devin.d.ts.map +1 -0
  153. package/dist/defs/devin.js +45 -0
  154. package/dist/defs/devin.js.map +1 -0
  155. package/dist/defs/grok-build.d.ts +26 -0
  156. package/dist/defs/grok-build.d.ts.map +1 -0
  157. package/dist/defs/grok-build.js +105 -0
  158. package/dist/defs/grok-build.js.map +1 -0
  159. package/dist/defs/hermes.d.ts +13 -0
  160. package/dist/defs/hermes.d.ts.map +1 -0
  161. package/dist/defs/hermes.js +51 -0
  162. package/dist/defs/hermes.js.map +1 -0
  163. package/dist/defs/index.d.ts +33 -0
  164. package/dist/defs/index.d.ts.map +1 -0
  165. package/dist/defs/index.js +33 -0
  166. package/dist/defs/index.js.map +1 -0
  167. package/dist/defs/kilo.d.ts +12 -0
  168. package/dist/defs/kilo.d.ts.map +1 -0
  169. package/dist/defs/kilo.js +20 -0
  170. package/dist/defs/kilo.js.map +1 -0
  171. package/dist/defs/kimi.d.ts +13 -0
  172. package/dist/defs/kimi.d.ts.map +1 -0
  173. package/dist/defs/kimi.js +26 -0
  174. package/dist/defs/kimi.js.map +1 -0
  175. package/dist/defs/kiro.d.ts +12 -0
  176. package/dist/defs/kiro.d.ts.map +1 -0
  177. package/dist/defs/kiro.js +20 -0
  178. package/dist/defs/kiro.js.map +1 -0
  179. package/dist/defs/mimo.d.ts +13 -0
  180. package/dist/defs/mimo.d.ts.map +1 -0
  181. package/dist/defs/mimo.js +26 -0
  182. package/dist/defs/mimo.js.map +1 -0
  183. package/dist/defs/opencode.d.ts +27 -0
  184. package/dist/defs/opencode.d.ts.map +1 -0
  185. package/dist/defs/opencode.js +89 -0
  186. package/dist/defs/opencode.js.map +1 -0
  187. package/dist/defs/pi.d.ts +18 -0
  188. package/dist/defs/pi.d.ts.map +1 -0
  189. package/dist/defs/pi.js +94 -0
  190. package/dist/defs/pi.js.map +1 -0
  191. package/dist/defs/qoder.d.ts +11 -0
  192. package/dist/defs/qoder.d.ts.map +1 -0
  193. package/dist/defs/qoder.js +50 -0
  194. package/dist/defs/qoder.js.map +1 -0
  195. package/dist/defs/qwen.d.ts +11 -0
  196. package/dist/defs/qwen.d.ts.map +1 -0
  197. package/dist/defs/qwen.js +28 -0
  198. package/dist/defs/qwen.js.map +1 -0
  199. package/dist/defs/reasonix.d.ts +20 -0
  200. package/dist/defs/reasonix.d.ts.map +1 -0
  201. package/dist/defs/reasonix.js +60 -0
  202. package/dist/defs/reasonix.js.map +1 -0
  203. package/dist/defs/shared.d.ts +23 -0
  204. package/dist/defs/shared.d.ts.map +1 -0
  205. package/dist/defs/shared.js +58 -0
  206. package/dist/defs/shared.js.map +1 -0
  207. package/dist/defs/trae-cli.d.ts +14 -0
  208. package/dist/defs/trae-cli.d.ts.map +1 -0
  209. package/dist/defs/trae-cli.js +22 -0
  210. package/dist/defs/trae-cli.js.map +1 -0
  211. package/dist/defs/vibe.d.ts +12 -0
  212. package/dist/defs/vibe.d.ts.map +1 -0
  213. package/dist/defs/vibe.js +20 -0
  214. package/dist/defs/vibe.js.map +1 -0
  215. package/dist/detection.d.ts +14 -0
  216. package/dist/detection.d.ts.map +1 -0
  217. package/dist/detection.js +266 -0
  218. package/dist/detection.js.map +1 -0
  219. package/dist/diagnostics.d.ts +8 -0
  220. package/dist/diagnostics.d.ts.map +1 -0
  221. package/dist/diagnostics.js +95 -0
  222. package/dist/diagnostics.js.map +1 -0
  223. package/dist/env.d.ts +19 -0
  224. package/dist/env.d.ts.map +1 -0
  225. package/dist/env.js +95 -0
  226. package/dist/env.js.map +1 -0
  227. package/dist/executables.d.ts +24 -0
  228. package/dist/executables.d.ts.map +1 -0
  229. package/dist/executables.js +349 -0
  230. package/dist/executables.js.map +1 -0
  231. package/dist/index.d.ts +74 -0
  232. package/dist/index.d.ts.map +1 -0
  233. package/dist/index.js +102 -0
  234. package/dist/index.js.map +1 -0
  235. package/dist/invocation.d.ts +6 -0
  236. package/dist/invocation.d.ts.map +1 -0
  237. package/dist/invocation.js +47 -0
  238. package/dist/invocation.js.map +1 -0
  239. package/dist/json-event-stream.d.ts +9 -0
  240. package/dist/json-event-stream.d.ts.map +1 -0
  241. package/dist/json-event-stream.js +856 -0
  242. package/dist/json-event-stream.js.map +1 -0
  243. package/dist/launch.d.ts +12 -0
  244. package/dist/launch.d.ts.map +1 -0
  245. package/dist/launch.js +221 -0
  246. package/dist/launch.js.map +1 -0
  247. package/dist/mcp.d.ts +44 -0
  248. package/dist/mcp.d.ts.map +1 -0
  249. package/dist/mcp.js +12 -0
  250. package/dist/mcp.js.map +1 -0
  251. package/dist/metadata.d.ts +24 -0
  252. package/dist/metadata.d.ts.map +1 -0
  253. package/dist/metadata.js +100 -0
  254. package/dist/metadata.js.map +1 -0
  255. package/dist/mmd-routes.d.ts +12 -0
  256. package/dist/mmd-routes.d.ts.map +1 -0
  257. package/dist/mmd-routes.js +146 -0
  258. package/dist/mmd-routes.js.map +1 -0
  259. package/dist/model-registry.d.ts +120 -0
  260. package/dist/model-registry.d.ts.map +1 -0
  261. package/dist/model-registry.js +77 -0
  262. package/dist/model-registry.js.map +1 -0
  263. package/dist/models.d.ts +16 -0
  264. package/dist/models.d.ts.map +1 -0
  265. package/dist/models.js +93 -0
  266. package/dist/models.js.map +1 -0
  267. package/dist/opencode-log.d.ts +16 -0
  268. package/dist/opencode-log.d.ts.map +1 -0
  269. package/dist/opencode-log.js +163 -0
  270. package/dist/opencode-log.js.map +1 -0
  271. package/dist/paths.d.ts +3 -0
  272. package/dist/paths.d.ts.map +1 -0
  273. package/dist/paths.js +29 -0
  274. package/dist/paths.js.map +1 -0
  275. package/dist/pi-models.d.ts +13 -0
  276. package/dist/pi-models.d.ts.map +1 -0
  277. package/dist/pi-models.js +36 -0
  278. package/dist/pi-models.js.map +1 -0
  279. package/dist/prompt-augmenter.d.ts +60 -0
  280. package/dist/prompt-augmenter.d.ts.map +1 -0
  281. package/dist/prompt-augmenter.js +26 -0
  282. package/dist/prompt-augmenter.js.map +1 -0
  283. package/dist/prompt-budget.d.ts +20 -0
  284. package/dist/prompt-budget.d.ts.map +1 -0
  285. package/dist/prompt-budget.js +226 -0
  286. package/dist/prompt-budget.js.map +1 -0
  287. package/dist/prompt-file.d.ts +7 -0
  288. package/dist/prompt-file.d.ts.map +1 -0
  289. package/dist/prompt-file.js +27 -0
  290. package/dist/prompt-file.js.map +1 -0
  291. package/dist/providers/aihubmix.d.ts +99 -0
  292. package/dist/providers/aihubmix.d.ts.map +1 -0
  293. package/dist/providers/aihubmix.js +239 -0
  294. package/dist/providers/aihubmix.js.map +1 -0
  295. package/dist/providers/anthropic-messages.d.ts +116 -0
  296. package/dist/providers/anthropic-messages.d.ts.map +1 -0
  297. package/dist/providers/anthropic-messages.js +313 -0
  298. package/dist/providers/anthropic-messages.js.map +1 -0
  299. package/dist/providers/azure-chat.d.ts +99 -0
  300. package/dist/providers/azure-chat.d.ts.map +1 -0
  301. package/dist/providers/azure-chat.js +164 -0
  302. package/dist/providers/azure-chat.js.map +1 -0
  303. package/dist/providers/connection-guard.d.ts +67 -0
  304. package/dist/providers/connection-guard.d.ts.map +1 -0
  305. package/dist/providers/connection-guard.js +211 -0
  306. package/dist/providers/connection-guard.js.map +1 -0
  307. package/dist/providers/elevenlabs.d.ts +28 -0
  308. package/dist/providers/elevenlabs.d.ts.map +1 -0
  309. package/dist/providers/elevenlabs.js +138 -0
  310. package/dist/providers/elevenlabs.js.map +1 -0
  311. package/dist/providers/google-messages.d.ts +108 -0
  312. package/dist/providers/google-messages.d.ts.map +1 -0
  313. package/dist/providers/google-messages.js +284 -0
  314. package/dist/providers/google-messages.js.map +1 -0
  315. package/dist/providers/google.d.ts +20 -0
  316. package/dist/providers/google.d.ts.map +1 -0
  317. package/dist/providers/google.js +42 -0
  318. package/dist/providers/google.js.map +1 -0
  319. package/dist/providers/index.d.ts +39 -0
  320. package/dist/providers/index.d.ts.map +1 -0
  321. package/dist/providers/index.js +39 -0
  322. package/dist/providers/index.js.map +1 -0
  323. package/dist/providers/model-catalog.d.ts +32 -0
  324. package/dist/providers/model-catalog.d.ts.map +1 -0
  325. package/dist/providers/model-catalog.js +394 -0
  326. package/dist/providers/model-catalog.js.map +1 -0
  327. package/dist/providers/oauth-callback-server.d.ts +35 -0
  328. package/dist/providers/oauth-callback-server.d.ts.map +1 -0
  329. package/dist/providers/oauth-callback-server.js +217 -0
  330. package/dist/providers/oauth-callback-server.js.map +1 -0
  331. package/dist/providers/oauth-credentials.d.ts +29 -0
  332. package/dist/providers/oauth-credentials.d.ts.map +1 -0
  333. package/dist/providers/oauth-credentials.js +70 -0
  334. package/dist/providers/oauth-credentials.js.map +1 -0
  335. package/dist/providers/oauth-provider.d.ts +95 -0
  336. package/dist/providers/oauth-provider.d.ts.map +1 -0
  337. package/dist/providers/oauth-provider.js +130 -0
  338. package/dist/providers/oauth-provider.js.map +1 -0
  339. package/dist/providers/oauth-tokens.d.ts +35 -0
  340. package/dist/providers/oauth-tokens.d.ts.map +1 -0
  341. package/dist/providers/oauth-tokens.js +136 -0
  342. package/dist/providers/oauth-tokens.js.map +1 -0
  343. package/dist/providers/ollama-chat.d.ts +106 -0
  344. package/dist/providers/ollama-chat.d.ts.map +1 -0
  345. package/dist/providers/ollama-chat.js +292 -0
  346. package/dist/providers/ollama-chat.js.map +1 -0
  347. package/dist/providers/openai-chat.d.ts +147 -0
  348. package/dist/providers/openai-chat.d.ts.map +1 -0
  349. package/dist/providers/openai-chat.js +302 -0
  350. package/dist/providers/openai-chat.js.map +1 -0
  351. package/dist/providers/pkce.d.ts +81 -0
  352. package/dist/providers/pkce.d.ts.map +1 -0
  353. package/dist/providers/pkce.js +176 -0
  354. package/dist/providers/pkce.js.map +1 -0
  355. package/dist/providers/sse-decode.d.ts +47 -0
  356. package/dist/providers/sse-decode.d.ts.map +1 -0
  357. package/dist/providers/sse-decode.js +109 -0
  358. package/dist/providers/sse-decode.js.map +1 -0
  359. package/dist/providers/token-params.d.ts +29 -0
  360. package/dist/providers/token-params.d.ts.map +1 -0
  361. package/dist/providers/token-params.js +41 -0
  362. package/dist/providers/token-params.js.map +1 -0
  363. package/dist/providers/turn-end-guard.d.ts +37 -0
  364. package/dist/providers/turn-end-guard.d.ts.map +1 -0
  365. package/dist/providers/turn-end-guard.js +42 -0
  366. package/dist/providers/turn-end-guard.js.map +1 -0
  367. package/dist/providers/types.d.ts +36 -0
  368. package/dist/providers/types.d.ts.map +1 -0
  369. package/dist/providers/types.js +13 -0
  370. package/dist/providers/types.js.map +1 -0
  371. package/dist/qoder-stream.d.ts +19 -0
  372. package/dist/qoder-stream.d.ts.map +1 -0
  373. package/dist/qoder-stream.js +167 -0
  374. package/dist/qoder-stream.js.map +1 -0
  375. package/dist/registry.d.ts +5 -0
  376. package/dist/registry.d.ts.map +1 -0
  377. package/dist/registry.js +58 -0
  378. package/dist/registry.js.map +1 -0
  379. package/dist/resolution.d.ts +2 -0
  380. package/dist/resolution.d.ts.map +1 -0
  381. package/dist/resolution.js +19 -0
  382. package/dist/resolution.js.map +1 -0
  383. package/dist/role-marker-guard.d.ts +53 -0
  384. package/dist/role-marker-guard.d.ts.map +1 -0
  385. package/dist/role-marker-guard.js +280 -0
  386. package/dist/role-marker-guard.js.map +1 -0
  387. package/dist/telemetry-sink.d.ts +35 -0
  388. package/dist/telemetry-sink.d.ts.map +1 -0
  389. package/dist/telemetry-sink.js +5 -0
  390. package/dist/telemetry-sink.js.map +1 -0
  391. package/dist/terminal-launch.d.ts +11 -0
  392. package/dist/terminal-launch.d.ts.map +1 -0
  393. package/dist/terminal-launch.js +123 -0
  394. package/dist/terminal-launch.js.map +1 -0
  395. package/dist/types.d.ts +185 -0
  396. package/dist/types.d.ts.map +1 -0
  397. package/dist/types.js +2 -0
  398. package/dist/types.js.map +1 -0
  399. package/package.json +47 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-callback-server.js","sourceRoot":"","sources":["../../src/providers/oauth-callback-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @module providers/oauth-credentials
3
+ *
4
+ * Runtime credential resolver on top of `oauth-tokens.ts` +
5
+ * `oauth-provider.ts`: returns a fresh access token, automatically
6
+ * refreshing in place when the stored token is within the expiry skew
7
+ * window. Ported from OD's `integrations/xai-credentials.ts`, generalized
8
+ * to any {@link OAuthPkceProviderConfig} (the origin's `resolveXAIBearer`
9
+ * hardcoded the xAI refresh call and the `xai-tokens.json` filename).
10
+ *
11
+ * Refresh-on-read (lazy) is sufficient because OAuth bearer tokens are
12
+ * typically short-lived — every active call site naturally sees expiry
13
+ * often enough that a separate background refresher isn't needed.
14
+ */
15
+ import { type OAuthPkceProviderConfig } from './oauth-provider.js';
16
+ export interface ResolvedOAuthCredential {
17
+ accessToken: string;
18
+ /** Whether this came back unchanged from disk or was refreshed inline. */
19
+ source: 'stored' | 'refreshed';
20
+ }
21
+ /**
22
+ * Gets a usable bearer token for `config`'s provider, refreshing in place if
23
+ * the stored token is within the expiry skew window. Returns null when
24
+ * nothing is stored, the stored token has no refresh_token to renew with, or
25
+ * the refresh call fails. Callers should treat null as "no OAuth available,
26
+ * fall back to API key / re-login UI".
27
+ */
28
+ export declare function resolveOAuthBearer(config: OAuthPkceProviderConfig, tokenFileName: string, dataDir: string, fetchImpl?: typeof fetch): Promise<ResolvedOAuthCredential | null>;
29
+ //# sourceMappingURL=oauth-credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-credentials.d.ts","sourceRoot":"","sources":["../../src/providers/oauth-credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAyB,KAAK,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAQ1F,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,MAAM,EAAE,QAAQ,GAAG,WAAW,CAAC;CAChC;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,uBAAuB,EAC/B,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,OAAO,KAAK,GACvB,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CA0CzC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * @module providers/oauth-credentials
3
+ *
4
+ * Runtime credential resolver on top of `oauth-tokens.ts` +
5
+ * `oauth-provider.ts`: returns a fresh access token, automatically
6
+ * refreshing in place when the stored token is within the expiry skew
7
+ * window. Ported from OD's `integrations/xai-credentials.ts`, generalized
8
+ * to any {@link OAuthPkceProviderConfig} (the origin's `resolveXAIBearer`
9
+ * hardcoded the xAI refresh call and the `xai-tokens.json` filename).
10
+ *
11
+ * Refresh-on-read (lazy) is sufficient because OAuth bearer tokens are
12
+ * typically short-lived — every active call site naturally sees expiry
13
+ * often enough that a separate background refresher isn't needed.
14
+ */
15
+ import { refreshOAuthPkceToken } from './oauth-provider.js';
16
+ import { getStoredOAuthToken, isOAuthTokenExpired, setStoredOAuthToken, } from './oauth-tokens.js';
17
+ /**
18
+ * Gets a usable bearer token for `config`'s provider, refreshing in place if
19
+ * the stored token is within the expiry skew window. Returns null when
20
+ * nothing is stored, the stored token has no refresh_token to renew with, or
21
+ * the refresh call fails. Callers should treat null as "no OAuth available,
22
+ * fall back to API key / re-login UI".
23
+ */
24
+ export async function resolveOAuthBearer(config, tokenFileName, dataDir, fetchImpl) {
25
+ const stored = await getStoredOAuthToken(dataDir, tokenFileName);
26
+ if (!stored)
27
+ return null;
28
+ if (!isOAuthTokenExpired(stored)) {
29
+ return { accessToken: stored.accessToken, source: 'stored' };
30
+ }
31
+ // Within skew window — try a refresh. If there's no refresh_token (some
32
+ // auth servers don't issue one) the caller has to re-login; recovery
33
+ // isn't possible here.
34
+ if (!stored.refreshToken)
35
+ return null;
36
+ try {
37
+ const fresh = await refreshOAuthPkceToken({
38
+ config,
39
+ refreshToken: stored.refreshToken,
40
+ ...(fetchImpl ? { fetchImpl } : {}),
41
+ });
42
+ const next = {
43
+ accessToken: fresh.access_token,
44
+ tokenType: fresh.token_type ?? 'Bearer',
45
+ savedAt: Date.now(),
46
+ };
47
+ // Preserves the existing refresh_token when the token endpoint omits
48
+ // one in its response. RFC 6749 §6 lets a server skip refresh_token
49
+ // rotation and keep the old one valid; dropping it here would leave the
50
+ // next expiry with nothing to refresh against, forcing the user back
51
+ // through a full sign-in even though their grant is still good.
52
+ const carriedRefresh = fresh.refresh_token ?? stored.refreshToken;
53
+ if (carriedRefresh)
54
+ next.refreshToken = carriedRefresh;
55
+ if (typeof fresh.expires_in === 'number') {
56
+ next.expiresAt = Date.now() + fresh.expires_in * 1000;
57
+ }
58
+ if (fresh.scope)
59
+ next.scope = fresh.scope;
60
+ await setStoredOAuthToken(dataDir, tokenFileName, next);
61
+ return { accessToken: next.accessToken, source: 'refreshed' };
62
+ }
63
+ catch {
64
+ // Refresh failed (network blip, revoked refresh_token, server error).
65
+ // Return null so the caller falls through to API-key resolution and
66
+ // surfaces a re-login prompt if everything is empty.
67
+ return null;
68
+ }
69
+ }
70
+ //# sourceMappingURL=oauth-credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-credentials.js","sourceRoot":"","sources":["../../src/providers/oauth-credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,qBAAqB,EAAgC,MAAM,qBAAqB,CAAC;AAC1F,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,GAEpB,MAAM,mBAAmB,CAAC;AAQ3B;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAA+B,EAC/B,aAAqB,EACrB,OAAe,EACf,SAAwB;IAExB,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IACjE,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC/D,CAAC;IAED,wEAAwE;IACxE,qEAAqE;IACrE,uBAAuB;IACvB,IAAI,CAAC,MAAM,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAEtC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC;YACxC,MAAM;YACN,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpC,CAAC,CAAC;QACH,MAAM,IAAI,GAAqB;YAC7B,WAAW,EAAE,KAAK,CAAC,YAAY;YAC/B,SAAS,EAAE,KAAK,CAAC,UAAU,IAAI,QAAQ;YACvC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;SACpB,CAAC;QACF,qEAAqE;QACrE,oEAAoE;QACpE,wEAAwE;QACxE,qEAAqE;QACrE,gEAAgE;QAChE,MAAM,cAAc,GAAG,KAAK,CAAC,aAAa,IAAI,MAAM,CAAC,YAAY,CAAC;QAClE,IAAI,cAAc;YAAE,IAAI,CAAC,YAAY,GAAG,cAAc,CAAC;QACvD,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YACzC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;QACxD,CAAC;QACD,IAAI,KAAK,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1C,MAAM,mBAAmB,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;QACxD,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,sEAAsE;QACtE,oEAAoE;QACpE,qDAAqD;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * @module providers/oauth-provider
3
+ *
4
+ * Generic OAuth Authorization Code + PKCE provider dance (begin / complete /
5
+ * refresh), parameterized over any fixed-issuer OAuth server — no Dynamic
6
+ * Client Registration or MCP-resource discovery involved (that's
7
+ * `mcp-oauth.ts`'s separate, unported concern; see `pkce.ts`'s doc comment).
8
+ *
9
+ * Ported from OD's `integrations/xai-oauth.ts`, generalized: the origin
10
+ * hardcoded xAI's issuer/endpoints/client_id/scope/redirect port directly
11
+ * into module-level constants and function names (`beginXAIAuth`,
12
+ * `XAI_OAUTH_CLIENT_ID`, ...) because it only ever needed to talk to one
13
+ * OAuth server. That shape doesn't generalize to "any BYOK provider that
14
+ * happens to use OAuth+PKCE instead of a bare API key" — the actual
15
+ * generic-provider-material classification this task asked for — so the
16
+ * dance is now a config-driven `beginOAuthPkce`/`completeOAuthPkce`/
17
+ * `refreshOAuthPkceToken` triad taking an {@link OAuthPkceProviderConfig},
18
+ * with `XAI_OAUTH_PROVIDER_CONFIG` kept as the one concrete preset the
19
+ * origin actually shipped (same pattern this package already uses for
20
+ * `RuntimeAgentDef` — a generic contract type plus concrete `defs/*`
21
+ * instances).
22
+ */
23
+ import { type OAuthTokenResponse, type PendingAuthCache } from './pkce.js';
24
+ export interface OAuthPkceProviderConfig {
25
+ /** Stable id used to key the token in any per-provider cache and to guard against state/provider mismatch. */
26
+ providerId: string;
27
+ issuer: string;
28
+ authorizationEndpoint: string;
29
+ tokenEndpoint: string;
30
+ clientId: string;
31
+ scope: string;
32
+ }
33
+ export interface BeginOAuthPkceInput {
34
+ config: OAuthPkceProviderConfig;
35
+ pending: PendingAuthCache;
36
+ redirectUri: string;
37
+ }
38
+ export interface BeginOAuthPkceResult {
39
+ authorizeUrl: string;
40
+ state: string;
41
+ }
42
+ /**
43
+ * Pre-redirect half of the OAuth dance. Mints a PKCE verifier/challenge,
44
+ * builds the authorize URL, and stashes the pending state in `pending`.
45
+ *
46
+ * The caller is responsible for sending the user's browser to
47
+ * `authorizeUrl` and receiving the callback at `redirectUri`. When the
48
+ * callback arrives, pass `state` and `code` to {@link completeOAuthPkce}.
49
+ */
50
+ export declare function beginOAuthPkce(input: BeginOAuthPkceInput): BeginOAuthPkceResult;
51
+ export interface CompleteOAuthPkceInput {
52
+ config: OAuthPkceProviderConfig;
53
+ pending: PendingAuthCache;
54
+ state: string;
55
+ code: string;
56
+ fetchImpl?: typeof fetch;
57
+ }
58
+ /**
59
+ * Post-callback half of the OAuth dance. Looks up `state` in `pending`,
60
+ * validates it (one-shot, TTL-checked by {@link PendingAuthCache}), and
61
+ * exchanges `code` for tokens. Throws if `state` is unknown, expired,
62
+ * already consumed, or was issued for a different provider.
63
+ */
64
+ export declare function completeOAuthPkce(input: CompleteOAuthPkceInput): Promise<OAuthTokenResponse>;
65
+ export interface RefreshOAuthPkceInput {
66
+ config: OAuthPkceProviderConfig;
67
+ refreshToken: string;
68
+ fetchImpl?: typeof fetch;
69
+ }
70
+ /**
71
+ * Refreshes an existing access token. The refresh_token is bound to the
72
+ * client_id that originally received it (RFC 6749 §6); since the same fixed
73
+ * client_id is always used, it doesn't need to be persisted per-token.
74
+ */
75
+ export declare function refreshOAuthPkceToken(input: RefreshOAuthPkceInput): Promise<OAuthTokenResponse>;
76
+ /** Stable provider id used to key an xAI token in any per-provider cache. */
77
+ export declare const XAI_OAUTH_PROVIDER_ID = "xai";
78
+ export declare const XAI_OAUTH_REDIRECT_HOST = "127.0.0.1";
79
+ export declare const XAI_OAUTH_REDIRECT_PORT = 56121;
80
+ export declare const XAI_OAUTH_REDIRECT_PATH = "/callback";
81
+ /**
82
+ * xAI Grok OAuth 2.0 + PKCE provider config. xAI doesn't speak MCP and
83
+ * doesn't expose Dynamic Client Registration, so the issuer / endpoints /
84
+ * client_id / scope are hardcoded rather than discovered — same as the
85
+ * origin.
86
+ *
87
+ * `clientId` is a proof-of-concept id reused from NousResearch/hermes-agent
88
+ * (xAI does not publish a public application-registration flow); a
89
+ * consumer that provisions its own client_id with xAI should override this
90
+ * field rather than edit the constant.
91
+ */
92
+ export declare const XAI_OAUTH_PROVIDER_CONFIG: OAuthPkceProviderConfig;
93
+ /** The fixed loopback redirect URI xAI's client_id is registered against. */
94
+ export declare function xaiOAuthRedirectUri(): string;
95
+ //# sourceMappingURL=oauth-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-provider.d.ts","sourceRoot":"","sources":["../../src/providers/oauth-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAQL,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EAEtB,MAAM,WAAW,CAAC;AAEnB,MAAM,WAAW,uBAAuB;IACtC,8GAA8G;IAC9G,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,qBAAqB,EAAE,MAAM,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,uBAAuB,CAAC;IAChC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAUD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,CA4B/E;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,uBAAuB,CAAC;IAChC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CAoB7B;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,uBAAuB,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAS7B;AAMD,6EAA6E;AAC7E,eAAO,MAAM,qBAAqB,QAAQ,CAAC;AAE3C,eAAO,MAAM,uBAAuB,cAAc,CAAC;AACnD,eAAO,MAAM,uBAAuB,QAAQ,CAAC;AAC7C,eAAO,MAAM,uBAAuB,cAAc,CAAC;AAEnD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,yBAAyB,EAAE,uBAOvC,CAAC;AAEF,6EAA6E;AAC7E,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * @module providers/oauth-provider
3
+ *
4
+ * Generic OAuth Authorization Code + PKCE provider dance (begin / complete /
5
+ * refresh), parameterized over any fixed-issuer OAuth server — no Dynamic
6
+ * Client Registration or MCP-resource discovery involved (that's
7
+ * `mcp-oauth.ts`'s separate, unported concern; see `pkce.ts`'s doc comment).
8
+ *
9
+ * Ported from OD's `integrations/xai-oauth.ts`, generalized: the origin
10
+ * hardcoded xAI's issuer/endpoints/client_id/scope/redirect port directly
11
+ * into module-level constants and function names (`beginXAIAuth`,
12
+ * `XAI_OAUTH_CLIENT_ID`, ...) because it only ever needed to talk to one
13
+ * OAuth server. That shape doesn't generalize to "any BYOK provider that
14
+ * happens to use OAuth+PKCE instead of a bare API key" — the actual
15
+ * generic-provider-material classification this task asked for — so the
16
+ * dance is now a config-driven `beginOAuthPkce`/`completeOAuthPkce`/
17
+ * `refreshOAuthPkceToken` triad taking an {@link OAuthPkceProviderConfig},
18
+ * with `XAI_OAUTH_PROVIDER_CONFIG` kept as the one concrete preset the
19
+ * origin actually shipped (same pattern this package already uses for
20
+ * `RuntimeAgentDef` — a generic contract type plus concrete `defs/*`
21
+ * instances).
22
+ */
23
+ import { buildAuthorizeUrl, deriveCodeChallenge, exchangeCodeForToken, generateCodeVerifier, generateState, refreshAccessToken, } from './pkce.js';
24
+ function authServerMetadata(config) {
25
+ return {
26
+ issuer: config.issuer,
27
+ authorization_endpoint: config.authorizationEndpoint,
28
+ token_endpoint: config.tokenEndpoint,
29
+ };
30
+ }
31
+ /**
32
+ * Pre-redirect half of the OAuth dance. Mints a PKCE verifier/challenge,
33
+ * builds the authorize URL, and stashes the pending state in `pending`.
34
+ *
35
+ * The caller is responsible for sending the user's browser to
36
+ * `authorizeUrl` and receiving the callback at `redirectUri`. When the
37
+ * callback arrives, pass `state` and `code` to {@link completeOAuthPkce}.
38
+ */
39
+ export function beginOAuthPkce(input) {
40
+ const { config, pending, redirectUri } = input;
41
+ const codeVerifier = generateCodeVerifier();
42
+ const codeChallenge = deriveCodeChallenge(codeVerifier);
43
+ const state = generateState();
44
+ const authorizeUrl = buildAuthorizeUrl({
45
+ authServer: authServerMetadata(config),
46
+ clientId: config.clientId,
47
+ redirectUri,
48
+ state,
49
+ codeChallenge,
50
+ scope: config.scope,
51
+ });
52
+ const pendingState = {
53
+ serverId: config.providerId,
54
+ authServerIssuer: config.issuer,
55
+ tokenEndpoint: config.tokenEndpoint,
56
+ clientId: config.clientId,
57
+ redirectUri,
58
+ codeVerifier,
59
+ scope: config.scope,
60
+ createdAt: Date.now(),
61
+ };
62
+ pending.put(state, pendingState);
63
+ return { authorizeUrl, state };
64
+ }
65
+ /**
66
+ * Post-callback half of the OAuth dance. Looks up `state` in `pending`,
67
+ * validates it (one-shot, TTL-checked by {@link PendingAuthCache}), and
68
+ * exchanges `code` for tokens. Throws if `state` is unknown, expired,
69
+ * already consumed, or was issued for a different provider.
70
+ */
71
+ export async function completeOAuthPkce(input) {
72
+ const consumed = input.pending.consume(input.state);
73
+ if (!consumed) {
74
+ throw new Error(`${input.config.providerId} OAuth state not found or expired`);
75
+ }
76
+ if (consumed.serverId !== input.config.providerId) {
77
+ throw new Error(`${input.config.providerId} OAuth state mismatch: expected serverId=${input.config.providerId}, got ${consumed.serverId}`);
78
+ }
79
+ return exchangeCodeForToken({
80
+ tokenEndpoint: consumed.tokenEndpoint,
81
+ clientId: consumed.clientId,
82
+ redirectUri: consumed.redirectUri,
83
+ code: input.code,
84
+ codeVerifier: consumed.codeVerifier,
85
+ }, input.fetchImpl ?? fetch);
86
+ }
87
+ /**
88
+ * Refreshes an existing access token. The refresh_token is bound to the
89
+ * client_id that originally received it (RFC 6749 §6); since the same fixed
90
+ * client_id is always used, it doesn't need to be persisted per-token.
91
+ */
92
+ export async function refreshOAuthPkceToken(input) {
93
+ return refreshAccessToken({
94
+ tokenEndpoint: input.config.tokenEndpoint,
95
+ clientId: input.config.clientId,
96
+ refreshToken: input.refreshToken,
97
+ }, input.fetchImpl ?? fetch);
98
+ }
99
+ // ---------------------------------------------------------------------------
100
+ // Concrete preset: the one OAuth+PKCE provider the origin actually shipped.
101
+ // ---------------------------------------------------------------------------
102
+ /** Stable provider id used to key an xAI token in any per-provider cache. */
103
+ export const XAI_OAUTH_PROVIDER_ID = 'xai';
104
+ export const XAI_OAUTH_REDIRECT_HOST = '127.0.0.1';
105
+ export const XAI_OAUTH_REDIRECT_PORT = 56121;
106
+ export const XAI_OAUTH_REDIRECT_PATH = '/callback';
107
+ /**
108
+ * xAI Grok OAuth 2.0 + PKCE provider config. xAI doesn't speak MCP and
109
+ * doesn't expose Dynamic Client Registration, so the issuer / endpoints /
110
+ * client_id / scope are hardcoded rather than discovered — same as the
111
+ * origin.
112
+ *
113
+ * `clientId` is a proof-of-concept id reused from NousResearch/hermes-agent
114
+ * (xAI does not publish a public application-registration flow); a
115
+ * consumer that provisions its own client_id with xAI should override this
116
+ * field rather than edit the constant.
117
+ */
118
+ export const XAI_OAUTH_PROVIDER_CONFIG = {
119
+ providerId: XAI_OAUTH_PROVIDER_ID,
120
+ issuer: 'https://auth.x.ai',
121
+ authorizationEndpoint: 'https://auth.x.ai/oauth2/authorize',
122
+ tokenEndpoint: 'https://auth.x.ai/oauth2/token',
123
+ clientId: 'b1a00492-073a-47ea-816f-4c329264a828',
124
+ scope: 'openid profile email offline_access grok-cli:access api:access',
125
+ };
126
+ /** The fixed loopback redirect URI xAI's client_id is registered against. */
127
+ export function xaiOAuthRedirectUri() {
128
+ return `http://${XAI_OAUTH_REDIRECT_HOST}:${XAI_OAUTH_REDIRECT_PORT}${XAI_OAUTH_REDIRECT_PATH}`;
129
+ }
130
+ //# sourceMappingURL=oauth-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-provider.js","sourceRoot":"","sources":["../../src/providers/oauth-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Stored OAuth token. Mirrors the relevant subset of an OAuth 2.0
3
+ * token-endpoint response (RFC 6749 §5.1). `client_id`, `redirect_uri`, and
4
+ * `issuer` aren't persisted because they're constants in the provider's own
5
+ * `OAuthPkceProviderConfig`.
6
+ */
7
+ export interface StoredOAuthToken {
8
+ /** The bearer token to send as `Authorization: Bearer ...`. */
9
+ accessToken: string;
10
+ /** Refresh token (RFC 6749 §6) if the auth server issued one. */
11
+ refreshToken?: string;
12
+ /** Absolute epoch ms at which `accessToken` expires. Optional — some providers never expire. */
13
+ expiresAt?: number;
14
+ /** RFC 6749 §5.1 token_type. Almost always `Bearer`. */
15
+ tokenType: string;
16
+ /** Space-separated scopes granted (verbatim from the token response). */
17
+ scope?: string;
18
+ /** Wall-clock epoch ms when this record was first persisted. */
19
+ savedAt: number;
20
+ }
21
+ export interface OAuthTokenFile {
22
+ token?: StoredOAuthToken;
23
+ }
24
+ /** Coerces a freeform JSON blob into the typed shape, dropping anything that doesn't deserialize cleanly. Used both at read time and as a defensive pass when third-party tooling has hand-edited the file. */
25
+ export declare function sanitizeOAuthTokenFile(raw: unknown): OAuthTokenFile;
26
+ export declare function readOAuthTokenFile(dataDir: string, fileName: string): Promise<OAuthTokenFile>;
27
+ /** Gets the current stored OAuth token for `fileName`, or null when none is stored (or the persisted entry is malformed). */
28
+ export declare function getStoredOAuthToken(dataDir: string, fileName: string): Promise<StoredOAuthToken | null>;
29
+ /** Atomically replaces the stored OAuth token for `fileName`. */
30
+ export declare function setStoredOAuthToken(dataDir: string, fileName: string, token: StoredOAuthToken): Promise<void>;
31
+ /** Atomically deletes the stored OAuth token for `fileName`. No-op when absent. */
32
+ export declare function clearStoredOAuthToken(dataDir: string, fileName: string): Promise<void>;
33
+ /** True when the stored token is past its `expiresAt` (or within `skew` milliseconds of expiring). Returns false when no `expiresAt` is recorded — some providers issue non-expiring tokens. */
34
+ export declare function isOAuthTokenExpired(token: StoredOAuthToken, now?: number, skew?: number): boolean;
35
+ //# sourceMappingURL=oauth-tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-tokens.d.ts","sourceRoot":"","sources":["../../src/providers/oauth-tokens.ts"],"names":[],"mappings":"AAiBA;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,+DAA+D;IAC/D,WAAW,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gGAAgG;IAChG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAYD,+MAA+M;AAC/M,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,CAInE;AAkCD,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAanG;AA2CD,6HAA6H;AAC7H,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAGlC;AAED,iEAAiE;AACjE,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,mFAAmF;AACnF,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM5F;AAED,gMAAgM;AAChM,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,gBAAgB,EACvB,GAAG,GAAE,MAAmB,EACxB,IAAI,GAAE,MAAgB,GACrB,OAAO,CAGT"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * @module providers/oauth-tokens
3
+ *
4
+ * Persistent OAuth token storage: atomic write + per-file in-memory mutex +
5
+ * best-effort `chmod 0600`. Ported from OD's `integrations/xai-tokens.ts`,
6
+ * generalized: the origin hardcoded the on-disk filename (`xai-tokens.json`)
7
+ * and type names (`StoredXAIToken`) for xAI's single-account case. Since a
8
+ * host may want this same single-token-per-provider storage shape for any
9
+ * OAuth+PKCE provider (not just xAI), the file name is now a caller-supplied
10
+ * parameter and the types are provider-neutral. The on-disk layout is still
11
+ * `{ token: ... }` (room for a future multi-account schema without breaking
12
+ * existing files) and the write path is unchanged.
13
+ */
14
+ import { chmod, mkdir, readFile, rename, writeFile } from 'node:fs/promises';
15
+ import { randomBytes } from 'node:crypto';
16
+ import path from 'node:path';
17
+ const EMPTY = {};
18
+ function tokenFilePath(dataDir, fileName) {
19
+ return path.join(dataDir, fileName);
20
+ }
21
+ function isPlainObject(v) {
22
+ return Boolean(v) && typeof v === 'object' && !Array.isArray(v);
23
+ }
24
+ /** Coerces a freeform JSON blob into the typed shape, dropping anything that doesn't deserialize cleanly. Used both at read time and as a defensive pass when third-party tooling has hand-edited the file. */
25
+ export function sanitizeOAuthTokenFile(raw) {
26
+ if (!isPlainObject(raw))
27
+ return {};
28
+ const tok = sanitizeToken(raw.token);
29
+ return tok ? { token: tok } : {};
30
+ }
31
+ function sanitizeToken(raw) {
32
+ if (!isPlainObject(raw))
33
+ return null;
34
+ const accessToken = typeof raw.accessToken === 'string' ? raw.accessToken.trim() : '';
35
+ if (!accessToken)
36
+ return null;
37
+ const tokenType = typeof raw.tokenType === 'string' && raw.tokenType.trim()
38
+ ? raw.tokenType.trim()
39
+ : 'Bearer';
40
+ const refreshToken = typeof raw.refreshToken === 'string' && raw.refreshToken.trim()
41
+ ? raw.refreshToken.trim()
42
+ : undefined;
43
+ const scope = typeof raw.scope === 'string' && raw.scope.trim()
44
+ ? raw.scope.trim()
45
+ : undefined;
46
+ const expiresAt = typeof raw.expiresAt === 'number' && Number.isFinite(raw.expiresAt)
47
+ ? raw.expiresAt
48
+ : undefined;
49
+ const savedAt = typeof raw.savedAt === 'number' && Number.isFinite(raw.savedAt)
50
+ ? raw.savedAt
51
+ : Date.now();
52
+ const out = { accessToken, tokenType, savedAt };
53
+ if (refreshToken)
54
+ out.refreshToken = refreshToken;
55
+ if (scope)
56
+ out.scope = scope;
57
+ if (expiresAt !== undefined)
58
+ out.expiresAt = expiresAt;
59
+ return out;
60
+ }
61
+ export async function readOAuthTokenFile(dataDir, fileName) {
62
+ try {
63
+ const raw = await readFile(tokenFilePath(dataDir, fileName), 'utf8');
64
+ return sanitizeOAuthTokenFile(JSON.parse(raw));
65
+ }
66
+ catch (err) {
67
+ const e = err;
68
+ if (e.code === 'ENOENT')
69
+ return { ...EMPTY };
70
+ if (e.name === 'SyntaxError') {
71
+ console.error('[oauth-tokens] Corrupted JSON, returning empty:', e.message);
72
+ return { ...EMPTY };
73
+ }
74
+ throw err;
75
+ }
76
+ }
77
+ const writeLocks = new Map();
78
+ async function withLock(lockKey, fn) {
79
+ const prev = writeLocks.get(lockKey) ?? Promise.resolve();
80
+ const task = prev.catch(() => { }).then(fn);
81
+ writeLocks.set(lockKey, task);
82
+ try {
83
+ return await task;
84
+ }
85
+ finally {
86
+ if (writeLocks.get(lockKey) === task)
87
+ writeLocks.delete(lockKey);
88
+ }
89
+ }
90
+ async function writeTokenFile(dataDir, fileName, next) {
91
+ const file = tokenFilePath(dataDir, fileName);
92
+ await mkdir(path.dirname(file), { recursive: true });
93
+ const tmp = file + '.' + randomBytes(4).toString('hex') + '.tmp';
94
+ await writeFile(tmp, JSON.stringify(next, null, 2), 'utf8');
95
+ await rename(tmp, file);
96
+ // Best-effort lockdown of file mode. A bearer token grants API access on
97
+ // the user's behalf, so restrict to owner-only read/write where the OS
98
+ // supports it.
99
+ try {
100
+ await chmod(file, 0o600);
101
+ }
102
+ catch (err) {
103
+ const e = err;
104
+ if (e.code !== 'ENOTSUP' && e.code !== 'EPERM') {
105
+ console.warn('[oauth-tokens] could not chmod 0600', file, e.message ?? err);
106
+ }
107
+ }
108
+ return next;
109
+ }
110
+ /** Gets the current stored OAuth token for `fileName`, or null when none is stored (or the persisted entry is malformed). */
111
+ export async function getStoredOAuthToken(dataDir, fileName) {
112
+ const file = await readOAuthTokenFile(dataDir, fileName);
113
+ return file.token ?? null;
114
+ }
115
+ /** Atomically replaces the stored OAuth token for `fileName`. */
116
+ export async function setStoredOAuthToken(dataDir, fileName, token) {
117
+ await withLock(`${dataDir}\0${fileName}`, async () => {
118
+ await writeTokenFile(dataDir, fileName, { token });
119
+ });
120
+ }
121
+ /** Atomically deletes the stored OAuth token for `fileName`. No-op when absent. */
122
+ export async function clearStoredOAuthToken(dataDir, fileName) {
123
+ await withLock(`${dataDir}\0${fileName}`, async () => {
124
+ const file = await readOAuthTokenFile(dataDir, fileName);
125
+ if (!file.token)
126
+ return;
127
+ await writeTokenFile(dataDir, fileName, {});
128
+ });
129
+ }
130
+ /** True when the stored token is past its `expiresAt` (or within `skew` milliseconds of expiring). Returns false when no `expiresAt` is recorded — some providers issue non-expiring tokens. */
131
+ export function isOAuthTokenExpired(token, now = Date.now(), skew = 120_000) {
132
+ if (typeof token.expiresAt !== 'number')
133
+ return false;
134
+ return token.expiresAt - skew <= now;
135
+ }
136
+ //# sourceMappingURL=oauth-tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-tokens.js","sourceRoot":"","sources":["../../src/providers/oauth-tokens.ts"],"names":[],"mappings":"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"}