@vybestack/llxprt-code-core 0.1.18-nightly.250807.306d1939 → 0.1.18-nightly.250811.b0db22c6

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 (323) hide show
  1. package/README.md +1 -0
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.js +3 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/auth/auth-integration.spec.d.ts +6 -0
  6. package/dist/src/auth/auth-integration.spec.js +384 -0
  7. package/dist/src/auth/auth-integration.spec.js.map +1 -0
  8. package/dist/src/auth/precedence.d.ts +55 -0
  9. package/dist/src/auth/precedence.js +211 -0
  10. package/dist/src/auth/precedence.js.map +1 -0
  11. package/dist/src/auth/precedence.test.d.ts +6 -0
  12. package/dist/src/auth/precedence.test.js +374 -0
  13. package/dist/src/auth/precedence.test.js.map +1 -0
  14. package/dist/src/auth/qwen-device-flow.d.ts +45 -0
  15. package/dist/src/auth/qwen-device-flow.js +179 -0
  16. package/dist/src/auth/qwen-device-flow.js.map +1 -0
  17. package/dist/src/auth/qwen-device-flow.spec.d.ts +6 -0
  18. package/dist/src/auth/qwen-device-flow.spec.js +793 -0
  19. package/dist/src/auth/qwen-device-flow.spec.js.map +1 -0
  20. package/dist/src/auth/token-store.d.ts +66 -0
  21. package/dist/src/auth/token-store.js +147 -0
  22. package/dist/src/auth/token-store.js.map +1 -0
  23. package/dist/src/auth/token-store.spec.d.ts +6 -0
  24. package/dist/src/auth/token-store.spec.js +405 -0
  25. package/dist/src/auth/token-store.spec.js.map +1 -0
  26. package/dist/src/auth/types.d.ts +130 -0
  27. package/dist/src/auth/types.js +60 -0
  28. package/dist/src/auth/types.js.map +1 -0
  29. package/dist/src/code_assist/converter.d.ts +2 -1
  30. package/dist/src/code_assist/converter.js +1 -1
  31. package/dist/src/code_assist/converter.js.map +1 -1
  32. package/dist/src/code_assist/converter.test.js +48 -1
  33. package/dist/src/code_assist/converter.test.js.map +1 -1
  34. package/dist/src/code_assist/oauth2.js +2 -1
  35. package/dist/src/code_assist/oauth2.js.map +1 -1
  36. package/dist/src/code_assist/server.test.js +4 -1
  37. package/dist/src/code_assist/server.test.js.map +1 -1
  38. package/dist/src/config/config.alwaysAllow.test.d.ts +6 -0
  39. package/dist/src/config/config.alwaysAllow.test.js +84 -0
  40. package/dist/src/config/config.alwaysAllow.test.js.map +1 -0
  41. package/dist/src/config/config.d.ts +80 -1
  42. package/dist/src/config/config.ephemeral.test.d.ts +6 -0
  43. package/dist/src/config/config.ephemeral.test.js +152 -0
  44. package/dist/src/config/config.ephemeral.test.js.map +1 -0
  45. package/dist/src/config/config.js +135 -0
  46. package/dist/src/config/config.js.map +1 -1
  47. package/dist/src/config/config.test.js +8 -0
  48. package/dist/src/config/config.test.js.map +1 -1
  49. package/dist/src/config/endpoints.d.ts +60 -0
  50. package/dist/src/config/endpoints.js +126 -0
  51. package/dist/src/config/endpoints.js.map +1 -0
  52. package/dist/src/config/endpoints.test.d.ts +6 -0
  53. package/dist/src/config/endpoints.test.js +196 -0
  54. package/dist/src/config/endpoints.test.js.map +1 -0
  55. package/dist/src/core/client.d.ts +0 -2
  56. package/dist/src/core/client.js +19 -97
  57. package/dist/src/core/client.js.map +1 -1
  58. package/dist/src/core/client.test.js +13 -7
  59. package/dist/src/core/client.test.js.map +1 -1
  60. package/dist/src/core/contentGenerator.d.ts +3 -1
  61. package/dist/src/core/contentGenerator.js +3 -1
  62. package/dist/src/core/contentGenerator.js.map +1 -1
  63. package/dist/src/core/coreToolScheduler.d.ts +17 -7
  64. package/dist/src/core/coreToolScheduler.js +121 -18
  65. package/dist/src/core/coreToolScheduler.js.map +1 -1
  66. package/dist/src/core/coreToolScheduler.test.js +25 -37
  67. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  68. package/dist/src/core/geminiChat.d.ts +3 -0
  69. package/dist/src/core/geminiChat.js +17 -13
  70. package/dist/src/core/geminiChat.js.map +1 -1
  71. package/dist/src/core/logger.d.ts +1 -0
  72. package/dist/src/core/logger.js +18 -0
  73. package/dist/src/core/logger.js.map +1 -1
  74. package/dist/src/core/logger.test.js +29 -0
  75. package/dist/src/core/logger.test.js.map +1 -1
  76. package/dist/src/core/loggingContentGenerator.d.ts +24 -0
  77. package/dist/src/core/loggingContentGenerator.js +89 -0
  78. package/dist/src/core/loggingContentGenerator.js.map +1 -0
  79. package/dist/src/core/nonInteractiveToolExecutor.js +21 -1
  80. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
  81. package/dist/src/core/nonInteractiveToolExecutor.test.js +8 -31
  82. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  83. package/dist/src/core/subagent.d.ts +230 -0
  84. package/dist/src/core/subagent.js +455 -0
  85. package/dist/src/core/subagent.js.map +1 -0
  86. package/dist/src/core/subagent.test.d.ts +6 -0
  87. package/dist/src/core/subagent.test.js +510 -0
  88. package/dist/src/core/subagent.test.js.map +1 -0
  89. package/dist/src/hooks/tool-render-suppression-hook.d.ts +16 -0
  90. package/dist/src/hooks/tool-render-suppression-hook.js +26 -0
  91. package/dist/src/hooks/tool-render-suppression-hook.js.map +1 -0
  92. package/dist/src/hooks/tool-render-suppression-hook.test.d.ts +6 -0
  93. package/dist/src/hooks/tool-render-suppression-hook.test.js +59 -0
  94. package/dist/src/hooks/tool-render-suppression-hook.test.js.map +1 -0
  95. package/dist/src/ide/ide-client.d.ts +22 -1
  96. package/dist/src/ide/ide-client.js +161 -17
  97. package/dist/src/ide/ide-client.js.map +1 -1
  98. package/dist/src/ide/ideContext.d.ts +127 -32
  99. package/dist/src/ide/ideContext.js +45 -0
  100. package/dist/src/ide/ideContext.js.map +1 -1
  101. package/dist/src/index.d.ts +8 -0
  102. package/dist/src/index.js +10 -0
  103. package/dist/src/index.js.map +1 -1
  104. package/dist/src/integration-tests/oauth-integration.spec.d.ts +6 -0
  105. package/dist/src/integration-tests/oauth-integration.spec.js +518 -0
  106. package/dist/src/integration-tests/oauth-integration.spec.js.map +1 -0
  107. package/dist/src/integration-tests/oauth-simple-test.spec.d.ts +1 -0
  108. package/dist/src/integration-tests/oauth-simple-test.spec.js +88 -0
  109. package/dist/src/integration-tests/oauth-simple-test.spec.js.map +1 -0
  110. package/dist/src/integration-tests/todo-system.test.js +38 -602
  111. package/dist/src/integration-tests/todo-system.test.js.map +1 -1
  112. package/dist/src/providers/BaseProvider.d.ts +98 -0
  113. package/dist/src/providers/BaseProvider.js +180 -0
  114. package/dist/src/providers/BaseProvider.js.map +1 -0
  115. package/dist/src/providers/BaseProvider.test.d.ts +6 -0
  116. package/dist/src/providers/BaseProvider.test.js +472 -0
  117. package/dist/src/providers/BaseProvider.test.js.map +1 -0
  118. package/dist/src/providers/IProviderManager.d.ts +5 -0
  119. package/dist/src/providers/LoggingProviderWrapper.d.ts +53 -0
  120. package/dist/src/providers/LoggingProviderWrapper.js +347 -0
  121. package/dist/src/providers/LoggingProviderWrapper.js.map +1 -0
  122. package/dist/src/providers/ProviderManager.d.ts +20 -0
  123. package/dist/src/providers/ProviderManager.js +214 -1
  124. package/dist/src/providers/ProviderManager.js.map +1 -1
  125. package/dist/src/providers/gemini/GeminiProvider.d.ts +12 -7
  126. package/dist/src/providers/gemini/GeminiProvider.js +135 -152
  127. package/dist/src/providers/gemini/GeminiProvider.js.map +1 -1
  128. package/dist/src/providers/integration/multi-provider.integration.test.js +18 -2
  129. package/dist/src/providers/integration/multi-provider.integration.test.js.map +1 -1
  130. package/dist/src/providers/logging/ProviderContentExtractor.d.ts +27 -0
  131. package/dist/src/providers/logging/ProviderContentExtractor.js +198 -0
  132. package/dist/src/providers/logging/ProviderContentExtractor.js.map +1 -0
  133. package/dist/src/providers/logging/ProviderPerformanceTracker.d.ts +43 -0
  134. package/dist/src/providers/logging/ProviderPerformanceTracker.js +98 -0
  135. package/dist/src/providers/logging/ProviderPerformanceTracker.js.map +1 -0
  136. package/dist/src/providers/openai/OpenAIProvider.d.ts +21 -6
  137. package/dist/src/providers/openai/OpenAIProvider.js +180 -27
  138. package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
  139. package/dist/src/providers/openai/OpenAIProvider.test.js +109 -2
  140. package/dist/src/providers/openai/OpenAIProvider.test.js.map +1 -1
  141. package/dist/src/providers/openai/openai-oauth.spec.d.ts +16 -0
  142. package/dist/src/providers/openai/openai-oauth.spec.js +544 -0
  143. package/dist/src/providers/openai/openai-oauth.spec.js.map +1 -0
  144. package/dist/src/providers/types/IProviderConfig.d.ts +5 -0
  145. package/dist/src/providers/types.d.ts +47 -0
  146. package/dist/src/services/git-stats-service.d.ts +32 -0
  147. package/dist/src/services/git-stats-service.js +22 -0
  148. package/dist/src/services/git-stats-service.js.map +1 -0
  149. package/dist/src/services/loopDetectionService.js +10 -6
  150. package/dist/src/services/loopDetectionService.js.map +1 -1
  151. package/dist/src/services/loopDetectionService.test.js +139 -0
  152. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  153. package/dist/src/services/shellExecutionService.js +69 -9
  154. package/dist/src/services/shellExecutionService.js.map +1 -1
  155. package/dist/src/services/shellExecutionService.test.js +8 -0
  156. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  157. package/dist/src/services/todo-context-tracker.d.ts +31 -0
  158. package/dist/src/services/todo-context-tracker.js +45 -0
  159. package/dist/src/services/todo-context-tracker.js.map +1 -0
  160. package/dist/src/services/tool-call-tracker-service.d.ts +52 -0
  161. package/dist/src/services/tool-call-tracker-service.js +170 -0
  162. package/dist/src/services/tool-call-tracker-service.js.map +1 -0
  163. package/dist/src/services/tool-call-tracker-service.test.d.ts +6 -0
  164. package/dist/src/services/tool-call-tracker-service.test.js +99 -0
  165. package/dist/src/services/tool-call-tracker-service.test.js.map +1 -0
  166. package/dist/src/storage/ConversationFileWriter.d.ts +16 -0
  167. package/dist/src/storage/ConversationFileWriter.js +69 -0
  168. package/dist/src/storage/ConversationFileWriter.js.map +1 -0
  169. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +8 -0
  170. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +56 -3
  171. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  172. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +6 -0
  173. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +187 -0
  174. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -0
  175. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +5 -1
  176. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +11 -0
  177. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  178. package/dist/src/telemetry/constants.d.ts +5 -0
  179. package/dist/src/telemetry/constants.js +5 -0
  180. package/dist/src/telemetry/constants.js.map +1 -1
  181. package/dist/src/telemetry/loggers.d.ts +5 -1
  182. package/dist/src/telemetry/loggers.js +87 -1
  183. package/dist/src/telemetry/loggers.js.map +1 -1
  184. package/dist/src/telemetry/loggers.test.circular.js +7 -2
  185. package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
  186. package/dist/src/telemetry/loggers.test.js +7 -2
  187. package/dist/src/telemetry/loggers.test.js.map +1 -1
  188. package/dist/src/telemetry/metrics.d.ts +3 -2
  189. package/dist/src/telemetry/metrics.js +7 -1
  190. package/dist/src/telemetry/metrics.js.map +1 -1
  191. package/dist/src/telemetry/metrics.test.js +50 -0
  192. package/dist/src/telemetry/metrics.test.js.map +1 -1
  193. package/dist/src/telemetry/tool-call-decision.d.ts +13 -0
  194. package/dist/src/telemetry/tool-call-decision.js +29 -0
  195. package/dist/src/telemetry/tool-call-decision.js.map +1 -0
  196. package/dist/src/telemetry/types.d.ts +58 -2
  197. package/dist/src/telemetry/types.js +126 -1
  198. package/dist/src/telemetry/types.js.map +1 -1
  199. package/dist/src/telemetry/uiTelemetry.d.ts +4 -1
  200. package/dist/src/telemetry/uiTelemetry.js +3 -1
  201. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  202. package/dist/src/telemetry/uiTelemetry.test.js +13 -2
  203. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  204. package/dist/src/test-utils/tools.d.ts +23 -0
  205. package/dist/src/test-utils/tools.js +41 -0
  206. package/dist/src/test-utils/tools.js.map +1 -0
  207. package/dist/src/tools/diffOptions.d.ts +2 -0
  208. package/dist/src/tools/diffOptions.js +28 -0
  209. package/dist/src/tools/diffOptions.js.map +1 -1
  210. package/dist/src/tools/diffOptions.test.d.ts +6 -0
  211. package/dist/src/tools/diffOptions.test.js +119 -0
  212. package/dist/src/tools/diffOptions.test.js.map +1 -0
  213. package/dist/src/tools/edit.d.ts +9 -33
  214. package/dist/src/tools/edit.js +167 -132
  215. package/dist/src/tools/edit.js.map +1 -1
  216. package/dist/src/tools/edit.test.js +124 -50
  217. package/dist/src/tools/edit.test.js.map +1 -1
  218. package/dist/src/tools/glob.d.ts +3 -10
  219. package/dist/src/tools/glob.js +97 -99
  220. package/dist/src/tools/glob.js.map +1 -1
  221. package/dist/src/tools/glob.test.js +37 -26
  222. package/dist/src/tools/glob.test.js.map +1 -1
  223. package/dist/src/tools/grep.d.ts +3 -35
  224. package/dist/src/tools/grep.js +117 -88
  225. package/dist/src/tools/grep.js.map +1 -1
  226. package/dist/src/tools/grep.test.js +36 -22
  227. package/dist/src/tools/grep.test.js.map +1 -1
  228. package/dist/src/tools/mcp-client.d.ts +14 -3
  229. package/dist/src/tools/mcp-client.js +82 -6
  230. package/dist/src/tools/mcp-client.js.map +1 -1
  231. package/dist/src/tools/mcp-client.test.js +337 -2
  232. package/dist/src/tools/mcp-client.test.js.map +1 -1
  233. package/dist/src/tools/memoryTool.d.ts +2 -2
  234. package/dist/src/tools/memoryTool.js +1 -0
  235. package/dist/src/tools/memoryTool.js.map +1 -1
  236. package/dist/src/tools/modifiable-tool.d.ts +8 -5
  237. package/dist/src/tools/modifiable-tool.js +4 -1
  238. package/dist/src/tools/modifiable-tool.js.map +1 -1
  239. package/dist/src/tools/modifiable-tool.test.js +3 -3
  240. package/dist/src/tools/modifiable-tool.test.js.map +1 -1
  241. package/dist/src/tools/read-file.d.ts +4 -6
  242. package/dist/src/tools/read-file.js +87 -46
  243. package/dist/src/tools/read-file.js.map +1 -1
  244. package/dist/src/tools/read-file.test.js +207 -126
  245. package/dist/src/tools/read-file.test.js.map +1 -1
  246. package/dist/src/tools/read-many-files.js +8 -2
  247. package/dist/src/tools/read-many-files.js.map +1 -1
  248. package/dist/src/tools/read-many-files.test.js +16 -0
  249. package/dist/src/tools/read-many-files.test.js.map +1 -1
  250. package/dist/src/tools/shell.test.js +17 -0
  251. package/dist/src/tools/shell.test.js.map +1 -1
  252. package/dist/src/tools/todo-events.d.ts +22 -0
  253. package/dist/src/tools/todo-events.js +24 -0
  254. package/dist/src/tools/todo-events.js.map +1 -0
  255. package/dist/src/tools/todo-pause.d.ts +22 -0
  256. package/dist/src/tools/todo-pause.js +93 -0
  257. package/dist/src/tools/todo-pause.js.map +1 -0
  258. package/dist/src/tools/todo-pause.spec.d.ts +6 -0
  259. package/dist/src/tools/todo-pause.spec.js +287 -0
  260. package/dist/src/tools/todo-pause.spec.js.map +1 -0
  261. package/dist/src/tools/todo-read.js.map +1 -1
  262. package/dist/src/tools/todo-schemas.d.ts +232 -4
  263. package/dist/src/tools/todo-schemas.js +13 -0
  264. package/dist/src/tools/todo-schemas.js.map +1 -1
  265. package/dist/src/tools/todo-schemas.test.js +190 -1
  266. package/dist/src/tools/todo-schemas.test.js.map +1 -1
  267. package/dist/src/tools/todo-store.d.ts +1 -4
  268. package/dist/src/tools/todo-store.js +41 -40
  269. package/dist/src/tools/todo-store.js.map +1 -1
  270. package/dist/src/tools/todo-store.test.js +34 -40
  271. package/dist/src/tools/todo-store.test.js.map +1 -1
  272. package/dist/src/tools/todo-write.d.ts +1 -1
  273. package/dist/src/tools/todo-write.js +84 -47
  274. package/dist/src/tools/todo-write.js.map +1 -1
  275. package/dist/src/tools/todo-write.test.js +23 -9
  276. package/dist/src/tools/todo-write.test.js.map +1 -1
  277. package/dist/src/tools/tool-context.d.ts +2 -0
  278. package/dist/src/tools/tool-error.d.ts +4 -0
  279. package/dist/src/tools/tool-error.js +4 -0
  280. package/dist/src/tools/tool-error.js.map +1 -1
  281. package/dist/src/tools/tool-registry.d.ts +12 -6
  282. package/dist/src/tools/tool-registry.js +19 -4
  283. package/dist/src/tools/tool-registry.js.map +1 -1
  284. package/dist/src/tools/tool-registry.test.js +3 -20
  285. package/dist/src/tools/tool-registry.test.js.map +1 -1
  286. package/dist/src/tools/tools.d.ts +134 -39
  287. package/dist/src/tools/tools.js +115 -10
  288. package/dist/src/tools/tools.js.map +1 -1
  289. package/dist/src/tools/web-search.test.js +1 -0
  290. package/dist/src/tools/web-search.test.js.map +1 -1
  291. package/dist/src/tools/write-file.d.ts +6 -2
  292. package/dist/src/tools/write-file.js +106 -16
  293. package/dist/src/tools/write-file.js.map +1 -1
  294. package/dist/src/tools/write-file.test.js +25 -7
  295. package/dist/src/tools/write-file.test.js.map +1 -1
  296. package/dist/src/types/modelParams.d.ts +4 -0
  297. package/dist/src/utils/environmentContext.d.ts +21 -0
  298. package/dist/src/utils/environmentContext.js +90 -0
  299. package/dist/src/utils/environmentContext.js.map +1 -0
  300. package/dist/src/utils/environmentContext.test.d.ts +6 -0
  301. package/dist/src/utils/environmentContext.test.js +139 -0
  302. package/dist/src/utils/environmentContext.test.js.map +1 -0
  303. package/dist/src/utils/errors.d.ts +3 -0
  304. package/dist/src/utils/errors.js +6 -0
  305. package/dist/src/utils/errors.js.map +1 -1
  306. package/dist/src/utils/fileUtils.d.ts +7 -0
  307. package/dist/src/utils/fileUtils.js +11 -10
  308. package/dist/src/utils/fileUtils.js.map +1 -1
  309. package/dist/src/utils/fileUtils.test.js +1 -4
  310. package/dist/src/utils/fileUtils.test.js.map +1 -1
  311. package/dist/src/utils/filesearch/fileSearch.d.ts +1 -0
  312. package/dist/src/utils/filesearch/fileSearch.js +27 -5
  313. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  314. package/dist/src/utils/filesearch/fileSearch.test.js +21 -1
  315. package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
  316. package/dist/src/utils/memoryDiscovery.js +4 -1
  317. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  318. package/dist/src/utils/shell-utils.js +14 -2
  319. package/dist/src/utils/shell-utils.js.map +1 -1
  320. package/dist/src/utils/shell-utils.shellReplacement.test.d.ts +6 -0
  321. package/dist/src/utils/shell-utils.shellReplacement.test.js +149 -0
  322. package/dist/src/utils/shell-utils.shellReplacement.test.js.map +1 -0
  323. package/package.json +2 -1
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { DeviceCodeResponse, OAuthToken } from './types.js';
7
+ /**
8
+ * Configuration for Qwen device flow authentication
9
+ */
10
+ export interface DeviceFlowConfig {
11
+ clientId: string;
12
+ authorizationEndpoint: string;
13
+ tokenEndpoint: string;
14
+ scopes: string[];
15
+ }
16
+ /**
17
+ * Qwen OAuth device flow implementation
18
+ */
19
+ export declare class QwenDeviceFlow {
20
+ private config;
21
+ private pkceVerifier;
22
+ constructor(config: DeviceFlowConfig);
23
+ /**
24
+ * Initiates the device authorization flow
25
+ * @returns Promise resolving to device code response
26
+ */
27
+ initiateDeviceFlow(): Promise<DeviceCodeResponse>;
28
+ /**
29
+ * Polls the authorization server for an access token
30
+ * @param deviceCode Device code from initiation response
31
+ * @returns Promise resolving to OAuth token
32
+ */
33
+ pollForToken(deviceCode: string): Promise<OAuthToken>;
34
+ /**
35
+ * Refreshes an expired access token
36
+ * @param refreshToken Valid refresh token
37
+ * @returns Promise resolving to new OAuth token
38
+ */
39
+ refreshToken(refreshToken: string): Promise<OAuthToken>;
40
+ /**
41
+ * Generates PKCE code verifier and challenge
42
+ * @returns Object containing verifier and challenge strings
43
+ */
44
+ private generatePKCE;
45
+ }
@@ -0,0 +1,179 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { randomBytes, createHash } from 'crypto';
7
+ import { DeviceCodeResponseSchema, TokenResponseSchema, } from './types.js';
8
+ /**
9
+ * Qwen OAuth device flow implementation
10
+ */
11
+ export class QwenDeviceFlow {
12
+ config;
13
+ pkceVerifier = '';
14
+ constructor(config) {
15
+ this.config = config;
16
+ }
17
+ /**
18
+ * Initiates the device authorization flow
19
+ * @returns Promise resolving to device code response
20
+ */
21
+ async initiateDeviceFlow() {
22
+ // Generate PKCE parameters
23
+ const pkce = this.generatePKCE();
24
+ this.pkceVerifier = pkce.verifier;
25
+ // Prepare request parameters
26
+ const params = new URLSearchParams({
27
+ client_id: this.config.clientId,
28
+ code_challenge: pkce.challenge,
29
+ code_challenge_method: 'S256',
30
+ });
31
+ // Only add scope if it's not empty
32
+ if (this.config.scopes && this.config.scopes.length > 0) {
33
+ params.append('scope', this.config.scopes.join(' '));
34
+ }
35
+ // Make HTTP request
36
+ const response = await fetch(this.config.authorizationEndpoint, {
37
+ method: 'POST',
38
+ headers: {
39
+ 'Content-Type': 'application/x-www-form-urlencoded',
40
+ Accept: 'application/json',
41
+ },
42
+ body: params.toString(),
43
+ });
44
+ if (!response.ok) {
45
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
46
+ }
47
+ const data = await response.json();
48
+ // Validate response with Zod schema
49
+ const validatedResponse = DeviceCodeResponseSchema.parse(data);
50
+ return validatedResponse;
51
+ }
52
+ /**
53
+ * Polls the authorization server for an access token
54
+ * @param deviceCode Device code from initiation response
55
+ * @returns Promise resolving to OAuth token
56
+ */
57
+ async pollForToken(deviceCode) {
58
+ const maxDuration = 15 * 60 * 1000; // 15 minutes in milliseconds
59
+ const startTime = Date.now();
60
+ let interval = 5000; // Start with 5 seconds
61
+ while (Date.now() - startTime < maxDuration) {
62
+ const params = new URLSearchParams({
63
+ grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
64
+ device_code: deviceCode,
65
+ client_id: this.config.clientId,
66
+ code_verifier: this.pkceVerifier,
67
+ });
68
+ try {
69
+ const response = await fetch(this.config.tokenEndpoint, {
70
+ method: 'POST',
71
+ headers: {
72
+ 'Content-Type': 'application/x-www-form-urlencoded',
73
+ Accept: 'application/json',
74
+ },
75
+ body: params.toString(),
76
+ });
77
+ if (response.ok) {
78
+ const data = await response.json();
79
+ // Validate response with Zod schema
80
+ const validatedResponse = TokenResponseSchema.parse(data);
81
+ // Calculate expiry timestamp
82
+ const now = Math.floor(Date.now() / 1000);
83
+ const expiresIn = validatedResponse.expires_in || 3600; // Default to 1 hour if not provided
84
+ const expiry = now + expiresIn;
85
+ return {
86
+ access_token: validatedResponse.access_token,
87
+ token_type: 'Bearer',
88
+ expiry,
89
+ refresh_token: validatedResponse.refresh_token,
90
+ scope: validatedResponse.scope || undefined, // Convert null to undefined
91
+ resource_url: validatedResponse.resource_url, // Include the API endpoint from Qwen
92
+ };
93
+ }
94
+ // Handle error responses
95
+ const errorData = await response.json();
96
+ if (errorData.error === 'authorization_pending') {
97
+ // Continue polling - wait for the interval before next attempt
98
+ await new Promise((resolve) => setTimeout(resolve, interval));
99
+ continue;
100
+ }
101
+ else if (errorData.error === 'slow_down') {
102
+ // Increase polling interval by 5 seconds and continue
103
+ interval += 5000;
104
+ await new Promise((resolve) => setTimeout(resolve, interval));
105
+ continue;
106
+ }
107
+ else if (errorData.error === 'access_denied') {
108
+ throw new Error('access_denied');
109
+ }
110
+ else if (errorData.error === 'expired_token') {
111
+ throw new Error('expired_token');
112
+ }
113
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
114
+ }
115
+ catch (error) {
116
+ // For network errors, apply exponential backoff
117
+ if (error instanceof Error && error.message.includes('fetch failed')) {
118
+ interval = Math.min(interval * 1.5, 60000); // Max 60 seconds
119
+ await new Promise((resolve) => setTimeout(resolve, interval));
120
+ continue;
121
+ }
122
+ // Re-throw other errors (like access_denied, expired_token)
123
+ throw error;
124
+ }
125
+ }
126
+ // If we reach here, we've exceeded the maximum polling duration
127
+ throw new Error('Polling timeout exceeded');
128
+ }
129
+ /**
130
+ * Refreshes an expired access token
131
+ * @param refreshToken Valid refresh token
132
+ * @returns Promise resolving to new OAuth token
133
+ */
134
+ async refreshToken(refreshToken) {
135
+ const params = new URLSearchParams({
136
+ grant_type: 'refresh_token',
137
+ refresh_token: refreshToken,
138
+ client_id: this.config.clientId,
139
+ });
140
+ const response = await fetch(this.config.tokenEndpoint, {
141
+ method: 'POST',
142
+ headers: {
143
+ 'Content-Type': 'application/x-www-form-urlencoded',
144
+ Accept: 'application/json',
145
+ },
146
+ body: params.toString(),
147
+ });
148
+ if (!response.ok) {
149
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
150
+ }
151
+ const data = await response.json();
152
+ // Validate response with Zod schema
153
+ const validatedResponse = TokenResponseSchema.parse(data);
154
+ // Calculate expiry timestamp with 30-second buffer
155
+ const now = Math.floor(Date.now() / 1000);
156
+ const expiresIn = validatedResponse.expires_in || 3600; // Default to 1 hour if not provided
157
+ const expiry = now + expiresIn - 30; // 30-second buffer
158
+ return {
159
+ access_token: validatedResponse.access_token,
160
+ token_type: 'Bearer',
161
+ expiry,
162
+ refresh_token: validatedResponse.refresh_token || refreshToken, // Use new refresh token if provided, otherwise keep the old one
163
+ scope: validatedResponse.scope || undefined, // Convert null to undefined
164
+ resource_url: validatedResponse.resource_url, // Include the API endpoint from Qwen
165
+ };
166
+ }
167
+ /**
168
+ * Generates PKCE code verifier and challenge
169
+ * @returns Object containing verifier and challenge strings
170
+ */
171
+ generatePKCE() {
172
+ // Generate 32 random bytes for verifier
173
+ const verifier = randomBytes(32).toString('base64url');
174
+ // Create SHA-256 hash of verifier for challenge
175
+ const challenge = createHash('sha256').update(verifier).digest('base64url');
176
+ return { verifier, challenge };
177
+ }
178
+ }
179
+ //# sourceMappingURL=qwen-device-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qwen-device-flow.js","sourceRoot":"","sources":["../../../src/auth/qwen-device-flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};