centaurus-cli 3.0.1 → 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 -5158
  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 +1526 -1512
  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 +601 -572
  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 -406
  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 -3263
  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 -514
  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 -204
  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 +1 @@
1
- {"version":3,"file":"chat-formatter.js","sourceRoot":"","sources":["../../src/utils/chat-formatter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utils/chat-formatter.ts"],"sourcesContent":["/**\r\n * Chat Formatter Utility\r\n * \r\n * Formats chat messages into human-readable text for clipboard sharing.\r\n * Converts internal tool call JSON and execution data into readable descriptions.\r\n */\r\n\r\nimport { Message, ToolExecution } from '../types/index.js';\r\nimport stripAnsi from 'strip-ansi';\r\n\r\n/**\r\n * Clean Unicode characters that might get corrupted in clipboard.\r\n * Removes emojis, box-drawing characters, and other problematic Unicode.\r\n */\r\nfunction cleanUnicode(text: string): string {\r\n return text\r\n // Remove box-drawing characters (used in UI borders)\r\n .replace(/[\\u2500-\\u257F]/g, '')\r\n // Remove block elements\r\n .replace(/[\\u2580-\\u259F]/g, '')\r\n // Remove emojis and pictographs (replace with text equivalents)\r\n .replace(/✓/g, '[OK]')\r\n .replace(/✗/g, '[FAIL]')\r\n .replace(/📖/g, '[READ]')\r\n .replace(/📁/g, '[DIR]')\r\n .replace(/📂/g, '[DIR]')\r\n .replace(/📄/g, '[FILE]')\r\n .replace(/✅/g, '[DONE]')\r\n .replace(/❌/g, '[ERROR]')\r\n .replace(/📭/g, '[EMPTY]')\r\n .replace(/📋/g, '[CLIPBOARD]')\r\n .replace(/🔗/g, '[LINK]')\r\n .replace(/🔌/g, '[DISCONNECT]')\r\n .replace(/⚠️/g, '[WARNING]')\r\n .replace(/🆕/g, '[NEW]')\r\n // Remove remaining emojis (broad Unicode ranges)\r\n .replace(/[\\u{1F300}-\\u{1F9FF}]/gu, '')\r\n .replace(/[\\u{2600}-\\u{26FF}]/gu, '')\r\n .replace(/[\\u{2700}-\\u{27BF}]/gu, '')\r\n // Remove common corrupted sequences (Γ, ≡, etc.)\r\n .replace(/Γ[^\\s]*/g, '')\r\n .replace(/≡[^\\s]*/g, '')\r\n // Clean up extra whitespace from removals\r\n .replace(/\\n{3,}/g, '\\n\\n')\r\n .trim();\r\n}\r\n\r\n/**\r\n * Format a tool execution into human-readable text.\r\n */\r\nfunction formatToolExecution(toolExecution: ToolExecution): string {\r\n const { toolName, status, result, error, arguments: args } = toolExecution;\r\n\r\n // Only format completed or error executions\r\n if (status !== 'completed' && status !== 'error') {\r\n return '';\r\n }\r\n\r\n const statusLabel = status === 'completed' ? '✓' : '✗';\r\n\r\n // Clean result output (remove ANSI codes)\r\n const cleanResult = result ? stripAnsi(result).trim() : '';\r\n\r\n // Helper to truncate long content\r\n const truncate = (text: string, maxLen: number = 3000): string => {\r\n if (text.length <= maxLen) return text;\r\n return text.substring(0, maxLen) + '\\n... (content truncated)';\r\n };\r\n\r\n // Handle different tool types\r\n switch (toolName) {\r\n case 'execute_command': {\r\n const command = args?.command || args?.CommandLine || args?.commandLine || 'unknown command';\r\n const cwd = args?.cwd || '';\r\n let output = `${statusLabel} The assistant ran a shell command: \\`${command}\\``;\r\n if (cwd) {\r\n output += ` (in directory: ${cwd})`;\r\n }\r\n if (cleanResult) {\r\n output += `\\n\\nOutput:\\n\\`\\`\\`\\n${truncate(cleanResult, 2000)}\\n\\`\\`\\``;\r\n }\r\n if (status === 'error' && error) {\r\n output += `\\n\\nError: ${error}`;\r\n }\r\n return output;\r\n }\r\n\r\n case 'view_file': {\r\n const filePath = args?.AbsolutePath || args?.file_path || 'unknown file';\r\n const startLine = args?.StartLine;\r\n const endLine = args?.EndLine;\r\n let output = `${statusLabel} The assistant read file: \\`${filePath}\\``;\r\n if (startLine && endLine) {\r\n output += ` (lines ${startLine}-${endLine})`;\r\n }\r\n // Include the file contents from the result\r\n if (cleanResult) {\r\n output += `\\n\\nFile contents:\\n\\`\\`\\`\\n${truncate(cleanResult)}\\n\\`\\`\\``;\r\n }\r\n return output;\r\n }\r\n\r\n case 'write_to_file': {\r\n const filePath = args?.TargetFile || args?.file_path || 'unknown file';\r\n const content = args?.CodeContent || '';\r\n const lines = content ? content.split('\\n').length : 0;\r\n let output = `${statusLabel} The assistant wrote to file: \\`${filePath}\\` (${lines} lines)`;\r\n // Include the content that was written\r\n if (content) {\r\n output += `\\n\\nNew file contents:\\n\\`\\`\\`\\n${truncate(content)}\\n\\`\\`\\``;\r\n }\r\n return output;\r\n }\r\n\r\n case 'edit_file':\r\n case 'replace_file_content': {\r\n const filePath = args?.file_path || args?.TargetFile || 'unknown file';\r\n const targetContent = args?.TargetContent || args?.target_content || '';\r\n const replacementContent = args?.ReplacementContent || args?.replacement_content || '';\r\n let output = `${statusLabel} The assistant edited file: \\`${filePath}\\``;\r\n\r\n // Include the edit details\r\n if (targetContent || replacementContent) {\r\n output += `\\n\\nEdit made:`;\r\n if (targetContent) {\r\n output += `\\n\\nOriginal:\\n\\`\\`\\`\\n${truncate(targetContent, 500)}\\n\\`\\`\\``;\r\n }\r\n if (replacementContent) {\r\n output += `\\n\\nReplaced with:\\n\\`\\`\\`\\n${truncate(replacementContent, 500)}\\n\\`\\`\\``;\r\n }\r\n }\r\n return output;\r\n }\r\n\r\n case 'multi_edit_file':\r\n case 'multi_replace_file_content': {\r\n const filePath = args?.file_path || args?.TargetFile || 'unknown file';\r\n const chunks = args?.ReplacementChunks || args?.edits || [];\r\n let output = `${statusLabel} The assistant made ${chunks.length || 'multiple'} edits to file: \\`${filePath}\\``;\r\n\r\n // Include each edit\r\n if (Array.isArray(chunks) && chunks.length > 0) {\r\n output += `\\n\\nEdits made:`;\r\n chunks.slice(0, 5).forEach((chunk: any, i: number) => {\r\n const target = chunk.TargetContent || chunk.target_content || '';\r\n const replacement = chunk.ReplacementContent || chunk.replacement_content || '';\r\n output += `\\n\\n**Edit ${i + 1}:**`;\r\n if (target) {\r\n output += `\\nOriginal:\\n\\`\\`\\`\\n${truncate(target, 300)}\\n\\`\\`\\``;\r\n }\r\n if (replacement) {\r\n output += `\\nReplaced with:\\n\\`\\`\\`\\n${truncate(replacement, 300)}\\n\\`\\`\\``;\r\n }\r\n });\r\n if (chunks.length > 5) {\r\n output += `\\n\\n... and ${chunks.length - 5} more edits`;\r\n }\r\n }\r\n return output;\r\n }\r\n\r\n case 'list_dir': {\r\n const dirPath = args?.DirectoryPath || args?.directory || 'unknown directory';\r\n let output = `${statusLabel} The assistant listed directory: \\`${dirPath}\\``;\r\n if (cleanResult) {\r\n output += `\\n\\nContents:\\n\\`\\`\\`\\n${truncate(cleanResult, 1000)}\\n\\`\\`\\``;\r\n }\r\n return output;\r\n }\r\n\r\n case 'grep_search': {\r\n const query = args?.Query || args?.query || 'unknown query';\r\n let output = `${statusLabel} The assistant searched for: \"${query}\"`;\r\n if (cleanResult) {\r\n output += `\\n\\nSearch results:\\n\\`\\`\\`\\n${truncate(cleanResult, 1500)}\\n\\`\\`\\``;\r\n }\r\n return output;\r\n }\r\n\r\n case 'find_files':\r\n case 'find_by_name': {\r\n const pattern = args?.pattern || args?.Pattern || '*';\r\n let output = `${statusLabel} The assistant searched for files matching: \"${pattern}\"`;\r\n if (cleanResult) {\r\n output += `\\n\\nFiles found:\\n\\`\\`\\`\\n${truncate(cleanResult, 1000)}\\n\\`\\`\\``;\r\n }\r\n return output;\r\n }\r\n\r\n case 'web_search':\r\n case 'search_web': {\r\n const query = args?.query || 'unknown query';\r\n let output = `${statusLabel} The assistant searched the web for: \"${query}\"`;\r\n if (cleanResult) {\r\n output += `\\n\\nSearch results:\\n${truncate(cleanResult, 2000)}`;\r\n }\r\n return output;\r\n }\r\n\r\n case 'fetch_url':\r\n case 'read_url_content': {\r\n const url = args?.url || args?.Url || 'unknown URL';\r\n let output = `${statusLabel} The assistant fetched URL: ${url}`;\r\n if (cleanResult) {\r\n output += `\\n\\nContent:\\n${truncate(cleanResult, 2000)}`;\r\n }\r\n return output;\r\n }\r\n\r\n case 'view_code_item':\r\n case 'inspect_symbol': {\r\n const filePath = args?.filePath || args?.File || 'unknown file';\r\n const nodePaths = args?.NodePaths || args?.symbols || [];\r\n let output = `${statusLabel} The assistant inspected code in: \\`${filePath}\\``;\r\n if (Array.isArray(nodePaths) && nodePaths.length > 0) {\r\n output += ` (symbols: ${nodePaths.join(', ')})`;\r\n }\r\n if (cleanResult) {\r\n output += `\\n\\nCode:\\n\\`\\`\\`\\n${truncate(cleanResult)}\\n\\`\\`\\``;\r\n }\r\n return output;\r\n }\r\n\r\n case 'view_file_outline': {\r\n const filePath = args?.AbsolutePath || 'unknown file';\r\n let output = `${statusLabel} The assistant viewed outline of: \\`${filePath}\\``;\r\n if (cleanResult) {\r\n output += `\\n\\nOutline:\\n\\`\\`\\`\\n${truncate(cleanResult, 1500)}\\n\\`\\`\\``;\r\n }\r\n return output;\r\n }\r\n\r\n case 'read_binary_file': {\r\n const filePath = args?.file_path || 'unknown file';\r\n return `${statusLabel} The assistant uploaded binary file: \\`${filePath}\\``;\r\n }\r\n\r\n case 'create_image':\r\n case 'generate_image': {\r\n const outputPath = args?.output_path || args?.ImageName || 'unknown path';\r\n const prompt = args?.Prompt || args?.image_prompt || '';\r\n let output = `${statusLabel} The assistant generated an image: \\`${outputPath}\\``;\r\n if (prompt) {\r\n output += `\\n\\nPrompt used: \"${truncate(prompt, 500)}\"`;\r\n }\r\n return output;\r\n }\r\n\r\n default: {\r\n // Check for MCP tools (mcp_servername_toolname)\r\n if (toolName.startsWith('mcp_')) {\r\n const parts = toolName.slice(4).split('_');\r\n const serverName = parts[0] || 'unknown';\r\n const mcpToolName = parts.slice(1).join('_') || 'unknown';\r\n let output = `${statusLabel} The assistant used MCP tool: ${serverName}.${mcpToolName}`;\r\n\r\n // Include the full MCP result\r\n if (cleanResult) {\r\n output += `\\n\\nResult:\\n\\`\\`\\`\\n${truncate(cleanResult)}\\n\\`\\`\\``;\r\n }\r\n return output;\r\n }\r\n\r\n // Generic tool formatting\r\n let output = `${statusLabel} The assistant used tool: ${toolName}`;\r\n if (cleanResult) {\r\n output += `\\n\\nResult:\\n\\`\\`\\`\\n${truncate(cleanResult, 1000)}\\n\\`\\`\\``;\r\n }\r\n return output;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Format a single message into human-readable text.\r\n */\r\nfunction formatMessage(message: Message): string {\r\n const { role, content, toolExecution, isCommandMode, taskCompletion, planAccepted, connectionStatus } = message;\r\n\r\n // Skip system messages\r\n if (role === 'system') {\r\n return '';\r\n }\r\n\r\n // Handle connection status messages\r\n if (connectionStatus) {\r\n const { type, status, connectionString, error: connError } = connectionStatus;\r\n if (status === 'connected') {\r\n return `🔗 Connected to ${type.toUpperCase()}: ${connectionString || 'session'}`;\r\n } else if (status === 'disconnected') {\r\n return `🔌 Disconnected from ${type.toUpperCase()} session`;\r\n } else if (status === 'error') {\r\n return `❌ ${type.toUpperCase()} connection error: ${connError || 'unknown error'}`;\r\n }\r\n return '';\r\n }\r\n\r\n // Handle plan accepted messages\r\n if (planAccepted) {\r\n const { planTitle, totalTasks } = planAccepted;\r\n return `📋 Plan accepted: \"${planTitle || 'Implementation Plan'}\" with ${totalTasks || 0} tasks`;\r\n }\r\n\r\n // Handle task completion messages\r\n if (taskCompletion) {\r\n const { taskNumber, totalTasks, taskDescription, completionNote } = taskCompletion;\r\n let output = `✅ Task ${taskNumber}/${totalTasks} completed: ${taskDescription}`;\r\n if (completionNote) {\r\n output += `\\nNote: ${completionNote}`;\r\n }\r\n return output;\r\n }\r\n\r\n // Handle tool execution messages\r\n if (toolExecution) {\r\n return formatToolExecution(toolExecution);\r\n }\r\n\r\n // Handle user messages\r\n if (role === 'user') {\r\n if (isCommandMode) {\r\n return `## User (Terminal Command)\\n\\`\\`\\`\\n${content}\\n\\`\\`\\``;\r\n }\r\n return `## User\\n${content}`;\r\n }\r\n\r\n // Handle assistant messages\r\n if (role === 'assistant') {\r\n if (content && content.trim()) {\r\n return `## Assistant\\n${content}`;\r\n }\r\n return '';\r\n }\r\n\r\n // Handle tool result messages (usually internal, skip)\r\n if (role === 'tool') {\r\n return '';\r\n }\r\n\r\n return '';\r\n}\r\n\r\n/**\r\n * Format entire chat history into human-readable text for clipboard sharing.\r\n */\r\nexport function formatChatForClipboard(messages: Message[]): string {\r\n const header = `# Chat Session Export\r\nGenerated: ${new Date().toLocaleString()}\r\n---\r\n\r\n`;\r\n\r\n const formattedMessages = messages\r\n .map(formatMessage)\r\n .filter(text => text.trim() !== '')\r\n .join('\\n\\n---\\n\\n');\r\n\r\n if (!formattedMessages) {\r\n return cleanUnicode(header + 'No messages in this chat session.');\r\n }\r\n\r\n return cleanUnicode(header + formattedMessages);\r\n}\r\n"],"mappings":"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","names":["output"]}
@@ -1,185 +1,163 @@
1
- import * as fs from 'fs/promises';
2
- import * as path from 'path';
3
- import * as os from 'os';
4
- import { logError } from './logger.js';
5
- const HISTORY_FILE = 'history.json';
1
+ import * as fs from "fs/promises";
2
+ import * as path from "path";
3
+ import * as os from "os";
4
+ import { logError } from "./logger.js";
5
+ const HISTORY_FILE = "history.json";
6
6
  const MAX_HISTORY_SIZE = 200;
