@compass-ai/nova 1.0.73 → 1.0.74

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 (973) hide show
  1. package/dist/acp/agent.d.ts +318 -0
  2. package/dist/acp/agent.d.ts.map +1 -0
  3. package/dist/acp/agent.js +795 -0
  4. package/dist/acp/agent.js.map +1 -0
  5. package/dist/acp/backpressure-writer.d.ts +49 -0
  6. package/dist/acp/backpressure-writer.d.ts.map +1 -0
  7. package/dist/acp/backpressure-writer.js +153 -0
  8. package/dist/acp/backpressure-writer.js.map +1 -0
  9. package/dist/acp/event-adapter.d.ts +242 -0
  10. package/dist/acp/event-adapter.d.ts.map +1 -0
  11. package/dist/acp/event-adapter.js +456 -0
  12. package/dist/acp/event-adapter.js.map +1 -0
  13. package/dist/acp/index.d.ts +30 -0
  14. package/dist/acp/index.d.ts.map +1 -0
  15. package/dist/acp/index.js +36 -0
  16. package/dist/acp/index.js.map +1 -0
  17. package/dist/acp/modes.d.ts +56 -0
  18. package/dist/acp/modes.d.ts.map +1 -0
  19. package/dist/acp/modes.js +135 -0
  20. package/dist/acp/modes.js.map +1 -0
  21. package/dist/acp/session-manager.d.ts +170 -0
  22. package/dist/acp/session-manager.d.ts.map +1 -0
  23. package/dist/acp/session-manager.js +381 -0
  24. package/dist/acp/session-manager.js.map +1 -0
  25. package/dist/acp/text-coalescer.d.ts +45 -0
  26. package/dist/acp/text-coalescer.d.ts.map +1 -0
  27. package/dist/acp/text-coalescer.js +110 -0
  28. package/dist/acp/text-coalescer.js.map +1 -0
  29. package/dist/acp/tool-bridge.d.ts +156 -0
  30. package/dist/acp/tool-bridge.d.ts.map +1 -0
  31. package/dist/acp/tool-bridge.js +381 -0
  32. package/dist/acp/tool-bridge.js.map +1 -0
  33. package/dist/acp/types.d.ts +314 -0
  34. package/dist/acp/types.d.ts.map +1 -0
  35. package/dist/acp/types.js +8 -0
  36. package/dist/acp/types.js.map +1 -0
  37. package/dist/cli.d.ts +9 -0
  38. package/dist/cli.d.ts.map +1 -0
  39. package/dist/cli.js +185 -184
  40. package/dist/cli.js.map +1 -0
  41. package/dist/commands/acp.d.ts +26 -0
  42. package/dist/commands/acp.d.ts.map +1 -0
  43. package/dist/commands/acp.js +492 -0
  44. package/dist/commands/acp.js.map +1 -0
  45. package/dist/commands/cache.d.ts +33 -0
  46. package/dist/commands/cache.d.ts.map +1 -0
  47. package/dist/commands/cache.js +537 -0
  48. package/dist/commands/cache.js.map +1 -0
  49. package/dist/commands/config.d.ts +10 -0
  50. package/dist/commands/config.d.ts.map +1 -0
  51. package/dist/commands/config.js +367 -0
  52. package/dist/commands/config.js.map +1 -0
  53. package/dist/commands/consent.d.ts +21 -0
  54. package/dist/commands/consent.d.ts.map +1 -0
  55. package/dist/commands/consent.js +334 -0
  56. package/dist/commands/consent.js.map +1 -0
  57. package/dist/commands/data.d.ts +24 -0
  58. package/dist/commands/data.d.ts.map +1 -0
  59. package/dist/commands/data.js +586 -0
  60. package/dist/commands/data.js.map +1 -0
  61. package/dist/commands/index.d.ts +145 -0
  62. package/dist/commands/index.d.ts.map +1 -0
  63. package/dist/commands/index.js +210 -0
  64. package/dist/commands/index.js.map +1 -0
  65. package/dist/commands/init.d.ts +106 -0
  66. package/dist/commands/init.d.ts.map +1 -0
  67. package/dist/commands/init.js +349 -0
  68. package/dist/commands/init.js.map +1 -0
  69. package/dist/commands/logs.d.ts +13 -0
  70. package/dist/commands/logs.d.ts.map +1 -0
  71. package/dist/commands/logs.js +359 -0
  72. package/dist/commands/logs.js.map +1 -0
  73. package/dist/commands/mcp.d.ts +20 -0
  74. package/dist/commands/mcp.d.ts.map +1 -0
  75. package/dist/commands/mcp.js +687 -0
  76. package/dist/commands/mcp.js.map +1 -0
  77. package/dist/commands/reset.d.ts +20 -0
  78. package/dist/commands/reset.d.ts.map +1 -0
  79. package/dist/commands/reset.js +372 -0
  80. package/dist/commands/reset.js.map +1 -0
  81. package/dist/commands/setup.d.ts +74 -0
  82. package/dist/commands/setup.d.ts.map +1 -0
  83. package/dist/commands/setup.js +863 -0
  84. package/dist/commands/setup.js.map +1 -0
  85. package/dist/commands/slash/agents.d.ts +40 -0
  86. package/dist/commands/slash/agents.d.ts.map +1 -0
  87. package/dist/commands/slash/agents.js +519 -0
  88. package/dist/commands/slash/agents.js.map +1 -0
  89. package/dist/commands/slash/approve.d.ts +46 -0
  90. package/dist/commands/slash/approve.d.ts.map +1 -0
  91. package/dist/commands/slash/approve.js +239 -0
  92. package/dist/commands/slash/approve.js.map +1 -0
  93. package/dist/commands/slash/attach.d.ts +70 -0
  94. package/dist/commands/slash/attach.d.ts.map +1 -0
  95. package/dist/commands/slash/attach.js +333 -0
  96. package/dist/commands/slash/attach.js.map +1 -0
  97. package/dist/commands/slash/clear.d.ts +47 -0
  98. package/dist/commands/slash/clear.d.ts.map +1 -0
  99. package/dist/commands/slash/clear.js +261 -0
  100. package/dist/commands/slash/clear.js.map +1 -0
  101. package/dist/commands/slash/commit.d.ts +40 -0
  102. package/dist/commands/slash/commit.d.ts.map +1 -0
  103. package/dist/commands/slash/commit.js +337 -0
  104. package/dist/commands/slash/commit.js.map +1 -0
  105. package/dist/commands/slash/compact.d.ts +48 -0
  106. package/dist/commands/slash/compact.d.ts.map +1 -0
  107. package/dist/commands/slash/compact.js +288 -0
  108. package/dist/commands/slash/compact.js.map +1 -0
  109. package/dist/commands/slash/config.d.ts +20 -0
  110. package/dist/commands/slash/config.d.ts.map +1 -0
  111. package/dist/commands/slash/config.js +136 -0
  112. package/dist/commands/slash/config.js.map +1 -0
  113. package/dist/commands/slash/context.d.ts +49 -0
  114. package/dist/commands/slash/context.d.ts.map +1 -0
  115. package/dist/commands/slash/context.js +430 -0
  116. package/dist/commands/slash/context.js.map +1 -0
  117. package/dist/commands/slash/cost.d.ts +34 -0
  118. package/dist/commands/slash/cost.d.ts.map +1 -0
  119. package/dist/commands/slash/cost.js +312 -0
  120. package/dist/commands/slash/cost.js.map +1 -0
  121. package/dist/commands/slash/custom.d.ts +41 -0
  122. package/dist/commands/slash/custom.d.ts.map +1 -0
  123. package/dist/commands/slash/custom.js +126 -0
  124. package/dist/commands/slash/custom.js.map +1 -0
  125. package/dist/commands/slash/exit.d.ts +25 -0
  126. package/dist/commands/slash/exit.d.ts.map +1 -0
  127. package/dist/commands/slash/exit.js +186 -0
  128. package/dist/commands/slash/exit.js.map +1 -0
  129. package/dist/commands/slash/export.d.ts +27 -0
  130. package/dist/commands/slash/export.d.ts.map +1 -0
  131. package/dist/commands/slash/export.js +318 -0
  132. package/dist/commands/slash/export.js.map +1 -0
  133. package/dist/commands/slash/files.d.ts +47 -0
  134. package/dist/commands/slash/files.d.ts.map +1 -0
  135. package/dist/commands/slash/files.js +521 -0
  136. package/dist/commands/slash/files.js.map +1 -0
  137. package/dist/commands/slash/help.d.ts +50 -0
  138. package/dist/commands/slash/help.d.ts.map +1 -0
  139. package/dist/commands/slash/help.js +282 -0
  140. package/dist/commands/slash/help.js.map +1 -0
  141. package/dist/commands/slash/index-cmd.d.ts +41 -0
  142. package/dist/commands/slash/index-cmd.d.ts.map +1 -0
  143. package/dist/commands/slash/index-cmd.js +349 -0
  144. package/dist/commands/slash/index-cmd.js.map +1 -0
  145. package/dist/commands/slash/index.d.ts +97 -0
  146. package/dist/commands/slash/index.d.ts.map +1 -0
  147. package/dist/commands/slash/index.js +251 -0
  148. package/dist/commands/slash/index.js.map +1 -0
  149. package/dist/commands/slash/login.d.ts +23 -0
  150. package/dist/commands/slash/login.d.ts.map +1 -0
  151. package/dist/commands/slash/login.js +175 -0
  152. package/dist/commands/slash/login.js.map +1 -0
  153. package/dist/commands/slash/logout.d.ts +23 -0
  154. package/dist/commands/slash/logout.d.ts.map +1 -0
  155. package/dist/commands/slash/logout.js +153 -0
  156. package/dist/commands/slash/logout.js.map +1 -0
  157. package/dist/commands/slash/logs.d.ts +29 -0
  158. package/dist/commands/slash/logs.d.ts.map +1 -0
  159. package/dist/commands/slash/logs.js +423 -0
  160. package/dist/commands/slash/logs.js.map +1 -0
  161. package/dist/commands/slash/mcp.d.ts +29 -0
  162. package/dist/commands/slash/mcp.d.ts.map +1 -0
  163. package/dist/commands/slash/mcp.js +1026 -0
  164. package/dist/commands/slash/mcp.js.map +1 -0
  165. package/dist/commands/slash/model.d.ts +60 -0
  166. package/dist/commands/slash/model.d.ts.map +1 -0
  167. package/dist/commands/slash/model.js +466 -0
  168. package/dist/commands/slash/model.js.map +1 -0
  169. package/dist/commands/slash/personality.d.ts +40 -0
  170. package/dist/commands/slash/personality.d.ts.map +1 -0
  171. package/dist/commands/slash/personality.js +272 -0
  172. package/dist/commands/slash/personality.js.map +1 -0
  173. package/dist/commands/slash/purge.d.ts +42 -0
  174. package/dist/commands/slash/purge.d.ts.map +1 -0
  175. package/dist/commands/slash/purge.js +233 -0
  176. package/dist/commands/slash/purge.js.map +1 -0
  177. package/dist/commands/slash/reset.d.ts +44 -0
  178. package/dist/commands/slash/reset.d.ts.map +1 -0
  179. package/dist/commands/slash/reset.js +326 -0
  180. package/dist/commands/slash/reset.js.map +1 -0
  181. package/dist/commands/slash/skills.d.ts +40 -0
  182. package/dist/commands/slash/skills.d.ts.map +1 -0
  183. package/dist/commands/slash/skills.js +207 -0
  184. package/dist/commands/slash/skills.js.map +1 -0
  185. package/dist/commands/slash/tokens.d.ts +34 -0
  186. package/dist/commands/slash/tokens.d.ts.map +1 -0
  187. package/dist/commands/slash/tokens.js +205 -0
  188. package/dist/commands/slash/tokens.js.map +1 -0
  189. package/dist/commands/slash/unleash.d.ts +50 -0
  190. package/dist/commands/slash/unleash.d.ts.map +1 -0
  191. package/dist/commands/slash/unleash.js +262 -0
  192. package/dist/commands/slash/unleash.js.map +1 -0
  193. package/dist/commands/slash/update.d.ts +34 -0
  194. package/dist/commands/slash/update.d.ts.map +1 -0
  195. package/dist/commands/slash/update.js +364 -0
  196. package/dist/commands/slash/update.js.map +1 -0
  197. package/dist/commands/slash/wrap.d.ts +18 -0
  198. package/dist/commands/slash/wrap.d.ts.map +1 -0
  199. package/dist/commands/slash/wrap.js +21 -0
  200. package/dist/commands/slash/wrap.js.map +1 -0
  201. package/dist/commands/tokens.d.ts +26 -0
  202. package/dist/commands/tokens.d.ts.map +1 -0
  203. package/dist/commands/tokens.js +245 -0
  204. package/dist/commands/tokens.js.map +1 -0
  205. package/dist/constants/builtin-agents.d.ts +27 -0
  206. package/dist/constants/builtin-agents.d.ts.map +1 -0
  207. package/dist/constants/builtin-agents.js +710 -0
  208. package/dist/constants/builtin-agents.js.map +1 -0
  209. package/dist/constants/builtin-skills.d.ts +32 -0
  210. package/dist/constants/builtin-skills.d.ts.map +1 -0
  211. package/dist/constants/builtin-skills.js +389 -0
  212. package/dist/constants/builtin-skills.js.map +1 -0
  213. package/dist/constants/defaults.d.ts +448 -0
  214. package/dist/constants/defaults.d.ts.map +1 -0
  215. package/dist/constants/defaults.js +829 -0
  216. package/dist/constants/defaults.js.map +1 -0
  217. package/dist/constants/index.d.ts +27 -0
  218. package/dist/constants/index.d.ts.map +1 -0
  219. package/dist/constants/index.js +85 -0
  220. package/dist/constants/index.js.map +1 -0
  221. package/dist/constants/install-hints.d.ts +7 -0
  222. package/dist/constants/install-hints.d.ts.map +1 -0
  223. package/dist/constants/install-hints.js +123 -0
  224. package/dist/constants/install-hints.js.map +1 -0
  225. package/dist/constants/models.d.ts +255 -0
  226. package/dist/constants/models.d.ts.map +1 -0
  227. package/dist/constants/models.js +596 -0
  228. package/dist/constants/models.js.map +1 -0
  229. package/dist/constants/schedule.d.ts +43 -0
  230. package/dist/constants/schedule.d.ts.map +1 -0
  231. package/dist/constants/schedule.js +110 -0
  232. package/dist/constants/schedule.js.map +1 -0
  233. package/dist/constants/system-utilities.d.ts +57 -0
  234. package/dist/constants/system-utilities.d.ts.map +1 -0
  235. package/dist/constants/system-utilities.js +421 -0
  236. package/dist/constants/system-utilities.js.map +1 -0
  237. package/dist/constants/token-limits.d.ts +102 -0
  238. package/dist/constants/token-limits.d.ts.map +1 -0
  239. package/dist/constants/token-limits.js +286 -0
  240. package/dist/constants/token-limits.js.map +1 -0
  241. package/dist/core/autocomplete.d.ts +132 -0
  242. package/dist/core/autocomplete.d.ts.map +1 -0
  243. package/dist/core/autocomplete.js +653 -0
  244. package/dist/core/autocomplete.js.map +1 -0
  245. package/dist/core/command-parser.d.ts +301 -0
  246. package/dist/core/command-parser.d.ts.map +1 -0
  247. package/dist/core/command-parser.js +526 -0
  248. package/dist/core/command-parser.js.map +1 -0
  249. package/dist/core/context-builder.d.ts +264 -0
  250. package/dist/core/context-builder.d.ts.map +1 -0
  251. package/dist/core/context-builder.js +1018 -0
  252. package/dist/core/context-builder.js.map +1 -0
  253. package/dist/core/event-emitter.d.ts +411 -0
  254. package/dist/core/event-emitter.d.ts.map +1 -0
  255. package/dist/core/event-emitter.js +138 -0
  256. package/dist/core/event-emitter.js.map +1 -0
  257. package/dist/core/history-manager.d.ts +62 -0
  258. package/dist/core/history-manager.d.ts.map +1 -0
  259. package/dist/core/history-manager.js +151 -0
  260. package/dist/core/history-manager.js.map +1 -0
  261. package/dist/core/slash-command-handler.d.ts +352 -0
  262. package/dist/core/slash-command-handler.d.ts.map +1 -0
  263. package/dist/core/slash-command-handler.js +563 -0
  264. package/dist/core/slash-command-handler.js.map +1 -0
  265. package/dist/core/task-processor.d.ts +179 -0
  266. package/dist/core/task-processor.d.ts.map +1 -0
  267. package/dist/core/task-processor.js +519 -0
  268. package/dist/core/task-processor.js.map +1 -0
  269. package/dist/index.d.ts +90 -0
  270. package/dist/index.d.ts.map +1 -0
  271. package/dist/index.js +4 -3
  272. package/dist/index.js.map +1 -0
  273. package/dist/prompts/agent-prompt-generator.d.ts +26 -0
  274. package/dist/prompts/agent-prompt-generator.d.ts.map +1 -0
  275. package/dist/prompts/agent-prompt-generator.js +244 -0
  276. package/dist/prompts/agent-prompt-generator.js.map +1 -0
  277. package/dist/prompts/commit-message.d.ts +35 -0
  278. package/dist/prompts/commit-message.d.ts.map +1 -0
  279. package/dist/prompts/commit-message.js +187 -0
  280. package/dist/prompts/commit-message.js.map +1 -0
  281. package/dist/prompts/conversation.d.ts +51 -0
  282. package/dist/prompts/conversation.d.ts.map +1 -0
  283. package/dist/prompts/conversation.js +115 -0
  284. package/dist/prompts/conversation.js.map +1 -0
  285. package/dist/prompts/index.d.ts +39 -0
  286. package/dist/prompts/index.d.ts.map +1 -0
  287. package/dist/prompts/index.js +74 -0
  288. package/dist/prompts/index.js.map +1 -0
  289. package/dist/prompts/memory.d.ts +6 -0
  290. package/dist/prompts/memory.d.ts.map +1 -0
  291. package/dist/prompts/memory.js +29 -0
  292. package/dist/prompts/memory.js.map +1 -0
  293. package/dist/prompts/personality.d.ts +77 -0
  294. package/dist/prompts/personality.d.ts.map +1 -0
  295. package/dist/prompts/personality.js +393 -0
  296. package/dist/prompts/personality.js.map +1 -0
  297. package/dist/prompts/plan-generator.d.ts +144 -0
  298. package/dist/prompts/plan-generator.d.ts.map +1 -0
  299. package/dist/prompts/plan-generator.js +553 -0
  300. package/dist/prompts/plan-generator.js.map +1 -0
  301. package/dist/prompts/system.d.ts +95 -0
  302. package/dist/prompts/system.d.ts.map +1 -0
  303. package/dist/prompts/system.js +461 -0
  304. package/dist/prompts/system.js.map +1 -0
  305. package/dist/prompts/task-processor.d.ts +94 -0
  306. package/dist/prompts/task-processor.d.ts.map +1 -0
  307. package/dist/prompts/task-processor.js +554 -0
  308. package/dist/prompts/task-processor.js.map +1 -0
  309. package/dist/prompts/unguarded.d.ts +78 -0
  310. package/dist/prompts/unguarded.d.ts.map +1 -0
  311. package/dist/prompts/unguarded.js +418 -0
  312. package/dist/prompts/unguarded.js.map +1 -0
  313. package/dist/prompts/utils.d.ts +73 -0
  314. package/dist/prompts/utils.d.ts.map +1 -0
  315. package/dist/prompts/utils.js +114 -0
  316. package/dist/prompts/utils.js.map +1 -0
  317. package/dist/prompts/workflow.d.ts +241 -0
  318. package/dist/prompts/workflow.d.ts.map +1 -0
  319. package/dist/prompts/workflow.js +608 -0
  320. package/dist/prompts/workflow.js.map +1 -0
  321. package/dist/services/action-logger.d.ts +383 -0
  322. package/dist/services/action-logger.d.ts.map +1 -0
  323. package/dist/services/action-logger.js +544 -0
  324. package/dist/services/action-logger.js.map +1 -0
  325. package/dist/services/agent-budget-allocator.d.ts +111 -0
  326. package/dist/services/agent-budget-allocator.d.ts.map +1 -0
  327. package/dist/services/agent-budget-allocator.js +278 -0
  328. package/dist/services/agent-budget-allocator.js.map +1 -0
  329. package/dist/services/agent-manager.d.ts +181 -0
  330. package/dist/services/agent-manager.d.ts.map +1 -0
  331. package/dist/services/agent-manager.js +749 -0
  332. package/dist/services/agent-manager.js.map +1 -0
  333. package/dist/services/agent-spawner.d.ts +138 -0
  334. package/dist/services/agent-spawner.d.ts.map +1 -0
  335. package/dist/services/agent-spawner.js +748 -0
  336. package/dist/services/agent-spawner.js.map +1 -0
  337. package/dist/services/agent-state-service.d.ts +145 -0
  338. package/dist/services/agent-state-service.d.ts.map +1 -0
  339. package/dist/services/agent-state-service.js +247 -0
  340. package/dist/services/agent-state-service.js.map +1 -0
  341. package/dist/services/anthropic-client.d.ts +357 -0
  342. package/dist/services/anthropic-client.d.ts.map +1 -0
  343. package/dist/services/anthropic-client.js +1451 -0
  344. package/dist/services/anthropic-client.js.map +1 -0
  345. package/dist/services/approval-manager.d.ts +385 -0
  346. package/dist/services/approval-manager.d.ts.map +1 -0
  347. package/dist/services/approval-manager.js +1044 -0
  348. package/dist/services/approval-manager.js.map +1 -0
  349. package/dist/services/audit-logger.d.ts +245 -0
  350. package/dist/services/audit-logger.d.ts.map +1 -0
  351. package/dist/services/audit-logger.js +324 -0
  352. package/dist/services/audit-logger.js.map +1 -0
  353. package/dist/services/backup-manager.d.ts +136 -0
  354. package/dist/services/backup-manager.d.ts.map +1 -0
  355. package/dist/services/backup-manager.js +260 -0
  356. package/dist/services/backup-manager.js.map +1 -0
  357. package/dist/services/cache-service.d.ts +247 -0
  358. package/dist/services/cache-service.d.ts.map +1 -0
  359. package/dist/services/cache-service.js +558 -0
  360. package/dist/services/cache-service.js.map +1 -0
  361. package/dist/services/chat-archival-service.d.ts +108 -0
  362. package/dist/services/chat-archival-service.d.ts.map +1 -0
  363. package/dist/services/chat-archival-service.js +465 -0
  364. package/dist/services/chat-archival-service.js.map +1 -0
  365. package/dist/services/codebase-indexer.d.ts +272 -0
  366. package/dist/services/codebase-indexer.d.ts.map +1 -0
  367. package/dist/services/codebase-indexer.js +863 -0
  368. package/dist/services/codebase-indexer.js.map +1 -0
  369. package/dist/services/compass-auth-service.d.ts +204 -0
  370. package/dist/services/compass-auth-service.d.ts.map +1 -0
  371. package/dist/services/compass-auth-service.js +391 -0
  372. package/dist/services/compass-auth-service.js.map +1 -0
  373. package/dist/services/complexity-classifier.d.ts +208 -0
  374. package/dist/services/complexity-classifier.d.ts.map +1 -0
  375. package/dist/services/complexity-classifier.js +1410 -0
  376. package/dist/services/complexity-classifier.js.map +1 -0
  377. package/dist/services/config-manager.d.ts +278 -0
  378. package/dist/services/config-manager.d.ts.map +1 -0
  379. package/dist/services/config-manager.js +651 -0
  380. package/dist/services/config-manager.js.map +1 -0
  381. package/dist/services/consent-manager.d.ts +239 -0
  382. package/dist/services/consent-manager.d.ts.map +1 -0
  383. package/dist/services/consent-manager.js +516 -0
  384. package/dist/services/consent-manager.js.map +1 -0
  385. package/dist/services/conversation-compactor.d.ts +223 -0
  386. package/dist/services/conversation-compactor.d.ts.map +1 -0
  387. package/dist/services/conversation-compactor.js +750 -0
  388. package/dist/services/conversation-compactor.js.map +1 -0
  389. package/dist/services/cost-tracker.d.ts +167 -0
  390. package/dist/services/cost-tracker.d.ts.map +1 -0
  391. package/dist/services/cost-tracker.js +199 -0
  392. package/dist/services/cost-tracker.js.map +1 -0
  393. package/dist/services/credential-store.d.ts +273 -0
  394. package/dist/services/credential-store.d.ts.map +1 -0
  395. package/dist/services/credential-store.js +877 -0
  396. package/dist/services/credential-store.js.map +1 -0
  397. package/dist/services/custom-command-service.d.ts +112 -0
  398. package/dist/services/custom-command-service.d.ts.map +1 -0
  399. package/dist/services/custom-command-service.js +464 -0
  400. package/dist/services/custom-command-service.js.map +1 -0
  401. package/dist/services/default-statusline-renderer.d.ts +60 -0
  402. package/dist/services/default-statusline-renderer.d.ts.map +1 -0
  403. package/dist/services/default-statusline-renderer.js +110 -0
  404. package/dist/services/default-statusline-renderer.js.map +1 -0
  405. package/dist/services/enhanced-context-gatherer.d.ts +116 -0
  406. package/dist/services/enhanced-context-gatherer.d.ts.map +1 -0
  407. package/dist/services/enhanced-context-gatherer.js +605 -0
  408. package/dist/services/enhanced-context-gatherer.js.map +1 -0
  409. package/dist/services/file-hash-tracker.d.ts +95 -0
  410. package/dist/services/file-hash-tracker.d.ts.map +1 -0
  411. package/dist/services/file-hash-tracker.js +199 -0
  412. package/dist/services/file-hash-tracker.js.map +1 -0
  413. package/dist/services/file-service.d.ts +274 -0
  414. package/dist/services/file-service.d.ts.map +1 -0
  415. package/dist/services/file-service.js +876 -0
  416. package/dist/services/file-service.js.map +1 -0
  417. package/dist/services/git-service.d.ts +536 -0
  418. package/dist/services/git-service.d.ts.map +1 -0
  419. package/dist/services/git-service.js +1215 -0
  420. package/dist/services/git-service.js.map +1 -0
  421. package/dist/services/hook-service.d.ts +148 -0
  422. package/dist/services/hook-service.d.ts.map +1 -0
  423. package/dist/services/hook-service.js +705 -0
  424. package/dist/services/hook-service.js.map +1 -0
  425. package/dist/services/ide-state-service.d.ts +114 -0
  426. package/dist/services/ide-state-service.d.ts.map +1 -0
  427. package/dist/services/ide-state-service.js +204 -0
  428. package/dist/services/ide-state-service.js.map +1 -0
  429. package/dist/services/interactive-clarifier.d.ts +90 -0
  430. package/dist/services/interactive-clarifier.d.ts.map +1 -0
  431. package/dist/services/interactive-clarifier.js +446 -0
  432. package/dist/services/interactive-clarifier.js.map +1 -0
  433. package/dist/services/iteration-scoper.d.ts +225 -0
  434. package/dist/services/iteration-scoper.d.ts.map +1 -0
  435. package/dist/services/iteration-scoper.js +387 -0
  436. package/dist/services/iteration-scoper.js.map +1 -0
  437. package/dist/services/llm-plan-generator.d.ts +44 -0
  438. package/dist/services/llm-plan-generator.d.ts.map +1 -0
  439. package/dist/services/llm-plan-generator.js +863 -0
  440. package/dist/services/llm-plan-generator.js.map +1 -0
  441. package/dist/services/llm-system-prompt-generator.d.ts +85 -0
  442. package/dist/services/llm-system-prompt-generator.d.ts.map +1 -0
  443. package/dist/services/llm-system-prompt-generator.js +257 -0
  444. package/dist/services/llm-system-prompt-generator.js.map +1 -0
  445. package/dist/services/log-interpreter.d.ts +190 -0
  446. package/dist/services/log-interpreter.d.ts.map +1 -0
  447. package/dist/services/log-interpreter.js +520 -0
  448. package/dist/services/log-interpreter.js.map +1 -0
  449. package/dist/services/mcp-config-manager.d.ts +141 -0
  450. package/dist/services/mcp-config-manager.d.ts.map +1 -0
  451. package/dist/services/mcp-config-manager.js +678 -0
  452. package/dist/services/mcp-config-manager.js.map +1 -0
  453. package/dist/services/mcp-oauth-service.d.ts +170 -0
  454. package/dist/services/mcp-oauth-service.d.ts.map +1 -0
  455. package/dist/services/mcp-oauth-service.js +892 -0
  456. package/dist/services/mcp-oauth-service.js.map +1 -0
  457. package/dist/services/mcp-plugin-support.d.ts +81 -0
  458. package/dist/services/mcp-plugin-support.d.ts.map +1 -0
  459. package/dist/services/mcp-plugin-support.js +305 -0
  460. package/dist/services/mcp-plugin-support.js.map +1 -0
  461. package/dist/services/mcp-server-manager.d.ts +134 -0
  462. package/dist/services/mcp-server-manager.d.ts.map +1 -0
  463. package/dist/services/mcp-server-manager.js +613 -0
  464. package/dist/services/mcp-server-manager.js.map +1 -0
  465. package/dist/services/mcp-tool-integration.d.ts +119 -0
  466. package/dist/services/mcp-tool-integration.d.ts.map +1 -0
  467. package/dist/services/mcp-tool-integration.js +381 -0
  468. package/dist/services/mcp-tool-integration.js.map +1 -0
  469. package/dist/services/mcp-transport.d.ts +105 -0
  470. package/dist/services/mcp-transport.d.ts.map +1 -0
  471. package/dist/services/mcp-transport.js +1316 -0
  472. package/dist/services/mcp-transport.js.map +1 -0
  473. package/dist/services/memory-service.d.ts +55 -0
  474. package/dist/services/memory-service.d.ts.map +1 -0
  475. package/dist/services/memory-service.js +251 -0
  476. package/dist/services/memory-service.js.map +1 -0
  477. package/dist/services/model-availability.d.ts +64 -0
  478. package/dist/services/model-availability.d.ts.map +1 -0
  479. package/dist/services/model-availability.js +114 -0
  480. package/dist/services/model-availability.js.map +1 -0
  481. package/dist/services/plan-generator.d.ts +98 -0
  482. package/dist/services/plan-generator.d.ts.map +1 -0
  483. package/dist/services/plan-generator.js +658 -0
  484. package/dist/services/plan-generator.js.map +1 -0
  485. package/dist/services/plan-mode-fallback.d.ts +80 -0
  486. package/dist/services/plan-mode-fallback.d.ts.map +1 -0
  487. package/dist/services/plan-mode-fallback.js +307 -0
  488. package/dist/services/plan-mode-fallback.js.map +1 -0
  489. package/dist/services/plan-mode-handler.d.ts +42 -0
  490. package/dist/services/plan-mode-handler.d.ts.map +1 -0
  491. package/dist/services/plan-mode-handler.js +388 -0
  492. package/dist/services/plan-mode-handler.js.map +1 -0
  493. package/dist/services/plan-persistence.d.ts +203 -0
  494. package/dist/services/plan-persistence.d.ts.map +1 -0
  495. package/dist/services/plan-persistence.js +538 -0
  496. package/dist/services/plan-persistence.js.map +1 -0
  497. package/dist/services/prompt-preprocessor.d.ts +73 -0
  498. package/dist/services/prompt-preprocessor.d.ts.map +1 -0
  499. package/dist/services/prompt-preprocessor.js +146 -0
  500. package/dist/services/prompt-preprocessor.js.map +1 -0
  501. package/dist/services/rating-service.d.ts +84 -0
  502. package/dist/services/rating-service.d.ts.map +1 -0
  503. package/dist/services/rating-service.js +171 -0
  504. package/dist/services/rating-service.js.map +1 -0
  505. package/dist/services/rating-state-manager.d.ts +131 -0
  506. package/dist/services/rating-state-manager.d.ts.map +1 -0
  507. package/dist/services/rating-state-manager.js +270 -0
  508. package/dist/services/rating-state-manager.js.map +1 -0
  509. package/dist/services/sdk-runner.d.ts +113 -0
  510. package/dist/services/sdk-runner.d.ts.map +1 -0
  511. package/dist/services/sdk-runner.js +1424 -0
  512. package/dist/services/sdk-runner.js.map +1 -0
  513. package/dist/services/session-manager.d.ts +528 -0
  514. package/dist/services/session-manager.d.ts.map +1 -0
  515. package/dist/services/session-manager.js +1184 -0
  516. package/dist/services/session-manager.js.map +1 -0
  517. package/dist/services/shell-executor.d.ts +337 -0
  518. package/dist/services/shell-executor.d.ts.map +1 -0
  519. package/dist/services/shell-executor.js +1201 -0
  520. package/dist/services/shell-executor.js.map +1 -0
  521. package/dist/services/skill-service.d.ts +149 -0
  522. package/dist/services/skill-service.d.ts.map +1 -0
  523. package/dist/services/skill-service.js +594 -0
  524. package/dist/services/skill-service.js.map +1 -0
  525. package/dist/services/statusline-executor.d.ts +102 -0
  526. package/dist/services/statusline-executor.d.ts.map +1 -0
  527. package/dist/services/statusline-executor.js +305 -0
  528. package/dist/services/statusline-executor.js.map +1 -0
  529. package/dist/services/step-tracker.d.ts +356 -0
  530. package/dist/services/step-tracker.d.ts.map +1 -0
  531. package/dist/services/step-tracker.js +634 -0
  532. package/dist/services/step-tracker.js.map +1 -0
  533. package/dist/services/system-event-logger.d.ts +473 -0
  534. package/dist/services/system-event-logger.d.ts.map +1 -0
  535. package/dist/services/system-event-logger.js +790 -0
  536. package/dist/services/system-event-logger.js.map +1 -0
  537. package/dist/services/system-utility-detector.d.ts +91 -0
  538. package/dist/services/system-utility-detector.d.ts.map +1 -0
  539. package/dist/services/system-utility-detector.js +238 -0
  540. package/dist/services/system-utility-detector.js.map +1 -0
  541. package/dist/services/team-context-store.d.ts +100 -0
  542. package/dist/services/team-context-store.d.ts.map +1 -0
  543. package/dist/services/team-context-store.js +513 -0
  544. package/dist/services/team-context-store.js.map +1 -0
  545. package/dist/services/temp-file-service.d.ts +164 -0
  546. package/dist/services/temp-file-service.d.ts.map +1 -0
  547. package/dist/services/temp-file-service.js +303 -0
  548. package/dist/services/temp-file-service.js.map +1 -0
  549. package/dist/services/token-limit-enforcer.d.ts +53 -0
  550. package/dist/services/token-limit-enforcer.d.ts.map +1 -0
  551. package/dist/services/token-limit-enforcer.js +90 -0
  552. package/dist/services/token-limit-enforcer.js.map +1 -0
  553. package/dist/services/token-limit-store.d.ts +105 -0
  554. package/dist/services/token-limit-store.d.ts.map +1 -0
  555. package/dist/services/token-limit-store.js +288 -0
  556. package/dist/services/token-limit-store.js.map +1 -0
  557. package/dist/services/token-tracker.d.ts +290 -0
  558. package/dist/services/token-tracker.d.ts.map +1 -0
  559. package/dist/services/token-tracker.js +751 -0
  560. package/dist/services/token-tracker.js.map +1 -0
  561. package/dist/services/tool-registry.d.ts +302 -0
  562. package/dist/services/tool-registry.d.ts.map +1 -0
  563. package/dist/services/tool-registry.js +606 -0
  564. package/dist/services/tool-registry.js.map +1 -0
  565. package/dist/services/tools-logger.d.ts +152 -0
  566. package/dist/services/tools-logger.d.ts.map +1 -0
  567. package/dist/services/tools-logger.js +222 -0
  568. package/dist/services/tools-logger.js.map +1 -0
  569. package/dist/services/update-plan-handler.d.ts +56 -0
  570. package/dist/services/update-plan-handler.d.ts.map +1 -0
  571. package/dist/services/update-plan-handler.js +372 -0
  572. package/dist/services/update-plan-handler.js.map +1 -0
  573. package/dist/services/update-service.d.ts +197 -0
  574. package/dist/services/update-service.d.ts.map +1 -0
  575. package/dist/services/update-service.js +749 -0
  576. package/dist/services/update-service.js.map +1 -0
  577. package/dist/services/verifier.d.ts +113 -0
  578. package/dist/services/verifier.d.ts.map +1 -0
  579. package/dist/services/verifier.js +541 -0
  580. package/dist/services/verifier.js.map +1 -0
  581. package/dist/services/workflow-manager.d.ts +277 -0
  582. package/dist/services/workflow-manager.d.ts.map +1 -0
  583. package/dist/services/workflow-manager.js +616 -0
  584. package/dist/services/workflow-manager.js.map +1 -0
  585. package/dist/services/workflow-orchestrator.d.ts +148 -0
  586. package/dist/services/workflow-orchestrator.d.ts.map +1 -0
  587. package/dist/services/workflow-orchestrator.js +617 -0
  588. package/dist/services/workflow-orchestrator.js.map +1 -0
  589. package/dist/services/worktree-manager.d.ts +36 -0
  590. package/dist/services/worktree-manager.d.ts.map +1 -0
  591. package/dist/services/worktree-manager.js +185 -0
  592. package/dist/services/worktree-manager.js.map +1 -0
  593. package/dist/templates/ascii-art.d.ts +136 -0
  594. package/dist/templates/ascii-art.d.ts.map +1 -0
  595. package/dist/templates/ascii-art.js +286 -0
  596. package/dist/templates/ascii-art.js.map +1 -0
  597. package/dist/templates/help.d.ts +186 -0
  598. package/dist/templates/help.d.ts.map +1 -0
  599. package/dist/templates/help.js +588 -0
  600. package/dist/templates/help.js.map +1 -0
  601. package/dist/templates/prompts/workflow-prompts.d.ts +9 -0
  602. package/dist/templates/prompts/workflow-prompts.d.ts.map +1 -0
  603. package/dist/templates/prompts/workflow-prompts.js +9 -0
  604. package/dist/templates/prompts/workflow-prompts.js.map +1 -0
  605. package/dist/tools/agent-tools.d.ts +9 -0
  606. package/dist/tools/agent-tools.d.ts.map +1 -0
  607. package/dist/tools/agent-tools.js +349 -0
  608. package/dist/tools/agent-tools.js.map +1 -0
  609. package/dist/tools/edit-replacers.d.ts +90 -0
  610. package/dist/tools/edit-replacers.d.ts.map +1 -0
  611. package/dist/tools/edit-replacers.js +553 -0
  612. package/dist/tools/edit-replacers.js.map +1 -0
  613. package/dist/tools/file-tools.d.ts +13 -0
  614. package/dist/tools/file-tools.d.ts.map +1 -0
  615. package/dist/tools/file-tools.js +954 -0
  616. package/dist/tools/file-tools.js.map +1 -0
  617. package/dist/tools/git-tools.d.ts +9 -0
  618. package/dist/tools/git-tools.d.ts.map +1 -0
  619. package/dist/tools/git-tools.js +261 -0
  620. package/dist/tools/git-tools.js.map +1 -0
  621. package/dist/tools/index.d.ts +13 -0
  622. package/dist/tools/index.d.ts.map +1 -0
  623. package/dist/tools/index.js +70 -0
  624. package/dist/tools/index.js.map +1 -0
  625. package/dist/tools/network-tools.d.ts +8 -0
  626. package/dist/tools/network-tools.d.ts.map +1 -0
  627. package/dist/tools/network-tools.js +261 -0
  628. package/dist/tools/network-tools.js.map +1 -0
  629. package/dist/tools/openai-tools.d.ts +16 -0
  630. package/dist/tools/openai-tools.d.ts.map +1 -0
  631. package/dist/tools/openai-tools.js +385 -0
  632. package/dist/tools/openai-tools.js.map +1 -0
  633. package/dist/tools/plan-tools.d.ts +9 -0
  634. package/dist/tools/plan-tools.d.ts.map +1 -0
  635. package/dist/tools/plan-tools.js +223 -0
  636. package/dist/tools/plan-tools.js.map +1 -0
  637. package/dist/tools/schedule-tools.d.ts +9 -0
  638. package/dist/tools/schedule-tools.d.ts.map +1 -0
  639. package/dist/tools/schedule-tools.js +405 -0
  640. package/dist/tools/schedule-tools.js.map +1 -0
  641. package/dist/tools/search-tools.d.ts +8 -0
  642. package/dist/tools/search-tools.d.ts.map +1 -0
  643. package/dist/tools/search-tools.js +357 -0
  644. package/dist/tools/search-tools.js.map +1 -0
  645. package/dist/tools/shared-utils.d.ts +91 -0
  646. package/dist/tools/shared-utils.d.ts.map +1 -0
  647. package/dist/tools/shared-utils.js +385 -0
  648. package/dist/tools/shared-utils.js.map +1 -0
  649. package/dist/tools/shell-tools.d.ts +9 -0
  650. package/dist/tools/shell-tools.d.ts.map +1 -0
  651. package/dist/tools/shell-tools.js +409 -0
  652. package/dist/tools/shell-tools.js.map +1 -0
  653. package/dist/tools/skill-tools.d.ts +13 -0
  654. package/dist/tools/skill-tools.d.ts.map +1 -0
  655. package/dist/tools/skill-tools.js +244 -0
  656. package/dist/tools/skill-tools.js.map +1 -0
  657. package/dist/tools/swarm-tools.d.ts +9 -0
  658. package/dist/tools/swarm-tools.d.ts.map +1 -0
  659. package/dist/tools/swarm-tools.js +422 -0
  660. package/dist/tools/swarm-tools.js.map +1 -0
  661. package/dist/tools/user-tools.d.ts +13 -0
  662. package/dist/tools/user-tools.d.ts.map +1 -0
  663. package/dist/tools/user-tools.js +232 -0
  664. package/dist/tools/user-tools.js.map +1 -0
  665. package/dist/types/agent-process.d.ts +244 -0
  666. package/dist/types/agent-process.d.ts.map +1 -0
  667. package/dist/types/agent-process.js +93 -0
  668. package/dist/types/agent-process.js.map +1 -0
  669. package/dist/types/agent.d.ts +358 -0
  670. package/dist/types/agent.d.ts.map +1 -0
  671. package/dist/types/agent.js +171 -0
  672. package/dist/types/agent.js.map +1 -0
  673. package/dist/types/anthropic.d.ts +438 -0
  674. package/dist/types/anthropic.d.ts.map +1 -0
  675. package/dist/types/anthropic.js +9 -0
  676. package/dist/types/anthropic.js.map +1 -0
  677. package/dist/types/approval.d.ts +332 -0
  678. package/dist/types/approval.d.ts.map +1 -0
  679. package/dist/types/approval.js +44 -0
  680. package/dist/types/approval.js.map +1 -0
  681. package/dist/types/autocomplete.d.ts +57 -0
  682. package/dist/types/autocomplete.d.ts.map +1 -0
  683. package/dist/types/autocomplete.js +7 -0
  684. package/dist/types/autocomplete.js.map +1 -0
  685. package/dist/types/chat-archive.d.ts +161 -0
  686. package/dist/types/chat-archive.d.ts.map +1 -0
  687. package/dist/types/chat-archive.js +36 -0
  688. package/dist/types/chat-archive.js.map +1 -0
  689. package/dist/types/config.d.ts +268 -0
  690. package/dist/types/config.d.ts.map +1 -0
  691. package/dist/types/config.js +188 -0
  692. package/dist/types/config.js.map +1 -0
  693. package/dist/types/consent.d.ts +191 -0
  694. package/dist/types/consent.d.ts.map +1 -0
  695. package/dist/types/consent.js +119 -0
  696. package/dist/types/consent.js.map +1 -0
  697. package/dist/types/custom-command.d.ts +139 -0
  698. package/dist/types/custom-command.d.ts.map +1 -0
  699. package/dist/types/custom-command.js +7 -0
  700. package/dist/types/custom-command.js.map +1 -0
  701. package/dist/types/git.d.ts +20 -0
  702. package/dist/types/git.d.ts.map +1 -0
  703. package/dist/types/git.js +2 -0
  704. package/dist/types/git.js.map +1 -0
  705. package/dist/types/hook.d.ts +342 -0
  706. package/dist/types/hook.d.ts.map +1 -0
  707. package/dist/types/hook.js +84 -0
  708. package/dist/types/hook.js.map +1 -0
  709. package/dist/types/index.d.ts +86 -0
  710. package/dist/types/index.d.ts.map +1 -0
  711. package/dist/types/index.js +71 -0
  712. package/dist/types/index.js.map +1 -0
  713. package/dist/types/mcp.d.ts +456 -0
  714. package/dist/types/mcp.d.ts.map +1 -0
  715. package/dist/types/mcp.js +94 -0
  716. package/dist/types/mcp.js.map +1 -0
  717. package/dist/types/rating.d.ts +110 -0
  718. package/dist/types/rating.d.ts.map +1 -0
  719. package/dist/types/rating.js +53 -0
  720. package/dist/types/rating.js.map +1 -0
  721. package/dist/types/schedule.d.ts +91 -0
  722. package/dist/types/schedule.d.ts.map +1 -0
  723. package/dist/types/schedule.js +8 -0
  724. package/dist/types/schedule.js.map +1 -0
  725. package/dist/types/session.d.ts +361 -0
  726. package/dist/types/session.d.ts.map +1 -0
  727. package/dist/types/session.js +9 -0
  728. package/dist/types/session.js.map +1 -0
  729. package/dist/types/skill.d.ts +258 -0
  730. package/dist/types/skill.d.ts.map +1 -0
  731. package/dist/types/skill.js +79 -0
  732. package/dist/types/skill.js.map +1 -0
  733. package/dist/types/statusline.d.ts +212 -0
  734. package/dist/types/statusline.d.ts.map +1 -0
  735. package/dist/types/statusline.js +8 -0
  736. package/dist/types/statusline.js.map +1 -0
  737. package/dist/types/stream.d.ts +61 -0
  738. package/dist/types/stream.d.ts.map +1 -0
  739. package/dist/types/stream.js +17 -0
  740. package/dist/types/stream.js.map +1 -0
  741. package/dist/types/swarm.d.ts +132 -0
  742. package/dist/types/swarm.d.ts.map +1 -0
  743. package/dist/types/swarm.js +21 -0
  744. package/dist/types/swarm.js.map +1 -0
  745. package/dist/types/token-limits.d.ts +107 -0
  746. package/dist/types/token-limits.d.ts.map +1 -0
  747. package/dist/types/token-limits.js +57 -0
  748. package/dist/types/token-limits.js.map +1 -0
  749. package/dist/types/token.d.ts +329 -0
  750. package/dist/types/token.d.ts.map +1 -0
  751. package/dist/types/token.js +9 -0
  752. package/dist/types/token.js.map +1 -0
  753. package/dist/types/update.d.ts +189 -0
  754. package/dist/types/update.d.ts.map +1 -0
  755. package/dist/types/update.js +55 -0
  756. package/dist/types/update.js.map +1 -0
  757. package/dist/types/workflow.d.ts +396 -0
  758. package/dist/types/workflow.d.ts.map +1 -0
  759. package/dist/types/workflow.js +46 -0
  760. package/dist/types/workflow.js.map +1 -0
  761. package/dist/ui/App.d.ts +62 -0
  762. package/dist/ui/App.d.ts.map +1 -0
  763. package/dist/ui/App.js +511 -0
  764. package/dist/ui/App.js.map +1 -0
  765. package/dist/ui/InteractiveSession.d.ts +34 -0
  766. package/dist/ui/InteractiveSession.d.ts.map +1 -0
  767. package/dist/ui/InteractiveSession.js +3611 -0
  768. package/dist/ui/InteractiveSession.js.map +1 -0
  769. package/dist/ui/MCPApprovalPrompt.d.ts +27 -0
  770. package/dist/ui/MCPApprovalPrompt.d.ts.map +1 -0
  771. package/dist/ui/MCPApprovalPrompt.js +51 -0
  772. package/dist/ui/MCPApprovalPrompt.js.map +1 -0
  773. package/dist/ui/SetupWizard.d.ts +26 -0
  774. package/dist/ui/SetupWizard.d.ts.map +1 -0
  775. package/dist/ui/SetupWizard.js +396 -0
  776. package/dist/ui/SetupWizard.js.map +1 -0
  777. package/dist/ui/components/AgentCreationWizard.d.ts +36 -0
  778. package/dist/ui/components/AgentCreationWizard.d.ts.map +1 -0
  779. package/dist/ui/components/AgentCreationWizard.js +619 -0
  780. package/dist/ui/components/AgentCreationWizard.js.map +1 -0
  781. package/dist/ui/components/AgentManager.d.ts +41 -0
  782. package/dist/ui/components/AgentManager.d.ts.map +1 -0
  783. package/dist/ui/components/AgentManager.js +343 -0
  784. package/dist/ui/components/AgentManager.js.map +1 -0
  785. package/dist/ui/components/ApprovalDialog.d.ts +18 -0
  786. package/dist/ui/components/ApprovalDialog.d.ts.map +1 -0
  787. package/dist/ui/components/ApprovalDialog.js +439 -0
  788. package/dist/ui/components/ApprovalDialog.js.map +1 -0
  789. package/dist/ui/components/AsciiArt.d.ts +54 -0
  790. package/dist/ui/components/AsciiArt.d.ts.map +1 -0
  791. package/dist/ui/components/AsciiArt.js +89 -0
  792. package/dist/ui/components/AsciiArt.js.map +1 -0
  793. package/dist/ui/components/ClarificationWizard.d.ts +36 -0
  794. package/dist/ui/components/ClarificationWizard.d.ts.map +1 -0
  795. package/dist/ui/components/ClarificationWizard.js +407 -0
  796. package/dist/ui/components/ClarificationWizard.js.map +1 -0
  797. package/dist/ui/components/CompassSpinner.d.ts +15 -0
  798. package/dist/ui/components/CompassSpinner.d.ts.map +1 -0
  799. package/dist/ui/components/CompassSpinner.js +50 -0
  800. package/dist/ui/components/CompassSpinner.js.map +1 -0
  801. package/dist/ui/components/ConfirmationSelector.d.ts +45 -0
  802. package/dist/ui/components/ConfirmationSelector.d.ts.map +1 -0
  803. package/dist/ui/components/ConfirmationSelector.js +106 -0
  804. package/dist/ui/components/ConfirmationSelector.js.map +1 -0
  805. package/dist/ui/components/ContextUsage.d.ts +76 -0
  806. package/dist/ui/components/ContextUsage.d.ts.map +1 -0
  807. package/dist/ui/components/ContextUsage.js +188 -0
  808. package/dist/ui/components/ContextUsage.js.map +1 -0
  809. package/dist/ui/components/DiffPreview.d.ts +13 -0
  810. package/dist/ui/components/DiffPreview.d.ts.map +1 -0
  811. package/dist/ui/components/DiffPreview.js +30 -0
  812. package/dist/ui/components/DiffPreview.js.map +1 -0
  813. package/dist/ui/components/ExecutionModeSelector.d.ts +45 -0
  814. package/dist/ui/components/ExecutionModeSelector.d.ts.map +1 -0
  815. package/dist/ui/components/ExecutionModeSelector.js +120 -0
  816. package/dist/ui/components/ExecutionModeSelector.js.map +1 -0
  817. package/dist/ui/components/FileTree.d.ts +47 -0
  818. package/dist/ui/components/FileTree.d.ts.map +1 -0
  819. package/dist/ui/components/FileTree.js +258 -0
  820. package/dist/ui/components/FileTree.js.map +1 -0
  821. package/dist/ui/components/HelpMenu.d.ts +49 -0
  822. package/dist/ui/components/HelpMenu.d.ts.map +1 -0
  823. package/dist/ui/components/HelpMenu.js +91 -0
  824. package/dist/ui/components/HelpMenu.js.map +1 -0
  825. package/dist/ui/components/InterleavedStream.d.ts +42 -0
  826. package/dist/ui/components/InterleavedStream.d.ts.map +1 -0
  827. package/dist/ui/components/InterleavedStream.js +1500 -0
  828. package/dist/ui/components/InterleavedStream.js.map +1 -0
  829. package/dist/ui/components/ModelSelector.d.ts +81 -0
  830. package/dist/ui/components/ModelSelector.d.ts.map +1 -0
  831. package/dist/ui/components/ModelSelector.js +305 -0
  832. package/dist/ui/components/ModelSelector.js.map +1 -0
  833. package/dist/ui/components/PlanApprovalDialog.d.ts +21 -0
  834. package/dist/ui/components/PlanApprovalDialog.d.ts.map +1 -0
  835. package/dist/ui/components/PlanApprovalDialog.js +189 -0
  836. package/dist/ui/components/PlanApprovalDialog.js.map +1 -0
  837. package/dist/ui/components/PlanExecutionTracker.d.ts +53 -0
  838. package/dist/ui/components/PlanExecutionTracker.d.ts.map +1 -0
  839. package/dist/ui/components/PlanExecutionTracker.js +113 -0
  840. package/dist/ui/components/PlanExecutionTracker.js.map +1 -0
  841. package/dist/ui/components/ProgressIndicator.d.ts +151 -0
  842. package/dist/ui/components/ProgressIndicator.d.ts.map +1 -0
  843. package/dist/ui/components/ProgressIndicator.js +171 -0
  844. package/dist/ui/components/ProgressIndicator.js.map +1 -0
  845. package/dist/ui/components/Prompt.d.ts +47 -0
  846. package/dist/ui/components/Prompt.d.ts.map +1 -0
  847. package/dist/ui/components/Prompt.js +632 -0
  848. package/dist/ui/components/Prompt.js.map +1 -0
  849. package/dist/ui/components/RatingPanel.d.ts +45 -0
  850. package/dist/ui/components/RatingPanel.d.ts.map +1 -0
  851. package/dist/ui/components/RatingPanel.js +119 -0
  852. package/dist/ui/components/RatingPanel.js.map +1 -0
  853. package/dist/ui/components/StatusLine.d.ts +43 -0
  854. package/dist/ui/components/StatusLine.d.ts.map +1 -0
  855. package/dist/ui/components/StatusLine.js +44 -0
  856. package/dist/ui/components/StatusLine.js.map +1 -0
  857. package/dist/ui/components/StreamingResponse.d.ts +45 -0
  858. package/dist/ui/components/StreamingResponse.d.ts.map +1 -0
  859. package/dist/ui/components/StreamingResponse.js +56 -0
  860. package/dist/ui/components/StreamingResponse.js.map +1 -0
  861. package/dist/ui/components/TokenUsage.d.ts +89 -0
  862. package/dist/ui/components/TokenUsage.d.ts.map +1 -0
  863. package/dist/ui/components/TokenUsage.js +99 -0
  864. package/dist/ui/components/TokenUsage.js.map +1 -0
  865. package/dist/ui/components/ToolSummary.d.ts +77 -0
  866. package/dist/ui/components/ToolSummary.d.ts.map +1 -0
  867. package/dist/ui/components/ToolSummary.js +162 -0
  868. package/dist/ui/components/ToolSummary.js.map +1 -0
  869. package/dist/ui/components/UpdateNotification.d.ts +65 -0
  870. package/dist/ui/components/UpdateNotification.d.ts.map +1 -0
  871. package/dist/ui/components/UpdateNotification.js +166 -0
  872. package/dist/ui/components/UpdateNotification.js.map +1 -0
  873. package/dist/ui/diff-renderer.d.ts +18 -0
  874. package/dist/ui/diff-renderer.d.ts.map +1 -0
  875. package/dist/ui/diff-renderer.js +206 -0
  876. package/dist/ui/diff-renderer.js.map +1 -0
  877. package/dist/ui/themes/markdown-theme.d.ts +48 -0
  878. package/dist/ui/themes/markdown-theme.d.ts.map +1 -0
  879. package/dist/ui/themes/markdown-theme.js +79 -0
  880. package/dist/ui/themes/markdown-theme.js.map +1 -0
  881. package/dist/ui/themes/ui-theme.d.ts +301 -0
  882. package/dist/ui/themes/ui-theme.d.ts.map +1 -0
  883. package/dist/ui/themes/ui-theme.js +204 -0
  884. package/dist/ui/themes/ui-theme.js.map +1 -0
  885. package/dist/utils/attachment-handler.d.ts +129 -0
  886. package/dist/utils/attachment-handler.d.ts.map +1 -0
  887. package/dist/utils/attachment-handler.js +280 -0
  888. package/dist/utils/attachment-handler.js.map +1 -0
  889. package/dist/utils/backup-cleanup.d.ts +28 -0
  890. package/dist/utils/backup-cleanup.d.ts.map +1 -0
  891. package/dist/utils/backup-cleanup.js +99 -0
  892. package/dist/utils/backup-cleanup.js.map +1 -0
  893. package/dist/utils/clipboard-handler.d.ts +82 -0
  894. package/dist/utils/clipboard-handler.d.ts.map +1 -0
  895. package/dist/utils/clipboard-handler.js +311 -0
  896. package/dist/utils/clipboard-handler.js.map +1 -0
  897. package/dist/utils/cloud-detection.d.ts +14 -0
  898. package/dist/utils/cloud-detection.d.ts.map +1 -0
  899. package/dist/utils/cloud-detection.js +92 -0
  900. package/dist/utils/cloud-detection.js.map +1 -0
  901. package/dist/utils/command-parser.d.ts +56 -0
  902. package/dist/utils/command-parser.d.ts.map +1 -0
  903. package/dist/utils/command-parser.js +206 -0
  904. package/dist/utils/command-parser.js.map +1 -0
  905. package/dist/utils/console-capture.d.ts +30 -0
  906. package/dist/utils/console-capture.d.ts.map +1 -0
  907. package/dist/utils/console-capture.js +88 -0
  908. package/dist/utils/console-capture.js.map +1 -0
  909. package/dist/utils/cron-parser.d.ts +52 -0
  910. package/dist/utils/cron-parser.d.ts.map +1 -0
  911. package/dist/utils/cron-parser.js +455 -0
  912. package/dist/utils/cron-parser.js.map +1 -0
  913. package/dist/utils/crypto.d.ts +351 -0
  914. package/dist/utils/crypto.d.ts.map +1 -0
  915. package/dist/utils/crypto.js +615 -0
  916. package/dist/utils/crypto.js.map +1 -0
  917. package/dist/utils/diff.d.ts +311 -0
  918. package/dist/utils/diff.d.ts.map +1 -0
  919. package/dist/utils/diff.js +566 -0
  920. package/dist/utils/diff.js.map +1 -0
  921. package/dist/utils/editor.d.ts +12 -0
  922. package/dist/utils/editor.d.ts.map +1 -0
  923. package/dist/utils/editor.js +30 -0
  924. package/dist/utils/editor.js.map +1 -0
  925. package/dist/utils/file-system.d.ts +512 -0
  926. package/dist/utils/file-system.d.ts.map +1 -0
  927. package/dist/utils/file-system.js +798 -0
  928. package/dist/utils/file-system.js.map +1 -0
  929. package/dist/utils/format.d.ts +318 -0
  930. package/dist/utils/format.d.ts.map +1 -0
  931. package/dist/utils/format.js +587 -0
  932. package/dist/utils/format.js.map +1 -0
  933. package/dist/utils/ignore-patterns.d.ts +93 -0
  934. package/dist/utils/ignore-patterns.d.ts.map +1 -0
  935. package/dist/utils/ignore-patterns.js +710 -0
  936. package/dist/utils/ignore-patterns.js.map +1 -0
  937. package/dist/utils/log-cleanup.d.ts +16 -0
  938. package/dist/utils/log-cleanup.d.ts.map +1 -0
  939. package/dist/utils/log-cleanup.js +51 -0
  940. package/dist/utils/log-cleanup.js.map +1 -0
  941. package/dist/utils/logger.d.ts +305 -0
  942. package/dist/utils/logger.d.ts.map +1 -0
  943. package/dist/utils/logger.js +447 -0
  944. package/dist/utils/logger.js.map +1 -0
  945. package/dist/utils/path.d.ts +406 -0
  946. package/dist/utils/path.d.ts.map +1 -0
  947. package/dist/utils/path.js +549 -0
  948. package/dist/utils/path.js.map +1 -0
  949. package/dist/utils/schedule-file.d.ts +63 -0
  950. package/dist/utils/schedule-file.d.ts.map +1 -0
  951. package/dist/utils/schedule-file.js +244 -0
  952. package/dist/utils/schedule-file.js.map +1 -0
  953. package/dist/utils/task-id.d.ts +29 -0
  954. package/dist/utils/task-id.d.ts.map +1 -0
  955. package/dist/utils/task-id.js +53 -0
  956. package/dist/utils/task-id.js.map +1 -0
  957. package/dist/utils/temp-cleanup.d.ts +46 -0
  958. package/dist/utils/temp-cleanup.d.ts.map +1 -0
  959. package/dist/utils/temp-cleanup.js +95 -0
  960. package/dist/utils/temp-cleanup.js.map +1 -0
  961. package/dist/utils/terminal-output.d.ts +34 -0
  962. package/dist/utils/terminal-output.d.ts.map +1 -0
  963. package/dist/utils/terminal-output.js +40 -0
  964. package/dist/utils/terminal-output.js.map +1 -0
  965. package/dist/utils/token-counter.d.ts +224 -0
  966. package/dist/utils/token-counter.d.ts.map +1 -0
  967. package/dist/utils/token-counter.js +332 -0
  968. package/dist/utils/token-counter.js.map +1 -0
  969. package/dist/utils/tool-mapper.d.ts +70 -0
  970. package/dist/utils/tool-mapper.d.ts.map +1 -0
  971. package/dist/utils/tool-mapper.js +234 -0
  972. package/dist/utils/tool-mapper.js.map +1 -0
  973. package/package.json +1 -1
