erosolar-cli 1.5.2 → 1.5.4

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 (346) hide show
  1. package/config/security-deployment.json +54 -0
  2. package/dist/bin/adapters/node/index.js +33 -0
  3. package/dist/bin/adapters/types.js +1 -0
  4. package/dist/bin/alpha-zero/agentWrapper.js +165 -0
  5. package/dist/bin/alpha-zero/codeEvaluator.js +272 -0
  6. package/dist/bin/alpha-zero/competitiveRunner.js +219 -0
  7. package/dist/bin/alpha-zero/index.js +98 -0
  8. package/dist/bin/alpha-zero/introspection.js +298 -0
  9. package/dist/bin/alpha-zero/metricsTracker.js +207 -0
  10. package/dist/bin/alpha-zero/security/core.js +269 -0
  11. package/dist/bin/alpha-zero/security/google.js +308 -0
  12. package/dist/bin/alpha-zero/security/googleLoader.js +40 -0
  13. package/dist/bin/alpha-zero/security/index.js +31 -0
  14. package/dist/bin/alpha-zero/security/simulation.js +274 -0
  15. package/dist/bin/alpha-zero/selfModification.js +231 -0
  16. package/dist/bin/alpha-zero/types.js +30 -0
  17. package/dist/bin/bin/erosolar-optimized.js +205 -0
  18. package/dist/bin/capabilities/agentSpawningCapability.js +116 -0
  19. package/dist/bin/capabilities/bashCapability.js +22 -0
  20. package/dist/bin/capabilities/cloudCapability.js +36 -0
  21. package/dist/bin/capabilities/codeAnalysisCapability.js +22 -0
  22. package/dist/bin/capabilities/codeQualityCapability.js +23 -0
  23. package/dist/bin/capabilities/dependencySecurityCapability.js +22 -0
  24. package/dist/bin/capabilities/devCapability.js +22 -0
  25. package/dist/bin/capabilities/editCapability.js +28 -0
  26. package/dist/bin/capabilities/emailCapability.js +20 -0
  27. package/dist/bin/capabilities/enhancedGitCapability.js +221 -0
  28. package/dist/bin/capabilities/filesystemCapability.js +22 -0
  29. package/dist/bin/capabilities/globCapability.js +28 -0
  30. package/dist/bin/capabilities/interactionCapability.js +20 -0
  31. package/dist/bin/capabilities/learnCapability.js +22 -0
  32. package/dist/bin/capabilities/mcpCapability.js +20 -0
  33. package/dist/bin/capabilities/notebookCapability.js +28 -0
  34. package/dist/bin/capabilities/planningCapability.js +27 -0
  35. package/dist/bin/capabilities/refactoringCapability.js +23 -0
  36. package/dist/bin/capabilities/repoChecksCapability.js +22 -0
  37. package/dist/bin/capabilities/searchCapability.js +22 -0
  38. package/dist/bin/capabilities/skillCapability.js +76 -0
  39. package/dist/bin/capabilities/taskManagementCapability.js +20 -0
  40. package/dist/bin/capabilities/testingCapability.js +23 -0
  41. package/dist/bin/capabilities/toolManifest.js +159 -0
  42. package/dist/bin/capabilities/toolRegistry.js +114 -0
  43. package/dist/bin/capabilities/webCapability.js +20 -0
  44. package/dist/bin/config.js +139 -0
  45. package/dist/bin/contracts/v1/agent.js +7 -0
  46. package/dist/bin/contracts/v1/agentProfileManifest.js +8 -0
  47. package/dist/bin/contracts/v1/agentRules.js +9 -0
  48. package/dist/bin/contracts/v1/toolAccess.js +8 -0
  49. package/dist/bin/core/agent.js +362 -0
  50. package/dist/bin/core/agentProfileManifest.js +187 -0
  51. package/dist/bin/core/agentProfiles.js +34 -0
  52. package/dist/bin/core/agentRulebook.js +135 -0
  53. package/dist/bin/core/agentSchemaLoader.js +233 -0
  54. package/dist/bin/core/contextManager.js +412 -0
  55. package/dist/bin/core/contextWindow.js +122 -0
  56. package/dist/bin/core/customCommands.js +80 -0
  57. package/dist/bin/core/errors/apiKeyErrors.js +114 -0
  58. package/dist/bin/core/errors/errorTypes.js +340 -0
  59. package/dist/bin/core/errors/safetyValidator.js +304 -0
  60. package/dist/bin/core/errors.js +32 -0
  61. package/dist/bin/core/modelDiscovery.js +755 -0
  62. package/dist/bin/core/preferences.js +224 -0
  63. package/dist/bin/core/schemaValidator.js +92 -0
  64. package/dist/bin/core/secretStore.js +199 -0
  65. package/dist/bin/core/sessionStore.js +187 -0
  66. package/dist/bin/core/toolRuntime.js +290 -0
  67. package/dist/bin/core/types.js +1 -0
  68. package/dist/bin/erosolar-optimized.d.ts +12 -0
  69. package/dist/bin/erosolar-optimized.d.ts.map +1 -0
  70. package/dist/bin/erosolar-optimized.js +239 -0
  71. package/dist/bin/erosolar-optimized.js.map +1 -0
  72. package/dist/bin/erosolar.js +14 -0
  73. package/dist/bin/erosolar.js.map +1 -1
  74. package/dist/bin/headless/headlessApp.js +172 -0
  75. package/dist/bin/mcp/config.js +202 -0
  76. package/dist/bin/mcp/stdioClient.js +172 -0
  77. package/dist/bin/mcp/toolBridge.js +104 -0
  78. package/dist/bin/mcp/types.js +1 -0
  79. package/dist/bin/plugins/index.js +113 -0
  80. package/dist/bin/plugins/providers/anthropic/index.js +25 -0
  81. package/dist/bin/plugins/providers/deepseek/index.js +24 -0
  82. package/dist/bin/plugins/providers/google/index.js +26 -0
  83. package/dist/bin/plugins/providers/index.js +19 -0
  84. package/dist/bin/plugins/providers/ollama/index.js +59 -0
  85. package/dist/bin/plugins/providers/openai/index.js +26 -0
  86. package/dist/bin/plugins/providers/xai/index.js +24 -0
  87. package/dist/bin/plugins/tools/agentSpawning/agentSpawningPlugin.js +8 -0
  88. package/dist/bin/plugins/tools/bash/localBashPlugin.js +13 -0
  89. package/dist/bin/plugins/tools/checks/localRepoChecksPlugin.js +13 -0
  90. package/dist/bin/plugins/tools/cloud/cloudPlugin.js +13 -0
  91. package/dist/bin/plugins/tools/codeAnalysis/codeAnalysisPlugin.js +13 -0
  92. package/dist/bin/plugins/tools/codeQuality/codeQualityPlugin.js +13 -0
  93. package/dist/bin/plugins/tools/dependency/dependencyPlugin.js +11 -0
  94. package/dist/bin/plugins/tools/development/devPlugin.js +13 -0
  95. package/dist/bin/plugins/tools/edit/editPlugin.js +14 -0
  96. package/dist/bin/plugins/tools/email/emailPlugin.js +11 -0
  97. package/dist/bin/plugins/tools/enhancedGit/enhancedGitPlugin.js +8 -0
  98. package/dist/bin/plugins/tools/filesystem/localFilesystemPlugin.js +13 -0
  99. package/dist/bin/plugins/tools/glob/globPlugin.js +14 -0
  100. package/dist/bin/plugins/tools/index.js +2 -0
  101. package/dist/bin/plugins/tools/interaction/interactionPlugin.js +11 -0
  102. package/dist/bin/plugins/tools/learn/learnPlugin.js +13 -0
  103. package/dist/bin/plugins/tools/mcp/mcpPlugin.js +8 -0
  104. package/dist/bin/plugins/tools/nodeDefaults.js +56 -0
  105. package/dist/bin/plugins/tools/notebook/notebookPlugin.js +14 -0
  106. package/dist/bin/plugins/tools/planning/planningPlugin.js +14 -0
  107. package/dist/bin/plugins/tools/refactoring/refactoringPlugin.js +11 -0
  108. package/dist/bin/plugins/tools/registry.js +57 -0
  109. package/dist/bin/plugins/tools/search/localSearchPlugin.js +13 -0
  110. package/dist/bin/plugins/tools/skills/skillPlugin.js +8 -0
  111. package/dist/bin/plugins/tools/taskManagement/taskManagementPlugin.js +11 -0
  112. package/dist/bin/plugins/tools/testing/testingPlugin.js +11 -0
  113. package/dist/bin/plugins/tools/web/webPlugin.js +11 -0
  114. package/dist/bin/providers/anthropicProvider.js +329 -0
  115. package/dist/bin/providers/googleProvider.js +203 -0
  116. package/dist/bin/providers/openaiChatCompletionsProvider.js +208 -0
  117. package/dist/bin/providers/openaiResponsesProvider.js +249 -0
  118. package/dist/bin/providers/providerFactory.js +24 -0
  119. package/dist/bin/runtime/agentController.js +321 -0
  120. package/dist/bin/runtime/agentHost.js +153 -0
  121. package/dist/bin/runtime/agentSession.js +195 -0
  122. package/dist/bin/runtime/node.js +10 -0
  123. package/dist/bin/runtime/universal.js +28 -0
  124. package/dist/bin/shell/bracketedPasteManager.js +350 -0
  125. package/dist/bin/shell/fileChangeTracker.js +65 -0
  126. package/dist/bin/shell/interactiveShell.js +2908 -0
  127. package/dist/bin/shell/liveStatus.js +78 -0
  128. package/dist/bin/shell/shellApp.js +290 -0
  129. package/dist/bin/shell/systemPrompt.js +60 -0
  130. package/dist/bin/shell/updateManager.js +108 -0
  131. package/dist/bin/skills/skillRepository.js +236 -0
  132. package/dist/bin/skills/types.js +1 -0
  133. package/dist/bin/subagents/taskRunner.js +269 -0
  134. package/dist/bin/tools/backgroundBashTools.js +211 -0
  135. package/dist/bin/tools/bashTools.js +159 -0
  136. package/dist/bin/tools/cloudTools.js +864 -0
  137. package/dist/bin/tools/codeAnalysisTools.js +641 -0
  138. package/dist/bin/tools/codeQualityTools.js +294 -0
  139. package/dist/bin/tools/dependencyTools.js +282 -0
  140. package/dist/bin/tools/devTools.js +238 -0
  141. package/dist/bin/tools/diffUtils.js +137 -0
  142. package/dist/bin/tools/editTools.js +134 -0
  143. package/dist/bin/tools/emailTools.js +448 -0
  144. package/dist/bin/tools/fileTools.js +282 -0
  145. package/dist/bin/tools/globTools.js +173 -0
  146. package/dist/bin/tools/grepTools.js +332 -0
  147. package/dist/bin/tools/interactionTools.js +170 -0
  148. package/dist/bin/tools/learnTools.js +1818 -0
  149. package/dist/bin/tools/notebookEditTools.js +196 -0
  150. package/dist/bin/tools/planningTools.js +46 -0
  151. package/dist/bin/tools/refactoringTools.js +293 -0
  152. package/dist/bin/tools/repoChecksTools.js +160 -0
  153. package/dist/bin/tools/searchTools.js +206 -0
  154. package/dist/bin/tools/skillTools.js +177 -0
  155. package/dist/bin/tools/taskManagementTools.js +156 -0
  156. package/dist/bin/tools/testingTools.js +232 -0
  157. package/dist/bin/tools/webTools.js +480 -0
  158. package/dist/bin/ui/ShellUIAdapter.js +459 -0
  159. package/dist/bin/ui/UnifiedUIController.js +183 -0
  160. package/dist/bin/ui/animation/AnimationScheduler.js +430 -0
  161. package/dist/bin/ui/codeHighlighter.js +854 -0
  162. package/dist/bin/ui/designSystem.js +121 -0
  163. package/dist/bin/ui/display.js +1222 -0
  164. package/dist/bin/ui/interrupts/InterruptManager.js +437 -0
  165. package/dist/bin/ui/layout.js +139 -0
  166. package/dist/bin/ui/orchestration/StatusOrchestrator.js +403 -0
  167. package/dist/bin/ui/outputMode.js +38 -0
  168. package/dist/bin/ui/persistentPrompt.js +183 -0
  169. package/dist/bin/ui/richText.js +338 -0
  170. package/dist/bin/ui/shortcutsHelp.js +87 -0
  171. package/dist/bin/ui/telemetry/UITelemetry.js +443 -0
  172. package/dist/bin/ui/textHighlighter.js +210 -0
  173. package/dist/bin/ui/theme.js +116 -0
  174. package/dist/bin/ui/toolDisplay.js +423 -0
  175. package/dist/bin/ui/toolDisplayAdapter.js +357 -0
  176. package/dist/bin/workspace.js +106 -0
  177. package/dist/bin/workspace.validator.js +213 -0
  178. package/dist/capabilities/cloudCapability.d.ts +13 -0
  179. package/dist/capabilities/cloudCapability.d.ts.map +1 -0
  180. package/dist/capabilities/cloudCapability.js +38 -0
  181. package/dist/capabilities/cloudCapability.js.map +1 -0
  182. package/dist/capabilities/index.d.ts +1 -0
  183. package/dist/capabilities/index.d.ts.map +1 -1
  184. package/dist/capabilities/index.js +1 -0
  185. package/dist/capabilities/index.js.map +1 -1
  186. package/dist/capabilities/offensiveSecurityCapability.d.ts +26 -0
  187. package/dist/capabilities/offensiveSecurityCapability.d.ts.map +1 -0
  188. package/dist/capabilities/offensiveSecurityCapability.js +58 -0
  189. package/dist/capabilities/offensiveSecurityCapability.js.map +1 -0
  190. package/dist/capabilities/realSecurityCapability.d.ts +26 -0
  191. package/dist/capabilities/realSecurityCapability.d.ts.map +1 -0
  192. package/dist/capabilities/realSecurityCapability.js +53 -0
  193. package/dist/capabilities/realSecurityCapability.js.map +1 -0
  194. package/dist/capabilities/securityCapability.d.ts +32 -0
  195. package/dist/capabilities/securityCapability.d.ts.map +1 -0
  196. package/dist/capabilities/securityCapability.js +57 -0
  197. package/dist/capabilities/securityCapability.js.map +1 -0
  198. package/dist/capabilities/ultimateSecurityCapability.d.ts +42 -0
  199. package/dist/capabilities/ultimateSecurityCapability.d.ts.map +1 -0
  200. package/dist/capabilities/ultimateSecurityCapability.js +96 -0
  201. package/dist/capabilities/ultimateSecurityCapability.js.map +1 -0
  202. package/dist/core/LazyLoader.d.ts +129 -0
  203. package/dist/core/LazyLoader.d.ts.map +1 -0
  204. package/dist/core/LazyLoader.js +240 -0
  205. package/dist/core/LazyLoader.js.map +1 -0
  206. package/dist/core/intelligenceTools.d.ts +19 -0
  207. package/dist/core/intelligenceTools.d.ts.map +1 -0
  208. package/dist/core/intelligenceTools.js +453 -0
  209. package/dist/core/intelligenceTools.js.map +1 -0
  210. package/dist/core/operationalTools.d.ts +19 -0
  211. package/dist/core/operationalTools.d.ts.map +1 -0
  212. package/dist/core/operationalTools.js +467 -0
  213. package/dist/core/operationalTools.js.map +1 -0
  214. package/dist/offensive/core/offensive-engine.d.ts +171 -0
  215. package/dist/offensive/core/offensive-engine.d.ts.map +1 -0
  216. package/dist/offensive/core/offensive-engine.js +345 -0
  217. package/dist/offensive/core/offensive-engine.js.map +1 -0
  218. package/dist/offensive/core/offensive-integration.d.ts +129 -0
  219. package/dist/offensive/core/offensive-integration.d.ts.map +1 -0
  220. package/dist/offensive/core/offensive-integration.js +364 -0
  221. package/dist/offensive/core/offensive-integration.js.map +1 -0
  222. package/dist/offensive/core/offensive-tools.d.ts +55 -0
  223. package/dist/offensive/core/offensive-tools.d.ts.map +1 -0
  224. package/dist/offensive/core/offensive-tools.js +438 -0
  225. package/dist/offensive/core/offensive-tools.js.map +1 -0
  226. package/dist/offensive/offensive-cli.d.ts +48 -0
  227. package/dist/offensive/offensive-cli.d.ts.map +1 -0
  228. package/dist/offensive/offensive-cli.js +233 -0
  229. package/dist/offensive/offensive-cli.js.map +1 -0
  230. package/dist/plugins/index.d.ts +1 -1
  231. package/dist/plugins/index.d.ts.map +1 -1
  232. package/dist/plugins/index.js +2 -0
  233. package/dist/plugins/index.js.map +1 -1
  234. package/dist/plugins/tools/cloud/cloudPlugin.d.ts +3 -0
  235. package/dist/plugins/tools/cloud/cloudPlugin.d.ts.map +1 -0
  236. package/dist/plugins/tools/cloud/cloudPlugin.js +14 -0
  237. package/dist/plugins/tools/cloud/cloudPlugin.js.map +1 -0
  238. package/dist/plugins/tools/nodeDefaults.d.ts.map +1 -1
  239. package/dist/plugins/tools/nodeDefaults.js +2 -0
  240. package/dist/plugins/tools/nodeDefaults.js.map +1 -1
  241. package/dist/security/advanced-persistence-research.d.ts +92 -0
  242. package/dist/security/advanced-persistence-research.d.ts.map +1 -0
  243. package/dist/security/advanced-persistence-research.js +195 -0
  244. package/dist/security/advanced-persistence-research.js.map +1 -0
  245. package/dist/security/apt-simulation-cli.d.ts +57 -0
  246. package/dist/security/apt-simulation-cli.d.ts.map +1 -0
  247. package/dist/security/apt-simulation-cli.js +278 -0
  248. package/dist/security/apt-simulation-cli.js.map +1 -0
  249. package/dist/security/apt-simulation-engine-complete.d.ts +97 -0
  250. package/dist/security/apt-simulation-engine-complete.d.ts.map +1 -0
  251. package/dist/security/apt-simulation-engine-complete.js +441 -0
  252. package/dist/security/apt-simulation-engine-complete.js.map +1 -0
  253. package/dist/security/apt-simulation-engine.d.ts +97 -0
  254. package/dist/security/apt-simulation-engine.d.ts.map +1 -0
  255. package/dist/security/apt-simulation-engine.js +441 -0
  256. package/dist/security/apt-simulation-engine.js.map +1 -0
  257. package/dist/security/assessment/vulnerabilityAssessment.d.ts +104 -0
  258. package/dist/security/assessment/vulnerabilityAssessment.d.ts.map +1 -0
  259. package/dist/security/assessment/vulnerabilityAssessment.js +315 -0
  260. package/dist/security/assessment/vulnerabilityAssessment.js.map +1 -0
  261. package/dist/security/authorization/securityAuthorization.d.ts +88 -0
  262. package/dist/security/authorization/securityAuthorization.d.ts.map +1 -0
  263. package/dist/security/authorization/securityAuthorization.js +172 -0
  264. package/dist/security/authorization/securityAuthorization.js.map +1 -0
  265. package/dist/security/authorization.d.ts +45 -0
  266. package/dist/security/authorization.d.ts.map +1 -0
  267. package/dist/security/authorization.js +128 -0
  268. package/dist/security/authorization.js.map +1 -0
  269. package/dist/security/comprehensive-security-research.d.ts +84 -0
  270. package/dist/security/comprehensive-security-research.d.ts.map +1 -0
  271. package/dist/security/comprehensive-security-research.js +211 -0
  272. package/dist/security/comprehensive-security-research.js.map +1 -0
  273. package/dist/security/offensive/exploitationEngine.d.ts +54 -0
  274. package/dist/security/offensive/exploitationEngine.d.ts.map +1 -0
  275. package/dist/security/offensive/exploitationEngine.js +263 -0
  276. package/dist/security/offensive/exploitationEngine.js.map +1 -0
  277. package/dist/security/persistence-analyzer.d.ts +56 -0
  278. package/dist/security/persistence-analyzer.d.ts.map +1 -0
  279. package/dist/security/persistence-analyzer.js +187 -0
  280. package/dist/security/persistence-analyzer.js.map +1 -0
  281. package/dist/security/persistence-cli.d.ts +36 -0
  282. package/dist/security/persistence-cli.d.ts.map +1 -0
  283. package/dist/security/persistence-cli.js +160 -0
  284. package/dist/security/persistence-cli.js.map +1 -0
  285. package/dist/security/persistence-research.d.ts +100 -0
  286. package/dist/security/persistence-research.d.ts.map +1 -0
  287. package/dist/security/persistence-research.js +372 -0
  288. package/dist/security/persistence-research.js.map +1 -0
  289. package/dist/security/real/networkExploitation.d.ts +92 -0
  290. package/dist/security/real/networkExploitation.d.ts.map +1 -0
  291. package/dist/security/real/networkExploitation.js +316 -0
  292. package/dist/security/real/networkExploitation.js.map +1 -0
  293. package/dist/security/real/persistenceImplementation.d.ts +62 -0
  294. package/dist/security/real/persistenceImplementation.d.ts.map +1 -0
  295. package/dist/security/real/persistenceImplementation.js +323 -0
  296. package/dist/security/real/persistenceImplementation.js.map +1 -0
  297. package/dist/security/real/vulnerabilityScanner.d.ts +73 -0
  298. package/dist/security/real/vulnerabilityScanner.d.ts.map +1 -0
  299. package/dist/security/real/vulnerabilityScanner.js +341 -0
  300. package/dist/security/real/vulnerabilityScanner.js.map +1 -0
  301. package/dist/security/research/persistenceResearch.d.ts +97 -0
  302. package/dist/security/research/persistenceResearch.d.ts.map +1 -0
  303. package/dist/security/research/persistenceResearch.js +282 -0
  304. package/dist/security/research/persistenceResearch.js.map +1 -0
  305. package/dist/security/security-testing-framework.d.ts +120 -0
  306. package/dist/security/security-testing-framework.d.ts.map +1 -0
  307. package/dist/security/security-testing-framework.js +372 -0
  308. package/dist/security/security-testing-framework.js.map +1 -0
  309. package/dist/security/simulation/attackSimulation.d.ts +93 -0
  310. package/dist/security/simulation/attackSimulation.d.ts.map +1 -0
  311. package/dist/security/simulation/attackSimulation.js +341 -0
  312. package/dist/security/simulation/attackSimulation.js.map +1 -0
  313. package/dist/shell/bracketedPasteManager.d.ts +76 -0
  314. package/dist/shell/bracketedPasteManager.d.ts.map +1 -1
  315. package/dist/shell/bracketedPasteManager.js +267 -9
  316. package/dist/shell/bracketedPasteManager.js.map +1 -1
  317. package/dist/shell/interactiveShell.d.ts +34 -1
  318. package/dist/shell/interactiveShell.d.ts.map +1 -1
  319. package/dist/shell/interactiveShell.js +304 -24
  320. package/dist/shell/interactiveShell.js.map +1 -1
  321. package/dist/shell/taskCompletionDetector.d.ts +101 -0
  322. package/dist/shell/taskCompletionDetector.d.ts.map +1 -0
  323. package/dist/shell/taskCompletionDetector.js +343 -0
  324. package/dist/shell/taskCompletionDetector.js.map +1 -0
  325. package/dist/tools/cloudTools.d.ts +57 -0
  326. package/dist/tools/cloudTools.d.ts.map +1 -0
  327. package/dist/tools/cloudTools.js +865 -0
  328. package/dist/tools/cloudTools.js.map +1 -0
  329. package/dist/tools/enhancedSecurityTools.d.ts +19 -0
  330. package/dist/tools/enhancedSecurityTools.d.ts.map +1 -0
  331. package/dist/tools/enhancedSecurityTools.js +215 -0
  332. package/dist/tools/enhancedSecurityTools.js.map +1 -0
  333. package/dist/tools/offensiveSecurityTools.d.ts +16 -0
  334. package/dist/tools/offensiveSecurityTools.d.ts.map +1 -0
  335. package/dist/tools/offensiveSecurityTools.js +285 -0
  336. package/dist/tools/offensiveSecurityTools.js.map +1 -0
  337. package/dist/tools/realSecurityTools.d.ts +18 -0
  338. package/dist/tools/realSecurityTools.d.ts.map +1 -0
  339. package/dist/tools/realSecurityTools.js +468 -0
  340. package/dist/tools/realSecurityTools.js.map +1 -0
  341. package/dist/tools/securityTools.d.ts +20 -0
  342. package/dist/tools/securityTools.d.ts.map +1 -0
  343. package/dist/tools/securityTools.js +449 -0
  344. package/dist/tools/securityTools.js.map +1 -0
  345. package/package.json +27 -12
  346. package/scripts/deploy-security-capabilities.js +178 -0
