@within-7/minto 0.1.7 → 0.3.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 (601) hide show
  1. package/cli.js +155 -37
  2. package/dist/Tool.js +38 -0
  3. package/dist/Tool.js.map +3 -3
  4. package/dist/commands/agents/AgentsCommand.js +73 -49
  5. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  6. package/dist/commands/agents/constants.js +1 -1
  7. package/dist/commands/agents/constants.js.map +1 -1
  8. package/dist/commands/agents/index.js +1 -1
  9. package/dist/commands/bug.js +74 -7
  10. package/dist/commands/bug.js.map +3 -3
  11. package/dist/commands/clear.js +3 -0
  12. package/dist/commands/clear.js.map +2 -2
  13. package/dist/commands/compact.js +37 -0
  14. package/dist/commands/compact.js.map +2 -2
  15. package/dist/commands/context.js +85 -0
  16. package/dist/commands/context.js.map +7 -0
  17. package/dist/commands/ctx_viz.js +18 -10
  18. package/dist/commands/ctx_viz.js.map +2 -2
  19. package/dist/commands/doctor.js +158 -12
  20. package/dist/commands/doctor.js.map +2 -2
  21. package/dist/commands/export.js +157 -0
  22. package/dist/commands/export.js.map +7 -0
  23. package/dist/commands/mcp-interactive.js +28 -18
  24. package/dist/commands/mcp-interactive.js.map +2 -2
  25. package/dist/commands/model.js +9 -7
  26. package/dist/commands/model.js.map +2 -2
  27. package/dist/commands/permissions.js +87 -0
  28. package/dist/commands/permissions.js.map +7 -0
  29. package/dist/commands/plugin/AddMarketplaceForm.js +3 -2
  30. package/dist/commands/plugin/AddMarketplaceForm.js.map +2 -2
  31. package/dist/commands/plugin/ConfirmDialog.js +2 -1
  32. package/dist/commands/plugin/ConfirmDialog.js.map +2 -2
  33. package/dist/commands/plugin/ErrorView.js +2 -1
  34. package/dist/commands/plugin/ErrorView.js.map +2 -2
  35. package/dist/commands/plugin/InstalledPluginsByMarketplace.js +5 -4
  36. package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +2 -2
  37. package/dist/commands/plugin/InstalledPluginsManager.js +5 -4
  38. package/dist/commands/plugin/InstalledPluginsManager.js.map +2 -2
  39. package/dist/commands/plugin/MainMenu.js +2 -1
  40. package/dist/commands/plugin/MainMenu.js.map +2 -2
  41. package/dist/commands/plugin/MarketplaceManager.js +5 -4
  42. package/dist/commands/plugin/MarketplaceManager.js.map +2 -2
  43. package/dist/commands/plugin/MarketplaceSelector.js +4 -3
  44. package/dist/commands/plugin/MarketplaceSelector.js.map +2 -2
  45. package/dist/commands/plugin/PlaceholderScreen.js +3 -2
  46. package/dist/commands/plugin/PlaceholderScreen.js.map +2 -2
  47. package/dist/commands/plugin/PluginBrowser.js +6 -5
  48. package/dist/commands/plugin/PluginBrowser.js.map +2 -2
  49. package/dist/commands/plugin/PluginDetailsInstall.js +5 -4
  50. package/dist/commands/plugin/PluginDetailsInstall.js.map +2 -2
  51. package/dist/commands/plugin/PluginDetailsManage.js +4 -3
  52. package/dist/commands/plugin/PluginDetailsManage.js.map +2 -2
  53. package/dist/commands/plugin.js +16 -15
  54. package/dist/commands/plugin.js.map +2 -2
  55. package/dist/commands/quit.js +3 -1
  56. package/dist/commands/quit.js.map +2 -2
  57. package/dist/commands/sandbox.js +105 -0
  58. package/dist/commands/sandbox.js.map +7 -0
  59. package/dist/commands/setup.js +2 -1
  60. package/dist/commands/setup.js.map +2 -2
  61. package/dist/commands/status.js +59 -0
  62. package/dist/commands/status.js.map +7 -0
  63. package/dist/commands/tasks.js +108 -0
  64. package/dist/commands/tasks.js.map +7 -0
  65. package/dist/commands/todos.js +123 -0
  66. package/dist/commands/todos.js.map +7 -0
  67. package/dist/commands/undo.js +245 -0
  68. package/dist/commands/undo.js.map +7 -0
  69. package/dist/commands.js +22 -2
  70. package/dist/commands.js.map +2 -2
  71. package/dist/components/AgentThinkingBlock.js +10 -18
  72. package/dist/components/AgentThinkingBlock.js.map +2 -2
  73. package/dist/components/AsciiLogo.js +7 -8
  74. package/dist/components/AsciiLogo.js.map +2 -2
  75. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
  76. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
  77. package/dist/components/AskUserQuestionDialog/QuestionView.js +2 -1
  78. package/dist/components/AskUserQuestionDialog/QuestionView.js.map +2 -2
  79. package/dist/components/BackgroundTasksPanel.js +78 -29
  80. package/dist/components/BackgroundTasksPanel.js.map +2 -2
  81. package/dist/components/BashStreamingProgress.js +24 -0
  82. package/dist/components/BashStreamingProgress.js.map +7 -0
  83. package/dist/components/CollapsibleHint.js +15 -0
  84. package/dist/components/CollapsibleHint.js.map +7 -0
  85. package/dist/components/Config.js +3 -2
  86. package/dist/components/Config.js.map +2 -2
  87. package/dist/components/ConsoleOAuthFlow.js +2 -1
  88. package/dist/components/ConsoleOAuthFlow.js.map +2 -2
  89. package/dist/components/Cost.js +2 -1
  90. package/dist/components/Cost.js.map +2 -2
  91. package/dist/components/FileEditToolUpdatedMessage.js +1 -1
  92. package/dist/components/FileEditToolUpdatedMessage.js.map +2 -2
  93. package/dist/components/HeaderBar.js +13 -8
  94. package/dist/components/HeaderBar.js.map +2 -2
  95. package/dist/components/HistorySearchOverlay.js +4 -3
  96. package/dist/components/HistorySearchOverlay.js.map +2 -2
  97. package/dist/components/HotkeyHelpPanel.js +134 -0
  98. package/dist/components/HotkeyHelpPanel.js.map +7 -0
  99. package/dist/components/InvalidConfigDialog.js +2 -1
  100. package/dist/components/InvalidConfigDialog.js.map +2 -2
  101. package/dist/components/Logo.js +24 -68
  102. package/dist/components/Logo.js.map +2 -2
  103. package/dist/components/MCPServerApprovalDialog.js +2 -1
  104. package/dist/components/MCPServerApprovalDialog.js.map +2 -2
  105. package/dist/components/MCPServerDialogCopy.js +2 -1
  106. package/dist/components/MCPServerDialogCopy.js.map +2 -2
  107. package/dist/components/MCPServerMultiselectDialog.js +2 -1
  108. package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
  109. package/dist/components/Message.js +23 -7
  110. package/dist/components/Message.js.map +3 -3
  111. package/dist/components/MessageSelector.js +4 -3
  112. package/dist/components/MessageSelector.js.map +2 -2
  113. package/dist/components/ModeIndicator.js +2 -1
  114. package/dist/components/ModeIndicator.js.map +2 -2
  115. package/dist/components/ModelConfig.js +20 -6
  116. package/dist/components/ModelConfig.js.map +2 -2
  117. package/dist/components/ModelListManager.js +7 -6
  118. package/dist/components/ModelListManager.js.map +2 -2
  119. package/dist/components/ModelSelector/ModelSelector.js +27 -14
  120. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  121. package/dist/components/Onboarding.js +22 -16
  122. package/dist/components/Onboarding.js.map +2 -2
  123. package/dist/components/OperationSummary.js +130 -0
  124. package/dist/components/OperationSummary.js.map +7 -0
  125. package/dist/components/ProgressBar.js +74 -0
  126. package/dist/components/ProgressBar.js.map +7 -0
  127. package/dist/components/PromptInput.js +210 -87
  128. package/dist/components/PromptInput.js.map +2 -2
  129. package/dist/components/RequestStatusIndicator.js +194 -0
  130. package/dist/components/RequestStatusIndicator.js.map +7 -0
  131. package/dist/components/SensitiveFileWarning.js +31 -0
  132. package/dist/components/SensitiveFileWarning.js.map +7 -0
  133. package/dist/components/Spinner.js +141 -27
  134. package/dist/components/Spinner.js.map +2 -2
  135. package/dist/components/SpinnerSymbol.js +21 -27
  136. package/dist/components/SpinnerSymbol.js.map +2 -2
  137. package/dist/components/StreamingBashOutput.js +9 -8
  138. package/dist/components/StreamingBashOutput.js.map +2 -2
  139. package/dist/components/StructuredDiff.js +6 -8
  140. package/dist/components/StructuredDiff.js.map +2 -2
  141. package/dist/components/SubagentBlock.js +5 -3
  142. package/dist/components/SubagentBlock.js.map +2 -2
  143. package/dist/components/SubagentProgress.js +17 -15
  144. package/dist/components/SubagentProgress.js.map +2 -2
  145. package/dist/components/TaskCard.js +30 -24
  146. package/dist/components/TaskCard.js.map +2 -2
  147. package/dist/components/TextInput.js +9 -1
  148. package/dist/components/TextInput.js.map +2 -2
  149. package/dist/components/TodoChangeBlock.js +1 -1
  150. package/dist/components/TodoChangeBlock.js.map +2 -2
  151. package/dist/components/TodoPanel.js +140 -31
  152. package/dist/components/TodoPanel.js.map +3 -3
  153. package/dist/components/TokenCounter.js +74 -0
  154. package/dist/components/TokenCounter.js.map +7 -0
  155. package/dist/components/TokenWarning.js +2 -1
  156. package/dist/components/TokenWarning.js.map +2 -2
  157. package/dist/components/ToolUseLoader.js +2 -2
  158. package/dist/components/ToolUseLoader.js.map +2 -2
  159. package/dist/components/TreeConnector.js +26 -0
  160. package/dist/components/TreeConnector.js.map +7 -0
  161. package/dist/components/TrustDialog.js +2 -1
  162. package/dist/components/TrustDialog.js.map +2 -2
  163. package/dist/components/TurnCompletionIndicator.js +18 -0
  164. package/dist/components/TurnCompletionIndicator.js.map +7 -0
  165. package/dist/components/binary-feedback/BinaryFeedbackView.js +2 -1
  166. package/dist/components/binary-feedback/BinaryFeedbackView.js.map +2 -2
  167. package/dist/components/messages/AssistantTextMessage.js +20 -9
  168. package/dist/components/messages/AssistantTextMessage.js.map +2 -2
  169. package/dist/components/messages/AssistantThinkingMessage.js +18 -3
  170. package/dist/components/messages/AssistantThinkingMessage.js.map +2 -2
  171. package/dist/components/messages/AssistantToolUseMessage.js +17 -10
  172. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  173. package/dist/components/messages/GroupRenderer.js +54 -0
  174. package/dist/components/messages/GroupRenderer.js.map +7 -0
  175. package/dist/components/messages/NestedTasksPreview.js +24 -0
  176. package/dist/components/messages/NestedTasksPreview.js.map +7 -0
  177. package/dist/components/messages/ParallelTasksGroupView.js +93 -0
  178. package/dist/components/messages/ParallelTasksGroupView.js.map +7 -0
  179. package/dist/components/messages/TaskInModuleView.js +218 -0
  180. package/dist/components/messages/TaskInModuleView.js.map +7 -0
  181. package/dist/components/messages/TaskOutputContent.js +56 -0
  182. package/dist/components/messages/TaskOutputContent.js.map +7 -0
  183. package/dist/components/messages/UserPromptMessage.js +2 -2
  184. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  185. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +2 -3
  186. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
  187. package/dist/components/permissions/FallbackPermissionRequest.js +4 -4
  188. package/dist/components/permissions/FallbackPermissionRequest.js.map +2 -2
  189. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +4 -4
  190. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +2 -2
  191. package/dist/constants/colors.js +120 -54
  192. package/dist/constants/colors.js.map +2 -2
  193. package/dist/constants/formatRules.js +102 -0
  194. package/dist/constants/formatRules.js.map +7 -0
  195. package/dist/constants/prompts.js +12 -34
  196. package/dist/constants/prompts.js.map +2 -2
  197. package/dist/constants/symbols.js +64 -6
  198. package/dist/constants/symbols.js.map +2 -2
  199. package/dist/constants/timing.js +5 -0
  200. package/dist/constants/timing.js.map +2 -2
  201. package/dist/constants/toolInputExamples.js +84 -0
  202. package/dist/constants/toolInputExamples.js.map +7 -0
  203. package/dist/core/backupManager.js +321 -0
  204. package/dist/core/backupManager.js.map +7 -0
  205. package/dist/core/config/defaults.js +84 -0
  206. package/dist/core/config/defaults.js.map +7 -0
  207. package/dist/core/config/index.js +111 -0
  208. package/dist/core/config/index.js.map +7 -0
  209. package/dist/core/config/loader.js +221 -0
  210. package/dist/core/config/loader.js.map +7 -0
  211. package/dist/core/config/migrations.js +128 -0
  212. package/dist/core/config/migrations.js.map +7 -0
  213. package/dist/core/config/schema.js +178 -0
  214. package/dist/core/config/schema.js.map +7 -0
  215. package/dist/core/costTracker.js +129 -0
  216. package/dist/core/costTracker.js.map +7 -0
  217. package/dist/core/gitAutoCommit.js +287 -0
  218. package/dist/core/gitAutoCommit.js.map +7 -0
  219. package/dist/core/index.js +8 -0
  220. package/dist/core/index.js.map +7 -0
  221. package/dist/core/operationTracker.js +212 -0
  222. package/dist/core/operationTracker.js.map +7 -0
  223. package/dist/core/permissions/auditLog.js +204 -0
  224. package/dist/core/permissions/auditLog.js.map +7 -0
  225. package/dist/core/permissions/engine/index.js +3 -0
  226. package/dist/core/permissions/engine/index.js.map +7 -0
  227. package/dist/core/permissions/engine/permissionEngine.js +106 -0
  228. package/dist/core/permissions/engine/permissionEngine.js.map +7 -0
  229. package/dist/core/permissions/engine/types.js +1 -0
  230. package/dist/core/permissions/engine/types.js.map +7 -0
  231. package/dist/core/permissions/index.js +84 -0
  232. package/dist/core/permissions/index.js.map +7 -0
  233. package/dist/core/permissions/ruleEngine.js +259 -0
  234. package/dist/core/permissions/ruleEngine.js.map +7 -0
  235. package/dist/core/permissions/rules/allowedToolsRule.js +62 -0
  236. package/dist/core/permissions/rules/allowedToolsRule.js.map +7 -0
  237. package/dist/core/permissions/rules/autoEscalationRule.js +296 -0
  238. package/dist/core/permissions/rules/autoEscalationRule.js.map +7 -0
  239. package/dist/core/permissions/rules/index.js +46 -0
  240. package/dist/core/permissions/rules/index.js.map +7 -0
  241. package/dist/core/permissions/rules/planModeRule.js +55 -0
  242. package/dist/core/permissions/rules/planModeRule.js.map +7 -0
  243. package/dist/core/permissions/rules/projectBoundaryRule.js +173 -0
  244. package/dist/core/permissions/rules/projectBoundaryRule.js.map +7 -0
  245. package/dist/core/permissions/rules/safeModeRule.js +65 -0
  246. package/dist/core/permissions/rules/safeModeRule.js.map +7 -0
  247. package/dist/core/permissions/rules/sensitivePathsRule.js +345 -0
  248. package/dist/core/permissions/rules/sensitivePathsRule.js.map +7 -0
  249. package/dist/core/permissions/types.js +127 -0
  250. package/dist/core/permissions/types.js.map +7 -0
  251. package/dist/core/tokenStats.js +9 -0
  252. package/dist/core/tokenStats.js.map +7 -0
  253. package/dist/core/tokenStatsManager.js +331 -0
  254. package/dist/core/tokenStatsManager.js.map +7 -0
  255. package/dist/core/tools/executor.js +143 -0
  256. package/dist/core/tools/executor.js.map +7 -0
  257. package/dist/core/tools/index.js +15 -0
  258. package/dist/core/tools/index.js.map +7 -0
  259. package/dist/core/tools/registry.js +183 -0
  260. package/dist/core/tools/registry.js.map +7 -0
  261. package/dist/core/tools/types.js +1 -0
  262. package/dist/core/tools/types.js.map +7 -0
  263. package/dist/cost-tracker.js +23 -15
  264. package/dist/cost-tracker.js.map +2 -2
  265. package/dist/entrypoints/cli.js +158 -130
  266. package/dist/entrypoints/cli.js.map +2 -2
  267. package/dist/entrypoints/mcp.js +12 -4
  268. package/dist/entrypoints/mcp.js.map +2 -2
  269. package/dist/history.js +14 -3
  270. package/dist/history.js.map +2 -2
  271. package/dist/hooks/useAgentTokenStats.js +72 -0
  272. package/dist/hooks/useAgentTokenStats.js.map +7 -0
  273. package/dist/hooks/useAgentTranscripts.js +140 -0
  274. package/dist/hooks/useAgentTranscripts.js.map +7 -0
  275. package/dist/hooks/useAnimationSync.js +53 -0
  276. package/dist/hooks/useAnimationSync.js.map +7 -0
  277. package/dist/hooks/useArrowKeyHistory.js +4 -2
  278. package/dist/hooks/useArrowKeyHistory.js.map +2 -2
  279. package/dist/hooks/useCanUseTool.js +3 -1
  280. package/dist/hooks/useCanUseTool.js.map +2 -2
  281. package/dist/hooks/useExitOnCtrlCD.js +9 -5
  282. package/dist/hooks/useExitOnCtrlCD.js.map +2 -2
  283. package/dist/hooks/useHookStatus.js +40 -0
  284. package/dist/hooks/useHookStatus.js.map +7 -0
  285. package/dist/hooks/useLogMessages.js +29 -2
  286. package/dist/hooks/useLogMessages.js.map +2 -2
  287. package/dist/hooks/useMessageGroups.js +43 -0
  288. package/dist/hooks/useMessageGroups.js.map +7 -0
  289. package/dist/hooks/useTerminalSize.js +62 -6
  290. package/dist/hooks/useTerminalSize.js.map +2 -2
  291. package/dist/hooks/useUnifiedCompletion.js +69 -0
  292. package/dist/hooks/useUnifiedCompletion.js.map +2 -2
  293. package/dist/i18n/index.js +109 -0
  294. package/dist/i18n/index.js.map +7 -0
  295. package/dist/i18n/locales/en.js +348 -0
  296. package/dist/i18n/locales/en.js.map +7 -0
  297. package/dist/i18n/locales/index.js +7 -0
  298. package/dist/i18n/locales/index.js.map +7 -0
  299. package/dist/i18n/locales/zh-CN.js +348 -0
  300. package/dist/i18n/locales/zh-CN.js.map +7 -0
  301. package/dist/i18n/types.js +8 -0
  302. package/dist/i18n/types.js.map +7 -0
  303. package/dist/permissions.js +28 -1
  304. package/dist/permissions.js.map +2 -2
  305. package/dist/query.js +253 -21
  306. package/dist/query.js.map +3 -3
  307. package/dist/screens/REPL.js +523 -194
  308. package/dist/screens/REPL.js.map +3 -3
  309. package/dist/services/adapters/chatCompletions.js +3 -1
  310. package/dist/services/adapters/chatCompletions.js.map +2 -2
  311. package/dist/services/adapters/messageNormalizer.js +354 -0
  312. package/dist/services/adapters/messageNormalizer.js.map +7 -0
  313. package/dist/services/adapters/responsesAPI.js +6 -3
  314. package/dist/services/adapters/responsesAPI.js.map +2 -2
  315. package/dist/services/checkpointManager.js +386 -0
  316. package/dist/services/checkpointManager.js.map +7 -0
  317. package/dist/services/claude.js +192 -14
  318. package/dist/services/claude.js.map +3 -3
  319. package/dist/services/compressionService.js +50 -1
  320. package/dist/services/compressionService.js.map +2 -2
  321. package/dist/services/contextMonitor.js +162 -0
  322. package/dist/services/contextMonitor.js.map +7 -0
  323. package/dist/services/customCommands.js +60 -41
  324. package/dist/services/customCommands.js.map +2 -2
  325. package/dist/services/hookExecutor.js +173 -1
  326. package/dist/services/hookExecutor.js.map +2 -2
  327. package/dist/services/intelligentCompactor.js +281 -0
  328. package/dist/services/intelligentCompactor.js.map +7 -0
  329. package/dist/services/lspConfig.js +109 -0
  330. package/dist/services/lspConfig.js.map +7 -0
  331. package/dist/services/mcpClient.js +338 -43
  332. package/dist/services/mcpClient.js.map +2 -2
  333. package/dist/services/modelOrchestrator.js +310 -0
  334. package/dist/services/modelOrchestrator.js.map +7 -0
  335. package/dist/services/openai.js +8 -1
  336. package/dist/services/openai.js.map +2 -2
  337. package/dist/services/outputStyles.js +138 -0
  338. package/dist/services/outputStyles.js.map +7 -0
  339. package/dist/services/plugins/index.js +5 -0
  340. package/dist/services/plugins/index.js.map +7 -0
  341. package/dist/services/plugins/lspServers.js +188 -0
  342. package/dist/services/plugins/lspServers.js.map +7 -0
  343. package/dist/services/plugins/pluginRuntime.js +229 -0
  344. package/dist/services/plugins/pluginRuntime.js.map +7 -0
  345. package/dist/services/plugins/pluginValidation.js +219 -0
  346. package/dist/services/plugins/pluginValidation.js.map +7 -0
  347. package/dist/services/plugins/skillMarketplace.js +556 -0
  348. package/dist/services/plugins/skillMarketplace.js.map +7 -0
  349. package/dist/services/responseStateManager.js +37 -3
  350. package/dist/services/responseStateManager.js.map +2 -2
  351. package/dist/services/sandbox/filesystemBoundary.js +341 -0
  352. package/dist/services/sandbox/filesystemBoundary.js.map +7 -0
  353. package/dist/services/sandbox/index.js +14 -0
  354. package/dist/services/sandbox/index.js.map +7 -0
  355. package/dist/services/sandbox/networkProxy.js +293 -0
  356. package/dist/services/sandbox/networkProxy.js.map +7 -0
  357. package/dist/services/sandbox/sandboxController.js +574 -0
  358. package/dist/services/sandbox/sandboxController.js.map +7 -0
  359. package/dist/services/sandbox/types.js +50 -0
  360. package/dist/services/sandbox/types.js.map +7 -0
  361. package/dist/services/sessionMemory.js +266 -0
  362. package/dist/services/sessionMemory.js.map +7 -0
  363. package/dist/services/taskRouter.js +324 -0
  364. package/dist/services/taskRouter.js.map +7 -0
  365. package/dist/tools/ArchitectTool/ArchitectTool.js +7 -1
  366. package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
  367. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +6 -2
  368. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  369. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +2 -1
  370. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
  371. package/dist/tools/BaseTool.js +72 -0
  372. package/dist/tools/BaseTool.js.map +7 -0
  373. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +3 -0
  374. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +2 -2
  375. package/dist/tools/BashTool/BashTool.js +79 -3
  376. package/dist/tools/BashTool/BashTool.js.map +2 -2
  377. package/dist/tools/BashTool/BashToolResultMessage.js +3 -0
  378. package/dist/tools/BashTool/BashToolResultMessage.js.map +2 -2
  379. package/dist/tools/BashTool/OutputLine.js +54 -0
  380. package/dist/tools/BashTool/OutputLine.js.map +2 -2
  381. package/dist/tools/BashTool/prompt.js +336 -3
  382. package/dist/tools/BashTool/prompt.js.map +2 -2
  383. package/dist/tools/FileEditTool/FileEditTool.js +29 -4
  384. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  385. package/dist/tools/FileEditTool/prompt.js +6 -3
  386. package/dist/tools/FileEditTool/prompt.js.map +2 -2
  387. package/dist/tools/FileWriteTool/FileWriteTool.js +5 -5
  388. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  389. package/dist/tools/FileWriteTool/prompt.js +4 -2
  390. package/dist/tools/FileWriteTool/prompt.js.map +2 -2
  391. package/dist/tools/GlobTool/GlobTool.js +4 -2
  392. package/dist/tools/GlobTool/GlobTool.js.map +2 -2
  393. package/dist/tools/GrepTool/GrepTool.js +36 -7
  394. package/dist/tools/GrepTool/GrepTool.js.map +2 -2
  395. package/dist/tools/KillShellTool/KillShellToolResultMessage.js +3 -0
  396. package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +2 -2
  397. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +109 -0
  398. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +7 -0
  399. package/dist/tools/ListMcpResourcesTool/prompt.js +19 -0
  400. package/dist/tools/ListMcpResourcesTool/prompt.js.map +7 -0
  401. package/dist/tools/LspTool/LspTool.js +664 -0
  402. package/dist/tools/LspTool/LspTool.js.map +7 -0
  403. package/dist/tools/LspTool/prompt.js +27 -0
  404. package/dist/tools/LspTool/prompt.js.map +7 -0
  405. package/dist/tools/MCPTool/MCPTool.js +9 -1
  406. package/dist/tools/MCPTool/MCPTool.js.map +2 -2
  407. package/dist/tools/MemoryReadTool/MemoryReadTool.js +19 -6
  408. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
  409. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +6 -6
  410. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
  411. package/dist/tools/MultiEditTool/MultiEditTool.js +19 -2
  412. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  413. package/dist/tools/MultiEditTool/prompt.js +5 -3
  414. package/dist/tools/MultiEditTool/prompt.js.map +2 -2
  415. package/dist/tools/NotebookEditTool/NotebookEditTool.js +7 -2
  416. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  417. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
  418. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +75 -0
  419. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +7 -0
  420. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +109 -0
  421. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +7 -0
  422. package/dist/tools/PlanModeTool/prompt.js +94 -0
  423. package/dist/tools/PlanModeTool/prompt.js.map +7 -0
  424. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +130 -0
  425. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +7 -0
  426. package/dist/tools/ReadMcpResourceTool/prompt.js +17 -0
  427. package/dist/tools/ReadMcpResourceTool/prompt.js.map +7 -0
  428. package/dist/tools/SkillTool/SkillTool.js +10 -4
  429. package/dist/tools/SkillTool/SkillTool.js.map +2 -2
  430. package/dist/tools/SkillTool/prompt.js +1 -1
  431. package/dist/tools/SkillTool/prompt.js.map +1 -1
  432. package/dist/tools/SlashCommandTool/SlashCommandTool.js +260 -0
  433. package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +7 -0
  434. package/dist/tools/SlashCommandTool/prompt.js +35 -0
  435. package/dist/tools/SlashCommandTool/prompt.js.map +7 -0
  436. package/dist/tools/TaskOutputTool/TaskOutputTool.js +190 -0
  437. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +7 -0
  438. package/dist/tools/TaskOutputTool/prompt.js +15 -0
  439. package/dist/tools/TaskOutputTool/prompt.js.map +7 -0
  440. package/dist/tools/TaskTool/TaskTool.js +310 -104
  441. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  442. package/dist/tools/TaskTool/prompt.js.map +2 -2
  443. package/dist/tools/TodoWriteTool/TodoWriteTool.js +42 -77
  444. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
  445. package/dist/tools/URLFetcherTool/URLFetcherTool.js +4 -1
  446. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
  447. package/dist/tools/URLFetcherTool/cache.js +55 -8
  448. package/dist/tools/URLFetcherTool/cache.js.map +2 -2
  449. package/dist/tools.js +31 -2
  450. package/dist/tools.js.map +2 -2
  451. package/dist/types/hooks.js +4 -0
  452. package/dist/types/hooks.js.map +2 -2
  453. package/dist/types/marketplace.js.map +2 -2
  454. package/dist/types/messageGroup.js +36 -0
  455. package/dist/types/messageGroup.js.map +7 -0
  456. package/dist/types/plugin.js.map +2 -2
  457. package/dist/types/thinking.js +1 -0
  458. package/dist/types/thinking.js.map +7 -0
  459. package/dist/utils/BackgroundShellManager.js +136 -39
  460. package/dist/utils/BackgroundShellManager.js.map +2 -2
  461. package/dist/utils/CircuitBreaker.js +242 -0
  462. package/dist/utils/CircuitBreaker.js.map +7 -0
  463. package/dist/utils/MessageBatchBuffer.js +102 -0
  464. package/dist/utils/MessageBatchBuffer.js.map +7 -0
  465. package/dist/utils/PersistentShell.js +151 -1
  466. package/dist/utils/PersistentShell.js.map +2 -2
  467. package/dist/utils/agentLoader.js +1 -23
  468. package/dist/utils/agentLoader.js.map +2 -2
  469. package/dist/utils/agentTranscripts.js +641 -0
  470. package/dist/utils/agentTranscripts.js.map +7 -0
  471. package/dist/utils/animationManager.js +213 -0
  472. package/dist/utils/animationManager.js.map +7 -0
  473. package/dist/utils/animationSync.js +110 -0
  474. package/dist/utils/animationSync.js.map +7 -0
  475. package/dist/utils/ask.js +2 -0
  476. package/dist/utils/ask.js.map +2 -2
  477. package/dist/utils/asyncFile.js +215 -0
  478. package/dist/utils/asyncFile.js.map +7 -0
  479. package/dist/utils/backgroundAgentManager.js +231 -0
  480. package/dist/utils/backgroundAgentManager.js.map +7 -0
  481. package/dist/utils/config.js +108 -10
  482. package/dist/utils/config.js.map +2 -2
  483. package/dist/utils/conversationRecovery.js +19 -0
  484. package/dist/utils/conversationRecovery.js.map +2 -2
  485. package/dist/utils/credentials/CredentialStore.js +1 -0
  486. package/dist/utils/credentials/CredentialStore.js.map +7 -0
  487. package/dist/utils/credentials/EncryptedFileStore.js +157 -0
  488. package/dist/utils/credentials/EncryptedFileStore.js.map +7 -0
  489. package/dist/utils/credentials/index.js +37 -0
  490. package/dist/utils/credentials/index.js.map +7 -0
  491. package/dist/utils/credentials/migration.js +82 -0
  492. package/dist/utils/credentials/migration.js.map +7 -0
  493. package/dist/utils/exit.js +73 -0
  494. package/dist/utils/exit.js.map +7 -0
  495. package/dist/utils/format.js +73 -5
  496. package/dist/utils/format.js.map +2 -2
  497. package/dist/utils/generators.js +76 -6
  498. package/dist/utils/generators.js.map +2 -2
  499. package/dist/utils/globalErrorHandler.js +149 -0
  500. package/dist/utils/globalErrorHandler.js.map +7 -0
  501. package/dist/utils/groupHandlers/index.js +8 -0
  502. package/dist/utils/groupHandlers/index.js.map +7 -0
  503. package/dist/utils/groupHandlers/parallelTasksHandler.js +140 -0
  504. package/dist/utils/groupHandlers/parallelTasksHandler.js.map +7 -0
  505. package/dist/utils/groupHandlers/taskHandler.js +104 -0
  506. package/dist/utils/groupHandlers/taskHandler.js.map +7 -0
  507. package/dist/utils/groupHandlers/types.js +1 -0
  508. package/dist/utils/groupHandlers/types.js.map +7 -0
  509. package/dist/utils/logRotation.js +224 -0
  510. package/dist/utils/logRotation.js.map +7 -0
  511. package/dist/utils/markdown.js +13 -1
  512. package/dist/utils/markdown.js.map +2 -2
  513. package/dist/utils/marketplaceManager.js +3 -5
  514. package/dist/utils/marketplaceManager.js.map +2 -2
  515. package/dist/utils/memSafety.js +264 -0
  516. package/dist/utils/memSafety.js.map +7 -0
  517. package/dist/utils/messageGroupManager.js +274 -0
  518. package/dist/utils/messageGroupManager.js.map +7 -0
  519. package/dist/utils/messages.js +13 -4
  520. package/dist/utils/messages.js.map +2 -2
  521. package/dist/utils/model.js +119 -15
  522. package/dist/utils/model.js.map +3 -3
  523. package/dist/utils/permissions/filesystem.js +162 -6
  524. package/dist/utils/permissions/filesystem.js.map +2 -2
  525. package/dist/utils/plan/planMode.js +143 -0
  526. package/dist/utils/plan/planMode.js.map +7 -0
  527. package/dist/utils/pluginLoader.js +17 -21
  528. package/dist/utils/pluginLoader.js.map +2 -2
  529. package/dist/utils/ripgrep.js +55 -2
  530. package/dist/utils/ripgrep.js.map +2 -2
  531. package/dist/utils/safePath.js +132 -0
  532. package/dist/utils/safePath.js.map +7 -0
  533. package/dist/utils/sanitizeInput.js +32 -0
  534. package/dist/utils/sanitizeInput.js.map +7 -0
  535. package/dist/utils/secureKeyStorage.js +312 -0
  536. package/dist/utils/secureKeyStorage.js.map +7 -0
  537. package/dist/utils/sensitiveFiles.js +125 -0
  538. package/dist/utils/sensitiveFiles.js.map +7 -0
  539. package/dist/utils/session/sessionPlugins.js +67 -0
  540. package/dist/utils/session/sessionPlugins.js.map +7 -0
  541. package/dist/utils/taskDisplayUtils.js +257 -0
  542. package/dist/utils/taskDisplayUtils.js.map +7 -0
  543. package/dist/utils/teamConfig.js +2 -1
  544. package/dist/utils/teamConfig.js.map +2 -2
  545. package/dist/utils/theme.js +6 -6
  546. package/dist/utils/theme.js.map +1 -1
  547. package/dist/utils/todoStorage.js +92 -2
  548. package/dist/utils/todoStorage.js.map +2 -2
  549. package/dist/utils/toolRiskClassification.js +207 -0
  550. package/dist/utils/toolRiskClassification.js.map +7 -0
  551. package/dist/utils/toolTimeout.js +136 -0
  552. package/dist/utils/toolTimeout.js.map +7 -0
  553. package/dist/utils/tooling/safeRender.js +116 -0
  554. package/dist/utils/tooling/safeRender.js.map +7 -0
  555. package/dist/utils/userFriendlyError.js +346 -0
  556. package/dist/utils/userFriendlyError.js.map +7 -0
  557. package/dist/utils/vendor/ripgrep/arm64-darwin/rg +0 -0
  558. package/dist/version.js +2 -2
  559. package/dist/version.js.map +1 -1
  560. package/package.json +17 -5
  561. package/scripts/postinstall.js +128 -38
  562. package/dist/commands/agents.js +0 -2086
  563. package/dist/commands/agents.js.map +0 -7
  564. package/dist/commands/build.js +0 -74
  565. package/dist/commands/build.js.map +0 -7
  566. package/dist/commands/compression.js +0 -57
  567. package/dist/commands/compression.js.map +0 -7
  568. package/dist/commands/listen.js +0 -37
  569. package/dist/commands/listen.js.map +0 -7
  570. package/dist/commands/login.js +0 -37
  571. package/dist/commands/login.js.map +0 -7
  572. package/dist/commands/logout.js +0 -33
  573. package/dist/commands/logout.js.map +0 -7
  574. package/dist/commands/mcp.js +0 -40
  575. package/dist/commands/mcp.js.map +0 -7
  576. package/dist/commands/mcp_refresh.js +0 -40
  577. package/dist/commands/mcp_refresh.js.map +0 -7
  578. package/dist/commands/modelstatus.js +0 -21
  579. package/dist/commands/modelstatus.js.map +0 -7
  580. package/dist/commands/onboarding.js +0 -36
  581. package/dist/commands/onboarding.js.map +0 -7
  582. package/dist/commands/plugin-interactive.js +0 -446
  583. package/dist/commands/plugin-interactive.js.map +0 -7
  584. package/dist/commands/pr_comments.js +0 -61
  585. package/dist/commands/pr_comments.js.map +0 -7
  586. package/dist/commands/release-notes.js +0 -30
  587. package/dist/commands/release-notes.js.map +0 -7
  588. package/dist/commands/review.js +0 -51
  589. package/dist/commands/review.js.map +0 -7
  590. package/dist/components/Bug.js +0 -147
  591. package/dist/components/Bug.js.map +0 -7
  592. package/dist/components/ModelSelector.js +0 -2062
  593. package/dist/components/ModelSelector.js.map +0 -7
  594. package/dist/components/ModelStatusDisplay.js +0 -87
  595. package/dist/components/ModelStatusDisplay.js.map +0 -7
  596. package/dist/entrypoints/cli-wrapper.js +0 -61
  597. package/dist/entrypoints/cli-wrapper.js.map +0 -7
  598. package/dist/hooks/useCancelRequest.js +0 -28
  599. package/dist/hooks/useCancelRequest.js.map +0 -7
  600. package/dist/screens/Doctor.js +0 -22
  601. package/dist/screens/Doctor.js.map +0 -7
