@nodetool-ai/runtime 0.7.0-rc.23 → 0.8.2

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 (713) hide show
  1. package/README.md +29 -0
  2. package/dist/.nodetool-build-stamp +1 -0
  3. package/dist/agent-memory.d.ts +118 -0
  4. package/dist/agent-memory.d.ts.map +1 -0
  5. package/dist/agent-memory.js +186 -0
  6. package/dist/agent-memory.js.map +1 -0
  7. package/dist/async-local-storage.d.ts +20 -0
  8. package/dist/async-local-storage.d.ts.map +1 -0
  9. package/dist/async-local-storage.js +28 -0
  10. package/dist/async-local-storage.js.map +1 -0
  11. package/dist/blender-executor.d.ts +93 -0
  12. package/dist/blender-executor.d.ts.map +1 -0
  13. package/dist/blender-executor.js +294 -0
  14. package/dist/blender-executor.js.map +1 -0
  15. package/dist/comfy-executor.d.ts +23 -1
  16. package/dist/comfy-executor.d.ts.map +1 -1
  17. package/dist/comfy-executor.js +234 -55
  18. package/dist/comfy-executor.js.map +1 -1
  19. package/dist/context-packer.d.ts +1 -1
  20. package/dist/context-packer.d.ts.map +1 -1
  21. package/dist/context-packer.js +23 -25
  22. package/dist/context-packer.js.map +1 -1
  23. package/dist/context.d.ts +982 -127
  24. package/dist/context.d.ts.map +1 -1
  25. package/dist/context.js +2649 -530
  26. package/dist/context.js.map +1 -1
  27. package/dist/cost-reconciler.d.ts +32 -0
  28. package/dist/cost-reconciler.d.ts.map +1 -0
  29. package/dist/cost-reconciler.js +21 -0
  30. package/dist/cost-reconciler.js.map +1 -0
  31. package/dist/entities.d.ts +33 -0
  32. package/dist/entities.d.ts.map +1 -0
  33. package/dist/entities.js +43 -0
  34. package/dist/entities.js.map +1 -0
  35. package/dist/external-media-fetch.d.ts +29 -0
  36. package/dist/external-media-fetch.d.ts.map +1 -0
  37. package/dist/external-media-fetch.js +38 -0
  38. package/dist/external-media-fetch.js.map +1 -0
  39. package/dist/generation-receipt.d.ts +86 -0
  40. package/dist/generation-receipt.d.ts.map +1 -0
  41. package/dist/generation-receipt.js +137 -0
  42. package/dist/generation-receipt.js.map +1 -0
  43. package/dist/generation-registry.d.ts +75 -0
  44. package/dist/generation-registry.d.ts.map +1 -0
  45. package/dist/generation-registry.js +144 -0
  46. package/dist/generation-registry.js.map +1 -0
  47. package/dist/google/client.d.ts +196 -0
  48. package/dist/google/client.d.ts.map +1 -0
  49. package/dist/google/client.js +396 -0
  50. package/dist/google/client.js.map +1 -0
  51. package/dist/google/index.d.ts +3 -0
  52. package/dist/google/index.d.ts.map +1 -0
  53. package/dist/google/index.js +3 -0
  54. package/dist/google/index.js.map +1 -0
  55. package/dist/google/token.d.ts +15 -0
  56. package/dist/google/token.d.ts.map +1 -0
  57. package/dist/google/token.js +24 -0
  58. package/dist/google/token.js.map +1 -0
  59. package/dist/host-binaries.d.ts +106 -0
  60. package/dist/host-binaries.d.ts.map +1 -0
  61. package/dist/host-binaries.js +352 -0
  62. package/dist/host-binaries.js.map +1 -0
  63. package/dist/image-codec.d.ts +76 -0
  64. package/dist/image-codec.d.ts.map +1 -0
  65. package/dist/image-codec.js +293 -0
  66. package/dist/image-codec.js.map +1 -0
  67. package/dist/image-model-tasks.d.ts +15 -0
  68. package/dist/image-model-tasks.d.ts.map +1 -0
  69. package/dist/image-model-tasks.js +24 -0
  70. package/dist/image-model-tasks.js.map +1 -0
  71. package/dist/index.d.ts +67 -6
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +51 -4
  74. package/dist/index.js.map +1 -1
  75. package/dist/invocation-account.d.ts +43 -0
  76. package/dist/invocation-account.d.ts.map +1 -0
  77. package/dist/invocation-account.js +60 -0
  78. package/dist/invocation-account.js.map +1 -0
  79. package/dist/media-ref-bytes.d.ts +35 -0
  80. package/dist/media-ref-bytes.d.ts.map +1 -0
  81. package/dist/media-ref-bytes.js +191 -0
  82. package/dist/media-ref-bytes.js.map +1 -0
  83. package/dist/node-executor.d.ts +119 -2
  84. package/dist/node-executor.d.ts.map +1 -1
  85. package/dist/permission-gate.d.ts +152 -0
  86. package/dist/permission-gate.d.ts.map +1 -0
  87. package/dist/permission-gate.js +87 -0
  88. package/dist/permission-gate.js.map +1 -0
  89. package/dist/prefixed-storage-adapter.d.ts +33 -0
  90. package/dist/prefixed-storage-adapter.d.ts.map +1 -0
  91. package/dist/prefixed-storage-adapter.js +70 -0
  92. package/dist/prefixed-storage-adapter.js.map +1 -0
  93. package/dist/prompt-asset-refs.d.ts +222 -0
  94. package/dist/prompt-asset-refs.d.ts.map +1 -0
  95. package/dist/prompt-asset-refs.js +751 -0
  96. package/dist/prompt-asset-refs.js.map +1 -0
  97. package/dist/provider-cache.d.ts +3 -0
  98. package/dist/provider-cache.d.ts.map +1 -0
  99. package/dist/provider-cache.js +8 -0
  100. package/dist/provider-cache.js.map +1 -0
  101. package/dist/providers/aki-provider.d.ts +35 -10
  102. package/dist/providers/aki-provider.d.ts.map +1 -1
  103. package/dist/providers/aki-provider.js +90 -77
  104. package/dist/providers/aki-provider.js.map +1 -1
  105. package/dist/providers/alibaba-provider.d.ts +39 -0
  106. package/dist/providers/alibaba-provider.d.ts.map +1 -0
  107. package/dist/providers/alibaba-provider.js +86 -0
  108. package/dist/providers/alibaba-provider.js.map +1 -0
  109. package/dist/providers/anthropic-provider.d.ts +52 -3
  110. package/dist/providers/anthropic-provider.d.ts.map +1 -1
  111. package/dist/providers/anthropic-provider.js +1020 -338
  112. package/dist/providers/anthropic-provider.js.map +1 -1
  113. package/dist/providers/atlascloud-provider.d.ts +103 -0
  114. package/dist/providers/atlascloud-provider.d.ts.map +1 -0
  115. package/dist/providers/atlascloud-provider.js +1031 -0
  116. package/dist/providers/atlascloud-provider.js.map +1 -0
  117. package/dist/providers/atlascloud-transport.d.ts +100 -0
  118. package/dist/providers/atlascloud-transport.d.ts.map +1 -0
  119. package/dist/providers/atlascloud-transport.js +364 -0
  120. package/dist/providers/atlascloud-transport.js.map +1 -0
  121. package/dist/providers/atlascloud-webhook-registry.d.ts +35 -0
  122. package/dist/providers/atlascloud-webhook-registry.d.ts.map +1 -0
  123. package/dist/providers/atlascloud-webhook-registry.js +104 -0
  124. package/dist/providers/atlascloud-webhook-registry.js.map +1 -0
  125. package/dist/providers/audio-mime.d.ts +11 -0
  126. package/dist/providers/audio-mime.d.ts.map +1 -0
  127. package/dist/providers/audio-mime.js +46 -0
  128. package/dist/providers/audio-mime.js.map +1 -0
  129. package/dist/providers/base-provider.d.ts +501 -32
  130. package/dist/providers/base-provider.d.ts.map +1 -1
  131. package/dist/providers/base-provider.js +1280 -87
  132. package/dist/providers/base-provider.js.map +1 -1
  133. package/dist/providers/cassette-provider.d.ts +217 -0
  134. package/dist/providers/cassette-provider.d.ts.map +1 -0
  135. package/dist/providers/cassette-provider.js +502 -0
  136. package/dist/providers/cassette-provider.js.map +1 -0
  137. package/dist/providers/cerebras-provider.d.ts +6 -12
  138. package/dist/providers/cerebras-provider.d.ts.map +1 -1
  139. package/dist/providers/cerebras-provider.js +8 -33
  140. package/dist/providers/cerebras-provider.js.map +1 -1
  141. package/dist/providers/claude-agent-provider.d.ts +107 -74
  142. package/dist/providers/claude-agent-provider.d.ts.map +1 -1
  143. package/dist/providers/claude-agent-provider.js +1279 -517
  144. package/dist/providers/claude-agent-provider.js.map +1 -1
  145. package/dist/providers/codex-provider.d.ts +84 -0
  146. package/dist/providers/codex-provider.d.ts.map +1 -0
  147. package/dist/providers/codex-provider.js +505 -0
  148. package/dist/providers/codex-provider.js.map +1 -0
  149. package/dist/providers/cohere-provider.d.ts +7 -3
  150. package/dist/providers/cohere-provider.d.ts.map +1 -1
  151. package/dist/providers/cohere-provider.js +14 -2
  152. package/dist/providers/cohere-provider.js.map +1 -1
  153. package/dist/providers/comfy-cloud-provider.d.ts +30 -0
  154. package/dist/providers/comfy-cloud-provider.d.ts.map +1 -0
  155. package/dist/providers/comfy-cloud-provider.js +42 -0
  156. package/dist/providers/comfy-cloud-provider.js.map +1 -0
  157. package/dist/providers/content-filter.d.ts +46 -0
  158. package/dist/providers/content-filter.d.ts.map +1 -0
  159. package/dist/providers/content-filter.js +92 -0
  160. package/dist/providers/content-filter.js.map +1 -0
  161. package/dist/providers/context-exceeded.d.ts +37 -0
  162. package/dist/providers/context-exceeded.d.ts.map +1 -0
  163. package/dist/providers/context-exceeded.js +114 -0
  164. package/dist/providers/context-exceeded.js.map +1 -0
  165. package/dist/providers/context-window.d.ts +44 -0
  166. package/dist/providers/context-window.d.ts.map +1 -0
  167. package/dist/providers/context-window.js +145 -0
  168. package/dist/providers/context-window.js.map +1 -0
  169. package/dist/providers/contract/index.d.ts +4 -0
  170. package/dist/providers/contract/index.d.ts.map +1 -0
  171. package/dist/providers/contract/index.js +4 -0
  172. package/dist/providers/contract/index.js.map +1 -0
  173. package/dist/providers/contract/probe-manifest.d.ts +75 -0
  174. package/dist/providers/contract/probe-manifest.d.ts.map +1 -0
  175. package/dist/providers/contract/probe-manifest.js +379 -0
  176. package/dist/providers/contract/probe-manifest.js.map +1 -0
  177. package/dist/providers/contract/probe-runner.d.ts +57 -0
  178. package/dist/providers/contract/probe-runner.d.ts.map +1 -0
  179. package/dist/providers/contract/probe-runner.js +180 -0
  180. package/dist/providers/contract/probe-runner.js.map +1 -0
  181. package/dist/providers/contract/redact.d.ts +29 -0
  182. package/dist/providers/contract/redact.d.ts.map +1 -0
  183. package/dist/providers/contract/redact.js +113 -0
  184. package/dist/providers/contract/redact.js.map +1 -0
  185. package/dist/providers/core-tools.d.ts +75 -0
  186. package/dist/providers/core-tools.d.ts.map +1 -0
  187. package/dist/providers/core-tools.js +128 -0
  188. package/dist/providers/core-tools.js.map +1 -0
  189. package/dist/providers/cost-calculator.d.ts +69 -50
  190. package/dist/providers/cost-calculator.d.ts.map +1 -1
  191. package/dist/providers/cost-calculator.js +207 -397
  192. package/dist/providers/cost-calculator.js.map +1 -1
  193. package/dist/providers/credential-check.d.ts +45 -0
  194. package/dist/providers/credential-check.d.ts.map +1 -0
  195. package/dist/providers/credential-check.js +164 -0
  196. package/dist/providers/credential-check.js.map +1 -0
  197. package/dist/providers/custom-model-kinds.d.ts +33 -0
  198. package/dist/providers/custom-model-kinds.d.ts.map +1 -0
  199. package/dist/providers/custom-model-kinds.js +96 -0
  200. package/dist/providers/custom-model-kinds.js.map +1 -0
  201. package/dist/providers/custom-openai-provider.d.ts +83 -0
  202. package/dist/providers/custom-openai-provider.d.ts.map +1 -0
  203. package/dist/providers/custom-openai-provider.js +190 -0
  204. package/dist/providers/custom-openai-provider.js.map +1 -0
  205. package/dist/providers/custom-provider-registry.d.ts +19 -0
  206. package/dist/providers/custom-provider-registry.d.ts.map +1 -0
  207. package/dist/providers/custom-provider-registry.js +52 -0
  208. package/dist/providers/custom-provider-registry.js.map +1 -0
  209. package/dist/providers/deepseek-provider.d.ts +8 -14
  210. package/dist/providers/deepseek-provider.d.ts.map +1 -1
  211. package/dist/providers/deepseek-provider.js +6 -35
  212. package/dist/providers/deepseek-provider.js.map +1 -1
  213. package/dist/providers/defaults.d.ts +12 -0
  214. package/dist/providers/defaults.d.ts.map +1 -0
  215. package/dist/providers/defaults.js +12 -0
  216. package/dist/providers/defaults.js.map +1 -0
  217. package/dist/providers/dreamina-models.d.ts +5 -0
  218. package/dist/providers/dreamina-models.d.ts.map +1 -0
  219. package/dist/providers/dreamina-models.js +57 -0
  220. package/dist/providers/dreamina-models.js.map +1 -0
  221. package/dist/providers/dreamina-music.d.ts +52 -0
  222. package/dist/providers/dreamina-music.d.ts.map +1 -0
  223. package/dist/providers/dreamina-music.js +115 -0
  224. package/dist/providers/dreamina-music.js.map +1 -0
  225. package/dist/providers/dreamina-provider.d.ts +62 -0
  226. package/dist/providers/dreamina-provider.d.ts.map +1 -0
  227. package/dist/providers/dreamina-provider.js +790 -0
  228. package/dist/providers/dreamina-provider.js.map +1 -0
  229. package/dist/providers/elevenlabs-provider.d.ts +50 -0
  230. package/dist/providers/elevenlabs-provider.d.ts.map +1 -0
  231. package/dist/providers/elevenlabs-provider.js +147 -0
  232. package/dist/providers/elevenlabs-provider.js.map +1 -0
  233. package/dist/providers/entity-references.d.ts +31 -0
  234. package/dist/providers/entity-references.d.ts.map +1 -0
  235. package/dist/providers/entity-references.js +113 -0
  236. package/dist/providers/entity-references.js.map +1 -0
  237. package/dist/providers/evolink-provider.d.ts +40 -0
  238. package/dist/providers/evolink-provider.d.ts.map +1 -0
  239. package/dist/providers/evolink-provider.js +312 -0
  240. package/dist/providers/evolink-provider.js.map +1 -0
  241. package/dist/providers/fake-provider.d.ts +74 -2
  242. package/dist/providers/fake-provider.d.ts.map +1 -1
  243. package/dist/providers/fake-provider.js +213 -1
  244. package/dist/providers/fake-provider.js.map +1 -1
  245. package/dist/providers/fal-generations.d.ts +106 -0
  246. package/dist/providers/fal-generations.d.ts.map +1 -0
  247. package/dist/providers/fal-generations.js +286 -0
  248. package/dist/providers/fal-generations.js.map +1 -0
  249. package/dist/providers/fal-provider.d.ts +173 -8
  250. package/dist/providers/fal-provider.d.ts.map +1 -1
  251. package/dist/providers/fal-provider.js +1396 -64
  252. package/dist/providers/fal-provider.js.map +1 -1
  253. package/dist/providers/fal-queue.d.ts +47 -0
  254. package/dist/providers/fal-queue.d.ts.map +1 -0
  255. package/dist/providers/fal-queue.js +231 -0
  256. package/dist/providers/fal-queue.js.map +1 -0
  257. package/dist/providers/gemini-provider.d.ts +150 -9
  258. package/dist/providers/gemini-provider.d.ts.map +1 -1
  259. package/dist/providers/gemini-provider.js +1515 -316
  260. package/dist/providers/gemini-provider.js.map +1 -1
  261. package/dist/providers/gmi-provider.d.ts +21 -0
  262. package/dist/providers/gmi-provider.d.ts.map +1 -0
  263. package/dist/providers/gmi-provider.js +34 -0
  264. package/dist/providers/gmi-provider.js.map +1 -0
  265. package/dist/providers/gpt-image-size.d.ts +3 -0
  266. package/dist/providers/gpt-image-size.d.ts.map +1 -0
  267. package/dist/providers/gpt-image-size.js +37 -0
  268. package/dist/providers/gpt-image-size.js.map +1 -0
  269. package/dist/providers/groq-provider.d.ts +9 -12
  270. package/dist/providers/groq-provider.d.ts.map +1 -1
  271. package/dist/providers/groq-provider.js +19 -33
  272. package/dist/providers/groq-provider.js.map +1 -1
  273. package/dist/providers/groq-request.d.ts +38 -0
  274. package/dist/providers/groq-request.d.ts.map +1 -0
  275. package/dist/providers/groq-request.js +138 -0
  276. package/dist/providers/groq-request.js.map +1 -0
  277. package/dist/providers/higgsfield-provider.d.ts +31 -0
  278. package/dist/providers/higgsfield-provider.d.ts.map +1 -0
  279. package/dist/providers/higgsfield-provider.js +143 -0
  280. package/dist/providers/higgsfield-provider.js.map +1 -0
  281. package/dist/providers/higgsfield-transport.d.ts +106 -0
  282. package/dist/providers/higgsfield-transport.d.ts.map +1 -0
  283. package/dist/providers/higgsfield-transport.js +182 -0
  284. package/dist/providers/higgsfield-transport.js.map +1 -0
  285. package/dist/providers/http-transport.d.ts +74 -0
  286. package/dist/providers/http-transport.d.ts.map +1 -0
  287. package/dist/providers/http-transport.js +152 -0
  288. package/dist/providers/http-transport.js.map +1 -0
  289. package/dist/providers/huggingface-provider.d.ts +73 -4
  290. package/dist/providers/huggingface-provider.d.ts.map +1 -1
  291. package/dist/providers/huggingface-provider.js +240 -34
  292. package/dist/providers/huggingface-provider.js.map +1 -1
  293. package/dist/providers/image-mime.d.ts +39 -0
  294. package/dist/providers/image-mime.d.ts.map +1 -0
  295. package/dist/providers/image-mime.js +111 -0
  296. package/dist/providers/image-mime.js.map +1 -0
  297. package/dist/providers/image-ref.d.ts +21 -0
  298. package/dist/providers/image-ref.d.ts.map +1 -0
  299. package/dist/providers/image-ref.js +44 -0
  300. package/dist/providers/image-ref.js.map +1 -0
  301. package/dist/providers/index.d.ts +87 -8
  302. package/dist/providers/index.d.ts.map +1 -1
  303. package/dist/providers/index.js +250 -56
  304. package/dist/providers/index.js.map +1 -1
  305. package/dist/providers/jina-provider.d.ts +12 -3
  306. package/dist/providers/jina-provider.d.ts.map +1 -1
  307. package/dist/providers/jina-provider.js +21 -7
  308. package/dist/providers/jina-provider.js.map +1 -1
  309. package/dist/providers/kie-provider.d.ts +172 -10
  310. package/dist/providers/kie-provider.d.ts.map +1 -1
  311. package/dist/providers/kie-provider.js +1190 -228
  312. package/dist/providers/kie-provider.js.map +1 -1
  313. package/dist/providers/kie-webhook-registry.d.ts +28 -0
  314. package/dist/providers/kie-webhook-registry.d.ts.map +1 -0
  315. package/dist/providers/kie-webhook-registry.js +91 -0
  316. package/dist/providers/kie-webhook-registry.js.map +1 -0
  317. package/dist/providers/llama-provider.d.ts +23 -36
  318. package/dist/providers/llama-provider.d.ts.map +1 -1
  319. package/dist/providers/llama-provider.js +50 -355
  320. package/dist/providers/llama-provider.js.map +1 -1
  321. package/dist/providers/lmstudio-provider.d.ts +4 -7
  322. package/dist/providers/lmstudio-provider.d.ts.map +1 -1
  323. package/dist/providers/lmstudio-provider.js +24 -15
  324. package/dist/providers/lmstudio-provider.js.map +1 -1
  325. package/dist/providers/loop-tracing.d.ts +17 -0
  326. package/dist/providers/loop-tracing.d.ts.map +1 -0
  327. package/dist/providers/loop-tracing.js +132 -0
  328. package/dist/providers/loop-tracing.js.map +1 -0
  329. package/dist/providers/manifest-models.d.ts +341 -1
  330. package/dist/providers/manifest-models.d.ts.map +1 -1
  331. package/dist/providers/manifest-models.js +1106 -22
  332. package/dist/providers/manifest-models.js.map +1 -1
  333. package/dist/providers/media-mime.d.ts +14 -0
  334. package/dist/providers/media-mime.d.ts.map +1 -0
  335. package/dist/providers/media-mime.js +35 -0
  336. package/dist/providers/media-mime.js.map +1 -0
  337. package/dist/providers/meshy-provider.d.ts +16 -2
  338. package/dist/providers/meshy-provider.d.ts.map +1 -1
  339. package/dist/providers/meshy-provider.js +82 -46
  340. package/dist/providers/meshy-provider.js.map +1 -1
  341. package/dist/providers/meta-provider.d.ts +22 -0
  342. package/dist/providers/meta-provider.d.ts.map +1 -0
  343. package/dist/providers/meta-provider.js +54 -0
  344. package/dist/providers/meta-provider.js.map +1 -0
  345. package/dist/providers/minimax-provider.d.ts +27 -18
  346. package/dist/providers/minimax-provider.d.ts.map +1 -1
  347. package/dist/providers/minimax-provider.js +222 -72
  348. package/dist/providers/minimax-provider.js.map +1 -1
  349. package/dist/providers/mistral-provider.d.ts +8 -12
  350. package/dist/providers/mistral-provider.d.ts.map +1 -1
  351. package/dist/providers/mistral-provider.js +15 -34
  352. package/dist/providers/mistral-provider.js.map +1 -1
  353. package/dist/providers/moonshot-provider.d.ts +11 -15
  354. package/dist/providers/moonshot-provider.d.ts.map +1 -1
  355. package/dist/providers/moonshot-provider.js +33 -23
  356. package/dist/providers/moonshot-provider.js.map +1 -1
  357. package/dist/providers/node-llama-cpp-provider.d.ts +99 -0
  358. package/dist/providers/node-llama-cpp-provider.d.ts.map +1 -0
  359. package/dist/providers/node-llama-cpp-provider.js +484 -0
  360. package/dist/providers/node-llama-cpp-provider.js.map +1 -0
  361. package/dist/providers/nodetool-provider.d.ts +49 -0
  362. package/dist/providers/nodetool-provider.d.ts.map +1 -0
  363. package/dist/providers/nodetool-provider.js +222 -0
  364. package/dist/providers/nodetool-provider.js.map +1 -0
  365. package/dist/providers/oauth/browser-launcher.d.ts +23 -0
  366. package/dist/providers/oauth/browser-launcher.d.ts.map +1 -0
  367. package/dist/providers/oauth/browser-launcher.js +45 -0
  368. package/dist/providers/oauth/browser-launcher.js.map +1 -0
  369. package/dist/providers/oauth/claude-code-credentials.d.ts +74 -0
  370. package/dist/providers/oauth/claude-code-credentials.d.ts.map +1 -0
  371. package/dist/providers/oauth/claude-code-credentials.js +133 -0
  372. package/dist/providers/oauth/claude-code-credentials.js.map +1 -0
  373. package/dist/providers/oauth/claude-code-login.d.ts +124 -0
  374. package/dist/providers/oauth/claude-code-login.d.ts.map +1 -0
  375. package/dist/providers/oauth/claude-code-login.js +230 -0
  376. package/dist/providers/oauth/claude-code-login.js.map +1 -0
  377. package/dist/providers/oauth/claude-code-oauth-client.d.ts +111 -0
  378. package/dist/providers/oauth/claude-code-oauth-client.d.ts.map +1 -0
  379. package/dist/providers/oauth/claude-code-oauth-client.js +207 -0
  380. package/dist/providers/oauth/claude-code-oauth-client.js.map +1 -0
  381. package/dist/providers/oauth/errors.d.ts +54 -0
  382. package/dist/providers/oauth/errors.d.ts.map +1 -0
  383. package/dist/providers/oauth/errors.js +79 -0
  384. package/dist/providers/oauth/errors.js.map +1 -0
  385. package/dist/providers/oauth/index.d.ts +105 -0
  386. package/dist/providers/oauth/index.d.ts.map +1 -0
  387. package/dist/providers/oauth/index.js +167 -0
  388. package/dist/providers/oauth/index.js.map +1 -0
  389. package/dist/providers/oauth/jwt-claims.d.ts +23 -0
  390. package/dist/providers/oauth/jwt-claims.d.ts.map +1 -0
  391. package/dist/providers/oauth/jwt-claims.js +67 -0
  392. package/dist/providers/oauth/jwt-claims.js.map +1 -0
  393. package/dist/providers/oauth/local-callback-server.d.ts +60 -0
  394. package/dist/providers/oauth/local-callback-server.d.ts.map +1 -0
  395. package/dist/providers/oauth/local-callback-server.js +148 -0
  396. package/dist/providers/oauth/local-callback-server.js.map +1 -0
  397. package/dist/providers/oauth/oauth-client.d.ts +55 -0
  398. package/dist/providers/oauth/oauth-client.d.ts.map +1 -0
  399. package/dist/providers/oauth/oauth-client.js +161 -0
  400. package/dist/providers/oauth/oauth-client.js.map +1 -0
  401. package/dist/providers/oauth/openai-oauth-provider.d.ts +129 -0
  402. package/dist/providers/oauth/openai-oauth-provider.d.ts.map +1 -0
  403. package/dist/providers/oauth/openai-oauth-provider.js +265 -0
  404. package/dist/providers/oauth/openai-oauth-provider.js.map +1 -0
  405. package/dist/providers/oauth/pkce-helper.d.ts +43 -0
  406. package/dist/providers/oauth/pkce-helper.d.ts.map +1 -0
  407. package/dist/providers/oauth/pkce-helper.js +57 -0
  408. package/dist/providers/oauth/pkce-helper.js.map +1 -0
  409. package/dist/providers/oauth/redaction.d.ts +22 -0
  410. package/dist/providers/oauth/redaction.d.ts.map +1 -0
  411. package/dist/providers/oauth/redaction.js +59 -0
  412. package/dist/providers/oauth/redaction.js.map +1 -0
  413. package/dist/providers/oauth/secure-credential-store.d.ts +67 -0
  414. package/dist/providers/oauth/secure-credential-store.d.ts.map +1 -0
  415. package/dist/providers/oauth/secure-credential-store.js +73 -0
  416. package/dist/providers/oauth/secure-credential-store.js.map +1 -0
  417. package/dist/providers/oauth/token-store.d.ts +53 -0
  418. package/dist/providers/oauth/token-store.d.ts.map +1 -0
  419. package/dist/providers/oauth/token-store.js +78 -0
  420. package/dist/providers/oauth/token-store.js.map +1 -0
  421. package/dist/providers/oauth/types.d.ts +64 -0
  422. package/dist/providers/oauth/types.d.ts.map +1 -0
  423. package/dist/providers/oauth/types.js +12 -0
  424. package/dist/providers/oauth/types.js.map +1 -0
  425. package/dist/providers/object-tracking.d.ts +47 -0
  426. package/dist/providers/object-tracking.d.ts.map +1 -0
  427. package/dist/providers/object-tracking.js +46 -0
  428. package/dist/providers/object-tracking.js.map +1 -0
  429. package/dist/providers/offline-model-index.d.ts +20 -0
  430. package/dist/providers/offline-model-index.d.ts.map +1 -0
  431. package/dist/providers/offline-model-index.js +112 -0
  432. package/dist/providers/offline-model-index.js.map +1 -0
  433. package/dist/providers/ollama-provider.d.ts +30 -2
  434. package/dist/providers/ollama-provider.d.ts.map +1 -1
  435. package/dist/providers/ollama-provider.js +198 -43
  436. package/dist/providers/ollama-provider.js.map +1 -1
  437. package/dist/providers/openai-compat/client.d.ts +57 -0
  438. package/dist/providers/openai-compat/client.d.ts.map +1 -0
  439. package/dist/providers/openai-compat/client.js +157 -0
  440. package/dist/providers/openai-compat/client.js.map +1 -0
  441. package/dist/providers/openai-compat/decode.d.ts +36 -0
  442. package/dist/providers/openai-compat/decode.d.ts.map +1 -0
  443. package/dist/providers/openai-compat/decode.js +55 -0
  444. package/dist/providers/openai-compat/decode.js.map +1 -0
  445. package/dist/providers/openai-compat/errors.d.ts +54 -0
  446. package/dist/providers/openai-compat/errors.d.ts.map +1 -0
  447. package/dist/providers/openai-compat/errors.js +144 -0
  448. package/dist/providers/openai-compat/errors.js.map +1 -0
  449. package/dist/providers/openai-compat/index.d.ts +8 -0
  450. package/dist/providers/openai-compat/index.d.ts.map +1 -0
  451. package/dist/providers/openai-compat/index.js +5 -0
  452. package/dist/providers/openai-compat/index.js.map +1 -0
  453. package/dist/providers/openai-compat/sse.d.ts +14 -0
  454. package/dist/providers/openai-compat/sse.d.ts.map +1 -0
  455. package/dist/providers/openai-compat/sse.js +69 -0
  456. package/dist/providers/openai-compat/sse.js.map +1 -0
  457. package/dist/providers/openai-compat/types.d.ts +75 -0
  458. package/dist/providers/openai-compat/types.d.ts.map +1 -0
  459. package/dist/providers/openai-compat/types.js +9 -0
  460. package/dist/providers/openai-compat/types.js.map +1 -0
  461. package/dist/providers/openai-compat-provider.d.ts +90 -0
  462. package/dist/providers/openai-compat-provider.d.ts.map +1 -0
  463. package/dist/providers/openai-compat-provider.js +282 -0
  464. package/dist/providers/openai-compat-provider.js.map +1 -0
  465. package/dist/providers/openai-provider.d.ts +98 -27
  466. package/dist/providers/openai-provider.d.ts.map +1 -1
  467. package/dist/providers/openai-provider.js +1037 -105
  468. package/dist/providers/openai-provider.js.map +1 -1
  469. package/dist/providers/openrouter-provider.d.ts +58 -13
  470. package/dist/providers/openrouter-provider.d.ts.map +1 -1
  471. package/dist/providers/openrouter-provider.js +383 -51
  472. package/dist/providers/openrouter-provider.js.map +1 -1
  473. package/dist/providers/provider-call-failure.d.ts +39 -0
  474. package/dist/providers/provider-call-failure.d.ts.map +1 -0
  475. package/dist/providers/provider-call-failure.js +132 -0
  476. package/dist/providers/provider-call-failure.js.map +1 -0
  477. package/dist/providers/provider-error.d.ts +59 -0
  478. package/dist/providers/provider-error.d.ts.map +1 -0
  479. package/dist/providers/provider-error.js +171 -0
  480. package/dist/providers/provider-error.js.map +1 -0
  481. package/dist/providers/provider-generations.d.ts +99 -0
  482. package/dist/providers/provider-generations.d.ts.map +1 -0
  483. package/dist/providers/provider-generations.js +71 -0
  484. package/dist/providers/provider-generations.js.map +1 -0
  485. package/dist/providers/provider-queue.d.ts +62 -0
  486. package/dist/providers/provider-queue.d.ts.map +1 -0
  487. package/dist/providers/provider-queue.js +28 -0
  488. package/dist/providers/provider-queue.js.map +1 -0
  489. package/dist/providers/provider-registry.d.ts +33 -14
  490. package/dist/providers/provider-registry.d.ts.map +1 -1
  491. package/dist/providers/provider-registry.js +85 -68
  492. package/dist/providers/provider-registry.js.map +1 -1
  493. package/dist/providers/provider-request-log.d.ts +53 -0
  494. package/dist/providers/provider-request-log.d.ts.map +1 -0
  495. package/dist/providers/provider-request-log.js +168 -0
  496. package/dist/providers/provider-request-log.js.map +1 -0
  497. package/dist/providers/provider-session.d.ts +3 -0
  498. package/dist/providers/provider-session.d.ts.map +1 -0
  499. package/dist/providers/provider-session.js +10 -0
  500. package/dist/providers/provider-session.js.map +1 -0
  501. package/dist/providers/provider-transport.d.ts +11 -0
  502. package/dist/providers/provider-transport.d.ts.map +1 -0
  503. package/dist/providers/provider-transport.js +11 -0
  504. package/dist/providers/provider-transport.js.map +1 -0
  505. package/dist/providers/python-provider.d.ts +26 -13
  506. package/dist/providers/python-provider.d.ts.map +1 -1
  507. package/dist/providers/python-provider.js +204 -25
  508. package/dist/providers/python-provider.js.map +1 -1
  509. package/dist/providers/replicate-provider.d.ts +91 -8
  510. package/dist/providers/replicate-provider.d.ts.map +1 -1
  511. package/dist/providers/replicate-provider.js +823 -65
  512. package/dist/providers/replicate-provider.js.map +1 -1
  513. package/dist/providers/replicate-retry.d.ts +30 -0
  514. package/dist/providers/replicate-retry.d.ts.map +1 -0
  515. package/dist/providers/replicate-retry.js +97 -0
  516. package/dist/providers/replicate-retry.js.map +1 -0
  517. package/dist/providers/requesty-provider.d.ts +30 -0
  518. package/dist/providers/requesty-provider.d.ts.map +1 -0
  519. package/dist/providers/requesty-provider.js +87 -0
  520. package/dist/providers/requesty-provider.js.map +1 -0
  521. package/dist/providers/responses-api.d.ts +27 -0
  522. package/dist/providers/responses-api.d.ts.map +1 -0
  523. package/dist/providers/responses-api.js +297 -0
  524. package/dist/providers/responses-api.js.map +1 -0
  525. package/dist/providers/reve-provider.d.ts +46 -0
  526. package/dist/providers/reve-provider.d.ts.map +1 -0
  527. package/dist/providers/reve-provider.js +165 -0
  528. package/dist/providers/reve-provider.js.map +1 -0
  529. package/dist/providers/rodin-provider.d.ts +25 -2
  530. package/dist/providers/rodin-provider.d.ts.map +1 -1
  531. package/dist/providers/rodin-provider.js +95 -51
  532. package/dist/providers/rodin-provider.js.map +1 -1
  533. package/dist/providers/safe-url.d.ts +70 -0
  534. package/dist/providers/safe-url.d.ts.map +1 -0
  535. package/dist/providers/safe-url.js +277 -0
  536. package/dist/providers/safe-url.js.map +1 -0
  537. package/dist/providers/scripted-provider.d.ts +9 -0
  538. package/dist/providers/scripted-provider.d.ts.map +1 -1
  539. package/dist/providers/scripted-provider.js +86 -10
  540. package/dist/providers/scripted-provider.js.map +1 -1
  541. package/dist/providers/structured-output.d.ts +42 -0
  542. package/dist/providers/structured-output.d.ts.map +1 -0
  543. package/dist/providers/structured-output.js +83 -0
  544. package/dist/providers/structured-output.js.map +1 -0
  545. package/dist/providers/together-operations.d.ts +27 -0
  546. package/dist/providers/together-operations.d.ts.map +1 -0
  547. package/dist/providers/together-operations.js +95 -0
  548. package/dist/providers/together-operations.js.map +1 -0
  549. package/dist/providers/together-provider.d.ts +18 -18
  550. package/dist/providers/together-provider.d.ts.map +1 -1
  551. package/dist/providers/together-provider.js +140 -367
  552. package/dist/providers/together-provider.js.map +1 -1
  553. package/dist/providers/topaz-provider.d.ts +45 -0
  554. package/dist/providers/topaz-provider.d.ts.map +1 -0
  555. package/dist/providers/topaz-provider.js +244 -0
  556. package/dist/providers/topaz-provider.js.map +1 -0
  557. package/dist/providers/types.d.ts +641 -4
  558. package/dist/providers/types.d.ts.map +1 -1
  559. package/dist/providers/types.js +81 -1
  560. package/dist/providers/types.js.map +1 -1
  561. package/dist/providers/useapi-provider.d.ts +28 -0
  562. package/dist/providers/useapi-provider.d.ts.map +1 -0
  563. package/dist/providers/useapi-provider.js +274 -0
  564. package/dist/providers/useapi-provider.js.map +1 -0
  565. package/dist/providers/video-duration.d.ts +6 -0
  566. package/dist/providers/video-duration.d.ts.map +1 -0
  567. package/dist/providers/video-duration.js +63 -0
  568. package/dist/providers/video-duration.js.map +1 -0
  569. package/dist/providers/video-frame-fallback.d.ts +39 -0
  570. package/dist/providers/video-frame-fallback.d.ts.map +1 -0
  571. package/dist/providers/video-frame-fallback.js +155 -0
  572. package/dist/providers/video-frame-fallback.js.map +1 -0
  573. package/dist/providers/video-frames.d.ts +61 -0
  574. package/dist/providers/video-frames.d.ts.map +1 -0
  575. package/dist/providers/video-frames.js +208 -0
  576. package/dist/providers/video-frames.js.map +1 -0
  577. package/dist/providers/video-mime.d.ts +14 -0
  578. package/dist/providers/video-mime.d.ts.map +1 -0
  579. package/dist/providers/video-mime.js +44 -0
  580. package/dist/providers/video-mime.js.map +1 -0
  581. package/dist/providers/video-to-audio.d.ts +34 -0
  582. package/dist/providers/video-to-audio.d.ts.map +1 -0
  583. package/dist/providers/video-to-audio.js +62 -0
  584. package/dist/providers/video-to-audio.js.map +1 -0
  585. package/dist/providers/vllm-provider.d.ts +20 -8
  586. package/dist/providers/vllm-provider.d.ts.map +1 -1
  587. package/dist/providers/vllm-provider.js +44 -23
  588. package/dist/providers/vllm-provider.js.map +1 -1
  589. package/dist/providers/voyage-provider.d.ts +12 -3
  590. package/dist/providers/voyage-provider.d.ts.map +1 -1
  591. package/dist/providers/voyage-provider.js +21 -7
  592. package/dist/providers/voyage-provider.js.map +1 -1
  593. package/dist/providers/xai-provider.d.ts +56 -13
  594. package/dist/providers/xai-provider.d.ts.map +1 -1
  595. package/dist/providers/xai-provider.js +307 -22
  596. package/dist/providers/xai-provider.js.map +1 -1
  597. package/dist/python-bridge-base.d.ts +358 -0
  598. package/dist/python-bridge-base.d.ts.map +1 -0
  599. package/dist/python-bridge-base.js +1557 -0
  600. package/dist/python-bridge-base.js.map +1 -0
  601. package/dist/python-bridge-codec.d.ts +28 -0
  602. package/dist/python-bridge-codec.d.ts.map +1 -0
  603. package/dist/python-bridge-codec.js +39 -0
  604. package/dist/python-bridge-codec.js.map +1 -0
  605. package/dist/python-bridge-factory.d.ts +52 -0
  606. package/dist/python-bridge-factory.d.ts.map +1 -0
  607. package/dist/python-bridge-factory.js +69 -0
  608. package/dist/python-bridge-factory.js.map +1 -0
  609. package/dist/python-bridge-framing.d.ts +68 -0
  610. package/dist/python-bridge-framing.d.ts.map +1 -0
  611. package/dist/python-bridge-framing.js +91 -0
  612. package/dist/python-bridge-framing.js.map +1 -0
  613. package/dist/python-bridge-types.d.ts +545 -2
  614. package/dist/python-bridge-types.d.ts.map +1 -1
  615. package/dist/python-bridge-types.js +49 -1
  616. package/dist/python-bridge-types.js.map +1 -1
  617. package/dist/python-graph-resolver.d.ts +57 -0
  618. package/dist/python-graph-resolver.d.ts.map +1 -0
  619. package/dist/python-graph-resolver.js +79 -0
  620. package/dist/python-graph-resolver.js.map +1 -0
  621. package/dist/python-node-executor.d.ts +36 -4
  622. package/dist/python-node-executor.d.ts.map +1 -1
  623. package/dist/python-node-executor.js +177 -86
  624. package/dist/python-node-executor.js.map +1 -1
  625. package/dist/python-stdio-bridge.d.ts +18 -37
  626. package/dist/python-stdio-bridge.d.ts.map +1 -1
  627. package/dist/python-stdio-bridge.js +148 -475
  628. package/dist/python-stdio-bridge.js.map +1 -1
  629. package/dist/python-websocket-bridge.d.ts +140 -0
  630. package/dist/python-websocket-bridge.d.ts.map +1 -0
  631. package/dist/python-websocket-bridge.js +561 -0
  632. package/dist/python-websocket-bridge.js.map +1 -0
  633. package/dist/python-worker-stderr.d.ts +4 -0
  634. package/dist/python-worker-stderr.d.ts.map +1 -0
  635. package/dist/python-worker-stderr.js +24 -0
  636. package/dist/python-worker-stderr.js.map +1 -0
  637. package/dist/recommended-models.d.ts +2 -2
  638. package/dist/recommended-models.d.ts.map +1 -1
  639. package/dist/recommended-models.js +44 -4
  640. package/dist/recommended-models.js.map +1 -1
  641. package/dist/recoverable-node-error.d.ts +31 -0
  642. package/dist/recoverable-node-error.d.ts.map +1 -0
  643. package/dist/recoverable-node-error.js +37 -0
  644. package/dist/recoverable-node-error.js.map +1 -0
  645. package/dist/redact-params.d.ts +13 -0
  646. package/dist/redact-params.d.ts.map +1 -0
  647. package/dist/redact-params.js +57 -0
  648. package/dist/redact-params.js.map +1 -0
  649. package/dist/run-context.d.ts +20 -0
  650. package/dist/run-context.d.ts.map +1 -0
  651. package/dist/run-context.js +18 -0
  652. package/dist/run-context.js.map +1 -0
  653. package/dist/run-trace-context.d.ts +30 -0
  654. package/dist/run-trace-context.d.ts.map +1 -0
  655. package/dist/run-trace-context.js +80 -0
  656. package/dist/run-trace-context.js.map +1 -0
  657. package/dist/run-trace-processor.d.ts +65 -0
  658. package/dist/run-trace-processor.d.ts.map +1 -0
  659. package/dist/run-trace-processor.js +417 -0
  660. package/dist/run-trace-processor.js.map +1 -0
  661. package/dist/run-trace-serialization.d.ts +5 -0
  662. package/dist/run-trace-serialization.d.ts.map +1 -0
  663. package/dist/run-trace-serialization.js +113 -0
  664. package/dist/run-trace-serialization.js.map +1 -0
  665. package/dist/sandbox-module-catalog.d.ts +43 -0
  666. package/dist/sandbox-module-catalog.d.ts.map +1 -0
  667. package/dist/sandbox-module-catalog.js +25 -0
  668. package/dist/sandbox-module-catalog.js.map +1 -0
  669. package/dist/storage-workspace.d.ts +62 -0
  670. package/dist/storage-workspace.d.ts.map +1 -0
  671. package/dist/storage-workspace.js +441 -0
  672. package/dist/storage-workspace.js.map +1 -0
  673. package/dist/swappable-python-bridge.d.ts +83 -0
  674. package/dist/swappable-python-bridge.d.ts.map +1 -0
  675. package/dist/swappable-python-bridge.js +246 -0
  676. package/dist/swappable-python-bridge.js.map +1 -0
  677. package/dist/telemetry.d.ts +16 -3
  678. package/dist/telemetry.d.ts.map +1 -1
  679. package/dist/telemetry.js +76 -20
  680. package/dist/telemetry.js.map +1 -1
  681. package/dist/testing.d.ts +81 -0
  682. package/dist/testing.d.ts.map +1 -0
  683. package/dist/testing.js +130 -0
  684. package/dist/testing.js.map +1 -0
  685. package/dist/token-counter.d.ts +30 -0
  686. package/dist/token-counter.d.ts.map +1 -0
  687. package/dist/token-counter.js +156 -0
  688. package/dist/token-counter.js.map +1 -0
  689. package/dist/trace-exporters.d.ts +11 -28
  690. package/dist/trace-exporters.d.ts.map +1 -1
  691. package/dist/trace-exporters.js +69 -22
  692. package/dist/trace-exporters.js.map +1 -1
  693. package/dist/tracing-helpers.d.ts +60 -26
  694. package/dist/tracing-helpers.d.ts.map +1 -1
  695. package/dist/tracing-helpers.js +100 -25
  696. package/dist/tracing-helpers.js.map +1 -1
  697. package/dist/trim-video-window.d.ts +8 -0
  698. package/dist/trim-video-window.d.ts.map +1 -0
  699. package/dist/trim-video-window.js +50 -0
  700. package/dist/trim-video-window.js.map +1 -0
  701. package/dist/turn-budget.d.ts +278 -0
  702. package/dist/turn-budget.d.ts.map +1 -0
  703. package/dist/turn-budget.js +365 -0
  704. package/dist/turn-budget.js.map +1 -0
  705. package/dist/variable-channel.d.ts +48 -0
  706. package/dist/variable-channel.d.ts.map +1 -0
  707. package/dist/variable-channel.js +110 -0
  708. package/dist/variable-channel.js.map +1 -0
  709. package/dist/workspace.d.ts +119 -0
  710. package/dist/workspace.d.ts.map +1 -0
  711. package/dist/workspace.js +112 -0
  712. package/dist/workspace.js.map +1 -0
  713. package/package.json +121 -19
