@vybestack/llxprt-code-core 0.1.18-nightly.250808.f9b79d74 → 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 (228) hide show
  1. package/dist/index.d.ts +3 -0
  2. package/dist/index.js +3 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/src/auth/auth-integration.spec.d.ts +6 -0
  5. package/dist/src/auth/auth-integration.spec.js +384 -0
  6. package/dist/src/auth/auth-integration.spec.js.map +1 -0
  7. package/dist/src/auth/precedence.d.ts +55 -0
  8. package/dist/src/auth/precedence.js +211 -0
  9. package/dist/src/auth/precedence.js.map +1 -0
  10. package/dist/src/auth/precedence.test.d.ts +6 -0
  11. package/dist/src/auth/precedence.test.js +374 -0
  12. package/dist/src/auth/precedence.test.js.map +1 -0
  13. package/dist/src/auth/qwen-device-flow.d.ts +45 -0
  14. package/dist/src/auth/qwen-device-flow.js +179 -0
  15. package/dist/src/auth/qwen-device-flow.js.map +1 -0
  16. package/dist/src/auth/qwen-device-flow.spec.d.ts +6 -0
  17. package/dist/src/auth/qwen-device-flow.spec.js +793 -0
  18. package/dist/src/auth/qwen-device-flow.spec.js.map +1 -0
  19. package/dist/src/auth/token-store.d.ts +66 -0
  20. package/dist/src/auth/token-store.js +147 -0
  21. package/dist/src/auth/token-store.js.map +1 -0
  22. package/dist/src/auth/token-store.spec.d.ts +6 -0
  23. package/dist/src/auth/token-store.spec.js +405 -0
  24. package/dist/src/auth/token-store.spec.js.map +1 -0
  25. package/dist/src/auth/types.d.ts +130 -0
  26. package/dist/src/auth/types.js +60 -0
  27. package/dist/src/auth/types.js.map +1 -0
  28. package/dist/src/code_assist/converter.d.ts +2 -1
  29. package/dist/src/code_assist/converter.js +1 -1
  30. package/dist/src/code_assist/converter.js.map +1 -1
  31. package/dist/src/code_assist/converter.test.js +48 -1
  32. package/dist/src/code_assist/converter.test.js.map +1 -1
  33. package/dist/src/code_assist/oauth2.js +2 -1
  34. package/dist/src/code_assist/oauth2.js.map +1 -1
  35. package/dist/src/code_assist/server.test.js +4 -1
  36. package/dist/src/code_assist/server.test.js.map +1 -1
  37. package/dist/src/config/config.d.ts +71 -2
  38. package/dist/src/config/config.ephemeral.test.d.ts +6 -0
  39. package/dist/src/config/config.ephemeral.test.js +152 -0
  40. package/dist/src/config/config.ephemeral.test.js.map +1 -0
  41. package/dist/src/config/config.js +117 -2
  42. package/dist/src/config/config.js.map +1 -1
  43. package/dist/src/config/config.test.js +8 -0
  44. package/dist/src/config/config.test.js.map +1 -1
  45. package/dist/src/config/endpoints.d.ts +60 -0
  46. package/dist/src/config/endpoints.js +126 -0
  47. package/dist/src/config/endpoints.js.map +1 -0
  48. package/dist/src/config/endpoints.test.d.ts +6 -0
  49. package/dist/src/config/endpoints.test.js +196 -0
  50. package/dist/src/config/endpoints.test.js.map +1 -0
  51. package/dist/src/core/client.js +16 -16
  52. package/dist/src/core/client.js.map +1 -1
  53. package/dist/src/core/client.test.js +13 -7
  54. package/dist/src/core/client.test.js.map +1 -1
  55. package/dist/src/core/contentGenerator.d.ts +3 -1
  56. package/dist/src/core/contentGenerator.js +2 -0
  57. package/dist/src/core/contentGenerator.js.map +1 -1
  58. package/dist/src/core/logger.d.ts +1 -0
  59. package/dist/src/core/logger.js +18 -0
  60. package/dist/src/core/logger.js.map +1 -1
  61. package/dist/src/core/logger.test.js +29 -0
  62. package/dist/src/core/logger.test.js.map +1 -1
  63. package/dist/src/core/loggingContentGenerator.d.ts +24 -0
  64. package/dist/src/core/loggingContentGenerator.js +89 -0
  65. package/dist/src/core/loggingContentGenerator.js.map +1 -0
  66. package/dist/src/core/nonInteractiveToolExecutor.js +17 -0
  67. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
  68. package/dist/src/core/subagent.js +12 -10
  69. package/dist/src/core/subagent.js.map +1 -1
  70. package/dist/src/core/subagent.test.js +8 -17
  71. package/dist/src/core/subagent.test.js.map +1 -1
  72. package/dist/src/ide/ide-client.d.ts +2 -2
  73. package/dist/src/ide/ide-client.js +56 -18
  74. package/dist/src/ide/ide-client.js.map +1 -1
  75. package/dist/src/index.d.ts +5 -0
  76. package/dist/src/index.js +7 -0
  77. package/dist/src/index.js.map +1 -1
  78. package/dist/src/integration-tests/oauth-integration.spec.d.ts +6 -0
  79. package/dist/src/integration-tests/oauth-integration.spec.js +518 -0
  80. package/dist/src/integration-tests/oauth-integration.spec.js.map +1 -0
  81. package/dist/src/integration-tests/oauth-simple-test.spec.d.ts +1 -0
  82. package/dist/src/integration-tests/oauth-simple-test.spec.js +88 -0
  83. package/dist/src/integration-tests/oauth-simple-test.spec.js.map +1 -0
  84. package/dist/src/providers/BaseProvider.d.ts +98 -0
  85. package/dist/src/providers/BaseProvider.js +180 -0
  86. package/dist/src/providers/BaseProvider.js.map +1 -0
  87. package/dist/src/providers/BaseProvider.test.d.ts +6 -0
  88. package/dist/src/providers/BaseProvider.test.js +472 -0
  89. package/dist/src/providers/BaseProvider.test.js.map +1 -0
  90. package/dist/src/providers/IProviderManager.d.ts +5 -0
  91. package/dist/src/providers/LoggingProviderWrapper.d.ts +53 -0
  92. package/dist/src/providers/LoggingProviderWrapper.js +347 -0
  93. package/dist/src/providers/LoggingProviderWrapper.js.map +1 -0
  94. package/dist/src/providers/ProviderManager.d.ts +20 -0
  95. package/dist/src/providers/ProviderManager.js +214 -1
  96. package/dist/src/providers/ProviderManager.js.map +1 -1
  97. package/dist/src/providers/gemini/GeminiProvider.d.ts +12 -7
  98. package/dist/src/providers/gemini/GeminiProvider.js +130 -147
  99. package/dist/src/providers/gemini/GeminiProvider.js.map +1 -1
  100. package/dist/src/providers/integration/multi-provider.integration.test.js +18 -2
  101. package/dist/src/providers/integration/multi-provider.integration.test.js.map +1 -1
  102. package/dist/src/providers/logging/ProviderContentExtractor.d.ts +27 -0
  103. package/dist/src/providers/logging/ProviderContentExtractor.js +198 -0
  104. package/dist/src/providers/logging/ProviderContentExtractor.js.map +1 -0
  105. package/dist/src/providers/logging/ProviderPerformanceTracker.d.ts +43 -0
  106. package/dist/src/providers/logging/ProviderPerformanceTracker.js +98 -0
  107. package/dist/src/providers/logging/ProviderPerformanceTracker.js.map +1 -0
  108. package/dist/src/providers/openai/OpenAIProvider.d.ts +21 -6
  109. package/dist/src/providers/openai/OpenAIProvider.js +173 -27
  110. package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
  111. package/dist/src/providers/openai/OpenAIProvider.test.js +3 -2
  112. package/dist/src/providers/openai/OpenAIProvider.test.js.map +1 -1
  113. package/dist/src/providers/openai/openai-oauth.spec.d.ts +16 -0
  114. package/dist/src/providers/openai/openai-oauth.spec.js +544 -0
  115. package/dist/src/providers/openai/openai-oauth.spec.js.map +1 -0
  116. package/dist/src/providers/types.d.ts +47 -0
  117. package/dist/src/services/git-stats-service.d.ts +32 -0
  118. package/dist/src/services/git-stats-service.js +22 -0
  119. package/dist/src/services/git-stats-service.js.map +1 -0
  120. package/dist/src/services/loopDetectionService.js +10 -6
  121. package/dist/src/services/loopDetectionService.js.map +1 -1
  122. package/dist/src/services/loopDetectionService.test.js +139 -0
  123. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  124. package/dist/src/services/shellExecutionService.js +44 -8
  125. package/dist/src/services/shellExecutionService.js.map +1 -1
  126. package/dist/src/storage/ConversationFileWriter.d.ts +16 -0
  127. package/dist/src/storage/ConversationFileWriter.js +69 -0
  128. package/dist/src/storage/ConversationFileWriter.js.map +1 -0
  129. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +8 -0
  130. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +56 -3
  131. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  132. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +6 -0
  133. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +187 -0
  134. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -0
  135. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +5 -1
  136. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +11 -0
  137. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  138. package/dist/src/telemetry/constants.d.ts +5 -0
  139. package/dist/src/telemetry/constants.js +5 -0
  140. package/dist/src/telemetry/constants.js.map +1 -1
  141. package/dist/src/telemetry/loggers.d.ts +5 -1
  142. package/dist/src/telemetry/loggers.js +87 -1
  143. package/dist/src/telemetry/loggers.js.map +1 -1
  144. package/dist/src/telemetry/loggers.test.js +2 -1
  145. package/dist/src/telemetry/loggers.test.js.map +1 -1
  146. package/dist/src/telemetry/metrics.d.ts +2 -1
  147. package/dist/src/telemetry/metrics.js +7 -1
  148. package/dist/src/telemetry/metrics.js.map +1 -1
  149. package/dist/src/telemetry/metrics.test.js +50 -0
  150. package/dist/src/telemetry/metrics.test.js.map +1 -1
  151. package/dist/src/telemetry/tool-call-decision.d.ts +13 -0
  152. package/dist/src/telemetry/tool-call-decision.js +29 -0
  153. package/dist/src/telemetry/tool-call-decision.js.map +1 -0
  154. package/dist/src/telemetry/types.d.ts +56 -1
  155. package/dist/src/telemetry/types.js +123 -0
  156. package/dist/src/telemetry/types.js.map +1 -1
  157. package/dist/src/telemetry/uiTelemetry.d.ts +2 -1
  158. package/dist/src/telemetry/uiTelemetry.js +1 -1
  159. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  160. package/dist/src/telemetry/uiTelemetry.test.js +2 -1
  161. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  162. package/dist/src/tools/diffOptions.d.ts +2 -0
  163. package/dist/src/tools/diffOptions.js +28 -0
  164. package/dist/src/tools/diffOptions.js.map +1 -1
  165. package/dist/src/tools/diffOptions.test.d.ts +6 -0
  166. package/dist/src/tools/diffOptions.test.js +119 -0
  167. package/dist/src/tools/diffOptions.test.js.map +1 -0
  168. package/dist/src/tools/edit.d.ts +8 -32
  169. package/dist/src/tools/edit.js +153 -136
  170. package/dist/src/tools/edit.js.map +1 -1
  171. package/dist/src/tools/edit.test.js +77 -51
  172. package/dist/src/tools/edit.test.js.map +1 -1
  173. package/dist/src/tools/glob.d.ts +3 -10
  174. package/dist/src/tools/glob.js +97 -99
  175. package/dist/src/tools/glob.js.map +1 -1
  176. package/dist/src/tools/glob.test.js +37 -26
  177. package/dist/src/tools/glob.test.js.map +1 -1
  178. package/dist/src/tools/grep.d.ts +3 -35
  179. package/dist/src/tools/grep.js +117 -88
  180. package/dist/src/tools/grep.js.map +1 -1
  181. package/dist/src/tools/grep.test.js +36 -22
  182. package/dist/src/tools/grep.test.js.map +1 -1
  183. package/dist/src/tools/mcp-client.d.ts +4 -3
  184. package/dist/src/tools/mcp-client.js +23 -6
  185. package/dist/src/tools/mcp-client.js.map +1 -1
  186. package/dist/src/tools/mcp-client.test.js +44 -2
  187. package/dist/src/tools/mcp-client.test.js.map +1 -1
  188. package/dist/src/tools/read-file.js +37 -9
  189. package/dist/src/tools/read-file.js.map +1 -1
  190. package/dist/src/tools/read-file.test.js +8 -2
  191. package/dist/src/tools/read-file.test.js.map +1 -1
  192. package/dist/src/tools/shell.test.js +17 -0
  193. package/dist/src/tools/shell.test.js.map +1 -1
  194. package/dist/src/tools/todo-pause.d.ts +22 -0
  195. package/dist/src/tools/todo-pause.js +93 -0
  196. package/dist/src/tools/todo-pause.js.map +1 -0
  197. package/dist/src/tools/todo-pause.spec.d.ts +6 -0
  198. package/dist/src/tools/todo-pause.spec.js +287 -0
  199. package/dist/src/tools/todo-pause.spec.js.map +1 -0
  200. package/dist/src/tools/tool-error.d.ts +4 -0
  201. package/dist/src/tools/tool-error.js +4 -0
  202. package/dist/src/tools/tool-error.js.map +1 -1
  203. package/dist/src/tools/tool-registry.js +3 -3
  204. package/dist/src/tools/tool-registry.js.map +1 -1
  205. package/dist/src/tools/tool-registry.test.js +2 -2
  206. package/dist/src/tools/tool-registry.test.js.map +1 -1
  207. package/dist/src/tools/tools.d.ts +18 -0
  208. package/dist/src/tools/tools.js +15 -0
  209. package/dist/src/tools/tools.js.map +1 -1
  210. package/dist/src/tools/web-search.test.js +1 -0
  211. package/dist/src/tools/web-search.test.js.map +1 -1
  212. package/dist/src/tools/write-file.d.ts +4 -0
  213. package/dist/src/tools/write-file.js +90 -16
  214. package/dist/src/tools/write-file.js.map +1 -1
  215. package/dist/src/tools/write-file.test.js +5 -4
  216. package/dist/src/tools/write-file.test.js.map +1 -1
  217. package/dist/src/types/modelParams.d.ts +2 -0
  218. package/dist/src/utils/environmentContext.js +1 -1
  219. package/dist/src/utils/errors.d.ts +3 -0
  220. package/dist/src/utils/errors.js +6 -0
  221. package/dist/src/utils/errors.js.map +1 -1
  222. package/dist/src/utils/fileUtils.d.ts +7 -0
  223. package/dist/src/utils/fileUtils.js +9 -0
  224. package/dist/src/utils/fileUtils.js.map +1 -1
  225. package/dist/src/utils/filesearch/fileSearch.d.ts +1 -0
  226. package/dist/src/utils/filesearch/fileSearch.js +27 -19
  227. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  228. package/package.json +1 -1
