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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (323) hide show
  1. package/README.md +1 -0
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.js +3 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/auth/auth-integration.spec.d.ts +6 -0
  6. package/dist/src/auth/auth-integration.spec.js +384 -0
  7. package/dist/src/auth/auth-integration.spec.js.map +1 -0
  8. package/dist/src/auth/precedence.d.ts +55 -0
  9. package/dist/src/auth/precedence.js +211 -0
  10. package/dist/src/auth/precedence.js.map +1 -0
  11. package/dist/src/auth/precedence.test.d.ts +6 -0
  12. package/dist/src/auth/precedence.test.js +374 -0
  13. package/dist/src/auth/precedence.test.js.map +1 -0
  14. package/dist/src/auth/qwen-device-flow.d.ts +45 -0
  15. package/dist/src/auth/qwen-device-flow.js +179 -0
  16. package/dist/src/auth/qwen-device-flow.js.map +1 -0
  17. package/dist/src/auth/qwen-device-flow.spec.d.ts +6 -0
  18. package/dist/src/auth/qwen-device-flow.spec.js +793 -0
  19. package/dist/src/auth/qwen-device-flow.spec.js.map +1 -0
  20. package/dist/src/auth/token-store.d.ts +66 -0
  21. package/dist/src/auth/token-store.js +147 -0
  22. package/dist/src/auth/token-store.js.map +1 -0
  23. package/dist/src/auth/token-store.spec.d.ts +6 -0
  24. package/dist/src/auth/token-store.spec.js +405 -0
  25. package/dist/src/auth/token-store.spec.js.map +1 -0
  26. package/dist/src/auth/types.d.ts +130 -0
  27. package/dist/src/auth/types.js +60 -0
  28. package/dist/src/auth/types.js.map +1 -0
  29. package/dist/src/code_assist/converter.d.ts +2 -1
  30. package/dist/src/code_assist/converter.js +1 -1
  31. package/dist/src/code_assist/converter.js.map +1 -1
  32. package/dist/src/code_assist/converter.test.js +48 -1
  33. package/dist/src/code_assist/converter.test.js.map +1 -1
  34. package/dist/src/code_assist/oauth2.js +2 -1
  35. package/dist/src/code_assist/oauth2.js.map +1 -1
  36. package/dist/src/code_assist/server.test.js +4 -1
  37. package/dist/src/code_assist/server.test.js.map +1 -1
  38. package/dist/src/config/config.alwaysAllow.test.d.ts +6 -0
  39. package/dist/src/config/config.alwaysAllow.test.js +84 -0
  40. package/dist/src/config/config.alwaysAllow.test.js.map +1 -0
  41. package/dist/src/config/config.d.ts +80 -1
  42. package/dist/src/config/config.ephemeral.test.d.ts +6 -0
  43. package/dist/src/config/config.ephemeral.test.js +152 -0
  44. package/dist/src/config/config.ephemeral.test.js.map +1 -0
  45. package/dist/src/config/config.js +135 -0
  46. package/dist/src/config/config.js.map +1 -1
  47. package/dist/src/config/config.test.js +8 -0
  48. package/dist/src/config/config.test.js.map +1 -1
  49. package/dist/src/config/endpoints.d.ts +60 -0
  50. package/dist/src/config/endpoints.js +126 -0
  51. package/dist/src/config/endpoints.js.map +1 -0
  52. package/dist/src/config/endpoints.test.d.ts +6 -0
  53. package/dist/src/config/endpoints.test.js +196 -0
  54. package/dist/src/config/endpoints.test.js.map +1 -0
  55. package/dist/src/core/client.d.ts +0 -2
  56. package/dist/src/core/client.js +19 -97
  57. package/dist/src/core/client.js.map +1 -1
  58. package/dist/src/core/client.test.js +13 -7
  59. package/dist/src/core/client.test.js.map +1 -1
  60. package/dist/src/core/contentGenerator.d.ts +3 -1
  61. package/dist/src/core/contentGenerator.js +3 -1
  62. package/dist/src/core/contentGenerator.js.map +1 -1
  63. package/dist/src/core/coreToolScheduler.d.ts +17 -7
  64. package/dist/src/core/coreToolScheduler.js +121 -18
  65. package/dist/src/core/coreToolScheduler.js.map +1 -1
  66. package/dist/src/core/coreToolScheduler.test.js +25 -37
  67. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  68. package/dist/src/core/geminiChat.d.ts +3 -0
  69. package/dist/src/core/geminiChat.js +17 -13
  70. package/dist/src/core/geminiChat.js.map +1 -1
  71. package/dist/src/core/logger.d.ts +1 -0
  72. package/dist/src/core/logger.js +18 -0
  73. package/dist/src/core/logger.js.map +1 -1
  74. package/dist/src/core/logger.test.js +29 -0
  75. package/dist/src/core/logger.test.js.map +1 -1
  76. package/dist/src/core/loggingContentGenerator.d.ts +24 -0
  77. package/dist/src/core/loggingContentGenerator.js +89 -0
  78. package/dist/src/core/loggingContentGenerator.js.map +1 -0
  79. package/dist/src/core/nonInteractiveToolExecutor.js +21 -1
  80. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
  81. package/dist/src/core/nonInteractiveToolExecutor.test.js +8 -31
  82. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  83. package/dist/src/core/subagent.d.ts +230 -0
  84. package/dist/src/core/subagent.js +455 -0
  85. package/dist/src/core/subagent.js.map +1 -0
  86. package/dist/src/core/subagent.test.d.ts +6 -0
  87. package/dist/src/core/subagent.test.js +510 -0
  88. package/dist/src/core/subagent.test.js.map +1 -0
  89. package/dist/src/hooks/tool-render-suppression-hook.d.ts +16 -0
  90. package/dist/src/hooks/tool-render-suppression-hook.js +26 -0
  91. package/dist/src/hooks/tool-render-suppression-hook.js.map +1 -0
  92. package/dist/src/hooks/tool-render-suppression-hook.test.d.ts +6 -0
  93. package/dist/src/hooks/tool-render-suppression-hook.test.js +59 -0
  94. package/dist/src/hooks/tool-render-suppression-hook.test.js.map +1 -0
  95. package/dist/src/ide/ide-client.d.ts +22 -1
  96. package/dist/src/ide/ide-client.js +161 -17
  97. package/dist/src/ide/ide-client.js.map +1 -1
  98. package/dist/src/ide/ideContext.d.ts +127 -32
  99. package/dist/src/ide/ideContext.js +45 -0
  100. package/dist/src/ide/ideContext.js.map +1 -1
  101. package/dist/src/index.d.ts +8 -0
  102. package/dist/src/index.js +10 -0
  103. package/dist/src/index.js.map +1 -1
  104. package/dist/src/integration-tests/oauth-integration.spec.d.ts +6 -0
  105. package/dist/src/integration-tests/oauth-integration.spec.js +518 -0
  106. package/dist/src/integration-tests/oauth-integration.spec.js.map +1 -0
  107. package/dist/src/integration-tests/oauth-simple-test.spec.d.ts +1 -0
  108. package/dist/src/integration-tests/oauth-simple-test.spec.js +88 -0
  109. package/dist/src/integration-tests/oauth-simple-test.spec.js.map +1 -0
  110. package/dist/src/integration-tests/todo-system.test.js +38 -602
  111. package/dist/src/integration-tests/todo-system.test.js.map +1 -1
  112. package/dist/src/providers/BaseProvider.d.ts +98 -0
  113. package/dist/src/providers/BaseProvider.js +180 -0
  114. package/dist/src/providers/BaseProvider.js.map +1 -0
  115. package/dist/src/providers/BaseProvider.test.d.ts +6 -0
  116. package/dist/src/providers/BaseProvider.test.js +472 -0
  117. package/dist/src/providers/BaseProvider.test.js.map +1 -0
  118. package/dist/src/providers/IProviderManager.d.ts +5 -0
  119. package/dist/src/providers/LoggingProviderWrapper.d.ts +53 -0
  120. package/dist/src/providers/LoggingProviderWrapper.js +347 -0
  121. package/dist/src/providers/LoggingProviderWrapper.js.map +1 -0
  122. package/dist/src/providers/ProviderManager.d.ts +20 -0
  123. package/dist/src/providers/ProviderManager.js +214 -1
  124. package/dist/src/providers/ProviderManager.js.map +1 -1
  125. package/dist/src/providers/gemini/GeminiProvider.d.ts +12 -7
  126. package/dist/src/providers/gemini/GeminiProvider.js +135 -152
  127. package/dist/src/providers/gemini/GeminiProvider.js.map +1 -1
  128. package/dist/src/providers/integration/multi-provider.integration.test.js +18 -2
  129. package/dist/src/providers/integration/multi-provider.integration.test.js.map +1 -1
  130. package/dist/src/providers/logging/ProviderContentExtractor.d.ts +27 -0
  131. package/dist/src/providers/logging/ProviderContentExtractor.js +198 -0
  132. package/dist/src/providers/logging/ProviderContentExtractor.js.map +1 -0
  133. package/dist/src/providers/logging/ProviderPerformanceTracker.d.ts +43 -0
  134. package/dist/src/providers/logging/ProviderPerformanceTracker.js +98 -0
  135. package/dist/src/providers/logging/ProviderPerformanceTracker.js.map +1 -0
  136. package/dist/src/providers/openai/OpenAIProvider.d.ts +21 -6
  137. package/dist/src/providers/openai/OpenAIProvider.js +180 -27
  138. package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
  139. package/dist/src/providers/openai/OpenAIProvider.test.js +109 -2
  140. package/dist/src/providers/openai/OpenAIProvider.test.js.map +1 -1
  141. package/dist/src/providers/openai/openai-oauth.spec.d.ts +16 -0
  142. package/dist/src/providers/openai/openai-oauth.spec.js +544 -0
  143. package/dist/src/providers/openai/openai-oauth.spec.js.map +1 -0
  144. package/dist/src/providers/types/IProviderConfig.d.ts +5 -0
  145. package/dist/src/providers/types.d.ts +47 -0
  146. package/dist/src/services/git-stats-service.d.ts +32 -0
  147. package/dist/src/services/git-stats-service.js +22 -0
  148. package/dist/src/services/git-stats-service.js.map +1 -0
  149. package/dist/src/services/loopDetectionService.js +10 -6
  150. package/dist/src/services/loopDetectionService.js.map +1 -1
  151. package/dist/src/services/loopDetectionService.test.js +139 -0
  152. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  153. package/dist/src/services/shellExecutionService.js +69 -9
  154. package/dist/src/services/shellExecutionService.js.map +1 -1
  155. package/dist/src/services/shellExecutionService.test.js +8 -0
  156. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  157. package/dist/src/services/todo-context-tracker.d.ts +31 -0
  158. package/dist/src/services/todo-context-tracker.js +45 -0
  159. package/dist/src/services/todo-context-tracker.js.map +1 -0
  160. package/dist/src/services/tool-call-tracker-service.d.ts +52 -0
  161. package/dist/src/services/tool-call-tracker-service.js +170 -0
  162. package/dist/src/services/tool-call-tracker-service.js.map +1 -0
  163. package/dist/src/services/tool-call-tracker-service.test.d.ts +6 -0
  164. package/dist/src/services/tool-call-tracker-service.test.js +99 -0
  165. package/dist/src/services/tool-call-tracker-service.test.js.map +1 -0
  166. package/dist/src/storage/ConversationFileWriter.d.ts +16 -0
  167. package/dist/src/storage/ConversationFileWriter.js +69 -0
  168. package/dist/src/storage/ConversationFileWriter.js.map +1 -0
  169. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +8 -0
  170. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +56 -3
  171. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  172. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +6 -0
  173. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +187 -0
  174. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -0
  175. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +5 -1
  176. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +11 -0
  177. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  178. package/dist/src/telemetry/constants.d.ts +5 -0
  179. package/dist/src/telemetry/constants.js +5 -0
  180. package/dist/src/telemetry/constants.js.map +1 -1
  181. package/dist/src/telemetry/loggers.d.ts +5 -1
  182. package/dist/src/telemetry/loggers.js +87 -1
  183. package/dist/src/telemetry/loggers.js.map +1 -1
  184. package/dist/src/telemetry/loggers.test.circular.js +7 -2
  185. package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
  186. package/dist/src/telemetry/loggers.test.js +7 -2
  187. package/dist/src/telemetry/loggers.test.js.map +1 -1
  188. package/dist/src/telemetry/metrics.d.ts +3 -2
  189. package/dist/src/telemetry/metrics.js +7 -1
  190. package/dist/src/telemetry/metrics.js.map +1 -1
  191. package/dist/src/telemetry/metrics.test.js +50 -0
  192. package/dist/src/telemetry/metrics.test.js.map +1 -1
  193. package/dist/src/telemetry/tool-call-decision.d.ts +13 -0
  194. package/dist/src/telemetry/tool-call-decision.js +29 -0
  195. package/dist/src/telemetry/tool-call-decision.js.map +1 -0
  196. package/dist/src/telemetry/types.d.ts +58 -2
  197. package/dist/src/telemetry/types.js +126 -1
  198. package/dist/src/telemetry/types.js.map +1 -1
  199. package/dist/src/telemetry/uiTelemetry.d.ts +4 -1
  200. package/dist/src/telemetry/uiTelemetry.js +3 -1
  201. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  202. package/dist/src/telemetry/uiTelemetry.test.js +13 -2
  203. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  204. package/dist/src/test-utils/tools.d.ts +23 -0
  205. package/dist/src/test-utils/tools.js +41 -0
  206. package/dist/src/test-utils/tools.js.map +1 -0
  207. package/dist/src/tools/diffOptions.d.ts +2 -0
  208. package/dist/src/tools/diffOptions.js +28 -0
  209. package/dist/src/tools/diffOptions.js.map +1 -1
  210. package/dist/src/tools/diffOptions.test.d.ts +6 -0
  211. package/dist/src/tools/diffOptions.test.js +119 -0
  212. package/dist/src/tools/diffOptions.test.js.map +1 -0
  213. package/dist/src/tools/edit.d.ts +9 -33
  214. package/dist/src/tools/edit.js +167 -132
  215. package/dist/src/tools/edit.js.map +1 -1
  216. package/dist/src/tools/edit.test.js +124 -50
  217. package/dist/src/tools/edit.test.js.map +1 -1
  218. package/dist/src/tools/glob.d.ts +3 -10
  219. package/dist/src/tools/glob.js +97 -99
  220. package/dist/src/tools/glob.js.map +1 -1
  221. package/dist/src/tools/glob.test.js +37 -26
  222. package/dist/src/tools/glob.test.js.map +1 -1
  223. package/dist/src/tools/grep.d.ts +3 -35
  224. package/dist/src/tools/grep.js +117 -88
  225. package/dist/src/tools/grep.js.map +1 -1
  226. package/dist/src/tools/grep.test.js +36 -22
  227. package/dist/src/tools/grep.test.js.map +1 -1
  228. package/dist/src/tools/mcp-client.d.ts +14 -3
  229. package/dist/src/tools/mcp-client.js +82 -6
  230. package/dist/src/tools/mcp-client.js.map +1 -1
  231. package/dist/src/tools/mcp-client.test.js +337 -2
  232. package/dist/src/tools/mcp-client.test.js.map +1 -1
  233. package/dist/src/tools/memoryTool.d.ts +2 -2
  234. package/dist/src/tools/memoryTool.js +1 -0
  235. package/dist/src/tools/memoryTool.js.map +1 -1
  236. package/dist/src/tools/modifiable-tool.d.ts +8 -5
  237. package/dist/src/tools/modifiable-tool.js +4 -1
  238. package/dist/src/tools/modifiable-tool.js.map +1 -1
  239. package/dist/src/tools/modifiable-tool.test.js +3 -3
  240. package/dist/src/tools/modifiable-tool.test.js.map +1 -1
  241. package/dist/src/tools/read-file.d.ts +4 -6
  242. package/dist/src/tools/read-file.js +87 -46
  243. package/dist/src/tools/read-file.js.map +1 -1
  244. package/dist/src/tools/read-file.test.js +207 -126
  245. package/dist/src/tools/read-file.test.js.map +1 -1
  246. package/dist/src/tools/read-many-files.js +8 -2
  247. package/dist/src/tools/read-many-files.js.map +1 -1
  248. package/dist/src/tools/read-many-files.test.js +16 -0
  249. package/dist/src/tools/read-many-files.test.js.map +1 -1
  250. package/dist/src/tools/shell.test.js +17 -0
  251. package/dist/src/tools/shell.test.js.map +1 -1
  252. package/dist/src/tools/todo-events.d.ts +22 -0
  253. package/dist/src/tools/todo-events.js +24 -0
  254. package/dist/src/tools/todo-events.js.map +1 -0
  255. package/dist/src/tools/todo-pause.d.ts +22 -0
  256. package/dist/src/tools/todo-pause.js +93 -0
  257. package/dist/src/tools/todo-pause.js.map +1 -0
  258. package/dist/src/tools/todo-pause.spec.d.ts +6 -0
  259. package/dist/src/tools/todo-pause.spec.js +287 -0
  260. package/dist/src/tools/todo-pause.spec.js.map +1 -0
  261. package/dist/src/tools/todo-read.js.map +1 -1
  262. package/dist/src/tools/todo-schemas.d.ts +232 -4
  263. package/dist/src/tools/todo-schemas.js +13 -0
  264. package/dist/src/tools/todo-schemas.js.map +1 -1
  265. package/dist/src/tools/todo-schemas.test.js +190 -1
  266. package/dist/src/tools/todo-schemas.test.js.map +1 -1
  267. package/dist/src/tools/todo-store.d.ts +1 -4
  268. package/dist/src/tools/todo-store.js +41 -40
  269. package/dist/src/tools/todo-store.js.map +1 -1
  270. package/dist/src/tools/todo-store.test.js +34 -40
  271. package/dist/src/tools/todo-store.test.js.map +1 -1
  272. package/dist/src/tools/todo-write.d.ts +1 -1
  273. package/dist/src/tools/todo-write.js +84 -47
  274. package/dist/src/tools/todo-write.js.map +1 -1
  275. package/dist/src/tools/todo-write.test.js +23 -9
  276. package/dist/src/tools/todo-write.test.js.map +1 -1
  277. package/dist/src/tools/tool-context.d.ts +2 -0
  278. package/dist/src/tools/tool-error.d.ts +4 -0
  279. package/dist/src/tools/tool-error.js +4 -0
  280. package/dist/src/tools/tool-error.js.map +1 -1
  281. package/dist/src/tools/tool-registry.d.ts +12 -6
  282. package/dist/src/tools/tool-registry.js +19 -4
  283. package/dist/src/tools/tool-registry.js.map +1 -1
  284. package/dist/src/tools/tool-registry.test.js +3 -20
  285. package/dist/src/tools/tool-registry.test.js.map +1 -1
  286. package/dist/src/tools/tools.d.ts +134 -39
  287. package/dist/src/tools/tools.js +115 -10
  288. package/dist/src/tools/tools.js.map +1 -1
  289. package/dist/src/tools/web-search.test.js +1 -0
  290. package/dist/src/tools/web-search.test.js.map +1 -1
  291. package/dist/src/tools/write-file.d.ts +6 -2
  292. package/dist/src/tools/write-file.js +106 -16
  293. package/dist/src/tools/write-file.js.map +1 -1
  294. package/dist/src/tools/write-file.test.js +25 -7
  295. package/dist/src/tools/write-file.test.js.map +1 -1
  296. package/dist/src/types/modelParams.d.ts +4 -0
  297. package/dist/src/utils/environmentContext.d.ts +21 -0
  298. package/dist/src/utils/environmentContext.js +90 -0
  299. package/dist/src/utils/environmentContext.js.map +1 -0
  300. package/dist/src/utils/environmentContext.test.d.ts +6 -0
  301. package/dist/src/utils/environmentContext.test.js +139 -0
  302. package/dist/src/utils/environmentContext.test.js.map +1 -0
  303. package/dist/src/utils/errors.d.ts +3 -0
  304. package/dist/src/utils/errors.js +6 -0
  305. package/dist/src/utils/errors.js.map +1 -1
  306. package/dist/src/utils/fileUtils.d.ts +7 -0
  307. package/dist/src/utils/fileUtils.js +11 -10
  308. package/dist/src/utils/fileUtils.js.map +1 -1
  309. package/dist/src/utils/fileUtils.test.js +1 -4
  310. package/dist/src/utils/fileUtils.test.js.map +1 -1
  311. package/dist/src/utils/filesearch/fileSearch.d.ts +1 -0
  312. package/dist/src/utils/filesearch/fileSearch.js +27 -5
  313. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  314. package/dist/src/utils/filesearch/fileSearch.test.js +21 -1
  315. package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
  316. package/dist/src/utils/memoryDiscovery.js +4 -1
  317. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  318. package/dist/src/utils/shell-utils.js +14 -2
  319. package/dist/src/utils/shell-utils.js.map +1 -1
  320. package/dist/src/utils/shell-utils.shellReplacement.test.d.ts +6 -0
  321. package/dist/src/utils/shell-utils.shellReplacement.test.js +149 -0
  322. package/dist/src/utils/shell-utils.shellReplacement.test.js.map +1 -0
  323. package/package.json +2 -1