@@ -0,0 +1,265 @@
1
+ /**
2
+ * OpenAIOAuthProvider — an OpenAI provider authenticated by browser-based
3
+ * OAuth 2.0 (Authorization Code + PKCE) instead of a pasted API key.
4
+ *
5
+ * It extends `OpenAIProvider` so every model capability (chat, streaming,
6
+ * images, audio, embeddings) is inherited unchanged. The only thing it
7
+ * replaces is *where the bearer token comes from*: instead of a static API
8
+ * key, every request is served by a short-lived OAuth access token that is
9
+ * transparently refreshed when it expires.
10
+ *
11
+ * All collaborators are injected (OAuth client, token store, callback server,
12
+ * PKCE helper, browser launcher), so there is no module-level state and the
13
+ * whole thing is unit-testable without a network or a browser.
14
+ */
15
+ import OpenAI from "openai";
16
+ import { createLogger } from "@nodetool-ai/config";
17
+ import { OpenAIProvider } from "../openai-provider.js";
18
+ import { PKCEHelper } from "./pkce-helper.js";
19
+ import { CredentialsRevokedError, InvalidRefreshTokenError, NotAuthenticatedError, SessionExpiredError } from "./errors.js";
20
+ import { systemClock } from "./types.js";
21
+ /** Sentinel passed to the parent constructor; the real bearer is OAuth-sourced. */
22
+ const OAUTH_API_KEY_SENTINEL = "__nodetool_oauth__";
23
+ export class OpenAIOAuthProvider extends OpenAIProvider {
24
+ oauthClient;
25
+ tokenStore;
26
+ browserLauncher;
27
+ callbackServerFactory;
28
+ pkce;
29
+ openAIClientFactory;
30
+ clock;
31
+ oauthLogger;
32
+ expirySkewMs;
33
+ loginTimeoutMs;
34
+ /** In-memory session mirror of the persisted token set. */
35
+ session = null;
36
+ /** Cached OpenAI client, keyed by the token it was built for. */
37
+ oauthOpenAIClient = null;
38
+ cachedForToken = null;
39
+ /** Single-flight guard so concurrent calls share one refresh round-trip. */
40
+ refreshInFlight = null;
41
+ constructor(options) {
42
+ super({ OPENAI_API_KEY: OAUTH_API_KEY_SENTINEL }, { providerId: options.providerId ?? "openai" });
43
+ this.oauthClient = options.oauthClient;
44
+ this.tokenStore = options.tokenStore;
45
+ this.browserLauncher = options.browserLauncher;
46
+ this.callbackServerFactory = options.callbackServerFactory;
47
+ this.pkce = options.pkce ?? new PKCEHelper();
48
+ const apiBaseUrl = options.apiBaseUrl;
49
+ const apiHeaders = options.apiHeaders;
50
+ const dynamicApiHeaders = options.dynamicApiHeaders;
51
+ this.openAIClientFactory =
52
+ options.openAIClientFactory ??
53
+ ((accessToken) => {
54
+ const headers = {
55
+ ...(apiHeaders ?? {}),
56
+ ...(dynamicApiHeaders?.(accessToken) ?? {})
57
+ };
58
+ const clientOptions = {
59
+ apiKey: accessToken
60
+ };
61
+ if (apiBaseUrl) {
62
+ clientOptions.baseURL = apiBaseUrl;
63
+ }
64
+ if (Object.keys(headers).length > 0) {
65
+ clientOptions.defaultHeaders = headers;
66
+ }
67
+ return new OpenAI(clientOptions);
68
+ });
69
+ this.clock = options.clock ?? systemClock;
70
+ this.oauthLogger =
71
+ options.logger ?? createLogger("nodetool.runtime.oauth.provider");
72
+ this.expirySkewMs = (options.expirySkewSeconds ?? 60) * 1000;
73
+ this.loginTimeoutMs = options.loginTimeoutMs ?? 300_000;
74
+ }
75
+ // --- Authentication lifecycle ------------------------------------------
76
+ /**
77
+ * Run the full browser OAuth flow: spin up a localhost callback server, open
78
+ * the browser, wait for the redirect, exchange the code, and persist tokens.
79
+ * Resolves with the (non-secret) token metadata on success.
80
+ */
81
+ async login(options = {}) {
82
+ const server = this.callbackServerFactory();
83
+ try {
84
+ const { redirectUri } = await server.listen();
85
+ const pkcePair = await this.pkce.createPkcePair();
86
+ const state = await this.pkce.createState();
87
+ const authUrl = this.oauthClient.buildAuthorizationUrl({
88
+ redirectUri,
89
+ state,
90
+ codeChallenge: pkcePair.challenge,
91
+ codeChallengeMethod: pkcePair.method
92
+ });
93
+ // BrowserLaunchError propagates as a distinct failure mode.
94
+ await this.browserLauncher.open(authUrl);
95
+ this.oauthLogger.info("Waiting for OAuth callback");
96
+ const { code } = await server.waitForCode({
97
+ expectedState: state,
98
+ timeoutMs: options.timeoutMs ?? this.loginTimeoutMs,
99
+ signal: options.signal
100
+ });
101
+ const tokens = await this.oauthClient.exchangeAuthorizationCode({
102
+ code,
103
+ codeVerifier: pkcePair.verifier,
104
+ redirectUri,
105
+ signal: options.signal
106
+ });
107
+ await this.applyTokens(tokens);
108
+ this.oauthLogger.info("OAuth login succeeded", {
109
+ scope: tokens.scope,
110
+ expiresAt: tokens.expiresAt
111
+ });
112
+ return { scope: tokens.scope, expiresAt: tokens.expiresAt };
113
+ }
114
+ finally {
115
+ await server.close();
116
+ }
117
+ }
118
+ /** Whether a non-expired session is available without hitting the network. */
119
+ async isAuthenticated() {
120
+ const tokens = await this.currentTokens();
121
+ return tokens != null && !this.isExpired(tokens);
122
+ }
123
+ /**
124
+ * Forget the session locally and, if the server exposes a revocation
125
+ * endpoint, revoke the refresh token. Always clears local storage even if
126
+ * remote revocation fails.
127
+ */
128
+ async logout() {
129
+ const tokens = await this.currentTokens();
130
+ try {
131
+ if (tokens?.refreshToken) {
132
+ await this.oauthClient.revokeToken(tokens.refreshToken, "refresh_token");
133
+ }
134
+ }
135
+ finally {
136
+ await this.tokenStore.clear();
137
+ this.session = null;
138
+ this.oauthOpenAIClient = null;
139
+ this.cachedForToken = null;
140
+ }
141
+ }
142
+ /**
143
+ * Return a valid access token, refreshing if expired. Throws
144
+ * `SessionExpiredError`/`NotAuthenticatedError` when re-login is required.
145
+ */
146
+ async getAccessToken() {
147
+ const tokens = await this.ensureValidSession();
148
+ return tokens.accessToken;
149
+ }
150
+ // --- Token plumbing -----------------------------------------------------
151
+ async currentTokens() {
152
+ if (!this.session) {
153
+ this.session = await this.tokenStore.load();
154
+ }
155
+ return this.session;
156
+ }
157
+ isExpired(tokens) {
158
+ if (tokens.expiresAt == null)
159
+ return false;
160
+ return this.clock.now() >= tokens.expiresAt - this.expirySkewMs;
161
+ }
162
+ async ensureValidSession() {
163
+ const tokens = await this.currentTokens();
164
+ if (!tokens) {
165
+ throw new NotAuthenticatedError();
166
+ }
167
+ if (!this.isExpired(tokens)) {
168
+ return tokens;
169
+ }
170
+ return this.refresh();
171
+ }
172
+ /** Refresh the access token (single-flight). */
173
+ async refresh() {
174
+ if (this.refreshInFlight)
175
+ return this.refreshInFlight;
176
+ this.refreshInFlight = this.doRefresh().finally(() => {
177
+ this.refreshInFlight = null;
178
+ });
179
+ return this.refreshInFlight;
180
+ }
181
+ async doRefresh() {
182
+ const current = await this.currentTokens();
183
+ const refreshToken = current?.refreshToken;
184
+ if (!refreshToken) {
185
+ // Nothing to refresh with — the session is effectively over.
186
+ await this.invalidate();
187
+ throw new SessionExpiredError("No refresh token available; re-authentication required");
188
+ }
189
+ let next;
190
+ try {
191
+ next = await this.oauthClient.refreshAccessToken(refreshToken);
192
+ }
193
+ catch (err) {
194
+ // A rejected or revoked refresh token means the local session is dead.
195
+ if (err instanceof InvalidRefreshTokenError ||
196
+ err instanceof CredentialsRevokedError) {
197
+ await this.invalidate();
198
+ }
199
+ throw err;
200
+ }
201
+ // Providers may omit a rotated refresh token; keep the previous one.
202
+ const merged = next.refreshToken
203
+ ? next
204
+ : { ...next, refreshToken };
205
+ await this.applyTokens(merged);
206
+ return merged;
207
+ }
208
+ async applyTokens(tokens) {
209
+ await this.tokenStore.save(tokens);
210
+ this.session = tokens;
211
+ // Invalidate the cached SDK client so the next call rebinds the new bearer.
212
+ if (this.cachedForToken !== tokens.accessToken) {
213
+ this.oauthOpenAIClient = null;
214
+ this.cachedForToken = null;
215
+ }
216
+ }
217
+ async invalidate() {
218
+ await this.tokenStore.clear();
219
+ this.session = null;
220
+ this.oauthOpenAIClient = null;
221
+ this.cachedForToken = null;
222
+ }
223
+ // --- OpenAIProvider overrides ------------------------------------------
224
+ /** Build (and cache) an OpenAI SDK client bound to the current access token. */
225
+ getClient() {
226
+ const token = this.session?.accessToken;
227
+ if (!token) {
228
+ throw new NotAuthenticatedError("No active OAuth session; call login() first");
229
+ }
230
+ if (!this.oauthOpenAIClient || this.cachedForToken !== token) {
231
+ this.oauthOpenAIClient = this.openAIClientFactory(token);
232
+ this.cachedForToken = token;
233
+ }
234
+ return this.oauthOpenAIClient;
235
+ }
236
+ /**
237
+ * The OAuth bearer is short-lived and must never be baked into a container's
238
+ * environment as if it were a durable API key. Code runners that need OpenAI
239
+ * access should refresh through the provider instead.
240
+ */
241
+ getContainerEnv() {
242
+ return {};
243
+ }
244
+ async getAvailableLanguageModels() {
245
+ const token = await this.getAccessToken();
246
+ const response = await fetch("https://api.openai.com/v1/models", {
247
+ headers: { Authorization: `Bearer ${token}` }
248
+ });
249
+ if (!response.ok)
250
+ return [];
251
+ const payload = (await response.json());
252
+ return (payload.data ?? [])
253
+ .filter((row) => typeof row.id === "string" && row.id.length > 0)
254
+ .map((row) => ({ id: row.id, name: row.id, provider: "openai" }));
255
+ }
256
+ async generateMessage(args) {
257
+ await this.ensureValidSession();
258
+ return super.generateMessage(args);
259
+ }
260
+ async *generateMessages(args) {
261
+ await this.ensureValidSession();
262
+ yield* super.generateMessages(args);
263
+ }
264
+ }
265
+ //# sourceMappingURL=openai-oauth-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-oauth-provider.js","sourceRoot":"","sources":["../../../src/providers/oauth/openai-oauth-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * PKCE (RFC 7636) and CSRF-state generation.
3
+ *
4
+ * Pure crypto with no I/O and no shared state. The randomness source is
5
+ * injectable so tests can assert exact verifier/challenge derivations, but the
6
+ * default uses the platform CSPRNG (`node:crypto`).
7
+ */
8
+ import type { PkcePair } from "./types.js";
9
+ /** Abstraction over a cryptographically-secure byte source. */
10
+ export interface RandomSource {
11
+ /** Resolve to `size` random bytes. */
12
+ randomBytes(size: number): Promise<Uint8Array>;
13
+ }
14
+ /** Default CSPRNG backed by `node:crypto.randomBytes`. */
15
+ export declare const nodeRandomSource: RandomSource;
16
+ interface PKCEHelperOptions {
17
+ /** Injected randomness; defaults to the platform CSPRNG. */
18
+ readonly random?: RandomSource;
19
+ /** Verifier entropy in bytes. RFC 7636 allows 43–128 chars; 32 bytes → 43. */
20
+ readonly verifierBytes?: number;
21
+ /** CSRF state entropy in bytes. */
22
+ readonly stateBytes?: number;
23
+ }
24
+ /**
25
+ * Generates PKCE verifiers/challenges and CSRF state values. All methods are
26
+ * async to keep a uniform, non-blocking API even though hashing is synchronous.
27
+ */
28
+ export declare class PKCEHelper {
29
+ private readonly random;
30
+ private readonly verifierBytes;
31
+ private readonly stateBytes;
32
+ constructor(options?: PKCEHelperOptions);
33
+ /** Generate a high-entropy `code_verifier`. */
34
+ createCodeVerifier(): Promise<string>;
35
+ /** Derive `code_challenge = BASE64URL(SHA-256(verifier))`. */
36
+ createCodeChallenge(verifier: string): Promise<string>;
37
+ /** Generate an opaque CSRF `state` token. */
38
+ createState(): Promise<string>;
39
+ /** Convenience: produce a full verifier + challenge pair in one call. */
40
+ createPkcePair(): Promise<PkcePair>;
41
+ }
42
+ export {};
43
+ //# sourceMappingURL=pkce-helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce-helper.d.ts","sourceRoot":"","sources":["../../../src/providers/oauth/pkce-helper.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAuB,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEhE,+DAA+D;AAC/D,MAAM,WAAW,YAAY;IAC3B,sCAAsC;IACtC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAChD;AAED,0DAA0D;AAC1D,eAAO,MAAM,gBAAgB,EAAE,YAK9B,CAAC;AAWF,UAAU,iBAAiB;IACzB,4DAA4D;IAC5D,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAC/B,8EAA8E;IAC9E,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,mCAAmC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;GAGG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,YAAY,OAAO,GAAE,iBAAsB,EAI1C;IAED,+CAA+C;IACzC,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAE1C;IAED,8DAA8D;IACxD,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG3D;IAED,6CAA6C;IACvC,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAEnC;IAED,yEAAyE;IACnE,cAAc,IAAI,OAAO,CAAC,QAAQ,CAAC,CAKxC;CACF"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * PKCE (RFC 7636) and CSRF-state generation.
3
+ *
4
+ * Pure crypto with no I/O and no shared state. The randomness source is
5
+ * injectable so tests can assert exact verifier/challenge derivations, but the
6
+ * default uses the platform CSPRNG (`node:crypto`).
7
+ */
8
+ import { createHash, randomBytes } from "node:crypto";
9
+ /** Default CSPRNG backed by `node:crypto.randomBytes`. */
10
+ export const nodeRandomSource = {
11
+ randomBytes: (size) => new Promise((resolve, reject) => {
12
+ randomBytes(size, (err, buf) => (err ? reject(err) : resolve(new Uint8Array(buf))));
13
+ })
14
+ };
15
+ /** RFC 4648 §5 base64url, no padding. */
16
+ function base64UrlEncode(bytes) {
17
+ return Buffer.from(bytes)
18
+ .toString("base64")
19
+ .replace(/\+/g, "-")
20
+ .replace(/\//g, "_")
21
+ .replace(/=+$/, "");
22
+ }
23
+ /**
24
+ * Generates PKCE verifiers/challenges and CSRF state values. All methods are
25
+ * async to keep a uniform, non-blocking API even though hashing is synchronous.
26
+ */
27
+ export class PKCEHelper {
28
+ random;
29
+ verifierBytes;
30
+ stateBytes;
31
+ constructor(options = {}) {
32
+ this.random = options.random ?? nodeRandomSource;
33
+ this.verifierBytes = options.verifierBytes ?? 32;
34
+ this.stateBytes = options.stateBytes ?? 32;
35
+ }
36
+ /** Generate a high-entropy `code_verifier`. */
37
+ async createCodeVerifier() {
38
+ return base64UrlEncode(await this.random.randomBytes(this.verifierBytes));
39
+ }
40
+ /** Derive `code_challenge = BASE64URL(SHA-256(verifier))`. */
41
+ async createCodeChallenge(verifier) {
42
+ const digest = createHash("sha256").update(verifier, "ascii").digest();
43
+ return base64UrlEncode(new Uint8Array(digest));
44
+ }
45
+ /** Generate an opaque CSRF `state` token. */
46
+ async createState() {
47
+ return base64UrlEncode(await this.random.randomBytes(this.stateBytes));
48
+ }
49
+ /** Convenience: produce a full verifier + challenge pair in one call. */
50
+ async createPkcePair() {
51
+ const verifier = await this.createCodeVerifier();
52
+ const challenge = await this.createCodeChallenge(verifier);
53
+ const method = "S256";
54
+ return { verifier, challenge, method };
55
+ }
56
+ }
57
+ //# sourceMappingURL=pkce-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce-helper.js","sourceRoot":"","sources":["../../../src/providers/oauth/pkce-helper.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAStD,0DAA0D;AAC1D,MAAM,CAAC,MAAM,gBAAgB,GAAiB;IAC5C,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CACpB,IAAI,OAAO,CAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,WAAW,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,CAAC,CAAC;CACL,CAAC;AAEF,yCAAyC;AACzC,SAAS,eAAe,CAAC,KAAiB;IACxC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;SACtB,QAAQ,CAAC,QAAQ,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACxB,CAAC;AAWD;;;GAGG;AACH,MAAM,OAAO,UAAU;IACJ,MAAM,CAAe;IACrB,aAAa,CAAS;IACtB,UAAU,CAAS;IAEpC,YAAY,OAAO,GAAsB,EAAE;QACzC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,gBAAgB,CAAC;QACjD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;QACjD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;IAC7C,CAAC;IAED,+CAA+C;IAC/C,KAAK,CAAC,kBAAkB;QACtB,OAAO,eAAe,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,mBAAmB,CAAC,QAAgB;QACxC,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;QACvE,OAAO,eAAe,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,6CAA6C;IAC7C,KAAK,CAAC,WAAW;QACf,OAAO,eAAe,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,yEAAyE;IACzE,KAAK,CAAC,cAAc;QAClB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACjD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAwB,MAAM,CAAC;QAC3C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IACzC,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Redaction helpers. The single rule of this subsystem: secrets never reach a
3
+ * log sink, an error message, or a thrown payload in cleartext. Anything that
4
+ * might carry token material is funnelled through here first.
5
+ */
6
+ /**
7
+ * Redact a single secret string for diagnostics: keep a short, non-reversible
8
+ * prefix so two different tokens are distinguishable in logs, hide the rest.
9
+ * An empty/short value collapses entirely to `<redacted>`.
10
+ */
11
+ export declare function redactToken(value: string | null | undefined): string;
12
+ /**
13
+ * Deep-clone an arbitrary value with all sensitive fields replaced by
14
+ * `<redacted>`. Safe to pass straight into a logger. Cycles are broken with a
15
+ * `[Circular]` marker so logging can never throw.
16
+ */
17
+ /** A value with every sensitive field replaced — safe to hand to a logger. */
18
+ export type RedactedValue = string | number | boolean | null | undefined | RedactedValue[] | {
19
+ [key: string]: RedactedValue;
20
+ };
21
+ export declare function redactObject(input: unknown, seen?: WeakSet<object>): RedactedValue;
22
+ //# sourceMappingURL=redaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.d.ts","sourceRoot":"","sources":["../../../src/providers/oauth/redaction.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAsBH;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAIpE;AAED;;;;GAIG;AACH,8EAA8E;AAC9E,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,SAAS,GACT,aAAa,EAAE,GACf;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAAA;CAAE,CAAC;AAErC,wBAAgB,YAAY,CAC1B,KAAK,EAAE,OAAO,EACd,IAAI,kBAAwB,GAC3B,aAAa,CAwBf"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Redaction helpers. The single rule of this subsystem: secrets never reach a
3
+ * log sink, an error message, or a thrown payload in cleartext. Anything that
4
+ * might carry token material is funnelled through here first.
5
+ */
6
+ import { isObjectLike } from "@nodetool-ai/protocol";
7
+ const REDACTED = "<redacted>";
8
+ /** Keys whose values are always scrubbed, regardless of nesting depth. */
9
+ const SENSITIVE_KEYS = new Set([
10
+ "access_token",
11
+ "accesstoken",
12
+ "refresh_token",
13
+ "refreshtoken",
14
+ "code",
15
+ "code_verifier",
16
+ "codeverifier",
17
+ "client_secret",
18
+ "clientsecret",
19
+ "authorization",
20
+ "id_token",
21
+ "idtoken"
22
+ ]);
23
+ /**
24
+ * Redact a single secret string for diagnostics: keep a short, non-reversible
25
+ * prefix so two different tokens are distinguishable in logs, hide the rest.
26
+ * An empty/short value collapses entirely to `<redacted>`.
27
+ */
28
+ export function redactToken(value) {
29
+ if (!value)
30
+ return REDACTED;
31
+ if (value.length <= 8)
32
+ return REDACTED;
33
+ return `${value.slice(0, 4)}…${REDACTED}`;
34
+ }
35
+ export function redactObject(input, seen = new WeakSet()) {
36
+ if (!isObjectLike(input)) {
37
+ // SAFETY: a non-object carries no fields to redact and goes to the logger
38
+ // as it stands.
39
+ return input;
40
+ }
41
+ if (seen.has(input)) {
42
+ return "[Circular]";
43
+ }
44
+ seen.add(input);
45
+ if (Array.isArray(input)) {
46
+ return input.map((item) => redactObject(item, seen));
47
+ }
48
+ const out = {};
49
+ for (const [key, val] of Object.entries(input)) {
50
+ if (SENSITIVE_KEYS.has(key.toLowerCase())) {
51
+ out[key] = REDACTED;
52
+ }
53
+ else {
54
+ out[key] = redactObject(val, seen);
55
+ }
56
+ }
57
+ return out;
58
+ }
59
+ //# sourceMappingURL=redaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.js","sourceRoot":"","sources":["../../../src/providers/oauth/redaction.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,QAAQ,GAAG,YAAY,CAAC;AAE9B,0EAA0E;AAC1E,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,cAAc;IACd,aAAa;IACb,eAAe;IACf,cAAc;IACd,MAAM;IACN,eAAe;IACf,cAAc;IACd,eAAe;IACf,cAAc;IACd,eAAe;IACf,UAAU;IACV,SAAS;CACV,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,KAAgC;IAC1D,IAAI,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAC;IAC5B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IACvC,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC;AAC5C,CAAC;AAiBD,MAAM,UAAU,YAAY,CAC1B,KAAc,EACd,IAAI,GAAG,IAAI,OAAO,EAAU;IAE5B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,0EAA0E;QAC1E,gBAAgB;QAChB,OAAO,KAAsB,CAAC;IAChC,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAEhB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,GAAG,GAAqC,EAAE,CAAC;IACjD,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;QAC1E,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC1C,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * SecureCredentialStore — the lowest storage layer.
3
+ *
4
+ * A minimal named-secret key/value abstraction. It knows nothing about OAuth,
5
+ * tokens, or providers; it only persists opaque strings under string keys.
6
+ * Higher layers (`TokenStore`) compose it. This separation is what lets the
7
+ * token logic be unit-tested against an in-memory backend while production
8
+ * persists into the OS credential store.
9
+ */
10
+ import type { Logger } from "@nodetool-ai/config";
11
+ /** Persist opaque secret strings. All operations are async. */
12
+ export interface SecureCredentialStore {
13
+ /** Return the stored value for `key`, or null if absent. */
14
+ get(key: string): Promise<string | null>;
15
+ /** Create or overwrite the value for `key`. */
16
+ set(key: string, value: string): Promise<void>;
17
+ /** Remove `key`. Resolves whether or not it existed. */
18
+ delete(key: string): Promise<void>;
19
+ }
20
+ /**
21
+ * The subset of the `keytar` native module we depend on. Declared locally so we
22
+ * neither hard-depend on the package at build time nor pull its prebuilt binary
23
+ * into bundles that never authenticate.
24
+ */
25
+ export interface KeyringBackend {
26
+ getPassword(service: string, account: string): Promise<string | null>;
27
+ setPassword(service: string, account: string, password: string): Promise<void>;
28
+ deletePassword(service: string, account: string): Promise<boolean>;
29
+ }
30
+ interface KeychainCredentialStoreOptions {
31
+ /** Keychain service namespace. */
32
+ readonly service?: string;
33
+ /** Inject a backend (tests / custom keyrings). Defaults to lazy `keytar`. */
34
+ readonly backend?: KeyringBackend;
35
+ readonly logger?: Logger;
36
+ }
37
+ /**
38
+ * SecureCredentialStore backed by the operating-system credential store
39
+ * (macOS Keychain, Windows Credential Manager, Linux Secret Service) via
40
+ * `keytar`. The OS layer provides at-rest encryption, satisfying the
41
+ * "refresh tokens encrypted by the OS credential store" requirement. The
42
+ * native module is loaded lazily so importing this file never forces the
43
+ * binary to resolve.
44
+ */
45
+ export declare class KeychainSecureCredentialStore implements SecureCredentialStore {
46
+ private readonly service;
47
+ private readonly injectedBackend?;
48
+ private readonly logger?;
49
+ private backendPromise?;
50
+ constructor(options?: KeychainCredentialStoreOptions);
51
+ private backend;
52
+ get(key: string): Promise<string | null>;
53
+ set(key: string, value: string): Promise<void>;
54
+ delete(key: string): Promise<void>;
55
+ }
56
+ /**
57
+ * In-memory SecureCredentialStore for tests and ephemeral sessions. Holds
58
+ * secrets only for the lifetime of the instance — never touches disk.
59
+ */
60
+ export declare class InMemorySecureCredentialStore implements SecureCredentialStore {
61
+ private readonly map;
62
+ get(key: string): Promise<string | null>;
63
+ set(key: string, value: string): Promise<void>;
64
+ delete(key: string): Promise<void>;
65
+ }
66
+ export {};
67
+ //# sourceMappingURL=secure-credential-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secure-credential-store.d.ts","sourceRoot":"","sources":["../../../src/providers/oauth/secure-credential-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,+DAA+D;AAC/D,MAAM,WAAW,qBAAqB;IACpC,4DAA4D;IAC5D,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,+CAA+C;IAC/C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,wDAAwD;IACxD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACtE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/E,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACpE;AAED,UAAU,8BAA8B;IACtC,kCAAkC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,qBAAa,6BAA8B,YAAW,qBAAqB;IACzE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAiB;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;IACjC,OAAO,CAAC,cAAc,CAAC,CAA0B;IAEjD,YAAY,OAAO,GAAE,8BAAmC,EAIvD;YAEa,OAAO;IAcf,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAG7C;IAEK,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKnD;IAEK,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIvC;CACF;AAED;;;GAGG;AACH,qBAAa,6BAA8B,YAAW,qBAAqB;IACzE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAE3C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE7C;IAEK,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnD;IAEK,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvC;CACF"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * SecureCredentialStore — the lowest storage layer.
3
+ *
4
+ * A minimal named-secret key/value abstraction. It knows nothing about OAuth,
5
+ * tokens, or providers; it only persists opaque strings under string keys.
6
+ * Higher layers (`TokenStore`) compose it. This separation is what lets the
7
+ * token logic be unit-tested against an in-memory backend while production
8
+ * persists into the OS credential store.
9
+ */
10
+ import { importHidden } from "@nodetool-ai/config";
11
+ /**
12
+ * SecureCredentialStore backed by the operating-system credential store
13
+ * (macOS Keychain, Windows Credential Manager, Linux Secret Service) via
14
+ * `keytar`. The OS layer provides at-rest encryption, satisfying the
15
+ * "refresh tokens encrypted by the OS credential store" requirement. The
16
+ * native module is loaded lazily so importing this file never forces the
17
+ * binary to resolve.
18
+ */
19
+ export class KeychainSecureCredentialStore {
20
+ service;
21
+ injectedBackend;
22
+ logger;
23
+ backendPromise;
24
+ constructor(options = {}) {
25
+ this.service = options.service ?? "nodetool-oauth";
26
+ this.injectedBackend = options.backend;
27
+ this.logger = options.logger;
28
+ }
29
+ async backend() {
30
+ if (this.injectedBackend)
31
+ return this.injectedBackend;
32
+ this.backendPromise ??= (async () => {
33
+ const mod = await importHidden("keytar");
34
+ if (!mod) {
35
+ throw new Error("Secure credential storage requires the 'keytar' native module, which is unavailable in this runtime");
36
+ }
37
+ return mod.default ?? mod;
38
+ })();
39
+ return this.backendPromise;
40
+ }
41
+ async get(key) {
42
+ const backend = await this.backend();
43
+ return backend.getPassword(this.service, key);
44
+ }
45
+ async set(key, value) {
46
+ const backend = await this.backend();
47
+ await backend.setPassword(this.service, key, value);
48
+ // Note: `key` is an account label, never a secret; `value` is never logged.
49
+ this.logger?.debug("Stored credential in OS keychain", { service: this.service, key });
50
+ }
51
+ async delete(key) {
52
+ const backend = await this.backend();
53
+ await backend.deletePassword(this.service, key);
54
+ this.logger?.debug("Deleted credential from OS keychain", { service: this.service, key });
55
+ }
56
+ }
57
+ /**
58
+ * In-memory SecureCredentialStore for tests and ephemeral sessions. Holds
59
+ * secrets only for the lifetime of the instance — never touches disk.
60
+ */
61
+ export class InMemorySecureCredentialStore {
62
+ map = new Map();
63
+ async get(key) {
64
+ return this.map.has(key) ? this.map.get(key) : null;
65
+ }
66
+ async set(key, value) {
67
+ this.map.set(key, value);
68
+ }
69
+ async delete(key) {
70
+ this.map.delete(key);
71
+ }
72
+ }
73
+ //# sourceMappingURL=secure-credential-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secure-credential-store.js","sourceRoot":"","sources":["../../../src/providers/oauth/secure-credential-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAgCnD;;;;;;;GAOG;AACH,MAAM,OAAO,6BAA6B;IACvB,OAAO,CAAS;IAChB,eAAe,CAAkB;IACjC,MAAM,CAAU;IACzB,cAAc,CAA2B;IAEjD,YAAY,OAAO,GAAmC,EAAE;QACtD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,gBAAgB,CAAC;QACnD,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,IAAI,IAAI,CAAC,eAAe;YAAE,OAAO,IAAI,CAAC,eAAe,CAAC;QACtD,IAAI,CAAC,cAAc,KAAK,CAAC,KAAK,IAAI,EAAE;YAClC,MAAM,GAAG,GAAG,MAAM,YAAY,CAA+C,QAAQ,CAAC,CAAC;YACvF,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,MAAM,IAAI,KAAK,CACb,qGAAqG,CACtG,CAAC;YACJ,CAAC;YACD,OAAQ,GAAoC,CAAC,OAAO,IAAK,GAAsB,CAAC;QAClF,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrC,OAAO,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa;QAClC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACpD,4EAA4E;QAC5E,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,kCAAkC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,qCAAqC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5F,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,6BAA6B;IACvB,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEjD,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAY,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa;QAClC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;CACF"}