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,153 +1,161 @@
1
- import React from 'react';
2
- import { Box, Text, useInput } from 'ink';
3
- import { ToolExecutionMessage } from './ToolExecutionMessage.js';
4
- import { MarkdownRenderer } from './MarkdownRenderer.js';
5
- import { ConnectionStatusMessage } from './ConnectionStatusMessage.js';
6
- /**
7
- * Parse [IMAGE: ...] and [FILE: ...] markers from content
8
- * Also handles uploading state (gs://uploading) and failed uploads (upload failed)
9
- * Returns { textContent: string without markers, files: array of { type, format } }
10
- */
1
+ import React from "react";
2
+ import { Box, Text, useInput } from "ink";
3
+ import { ToolExecutionMessage } from "./ToolExecutionMessage.js";
4
+ import { MarkdownRenderer } from "./MarkdownRenderer.js";
5
+ import { ConnectionStatusMessage } from "./ConnectionStatusMessage.js";
11
6
  function parseFileMarkers(content) {
12
- // Pattern to match [IMAGE: filename (gs://...)] or [FILE: filename (upload failed...)] or [FILE: ... (gs://uploading)]
13
- const fileMarkerRegex = /\[(IMAGE|FILE):\s*([^\]]+?)\s*\((gs:\/\/[^\)]+|upload failed[^\)]*|uploading[^\)]*)\)\]/g;
14
- const files = [];
15
- let match;
16
- while ((match = fileMarkerRegex.exec(content)) !== null) {
17
- const type = match[1]; // IMAGE or FILE
18
- const filename = match[2].trim();
19
- // Extract extension from filename
20
- const ext = filename.split('.').pop()?.toLowerCase() || 'file';
21
- files.push({ type, format: ext });
22
- }
23
- // Remove markers from content
24
- let textContent = content
25
- .replace(/\[(IMAGE|FILE):\s*([^\]]+?)\s*\((gs:\/\/[^\)]+|upload failed[^\)]*|uploading[^\)]*)\)\]/g, '')
26
- .trim();
27
- return {
28
- textContent,
29
- files
30
- };
7
+ const fileMarkerRegex = /\[(IMAGE|FILE):\s*([^\]]+?)\s*\((gs:\/\/[^\)]+|upload failed[^\)]*|uploading[^\)]*)\)\]/g;
8
+ const files = [];
9
+ let match;
10
+ while ((match = fileMarkerRegex.exec(content)) !== null) {
11
+ const type = match[1];
12
+ const filename = match[2].trim();
13
+ const ext = filename.split(".").pop()?.toLowerCase() || "file";
14
+ files.push({ type, format: ext });
15
+ }
16
+ let textContent = content.replace(/\[(IMAGE|FILE):\s*([^\]]+?)\s*\((gs:\/\/[^\)]+|upload failed[^\)]*|uploading[^\)]*)\)\]/g, "").trim();
17
+ return {
18
+ textContent,
19
+ files
20
+ };
31
21
  }
32
- /**
33
- * Count files in a message content
34
- */
35
- export function countFilesInMessage(content) {
36
- const fileMarkerMatches = content.match(/\[(IMAGE|FILE):\s*[^\]]+?\s*\((gs:\/\/[^\)]+|upload failed[^\)]*|uploading[^\)]*)\)\]/g) || [];
37
- return fileMarkerMatches.length;
22
+ function countFilesInMessage(content) {
23
+ const fileMarkerMatches = content.match(/\[(IMAGE|FILE):\s*[^\]]+?\s*\((gs:\/\/[^\)]+|upload failed[^\)]*|uploading[^\)]*)\)\]/g) || [];
24
+ return fileMarkerMatches.length;
38
25
  }
39
- /**
40
- * File attachment badge component
41
- * Shows a styled box with file number and format
42
- */
43
26
  const FileAttachmentBadge = ({ fileNumber, type, format }) => {
44
- const label = type === 'IMAGE' ? 'Image' : 'File';
45
- return (React.createElement(Box, { borderStyle: "round", borderColor: "#555555", paddingX: 1, marginRight: 1, marginTop: 1 },
46
- React.createElement(Text, { color: "#aaaaaa" },
47
- label,
48
- " ",
49
- fileNumber,
50
- " "),
51
- React.createElement(Text, { color: "#666666" },
52
- "[",
53
- format,
54
- "]")));
27
+ const label = type === "IMAGE" ? "Image" : "File";
28
+ return /* @__PURE__ */ React.createElement(
29
+ Box,
30
+ {
31
+ borderStyle: "round",
32
+ borderColor: "#555555",
33
+ paddingX: 1,
34
+ marginRight: 1,
35
+ marginTop: 1
36
+ },
37
+ /* @__PURE__ */ React.createElement(Text, { color: "#aaaaaa" }, label, " ", fileNumber, " "),
38
+ /* @__PURE__ */ React.createElement(Text, { color: "#666666" }, "[", format, "]")
39
+ );
55
40
  };
