@vybestack/llxprt-code 0.4.7 → 0.5.0-nightly.251102.f115237d

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 (301) hide show
  1. package/dist/package.json +7 -5
  2. package/dist/src/auth/__tests__/oauthManager.safety.test.d.ts +6 -0
  3. package/dist/src/auth/__tests__/oauthManager.safety.test.js +49 -0
  4. package/dist/src/auth/__tests__/oauthManager.safety.test.js.map +1 -0
  5. package/dist/src/auth/oauth-manager.d.ts +16 -0
  6. package/dist/src/auth/oauth-manager.js +81 -29
  7. package/dist/src/auth/oauth-manager.js.map +1 -1
  8. package/dist/src/auth/oauth-manager.spec.js +7 -2
  9. package/dist/src/auth/oauth-manager.spec.js.map +1 -1
  10. package/dist/src/commands/extensions.js +1 -1
  11. package/dist/src/commands/extensions.js.map +1 -1
  12. package/dist/src/config/__tests__/nonInteractiveTools.test.d.ts +6 -0
  13. package/dist/src/config/__tests__/nonInteractiveTools.test.js +13 -0
  14. package/dist/src/config/__tests__/nonInteractiveTools.test.js.map +1 -0
  15. package/dist/src/config/__tests__/profileBootstrap.test.d.ts +6 -0
  16. package/dist/src/config/__tests__/profileBootstrap.test.js +91 -0
  17. package/dist/src/config/__tests__/profileBootstrap.test.js.map +1 -0
  18. package/dist/src/config/config.d.ts +7 -2
  19. package/dist/src/config/config.js +225 -10
  20. package/dist/src/config/config.js.map +1 -1
  21. package/dist/src/config/config.loadMemory.test.js +1 -0
  22. package/dist/src/config/config.loadMemory.test.js.map +1 -1
  23. package/dist/src/config/profileBootstrap.d.ts +64 -0
  24. package/dist/src/config/profileBootstrap.js +140 -0
  25. package/dist/src/config/profileBootstrap.js.map +1 -0
  26. package/dist/src/config/settings.env.test.d.ts +6 -0
  27. package/dist/src/config/settings.env.test.js +38 -0
  28. package/dist/src/config/settings.env.test.js.map +1 -0
  29. package/dist/src/config/settings.js +2 -2
  30. package/dist/src/config/settings.js.map +1 -1
  31. package/dist/src/gemini.js +70 -25
  32. package/dist/src/gemini.js.map +1 -1
  33. package/dist/src/gemini.test.js +1 -2
  34. package/dist/src/gemini.test.js.map +1 -1
  35. package/dist/src/generated/git-commit.d.ts +1 -1
  36. package/dist/src/generated/git-commit.js +1 -1
  37. package/dist/src/integration-tests/base-url-behavior.integration.test.js +110 -450
  38. package/dist/src/integration-tests/base-url-behavior.integration.test.js.map +1 -1
  39. package/dist/src/integration-tests/model-params-isolation.integration.test.js +101 -539
  40. package/dist/src/integration-tests/model-params-isolation.integration.test.js.map +1 -1
  41. package/dist/src/integration-tests/modelParams.integration.test.js +86 -761
  42. package/dist/src/integration-tests/modelParams.integration.test.js.map +1 -1
  43. package/dist/src/integration-tests/provider-multi-runtime.integration.test.d.ts +6 -0
  44. package/dist/src/integration-tests/provider-multi-runtime.integration.test.js +198 -0
  45. package/dist/src/integration-tests/provider-multi-runtime.integration.test.js.map +1 -0
  46. package/dist/src/integration-tests/provider-switching.integration.test.js +97 -151
  47. package/dist/src/integration-tests/provider-switching.integration.test.js.map +1 -1
  48. package/dist/src/integration-tests/runtime-isolation.test.d.ts +13 -0
  49. package/dist/src/integration-tests/runtime-isolation.test.js +170 -0
  50. package/dist/src/integration-tests/runtime-isolation.test.js.map +1 -0
  51. package/dist/src/integration-tests/test-utils.js +19 -2
  52. package/dist/src/integration-tests/test-utils.js.map +1 -1
  53. package/dist/src/integration-tests/test-utils.test.js +9 -8
  54. package/dist/src/integration-tests/test-utils.test.js.map +1 -1
  55. package/dist/src/integration-tests/todo-continuation.integration.test.js +5 -2
  56. package/dist/src/integration-tests/todo-continuation.integration.test.js.map +1 -1
  57. package/dist/src/integration-tests/tools-governance.integration.test.d.ts +6 -0
  58. package/dist/src/integration-tests/tools-governance.integration.test.js +98 -0
  59. package/dist/src/integration-tests/tools-governance.integration.test.js.map +1 -0
  60. package/dist/src/nonInteractiveCli.js +36 -11
  61. package/dist/src/nonInteractiveCli.js.map +1 -1
  62. package/dist/src/providers/logging/git-stats.test.js +11 -1
  63. package/dist/src/providers/logging/git-stats.test.js.map +1 -1
  64. package/dist/src/providers/logging/multi-provider-logging.integration.test.js +1 -2
  65. package/dist/src/providers/logging/multi-provider-logging.integration.test.js.map +1 -1
  66. package/dist/src/providers/logging/performance.test.js +1 -1
  67. package/dist/src/providers/logging/performance.test.js.map +1 -1
  68. package/dist/src/providers/oauth-provider-registration.d.ts +2 -2
  69. package/dist/src/providers/oauth-provider-registration.js +25 -9
  70. package/dist/src/providers/oauth-provider-registration.js.map +1 -1
  71. package/dist/src/providers/provider-gemini-switching.test.js +67 -89
  72. package/dist/src/providers/provider-gemini-switching.test.js.map +1 -1
  73. package/dist/src/providers/provider-switching.integration.test.js +42 -98
  74. package/dist/src/providers/provider-switching.integration.test.js.map +1 -1
  75. package/dist/src/providers/providerConfigUtils.d.ts +12 -7
  76. package/dist/src/providers/providerConfigUtils.js +31 -99
  77. package/dist/src/providers/providerConfigUtils.js.map +1 -1
  78. package/dist/src/providers/providerManagerInstance.d.ts +17 -1
  79. package/dist/src/providers/providerManagerInstance.js +157 -175
  80. package/dist/src/providers/providerManagerInstance.js.map +1 -1
  81. package/dist/src/providers/providerManagerInstance.oauthRegistration.test.js +19 -15
  82. package/dist/src/providers/providerManagerInstance.oauthRegistration.test.js.map +1 -1
  83. package/dist/src/providers/providerManagerInstance.test.js +2 -5
  84. package/dist/src/providers/providerManagerInstance.test.js.map +1 -1
  85. package/dist/src/runtime/__tests__/profileApplication.test.d.ts +5 -0
  86. package/dist/src/runtime/__tests__/profileApplication.test.js +232 -0
  87. package/dist/src/runtime/__tests__/profileApplication.test.js.map +1 -0
  88. package/dist/src/runtime/__tests__/runtimeIsolation.test.d.ts +5 -0
  89. package/dist/src/runtime/__tests__/runtimeIsolation.test.js +376 -0
  90. package/dist/src/runtime/__tests__/runtimeIsolation.test.js.map +1 -0
  91. package/dist/src/runtime/agentRuntimeAdapter.d.ts +249 -0
  92. package/dist/src/runtime/agentRuntimeAdapter.js +506 -0
  93. package/dist/src/runtime/agentRuntimeAdapter.js.map +1 -0
  94. package/dist/src/runtime/agentRuntimeAdapter.spec.d.ts +6 -0
  95. package/dist/src/runtime/agentRuntimeAdapter.spec.js +866 -0
  96. package/dist/src/runtime/agentRuntimeAdapter.spec.js.map +1 -0
  97. package/dist/src/runtime/messages.d.ts +28 -0
  98. package/dist/src/runtime/messages.js +64 -0
  99. package/dist/src/runtime/messages.js.map +1 -0
  100. package/dist/src/runtime/profileApplication.d.ts +33 -0
  101. package/dist/src/runtime/profileApplication.js +191 -0
  102. package/dist/src/runtime/profileApplication.js.map +1 -0
  103. package/dist/src/runtime/providerConfigUtils.test.d.ts +1 -0
  104. package/dist/src/runtime/providerConfigUtils.test.js +68 -0
  105. package/dist/src/runtime/providerConfigUtils.test.js.map +1 -0
  106. package/dist/src/runtime/runtimeContextFactory.d.ts +102 -0
  107. package/dist/src/runtime/runtimeContextFactory.js +190 -0
  108. package/dist/src/runtime/runtimeContextFactory.js.map +1 -0
  109. package/dist/src/runtime/runtimeSettings.d.ts +217 -0
  110. package/dist/src/runtime/runtimeSettings.js +1094 -0
  111. package/dist/src/runtime/runtimeSettings.js.map +1 -0
  112. package/dist/src/runtime/runtimeSettings.test.d.ts +1 -0
  113. package/dist/src/runtime/runtimeSettings.test.js +320 -0
  114. package/dist/src/runtime/runtimeSettings.test.js.map +1 -0
  115. package/dist/src/services/BuiltinCommandLoader.d.ts +13 -4
  116. package/dist/src/services/BuiltinCommandLoader.js +17 -4
  117. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  118. package/dist/src/services/McpPromptLoader.js +34 -13
  119. package/dist/src/services/McpPromptLoader.js.map +1 -1
  120. package/dist/src/settings/ephemeralSettings.js +3 -2
  121. package/dist/src/settings/ephemeralSettings.js.map +1 -1
  122. package/dist/src/test-utils/mockCommandContext.js +5 -2
  123. package/dist/src/test-utils/mockCommandContext.js.map +1 -1
  124. package/dist/src/ui/App.js +29 -49
  125. package/dist/src/ui/App.js.map +1 -1
  126. package/dist/src/ui/commands/aboutCommand.js +29 -0
  127. package/dist/src/ui/commands/aboutCommand.js.map +1 -1
  128. package/dist/src/ui/commands/authCommand.js +15 -12
  129. package/dist/src/ui/commands/authCommand.js.map +1 -1
  130. package/dist/src/ui/commands/baseurlCommand.js +8 -44
  131. package/dist/src/ui/commands/baseurlCommand.js.map +1 -1
  132. package/dist/src/ui/commands/chatCommand.js +28 -12
  133. package/dist/src/ui/commands/chatCommand.js.map +1 -1
  134. package/dist/src/ui/commands/diagnosticsCommand.d.ts +0 -3
  135. package/dist/src/ui/commands/diagnosticsCommand.js +40 -191
  136. package/dist/src/ui/commands/diagnosticsCommand.js.map +1 -1
  137. package/dist/src/ui/commands/docsCommand.js +1 -1
  138. package/dist/src/ui/commands/docsCommand.js.map +1 -1
  139. package/dist/src/ui/commands/keyCommand.js +9 -58
  140. package/dist/src/ui/commands/keyCommand.js.map +1 -1
  141. package/dist/src/ui/commands/keyCommand.test.js +48 -102
  142. package/dist/src/ui/commands/keyCommand.test.js.map +1 -1
  143. package/dist/src/ui/commands/keyfileCommand.js +42 -93
  144. package/dist/src/ui/commands/keyfileCommand.js.map +1 -1
  145. package/dist/src/ui/commands/logoutCommand.js +2 -2
  146. package/dist/src/ui/commands/logoutCommand.js.map +1 -1
  147. package/dist/src/ui/commands/mcpCommand.js +29 -7
  148. package/dist/src/ui/commands/mcpCommand.js.map +1 -1
  149. package/dist/src/ui/commands/modelCommand.js +8 -59
  150. package/dist/src/ui/commands/modelCommand.js.map +1 -1
  151. package/dist/src/ui/commands/profileCommand.js +151 -267
  152. package/dist/src/ui/commands/profileCommand.js.map +1 -1
  153. package/dist/src/ui/commands/profileCommand.test.js +88 -344
  154. package/dist/src/ui/commands/profileCommand.test.js.map +1 -1
  155. package/dist/src/ui/commands/providerCommand.js +9 -3
  156. package/dist/src/ui/commands/providerCommand.js.map +1 -1
  157. package/dist/src/ui/commands/restoreCommand.js +38 -18
  158. package/dist/src/ui/commands/restoreCommand.js.map +1 -1
  159. package/dist/src/ui/commands/schema/argumentResolver.test.d.ts +6 -0
  160. package/dist/src/ui/commands/schema/argumentResolver.test.js +619 -0
  161. package/dist/src/ui/commands/schema/argumentResolver.test.js.map +1 -0
  162. package/dist/src/ui/commands/schema/index.d.ts +15 -0
  163. package/dist/src/ui/commands/schema/index.js +320 -0
  164. package/dist/src/ui/commands/schema/index.js.map +1 -0
  165. package/dist/src/ui/commands/schema/types.d.ts +61 -0
  166. package/dist/src/ui/commands/schema/types.js +12 -0
  167. package/dist/src/ui/commands/schema/types.js.map +1 -0
  168. package/dist/src/ui/commands/setCommand.js +641 -325
  169. package/dist/src/ui/commands/setCommand.js.map +1 -1
  170. package/dist/src/ui/commands/setCommand.test.js +92 -388
  171. package/dist/src/ui/commands/setCommand.test.js.map +1 -1
  172. package/dist/src/ui/commands/statusCommand.js +2 -2
  173. package/dist/src/ui/commands/statusCommand.js.map +1 -1
  174. package/dist/src/ui/commands/subagentCommand.d.ts +16 -0
  175. package/dist/src/ui/commands/subagentCommand.js +656 -0
  176. package/dist/src/ui/commands/subagentCommand.js.map +1 -0
  177. package/dist/src/ui/commands/test/setCommand.mutation.test.d.ts +6 -0
  178. package/dist/src/ui/commands/test/setCommand.mutation.test.js +132 -0
  179. package/dist/src/ui/commands/test/setCommand.mutation.test.js.map +1 -0
  180. package/dist/src/ui/commands/test/setCommand.phase09.test.d.ts +6 -0
  181. package/dist/src/ui/commands/test/setCommand.phase09.test.js +222 -0
  182. package/dist/src/ui/commands/test/setCommand.phase09.test.js.map +1 -0
  183. package/dist/src/ui/commands/test/subagentCommand.schema.test.d.ts +6 -0
  184. package/dist/src/ui/commands/test/subagentCommand.schema.test.js +125 -0
  185. package/dist/src/ui/commands/test/subagentCommand.schema.test.js.map +1 -0
  186. package/dist/src/ui/commands/test/subagentCommand.test.d.ts +1 -0
  187. package/dist/src/ui/commands/test/subagentCommand.test.js +589 -0
  188. package/dist/src/ui/commands/test/subagentCommand.test.js.map +1 -0
  189. package/dist/src/ui/commands/toolformatCommand.js +25 -98
  190. package/dist/src/ui/commands/toolformatCommand.js.map +1 -1
  191. package/dist/src/ui/commands/toolformatCommand.test.js +56 -102
  192. package/dist/src/ui/commands/toolformatCommand.test.js.map +1 -1
  193. package/dist/src/ui/commands/toolsCommand.js +187 -31
  194. package/dist/src/ui/commands/toolsCommand.js.map +1 -1
  195. package/dist/src/ui/commands/types.d.ts +11 -2
  196. package/dist/src/ui/commands/types.js.map +1 -1
  197. package/dist/src/ui/components/AboutBox.d.ts +4 -0
  198. package/dist/src/ui/components/AboutBox.js +1 -1
  199. package/dist/src/ui/components/AboutBox.js.map +1 -1
  200. package/dist/src/ui/components/AuthDialog.js +4 -3
  201. package/dist/src/ui/components/AuthDialog.js.map +1 -1
  202. package/dist/src/ui/components/AuthDialog.test.js +67 -1
  203. package/dist/src/ui/components/AuthDialog.test.js.map +1 -1
  204. package/dist/src/ui/components/Footer.js +4 -5
  205. package/dist/src/ui/components/Footer.js.map +1 -1
  206. package/dist/src/ui/components/HistoryItemDisplay.js +1 -1
  207. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  208. package/dist/src/ui/components/HistoryItemDisplay.test.js +2 -0
  209. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -1
  210. package/dist/src/ui/components/InputPrompt.js +18 -6
  211. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  212. package/dist/src/ui/components/SettingsDialog.js +1 -1
  213. package/dist/src/ui/components/SettingsDialog.js.map +1 -1
  214. package/dist/src/ui/components/StatsDisplay.js +6 -11
  215. package/dist/src/ui/components/StatsDisplay.js.map +1 -1
  216. package/dist/src/ui/components/SuggestionsDisplay.d.ts +13 -1
  217. package/dist/src/ui/components/SuggestionsDisplay.js +22 -3
  218. package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -1
  219. package/dist/src/ui/components/WorkspaceMigrationDialog.js +1 -1
  220. package/dist/src/ui/components/WorkspaceMigrationDialog.js.map +1 -1
  221. package/dist/src/ui/components/messages/ToolGroupMessage.d.ts +1 -0
  222. package/dist/src/ui/components/messages/ToolGroupMessage.js +14 -14
  223. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
  224. package/dist/src/ui/components/messages/ToolGroupMessage.test.js +1 -0
  225. package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -1
  226. package/dist/src/ui/components/shared/text-buffer.js +4 -1
  227. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  228. package/dist/src/ui/containers/SessionController.js +61 -117
  229. package/dist/src/ui/containers/SessionController.js.map +1 -1
  230. package/dist/src/ui/contexts/RuntimeContext.d.ts +61 -0
  231. package/dist/src/ui/contexts/RuntimeContext.js +118 -0
  232. package/dist/src/ui/contexts/RuntimeContext.js.map +1 -0
  233. package/dist/src/ui/contexts/TodoProvider.d.ts +1 -0
  234. package/dist/src/ui/contexts/TodoProvider.js +10 -8
  235. package/dist/src/ui/contexts/TodoProvider.js.map +1 -1
  236. package/dist/src/ui/contexts/ToolCallProvider.d.ts +1 -0
  237. package/dist/src/ui/contexts/ToolCallProvider.js +10 -9
  238. package/dist/src/ui/contexts/ToolCallProvider.js.map +1 -1
  239. package/dist/src/ui/hooks/__tests__/useSlashCompletion.set.phase09.test.d.ts +6 -0
  240. package/dist/src/ui/hooks/__tests__/useSlashCompletion.set.phase09.test.js +39 -0
  241. package/dist/src/ui/hooks/__tests__/useSlashCompletion.set.phase09.test.js.map +1 -0
  242. package/dist/src/ui/hooks/atCommandProcessor.js +11 -3
  243. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  244. package/dist/src/ui/hooks/atCommandProcessor.test.js +3 -1
  245. package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -1
  246. package/dist/src/ui/hooks/shellCommandProcessor.js +4 -1
  247. package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
  248. package/dist/src/ui/hooks/shellCommandProcessor.test.js +1 -0
  249. package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +1 -1
  250. package/dist/src/ui/hooks/slashCommandProcessor.js +29 -1
  251. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  252. package/dist/src/ui/hooks/useAuthCommand.js +11 -3
  253. package/dist/src/ui/hooks/useAuthCommand.js.map +1 -1
  254. package/dist/src/ui/hooks/useCommandCompletion.d.ts +1 -0
  255. package/dist/src/ui/hooks/useCommandCompletion.js +2 -0
  256. package/dist/src/ui/hooks/useCommandCompletion.js.map +1 -1
  257. package/dist/src/ui/hooks/useGeminiStream.js +37 -11
  258. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  259. package/dist/src/ui/hooks/useGeminiStream.subagent.spec.d.ts +6 -0
  260. package/dist/src/ui/hooks/useGeminiStream.subagent.spec.js +232 -0
  261. package/dist/src/ui/hooks/useGeminiStream.subagent.spec.js.map +1 -0
  262. package/dist/src/ui/hooks/useLoadProfileDialog.d.ts +1 -1
  263. package/dist/src/ui/hooks/useLoadProfileDialog.js +18 -57
  264. package/dist/src/ui/hooks/useLoadProfileDialog.js.map +1 -1
  265. package/dist/src/ui/hooks/useOpenAIProviderInfo.d.ts +1 -1
  266. package/dist/src/ui/hooks/useOpenAIProviderInfo.js +12 -7
  267. package/dist/src/ui/hooks/useOpenAIProviderInfo.js.map +1 -1
  268. package/dist/src/ui/hooks/useProviderDialog.d.ts +1 -1
  269. package/dist/src/ui/hooks/useProviderDialog.js +17 -90
  270. package/dist/src/ui/hooks/useProviderDialog.js.map +1 -1
  271. package/dist/src/ui/hooks/useProviderModelDialog.d.ts +2 -2
  272. package/dist/src/ui/hooks/useProviderModelDialog.js +11 -12
  273. package/dist/src/ui/hooks/useProviderModelDialog.js.map +1 -1
  274. package/dist/src/ui/hooks/useReactToolScheduler.d.ts +3 -1
  275. package/dist/src/ui/hooks/useReactToolScheduler.js +144 -34
  276. package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
  277. package/dist/src/ui/hooks/useSlashCompletion.d.ts +32 -0
  278. package/dist/src/ui/hooks/useSlashCompletion.js +154 -77
  279. package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -1
  280. package/dist/src/ui/hooks/useSlashCompletion.test.js +39 -14
  281. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
  282. package/dist/src/ui/hooks/useToolScheduler.test.js +108 -79
  283. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  284. package/dist/src/ui/privacy/CloudFreePrivacyNotice.js +1 -1
  285. package/dist/src/ui/privacy/CloudFreePrivacyNotice.js.map +1 -1
  286. package/dist/src/ui/types.d.ts +5 -0
  287. package/dist/src/ui/types.js.map +1 -1
  288. package/dist/src/ui/utils/MarkdownDisplay.test.js +16 -0
  289. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -1
  290. package/dist/src/ui/utils/TableRenderer.js +213 -40
  291. package/dist/src/ui/utils/TableRenderer.js.map +1 -1
  292. package/dist/src/utils/sandbox.js +1 -1
  293. package/dist/src/utils/sandbox.js.map +1 -1
  294. package/dist/src/validateNonInterActiveAuth.js +4 -2
  295. package/dist/src/validateNonInterActiveAuth.js.map +1 -1
  296. package/dist/src/zed-integration/schema.d.ts +30 -30
  297. package/dist/src/zed-integration/zedIntegration.js +112 -39
  298. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  299. package/dist/tsconfig.build.tsbuildinfo +1 -0
  300. package/package.json +7 -5
  301. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -4,67 +4,17 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { CommandKind, } from './types.js';
