@anh3d0nic/qwen-code-termux-ice 21.1.0 → 21.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1279) hide show
  1. package/core-dist/index.d.ts +6 -0
  2. package/core-dist/index.js +7 -0
  3. package/core-dist/index.js.map +1 -0
  4. package/core-dist/src/__mocks__/fs/promises.d.ts +11 -0
  5. package/core-dist/src/__mocks__/fs/promises.js +17 -0
  6. package/core-dist/src/__mocks__/fs/promises.js.map +1 -0
  7. package/core-dist/src/config/config.d.ts +648 -0
  8. package/core-dist/src/config/config.js +1374 -0
  9. package/core-dist/src/config/config.js.map +1 -0
  10. package/core-dist/src/config/config.test.d.ts +6 -0
  11. package/core-dist/src/config/config.test.js +1116 -0
  12. package/core-dist/src/config/config.test.js.map +1 -0
  13. package/core-dist/src/config/constants.d.ts +11 -0
  14. package/core-dist/src/config/constants.js +16 -0
  15. package/core-dist/src/config/constants.js.map +1 -0
  16. package/core-dist/src/config/models.d.ts +9 -0
  17. package/core-dist/src/config/models.js +10 -0
  18. package/core-dist/src/config/models.js.map +1 -0
  19. package/core-dist/src/config/storage.d.ts +38 -0
  20. package/core-dist/src/config/storage.js +114 -0
  21. package/core-dist/src/config/storage.js.map +1 -0
  22. package/core-dist/src/config/storage.test.d.ts +6 -0
  23. package/core-dist/src/config/storage.test.js +36 -0
  24. package/core-dist/src/config/storage.test.js.map +1 -0
  25. package/core-dist/src/confirmation-bus/message-bus.d.ts +22 -0
  26. package/core-dist/src/confirmation-bus/message-bus.js +98 -0
  27. package/core-dist/src/confirmation-bus/message-bus.js.map +1 -0
  28. package/core-dist/src/confirmation-bus/types.d.ts +104 -0
  29. package/core-dist/src/confirmation-bus/types.js +16 -0
  30. package/core-dist/src/confirmation-bus/types.js.map +1 -0
  31. package/core-dist/src/core/__tests__/openaiTimeoutHandling.test.d.ts +6 -0
  32. package/core-dist/src/core/__tests__/openaiTimeoutHandling.test.js +298 -0
  33. package/core-dist/src/core/__tests__/openaiTimeoutHandling.test.js.map +1 -0
  34. package/core-dist/src/core/__tests__/orphanedToolCallsTest.d.ts +64 -0
  35. package/core-dist/src/core/__tests__/orphanedToolCallsTest.js +122 -0
  36. package/core-dist/src/core/__tests__/orphanedToolCallsTest.js.map +1 -0
  37. package/core-dist/src/core/anthropicContentGenerator/anthropicContentGenerator.d.ts +28 -0
  38. package/core-dist/src/core/anthropicContentGenerator/anthropicContentGenerator.js +349 -0
  39. package/core-dist/src/core/anthropicContentGenerator/anthropicContentGenerator.js.map +1 -0
  40. package/core-dist/src/core/anthropicContentGenerator/anthropicContentGenerator.test.d.ts +6 -0
  41. package/core-dist/src/core/anthropicContentGenerator/anthropicContentGenerator.test.js +396 -0
  42. package/core-dist/src/core/anthropicContentGenerator/anthropicContentGenerator.test.js.map +1 -0
  43. package/core-dist/src/core/anthropicContentGenerator/converter.d.ts +48 -0
  44. package/core-dist/src/core/anthropicContentGenerator/converter.js +449 -0
  45. package/core-dist/src/core/anthropicContentGenerator/converter.js.map +1 -0
  46. package/core-dist/src/core/anthropicContentGenerator/converter.test.d.ts +6 -0
  47. package/core-dist/src/core/anthropicContentGenerator/converter.test.js +843 -0
  48. package/core-dist/src/core/anthropicContentGenerator/converter.test.js.map +1 -0
  49. package/core-dist/src/core/anthropicContentGenerator/index.d.ts +9 -0
  50. package/core-dist/src/core/anthropicContentGenerator/index.js +11 -0
  51. package/core-dist/src/core/anthropicContentGenerator/index.js.map +1 -0
  52. package/core-dist/src/core/baseLlmClient.d.ts +48 -0
  53. package/core-dist/src/core/baseLlmClient.js +98 -0
  54. package/core-dist/src/core/baseLlmClient.js.map +1 -0
  55. package/core-dist/src/core/baseLlmClient.test.d.ts +6 -0
  56. package/core-dist/src/core/baseLlmClient.test.js +319 -0
  57. package/core-dist/src/core/baseLlmClient.test.js.map +1 -0
  58. package/core-dist/src/core/client.d.ts +48 -0
  59. package/core-dist/src/core/client.js +547 -0
  60. package/core-dist/src/core/client.js.map +1 -0
  61. package/core-dist/src/core/client.test.d.ts +6 -0
  62. package/core-dist/src/core/client.test.js +1885 -0
  63. package/core-dist/src/core/client.test.js.map +1 -0
  64. package/core-dist/src/core/contentGenerator.d.ts +100 -0
  65. package/core-dist/src/core/contentGenerator.js +162 -0
  66. package/core-dist/src/core/contentGenerator.js.map +1 -0
  67. package/core-dist/src/core/contentGenerator.test.d.ts +6 -0
  68. package/core-dist/src/core/contentGenerator.test.js +95 -0
  69. package/core-dist/src/core/contentGenerator.test.js.map +1 -0
  70. package/core-dist/src/core/coreToolScheduler.d.ts +142 -0
  71. package/core-dist/src/core/coreToolScheduler.js +872 -0
  72. package/core-dist/src/core/coreToolScheduler.js.map +1 -0
  73. package/core-dist/src/core/coreToolScheduler.test.d.ts +6 -0
  74. package/core-dist/src/core/coreToolScheduler.test.js +2221 -0
  75. package/core-dist/src/core/coreToolScheduler.test.js.map +1 -0
  76. package/core-dist/src/core/geminiChat.d.ts +122 -0
  77. package/core-dist/src/core/geminiChat.js +571 -0
  78. package/core-dist/src/core/geminiChat.js.map +1 -0
  79. package/core-dist/src/core/geminiChat.test.d.ts +6 -0
  80. package/core-dist/src/core/geminiChat.test.js +1276 -0
  81. package/core-dist/src/core/geminiChat.test.js.map +1 -0
  82. package/core-dist/src/core/geminiContentGenerator/geminiContentGenerator.d.ts +38 -0
  83. package/core-dist/src/core/geminiContentGenerator/geminiContentGenerator.js +193 -0
  84. package/core-dist/src/core/geminiContentGenerator/geminiContentGenerator.js.map +1 -0
  85. package/core-dist/src/core/geminiContentGenerator/geminiContentGenerator.test.d.ts +6 -0
  86. package/core-dist/src/core/geminiContentGenerator/geminiContentGenerator.test.js +304 -0
  87. package/core-dist/src/core/geminiContentGenerator/geminiContentGenerator.test.js.map +1 -0
  88. package/core-dist/src/core/geminiContentGenerator/index.d.ts +12 -0
  89. package/core-dist/src/core/geminiContentGenerator/index.js +36 -0
  90. package/core-dist/src/core/geminiContentGenerator/index.js.map +1 -0
  91. package/core-dist/src/core/geminiContentGenerator/index.test.d.ts +6 -0
  92. package/core-dist/src/core/geminiContentGenerator/index.test.js +34 -0
  93. package/core-dist/src/core/geminiContentGenerator/index.test.js.map +1 -0
  94. package/core-dist/src/core/geminiRequest.d.ts +13 -0
  95. package/core-dist/src/core/geminiRequest.js +11 -0
  96. package/core-dist/src/core/geminiRequest.js.map +1 -0
  97. package/core-dist/src/core/geminiRequest.test.d.ts +6 -0
  98. package/core-dist/src/core/geminiRequest.test.js +73 -0
  99. package/core-dist/src/core/geminiRequest.test.js.map +1 -0
  100. package/core-dist/src/core/logger.d.ts +68 -0
  101. package/core-dist/src/core/logger.js +364 -0
  102. package/core-dist/src/core/logger.js.map +1 -0
  103. package/core-dist/src/core/logger.test.d.ts +6 -0
  104. package/core-dist/src/core/logger.test.js +520 -0
  105. package/core-dist/src/core/logger.test.js.map +1 -0
  106. package/core-dist/src/core/loggingContentGenerator/index.d.ts +6 -0
  107. package/core-dist/src/core/loggingContentGenerator/index.js +7 -0
  108. package/core-dist/src/core/loggingContentGenerator/index.js.map +1 -0
  109. package/core-dist/src/core/loggingContentGenerator/loggingContentGenerator.d.ts +36 -0
  110. package/core-dist/src/core/loggingContentGenerator/loggingContentGenerator.js +321 -0
  111. package/core-dist/src/core/loggingContentGenerator/loggingContentGenerator.js.map +1 -0
  112. package/core-dist/src/core/loggingContentGenerator/loggingContentGenerator.test.d.ts +6 -0
  113. package/core-dist/src/core/loggingContentGenerator/loggingContentGenerator.test.js +287 -0
  114. package/core-dist/src/core/loggingContentGenerator/loggingContentGenerator.test.js.map +1 -0
  115. package/core-dist/src/core/modalityDefaults.d.ts +14 -0
  116. package/core-dist/src/core/modalityDefaults.js +81 -0
  117. package/core-dist/src/core/modalityDefaults.js.map +1 -0
  118. package/core-dist/src/core/modalityDefaults.test.d.ts +6 -0
  119. package/core-dist/src/core/modalityDefaults.test.js +181 -0
  120. package/core-dist/src/core/modalityDefaults.test.js.map +1 -0
  121. package/core-dist/src/core/nonInteractiveToolExecutor.d.ts +16 -0
  122. package/core-dist/src/core/nonInteractiveToolExecutor.js +30 -0
  123. package/core-dist/src/core/nonInteractiveToolExecutor.js.map +1 -0
  124. package/core-dist/src/core/nonInteractiveToolExecutor.test.d.ts +6 -0
  125. package/core-dist/src/core/nonInteractiveToolExecutor.test.js +296 -0
  126. package/core-dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -0
  127. package/core-dist/src/core/openaiContentGenerator/constants.d.ts +6 -0
  128. package/core-dist/src/core/openaiContentGenerator/constants.js +7 -0
  129. package/core-dist/src/core/openaiContentGenerator/constants.js.map +1 -0
  130. package/core-dist/src/core/openaiContentGenerator/converter.d.ts +133 -0
  131. package/core-dist/src/core/openaiContentGenerator/converter.js +1020 -0
  132. package/core-dist/src/core/openaiContentGenerator/converter.js.map +1 -0
  133. package/core-dist/src/core/openaiContentGenerator/converter.test.d.ts +6 -0
  134. package/core-dist/src/core/openaiContentGenerator/converter.test.js +1966 -0
  135. package/core-dist/src/core/openaiContentGenerator/converter.test.js.map +1 -0
  136. package/core-dist/src/core/openaiContentGenerator/errorHandler.d.ts +27 -0
  137. package/core-dist/src/core/openaiContentGenerator/errorHandler.js +84 -0
  138. package/core-dist/src/core/openaiContentGenerator/errorHandler.js.map +1 -0
  139. package/core-dist/src/core/openaiContentGenerator/errorHandler.test.d.ts +6 -0
  140. package/core-dist/src/core/openaiContentGenerator/errorHandler.test.js +267 -0
  141. package/core-dist/src/core/openaiContentGenerator/errorHandler.test.js.map +1 -0
  142. package/core-dist/src/core/openaiContentGenerator/index.d.ts +21 -0
  143. package/core-dist/src/core/openaiContentGenerator/index.js +43 -0
  144. package/core-dist/src/core/openaiContentGenerator/index.js.map +1 -0
  145. package/core-dist/src/core/openaiContentGenerator/openaiContentGenerator.d.ts +22 -0
  146. package/core-dist/src/core/openaiContentGenerator/openaiContentGenerator.js +117 -0
  147. package/core-dist/src/core/openaiContentGenerator/openaiContentGenerator.js.map +1 -0
  148. package/core-dist/src/core/openaiContentGenerator/openaiContentGenerator.test.d.ts +6 -0
  149. package/core-dist/src/core/openaiContentGenerator/openaiContentGenerator.test.js +298 -0
  150. package/core-dist/src/core/openaiContentGenerator/openaiContentGenerator.test.js.map +1 -0
  151. package/core-dist/src/core/openaiContentGenerator/pipeline.d.ts +74 -0
  152. package/core-dist/src/core/openaiContentGenerator/pipeline.js +327 -0
  153. package/core-dist/src/core/openaiContentGenerator/pipeline.js.map +1 -0
  154. package/core-dist/src/core/openaiContentGenerator/pipeline.test.d.ts +6 -0
  155. package/core-dist/src/core/openaiContentGenerator/pipeline.test.js +1143 -0
  156. package/core-dist/src/core/openaiContentGenerator/pipeline.test.js.map +1 -0
  157. package/core-dist/src/core/openaiContentGenerator/provider/README.md +61 -0
  158. package/core-dist/src/core/openaiContentGenerator/provider/dashscope.d.ts +70 -0
  159. package/core-dist/src/core/openaiContentGenerator/provider/dashscope.js +258 -0
  160. package/core-dist/src/core/openaiContentGenerator/provider/dashscope.js.map +1 -0
  161. package/core-dist/src/core/openaiContentGenerator/provider/dashscope.test.d.ts +6 -0
  162. package/core-dist/src/core/openaiContentGenerator/provider/dashscope.test.js +781 -0
  163. package/core-dist/src/core/openaiContentGenerator/provider/dashscope.test.js.map +1 -0
  164. package/core-dist/src/core/openaiContentGenerator/provider/deepseek.d.ts +14 -0
  165. package/core-dist/src/core/openaiContentGenerator/provider/deepseek.js +21 -0
  166. package/core-dist/src/core/openaiContentGenerator/provider/deepseek.js.map +1 -0
  167. package/core-dist/src/core/openaiContentGenerator/provider/deepseek.test.d.ts +6 -0
  168. package/core-dist/src/core/openaiContentGenerator/provider/deepseek.test.js +51 -0
  169. package/core-dist/src/core/openaiContentGenerator/provider/deepseek.test.js.map +1 -0
  170. package/core-dist/src/core/openaiContentGenerator/provider/default.d.ts +17 -0
  171. package/core-dist/src/core/openaiContentGenerator/provider/default.js +52 -0
  172. package/core-dist/src/core/openaiContentGenerator/provider/default.js.map +1 -0
  173. package/core-dist/src/core/openaiContentGenerator/provider/default.test.d.ts +6 -0
  174. package/core-dist/src/core/openaiContentGenerator/provider/default.test.js +227 -0
  175. package/core-dist/src/core/openaiContentGenerator/provider/default.test.js.map +1 -0
  176. package/core-dist/src/core/openaiContentGenerator/provider/index.d.ts +6 -0
  177. package/core-dist/src/core/openaiContentGenerator/provider/index.js +6 -0
  178. package/core-dist/src/core/openaiContentGenerator/provider/index.js.map +1 -0
  179. package/core-dist/src/core/openaiContentGenerator/provider/modelscope.d.ts +17 -0
  180. package/core-dist/src/core/openaiContentGenerator/provider/modelscope.js +25 -0
  181. package/core-dist/src/core/openaiContentGenerator/provider/modelscope.js.map +1 -0
  182. package/core-dist/src/core/openaiContentGenerator/provider/modelscope.test.d.ts +6 -0
  183. package/core-dist/src/core/openaiContentGenerator/provider/modelscope.test.js +66 -0
  184. package/core-dist/src/core/openaiContentGenerator/provider/modelscope.test.js.map +1 -0
  185. package/core-dist/src/core/openaiContentGenerator/provider/openrouter.d.ts +8 -0
  186. package/core-dist/src/core/openaiContentGenerator/provider/openrouter.js +21 -0
  187. package/core-dist/src/core/openaiContentGenerator/provider/openrouter.js.map +1 -0
  188. package/core-dist/src/core/openaiContentGenerator/provider/openrouter.test.d.ts +6 -0
  189. package/core-dist/src/core/openaiContentGenerator/provider/openrouter.test.js +152 -0
  190. package/core-dist/src/core/openaiContentGenerator/provider/openrouter.test.js.map +1 -0
  191. package/core-dist/src/core/openaiContentGenerator/provider/types.d.ts +26 -0
  192. package/core-dist/src/core/openaiContentGenerator/provider/types.js +2 -0
  193. package/core-dist/src/core/openaiContentGenerator/provider/types.js.map +1 -0
  194. package/core-dist/src/core/openaiContentGenerator/streamingToolCallParser.d.ts +157 -0
  195. package/core-dist/src/core/openaiContentGenerator/streamingToolCallParser.js +390 -0
  196. package/core-dist/src/core/openaiContentGenerator/streamingToolCallParser.js.map +1 -0
  197. package/core-dist/src/core/openaiContentGenerator/streamingToolCallParser.test.d.ts +6 -0
  198. package/core-dist/src/core/openaiContentGenerator/streamingToolCallParser.test.js +585 -0
  199. package/core-dist/src/core/openaiContentGenerator/streamingToolCallParser.test.js.map +1 -0
  200. package/core-dist/src/core/prompts.d.ts +81 -0
  201. package/core-dist/src/core/prompts.js +996 -0
  202. package/core-dist/src/core/prompts.js.map +1 -0
  203. package/core-dist/src/core/prompts.test.d.ts +6 -0
  204. package/core-dist/src/core/prompts.test.js +485 -0
  205. package/core-dist/src/core/prompts.test.js.map +1 -0
  206. package/core-dist/src/core/tokenLimits.d.ts +29 -0
  207. package/core-dist/src/core/tokenLimits.js +171 -0
  208. package/core-dist/src/core/tokenLimits.js.map +1 -0
  209. package/core-dist/src/core/tokenLimits.test.d.ts +1 -0
  210. package/core-dist/src/core/tokenLimits.test.js +270 -0
  211. package/core-dist/src/core/tokenLimits.test.js.map +1 -0
  212. package/core-dist/src/core/turn.d.ts +161 -0
  213. package/core-dist/src/core/turn.js +197 -0
  214. package/core-dist/src/core/turn.js.map +1 -0
  215. package/core-dist/src/core/turn.test.d.ts +6 -0
  216. package/core-dist/src/core/turn.test.js +817 -0
  217. package/core-dist/src/core/turn.test.js.map +1 -0
  218. package/core-dist/src/extension/claude-converter.d.ts +121 -0
  219. package/core-dist/src/extension/claude-converter.js +572 -0
  220. package/core-dist/src/extension/claude-converter.js.map +1 -0
  221. package/core-dist/src/extension/claude-converter.test.d.ts +6 -0
  222. package/core-dist/src/extension/claude-converter.test.js +305 -0
  223. package/core-dist/src/extension/claude-converter.test.js.map +1 -0
  224. package/core-dist/src/extension/extensionManager.d.ts +159 -0
  225. package/core-dist/src/extension/extensionManager.js +829 -0
  226. package/core-dist/src/extension/extensionManager.js.map +1 -0
  227. package/core-dist/src/extension/extensionManager.test.d.ts +6 -0
  228. package/core-dist/src/extension/extensionManager.test.js +598 -0
  229. package/core-dist/src/extension/extensionManager.test.js.map +1 -0
  230. package/core-dist/src/extension/extensionSettings.d.ts +33 -0
  231. package/core-dist/src/extension/extensionSettings.js +186 -0
  232. package/core-dist/src/extension/extensionSettings.js.map +1 -0
  233. package/core-dist/src/extension/extensionSettings.test.d.ts +1 -0
  234. package/core-dist/src/extension/extensionSettings.test.js +488 -0
  235. package/core-dist/src/extension/extensionSettings.test.js.map +1 -0
  236. package/core-dist/src/extension/gemini-converter.d.ts +47 -0
  237. package/core-dist/src/extension/gemini-converter.js +185 -0
  238. package/core-dist/src/extension/gemini-converter.js.map +1 -0
  239. package/core-dist/src/extension/gemini-converter.test.d.ts +6 -0
  240. package/core-dist/src/extension/gemini-converter.test.js +128 -0
  241. package/core-dist/src/extension/gemini-converter.test.js.map +1 -0
  242. package/core-dist/src/extension/github.d.ts +30 -0
  243. package/core-dist/src/extension/github.js +330 -0
  244. package/core-dist/src/extension/github.js.map +1 -0
  245. package/core-dist/src/extension/github.test.d.ts +6 -0
  246. package/core-dist/src/extension/github.test.js +376 -0
  247. package/core-dist/src/extension/github.test.js.map +1 -0
  248. package/core-dist/src/extension/index.d.ts +6 -0
  249. package/core-dist/src/extension/index.js +7 -0
  250. package/core-dist/src/extension/index.js.map +1 -0
  251. package/core-dist/src/extension/marketplace.d.ts +19 -0
  252. package/core-dist/src/extension/marketplace.js +222 -0
  253. package/core-dist/src/extension/marketplace.js.map +1 -0
  254. package/core-dist/src/extension/marketplace.test.d.ts +6 -0
  255. package/core-dist/src/extension/marketplace.test.js +215 -0
  256. package/core-dist/src/extension/marketplace.test.js.map +1 -0
  257. package/core-dist/src/extension/override.d.ts +25 -0
  258. package/core-dist/src/extension/override.js +82 -0
  259. package/core-dist/src/extension/override.js.map +1 -0
  260. package/core-dist/src/extension/override.test.d.ts +6 -0
  261. package/core-dist/src/extension/override.test.js +94 -0
  262. package/core-dist/src/extension/override.test.js.map +1 -0
  263. package/core-dist/src/extension/settings.d.ts +39 -0
  264. package/core-dist/src/extension/settings.js +116 -0
  265. package/core-dist/src/extension/settings.js.map +1 -0
  266. package/core-dist/src/extension/settings.test.d.ts +6 -0
  267. package/core-dist/src/extension/settings.test.js +125 -0
  268. package/core-dist/src/extension/settings.test.js.map +1 -0
  269. package/core-dist/src/extension/storage.d.ts +9 -0
  270. package/core-dist/src/extension/storage.js +38 -0
  271. package/core-dist/src/extension/storage.js.map +1 -0
  272. package/core-dist/src/extension/storage.test.d.ts +6 -0
  273. package/core-dist/src/extension/storage.test.js +64 -0
  274. package/core-dist/src/extension/storage.test.js.map +1 -0
  275. package/core-dist/src/extension/variableSchema.d.ts +40 -0
  276. package/core-dist/src/extension/variableSchema.js +26 -0
  277. package/core-dist/src/extension/variableSchema.js.map +1 -0
  278. package/core-dist/src/extension/variables.d.ts +21 -0
  279. package/core-dist/src/extension/variables.js +46 -0
  280. package/core-dist/src/extension/variables.js.map +1 -0
  281. package/core-dist/src/extension/variables.test.d.ts +6 -0
  282. package/core-dist/src/extension/variables.test.js +17 -0
  283. package/core-dist/src/extension/variables.test.js.map +1 -0
  284. package/core-dist/src/hooks/hookAggregator.d.ts +66 -0
  285. package/core-dist/src/hooks/hookAggregator.js +280 -0
  286. package/core-dist/src/hooks/hookAggregator.js.map +1 -0
  287. package/core-dist/src/hooks/hookAggregator.test.d.ts +6 -0
  288. package/core-dist/src/hooks/hookAggregator.test.js +449 -0
  289. package/core-dist/src/hooks/hookAggregator.test.js.map +1 -0
  290. package/core-dist/src/hooks/hookEventHandler.d.ts +42 -0
  291. package/core-dist/src/hooks/hookEventHandler.js +127 -0
  292. package/core-dist/src/hooks/hookEventHandler.js.map +1 -0
  293. package/core-dist/src/hooks/hookEventHandler.test.d.ts +6 -0
  294. package/core-dist/src/hooks/hookEventHandler.test.js +183 -0
  295. package/core-dist/src/hooks/hookEventHandler.test.js.map +1 -0
  296. package/core-dist/src/hooks/hookPlanner.d.ts +42 -0
  297. package/core-dist/src/hooks/hookPlanner.js +101 -0
  298. package/core-dist/src/hooks/hookPlanner.js.map +1 -0
  299. package/core-dist/src/hooks/hookPlanner.test.d.ts +6 -0
  300. package/core-dist/src/hooks/hookPlanner.test.js +303 -0
  301. package/core-dist/src/hooks/hookPlanner.test.js.map +1 -0
  302. package/core-dist/src/hooks/hookRegistry.d.ts +106 -0
  303. package/core-dist/src/hooks/hookRegistry.js +225 -0
  304. package/core-dist/src/hooks/hookRegistry.js.map +1 -0
  305. package/core-dist/src/hooks/hookRegistry.test.d.ts +6 -0
  306. package/core-dist/src/hooks/hookRegistry.test.js +539 -0
  307. package/core-dist/src/hooks/hookRegistry.test.js.map +1 -0
  308. package/core-dist/src/hooks/hookRunner.d.ts +40 -0
  309. package/core-dist/src/hooks/hookRunner.js +318 -0
  310. package/core-dist/src/hooks/hookRunner.js.map +1 -0
  311. package/core-dist/src/hooks/hookRunner.test.d.ts +6 -0
  312. package/core-dist/src/hooks/hookRunner.test.js +466 -0
  313. package/core-dist/src/hooks/hookRunner.test.js.map +1 -0
  314. package/core-dist/src/hooks/hookSystem.d.ts +43 -0
  315. package/core-dist/src/hooks/hookSystem.js +75 -0
  316. package/core-dist/src/hooks/hookSystem.js.map +1 -0
  317. package/core-dist/src/hooks/hookSystem.test.d.ts +6 -0
  318. package/core-dist/src/hooks/hookSystem.test.js +237 -0
  319. package/core-dist/src/hooks/hookSystem.test.js.map +1 -0
  320. package/core-dist/src/hooks/index.d.ts +16 -0
  321. package/core-dist/src/hooks/index.js +16 -0
  322. package/core-dist/src/hooks/index.js.map +1 -0
  323. package/core-dist/src/hooks/trustedHooks.d.ts +28 -0
  324. package/core-dist/src/hooks/trustedHooks.js +91 -0
  325. package/core-dist/src/hooks/trustedHooks.js.map +1 -0
  326. package/core-dist/src/hooks/types.d.ts +498 -0
  327. package/core-dist/src/hooks/types.js +292 -0
  328. package/core-dist/src/hooks/types.js.map +1 -0
  329. package/core-dist/src/ide/constants.d.ts +9 -0
  330. package/core-dist/src/ide/constants.js +10 -0
  331. package/core-dist/src/ide/constants.js.map +1 -0
  332. package/core-dist/src/ide/detect-ide.d.ts +56 -0
  333. package/core-dist/src/ide/detect-ide.js +68 -0
  334. package/core-dist/src/ide/detect-ide.js.map +1 -0
  335. package/core-dist/src/ide/detect-ide.test.d.ts +6 -0
  336. package/core-dist/src/ide/detect-ide.test.js +113 -0
  337. package/core-dist/src/ide/detect-ide.test.js.map +1 -0
  338. package/core-dist/src/ide/ide-client.d.ts +132 -0
  339. package/core-dist/src/ide/ide-client.js +750 -0
  340. package/core-dist/src/ide/ide-client.js.map +1 -0
  341. package/core-dist/src/ide/ide-client.test.d.ts +6 -0
  342. package/core-dist/src/ide/ide-client.test.js +463 -0
  343. package/core-dist/src/ide/ide-client.test.js.map +1 -0
  344. package/core-dist/src/ide/ide-installer.d.ts +14 -0
  345. package/core-dist/src/ide/ide-installer.js +112 -0
  346. package/core-dist/src/ide/ide-installer.js.map +1 -0
  347. package/core-dist/src/ide/ide-installer.test.d.ts +6 -0
  348. package/core-dist/src/ide/ide-installer.test.js +134 -0
  349. package/core-dist/src/ide/ide-installer.test.js.map +1 -0
  350. package/core-dist/src/ide/ideContext.d.ts +44 -0
  351. package/core-dist/src/ide/ideContext.js +101 -0
  352. package/core-dist/src/ide/ideContext.js.map +1 -0
  353. package/core-dist/src/ide/ideContext.test.d.ts +6 -0
  354. package/core-dist/src/ide/ideContext.test.js +393 -0
  355. package/core-dist/src/ide/ideContext.test.js.map +1 -0
  356. package/core-dist/src/ide/process-utils.d.ts +21 -0
  357. package/core-dist/src/ide/process-utils.js +170 -0
  358. package/core-dist/src/ide/process-utils.js.map +1 -0
  359. package/core-dist/src/ide/process-utils.test.d.ts +6 -0
  360. package/core-dist/src/ide/process-utils.test.js +130 -0
  361. package/core-dist/src/ide/process-utils.test.js.map +1 -0
  362. package/core-dist/src/ide/types.d.ts +486 -0
  363. package/core-dist/src/ide/types.js +138 -0
  364. package/core-dist/src/ide/types.js.map +1 -0
  365. package/core-dist/src/index.d.ts +179 -0
  366. package/core-dist/src/index.js +225 -0
  367. package/core-dist/src/index.js.map +1 -0
  368. package/core-dist/src/index.test.d.ts +6 -0
  369. package/core-dist/src/index.test.js +12 -0
  370. package/core-dist/src/index.test.js.map +1 -0
  371. package/core-dist/src/lsp/LspConfigLoader.d.ts +46 -0
  372. package/core-dist/src/lsp/LspConfigLoader.js +381 -0
  373. package/core-dist/src/lsp/LspConfigLoader.js.map +1 -0
  374. package/core-dist/src/lsp/LspConfigLoader.test.d.ts +6 -0
  375. package/core-dist/src/lsp/LspConfigLoader.test.js +80 -0
  376. package/core-dist/src/lsp/LspConfigLoader.test.js.map +1 -0
  377. package/core-dist/src/lsp/LspConnectionFactory.d.ts +62 -0
  378. package/core-dist/src/lsp/LspConnectionFactory.js +305 -0
  379. package/core-dist/src/lsp/LspConnectionFactory.js.map +1 -0
  380. package/core-dist/src/lsp/LspLanguageDetector.d.ts +39 -0
  381. package/core-dist/src/lsp/LspLanguageDetector.js +199 -0
  382. package/core-dist/src/lsp/LspLanguageDetector.js.map +1 -0
  383. package/core-dist/src/lsp/LspResponseNormalizer.d.ts +122 -0
  384. package/core-dist/src/lsp/LspResponseNormalizer.js +710 -0
  385. package/core-dist/src/lsp/LspResponseNormalizer.js.map +1 -0
  386. package/core-dist/src/lsp/LspServerManager.d.ts +87 -0
  387. package/core-dist/src/lsp/LspServerManager.js +563 -0
  388. package/core-dist/src/lsp/LspServerManager.js.map +1 -0
  389. package/core-dist/src/lsp/NativeLspClient.d.ts +149 -0
  390. package/core-dist/src/lsp/NativeLspClient.js +169 -0
  391. package/core-dist/src/lsp/NativeLspClient.js.map +1 -0
  392. package/core-dist/src/lsp/NativeLspService.d.ts +106 -0
  393. package/core-dist/src/lsp/NativeLspService.integration.test.d.ts +6 -0
  394. package/core-dist/src/lsp/NativeLspService.integration.test.js +663 -0
  395. package/core-dist/src/lsp/NativeLspService.integration.test.js.map +1 -0
  396. package/core-dist/src/lsp/NativeLspService.js +623 -0
  397. package/core-dist/src/lsp/NativeLspService.js.map +1 -0
  398. package/core-dist/src/lsp/NativeLspService.test.d.ts +6 -0
  399. package/core-dist/src/lsp/NativeLspService.test.js +99 -0
  400. package/core-dist/src/lsp/NativeLspService.test.js.map +1 -0
  401. package/core-dist/src/lsp/constants.d.ts +35 -0
  402. package/core-dist/src/lsp/constants.js +86 -0
  403. package/core-dist/src/lsp/constants.js.map +1 -0
  404. package/core-dist/src/lsp/types.d.ts +409 -0
  405. package/core-dist/src/lsp/types.js +7 -0
  406. package/core-dist/src/lsp/types.js.map +1 -0
  407. package/core-dist/src/mcp/constants.d.ts +22 -0
  408. package/core-dist/src/mcp/constants.js +23 -0
  409. package/core-dist/src/mcp/constants.js.map +1 -0
  410. package/core-dist/src/mcp/google-auth-provider.d.ts +23 -0
  411. package/core-dist/src/mcp/google-auth-provider.js +75 -0
  412. package/core-dist/src/mcp/google-auth-provider.js.map +1 -0
  413. package/core-dist/src/mcp/google-auth-provider.test.d.ts +6 -0
  414. package/core-dist/src/mcp/google-auth-provider.test.js +89 -0
  415. package/core-dist/src/mcp/google-auth-provider.test.js.map +1 -0
  416. package/core-dist/src/mcp/oauth-provider.d.ts +150 -0
  417. package/core-dist/src/mcp/oauth-provider.js +617 -0
  418. package/core-dist/src/mcp/oauth-provider.js.map +1 -0
  419. package/core-dist/src/mcp/oauth-provider.test.d.ts +6 -0
  420. package/core-dist/src/mcp/oauth-provider.test.js +917 -0
  421. package/core-dist/src/mcp/oauth-provider.test.js.map +1 -0
  422. package/core-dist/src/mcp/oauth-token-storage.d.ts +65 -0
  423. package/core-dist/src/mcp/oauth-token-storage.js +182 -0
  424. package/core-dist/src/mcp/oauth-token-storage.js.map +1 -0
  425. package/core-dist/src/mcp/oauth-token-storage.test.d.ts +6 -0
  426. package/core-dist/src/mcp/oauth-token-storage.test.js +307 -0
  427. package/core-dist/src/mcp/oauth-token-storage.test.js.map +1 -0
  428. package/core-dist/src/mcp/oauth-utils.d.ts +124 -0
  429. package/core-dist/src/mcp/oauth-utils.js +252 -0
  430. package/core-dist/src/mcp/oauth-utils.js.map +1 -0
  431. package/core-dist/src/mcp/oauth-utils.test.d.ts +6 -0
  432. package/core-dist/src/mcp/oauth-utils.test.js +220 -0
  433. package/core-dist/src/mcp/oauth-utils.test.js.map +1 -0
  434. package/core-dist/src/mcp/sa-impersonation-provider.d.ts +33 -0
  435. package/core-dist/src/mcp/sa-impersonation-provider.js +133 -0
  436. package/core-dist/src/mcp/sa-impersonation-provider.js.map +1 -0
  437. package/core-dist/src/mcp/sa-impersonation-provider.test.d.ts +6 -0
  438. package/core-dist/src/mcp/sa-impersonation-provider.test.js +117 -0
  439. package/core-dist/src/mcp/sa-impersonation-provider.test.js.map +1 -0
  440. package/core-dist/src/mcp/token-storage/base-token-storage.d.ts +19 -0
  441. package/core-dist/src/mcp/token-storage/base-token-storage.js +36 -0
  442. package/core-dist/src/mcp/token-storage/base-token-storage.js.map +1 -0
  443. package/core-dist/src/mcp/token-storage/base-token-storage.test.d.ts +6 -0
  444. package/core-dist/src/mcp/token-storage/base-token-storage.test.js +160 -0
  445. package/core-dist/src/mcp/token-storage/base-token-storage.test.js.map +1 -0
  446. package/core-dist/src/mcp/token-storage/file-token-storage.d.ts +24 -0
  447. package/core-dist/src/mcp/token-storage/file-token-storage.js +144 -0
  448. package/core-dist/src/mcp/token-storage/file-token-storage.js.map +1 -0
  449. package/core-dist/src/mcp/token-storage/file-token-storage.test.d.ts +6 -0
  450. package/core-dist/src/mcp/token-storage/file-token-storage.test.js +235 -0
  451. package/core-dist/src/mcp/token-storage/file-token-storage.test.js.map +1 -0
  452. package/core-dist/src/mcp/token-storage/hybrid-token-storage.d.ts +23 -0
  453. package/core-dist/src/mcp/token-storage/hybrid-token-storage.js +78 -0
  454. package/core-dist/src/mcp/token-storage/hybrid-token-storage.js.map +1 -0
  455. package/core-dist/src/mcp/token-storage/hybrid-token-storage.test.d.ts +6 -0
  456. package/core-dist/src/mcp/token-storage/hybrid-token-storage.test.js +193 -0
  457. package/core-dist/src/mcp/token-storage/hybrid-token-storage.test.js.map +1 -0
  458. package/core-dist/src/mcp/token-storage/index.d.ts +11 -0
  459. package/core-dist/src/mcp/token-storage/index.js +12 -0
  460. package/core-dist/src/mcp/token-storage/index.js.map +1 -0
  461. package/core-dist/src/mcp/token-storage/keychain-token-storage.d.ts +35 -0
  462. package/core-dist/src/mcp/token-storage/keychain-token-storage.js +248 -0
  463. package/core-dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -0
  464. package/core-dist/src/mcp/token-storage/keychain-token-storage.test.d.ts +6 -0
  465. package/core-dist/src/mcp/token-storage/keychain-token-storage.test.js +254 -0
  466. package/core-dist/src/mcp/token-storage/keychain-token-storage.test.js.map +1 -0
  467. package/core-dist/src/mcp/token-storage/types.d.ts +38 -0
  468. package/core-dist/src/mcp/token-storage/types.js +11 -0
  469. package/core-dist/src/mcp/token-storage/types.js.map +1 -0
  470. package/core-dist/src/mocks/msw.d.ts +6 -0
  471. package/core-dist/src/mocks/msw.js +8 -0
  472. package/core-dist/src/mocks/msw.js.map +1 -0
  473. package/core-dist/src/models/constants.d.ts +71 -0
  474. package/core-dist/src/models/constants.js +92 -0
  475. package/core-dist/src/models/constants.js.map +1 -0
  476. package/core-dist/src/models/index.d.ts +10 -0
  477. package/core-dist/src/models/index.js +12 -0
  478. package/core-dist/src/models/index.js.map +1 -0
  479. package/core-dist/src/models/modelConfigErrors.d.ts +46 -0
  480. package/core-dist/src/models/modelConfigErrors.js +87 -0
  481. package/core-dist/src/models/modelConfigErrors.js.map +1 -0
  482. package/core-dist/src/models/modelConfigResolver.d.ts +84 -0
  483. package/core-dist/src/models/modelConfigResolver.js +204 -0
  484. package/core-dist/src/models/modelConfigResolver.js.map +1 -0
  485. package/core-dist/src/models/modelConfigResolver.test.d.ts +6 -0
  486. package/core-dist/src/models/modelConfigResolver.test.js +302 -0
  487. package/core-dist/src/models/modelConfigResolver.test.js.map +1 -0
  488. package/core-dist/src/models/modelRegistry.d.ts +55 -0
  489. package/core-dist/src/models/modelRegistry.js +182 -0
  490. package/core-dist/src/models/modelRegistry.js.map +1 -0
  491. package/core-dist/src/models/modelRegistry.test.d.ts +6 -0
  492. package/core-dist/src/models/modelRegistry.test.js +408 -0
  493. package/core-dist/src/models/modelRegistry.test.js.map +1 -0
  494. package/core-dist/src/models/modelsConfig.d.ts +343 -0
  495. package/core-dist/src/models/modelsConfig.js +957 -0
  496. package/core-dist/src/models/modelsConfig.js.map +1 -0
  497. package/core-dist/src/models/modelsConfig.test.d.ts +6 -0
  498. package/core-dist/src/models/modelsConfig.test.js +1242 -0
  499. package/core-dist/src/models/modelsConfig.test.js.map +1 -0
  500. package/core-dist/src/models/types.d.ts +114 -0
  501. package/core-dist/src/models/types.js +7 -0
  502. package/core-dist/src/models/types.js.map +1 -0
  503. package/core-dist/src/output/json-formatter.d.ts +11 -0
  504. package/core-dist/src/output/json-formatter.js +30 -0
  505. package/core-dist/src/output/json-formatter.js.map +1 -0
  506. package/core-dist/src/output/json-formatter.test.d.ts +6 -0
  507. package/core-dist/src/output/json-formatter.test.js +266 -0
  508. package/core-dist/src/output/json-formatter.test.js.map +1 -0
  509. package/core-dist/src/output/types.d.ts +25 -0
  510. package/core-dist/src/output/types.js +17 -0
  511. package/core-dist/src/output/types.js.map +1 -0
  512. package/core-dist/src/prompts/mcp-prompts.d.ts +8 -0
  513. package/core-dist/src/prompts/mcp-prompts.js +13 -0
  514. package/core-dist/src/prompts/mcp-prompts.js.map +1 -0
  515. package/core-dist/src/prompts/prompt-registry.d.ts +34 -0
  516. package/core-dist/src/prompts/prompt-registry.js +65 -0
  517. package/core-dist/src/prompts/prompt-registry.js.map +1 -0
  518. package/core-dist/src/qwen/qwenContentGenerator.d.ts +71 -0
  519. package/core-dist/src/qwen/qwenContentGenerator.js +182 -0
  520. package/core-dist/src/qwen/qwenContentGenerator.js.map +1 -0
  521. package/core-dist/src/qwen/qwenContentGenerator.test.d.ts +6 -0
  522. package/core-dist/src/qwen/qwenContentGenerator.test.js +1175 -0
  523. package/core-dist/src/qwen/qwenContentGenerator.test.js.map +1 -0
  524. package/core-dist/src/qwen/qwenOAuth2.d.ts +195 -0
  525. package/core-dist/src/qwen/qwenOAuth2.js +677 -0
  526. package/core-dist/src/qwen/qwenOAuth2.js.map +1 -0
  527. package/core-dist/src/qwen/qwenOAuth2.test.d.ts +6 -0
  528. package/core-dist/src/qwen/qwenOAuth2.test.js +1621 -0
  529. package/core-dist/src/qwen/qwenOAuth2.test.js.map +1 -0
  530. package/core-dist/src/qwen/sharedTokenManager.d.ts +196 -0
  531. package/core-dist/src/qwen/sharedTokenManager.js +649 -0
  532. package/core-dist/src/qwen/sharedTokenManager.js.map +1 -0
  533. package/core-dist/src/qwen/sharedTokenManager.test.d.ts +7 -0
  534. package/core-dist/src/qwen/sharedTokenManager.test.js +662 -0
  535. package/core-dist/src/qwen/sharedTokenManager.test.js.map +1 -0
  536. package/core-dist/src/services/chatCompressionService.d.ts +32 -0
  537. package/core-dist/src/services/chatCompressionService.js +213 -0
  538. package/core-dist/src/services/chatCompressionService.js.map +1 -0
  539. package/core-dist/src/services/chatCompressionService.test.d.ts +6 -0
  540. package/core-dist/src/services/chatCompressionService.test.js +343 -0
  541. package/core-dist/src/services/chatCompressionService.test.js.map +1 -0
  542. package/core-dist/src/services/chatRecordingService.d.ts +215 -0
  543. package/core-dist/src/services/chatRecordingService.js +285 -0
  544. package/core-dist/src/services/chatRecordingService.js.map +1 -0
  545. package/core-dist/src/services/chatRecordingService.test.d.ts +6 -0
  546. package/core-dist/src/services/chatRecordingService.test.js +299 -0
  547. package/core-dist/src/services/chatRecordingService.test.js.map +1 -0
  548. package/core-dist/src/services/fileDiscoveryService.d.ts +45 -0
  549. package/core-dist/src/services/fileDiscoveryService.js +104 -0
  550. package/core-dist/src/services/fileDiscoveryService.js.map +1 -0
  551. package/core-dist/src/services/fileDiscoveryService.test.d.ts +6 -0
  552. package/core-dist/src/services/fileDiscoveryService.test.js +143 -0
  553. package/core-dist/src/services/fileDiscoveryService.test.js.map +1 -0
  554. package/core-dist/src/services/fileSystemService.d.ts +88 -0
  555. package/core-dist/src/services/fileSystemService.js +131 -0
  556. package/core-dist/src/services/fileSystemService.js.map +1 -0
  557. package/core-dist/src/services/fileSystemService.test.d.ts +6 -0
  558. package/core-dist/src/services/fileSystemService.test.js +216 -0
  559. package/core-dist/src/services/fileSystemService.test.js.map +1 -0
  560. package/core-dist/src/services/gitService.d.ts +22 -0
  561. package/core-dist/src/services/gitService.js +98 -0
  562. package/core-dist/src/services/gitService.js.map +1 -0
  563. package/core-dist/src/services/gitService.test.d.ts +6 -0
  564. package/core-dist/src/services/gitService.test.js +187 -0
  565. package/core-dist/src/services/gitService.test.js.map +1 -0
  566. package/core-dist/src/services/loopDetectionService.d.ts +86 -0
  567. package/core-dist/src/services/loopDetectionService.js +239 -0
  568. package/core-dist/src/services/loopDetectionService.js.map +1 -0
  569. package/core-dist/src/services/loopDetectionService.test.d.ts +6 -0
  570. package/core-dist/src/services/loopDetectionService.test.js +478 -0
  571. package/core-dist/src/services/loopDetectionService.test.js.map +1 -0
  572. package/core-dist/src/services/sessionService.d.ts +200 -0
  573. package/core-dist/src/services/sessionService.js +527 -0
  574. package/core-dist/src/services/sessionService.js.map +1 -0
  575. package/core-dist/src/services/sessionService.test.d.ts +6 -0
  576. package/core-dist/src/services/sessionService.test.js +576 -0
  577. package/core-dist/src/services/sessionService.test.js.map +1 -0
  578. package/core-dist/src/services/shellExecutionService.d.ts +104 -0
  579. package/core-dist/src/services/shellExecutionService.js +626 -0
  580. package/core-dist/src/services/shellExecutionService.js.map +1 -0
  581. package/core-dist/src/services/shellExecutionService.test.d.ts +6 -0
  582. package/core-dist/src/services/shellExecutionService.test.js +684 -0
  583. package/core-dist/src/services/shellExecutionService.test.js.map +1 -0
  584. package/core-dist/src/skills/index.d.ts +19 -0
  585. package/core-dist/src/skills/index.js +9 -0
  586. package/core-dist/src/skills/index.js.map +1 -0
  587. package/core-dist/src/skills/skill-load.d.ts +4 -0
  588. package/core-dist/src/skills/skill-load.js +137 -0
  589. package/core-dist/src/skills/skill-load.js.map +1 -0
  590. package/core-dist/src/skills/skill-load.test.d.ts +6 -0
  591. package/core-dist/src/skills/skill-load.test.js +237 -0
  592. package/core-dist/src/skills/skill-load.test.js.map +1 -0
  593. package/core-dist/src/skills/skill-manager.d.ts +134 -0
  594. package/core-dist/src/skills/skill-manager.js +505 -0
  595. package/core-dist/src/skills/skill-manager.js.map +1 -0
  596. package/core-dist/src/skills/skill-manager.test.d.ts +6 -0
  597. package/core-dist/src/skills/skill-manager.test.js +527 -0
  598. package/core-dist/src/skills/skill-manager.test.js.map +1 -0
  599. package/core-dist/src/skills/types.d.ts +88 -0
  600. package/core-dist/src/skills/types.js +29 -0
  601. package/core-dist/src/skills/types.js.map +1 -0
  602. package/core-dist/src/subagents/builtin-agents.d.ts +35 -0
  603. package/core-dist/src/subagents/builtin-agents.js +85 -0
  604. package/core-dist/src/subagents/builtin-agents.js.map +1 -0
  605. package/core-dist/src/subagents/builtin-agents.test.d.ts +6 -0
  606. package/core-dist/src/subagents/builtin-agents.test.js +78 -0
  607. package/core-dist/src/subagents/builtin-agents.test.js.map +1 -0
  608. package/core-dist/src/subagents/index.d.ts +29 -0
  609. package/core-dist/src/subagents/index.js +15 -0
  610. package/core-dist/src/subagents/index.js.map +1 -0
  611. package/core-dist/src/subagents/subagent-events.d.ts +105 -0
  612. package/core-dist/src/subagents/subagent-events.js +32 -0
  613. package/core-dist/src/subagents/subagent-events.js.map +1 -0
  614. package/core-dist/src/subagents/subagent-hooks.d.ts +29 -0
  615. package/core-dist/src/subagents/subagent-hooks.js +7 -0
  616. package/core-dist/src/subagents/subagent-hooks.js.map +1 -0
  617. package/core-dist/src/subagents/subagent-manager.d.ts +178 -0
  618. package/core-dist/src/subagents/subagent-manager.js +711 -0
  619. package/core-dist/src/subagents/subagent-manager.js.map +1 -0
  620. package/core-dist/src/subagents/subagent-manager.test.d.ts +6 -0
  621. package/core-dist/src/subagents/subagent-manager.test.js +829 -0
  622. package/core-dist/src/subagents/subagent-manager.test.js.map +1 -0
  623. package/core-dist/src/subagents/subagent-statistics.d.ts +50 -0
  624. package/core-dist/src/subagents/subagent-statistics.js +210 -0
  625. package/core-dist/src/subagents/subagent-statistics.js.map +1 -0
  626. package/core-dist/src/subagents/subagent-statistics.test.d.ts +6 -0
  627. package/core-dist/src/subagents/subagent-statistics.test.js +238 -0
  628. package/core-dist/src/subagents/subagent-statistics.test.js.map +1 -0
  629. package/core-dist/src/subagents/subagent.d.ts +167 -0
  630. package/core-dist/src/subagents/subagent.js +758 -0
  631. package/core-dist/src/subagents/subagent.js.map +1 -0
  632. package/core-dist/src/subagents/subagent.test.d.ts +6 -0
  633. package/core-dist/src/subagents/subagent.test.js +819 -0
  634. package/core-dist/src/subagents/subagent.test.js.map +1 -0
  635. package/core-dist/src/subagents/types.d.ts +224 -0
  636. package/core-dist/src/subagents/types.js +58 -0
  637. package/core-dist/src/subagents/types.js.map +1 -0
  638. package/core-dist/src/subagents/types.test.d.ts +6 -0
  639. package/core-dist/src/subagents/types.test.js +31 -0
  640. package/core-dist/src/subagents/types.test.js.map +1 -0
  641. package/core-dist/src/subagents/validation.d.ts +63 -0
  642. package/core-dist/src/subagents/validation.js +293 -0
  643. package/core-dist/src/subagents/validation.js.map +1 -0
  644. package/core-dist/src/subagents/validation.test.d.ts +6 -0
  645. package/core-dist/src/subagents/validation.test.js +330 -0
  646. package/core-dist/src/subagents/validation.test.js.map +1 -0
  647. package/core-dist/src/telemetry/config.d.ts +31 -0
  648. package/core-dist/src/telemetry/config.js +74 -0
  649. package/core-dist/src/telemetry/config.js.map +1 -0
  650. package/core-dist/src/telemetry/config.test.d.ts +6 -0
  651. package/core-dist/src/telemetry/config.test.js +124 -0
  652. package/core-dist/src/telemetry/config.test.js.map +1 -0
  653. package/core-dist/src/telemetry/constants.d.ts +39 -0
  654. package/core-dist/src/telemetry/constants.js +41 -0
  655. package/core-dist/src/telemetry/constants.js.map +1 -0
  656. package/core-dist/src/telemetry/file-exporters.d.ts +29 -0
  657. package/core-dist/src/telemetry/file-exporters.js +62 -0
  658. package/core-dist/src/telemetry/file-exporters.js.map +1 -0
  659. package/core-dist/src/telemetry/index.d.ts +25 -0
  660. package/core-dist/src/telemetry/index.js +31 -0
  661. package/core-dist/src/telemetry/index.js.map +1 -0
  662. package/core-dist/src/telemetry/integration.test.circular.d.ts +6 -0
  663. package/core-dist/src/telemetry/integration.test.circular.js +95 -0
  664. package/core-dist/src/telemetry/integration.test.circular.js.map +1 -0
  665. package/core-dist/src/telemetry/loggers.d.ts +40 -0
  666. package/core-dist/src/telemetry/loggers.js +712 -0
  667. package/core-dist/src/telemetry/loggers.js.map +1 -0
  668. package/core-dist/src/telemetry/loggers.test.circular.d.ts +6 -0
  669. package/core-dist/src/telemetry/loggers.test.circular.js +107 -0
  670. package/core-dist/src/telemetry/loggers.test.circular.js.map +1 -0
  671. package/core-dist/src/telemetry/loggers.test.d.ts +6 -0
  672. package/core-dist/src/telemetry/loggers.test.js +961 -0
  673. package/core-dist/src/telemetry/loggers.test.js.map +1 -0
  674. package/core-dist/src/telemetry/metrics.d.ts +320 -0
  675. package/core-dist/src/telemetry/metrics.js +532 -0
  676. package/core-dist/src/telemetry/metrics.js.map +1 -0
  677. package/core-dist/src/telemetry/metrics.test.d.ts +6 -0
  678. package/core-dist/src/telemetry/metrics.test.js +746 -0
  679. package/core-dist/src/telemetry/metrics.test.js.map +1 -0
  680. package/core-dist/src/telemetry/qwen-logger/event-types.d.ts +89 -0
  681. package/core-dist/src/telemetry/qwen-logger/event-types.js +2 -0
  682. package/core-dist/src/telemetry/qwen-logger/event-types.js.map +1 -0
  683. package/core-dist/src/telemetry/qwen-logger/qwen-logger.d.ts +102 -0
  684. package/core-dist/src/telemetry/qwen-logger/qwen-logger.js +739 -0
  685. package/core-dist/src/telemetry/qwen-logger/qwen-logger.js.map +1 -0
  686. package/core-dist/src/telemetry/qwen-logger/qwen-logger.test.d.ts +6 -0
  687. package/core-dist/src/telemetry/qwen-logger/qwen-logger.test.js +380 -0
  688. package/core-dist/src/telemetry/qwen-logger/qwen-logger.test.js.map +1 -0
  689. package/core-dist/src/telemetry/sdk.d.ts +9 -0
  690. package/core-dist/src/telemetry/sdk.js +163 -0
  691. package/core-dist/src/telemetry/sdk.js.map +1 -0
  692. package/core-dist/src/telemetry/sdk.test.d.ts +6 -0
  693. package/core-dist/src/telemetry/sdk.test.js +116 -0
  694. package/core-dist/src/telemetry/sdk.test.js.map +1 -0
  695. package/core-dist/src/telemetry/telemetry-utils.d.ts +6 -0
  696. package/core-dist/src/telemetry/telemetry-utils.js +14 -0
  697. package/core-dist/src/telemetry/telemetry-utils.js.map +1 -0
  698. package/core-dist/src/telemetry/telemetry-utils.test.d.ts +6 -0
  699. package/core-dist/src/telemetry/telemetry-utils.test.js +40 -0
  700. package/core-dist/src/telemetry/telemetry-utils.test.js.map +1 -0
  701. package/core-dist/src/telemetry/telemetry.test.d.ts +6 -0
  702. package/core-dist/src/telemetry/telemetry.test.js +49 -0
  703. package/core-dist/src/telemetry/telemetry.test.js.map +1 -0
  704. package/core-dist/src/telemetry/tool-call-decision.d.ts +13 -0
  705. package/core-dist/src/telemetry/tool-call-decision.js +29 -0
  706. package/core-dist/src/telemetry/tool-call-decision.js.map +1 -0
  707. package/core-dist/src/telemetry/types.d.ts +363 -0
  708. package/core-dist/src/telemetry/types.js +635 -0
  709. package/core-dist/src/telemetry/types.js.map +1 -0
  710. package/core-dist/src/telemetry/uiTelemetry.d.ts +80 -0
  711. package/core-dist/src/telemetry/uiTelemetry.js +164 -0
  712. package/core-dist/src/telemetry/uiTelemetry.js.map +1 -0
  713. package/core-dist/src/telemetry/uiTelemetry.test.d.ts +6 -0
  714. package/core-dist/src/telemetry/uiTelemetry.test.js +625 -0
  715. package/core-dist/src/telemetry/uiTelemetry.test.js.map +1 -0
  716. package/core-dist/src/test-utils/config.d.ts +17 -0
  717. package/core-dist/src/test-utils/config.js +31 -0
  718. package/core-dist/src/test-utils/config.js.map +1 -0
  719. package/core-dist/src/test-utils/index.d.ts +6 -0
  720. package/core-dist/src/test-utils/index.js +7 -0
  721. package/core-dist/src/test-utils/index.js.map +1 -0
  722. package/core-dist/src/test-utils/mock-tool.d.ts +66 -0
  723. package/core-dist/src/test-utils/mock-tool.js +121 -0
  724. package/core-dist/src/test-utils/mock-tool.js.map +1 -0
  725. package/core-dist/src/test-utils/mockWorkspaceContext.d.ts +13 -0
  726. package/core-dist/src/test-utils/mockWorkspaceContext.js +24 -0
  727. package/core-dist/src/test-utils/mockWorkspaceContext.js.map +1 -0
  728. package/core-dist/src/tools/askUserQuestion.d.ts +41 -0
  729. package/core-dist/src/tools/askUserQuestion.js +247 -0
  730. package/core-dist/src/tools/askUserQuestion.js.map +1 -0
  731. package/core-dist/src/tools/askUserQuestion.test.d.ts +6 -0
  732. package/core-dist/src/tools/askUserQuestion.test.js +218 -0
  733. package/core-dist/src/tools/askUserQuestion.test.js.map +1 -0
  734. package/core-dist/src/tools/diffOptions.d.ts +9 -0
  735. package/core-dist/src/tools/diffOptions.js +46 -0
  736. package/core-dist/src/tools/diffOptions.js.map +1 -0
  737. package/core-dist/src/tools/diffOptions.test.d.ts +6 -0
  738. package/core-dist/src/tools/diffOptions.test.js +155 -0
  739. package/core-dist/src/tools/diffOptions.test.js.map +1 -0
  740. package/core-dist/src/tools/edit.d.ts +55 -0
  741. package/core-dist/src/tools/edit.js +446 -0
  742. package/core-dist/src/tools/edit.js.map +1 -0
  743. package/core-dist/src/tools/edit.test.d.ts +6 -0
  744. package/core-dist/src/tools/edit.test.js +742 -0
  745. package/core-dist/src/tools/edit.test.js.map +1 -0
  746. package/core-dist/src/tools/exitPlanMode.d.ts +28 -0
  747. package/core-dist/src/tools/exitPlanMode.js +144 -0
  748. package/core-dist/src/tools/exitPlanMode.js.map +1 -0
  749. package/core-dist/src/tools/exitPlanMode.test.d.ts +6 -0
  750. package/core-dist/src/tools/exitPlanMode.test.js +178 -0
  751. package/core-dist/src/tools/exitPlanMode.test.js.map +1 -0
  752. package/core-dist/src/tools/glob.d.ts +44 -0
  753. package/core-dist/src/tools/glob.js +195 -0
  754. package/core-dist/src/tools/glob.js.map +1 -0
  755. package/core-dist/src/tools/glob.test.d.ts +6 -0
  756. package/core-dist/src/tools/glob.test.js +481 -0
  757. package/core-dist/src/tools/glob.test.js.map +1 -0
  758. package/core-dist/src/tools/grep.d.ts +44 -0
  759. package/core-dist/src/tools/grep.js +427 -0
  760. package/core-dist/src/tools/grep.js.map +1 -0
  761. package/core-dist/src/tools/grep.test.d.ts +6 -0
  762. package/core-dist/src/tools/grep.test.js +360 -0
  763. package/core-dist/src/tools/grep.test.js.map +1 -0
  764. package/core-dist/src/tools/ls.d.ts +68 -0
  765. package/core-dist/src/tools/ls.js +221 -0
  766. package/core-dist/src/tools/ls.js.map +1 -0
  767. package/core-dist/src/tools/ls.test.d.ts +6 -0
  768. package/core-dist/src/tools/ls.test.js +246 -0
  769. package/core-dist/src/tools/ls.test.js.map +1 -0
  770. package/core-dist/src/tools/lsp.d.ts +66 -0
  771. package/core-dist/src/tools/lsp.js +894 -0
  772. package/core-dist/src/tools/lsp.js.map +1 -0
  773. package/core-dist/src/tools/lsp.test.d.ts +6 -0
  774. package/core-dist/src/tools/lsp.test.js +960 -0
  775. package/core-dist/src/tools/lsp.test.js.map +1 -0
  776. package/core-dist/src/tools/mcp-client-manager.d.ts +110 -0
  777. package/core-dist/src/tools/mcp-client-manager.js +381 -0
  778. package/core-dist/src/tools/mcp-client-manager.js.map +1 -0
  779. package/core-dist/src/tools/mcp-client-manager.test.d.ts +6 -0
  780. package/core-dist/src/tools/mcp-client-manager.test.js +207 -0
  781. package/core-dist/src/tools/mcp-client-manager.test.js.map +1 -0
  782. package/core-dist/src/tools/mcp-client.d.ts +199 -0
  783. package/core-dist/src/tools/mcp-client.js +1001 -0
  784. package/core-dist/src/tools/mcp-client.js.map +1 -0
  785. package/core-dist/src/tools/mcp-client.test.d.ts +6 -0
  786. package/core-dist/src/tools/mcp-client.test.js +307 -0
  787. package/core-dist/src/tools/mcp-client.test.js.map +1 -0
  788. package/core-dist/src/tools/mcp-tool.d.ts +69 -0
  789. package/core-dist/src/tools/mcp-tool.js +365 -0
  790. package/core-dist/src/tools/mcp-tool.js.map +1 -0
  791. package/core-dist/src/tools/mcp-tool.test.d.ts +6 -0
  792. package/core-dist/src/tools/mcp-tool.test.js +827 -0
  793. package/core-dist/src/tools/mcp-tool.test.js.map +1 -0
  794. package/core-dist/src/tools/memoryTool.d.ts +42 -0
  795. package/core-dist/src/tools/memoryTool.js +403 -0
  796. package/core-dist/src/tools/memoryTool.js.map +1 -0
  797. package/core-dist/src/tools/memoryTool.test.d.ts +6 -0
  798. package/core-dist/src/tools/memoryTool.test.js +416 -0
  799. package/core-dist/src/tools/memoryTool.test.js.map +1 -0
  800. package/core-dist/src/tools/modifiable-tool.d.ts +32 -0
  801. package/core-dist/src/tools/modifiable-tool.js +90 -0
  802. package/core-dist/src/tools/modifiable-tool.js.map +1 -0
  803. package/core-dist/src/tools/modifiable-tool.test.d.ts +6 -0
  804. package/core-dist/src/tools/modifiable-tool.test.js +188 -0
  805. package/core-dist/src/tools/modifiable-tool.test.js.map +1 -0
  806. package/core-dist/src/tools/read-file.d.ts +35 -0
  807. package/core-dist/src/tools/read-file.js +141 -0
  808. package/core-dist/src/tools/read-file.js.map +1 -0
  809. package/core-dist/src/tools/read-file.test.d.ts +6 -0
  810. package/core-dist/src/tools/read-file.test.js +333 -0
  811. package/core-dist/src/tools/read-file.test.js.map +1 -0
  812. package/core-dist/src/tools/ripGrep.d.ts +44 -0
  813. package/core-dist/src/tools/ripGrep.js +235 -0
  814. package/core-dist/src/tools/ripGrep.js.map +1 -0
  815. package/core-dist/src/tools/ripGrep.test.d.ts +6 -0
  816. package/core-dist/src/tools/ripGrep.test.js +529 -0
  817. package/core-dist/src/tools/ripGrep.test.js.map +1 -0
  818. package/core-dist/src/tools/sdk-control-client-transport.d.ts +67 -0
  819. package/core-dist/src/tools/sdk-control-client-transport.js +93 -0
  820. package/core-dist/src/tools/sdk-control-client-transport.js.map +1 -0
  821. package/core-dist/src/tools/shell.d.ts +34 -0
  822. package/core-dist/src/tools/shell.js +509 -0
  823. package/core-dist/src/tools/shell.js.map +1 -0
  824. package/core-dist/src/tools/shell.test.d.ts +6 -0
  825. package/core-dist/src/tools/shell.test.js +880 -0
  826. package/core-dist/src/tools/shell.test.js.map +1 -0
  827. package/core-dist/src/tools/skill.d.ts +45 -0
  828. package/core-dist/src/tools/skill.js +214 -0
  829. package/core-dist/src/tools/skill.js.map +1 -0
  830. package/core-dist/src/tools/skill.test.d.ts +6 -0
  831. package/core-dist/src/tools/skill.test.js +280 -0
  832. package/core-dist/src/tools/skill.test.js.map +1 -0
  833. package/core-dist/src/tools/task.d.ts +60 -0
  834. package/core-dist/src/tools/task.js +417 -0
  835. package/core-dist/src/tools/task.js.map +1 -0
  836. package/core-dist/src/tools/task.test.d.ts +6 -0
  837. package/core-dist/src/tools/task.test.js +367 -0
  838. package/core-dist/src/tools/task.test.js.map +1 -0
  839. package/core-dist/src/tools/todoWrite.d.ts +42 -0
  840. package/core-dist/src/tools/todoWrite.js +409 -0
  841. package/core-dist/src/tools/todoWrite.js.map +1 -0
  842. package/core-dist/src/tools/todoWrite.test.d.ts +6 -0
  843. package/core-dist/src/tools/todoWrite.test.js +234 -0
  844. package/core-dist/src/tools/todoWrite.test.js.map +1 -0
  845. package/core-dist/src/tools/tool-error.d.ts +45 -0
  846. package/core-dist/src/tools/tool-error.js +61 -0
  847. package/core-dist/src/tools/tool-error.js.map +1 -0
  848. package/core-dist/src/tools/tool-names.d.ts +60 -0
  849. package/core-dist/src/tools/tool-names.js +66 -0
  850. package/core-dist/src/tools/tool-names.js.map +1 -0
  851. package/core-dist/src/tools/tool-registry.d.ts +103 -0
  852. package/core-dist/src/tools/tool-registry.js +404 -0
  853. package/core-dist/src/tools/tool-registry.js.map +1 -0
  854. package/core-dist/src/tools/tool-registry.test.d.ts +6 -0
  855. package/core-dist/src/tools/tool-registry.test.js +331 -0
  856. package/core-dist/src/tools/tool-registry.test.js.map +1 -0
  857. package/core-dist/src/tools/tools.d.ts +364 -0
  858. package/core-dist/src/tools/tools.js +263 -0
  859. package/core-dist/src/tools/tools.js.map +1 -0
  860. package/core-dist/src/tools/tools.test.d.ts +6 -0
  861. package/core-dist/src/tools/tools.test.js +205 -0
  862. package/core-dist/src/tools/tools.test.js.map +1 -0
  863. package/core-dist/src/tools/web-fetch.d.ts +31 -0
  864. package/core-dist/src/tools/web-fetch.js +168 -0
  865. package/core-dist/src/tools/web-fetch.js.map +1 -0
  866. package/core-dist/src/tools/web-fetch.test.d.ts +6 -0
  867. package/core-dist/src/tools/web-fetch.test.js +134 -0
  868. package/core-dist/src/tools/web-fetch.test.js.map +1 -0
  869. package/core-dist/src/tools/web-search/base-provider.d.ts +31 -0
  870. package/core-dist/src/tools/web-search/base-provider.js +34 -0
  871. package/core-dist/src/tools/web-search/base-provider.js.map +1 -0
  872. package/core-dist/src/tools/web-search/index.d.ts +24 -0
  873. package/core-dist/src/tools/web-search/index.js +249 -0
  874. package/core-dist/src/tools/web-search/index.js.map +1 -0
  875. package/core-dist/src/tools/web-search/index.test.d.ts +6 -0
  876. package/core-dist/src/tools/web-search/index.test.js +237 -0
  877. package/core-dist/src/tools/web-search/index.test.js.map +1 -0
  878. package/core-dist/src/tools/web-search/providers/dashscope-provider.d.ts +23 -0
  879. package/core-dist/src/tools/web-search/providers/dashscope-provider.js +120 -0
  880. package/core-dist/src/tools/web-search/providers/dashscope-provider.js.map +1 -0
  881. package/core-dist/src/tools/web-search/providers/google-provider.d.ts +17 -0
  882. package/core-dist/src/tools/web-search/providers/google-provider.js +55 -0
  883. package/core-dist/src/tools/web-search/providers/google-provider.js.map +1 -0
  884. package/core-dist/src/tools/web-search/providers/tavily-provider.d.ts +17 -0
  885. package/core-dist/src/tools/web-search/providers/tavily-provider.js +54 -0
  886. package/core-dist/src/tools/web-search/providers/tavily-provider.js.map +1 -0
  887. package/core-dist/src/tools/web-search/types.d.ts +138 -0
  888. package/core-dist/src/tools/web-search/types.js +7 -0
  889. package/core-dist/src/tools/web-search/types.js.map +1 -0
  890. package/core-dist/src/tools/web-search/utils.d.ts +28 -0
  891. package/core-dist/src/tools/web-search/utils.js +35 -0
  892. package/core-dist/src/tools/web-search/utils.js.map +1 -0
  893. package/core-dist/src/tools/write-file.d.ts +52 -0
  894. package/core-dist/src/tools/write-file.js +316 -0
  895. package/core-dist/src/tools/write-file.js.map +1 -0
  896. package/core-dist/src/tools/write-file.test.d.ts +6 -0
  897. package/core-dist/src/tools/write-file.test.js +613 -0
  898. package/core-dist/src/tools/write-file.test.js.map +1 -0
  899. package/core-dist/src/utils/LruCache.d.ts +13 -0
  900. package/core-dist/src/utils/LruCache.js +38 -0
  901. package/core-dist/src/utils/LruCache.js.map +1 -0
  902. package/core-dist/src/utils/browser.d.ts +13 -0
  903. package/core-dist/src/utils/browser.js +50 -0
  904. package/core-dist/src/utils/browser.js.map +1 -0
  905. package/core-dist/src/utils/configResolver.d.ts +120 -0
  906. package/core-dist/src/utils/configResolver.js +125 -0
  907. package/core-dist/src/utils/configResolver.js.map +1 -0
  908. package/core-dist/src/utils/configResolver.test.d.ts +6 -0
  909. package/core-dist/src/utils/configResolver.test.js +99 -0
  910. package/core-dist/src/utils/configResolver.test.js.map +1 -0
  911. package/core-dist/src/utils/debugLogger.d.ts +46 -0
  912. package/core-dist/src/utils/debugLogger.js +159 -0
  913. package/core-dist/src/utils/debugLogger.js.map +1 -0
  914. package/core-dist/src/utils/debugLogger.test.d.ts +6 -0
  915. package/core-dist/src/utils/debugLogger.test.js +188 -0
  916. package/core-dist/src/utils/debugLogger.test.js.map +1 -0
  917. package/core-dist/src/utils/editHelper.d.ts +58 -0
  918. package/core-dist/src/utils/editHelper.js +342 -0
  919. package/core-dist/src/utils/editHelper.js.map +1 -0
  920. package/core-dist/src/utils/editHelper.test.d.ts +6 -0
  921. package/core-dist/src/utils/editHelper.test.js +127 -0
  922. package/core-dist/src/utils/editHelper.test.js.map +1 -0
  923. package/core-dist/src/utils/editor.d.ts +37 -0
  924. package/core-dist/src/utils/editor.js +179 -0
  925. package/core-dist/src/utils/editor.js.map +1 -0
  926. package/core-dist/src/utils/editor.test.d.ts +6 -0
  927. package/core-dist/src/utils/editor.test.js +434 -0
  928. package/core-dist/src/utils/editor.test.js.map +1 -0
  929. package/core-dist/src/utils/envVarResolver.d.ts +39 -0
  930. package/core-dist/src/utils/envVarResolver.js +100 -0
  931. package/core-dist/src/utils/envVarResolver.js.map +1 -0
  932. package/core-dist/src/utils/envVarResolver.test.d.ts +6 -0
  933. package/core-dist/src/utils/envVarResolver.test.js +221 -0
  934. package/core-dist/src/utils/envVarResolver.test.js.map +1 -0
  935. package/core-dist/src/utils/environmentContext.d.ts +21 -0
  936. package/core-dist/src/utils/environmentContext.js +73 -0
  937. package/core-dist/src/utils/environmentContext.js.map +1 -0
  938. package/core-dist/src/utils/environmentContext.test.d.ts +6 -0
  939. package/core-dist/src/utils/environmentContext.test.js +151 -0
  940. package/core-dist/src/utils/environmentContext.test.js.map +1 -0
  941. package/core-dist/src/utils/errorParsing.d.ts +7 -0
  942. package/core-dist/src/utils/errorParsing.js +72 -0
  943. package/core-dist/src/utils/errorParsing.js.map +1 -0
  944. package/core-dist/src/utils/errorParsing.test.d.ts +6 -0
  945. package/core-dist/src/utils/errorParsing.test.js +87 -0
  946. package/core-dist/src/utils/errorParsing.test.js.map +1 -0
  947. package/core-dist/src/utils/errorReporting.d.ts +14 -0
  948. package/core-dist/src/utils/errorReporting.js +56 -0
  949. package/core-dist/src/utils/errorReporting.js.map +1 -0
  950. package/core-dist/src/utils/errorReporting.test.d.ts +6 -0
  951. package/core-dist/src/utils/errorReporting.test.js +84 -0
  952. package/core-dist/src/utils/errorReporting.test.js.map +1 -0
  953. package/core-dist/src/utils/errors.d.ts +44 -0
  954. package/core-dist/src/utils/errors.js +114 -0
  955. package/core-dist/src/utils/errors.js.map +1 -0
  956. package/core-dist/src/utils/errors.test.d.ts +6 -0
  957. package/core-dist/src/utils/errors.test.js +70 -0
  958. package/core-dist/src/utils/errors.test.js.map +1 -0
  959. package/core-dist/src/utils/fetch.d.ts +14 -0
  960. package/core-dist/src/utils/fetch.js +152 -0
  961. package/core-dist/src/utils/fetch.js.map +1 -0
  962. package/core-dist/src/utils/fetch.test.d.ts +6 -0
  963. package/core-dist/src/utils/fetch.test.js +40 -0
  964. package/core-dist/src/utils/fetch.test.js.map +1 -0
  965. package/core-dist/src/utils/fileUtils.d.ts +102 -0
  966. package/core-dist/src/utils/fileUtils.js +584 -0
  967. package/core-dist/src/utils/fileUtils.js.map +1 -0
  968. package/core-dist/src/utils/fileUtils.test.d.ts +6 -0
  969. package/core-dist/src/utils/fileUtils.test.js +808 -0
  970. package/core-dist/src/utils/fileUtils.test.js.map +1 -0
  971. package/core-dist/src/utils/filesearch/crawlCache.d.ts +25 -0
  972. package/core-dist/src/utils/filesearch/crawlCache.js +57 -0
  973. package/core-dist/src/utils/filesearch/crawlCache.js.map +1 -0
  974. package/core-dist/src/utils/filesearch/crawlCache.test.d.ts +6 -0
  975. package/core-dist/src/utils/filesearch/crawlCache.test.js +103 -0
  976. package/core-dist/src/utils/filesearch/crawlCache.test.js.map +1 -0
  977. package/core-dist/src/utils/filesearch/crawler.d.ts +15 -0
  978. package/core-dist/src/utils/filesearch/crawler.js +50 -0
  979. package/core-dist/src/utils/filesearch/crawler.js.map +1 -0
  980. package/core-dist/src/utils/filesearch/crawler.test.d.ts +6 -0
  981. package/core-dist/src/utils/filesearch/crawler.test.js +468 -0
  982. package/core-dist/src/utils/filesearch/crawler.test.js.map +1 -0
  983. package/core-dist/src/utils/filesearch/fileSearch.d.ts +38 -0
  984. package/core-dist/src/utils/filesearch/fileSearch.js +194 -0
  985. package/core-dist/src/utils/filesearch/fileSearch.js.map +1 -0
  986. package/core-dist/src/utils/filesearch/fileSearch.test.d.ts +6 -0
  987. package/core-dist/src/utils/filesearch/fileSearch.test.js +642 -0
  988. package/core-dist/src/utils/filesearch/fileSearch.test.js.map +1 -0
  989. package/core-dist/src/utils/filesearch/ignore.d.ts +42 -0
  990. package/core-dist/src/utils/filesearch/ignore.js +106 -0
  991. package/core-dist/src/utils/filesearch/ignore.js.map +1 -0
  992. package/core-dist/src/utils/filesearch/ignore.test.d.ts +6 -0
  993. package/core-dist/src/utils/filesearch/ignore.test.js +144 -0
  994. package/core-dist/src/utils/filesearch/ignore.test.js.map +1 -0
  995. package/core-dist/src/utils/filesearch/result-cache.d.ts +33 -0
  996. package/core-dist/src/utils/filesearch/result-cache.js +59 -0
  997. package/core-dist/src/utils/filesearch/result-cache.js.map +1 -0
  998. package/core-dist/src/utils/filesearch/result-cache.test.d.ts +6 -0
  999. package/core-dist/src/utils/filesearch/result-cache.test.js +46 -0
  1000. package/core-dist/src/utils/filesearch/result-cache.test.js.map +1 -0
  1001. package/core-dist/src/utils/formatters.d.ts +6 -0
  1002. package/core-dist/src/utils/formatters.js +16 -0
  1003. package/core-dist/src/utils/formatters.js.map +1 -0
  1004. package/core-dist/src/utils/generateContentResponseUtilities.d.ts +13 -0
  1005. package/core-dist/src/utils/generateContentResponseUtilities.js +95 -0
  1006. package/core-dist/src/utils/generateContentResponseUtilities.js.map +1 -0
  1007. package/core-dist/src/utils/generateContentResponseUtilities.test.d.ts +6 -0
  1008. package/core-dist/src/utils/generateContentResponseUtilities.test.js +235 -0
  1009. package/core-dist/src/utils/generateContentResponseUtilities.test.js.map +1 -0
  1010. package/core-dist/src/utils/getFolderStructure.d.ts +31 -0
  1011. package/core-dist/src/utils/getFolderStructure.js +233 -0
  1012. package/core-dist/src/utils/getFolderStructure.js.map +1 -0
  1013. package/core-dist/src/utils/getFolderStructure.test.d.ts +6 -0
  1014. package/core-dist/src/utils/getFolderStructure.test.js +282 -0
  1015. package/core-dist/src/utils/getFolderStructure.test.js.map +1 -0
  1016. package/core-dist/src/utils/getPty.d.ts +7 -0
  1017. package/core-dist/src/utils/getPty.js +7 -0
  1018. package/core-dist/src/utils/getPty.js.map +1 -0
  1019. package/core-dist/src/utils/gitIgnoreParser.d.ts +16 -0
  1020. package/core-dist/src/utils/gitIgnoreParser.js +152 -0
  1021. package/core-dist/src/utils/gitIgnoreParser.js.map +1 -0
  1022. package/core-dist/src/utils/gitIgnoreParser.test.d.ts +6 -0
  1023. package/core-dist/src/utils/gitIgnoreParser.test.js +185 -0
  1024. package/core-dist/src/utils/gitIgnoreParser.test.js.map +1 -0
  1025. package/core-dist/src/utils/gitUtils.d.ts +21 -0
  1026. package/core-dist/src/utils/gitUtils.js +78 -0
  1027. package/core-dist/src/utils/gitUtils.js.map +1 -0
  1028. package/core-dist/src/utils/iconvHelper.d.ts +33 -0
  1029. package/core-dist/src/utils/iconvHelper.js +48 -0
  1030. package/core-dist/src/utils/iconvHelper.js.map +1 -0
  1031. package/core-dist/src/utils/ignorePatterns.d.ts +103 -0
  1032. package/core-dist/src/utils/ignorePatterns.js +222 -0
  1033. package/core-dist/src/utils/ignorePatterns.js.map +1 -0
  1034. package/core-dist/src/utils/ignorePatterns.test.d.ts +6 -0
  1035. package/core-dist/src/utils/ignorePatterns.test.js +255 -0
  1036. package/core-dist/src/utils/ignorePatterns.test.js.map +1 -0
  1037. package/core-dist/src/utils/installationManager.d.ts +16 -0
  1038. package/core-dist/src/utils/installationManager.js +52 -0
  1039. package/core-dist/src/utils/installationManager.js.map +1 -0
  1040. package/core-dist/src/utils/installationManager.test.d.ts +6 -0
  1041. package/core-dist/src/utils/installationManager.test.js +79 -0
  1042. package/core-dist/src/utils/installationManager.test.js.map +1 -0
  1043. package/core-dist/src/utils/jsonl-utils.d.ts +38 -0
  1044. package/core-dist/src/utils/jsonl-utils.js +176 -0
  1045. package/core-dist/src/utils/jsonl-utils.js.map +1 -0
  1046. package/core-dist/src/utils/language-detection.d.ts +6 -0
  1047. package/core-dist/src/utils/language-detection.js +101 -0
  1048. package/core-dist/src/utils/language-detection.js.map +1 -0
  1049. package/core-dist/src/utils/memoryDiscovery.d.ts +15 -0
  1050. package/core-dist/src/utils/memoryDiscovery.js +238 -0
  1051. package/core-dist/src/utils/memoryDiscovery.js.map +1 -0
  1052. package/core-dist/src/utils/memoryDiscovery.test.d.ts +6 -0
  1053. package/core-dist/src/utils/memoryDiscovery.test.js +212 -0
  1054. package/core-dist/src/utils/memoryDiscovery.test.js.map +1 -0
  1055. package/core-dist/src/utils/memoryImportProcessor.d.ts +41 -0
  1056. package/core-dist/src/utils/memoryImportProcessor.js +296 -0
  1057. package/core-dist/src/utils/memoryImportProcessor.js.map +1 -0
  1058. package/core-dist/src/utils/memoryImportProcessor.test.d.ts +6 -0
  1059. package/core-dist/src/utils/memoryImportProcessor.test.js +631 -0
  1060. package/core-dist/src/utils/memoryImportProcessor.test.js.map +1 -0
  1061. package/core-dist/src/utils/messageInspectors.d.ts +8 -0
  1062. package/core-dist/src/utils/messageInspectors.js +16 -0
  1063. package/core-dist/src/utils/messageInspectors.js.map +1 -0
  1064. package/core-dist/src/utils/nextSpeakerChecker.d.ts +12 -0
  1065. package/core-dist/src/utils/nextSpeakerChecker.js +99 -0
  1066. package/core-dist/src/utils/nextSpeakerChecker.js.map +1 -0
  1067. package/core-dist/src/utils/nextSpeakerChecker.test.d.ts +6 -0
  1068. package/core-dist/src/utils/nextSpeakerChecker.test.js +183 -0
  1069. package/core-dist/src/utils/nextSpeakerChecker.test.js.map +1 -0
  1070. package/core-dist/src/utils/openaiLogger.d.ts +42 -0
  1071. package/core-dist/src/utils/openaiLogger.js +140 -0
  1072. package/core-dist/src/utils/openaiLogger.js.map +1 -0
  1073. package/core-dist/src/utils/openaiLogger.test.d.ts +6 -0
  1074. package/core-dist/src/utils/openaiLogger.test.js +314 -0
  1075. package/core-dist/src/utils/openaiLogger.test.js.map +1 -0
  1076. package/core-dist/src/utils/partUtils.d.ts +35 -0
  1077. package/core-dist/src/utils/partUtils.js +133 -0
  1078. package/core-dist/src/utils/partUtils.js.map +1 -0
  1079. package/core-dist/src/utils/partUtils.test.d.ts +6 -0
  1080. package/core-dist/src/utils/partUtils.test.js +241 -0
  1081. package/core-dist/src/utils/partUtils.test.js.map +1 -0
  1082. package/core-dist/src/utils/pathReader.d.ts +17 -0
  1083. package/core-dist/src/utils/pathReader.js +92 -0
  1084. package/core-dist/src/utils/pathReader.js.map +1 -0
  1085. package/core-dist/src/utils/pathReader.test.d.ts +6 -0
  1086. package/core-dist/src/utils/pathReader.test.js +367 -0
  1087. package/core-dist/src/utils/pathReader.test.js.map +1 -0
  1088. package/core-dist/src/utils/paths.d.ts +110 -0
  1089. package/core-dist/src/utils/paths.js +269 -0
  1090. package/core-dist/src/utils/paths.js.map +1 -0
  1091. package/core-dist/src/utils/paths.test.d.ts +6 -0
  1092. package/core-dist/src/utils/paths.test.js +633 -0
  1093. package/core-dist/src/utils/paths.test.js.map +1 -0
  1094. package/core-dist/src/utils/projectSummary.d.ts +22 -0
  1095. package/core-dist/src/utils/projectSummary.js +86 -0
  1096. package/core-dist/src/utils/projectSummary.js.map +1 -0
  1097. package/core-dist/src/utils/promptIdContext.d.ts +7 -0
  1098. package/core-dist/src/utils/promptIdContext.js +8 -0
  1099. package/core-dist/src/utils/promptIdContext.js.map +1 -0
  1100. package/core-dist/src/utils/quotaErrorDetection.d.ts +19 -0
  1101. package/core-dist/src/utils/quotaErrorDetection.js +84 -0
  1102. package/core-dist/src/utils/quotaErrorDetection.js.map +1 -0
  1103. package/core-dist/src/utils/quotaErrorDetection.test.d.ts +6 -0
  1104. package/core-dist/src/utils/quotaErrorDetection.test.js +104 -0
  1105. package/core-dist/src/utils/quotaErrorDetection.test.js.map +1 -0
  1106. package/core-dist/src/utils/qwenIgnoreParser.d.ts +18 -0
  1107. package/core-dist/src/utils/qwenIgnoreParser.js +61 -0
  1108. package/core-dist/src/utils/qwenIgnoreParser.js.map +1 -0
  1109. package/core-dist/src/utils/qwenIgnoreParser.test.d.ts +6 -0
  1110. package/core-dist/src/utils/qwenIgnoreParser.test.js +50 -0
  1111. package/core-dist/src/utils/qwenIgnoreParser.test.js.map +1 -0
  1112. package/core-dist/src/utils/rateLimit.d.ts +23 -0
  1113. package/core-dist/src/utils/rateLimit.js +69 -0
  1114. package/core-dist/src/utils/rateLimit.js.map +1 -0
  1115. package/core-dist/src/utils/rateLimit.test.d.ts +6 -0
  1116. package/core-dist/src/utils/rateLimit.test.js +72 -0
  1117. package/core-dist/src/utils/rateLimit.test.js.map +1 -0
  1118. package/core-dist/src/utils/readManyFiles.d.ts +67 -0
  1119. package/core-dist/src/utils/readManyFiles.js +133 -0
  1120. package/core-dist/src/utils/readManyFiles.js.map +1 -0
  1121. package/core-dist/src/utils/readManyFiles.test.d.ts +6 -0
  1122. package/core-dist/src/utils/readManyFiles.test.js +230 -0
  1123. package/core-dist/src/utils/readManyFiles.test.js.map +1 -0
  1124. package/core-dist/src/utils/request-tokenizer/imageTokenizer.d.ts +112 -0
  1125. package/core-dist/src/utils/request-tokenizer/imageTokenizer.js +403 -0
  1126. package/core-dist/src/utils/request-tokenizer/imageTokenizer.js.map +1 -0
  1127. package/core-dist/src/utils/request-tokenizer/imageTokenizer.test.d.ts +6 -0
  1128. package/core-dist/src/utils/request-tokenizer/imageTokenizer.test.js +114 -0
  1129. package/core-dist/src/utils/request-tokenizer/imageTokenizer.test.js.map +1 -0
  1130. package/core-dist/src/utils/request-tokenizer/index.d.ts +9 -0
  1131. package/core-dist/src/utils/request-tokenizer/index.js +9 -0
  1132. package/core-dist/src/utils/request-tokenizer/index.js.map +1 -0
  1133. package/core-dist/src/utils/request-tokenizer/requestTokenizer.d.ts +52 -0
  1134. package/core-dist/src/utils/request-tokenizer/requestTokenizer.js +252 -0
  1135. package/core-dist/src/utils/request-tokenizer/requestTokenizer.js.map +1 -0
  1136. package/core-dist/src/utils/request-tokenizer/requestTokenizer.test.d.ts +6 -0
  1137. package/core-dist/src/utils/request-tokenizer/requestTokenizer.test.js +227 -0
  1138. package/core-dist/src/utils/request-tokenizer/requestTokenizer.test.js.map +1 -0
  1139. package/core-dist/src/utils/request-tokenizer/supportedImageFormats.d.ts +30 -0
  1140. package/core-dist/src/utils/request-tokenizer/supportedImageFormats.js +41 -0
  1141. package/core-dist/src/utils/request-tokenizer/supportedImageFormats.js.map +1 -0
  1142. package/core-dist/src/utils/request-tokenizer/textTokenizer.d.ts +32 -0
  1143. package/core-dist/src/utils/request-tokenizer/textTokenizer.js +54 -0
  1144. package/core-dist/src/utils/request-tokenizer/textTokenizer.js.map +1 -0
  1145. package/core-dist/src/utils/request-tokenizer/textTokenizer.test.d.ts +6 -0
  1146. package/core-dist/src/utils/request-tokenizer/textTokenizer.test.js +237 -0
  1147. package/core-dist/src/utils/request-tokenizer/textTokenizer.test.js.map +1 -0
  1148. package/core-dist/src/utils/request-tokenizer/types.d.ts +34 -0
  1149. package/core-dist/src/utils/request-tokenizer/types.js +7 -0
  1150. package/core-dist/src/utils/request-tokenizer/types.js.map +1 -0
  1151. package/core-dist/src/utils/retry.d.ts +38 -0
  1152. package/core-dist/src/utils/retry.js +180 -0
  1153. package/core-dist/src/utils/retry.js.map +1 -0
  1154. package/core-dist/src/utils/retry.test.d.ts +6 -0
  1155. package/core-dist/src/utils/retry.test.js +402 -0
  1156. package/core-dist/src/utils/retry.test.js.map +1 -0
  1157. package/core-dist/src/utils/ripgrepUtils.d.ts +61 -0
  1158. package/core-dist/src/utils/ripgrepUtils.js +227 -0
  1159. package/core-dist/src/utils/ripgrepUtils.js.map +1 -0
  1160. package/core-dist/src/utils/ripgrepUtils.test.d.ts +6 -0
  1161. package/core-dist/src/utils/ripgrepUtils.test.js +101 -0
  1162. package/core-dist/src/utils/ripgrepUtils.test.js.map +1 -0
  1163. package/core-dist/src/utils/runtimeFetchOptions.d.ts +44 -0
  1164. package/core-dist/src/utils/runtimeFetchOptions.js +92 -0
  1165. package/core-dist/src/utils/runtimeFetchOptions.js.map +1 -0
  1166. package/core-dist/src/utils/runtimeFetchOptions.test.d.ts +6 -0
  1167. package/core-dist/src/utils/runtimeFetchOptions.test.js +70 -0
  1168. package/core-dist/src/utils/runtimeFetchOptions.test.js.map +1 -0
  1169. package/core-dist/src/utils/safeJsonParse.d.ts +15 -0
  1170. package/core-dist/src/utils/safeJsonParse.js +43 -0
  1171. package/core-dist/src/utils/safeJsonParse.js.map +1 -0
  1172. package/core-dist/src/utils/safeJsonParse.test.d.ts +6 -0
  1173. package/core-dist/src/utils/safeJsonParse.test.js +112 -0
  1174. package/core-dist/src/utils/safeJsonParse.test.js.map +1 -0
  1175. package/core-dist/src/utils/safeJsonStringify.d.ts +13 -0
  1176. package/core-dist/src/utils/safeJsonStringify.js +25 -0
  1177. package/core-dist/src/utils/safeJsonStringify.js.map +1 -0
  1178. package/core-dist/src/utils/safeJsonStringify.test.d.ts +6 -0
  1179. package/core-dist/src/utils/safeJsonStringify.test.js +61 -0
  1180. package/core-dist/src/utils/safeJsonStringify.test.js.map +1 -0
  1181. package/core-dist/src/utils/schemaConverter.d.ts +15 -0
  1182. package/core-dist/src/utils/schemaConverter.js +109 -0
  1183. package/core-dist/src/utils/schemaConverter.js.map +1 -0
  1184. package/core-dist/src/utils/schemaConverter.test.d.ts +6 -0
  1185. package/core-dist/src/utils/schemaConverter.test.js +106 -0
  1186. package/core-dist/src/utils/schemaConverter.test.js.map +1 -0
  1187. package/core-dist/src/utils/schemaValidator.d.ts +16 -0
  1188. package/core-dist/src/utils/schemaValidator.js +123 -0
  1189. package/core-dist/src/utils/schemaValidator.js.map +1 -0
  1190. package/core-dist/src/utils/schemaValidator.test.d.ts +6 -0
  1191. package/core-dist/src/utils/schemaValidator.test.js +266 -0
  1192. package/core-dist/src/utils/schemaValidator.test.js.map +1 -0
  1193. package/core-dist/src/utils/secure-browser-launcher.d.ts +23 -0
  1194. package/core-dist/src/utils/secure-browser-launcher.js +165 -0
  1195. package/core-dist/src/utils/secure-browser-launcher.js.map +1 -0
  1196. package/core-dist/src/utils/secure-browser-launcher.test.d.ts +6 -0
  1197. package/core-dist/src/utils/secure-browser-launcher.test.js +149 -0
  1198. package/core-dist/src/utils/secure-browser-launcher.test.js.map +1 -0
  1199. package/core-dist/src/utils/shell-utils.d.ts +158 -0
  1200. package/core-dist/src/utils/shell-utils.js +739 -0
  1201. package/core-dist/src/utils/shell-utils.js.map +1 -0
  1202. package/core-dist/src/utils/shell-utils.test.d.ts +6 -0
  1203. package/core-dist/src/utils/shell-utils.test.js +466 -0
  1204. package/core-dist/src/utils/shell-utils.test.js.map +1 -0
  1205. package/core-dist/src/utils/shellReadOnlyChecker.d.ts +6 -0
  1206. package/core-dist/src/utils/shellReadOnlyChecker.js +290 -0
  1207. package/core-dist/src/utils/shellReadOnlyChecker.js.map +1 -0
  1208. package/core-dist/src/utils/shellReadOnlyChecker.test.d.ts +6 -0
  1209. package/core-dist/src/utils/shellReadOnlyChecker.test.js +157 -0
  1210. package/core-dist/src/utils/shellReadOnlyChecker.test.js.map +1 -0
  1211. package/core-dist/src/utils/subagentGenerator.d.ts +20 -0
  1212. package/core-dist/src/utils/subagentGenerator.js +120 -0
  1213. package/core-dist/src/utils/subagentGenerator.js.map +1 -0
  1214. package/core-dist/src/utils/subagentGenerator.test.d.ts +6 -0
  1215. package/core-dist/src/utils/subagentGenerator.test.js +135 -0
  1216. package/core-dist/src/utils/subagentGenerator.test.js.map +1 -0
  1217. package/core-dist/src/utils/summarizer.d.ts +25 -0
  1218. package/core-dist/src/utils/summarizer.js +53 -0
  1219. package/core-dist/src/utils/summarizer.js.map +1 -0
  1220. package/core-dist/src/utils/summarizer.test.d.ts +6 -0
  1221. package/core-dist/src/utils/summarizer.test.js +128 -0
  1222. package/core-dist/src/utils/summarizer.test.js.map +1 -0
  1223. package/core-dist/src/utils/symlink.d.ts +26 -0
  1224. package/core-dist/src/utils/symlink.js +43 -0
  1225. package/core-dist/src/utils/symlink.js.map +1 -0
  1226. package/core-dist/src/utils/systemEncoding.d.ts +40 -0
  1227. package/core-dist/src/utils/systemEncoding.js +160 -0
  1228. package/core-dist/src/utils/systemEncoding.js.map +1 -0
  1229. package/core-dist/src/utils/systemEncoding.test.d.ts +6 -0
  1230. package/core-dist/src/utils/systemEncoding.test.js +367 -0
  1231. package/core-dist/src/utils/systemEncoding.test.js.map +1 -0
  1232. package/core-dist/src/utils/terminalSerializer.d.ts +25 -0
  1233. package/core-dist/src/utils/terminalSerializer.js +432 -0
  1234. package/core-dist/src/utils/terminalSerializer.js.map +1 -0
  1235. package/core-dist/src/utils/terminalSerializer.test.d.ts +6 -0
  1236. package/core-dist/src/utils/terminalSerializer.test.js +176 -0
  1237. package/core-dist/src/utils/terminalSerializer.test.js.map +1 -0
  1238. package/core-dist/src/utils/testUtils.d.ts +29 -0
  1239. package/core-dist/src/utils/testUtils.js +70 -0
  1240. package/core-dist/src/utils/testUtils.js.map +1 -0
  1241. package/core-dist/src/utils/textUtils.d.ts +29 -0
  1242. package/core-dist/src/utils/textUtils.js +59 -0
  1243. package/core-dist/src/utils/textUtils.js.map +1 -0
  1244. package/core-dist/src/utils/textUtils.test.d.ts +6 -0
  1245. package/core-dist/src/utils/textUtils.test.js +91 -0
  1246. package/core-dist/src/utils/textUtils.test.js.map +1 -0
  1247. package/core-dist/src/utils/thoughtUtils.d.ts +23 -0
  1248. package/core-dist/src/utils/thoughtUtils.js +53 -0
  1249. package/core-dist/src/utils/thoughtUtils.js.map +1 -0
  1250. package/core-dist/src/utils/thoughtUtils.test.d.ts +6 -0
  1251. package/core-dist/src/utils/thoughtUtils.test.js +78 -0
  1252. package/core-dist/src/utils/thoughtUtils.test.js.map +1 -0
  1253. package/core-dist/src/utils/toml-to-markdown-converter.d.ts +22 -0
  1254. package/core-dist/src/utils/toml-to-markdown-converter.js +61 -0
  1255. package/core-dist/src/utils/toml-to-markdown-converter.js.map +1 -0
  1256. package/core-dist/src/utils/toml-to-markdown-converter.test.d.ts +6 -0
  1257. package/core-dist/src/utils/toml-to-markdown-converter.test.js +73 -0
  1258. package/core-dist/src/utils/toml-to-markdown-converter.test.js.map +1 -0
  1259. package/core-dist/src/utils/tool-utils.d.ts +22 -0
  1260. package/core-dist/src/utils/tool-utils.js +121 -0
  1261. package/core-dist/src/utils/tool-utils.js.map +1 -0
  1262. package/core-dist/src/utils/tool-utils.test.d.ts +6 -0
  1263. package/core-dist/src/utils/tool-utils.test.js +100 -0
  1264. package/core-dist/src/utils/tool-utils.test.js.map +1 -0
  1265. package/core-dist/src/utils/workspaceContext.d.ts +66 -0
  1266. package/core-dist/src/utils/workspaceContext.js +173 -0
  1267. package/core-dist/src/utils/workspaceContext.js.map +1 -0
  1268. package/core-dist/src/utils/workspaceContext.test.d.ts +6 -0
  1269. package/core-dist/src/utils/workspaceContext.test.js +313 -0
  1270. package/core-dist/src/utils/workspaceContext.test.js.map +1 -0
  1271. package/core-dist/src/utils/yaml-parser.d.ts +29 -0
  1272. package/core-dist/src/utils/yaml-parser.js +172 -0
  1273. package/core-dist/src/utils/yaml-parser.js.map +1 -0
  1274. package/core-dist/src/utils/yaml-parser.test.d.ts +6 -0
  1275. package/core-dist/src/utils/yaml-parser.test.js +170 -0
  1276. package/core-dist/src/utils/yaml-parser.test.js.map +1 -0
  1277. package/core-dist/tsconfig.tsbuildinfo +1 -0
  1278. package/package.json +2 -1
  1279. package/scripts/postinstall.cjs +32 -6