56
- export const MessageDisplay = React.memo(({ message, fileCountBefore = 0 }) => {
57
- const [selectedOption, setSelectedOption] = React.useState(0);
58
- const [isApproved, setIsApproved] = React.useState(null);
59
- const getRoleColor = (role) => {
60
- switch (role) {
61
- case 'user': return '#00ccff';
62
- case 'assistant': return '#00cc66';
63
- case 'system': return '#ffaa00';
64
- case 'tool': return '#00ccff';
65
- default: return '#ffffff';
66
- }
67
- };
68
- const getRoleLabel = (role) => {
69
- switch (role) {
70
- case 'user': return 'You';
71
- case 'assistant': return 'Centaurus';
72
- case 'system': return 'System';
73
- case 'tool': return 'Tool';
74
- default: return role;
75
- }
76
- };
77
- const timestamp = message.timestamp
78
- ? new Date(message.timestamp).toLocaleTimeString()
79
- : '';
80
- // Handle approval input
81
- useInput((input, key) => {
82
- if (!message.approval || isApproved !== null)
83
- return;
84
- if (key.upArrow) {
85
- setSelectedOption(0);
86
- }
87
- else if (key.downArrow) {
88
- setSelectedOption(1);
89
- }
90
- else if (key.return) {
91
- const approved = selectedOption === 0;
92
- setIsApproved(approved);
93
- message.approval.resolve(approved);
94
- }
95
- }, { isActive: message.approval !== undefined && isApproved === null });
96
- // Render tool execution message using specialized component
97
- if (message.toolExecution) {
98
- return React.createElement(ToolExecutionMessage, { message: message });
41
+ function renderTextWithFileTags(text) {
42
+ const tagRegex = /(@[^\s@]+)/g;
43
+ const parts = [];
44
+ let lastIndex = 0;
45
+ let match;
46
+ let key = 0;
47
+ while ((match = tagRegex.exec(text)) !== null) {
48
+ if (match.index > lastIndex) {
49
+ parts.push(
50
+ /* @__PURE__ */ React.createElement(Text, { key: key++, color: "#ffffff" }, text.slice(lastIndex, match.index))
51
+ );
52
+ }
53
+ parts.push(
54
+ /* @__PURE__ */ React.createElement(Text, { key: key++, color: "#00ccff", bold: true }, match[1])
55
+ );
56
+ lastIndex = match.index + match[1].length;
57
+ }
58
+ if (lastIndex < text.length) {
59
+ parts.push(
60
+ /* @__PURE__ */ React.createElement(Text, { key: key++, color: "#ffffff" }, text.slice(lastIndex))
61
+ );
62
+ }
63
+ return parts;
64
+ }
65
+ const MessageDisplay = React.memo(({
66
+ message,
67
+ fileCountBefore = 0
68
+ }) => {
69
+ const [selectedOption, setSelectedOption] = React.useState(0);
70
+ const [isApproved, setIsApproved] = React.useState(null);
71
+ const getRoleColor = (role) => {
72
+ switch (role) {
73
+ case "user":
74
+ return "#00ccff";
75
+ case "assistant":
76
+ return "#00cc66";
77
+ case "system":
78
+ return "#ffaa00";
79
+ case "tool":
80
+ return "#00ccff";
81
+ default:
82
+ return "#ffffff";
99
83
  }
100
- // Render connection status message using specialized component
101
- if (message.connectionStatus) {
102
- return React.createElement(ConnectionStatusMessage, { status: message.connectionStatus });
84
+ };
85
+ const getRoleLabel = (role) => {
86
+ switch (role) {
87
+ case "user":
88
+ return "You";
89
+ case "assistant":
90
+ return "Centaurus";
91
+ case "system":
92
+ return "System";
93
+ case "tool":
94
+ return "Tool";
95
+ default:
96
+ return role;
103
97
  }
104
- // Approval requests should never be in message history
105
- // They are handled by ApprovalSection component that replaces the input bar
106
- if (message.approval) {
107
- return null;
98
+ };
99
+ const timestamp = message.timestamp ? new Date(message.timestamp).toLocaleTimeString() : "";
100
+ useInput((input, key) => {
101
+ if (!message.approval || isApproved !== null) return;
102
+ if (key.upArrow) {
103
+ setSelectedOption(0);
104
+ } else if (key.downArrow) {
105
+ setSelectedOption(1);
106
+ } else if (key.return) {
107
+ const approved = selectedOption === 0;
108
+ setIsApproved(approved);
109
+ message.approval.resolve(approved);
108
110
  }
109
- // Skip rendering empty assistant messages that have no meaningful content
110
- // This prevents blank space from appearing above tool execution messages
111
- // (especially in WSL mode where tools take longer and show 'executing' state)
112
- if (message.role === 'assistant' &&
113
- !message.content.trim() &&
114
- message.thinkingDuration === undefined) {
115
- return null;
111
+ }, { isActive: message.approval !== void 0 && isApproved === null });
112
+ if (message.toolExecution) {
113
+ return /* @__PURE__ */ React.createElement(ToolExecutionMessage, { message });
114
+ }
115
+ if (message.connectionStatus) {
116
+ return /* @__PURE__ */ React.createElement(ConnectionStatusMessage, { status: message.connectionStatus });
117
+ }
118
+ if (message.approval) {
119
+ return null;
120
+ }
121
+ if (message.role === "assistant" && !message.content.trim() && message.thinkingDuration === void 0) {
122
+ return null;
123
+ }
124
+ const getBorderColor = () => {
125
+ if (message.isCommandMode) {
126
+ return message.role === "assistant" ? "#00cc66" : "#00ccff";
116
127
  }
117
- // Determine border color based on message type
118
- const getBorderColor = () => {
119
- if (message.isCommandMode) {
120
- return message.role === 'assistant' ? '#00cc66' : '#00ccff';
121
- }
122
- return message.role === 'assistant' ? '#00ccff' : '#666666';
123
- };
124
- const borderColor = getBorderColor();
125
- // Parse markers for user messages (only in AI mode, not command/shell mode)
126
- const { textContent, files } = message.role === 'user' && !message.isCommandMode
127
- ? parseFileMarkers(message.content)
128
- : { textContent: message.content, files: [] };
129
- // Generate file badges with global numbering (fileCountBefore + i + 1)
130
- const fileBadges = files.map((file, i) => (React.createElement(FileAttachmentBadge, { key: `file-${message.id}-${i}`, fileNumber: fileCountBefore + i + 1, type: file.type, format: file.format })));
131
- // Regular message rendering
132
- return (React.createElement(Box, { flexDirection: "column", marginBottom: 1 },
133
- !message.isSpacer && (React.createElement(Box, { marginBottom: 1 },
134
- React.createElement(Text, { color: getRoleColor(message.role), bold: true },
135
- getRoleLabel(message.role),
136
- ":"),
137
- timestamp && (React.createElement(Text, { color: "#666666", dimColor: true },
138
- " ",
139
- timestamp)))),
140
- message.thinkingDuration !== undefined && message.thinkingDuration >= 0 && (React.createElement(Box, { marginBottom: 1 },
141
- React.createElement(Text, { dimColor: true },
142
- "Thought for ",
143
- message.thinkingDuration,
144
- " second",
145
- message.thinkingDuration !== 1 ? 's' : '',
146
- " \u203A"))),
147
- message.role === 'assistant' ? (message.content.trim() ? (React.createElement(Box, { borderStyle: "single", borderColor: borderColor, borderLeft: true, borderRight: false, borderTop: false, borderBottom: false, paddingLeft: 1, flexDirection: "column", width: "100%" },
148
- React.createElement(MarkdownRenderer, { content: message.content, maxWidth: (process.stdout.columns || 120) - 6 }))) : null) : (React.createElement(React.Fragment, null,
149
- textContent.trim() ? (React.createElement(Box, { paddingLeft: 2 },
150
- React.createElement(Text, { color: "#ffffff" }, textContent))) : null,
151
- fileBadges.length > 0 && (React.createElement(Box, { paddingLeft: 2, flexDirection: "row", flexWrap: "wrap" }, fileBadges))))));
128
+ return message.role === "assistant" ? "#00ccff" : "#666666";
129
+ };
130
+ const borderColor = getBorderColor();
131
+ const { textContent, files } = message.role === "user" && !message.isCommandMode ? parseFileMarkers(message.content) : { textContent: message.content, files: [] };
132
+ const fileBadges = files.map((file, i) => /* @__PURE__ */ React.createElement(
133
+ FileAttachmentBadge,
134
+ {
135
+ key: `file-${message.id}-${i}`,
136
+ fileNumber: fileCountBefore + i + 1,
137
+ type: file.type,
138
+ format: file.format
139
+ }
140
+ ));
141
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginBottom: 1 }, !message.isSpacer && /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { color: getRoleColor(message.role), bold: true }, getRoleLabel(message.role), ":"), timestamp && /* @__PURE__ */ React.createElement(Text, { color: "#666666", dimColor: true }, " ", timestamp)), message.thinkingDuration !== void 0 && message.thinkingDuration >= 0 && /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Thought for ", message.thinkingDuration, " second", message.thinkingDuration !== 1 ? "s" : "", " \u203A")), message.role === "assistant" ? message.content.trim() ? /* @__PURE__ */ React.createElement(
142
+ Box,
143
+ {
144
+ borderStyle: "single",
145
+ borderColor,
146
+ borderLeft: true,
147
+ borderRight: false,
148
+ borderTop: false,
149
+ borderBottom: false,
150
+ paddingLeft: 1,
151
+ flexDirection: "column",
152
+ width: "100%"
153
+ },
154
+ /* @__PURE__ */ React.createElement(MarkdownRenderer, { content: message.content, maxWidth: (process.stdout.columns || 120) - 6 })
155
+ ) : null : /* @__PURE__ */ React.createElement(React.Fragment, null, textContent.trim() ? /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, renderTextWithFileTags(textContent))) : null, fileBadges.length > 0 && /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2, flexDirection: "row", flexWrap: "wrap" }, fileBadges)));
152
156
  });
