lonny-agent 0.2.6 → 0.2.7

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 (475) hide show
  1. package/.github/workflows/ci.yml +21 -0
  2. package/AGENTS.md +106 -0
  3. package/CHANGELOG.md +24 -0
  4. package/dist/agent/__tests__/session-restore.test.d.ts +2 -0
  5. package/dist/agent/__tests__/session-restore.test.d.ts.map +1 -0
  6. package/dist/agent/__tests__/session-restore.test.js +260 -0
  7. package/dist/agent/__tests__/session-restore.test.js.map +1 -0
  8. package/dist/agent/commands.d.ts +26 -0
  9. package/dist/agent/commands.d.ts.map +1 -0
  10. package/dist/agent/commands.js +253 -0
  11. package/dist/agent/commands.js.map +1 -0
  12. package/dist/agent/compaction.js +8 -1
  13. package/dist/agent/compaction.js.map +1 -1
  14. package/dist/agent/index.d.ts +2 -1
  15. package/dist/agent/index.d.ts.map +1 -1
  16. package/dist/agent/index.js +2 -2
  17. package/dist/agent/index.js.map +1 -1
  18. package/dist/agent/memory.d.ts +12 -0
  19. package/dist/agent/memory.d.ts.map +1 -0
  20. package/dist/agent/memory.js +51 -0
  21. package/dist/agent/memory.js.map +1 -0
  22. package/dist/agent/prompt-builder.d.ts +6 -1
  23. package/dist/agent/prompt-builder.d.ts.map +1 -1
  24. package/dist/agent/prompt-builder.js +89 -26
  25. package/dist/agent/prompt-builder.js.map +1 -1
  26. package/dist/agent/providers/openai.d.ts +1 -0
  27. package/dist/agent/providers/openai.d.ts.map +1 -1
  28. package/dist/agent/providers/openai.js +16 -3
  29. package/dist/agent/providers/openai.js.map +1 -1
  30. package/dist/agent/session-chat.d.ts +3 -0
  31. package/dist/agent/session-chat.d.ts.map +1 -0
  32. package/dist/agent/session-chat.js +384 -0
  33. package/dist/agent/session-chat.js.map +1 -0
  34. package/dist/agent/session-display.d.ts +29 -0
  35. package/dist/agent/session-display.d.ts.map +1 -0
  36. package/dist/agent/session-display.js +179 -0
  37. package/dist/agent/session-display.js.map +1 -0
  38. package/dist/agent/session-persistence.d.ts +55 -0
  39. package/dist/agent/session-persistence.d.ts.map +1 -0
  40. package/dist/agent/session-persistence.js +101 -0
  41. package/dist/agent/session-persistence.js.map +1 -0
  42. package/dist/agent/session-utils.d.ts +5 -0
  43. package/dist/agent/session-utils.d.ts.map +1 -0
  44. package/dist/agent/session-utils.js +51 -0
  45. package/dist/agent/session-utils.js.map +1 -0
  46. package/dist/agent/session.d.ts +15 -17
  47. package/dist/agent/session.d.ts.map +1 -1
  48. package/dist/agent/session.js +226 -608
  49. package/dist/agent/session.js.map +1 -1
  50. package/dist/cli/index.d.ts +4 -0
  51. package/dist/cli/index.d.ts.map +1 -1
  52. package/dist/cli/index.js +67 -2
  53. package/dist/cli/index.js.map +1 -1
  54. package/dist/config/index.d.ts +2 -2
  55. package/dist/config/index.d.ts.map +1 -1
  56. package/dist/index.js +24 -3
  57. package/dist/index.js.map +1 -1
  58. package/dist/tools/__tests__/bash.test.js +168 -1
  59. package/dist/tools/__tests__/bash.test.js.map +1 -1
  60. package/dist/tools/__tests__/edit.test.js +253 -6
  61. package/dist/tools/__tests__/edit.test.js.map +1 -1
  62. package/dist/tools/__tests__/fetch.test.js +1 -1
  63. package/dist/tools/__tests__/fetch.test.js.map +1 -1
  64. package/dist/tools/__tests__/glob.test.js +1 -1
  65. package/dist/tools/__tests__/glob.test.js.map +1 -1
  66. package/dist/tools/__tests__/grep.test.js +1 -1
  67. package/dist/tools/__tests__/grep.test.js.map +1 -1
  68. package/dist/tools/__tests__/ls.test.js +1 -1
  69. package/dist/tools/__tests__/ls.test.js.map +1 -1
  70. package/dist/tools/__tests__/read.test.js +1 -1
  71. package/dist/tools/__tests__/read.test.js.map +1 -1
  72. package/dist/tools/__tests__/registry.test.js +313 -0
  73. package/dist/tools/__tests__/registry.test.js.map +1 -1
  74. package/dist/tools/__tests__/write_plan.test.js +1 -1
  75. package/dist/tools/__tests__/write_plan.test.js.map +1 -1
  76. package/dist/tools/bash.d.ts.map +1 -1
  77. package/dist/tools/bash.js +659 -39
  78. package/dist/tools/bash.js.map +1 -1
  79. package/dist/tools/codebase/ast/__tests__/ast-edit-demo.d.ts +2 -0
  80. package/dist/tools/codebase/ast/__tests__/ast-edit-demo.d.ts.map +1 -0
  81. package/dist/tools/codebase/ast/__tests__/ast-edit-demo.js +7 -0
  82. package/dist/tools/codebase/ast/__tests__/ast-edit-demo.js.map +1 -0
  83. package/dist/tools/codebase/ast/__tests__/ast-edit-final.d.ts +6 -0
  84. package/dist/tools/codebase/ast/__tests__/ast-edit-final.d.ts.map +1 -0
  85. package/dist/tools/codebase/ast/__tests__/ast-edit-final.js +11 -0
  86. package/dist/tools/codebase/ast/__tests__/ast-edit-final.js.map +1 -0
  87. package/dist/tools/codebase/ast/__tests__/ast-edit-test.d.ts +2 -0
  88. package/dist/tools/codebase/ast/__tests__/ast-edit-test.d.ts.map +1 -0
  89. package/dist/tools/codebase/ast/__tests__/ast-edit-test.js +9 -0
  90. package/dist/tools/codebase/ast/__tests__/ast-edit-test.js.map +1 -0
  91. package/dist/tools/codebase/ast/__tests__/integration.test.d.ts +2 -0
  92. package/dist/tools/codebase/ast/__tests__/integration.test.d.ts.map +1 -0
  93. package/dist/tools/codebase/ast/__tests__/integration.test.js +415 -0
  94. package/dist/tools/codebase/ast/__tests__/integration.test.js.map +1 -0
  95. package/dist/tools/codebase/ast/__tests__/tree-sitter.test.d.ts +2 -0
  96. package/dist/tools/codebase/ast/__tests__/tree-sitter.test.d.ts.map +1 -0
  97. package/dist/tools/codebase/ast/__tests__/tree-sitter.test.js +414 -0
  98. package/dist/tools/codebase/ast/__tests__/tree-sitter.test.js.map +1 -0
  99. package/dist/tools/codebase/ast/adapter.d.ts +23 -0
  100. package/dist/tools/codebase/ast/adapter.d.ts.map +1 -0
  101. package/dist/tools/codebase/ast/adapter.js +11 -0
  102. package/dist/tools/codebase/ast/adapter.js.map +1 -0
  103. package/dist/tools/codebase/ast/tools.d.ts +3 -0
  104. package/dist/tools/codebase/ast/tools.d.ts.map +1 -0
  105. package/dist/tools/codebase/ast/tools.js +286 -0
  106. package/dist/tools/codebase/ast/tools.js.map +1 -0
  107. package/dist/tools/codebase/ast/tree-sitter-adapter.d.ts +3 -0
  108. package/dist/tools/codebase/ast/tree-sitter-adapter.d.ts.map +1 -0
  109. package/dist/tools/codebase/ast/tree-sitter-adapter.js +412 -0
  110. package/dist/tools/codebase/ast/tree-sitter-adapter.js.map +1 -0
  111. package/dist/tools/codebase/ast/tree-sitter-converters.d.ts +4 -0
  112. package/dist/tools/codebase/ast/tree-sitter-converters.d.ts.map +1 -0
  113. package/dist/tools/codebase/ast/tree-sitter-converters.js +447 -0
  114. package/dist/tools/codebase/ast/tree-sitter-converters.js.map +1 -0
  115. package/dist/tools/codebase/ast/types.d.ts +103 -0
  116. package/dist/tools/codebase/ast/types.d.ts.map +1 -0
  117. package/dist/tools/codebase/ast/types.js +2 -0
  118. package/dist/tools/codebase/ast/types.js.map +1 -0
  119. package/dist/tools/codebase/ast/wasm/tree-sitter-python.wasm +0 -0
  120. package/dist/tools/codebase/ast/wasm/tree-sitter-tsx.wasm +0 -0
  121. package/dist/tools/codebase/ast/wasm/tree-sitter-typescript.wasm +0 -0
  122. package/dist/tools/codebase/ast/wasm/tree-sitter.wasm +0 -0
  123. package/dist/tools/codebase/ast/wasm/web-tree-sitter.wasm +0 -0
  124. package/dist/tools/codebase/find.d.ts +3 -0
  125. package/dist/tools/codebase/find.d.ts.map +1 -0
  126. package/dist/tools/codebase/find.js +61 -0
  127. package/dist/tools/codebase/find.js.map +1 -0
  128. package/dist/tools/codebase/glob.d.ts +3 -0
  129. package/dist/tools/codebase/glob.d.ts.map +1 -0
  130. package/dist/tools/codebase/glob.js +37 -0
  131. package/dist/tools/codebase/glob.js.map +1 -0
  132. package/dist/tools/codebase/grep.d.ts +3 -0
  133. package/dist/tools/codebase/grep.d.ts.map +1 -0
  134. package/dist/tools/codebase/grep.js +169 -0
  135. package/dist/tools/codebase/grep.js.map +1 -0
  136. package/dist/tools/codebase/ls.d.ts +3 -0
  137. package/dist/tools/codebase/ls.d.ts.map +1 -0
  138. package/dist/tools/codebase/ls.js +39 -0
  139. package/dist/tools/codebase/ls.js.map +1 -0
  140. package/dist/tools/codebase/read.d.ts +10 -0
  141. package/dist/tools/codebase/read.d.ts.map +1 -0
  142. package/dist/tools/codebase/read.js +81 -0
  143. package/dist/tools/codebase/read.js.map +1 -0
  144. package/dist/tools/delete_memory.d.ts +3 -0
  145. package/dist/tools/delete_memory.d.ts.map +1 -0
  146. package/dist/tools/delete_memory.js +46 -0
  147. package/dist/tools/delete_memory.js.map +1 -0
  148. package/dist/tools/edit/diff-compute.d.ts +4 -0
  149. package/dist/tools/edit/diff-compute.d.ts.map +1 -0
  150. package/dist/tools/edit/diff-compute.js +18 -0
  151. package/dist/tools/edit/diff-compute.js.map +1 -0
  152. package/dist/tools/edit/diff-render.d.ts +18 -0
  153. package/dist/tools/edit/diff-render.d.ts.map +1 -0
  154. package/dist/tools/edit/diff-render.js +128 -0
  155. package/dist/tools/edit/diff-render.js.map +1 -0
  156. package/dist/tools/edit/edit.d.ts +4 -0
  157. package/dist/tools/edit/edit.d.ts.map +1 -0
  158. package/dist/tools/edit/edit.js +440 -0
  159. package/dist/tools/edit/edit.js.map +1 -0
  160. package/dist/tools/edit/matcher.d.ts +24 -0
  161. package/dist/tools/edit/matcher.d.ts.map +1 -0
  162. package/dist/tools/edit/matcher.js +66 -0
  163. package/dist/tools/edit/matcher.js.map +1 -0
  164. package/dist/tools/edit/parser.d.ts +10 -0
  165. package/dist/tools/edit/parser.d.ts.map +1 -0
  166. package/dist/tools/edit/parser.js +120 -0
  167. package/dist/tools/edit/parser.js.map +1 -0
  168. package/dist/tools/edit/types.d.ts +16 -0
  169. package/dist/tools/edit/types.d.ts.map +1 -0
  170. package/dist/tools/edit/types.js +2 -0
  171. package/dist/tools/edit/types.js.map +1 -0
  172. package/dist/tools/edit/write_plan.d.ts +5 -0
  173. package/dist/tools/edit/write_plan.d.ts.map +1 -0
  174. package/dist/tools/edit/write_plan.js +98 -0
  175. package/dist/tools/edit/write_plan.js.map +1 -0
  176. package/dist/tools/edit.d.ts.map +1 -1
  177. package/dist/tools/edit.js +66 -1
  178. package/dist/tools/edit.js.map +1 -1
  179. package/dist/tools/execute/bash/constants.d.ts +24 -0
  180. package/dist/tools/execute/bash/constants.d.ts.map +1 -0
  181. package/dist/tools/execute/bash/constants.js +88 -0
  182. package/dist/tools/execute/bash/constants.js.map +1 -0
  183. package/dist/tools/execute/bash/errors.d.ts +39 -0
  184. package/dist/tools/execute/bash/errors.d.ts.map +1 -0
  185. package/dist/tools/execute/bash/errors.js +249 -0
  186. package/dist/tools/execute/bash/errors.js.map +1 -0
  187. package/dist/tools/execute/bash/execution.d.ts +18 -0
  188. package/dist/tools/execute/bash/execution.d.ts.map +1 -0
  189. package/dist/tools/execute/bash/execution.js +207 -0
  190. package/dist/tools/execute/bash/execution.js.map +1 -0
  191. package/dist/tools/execute/bash/index.d.ts +3 -0
  192. package/dist/tools/execute/bash/index.d.ts.map +1 -0
  193. package/dist/tools/execute/bash/index.js +117 -0
  194. package/dist/tools/execute/bash/index.js.map +1 -0
  195. package/dist/tools/execute/bash/platform.d.ts +6 -0
  196. package/dist/tools/execute/bash/platform.d.ts.map +1 -0
  197. package/dist/tools/execute/bash/platform.js +64 -0
  198. package/dist/tools/execute/bash/platform.js.map +1 -0
  199. package/dist/tools/execute/bash/security.d.ts +12 -0
  200. package/dist/tools/execute/bash/security.d.ts.map +1 -0
  201. package/dist/tools/execute/bash/security.js +26 -0
  202. package/dist/tools/execute/bash/security.js.map +1 -0
  203. package/dist/tools/execute/bash/validation.d.ts +16 -0
  204. package/dist/tools/execute/bash/validation.d.ts.map +1 -0
  205. package/dist/tools/execute/bash/validation.js +57 -0
  206. package/dist/tools/execute/bash/validation.js.map +1 -0
  207. package/dist/tools/execute/bash.d.ts +3 -0
  208. package/dist/tools/execute/bash.d.ts.map +1 -0
  209. package/dist/tools/execute/bash.js +728 -0
  210. package/dist/tools/execute/bash.js.map +1 -0
  211. package/dist/tools/execute/git.d.ts +3 -0
  212. package/dist/tools/execute/git.d.ts.map +1 -0
  213. package/dist/tools/execute/git.js +183 -0
  214. package/dist/tools/execute/git.js.map +1 -0
  215. package/dist/tools/execute/task_complete.d.ts +7 -0
  216. package/dist/tools/execute/task_complete.d.ts.map +1 -0
  217. package/dist/tools/execute/task_complete.js +38 -0
  218. package/dist/tools/execute/task_complete.js.map +1 -0
  219. package/dist/tools/fetch.d.ts.map +1 -1
  220. package/dist/tools/fetch.js +2 -0
  221. package/dist/tools/fetch.js.map +1 -1
  222. package/dist/tools/find.d.ts.map +1 -1
  223. package/dist/tools/find.js +2 -0
  224. package/dist/tools/find.js.map +1 -1
  225. package/dist/tools/git.d.ts.map +1 -1
  226. package/dist/tools/git.js +2 -0
  227. package/dist/tools/git.js.map +1 -1
  228. package/dist/tools/glob.d.ts.map +1 -1
  229. package/dist/tools/glob.js +2 -0
  230. package/dist/tools/glob.js.map +1 -1
  231. package/dist/tools/grep.d.ts.map +1 -1
  232. package/dist/tools/grep.js +2 -0
  233. package/dist/tools/grep.js.map +1 -1
  234. package/dist/tools/install/clawhub.d.ts +26 -0
  235. package/dist/tools/install/clawhub.d.ts.map +1 -0
  236. package/dist/tools/install/clawhub.js +182 -0
  237. package/dist/tools/install/clawhub.js.map +1 -0
  238. package/dist/tools/install/constants.d.ts +5 -0
  239. package/dist/tools/install/constants.d.ts.map +1 -0
  240. package/dist/tools/install/constants.js +5 -0
  241. package/dist/tools/install/constants.js.map +1 -0
  242. package/dist/tools/install/install_skill.d.ts +3 -0
  243. package/dist/tools/install/install_skill.d.ts.map +1 -0
  244. package/dist/tools/install/install_skill.js +132 -0
  245. package/dist/tools/install/install_skill.js.map +1 -0
  246. package/dist/tools/install/npm.d.ts +8 -0
  247. package/dist/tools/install/npm.d.ts.map +1 -0
  248. package/dist/tools/install/npm.js +52 -0
  249. package/dist/tools/install/npm.js.map +1 -0
  250. package/dist/tools/install/skill-content.d.ts +9 -0
  251. package/dist/tools/install/skill-content.d.ts.map +1 -0
  252. package/dist/tools/install/skill-content.js +89 -0
  253. package/dist/tools/install/skill-content.js.map +1 -0
  254. package/dist/tools/install_skill.d.ts.map +1 -1
  255. package/dist/tools/install_skill.js +2 -0
  256. package/dist/tools/install_skill.js.map +1 -1
  257. package/dist/tools/list_memory.d.ts +3 -0
  258. package/dist/tools/list_memory.d.ts.map +1 -0
  259. package/dist/tools/list_memory.js +55 -0
  260. package/dist/tools/list_memory.js.map +1 -0
  261. package/dist/tools/ls.d.ts.map +1 -1
  262. package/dist/tools/ls.js +2 -0
  263. package/dist/tools/ls.js.map +1 -1
  264. package/dist/tools/memory/delete_memory.d.ts +3 -0
  265. package/dist/tools/memory/delete_memory.d.ts.map +1 -0
  266. package/dist/tools/memory/delete_memory.js +46 -0
  267. package/dist/tools/memory/delete_memory.js.map +1 -0
  268. package/dist/tools/memory/list_memory.d.ts +3 -0
  269. package/dist/tools/memory/list_memory.d.ts.map +1 -0
  270. package/dist/tools/memory/list_memory.js +55 -0
  271. package/dist/tools/memory/list_memory.js.map +1 -0
  272. package/dist/tools/memory/save_memory.d.ts +3 -0
  273. package/dist/tools/memory/save_memory.d.ts.map +1 -0
  274. package/dist/tools/memory/save_memory.js +45 -0
  275. package/dist/tools/memory/save_memory.js.map +1 -0
  276. package/dist/tools/read.d.ts.map +1 -1
  277. package/dist/tools/read.js +2 -0
  278. package/dist/tools/read.js.map +1 -1
  279. package/dist/tools/registry.d.ts +7 -2
  280. package/dist/tools/registry.d.ts.map +1 -1
  281. package/dist/tools/registry.js +112 -17
  282. package/dist/tools/registry.js.map +1 -1
  283. package/dist/tools/save_memory.d.ts +3 -0
  284. package/dist/tools/save_memory.d.ts.map +1 -0
  285. package/dist/tools/save_memory.js +45 -0
  286. package/dist/tools/save_memory.js.map +1 -0
  287. package/dist/tools/search.d.ts.map +1 -1
  288. package/dist/tools/search.js +2 -0
  289. package/dist/tools/search.js.map +1 -1
  290. package/dist/tools/tree.d.ts +12 -0
  291. package/dist/tools/tree.d.ts.map +1 -0
  292. package/dist/tools/tree.js +87 -0
  293. package/dist/tools/tree.js.map +1 -0
  294. package/dist/tools/types.d.ts +12 -0
  295. package/dist/tools/types.d.ts.map +1 -1
  296. package/dist/tools/web/fetch.d.ts +3 -0
  297. package/dist/tools/web/fetch.d.ts.map +1 -0
  298. package/dist/tools/web/fetch.js +49 -0
  299. package/dist/tools/web/fetch.js.map +1 -0
  300. package/dist/tools/web/search.d.ts +3 -0
  301. package/dist/tools/web/search.d.ts.map +1 -0
  302. package/dist/tools/web/search.js +134 -0
  303. package/dist/tools/web/search.js.map +1 -0
  304. package/dist/tools/write_plan.d.ts.map +1 -1
  305. package/dist/tools/write_plan.js +2 -0
  306. package/dist/tools/write_plan.js.map +1 -1
  307. package/dist/tui/commands.d.ts +4 -0
  308. package/dist/tui/commands.d.ts.map +1 -0
  309. package/dist/tui/commands.js +118 -0
  310. package/dist/tui/commands.js.map +1 -0
  311. package/dist/tui/components/colors.d.ts +36 -0
  312. package/dist/tui/components/colors.d.ts.map +1 -0
  313. package/dist/tui/components/colors.js +48 -0
  314. package/dist/tui/components/colors.js.map +1 -0
  315. package/dist/tui/components/header-bar.d.ts +26 -0
  316. package/dist/tui/components/header-bar.d.ts.map +1 -0
  317. package/dist/tui/components/header-bar.js +78 -0
  318. package/dist/tui/components/header-bar.js.map +1 -0
  319. package/dist/tui/components/index.d.ts +9 -0
  320. package/dist/tui/components/index.d.ts.map +1 -0
  321. package/dist/tui/components/index.js +9 -0
  322. package/dist/tui/components/index.js.map +1 -0
  323. package/dist/tui/components/landing-screen.d.ts +12 -0
  324. package/dist/tui/components/landing-screen.d.ts.map +1 -0
  325. package/dist/tui/components/landing-screen.js +53 -0
  326. package/dist/tui/components/landing-screen.js.map +1 -0
  327. package/dist/tui/components/pixel-logo.d.ts +5 -0
  328. package/dist/tui/components/pixel-logo.d.ts.map +1 -0
  329. package/dist/tui/components/pixel-logo.js +27 -0
  330. package/dist/tui/components/pixel-logo.js.map +1 -0
  331. package/dist/tui/components/plan-utils.d.ts +11 -0
  332. package/dist/tui/components/plan-utils.d.ts.map +1 -0
  333. package/dist/tui/components/plan-utils.js +62 -0
  334. package/dist/tui/components/plan-utils.js.map +1 -0
  335. package/dist/tui/components/plans-list.d.ts +18 -0
  336. package/dist/tui/components/plans-list.d.ts.map +1 -0
  337. package/dist/tui/components/plans-list.js +46 -0
  338. package/dist/tui/components/plans-list.js.map +1 -0
  339. package/dist/tui/components/rich-footer.d.ts +29 -0
  340. package/dist/tui/components/rich-footer.d.ts.map +1 -0
  341. package/dist/tui/components/rich-footer.js +124 -0
  342. package/dist/tui/components/rich-footer.js.map +1 -0
  343. package/dist/tui/components/todo-panel.d.ts +14 -0
  344. package/dist/tui/components/todo-panel.d.ts.map +1 -0
  345. package/dist/tui/components/todo-panel.js +83 -0
  346. package/dist/tui/components/todo-panel.js.map +1 -0
  347. package/dist/tui/components.d.ts.map +1 -1
  348. package/dist/tui/components.js +14 -7
  349. package/dist/tui/components.js.map +1 -1
  350. package/dist/tui/index.d.ts +2 -1
  351. package/dist/tui/index.d.ts.map +1 -1
  352. package/dist/tui/index.js +99 -505
  353. package/dist/tui/index.js.map +1 -1
  354. package/dist/tui/overlays.d.ts +28 -0
  355. package/dist/tui/overlays.d.ts.map +1 -0
  356. package/dist/tui/overlays.js +154 -0
  357. package/dist/tui/overlays.js.map +1 -0
  358. package/dist/tui/themes.d.ts +5 -0
  359. package/dist/tui/themes.d.ts.map +1 -0
  360. package/dist/tui/themes.js +38 -0
  361. package/dist/tui/themes.js.map +1 -0
  362. package/dist/web/index.d.ts.map +1 -1
  363. package/dist/web/index.js +60 -122
  364. package/dist/web/index.js.map +1 -1
  365. package/dist/web/public/index.html +1 -1
  366. package/dist/web/public/messages.js +41 -25
  367. package/dist/web/public/state.js +72 -72
  368. package/dist/web/public/style.css +1126 -996
  369. package/dist/web/public/websocket.js +267 -267
  370. package/dist/web/session-bridge.d.ts.map +1 -1
  371. package/dist/web/session-bridge.js +82 -3
  372. package/dist/web/session-bridge.js.map +1 -1
  373. package/docs/ast-tools.md +117 -0
  374. package/package.json +60 -55
  375. package/scripts/check-line-count.mjs +53 -0
  376. package/scripts/copy-ast-wasm.mjs +32 -0
  377. package/src/agent/__tests__/session-restore.test.ts +284 -0
  378. package/src/agent/commands.ts +274 -0
  379. package/src/agent/compaction.ts +9 -2
  380. package/src/agent/index.ts +30 -25
  381. package/src/agent/memory.ts +60 -0
  382. package/src/agent/prompt-builder.ts +100 -26
  383. package/src/agent/providers/anthropic.ts +179 -179
  384. package/src/agent/providers/google.ts +210 -210
  385. package/src/agent/providers/ollama.ts +186 -186
  386. package/src/agent/providers/openai.ts +18 -3
  387. package/src/agent/session-chat.ts +480 -0
  388. package/src/agent/session-display.ts +195 -0
  389. package/src/agent/session-persistence.ts +146 -0
  390. package/src/agent/session-utils.ts +54 -0
  391. package/src/agent/session.ts +261 -718
  392. package/src/cli/index.ts +73 -4
  393. package/src/config/index.ts +342 -342
  394. package/src/index.ts +30 -3
  395. package/src/tools/__tests__/bash.test.ts +187 -1
  396. package/src/tools/__tests__/edit.test.ts +275 -11
  397. package/src/tools/__tests__/fetch.test.ts +1 -1
  398. package/src/tools/__tests__/glob.test.ts +1 -1
  399. package/src/tools/__tests__/grep.test.ts +1 -1
  400. package/src/tools/__tests__/ls.test.ts +1 -1
  401. package/src/tools/__tests__/read.test.ts +1 -1
  402. package/src/tools/__tests__/registry.test.ts +332 -0
  403. package/src/tools/__tests__/write_plan.test.ts +1 -1
  404. package/src/tools/codebase/ast/__tests__/integration.test.ts +452 -0
  405. package/src/tools/codebase/ast/__tests__/tree-sitter.test.ts +466 -0
  406. package/src/tools/codebase/ast/adapter.ts +44 -0
  407. package/src/tools/codebase/ast/tools.ts +322 -0
  408. package/src/tools/codebase/ast/tree-sitter-adapter.ts +468 -0
  409. package/src/tools/codebase/ast/tree-sitter-converters.ts +480 -0
  410. package/src/tools/codebase/ast/types.ts +102 -0
  411. package/src/tools/codebase/ast/wasm/tree-sitter-python.wasm +0 -0
  412. package/src/tools/codebase/ast/wasm/tree-sitter-tsx.wasm +0 -0
  413. package/src/tools/codebase/ast/wasm/tree-sitter-typescript.wasm +0 -0
  414. package/src/tools/codebase/ast/wasm/tree-sitter.wasm +0 -0
  415. package/src/tools/codebase/ast/wasm/web-tree-sitter.wasm +0 -0
  416. package/src/tools/{find.ts → codebase/find.ts} +4 -2
  417. package/src/tools/{glob.ts → codebase/glob.ts} +4 -2
  418. package/src/tools/{grep.ts → codebase/grep.ts} +4 -2
  419. package/src/tools/{ls.ts → codebase/ls.ts} +4 -2
  420. package/src/tools/{read.ts → codebase/read.ts} +5 -3
  421. package/src/tools/edit/diff-compute.ts +21 -0
  422. package/src/tools/edit/diff-render.ts +145 -0
  423. package/src/tools/edit/edit.ts +468 -0
  424. package/src/tools/edit/matcher.ts +70 -0
  425. package/src/tools/edit/parser.ts +131 -0
  426. package/src/tools/edit/types.ts +19 -0
  427. package/src/tools/{write_plan.ts → edit/write_plan.ts} +4 -2
  428. package/src/tools/execute/bash/constants.ts +93 -0
  429. package/src/tools/execute/bash/errors.ts +304 -0
  430. package/src/tools/execute/bash/execution.ts +211 -0
  431. package/src/tools/execute/bash/index.ts +131 -0
  432. package/src/tools/execute/bash/platform.ts +65 -0
  433. package/src/tools/execute/bash/security.ts +28 -0
  434. package/src/tools/execute/bash/validation.ts +78 -0
  435. package/src/tools/execute/git.ts +209 -0
  436. package/src/tools/execute/task_complete.ts +40 -0
  437. package/src/tools/install/clawhub.ts +222 -0
  438. package/src/tools/install/constants.ts +4 -0
  439. package/src/tools/install/install_skill.ts +150 -0
  440. package/src/tools/install/npm.ts +60 -0
  441. package/src/tools/install/skill-content.ts +108 -0
  442. package/src/tools/memory/delete_memory.ts +46 -0
  443. package/src/tools/memory/list_memory.ts +53 -0
  444. package/src/tools/memory/save_memory.ts +45 -0
  445. package/src/tools/registry.ts +119 -19
  446. package/src/tools/tree.ts +103 -0
  447. package/src/tools/types.ts +13 -0
  448. package/src/tools/{fetch.ts → web/fetch.ts} +4 -2
  449. package/src/tools/{search.ts → web/search.ts} +4 -2
  450. package/src/tui/commands.ts +135 -0
  451. package/src/tui/components/colors.ts +52 -0
  452. package/src/tui/components/header-bar.ts +88 -0
  453. package/src/tui/components/index.ts +8 -0
  454. package/src/tui/components/landing-screen.ts +67 -0
  455. package/src/tui/components/pixel-logo.ts +33 -0
  456. package/src/tui/components/plan-utils.ts +69 -0
  457. package/src/tui/components/plans-list.ts +55 -0
  458. package/src/tui/components/rich-footer.ts +146 -0
  459. package/src/tui/components/todo-panel.ts +95 -0
  460. package/src/tui/index.ts +335 -786
  461. package/src/tui/overlays.ts +203 -0
  462. package/src/tui/themes.ts +41 -0
  463. package/src/web/index.ts +64 -127
  464. package/src/web/public/index.html +1 -1
  465. package/src/web/public/messages.js +41 -25
  466. package/src/web/public/state.js +72 -72
  467. package/src/web/public/style.css +1126 -996
  468. package/src/web/public/websocket.js +267 -267
  469. package/src/web/session-bridge.ts +272 -193
  470. package/AGENT.md +0 -99
  471. package/src/tools/bash.ts +0 -125
  472. package/src/tools/edit.ts +0 -747
  473. package/src/tools/git.ts +0 -76
  474. package/src/tools/install_skill.ts +0 -539
  475. package/src/tui/components.ts +0 -635
