@trenchwork/erosolar 1.1.16

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 (700) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +232 -0
  3. package/agents/erosolar-code.rules.json +199 -0
  4. package/dist/bin/cliMode.d.ts +8 -0
  5. package/dist/bin/cliMode.d.ts.map +1 -0
  6. package/dist/bin/cliMode.js +20 -0
  7. package/dist/bin/cliMode.js.map +1 -0
  8. package/dist/bin/deepseek.d.ts +3 -0
  9. package/dist/bin/deepseek.d.ts.map +1 -0
  10. package/dist/bin/deepseek.js +232 -0
  11. package/dist/bin/deepseek.js.map +1 -0
  12. package/dist/bin/erosolar.d.ts +7 -0
  13. package/dist/bin/erosolar.d.ts.map +1 -0
  14. package/dist/bin/erosolar.js +7 -0
  15. package/dist/bin/erosolar.js.map +1 -0
  16. package/dist/bin/selfTest.d.ts +14 -0
  17. package/dist/bin/selfTest.d.ts.map +1 -0
  18. package/dist/bin/selfTest.js +298 -0
  19. package/dist/bin/selfTest.js.map +1 -0
  20. package/dist/capabilities/baseCapability.d.ts +72 -0
  21. package/dist/capabilities/baseCapability.d.ts.map +1 -0
  22. package/dist/capabilities/baseCapability.js +183 -0
  23. package/dist/capabilities/baseCapability.js.map +1 -0
  24. package/dist/capabilities/bashCapability.d.ts +13 -0
  25. package/dist/capabilities/bashCapability.d.ts.map +1 -0
  26. package/dist/capabilities/bashCapability.js +24 -0
  27. package/dist/capabilities/bashCapability.js.map +1 -0
  28. package/dist/capabilities/editCapability.d.ts +17 -0
  29. package/dist/capabilities/editCapability.d.ts.map +1 -0
  30. package/dist/capabilities/editCapability.js +27 -0
  31. package/dist/capabilities/editCapability.js.map +1 -0
  32. package/dist/capabilities/enhancedGitCapability.d.ts +7 -0
  33. package/dist/capabilities/enhancedGitCapability.d.ts.map +1 -0
  34. package/dist/capabilities/enhancedGitCapability.js +220 -0
  35. package/dist/capabilities/enhancedGitCapability.js.map +1 -0
  36. package/dist/capabilities/filesystemCapability.d.ts +13 -0
  37. package/dist/capabilities/filesystemCapability.d.ts.map +1 -0
  38. package/dist/capabilities/filesystemCapability.js +24 -0
  39. package/dist/capabilities/filesystemCapability.js.map +1 -0
  40. package/dist/capabilities/gitHistoryCapability.d.ts +6 -0
  41. package/dist/capabilities/gitHistoryCapability.d.ts.map +1 -0
  42. package/dist/capabilities/gitHistoryCapability.js +184 -0
  43. package/dist/capabilities/gitHistoryCapability.js.map +1 -0
  44. package/dist/capabilities/hitlCapability.d.ts +18 -0
  45. package/dist/capabilities/hitlCapability.d.ts.map +1 -0
  46. package/dist/capabilities/hitlCapability.js +29 -0
  47. package/dist/capabilities/hitlCapability.js.map +1 -0
  48. package/dist/capabilities/index.d.ts +13 -0
  49. package/dist/capabilities/index.d.ts.map +1 -0
  50. package/dist/capabilities/index.js +18 -0
  51. package/dist/capabilities/index.js.map +1 -0
  52. package/dist/capabilities/kaliCapability.d.ts +14 -0
  53. package/dist/capabilities/kaliCapability.d.ts.map +1 -0
  54. package/dist/capabilities/kaliCapability.js +478 -0
  55. package/dist/capabilities/kaliCapability.js.map +1 -0
  56. package/dist/capabilities/mcpCapability.d.ts +7 -0
  57. package/dist/capabilities/mcpCapability.d.ts.map +1 -0
  58. package/dist/capabilities/mcpCapability.js +80 -0
  59. package/dist/capabilities/mcpCapability.js.map +1 -0
  60. package/dist/capabilities/memoryCapability.d.ts +10 -0
  61. package/dist/capabilities/memoryCapability.d.ts.map +1 -0
  62. package/dist/capabilities/memoryCapability.js +22 -0
  63. package/dist/capabilities/memoryCapability.js.map +1 -0
  64. package/dist/capabilities/notebookCapability.d.ts +6 -0
  65. package/dist/capabilities/notebookCapability.d.ts.map +1 -0
  66. package/dist/capabilities/notebookCapability.js +17 -0
  67. package/dist/capabilities/notebookCapability.js.map +1 -0
  68. package/dist/capabilities/searchCapability.d.ts +19 -0
  69. package/dist/capabilities/searchCapability.d.ts.map +1 -0
  70. package/dist/capabilities/searchCapability.js +29 -0
  71. package/dist/capabilities/searchCapability.js.map +1 -0
  72. package/dist/capabilities/skillCapability.d.ts +6 -0
  73. package/dist/capabilities/skillCapability.d.ts.map +1 -0
  74. package/dist/capabilities/skillCapability.js +17 -0
  75. package/dist/capabilities/skillCapability.js.map +1 -0
  76. package/dist/capabilities/todoCapability.d.ts +11 -0
  77. package/dist/capabilities/todoCapability.d.ts.map +1 -0
  78. package/dist/capabilities/todoCapability.js +22 -0
  79. package/dist/capabilities/todoCapability.js.map +1 -0
  80. package/dist/capabilities/toolManifest.d.ts +3 -0
  81. package/dist/capabilities/toolManifest.d.ts.map +1 -0
  82. package/dist/capabilities/toolManifest.js +163 -0
  83. package/dist/capabilities/toolManifest.js.map +1 -0
  84. package/dist/capabilities/toolRegistry.d.ts +25 -0
  85. package/dist/capabilities/toolRegistry.d.ts.map +1 -0
  86. package/dist/capabilities/toolRegistry.js +150 -0
  87. package/dist/capabilities/toolRegistry.js.map +1 -0
  88. package/dist/capabilities/unifiedCodingCapability.d.ts +62 -0
  89. package/dist/capabilities/unifiedCodingCapability.d.ts.map +1 -0
  90. package/dist/capabilities/unifiedCodingCapability.js +788 -0
  91. package/dist/capabilities/unifiedCodingCapability.js.map +1 -0
  92. package/dist/capabilities/webCapability.d.ts +23 -0
  93. package/dist/capabilities/webCapability.d.ts.map +1 -0
  94. package/dist/capabilities/webCapability.js +33 -0
  95. package/dist/capabilities/webCapability.js.map +1 -0
  96. package/dist/config.d.ts +25 -0
  97. package/dist/config.d.ts.map +1 -0
  98. package/dist/config.js +155 -0
  99. package/dist/config.js.map +1 -0
  100. package/dist/contracts/agent-profiles.schema.json +43 -0
  101. package/dist/contracts/agent-schemas.json +470 -0
  102. package/dist/contracts/models.schema.json +9 -0
  103. package/dist/contracts/module-schema.json +367 -0
  104. package/dist/contracts/schemas/agent-profile.schema.json +157 -0
  105. package/dist/contracts/schemas/agent-rules.schema.json +238 -0
  106. package/dist/contracts/schemas/agent-schemas.schema.json +528 -0
  107. package/dist/contracts/schemas/agent.schema.json +90 -0
  108. package/dist/contracts/schemas/tool-selection.schema.json +174 -0
  109. package/dist/contracts/tools.schema.json +42 -0
  110. package/dist/contracts/unified-schema.json +660 -0
  111. package/dist/contracts/v1/agent.d.ts +179 -0
  112. package/dist/contracts/v1/agent.d.ts.map +1 -0
  113. package/dist/contracts/v1/agent.js +8 -0
  114. package/dist/contracts/v1/agent.js.map +1 -0
  115. package/dist/contracts/v1/agentProfileManifest.d.ts +60 -0
  116. package/dist/contracts/v1/agentProfileManifest.d.ts.map +1 -0
  117. package/dist/contracts/v1/agentProfileManifest.js +9 -0
  118. package/dist/contracts/v1/agentProfileManifest.js.map +1 -0
  119. package/dist/contracts/v1/agentRules.d.ts +60 -0
  120. package/dist/contracts/v1/agentRules.d.ts.map +1 -0
  121. package/dist/contracts/v1/agentRules.js +10 -0
  122. package/dist/contracts/v1/agentRules.js.map +1 -0
  123. package/dist/contracts/v1/provider.d.ts +149 -0
  124. package/dist/contracts/v1/provider.d.ts.map +1 -0
  125. package/dist/contracts/v1/provider.js +7 -0
  126. package/dist/contracts/v1/provider.js.map +1 -0
  127. package/dist/contracts/v1/tool.d.ts +136 -0
  128. package/dist/contracts/v1/tool.d.ts.map +1 -0
  129. package/dist/contracts/v1/tool.js +7 -0
  130. package/dist/contracts/v1/tool.js.map +1 -0
  131. package/dist/contracts/v1/toolAccess.d.ts +43 -0
  132. package/dist/contracts/v1/toolAccess.d.ts.map +1 -0
  133. package/dist/contracts/v1/toolAccess.js +9 -0
  134. package/dist/contracts/v1/toolAccess.js.map +1 -0
  135. package/dist/core/agent.d.ts +320 -0
  136. package/dist/core/agent.d.ts.map +1 -0
  137. package/dist/core/agent.js +1627 -0
  138. package/dist/core/agent.js.map +1 -0
  139. package/dist/core/agentProfileManifest.d.ts +3 -0
  140. package/dist/core/agentProfileManifest.d.ts.map +1 -0
  141. package/dist/core/agentProfileManifest.js +188 -0
  142. package/dist/core/agentProfileManifest.js.map +1 -0
  143. package/dist/core/agentProfiles.d.ts +22 -0
  144. package/dist/core/agentProfiles.d.ts.map +1 -0
  145. package/dist/core/agentProfiles.js +35 -0
  146. package/dist/core/agentProfiles.js.map +1 -0
  147. package/dist/core/agentRegistry.d.ts +111 -0
  148. package/dist/core/agentRegistry.d.ts.map +1 -0
  149. package/dist/core/agentRegistry.js +229 -0
  150. package/dist/core/agentRegistry.js.map +1 -0
  151. package/dist/core/agentRulebook.d.ts +11 -0
  152. package/dist/core/agentRulebook.d.ts.map +1 -0
  153. package/dist/core/agentRulebook.js +136 -0
  154. package/dist/core/agentRulebook.js.map +1 -0
  155. package/dist/core/agentSchemaLoader.d.ts +131 -0
  156. package/dist/core/agentSchemaLoader.d.ts.map +1 -0
  157. package/dist/core/agentSchemaLoader.js +235 -0
  158. package/dist/core/agentSchemaLoader.js.map +1 -0
  159. package/dist/core/aiErrorFixer.d.ts +57 -0
  160. package/dist/core/aiErrorFixer.d.ts.map +1 -0
  161. package/dist/core/aiErrorFixer.js +214 -0
  162. package/dist/core/aiErrorFixer.js.map +1 -0
  163. package/dist/core/auth.d.ts +15 -0
  164. package/dist/core/auth.d.ts.map +1 -0
  165. package/dist/core/auth.js +291 -0
  166. package/dist/core/auth.js.map +1 -0
  167. package/dist/core/bashCommandGuidance.d.ts +16 -0
  168. package/dist/core/bashCommandGuidance.d.ts.map +1 -0
  169. package/dist/core/bashCommandGuidance.js +40 -0
  170. package/dist/core/bashCommandGuidance.js.map +1 -0
  171. package/dist/core/constants.d.ts +31 -0
  172. package/dist/core/constants.d.ts.map +1 -0
  173. package/dist/core/constants.js +62 -0
  174. package/dist/core/constants.js.map +1 -0
  175. package/dist/core/contextManager.d.ts +271 -0
  176. package/dist/core/contextManager.d.ts.map +1 -0
  177. package/dist/core/contextManager.js +1073 -0
  178. package/dist/core/contextManager.js.map +1 -0
  179. package/dist/core/contextWindow.d.ts +42 -0
  180. package/dist/core/contextWindow.d.ts.map +1 -0
  181. package/dist/core/contextWindow.js +123 -0
  182. package/dist/core/contextWindow.js.map +1 -0
  183. package/dist/core/customCommands.d.ts +19 -0
  184. package/dist/core/customCommands.d.ts.map +1 -0
  185. package/dist/core/customCommands.js +85 -0
  186. package/dist/core/customCommands.js.map +1 -0
  187. package/dist/core/errors/apiKeyErrors.d.ts +11 -0
  188. package/dist/core/errors/apiKeyErrors.d.ts.map +1 -0
  189. package/dist/core/errors/apiKeyErrors.js +159 -0
  190. package/dist/core/errors/apiKeyErrors.js.map +1 -0
  191. package/dist/core/errors/errorTypes.d.ts +111 -0
  192. package/dist/core/errors/errorTypes.d.ts.map +1 -0
  193. package/dist/core/errors/errorTypes.js +345 -0
  194. package/dist/core/errors/errorTypes.js.map +1 -0
  195. package/dist/core/errors/index.d.ts +50 -0
  196. package/dist/core/errors/index.d.ts.map +1 -0
  197. package/dist/core/errors/index.js +156 -0
  198. package/dist/core/errors/index.js.map +1 -0
  199. package/dist/core/errors/networkErrors.d.ts +14 -0
  200. package/dist/core/errors/networkErrors.d.ts.map +1 -0
  201. package/dist/core/errors/networkErrors.js +53 -0
  202. package/dist/core/errors/networkErrors.js.map +1 -0
  203. package/dist/core/errors/safetyValidator.d.ts +109 -0
  204. package/dist/core/errors/safetyValidator.d.ts.map +1 -0
  205. package/dist/core/errors/safetyValidator.js +271 -0
  206. package/dist/core/errors/safetyValidator.js.map +1 -0
  207. package/dist/core/errors.d.ts +4 -0
  208. package/dist/core/errors.d.ts.map +1 -0
  209. package/dist/core/errors.js +33 -0
  210. package/dist/core/errors.js.map +1 -0
  211. package/dist/core/finalResponseFormatter.d.ts +10 -0
  212. package/dist/core/finalResponseFormatter.d.ts.map +1 -0
  213. package/dist/core/finalResponseFormatter.js +14 -0
  214. package/dist/core/finalResponseFormatter.js.map +1 -0
  215. package/dist/core/guardrails.d.ts +146 -0
  216. package/dist/core/guardrails.d.ts.map +1 -0
  217. package/dist/core/guardrails.js +361 -0
  218. package/dist/core/guardrails.js.map +1 -0
  219. package/dist/core/hitl.d.ts +119 -0
  220. package/dist/core/hitl.d.ts.map +1 -0
  221. package/dist/core/hitl.js +387 -0
  222. package/dist/core/hitl.js.map +1 -0
  223. package/dist/core/hooks.d.ts +95 -0
  224. package/dist/core/hooks.d.ts.map +1 -0
  225. package/dist/core/hooks.js +239 -0
  226. package/dist/core/hooks.js.map +1 -0
  227. package/dist/core/index.d.ts +7 -0
  228. package/dist/core/index.d.ts.map +1 -0
  229. package/dist/core/index.js +7 -0
  230. package/dist/core/index.js.map +1 -0
  231. package/dist/core/inputProtection.d.ts +122 -0
  232. package/dist/core/inputProtection.d.ts.map +1 -0
  233. package/dist/core/inputProtection.js +422 -0
  234. package/dist/core/inputProtection.js.map +1 -0
  235. package/dist/core/modelDiscovery.d.ts +105 -0
  236. package/dist/core/modelDiscovery.d.ts.map +1 -0
  237. package/dist/core/modelDiscovery.js +768 -0
  238. package/dist/core/modelDiscovery.js.map +1 -0
  239. package/dist/core/multilinePasteHandler.d.ts +35 -0
  240. package/dist/core/multilinePasteHandler.d.ts.map +1 -0
  241. package/dist/core/multilinePasteHandler.js +81 -0
  242. package/dist/core/multilinePasteHandler.js.map +1 -0
  243. package/dist/core/preferences.d.ts +65 -0
  244. package/dist/core/preferences.d.ts.map +1 -0
  245. package/dist/core/preferences.js +305 -0
  246. package/dist/core/preferences.js.map +1 -0
  247. package/dist/core/providerKeys.d.ts +20 -0
  248. package/dist/core/providerKeys.d.ts.map +1 -0
  249. package/dist/core/providerKeys.js +40 -0
  250. package/dist/core/providerKeys.js.map +1 -0
  251. package/dist/core/refusalDetection.d.ts +2 -0
  252. package/dist/core/refusalDetection.d.ts.map +1 -0
  253. package/dist/core/refusalDetection.js +51 -0
  254. package/dist/core/refusalDetection.js.map +1 -0
  255. package/dist/core/resultVerification.d.ts +47 -0
  256. package/dist/core/resultVerification.d.ts.map +1 -0
  257. package/dist/core/resultVerification.js +126 -0
  258. package/dist/core/resultVerification.js.map +1 -0
  259. package/dist/core/schemaValidator.d.ts +49 -0
  260. package/dist/core/schemaValidator.d.ts.map +1 -0
  261. package/dist/core/schemaValidator.js +234 -0
  262. package/dist/core/schemaValidator.js.map +1 -0
  263. package/dist/core/secretStore.d.ts +48 -0
  264. package/dist/core/secretStore.d.ts.map +1 -0
  265. package/dist/core/secretStore.js +268 -0
  266. package/dist/core/secretStore.js.map +1 -0
  267. package/dist/core/sessionStorage.d.ts +10 -0
  268. package/dist/core/sessionStorage.d.ts.map +1 -0
  269. package/dist/core/sessionStorage.js +46 -0
  270. package/dist/core/sessionStorage.js.map +1 -0
  271. package/dist/core/sessionStore.d.ts +35 -0
  272. package/dist/core/sessionStore.d.ts.map +1 -0
  273. package/dist/core/sessionStore.js +191 -0
  274. package/dist/core/sessionStore.js.map +1 -0
  275. package/dist/core/shutdown.d.ts +34 -0
  276. package/dist/core/shutdown.d.ts.map +1 -0
  277. package/dist/core/shutdown.js +186 -0
  278. package/dist/core/shutdown.js.map +1 -0
  279. package/dist/core/sudoPasswordManager.d.ts +52 -0
  280. package/dist/core/sudoPasswordManager.d.ts.map +1 -0
  281. package/dist/core/sudoPasswordManager.js +115 -0
  282. package/dist/core/sudoPasswordManager.js.map +1 -0
  283. package/dist/core/taskCompletionDetector.d.ts +117 -0
  284. package/dist/core/taskCompletionDetector.d.ts.map +1 -0
  285. package/dist/core/taskCompletionDetector.js +532 -0
  286. package/dist/core/taskCompletionDetector.js.map +1 -0
  287. package/dist/core/testFailureMonitor.d.ts +67 -0
  288. package/dist/core/testFailureMonitor.d.ts.map +1 -0
  289. package/dist/core/testFailureMonitor.js +262 -0
  290. package/dist/core/testFailureMonitor.js.map +1 -0
  291. package/dist/core/toolPreconditions.d.ts +34 -0
  292. package/dist/core/toolPreconditions.d.ts.map +1 -0
  293. package/dist/core/toolPreconditions.js +242 -0
  294. package/dist/core/toolPreconditions.js.map +1 -0
  295. package/dist/core/toolRuntime.d.ts +192 -0
  296. package/dist/core/toolRuntime.d.ts.map +1 -0
  297. package/dist/core/toolRuntime.js +460 -0
  298. package/dist/core/toolRuntime.js.map +1 -0
  299. package/dist/core/types/utilityTypes.d.ts +183 -0
  300. package/dist/core/types/utilityTypes.d.ts.map +1 -0
  301. package/dist/core/types/utilityTypes.js +273 -0
  302. package/dist/core/types/utilityTypes.js.map +1 -0
  303. package/dist/core/types.d.ts +334 -0
  304. package/dist/core/types.d.ts.map +1 -0
  305. package/dist/core/types.js +76 -0
  306. package/dist/core/types.js.map +1 -0
  307. package/dist/core/updateChecker.d.ts +148 -0
  308. package/dist/core/updateChecker.d.ts.map +1 -0
  309. package/dist/core/updateChecker.js +599 -0
  310. package/dist/core/updateChecker.js.map +1 -0
  311. package/dist/core/usageTracker.d.ts +11 -0
  312. package/dist/core/usageTracker.d.ts.map +1 -0
  313. package/dist/core/usageTracker.js +128 -0
  314. package/dist/core/usageTracker.js.map +1 -0
  315. package/dist/headless/interactiveShell.d.ts +22 -0
  316. package/dist/headless/interactiveShell.d.ts.map +1 -0
  317. package/dist/headless/interactiveShell.js +2100 -0
  318. package/dist/headless/interactiveShell.js.map +1 -0
  319. package/dist/leanAgent.d.ts +73 -0
  320. package/dist/leanAgent.d.ts.map +1 -0
  321. package/dist/leanAgent.js +177 -0
  322. package/dist/leanAgent.js.map +1 -0
  323. package/dist/plugins/index.d.ts +49 -0
  324. package/dist/plugins/index.d.ts.map +1 -0
  325. package/dist/plugins/index.js +104 -0
  326. package/dist/plugins/index.js.map +1 -0
  327. package/dist/plugins/providers/anthropic/index.d.ts +9 -0
  328. package/dist/plugins/providers/anthropic/index.d.ts.map +1 -0
  329. package/dist/plugins/providers/anthropic/index.js +48 -0
  330. package/dist/plugins/providers/anthropic/index.js.map +1 -0
  331. package/dist/plugins/providers/deepseek/index.d.ts +11 -0
  332. package/dist/plugins/providers/deepseek/index.d.ts.map +1 -0
  333. package/dist/plugins/providers/deepseek/index.js +54 -0
  334. package/dist/plugins/providers/deepseek/index.js.map +1 -0
  335. package/dist/plugins/providers/index.d.ts +2 -0
  336. package/dist/plugins/providers/index.d.ts.map +1 -0
  337. package/dist/plugins/providers/index.js +17 -0
  338. package/dist/plugins/providers/index.js.map +1 -0
  339. package/dist/plugins/providers/openai/index.d.ts +10 -0
  340. package/dist/plugins/providers/openai/index.d.ts.map +1 -0
  341. package/dist/plugins/providers/openai/index.js +47 -0
  342. package/dist/plugins/providers/openai/index.js.map +1 -0
  343. package/dist/plugins/providers/xai/index.d.ts +10 -0
  344. package/dist/plugins/providers/xai/index.d.ts.map +1 -0
  345. package/dist/plugins/providers/xai/index.js +47 -0
  346. package/dist/plugins/providers/xai/index.js.map +1 -0
  347. package/dist/plugins/tools/agentSpawning/agentSpawningPlugin.d.ts +10 -0
  348. package/dist/plugins/tools/agentSpawning/agentSpawningPlugin.d.ts.map +1 -0
  349. package/dist/plugins/tools/agentSpawning/agentSpawningPlugin.js +110 -0
  350. package/dist/plugins/tools/agentSpawning/agentSpawningPlugin.js.map +1 -0
  351. package/dist/plugins/tools/bash/localBashPlugin.d.ts +3 -0
  352. package/dist/plugins/tools/bash/localBashPlugin.d.ts.map +1 -0
  353. package/dist/plugins/tools/bash/localBashPlugin.js +14 -0
  354. package/dist/plugins/tools/bash/localBashPlugin.js.map +1 -0
  355. package/dist/plugins/tools/edit/editPlugin.d.ts +9 -0
  356. package/dist/plugins/tools/edit/editPlugin.d.ts.map +1 -0
  357. package/dist/plugins/tools/edit/editPlugin.js +15 -0
  358. package/dist/plugins/tools/edit/editPlugin.js.map +1 -0
  359. package/dist/plugins/tools/enhancedGit/enhancedGitPlugin.d.ts +3 -0
  360. package/dist/plugins/tools/enhancedGit/enhancedGitPlugin.d.ts.map +1 -0
  361. package/dist/plugins/tools/enhancedGit/enhancedGitPlugin.js +9 -0
  362. package/dist/plugins/tools/enhancedGit/enhancedGitPlugin.js.map +1 -0
  363. package/dist/plugins/tools/filesystem/localFilesystemPlugin.d.ts +3 -0
  364. package/dist/plugins/tools/filesystem/localFilesystemPlugin.d.ts.map +1 -0
  365. package/dist/plugins/tools/filesystem/localFilesystemPlugin.js +14 -0
  366. package/dist/plugins/tools/filesystem/localFilesystemPlugin.js.map +1 -0
  367. package/dist/plugins/tools/gitHistory/gitHistoryPlugin.d.ts +3 -0
  368. package/dist/plugins/tools/gitHistory/gitHistoryPlugin.d.ts.map +1 -0
  369. package/dist/plugins/tools/gitHistory/gitHistoryPlugin.js +9 -0
  370. package/dist/plugins/tools/gitHistory/gitHistoryPlugin.js.map +1 -0
  371. package/dist/plugins/tools/index.d.ts +3 -0
  372. package/dist/plugins/tools/index.d.ts.map +1 -0
  373. package/dist/plugins/tools/index.js +3 -0
  374. package/dist/plugins/tools/index.js.map +1 -0
  375. package/dist/plugins/tools/integrity/integrityPlugin.d.ts +3 -0
  376. package/dist/plugins/tools/integrity/integrityPlugin.d.ts.map +1 -0
  377. package/dist/plugins/tools/integrity/integrityPlugin.js +31 -0
  378. package/dist/plugins/tools/integrity/integrityPlugin.js.map +1 -0
  379. package/dist/plugins/tools/kali/kaliPlugin.d.ts +3 -0
  380. package/dist/plugins/tools/kali/kaliPlugin.d.ts.map +1 -0
  381. package/dist/plugins/tools/kali/kaliPlugin.js +10 -0
  382. package/dist/plugins/tools/kali/kaliPlugin.js.map +1 -0
  383. package/dist/plugins/tools/mcp/mcpClient.d.ts +49 -0
  384. package/dist/plugins/tools/mcp/mcpClient.d.ts.map +1 -0
  385. package/dist/plugins/tools/mcp/mcpClient.js +112 -0
  386. package/dist/plugins/tools/mcp/mcpClient.js.map +1 -0
  387. package/dist/plugins/tools/mcp/mcpPlugin.d.ts +3 -0
  388. package/dist/plugins/tools/mcp/mcpPlugin.d.ts.map +1 -0
  389. package/dist/plugins/tools/mcp/mcpPlugin.js +10 -0
  390. package/dist/plugins/tools/mcp/mcpPlugin.js.map +1 -0
  391. package/dist/plugins/tools/nodeDefaults.d.ts +13 -0
  392. package/dist/plugins/tools/nodeDefaults.d.ts.map +1 -0
  393. package/dist/plugins/tools/nodeDefaults.js +37 -0
  394. package/dist/plugins/tools/nodeDefaults.js.map +1 -0
  395. package/dist/plugins/tools/orchestration/orchestrationPlugin.d.ts +3 -0
  396. package/dist/plugins/tools/orchestration/orchestrationPlugin.d.ts.map +1 -0
  397. package/dist/plugins/tools/orchestration/orchestrationPlugin.js +340 -0
  398. package/dist/plugins/tools/orchestration/orchestrationPlugin.js.map +1 -0
  399. package/dist/plugins/tools/registry.d.ts +22 -0
  400. package/dist/plugins/tools/registry.d.ts.map +1 -0
  401. package/dist/plugins/tools/registry.js +58 -0
  402. package/dist/plugins/tools/registry.js.map +1 -0
  403. package/dist/plugins/tools/search/localSearchPlugin.d.ts +3 -0
  404. package/dist/plugins/tools/search/localSearchPlugin.d.ts.map +1 -0
  405. package/dist/plugins/tools/search/localSearchPlugin.js +14 -0
  406. package/dist/plugins/tools/search/localSearchPlugin.js.map +1 -0
  407. package/dist/plugins/tools/skills/skillPlugin.d.ts +3 -0
  408. package/dist/plugins/tools/skills/skillPlugin.d.ts.map +1 -0
  409. package/dist/plugins/tools/skills/skillPlugin.js +27 -0
  410. package/dist/plugins/tools/skills/skillPlugin.js.map +1 -0
  411. package/dist/plugins/tools/todo/todoPlugin.d.ts +3 -0
  412. package/dist/plugins/tools/todo/todoPlugin.d.ts.map +1 -0
  413. package/dist/plugins/tools/todo/todoPlugin.js +10 -0
  414. package/dist/plugins/tools/todo/todoPlugin.js.map +1 -0
  415. package/dist/providers/baseProvider.d.ts +148 -0
  416. package/dist/providers/baseProvider.d.ts.map +1 -0
  417. package/dist/providers/baseProvider.js +284 -0
  418. package/dist/providers/baseProvider.js.map +1 -0
  419. package/dist/providers/openaiChatCompletionsProvider.d.ts +64 -0
  420. package/dist/providers/openaiChatCompletionsProvider.d.ts.map +1 -0
  421. package/dist/providers/openaiChatCompletionsProvider.js +1018 -0
  422. package/dist/providers/openaiChatCompletionsProvider.js.map +1 -0
  423. package/dist/providers/providerFactory.d.ts +22 -0
  424. package/dist/providers/providerFactory.d.ts.map +1 -0
  425. package/dist/providers/providerFactory.js +25 -0
  426. package/dist/providers/providerFactory.js.map +1 -0
  427. package/dist/providers/resilientProvider.d.ts +103 -0
  428. package/dist/providers/resilientProvider.d.ts.map +1 -0
  429. package/dist/providers/resilientProvider.js +468 -0
  430. package/dist/providers/resilientProvider.js.map +1 -0
  431. package/dist/runtime/agentController.d.ts +121 -0
  432. package/dist/runtime/agentController.d.ts.map +1 -0
  433. package/dist/runtime/agentController.js +739 -0
  434. package/dist/runtime/agentController.js.map +1 -0
  435. package/dist/runtime/agentHost.d.ts +61 -0
  436. package/dist/runtime/agentHost.d.ts.map +1 -0
  437. package/dist/runtime/agentHost.js +158 -0
  438. package/dist/runtime/agentHost.js.map +1 -0
  439. package/dist/runtime/agentSession.d.ts +49 -0
  440. package/dist/runtime/agentSession.d.ts.map +1 -0
  441. package/dist/runtime/agentSession.js +218 -0
  442. package/dist/runtime/agentSession.js.map +1 -0
  443. package/dist/runtime/agentSpawningWiring.d.ts +23 -0
  444. package/dist/runtime/agentSpawningWiring.d.ts.map +1 -0
  445. package/dist/runtime/agentSpawningWiring.js +119 -0
  446. package/dist/runtime/agentSpawningWiring.js.map +1 -0
  447. package/dist/runtime/agentWorkerPool.d.ts +167 -0
  448. package/dist/runtime/agentWorkerPool.d.ts.map +1 -0
  449. package/dist/runtime/agentWorkerPool.js +435 -0
  450. package/dist/runtime/agentWorkerPool.js.map +1 -0
  451. package/dist/runtime/node.d.ts +7 -0
  452. package/dist/runtime/node.d.ts.map +1 -0
  453. package/dist/runtime/node.js +56 -0
  454. package/dist/runtime/node.js.map +1 -0
  455. package/dist/runtime/universal.d.ts +18 -0
  456. package/dist/runtime/universal.d.ts.map +1 -0
  457. package/dist/runtime/universal.js +21 -0
  458. package/dist/runtime/universal.js.map +1 -0
  459. package/dist/shell/autoExecutor.d.ts +70 -0
  460. package/dist/shell/autoExecutor.d.ts.map +1 -0
  461. package/dist/shell/autoExecutor.js +320 -0
  462. package/dist/shell/autoExecutor.js.map +1 -0
  463. package/dist/shell/commandRegistry.d.ts +122 -0
  464. package/dist/shell/commandRegistry.d.ts.map +1 -0
  465. package/dist/shell/commandRegistry.js +355 -0
  466. package/dist/shell/commandRegistry.js.map +1 -0
  467. package/dist/shell/composableMessage.d.ts +178 -0
  468. package/dist/shell/composableMessage.d.ts.map +1 -0
  469. package/dist/shell/composableMessage.js +384 -0
  470. package/dist/shell/composableMessage.js.map +1 -0
  471. package/dist/shell/liveStatus.d.ts +27 -0
  472. package/dist/shell/liveStatus.d.ts.map +1 -0
  473. package/dist/shell/liveStatus.js +53 -0
  474. package/dist/shell/liveStatus.js.map +1 -0
  475. package/dist/shell/systemPrompt.d.ts +12 -0
  476. package/dist/shell/systemPrompt.d.ts.map +1 -0
  477. package/dist/shell/systemPrompt.js +16 -0
  478. package/dist/shell/systemPrompt.js.map +1 -0
  479. package/dist/shell/vimMode.d.ts +66 -0
  480. package/dist/shell/vimMode.d.ts.map +1 -0
  481. package/dist/shell/vimMode.js +435 -0
  482. package/dist/shell/vimMode.js.map +1 -0
  483. package/dist/tools/bashTools.d.ts +11 -0
  484. package/dist/tools/bashTools.d.ts.map +1 -0
  485. package/dist/tools/bashTools.js +779 -0
  486. package/dist/tools/bashTools.js.map +1 -0
  487. package/dist/tools/diffUtils.d.ts +43 -0
  488. package/dist/tools/diffUtils.d.ts.map +1 -0
  489. package/dist/tools/diffUtils.js +607 -0
  490. package/dist/tools/diffUtils.js.map +1 -0
  491. package/dist/tools/editTools.d.ts +29 -0
  492. package/dist/tools/editTools.d.ts.map +1 -0
  493. package/dist/tools/editTools.js +792 -0
  494. package/dist/tools/editTools.js.map +1 -0
  495. package/dist/tools/fileChangeTracker.d.ts +47 -0
  496. package/dist/tools/fileChangeTracker.d.ts.map +1 -0
  497. package/dist/tools/fileChangeTracker.js +154 -0
  498. package/dist/tools/fileChangeTracker.js.map +1 -0
  499. package/dist/tools/fileReadTracker.d.ts +69 -0
  500. package/dist/tools/fileReadTracker.d.ts.map +1 -0
  501. package/dist/tools/fileReadTracker.js +213 -0
  502. package/dist/tools/fileReadTracker.js.map +1 -0
  503. package/dist/tools/fileTools.d.ts +3 -0
  504. package/dist/tools/fileTools.d.ts.map +1 -0
  505. package/dist/tools/fileTools.js +389 -0
  506. package/dist/tools/fileTools.js.map +1 -0
  507. package/dist/tools/grepTools.d.ts +3 -0
  508. package/dist/tools/grepTools.d.ts.map +1 -0
  509. package/dist/tools/grepTools.js +128 -0
  510. package/dist/tools/grepTools.js.map +1 -0
  511. package/dist/tools/heliaControl.d.ts +51 -0
  512. package/dist/tools/heliaControl.d.ts.map +1 -0
  513. package/dist/tools/heliaControl.js +93 -0
  514. package/dist/tools/heliaControl.js.map +1 -0
  515. package/dist/tools/hitlTools.d.ts +7 -0
  516. package/dist/tools/hitlTools.d.ts.map +1 -0
  517. package/dist/tools/hitlTools.js +185 -0
  518. package/dist/tools/hitlTools.js.map +1 -0
  519. package/dist/tools/localExplore.d.ts +38 -0
  520. package/dist/tools/localExplore.d.ts.map +1 -0
  521. package/dist/tools/localExplore.js +30 -0
  522. package/dist/tools/localExplore.js.map +1 -0
  523. package/dist/tools/memoryTools.d.ts +20 -0
  524. package/dist/tools/memoryTools.d.ts.map +1 -0
  525. package/dist/tools/memoryTools.js +180 -0
  526. package/dist/tools/memoryTools.js.map +1 -0
  527. package/dist/tools/notebookTools.d.ts +20 -0
  528. package/dist/tools/notebookTools.d.ts.map +1 -0
  529. package/dist/tools/notebookTools.js +140 -0
  530. package/dist/tools/notebookTools.js.map +1 -0
  531. package/dist/tools/searchTools.d.ts +12 -0
  532. package/dist/tools/searchTools.d.ts.map +1 -0
  533. package/dist/tools/searchTools.js +413 -0
  534. package/dist/tools/searchTools.js.map +1 -0
  535. package/dist/tools/skillTools.d.ts +24 -0
  536. package/dist/tools/skillTools.d.ts.map +1 -0
  537. package/dist/tools/skillTools.js +140 -0
  538. package/dist/tools/skillTools.js.map +1 -0
  539. package/dist/tools/todoTools.d.ts +24 -0
  540. package/dist/tools/todoTools.d.ts.map +1 -0
  541. package/dist/tools/todoTools.js +101 -0
  542. package/dist/tools/todoTools.js.map +1 -0
  543. package/dist/tools/webTools.d.ts +26 -0
  544. package/dist/tools/webTools.d.ts.map +1 -0
  545. package/dist/tools/webTools.js +332 -0
  546. package/dist/tools/webTools.js.map +1 -0
  547. package/dist/ui/RenderGate.d.ts +83 -0
  548. package/dist/ui/RenderGate.d.ts.map +1 -0
  549. package/dist/ui/RenderGate.js +138 -0
  550. package/dist/ui/RenderGate.js.map +1 -0
  551. package/dist/ui/animatedStatus.d.ts +140 -0
  552. package/dist/ui/animatedStatus.d.ts.map +1 -0
  553. package/dist/ui/animatedStatus.js +480 -0
  554. package/dist/ui/animatedStatus.js.map +1 -0
  555. package/dist/ui/animation/AnimationScheduler.d.ts +197 -0
  556. package/dist/ui/animation/AnimationScheduler.d.ts.map +1 -0
  557. package/dist/ui/animation/AnimationScheduler.js +440 -0
  558. package/dist/ui/animation/AnimationScheduler.js.map +1 -0
  559. package/dist/ui/codeHighlighter.d.ts +6 -0
  560. package/dist/ui/codeHighlighter.d.ts.map +1 -0
  561. package/dist/ui/codeHighlighter.js +855 -0
  562. package/dist/ui/codeHighlighter.js.map +1 -0
  563. package/dist/ui/designSystem.d.ts +26 -0
  564. package/dist/ui/designSystem.d.ts.map +1 -0
  565. package/dist/ui/designSystem.js +114 -0
  566. package/dist/ui/designSystem.js.map +1 -0
  567. package/dist/ui/errorFormatter.d.ts +64 -0
  568. package/dist/ui/errorFormatter.d.ts.map +1 -0
  569. package/dist/ui/errorFormatter.js +316 -0
  570. package/dist/ui/errorFormatter.js.map +1 -0
  571. package/dist/ui/globalWriteLock.d.ts +63 -0
  572. package/dist/ui/globalWriteLock.d.ts.map +1 -0
  573. package/dist/ui/globalWriteLock.js +173 -0
  574. package/dist/ui/globalWriteLock.js.map +1 -0
  575. package/dist/ui/index.d.ts +31 -0
  576. package/dist/ui/index.d.ts.map +1 -0
  577. package/dist/ui/index.js +49 -0
  578. package/dist/ui/index.js.map +1 -0
  579. package/dist/ui/ink/App.d.ts +39 -0
  580. package/dist/ui/ink/App.d.ts.map +1 -0
  581. package/dist/ui/ink/App.js +9 -0
  582. package/dist/ui/ink/App.js.map +1 -0
  583. package/dist/ui/ink/ChatStatic.d.ts +29 -0
  584. package/dist/ui/ink/ChatStatic.d.ts.map +1 -0
  585. package/dist/ui/ink/ChatStatic.js +14 -0
  586. package/dist/ui/ink/ChatStatic.js.map +1 -0
  587. package/dist/ui/ink/InkPromptController.d.ts +282 -0
  588. package/dist/ui/ink/InkPromptController.d.ts.map +1 -0
  589. package/dist/ui/ink/InkPromptController.js +508 -0
  590. package/dist/ui/ink/InkPromptController.js.map +1 -0
  591. package/dist/ui/ink/Prompt.d.ts +31 -0
  592. package/dist/ui/ink/Prompt.d.ts.map +1 -0
  593. package/dist/ui/ink/Prompt.js +197 -0
  594. package/dist/ui/ink/Prompt.js.map +1 -0
  595. package/dist/ui/ink/StatusLine.d.ts +25 -0
  596. package/dist/ui/ink/StatusLine.d.ts.map +1 -0
  597. package/dist/ui/ink/StatusLine.js +11 -0
  598. package/dist/ui/ink/StatusLine.js.map +1 -0
  599. package/dist/ui/ink/adapter.d.ts +58 -0
  600. package/dist/ui/ink/adapter.d.ts.map +1 -0
  601. package/dist/ui/ink/adapter.js +113 -0
  602. package/dist/ui/ink/adapter.js.map +1 -0
  603. package/dist/ui/interrupts/InterruptManager.d.ts +157 -0
  604. package/dist/ui/interrupts/InterruptManager.d.ts.map +1 -0
  605. package/dist/ui/interrupts/InterruptManager.js +501 -0
  606. package/dist/ui/interrupts/InterruptManager.js.map +1 -0
  607. package/dist/ui/layout.d.ts +27 -0
  608. package/dist/ui/layout.d.ts.map +1 -0
  609. package/dist/ui/layout.js +184 -0
  610. package/dist/ui/layout.js.map +1 -0
  611. package/dist/ui/outputMode.d.ts +58 -0
  612. package/dist/ui/outputMode.d.ts.map +1 -0
  613. package/dist/ui/outputMode.js +179 -0
  614. package/dist/ui/outputMode.js.map +1 -0
  615. package/dist/ui/overlay/OverlayManager.d.ts +105 -0
  616. package/dist/ui/overlay/OverlayManager.d.ts.map +1 -0
  617. package/dist/ui/overlay/OverlayManager.js +304 -0
  618. package/dist/ui/overlay/OverlayManager.js.map +1 -0
  619. package/dist/ui/premiumComponents.d.ts +54 -0
  620. package/dist/ui/premiumComponents.d.ts.map +1 -0
  621. package/dist/ui/premiumComponents.js +241 -0
  622. package/dist/ui/premiumComponents.js.map +1 -0
  623. package/dist/ui/richText.d.ts +13 -0
  624. package/dist/ui/richText.d.ts.map +1 -0
  625. package/dist/ui/richText.js +444 -0
  626. package/dist/ui/richText.js.map +1 -0
  627. package/dist/ui/telemetry/ResponseTracker.d.ts +22 -0
  628. package/dist/ui/telemetry/ResponseTracker.d.ts.map +1 -0
  629. package/dist/ui/telemetry/ResponseTracker.js +60 -0
  630. package/dist/ui/telemetry/ResponseTracker.js.map +1 -0
  631. package/dist/ui/telemetry/UITelemetry.d.ts +181 -0
  632. package/dist/ui/telemetry/UITelemetry.d.ts.map +1 -0
  633. package/dist/ui/telemetry/UITelemetry.js +446 -0
  634. package/dist/ui/telemetry/UITelemetry.js.map +1 -0
  635. package/dist/ui/textHighlighter.d.ts +83 -0
  636. package/dist/ui/textHighlighter.d.ts.map +1 -0
  637. package/dist/ui/textHighlighter.js +267 -0
  638. package/dist/ui/textHighlighter.js.map +1 -0
  639. package/dist/ui/theme.d.ts +351 -0
  640. package/dist/ui/theme.d.ts.map +1 -0
  641. package/dist/ui/theme.js +434 -0
  642. package/dist/ui/theme.js.map +1 -0
  643. package/dist/ui/toolDisplay.d.ts +221 -0
  644. package/dist/ui/toolDisplay.d.ts.map +1 -0
  645. package/dist/ui/toolDisplay.js +1654 -0
  646. package/dist/ui/toolDisplay.js.map +1 -0
  647. package/dist/ui/uiConstants.d.ts +253 -0
  648. package/dist/ui/uiConstants.d.ts.map +1 -0
  649. package/dist/ui/uiConstants.js +437 -0
  650. package/dist/ui/uiConstants.js.map +1 -0
  651. package/dist/utils/analytics.d.ts +2 -0
  652. package/dist/utils/analytics.d.ts.map +1 -0
  653. package/dist/utils/analytics.js +51 -0
  654. package/dist/utils/analytics.js.map +1 -0
  655. package/dist/utils/askUserPrompt.d.ts +21 -0
  656. package/dist/utils/askUserPrompt.d.ts.map +1 -0
  657. package/dist/utils/askUserPrompt.js +87 -0
  658. package/dist/utils/askUserPrompt.js.map +1 -0
  659. package/dist/utils/asyncUtils.d.ts +95 -0
  660. package/dist/utils/asyncUtils.d.ts.map +1 -0
  661. package/dist/utils/asyncUtils.js +286 -0
  662. package/dist/utils/asyncUtils.js.map +1 -0
  663. package/dist/utils/debugLogger.d.ts +6 -0
  664. package/dist/utils/debugLogger.d.ts.map +1 -0
  665. package/dist/utils/debugLogger.js +39 -0
  666. package/dist/utils/debugLogger.js.map +1 -0
  667. package/dist/utils/errorUtils.d.ts +12 -0
  668. package/dist/utils/errorUtils.d.ts.map +1 -0
  669. package/dist/utils/errorUtils.js +83 -0
  670. package/dist/utils/errorUtils.js.map +1 -0
  671. package/dist/utils/frontmatter.d.ts +10 -0
  672. package/dist/utils/frontmatter.d.ts.map +1 -0
  673. package/dist/utils/frontmatter.js +78 -0
  674. package/dist/utils/frontmatter.js.map +1 -0
  675. package/dist/utils/packageInfo.d.ts +14 -0
  676. package/dist/utils/packageInfo.d.ts.map +1 -0
  677. package/dist/utils/packageInfo.js +45 -0
  678. package/dist/utils/packageInfo.js.map +1 -0
  679. package/dist/utils/planFormatter.d.ts +34 -0
  680. package/dist/utils/planFormatter.d.ts.map +1 -0
  681. package/dist/utils/planFormatter.js +141 -0
  682. package/dist/utils/planFormatter.js.map +1 -0
  683. package/dist/utils/securityUtils.d.ts +145 -0
  684. package/dist/utils/securityUtils.d.ts.map +1 -0
  685. package/dist/utils/securityUtils.js +507 -0
  686. package/dist/utils/securityUtils.js.map +1 -0
  687. package/dist/utils/statusReporter.d.ts +6 -0
  688. package/dist/utils/statusReporter.d.ts.map +1 -0
  689. package/dist/utils/statusReporter.js +26 -0
  690. package/dist/utils/statusReporter.js.map +1 -0
  691. package/dist/workspace.d.ts +8 -0
  692. package/dist/workspace.d.ts.map +1 -0
  693. package/dist/workspace.js +135 -0
  694. package/dist/workspace.js.map +1 -0
  695. package/dist/workspace.validator.d.ts +49 -0
  696. package/dist/workspace.validator.d.ts.map +1 -0
  697. package/dist/workspace.validator.js +215 -0
  698. package/dist/workspace.validator.js.map +1 -0
  699. package/package.json +135 -0
  700. package/scripts/postinstall.cjs +58 -0