@@ -10,6 +10,7 @@ import { BracketedPasteManager } from './bracketedPasteManager.js';
10
10
  import { detectApiKeyError } from '../core/errors/apiKeyErrors.js';
11
11
  import { buildWorkspaceContext } from '../workspace.js';
12
12
  import { buildInteractiveSystemPrompt } from './systemPrompt.js';
13
+ import { getTaskCompletionDetector, resetTaskCompletionDetector, } from './taskCompletionDetector.js';
13
14
  import { discoverAllModels } from '../core/modelDiscovery.js';
14
15
  import { getModels, getSlashCommands, getProviders } from '../core/agentSchemaLoader.js';
15
16
  import { clearAutosaveSnapshot, deleteSession, listSessions, loadAutosaveSnapshot, loadSessionById, saveAutosaveSnapshot, saveSessionSnapshot, } from '../core/sessionStore.js';
@@ -80,6 +81,7 @@ export class InteractiveShell {
80
81
  cleanupInProgress = false;
81
82
  slashPreviewVisible = false;
82
83
  keypressHandler = null;
84
+ rawDataHandler = null;
83
85
  skillRepository;
84
86
  skillToolHandlers = new Map();
85
87
  thinkingMode = 'balanced';
@@ -92,6 +94,8 @@ export class InteractiveShell {
92
94
  persistentPrompt;
93
95
  alphaZeroMetrics; // Alpha Zero 2 performance tracking
94
96
  statusSubscription = null;
97
+ followUpQueue = [];
98
+ isDrainingQueue = false;
95
99
  activeContextWindowTokens = null;
96
100
  sessionPreferences;
97
101
  autosaveEnabled;
@@ -367,10 +371,30 @@ export class InteractiveShell {
367
371
  display.showInfo(`${this.agentMenuLabel(profileName)} will load the next time you start the CLI. Restart to switch now.`);
368
372
  }
369
373
  setupHandlers() {
374
+ // Set up raw data interception for bracketed paste
375
+ this.setupRawPasteHandler();
370
376
  this.rl.on('line', (line) => {
377
+ // If we're capturing raw paste data, ignore readline line events
378
+ // (they've already been handled by the raw data handler)
379
+ if (this.bracketedPaste.isCapturingRaw()) {
380
+ // Show paste progress
381
+ this.showMultiLinePastePreview(this.bracketedPaste.getRawBufferLineCount(), this.bracketedPaste.getRawBufferPreview());
382
+ return;
383
+ }
371
384
  const normalized = this.bracketedPaste.process(line);
372
385
  if (normalized.handled) {
386
+ // If still accumulating multi-line paste, show preview
387
+ if (normalized.isPending) {
388
+ this.showMultiLinePastePreview(normalized.lineCount || 0, normalized.preview);
389
+ return;
390
+ }
391
+ // Paste complete, submit the full content
373
392
  if (typeof normalized.result === 'string') {
393
+ this.clearMultiLinePastePreview();
394
+ // Show collapsed summary of what was submitted
395
+ if (normalized.lineCount && normalized.lineCount > 1) {
396
+ this.displayMultiLineSubmission(normalized.result, normalized.lineCount);
397
+ }
374
398
  this.enqueueUserInput(normalized.result, true);
375
399
  }
376
400
  return;
@@ -390,6 +414,11 @@ export class InteractiveShell {
390
414
  inputStream.off('keypress', this.keypressHandler);
391
415
  this.keypressHandler = null;
392
416
  }
417
+ // Remove raw data handler
418
+ if (inputStream && this.rawDataHandler) {
419
+ inputStream.off('data', this.rawDataHandler);
420
+ this.rawDataHandler = null;
421
+ }
393
422
  // Clear any pending cleanup to prevent hanging
394
423
  this.pendingCleanup = null;
395
424
  // Dispose persistent prompt
@@ -419,6 +448,42 @@ export class InteractiveShell {
419
448
  // Show initial persistent prompt
420
449
  this.persistentPrompt.show();
421
450
  }
451
+ /**
452
+ * Set up raw stdin data interception for bracketed paste mode.
453
+ * This intercepts data before readline processes it, allowing us to
454
+ * capture complete multi-line pastes without readline splitting them.
455
+ */
456
+ setupRawPasteHandler() {
457
+ if (!this.bracketedPasteEnabled) {
458
+ return;
459
+ }
460
+ const inputStream = input;
461
+ if (!inputStream || !inputStream.isTTY) {
462
+ return;
463
+ }
464
+ // Set up callback for when a complete paste is captured
465
+ this.bracketedPaste.setRawPasteCallback((content) => {
466
+ this.clearMultiLinePastePreview();
467
+ const lines = content.split('\n');
468
+ const lineCount = lines.length;
469
+ // Show collapsed summary for multi-line pastes
470
+ if (lineCount > 1) {
471
+ this.displayMultiLineSubmission(content, lineCount);
472
+ }
473
+ // Submit the pasted content
474
+ this.enqueueUserInput(content, true);
475
+ // Restore the prompt
476
+ this.persistentPrompt.updateInput('', 0);
477
+ this.rl.prompt();
478
+ });
479
+ // We need to intercept raw data, but we can't easily do this with
480
+ // readline already consuming stdin. Instead, we handle paste detection
481
+ // via the bracketed paste markers that appear in line events.
482
+ // The raw handler approach works better when we control the input stream.
483
+ //
484
+ // For now, we rely on the line-event-based approach with enhanced
485
+ // detection in the BracketedPasteManager.
486
+ }
422
487
  setupSlashCommandPreviewHandler() {
423
488
  const inputStream = input;
424
489
  if (!inputStream || typeof inputStream.on !== 'function' || !inputStream.isTTY) {
@@ -455,16 +520,24 @@ export class InteractiveShell {
455
520
  }
456
521
  setIdleStatus(detail) {
457
522
  this.statusTracker.setBase('Ready for prompts', {
458
- detail: detail ?? this.describeModelDetail(),
523
+ detail: this.describeStatusDetail(detail),
459
524
  tone: 'success',
460
525
  });
461
526
  }
462
527
  setProcessingStatus(detail) {
463
528
  this.statusTracker.setBase('Working on your request', {
464
- detail: detail ?? this.describeModelDetail(),
529
+ detail: this.describeStatusDetail(detail),
465
530
  tone: 'info',
466
531
  });
467
532
  }
533
+ describeStatusDetail(detail) {
534
+ const parts = [detail?.trim() || this.describeModelDetail()];
535
+ const queued = this.followUpQueue.length;
536
+ if (queued > 0) {
537
+ parts.push(`${queued} follow-up${queued === 1 ? '' : 's'} queued`);
538
+ }
539
+ return parts.join(' • ');
540
+ }
468
541
  describeModelDetail() {
469
542
  const provider = this.providerLabel(this.sessionState.provider);
470
543
  return `${provider} Ā· ${this.sessionState.model}`;
@@ -592,6 +665,42 @@ export class InteractiveShell {
592
665
  void this.flushBufferedInput();
593
666
  }, MULTILINE_INPUT_FLUSH_DELAY_MS);
594
667
  }
668
+ /**
669
+ * Show a preview indicator while accumulating multi-line paste
670
+ */
671
+ showMultiLinePastePreview(lineCount, preview) {
672
+ // Clear the current line and show paste accumulation status
673
+ readline.clearLine(output, 0);
674
+ readline.cursorTo(output, 0);
675
+ const statusText = preview
676
+ ? `${theme.ui.muted('šŸ“‹ Pasting:')} ${theme.ui.muted(preview.slice(0, 50))}${preview.length > 50 ? '...' : ''}`
677
+ : `${theme.ui.muted(`šŸ“‹ Pasting ${lineCount} line${lineCount !== 1 ? 's' : ''}...`)}`;
678
+ output.write(statusText);
679
+ }
680
+ /**
681
+ * Clear the multi-line paste preview
682
+ */
683
+ clearMultiLinePastePreview() {
684
+ readline.clearLine(output, 0);
685
+ readline.cursorTo(output, 0);
686
+ }
687
+ /**
688
+ * Display a collapsed summary of multi-line content that was submitted
689
+ */
690
+ displayMultiLineSubmission(content, lineCount) {
691
+ const lines = content.split('\n');
692
+ const firstLine = (lines[0] || '').trim();
693
+ const maxPreviewLen = Math.min(60, (output.columns || 80) - 20);
694
+ const truncatedFirst = firstLine.length > maxPreviewLen
695
+ ? firstLine.slice(0, maxPreviewLen - 3) + '...'
696
+ : firstLine;
697
+ // Show collapsed block indicator
698
+ const collapsedDisplay = theme.ui.muted(`šŸ“‹ ${truncatedFirst} [${lineCount} lines]`);
699
+ // Clear line and show the collapsed preview, then newline for response
700
+ readline.clearLine(output, 0);
701
+ readline.cursorTo(output, 0);
702
+ console.log(`${formatUserPrompt(this.profileLabel || this.profile)}${collapsedDisplay}`);
703
+ }
595
704
  async flushBufferedInput() {
596
705
  if (!this.bufferedInputLines.length) {
597
706
  this.bufferedInputTimer = null;
@@ -610,6 +719,85 @@ export class InteractiveShell {
610
719
  this.rl.prompt();
611
720
  }
612
721
  }
722
+ refreshQueueIndicators() {
723
+ const queued = this.followUpQueue.length;
724
+ // Build status message based on processing state and queue
725
+ let message;
726
+ if (this.isProcessing) {
727
+ const queueSuffix = queued > 0 ? ` (${queued} queued)` : ' (type to queue follow-up)';
728
+ message = `ā³ Processing...${queueSuffix}`;
729
+ }
730
+ else if (queued > 0) {
731
+ message = `${queued} follow-up${queued === 1 ? '' : 's'} queued`;
732
+ }
733
+ this.persistentPrompt.updateStatusBar({ message });
734
+ if (this.isProcessing) {
735
+ this.setProcessingStatus();
736
+ }
737
+ else {
738
+ this.setIdleStatus();
739
+ }
740
+ }
741
+ enqueueFollowUpAction(action) {
742
+ this.followUpQueue.push(action);
743
+ const normalized = action.text.replace(/\s+/g, ' ').trim();
744
+ const previewLimit = 80;
745
+ const preview = normalized.length > previewLimit ? `${normalized.slice(0, previewLimit - 3)}...` : normalized;
746
+ const position = this.followUpQueue.length === 1 ? 'to run next' : `#${this.followUpQueue.length} in queue`;
747
+ const label = action.type === 'continuous' ? 'continuous command' : 'follow-up';
748
+ const queueCount = this.followUpQueue.length;
749
+ // Show immediate acknowledgment with checkmark
750
+ const queueLabel = queueCount === 1 ? '1 queued' : `${queueCount} queued`;
751
+ if (preview) {
752
+ display.showInfo(`āœ“ ${theme.info(label)} ${position}: ${theme.ui.muted(preview)}`);
753
+ }
754
+ else {
755
+ display.showInfo(`āœ“ ${theme.info(label)} queued ${position}.`);
756
+ }
757
+ // Update status bar to show queue count
758
+ this.persistentPrompt.updateStatusBar({
759
+ message: `ā³ Processing... (${queueLabel})`
760
+ });
761
+ this.refreshQueueIndicators();
762
+ this.scheduleQueueProcessing();
763
+ // Re-show the prompt so user can continue typing more follow-ups
764
+ this.rl.prompt();
765
+ }
766
+ scheduleQueueProcessing() {
767
+ if (!this.followUpQueue.length) {
768
+ this.refreshQueueIndicators();
769
+ return;
770
+ }
771
+ queueMicrotask(() => {
772
+ void this.processQueuedActions();
773
+ });
774
+ }
775
+ async processQueuedActions() {
776
+ if (this.isDrainingQueue || this.isProcessing || !this.followUpQueue.length) {
777
+ return;
778
+ }
779
+ this.isDrainingQueue = true;
780
+ try {
781
+ while (!this.isProcessing && this.followUpQueue.length) {
782
+ const next = this.followUpQueue.shift();
783
+ const remaining = this.followUpQueue.length;
784
+ const label = next.type === 'continuous' ? 'continuous command' : 'follow-up';
785
+ const suffix = remaining ? ` (${remaining} left after this)` : '';
786
+ display.showSystemMessage(`ā–¶ Running queued ${label}${suffix}.`);
787
+ this.refreshQueueIndicators();
788
+ if (next.type === 'continuous') {
789
+ await this.processContinuousRequest(next.text);
790
+ }
791
+ else {
792
+ await this.processRequest(next.text);
793
+ }
794
+ }
795
+ }
796
+ finally {
797
+ this.isDrainingQueue = false;
798
+ this.refreshQueueIndicators();
799
+ }
800
+ }
613
801
  async processInputBlock(line, _wasRapidMultiLine = false) {
614
802
  this.slashPreviewVisible = false;
615
803
  this.uiAdapter.hideSlashCommandPreview();
@@ -1727,7 +1915,7 @@ export class InteractiveShell {
1727
1915
  }
1728
1916
  async processRequest(request) {
1729
1917
  if (this.isProcessing) {
1730
- display.showWarning('Please wait for the current request to complete.');
1918
+ this.enqueueFollowUpAction({ type: 'request', text: request });
1731
1919
  return;
1732
1920
  }
1733
1921
  if (!this.agent && !this.rebuildAgent()) {
@@ -1740,8 +1928,9 @@ export class InteractiveShell {
1740
1928
  }
1741
1929
  this.isProcessing = true;
1742
1930
  const requestStartTime = Date.now(); // Alpha Zero 2 timing
1743
- // Hide persistent prompt during processing to avoid UI conflicts
1744
- this.persistentPrompt.hide();
1931
+ // Keep persistent prompt visible during processing so users can type follow-up requests
1932
+ // The prompt will show a "processing" indicator but remain interactive
1933
+ this.persistentPrompt.updateStatusBar({ message: 'ā³ Processing... (type to queue follow-up)' });
1745
1934
  this.uiAdapter.startProcessing('Working on your request');
1746
1935
  this.setProcessingStatus();
1747
1936
  try {
@@ -1769,30 +1958,32 @@ export class InteractiveShell {
1769
1958
  this.uiAdapter.endProcessing('Ready for prompts');
1770
1959
  this.setIdleStatus();
1771
1960
  display.newLine();
1772
- // Ensure persistent prompt is visible after processing
1961
+ // Clear the processing status and ensure persistent prompt is visible
1962
+ this.persistentPrompt.updateStatusBar({ message: undefined });
1773
1963
  this.persistentPrompt.show();
1774
1964
  // CRITICAL: Ensure readline prompt is active for user input
1775
1965
  // This is a safety net in case the caller doesn't call rl.prompt()
1776
1966
  this.rl.prompt();
1967
+ this.scheduleQueueProcessing();
1968
+ this.refreshQueueIndicators();
1777
1969
  }
1778
1970
  }
1779
1971
  /**
1780
1972
  * Process a continuous/infinite loop request.
1781
1973
  * Runs the agent in a loop until:
1782
- * 1. The agent indicates completion (no more actions needed)
1974
+ * 1. The agent indicates completion (verified by AI confirmation)
1783
1975
  * 2. User interrupts (Ctrl+C)
1784
1976
  * 3. Maximum iterations reached (safety limit)
1785
1977
  *
1978
+ * Uses intelligent task completion detection with AI verification
1979
+ * to ensure tasks are truly complete before stopping.
1980
+ *
1786
1981
  * Context is automatically managed - overflow errors trigger auto-recovery.
1787
1982
  */
1788
1983
  async processContinuousRequest(initialRequest) {
1789
1984
  const MAX_ITERATIONS = 100; // Safety limit to prevent truly infinite loops
1790
- const COMPLETION_PATTERNS = [
1791
- /\b(completed?|done|finished|all.*done|task.*complete|nothing.*left|no.*more.*tasks?)\b/i,
1792
- /\b(everything.*done|all.*tasks?.*complete|successfully.*completed?)\b/i,
1793
- ];
1794
1985
  if (this.isProcessing) {
1795
- display.showWarning('Please wait for the current request to complete.');
1986
+ this.enqueueFollowUpAction({ type: 'continuous', text: initialRequest });
1796
1987
  return;
1797
1988
  }
1798
1989
  if (!this.agent && !this.rebuildAgent()) {
@@ -1805,15 +1996,22 @@ export class InteractiveShell {
1805
1996
  }
1806
1997
  this.isProcessing = true;
1807
1998
  const overallStartTime = Date.now();
1808
- // Hide persistent prompt during processing
1809
- this.persistentPrompt.hide();
1999
+ // Initialize the task completion detector
2000
+ const completionDetector = getTaskCompletionDetector();
2001
+ completionDetector.reset();
2002
+ // Keep persistent prompt visible during processing so users can type follow-up requests
2003
+ this.persistentPrompt.updateStatusBar({ message: 'šŸ”„ Continuous mode... (type to queue follow-up)' });
1810
2004
  display.showSystemMessage(`šŸ”„ Starting continuous execution mode. Press Ctrl+C to stop.`);
2005
+ display.showSystemMessage(`šŸ“Š Using intelligent task completion detection with AI verification.`);
1811
2006
  this.uiAdapter.startProcessing('Continuous execution mode');
1812
2007
  this.setProcessingStatus();
1813
2008
  let iteration = 0;
1814
2009
  let lastResponse = '';
1815
2010
  let consecutiveNoProgress = 0;
1816
- const MAX_NO_PROGRESS = 3;
2011
+ const MAX_NO_PROGRESS = 5; // Increased to allow more attempts before giving up
2012
+ let pendingVerification = false;
2013
+ let verificationAttempts = 0;
2014
+ const MAX_VERIFICATION_ATTEMPTS = 2;
1817
2015
  try {
1818
2016
  // Enhance initial prompt with git context for self-improvement tasks
1819
2017
  let currentPrompt = initialRequest;
@@ -1826,7 +2024,8 @@ IMPORTANT: You have full git access. After making improvements:
1826
2024
  3. Use bash to run: git commit -m "descriptive message" (commit)
1827
2025
  4. Use bash to run: git push (when milestone reached)
1828
2026
 
1829
- Commit frequently with descriptive messages. Push when ready.`;
2027
+ Commit frequently with descriptive messages. Push when ready.
2028
+ When truly finished with ALL tasks, explicitly state "TASK_FULLY_COMPLETE".`;
1830
2029
  }
1831
2030
  while (iteration < MAX_ITERATIONS) {
1832
2031
  iteration++;
@@ -1842,18 +2041,67 @@ Commit frequently with descriptive messages. Push when ready.`;
1842
2041
  const elapsedMs = Date.now() - overallStartTime;
1843
2042
  this.alphaZeroMetrics.recordMessage(elapsedMs);
1844
2043
  display.stopThinking(false);
1845
- // Check if the response indicates completion
1846
- const isComplete = COMPLETION_PATTERNS.some(pattern => pattern.test(response));
1847
- const responseChanged = response !== lastResponse;
1848
- if (isComplete && responseChanged) {
1849
- display.showSystemMessage(`\nāœ… Task completed after ${iteration} iteration(s).`);
2044
+ // Extract tools used from the response (look for tool call patterns)
2045
+ const toolsUsed = this.extractToolsFromResponse(response);
2046
+ completionDetector.recordToolCall.bind(completionDetector);
2047
+ toolsUsed.forEach(tool => completionDetector.recordToolCall(tool, true, true));
2048
+ // Use intelligent completion detection
2049
+ const completionAnalysis = completionDetector.analyzeCompletion(response, toolsUsed);
2050
+ display.showSystemMessage(`šŸ“ˆ Completion confidence: ${(completionAnalysis.confidence * 100).toFixed(0)}%`);
2051
+ // Check for explicit TASK_FULLY_COMPLETE marker (highest priority)
2052
+ if (response.includes('TASK_FULLY_COMPLETE')) {
2053
+ display.showSystemMessage(`\nāœ… Task explicitly marked complete after ${iteration} iteration(s).`);
1850
2054
  break;
1851
2055
  }
2056
+ // High confidence completion without verification needed
2057
+ if (completionAnalysis.isComplete && completionAnalysis.confidence >= 0.85) {
2058
+ display.showSystemMessage(`\nāœ… Task completed with high confidence after ${iteration} iteration(s).`);
2059
+ display.showSystemMessage(` Reason: ${completionAnalysis.reason}`);
2060
+ break;
2061
+ }
2062
+ // Medium confidence - run verification round
2063
+ if (completionAnalysis.shouldVerify && completionAnalysis.verificationPrompt && !pendingVerification) {
2064
+ if (verificationAttempts < MAX_VERIFICATION_ATTEMPTS) {
2065
+ display.showSystemMessage(`\nšŸ” Running verification round (confidence: ${(completionAnalysis.confidence * 100).toFixed(0)}%)...`);
2066
+ pendingVerification = true;
2067
+ verificationAttempts++;
2068
+ currentPrompt = completionAnalysis.verificationPrompt;
2069
+ await new Promise(resolve => setTimeout(resolve, 500));
2070
+ continue;
2071
+ }
2072
+ }
2073
+ // If we were in verification mode, check the result
2074
+ if (pendingVerification) {
2075
+ pendingVerification = false;
2076
+ if (completionDetector.isVerificationConfirmed(response)) {
2077
+ display.showSystemMessage(`\nāœ… Task completion verified by AI after ${iteration} iteration(s).`);
2078
+ break;
2079
+ }
2080
+ else {
2081
+ display.showSystemMessage(`šŸ”„ Verification indicates more work needed. Continuing...`);
2082
+ }
2083
+ }
1852
2084
  // Check for no progress (same response multiple times)
2085
+ const responseChanged = response !== lastResponse;
1853
2086
  if (!responseChanged) {
1854
2087
  consecutiveNoProgress++;
1855
2088
  if (consecutiveNoProgress >= MAX_NO_PROGRESS) {
1856
- display.showSystemMessage(`\nāš ļø No progress detected for ${MAX_NO_PROGRESS} iterations. Stopping.`);
2089
+ // Before giving up, ask one final verification
2090
+ if (verificationAttempts < MAX_VERIFICATION_ATTEMPTS) {
2091
+ display.showSystemMessage(`\nāš ļø No progress for ${MAX_NO_PROGRESS} iterations. Running final verification...`);
2092
+ currentPrompt = `I notice you may be stuck or finished. Please confirm:
2093
+
2094
+ 1. Is the original task FULLY complete?
2095
+ 2. If yes, respond with exactly: "TASK_FULLY_COMPLETE"
2096
+ 3. If no, what specific action should be taken next?
2097
+
2098
+ Be explicit about the current state.`;
2099
+ verificationAttempts++;
2100
+ consecutiveNoProgress = 0;
2101
+ await new Promise(resolve => setTimeout(resolve, 500));
2102
+ continue;
2103
+ }
2104
+ display.showSystemMessage(`\nāš ļø No progress detected for ${MAX_NO_PROGRESS} iterations and verification exhausted. Stopping.`);
1857
2105
  break;
1858
2106
  }
1859
2107
  }
@@ -1861,12 +2109,15 @@ Commit frequently with descriptive messages. Push when ready.`;
1861
2109
  consecutiveNoProgress = 0;
1862
2110
  }
1863
2111
  lastResponse = response;
1864
- // Prepare next iteration prompt - explicitly encourage git usage
2112
+ // Prepare next iteration prompt - explicitly encourage progress reporting
1865
2113
  currentPrompt = `Continue with the next step. Remember:
1866
2114
  - Use bash to run git commands (git status, git add, git commit, git push)
1867
2115
  - Commit your changes with descriptive messages after completing improvements
1868
2116
  - Push changes when a logical milestone is reached
1869
- If all tasks are complete, say "done".`;
2117
+ - If all tasks are complete, respond with exactly: "TASK_FULLY_COMPLETE"
2118
+ - If there are errors or blockers, explain what's preventing progress
2119
+
2120
+ What's the next action?`;
1870
2121
  // Small delay between iterations to prevent rate limiting
1871
2122
  await new Promise(resolve => setTimeout(resolve, 500));
1872
2123
  }
@@ -1897,15 +2148,44 @@ If all tasks are complete, say "done".`;
1897
2148
  const minutes = Math.floor(totalElapsed / 60000);
1898
2149
  const seconds = Math.floor((totalElapsed % 60000) / 1000);
1899
2150
  display.showSystemMessage(`\nšŸ Continuous execution completed: ${iteration} iterations, ${minutes}m ${seconds}s total`);
2151
+ // Reset completion detector for next task
2152
+ resetTaskCompletionDetector();
1900
2153
  this.isProcessing = false;
1901
2154
  this.uiAdapter.endProcessing('Ready for prompts');
1902
2155
  this.setIdleStatus();
1903
2156
  display.newLine();
2157
+ // Clear the processing status and ensure persistent prompt is visible
2158
+ this.persistentPrompt.updateStatusBar({ message: undefined });
1904
2159
  this.persistentPrompt.show();
1905
2160
  // CRITICAL: Ensure readline prompt is active for user input
1906
2161
  // This is a safety net in case the caller doesn't call rl.prompt()
1907
2162
  this.rl.prompt();
2163
+ this.scheduleQueueProcessing();
2164
+ this.refreshQueueIndicators();
2165
+ }
2166
+ }
2167
+ /**
2168
+ * Extract tool names from a response by looking for tool call patterns
2169
+ */
2170
+ extractToolsFromResponse(response) {
2171
+ const tools = [];
2172
+ // Look for common tool call patterns in the response
2173
+ const toolPatterns = [
2174
+ /(?:running|executing|called?|using)\s+(?:the\s+)?(\w+(?:_\w+)*)\s+tool/gi,
2175
+ /tool[:\s]+(\w+(?:_\w+)*)/gi,
2176
+ /āŽæ\s*(\w+)/g, // Tool result prefix pattern
2177
+ /(?:read_file|write_file|edit_file|bash|grep|glob|search)/gi,
2178
+ ];
2179
+ for (const pattern of toolPatterns) {
2180
+ let match;
2181
+ while ((match = pattern.exec(response)) !== null) {
2182
+ const toolName = match[1] || match[0];
2183
+ if (toolName && !tools.includes(toolName.toLowerCase())) {
2184
+ tools.push(toolName.toLowerCase());
2185
+ }
2186
+ }
1908
2187
  }
2188
+ return tools;
1909
2189
  }
1910
2190
  /**
1911
2191
  * Check if an error is a context overflow error