@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
@@ -0,0 +1,132 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
7
+ import { setCommand } from '../setCommand.js';
8
+ import { createMockCommandContext } from '../../../test-utils/mockCommandContext.js';
9
+ const mockRuntime = {
10
+ getActiveModelParams: vi.fn(() => ({})),
11
+ getEphemeralSettings: vi.fn(() => ({})),
12
+ setEphemeralSetting: vi.fn(),
13
+ setActiveModelParam: vi.fn(),
14
+ clearActiveModelParam: vi.fn(),
15
+ };
16
+ vi.mock('../../contexts/RuntimeContext.js', () => ({
17
+ getRuntimeApi: () => mockRuntime,
18
+ }));
19
+ describe('setCommand action mutation coverage', () => {
20
+ let context;
21
+ beforeEach(() => {
22
+ vi.clearAllMocks();
23
+ context = createMockCommandContext();
24
+ });
25
+ it('stores numeric context-limit values', async () => {
26
+ const result = await setCommand.action(context, 'context-limit 32000');
27
+ expect(mockRuntime.setEphemeralSetting).toHaveBeenCalledWith('context-limit', 32000);
28
+ expect(result).toEqual({
29
+ type: 'message',
30
+ messageType: 'info',
31
+ content: "Ephemeral setting 'context-limit' set to 32000 (session only, use /profile save to persist)",
32
+ });
33
+ });
34
+ it('rejects invalid numeric input', async () => {
35
+ const result = await setCommand.action(context, 'context-limit not-a-number');
36
+ expect(result).toEqual({
37
+ type: 'message',
38
+ messageType: 'error',
39
+ content: 'context-limit must be a positive integer (e.g., 100000)',
40
+ });
41
+ });
42
+ it('normalizes boolean settings', async () => {
43
+ const result = await setCommand.action(context, 'socket-keepalive true');
44
+ expect(mockRuntime.setEphemeralSetting).toHaveBeenCalledWith('socket-keepalive', true);
45
+ expect(result).toEqual({
46
+ type: 'message',
47
+ messageType: 'info',
48
+ content: "Ephemeral setting 'socket-keepalive' set to true (session only, use /profile save to persist)",
49
+ });
50
+ });
51
+ it('validates streaming enums', async () => {
52
+ const success = await setCommand.action(context, 'streaming enabled');
53
+ expect(success).toMatchObject({
54
+ type: 'message',
55
+ messageType: 'info',
56
+ });
57
+ expect(mockRuntime.setEphemeralSetting).toHaveBeenCalledWith('streaming', 'enabled');
58
+ const failure = await setCommand.action(context, 'streaming maybe');
59
+ expect(failure).toEqual({
60
+ type: 'message',
61
+ messageType: 'error',
62
+ content: "Invalid streaming mode 'maybe'. Valid modes are: enabled, disabled",
63
+ });
64
+ });
65
+ it('validates compression-threshold bounds', async () => {
66
+ const success = await setCommand.action(context, 'compression-threshold 0.75');
67
+ expect(success).toMatchObject({
68
+ type: 'message',
69
+ messageType: 'info',
70
+ });
71
+ expect(mockRuntime.setEphemeralSetting).toHaveBeenCalledWith('compression-threshold', 0.75);
72
+ const failure = await setCommand.action(context, 'compression-threshold 1.4');
73
+ expect(failure).toEqual({
74
+ type: 'message',
75
+ messageType: 'error',
76
+ content: 'compression-threshold must be a decimal between 0 and 1 (e.g., 0.7 for 70%)',
77
+ });
78
+ });
79
+ it('accepts special maxTurnsPerPrompt values', async () => {
80
+ const success = await setCommand.action(context, 'maxTurnsPerPrompt -1');
81
+ expect(success).toMatchObject({
82
+ type: 'message',
83
+ messageType: 'info',
84
+ });
85
+ expect(mockRuntime.setEphemeralSetting).toHaveBeenCalledWith('maxTurnsPerPrompt', -1);
86
+ });
87
+ it('guards positive integer validations', async () => {
88
+ const success = await setCommand.action(context, 'tool-output-max-items 25');
89
+ expect(success).toMatchObject({
90
+ type: 'message',
91
+ messageType: 'info',
92
+ });
93
+ expect(mockRuntime.setEphemeralSetting).toHaveBeenCalledWith('tool-output-max-items', 25);
94
+ const failure = await setCommand.action(context, 'tool-output-max-items 0');
95
+ expect(failure).toEqual({
96
+ type: 'message',
97
+ messageType: 'error',
98
+ content: 'tool-output-max-items must be a positive integer',
99
+ });
100
+ });
101
+ it('lowercases emojifilter values', async () => {
102
+ await setCommand.action(context, 'emojifilter AUTO');
103
+ expect(mockRuntime.setEphemeralSetting).toHaveBeenCalledWith('emojifilter', 'auto');
104
+ });
105
+ it('accepts truncate mode enumerations', async () => {
106
+ const result = await setCommand.action(context, 'tool-output-truncate-mode sample');
107
+ expect(result).toMatchObject({
108
+ type: 'message',
109
+ messageType: 'info',
110
+ });
111
+ expect(mockRuntime.setEphemeralSetting).toHaveBeenCalledWith('tool-output-truncate-mode', 'sample');
112
+ });
113
+ it('normalizes socket flags independently', async () => {
114
+ await setCommand.action(context, 'socket-nodelay false');
115
+ expect(mockRuntime.setEphemeralSetting).toHaveBeenCalledWith('socket-nodelay', false);
116
+ });
117
+ it('parses JSON payloads for custom headers', async () => {
118
+ await setCommand.action(context, 'custom-headers {"Authorization":"Bearer token"}');
119
+ expect(mockRuntime.setEphemeralSetting).toHaveBeenCalledWith('custom-headers', {
120
+ Authorization: 'Bearer token',
121
+ });
122
+ });
123
+ it('stores malformed JSON payloads as literal strings', async () => {
124
+ const result = await setCommand.action(context, 'custom-headers {"Authorization":"Bearer token"');
125
+ expect(mockRuntime.setEphemeralSetting).toHaveBeenCalledWith('custom-headers', '{"Authorization":"Bearer token"');
126
+ expect(result).toMatchObject({
127
+ type: 'message',
128
+ messageType: 'info',
129
+ });
130
+ });
131
+ });
132
+ //# sourceMappingURL=setCommand.mutation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setCommand.mutation.test.js","sourceRoot":"","sources":["../../../../../src/ui/commands/test/setCommand.mutation.test.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,222 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
7
+ import * as fc from 'fast-check';
8
+ import { createCompletionHandler } from '../schema/index.js';
9
+ import { createMockCommandContext } from '../../../test-utils/mockCommandContext.js';
10
+ const mockRuntime = {
11
+ getEphemeralSettings: vi.fn(() => ({
12
+ 'context-limit': 100_000,
13
+ 'compression-threshold': 0.7,
14
+ streaming: 'enabled',
15
+ 'socket-timeout': 60_000,
16
+ })),
17
+ getActiveModelParams: vi.fn(() => ({
18
+ temperature: 0.7,
19
+ max_tokens: 1000,
20
+ })),
21
+ setEphemeralSetting: vi.fn(),
22
+ setActiveModelParam: vi.fn(),
23
+ clearActiveModelParam: vi.fn(),
24
+ };
25
+ vi.mock('../../contexts/RuntimeContext.js', () => ({
26
+ getRuntimeApi: () => mockRuntime,
27
+ }));
28
+ import { setCommand } from '../setCommand.js';
29
+ /**
30
+ * @plan:PLAN-20251013-AUTOCOMPLETE.P09
31
+ * @requirement:REQ-006
32
+ * @pseudocode ArgumentSchema.md lines 111-130
33
+ * - Line 25: Arg0 literal: `unset`, `modelparam`, `emojifilter`, etc.
34
+ * - Line 26: Each literal provides `next` definitions for subsequent value arguments.
35
+ *
36
+ * @plan:PLAN-20251013-AUTOCOMPLETE.P09a
37
+ * Verification (2025-10-16):
38
+ * - Command: `cd packages/cli && npx vitest run src/ui/commands/test/setCommand.phase09.test.ts`
39
+ * - Result: 13 passed (GREEN – schema implementation under test)
40
+ * - Property ratio: 4 / 13 ≈ 30.77%
41
+ */
42
+ const commandSchema = setCommand.schema;
43
+ if (!commandSchema) {
44
+ throw new Error('setCommand schema is not configured');
45
+ }
46
+ describe('setCommand schema integration', () => {
47
+ // Mock context for testing
48
+ const mockContext = createMockCommandContext({
49
+ services: {
50
+ config: {
51
+ getEphemeralSettings: () => ({
52
+ 'context-limit': 100_000,
53
+ 'compression-threshold': 0.7,
54
+ streaming: 'enabled',
55
+ 'socket-timeout': 60_000,
56
+ }),
57
+ getProviderManager: () => ({
58
+ getActiveProvider: () => ({
59
+ name: 'test-provider',
60
+ getModelParams: () => ({
61
+ temperature: 0.7,
62
+ max_tokens: 1000,
63
+ }),
64
+ }),
65
+ }),
66
+ },
67
+ },
68
+ });
69
+ let handler;
70
+ beforeEach(() => {
71
+ mockRuntime.getEphemeralSettings.mockReturnValue({
72
+ 'context-limit': 100_000,
73
+ 'compression-threshold': 0.7,
74
+ streaming: 'enabled',
75
+ 'socket-timeout': 60_000,
76
+ });
77
+ mockRuntime.getActiveModelParams.mockReturnValue({
78
+ temperature: 0.7,
79
+ max_tokens: 1000,
80
+ });
81
+ handler = createCompletionHandler(commandSchema);
82
+ });
83
+ describe('literal subcommand selection', () => {
84
+ it('should suggest available subcommands when no input provided @plan:PLAN-20251013-AUTOCOMPLETE.P09 @requirement:REQ-006', async () => {
85
+ const result = await handler(mockContext, '', '/set ');
86
+ expect(result.suggestions).toEqual(expect.arrayContaining([
87
+ expect.objectContaining({ value: 'unset' }),
88
+ expect.objectContaining({ value: 'modelparam' }),
89
+ expect.objectContaining({ value: 'emojifilter' }),
90
+ expect.objectContaining({ value: 'context-limit' }),
91
+ expect.objectContaining({ value: 'compression-threshold' }),
92
+ ]));
93
+ expect(result.hint).toBe('Select option');
94
+ expect(result.position).toBe(1);
95
+ });
96
+ it('should filter literal subcommands based on partial input @plan:PLAN-20251013-AUTOCOMPLETE.P09 @requirement:REQ-006', async () => {
97
+ const result = await handler(mockContext, 'mo', '/set mo');
98
+ expect(result.suggestions).toEqual([
99
+ expect.objectContaining({ value: 'modelparam' }),
100
+ ]);
101
+ expect(result.hint).toBe('Select option');
102
+ });
103
+ it('should accept exact literal match and advance to next arguments @plan:PLAN-20251013-AUTOCOMPLETE.P09 @requirement:REQ-006', async () => {
104
+ const result = await handler(mockContext, '', '/set unset ');
105
+ expect(result.suggestions).toEqual(expect.arrayContaining([
106
+ expect.objectContaining({ value: 'context-limit' }),
107
+ expect.objectContaining({ value: 'emojifilter' }),
108
+ expect.objectContaining({ value: 'modelparam' }),
109
+ ]));
110
+ expect(result.hint).toBe('setting key to remove');
111
+ expect(result.position).toBe(1);
112
+ });
113
+ });
114
+ describe('nested value arguments', () => {
115
+ it('should provide emojifilter mode options after selecting emojifilter @plan:PLAN-20251013-AUTOCOMPLETE.P09 @requirement:REQ-006', async () => {
116
+ const result = await handler(mockContext, '', '/set emojifilter ');
117
+ expect(result.suggestions).toEqual([
118
+ expect.objectContaining({ value: 'allowed' }),
119
+ expect.objectContaining({ value: 'auto' }),
120
+ expect.objectContaining({ value: 'warn' }),
121
+ expect.objectContaining({ value: 'error' }),
122
+ ]);
123
+ expect(result.hint).toBe('filter mode');
124
+ expect(result.position).toBe(1);
125
+ });
126
+ it('should handle modelparam parameter completion via async completer @plan:PLAN-20251013-AUTOCOMPLETE.P09 @requirement:REQ-006', async () => {
127
+ mockRuntime.getActiveModelParams.mockReturnValue({
128
+ temperature: 0.7,
129
+ max_tokens: 1000,
130
+ });
131
+ const result = await handler(mockContext, '', '/set modelparam ');
132
+ expect(result.suggestions).toEqual(expect.arrayContaining([
133
+ expect.objectContaining({
134
+ value: 'temperature',
135
+ description: 'Parameter: temperature',
136
+ }),
137
+ expect.objectContaining({
138
+ value: 'max_tokens',
139
+ description: 'Parameter: max_tokens',
140
+ }),
141
+ ]));
142
+ expect(result.hint).toBe('parameter name');
143
+ expect(result.position).toBe(1);
144
+ });
145
+ it('should advance to value argument after setting modelparam name @plan:PLAN-20251013-AUTOCOMPLETE.P09 @requirement:REQ-006', async () => {
146
+ const result = await handler(mockContext, '', '/set modelparam temperature ');
147
+ expect(result.suggestions).toEqual([]); // No predefined options for values
148
+ expect(result.hint).toBe('value to set for the parameter (number, string, boolean, or JSON)');
149
+ expect(result.position).toBe(2);
150
+ });
151
+ });
152
+ describe('hint text correctness', () => {
153
+ it('should show appropriate hints for context-limit setting @plan:PLAN-20251013-AUTOCOMPLETE.P09 @requirement:REQ-006', async () => {
154
+ const result = await handler(mockContext, '', '/set context-limit ');
155
+ expect(result.hint).toBe('positive integer (e.g., 100000)');
156
+ expect(result.position).toBe(1);
157
+ });
158
+ it('should show appropriate hints for compression-threshold setting @plan:PLAN-20251013-AUTOCOMPLETE.P09 @requirement:REQ-006', async () => {
159
+ const result = await handler(mockContext, '', '/set compression-threshold ');
160
+ expect(result.hint).toBe('decimal between 0 and 1 (e.g., 0.7)');
161
+ expect(result.position).toBe(1);
162
+ });
163
+ it('should show context-sensitive hints for unset subkey @plan:PLAN-20251013-AUTOCOMPLETE.P09 @requirement:REQ-006', async () => {
164
+ const result = await handler(mockContext, '', '/set unset modelparam ');
165
+ expect(result.hint).toBe('model parameter name (e.g., temperature, max_tokens)');
166
+ expect(result.position).toBe(2);
167
+ });
168
+ });
169
+ describe('property-based expectations', () => {
170
+ it('property: exposes provider parameter suggestions for any parameter set @plan:PLAN-20251013-AUTOCOMPLETE.P09 @requirement:REQ-006', async () => {
171
+ await fc.assert(fc.asyncProperty(fc.uniqueArray(fc.string({ minLength: 1, maxLength: 12 }), {
172
+ minLength: 1,
173
+ maxLength: 5,
174
+ }), async (paramNames) => {
175
+ const dynamicParams = Object.fromEntries(paramNames.map((name) => [name, 'value']));
176
+ mockRuntime.getActiveModelParams.mockReturnValue(dynamicParams);
177
+ const result = await handler(mockContext, '', '/set modelparam ');
178
+ expect(result.suggestions.map((s) => s.value)).toEqual(expect.arrayContaining(paramNames));
179
+ expect(result.hint).toBe('parameter name');
180
+ expect(result.position).toBe(1);
181
+ mockRuntime.getActiveModelParams.mockReturnValue({
182
+ temperature: 0.7,
183
+ max_tokens: 1000,
184
+ });
185
+ }));
186
+ });
187
+ it('property: maintains structured hints across arbitrary literal prefixes @plan:PLAN-20251013-AUTOCOMPLETE.P09 @requirement:REQ-006', async () => {
188
+ await fc.assert(fc.asyncProperty(fc.string(), async (rawInput) => {
189
+ const prefix = rawInput.trim();
190
+ const commandLine = prefix ? `/set ${prefix}` : '/set ';
191
+ const result = await handler(mockContext, prefix, commandLine);
192
+ expect(result).toHaveProperty('suggestions');
193
+ expect(result).toHaveProperty('hint');
194
+ expect(result).toHaveProperty('position');
195
+ expect(result.hint).not.toBe('');
196
+ }));
197
+ });
198
+ it('property: emits contextual value hints for selected settings @plan:PLAN-20251013-AUTOCOMPLETE.P09 @requirement:REQ-006', async () => {
199
+ const expectedHints = {
200
+ 'context-limit': 'positive integer (e.g., 100000)',
201
+ 'compression-threshold': 'decimal between 0 and 1 (e.g., 0.7)',
202
+ 'socket-timeout': 'positive integer in milliseconds (e.g., 60000)',
203
+ };
204
+ await fc.assert(fc.asyncProperty(fc.constantFrom(...Object.keys(expectedHints)), async (settingKey) => {
205
+ const result = await handler(mockContext, '', `/set ${settingKey} `);
206
+ expect(result.hint).toBe(expectedHints[settingKey]);
207
+ expect(result.position).toBe(1);
208
+ }));
209
+ });
210
+ it('property: nested unset subkeys surface contextual hints @plan:PLAN-20251013-AUTOCOMPLETE.P09 @requirement:REQ-006', async () => {
211
+ await fc.assert(fc.asyncProperty(fc.constantFrom('modelparam', 'custom-headers'), async (subkey) => {
212
+ const result = await handler(mockContext, '', `/set unset ${subkey} `);
213
+ const expectedHint = subkey === 'modelparam'
214
+ ? 'model parameter name (e.g., temperature, max_tokens)'
215
+ : 'header name (e.g., Authorization)';
216
+ expect(result.hint).toBe(expectedHint);
217
+ expect(result.position).toBe(2);
218
+ }));
219
+ });
220
+ });
221
+ });
222
+ //# sourceMappingURL=setCommand.phase09.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setCommand.phase09.test.js","sourceRoot":"","sources":["../../../../../src/ui/commands/test/setCommand.phase09.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AAGrF,MAAM,WAAW,GAAG;IAClB,oBAAoB,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;QACjC,eAAe,EAAE,OAAO;QACxB,uBAAuB,EAAE,GAAG;QAC5B,SAAS,EAAE,SAAS;QACpB,gBAAgB,EAAE,MAAM;KACzB,CAAC,CAAC;IACH,oBAAoB,EAAE,EAAE,CAAC,EAAE,CACzB,GAA4B,EAAE,CAAC,CAAC;QAC9B,WAAW,EAAE,GAAG;QAChB,UAAU,EAAE,IAAI;KACjB,CAAC,CACH;IACD,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE;IAC5B,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE;IAC5B,qBAAqB,EAAE,EAAE,CAAC,EAAE,EAAE;CAC/B,CAAC;AAEF,EAAE,CAAC,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE,CAAC,CAAC;IACjD,aAAa,EAAE,GAAG,EAAE,CAAC,WAAW;CACjC,CAAC,CAAC,CAAC;AACJ,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;;;;;;;;;;;GAYG;AAEH,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC;AAExC,IAAI,CAAC,aAAa,EAAE,CAAC;IACnB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;AACzD,CAAC;AAED,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,2BAA2B;IAC3B,MAAM,WAAW,GAAmB,wBAAwB,CAAC;QAC3D,QAAQ,EAAE;YACR,MAAM,EAAE;gBACN,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;oBAC3B,eAAe,EAAE,OAAO;oBACxB,uBAAuB,EAAE,GAAG;oBAC5B,SAAS,EAAE,SAAS;oBACpB,gBAAgB,EAAE,MAAM;iBACzB,CAAC;gBACF,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;oBACzB,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;wBACxB,IAAI,EAAE,eAAe;wBACrB,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;4BACrB,WAAW,EAAE,GAAG;4BAChB,UAAU,EAAE,IAAI;yBACjB,CAAC;qBACH,CAAC;iBACH,CAAC;aACkB;SACvB;KACF,CAAC,CAAC;IAEH,IAAI,OAAmD,CAAC;IAExD,UAAU,CAAC,GAAG,EAAE;QACd,WAAW,CAAC,oBAAoB,CAAC,eAAe,CAAC;YAC/C,eAAe,EAAE,OAAO;YACxB,uBAAuB,EAAE,GAAG;YAC5B,SAAS,EAAE,SAAS;YACpB,gBAAgB,EAAE,MAAM;SACzB,CAAC,CAAC;QACH,WAAW,CAAC,oBAAoB,CAAC,eAAe,CAAC;YAC/C,WAAW,EAAE,GAAG;YAChB,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QACH,OAAO,GAAG,uBAAuB,CAAC,aAAa,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;QAC5C,EAAE,CAAC,uHAAuH,EAAE,KAAK,IAAI,EAAE;YACrI,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;YAEvD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAChC,MAAM,CAAC,eAAe,CAAC;gBACrB,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;gBAC3C,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;gBAChD,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;gBACjD,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;gBACnD,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;aAC5D,CAAC,CACH,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oHAAoH,EAAE,KAAK,IAAI,EAAE;YAClI,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;YAE3D,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC;gBACjC,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;aACjD,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2HAA2H,EAAE,KAAK,IAAI,EAAE;YACzI,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,EAAE,aAAa,CAAC,CAAC;YAE7D,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAChC,MAAM,CAAC,eAAe,CAAC;gBACrB,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;gBACnD,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;gBACjD,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;aACjD,CAAC,CACH,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,+HAA+H,EAAE,KAAK,IAAI,EAAE;YAC7I,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,EAAE,mBAAmB,CAAC,CAAC;YAEnE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC;gBACjC,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;gBAC7C,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;gBAC1C,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;gBAC1C,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;aAC5C,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6HAA6H,EAAE,KAAK,IAAI,EAAE;YAC3I,WAAW,CAAC,oBAAoB,CAAC,eAAe,CAAC;gBAC/C,WAAW,EAAE,GAAG;gBAChB,UAAU,EAAE,IAAI;aACjB,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,EAAE,kBAAkB,CAAC,CAAC;YAElE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAChC,MAAM,CAAC,eAAe,CAAC;gBACrB,MAAM,CAAC,gBAAgB,CAAC;oBACtB,KAAK,EAAE,aAAa;oBACpB,WAAW,EAAE,wBAAwB;iBACtC,CAAC;gBACF,MAAM,CAAC,gBAAgB,CAAC;oBACtB,KAAK,EAAE,YAAY;oBACnB,WAAW,EAAE,uBAAuB;iBACrC,CAAC;aACH,CAAC,CACH,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0HAA0H,EAAE,KAAK,IAAI,EAAE;YACxI,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,WAAW,EACX,EAAE,EACF,8BAA8B,CAC/B,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,mCAAmC;YAC3E,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CACtB,mEAAmE,CACpE,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,mHAAmH,EAAE,KAAK,IAAI,EAAE;YACjI,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,EAAE,qBAAqB,CAAC,CAAC;YAErE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2HAA2H,EAAE,KAAK,IAAI,EAAE;YACzI,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,WAAW,EACX,EAAE,EACF,6BAA6B,CAC9B,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;YAChE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gHAAgH,EAAE,KAAK,IAAI,EAAE;YAC9H,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,EAAE,wBAAwB,CAAC,CAAC;YAExE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CACtB,sDAAsD,CACvD,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,EAAE,CAAC,kIAAkI,EAAE,KAAK,IAAI,EAAE;YAChJ,MAAM,EAAE,CAAC,MAAM,CACb,EAAE,CAAC,aAAa,CACd,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE;gBACzD,SAAS,EAAE,CAAC;gBACZ,SAAS,EAAE,CAAC;aACb,CAAC,EACF,KAAK,EAAE,UAAU,EAAE,EAAE;gBACnB,MAAM,aAAa,GAAG,MAAM,CAAC,WAAW,CACtC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAC1C,CAAC;gBACF,WAAW,CAAC,oBAAoB,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;gBAEhE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,EAAE,kBAAkB,CAAC,CAAC;gBAElE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CACpD,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CACnC,CAAC;gBACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAC3C,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAEhC,WAAW,CAAC,oBAAoB,CAAC,eAAe,CAAC;oBAC/C,WAAW,EAAE,GAAG;oBAChB,UAAU,EAAE,IAAI;iBACjB,CAAC,CAAC;YACL,CAAC,CACF,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kIAAkI,EAAE,KAAK,IAAI,EAAE;YAChJ,MAAM,EAAE,CAAC,MAAM,CACb,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;gBAC/C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC/B,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;gBACxD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;gBAE/D,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;gBAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;gBACtC,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;gBAC1C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnC,CAAC,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wHAAwH,EAAE,KAAK,IAAI,EAAE;YACtI,MAAM,aAAa,GAA2B;gBAC5C,eAAe,EAAE,iCAAiC;gBAClD,uBAAuB,EAAE,qCAAqC;gBAC9D,gBAAgB,EAAE,gDAAgD;aACnE,CAAC;YAEF,MAAM,EAAE,CAAC,MAAM,CACb,EAAE,CAAC,aAAa,CACd,EAAE,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAC9C,KAAK,EAAE,UAAU,EAAE,EAAE;gBACnB,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,WAAW,EACX,EAAE,EACF,QAAQ,UAAU,GAAG,CACtB,CAAC;gBAEF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;gBACpD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClC,CAAC,CACF,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mHAAmH,EAAE,KAAK,IAAI,EAAE;YACjI,MAAM,EAAE,CAAC,MAAM,CACb,EAAE,CAAC,aAAa,CACd,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,gBAAgB,CAAC,EAC/C,KAAK,EAAE,MAAM,EAAE,EAAE;gBACf,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,WAAW,EACX,EAAE,EACF,cAAc,MAAM,GAAG,CACxB,CAAC;gBAEF,MAAM,YAAY,GAChB,MAAM,KAAK,YAAY;oBACrB,CAAC,CAAC,sDAAsD;oBACxD,CAAC,CAAC,mCAAmC,CAAC;gBAE1C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACvC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClC,CAAC,CACF,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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,125 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, vi } from 'vitest';
7
+ import { createCompletionHandler } from '../schema/index.js';
8
+ import { createMockCommandContext } from '../../../test-utils/mockCommandContext.js';
9
+ import { subagentCommand } from '../subagentCommand.js';
10
+ const mockSubagents = {
11
+ agent1: {
12
+ name: 'agent1',
13
+ profile: 'default',
14
+ systemPrompt: 'prompt-1',
15
+ createdAt: '2025-01-01T00:00:00Z',
16
+ updatedAt: '2025-01-01T00:00:00Z',
17
+ },
18
+ agent2: {
19
+ name: 'agent2',
20
+ profile: 'custom',
21
+ systemPrompt: 'prompt-2',
22
+ createdAt: '2025-01-02T00:00:00Z',
23
+ updatedAt: '2025-01-02T00:00:00Z',
24
+ },
25
+ 'code-helper': {
26
+ name: 'code-helper',
27
+ profile: 'coding',
28
+ systemPrompt: 'coding assistant',
29
+ createdAt: '2025-01-03T00:00:00Z',
30
+ updatedAt: '2025-01-03T00:00:00Z',
31
+ },
32
+ };
33
+ const mockProfiles = ['default', 'analysis', 'ops'];
34
+ const createContext = () => createMockCommandContext({
35
+ services: {
36
+ subagentManager: {
37
+ listSubagents: vi.fn(async () => Object.keys(mockSubagents)),
38
+ loadSubagent: vi.fn(async (name) => mockSubagents[name]),
39
+ saveSubagent: vi.fn(async () => undefined),
40
+ deleteSubagent: vi.fn(async () => undefined),
41
+ },
42
+ profileManager: {
43
+ listProfiles: vi.fn(async () => mockProfiles),
44
+ },
45
+ },
46
+ });
47
+ const invoke = async (fullLine, input = {
48
+ args: '',
49
+ completedArgs: [],
50
+ partialArg: '',
51
+ commandPathLength: 2,
52
+ }) => {
53
+ const saveCommand = subagentCommand.subCommands?.find((cmd) => cmd.name === 'save');
54
+ if (!saveCommand?.schema) {
55
+ throw new Error('saveCommand schema is not configured');
56
+ }
57
+ const handler = createCompletionHandler(saveCommand.schema);
58
+ return handler(createContext(), input, fullLine);
59
+ };
60
+ describe('subagent schema resolver integration @plan:PLAN-20250214-AUTOCOMPLETE.P08 @requirement:REQ-002 @requirement:REQ-003 @requirement:REQ-005', () => {
61
+ it('exposes create alias for save command', () => {
62
+ const saveCommand = subagentCommand.subCommands?.find((cmd) => cmd.name === 'save');
63
+ expect(saveCommand?.altNames).toEqual(expect.arrayContaining(['create']));
64
+ });
65
+ it('suggests subagent names with hint on first argument', async () => {
66
+ const result = await invoke('/subagent save ', {
67
+ args: '',
68
+ completedArgs: [],
69
+ partialArg: '',
70
+ commandPathLength: 2,
71
+ });
72
+ expect(result.suggestions).toEqual([
73
+ { value: 'agent1', description: 'Profile: default' },
74
+ { value: 'agent2', description: 'Profile: custom' },
75
+ { value: 'code-helper', description: 'Profile: coding' },
76
+ ]);
77
+ expect(result.hint).toBe('Enter subagent name');
78
+ expect(result.position).toBe(1);
79
+ });
80
+ it('filters name suggestions by partial token', async () => {
81
+ const result = await invoke('/subagent save a', {
82
+ args: 'a',
83
+ completedArgs: [],
84
+ partialArg: 'a',
85
+ commandPathLength: 2,
86
+ });
87
+ expect(result.suggestions.map((s) => s.value)).toEqual([
88
+ 'agent1',
89
+ 'agent2',
90
+ ]);
91
+ expect(result.hint).toBe('Enter subagent name');
92
+ });
93
+ it('advances to profile options after name supplied', async () => {
94
+ const result = await invoke('/subagent save agent1 ', {
95
+ args: 'agent1 ',
96
+ completedArgs: ['agent1'],
97
+ partialArg: '',
98
+ commandPathLength: 2,
99
+ });
100
+ expect(result.suggestions.map((s) => s.value)).toEqual(mockProfiles);
101
+ expect(result.hint).toBe('Select profile configuration');
102
+ expect(result.position).toBe(2);
103
+ });
104
+ it('surfaces literal mode choices after profile selection', async () => {
105
+ const result = await invoke('/subagent save agent1 default ', {
106
+ args: 'agent1 default ',
107
+ completedArgs: ['agent1', 'default'],
108
+ partialArg: '',
109
+ commandPathLength: 2,
110
+ });
111
+ expect(result.suggestions.map((s) => s.value)).toEqual(['auto', 'manual']);
112
+ expect(result.hint).toBe('Select mode');
113
+ });
114
+ it('requests prompt text after auto literal and trailing space', async () => {
115
+ const result = await invoke('/subagent save agent1 default auto ', {
116
+ args: 'agent1 default auto ',
117
+ completedArgs: ['agent1', 'default', 'auto'],
118
+ partialArg: '',
119
+ commandPathLength: 2,
120
+ });
121
+ expect(result.suggestions).toEqual([]);
122
+ expect(result.hint).toBe('Enter system prompt for automatic mode');
123
+ });
124
+ });
125
+ //# sourceMappingURL=subagentCommand.schema.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagentCommand.schema.test.js","sourceRoot":"","sources":["../../../../../src/ui/commands/test/subagentCommand.schema.test.ts"],"names":[],"mappings":"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"}