@@ -0,0 +1,1621 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
7
+ import { EventEmitter } from 'events';
8
+ import {} from 'child_process';
9
+ import { generateCodeChallenge, generateCodeVerifier, generatePKCEPair, isDeviceAuthorizationSuccess, isDeviceTokenPending, isDeviceTokenSuccess, isErrorResponse, qwenOAuth2Events, QwenOAuth2Event, QwenOAuth2Client, } from './qwenOAuth2.js';
10
+ import { SharedTokenManager, TokenManagerError, TokenError, } from './sharedTokenManager.js';
11
+ // Mock SharedTokenManager
12
+ vi.mock('./sharedTokenManager.js', () => ({
13
+ SharedTokenManager: class {
14
+ static instance = null;
15
+ static getInstance() {
16
+ if (!this.instance) {
17
+ this.instance = new this();
18
+ }
19
+ return this.instance;
20
+ }
21
+ async getValidCredentials(qwenClient) {
22
+ // Try to get credentials from the client first
23
+ const clientCredentials = qwenClient.getCredentials();
24
+ if (clientCredentials && clientCredentials.access_token) {
25
+ return clientCredentials;
26
+ }
27
+ // Fall back to default mock credentials if client has none
28
+ return {
29
+ access_token: 'new-access-token',
30
+ refresh_token: 'valid-refresh-token',
31
+ resource_url: undefined,
32
+ token_type: 'Bearer',
33
+ expiry_date: Date.now() + 3600000,
34
+ };
35
+ }
36
+ getCurrentCredentials() {
37
+ // Return null to let the client manage its own credentials
38
+ return null;
39
+ }
40
+ clearCache() {
41
+ // Do nothing in mock
42
+ }
43
+ },
44
+ TokenManagerError: class extends Error {
45
+ constructor(message) {
46
+ super(message);
47
+ this.name = 'TokenManagerError';
48
+ }
49
+ },
50
+ TokenError: {
51
+ REFRESH_FAILED: 'REFRESH_FAILED',
52
+ NO_REFRESH_TOKEN: 'NO_REFRESH_TOKEN',
53
+ LOCK_TIMEOUT: 'LOCK_TIMEOUT',
54
+ FILE_ACCESS_ERROR: 'FILE_ACCESS_ERROR',
55
+ NETWORK_ERROR: 'NETWORK_ERROR',
56
+ },
57
+ }));
58
+ // Mock qrcode-terminal
59
+ vi.mock('qrcode-terminal', () => ({
60
+ default: {
61
+ generate: vi.fn(),
62
+ },
63
+ }));
64
+ // Mock open
65
+ vi.mock('open', () => ({
66
+ default: vi.fn(),
67
+ }));
68
+ // Mock process.stdout.write
69
+ vi.mock('process', () => ({
70
+ stdout: {
71
+ write: vi.fn(),
72
+ },
73
+ }));
74
+ // Mock file system operations
75
+ vi.mock('node:fs', () => ({
76
+ promises: {
77
+ readFile: vi.fn(),
78
+ writeFile: vi.fn(),
79
+ unlink: vi.fn(),
80
+ mkdir: vi.fn().mockResolvedValue(undefined),
81
+ },
82
+ }));
83
+ describe('PKCE Code Generation', () => {
84
+ describe('generateCodeVerifier', () => {
85
+ it('should generate a code verifier with correct length', () => {
86
+ const codeVerifier = generateCodeVerifier();
87
+ expect(codeVerifier).toMatch(/^[A-Za-z0-9_-]{43}$/);
88
+ });
89
+ it('should generate different verifiers on subsequent calls', () => {
90
+ const verifier1 = generateCodeVerifier();
91
+ const verifier2 = generateCodeVerifier();
92
+ expect(verifier1).not.toBe(verifier2);
93
+ });
94
+ });
95
+ describe('generateCodeChallenge', () => {
96
+ it('should generate code challenge from verifier', () => {
97
+ const verifier = 'test-verifier-1234567890abcdefghijklmnopqrst';
98
+ const challenge = generateCodeChallenge(verifier);
99
+ // Should be base64url encoded
100
+ expect(challenge).toMatch(/^[A-Za-z0-9_-]+$/);
101
+ expect(challenge).not.toBe(verifier);
102
+ });
103
+ });
104
+ describe('generatePKCEPair', () => {
105
+ it('should generate valid PKCE pair', () => {
106
+ const { code_verifier, code_challenge } = generatePKCEPair();
107
+ expect(code_verifier).toMatch(/^[A-Za-z0-9_-]{43}$/);
108
+ expect(code_challenge).toMatch(/^[A-Za-z0-9_-]+$/);
109
+ expect(code_verifier).not.toBe(code_challenge);
110
+ });
111
+ });
112
+ });
113
+ describe('Type Guards', () => {
114
+ describe('isDeviceAuthorizationSuccess', () => {
115
+ it('should return true for successful authorization response', () => {
116
+ const expectedBaseUrl = process.env['DEBUG']
117
+ ? 'https://pre4-chat.qwen.ai'
118
+ : 'https://chat.qwen.ai';
119
+ const successResponse = {
120
+ device_code: 'test-device-code',
121
+ user_code: 'TEST123',
122
+ verification_uri: `${expectedBaseUrl}/device`,
123
+ verification_uri_complete: `${expectedBaseUrl}/device?code=TEST123`,
124
+ expires_in: 1800,
125
+ };
126
+ expect(isDeviceAuthorizationSuccess(successResponse)).toBe(true);
127
+ });
128
+ it('should return false for error response', () => {
129
+ const errorResponse = {
130
+ error: 'INVALID_REQUEST',
131
+ error_description: 'The request parameters are invalid',
132
+ };
133
+ expect(isDeviceAuthorizationSuccess(errorResponse)).toBe(false);
134
+ });
135
+ });
136
+ describe('isDeviceTokenPending', () => {
137
+ it('should return true for pending response', () => {
138
+ const pendingResponse = {
139
+ status: 'pending',
140
+ };
141
+ expect(isDeviceTokenPending(pendingResponse)).toBe(true);
142
+ });
143
+ it('should return false for success response', () => {
144
+ const successResponse = {
145
+ access_token: 'valid-access-token',
146
+ refresh_token: 'valid-refresh-token',
147
+ token_type: 'Bearer',
148
+ expires_in: 3600,
149
+ scope: 'openid profile email model.completion',
150
+ };
151
+ expect(isDeviceTokenPending(successResponse)).toBe(false);
152
+ });
153
+ it('should return false for error response', () => {
154
+ const errorResponse = {
155
+ error: 'ACCESS_DENIED',
156
+ error_description: 'User denied the authorization request',
157
+ };
158
+ expect(isDeviceTokenPending(errorResponse)).toBe(false);
159
+ });
160
+ });
161
+ describe('isDeviceTokenSuccess', () => {
162
+ it('should return true for successful token response', () => {
163
+ const successResponse = {
164
+ access_token: 'valid-access-token',
165
+ refresh_token: 'valid-refresh-token',
166
+ token_type: 'Bearer',
167
+ expires_in: 3600,
168
+ scope: 'openid profile email model.completion',
169
+ };
170
+ expect(isDeviceTokenSuccess(successResponse)).toBe(true);
171
+ });
172
+ it('should return false for pending response', () => {
173
+ const pendingResponse = {
174
+ status: 'pending',
175
+ };
176
+ expect(isDeviceTokenSuccess(pendingResponse)).toBe(false);
177
+ });
178
+ it('should return false for error response', () => {
179
+ const errorResponse = {
180
+ error: 'ACCESS_DENIED',
181
+ error_description: 'User denied the authorization request',
182
+ };
183
+ expect(isDeviceTokenSuccess(errorResponse)).toBe(false);
184
+ });
185
+ it('should return false for null access token', () => {
186
+ const nullTokenResponse = {
187
+ access_token: null,
188
+ token_type: 'Bearer',
189
+ expires_in: 3600,
190
+ };
191
+ expect(isDeviceTokenSuccess(nullTokenResponse)).toBe(false);
192
+ });
193
+ it('should return false for empty access token', () => {
194
+ const emptyTokenResponse = {
195
+ access_token: '',
196
+ token_type: 'Bearer',
197
+ expires_in: 3600,
198
+ };
199
+ expect(isDeviceTokenSuccess(emptyTokenResponse)).toBe(false);
200
+ });
201
+ });
202
+ describe('isErrorResponse', () => {
203
+ it('should return true for error responses', () => {
204
+ const errorResponse = {
205
+ error: 'INVALID_REQUEST',
206
+ error_description: 'The request parameters are invalid',
207
+ };
208
+ expect(isErrorResponse(errorResponse)).toBe(true);
209
+ });
210
+ it('should return false for successful responses', () => {
211
+ const successResponse = {
212
+ device_code: 'test-device-code',
213
+ user_code: 'TEST123',
214
+ verification_uri: 'https://chat.qwen.ai/device',
215
+ verification_uri_complete: 'https://chat.qwen.ai/device?code=TEST123',
216
+ expires_in: 1800,
217
+ };
218
+ expect(isErrorResponse(successResponse)).toBe(false);
219
+ });
220
+ });
221
+ });
222
+ describe('QwenOAuth2Client', () => {
223
+ let client;
224
+ let originalFetch;
225
+ beforeEach(() => {
226
+ // Create client instance
227
+ client = new QwenOAuth2Client();
228
+ // Mock fetch
229
+ originalFetch = global.fetch;
230
+ global.fetch = vi.fn();
231
+ });
232
+ afterEach(() => {
233
+ global.fetch = originalFetch;
234
+ vi.clearAllMocks();
235
+ });
236
+ describe('requestDeviceAuthorization', () => {
237
+ it('should successfully request device authorization', async () => {
238
+ const mockResponse = {
239
+ ok: true,
240
+ json: async () => ({
241
+ device_code: 'test-device-code',
242
+ user_code: 'TEST123',
243
+ verification_uri: 'https://chat.qwen.ai/device',
244
+ verification_uri_complete: 'https://chat.qwen.ai/device?code=TEST123',
245
+ expires_in: 1800,
246
+ }),
247
+ };
248
+ vi.mocked(global.fetch).mockResolvedValue(mockResponse);
249
+ const result = await client.requestDeviceAuthorization({
250
+ scope: 'openid profile email model.completion',
251
+ code_challenge: 'test-challenge',
252
+ code_challenge_method: 'S256',
253
+ });
254
+ expect(result).toEqual({
255
+ device_code: 'test-device-code',
256
+ user_code: 'TEST123',
257
+ verification_uri: 'https://chat.qwen.ai/device',
258
+ verification_uri_complete: 'https://chat.qwen.ai/device?code=TEST123',
259
+ expires_in: 1800,
260
+ });
261
+ });
262
+ it('should handle error response', async () => {
263
+ const mockResponse = {
264
+ ok: true,
265
+ json: async () => ({
266
+ error: 'INVALID_REQUEST',
267
+ error_description: 'The request parameters are invalid',
268
+ }),
269
+ };
270
+ vi.mocked(global.fetch).mockResolvedValue(mockResponse);
271
+ await expect(client.requestDeviceAuthorization({
272
+ scope: 'openid profile email model.completion',
273
+ code_challenge: 'test-challenge',
274
+ code_challenge_method: 'S256',
275
+ })).rejects.toThrow('Device authorization failed: INVALID_REQUEST - The request parameters are invalid');
276
+ });
277
+ });
278
+ describe('refreshAccessToken', () => {
279
+ beforeEach(() => {
280
+ // Set up client with credentials
281
+ client.setCredentials({
282
+ access_token: 'old-token',
283
+ refresh_token: 'test-refresh-token',
284
+ token_type: 'Bearer',
285
+ });
286
+ });
287
+ it('should successfully refresh access token', async () => {
288
+ const mockResponse = {
289
+ ok: true,
290
+ json: async () => ({
291
+ access_token: 'new-access-token',
292
+ token_type: 'Bearer',
293
+ expires_in: 3600,
294
+ resource_url: 'https://new-endpoint.com',
295
+ }),
296
+ };
297
+ vi.mocked(global.fetch).mockResolvedValue(mockResponse);
298
+ const result = await client.refreshAccessToken();
299
+ expect(result).toEqual({
300
+ access_token: 'new-access-token',
301
+ token_type: 'Bearer',
302
+ expires_in: 3600,
303
+ resource_url: 'https://new-endpoint.com',
304
+ });
305
+ // Verify credentials were updated
306
+ const credentials = client.getCredentials();
307
+ expect(credentials.access_token).toBe('new-access-token');
308
+ });
309
+ it('should handle refresh error', async () => {
310
+ const mockResponse = {
311
+ ok: true,
312
+ json: async () => ({
313
+ error: 'INVALID_GRANT',
314
+ error_description: 'The refresh token is invalid',
315
+ }),
316
+ };
317
+ vi.mocked(global.fetch).mockResolvedValue(mockResponse);
318
+ await expect(client.refreshAccessToken()).rejects.toThrow('Token refresh failed: INVALID_GRANT - The refresh token is invalid');
319
+ });
320
+ it('should successfully refresh access token and update credentials', async () => {
321
+ // Clear any previous calls
322
+ vi.clearAllMocks();
323
+ const mockResponse = {
324
+ ok: true,
325
+ json: async () => ({
326
+ access_token: 'new-access-token',
327
+ token_type: 'Bearer',
328
+ expires_in: 3600,
329
+ resource_url: 'https://new-endpoint.com',
330
+ }),
331
+ };
332
+ vi.mocked(global.fetch).mockResolvedValue(mockResponse);
333
+ const result = await client.refreshAccessToken();
334
+ // Verify the response
335
+ expect(result).toMatchObject({
336
+ access_token: 'new-access-token',
337
+ token_type: 'Bearer',
338
+ expires_in: 3600,
339
+ resource_url: 'https://new-endpoint.com',
340
+ });
341
+ // Verify credentials were updated
342
+ const credentials = client.getCredentials();
343
+ expect(credentials).toMatchObject({
344
+ access_token: 'new-access-token',
345
+ token_type: 'Bearer',
346
+ refresh_token: 'test-refresh-token', // Should preserve existing refresh token
347
+ resource_url: 'https://new-endpoint.com',
348
+ });
349
+ expect(credentials.expiry_date).toBeDefined();
350
+ });
351
+ it('should use new refresh token if provided in response', async () => {
352
+ // Clear any previous calls
353
+ vi.clearAllMocks();
354
+ const mockResponse = {
355
+ ok: true,
356
+ json: async () => ({
357
+ access_token: 'new-access-token',
358
+ token_type: 'Bearer',
359
+ expires_in: 3600,
360
+ refresh_token: 'new-refresh-token', // New refresh token provided
361
+ resource_url: 'https://new-endpoint.com',
362
+ }),
363
+ };
364
+ vi.mocked(global.fetch).mockResolvedValue(mockResponse);
365
+ await client.refreshAccessToken();
366
+ // Verify the credentials contain the new refresh token
367
+ const credentials = client.getCredentials();
368
+ expect(credentials.refresh_token).toBe('new-refresh-token');
369
+ });
370
+ });
371
+ describe('getAccessToken', () => {
372
+ it('should return access token if valid and not expired', async () => {
373
+ // Set valid credentials
374
+ client.setCredentials({
375
+ access_token: 'valid-token',
376
+ expiry_date: Date.now() + 60 * 60 * 1000, // 1 hour from now
377
+ });
378
+ const result = await client.getAccessToken();
379
+ expect(result.token).toBe('valid-token');
380
+ });
381
+ it('should refresh token if access token is expired', async () => {
382
+ // Set expired credentials with refresh token
383
+ client.setCredentials({
384
+ access_token: 'expired-token',
385
+ refresh_token: 'valid-refresh-token',
386
+ expiry_date: Date.now() - 1000, // 1 second ago
387
+ });
388
+ // Override the client's SharedTokenManager instance directly
389
+ client.sharedManager = {
390
+ getValidCredentials: vi.fn().mockResolvedValue({
391
+ access_token: 'new-access-token',
392
+ refresh_token: 'valid-refresh-token',
393
+ token_type: 'Bearer',
394
+ expiry_date: Date.now() + 3600000,
395
+ }),
396
+ };
397
+ const result = await client.getAccessToken();
398
+ expect(result.token).toBe('new-access-token');
399
+ });
400
+ it('should return undefined if no access token and no refresh token', async () => {
401
+ client.setCredentials({});
402
+ // Override the client's SharedTokenManager instance directly
403
+ client.sharedManager = {
404
+ getValidCredentials: vi
405
+ .fn()
406
+ .mockRejectedValue(new Error('No credentials available')),
407
+ };
408
+ const result = await client.getAccessToken();
409
+ expect(result.token).toBeUndefined();
410
+ });
411
+ });
412
+ describe('pollDeviceToken', () => {
413
+ it('should successfully poll for device token', async () => {
414
+ const mockResponse = {
415
+ ok: true,
416
+ json: async () => ({
417
+ access_token: 'new-access-token',
418
+ refresh_token: 'new-refresh-token',
419
+ token_type: 'Bearer',
420
+ expires_in: 3600,
421
+ scope: 'openid profile email model.completion',
422
+ }),
423
+ };
424
+ vi.mocked(global.fetch).mockResolvedValue(mockResponse);
425
+ const result = await client.pollDeviceToken({
426
+ device_code: 'test-device-code',
427
+ code_verifier: 'test-code-verifier',
428
+ });
429
+ expect(result).toEqual({
430
+ access_token: 'new-access-token',
431
+ refresh_token: 'new-refresh-token',
432
+ token_type: 'Bearer',
433
+ expires_in: 3600,
434
+ scope: 'openid profile email model.completion',
435
+ });
436
+ });
437
+ it('should return pending status when authorization is pending', async () => {
438
+ const mockResponse = {
439
+ ok: true,
440
+ json: async () => ({
441
+ status: 'pending',
442
+ }),
443
+ };
444
+ vi.mocked(global.fetch).mockResolvedValue(mockResponse);
445
+ const result = await client.pollDeviceToken({
446
+ device_code: 'test-device-code',
447
+ code_verifier: 'test-code-verifier',
448
+ });
449
+ expect(result).toEqual({
450
+ status: 'pending',
451
+ });
452
+ });
453
+ it('should handle HTTP error responses', async () => {
454
+ const mockResponse = {
455
+ ok: false,
456
+ status: 400,
457
+ statusText: 'Bad Request',
458
+ text: async () => 'Invalid device code',
459
+ };
460
+ vi.mocked(global.fetch).mockResolvedValue(mockResponse);
461
+ await expect(client.pollDeviceToken({
462
+ device_code: 'invalid-device-code',
463
+ code_verifier: 'test-code-verifier',
464
+ })).rejects.toThrow('Device token poll failed: 400 Bad Request');
465
+ });
466
+ it('should include status code in error for better handling', async () => {
467
+ const mockResponse = {
468
+ ok: false,
469
+ status: 429,
470
+ statusText: 'Too Many Requests',
471
+ text: async () => 'Rate limited',
472
+ };
473
+ vi.mocked(global.fetch).mockResolvedValue(mockResponse);
474
+ try {
475
+ await client.pollDeviceToken({
476
+ device_code: 'test-device-code',
477
+ code_verifier: 'test-code-verifier',
478
+ });
479
+ }
480
+ catch (error) {
481
+ expect(error.status).toBe(429);
482
+ }
483
+ });
484
+ it('should handle authorization_pending with HTTP 400 according to RFC 8628', async () => {
485
+ const errorData = {
486
+ error: 'authorization_pending',
487
+ error_description: 'The authorization request is still pending',
488
+ };
489
+ const mockResponse = {
490
+ ok: false,
491
+ status: 400,
492
+ statusText: 'Bad Request',
493
+ text: async () => JSON.stringify(errorData),
494
+ json: async () => errorData,
495
+ };
496
+ vi.mocked(global.fetch).mockResolvedValue(mockResponse);
497
+ const result = await client.pollDeviceToken({
498
+ device_code: 'test-device-code',
499
+ code_verifier: 'test-code-verifier',
500
+ });
501
+ expect(result).toEqual({
502
+ status: 'pending',
503
+ });
504
+ });
505
+ it('should handle slow_down with HTTP 429 according to RFC 8628', async () => {
506
+ const errorData = {
507
+ error: 'slow_down',
508
+ error_description: 'The client is polling too frequently',
509
+ };
510
+ const mockResponse = {
511
+ ok: false,
512
+ status: 429,
513
+ statusText: 'Too Many Requests',
514
+ text: async () => JSON.stringify(errorData),
515
+ json: async () => errorData,
516
+ };
517
+ vi.mocked(global.fetch).mockResolvedValue(mockResponse);
518
+ const result = await client.pollDeviceToken({
519
+ device_code: 'test-device-code',
520
+ code_verifier: 'test-code-verifier',
521
+ });
522
+ expect(result).toEqual({
523
+ status: 'pending',
524
+ slowDown: true,
525
+ });
526
+ });
527
+ });
528
+ describe('refreshAccessToken error handling', () => {
529
+ beforeEach(() => {
530
+ client.setCredentials({
531
+ access_token: 'old-token',
532
+ refresh_token: 'test-refresh-token',
533
+ token_type: 'Bearer',
534
+ });
535
+ });
536
+ it('should throw error if no refresh token available', async () => {
537
+ client.setCredentials({ access_token: 'token' });
538
+ await expect(client.refreshAccessToken()).rejects.toThrow('No refresh token available');
539
+ });
540
+ it('should handle 400 status as expired refresh token', async () => {
541
+ const mockResponse = {
542
+ ok: false,
543
+ status: 400,
544
+ statusText: 'Bad Request',
545
+ text: async () => 'Refresh token expired',
546
+ };
547
+ vi.mocked(global.fetch).mockResolvedValue(mockResponse);
548
+ await expect(client.refreshAccessToken()).rejects.toThrow("Refresh token expired or invalid. Please use '/auth' to re-authenticate.");
549
+ });
550
+ it('should handle other HTTP error statuses', async () => {
551
+ const mockResponse = {
552
+ ok: false,
553
+ status: 500,
554
+ statusText: 'Internal Server Error',
555
+ text: async () => 'Server error',
556
+ };
557
+ vi.mocked(global.fetch).mockResolvedValue(mockResponse);
558
+ await expect(client.refreshAccessToken()).rejects.toThrow('Token refresh failed: 500 Internal Server Error');
559
+ });
560
+ });
561
+ describe('credentials management', () => {
562
+ it('should set and get credentials correctly', () => {
563
+ const credentials = {
564
+ access_token: 'test-token',
565
+ refresh_token: 'test-refresh',
566
+ token_type: 'Bearer',
567
+ expiry_date: Date.now() + 3600000,
568
+ };
569
+ client.setCredentials(credentials);
570
+ expect(client.getCredentials()).toEqual(credentials);
571
+ });
572
+ it('should handle empty credentials', () => {
573
+ client.setCredentials({});
574
+ expect(client.getCredentials()).toEqual({});
575
+ });
576
+ });
577
+ });
578
+ describe('getQwenOAuthClient', () => {
579
+ let mockConfig;
580
+ let originalFetch;
581
+ beforeEach(() => {
582
+ mockConfig = {
583
+ isBrowserLaunchSuppressed: vi.fn().mockReturnValue(false),
584
+ isInteractive: vi.fn().mockReturnValue(true),
585
+ };
586
+ originalFetch = global.fetch;
587
+ global.fetch = vi.fn();
588
+ });
589
+ afterEach(() => {
590
+ global.fetch = originalFetch;
591
+ vi.clearAllMocks();
592
+ });
593
+ it('should load cached credentials if available', async () => {
594
+ const mockCredentials = {
595
+ access_token: 'cached-token',
596
+ refresh_token: 'cached-refresh',
597
+ token_type: 'Bearer',
598
+ expiry_date: Date.now() + 3600000,
599
+ };
600
+ // Mock SharedTokenManager to use cached credentials
601
+ const mockTokenManager = {
602
+ getValidCredentials: vi.fn().mockResolvedValue(mockCredentials),
603
+ };
604
+ const originalGetInstance = SharedTokenManager.getInstance;
605
+ SharedTokenManager.getInstance = vi.fn().mockReturnValue(mockTokenManager);
606
+ const client = await import('./qwenOAuth2.js').then((module) => module.getQwenOAuthClient(mockConfig));
607
+ expect(client).toBeInstanceOf(Object);
608
+ expect(mockTokenManager.getValidCredentials).toHaveBeenCalled();
609
+ SharedTokenManager.getInstance = originalGetInstance;
610
+ });
611
+ it('should handle cached credentials refresh failure', async () => {
612
+ // Mock SharedTokenManager to fail with a specific error
613
+ const mockTokenManager = {
614
+ getValidCredentials: vi
615
+ .fn()
616
+ .mockRejectedValue(new Error('Token refresh failed')),
617
+ };
618
+ const originalGetInstance = SharedTokenManager.getInstance;
619
+ SharedTokenManager.getInstance = vi.fn().mockReturnValue(mockTokenManager);
620
+ // Mock device flow to also fail
621
+ const mockAuthResponse = {
622
+ ok: true,
623
+ json: async () => ({
624
+ error: 'invalid_request',
625
+ error_description: 'Invalid request parameters',
626
+ }),
627
+ };
628
+ vi.mocked(global.fetch).mockResolvedValue(mockAuthResponse);
629
+ // The function should handle the invalid cached credentials and throw the expected error
630
+ await expect(import('./qwenOAuth2.js').then((module) => module.getQwenOAuthClient(mockConfig))).rejects.toThrow('Device authorization flow failed');
631
+ SharedTokenManager.getInstance = originalGetInstance;
632
+ });
633
+ it('should not start device flow when requireCachedCredentials is true', async () => {
634
+ // Make SharedTokenManager fail so we hit the fallback path
635
+ const mockTokenManager = {
636
+ getValidCredentials: vi
637
+ .fn()
638
+ .mockRejectedValue(new Error('No credentials')),
639
+ };
640
+ const originalGetInstance = SharedTokenManager.getInstance;
641
+ SharedTokenManager.getInstance = vi.fn().mockReturnValue(mockTokenManager);
642
+ // If requireCachedCredentials is honored, device-flow network requests should not start
643
+ vi.mocked(global.fetch).mockResolvedValue({ ok: true });
644
+ await expect(import('./qwenOAuth2.js').then((module) => module.getQwenOAuthClient(mockConfig, {
645
+ requireCachedCredentials: true,
646
+ }))).rejects.toThrow('Qwen OAuth credentials expired. Please use /auth to re-authenticate with qwen-oauth.');
647
+ expect(global.fetch).not.toHaveBeenCalled();
648
+ SharedTokenManager.getInstance = originalGetInstance;
649
+ });
650
+ it('should include troubleshooting hints when device auth fetch fails', async () => {
651
+ // Make SharedTokenManager fail so we hit the fallback device-flow path
652
+ const mockTokenManager = {
653
+ getValidCredentials: vi
654
+ .fn()
655
+ .mockRejectedValue(new Error('Token refresh failed')),
656
+ };
657
+ const originalGetInstance = SharedTokenManager.getInstance;
658
+ SharedTokenManager.getInstance = vi.fn().mockReturnValue(mockTokenManager);
659
+ const tlsCause = new Error('unable to verify the first certificate');
660
+ tlsCause.code =
661
+ 'UNABLE_TO_VERIFY_LEAF_SIGNATURE';
662
+ const fetchError = new TypeError('fetch failed');
663
+ fetchError.cause = tlsCause;
664
+ vi.mocked(global.fetch).mockRejectedValue(fetchError);
665
+ const emitSpy = vi.spyOn(qwenOAuth2Events, 'emit');
666
+ let thrownError;
667
+ try {
668
+ const { getQwenOAuthClient } = await import('./qwenOAuth2.js');
669
+ await getQwenOAuthClient(mockConfig);
670
+ }
671
+ catch (error) {
672
+ thrownError = error;
673
+ }
674
+ expect(thrownError).toBeInstanceOf(Error);
675
+ expect(thrownError.message).toContain('Device authorization flow failed: fetch failed');
676
+ expect(thrownError.message).toContain('UNABLE_TO_VERIFY_LEAF_SIGNATURE');
677
+ expect(thrownError.message).toContain('NODE_EXTRA_CA_CERTS');
678
+ expect(thrownError.message).toContain('--proxy');
679
+ expect(emitSpy).toHaveBeenCalledWith(QwenOAuth2Event.AuthProgress, 'error', expect.stringContaining('NODE_EXTRA_CA_CERTS'));
680
+ emitSpy.mockRestore();
681
+ SharedTokenManager.getInstance = originalGetInstance;
682
+ });
683
+ });
684
+ describe('CredentialsClearRequiredError', () => {
685
+ it('should create error with correct name and message', async () => {
686
+ const { CredentialsClearRequiredError } = await import('./qwenOAuth2.js');
687
+ const message = 'Test error message';
688
+ const originalError = { status: 400, response: 'Bad Request' };
689
+ const error = new CredentialsClearRequiredError(message, originalError);
690
+ expect(error.name).toBe('CredentialsClearRequiredError');
691
+ expect(error.message).toBe(message);
692
+ expect(error.originalError).toBe(originalError);
693
+ expect(error instanceof Error).toBe(true);
694
+ });
695
+ it('should work without originalError', async () => {
696
+ const { CredentialsClearRequiredError } = await import('./qwenOAuth2.js');
697
+ const message = 'Test error message';
698
+ const error = new CredentialsClearRequiredError(message);
699
+ expect(error.name).toBe('CredentialsClearRequiredError');
700
+ expect(error.message).toBe(message);
701
+ expect(error.originalError).toBeUndefined();
702
+ });
703
+ });
704
+ describe('clearQwenCredentials', () => {
705
+ it('should successfully clear credentials file', async () => {
706
+ const { promises: fs } = await import('node:fs');
707
+ const { clearQwenCredentials } = await import('./qwenOAuth2.js');
708
+ vi.mocked(fs.unlink).mockResolvedValue(undefined);
709
+ await expect(clearQwenCredentials()).resolves.not.toThrow();
710
+ expect(fs.unlink).toHaveBeenCalled();
711
+ });
712
+ it('should handle file not found error gracefully', async () => {
713
+ const { promises: fs } = await import('node:fs');
714
+ const { clearQwenCredentials } = await import('./qwenOAuth2.js');
715
+ const notFoundError = new Error('File not found');
716
+ notFoundError.code = 'ENOENT';
717
+ vi.mocked(fs.unlink).mockRejectedValue(notFoundError);
718
+ await expect(clearQwenCredentials()).resolves.not.toThrow();
719
+ });
720
+ it('should handle other file system errors gracefully', async () => {
721
+ const { promises: fs } = await import('node:fs');
722
+ const { clearQwenCredentials } = await import('./qwenOAuth2.js');
723
+ const permissionError = new Error('Permission denied');
724
+ vi.mocked(fs.unlink).mockRejectedValue(permissionError);
725
+ // Should not throw but may log warning
726
+ await expect(clearQwenCredentials()).resolves.not.toThrow();
727
+ });
728
+ });
729
+ describe('QwenOAuth2Client - Additional Error Scenarios', () => {
730
+ let client;
731
+ let originalFetch;
732
+ beforeEach(() => {
733
+ client = new QwenOAuth2Client();
734
+ originalFetch = global.fetch;
735
+ global.fetch = vi.fn();
736
+ });
737
+ afterEach(() => {
738
+ global.fetch = originalFetch;
739
+ vi.clearAllMocks();
740
+ });
741
+ describe('requestDeviceAuthorization HTTP errors', () => {
742
+ it('should handle HTTP error response with non-ok status', async () => {
743
+ const mockResponse = {
744
+ ok: false,
745
+ status: 500,
746
+ statusText: 'Internal Server Error',
747
+ text: async () => 'Server error occurred',
748
+ };
749
+ vi.mocked(global.fetch).mockResolvedValue(mockResponse);
750
+ await expect(client.requestDeviceAuthorization({
751
+ scope: 'openid profile email model.completion',
752
+ code_challenge: 'test-challenge',
753
+ code_challenge_method: 'S256',
754
+ })).rejects.toThrow('Device authorization failed: 500 Internal Server Error. Response: Server error occurred');
755
+ });
756
+ });
757
+ });
758
+ describe('getQwenOAuthClient - Enhanced Error Scenarios', () => {
759
+ let mockConfig;
760
+ let originalFetch;
761
+ beforeEach(() => {
762
+ mockConfig = {
763
+ isBrowserLaunchSuppressed: vi.fn().mockReturnValue(false),
764
+ isInteractive: vi.fn().mockReturnValue(true),
765
+ };
766
+ originalFetch = global.fetch;
767
+ global.fetch = vi.fn();
768
+ });
769
+ afterEach(() => {
770
+ global.fetch = originalFetch;
771
+ vi.clearAllMocks();
772
+ });
773
+ it('should handle generic refresh token errors', async () => {
774
+ const { promises: fs } = await import('node:fs');
775
+ const mockCredentials = {
776
+ access_token: 'cached-token',
777
+ refresh_token: 'some-refresh-token',
778
+ token_type: 'Bearer',
779
+ expiry_date: Date.now() + 3600000,
780
+ };
781
+ vi.mocked(fs.readFile).mockResolvedValue(JSON.stringify(mockCredentials));
782
+ // Mock SharedTokenManager to fail
783
+ const mockTokenManager = {
784
+ getValidCredentials: vi
785
+ .fn()
786
+ .mockRejectedValue(new Error('Refresh failed')),
787
+ };
788
+ const originalGetInstance = SharedTokenManager.getInstance;
789
+ SharedTokenManager.getInstance = vi.fn().mockReturnValue(mockTokenManager);
790
+ // Mock device flow to also fail
791
+ const mockAuthResponse = {
792
+ ok: true,
793
+ json: async () => ({
794
+ error: 'invalid_request',
795
+ error_description: 'Invalid request parameters',
796
+ }),
797
+ };
798
+ vi.mocked(global.fetch).mockResolvedValue(mockAuthResponse);
799
+ await expect(import('./qwenOAuth2.js').then((module) => module.getQwenOAuthClient(mockConfig))).rejects.toThrow('Device authorization flow failed');
800
+ SharedTokenManager.getInstance = originalGetInstance;
801
+ });
802
+ it('should handle different authentication failure reasons - timeout', async () => {
803
+ const { promises: fs } = await import('node:fs');
804
+ vi.mocked(fs.readFile).mockRejectedValue(new Error('No cached credentials'));
805
+ // Mock SharedTokenManager to fail
806
+ const mockTokenManager = {
807
+ getValidCredentials: vi
808
+ .fn()
809
+ .mockRejectedValue(new Error('No credentials')),
810
+ };
811
+ const originalGetInstance = SharedTokenManager.getInstance;
812
+ SharedTokenManager.getInstance = vi.fn().mockReturnValue(mockTokenManager);
813
+ // Mock device authorization to succeed but polling to timeout
814
+ const mockAuthResponse = {
815
+ ok: true,
816
+ json: async () => ({
817
+ device_code: 'test-device-code',
818
+ user_code: 'TEST123',
819
+ verification_uri: 'https://chat.qwen.ai/device',
820
+ verification_uri_complete: 'https://chat.qwen.ai/device?code=TEST123',
821
+ expires_in: 0.1, // Very short timeout for testing
822
+ }),
823
+ };
824
+ const mockPendingResponse = {
825
+ ok: true,
826
+ json: async () => ({
827
+ status: 'pending',
828
+ }),
829
+ };
830
+ global.fetch = vi
831
+ .fn()
832
+ .mockResolvedValueOnce(mockAuthResponse)
833
+ .mockResolvedValue(mockPendingResponse);
834
+ await expect(import('./qwenOAuth2.js').then((module) => module.getQwenOAuthClient(mockConfig))).rejects.toThrow('Authorization timeout, please restart the process.');
835
+ SharedTokenManager.getInstance = originalGetInstance;
836
+ });
837
+ it('should handle authentication failure reason - rate limit', async () => {
838
+ const { promises: fs } = await import('node:fs');
839
+ vi.mocked(fs.readFile).mockRejectedValue(new Error('No cached credentials'));
840
+ // Mock SharedTokenManager to fail
841
+ const mockTokenManager = {
842
+ getValidCredentials: vi
843
+ .fn()
844
+ .mockRejectedValue(new Error('No credentials')),
845
+ };
846
+ const originalGetInstance = SharedTokenManager.getInstance;
847
+ SharedTokenManager.getInstance = vi.fn().mockReturnValue(mockTokenManager);
848
+ // Mock device authorization to succeed but polling to get rate limited
849
+ const mockAuthResponse = {
850
+ ok: true,
851
+ json: async () => ({
852
+ device_code: 'test-device-code',
853
+ user_code: 'TEST123',
854
+ verification_uri: 'https://chat.qwen.ai/device',
855
+ verification_uri_complete: 'https://chat.qwen.ai/device?code=TEST123',
856
+ expires_in: 1800,
857
+ }),
858
+ };
859
+ const mockRateLimitResponse = {
860
+ ok: false,
861
+ status: 429,
862
+ statusText: 'Too Many Requests',
863
+ text: async () => 'Rate limited',
864
+ };
865
+ global.fetch = vi
866
+ .fn()
867
+ .mockResolvedValueOnce(mockAuthResponse)
868
+ .mockResolvedValue(mockRateLimitResponse);
869
+ await expect(import('./qwenOAuth2.js').then((module) => module.getQwenOAuthClient(mockConfig))).rejects.toThrow('Too many requests. The server is rate limiting our requests. Please select a different authentication method or try again later.');
870
+ SharedTokenManager.getInstance = originalGetInstance;
871
+ });
872
+ it('should handle authentication failure reason - error', async () => {
873
+ const { promises: fs } = await import('node:fs');
874
+ vi.mocked(fs.readFile).mockRejectedValue(new Error('No cached credentials'));
875
+ // Mock SharedTokenManager to fail
876
+ const mockTokenManager = {
877
+ getValidCredentials: vi
878
+ .fn()
879
+ .mockRejectedValue(new Error('No credentials')),
880
+ };
881
+ const originalGetInstance = SharedTokenManager.getInstance;
882
+ SharedTokenManager.getInstance = vi.fn().mockReturnValue(mockTokenManager);
883
+ // Mock device authorization to fail
884
+ const mockAuthResponse = {
885
+ ok: true,
886
+ json: async () => ({
887
+ error: 'invalid_request',
888
+ error_description: 'Invalid request parameters',
889
+ }),
890
+ };
891
+ global.fetch = vi.fn().mockResolvedValue(mockAuthResponse);
892
+ await expect(import('./qwenOAuth2.js').then((module) => module.getQwenOAuthClient(mockConfig))).rejects.toThrow('Device authorization flow failed');
893
+ SharedTokenManager.getInstance = originalGetInstance;
894
+ });
895
+ });
896
+ describe('authWithQwenDeviceFlow - Comprehensive Testing', () => {
897
+ let mockConfig;
898
+ let originalFetch;
899
+ beforeEach(() => {
900
+ mockConfig = {
901
+ isBrowserLaunchSuppressed: vi.fn().mockReturnValue(false),
902
+ isInteractive: vi.fn().mockReturnValue(true),
903
+ };
904
+ originalFetch = global.fetch;
905
+ global.fetch = vi.fn();
906
+ // Mock setTimeout to avoid real delays in tests
907
+ vi.useFakeTimers();
908
+ });
909
+ afterEach(() => {
910
+ global.fetch = originalFetch;
911
+ vi.clearAllMocks();
912
+ vi.useRealTimers();
913
+ });
914
+ it('should handle device authorization error response', async () => {
915
+ const { promises: fs } = await import('node:fs');
916
+ vi.mocked(fs.readFile).mockRejectedValue(new Error('No cached credentials'));
917
+ // Mock SharedTokenManager to fail
918
+ const mockTokenManager = {
919
+ getValidCredentials: vi
920
+ .fn()
921
+ .mockRejectedValue(new Error('No credentials')),
922
+ };
923
+ const originalGetInstance = SharedTokenManager.getInstance;
924
+ SharedTokenManager.getInstance = vi.fn().mockReturnValue(mockTokenManager);
925
+ const mockAuthResponse = {
926
+ ok: true,
927
+ json: async () => ({
928
+ error: 'invalid_client',
929
+ error_description: 'Client authentication failed',
930
+ }),
931
+ };
932
+ global.fetch = vi.fn().mockResolvedValue(mockAuthResponse);
933
+ await expect(import('./qwenOAuth2.js').then((module) => module.getQwenOAuthClient(mockConfig))).rejects.toThrow('Device authorization flow failed');
934
+ SharedTokenManager.getInstance = originalGetInstance;
935
+ });
936
+ it('should handle successful authentication flow', async () => {
937
+ const { promises: fs } = await import('node:fs');
938
+ vi.mocked(fs.readFile).mockRejectedValue(new Error('No cached credentials'));
939
+ const mockAuthResponse = {
940
+ ok: true,
941
+ json: async () => ({
942
+ device_code: 'test-device-code',
943
+ user_code: 'TEST123',
944
+ verification_uri: 'https://chat.qwen.ai/device',
945
+ verification_uri_complete: 'https://chat.qwen.ai/device?code=TEST123',
946
+ expires_in: 1800,
947
+ }),
948
+ };
949
+ const mockTokenResponse = {
950
+ ok: true,
951
+ json: async () => ({
952
+ access_token: 'new-access-token',
953
+ refresh_token: 'new-refresh-token',
954
+ token_type: 'Bearer',
955
+ expires_in: 3600,
956
+ scope: 'openid profile email model.completion',
957
+ }),
958
+ };
959
+ vi.mocked(global.fetch)
960
+ .mockResolvedValueOnce(mockAuthResponse)
961
+ .mockResolvedValue(mockTokenResponse);
962
+ const client = await import('./qwenOAuth2.js').then((module) => module.getQwenOAuthClient(mockConfig));
963
+ expect(client).toBeInstanceOf(Object);
964
+ });
965
+ it('should handle 401 error during token polling', async () => {
966
+ const { promises: fs } = await import('node:fs');
967
+ vi.mocked(fs.readFile).mockRejectedValue(new Error('No cached credentials'));
968
+ // Mock SharedTokenManager to fail
969
+ const mockTokenManager = {
970
+ getValidCredentials: vi
971
+ .fn()
972
+ .mockRejectedValue(new Error('No credentials')),
973
+ };
974
+ const originalGetInstance = SharedTokenManager.getInstance;
975
+ SharedTokenManager.getInstance = vi.fn().mockReturnValue(mockTokenManager);
976
+ const mockAuthResponse = {
977
+ ok: true,
978
+ json: async () => ({
979
+ device_code: 'test-device-code',
980
+ user_code: 'TEST123',
981
+ verification_uri: 'https://chat.qwen.ai/device',
982
+ verification_uri_complete: 'https://chat.qwen.ai/device?code=TEST123',
983
+ expires_in: 1800,
984
+ }),
985
+ };
986
+ const mock401Response = {
987
+ ok: false,
988
+ status: 401,
989
+ statusText: 'Unauthorized',
990
+ text: async () => 'Device code expired',
991
+ };
992
+ global.fetch = vi
993
+ .fn()
994
+ .mockResolvedValueOnce(mockAuthResponse)
995
+ .mockResolvedValue(mock401Response);
996
+ await expect(import('./qwenOAuth2.js').then((module) => module.getQwenOAuthClient(mockConfig))).rejects.toThrow('Device code expired or invalid, please restart the authorization process.');
997
+ SharedTokenManager.getInstance = originalGetInstance;
998
+ });
999
+ it('should handle token polling with browser launch suppressed', async () => {
1000
+ const { promises: fs } = await import('node:fs');
1001
+ vi.mocked(fs.readFile).mockRejectedValue(new Error('No cached credentials'));
1002
+ // Mock SharedTokenManager to fail initially so device flow is used
1003
+ const mockTokenManager = {
1004
+ getValidCredentials: vi
1005
+ .fn()
1006
+ .mockRejectedValue(new Error('No credentials')),
1007
+ };
1008
+ const originalGetInstance = SharedTokenManager.getInstance;
1009
+ SharedTokenManager.getInstance = vi.fn().mockReturnValue(mockTokenManager);
1010
+ // Mock browser launch as suppressed
1011
+ mockConfig.isBrowserLaunchSuppressed = vi.fn().mockReturnValue(true);
1012
+ const mockAuthResponse = {
1013
+ ok: true,
1014
+ json: async () => ({
1015
+ device_code: 'test-device-code',
1016
+ user_code: 'TEST123',
1017
+ verification_uri: 'https://chat.qwen.ai/device',
1018
+ verification_uri_complete: 'https://chat.qwen.ai/device?code=TEST123',
1019
+ expires_in: 1800,
1020
+ }),
1021
+ };
1022
+ const mockTokenResponse = {
1023
+ ok: true,
1024
+ json: async () => ({
1025
+ access_token: 'new-access-token',
1026
+ refresh_token: 'new-refresh-token',
1027
+ token_type: 'Bearer',
1028
+ expires_in: 3600,
1029
+ scope: 'openid profile email model.completion',
1030
+ }),
1031
+ };
1032
+ global.fetch = vi
1033
+ .fn()
1034
+ .mockResolvedValueOnce(mockAuthResponse)
1035
+ .mockResolvedValue(mockTokenResponse);
1036
+ const client = await import('./qwenOAuth2.js').then((module) => module.getQwenOAuthClient(mockConfig));
1037
+ expect(client).toBeInstanceOf(Object);
1038
+ expect(mockConfig.isBrowserLaunchSuppressed).toHaveBeenCalled();
1039
+ SharedTokenManager.getInstance = originalGetInstance;
1040
+ });
1041
+ });
1042
+ describe('Browser Launch and Error Handling', () => {
1043
+ let mockConfig;
1044
+ let originalFetch;
1045
+ beforeEach(() => {
1046
+ mockConfig = {
1047
+ isBrowserLaunchSuppressed: vi.fn().mockReturnValue(false),
1048
+ isInteractive: vi.fn().mockReturnValue(true),
1049
+ };
1050
+ originalFetch = global.fetch;
1051
+ global.fetch = vi.fn();
1052
+ });
1053
+ afterEach(() => {
1054
+ global.fetch = originalFetch;
1055
+ vi.clearAllMocks();
1056
+ });
1057
+ it('should handle browser launch failure gracefully', async () => {
1058
+ const { promises: fs } = await import('node:fs');
1059
+ vi.mocked(fs.readFile).mockRejectedValue(new Error('No cached credentials'));
1060
+ // Mock open to throw error
1061
+ const open = await import('open');
1062
+ vi.mocked(open.default).mockRejectedValue(new Error('Browser launch failed'));
1063
+ const mockAuthResponse = {
1064
+ ok: true,
1065
+ json: async () => ({
1066
+ device_code: 'test-device-code',
1067
+ user_code: 'TEST123',
1068
+ verification_uri: 'https://chat.qwen.ai/device',
1069
+ verification_uri_complete: 'https://chat.qwen.ai/device?code=TEST123',
1070
+ expires_in: 1800,
1071
+ }),
1072
+ };
1073
+ const mockTokenResponse = {
1074
+ ok: true,
1075
+ json: async () => ({
1076
+ access_token: 'new-access-token',
1077
+ refresh_token: 'new-refresh-token',
1078
+ token_type: 'Bearer',
1079
+ expires_in: 3600,
1080
+ scope: 'openid profile email model.completion',
1081
+ }),
1082
+ };
1083
+ vi.mocked(global.fetch)
1084
+ .mockResolvedValueOnce(mockAuthResponse)
1085
+ .mockResolvedValue(mockTokenResponse);
1086
+ const client = await import('./qwenOAuth2.js').then((module) => module.getQwenOAuthClient(mockConfig));
1087
+ expect(client).toBeInstanceOf(Object);
1088
+ });
1089
+ it('should handle browser child process error gracefully', async () => {
1090
+ const { promises: fs } = await import('node:fs');
1091
+ vi.mocked(fs.readFile).mockRejectedValue(new Error('No cached credentials'));
1092
+ // Mock open to return a child process that will emit error
1093
+ const open = await import('open');
1094
+ const mockChildProcess = {
1095
+ on: vi.fn((event, callback) => {
1096
+ if (event === 'error') {
1097
+ // Call the error handler immediately for testing
1098
+ setTimeout(() => callback(new Error('Process spawn failed')), 0);
1099
+ }
1100
+ }),
1101
+ };
1102
+ vi.mocked(open.default).mockResolvedValue(mockChildProcess);
1103
+ const mockAuthResponse = {
1104
+ ok: true,
1105
+ json: async () => ({
1106
+ device_code: 'test-device-code',
1107
+ user_code: 'TEST123',
1108
+ verification_uri: 'https://chat.qwen.ai/device',
1109
+ verification_uri_complete: 'https://chat.qwen.ai/device?code=TEST123',
1110
+ expires_in: 1800,
1111
+ }),
1112
+ };
1113
+ const mockTokenResponse = {
1114
+ ok: true,
1115
+ json: async () => ({
1116
+ access_token: 'new-access-token',
1117
+ refresh_token: 'new-refresh-token',
1118
+ token_type: 'Bearer',
1119
+ expires_in: 3600,
1120
+ scope: 'openid profile email model.completion',
1121
+ }),
1122
+ };
1123
+ vi.mocked(global.fetch)
1124
+ .mockResolvedValueOnce(mockAuthResponse)
1125
+ .mockResolvedValue(mockTokenResponse);
1126
+ const client = await import('./qwenOAuth2.js').then((module) => module.getQwenOAuthClient(mockConfig));
1127
+ expect(client).toBeInstanceOf(Object);
1128
+ });
1129
+ });
1130
+ describe('Event Emitter Integration', () => {
1131
+ it('should export qwenOAuth2Events as EventEmitter', async () => {
1132
+ const { qwenOAuth2Events } = await import('./qwenOAuth2.js');
1133
+ expect(qwenOAuth2Events).toBeInstanceOf(EventEmitter);
1134
+ });
1135
+ it('should define correct event enum values', async () => {
1136
+ const { QwenOAuth2Event } = await import('./qwenOAuth2.js');
1137
+ expect(QwenOAuth2Event.AuthUri).toBe('auth-uri');
1138
+ expect(QwenOAuth2Event.AuthProgress).toBe('auth-progress');
1139
+ expect(QwenOAuth2Event.AuthCancel).toBe('auth-cancel');
1140
+ });
1141
+ });
1142
+ describe('Utility Functions', () => {
1143
+ describe('objectToUrlEncoded', () => {
1144
+ it('should encode object properties to URL-encoded format', async () => {
1145
+ // Since objectToUrlEncoded is private, we test it indirectly through the client
1146
+ const objectToUrlEncoded = (data) => Object.keys(data)
1147
+ .map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(data[key])}`)
1148
+ .join('&');
1149
+ const testData = {
1150
+ client_id: 'test-client',
1151
+ scope: 'openid profile',
1152
+ redirect_uri: 'https://example.com/callback',
1153
+ };
1154
+ const result = objectToUrlEncoded(testData);
1155
+ expect(result).toContain('client_id=test-client');
1156
+ expect(result).toContain('scope=openid%20profile');
1157
+ expect(result).toContain('redirect_uri=https%3A%2F%2Fexample.com%2Fcallback');
1158
+ });
1159
+ it('should handle special characters', async () => {
1160
+ const objectToUrlEncoded = (data) => Object.keys(data)
1161
+ .map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(data[key])}`)
1162
+ .join('&');
1163
+ const testData = {
1164
+ 'param with spaces': 'value with spaces',
1165
+ 'param&with&amps': 'value&with&amps',
1166
+ 'param=with=equals': 'value=with=equals',
1167
+ };
1168
+ const result = objectToUrlEncoded(testData);
1169
+ expect(result).toContain('param%20with%20spaces=value%20with%20spaces');
1170
+ expect(result).toContain('param%26with%26amps=value%26with%26amps');
1171
+ expect(result).toContain('param%3Dwith%3Dequals=value%3Dwith%3Dequals');
1172
+ });
1173
+ it('should handle empty object', async () => {
1174
+ const objectToUrlEncoded = (data) => Object.keys(data)
1175
+ .map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(data[key])}`)
1176
+ .join('&');
1177
+ const result = objectToUrlEncoded({});
1178
+ expect(result).toBe('');
1179
+ });
1180
+ });
1181
+ describe('getQwenCachedCredentialPath', () => {
1182
+ it('should return correct path to cached credentials', async () => {
1183
+ const os = await import('os');
1184
+ const path = await import('path');
1185
+ const expectedPath = path.join(os.homedir(), '.qwen', 'oauth_creds.json');
1186
+ // Since this is a private function, we test it indirectly through clearQwenCredentials
1187
+ const { promises: fs } = await import('node:fs');
1188
+ const { clearQwenCredentials } = await import('./qwenOAuth2.js');
1189
+ vi.mocked(fs.unlink).mockResolvedValue(undefined);
1190
+ await clearQwenCredentials();
1191
+ expect(fs.unlink).toHaveBeenCalledWith(expectedPath);
1192
+ });
1193
+ });
1194
+ });
1195
+ describe('Credential Caching Functions', () => {
1196
+ describe('cacheQwenCredentials', () => {
1197
+ it('should create directory and write credentials to file', async () => {
1198
+ // Mock the internal cacheQwenCredentials function by creating client and calling refresh
1199
+ const client = new QwenOAuth2Client();
1200
+ client.setCredentials({
1201
+ refresh_token: 'test-refresh',
1202
+ });
1203
+ const mockResponse = {
1204
+ ok: true,
1205
+ json: async () => ({
1206
+ access_token: 'new-token',
1207
+ token_type: 'Bearer',
1208
+ expires_in: 3600,
1209
+ }),
1210
+ };
1211
+ global.fetch = vi.fn().mockResolvedValue(mockResponse);
1212
+ await client.refreshAccessToken();
1213
+ // Note: File caching is now handled by SharedTokenManager, so these calls won't happen
1214
+ // This test verifies that refreshAccessToken works correctly
1215
+ const updatedCredentials = client.getCredentials();
1216
+ expect(updatedCredentials.access_token).toBe('new-token');
1217
+ });
1218
+ });
1219
+ });
1220
+ describe('Enhanced Error Handling and Edge Cases', () => {
1221
+ let client;
1222
+ let originalFetch;
1223
+ beforeEach(() => {
1224
+ client = new QwenOAuth2Client();
1225
+ originalFetch = global.fetch;
1226
+ global.fetch = vi.fn();
1227
+ });
1228
+ afterEach(() => {
1229
+ global.fetch = originalFetch;
1230
+ vi.clearAllMocks();
1231
+ });
1232
+ describe('QwenOAuth2Client getAccessToken enhanced scenarios', () => {
1233
+ it('should return undefined when SharedTokenManager fails (no fallback)', async () => {
1234
+ // Set up client with valid credentials (but we don't use fallback anymore)
1235
+ client.setCredentials({
1236
+ access_token: 'fallback-token',
1237
+ expiry_date: Date.now() + 3600000, // Valid for 1 hour
1238
+ });
1239
+ // Override the client's SharedTokenManager instance directly to ensure it fails
1240
+ client.sharedManager = {
1241
+ getValidCredentials: vi
1242
+ .fn()
1243
+ .mockRejectedValue(new Error('Manager failed')),
1244
+ };
1245
+ const result = await client.getAccessToken();
1246
+ // With our race condition fix, we no longer fall back to local credentials
1247
+ // to ensure single source of truth
1248
+ expect(result.token).toBeUndefined();
1249
+ });
1250
+ it('should return undefined when both manager and cache fail', async () => {
1251
+ // Set up client with expired credentials
1252
+ client.setCredentials({
1253
+ access_token: 'expired-token',
1254
+ expiry_date: Date.now() - 1000, // Expired
1255
+ });
1256
+ // Override the client's SharedTokenManager instance directly to ensure it fails
1257
+ client.sharedManager = {
1258
+ getValidCredentials: vi
1259
+ .fn()
1260
+ .mockRejectedValue(new Error('Manager failed')),
1261
+ };
1262
+ const result = await client.getAccessToken();
1263
+ expect(result.token).toBeUndefined();
1264
+ });
1265
+ it('should handle missing credentials gracefully', async () => {
1266
+ // No credentials set
1267
+ client.setCredentials({});
1268
+ // Override the client's SharedTokenManager instance directly to ensure it fails
1269
+ client.sharedManager = {
1270
+ getValidCredentials: vi
1271
+ .fn()
1272
+ .mockRejectedValue(new Error('No credentials')),
1273
+ };
1274
+ const result = await client.getAccessToken();
1275
+ expect(result.token).toBeUndefined();
1276
+ });
1277
+ });
1278
+ describe('Enhanced requestDeviceAuthorization scenarios', () => {
1279
+ it('should include x-request-id header', async () => {
1280
+ const mockResponse = {
1281
+ ok: true,
1282
+ json: async () => ({
1283
+ device_code: 'test-device-code',
1284
+ user_code: 'TEST123',
1285
+ verification_uri: 'https://chat.qwen.ai/device',
1286
+ verification_uri_complete: 'https://chat.qwen.ai/device?code=TEST123',
1287
+ expires_in: 1800,
1288
+ }),
1289
+ };
1290
+ vi.mocked(global.fetch).mockResolvedValue(mockResponse);
1291
+ await client.requestDeviceAuthorization({
1292
+ scope: 'openid profile email model.completion',
1293
+ code_challenge: 'test-challenge',
1294
+ code_challenge_method: 'S256',
1295
+ });
1296
+ expect(global.fetch).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
1297
+ headers: expect.objectContaining({
1298
+ 'x-request-id': expect.any(String),
1299
+ }),
1300
+ }));
1301
+ });
1302
+ it('should include correct Content-Type and Accept headers', async () => {
1303
+ const mockResponse = {
1304
+ ok: true,
1305
+ json: async () => ({
1306
+ device_code: 'test-device-code',
1307
+ user_code: 'TEST123',
1308
+ verification_uri: 'https://chat.qwen.ai/device',
1309
+ verification_uri_complete: 'https://chat.qwen.ai/device?code=TEST123',
1310
+ expires_in: 1800,
1311
+ }),
1312
+ };
1313
+ vi.mocked(global.fetch).mockResolvedValue(mockResponse);
1314
+ await client.requestDeviceAuthorization({
1315
+ scope: 'openid profile email model.completion',
1316
+ code_challenge: 'test-challenge',
1317
+ code_challenge_method: 'S256',
1318
+ });
1319
+ expect(global.fetch).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
1320
+ headers: expect.objectContaining({
1321
+ 'Content-Type': 'application/x-www-form-urlencoded',
1322
+ Accept: 'application/json',
1323
+ }),
1324
+ }));
1325
+ });
1326
+ it('should send correct form data', async () => {
1327
+ const mockResponse = {
1328
+ ok: true,
1329
+ json: async () => ({
1330
+ device_code: 'test-device-code',
1331
+ user_code: 'TEST123',
1332
+ verification_uri: 'https://chat.qwen.ai/device',
1333
+ verification_uri_complete: 'https://chat.qwen.ai/device?code=TEST123',
1334
+ expires_in: 1800,
1335
+ }),
1336
+ };
1337
+ vi.mocked(global.fetch).mockResolvedValue(mockResponse);
1338
+ await client.requestDeviceAuthorization({
1339
+ scope: 'test-scope',
1340
+ code_challenge: 'test-challenge',
1341
+ code_challenge_method: 'S256',
1342
+ });
1343
+ const [, options] = vi.mocked(global.fetch).mock.calls[0];
1344
+ expect(options?.body).toContain('client_id=f0304373b74a44d2b584a3fb70ca9e56');
1345
+ expect(options?.body).toContain('scope=test-scope');
1346
+ expect(options?.body).toContain('code_challenge=test-challenge');
1347
+ expect(options?.body).toContain('code_challenge_method=S256');
1348
+ });
1349
+ });
1350
+ describe('Enhanced pollDeviceToken scenarios', () => {
1351
+ it('should handle JSON parsing error during error response', async () => {
1352
+ const mockResponse = {
1353
+ ok: false,
1354
+ status: 400,
1355
+ statusText: 'Bad Request',
1356
+ json: vi.fn().mockRejectedValue(new Error('Invalid JSON')),
1357
+ text: vi.fn().mockResolvedValue('Invalid request format'),
1358
+ };
1359
+ vi.mocked(global.fetch).mockResolvedValue(mockResponse);
1360
+ await expect(client.pollDeviceToken({
1361
+ device_code: 'test-device-code',
1362
+ code_verifier: 'test-verifier',
1363
+ })).rejects.toThrow('Device token poll failed: 400 Bad Request');
1364
+ });
1365
+ it('should include status code in thrown errors', async () => {
1366
+ const mockResponse = {
1367
+ ok: false,
1368
+ status: 500,
1369
+ statusText: 'Internal Server Error',
1370
+ json: vi.fn().mockRejectedValue(new Error('Invalid JSON')),
1371
+ text: vi.fn().mockResolvedValue('Internal server error'),
1372
+ };
1373
+ global.fetch = vi
1374
+ .fn()
1375
+ .mockResolvedValue(mockResponse);
1376
+ await expect(client.pollDeviceToken({
1377
+ device_code: 'test-device-code',
1378
+ code_verifier: 'test-verifier',
1379
+ })).rejects.toMatchObject({
1380
+ message: expect.stringContaining('Device token poll failed: 500 Internal Server Error'),
1381
+ status: 500,
1382
+ });
1383
+ });
1384
+ it('should handle authorization_pending with correct status', async () => {
1385
+ const errorData = {
1386
+ error: 'authorization_pending',
1387
+ error_description: 'Authorization request is pending',
1388
+ };
1389
+ const mockResponse = {
1390
+ ok: false,
1391
+ status: 400,
1392
+ statusText: 'Bad Request',
1393
+ text: vi.fn().mockResolvedValue(JSON.stringify(errorData)),
1394
+ json: vi.fn().mockResolvedValue(errorData),
1395
+ };
1396
+ vi.mocked(global.fetch).mockResolvedValue(mockResponse);
1397
+ const result = await client.pollDeviceToken({
1398
+ device_code: 'test-device-code',
1399
+ code_verifier: 'test-verifier',
1400
+ });
1401
+ expect(result).toEqual({ status: 'pending' });
1402
+ });
1403
+ });
1404
+ describe('Enhanced refreshAccessToken scenarios', () => {
1405
+ it('should call clearQwenCredentials on 400 error', async () => {
1406
+ client.setCredentials({
1407
+ refresh_token: 'expired-refresh',
1408
+ });
1409
+ const { promises: fs } = await import('node:fs');
1410
+ vi.mocked(fs.unlink).mockResolvedValue(undefined);
1411
+ const mockResponse = {
1412
+ ok: false,
1413
+ status: 400,
1414
+ text: async () => 'Bad Request',
1415
+ };
1416
+ vi.mocked(global.fetch).mockResolvedValue(mockResponse);
1417
+ await expect(client.refreshAccessToken()).rejects.toThrow("Refresh token expired or invalid. Please use '/auth' to re-authenticate.");
1418
+ expect(fs.unlink).toHaveBeenCalled();
1419
+ });
1420
+ it('should throw CredentialsClearRequiredError on 400 error', async () => {
1421
+ const { CredentialsClearRequiredError } = await import('./qwenOAuth2.js');
1422
+ client.setCredentials({
1423
+ refresh_token: 'expired-refresh',
1424
+ });
1425
+ const { promises: fs } = await import('node:fs');
1426
+ vi.mocked(fs.unlink).mockResolvedValue(undefined);
1427
+ const mockResponse = {
1428
+ ok: false,
1429
+ status: 400,
1430
+ text: async () => 'Bad Request',
1431
+ };
1432
+ vi.mocked(global.fetch).mockResolvedValue(mockResponse);
1433
+ await expect(client.refreshAccessToken()).rejects.toThrow(CredentialsClearRequiredError);
1434
+ try {
1435
+ await client.refreshAccessToken();
1436
+ }
1437
+ catch (error) {
1438
+ expect(error).toBeInstanceOf(CredentialsClearRequiredError);
1439
+ if (error instanceof CredentialsClearRequiredError) {
1440
+ expect(error.originalError).toEqual({
1441
+ status: 400,
1442
+ response: 'Bad Request',
1443
+ });
1444
+ }
1445
+ }
1446
+ expect(fs.unlink).toHaveBeenCalled();
1447
+ });
1448
+ it('should preserve existing refresh token when new one not provided', async () => {
1449
+ const originalRefreshToken = 'original-refresh-token';
1450
+ client.setCredentials({
1451
+ refresh_token: originalRefreshToken,
1452
+ });
1453
+ const mockResponse = {
1454
+ ok: true,
1455
+ json: async () => ({
1456
+ access_token: 'new-access-token',
1457
+ token_type: 'Bearer',
1458
+ expires_in: 3600,
1459
+ // No refresh_token in response
1460
+ }),
1461
+ };
1462
+ vi.mocked(global.fetch).mockResolvedValue(mockResponse);
1463
+ await client.refreshAccessToken();
1464
+ const credentials = client.getCredentials();
1465
+ expect(credentials.refresh_token).toBe(originalRefreshToken);
1466
+ });
1467
+ it('should include resource_url when provided in response', async () => {
1468
+ client.setCredentials({
1469
+ refresh_token: 'test-refresh',
1470
+ });
1471
+ const mockResponse = {
1472
+ ok: true,
1473
+ json: async () => ({
1474
+ access_token: 'new-access-token',
1475
+ token_type: 'Bearer',
1476
+ expires_in: 3600,
1477
+ resource_url: 'https://new-resource-url.com',
1478
+ }),
1479
+ };
1480
+ vi.mocked(global.fetch).mockResolvedValue(mockResponse);
1481
+ await client.refreshAccessToken();
1482
+ const credentials = client.getCredentials();
1483
+ expect(credentials.resource_url).toBe('https://new-resource-url.com');
1484
+ });
1485
+ });
1486
+ });
1487
+ describe('SharedTokenManager Integration in QwenOAuth2Client', () => {
1488
+ let client;
1489
+ beforeEach(() => {
1490
+ client = new QwenOAuth2Client();
1491
+ });
1492
+ it('should use SharedTokenManager instance in constructor', () => {
1493
+ const sharedManager = client.sharedManager;
1494
+ expect(sharedManager).toBeDefined();
1495
+ });
1496
+ it('should handle TokenManagerError types correctly in getQwenOAuthClient', async () => {
1497
+ const mockConfig = {
1498
+ isBrowserLaunchSuppressed: vi.fn().mockReturnValue(true),
1499
+ isInteractive: vi.fn().mockReturnValue(true),
1500
+ };
1501
+ // Test different TokenManagerError types
1502
+ const tokenErrors = [
1503
+ { type: TokenError.NO_REFRESH_TOKEN, message: 'No refresh token' },
1504
+ { type: TokenError.REFRESH_FAILED, message: 'Token refresh failed' },
1505
+ { type: TokenError.NETWORK_ERROR, message: 'Network error' },
1506
+ { type: TokenError.REFRESH_FAILED, message: 'Refresh failed' },
1507
+ ];
1508
+ for (const errorInfo of tokenErrors) {
1509
+ const tokenError = new TokenManagerError(errorInfo.type, errorInfo.message);
1510
+ const mockTokenManager = {
1511
+ getValidCredentials: vi.fn().mockRejectedValue(tokenError),
1512
+ };
1513
+ const originalGetInstance = SharedTokenManager.getInstance;
1514
+ SharedTokenManager.getInstance = vi
1515
+ .fn()
1516
+ .mockReturnValue(mockTokenManager);
1517
+ const { promises: fs } = await import('node:fs');
1518
+ vi.mocked(fs.readFile).mockRejectedValue(new Error('No cached file'));
1519
+ // Mock device flow to succeed
1520
+ const mockAuthResponse = {
1521
+ ok: true,
1522
+ json: async () => ({
1523
+ device_code: 'test-device-code',
1524
+ user_code: 'TEST123',
1525
+ verification_uri: 'https://chat.qwen.ai/device',
1526
+ verification_uri_complete: 'https://chat.qwen.ai/device?code=TEST123',
1527
+ expires_in: 1800,
1528
+ }),
1529
+ };
1530
+ const mockTokenResponse = {
1531
+ ok: true,
1532
+ json: async () => ({
1533
+ access_token: 'new-token',
1534
+ refresh_token: 'new-refresh',
1535
+ token_type: 'Bearer',
1536
+ expires_in: 3600,
1537
+ }),
1538
+ };
1539
+ global.fetch = vi
1540
+ .fn()
1541
+ .mockResolvedValueOnce(mockAuthResponse)
1542
+ .mockResolvedValue(mockTokenResponse);
1543
+ try {
1544
+ await import('./qwenOAuth2.js').then((module) => module.getQwenOAuthClient(mockConfig));
1545
+ }
1546
+ catch {
1547
+ // Expected to fail in test environment
1548
+ }
1549
+ SharedTokenManager.getInstance = originalGetInstance;
1550
+ vi.clearAllMocks();
1551
+ }
1552
+ });
1553
+ });
1554
+ describe('Constants and Configuration', () => {
1555
+ it('should have correct OAuth endpoints', async () => {
1556
+ // Test that the constants are properly defined by checking they're used in requests
1557
+ const client = new QwenOAuth2Client();
1558
+ const mockResponse = {
1559
+ ok: true,
1560
+ json: async () => ({
1561
+ device_code: 'test-device-code',
1562
+ user_code: 'TEST123',
1563
+ verification_uri: 'https://chat.qwen.ai/device',
1564
+ verification_uri_complete: 'https://chat.qwen.ai/device?code=TEST123',
1565
+ expires_in: 1800,
1566
+ }),
1567
+ };
1568
+ global.fetch = vi.fn().mockResolvedValue(mockResponse);
1569
+ await client.requestDeviceAuthorization({
1570
+ scope: 'test-scope',
1571
+ code_challenge: 'test-challenge',
1572
+ code_challenge_method: 'S256',
1573
+ });
1574
+ const [url] = vi.mocked(global.fetch).mock.calls[0];
1575
+ expect(url).toBe('https://chat.qwen.ai/api/v1/oauth2/device/code');
1576
+ });
1577
+ it('should use correct client ID in requests', async () => {
1578
+ const client = new QwenOAuth2Client();
1579
+ const mockResponse = {
1580
+ ok: true,
1581
+ json: async () => ({
1582
+ device_code: 'test-device-code',
1583
+ user_code: 'TEST123',
1584
+ verification_uri: 'https://chat.qwen.ai/device',
1585
+ verification_uri_complete: 'https://chat.qwen.ai/device?code=TEST123',
1586
+ expires_in: 1800,
1587
+ }),
1588
+ };
1589
+ global.fetch = vi.fn().mockResolvedValue(mockResponse);
1590
+ await client.requestDeviceAuthorization({
1591
+ scope: 'test-scope',
1592
+ code_challenge: 'test-challenge',
1593
+ code_challenge_method: 'S256',
1594
+ });
1595
+ const [, options] = vi.mocked(global.fetch).mock.calls[0];
1596
+ expect(options?.body).toContain('client_id=f0304373b74a44d2b584a3fb70ca9e56');
1597
+ });
1598
+ it('should use correct default scope', async () => {
1599
+ // Test the default scope constant by checking it's used in device flow
1600
+ const client = new QwenOAuth2Client();
1601
+ const mockResponse = {
1602
+ ok: true,
1603
+ json: async () => ({
1604
+ device_code: 'test-device-code',
1605
+ user_code: 'TEST123',
1606
+ verification_uri: 'https://chat.qwen.ai/device',
1607
+ verification_uri_complete: 'https://chat.qwen.ai/device?code=TEST123',
1608
+ expires_in: 1800,
1609
+ }),
1610
+ };
1611
+ global.fetch = vi.fn().mockResolvedValue(mockResponse);
1612
+ await client.requestDeviceAuthorization({
1613
+ scope: 'openid profile email model.completion',
1614
+ code_challenge: 'test-challenge',
1615
+ code_challenge_method: 'S256',
1616
+ });
1617
+ const [, options] = vi.mocked(global.fetch).mock.calls[0];
1618
+ expect(options?.body).toContain('scope=openid%20profile%20email%20model.completion');
1619
+ });
1620
+ });
1621
+ //# sourceMappingURL=qwenOAuth2.test.js.map