7
- export class CommandHistoryManager {
8
- static instance;
9
- historyPath;
10
- data = { version: 1, commands: {} };
11
- loaded = false;
12
- constructor() {
13
- const configDir = path.join(os.homedir(), '.centaurus');
14
- this.historyPath = path.join(configDir, HISTORY_FILE);
7
+ class CommandHistoryManager {
8
+ static instance;
9
+ historyPath;
10
+ data = { version: 1, commands: {} };
11
+ loaded = false;
12
+ constructor() {
13
+ const configDir = path.join(os.homedir(), ".centaurus");
14
+ this.historyPath = path.join(configDir, HISTORY_FILE);
15
+ }
16
+ static getInstance() {
17
+ if (!CommandHistoryManager.instance) {
18
+ CommandHistoryManager.instance = new CommandHistoryManager();
15
19
  }
16
- static getInstance() {
17
- if (!CommandHistoryManager.instance) {
18
- CommandHistoryManager.instance = new CommandHistoryManager();
19
- }
20
- return CommandHistoryManager.instance;
21
- }
22
- async load() {
23
- if (this.loaded)
24
- return;
25
- try {
26
- const fileContent = await fs.readFile(this.historyPath, 'utf-8');
27
- const parsed = JSON.parse(fileContent);
28
- if (Array.isArray(parsed)) {
29
- // Migration: Convert old array format to new object format
30
- this.data = {
31
- version: 1,
32
- commands: {}
33
- };
34
- // Treat old commands as having global count 1, unknown CWD
35
- parsed.forEach(cmd => {
36
- if (typeof cmd === 'string') {
37
- this.data.commands[cmd] = {
38
- lastExecuted: Date.now(),
39
- globalCount: 1,
40
- cwdCounts: {}
41
- };
42
- }
43
- });
44
- }
45
- else {
46
- // Assume valid new format (or empty)
47
- this.data = parsed;
48
- // Ensure structure integrity
49
- if (!this.data.commands)
50
- this.data.commands = {};
51
- }
52
- }
53
- catch (error) {
54
- // Start fresh if file missing or corrupt
55
- this.data = { version: 1, commands: {} };
56
- }
57
- this.loaded = true;
58
- }
59
- async save() {
60
- try {
61
- const configDir = path.dirname(this.historyPath);
62
- try {
63
- await fs.access(configDir);
64
- }
65
- catch {
66
- await fs.mkdir(configDir, { recursive: true });
67
- }
68
- await fs.writeFile(this.historyPath, JSON.stringify(this.data, null, 2), 'utf-8');
69
- }
70
- catch (error) {
71
- logError('Failed to save command history', error);
72
- }
73
- }
74
- /**
75
- * Get all commands executed in the specific directory/environment context.
76
- * Sorted by frequency (descending) then recency (descending).
77
- */
78
- getDirectoryHistory(cwd, environment = 'local') {
79
- const contextKey = this.buildContextKey(cwd, environment);
80
- if (!contextKey)
81
- return [];
82
- const commands = Object.keys(this.data.commands);
83
- const contextCommands = commands
84
- .filter(cmd => {
85
- const stats = this.data.commands[cmd];
86
- return stats.cwdCounts[contextKey] && stats.cwdCounts[contextKey] > 0;
87
- })
88
- .map(cmd => {
89
- const stats = this.data.commands[cmd];
90
- return {
91
- cmd,
92
- score: stats.cwdCounts[contextKey],
93
- lastExecuted: stats.lastExecuted
20
+ return CommandHistoryManager.instance;
21
+ }
22
+ async load() {
23
+ if (this.loaded) return;
24
+ try {
25
+ const fileContent = await fs.readFile(this.historyPath, "utf-8");
26
+ const parsed = JSON.parse(fileContent);
27
+ if (Array.isArray(parsed)) {
28
+ this.data = {
29
+ version: 1,
30
+ commands: {}
31
+ };
32
+ parsed.forEach((cmd) => {
33
+ if (typeof cmd === "string") {
34
+ this.data.commands[cmd] = {
35
+ lastExecuted: Date.now(),
36
+ globalCount: 1,
37
+ cwdCounts: {}
94
38
  };
39
+ }
95
40
  });
96
- // Sort by Score DESC, then LastExecuted DESC
97
- contextCommands.sort((a, b) => {
98
- if (a.score !== b.score) {
99
- return b.score - a.score;
100
- }
101
- return b.lastExecuted - a.lastExecuted;
102
- });
103
- return contextCommands.map(m => m.cmd);
41
+ } else {
42
+ this.data = parsed;
43
+ if (!this.data.commands) this.data.commands = {};
44
+ }
45
+ } catch (error) {
46
+ this.data = { version: 1, commands: {} };
104
47
  }
105
- /**
106
- * Build an environment-qualified context key for directory isolation.
107
- * Format: "environment:path" (e.g., "local:/c/Users/...", "ssh:user@host:/home/...", "wsl:Ubuntu:/home/...")
108
- */
109
- buildContextKey(cwd, environment = 'local') {
110
- if (!cwd)
111
- return '';
112
- return `${environment}:${cwd}`;
48
+ this.loaded = true;
49
+ }
50
+ async save() {
51
+ try {
52
+ const configDir = path.dirname(this.historyPath);
53
+ try {
54
+ await fs.access(configDir);
55
+ } catch {
56
+ await fs.mkdir(configDir, { recursive: true });
57
+ }
58
+ await fs.writeFile(
59
+ this.historyPath,
60
+ JSON.stringify(this.data, null, 2),
61
+ "utf-8"
62
+ );
63
+ } catch (error) {
64
+ logError("Failed to save command history", error);
113
65
  }
114
- async addCommand(command, cwd = '', environment = 'local') {
115
- if (!command || !command.trim())
116
- return;
117
- const trimmedCommand = command.trim();
118
- const now = Date.now();
119
- if (!this.data.commands[trimmedCommand]) {
120
- this.data.commands[trimmedCommand] = {
121
- lastExecuted: now,
122
- globalCount: 0,
123
- cwdCounts: {}
124
- };
125
- }
126
- const stats = this.data.commands[trimmedCommand];
127
- stats.lastExecuted = now;
128
- stats.globalCount += 1;
129
- if (cwd) {
130
- // Use environment-qualified key for directory isolation
131
- const contextKey = this.buildContextKey(cwd, environment);
132
- stats.cwdCounts[contextKey] = (stats.cwdCounts[contextKey] || 0) + 1;
133
- }
134
- // Pruning logic: If history gets too big, remove least used/oldest
135
- // For now, let's just keep it simple or implement a soft limit if needed.
136
- // Given the object structure, 200 items is nothing. We can store thousands easily.
137
- // Let's implement a cleanup if keys > 1000
138
- const keys = Object.keys(this.data.commands);
139
- if (keys.length > 1000) {
140
- // Sort by lastExecuted and remove oldest 200
141
- const sortedKeys = keys.sort((a, b) => this.data.commands[a].lastExecuted - this.data.commands[b].lastExecuted);
142
- for (let i = 0; i < 200; i++) {
143
- delete this.data.commands[sortedKeys[i]];
144
- }
145
- }
146
- await this.save();
66
+ }
67
+ /**
68
+ * Get all commands executed in the specific directory/environment context.
69
+ * Sorted by frequency (descending) then recency (descending).
70
+ */
71
+ getDirectoryHistory(cwd, environment = "local") {
72
+ const contextKey = this.buildContextKey(cwd, environment);
73
+ if (!contextKey) return [];
74
+ const commands = Object.keys(this.data.commands);
75
+ const contextCommands = commands.filter((cmd) => {
76
+ const stats = this.data.commands[cmd];
77
+ return stats.cwdCounts[contextKey] && stats.cwdCounts[contextKey] > 0;
78
+ }).map((cmd) => {
79
+ const stats = this.data.commands[cmd];
80
+ return {
81
+ cmd,
82
+ score: stats.cwdCounts[contextKey],
83
+ lastExecuted: stats.lastExecuted
84
+ };
85
+ });
86
+ contextCommands.sort((a, b) => {
87
+ if (a.score !== b.score) {
88
+ return b.score - a.score;
89
+ }
90
+ return b.lastExecuted - a.lastExecuted;
91
+ });
92
+ return contextCommands.map((m) => m.cmd);
93
+ }
94
+ /**
95
+ * Build an environment-qualified context key for directory isolation.
96
+ * Format: "environment:path" (e.g., "local:/c/Users/...", "ssh:user@host:/home/...", "wsl:Ubuntu:/home/...")
97
+ */
98
+ buildContextKey(cwd, environment = "local") {
99
+ if (!cwd) return "";
100
+ return `${environment}:${cwd}`;
101
+ }
102
+ async addCommand(command, cwd = "", environment = "local") {
103
+ if (!command || !command.trim()) return;
104
+ const trimmedCommand = command.trim();
105
+ const now = Date.now();
106
+ if (!this.data.commands[trimmedCommand]) {
107
+ this.data.commands[trimmedCommand] = {
108
+ lastExecuted: now,
109
+ globalCount: 0,
110
+ cwdCounts: {}
111
+ };
147
112
  }
148
- getMatches(prefix, cwd = '', environment = 'local') {
149
- if (!prefix || !prefix.trim())
150
- return [];
151
- const lowerPrefix = prefix.toLowerCase();
152
- const commands = Object.keys(this.data.commands);
153
- // Filter matches
154
- const matches = commands.filter(cmd => cmd.toLowerCase().startsWith(lowerPrefix) && cmd !== prefix);
155
- // Score matches - ONLY suggest commands that have been run in this context
156
- const contextKey = this.buildContextKey(cwd, environment);
157
- const scoredMatches = matches
158
- .filter(cmd => {
159
- const stats = this.data.commands[cmd];
160
- // Only include commands that have been run in this specific environment+directory
161
- // This ensures true directory isolation - no suggestions from other directories
162
- return contextKey && stats.cwdCounts[contextKey] && stats.cwdCounts[contextKey] > 0;
163
- })
164
- .map(cmd => {
165
- const stats = this.data.commands[cmd];
166
- // Score based on context frequency (how many times run in this directory)
167
- const score = stats.cwdCounts[contextKey] || 0;
168
- return { cmd, score, lastExecuted: stats.lastExecuted };
169
- });
170
- // Sort by Score DESC, then LastExecuted DESC
171
- scoredMatches.sort((a, b) => {
172
- if (a.score !== b.score) {
173
- return b.score - a.score;
174
- }
175
- return b.lastExecuted - a.lastExecuted;
176
- });
177
- return scoredMatches.map(m => m.cmd);
113
+ const stats = this.data.commands[trimmedCommand];
114
+ stats.lastExecuted = now;
115
+ stats.globalCount += 1;
116
+ if (cwd) {
117
+ const contextKey = this.buildContextKey(cwd, environment);
118
+ stats.cwdCounts[contextKey] = (stats.cwdCounts[contextKey] || 0) + 1;
178
119
  }
179
- // Helper to get simple history list (sorted by recency) for arrow key navigation
180
- getHistory() {
181
- return Object.keys(this.data.commands)
182
- .sort((a, b) => this.data.commands[b].lastExecuted - this.data.commands[a].lastExecuted);
120
+ const keys = Object.keys(this.data.commands);
121
+ if (keys.length > 1e3) {
122
+ const sortedKeys = keys.sort(
123
+ (a, b) => this.data.commands[a].lastExecuted - this.data.commands[b].lastExecuted
124
+ );
125
+ for (let i = 0; i < 200; i++) {
126
+ delete this.data.commands[sortedKeys[i]];
127
+ }
183
128
  }
129
+ await this.save();
130
+ }
131
+ getMatches(prefix, cwd = "", environment = "local") {
132
+ if (!prefix || !prefix.trim()) return [];
133
+ const lowerPrefix = prefix.toLowerCase();
134
+ const commands = Object.keys(this.data.commands);
135
+ const matches = commands.filter(
136
+ (cmd) => cmd.toLowerCase().startsWith(lowerPrefix) && cmd !== prefix
137
+ );
138
+ const contextKey = this.buildContextKey(cwd, environment);
139
+ const scoredMatches = matches.filter((cmd) => {
140
+ const stats = this.data.commands[cmd];
141
+ return contextKey && stats.cwdCounts[contextKey] && stats.cwdCounts[contextKey] > 0;
142
+ }).map((cmd) => {
143
+ const stats = this.data.commands[cmd];
144
+ const score = stats.cwdCounts[contextKey] || 0;
145
+ return { cmd, score, lastExecuted: stats.lastExecuted };
146
+ });
147
+ scoredMatches.sort((a, b) => {
148
+ if (a.score !== b.score) {
149
+ return b.score - a.score;
150
+ }
151
+ return b.lastExecuted - a.lastExecuted;
152
+ });
153
+ return scoredMatches.map((m) => m.cmd);
154
+ }
155
+ // Helper to get simple history list (sorted by recency) for arrow key navigation
156
+ getHistory() {
157
+ return Object.keys(this.data.commands).sort((a, b) => this.data.commands[b].lastExecuted - this.data.commands[a].lastExecuted);
158
+ }
184
159
  }
160
+ export {
161
+ CommandHistoryManager
162
+ };
185
163
  //# sourceMappingURL=command-history.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"command-history.js","sourceRoot":"","sources":["../../src/utils/command-history.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utils/command-history.ts"],"sourcesContent":["import * as fs from 'fs/promises';\r\nimport * as path from 'path';\r\nimport * as os from 'os';\r\nimport { logError } from './logger.js';\r\n\r\nconst HISTORY_FILE = 'history.json';\r\nconst MAX_HISTORY_SIZE = 200;\r\n\r\ninterface CommandStats {\r\n lastExecuted: number;\r\n globalCount: number;\r\n cwdCounts: Record<string, number>;\r\n}\r\n\r\ninterface HistoryData {\r\n version: number;\r\n commands: Record<string, CommandStats>;\r\n}\r\n\r\nexport class CommandHistoryManager {\r\n private static instance: CommandHistoryManager;\r\n private historyPath: string;\r\n private data: HistoryData = { version: 1, commands: {} };\r\n private loaded: boolean = false;\r\n\r\n private constructor() {\r\n const configDir = path.join(os.homedir(), '.centaurus');\r\n this.historyPath = path.join(configDir, HISTORY_FILE);\r\n }\r\n\r\n static getInstance(): CommandHistoryManager {\r\n if (!CommandHistoryManager.instance) {\r\n CommandHistoryManager.instance = new CommandHistoryManager();\r\n }\r\n return CommandHistoryManager.instance;\r\n }\r\n\r\n async load(): Promise<void> {\r\n if (this.loaded) return;\r\n\r\n try {\r\n const fileContent = await fs.readFile(this.historyPath, 'utf-8');\r\n const parsed = JSON.parse(fileContent);\r\n\r\n if (Array.isArray(parsed)) {\r\n // Migration: Convert old array format to new object format\r\n this.data = {\r\n version: 1,\r\n commands: {}\r\n };\r\n // Treat old commands as having global count 1, unknown CWD\r\n parsed.forEach(cmd => {\r\n if (typeof cmd === 'string') {\r\n this.data.commands[cmd] = {\r\n lastExecuted: Date.now(),\r\n globalCount: 1,\r\n cwdCounts: {}\r\n };\r\n }\r\n });\r\n } else {\r\n // Assume valid new format (or empty)\r\n this.data = parsed;\r\n // Ensure structure integrity\r\n if (!this.data.commands) this.data.commands = {};\r\n }\r\n } catch (error) {\r\n // Start fresh if file missing or corrupt\r\n this.data = { version: 1, commands: {} };\r\n }\r\n this.loaded = true;\r\n }\r\n\r\n async save(): Promise<void> {\r\n try {\r\n const configDir = path.dirname(this.historyPath);\r\n try {\r\n await fs.access(configDir);\r\n } catch {\r\n await fs.mkdir(configDir, { recursive: true });\r\n }\r\n\r\n await fs.writeFile(\r\n this.historyPath,\r\n JSON.stringify(this.data, null, 2),\r\n 'utf-8'\r\n );\r\n } catch (error) {\r\n logError('Failed to save command history', error as Error);\r\n }\r\n }\r\n\r\n /**\r\n * Get all commands executed in the specific directory/environment context.\r\n * Sorted by frequency (descending) then recency (descending).\r\n */\r\n getDirectoryHistory(cwd: string, environment: string = 'local'): string[] {\r\n const contextKey = this.buildContextKey(cwd, environment);\r\n if (!contextKey) return [];\r\n\r\n const commands = Object.keys(this.data.commands);\r\n\r\n const contextCommands = commands\r\n .filter(cmd => {\r\n const stats = this.data.commands[cmd];\r\n return stats.cwdCounts[contextKey] && stats.cwdCounts[contextKey] > 0;\r\n })\r\n .map(cmd => {\r\n const stats = this.data.commands[cmd];\r\n return {\r\n cmd,\r\n score: stats.cwdCounts[contextKey],\r\n lastExecuted: stats.lastExecuted\r\n };\r\n });\r\n\r\n // Sort by Score DESC, then LastExecuted DESC\r\n contextCommands.sort((a, b) => {\r\n if (a.score !== b.score) {\r\n return b.score - a.score;\r\n }\r\n return b.lastExecuted - a.lastExecuted;\r\n });\r\n\r\n return contextCommands.map(m => m.cmd);\r\n }\r\n\r\n\r\n /**\r\n * Build an environment-qualified context key for directory isolation.\r\n * Format: \"environment:path\" (e.g., \"local:/c/Users/...\", \"ssh:user@host:/home/...\", \"wsl:Ubuntu:/home/...\")\r\n */\r\n private buildContextKey(cwd: string, environment: string = 'local'): string {\r\n if (!cwd) return '';\r\n return `${environment}:${cwd}`;\r\n }\r\n\r\n async addCommand(command: string, cwd: string = '', environment: string = 'local'): Promise<void> {\r\n if (!command || !command.trim()) return;\r\n\r\n const trimmedCommand = command.trim();\r\n const now = Date.now();\r\n\r\n if (!this.data.commands[trimmedCommand]) {\r\n this.data.commands[trimmedCommand] = {\r\n lastExecuted: now,\r\n globalCount: 0,\r\n cwdCounts: {}\r\n };\r\n }\r\n\r\n const stats = this.data.commands[trimmedCommand];\r\n stats.lastExecuted = now;\r\n stats.globalCount += 1;\r\n\r\n if (cwd) {\r\n // Use environment-qualified key for directory isolation\r\n const contextKey = this.buildContextKey(cwd, environment);\r\n stats.cwdCounts[contextKey] = (stats.cwdCounts[contextKey] || 0) + 1;\r\n }\r\n\r\n // Pruning logic: If history gets too big, remove least used/oldest\r\n // For now, let's just keep it simple or implement a soft limit if needed.\r\n // Given the object structure, 200 items is nothing. We can store thousands easily.\r\n // Let's implement a cleanup if keys > 1000\r\n const keys = Object.keys(this.data.commands);\r\n if (keys.length > 1000) {\r\n // Sort by lastExecuted and remove oldest 200\r\n const sortedKeys = keys.sort((a, b) =>\r\n this.data.commands[a].lastExecuted - this.data.commands[b].lastExecuted\r\n );\r\n for (let i = 0; i < 200; i++) {\r\n delete this.data.commands[sortedKeys[i]];\r\n }\r\n }\r\n\r\n await this.save();\r\n }\r\n\r\n getMatches(prefix: string, cwd: string = '', environment: string = 'local'): string[] {\r\n if (!prefix || !prefix.trim()) return [];\r\n\r\n const lowerPrefix = prefix.toLowerCase();\r\n const commands = Object.keys(this.data.commands);\r\n\r\n // Filter matches\r\n const matches = commands.filter(cmd =>\r\n cmd.toLowerCase().startsWith(lowerPrefix) && cmd !== prefix\r\n );\r\n\r\n // Score matches - ONLY suggest commands that have been run in this context\r\n const contextKey = this.buildContextKey(cwd, environment);\r\n\r\n const scoredMatches = matches\r\n .filter(cmd => {\r\n const stats = this.data.commands[cmd];\r\n // Only include commands that have been run in this specific environment+directory\r\n // This ensures true directory isolation - no suggestions from other directories\r\n return contextKey && stats.cwdCounts[contextKey] && stats.cwdCounts[contextKey] > 0;\r\n })\r\n .map(cmd => {\r\n const stats = this.data.commands[cmd];\r\n\r\n // Score based on context frequency (how many times run in this directory)\r\n const score = stats.cwdCounts[contextKey] || 0;\r\n\r\n return { cmd, score, lastExecuted: stats.lastExecuted };\r\n });\r\n\r\n // Sort by Score DESC, then LastExecuted DESC\r\n scoredMatches.sort((a, b) => {\r\n if (a.score !== b.score) {\r\n return b.score - a.score;\r\n }\r\n return b.lastExecuted - a.lastExecuted;\r\n });\r\n\r\n return scoredMatches.map(m => m.cmd);\r\n }\r\n\r\n // Helper to get simple history list (sorted by recency) for arrow key navigation\r\n getHistory(): string[] {\r\n return Object.keys(this.data.commands)\r\n .sort((a, b) => this.data.commands[b].lastExecuted - this.data.commands[a].lastExecuted);\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1,119 +1,56 @@
1
- /**
2
- * Context Sanitizer Utility
3
- *
4
- * Sanitizes tool output before it is added to the AI conversation context.
5
- * This reduces token consumption without affecting what the user sees in the UI.
6
- *
7
- * Two main functions:
8
- * 1. stripAnsiCodes() - Removes ANSI escape sequences and control codes
9
- * 2. compactWriteResult() - Replaces verbose file write results with compact confirmations
10
- */
11
- /**
12
- * Strip ALL ANSI escape sequences and terminal control codes from text.
13
- *
14
- * Handles:
15
- * - Color/style codes: \x1b[Nm (e.g., \x1b[34m, \x1b[0m)
16
- * - Cursor movement: \x1b[NA, \x1b[NB, \x1b[NG
17
- * - Cursor visibility: \x1b[?25l, \x1b[?25h
18
- * - Clear line/screen: \x1b[K, \x1b[2K, \x1b[2J
19
- * - Any CSI sequence: \x1b[<params><letter>
20
- * - OSC sequences: \x1b]...\x07 or \x1b]...\x1b\\
21
- * - Standalone \r (carriage returns not part of \r\n)
22
- */
23
- export function stripAnsiCodes(text) {
24
- if (!text || typeof text !== 'string')
25
- return text;
26
- return text
27
- // Remove CSI sequences: \x1b[ followed by params and a letter
28
- .replace(/\x1b\[[0-9;?]*[A-Za-z]/g, '')
29
- // Remove OSC sequences: \x1b] ... \x07 or \x1b] ... \x1b\\
30
- .replace(/\x1b\].*?(?:\x07|\x1b\\)/g, '')
31
- // Remove other single-character escape sequences: \x1b followed by a single char
32
- .replace(/\x1b[^[\]]/g, '')
33
- // Strip standalone \r that are NOT part of \r\n (carriage returns used for overwriting lines)
34
- .replace(/\r(?!\n)/g, '');
1
+ function stripAnsiCodes(text) {
2
+ if (!text || typeof text !== "string") return text;
3
+ return text.replace(/\x1b\[[0-9;?]*[A-Za-z]/g, "").replace(/\x1b\].*?(?:\x07|\x1b\\)/g, "").replace(/\x1b[^[\]]/g, "").replace(/\r(?!\n)/g, "");
35
4
  }
36
- /**
37
- * File write tools that should get compact context results.
38
- */
39
- const FILE_WRITE_TOOLS = new Set(['write_to_file', 'edit_file', 'multi_edit_file']);
40
- /**
41
- * Compact a file write tool result for AI context consumption.
42
- *
43
- * For successful writes, replaces the full result (which may include file contents)
44
- * with a short confirmation line.
45
- * For errors, preserves the full error message.
46
- *
47
- * @param toolName - The name of the tool (e.g., 'write_to_file', 'edit_file')
48
- * @param result - The raw result string from tool execution
49
- * @param args - The arguments passed to the tool
50
- * @returns The compacted result string (or original if not a file write tool)
51
- */
52
- export function compactWriteResult(toolName, result, args) {
53
- if (!FILE_WRITE_TOOLS.has(toolName))
54
- return result;
55
- if (!result || typeof result !== 'string')
56
- return result;
57
- // Don't compact error results - the AI needs full error context
58
- if (result.startsWith('Error:') || result.includes('Error:'))
59
- return result;
60
- if (args) {
61
- if (toolName === 'write_to_file') {
62
- const fileName = args.TargetFile || 'file';
63
- const content = args.CodeContent || '';
64
- const lines = content.split('\n').length;
65
- const bytes = Buffer.byteLength(content, 'utf8');
66
- return `[OK] Wrote to ${fileName} (${lines} lines, ${bytes} bytes)`;
67
- }
68
- else if (toolName === 'edit_file') {
69
- const fileName = args.file_path || 'file';
70
- const replacement = args.replacement || '';
71
- const lines = replacement.split('\n').length;
72
- const bytes = Buffer.byteLength(replacement, 'utf8');
73
- return `[OK] Edited ${fileName} (${lines} lines inserted, ${bytes} bytes)`;
74
- }
75
- else if (toolName === 'multi_edit_file') {
76
- const fileName = args.file_path || 'file';
77
- const editCount = Array.isArray(args.edits) ? args.edits.length : 0;
78
- return `[OK] Applied ${editCount} edits to ${fileName}`;
79
- }
5
+ const FILE_WRITE_TOOLS = /* @__PURE__ */ new Set(["write_to_file", "edit_file", "multi_edit_file"]);
6
+ function compactWriteResult(toolName, result, args) {
7
+ if (!FILE_WRITE_TOOLS.has(toolName)) return result;
8
+ if (!result || typeof result !== "string") return result;
9
+ if (result.startsWith("Error:") || result.includes("Error:")) return result;
10
+ if (args) {
11
+ if (toolName === "write_to_file") {
12
+ const fileName = args.TargetFile || "file";
13
+ const content = args.CodeContent || "";
14
+ const lines = content.split("\n").length;
15
+ const bytes = Buffer.byteLength(content, "utf8");
16
+ return `[OK] Wrote to ${fileName} (${lines} lines, ${bytes} bytes)`;
17
+ } else if (toolName === "edit_file") {
18
+ const fileName = args.file_path || "file";
19
+ const replacement = args.replacement || "";
20
+ const lines = replacement.split("\n").length;
21
+ const bytes = Buffer.byteLength(replacement, "utf8");
22
+ return `[OK] Edited ${fileName} (${lines} lines inserted, ${bytes} bytes)`;
23
+ } else if (toolName === "multi_edit_file") {
24
+ const fileName = args.file_path || "file";
25
+ const editCount = Array.isArray(args.edits) ? args.edits.length : 0;
26
+ return `[OK] Applied ${editCount} edits to ${fileName}`;
80
27
  }
81
- // Fallback if args not available or not matched
82
- return result;
28
+ }
29
+ return result;
83
30
  }
84
- /**
85
- * Apply all context sanitization to a tool result before adding to AI context.
86
- *
87
- * This is the main entry point. It:
88
- * 1. Strips ANSI codes from the result
89
- * 2. Compacts file write results
90
- *
91
- * @param toolName - The name of the tool
92
- * @param result - The raw result (string or object)
93
- * @param args - The arguments passed to the tool
94
- * @returns The sanitized result
95
- */
96
- export function sanitizeForContext(toolName, result, args) {
97
- if (typeof result === 'string') {
98
- let sanitized = stripAnsiCodes(result);
99
- sanitized = compactWriteResult(toolName, sanitized, args);
100
- return sanitized;
31
+ function sanitizeForContext(toolName, result, args) {
32
+ if (typeof result === "string") {
33
+ let sanitized = stripAnsiCodes(result);
34
+ sanitized = compactWriteResult(toolName, sanitized, args);
35
+ return sanitized;
36
+ }
37
+ if (result && typeof result === "object") {
38
+ const copy = { ...result };
39
+ for (const key of ["content", "output", "result", "text", "stdout", "stderr"]) {
40
+ if (typeof copy[key] === "string") {
41
+ copy[key] = stripAnsiCodes(copy[key]);
42
+ }
101
43
  }
102
- // For object results, try to sanitize string values at the top level
103
- if (result && typeof result === 'object') {
104
- // If it has a 'content' or 'output' field that's a string, sanitize it
105
- const copy = { ...result };
106
- for (const key of ['content', 'output', 'result', 'text', 'stdout', 'stderr']) {
107
- if (typeof copy[key] === 'string') {
108
- copy[key] = stripAnsiCodes(copy[key]);
109
- }
110
- }
111
- // Compact the result field if it's a file write tool
112
- if (FILE_WRITE_TOOLS.has(toolName) && typeof copy.result === 'string') {
113
- copy.result = compactWriteResult(toolName, copy.result, args);
114
- }
115
- return copy;
44
+ if (FILE_WRITE_TOOLS.has(toolName) && typeof copy.result === "string") {
45
+ copy.result = compactWriteResult(toolName, copy.result, args);
116
46
  }
117
- return result;
47
+ return copy;
48
+ }
49
+ return result;
118
50
  }
51
+ export {
52
+ compactWriteResult,
53
+ sanitizeForContext,
54
+ stripAnsiCodes
55
+ };
119
56
  //# sourceMappingURL=context-sanitizer.js.map