sema-core 1.0.13 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (680) hide show
  1. package/README.md +22 -9
  2. package/dist/{constants → conf}/config.d.ts +0 -1
  3. package/dist/conf/config.d.ts.map +1 -0
  4. package/dist/{constants → conf}/config.js +1 -3
  5. package/dist/conf/config.js.map +1 -0
  6. package/dist/core/Conversation.d.ts +3 -14
  7. package/dist/core/Conversation.d.ts.map +1 -1
  8. package/dist/core/Conversation.js +53 -89
  9. package/dist/core/Conversation.js.map +1 -1
  10. package/dist/core/RunTools.d.ts +5 -5
  11. package/dist/core/RunTools.d.ts.map +1 -1
  12. package/dist/core/RunTools.js +22 -31
  13. package/dist/core/RunTools.js.map +1 -1
  14. package/dist/core/SemaCore.d.ts +21 -22
  15. package/dist/core/SemaCore.d.ts.map +1 -1
  16. package/dist/core/SemaCore.js +16 -24
  17. package/dist/core/SemaCore.js.map +1 -1
  18. package/dist/core/SemaEngine.d.ts +2 -2
  19. package/dist/core/SemaEngine.d.ts.map +1 -1
  20. package/dist/core/SemaEngine.js +30 -33
  21. package/dist/core/SemaEngine.js.map +1 -1
  22. package/dist/events/EventSystem.d.ts.map +1 -1
  23. package/dist/events/EventSystem.js +3 -2
  24. package/dist/events/EventSystem.js.map +1 -1
  25. package/dist/events/types.d.ts +75 -41
  26. package/dist/events/types.d.ts.map +1 -1
  27. package/dist/manager/ConfManager.d.ts +10 -3
  28. package/dist/manager/ConfManager.d.ts.map +1 -1
  29. package/dist/manager/ConfManager.js +30 -13
  30. package/dist/manager/ConfManager.js.map +1 -1
  31. package/dist/manager/CronManager.d.ts +3 -6
  32. package/dist/manager/CronManager.d.ts.map +1 -1
  33. package/dist/manager/CronManager.js +62 -74
  34. package/dist/manager/CronManager.js.map +1 -1
  35. package/dist/manager/ModelManager.d.ts +0 -3
  36. package/dist/manager/ModelManager.d.ts.map +1 -1
  37. package/dist/manager/ModelManager.js +2 -4
  38. package/dist/manager/ModelManager.js.map +1 -1
  39. package/dist/manager/PermissionManager.d.ts +4 -6
  40. package/dist/manager/PermissionManager.d.ts.map +1 -1
  41. package/dist/manager/PermissionManager.js +70 -65
  42. package/dist/manager/PermissionManager.js.map +1 -1
  43. package/dist/manager/StateManager.d.ts +40 -7
  44. package/dist/manager/StateManager.d.ts.map +1 -1
  45. package/dist/manager/StateManager.js +79 -22
  46. package/dist/manager/StateManager.js.map +1 -1
  47. package/dist/manager/TaskManager.d.ts +2 -9
  48. package/dist/manager/TaskManager.d.ts.map +1 -1
  49. package/dist/manager/TaskManager.js +64 -66
  50. package/dist/manager/TaskManager.js.map +1 -1
  51. package/dist/prompt/agents.d.ts +3 -0
  52. package/dist/prompt/agents.d.ts.map +1 -0
  53. package/dist/prompt/agents.js +52 -0
  54. package/dist/prompt/agents.js.map +1 -0
  55. package/dist/prompt/commands.d.ts +3 -0
  56. package/dist/prompt/commands.d.ts.map +1 -0
  57. package/dist/prompt/commands.js +19 -0
  58. package/dist/prompt/commands.js.map +1 -0
  59. package/dist/prompt/compact.d.ts +2 -0
  60. package/dist/prompt/compact.d.ts.map +1 -0
  61. package/dist/prompt/compact.js +22 -0
  62. package/dist/prompt/compact.js.map +1 -0
  63. package/dist/prompt/define.d.ts +5 -0
  64. package/dist/prompt/define.d.ts.map +1 -0
  65. package/dist/prompt/define.js +8 -0
  66. package/dist/prompt/define.js.map +1 -0
  67. package/dist/prompt/design/design.d.ts +47 -0
  68. package/dist/prompt/design/design.d.ts.map +1 -0
  69. package/dist/prompt/design/design.js +224 -0
  70. package/dist/prompt/design/design.js.map +1 -0
  71. package/dist/prompt/design/designPhilosophy.d.ts +2 -0
  72. package/dist/prompt/design/designPhilosophy.d.ts.map +1 -0
  73. package/dist/prompt/design/designPhilosophy.js +79 -0
  74. package/dist/prompt/design/designPhilosophy.js.map +1 -0
  75. package/dist/prompt/design/designSystemSpec.d.ts +2 -0
  76. package/dist/prompt/design/designSystemSpec.d.ts.map +1 -0
  77. package/dist/prompt/design/designSystemSpec.js +44 -0
  78. package/dist/prompt/design/designSystemSpec.js.map +1 -0
  79. package/dist/prompt/design/imgPlaceholder.d.ts +2 -0
  80. package/dist/prompt/design/imgPlaceholder.d.ts.map +1 -0
  81. package/dist/prompt/design/imgPlaceholder.js +56 -0
  82. package/dist/prompt/design/imgPlaceholder.js.map +1 -0
  83. package/dist/prompt/memory.d.ts +2 -0
  84. package/dist/prompt/memory.d.ts.map +1 -0
  85. package/dist/prompt/memory.js +23 -0
  86. package/dist/prompt/memory.js.map +1 -0
  87. package/dist/prompt/plan.d.ts +2 -0
  88. package/dist/prompt/plan.d.ts.map +1 -0
  89. package/dist/prompt/plan.js +30 -0
  90. package/dist/prompt/plan.js.map +1 -0
  91. package/dist/prompt/quickchat.d.ts +2 -0
  92. package/dist/prompt/quickchat.d.ts.map +1 -0
  93. package/dist/prompt/quickchat.js +16 -0
  94. package/dist/prompt/quickchat.js.map +1 -0
  95. package/dist/prompt/system.d.ts +3 -0
  96. package/dist/prompt/system.d.ts.map +1 -0
  97. package/dist/prompt/system.js +76 -0
  98. package/dist/prompt/system.js.map +1 -0
  99. package/dist/prompt/tool.d.ts +22 -0
  100. package/dist/prompt/tool.d.ts.map +1 -0
  101. package/dist/prompt/tool.js +25 -0
  102. package/dist/prompt/tool.js.map +1 -0
  103. package/dist/prompt/toolAliases.d.ts +16 -0
  104. package/dist/prompt/toolAliases.d.ts.map +1 -0
  105. package/dist/prompt/toolAliases.js +46 -0
  106. package/dist/prompt/toolAliases.js.map +1 -0
  107. package/dist/prompt/tools/createCron.d.ts +2 -0
  108. package/dist/prompt/tools/createCron.d.ts.map +1 -0
  109. package/dist/prompt/tools/createCron.js +29 -0
  110. package/dist/prompt/tools/createCron.js.map +1 -0
  111. package/dist/prompt/tools/createTodo.d.ts +2 -0
  112. package/dist/prompt/tools/createTodo.d.ts.map +1 -0
  113. package/dist/prompt/tools/createTodo.js +23 -0
  114. package/dist/prompt/tools/createTodo.js.map +1 -0
  115. package/dist/prompt/tools/fetchUrl.d.ts +3 -0
  116. package/dist/prompt/tools/fetchUrl.d.ts.map +1 -0
  117. package/dist/prompt/tools/fetchUrl.js +27 -0
  118. package/dist/prompt/tools/fetchUrl.js.map +1 -0
  119. package/dist/prompt/tools/planToAgent.d.ts +2 -0
  120. package/dist/prompt/tools/planToAgent.d.ts.map +1 -0
  121. package/dist/prompt/tools/planToAgent.js +24 -0
  122. package/dist/prompt/tools/planToAgent.js.map +1 -0
  123. package/dist/prompt/tools/runShell.d.ts +2 -0
  124. package/dist/prompt/tools/runShell.d.ts.map +1 -0
  125. package/dist/prompt/tools/runShell.js +31 -0
  126. package/dist/prompt/tools/runShell.js.map +1 -0
  127. package/dist/prompt/tools/searchContent.d.ts +2 -0
  128. package/dist/prompt/tools/searchContent.d.ts.map +1 -0
  129. package/dist/prompt/tools/searchContent.js +18 -0
  130. package/dist/prompt/tools/searchContent.js.map +1 -0
  131. package/dist/prompt/tools/skill.d.ts +2 -0
  132. package/dist/prompt/tools/skill.d.ts.map +1 -0
  133. package/dist/prompt/tools/skill.js +14 -0
  134. package/dist/prompt/tools/skill.js.map +1 -0
  135. package/dist/prompt/tools/subAgent.d.ts +2 -0
  136. package/dist/prompt/tools/subAgent.d.ts.map +1 -0
  137. package/dist/prompt/tools/subAgent.js +45 -0
  138. package/dist/prompt/tools/subAgent.js.map +1 -0
  139. package/dist/prompt/tools/viewFile.d.ts +4 -0
  140. package/dist/prompt/tools/viewFile.d.ts.map +1 -0
  141. package/dist/prompt/tools/viewFile.js +26 -0
  142. package/dist/prompt/tools/viewFile.js.map +1 -0
  143. package/dist/services/agents/agentsManager.d.ts +12 -15
  144. package/dist/services/agents/agentsManager.d.ts.map +1 -1
  145. package/dist/services/agents/agentsManager.js +67 -65
  146. package/dist/services/agents/agentsManager.js.map +1 -1
  147. package/dist/services/agents/genDesignSystemReminder.d.ts +3 -0
  148. package/dist/services/agents/genDesignSystemReminder.d.ts.map +1 -0
  149. package/dist/services/agents/genDesignSystemReminder.js +149 -0
  150. package/dist/services/agents/genDesignSystemReminder.js.map +1 -0
  151. package/dist/services/agents/genSystemPrompt.d.ts +11 -11
  152. package/dist/services/agents/genSystemPrompt.d.ts.map +1 -1
  153. package/dist/services/agents/genSystemPrompt.js +58 -121
  154. package/dist/services/agents/genSystemPrompt.js.map +1 -1
  155. package/dist/services/agents/{systemReminder.d.ts → genSystemReminder.d.ts} +2 -7
  156. package/dist/services/agents/genSystemReminder.d.ts.map +1 -0
  157. package/dist/services/agents/genSystemReminder.js +86 -0
  158. package/dist/services/agents/genSystemReminder.js.map +1 -0
  159. package/dist/services/api/adapt/anthropic.d.ts +3 -5
  160. package/dist/services/api/adapt/anthropic.d.ts.map +1 -1
  161. package/dist/services/api/adapt/anthropic.js +32 -18
  162. package/dist/services/api/adapt/anthropic.js.map +1 -1
  163. package/dist/services/api/adapt/openai.d.ts +3 -3
  164. package/dist/services/api/adapt/openai.d.ts.map +1 -1
  165. package/dist/services/api/adapt/openai.js +20 -23
  166. package/dist/services/api/adapt/openai.js.map +1 -1
  167. package/dist/services/api/adapt/util.d.ts +0 -1
  168. package/dist/services/api/adapt/util.d.ts.map +1 -1
  169. package/dist/services/api/adapt/util.js +3 -5
  170. package/dist/services/api/adapt/util.js.map +1 -1
  171. package/dist/services/api/apiUtil.d.ts +3 -0
  172. package/dist/services/api/apiUtil.d.ts.map +1 -1
  173. package/dist/services/api/apiUtil.js +32 -28
  174. package/dist/services/api/apiUtil.js.map +1 -1
  175. package/dist/services/api/cache.d.ts +5 -5
  176. package/dist/services/api/cache.d.ts.map +1 -1
  177. package/dist/services/api/cache.js +16 -20
  178. package/dist/services/api/cache.js.map +1 -1
  179. package/dist/services/api/queryLLM.d.ts +4 -5
  180. package/dist/services/api/queryLLM.d.ts.map +1 -1
  181. package/dist/services/api/queryLLM.js +2 -6
  182. package/dist/services/api/queryLLM.js.map +1 -1
  183. package/dist/services/commands/commandsManager.d.ts +11 -14
  184. package/dist/services/commands/commandsManager.d.ts.map +1 -1
  185. package/dist/services/commands/commandsManager.js +54 -64
  186. package/dist/services/commands/commandsManager.js.map +1 -1
  187. package/dist/services/commands/runCommand.d.ts.map +1 -1
  188. package/dist/services/commands/runCommand.js +3 -27
  189. package/dist/services/commands/runCommand.js.map +1 -1
  190. package/dist/services/design/designManager.d.ts +29 -0
  191. package/dist/services/design/designManager.d.ts.map +1 -0
  192. package/dist/services/design/designManager.js +365 -0
  193. package/dist/services/design/designManager.js.map +1 -0
  194. package/dist/services/mcp/MCPClient.d.ts.map +1 -1
  195. package/dist/services/mcp/MCPClient.js +9 -1
  196. package/dist/services/mcp/MCPClient.js.map +1 -1
  197. package/dist/services/mcp/MCPManager.d.ts +9 -29
  198. package/dist/services/mcp/MCPManager.d.ts.map +1 -1
  199. package/dist/services/mcp/MCPManager.js +53 -147
  200. package/dist/services/mcp/MCPManager.js.map +1 -1
  201. package/dist/services/mcp/MCPToolAdapter.js +4 -4
  202. package/dist/services/mcp/MCPToolAdapter.js.map +1 -1
  203. package/dist/services/memory/memManager.d.ts +6 -9
  204. package/dist/services/memory/memManager.d.ts.map +1 -1
  205. package/dist/services/memory/memManager.js +22 -42
  206. package/dist/services/memory/memManager.js.map +1 -1
  207. package/dist/services/plugins/pluginsManager.d.ts +9 -17
  208. package/dist/services/plugins/pluginsManager.d.ts.map +1 -1
  209. package/dist/services/plugins/pluginsManager.js +33 -104
  210. package/dist/services/plugins/pluginsManager.js.map +1 -1
  211. package/dist/services/rules/rulesManager.d.ts +7 -9
  212. package/dist/services/rules/rulesManager.d.ts.map +1 -1
  213. package/dist/services/rules/rulesManager.js +19 -39
  214. package/dist/services/rules/rulesManager.js.map +1 -1
  215. package/dist/services/skills/skillsManager.d.ts +10 -13
  216. package/dist/services/skills/skillsManager.d.ts.map +1 -1
  217. package/dist/services/skills/skillsManager.js +41 -54
  218. package/dist/services/skills/skillsManager.js.map +1 -1
  219. package/dist/tools/CreateCron.d.ts +68 -0
  220. package/dist/tools/CreateCron.d.ts.map +1 -0
  221. package/dist/tools/CreateCron.js +76 -0
  222. package/dist/tools/CreateCron.js.map +1 -0
  223. package/dist/tools/CreateTodo.d.ts +48 -0
  224. package/dist/tools/CreateTodo.d.ts.map +1 -0
  225. package/dist/tools/CreateTodo.js +50 -0
  226. package/dist/tools/CreateTodo.js.map +1 -0
  227. package/dist/tools/{CronDelete/CronDelete.d.ts → DelCron.d.ts} +11 -11
  228. package/dist/tools/DelCron.d.ts.map +1 -0
  229. package/dist/tools/{CronDelete/CronDelete.js → DelCron.js} +12 -12
  230. package/dist/tools/DelCron.js.map +1 -0
  231. package/dist/tools/{NotebookEdit/NotebookEdit.d.ts → EditNotebook.d.ts} +37 -37
  232. package/dist/tools/EditNotebook.d.ts.map +1 -0
  233. package/dist/tools/EditNotebook.js +220 -0
  234. package/dist/tools/EditNotebook.js.map +1 -0
  235. package/dist/tools/{WebFetch/WebFetch.d.ts → FetchUrl.d.ts} +8 -8
  236. package/dist/tools/FetchUrl.d.ts.map +1 -0
  237. package/dist/tools/{WebFetch/WebFetch.js → FetchUrl.js} +30 -34
  238. package/dist/tools/FetchUrl.js.map +1 -0
  239. package/dist/tools/GetTodo.d.ts +34 -0
  240. package/dist/tools/GetTodo.d.ts.map +1 -0
  241. package/dist/tools/{TaskGet/TaskGet.js → GetTodo.js} +21 -20
  242. package/dist/tools/GetTodo.js.map +1 -0
  243. package/dist/tools/{CronList/CronList.d.ts → ListCrons.d.ts} +12 -13
  244. package/dist/tools/ListCrons.d.ts.map +1 -0
  245. package/dist/tools/{CronList/CronList.js → ListCrons.js} +20 -20
  246. package/dist/tools/ListCrons.js.map +1 -0
  247. package/dist/tools/ListTodos.d.ts +27 -0
  248. package/dist/tools/ListTodos.d.ts.map +1 -0
  249. package/dist/tools/{TaskList/TaskList.js → ListTodos.js} +20 -19
  250. package/dist/tools/ListTodos.js.map +1 -0
  251. package/dist/tools/{Edit/Edit.d.ts → PatchFile.d.ts} +39 -43
  252. package/dist/tools/PatchFile.d.ts.map +1 -0
  253. package/dist/tools/PatchFile.js +214 -0
  254. package/dist/tools/PatchFile.js.map +1 -0
  255. package/dist/tools/PeekBgJob.d.ts +58 -0
  256. package/dist/tools/PeekBgJob.d.ts.map +1 -0
  257. package/dist/tools/PeekBgJob.js +92 -0
  258. package/dist/tools/PeekBgJob.js.map +1 -0
  259. package/dist/tools/PickOption.d.ts +463 -0
  260. package/dist/tools/PickOption.d.ts.map +1 -0
  261. package/dist/tools/PickOption.js +226 -0
  262. package/dist/tools/PickOption.js.map +1 -0
  263. package/dist/tools/PlanToAgent.d.ts +42 -0
  264. package/dist/tools/PlanToAgent.d.ts.map +1 -0
  265. package/dist/tools/{ExitPlanMode/ExitPlanMode.js → PlanToAgent.js} +47 -43
  266. package/dist/tools/PlanToAgent.js.map +1 -0
  267. package/dist/tools/{Bash/Bash.d.ts → RunShell.d.ts} +23 -21
  268. package/dist/tools/RunShell.d.ts.map +1 -0
  269. package/dist/tools/{Bash/Bash.js → RunShell.js} +55 -58
  270. package/dist/tools/RunShell.js.map +1 -0
  271. package/dist/tools/SearchContent.d.ts +86 -0
  272. package/dist/tools/SearchContent.d.ts.map +1 -0
  273. package/dist/tools/SearchContent.js +237 -0
  274. package/dist/tools/SearchContent.js.map +1 -0
  275. package/dist/tools/{Glob/Glob.d.ts → SearchFiles.d.ts} +8 -8
  276. package/dist/tools/SearchFiles.d.ts.map +1 -0
  277. package/dist/tools/{Glob/Glob.js → SearchFiles.js} +24 -31
  278. package/dist/tools/SearchFiles.js.map +1 -0
  279. package/dist/tools/{Skill/Skill.d.ts → Skill.d.ts} +11 -11
  280. package/dist/tools/Skill.d.ts.map +1 -0
  281. package/dist/tools/{Skill/Skill.js → Skill.js} +21 -19
  282. package/dist/tools/Skill.js.map +1 -0
  283. package/dist/tools/{TaskStop/TaskStop.d.ts → StopBgJob.d.ts} +17 -17
  284. package/dist/tools/StopBgJob.d.ts.map +1 -0
  285. package/dist/tools/StopBgJob.js +69 -0
  286. package/dist/tools/StopBgJob.js.map +1 -0
  287. package/dist/tools/SubAgent.d.ts +67 -0
  288. package/dist/tools/SubAgent.d.ts.map +1 -0
  289. package/dist/tools/{Agent/Agent.js → SubAgent.js} +60 -58
  290. package/dist/tools/SubAgent.js.map +1 -0
  291. package/dist/tools/UpdateTodo.d.ts +76 -0
  292. package/dist/tools/UpdateTodo.d.ts.map +1 -0
  293. package/dist/tools/UpdateTodo.js +111 -0
  294. package/dist/tools/UpdateTodo.js.map +1 -0
  295. package/dist/tools/{Read/Read.d.ts → ViewFile.d.ts} +26 -64
  296. package/dist/tools/ViewFile.d.ts.map +1 -0
  297. package/dist/tools/ViewFile.js +365 -0
  298. package/dist/tools/ViewFile.js.map +1 -0
  299. package/dist/tools/{Write/Write.d.ts → WriteFile.d.ts} +12 -12
  300. package/dist/tools/WriteFile.d.ts.map +1 -0
  301. package/dist/tools/WriteFile.js +150 -0
  302. package/dist/tools/WriteFile.js.map +1 -0
  303. package/dist/tools/base/Tool.d.ts +2 -2
  304. package/dist/tools/base/Tool.d.ts.map +1 -1
  305. package/dist/tools/base/tools.d.ts +1 -0
  306. package/dist/tools/base/tools.d.ts.map +1 -1
  307. package/dist/tools/base/tools.js +56 -50
  308. package/dist/tools/base/tools.js.map +1 -1
  309. package/dist/types/agent.d.ts +0 -1
  310. package/dist/types/agent.d.ts.map +1 -1
  311. package/dist/types/command.d.ts +0 -2
  312. package/dist/types/command.d.ts.map +1 -1
  313. package/dist/types/cron.d.ts +6 -6
  314. package/dist/types/cron.d.ts.map +1 -1
  315. package/dist/types/design.d.ts +24 -0
  316. package/dist/types/design.d.ts.map +1 -0
  317. package/dist/types/design.js +6 -0
  318. package/dist/types/design.js.map +1 -0
  319. package/dist/types/errors.d.ts +0 -2
  320. package/dist/types/errors.d.ts.map +1 -1
  321. package/dist/types/errors.js +0 -2
  322. package/dist/types/errors.js.map +1 -1
  323. package/dist/types/index.d.ts +16 -12
  324. package/dist/types/index.d.ts.map +1 -1
  325. package/dist/types/index.js +28 -5
  326. package/dist/types/index.js.map +1 -1
  327. package/dist/types/mcp.d.ts +1 -3
  328. package/dist/types/mcp.d.ts.map +1 -1
  329. package/dist/types/message.d.ts +5 -4
  330. package/dist/types/message.d.ts.map +1 -1
  331. package/dist/types/model.d.ts +1 -1
  332. package/dist/types/model.d.ts.map +1 -1
  333. package/dist/types/plugin.d.ts +8 -11
  334. package/dist/types/plugin.d.ts.map +1 -1
  335. package/dist/types/skill.d.ts +0 -3
  336. package/dist/types/skill.d.ts.map +1 -1
  337. package/dist/types/skill.js +0 -2
  338. package/dist/types/skill.js.map +1 -1
  339. package/dist/types/task.d.ts +10 -10
  340. package/dist/types/task.d.ts.map +1 -1
  341. package/dist/types/todoTask.d.ts +4 -5
  342. package/dist/types/todoTask.d.ts.map +1 -1
  343. package/dist/util/adapter.d.ts +8 -3
  344. package/dist/util/adapter.d.ts.map +1 -1
  345. package/dist/util/adapter.js +22 -49
  346. package/dist/util/adapter.js.map +1 -1
  347. package/dist/util/agentStats.d.ts +1 -1
  348. package/dist/util/agentStats.d.ts.map +1 -1
  349. package/dist/util/agentStats.js +16 -24
  350. package/dist/util/agentStats.js.map +1 -1
  351. package/dist/util/cacheLLM.d.ts +5 -5
  352. package/dist/util/cacheLLM.d.ts.map +1 -1
  353. package/dist/util/cacheLLM.js.map +1 -1
  354. package/dist/util/color.d.ts +44 -0
  355. package/dist/util/color.d.ts.map +1 -0
  356. package/dist/util/color.js +247 -0
  357. package/dist/util/color.js.map +1 -0
  358. package/dist/util/commands.d.ts +4 -5
  359. package/dist/util/commands.d.ts.map +1 -1
  360. package/dist/util/commands.js +22 -112
  361. package/dist/util/commands.js.map +1 -1
  362. package/dist/util/compact.d.ts +6 -3
  363. package/dist/util/compact.d.ts.map +1 -1
  364. package/dist/util/compact.js +20 -149
  365. package/dist/util/compact.js.map +1 -1
  366. package/dist/util/cron.d.ts +1 -9
  367. package/dist/util/cron.d.ts.map +1 -1
  368. package/dist/util/cron.js +2 -29
  369. package/dist/util/cron.js.map +1 -1
  370. package/dist/util/cwd.d.ts +2 -35
  371. package/dist/util/cwd.d.ts.map +1 -1
  372. package/dist/util/cwd.js +7 -57
  373. package/dist/util/cwd.js.map +1 -1
  374. package/dist/util/diff.d.ts +6 -4
  375. package/dist/util/diff.d.ts.map +1 -1
  376. package/dist/util/diff.js +63 -104
  377. package/dist/util/diff.js.map +1 -1
  378. package/dist/{tools/Edit/utils.d.ts → util/edit.d.ts} +2 -5
  379. package/dist/util/edit.d.ts.map +1 -0
  380. package/dist/util/edit.js +44 -0
  381. package/dist/util/edit.js.map +1 -0
  382. package/dist/util/env.d.ts +1 -4
  383. package/dist/util/env.d.ts.map +1 -1
  384. package/dist/util/env.js +22 -15
  385. package/dist/util/env.js.map +1 -1
  386. package/dist/util/fetchUrl.d.ts +18 -0
  387. package/dist/util/fetchUrl.d.ts.map +1 -0
  388. package/dist/util/fetchUrl.js +101 -0
  389. package/dist/util/fetchUrl.js.map +1 -0
  390. package/dist/util/file.d.ts +32 -45
  391. package/dist/util/file.d.ts.map +1 -1
  392. package/dist/util/file.js +153 -236
  393. package/dist/util/file.js.map +1 -1
  394. package/dist/util/fileReference.d.ts +1 -9
  395. package/dist/util/fileReference.d.ts.map +1 -1
  396. package/dist/util/fileReference.js +45 -58
  397. package/dist/util/fileReference.js.map +1 -1
  398. package/dist/util/format.d.ts +1 -9
  399. package/dist/util/format.d.ts.map +1 -1
  400. package/dist/util/format.js +5 -46
  401. package/dist/util/format.js.map +1 -1
  402. package/dist/util/formatter.d.ts +5 -8
  403. package/dist/util/formatter.d.ts.map +1 -1
  404. package/dist/util/formatter.js +5 -15
  405. package/dist/util/formatter.js.map +1 -1
  406. package/dist/util/git.d.ts +2 -3
  407. package/dist/util/git.d.ts.map +1 -1
  408. package/dist/util/git.js +34 -39
  409. package/dist/util/git.js.map +1 -1
  410. package/dist/util/history.d.ts +0 -7
  411. package/dist/util/history.d.ts.map +1 -1
  412. package/dist/util/history.js +3 -50
  413. package/dist/util/history.js.map +1 -1
  414. package/dist/util/log.d.ts +0 -1
  415. package/dist/util/log.d.ts.map +1 -1
  416. package/dist/util/log.js +2 -7
  417. package/dist/util/log.js.map +1 -1
  418. package/dist/util/logLLM.d.ts +0 -4
  419. package/dist/util/logLLM.d.ts.map +1 -1
  420. package/dist/util/logLLM.js +6 -16
  421. package/dist/util/logLLM.js.map +1 -1
  422. package/dist/util/message.d.ts +12 -11
  423. package/dist/util/message.d.ts.map +1 -1
  424. package/dist/util/message.js +68 -89
  425. package/dist/util/message.js.map +1 -1
  426. package/dist/util/model.d.ts +0 -3
  427. package/dist/util/model.d.ts.map +1 -1
  428. package/dist/util/model.js +1 -5
  429. package/dist/util/model.js.map +1 -1
  430. package/dist/util/notebook.d.ts +1 -8
  431. package/dist/util/notebook.d.ts.map +1 -1
  432. package/dist/util/notebook.js +36 -63
  433. package/dist/util/notebook.js.map +1 -1
  434. package/dist/util/pdf.d.ts +14 -72
  435. package/dist/util/pdf.d.ts.map +1 -1
  436. package/dist/util/pdf.js +51 -460
  437. package/dist/util/pdf.js.map +1 -1
  438. package/dist/util/process.d.ts +1 -1
  439. package/dist/util/process.d.ts.map +1 -1
  440. package/dist/util/process.js +7 -11
  441. package/dist/util/process.js.map +1 -1
  442. package/dist/util/quickchat.d.ts +6 -0
  443. package/dist/util/quickchat.d.ts.map +1 -0
  444. package/dist/util/{btw.js → quickchat.js} +14 -32
  445. package/dist/util/quickchat.js.map +1 -0
  446. package/dist/util/ripgrep.d.ts +4 -2
  447. package/dist/util/ripgrep.d.ts.map +1 -1
  448. package/dist/util/ripgrep.js +40 -116
  449. package/dist/util/ripgrep.js.map +1 -1
  450. package/dist/util/savePath.d.ts +2 -18
  451. package/dist/util/savePath.d.ts.map +1 -1
  452. package/dist/util/savePath.js +7 -47
  453. package/dist/util/savePath.js.map +1 -1
  454. package/dist/util/secureFile.d.ts +13 -135
  455. package/dist/util/secureFile.d.ts.map +1 -1
  456. package/dist/util/secureFile.js +74 -478
  457. package/dist/util/secureFile.js.map +1 -1
  458. package/dist/util/session.d.ts +0 -21
  459. package/dist/util/session.d.ts.map +1 -1
  460. package/dist/util/session.js +0 -49
  461. package/dist/util/session.js.map +1 -1
  462. package/dist/util/shell.d.ts +23 -3
  463. package/dist/util/shell.d.ts.map +1 -1
  464. package/dist/util/shell.js +199 -290
  465. package/dist/util/shell.js.map +1 -1
  466. package/dist/util/time.d.ts +6 -5
  467. package/dist/util/time.d.ts.map +1 -1
  468. package/dist/util/time.js +10 -6
  469. package/dist/util/time.js.map +1 -1
  470. package/dist/util/tokens.d.ts +0 -1
  471. package/dist/util/tokens.d.ts.map +1 -1
  472. package/dist/util/tokens.js +12 -23
  473. package/dist/util/tokens.js.map +1 -1
  474. package/dist/util/topic.d.ts +1 -4
  475. package/dist/util/topic.d.ts.map +1 -1
  476. package/dist/util/topic.js +12 -11
  477. package/dist/util/topic.js.map +1 -1
  478. package/dist/util/writeFile.d.ts +12 -0
  479. package/dist/util/writeFile.d.ts.map +1 -0
  480. package/dist/util/writeFile.js +69 -0
  481. package/dist/util/writeFile.js.map +1 -0
  482. package/package.json +1 -1
  483. package/dist/constants/config.d.ts.map +0 -1
  484. package/dist/constants/config.js.map +0 -1
  485. package/dist/constants/message.d.ts +0 -10
  486. package/dist/constants/message.d.ts.map +0 -1
  487. package/dist/constants/message.js +0 -25
  488. package/dist/constants/message.js.map +0 -1
  489. package/dist/constants/product.d.ts +0 -4
  490. package/dist/constants/product.d.ts.map +0 -1
  491. package/dist/constants/product.js +0 -7
  492. package/dist/constants/product.js.map +0 -1
  493. package/dist/services/agents/defaultBuiltInAgentsConfs.d.ts +0 -3
  494. package/dist/services/agents/defaultBuiltInAgentsConfs.d.ts.map +0 -1
  495. package/dist/services/agents/defaultBuiltInAgentsConfs.js +0 -125
  496. package/dist/services/agents/defaultBuiltInAgentsConfs.js.map +0 -1
  497. package/dist/services/agents/prompt.d.ts +0 -10
  498. package/dist/services/agents/prompt.d.ts.map +0 -1
  499. package/dist/services/agents/prompt.js +0 -144
  500. package/dist/services/agents/prompt.js.map +0 -1
  501. package/dist/services/agents/systemReminder.d.ts.map +0 -1
  502. package/dist/services/agents/systemReminder.js +0 -68
  503. package/dist/services/agents/systemReminder.js.map +0 -1
  504. package/dist/tools/Agent/Agent.d.ts +0 -67
  505. package/dist/tools/Agent/Agent.d.ts.map +0 -1
  506. package/dist/tools/Agent/Agent.js.map +0 -1
  507. package/dist/tools/Agent/prompt.d.ts +0 -6
  508. package/dist/tools/Agent/prompt.d.ts.map +0 -1
  509. package/dist/tools/Agent/prompt.js +0 -73
  510. package/dist/tools/Agent/prompt.js.map +0 -1
  511. package/dist/tools/AskUserQuestion/AskUserQuestion.d.ts +0 -179
  512. package/dist/tools/AskUserQuestion/AskUserQuestion.d.ts.map +0 -1
  513. package/dist/tools/AskUserQuestion/AskUserQuestion.js +0 -165
  514. package/dist/tools/AskUserQuestion/AskUserQuestion.js.map +0 -1
  515. package/dist/tools/AskUserQuestion/prompt.d.ts +0 -3
  516. package/dist/tools/AskUserQuestion/prompt.d.ts.map +0 -1
  517. package/dist/tools/AskUserQuestion/prompt.js +0 -17
  518. package/dist/tools/AskUserQuestion/prompt.js.map +0 -1
  519. package/dist/tools/Bash/Bash.d.ts.map +0 -1
  520. package/dist/tools/Bash/Bash.js.map +0 -1
  521. package/dist/tools/Bash/prompt.d.ts +0 -5
  522. package/dist/tools/Bash/prompt.d.ts.map +0 -1
  523. package/dist/tools/Bash/prompt.js +0 -130
  524. package/dist/tools/Bash/prompt.js.map +0 -1
  525. package/dist/tools/Bash/utils.d.ts +0 -9
  526. package/dist/tools/Bash/utils.d.ts.map +0 -1
  527. package/dist/tools/Bash/utils.js +0 -41
  528. package/dist/tools/Bash/utils.js.map +0 -1
  529. package/dist/tools/CronCreate/CronCreate.d.ts +0 -68
  530. package/dist/tools/CronCreate/CronCreate.d.ts.map +0 -1
  531. package/dist/tools/CronCreate/CronCreate.js +0 -75
  532. package/dist/tools/CronCreate/CronCreate.js.map +0 -1
  533. package/dist/tools/CronCreate/prompt.d.ts +0 -3
  534. package/dist/tools/CronCreate/prompt.d.ts.map +0 -1
  535. package/dist/tools/CronCreate/prompt.js +0 -41
  536. package/dist/tools/CronCreate/prompt.js.map +0 -1
  537. package/dist/tools/CronDelete/CronDelete.d.ts.map +0 -1
  538. package/dist/tools/CronDelete/CronDelete.js.map +0 -1
  539. package/dist/tools/CronDelete/prompt.d.ts +0 -3
  540. package/dist/tools/CronDelete/prompt.d.ts.map +0 -1
  541. package/dist/tools/CronDelete/prompt.js +0 -6
  542. package/dist/tools/CronDelete/prompt.js.map +0 -1
  543. package/dist/tools/CronList/CronList.d.ts.map +0 -1
  544. package/dist/tools/CronList/CronList.js.map +0 -1
  545. package/dist/tools/CronList/prompt.d.ts +0 -3
  546. package/dist/tools/CronList/prompt.d.ts.map +0 -1
  547. package/dist/tools/CronList/prompt.js +0 -6
  548. package/dist/tools/CronList/prompt.js.map +0 -1
  549. package/dist/tools/Edit/Edit.d.ts.map +0 -1
  550. package/dist/tools/Edit/Edit.js +0 -225
  551. package/dist/tools/Edit/Edit.js.map +0 -1
  552. package/dist/tools/Edit/prompt.d.ts +0 -3
  553. package/dist/tools/Edit/prompt.d.ts.map +0 -1
  554. package/dist/tools/Edit/prompt.js +0 -15
  555. package/dist/tools/Edit/prompt.js.map +0 -1
  556. package/dist/tools/Edit/utils.d.ts.map +0 -1
  557. package/dist/tools/Edit/utils.js +0 -60
  558. package/dist/tools/Edit/utils.js.map +0 -1
  559. package/dist/tools/ExitPlanMode/ExitPlanMode.d.ts +0 -42
  560. package/dist/tools/ExitPlanMode/ExitPlanMode.d.ts.map +0 -1
  561. package/dist/tools/ExitPlanMode/ExitPlanMode.js.map +0 -1
  562. package/dist/tools/ExitPlanMode/prompt.d.ts +0 -3
  563. package/dist/tools/ExitPlanMode/prompt.d.ts.map +0 -1
  564. package/dist/tools/ExitPlanMode/prompt.js +0 -28
  565. package/dist/tools/ExitPlanMode/prompt.js.map +0 -1
  566. package/dist/tools/Glob/Glob.d.ts.map +0 -1
  567. package/dist/tools/Glob/Glob.js.map +0 -1
  568. package/dist/tools/Glob/prompt.d.ts +0 -3
  569. package/dist/tools/Glob/prompt.d.ts.map +0 -1
  570. package/dist/tools/Glob/prompt.js +0 -11
  571. package/dist/tools/Glob/prompt.js.map +0 -1
  572. package/dist/tools/Grep/Grep.d.ts +0 -106
  573. package/dist/tools/Grep/Grep.d.ts.map +0 -1
  574. package/dist/tools/Grep/Grep.js +0 -301
  575. package/dist/tools/Grep/Grep.js.map +0 -1
  576. package/dist/tools/Grep/prompt.d.ts +0 -3
  577. package/dist/tools/Grep/prompt.d.ts.map +0 -1
  578. package/dist/tools/Grep/prompt.js +0 -17
  579. package/dist/tools/Grep/prompt.js.map +0 -1
  580. package/dist/tools/NotebookEdit/NotebookEdit.d.ts.map +0 -1
  581. package/dist/tools/NotebookEdit/NotebookEdit.js +0 -312
  582. package/dist/tools/NotebookEdit/NotebookEdit.js.map +0 -1
  583. package/dist/tools/NotebookEdit/prompt.d.ts +0 -3
  584. package/dist/tools/NotebookEdit/prompt.d.ts.map +0 -1
  585. package/dist/tools/NotebookEdit/prompt.js +0 -6
  586. package/dist/tools/NotebookEdit/prompt.js.map +0 -1
  587. package/dist/tools/Read/Read.d.ts.map +0 -1
  588. package/dist/tools/Read/Read.js +0 -472
  589. package/dist/tools/Read/Read.js.map +0 -1
  590. package/dist/tools/Read/prompt.d.ts +0 -4
  591. package/dist/tools/Read/prompt.d.ts.map +0 -1
  592. package/dist/tools/Read/prompt.js +0 -23
  593. package/dist/tools/Read/prompt.js.map +0 -1
  594. package/dist/tools/Skill/Skill.d.ts.map +0 -1
  595. package/dist/tools/Skill/Skill.js.map +0 -1
  596. package/dist/tools/Skill/prompt.d.ts +0 -3
  597. package/dist/tools/Skill/prompt.d.ts.map +0 -1
  598. package/dist/tools/Skill/prompt.js +0 -27
  599. package/dist/tools/Skill/prompt.js.map +0 -1
  600. package/dist/tools/TaskCreate/TaskCreate.d.ts +0 -54
  601. package/dist/tools/TaskCreate/TaskCreate.d.ts.map +0 -1
  602. package/dist/tools/TaskCreate/TaskCreate.js +0 -51
  603. package/dist/tools/TaskCreate/TaskCreate.js.map +0 -1
  604. package/dist/tools/TaskCreate/prompt.d.ts +0 -3
  605. package/dist/tools/TaskCreate/prompt.d.ts.map +0 -1
  606. package/dist/tools/TaskCreate/prompt.js +0 -45
  607. package/dist/tools/TaskCreate/prompt.js.map +0 -1
  608. package/dist/tools/TaskGet/TaskGet.d.ts +0 -34
  609. package/dist/tools/TaskGet/TaskGet.d.ts.map +0 -1
  610. package/dist/tools/TaskGet/TaskGet.js.map +0 -1
  611. package/dist/tools/TaskGet/prompt.d.ts +0 -3
  612. package/dist/tools/TaskGet/prompt.d.ts.map +0 -1
  613. package/dist/tools/TaskGet/prompt.js +0 -26
  614. package/dist/tools/TaskGet/prompt.js.map +0 -1
  615. package/dist/tools/TaskList/TaskList.d.ts +0 -27
  616. package/dist/tools/TaskList/TaskList.d.ts.map +0 -1
  617. package/dist/tools/TaskList/TaskList.js.map +0 -1
  618. package/dist/tools/TaskList/prompt.d.ts +0 -3
  619. package/dist/tools/TaskList/prompt.d.ts.map +0 -1
  620. package/dist/tools/TaskList/prompt.js +0 -25
  621. package/dist/tools/TaskList/prompt.js.map +0 -1
  622. package/dist/tools/TaskOutput/TaskOutput.d.ts +0 -58
  623. package/dist/tools/TaskOutput/TaskOutput.d.ts.map +0 -1
  624. package/dist/tools/TaskOutput/TaskOutput.js +0 -95
  625. package/dist/tools/TaskOutput/TaskOutput.js.map +0 -1
  626. package/dist/tools/TaskStop/TaskStop.d.ts.map +0 -1
  627. package/dist/tools/TaskStop/TaskStop.js +0 -69
  628. package/dist/tools/TaskStop/TaskStop.js.map +0 -1
  629. package/dist/tools/TaskUpdate/TaskUpdate.d.ts +0 -88
  630. package/dist/tools/TaskUpdate/TaskUpdate.d.ts.map +0 -1
  631. package/dist/tools/TaskUpdate/TaskUpdate.js +0 -115
  632. package/dist/tools/TaskUpdate/TaskUpdate.js.map +0 -1
  633. package/dist/tools/TaskUpdate/prompt.d.ts +0 -3
  634. package/dist/tools/TaskUpdate/prompt.d.ts.map +0 -1
  635. package/dist/tools/TaskUpdate/prompt.js +0 -80
  636. package/dist/tools/TaskUpdate/prompt.js.map +0 -1
  637. package/dist/tools/TodoWrite/TodoWrite.d.ts +0 -92
  638. package/dist/tools/TodoWrite/TodoWrite.d.ts.map +0 -1
  639. package/dist/tools/TodoWrite/TodoWrite.js +0 -101
  640. package/dist/tools/TodoWrite/TodoWrite.js.map +0 -1
  641. package/dist/tools/TodoWrite/prompt.d.ts +0 -3
  642. package/dist/tools/TodoWrite/prompt.d.ts.map +0 -1
  643. package/dist/tools/TodoWrite/prompt.js +0 -187
  644. package/dist/tools/TodoWrite/prompt.js.map +0 -1
  645. package/dist/tools/WebFetch/WebFetch.d.ts.map +0 -1
  646. package/dist/tools/WebFetch/WebFetch.js.map +0 -1
  647. package/dist/tools/WebFetch/prompt.d.ts +0 -4
  648. package/dist/tools/WebFetch/prompt.d.ts.map +0 -1
  649. package/dist/tools/WebFetch/prompt.js +0 -38
  650. package/dist/tools/WebFetch/prompt.js.map +0 -1
  651. package/dist/tools/WebFetch/utils.d.ts +0 -20
  652. package/dist/tools/WebFetch/utils.d.ts.map +0 -1
  653. package/dist/tools/WebFetch/utils.js +0 -223
  654. package/dist/tools/WebFetch/utils.js.map +0 -1
  655. package/dist/tools/Write/Write.d.ts.map +0 -1
  656. package/dist/tools/Write/Write.js +0 -197
  657. package/dist/tools/Write/Write.js.map +0 -1
  658. package/dist/tools/Write/prompt.d.ts +0 -3
  659. package/dist/tools/Write/prompt.d.ts.map +0 -1
  660. package/dist/tools/Write/prompt.js +0 -13
  661. package/dist/tools/Write/prompt.js.map +0 -1
  662. package/dist/util/assembleTools.d.ts +0 -6
  663. package/dist/util/assembleTools.d.ts.map +0 -1
  664. package/dist/util/assembleTools.js +0 -17
  665. package/dist/util/assembleTools.js.map +0 -1
  666. package/dist/util/btw.d.ts +0 -6
  667. package/dist/util/btw.d.ts.map +0 -1
  668. package/dist/util/btw.js.map +0 -1
  669. package/dist/util/directory.d.ts +0 -37
  670. package/dist/util/directory.d.ts.map +0 -1
  671. package/dist/util/directory.js +0 -137
  672. package/dist/util/directory.js.map +0 -1
  673. package/dist/util/exec.d.ts +0 -6
  674. package/dist/util/exec.d.ts.map +0 -1
  675. package/dist/util/exec.js +0 -43
  676. package/dist/util/exec.js.map +0 -1
  677. package/dist/util/filePermission.d.ts +0 -14
  678. package/dist/util/filePermission.d.ts.map +0 -1
  679. package/dist/util/filePermission.js +0 -47
  680. package/dist/util/filePermission.js.map +0 -1
