@vybestack/llxprt-code-core 0.1.19-alpha → 0.1.19-gamma

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 (553) hide show
  1. package/README.md +49 -2
  2. package/dist/index.d.ts +6 -0
  3. package/dist/index.js +5 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/auth/anthropic-device-flow.d.ts +53 -0
  6. package/dist/src/auth/anthropic-device-flow.js +208 -0
  7. package/dist/src/auth/anthropic-device-flow.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/qwen-device-flow.d.ts +45 -0
  12. package/dist/src/auth/qwen-device-flow.js +179 -0
  13. package/dist/src/auth/qwen-device-flow.js.map +1 -0
  14. package/dist/src/auth/token-store.d.ts +66 -0
  15. package/dist/src/auth/token-store.js +151 -0
  16. package/dist/src/auth/token-store.js.map +1 -0
  17. package/dist/src/auth/types.d.ts +130 -0
  18. package/dist/src/auth/types.js +60 -0
  19. package/dist/src/auth/types.js.map +1 -0
  20. package/dist/src/code_assist/converter.d.ts +2 -1
  21. package/dist/src/code_assist/converter.js +1 -1
  22. package/dist/src/code_assist/converter.js.map +1 -1
  23. package/dist/src/code_assist/oauth2.js +2 -1
  24. package/dist/src/code_assist/oauth2.js.map +1 -1
  25. package/dist/src/config/config.d.ts +61 -2
  26. package/dist/src/config/config.js +134 -4
  27. package/dist/src/config/config.js.map +1 -1
  28. package/dist/src/config/endpoints.d.ts +60 -0
  29. package/dist/src/config/endpoints.js +126 -0
  30. package/dist/src/config/endpoints.js.map +1 -0
  31. package/dist/src/config/profileManager.d.ts +14 -4
  32. package/dist/src/config/profileManager.js +90 -11
  33. package/dist/src/config/profileManager.js.map +1 -1
  34. package/dist/src/core/client.js +9 -12
  35. package/dist/src/core/client.js.map +1 -1
  36. package/dist/src/core/contentGenerator.d.ts +4 -1
  37. package/dist/src/core/contentGenerator.js +3 -0
  38. package/dist/src/core/contentGenerator.js.map +1 -1
  39. package/dist/src/core/logger.d.ts +1 -0
  40. package/dist/src/core/logger.js +18 -0
  41. package/dist/src/core/logger.js.map +1 -1
  42. package/dist/src/core/loggingContentGenerator.d.ts +24 -0
  43. package/dist/src/core/loggingContentGenerator.js +89 -0
  44. package/dist/src/core/loggingContentGenerator.js.map +1 -0
  45. package/dist/src/core/nonInteractiveToolExecutor.js +17 -0
  46. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
  47. package/dist/src/core/subagent.js +12 -10
  48. package/dist/src/core/subagent.js.map +1 -1
  49. package/dist/src/ide/ide-client.d.ts +1 -1
  50. package/dist/src/ide/ide-client.js +21 -7
  51. package/dist/src/ide/ide-client.js.map +1 -1
  52. package/dist/src/index.d.ts +11 -0
  53. package/dist/src/index.js +12 -0
  54. package/dist/src/index.js.map +1 -1
  55. package/dist/src/providers/BaseProvider.d.ts +149 -0
  56. package/dist/src/providers/BaseProvider.js +315 -0
  57. package/dist/src/providers/BaseProvider.js.map +1 -0
  58. package/dist/src/providers/IProvider.d.ts +1 -0
  59. package/dist/src/providers/IProviderManager.d.ts +5 -0
  60. package/dist/src/providers/LoggingProviderWrapper.d.ts +54 -0
  61. package/dist/src/providers/LoggingProviderWrapper.js +350 -0
  62. package/dist/src/providers/LoggingProviderWrapper.js.map +1 -0
  63. package/dist/src/providers/ProviderManager.d.ts +20 -1
  64. package/dist/src/providers/ProviderManager.js +236 -14
  65. package/dist/src/providers/ProviderManager.js.map +1 -1
  66. package/dist/src/providers/anthropic/AnthropicProvider.d.ts +20 -6
  67. package/dist/src/providers/anthropic/AnthropicProvider.js +172 -26
  68. package/dist/src/providers/anthropic/AnthropicProvider.js.map +1 -1
  69. package/dist/src/providers/gemini/GeminiProvider.d.ts +16 -7
  70. package/dist/src/providers/gemini/GeminiProvider.js +163 -148
  71. package/dist/src/providers/gemini/GeminiProvider.js.map +1 -1
  72. package/dist/src/providers/logging/ProviderContentExtractor.d.ts +27 -0
  73. package/dist/src/providers/logging/ProviderContentExtractor.js +198 -0
  74. package/dist/src/providers/logging/ProviderContentExtractor.js.map +1 -0
  75. package/dist/src/providers/logging/ProviderPerformanceTracker.d.ts +43 -0
  76. package/dist/src/providers/logging/ProviderPerformanceTracker.js +98 -0
  77. package/dist/src/providers/logging/ProviderPerformanceTracker.js.map +1 -0
  78. package/dist/src/providers/openai/OpenAIProvider.d.ts +53 -6
  79. package/dist/src/providers/openai/OpenAIProvider.js +373 -40
  80. package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
  81. package/dist/src/providers/openai/RESPONSES_API_MODELS.d.ts +1 -1
  82. package/dist/src/providers/openai/RESPONSES_API_MODELS.js +1 -0
  83. package/dist/src/providers/openai/RESPONSES_API_MODELS.js.map +1 -1
  84. package/dist/src/providers/openai/syntheticToolResponses.d.ts +52 -0
  85. package/dist/src/providers/openai/syntheticToolResponses.js +129 -0
  86. package/dist/src/providers/openai/syntheticToolResponses.js.map +1 -0
  87. package/dist/src/providers/types.d.ts +47 -0
  88. package/dist/src/services/git-stats-service.d.ts +32 -0
  89. package/dist/src/services/git-stats-service.js +22 -0
  90. package/dist/src/services/git-stats-service.js.map +1 -0
  91. package/dist/src/services/loopDetectionService.js +10 -6
  92. package/dist/src/services/loopDetectionService.js.map +1 -1
  93. package/dist/src/services/shellExecutionService.js +44 -8
  94. package/dist/src/services/shellExecutionService.js.map +1 -1
  95. package/dist/src/settings/SettingsService.d.ts +32 -0
  96. package/dist/src/settings/SettingsService.js +204 -0
  97. package/dist/src/settings/SettingsService.js.map +1 -0
  98. package/dist/src/settings/settingsServiceInstance.d.ts +12 -0
  99. package/dist/src/settings/settingsServiceInstance.js +24 -0
  100. package/dist/src/settings/settingsServiceInstance.js.map +1 -0
  101. package/dist/src/settings/types.d.ts +141 -0
  102. package/dist/src/settings/types.js +5 -0
  103. package/dist/src/settings/types.js.map +1 -0
  104. package/dist/src/storage/ConversationFileWriter.d.ts +16 -0
  105. package/dist/src/storage/ConversationFileWriter.js +69 -0
  106. package/dist/src/storage/ConversationFileWriter.js.map +1 -0
  107. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +8 -0
  108. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +56 -3
  109. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  110. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +5 -1
  111. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +11 -0
  112. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  113. package/dist/src/telemetry/constants.d.ts +5 -0
  114. package/dist/src/telemetry/constants.js +5 -0
  115. package/dist/src/telemetry/constants.js.map +1 -1
  116. package/dist/src/telemetry/loggers.d.ts +5 -1
  117. package/dist/src/telemetry/loggers.js +87 -1
  118. package/dist/src/telemetry/loggers.js.map +1 -1
  119. package/dist/src/telemetry/metrics.d.ts +2 -1
  120. package/dist/src/telemetry/metrics.js +7 -1
  121. package/dist/src/telemetry/metrics.js.map +1 -1
  122. package/dist/src/telemetry/tool-call-decision.d.ts +13 -0
  123. package/dist/src/telemetry/tool-call-decision.js +29 -0
  124. package/dist/src/telemetry/tool-call-decision.js.map +1 -0
  125. package/dist/src/telemetry/types.d.ts +56 -1
  126. package/dist/src/telemetry/types.js +123 -0
  127. package/dist/src/telemetry/types.js.map +1 -1
  128. package/dist/src/telemetry/uiTelemetry.d.ts +2 -1
  129. package/dist/src/telemetry/uiTelemetry.js +1 -1
  130. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  131. package/dist/src/tools/diffOptions.d.ts +2 -0
  132. package/dist/src/tools/diffOptions.js +28 -0
  133. package/dist/src/tools/diffOptions.js.map +1 -1
  134. package/dist/src/tools/edit.d.ts +4 -0
  135. package/dist/src/tools/edit.js +38 -8
  136. package/dist/src/tools/edit.js.map +1 -1
  137. package/dist/src/tools/mcp-client.d.ts +4 -3
  138. package/dist/src/tools/mcp-client.js +23 -6
  139. package/dist/src/tools/mcp-client.js.map +1 -1
  140. package/dist/src/tools/read-file.js +34 -2
  141. package/dist/src/tools/read-file.js.map +1 -1
  142. package/dist/src/tools/todo-pause.d.ts +22 -0
  143. package/dist/src/tools/todo-pause.js +93 -0
  144. package/dist/src/tools/todo-pause.js.map +1 -0
  145. package/dist/src/tools/tool-error.d.ts +4 -0
  146. package/dist/src/tools/tool-error.js +4 -0
  147. package/dist/src/tools/tool-error.js.map +1 -1
  148. package/dist/src/tools/tool-registry.js +3 -3
  149. package/dist/src/tools/tool-registry.js.map +1 -1
  150. package/dist/src/tools/tools.d.ts +7 -0
  151. package/dist/src/tools/tools.js.map +1 -1
  152. package/dist/src/tools/write-file.d.ts +4 -0
  153. package/dist/src/tools/write-file.js +90 -16
  154. package/dist/src/tools/write-file.js.map +1 -1
  155. package/dist/src/types/modelParams.d.ts +2 -0
  156. package/dist/src/utils/environmentContext.js +1 -1
  157. package/dist/src/utils/errors.d.ts +3 -0
  158. package/dist/src/utils/errors.js +6 -0
  159. package/dist/src/utils/errors.js.map +1 -1
  160. package/dist/src/utils/fileUtils.d.ts +7 -0
  161. package/dist/src/utils/fileUtils.js +9 -0
  162. package/dist/src/utils/fileUtils.js.map +1 -1
  163. package/package.json +4 -2
  164. package/dist/src/code_assist/converter.test.d.ts +0 -6
  165. package/dist/src/code_assist/converter.test.js +0 -232
  166. package/dist/src/code_assist/converter.test.js.map +0 -1
  167. package/dist/src/code_assist/oauth2.test.d.ts +0 -6
  168. package/dist/src/code_assist/oauth2.test.js +0 -370
  169. package/dist/src/code_assist/oauth2.test.js.map +0 -1
  170. package/dist/src/code_assist/server.test.d.ts +0 -6
  171. package/dist/src/code_assist/server.test.js +0 -131
  172. package/dist/src/code_assist/server.test.js.map +0 -1
  173. package/dist/src/code_assist/setup.test.d.ts +0 -6
  174. package/dist/src/code_assist/setup.test.js +0 -65
  175. package/dist/src/code_assist/setup.test.js.map +0 -1
  176. package/dist/src/config/config.alwaysAllow.test.d.ts +0 -6
  177. package/dist/src/config/config.alwaysAllow.test.js +0 -84
  178. package/dist/src/config/config.alwaysAllow.test.js.map +0 -1
  179. package/dist/src/config/config.test.d.ts +0 -6
  180. package/dist/src/config/config.test.js +0 -369
  181. package/dist/src/config/config.test.js.map +0 -1
  182. package/dist/src/config/flashFallback.test.d.ts +0 -6
  183. package/dist/src/config/flashFallback.test.js +0 -91
  184. package/dist/src/config/flashFallback.test.js.map +0 -1
  185. package/dist/src/core/client.test.d.ts +0 -6
  186. package/dist/src/core/client.test.js +0 -1322
  187. package/dist/src/core/client.test.js.map +0 -1
  188. package/dist/src/core/contentGenerator.test.d.ts +0 -6
  189. package/dist/src/core/contentGenerator.test.js +0 -103
  190. package/dist/src/core/contentGenerator.test.js.map +0 -1
  191. package/dist/src/core/coreToolScheduler.test.d.ts +0 -6
  192. package/dist/src/core/coreToolScheduler.test.js +0 -637
  193. package/dist/src/core/coreToolScheduler.test.js.map +0 -1
  194. package/dist/src/core/geminiChat.test.d.ts +0 -6
  195. package/dist/src/core/geminiChat.test.js +0 -425
  196. package/dist/src/core/geminiChat.test.js.map +0 -1
  197. package/dist/src/core/googleGenAIWrapper.test.d.ts +0 -6
  198. package/dist/src/core/googleGenAIWrapper.test.js +0 -104
  199. package/dist/src/core/googleGenAIWrapper.test.js.map +0 -1
  200. package/dist/src/core/logger.test.d.ts +0 -6
  201. package/dist/src/core/logger.test.js +0 -438
  202. package/dist/src/core/logger.test.js.map +0 -1
  203. package/dist/src/core/nonInteractiveToolExecutor.test.d.ts +0 -6
  204. package/dist/src/core/nonInteractiveToolExecutor.test.js +0 -165
  205. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +0 -1
  206. package/dist/src/core/prompts-async.test.d.ts +0 -6
  207. package/dist/src/core/prompts-async.test.js +0 -115
  208. package/dist/src/core/prompts-async.test.js.map +0 -1
  209. package/dist/src/core/prompts.test.d.ts +0 -6
  210. package/dist/src/core/prompts.test.js +0 -68
  211. package/dist/src/core/prompts.test.js.map +0 -1
  212. package/dist/src/core/subagent.test.d.ts +0 -6
  213. package/dist/src/core/subagent.test.js +0 -519
  214. package/dist/src/core/subagent.test.js.map +0 -1
  215. package/dist/src/core/tokenLimits.test.d.ts +0 -6
  216. package/dist/src/core/tokenLimits.test.js +0 -66
  217. package/dist/src/core/tokenLimits.test.js.map +0 -1
  218. package/dist/src/core/turn.test.d.ts +0 -6
  219. package/dist/src/core/turn.test.js +0 -366
  220. package/dist/src/core/turn.test.js.map +0 -1
  221. package/dist/src/hooks/tool-render-suppression-hook.test.d.ts +0 -6
  222. package/dist/src/hooks/tool-render-suppression-hook.test.js +0 -59
  223. package/dist/src/hooks/tool-render-suppression-hook.test.js.map +0 -1
  224. package/dist/src/ide/ide-installer.test.d.ts +0 -6
  225. package/dist/src/ide/ide-installer.test.js +0 -55
  226. package/dist/src/ide/ide-installer.test.js.map +0 -1
  227. package/dist/src/ide/ideContext.test.d.ts +0 -6
  228. package/dist/src/ide/ideContext.test.js +0 -265
  229. package/dist/src/ide/ideContext.test.js.map +0 -1
  230. package/dist/src/index.test.d.ts +0 -6
  231. package/dist/src/index.test.js +0 -12
  232. package/dist/src/index.test.js.map +0 -1
  233. package/dist/src/integration-tests/todo-system.test.d.ts +0 -6
  234. package/dist/src/integration-tests/todo-system.test.js +0 -46
  235. package/dist/src/integration-tests/todo-system.test.js.map +0 -1
  236. package/dist/src/mcp/google-auth-provider.test.d.ts +0 -6
  237. package/dist/src/mcp/google-auth-provider.test.js +0 -54
  238. package/dist/src/mcp/google-auth-provider.test.js.map +0 -1
  239. package/dist/src/mcp/oauth-provider.test.d.ts +0 -6
  240. package/dist/src/mcp/oauth-provider.test.js +0 -602
  241. package/dist/src/mcp/oauth-provider.test.js.map +0 -1
  242. package/dist/src/mcp/oauth-token-storage.test.d.ts +0 -6
  243. package/dist/src/mcp/oauth-token-storage.test.js +0 -205
  244. package/dist/src/mcp/oauth-token-storage.test.js.map +0 -1
  245. package/dist/src/mcp/oauth-utils.test.d.ts +0 -6
  246. package/dist/src/mcp/oauth-utils.test.js +0 -144
  247. package/dist/src/mcp/oauth-utils.test.js.map +0 -1
  248. package/dist/src/parsers/TextToolCallParser.multibyte.test.d.ts +0 -1
  249. package/dist/src/parsers/TextToolCallParser.multibyte.test.js +0 -42
  250. package/dist/src/parsers/TextToolCallParser.multibyte.test.js.map +0 -1
  251. package/dist/src/parsers/TextToolCallParser.test.d.ts +0 -1
  252. package/dist/src/parsers/TextToolCallParser.test.js +0 -225
  253. package/dist/src/parsers/TextToolCallParser.test.js.map +0 -1
  254. package/dist/src/prompt-config/TemplateEngine.test.d.ts +0 -1
  255. package/dist/src/prompt-config/TemplateEngine.test.js +0 -494
  256. package/dist/src/prompt-config/TemplateEngine.test.js.map +0 -1
  257. package/dist/src/prompt-config/prompt-cache.test.d.ts +0 -6
  258. package/dist/src/prompt-config/prompt-cache.test.js +0 -437
  259. package/dist/src/prompt-config/prompt-cache.test.js.map +0 -1
  260. package/dist/src/prompt-config/prompt-installer.test.d.ts +0 -7
  261. package/dist/src/prompt-config/prompt-installer.test.js +0 -503
  262. package/dist/src/prompt-config/prompt-installer.test.js.map +0 -1
  263. package/dist/src/prompt-config/prompt-loader.test.d.ts +0 -5
  264. package/dist/src/prompt-config/prompt-loader.test.js +0 -413
  265. package/dist/src/prompt-config/prompt-loader.test.js.map +0 -1
  266. package/dist/src/prompt-config/prompt-resolver.test.d.ts +0 -1
  267. package/dist/src/prompt-config/prompt-resolver.test.js +0 -529
  268. package/dist/src/prompt-config/prompt-resolver.test.js.map +0 -1
  269. package/dist/src/prompt-config/prompt-service.test.d.ts +0 -1
  270. package/dist/src/prompt-config/prompt-service.test.js +0 -811
  271. package/dist/src/prompt-config/prompt-service.test.js.map +0 -1
  272. package/dist/src/providers/ProviderManager.gemini-switch.test.d.ts +0 -6
  273. package/dist/src/providers/ProviderManager.gemini-switch.test.js +0 -57
  274. package/dist/src/providers/ProviderManager.gemini-switch.test.js.map +0 -1
  275. package/dist/src/providers/ProviderManager.test.d.ts +0 -6
  276. package/dist/src/providers/ProviderManager.test.js +0 -284
  277. package/dist/src/providers/ProviderManager.test.js.map +0 -1
  278. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.d.ts +0 -6
  279. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js +0 -273
  280. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js.map +0 -1
  281. package/dist/src/providers/anthropic/AnthropicProvider.modelParams.test.d.ts +0 -1
  282. package/dist/src/providers/anthropic/AnthropicProvider.modelParams.test.js +0 -48
  283. package/dist/src/providers/anthropic/AnthropicProvider.modelParams.test.js.map +0 -1
  284. package/dist/src/providers/anthropic/AnthropicProvider.test.d.ts +0 -1
  285. package/dist/src/providers/anthropic/AnthropicProvider.test.js +0 -487
  286. package/dist/src/providers/anthropic/AnthropicProvider.test.js.map +0 -1
  287. package/dist/src/providers/gemini/GeminiProvider.integration.test.d.ts +0 -6
  288. package/dist/src/providers/gemini/GeminiProvider.integration.test.js +0 -126
  289. package/dist/src/providers/gemini/GeminiProvider.integration.test.js.map +0 -1
  290. package/dist/src/providers/gemini/GeminiProvider.test.d.ts +0 -6
  291. package/dist/src/providers/gemini/GeminiProvider.test.js +0 -136
  292. package/dist/src/providers/gemini/GeminiProvider.test.js.map +0 -1
  293. package/dist/src/providers/integration/multi-provider.integration.test.d.ts +0 -6
  294. package/dist/src/providers/integration/multi-provider.integration.test.js +0 -292
  295. package/dist/src/providers/integration/multi-provider.integration.test.js.map +0 -1
  296. package/dist/src/providers/openai/ConversationCache.accumTokens.test.d.ts +0 -1
  297. package/dist/src/providers/openai/ConversationCache.accumTokens.test.js +0 -97
  298. package/dist/src/providers/openai/ConversationCache.accumTokens.test.js.map +0 -1
  299. package/dist/src/providers/openai/ConversationCache.test.d.ts +0 -1
  300. package/dist/src/providers/openai/ConversationCache.test.js +0 -113
  301. package/dist/src/providers/openai/ConversationCache.test.js.map +0 -1
  302. package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.d.ts +0 -1
  303. package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.js +0 -189
  304. package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.js.map +0 -1
  305. package/dist/src/providers/openai/OpenAIProvider.integration.test.d.ts +0 -6
  306. package/dist/src/providers/openai/OpenAIProvider.integration.test.js +0 -125
  307. package/dist/src/providers/openai/OpenAIProvider.integration.test.js.map +0 -1
  308. package/dist/src/providers/openai/OpenAIProvider.responses.test.d.ts +0 -1
  309. package/dist/src/providers/openai/OpenAIProvider.responses.test.js +0 -350
  310. package/dist/src/providers/openai/OpenAIProvider.responses.test.js.map +0 -1
  311. package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.d.ts +0 -1
  312. package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.js +0 -213
  313. package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.js.map +0 -1
  314. package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.d.ts +0 -1
  315. package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.js +0 -59
  316. package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.js.map +0 -1
  317. package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.d.ts +0 -6
  318. package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.js +0 -105
  319. package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.js.map +0 -1
  320. package/dist/src/providers/openai/OpenAIProvider.switch.test.d.ts +0 -1
  321. package/dist/src/providers/openai/OpenAIProvider.switch.test.js +0 -256
  322. package/dist/src/providers/openai/OpenAIProvider.switch.test.js.map +0 -1
  323. package/dist/src/providers/openai/OpenAIProvider.test.d.ts +0 -16
  324. package/dist/src/providers/openai/OpenAIProvider.test.js +0 -620
  325. package/dist/src/providers/openai/OpenAIProvider.test.js.map +0 -1
  326. package/dist/src/providers/openai/ResponsesContextTrim.integration.test.d.ts +0 -1
  327. package/dist/src/providers/openai/ResponsesContextTrim.integration.test.js +0 -210
  328. package/dist/src/providers/openai/ResponsesContextTrim.integration.test.js.map +0 -1
  329. package/dist/src/providers/openai/__tests__/formatArrayResponse.test.d.ts +0 -1
  330. package/dist/src/providers/openai/__tests__/formatArrayResponse.test.js +0 -65
  331. package/dist/src/providers/openai/__tests__/formatArrayResponse.test.js.map +0 -1
  332. package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.d.ts +0 -1
  333. package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.js +0 -129
  334. package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.js.map +0 -1
  335. package/dist/src/providers/openai/buildResponsesRequest.test.d.ts +0 -1
  336. package/dist/src/providers/openai/buildResponsesRequest.test.js +0 -406
  337. package/dist/src/providers/openai/buildResponsesRequest.test.js.map +0 -1
  338. package/dist/src/providers/openai/buildResponsesRequest.undefined.test.d.ts +0 -1
  339. package/dist/src/providers/openai/buildResponsesRequest.undefined.test.js +0 -50
  340. package/dist/src/providers/openai/buildResponsesRequest.undefined.test.js.map +0 -1
  341. package/dist/src/providers/openai/estimateRemoteTokens.test.d.ts +0 -1
  342. package/dist/src/providers/openai/estimateRemoteTokens.test.js +0 -125
  343. package/dist/src/providers/openai/estimateRemoteTokens.test.js.map +0 -1
  344. package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.d.ts +0 -1
  345. package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.js +0 -192
  346. package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.js.map +0 -1
  347. package/dist/src/providers/openai/parseResponsesStream.test.d.ts +0 -1
  348. package/dist/src/providers/openai/parseResponsesStream.test.js +0 -151
  349. package/dist/src/providers/openai/parseResponsesStream.test.js.map +0 -1
  350. package/dist/src/services/fileDiscoveryService.test.d.ts +0 -6
  351. package/dist/src/services/fileDiscoveryService.test.js +0 -143
  352. package/dist/src/services/fileDiscoveryService.test.js.map +0 -1
  353. package/dist/src/services/gitService.test.d.ts +0 -6
  354. package/dist/src/services/gitService.test.js +0 -209
  355. package/dist/src/services/gitService.test.js.map +0 -1
  356. package/dist/src/services/loopDetectionService.test.d.ts +0 -6
  357. package/dist/src/services/loopDetectionService.test.js +0 -345
  358. package/dist/src/services/loopDetectionService.test.js.map +0 -1
  359. package/dist/src/services/shellExecutionService.multibyte.test.d.ts +0 -6
  360. package/dist/src/services/shellExecutionService.multibyte.test.js +0 -72
  361. package/dist/src/services/shellExecutionService.multibyte.test.js.map +0 -1
  362. package/dist/src/services/shellExecutionService.test.d.ts +0 -6
  363. package/dist/src/services/shellExecutionService.test.js +0 -272
  364. package/dist/src/services/shellExecutionService.test.js.map +0 -1
  365. package/dist/src/services/shellExecutionService.windows.multibyte.test.d.ts +0 -6
  366. package/dist/src/services/shellExecutionService.windows.multibyte.test.js +0 -98
  367. package/dist/src/services/shellExecutionService.windows.multibyte.test.js.map +0 -1
  368. package/dist/src/services/shellExecutionService.windows.test.d.ts +0 -6
  369. package/dist/src/services/shellExecutionService.windows.test.js +0 -79
  370. package/dist/src/services/shellExecutionService.windows.test.js.map +0 -1
  371. package/dist/src/services/tool-call-tracker-service.test.d.ts +0 -6
  372. package/dist/src/services/tool-call-tracker-service.test.js +0 -99
  373. package/dist/src/services/tool-call-tracker-service.test.js.map +0 -1
  374. package/dist/src/telemetry/loggers.test.d.ts +0 -6
  375. package/dist/src/telemetry/loggers.test.js +0 -572
  376. package/dist/src/telemetry/loggers.test.js.map +0 -1
  377. package/dist/src/telemetry/metrics.test.d.ts +0 -6
  378. package/dist/src/telemetry/metrics.test.js +0 -162
  379. package/dist/src/telemetry/metrics.test.js.map +0 -1
  380. package/dist/src/telemetry/telemetry.test.d.ts +0 -6
  381. package/dist/src/telemetry/telemetry.test.js +0 -54
  382. package/dist/src/telemetry/telemetry.test.js.map +0 -1
  383. package/dist/src/telemetry/uiTelemetry.test.d.ts +0 -6
  384. package/dist/src/telemetry/uiTelemetry.test.js +0 -517
  385. package/dist/src/telemetry/uiTelemetry.test.js.map +0 -1
  386. package/dist/src/tools/ToolFormatter.test.d.ts +0 -16
  387. package/dist/src/tools/ToolFormatter.test.js +0 -349
  388. package/dist/src/tools/ToolFormatter.test.js.map +0 -1
  389. package/dist/src/tools/ToolFormatter.toResponsesTool.test.d.ts +0 -1
  390. package/dist/src/tools/ToolFormatter.toResponsesTool.test.js +0 -241
  391. package/dist/src/tools/ToolFormatter.toResponsesTool.test.js.map +0 -1
  392. package/dist/src/tools/edit.test.d.ts +0 -6
  393. package/dist/src/tools/edit.test.js +0 -688
  394. package/dist/src/tools/edit.test.js.map +0 -1
  395. package/dist/src/tools/glob.test.d.ts +0 -6
  396. package/dist/src/tools/glob.test.js +0 -332
  397. package/dist/src/tools/glob.test.js.map +0 -1
  398. package/dist/src/tools/grep.test.d.ts +0 -6
  399. package/dist/src/tools/grep.test.js +0 -272
  400. package/dist/src/tools/grep.test.js.map +0 -1
  401. package/dist/src/tools/ls.test.d.ts +0 -6
  402. package/dist/src/tools/ls.test.js +0 -357
  403. package/dist/src/tools/ls.test.js.map +0 -1
  404. package/dist/src/tools/mcp-client.test.d.ts +0 -6
  405. package/dist/src/tools/mcp-client.test.js +0 -575
  406. package/dist/src/tools/mcp-client.test.js.map +0 -1
  407. package/dist/src/tools/mcp-tool.test.d.ts +0 -6
  408. package/dist/src/tools/mcp-tool.test.js +0 -501
  409. package/dist/src/tools/mcp-tool.test.js.map +0 -1
  410. package/dist/src/tools/memoryTool.test.d.ts +0 -6
  411. package/dist/src/tools/memoryTool.test.js +0 -266
  412. package/dist/src/tools/memoryTool.test.js.map +0 -1
  413. package/dist/src/tools/modifiable-tool.test.d.ts +0 -6
  414. package/dist/src/tools/modifiable-tool.test.js +0 -193
  415. package/dist/src/tools/modifiable-tool.test.js.map +0 -1
  416. package/dist/src/tools/read-file.test.d.ts +0 -6
  417. package/dist/src/tools/read-file.test.js +0 -313
  418. package/dist/src/tools/read-file.test.js.map +0 -1
  419. package/dist/src/tools/read-many-files.test.d.ts +0 -6
  420. package/dist/src/tools/read-many-files.test.js +0 -644
  421. package/dist/src/tools/read-many-files.test.js.map +0 -1
  422. package/dist/src/tools/shell.multibyte.test.d.ts +0 -6
  423. package/dist/src/tools/shell.multibyte.test.js +0 -75
  424. package/dist/src/tools/shell.multibyte.test.js.map +0 -1
  425. package/dist/src/tools/shell.test.d.ts +0 -6
  426. package/dist/src/tools/shell.test.js +0 -350
  427. package/dist/src/tools/shell.test.js.map +0 -1
  428. package/dist/src/tools/todo-read.test.d.ts +0 -6
  429. package/dist/src/tools/todo-read.test.js +0 -162
  430. package/dist/src/tools/todo-read.test.js.map +0 -1
  431. package/dist/src/tools/todo-schemas.test.d.ts +0 -6
  432. package/dist/src/tools/todo-schemas.test.js +0 -341
  433. package/dist/src/tools/todo-schemas.test.js.map +0 -1
  434. package/dist/src/tools/todo-store.test.d.ts +0 -6
  435. package/dist/src/tools/todo-store.test.js +0 -169
  436. package/dist/src/tools/todo-store.test.js.map +0 -1
  437. package/dist/src/tools/todo-write.test.d.ts +0 -6
  438. package/dist/src/tools/todo-write.test.js +0 -226
  439. package/dist/src/tools/todo-write.test.js.map +0 -1
  440. package/dist/src/tools/tool-registry.test.d.ts +0 -6
  441. package/dist/src/tools/tool-registry.test.js +0 -468
  442. package/dist/src/tools/tool-registry.test.js.map +0 -1
  443. package/dist/src/tools/tools.test.d.ts +0 -6
  444. package/dist/src/tools/tools.test.js +0 -117
  445. package/dist/src/tools/tools.test.js.map +0 -1
  446. package/dist/src/tools/web-fetch.integration.test.d.ts +0 -6
  447. package/dist/src/tools/web-fetch.integration.test.js +0 -532
  448. package/dist/src/tools/web-fetch.integration.test.js.map +0 -1
  449. package/dist/src/tools/web-search.test.d.ts +0 -6
  450. package/dist/src/tools/web-search.test.js +0 -229
  451. package/dist/src/tools/web-search.test.js.map +0 -1
  452. package/dist/src/tools/write-file.test.d.ts +0 -6
  453. package/dist/src/tools/write-file.test.js +0 -464
  454. package/dist/src/tools/write-file.test.js.map +0 -1
  455. package/dist/src/utils/bfsFileSearch.test.d.ts +0 -6
  456. package/dist/src/utils/bfsFileSearch.test.js +0 -191
  457. package/dist/src/utils/bfsFileSearch.test.js.map +0 -1
  458. package/dist/src/utils/editCorrector.test.d.ts +0 -6
  459. package/dist/src/utils/editCorrector.test.js +0 -564
  460. package/dist/src/utils/editCorrector.test.js.map +0 -1
  461. package/dist/src/utils/editor.test.d.ts +0 -6
  462. package/dist/src/utils/editor.test.js +0 -445
  463. package/dist/src/utils/editor.test.js.map +0 -1
  464. package/dist/src/utils/environmentContext.test.d.ts +0 -6
  465. package/dist/src/utils/environmentContext.test.js +0 -139
  466. package/dist/src/utils/environmentContext.test.js.map +0 -1
  467. package/dist/src/utils/errorReporting.test.d.ts +0 -6
  468. package/dist/src/utils/errorReporting.test.js +0 -130
  469. package/dist/src/utils/errorReporting.test.js.map +0 -1
  470. package/dist/src/utils/fileUtils.test.d.ts +0 -6
  471. package/dist/src/utils/fileUtils.test.js +0 -363
  472. package/dist/src/utils/fileUtils.test.js.map +0 -1
  473. package/dist/src/utils/filesearch/crawlCache.test.d.ts +0 -6
  474. package/dist/src/utils/filesearch/crawlCache.test.js +0 -103
  475. package/dist/src/utils/filesearch/crawlCache.test.js.map +0 -1
  476. package/dist/src/utils/filesearch/fileSearch.test.d.ts +0 -6
  477. package/dist/src/utils/filesearch/fileSearch.test.js +0 -654
  478. package/dist/src/utils/filesearch/fileSearch.test.js.map +0 -1
  479. package/dist/src/utils/filesearch/ignore.test.d.ts +0 -6
  480. package/dist/src/utils/filesearch/ignore.test.js +0 -57
  481. package/dist/src/utils/filesearch/ignore.test.js.map +0 -1
  482. package/dist/src/utils/filesearch/result-cache.test.d.ts +0 -6
  483. package/dist/src/utils/filesearch/result-cache.test.js +0 -47
  484. package/dist/src/utils/filesearch/result-cache.test.js.map +0 -1
  485. package/dist/src/utils/flashFallback.integration.test.d.ts +0 -6
  486. package/dist/src/utils/flashFallback.integration.test.js +0 -120
  487. package/dist/src/utils/flashFallback.integration.test.js.map +0 -1
  488. package/dist/src/utils/generateContentResponseUtilities.test.d.ts +0 -6
  489. package/dist/src/utils/generateContentResponseUtilities.test.js +0 -273
  490. package/dist/src/utils/generateContentResponseUtilities.test.js.map +0 -1
  491. package/dist/src/utils/getFolderStructure.test.d.ts +0 -6
  492. package/dist/src/utils/getFolderStructure.test.js +0 -282
  493. package/dist/src/utils/getFolderStructure.test.js.map +0 -1
  494. package/dist/src/utils/gitIgnoreParser.test.d.ts +0 -6
  495. package/dist/src/utils/gitIgnoreParser.test.js +0 -154
  496. package/dist/src/utils/gitIgnoreParser.test.js.map +0 -1
  497. package/dist/src/utils/memoryDiscovery.test.d.ts +0 -6
  498. package/dist/src/utils/memoryDiscovery.test.js +0 -181
  499. package/dist/src/utils/memoryDiscovery.test.js.map +0 -1
  500. package/dist/src/utils/memoryImportProcessor.test.d.ts +0 -6
  501. package/dist/src/utils/memoryImportProcessor.test.js +0 -715
  502. package/dist/src/utils/memoryImportProcessor.test.js.map +0 -1
  503. package/dist/src/utils/nextSpeakerChecker.test.d.ts +0 -6
  504. package/dist/src/utils/nextSpeakerChecker.test.js +0 -172
  505. package/dist/src/utils/nextSpeakerChecker.test.js.map +0 -1
  506. package/dist/src/utils/partUtils.test.d.ts +0 -6
  507. package/dist/src/utils/partUtils.test.js +0 -130
  508. package/dist/src/utils/partUtils.test.js.map +0 -1
  509. package/dist/src/utils/paths.test.d.ts +0 -6
  510. package/dist/src/utils/paths.test.js +0 -153
  511. package/dist/src/utils/paths.test.js.map +0 -1
  512. package/dist/src/utils/retry.test.d.ts +0 -6
  513. package/dist/src/utils/retry.test.js +0 -322
  514. package/dist/src/utils/retry.test.js.map +0 -1
  515. package/dist/src/utils/safeJsonStringify.test.d.ts +0 -6
  516. package/dist/src/utils/safeJsonStringify.test.js +0 -61
  517. package/dist/src/utils/safeJsonStringify.test.js.map +0 -1
  518. package/dist/src/utils/sanitization.test.d.ts +0 -6
  519. package/dist/src/utils/sanitization.test.js +0 -81
  520. package/dist/src/utils/sanitization.test.js.map +0 -1
  521. package/dist/src/utils/schemaValidator.test.d.ts +0 -6
  522. package/dist/src/utils/schemaValidator.test.js +0 -146
  523. package/dist/src/utils/schemaValidator.test.js.map +0 -1
  524. package/dist/src/utils/secure-browser-launcher.test.d.ts +0 -6
  525. package/dist/src/utils/secure-browser-launcher.test.js +0 -149
  526. package/dist/src/utils/secure-browser-launcher.test.js.map +0 -1
  527. package/dist/src/utils/shell-utils.shellReplacement.test.d.ts +0 -6
  528. package/dist/src/utils/shell-utils.shellReplacement.test.js +0 -149
  529. package/dist/src/utils/shell-utils.shellReplacement.test.js.map +0 -1
  530. package/dist/src/utils/shell-utils.test.d.ts +0 -6
  531. package/dist/src/utils/shell-utils.test.js +0 -200
  532. package/dist/src/utils/shell-utils.test.js.map +0 -1
  533. package/dist/src/utils/summarizer.test.d.ts +0 -6
  534. package/dist/src/utils/summarizer.test.js +0 -131
  535. package/dist/src/utils/summarizer.test.js.map +0 -1
  536. package/dist/src/utils/systemEncoding.test.d.ts +0 -6
  537. package/dist/src/utils/systemEncoding.test.js +0 -368
  538. package/dist/src/utils/systemEncoding.test.js.map +0 -1
  539. package/dist/src/utils/toolOutputLimiter.test.d.ts +0 -6
  540. package/dist/src/utils/toolOutputLimiter.test.js +0 -164
  541. package/dist/src/utils/toolOutputLimiter.test.js.map +0 -1
  542. package/dist/src/utils/unicodeUtils.test.d.ts +0 -6
  543. package/dist/src/utils/unicodeUtils.test.js +0 -120
  544. package/dist/src/utils/unicodeUtils.test.js.map +0 -1
  545. package/dist/src/utils/user_account.test.d.ts +0 -6
  546. package/dist/src/utils/user_account.test.js +0 -153
  547. package/dist/src/utils/user_account.test.js.map +0 -1
  548. package/dist/src/utils/user_id.test.d.ts +0 -6
  549. package/dist/src/utils/user_id.test.js +0 -21
  550. package/dist/src/utils/user_id.test.js.map +0 -1
  551. package/dist/src/utils/workspaceContext.test.d.ts +0 -6
  552. package/dist/src/utils/workspaceContext.test.js +0 -209
  553. package/dist/src/utils/workspaceContext.test.js.map +0 -1