@@ -0,0 +1,1201 @@
1
+ /**
2
+ * Shell command execution service using execa for cross-platform command execution,
3
+ * streaming output, timeout handling, and environment management.
4
+ */
5
+ import { execa } from 'execa';
6
+ import { execSync } from 'child_process';
7
+ import { logger } from '../utils/logger.js';
8
+ import { SHELL_COMMAND_TIMEOUT_MS } from '../constants/defaults.js';
9
+ import { getSystemEventLogger } from './system-event-logger.js';
10
+ import { getEventEmitter } from '../core/event-emitter.js';
11
+ import { randomUUID } from 'crypto';
12
+ /**
13
+ * Cached preferred shell to avoid repeated detection
14
+ */
15
+ let cachedPreferredShell = null;
16
+ /**
17
+ * Detects the preferred shell for the current platform.
18
+ * On Windows, prefers PowerShell over cmd.exe for better capabilities.
19
+ * Result is cached for performance.
20
+ *
21
+ * @returns The path or name of the preferred shell
22
+ */
23
+ export function getPreferredShell() {
24
+ if (cachedPreferredShell !== null) {
25
+ return cachedPreferredShell;
26
+ }
27
+ if (process.platform === 'win32') {
28
+ // Check for PowerShell Core (pwsh) first - cross-platform, modern
29
+ try {
30
+ execSync('pwsh -Version', { stdio: 'pipe' });
31
+ cachedPreferredShell = 'pwsh';
32
+ logger.debug('Detected shell: pwsh (PowerShell Core)');
33
+ return cachedPreferredShell;
34
+ }
35
+ catch {
36
+ // pwsh not available
37
+ }
38
+ // Check for Windows PowerShell - always available on modern Windows
39
+ try {
40
+ execSync('powershell -Command "$PSVersionTable.PSVersion"', { stdio: 'pipe' });
41
+ cachedPreferredShell = 'powershell';
42
+ logger.debug('Detected shell: powershell (Windows PowerShell)');
43
+ return cachedPreferredShell;
44
+ }
45
+ catch {
46
+ // PowerShell not available (very rare)
47
+ }
48
+ // Fallback to cmd.exe
49
+ cachedPreferredShell = process.env.COMSPEC || 'cmd.exe';
50
+ logger.debug(`Detected shell: ${cachedPreferredShell} (fallback)`);
51
+ }
52
+ else {
53
+ // Unix-like systems - use SHELL env var or default to /bin/sh
54
+ cachedPreferredShell = process.env.SHELL || '/bin/sh';
55
+ logger.debug(`Detected shell: ${cachedPreferredShell}`);
56
+ }
57
+ return cachedPreferredShell;
58
+ }
59
+ /**
60
+ * Clears the cached shell detection (useful for testing)
61
+ */
62
+ export function clearShellCache() {
63
+ cachedPreferredShell = null;
64
+ }
65
+ /**
66
+ * ShellExecutor class provides safe shell command execution with configurable
67
+ * allowlists, blocklists, timeout handling, and streaming output support.
68
+ *
69
+ * Features:
70
+ * - Cross-platform command execution using execa
71
+ * - Configurable command allowlist and blocklist
72
+ * - Timeout handling with configurable defaults
73
+ * - Streaming output support for real-time feedback
74
+ * - Sequential command execution
75
+ * - Command existence checking
76
+ */
77
+ class ShellExecutor {
78
+ allowedCommands = [];
79
+ blockedCommands = [];
80
+ defaultTimeout = SHELL_COMMAND_TIMEOUT_MS;
81
+ backgroundProcesses = new Map();
82
+ /**
83
+ * Configures the shell executor with allowed/blocked commands and timeout settings.
84
+ *
85
+ * @param options - Configuration options
86
+ */
87
+ configure(options) {
88
+ if (options.allowedCommands) {
89
+ this.allowedCommands = options.allowedCommands;
90
+ }
91
+ if (options.blockedCommands) {
92
+ this.blockedCommands = options.blockedCommands;
93
+ }
94
+ if (options.defaultTimeout !== undefined) {
95
+ this.defaultTimeout = options.defaultTimeout;
96
+ }
97
+ logger.debug('ShellExecutor configured', {
98
+ allowedCommands: this.allowedCommands.length,
99
+ blockedCommands: this.blockedCommands.length,
100
+ defaultTimeout: this.defaultTimeout,
101
+ });
102
+ }
103
+ /**
104
+ * Checks if a command is allowed to be executed based on the configured
105
+ * allowlist and blocklist.
106
+ *
107
+ * @param command - The command string to check
108
+ * @returns True if the command is allowed, false otherwise
109
+ */
110
+ isCommandAllowed(command) {
111
+ const trimmedCommand = command.trim();
112
+ const baseCommand = trimmedCommand.split(/\s+/)[0];
113
+ // Check blocked commands first (patterns that should never be allowed)
114
+ for (const blocked of this.blockedCommands) {
115
+ // Check if the blocked pattern appears anywhere in the command
116
+ if (trimmedCommand.includes(blocked)) {
117
+ logger.warn(`Command blocked by pattern: ${blocked}`);
118
+ return false;
119
+ }
120
+ }
121
+ // If allowlist is empty, allow all non-blocked commands
122
+ if (this.allowedCommands.length === 0) {
123
+ return true;
124
+ }
125
+ // Check if the base command is in the allowlist
126
+ const isAllowed = this.allowedCommands.some((allowed) => {
127
+ // Exact match
128
+ if (baseCommand === allowed) {
129
+ return true;
130
+ }
131
+ // Match command at end of path (e.g., /usr/bin/npm matches npm)
132
+ if (baseCommand.endsWith(`/${allowed}`)) {
133
+ return true;
134
+ }
135
+ // Match npx-style commands (e.g., npx eslint)
136
+ if (baseCommand === 'npx' && this.allowedCommands.includes(trimmedCommand.split(/\s+/)[1])) {
137
+ return true;
138
+ }
139
+ return false;
140
+ });
141
+ if (!isAllowed) {
142
+ logger.warn(`Command not in allowlist: ${baseCommand}`);
143
+ }
144
+ return isAllowed;
145
+ }
146
+ /**
147
+ * Executes a shell command and returns the result.
148
+ * If toolCallId is provided, emits real-time status updates with the last 3 lines of output.
149
+ *
150
+ * @param command - The command to execute
151
+ * @param options - Execution options
152
+ * @returns Promise resolving to the execution result
153
+ */
154
+ async execute(command, options = {}) {
155
+ const startTime = Date.now();
156
+ const trimmedCommand = command.trim();
157
+ // Check if command is allowed
158
+ if (!this.isCommandAllowed(trimmedCommand)) {
159
+ logger.warn(`Command blocked: ${trimmedCommand}`);
160
+ return {
161
+ success: false,
162
+ stdout: '',
163
+ stderr: `Command not allowed: ${trimmedCommand}`,
164
+ exitCode: 1,
165
+ duration: 0,
166
+ timedOut: false,
167
+ killed: false,
168
+ command: trimmedCommand,
169
+ };
170
+ }
171
+ const cwd = options.cwd || process.cwd();
172
+ // If toolCallId is provided, use streaming execution with status updates
173
+ if (options.toolCallId) {
174
+ return this.executeWithStatusUpdates(trimmedCommand, options, cwd, startTime);
175
+ }
176
+ // Standard execution (no streaming status updates)
177
+ // Use preferred shell for consistent cross-platform behavior
178
+ const preferredShell = getPreferredShell();
179
+ const execaOptions = {
180
+ cwd,
181
+ env: { ...process.env, ...options.env },
182
+ timeout: options.timeout ?? this.defaultTimeout,
183
+ shell: options.shell === false ? false : preferredShell,
184
+ reject: false,
185
+ input: options.stdin,
186
+ stripFinalNewline: options.stripFinalNewline ?? true,
187
+ cancelSignal: options.signal,
188
+ };
189
+ try {
190
+ logger.debug(`Executing command: ${trimmedCommand}`, {
191
+ cwd: execaOptions.cwd,
192
+ timeout: execaOptions.timeout,
193
+ });
194
+ const result = await execa(trimmedCommand, execaOptions);
195
+ const duration = Date.now() - startTime;
196
+ const executionResult = {
197
+ success: result.exitCode === 0,
198
+ stdout: String(result.stdout || ''),
199
+ stderr: String(result.stderr || ''),
200
+ exitCode: result.exitCode ?? 1,
201
+ duration,
202
+ timedOut: result.timedOut ?? false,
203
+ killed: result.isTerminated ?? false,
204
+ command: trimmedCommand,
205
+ };
206
+ logger.debug(`Command completed: ${trimmedCommand}`, {
207
+ exitCode: executionResult.exitCode,
208
+ duration: executionResult.duration,
209
+ timedOut: executionResult.timedOut,
210
+ });
211
+ // Log to system event logger
212
+ getSystemEventLogger().logBashExecuted({
213
+ command: trimmedCommand,
214
+ cwd: execaOptions.cwd,
215
+ exitCode: executionResult.exitCode,
216
+ duration_ms: executionResult.duration,
217
+ stdout: executionResult.stdout,
218
+ stderr: executionResult.stderr,
219
+ timedOut: executionResult.timedOut,
220
+ killed: executionResult.killed,
221
+ });
222
+ return executionResult;
223
+ }
224
+ catch (error) {
225
+ const duration = Date.now() - startTime;
226
+ const execaError = error;
227
+ logger.error(`Command failed: ${trimmedCommand}`, {
228
+ error: execaError.message,
229
+ exitCode: execaError.exitCode,
230
+ });
231
+ const errorResult = {
232
+ success: false,
233
+ stdout: String(execaError.stdout || ''),
234
+ stderr: String(execaError.stderr || execaError.message || 'Unknown error'),
235
+ exitCode: execaError.exitCode ?? 1,
236
+ duration,
237
+ timedOut: execaError.timedOut ?? false,
238
+ killed: execaError.isTerminated ?? false,
239
+ command: trimmedCommand,
240
+ };
241
+ // Log to system event logger
242
+ getSystemEventLogger().logBashExecuted({
243
+ command: trimmedCommand,
244
+ cwd,
245
+ exitCode: errorResult.exitCode,
246
+ duration_ms: errorResult.duration,
247
+ stdout: errorResult.stdout,
248
+ stderr: errorResult.stderr,
249
+ timedOut: errorResult.timedOut,
250
+ killed: errorResult.killed,
251
+ });
252
+ return errorResult;
253
+ }
254
+ }
255
+ /**
256
+ * Executes a command with real-time status updates showing the last 3 lines of output.
257
+ * This provides visibility into long-running commands in the UI.
258
+ */
259
+ async executeWithStatusUpdates(command, options, cwd, startTime) {
260
+ const eventEmitter = getEventEmitter();
261
+ const toolCallId = options.toolCallId;
262
+ const lastLines = [];
263
+ const MAX_LINES = 5;
264
+ let hasMoreLines = false; // Track if we've dropped lines
265
+ // Buffer to accumulate incomplete lines
266
+ let stdoutBuffer = '';
267
+ let stderrBuffer = '';
268
+ let fullStdout = '';
269
+ let fullStderr = '';
270
+ // Emit initial status
271
+ eventEmitter.emit('tool-status-message', {
272
+ toolId: toolCallId,
273
+ message: 'Executing...',
274
+ });
275
+ let abortCleanup = null;
276
+ try {
277
+ logger.debug(`Executing command with status updates: ${command}`, { cwd });
278
+ const preferredShell = getPreferredShell();
279
+ const subprocess = execa(command, {
280
+ cwd,
281
+ env: { ...process.env, ...options.env },
282
+ timeout: options.timeout ?? this.defaultTimeout,
283
+ shell: options.shell === false ? false : preferredShell,
284
+ reject: false,
285
+ input: options.stdin,
286
+ stripFinalNewline: options.stripFinalNewline ?? true,
287
+ // NOTE: cancelSignal intentionally omitted — execa's cancel sends SIGTERM
288
+ // which on Windows doesn't force-kill the process tree. Instead, we listen
289
+ // for the abort event below and force-kill the entire process tree immediately.
290
+ });
291
+ // Force-kill the process tree immediately when Ctrl+X abort fires.
292
+ // On Windows, `taskkill /F /T /PID` kills the whole tree (child processes
293
+ // spawned by npm scripts, etc.) without waiting for graceful shutdown.
294
+ if (options.signal) {
295
+ const onAbort = () => {
296
+ const pid = subprocess.pid;
297
+ if (pid) {
298
+ logger.debug(`Force-killing process tree (PID ${pid}) after user abort`);
299
+ if (process.platform === 'win32') {
300
+ try {
301
+ execSync(`taskkill /F /T /PID ${pid}`, { stdio: 'ignore' });
302
+ }
303
+ catch {
304
+ // Process may have already exited
305
+ subprocess.kill('SIGKILL');
306
+ }
307
+ }
308
+ else {
309
+ // On Unix, kill the process group (negative PID)
310
+ try {
311
+ process.kill(-pid, 'SIGKILL');
312
+ }
313
+ catch {
314
+ subprocess.kill('SIGKILL');
315
+ }
316
+ }
317
+ }
318
+ else {
319
+ subprocess.kill('SIGKILL');
320
+ }
321
+ };
322
+ if (options.signal.aborted) {
323
+ onAbort();
324
+ }
325
+ else {
326
+ options.signal.addEventListener('abort', onAbort, { once: true });
327
+ abortCleanup = () => options.signal.removeEventListener('abort', onAbort);
328
+ }
329
+ }
330
+ // Process stdout chunks
331
+ if (subprocess.stdout) {
332
+ subprocess.stdout.on('data', (chunk) => {
333
+ const text = chunk.toString();
334
+ fullStdout += text;
335
+ stdoutBuffer += text;
336
+ // Process complete lines
337
+ const lines = stdoutBuffer.split('\n');
338
+ stdoutBuffer = lines.pop() || ''; // Keep incomplete line in buffer
339
+ for (const line of lines) {
340
+ if (line.trim()) {
341
+ lastLines.push(line.trim());
342
+ if (lastLines.length > MAX_LINES) {
343
+ lastLines.shift();
344
+ hasMoreLines = true;
345
+ }
346
+ }
347
+ }
348
+ // Emit status update with last lines (add ... if there are more lines)
349
+ if (lastLines.length > 0) {
350
+ const message = hasMoreLines
351
+ ? lastLines.join('\n') + '\n...'
352
+ : lastLines.join('\n');
353
+ eventEmitter.emit('tool-status-message', {
354
+ toolId: toolCallId,
355
+ message,
356
+ });
357
+ }
358
+ });
359
+ }
360
+ // Process stderr chunks
361
+ if (subprocess.stderr) {
362
+ subprocess.stderr.on('data', (chunk) => {
363
+ const text = chunk.toString();
364
+ fullStderr += text;
365
+ stderrBuffer += text;
366
+ // Process complete lines
367
+ const lines = stderrBuffer.split('\n');
368
+ stderrBuffer = lines.pop() || '';
369
+ for (const line of lines) {
370
+ if (line.trim()) {
371
+ lastLines.push(line.trim());
372
+ if (lastLines.length > MAX_LINES) {
373
+ lastLines.shift();
374
+ hasMoreLines = true;
375
+ }
376
+ }
377
+ }
378
+ // Emit status update (add ... if there are more lines)
379
+ if (lastLines.length > 0) {
380
+ const message = hasMoreLines
381
+ ? lastLines.join('\n') + '\n...'
382
+ : lastLines.join('\n');
383
+ eventEmitter.emit('tool-status-message', {
384
+ toolId: toolCallId,
385
+ message,
386
+ });
387
+ }
388
+ });
389
+ }
390
+ // Wait for process to complete
391
+ const result = await subprocess;
392
+ abortCleanup?.();
393
+ const duration = Date.now() - startTime;
394
+ const executionResult = {
395
+ success: result.exitCode === 0,
396
+ stdout: fullStdout || String(result.stdout || ''),
397
+ stderr: fullStderr || String(result.stderr || ''),
398
+ exitCode: result.exitCode ?? 1,
399
+ duration,
400
+ timedOut: result.timedOut ?? false,
401
+ killed: result.isTerminated ?? false,
402
+ command,
403
+ };
404
+ logger.debug(`Command completed: ${command}`, {
405
+ exitCode: executionResult.exitCode,
406
+ duration: executionResult.duration,
407
+ timedOut: executionResult.timedOut,
408
+ });
409
+ // Log to system event logger
410
+ getSystemEventLogger().logBashExecuted({
411
+ command,
412
+ cwd,
413
+ exitCode: executionResult.exitCode,
414
+ duration_ms: executionResult.duration,
415
+ stdout: executionResult.stdout,
416
+ stderr: executionResult.stderr,
417
+ timedOut: executionResult.timedOut,
418
+ killed: executionResult.killed,
419
+ });
420
+ return executionResult;
421
+ }
422
+ catch (error) {
423
+ abortCleanup?.();
424
+ const duration = Date.now() - startTime;
425
+ const execaError = error;
426
+ logger.error(`Command failed: ${command}`, {
427
+ error: execaError.message,
428
+ exitCode: execaError.exitCode,
429
+ });
430
+ const errorResult = {
431
+ success: false,
432
+ stdout: fullStdout || String(execaError.stdout || ''),
433
+ stderr: fullStderr || String(execaError.stderr || execaError.message || 'Unknown error'),
434
+ exitCode: execaError.exitCode ?? 1,
435
+ duration,
436
+ timedOut: execaError.timedOut ?? false,
437
+ killed: execaError.isTerminated ?? false,
438
+ command,
439
+ };
440
+ // Log to system event logger
441
+ getSystemEventLogger().logBashExecuted({
442
+ command,
443
+ cwd,
444
+ exitCode: errorResult.exitCode,
445
+ duration_ms: errorResult.duration,
446
+ stdout: errorResult.stdout,
447
+ stderr: errorResult.stderr,
448
+ timedOut: errorResult.timedOut,
449
+ killed: errorResult.killed,
450
+ });
451
+ return errorResult;
452
+ }
453
+ }
454
+ /**
455
+ * Executes a command and yields streaming output chunks.
456
+ * This allows for real-time output display during long-running commands.
457
+ *
458
+ * @param command - The command to execute
459
+ * @param options - Execution options
460
+ * @yields Streaming output chunks
461
+ */
462
+ async *executeStreaming(command, options = {}) {
463
+ const trimmedCommand = command.trim();
464
+ // Check if command is allowed
465
+ if (!this.isCommandAllowed(trimmedCommand)) {
466
+ yield { type: 'stderr', data: `Command not allowed: ${trimmedCommand}` };
467
+ yield { type: 'exit', data: 1 };
468
+ return;
469
+ }
470
+ const preferredShell = getPreferredShell();
471
+ const execaOptions = {
472
+ cwd: options.cwd || process.cwd(),
473
+ env: { ...process.env, ...options.env },
474
+ timeout: options.timeout ?? this.defaultTimeout,
475
+ shell: options.shell === false ? false : preferredShell,
476
+ input: options.stdin,
477
+ stripFinalNewline: options.stripFinalNewline ?? true,
478
+ };
479
+ try {
480
+ logger.debug(`Executing streaming command: ${trimmedCommand}`);
481
+ // For streaming, we need to handle the subprocess differently
482
+ // Since execa v9 uses a different API, we'll collect output and yield it
483
+ const subprocess = execa(trimmedCommand, {
484
+ ...execaOptions,
485
+ reject: false,
486
+ cancelSignal: options.signal,
487
+ });
488
+ // Wait for the process to complete
489
+ const result = await subprocess;
490
+ // Yield stdout if present
491
+ if (result.stdout) {
492
+ yield { type: 'stdout', data: String(result.stdout) };
493
+ }
494
+ // Yield stderr if present
495
+ if (result.stderr) {
496
+ yield { type: 'stderr', data: String(result.stderr) };
497
+ }
498
+ // Yield exit code
499
+ yield { type: 'exit', data: result.exitCode ?? 0 };
500
+ }
501
+ catch (error) {
502
+ const execaError = error;
503
+ // Yield any output that was captured
504
+ if (execaError.stdout) {
505
+ yield { type: 'stdout', data: String(execaError.stdout) };
506
+ }
507
+ // Yield error message
508
+ yield {
509
+ type: 'stderr',
510
+ data: String(execaError.stderr || execaError.message || 'Command execution failed'),
511
+ };
512
+ // Yield exit code
513
+ yield { type: 'exit', data: execaError.exitCode ?? 1 };
514
+ }
515
+ }
516
+ /**
517
+ * Executes multiple commands in sequence, stopping on first failure.
518
+ *
519
+ * @param commands - Array of commands to execute
520
+ * @param options - Execution options applied to all commands
521
+ * @returns Array of execution results (may be shorter than input if a command fails)
522
+ */
523
+ async executeSequence(commands, options = {}) {
524
+ const results = [];
525
+ for (const command of commands) {
526
+ const result = await this.execute(command, options);
527
+ results.push(result);
528
+ // Stop on first failure
529
+ if (!result.success) {
530
+ logger.debug(`Sequence stopped due to failure at command: ${command}`);
531
+ break;
532
+ }
533
+ }
534
+ return results;
535
+ }
536
+ /**
537
+ * Executes multiple commands in parallel.
538
+ *
539
+ * @param commands - Array of commands to execute
540
+ * @param options - Execution options applied to all commands
541
+ * @returns Array of execution results in the same order as input commands
542
+ */
543
+ async executeParallel(commands, options = {}) {
544
+ const promises = commands.map((command) => this.execute(command, options));
545
+ return Promise.all(promises);
546
+ }
547
+ /**
548
+ * Gets the preferred shell being used for command execution.
549
+ *
550
+ * @returns The path to the preferred shell
551
+ */
552
+ getShell() {
553
+ return getPreferredShell();
554
+ }
555
+ /**
556
+ * Checks if a command exists and is executable.
557
+ *
558
+ * @param command - The command name to check
559
+ * @returns True if the command exists, false otherwise
560
+ */
561
+ async commandExists(command) {
562
+ // Use where.exe explicitly on Windows because 'where' is aliased to Where-Object in PowerShell
563
+ const checkCommand = process.platform === 'win32' ? `where.exe ${command}` : `which ${command}`;
564
+ try {
565
+ const result = await this.execute(checkCommand, {
566
+ timeout: 5000,
567
+ shell: true,
568
+ });
569
+ return result.success && result.stdout.trim().length > 0;
570
+ }
571
+ catch {
572
+ return false;
573
+ }
574
+ }
575
+ /**
576
+ * Gets the version of a command if it supports --version flag.
577
+ *
578
+ * @param command - The command to get version for
579
+ * @returns The version string or null if not available
580
+ */
581
+ async getCommandVersion(command) {
582
+ try {
583
+ const result = await this.execute(`${command} --version`, {
584
+ timeout: 5000,
585
+ });
586
+ if (result.success && result.stdout) {
587
+ // Extract first line which usually contains version
588
+ const firstLine = result.stdout.split('\n')[0].trim();
589
+ return firstLine || null;
590
+ }
591
+ return null;
592
+ }
593
+ catch {
594
+ return null;
595
+ }
596
+ }
597
+ /**
598
+ * Validates a command string for basic safety checks.
599
+ * This is a supplementary check to the allowlist/blocklist system.
600
+ *
601
+ * @param command - The command to validate
602
+ * @returns Object with validation result and optional error message
603
+ */
604
+ validateCommand(command) {
605
+ const trimmed = command.trim();
606
+ // Check for empty command
607
+ if (!trimmed) {
608
+ return { valid: false, error: 'Command cannot be empty' };
609
+ }
610
+ // Check for command injection patterns
611
+ const dangerousPatterns = [
612
+ /;\s*rm\s+-rf/i,
613
+ /&&\s*rm\s+-rf/i,
614
+ /\|\s*rm\s+-rf/i,
615
+ /`.*`/, // Backtick command substitution
616
+ /\$\(.*\)/, // $() command substitution in dangerous context
617
+ ];
618
+ for (const pattern of dangerousPatterns) {
619
+ if (pattern.test(trimmed)) {
620
+ return {
621
+ valid: false,
622
+ error: 'Command contains potentially dangerous patterns',
623
+ };
624
+ }
625
+ }
626
+ // Check against blocklist
627
+ if (!this.isCommandAllowed(trimmed)) {
628
+ return { valid: false, error: 'Command is not allowed' };
629
+ }
630
+ return { valid: true };
631
+ }
632
+ /**
633
+ * Creates a safe command string by escaping special characters.
634
+ * Note: This is a basic implementation; for complex cases, use proper escaping libraries.
635
+ *
636
+ * @param parts - Command parts to join safely
637
+ * @returns Escaped command string
638
+ */
639
+ escapeCommand(parts) {
640
+ return parts
641
+ .map((part) => {
642
+ // If part contains spaces or special characters, quote it
643
+ if (/[\s"'`$\\]/.test(part)) {
644
+ // Escape existing quotes and wrap in quotes
645
+ return `"${part.replace(/"/g, '\\"')}"`;
646
+ }
647
+ return part;
648
+ })
649
+ .join(' ');
650
+ }
651
+ // ============================================================
652
+ // VERIFICATION MODE EXECUTION
653
+ // ============================================================
654
+ /**
655
+ * Executes a command and monitors output for success/error patterns.
656
+ * Useful for verifying that long-running commands like dev servers start correctly.
657
+ * The process is automatically terminated after verification or timeout.
658
+ *
659
+ * @param command - The command to execute
660
+ * @param options - Verification options including success/error patterns
661
+ * @returns Promise resolving to the verification result
662
+ *
663
+ * @example
664
+ * ```typescript
665
+ * const result = await executor.executeAndVerify('npm start', {
666
+ * successPatterns: ['Listening on port', 'Server started'],
667
+ * errorPatterns: ['Error:', 'EADDRINUSE'],
668
+ * verificationTimeout: 15000,
669
+ * });
670
+ * if (result.verified) {
671
+ * console.log('Server started successfully!');
672
+ * }
673
+ * ```
674
+ */
675
+ async executeAndVerify(command, options = {}) {
676
+ const startTime = Date.now();
677
+ const trimmedCommand = command.trim();
678
+ // Check if command is allowed
679
+ if (!this.isCommandAllowed(trimmedCommand)) {
680
+ logger.warn(`Command blocked: ${trimmedCommand}`);
681
+ return {
682
+ success: false,
683
+ stdout: '',
684
+ stderr: `Command not allowed: ${trimmedCommand}`,
685
+ exitCode: 1,
686
+ duration: 0,
687
+ timedOut: false,
688
+ killed: false,
689
+ command: trimmedCommand,
690
+ verified: false,
691
+ terminatedAfterVerification: false,
692
+ };
693
+ }
694
+ const cwd = options.cwd || process.cwd();
695
+ const verificationTimeout = options.verificationTimeout ?? 15000;
696
+ const eventEmitter = getEventEmitter();
697
+ const toolCallId = options.toolCallId;
698
+ // Default patterns for common dev servers
699
+ const successPatterns = (options.successPatterns ?? [
700
+ 'listening on',
701
+ 'server started',
702
+ 'server running',
703
+ 'ready on',
704
+ 'started server',
705
+ 'compiled successfully',
706
+ 'webpack compiled',
707
+ 'dev server running',
708
+ 'localhost:',
709
+ '127.0.0.1:',
710
+ ]).map(p => new RegExp(p, 'i'));
711
+ const errorPatterns = (options.errorPatterns ?? [
712
+ 'error:',
713
+ 'eaddrinuse',
714
+ 'eacces',
715
+ 'enoent',
716
+ 'failed to',
717
+ 'cannot find',
718
+ 'module not found',
719
+ 'command not found',
720
+ 'npm err!',
721
+ ]).map(p => new RegExp(p, 'i'));
722
+ let fullStdout = '';
723
+ let fullStderr = '';
724
+ let verified = false;
725
+ let matchedPattern;
726
+ let isError = false;
727
+ const lastLines = [];
728
+ const MAX_LINES = 5;
729
+ let hasMoreLines = false;
730
+ // Emit initial status
731
+ if (toolCallId) {
732
+ eventEmitter.emit('tool-status-message', {
733
+ toolId: toolCallId,
734
+ message: 'Starting and verifying...',
735
+ });
736
+ }
737
+ return new Promise((resolve) => {
738
+ logger.debug(`Executing with verification: ${trimmedCommand}`, { cwd, verificationTimeout });
739
+ const preferredShell = getPreferredShell();
740
+ const subprocess = execa(trimmedCommand, {
741
+ cwd,
742
+ env: { ...process.env, ...options.env },
743
+ timeout: 0, // No timeout - we handle it ourselves
744
+ shell: options.shell === false ? false : preferredShell,
745
+ reject: false,
746
+ stripFinalNewline: options.stripFinalNewline ?? true,
747
+ cancelSignal: options.signal,
748
+ });
749
+ let resolved = false;
750
+ const finishVerification = (success, pattern, error = false) => {
751
+ if (resolved)
752
+ return;
753
+ resolved = true;
754
+ verified = success && !error;
755
+ matchedPattern = pattern;
756
+ isError = error;
757
+ // Kill the process gracefully
758
+ try {
759
+ subprocess.kill('SIGTERM');
760
+ // Give it a moment, then force kill if needed
761
+ setTimeout(() => {
762
+ try {
763
+ subprocess.kill('SIGKILL');
764
+ }
765
+ catch {
766
+ // Process may already be dead
767
+ }
768
+ }, 1000);
769
+ }
770
+ catch {
771
+ // Process may already be dead
772
+ }
773
+ const duration = Date.now() - startTime;
774
+ const result = {
775
+ success: verified,
776
+ stdout: fullStdout,
777
+ stderr: fullStderr,
778
+ exitCode: verified ? 0 : 1,
779
+ duration,
780
+ timedOut: !verified && !isError,
781
+ killed: true,
782
+ command: trimmedCommand,
783
+ verified,
784
+ matchedPattern,
785
+ terminatedAfterVerification: true,
786
+ };
787
+ logger.debug(`Verification complete: ${trimmedCommand}`, {
788
+ verified,
789
+ matchedPattern,
790
+ duration,
791
+ });
792
+ // Log to system event logger
793
+ getSystemEventLogger().logBashExecuted({
794
+ command: trimmedCommand,
795
+ cwd,
796
+ exitCode: result.exitCode,
797
+ duration_ms: duration,
798
+ stdout: result.stdout,
799
+ stderr: result.stderr,
800
+ timedOut: result.timedOut,
801
+ killed: result.killed,
802
+ });
803
+ resolve(result);
804
+ };
805
+ // Set up verification timeout
806
+ const timeoutId = setTimeout(() => {
807
+ logger.debug(`Verification timeout reached for: ${trimmedCommand}`);
808
+ if (toolCallId) {
809
+ eventEmitter.emit('tool-status-message', {
810
+ toolId: toolCallId,
811
+ message: 'Verification timeout - terminating process',
812
+ });
813
+ }
814
+ finishVerification(false, undefined, false);
815
+ }, verificationTimeout);
816
+ const checkOutput = (text, _source) => {
817
+ // Check for success patterns
818
+ for (const pattern of successPatterns) {
819
+ if (pattern.test(text)) {
820
+ logger.debug(`Success pattern matched: ${pattern.source}`);
821
+ clearTimeout(timeoutId);
822
+ if (toolCallId) {
823
+ eventEmitter.emit('tool-status-message', {
824
+ toolId: toolCallId,
825
+ message: `✓ Verified: ${pattern.source}`,
826
+ });
827
+ }
828
+ finishVerification(true, pattern.source, false);
829
+ return;
830
+ }
831
+ }
832
+ // Check for error patterns
833
+ for (const pattern of errorPatterns) {
834
+ if (pattern.test(text)) {
835
+ logger.debug(`Error pattern matched: ${pattern.source}`);
836
+ clearTimeout(timeoutId);
837
+ if (toolCallId) {
838
+ eventEmitter.emit('tool-status-message', {
839
+ toolId: toolCallId,
840
+ message: `✗ Error: ${pattern.source}`,
841
+ });
842
+ }
843
+ finishVerification(false, pattern.source, true);
844
+ return;
845
+ }
846
+ }
847
+ };
848
+ // Process stdout
849
+ if (subprocess.stdout) {
850
+ subprocess.stdout.on('data', (chunk) => {
851
+ const text = chunk.toString();
852
+ fullStdout += text;
853
+ // Update status display
854
+ const lines = text.split('\n').filter(l => l.trim());
855
+ for (const line of lines) {
856
+ lastLines.push(line.trim());
857
+ if (lastLines.length > MAX_LINES) {
858
+ lastLines.shift();
859
+ hasMoreLines = true;
860
+ }
861
+ }
862
+ if (toolCallId && lastLines.length > 0) {
863
+ const message = hasMoreLines
864
+ ? lastLines.join('\n') + '\n...'
865
+ : lastLines.join('\n');
866
+ eventEmitter.emit('tool-status-message', {
867
+ toolId: toolCallId,
868
+ message,
869
+ });
870
+ }
871
+ checkOutput(text, 'stdout');
872
+ });
873
+ }
874
+ // Process stderr
875
+ if (subprocess.stderr) {
876
+ subprocess.stderr.on('data', (chunk) => {
877
+ const text = chunk.toString();
878
+ fullStderr += text;
879
+ // Update status display
880
+ const lines = text.split('\n').filter(l => l.trim());
881
+ for (const line of lines) {
882
+ lastLines.push(line.trim());
883
+ if (lastLines.length > MAX_LINES) {
884
+ lastLines.shift();
885
+ hasMoreLines = true;
886
+ }
887
+ }
888
+ if (toolCallId && lastLines.length > 0) {
889
+ const message = hasMoreLines
890
+ ? lastLines.join('\n') + '\n...'
891
+ : lastLines.join('\n');
892
+ eventEmitter.emit('tool-status-message', {
893
+ toolId: toolCallId,
894
+ message,
895
+ });
896
+ }
897
+ checkOutput(text, 'stderr');
898
+ });
899
+ }
900
+ // Handle process exit (in case it exits on its own before verification)
901
+ subprocess.then((result) => {
902
+ clearTimeout(timeoutId);
903
+ if (!resolved) {
904
+ const exitSuccess = result.exitCode === 0;
905
+ fullStdout = String(result.stdout || fullStdout);
906
+ fullStderr = String(result.stderr || fullStderr);
907
+ const duration = Date.now() - startTime;
908
+ resolve({
909
+ success: exitSuccess,
910
+ stdout: fullStdout,
911
+ stderr: fullStderr,
912
+ exitCode: result.exitCode ?? 1,
913
+ duration,
914
+ timedOut: false,
915
+ killed: false,
916
+ command: trimmedCommand,
917
+ verified: exitSuccess,
918
+ matchedPattern: exitSuccess ? 'process exited successfully' : undefined,
919
+ terminatedAfterVerification: false,
920
+ });
921
+ }
922
+ }).catch((error) => {
923
+ clearTimeout(timeoutId);
924
+ if (!resolved) {
925
+ fullStdout = String(error.stdout || fullStdout);
926
+ fullStderr = String(error.stderr || fullStderr);
927
+ const duration = Date.now() - startTime;
928
+ resolve({
929
+ success: false,
930
+ stdout: fullStdout,
931
+ stderr: fullStderr,
932
+ exitCode: error.exitCode ?? 1,
933
+ duration,
934
+ timedOut: error.timedOut ?? false,
935
+ killed: error.isTerminated ?? false,
936
+ command: trimmedCommand,
937
+ verified: false,
938
+ matchedPattern: undefined,
939
+ terminatedAfterVerification: false,
940
+ });
941
+ }
942
+ });
943
+ });
944
+ }
945
+ // ============================================================
946
+ // BACKGROUND PROCESS MANAGEMENT
947
+ // ============================================================
948
+ /**
949
+ * Executes a command in the background and returns a process ID for tracking.
950
+ * The process will continue running and can be monitored or killed later.
951
+ *
952
+ * @param command - The command to execute
953
+ * @param options - Execution options
954
+ * @returns Object containing the process ID and initial status
955
+ */
956
+ executeBackground(command, options = {}) {
957
+ const trimmedCommand = command.trim();
958
+ // Check if command is allowed
959
+ if (!this.isCommandAllowed(trimmedCommand)) {
960
+ logger.warn(`Background command blocked: ${trimmedCommand}`);
961
+ return {
962
+ id: '',
963
+ command: trimmedCommand,
964
+ status: 'blocked',
965
+ };
966
+ }
967
+ const id = randomUUID().substring(0, 8);
968
+ const cwd = options.cwd || process.cwd();
969
+ const preferredShell = getPreferredShell();
970
+ const execaOptions = {
971
+ cwd,
972
+ env: { ...process.env, ...options.env },
973
+ timeout: options.timeout ?? 0, // No timeout for background processes by default
974
+ shell: options.shell === false ? false : preferredShell,
975
+ reject: false,
976
+ input: options.stdin,
977
+ stripFinalNewline: options.stripFinalNewline ?? true,
978
+ };
979
+ logger.debug(`Starting background command [${id}]: ${trimmedCommand}`);
980
+ const subprocess = execa(trimmedCommand, execaOptions);
981
+ const backgroundProcess = {
982
+ id,
983
+ command: trimmedCommand,
984
+ cwd,
985
+ startedAt: new Date(),
986
+ status: 'running',
987
+ stdout: '',
988
+ stderr: '',
989
+ process: subprocess,
990
+ };
991
+ this.backgroundProcesses.set(id, backgroundProcess);
992
+ // Handle process completion
993
+ subprocess.then((result) => {
994
+ const proc = this.backgroundProcesses.get(id);
995
+ if (proc && proc.status === 'running') {
996
+ proc.status = result.exitCode === 0 ? 'completed' : 'failed';
997
+ proc.exitCode = result.exitCode ?? 1;
998
+ proc.stdout = String(result.stdout || '');
999
+ proc.stderr = String(result.stderr || '');
1000
+ logger.debug(`Background command [${id}] completed with exit code ${proc.exitCode}`);
1001
+ }
1002
+ }).catch((error) => {
1003
+ const proc = this.backgroundProcesses.get(id);
1004
+ if (proc && proc.status === 'running') {
1005
+ proc.status = 'failed';
1006
+ proc.exitCode = error.exitCode ?? 1;
1007
+ proc.stdout = String(error.stdout || '');
1008
+ proc.stderr = String(error.stderr || error.message || 'Command failed');
1009
+ logger.debug(`Background command [${id}] failed: ${error.message}`);
1010
+ }
1011
+ });
1012
+ return {
1013
+ id,
1014
+ command: trimmedCommand,
1015
+ status: 'running',
1016
+ };
1017
+ }
1018
+ /**
1019
+ * Kills a background process by its ID.
1020
+ *
1021
+ * @param id - The process ID to kill
1022
+ * @param signal - The signal to send (default: SIGTERM)
1023
+ * @returns Object with success status and details
1024
+ */
1025
+ killProcess(id, signal = 'SIGTERM') {
1026
+ const proc = this.backgroundProcesses.get(id);
1027
+ if (!proc) {
1028
+ return {
1029
+ success: false,
1030
+ message: `No process found with ID: ${id}`,
1031
+ };
1032
+ }
1033
+ if (proc.status !== 'running') {
1034
+ return {
1035
+ success: false,
1036
+ message: `Process ${id} is not running (status: ${proc.status})`,
1037
+ process: { ...proc, process: undefined },
1038
+ };
1039
+ }
1040
+ try {
1041
+ // Kill the process
1042
+ proc.process.kill(signal);
1043
+ proc.status = 'killed';
1044
+ logger.info(`Killed background process [${id}]: ${proc.command}`);
1045
+ // Log to system event logger
1046
+ getSystemEventLogger().logBashExecuted({
1047
+ command: proc.command,
1048
+ cwd: proc.cwd,
1049
+ exitCode: -1,
1050
+ duration_ms: Date.now() - proc.startedAt.getTime(),
1051
+ stdout: proc.stdout,
1052
+ stderr: proc.stderr,
1053
+ timedOut: false,
1054
+ killed: true,
1055
+ });
1056
+ return {
1057
+ success: true,
1058
+ message: `Process ${id} killed successfully`,
1059
+ process: { ...proc, process: undefined },
1060
+ };
1061
+ }
1062
+ catch (error) {
1063
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
1064
+ logger.error(`Failed to kill process [${id}]: ${errorMessage}`);
1065
+ return {
1066
+ success: false,
1067
+ message: `Failed to kill process: ${errorMessage}`,
1068
+ process: { ...proc, process: undefined },
1069
+ };
1070
+ }
1071
+ }
1072
+ /**
1073
+ * Gets the status of a background process.
1074
+ *
1075
+ * @param id - The process ID to check
1076
+ * @returns The process info or null if not found
1077
+ */
1078
+ getProcessStatus(id) {
1079
+ const proc = this.backgroundProcesses.get(id);
1080
+ if (!proc) {
1081
+ return null;
1082
+ }
1083
+ // Return without the process object (not serializable)
1084
+ const { process: _process, ...rest } = proc;
1085
+ return rest;
1086
+ }
1087
+ /**
1088
+ * Lists all tracked background processes.
1089
+ *
1090
+ * @param filter - Optional filter by status
1091
+ * @returns Array of process info objects
1092
+ */
1093
+ listProcesses(filter) {
1094
+ const processes = [];
1095
+ for (const proc of this.backgroundProcesses.values()) {
1096
+ if (!filter || proc.status === filter) {
1097
+ const { process: _process, ...rest } = proc;
1098
+ processes.push(rest);
1099
+ }
1100
+ }
1101
+ return processes;
1102
+ }
1103
+ /**
1104
+ * Cleans up completed/failed/killed processes from tracking.
1105
+ *
1106
+ * @param olderThan - Optional: only clean processes older than this many milliseconds
1107
+ * @returns Number of processes cleaned up
1108
+ */
1109
+ cleanupProcesses(olderThan) {
1110
+ let cleaned = 0;
1111
+ const now = Date.now();
1112
+ for (const [id, proc] of this.backgroundProcesses) {
1113
+ if (proc.status !== 'running') {
1114
+ if (!olderThan || (now - proc.startedAt.getTime() > olderThan)) {
1115
+ this.backgroundProcesses.delete(id);
1116
+ cleaned++;
1117
+ }
1118
+ }
1119
+ }
1120
+ if (cleaned > 0) {
1121
+ logger.debug(`Cleaned up ${cleaned} background processes`);
1122
+ }
1123
+ return cleaned;
1124
+ }
1125
+ /**
1126
+ * Kills all running background processes.
1127
+ *
1128
+ * @param signal - The signal to send (default: SIGTERM)
1129
+ * @returns Number of processes killed
1130
+ */
1131
+ killAllProcesses(signal = 'SIGTERM') {
1132
+ let killed = 0;
1133
+ for (const [id, proc] of this.backgroundProcesses) {
1134
+ if (proc.status === 'running') {
1135
+ const result = this.killProcess(id, signal);
1136
+ if (result.success) {
1137
+ killed++;
1138
+ }
1139
+ }
1140
+ }
1141
+ if (killed > 0) {
1142
+ logger.info(`Killed ${killed} background processes`);
1143
+ }
1144
+ return killed;
1145
+ }
1146
+ /**
1147
+ * Gets the current configuration of the executor.
1148
+ *
1149
+ * @returns Current configuration
1150
+ */
1151
+ getConfig() {
1152
+ return {
1153
+ allowedCommands: [...this.allowedCommands],
1154
+ blockedCommands: [...this.blockedCommands],
1155
+ defaultTimeout: this.defaultTimeout,
1156
+ };
1157
+ }
1158
+ /**
1159
+ * Resets the executor configuration to defaults.
1160
+ * Also kills all running background processes.
1161
+ */
1162
+ reset() {
1163
+ // Kill any running background processes
1164
+ this.killAllProcesses();
1165
+ this.backgroundProcesses.clear();
1166
+ this.allowedCommands = [];
1167
+ this.blockedCommands = [];
1168
+ this.defaultTimeout = SHELL_COMMAND_TIMEOUT_MS;
1169
+ logger.debug('ShellExecutor reset to defaults');
1170
+ }
1171
+ }
1172
+ // Singleton instance
1173
+ let shellExecutorInstance = null;
1174
+ /**
1175
+ * Gets the singleton ShellExecutor instance.
1176
+ * Creates the instance on first call.
1177
+ *
1178
+ * @returns The ShellExecutor singleton instance
1179
+ */
1180
+ export function getShellExecutor() {
1181
+ if (!shellExecutorInstance) {
1182
+ shellExecutorInstance = new ShellExecutor();
1183
+ }
1184
+ return shellExecutorInstance;
1185
+ }
1186
+ /**
1187
+ * Creates a new ShellExecutor instance with optional configuration.
1188
+ * Use this when you need a separate instance from the singleton.
1189
+ *
1190
+ * @param config - Optional configuration options
1191
+ * @returns A new ShellExecutor instance
1192
+ */
1193
+ export function createShellExecutor(config) {
1194
+ const executor = new ShellExecutor();
1195
+ if (config) {
1196
+ executor.configure(config);
1197
+ }
1198
+ return executor;
1199
+ }
1200
+ export { ShellExecutor };
1201
+ //# sourceMappingURL=shell-executor.js.map