@@ -36,8 +36,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
36
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.PersistentShell = void 0;
40
- exports.formatDuration = formatDuration;
39
+ exports.STDERR_HEAD_TAIL_LINES = exports.STDOUT_HEAD_TAIL_LINES = exports.PersistentShell = void 0;
40
+ exports.humanizeDuration = humanizeDuration;
41
+ exports.getShellRuntimeInfo = getShellRuntimeInfo;
42
+ exports.formatOutput = formatOutput;
41
43
  const fs = __importStar(require("fs"));
42
44
  const fs_1 = require("fs");
43
45
  const shell_quote_1 = __importDefault(require("shell-quote"));
@@ -51,7 +53,7 @@ const platform_1 = require("./platform");
51
53
  // 临时文件前缀
52
54
  const TEMPFILE_PREFIX = (0, path_1.join)(os.tmpdir(), 'sema-');
53
55
  // 默认超时时间(2分钟)
54
- const DEFAULT_TIMEOUT = 120 * 1000;
56
+ const DEFAULT_SHELL_TIMEOUT = 120 * 1000;
55
57
  // SIGTERM信号的标准退出码
56
58
  const SIGTERM_CODE = 143;
57
59
  // 流式输出检查间隔(ms)
@@ -63,7 +65,7 @@ const FILE_SUFFIXES = {
63
65
  STDERR: '-stderr', // 标准错误文件后缀
64
66
  CWD: '-cwd', // 当前工作目录文件后缀
65
67
  };
