@within-7/minto 0.1.6 → 0.2.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 (487) 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 +52 -26
  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 +84 -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 +156 -0
  22. package/dist/commands/export.js.map +7 -0
  23. package/dist/commands/mcp-interactive.js +21 -12
  24. package/dist/commands/mcp-interactive.js.map +2 -2
  25. package/dist/commands/model.js +6 -5
  26. package/dist/commands/model.js.map +2 -2
  27. package/dist/commands/permissions.js +86 -0
  28. package/dist/commands/permissions.js.map +7 -0
  29. package/dist/commands/quit.js +3 -1
  30. package/dist/commands/quit.js.map +2 -2
  31. package/dist/commands/sandbox.js +104 -0
  32. package/dist/commands/sandbox.js.map +7 -0
  33. package/dist/commands/status.js +58 -0
  34. package/dist/commands/status.js.map +7 -0
  35. package/dist/commands/tasks.js +108 -0
  36. package/dist/commands/tasks.js.map +7 -0
  37. package/dist/commands/todos.js +123 -0
  38. package/dist/commands/todos.js.map +7 -0
  39. package/dist/commands.js +20 -2
  40. package/dist/commands.js.map +2 -2
  41. package/dist/components/AgentThinkingBlock.js +10 -18
  42. package/dist/components/AgentThinkingBlock.js.map +2 -2
  43. package/dist/components/BackgroundTasksPanel.js +78 -29
  44. package/dist/components/BackgroundTasksPanel.js.map +2 -2
  45. package/dist/components/BashStreamingProgress.js +24 -0
  46. package/dist/components/BashStreamingProgress.js.map +7 -0
  47. package/dist/components/CollapsibleHint.js +14 -0
  48. package/dist/components/CollapsibleHint.js.map +7 -0
  49. package/dist/components/FileEditToolUpdatedMessage.js +1 -1
  50. package/dist/components/FileEditToolUpdatedMessage.js.map +2 -2
  51. package/dist/components/HotkeyHelpPanel.js +137 -0
  52. package/dist/components/HotkeyHelpPanel.js.map +7 -0
  53. package/dist/components/Logo.js +5 -5
  54. package/dist/components/Logo.js.map +2 -2
  55. package/dist/components/Message.js +23 -7
  56. package/dist/components/Message.js.map +3 -3
  57. package/dist/components/ModelConfig.js +16 -3
  58. package/dist/components/ModelConfig.js.map +2 -2
  59. package/dist/components/ModelListManager.js +3 -3
  60. package/dist/components/ModelListManager.js.map +2 -2
  61. package/dist/components/ModelSelector/ModelSelector.js +1 -1
  62. package/dist/components/Onboarding.js +19 -14
  63. package/dist/components/Onboarding.js.map +2 -2
  64. package/dist/components/ProgressBar.js +74 -0
  65. package/dist/components/ProgressBar.js.map +7 -0
  66. package/dist/components/PromptInput.js +156 -46
  67. package/dist/components/PromptInput.js.map +2 -2
  68. package/dist/components/RequestStatusIndicator.js +194 -0
  69. package/dist/components/RequestStatusIndicator.js.map +7 -0
  70. package/dist/components/Spinner.js +92 -27
  71. package/dist/components/Spinner.js.map +2 -2
  72. package/dist/components/SpinnerSymbol.js +21 -27
  73. package/dist/components/SpinnerSymbol.js.map +2 -2
  74. package/dist/components/StreamingBashOutput.js +9 -8
  75. package/dist/components/StreamingBashOutput.js.map +2 -2
  76. package/dist/components/SubagentBlock.js +1 -1
  77. package/dist/components/SubagentBlock.js.map +1 -1
  78. package/dist/components/SubagentProgress.js +10 -11
  79. package/dist/components/SubagentProgress.js.map +2 -2
  80. package/dist/components/TaskCard.js +16 -13
  81. package/dist/components/TaskCard.js.map +2 -2
  82. package/dist/components/TodoChangeBlock.js +1 -1
  83. package/dist/components/TodoChangeBlock.js.map +2 -2
  84. package/dist/components/TodoPanel.js +120 -29
  85. package/dist/components/TodoPanel.js.map +3 -3
  86. package/dist/components/TokenCounter.js +74 -0
  87. package/dist/components/TokenCounter.js.map +7 -0
  88. package/dist/components/TokenWarning.js +2 -1
  89. package/dist/components/TokenWarning.js.map +2 -2
  90. package/dist/components/TreeConnector.js +25 -0
  91. package/dist/components/TreeConnector.js.map +7 -0
  92. package/dist/components/TurnCompletionIndicator.js +18 -0
  93. package/dist/components/TurnCompletionIndicator.js.map +7 -0
  94. package/dist/components/messages/AssistantTextMessage.js +5 -2
  95. package/dist/components/messages/AssistantTextMessage.js.map +2 -2
  96. package/dist/components/messages/AssistantThinkingMessage.js +18 -3
  97. package/dist/components/messages/AssistantThinkingMessage.js.map +2 -2
  98. package/dist/components/messages/AssistantToolUseMessage.js +11 -8
  99. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  100. package/dist/components/messages/GroupRenderer.js +53 -0
  101. package/dist/components/messages/GroupRenderer.js.map +7 -0
  102. package/dist/components/messages/NestedTasksPreview.js +12 -0
  103. package/dist/components/messages/NestedTasksPreview.js.map +7 -0
  104. package/dist/components/messages/ParallelTasksGroupView.js +92 -0
  105. package/dist/components/messages/ParallelTasksGroupView.js.map +7 -0
  106. package/dist/components/messages/TaskInModuleView.js +198 -0
  107. package/dist/components/messages/TaskInModuleView.js.map +7 -0
  108. package/dist/components/messages/TaskOutputContent.js +53 -0
  109. package/dist/components/messages/TaskOutputContent.js.map +7 -0
  110. package/dist/components/messages/UserPromptMessage.js +1 -1
  111. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  112. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +2 -3
  113. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
  114. package/dist/components/permissions/FallbackPermissionRequest.js +4 -4
  115. package/dist/components/permissions/FallbackPermissionRequest.js.map +2 -2
  116. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +4 -4
  117. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +2 -2
  118. package/dist/constants/colors.js +48 -0
  119. package/dist/constants/colors.js.map +2 -2
  120. package/dist/constants/formatRules.js +102 -0
  121. package/dist/constants/formatRules.js.map +7 -0
  122. package/dist/constants/prompts.js +12 -34
  123. package/dist/constants/prompts.js.map +2 -2
  124. package/dist/constants/symbols.js +64 -6
  125. package/dist/constants/symbols.js.map +2 -2
  126. package/dist/constants/timing.js +5 -0
  127. package/dist/constants/timing.js.map +2 -2
  128. package/dist/core/config/defaults.js +84 -0
  129. package/dist/core/config/defaults.js.map +7 -0
  130. package/dist/core/config/index.js +111 -0
  131. package/dist/core/config/index.js.map +7 -0
  132. package/dist/core/config/loader.js +221 -0
  133. package/dist/core/config/loader.js.map +7 -0
  134. package/dist/core/config/migrations.js +128 -0
  135. package/dist/core/config/migrations.js.map +7 -0
  136. package/dist/core/config/schema.js +178 -0
  137. package/dist/core/config/schema.js.map +7 -0
  138. package/dist/core/costTracker.js +138 -0
  139. package/dist/core/costTracker.js.map +7 -0
  140. package/dist/core/index.js +5 -0
  141. package/dist/core/index.js.map +7 -0
  142. package/dist/core/permissions/auditLog.js +204 -0
  143. package/dist/core/permissions/auditLog.js.map +7 -0
  144. package/dist/core/permissions/engine/index.js +3 -0
  145. package/dist/core/permissions/engine/index.js.map +7 -0
  146. package/dist/core/permissions/engine/permissionEngine.js +106 -0
  147. package/dist/core/permissions/engine/permissionEngine.js.map +7 -0
  148. package/dist/core/permissions/engine/types.js +1 -0
  149. package/dist/core/permissions/engine/types.js.map +7 -0
  150. package/dist/core/permissions/index.js +84 -0
  151. package/dist/core/permissions/index.js.map +7 -0
  152. package/dist/core/permissions/ruleEngine.js +259 -0
  153. package/dist/core/permissions/ruleEngine.js.map +7 -0
  154. package/dist/core/permissions/rules/allowedToolsRule.js +62 -0
  155. package/dist/core/permissions/rules/allowedToolsRule.js.map +7 -0
  156. package/dist/core/permissions/rules/autoEscalationRule.js +291 -0
  157. package/dist/core/permissions/rules/autoEscalationRule.js.map +7 -0
  158. package/dist/core/permissions/rules/index.js +46 -0
  159. package/dist/core/permissions/rules/index.js.map +7 -0
  160. package/dist/core/permissions/rules/planModeRule.js +55 -0
  161. package/dist/core/permissions/rules/planModeRule.js.map +7 -0
  162. package/dist/core/permissions/rules/projectBoundaryRule.js +168 -0
  163. package/dist/core/permissions/rules/projectBoundaryRule.js.map +7 -0
  164. package/dist/core/permissions/rules/safeModeRule.js +65 -0
  165. package/dist/core/permissions/rules/safeModeRule.js.map +7 -0
  166. package/dist/core/permissions/rules/sensitivePathsRule.js +340 -0
  167. package/dist/core/permissions/rules/sensitivePathsRule.js.map +7 -0
  168. package/dist/core/permissions/types.js +127 -0
  169. package/dist/core/permissions/types.js.map +7 -0
  170. package/dist/core/tools/executor.js +143 -0
  171. package/dist/core/tools/executor.js.map +7 -0
  172. package/dist/core/tools/index.js +15 -0
  173. package/dist/core/tools/index.js.map +7 -0
  174. package/dist/core/tools/registry.js +183 -0
  175. package/dist/core/tools/registry.js.map +7 -0
  176. package/dist/core/tools/types.js +1 -0
  177. package/dist/core/tools/types.js.map +7 -0
  178. package/dist/cost-tracker.js +23 -15
  179. package/dist/cost-tracker.js.map +2 -2
  180. package/dist/entrypoints/cli.js +43 -43
  181. package/dist/entrypoints/cli.js.map +2 -2
  182. package/dist/entrypoints/mcp.js +12 -4
  183. package/dist/entrypoints/mcp.js.map +2 -2
  184. package/dist/history.js +14 -3
  185. package/dist/history.js.map +2 -2
  186. package/dist/hooks/useAgentTranscripts.js +116 -0
  187. package/dist/hooks/useAgentTranscripts.js.map +7 -0
  188. package/dist/hooks/useAnimationSync.js +53 -0
  189. package/dist/hooks/useAnimationSync.js.map +7 -0
  190. package/dist/hooks/useArrowKeyHistory.js +4 -2
  191. package/dist/hooks/useArrowKeyHistory.js.map +2 -2
  192. package/dist/hooks/useCanUseTool.js +3 -1
  193. package/dist/hooks/useCanUseTool.js.map +2 -2
  194. package/dist/hooks/useCancelRequest.js +4 -1
  195. package/dist/hooks/useCancelRequest.js.map +2 -2
  196. package/dist/hooks/useExitOnCtrlCD.js +9 -5
  197. package/dist/hooks/useExitOnCtrlCD.js.map +2 -2
  198. package/dist/hooks/useHookStatus.js +40 -0
  199. package/dist/hooks/useHookStatus.js.map +7 -0
  200. package/dist/hooks/useLogMessages.js +17 -1
  201. package/dist/hooks/useLogMessages.js.map +2 -2
  202. package/dist/hooks/useMessageGroups.js +43 -0
  203. package/dist/hooks/useMessageGroups.js.map +7 -0
  204. package/dist/hooks/useTerminalSize.js +62 -6
  205. package/dist/hooks/useTerminalSize.js.map +2 -2
  206. package/dist/hooks/useUnifiedCompletion.js +69 -0
  207. package/dist/hooks/useUnifiedCompletion.js.map +2 -2
  208. package/dist/i18n/index.js +109 -0
  209. package/dist/i18n/index.js.map +7 -0
  210. package/dist/i18n/locales/en.js +347 -0
  211. package/dist/i18n/locales/en.js.map +7 -0
  212. package/dist/i18n/locales/index.js +7 -0
  213. package/dist/i18n/locales/index.js.map +7 -0
  214. package/dist/i18n/locales/zh-CN.js +347 -0
  215. package/dist/i18n/locales/zh-CN.js.map +7 -0
  216. package/dist/i18n/types.js +8 -0
  217. package/dist/i18n/types.js.map +7 -0
  218. package/dist/query.js +175 -17
  219. package/dist/query.js.map +3 -3
  220. package/dist/screens/REPL.js +501 -192
  221. package/dist/screens/REPL.js.map +3 -3
  222. package/dist/services/adapters/chatCompletions.js +3 -1
  223. package/dist/services/adapters/chatCompletions.js.map +2 -2
  224. package/dist/services/adapters/messageNormalizer.js +354 -0
  225. package/dist/services/adapters/messageNormalizer.js.map +7 -0
  226. package/dist/services/adapters/responsesAPI.js +6 -3
  227. package/dist/services/adapters/responsesAPI.js.map +2 -2
  228. package/dist/services/checkpointManager.js +386 -0
  229. package/dist/services/checkpointManager.js.map +7 -0
  230. package/dist/services/claude.js +138 -11
  231. package/dist/services/claude.js.map +3 -3
  232. package/dist/services/compressionService.js +50 -1
  233. package/dist/services/compressionService.js.map +2 -2
  234. package/dist/services/contextMonitor.js +162 -0
  235. package/dist/services/contextMonitor.js.map +7 -0
  236. package/dist/services/customCommands.js +60 -41
  237. package/dist/services/customCommands.js.map +2 -2
  238. package/dist/services/hookExecutor.js +173 -1
  239. package/dist/services/hookExecutor.js.map +2 -2
  240. package/dist/services/intelligentCompactor.js +281 -0
  241. package/dist/services/intelligentCompactor.js.map +7 -0
  242. package/dist/services/lspConfig.js +109 -0
  243. package/dist/services/lspConfig.js.map +7 -0
  244. package/dist/services/mcpClient.js +273 -34
  245. package/dist/services/mcpClient.js.map +2 -2
  246. package/dist/services/modelOrchestrator.js +310 -0
  247. package/dist/services/modelOrchestrator.js.map +7 -0
  248. package/dist/services/openai.js +8 -1
  249. package/dist/services/openai.js.map +2 -2
  250. package/dist/services/outputStyles.js +138 -0
  251. package/dist/services/outputStyles.js.map +7 -0
  252. package/dist/services/plugins/index.js +5 -0
  253. package/dist/services/plugins/index.js.map +7 -0
  254. package/dist/services/plugins/lspServers.js +188 -0
  255. package/dist/services/plugins/lspServers.js.map +7 -0
  256. package/dist/services/plugins/pluginRuntime.js +229 -0
  257. package/dist/services/plugins/pluginRuntime.js.map +7 -0
  258. package/dist/services/plugins/pluginValidation.js +219 -0
  259. package/dist/services/plugins/pluginValidation.js.map +7 -0
  260. package/dist/services/plugins/skillMarketplace.js +556 -0
  261. package/dist/services/plugins/skillMarketplace.js.map +7 -0
  262. package/dist/services/responseStateManager.js +37 -3
  263. package/dist/services/responseStateManager.js.map +2 -2
  264. package/dist/services/sandbox/filesystemBoundary.js +300 -0
  265. package/dist/services/sandbox/filesystemBoundary.js.map +7 -0
  266. package/dist/services/sandbox/index.js +14 -0
  267. package/dist/services/sandbox/index.js.map +7 -0
  268. package/dist/services/sandbox/networkProxy.js +293 -0
  269. package/dist/services/sandbox/networkProxy.js.map +7 -0
  270. package/dist/services/sandbox/sandboxController.js +574 -0
  271. package/dist/services/sandbox/sandboxController.js.map +7 -0
  272. package/dist/services/sandbox/types.js +50 -0
  273. package/dist/services/sandbox/types.js.map +7 -0
  274. package/dist/services/sessionMemory.js +266 -0
  275. package/dist/services/sessionMemory.js.map +7 -0
  276. package/dist/services/taskRouter.js +324 -0
  277. package/dist/services/taskRouter.js.map +7 -0
  278. package/dist/tools/ArchitectTool/ArchitectTool.js +10 -3
  279. package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
  280. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +3 -0
  281. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  282. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +8 -1
  283. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
  284. package/dist/tools/BaseTool.js +72 -0
  285. package/dist/tools/BaseTool.js.map +7 -0
  286. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +3 -0
  287. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +2 -2
  288. package/dist/tools/BashTool/BashTool.js +60 -3
  289. package/dist/tools/BashTool/BashTool.js.map +2 -2
  290. package/dist/tools/BashTool/BashToolResultMessage.js +3 -0
  291. package/dist/tools/BashTool/BashToolResultMessage.js.map +2 -2
  292. package/dist/tools/BashTool/OutputLine.js +54 -0
  293. package/dist/tools/BashTool/OutputLine.js.map +2 -2
  294. package/dist/tools/BashTool/prompt.js +192 -3
  295. package/dist/tools/BashTool/prompt.js.map +2 -2
  296. package/dist/tools/FileEditTool/FileEditTool.js +29 -4
  297. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  298. package/dist/tools/FileReadTool/FileReadTool.js +23 -4
  299. package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
  300. package/dist/tools/FileWriteTool/FileWriteTool.js +5 -5
  301. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  302. package/dist/tools/GlobTool/GlobTool.js +14 -3
  303. package/dist/tools/GlobTool/GlobTool.js.map +2 -2
  304. package/dist/tools/GrepTool/GrepTool.js +41 -7
  305. package/dist/tools/GrepTool/GrepTool.js.map +2 -2
  306. package/dist/tools/KillShellTool/KillShellToolResultMessage.js +3 -0
  307. package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +2 -2
  308. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +109 -0
  309. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +7 -0
  310. package/dist/tools/ListMcpResourcesTool/prompt.js +19 -0
  311. package/dist/tools/ListMcpResourcesTool/prompt.js.map +7 -0
  312. package/dist/tools/LspTool/LspTool.js +664 -0
  313. package/dist/tools/LspTool/LspTool.js.map +7 -0
  314. package/dist/tools/LspTool/prompt.js +27 -0
  315. package/dist/tools/LspTool/prompt.js.map +7 -0
  316. package/dist/tools/MCPTool/MCPTool.js +11 -4
  317. package/dist/tools/MCPTool/MCPTool.js.map +2 -2
  318. package/dist/tools/MemoryReadTool/MemoryReadTool.js +19 -6
  319. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
  320. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +6 -6
  321. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
  322. package/dist/tools/MultiEditTool/MultiEditTool.js +19 -2
  323. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  324. package/dist/tools/NotebookEditTool/NotebookEditTool.js +5 -1
  325. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  326. package/dist/tools/NotebookReadTool/NotebookReadTool.js +8 -4
  327. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
  328. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +74 -0
  329. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +7 -0
  330. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +108 -0
  331. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +7 -0
  332. package/dist/tools/PlanModeTool/prompt.js +94 -0
  333. package/dist/tools/PlanModeTool/prompt.js.map +7 -0
  334. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +130 -0
  335. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +7 -0
  336. package/dist/tools/ReadMcpResourceTool/prompt.js +17 -0
  337. package/dist/tools/ReadMcpResourceTool/prompt.js.map +7 -0
  338. package/dist/tools/SkillTool/SkillTool.js +14 -3
  339. package/dist/tools/SkillTool/SkillTool.js.map +2 -2
  340. package/dist/tools/SlashCommandTool/SlashCommandTool.js +260 -0
  341. package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +7 -0
  342. package/dist/tools/SlashCommandTool/prompt.js +35 -0
  343. package/dist/tools/SlashCommandTool/prompt.js.map +7 -0
  344. package/dist/tools/TaskOutputTool/TaskOutputTool.js +189 -0
  345. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +7 -0
  346. package/dist/tools/TaskOutputTool/prompt.js +15 -0
  347. package/dist/tools/TaskOutputTool/prompt.js.map +7 -0
  348. package/dist/tools/TaskTool/TaskTool.js +321 -146
  349. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  350. package/dist/tools/TaskTool/prompt.js.map +2 -2
  351. package/dist/tools/TodoWriteTool/TodoWriteTool.js +42 -73
  352. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
  353. package/dist/tools/URLFetcherTool/URLFetcherTool.js +7 -1
  354. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
  355. package/dist/tools/URLFetcherTool/cache.js +55 -8
  356. package/dist/tools/URLFetcherTool/cache.js.map +2 -2
  357. package/dist/tools/WebSearchTool/WebSearchTool.js +6 -1
  358. package/dist/tools/WebSearchTool/WebSearchTool.js.map +2 -2
  359. package/dist/tools.js +31 -2
  360. package/dist/tools.js.map +2 -2
  361. package/dist/types/hooks.js +4 -0
  362. package/dist/types/hooks.js.map +2 -2
  363. package/dist/types/marketplace.js.map +2 -2
  364. package/dist/types/messageGroup.js +36 -0
  365. package/dist/types/messageGroup.js.map +7 -0
  366. package/dist/types/plugin.js.map +2 -2
  367. package/dist/types/thinking.js +1 -0
  368. package/dist/types/thinking.js.map +7 -0
  369. package/dist/utils/BackgroundShellManager.js +136 -39
  370. package/dist/utils/BackgroundShellManager.js.map +2 -2
  371. package/dist/utils/MessageBatchBuffer.js +102 -0
  372. package/dist/utils/MessageBatchBuffer.js.map +7 -0
  373. package/dist/utils/PersistentShell.js +151 -1
  374. package/dist/utils/PersistentShell.js.map +2 -2
  375. package/dist/utils/agentLoader.js +1 -23
  376. package/dist/utils/agentLoader.js.map +2 -2
  377. package/dist/utils/agentTranscripts.js +641 -0
  378. package/dist/utils/agentTranscripts.js.map +7 -0
  379. package/dist/utils/animationManager.js +213 -0
  380. package/dist/utils/animationManager.js.map +7 -0
  381. package/dist/utils/animationSync.js +110 -0
  382. package/dist/utils/animationSync.js.map +7 -0
  383. package/dist/utils/asyncFile.js +215 -0
  384. package/dist/utils/asyncFile.js.map +7 -0
  385. package/dist/utils/backgroundAgentManager.js +231 -0
  386. package/dist/utils/backgroundAgentManager.js.map +7 -0
  387. package/dist/utils/config.js +63 -7
  388. package/dist/utils/config.js.map +2 -2
  389. package/dist/utils/conversationRecovery.js +19 -0
  390. package/dist/utils/conversationRecovery.js.map +2 -2
  391. package/dist/utils/exit.js +73 -0
  392. package/dist/utils/exit.js.map +7 -0
  393. package/dist/utils/format.js +73 -5
  394. package/dist/utils/format.js.map +2 -2
  395. package/dist/utils/generators.js +76 -6
  396. package/dist/utils/generators.js.map +2 -2
  397. package/dist/utils/globalErrorHandler.js +149 -0
  398. package/dist/utils/globalErrorHandler.js.map +7 -0
  399. package/dist/utils/groupHandlers/index.js +8 -0
  400. package/dist/utils/groupHandlers/index.js.map +7 -0
  401. package/dist/utils/groupHandlers/parallelTasksHandler.js +140 -0
  402. package/dist/utils/groupHandlers/parallelTasksHandler.js.map +7 -0
  403. package/dist/utils/groupHandlers/taskHandler.js +104 -0
  404. package/dist/utils/groupHandlers/taskHandler.js.map +7 -0
  405. package/dist/utils/groupHandlers/types.js +1 -0
  406. package/dist/utils/groupHandlers/types.js.map +7 -0
  407. package/dist/utils/logRotation.js +224 -0
  408. package/dist/utils/logRotation.js.map +7 -0
  409. package/dist/utils/marketplaceManager.js +3 -5
  410. package/dist/utils/marketplaceManager.js.map +2 -2
  411. package/dist/utils/memSafety.js +264 -0
  412. package/dist/utils/memSafety.js.map +7 -0
  413. package/dist/utils/messageGroupManager.js +274 -0
  414. package/dist/utils/messageGroupManager.js.map +7 -0
  415. package/dist/utils/messages.js +13 -4
  416. package/dist/utils/messages.js.map +2 -2
  417. package/dist/utils/model.js +119 -15
  418. package/dist/utils/model.js.map +3 -3
  419. package/dist/utils/permissions/filesystem.js +157 -5
  420. package/dist/utils/permissions/filesystem.js.map +2 -2
  421. package/dist/utils/plan/planMode.js +143 -0
  422. package/dist/utils/plan/planMode.js.map +7 -0
  423. package/dist/utils/pluginLoader.js +17 -21
  424. package/dist/utils/pluginLoader.js.map +2 -2
  425. package/dist/utils/ripgrep.js +55 -2
  426. package/dist/utils/ripgrep.js.map +2 -2
  427. package/dist/utils/sanitizeInput.js +32 -0
  428. package/dist/utils/sanitizeInput.js.map +7 -0
  429. package/dist/utils/secureKeyStorage.js +312 -0
  430. package/dist/utils/secureKeyStorage.js.map +7 -0
  431. package/dist/utils/session/sessionPlugins.js +67 -0
  432. package/dist/utils/session/sessionPlugins.js.map +7 -0
  433. package/dist/utils/taskDisplayUtils.js +257 -0
  434. package/dist/utils/taskDisplayUtils.js.map +7 -0
  435. package/dist/utils/teamConfig.js +2 -1
  436. package/dist/utils/teamConfig.js.map +2 -2
  437. package/dist/utils/todoStorage.js +92 -2
  438. package/dist/utils/todoStorage.js.map +2 -2
  439. package/dist/utils/toolTimeout.js +136 -0
  440. package/dist/utils/toolTimeout.js.map +7 -0
  441. package/dist/utils/tooling/safeRender.js +115 -0
  442. package/dist/utils/tooling/safeRender.js.map +7 -0
  443. package/dist/utils/userFriendlyError.js +346 -0
  444. package/dist/utils/userFriendlyError.js.map +7 -0
  445. package/dist/utils/vendor/ripgrep/arm64-darwin/rg +0 -0
  446. package/dist/version.js +2 -2
  447. package/dist/version.js.map +1 -1
  448. package/package.json +14 -4
  449. package/scripts/postinstall.js +128 -38
  450. package/dist/commands/agents.js +0 -2086
  451. package/dist/commands/agents.js.map +0 -7
  452. package/dist/commands/build.js +0 -74
  453. package/dist/commands/build.js.map +0 -7
  454. package/dist/commands/compression.js +0 -57
  455. package/dist/commands/compression.js.map +0 -7
  456. package/dist/commands/listen.js +0 -37
  457. package/dist/commands/listen.js.map +0 -7
  458. package/dist/commands/login.js +0 -37
  459. package/dist/commands/login.js.map +0 -7
  460. package/dist/commands/logout.js +0 -33
  461. package/dist/commands/logout.js.map +0 -7
  462. package/dist/commands/mcp.js +0 -40
  463. package/dist/commands/mcp.js.map +0 -7
  464. package/dist/commands/mcp_refresh.js +0 -40
  465. package/dist/commands/mcp_refresh.js.map +0 -7
  466. package/dist/commands/modelstatus.js +0 -21
  467. package/dist/commands/modelstatus.js.map +0 -7
  468. package/dist/commands/onboarding.js +0 -36
  469. package/dist/commands/onboarding.js.map +0 -7
  470. package/dist/commands/plugin-interactive.js +0 -446
  471. package/dist/commands/plugin-interactive.js.map +0 -7
  472. package/dist/commands/pr_comments.js +0 -61
  473. package/dist/commands/pr_comments.js.map +0 -7
  474. package/dist/commands/release-notes.js +0 -30
  475. package/dist/commands/release-notes.js.map +0 -7
  476. package/dist/commands/review.js +0 -51
  477. package/dist/commands/review.js.map +0 -7
  478. package/dist/components/Bug.js +0 -147
  479. package/dist/components/Bug.js.map +0 -7
  480. package/dist/components/ModelSelector.js +0 -2062
  481. package/dist/components/ModelSelector.js.map +0 -7
  482. package/dist/components/ModelStatusDisplay.js +0 -87
  483. package/dist/components/ModelStatusDisplay.js.map +0 -7
  484. package/dist/entrypoints/cli-wrapper.js +0 -61
  485. package/dist/entrypoints/cli-wrapper.js.map +0 -7
  486. package/dist/screens/Doctor.js +0 -22
  487. 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