package/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # LLxprt Code
2
2
 
3
3
  [![LLxprt Code CI](https://github.com/acoliver/llxprt-code/actions/workflows/ci.yml/badge.svg)](https://github.com/acoliver/llxprt-code/actions/workflows/ci.yml)
4
+  
5
+ [![Mentioned in Awesome Gemini CLI](https://awesome.re/mentioned-badge.svg)](https://github.com/Piebald-AI/awesome-gemini-cli)
4
6
 
5
7
  ![LLxprt Code Screenshot](./docs/assets/llxprt-screenshot.png)
6
8
 
@@ -87,7 +89,26 @@ Direct access to o3, o1, GPT-4.1, and other OpenAI models:
87
89
 
88
90
  ### Using Anthropic
89
91
 
90
- Access Claude Sonnet 4, Claude Opus 4, and other Anthropic models:
92
+ Access Claude Sonnet 4, Claude Opus 4.1, and other Anthropic models:
93
+
94
+ #### Option 1: Log in with Anthropic to use your Claude Pro or Max account
95
+
96
+ Use OAuth authentication to access Claude with your existing Claude Pro or Max subscription:
97
+
98
+ 1. Select the Anthropic provider:
99
+ ```
100
+ /provider anthropic
101
+ ```
102
+ 2. Authenticate with your Claude account:
103
+ ```
104
+ /auth
105
+ ```
106
+ 3. Your browser will open to the Claude authentication page
107
+ 4. Log in and authorize LLxprt Code
108
+ 5. Copy the authorization code shown and paste it back in the terminal
109
+ 6. You're now using your Claude Pro/Max account!
110
+
111
+ #### Option 2: Use an API Key
91
112
 
92
113
  1. Get your API key from [Anthropic](https://console.anthropic.com/account/keys)
93
114
  2. Configure:
@@ -97,6 +118,32 @@ Access Claude Sonnet 4, Claude Opus 4, and other Anthropic models:
97
118
  /model claude-sonnet-4-20250115
98
119
  ```
99
120
 
121
+ ### Using Qwen
122
+
123
+ Access Qwen3-Coder-Pro and other Qwen models for free:
124
+
125
+ #### Option 1: Log in with Qwen (FREE)
126
+
127
+ Use OAuth authentication to access Qwen with your free account:
128
+
129
+ ```
130
+ /auth qwen
131
+ ```
132
+
133
+ Your browser will open to the Qwen authentication page. Log in and authorize LLxprt Code, then copy the authorization code shown and paste it back in the terminal. You're now using Qwen3-Coder-Pro for free!
134
+
135
+ #### Option 2: Use an API Key
136
+
137
+ For advanced users who need API access:
138
+
139
+ 1. Get your API key from [Qwen](https://platform.qwen.ai/)
140
+ 2. Configure:
141
+ ```
142
+ /provider qwen
143
+ /key your-qwen-api-key
144
+ /model qwen3-coder-pro
145
+ ```
146
+
100
147
  ### Using Local Models
101
148
 
102
149
  Run models locally for complete privacy and control. LLxprt Code works with any OpenAI-compatible server.
@@ -277,7 +324,7 @@ Learn more in the [Prompt Configuration Guide](./docs/prompt-configuration.md).
277
324
  - `/baseurl` - Set custom API endpoint
278
325
  - `/key` - Set API key for current session
279
326
  - `/keyfile` - Load API key from file
280
- - `/auth` - Authenticate with Google (for Gemini provider)
327
+ - `/auth` - Authenticate with Google (for Gemini), Anthropic (for Claude), or Qwen
281
328
 
282
329
  ### Troubleshooting
283
330
 
package/dist/index.d.ts CHANGED
@@ -5,3 +5,9 @@
5
5
  */
6
6
  export * from './src/index.js';
7
7
  export { DEFAULT_GEMINI_MODEL, DEFAULT_GEMINI_FLASH_MODEL, DEFAULT_GEMINI_EMBEDDING_MODEL, } from './src/config/models.js';
8
+ export { QwenDeviceFlow, DeviceFlowConfig, } from './src/auth/qwen-device-flow.js';
9
+ export { MultiProviderTokenStore } from './src/auth/token-store.js';
10
+ export { openBrowserSecurely, shouldLaunchBrowser, } from './src/utils/secure-browser-launcher.js';
11
+ export { SettingsService } from './src/settings/SettingsService.js';
12
+ export type { ISettingsService, GlobalSettings, SettingsChangeEvent, ProviderSettings, UISettings, AdvancedSettings, EventListener, EventUnsubscribe, } from './src/settings/types.js';
13
+ export type { TelemetrySettings as SettingsTelemetrySettings } from './src/settings/types.js';
package/dist/index.js CHANGED
@@ -5,4 +5,9 @@
5
5
  */
6
6
  export * from './src/index.js';
7
7
  export { DEFAULT_GEMINI_MODEL, DEFAULT_GEMINI_FLASH_MODEL, DEFAULT_GEMINI_EMBEDDING_MODEL, } from './src/config/models.js';
8
+ export { QwenDeviceFlow, } from './src/auth/qwen-device-flow.js';
9
+ export { MultiProviderTokenStore } from './src/auth/token-store.js';
10
+ export { openBrowserSecurely, shouldLaunchBrowser, } from './src/utils/secure-browser-launcher.js';
11
+ // Re-export settings system for explicit access
12
+ export { SettingsService } from './src/settings/SettingsService.js';
8
13
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,8BAA8B,GAC/B,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,8BAA8B,GAC/B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,cAAc,GAEf,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,wCAAwC,CAAC;AAEhD,gDAAgD;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Anthropic OAuth 2.0 Device Flow Implementation
3
+ *
4
+ * Implements OAuth 2.0 device authorization grant flow for Anthropic Claude API.
5
+ * Based on the OAuth 2.0 Device Authorization Grant specification (RFC 8628).
6
+ */
7
+ import { DeviceCodeResponse, OAuthToken } from './types.js';
8
+ /**
9
+ * Configuration for Anthropic device flow authentication
10
+ */
11
+ interface AnthropicFlowConfig {
12
+ clientId: string;
13
+ authorizationEndpoint: string;
14
+ tokenEndpoint: string;
15
+ scopes: string[];
16
+ }
17
+ /**
18
+ * Anthropic-specific OAuth 2.0 device flow implementation.
19
+ * Handles authentication for Claude API access.
20
+ */
21
+ export declare class AnthropicDeviceFlow {
22
+ private config;
23
+ private codeVerifier?;
24
+ private codeChallenge?;
25
+ private state?;
26
+ constructor(config?: Partial<AnthropicFlowConfig>);
27
+ /**
28
+ * Generates PKCE code verifier and challenge using S256 method
29
+ */
30
+ private generatePKCE;
31
+ /**
32
+ * Initiates the OAuth flow by constructing the authorization URL.
33
+ * Since Anthropic doesn't have a device flow, we simulate it with authorization code flow.
34
+ */
35
+ initiateDeviceFlow(): Promise<DeviceCodeResponse>;
36
+ /**
37
+ * Exchange authorization code for access token (PKCE flow)
38
+ */
39
+ exchangeCodeForToken(authCodeWithState: string): Promise<OAuthToken>;
40
+ /**
41
+ * Polls for the access token after user authorization.
42
+ */
43
+ pollForToken(deviceCode: string): Promise<OAuthToken>;
44
+ /**
45
+ * Refreshes an expired access token using a refresh token.
46
+ */
47
+ refreshToken(refreshToken: string): Promise<OAuthToken>;
48
+ /**
49
+ * Maps Anthropic's token response to our standard OAuthToken format.
50
+ */
51
+ private mapTokenResponse;
52
+ }
53
+ export {};
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Anthropic OAuth 2.0 Device Flow Implementation
3
+ *
4
+ * Implements OAuth 2.0 device authorization grant flow for Anthropic Claude API.
5
+ * Based on the OAuth 2.0 Device Authorization Grant specification (RFC 8628).
6
+ */
7
+ import { createHash, randomBytes } from 'crypto';
8
+ /**
9
+ * Anthropic-specific OAuth 2.0 device flow implementation.
10
+ * Handles authentication for Claude API access.
11
+ */
12
+ export class AnthropicDeviceFlow {
13
+ config;
14
+ codeVerifier;
15
+ codeChallenge;
16
+ state;
17
+ constructor(config) {
18
+ const defaultConfig = {
19
+ clientId: '9d1c250a-e61b-44d9-88ed-5944d1962f5e', // Anthropic's public OAuth client ID
20
+ authorizationEndpoint: 'https://claude.ai/oauth/authorize', // Use claude.ai like OpenCode's "max" mode
21
+ tokenEndpoint: 'https://console.anthropic.com/v1/oauth/token',
22
+ scopes: ['org:create_api_key', 'user:profile', 'user:inference'],
23
+ };
24
+ this.config = { ...defaultConfig, ...config };
25
+ }
26
+ /**
27
+ * Generates PKCE code verifier and challenge using S256 method
28
+ */
29
+ generatePKCE() {
30
+ // Generate a random code verifier (43-128 characters)
31
+ const _verifier = randomBytes(32).toString('base64url');
32
+ this.codeVerifier = _verifier;
33
+ // Generate code challenge using S256 (SHA256 hash)
34
+ const challenge = createHash('sha256')
35
+ .update(_verifier)
36
+ .digest('base64url');
37
+ this.codeChallenge = challenge;
38
+ return { verifier: _verifier, challenge };
39
+ }
40
+ /**
41
+ * Initiates the OAuth flow by constructing the authorization URL.
42
+ * Since Anthropic doesn't have a device flow, we simulate it with authorization code flow.
43
+ */
44
+ async initiateDeviceFlow() {
45
+ // Generate PKCE parameters
46
+ const { verifier, challenge } = this.generatePKCE();
47
+ // Use verifier as state like OpenCode does
48
+ this.state = verifier; // Store for later use in token exchange
49
+ // Build authorization URL with PKCE parameters
50
+ const params = new URLSearchParams({
51
+ code: 'true',
52
+ client_id: this.config.clientId,
53
+ response_type: 'code',
54
+ redirect_uri: 'https://console.anthropic.com/oauth/code/callback',
55
+ scope: this.config.scopes.join(' '),
56
+ code_challenge: challenge,
57
+ code_challenge_method: 'S256',
58
+ state: verifier, // Use verifier as state like OpenCode
59
+ });
60
+ const authUrl = `${this.config.authorizationEndpoint}?${params.toString()}`;
61
+ // Return a simulated device code response with the authorization URL
62
+ // The user will need to manually visit this URL and authorize
63
+ return {
64
+ device_code: verifier, // Use verifier as a tracking ID
65
+ user_code: 'ANTHROPIC', // Display code for user
66
+ verification_uri: 'https://console.anthropic.com/oauth/authorize',
67
+ verification_uri_complete: authUrl,
68
+ expires_in: 1800, // 30 minutes
69
+ interval: 5, // 5 seconds polling interval
70
+ };
71
+ }
72
+ /**
73
+ * Exchange authorization code for access token (PKCE flow)
74
+ */
75
+ async exchangeCodeForToken(authCodeWithState) {
76
+ if (!this.codeVerifier) {
77
+ throw new Error('No PKCE code verifier found - OAuth flow not initialized');
78
+ }
79
+ // OpenCode splits the code and state - format: code#state
80
+ const splits = authCodeWithState.split('#');
81
+ const authCode = splits[0];
82
+ const stateFromResponse = splits[1] || this.state; // Use state from response if available
83
+ // Debug logging
84
+ console.log('Exchanging authorization code:', {
85
+ codeLength: authCode.length,
86
+ codePreview: authCode.substring(0, 10) + '...',
87
+ hasVerifier: !!this.codeVerifier,
88
+ verifierLength: this.codeVerifier.length,
89
+ hasState: !!stateFromResponse,
90
+ });
91
+ // OpenCode sends JSON, not form-encoded!
92
+ const requestBody = {
93
+ grant_type: 'authorization_code',
94
+ code: authCode,
95
+ state: stateFromResponse, // Include state in the request
96
+ client_id: this.config.clientId,
97
+ redirect_uri: 'https://console.anthropic.com/oauth/code/callback',
98
+ code_verifier: this.codeVerifier,
99
+ };
100
+ console.log('Token request body:', JSON.stringify(requestBody));
101
+ const response = await fetch(this.config.tokenEndpoint, {
102
+ method: 'POST',
103
+ headers: {
104
+ 'Content-Type': 'application/json', // JSON, not form-encoded!
105
+ },
106
+ body: JSON.stringify(requestBody), // Send as JSON
107
+ });
108
+ if (!response.ok) {
109
+ const error = await response.text();
110
+ throw new Error(`Failed to exchange authorization code: ${error}`);
111
+ }
112
+ const data = await response.json();
113
+ console.log('Token response:', {
114
+ hasAccessToken: !!data.access_token,
115
+ hasRefreshToken: !!data.refresh_token,
116
+ tokenPreview: data.access_token
117
+ ? data.access_token.substring(0, 20) + '...'
118
+ : 'none',
119
+ expiresIn: data.expires_in,
120
+ scope: data.scope, // Log the actual scopes returned
121
+ });
122
+ return this.mapTokenResponse(data);
123
+ }
124
+ /**
125
+ * Polls for the access token after user authorization.
126
+ */
127
+ async pollForToken(deviceCode) {
128
+ const startTime = Date.now();
129
+ const expiresIn = 1800 * 1000; // 30 minutes in milliseconds
130
+ const interval = 5000; // 5 seconds default polling interval
131
+ while (Date.now() - startTime < expiresIn) {
132
+ try {
133
+ const response = await fetch(this.config.tokenEndpoint, {
134
+ method: 'POST',
135
+ headers: {
136
+ 'Content-Type': 'application/x-www-form-urlencoded',
137
+ },
138
+ body: new URLSearchParams({
139
+ grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
140
+ device_code: deviceCode,
141
+ client_id: this.config.clientId,
142
+ }),
143
+ });
144
+ if (response.ok) {
145
+ const data = await response.json();
146
+ return this.mapTokenResponse(data);
147
+ }
148
+ const error = await response.json();
149
+ // Check for pending authorization
150
+ if (error.error === 'authorization_pending') {
151
+ await new Promise((resolve) => setTimeout(resolve, interval));
152
+ continue;
153
+ }
154
+ // Check for slow down request
155
+ if (error.error === 'slow_down') {
156
+ await new Promise((resolve) => setTimeout(resolve, interval * 2));
157
+ continue;
158
+ }
159
+ // Handle other errors
160
+ throw new Error(`Token polling failed: ${error.error_description || error.error}`);
161
+ }
162
+ catch (error) {
163
+ if (error instanceof Error &&
164
+ error.message.includes('Token polling failed')) {
165
+ throw error;
166
+ }
167
+ // Network errors - continue polling
168
+ await new Promise((resolve) => setTimeout(resolve, interval));
169
+ }
170
+ }
171
+ throw new Error('Authorization timeout - user did not complete authentication');
172
+ }
173
+ /**
174
+ * Refreshes an expired access token using a refresh token.
175
+ */
176
+ async refreshToken(refreshToken) {
177
+ const response = await fetch(this.config.tokenEndpoint, {
178
+ method: 'POST',
179
+ headers: {
180
+ 'Content-Type': 'application/x-www-form-urlencoded',
181
+ },
182
+ body: new URLSearchParams({
183
+ grant_type: 'refresh_token',
184
+ refresh_token: refreshToken,
185
+ client_id: this.config.clientId,
186
+ }),
187
+ });
188
+ if (!response.ok) {
189
+ const error = await response.text();
190
+ throw new Error(`Failed to refresh Anthropic token: ${error}`);
191
+ }
192
+ const data = await response.json();
193
+ return this.mapTokenResponse(data);
194
+ }
195
+ /**
196
+ * Maps Anthropic's token response to our standard OAuthToken format.
197
+ */
198
+ mapTokenResponse(data) {
199
+ return {
200
+ access_token: data.access_token,
201
+ expiry: Math.floor(Date.now() / 1000) + (data.expires_in || 3600),
202
+ refresh_token: data.refresh_token,
203
+ scope: data.scope,
204
+ token_type: 'Bearer',
205
+ };
206
+ }
207
+ }
208
+ //# sourceMappingURL=anthropic-device-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-device-flow.js","sourceRoot":"","sources":["../../../src/auth/anthropic-device-flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export interface AuthPrecedenceConfig {
7
+ commandKey?: string;
8
+ commandKeyfile?: string;
9
+ cliKey?: string;
10
+ cliKeyfile?: string;
11
+ envKeyNames?: string[];
12
+ isOAuthEnabled?: boolean;
13
+ supportsOAuth?: boolean;
14
+ oauthProvider?: string;
15
+ }
16
+ import { OAuthToken } from './types.js';
17
+ export interface OAuthManager {
18
+ getToken(provider: string): Promise<string | null>;
19
+ isAuthenticated(provider: string): Promise<boolean>;
20
+ getOAuthToken?(provider: string): Promise<OAuthToken | null>;
21
+ }
22
+ export declare class AuthPrecedenceResolver {
23
+ private config;
24
+ private oauthManager?;
25
+ constructor(config: AuthPrecedenceConfig, oauthManager?: OAuthManager);
26
+ /**
27
+ * Resolves authentication using the full precedence chain
28
+ * Returns the first available authentication method or null if none found
29
+ */
30
+ resolveAuthentication(): Promise<string | null>;
31
+ /**
32
+ * Check if any authentication method is available without triggering OAuth
33
+ */
34
+ hasNonOAuthAuthentication(): Promise<boolean>;
35
+ /**
36
+ * Check if OAuth is the only available authentication method
37
+ */
38
+ isOAuthOnlyAvailable(): Promise<boolean>;
39
+ /**
40
+ * Get authentication method name for debugging/logging
41
+ */
42
+ getAuthMethodName(): Promise<string | null>;
43
+ /**
44
+ * Reads API key from a file path, handling both absolute and relative paths
45
+ */
46
+ private readKeyFile;
47
+ /**
48
+ * Updates the configuration
49
+ */
50
+ updateConfig(newConfig: Partial<AuthPrecedenceConfig>): void;
51
+ /**
52
+ * Updates the OAuth manager
53
+ */
54
+ updateOAuthManager(oauthManager: OAuthManager): void;
55
+ }
@@ -0,0 +1,211 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Authentication precedence utility for providers
8
+ *
9
+ * Implements the authentication precedence chain:
10
+ * 1. /key command key
11
+ * 2. /keyfile command keyfile
12
+ * 3. --key CLI argument
13
+ * 4. --keyfile CLI argument
14
+ * 5. Environment variables
15
+ * 6. OAuth (if enabled)
16
+ */
17
+ import * as fs from 'node:fs/promises';
18
+ import * as path from 'node:path';
19
+ export class AuthPrecedenceResolver {
20
+ config;
21
+ oauthManager;
22
+ constructor(config, oauthManager) {
23
+ this.config = config;
24
+ this.oauthManager = oauthManager;
25
+ }
26
+ /**
27
+ * Resolves authentication using the full precedence chain
28
+ * Returns the first available authentication method or null if none found
29
+ */
30
+ async resolveAuthentication() {
31
+ // 1. Check /key command key (highest priority)
32
+ if (this.config.commandKey && this.config.commandKey.trim() !== '') {
33
+ return this.config.commandKey;
34
+ }
35
+ // 2. Check /keyfile command keyfile
36
+ if (this.config.commandKeyfile) {
37
+ try {
38
+ const keyFromFile = await this.readKeyFile(this.config.commandKeyfile);
39
+ if (keyFromFile) {
40
+ return keyFromFile;
41
+ }
42
+ }
43
+ catch (error) {
44
+ if (process.env.DEBUG) {
45
+ console.warn(`Failed to read command keyfile ${this.config.commandKeyfile}:`, error);
46
+ }
47
+ }
48
+ }
49
+ // 3. Check --key CLI argument
50
+ if (this.config.cliKey && this.config.cliKey.trim() !== '') {
51
+ return this.config.cliKey;
52
+ }
53
+ // 4. Check --keyfile CLI argument
54
+ if (this.config.cliKeyfile) {
55
+ try {
56
+ const keyFromFile = await this.readKeyFile(this.config.cliKeyfile);
57
+ if (keyFromFile) {
58
+ return keyFromFile;
59
+ }
60
+ }
61
+ catch (error) {
62
+ if (process.env.DEBUG) {
63
+ console.warn(`Failed to read CLI keyfile ${this.config.cliKeyfile}:`, error);
64
+ }
65
+ }
66
+ }
67
+ // 5. Check environment variables
68
+ if (this.config.envKeyNames && this.config.envKeyNames.length > 0) {
69
+ for (const envVarName of this.config.envKeyNames) {
70
+ const envValue = process.env[envVarName];
71
+ if (envValue && envValue.trim() !== '') {
72
+ return envValue;
73
+ }
74
+ }
75
+ }
76
+ // 6. OAuth (if enabled and supported)
77
+ if (this.config.isOAuthEnabled &&
78
+ this.config.supportsOAuth &&
79
+ this.oauthManager &&
80
+ this.config.oauthProvider) {
81
+ try {
82
+ const token = await this.oauthManager.getToken(this.config.oauthProvider);
83
+ if (token) {
84
+ return token;
85
+ }
86
+ }
87
+ catch (error) {
88
+ if (process.env.DEBUG) {
89
+ console.warn(`Failed to get OAuth token for ${this.config.oauthProvider}:`, error);
90
+ }
91
+ }
92
+ }
93
+ // No authentication method available
94
+ return null;
95
+ }
96
+ /**
97
+ * Check if any authentication method is available without triggering OAuth
98
+ */
99
+ async hasNonOAuthAuthentication() {
100
+ // Check all precedence levels except OAuth
101
+ const tempConfig = { ...this.config, isOAuthEnabled: false };
102
+ const tempResolver = new AuthPrecedenceResolver(tempConfig, undefined);
103
+ const auth = await tempResolver.resolveAuthentication();
104
+ return auth !== null;
105
+ }
106
+ /**
107
+ * Check if OAuth is the only available authentication method
108
+ */
109
+ async isOAuthOnlyAvailable() {
110
+ const hasNonOAuth = await this.hasNonOAuthAuthentication();
111
+ return (!hasNonOAuth &&
112
+ this.config.isOAuthEnabled === true &&
113
+ this.config.supportsOAuth === true);
114
+ }
115
+ /**
116
+ * Get authentication method name for debugging/logging
117
+ */
118
+ async getAuthMethodName() {
119
+ // Check precedence levels and return method name
120
+ if (this.config.commandKey && this.config.commandKey.trim() !== '') {
121
+ return 'command-key';
122
+ }
123
+ if (this.config.commandKeyfile) {
124
+ try {
125
+ const keyFromFile = await this.readKeyFile(this.config.commandKeyfile);
126
+ if (keyFromFile) {
127
+ return 'command-keyfile';
128
+ }
129
+ }
130
+ catch {
131
+ // Ignore errors for method detection
132
+ }
133
+ }
134
+ if (this.config.cliKey && this.config.cliKey.trim() !== '') {
135
+ return 'cli-key';
136
+ }
137
+ if (this.config.cliKeyfile) {
138
+ try {
139
+ const keyFromFile = await this.readKeyFile(this.config.cliKeyfile);
140
+ if (keyFromFile) {
141
+ return 'cli-keyfile';
142
+ }
143
+ }
144
+ catch {
145
+ // Ignore errors for method detection
146
+ }
147
+ }
148
+ if (this.config.envKeyNames && this.config.envKeyNames.length > 0) {
149
+ for (const envVarName of this.config.envKeyNames) {
150
+ const envValue = process.env[envVarName];
151
+ if (envValue && envValue.trim() !== '') {
152
+ return `env-${envVarName.toLowerCase()}`;
153
+ }
154
+ }
155
+ }
156
+ if (this.config.isOAuthEnabled &&
157
+ this.config.supportsOAuth &&
158
+ this.oauthManager &&
159
+ this.config.oauthProvider) {
160
+ try {
161
+ const isAuthenticated = await this.oauthManager.isAuthenticated(this.config.oauthProvider);
162
+ if (isAuthenticated) {
163
+ return `oauth-${this.config.oauthProvider}`;
164
+ }
165
+ }
166
+ catch {
167
+ // Ignore errors for method detection
168
+ }
169
+ }
170
+ return null;
171
+ }
172
+ /**
173
+ * Reads API key from a file path, handling both absolute and relative paths
174
+ */
175
+ async readKeyFile(filePath) {
176
+ try {
177
+ // Handle relative paths from current working directory
178
+ const resolvedPath = path.isAbsolute(filePath)
179
+ ? filePath
180
+ : path.resolve(process.cwd(), filePath);
181
+ const content = await fs.readFile(resolvedPath, 'utf-8');
182
+ const key = content.trim();
183
+ if (key === '') {
184
+ if (process.env.DEBUG) {
185
+ console.warn(`Key file ${filePath} is empty`);
186
+ }
187
+ return null;
188
+ }
189
+ return key;
190
+ }
191
+ catch (error) {
192
+ if (process.env.DEBUG) {
193
+ console.warn(`Failed to read key file ${filePath}:`, error);
194
+ }
195
+ return null;
196
+ }
197
+ }
198
+ /**
199
+ * Updates the configuration
200
+ */
201
+ updateConfig(newConfig) {
202
+ this.config = { ...this.config, ...newConfig };
203
+ }
204
+ /**
205
+ * Updates the OAuth manager
206
+ */
207
+ updateOAuthManager(oauthManager) {
208
+ this.oauthManager = oauthManager;
209
+ }
210
+ }
211
+ //# sourceMappingURL=precedence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"precedence.js","sourceRoot":"","sources":["../../../src/auth/precedence.ts"],"names":[],"mappings":"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"}