157
+ export {
158
+ MessageDisplay,
159
+ countFilesInMessage
160
+ };
153
161
  //# sourceMappingURL=MessageDisplay.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessageDisplay.js","sourceRoot":"","sources":["../../../src/ui/components/MessageDisplay.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/ui/components/MessageDisplay.tsx"],"sourcesContent":["import React from 'react';\r\nimport { Box, Text, useInput } from 'ink';\r\nimport { Message } from '../../types/index.js';\r\nimport { ToolExecutionMessage } from './ToolExecutionMessage.js';\r\nimport { MarkdownRenderer } from './MarkdownRenderer.js';\r\nimport { ConnectionStatusMessage } from './ConnectionStatusMessage.js';\r\n\r\ninterface MessageDisplayProps {\r\n message: Message;\r\n /** Total files in messages before this one (for global numbering) */\r\n fileCountBefore?: number;\r\n}\r\n\r\n/**\r\n * Parse [IMAGE: ...] and [FILE: ...] markers from content\r\n * Also handles uploading state (gs://uploading) and failed uploads (upload failed)\r\n * Returns { textContent: string without markers, files: array of { type, format } }\r\n */\r\nfunction parseFileMarkers(content: string): { textContent: string; files: Array<{ type: string; format: string }> } {\r\n // Pattern to match [IMAGE: filename (gs://...)] or [FILE: filename (upload failed...)] or [FILE: ... (gs://uploading)]\r\n const fileMarkerRegex = /\\[(IMAGE|FILE):\\s*([^\\]]+?)\\s*\\((gs:\\/\\/[^\\)]+|upload failed[^\\)]*|uploading[^\\)]*)\\)\\]/g;\r\n const files: Array<{ type: string; format: string }> = [];\r\n\r\n let match;\r\n while ((match = fileMarkerRegex.exec(content)) !== null) {\r\n const type = match[1]; // IMAGE or FILE\r\n const filename = match[2].trim();\r\n // Extract extension from filename\r\n const ext = filename.split('.').pop()?.toLowerCase() || 'file';\r\n files.push({ type, format: ext });\r\n }\r\n\r\n // Remove markers from content\r\n let textContent = content\r\n .replace(/\\[(IMAGE|FILE):\\s*([^\\]]+?)\\s*\\((gs:\\/\\/[^\\)]+|upload failed[^\\)]*|uploading[^\\)]*)\\)\\]/g, '')\r\n .trim();\r\n\r\n return {\r\n textContent,\r\n files\r\n };\r\n}\r\n\r\n/**\r\n * Count files in a message content\r\n */\r\nexport function countFilesInMessage(content: string): number {\r\n const fileMarkerMatches = content.match(/\\[(IMAGE|FILE):\\s*[^\\]]+?\\s*\\((gs:\\/\\/[^\\)]+|upload failed[^\\)]*|uploading[^\\)]*)\\)\\]/g) || [];\r\n return fileMarkerMatches.length;\r\n}\r\n\r\n/**\r\n * File attachment badge component\r\n * Shows a styled box with file number and format\r\n */\r\nconst FileAttachmentBadge: React.FC<{ fileNumber: number; type: string; format: string }> = ({ fileNumber, type, format }) => {\r\n const label = type === 'IMAGE' ? 'Image' : 'File';\r\n return (\r\n <Box\r\n borderStyle=\"round\"\r\n borderColor=\"#555555\"\r\n paddingX={1}\r\n marginRight={1}\r\n marginTop={1}\r\n >\r\n <Text color=\"#aaaaaa\">{label} {fileNumber} </Text>\r\n <Text color=\"#666666\">[{format}]</Text>\r\n </Box>\r\n );\r\n};\r\n\r\n/**\r\n * Render text content, highlighting @file-tag tokens in cyan so they stand\r\n * out the same way they do in the input bar.\r\n */\r\nfunction renderTextWithFileTags(text: string): React.ReactNode[] {\r\n const tagRegex = /(@[^\\s@]+)/g;\r\n const parts: React.ReactNode[] = [];\r\n let lastIndex = 0;\r\n let match: RegExpExecArray | null;\r\n let key = 0;\r\n\r\n while ((match = tagRegex.exec(text)) !== null) {\r\n if (match.index > lastIndex) {\r\n parts.push(\r\n <Text key={key++} color=\"#ffffff\">{text.slice(lastIndex, match.index)}</Text>\r\n );\r\n }\r\n parts.push(\r\n <Text key={key++} color=\"#00ccff\" bold>{match[1]}</Text>\r\n );\r\n lastIndex = match.index + match[1].length;\r\n }\r\n\r\n if (lastIndex < text.length) {\r\n parts.push(\r\n <Text key={key++} color=\"#ffffff\">{text.slice(lastIndex)}</Text>\r\n );\r\n }\r\n\r\n return parts;\r\n}\r\n\r\nexport const MessageDisplay: React.FC<MessageDisplayProps> = React.memo(({\r\n message,\r\n fileCountBefore = 0\r\n}) => {\r\n const [selectedOption, setSelectedOption] = React.useState<number>(0);\r\n const [isApproved, setIsApproved] = React.useState<boolean | null>(null);\r\n\r\n const getRoleColor = (role: string) => {\r\n switch (role) {\r\n case 'user': return '#00ccff';\r\n case 'assistant': return '#00cc66';\r\n case 'system': return '#ffaa00';\r\n case 'tool': return '#00ccff';\r\n default: return '#ffffff';\r\n }\r\n };\r\n\r\n const getRoleLabel = (role: string) => {\r\n switch (role) {\r\n case 'user': return 'You';\r\n case 'assistant': return 'Centaurus';\r\n case 'system': return 'System';\r\n case 'tool': return 'Tool';\r\n default: return role;\r\n }\r\n };\r\n\r\n const timestamp = message.timestamp\r\n ? new Date(message.timestamp).toLocaleTimeString()\r\n : '';\r\n\r\n // Handle approval input\r\n useInput((input, key) => {\r\n if (!message.approval || isApproved !== null) return;\r\n\r\n if (key.upArrow) {\r\n setSelectedOption(0);\r\n } else if (key.downArrow) {\r\n setSelectedOption(1);\r\n } else if (key.return) {\r\n const approved = selectedOption === 0;\r\n setIsApproved(approved);\r\n message.approval.resolve(approved);\r\n }\r\n }, { isActive: message.approval !== undefined && isApproved === null });\r\n\r\n // Render tool execution message using specialized component\r\n if (message.toolExecution) {\r\n return <ToolExecutionMessage message={message} />;\r\n }\r\n\r\n // Render connection status message using specialized component\r\n if (message.connectionStatus) {\r\n return <ConnectionStatusMessage status={message.connectionStatus} />;\r\n }\r\n\r\n // Approval requests should never be in message history\r\n // They are handled by ApprovalSection component that replaces the input bar\r\n if (message.approval) {\r\n return null;\r\n }\r\n\r\n // Skip rendering empty assistant messages that have no meaningful content\r\n // This prevents blank space from appearing above tool execution messages\r\n // (especially in WSL mode where tools take longer and show 'executing' state)\r\n if (message.role === 'assistant' &&\r\n !message.content.trim() &&\r\n message.thinkingDuration === undefined) {\r\n return null;\r\n }\r\n\r\n // Determine border color based on message type\r\n const getBorderColor = () => {\r\n if (message.isCommandMode) {\r\n return message.role === 'assistant' ? '#00cc66' : '#00ccff';\r\n }\r\n return message.role === 'assistant' ? '#00ccff' : '#666666';\r\n };\r\n\r\n const borderColor = getBorderColor();\r\n\r\n // Parse markers for user messages (only in AI mode, not command/shell mode)\r\n const { textContent, files } = message.role === 'user' && !message.isCommandMode\r\n ? parseFileMarkers(message.content)\r\n : { textContent: message.content, files: [] };\r\n\r\n // Generate file badges with global numbering (fileCountBefore + i + 1)\r\n const fileBadges = files.map((file, i) => (\r\n <FileAttachmentBadge\r\n key={`file-${message.id}-${i}`}\r\n fileNumber={fileCountBefore + i + 1}\r\n type={file.type}\r\n format={file.format}\r\n />\r\n ));\r\n\r\n // Regular message rendering\r\n return (\r\n <Box flexDirection=\"column\" marginBottom={1}>\r\n {!message.isSpacer && (\r\n <Box marginBottom={1}>\r\n <Text color={getRoleColor(message.role)} bold>\r\n {getRoleLabel(message.role)}:\r\n </Text>\r\n {timestamp && (\r\n <Text color=\"#666666\" dimColor> {timestamp}</Text>\r\n )}\r\n </Box>\r\n )}\r\n\r\n {/* Display thinking duration at the TOP for completed messages */}\r\n {message.thinkingDuration !== undefined && message.thinkingDuration >= 0 && (\r\n <Box marginBottom={1}>\r\n <Text dimColor>Thought for {message.thinkingDuration} second{message.thinkingDuration !== 1 ? 's' : ''} ›</Text>\r\n </Box>\r\n )}\r\n\r\n {/* Render content with left border for AI responses - only if there's content */}\r\n {message.role === 'assistant' ? (\r\n message.content.trim() ? (\r\n <Box\r\n borderStyle=\"single\"\r\n borderColor={borderColor}\r\n borderLeft={true}\r\n borderRight={false}\r\n borderTop={false}\r\n borderBottom={false}\r\n paddingLeft={1}\r\n flexDirection=\"column\"\r\n width=\"100%\"\r\n >\r\n <MarkdownRenderer content={message.content} maxWidth={(process.stdout.columns || 120) - 6} />\r\n </Box>\r\n ) : null\r\n ) : (\r\n <>\r\n {/* User message text (without file markers) */}\r\n {textContent.trim() ? (\r\n <Box paddingLeft={2}>\r\n <Text>{renderTextWithFileTags(textContent)}</Text>\r\n </Box>\r\n ) : null}\r\n\r\n {/* File attachment badges */}\r\n {fileBadges.length > 0 && (\r\n <Box paddingLeft={2} flexDirection=\"row\" flexWrap=\"wrap\">\r\n {fileBadges}\r\n </Box>\r\n )}\r\n </>\r\n )}\r\n </Box>\r\n );\r\n});\r\n"],"mappings":"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","names":[]}
