centaurus-cli 3.0.0 → 3.1.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 (552) hide show
  1. package/dist/ai/types.js +0 -1
  2. package/dist/ai/types.js.map +1 -1
  3. package/dist/cli-adapter.js +5047 -5037
  4. package/dist/cli-adapter.js.map +1 -1
  5. package/dist/commands/CommandParser.js +372 -315
  6. package/dist/commands/CommandParser.js.map +1 -1
  7. package/dist/config/build-config.js +11 -42
  8. package/dist/config/build-config.js.map +1 -1
  9. package/dist/config/defaultConfig.js +94 -82
  10. package/dist/config/defaultConfig.js.map +1 -1
  11. package/dist/config/manager.js +144 -160
  12. package/dist/config/manager.js.map +1 -1
  13. package/dist/config/mcp-config-manager.js +411 -364
  14. package/dist/config/mcp-config-manager.js.map +1 -1
  15. package/dist/config/models.js +118 -185
  16. package/dist/config/models.js.map +1 -1
  17. package/dist/config/slash-commands.js +186 -184
  18. package/dist/config/slash-commands.js.map +1 -1
  19. package/dist/config/types.js +33 -26
  20. package/dist/config/types.js.map +1 -1
  21. package/dist/context/command-detector.js +63 -67
  22. package/dist/context/command-detector.js.map +1 -1
  23. package/dist/context/context-manager.js +533 -518
  24. package/dist/context/context-manager.js.map +1 -1
  25. package/dist/context/handlers/docker-handler.js +518 -576
  26. package/dist/context/handlers/docker-handler.js.map +1 -1
  27. package/dist/context/handlers/ssh-handler.js +1050 -1109
  28. package/dist/context/handlers/ssh-handler.js.map +1 -1
  29. package/dist/context/handlers/wsl-handler.js +558 -630
  30. package/dist/context/handlers/wsl-handler.js.map +1 -1
  31. package/dist/context/index.js +42 -6
  32. package/dist/context/index.js.map +1 -1
  33. package/dist/context/subshell-handler.js +0 -4
  34. package/dist/context/subshell-handler.js.map +1 -1
  35. package/dist/context/types.js +20 -31
  36. package/dist/context/types.js.map +1 -1
  37. package/dist/hooks/useConnectivity.js +13 -10
  38. package/dist/hooks/useConnectivity.js.map +1 -1
  39. package/dist/hooks/useTerminalDimensions.js +67 -79
  40. package/dist/hooks/useTerminalDimensions.js.map +1 -1
  41. package/dist/index.js +228 -251
  42. package/dist/index.js.map +1 -1
  43. package/dist/mcp/mcp-command-handler.js +297 -260
  44. package/dist/mcp/mcp-command-handler.js.map +1 -1
  45. package/dist/mcp/mcp-server-manager.js +139 -155
  46. package/dist/mcp/mcp-server-manager.js.map +1 -1
  47. package/dist/mcp/mcp-tool-wrapper.js +74 -94
  48. package/dist/mcp/mcp-tool-wrapper.js.map +1 -1
  49. package/dist/services/ai-autocomplete-agent.js +169 -181
  50. package/dist/services/ai-autocomplete-agent.js.map +1 -1
  51. package/dist/services/ai-context-injector.js +180 -93
  52. package/dist/services/ai-context-injector.js.map +1 -1
  53. package/dist/services/ai-service-client.js +513 -456
  54. package/dist/services/ai-service-client.js.map +1 -1
  55. package/dist/services/api-client.js +443 -441
  56. package/dist/services/api-client.js.map +1 -1
  57. package/dist/services/auth-handler.js +162 -198
  58. package/dist/services/auth-handler.js.map +1 -1
  59. package/dist/services/background-task-manager.js +258 -282
  60. package/dist/services/background-task-manager.js.map +1 -1
  61. package/dist/services/checkpoint-manager.js +1513 -973
  62. package/dist/services/checkpoint-manager.js.map +1 -1
  63. package/dist/services/clipboard-service.js +151 -200
  64. package/dist/services/clipboard-service.js.map +1 -1
  65. package/dist/services/connectivity-manager.js +63 -65
  66. package/dist/services/connectivity-manager.js.map +1 -1
  67. package/dist/services/conversation-manager.js +118 -121
  68. package/dist/services/conversation-manager.js.map +1 -1
  69. package/dist/services/environment-context-injector.js +160 -187
  70. package/dist/services/environment-context-injector.js.map +1 -1
  71. package/dist/services/fast-context-agent.js +203 -243
  72. package/dist/services/fast-context-agent.js.map +1 -1
  73. package/dist/services/input-detection-agent.js +190 -202
  74. package/dist/services/input-detection-agent.js.map +1 -1
  75. package/dist/services/input-requirement-detector.js +155 -189
  76. package/dist/services/input-requirement-detector.js.map +1 -1
  77. package/dist/services/local-chat-storage.js +342 -365
  78. package/dist/services/local-chat-storage.js.map +1 -1
  79. package/dist/services/monitored-shell-manager.js +225 -233
  80. package/dist/services/monitored-shell-manager.js.map +1 -1
  81. package/dist/services/ollama-service.js +293 -310
  82. package/dist/services/ollama-service.js.map +1 -1
  83. package/dist/services/rules-storage.js +142 -0
  84. package/dist/services/rules-storage.js.map +1 -0
  85. package/dist/services/session-quota-manager.js +219 -235
  86. package/dist/services/session-quota-manager.js.map +1 -1
  87. package/dist/services/shell-input-agent.js +299 -334
  88. package/dist/services/shell-input-agent.js.map +1 -1
  89. package/dist/services/sub-agent-manager.js +459 -501
  90. package/dist/services/sub-agent-manager.js.map +1 -1
  91. package/dist/services/warpify-detector.js +133 -183
  92. package/dist/services/warpify-detector.js.map +1 -1
  93. package/dist/services/workflow-storage.js +202 -217
  94. package/dist/services/workflow-storage.js.map +1 -1
  95. package/dist/test-ssh-handler.js +148 -193
  96. package/dist/test-ssh-handler.js.map +1 -1
  97. package/dist/tools/add-mcp.js +161 -0
  98. package/dist/tools/add-mcp.js.map +1 -0
  99. package/dist/tools/background-command.js +240 -273
  100. package/dist/tools/background-command.js.map +1 -1
  101. package/dist/tools/command.js +447 -440
  102. package/dist/tools/command.js.map +1 -1
  103. package/dist/tools/create-image.js +172 -202
  104. package/dist/tools/create-image.js.map +1 -1
  105. package/dist/tools/enter-remote-session.js +169 -215
  106. package/dist/tools/enter-remote-session.js.map +1 -1
  107. package/dist/tools/fast-context.js +60 -67
  108. package/dist/tools/fast-context.js.map +1 -1
  109. package/dist/tools/file-ops.js +605 -537
  110. package/dist/tools/file-ops.js.map +1 -1
  111. package/dist/tools/find-files.js +262 -303
  112. package/dist/tools/find-files.js.map +1 -1
  113. package/dist/tools/get-diff.js +423 -400
  114. package/dist/tools/get-diff.js.map +1 -1
  115. package/dist/tools/grep-search.js +966 -948
  116. package/dist/tools/grep-search.js.map +1 -1
  117. package/dist/tools/inspect-symbol.js +308 -323
  118. package/dist/tools/inspect-symbol.js.map +1 -1
  119. package/dist/tools/plan-mode.js +459 -503
  120. package/dist/tools/plan-mode.js.map +1 -1
  121. package/dist/tools/read-binary-file.js +160 -190
  122. package/dist/tools/read-binary-file.js.map +1 -1
  123. package/dist/tools/registry.js +100 -84
  124. package/dist/tools/registry.js.map +1 -1
  125. package/dist/tools/reproduce_issue.js +170 -151
  126. package/dist/tools/reproduce_issue.js.map +1 -1
  127. package/dist/tools/sub-agent.js +223 -228
  128. package/dist/tools/sub-agent.js.map +1 -1
  129. package/dist/tools/task-complete.js +28 -27
  130. package/dist/tools/task-complete.js.map +1 -1
  131. package/dist/tools/types.js +0 -1
  132. package/dist/tools/types.js.map +1 -1
  133. package/dist/tools/validation.js +96 -118
  134. package/dist/tools/validation.js.map +1 -1
  135. package/dist/tools/web-search.js +194 -194
  136. package/dist/tools/web-search.js.map +1 -1
  137. package/dist/tools/workflow-tool.js +77 -82
  138. package/dist/tools/workflow-tool.js.map +1 -1
  139. package/dist/types/index.js +0 -1
  140. package/dist/types/index.js.map +1 -1
  141. package/dist/types/rule.js +1 -0
  142. package/dist/types/rule.js.map +1 -0
  143. package/dist/types/workflow.js +0 -7
  144. package/dist/types/workflow.js.map +1 -1
  145. package/dist/ui/components/AgentTimer.js +24 -25
  146. package/dist/ui/components/AgentTimer.js.map +1 -1
  147. package/dist/ui/components/App.js +3266 -3249
  148. package/dist/ui/components/App.js.map +1 -1
  149. package/dist/ui/components/AuthScreen.js +22 -34
  150. package/dist/ui/components/AuthScreen.js.map +1 -1
  151. package/dist/ui/components/AuthWelcomeScreen.js +30 -24
  152. package/dist/ui/components/AuthWelcomeScreen.js.map +1 -1
  153. package/dist/ui/components/Breadcrumbs.js +53 -82
  154. package/dist/ui/components/Breadcrumbs.js.map +1 -1
  155. package/dist/ui/components/CircularSelectInput.js +59 -67
  156. package/dist/ui/components/CircularSelectInput.js.map +1 -1
  157. package/dist/ui/components/ClipboardFileAutocomplete.js +78 -39
  158. package/dist/ui/components/ClipboardFileAutocomplete.js.map +1 -1
  159. package/dist/ui/components/CodeBlock.js +24 -42
  160. package/dist/ui/components/CodeBlock.js.map +1 -1
  161. package/dist/ui/components/ConfigViewer.js +18 -25
  162. package/dist/ui/components/ConfigViewer.js.map +1 -1
  163. package/dist/ui/components/ConfirmPrompt.js +49 -71
  164. package/dist/ui/components/ConfirmPrompt.js.map +1 -1
  165. package/dist/ui/components/ConnectionStatusMessage.js +32 -83
  166. package/dist/ui/components/ConnectionStatusMessage.js.map +1 -1
  167. package/dist/ui/components/ContextWindowIndicator.js +34 -49
  168. package/dist/ui/components/ContextWindowIndicator.js.map +1 -1
  169. package/dist/ui/components/DetailedPlanReviewScreen.js +104 -106
  170. package/dist/ui/components/DetailedPlanReviewScreen.js.map +1 -1
  171. package/dist/ui/components/DiffViewer.js +68 -121
  172. package/dist/ui/components/DiffViewer.js.map +1 -1
  173. package/dist/ui/components/ErrorBoundary.js +40 -48
  174. package/dist/ui/components/ErrorBoundary.js.map +1 -1
  175. package/dist/ui/components/FileCreationPreview.js +29 -60
  176. package/dist/ui/components/FileCreationPreview.js.map +1 -1
  177. package/dist/ui/components/FileOperation.js +34 -29
  178. package/dist/ui/components/FileOperation.js.map +1 -1
  179. package/dist/ui/components/FileTagAutocomplete.js +55 -25
  180. package/dist/ui/components/FileTagAutocomplete.js.map +1 -1
  181. package/dist/ui/components/FontRecommendation.js.map +1 -1
  182. package/dist/ui/components/GitDiffBreadcrumb.js +29 -0
  183. package/dist/ui/components/GitDiffBreadcrumb.js.map +1 -0
  184. package/dist/ui/components/InputBox.js +1620 -2150
  185. package/dist/ui/components/InputBox.js.map +1 -1
  186. package/dist/ui/components/InteractiveShell.js +234 -352
  187. package/dist/ui/components/InteractiveShell.js.map +1 -1
  188. package/dist/ui/components/KeyboardHelp.js +34 -35
  189. package/dist/ui/components/KeyboardHelp.js.map +1 -1
  190. package/dist/ui/components/LoadingIndicator.js +22 -25
  191. package/dist/ui/components/LoadingIndicator.js.map +1 -1
  192. package/dist/ui/components/MCPAddScreen.js +40 -51
  193. package/dist/ui/components/MCPAddScreen.js.map +1 -1
  194. package/dist/ui/components/MCPListScreen.js +40 -48
  195. package/dist/ui/components/MCPListScreen.js.map +1 -1
  196. package/dist/ui/components/MCPServerListScreen.js +49 -56
  197. package/dist/ui/components/MCPServerListScreen.js.map +1 -1
  198. package/dist/ui/components/MarkdownRenderer.js +69 -96
  199. package/dist/ui/components/MarkdownRenderer.js.map +1 -1
  200. package/dist/ui/components/MessageBox.js +66 -48
  201. package/dist/ui/components/MessageBox.js.map +1 -1
  202. package/dist/ui/components/MessageDisplay.js +150 -142
  203. package/dist/ui/components/MessageDisplay.js.map +1 -1
  204. package/dist/ui/components/MonitorModeAIPanel.js +46 -65
  205. package/dist/ui/components/MonitorModeAIPanel.js.map +1 -1
  206. package/dist/ui/components/MultiLineInput.js +243 -277
  207. package/dist/ui/components/MultiLineInput.js.map +1 -1
  208. package/dist/ui/components/PasswordPrompt.js +37 -18
  209. package/dist/ui/components/PasswordPrompt.js.map +1 -1
  210. package/dist/ui/components/PlanAcceptedMessage.js +27 -38
  211. package/dist/ui/components/PlanAcceptedMessage.js.map +1 -1
  212. package/dist/ui/components/PlanReviewScreen.js +46 -50
  213. package/dist/ui/components/PlanReviewScreen.js.map +1 -1
  214. package/dist/ui/components/RulesEditorScreen.js +81 -0
  215. package/dist/ui/components/RulesEditorScreen.js.map +1 -0
  216. package/dist/ui/components/SelectPrompt.js +19 -8
  217. package/dist/ui/components/SelectPrompt.js.map +1 -1
  218. package/dist/ui/components/ShimmerText.js +44 -0
  219. package/dist/ui/components/ShimmerText.js.map +1 -0
  220. package/dist/ui/components/SlashCommandAutocomplete.js +49 -22
  221. package/dist/ui/components/SlashCommandAutocomplete.js.map +1 -1
  222. package/dist/ui/components/StatusBar.js +56 -87
  223. package/dist/ui/components/StatusBar.js.map +1 -1
  224. package/dist/ui/components/StreamingMessageDisplay.js +116 -99
  225. package/dist/ui/components/StreamingMessageDisplay.js.map +1 -1
  226. package/dist/ui/components/TaskCompletedMessage.js +28 -23
  227. package/dist/ui/components/TaskCompletedMessage.js.map +1 -1
  228. package/dist/ui/components/TaskProgressIndicator.js +44 -70
  229. package/dist/ui/components/TaskProgressIndicator.js.map +1 -1
  230. package/dist/ui/components/ThinkingDisplay.js +44 -41
  231. package/dist/ui/components/ThinkingDisplay.js.map +1 -1
  232. package/dist/ui/components/ToolExecutionMessage.js +772 -1326
  233. package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
  234. package/dist/ui/components/ToolExecutionStatus.js +53 -84
  235. package/dist/ui/components/ToolExecutionStatus.js.map +1 -1
  236. package/dist/ui/components/ToolResult.js +22 -15
  237. package/dist/ui/components/ToolResult.js.map +1 -1
  238. package/dist/ui/components/VersionUpdatePrompt.js +88 -120
  239. package/dist/ui/components/VersionUpdatePrompt.js.map +1 -1
  240. package/dist/ui/components/WelcomeBanner.js +176 -26
  241. package/dist/ui/components/WelcomeBanner.js.map +1 -1
  242. package/dist/ui/components/WorkflowCreatorScreen.js +94 -161
  243. package/dist/ui/components/WorkflowCreatorScreen.js.map +1 -1
  244. package/dist/utils/ansi-encoder.js +30 -61
  245. package/dist/utils/ansi-encoder.js.map +1 -1
  246. package/dist/utils/chat-formatter.js +327 -305
  247. package/dist/utils/chat-formatter.js.map +1 -1
  248. package/dist/utils/command-history.js +152 -174
  249. package/dist/utils/command-history.js.map +1 -1
  250. package/dist/utils/context-sanitizer.js +49 -112
  251. package/dist/utils/context-sanitizer.js.map +1 -1
  252. package/dist/utils/conversation-logger.js +292 -324
  253. package/dist/utils/conversation-logger.js.map +1 -1
  254. package/dist/utils/custom-commands-manager.js +126 -131
  255. package/dist/utils/custom-commands-manager.js.map +1 -1
  256. package/dist/utils/editor-utils.js +732 -837
  257. package/dist/utils/editor-utils.js.map +1 -1
  258. package/dist/utils/file.js +174 -213
  259. package/dist/utils/file.js.map +1 -1
  260. package/dist/utils/git-stats.js +169 -0
  261. package/dist/utils/git-stats.js.map +1 -0
  262. package/dist/utils/input-classifier.js +960 -482
  263. package/dist/utils/input-classifier.js.map +1 -1
  264. package/dist/utils/logger.js +48 -73
  265. package/dist/utils/logger.js.map +1 -1
  266. package/dist/utils/markdown-parser.js +277 -310
  267. package/dist/utils/markdown-parser.js.map +1 -1
  268. package/dist/utils/rule-reference-resolver.js +54 -0
  269. package/dist/utils/rule-reference-resolver.js.map +1 -0
  270. package/dist/utils/shell.js +144 -156
  271. package/dist/utils/shell.js.map +1 -1
  272. package/dist/utils/state.js +23 -22
  273. package/dist/utils/state.js.map +1 -1
  274. package/dist/utils/syntax-checker.js +279 -327
  275. package/dist/utils/syntax-checker.js.map +1 -1
  276. package/dist/utils/terminal-output.js +199 -302
  277. package/dist/utils/terminal-output.js.map +1 -1
  278. package/dist/utils/text-clipboard.js +47 -70
  279. package/dist/utils/text-clipboard.js.map +1 -1
  280. package/dist/utils/unicode-sanitizer.js +134 -197
  281. package/dist/utils/unicode-sanitizer.js.map +1 -1
  282. package/dist/utils/version-checker.js +46 -56
  283. package/dist/utils/version-checker.js.map +1 -1
  284. package/package.json +6 -4
  285. package/dist/ai/types.d.ts +0 -20
  286. package/dist/ai/types.d.ts.map +0 -1
  287. package/dist/cli-adapter.d.ts +0 -511
  288. package/dist/cli-adapter.d.ts.map +0 -1
  289. package/dist/commands/CommandParser.d.ts +0 -27
  290. package/dist/commands/CommandParser.d.ts.map +0 -1
  291. package/dist/config/build-config.d.ts +0 -42
  292. package/dist/config/build-config.d.ts.map +0 -1
  293. package/dist/config/defaultConfig.d.ts +0 -79
  294. package/dist/config/defaultConfig.d.ts.map +0 -1
  295. package/dist/config/manager.d.ts +0 -62
  296. package/dist/config/manager.d.ts.map +0 -1
  297. package/dist/config/mcp-config-manager.d.ts +0 -79
  298. package/dist/config/mcp-config-manager.d.ts.map +0 -1
  299. package/dist/config/models.d.ts +0 -83
  300. package/dist/config/models.d.ts.map +0 -1
  301. package/dist/config/slash-commands.d.ts +0 -23
  302. package/dist/config/slash-commands.d.ts.map +0 -1
  303. package/dist/config/types.d.ts +0 -35
  304. package/dist/config/types.d.ts.map +0 -1
  305. package/dist/context/command-detector.d.ts +0 -50
  306. package/dist/context/command-detector.d.ts.map +0 -1
  307. package/dist/context/context-manager.d.ts +0 -157
  308. package/dist/context/context-manager.d.ts.map +0 -1
  309. package/dist/context/handlers/docker-handler.d.ts +0 -130
  310. package/dist/context/handlers/docker-handler.d.ts.map +0 -1
  311. package/dist/context/handlers/ssh-handler.d.ts +0 -201
  312. package/dist/context/handlers/ssh-handler.d.ts.map +0 -1
  313. package/dist/context/handlers/wsl-handler.d.ts +0 -146
  314. package/dist/context/handlers/wsl-handler.d.ts.map +0 -1
  315. package/dist/context/index.d.ts +0 -8
  316. package/dist/context/index.d.ts.map +0 -1
  317. package/dist/context/subshell-handler.d.ts +0 -165
  318. package/dist/context/subshell-handler.d.ts.map +0 -1
  319. package/dist/context/types.d.ts +0 -70
  320. package/dist/context/types.d.ts.map +0 -1
  321. package/dist/hooks/useConnectivity.d.ts +0 -2
  322. package/dist/hooks/useConnectivity.d.ts.map +0 -1
  323. package/dist/hooks/useTerminalDimensions.d.ts +0 -41
  324. package/dist/hooks/useTerminalDimensions.d.ts.map +0 -1
  325. package/dist/index.d.ts +0 -9
  326. package/dist/index.d.ts.map +0 -1
  327. package/dist/mcp/mcp-command-handler.d.ts +0 -47
  328. package/dist/mcp/mcp-command-handler.d.ts.map +0 -1
  329. package/dist/mcp/mcp-server-manager.d.ts +0 -30
  330. package/dist/mcp/mcp-server-manager.d.ts.map +0 -1
  331. package/dist/mcp/mcp-tool-wrapper.d.ts +0 -12
  332. package/dist/mcp/mcp-tool-wrapper.d.ts.map +0 -1
  333. package/dist/services/ai-autocomplete-agent.d.ts +0 -39
  334. package/dist/services/ai-autocomplete-agent.d.ts.map +0 -1
  335. package/dist/services/ai-context-injector.d.ts +0 -41
  336. package/dist/services/ai-context-injector.d.ts.map +0 -1
  337. package/dist/services/ai-service-client.d.ts +0 -128
  338. package/dist/services/ai-service-client.d.ts.map +0 -1
  339. package/dist/services/api-client.d.ts +0 -353
  340. package/dist/services/api-client.d.ts.map +0 -1
  341. package/dist/services/auth-handler.d.ts +0 -30
  342. package/dist/services/auth-handler.d.ts.map +0 -1
  343. package/dist/services/background-task-manager.d.ts +0 -114
  344. package/dist/services/background-task-manager.d.ts.map +0 -1
  345. package/dist/services/checkpoint-manager.d.ts +0 -167
  346. package/dist/services/checkpoint-manager.d.ts.map +0 -1
  347. package/dist/services/clipboard-service.d.ts +0 -37
  348. package/dist/services/clipboard-service.d.ts.map +0 -1
  349. package/dist/services/connectivity-manager.d.ts +0 -18
  350. package/dist/services/connectivity-manager.d.ts.map +0 -1
  351. package/dist/services/conversation-manager.d.ts +0 -73
  352. package/dist/services/conversation-manager.d.ts.map +0 -1
  353. package/dist/services/environment-context-injector.d.ts +0 -69
  354. package/dist/services/environment-context-injector.d.ts.map +0 -1
  355. package/dist/services/fast-context-agent.d.ts +0 -12
  356. package/dist/services/fast-context-agent.d.ts.map +0 -1
  357. package/dist/services/input-detection-agent.d.ts +0 -40
  358. package/dist/services/input-detection-agent.d.ts.map +0 -1
  359. package/dist/services/input-requirement-detector.d.ts +0 -28
  360. package/dist/services/input-requirement-detector.d.ts.map +0 -1
  361. package/dist/services/local-chat-storage.d.ts +0 -182
  362. package/dist/services/local-chat-storage.d.ts.map +0 -1
  363. package/dist/services/monitored-shell-manager.d.ts +0 -120
  364. package/dist/services/monitored-shell-manager.d.ts.map +0 -1
  365. package/dist/services/ollama-service.d.ts +0 -197
  366. package/dist/services/ollama-service.d.ts.map +0 -1
  367. package/dist/services/session-quota-manager.d.ts +0 -101
  368. package/dist/services/session-quota-manager.d.ts.map +0 -1
  369. package/dist/services/shell-input-agent.d.ts +0 -89
  370. package/dist/services/shell-input-agent.d.ts.map +0 -1
  371. package/dist/services/sub-agent-manager.d.ts +0 -140
  372. package/dist/services/sub-agent-manager.d.ts.map +0 -1
  373. package/dist/services/warpify-detector.d.ts +0 -43
  374. package/dist/services/warpify-detector.d.ts.map +0 -1
  375. package/dist/services/workflow-storage.d.ts +0 -72
  376. package/dist/services/workflow-storage.d.ts.map +0 -1
  377. package/dist/test-ssh-handler.d.ts +0 -8
  378. package/dist/test-ssh-handler.d.ts.map +0 -1
  379. package/dist/tools/background-command.d.ts +0 -11
  380. package/dist/tools/background-command.d.ts.map +0 -1
  381. package/dist/tools/command.d.ts +0 -3
  382. package/dist/tools/command.d.ts.map +0 -1
  383. package/dist/tools/create-image.d.ts +0 -10
  384. package/dist/tools/create-image.d.ts.map +0 -1
  385. package/dist/tools/enter-remote-session.d.ts +0 -48
  386. package/dist/tools/enter-remote-session.d.ts.map +0 -1
  387. package/dist/tools/fast-context.d.ts +0 -3
  388. package/dist/tools/fast-context.d.ts.map +0 -1
  389. package/dist/tools/file-ops.d.ts +0 -7
  390. package/dist/tools/file-ops.d.ts.map +0 -1
  391. package/dist/tools/find-files.d.ts +0 -49
  392. package/dist/tools/find-files.d.ts.map +0 -1
  393. package/dist/tools/get-diff.d.ts +0 -14
  394. package/dist/tools/get-diff.d.ts.map +0 -1
  395. package/dist/tools/grep-search.d.ts +0 -155
  396. package/dist/tools/grep-search.d.ts.map +0 -1
  397. package/dist/tools/inspect-symbol.d.ts +0 -32
  398. package/dist/tools/inspect-symbol.d.ts.map +0 -1
  399. package/dist/tools/plan-mode.d.ts +0 -140
  400. package/dist/tools/plan-mode.d.ts.map +0 -1
  401. package/dist/tools/read-binary-file.d.ts +0 -10
  402. package/dist/tools/read-binary-file.d.ts.map +0 -1
  403. package/dist/tools/registry.d.ts +0 -31
  404. package/dist/tools/registry.d.ts.map +0 -1
  405. package/dist/tools/reproduce_issue.d.ts +0 -2
  406. package/dist/tools/reproduce_issue.d.ts.map +0 -1
  407. package/dist/tools/sub-agent.d.ts +0 -9
  408. package/dist/tools/sub-agent.d.ts.map +0 -1
  409. package/dist/tools/task-complete.d.ts +0 -3
  410. package/dist/tools/task-complete.d.ts.map +0 -1
  411. package/dist/tools/types.d.ts +0 -40
  412. package/dist/tools/types.d.ts.map +0 -1
  413. package/dist/tools/validation.d.ts +0 -47
  414. package/dist/tools/validation.d.ts.map +0 -1
  415. package/dist/tools/web-search.d.ts +0 -24
  416. package/dist/tools/web-search.d.ts.map +0 -1
  417. package/dist/tools/workflow-tool.d.ts +0 -11
  418. package/dist/tools/workflow-tool.d.ts.map +0 -1
  419. package/dist/types/index.d.ts +0 -123
  420. package/dist/types/index.d.ts.map +0 -1
  421. package/dist/types/workflow.d.ts +0 -110
  422. package/dist/types/workflow.d.ts.map +0 -1
  423. package/dist/ui/components/AgentTimer.d.ts +0 -7
  424. package/dist/ui/components/AgentTimer.d.ts.map +0 -1
  425. package/dist/ui/components/App.d.ts +0 -197
  426. package/dist/ui/components/App.d.ts.map +0 -1
  427. package/dist/ui/components/AuthScreen.d.ts +0 -8
  428. package/dist/ui/components/AuthScreen.d.ts.map +0 -1
  429. package/dist/ui/components/AuthWelcomeScreen.d.ts +0 -8
  430. package/dist/ui/components/AuthWelcomeScreen.d.ts.map +0 -1
  431. package/dist/ui/components/Breadcrumbs.d.ts +0 -13
  432. package/dist/ui/components/Breadcrumbs.d.ts.map +0 -1
  433. package/dist/ui/components/CircularSelectInput.d.ts +0 -24
  434. package/dist/ui/components/CircularSelectInput.d.ts.map +0 -1
  435. package/dist/ui/components/ClipboardFileAutocomplete.d.ts +0 -10
  436. package/dist/ui/components/ClipboardFileAutocomplete.d.ts.map +0 -1
  437. package/dist/ui/components/CodeBlock.d.ts +0 -9
  438. package/dist/ui/components/CodeBlock.d.ts.map +0 -1
  439. package/dist/ui/components/ConfigViewer.d.ts +0 -11
  440. package/dist/ui/components/ConfigViewer.d.ts.map +0 -1
  441. package/dist/ui/components/ConfirmPrompt.d.ts +0 -13
  442. package/dist/ui/components/ConfirmPrompt.d.ts.map +0 -1
  443. package/dist/ui/components/ConnectionStatusMessage.d.ts +0 -17
  444. package/dist/ui/components/ConnectionStatusMessage.d.ts.map +0 -1
  445. package/dist/ui/components/ContextWindowIndicator.d.ts +0 -8
  446. package/dist/ui/components/ContextWindowIndicator.d.ts.map +0 -1
  447. package/dist/ui/components/DetailedPlanReviewScreen.d.ts +0 -17
  448. package/dist/ui/components/DetailedPlanReviewScreen.d.ts.map +0 -1
  449. package/dist/ui/components/DiffViewer.d.ts +0 -9
  450. package/dist/ui/components/DiffViewer.d.ts.map +0 -1
  451. package/dist/ui/components/ErrorBoundary.d.ts +0 -17
  452. package/dist/ui/components/ErrorBoundary.d.ts.map +0 -1
  453. package/dist/ui/components/FileCreationPreview.d.ts +0 -8
  454. package/dist/ui/components/FileCreationPreview.d.ts.map +0 -1
  455. package/dist/ui/components/FileOperation.d.ts +0 -10
  456. package/dist/ui/components/FileOperation.d.ts.map +0 -1
  457. package/dist/ui/components/FileTagAutocomplete.d.ts +0 -11
  458. package/dist/ui/components/FileTagAutocomplete.d.ts.map +0 -1
  459. package/dist/ui/components/FontRecommendation.d.ts +0 -1
  460. package/dist/ui/components/FontRecommendation.d.ts.map +0 -1
  461. package/dist/ui/components/InputBox.d.ts +0 -42
  462. package/dist/ui/components/InputBox.d.ts.map +0 -1
  463. package/dist/ui/components/InteractiveShell.d.ts +0 -30
  464. package/dist/ui/components/InteractiveShell.d.ts.map +0 -1
  465. package/dist/ui/components/KeyboardHelp.d.ts +0 -7
  466. package/dist/ui/components/KeyboardHelp.d.ts.map +0 -1
  467. package/dist/ui/components/LoadingIndicator.d.ts +0 -3
  468. package/dist/ui/components/LoadingIndicator.d.ts.map +0 -1
  469. package/dist/ui/components/MCPAddScreen.d.ts +0 -13
  470. package/dist/ui/components/MCPAddScreen.d.ts.map +0 -1
  471. package/dist/ui/components/MCPListScreen.d.ts +0 -17
  472. package/dist/ui/components/MCPListScreen.d.ts.map +0 -1
  473. package/dist/ui/components/MCPServerListScreen.d.ts +0 -16
  474. package/dist/ui/components/MCPServerListScreen.d.ts.map +0 -1
  475. package/dist/ui/components/MarkdownRenderer.d.ts +0 -8
  476. package/dist/ui/components/MarkdownRenderer.d.ts.map +0 -1
  477. package/dist/ui/components/MessageBox.d.ts +0 -10
  478. package/dist/ui/components/MessageBox.d.ts.map +0 -1
  479. package/dist/ui/components/MessageDisplay.d.ts +0 -14
  480. package/dist/ui/components/MessageDisplay.d.ts.map +0 -1
  481. package/dist/ui/components/MonitorModeAIPanel.d.ts +0 -23
  482. package/dist/ui/components/MonitorModeAIPanel.d.ts.map +0 -1
  483. package/dist/ui/components/MultiLineInput.d.ts +0 -13
  484. package/dist/ui/components/MultiLineInput.d.ts.map +0 -1
  485. package/dist/ui/components/PasswordPrompt.d.ts +0 -9
  486. package/dist/ui/components/PasswordPrompt.d.ts.map +0 -1
  487. package/dist/ui/components/PlanAcceptedMessage.d.ts +0 -20
  488. package/dist/ui/components/PlanAcceptedMessage.d.ts.map +0 -1
  489. package/dist/ui/components/PlanReviewScreen.d.ts +0 -14
  490. package/dist/ui/components/PlanReviewScreen.d.ts.map +0 -1
  491. package/dist/ui/components/SelectPrompt.d.ts +0 -12
  492. package/dist/ui/components/SelectPrompt.d.ts.map +0 -1
  493. package/dist/ui/components/SlashCommandAutocomplete.d.ts +0 -13
  494. package/dist/ui/components/SlashCommandAutocomplete.d.ts.map +0 -1
  495. package/dist/ui/components/StatusBar.d.ts +0 -14
  496. package/dist/ui/components/StatusBar.d.ts.map +0 -1
  497. package/dist/ui/components/StreamingMessageDisplay.d.ts +0 -15
  498. package/dist/ui/components/StreamingMessageDisplay.d.ts.map +0 -1
  499. package/dist/ui/components/TaskCompletedMessage.d.ts +0 -14
  500. package/dist/ui/components/TaskCompletedMessage.d.ts.map +0 -1
  501. package/dist/ui/components/TaskProgressIndicator.d.ts +0 -18
  502. package/dist/ui/components/TaskProgressIndicator.d.ts.map +0 -1
  503. package/dist/ui/components/ThinkingDisplay.d.ts +0 -15
  504. package/dist/ui/components/ThinkingDisplay.d.ts.map +0 -1
  505. package/dist/ui/components/ToolExecutionMessage.d.ts +0 -8
  506. package/dist/ui/components/ToolExecutionMessage.d.ts.map +0 -1
  507. package/dist/ui/components/ToolExecutionStatus.d.ts +0 -10
  508. package/dist/ui/components/ToolExecutionStatus.d.ts.map +0 -1
  509. package/dist/ui/components/ToolResult.d.ts +0 -10
  510. package/dist/ui/components/ToolResult.d.ts.map +0 -1
  511. package/dist/ui/components/VersionUpdatePrompt.d.ts +0 -9
  512. package/dist/ui/components/VersionUpdatePrompt.d.ts.map +0 -1
  513. package/dist/ui/components/WelcomeBanner.d.ts +0 -3
  514. package/dist/ui/components/WelcomeBanner.d.ts.map +0 -1
  515. package/dist/ui/components/WorkflowCreatorScreen.d.ts +0 -25
  516. package/dist/ui/components/WorkflowCreatorScreen.d.ts.map +0 -1
  517. package/dist/utils/ansi-encoder.d.ts +0 -7
  518. package/dist/utils/ansi-encoder.d.ts.map +0 -1
  519. package/dist/utils/chat-formatter.d.ts +0 -12
  520. package/dist/utils/chat-formatter.d.ts.map +0 -1
  521. package/dist/utils/command-history.d.ts +0 -24
  522. package/dist/utils/command-history.d.ts.map +0 -1
  523. package/dist/utils/context-sanitizer.d.ts +0 -50
  524. package/dist/utils/context-sanitizer.d.ts.map +0 -1
  525. package/dist/utils/conversation-logger.d.ts +0 -142
  526. package/dist/utils/conversation-logger.d.ts.map +0 -1
  527. package/dist/utils/custom-commands-manager.d.ts +0 -59
  528. package/dist/utils/custom-commands-manager.d.ts.map +0 -1
  529. package/dist/utils/editor-utils.d.ts +0 -101
  530. package/dist/utils/editor-utils.d.ts.map +0 -1
  531. package/dist/utils/file.d.ts +0 -61
  532. package/dist/utils/file.d.ts.map +0 -1
  533. package/dist/utils/input-classifier.d.ts +0 -25
  534. package/dist/utils/input-classifier.d.ts.map +0 -1
  535. package/dist/utils/logger.d.ts +0 -17
  536. package/dist/utils/logger.d.ts.map +0 -1
  537. package/dist/utils/markdown-parser.d.ts +0 -60
  538. package/dist/utils/markdown-parser.d.ts.map +0 -1
  539. package/dist/utils/shell.d.ts +0 -47
  540. package/dist/utils/shell.d.ts.map +0 -1
  541. package/dist/utils/state.d.ts +0 -13
  542. package/dist/utils/state.d.ts.map +0 -1
  543. package/dist/utils/syntax-checker.d.ts +0 -24
  544. package/dist/utils/syntax-checker.d.ts.map +0 -1
  545. package/dist/utils/terminal-output.d.ts +0 -25
  546. package/dist/utils/terminal-output.d.ts.map +0 -1
  547. package/dist/utils/text-clipboard.d.ts +0 -12
  548. package/dist/utils/text-clipboard.d.ts.map +0 -1
  549. package/dist/utils/unicode-sanitizer.d.ts +0 -44
  550. package/dist/utils/unicode-sanitizer.d.ts.map +0 -1
  551. package/dist/utils/version-checker.d.ts +0 -14
  552. package/dist/utils/version-checker.d.ts.map +0 -1