@@ -0,0 +1,88 @@
1
+ /** Maximum output length (chars) to prevent context overflow. */
2
+ export const MAX_OUTPUT_LENGTH = 10_000;
3
+ /** Maximum stderr length included in error messages */
4
+ export const MAX_ERROR_LENGTH = 2_000;
5
+ /** Maximum allowed timeout (10 minutes) */
6
+ export const MAX_TIMEOUT = 600_000;
7
+ /** Minimum allowed timeout (100ms) */
8
+ export const MIN_TIMEOUT = 100;
9
+ /** Default timeout (2 minutes) */
10
+ export const DEFAULT_TIMEOUT = 120_000;
11
+ /**
12
+ * Patterns that indicate a destructive command.
13
+ * If matched, the tool will warn the user instead of executing.
14
+ */
15
+ export const DESTRUCTIVE_PATTERNS = [
16
+ // ═══════════════════════
17
+ // Unix destructive
18
+ // ═══════════════════════
19
+ { regex: /\brm\s+-(?:rf|fr)\s+\/$/i, hint: 'rm -rf / would destroy the system' },
20
+ { regex: /\brm\s+-(?:rf|fr)\s+\/\*/i, hint: 'rm -rf /* would destroy the system' },
21
+ { regex: /\brm\s+-(?:rf|fr)\s+~$/i, hint: 'rm -rf ~ would delete the home directory' },
22
+ { regex: /\b(?:mkfs|dd)\s+(?:\/dev|\\.)/i, hint: 'mkfs/dd would destroy a disk device' },
23
+ { regex: /\bchmod\s+-R\s+0{4}\b/, hint: 'chmod -R 0000 would make files inaccessible' },
24
+ {
25
+ regex: /\b(?:shutdown|reboot|halt|poweroff)\s+(?:-h|-r|-now|now)\b/i,
26
+ hint: 'shutdown/reboot would halt the system',
27
+ },
28
+ {
29
+ regex: /\b(?:killall|pkill)\s+-9\s+/i,
30
+ hint: 'killall -9 would terminate all matching processes',
31
+ },
32
+ // ═══════════════════════
33
+ // Windows destructive
34
+ // ═══════════════════════
35
+ {
36
+ regex: /\b(?:Remove-Item|rmdir|rd)\s+.*(?:-Recurse|-R)\s+.*(?:-Force|-F)\b/i,
37
+ hint: 'recursive force delete would destroy data',
38
+ },
39
+ {
40
+ regex: /\b(?:Remove-Item|rmdir|rd)\s+\w:\s*[\\/]/i,
41
+ hint: 'recursive delete on drive root would destroy data',
42
+ },
43
+ {
44
+ regex: /\b(?:del|erase)\s+.*(?:\/F|\/S)\b/i,
45
+ hint: 'force delete would destroy files irreversibly',
46
+ },
47
+ { regex: /\bformat\s+\w:\s*\/[Qq]/i, hint: 'format would destroy a drive' },
48
+ { regex: /\b(?:diskpart|clean-all)\b/i, hint: 'diskpart clean-all would destroy all partitions' },
49
+ { regex: /\bClear-Item\s+/i, hint: 'Clear-Item would delete content irreversibly' },
50
+ { regex: /\bClear-Content\s+/i, hint: 'Clear-Content would delete file content irreversibly' },
51
+ { regex: /\bRemove-ItemProperty\s+/i, hint: 'Remove-ItemProperty would delete registry keys' },
52
+ { regex: /\bRemove-Variable\s+-Force\b/i, hint: 'Remove-Variable -Force would delete variables' },
53
+ { regex: /\breg\s+delete\s+/i, hint: 'reg delete would destroy registry entries' },
54
+ { regex: /\bwmic\s+\w+\s+delete\b/i, hint: 'wmic delete would destroy system resources' },
55
+ { regex: /\b(?:cipher|sdelete)\s+\/w:/i, hint: 'secure delete would irreversibly wipe data' },
56
+ {
57
+ regex: /\[System\.IO\.Directory\]::Delete\s*\(/i,
58
+ hint: 'Directory.Delete would destroy data irreversibly',
59
+ },
60
+ {
61
+ regex: /\[System\.IO\.File\]::Delete\s*\(/i,
62
+ hint: 'File.Delete would destroy data irreversibly',
63
+ },
64
+ ];
65
+ /**
66
+ * Patterns that match sensitive data (API keys, tokens, passwords, etc.)
67
+ * in command output. Matching content is replaced with "[REDACTED]".
68
+ */
69
+ export const SENSITIVE_PATTERNS = [
70
+ // Generic API keys / tokens
71
+ /(?:api[_-]?key|apikey|token|secret|password|passwd|credential|auth[_-]?token)[=:]\s*['"]?[A-Za-z0-9_\-.]{16,}/gi,
72
+ // AWS keys
73
+ /(?:AKIA[0-9A-Z]{16}|[A-Za-z0-9+/]{40}\s*=[=]{0,2})/g,
74
+ // GitHub tokens
75
+ /gh[pousr]_[A-Za-z0-9_]{36,}/g,
76
+ // npm tokens
77
+ /npm_[A-Za-z0-9]{36,}/g,
78
+ // Slack tokens
79
+ /xox[baprs]-[A-Za-z0-9-]{24,}/g,
80
+ // SSH private key content (multi-line)
81
+ /-----BEGIN[ A-Z]+PRIVATE KEY-----[\s\S]*?-----END[ A-Z]+PRIVATE KEY-----/g,
82
+ // JWT tokens
83
+ /eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g,
84
+ // Generic password-like strings in env vars
85
+ /export\s+\w*(?:PASS|SECRET|TOKEN|KEY)\w*\s*=\s*['"]?\S+['"]?/gi,
86
+ /\$env:\w*(?:PASS|SECRET|TOKEN|KEY)\w*\s*=\s*['"]?\S+['"]?/gi,
87
+ ];
88
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/tools/execute/bash/constants.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAA;AAEvC,uDAAuD;AACvD,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAA;AAErC,2CAA2C;AAC3C,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAA;AAElC,sCAAsC;AACtC,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAA;AAE9B,kCAAkC;AAClC,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAA;AAEtC;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAsC;IACrE,0BAA0B;IAC1B,mBAAmB;IACnB,0BAA0B;IAC1B,EAAE,KAAK,EAAE,0BAA0B,EAAE,IAAI,EAAE,mCAAmC,EAAE;IAChF,EAAE,KAAK,EAAE,2BAA2B,EAAE,IAAI,EAAE,oCAAoC,EAAE;IAClF,EAAE,KAAK,EAAE,yBAAyB,EAAE,IAAI,EAAE,0CAA0C,EAAE;IACtF,EAAE,KAAK,EAAE,gCAAgC,EAAE,IAAI,EAAE,qCAAqC,EAAE;IACxF,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,6CAA6C,EAAE;IACvF;QACE,KAAK,EAAE,6DAA6D;QACpE,IAAI,EAAE,uCAAuC;KAC9C;IACD;QACE,KAAK,EAAE,8BAA8B;QACrC,IAAI,EAAE,mDAAmD;KAC1D;IACD,0BAA0B;IAC1B,sBAAsB;IACtB,0BAA0B;IAC1B;QACE,KAAK,EAAE,qEAAqE;QAC5E,IAAI,EAAE,2CAA2C;KAClD;IACD;QACE,KAAK,EAAE,2CAA2C;QAClD,IAAI,EAAE,mDAAmD;KAC1D;IACD;QACE,KAAK,EAAE,oCAAoC;QAC3C,IAAI,EAAE,+CAA+C;KACtD;IACD,EAAE,KAAK,EAAE,0BAA0B,EAAE,IAAI,EAAE,8BAA8B,EAAE;IAC3E,EAAE,KAAK,EAAE,6BAA6B,EAAE,IAAI,EAAE,iDAAiD,EAAE;IACjG,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,8CAA8C,EAAE;IACnF,EAAE,KAAK,EAAE,qBAAqB,EAAE,IAAI,EAAE,sDAAsD,EAAE;IAC9F,EAAE,KAAK,EAAE,2BAA2B,EAAE,IAAI,EAAE,gDAAgD,EAAE;IAC9F,EAAE,KAAK,EAAE,+BAA+B,EAAE,IAAI,EAAE,+CAA+C,EAAE;IACjG,EAAE,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE,2CAA2C,EAAE;IAClF,EAAE,KAAK,EAAE,0BAA0B,EAAE,IAAI,EAAE,4CAA4C,EAAE;IACzF,EAAE,KAAK,EAAE,8BAA8B,EAAE,IAAI,EAAE,4CAA4C,EAAE;IAC7F;QACE,KAAK,EAAE,yCAAyC;QAChD,IAAI,EAAE,kDAAkD;KACzD;IACD;QACE,KAAK,EAAE,oCAAoC;QAC3C,IAAI,EAAE,6CAA6C;KACpD;CACF,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAa;IAC1C,4BAA4B;IAC5B,iHAAiH;IACjH,WAAW;IACX,qDAAqD;IACrD,gBAAgB;IAChB,8BAA8B;IAC9B,aAAa;IACb,uBAAuB;IACvB,eAAe;IACf,+BAA+B;IAC/B,uCAAuC;IACvC,2EAA2E;IAC3E,aAAa;IACb,gEAAgE;IAChE,4CAA4C;IAC5C,gEAAgE;IAChE,6DAA6D;CAC9D,CAAA"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Truncate a string to maxLength chars. If truncated, appends a warning.
3
+ * Returns the (possibly truncated) string.
4
+ */
5
+ declare function truncateOutput(s: string, maxLength: number, label: string): string;
6
+ /**
7
+ * Check if stderr contains PowerShell NativeCommandError wrapping.
8
+ * This happens when a native command (like git push) writes to stderr and
9
+ * PowerShell wraps the output in an ErrorRecord format even though the
10
+ * command exited successfully (exit code 0).
11
+ *
12
+ * Example format:
13
+ * git : Everything up-to-date
14
+ * At line:1 char:1
15
+ * + git push 2>&1
16
+ * + ~~~~~~~~~~~~~
17
+ * + CategoryInfo : NotSpecified: (...) [], RemoteException
18
+ * + FullyQualifiedErrorId : NativeCommandError
19
+ *
20
+ * Returns the extracted actual output if detected, null otherwise.
21
+ */
22
+ declare function extractPowerShellNativeOutput(stderr: string): string | null;
23
+ /**
24
+ * Check if stderr indicates common PowerShell errors and return a helpful message.
25
+ * Returns a tip string if detected, null otherwise.
26
+ */
27
+ declare function checkPowerShellError(stderr: string, command: string): string | null;
28
+ /**
29
+ * Check if stderr output indicates a "command not found" error.
30
+ * Returns a platform-appropriate suggestion if detected, null otherwise.
31
+ */
32
+ declare function checkCommandNotFound(stderr: string, command: string): string | null;
33
+ /**
34
+ * Build a helpful error message for a failed command, including
35
+ * platform-specific suggestions when applicable.
36
+ */
37
+ declare function buildErrorMsg(exitCode: number, stderr: string, command: string, timedOut: boolean, cwd?: string): string;
38
+ export { buildErrorMsg, checkCommandNotFound, checkPowerShellError, extractPowerShellNativeOutput, truncateOutput };
39
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/tools/execute/bash/errors.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,iBAAS,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAK3E;AAED;;;;;;;;;;;;;;;GAeG;AACH,iBAAS,6BAA6B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAuCpE;AAED;;;GAGG;AACH,iBAAS,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwC5E;AAED;;;GAGG;AACH,iBAAS,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA8B5E;AAED;;;GAGG;AACH,iBAAS,aAAa,CACpB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,OAAO,EACjB,GAAG,CAAC,EAAE,MAAM,GACX,MAAM,CAkIR;AAED,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,6BAA6B,EAAE,cAAc,EAAE,CAAA"}
@@ -0,0 +1,249 @@
1
+ import * as os from 'node:os';
2
+ import { MAX_ERROR_LENGTH } from './constants.js';
3
+ import { redactSensitive } from './security.js';
4
+ /**
5
+ * Truncate a string to maxLength chars. If truncated, appends a warning.
6
+ * Returns the (possibly truncated) string.
7
+ */
8
+ function truncateOutput(s, maxLength, label) {
9
+ if (s.length <= maxLength)
10
+ return s;
11
+ const truncated = s.slice(0, maxLength);
12
+ const warning = `\n... [${label} truncated at ${maxLength} chars, original ${s.length} chars]`;
13
+ return truncated + warning;
14
+ }
15
+ /**
16
+ * Check if stderr contains PowerShell NativeCommandError wrapping.
17
+ * This happens when a native command (like git push) writes to stderr and
18
+ * PowerShell wraps the output in an ErrorRecord format even though the
19
+ * command exited successfully (exit code 0).
20
+ *
21
+ * Example format:
22
+ * git : Everything up-to-date
23
+ * At line:1 char:1
24
+ * + git push 2>&1
25
+ * + ~~~~~~~~~~~~~
26
+ * + CategoryInfo : NotSpecified: (...) [], RemoteException
27
+ * + FullyQualifiedErrorId : NativeCommandError
28
+ *
29
+ * Returns the extracted actual output if detected, null otherwise.
30
+ */
31
+ function extractPowerShellNativeOutput(stderr) {
32
+ // Detect PowerShell ErrorRecord wrapping around native command stderr output.
33
+ // The key marker is "FullyQualifiedErrorId : NativeCommandError".
34
+ if (!/FullyQualifiedErrorId\s*:\s*NativeCommandError/i.test(stderr)) {
35
+ return null;
36
+ }
37
+ const lines = stderr.split(/\r?\n/);
38
+ const outputLines = [];
39
+ for (const line of lines) {
40
+ const trimmed = line.trim();
41
+ // Skip PowerShell error record wrapper lines:
42
+ // " + CategoryInfo : ..." (indented, with +)
43
+ // " + FullyQualifiedErrorId : ..."
44
+ // "At line:1 char:1" or Chinese garbled equivalent
45
+ // "+ command ..." (the command echo line with leading +)
46
+ // " + ~~~~~~~~~~~~~" (the caret underline)
47
+ if (/^\s*\+/.test(trimmed) ||
48
+ /^At\s+line:\d+/i.test(trimmed) ||
49
+ /^\+?\s*CategoryInfo/i.test(trimmed) ||
50
+ /^\+?\s*FullyQualifiedErrorId/i.test(trimmed)) {
51
+ continue;
52
+ }
53
+ // Skip blank lines within the error record block (but keep leading whitespace for formatting)
54
+ if (!trimmed && outputLines.length > 0) {
55
+ continue;
56
+ }
57
+ // Remove leading whitespace from the first content line (the "<command> : <message>" line)
58
+ outputLines.push(line);
59
+ }
60
+ const result = outputLines.join('\n').trim();
61
+ return result || null;
62
+ }
63
+ /**
64
+ * Check if stderr indicates common PowerShell errors and return a helpful message.
65
+ * Returns a tip string if detected, null otherwise.
66
+ */
67
+ function checkPowerShellError(stderr, command) {
68
+ const errLower = stderr.toLowerCase();
69
+ // Execution policy errors
70
+ if (/execution.?policy/i.test(errLower) || /running scripts is disabled/i.test(errLower)) {
71
+ return 'PowerShell execution policy is blocking this command. Try: `powershell -ExecutionPolicy Bypass -Command "..."`';
72
+ }
73
+ // Module not found
74
+ if (/module.*not (found|available)/i.test(errLower) ||
75
+ /could not (find|load).*module/i.test(errLower)) {
76
+ const moduleMatch = stderr.match(/module\s+['"]?(\w+)['"]?/i);
77
+ const moduleName = moduleMatch ? moduleMatch[1] : '<unknown>';
78
+ return `PowerShell module not found: "${moduleName}". Install it with: Install-Module ${moduleName} -Force`;
79
+ }
80
+ // Cmdlet not found
81
+ if (/the term '(\w+)' is not recognized/i.test(errLower)) {
82
+ const cmdMatch = stderr.match(/the term '(\w+)'/i);
83
+ const cmdName = cmdMatch ? cmdMatch[1] : command.split(/\s+/)[0] || command;
84
+ return `Cmdlet not found: "${cmdName}". This command may need a module or be installed separately.`;
85
+ }
86
+ // Access denied
87
+ if (/access is denied/i.test(errLower) ||
88
+ /permission denied/i.test(errLower) ||
89
+ /unauthorized/i.test(errLower)) {
90
+ return 'Access denied. Try running as Administrator (on Windows) or using sudo (on Unix).';
91
+ }
92
+ // Path not found
93
+ if (/cannot find (path|drive)/i.test(errLower) || /path.*does not exist/i.test(errLower)) {
94
+ return 'The specified path or drive was not found. Check that the path exists and is accessible.';
95
+ }
96
+ return null;
97
+ }
98
+ /**
99
+ * Check if stderr output indicates a "command not found" error.
100
+ * Returns a platform-appropriate suggestion if detected, null otherwise.
101
+ */
102
+ function checkCommandNotFound(stderr, command) {
103
+ const isWindows = os.platform() === 'win32';
104
+ const errLower = stderr.toLowerCase();
105
+ if (isWindows) {
106
+ // PowerShell "not recognized" patterns
107
+ if (/not recognized/.test(errLower) ||
108
+ /is not recognized/.test(errLower) ||
109
+ /找不到/.test(errLower) ||
110
+ /command not found/.test(errLower) ||
111
+ /not found/.test(errLower) ||
112
+ /neither the command nor/.test(errLower)) {
113
+ // Extract the command name that wasn't found (first word of the command)
114
+ const cmdName = command.split(/\s+/)[0] || command;
115
+ return `Command not found: "${cmdName}". It may be a Unix command not available on Windows. Use "where" to find available commands or use PowerShell-native alternatives.`;
116
+ }
117
+ }
118
+ else {
119
+ // Unix "not found" patterns
120
+ if (/not found/.test(errLower) ||
121
+ /command not found/.test(errLower) ||
122
+ /no such file/.test(errLower)) {
123
+ const cmdName = command.split(/\s+/)[0] || command;
124
+ return `Command not found: "${cmdName}". Check that it is installed, or use "which ${cmdName}" to find its location.`;
125
+ }
126
+ }
127
+ return null;
128
+ }
129
+ /**
130
+ * Build a helpful error message for a failed command, including
131
+ * platform-specific suggestions when applicable.
132
+ */
133
+ function buildErrorMsg(exitCode, stderr, command, timedOut, cwd) {
134
+ const parts = [];
135
+ if (timedOut) {
136
+ parts.push(`Command timed out (exit code ${exitCode})`);
137
+ }
138
+ else {
139
+ parts.push(`Command exited with code ${exitCode}`);
140
+ }
141
+ // Check for "command not found" first (before including full stderr)
142
+ const notFoundMsg = checkCommandNotFound(stderr, command);
143
+ if (notFoundMsg) {
144
+ parts.push(notFoundMsg);
145
+ }
146
+ // Check for common PowerShell errors
147
+ if (os.platform() === 'win32') {
148
+ const psErrMsg = checkPowerShellError(stderr, command);
149
+ if (psErrMsg) {
150
+ parts.push(psErrMsg);
151
+ }
152
+ }
153
+ // Include stderr content (truncated and redacted)
154
+ const stderrTrimmed = stderr.trim();
155
+ if (stderrTrimmed) {
156
+ const redactedStderr = redactSensitive(stderrTrimmed);
157
+ parts.push(`stderr:\n${truncateOutput(redactedStderr, MAX_ERROR_LENGTH, 'stderr')}`);
158
+ }
159
+ // Platform-specific suggestions for common mistakes
160
+ const isWindows = os.platform() === 'win32';
161
+ if (isWindows) {
162
+ // Common Windows command mistakes
163
+ if (/ls\b/.test(command) && !/ls\b/.test(command.replace(/".*"/g, ''))) {
164
+ parts.push('💡 Tip: On Windows, use `dir` instead of `ls`, or `Get-ChildItem` in PowerShell.');
165
+ }
166
+ if (/grep\b/.test(command)) {
167
+ parts.push('💡 Tip: On Windows, use `findstr` or `Select-String` instead of `grep`.');
168
+ }
169
+ if (/touch\b/.test(command)) {
170
+ parts.push('💡 Tip: On Windows, `touch` is not available. Use `New-Item` or `edit` tool to create files.');
171
+ }
172
+ if (/ps\b/.test(command)) {
173
+ parts.push('💡 Tip: On Windows, use `Get-Process` instead of `ps` for listing processes.');
174
+ }
175
+ if (/pwd\b/.test(command)) {
176
+ parts.push('💡 Tip: On Windows, use `Get-Location` or `$pwd` instead of `pwd`.');
177
+ }
178
+ if (/chmod\b/.test(command) ||
179
+ /cp\b/.test(command) ||
180
+ /mv\b/.test(command) ||
181
+ /rm\b/.test(command) ||
182
+ /mkdir\b/.test(command)) {
183
+ parts.push('💡 Tip: On Windows, use native equivalents: `copy`, `move`, `del`, `mkdir`, `icacls` instead of Unix commands.');
184
+ }
185
+ if (/cat\b/.test(command)) {
186
+ parts.push('💡 Tip: On Windows, use `type` or `Get-Content` instead of `cat`.');
187
+ }
188
+ if (/which\b/.test(command)) {
189
+ parts.push('💡 Tip: On Windows, use `where` instead of `which` to find executable locations.');
190
+ }
191
+ if (/less\b/.test(command) || /more\b/.test(command)) {
192
+ parts.push('💡 Tip: On Windows, use `more` or `Out-Host -Paging` for paging output.');
193
+ }
194
+ if (/sort\b/.test(command) && !/sort-object/i.test(command) && !/Sort-Object/i.test(command)) {
195
+ parts.push('💡 Tip: On Windows, use `Sort-Object` instead of `sort`.');
196
+ }
197
+ if (/head\b/.test(command)) {
198
+ parts.push('💡 Tip: On Windows, use `Select-Object -First` instead of `head`.');
199
+ }
200
+ if (/tail\b/.test(command)) {
201
+ parts.push('💡 Tip: On Windows, use `Get-Content -Tail` or `Select-Object -Last` instead of `tail`.');
202
+ }
203
+ if (/diff\b/.test(command) || /cmp\b/.test(command)) {
204
+ parts.push('💡 Tip: On Windows, use `Compare-Object` instead of `diff`/`cmp`.');
205
+ }
206
+ if (/curl\b/.test(command) && !/curl\b/.test(command.replace(/".*"/g, ''))) {
207
+ parts.push('💡 Tip: On Windows, use `Invoke-WebRequest` or `Invoke-RestMethod` instead of `curl`. curl is available in newer Windows builds.');
208
+ }
209
+ if (/wget\b/.test(command)) {
210
+ parts.push('💡 Tip: On Windows, use `Invoke-WebRequest` instead of `wget`.');
211
+ }
212
+ if (/env\b/.test(command)) {
213
+ parts.push('💡 Tip: On Windows, use `Get-ChildItem Env:` to list environment variables.');
214
+ }
215
+ if (/kill\b/.test(command) && !/stop-process/i.test(command)) {
216
+ parts.push('💡 Tip: On Windows, use `Stop-Process` or `taskkill` instead of `kill`.');
217
+ }
218
+ }
219
+ else {
220
+ // Unix-specific tips
221
+ if (/dir\b/.test(command)) {
222
+ parts.push('💡 Tip: On Unix, use `ls -la` instead of `dir`.');
223
+ }
224
+ if (/findstr\b/.test(command)) {
225
+ parts.push('💡 Tip: On Unix, use `grep` instead of `findstr`.');
226
+ }
227
+ if (/type\b/.test(command) && !/type\b/.test(command.replace(/".*"/g, ''))) {
228
+ parts.push('💡 Tip: On Unix, use `cat` instead of `type`.');
229
+ }
230
+ if (/where\b/.test(command)) {
231
+ parts.push('💡 Tip: On Unix, use `which` instead of `where` to find executable locations.');
232
+ }
233
+ if (/copy\b/.test(command)) {
234
+ parts.push('💡 Tip: On Unix, use `cp` instead of `copy`.');
235
+ }
236
+ if (/move\b/.test(command) || /ren\b/.test(command)) {
237
+ parts.push('💡 Tip: On Unix, use `mv` instead of `move`/`ren`.');
238
+ }
239
+ if (/del\b/.test(command)) {
240
+ parts.push('💡 Tip: On Unix, use `rm` instead of `del`.');
241
+ }
242
+ }
243
+ if (cwd) {
244
+ parts.push(`Working directory: ${cwd}`);
245
+ }
246
+ return parts.join('\n');
247
+ }
248
+ export { buildErrorMsg, checkCommandNotFound, checkPowerShellError, extractPowerShellNativeOutput, truncateOutput };
249
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/tools/execute/bash/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAE7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAE/C;;;GAGG;AACH,SAAS,cAAc,CAAC,CAAS,EAAE,SAAiB,EAAE,KAAa;IACjE,IAAI,CAAC,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,CAAC,CAAA;IACnC,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;IACvC,MAAM,OAAO,GAAG,UAAU,KAAK,iBAAiB,SAAS,oBAAoB,CAAC,CAAC,MAAM,SAAS,CAAA;IAC9F,OAAO,SAAS,GAAG,OAAO,CAAA;AAC5B,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,SAAS,6BAA6B,CAAC,MAAc;IACnD,8EAA8E;IAC9E,kEAAkE;IAClE,IAAI,CAAC,iDAAiD,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACpE,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACnC,MAAM,WAAW,GAAa,EAAE,CAAA;IAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAE3B,8CAA8C;QAC9C,2DAA2D;QAC3D,uCAAuC;QACvC,qDAAqD;QACrD,2DAA2D;QAC3D,8CAA8C;QAC9C,IACE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YACtB,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC;YAC/B,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC;YACpC,+BAA+B,CAAC,IAAI,CAAC,OAAO,CAAC,EAC7C,CAAC;YACD,SAAQ;QACV,CAAC;QAED,8FAA8F;QAC9F,IAAI,CAAC,OAAO,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvC,SAAQ;QACV,CAAC;QAED,2FAA2F;QAC3F,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA;IAC5C,OAAO,MAAM,IAAI,IAAI,CAAA;AACvB,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAAC,MAAc,EAAE,OAAe;IAC3D,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,EAAE,CAAA;IAErC,0BAA0B;IAC1B,IAAI,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,8BAA8B,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzF,OAAO,gHAAgH,CAAA;IACzH,CAAC;IAED,mBAAmB;IACnB,IACE,gCAAgC,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC/C,gCAAgC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAC/C,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAA;QAC7D,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,WAAW,CAAA;QAC9D,OAAO,iCAAiC,UAAU,sCAAsC,UAAU,SAAS,CAAA;IAC7G,CAAC;IAED,mBAAmB;IACnB,IAAI,qCAAqC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;QAClD,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAA;QAC5E,OAAO,sBAAsB,OAAO,+DAA+D,CAAA;IACrG,CAAC;IAED,gBAAgB;IAChB,IACE,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAClC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC;QACnC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,EAC9B,CAAC;QACD,OAAO,mFAAmF,CAAA;IAC5F,CAAC;IAED,iBAAiB;IACjB,IAAI,2BAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzF,OAAO,0FAA0F,CAAA;IACnG,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAAC,MAAc,EAAE,OAAe;IAC3D,MAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAA;IAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,EAAE,CAAA;IAErC,IAAI,SAAS,EAAE,CAAC;QACd,uCAAuC;QACvC,IACE,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC/B,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;YACpB,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAClC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC1B,yBAAyB,CAAC,IAAI,CAAC,QAAQ,CAAC,EACxC,CAAC;YACD,yEAAyE;YACzE,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAA;YAClD,OAAO,uBAAuB,OAAO,qIAAqI,CAAA;QAC5K,CAAC;IACH,CAAC;SAAM,CAAC;QACN,4BAA4B;QAC5B,IACE,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC1B,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAClC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAC7B,CAAC;YACD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAA;YAClD,OAAO,uBAAuB,OAAO,gDAAgD,OAAO,yBAAyB,CAAA;QACvH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CACpB,QAAgB,EAChB,MAAc,EACd,OAAe,EACf,QAAiB,EACjB,GAAY;IAEZ,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,CAAC,IAAI,CAAC,gCAAgC,QAAQ,GAAG,CAAC,CAAA;IACzD,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAA;IACpD,CAAC;IAED,qEAAqE;IACrE,MAAM,WAAW,GAAG,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACzD,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IACzB,CAAC;IAED,qCAAqC;IACrC,IAAI,EAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACtD,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACtB,CAAC;IACH,CAAC;IAED,kDAAkD;IAClD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,EAAE,CAAA;IACnC,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,cAAc,GAAG,eAAe,CAAC,aAAa,CAAC,CAAA;QACrD,KAAK,CAAC,IAAI,CAAC,YAAY,cAAc,CAAC,cAAc,EAAE,gBAAgB,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAA;IACtF,CAAC;IAED,oDAAoD;IACpD,MAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAA;IAE3C,IAAI,SAAS,EAAE,CAAC;QACd,kCAAkC;QAClC,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;YACvE,KAAK,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAA;QAChG,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAA;QACvF,CAAC;QACD,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CACR,8FAA8F,CAC/F,CAAA;QACH,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAA;QAC5F,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAA;QAClF,CAAC;QACD,IACE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YACpB,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EACvB,CAAC;YACD,KAAK,CAAC,IAAI,CACR,gHAAgH,CACjH,CAAA;QACH,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAA;QACjF,CAAC;QACD,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAA;QAChG,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACrD,KAAK,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAA;QACvF,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7F,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAA;QACxE,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAA;QACjF,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CACR,yFAAyF,CAC1F,CAAA;QACH,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACpD,KAAK,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAA;QACjF,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;YAC3E,KAAK,CAAC,IAAI,CACR,kIAAkI,CACnI,CAAA;QACH,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAA;QAC9E,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAA;QAC3F,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7D,KAAK,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAA;QACvF,CAAC;IACH,CAAC;SAAM,CAAC;QACN,qBAAqB;QACrB,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;QAC/D,CAAC;QACD,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAA;QACjE,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;YAC3E,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAA;QAC7D,CAAC;QACD,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAA;QAC7F,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAA;QAC5D,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACpD,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAA;QAClE,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAA;QAC3D,CAAC;IACH,CAAC;IAED,IAAI,GAAG,EAAE,CAAC;QACR,KAAK,CAAC,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAA;IACzC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,6BAA6B,EAAE,cAAc,EAAE,CAAA"}
@@ -0,0 +1,18 @@
1
+ import type { ChildProcess } from 'node:child_process';
2
+ interface ExecResult {
3
+ stdout: string;
4
+ stderr: string;
5
+ exitCode: number;
6
+ timedOut: boolean;
7
+ }
8
+ /**
9
+ * Kill a child process tree reliably across platforms.
10
+ * - On Windows: uses `taskkill /F /T` for force-kill of the process tree when possible.
11
+ * - On Unix: sends SIGTERM first, then SIGKILL after a grace period.
12
+ * - Handles missing pid and protects against thrown errors.
13
+ */
14
+ declare function killProcess(child: ChildProcess): NodeJS.Timeout | undefined;
15
+ declare function execCommand(command: string, timeout: number, cwd?: string): Promise<ExecResult>;
16
+ export type { ExecResult };
17
+ export { execCommand, killProcess };
18
+ //# sourceMappingURL=execution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../../../src/tools/execute/bash/execution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAQtD,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED;;;;;GAKG;AACH,iBAAS,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAAC,OAAO,GAAG,SAAS,CA4DpE;AAED,iBAAS,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA4HxF;AAED,YAAY,EAAE,UAAU,EAAE,CAAA;AAC1B,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,CAAA"}
@@ -0,0 +1,207 @@
1
+ import { execSync, spawn } from 'node:child_process';
2
+ import * as os from 'node:os';
3
+ import { fmtErr } from '../../errors.js';
4
+ import { MAX_ERROR_LENGTH, MAX_OUTPUT_LENGTH } from './constants.js';
5
+ import { ENCODING } from './platform.js';
6
+ /**
7
+ * Kill a child process tree reliably across platforms.
8
+ * - On Windows: uses `taskkill /F /T` for force-kill of the process tree when possible.
9
+ * - On Unix: sends SIGTERM first, then SIGKILL after a grace period.
10
+ * - Handles missing pid and protects against thrown errors.
11
+ */
12
+ function killProcess(child) {
13
+ try {
14
+ if (!child || typeof child.pid !== 'number' || Number.isNaN(child.pid)) {
15
+ // Best-effort kill if pid is not available
16
+ try {
17
+ child.kill();
18
+ }
19
+ catch {
20
+ /* ignore */
21
+ }
22
+ return undefined;
23
+ }
24
+ if (os.platform() === 'win32') {
25
+ try {
26
+ // Use taskkill to terminate the whole process tree. If it fails, fall back to child.kill().
27
+ execSync(`taskkill /F /T /PID ${child.pid}`, {
28
+ stdio: 'ignore',
29
+ timeout: 3000,
30
+ });
31
+ }
32
+ catch {
33
+ try {
34
+ child.kill();
35
+ }
36
+ catch {
37
+ /* ignore */
38
+ }
39
+ }
40
+ return undefined;
41
+ }
42
+ else {
43
+ try {
44
+ child.kill('SIGTERM');
45
+ }
46
+ catch {
47
+ /* ignore */
48
+ }
49
+ // Track timer so we can force-KILL after a grace period
50
+ const killTimer = setTimeout(() => {
51
+ try {
52
+ child.kill('SIGKILL');
53
+ }
54
+ catch {
55
+ /* already exited or cannot kill */
56
+ }
57
+ }, 5000);
58
+ // Ensure we clean up the timer and the listener when the child exits
59
+ const onExit = () => {
60
+ try {
61
+ clearTimeout(killTimer);
62
+ }
63
+ catch {
64
+ /* ignore */
65
+ }
66
+ try {
67
+ child.removeListener('exit', onExit);
68
+ }
69
+ catch {
70
+ /* ignore */
71
+ }
72
+ };
73
+ child.on('exit', onExit);
74
+ return killTimer;
75
+ }
76
+ }
77
+ catch {
78
+ return undefined;
79
+ }
80
+ }
81
+ function execCommand(command, timeout, cwd) {
82
+ return new Promise(resolve => {
83
+ const isWindows = os.platform() === 'win32';
84
+ const shellExe = isWindows ? 'powershell.exe' : process.env.SHELL || '/bin/sh';
85
+ const shellArgs = isWindows
86
+ ? ['-NoProfile', '-NonInteractive', '-Command', command]
87
+ : ['-c', command];
88
+ // Protect against spawn throwing synchronously (e.g. missing shell)
89
+ let child;
90
+ try {
91
+ child = spawn(shellExe, shellArgs, {
92
+ cwd: cwd || process.cwd(),
93
+ env: { ...process.env, FORCE_COLOR: '0', NO_COLOR: '1' },
94
+ windowsHide: true,
95
+ });
96
+ }
97
+ catch (err) {
98
+ // Return a normalized error result rather than throwing
99
+ resolve({ stdout: '', stderr: fmtErr(err), exitCode: 1, timedOut: false });
100
+ return;
101
+ }
102
+ let stdout = '';
103
+ let stderr = '';
104
+ let timedOut = false;
105
+ // Keep memory bounded by limiting how much we accumulate for each stream
106
+ const MAX_STDOUT_BUFFER = Math.max(MAX_OUTPUT_LENGTH * 2, 20000);
107
+ const MAX_STDERR_BUFFER = Math.max(MAX_ERROR_LENGTH * 2, 4000);
108
+ let stdoutTruncated = false;
109
+ let stderrTruncated = false;
110
+ // Track which encodings work for each stream (per-chunk fallback).
111
+ let stdoutEncoding;
112
+ let stderrEncoding;
113
+ let treeKillTimer;
114
+ const timer = setTimeout(() => {
115
+ timedOut = true;
116
+ // Attempt to kill the process tree; capture any returned timer so we can clear it on close
117
+ treeKillTimer = killProcess(child);
118
+ }, timeout);
119
+ child.stdout?.on('data', (data) => {
120
+ if (stdout.length >= MAX_STDOUT_BUFFER) {
121
+ stdoutTruncated = true;
122
+ return;
123
+ }
124
+ try {
125
+ const enc = stdoutEncoding || ENCODING;
126
+ stdout += data.toString(enc);
127
+ stdoutEncoding = enc;
128
+ }
129
+ catch {
130
+ // Detected encoding failed; fall back to utf-8
131
+ try {
132
+ stdout += data.toString('utf-8');
133
+ stdoutEncoding = 'utf-8';
134
+ }
135
+ catch {
136
+ // Give up on this chunk
137
+ }
138
+ }
139
+ });
140
+ child.stderr?.on('data', (data) => {
141
+ if (stderr.length >= MAX_STDERR_BUFFER) {
142
+ stderrTruncated = true;
143
+ return;
144
+ }
145
+ try {
146
+ const enc = stderrEncoding || ENCODING;
147
+ stderr += data.toString(enc);
148
+ stderrEncoding = enc;
149
+ }
150
+ catch {
151
+ try {
152
+ stderr += data.toString('utf-8');
153
+ stderrEncoding = 'utf-8';
154
+ }
155
+ catch {
156
+ // ignore
157
+ }
158
+ }
159
+ });
160
+ const finish = (code) => {
161
+ try {
162
+ clearTimeout(timer);
163
+ }
164
+ catch {
165
+ /* ignore */
166
+ }
167
+ if (treeKillTimer) {
168
+ try {
169
+ clearTimeout(treeKillTimer);
170
+ }
171
+ catch {
172
+ /* ignore */
173
+ }
174
+ }
175
+ // If we truncated during streaming, append a short notice so final output can indicate truncation
176
+ if (stdoutTruncated)
177
+ stdout += '\n... [stdout truncated due to size limit]';
178
+ if (stderrTruncated)
179
+ stderr += '\n... [stderr truncated due to size limit]';
180
+ resolve({ stdout, stderr, exitCode: code ?? 0, timedOut });
181
+ };
182
+ child.on('close', code => finish(code));
183
+ child.on('error', err => {
184
+ try {
185
+ clearTimeout(timer);
186
+ }
187
+ catch {
188
+ /* ignore */
189
+ }
190
+ if (treeKillTimer) {
191
+ try {
192
+ clearTimeout(treeKillTimer);
193
+ }
194
+ catch {
195
+ /* ignore */
196
+ }
197
+ }
198
+ // Include the spawn error message in stderr so callers can surface it
199
+ const errMsg = fmtErr(err);
200
+ if (errMsg)
201
+ stderr += (stderr ? '\n' : '') + errMsg;
202
+ resolve({ stdout, stderr, exitCode: 1, timedOut });
203
+ });
204
+ });
205
+ }
206
+ export { execCommand, killProcess };
207
+ //# sourceMappingURL=execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution.js","sourceRoot":"","sources":["../../../../src/tools/execute/bash/execution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Tool } from '../../types.js';
2
+ export declare const bashTool: Tool;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tools/execute/bash/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,gBAAgB,CAAA;AAQtD,eAAO,MAAM,QAAQ,EAAE,IA2HtB,CAAA"}