@@ -1,69 +1,50 @@
1
- /**
2
- * Monitor Mode AI Panel Component
3
- *
4
- * Displays AI monitoring messages in the lower half of the screen during
5
- * agent-controlled shell mode. Shows thinking indicators, tool calls,
6
- * and text outputs.
7
- */
8
- import React from 'react';
9
- import { Box, Text } from 'ink';
10
- import Spinner from 'ink-spinner';
11
- /**
12
- * Render a single monitoring message
13
- */
1
+ import React from "react";
2
+ import { Box, Text } from "ink";
3
+ import Spinner from "ink-spinner";
14
4
  const MonitorMessageItem = ({ message }) => {
15
- switch (message.type) {
16
- case 'thinking':
17
- // Show tick if answered, spinner if still waiting
18
- if (message.isAnswered) {
19
- return (React.createElement(Box, { marginY: 0 },
20
- React.createElement(Text, { color: "#00cc66" }, "\u2713 "),
21
- React.createElement(Text, { color: "#00cc66" }, message.content)));
22
- }
23
- return (React.createElement(Box, { marginY: 0 },
24
- React.createElement(Text, { color: "#ffaa00" },
25
- React.createElement(Spinner, { type: "dots" })),
26
- React.createElement(Text, { color: "#ffaa00", dimColor: true },
27
- " ",
28
- message.content)));
29
- case 'tool_call':
30
- return (React.createElement(Box, { marginY: 0 },
31
- React.createElement(Text, { color: "#00ccff" }, "\u26A1 "),
32
- React.createElement(Text, { color: "#00ccff" }, message.content)));
33
- case 'input_sent':
34
- return (React.createElement(Box, { marginY: 0 },
35
- React.createElement(Text, { color: "#00cc66" }, "\u2192 "),
36
- React.createElement(Text, { color: "#00cc66" }, message.content)));
37
- case 'text':
38
- default:
39
- return (React.createElement(Box, { marginY: 0 },
40
- React.createElement(Text, null, message.content)));
41
- }
5
+ switch (message.type) {
6
+ case "thinking":
7
+ if (message.isAnswered) {
8
+ return /* @__PURE__ */ React.createElement(Box, { marginY: 0 }, /* @__PURE__ */ React.createElement(Text, { color: "#00cc66" }, "\u2713 "), /* @__PURE__ */ React.createElement(Text, { color: "#00cc66" }, message.content));
9
+ }
10
+ return /* @__PURE__ */ React.createElement(Box, { marginY: 0 }, /* @__PURE__ */ React.createElement(Text, { color: "#ffaa00" }, /* @__PURE__ */ React.createElement(Spinner, { type: "dots" })), /* @__PURE__ */ React.createElement(Text, { color: "#ffaa00", dimColor: true }, " ", message.content));
11
+ case "tool_call":
12
+ return /* @__PURE__ */ React.createElement(Box, { marginY: 0 }, /* @__PURE__ */ React.createElement(Text, { color: "#00ccff" }, "\u26A1 "), /* @__PURE__ */ React.createElement(Text, { color: "#00ccff" }, message.content));
13
+ case "input_sent":
14
+ return /* @__PURE__ */ React.createElement(Box, { marginY: 0 }, /* @__PURE__ */ React.createElement(Text, { color: "#00cc66" }, "\u2192 "), /* @__PURE__ */ React.createElement(Text, { color: "#00cc66" }, message.content));
15
+ case "text":
16
+ default:
17
+ return /* @__PURE__ */ React.createElement(Box, { marginY: 0 }, /* @__PURE__ */ React.createElement(Text, null, message.content));
18
+ }
42
19
  };
