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.
- package/README.md +15 -10
- 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 +70 -106
- 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 +27 -36
- package/dist/core/RunTools.js.map +1 -1
- package/dist/core/SemaCore.d.ts +35 -40
- package/dist/core/SemaCore.d.ts.map +1 -1
- package/dist/core/SemaCore.js +61 -59
- package/dist/core/SemaCore.js.map +1 -1
- package/dist/core/SemaEngine.d.ts +26 -17
- package/dist/core/SemaEngine.d.ts.map +1 -1
- package/dist/core/SemaEngine.js +128 -221
- package/dist/core/SemaEngine.js.map +1 -1
- package/dist/core/SemaSession.d.ts +43 -0
- package/dist/core/SemaSession.d.ts.map +1 -0
- package/dist/core/SemaSession.js +72 -0
- package/dist/core/SemaSession.js.map +1 -0
- package/dist/core/SessionPool.d.ts +32 -0
- package/dist/core/SessionPool.d.ts.map +1 -0
- package/dist/core/SessionPool.js +89 -0
- package/dist/core/SessionPool.js.map +1 -0
- package/dist/events/EventSystem.d.ts +40 -12
- package/dist/events/EventSystem.d.ts.map +1 -1
- package/dist/events/EventSystem.js +85 -26
- package/dist/events/EventSystem.js.map +1 -1
- package/dist/events/types.d.ts +86 -46
- package/dist/events/types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.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 +18 -10
- package/dist/manager/CronManager.d.ts.map +1 -1
- package/dist/manager/CronManager.js +106 -91
- 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 +85 -81
- package/dist/manager/PermissionManager.js.map +1 -1
- package/dist/manager/StateManager.d.ts +84 -122
- package/dist/manager/StateManager.d.ts.map +1 -1
- package/dist/manager/StateManager.js +194 -194
- package/dist/manager/StateManager.js.map +1 -1
- package/dist/manager/TaskManager.d.ts +30 -19
- package/dist/manager/TaskManager.d.ts.map +1 -1
- package/dist/manager/TaskManager.js +157 -98
- 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 +230 -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 +79 -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 +39 -25
- 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 +27 -30
- package/dist/services/api/adapt/openai.js.map +1 -1
- package/dist/services/api/adapt/util.d.ts +2 -3
- package/dist/services/api/adapt/util.d.ts.map +1 -1
- package/dist/services/api/adapt/util.js +7 -9
- 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 +30 -26
- 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 +23 -27
- package/dist/services/api/cache.js.map +1 -1
- package/dist/services/api/queryLLM.d.ts +17 -5
- package/dist/services/api/queryLLM.d.ts.map +1 -1
- package/dist/services/api/queryLLM.js +19 -23
- 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 +1 -1
- package/dist/services/commands/runCommand.d.ts.map +1 -1
- package/dist/services/commands/runCommand.js +28 -52
- 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} +31 -35
- 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/GetTodo.js +58 -0
- 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/ListTodos.js +57 -0
- 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 +93 -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} +54 -51
- 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} +56 -59
- 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} +76 -71
- 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 +3 -2
- package/dist/tools/base/tools.d.ts.map +1 -1
- package/dist/tools/base/tools.js +66 -54
- package/dist/tools/base/tools.js.map +1 -1
- package/dist/types/agent.d.ts +2 -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 +7 -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 +18 -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/session.d.ts +18 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +3 -0
- package/dist/types/session.js.map +1 -0
- 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 +12 -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 +8 -5
- package/dist/util/compact.d.ts.map +1 -1
- package/dist/util/compact.js +26 -156
- 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 +34 -45
- package/dist/util/file.d.ts.map +1 -1
- package/dist/util/file.js +164 -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 +49 -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 +3 -7
- package/dist/util/logLLM.d.ts.map +1 -1
- package/dist/util/logLLM.js +16 -31
- 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 +72 -93
- 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/notifyRegistry.d.ts +18 -0
- package/dist/util/notifyRegistry.d.ts.map +1 -0
- package/dist/util/notifyRegistry.js +28 -0
- package/dist/util/notifyRegistry.js.map +1 -0
- 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 +8 -13
- 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/quickchat.js +64 -0
- 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 +2 -19
- package/dist/util/session.d.ts.map +1 -1
- package/dist/util/session.js +5 -47
- package/dist/util/session.js.map +1 -1
- package/dist/util/shell.d.ts +25 -3
- package/dist/util/shell.d.ts.map +1 -1
- package/dist/util/shell.js +218 -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 +0 -57
- 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 +0 -56
- 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 +0 -80
- 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,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.
|
|
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
|
|
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
|
|
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
|
-
|
|
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);
|
|
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
|
-
|
|
158
|
-
(0, log_1.logWarn)(
|
|
159
|
-
return saveAndReturn(false);
|
|
148
|
+
catch (error) {
|
|
149
|
+
(0, log_1.logWarn)(`bash 测试失败: ${bashPath}, 错误: ${error}`);
|
|
160
150
|
}
|
|
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');
|
|
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
|
|
175
|
-
|
|
176
|
-
return detectedShellCache;
|
|
177
|
-
detectedShellCache = detectShellImpl();
|
|
178
|
-
return detectedShellCache;
|
|
161
|
+
function resolveShellBinary() {
|
|
162
|
+
return (detectedShellCache ??= detectShellImpl());
|
|
179
163
|
}
|
|
180
|
-
function
|
|
181
|
-
|
|
182
|
-
const bin
|
|
183
|
-
return { bin, args
|
|
164
|
+
function getShellRuntimeInfo() {
|
|
165
|
+
try {
|
|
166
|
+
const { bin, args, type } = resolveShellBinary();
|
|
167
|
+
return { bin, args, type };
|
|
184
168
|
}
|
|
185
|
-
|
|
186
|
-
|
|
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
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
return { bin:
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
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
|
-
|
|
211
|
-
|
|
212
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
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
|
|
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
|
|
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...');
|
|
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
|
-
|
|
254
|
-
|
|
255
|
-
|
|
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
|
-
|
|
262
|
-
|
|
263
|
-
}
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
nonGitCandidates.push(candidate);
|
|
264
247
|
}
|
|
265
248
|
}
|
|
266
249
|
else {
|
|
267
|
-
//
|
|
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
|
|
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
|
-
}
|
|
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
|
-
//
|
|
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
|
-
}
|
|
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
|
-
|
|
315
|
-
|
|
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
|
|
322
|
-
const gitBashCandidates = [];
|
|
323
|
-
// Git for Windows 标准安装位置
|
|
278
|
+
const candidates = [];
|
|
324
279
|
for (const base of programFiles) {
|
|
325
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
-
}
|
|
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
|
-
|
|
360
|
-
|
|
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
|
|
368
|
-
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
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
|
-
|
|
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'
|
|
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: ${
|
|
388
|
-
return { bin:
|
|
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
|
|
395
|
-
(0, log_1.logWarn)(`PowerShell ${psCandidate} 不可用: ${error}`);
|
|
396
|
-
}
|
|
318
|
+
catch { /* ignore */ }
|
|
397
319
|
}
|
|
398
|
-
//
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
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
|
-
|
|
408
|
-
|
|
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
|
-
|
|
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 } =
|
|
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 ||
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 ${
|
|
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 ||
|
|
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 ${
|
|
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
|