@@ -0,0 +1,215 @@
1
+ import { promises as fs } from "fs";
2
+ import { existsSync } from "fs";
3
+ import { dirname, basename, extname, join } from "path";
4
+ import { logError } from "./log.js";
5
+ import { LRUCache } from "lru-cache";
6
+ async function readFileAsync(filePath, encoding = "utf8") {
7
+ try {
8
+ return await fs.readFile(filePath, encoding);
9
+ } catch (error) {
10
+ logError(error);
11
+ return null;
12
+ }
13
+ }
14
+ async function writeFileAsync(filePath, content, encoding = "utf8") {
15
+ try {
16
+ await fs.writeFile(filePath, content, { encoding });
17
+ return true;
18
+ } catch (error) {
19
+ logError(error);
20
+ return false;
21
+ }
22
+ }
23
+ async function existsAsync(filePath) {
24
+ try {
25
+ await fs.access(filePath);
26
+ return true;
27
+ } catch {
28
+ return false;
29
+ }
30
+ }
31
+ async function readdirAsync(dirPath) {
32
+ try {
33
+ return await fs.readdir(dirPath);
34
+ } catch (error) {
35
+ logError(error);
36
+ return [];
37
+ }
38
+ }
39
+ async function statAsync(filePath) {
40
+ try {
41
+ const stats = await fs.stat(filePath);
42
+ return {
43
+ size: stats.size,
44
+ mtime: stats.mtime,
45
+ isFile: stats.isFile(),
46
+ isDirectory: stats.isDirectory()
47
+ };
48
+ } catch {
49
+ return null;
50
+ }
51
+ }
52
+ async function unlinkAsync(filePath) {
53
+ try {
54
+ await fs.unlink(filePath);
55
+ return true;
56
+ } catch (error) {
57
+ logError(error);
58
+ return false;
59
+ }
60
+ }
61
+ async function mkdirAsync(dirPath, recursive = true) {
62
+ try {
63
+ await fs.mkdir(dirPath, { recursive });
64
+ return true;
65
+ } catch (error) {
66
+ logError(error);
67
+ return false;
68
+ }
69
+ }
70
+ async function copyFileAsync(src, dest) {
71
+ try {
72
+ await fs.copyFile(src, dest);
73
+ return true;
74
+ } catch (error) {
75
+ logError(error);
76
+ return false;
77
+ }
78
+ }
79
+ async function renameAsync(oldPath, newPath) {
80
+ try {
81
+ await fs.rename(oldPath, newPath);
82
+ return true;
83
+ } catch (error) {
84
+ logError(error);
85
+ return false;
86
+ }
87
+ }
88
+ async function readJsonAsync(filePath) {
89
+ const content = await readFileAsync(filePath);
90
+ if (!content) return null;
91
+ try {
92
+ return JSON.parse(content);
93
+ } catch (error) {
94
+ logError(`Failed to parse JSON from ${filePath}: ${error}`);
95
+ return null;
96
+ }
97
+ }
98
+ async function writeJsonAsync(filePath, data, pretty = true) {
99
+ try {
100
+ const content = pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);
101
+ return await writeFileAsync(filePath, content);
102
+ } catch (error) {
103
+ logError(error);
104
+ return false;
105
+ }
106
+ }
107
+ async function readFileWithLineNumbersAsync(filePath, options = {}) {
108
+ const { startLine = 1, maxLines, encoding = "utf8" } = options;
109
+ const fileContent = await readFileAsync(filePath, encoding);
110
+ if (fileContent === null) return null;
111
+ const lines = fileContent.split(/\r?\n/);
112
+ const offset = startLine - 1;
113
+ const toReturn = maxLines !== void 0 && lines.length - offset > maxLines ? lines.slice(offset, offset + maxLines) : lines.slice(offset);
114
+ const numberedContent = toReturn.map((line, index) => {
115
+ const lineNum = index + startLine;
116
+ const numStr = String(lineNum);
117
+ if (numStr.length >= 6) {
118
+ return `${numStr} ${line}`;
119
+ }
120
+ const n = numStr.padStart(6, " ");
121
+ return `${n} ${line}`;
122
+ }).join("\n");
123
+ return {
124
+ content: numberedContent,
125
+ lineCount: toReturn.length,
126
+ totalLines: lines.length
127
+ };
128
+ }
129
+ async function findSimilarFileAsync(filePath) {
130
+ try {
131
+ const dir = dirname(filePath);
132
+ const fileBaseName = basename(filePath, extname(filePath));
133
+ if (!existsSync(dir)) {
134
+ return void 0;
135
+ }
136
+ const files = await readdirAsync(dir);
137
+ const similarFiles = files.filter(
138
+ (file) => basename(file, extname(file)) === fileBaseName && join(dir, file) !== filePath
139
+ );
140
+ return similarFiles[0];
141
+ } catch (error) {
142
+ logError(`Error finding similar file for ${filePath}: ${error}`);
143
+ return void 0;
144
+ }
145
+ }
146
+ async function isDirEmptyAsync(dirPath) {
147
+ const entries = await readdirAsync(dirPath);
148
+ return entries.length === 0;
149
+ }
150
+ const fileContentCache = new LRUCache({
151
+ max: 100,
152
+ ttl: 3e4
153
+ // 30 seconds
154
+ });
155
+ async function readFileCachedAsync(filePath, encoding = "utf8") {
156
+ const cacheKey = `${filePath}:${encoding}`;
157
+ const cached = fileContentCache.get(cacheKey);
158
+ if (cached !== void 0) {
159
+ return cached;
160
+ }
161
+ const content = await readFileAsync(filePath, encoding);
162
+ if (content !== null) {
163
+ fileContentCache.set(cacheKey, content);
164
+ }
165
+ return content;
166
+ }
167
+ function invalidateFileCache(filePath) {
168
+ for (const key of fileContentCache.keys()) {
169
+ if (key.startsWith(filePath)) {
170
+ fileContentCache.delete(key);
171
+ }
172
+ }
173
+ }
174
+ function clearFileCache() {
175
+ fileContentCache.clear();
176
+ }
177
+ async function readFilesAsync(filePaths, encoding = "utf8") {
178
+ const results = await Promise.all(
179
+ filePaths.map(async (path) => ({
180
+ path,
181
+ content: await readFileAsync(path, encoding)
182
+ }))
183
+ );
184
+ return new Map(results.map((r) => [r.path, r.content]));
185
+ }
186
+ async function ensureWriteFileAsync(filePath, content, encoding = "utf8") {
187
+ const dir = dirname(filePath);
188
+ if (!await existsAsync(dir)) {
189
+ const created = await mkdirAsync(dir, true);
190
+ if (!created) return false;
191
+ }
192
+ return await writeFileAsync(filePath, content, encoding);
193
+ }
194
+ export {
195
+ clearFileCache,
196
+ copyFileAsync,
197
+ ensureWriteFileAsync,
198
+ existsAsync,
199
+ findSimilarFileAsync,
200
+ invalidateFileCache,
201
+ isDirEmptyAsync,
202
+ mkdirAsync,
203
+ readFileAsync,
204
+ readFileCachedAsync,
205
+ readFileWithLineNumbersAsync,
206
+ readFilesAsync,
207
+ readJsonAsync,
208
+ readdirAsync,
209
+ renameAsync,
210
+ statAsync,
211
+ unlinkAsync,
212
+ writeFileAsync,
213
+ writeJsonAsync
214
+ };
215
+ //# sourceMappingURL=asyncFile.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/asyncFile.ts"],
4
+ "sourcesContent": ["/**\n * Async File Operations Utility\n *\n * Provides non-blocking file operations for improved performance.\n * Use these instead of sync operations in hot paths.\n */\n\nimport { promises as fs } from 'fs'\nimport { existsSync } from 'fs'\nimport { resolve, dirname, basename, extname, join } from 'path'\nimport { getCwd } from './state'\nimport { logError } from './log'\nimport { LRUCache } from 'lru-cache'\n\n/**\n * Read file content asynchronously\n */\nexport async function readFileAsync(\n filePath: string,\n encoding: BufferEncoding = 'utf8',\n): Promise<string | null> {\n try {\n return await fs.readFile(filePath, encoding)\n } catch (error) {\n logError(error)\n return null\n }\n}\n\n/**\n * Write file content asynchronously\n */\nexport async function writeFileAsync(\n filePath: string,\n content: string,\n encoding: BufferEncoding = 'utf8',\n): Promise<boolean> {\n try {\n await fs.writeFile(filePath, content, { encoding })\n return true\n } catch (error) {\n logError(error)\n return false\n }\n}\n\n/**\n * Check if file exists asynchronously\n */\nexport async function existsAsync(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath)\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Read directory contents asynchronously\n */\nexport async function readdirAsync(dirPath: string): Promise<string[]> {\n try {\n return await fs.readdir(dirPath)\n } catch (error) {\n logError(error)\n return []\n }\n}\n\n/**\n * Get file stats asynchronously\n */\nexport async function statAsync(filePath: string): Promise<{\n size: number\n mtime: Date\n isFile: boolean\n isDirectory: boolean\n} | null> {\n try {\n const stats = await fs.stat(filePath)\n return {\n size: stats.size,\n mtime: stats.mtime,\n isFile: stats.isFile(),\n isDirectory: stats.isDirectory(),\n }\n } catch {\n return null\n }\n}\n\n/**\n * Delete file asynchronously\n */\nexport async function unlinkAsync(filePath: string): Promise<boolean> {\n try {\n await fs.unlink(filePath)\n return true\n } catch (error) {\n logError(error)\n return false\n }\n}\n\n/**\n * Create directory asynchronously (recursive)\n */\nexport async function mkdirAsync(\n dirPath: string,\n recursive = true,\n): Promise<boolean> {\n try {\n await fs.mkdir(dirPath, { recursive })\n return true\n } catch (error) {\n logError(error)\n return false\n }\n}\n\n/**\n * Copy file asynchronously\n */\nexport async function copyFileAsync(\n src: string,\n dest: string,\n): Promise<boolean> {\n try {\n await fs.copyFile(src, dest)\n return true\n } catch (error) {\n logError(error)\n return false\n }\n}\n\n/**\n * Rename/move file asynchronously\n */\nexport async function renameAsync(\n oldPath: string,\n newPath: string,\n): Promise<boolean> {\n try {\n await fs.rename(oldPath, newPath)\n return true\n } catch (error) {\n logError(error)\n return false\n }\n}\n\n/**\n * Read JSON file asynchronously with type safety\n */\nexport async function readJsonAsync<T>(filePath: string): Promise<T | null> {\n const content = await readFileAsync(filePath)\n if (!content) return null\n\n try {\n return JSON.parse(content) as T\n } catch (error) {\n logError(`Failed to parse JSON from ${filePath}: ${error}`)\n return null\n }\n}\n\n/**\n * Write JSON file asynchronously\n */\nexport async function writeJsonAsync<T>(\n filePath: string,\n data: T,\n pretty = true,\n): Promise<boolean> {\n try {\n const content = pretty\n ? JSON.stringify(data, null, 2)\n : JSON.stringify(data)\n return await writeFileAsync(filePath, content)\n } catch (error) {\n logError(error)\n return false\n }\n}\n\n/**\n * Read file with line numbers (async version of addLineNumbers)\n */\nexport async function readFileWithLineNumbersAsync(\n filePath: string,\n options: {\n startLine?: number\n maxLines?: number\n encoding?: BufferEncoding\n } = {},\n): Promise<{\n content: string\n lineCount: number\n totalLines: number\n} | null> {\n const { startLine = 1, maxLines, encoding = 'utf8' } = options\n\n const fileContent = await readFileAsync(filePath, encoding)\n if (fileContent === null) return null\n\n const lines = fileContent.split(/\\r?\\n/)\n const offset = startLine - 1\n\n const toReturn =\n maxLines !== undefined && lines.length - offset > maxLines\n ? lines.slice(offset, offset + maxLines)\n : lines.slice(offset)\n\n // Add line numbers\n const numberedContent = toReturn\n .map((line, index) => {\n const lineNum = index + startLine\n const numStr = String(lineNum)\n if (numStr.length >= 6) {\n return `${numStr}\\t${line}`\n }\n const n = numStr.padStart(6, ' ')\n return `${n}\\t${line}`\n })\n .join('\\n')\n\n return {\n content: numberedContent,\n lineCount: toReturn.length,\n totalLines: lines.length,\n }\n}\n\n/**\n * Find similar files asynchronously\n */\nexport async function findSimilarFileAsync(\n filePath: string,\n): Promise<string | undefined> {\n try {\n const dir = dirname(filePath)\n const fileBaseName = basename(filePath, extname(filePath))\n\n // Check if directory exists (use sync for this quick check)\n if (!existsSync(dir)) {\n return undefined\n }\n\n const files = await readdirAsync(dir)\n\n const similarFiles = files.filter(\n file =>\n basename(file, extname(file)) === fileBaseName &&\n join(dir, file) !== filePath,\n )\n\n return similarFiles[0]\n } catch (error) {\n logError(`Error finding similar file for ${filePath}: ${error}`)\n return undefined\n }\n}\n\n/**\n * Check if directory is empty asynchronously\n */\nexport async function isDirEmptyAsync(dirPath: string): Promise<boolean> {\n const entries = await readdirAsync(dirPath)\n return entries.length === 0\n}\n\n// File content cache for frequently accessed files\nconst fileContentCache = new LRUCache<string, string>({\n max: 100,\n ttl: 30_000, // 30 seconds\n})\n\n/**\n * Read file with caching for frequently accessed files\n */\nexport async function readFileCachedAsync(\n filePath: string,\n encoding: BufferEncoding = 'utf8',\n): Promise<string | null> {\n const cacheKey = `${filePath}:${encoding}`\n\n const cached = fileContentCache.get(cacheKey)\n if (cached !== undefined) {\n return cached\n }\n\n const content = await readFileAsync(filePath, encoding)\n if (content !== null) {\n fileContentCache.set(cacheKey, content)\n }\n\n return content\n}\n\n/**\n * Invalidate cache for a file\n */\nexport function invalidateFileCache(filePath: string): void {\n // Remove all cache entries for this file (any encoding)\n for (const key of fileContentCache.keys()) {\n if (key.startsWith(filePath)) {\n fileContentCache.delete(key)\n }\n }\n}\n\n/**\n * Clear entire file cache\n */\nexport function clearFileCache(): void {\n fileContentCache.clear()\n}\n\n/**\n * Batch read multiple files concurrently\n */\nexport async function readFilesAsync(\n filePaths: string[],\n encoding: BufferEncoding = 'utf8',\n): Promise<Map<string, string | null>> {\n const results = await Promise.all(\n filePaths.map(async path => ({\n path,\n content: await readFileAsync(path, encoding),\n })),\n )\n\n return new Map(results.map(r => [r.path, r.content]))\n}\n\n/**\n * Ensure parent directory exists before writing\n */\nexport async function ensureWriteFileAsync(\n filePath: string,\n content: string,\n encoding: BufferEncoding = 'utf8',\n): Promise<boolean> {\n const dir = dirname(filePath)\n\n // Create parent directory if needed\n if (!(await existsAsync(dir))) {\n const created = await mkdirAsync(dir, true)\n if (!created) return false\n }\n\n return await writeFileAsync(filePath, content, encoding)\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,231 @@
1
+ import { EventEmitter } from "events";
2
+ import { debug as debugLogger } from "./debugLogger.js";
3
+ class BackgroundAgentEventEmitter extends EventEmitter {
4
+ static instance = null;
5
+ constructor() {
6
+ super();
7
+ this.setMaxListeners(100);
8
+ }
9
+ static getInstance() {
10
+ if (!BackgroundAgentEventEmitter.instance) {
11
+ BackgroundAgentEventEmitter.instance = new BackgroundAgentEventEmitter();
12
+ }
13
+ return BackgroundAgentEventEmitter.instance;
14
+ }
15
+ /**
16
+ * Emit status change event
17
+ */
18
+ emitStatusChange(agentId, status, info) {
19
+ this.emit("statusChange", { agentId, status, info });
20
+ this.emit(`status:${agentId}`, { status, info });
21
+ }
22
+ /**
23
+ * Subscribe to all status changes
24
+ */
25
+ onStatusChange(callback) {
26
+ this.on("statusChange", callback);
27
+ return () => this.off("statusChange", callback);
28
+ }
29
+ /**
30
+ * Subscribe to a specific agent's status changes
31
+ */
32
+ onAgentStatusChange(agentId, callback) {
33
+ this.on(`status:${agentId}`, callback);
34
+ return () => this.off(`status:${agentId}`, callback);
35
+ }
36
+ /**
37
+ * Wait for an agent to complete (event-driven, not polling)
38
+ */
39
+ async waitForCompletion(agentId, timeout = 3e4) {
40
+ const info = backgroundAgents.get(agentId);
41
+ if (!info) return null;
42
+ if (info.status !== "running") return info;
43
+ return new Promise((resolve) => {
44
+ let timeoutId = null;
45
+ let unsubscribe = null;
46
+ const cleanup = () => {
47
+ if (timeoutId) clearTimeout(timeoutId);
48
+ if (unsubscribe) unsubscribe();
49
+ };
50
+ unsubscribe = this.onAgentStatusChange(agentId, ({ status, info: info2 }) => {
51
+ if (status !== "running") {
52
+ cleanup();
53
+ resolve(info2);
54
+ }
55
+ });
56
+ timeoutId = setTimeout(() => {
57
+ cleanup();
58
+ resolve(backgroundAgents.get(agentId) || null);
59
+ }, timeout);
60
+ });
61
+ }
62
+ }
63
+ const backgroundAgentEvents = BackgroundAgentEventEmitter.getInstance();
64
+ const backgroundAgents = /* @__PURE__ */ new Map();
65
+ function registerBackgroundAgent(agentId, agentType, description, abortController) {
66
+ const info = {
67
+ agentId,
68
+ agentType,
69
+ description,
70
+ status: "running",
71
+ startTime: Date.now(),
72
+ abortController
73
+ };
74
+ backgroundAgents.set(agentId, info);
75
+ backgroundAgentEvents.emitStatusChange(agentId, "running", info);
76
+ debugLogger.info("BACKGROUND_AGENT_REGISTERED", {
77
+ agentId,
78
+ agentType,
79
+ description
80
+ });
81
+ return info;
82
+ }
83
+ function setBackgroundAgentCompletionPromise(agentId, promise) {
84
+ const info = backgroundAgents.get(agentId);
85
+ if (!info) {
86
+ debugLogger.warn("BACKGROUND_AGENT_NOT_FOUND", {
87
+ agentId,
88
+ action: "setPromise"
89
+ });
90
+ return;
91
+ }
92
+ info.completionPromise = promise;
93
+ }
94
+ function completeBackgroundAgent(agentId, result) {
95
+ const info = backgroundAgents.get(agentId);
96
+ if (!info) {
97
+ debugLogger.warn("BACKGROUND_AGENT_NOT_FOUND", {
98
+ agentId,
99
+ action: "complete"
100
+ });
101
+ return;
102
+ }
103
+ info.status = "completed";
104
+ info.endTime = Date.now();
105
+ info.result = result;
106
+ delete info.abortController;
107
+ backgroundAgentEvents.emitStatusChange(agentId, "completed", info);
108
+ debugLogger.info("BACKGROUND_AGENT_COMPLETED", {
109
+ agentId,
110
+ duration: info.endTime - info.startTime
111
+ });
112
+ }
113
+ function failBackgroundAgent(agentId, error) {
114
+ const info = backgroundAgents.get(agentId);
115
+ if (!info) {
116
+ debugLogger.warn("BACKGROUND_AGENT_NOT_FOUND", { agentId, action: "fail" });
117
+ return;
118
+ }
119
+ info.status = "failed";
120
+ info.endTime = Date.now();
121
+ info.error = error;
122
+ delete info.abortController;
123
+ backgroundAgentEvents.emitStatusChange(agentId, "failed", info);
124
+ debugLogger.error("BACKGROUND_AGENT_FAILED", {
125
+ agentId,
126
+ error,
127
+ duration: info.endTime - info.startTime
128
+ });
129
+ }
130
+ function cancelBackgroundAgent(agentId) {
131
+ const info = backgroundAgents.get(agentId);
132
+ if (!info) {
133
+ debugLogger.warn("BACKGROUND_AGENT_NOT_FOUND", {
134
+ agentId,
135
+ action: "cancel"
136
+ });
137
+ return false;
138
+ }
139
+ if (info.status !== "running") {
140
+ debugLogger.warn("BACKGROUND_AGENT_NOT_RUNNING", {
141
+ agentId,
142
+ currentStatus: info.status
143
+ });
144
+ return false;
145
+ }
146
+ if (info.abortController) {
147
+ info.abortController.abort();
148
+ }
149
+ info.status = "cancelled";
150
+ info.endTime = Date.now();
151
+ delete info.abortController;
152
+ backgroundAgentEvents.emitStatusChange(agentId, "cancelled", info);
153
+ debugLogger.info("BACKGROUND_AGENT_CANCELLED", {
154
+ agentId,
155
+ duration: info.endTime - info.startTime
156
+ });
157
+ return true;
158
+ }
159
+ function getBackgroundAgent(agentId) {
160
+ return backgroundAgents.get(agentId) || null;
161
+ }
162
+ function getAllBackgroundAgents() {
163
+ return Array.from(backgroundAgents.values());
164
+ }
165
+ function getRunningBackgroundAgents() {
166
+ return Array.from(backgroundAgents.values()).filter(
167
+ (info) => info.status === "running"
168
+ );
169
+ }
170
+ function isAgentRunningInBackground(agentId) {
171
+ const info = backgroundAgents.get(agentId);
172
+ return info?.status === "running";
173
+ }
174
+ async function waitForBackgroundAgent(agentId, timeout = 3e4) {
175
+ return backgroundAgentEvents.waitForCompletion(agentId, timeout);
176
+ }
177
+ function cleanupBackgroundAgents(maxAge = 60 * 60 * 1e3) {
178
+ const cutoff = Date.now() - maxAge;
179
+ let cleaned = 0;
180
+ for (const [agentId, info] of backgroundAgents.entries()) {
181
+ if (info.status !== "running" && info.endTime && info.endTime < cutoff) {
182
+ backgroundAgents.delete(agentId);
183
+ cleaned++;
184
+ }
185
+ }
186
+ if (cleaned > 0) {
187
+ debugLogger.info("BACKGROUND_AGENTS_CLEANED", { cleaned, maxAge });
188
+ }
189
+ return cleaned;
190
+ }
191
+ function getBackgroundAgentsSummary() {
192
+ const agents = Array.from(backgroundAgents.values());
193
+ return {
194
+ running: agents.filter((a) => a.status === "running").length,
195
+ completed: agents.filter((a) => a.status === "completed").length,
196
+ failed: agents.filter((a) => a.status === "failed").length,
197
+ cancelled: agents.filter((a) => a.status === "cancelled").length,
198
+ agents: agents.map((a) => ({
199
+ agentId: a.agentId,
200
+ agentType: a.agentType,
201
+ description: a.description,
202
+ status: a.status,
203
+ duration: a.endTime ? a.endTime - a.startTime : Date.now() - a.startTime
204
+ }))
205
+ };
206
+ }
207
+ function clearBackgroundAgents() {
208
+ for (const info of backgroundAgents.values()) {
209
+ if (info.status === "running" && info.abortController) {
210
+ info.abortController.abort();
211
+ }
212
+ }
213
+ backgroundAgents.clear();
214
+ }
215
+ export {
216
+ backgroundAgentEvents,
217
+ cancelBackgroundAgent,
218
+ cleanupBackgroundAgents,
219
+ clearBackgroundAgents,
220
+ completeBackgroundAgent,
221
+ failBackgroundAgent,
222
+ getAllBackgroundAgents,
223
+ getBackgroundAgent,
224
+ getBackgroundAgentsSummary,
225
+ getRunningBackgroundAgents,
226
+ isAgentRunningInBackground,
227
+ registerBackgroundAgent,
228
+ setBackgroundAgentCompletionPromise,
229
+ waitForBackgroundAgent
230
+ };
231
+ //# sourceMappingURL=backgroundAgentManager.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/backgroundAgentManager.ts"],
4
+ "sourcesContent": ["/**\n * Background Agent Manager\n *\n * Manages agents running in the background, enabling:\n * - Launch agents asynchronously\n * - Track agent status and results\n * - Retrieve results when ready\n * - Cancel running agents\n *\n * This allows the main conversation to continue while agents work in parallel.\n */\n\nimport { TextBlock } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { EventEmitter } from 'events'\nimport { debug as debugLogger } from './debugLogger'\nimport {\n getAgentTranscript,\n updateAgentTranscript,\n type AgentTranscript,\n type AgentStatus,\n} from './agentTranscripts'\n\n/**\n * Event emitter for background agent status changes\n * Enables event-driven updates instead of polling\n */\nclass BackgroundAgentEventEmitter extends EventEmitter {\n private static instance: BackgroundAgentEventEmitter | null = null\n\n private constructor() {\n super()\n this.setMaxListeners(100)\n }\n\n static getInstance(): BackgroundAgentEventEmitter {\n if (!BackgroundAgentEventEmitter.instance) {\n BackgroundAgentEventEmitter.instance = new BackgroundAgentEventEmitter()\n }\n return BackgroundAgentEventEmitter.instance\n }\n\n /**\n * Emit status change event\n */\n emitStatusChange(\n agentId: string,\n status: BackgroundAgentStatus,\n info: BackgroundAgentInfo,\n ): void {\n this.emit('statusChange', { agentId, status, info })\n this.emit(`status:${agentId}`, { status, info })\n }\n\n /**\n * Subscribe to all status changes\n */\n onStatusChange(\n callback: (data: {\n agentId: string\n status: BackgroundAgentStatus\n info: BackgroundAgentInfo\n }) => void,\n ): () => void {\n this.on('statusChange', callback)\n return () => this.off('statusChange', callback)\n }\n\n /**\n * Subscribe to a specific agent's status changes\n */\n onAgentStatusChange(\n agentId: string,\n callback: (data: {\n status: BackgroundAgentStatus\n info: BackgroundAgentInfo\n }) => void,\n ): () => void {\n this.on(`status:${agentId}`, callback)\n return () => this.off(`status:${agentId}`, callback)\n }\n\n /**\n * Wait for an agent to complete (event-driven, not polling)\n */\n async waitForCompletion(\n agentId: string,\n timeout: number = 30000,\n ): Promise<BackgroundAgentInfo | null> {\n const info = backgroundAgents.get(agentId)\n if (!info) return null\n if (info.status !== 'running') return info\n\n return new Promise(resolve => {\n let timeoutId: NodeJS.Timeout | null = null\n let unsubscribe: (() => void) | null = null\n\n const cleanup = () => {\n if (timeoutId) clearTimeout(timeoutId)\n if (unsubscribe) unsubscribe()\n }\n\n unsubscribe = this.onAgentStatusChange(agentId, ({ status, info }) => {\n if (status !== 'running') {\n cleanup()\n resolve(info)\n }\n })\n\n timeoutId = setTimeout(() => {\n cleanup()\n resolve(backgroundAgents.get(agentId) || null)\n }, timeout)\n })\n }\n}\n\n/**\n * Global event emitter instance for background agents\n */\nexport const backgroundAgentEvents = BackgroundAgentEventEmitter.getInstance()\n\n/**\n * Background agent execution status\n */\nexport type BackgroundAgentStatus =\n | 'running'\n | 'completed'\n | 'failed'\n | 'cancelled'\n\n/**\n * Background agent info stored in memory\n */\nexport interface BackgroundAgentInfo {\n /** Unique agent ID */\n agentId: string\n\n /** Agent type */\n agentType: string\n\n /** Short description */\n description: string\n\n /** Current status */\n status: BackgroundAgentStatus\n\n /** When the agent was started */\n startTime: number\n\n /** When the agent finished (if done) */\n endTime?: number\n\n /** Result content (if completed) */\n result?: TextBlock[]\n\n /** Error message (if failed) */\n error?: string\n\n /** Abort controller for cancellation */\n abortController?: AbortController\n\n /** Promise that resolves when agent completes */\n completionPromise?: Promise<TextBlock[]>\n}\n\n// In-memory registry of background agents\nconst backgroundAgents = new Map<string, BackgroundAgentInfo>()\n\n/**\n * Register a new background agent\n */\nexport function registerBackgroundAgent(\n agentId: string,\n agentType: string,\n description: string,\n abortController: AbortController,\n): BackgroundAgentInfo {\n const info: BackgroundAgentInfo = {\n agentId,\n agentType,\n description,\n status: 'running',\n startTime: Date.now(),\n abortController,\n }\n\n backgroundAgents.set(agentId, info)\n\n // Emit status change event\n backgroundAgentEvents.emitStatusChange(agentId, 'running', info)\n\n debugLogger.info('BACKGROUND_AGENT_REGISTERED', {\n agentId,\n agentType,\n description,\n })\n\n return info\n}\n\n/**\n * Set the completion promise for a background agent\n * This allows waiting for the agent to complete\n */\nexport function setBackgroundAgentCompletionPromise(\n agentId: string,\n promise: Promise<TextBlock[]>,\n): void {\n const info = backgroundAgents.get(agentId)\n if (!info) {\n debugLogger.warn('BACKGROUND_AGENT_NOT_FOUND', {\n agentId,\n action: 'setPromise',\n })\n return\n }\n info.completionPromise = promise\n}\n\n/**\n * Mark a background agent as completed\n */\nexport function completeBackgroundAgent(\n agentId: string,\n result: TextBlock[],\n): void {\n const info = backgroundAgents.get(agentId)\n if (!info) {\n debugLogger.warn('BACKGROUND_AGENT_NOT_FOUND', {\n agentId,\n action: 'complete',\n })\n return\n }\n\n info.status = 'completed'\n info.endTime = Date.now()\n info.result = result\n delete info.abortController\n\n // Emit status change event\n backgroundAgentEvents.emitStatusChange(agentId, 'completed', info)\n\n debugLogger.info('BACKGROUND_AGENT_COMPLETED', {\n agentId,\n duration: info.endTime - info.startTime,\n })\n}\n\n/**\n * Mark a background agent as failed\n */\nexport function failBackgroundAgent(agentId: string, error: string): void {\n const info = backgroundAgents.get(agentId)\n if (!info) {\n debugLogger.warn('BACKGROUND_AGENT_NOT_FOUND', { agentId, action: 'fail' })\n return\n }\n\n info.status = 'failed'\n info.endTime = Date.now()\n info.error = error\n delete info.abortController\n\n // Emit status change event\n backgroundAgentEvents.emitStatusChange(agentId, 'failed', info)\n\n debugLogger.error('BACKGROUND_AGENT_FAILED', {\n agentId,\n error,\n duration: info.endTime - info.startTime,\n })\n}\n\n/**\n * Cancel a running background agent\n */\nexport function cancelBackgroundAgent(agentId: string): boolean {\n const info = backgroundAgents.get(agentId)\n if (!info) {\n debugLogger.warn('BACKGROUND_AGENT_NOT_FOUND', {\n agentId,\n action: 'cancel',\n })\n return false\n }\n\n if (info.status !== 'running') {\n debugLogger.warn('BACKGROUND_AGENT_NOT_RUNNING', {\n agentId,\n currentStatus: info.status,\n })\n return false\n }\n\n // Trigger abort\n if (info.abortController) {\n info.abortController.abort()\n }\n\n info.status = 'cancelled'\n info.endTime = Date.now()\n delete info.abortController\n\n // Emit status change event\n backgroundAgentEvents.emitStatusChange(agentId, 'cancelled', info)\n\n debugLogger.info('BACKGROUND_AGENT_CANCELLED', {\n agentId,\n duration: info.endTime - info.startTime,\n })\n\n return true\n}\n\n/**\n * Get background agent info\n */\nexport function getBackgroundAgent(\n agentId: string,\n): BackgroundAgentInfo | null {\n return backgroundAgents.get(agentId) || null\n}\n\n/**\n * Get all background agents\n */\nexport function getAllBackgroundAgents(): BackgroundAgentInfo[] {\n return Array.from(backgroundAgents.values())\n}\n\n/**\n * Get running background agents\n */\nexport function getRunningBackgroundAgents(): BackgroundAgentInfo[] {\n return Array.from(backgroundAgents.values()).filter(\n info => info.status === 'running',\n )\n}\n\n/**\n * Check if an agent is running in the background\n */\nexport function isAgentRunningInBackground(agentId: string): boolean {\n const info = backgroundAgents.get(agentId)\n return info?.status === 'running'\n}\n\n/**\n * Wait for a background agent to complete\n * Uses event-driven mechanism instead of polling for better performance\n * @param agentId Agent ID to wait for\n * @param timeout Maximum time to wait in milliseconds (default: 30 seconds)\n * @returns The agent info with result, or null if timeout/not found\n */\nexport async function waitForBackgroundAgent(\n agentId: string,\n timeout: number = 30000,\n): Promise<BackgroundAgentInfo | null> {\n // Use the event-driven wait mechanism\n return backgroundAgentEvents.waitForCompletion(agentId, timeout)\n}\n\n/**\n * Clean up completed background agents older than maxAge\n * @param maxAge Maximum age in milliseconds (default: 1 hour)\n */\nexport function cleanupBackgroundAgents(\n maxAge: number = 60 * 60 * 1000,\n): number {\n const cutoff = Date.now() - maxAge\n let cleaned = 0\n\n for (const [agentId, info] of backgroundAgents.entries()) {\n // Only clean up completed/failed/cancelled agents that are old\n if (info.status !== 'running' && info.endTime && info.endTime < cutoff) {\n backgroundAgents.delete(agentId)\n cleaned++\n }\n }\n\n if (cleaned > 0) {\n debugLogger.info('BACKGROUND_AGENTS_CLEANED', { cleaned, maxAge })\n }\n\n return cleaned\n}\n\n/**\n * Get summary of all background agents for display\n */\nexport function getBackgroundAgentsSummary(): {\n running: number\n completed: number\n failed: number\n cancelled: number\n agents: Array<{\n agentId: string\n agentType: string\n description: string\n status: BackgroundAgentStatus\n duration?: number\n }>\n} {\n const agents = Array.from(backgroundAgents.values())\n\n return {\n running: agents.filter(a => a.status === 'running').length,\n completed: agents.filter(a => a.status === 'completed').length,\n failed: agents.filter(a => a.status === 'failed').length,\n cancelled: agents.filter(a => a.status === 'cancelled').length,\n agents: agents.map(a => ({\n agentId: a.agentId,\n agentType: a.agentType,\n description: a.description,\n status: a.status,\n duration: a.endTime ? a.endTime - a.startTime : Date.now() - a.startTime,\n })),\n }\n}\n\n/**\n * Clear all background agents from memory\n * (Use with caution - mainly for testing)\n */\nexport function clearBackgroundAgents(): void {\n // Cancel any running agents first\n for (const info of backgroundAgents.values()) {\n if (info.status === 'running' && info.abortController) {\n info.abortController.abort()\n }\n }\n backgroundAgents.clear()\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["info"]
7
+ }