43
- /**
44
- * Monitor Mode AI Panel
45
- *
46
- * Displays in the lower half of focus mode when agent control is enabled.
47
- * Shows only the messages that fit within the available height.
48
- */
49
- export const MonitorModeAIPanel = ({ messages, maxHeight, isActive }) => {
50
- if (!isActive) {
51
- return null;
52
- }
53
- // Calculate how many messages to show (estimate 1-2 lines per message)
54
- // Keep only the most recent messages that fit
55
- const linesPerMessage = 2;
56
- const maxMessages = Math.floor(maxHeight / linesPerMessage);
57
- const visibleMessages = messages.slice(-maxMessages);
58
- return (React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: "#9945FF", paddingX: 1, height: maxHeight },
59
- React.createElement(Box, { marginBottom: 1 },
60
- React.createElement(Text, { color: "#9945FF", bold: true },
61
- React.createElement(Spinner, { type: "dots" }),
62
- " Agent Monitor"),
63
- React.createElement(Text, { color: "#666666", dimColor: true }, " - AI is controlling shell input")),
64
- React.createElement(Box, { flexDirection: "column", flexGrow: 1 }, visibleMessages.length === 0 ? (React.createElement(Text, { color: "#666666", dimColor: true }, "Monitoring for input prompts...")) : (visibleMessages.map((msg) => (React.createElement(MonitorMessageItem, { key: msg.id, message: msg }))))),
65
- React.createElement(Box, { marginTop: 1 },
66
- React.createElement(Text, { color: "#666666", dimColor: true }, "Alt+I to disable agent control"))));
20
+ const MonitorModeAIPanel = ({
21
+ messages,
22
+ maxHeight,
23
+ isActive
24
+ }) => {
25
+ if (!isActive) {
26
+ return null;
27
+ }
28
+ const linesPerMessage = 2;
29
+ const maxMessages = Math.floor(maxHeight / linesPerMessage);
30
+ const visibleMessages = messages.slice(-maxMessages);
31
+ return /* @__PURE__ */ React.createElement(
32
+ Box,
33
+ {
34
+ flexDirection: "column",
35
+ borderStyle: "round",
36
+ borderColor: "#9945FF",
37
+ paddingX: 1,
38
+ height: maxHeight
39
+ },
40
+ /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { color: "#9945FF", bold: true }, /* @__PURE__ */ React.createElement(Spinner, { type: "dots" }), " Agent Monitor"), /* @__PURE__ */ React.createElement(Text, { color: "#666666", dimColor: true }, " - AI is controlling shell input")),
41
+ /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", flexGrow: 1 }, visibleMessages.length === 0 ? /* @__PURE__ */ React.createElement(Text, { color: "#666666", dimColor: true }, "Monitoring for input prompts...") : visibleMessages.map((msg) => /* @__PURE__ */ React.createElement(MonitorMessageItem, { key: msg.id, message: msg }))),
42
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: "#666666", dimColor: true }, "Alt+I to disable agent control"))
43
+ );
44
+ };
45
+ var MonitorModeAIPanel_default = MonitorModeAIPanel;
46
+ export {
47
+ MonitorModeAIPanel,
48
+ MonitorModeAIPanel_default as default
67
49
  };