@@ -0,0 +1,779 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { mkdir } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { reportToolProgress } from '../core/toolRuntime.js';
5
+ import { validateBashCommand } from '../core/errors/safetyValidator.js';
6
+ import { analyzeBashFlow } from '../core/bashCommandGuidance.js';
7
+ import { buildError } from '../core/errors.js';
8
+ import { verifiedSuccess, verifiedFailure, analyzeOutput, OutputPatterns, createCommandCheck, } from '../core/resultVerification.js';
9
+ import { createErrorFixer } from '../core/aiErrorFixer.js';
10
+ import { logDebug } from '../utils/debugLogger.js';
11
+ import { createTestMonitor } from '../core/testFailureMonitor.js';
12
+ import { getSudoPassword, invalidateSudoPassword } from '../core/sudoPasswordManager.js';
13
+ // ANSI color codes for enhanced output
14
+ const ANSI_RESET = '\x1b[0m';
15
+ const ANSI_RED = '\x1b[31m';
16
+ const ANSI_GREEN = '\x1b[32m';
17
+ const ANSI_YELLOW = '\x1b[33m';
18
+ const ANSI_BLUE = '\x1b[34m';
19
+ const ANSI_CYAN = '\x1b[36m';
20
+ const ANSI_DIM = '\x1b[2m';
21
+ const ANSI_BOLD = '\x1b[1m';
22
+ const ANSI_RED_BOLD = '\x1b[1;31m';
23
+ const ANSI_GREEN_BOLD = '\x1b[1;32m';
24
+ const ANSI_YELLOW_BOLD = '\x1b[1;33m';
25
+ // ============================================================================
26
+ // Background Shell Manager (consolidated from backgroundBashTools.ts)
27
+ // ============================================================================
28
+ class BackgroundShell {
29
+ id;
30
+ command;
31
+ workingDir;
32
+ process;
33
+ outputBuffer = [];
34
+ errorBuffer = [];
35
+ lastReadPosition = 0;
36
+ isRunning = false;
37
+ exitCode;
38
+ constructor(id, command, workingDir) {
39
+ this.id = id;
40
+ this.command = command;
41
+ this.workingDir = workingDir;
42
+ }
43
+ start() {
44
+ this.process = spawn('bash', ['-c', this.command], {
45
+ cwd: this.workingDir,
46
+ stdio: ['ignore', 'pipe', 'pipe'],
47
+ });
48
+ this.isRunning = true;
49
+ this.process.stdout?.on('data', (data) => {
50
+ this.outputBuffer.push(data.toString());
51
+ });
52
+ this.process.stderr?.on('data', (data) => {
53
+ this.errorBuffer.push(data.toString());
54
+ });
55
+ this.process.on('exit', (code) => {
56
+ this.exitCode = code ?? 0;
57
+ this.isRunning = false;
58
+ });
59
+ }
60
+ getNewOutput(filter) {
61
+ const allOutput = this.outputBuffer.join('');
62
+ const newOutput = allOutput.substring(this.lastReadPosition);
63
+ this.lastReadPosition = allOutput.length;
64
+ const allError = this.errorBuffer.join('');
65
+ let stdout = newOutput;
66
+ if (filter) {
67
+ const lines = newOutput.split('\n');
68
+ stdout = lines.filter(line => filter.test(line)).join('\n');
69
+ }
70
+ return {
71
+ stdout,
72
+ stderr: allError,
73
+ status: this.isRunning ? 'running' : `exited with code ${this.exitCode}`,
74
+ };
75
+ }
76
+ kill() {
77
+ if (this.process) {
78
+ this.process.kill('SIGTERM');
79
+ setTimeout(() => {
80
+ if (this.process && !this.process.killed) {
81
+ this.process.kill('SIGKILL');
82
+ }
83
+ }, 5000);
84
+ }
85
+ }
86
+ }
87
+ class BackgroundShellManager {
88
+ shells = new Map();
89
+ nextId = 1;
90
+ createShell(command, workingDir) {
91
+ const shellId = `shell_${this.nextId++}`;
92
+ const shell = new BackgroundShell(shellId, command, workingDir);
93
+ this.shells.set(shellId, shell);
94
+ shell.start();
95
+ return shellId;
96
+ }
97
+ getShell(shellId) {
98
+ return this.shells.get(shellId);
99
+ }
100
+ killShell(shellId) {
101
+ const shell = this.shells.get(shellId);
102
+ if (shell) {
103
+ shell.kill();
104
+ this.shells.delete(shellId);
105
+ return true;
106
+ }
107
+ return false;
108
+ }
109
+ listShells() {
110
+ return Array.from(this.shells.keys());
111
+ }
112
+ }
113
+ // Global shell manager instance
114
+ const shellManager = new BackgroundShellManager();
115
+ /**
116
+ * Number of currently running background shells. Used by the chat-box footer.
117
+ */
118
+ export function getBackgroundShellCount() {
119
+ return shellManager.listShells().length;
120
+ }
121
+ async function execWithStreaming(command, options) {
122
+ const MAX_BUFFER_BYTES = 1_000_000; // ~1MB per stream to prevent OOM on chatty commands
123
+ return new Promise((resolve, reject) => {
124
+ const stdout = [];
125
+ const stderr = [];
126
+ let stdoutBytes = 0;
127
+ let stderrBytes = 0;
128
+ let stdoutTruncated = false;
129
+ let stderrTruncated = false;
130
+ let lineCount = 0;
131
+ let killed = false;
132
+ let earlyAbort = false;
133
+ let abortReason;
134
+ const child = spawn('bash', ['-c', command], {
135
+ cwd: options.cwd,
136
+ env: options.env,
137
+ stdio: ['ignore', 'pipe', 'pipe'],
138
+ });
139
+ const timeoutId = setTimeout(() => {
140
+ killed = true;
141
+ child.kill('SIGTERM');
142
+ setTimeout(() => child.kill('SIGKILL'), 1000);
143
+ }, options.timeout);
144
+ // Early abort function for test failures
145
+ const triggerEarlyAbort = (reason) => {
146
+ if (earlyAbort)
147
+ return; // Already aborting
148
+ earlyAbort = true;
149
+ abortReason = reason;
150
+ logDebug(`[Bash] Early abort triggered: ${reason}`);
151
+ reportToolProgress({
152
+ current: lineCount,
153
+ message: `⚡ Early abort: ${reason}`,
154
+ });
155
+ child.kill('SIGTERM');
156
+ setTimeout(() => {
157
+ if (!child.killed) {
158
+ child.kill('SIGKILL');
159
+ }
160
+ }, 2000);
161
+ };
162
+ const processLine = (line, isStderr) => {
163
+ lineCount++;
164
+ const trimmedLine = line.slice(0, 80);
165
+ reportToolProgress({
166
+ current: lineCount,
167
+ message: isStderr ? `stderr: ${trimmedLine}` : trimmedLine,
168
+ });
169
+ // Feed line to test monitor for real-time failure detection
170
+ if (options.testMonitor && !earlyAbort) {
171
+ const shouldAbort = options.testMonitor.processLine(line);
172
+ if (shouldAbort) {
173
+ const state = options.testMonitor.getState();
174
+ triggerEarlyAbort(state.abortReason || 'Test failures detected');
175
+ }
176
+ }
177
+ };
178
+ const appendChunk = (chunks, data, isStdout) => {
179
+ const byteLength = data.length;
180
+ const used = isStdout ? stdoutBytes : stderrBytes;
181
+ const available = MAX_BUFFER_BYTES - used;
182
+ if (available <= 0) {
183
+ if (isStdout)
184
+ stdoutTruncated = true;
185
+ else
186
+ stderrTruncated = true;
187
+ return;
188
+ }
189
+ const slice = byteLength > available ? data.subarray(0, available) : data;
190
+ chunks.push(slice.toString());
191
+ const consumed = slice.length; // Buffer length in bytes
192
+ if (isStdout) {
193
+ stdoutBytes += consumed;
194
+ if (byteLength > available)
195
+ stdoutTruncated = true;
196
+ }
197
+ else {
198
+ stderrBytes += consumed;
199
+ if (byteLength > available)
200
+ stderrTruncated = true;
201
+ }
202
+ };
203
+ let stdoutBuffer = '';
204
+ child.stdout?.on('data', (data) => {
205
+ const text = data.toString();
206
+ appendChunk(stdout, data, true);
207
+ stdoutBuffer += text;
208
+ if (stdoutBuffer.length > 4096) {
209
+ stdoutBuffer = stdoutBuffer.slice(-2048);
210
+ }
211
+ const lines = stdoutBuffer.split('\n');
212
+ stdoutBuffer = lines.pop() || '';
213
+ for (const line of lines) {
214
+ if (line.trim())
215
+ processLine(line, false);
216
+ }
217
+ });
218
+ let stderrBuffer = '';
219
+ child.stderr?.on('data', (data) => {
220
+ const text = data.toString();
221
+ appendChunk(stderr, data, false);
222
+ stderrBuffer += text;
223
+ if (stderrBuffer.length > 4096) {
224
+ stderrBuffer = stderrBuffer.slice(-2048);
225
+ }
226
+ const lines = stderrBuffer.split('\n');
227
+ stderrBuffer = lines.pop() || '';
228
+ for (const line of lines) {
229
+ if (line.trim())
230
+ processLine(line, true);
231
+ }
232
+ });
233
+ const buildOutput = (chunks, truncated) => {
234
+ const output = chunks.join('');
235
+ if (!truncated)
236
+ return output;
237
+ const limitKb = Math.round(MAX_BUFFER_BYTES / 1024);
238
+ const notice = `\n[output truncated after ${limitKb}KB to protect memory; rerun with narrower command to see full output]`;
239
+ return output ? `${output}${notice}` : notice.trim();
240
+ };
241
+ child.on('close', (code) => {
242
+ clearTimeout(timeoutId);
243
+ if (stdoutBuffer.trim())
244
+ processLine(stdoutBuffer, false);
245
+ if (stderrBuffer.trim())
246
+ processLine(stderrBuffer, true);
247
+ const stdoutText = buildOutput(stdout, stdoutTruncated);
248
+ const stderrText = buildOutput(stderr, stderrTruncated);
249
+ if (killed && !earlyAbort) {
250
+ reject({ killed: true, stdout: stdoutText, stderr: stderrText, code });
251
+ }
252
+ else {
253
+ const result = {
254
+ stdout: stdoutText,
255
+ stderr: stderrText,
256
+ exitCode: earlyAbort ? 1 : (code ?? 0),
257
+ };
258
+ if (earlyAbort && options.testMonitor) {
259
+ result.earlyAbort = true;
260
+ result.abortReason = abortReason;
261
+ result.abortMessage = options.testMonitor.formatAbortMessage();
262
+ }
263
+ resolve(result);
264
+ }
265
+ });
266
+ child.on('error', (error) => {
267
+ clearTimeout(timeoutId);
268
+ reject(error);
269
+ });
270
+ });
271
+ }
272
+ /**
273
+ * Execute a sudo command with password authentication
274
+ * Uses -S flag to read password from stdin
275
+ */
276
+ async function execSudoWithPassword(command, password, options) {
277
+ const MAX_BUFFER_BYTES = 1_000_000;
278
+ return new Promise((resolve, reject) => {
279
+ const stdout = [];
280
+ const stderr = [];
281
+ let stdoutBytes = 0;
282
+ let stderrBytes = 0;
283
+ let stdoutTruncated = false;
284
+ let stderrTruncated = false;
285
+ let lineCount = 0;
286
+ let killed = false;
287
+ let passwordSent = false;
288
+ // Use sudo -S to read password from stdin, -k to ignore cached credentials
289
+ // This ensures we always use our provided password
290
+ const sudoCommand = command.replace(/^\s*sudo\s+/, 'sudo -S ');
291
+ const child = spawn('bash', ['-c', sudoCommand], {
292
+ cwd: options.cwd,
293
+ env: options.env,
294
+ stdio: ['pipe', 'pipe', 'pipe'], // Connect stdin for password
295
+ });
296
+ const timeoutId = setTimeout(() => {
297
+ killed = true;
298
+ child.kill('SIGTERM');
299
+ setTimeout(() => child.kill('SIGKILL'), 1000);
300
+ }, options.timeout);
301
+ const processLine = (line, isStderr) => {
302
+ // Filter out password prompt from output
303
+ if (line.includes('[sudo] password') || line.includes('Password:')) {
304
+ return;
305
+ }
306
+ lineCount++;
307
+ const trimmedLine = line.slice(0, 80);
308
+ reportToolProgress({
309
+ current: lineCount,
310
+ message: isStderr ? `stderr: ${trimmedLine}` : trimmedLine,
311
+ });
312
+ };
313
+ const appendChunk = (chunks, data, isStdout) => {
314
+ const byteLength = data.length;
315
+ const used = isStdout ? stdoutBytes : stderrBytes;
316
+ const available = MAX_BUFFER_BYTES - used;
317
+ if (available <= 0) {
318
+ if (isStdout)
319
+ stdoutTruncated = true;
320
+ else
321
+ stderrTruncated = true;
322
+ return;
323
+ }
324
+ const slice = byteLength > available ? data.subarray(0, available) : data;
325
+ chunks.push(slice.toString());
326
+ const consumed = slice.length;
327
+ if (isStdout) {
328
+ stdoutBytes += consumed;
329
+ if (byteLength > available)
330
+ stdoutTruncated = true;
331
+ }
332
+ else {
333
+ stderrBytes += consumed;
334
+ if (byteLength > available)
335
+ stderrTruncated = true;
336
+ }
337
+ };
338
+ let stdoutBuffer = '';
339
+ child.stdout?.on('data', (data) => {
340
+ const text = data.toString();
341
+ appendChunk(stdout, data, true);
342
+ stdoutBuffer += text;
343
+ if (stdoutBuffer.length > 4096) {
344
+ stdoutBuffer = stdoutBuffer.slice(-2048);
345
+ }
346
+ const lines = stdoutBuffer.split('\n');
347
+ stdoutBuffer = lines.pop() || '';
348
+ for (const line of lines) {
349
+ if (line.trim())
350
+ processLine(line, false);
351
+ }
352
+ });
353
+ let stderrBuffer = '';
354
+ child.stderr?.on('data', (data) => {
355
+ const text = data.toString();
356
+ // Send password when sudo prompts for it
357
+ if (!passwordSent && (text.includes('[sudo] password') || text.includes('Password:'))) {
358
+ child.stdin?.write(password + '\n');
359
+ child.stdin?.end();
360
+ passwordSent = true;
361
+ reportToolProgress({ current: 0, message: '🔐 Authenticating with sudo...' });
362
+ return; // Don't add password prompt to output
363
+ }
364
+ // Filter password prompt lines from output
365
+ const filteredText = text.split('\n')
366
+ .filter(line => !line.includes('[sudo] password') && !line.includes('Password:'))
367
+ .join('\n');
368
+ if (filteredText) {
369
+ appendChunk(stderr, Buffer.from(filteredText), false);
370
+ stderrBuffer += filteredText;
371
+ if (stderrBuffer.length > 4096) {
372
+ stderrBuffer = stderrBuffer.slice(-2048);
373
+ }
374
+ const lines = stderrBuffer.split('\n');
375
+ stderrBuffer = lines.pop() || '';
376
+ for (const line of lines) {
377
+ if (line.trim())
378
+ processLine(line, true);
379
+ }
380
+ }
381
+ });
382
+ // Send password immediately after spawn for cases where prompt comes fast
383
+ setTimeout(() => {
384
+ if (!passwordSent && child.stdin?.writable) {
385
+ child.stdin?.write(password + '\n');
386
+ child.stdin?.end();
387
+ passwordSent = true;
388
+ }
389
+ }, 100);
390
+ const buildOutput = (chunks, truncated) => {
391
+ const output = chunks.join('');
392
+ // Filter out any remaining password-related lines
393
+ const filtered = output.split('\n')
394
+ .filter(line => !line.includes('[sudo] password') && !line.includes('Password:') && !line.includes('Sorry, try again'))
395
+ .join('\n');
396
+ if (!truncated)
397
+ return filtered;
398
+ const limitKb = Math.round(MAX_BUFFER_BYTES / 1024);
399
+ const notice = `\n[output truncated after ${limitKb}KB to protect memory]`;
400
+ return filtered ? `${filtered}${notice}` : notice.trim();
401
+ };
402
+ child.on('close', (code) => {
403
+ clearTimeout(timeoutId);
404
+ if (stdoutBuffer.trim())
405
+ processLine(stdoutBuffer, false);
406
+ if (stderrBuffer.trim())
407
+ processLine(stderrBuffer, true);
408
+ const stdoutText = buildOutput(stdout, stdoutTruncated);
409
+ const stderrText = buildOutput(stderr, stderrTruncated);
410
+ // Check for authentication failure
411
+ const combinedOutput = stdoutText + stderrText;
412
+ if (combinedOutput.includes('Sorry, try again') ||
413
+ combinedOutput.includes('incorrect password') ||
414
+ combinedOutput.includes('Authentication failure') ||
415
+ (code !== 0 && combinedOutput.includes('sudo:'))) {
416
+ // Invalid password - invalidate cache
417
+ invalidateSudoPassword();
418
+ }
419
+ if (killed) {
420
+ reject({ killed: true, stdout: stdoutText, stderr: stderrText, code });
421
+ }
422
+ else {
423
+ resolve({
424
+ stdout: stdoutText,
425
+ stderr: stderrText,
426
+ exitCode: code ?? 0,
427
+ });
428
+ }
429
+ });
430
+ child.on('error', (error) => {
431
+ clearTimeout(timeoutId);
432
+ reject(error);
433
+ });
434
+ });
435
+ }
436
+ // ============================================================================
437
+ // Utility Functions
438
+ // ============================================================================
439
+ // Keep the shell responsive while long commands run
440
+ function findGuiLauncher(_command) {
441
+ return null;
442
+ }
443
+ const errorFixerCache = new Map();
444
+ function getErrorFixer(workingDir) {
445
+ let fixer = errorFixerCache.get(workingDir);
446
+ if (!fixer) {
447
+ fixer = createErrorFixer({ workingDir });
448
+ errorFixerCache.set(workingDir, fixer);
449
+ }
450
+ return fixer;
451
+ }
452
+ /**
453
+ * Smart timeout detection based on command type
454
+ */
455
+ function getSmartTimeout(command) {
456
+ const cmd = command.toLowerCase().trim();
457
+ // Long-running commands that legitimately take time
458
+ if (cmd.includes('npm install') || cmd.includes('yarn install') || cmd.includes('pnpm install')) {
459
+ return 10 * 60 * 1000; // 10 minutes for package installs
460
+ }
461
+ if (cmd.includes('npm run build') || cmd.includes('yarn build') || cmd.includes('make')) {
462
+ return 10 * 60 * 1000; // 10 minutes for builds
463
+ }
464
+ if (cmd.includes('docker build') || cmd.includes('docker-compose')) {
465
+ return 15 * 60 * 1000; // 15 minutes for docker builds
466
+ }
467
+ if (cmd.includes('npm test') || cmd.includes('yarn test') || cmd.includes('pytest') || cmd.includes('jest')) {
468
+ return 10 * 60 * 1000; // 10 minutes for tests
469
+ }
470
+ if (cmd.includes('git clone') || cmd.includes('git fetch') || cmd.includes('git pull')) {
471
+ return 5 * 60 * 1000; // 5 minutes for git network ops
472
+ }
473
+ // Default timeout for most commands - prevents hung commands from blocking
474
+ return 2 * 60 * 1000; // 2 minutes default
475
+ }
476
+ const sandboxCache = new Map();
477
+ async function ensureSandboxPaths(workingDir) {
478
+ let pending = sandboxCache.get(workingDir);
479
+ if (!pending) {
480
+ pending = createSandboxPaths(workingDir);
481
+ sandboxCache.set(workingDir, pending);
482
+ }
483
+ return pending;
484
+ }
485
+ async function createSandboxPaths(workingDir) {
486
+ const root = join(workingDir, '.erosolar', 'shell-sandbox');
487
+ const home = join(root, 'home');
488
+ const cache = join(root, 'cache');
489
+ const config = join(root, 'config');
490
+ const data = join(root, 'data');
491
+ const tmp = join(root, 'tmp');
492
+ await Promise.all([home, cache, config, data, tmp].map((dir) => mkdir(dir, { recursive: true })));
493
+ return { root, home, cache, config, data, tmp };
494
+ }
495
+ /**
496
+ * Detect if a command needs access to the real home directory for cloud CLI credentials.
497
+ * Commands like firebase, gcloud, aws, az, kubectl require access to stored credentials.
498
+ */
499
+ function needsRealHome(command) {
500
+ const cloudCliPatterns = [
501
+ /\bfirebase\b/i, // Firebase CLI
502
+ /\bgcloud\b/i, // Google Cloud CLI
503
+ /\bgsutil\b/i, // Google Cloud Storage
504
+ /\baws\b/i, // AWS CLI
505
+ /\baz\b/i, // Azure CLI
506
+ /\bkubectl\b/i, // Kubernetes
507
+ /\bhelm\b/i, // Helm
508
+ /\bdocker\b/i, // Docker (for registry auth)
509
+ /\bnpm\s+publish\b/i, // npm publish (needs npm auth)
510
+ /\byarn\s+publish\b/i, // yarn publish
511
+ /\bpnpm\s+publish\b/i, // pnpm publish
512
+ /\bgh\b/i, // GitHub CLI
513
+ /\bvercel\b/i, // Vercel CLI
514
+ /\bnetlify\b/i, // Netlify CLI
515
+ /\bheroku\b/i, // Heroku CLI
516
+ /\bfly\b/i, // Fly.io CLI
517
+ /\bsupabase\b/i, // Supabase CLI
518
+ /\bwrangler\b/i, // Cloudflare Workers
519
+ ];
520
+ return cloudCliPatterns.some(pattern => pattern.test(command));
521
+ }
522
+ export async function buildSandboxEnv(workingDir, options) {
523
+ const envPreference = process.env['EROSOLAR_PRESERVE_HOME'];
524
+ // Preserve home if: env var set, option passed, or command needs cloud CLI credentials
525
+ const commandNeedsHome = options?.command ? needsRealHome(options.command) : false;
526
+ const preserveHome = envPreference === '1' ? true :
527
+ envPreference === '0' ? false :
528
+ Boolean(options?.preserveHome) || commandNeedsHome;
529
+ const paths = await ensureSandboxPaths(workingDir);
530
+ const env = {
531
+ ...process.env,
532
+ EROSOLAR_SANDBOX_ROOT: paths.root,
533
+ EROSOLAR_SANDBOX_HOME: paths.home,
534
+ EROSOLAR_SANDBOX_TMP: paths.tmp,
535
+ };
536
+ if (!preserveHome) {
537
+ env['HOME'] = paths.home;
538
+ env['XDG_CACHE_HOME'] = paths.cache;
539
+ env['XDG_CONFIG_HOME'] = paths.config;
540
+ env['XDG_DATA_HOME'] = paths.data;
541
+ }
542
+ // Always sandbox temp directories for safety
543
+ env['TMPDIR'] = paths.tmp;
544
+ env['TMP'] = paths.tmp;
545
+ env['TEMP'] = paths.tmp;
546
+ return env;
547
+ }
548
+ // ============================================================================
549
+ // Main Tool Factory
550
+ // ============================================================================
551
+ export function createBashTools(workingDir) {
552
+ return [
553
+ // Main bash execution tool
554
+ {
555
+ name: 'execute_bash',
556
+ description: 'Execute a bash command. Commands auto-timeout based on type. Use run_in_background: true for servers/watchers.',
557
+ parameters: {
558
+ type: 'object',
559
+ properties: {
560
+ command: { type: 'string', description: 'The bash command to execute' },
561
+ timeout: { type: 'number', description: 'Timeout in milliseconds (smart defaults apply)' },
562
+ run_in_background: { type: 'boolean', description: 'Run in background for long-running processes' },
563
+ },
564
+ required: ['command'],
565
+ },
566
+ handler: async (args) => {
567
+ const command = args['command'];
568
+ const runInBackground = args['run_in_background'] === true;
569
+ const userTimeout = args['timeout'];
570
+ const timeout = userTimeout ?? getSmartTimeout(command);
571
+ // Check if this is a sudo command
572
+ const isSudoCommand = /^\s*sudo\s+/i.test(command);
573
+ // Block commands that typically require passwords or interactive input (except sudo which we handle)
574
+ const interactiveCommands = /\b(passwd|su\s|login|ssh\s(?!-o)|sftp|ftp|mysql\s+-p|psql\s+-W)\b/i;
575
+ if (interactiveCommands.test(command)) {
576
+ return 'Skipped: Command requires interactive authentication. Use non-interactive alternatives.';
577
+ }
578
+ // Flow guidance (debug only - don't pollute chat)
579
+ const flowWarnings = analyzeBashFlow(command);
580
+ for (const warning of flowWarnings) {
581
+ const suffix = warning.suggestion ? ` — ${warning.suggestion}` : '';
582
+ logDebug(`[Bash Flow] ${warning.message}${suffix}`);
583
+ }
584
+ // Safety validation (informational only)
585
+ const validation = validateBashCommand(command);
586
+ if (!validation.valid) {
587
+ logDebug(`[Bash Safety] Command validation failed: ${validation.error?.message || 'Unknown error'}`);
588
+ }
589
+ // Safety warnings (debug only - don't pollute chat)
590
+ if (validation.warnings.length > 0) {
591
+ for (const warning of validation.warnings) {
592
+ logDebug(`[Bash Safety] WARNING: ${warning}`);
593
+ }
594
+ }
595
+ // GUI blocking check
596
+ const guiBlocked = findGuiLauncher(command);
597
+ if (guiBlocked) {
598
+ logDebug(`[Bash Safety] GUI launcher detected: ${guiBlocked}`);
599
+ }
600
+ // Background execution
601
+ if (runInBackground) {
602
+ const shellId = shellManager.createShell(command, workingDir);
603
+ return `Background shell started: ${shellId}\n\nUse BashOutput with bash_id="${shellId}" to monitor.\nUse KillShell with shell_id="${shellId}" to terminate.`;
604
+ }
605
+ // Foreground execution
606
+ const startTime = Date.now();
607
+ const usesRealHome = needsRealHome(command);
608
+ // Create test monitor for test commands to enable early abort on failures
609
+ const testMonitor = createTestMonitor(command);
610
+ if (testMonitor) {
611
+ logDebug(`[Bash] Test command detected, enabling failure monitoring with early abort`);
612
+ }
613
+ try {
614
+ const env = await buildSandboxEnv(workingDir, { command });
615
+ // Report sandbox status for visibility
616
+ const sandboxStatus = usesRealHome
617
+ ? `${ANSI_CYAN}🔓 Using real credentials (cloud CLI detected)${ANSI_RESET}`
618
+ : `${ANSI_DIM}🔒 Sandboxed environment${ANSI_RESET}`;
619
+ reportToolProgress({ current: 0, message: sandboxStatus });
620
+ let result;
621
+ // Handle sudo commands with password authentication
622
+ if (isSudoCommand) {
623
+ logDebug('[Bash] Sudo command detected, requesting password');
624
+ reportToolProgress({ current: 0, message: '🔐 Sudo command detected, requesting password...' });
625
+ const password = await getSudoPassword();
626
+ if (!password) {
627
+ return `${ANSI_YELLOW}Sudo command cancelled: No password provided.${ANSI_RESET}\n\nTo run this command, you need to provide your sudo password when prompted.`;
628
+ }
629
+ result = await execSudoWithPassword(command, password, { cwd: workingDir, timeout, env, testMonitor });
630
+ }
631
+ else {
632
+ result = await execWithStreaming(command, { cwd: workingDir, timeout, env, testMonitor });
633
+ }
634
+ const { stdout, stderr, exitCode, earlyAbort, abortMessage } = result;
635
+ const durationMs = Date.now() - startTime;
636
+ const combinedOutput = [stdout, stderr].filter(Boolean).join('\n');
637
+ // Handle early abort from test monitor - encourage replanning
638
+ if (earlyAbort && testMonitor) {
639
+ const state = testMonitor.getState();
640
+ const suggestions = [
641
+ 'REPLAN: Fix the identified issues before running tests again',
642
+ ...state.suggestions,
643
+ ];
644
+ return verifiedFailure(`${ANSI_YELLOW_BOLD}Test run aborted early - replan recommended${ANSI_RESET}`, `Command: ${command}\n\n${ANSI_YELLOW}The test run was stopped early to save time.${ANSI_RESET}\n\n` +
645
+ `${abortMessage || ''}\n\n` +
646
+ `${ANSI_DIM}Partial output:${ANSI_RESET}\n${combinedOutput || '(none)'}`, suggestions, [
647
+ { check: 'Early abort', passed: false, details: state.abortReason || 'Multiple test failures' },
648
+ { check: 'Failed tests', passed: false, details: `${state.failedTests.length} test file(s) failed` },
649
+ ], durationMs);
650
+ }
651
+ const commandLower = command.toLowerCase().trim();
652
+ let patterns = OutputPatterns.command;
653
+ if (commandLower.startsWith('git ') || commandLower === 'git')
654
+ patterns = OutputPatterns.git;
655
+ else if (commandLower.startsWith('npm ') || commandLower.startsWith('npx '))
656
+ patterns = OutputPatterns.npm;
657
+ const analysis = analyzeOutput(combinedOutput, patterns, exitCode);
658
+ const commandCheck = createCommandCheck('Command execution', exitCode, combinedOutput);
659
+ if (exitCode !== 0) {
660
+ const errorFixer = getErrorFixer(workingDir);
661
+ const aiErrors = errorFixer.analyzeOutput(combinedOutput, command);
662
+ const aiGuidance = aiErrors.length > 0 ? errorFixer.formatForAI(aiErrors) : '';
663
+ const suggestions = ['Review the error message', 'Fix the issue and retry'];
664
+ const firstError = aiErrors[0];
665
+ if (firstError?.suggestedFixes[0]) {
666
+ suggestions.unshift(`AI Suggestion: ${firstError.suggestedFixes[0].description}`);
667
+ }
668
+ // Add replan suggestion for test failures
669
+ if (testMonitor && testMonitor.getState().failedTests.length > 0) {
670
+ suggestions.unshift('REPLAN: Multiple test failures detected - consider fixing incrementally');
671
+ }
672
+ return verifiedFailure(`Command failed with exit code ${exitCode}`, `Command: ${command}\n\nOutput:\n${combinedOutput || '(none)'}${aiGuidance}`, suggestions, [commandCheck], durationMs);
673
+ }
674
+ if (analysis.isFailure) {
675
+ return verifiedFailure(`Command completed with exit code 0 but output indicates failure`, `Command: ${command}\n\n${ANSI_RED_BOLD}Output:${ANSI_RESET}\n${combinedOutput || '(no output)'}`, ['Review the error message in the output', 'Fix the underlying issue and retry'], [commandCheck, { check: 'Output analysis', passed: false, details: `Failure pattern: ${analysis.matchedPattern}` }], durationMs);
676
+ }
677
+ const envLabel = usesRealHome ? `${ANSI_CYAN}[real credentials]${ANSI_RESET}` : `${ANSI_DIM}[sandboxed]${ANSI_RESET}`;
678
+ return verifiedSuccess(combinedOutput.trim() ? `Command executed successfully ${envLabel}` : `Command executed successfully (no output) ${envLabel}`, `Command: ${command}${combinedOutput.trim() ? `\n\n${ANSI_GREEN_BOLD}Output:${ANSI_RESET}\n${combinedOutput}` : ''}`, [commandCheck, ...(analysis.isSuccess ? [{ check: 'Output analysis', passed: true, details: `Success pattern matched` }] : [])], durationMs);
679
+ }
680
+ catch (error) {
681
+ const execError = error;
682
+ const durationMs = Date.now() - startTime;
683
+ const exitCode = execError.code ?? 1;
684
+ const combinedError = [execError.stdout, execError.stderr, execError.message].filter(Boolean).join('\n');
685
+ if (execError.killed) {
686
+ return verifiedFailure(`Command timed out after ${timeout}ms`, `Command: ${command}\n\nPartial output:\n${combinedError || '(none)'}`, ['Increase timeout if command legitimately needs more time', 'Check if command is hanging'], [{ check: 'Timeout', passed: false, details: `Exceeded ${timeout}ms` }], durationMs);
687
+ }
688
+ const errorFixer = getErrorFixer(workingDir);
689
+ const aiErrors = errorFixer.analyzeOutput(combinedError, command);
690
+ const aiGuidance = aiErrors.length > 0 ? errorFixer.formatForAI(aiErrors) : '';
691
+ const suggestions = ['Review the error message', 'Fix the issue and retry'];
692
+ const firstError = aiErrors[0];
693
+ if (firstError?.suggestedFixes[0]) {
694
+ suggestions.unshift(`AI Suggestion: ${firstError.suggestedFixes[0].description}`);
695
+ }
696
+ return verifiedFailure(`Command failed with exit code ${exitCode}`, `Command: ${command}\n\nError output:\n${combinedError || '(none)'}${aiGuidance}`, suggestions, [createCommandCheck('Command execution', exitCode, combinedError)], durationMs);
697
+ }
698
+ },
699
+ },
700
+ // Background shell output retrieval
701
+ {
702
+ name: 'BashOutput',
703
+ description: 'Retrieve output from a running or completed background bash shell.',
704
+ parameters: {
705
+ type: 'object',
706
+ properties: {
707
+ bash_id: { type: 'string', description: 'The ID of the background shell' },
708
+ filter: { type: 'string', description: 'Optional regex to filter output lines' },
709
+ },
710
+ required: ['bash_id'],
711
+ additionalProperties: false,
712
+ },
713
+ handler: async (args) => {
714
+ const bashId = args['bash_id'];
715
+ const filterStr = args['filter'];
716
+ if (typeof bashId !== 'string' || !bashId.trim()) {
717
+ return 'Error: bash_id must be a non-empty string.';
718
+ }
719
+ try {
720
+ const shell = shellManager.getShell(bashId);
721
+ if (!shell) {
722
+ const available = shellManager.listShells();
723
+ return `Error: Shell "${bashId}" not found.\n\nAvailable: ${available.length > 0 ? available.join(', ') : 'none'}`;
724
+ }
725
+ const filter = filterStr && typeof filterStr === 'string' ? new RegExp(filterStr) : undefined;
726
+ const { stdout, stderr, status } = shell.getNewOutput(filter);
727
+ const parts = [`Shell: ${bashId}`, `Status: ${status}`];
728
+ if (stdout) {
729
+ parts.push('\n=== New Output ===');
730
+ parts.push(stdout);
731
+ }
732
+ if (stderr) {
733
+ parts.push('\n=== Errors ===');
734
+ parts.push(stderr);
735
+ }
736
+ if (!stdout && !stderr)
737
+ parts.push('\n(No new output)');
738
+ return parts.join('\n');
739
+ }
740
+ catch (error) {
741
+ return buildError('retrieving shell output', error, { bash_id: bashId });
742
+ }
743
+ },
744
+ },
745
+ // Kill background shell
746
+ {
747
+ name: 'KillShell',
748
+ description: 'Kill a running background bash shell by its ID.',
749
+ parameters: {
750
+ type: 'object',
751
+ properties: {
752
+ shell_id: { type: 'string', description: 'The ID of the background shell to kill' },
753
+ },
754
+ required: ['shell_id'],
755
+ additionalProperties: false,
756
+ },
757
+ handler: async (args) => {
758
+ const shellId = args['shell_id'];
759
+ if (typeof shellId !== 'string' || !shellId.trim()) {
760
+ return 'Error: shell_id must be a non-empty string.';
761
+ }
762
+ try {
763
+ const success = shellManager.killShell(shellId);
764
+ if (success) {
765
+ return `Shell "${shellId}" has been terminated.`;
766
+ }
767
+ else {
768
+ const available = shellManager.listShells();
769
+ return `Error: Shell "${shellId}" not found.\n\nAvailable: ${available.length > 0 ? available.join(', ') : 'none'}`;
770
+ }
771
+ }
772
+ catch (error) {
773
+ return buildError('killing shell', error, { shell_id: shellId });
774
+ }
775
+ },
776
+ },
777
+ ];
778
+ }
779
+ //# sourceMappingURL=bashTools.js.map