@vybestack/llxprt-code-core 0.1.19-beta → 0.1.19

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 (540) hide show
  1. package/README.md +49 -2
  2. package/dist/index.d.ts +6 -0
  3. package/dist/index.js +6 -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 -2
  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/config/config.d.ts +7 -1
  24. package/dist/src/config/config.js +46 -5
  25. package/dist/src/config/config.js.map +1 -1
  26. package/dist/src/config/endpoints.d.ts +60 -0
  27. package/dist/src/config/endpoints.js +126 -0
  28. package/dist/src/config/endpoints.js.map +1 -0
  29. package/dist/src/config/profileManager.d.ts +14 -4
  30. package/dist/src/config/profileManager.js +90 -11
  31. package/dist/src/config/profileManager.js.map +1 -1
  32. package/dist/src/core/client.d.ts +5 -2
  33. package/dist/src/core/client.js +164 -44
  34. package/dist/src/core/client.js.map +1 -1
  35. package/dist/src/core/contentGenerator.d.ts +4 -1
  36. package/dist/src/core/contentGenerator.js +3 -0
  37. package/dist/src/core/contentGenerator.js.map +1 -1
  38. package/dist/src/core/loggingContentGenerator.d.ts +5 -0
  39. package/dist/src/core/loggingContentGenerator.js +9 -1
  40. package/dist/src/core/loggingContentGenerator.js.map +1 -1
  41. package/dist/src/core/subagent.js +12 -10
  42. package/dist/src/core/subagent.js.map +1 -1
  43. package/dist/src/ide/detect-ide.d.ts +10 -2
  44. package/dist/src/ide/detect-ide.js +48 -5
  45. package/dist/src/ide/detect-ide.js.map +1 -1
  46. package/dist/src/ide/ide-client.js +22 -15
  47. package/dist/src/ide/ide-client.js.map +1 -1
  48. package/dist/src/index.d.ts +10 -1
  49. package/dist/src/index.js +10 -1
  50. package/dist/src/index.js.map +1 -1
  51. package/dist/src/prompt-config/defaults/core-defaults.d.ts +1 -1
  52. package/dist/src/prompt-config/defaults/core-defaults.js +21 -326
  53. package/dist/src/prompt-config/defaults/core-defaults.js.map +1 -1
  54. package/dist/src/prompt-config/defaults/core.md +1 -1
  55. package/dist/src/prompt-config/defaults/provider-defaults.d.ts +1 -1
  56. package/dist/src/prompt-config/defaults/provider-defaults.js +16 -19
  57. package/dist/src/prompt-config/defaults/provider-defaults.js.map +1 -1
  58. package/dist/src/prompt-config/defaults/providers/gemini/models/gemini-2.5-flash/core.md +273 -10
  59. package/dist/src/prompt-config/defaults/providers/gemini/models/gemini-2.5-flash/gemini-2-5-flash/core.md +278 -0
  60. package/dist/src/prompt-config/defaults/tool-defaults.d.ts +1 -1
  61. package/dist/src/prompt-config/defaults/tool-defaults.js +27 -75
  62. package/dist/src/prompt-config/defaults/tool-defaults.js.map +1 -1
  63. package/dist/src/prompt-config/defaults/tools/read-file.md +1 -1
  64. package/dist/src/providers/BaseProvider.d.ts +149 -0
  65. package/dist/src/providers/BaseProvider.js +315 -0
  66. package/dist/src/providers/BaseProvider.js.map +1 -0
  67. package/dist/src/providers/IProvider.d.ts +1 -0
  68. package/dist/src/providers/LoggingProviderWrapper.d.ts +1 -0
  69. package/dist/src/providers/LoggingProviderWrapper.js +3 -0
  70. package/dist/src/providers/LoggingProviderWrapper.js.map +1 -1
  71. package/dist/src/providers/ProviderManager.d.ts +0 -1
  72. package/dist/src/providers/ProviderManager.js +23 -14
  73. package/dist/src/providers/ProviderManager.js.map +1 -1
  74. package/dist/src/providers/anthropic/AnthropicProvider.d.ts +20 -6
  75. package/dist/src/providers/anthropic/AnthropicProvider.js +173 -27
  76. package/dist/src/providers/anthropic/AnthropicProvider.js.map +1 -1
  77. package/dist/src/providers/gemini/GeminiProvider.d.ts +20 -7
  78. package/dist/src/providers/gemini/GeminiProvider.js +182 -147
  79. package/dist/src/providers/gemini/GeminiProvider.js.map +1 -1
  80. package/dist/src/providers/openai/OpenAIProvider.d.ts +53 -6
  81. package/dist/src/providers/openai/OpenAIProvider.js +373 -40
  82. package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
  83. package/dist/src/providers/openai/RESPONSES_API_MODELS.d.ts +1 -1
  84. package/dist/src/providers/openai/RESPONSES_API_MODELS.js +1 -0
  85. package/dist/src/providers/openai/RESPONSES_API_MODELS.js.map +1 -1
  86. package/dist/src/providers/openai/syntheticToolResponses.d.ts +52 -0
  87. package/dist/src/providers/openai/syntheticToolResponses.js +129 -0
  88. package/dist/src/providers/openai/syntheticToolResponses.js.map +1 -0
  89. package/dist/src/services/loopDetectionService.js +4 -5
  90. package/dist/src/services/loopDetectionService.js.map +1 -1
  91. package/dist/src/settings/SettingsService.d.ts +32 -0
  92. package/dist/src/settings/SettingsService.js +204 -0
  93. package/dist/src/settings/SettingsService.js.map +1 -0
  94. package/dist/src/settings/settingsServiceInstance.d.ts +12 -0
  95. package/dist/src/settings/settingsServiceInstance.js +24 -0
  96. package/dist/src/settings/settingsServiceInstance.js.map +1 -0
  97. package/dist/src/settings/types.d.ts +141 -0
  98. package/dist/src/settings/types.js +5 -0
  99. package/dist/src/settings/types.js.map +1 -0
  100. package/dist/src/tools/edit.js +6 -7
  101. package/dist/src/tools/edit.js.map +1 -1
  102. package/dist/src/tools/glob.js +7 -8
  103. package/dist/src/tools/glob.js.map +1 -1
  104. package/dist/src/tools/grep.js +6 -7
  105. package/dist/src/tools/grep.js.map +1 -1
  106. package/dist/src/tools/ls.js +9 -10
  107. package/dist/src/tools/ls.js.map +1 -1
  108. package/dist/src/tools/mcp-tool.d.ts +3 -8
  109. package/dist/src/tools/mcp-tool.js +5 -18
  110. package/dist/src/tools/mcp-tool.js.map +1 -1
  111. package/dist/src/tools/memoryTool.js +4 -5
  112. package/dist/src/tools/memoryTool.js.map +1 -1
  113. package/dist/src/tools/read-file.js +5 -6
  114. package/dist/src/tools/read-file.js.map +1 -1
  115. package/dist/src/tools/read-many-files.js +17 -18
  116. package/dist/src/tools/read-many-files.js.map +1 -1
  117. package/dist/src/tools/shell.js +8 -9
  118. package/dist/src/tools/shell.js.map +1 -1
  119. package/dist/src/tools/tool-registry.d.ts +1 -15
  120. package/dist/src/tools/tool-registry.js +4 -72
  121. package/dist/src/tools/tool-registry.js.map +1 -1
  122. package/dist/src/tools/tools.d.ts +6 -6
  123. package/dist/src/tools/tools.js +2 -2
  124. package/dist/src/tools/tools.js.map +1 -1
  125. package/dist/src/tools/web-fetch.js +3 -4
  126. package/dist/src/tools/web-fetch.js.map +1 -1
  127. package/dist/src/tools/web-search.js +3 -4
  128. package/dist/src/tools/web-search.js.map +1 -1
  129. package/dist/src/tools/write-file.js +4 -5
  130. package/dist/src/tools/write-file.js.map +1 -1
  131. package/dist/src/utils/editCorrector.js +8 -9
  132. package/dist/src/utils/editCorrector.js.map +1 -1
  133. package/dist/src/utils/nextSpeakerChecker.js +3 -4
  134. package/dist/src/utils/nextSpeakerChecker.js.map +1 -1
  135. package/dist/src/utils/schemaValidator.d.ts +1 -9
  136. package/dist/src/utils/schemaValidator.js +1 -109
  137. package/dist/src/utils/schemaValidator.js.map +1 -1
  138. package/package.json +4 -2
  139. package/dist/src/code_assist/converter.test.d.ts +0 -6
  140. package/dist/src/code_assist/converter.test.js +0 -279
  141. package/dist/src/code_assist/converter.test.js.map +0 -1
  142. package/dist/src/code_assist/oauth2.test.d.ts +0 -6
  143. package/dist/src/code_assist/oauth2.test.js +0 -370
  144. package/dist/src/code_assist/oauth2.test.js.map +0 -1
  145. package/dist/src/code_assist/server.test.d.ts +0 -6
  146. package/dist/src/code_assist/server.test.js +0 -134
  147. package/dist/src/code_assist/server.test.js.map +0 -1
  148. package/dist/src/code_assist/setup.test.d.ts +0 -6
  149. package/dist/src/code_assist/setup.test.js +0 -65
  150. package/dist/src/code_assist/setup.test.js.map +0 -1
  151. package/dist/src/config/config.alwaysAllow.test.d.ts +0 -6
  152. package/dist/src/config/config.alwaysAllow.test.js +0 -84
  153. package/dist/src/config/config.alwaysAllow.test.js.map +0 -1
  154. package/dist/src/config/config.ephemeral.test.d.ts +0 -6
  155. package/dist/src/config/config.ephemeral.test.js +0 -152
  156. package/dist/src/config/config.ephemeral.test.js.map +0 -1
  157. package/dist/src/config/config.test.d.ts +0 -6
  158. package/dist/src/config/config.test.js +0 -369
  159. package/dist/src/config/config.test.js.map +0 -1
  160. package/dist/src/config/flashFallback.test.d.ts +0 -6
  161. package/dist/src/config/flashFallback.test.js +0 -91
  162. package/dist/src/config/flashFallback.test.js.map +0 -1
  163. package/dist/src/core/client.test.d.ts +0 -6
  164. package/dist/src/core/client.test.js +0 -1322
  165. package/dist/src/core/client.test.js.map +0 -1
  166. package/dist/src/core/contentGenerator.test.d.ts +0 -6
  167. package/dist/src/core/contentGenerator.test.js +0 -103
  168. package/dist/src/core/contentGenerator.test.js.map +0 -1
  169. package/dist/src/core/coreToolScheduler.test.d.ts +0 -6
  170. package/dist/src/core/coreToolScheduler.test.js +0 -637
  171. package/dist/src/core/coreToolScheduler.test.js.map +0 -1
  172. package/dist/src/core/geminiChat.test.d.ts +0 -6
  173. package/dist/src/core/geminiChat.test.js +0 -425
  174. package/dist/src/core/geminiChat.test.js.map +0 -1
  175. package/dist/src/core/googleGenAIWrapper.test.d.ts +0 -6
  176. package/dist/src/core/googleGenAIWrapper.test.js +0 -104
  177. package/dist/src/core/googleGenAIWrapper.test.js.map +0 -1
  178. package/dist/src/core/logger.test.d.ts +0 -6
  179. package/dist/src/core/logger.test.js +0 -467
  180. package/dist/src/core/logger.test.js.map +0 -1
  181. package/dist/src/core/nonInteractiveToolExecutor.test.d.ts +0 -6
  182. package/dist/src/core/nonInteractiveToolExecutor.test.js +0 -165
  183. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +0 -1
  184. package/dist/src/core/prompts-async.test.d.ts +0 -6
  185. package/dist/src/core/prompts-async.test.js +0 -115
  186. package/dist/src/core/prompts-async.test.js.map +0 -1
  187. package/dist/src/core/prompts.test.d.ts +0 -6
  188. package/dist/src/core/prompts.test.js +0 -68
  189. package/dist/src/core/prompts.test.js.map +0 -1
  190. package/dist/src/core/subagent.test.d.ts +0 -6
  191. package/dist/src/core/subagent.test.js +0 -519
  192. package/dist/src/core/subagent.test.js.map +0 -1
  193. package/dist/src/core/tokenLimits.test.d.ts +0 -6
  194. package/dist/src/core/tokenLimits.test.js +0 -66
  195. package/dist/src/core/tokenLimits.test.js.map +0 -1
  196. package/dist/src/core/turn.test.d.ts +0 -6
  197. package/dist/src/core/turn.test.js +0 -366
  198. package/dist/src/core/turn.test.js.map +0 -1
  199. package/dist/src/hooks/tool-render-suppression-hook.test.d.ts +0 -6
  200. package/dist/src/hooks/tool-render-suppression-hook.test.js +0 -59
  201. package/dist/src/hooks/tool-render-suppression-hook.test.js.map +0 -1
  202. package/dist/src/ide/ide-installer.test.d.ts +0 -6
  203. package/dist/src/ide/ide-installer.test.js +0 -55
  204. package/dist/src/ide/ide-installer.test.js.map +0 -1
  205. package/dist/src/ide/ideContext.test.d.ts +0 -6
  206. package/dist/src/ide/ideContext.test.js +0 -265
  207. package/dist/src/ide/ideContext.test.js.map +0 -1
  208. package/dist/src/index.test.d.ts +0 -6
  209. package/dist/src/index.test.js +0 -12
  210. package/dist/src/index.test.js.map +0 -1
  211. package/dist/src/integration-tests/todo-system.test.d.ts +0 -6
  212. package/dist/src/integration-tests/todo-system.test.js +0 -46
  213. package/dist/src/integration-tests/todo-system.test.js.map +0 -1
  214. package/dist/src/mcp/google-auth-provider.test.d.ts +0 -6
  215. package/dist/src/mcp/google-auth-provider.test.js +0 -54
  216. package/dist/src/mcp/google-auth-provider.test.js.map +0 -1
  217. package/dist/src/mcp/oauth-provider.test.d.ts +0 -6
  218. package/dist/src/mcp/oauth-provider.test.js +0 -602
  219. package/dist/src/mcp/oauth-provider.test.js.map +0 -1
  220. package/dist/src/mcp/oauth-token-storage.test.d.ts +0 -6
  221. package/dist/src/mcp/oauth-token-storage.test.js +0 -205
  222. package/dist/src/mcp/oauth-token-storage.test.js.map +0 -1
  223. package/dist/src/mcp/oauth-utils.test.d.ts +0 -6
  224. package/dist/src/mcp/oauth-utils.test.js +0 -144
  225. package/dist/src/mcp/oauth-utils.test.js.map +0 -1
  226. package/dist/src/parsers/TextToolCallParser.multibyte.test.d.ts +0 -1
  227. package/dist/src/parsers/TextToolCallParser.multibyte.test.js +0 -42
  228. package/dist/src/parsers/TextToolCallParser.multibyte.test.js.map +0 -1
  229. package/dist/src/parsers/TextToolCallParser.test.d.ts +0 -1
  230. package/dist/src/parsers/TextToolCallParser.test.js +0 -225
  231. package/dist/src/parsers/TextToolCallParser.test.js.map +0 -1
  232. package/dist/src/prompt-config/TemplateEngine.test.d.ts +0 -1
  233. package/dist/src/prompt-config/TemplateEngine.test.js +0 -494
  234. package/dist/src/prompt-config/TemplateEngine.test.js.map +0 -1
  235. package/dist/src/prompt-config/prompt-cache.test.d.ts +0 -6
  236. package/dist/src/prompt-config/prompt-cache.test.js +0 -437
  237. package/dist/src/prompt-config/prompt-cache.test.js.map +0 -1
  238. package/dist/src/prompt-config/prompt-installer.test.d.ts +0 -7
  239. package/dist/src/prompt-config/prompt-installer.test.js +0 -503
  240. package/dist/src/prompt-config/prompt-installer.test.js.map +0 -1
  241. package/dist/src/prompt-config/prompt-loader.test.d.ts +0 -5
  242. package/dist/src/prompt-config/prompt-loader.test.js +0 -413
  243. package/dist/src/prompt-config/prompt-loader.test.js.map +0 -1
  244. package/dist/src/prompt-config/prompt-resolver.test.d.ts +0 -1
  245. package/dist/src/prompt-config/prompt-resolver.test.js +0 -529
  246. package/dist/src/prompt-config/prompt-resolver.test.js.map +0 -1
  247. package/dist/src/prompt-config/prompt-service.test.d.ts +0 -1
  248. package/dist/src/prompt-config/prompt-service.test.js +0 -811
  249. package/dist/src/prompt-config/prompt-service.test.js.map +0 -1
  250. package/dist/src/providers/ProviderManager.gemini-switch.test.d.ts +0 -6
  251. package/dist/src/providers/ProviderManager.gemini-switch.test.js +0 -57
  252. package/dist/src/providers/ProviderManager.gemini-switch.test.js.map +0 -1
  253. package/dist/src/providers/ProviderManager.test.d.ts +0 -6
  254. package/dist/src/providers/ProviderManager.test.js +0 -284
  255. package/dist/src/providers/ProviderManager.test.js.map +0 -1
  256. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.d.ts +0 -6
  257. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js +0 -273
  258. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js.map +0 -1
  259. package/dist/src/providers/anthropic/AnthropicProvider.modelParams.test.d.ts +0 -1
  260. package/dist/src/providers/anthropic/AnthropicProvider.modelParams.test.js +0 -48
  261. package/dist/src/providers/anthropic/AnthropicProvider.modelParams.test.js.map +0 -1
  262. package/dist/src/providers/anthropic/AnthropicProvider.test.d.ts +0 -1
  263. package/dist/src/providers/anthropic/AnthropicProvider.test.js +0 -487
  264. package/dist/src/providers/anthropic/AnthropicProvider.test.js.map +0 -1
  265. package/dist/src/providers/gemini/GeminiProvider.integration.test.d.ts +0 -6
  266. package/dist/src/providers/gemini/GeminiProvider.integration.test.js +0 -126
  267. package/dist/src/providers/gemini/GeminiProvider.integration.test.js.map +0 -1
  268. package/dist/src/providers/gemini/GeminiProvider.test.d.ts +0 -6
  269. package/dist/src/providers/gemini/GeminiProvider.test.js +0 -136
  270. package/dist/src/providers/gemini/GeminiProvider.test.js.map +0 -1
  271. package/dist/src/providers/integration/multi-provider.integration.test.d.ts +0 -6
  272. package/dist/src/providers/integration/multi-provider.integration.test.js +0 -292
  273. package/dist/src/providers/integration/multi-provider.integration.test.js.map +0 -1
  274. package/dist/src/providers/openai/ConversationCache.accumTokens.test.d.ts +0 -1
  275. package/dist/src/providers/openai/ConversationCache.accumTokens.test.js +0 -97
  276. package/dist/src/providers/openai/ConversationCache.accumTokens.test.js.map +0 -1
  277. package/dist/src/providers/openai/ConversationCache.test.d.ts +0 -1
  278. package/dist/src/providers/openai/ConversationCache.test.js +0 -113
  279. package/dist/src/providers/openai/ConversationCache.test.js.map +0 -1
  280. package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.d.ts +0 -1
  281. package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.js +0 -189
  282. package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.js.map +0 -1
  283. package/dist/src/providers/openai/OpenAIProvider.integration.test.d.ts +0 -6
  284. package/dist/src/providers/openai/OpenAIProvider.integration.test.js +0 -125
  285. package/dist/src/providers/openai/OpenAIProvider.integration.test.js.map +0 -1
  286. package/dist/src/providers/openai/OpenAIProvider.responses.test.d.ts +0 -1
  287. package/dist/src/providers/openai/OpenAIProvider.responses.test.js +0 -350
  288. package/dist/src/providers/openai/OpenAIProvider.responses.test.js.map +0 -1
  289. package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.d.ts +0 -1
  290. package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.js +0 -213
  291. package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.js.map +0 -1
  292. package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.d.ts +0 -1
  293. package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.js +0 -59
  294. package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.js.map +0 -1
  295. package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.d.ts +0 -6
  296. package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.js +0 -105
  297. package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.js.map +0 -1
  298. package/dist/src/providers/openai/OpenAIProvider.switch.test.d.ts +0 -1
  299. package/dist/src/providers/openai/OpenAIProvider.switch.test.js +0 -256
  300. package/dist/src/providers/openai/OpenAIProvider.switch.test.js.map +0 -1
  301. package/dist/src/providers/openai/OpenAIProvider.test.d.ts +0 -16
  302. package/dist/src/providers/openai/OpenAIProvider.test.js +0 -620
  303. package/dist/src/providers/openai/OpenAIProvider.test.js.map +0 -1
  304. package/dist/src/providers/openai/ResponsesContextTrim.integration.test.d.ts +0 -1
  305. package/dist/src/providers/openai/ResponsesContextTrim.integration.test.js +0 -210
  306. package/dist/src/providers/openai/ResponsesContextTrim.integration.test.js.map +0 -1
  307. package/dist/src/providers/openai/__tests__/formatArrayResponse.test.d.ts +0 -1
  308. package/dist/src/providers/openai/__tests__/formatArrayResponse.test.js +0 -65
  309. package/dist/src/providers/openai/__tests__/formatArrayResponse.test.js.map +0 -1
  310. package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.d.ts +0 -1
  311. package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.js +0 -129
  312. package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.js.map +0 -1
  313. package/dist/src/providers/openai/buildResponsesRequest.test.d.ts +0 -1
  314. package/dist/src/providers/openai/buildResponsesRequest.test.js +0 -406
  315. package/dist/src/providers/openai/buildResponsesRequest.test.js.map +0 -1
  316. package/dist/src/providers/openai/buildResponsesRequest.undefined.test.d.ts +0 -1
  317. package/dist/src/providers/openai/buildResponsesRequest.undefined.test.js +0 -50
  318. package/dist/src/providers/openai/buildResponsesRequest.undefined.test.js.map +0 -1
  319. package/dist/src/providers/openai/estimateRemoteTokens.test.d.ts +0 -1
  320. package/dist/src/providers/openai/estimateRemoteTokens.test.js +0 -125
  321. package/dist/src/providers/openai/estimateRemoteTokens.test.js.map +0 -1
  322. package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.d.ts +0 -1
  323. package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.js +0 -192
  324. package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.js.map +0 -1
  325. package/dist/src/providers/openai/parseResponsesStream.test.d.ts +0 -1
  326. package/dist/src/providers/openai/parseResponsesStream.test.js +0 -151
  327. package/dist/src/providers/openai/parseResponsesStream.test.js.map +0 -1
  328. package/dist/src/services/fileDiscoveryService.test.d.ts +0 -6
  329. package/dist/src/services/fileDiscoveryService.test.js +0 -143
  330. package/dist/src/services/fileDiscoveryService.test.js.map +0 -1
  331. package/dist/src/services/gitService.test.d.ts +0 -6
  332. package/dist/src/services/gitService.test.js +0 -209
  333. package/dist/src/services/gitService.test.js.map +0 -1
  334. package/dist/src/services/loopDetectionService.test.d.ts +0 -6
  335. package/dist/src/services/loopDetectionService.test.js +0 -484
  336. package/dist/src/services/loopDetectionService.test.js.map +0 -1
  337. package/dist/src/services/shellExecutionService.multibyte.test.d.ts +0 -6
  338. package/dist/src/services/shellExecutionService.multibyte.test.js +0 -72
  339. package/dist/src/services/shellExecutionService.multibyte.test.js.map +0 -1
  340. package/dist/src/services/shellExecutionService.test.d.ts +0 -6
  341. package/dist/src/services/shellExecutionService.test.js +0 -272
  342. package/dist/src/services/shellExecutionService.test.js.map +0 -1
  343. package/dist/src/services/shellExecutionService.windows.multibyte.test.d.ts +0 -6
  344. package/dist/src/services/shellExecutionService.windows.multibyte.test.js +0 -98
  345. package/dist/src/services/shellExecutionService.windows.multibyte.test.js.map +0 -1
  346. package/dist/src/services/shellExecutionService.windows.test.d.ts +0 -6
  347. package/dist/src/services/shellExecutionService.windows.test.js +0 -79
  348. package/dist/src/services/shellExecutionService.windows.test.js.map +0 -1
  349. package/dist/src/services/tool-call-tracker-service.test.d.ts +0 -6
  350. package/dist/src/services/tool-call-tracker-service.test.js +0 -99
  351. package/dist/src/services/tool-call-tracker-service.test.js.map +0 -1
  352. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +0 -6
  353. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +0 -187
  354. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +0 -1
  355. package/dist/src/telemetry/loggers.test.d.ts +0 -6
  356. package/dist/src/telemetry/loggers.test.js +0 -573
  357. package/dist/src/telemetry/loggers.test.js.map +0 -1
  358. package/dist/src/telemetry/metrics.test.d.ts +0 -6
  359. package/dist/src/telemetry/metrics.test.js +0 -212
  360. package/dist/src/telemetry/metrics.test.js.map +0 -1
  361. package/dist/src/telemetry/telemetry.test.d.ts +0 -6
  362. package/dist/src/telemetry/telemetry.test.js +0 -54
  363. package/dist/src/telemetry/telemetry.test.js.map +0 -1
  364. package/dist/src/telemetry/uiTelemetry.test.d.ts +0 -6
  365. package/dist/src/telemetry/uiTelemetry.test.js +0 -518
  366. package/dist/src/telemetry/uiTelemetry.test.js.map +0 -1
  367. package/dist/src/tools/ToolFormatter.test.d.ts +0 -16
  368. package/dist/src/tools/ToolFormatter.test.js +0 -349
  369. package/dist/src/tools/ToolFormatter.test.js.map +0 -1
  370. package/dist/src/tools/ToolFormatter.toResponsesTool.test.d.ts +0 -1
  371. package/dist/src/tools/ToolFormatter.toResponsesTool.test.js +0 -241
  372. package/dist/src/tools/ToolFormatter.toResponsesTool.test.js.map +0 -1
  373. package/dist/src/tools/diffOptions.test.d.ts +0 -6
  374. package/dist/src/tools/diffOptions.test.js +0 -119
  375. package/dist/src/tools/diffOptions.test.js.map +0 -1
  376. package/dist/src/tools/edit.test.d.ts +0 -6
  377. package/dist/src/tools/edit.test.js +0 -689
  378. package/dist/src/tools/edit.test.js.map +0 -1
  379. package/dist/src/tools/glob.test.d.ts +0 -6
  380. package/dist/src/tools/glob.test.js +0 -332
  381. package/dist/src/tools/glob.test.js.map +0 -1
  382. package/dist/src/tools/grep.test.d.ts +0 -6
  383. package/dist/src/tools/grep.test.js +0 -272
  384. package/dist/src/tools/grep.test.js.map +0 -1
  385. package/dist/src/tools/ls.test.d.ts +0 -6
  386. package/dist/src/tools/ls.test.js +0 -357
  387. package/dist/src/tools/ls.test.js.map +0 -1
  388. package/dist/src/tools/mcp-client.test.d.ts +0 -6
  389. package/dist/src/tools/mcp-client.test.js +0 -617
  390. package/dist/src/tools/mcp-client.test.js.map +0 -1
  391. package/dist/src/tools/mcp-tool.test.d.ts +0 -6
  392. package/dist/src/tools/mcp-tool.test.js +0 -501
  393. package/dist/src/tools/mcp-tool.test.js.map +0 -1
  394. package/dist/src/tools/memoryTool.test.d.ts +0 -6
  395. package/dist/src/tools/memoryTool.test.js +0 -266
  396. package/dist/src/tools/memoryTool.test.js.map +0 -1
  397. package/dist/src/tools/modifiable-tool.test.d.ts +0 -6
  398. package/dist/src/tools/modifiable-tool.test.js +0 -193
  399. package/dist/src/tools/modifiable-tool.test.js.map +0 -1
  400. package/dist/src/tools/read-file.test.d.ts +0 -6
  401. package/dist/src/tools/read-file.test.js +0 -319
  402. package/dist/src/tools/read-file.test.js.map +0 -1
  403. package/dist/src/tools/read-many-files.test.d.ts +0 -6
  404. package/dist/src/tools/read-many-files.test.js +0 -644
  405. package/dist/src/tools/read-many-files.test.js.map +0 -1
  406. package/dist/src/tools/shell.multibyte.test.d.ts +0 -6
  407. package/dist/src/tools/shell.multibyte.test.js +0 -75
  408. package/dist/src/tools/shell.multibyte.test.js.map +0 -1
  409. package/dist/src/tools/shell.test.d.ts +0 -6
  410. package/dist/src/tools/shell.test.js +0 -367
  411. package/dist/src/tools/shell.test.js.map +0 -1
  412. package/dist/src/tools/todo-pause.spec.d.ts +0 -6
  413. package/dist/src/tools/todo-pause.spec.js +0 -287
  414. package/dist/src/tools/todo-pause.spec.js.map +0 -1
  415. package/dist/src/tools/todo-read.test.d.ts +0 -6
  416. package/dist/src/tools/todo-read.test.js +0 -162
  417. package/dist/src/tools/todo-read.test.js.map +0 -1
  418. package/dist/src/tools/todo-schemas.test.d.ts +0 -6
  419. package/dist/src/tools/todo-schemas.test.js +0 -341
  420. package/dist/src/tools/todo-schemas.test.js.map +0 -1
  421. package/dist/src/tools/todo-store.test.d.ts +0 -6
  422. package/dist/src/tools/todo-store.test.js +0 -169
  423. package/dist/src/tools/todo-store.test.js.map +0 -1
  424. package/dist/src/tools/todo-write.test.d.ts +0 -6
  425. package/dist/src/tools/todo-write.test.js +0 -226
  426. package/dist/src/tools/todo-write.test.js.map +0 -1
  427. package/dist/src/tools/tool-registry.test.d.ts +0 -6
  428. package/dist/src/tools/tool-registry.test.js +0 -468
  429. package/dist/src/tools/tool-registry.test.js.map +0 -1
  430. package/dist/src/tools/tools.test.d.ts +0 -6
  431. package/dist/src/tools/tools.test.js +0 -117
  432. package/dist/src/tools/tools.test.js.map +0 -1
  433. package/dist/src/tools/web-fetch.integration.test.d.ts +0 -6
  434. package/dist/src/tools/web-fetch.integration.test.js +0 -532
  435. package/dist/src/tools/web-fetch.integration.test.js.map +0 -1
  436. package/dist/src/tools/web-search.test.d.ts +0 -6
  437. package/dist/src/tools/web-search.test.js +0 -230
  438. package/dist/src/tools/web-search.test.js.map +0 -1
  439. package/dist/src/tools/write-file.test.d.ts +0 -6
  440. package/dist/src/tools/write-file.test.js +0 -465
  441. package/dist/src/tools/write-file.test.js.map +0 -1
  442. package/dist/src/utils/bfsFileSearch.test.d.ts +0 -6
  443. package/dist/src/utils/bfsFileSearch.test.js +0 -191
  444. package/dist/src/utils/bfsFileSearch.test.js.map +0 -1
  445. package/dist/src/utils/editCorrector.test.d.ts +0 -6
  446. package/dist/src/utils/editCorrector.test.js +0 -564
  447. package/dist/src/utils/editCorrector.test.js.map +0 -1
  448. package/dist/src/utils/editor.test.d.ts +0 -6
  449. package/dist/src/utils/editor.test.js +0 -445
  450. package/dist/src/utils/editor.test.js.map +0 -1
  451. package/dist/src/utils/environmentContext.test.d.ts +0 -6
  452. package/dist/src/utils/environmentContext.test.js +0 -139
  453. package/dist/src/utils/environmentContext.test.js.map +0 -1
  454. package/dist/src/utils/errorReporting.test.d.ts +0 -6
  455. package/dist/src/utils/errorReporting.test.js +0 -130
  456. package/dist/src/utils/errorReporting.test.js.map +0 -1
  457. package/dist/src/utils/fileUtils.test.d.ts +0 -6
  458. package/dist/src/utils/fileUtils.test.js +0 -363
  459. package/dist/src/utils/fileUtils.test.js.map +0 -1
  460. package/dist/src/utils/filesearch/crawlCache.test.d.ts +0 -6
  461. package/dist/src/utils/filesearch/crawlCache.test.js +0 -103
  462. package/dist/src/utils/filesearch/crawlCache.test.js.map +0 -1
  463. package/dist/src/utils/filesearch/fileSearch.test.d.ts +0 -6
  464. package/dist/src/utils/filesearch/fileSearch.test.js +0 -654
  465. package/dist/src/utils/filesearch/fileSearch.test.js.map +0 -1
  466. package/dist/src/utils/filesearch/ignore.test.d.ts +0 -6
  467. package/dist/src/utils/filesearch/ignore.test.js +0 -57
  468. package/dist/src/utils/filesearch/ignore.test.js.map +0 -1
  469. package/dist/src/utils/filesearch/result-cache.test.d.ts +0 -6
  470. package/dist/src/utils/filesearch/result-cache.test.js +0 -47
  471. package/dist/src/utils/filesearch/result-cache.test.js.map +0 -1
  472. package/dist/src/utils/flashFallback.integration.test.d.ts +0 -6
  473. package/dist/src/utils/flashFallback.integration.test.js +0 -120
  474. package/dist/src/utils/flashFallback.integration.test.js.map +0 -1
  475. package/dist/src/utils/generateContentResponseUtilities.test.d.ts +0 -6
  476. package/dist/src/utils/generateContentResponseUtilities.test.js +0 -273
  477. package/dist/src/utils/generateContentResponseUtilities.test.js.map +0 -1
  478. package/dist/src/utils/getFolderStructure.test.d.ts +0 -6
  479. package/dist/src/utils/getFolderStructure.test.js +0 -282
  480. package/dist/src/utils/getFolderStructure.test.js.map +0 -1
  481. package/dist/src/utils/gitIgnoreParser.test.d.ts +0 -6
  482. package/dist/src/utils/gitIgnoreParser.test.js +0 -154
  483. package/dist/src/utils/gitIgnoreParser.test.js.map +0 -1
  484. package/dist/src/utils/memoryDiscovery.test.d.ts +0 -6
  485. package/dist/src/utils/memoryDiscovery.test.js +0 -181
  486. package/dist/src/utils/memoryDiscovery.test.js.map +0 -1
  487. package/dist/src/utils/memoryImportProcessor.test.d.ts +0 -6
  488. package/dist/src/utils/memoryImportProcessor.test.js +0 -715
  489. package/dist/src/utils/memoryImportProcessor.test.js.map +0 -1
  490. package/dist/src/utils/nextSpeakerChecker.test.d.ts +0 -6
  491. package/dist/src/utils/nextSpeakerChecker.test.js +0 -172
  492. package/dist/src/utils/nextSpeakerChecker.test.js.map +0 -1
  493. package/dist/src/utils/partUtils.test.d.ts +0 -6
  494. package/dist/src/utils/partUtils.test.js +0 -130
  495. package/dist/src/utils/partUtils.test.js.map +0 -1
  496. package/dist/src/utils/paths.test.d.ts +0 -6
  497. package/dist/src/utils/paths.test.js +0 -153
  498. package/dist/src/utils/paths.test.js.map +0 -1
  499. package/dist/src/utils/retry.test.d.ts +0 -6
  500. package/dist/src/utils/retry.test.js +0 -322
  501. package/dist/src/utils/retry.test.js.map +0 -1
  502. package/dist/src/utils/safeJsonStringify.test.d.ts +0 -6
  503. package/dist/src/utils/safeJsonStringify.test.js +0 -61
  504. package/dist/src/utils/safeJsonStringify.test.js.map +0 -1
  505. package/dist/src/utils/sanitization.test.d.ts +0 -6
  506. package/dist/src/utils/sanitization.test.js +0 -81
  507. package/dist/src/utils/sanitization.test.js.map +0 -1
  508. package/dist/src/utils/schemaValidator.test.d.ts +0 -6
  509. package/dist/src/utils/schemaValidator.test.js +0 -146
  510. package/dist/src/utils/schemaValidator.test.js.map +0 -1
  511. package/dist/src/utils/secure-browser-launcher.test.d.ts +0 -6
  512. package/dist/src/utils/secure-browser-launcher.test.js +0 -149
  513. package/dist/src/utils/secure-browser-launcher.test.js.map +0 -1
  514. package/dist/src/utils/shell-utils.shellReplacement.test.d.ts +0 -6
  515. package/dist/src/utils/shell-utils.shellReplacement.test.js +0 -149
  516. package/dist/src/utils/shell-utils.shellReplacement.test.js.map +0 -1
  517. package/dist/src/utils/shell-utils.test.d.ts +0 -6
  518. package/dist/src/utils/shell-utils.test.js +0 -200
  519. package/dist/src/utils/shell-utils.test.js.map +0 -1
  520. package/dist/src/utils/summarizer.test.d.ts +0 -6
  521. package/dist/src/utils/summarizer.test.js +0 -131
  522. package/dist/src/utils/summarizer.test.js.map +0 -1
  523. package/dist/src/utils/systemEncoding.test.d.ts +0 -6
  524. package/dist/src/utils/systemEncoding.test.js +0 -368
  525. package/dist/src/utils/systemEncoding.test.js.map +0 -1
  526. package/dist/src/utils/toolOutputLimiter.test.d.ts +0 -6
  527. package/dist/src/utils/toolOutputLimiter.test.js +0 -164
  528. package/dist/src/utils/toolOutputLimiter.test.js.map +0 -1
  529. package/dist/src/utils/unicodeUtils.test.d.ts +0 -6
  530. package/dist/src/utils/unicodeUtils.test.js +0 -120
  531. package/dist/src/utils/unicodeUtils.test.js.map +0 -1
  532. package/dist/src/utils/user_account.test.d.ts +0 -6
  533. package/dist/src/utils/user_account.test.js +0 -153
  534. package/dist/src/utils/user_account.test.js.map +0 -1
  535. package/dist/src/utils/user_id.test.d.ts +0 -6
  536. package/dist/src/utils/user_id.test.js +0 -21
  537. package/dist/src/utils/user_id.test.js.map +0 -1
  538. package/dist/src/utils/workspaceContext.test.d.ts +0 -6
  539. package/dist/src/utils/workspaceContext.test.js +0 -209
  540. 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,10 @@
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';
13
+ // IDE connection telemetry exports removed - telemetry disabled in llxprt
8
14
  //# 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;AAYpE,0EAA0E"}
@@ -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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"}