@@ -0,0 +1,211 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Authentication precedence utility for providers
8
+ *
9
+ * Implements the authentication precedence chain:
10
+ * 1. /key command key
11
+ * 2. /keyfile command keyfile
12
+ * 3. --key CLI argument
13
+ * 4. --keyfile CLI argument
14
+ * 5. Environment variables
15
+ * 6. OAuth (if enabled)
16
+ */
17
+ import * as fs from 'node:fs/promises';
18
+ import * as path from 'node:path';
19
+ export class AuthPrecedenceResolver {
20
+ config;
21
+ oauthManager;
22
+ constructor(config, oauthManager) {
23
+ this.config = config;
24
+ this.oauthManager = oauthManager;
25
+ }
26
+ /**
27
+ * Resolves authentication using the full precedence chain
28
+ * Returns the first available authentication method or null if none found
29
+ */
30
+ async resolveAuthentication() {
31
+ // 1. Check /key command key (highest priority)
32
+ if (this.config.commandKey && this.config.commandKey.trim() !== '') {
33
+ return this.config.commandKey;
34
+ }
35
+ // 2. Check /keyfile command keyfile
36
+ if (this.config.commandKeyfile) {
37
+ try {
38
+ const keyFromFile = await this.readKeyFile(this.config.commandKeyfile);
39
+ if (keyFromFile) {
40
+ return keyFromFile;
41
+ }
42
+ }
43
+ catch (error) {
44
+ if (process.env.DEBUG) {
45
+ console.warn(`Failed to read command keyfile ${this.config.commandKeyfile}:`, error);
46
+ }
47
+ }
48
+ }
49
+ // 3. Check --key CLI argument
50
+ if (this.config.cliKey && this.config.cliKey.trim() !== '') {
51
+ return this.config.cliKey;
52
+ }
53
+ // 4. Check --keyfile CLI argument
54
+ if (this.config.cliKeyfile) {
55
+ try {
56
+ const keyFromFile = await this.readKeyFile(this.config.cliKeyfile);
57
+ if (keyFromFile) {
58
+ return keyFromFile;
59
+ }
60
+ }
61
+ catch (error) {
62
+ if (process.env.DEBUG) {
63
+ console.warn(`Failed to read CLI keyfile ${this.config.cliKeyfile}:`, error);
64
+ }
65
+ }
66
+ }
67
+ // 5. Check environment variables
68
+ if (this.config.envKeyNames && this.config.envKeyNames.length > 0) {
69
+ for (const envVarName of this.config.envKeyNames) {
70
+ const envValue = process.env[envVarName];
71
+ if (envValue && envValue.trim() !== '') {
72
+ return envValue;
73
+ }
74
+ }
75
+ }
76
+ // 6. OAuth (if enabled and supported)
77
+ if (this.config.isOAuthEnabled &&
78
+ this.config.supportsOAuth &&
79
+ this.oauthManager &&
80
+ this.config.oauthProvider) {
81
+ try {
82
+ const token = await this.oauthManager.getToken(this.config.oauthProvider);
83
+ if (token) {
84
+ return token;
85
+ }
86
+ }
87
+ catch (error) {
88
+ if (process.env.DEBUG) {
89
+ console.warn(`Failed to get OAuth token for ${this.config.oauthProvider}:`, error);
90
+ }
91
+ }
92
+ }
93
+ // No authentication method available
94
+ return null;
95
+ }
96
+ /**
97
+ * Check if any authentication method is available without triggering OAuth
98
+ */
99
+ async hasNonOAuthAuthentication() {
100
+ // Check all precedence levels except OAuth
101
+ const tempConfig = { ...this.config, isOAuthEnabled: false };
102
+ const tempResolver = new AuthPrecedenceResolver(tempConfig, undefined);
103
+ const auth = await tempResolver.resolveAuthentication();
104
+ return auth !== null;
105
+ }
106
+ /**
107
+ * Check if OAuth is the only available authentication method
108
+ */
109
+ async isOAuthOnlyAvailable() {
110
+ const hasNonOAuth = await this.hasNonOAuthAuthentication();
111
+ return (!hasNonOAuth &&
112
+ this.config.isOAuthEnabled === true &&
113
+ this.config.supportsOAuth === true);
114
+ }
115
+ /**
116
+ * Get authentication method name for debugging/logging
117
+ */
118
+ async getAuthMethodName() {
119
+ // Check precedence levels and return method name
120
+ if (this.config.commandKey && this.config.commandKey.trim() !== '') {
121
+ return 'command-key';
122
+ }
123
+ if (this.config.commandKeyfile) {
124
+ try {
125
+ const keyFromFile = await this.readKeyFile(this.config.commandKeyfile);
126
+ if (keyFromFile) {
127
+ return 'command-keyfile';
128
+ }
129
+ }
130
+ catch {
131
+ // Ignore errors for method detection
132
+ }
133
+ }
134
+ if (this.config.cliKey && this.config.cliKey.trim() !== '') {
135
+ return 'cli-key';
136
+ }
137
+ if (this.config.cliKeyfile) {
138
+ try {
139
+ const keyFromFile = await this.readKeyFile(this.config.cliKeyfile);
140
+ if (keyFromFile) {
141
+ return 'cli-keyfile';
142
+ }
143
+ }
144
+ catch {
145
+ // Ignore errors for method detection
146
+ }
147
+ }
148
+ if (this.config.envKeyNames && this.config.envKeyNames.length > 0) {
149
+ for (const envVarName of this.config.envKeyNames) {
150
+ const envValue = process.env[envVarName];
151
+ if (envValue && envValue.trim() !== '') {
152
+ return `env-${envVarName.toLowerCase()}`;
153
+ }
154
+ }
155
+ }
156
+ if (this.config.isOAuthEnabled &&
157
+ this.config.supportsOAuth &&
158
+ this.oauthManager &&
159
+ this.config.oauthProvider) {
160
+ try {
161
+ const isAuthenticated = await this.oauthManager.isAuthenticated(this.config.oauthProvider);
162
+ if (isAuthenticated) {
163
+ return `oauth-${this.config.oauthProvider}`;
164
+ }
165
+ }
166
+ catch {
167
+ // Ignore errors for method detection
168
+ }
169
+ }
170
+ return null;
171
+ }
172
+ /**
173
+ * Reads API key from a file path, handling both absolute and relative paths
174
+ */
175
+ async readKeyFile(filePath) {
176
+ try {
177
+ // Handle relative paths from current working directory
178
+ const resolvedPath = path.isAbsolute(filePath)
179
+ ? filePath
180
+ : path.resolve(process.cwd(), filePath);
181
+ const content = await fs.readFile(resolvedPath, 'utf-8');
182
+ const key = content.trim();
183
+ if (key === '') {
184
+ if (process.env.DEBUG) {
185
+ console.warn(`Key file ${filePath} is empty`);
186
+ }
187
+ return null;
188
+ }
189
+ return key;
190
+ }
191
+ catch (error) {
192
+ if (process.env.DEBUG) {
193
+ console.warn(`Failed to read key file ${filePath}:`, error);
194
+ }
195
+ return null;
196
+ }
197
+ }
198
+ /**
199
+ * Updates the configuration
200
+ */
201
+ updateConfig(newConfig) {
202
+ this.config = { ...this.config, ...newConfig };
203
+ }
204
+ /**
205
+ * Updates the OAuth manager
206
+ */
207
+ updateOAuthManager(oauthManager) {
208
+ this.oauthManager = oauthManager;
209
+ }
210
+ }
211
+ //# sourceMappingURL=precedence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"precedence.js","sourceRoot":"","sources":["../../../src/auth/precedence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,374 @@
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 { AuthPrecedenceResolver, } from './precedence.js';
8
+ // Mock fs module
9
+ vi.mock('node:fs/promises', () => ({
10
+ readFile: vi.fn(),
11
+ }));
12
+ const mockFs = await import('node:fs/promises');
13
+ // Mock OAuth manager for testing
14
+ const mockOAuthManager = {
15
+ getToken: vi.fn(),
16
+ isAuthenticated: vi.fn(),
17
+ };
18
+ describe('AuthPrecedenceResolver', () => {
19
+ let originalEnv;
20
+ beforeEach(() => {
21
+ vi.clearAllMocks();
22
+ originalEnv = { ...process.env };
23
+ // Clear environment variables
24
+ delete process.env.TEST_API_KEY;
25
+ delete process.env.ANOTHER_API_KEY;
26
+ });
27
+ afterEach(() => {
28
+ process.env = originalEnv;
29
+ vi.restoreAllMocks();
30
+ });
31
+ describe('Authentication Precedence Chain', () => {
32
+ it('should prioritize command key over all other methods', async () => {
33
+ // Given: All auth methods available
34
+ const config = {
35
+ commandKey: 'command-key-123',
36
+ commandKeyfile: '/path/to/command/keyfile',
37
+ cliKey: 'cli-key-456',
38
+ cliKeyfile: '/path/to/cli/keyfile',
39
+ envKeyNames: ['TEST_API_KEY'],
40
+ isOAuthEnabled: true,
41
+ supportsOAuth: true,
42
+ oauthProvider: 'qwen',
43
+ };
44
+ process.env.TEST_API_KEY = 'env-key-789';
45
+ vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token-abc');
46
+ const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
47
+ // When: Resolve authentication
48
+ const result = await resolver.resolveAuthentication();
49
+ // Then: Should use command key (highest priority)
50
+ expect(result).toBe('command-key-123');
51
+ expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
52
+ });
53
+ it('should fall back to command keyfile when no command key', async () => {
54
+ // Given: Command keyfile and other methods available
55
+ const keyFileContent = 'keyfile-content-123';
56
+ vi.mocked(mockFs.readFile).mockResolvedValue(keyFileContent);
57
+ const config = {
58
+ commandKeyfile: '/path/to/command/keyfile',
59
+ cliKey: 'cli-key-456',
60
+ envKeyNames: ['TEST_API_KEY'],
61
+ isOAuthEnabled: true,
62
+ supportsOAuth: true,
63
+ oauthProvider: 'qwen',
64
+ };
65
+ process.env.TEST_API_KEY = 'env-key-789';
66
+ vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token-abc');
67
+ const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
68
+ // When: Resolve authentication
69
+ const result = await resolver.resolveAuthentication();
70
+ // Then: Should use command keyfile (second priority)
71
+ expect(result).toBe('keyfile-content-123');
72
+ expect(mockFs.readFile).toHaveBeenCalledWith('/path/to/command/keyfile', 'utf-8');
73
+ expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
74
+ });
75
+ it('should fall back to CLI key when no command methods', async () => {
76
+ // Given: CLI key and other methods available
77
+ const config = {
78
+ cliKey: 'cli-key-456',
79
+ envKeyNames: ['TEST_API_KEY'],
80
+ isOAuthEnabled: true,
81
+ supportsOAuth: true,
82
+ oauthProvider: 'qwen',
83
+ };
84
+ process.env.TEST_API_KEY = 'env-key-789';
85
+ vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token-abc');
86
+ const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
87
+ // When: Resolve authentication
88
+ const result = await resolver.resolveAuthentication();
89
+ // Then: Should use CLI key (third priority)
90
+ expect(result).toBe('cli-key-456');
91
+ expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
92
+ });
93
+ it('should fall back to CLI keyfile when no command or CLI key', async () => {
94
+ // Given: CLI keyfile and other methods available
95
+ const keyFileContent = 'cli-keyfile-content-456';
96
+ vi.mocked(mockFs.readFile).mockResolvedValue(keyFileContent);
97
+ const config = {
98
+ cliKeyfile: '/path/to/cli/keyfile',
99
+ envKeyNames: ['TEST_API_KEY'],
100
+ isOAuthEnabled: true,
101
+ supportsOAuth: true,
102
+ oauthProvider: 'qwen',
103
+ };
104
+ process.env.TEST_API_KEY = 'env-key-789';
105
+ vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token-abc');
106
+ const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
107
+ // When: Resolve authentication
108
+ const result = await resolver.resolveAuthentication();
109
+ // Then: Should use CLI keyfile (fourth priority)
110
+ expect(result).toBe('cli-keyfile-content-456');
111
+ expect(mockFs.readFile).toHaveBeenCalledWith('/path/to/cli/keyfile', 'utf-8');
112
+ expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
113
+ });
114
+ it('should fall back to environment variables when no file or explicit keys', async () => {
115
+ // Given: Environment variable and OAuth available
116
+ const config = {
117
+ envKeyNames: ['TEST_API_KEY', 'ANOTHER_API_KEY'],
118
+ isOAuthEnabled: true,
119
+ supportsOAuth: true,
120
+ oauthProvider: 'qwen',
121
+ };
122
+ process.env.TEST_API_KEY = 'env-key-789';
123
+ vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token-abc');
124
+ const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
125
+ // When: Resolve authentication
126
+ const result = await resolver.resolveAuthentication();
127
+ // Then: Should use environment variable (fifth priority)
128
+ expect(result).toBe('env-key-789');
129
+ expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
130
+ });
131
+ it('should check multiple environment variables in order', async () => {
132
+ // Given: Multiple environment variables, only second one set
133
+ const config = {
134
+ envKeyNames: ['FIRST_API_KEY', 'SECOND_API_KEY'],
135
+ isOAuthEnabled: true,
136
+ supportsOAuth: true,
137
+ oauthProvider: 'qwen',
138
+ };
139
+ // Only second env var is set
140
+ process.env.SECOND_API_KEY = 'second-env-key-789';
141
+ vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token-abc');
142
+ const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
143
+ // When: Resolve authentication
144
+ const result = await resolver.resolveAuthentication();
145
+ // Then: Should use second environment variable
146
+ expect(result).toBe('second-env-key-789');
147
+ expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
148
+ });
149
+ it('should fall back to OAuth when no other methods available', async () => {
150
+ // Given: Only OAuth available
151
+ const config = {
152
+ envKeyNames: ['TEST_API_KEY'],
153
+ isOAuthEnabled: true,
154
+ supportsOAuth: true,
155
+ oauthProvider: 'qwen',
156
+ };
157
+ // No environment variables set
158
+ vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token-abc');
159
+ const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
160
+ // When: Resolve authentication
161
+ const result = await resolver.resolveAuthentication();
162
+ // Then: Should use OAuth (lowest priority)
163
+ expect(result).toBe('oauth-token-abc');
164
+ expect(mockOAuthManager.getToken).toHaveBeenCalledWith('qwen');
165
+ });
166
+ it('should return null when no authentication methods available', async () => {
167
+ // Given: No auth methods available
168
+ const config = {
169
+ envKeyNames: ['TEST_API_KEY'],
170
+ isOAuthEnabled: false, // OAuth disabled
171
+ supportsOAuth: true,
172
+ oauthProvider: 'qwen',
173
+ };
174
+ // No environment variables set
175
+ const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
176
+ // When: Resolve authentication
177
+ const result = await resolver.resolveAuthentication();
178
+ // Then: Should return null
179
+ expect(result).toBe(null);
180
+ expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
181
+ });
182
+ });
183
+ describe('OAuth Enablement Checks', () => {
184
+ it('should not use OAuth when disabled', async () => {
185
+ // Given: OAuth disabled but OAuth manager available
186
+ const config = {
187
+ envKeyNames: ['TEST_API_KEY'],
188
+ isOAuthEnabled: false,
189
+ supportsOAuth: true,
190
+ oauthProvider: 'qwen',
191
+ };
192
+ vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token-abc');
193
+ const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
194
+ // When: Resolve authentication
195
+ const result = await resolver.resolveAuthentication();
196
+ // Then: Should not use OAuth
197
+ expect(result).toBe(null);
198
+ expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
199
+ });
200
+ it('should not use OAuth when not supported', async () => {
201
+ // Given: OAuth enabled but not supported
202
+ const config = {
203
+ envKeyNames: ['TEST_API_KEY'],
204
+ isOAuthEnabled: true,
205
+ supportsOAuth: false, // Not supported
206
+ oauthProvider: 'qwen',
207
+ };
208
+ vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token-abc');
209
+ const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
210
+ // When: Resolve authentication
211
+ const result = await resolver.resolveAuthentication();
212
+ // Then: Should not use OAuth
213
+ expect(result).toBe(null);
214
+ expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
215
+ });
216
+ it('should not use OAuth when no OAuth manager', async () => {
217
+ // Given: OAuth enabled and supported but no manager
218
+ const config = {
219
+ envKeyNames: ['TEST_API_KEY'],
220
+ isOAuthEnabled: true,
221
+ supportsOAuth: true,
222
+ oauthProvider: 'qwen',
223
+ };
224
+ const resolver = new AuthPrecedenceResolver(config, undefined); // No OAuth manager
225
+ // When: Resolve authentication
226
+ const result = await resolver.resolveAuthentication();
227
+ // Then: Should not use OAuth
228
+ expect(result).toBe(null);
229
+ });
230
+ it('should not use OAuth when no provider specified', async () => {
231
+ // Given: OAuth enabled and supported but no provider
232
+ const config = {
233
+ envKeyNames: ['TEST_API_KEY'],
234
+ isOAuthEnabled: true,
235
+ supportsOAuth: true,
236
+ oauthProvider: undefined, // No provider
237
+ };
238
+ const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
239
+ // When: Resolve authentication
240
+ const result = await resolver.resolveAuthentication();
241
+ // Then: Should not use OAuth
242
+ expect(result).toBe(null);
243
+ expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
244
+ });
245
+ });
246
+ describe('Utility Methods', () => {
247
+ it('should correctly identify when non-OAuth auth is available', async () => {
248
+ // Given: API key available
249
+ const config = {
250
+ cliKey: 'cli-key-456',
251
+ envKeyNames: ['TEST_API_KEY'],
252
+ isOAuthEnabled: true,
253
+ supportsOAuth: true,
254
+ oauthProvider: 'qwen',
255
+ };
256
+ const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
257
+ // When: Check for non-OAuth auth
258
+ const hasNonOAuth = await resolver.hasNonOAuthAuthentication();
259
+ // Then: Should return true
260
+ expect(hasNonOAuth).toBe(true);
261
+ });
262
+ it('should correctly identify when only OAuth is available', async () => {
263
+ // Given: Only OAuth available
264
+ const config = {
265
+ envKeyNames: ['TEST_API_KEY'],
266
+ isOAuthEnabled: true,
267
+ supportsOAuth: true,
268
+ oauthProvider: 'qwen',
269
+ };
270
+ const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
271
+ // When: Check if OAuth only
272
+ const isOAuthOnly = await resolver.isOAuthOnlyAvailable();
273
+ // Then: Should return true
274
+ expect(isOAuthOnly).toBe(true);
275
+ });
276
+ it('should get correct auth method name for CLI key', async () => {
277
+ // Given: CLI key configured
278
+ const config = {
279
+ cliKey: 'cli-key-456',
280
+ envKeyNames: ['TEST_API_KEY'],
281
+ };
282
+ const resolver = new AuthPrecedenceResolver(config);
283
+ // When: Get auth method name
284
+ const methodName = await resolver.getAuthMethodName();
285
+ // Then: Should return cli-key
286
+ expect(methodName).toBe('cli-key');
287
+ });
288
+ it('should get correct auth method name for environment variable', async () => {
289
+ // Given: Environment variable configured
290
+ const config = {
291
+ envKeyNames: ['TEST_API_KEY'],
292
+ };
293
+ process.env.TEST_API_KEY = 'env-key-789';
294
+ const resolver = new AuthPrecedenceResolver(config);
295
+ // When: Get auth method name
296
+ const methodName = await resolver.getAuthMethodName();
297
+ // Then: Should return env-test_api_key
298
+ expect(methodName).toBe('env-test_api_key');
299
+ });
300
+ });
301
+ describe('File Handling', () => {
302
+ it('should handle keyfile read errors gracefully', async () => {
303
+ // Given: Keyfile that cannot be read
304
+ vi.mocked(mockFs.readFile).mockRejectedValue(new Error('File not found'));
305
+ const config = {
306
+ commandKeyfile: '/nonexistent/keyfile',
307
+ cliKey: 'cli-key-456',
308
+ };
309
+ const resolver = new AuthPrecedenceResolver(config);
310
+ // When: Resolve authentication
311
+ const result = await resolver.resolveAuthentication();
312
+ // Then: Should fall back to CLI key
313
+ expect(result).toBe('cli-key-456');
314
+ });
315
+ it('should handle empty keyfile gracefully', async () => {
316
+ // Given: Empty keyfile
317
+ vi.mocked(mockFs.readFile).mockResolvedValue(' \n \t '); // Whitespace only
318
+ const config = {
319
+ commandKeyfile: '/path/to/empty/keyfile',
320
+ cliKey: 'cli-key-456',
321
+ };
322
+ const resolver = new AuthPrecedenceResolver(config);
323
+ // When: Resolve authentication
324
+ const result = await resolver.resolveAuthentication();
325
+ // Then: Should fall back to CLI key
326
+ expect(result).toBe('cli-key-456');
327
+ });
328
+ it('should handle keyfile with valid content', async () => {
329
+ // Given: Keyfile with valid content
330
+ vi.mocked(mockFs.readFile).mockResolvedValue(' valid-key-content \n');
331
+ const config = {
332
+ commandKeyfile: '/path/to/valid/keyfile',
333
+ cliKey: 'cli-key-456',
334
+ };
335
+ const resolver = new AuthPrecedenceResolver(config);
336
+ // When: Resolve authentication
337
+ const result = await resolver.resolveAuthentication();
338
+ // Then: Should use keyfile content (trimmed)
339
+ expect(result).toBe('valid-key-content');
340
+ });
341
+ });
342
+ describe('Configuration Updates', () => {
343
+ it('should update configuration correctly', async () => {
344
+ // Given: Initial configuration
345
+ const config = {
346
+ cliKey: 'old-key',
347
+ envKeyNames: ['TEST_API_KEY'],
348
+ };
349
+ const resolver = new AuthPrecedenceResolver(config);
350
+ // When: Update configuration
351
+ resolver.updateConfig({ cliKey: 'new-key' });
352
+ // Then: Should use updated configuration
353
+ const result = await resolver.resolveAuthentication();
354
+ expect(result).toBe('new-key');
355
+ });
356
+ it('should update OAuth manager correctly', async () => {
357
+ // Given: Initial resolver without OAuth manager
358
+ const config = {
359
+ isOAuthEnabled: true,
360
+ supportsOAuth: true,
361
+ oauthProvider: 'qwen',
362
+ };
363
+ const resolver = new AuthPrecedenceResolver(config);
364
+ // When: Update OAuth manager
365
+ resolver.updateOAuthManager(mockOAuthManager);
366
+ vi.mocked(mockOAuthManager.getToken).mockResolvedValue('new-oauth-token');
367
+ // Then: Should use updated OAuth manager
368
+ const result = await resolver.resolveAuthentication();
369
+ expect(result).toBe('new-oauth-token');
370
+ expect(mockOAuthManager.getToken).toHaveBeenCalledWith('qwen');
371
+ });
372
+ });
373
+ });
374
+ //# sourceMappingURL=precedence.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"precedence.test.js","sourceRoot":"","sources":["../../../src/auth/precedence.test.ts"],"names":[],"mappings":"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"}