+ }
@@ -32,6 +32,31 @@ function isAutoUpdaterStatus(value) {
32
32
  value
33
33
  );
34
34
  }
35
+ function getVerboseLabel(verbose) {
36
+ try {
37
+ const { t } = require("../i18n");
38
+ return verbose ? t("ui.verbose.on") : t("ui.verbose.off");
39
+ } catch {
40
+ return verbose ? "Verbose: On" : "Verbose: Off";
41
+ }
42
+ }
43
+ function getDisplayModeLabel(mode) {
44
+ return mode === "detailed" ? "Verbose: On" : "Verbose: Off";
45
+ }
46
+ const DISPLAY_MODE_LABELS = {
47
+ minimal: "Verbose: Off",
48
+ compact: "Verbose: Off",
49
+ detailed: "Verbose: On"
50
+ };
51
+ function getNextDisplayMode(current) {
52
+ return current === "detailed" ? "compact" : "detailed";
53
+ }
54
+ function displayModeToVerbose(mode) {
55
+ return mode === "detailed";
56
+ }
57
+ function verboseToDisplayMode(verbose) {
58
+ return verbose ? "detailed" : "compact";
59
+ }
35
60
  const DEFAULT_GLOBAL_CONFIG = {
36
61
  numStartups: 0,
37
62
  autoUpdaterStatus: "not_configured",
@@ -50,13 +75,16 @@ const DEFAULT_GLOBAL_CONFIG = {
50
75
  main: "",
51
76
  task: "",
52
77
  reasoning: "",
53
- quick: ""
78
+ quick: "",
79
+ compact: ""
54
80
  },
55
81
  lastDismissedUpdateVersion: void 0,
56
82
  compressionMode: "business",
57
83
  // Default to business consulting compression
58
- thinking: false
84
+ thinking: false,
59
85
  // Default to thinking mode off (Phase 4.2)
86
+ language: "en"
87
+ // Default to English
60
88
  };