68
- export default MonitorModeAIPanel;
69
50
  //# sourceMappingURL=MonitorModeAIPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MonitorModeAIPanel.js","sourceRoot":"","sources":["../../../src/ui/components/MonitorModeAIPanel.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/ui/components/MonitorModeAIPanel.tsx"],"sourcesContent":["/**\r\n * Monitor Mode AI Panel Component\r\n * \r\n * Displays AI monitoring messages in the lower half of the screen during\r\n * agent-controlled shell mode. Shows thinking indicators, tool calls,\r\n * and text outputs.\r\n */\r\n\r\nimport React from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport Spinner from 'ink-spinner';\r\nimport { MonitorMessage } from '../../services/monitored-shell-manager.js';\r\n\r\nexport interface MonitorModeAIPanelProps {\r\n messages: MonitorMessage[];\r\n maxHeight: number; // Maximum height in lines\r\n isActive: boolean;\r\n}\r\n\r\n/**\r\n * Render a single monitoring message\r\n */\r\nconst MonitorMessageItem: React.FC<{ message: MonitorMessage }> = ({ message }) => {\r\n switch (message.type) {\r\n case 'thinking':\r\n // Show tick if answered, spinner if still waiting\r\n if (message.isAnswered) {\r\n return (\r\n <Box marginY={0}>\r\n <Text color=\"#00cc66\">✓ </Text>\r\n <Text color=\"#00cc66\">{message.content}</Text>\r\n </Box>\r\n );\r\n }\r\n return (\r\n <Box marginY={0}>\r\n <Text color=\"#ffaa00\">\r\n <Spinner type=\"dots\" />\r\n </Text>\r\n <Text color=\"#ffaa00\" dimColor> {message.content}</Text>\r\n </Box>\r\n );\r\n\r\n case 'tool_call':\r\n return (\r\n <Box marginY={0}>\r\n <Text color=\"#00ccff\">⚡ </Text>\r\n <Text color=\"#00ccff\">{message.content}</Text>\r\n </Box>\r\n );\r\n\r\n case 'input_sent':\r\n return (\r\n <Box marginY={0}>\r\n <Text color=\"#00cc66\">→ </Text>\r\n <Text color=\"#00cc66\">{message.content}</Text>\r\n </Box>\r\n );\r\n\r\n case 'text':\r\n default:\r\n return (\r\n <Box marginY={0}>\r\n <Text>{message.content}</Text>\r\n </Box>\r\n );\r\n }\r\n};\r\n\r\n/**\r\n * Monitor Mode AI Panel\r\n * \r\n * Displays in the lower half of focus mode when agent control is enabled.\r\n * Shows only the messages that fit within the available height.\r\n */\r\nexport const MonitorModeAIPanel: React.FC<MonitorModeAIPanelProps> = ({\r\n messages,\r\n maxHeight,\r\n isActive\r\n}) => {\r\n if (!isActive) {\r\n return null;\r\n }\r\n\r\n // Calculate how many messages to show (estimate 1-2 lines per message)\r\n // Keep only the most recent messages that fit\r\n const linesPerMessage = 2;\r\n const maxMessages = Math.floor(maxHeight / linesPerMessage);\r\n const visibleMessages = messages.slice(-maxMessages);\r\n\r\n return (\r\n <Box\r\n flexDirection=\"column\"\r\n borderStyle=\"round\"\r\n borderColor=\"#9945FF\"\r\n paddingX={1}\r\n height={maxHeight}\r\n >\r\n {/* Header */}\r\n <Box marginBottom={1}>\r\n <Text color=\"#9945FF\" bold>\r\n <Spinner type=\"dots\" /> Agent Monitor\r\n </Text>\r\n <Text color=\"#666666\" dimColor> - AI is controlling shell input</Text>\r\n </Box>\r\n\r\n {/* Messages */}\r\n <Box flexDirection=\"column\" flexGrow={1}>\r\n {visibleMessages.length === 0 ? (\r\n <Text color=\"#666666\" dimColor>Monitoring for input prompts...</Text>\r\n ) : (\r\n visibleMessages.map((msg) => (\r\n <MonitorMessageItem key={msg.id} message={msg} />\r\n ))\r\n )}\r\n </Box>\r\n\r\n {/* Footer hint */}\r\n <Box marginTop={1}>\r\n <Text color=\"#666666\" dimColor>\r\n Alt+I to disable agent control\r\n </Text>\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default MonitorModeAIPanel;\r\n"],"mappings":"AAQA,OAAO,WAAW;AAClB,SAAS,KAAK,YAAY;AAC1B,OAAO,aAAa;AAYpB,MAAM,qBAA4D,CAAC,EAAE,QAAQ,MAAM;AAC/E,UAAQ,QAAQ,MAAM;AAAA,IAClB,KAAK;AAED,UAAI,QAAQ,YAAY;AACpB,eACI,oCAAC,OAAI,SAAS,KACV,oCAAC,QAAK,OAAM,aAAU,SAAE,GACxB,oCAAC,QAAK,OAAM,aAAW,QAAQ,OAAQ,CAC3C;AAAA,MAER;AACA,aACI,oCAAC,OAAI,SAAS,KACV,oCAAC,QAAK,OAAM,aACR,oCAAC,WAAQ,MAAK,QAAO,CACzB,GACA,oCAAC,QAAK,OAAM,WAAU,UAAQ,QAAC,KAAE,QAAQ,OAAQ,CACrD;AAAA,IAGR,KAAK;AACD,aACI,oCAAC,OAAI,SAAS,KACV,oCAAC,QAAK,OAAM,aAAU,SAAE,GACxB,oCAAC,QAAK,OAAM,aAAW,QAAQ,OAAQ,CAC3C;AAAA,IAGR,KAAK;AACD,aACI,oCAAC,OAAI,SAAS,KACV,oCAAC,QAAK,OAAM,aAAU,SAAE,GACxB,oCAAC,QAAK,OAAM,aAAW,QAAQ,OAAQ,CAC3C;AAAA,IAGR,KAAK;AAAA,IACL;AACI,aACI,oCAAC,OAAI,SAAS,KACV,oCAAC,YAAM,QAAQ,OAAQ,CAC3B;AAAA,EAEZ;AACJ;AAQO,MAAM,qBAAwD,CAAC;AAAA,EAClE;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,MAAI,CAAC,UAAU;AACX,WAAO;AAAA,EACX;AAIA,QAAM,kBAAkB;AACxB,QAAM,cAAc,KAAK,MAAM,YAAY,eAAe;AAC1D,QAAM,kBAAkB,SAAS,MAAM,CAAC,WAAW;AAEnD,SACI;AAAA,IAAC;AAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,QAAQ;AAAA;AAAA,IAGR,oCAAC,OAAI,cAAc,KACf,oCAAC,QAAK,OAAM,WAAU,MAAI,QACtB,oCAAC,WAAQ,MAAK,QAAO,GAAE,gBAC3B,GACA,oCAAC,QAAK,OAAM,WAAU,UAAQ,QAAC,kCAAgC,CACnE;AAAA,IAGA,oCAAC,OAAI,eAAc,UAAS,UAAU,KACjC,gBAAgB,WAAW,IACxB,oCAAC,QAAK,OAAM,WAAU,UAAQ,QAAC,iCAA+B,IAE9D,gBAAgB,IAAI,CAAC,QACjB,oCAAC,sBAAmB,KAAK,IAAI,IAAI,SAAS,KAAK,CAClD,CAET;AAAA,IAGA,oCAAC,OAAI,WAAW,KACZ,oCAAC,QAAK,OAAM,WAAU,UAAQ,QAAC,gCAE/B,CACJ;AAAA,EACJ;AAER;AAEA,IAAO,6BAAQ;","names":[]}