66
- function formatDuration(ms) {
68
+ function humanizeDuration(ms) {
67
69
  const s = Math.round(ms / 1000);
68
70
  if (s < 60)
69
71
  return `${s}s`;
@@ -116,298 +118,207 @@ function filterCygwinNoise(text) {
116
118
  .filter(line => !CYGWIN_NOISE_RE.test(line))
117
119
  .join('\n');
118
120
  }
119
- // Shell配置文件映射
120
- const SHELL_CONFIGS = {
121
- '/bin/bash': '.bashrc',
122
- '/bin/zsh': '.zshrc',
123
- };
124
121
  // 为Bash转义字符串
125
122
  function quoteForBash(str) {
126
123
  return `'${str.replace(/'/g, "'\\''")}'`;
127
124
  }
128
- // 检查文件是否存在
129
- function fileExists(p) {
130
- return !!p && (0, fs_1.existsSync)(p);
131
- }
132
- // testBashAvailability 结果缓存,避免对同一路径重复测试
133
- const bashTestCache = new Map();
134
- // 测试 bash 是否可用
135
- function testBashAvailability(bashPath, type = 'msys') {
136
- const cacheKey = `${bashPath}:${type}`;
137
- const cached = bashTestCache.get(cacheKey);
138
- if (cached !== undefined)
139
- return cached;
140
- const saveAndReturn = (result) => {
141
- bashTestCache.set(cacheKey, result);
142
- return result;
143
- };
144
- try {
145
- (0, log_1.logInfo)(`测试 bash 可用性: ${bashPath}`);
146
- const testCommand = `"${bashPath}" -c "echo SEMA_TEST_OK"`;
147
- const result = (0, child_process_1.execSync)(testCommand, {
148
- stdio: 'pipe',
149
- timeout: 3000,
150
- encoding: 'utf8'
151
- });
152
- const output = result.toString().trim();
153
- if (output.includes('SEMA_TEST_OK')) {
154
- (0, log_1.logInfo)(`✅ bash 测试通过: ${bashPath}`);
155
- return saveAndReturn(true);
125
+ // 测试 bash 是否可用(结果自动缓存)
126
+ const testBashAvailability = (() => {
127
+ const cache = new Map();
128
+ return (bashPath, type = 'msys') => {
129
+ const cacheKey = `${bashPath}:${type}`;
130
+ const cached = cache.get(cacheKey);
131
+ if (cached !== undefined)
132
+ return cached;
133
+ let ok = false;
134
+ try {
135
+ (0, log_1.logInfo)(`测试 bash 可用性: ${bashPath}`);
136
+ const output = (0, child_process_1.execSync)(`"${bashPath}" -c "echo SEMA_TEST_OK"`, {
137
+ stdio: 'pipe', timeout: 3000, encoding: 'utf8',
138
+ }).toString().trim();
139
+ ok = output.includes('SEMA_TEST_OK');
140
+ if (ok)
141
+ (0, log_1.logInfo)(`bash 测试通过: ${bashPath}`);
142
+ else
143
+ (0, log_1.logWarn)(`bash 测试失败,输出不符合预期: ${bashPath}, 输出: ${output}`);
156
144
  }
157
- else {
158
- (0, log_1.logWarn)(`❌ bash 测试失败,输出不符合预期: ${bashPath}, 输出: ${output}`);
159
- return saveAndReturn(false);
145
+ catch (error) {
146
+ (0, log_1.logWarn)(`bash 测试失败: ${bashPath}, 错误: ${error}`);
160
147
  }
161
- }
162
- catch (error) {
163
- (0, log_1.logWarn)(`❌ bash 测试失败: ${bashPath}, 错误: ${error}`);
164
- return saveAndReturn(false);
165
- }
166
- }
167
- // 判断路径是否为 Git Bash
168
- function isGitBashPath(p) {
169
- const lower = p.toLowerCase();
170
- return lower.includes('git') || lower.includes('git for windows');
148
+ cache.set(cacheKey, ok);
149
+ return ok;
150
+ };
151
+ })();
152
+ // 尝试使用指定路径的 bash,存在且测试通过返回 true
153
+ function tryBash(candidate, type = 'msys') {
154
+ return (0, fs_1.existsSync)(candidate) && testBashAvailability(candidate, type);
171
155
  }
172
156
  // 检测可用的Shell(结果缓存,避免重复探测)
173
157
  let detectedShellCache = null;
174
- function detectShell() {
175
- if (detectedShellCache)
176
- return detectedShellCache;
177
- detectedShellCache = detectShellImpl();
178
- return detectedShellCache;
158
+ function resolveShellBinary() {
159
+ return (detectedShellCache ??= detectShellImpl());
179
160
  }
180
- function detectShellImpl() {
181
- if (!platform_1.IS_WIN) {
182
- const bin = process.env.SHELL || '/bin/bash';
183
- return { bin, args: ['-l'], type: 'posix' };
184
- }
185
- (0, log_1.logInfo)('开始检测 Windows Shell 环境...');
186
- // Windows 平台 Shell 检测逻辑 - 优化后的检测顺序
187
- // 1) 显式环境变量优先级最高 (支持 SEMA_BASH 环境变量)
188
- if (process.env.SEMA_BASH && (0, fs_1.existsSync)(process.env.SEMA_BASH)) {
189
- if (testBashAvailability(process.env.SEMA_BASH)) {
190
- (0, log_1.logInfo)(`使用 SEMA_BASH 环境变量指定的 bash: ${process.env.SEMA_BASH}`);
191
- return { bin: process.env.SEMA_BASH, args: ['-l'], type: 'msys' };
192
- }
193
- else {
194
- (0, log_1.logWarn)(`SEMA_BASH 指定的 bash 测试失败: ${process.env.SEMA_BASH}`);
195
- }
161
+ function getShellRuntimeInfo() {
162
+ try {
163
+ const { bin, args, type } = resolveShellBinary();
164
+ return { bin, args, type };
196
165
  }
197
- // 1.1) 如果SHELL环境变量指向存在的bash.exe,则测试并使用它
198
- if (process.env.SHELL && /bash\.exe$/i.test(process.env.SHELL) && (0, fs_1.existsSync)(process.env.SHELL)) {
199
- // 对 System32 bash 进行特殊测试
200
- const isSystem32Bash = process.env.SHELL.toLowerCase().includes('system32');
201
- const testType = isSystem32Bash ? 'wsl' : 'msys';
202
- if (testBashAvailability(process.env.SHELL, testType)) {
203
- (0, log_1.logInfo)(`使用 SHELL 环境变量指定的 bash: ${process.env.SHELL}`);
204
- return { bin: process.env.SHELL, args: ['-l'], type: isSystem32Bash ? 'wsl' : 'msys' };
205
- }
206
- else {
207
- (0, log_1.logWarn)(`SHELL 环境变量指定的 bash 测试失败: ${process.env.SHELL}`);
208
- }
166
+ catch {
167
+ return null;
209
168
  }
210
- // 2) 优先在PATH中搜索bash.exe (提前到这里,覆盖更多安装方式)
211
- (0, log_1.logInfo)('在 PATH 中搜索 bash.exe...');
212
- // 在Windows上尝试多种PATH环境变量形式
169
+ }
170
+ // 从环境变量检测 bash(SEMA_BASH / SHELL)
171
+ function detectBashFromEnv() {
172
+ // SEMA_BASH 环境变量优先级最高
173
+ if (process.env.SEMA_BASH && tryBash(process.env.SEMA_BASH)) {
174
+ (0, log_1.logInfo)(`使用 SEMA_BASH 环境变量指定的 bash: ${process.env.SEMA_BASH}`);
175
+ return { bin: process.env.SEMA_BASH, args: ['-l'], type: 'msys' };
176
+ }
177
+ // SHELL 环境变量指向 bash.exe
178
+ const shell = process.env.SHELL;
179
+ if (shell && /bash\.exe$/i.test(shell) && (0, fs_1.existsSync)(shell)) {
180
+ const isSystem32 = shell.toLowerCase().includes('system32');
181
+ const type = isSystem32 ? 'wsl' : 'msys';
182
+ if (testBashAvailability(shell, type)) {
183
+ (0, log_1.logInfo)(`使用 SHELL 环境变量指定的 bash: ${shell}`);
184
+ return { bin: shell, args: ['-l'], type };
185
+ }
186
+ }
187
+ return null;
188
+ }
189
+ // 获取 Windows PATH 条目
190
+ function getWindowsPathEntries() {
213
191
  let pathEnv = process.env.PATH || process.env.Path || process.env.path || '';
214
- // 如果还是空的,尝试遍历所有环境变量找到PATH
192
+ // 遍历所有环境变量找 PATH(Windows 大小写不敏感)
215
193
  if (!pathEnv) {
216
194
  for (const [key, value] of Object.entries(process.env)) {
217
195
  if (key.toLowerCase() === 'path' && value) {
218
196
  pathEnv = value;
219
- (0, log_1.logInfo)(`找到 PATH 环境变量 (${key}): ${value.substring(0, 100)}...`);
220
197
  break;
221
198
  }
222
199
  }
223
200
  }
224
- if (platform_1.IS_WIN && pathEnv && pathEnv.length < 500) {
201
+ // PATH 看起来不完整时从 PowerShell 补充
202
+ if (pathEnv && pathEnv.length < 500) {
225
203
  try {
226
- (0, log_1.logInfo)('PATH看起来不完整,尝试从PowerShell重新获取...');
227
204
  const fullPath = (0, child_process_1.execSync)('powershell.exe -Command "$env:PATH"', {
228
- encoding: 'utf8',
229
- timeout: 5000
205
+ encoding: 'utf8', timeout: 5000,
230
206
  }).trim();
231
- if (fullPath && fullPath.length > pathEnv.length) {
232
- (0, log_1.logInfo)(`从PowerShell获取到更完整的PATH (${fullPath.length} vs ${pathEnv.length} 字符)`);
207
+ if (fullPath.length > pathEnv.length)
233
208
  pathEnv = fullPath;
234
- }
235
209
  }
236
- catch (error) {
237
- (0, log_1.logWarn)(`无法从PowerShell获取PATH: ${error}`);
238
- }
239
- }
240
- (0, log_1.logInfo)(`PATH 环境变量内容: ${pathEnv ? pathEnv.substring(0, 200) + '...' : '(空)'}`);
241
- const pathEntries = (0, platform_1.splitPathEntries)(pathEnv);
242
- (0, log_1.logInfo)(`解析出的 PATH 条目数量: ${pathEntries.length}`);
243
- // 打印前几个路径条目用于调试
244
- pathEntries.slice(0, 5).forEach((entry, index) => {
245
- (0, log_1.logInfo)(`PATH[${index}]: ${entry}`);
246
- });
247
- // 2.1) 首先优先处理PATH中的Git Bash
248
- (0, log_1.logInfo)('优先检查 PATH 中的 Git Bash...');
210
+ catch { /* ignore */ }
211
+ }
212
+ return (0, platform_1.splitPathEntries)(pathEnv);
213
+ }
214
+ // PATH 中搜索 bash.exe(Git Bash 优先)
215
+ function detectBashInPath(pathEntries) {
216
+ // 单次遍历,Git Bash 优先收集,非 Git Bash 延后
217
+ const nonGitCandidates = [];
249
218
  for (const p of pathEntries) {
250
219
  const candidate = (0, path_1.join)(p, 'bash.exe');
251
- (0, log_1.logInfo)(`检查路径: ${candidate}`);
252
220
  if ((0, fs_1.existsSync)(candidate)) {
253
- // 检查是否为Git Bash路径 - 更宽泛的检测
254
- const isGitBash = isGitBashPath(candidate);
255
- (0, log_1.logInfo)(`发现 bash.exe: ${candidate}, 是否Git Bash: ${isGitBash}`);
256
- if (isGitBash) {
257
- if (testBashAvailability(candidate, 'msys')) {
258
- (0, log_1.logInfo)(`在 PATH 中找到可用的 Git Bash: ${candidate}`);
221
+ const lower = candidate.toLowerCase();
222
+ if (lower.includes('git') || lower.includes('git for windows')) {
223
+ if (tryBash(candidate, 'msys'))
259
224
  return { bin: candidate, args: ['-l'], type: 'msys' };
260
- }
261
- else {
262
- (0, log_1.logWarn)(`PATH 中的 Git Bash 测试失败,跳过: ${candidate}`);
263
- }
225
+ }
226
+ else {
227
+ nonGitCandidates.push(candidate);
264
228
  }
265
229
  }
266
230
  else {
267
- // 如果是Gitcmd目录,检查对应的bin目录和usr/bin目录
231
+ // Git cmd 目录 → 推断 bin 目录
268
232
  const pLower = p.toLowerCase();
269
233
  if (pLower.includes('git') && (pLower.endsWith('cmd') || pLower.endsWith('cmd\\'))) {
270
- (0, log_1.logInfo)(`检测到Git cmd目录: ${p},尝试查找对应的bin目录`);
271
- // 尝试多个可能的bin目录位置
272
234
  const gitRoot = p.replace(/[\\\/]cmd[\\\/]?$/i, '');
273
- const binCandidates = [
274
- (0, path_1.join)(gitRoot, 'bin', 'bash.exe'),
275
- (0, path_1.join)(gitRoot, 'usr', 'bin', 'bash.exe'),
276
- (0, path_1.join)(gitRoot, 'mingw64', 'bin', 'bash.exe')
277
- ];
278
- for (const binCandidate of binCandidates) {
279
- (0, log_1.logInfo)(`尝试Git Bash路径: ${binCandidate}`);
280
- if ((0, fs_1.existsSync)(binCandidate)) {
281
- (0, log_1.logInfo)(`发现 bash.exe: ${binCandidate}, 是否Git Bash: true`);
282
- if (testBashAvailability(binCandidate, 'msys')) {
283
- (0, log_1.logInfo)(`在 PATH 中找到可用的 Git Bash (通过cmd->bin映射): ${binCandidate}`);
284
- return { bin: binCandidate, args: ['-l'], type: 'msys' };
285
- }
286
- else {
287
- (0, log_1.logWarn)(`Git Bash 测试失败,跳过: ${binCandidate}`);
288
- }
289
- }
235
+ for (const sub of ['bin', 'usr/bin', 'mingw64/bin']) {
236
+ const c = (0, path_1.join)(gitRoot, sub, 'bash.exe');
237
+ if (tryBash(c, 'msys'))
238
+ return { bin: c, args: ['-l'], type: 'msys' };
290
239
  }
291
240
  }
292
241
  }
293
242
  }
294
- // 2.2) 然后处理PATH中的其他bash
295
- (0, log_1.logInfo)('检查 PATH 中的其他 bash...');
296
- for (const p of pathEntries) {
297
- const candidate = (0, path_1.join)(p, 'bash.exe');
298
- if ((0, fs_1.existsSync)(candidate)) {
299
- // 跳过已经处理过的Git Bash
300
- if (!isGitBashPath(candidate)) {
301
- // 对所有找到的 bash 进行测试验证
302
- const isSystem32Bash = candidate.toLowerCase().includes('system32');
303
- const testType = isSystem32Bash ? 'wsl' : 'msys';
304
- if (testBashAvailability(candidate, testType)) {
305
- (0, log_1.logInfo)(`在 PATH 中找到可用的 bash: ${candidate}`);
306
- return { bin: candidate, args: ['-l'], type: isSystem32Bash ? 'wsl' : 'msys' };
307
- }
308
- else {
309
- (0, log_1.logWarn)(`PATH 中的 bash 测试失败,跳过: ${candidate}`);
310
- }
311
- }
312
- }
243
+ // Git Bash 候选
244
+ for (const candidate of nonGitCandidates) {
245
+ const isSystem32 = candidate.toLowerCase().includes('system32');
246
+ const type = isSystem32 ? 'wsl' : 'msys';
247
+ if (testBashAvailability(candidate, type))
248
+ return { bin: candidate, args: ['-l'], type };
313
249
  }
314
- // 3) 检测 Git Bash 的常见固定位置 (作为 PATH 搜索的补充)
315
- (0, log_1.logInfo)('搜索 Git Bash 固定安装位置...');
250
+ return null;
251
+ }
252
+ // 在固定安装位置搜索 Git Bash / MSYS2
253
+ function detectBashInFixedLocations() {
316
254
  const programFiles = [
317
255
  process.env['ProgramFiles'],
318
256
  process.env['ProgramFiles(x86)'],
319
257
  process.env['ProgramW6432'],
320
258
  ].filter(Boolean);
321
- const localAppData = process.env['LocalAppData'];
322
- const gitBashCandidates = [];
323
- // Git for Windows 标准安装位置
259
+ const candidates = [];
324
260
  for (const base of programFiles) {
325
- gitBashCandidates.push((0, path_1.join)(base, 'Git', 'bin', 'bash.exe'), (0, path_1.join)(base, 'Git', 'usr', 'bin', 'bash.exe'));
261
+ candidates.push((0, path_1.join)(base, 'Git', 'bin', 'bash.exe'), (0, path_1.join)(base, 'Git', 'usr', 'bin', 'bash.exe'));
326
262
  }
327
- // 用户级安装位置
263
+ const localAppData = process.env['LocalAppData'];
328
264
  if (localAppData) {
329
- gitBashCandidates.push((0, path_1.join)(localAppData, 'Programs', 'Git', 'bin', 'bash.exe'), (0, path_1.join)(localAppData, 'Programs', 'Git', 'usr', 'bin', 'bash.exe'));
265
+ candidates.push((0, path_1.join)(localAppData, 'Programs', 'Git', 'bin', 'bash.exe'), (0, path_1.join)(localAppData, 'Programs', 'Git', 'usr', 'bin', 'bash.exe'));
330
266
  }
331
- // 检查 Git Bash 候选位置
332
- for (const candidate of gitBashCandidates) {
333
- if ((0, fs_1.existsSync)(candidate)) {
334
- if (testBashAvailability(candidate)) {
335
- (0, log_1.logInfo)(`找到 Git Bash: ${candidate}`);
336
- return { bin: candidate, args: ['-l'], type: 'msys' };
337
- }
338
- else {
339
- (0, log_1.logWarn)(`Git Bash 测试失败,跳过: ${candidate}`);
340
- }
341
- }
267
+ // MSYS2
268
+ candidates.push('C:/msys64/usr/bin/bash.exe', 'C:/msys32/usr/bin/bash.exe');
269
+ for (const candidate of candidates) {
270
+ if (tryBash(candidate))
271
+ return { bin: candidate, args: ['-l'], type: 'msys' };
342
272
  }
343
- // 3.1) MSYS2 位置
344
- const msys2Candidates = [
345
- 'C:/msys64/usr/bin/bash.exe',
346
- 'C:/msys32/usr/bin/bash.exe',
347
- ];
348
- for (const candidate of msys2Candidates) {
349
- if ((0, fs_1.existsSync)(candidate)) {
350
- if (testBashAvailability(candidate)) {
351
- (0, log_1.logInfo)(`找到 MSYS2 bash: ${candidate}`);
352
- return { bin: candidate, args: ['-l'], type: 'msys' };
353
- }
354
- else {
355
- (0, log_1.logWarn)(`MSYS2 bash 测试失败,跳过: ${candidate}`);
356
- }
357
- }
358
- }
359
- // 4) 尝试 WSL (仅当明确可用时)
360
- (0, log_1.logInfo)('检测 WSL 环境...');
273
+ return null;
274
+ }
275
+ // 检测 WSL
276
+ function detectWsl() {
361
277
  try {
362
- // 快速探测确保WSL+bash存在且可用
363
278
  (0, child_process_1.execSync)('wsl.exe -e bash -lc "echo SEMA_OK"', { stdio: 'ignore', timeout: 2000 });
364
279
  (0, log_1.logInfo)('WSL bash 可用');
365
280
  return { bin: 'wsl.exe', args: ['-e', 'bash', '-l'], type: 'wsl' };
366
281
  }
367
- catch (error) {
368
- (0, log_1.logWarn)(`WSL 检测失败: ${error}`);
369
- }
370
- // 5) 回退到 PowerShell (Windows 现代 Shell)
371
- (0, log_1.logInfo)('尝试使用 PowerShell 作为回退方案...');
372
- const powershellCandidates = [
373
- 'pwsh.exe', // PowerShell 7+
374
- 'powershell.exe', // Windows PowerShell 5.x
375
- ];
376
- for (const psCandidate of powershellCandidates) {
282
+ catch {
283
+ return null;
284
+ }
285
+ }
286
+ // 检测 PowerShell / cmd.exe 回退
287
+ function detectFallbackShell() {
288
+ // PowerShell
289
+ for (const ps of ['pwsh.exe', 'powershell.exe']) {
377
290
  try {
378
- // 测试 PowerShell 是否可用
379
- // 修复: 增加超时时间,使用NoProfile参数,验证输出
380
- const result = (0, child_process_1.execSync)(`${psCandidate} -NoProfile -Command "Write-Output 'SEMA_PS_OK'"`, {
381
- stdio: 'pipe',
382
- timeout: 3000, // 从1000ms增加到3000ms
383
- encoding: 'utf8'
291
+ const result = (0, child_process_1.execSync)(`${ps} -NoProfile -Command "Write-Output 'SEMA_PS_OK'"`, {
292
+ stdio: 'pipe', timeout: 3000, encoding: 'utf8',
384
293
  });
385
- // 验证输出内容
386
294
  if (result.toString().trim().includes('SEMA_PS_OK')) {
387
- (0, log_1.logInfo)(`使用 PowerShell: ${psCandidate}`);
388
- return { bin: psCandidate, args: ['-NoProfile', '-Command'], type: 'powershell' };
295
+ (0, log_1.logInfo)(`使用 PowerShell: ${ps}`);
296
+ return { bin: ps, args: ['-NoProfile', '-Command'], type: 'powershell' };
389
297
  }
390
- else {
391
- (0, log_1.logWarn)(`PowerShell ${psCandidate} 测试输出不符合预期: ${result.toString().trim()}`);
392
- }
393
- }
394
- catch (error) {
395
- (0, log_1.logWarn)(`PowerShell ${psCandidate} 不可用: ${error}`);
396
298
  }
299
+ catch { /* ignore */ }
397
300
  }
398
- // 6) 最后回退到 cmd.exe
399
- (0, log_1.logWarn)('回退到 Windows 命令提示符 (cmd.exe)');
400
- try {
401
- const comspec = process.env.ComSpec || 'cmd.exe';
402
- if ((0, fs_1.existsSync)(comspec)) {
403
- (0, log_1.logInfo)(`使用 cmd.exe: ${comspec}`);
404
- return { bin: comspec, args: ['/k'], type: 'cmd' };
405
- }
301
+ // cmd.exe
302
+ const comspec = process.env.ComSpec || 'cmd.exe';
303
+ if ((0, fs_1.existsSync)(comspec)) {
304
+ (0, log_1.logInfo)(`使用 cmd.exe: ${comspec}`);
305
+ return { bin: comspec, args: ['/k'], type: 'cmd' };
406
306
  }
407
- catch (error) {
408
- (0, log_1.logError)(`cmd.exe 检测失败: ${error}`);
307
+ return null;
308
+ }
309
+ function detectShellImpl() {
310
+ if (!platform_1.IS_WIN) {
311
+ return { bin: process.env.SHELL || '/bin/bash', args: ['-l'], type: 'posix' };
409
312
  }
410
- // 7) 最后的手段:提供详细的错误信息和建议
313
+ (0, log_1.logInfo)('开始检测 Windows Shell 环境...');
314
+ // 按优先级依次尝试
315
+ const result = detectBashFromEnv() ??
316
+ detectBashInPath(getWindowsPathEntries()) ??
317
+ detectBashInFixedLocations() ??
318
+ detectWsl() ??
319
+ detectFallbackShell();
320
+ if (result)
321
+ return result;
411
322
  const hint = [
412
323
  '无法找到任何可用的 Shell 环境!',
413
324
  '',
@@ -431,7 +342,7 @@ class PersistentShell {
431
342
  this._exitCachedStdout = ''; // shell退出时缓存的stdout(防竞态)
432
343
  this._exitCachedStderr = ''; // shell退出时缓存的stderr(防竞态)
433
344
  // 检测可用的Shell
434
- const { bin, args, type } = detectShell();
345
+ const { bin, args, type } = resolveShellBinary();
435
346
  this.binShell = bin;
436
347
  this.shellArgs = args;
437
348
  this.shellType = type;
@@ -451,7 +362,6 @@ class PersistentShell {
451
362
  // 监听Shell退出事件
452
363
  this.shell.on('exit', (code, signal) => {
453
364
  if (code) {
454
- // TODO: 最好能通知用户Shell崩溃了
455
365
  (0, log_1.logError)(`Shell exited with code ${code} and signal ${signal}`);
456
366
  }
457
367
  // 在删除文件前缓存内容,防止与 exec_() 的 readOutput() 产生竞态条件
@@ -631,85 +541,56 @@ class PersistentShell {
631
541
  this.processQueue();
632
542
  });
633
543
  }
634
- // 执行命令(内部实现)
635
- async exec_(command, timeout, onChunk, onTimeout) {
636
- /**
637
- * 直接执行命令,不经过队列。
638
- * 并发不变性:
639
- * - 不适合并发调用(使用共享文件)
640
- * - 仅在队列空闲时调用
641
- * - 依赖基于文件的IPC处理Shell交互
642
- * - 不修改命令队列状态
643
- * - 通过commandInterrupted标志跟踪中断状态
644
- * - 在新命令开始时重置中断状态
645
- * - 在结果对象中报告中断状态
646
- *
647
- * 超时机制:
648
- * - idle timeout: ${IDLE_TIMEOUT_MS/1000}秒无新输出 → kill(每次有输出变化则重置)
649
- * - max timeout: min(用户传入 timeout, 3min) → kill(从命令开始倒计时,不重置)
650
- * - 谁先触发谁 kill,超时后仍返回已写入临时文件的部分输出
651
- *
652
- * 退出码和CWD处理:
653
- * - 执行命令并立即将其退出码捕获到Shell变量中
654
- * - 捕获退出码后更新CWD文件的工作目录
655
- * - 将保存的退出码作为最后一步写入状态文件
656
- * - 此序列消除了退出码捕获和CWD更新之间的竞争条件
657
- * - pwd()方法直接读取CWD文件获取当前目录信息
658
- */
659
- // 如果是非 bash Shell,需要特殊处理
660
- if (this.shellType === 'cmd' || this.shellType === 'powershell') {
661
- return this.execNonBashShell(command, timeout, onChunk);
662
- }
663
- const quotedCommand = shell_quote_1.default.quote([command]);
664
- // 检查命令语法(语法错误提前返回,避免污染 shell 状态)
665
- // Windows 上 spawn 子进程较慢,使用更长超时
544
+ /**
545
+ * 检查命令语法(语法错误提前返回,避免污染 shell 状态)
546
+ * 返回 null 表示语法正常,返回 ShellExecResult 表示语法错误
547
+ */
548
+ checkSyntax(command, quotedCommand) {
666
549
  const syntaxCheckTimeout = platform_1.IS_WIN ? 5000 : 1000;
667
550
  try {
668
551
  if (this.shellType === 'wsl') {
669
552
  (0, child_process_1.execSync)(`wsl.exe -e bash -n -c ${quotedCommand}`, {
670
- stdio: 'ignore',
671
- timeout: syntaxCheckTimeout,
553
+ stdio: 'ignore', timeout: syntaxCheckTimeout,
672
554
  });
673
555
  }
674
556
  else if (platform_1.IS_WIN) {
675
- // 在 Windows 上使用 spawn 方式直接调用 bash,避免 cmd.exe 对引号的错误解析
676
557
  const { spawnSync } = require('child_process');
677
558
  const result = spawnSync(this.binShell, ['-n', '-c', command], {
678
- stdio: 'ignore',
679
- timeout: syntaxCheckTimeout,
680
- windowsHide: true,
559
+ stdio: 'ignore', timeout: syntaxCheckTimeout, windowsHide: true,
681
560
  });
682
- // 检查是否有错误,统一抛出让 catch 处理
683
561
  if (result.status !== 0 || result.error) {
684
562
  throw result.error || new Error(`Syntax check failed with exit code ${result.status}`);
685
563
  }
686
564
  }
687
565
  else {
688
- // Unix 系统使用 execSync
689
566
  (0, child_process_1.execSync)(`${this.binShell} -n -c ${quotedCommand}`, {
690
- stdio: 'ignore',
691
- timeout: syntaxCheckTimeout,
567
+ stdio: 'ignore', timeout: syntaxCheckTimeout,
692
568
  });
693
569
  }
694
570
  }
695
571
  catch (err) {
696
- // 超时(ETIMEDOUT)说明无法完成语法检查,不等于语法错误,继续执行
697
572
  const isTimeout = err?.code === 'ETIMEDOUT' || err?.killed === true;
698
573
  if (isTimeout) {
699
574
  (0, log_1.logWarn)(`语法检查超时,跳过并继续执行命令: ${command}`);
700
575
  }
701
576
  else {
702
- // 真正的语法错误,提前返回
703
- const errorStr = typeof err === 'string' ? err : String(err || '');
704
- return Promise.resolve({
705
- stdout: '',
706
- stderr: errorStr,
707
- code: 128,
708
- interrupted: false,
709
- });
577
+ return { stdout: '', stderr: String(err || ''), code: 128, interrupted: false };
710
578
  }
711
579
  }
712
- const maxTimeout = timeout || DEFAULT_TIMEOUT;
580
+ return null;
581
+ }
582
+ // 执行命令(内部实现)
583
+ async exec_(command, timeout, onChunk, onTimeout) {
584
+ // 非 bash Shell 走单独路径
585
+ if (this.shellType === 'cmd' || this.shellType === 'powershell') {
586
+ return this.execNonBashShell(command, timeout, onChunk);
587
+ }
588
+ const quotedCommand = shell_quote_1.default.quote([command]);
589
+ // 语法检查
590
+ const syntaxError = this.checkSyntax(command, quotedCommand);
591
+ if (syntaxError)
592
+ return syntaxError;
593
+ const maxTimeout = timeout || DEFAULT_SHELL_TIMEOUT;
713
594
  // 为新命令重置中断状态
714
595
  this.commandInterrupted = false;
715
596
  return new Promise(resolve => {
@@ -720,7 +601,8 @@ class PersistentShell {
720
601
  // 使用命令数组清晰地分解命令序列
721
602
  const commandParts = [];
722
603
  // 1. 重定向执行主命令,cd/export 等状态变更在命令间持久化
723
- commandParts.push(`eval ${quotedCommand} < /dev/null > ${quoteForBash(this.stdoutFileBashPath)} 2> ${quoteForBash(this.stderrFileBashPath)}`);
604
+ // 注意:使用 <&- 关闭 stdin 而非 < /dev/null,以避免 Windows 下创建 nul 文件
605
+ commandParts.push(`eval ${quotedCommand} <&- > ${quoteForBash(this.stdoutFileBashPath)} 2> ${quoteForBash(this.stderrFileBashPath)}`);
724
606
  // 2. 命令执行后立即捕获退出码,避免丢失
725
607
  commandParts.push(`EXEC_EXIT_CODE=$?`);
726
608
  // 3. 更新CWD文件
@@ -825,7 +707,7 @@ class PersistentShell {
825
707
  const { stdout, stderr } = readOutput();
826
708
  finish({
827
709
  stdout,
828
- stderr: (stderr ? stderr + '\n' : '') + `(timeout ${formatDuration(maxTimeout)})`,
710
+ stderr: (stderr ? stderr + '\n' : '') + `(timeout ${humanizeDuration(maxTimeout)})`,
829
711
  code: SIGTERM_CODE,
830
712
  interrupted: this.commandInterrupted,
831
713
  });
@@ -853,7 +735,7 @@ class PersistentShell {
853
735
  }
854
736
  // 非 Bash Shell 特殊处理 (PowerShell, cmd.exe)
855
737
  async execNonBashShell(command, timeout, onChunk) {
856
- const commandTimeout = timeout || DEFAULT_TIMEOUT;
738
+ const commandTimeout = timeout || DEFAULT_SHELL_TIMEOUT;
857
739
  this.commandInterrupted = false;
858
740
  return new Promise(resolve => {
859
741
  try {
@@ -903,7 +785,7 @@ class PersistentShell {
903
785
  childProcess.kill('SIGTERM');
904
786
  resolve({
905
787
  stdout,
906
- stderr: stderr + `\n(timeout ${formatDuration(commandTimeout)})`,
788
+ stderr: stderr + `\n(timeout ${humanizeDuration(commandTimeout)})`,
907
789
  code: SIGTERM_CODE,
908
790
  interrupted: true,
909
791
  });
@@ -1000,4 +882,31 @@ class PersistentShell {
1000
882
  exports.PersistentShell = PersistentShell;
1001
883
  // 单例实例
1002
884
  PersistentShell.instance = null;
885
+ // ==================== 输出格式化 ====================
886
+ exports.STDOUT_HEAD_TAIL_LINES = 500;
887
+ exports.STDERR_HEAD_TAIL_LINES = 50;
888
+ const MAX_LINE_LENGTH = 2000;
889
+ function truncateLines(lines) {
890
+ return lines.map(l => l.length > MAX_LINE_LENGTH ? l.slice(0, MAX_LINE_LENGTH) + '...[line truncated]' : l);
891
+ }
892
+ function formatOutput(content, headTailLines = exports.STDOUT_HEAD_TAIL_LINES, { resolveCR = true } = {}) {
893
+ // 处理 \r(回车符):模拟终端行为,只保留每行最后一次 \r 后的内容
894
+ const resolved = resolveCR
895
+ ? content.split('\n').map(line => {
896
+ if (!line.includes('\r'))
897
+ return line;
898
+ const parts = line.split('\r');
899
+ return parts[parts.length - 1];
900
+ }).join('\n')
901
+ : content;
902
+ const lines = truncateLines(resolved.split('\n'));
903
+ const totalLines = lines.length;
904
+ const skipped = totalLines - headTailLines * 2;
905
+ return {
906
+ totalLines,
907
+ truncatedContent: skipped <= 0
908
+ ? lines.join('\n')
909
+ : [...lines.slice(0, headTailLines), `\n... [${skipped} lines truncated] ...\n`, ...lines.slice(-headTailLines)].join('\n'),
910
+ };
911
+ }
1003
912
  //# sourceMappingURL=shell.js.map