61
89
  const GLOBAL_CONFIG_KEYS = [
62
90
  "autoUpdaterStatus",
@@ -70,7 +98,8 @@ const GLOBAL_CONFIG_KEYS = [
70
98
  "preferredNotifChannel",
71
99
  "shiftEnterKeyBindingInstalled",
72
100
  "maxTokens",
73
- "compressionMode"
101
+ "compressionMode",
102
+ "language"
74
103
  ];
75
104
  function isGlobalConfigKey(key) {
76
105
  return GLOBAL_CONFIG_KEYS.includes(key);
@@ -123,12 +152,31 @@ function saveGlobalConfig(config) {
123
152
  DEFAULT_GLOBAL_CONFIG
124
153
  );
125
154
  }
155
+ function migrateDisplayModeToVerbose(config) {
156
+ if (config.verbose !== void 0) {
157
+ return config;
158
+ }
159
+ const legacyConfig = config;
160
+ if (legacyConfig.displayMode !== void 0) {
161
+ const migratedConfig = {
162
+ ...config,
163
+ verbose: legacyConfig.displayMode === "detailed"
164
+ };
165
+ delete migratedConfig.displayMode;
166
+ return migratedConfig;
167
+ }
168
+ return {
169
+ ...config,
170
+ verbose: false
171
+ };
172
+ }
126
173
  function getGlobalConfig() {
127
174
  if (process.env.NODE_ENV === "test") {
128
175
  return TEST_GLOBAL_CONFIG_FOR_TESTING;
129
176
  }
130
177
  const config = getConfig(GLOBAL_CONFIG_FILE, DEFAULT_GLOBAL_CONFIG);
131
- return migrateModelProfilesRemoveId(config);
178
+ const migratedConfig = migrateModelProfilesRemoveId(config);
179
+ return migrateDisplayModeToVerbose(migratedConfig);
132
180
  }
133
181
  function getAnthropicApiKey() {
134
182
  return process.env.ANTHROPIC_API_KEY || null;
@@ -446,7 +494,8 @@ function migrateModelProfilesRemoveId(config) {
446
494
  main: "",
447
495
  task: "",
448
496
  reasoning: "",
449
- quick: ""
497
+ quick: "",
498
+ compact: ""
450
499
  };
451
500
  if (config.modelPointers) {
452
501
  Object.entries(config.modelPointers).forEach(([pointer, value]) => {
@@ -484,7 +533,8 @@ function setAllPointersToModel(modelName) {
484
533
  main: modelName,
485
534
  task: modelName,
486
535
  reasoning: modelName,
487
- quick: modelName
536
+ quick: modelName,
537
+ compact: modelName
488
538
  },
489
539
  defaultModelName: modelName
490
540
  };
@@ -630,6 +680,7 @@ function createGPT5ModelProfile(name, modelName, apiKey, baseURL, provider = "op
630
680
  }
631
681
  export {
632
682
  DEFAULT_GLOBAL_CONFIG,
683
+ DISPLAY_MODE_LABELS,
633
684
  GLOBAL_CONFIG_KEYS,
634
685
  PROJECT_CONFIG_KEYS,
635
686
  TEST_MCPRC_CONFIG_FOR_TESTING,
@@ -638,16 +689,20 @@ export {
638
689
  clearMcprcConfigForTesting,
639
690
  createGPT5ModelProfile,
640
691
  deleteConfigForCLI,
692
+ displayModeToVerbose,
641
693
  enableConfigs,
642
694
  getAnthropicApiKey,
643
695
  getConfigForCLI,
644
696
  getCurrentProjectConfig,
645
697
  getCustomApiKeyStatus,
698
+ getDisplayModeLabel,
646
699
  getGPT5ConfigRecommendations,
647
700
  getGlobalConfig,
648
701
  getMcprcConfig,
702
+ getNextDisplayMode,
649
703
  getOpenAIApiKey,
650
704
  getOrCreateUserID,
705
+ getVerboseLabel,
651
706
  isAutoUpdaterDisabled,
652
707
  isAutoUpdaterStatus,
653
708
  isGPT5ModelName,
@@ -662,6 +717,7 @@ export {
662
717
  setConfigForCLI,
663
718
  setModelPointer,
664
719
  validateAndRepairAllGPT5Profiles,
665
- validateAndRepairGPT5Profile
720
+ validateAndRepairGPT5Profile,
721
+ verboseToDisplayMode
666
722
  };
667
723
  //# sourceMappingURL=config.js.map