@@ -0,0 +1,472 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
+ import { BaseProvider } from './BaseProvider.js';
8
+ import { ContentGeneratorRole } from './ContentGeneratorRole.js';
9
+ // Mock OAuth manager for testing
10
+ const mockOAuthManager = {
11
+ getToken: vi.fn(),
12
+ isAuthenticated: vi.fn(),
13
+ };
14
+ // Concrete implementation of BaseProvider for testing
15
+ class TestProvider extends BaseProvider {
16
+ constructor(config) {
17
+ super(config);
18
+ }
19
+ supportsOAuth() {
20
+ return true;
21
+ }
22
+ async getModels() {
23
+ return [
24
+ {
25
+ id: 'test-model',
26
+ name: 'Test Model',
27
+ provider: 'test',
28
+ supportedToolFormats: [],
29
+ },
30
+ ];
31
+ }
32
+ async *generateChatCompletion(_messages, _tools, _toolFormat) {
33
+ // Use the base auth token to ensure it's resolved
34
+ const token = await this.getAuthToken();
35
+ yield {
36
+ role: 'assistant',
37
+ content: `Response using token: ${token.substring(0, 10)}...`,
38
+ };
39
+ }
40
+ }
41
+ // Non-OAuth provider for testing
42
+ class NonOAuthTestProvider extends BaseProvider {
43
+ supportsOAuth() {
44
+ return false;
45
+ }
46
+ async getModels() {
47
+ return [];
48
+ }
49
+ async *generateChatCompletion(_messages, _tools) {
50
+ const token = await this.getAuthToken();
51
+ yield { role: 'assistant', content: `Non-OAuth response: ${token}` };
52
+ }
53
+ }
54
+ describe('BaseProvider', () => {
55
+ let originalEnv;
56
+ beforeEach(() => {
57
+ vi.clearAllMocks();
58
+ originalEnv = { ...process.env };
59
+ // Clear test environment variables
60
+ delete process.env.TEST_API_KEY;
61
+ delete process.env.ANOTHER_API_KEY;
62
+ });
63
+ afterEach(() => {
64
+ process.env = originalEnv;
65
+ vi.restoreAllMocks();
66
+ });
67
+ describe('Authentication Precedence', () => {
68
+ it('should prioritize command key over all other methods', async () => {
69
+ const config = {
70
+ name: 'test',
71
+ commandKey: 'command-key-123',
72
+ cliKey: 'cli-key-456',
73
+ envKeyNames: ['TEST_API_KEY'],
74
+ isOAuthEnabled: true,
75
+ oauthProvider: 'test',
76
+ oauthManager: mockOAuthManager,
77
+ };
78
+ process.env.TEST_API_KEY = 'env-key-789';
79
+ vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token');
80
+ const provider = new TestProvider(config);
81
+ // When: Generate chat completion (triggers lazy auth)
82
+ const response = await provider
83
+ .generateChatCompletion([
84
+ { role: ContentGeneratorRole.USER, content: 'test' },
85
+ ])
86
+ .next();
87
+ // Then: Should use command key
88
+ expect(response.value).toMatchObject({
89
+ content: expect.stringContaining('command-ke'),
90
+ });
91
+ expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
92
+ });
93
+ it('should fall back to CLI key when no command key', async () => {
94
+ const config = {
95
+ name: 'test',
96
+ cliKey: 'cli-key-456',
97
+ envKeyNames: ['TEST_API_KEY'],
98
+ isOAuthEnabled: true,
99
+ oauthProvider: 'test',
100
+ oauthManager: mockOAuthManager,
101
+ };
102
+ process.env.TEST_API_KEY = 'env-key-789';
103
+ vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token');
104
+ const provider = new TestProvider(config);
105
+ const response = await provider
106
+ .generateChatCompletion([
107
+ { role: ContentGeneratorRole.USER, content: 'test' },
108
+ ])
109
+ .next();
110
+ expect(response.value).toMatchObject({
111
+ content: expect.stringContaining('cli-key-45'),
112
+ });
113
+ expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
114
+ });
115
+ it('should fall back to environment variable', async () => {
116
+ const config = {
117
+ name: 'test',
118
+ envKeyNames: ['TEST_API_KEY'],
119
+ isOAuthEnabled: true,
120
+ oauthProvider: 'test',
121
+ oauthManager: mockOAuthManager,
122
+ };
123
+ process.env.TEST_API_KEY = 'env-key-789';
124
+ vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token');
125
+ const provider = new TestProvider(config);
126
+ const response = await provider
127
+ .generateChatCompletion([
128
+ { role: ContentGeneratorRole.USER, content: 'test' },
129
+ ])
130
+ .next();
131
+ expect(response.value).toMatchObject({
132
+ content: expect.stringContaining('env-key-78'),
133
+ });
134
+ expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
135
+ });
136
+ it('should fall back to OAuth when enabled and no other auth available', async () => {
137
+ const config = {
138
+ name: 'test',
139
+ envKeyNames: ['TEST_API_KEY'],
140
+ isOAuthEnabled: true,
141
+ oauthProvider: 'test',
142
+ oauthManager: mockOAuthManager,
143
+ };
144
+ // No environment variables set
145
+ vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token-abc');
146
+ const provider = new TestProvider(config);
147
+ const response = await provider
148
+ .generateChatCompletion([
149
+ { role: ContentGeneratorRole.USER, content: 'test' },
150
+ ])
151
+ .next();
152
+ expect(response.value).toMatchObject({
153
+ content: expect.stringContaining('oauth-toke'),
154
+ });
155
+ expect(mockOAuthManager.getToken).toHaveBeenCalledWith('test');
156
+ });
157
+ it('should throw error when no authentication available', async () => {
158
+ const config = {
159
+ name: 'test',
160
+ envKeyNames: ['TEST_API_KEY'],
161
+ isOAuthEnabled: false, // OAuth disabled
162
+ oauthProvider: 'test',
163
+ };
164
+ // No environment variables set
165
+ const provider = new TestProvider(config);
166
+ await expect(provider
167
+ .generateChatCompletion([
168
+ { role: ContentGeneratorRole.USER, content: 'test' },
169
+ ])
170
+ .next()).rejects.toThrow('No API key found and OAuth is available but not authenticated for test provider');
171
+ });
172
+ });
173
+ describe('OAuth Support Validation', () => {
174
+ it('should not attempt OAuth when provider does not support it', async () => {
175
+ const config = {
176
+ name: 'non-oauth-test',
177
+ envKeyNames: ['TEST_API_KEY'],
178
+ isOAuthEnabled: true, // Enabled but provider doesn't support it
179
+ oauthProvider: 'test',
180
+ oauthManager: mockOAuthManager,
181
+ };
182
+ vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token');
183
+ const provider = new NonOAuthTestProvider(config);
184
+ await expect(provider
185
+ .generateChatCompletion([
186
+ { role: ContentGeneratorRole.USER, content: 'test' },
187
+ ])
188
+ .next()).rejects.toThrow('No authentication method available');
189
+ expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
190
+ });
191
+ it('should provide helpful error message when OAuth is only available option', async () => {
192
+ const config = {
193
+ name: 'test',
194
+ envKeyNames: ['TEST_API_KEY'],
195
+ isOAuthEnabled: true,
196
+ oauthProvider: 'test',
197
+ // No OAuth manager provided
198
+ };
199
+ const provider = new TestProvider(config);
200
+ await expect(provider
201
+ .generateChatCompletion([
202
+ { role: ContentGeneratorRole.USER, content: 'test' },
203
+ ])
204
+ .next()).rejects.toThrow('No API key found and OAuth is available but not authenticated for test provider');
205
+ });
206
+ });
207
+ describe('Lazy OAuth Triggering', () => {
208
+ it('should only trigger OAuth when making API calls, not during initialization', async () => {
209
+ const config = {
210
+ name: 'test',
211
+ envKeyNames: ['TEST_API_KEY'],
212
+ isOAuthEnabled: true,
213
+ oauthProvider: 'test',
214
+ oauthManager: mockOAuthManager,
215
+ };
216
+ vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token');
217
+ // When: Initialize provider
218
+ const provider = new TestProvider(config);
219
+ // Then: OAuth should not be called during initialization
220
+ expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
221
+ // When: Make API call
222
+ await provider
223
+ .generateChatCompletion([
224
+ { role: ContentGeneratorRole.USER, content: 'test' },
225
+ ])
226
+ .next();
227
+ // Then: OAuth should be called
228
+ expect(mockOAuthManager.getToken).toHaveBeenCalledWith('test');
229
+ });
230
+ it('should cache auth token to avoid repeated OAuth calls', async () => {
231
+ const config = {
232
+ name: 'test',
233
+ envKeyNames: ['TEST_API_KEY'],
234
+ isOAuthEnabled: true,
235
+ oauthProvider: 'test',
236
+ oauthManager: mockOAuthManager,
237
+ };
238
+ vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token');
239
+ const provider = new TestProvider(config);
240
+ // When: Make multiple API calls
241
+ await provider
242
+ .generateChatCompletion([
243
+ { role: ContentGeneratorRole.USER, content: 'test 1' },
244
+ ])
245
+ .next();
246
+ await provider
247
+ .generateChatCompletion([
248
+ { role: ContentGeneratorRole.USER, content: 'test 2' },
249
+ ])
250
+ .next();
251
+ // Then: OAuth should be called once and cached for the second call
252
+ expect(mockOAuthManager.getToken).toHaveBeenCalledTimes(1); // Called once, cached for second call
253
+ });
254
+ it('should re-resolve auth after cache expires', async () => {
255
+ const config = {
256
+ name: 'test',
257
+ envKeyNames: ['TEST_API_KEY'],
258
+ isOAuthEnabled: true,
259
+ oauthProvider: 'test',
260
+ oauthManager: mockOAuthManager,
261
+ };
262
+ vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token');
263
+ // Mock Date.now to control cache expiration
264
+ const originalNow = Date.now;
265
+ let mockTime = 1000;
266
+ vi.spyOn(Date, 'now').mockImplementation(() => mockTime);
267
+ const provider = new TestProvider(config);
268
+ // First call
269
+ await provider
270
+ .generateChatCompletion([
271
+ { role: ContentGeneratorRole.USER, content: 'test 1' },
272
+ ])
273
+ .next();
274
+ // Advance time beyond cache duration (1 minute)
275
+ mockTime += 61000;
276
+ // Second call after cache expiry
277
+ await provider
278
+ .generateChatCompletion([
279
+ { role: ContentGeneratorRole.USER, content: 'test 2' },
280
+ ])
281
+ .next();
282
+ expect(mockOAuthManager.getToken).toHaveBeenCalledTimes(2);
283
+ // Restore Date.now
284
+ Date.now = originalNow;
285
+ });
286
+ });
287
+ describe('Utility Methods', () => {
288
+ it('should correctly identify when non-OAuth auth is available', async () => {
289
+ const config = {
290
+ name: 'test',
291
+ cliKey: 'cli-key-456',
292
+ isOAuthEnabled: true,
293
+ oauthProvider: 'test',
294
+ oauthManager: mockOAuthManager,
295
+ };
296
+ const provider = new TestProvider(config);
297
+ const hasNonOAuth = await provider.hasNonOAuthAuthentication();
298
+ expect(hasNonOAuth).toBe(true);
299
+ });
300
+ it('should correctly identify OAuth-only scenarios', async () => {
301
+ const config = {
302
+ name: 'test',
303
+ envKeyNames: ['TEST_API_KEY'],
304
+ isOAuthEnabled: true,
305
+ oauthProvider: 'test',
306
+ oauthManager: mockOAuthManager,
307
+ };
308
+ // No environment variables set
309
+ const provider = new TestProvider(config);
310
+ const isOAuthOnly = await provider.isOAuthOnlyAvailable();
311
+ expect(isOAuthOnly).toBe(true);
312
+ });
313
+ it('should get correct auth method name', async () => {
314
+ const config = {
315
+ name: 'test',
316
+ cliKey: 'cli-key-456',
317
+ };
318
+ const provider = new TestProvider(config);
319
+ const methodName = await provider.getAuthMethodName();
320
+ expect(methodName).toBe('cli-key');
321
+ });
322
+ it('should check authentication status correctly', async () => {
323
+ const config = {
324
+ name: 'test',
325
+ cliKey: 'cli-key-456',
326
+ };
327
+ const provider = new TestProvider(config);
328
+ const isAuthenticated = await provider.isAuthenticated();
329
+ expect(isAuthenticated).toBe(true);
330
+ });
331
+ });
332
+ describe('Configuration Updates', () => {
333
+ it('should update API key correctly', async () => {
334
+ const config = {
335
+ name: 'test',
336
+ cliKey: 'old-key',
337
+ };
338
+ const provider = new TestProvider(config);
339
+ // When: Update API key
340
+ provider.setApiKey?.('new-key');
341
+ // Then: Should use new key
342
+ const response = await provider
343
+ .generateChatCompletion([
344
+ { role: ContentGeneratorRole.USER, content: 'test' },
345
+ ])
346
+ .next();
347
+ expect(response.value).toMatchObject({
348
+ content: expect.stringContaining('new-key'),
349
+ });
350
+ });
351
+ it('should clear auth cache when API key is updated', async () => {
352
+ const config = {
353
+ name: 'test',
354
+ envKeyNames: ['TEST_API_KEY'],
355
+ isOAuthEnabled: true,
356
+ oauthProvider: 'test',
357
+ oauthManager: mockOAuthManager,
358
+ };
359
+ vi.mocked(mockOAuthManager.getToken)
360
+ .mockResolvedValueOnce('oauth-token-1')
361
+ .mockResolvedValueOnce('oauth-token-2');
362
+ const provider = new TestProvider(config);
363
+ // First call uses OAuth
364
+ await provider
365
+ .generateChatCompletion([
366
+ { role: ContentGeneratorRole.USER, content: 'test 1' },
367
+ ])
368
+ .next();
369
+ // Update to use API key
370
+ provider.setApiKey?.('new-api-key');
371
+ // Second call should use new API key, not cached OAuth
372
+ const response = await provider
373
+ .generateChatCompletion([
374
+ { role: ContentGeneratorRole.USER, content: 'test 2' },
375
+ ])
376
+ .next();
377
+ expect(response.value).toMatchObject({
378
+ content: expect.stringContaining('new-api-ke'),
379
+ });
380
+ });
381
+ it('should update OAuth configuration correctly', async () => {
382
+ const config = {
383
+ name: 'test',
384
+ envKeyNames: ['TEST_API_KEY'],
385
+ isOAuthEnabled: false,
386
+ oauthProvider: 'test',
387
+ };
388
+ const provider = new TestProvider(config);
389
+ // Initially should fail due to no auth
390
+ await expect(provider
391
+ .generateChatCompletion([
392
+ { role: ContentGeneratorRole.USER, content: 'test' },
393
+ ])
394
+ .next()).rejects.toThrow();
395
+ // Enable OAuth
396
+ provider.updateOAuthConfig(true, 'test', mockOAuthManager);
397
+ vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token');
398
+ // Should now work with OAuth
399
+ const response = await provider
400
+ .generateChatCompletion([
401
+ { role: ContentGeneratorRole.USER, content: 'test' },
402
+ ])
403
+ .next();
404
+ expect(response.value).toMatchObject({
405
+ content: expect.stringContaining('oauth-toke'),
406
+ });
407
+ });
408
+ });
409
+ describe('Error Handling', () => {
410
+ it('should handle OAuth errors gracefully', async () => {
411
+ const config = {
412
+ name: 'test',
413
+ envKeyNames: ['TEST_API_KEY'],
414
+ isOAuthEnabled: true,
415
+ oauthProvider: 'test',
416
+ oauthManager: mockOAuthManager,
417
+ };
418
+ vi.mocked(mockOAuthManager.getToken).mockRejectedValue(new Error('OAuth failed'));
419
+ const provider = new TestProvider(config);
420
+ await expect(provider
421
+ .generateChatCompletion([
422
+ { role: ContentGeneratorRole.USER, content: 'test' },
423
+ ])
424
+ .next()).rejects.toThrow('No API key found and OAuth is available but not authenticated for test provider');
425
+ });
426
+ it('should handle missing OAuth provider gracefully', async () => {
427
+ const config = {
428
+ name: 'test',
429
+ envKeyNames: ['TEST_API_KEY'],
430
+ isOAuthEnabled: true,
431
+ // No oauthProvider specified
432
+ oauthManager: mockOAuthManager,
433
+ };
434
+ const provider = new TestProvider(config);
435
+ await expect(provider
436
+ .generateChatCompletion([
437
+ { role: ContentGeneratorRole.USER, content: 'test' },
438
+ ])
439
+ .next()).rejects.toThrow('No API key found and OAuth is available but not authenticated for test provider');
440
+ expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
441
+ });
442
+ });
443
+ describe('Default Implementations', () => {
444
+ it('should provide default implementations for optional methods', () => {
445
+ const config = {
446
+ name: 'test',
447
+ cliKey: 'test-key',
448
+ };
449
+ const provider = new TestProvider(config);
450
+ // These should not throw
451
+ expect(provider.setModel?.('new-model')).toBeUndefined();
452
+ expect(provider.getCurrentModel?.()).toBe('default');
453
+ expect(provider.getToolFormat?.()).toBe('default');
454
+ expect(provider.setToolFormatOverride?.(null)).toBeUndefined();
455
+ expect(provider.isPaidMode?.()).toBe(false);
456
+ expect(provider.clearState?.()).toBeUndefined();
457
+ expect(provider.setConfig?.({})).toBeUndefined();
458
+ expect(provider.getServerTools()).toEqual([]);
459
+ expect(provider.setModelParams?.(undefined)).toBeUndefined();
460
+ expect(provider.getModelParams?.()).toBeUndefined();
461
+ });
462
+ it('should throw error for unsupported server tools', async () => {
463
+ const config = {
464
+ name: 'test',
465
+ cliKey: 'test-key',
466
+ };
467
+ const provider = new TestProvider(config);
468
+ await expect(provider.invokeServerTool('unsupported-tool', {})).rejects.toThrow("Server tool 'unsupported-tool' not supported by test provider");
469
+ });
470
+ });
471
+ });
472
+ //# sourceMappingURL=BaseProvider.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseProvider.test.js","sourceRoot":"","sources":["../../../src/providers/BaseProvider.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,YAAY,EAAsB,MAAM,mBAAmB,CAAC;AAKrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,iCAAiC;AACjC,MAAM,gBAAgB,GAAiB;IACrC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;IACjB,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;CACzB,CAAC;AAEF,sDAAsD;AACtD,MAAM,YAAa,SAAQ,YAAY;IACrC,YAAY,MAA0B;QACpC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAES,aAAa;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO;YACL;gBACE,EAAE,EAAE,YAAY;gBAChB,IAAI,EAAE,YAAY;gBAClB,QAAQ,EAAE,MAAM;gBAChB,oBAAoB,EAAE,EAAE;aACzB;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,CAAC,sBAAsB,CAC3B,SAAqB,EACrB,MAAgB,EAChB,WAAoB;QAEpB,kDAAkD;QAClD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QACxC,MAAM;YACJ,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,yBAAyB,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK;SAC9D,CAAC;IACJ,CAAC;CACF;AAED,iCAAiC;AACjC,MAAM,oBAAqB,SAAQ,YAAY;IACnC,aAAa;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,CAAC,sBAAsB,CAC3B,SAAqB,EACrB,MAAgB;QAEhB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QACxC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,uBAAuB,KAAK,EAAE,EAAE,CAAC;IACvE,CAAC;CACF;AAED,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAI,WAA8B,CAAC;IAEnC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,WAAW,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QACjC,mCAAmC;QACnC,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QAChC,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,GAAG,GAAG,WAAW,CAAC;QAC1B,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,UAAU,EAAE,iBAAiB;gBAC7B,MAAM,EAAE,aAAa;gBACrB,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,aAAa,CAAC;YACzC,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAEtE,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,sDAAsD;YACtD,MAAM,QAAQ,GAAG,MAAM,QAAQ;iBAC5B,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CAAC;YAEV,+BAA+B;YAC/B,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC;gBACnC,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC;aAC/C,CAAC,CAAC;YACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,aAAa;gBACrB,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,aAAa,CAAC;YACzC,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAEtE,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,QAAQ,GAAG,MAAM,QAAQ;iBAC5B,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CAAC;YAEV,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC;gBACnC,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC;aAC/C,CAAC,CAAC;YACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,aAAa,CAAC;YACzC,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAEtE,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,QAAQ,GAAG,MAAM,QAAQ;iBAC5B,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CAAC;YAEV,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC;gBACnC,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC;aAC/C,CAAC,CAAC;YACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;YAClF,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,+BAA+B;YAC/B,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;YAE1E,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,QAAQ,GAAG,MAAM,QAAQ;iBAC5B,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CAAC;YAEV,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC;gBACnC,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC;aAC/C,CAAC,CAAC;YACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,KAAK,EAAE,iBAAiB;gBACxC,aAAa,EAAE,MAAM;aACtB,CAAC;YAEF,+BAA+B;YAC/B,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,MAAM,CACV,QAAQ;iBACL,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CACV,CAAC,OAAO,CAAC,OAAO,CACf,iFAAiF,CAClF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YAC1E,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,gBAAgB;gBACtB,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI,EAAE,0CAA0C;gBAChE,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAEtE,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC;YAElD,MAAM,MAAM,CACV,QAAQ;iBACL,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CACV,CAAC,OAAO,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;YAExD,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;YACxF,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,MAAM;gBACrB,4BAA4B;aAC7B,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,MAAM,CACV,QAAQ;iBACL,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CACV,CAAC,OAAO,CAAC,OAAO,CACf,iFAAiF,CAClF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;YAC1F,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAEtE,4BAA4B;YAC5B,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,yDAAyD;YACzD,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAEzD,sBAAsB;YACtB,MAAM,QAAQ;iBACX,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CAAC;YAEV,+BAA+B;YAC/B,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACrE,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAEtE,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,gCAAgC;YAChC,MAAM,QAAQ;iBACX,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE;aACvD,CAAC;iBACD,IAAI,EAAE,CAAC;YACV,MAAM,QAAQ;iBACX,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE;aACvD,CAAC;iBACD,IAAI,EAAE,CAAC;YAEV,mEAAmE;YACnE,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,sCAAsC;QACpG,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAEtE,4CAA4C;YAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC;YAC7B,IAAI,QAAQ,GAAG,IAAI,CAAC;YACpB,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;YAEzD,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,aAAa;YACb,MAAM,QAAQ;iBACX,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE;aACvD,CAAC;iBACD,IAAI,EAAE,CAAC;YAEV,gDAAgD;YAChD,QAAQ,IAAI,KAAK,CAAC;YAElB,iCAAiC;YACjC,MAAM,QAAQ;iBACX,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE;aACvD,CAAC;iBACD,IAAI,EAAE,CAAC;YAEV,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAE3D,mBAAmB;YACnB,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YAC1E,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,aAAa;gBACrB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,yBAAyB,EAAE,CAAC;YAC/D,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,+BAA+B;YAC/B,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,oBAAoB,EAAE,CAAC;YAC1D,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,aAAa;aACtB,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,iBAAiB,EAAE,CAAC;YACtD,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,aAAa;aACtB,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,eAAe,GAAG,MAAM,QAAQ,CAAC,eAAe,EAAE,CAAC;YACzD,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,SAAS;aAClB,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,uBAAuB;YACvB,QAAQ,CAAC,SAAS,EAAE,CAAC,SAAS,CAAC,CAAC;YAEhC,2BAA2B;YAC3B,MAAM,QAAQ,GAAG,MAAM,QAAQ;iBAC5B,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CAAC;YAEV,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC;gBACnC,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC;aAC5C,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC;iBACjC,qBAAqB,CAAC,eAAe,CAAC;iBACtC,qBAAqB,CAAC,eAAe,CAAC,CAAC;YAE1C,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,wBAAwB;YACxB,MAAM,QAAQ;iBACX,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE;aACvD,CAAC;iBACD,IAAI,EAAE,CAAC;YAEV,wBAAwB;YACxB,QAAQ,CAAC,SAAS,EAAE,CAAC,aAAa,CAAC,CAAC;YAEpC,uDAAuD;YACvD,MAAM,QAAQ,GAAG,MAAM,QAAQ;iBAC5B,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE;aACvD,CAAC;iBACD,IAAI,EAAE,CAAC;YAEV,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC;gBACnC,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC;aAC/C,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,KAAK;gBACrB,aAAa,EAAE,MAAM;aACtB,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,uCAAuC;YACvC,MAAM,MAAM,CACV,QAAQ;iBACL,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CACV,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAEpB,eAAe;YAEb,QAOD,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;YACpD,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAEtE,6BAA6B;YAC7B,MAAM,QAAQ,GAAG,MAAM,QAAQ;iBAC5B,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CAAC;YAEV,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC;gBACnC,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC;aAC/C,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CACpD,IAAI,KAAK,CAAC,cAAc,CAAC,CAC1B,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,MAAM,CACV,QAAQ;iBACL,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CACV,CAAC,OAAO,CAAC,OAAO,CACf,iFAAiF,CAClF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI;gBACpB,6BAA6B;gBAC7B,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,MAAM,CACV,QAAQ;iBACL,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CACV,CAAC,OAAO,CAAC,OAAO,CACf,iFAAiF,CAClF,CAAC;YAEF,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;YACrE,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,UAAU;aACnB,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,yBAAyB;YACzB,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;YACzD,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACrD,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACnD,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;YAC/D,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5C,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;YAChD,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;YACjD,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;YAC7D,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,UAAU;aACnB,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,MAAM,CACV,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAClD,CAAC,OAAO,CAAC,OAAO,CACf,+DAA+D,CAChE,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -5,10 +5,15 @@
5
5
  */
