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":"local-chat-storage.js","sourceRoot":"","sources":["../../src/services/local-chat-storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/services/local-chat-storage.ts"],"sourcesContent":["/**\r\n * Local Chat Storage Service\r\n * \r\n * Provides persistent local storage for CLI conversations.\r\n * Stores chats in ~/.centaurus/chats/ directory as JSON files.\r\n */\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport * as os from 'os';\r\nimport { logError } from '../utils/logger.js';\r\n\r\n/**\r\n * Message interface matching the AIMessage type from ai-service-client\r\n */\r\nexport interface StoredMessage {\r\n role: 'user' | 'assistant' | 'system' | 'tool';\r\n content: string;\r\n tool_calls?: Array<{\r\n id: string;\r\n name: string;\r\n arguments: Record<string, any>;\r\n }>;\r\n tool_call_id?: string;\r\n}\r\n\r\n/**\r\n * UI Message for restoring full chat history display\r\n * This is a serializable version of the Message type from types/index.ts\r\n */\r\nexport interface StoredUIMessage {\r\n id: string;\r\n role: 'user' | 'assistant' | 'system' | 'tool';\r\n content: string;\r\n timestamp?: string; // ISO string (Date is not JSON serializable)\r\n toolExecution?: {\r\n toolName: string;\r\n status: 'pending' | 'executing' | 'completed' | 'error';\r\n result?: string;\r\n error?: string;\r\n arguments?: Record<string, any>;\r\n };\r\n shouldStream?: boolean;\r\n isCommandMode?: boolean;\r\n tool_call_id?: string;\r\n tool_calls?: Array<{ id: string; name: string; arguments: Record<string, any> }>;\r\n thinkingDuration?: number;\r\n taskCompletion?: {\r\n taskNumber: number;\r\n totalTasks: number;\r\n taskDescription: string;\r\n completionNote?: string;\r\n };\r\n planAccepted?: {\r\n planTitle?: string;\r\n totalTasks?: number;\r\n };\r\n connectionStatus?: { // For SSH/WSL/Docker connection status\r\n type: 'ssh' | 'wsl' | 'docker';\r\n status: 'connecting' | 'connected' | 'error' | 'disconnected';\r\n connectionString?: string;\r\n error?: string;\r\n };\r\n}\r\n\r\n/**\r\n * Remote environment context for SSH/WSL/Docker sessions\r\n * Used to restore remote session state when resuming a chat\r\n */\r\nexport interface StoredRemoteContext {\r\n type: 'ssh' | 'wsl' | 'docker';\r\n connectionCommand: string; // Original command to reconnect (e.g., \"ssh user@host\" or \"wsl\")\r\n remoteCwd: string; // CWD in the remote environment\r\n localCwdBeforeRemote: string; // Local CWD before entering remote session\r\n metadata?: {\r\n hostname?: string; // For SSH\r\n username?: string; // For SSH \r\n distroName?: string; // For WSL\r\n containerId?: string; // For Docker\r\n port?: number; // For SSH\r\n };\r\n}\r\n\r\n/**\r\n * Serialized checkpoint metadata stored with chat history.\r\n * This allows checkpoint state to be restored even if the checkpoint index file is missing.\r\n */\r\nexport interface StoredCheckpointMeta {\r\n id: string;\r\n prompt: string;\r\n createdAt: string;\r\n createdAtMs: number;\r\n cwd: string;\r\n contextType: 'local' | 'ssh' | 'wsl' | 'docker';\r\n remoteSessionInfo?: {\r\n hostname?: string;\r\n username?: string;\r\n sessionId: string;\r\n connectionString?: string;\r\n };\r\n conversationIndex: number;\r\n uiMessageIndex?: number;\r\n uiMessageId?: string;\r\n snapshotDir: string;\r\n manifestPath: string;\r\n changes?: {\r\n added: string[];\r\n modified: string[];\r\n deleted: string[];\r\n };\r\n commands: string[];\r\n toolCalls: Array<{\r\n id?: string;\r\n name: string;\r\n arguments?: Record<string, any>;\r\n timestamp: string;\r\n }>;\r\n status: 'active' | 'finalized' | 'discarded';\r\n}\r\n\r\n/**\r\n * Local chat metadata (without messages, for listing)\r\n */\r\nexport interface LocalChatMeta {\r\n id: string;\r\n title: string;\r\n createdAt: string;\r\n updatedAt: string;\r\n messageCount: number;\r\n environment?: string; // 'local' or 'ssh:user@host' or 'wsl:distro' or 'docker:container'\r\n}\r\n\r\n/**\r\n * Full local chat with messages\r\n */\r\nexport interface LocalChat extends LocalChatMeta {\r\n messages: StoredMessage[];\r\n uiMessages?: StoredUIMessage[]; // Full UI history for restoration\r\n cwd?: string; // Working directory at time of save (for restoration)\r\n remoteContext?: StoredRemoteContext; // Remote context if saved while in SSH/WSL/Docker (backward compat)\r\n remoteContextStack?: StoredRemoteContext[]; // Stack of nested contexts (for SSH>SSH, SSH>Docker, etc.)\r\n checkpointIndex?: StoredCheckpointMeta[]; // Serialized checkpoint metadata for resume/revert restoration\r\n backendConversationId?: string; // Backend conversation UUID (for file storage/deletion)\r\n}\r\n\r\n/**\r\n * LocalChatStorage class for managing local conversation persistence\r\n */\r\nexport class LocalChatStorage {\r\n private chatsDir: string;\r\n private indexPath: string;\r\n private chatIndex: Map<string, LocalChatMeta> = new Map();\r\n private indexLoaded: boolean = false;\r\n\r\n constructor() {\r\n const homeDir = os.homedir();\r\n this.chatsDir = path.join(homeDir, '.centaurus', 'chats');\r\n this.indexPath = path.join(this.chatsDir, 'index.json');\r\n\r\n // Ensure chats directory exists\r\n if (!fs.existsSync(this.chatsDir)) {\r\n fs.mkdirSync(this.chatsDir, { recursive: true });\r\n }\r\n\r\n // Load or build the index\r\n this.loadIndex();\r\n }\r\n\r\n /**\r\n * Load the metadata index from disk, or rebuild it from chat files if missing\r\n */\r\n private loadIndex(): void {\r\n if (this.indexLoaded) return;\r\n\r\n try {\r\n if (fs.existsSync(this.indexPath)) {\r\n const data = fs.readFileSync(this.indexPath, 'utf-8');\r\n const indexArray: LocalChatMeta[] = JSON.parse(data);\r\n this.chatIndex.clear();\r\n for (const meta of indexArray) {\r\n this.chatIndex.set(meta.id, meta);\r\n }\r\n this.indexLoaded = true;\r\n return;\r\n }\r\n } catch (error) {\r\n // Index file corrupted, rebuild it\r\n }\r\n\r\n // Rebuild index from chat files (one-time migration)\r\n this.rebuildIndex();\r\n }\r\n\r\n /**\r\n * Rebuild the index by reading metadata from all chat files\r\n * This is a one-time migration that reads full files, but only happens once\r\n */\r\n private rebuildIndex(): void {\r\n this.chatIndex.clear();\r\n\r\n if (!fs.existsSync(this.chatsDir)) {\r\n this.indexLoaded = true;\r\n return;\r\n }\r\n\r\n const files = fs.readdirSync(this.chatsDir)\r\n .filter(f => f.endsWith('.json') && f !== 'index.json');\r\n\r\n for (const file of files) {\r\n try {\r\n const filePath = path.join(this.chatsDir, file);\r\n const data = fs.readFileSync(filePath, 'utf-8');\r\n const chat = JSON.parse(data) as LocalChat;\r\n\r\n // Determine environment string from remoteContext\r\n let environment = 'local';\r\n if (chat.remoteContext) {\r\n const rc = chat.remoteContext;\r\n if (rc.type === 'ssh' && rc.metadata?.hostname) {\r\n environment = `ssh:${rc.metadata.username || 'user'}@${rc.metadata.hostname}`;\r\n } else if (rc.type === 'wsl') {\r\n environment = `wsl:${rc.metadata?.distroName || 'Ubuntu'}`;\r\n } else if (rc.type === 'docker' && rc.metadata?.containerId) {\r\n environment = `docker:${rc.metadata.containerId.substring(0, 12)}`;\r\n } else {\r\n environment = rc.type;\r\n }\r\n }\r\n\r\n // Store metadata only\r\n this.chatIndex.set(chat.id, {\r\n id: chat.id,\r\n title: chat.title,\r\n createdAt: chat.createdAt,\r\n updatedAt: chat.updatedAt,\r\n messageCount: chat.messageCount,\r\n environment,\r\n });\r\n } catch (error) {\r\n // Skip invalid files\r\n continue;\r\n }\r\n }\r\n\r\n this.indexLoaded = true;\r\n this.saveIndex();\r\n }\r\n\r\n /**\r\n * Save the metadata index to disk\r\n */\r\n private saveIndex(): void {\r\n try {\r\n const indexArray = Array.from(this.chatIndex.values());\r\n fs.writeFileSync(this.indexPath, JSON.stringify(indexArray, null, 2), 'utf-8');\r\n } catch (error) {\r\n logError('Failed to save chat index', error as Error);\r\n }\r\n }\r\n\r\n /**\r\n * Update the index entry for a chat\r\n */\r\n private updateIndexEntry(chat: LocalChat): void {\r\n let environment = 'local';\r\n if (chat.remoteContext) {\r\n const rc = chat.remoteContext;\r\n if (rc.type === 'ssh' && rc.metadata?.hostname) {\r\n environment = `ssh:${rc.metadata.username || 'user'}@${rc.metadata.hostname}`;\r\n } else if (rc.type === 'wsl') {\r\n environment = `wsl:${rc.metadata?.distroName || 'Ubuntu'}`;\r\n } else if (rc.type === 'docker' && rc.metadata?.containerId) {\r\n environment = `docker:${rc.metadata.containerId.substring(0, 12)}`;\r\n } else {\r\n environment = rc.type;\r\n }\r\n }\r\n\r\n this.chatIndex.set(chat.id, {\r\n id: chat.id,\r\n title: chat.title,\r\n createdAt: chat.createdAt,\r\n updatedAt: chat.updatedAt,\r\n messageCount: chat.messageCount,\r\n environment,\r\n });\r\n this.saveIndex();\r\n }\r\n\r\n /**\r\n * Generate a unique chat ID based on timestamp\r\n */\r\n generateChatId(): string {\r\n const now = new Date();\r\n const timestamp = now.toISOString().replace(/[:.]/g, '-').slice(0, 19);\r\n const random = Math.random().toString(36).substring(2, 6);\r\n return `chat-${timestamp}-${random}`;\r\n }\r\n\r\n /**\r\n * Generate a title from the first user message\r\n */\r\n generateTitle(messages: StoredMessage[]): string {\r\n const firstUserMessage = messages.find(m => m.role === 'user');\r\n if (!firstUserMessage || !firstUserMessage.content) {\r\n return 'New Chat';\r\n }\r\n\r\n // Take first 60 chars, trim to last word boundary\r\n let title = firstUserMessage.content.substring(0, 60);\r\n if (firstUserMessage.content.length > 60) {\r\n const lastSpace = title.lastIndexOf(' ');\r\n if (lastSpace > 30) {\r\n title = title.substring(0, lastSpace);\r\n }\r\n title += '...';\r\n }\r\n\r\n // Clean up whitespace and newlines\r\n title = title.replace(/\\s+/g, ' ').trim();\r\n\r\n return title || 'New Chat';\r\n }\r\n\r\n /**\r\n * Get the file path for a chat\r\n */\r\n private getChatPath(chatId: string): string {\r\n return path.join(this.chatsDir, `${chatId}.json`);\r\n }\r\n\r\n /**\r\n * Save a chat to disk\r\n * @param remoteContext - undefined = preserve existing, null = clear, StoredRemoteContext = set new value\r\n * @param remoteContextStack - Stack of nested contexts for SSH>SSH, SSH>Docker etc.\r\n * @param checkpointIndex - undefined = preserve existing, null = clear, array = set latest checkpoint metadata\r\n */\r\n saveChat(\r\n chatId: string,\r\n messages: StoredMessage[],\r\n uiMessages?: StoredUIMessage[],\r\n cwd?: string,\r\n remoteContext?: StoredRemoteContext | null,\r\n remoteContextStack?: StoredRemoteContext[] | null,\r\n checkpointIndex?: StoredCheckpointMeta[] | null\r\n ): LocalChat {\r\n const chatPath = this.getChatPath(chatId);\r\n const now = new Date().toISOString();\r\n\r\n let chat: LocalChat;\r\n\r\n if (fs.existsSync(chatPath)) {\r\n // Update existing chat\r\n const existing = this.loadChat(chatId);\r\n if (existing) {\r\n chat = {\r\n ...existing,\r\n messages,\r\n uiMessages: uiMessages || existing.uiMessages,\r\n cwd: cwd || existing.cwd, // Preserve CWD if not provided\r\n // remoteContext: null = clear it, undefined = preserve existing\r\n remoteContext: remoteContext === null ? undefined : (remoteContext !== undefined ? remoteContext : existing.remoteContext),\r\n // remoteContextStack: null = clear it, undefined = preserve existing\r\n remoteContextStack: remoteContextStack === null ? undefined : (remoteContextStack !== undefined ? remoteContextStack : existing.remoteContextStack),\r\n // checkpointIndex: null = clear it, undefined = preserve existing\r\n checkpointIndex: checkpointIndex === null ? undefined : (checkpointIndex !== undefined ? checkpointIndex : existing.checkpointIndex),\r\n // Preserve backendConversationId if it exists\r\n backendConversationId: existing.backendConversationId,\r\n messageCount: messages.length,\r\n updatedAt: now,\r\n };\r\n } else {\r\n // File exists but couldn't be parsed, create new\r\n chat = {\r\n id: chatId,\r\n title: this.generateTitle(messages),\r\n createdAt: now,\r\n updatedAt: now,\r\n messageCount: messages.length,\r\n messages,\r\n uiMessages,\r\n cwd,\r\n remoteContext: remoteContext ?? undefined,\r\n remoteContextStack: remoteContextStack ?? undefined,\r\n checkpointIndex: checkpointIndex ?? undefined,\r\n };\r\n }\r\n } else {\r\n // Create new chat\r\n chat = {\r\n id: chatId,\r\n title: this.generateTitle(messages),\r\n createdAt: now,\r\n updatedAt: now,\r\n messageCount: messages.length,\r\n messages,\r\n uiMessages,\r\n cwd,\r\n remoteContext: remoteContext ?? undefined,\r\n remoteContextStack: remoteContextStack ?? undefined,\r\n checkpointIndex: checkpointIndex ?? undefined,\r\n };\r\n }\r\n\r\n fs.writeFileSync(chatPath, JSON.stringify(chat, null, 2), 'utf-8');\r\n\r\n // Update the metadata index\r\n this.updateIndexEntry(chat);\r\n\r\n return chat;\r\n }\r\n\r\n /**\r\n * Set the backend conversation ID for a chat\r\n * This is used to associate local chats with backend file storage\r\n */\r\n setBackendConversationId(chatId: string, backendConversationId: string): boolean {\r\n const chat = this.loadChat(chatId);\r\n if (!chat) {\r\n return false;\r\n }\r\n\r\n try {\r\n chat.backendConversationId = backendConversationId;\r\n chat.updatedAt = new Date().toISOString();\r\n const chatPath = this.getChatPath(chatId);\r\n fs.writeFileSync(chatPath, JSON.stringify(chat, null, 2), 'utf-8');\r\n return true;\r\n } catch (error) {\r\n logError(`Failed to set backend conversation ID for chat ${chatId}`, error as Error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Get the backend conversation ID for a chat (if any)\r\n */\r\n getBackendConversationId(chatId: string): string | undefined {\r\n const chat = this.loadChat(chatId);\r\n return chat?.backendConversationId;\r\n }\r\n\r\n /**\r\n * Load a chat by ID\r\n */\r\n loadChat(chatId: string): LocalChat | null {\r\n const chatPath = this.getChatPath(chatId);\r\n\r\n if (!fs.existsSync(chatPath)) {\r\n return null;\r\n }\r\n\r\n try {\r\n const data = fs.readFileSync(chatPath, 'utf-8');\r\n return JSON.parse(data) as LocalChat;\r\n } catch (error) {\r\n logError(`Failed to load chat ${chatId}`, error as Error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * List all chats (metadata only, sorted by updatedAt descending)\r\n * Uses the in-memory index to avoid loading full chat files\r\n */\r\n listChats(): LocalChatMeta[] {\r\n // Ensure index is loaded\r\n this.loadIndex();\r\n\r\n // Return sorted metadata from the cache\r\n const chats = Array.from(this.chatIndex.values());\r\n\r\n // Sort by updatedAt descending (most recent first)\r\n chats.sort((a, b) =>\r\n new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime()\r\n );\r\n\r\n return chats;\r\n }\r\n\r\n /**\r\n * Delete a chat by ID\r\n */\r\n deleteChat(chatId: string): boolean {\r\n const chatPath = this.getChatPath(chatId);\r\n const checkpointsPath = path.join(os.homedir(), '.centaurus', 'checkpoints', chatId);\r\n\r\n if (!fs.existsSync(chatPath)) {\r\n // Best-effort cleanup for orphaned checkpoint data.\r\n if (fs.existsSync(checkpointsPath)) {\r\n try {\r\n fs.rmSync(checkpointsPath, { recursive: true, force: true });\r\n } catch {\r\n // Ignore cleanup errors for missing chats.\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n try {\r\n fs.unlinkSync(chatPath);\r\n if (fs.existsSync(checkpointsPath)) {\r\n fs.rmSync(checkpointsPath, { recursive: true, force: true });\r\n }\r\n\r\n // Remove from index\r\n this.chatIndex.delete(chatId);\r\n this.saveIndex();\r\n\r\n return true;\r\n } catch (error) {\r\n logError(`Failed to delete chat ${chatId}`, error as Error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Import a full chat object (used for restoring from cloud sync)\r\n * Overwrites existing chat with same ID if present\r\n */\r\n importChat(chat: LocalChat): boolean {\r\n if (!chat || !chat.id) {\r\n return false;\r\n }\r\n\r\n try {\r\n const chatPath = this.getChatPath(chat.id);\r\n\r\n // Ensure the chat has required fields\r\n const now = new Date().toISOString();\r\n const importedChat: LocalChat = {\r\n id: chat.id,\r\n title: chat.title || 'Imported Chat',\r\n createdAt: chat.createdAt || now,\r\n updatedAt: now, // Always update the timestamp on import\r\n messageCount: chat.messages?.length || chat.messageCount || 0,\r\n messages: chat.messages || [],\r\n uiMessages: chat.uiMessages,\r\n cwd: chat.cwd,\r\n remoteContext: chat.remoteContext,\r\n remoteContextStack: chat.remoteContextStack,\r\n checkpointIndex: chat.checkpointIndex,\r\n backendConversationId: chat.backendConversationId,\r\n environment: chat.environment,\r\n };\r\n\r\n fs.writeFileSync(chatPath, JSON.stringify(importedChat, null, 2), 'utf-8');\r\n\r\n // Update the index\r\n this.updateIndexEntry(importedChat);\r\n\r\n return true;\r\n } catch (error) {\r\n logError(`Failed to import chat ${chat.id}`, error as Error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Rename a chat by ID\r\n */\r\n renameChat(chatId: string, newTitle: string): boolean {\r\n const chat = this.loadChat(chatId);\r\n if (!chat) {\r\n return false;\r\n }\r\n\r\n try {\r\n chat.title = newTitle;\r\n chat.updatedAt = new Date().toISOString();\r\n const chatPath = this.getChatPath(chatId);\r\n fs.writeFileSync(chatPath, JSON.stringify(chat, null, 2), 'utf-8');\r\n\r\n // Update the index\r\n this.updateIndexEntry(chat);\r\n\r\n return true;\r\n } catch (error) {\r\n logError(`Failed to rename chat ${chatId}`, error as Error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Get the chats directory path\r\n */\r\n getChatsDir(): string {\r\n return this.chatsDir;\r\n }\r\n}\r\n\r\n// Export singleton instance\r\nexport const localChatStorage = new LocalChatStorage();\r\n"],"mappings":"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","names":[]}
@@ -1,239 +1,231 @@
1
- /**
2
- * Monitored Shell Manager Service
3
- *
4
- * Manages agent-controlled shell sessions, detecting when input is required
5
- * and coordinating with the AI to provide appropriate responses.
6
- */
7
- import { detectInputRequirement, extractPromptContext, getInputTypeDescription } from './input-requirement-detector.js';
8
- import { quickLog } from '../utils/conversation-logger.js';
9
- /**
10
- * Monitored Shell Manager
11
- *
12
- * Handles tracking of agent-controlled shells and coordinating input detection.
13
- */
1
+ import { detectInputRequirement, extractPromptContext, getInputTypeDescription } from "./input-requirement-detector.js";
2
+ import { quickLog } from "../utils/conversation-logger.js";
14
3
  class MonitoredShellManagerClass {
15
- sessions = new Map();
16
- onAIInputRequest;
17
- onMonitoringMessage;
18
- inputCheckIntervalMs = 500;
19
- shellIdCounter = 0;
20
- /**
21
- * Generate a unique shell ID
22
- */
23
- generateShellId() {
24
- this.shellIdCounter++;
25
- return `shell-${Date.now()}-${this.shellIdCounter}`;
26
- }
27
- /**
28
- * Set the callback for requesting AI input
29
- */
30
- setOnAIInputRequest(callback) {
31
- this.onAIInputRequest = callback;
32
- }
33
- /**
34
- * Set the callback for new monitoring messages
35
- */
36
- setOnMonitoringMessage(callback) {
37
- this.onMonitoringMessage = callback;
38
- }
39
- /**
40
- * Start monitoring a shell session
41
- */
42
- startMonitoring(shellId, command, cwd, onInputRequired) {
43
- // Clean up any existing session with the same ID
44
- this.stopMonitoring(shellId);
45
- const session = {
46
- shellId,
47
- command,
48
- cwd,
49
- output: '',
50
- isRunning: true,
51
- lastOutputTime: Date.now(),
52
- monitoringMessages: [],
53
- onInputRequired
54
- };
55
- // Start periodic input detection
56
- session.inputCheckInterval = setInterval(() => {
57
- this.checkForInputRequirement(shellId);
58
- }, this.inputCheckIntervalMs);
59
- this.sessions.set(shellId, session);
60
- quickLog(`[${new Date().toISOString()}] [MonitoredShellManager] Started monitoring shell ${shellId}: ${command}\n`);
61
- return session;
62
- }
63
- /**
64
- * Stop monitoring a shell session
65
- */
66
- stopMonitoring(shellId) {
67
- const session = this.sessions.get(shellId);
68
- if (session) {
69
- if (session.inputCheckInterval) {
70
- clearInterval(session.inputCheckInterval);
71
- }
72
- this.sessions.delete(shellId);
73
- quickLog(`[${new Date().toISOString()}] [MonitoredShellManager] Stopped monitoring shell ${shellId}\n`);
74
- }
75
- }
76
- /**
77
- * Update shell output for a monitored session
78
- */
79
- updateOutput(shellId, newOutput) {
80
- const session = this.sessions.get(shellId);
81
- if (session) {
82
- session.output += newOutput;
83
- session.lastOutputTime = Date.now();
4
+ sessions = /* @__PURE__ */ new Map();
5
+ onAIInputRequest;
6
+ onMonitoringMessage;
7
+ inputCheckIntervalMs = 500;
8
+ shellIdCounter = 0;
9
+ /**
10
+ * Generate a unique shell ID
11
+ */
12
+ generateShellId() {
13
+ this.shellIdCounter++;
14
+ return `shell-${Date.now()}-${this.shellIdCounter}`;
15
+ }
16
+ /**
17
+ * Set the callback for requesting AI input
18
+ */
19
+ setOnAIInputRequest(callback) {
20
+ this.onAIInputRequest = callback;
21
+ }
22
+ /**
23
+ * Set the callback for new monitoring messages
24
+ */
25
+ setOnMonitoringMessage(callback) {
26
+ this.onMonitoringMessage = callback;
27
+ }
28
+ /**
29
+ * Start monitoring a shell session
30
+ */
31
+ startMonitoring(shellId, command, cwd, onInputRequired) {
32
+ this.stopMonitoring(shellId);
33
+ const session = {
34
+ shellId,
35
+ command,
36
+ cwd,
37
+ output: "",
38
+ isRunning: true,
39
+ lastOutputTime: Date.now(),
40
+ monitoringMessages: [],
41
+ onInputRequired
42
+ };
43
+ session.inputCheckInterval = setInterval(() => {
44
+ this.checkForInputRequirement(shellId);
45
+ }, this.inputCheckIntervalMs);
46
+ this.sessions.set(shellId, session);
47
+ quickLog(`[${(/* @__PURE__ */ new Date()).toISOString()}] [MonitoredShellManager] Started monitoring shell ${shellId}: ${command}
48
+ `);
49
+ return session;
50
+ }
51
+ /**
52
+ * Stop monitoring a shell session
53
+ */
54
+ stopMonitoring(shellId) {
55
+ const session = this.sessions.get(shellId);
56
+ if (session) {
57
+ if (session.inputCheckInterval) {
58
+ clearInterval(session.inputCheckInterval);
59
+ }
60
+ this.sessions.delete(shellId);
61
+ quickLog(`[${(/* @__PURE__ */ new Date()).toISOString()}] [MonitoredShellManager] Stopped monitoring shell ${shellId}
62
+ `);
63
+ }
64
+ }
65
+ /**
66
+ * Update shell output for a monitored session
67
+ */
68
+ updateOutput(shellId, newOutput) {
69
+ const session = this.sessions.get(shellId);
70
+ if (session) {
71
+ session.output += newOutput;
72
+ session.lastOutputTime = Date.now();
73
+ }
74
+ }
75
+ /**
76
+ * Mark a shell session as complete
77
+ */
78
+ markComplete(shellId) {
79
+ const session = this.sessions.get(shellId);
80
+ if (session) {
81
+ session.isRunning = false;
82
+ this.stopMonitoring(shellId);
83
+ }
84
+ }
85
+ /**
86
+ * Get a session by ID
87
+ */
88
+ getSession(shellId) {
89
+ return this.sessions.get(shellId);
90
+ }
91
+ /**
92
+ * Check if a specific shell session is active
93
+ */
94
+ isSessionActive(shellId) {
95
+ return this.sessions.has(shellId);
96
+ }
97
+ /**
98
+ * Get all active shell IDs
99
+ */
100
+ getActiveShellIds() {
101
+ return Array.from(this.sessions.keys());
102
+ }
103
+ /**
104
+ * Add a monitoring message to a session
105
+ */
106
+ addMonitoringMessage(shellId, type, content) {
107
+ const session = this.sessions.get(shellId);
108
+ const message = {
109
+ id: `msg-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
110
+ type,
111
+ content,
112
+ timestamp: /* @__PURE__ */ new Date()
113
+ };
114
+ if (session) {
115
+ session.monitoringMessages.push(message);
116
+ if (this.onMonitoringMessage) {
117
+ this.onMonitoringMessage(shellId, message);
118
+ }
119
+ }
120
+ return message;
121
+ }
122
+ /**
123
+ * Get monitoring messages for a session
124
+ */
125
+ getMonitoringMessages(shellId) {
126
+ return this.sessions.get(shellId)?.monitoringMessages || [];
127
+ }
128
+ /**
129
+ * Clear monitoring messages for a session
130
+ */
131
+ clearMonitoringMessages(shellId) {
132
+ const session = this.sessions.get(shellId);
133
+ if (session) {
134
+ session.monitoringMessages = [];
135
+ }
136
+ }
137
+ /**
138
+ * Mark the most recent 'thinking' message as answered
139
+ * This changes the spinner to a tick in the UI
140
+ */
141
+ markLastThinkingAsAnswered(shellId) {
142
+ const session = this.sessions.get(shellId);
143
+ if (session) {
144
+ for (let i = session.monitoringMessages.length - 1; i >= 0; i--) {
145
+ const msg = session.monitoringMessages[i];
146
+ if (msg.type === "thinking" && !msg.isAnswered) {
147
+ msg.isAnswered = true;
148
+ quickLog(`[${(/* @__PURE__ */ new Date()).toISOString()}] [MonitoredShellManager] Marked message ${msg.id} as answered
149
+ `);
150
+ break;
84
151
  }
85
- }
86
- /**
87
- * Mark a shell session as complete
88
- */
89
- markComplete(shellId) {
90
- const session = this.sessions.get(shellId);
91
- if (session) {
92
- session.isRunning = false;
93
- this.stopMonitoring(shellId);
94
- }
95
- }
96
- /**
97
- * Get a session by ID
98
- */
99
- getSession(shellId) {
100
- return this.sessions.get(shellId);
101
- }
102
- /**
103
- * Check if a specific shell session is active
104
- */
105
- isSessionActive(shellId) {
106
- return this.sessions.has(shellId);
107
- }
108
- /**
109
- * Get all active shell IDs
110
- */
111
- getActiveShellIds() {
112
- return Array.from(this.sessions.keys());
113
- }
114
- /**
115
- * Add a monitoring message to a session
116
- */
117
- addMonitoringMessage(shellId, type, content) {
118
- const session = this.sessions.get(shellId);
119
- const message = {
120
- id: `msg-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
121
- type,
122
- content,
123
- timestamp: new Date()
124
- };
125
- if (session) {
126
- session.monitoringMessages.push(message);
127
- // Callback to notify UI
128
- if (this.onMonitoringMessage) {
129
- this.onMonitoringMessage(shellId, message);
130
- }
131
- }
132
- return message;
133
- }
134
- /**
135
- * Get monitoring messages for a session
136
- */
137
- getMonitoringMessages(shellId) {
138
- return this.sessions.get(shellId)?.monitoringMessages || [];
139
- }
140
- /**
141
- * Clear monitoring messages for a session
142
- */
143
- clearMonitoringMessages(shellId) {
144
- const session = this.sessions.get(shellId);
145
- if (session) {
146
- session.monitoringMessages = [];
147
- }
148
- }
149
- /**
150
- * Mark the most recent 'thinking' message as answered
151
- * This changes the spinner to a tick in the UI
152
- */
153
- markLastThinkingAsAnswered(shellId) {
154
- const session = this.sessions.get(shellId);
155
- if (session) {
156
- // Find the last 'thinking' message that isn't already answered
157
- for (let i = session.monitoringMessages.length - 1; i >= 0; i--) {
158
- const msg = session.monitoringMessages[i];
159
- if (msg.type === 'thinking' && !msg.isAnswered) {
160
- msg.isAnswered = true;
161
- quickLog(`[${new Date().toISOString()}] [MonitoredShellManager] Marked message ${msg.id} as answered\n`);
162
- break;
163
- }
164
- }
165
- }
166
- }
167
- /**
168
- * Check if a shell requires input and trigger AI prompt if needed
169
- */
170
- async checkForInputRequirement(shellId) {
171
- const session = this.sessions.get(shellId);
172
- if (!session || !session.isRunning) {
173
- return;
174
- }
175
- const timeSinceLastOutput = Date.now() - session.lastOutputTime;
176
- const result = detectInputRequirement(session.output, timeSinceLastOutput);
177
- if (result.requiresInput && result.confidence !== 'low') {
178
- quickLog(`[${new Date().toISOString()}] [MonitoredShellManager] Input detected for ${shellId}: ${result.matchedPattern}\n`);
179
- // Notify session callback
180
- if (session.onInputRequired) {
181
- session.onInputRequired(session, result);
182
- }
183
- // Request AI input
184
- if (this.onAIInputRequest) {
185
- const promptContext = extractPromptContext(session.output);
186
- const inputType = getInputTypeDescription(result);
187
- // Add "thinking" message
188
- this.addMonitoringMessage(shellId, 'thinking', 'Analyzing shell prompt...');
189
- try {
190
- const aiInput = await this.onAIInputRequest(shellId, session.output, promptContext, inputType);
191
- if (aiInput !== null) {
192
- // Add message showing what input was sent
193
- this.addMonitoringMessage(shellId, 'input_sent', `Sent input: ${aiInput}`);
194
- }
195
- }
196
- catch (error) {
197
- quickLog(`[${new Date().toISOString()}] [MonitoredShellManager] Error requesting AI input: ${error.message}\n`);
198
- this.addMonitoringMessage(shellId, 'text', `Error: ${error.message}`);
199
- }
200
- }
152
+ }
153
+ }
154
+ }
155
+ /**
156
+ * Check if a shell requires input and trigger AI prompt if needed
157
+ */
158
+ async checkForInputRequirement(shellId) {
159
+ const session = this.sessions.get(shellId);
160
+ if (!session || !session.isRunning) {
161
+ return;
162
+ }
163
+ const timeSinceLastOutput = Date.now() - session.lastOutputTime;
164
+ const result = detectInputRequirement(session.output, timeSinceLastOutput);
165
+ if (result.requiresInput && result.confidence !== "low") {
166
+ quickLog(`[${(/* @__PURE__ */ new Date()).toISOString()}] [MonitoredShellManager] Input detected for ${shellId}: ${result.matchedPattern}
167
+ `);
168
+ if (session.onInputRequired) {
169
+ session.onInputRequired(session, result);
170
+ }
171
+ if (this.onAIInputRequest) {
172
+ const promptContext = extractPromptContext(session.output);
173
+ const inputType = getInputTypeDescription(result);
174
+ this.addMonitoringMessage(shellId, "thinking", "Analyzing shell prompt...");
175
+ try {
176
+ const aiInput = await this.onAIInputRequest(
177
+ shellId,
178
+ session.output,
179
+ promptContext,
180
+ inputType
181
+ );
182
+ if (aiInput !== null) {
183
+ this.addMonitoringMessage(shellId, "input_sent", `Sent input: ${aiInput}`);
184
+ }
185
+ } catch (error) {
186
+ quickLog(`[${(/* @__PURE__ */ new Date()).toISOString()}] [MonitoredShellManager] Error requesting AI input: ${error.message}
187
+ `);
188
+ this.addMonitoringMessage(shellId, "text", `Error: ${error.message}`);
201
189
  }
202
- }
203
- /**
204
- * Build a prompt for the AI to provide shell input
205
- * This is used when the AI needs to decide what to input
206
- */
207
- buildInputPrompt(shellOutput, promptContext, inputType, originalCommand) {
208
- return `The command "${originalCommand}" is currently running and requires user input.
209
-
210
- **Current shell output (last 50 lines):**
211
- \`\`\`
212
- ${this.getLastNLines(shellOutput, 50)}
213
- \`\`\`
214
-
215
- **The command is asking for:** ${promptContext}
216
-
217
- **Expected input type:** ${inputType}
218
-
219
- Please provide the appropriate input to respond to this prompt. Use the execute_command tool with the shell_input parameter to send your response.
220
-
221
- Guidelines:
222
- - For yes/no prompts, respond with "y" or "n" (or "yes"/"no" if the prompt requires full words)
223
- - For password prompts, you should NOT provide passwords - ask the user to handle this manually
224
- - For npm init style prompts, provide reasonable defaults or press Enter for default values
225
- - For other prompts, provide the most appropriate response based on context
226
-
190
+ }
191
+ }
192
+ }
193
+ /**
194
+ * Build a prompt for the AI to provide shell input
195
+ * This is used when the AI needs to decide what to input
196
+ */
197
+ buildInputPrompt(shellOutput, promptContext, inputType, originalCommand) {
198
+ return `The command "${originalCommand}" is currently running and requires user input.
199
+
200
+ **Current shell output (last 50 lines):**
201
+ \`\`\`
202
+ ${this.getLastNLines(shellOutput, 50)}
203
+ \`\`\`
204
+
205
+ **The command is asking for:** ${promptContext}
206
+
207
+ **Expected input type:** ${inputType}
208
+
209
+ Please provide the appropriate input to respond to this prompt. Use the execute_command tool with the shell_input parameter to send your response.
210
+
211
+ Guidelines:
212
+ - For yes/no prompts, respond with "y" or "n" (or "yes"/"no" if the prompt requires full words)
213
+ - For password prompts, you should NOT provide passwords - ask the user to handle this manually
214
+ - For npm init style prompts, provide reasonable defaults or press Enter for default values
215
+ - For other prompts, provide the most appropriate response based on context
216
+
227
217
  If this appears to be a security-sensitive prompt (passwords, authentication), respond with a message indicating the user should handle this manually.`;
228
- }
229
- /**
230
- * Get the last N lines of output
231
- */
232
- getLastNLines(text, n) {
233
- const lines = text.split('\n');
234
- return lines.slice(-n).join('\n');
235
- }
218
+ }
219
+ /**
220
+ * Get the last N lines of output
221
+ */
222
+ getLastNLines(text, n) {
223
+ const lines = text.split("\n");
224
+ return lines.slice(-n).join("\n");
225
+ }
236
226
  }
237
- // Export singleton instance
238
- export const MonitoredShellManager = new MonitoredShellManagerClass();
227
+ const MonitoredShellManager = new MonitoredShellManagerClass();
228
+ export {
229
+ MonitoredShellManager
230
+ };
239
231
  //# sourceMappingURL=monitored-shell-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"monitored-shell-manager.js","sourceRoot":"","sources":["../../src/services/monitored-shell-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,uBAAuB,EAAkD,MAAM,iCAAiC,CAAC;AACxK,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAsC3D;;;;GAIG;AACH,MAAM,0BAA0B;IACpB,QAAQ,GAAuC,IAAI,GAAG,EAAE,CAAC;IACzD,gBAAgB,CAA4B;IAC5C,mBAAmB,CAAsD;IACzE,oBAAoB,GAAW,GAAG,CAAC;IACnC,cAAc,GAAW,CAAC,CAAC;IAEnC;;OAEG;IACH,eAAe;QACX,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,OAAO,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,QAAkC;QAClD,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,sBAAsB,CAAC,QAA4D;QAC/E,IAAI,CAAC,mBAAmB,GAAG,QAAQ,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,eAAe,CACX,OAAe,EACf,OAAe,EACf,GAAW,EACX,eAAiG;QAEjG,iDAAiD;QACjD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAE7B,MAAM,OAAO,GAA0B;YACnC,OAAO;YACP,OAAO;YACP,GAAG;YACH,MAAM,EAAE,EAAE;YACV,SAAS,EAAE,IAAI;YACf,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE;YAC1B,kBAAkB,EAAE,EAAE;YACtB,eAAe;SAClB,CAAC;QAEF,iCAAiC;QACjC,OAAO,CAAC,kBAAkB,GAAG,WAAW,CAAC,GAAG,EAAE;YAC1C,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAE9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEpC,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,sDAAsD,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC;QAEpH,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,OAAe;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,OAAO,EAAE,CAAC;YACV,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;gBAC7B,aAAa,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;YAC9C,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9B,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,sDAAsD,OAAO,IAAI,CAAC,CAAC;QAC5G,CAAC;IACL,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,OAAe,EAAE,SAAiB;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC;YAC5B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACxC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,OAAe;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,OAAe;QACtB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,OAAe;QAC3B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,iBAAiB;QACb,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,OAAe,EAAE,IAA4B,EAAE,OAAe;QAC/E,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAmB;YAC5B,EAAE,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YAClE,IAAI;YACJ,OAAO;YACP,SAAS,EAAE,IAAI,IAAI,EAAE;SACxB,CAAC;QAEF,IAAI,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAEzC,wBAAwB;YACxB,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC3B,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/C,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,qBAAqB,CAAC,OAAe;QACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,kBAAkB,IAAI,EAAE,CAAC;IAChE,CAAC;IAED;;OAEG;IACH,uBAAuB,CAAC,OAAe;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,kBAAkB,GAAG,EAAE,CAAC;QACpC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,0BAA0B,CAAC,OAAe;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,OAAO,EAAE,CAAC;YACV,+DAA+D;YAC/D,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;gBAC1C,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;oBAC7C,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;oBACtB,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,4CAA4C,GAAG,CAAC,EAAE,gBAAgB,CAAC,CAAC;oBACzG,MAAM;gBACV,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,wBAAwB,CAAC,OAAe;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACjC,OAAO;QACX,CAAC;QAED,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC;QAChE,MAAM,MAAM,GAAG,sBAAsB,CAAC,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;QAE3E,IAAI,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;YACtD,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,gDAAgD,OAAO,KAAK,MAAM,CAAC,cAAc,IAAI,CAAC,CAAC;YAE5H,0BAA0B;YAC1B,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;gBAC1B,OAAO,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC7C,CAAC;YAED,mBAAmB;YACnB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxB,MAAM,aAAa,GAAG,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC3D,MAAM,SAAS,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;gBAElD,yBAAyB;gBACzB,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,UAAU,EAAE,2BAA2B,CAAC,CAAC;gBAE5E,IAAI,CAAC;oBACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CACvC,OAAO,EACP,OAAO,CAAC,MAAM,EACd,aAAa,EACb,SAAS,CACZ,CAAC;oBAEF,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;wBACnB,0CAA0C;wBAC1C,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,YAAY,EAAE,eAAe,OAAO,EAAE,CAAC,CAAC;oBAC/E,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAU,EAAE,CAAC;oBAClB,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,wDAAwD,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;oBAChH,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC1E,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,gBAAgB,CAAC,WAAmB,EAAE,aAAqB,EAAE,SAAiB,EAAE,eAAuB;QACnG,OAAO,gBAAgB,eAAe;;;;EAI5C,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,EAAE,CAAC;;;iCAGJ,aAAa;;2BAEnB,SAAS;;;;;;;;;;uJAUmH,CAAC;IACpJ,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,IAAY,EAAE,CAAS;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;CACJ;AAED,4BAA4B;AAC5B,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,0BAA0B,EAAE,CAAC"}
1
+ {"version":3,"sources":["../../src/services/monitored-shell-manager.ts"],"sourcesContent":["/**\r\n * Monitored Shell Manager Service\r\n * \r\n * Manages agent-controlled shell sessions, detecting when input is required\r\n * and coordinating with the AI to provide appropriate responses.\r\n */\r\n\r\nimport { detectInputRequirement, extractPromptContext, getInputTypeDescription, InputDetectionResult, DEFAULT_STALL_TIMEOUT_MS } from './input-requirement-detector.js';\r\nimport { quickLog } from '../utils/conversation-logger.js';\r\n\r\n/**\r\n * Represents a message displayed during monitoring mode\r\n */\r\nexport interface MonitorMessage {\r\n id: string;\r\n type: 'thinking' | 'tool_call' | 'text' | 'input_sent';\r\n content: string;\r\n timestamp: Date;\r\n isAnswered?: boolean; // For 'thinking' type: true when the prompt has been answered\r\n}\r\n\r\n/**\r\n * Represents an active monitored shell session\r\n */\r\nexport interface MonitoredShellSession {\r\n shellId: string;\r\n command: string;\r\n cwd: string;\r\n output: string;\r\n isRunning: boolean;\r\n lastOutputTime: number;\r\n monitoringMessages: MonitorMessage[];\r\n inputCheckInterval?: NodeJS.Timeout;\r\n onInputRequired?: (session: MonitoredShellSession, detectionResult: InputDetectionResult) => void;\r\n}\r\n\r\n/**\r\n * Callback when the AI needs to be prompted for shell input\r\n */\r\nexport type OnAIInputRequestCallback = (\r\n shellId: string,\r\n shellOutput: string,\r\n promptContext: string,\r\n inputType: string\r\n) => Promise<string | null>;\r\n\r\n/**\r\n * Monitored Shell Manager\r\n * \r\n * Handles tracking of agent-controlled shells and coordinating input detection.\r\n */\r\nclass MonitoredShellManagerClass {\r\n private sessions: Map<string, MonitoredShellSession> = new Map();\r\n private onAIInputRequest?: OnAIInputRequestCallback;\r\n private onMonitoringMessage?: (shellId: string, message: MonitorMessage) => void;\r\n private inputCheckIntervalMs: number = 500;\r\n private shellIdCounter: number = 0;\r\n\r\n /**\r\n * Generate a unique shell ID\r\n */\r\n generateShellId(): string {\r\n this.shellIdCounter++;\r\n return `shell-${Date.now()}-${this.shellIdCounter}`;\r\n }\r\n\r\n /**\r\n * Set the callback for requesting AI input\r\n */\r\n setOnAIInputRequest(callback: OnAIInputRequestCallback): void {\r\n this.onAIInputRequest = callback;\r\n }\r\n\r\n /**\r\n * Set the callback for new monitoring messages\r\n */\r\n setOnMonitoringMessage(callback: (shellId: string, message: MonitorMessage) => void): void {\r\n this.onMonitoringMessage = callback;\r\n }\r\n\r\n /**\r\n * Start monitoring a shell session\r\n */\r\n startMonitoring(\r\n shellId: string,\r\n command: string,\r\n cwd: string,\r\n onInputRequired?: (session: MonitoredShellSession, detectionResult: InputDetectionResult) => void\r\n ): MonitoredShellSession {\r\n // Clean up any existing session with the same ID\r\n this.stopMonitoring(shellId);\r\n\r\n const session: MonitoredShellSession = {\r\n shellId,\r\n command,\r\n cwd,\r\n output: '',\r\n isRunning: true,\r\n lastOutputTime: Date.now(),\r\n monitoringMessages: [],\r\n onInputRequired\r\n };\r\n\r\n // Start periodic input detection\r\n session.inputCheckInterval = setInterval(() => {\r\n this.checkForInputRequirement(shellId);\r\n }, this.inputCheckIntervalMs);\r\n\r\n this.sessions.set(shellId, session);\r\n\r\n quickLog(`[${new Date().toISOString()}] [MonitoredShellManager] Started monitoring shell ${shellId}: ${command}\\n`);\r\n\r\n return session;\r\n }\r\n\r\n /**\r\n * Stop monitoring a shell session\r\n */\r\n stopMonitoring(shellId: string): void {\r\n const session = this.sessions.get(shellId);\r\n if (session) {\r\n if (session.inputCheckInterval) {\r\n clearInterval(session.inputCheckInterval);\r\n }\r\n this.sessions.delete(shellId);\r\n quickLog(`[${new Date().toISOString()}] [MonitoredShellManager] Stopped monitoring shell ${shellId}\\n`);\r\n }\r\n }\r\n\r\n /**\r\n * Update shell output for a monitored session\r\n */\r\n updateOutput(shellId: string, newOutput: string): void {\r\n const session = this.sessions.get(shellId);\r\n if (session) {\r\n session.output += newOutput;\r\n session.lastOutputTime = Date.now();\r\n }\r\n }\r\n\r\n /**\r\n * Mark a shell session as complete\r\n */\r\n markComplete(shellId: string): void {\r\n const session = this.sessions.get(shellId);\r\n if (session) {\r\n session.isRunning = false;\r\n this.stopMonitoring(shellId);\r\n }\r\n }\r\n\r\n /**\r\n * Get a session by ID\r\n */\r\n getSession(shellId: string): MonitoredShellSession | undefined {\r\n return this.sessions.get(shellId);\r\n }\r\n\r\n /**\r\n * Check if a specific shell session is active\r\n */\r\n isSessionActive(shellId: string): boolean {\r\n return this.sessions.has(shellId);\r\n }\r\n\r\n /**\r\n * Get all active shell IDs\r\n */\r\n getActiveShellIds(): string[] {\r\n return Array.from(this.sessions.keys());\r\n }\r\n\r\n /**\r\n * Add a monitoring message to a session\r\n */\r\n addMonitoringMessage(shellId: string, type: MonitorMessage['type'], content: string): MonitorMessage {\r\n const session = this.sessions.get(shellId);\r\n const message: MonitorMessage = {\r\n id: `msg-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\r\n type,\r\n content,\r\n timestamp: new Date()\r\n };\r\n\r\n if (session) {\r\n session.monitoringMessages.push(message);\r\n\r\n // Callback to notify UI\r\n if (this.onMonitoringMessage) {\r\n this.onMonitoringMessage(shellId, message);\r\n }\r\n }\r\n\r\n return message;\r\n }\r\n\r\n /**\r\n * Get monitoring messages for a session\r\n */\r\n getMonitoringMessages(shellId: string): MonitorMessage[] {\r\n return this.sessions.get(shellId)?.monitoringMessages || [];\r\n }\r\n\r\n /**\r\n * Clear monitoring messages for a session\r\n */\r\n clearMonitoringMessages(shellId: string): void {\r\n const session = this.sessions.get(shellId);\r\n if (session) {\r\n session.monitoringMessages = [];\r\n }\r\n }\r\n\r\n /**\r\n * Mark the most recent 'thinking' message as answered\r\n * This changes the spinner to a tick in the UI\r\n */\r\n markLastThinkingAsAnswered(shellId: string): void {\r\n const session = this.sessions.get(shellId);\r\n if (session) {\r\n // Find the last 'thinking' message that isn't already answered\r\n for (let i = session.monitoringMessages.length - 1; i >= 0; i--) {\r\n const msg = session.monitoringMessages[i];\r\n if (msg.type === 'thinking' && !msg.isAnswered) {\r\n msg.isAnswered = true;\r\n quickLog(`[${new Date().toISOString()}] [MonitoredShellManager] Marked message ${msg.id} as answered\\n`);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Check if a shell requires input and trigger AI prompt if needed\r\n */\r\n private async checkForInputRequirement(shellId: string): Promise<void> {\r\n const session = this.sessions.get(shellId);\r\n if (!session || !session.isRunning) {\r\n return;\r\n }\r\n\r\n const timeSinceLastOutput = Date.now() - session.lastOutputTime;\r\n const result = detectInputRequirement(session.output, timeSinceLastOutput);\r\n\r\n if (result.requiresInput && result.confidence !== 'low') {\r\n quickLog(`[${new Date().toISOString()}] [MonitoredShellManager] Input detected for ${shellId}: ${result.matchedPattern}\\n`);\r\n\r\n // Notify session callback\r\n if (session.onInputRequired) {\r\n session.onInputRequired(session, result);\r\n }\r\n\r\n // Request AI input\r\n if (this.onAIInputRequest) {\r\n const promptContext = extractPromptContext(session.output);\r\n const inputType = getInputTypeDescription(result);\r\n\r\n // Add \"thinking\" message\r\n this.addMonitoringMessage(shellId, 'thinking', 'Analyzing shell prompt...');\r\n\r\n try {\r\n const aiInput = await this.onAIInputRequest(\r\n shellId,\r\n session.output,\r\n promptContext,\r\n inputType\r\n );\r\n\r\n if (aiInput !== null) {\r\n // Add message showing what input was sent\r\n this.addMonitoringMessage(shellId, 'input_sent', `Sent input: ${aiInput}`);\r\n }\r\n } catch (error: any) {\r\n quickLog(`[${new Date().toISOString()}] [MonitoredShellManager] Error requesting AI input: ${error.message}\\n`);\r\n this.addMonitoringMessage(shellId, 'text', `Error: ${error.message}`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Build a prompt for the AI to provide shell input\r\n * This is used when the AI needs to decide what to input\r\n */\r\n buildInputPrompt(shellOutput: string, promptContext: string, inputType: string, originalCommand: string): string {\r\n return `The command \"${originalCommand}\" is currently running and requires user input.\r\n\r\n**Current shell output (last 50 lines):**\r\n\\`\\`\\`\r\n${this.getLastNLines(shellOutput, 50)}\r\n\\`\\`\\`\r\n\r\n**The command is asking for:** ${promptContext}\r\n\r\n**Expected input type:** ${inputType}\r\n\r\nPlease provide the appropriate input to respond to this prompt. Use the execute_command tool with the shell_input parameter to send your response.\r\n\r\nGuidelines:\r\n- For yes/no prompts, respond with \"y\" or \"n\" (or \"yes\"/\"no\" if the prompt requires full words)\r\n- For password prompts, you should NOT provide passwords - ask the user to handle this manually\r\n- For npm init style prompts, provide reasonable defaults or press Enter for default values\r\n- For other prompts, provide the most appropriate response based on context\r\n\r\nIf this appears to be a security-sensitive prompt (passwords, authentication), respond with a message indicating the user should handle this manually.`;\r\n }\r\n\r\n /**\r\n * Get the last N lines of output\r\n */\r\n private getLastNLines(text: string, n: number): string {\r\n const lines = text.split('\\n');\r\n return lines.slice(-n).join('\\n');\r\n }\r\n}\r\n\r\n// Export singleton instance\r\nexport const MonitoredShellManager = new MonitoredShellManagerClass();\r\n"],"mappings":"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","names":[]}