@@ -1,402 +1,449 @@
1
- import * as fs from 'fs';
2
- import * as path from 'path';
3
- import * as os from 'os';
4
- import { logWarning } from '../utils/logger.js';
5
- export class MCPConfigManager {
6
- configPath;
7
- config;
8
- constructor(configDir) {
9
- const baseDir = configDir || path.join(os.homedir(), '.centaurus');
10
- this.configPath = path.join(baseDir, 'mcp-config.json');
11
- this.config = this.load();
12
- }
13
- getConfigPath() {
14
- return this.configPath;
15
- }
16
- load() {
17
- try {
18
- if (fs.existsSync(this.configPath)) {
19
- const content = fs.readFileSync(this.configPath, 'utf-8');
20
- // Handle empty file
21
- if (!content.trim()) {
22
- logWarning('[MCP Config] Config file is empty');
23
- return this.getDefaultConfig();
24
- }
25
- let rawConfig;
26
- try {
27
- rawConfig = JSON.parse(content);
28
- }
29
- catch (parseError) {
30
- logWarning(`[MCP Config] Invalid JSON: ${parseError.message}`);
31
- return this.getDefaultConfig();
32
- }
33
- // Normalize the config to standard format
34
- const normalizedConfig = this.normalizeConfig(rawConfig);
35
- if (normalizedConfig.servers.length === 0) {
36
- logWarning('[MCP Config] No servers found in config file');
37
- }
38
- return normalizedConfig;
39
- }
40
- else {
41
- // Config file doesn't exist - create directory and return default
42
- const configDir = path.dirname(this.configPath);
43
- if (!fs.existsSync(configDir)) {
44
- fs.mkdirSync(configDir, { recursive: true });
45
- }
46
- }
47
- }
48
- catch (error) {
49
- logWarning(`[MCP Config] Failed to load config: ${error.message}`);
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import * as os from "os";
4
+ import { logWarning } from "../utils/logger.js";
5
+ class MCPConfigManager {
6
+ configPath;
7
+ config;
8
+ constructor(configDir) {
9
+ const baseDir = configDir || path.join(os.homedir(), ".centaurus");
10
+ this.configPath = path.join(baseDir, "mcp-config.json");
11
+ this.config = this.load();
12
+ }
13
+ getConfigPath() {
14
+ return this.configPath;
15
+ }
16
+ load() {
17
+ try {
18
+ if (fs.existsSync(this.configPath)) {
19
+ const content = fs.readFileSync(this.configPath, "utf-8");
20
+ if (!content.trim()) {
21
+ logWarning("[MCP Config] Config file is empty");
22
+ return this.getDefaultConfig();
50
23
  }
51
- return this.getDefaultConfig();
52
- }
53
- /**
54
- * Normalize config from different formats to standard format
55
- * Supports:
56
- * 1. mcp_servers format (preferred): { "mcp_servers": { "serverName": { "command": "...", ... } } }
57
- * 2. Array format: { "servers": [{ "name": "x", "command": "y", ... }] }
58
- * 3. Object format: { "serverName": { "command": "y", ... } } - keys become server names
59
- * 4. mcpServers format (VSCode/Claude style): { "mcpServers": { ... } }
60
- */
61
- normalizeConfig(rawConfig) {
62
- // If it's null or not an object, return default
63
- if (!rawConfig || typeof rawConfig !== 'object') {
64
- return this.getDefaultConfig();
65
- }
66
- // Format 1 (PREFERRED): Check for "mcp_servers" key (snake_case) - object format
67
- if (rawConfig.mcp_servers && typeof rawConfig.mcp_servers === 'object' && !Array.isArray(rawConfig.mcp_servers)) {
68
- return this.convertObjectToArrayFormat(rawConfig.mcp_servers);
69
- }
70
- // Format 2: Standard array format with "servers" key
71
- if (Array.isArray(rawConfig.servers)) {
72
- const validServers = rawConfig.servers
73
- .filter((s) => this.validateServerConfig(s))
74
- .map((s) => this.sanitizeServerConfig(s));
75
- return { servers: validServers };
76
- }
77
- // Format 3: Check for "mcpServers" key (VSCode/Claude Desktop style - camelCase)
78
- if (rawConfig.mcpServers && typeof rawConfig.mcpServers === 'object') {
79
- return this.convertObjectToArrayFormat(rawConfig.mcpServers);
24
+ let rawConfig;
25
+ try {
26
+ rawConfig = JSON.parse(content);
27
+ } catch (parseError) {
28
+ logWarning(`[MCP Config] Invalid JSON: ${parseError.message}`);
29
+ return this.getDefaultConfig();
80
30
  }
81
- // Format 4: Object format where keys are server names (legacy)
82
- // Check if any top-level key looks like a server config (has 'command' property)
83
- const potentialServers = Object.entries(rawConfig).filter(([key, value]) => key !== 'servers' &&
84
- key !== 'mcpServers' &&
85
- key !== 'mcp_servers' &&
86
- value &&
87
- typeof value === 'object' &&
88
- 'command' in value);
89
- if (potentialServers.length > 0) {
90
- return this.convertObjectToArrayFormat(rawConfig);
31
+ const normalizedConfig = this.normalizeConfig(rawConfig);
32
+ if (normalizedConfig.servers.length === 0) {
33
+ logWarning("[MCP Config] No servers found in config file");
91
34
  }
92
- // If we have a 'servers' key but it's not an array, try to handle it
93
- if (rawConfig.servers && typeof rawConfig.servers === 'object' && !Array.isArray(rawConfig.servers)) {
94
- return this.convertObjectToArrayFormat(rawConfig.servers);
35
+ return normalizedConfig;
36
+ } else {
37
+ const configDir = path.dirname(this.configPath);
38
+ if (!fs.existsSync(configDir)) {
39
+ fs.mkdirSync(configDir, { recursive: true });
95
40
  }
96
- logWarning('[MCP Config] Unrecognized config format');
97
- return this.getDefaultConfig();
41
+ }
42
+ } catch (error) {
43
+ logWarning(`[MCP Config] Failed to load config: ${error.message}`);
98
44
  }
99
- /**
100
- * Convert object-based format to array format
101
- * { "serverName": { "command": "x", ... } } => { "servers": [{ "name": "serverName", "command": "x", ... }] }
102
- */
103
- convertObjectToArrayFormat(configObject) {
104
- const servers = [];
105
- for (const [name, serverConfig] of Object.entries(configObject)) {
106
- if (!serverConfig || typeof serverConfig !== 'object') {
107
- logWarning(`[MCP Config] Skipping invalid server entry: ${name}`);
108
- continue;
109
- }
110
- // Build server config with name from key
111
- const server = {
112
- name,
113
- command: serverConfig.command,
114
- args: serverConfig.args,
115
- env: serverConfig.env,
116
- enabled: serverConfig.enabled,
117
- auth: serverConfig.auth
118
- };
119
- if (this.validateServerConfig(server)) {
120
- servers.push(this.sanitizeServerConfig(server));
121
- }
122
- }
123
- return { servers };
45
+ return this.getDefaultConfig();
46
+ }
47
+ /**
48
+ * Normalize config from different formats to standard format
49
+ * Supports:
50
+ * 1. mcp_servers format (preferred): { "mcp_servers": { "serverName": { "command": "...", ... } } }
51
+ * 2. Array format: { "servers": [{ "name": "x", "command": "y", ... }] }
52
+ * 3. Object format: { "serverName": { "command": "y", ... } } - keys become server names
53
+ * 4. mcpServers format (VSCode/Claude style): { "mcpServers": { ... } }
54
+ */
55
+ normalizeConfig(rawConfig) {
56
+ if (!rawConfig || typeof rawConfig !== "object") {
57
+ return this.getDefaultConfig();
124
58
  }
125
- /**
126
- * Validate a server config has required fields
127
- */
128
- validateServerConfig(config) {
129
- if (!config || typeof config !== 'object') {
130
- return false;
131
- }
132
- if (!config.name || typeof config.name !== 'string') {
133
- logWarning('[MCP Config] Server missing required "name" field');
134
- return false;
135
- }
136
- if (!config.command || typeof config.command !== 'string') {
137
- logWarning(`[MCP Config] Server "${config.name}" missing required "command" field`);
138
- return false;
139
- }
140
- return true;
59
+ if (rawConfig.mcp_servers && typeof rawConfig.mcp_servers === "object" && !Array.isArray(rawConfig.mcp_servers)) {
60
+ return this.convertObjectToArrayFormat(rawConfig.mcp_servers);
141
61
  }
142
- /**
143
- * Sanitize and set defaults for server config
144
- */
145
- sanitizeServerConfig(config) {
146
- return {
147
- name: config.name,
148
- command: config.command,
149
- args: Array.isArray(config.args) ? config.args : undefined,
150
- env: config.env && typeof config.env === 'object' ? config.env : undefined,
151
- enabled: config.enabled !== false, // Default to enabled
152
- auth: config.auth
153
- };
62
+ if (Array.isArray(rawConfig.servers)) {
63
+ const validServers = rawConfig.servers.filter((s) => this.validateServerConfig(s)).map((s) => this.sanitizeServerConfig(s));
64
+ return { servers: validServers };
154
65
  }
155
- save(config) {
156
- try {
157
- const configDir = path.dirname(this.configPath);
158
- // Ensure config directory exists
159
- if (!fs.existsSync(configDir)) {
160
- fs.mkdirSync(configDir, { recursive: true });
161
- }
162
- // Convert to mcp_servers object format (preferred format)
163
- const mcpServersFormat = {};
164
- for (const server of config.servers) {
165
- const serverConfig = {
166
- command: server.command
167
- };
168
- if (server.args && server.args.length > 0) {
169
- serverConfig.args = server.args;
170
- }
171
- if (server.env && Object.keys(server.env).length > 0) {
172
- serverConfig.env = server.env;
173
- }
174
- if (server.enabled === false) {
175
- serverConfig.enabled = false;
176
- }
177
- if (server.auth) {
178
- serverConfig.auth = server.auth;
179
- }
180
- mcpServersFormat[server.name] = serverConfig;
181
- }
182
- const outputConfig = { mcp_servers: mcpServersFormat };
183
- fs.writeFileSync(this.configPath, JSON.stringify(outputConfig, null, 2), 'utf-8');
184
- this.config = config;
185
- }
186
- catch (error) {
187
- throw new Error(`Failed to save MCP config: ${error}`);
188
- }
66
+ if (rawConfig.mcpServers && typeof rawConfig.mcpServers === "object") {
67
+ return this.convertObjectToArrayFormat(rawConfig.mcpServers);
189
68
  }
190
- getServers() {
191
- return this.config.servers.filter(s => s.enabled !== false);
69
+ const potentialServers = Object.entries(rawConfig).filter(
70
+ ([key, value]) => key !== "servers" && key !== "mcpServers" && key !== "mcp_servers" && value && typeof value === "object" && "command" in value
71
+ );
72
+ if (potentialServers.length > 0) {
73
+ return this.convertObjectToArrayFormat(rawConfig);
192
74
  }
193
- getAllServers() {
194
- return this.config.servers;
75
+ if (rawConfig.servers && typeof rawConfig.servers === "object" && !Array.isArray(rawConfig.servers)) {
76
+ return this.convertObjectToArrayFormat(rawConfig.servers);
195
77
  }
196
- /**
197
- * Reload config from disk into cache
198
- * Call this when user runs /mcp refresh
199
- */
200
- reload() {
201
- this.config = this.load();
202
- return this.config;
78
+ logWarning("[MCP Config] Unrecognized config format");
79
+ return this.getDefaultConfig();
80
+ }
81
+ /**
82
+ * Convert object-based format to array format
83
+ * { "serverName": { "command": "x", ... } } => { "servers": [{ "name": "serverName", "command": "x", ... }] }
84
+ */
85
+ convertObjectToArrayFormat(configObject) {
86
+ const servers = [];
87
+ for (const [name, serverConfig] of Object.entries(configObject)) {
88
+ if (!serverConfig || typeof serverConfig !== "object") {
89
+ logWarning(`[MCP Config] Skipping invalid server entry: ${name}`);
90
+ continue;
91
+ }
92
+ const server = {
93
+ name,
94
+ command: serverConfig.command,
95
+ args: serverConfig.args,
96
+ env: serverConfig.env,
97
+ enabled: serverConfig.enabled,
98
+ auth: serverConfig.auth
99
+ };
100
+ if (this.validateServerConfig(server)) {
101
+ servers.push(this.sanitizeServerConfig(server));
102
+ }
203
103
  }
204
- addServer(server) {
205
- this.config.servers.push(server);
206
- this.save(this.config);
104
+ return { servers };
105
+ }
106
+ /**
107
+ * Validate a server config has required fields
108
+ */
109
+ validateServerConfig(config) {
110
+ if (!config || typeof config !== "object") {
111
+ return false;
207
112
  }
208
- removeServer(name) {
209
- this.config.servers = this.config.servers.filter(s => s.name !== name);
210
- this.save(this.config);
113
+ if (!config.name || typeof config.name !== "string") {
114
+ logWarning('[MCP Config] Server missing required "name" field');
115
+ return false;
211
116
  }
212
- enableServer(name) {
213
- const index = this.config.servers.findIndex(s => s.name === name);
214
- if (index !== -1) {
215
- this.config.servers[index].enabled = true;
216
- this.save(this.config);
217
- }
117
+ if (!config.command || typeof config.command !== "string") {
118
+ logWarning(`[MCP Config] Server "${config.name}" missing required "command" field`);
119
+ return false;
218
120
  }
219
- disableServer(name) {
220
- const index = this.config.servers.findIndex(s => s.name === name);
221
- if (index !== -1) {
222
- this.config.servers[index].enabled = false;
223
- this.save(this.config);
121
+ return true;
122
+ }
123
+ /**
124
+ * Sanitize and set defaults for server config
125
+ */
126
+ sanitizeServerConfig(config) {
127
+ return {
128
+ name: config.name,
129
+ command: config.command,
130
+ args: Array.isArray(config.args) ? config.args : void 0,
131
+ env: config.env && typeof config.env === "object" ? config.env : void 0,
132
+ enabled: config.enabled !== false,
133
+ // Default to enabled
134
+ auth: config.auth
135
+ };
136
+ }
137
+ save(config) {
138
+ try {
139
+ const configDir = path.dirname(this.configPath);
140
+ if (!fs.existsSync(configDir)) {
141
+ fs.mkdirSync(configDir, { recursive: true });
142
+ }
143
+ const mcpServersFormat = {};
144
+ for (const server of config.servers) {
145
+ const serverConfig = {
146
+ command: server.command
147
+ };
148
+ if (server.args && server.args.length > 0) {
149
+ serverConfig.args = server.args;
224
150
  }
225
- }
226
- updateServer(name, updates) {
227
- const index = this.config.servers.findIndex(s => s.name === name);
228
- if (index !== -1) {
229
- this.config.servers[index] = { ...this.config.servers[index], ...updates };
230
- this.save(this.config);
151
+ if (server.env && Object.keys(server.env).length > 0) {
152
+ serverConfig.env = server.env;
153
+ }
154
+ if (server.enabled === false) {
155
+ serverConfig.enabled = false;
231
156
  }
157
+ if (server.auth) {
158
+ serverConfig.auth = server.auth;
159
+ }
160
+ mcpServersFormat[server.name] = serverConfig;
161
+ }
162
+ const outputConfig = { mcp_servers: mcpServersFormat };
163
+ fs.writeFileSync(this.configPath, JSON.stringify(outputConfig, null, 2), "utf-8");
164
+ this.config = config;
165
+ } catch (error) {
166
+ throw new Error(`Failed to save MCP config: ${error}`);
167
+ }
168
+ }
169
+ getServers() {
170
+ return this.config.servers.filter((s) => s.enabled !== false);
171
+ }
172
+ getAllServers() {
173
+ return this.config.servers;
174
+ }
175
+ /**
176
+ * Reload config from disk into cache
177
+ * Call this when user runs /mcp refresh
178
+ */
179
+ reload() {
180
+ this.config = this.load();
181
+ return this.config;
182
+ }
183
+ addServer(server) {
184
+ this.config.servers.push(server);
185
+ this.save(this.config);
186
+ }
187
+ removeServer(name) {
188
+ this.config.servers = this.config.servers.filter((s) => s.name !== name);
189
+ this.save(this.config);
190
+ }
191
+ enableServer(name) {
192
+ const index = this.config.servers.findIndex((s) => s.name === name);
193
+ if (index !== -1) {
194
+ this.config.servers[index].enabled = true;
195
+ this.save(this.config);
232
196
  }
233
- /**
234
- * Validate a server config JSON string and return parsed config or error
235
- * Supports multiple formats:
236
- * 1. "server-name": {"command": "...", "args": [...]}
237
- * 2. {"server-name": {"command": "...", "args": [...]}}
238
- * 3. {"mcpServers": {"server-name": {"command": "...", "args": [...]}}}
239
- * 4. {"name": "server-name", "command": "...", "args": [...]}
240
- */
241
- validateServerConfigJSON(jsonString) {
197
+ }
198
+ disableServer(name) {
199
+ const index = this.config.servers.findIndex((s) => s.name === name);
200
+ if (index !== -1) {
201
+ this.config.servers[index].enabled = false;
202
+ this.save(this.config);
203
+ }
204
+ }
205
+ updateServer(name, updates) {
206
+ const index = this.config.servers.findIndex((s) => s.name === name);
207
+ if (index !== -1) {
208
+ this.config.servers[index] = { ...this.config.servers[index], ...updates };
209
+ this.save(this.config);
210
+ }
211
+ }
212
+ /**
213
+ * Validate a server config JSON string and return parsed config or error
214
+ * Supports multiple formats:
215
+ * 1. "server-name": {"command": "...", "args": [...]}
216
+ * 2. {"server-name": {"command": "...", "args": [...]}}
217
+ * 3. {"mcpServers": {"server-name": {"command": "...", "args": [...]}}}
218
+ * 4. {"name": "server-name", "command": "...", "args": [...]}
219
+ */
220
+ validateServerConfigJSON(jsonString) {
221
+ try {
222
+ let parsed;
223
+ let parseErrorMsg = "";
224
+ const cleanJson = this.sanitizeJsonString(jsonString);
225
+ try {
226
+ parsed = JSON.parse(cleanJson);
227
+ } catch (e1) {
228
+ parseErrorMsg = e1.message;
242
229
  try {
243
- let parsed;
244
- let parseErrorMsg = '';
245
- // Sanitize input (remove comments, trailing commas)
246
- const cleanJson = this.sanitizeJsonString(jsonString);
247
- // 1. Try direct parse
230
+ parsed = JSON.parse(`{${cleanJson}}`);
231
+ } catch (e2) {
232
+ try {
233
+ parsed = JSON.parse(`${cleanJson}}`);
234
+ } catch (e3) {
248
235
  try {
249
- parsed = JSON.parse(cleanJson);
250
- }
251
- catch (e1) {
252
- parseErrorMsg = e1.message;
253
- // 2. Try wrapping in braces (for pasted properties like "key": { ... })
254
- try {
255
- parsed = JSON.parse(`{${cleanJson}}`);
256
- }
257
- catch (e2) {
258
- // 3. Try appending closing brace (common copy-paste error)
259
- try {
260
- parsed = JSON.parse(`${cleanJson}}`);
261
- }
262
- catch (e3) {
263
- // 4. Try both
264
- try {
265
- parsed = JSON.parse(`{${cleanJson}}`);
266
- }
267
- catch (e4) {
268
- return { valid: false, error: `Invalid JSON: ${parseErrorMsg}` };
269
- }
270
- }
271
- }
236
+ parsed = JSON.parse(`{${cleanJson}}`);
237
+ } catch (e4) {
238
+ return { valid: false, error: `Invalid JSON: ${parseErrorMsg}` };
272
239
  }
273
- // Strategy: Extract server name and config from various formats
274
- // Check 1: Is the root itself a server config with "name" field?
275
- // Format: {"name": "server-name", "command": "...", "args": [...]}
276
- if (this.isValidServerShape(parsed) && parsed.name) {
277
- return this.finalizeValidation(parsed);
278
- }
279
- // Check 2: Is it wrapped in "mcpServers" or "mcp_servers"?
280
- // Format: {"mcpServers": {"server-name": {"command": "...", "args": [...]}}}
281
- const inner = parsed.mcpServers || parsed.mcp_servers || parsed.servers;
282
- if (inner && typeof inner === 'object') {
283
- // If array, take first
284
- if (Array.isArray(inner) && inner.length > 0 && this.isValidServerShape(inner[0])) {
285
- return this.finalizeValidation(inner[0]);
286
- }
287
- // If object, extract first server entry
288
- if (!Array.isArray(inner)) {
289
- const entries = Object.entries(inner);
290
- if (entries.length > 0) {
291
- const [serverName, serverConfig] = entries[0];
292
- if (this.isValidServerShape(serverConfig)) {
293
- // Inject key as name if missing
294
- const configWithName = { ...serverConfig, name: serverName };
295
- return this.finalizeValidation(configWithName);
296
- }
297
- }
298
- }
299
- }
300
- // Check 3: Is it a single server entry without wrapper?
301
- // Format: {"server-name": {"command": "...", "args": [...]}}
302
- // or Format: "server-name": {"command": "...", "args": [...]}
303
- const entries = Object.entries(parsed);
304
- if (entries.length === 1) {
305
- const [serverName, serverConfig] = entries[0];
306
- // Skip known wrapper keys
307
- if (serverName !== 'mcpServers' && serverName !== 'servers' && serverName !== 'mcp_servers') {
308
- if (this.isValidServerShape(serverConfig)) {
309
- // Inject key as name
310
- const configWithName = { ...serverConfig, name: serverName };
311
- return this.finalizeValidation(configWithName);
312
- }
313
- }
314
- }
315
- // Check 4: Multiple server entries - take the first one
316
- for (const [key, val] of entries) {
317
- if (key !== 'mcpServers' && key !== 'servers' && key !== 'mcp_servers' && this.isValidServerShape(val)) {
318
- // Inject key as name
319
- const configWithName = { ...val, name: key };
320
- return this.finalizeValidation(configWithName);
321
- }
240
+ }
241
+ }
242
+ }
243
+ if (this.isValidServerShape(parsed) && parsed.name) {
244
+ return this.finalizeValidation(parsed);
245
+ }
246
+ const inner = parsed.mcpServers || parsed.mcp_servers || parsed.servers;
247
+ if (inner && typeof inner === "object") {
248
+ if (Array.isArray(inner) && inner.length > 0 && this.isValidServerShape(inner[0])) {
249
+ return this.finalizeValidation(inner[0]);
250
+ }
251
+ if (!Array.isArray(inner)) {
252
+ const entries2 = Object.entries(inner);
253
+ if (entries2.length > 0) {
254
+ const [serverName, serverConfig] = entries2[0];
255
+ if (this.isValidServerShape(serverConfig)) {
256
+ const configWithName = { ...serverConfig, name: serverName };
257
+ return this.finalizeValidation(configWithName);
322
258
  }
323
- return { valid: false, error: 'Could not find a valid MCP server configuration (must have "command" field)' };
259
+ }
260
+ }
261
+ }
262
+ const entries = Object.entries(parsed);
263
+ if (entries.length === 1) {
264
+ const [serverName, serverConfig] = entries[0];
265
+ if (serverName !== "mcpServers" && serverName !== "servers" && serverName !== "mcp_servers") {
266
+ if (this.isValidServerShape(serverConfig)) {
267
+ const configWithName = { ...serverConfig, name: serverName };
268
+ return this.finalizeValidation(configWithName);
269
+ }
324
270
  }
325
- catch (parseError) {
326
- return { valid: false, error: `Unexpected error: ${parseError.message}` };
271
+ }
272
+ for (const [key, val] of entries) {
273
+ if (key !== "mcpServers" && key !== "servers" && key !== "mcp_servers" && this.isValidServerShape(val)) {
274
+ const configWithName = { ...val, name: key };
275
+ return this.finalizeValidation(configWithName);
327
276
  }
277
+ }
278
+ return { valid: false, error: 'Could not find a valid MCP server configuration (must have "command" field)' };
279
+ } catch (parseError) {
280
+ return { valid: false, error: `Unexpected error: ${parseError.message}` };
328
281
  }
329
- isValidServerShape(obj) {
330
- return obj && typeof obj === 'object' && typeof obj.command === 'string';
282
+ }
283
+ isValidServerShape(obj) {
284
+ return obj && typeof obj === "object" && typeof obj.command === "string";
285
+ }
286
+ finalizeValidation(parsed) {
287
+ if (!parsed.name || typeof parsed.name !== "string") {
288
+ return { valid: false, error: 'Missing or invalid "name" field' };
331
289
  }
332
- finalizeValidation(parsed) {
333
- // Ensure name exists
334
- if (!parsed.name || typeof parsed.name !== 'string') {
335
- return { valid: false, error: 'Missing or invalid "name" field' };
336
- }
337
- // Trim and validate name
338
- const serverName = parsed.name.trim();
339
- if (!serverName) {
340
- return { valid: false, error: 'Server name cannot be empty' };
290
+ const serverName = parsed.name.trim();
291
+ if (!serverName) {
292
+ return { valid: false, error: "Server name cannot be empty" };
293
+ }
294
+ const existingNames = this.config.servers.map((s) => s.name.toLowerCase());
295
+ if (existingNames.includes(serverName.toLowerCase())) {
296
+ return { valid: false, error: `Server with name "${serverName}" already exists` };
297
+ }
298
+ if (parsed.args !== void 0 && !Array.isArray(parsed.args)) {
299
+ return { valid: false, error: '"args" must be an array of strings' };
300
+ }
301
+ if (parsed.env !== void 0 && (typeof parsed.env !== "object" || Array.isArray(parsed.env))) {
302
+ return { valid: false, error: '"env" must be an object with string values' };
303
+ }
304
+ const config = {
305
+ name: serverName,
306
+ command: parsed.command,
307
+ args: Array.isArray(parsed.args) ? parsed.args : void 0,
308
+ env: parsed.env && typeof parsed.env === "object" ? parsed.env : void 0,
309
+ enabled: parsed.enabled !== false,
310
+ auth: parsed.auth
311
+ };
312
+ return { valid: true, config };
313
+ }
314
+ getDefaultConfig() {
315
+ return {
316
+ servers: []
317
+ };
318
+ }
319
+ /**
320
+ * Helper to clean up JSON string (remove comments, trailing commas)
321
+ */
322
+ sanitizeJsonString(str) {
323
+ try {
324
+ const withoutComments = this.stripCommentsOutsideStrings(str);
325
+ return this.removeTrailingCommasOutsideStrings(withoutComments);
326
+ } catch (e) {
327
+ return str;
328
+ }
329
+ }
330
+ /**
331
+ * Remove JS-style comments from JSON-like input, but only when they appear
332
+ * outside of quoted JSON strings (so values like "https://..." remain intact).
333
+ */
334
+ stripCommentsOutsideStrings(input) {
335
+ let result = "";
336
+ let inString = false;
337
+ let escaped = false;
338
+ let inLineComment = false;
339
+ let inBlockComment = false;
340
+ for (let i = 0; i < input.length; i++) {
341
+ const char = input[i];
342
+ const next = input[i + 1];
343
+ if (inLineComment) {
344
+ if (char === "\n" || char === "\r") {
345
+ inLineComment = false;
346
+ result += char;
341
347
  }
342
- // Check for duplicate name
343
- const existingNames = this.config.servers.map(s => s.name.toLowerCase());
344
- if (existingNames.includes(serverName.toLowerCase())) {
345
- return { valid: false, error: `Server with name "${serverName}" already exists` };
348
+ continue;
349
+ }
350
+ if (inBlockComment) {
351
+ if (char === "*" && next === "/") {
352
+ inBlockComment = false;
353
+ i++;
354
+ continue;
346
355
  }
347
- // Validate optional fields
348
- if (parsed.args !== undefined && !Array.isArray(parsed.args)) {
349
- return { valid: false, error: '"args" must be an array of strings' };
356
+ if (char === "\n" || char === "\r") {
357
+ result += char;
350
358
  }
351
- if (parsed.env !== undefined && (typeof parsed.env !== 'object' || Array.isArray(parsed.env))) {
352
- return { valid: false, error: '"env" must be an object with string values' };
359
+ continue;
360
+ }
361
+ if (inString) {
362
+ result += char;
363
+ if (escaped) {
364
+ escaped = false;
365
+ } else if (char === "\\") {
366
+ escaped = true;
367
+ } else if (char === '"') {
368
+ inString = false;
353
369
  }
354
- const config = {
355
- name: serverName,
356
- command: parsed.command,
357
- args: Array.isArray(parsed.args) ? parsed.args : undefined,
358
- env: parsed.env && typeof parsed.env === 'object' ? parsed.env : undefined,
359
- enabled: parsed.enabled !== false,
360
- auth: parsed.auth
361
- };
362
- return { valid: true, config };
363
- }
364
- getDefaultConfig() {
365
- return {
366
- servers: []
367
- };
370
+ continue;
371
+ }
372
+ if (char === '"') {
373
+ inString = true;
374
+ result += char;
375
+ continue;
376
+ }
377
+ if (char === "/" && next === "/") {
378
+ inLineComment = true;
379
+ i++;
380
+ continue;
381
+ }
382
+ if (char === "/" && next === "*") {
383
+ inBlockComment = true;
384
+ i++;
385
+ continue;
386
+ }
387
+ result += char;
368
388
  }
369
- /**
370
- * Helper to clean up JSON string (remove comments, trailing commas)
371
- */
372
- sanitizeJsonString(str) {
373
- try {
374
- // Remove single line comments // ...
375
- let clean = str.replace(/\/\/.*$/gm, '');
376
- // Remove multi-line comments /* ... */
377
- clean = clean.replace(/\/\*[\s\S]*?\*\//g, '');
378
- // Remove trailing commas before } or ]
379
- clean = clean.replace(/,(\s*[}\]])/g, '$1');
380
- return clean;
389
+ return result;
390
+ }
391
+ /**
392
+ * Remove trailing commas before closing } or ], while respecting strings.
393
+ */
394
+ removeTrailingCommasOutsideStrings(input) {
395
+ let result = "";
396
+ let inString = false;
397
+ let escaped = false;
398
+ for (let i = 0; i < input.length; i++) {
399
+ const char = input[i];
400
+ if (inString) {
401
+ result += char;
402
+ if (escaped) {
403
+ escaped = false;
404
+ } else if (char === "\\") {
405
+ escaped = true;
406
+ } else if (char === '"') {
407
+ inString = false;
408
+ }
409
+ continue;
410
+ }
411
+ if (char === '"') {
412
+ inString = true;
413
+ result += char;
414
+ continue;
415
+ }
416
+ if (char === ",") {
417
+ let j = i + 1;
418
+ while (j < input.length && /\s/.test(input[j])) {
419
+ j++;
381
420
  }
382
- catch (e) {
383
- return str;
421
+ const nextNonWhitespace = input[j];
422
+ if (nextNonWhitespace === "}" || nextNonWhitespace === "]") {
423
+ continue;
384
424
  }
425
+ }
426
+ result += char;
385
427
  }
386
- createExampleConfig() {
387
- const exampleConfig = {
388
- servers: [
389
- {
390
- name: 'example-filesystem',
391
- command: 'npx',
392
- args: ['-y', '@modelcontextprotocol/server-filesystem', os.homedir()],
393
- enabled: false
394
- }
395
- ]
396
- };
397
- if (!fs.existsSync(this.configPath)) {
398
- this.save(exampleConfig);
428
+ return result;
429
+ }
430
+ createExampleConfig() {
431
+ const exampleConfig = {
432
+ servers: [
433
+ {
434
+ name: "example-filesystem",
435
+ command: "npx",
436
+ args: ["-y", "@modelcontextprotocol/server-filesystem", os.homedir()],
437
+ enabled: false
399
438
  }
439
+ ]
440
+ };
441
+ if (!fs.existsSync(this.configPath)) {
442
+ this.save(exampleConfig);
400
443
  }
444
+ }
401
445
  }
446
+ export {
447
+ MCPConfigManager
448
+ };
402
449
  //# sourceMappingURL=mcp-config-manager.js.map