centaurus-cli 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (338) hide show
  1. package/AUTH_FLOW.md +138 -0
  2. package/CONFIG_GUIDE.md +255 -0
  3. package/LICENSE +21 -0
  4. package/README.md +346 -0
  5. package/dist/ai/provider-factory.d.ts +6 -0
  6. package/dist/ai/provider-factory.d.ts.map +1 -0
  7. package/dist/ai/provider-factory.js +27 -0
  8. package/dist/ai/provider-factory.js.map +1 -0
  9. package/dist/ai/providers/base.d.ts +25 -0
  10. package/dist/ai/providers/base.d.ts.map +1 -0
  11. package/dist/ai/providers/base.js +9 -0
  12. package/dist/ai/providers/base.js.map +1 -0
  13. package/dist/ai/providers/gemini.d.ts +34 -0
  14. package/dist/ai/providers/gemini.d.ts.map +1 -0
  15. package/dist/ai/providers/gemini.js +146 -0
  16. package/dist/ai/providers/gemini.js.map +1 -0
  17. package/dist/ai/types.d.ts +20 -0
  18. package/dist/ai/types.d.ts.map +1 -0
  19. package/dist/ai/types.js +2 -0
  20. package/dist/ai/types.js.map +1 -0
  21. package/dist/cli-adapter.d.ts +78 -0
  22. package/dist/cli-adapter.d.ts.map +1 -0
  23. package/dist/cli-adapter.js +605 -0
  24. package/dist/cli-adapter.js.map +1 -0
  25. package/dist/commands/CommandParser.d.ts +27 -0
  26. package/dist/commands/CommandParser.d.ts.map +1 -0
  27. package/dist/commands/CommandParser.js +238 -0
  28. package/dist/commands/CommandParser.js.map +1 -0
  29. package/dist/config/ConfigManager.d.ts +59 -0
  30. package/dist/config/ConfigManager.d.ts.map +1 -0
  31. package/dist/config/ConfigManager.js +332 -0
  32. package/dist/config/ConfigManager.js.map +1 -0
  33. package/dist/config/defaultConfig.d.ts +82 -0
  34. package/dist/config/defaultConfig.d.ts.map +1 -0
  35. package/dist/config/defaultConfig.js +88 -0
  36. package/dist/config/defaultConfig.js.map +1 -0
  37. package/dist/config/manager.d.ts +60 -0
  38. package/dist/config/manager.d.ts.map +1 -0
  39. package/dist/config/manager.js +162 -0
  40. package/dist/config/manager.js.map +1 -0
  41. package/dist/config/types.d.ts +9 -0
  42. package/dist/config/types.d.ts.map +1 -0
  43. package/dist/config/types.js +6 -0
  44. package/dist/config/types.js.map +1 -0
  45. package/dist/index-custom.d.ts +3 -0
  46. package/dist/index-custom.d.ts.map +1 -0
  47. package/dist/index-custom.js +65 -0
  48. package/dist/index-custom.js.map +1 -0
  49. package/dist/index.d.ts +3 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +102 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/prompts/system-prompt.d.ts +47 -0
  54. package/dist/prompts/system-prompt.d.ts.map +1 -0
  55. package/dist/prompts/system-prompt.js +378 -0
  56. package/dist/prompts/system-prompt.js.map +1 -0
  57. package/dist/providers/GoogleProvider.d.ts +26 -0
  58. package/dist/providers/GoogleProvider.d.ts.map +1 -0
  59. package/dist/providers/GoogleProvider.js +313 -0
  60. package/dist/providers/GoogleProvider.js.map +1 -0
  61. package/dist/providers/Provider.d.ts +114 -0
  62. package/dist/providers/Provider.d.ts.map +1 -0
  63. package/dist/providers/Provider.js +44 -0
  64. package/dist/providers/Provider.js.map +1 -0
  65. package/dist/services/api-client.d.ts +282 -0
  66. package/dist/services/api-client.d.ts.map +1 -0
  67. package/dist/services/api-client.js +339 -0
  68. package/dist/services/api-client.js.map +1 -0
  69. package/dist/services/auth-handler.d.ts +30 -0
  70. package/dist/services/auth-handler.d.ts.map +1 -0
  71. package/dist/services/auth-handler.js +210 -0
  72. package/dist/services/auth-handler.js.map +1 -0
  73. package/dist/services/conversation-manager.d.ts +73 -0
  74. package/dist/services/conversation-manager.d.ts.map +1 -0
  75. package/dist/services/conversation-manager.js +128 -0
  76. package/dist/services/conversation-manager.js.map +1 -0
  77. package/dist/tests/automated-verification.d.ts +27 -0
  78. package/dist/tests/automated-verification.d.ts.map +1 -0
  79. package/dist/tests/automated-verification.js +359 -0
  80. package/dist/tests/automated-verification.js.map +1 -0
  81. package/dist/tests/integration-tests.d.ts +50 -0
  82. package/dist/tests/integration-tests.d.ts.map +1 -0
  83. package/dist/tests/integration-tests.js +648 -0
  84. package/dist/tests/integration-tests.js.map +1 -0
  85. package/dist/tools/ToolRegistry.d.ts +44 -0
  86. package/dist/tools/ToolRegistry.d.ts.map +1 -0
  87. package/dist/tools/ToolRegistry.js +494 -0
  88. package/dist/tools/ToolRegistry.js.map +1 -0
  89. package/dist/tools/command.d.ts +4 -0
  90. package/dist/tools/command.d.ts.map +1 -0
  91. package/dist/tools/command.js +117 -0
  92. package/dist/tools/command.js.map +1 -0
  93. package/dist/tools/file-ops-test.d.ts +6 -0
  94. package/dist/tools/file-ops-test.d.ts.map +1 -0
  95. package/dist/tools/file-ops-test.js +197 -0
  96. package/dist/tools/file-ops-test.js.map +1 -0
  97. package/dist/tools/file-ops.d.ts +6 -0
  98. package/dist/tools/file-ops.d.ts.map +1 -0
  99. package/dist/tools/file-ops.js +189 -0
  100. package/dist/tools/file-ops.js.map +1 -0
  101. package/dist/tools/plan-mode.d.ts +53 -0
  102. package/dist/tools/plan-mode.d.ts.map +1 -0
  103. package/dist/tools/plan-mode.js +202 -0
  104. package/dist/tools/plan-mode.js.map +1 -0
  105. package/dist/tools/registry.d.ts +30 -0
  106. package/dist/tools/registry.d.ts.map +1 -0
  107. package/dist/tools/registry.js +67 -0
  108. package/dist/tools/registry.js.map +1 -0
  109. package/dist/tools/types.d.ts +34 -0
  110. package/dist/tools/types.d.ts.map +1 -0
  111. package/dist/tools/types.js +2 -0
  112. package/dist/tools/types.js.map +1 -0
  113. package/dist/tools/web-search.d.ts +24 -0
  114. package/dist/tools/web-search.d.ts.map +1 -0
  115. package/dist/tools/web-search.js +194 -0
  116. package/dist/tools/web-search.js.map +1 -0
  117. package/dist/types/index.d.ts +32 -0
  118. package/dist/types/index.d.ts.map +1 -0
  119. package/dist/types/index.js +2 -0
  120. package/dist/types/index.js.map +1 -0
  121. package/dist/ui/DisplayHistory.d.ts +53 -0
  122. package/dist/ui/DisplayHistory.d.ts.map +1 -0
  123. package/dist/ui/DisplayHistory.js +82 -0
  124. package/dist/ui/DisplayHistory.js.map +1 -0
  125. package/dist/ui/clack-ui.d.ts +83 -0
  126. package/dist/ui/clack-ui.d.ts.map +1 -0
  127. package/dist/ui/clack-ui.js +304 -0
  128. package/dist/ui/clack-ui.js.map +1 -0
  129. package/dist/ui/components/App.d.ts +47 -0
  130. package/dist/ui/components/App.d.ts.map +1 -0
  131. package/dist/ui/components/App.js +389 -0
  132. package/dist/ui/components/App.js.map +1 -0
  133. package/dist/ui/components/AuthScreen.d.ts +8 -0
  134. package/dist/ui/components/AuthScreen.d.ts.map +1 -0
  135. package/dist/ui/components/AuthScreen.js +37 -0
  136. package/dist/ui/components/AuthScreen.js.map +1 -0
  137. package/dist/ui/components/AuthWelcomeScreen.d.ts +8 -0
  138. package/dist/ui/components/AuthWelcomeScreen.d.ts.map +1 -0
  139. package/dist/ui/components/AuthWelcomeScreen.js +34 -0
  140. package/dist/ui/components/AuthWelcomeScreen.js.map +1 -0
  141. package/dist/ui/components/CodeBlock.d.ts +9 -0
  142. package/dist/ui/components/CodeBlock.d.ts.map +1 -0
  143. package/dist/ui/components/CodeBlock.js +22 -0
  144. package/dist/ui/components/CodeBlock.js.map +1 -0
  145. package/dist/ui/components/ConfigViewer.d.ts +11 -0
  146. package/dist/ui/components/ConfigViewer.d.ts.map +1 -0
  147. package/dist/ui/components/ConfigViewer.js +27 -0
  148. package/dist/ui/components/ConfigViewer.js.map +1 -0
  149. package/dist/ui/components/ConfirmPrompt.d.ts +11 -0
  150. package/dist/ui/components/ConfirmPrompt.d.ts.map +1 -0
  151. package/dist/ui/components/ConfirmPrompt.js +55 -0
  152. package/dist/ui/components/ConfirmPrompt.js.map +1 -0
  153. package/dist/ui/components/DiffViewer.d.ts +8 -0
  154. package/dist/ui/components/DiffViewer.d.ts.map +1 -0
  155. package/dist/ui/components/DiffViewer.js +63 -0
  156. package/dist/ui/components/DiffViewer.js.map +1 -0
  157. package/dist/ui/components/DisplayItemRenderer.d.ts +18 -0
  158. package/dist/ui/components/DisplayItemRenderer.d.ts.map +1 -0
  159. package/dist/ui/components/DisplayItemRenderer.js +53 -0
  160. package/dist/ui/components/DisplayItemRenderer.js.map +1 -0
  161. package/dist/ui/components/DynamicMessage.d.ts +13 -0
  162. package/dist/ui/components/DynamicMessage.d.ts.map +1 -0
  163. package/dist/ui/components/DynamicMessage.js +27 -0
  164. package/dist/ui/components/DynamicMessage.js.map +1 -0
  165. package/dist/ui/components/ErrorBoundary.d.ts +16 -0
  166. package/dist/ui/components/ErrorBoundary.d.ts.map +1 -0
  167. package/dist/ui/components/ErrorBoundary.js +25 -0
  168. package/dist/ui/components/ErrorBoundary.js.map +1 -0
  169. package/dist/ui/components/FileOperation.d.ts +10 -0
  170. package/dist/ui/components/FileOperation.d.ts.map +1 -0
  171. package/dist/ui/components/FileOperation.js +31 -0
  172. package/dist/ui/components/FileOperation.js.map +1 -0
  173. package/dist/ui/components/InputBox.d.ts +12 -0
  174. package/dist/ui/components/InputBox.d.ts.map +1 -0
  175. package/dist/ui/components/InputBox.js +50 -0
  176. package/dist/ui/components/InputBox.js.map +1 -0
  177. package/dist/ui/components/KeyboardHelp.d.ts +7 -0
  178. package/dist/ui/components/KeyboardHelp.d.ts.map +1 -0
  179. package/dist/ui/components/KeyboardHelp.js +25 -0
  180. package/dist/ui/components/KeyboardHelp.js.map +1 -0
  181. package/dist/ui/components/LoadingIndicator.d.ts +3 -0
  182. package/dist/ui/components/LoadingIndicator.d.ts.map +1 -0
  183. package/dist/ui/components/LoadingIndicator.js +25 -0
  184. package/dist/ui/components/LoadingIndicator.js.map +1 -0
  185. package/dist/ui/components/MarkdownRenderer.d.ts +8 -0
  186. package/dist/ui/components/MarkdownRenderer.d.ts.map +1 -0
  187. package/dist/ui/components/MarkdownRenderer.js +96 -0
  188. package/dist/ui/components/MarkdownRenderer.js.map +1 -0
  189. package/dist/ui/components/MessageBox.d.ts +10 -0
  190. package/dist/ui/components/MessageBox.d.ts.map +1 -0
  191. package/dist/ui/components/MessageBox.js +50 -0
  192. package/dist/ui/components/MessageBox.js.map +1 -0
  193. package/dist/ui/components/MessageDisplay.d.ts +8 -0
  194. package/dist/ui/components/MessageDisplay.d.ts.map +1 -0
  195. package/dist/ui/components/MessageDisplay.js +43 -0
  196. package/dist/ui/components/MessageDisplay.js.map +1 -0
  197. package/dist/ui/components/ScrollableContent.d.ts +7 -0
  198. package/dist/ui/components/ScrollableContent.d.ts.map +1 -0
  199. package/dist/ui/components/ScrollableContent.js +6 -0
  200. package/dist/ui/components/ScrollableContent.js.map +1 -0
  201. package/dist/ui/components/ScrollableMessageList.d.ts +10 -0
  202. package/dist/ui/components/ScrollableMessageList.d.ts.map +1 -0
  203. package/dist/ui/components/ScrollableMessageList.js +133 -0
  204. package/dist/ui/components/ScrollableMessageList.js.map +1 -0
  205. package/dist/ui/components/ScrollableScreen.d.ts +9 -0
  206. package/dist/ui/components/ScrollableScreen.d.ts.map +1 -0
  207. package/dist/ui/components/ScrollableScreen.js +22 -0
  208. package/dist/ui/components/ScrollableScreen.js.map +1 -0
  209. package/dist/ui/components/SelectPrompt.d.ts +12 -0
  210. package/dist/ui/components/SelectPrompt.d.ts.map +1 -0
  211. package/dist/ui/components/SelectPrompt.js +10 -0
  212. package/dist/ui/components/SelectPrompt.js.map +1 -0
  213. package/dist/ui/components/StaticMessageHistory.d.ts +14 -0
  214. package/dist/ui/components/StaticMessageHistory.d.ts.map +1 -0
  215. package/dist/ui/components/StaticMessageHistory.js +19 -0
  216. package/dist/ui/components/StaticMessageHistory.js.map +1 -0
  217. package/dist/ui/components/StatusBar.d.ts +10 -0
  218. package/dist/ui/components/StatusBar.d.ts.map +1 -0
  219. package/dist/ui/components/StatusBar.js +20 -0
  220. package/dist/ui/components/StatusBar.js.map +1 -0
  221. package/dist/ui/components/StreamingMessageDisplay.d.ts +13 -0
  222. package/dist/ui/components/StreamingMessageDisplay.d.ts.map +1 -0
  223. package/dist/ui/components/StreamingMessageDisplay.js +26 -0
  224. package/dist/ui/components/StreamingMessageDisplay.js.map +1 -0
  225. package/dist/ui/components/ToolExecutionMessage.d.ts +8 -0
  226. package/dist/ui/components/ToolExecutionMessage.d.ts.map +1 -0
  227. package/dist/ui/components/ToolExecutionMessage.js +189 -0
  228. package/dist/ui/components/ToolExecutionMessage.js.map +1 -0
  229. package/dist/ui/components/ToolExecutionStatus.d.ts +10 -0
  230. package/dist/ui/components/ToolExecutionStatus.d.ts.map +1 -0
  231. package/dist/ui/components/ToolExecutionStatus.js +65 -0
  232. package/dist/ui/components/ToolExecutionStatus.js.map +1 -0
  233. package/dist/ui/components/ToolResult.d.ts +10 -0
  234. package/dist/ui/components/ToolResult.d.ts.map +1 -0
  235. package/dist/ui/components/ToolResult.js +17 -0
  236. package/dist/ui/components/ToolResult.js.map +1 -0
  237. package/dist/ui/components/WelcomeBanner.d.ts +3 -0
  238. package/dist/ui/components/WelcomeBanner.d.ts.map +1 -0
  239. package/dist/ui/components/WelcomeBanner.js +28 -0
  240. package/dist/ui/components/WelcomeBanner.js.map +1 -0
  241. package/dist/ui/components/code-block.d.ts +10 -0
  242. package/dist/ui/components/code-block.d.ts.map +1 -0
  243. package/dist/ui/components/code-block.js +74 -0
  244. package/dist/ui/components/code-block.js.map +1 -0
  245. package/dist/ui/components/confirm-prompt.d.ts +12 -0
  246. package/dist/ui/components/confirm-prompt.d.ts.map +1 -0
  247. package/dist/ui/components/confirm-prompt.js +104 -0
  248. package/dist/ui/components/confirm-prompt.js.map +1 -0
  249. package/dist/ui/components/diff-viewer.d.ts +9 -0
  250. package/dist/ui/components/diff-viewer.d.ts.map +1 -0
  251. package/dist/ui/components/diff-viewer.js +57 -0
  252. package/dist/ui/components/diff-viewer.js.map +1 -0
  253. package/dist/ui/components/input-box.d.ts +18 -0
  254. package/dist/ui/components/input-box.d.ts.map +1 -0
  255. package/dist/ui/components/input-box.js +157 -0
  256. package/dist/ui/components/input-box.js.map +1 -0
  257. package/dist/ui/components/keyboard-help.d.ts +7 -0
  258. package/dist/ui/components/keyboard-help.d.ts.map +1 -0
  259. package/dist/ui/components/keyboard-help.js +43 -0
  260. package/dist/ui/components/keyboard-help.js.map +1 -0
  261. package/dist/ui/components/loading-indicator.d.ts +3 -0
  262. package/dist/ui/components/loading-indicator.d.ts.map +1 -0
  263. package/dist/ui/components/loading-indicator.js +42 -0
  264. package/dist/ui/components/loading-indicator.js.map +1 -0
  265. package/dist/ui/components/message-display.d.ts +7 -0
  266. package/dist/ui/components/message-display.d.ts.map +1 -0
  267. package/dist/ui/components/message-display.js +104 -0
  268. package/dist/ui/components/message-display.js.map +1 -0
  269. package/dist/ui/components/misc.d.ts +28 -0
  270. package/dist/ui/components/misc.d.ts.map +1 -0
  271. package/dist/ui/components/misc.js +128 -0
  272. package/dist/ui/components/misc.js.map +1 -0
  273. package/dist/ui/components/select-prompt.d.ts +13 -0
  274. package/dist/ui/components/select-prompt.d.ts.map +1 -0
  275. package/dist/ui/components/select-prompt.js +42 -0
  276. package/dist/ui/components/select-prompt.js.map +1 -0
  277. package/dist/ui/components/status-bar.d.ts +11 -0
  278. package/dist/ui/components/status-bar.d.ts.map +1 -0
  279. package/dist/ui/components/status-bar.js +47 -0
  280. package/dist/ui/components/status-bar.js.map +1 -0
  281. package/dist/ui/components/tool-execution.d.ts +3 -0
  282. package/dist/ui/components/tool-execution.d.ts.map +1 -0
  283. package/dist/ui/components/tool-execution.js +374 -0
  284. package/dist/ui/components/tool-execution.js.map +1 -0
  285. package/dist/ui/components/tool-result.d.ts +11 -0
  286. package/dist/ui/components/tool-result.d.ts.map +1 -0
  287. package/dist/ui/components/tool-result.js +58 -0
  288. package/dist/ui/components/tool-result.js.map +1 -0
  289. package/dist/ui/components/welcome-banner.d.ts +3 -0
  290. package/dist/ui/components/welcome-banner.d.ts.map +1 -0
  291. package/dist/ui/components/welcome-banner.js +46 -0
  292. package/dist/ui/components/welcome-banner.js.map +1 -0
  293. package/dist/ui/hooks/useDisplayHistory.d.ts +13 -0
  294. package/dist/ui/hooks/useDisplayHistory.d.ts.map +1 -0
  295. package/dist/ui/hooks/useDisplayHistory.js +45 -0
  296. package/dist/ui/hooks/useDisplayHistory.js.map +1 -0
  297. package/dist/ui/render-engine.d.ts +69 -0
  298. package/dist/ui/render-engine.d.ts.map +1 -0
  299. package/dist/ui/render-engine.js +197 -0
  300. package/dist/ui/render-engine.js.map +1 -0
  301. package/dist/ui/terminal/TerminalRenderer.d.ts +84 -0
  302. package/dist/ui/terminal/TerminalRenderer.d.ts.map +1 -0
  303. package/dist/ui/terminal/TerminalRenderer.js +154 -0
  304. package/dist/ui/terminal/TerminalRenderer.js.map +1 -0
  305. package/dist/ui/terminal/TerminalUI.d.ts +139 -0
  306. package/dist/ui/terminal/TerminalUI.d.ts.map +1 -0
  307. package/dist/ui/terminal/TerminalUI.js +430 -0
  308. package/dist/ui/terminal/TerminalUI.js.map +1 -0
  309. package/dist/ui/terminal/VirtualChatBuffer.d.ts +32 -0
  310. package/dist/ui/terminal/VirtualChatBuffer.d.ts.map +1 -0
  311. package/dist/ui/terminal/VirtualChatBuffer.js +37 -0
  312. package/dist/ui/terminal/VirtualChatBuffer.js.map +1 -0
  313. package/dist/ui/terminal-kit-base.d.ts +117 -0
  314. package/dist/ui/terminal-kit-base.d.ts.map +1 -0
  315. package/dist/ui/terminal-kit-base.js +188 -0
  316. package/dist/ui/terminal-kit-base.js.map +1 -0
  317. package/dist/utils/file.d.ts +21 -0
  318. package/dist/utils/file.d.ts.map +1 -0
  319. package/dist/utils/file.js +68 -0
  320. package/dist/utils/file.js.map +1 -0
  321. package/dist/utils/logger.d.ts +17 -0
  322. package/dist/utils/logger.d.ts.map +1 -0
  323. package/dist/utils/logger.js +57 -0
  324. package/dist/utils/logger.js.map +1 -0
  325. package/dist/utils/markdown-parser.d.ts +56 -0
  326. package/dist/utils/markdown-parser.d.ts.map +1 -0
  327. package/dist/utils/markdown-parser.js +307 -0
  328. package/dist/utils/markdown-parser.js.map +1 -0
  329. package/dist/utils/shell.d.ts +7 -0
  330. package/dist/utils/shell.d.ts.map +1 -0
  331. package/dist/utils/shell.js +62 -0
  332. package/dist/utils/shell.js.map +1 -0
  333. package/dist/utils/state.d.ts +13 -0
  334. package/dist/utils/state.d.ts.map +1 -0
  335. package/dist/utils/state.js +25 -0
  336. package/dist/utils/state.js.map +1 -0
  337. package/package.json +81 -0
  338. package/postinstall.js +46 -0
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Command Parser
3
+ * Handles parsing and routing of slash commands
4
+ */
5
+ export interface Command {
6
+ name: string;
7
+ description: string;
8
+ aliases?: string[];
9
+ execute: (args: string[]) => Promise<CommandResult>;
10
+ }
11
+ export interface CommandResult {
12
+ success: boolean;
13
+ message?: string;
14
+ action?: 'exit' | 'clear' | 'show-help' | 'show-config' | 'show-model-picker' | 'show-provider-picker' | 'toggle-plan-mode';
15
+ data?: any;
16
+ }
17
+ export declare class CommandParser {
18
+ private commands;
19
+ constructor();
20
+ private registerDefaultCommands;
21
+ register(command: Command): void;
22
+ parse(input: string): Promise<CommandResult | null>;
23
+ getHelp(): string;
24
+ isCommand(input: string): boolean;
25
+ }
26
+ export default CommandParser;
27
+ //# sourceMappingURL=CommandParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandParser.d.ts","sourceRoot":"","sources":["../../src/commands/CommandParser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,WAAW,GAAG,aAAa,GAAG,mBAAmB,GAAG,sBAAsB,GAAG,kBAAkB,CAAC;IAC5H,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAmC;;IAMnD,OAAO,CAAC,uBAAuB;IAiL/B,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAU1B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IA+BzD,OAAO,IAAI,MAAM;IA8BjB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAGlC;AAED,eAAe,aAAa,CAAC"}
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Command Parser
3
+ * Handles parsing and routing of slash commands
4
+ */
5
+ export class CommandParser {
6
+ commands = new Map();
7
+ constructor() {
8
+ this.registerDefaultCommands();
9
+ }
10
+ registerDefaultCommands() {
11
+ // Register built-in commands
12
+ this.register({
13
+ name: 'help',
14
+ description: 'Show available commands',
15
+ aliases: ['h', '?'],
16
+ execute: async () => ({
17
+ success: true,
18
+ action: 'show-help',
19
+ data: this.getHelp()
20
+ })
21
+ });
22
+ this.register({
23
+ name: 'model',
24
+ description: 'Select AI model',
25
+ aliases: ['m'],
26
+ execute: async (args) => {
27
+ if (args.length > 0) {
28
+ // Direct model selection
29
+ return {
30
+ success: true,
31
+ data: { model: args.join(' ') }
32
+ };
33
+ }
34
+ // Show model picker
35
+ return {
36
+ success: true,
37
+ action: 'show-model-picker'
38
+ };
39
+ }
40
+ });
41
+ this.register({
42
+ name: 'provider',
43
+ description: 'Select AI provider',
44
+ aliases: ['p'],
45
+ execute: async (args) => {
46
+ if (args.length > 0) {
47
+ return {
48
+ success: true,
49
+ data: { provider: args[0] }
50
+ };
51
+ }
52
+ return {
53
+ success: true,
54
+ action: 'show-provider-picker'
55
+ };
56
+ }
57
+ });
58
+ this.register({
59
+ name: 'config',
60
+ description: 'View or edit configuration',
61
+ aliases: ['c', 'settings'],
62
+ execute: async (args) => {
63
+ if (args.length === 0) {
64
+ return {
65
+ success: true,
66
+ action: 'show-config'
67
+ };
68
+ }
69
+ // Handle config set command
70
+ if (args[0] === 'set' && args.length >= 3) {
71
+ const key = args[1];
72
+ const value = args.slice(2).join(' ');
73
+ return {
74
+ success: true,
75
+ data: { action: 'set', key, value }
76
+ };
77
+ }
78
+ // Handle config reset
79
+ if (args[0] === 'reset') {
80
+ return {
81
+ success: true,
82
+ data: { action: 'reset' }
83
+ };
84
+ }
85
+ return {
86
+ success: false,
87
+ message: 'Usage: /config [set <key> <value> | reset]'
88
+ };
89
+ }
90
+ });
91
+ this.register({
92
+ name: 'clear',
93
+ description: 'Clear conversation history',
94
+ aliases: ['cls', 'reset'],
95
+ execute: async () => ({
96
+ success: true,
97
+ action: 'clear'
98
+ })
99
+ });
100
+ this.register({
101
+ name: 'exit',
102
+ description: 'Exit Centaurus CLI',
103
+ aliases: ['quit', 'q'],
104
+ execute: async () => ({
105
+ success: true,
106
+ action: 'exit'
107
+ })
108
+ });
109
+ this.register({
110
+ name: 'session',
111
+ description: 'Manage sessions',
112
+ aliases: ['s'],
113
+ execute: async (args) => {
114
+ if (args.length === 0) {
115
+ return {
116
+ success: true,
117
+ message: 'Usage: /session [save|load|list|export]'
118
+ };
119
+ }
120
+ const subcommand = args[0];
121
+ switch (subcommand) {
122
+ case 'save':
123
+ return {
124
+ success: true,
125
+ data: { action: 'save', name: args[1] || `session-${Date.now()}` }
126
+ };
127
+ case 'load':
128
+ if (args.length < 2) {
129
+ return {
130
+ success: false,
131
+ message: 'Please specify session name to load'
132
+ };
133
+ }
134
+ return {
135
+ success: true,
136
+ data: { action: 'load', name: args[1] }
137
+ };
138
+ case 'list':
139
+ return {
140
+ success: true,
141
+ data: { action: 'list' }
142
+ };
143
+ case 'export':
144
+ return {
145
+ success: true,
146
+ data: { action: 'export', format: args[1] || 'markdown' }
147
+ };
148
+ default:
149
+ return {
150
+ success: false,
151
+ message: `Unknown session command: ${subcommand}`
152
+ };
153
+ }
154
+ }
155
+ });
156
+ this.register({
157
+ name: 'tools',
158
+ description: 'List available tools',
159
+ aliases: ['t'],
160
+ execute: async () => ({
161
+ success: true,
162
+ data: { action: 'list-tools' }
163
+ })
164
+ });
165
+ this.register({
166
+ name: 'plan',
167
+ description: 'Toggle plan mode for complex implementations',
168
+ execute: async () => ({
169
+ success: true,
170
+ action: 'toggle-plan-mode'
171
+ })
172
+ });
173
+ }
174
+ register(command) {
175
+ this.commands.set(command.name, command);
176
+ // Also register aliases
177
+ if (command.aliases) {
178
+ for (const alias of command.aliases) {
179
+ this.commands.set(alias, command);
180
+ }
181
+ }
182
+ }
183
+ async parse(input) {
184
+ if (!input.startsWith('/')) {
185
+ return null;
186
+ }
187
+ const parts = input.slice(1).trim().split(/\s+/);
188
+ if (parts.length === 0 || parts[0] === '') {
189
+ return null;
190
+ }
191
+ const commandName = parts[0].toLowerCase();
192
+ const args = parts.slice(1);
193
+ const command = this.commands.get(commandName);
194
+ if (!command) {
195
+ return {
196
+ success: false,
197
+ message: `Unknown command: ${commandName}. Type /help for available commands.`
198
+ };
199
+ }
200
+ try {
201
+ return await command.execute(args);
202
+ }
203
+ catch (error) {
204
+ return {
205
+ success: false,
206
+ message: `Error executing command: ${error.message}`
207
+ };
208
+ }
209
+ }
210
+ getHelp() {
211
+ const uniqueCommands = new Map();
212
+ // Get unique commands (skip aliases)
213
+ for (const [name, command] of this.commands) {
214
+ if (name === command.name) {
215
+ uniqueCommands.set(name, command);
216
+ }
217
+ }
218
+ let help = '📚 **Available Commands:**\n\n';
219
+ for (const command of uniqueCommands.values()) {
220
+ const aliases = command.aliases ? ` (${command.aliases.join(', ')})` : '';
221
+ help += ` **/${command.name}${aliases}** - ${command.description}\n`;
222
+ }
223
+ help += '\n⌨️ **Keyboard Shortcuts:**\n';
224
+ help += ' **Ctrl+T** - Toggle auto-accept mode\n';
225
+ help += ' **Ctrl+C** - Exit application\n';
226
+ help += ' **?** - Show this help\n';
227
+ help += '\n💡 **Examples:**\n';
228
+ help += ' `/model gemini-2.0-flash-exp` - Switch to a specific model\n';
229
+ help += ' `/config set autoAccept true` - Enable auto-accept mode\n';
230
+ help += ' `/session save my-work` - Save current session\n';
231
+ return help;
232
+ }
233
+ isCommand(input) {
234
+ return input.startsWith('/');
235
+ }
236
+ }
237
+ export default CommandParser;
238
+ //# sourceMappingURL=CommandParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandParser.js","sourceRoot":"","sources":["../../src/commands/CommandParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Configuration Manager
3
+ * Handles user preferences, API keys, and settings
4
+ * Syncs with backend API when authenticated
5
+ */
6
+ import { CentaurusConfig } from './defaultConfig.js';
7
+ export declare class ConfigManager {
8
+ private static instance;
9
+ private configPath;
10
+ private config;
11
+ private encryptionKey;
12
+ private useBackendSync;
13
+ private constructor();
14
+ static getInstance(): ConfigManager;
15
+ private getMachineKey;
16
+ private encrypt;
17
+ private decrypt;
18
+ initialize(): Promise<void>;
19
+ /**
20
+ * Enable backend synchronization
21
+ */
22
+ enableBackendSync(): void;
23
+ /**
24
+ * Disable backend synchronization
25
+ */
26
+ disableBackendSync(): void;
27
+ /**
28
+ * Sync settings from backend
29
+ */
30
+ private syncFromBackend;
31
+ /**
32
+ * Sync settings to backend
33
+ */
34
+ private syncToBackend;
35
+ private ensureConfigDir;
36
+ load(): Promise<void>;
37
+ save(): Promise<void>;
38
+ get(key: keyof CentaurusConfig): any;
39
+ getAll(): CentaurusConfig;
40
+ getProvider(): string;
41
+ getModel(): string;
42
+ getApiKey(provider?: string): string | undefined;
43
+ isAutoAcceptEnabled(): boolean;
44
+ getTheme(): string;
45
+ set<K extends keyof CentaurusConfig>(key: K, value: CentaurusConfig[K]): Promise<void>;
46
+ setProvider(provider: string): Promise<void>;
47
+ setModel(model: string): Promise<void>;
48
+ setApiKey(provider: string, apiKey: string): Promise<void>;
49
+ setAutoAccept(enabled: boolean): Promise<void>;
50
+ setTheme(theme: string): Promise<void>;
51
+ validateConfig(): {
52
+ valid: boolean;
53
+ errors: string[];
54
+ };
55
+ reset(): Promise<void>;
56
+ exportConfig(): object;
57
+ }
58
+ export default ConfigManager;
59
+ //# sourceMappingURL=ConfigManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigManager.d.ts","sourceRoot":"","sources":["../../src/config/ConfigManager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAiB,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGpE,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IACvC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,cAAc,CAAkB;IAExC,OAAO;IASP,MAAM,CAAC,WAAW,IAAI,aAAa;IAOnC,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,OAAO;IAaf,OAAO,CAAC,OAAO;IAuBT,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBjC;;OAEG;IACH,iBAAiB,IAAI,IAAI;IAIzB;;OAEG;IACH,kBAAkB,IAAI,IAAI;IAI1B;;OAEG;YACW,eAAe;IA8B7B;;OAEG;YACW,aAAa;YAkBb,eAAe;IASvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB3B,GAAG,CAAC,GAAG,EAAE,MAAM,eAAe,GAAG,GAAG;IAIpC,MAAM,IAAI,eAAe;IAKzB,WAAW,IAAI,MAAM;IAIrB,QAAQ,IAAI,MAAM;IAIlB,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAchD,mBAAmB,IAAI,OAAO;IAI9B,QAAQ,IAAI,MAAM;IAKZ,GAAG,CAAC,CAAC,SAAS,MAAM,eAAe,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtF,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS5C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgC1D,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5C,cAAc,IAAI;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAuBhD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,YAAY,IAAI,MAAM;CAgBvB;AAED,eAAe,aAAa,CAAC"}
@@ -0,0 +1,332 @@
1
+ /**
2
+ * Configuration Manager
3
+ * Handles user preferences, API keys, and settings
4
+ * Syncs with backend API when authenticated
5
+ */
6
+ import * as fs from 'fs/promises';
7
+ import * as path from 'path';
8
+ import * as os from 'os';
9
+ import * as crypto from 'crypto';
10
+ import { defaultConfig } from './defaultConfig.js';
11
+ import { apiClient } from '../services/api-client.js';
12
+ export class ConfigManager {
13
+ static instance;
14
+ configPath;
15
+ config;
16
+ encryptionKey;
17
+ useBackendSync = false;
18
+ constructor() {
19
+ const configDir = path.join(os.homedir(), '.centaurus');
20
+ this.configPath = path.join(configDir, 'config.json');
21
+ this.config = { ...defaultConfig };
22
+ // Generate encryption key based on machine ID
23
+ this.encryptionKey = this.getMachineKey();
24
+ }
25
+ static getInstance() {
26
+ if (!ConfigManager.instance) {
27
+ ConfigManager.instance = new ConfigManager();
28
+ }
29
+ return ConfigManager.instance;
30
+ }
31
+ getMachineKey() {
32
+ // Use a combination of hostname and username for encryption key
33
+ const hostname = os.hostname();
34
+ const username = os.userInfo().username;
35
+ return crypto.createHash('sha256')
36
+ .update(`${hostname}:${username}:centaurus`)
37
+ .digest('hex')
38
+ .substring(0, 32);
39
+ }
40
+ encrypt(text) {
41
+ const algorithm = 'aes-256-gcm';
42
+ const iv = crypto.randomBytes(16);
43
+ const cipher = crypto.createCipheriv(algorithm, Buffer.from(this.encryptionKey), iv);
44
+ let encrypted = cipher.update(text, 'utf8', 'hex');
45
+ encrypted += cipher.final('hex');
46
+ const authTag = cipher.getAuthTag();
47
+ return iv.toString('hex') + ':' + authTag.toString('hex') + ':' + encrypted;
48
+ }
49
+ decrypt(encryptedData) {
50
+ try {
51
+ const parts = encryptedData.split(':');
52
+ if (parts.length !== 3)
53
+ return encryptedData; // Not encrypted
54
+ const algorithm = 'aes-256-gcm';
55
+ const iv = Buffer.from(parts[0], 'hex');
56
+ const authTag = Buffer.from(parts[1], 'hex');
57
+ const encrypted = parts[2];
58
+ const decipher = crypto.createDecipheriv(algorithm, Buffer.from(this.encryptionKey), iv);
59
+ decipher.setAuthTag(authTag);
60
+ let decrypted = decipher.update(encrypted, 'hex', 'utf8');
61
+ decrypted += decipher.final('utf8');
62
+ return decrypted;
63
+ }
64
+ catch (error) {
65
+ // If decryption fails, return the original (might be plain text from old version)
66
+ return encryptedData;
67
+ }
68
+ }
69
+ async initialize() {
70
+ try {
71
+ await this.load();
72
+ // Check if user is authenticated and enable backend sync
73
+ if (apiClient.isAuthenticated()) {
74
+ this.useBackendSync = true;
75
+ await this.syncFromBackend();
76
+ }
77
+ }
78
+ catch (error) {
79
+ // If loading fails, create config directory and use defaults
80
+ await this.ensureConfigDir();
81
+ await this.save();
82
+ }
83
+ }
84
+ /**
85
+ * Enable backend synchronization
86
+ */
87
+ enableBackendSync() {
88
+ this.useBackendSync = true;
89
+ }
90
+ /**
91
+ * Disable backend synchronization
92
+ */
93
+ disableBackendSync() {
94
+ this.useBackendSync = false;
95
+ }
96
+ /**
97
+ * Sync settings from backend
98
+ */
99
+ async syncFromBackend() {
100
+ if (!this.useBackendSync || !apiClient.isAuthenticated()) {
101
+ return;
102
+ }
103
+ try {
104
+ const settings = await apiClient.getSettings();
105
+ // Merge backend settings with local config
106
+ if (settings.defaultModel) {
107
+ this.config.model = settings.defaultModel;
108
+ }
109
+ if (settings.defaultProvider) {
110
+ this.config.provider = settings.defaultProvider;
111
+ }
112
+ if (settings.theme) {
113
+ this.config.theme = settings.theme;
114
+ }
115
+ if (settings.autoSave !== undefined) {
116
+ this.config.autoAccept = settings.autoSave;
117
+ }
118
+ // Save merged config locally
119
+ await this.save();
120
+ }
121
+ catch (error) {
122
+ // If sync fails, continue with local config
123
+ console.error('Failed to sync settings from backend:', error);
124
+ }
125
+ }
126
+ /**
127
+ * Sync settings to backend
128
+ */
129
+ async syncToBackend() {
130
+ if (!this.useBackendSync || !apiClient.isAuthenticated()) {
131
+ return;
132
+ }
133
+ try {
134
+ await apiClient.updateSettings({
135
+ defaultModel: this.config.model,
136
+ defaultProvider: this.config.provider,
137
+ theme: this.config.theme,
138
+ autoSave: this.config.autoAccept,
139
+ });
140
+ }
141
+ catch (error) {
142
+ // If sync fails, continue with local save
143
+ console.error('Failed to sync settings to backend:', error);
144
+ }
145
+ }
146
+ async ensureConfigDir() {
147
+ const configDir = path.dirname(this.configPath);
148
+ try {
149
+ await fs.access(configDir);
150
+ }
151
+ catch {
152
+ await fs.mkdir(configDir, { recursive: true });
153
+ }
154
+ }
155
+ async load() {
156
+ try {
157
+ const data = await fs.readFile(this.configPath, 'utf-8');
158
+ const loadedConfig = JSON.parse(data);
159
+ // Decrypt API keys
160
+ if (loadedConfig.googleApiKey) {
161
+ loadedConfig.googleApiKey = this.decrypt(loadedConfig.googleApiKey);
162
+ }
163
+ if (loadedConfig.openRouterApiKey) {
164
+ loadedConfig.openRouterApiKey = this.decrypt(loadedConfig.openRouterApiKey);
165
+ }
166
+ if (loadedConfig.anthropicApiKey) {
167
+ loadedConfig.anthropicApiKey = this.decrypt(loadedConfig.anthropicApiKey);
168
+ }
169
+ // Merge with defaults to ensure all fields exist
170
+ this.config = { ...defaultConfig, ...loadedConfig };
171
+ }
172
+ catch (error) {
173
+ if (error.code !== 'ENOENT') {
174
+ throw error;
175
+ }
176
+ // File doesn't exist, use defaults
177
+ this.config = { ...defaultConfig };
178
+ }
179
+ }
180
+ async save() {
181
+ await this.ensureConfigDir();
182
+ // Create a copy for saving with encrypted API keys
183
+ const configToSave = { ...this.config };
184
+ // Encrypt API keys before saving
185
+ if (configToSave.googleApiKey) {
186
+ configToSave.googleApiKey = this.encrypt(configToSave.googleApiKey);
187
+ }
188
+ if (configToSave.openRouterApiKey) {
189
+ configToSave.openRouterApiKey = this.encrypt(configToSave.openRouterApiKey);
190
+ }
191
+ if (configToSave.anthropicApiKey) {
192
+ configToSave.anthropicApiKey = this.encrypt(configToSave.anthropicApiKey);
193
+ }
194
+ await fs.writeFile(this.configPath, JSON.stringify(configToSave, null, 2), 'utf-8');
195
+ }
196
+ // Getters
197
+ get(key) {
198
+ return this.config[key];
199
+ }
200
+ getAll() {
201
+ // Return a copy to prevent direct modification
202
+ return { ...this.config };
203
+ }
204
+ getProvider() {
205
+ return this.config.provider;
206
+ }
207
+ getModel() {
208
+ return this.config.model;
209
+ }
210
+ getApiKey(provider) {
211
+ const p = provider || this.config.provider;
212
+ switch (p) {
213
+ case 'google':
214
+ return this.config.googleApiKey;
215
+ case 'openrouter':
216
+ return this.config.openRouterApiKey;
217
+ case 'anthropic':
218
+ return this.config.anthropicApiKey;
219
+ default:
220
+ return undefined;
221
+ }
222
+ }
223
+ isAutoAcceptEnabled() {
224
+ return this.config.autoAccept;
225
+ }
226
+ getTheme() {
227
+ return this.config.theme;
228
+ }
229
+ // Setters
230
+ async set(key, value) {
231
+ this.config[key] = value;
232
+ await this.save();
233
+ await this.syncToBackend();
234
+ }
235
+ async setProvider(provider) {
236
+ if (!['google', 'openrouter', 'anthropic'].includes(provider)) {
237
+ throw new Error(`Invalid provider: ${provider}`);
238
+ }
239
+ this.config.provider = provider;
240
+ await this.save();
241
+ await this.syncToBackend();
242
+ }
243
+ async setModel(model) {
244
+ this.config.model = model;
245
+ await this.save();
246
+ await this.syncToBackend();
247
+ }
248
+ async setApiKey(provider, apiKey) {
249
+ // If backend sync is enabled, store API key in backend
250
+ if (this.useBackendSync && apiClient.isAuthenticated()) {
251
+ try {
252
+ await apiClient.storeApiKey({
253
+ provider: provider,
254
+ keyName: `${provider} API Key`,
255
+ apiKey: apiKey,
256
+ });
257
+ }
258
+ catch (error) {
259
+ console.error('Failed to store API key in backend:', error);
260
+ // Fall back to local storage
261
+ }
262
+ }
263
+ // Also store locally for offline access
264
+ switch (provider) {
265
+ case 'google':
266
+ this.config.googleApiKey = apiKey;
267
+ break;
268
+ case 'openrouter':
269
+ this.config.openRouterApiKey = apiKey;
270
+ break;
271
+ case 'anthropic':
272
+ this.config.anthropicApiKey = apiKey;
273
+ break;
274
+ default:
275
+ throw new Error(`Invalid provider: ${provider}`);
276
+ }
277
+ await this.save();
278
+ }
279
+ async setAutoAccept(enabled) {
280
+ this.config.autoAccept = enabled;
281
+ await this.save();
282
+ await this.syncToBackend();
283
+ }
284
+ async setTheme(theme) {
285
+ if (!['default', 'dark', 'light', 'ocean', 'forest'].includes(theme)) {
286
+ throw new Error(`Invalid theme: ${theme}`);
287
+ }
288
+ this.config.theme = theme;
289
+ await this.save();
290
+ await this.syncToBackend();
291
+ }
292
+ // Validation
293
+ validateConfig() {
294
+ const errors = [];
295
+ if (!this.config.provider) {
296
+ errors.push('Provider is not set');
297
+ }
298
+ if (!this.config.model) {
299
+ errors.push('Model is not set');
300
+ }
301
+ const apiKey = this.getApiKey();
302
+ if (!apiKey) {
303
+ errors.push(`API key for ${this.config.provider} is not set`);
304
+ }
305
+ return {
306
+ valid: errors.length === 0,
307
+ errors
308
+ };
309
+ }
310
+ // Reset to defaults
311
+ async reset() {
312
+ this.config = { ...defaultConfig };
313
+ await this.save();
314
+ }
315
+ // Export configuration (without sensitive data)
316
+ exportConfig() {
317
+ const exported = { ...this.config };
318
+ // Remove sensitive data
319
+ delete exported.googleApiKey;
320
+ delete exported.openRouterApiKey;
321
+ delete exported.anthropicApiKey;
322
+ // Add masked indicators
323
+ return {
324
+ ...exported,
325
+ googleApiKey: this.config.googleApiKey ? '***SET***' : undefined,
326
+ openRouterApiKey: this.config.openRouterApiKey ? '***SET***' : undefined,
327
+ anthropicApiKey: this.config.anthropicApiKey ? '***SET***' : undefined
328
+ };
329
+ }
330
+ }
331
+ export default ConfigManager;
332
+ //# sourceMappingURL=ConfigManager.js.map