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,91 +1,107 @@
1
- export class ToolRegistry {
2
- tools = new Map();
3
- /**
4
- * Register a new tool
5
- */
6
- register(tool) {
7
- this.tools.set(tool.schema.name, tool);
1
+ class ToolRegistry {
2
+ tools = /* @__PURE__ */ new Map();
3
+ /**
4
+ * Register a new tool
5
+ */
6
+ register(tool) {
7
+ this.tools.set(tool.schema.name, tool);
8
+ }
9
+ /**
10
+ * Unregister a tool by name
11
+ */
12
+ unregister(name) {
13
+ return this.tools.delete(name);
14
+ }
15
+ /**
16
+ * Unregister all tools whose names start with a given prefix
17
+ */
18
+ unregisterByPrefix(prefix) {
19
+ let count = 0;
20
+ for (const name of Array.from(this.tools.keys())) {
21
+ if (name.startsWith(prefix)) {
22
+ this.tools.delete(name);
23
+ count++;
24
+ }
8
25
  }
9
- /**
10
- * Get a tool by name
11
- */
12
- get(name) {
13
- return this.tools.get(name);
14
- }
15
- /**
16
- * Get all registered tool schemas (for AI provider)
17
- * Automatically injects reason_text parameter into all tools (except task_complete)
18
- */
19
- getSchemas() {
20
- return Array.from(this.tools.values()).map(tool => {
21
- // Create a deep copy of the schema to avoid mutating the original
22
- const schema = JSON.parse(JSON.stringify(tool.schema));
23
- // DYNAMICALLY INJECT reason_text into every tool EXCEPT task_complete
24
- // task_complete accepts no parameters
25
- if (schema.name !== 'task_complete') {
26
- if (!schema.parameters.properties)
27
- schema.parameters.properties = {};
28
- // Only add reason_text if it doesn't already exist (preserve custom descriptions)
29
- if (!schema.parameters.properties.reason_text) {
30
- schema.parameters.properties.reason_text = {
31
- type: 'string',
32
- description: 'A short, user-facing explanation of what this tool is doing (e.g., "Reading config file to check version"). This will be shown to the user BEFORE the tool executes.'
33
- };
34
- }
35
- // Ensure reason_text is in required array (if not already there)
36
- if (!schema.parameters.required)
37
- schema.parameters.required = [];
38
- if (!schema.parameters.required.includes('reason_text')) {
39
- schema.parameters.required.push('reason_text');
40
- }
41
- }
42
- return schema;
43
- });
44
- }
45
- /**
46
- * Execute a tool
47
- */
48
- async execute(name, args, context) {
49
- const tool = this.tools.get(name);
50
- if (!tool) {
51
- return {
52
- success: false,
53
- result: '',
54
- error: `Tool '${name}' not found`,
55
- };
56
- }
57
- try {
58
- // Validate required parameters
59
- const required = tool.schema.parameters.required || [];
60
- for (const param of required) {
61
- if (!(param in args)) {
62
- return {
63
- success: false,
64
- result: '',
65
- error: `Missing required parameter: ${param}`,
66
- };
67
- }
68
- }
69
- // Execute the tool
70
- const result = await tool.execute(args, context);
71
- return {
72
- success: true,
73
- result,
74
- };
26
+ return count;
27
+ }
28
+ /**
29
+ * Get a tool by name
30
+ */
31
+ get(name) {
32
+ return this.tools.get(name);
33
+ }
34
+ /**
35
+ * Get all registered tool schemas (for AI provider)
36
+ * Automatically injects reason_text parameter into all tools (except task_complete)
37
+ */
38
+ getSchemas() {
39
+ return Array.from(this.tools.values()).map((tool) => {
40
+ const schema = JSON.parse(JSON.stringify(tool.schema));
41
+ if (schema.name !== "task_complete") {
42
+ if (!schema.parameters.properties) schema.parameters.properties = {};
43
+ if (!schema.parameters.properties.reason_text) {
44
+ schema.parameters.properties.reason_text = {
45
+ type: "string",
46
+ description: 'A short, user-facing explanation of what this tool is doing (e.g., "Reading config file to check version"). This will be shown to the user BEFORE the tool executes.'
47
+ };
75
48
  }
76
- catch (error) {
77
- return {
78
- success: false,
79
- result: '',
80
- error: error.message || String(error),
81
- };
49
+ if (!schema.parameters.required) schema.parameters.required = [];
50
+ if (!schema.parameters.required.includes("reason_text")) {
51
+ schema.parameters.required.push("reason_text");
82
52
  }
53
+ }
54
+ return schema;
55
+ });
56
+ }
57
+ /**
58
+ * Execute a tool
59
+ */
60
+ async execute(name, args, context) {
61
+ const tool = this.tools.get(name);
62
+ if (!tool) {
63
+ return {
64
+ success: false,
65
+ result: "",
66
+ error: `Tool '${name}' not found`
67
+ };
83
68
  }
84
- /**
85
- * Get list of all tool names
86
- */
87
- listTools() {
88
- return Array.from(this.tools.keys());
69
+ try {
70
+ const normalizedArgs = args ?? {};
71
+ const required = tool.schema.parameters.required || [];
72
+ for (const param of required) {
73
+ if (param === "reason_text") {
74
+ continue;
75
+ }
76
+ if (!(param in normalizedArgs)) {
77
+ return {
78
+ success: false,
79
+ result: "",
80
+ error: `Missing required parameter: ${param}`
81
+ };
82
+ }
83
+ }
84
+ const result = await tool.execute(normalizedArgs, context);
85
+ return {
86
+ success: true,
87
+ result
88
+ };
89
+ } catch (error) {
90
+ return {
91
+ success: false,
92
+ result: "",
93
+ error: error.message || String(error)
94
+ };
89
95
  }
96
+ }
97
+ /**
98
+ * Get list of all tool names
99
+ */
100
+ listTools() {
101
+ return Array.from(this.tools.keys());
102
+ }
90
103
  }
104
+ export {
105
+ ToolRegistry
106
+ };
91
107
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/tools/registry.ts"],"sourcesContent":["import { Tool, ToolSchema, ToolExecutionContext } from './types.js';\r\n\r\nexport class ToolRegistry {\r\n private tools: Map<string, Tool> = new Map();\r\n\r\n /**\r\n * Register a new tool\r\n */\r\n register(tool: Tool): void {\r\n this.tools.set(tool.schema.name, tool);\r\n }\r\n\r\n /**\r\n * Unregister a tool by name\r\n */\r\n unregister(name: string): boolean {\r\n return this.tools.delete(name);\r\n }\r\n\r\n /**\r\n * Unregister all tools whose names start with a given prefix\r\n */\r\n unregisterByPrefix(prefix: string): number {\r\n let count = 0;\r\n for (const name of Array.from(this.tools.keys())) {\r\n if (name.startsWith(prefix)) {\r\n this.tools.delete(name);\r\n count++;\r\n }\r\n }\r\n return count;\r\n }\r\n\r\n /**\r\n * Get a tool by name\r\n */\r\n get(name: string): Tool | undefined {\r\n return this.tools.get(name);\r\n }\r\n\r\n /**\r\n * Get all registered tool schemas (for AI provider)\r\n * Automatically injects reason_text parameter into all tools (except task_complete)\r\n */\r\n getSchemas(): ToolSchema[] {\r\n return Array.from(this.tools.values()).map(tool => {\r\n // Create a deep copy of the schema to avoid mutating the original\r\n const schema = JSON.parse(JSON.stringify(tool.schema));\r\n\r\n // DYNAMICALLY INJECT reason_text into every tool EXCEPT task_complete\r\n // task_complete accepts no parameters\r\n if (schema.name !== 'task_complete') {\r\n if (!schema.parameters.properties) schema.parameters.properties = {};\r\n\r\n // Only add reason_text if it doesn't already exist (preserve custom descriptions)\r\n if (!schema.parameters.properties.reason_text) {\r\n schema.parameters.properties.reason_text = {\r\n type: 'string',\r\n description: 'A short, user-facing explanation of what this tool is doing (e.g., \"Reading config file to check version\"). This will be shown to the user BEFORE the tool executes.'\r\n };\r\n }\r\n\r\n // Ensure reason_text is in required array (if not already there)\r\n if (!schema.parameters.required) schema.parameters.required = [];\r\n if (!schema.parameters.required.includes('reason_text')) {\r\n schema.parameters.required.push('reason_text');\r\n }\r\n }\r\n\r\n return schema;\r\n });\r\n }\r\n\r\n /**\r\n * Execute a tool\r\n */\r\n async execute(\r\n name: string,\r\n args: Record<string, any>,\r\n context: ToolExecutionContext\r\n ): Promise<{ success: boolean; result: string; error?: string; feedback?: string }> {\r\n const tool = this.tools.get(name);\r\n\r\n if (!tool) {\r\n return {\r\n success: false,\r\n result: '',\r\n error: `Tool '${name}' not found`,\r\n };\r\n }\r\n\r\n try {\r\n const normalizedArgs = args ?? {};\r\n\r\n // Validate required parameters\r\n const required = tool.schema.parameters.required || [];\r\n for (const param of required) {\r\n // Keep reason_text mandatory in schema/prompts, but do not hard-fail execution\r\n // when the model omits it.\r\n if (param === 'reason_text') {\r\n continue;\r\n }\r\n\r\n if (!(param in normalizedArgs)) {\r\n return {\r\n success: false,\r\n result: '',\r\n error: `Missing required parameter: ${param}`,\r\n };\r\n }\r\n }\r\n\r\n // Execute the tool\r\n const result = await tool.execute(normalizedArgs, context);\r\n\r\n return {\r\n success: true,\r\n result,\r\n };\r\n } catch (error: any) {\r\n return {\r\n success: false,\r\n result: '',\r\n error: error.message || String(error),\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Get list of all tool names\r\n */\r\n listTools(): string[] {\r\n return Array.from(this.tools.keys());\r\n }\r\n}\r\n"],"mappings":"AAEO,MAAM,aAAa;AAAA,EAChB,QAA2B,oBAAI,IAAI;AAAA;AAAA;AAAA;AAAA,EAK3C,SAAS,MAAkB;AACzB,SAAK,MAAM,IAAI,KAAK,OAAO,MAAM,IAAI;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAuB;AAChC,WAAO,KAAK,MAAM,OAAO,IAAI;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,QAAwB;AACzC,QAAI,QAAQ;AACZ,eAAW,QAAQ,MAAM,KAAK,KAAK,MAAM,KAAK,CAAC,GAAG;AAChD,UAAI,KAAK,WAAW,MAAM,GAAG;AAC3B,aAAK,MAAM,OAAO,IAAI;AACtB;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAgC;AAClC,WAAO,KAAK,MAAM,IAAI,IAAI;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAA2B;AACzB,WAAO,MAAM,KAAK,KAAK,MAAM,OAAO,CAAC,EAAE,IAAI,UAAQ;AAEjD,YAAM,SAAS,KAAK,MAAM,KAAK,UAAU,KAAK,MAAM,CAAC;AAIrD,UAAI,OAAO,SAAS,iBAAiB;AACnC,YAAI,CAAC,OAAO,WAAW,WAAY,QAAO,WAAW,aAAa,CAAC;AAGnE,YAAI,CAAC,OAAO,WAAW,WAAW,aAAa;AAC7C,iBAAO,WAAW,WAAW,cAAc;AAAA,YACzC,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,QACF;AAGA,YAAI,CAAC,OAAO,WAAW,SAAU,QAAO,WAAW,WAAW,CAAC;AAC/D,YAAI,CAAC,OAAO,WAAW,SAAS,SAAS,aAAa,GAAG;AACvD,iBAAO,WAAW,SAAS,KAAK,aAAa;AAAA,QAC/C;AAAA,MACF;AAEA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QACJ,MACA,MACA,SACkF;AAClF,UAAM,OAAO,KAAK,MAAM,IAAI,IAAI;AAEhC,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,OAAO,SAAS,IAAI;AAAA,MACtB;AAAA,IACF;AAEA,QAAI;AACF,YAAM,iBAAiB,QAAQ,CAAC;AAGhC,YAAM,WAAW,KAAK,OAAO,WAAW,YAAY,CAAC;AACrD,iBAAW,SAAS,UAAU;AAG5B,YAAI,UAAU,eAAe;AAC3B;AAAA,QACF;AAEA,YAAI,EAAE,SAAS,iBAAiB;AAC9B,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,OAAO,+BAA+B,KAAK;AAAA,UAC7C;AAAA,QACF;AAAA,MACF;AAGA,YAAM,SAAS,MAAM,KAAK,QAAQ,gBAAgB,OAAO;AAEzD,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,MACF;AAAA,IACF,SAAS,OAAY;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,OAAO,MAAM,WAAW,OAAO,KAAK;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAsB;AACpB,WAAO,MAAM,KAAK,KAAK,MAAM,KAAK,CAAC;AAAA,EACrC;AACF;","names":[]}
@@ -1,166 +1,185 @@
1
- import * as fs from 'fs';
2
- import * as path from 'path';
3
- // --- MOCKS & UTILS ---
1
+ import * as fs from "fs";
2
+ import * as path from "path";
4
3
  function createFlexibleRegex(pattern) {
5
- const escaped = pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
6
- const tokens = escaped.trim().split(/\s+/);
7
- const internalPattern = tokens.join('\\s+');
8
- const finalPattern = `[^\\S\\r\\n]*${internalPattern}[^\\S\\r\\n]*`;
9
- return new RegExp(finalPattern, 'g');
4
+ const escaped = pattern.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
5
+ const tokens = escaped.trim().split(/\s+/);
6
+ const internalPattern = tokens.join("\\s+");
7
+ const finalPattern = `[^\\S\\r\\n]*${internalPattern}[^\\S\\r\\n]*`;
8
+ return new RegExp(finalPattern, "g");
10
9
  }
11
10
  const mockContext = {
12
- cwd: process.cwd(),
13
- contextManager: {
14
- getCurrentContext: () => ({ type: 'local' }),
15
- readFile: async () => '',
16
- writeFile: async () => { },
17
- listDirectory: async () => []
11
+ cwd: process.cwd(),
12
+ contextManager: {
13
+ getCurrentContext: () => ({ type: "local" }),
14
+ readFile: async () => "",
15
+ writeFile: async () => {
18
16
  },
19
- requireApproval: async () => true,
20
- onStreamingOutput: () => { },
17
+ listDirectory: async () => []
18
+ },
19
+ requireApproval: async () => true,
20
+ onStreamingOutput: () => {
21
+ }
21
22
  };
22
- // --- LOGIC UNDER TEST (Copied from file-ops.ts) ---
23
23
  const multiEditFileTool = {
24
- async execute(args, context) {
25
- const { file_path, edits } = args;
26
- if (!edits || !Array.isArray(edits) || edits.length === 0) {
27
- throw new Error('No edits provided. The edits array must contain at least one edit operation.');
28
- }
29
- // Read the current content
30
- let content;
31
- const fullPath = path.resolve(context.cwd, file_path);
32
- if (!fs.existsSync(fullPath)) {
33
- throw new Error(`File not found: ${file_path}`);
34
- }
35
- content = fs.readFileSync(fullPath, 'utf-8');
36
- const appliedEdits = [];
37
- const errors = [];
38
- // Validate all patterns exist before applying any
39
- for (let i = 0; i < edits.length; i++) {
40
- const edit = edits[i];
41
- const regex = createFlexibleRegex(edit.search_pattern);
42
- const matches = content.match(regex);
43
- if (!matches || matches.length === 0) {
44
- errors.push(`Edit ${i + 1}: Pattern not found in file`);
45
- }
46
- else if (matches.length > 1) {
47
- errors.push(`Edit ${i + 1}: Pattern matches ${matches.length} times (must be unique)`);
48
- }
49
- }
50
- if (errors.length > 0) {
51
- throw new Error(`Validation failed:\n${errors.join('\n')}\n\nNo changes were made.`);
52
- }
53
- // Apply edits in order
54
- for (let i = 0; i < edits.length; i++) {
55
- const edit = edits[i];
56
- const regex = createFlexibleRegex(edit.search_pattern);
57
- // Re-check match after previous edits
58
- const matches = content.match(regex);
59
- if (!matches || matches.length === 0) {
60
- errors.push(`Edit ${i + 1}: Pattern no longer found after previous edits`);
61
- continue;
62
- }
63
- content = content.replace(regex, edit.replacement);
64
- appliedEdits.push(edit.description || `Edit ${i + 1}`);
65
- }
66
- // Write changes
67
- fs.writeFileSync(fullPath, content, 'utf-8');
68
- return `Successfully applied ${appliedEdits.length} edits`;
69
- },
24
+ async execute(args, context) {
25
+ const { file_path, edits } = args;
26
+ if (!edits || !Array.isArray(edits) || edits.length === 0) {
27
+ throw new Error("No edits provided. The edits array must contain at least one edit operation.");
28
+ }
29
+ let content;
30
+ const fullPath = path.resolve(context.cwd, file_path);
31
+ if (!fs.existsSync(fullPath)) {
32
+ throw new Error(`File not found: ${file_path}`);
33
+ }
34
+ content = fs.readFileSync(fullPath, "utf-8");
35
+ const appliedEdits = [];
36
+ const errors = [];
37
+ for (let i = 0; i < edits.length; i++) {
38
+ const edit = edits[i];
39
+ const regex = createFlexibleRegex(edit.search_pattern);
40
+ const matches = content.match(regex);
41
+ if (!matches || matches.length === 0) {
42
+ errors.push(`Edit ${i + 1}: Pattern not found in file`);
43
+ } else if (matches.length > 1) {
44
+ errors.push(`Edit ${i + 1}: Pattern matches ${matches.length} times (must be unique)`);
45
+ }
46
+ }
47
+ if (errors.length > 0) {
48
+ throw new Error(`Validation failed:
49
+ ${errors.join("\n")}
50
+
51
+ No changes were made.`);
52
+ }
53
+ for (let i = 0; i < edits.length; i++) {
54
+ const edit = edits[i];
55
+ const regex = createFlexibleRegex(edit.search_pattern);
56
+ const matches = content.match(regex);
57
+ if (!matches || matches.length === 0) {
58
+ errors.push(`Edit ${i + 1}: Pattern no longer found after previous edits`);
59
+ continue;
60
+ }
61
+ content = content.replace(regex, edit.replacement);
62
+ appliedEdits.push(edit.description || `Edit ${i + 1}`);
63
+ }
64
+ fs.writeFileSync(fullPath, content, "utf-8");
65
+ return `Successfully applied ${appliedEdits.length} edits`;
66
+ }
70
67
  };
71
- // --- TEST RUNNER ---
72
68
  async function runTest(name, content, edits, shouldFail = false) {
73
- const testFile = path.resolve(process.cwd(), `test_temp_${Date.now()}_${Math.floor(Math.random() * 1000)}.txt`);
74
- const logFile = path.resolve(process.cwd(), 'reproduce_log.txt');
75
- const log = (msg) => {
76
- console.log(msg);
77
- fs.appendFileSync(logFile, msg + '\n');
78
- };
69
+ const testFile = path.resolve(process.cwd(), `test_temp_${Date.now()}_${Math.floor(Math.random() * 1e3)}.txt`);
70
+ const logFile = path.resolve(process.cwd(), "reproduce_log.txt");
71
+ const log = (msg) => {
72
+ console.log(msg);
73
+ fs.appendFileSync(logFile, msg + "\n");
74
+ };
75
+ try {
76
+ fs.writeFileSync(testFile, content, "utf-8");
77
+ log(`
78
+ --- Running Test: ${name} ---`);
79
79
  try {
80
- fs.writeFileSync(testFile, content, 'utf-8');
81
- log(`\n--- Running Test: ${name} ---`);
82
- try {
83
- const result = await multiEditFileTool.execute({
84
- reason_text: 'Test',
85
- file_path: testFile,
86
- edits: edits
87
- }, mockContext);
88
- if (shouldFail) {
89
- log('❌ Expected failure but succeeded');
90
- log('Result: ' + result);
91
- log('Final Content:\n' + fs.readFileSync(testFile, 'utf-8'));
92
- }
93
- else {
94
- log('✅ Success');
95
- const newContent = fs.readFileSync(testFile, 'utf-8');
96
- log('New Content:\n' + newContent);
97
- }
98
- }
99
- catch (e) {
100
- if (shouldFail) {
101
- log('✅ Expected failure occurred: ' + e.message);
102
- }
103
- else {
104
- log('❌ Unexpected failure: ' + e.message);
105
- }
106
- }
107
- }
108
- finally {
109
- if (fs.existsSync(testFile))
110
- fs.unlinkSync(testFile);
80
+ const result = await multiEditFileTool.execute({
81
+ reason_text: "Test",
82
+ file_path: testFile,
83
+ edits
84
+ }, mockContext);
85
+ if (shouldFail) {
86
+ log("\u274C Expected failure but succeeded");
87
+ log("Result: " + result);
88
+ log("Final Content:\n" + fs.readFileSync(testFile, "utf-8"));
89
+ } else {
90
+ log("\u2705 Success");
91
+ const newContent = fs.readFileSync(testFile, "utf-8");
92
+ log("New Content:\n" + newContent);
93
+ }
94
+ } catch (e) {
95
+ if (shouldFail) {
96
+ log("\u2705 Expected failure occurred: " + e.message);
97
+ } else {
98
+ log("\u274C Unexpected failure: " + e.message);
99
+ }
111
100
  }
101
+ } finally {
102
+ if (fs.existsSync(testFile)) fs.unlinkSync(testFile);
103
+ }
112
104
  }
113
105
  async function main() {
114
- fs.writeFileSync(path.resolve(process.cwd(), 'reproduce_log.txt'), ''); // Clear log
115
- // 1. Basic Independent Edits
116
- await runTest('Basic Independent Edits', `line 1
117
- line 2
118
- line 3`, [
119
- { search_pattern: 'line 1', replacement: 'line A' },
120
- { search_pattern: 'line 3', replacement: 'line C' }
121
- ]);
122
- // 2. Adjacent Edits
123
- await runTest('Adjacent Edits', `line 1
124
- line 2
125
- line 3`, [
126
- { search_pattern: 'line 1', replacement: 'line A' },
127
- { search_pattern: 'line 2', replacement: 'line B' }
128
- ]);
129
- // 3. Whitespace Sensitivity
130
- await runTest('Whitespace Sensitivity', ` indentation
131
- more indentation`, [
132
- { search_pattern: ' indentation', replacement: ' changed' },
133
- ]);
134
- // 4. Sequential Deletion
135
- await runTest('Sequential Deletion', `block 1
136
- block 2
137
- block 3`, [
138
- { search_pattern: 'block 1\n', replacement: '' }, // Remove block 1 including newline
139
- { search_pattern: 'block 2', replacement: 'modified 2' }
140
- ]);
141
- // 5. Partial Match Safety
142
- await runTest('Partial Match Safety', `function test() {
143
- return true;
144
- }`, [
145
- { search_pattern: 'return true;', replacement: 'return false;' }
146
- ]);
147
- // 6. Interfering Edits (Big then Small) - FAIL CASE
148
- await runTest('Interfering Edits (Big then Small)', `start
149
- middle
150
- end`, [
151
- { search_pattern: 'start\nmiddle\nend', replacement: 'all gone' },
152
- { search_pattern: 'middle', replacement: 'survived' }
153
- ], true);
154
- // 7. Multiple Matches (FAIL CASE)
155
- await runTest('Multiple Matches', `duplicate
156
- duplicate`, [
157
- { search_pattern: 'duplicate', replacement: 'single' }
158
- ], true);
159
- // 8. Newline Consumption Bug
160
- await runTest('Newline Consumption Bug', `line 1
161
- line 2`, [
162
- { search_pattern: 'line 1', replacement: 'line 1 changed' }
163
- ]);
106
+ fs.writeFileSync(path.resolve(process.cwd(), "reproduce_log.txt"), "");
107
+ await runTest(
108
+ "Basic Independent Edits",
109
+ `line 1
110
+ line 2
111
+ line 3`,
112
+ [
113
+ { search_pattern: "line 1", replacement: "line A" },
114
+ { search_pattern: "line 3", replacement: "line C" }
115
+ ]
116
+ );
117
+ await runTest(
118
+ "Adjacent Edits",
119
+ `line 1
120
+ line 2
121
+ line 3`,
122
+ [
123
+ { search_pattern: "line 1", replacement: "line A" },
124
+ { search_pattern: "line 2", replacement: "line B" }
125
+ ]
126
+ );
127
+ await runTest(
128
+ "Whitespace Sensitivity",
129
+ ` indentation
130
+ more indentation`,
131
+ [
132
+ { search_pattern: " indentation", replacement: " changed" }
133
+ ]
134
+ );
135
+ await runTest(
136
+ "Sequential Deletion",
137
+ `block 1
138
+ block 2
139
+ block 3`,
140
+ [
141
+ { search_pattern: "block 1\n", replacement: "" },
142
+ // Remove block 1 including newline
143
+ { search_pattern: "block 2", replacement: "modified 2" }
144
+ ]
145
+ );
146
+ await runTest(
147
+ "Partial Match Safety",
148
+ `function test() {
149
+ return true;
150
+ }`,
151
+ [
152
+ { search_pattern: "return true;", replacement: "return false;" }
153
+ ]
154
+ );
155
+ await runTest(
156
+ "Interfering Edits (Big then Small)",
157
+ `start
158
+ middle
159
+ end`,
160
+ [
161
+ { search_pattern: "start\nmiddle\nend", replacement: "all gone" },
162
+ { search_pattern: "middle", replacement: "survived" }
163
+ ],
164
+ true
165
+ );
166
+ await runTest(
167
+ "Multiple Matches",
168
+ `duplicate
169
+ duplicate`,
170
+ [
171
+ { search_pattern: "duplicate", replacement: "single" }
172
+ ],
173
+ true
174
+ );
175
+ await runTest(
176
+ "Newline Consumption Bug",
177
+ `line 1
178
+ line 2`,
179
+ [
180
+ { search_pattern: "line 1", replacement: "line 1 changed" }
181
+ ]
182
+ );
164
183
  }
165
184
  main().catch(console.error);
166
185
  //# sourceMappingURL=reproduce_issue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reproduce_issue.js","sourceRoot":"","sources":["../../src/tools/reproduce_issue.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/tools/reproduce_issue.ts"],"sourcesContent":["\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport * as Diff from 'diff';\r\n\r\n// --- MOCKS & UTILS ---\r\n\r\nfunction createFlexibleRegex(pattern: string): RegExp {\r\n const escaped = pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n const tokens = escaped.trim().split(/\\s+/);\r\n const internalPattern = tokens.join('\\\\s+');\r\n const finalPattern = `[^\\\\S\\\\r\\\\n]*${internalPattern}[^\\\\S\\\\r\\\\n]*`;\r\n return new RegExp(finalPattern, 'g');\r\n}\r\n\r\nconst mockContext: any = {\r\n cwd: process.cwd(),\r\n contextManager: {\r\n getCurrentContext: () => ({ type: 'local' }),\r\n readFile: async () => '',\r\n writeFile: async () => { },\r\n listDirectory: async () => []\r\n },\r\n requireApproval: async () => true,\r\n onStreamingOutput: () => { },\r\n};\r\n\r\n// --- LOGIC UNDER TEST (Copied from file-ops.ts) ---\r\n\r\nconst multiEditFileTool = {\r\n async execute(args: any, context: any) {\r\n const { file_path, edits } = args;\r\n\r\n if (!edits || !Array.isArray(edits) || edits.length === 0) {\r\n throw new Error('No edits provided. The edits array must contain at least one edit operation.');\r\n }\r\n\r\n // Read the current content\r\n let content: string;\r\n const fullPath = path.resolve(context.cwd, file_path);\r\n if (!fs.existsSync(fullPath)) {\r\n throw new Error(`File not found: ${file_path}`);\r\n }\r\n content = fs.readFileSync(fullPath, 'utf-8');\r\n\r\n const appliedEdits: string[] = [];\r\n const errors: string[] = [];\r\n\r\n // Validate all patterns exist before applying any\r\n for (let i = 0; i < edits.length; i++) {\r\n const edit = edits[i];\r\n const regex = createFlexibleRegex(edit.search_pattern);\r\n const matches = content.match(regex);\r\n\r\n if (!matches || matches.length === 0) {\r\n errors.push(`Edit ${i + 1}: Pattern not found in file`);\r\n } else if (matches.length > 1) {\r\n errors.push(`Edit ${i + 1}: Pattern matches ${matches.length} times (must be unique)`);\r\n }\r\n }\r\n\r\n if (errors.length > 0) {\r\n throw new Error(`Validation failed:\\n${errors.join('\\n')}\\n\\nNo changes were made.`);\r\n }\r\n\r\n // Apply edits in order\r\n for (let i = 0; i < edits.length; i++) {\r\n const edit = edits[i];\r\n const regex = createFlexibleRegex(edit.search_pattern);\r\n\r\n // Re-check match after previous edits\r\n const matches = content.match(regex);\r\n if (!matches || matches.length === 0) {\r\n errors.push(`Edit ${i + 1}: Pattern no longer found after previous edits`);\r\n continue;\r\n }\r\n\r\n content = content.replace(regex, edit.replacement);\r\n appliedEdits.push(edit.description || `Edit ${i + 1}`);\r\n }\r\n\r\n // Write changes\r\n fs.writeFileSync(fullPath, content, 'utf-8');\r\n\r\n return `Successfully applied ${appliedEdits.length} edits`;\r\n },\r\n};\r\n\r\n// --- TEST RUNNER ---\r\n\r\nasync function runTest(name: string, content: string, edits: any[], shouldFail: boolean = false) {\r\n const testFile = path.resolve(process.cwd(), `test_temp_${Date.now()}_${Math.floor(Math.random() * 1000)}.txt`);\r\n const logFile = path.resolve(process.cwd(), 'reproduce_log.txt');\r\n\r\n const log = (msg: string) => {\r\n console.log(msg);\r\n fs.appendFileSync(logFile, msg + '\\n');\r\n };\r\n\r\n try {\r\n fs.writeFileSync(testFile, content, 'utf-8');\r\n\r\n log(`\\n--- Running Test: ${name} ---`);\r\n try {\r\n const result = await multiEditFileTool.execute({\r\n reason_text: 'Test',\r\n file_path: testFile,\r\n edits: edits\r\n }, mockContext);\r\n\r\n if (shouldFail) {\r\n log('❌ Expected failure but succeeded');\r\n log('Result: ' + result);\r\n log('Final Content:\\n' + fs.readFileSync(testFile, 'utf-8'));\r\n } else {\r\n log('✅ Success');\r\n const newContent = fs.readFileSync(testFile, 'utf-8');\r\n log('New Content:\\n' + newContent);\r\n }\r\n } catch (e: any) {\r\n if (shouldFail) {\r\n log('✅ Expected failure occurred: ' + e.message);\r\n } else {\r\n log('❌ Unexpected failure: ' + e.message);\r\n }\r\n }\r\n } finally {\r\n if (fs.existsSync(testFile)) fs.unlinkSync(testFile);\r\n }\r\n}\r\n\r\nasync function main() {\r\n fs.writeFileSync(path.resolve(process.cwd(), 'reproduce_log.txt'), ''); // Clear log\r\n\r\n // 1. Basic Independent Edits\r\n await runTest('Basic Independent Edits',\r\n `line 1\r\nline 2\r\nline 3`,\r\n [\r\n { search_pattern: 'line 1', replacement: 'line A' },\r\n { search_pattern: 'line 3', replacement: 'line C' }\r\n ]);\r\n\r\n // 2. Adjacent Edits\r\n await runTest('Adjacent Edits',\r\n `line 1\r\nline 2\r\nline 3`,\r\n [\r\n { search_pattern: 'line 1', replacement: 'line A' },\r\n { search_pattern: 'line 2', replacement: 'line B' }\r\n ]);\r\n\r\n // 3. Whitespace Sensitivity\r\n await runTest('Whitespace Sensitivity',\r\n ` indentation\r\n more indentation`,\r\n [\r\n { search_pattern: ' indentation', replacement: ' changed' },\r\n ]);\r\n\r\n // 4. Sequential Deletion\r\n await runTest('Sequential Deletion',\r\n `block 1\r\nblock 2\r\nblock 3`,\r\n [\r\n { search_pattern: 'block 1\\n', replacement: '' }, // Remove block 1 including newline\r\n { search_pattern: 'block 2', replacement: 'modified 2' }\r\n ]);\r\n\r\n // 5. Partial Match Safety\r\n await runTest('Partial Match Safety',\r\n `function test() {\r\n return true;\r\n}`,\r\n [\r\n { search_pattern: 'return true;', replacement: 'return false;' }\r\n ]);\r\n\r\n // 6. Interfering Edits (Big then Small) - FAIL CASE\r\n await runTest('Interfering Edits (Big then Small)',\r\n `start\r\nmiddle\r\nend`,\r\n [\r\n { search_pattern: 'start\\nmiddle\\nend', replacement: 'all gone' },\r\n { search_pattern: 'middle', replacement: 'survived' }\r\n ], true);\r\n\r\n // 7. Multiple Matches (FAIL CASE)\r\n await runTest('Multiple Matches',\r\n `duplicate\r\nduplicate`,\r\n [\r\n { search_pattern: 'duplicate', replacement: 'single' }\r\n ], true);\r\n\r\n // 8. Newline Consumption Bug\r\n await runTest('Newline Consumption Bug',\r\n `line 1\r\nline 2`,\r\n [\r\n { search_pattern: 'line 1', replacement: 'line 1 changed' }\r\n ]);\r\n}\r\n\r\nmain().catch(console.error);\r\n"],"mappings":"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","names":[]}