7
- import { AuthType } from '@vybestack/llxprt-code-core';
7
+ import { getRuntimeApi } from '../contexts/RuntimeContext.js';
8
8
  export const keyCommand = {
9
9
  name: 'key',
10
10
  description: 'set or remove API key for the current provider',
11
11
  kind: CommandKind.BUILT_IN,
12
12
  action: async (context, args) => {
13
- const config = context.services.config;
14
- if (!config) {
15
- return {
16
- type: 'message',
17
- messageType: 'error',
18
- content: 'No configuration available',
19
- };
20
- }
21
- // Settings service not needed for command-level auth
22
- const providerManager = config.getProviderManager();
23
- if (!providerManager) {
24
- return {
25
- type: 'message',
26
- messageType: 'error',
27
- content: 'No provider manager available',
28
- };
29
- }
30
- const activeProvider = providerManager.getActiveProvider();
31
- const providerName = activeProvider.name;
32
13
  const apiKey = args?.trim();
33
- // If no key provided or 'none', remove the key
34
- if (!apiKey || apiKey.toLowerCase() === 'none') {
35
- // Clear authentication using the provider's method (which now stores in SettingsService)
36
- if (activeProvider.setApiKey) {
37
- activeProvider.setApiKey('');
38
- }
39
- // If this is the Gemini provider, we might need to switch auth mode
40
- const requiresAuthRefresh = providerName === 'gemini';
41
- if (requiresAuthRefresh) {
42
- await config.refreshAuth(AuthType.LOGIN_WITH_GOOGLE);
43
- }
44
- const isPaidMode = activeProvider.isPaidMode?.() ?? true;
45
- const paymentMessage = !isPaidMode && providerName === 'gemini'
46
- ? '\n✅ You are now in FREE MODE - using OAuth authentication'
47
- : '';
48
- return {
49
- type: 'message',
50
- messageType: 'info',
51
- content: `API key removed for provider '${providerName}'${paymentMessage}`,
52
- };
53
- }
54
- // Set the API key using the provider's method (which now stores in SettingsService)
55
- if (activeProvider.setApiKey) {
56
- activeProvider.setApiKey(apiKey);
57
- // If this is the Gemini provider, we need to refresh auth to use API key mode
58
- const requiresAuthRefresh = providerName === 'gemini';
59
- if (requiresAuthRefresh) {
60
- await config.refreshAuth(AuthType.USE_GEMINI);
61
- }
62
- // Check if we're now in paid mode
63
- const isPaidMode = activeProvider.isPaidMode?.() ?? true;
64
- const paymentWarning = isPaidMode
65
- ? '\nWARNING: You are now in PAID MODE - API usage will be charged to your account'
66
- : '';
67
- // Trigger payment mode check if available
14
+ const runtime = getRuntimeApi();
15
+ try {
16
+ const targetKey = !apiKey || apiKey.toLowerCase() === 'none' ? null : apiKey;
17
+ const result = await runtime.updateActiveProviderApiKey(targetKey);
68
18
  const extendedContext = context;
69
19
  if (extendedContext.checkPaymentModeChange) {
70
20
  setTimeout(extendedContext.checkPaymentModeChange, 100);
@@ -72,14 +22,15 @@ export const keyCommand = {
72
22
  return {
73
23
  type: 'message',
74
24
  messageType: 'info',
75
- content: `API key updated for provider '${providerName}'${paymentWarning}`,
25
+ content: result.message,
76
26
  };
77
27
  }
78
- else {
28
+ catch (error) {
29
+ const status = runtime.getActiveProviderStatus();
79
30
  return {
80
31
  type: 'message',
81
32
  messageType: 'error',
82
- content: `Provider '${providerName}' does not support API key updates`,
33
+ content: `Failed to update API key for provider '${status.providerName ?? 'unknown'}': ${error instanceof Error ? error.message : String(error)}`,
83
34
  };
84
35
  }
85
36
  },
@@ -1 +1 @@
1
- {"version":3,"file":"keyCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/keyCommand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAIL,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,MAAM,CAAC,MAAM,UAAU,GAAiB;IACtC,IAAI,EAAE,KAAK;IACX,WAAW,EAAE,gDAAgD;IAC7D,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,MAAM,EAAE,KAAK,EACX,OAAuB,EACvB,IAAY,EACkB,EAAE;QAChC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;QACvC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,OAAO;gBACpB,OAAO,EAAE,4BAA4B;aACtC,CAAC;QACJ,CAAC;QAED,qDAAqD;QAErD,MAAM,eAAe,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC;QACpD,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,OAAO;gBACpB,OAAO,EAAE,+BAA+B;aACzC,CAAC;QACJ,CAAC;QAED,MAAM,cAAc,GAAG,eAAe,CAAC,iBAAiB,EAAE,CAAC;QAC3D,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC;QAE5B,+CAA+C;QAC/C,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;YAC/C,yFAAyF;YACzF,IAAI,cAAc,CAAC,SAAS,EAAE,CAAC;gBAC7B,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAC/B,CAAC;YAED,oEAAoE;YACpE,MAAM,mBAAmB,GAAG,YAAY,KAAK,QAAQ,CAAC;YACtD,IAAI,mBAAmB,EAAE,CAAC;gBACxB,MAAM,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YACvD,CAAC;YAED,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,EAAE,EAAE,IAAI,IAAI,CAAC;YACzD,MAAM,cAAc,GAClB,CAAC,UAAU,IAAI,YAAY,KAAK,QAAQ;gBACtC,CAAC,CAAC,2DAA2D;gBAC7D,CAAC,CAAC,EAAE,CAAC;YAET,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,MAAM;gBACnB,OAAO,EAAE,iCAAiC,YAAY,IAAI,cAAc,EAAE;aAC3E,CAAC;QACJ,CAAC;QAED,oFAAoF;QACpF,IAAI,cAAc,CAAC,SAAS,EAAE,CAAC;YAC7B,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAEjC,8EAA8E;YAC9E,MAAM,mBAAmB,GAAG,YAAY,KAAK,QAAQ,CAAC;YACtD,IAAI,mBAAmB,EAAE,CAAC;gBACxB,MAAM,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAChD,CAAC;YAED,kCAAkC;YAClC,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,EAAE,EAAE,IAAI,IAAI,CAAC;YACzD,MAAM,cAAc,GAAG,UAAU;gBAC/B,CAAC,CAAC,iFAAiF;gBACnF,CAAC,CAAC,EAAE,CAAC;YAEP,0CAA0C;YAC1C,MAAM,eAAe,GAAG,OAEvB,CAAC;YACF,IAAI,eAAe,CAAC,sBAAsB,EAAE,CAAC;gBAC3C,UAAU,CAAC,eAAe,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;YAC1D,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,MAAM;gBACnB,OAAO,EAAE,iCAAiC,YAAY,IAAI,cAAc,EAAE;aAC3E,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,OAAO;gBACpB,OAAO,EAAE,aAAa,YAAY,oCAAoC;aACvE,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"keyCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/keyCommand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAIL,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE9D,MAAM,CAAC,MAAM,UAAU,GAAiB;IACtC,IAAI,EAAE,KAAK;IACX,WAAW,EAAE,gDAAgD;IAC7D,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,MAAM,EAAE,KAAK,EACX,OAAuB,EACvB,IAAY,EACkB,EAAE;QAChC,MAAM,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,SAAS,GACb,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;YAC7D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,0BAA0B,CAAC,SAAS,CAAC,CAAC;YAEnE,MAAM,eAAe,GAAG,OAEvB,CAAC;YACF,IAAI,eAAe,CAAC,sBAAsB,EAAE,CAAC;gBAC3C,UAAU,CAAC,eAAe,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;YAC1D,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,MAAM;gBACnB,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC;YACjD,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,OAAO;gBACpB,OAAO,EAAE,0CAA0C,MAAM,CAAC,YAAY,IAAI,SAAS,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;aAClJ,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -3,125 +3,71 @@
3
3
  * Copyright 2025 Vybestack LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { vi, describe, it, expect, beforeEach } from 'vitest';
6
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
7
7
  import { keyCommand } from './keyCommand.js';
8
8
  import { createMockCommandContext } from '../../test-utils/mockCommandContext.js';
9
+ const mockRuntime = vi.hoisted(() => ({
10
+ updateActiveProviderApiKey: vi.fn(),
11
+ getActiveProviderStatus: vi.fn(),
12
+ }));
13
+ vi.mock('../contexts/RuntimeContext.js', () => ({
14
+ getRuntimeApi: () => mockRuntime,
15
+ }));
9
16
  describe('keyCommand', () => {
10
- let mockContext;
11
- let mockActiveProvider;
12
- let mockProviderManager;
13
- let mockConfig;
17
+ let context;
14
18
  beforeEach(() => {
15
19
  vi.clearAllMocks();
16
- // Create mock active provider
17
- mockActiveProvider = {
18
- name: 'test-provider',
19
- setApiKey: vi.fn(),
20
- isPaidMode: vi.fn().mockReturnValue(true),
21
- };
22
- // Create mock provider manager
23
- mockProviderManager = {
24
- getActiveProvider: vi.fn().mockReturnValue(mockActiveProvider),
25
- getActiveProviderName: vi.fn().mockReturnValue('test-provider'),
26
- };
27
- // Create mock config with provider manager
28
- mockConfig = {
29
- getProviderManager: vi.fn().mockReturnValue(mockProviderManager),
30
- setEphemeralSetting: vi.fn(),
31
- refreshAuth: vi.fn(),
32
- getSettingsService: vi.fn().mockReturnValue(null), // Return null to use fallback behavior
33
- };
34
- mockContext = createMockCommandContext({
35
- services: {
36
- config: mockConfig,
37
- },
20
+ context = createMockCommandContext();
21
+ mockRuntime.getActiveProviderStatus.mockReturnValue({
22
+ providerName: 'test-provider',
23
+ modelName: 'model-x',
24
+ displayLabel: 'test-provider:model-x',
38
25
  });
39
- });
40
- it('should set API key when provided', async () => {
41
- if (!keyCommand.action) {
42
- throw new Error('keyCommand must have an action.');
43
- }
44
- const testApiKey = 'test-api-key-12345';
45
- const result = await keyCommand.action(mockContext, testApiKey);
46
- expect(mockActiveProvider.setApiKey).toHaveBeenCalledWith(testApiKey);
47
- // setEphemeralSetting is no longer called - auth is stored via SettingsService through activeProvider.setApiKey()
48
- expect(result).toEqual({
49
- type: 'message',
50
- messageType: 'info',
51
- content: `API key updated for provider 'test-provider'\nWARNING: You are now in PAID MODE - API usage will be charged to your account`,
26
+ mockRuntime.updateActiveProviderApiKey.mockResolvedValue({
27
+ changed: true,
28
+ providerName: 'test-provider',
29
+ message: 'API key updated for provider',
30
+ isPaidMode: true,
52
31
  });
53
32
  });
54
- it('should remove API key when empty string is provided', async () => {
55
- if (!keyCommand.action) {
56
- throw new Error('keyCommand must have an action.');
57
- }
58
- const result = await keyCommand.action(mockContext, '');
59
- expect(mockActiveProvider.setApiKey).toHaveBeenCalledWith('');
60
- // setEphemeralSetting is no longer called - auth is stored via SettingsService through activeProvider.setApiKey()
61
- expect(result).toEqual({
62
- type: 'message',
63
- messageType: 'info',
64
- content: `API key removed for provider 'test-provider'`,
65
- });
33
+ it('updates API key when value provided', async () => {
34
+ const result = await keyCommand.action(context, 'abc123');
35
+ expect(mockRuntime.updateActiveProviderApiKey).toHaveBeenCalledWith('abc123');
36
+ expect(result?.type).toBe('message');
66
37
  });
67
- it('should remove API key when "none" is provided', async () => {
68
- if (!keyCommand.action) {
69
- throw new Error('keyCommand must have an action.');
70
- }
71
- const result = await keyCommand.action(mockContext, 'none');
72
- expect(mockActiveProvider.setApiKey).toHaveBeenCalledWith('');
73
- // setEphemeralSetting is no longer called - auth is stored via SettingsService through activeProvider.setApiKey()
74
- expect(result).toEqual({
75
- type: 'message',
76
- messageType: 'info',
77
- content: `API key removed for provider 'test-provider'`,
38
+ it('removes API key when argument is none', async () => {
39
+ mockRuntime.updateActiveProviderApiKey.mockResolvedValue({
40
+ changed: true,
41
+ providerName: 'test-provider',
42
+ message: 'API key removed',
78
43
  });
79
- });
80
- it('should handle errors gracefully', async () => {
81
- if (!keyCommand.action) {
82
- throw new Error('keyCommand must have an action.');
44
+ const result = await keyCommand.action(context, 'none');
45
+ expect(mockRuntime.updateActiveProviderApiKey).toHaveBeenCalledWith(null);
46
+ expect(result?.type).toBe('message');
47
+ if (result?.type === 'message') {
48
+ expect(result.content).toContain('API key removed');
83
49
  }
84
- // Mock a provider that doesn't support setApiKey
85
- mockActiveProvider.setApiKey = undefined;
86
- const result = await keyCommand.action(mockContext, 'invalid-key');
87
- expect(result).toEqual({
88
- type: 'message',
89
- messageType: 'error',
90
- content: `Provider 'test-provider' does not support API key updates`,
91
- });
92
50
  });
93
- it('should trigger payment mode check when successful and callback is available', async () => {
94
- if (!keyCommand.action) {
95
- throw new Error('keyCommand must have an action.');
51
+ it('returns error when updateActiveProviderApiKey throws', async () => {
52
+ mockRuntime.updateActiveProviderApiKey.mockRejectedValue(new Error('unsupported'));
53
+ const result = await keyCommand.action(context, 'abc123');
54
+ expect(result?.type).toBe('message');
55
+ if (result?.type === 'message') {
56
+ expect(result.messageType).toBe('error');
57
+ expect(result.content).toContain('unsupported');
96
58
  }
97
- const mockCheckPaymentModeChange = vi.fn();
98
- const extendedContext = {
99
- ...mockContext,
100
- checkPaymentModeChange: mockCheckPaymentModeChange,
101
- };
102
- vi.useFakeTimers();
103
- await keyCommand.action(extendedContext, 'api-key-123');
104
- expect(mockCheckPaymentModeChange).not.toHaveBeenCalled();
105
- // Fast-forward the timer
106
- vi.advanceTimersByTime(100);
107
- expect(mockCheckPaymentModeChange).toHaveBeenCalledTimes(1);
108
- vi.useRealTimers();
109
59
  });
110
- it('should not trigger payment mode check when unsuccessful', async () => {
111
- if (!keyCommand.action) {
112
- throw new Error('keyCommand must have an action.');
113
- }
114
- // Mock a provider that doesn't support setApiKey
115
- mockActiveProvider.setApiKey = undefined;
116
- const mockCheckPaymentModeChange = vi.fn();
60
+ it('invokes payment mode callback asynchronously', async () => {
61
+ vi.useFakeTimers();
62
+ const checkPaymentModeChange = vi.fn();
117
63
  const extendedContext = {
118
- ...mockContext,
119
- checkPaymentModeChange: mockCheckPaymentModeChange,
64
+ ...context,
65
+ checkPaymentModeChange,
120
66
  };
121
- vi.useFakeTimers();
122
- await keyCommand.action(extendedContext, 'invalid-key');
67
+ await keyCommand.action(extendedContext, 'abc123');
68
+ expect(checkPaymentModeChange).not.toHaveBeenCalled();
123
69
  vi.advanceTimersByTime(100);
124
- expect(mockCheckPaymentModeChange).not.toHaveBeenCalled();
70
+ expect(checkPaymentModeChange).toHaveBeenCalledTimes(1);
125
71
  vi.useRealTimers();
126
72
  });
127
73
  });
@@ -1 +1 @@
1
- {"version":3,"file":"keyCommand.test.js","sourceRoot":"","sources":["../../../../src/ui/commands/keyCommand.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"keyCommand.test.js","sourceRoot":"","sources":["../../../../src/ui/commands/keyCommand.test.ts"],"names":[],"mappings":"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"}
@@ -4,29 +4,33 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { CommandKind, } from './types.js';
7
- import { getProviderManager } from '../../providers/providerManagerInstance.js';
8
7
  import { promises as fs } from 'fs';
9
8
  import path from 'path';
10
9
  import { homedir } from 'os';
10
+ import { getRuntimeApi } from '../contexts/RuntimeContext.js';
11
11
  export const keyfileCommand = {
12
12
  name: 'keyfile',
13
13
  description: 'manage API key file for the current provider',
14
14
  kind: CommandKind.BUILT_IN,
15
15
  action: async (context, args) => {
16
- const providerManager = getProviderManager();
17
16
  const filePath = args?.trim();
17
+ const runtime = getRuntimeApi();
18
+ const status = runtime.getActiveProviderStatus();
19
+ const providerName = status.providerName;
20
+ if (!providerName) {
21
+ return {
22
+ type: 'message',
23
+ messageType: 'error',
24
+ content: 'No active provider available. Set a provider with /provider first.',
25
+ };
26
+ }
18
27
  try {
19
- const activeProvider = providerManager.getActiveProvider();
20
- const providerName = activeProvider.name;
21
- // If no path provided, check for existing keyfile
22
28
  if (!filePath || filePath === '') {
23
- // Check common keyfile locations
24
29
  const keyfilePaths = [
25
30
  path.join(homedir(), `.${providerName}_key`),
26
31
  path.join(homedir(), `.${providerName}-key`),
27
32
  path.join(homedir(), `.${providerName}_api_key`),
28
33
  ];
29
- // For specific providers, check their known keyfile locations
30
34
  if (providerName === 'openai') {
31
35
  keyfilePaths.unshift(path.join(homedir(), '.openai_key'));
32
36
  }
@@ -34,14 +38,14 @@ export const keyfileCommand = {
34
38
  keyfilePaths.unshift(path.join(homedir(), '.anthropic_key'));
35
39
  }
36
40
  let foundKeyfile = null;
37
- for (const keyfilePath of keyfilePaths) {
41
+ for (const candidate of keyfilePaths) {
38
42
  try {
39
- await fs.access(keyfilePath);
40
- foundKeyfile = keyfilePath;
43
+ await fs.access(candidate);
44
+ foundKeyfile = candidate;
41
45
  break;
42
46
  }
43
47
  catch {
44
- // File doesn't exist, continue checking
48
+ // continue searching
45
49
  }
46
50
  }
47
51
  if (foundKeyfile) {
@@ -51,108 +55,53 @@ export const keyfileCommand = {
51
55
  content: `Current keyfile for provider '${providerName}': ${foundKeyfile}\nTo remove: /keyfile none\nTo change: /keyfile <new_path>`,
52
56
  };
53
57
  }
54
- else {
55
- return {
56
- type: 'message',
57
- messageType: 'info',
58
- content: `No keyfile found for provider '${providerName}'\nTo set: /keyfile <path>`,
59
- };
60
- }
61
- }
62
- // Handle removal
63
- if (filePath === 'none') {
64
- const removedPath = context.services.settings.getProviderKeyfile(providerName);
65
- // Clear authentication using the provider's method (which now stores in SettingsService)
66
- if ('clearAuth' in activeProvider &&
67
- typeof activeProvider.clearAuth === 'function') {
68
- activeProvider.clearAuth();
69
- }
70
- else if (activeProvider.setApiKey) {
71
- // Fallback to clearing just the API key if clearAuth is not available
72
- activeProvider.setApiKey('');
73
- }
74
- else {
75
- return {
76
- type: 'message',
77
- messageType: 'error',
78
- content: `Provider '${providerName}' does not support keyfile commands`,
79
- };
80
- }
81
- // Remove from saved settings
82
- if (removedPath) {
83
- context.services.settings.removeProviderKeyfile(providerName);
84
- }
85
58
  return {
86
59
  type: 'message',
87
60
  messageType: 'info',
88
- content: `Cleared keyfile and API key for provider '${providerName}'`,
61
+ content: `No keyfile found for provider '${providerName}'\nTo set: /keyfile <path>`,
89
62
  };
90
63
  }
91
- // Verify keyfile exists and read the key
92
- try {
93
- const resolvedPath = filePath.replace(/^~/, homedir());
94
- // Check if file exists
95
- await fs.access(resolvedPath);
96
- // Verify the file is not empty
97
- const apiKey = (await fs.readFile(resolvedPath, 'utf-8')).trim();
98
- if (!apiKey) {
99
- return {
100
- type: 'message',
101
- messageType: 'error',
102
- content: 'The specified file is empty',
103
- };
104
- }
105
- // Get the active provider
106
- const activeProvider = providerManager.getActiveProvider();
107
- const providerName = activeProvider.name;
108
- // Set the API key directly on the provider
109
- if (activeProvider.setApiKey) {
110
- activeProvider.setApiKey(apiKey);
111
- }
112
- else {
113
- return {
114
- type: 'message',
115
- messageType: 'error',
116
- content: `Provider '${providerName}' does not support API key authentication`,
117
- };
118
- }
119
- // Store the keyfile PATH in ephemeral settings for reference
120
- // This helps track that we're using a keyfile vs direct key
121
- if (context.services.config) {
122
- context.services.config.setEphemeralSetting('auth-keyfile', resolvedPath);
123
- // Don't clear auth-key - we just set it via setApiKey above!
124
- // The auth-key will be used immediately, and auth-keyfile is stored
125
- // for future reference (e.g., when reloading profiles)
126
- }
127
- // Check if we're now in paid mode
128
- const isPaidMode = activeProvider.isPaidMode?.() ?? true;
129
- const paymentWarning = isPaidMode
130
- ? '\nWARNING: You are now in PAID MODE - API usage will be charged to your account'
131
- : '';
132
- // Trigger payment mode check if available
133
- const extendedContext = context;
134
- if (extendedContext.checkPaymentModeChange) {
135
- setTimeout(extendedContext.checkPaymentModeChange, 100);
136
- }
64
+ if (filePath === 'none') {
65
+ await runtime.updateActiveProviderApiKey(null);
66
+ runtime.setEphemeralSetting('auth-keyfile', undefined);
67
+ context.services.settings.removeProviderKeyfile?.(providerName);
137
68
  return {
138
69
  type: 'message',
139
70
  messageType: 'info',
140
- content: `API key loaded from ${resolvedPath} for provider '${providerName}'${paymentWarning}`,
71
+ content: `Cleared keyfile and API key for provider '${providerName}'`,
141
72
  };
142
73
  }
143
- catch (error) {
74
+ const resolvedPath = filePath.replace(/^~/, homedir());
75
+ await fs.access(resolvedPath);
76
+ const apiKey = (await fs.readFile(resolvedPath, 'utf-8')).trim();
77
+ if (!apiKey) {
144
78
  return {
145
79
  type: 'message',
146
80
  messageType: 'error',
147
- content: `Failed to manage keyfile: ${error instanceof Error ? error.message : String(error)}`,
81
+ content: 'The specified file is empty',
148
82
  };
149
83
  }
84
+ const result = await runtime.updateActiveProviderApiKey(apiKey);
85
+ runtime.setEphemeralSetting('auth-keyfile', resolvedPath);
86
+ context.services.settings.setProviderKeyfile?.(providerName, resolvedPath);
87
+ const extendedContext = context;
88
+ if (extendedContext.checkPaymentModeChange) {
89
+ setTimeout(extendedContext.checkPaymentModeChange, 100);
90
+ }
91
+ const paymentWarning = result.isPaidMode
92
+ ? '\nWARNING: You are now in PAID MODE - API usage will be charged to your account'
93
+ : '';
94
+ return {
95
+ type: 'message',
96
+ messageType: 'info',
97
+ content: `API key loaded from ${resolvedPath} for provider '${providerName}'${paymentWarning}`,
98
+ };
150
99
  }
151
100
  catch (error) {
152
101
  return {
153
102
  type: 'message',
154
103
  messageType: 'error',
155
- content: `Failed to access provider: ${error instanceof Error ? error.message : String(error)}`,
104
+ content: `Failed to manage keyfile: ${error instanceof Error ? error.message : String(error)}`,
156
105
  };
157
106
  }
158
107
  },
@@ -1 +1 @@
1
- {"version":3,"file":"keyfileCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/keyfileCommand.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"keyfileCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/keyfileCommand.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { CommandKind, } from './types.js';
7
- import { getOAuthManager } from '../../providers/providerManagerInstance.js';
7
+ import { getRuntimeApi } from '../contexts/RuntimeContext.js';
8
8
  export const logoutCommand = {
9
9
  name: 'logout',
10
10
  description: 'logout from OAuth authentication for a provider (gemini, qwen, anthropic)',
@@ -20,7 +20,7 @@ export const logoutCommand = {
20
20
  };
21
21
  }
22
22
  try {
23
- const oauthManager = getOAuthManager();
23
+ const oauthManager = getRuntimeApi().getCliOAuthManager();
24
24
  if (!oauthManager) {
25
25
  return {
26
26
  type: 'message',
@@ -1 +1 @@
1
- {"version":3,"file":"logoutCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/logoutCommand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAIL,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAE7E,MAAM,CAAC,MAAM,aAAa,GAAiB;IACzC,IAAI,EAAE,QAAQ;IACd,WAAW,EACT,2EAA2E;IAC7E,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,MAAM,EAAE,KAAK,EACX,OAAuB,EACvB,IAAY,EACkB,EAAE;QAChC,MAAM,QAAQ,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC;QAE9B,uCAAuC;QACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,OAAO;gBACpB,OAAO,EACL,4GAA4G;aAC/G,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;YACvC,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,OAAO;oBACpB,OAAO,EAAE,gDAAgD;iBAC1D,CAAC;YACJ,CAAC;YAED,iCAAiC;YACjC,MAAM,kBAAkB,GAAG,YAAY,CAAC,qBAAqB,EAAE,CAAC;YAChE,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3C,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,OAAO;oBACpB,OAAO,EAAE,qBAAqB,QAAQ,0BAA0B,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBAChG,CAAC;YACJ,CAAC;YAED,iCAAiC;YACjC,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YAErE,kFAAkF;YAClF,MAAM,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAEpC,IAAI,eAAe,EAAE,CAAC;gBACpB,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,MAAM;oBACnB,OAAO,EAAE,8BAA8B,QAAQ,EAAE;iBAClD,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,+DAA+D;gBAC/D,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,MAAM;oBACnB,OAAO,EAAE,uCAAuC,QAAQ,0BAA0B;iBACnF,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzD,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,OAAO;gBACpB,OAAO,EAAE,yBAAyB,QAAQ,KAAK,YAAY,EAAE;aAC9D,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"logoutCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/logoutCommand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAIL,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE9D,MAAM,CAAC,MAAM,aAAa,GAAiB;IACzC,IAAI,EAAE,QAAQ;IACd,WAAW,EACT,2EAA2E;IAC7E,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,MAAM,EAAE,KAAK,EACX,OAAuB,EACvB,IAAY,EACkB,EAAE;QAChC,MAAM,QAAQ,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC;QAE9B,uCAAuC;QACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,OAAO;gBACpB,OAAO,EACL,4GAA4G;aAC/G,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,aAAa,EAAE,CAAC,kBAAkB,EAAE,CAAC;YAC1D,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,OAAO;oBACpB,OAAO,EAAE,gDAAgD;iBAC1D,CAAC;YACJ,CAAC;YAED,iCAAiC;YACjC,MAAM,kBAAkB,GAAG,YAAY,CAAC,qBAAqB,EAAE,CAAC;YAChE,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3C,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,OAAO;oBACpB,OAAO,EAAE,qBAAqB,QAAQ,0BAA0B,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBAChG,CAAC;YACJ,CAAC;YAED,iCAAiC;YACjC,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YAErE,kFAAkF;YAClF,MAAM,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAEpC,IAAI,eAAe,EAAE,CAAC;gBACpB,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,MAAM;oBACnB,OAAO,EAAE,8BAA8B,QAAQ,EAAE;iBAClD,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,+DAA+D;gBAC/D,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,MAAM;oBACnB,OAAO,EAAE,uCAAuC,QAAQ,0BAA0B;iBACnF,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzD,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,OAAO;gBACpB,OAAO,EAAE,yBAAyB,QAAQ,KAAK,YAAY,EAAE;aAC9D,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -11,6 +11,34 @@ const COLOR_RED = '\u001b[31m';
11
11
  const COLOR_CYAN = '\u001b[36m';
12
12
  const COLOR_GREY = '\u001b[90m';
13
13
  const RESET_COLOR = '\u001b[0m';
14
+ const mcpAuthSchema = [
15
+ {
16
+ kind: 'value',
17
+ name: 'server',
18
+ description: 'Select MCP server to authenticate',
19
+ /**
20
+ * @plan:PLAN-20251013-AUTOCOMPLETE.P11
21
+ * @requirement:REQ-004
22
+ * Schema completer replaces legacy server list.
23
+ */
24
+ completer: async (ctx, partialArg) => {
25
+ const { config } = ctx.services;
26
+ if (!config) {
27
+ return [];
28
+ }
29
+ const mcpServers = config.getMcpServers() || {};
30
+ const normalizedPartial = partialArg.toLowerCase();
31
+ return Object.keys(mcpServers)
32
+ .filter((name) => normalizedPartial.length === 0
33
+ ? true
34
+ : name.toLowerCase().startsWith(normalizedPartial))
35
+ .map((name) => ({
36
+ value: name,
37
+ description: 'Configured MCP server',
38
+ }));
39
+ },
40
+ },
41
+ ];
14
42
  const getMcpStatus = async (context, showDescriptions, showSchema, showTips = false) => {
15
43
  const { config } = context.services;
16
44
  if (!config) {
@@ -268,6 +296,7 @@ const authCommand = {
268
296
  name: 'auth',
269
297
  description: 'Authenticate with an OAuth-enabled MCP server',
270
298
  kind: CommandKind.BUILT_IN,
299
+ schema: mcpAuthSchema,
271
300
  action: async (context, args) => {
272
301
  const serverName = args.trim();
273
302
  const { config } = context.services;
@@ -355,13 +384,6 @@ const authCommand = {
355
384
  };
356
385
  }
357
386
  },
358
- completion: async (context, partialArg) => {
359
- const { config } = context.services;
360
- if (!config)
361
- return [];
362
- const mcpServers = config.getMcpServers() || {};
363
- return Object.keys(mcpServers).filter((name) => name.startsWith(partialArg));
364
- },
365
387
  };
366
388
  const listCommand = {
367
389
  name: 'list',