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.
- package/README.md +22 -9
- package/dist/{constants → conf}/config.d.ts +0 -1
- package/dist/conf/config.d.ts.map +1 -0
- package/dist/{constants → conf}/config.js +1 -3
- package/dist/conf/config.js.map +1 -0
- package/dist/core/Conversation.d.ts +3 -14
- package/dist/core/Conversation.d.ts.map +1 -1
- package/dist/core/Conversation.js +53 -89
- package/dist/core/Conversation.js.map +1 -1
- package/dist/core/RunTools.d.ts +5 -5
- package/dist/core/RunTools.d.ts.map +1 -1
- package/dist/core/RunTools.js +22 -31
- package/dist/core/RunTools.js.map +1 -1
- package/dist/core/SemaCore.d.ts +21 -22
- package/dist/core/SemaCore.d.ts.map +1 -1
- package/dist/core/SemaCore.js +16 -24
- package/dist/core/SemaCore.js.map +1 -1
- package/dist/core/SemaEngine.d.ts +2 -2
- package/dist/core/SemaEngine.d.ts.map +1 -1
- package/dist/core/SemaEngine.js +30 -33
- package/dist/core/SemaEngine.js.map +1 -1
- package/dist/events/EventSystem.d.ts.map +1 -1
- package/dist/events/EventSystem.js +3 -2
- package/dist/events/EventSystem.js.map +1 -1
- package/dist/events/types.d.ts +75 -41
- package/dist/events/types.d.ts.map +1 -1
- package/dist/manager/ConfManager.d.ts +10 -3
- package/dist/manager/ConfManager.d.ts.map +1 -1
- package/dist/manager/ConfManager.js +30 -13
- package/dist/manager/ConfManager.js.map +1 -1
- package/dist/manager/CronManager.d.ts +3 -6
- package/dist/manager/CronManager.d.ts.map +1 -1
- package/dist/manager/CronManager.js +62 -74
- package/dist/manager/CronManager.js.map +1 -1
- package/dist/manager/ModelManager.d.ts +0 -3
- package/dist/manager/ModelManager.d.ts.map +1 -1
- package/dist/manager/ModelManager.js +2 -4
- package/dist/manager/ModelManager.js.map +1 -1
- package/dist/manager/PermissionManager.d.ts +4 -6
- package/dist/manager/PermissionManager.d.ts.map +1 -1
- package/dist/manager/PermissionManager.js +70 -65
- package/dist/manager/PermissionManager.js.map +1 -1
- package/dist/manager/StateManager.d.ts +40 -7
- package/dist/manager/StateManager.d.ts.map +1 -1
- package/dist/manager/StateManager.js +79 -22
- package/dist/manager/StateManager.js.map +1 -1
- package/dist/manager/TaskManager.d.ts +2 -9
- package/dist/manager/TaskManager.d.ts.map +1 -1
- package/dist/manager/TaskManager.js +64 -66
- package/dist/manager/TaskManager.js.map +1 -1
- package/dist/prompt/agents.d.ts +3 -0
- package/dist/prompt/agents.d.ts.map +1 -0
- package/dist/prompt/agents.js +52 -0
- package/dist/prompt/agents.js.map +1 -0
- package/dist/prompt/commands.d.ts +3 -0
- package/dist/prompt/commands.d.ts.map +1 -0
- package/dist/prompt/commands.js +19 -0
- package/dist/prompt/commands.js.map +1 -0
- package/dist/prompt/compact.d.ts +2 -0
- package/dist/prompt/compact.d.ts.map +1 -0
- package/dist/prompt/compact.js +22 -0
- package/dist/prompt/compact.js.map +1 -0
- package/dist/prompt/define.d.ts +5 -0
- package/dist/prompt/define.d.ts.map +1 -0
- package/dist/prompt/define.js +8 -0
- package/dist/prompt/define.js.map +1 -0
- package/dist/prompt/design/design.d.ts +47 -0
- package/dist/prompt/design/design.d.ts.map +1 -0
- package/dist/prompt/design/design.js +224 -0
- package/dist/prompt/design/design.js.map +1 -0
- package/dist/prompt/design/designPhilosophy.d.ts +2 -0
- package/dist/prompt/design/designPhilosophy.d.ts.map +1 -0
- package/dist/prompt/design/designPhilosophy.js +79 -0
- package/dist/prompt/design/designPhilosophy.js.map +1 -0
- package/dist/prompt/design/designSystemSpec.d.ts +2 -0
- package/dist/prompt/design/designSystemSpec.d.ts.map +1 -0
- package/dist/prompt/design/designSystemSpec.js +44 -0
- package/dist/prompt/design/designSystemSpec.js.map +1 -0
- package/dist/prompt/design/imgPlaceholder.d.ts +2 -0
- package/dist/prompt/design/imgPlaceholder.d.ts.map +1 -0
- package/dist/prompt/design/imgPlaceholder.js +56 -0
- package/dist/prompt/design/imgPlaceholder.js.map +1 -0
- package/dist/prompt/memory.d.ts +2 -0
- package/dist/prompt/memory.d.ts.map +1 -0
- package/dist/prompt/memory.js +23 -0
- package/dist/prompt/memory.js.map +1 -0
- package/dist/prompt/plan.d.ts +2 -0
- package/dist/prompt/plan.d.ts.map +1 -0
- package/dist/prompt/plan.js +30 -0
- package/dist/prompt/plan.js.map +1 -0
- package/dist/prompt/quickchat.d.ts +2 -0
- package/dist/prompt/quickchat.d.ts.map +1 -0
- package/dist/prompt/quickchat.js +16 -0
- package/dist/prompt/quickchat.js.map +1 -0
- package/dist/prompt/system.d.ts +3 -0
- package/dist/prompt/system.d.ts.map +1 -0
- package/dist/prompt/system.js +76 -0
- package/dist/prompt/system.js.map +1 -0
- package/dist/prompt/tool.d.ts +22 -0
- package/dist/prompt/tool.d.ts.map +1 -0
- package/dist/prompt/tool.js +25 -0
- package/dist/prompt/tool.js.map +1 -0
- package/dist/prompt/toolAliases.d.ts +16 -0
- package/dist/prompt/toolAliases.d.ts.map +1 -0
- package/dist/prompt/toolAliases.js +46 -0
- package/dist/prompt/toolAliases.js.map +1 -0
- package/dist/prompt/tools/createCron.d.ts +2 -0
- package/dist/prompt/tools/createCron.d.ts.map +1 -0
- package/dist/prompt/tools/createCron.js +29 -0
- package/dist/prompt/tools/createCron.js.map +1 -0
- package/dist/prompt/tools/createTodo.d.ts +2 -0
- package/dist/prompt/tools/createTodo.d.ts.map +1 -0
- package/dist/prompt/tools/createTodo.js +23 -0
- package/dist/prompt/tools/createTodo.js.map +1 -0
- package/dist/prompt/tools/fetchUrl.d.ts +3 -0
- package/dist/prompt/tools/fetchUrl.d.ts.map +1 -0
- package/dist/prompt/tools/fetchUrl.js +27 -0
- package/dist/prompt/tools/fetchUrl.js.map +1 -0
- package/dist/prompt/tools/planToAgent.d.ts +2 -0
- package/dist/prompt/tools/planToAgent.d.ts.map +1 -0
- package/dist/prompt/tools/planToAgent.js +24 -0
- package/dist/prompt/tools/planToAgent.js.map +1 -0
- package/dist/prompt/tools/runShell.d.ts +2 -0
- package/dist/prompt/tools/runShell.d.ts.map +1 -0
- package/dist/prompt/tools/runShell.js +31 -0
- package/dist/prompt/tools/runShell.js.map +1 -0
- package/dist/prompt/tools/searchContent.d.ts +2 -0
- package/dist/prompt/tools/searchContent.d.ts.map +1 -0
- package/dist/prompt/tools/searchContent.js +18 -0
- package/dist/prompt/tools/searchContent.js.map +1 -0
- package/dist/prompt/tools/skill.d.ts +2 -0
- package/dist/prompt/tools/skill.d.ts.map +1 -0
- package/dist/prompt/tools/skill.js +14 -0
- package/dist/prompt/tools/skill.js.map +1 -0
- package/dist/prompt/tools/subAgent.d.ts +2 -0
- package/dist/prompt/tools/subAgent.d.ts.map +1 -0
- package/dist/prompt/tools/subAgent.js +45 -0
- package/dist/prompt/tools/subAgent.js.map +1 -0
- package/dist/prompt/tools/viewFile.d.ts +4 -0
- package/dist/prompt/tools/viewFile.d.ts.map +1 -0
- package/dist/prompt/tools/viewFile.js +26 -0
- package/dist/prompt/tools/viewFile.js.map +1 -0
- package/dist/services/agents/agentsManager.d.ts +12 -15
- package/dist/services/agents/agentsManager.d.ts.map +1 -1
- package/dist/services/agents/agentsManager.js +67 -65
- package/dist/services/agents/agentsManager.js.map +1 -1
- package/dist/services/agents/genDesignSystemReminder.d.ts +3 -0
- package/dist/services/agents/genDesignSystemReminder.d.ts.map +1 -0
- package/dist/services/agents/genDesignSystemReminder.js +149 -0
- package/dist/services/agents/genDesignSystemReminder.js.map +1 -0
- package/dist/services/agents/genSystemPrompt.d.ts +11 -11
- package/dist/services/agents/genSystemPrompt.d.ts.map +1 -1
- package/dist/services/agents/genSystemPrompt.js +58 -121
- package/dist/services/agents/genSystemPrompt.js.map +1 -1
- package/dist/services/agents/{systemReminder.d.ts → genSystemReminder.d.ts} +2 -7
- package/dist/services/agents/genSystemReminder.d.ts.map +1 -0
- package/dist/services/agents/genSystemReminder.js +86 -0
- package/dist/services/agents/genSystemReminder.js.map +1 -0
- package/dist/services/api/adapt/anthropic.d.ts +3 -5
- package/dist/services/api/adapt/anthropic.d.ts.map +1 -1
- package/dist/services/api/adapt/anthropic.js +32 -18
- package/dist/services/api/adapt/anthropic.js.map +1 -1
- package/dist/services/api/adapt/openai.d.ts +3 -3
- package/dist/services/api/adapt/openai.d.ts.map +1 -1
- package/dist/services/api/adapt/openai.js +20 -23
- package/dist/services/api/adapt/openai.js.map +1 -1
- package/dist/services/api/adapt/util.d.ts +0 -1
- package/dist/services/api/adapt/util.d.ts.map +1 -1
- package/dist/services/api/adapt/util.js +3 -5
- package/dist/services/api/adapt/util.js.map +1 -1
- package/dist/services/api/apiUtil.d.ts +3 -0
- package/dist/services/api/apiUtil.d.ts.map +1 -1
- package/dist/services/api/apiUtil.js +32 -28
- package/dist/services/api/apiUtil.js.map +1 -1
- package/dist/services/api/cache.d.ts +5 -5
- package/dist/services/api/cache.d.ts.map +1 -1
- package/dist/services/api/cache.js +16 -20
- package/dist/services/api/cache.js.map +1 -1
- package/dist/services/api/queryLLM.d.ts +4 -5
- package/dist/services/api/queryLLM.d.ts.map +1 -1
- package/dist/services/api/queryLLM.js +2 -6
- package/dist/services/api/queryLLM.js.map +1 -1
- package/dist/services/commands/commandsManager.d.ts +11 -14
- package/dist/services/commands/commandsManager.d.ts.map +1 -1
- package/dist/services/commands/commandsManager.js +54 -64
- package/dist/services/commands/commandsManager.js.map +1 -1
- package/dist/services/commands/runCommand.d.ts.map +1 -1
- package/dist/services/commands/runCommand.js +3 -27
- package/dist/services/commands/runCommand.js.map +1 -1
- package/dist/services/design/designManager.d.ts +29 -0
- package/dist/services/design/designManager.d.ts.map +1 -0
- package/dist/services/design/designManager.js +365 -0
- package/dist/services/design/designManager.js.map +1 -0
- package/dist/services/mcp/MCPClient.d.ts.map +1 -1
- package/dist/services/mcp/MCPClient.js +9 -1
- package/dist/services/mcp/MCPClient.js.map +1 -1
- package/dist/services/mcp/MCPManager.d.ts +9 -29
- package/dist/services/mcp/MCPManager.d.ts.map +1 -1
- package/dist/services/mcp/MCPManager.js +53 -147
- package/dist/services/mcp/MCPManager.js.map +1 -1
- package/dist/services/mcp/MCPToolAdapter.js +4 -4
- package/dist/services/mcp/MCPToolAdapter.js.map +1 -1
- package/dist/services/memory/memManager.d.ts +6 -9
- package/dist/services/memory/memManager.d.ts.map +1 -1
- package/dist/services/memory/memManager.js +22 -42
- package/dist/services/memory/memManager.js.map +1 -1
- package/dist/services/plugins/pluginsManager.d.ts +9 -17
- package/dist/services/plugins/pluginsManager.d.ts.map +1 -1
- package/dist/services/plugins/pluginsManager.js +33 -104
- package/dist/services/plugins/pluginsManager.js.map +1 -1
- package/dist/services/rules/rulesManager.d.ts +7 -9
- package/dist/services/rules/rulesManager.d.ts.map +1 -1
- package/dist/services/rules/rulesManager.js +19 -39
- package/dist/services/rules/rulesManager.js.map +1 -1
- package/dist/services/skills/skillsManager.d.ts +10 -13
- package/dist/services/skills/skillsManager.d.ts.map +1 -1
- package/dist/services/skills/skillsManager.js +41 -54
- package/dist/services/skills/skillsManager.js.map +1 -1
- package/dist/tools/CreateCron.d.ts +68 -0
- package/dist/tools/CreateCron.d.ts.map +1 -0
- package/dist/tools/CreateCron.js +76 -0
- package/dist/tools/CreateCron.js.map +1 -0
- package/dist/tools/CreateTodo.d.ts +48 -0
- package/dist/tools/CreateTodo.d.ts.map +1 -0
- package/dist/tools/CreateTodo.js +50 -0
- package/dist/tools/CreateTodo.js.map +1 -0
- package/dist/tools/{CronDelete/CronDelete.d.ts → DelCron.d.ts} +11 -11
- package/dist/tools/DelCron.d.ts.map +1 -0
- package/dist/tools/{CronDelete/CronDelete.js → DelCron.js} +12 -12
- package/dist/tools/DelCron.js.map +1 -0
- package/dist/tools/{NotebookEdit/NotebookEdit.d.ts → EditNotebook.d.ts} +37 -37
- package/dist/tools/EditNotebook.d.ts.map +1 -0
- package/dist/tools/EditNotebook.js +220 -0
- package/dist/tools/EditNotebook.js.map +1 -0
- package/dist/tools/{WebFetch/WebFetch.d.ts → FetchUrl.d.ts} +8 -8
- package/dist/tools/FetchUrl.d.ts.map +1 -0
- package/dist/tools/{WebFetch/WebFetch.js → FetchUrl.js} +30 -34
- package/dist/tools/FetchUrl.js.map +1 -0
- package/dist/tools/GetTodo.d.ts +34 -0
- package/dist/tools/GetTodo.d.ts.map +1 -0
- package/dist/tools/{TaskGet/TaskGet.js → GetTodo.js} +21 -20
- package/dist/tools/GetTodo.js.map +1 -0
- package/dist/tools/{CronList/CronList.d.ts → ListCrons.d.ts} +12 -13
- package/dist/tools/ListCrons.d.ts.map +1 -0
- package/dist/tools/{CronList/CronList.js → ListCrons.js} +20 -20
- package/dist/tools/ListCrons.js.map +1 -0
- package/dist/tools/ListTodos.d.ts +27 -0
- package/dist/tools/ListTodos.d.ts.map +1 -0
- package/dist/tools/{TaskList/TaskList.js → ListTodos.js} +20 -19
- package/dist/tools/ListTodos.js.map +1 -0
- package/dist/tools/{Edit/Edit.d.ts → PatchFile.d.ts} +39 -43
- package/dist/tools/PatchFile.d.ts.map +1 -0
- package/dist/tools/PatchFile.js +214 -0
- package/dist/tools/PatchFile.js.map +1 -0
- package/dist/tools/PeekBgJob.d.ts +58 -0
- package/dist/tools/PeekBgJob.d.ts.map +1 -0
- package/dist/tools/PeekBgJob.js +92 -0
- package/dist/tools/PeekBgJob.js.map +1 -0
- package/dist/tools/PickOption.d.ts +463 -0
- package/dist/tools/PickOption.d.ts.map +1 -0
- package/dist/tools/PickOption.js +226 -0
- package/dist/tools/PickOption.js.map +1 -0
- package/dist/tools/PlanToAgent.d.ts +42 -0
- package/dist/tools/PlanToAgent.d.ts.map +1 -0
- package/dist/tools/{ExitPlanMode/ExitPlanMode.js → PlanToAgent.js} +47 -43
- package/dist/tools/PlanToAgent.js.map +1 -0
- package/dist/tools/{Bash/Bash.d.ts → RunShell.d.ts} +23 -21
- package/dist/tools/RunShell.d.ts.map +1 -0
- package/dist/tools/{Bash/Bash.js → RunShell.js} +55 -58
- package/dist/tools/RunShell.js.map +1 -0
- package/dist/tools/SearchContent.d.ts +86 -0
- package/dist/tools/SearchContent.d.ts.map +1 -0
- package/dist/tools/SearchContent.js +237 -0
- package/dist/tools/SearchContent.js.map +1 -0
- package/dist/tools/{Glob/Glob.d.ts → SearchFiles.d.ts} +8 -8
- package/dist/tools/SearchFiles.d.ts.map +1 -0
- package/dist/tools/{Glob/Glob.js → SearchFiles.js} +24 -31
- package/dist/tools/SearchFiles.js.map +1 -0
- package/dist/tools/{Skill/Skill.d.ts → Skill.d.ts} +11 -11
- package/dist/tools/Skill.d.ts.map +1 -0
- package/dist/tools/{Skill/Skill.js → Skill.js} +21 -19
- package/dist/tools/Skill.js.map +1 -0
- package/dist/tools/{TaskStop/TaskStop.d.ts → StopBgJob.d.ts} +17 -17
- package/dist/tools/StopBgJob.d.ts.map +1 -0
- package/dist/tools/StopBgJob.js +69 -0
- package/dist/tools/StopBgJob.js.map +1 -0
- package/dist/tools/SubAgent.d.ts +67 -0
- package/dist/tools/SubAgent.d.ts.map +1 -0
- package/dist/tools/{Agent/Agent.js → SubAgent.js} +60 -58
- package/dist/tools/SubAgent.js.map +1 -0
- package/dist/tools/UpdateTodo.d.ts +76 -0
- package/dist/tools/UpdateTodo.d.ts.map +1 -0
- package/dist/tools/UpdateTodo.js +111 -0
- package/dist/tools/UpdateTodo.js.map +1 -0
- package/dist/tools/{Read/Read.d.ts → ViewFile.d.ts} +26 -64
- package/dist/tools/ViewFile.d.ts.map +1 -0
- package/dist/tools/ViewFile.js +365 -0
- package/dist/tools/ViewFile.js.map +1 -0
- package/dist/tools/{Write/Write.d.ts → WriteFile.d.ts} +12 -12
- package/dist/tools/WriteFile.d.ts.map +1 -0
- package/dist/tools/WriteFile.js +150 -0
- package/dist/tools/WriteFile.js.map +1 -0
- package/dist/tools/base/Tool.d.ts +2 -2
- package/dist/tools/base/Tool.d.ts.map +1 -1
- package/dist/tools/base/tools.d.ts +1 -0
- package/dist/tools/base/tools.d.ts.map +1 -1
- package/dist/tools/base/tools.js +56 -50
- package/dist/tools/base/tools.js.map +1 -1
- package/dist/types/agent.d.ts +0 -1
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/command.d.ts +0 -2
- package/dist/types/command.d.ts.map +1 -1
- package/dist/types/cron.d.ts +6 -6
- package/dist/types/cron.d.ts.map +1 -1
- package/dist/types/design.d.ts +24 -0
- package/dist/types/design.d.ts.map +1 -0
- package/dist/types/design.js +6 -0
- package/dist/types/design.js.map +1 -0
- package/dist/types/errors.d.ts +0 -2
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/errors.js +0 -2
- package/dist/types/errors.js.map +1 -1
- package/dist/types/index.d.ts +16 -12
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +28 -5
- package/dist/types/index.js.map +1 -1
- package/dist/types/mcp.d.ts +1 -3
- package/dist/types/mcp.d.ts.map +1 -1
- package/dist/types/message.d.ts +5 -4
- package/dist/types/message.d.ts.map +1 -1
- package/dist/types/model.d.ts +1 -1
- package/dist/types/model.d.ts.map +1 -1
- package/dist/types/plugin.d.ts +8 -11
- package/dist/types/plugin.d.ts.map +1 -1
- package/dist/types/skill.d.ts +0 -3
- package/dist/types/skill.d.ts.map +1 -1
- package/dist/types/skill.js +0 -2
- package/dist/types/skill.js.map +1 -1
- package/dist/types/task.d.ts +10 -10
- package/dist/types/task.d.ts.map +1 -1
- package/dist/types/todoTask.d.ts +4 -5
- package/dist/types/todoTask.d.ts.map +1 -1
- package/dist/util/adapter.d.ts +8 -3
- package/dist/util/adapter.d.ts.map +1 -1
- package/dist/util/adapter.js +22 -49
- package/dist/util/adapter.js.map +1 -1
- package/dist/util/agentStats.d.ts +1 -1
- package/dist/util/agentStats.d.ts.map +1 -1
- package/dist/util/agentStats.js +16 -24
- package/dist/util/agentStats.js.map +1 -1
- package/dist/util/cacheLLM.d.ts +5 -5
- package/dist/util/cacheLLM.d.ts.map +1 -1
- package/dist/util/cacheLLM.js.map +1 -1
- package/dist/util/color.d.ts +44 -0
- package/dist/util/color.d.ts.map +1 -0
- package/dist/util/color.js +247 -0
- package/dist/util/color.js.map +1 -0
- package/dist/util/commands.d.ts +4 -5
- package/dist/util/commands.d.ts.map +1 -1
- package/dist/util/commands.js +22 -112
- package/dist/util/commands.js.map +1 -1
- package/dist/util/compact.d.ts +6 -3
- package/dist/util/compact.d.ts.map +1 -1
- package/dist/util/compact.js +20 -149
- package/dist/util/compact.js.map +1 -1
- package/dist/util/cron.d.ts +1 -9
- package/dist/util/cron.d.ts.map +1 -1
- package/dist/util/cron.js +2 -29
- package/dist/util/cron.js.map +1 -1
- package/dist/util/cwd.d.ts +2 -35
- package/dist/util/cwd.d.ts.map +1 -1
- package/dist/util/cwd.js +7 -57
- package/dist/util/cwd.js.map +1 -1
- package/dist/util/diff.d.ts +6 -4
- package/dist/util/diff.d.ts.map +1 -1
- package/dist/util/diff.js +63 -104
- package/dist/util/diff.js.map +1 -1
- package/dist/{tools/Edit/utils.d.ts → util/edit.d.ts} +2 -5
- package/dist/util/edit.d.ts.map +1 -0
- package/dist/util/edit.js +44 -0
- package/dist/util/edit.js.map +1 -0
- package/dist/util/env.d.ts +1 -4
- package/dist/util/env.d.ts.map +1 -1
- package/dist/util/env.js +22 -15
- package/dist/util/env.js.map +1 -1
- package/dist/util/fetchUrl.d.ts +18 -0
- package/dist/util/fetchUrl.d.ts.map +1 -0
- package/dist/util/fetchUrl.js +101 -0
- package/dist/util/fetchUrl.js.map +1 -0
- package/dist/util/file.d.ts +32 -45
- package/dist/util/file.d.ts.map +1 -1
- package/dist/util/file.js +153 -236
- package/dist/util/file.js.map +1 -1
- package/dist/util/fileReference.d.ts +1 -9
- package/dist/util/fileReference.d.ts.map +1 -1
- package/dist/util/fileReference.js +45 -58
- package/dist/util/fileReference.js.map +1 -1
- package/dist/util/format.d.ts +1 -9
- package/dist/util/format.d.ts.map +1 -1
- package/dist/util/format.js +5 -46
- package/dist/util/format.js.map +1 -1
- package/dist/util/formatter.d.ts +5 -8
- package/dist/util/formatter.d.ts.map +1 -1
- package/dist/util/formatter.js +5 -15
- package/dist/util/formatter.js.map +1 -1
- package/dist/util/git.d.ts +2 -3
- package/dist/util/git.d.ts.map +1 -1
- package/dist/util/git.js +34 -39
- package/dist/util/git.js.map +1 -1
- package/dist/util/history.d.ts +0 -7
- package/dist/util/history.d.ts.map +1 -1
- package/dist/util/history.js +3 -50
- package/dist/util/history.js.map +1 -1
- package/dist/util/log.d.ts +0 -1
- package/dist/util/log.d.ts.map +1 -1
- package/dist/util/log.js +2 -7
- package/dist/util/log.js.map +1 -1
- package/dist/util/logLLM.d.ts +0 -4
- package/dist/util/logLLM.d.ts.map +1 -1
- package/dist/util/logLLM.js +6 -16
- package/dist/util/logLLM.js.map +1 -1
- package/dist/util/message.d.ts +12 -11
- package/dist/util/message.d.ts.map +1 -1
- package/dist/util/message.js +68 -89
- package/dist/util/message.js.map +1 -1
- package/dist/util/model.d.ts +0 -3
- package/dist/util/model.d.ts.map +1 -1
- package/dist/util/model.js +1 -5
- package/dist/util/model.js.map +1 -1
- package/dist/util/notebook.d.ts +1 -8
- package/dist/util/notebook.d.ts.map +1 -1
- package/dist/util/notebook.js +36 -63
- package/dist/util/notebook.js.map +1 -1
- package/dist/util/pdf.d.ts +14 -72
- package/dist/util/pdf.d.ts.map +1 -1
- package/dist/util/pdf.js +51 -460
- package/dist/util/pdf.js.map +1 -1
- package/dist/util/process.d.ts +1 -1
- package/dist/util/process.d.ts.map +1 -1
- package/dist/util/process.js +7 -11
- package/dist/util/process.js.map +1 -1
- package/dist/util/quickchat.d.ts +6 -0
- package/dist/util/quickchat.d.ts.map +1 -0
- package/dist/util/{btw.js → quickchat.js} +14 -32
- package/dist/util/quickchat.js.map +1 -0
- package/dist/util/ripgrep.d.ts +4 -2
- package/dist/util/ripgrep.d.ts.map +1 -1
- package/dist/util/ripgrep.js +40 -116
- package/dist/util/ripgrep.js.map +1 -1
- package/dist/util/savePath.d.ts +2 -18
- package/dist/util/savePath.d.ts.map +1 -1
- package/dist/util/savePath.js +7 -47
- package/dist/util/savePath.js.map +1 -1
- package/dist/util/secureFile.d.ts +13 -135
- package/dist/util/secureFile.d.ts.map +1 -1
- package/dist/util/secureFile.js +74 -478
- package/dist/util/secureFile.js.map +1 -1
- package/dist/util/session.d.ts +0 -21
- package/dist/util/session.d.ts.map +1 -1
- package/dist/util/session.js +0 -49
- package/dist/util/session.js.map +1 -1
- package/dist/util/shell.d.ts +23 -3
- package/dist/util/shell.d.ts.map +1 -1
- package/dist/util/shell.js +199 -290
- package/dist/util/shell.js.map +1 -1
- package/dist/util/time.d.ts +6 -5
- package/dist/util/time.d.ts.map +1 -1
- package/dist/util/time.js +10 -6
- package/dist/util/time.js.map +1 -1
- package/dist/util/tokens.d.ts +0 -1
- package/dist/util/tokens.d.ts.map +1 -1
- package/dist/util/tokens.js +12 -23
- package/dist/util/tokens.js.map +1 -1
- package/dist/util/topic.d.ts +1 -4
- package/dist/util/topic.d.ts.map +1 -1
- package/dist/util/topic.js +12 -11
- package/dist/util/topic.js.map +1 -1
- package/dist/util/writeFile.d.ts +12 -0
- package/dist/util/writeFile.d.ts.map +1 -0
- package/dist/util/writeFile.js +69 -0
- package/dist/util/writeFile.js.map +1 -0
- package/package.json +1 -1
- package/dist/constants/config.d.ts.map +0 -1
- package/dist/constants/config.js.map +0 -1
- package/dist/constants/message.d.ts +0 -10
- package/dist/constants/message.d.ts.map +0 -1
- package/dist/constants/message.js +0 -25
- package/dist/constants/message.js.map +0 -1
- package/dist/constants/product.d.ts +0 -4
- package/dist/constants/product.d.ts.map +0 -1
- package/dist/constants/product.js +0 -7
- package/dist/constants/product.js.map +0 -1
- package/dist/services/agents/defaultBuiltInAgentsConfs.d.ts +0 -3
- package/dist/services/agents/defaultBuiltInAgentsConfs.d.ts.map +0 -1
- package/dist/services/agents/defaultBuiltInAgentsConfs.js +0 -125
- package/dist/services/agents/defaultBuiltInAgentsConfs.js.map +0 -1
- package/dist/services/agents/prompt.d.ts +0 -10
- package/dist/services/agents/prompt.d.ts.map +0 -1
- package/dist/services/agents/prompt.js +0 -144
- package/dist/services/agents/prompt.js.map +0 -1
- package/dist/services/agents/systemReminder.d.ts.map +0 -1
- package/dist/services/agents/systemReminder.js +0 -68
- package/dist/services/agents/systemReminder.js.map +0 -1
- package/dist/tools/Agent/Agent.d.ts +0 -67
- package/dist/tools/Agent/Agent.d.ts.map +0 -1
- package/dist/tools/Agent/Agent.js.map +0 -1
- package/dist/tools/Agent/prompt.d.ts +0 -6
- package/dist/tools/Agent/prompt.d.ts.map +0 -1
- package/dist/tools/Agent/prompt.js +0 -73
- package/dist/tools/Agent/prompt.js.map +0 -1
- package/dist/tools/AskUserQuestion/AskUserQuestion.d.ts +0 -179
- package/dist/tools/AskUserQuestion/AskUserQuestion.d.ts.map +0 -1
- package/dist/tools/AskUserQuestion/AskUserQuestion.js +0 -165
- package/dist/tools/AskUserQuestion/AskUserQuestion.js.map +0 -1
- package/dist/tools/AskUserQuestion/prompt.d.ts +0 -3
- package/dist/tools/AskUserQuestion/prompt.d.ts.map +0 -1
- package/dist/tools/AskUserQuestion/prompt.js +0 -17
- package/dist/tools/AskUserQuestion/prompt.js.map +0 -1
- package/dist/tools/Bash/Bash.d.ts.map +0 -1
- package/dist/tools/Bash/Bash.js.map +0 -1
- package/dist/tools/Bash/prompt.d.ts +0 -5
- package/dist/tools/Bash/prompt.d.ts.map +0 -1
- package/dist/tools/Bash/prompt.js +0 -130
- package/dist/tools/Bash/prompt.js.map +0 -1
- package/dist/tools/Bash/utils.d.ts +0 -9
- package/dist/tools/Bash/utils.d.ts.map +0 -1
- package/dist/tools/Bash/utils.js +0 -41
- package/dist/tools/Bash/utils.js.map +0 -1
- package/dist/tools/CronCreate/CronCreate.d.ts +0 -68
- package/dist/tools/CronCreate/CronCreate.d.ts.map +0 -1
- package/dist/tools/CronCreate/CronCreate.js +0 -75
- package/dist/tools/CronCreate/CronCreate.js.map +0 -1
- package/dist/tools/CronCreate/prompt.d.ts +0 -3
- package/dist/tools/CronCreate/prompt.d.ts.map +0 -1
- package/dist/tools/CronCreate/prompt.js +0 -41
- package/dist/tools/CronCreate/prompt.js.map +0 -1
- package/dist/tools/CronDelete/CronDelete.d.ts.map +0 -1
- package/dist/tools/CronDelete/CronDelete.js.map +0 -1
- package/dist/tools/CronDelete/prompt.d.ts +0 -3
- package/dist/tools/CronDelete/prompt.d.ts.map +0 -1
- package/dist/tools/CronDelete/prompt.js +0 -6
- package/dist/tools/CronDelete/prompt.js.map +0 -1
- package/dist/tools/CronList/CronList.d.ts.map +0 -1
- package/dist/tools/CronList/CronList.js.map +0 -1
- package/dist/tools/CronList/prompt.d.ts +0 -3
- package/dist/tools/CronList/prompt.d.ts.map +0 -1
- package/dist/tools/CronList/prompt.js +0 -6
- package/dist/tools/CronList/prompt.js.map +0 -1
- package/dist/tools/Edit/Edit.d.ts.map +0 -1
- package/dist/tools/Edit/Edit.js +0 -225
- package/dist/tools/Edit/Edit.js.map +0 -1
- package/dist/tools/Edit/prompt.d.ts +0 -3
- package/dist/tools/Edit/prompt.d.ts.map +0 -1
- package/dist/tools/Edit/prompt.js +0 -15
- package/dist/tools/Edit/prompt.js.map +0 -1
- package/dist/tools/Edit/utils.d.ts.map +0 -1
- package/dist/tools/Edit/utils.js +0 -60
- package/dist/tools/Edit/utils.js.map +0 -1
- package/dist/tools/ExitPlanMode/ExitPlanMode.d.ts +0 -42
- package/dist/tools/ExitPlanMode/ExitPlanMode.d.ts.map +0 -1
- package/dist/tools/ExitPlanMode/ExitPlanMode.js.map +0 -1
- package/dist/tools/ExitPlanMode/prompt.d.ts +0 -3
- package/dist/tools/ExitPlanMode/prompt.d.ts.map +0 -1
- package/dist/tools/ExitPlanMode/prompt.js +0 -28
- package/dist/tools/ExitPlanMode/prompt.js.map +0 -1
- package/dist/tools/Glob/Glob.d.ts.map +0 -1
- package/dist/tools/Glob/Glob.js.map +0 -1
- package/dist/tools/Glob/prompt.d.ts +0 -3
- package/dist/tools/Glob/prompt.d.ts.map +0 -1
- package/dist/tools/Glob/prompt.js +0 -11
- package/dist/tools/Glob/prompt.js.map +0 -1
- package/dist/tools/Grep/Grep.d.ts +0 -106
- package/dist/tools/Grep/Grep.d.ts.map +0 -1
- package/dist/tools/Grep/Grep.js +0 -301
- package/dist/tools/Grep/Grep.js.map +0 -1
- package/dist/tools/Grep/prompt.d.ts +0 -3
- package/dist/tools/Grep/prompt.d.ts.map +0 -1
- package/dist/tools/Grep/prompt.js +0 -17
- package/dist/tools/Grep/prompt.js.map +0 -1
- package/dist/tools/NotebookEdit/NotebookEdit.d.ts.map +0 -1
- package/dist/tools/NotebookEdit/NotebookEdit.js +0 -312
- package/dist/tools/NotebookEdit/NotebookEdit.js.map +0 -1
- package/dist/tools/NotebookEdit/prompt.d.ts +0 -3
- package/dist/tools/NotebookEdit/prompt.d.ts.map +0 -1
- package/dist/tools/NotebookEdit/prompt.js +0 -6
- package/dist/tools/NotebookEdit/prompt.js.map +0 -1
- package/dist/tools/Read/Read.d.ts.map +0 -1
- package/dist/tools/Read/Read.js +0 -472
- package/dist/tools/Read/Read.js.map +0 -1
- package/dist/tools/Read/prompt.d.ts +0 -4
- package/dist/tools/Read/prompt.d.ts.map +0 -1
- package/dist/tools/Read/prompt.js +0 -23
- package/dist/tools/Read/prompt.js.map +0 -1
- package/dist/tools/Skill/Skill.d.ts.map +0 -1
- package/dist/tools/Skill/Skill.js.map +0 -1
- package/dist/tools/Skill/prompt.d.ts +0 -3
- package/dist/tools/Skill/prompt.d.ts.map +0 -1
- package/dist/tools/Skill/prompt.js +0 -27
- package/dist/tools/Skill/prompt.js.map +0 -1
- package/dist/tools/TaskCreate/TaskCreate.d.ts +0 -54
- package/dist/tools/TaskCreate/TaskCreate.d.ts.map +0 -1
- package/dist/tools/TaskCreate/TaskCreate.js +0 -51
- package/dist/tools/TaskCreate/TaskCreate.js.map +0 -1
- package/dist/tools/TaskCreate/prompt.d.ts +0 -3
- package/dist/tools/TaskCreate/prompt.d.ts.map +0 -1
- package/dist/tools/TaskCreate/prompt.js +0 -45
- package/dist/tools/TaskCreate/prompt.js.map +0 -1
- package/dist/tools/TaskGet/TaskGet.d.ts +0 -34
- package/dist/tools/TaskGet/TaskGet.d.ts.map +0 -1
- package/dist/tools/TaskGet/TaskGet.js.map +0 -1
- package/dist/tools/TaskGet/prompt.d.ts +0 -3
- package/dist/tools/TaskGet/prompt.d.ts.map +0 -1
- package/dist/tools/TaskGet/prompt.js +0 -26
- package/dist/tools/TaskGet/prompt.js.map +0 -1
- package/dist/tools/TaskList/TaskList.d.ts +0 -27
- package/dist/tools/TaskList/TaskList.d.ts.map +0 -1
- package/dist/tools/TaskList/TaskList.js.map +0 -1
- package/dist/tools/TaskList/prompt.d.ts +0 -3
- package/dist/tools/TaskList/prompt.d.ts.map +0 -1
- package/dist/tools/TaskList/prompt.js +0 -25
- package/dist/tools/TaskList/prompt.js.map +0 -1
- package/dist/tools/TaskOutput/TaskOutput.d.ts +0 -58
- package/dist/tools/TaskOutput/TaskOutput.d.ts.map +0 -1
- package/dist/tools/TaskOutput/TaskOutput.js +0 -95
- package/dist/tools/TaskOutput/TaskOutput.js.map +0 -1
- package/dist/tools/TaskStop/TaskStop.d.ts.map +0 -1
- package/dist/tools/TaskStop/TaskStop.js +0 -69
- package/dist/tools/TaskStop/TaskStop.js.map +0 -1
- package/dist/tools/TaskUpdate/TaskUpdate.d.ts +0 -88
- package/dist/tools/TaskUpdate/TaskUpdate.d.ts.map +0 -1
- package/dist/tools/TaskUpdate/TaskUpdate.js +0 -115
- package/dist/tools/TaskUpdate/TaskUpdate.js.map +0 -1
- package/dist/tools/TaskUpdate/prompt.d.ts +0 -3
- package/dist/tools/TaskUpdate/prompt.d.ts.map +0 -1
- package/dist/tools/TaskUpdate/prompt.js +0 -80
- package/dist/tools/TaskUpdate/prompt.js.map +0 -1
- package/dist/tools/TodoWrite/TodoWrite.d.ts +0 -92
- package/dist/tools/TodoWrite/TodoWrite.d.ts.map +0 -1
- package/dist/tools/TodoWrite/TodoWrite.js +0 -101
- package/dist/tools/TodoWrite/TodoWrite.js.map +0 -1
- package/dist/tools/TodoWrite/prompt.d.ts +0 -3
- package/dist/tools/TodoWrite/prompt.d.ts.map +0 -1
- package/dist/tools/TodoWrite/prompt.js +0 -187
- package/dist/tools/TodoWrite/prompt.js.map +0 -1
- package/dist/tools/WebFetch/WebFetch.d.ts.map +0 -1
- package/dist/tools/WebFetch/WebFetch.js.map +0 -1
- package/dist/tools/WebFetch/prompt.d.ts +0 -4
- package/dist/tools/WebFetch/prompt.d.ts.map +0 -1
- package/dist/tools/WebFetch/prompt.js +0 -38
- package/dist/tools/WebFetch/prompt.js.map +0 -1
- package/dist/tools/WebFetch/utils.d.ts +0 -20
- package/dist/tools/WebFetch/utils.d.ts.map +0 -1
- package/dist/tools/WebFetch/utils.js +0 -223
- package/dist/tools/WebFetch/utils.js.map +0 -1
- package/dist/tools/Write/Write.d.ts.map +0 -1
- package/dist/tools/Write/Write.js +0 -197
- package/dist/tools/Write/Write.js.map +0 -1
- package/dist/tools/Write/prompt.d.ts +0 -3
- package/dist/tools/Write/prompt.d.ts.map +0 -1
- package/dist/tools/Write/prompt.js +0 -13
- package/dist/tools/Write/prompt.js.map +0 -1
- package/dist/util/assembleTools.d.ts +0 -6
- package/dist/util/assembleTools.d.ts.map +0 -1
- package/dist/util/assembleTools.js +0 -17
- package/dist/util/assembleTools.js.map +0 -1
- package/dist/util/btw.d.ts +0 -6
- package/dist/util/btw.d.ts.map +0 -1
- package/dist/util/btw.js.map +0 -1
- package/dist/util/directory.d.ts +0 -37
- package/dist/util/directory.d.ts.map +0 -1
- package/dist/util/directory.js +0 -137
- package/dist/util/directory.js.map +0 -1
- package/dist/util/exec.d.ts +0 -6
- package/dist/util/exec.d.ts.map +0 -1
- package/dist/util/exec.js +0 -43
- package/dist/util/exec.js.map +0 -1
- package/dist/util/filePermission.d.ts +0 -14
- package/dist/util/filePermission.d.ts.map +0 -1
- package/dist/util/filePermission.js +0 -47
- package/dist/util/filePermission.js.map +0 -1
package/dist/util/shell.js
CHANGED
|
@@ -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.
|
|
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
|
|
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
|
|
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
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
const
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
|
|
158
|
-
(0, log_1.logWarn)(
|
|
159
|
-
return saveAndReturn(false);
|
|
145
|
+
catch (error) {
|
|
146
|
+
(0, log_1.logWarn)(`bash 测试失败: ${bashPath}, 错误: ${error}`);
|
|
160
147
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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
|
|
175
|
-
|
|
176
|
-
return detectedShellCache;
|
|
177
|
-
detectedShellCache = detectShellImpl();
|
|
178
|
-
return detectedShellCache;
|
|
158
|
+
function resolveShellBinary() {
|
|
159
|
+
return (detectedShellCache ??= detectShellImpl());
|
|
179
160
|
}
|
|
180
|
-
function
|
|
181
|
-
|
|
182
|
-
const bin
|
|
183
|
-
return { bin, args
|
|
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
|
-
|
|
198
|
-
|
|
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
|
-
|
|
211
|
-
|
|
212
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
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
|
|
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
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
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
|
-
|
|
254
|
-
|
|
255
|
-
|
|
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
|
-
|
|
262
|
-
|
|
263
|
-
}
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
nonGitCandidates.push(candidate);
|
|
264
228
|
}
|
|
265
229
|
}
|
|
266
230
|
else {
|
|
267
|
-
//
|
|
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
|
|
274
|
-
(0, path_1.join)(gitRoot,
|
|
275
|
-
|
|
276
|
-
|
|
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
|
-
//
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
const
|
|
298
|
-
if ((
|
|
299
|
-
|
|
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
|
-
|
|
315
|
-
|
|
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
|
|
322
|
-
const gitBashCandidates = [];
|
|
323
|
-
// Git for Windows 标准安装位置
|
|
259
|
+
const candidates = [];
|
|
324
260
|
for (const base of programFiles) {
|
|
325
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
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
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
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
|
|
368
|
-
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
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
|
-
|
|
379
|
-
|
|
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: ${
|
|
388
|
-
return { bin:
|
|
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
|
-
//
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
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
|
-
|
|
408
|
-
|
|
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
|
-
|
|
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 } =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 ${
|
|
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 ||
|
|
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 ${
|
|
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
|