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":"editor-utils.js","sourceRoot":"","sources":["../../src/utils/editor-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utils/editor-utils.ts"],"sourcesContent":["import * as os from 'os';\r\nimport { createRequire } from 'module';\r\nimport { logError } from './logger.js';\r\n\r\n// Use createRequire for ESM compatibility with native modules\r\nconst require = createRequire(import.meta.url);\r\nconst nodePty = require('@homebridge/node-pty-prebuilt-multiarch');\r\n\r\n/**\r\n * List of interactive editor commands that require full terminal control\r\n */\r\nconst INTERACTIVE_EDITORS = [\r\n 'vim', 'nvim', 'vi', 'nano', 'emacs', 'micro', 'helix', 'hx',\r\n 'pico', 'joe', 'ne', 'mcedit'\r\n];\r\n\r\n/**\r\n * Patterns that indicate an editor will be opened\r\n */\r\nconst EDITOR_PATTERNS = [\r\n /^git\\s+rebase\\s+-i/, // git rebase -i (interactive)\r\n /^crontab\\s+-e/, // crontab -e (opens editor)\r\n /^visudo/, // visudo (opens editor)\r\n /^vipw/, // vipw (opens editor)\r\n /^sudoedit/, // sudoedit (opens editor)\r\n];\r\n\r\n/**\r\n * Check if a command is an interactive editor that needs full terminal control\r\n */\r\nexport function isInteractiveEditorCommand(command: string): boolean {\r\n const trimmed = command.trim();\r\n const parts = trimmed.split(/\\s+/);\r\n const baseCommand = parts[0].toLowerCase();\r\n\r\n // Direct editor commands\r\n if (INTERACTIVE_EDITORS.includes(baseCommand)) {\r\n return true;\r\n }\r\n\r\n // Check patterns\r\n for (const pattern of EDITOR_PATTERNS) {\r\n if (pattern.test(trimmed)) {\r\n return true;\r\n }\r\n }\r\n\r\n // Handle sudo/doas prefix\r\n if (baseCommand === 'sudo' || baseCommand === 'doas') {\r\n const actualCommand = parts.slice(1).join(' ');\r\n return isInteractiveEditorCommand(actualCommand);\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Check if the command is specifically for nano editor (the only remote-supported editor currently)\r\n */\r\nexport function isNanoEditor(command: string): boolean {\r\n const trimmed = command.trim();\r\n const parts = trimmed.split(/\\s+/);\r\n let baseCommand = parts[0].toLowerCase();\r\n\r\n // Handle sudo/doas prefix\r\n if (baseCommand === 'sudo' || baseCommand === 'doas') {\r\n baseCommand = parts[1]?.toLowerCase() || '';\r\n }\r\n\r\n return baseCommand === 'nano' || baseCommand === 'pico'; // pico is often aliased to nano\r\n}\r\n\r\n/**\r\n * Get the display name of an editor command for user-friendly messages\r\n */\r\nexport function getEditorName(command: string): string {\r\n const trimmed = command.trim();\r\n const parts = trimmed.split(/\\s+/);\r\n let baseCommand = parts[0].toLowerCase();\r\n\r\n // Handle sudo/doas prefix\r\n if (baseCommand === 'sudo' || baseCommand === 'doas') {\r\n baseCommand = parts[1]?.toLowerCase() || baseCommand;\r\n }\r\n\r\n // Map to display names\r\n const displayNames: Record<string, string> = {\r\n 'vim': 'Vim',\r\n 'nvim': 'Neovim',\r\n 'vi': 'Vi',\r\n 'nano': 'Nano',\r\n 'emacs': 'Emacs',\r\n 'micro': 'Micro',\r\n 'helix': 'Helix',\r\n 'hx': 'Helix',\r\n 'pico': 'Pico',\r\n 'joe': 'Joe',\r\n 'ne': 'Ne',\r\n 'mcedit': 'Midnight Commander Editor',\r\n };\r\n\r\n return displayNames[baseCommand] || baseCommand;\r\n}\r\n\r\n/**\r\n * Get the shell command for the current platform.\r\n * On Windows, prefers Git Bash if available for better terminal emulation.\r\n */\r\nfunction getShellCommand(): string {\r\n if (os.platform() !== 'win32') {\r\n return process.env.SHELL || '/bin/bash';\r\n }\r\n\r\n // On Windows, try to find Git Bash for better terminal emulation\r\n const gitBashPath = findGitBash();\r\n if (gitBashPath) {\r\n return gitBashPath;\r\n }\r\n\r\n // Fallback to PowerShell\r\n return 'powershell.exe';\r\n}\r\n\r\n/**\r\n * Find Git Bash on Windows. Returns null if not found.\r\n * Git Bash provides proper Unix terminal emulation for editors like nano.\r\n */\r\nfunction findGitBash(): string | null {\r\n const possiblePaths = [\r\n 'C:\\\\Program Files\\\\Git\\\\bin\\\\bash.exe',\r\n 'C:\\\\Program Files (x86)\\\\Git\\\\bin\\\\bash.exe',\r\n process.env.PROGRAMFILES ? `${process.env.PROGRAMFILES}\\\\Git\\\\bin\\\\bash.exe` : null,\r\n process.env['PROGRAMFILES(X86)'] ? `${process.env['PROGRAMFILES(X86)']}\\\\Git\\\\bin\\\\bash.exe` : null,\r\n // User-specific installation\r\n process.env.LOCALAPPDATA ? `${process.env.LOCALAPPDATA}\\\\Programs\\\\Git\\\\bin\\\\bash.exe` : null,\r\n ].filter(Boolean) as string[];\r\n\r\n for (const bashPath of possiblePaths) {\r\n try {\r\n const fs = require('fs');\r\n if (fs.existsSync(bashPath)) {\r\n return bashPath;\r\n }\r\n } catch {\r\n // Continue to next path\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Check if we should use bash-style arguments for the shell\r\n */\r\nfunction usesBashArgs(shell: string): boolean {\r\n return shell.includes('bash') || shell.includes('sh');\r\n}\r\n\r\n/**\r\n * Common terminal reset sequences for cleanup after editor exits\r\n */\r\nfunction getTerminalResetSequences(): string {\r\n return [\r\n '\\x1b[?1049l', // Exit alternate screen buffer\r\n '\\x1b[?25l', // HIDE cursor (let Ink show it in the right place)\r\n '\\x1b[0m', // Reset text attributes (colors, bold, etc.)\r\n '\\x1b[?1000l', // Disable mouse tracking (X10)\r\n '\\x1b[?1002l', // Disable mouse button tracking\r\n '\\x1b[?1003l', // Disable mouse any-event tracking\r\n '\\x1b[?1006l', // Disable SGR mouse mode\r\n '\\x1b[?2004l', // Disable bracketed paste mode\r\n '\\x1b[?1u', // Disable CSI u mode (extended key reporting) - some terminals\r\n '\\x1b[>4;0m', // Disable modifyOtherKeys mode\r\n '\\x1b[?66l', // Disable application keypad mode\r\n '\\x1b[?1l', // Disable cursor keys application mode\r\n '\\x1bc', // Full terminal reset (RIS - Reset to Initial State)\r\n '\\x1b[?25l', // Hide cursor again after reset (reset shows it)\r\n ].join('');\r\n}\r\n\r\n/**\r\n * Common setup for interactive editor: raw stdin mode and handlers\r\n */\r\nfunction setupInteractiveMode(\r\n ptyProcess: any,\r\n onExit: (exitCode: number) => void\r\n): { cleanup: () => void; kill: () => void } {\r\n let isRunning = true;\r\n\r\n // Save original stdin settings\r\n const wasRaw = process.stdin.isRaw;\r\n\r\n // Set stdin to raw mode for direct key passthrough\r\n if (process.stdin.isTTY) {\r\n process.stdin.setRawMode(true);\r\n }\r\n process.stdin.resume();\r\n\r\n // Pipe stdin to PTY (user keys -> editor)\r\n const stdinHandler = (data: Buffer) => {\r\n if (isRunning) {\r\n ptyProcess.write(data.toString());\r\n }\r\n };\r\n process.stdin.on('data', stdinHandler);\r\n\r\n // Pipe PTY output to stdout (editor display -> terminal)\r\n ptyProcess.onData((data: string) => {\r\n if (isRunning) {\r\n process.stdout.write(data);\r\n }\r\n });\r\n\r\n // Handle terminal resize\r\n const resizeHandler = () => {\r\n if (isRunning) {\r\n const newCols = process.stdout.columns || 80;\r\n const newRows = process.stdout.rows || 24;\r\n try {\r\n ptyProcess.resize(newCols, newRows);\r\n } catch (e) {\r\n // Ignore resize errors\r\n }\r\n }\r\n };\r\n process.stdout.on('resize', resizeHandler);\r\n\r\n // Handle PTY exit\r\n ptyProcess.onExit(({ exitCode }: { exitCode: number }) => {\r\n isRunning = false;\r\n\r\n // CRITICAL: Remove our stdin handler FIRST\r\n process.stdin.removeListener('data', stdinHandler);\r\n process.stdout.removeListener('resize', resizeHandler);\r\n\r\n // Restore stdin to original raw mode setting\r\n if (process.stdin.isTTY) {\r\n process.stdin.setRawMode(wasRaw ?? false);\r\n }\r\n\r\n // COMPREHENSIVE TERMINAL RESET\r\n process.stdout.write(getTerminalResetSequences());\r\n\r\n // Give terminal time to process reset sequences\r\n setTimeout(() => {\r\n onExit(exitCode);\r\n }, 200);\r\n });\r\n\r\n return {\r\n cleanup: () => {\r\n process.stdin.removeListener('data', stdinHandler);\r\n process.stdout.removeListener('resize', resizeHandler);\r\n if (process.stdin.isTTY) {\r\n process.stdin.setRawMode(wasRaw ?? false);\r\n }\r\n },\r\n kill: () => {\r\n if (isRunning) {\r\n isRunning = false;\r\n try {\r\n ptyProcess.kill();\r\n } catch (e) {\r\n // Ignore kill errors\r\n }\r\n }\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Run an interactive editor with full terminal control (LOCAL mode).\r\n * This function:\r\n * 1. Clears the screen and enters alternate screen buffer\r\n * 2. Spawns a PTY process\r\n * 3. Pipes stdin directly to the PTY (raw mode)\r\n * 4. Pipes PTY output directly to stdout\r\n * 5. Handles cleanup on exit\r\n * \r\n * Uses alternate screen buffer to prevent chat history from showing through.\r\n */\r\nexport function runInteractiveEditor(\r\n command: string,\r\n cwd: string,\r\n onExit: (exitCode: number) => void\r\n): { kill: () => void } {\r\n const shell = getShellCommand();\r\n const isWindows = os.platform() === 'win32';\r\n // Use bash-style args for Git Bash, PowerShell-style only if falling back to PowerShell\r\n const isBash = usesBashArgs(shell);\r\n const args = isBash ? ['-c', command] : (isWindows ? ['-Command', command] : ['-c', command]);\r\n\r\n // Get terminal dimensions\r\n const cols = process.stdout.columns || 80;\r\n const rows = process.stdout.rows || 24;\r\n\r\n // Enter alternate screen buffer and clear screen to hide chat history\r\n // This combined with cygwin terminal type provides proper display on Windows\r\n const enterAlternateBuffer = [\r\n '\\x1b[?1049h', // Enter alternate screen buffer\r\n '\\x1b[2J', // Clear entire screen\r\n '\\x1b[H', // Move cursor to home position\r\n ].join('');\r\n process.stdout.write(enterAlternateBuffer);\r\n\r\n // Spawn PTY process - use 'cygwin' terminal type on Windows for better compatibility\r\n // 'xterm-256color' can cause issues with some Windows terminal configurations\r\n const ptyProcess = nodePty.spawn(shell, args, {\r\n name: isWindows ? 'cygwin' : 'xterm-256color',\r\n cols,\r\n rows,\r\n cwd,\r\n env: {\r\n ...process.env,\r\n // Use cygwin TERM on Windows for better nano compatibility\r\n TERM: isWindows ? 'cygwin' : 'xterm-256color',\r\n COLORTERM: 'truecolor',\r\n } as { [key: string]: string },\r\n });\r\n\r\n let isRunning = true;\r\n\r\n // Save original stdin settings\r\n const wasRaw = process.stdin.isRaw;\r\n\r\n // Set stdin to raw mode for direct key passthrough\r\n if (process.stdin.isTTY) {\r\n process.stdin.setRawMode(true);\r\n }\r\n process.stdin.resume();\r\n\r\n // Pipe stdin to PTY (user keys -> editor)\r\n const stdinHandler = (data: Buffer) => {\r\n if (isRunning) {\r\n ptyProcess.write(data.toString());\r\n }\r\n };\r\n process.stdin.on('data', stdinHandler);\r\n\r\n // Pipe PTY output to stdout (editor display -> terminal)\r\n ptyProcess.onData((data: string) => {\r\n if (isRunning) {\r\n process.stdout.write(data);\r\n }\r\n });\r\n\r\n // Handle terminal resize\r\n const resizeHandler = () => {\r\n if (isRunning) {\r\n const newCols = process.stdout.columns || 80;\r\n const newRows = process.stdout.rows || 24;\r\n try {\r\n ptyProcess.resize(newCols, newRows);\r\n } catch (e) {\r\n // Ignore resize errors\r\n }\r\n }\r\n };\r\n process.stdout.on('resize', resizeHandler);\r\n\r\n // Handle PTY exit\r\n ptyProcess.onExit(({ exitCode }: { exitCode: number }) => {\r\n isRunning = false;\r\n\r\n // CRITICAL: Remove our stdin handler FIRST\r\n process.stdin.removeListener('data', stdinHandler);\r\n process.stdout.removeListener('resize', resizeHandler);\r\n\r\n // Restore stdin to original raw mode setting\r\n if (process.stdin.isTTY) {\r\n process.stdin.setRawMode(wasRaw ?? false);\r\n }\r\n\r\n // COMPREHENSIVE TERMINAL RESET\r\n process.stdout.write(getTerminalResetSequences());\r\n\r\n // Give terminal time to process reset sequences\r\n setTimeout(() => {\r\n onExit(exitCode);\r\n }, 200);\r\n });\r\n\r\n return {\r\n kill: () => {\r\n if (isRunning) {\r\n isRunning = false;\r\n try {\r\n ptyProcess.kill();\r\n } catch (e) {\r\n // Ignore kill errors\r\n }\r\n }\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Run an interactive editor in WSL session via node-pty.\r\n * Uses wsl.exe to execute the editor command in the specified distribution.\r\n */\r\nexport function runWSLEditor(\r\n distribution: string,\r\n command: string,\r\n cwd: string,\r\n onExit: (exitCode: number) => void\r\n): { kill: () => void } {\r\n // Get terminal dimensions\r\n const cols = process.stdout.columns || 80;\r\n const rows = process.stdout.rows || 24;\r\n\r\n // Build WSL command - cd to directory and run editor\r\n // wsl.exe -d <distro> -- bash -c \"cd <path> && <command>\"\r\n const wslArgs = [\r\n '-d', distribution,\r\n '--',\r\n 'bash', '-c',\r\n `cd \"${cwd}\" && ${command}`\r\n ];\r\n\r\n // Spawn PTY process with wsl.exe\r\n const ptyProcess = nodePty.spawn('wsl.exe', wslArgs, {\r\n name: 'xterm-256color',\r\n cols,\r\n rows,\r\n cwd: process.cwd(), // Use current Windows cwd\r\n env: {\r\n ...process.env,\r\n TERM: 'xterm-256color',\r\n COLORTERM: 'truecolor',\r\n } as { [key: string]: string },\r\n });\r\n\r\n const { kill } = setupInteractiveMode(ptyProcess, onExit);\r\n return { kill };\r\n}\r\n\r\n/**\r\n * Interactive process interface for WSL PTY commands\r\n */\r\nexport interface WSLPtyProcess {\r\n write: (data: string) => void;\r\n kill: () => void;\r\n resize: (cols: number, rows: number) => void;\r\n isRunning: () => boolean;\r\n}\r\n\r\n/**\r\n * Run a command in WSL session via node-pty with streaming output.\r\n * Unlike runWSLEditor, this doesn't take over the terminal - it streams output to a callback.\r\n * This is essential for sudo commands that need TTY for password prompts.\r\n */\r\nexport function runWSLCommand(\r\n distribution: string,\r\n command: string,\r\n cwd: string,\r\n onData: (data: string) => void,\r\n onExit: (exitCode: number) => void,\r\n initialCols?: number,\r\n initialRows?: number\r\n): WSLPtyProcess {\r\n // Get terminal dimensions - use provided values or fall back to process.stdout\r\n // Constrained dimensions help with proper escape sequence handling in UI display\r\n const cols = initialCols || process.stdout.columns || 80;\r\n const rows = initialRows || process.stdout.rows || 24;\r\n\r\n // Build WSL command - cd to directory and run command\r\n const wslArgs = [\r\n '-d', distribution,\r\n '--',\r\n 'bash', '-c',\r\n `cd \"${cwd}\" && ${command}`\r\n ];\r\n\r\n // Spawn PTY process with wsl.exe\r\n const ptyProcess = nodePty.spawn('wsl.exe', wslArgs, {\r\n name: 'xterm-256color',\r\n cols,\r\n rows,\r\n cwd: process.cwd(),\r\n env: {\r\n ...process.env,\r\n TERM: 'xterm-256color',\r\n COLORTERM: 'truecolor',\r\n } as { [key: string]: string },\r\n });\r\n\r\n let isRunning = true;\r\n let hasExited = false;\r\n\r\n const finalizeExit = (exitCode: number) => {\r\n if (hasExited) return;\r\n hasExited = true;\r\n isRunning = false;\r\n onExit(exitCode);\r\n };\r\n\r\n // Stream output to callback\r\n ptyProcess.onData((data: string) => {\r\n if (isRunning) {\r\n onData(data);\r\n }\r\n });\r\n\r\n // Handle exit\r\n ptyProcess.onExit(({ exitCode }: { exitCode: number }) => {\r\n finalizeExit(exitCode);\r\n });\r\n\r\n return {\r\n write: (data: string) => {\r\n if (isRunning) {\r\n ptyProcess.write(data);\r\n }\r\n },\r\n kill: () => {\r\n if (!isRunning || hasExited) {\r\n return;\r\n }\r\n isRunning = false;\r\n try {\r\n ptyProcess.kill();\r\n } catch (e) {\r\n // Ignore kill errors\r\n }\r\n // Failsafe in case PTY exit event is missed.\r\n setTimeout(() => {\r\n finalizeExit(130);\r\n }, 150);\r\n },\r\n resize: (cols: number, rows: number) => {\r\n if (isRunning) {\r\n try {\r\n ptyProcess.resize(cols, rows);\r\n } catch (e) {\r\n // Ignore resize errors\r\n }\r\n }\r\n },\r\n isRunning: () => isRunning\r\n };\r\n}\r\n\r\n/**\r\n * Run a command in Docker container via node-pty with streaming output.\r\n * Unlike runDockerEditor, this doesn't take over the terminal - it streams output to a callback.\r\n * This is essential for sudo commands that need TTY for password prompts.\r\n */\r\nexport function runDockerCommand(\r\n containerId: string,\r\n command: string,\r\n cwd: string,\r\n onData: (data: string) => void,\r\n onExit: (exitCode: number) => void,\r\n initialCols?: number,\r\n initialRows?: number\r\n): WSLPtyProcess {\r\n // Get terminal dimensions - use provided values or fall back to process.stdout\r\n // Constrained dimensions help with proper escape sequence handling in UI display\r\n const cols = initialCols || process.stdout.columns || 80;\r\n const rows = initialRows || process.stdout.rows || 24;\r\n\r\n // Build docker exec command\r\n const dockerArgs = [\r\n 'exec',\r\n '-it',\r\n containerId,\r\n 'bash', '-c',\r\n `cd \"${cwd}\" && ${command}`\r\n ];\r\n\r\n // Spawn PTY process with docker\r\n const ptyProcess = nodePty.spawn('docker', dockerArgs, {\r\n name: 'xterm-256color',\r\n cols,\r\n rows,\r\n cwd: process.cwd(),\r\n env: {\r\n ...process.env,\r\n TERM: 'xterm-256color',\r\n COLORTERM: 'truecolor',\r\n } as { [key: string]: string },\r\n });\r\n\r\n let isRunning = true;\r\n let hasExited = false;\r\n\r\n const finalizeExit = (exitCode: number) => {\r\n if (hasExited) return;\r\n hasExited = true;\r\n isRunning = false;\r\n onExit(exitCode);\r\n };\r\n\r\n // Stream output to callback\r\n ptyProcess.onData((data: string) => {\r\n if (isRunning) {\r\n onData(data);\r\n }\r\n });\r\n\r\n // Handle exit\r\n ptyProcess.onExit(({ exitCode }: { exitCode: number }) => {\r\n finalizeExit(exitCode);\r\n });\r\n\r\n return {\r\n write: (data: string) => {\r\n if (isRunning) {\r\n ptyProcess.write(data);\r\n }\r\n },\r\n kill: () => {\r\n if (!isRunning || hasExited) {\r\n return;\r\n }\r\n isRunning = false;\r\n try {\r\n ptyProcess.kill();\r\n } catch (e) {\r\n // Ignore kill errors\r\n }\r\n // Failsafe in case PTY exit event is missed.\r\n setTimeout(() => {\r\n finalizeExit(130);\r\n }, 150);\r\n },\r\n resize: (cols: number, rows: number) => {\r\n if (isRunning) {\r\n try {\r\n ptyProcess.resize(cols, rows);\r\n } catch (e) {\r\n // Ignore resize errors\r\n }\r\n }\r\n },\r\n isRunning: () => isRunning\r\n };\r\n}\r\n\r\n/**\r\n * Run an interactive editor in Docker container via node-pty.\r\n * Uses docker exec -it to execute the editor command in the container.\r\n */\r\nexport function runDockerEditor(\r\n containerId: string,\r\n command: string,\r\n cwd: string,\r\n onExit: (exitCode: number) => void\r\n): { kill: () => void } {\r\n // Get terminal dimensions\r\n const cols = process.stdout.columns || 80;\r\n const rows = process.stdout.rows || 24;\r\n\r\n // Build docker exec command\r\n // docker exec -it <container> bash -c \"cd <path> && <command>\"\r\n const dockerArgs = [\r\n 'exec',\r\n '-it',\r\n containerId,\r\n 'bash', '-c',\r\n `cd \"${cwd}\" && ${command}`\r\n ];\r\n\r\n // Spawn PTY process with docker\r\n const ptyProcess = nodePty.spawn('docker', dockerArgs, {\r\n name: 'xterm-256color',\r\n cols,\r\n rows,\r\n cwd: process.cwd(),\r\n env: {\r\n ...process.env,\r\n TERM: 'xterm-256color',\r\n COLORTERM: 'truecolor',\r\n } as { [key: string]: string },\r\n });\r\n\r\n const { kill } = setupInteractiveMode(ptyProcess, onExit);\r\n return { kill };\r\n}\r\n\r\n/**\r\n * Run an interactive editor in SSH session via ssh2's interactive shell.\r\n * This is more complex as we need to use the ssh2 client's shell() method\r\n * instead of exec() to get a proper interactive PTY.\r\n */\r\nexport function runSSHEditor(\r\n sshClient: any, // ssh2 Client\r\n command: string,\r\n cwd: string,\r\n onExit: (exitCode: number) => void\r\n): { kill: () => void } {\r\n let isRunning = true;\r\n let stream: any = null;\r\n\r\n // Save original stdin settings\r\n const wasRaw = process.stdin.isRaw;\r\n\r\n // Get terminal dimensions\r\n const cols = process.stdout.columns || 80;\r\n const rows = process.stdout.rows || 24;\r\n\r\n // Request an interactive shell from the SSH server\r\n sshClient.shell(\r\n {\r\n term: 'xterm-256color',\r\n cols,\r\n rows,\r\n },\r\n (err: Error | null, shellStream: any) => {\r\n if (err) {\r\n logError('Failed to open SSH shell', err);\r\n onExit(1);\r\n return;\r\n }\r\n\r\n stream = shellStream;\r\n\r\n // Set stdin to raw mode for direct key passthrough\r\n if (process.stdin.isTTY) {\r\n process.stdin.setRawMode(true);\r\n }\r\n process.stdin.resume();\r\n\r\n // Pipe stdin to SSH stream (user keys -> remote shell)\r\n const stdinHandler = (data: Buffer) => {\r\n if (isRunning && stream) {\r\n stream.write(data);\r\n }\r\n };\r\n process.stdin.on('data', stdinHandler);\r\n\r\n // Pipe SSH stream output to stdout (remote -> terminal)\r\n stream.on('data', (data: Buffer) => {\r\n if (isRunning) {\r\n process.stdout.write(data);\r\n }\r\n });\r\n\r\n // Handle terminal resize\r\n const resizeHandler = () => {\r\n if (isRunning && stream) {\r\n const newCols = process.stdout.columns || 80;\r\n const newRows = process.stdout.rows || 24;\r\n try {\r\n stream.setWindow(newRows, newCols, 0, 0);\r\n } catch (e) {\r\n // Ignore resize errors\r\n }\r\n }\r\n };\r\n process.stdout.on('resize', resizeHandler);\r\n\r\n // Handle stream close\r\n stream.on('close', () => {\r\n isRunning = false;\r\n\r\n // CRITICAL: Remove our stdin handler FIRST\r\n process.stdin.removeListener('data', stdinHandler);\r\n process.stdout.removeListener('resize', resizeHandler);\r\n\r\n // Restore stdin to original raw mode setting\r\n if (process.stdin.isTTY) {\r\n process.stdin.setRawMode(wasRaw ?? false);\r\n }\r\n\r\n // COMPREHENSIVE TERMINAL RESET\r\n process.stdout.write(getTerminalResetSequences());\r\n\r\n // Give terminal time to process reset sequences\r\n setTimeout(() => {\r\n onExit(0);\r\n }, 200);\r\n });\r\n\r\n // Send the command to the shell: cd to directory and run editor\r\n // Note: We send the command with exit so shell closes after editor exits\r\n stream.write(`cd \"${cwd}\" && ${command}; exit\\n`);\r\n }\r\n );\r\n\r\n return {\r\n kill: () => {\r\n if (isRunning) {\r\n isRunning = false;\r\n if (stream) {\r\n try {\r\n stream.close();\r\n } catch (e) {\r\n // Ignore close errors\r\n }\r\n }\r\n }\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Run an interactive editor in a Docker container that is accessed through SSH.\r\n * This routes the docker exec command through the SSH session to properly access\r\n * the remote Docker daemon instead of trying to use local Docker.\r\n */\r\nexport function runNestedDockerSSHEditor(\r\n sshClient: any, // ssh2 Client from parent SSH context\r\n containerId: string,\r\n command: string,\r\n cwd: string,\r\n onExit: (exitCode: number) => void\r\n): { kill: () => void } {\r\n let isRunning = true;\r\n let stream: any = null;\r\n\r\n // Save original stdin settings\r\n const wasRaw = process.stdin.isRaw;\r\n\r\n // Get terminal dimensions\r\n const cols = process.stdout.columns || 80;\r\n const rows = process.stdout.rows || 24;\r\n\r\n // Enter alternate screen buffer and clear screen to hide chat history\r\n const enterAlternateBuffer = [\r\n '\\x1b[?1049h', // Enter alternate screen buffer\r\n '\\x1b[2J', // Clear entire screen\r\n '\\x1b[H', // Move cursor to home position\r\n ].join('');\r\n process.stdout.write(enterAlternateBuffer);\r\n\r\n // Request an interactive shell from the SSH server\r\n sshClient.shell(\r\n {\r\n term: 'xterm-256color',\r\n cols,\r\n rows,\r\n },\r\n (err: Error | null, shellStream: any) => {\r\n if (err) {\r\n logError('Failed to open SSH shell for nested Docker editor', err);\r\n onExit(1);\r\n return;\r\n }\r\n\r\n stream = shellStream;\r\n\r\n // Set stdin to raw mode for direct key passthrough\r\n if (process.stdin.isTTY) {\r\n process.stdin.setRawMode(true);\r\n }\r\n process.stdin.resume();\r\n\r\n // Pipe stdin to SSH stream (user keys -> remote shell -> docker)\r\n const stdinHandler = (data: Buffer) => {\r\n if (isRunning && stream) {\r\n stream.write(data);\r\n }\r\n };\r\n process.stdin.on('data', stdinHandler);\r\n\r\n // Pipe SSH stream output to stdout (docker -> remote shell -> terminal)\r\n stream.on('data', (data: Buffer) => {\r\n if (isRunning) {\r\n process.stdout.write(data);\r\n }\r\n });\r\n\r\n // Handle terminal resize\r\n const resizeHandler = () => {\r\n if (isRunning && stream) {\r\n const newCols = process.stdout.columns || 80;\r\n const newRows = process.stdout.rows || 24;\r\n try {\r\n stream.setWindow(newRows, newCols, 0, 0);\r\n } catch (e) {\r\n // Ignore resize errors\r\n }\r\n }\r\n };\r\n process.stdout.on('resize', resizeHandler);\r\n\r\n // Handle stream close\r\n stream.on('close', () => {\r\n isRunning = false;\r\n\r\n // CRITICAL: Remove our stdin handler FIRST\r\n process.stdin.removeListener('data', stdinHandler);\r\n process.stdout.removeListener('resize', resizeHandler);\r\n\r\n // Restore stdin to original raw mode setting\r\n if (process.stdin.isTTY) {\r\n process.stdin.setRawMode(wasRaw ?? false);\r\n }\r\n\r\n // COMPREHENSIVE TERMINAL RESET\r\n process.stdout.write(getTerminalResetSequences());\r\n\r\n // Give terminal time to process reset sequences\r\n setTimeout(() => {\r\n onExit(0);\r\n }, 200);\r\n });\r\n\r\n // Build the docker exec command to run via SSH shell\r\n // Use docker exec -it for interactive TTY, cd to cwd, run command, then exit\r\n const escapedCwd = cwd.replace(/\"/g, '\\\\\"');\r\n const escapedCommand = command.replace(/\"/g, '\\\\\"');\r\n const dockerExecCommand = `docker exec -it ${containerId} bash -c \"cd \\\\\"${escapedCwd}\\\\\" && ${escapedCommand}\"; exit\\n`;\r\n\r\n stream.write(dockerExecCommand);\r\n }\r\n );\r\n\r\n return {\r\n kill: () => {\r\n if (isRunning) {\r\n isRunning = false;\r\n if (stream) {\r\n try {\r\n stream.close();\r\n } catch (e) {\r\n // Ignore close errors\r\n }\r\n }\r\n }\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * SSH PTY process interface for SSH commands with streaming output\r\n */\r\nexport interface SSHPtyProcess {\r\n write: (data: string) => void;\r\n kill: () => void;\r\n resize: (cols: number, rows: number) => void;\r\n isRunning: () => boolean;\r\n}\r\n\r\n/**\r\n * Run a command in SSH session via ssh2's exec with PTY for streaming output.\r\n * Uses exec() with PTY option instead of shell() to avoid login banners and command echo.\r\n * This reuses the existing SSH connection so password is not required for each command.\r\n */\r\nexport function runSSHCommand(\r\n sshClient: any, // ssh2 Client\r\n command: string,\r\n cwd: string,\r\n onData: (data: string) => void,\r\n onExit: (exitCode: number) => void,\r\n initialCols?: number,\r\n initialRows?: number\r\n): SSHPtyProcess {\r\n let isRunning = true;\r\n let stream: any = null;\r\n let hasExited = false;\r\n let killRequested = false;\r\n\r\n const finalizeExit = (exitCode: number) => {\r\n if (hasExited) return;\r\n hasExited = true;\r\n isRunning = false;\r\n onExit(exitCode);\r\n };\r\n\r\n // Get terminal dimensions - use provided values or fall back to process.stdout\r\n // Constrained dimensions help with proper escape sequence handling in UI display\r\n const cols = initialCols || process.stdout.columns || 80;\r\n const rows = initialRows || process.stdout.rows || 24;\r\n\r\n // Build the full command with cd\r\n const fullCommand = `cd \"${cwd}\" && ${command}`;\r\n\r\n // Use exec() with PTY option instead of shell()\r\n // This runs a single command with PTY support but without login shell overhead\r\n // IMPORTANT: Disable ECHO mode to prevent output duplication\r\n sshClient.exec(\r\n fullCommand,\r\n {\r\n pty: {\r\n term: 'xterm-256color',\r\n cols,\r\n rows,\r\n modes: {\r\n ECHO: 0 // Disable echo to prevent duplicate output\r\n }\r\n }\r\n },\r\n (err: Error | null, execStream: any) => {\r\n if (err) {\r\n logError('Failed to execute SSH command', err);\r\n finalizeExit(1);\r\n return;\r\n }\r\n\r\n stream = execStream;\r\n\r\n // If kill happened before ssh2 delivered the exec stream, close immediately.\r\n if (killRequested) {\r\n try {\r\n stream.close();\r\n } catch (e) {\r\n // Ignore close errors\r\n }\r\n finalizeExit(130);\r\n return;\r\n }\r\n\r\n // Stream output to callback\r\n // Note: In PTY mode, stdout and stderr are merged into a single stream\r\n stream.on('data', (data: Buffer) => {\r\n if (isRunning) {\r\n onData(data.toString());\r\n }\r\n });\r\n\r\n // Handle stream close with exit code\r\n stream.on('close', (code: number) => {\r\n finalizeExit(code || 0);\r\n });\r\n }\r\n );\r\n\r\n return {\r\n write: (data: string) => {\r\n if (isRunning && stream) {\r\n stream.write(data);\r\n }\r\n },\r\n kill: () => {\r\n if (!isRunning || hasExited) {\r\n return;\r\n }\r\n killRequested = true;\r\n isRunning = false;\r\n if (stream) {\r\n try {\r\n stream.close();\r\n } catch (e) {\r\n // Ignore close errors\r\n }\r\n }\r\n // Failsafe: if close event doesn't arrive, still resolve the caller.\r\n setTimeout(() => {\r\n finalizeExit(130);\r\n }, 150);\r\n },\r\n resize: (cols: number, rows: number) => {\r\n if (isRunning && stream) {\r\n try {\r\n stream.setWindow(rows, cols, 0, 0);\r\n } catch (e) {\r\n // Ignore resize errors\r\n }\r\n }\r\n },\r\n isRunning: () => isRunning\r\n };\r\n}\r\n\r\n\r\n/**\r\n * Run a command in a local PTY.\r\n * Useful for executing commands that are either local or wrapped (e.g., `wsl ...` or `ssh ...`).\r\n */\r\nexport function runLocalPty(\r\n command: string,\r\n cwd: string,\r\n onData: (data: string) => void,\r\n onExit: (exitCode: number) => void,\r\n initialCols?: number,\r\n initialRows?: number\r\n): any {\r\n // Get terminal dimensions - use provided values or fall back to process.stdout\r\n const cols = initialCols || process.stdout.columns || 80;\r\n const rows = initialRows || process.stdout.rows || 24;\r\n\r\n const shell = getShellCommand();\r\n const isWindows = os.platform() === 'win32';\r\n // Use bash-style args for Git Bash\r\n const isBash = usesBashArgs(shell);\r\n const shellArgs = isBash ? ['-c', command] : (isWindows ? ['-Command', command] : ['-c', command]);\r\n\r\n // Spawn PTY process\r\n const ptyProcess = nodePty.spawn(shell, shellArgs, {\r\n name: isWindows ? 'cygwin' : 'xterm-256color', // cygwin for Windows compatibility\r\n cols,\r\n rows,\r\n cwd,\r\n env: {\r\n ...process.env,\r\n TERM: isWindows ? 'cygwin' : 'xterm-256color',\r\n COLORTERM: 'truecolor',\r\n } as { [key: string]: string },\r\n });\r\n\r\n let isRunning = true;\r\n\r\n // Stream output to callback\r\n ptyProcess.onData((data: string) => {\r\n if (isRunning) {\r\n onData(data);\r\n }\r\n });\r\n\r\n // Handle exit\r\n ptyProcess.onExit(({ exitCode }: { exitCode: number }) => {\r\n isRunning = false;\r\n onExit(exitCode);\r\n });\r\n\r\n return {\r\n write: (data: string) => {\r\n if (isRunning) {\r\n ptyProcess.write(data);\r\n }\r\n },\r\n kill: () => {\r\n if (isRunning) {\r\n isRunning = false;\r\n try {\r\n ptyProcess.kill();\r\n } catch (e) {\r\n // Ignore kill errors\r\n }\r\n }\r\n },\r\n resize: (cols: number, rows: number) => {\r\n if (isRunning) {\r\n try {\r\n ptyProcess.resize(cols, rows);\r\n } catch (e) {\r\n // Ignore resize errors\r\n }\r\n }\r\n },\r\n isRunning: () => isRunning\r\n };\r\n}\r\n"],"mappings":"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","names":["require","cols","rows"]}
@@ -1,232 +1,193 @@
1
- import * as fs from 'fs';
2
- import * as path from 'path';
3
- /**
4
- * Read file with optional line range
5
- */
6
- export function readFile(filePath, startLine, endLine) {
7
- const content = fs.readFileSync(filePath, 'utf-8');
8
- if (startLine !== undefined && endLine !== undefined) {
9
- const lines = content.split('\n');
10
- return lines.slice(startLine - 1, endLine).join('\n');
11
- }
12
- return content;
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ function readFile(filePath, startLine, endLine) {
4
+ const content = fs.readFileSync(filePath, "utf-8");
5
+ if (startLine !== void 0 && endLine !== void 0) {
6
+ const lines = content.split("\n");
7
+ return lines.slice(startLine - 1, endLine).join("\n");
8
+ }
9
+ return content;
13
10
  }
14
- /**
15
- * Write file safely
16
- */
17
- export function writeFile(filePath, content) {
18
- const dir = path.dirname(filePath);
19
- if (!fs.existsSync(dir)) {
20
- fs.mkdirSync(dir, { recursive: true });
21
- }
22
- fs.writeFileSync(filePath, content, 'utf-8');
11
+ function writeFile(filePath, content) {
12
+ const dir = path.dirname(filePath);
13
+ if (!fs.existsSync(dir)) {
14
+ fs.mkdirSync(dir, { recursive: true });
15
+ }
16
+ fs.writeFileSync(filePath, content, "utf-8");
23
17
  }
24
- /**
25
- * Search and replace in file
26
- */
27
- export function searchReplace(filePath, searchPattern, replacement) {
28
- const content = fs.readFileSync(filePath, 'utf-8');
29
- // Check if pattern exists
30
- if (!content.includes(searchPattern)) {
31
- throw new Error(`Pattern not found in file: ${searchPattern}`);
32
- }
33
- // Count occurrences
34
- const occurrences = content.split(searchPattern).length - 1;
35
- if (occurrences > 1) {
36
- throw new Error(`Pattern appears ${occurrences} times. Please use a more specific pattern.`);
37
- }
38
- const newContent = content.replace(searchPattern, replacement);
39
- fs.writeFileSync(filePath, newContent, 'utf-8');
40
- return `Successfully replaced pattern in ${filePath}`;
18
+ function searchReplace(filePath, searchPattern, replacement) {
19
+ const content = fs.readFileSync(filePath, "utf-8");
20
+ if (!content.includes(searchPattern)) {
21
+ throw new Error(`Pattern not found in file: ${searchPattern}`);
22
+ }
23
+ const occurrences = content.split(searchPattern).length - 1;
24
+ if (occurrences > 1) {
25
+ throw new Error(`Pattern appears ${occurrences} times. Please use a more specific pattern.`);
26
+ }
27
+ const newContent = content.replace(searchPattern, replacement);
28
+ fs.writeFileSync(filePath, newContent, "utf-8");
29
+ return `Successfully replaced pattern in ${filePath}`;
41
30
  }
42
- /**
43
- * List directory contents
44
- */
45
- export function listDirectory(dirPath, recursive = false) {
46
- const results = [];
47
- function walk(dir, prefix = '') {
48
- const entries = fs.readdirSync(dir, { withFileTypes: true });
49
- for (const entry of entries) {
50
- const fullPath = path.join(dir, entry.name);
51
- const relativePath = path.join(prefix, entry.name);
52
- results.push(relativePath);
53
- if (recursive && entry.isDirectory()) {
54
- walk(fullPath, relativePath);
55
- }
56
- }
31
+ function listDirectory(dirPath, recursive = false) {
32
+ const results = [];
33
+ function walk(dir, prefix = "") {
34
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
35
+ for (const entry of entries) {
36
+ const fullPath = path.join(dir, entry.name);
37
+ const relativePath = path.join(prefix, entry.name);
38
+ results.push(relativePath);
39
+ if (recursive && entry.isDirectory()) {
40
+ walk(fullPath, relativePath);
41
+ }
57
42
  }
58
- walk(dirPath);
59
- return results;
43
+ }
44
+ walk(dirPath);
45
+ return results;
60
46
  }
61
- /**
62
- * Get the count of items in a directory (non-recursive, fast)
63
- */
64
47
  function getDirectoryItemCount(dirPath) {
65
- try {
66
- const entries = fs.readdirSync(dirPath);
67
- return entries.length;
68
- }
69
- catch {
70
- return 0;
71
- }
48
+ try {
49
+ const entries = fs.readdirSync(dirPath);
50
+ return entries.length;
51
+ } catch {
52
+ return 0;
53
+ }
72
54
  }
73
- /**
74
- * Format file size in KB with appropriate precision
75
- */
76
55
  function formatSizeKB(bytes) {
77
- const kb = bytes / 1024;
78
- if (kb < 1)
79
- return `${(kb).toFixed(2)}KB`;
80
- if (kb < 10)
81
- return `${kb.toFixed(1)}KB`;
82
- if (kb < 1024)
83
- return `${Math.round(kb)}KB`;
84
- const mb = kb / 1024;
85
- if (mb < 10)
86
- return `${mb.toFixed(1)}MB`;
87
- return `${Math.round(mb)}MB`;
56
+ const kb = bytes / 1024;
57
+ if (kb < 1) return `${kb.toFixed(2)}KB`;
58
+ if (kb < 10) return `${kb.toFixed(1)}KB`;
59
+ if (kb < 1024) return `${Math.round(kb)}KB`;
60
+ const mb = kb / 1024;
61
+ if (mb < 10) return `${mb.toFixed(1)}MB`;
62
+ return `${Math.round(mb)}MB`;
88
63
  }
89
- /**
90
- * Enhanced directory listing with statistics and smart limiting
91
- * Shows all directories (navigation is critical) but limits files
92
- */
93
- export function listDirectoryEnhanced(dirPath, options = {}) {
94
- const { fileLimit = 100, dirLimit = 50, showHidden = true, largeThreshold = 100 } = options;
95
- const directories = [];
96
- const files = [];
97
- const largeDirectories = [];
98
- let totalDirectories = 0;
99
- let totalFiles = 0;
100
- try {
101
- const entries = fs.readdirSync(dirPath, { withFileTypes: true });
102
- for (const entry of entries) {
103
- // Skip hidden files if showHidden is false
104
- if (!showHidden && entry.name.startsWith('.')) {
105
- continue;
106
- }
107
- const fullPath = path.join(dirPath, entry.name);
108
- if (entry.isDirectory()) {
109
- totalDirectories++;
110
- const itemCount = getDirectoryItemCount(fullPath);
111
- directories.push({
112
- name: entry.name,
113
- itemCount,
114
- isDirectory: true
115
- });
116
- // Track large directories
117
- if (itemCount >= largeThreshold) {
118
- largeDirectories.push({ name: entry.name, itemCount });
119
- }
120
- }
121
- else {
122
- totalFiles++;
123
- try {
124
- const stat = fs.statSync(fullPath);
125
- files.push({
126
- name: entry.name,
127
- sizeKB: formatSizeKB(stat.size),
128
- isDirectory: false
129
- });
130
- }
131
- catch {
132
- files.push({
133
- name: entry.name,
134
- sizeKB: '?',
135
- isDirectory: false
136
- });
137
- }
138
- }
64
+ function listDirectoryEnhanced(dirPath, options = {}) {
65
+ const {
66
+ fileLimit = 100,
67
+ dirLimit = 50,
68
+ showHidden = true,
69
+ largeThreshold = 100
70
+ } = options;
71
+ const directories = [];
72
+ const files = [];
73
+ const largeDirectories = [];
74
+ let totalDirectories = 0;
75
+ let totalFiles = 0;
76
+ try {
77
+ const entries = fs.readdirSync(dirPath, { withFileTypes: true });
78
+ for (const entry of entries) {
79
+ if (!showHidden && entry.name.startsWith(".")) {
80
+ continue;
81
+ }
82
+ const fullPath = path.join(dirPath, entry.name);
83
+ if (entry.isDirectory()) {
84
+ totalDirectories++;
85
+ const itemCount = getDirectoryItemCount(fullPath);
86
+ directories.push({
87
+ name: entry.name,
88
+ itemCount,
89
+ isDirectory: true
90
+ });
91
+ if (itemCount >= largeThreshold) {
92
+ largeDirectories.push({ name: entry.name, itemCount });
139
93
  }
94
+ } else {
95
+ totalFiles++;
96
+ try {
97
+ const stat = fs.statSync(fullPath);
98
+ files.push({
99
+ name: entry.name,
100
+ sizeKB: formatSizeKB(stat.size),
101
+ isDirectory: false
102
+ });
103
+ } catch {
104
+ files.push({
105
+ name: entry.name,
106
+ sizeKB: "?",
107
+ isDirectory: false
108
+ });
109
+ }
110
+ }
140
111
  }
141
- catch (error) {
142
- throw new Error(`Failed to read directory: ${error.message}`);
143
- }
144
- // Sort directories by item count (descending) for visibility
145
- directories.sort((a, b) => (b.itemCount || 0) - (a.itemCount || 0));
146
- largeDirectories.sort((a, b) => b.itemCount - a.itemCount);
147
- // Sort files by name for consistency
148
- files.sort((a, b) => a.name.localeCompare(b.name));
149
- // Apply limits
150
- const limitedDirs = directories.slice(0, dirLimit);
151
- const limitedFiles = files.slice(0, fileLimit);
152
- const hiddenDirCount = Math.max(0, directories.length - dirLimit);
153
- const hiddenFileCount = Math.max(0, files.length - fileLimit);
154
- return {
155
- stats: {
156
- totalDirectories,
157
- totalFiles,
158
- totalItems: totalDirectories + totalFiles,
159
- largeDirectories: largeDirectories.slice(0, 5) // Top 5 large dirs
160
- },
161
- directories: limitedDirs,
162
- files: limitedFiles,
163
- hiddenFileCount,
164
- hiddenDirCount
165
- };
112
+ } catch (error) {
113
+ throw new Error(`Failed to read directory: ${error.message}`);
114
+ }
115
+ directories.sort((a, b) => (b.itemCount || 0) - (a.itemCount || 0));
116
+ largeDirectories.sort((a, b) => b.itemCount - a.itemCount);
117
+ files.sort((a, b) => a.name.localeCompare(b.name));
118
+ const limitedDirs = directories.slice(0, dirLimit);
119
+ const limitedFiles = files.slice(0, fileLimit);
120
+ const hiddenDirCount = Math.max(0, directories.length - dirLimit);
121
+ const hiddenFileCount = Math.max(0, files.length - fileLimit);
122
+ return {
123
+ stats: {
124
+ totalDirectories,
125
+ totalFiles,
126
+ totalItems: totalDirectories + totalFiles,
127
+ largeDirectories: largeDirectories.slice(0, 5)
128
+ // Top 5 large dirs
129
+ },
130
+ directories: limitedDirs,
131
+ files: limitedFiles,
132
+ hiddenFileCount,
133
+ hiddenDirCount
134
+ };
166
135
  }
167
- /**
168
- * Format enhanced directory listing as a human/AI-readable string
169
- */
170
- export function formatDirectoryListing(dirPath, listing) {
171
- const lines = [];
172
- const { stats, directories, files, hiddenFileCount, hiddenDirCount } = listing;
173
- // Header
174
- lines.push(`📁 Directory: ${dirPath}`);
175
- lines.push('═'.repeat(50));
176
- // Stats line
177
- lines.push(`Total: ${stats.totalDirectories} directories, ${stats.totalFiles} files, ${stats.totalItems} items`);
178
- // Warning if items are hidden
179
- const totalHidden = hiddenFileCount + hiddenDirCount;
180
- if (totalHidden > 0) {
181
- const shownCount = directories.length + files.length;
182
- lines.push(`⚠️ Showing ${shownCount} of ${stats.totalItems} items (${totalHidden} hidden)`);
136
+ function formatDirectoryListing(dirPath, listing) {
137
+ const lines = [];
138
+ const { stats, directories, files, hiddenFileCount, hiddenDirCount } = listing;
139
+ lines.push(`\u{1F4C1} Directory: ${dirPath}`);
140
+ lines.push("\u2550".repeat(50));
141
+ lines.push(`Total: ${stats.totalDirectories} directories, ${stats.totalFiles} files, ${stats.totalItems} items`);
142
+ const totalHidden = hiddenFileCount + hiddenDirCount;
143
+ if (totalHidden > 0) {
144
+ const shownCount = directories.length + files.length;
145
+ lines.push(`\u26A0\uFE0F Showing ${shownCount} of ${stats.totalItems} items (${totalHidden} hidden)`);
146
+ }
147
+ if (stats.largeDirectories.length > 0) {
148
+ const largeList = stats.largeDirectories.map((d) => `${d.name} (${d.itemCount} items)`).join(", ");
149
+ lines.push(`\u{1F4E6} Large directories: ${largeList}`);
150
+ }
151
+ lines.push("");
152
+ if (directories.length > 0) {
153
+ lines.push("\u{1F4C2} Directories:");
154
+ for (const dir of directories) {
155
+ const countStr = dir.itemCount !== void 0 ? ` (${dir.itemCount} items)` : "";
156
+ lines.push(` ${dir.name}/${countStr}`);
183
157
  }
184
- // Large directories warning
185
- if (stats.largeDirectories.length > 0) {
186
- const largeList = stats.largeDirectories
187
- .map(d => `${d.name} (${d.itemCount} items)`)
188
- .join(', ');
189
- lines.push(`📦 Large directories: ${largeList}`);
158
+ if (hiddenDirCount > 0) {
159
+ lines.push(` ... and ${hiddenDirCount} more directories`);
190
160
  }
191
- lines.push(''); // Blank line
192
- // Directories section
193
- if (directories.length > 0) {
194
- lines.push('📂 Directories:');
195
- for (const dir of directories) {
196
- const countStr = dir.itemCount !== undefined ? ` (${dir.itemCount} items)` : '';
197
- lines.push(` ${dir.name}/${countStr}`);
198
- }
199
- if (hiddenDirCount > 0) {
200
- lines.push(` ... and ${hiddenDirCount} more directories`);
201
- }
202
- lines.push('');
203
- }
204
- // Files section
205
- if (files.length > 0) {
206
- const fileHeader = hiddenFileCount > 0
207
- ? `📄 Files (${files.length} of ${stats.totalFiles} shown):`
208
- : '📄 Files:';
209
- lines.push(fileHeader);
210
- for (const file of files) {
211
- const sizeStr = file.sizeKB ? ` (${file.sizeKB})` : '';
212
- lines.push(` ${file.name}${sizeStr}`);
213
- }
214
- if (hiddenFileCount > 0) {
215
- lines.push(` ... and ${hiddenFileCount} more files`);
216
- }
217
- lines.push('');
161
+ lines.push("");
162
+ }
163
+ if (files.length > 0) {
164
+ const fileHeader = hiddenFileCount > 0 ? `\u{1F4C4} Files (${files.length} of ${stats.totalFiles} shown):` : "\u{1F4C4} Files:";
165
+ lines.push(fileHeader);
166
+ for (const file of files) {
167
+ const sizeStr = file.sizeKB ? ` (${file.sizeKB})` : "";
168
+ lines.push(` ${file.name}${sizeStr}`);
218
169
  }
219
- // Helpful tip if items were hidden
220
- if (totalHidden > 0) {
221
- lines.push('💡 To see more: List subdirectories individually or use find_files to search');
170
+ if (hiddenFileCount > 0) {
171
+ lines.push(` ... and ${hiddenFileCount} more files`);
222
172
  }
223
- return lines.join('\n');
173
+ lines.push("");
174
+ }
175
+ if (totalHidden > 0) {
176
+ lines.push("\u{1F4A1} To see more: List subdirectories individually or use find_files to search");
177
+ }
178
+ return lines.join("\n");
224
179
  }
225
- /**
226
- * Check if path is safe (not trying to escape cwd)
227
- */
228
- export function isSafePath(filePath, cwd) {
229
- const resolved = path.resolve(cwd, filePath);
230
- return resolved.startsWith(cwd);
180
+ function isSafePath(filePath, cwd) {
181
+ const resolved = path.resolve(cwd, filePath);
182
+ return resolved.startsWith(cwd);
231
183
  }
184
+ export {
185
+ formatDirectoryListing,
186
+ isSafePath,
187
+ listDirectory,
188
+ listDirectoryEnhanced,
189
+ readFile,
190
+ searchReplace,
191
+ writeFile
192
+ };
232
193
  //# sourceMappingURL=file.js.map