sema-core 1.0.14 → 2.0.1

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