6
6
  import { IProvider } from './IProvider.js';
7
7
  import { IModel } from './IModel.js';
8
+ import { Config } from '../config/config.js';
8
9
  /**
9
10
  * Manager for handling multiple providers
10
11
  */
11
12
  export interface IProviderManager {
13
+ /**
14
+ * Set the configuration for the provider manager
15
+ */
16
+ setConfig(config: Config): void;
12
17
  /**
13
18
  * Register a provider
14
19
  */
@@ -0,0 +1,53 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { IProvider, IModel, ITool, IMessage } from './IProvider.js';
7
+ import { Config } from '../config/config.js';
8
+ export interface ConversationDataRedactor {
9
+ redactMessage(message: IMessage, provider: string): IMessage;
10
+ redactToolCall(tool: ITool): ITool;
11
+ redactResponseContent(content: string, provider: string): string;
12
+ }
13
+ /**
14
+ * A minimal logging wrapper that acts as a transparent passthrough to the wrapped provider.
15
+ * Only intercepts generateChatCompletion to log conversations while forwarding all other
16
+ * methods directly to the wrapped provider without modification.
17
+ */
18
+ export declare class LoggingProviderWrapper implements IProvider {
19
+ private readonly wrapped;
20
+ private readonly config;
21
+ private conversationId;
22
+ private turnNumber;
23
+ private redactor;
24
+ constructor(wrapped: IProvider, config: Config, redactor?: ConversationDataRedactor);
25
+ /**
26
+ * Access to the wrapped provider for unwrapping if needed
27
+ */
28
+ get wrappedProvider(): IProvider;
29
+ get name(): string;
30
+ get isDefault(): boolean | undefined;
31
+ getModels(): Promise<IModel[]>;
32
+ generateChatCompletion(messages: IMessage[], tools?: ITool[], toolFormat?: string): AsyncIterableIterator<unknown>;
33
+ private logRequest;
34
+ private logResponseStream;
35
+ private extractSimpleContent;
36
+ private logResponse;
37
+ private generateConversationId;
38
+ private generatePromptId;
39
+ private logToolCall;
40
+ setModel?(modelId: string): void;
41
+ getCurrentModel?(): string;
42
+ setApiKey?(apiKey: string): void;
43
+ setBaseUrl?(baseUrl?: string): void;
44
+ getToolFormat?(): string;
45
+ setToolFormatOverride?(format: string | null): void;
46
+ isPaidMode?(): boolean;
47
+ clearState?(): void;
48
+ setConfig?(config: unknown): void;
49
+ getServerTools(): string[];
50
+ invokeServerTool(toolName: string, params: unknown, config?: unknown): Promise<unknown>;
51
+ setModelParams?(params: Record<string, unknown> | undefined): void;
52
+ getModelParams?(): Record<string, unknown> | undefined;
53
+ }