@caoxupei/ai-agent-cli 1.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/LICENSE +21 -0
- package/README.md +350 -0
- package/bin/ai-agent-cli.js +14 -0
- package/dist/adapters/anthropic.d.ts +15 -0
- package/dist/adapters/anthropic.d.ts.map +1 -0
- package/dist/adapters/anthropic.js +83 -0
- package/dist/adapters/anthropic.js.map +1 -0
- package/dist/adapters/base.d.ts +45 -0
- package/dist/adapters/base.d.ts.map +1 -0
- package/dist/adapters/base.js +27 -0
- package/dist/adapters/base.js.map +1 -0
- package/dist/adapters/factory.d.ts +17 -0
- package/dist/adapters/factory.d.ts.map +1 -0
- package/dist/adapters/factory.js +34 -0
- package/dist/adapters/factory.js.map +1 -0
- package/dist/adapters/gemini.d.ts +16 -0
- package/dist/adapters/gemini.d.ts.map +1 -0
- package/dist/adapters/gemini.js +164 -0
- package/dist/adapters/gemini.js.map +1 -0
- package/dist/adapters/openai.d.ts +15 -0
- package/dist/adapters/openai.d.ts.map +1 -0
- package/dist/adapters/openai.js +175 -0
- package/dist/adapters/openai.js.map +1 -0
- package/dist/commands/skillCommands.d.ts +21 -0
- package/dist/commands/skillCommands.d.ts.map +1 -0
- package/dist/commands/skillCommands.js +320 -0
- package/dist/commands/skillCommands.js.map +1 -0
- package/dist/config/Config.d.ts +35 -0
- package/dist/config/Config.d.ts.map +1 -0
- package/dist/config/Config.js +108 -0
- package/dist/config/Config.js.map +1 -0
- package/dist/config/types.d.ts +48 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +32 -0
- package/dist/config/types.js.map +1 -0
- package/dist/core/agents.d.ts +32 -0
- package/dist/core/agents.d.ts.map +1 -0
- package/dist/core/agents.js +93 -0
- package/dist/core/agents.js.map +1 -0
- package/dist/core/constants.d.ts +97 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +119 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/loop.d.ts +33 -0
- package/dist/core/loop.d.ts.map +1 -0
- package/dist/core/loop.js +134 -0
- package/dist/core/loop.js.map +1 -0
- package/dist/core/outputStyles.d.ts +50 -0
- package/dist/core/outputStyles.d.ts.map +1 -0
- package/dist/core/outputStyles.js +165 -0
- package/dist/core/outputStyles.js.map +1 -0
- package/dist/core/planMode.d.ts +40 -0
- package/dist/core/planMode.d.ts.map +1 -0
- package/dist/core/planMode.js +143 -0
- package/dist/core/planMode.js.map +1 -0
- package/dist/core/projectContext.d.ts +68 -0
- package/dist/core/projectContext.d.ts.map +1 -0
- package/dist/core/projectContext.js +183 -0
- package/dist/core/projectContext.js.map +1 -0
- package/dist/core/prompts.d.ts +26 -0
- package/dist/core/prompts.d.ts.map +1 -0
- package/dist/core/prompts.js +267 -0
- package/dist/core/prompts.js.map +1 -0
- package/dist/core/reminder.d.ts +72 -0
- package/dist/core/reminder.d.ts.map +1 -0
- package/dist/core/reminder.js +152 -0
- package/dist/core/reminder.js.map +1 -0
- package/dist/core/theme.d.ts +35 -0
- package/dist/core/theme.d.ts.map +1 -0
- package/dist/core/theme.js +56 -0
- package/dist/core/theme.js.map +1 -0
- package/dist/core/types.d.ts +55 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +5 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/ui/Banner.d.ts +47 -0
- package/dist/core/ui/Banner.d.ts.map +1 -0
- package/dist/core/ui/Banner.js +122 -0
- package/dist/core/ui/Banner.js.map +1 -0
- package/dist/core/ui/Input.d.ts +51 -0
- package/dist/core/ui/Input.d.ts.map +1 -0
- package/dist/core/ui/Input.js +322 -0
- package/dist/core/ui/Input.js.map +1 -0
- package/dist/core/ui/Logo.d.ts +21 -0
- package/dist/core/ui/Logo.d.ts.map +1 -0
- package/dist/core/ui/Logo.js +31 -0
- package/dist/core/ui/Logo.js.map +1 -0
- package/dist/core/ui/Messages.d.ts +45 -0
- package/dist/core/ui/Messages.d.ts.map +1 -0
- package/dist/core/ui/Messages.js +76 -0
- package/dist/core/ui/Messages.js.map +1 -0
- package/dist/core/ui/Spinner.d.ts +29 -0
- package/dist/core/ui/Spinner.d.ts.map +1 -0
- package/dist/core/ui/Spinner.js +64 -0
- package/dist/core/ui/Spinner.js.map +1 -0
- package/dist/core/ui/ToolDisplay.d.ts +49 -0
- package/dist/core/ui/ToolDisplay.d.ts.map +1 -0
- package/dist/core/ui/ToolDisplay.js +99 -0
- package/dist/core/ui/ToolDisplay.js.map +1 -0
- package/dist/core/ui/index.d.ts +16 -0
- package/dist/core/ui/index.d.ts.map +1 -0
- package/dist/core/ui/index.js +17 -0
- package/dist/core/ui/index.js.map +1 -0
- package/dist/core/ui/utils.d.ts +28 -0
- package/dist/core/ui/utils.d.ts.map +1 -0
- package/dist/core/ui/utils.js +76 -0
- package/dist/core/ui/utils.js.map +1 -0
- package/dist/entrypoints/cli.d.ts +5 -0
- package/dist/entrypoints/cli.d.ts.map +1 -0
- package/dist/entrypoints/cli.js +199 -0
- package/dist/entrypoints/cli.js.map +1 -0
- package/dist/entrypoints/index.d.ts +18 -0
- package/dist/entrypoints/index.d.ts.map +1 -0
- package/dist/entrypoints/index.js +21 -0
- package/dist/entrypoints/index.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/services/ai/adapters/anthropic.d.ts +15 -0
- package/dist/services/ai/adapters/anthropic.d.ts.map +1 -0
- package/dist/services/ai/adapters/anthropic.js +83 -0
- package/dist/services/ai/adapters/anthropic.js.map +1 -0
- package/dist/services/ai/adapters/base.d.ts +47 -0
- package/dist/services/ai/adapters/base.d.ts.map +1 -0
- package/dist/services/ai/adapters/base.js +24 -0
- package/dist/services/ai/adapters/base.js.map +1 -0
- package/dist/services/ai/adapters/factory.d.ts +17 -0
- package/dist/services/ai/adapters/factory.d.ts.map +1 -0
- package/dist/services/ai/adapters/factory.js +34 -0
- package/dist/services/ai/adapters/factory.js.map +1 -0
- package/dist/services/ai/adapters/gemini.d.ts +16 -0
- package/dist/services/ai/adapters/gemini.d.ts.map +1 -0
- package/dist/services/ai/adapters/gemini.js +164 -0
- package/dist/services/ai/adapters/gemini.js.map +1 -0
- package/dist/services/ai/adapters/openai.d.ts +15 -0
- package/dist/services/ai/adapters/openai.d.ts.map +1 -0
- package/dist/services/ai/adapters/openai.js +175 -0
- package/dist/services/ai/adapters/openai.js.map +1 -0
- package/dist/services/ai/index.d.ts +10 -0
- package/dist/services/ai/index.d.ts.map +1 -0
- package/dist/services/ai/index.js +11 -0
- package/dist/services/ai/index.js.map +1 -0
- package/dist/services/config/Config.d.ts +41 -0
- package/dist/services/config/Config.d.ts.map +1 -0
- package/dist/services/config/Config.js +131 -0
- package/dist/services/config/Config.js.map +1 -0
- package/dist/services/config/configStore.d.ts +42 -0
- package/dist/services/config/configStore.d.ts.map +1 -0
- package/dist/services/config/configStore.js +77 -0
- package/dist/services/config/configStore.js.map +1 -0
- package/dist/services/config/index.d.ts +7 -0
- package/dist/services/config/index.d.ts.map +1 -0
- package/dist/services/config/index.js +6 -0
- package/dist/services/config/index.js.map +1 -0
- package/dist/services/config/setup.d.ts +13 -0
- package/dist/services/config/setup.d.ts.map +1 -0
- package/dist/services/config/setup.js +157 -0
- package/dist/services/config/setup.js.map +1 -0
- package/dist/services/config/types.d.ts +56 -0
- package/dist/services/config/types.d.ts.map +1 -0
- package/dist/services/config/types.js +32 -0
- package/dist/services/config/types.js.map +1 -0
- package/dist/services/customCommands.d.ts +37 -0
- package/dist/services/customCommands.d.ts.map +1 -0
- package/dist/services/customCommands.js +453 -0
- package/dist/services/customCommands.js.map +1 -0
- package/dist/services/index.d.ts +7 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +10 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/skillMarketplace.d.ts +74 -0
- package/dist/services/skillMarketplace.d.ts.map +1 -0
- package/dist/services/skillMarketplace.js +486 -0
- package/dist/services/skillMarketplace.js.map +1 -0
- package/dist/services/system/index.d.ts +6 -0
- package/dist/services/system/index.d.ts.map +1 -0
- package/dist/services/system/index.js +6 -0
- package/dist/services/system/index.js.map +1 -0
- package/dist/services/system/security.d.ts +30 -0
- package/dist/services/system/security.d.ts.map +1 -0
- package/dist/services/system/security.js +124 -0
- package/dist/services/system/security.js.map +1 -0
- package/dist/tools/agent/index.d.ts +6 -0
- package/dist/tools/agent/index.d.ts.map +1 -0
- package/dist/tools/agent/index.js +6 -0
- package/dist/tools/agent/index.js.map +1 -0
- package/dist/tools/agent/planMode.d.ts +12 -0
- package/dist/tools/agent/planMode.d.ts.map +1 -0
- package/dist/tools/agent/planMode.js +23 -0
- package/dist/tools/agent/planMode.js.map +1 -0
- package/dist/tools/agent/task.d.ts +10 -0
- package/dist/tools/agent/task.d.ts.map +1 -0
- package/dist/tools/agent/task.js +127 -0
- package/dist/tools/agent/task.js.map +1 -0
- package/dist/tools/ai/index.d.ts +5 -0
- package/dist/tools/ai/index.d.ts.map +1 -0
- package/dist/tools/ai/index.js +5 -0
- package/dist/tools/ai/index.js.map +1 -0
- package/dist/tools/ai/skill.d.ts +78 -0
- package/dist/tools/ai/skill.d.ts.map +1 -0
- package/dist/tools/ai/skill.js +315 -0
- package/dist/tools/ai/skill.js.map +1 -0
- package/dist/tools/askQuestion.d.ts +25 -0
- package/dist/tools/askQuestion.d.ts.map +1 -0
- package/dist/tools/askQuestion.js +99 -0
- package/dist/tools/askQuestion.js.map +1 -0
- package/dist/tools/bash.d.ts +11 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +58 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/definitions.d.ts +26 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +599 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/dispatcher.d.ts +38 -0
- package/dist/tools/dispatcher.d.ts.map +1 -0
- package/dist/tools/dispatcher.js +75 -0
- package/dist/tools/dispatcher.js.map +1 -0
- package/dist/tools/fileOps.d.ts +16 -0
- package/dist/tools/fileOps.d.ts.map +1 -0
- package/dist/tools/fileOps.js +115 -0
- package/dist/tools/fileOps.js.map +1 -0
- package/dist/tools/filesystem/bash.d.ts +11 -0
- package/dist/tools/filesystem/bash.d.ts.map +1 -0
- package/dist/tools/filesystem/bash.js +58 -0
- package/dist/tools/filesystem/bash.js.map +1 -0
- package/dist/tools/filesystem/fileOps.d.ts +16 -0
- package/dist/tools/filesystem/fileOps.d.ts.map +1 -0
- package/dist/tools/filesystem/fileOps.js +115 -0
- package/dist/tools/filesystem/fileOps.js.map +1 -0
- package/dist/tools/filesystem/index.d.ts +1 -0
- package/dist/tools/filesystem/index.d.ts.map +1 -0
- package/dist/tools/filesystem/index.js +2 -0
- package/dist/tools/filesystem/index.js.map +1 -0
- package/dist/tools/glob.d.ts +18 -0
- package/dist/tools/glob.d.ts.map +1 -0
- package/dist/tools/glob.js +63 -0
- package/dist/tools/glob.js.map +1 -0
- package/dist/tools/grep.d.ts +26 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +137 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/index.d.ts +13 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +14 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/interaction/askQuestion.d.ts +25 -0
- package/dist/tools/interaction/askQuestion.d.ts.map +1 -0
- package/dist/tools/interaction/askQuestion.js +99 -0
- package/dist/tools/interaction/askQuestion.js.map +1 -0
- package/dist/tools/interaction/index.d.ts +6 -0
- package/dist/tools/interaction/index.d.ts.map +1 -0
- package/dist/tools/interaction/index.js +6 -0
- package/dist/tools/interaction/index.js.map +1 -0
- package/dist/tools/interaction/todo.d.ts +36 -0
- package/dist/tools/interaction/todo.d.ts.map +1 -0
- package/dist/tools/interaction/todo.js +137 -0
- package/dist/tools/interaction/todo.js.map +1 -0
- package/dist/tools/network/index.d.ts +6 -0
- package/dist/tools/network/index.d.ts.map +1 -0
- package/dist/tools/network/index.js +6 -0
- package/dist/tools/network/index.js.map +1 -0
- package/dist/tools/network/webFetch.d.ts +8 -0
- package/dist/tools/network/webFetch.d.ts.map +1 -0
- package/dist/tools/network/webFetch.js +87 -0
- package/dist/tools/network/webFetch.js.map +1 -0
- package/dist/tools/network/webSearch.d.ts +8 -0
- package/dist/tools/network/webSearch.d.ts.map +1 -0
- package/dist/tools/network/webSearch.js +84 -0
- package/dist/tools/network/webSearch.js.map +1 -0
- package/dist/tools/planMode.d.ts +12 -0
- package/dist/tools/planMode.d.ts.map +1 -0
- package/dist/tools/planMode.js +23 -0
- package/dist/tools/planMode.js.map +1 -0
- package/dist/tools/search/glob.d.ts +18 -0
- package/dist/tools/search/glob.d.ts.map +1 -0
- package/dist/tools/search/glob.js +63 -0
- package/dist/tools/search/glob.js.map +1 -0
- package/dist/tools/search/grep.d.ts +26 -0
- package/dist/tools/search/grep.d.ts.map +1 -0
- package/dist/tools/search/grep.js +137 -0
- package/dist/tools/search/grep.js.map +1 -0
- package/dist/tools/search/index.d.ts +6 -0
- package/dist/tools/search/index.d.ts.map +1 -0
- package/dist/tools/search/index.js +6 -0
- package/dist/tools/search/index.js.map +1 -0
- package/dist/tools/skill.d.ts +41 -0
- package/dist/tools/skill.d.ts.map +1 -0
- package/dist/tools/skill.js +149 -0
- package/dist/tools/skill.js.map +1 -0
- package/dist/tools/system/index.d.ts +6 -0
- package/dist/tools/system/index.d.ts.map +1 -0
- package/dist/tools/system/index.js +6 -0
- package/dist/tools/system/index.js.map +1 -0
- package/dist/tools/task.d.ts +10 -0
- package/dist/tools/task.d.ts.map +1 -0
- package/dist/tools/task.js +127 -0
- package/dist/tools/task.js.map +1 -0
- package/dist/tools/todo.d.ts +36 -0
- package/dist/tools/todo.d.ts.map +1 -0
- package/dist/tools/todo.js +137 -0
- package/dist/tools/todo.js.map +1 -0
- package/dist/tools/types.d.ts +139 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +5 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/webFetch.d.ts +8 -0
- package/dist/tools/webFetch.d.ts.map +1 -0
- package/dist/tools/webFetch.js +87 -0
- package/dist/tools/webFetch.js.map +1 -0
- package/dist/tools/webSearch.d.ts +8 -0
- package/dist/tools/webSearch.d.ts.map +1 -0
- package/dist/tools/webSearch.js +84 -0
- package/dist/tools/webSearch.js.map +1 -0
- package/dist/ui/Banner.d.ts +47 -0
- package/dist/ui/Banner.d.ts.map +1 -0
- package/dist/ui/Banner.js +122 -0
- package/dist/ui/Banner.js.map +1 -0
- package/dist/ui/Input.d.ts +42 -0
- package/dist/ui/Input.d.ts.map +1 -0
- package/dist/ui/Input.js +270 -0
- package/dist/ui/Input.js.map +1 -0
- package/dist/ui/Logo.d.ts +21 -0
- package/dist/ui/Logo.d.ts.map +1 -0
- package/dist/ui/Logo.js +31 -0
- package/dist/ui/Logo.js.map +1 -0
- package/dist/ui/Messages.d.ts +45 -0
- package/dist/ui/Messages.d.ts.map +1 -0
- package/dist/ui/Messages.js +76 -0
- package/dist/ui/Messages.js.map +1 -0
- package/dist/ui/Spinner.d.ts +29 -0
- package/dist/ui/Spinner.d.ts.map +1 -0
- package/dist/ui/Spinner.js +64 -0
- package/dist/ui/Spinner.js.map +1 -0
- package/dist/ui/ToolDisplay.d.ts +49 -0
- package/dist/ui/ToolDisplay.d.ts.map +1 -0
- package/dist/ui/ToolDisplay.js +99 -0
- package/dist/ui/ToolDisplay.js.map +1 -0
- package/dist/ui/components/Banner.d.ts +46 -0
- package/dist/ui/components/Banner.d.ts.map +1 -0
- package/dist/ui/components/Banner.js +121 -0
- package/dist/ui/components/Banner.js.map +1 -0
- package/dist/ui/components/Input.d.ts +51 -0
- package/dist/ui/components/Input.d.ts.map +1 -0
- package/dist/ui/components/Input.js +322 -0
- package/dist/ui/components/Input.js.map +1 -0
- package/dist/ui/components/Logo.d.ts +21 -0
- package/dist/ui/components/Logo.d.ts.map +1 -0
- package/dist/ui/components/Logo.js +31 -0
- package/dist/ui/components/Logo.js.map +1 -0
- package/dist/ui/components/Messages.d.ts +45 -0
- package/dist/ui/components/Messages.d.ts.map +1 -0
- package/dist/ui/components/Messages.js +76 -0
- package/dist/ui/components/Messages.js.map +1 -0
- package/dist/ui/components/Spinner.d.ts +29 -0
- package/dist/ui/components/Spinner.d.ts.map +1 -0
- package/dist/ui/components/Spinner.js +64 -0
- package/dist/ui/components/Spinner.js.map +1 -0
- package/dist/ui/components/ToolDisplay.d.ts +49 -0
- package/dist/ui/components/ToolDisplay.d.ts.map +1 -0
- package/dist/ui/components/ToolDisplay.js +99 -0
- package/dist/ui/components/ToolDisplay.js.map +1 -0
- package/dist/ui/index.d.ts +16 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +17 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/theme.d.ts +34 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +55 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/ui/utils.d.ts +28 -0
- package/dist/ui/utils.d.ts.map +1 -0
- package/dist/ui/utils.js +76 -0
- package/dist/ui/utils.js.map +1 -0
- package/dist/utils/fs/index.d.ts +24 -0
- package/dist/utils/fs/index.d.ts.map +1 -0
- package/dist/utils/fs/index.js +50 -0
- package/dist/utils/fs/index.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +10 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/security.d.ts +26 -0
- package/dist/utils/security.d.ts.map +1 -0
- package/dist/utils/security.js +123 -0
- package/dist/utils/security.js.map +1 -0
- package/dist/utils/text/index.d.ts +28 -0
- package/dist/utils/text/index.d.ts.map +1 -0
- package/dist/utils/text/index.js +51 -0
- package/dist/utils/text/index.js.map +1 -0
- package/package.json +84 -0
- package/skills/web-dev/SKILL.md +91 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 工具分发器 - 路由工具调用到具体实现
|
|
3
|
+
*/
|
|
4
|
+
import { runBash } from './filesystem/bash.js';
|
|
5
|
+
import { runRead, runWrite, runEdit } from './filesystem/fileOps.js';
|
|
6
|
+
import { runGlob } from './search/glob.js';
|
|
7
|
+
import { runGrep } from './search/grep.js';
|
|
8
|
+
import { runAskUserQuestion } from './interaction/askQuestion.js';
|
|
9
|
+
import { runTodoWrite } from './interaction/todo.js';
|
|
10
|
+
import { runSkillLegacy } from './ai/skill.js';
|
|
11
|
+
import { runTask } from './agent/task.js';
|
|
12
|
+
import { runEnterPlanMode, runExitPlanMode } from './agent/planMode.js';
|
|
13
|
+
import { runWebFetch } from './network/webFetch.js';
|
|
14
|
+
import { runWebSearch } from './network/webSearch.js';
|
|
15
|
+
/**
|
|
16
|
+
* 创建工具执行函数
|
|
17
|
+
*/
|
|
18
|
+
export function createExecuteTool(config) {
|
|
19
|
+
const { workdir, skillLoader, adapter, systemPrompt, tools, agentType } = config;
|
|
20
|
+
return async (toolName, input) => {
|
|
21
|
+
try {
|
|
22
|
+
switch (toolName) {
|
|
23
|
+
case 'bash':
|
|
24
|
+
// explore 代理使用只读模式
|
|
25
|
+
const readOnly = agentType === 'explore';
|
|
26
|
+
return await runBash(workdir, input.command, readOnly);
|
|
27
|
+
case 'read_file':
|
|
28
|
+
return await runRead(workdir, input.path, input.limit);
|
|
29
|
+
case 'write_file':
|
|
30
|
+
return await runWrite(workdir, input.path, input.content);
|
|
31
|
+
case 'edit_file':
|
|
32
|
+
return await runEdit(workdir, input.path, input.old_text, input.new_text);
|
|
33
|
+
case 'Glob':
|
|
34
|
+
return await runGlob(workdir, input.pattern, input.path, input.ignore, input.maxResults);
|
|
35
|
+
case 'Grep':
|
|
36
|
+
return await runGrep(workdir, input.pattern, input.path, input.glob, input.outputMode, input.caseInsensitive, input.contextBefore, input.contextAfter, input.maxResults);
|
|
37
|
+
case 'AskUserQuestion':
|
|
38
|
+
return await runAskUserQuestion(input.questions);
|
|
39
|
+
case 'TodoWrite':
|
|
40
|
+
return await runTodoWrite(input.todos);
|
|
41
|
+
case 'Skill':
|
|
42
|
+
return await runSkillLegacy(skillLoader, input.skill);
|
|
43
|
+
case 'EnterPlanMode':
|
|
44
|
+
return await runEnterPlanMode(input.taskDescription, workdir);
|
|
45
|
+
case 'ExitPlanMode':
|
|
46
|
+
return await runExitPlanMode(workdir);
|
|
47
|
+
case 'WebFetch':
|
|
48
|
+
return await runWebFetch(input.url, input.timeout, input.maxLength);
|
|
49
|
+
case 'WebSearch':
|
|
50
|
+
return await runWebSearch(input.query, input.maxResults, input.timeout);
|
|
51
|
+
case 'Task':
|
|
52
|
+
// Task 工具需要额外的依赖,在第四阶段实现后传入
|
|
53
|
+
if (!adapter || !systemPrompt || !tools) {
|
|
54
|
+
return '错误: Task 工具需要完整的代理上下文(将在第四阶段实现)';
|
|
55
|
+
}
|
|
56
|
+
return await runTask(input.description, input.prompt, input.agent_type, workdir, adapter, systemPrompt, tools,
|
|
57
|
+
// 递归传入 executeTool(子代理也可以调用工具)
|
|
58
|
+
createExecuteTool(config));
|
|
59
|
+
default:
|
|
60
|
+
return `错误: 未知工具 "${toolName}"`;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
if (error instanceof Error) {
|
|
65
|
+
return `工具执行错误: ${error.message}`;
|
|
66
|
+
}
|
|
67
|
+
return `工具执行错误: ${String(error)}`;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* 导出所有工具函数(用于测试)
|
|
73
|
+
*/
|
|
74
|
+
export { runBash, runRead, runWrite, runEdit, runGlob, runGrep, runAskUserQuestion, runTodoWrite, runSkillLegacy, runTask, runEnterPlanMode, runExitPlanMode, runWebFetch, runWebSearch };
|
|
75
|
+
//# sourceMappingURL=dispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../src/tools/dispatcher.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAiBtD;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAA0B;IAC1D,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IAEjF,OAAO,KAAK,EAAE,QAAgB,EAAE,KAA8B,EAAmB,EAAE;QACjF,IAAI,CAAC;YACH,QAAQ,QAAQ,EAAE,CAAC;gBACjB,KAAK,MAAM;oBACT,mBAAmB;oBACnB,MAAM,QAAQ,GAAG,SAAS,KAAK,SAAS,CAAC;oBACzC,OAAO,MAAM,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,OAAiB,EAAE,QAAQ,CAAC,CAAC;gBAGnE,KAAK,WAAW;oBACd,OAAO,MAAM,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,IAAc,EAAE,KAAK,CAAC,KAA2B,CAAC,CAAC;gBAEzF,KAAK,YAAY;oBACf,OAAO,MAAM,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,IAAc,EAAE,KAAK,CAAC,OAAiB,CAAC,CAAC;gBAEhF,KAAK,WAAW;oBACd,OAAO,MAAM,OAAO,CAClB,OAAO,EACP,KAAK,CAAC,IAAc,EACpB,KAAK,CAAC,QAAkB,EACxB,KAAK,CAAC,QAAkB,CACzB,CAAC;gBAEJ,KAAK,MAAM;oBACT,OAAO,MAAM,OAAO,CAClB,OAAO,EACP,KAAK,CAAC,OAAiB,EACvB,KAAK,CAAC,IAA0B,EAChC,KAAK,CAAC,MAA8B,EACpC,KAAK,CAAC,UAAgC,CACvC,CAAC;gBAEJ,KAAK,MAAM;oBACT,OAAO,MAAM,OAAO,CAClB,OAAO,EACP,KAAK,CAAC,OAAiB,EACvB,KAAK,CAAC,IAA0B,EAChC,KAAK,CAAC,IAA0B,EAChC,KAAK,CAAC,UAAiB,EACvB,KAAK,CAAC,eAAsC,EAC5C,KAAK,CAAC,aAAmC,EACzC,KAAK,CAAC,YAAkC,EACxC,KAAK,CAAC,UAAgC,CACvC,CAAC;gBAEJ,KAAK,iBAAiB;oBACpB,OAAO,MAAM,kBAAkB,CAAC,KAAK,CAAC,SAAkB,CAAC,CAAC;gBAE5D,KAAK,WAAW;oBACd,OAAO,MAAM,YAAY,CAAC,KAAK,CAAC,KAAc,CAAC,CAAC;gBAElD,KAAK,OAAO;oBACV,OAAO,MAAM,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,KAAe,CAAC,CAAC;gBAElE,KAAK,eAAe;oBAClB,OAAO,MAAM,gBAAgB,CAAC,KAAK,CAAC,eAAyB,EAAE,OAAO,CAAC,CAAC;gBAE1E,KAAK,cAAc;oBACjB,OAAO,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;gBAExC,KAAK,UAAU;oBACb,OAAO,MAAM,WAAW,CACtB,KAAK,CAAC,GAAa,EACnB,KAAK,CAAC,OAA6B,EACnC,KAAK,CAAC,SAA+B,CACtC,CAAC;gBAEJ,KAAK,WAAW;oBACd,OAAO,MAAM,YAAY,CACvB,KAAK,CAAC,KAAe,EACrB,KAAK,CAAC,UAAgC,EACtC,KAAK,CAAC,OAA6B,CACpC,CAAC;gBAEJ,KAAK,MAAM;oBACT,4BAA4B;oBAC5B,IAAI,CAAC,OAAO,IAAI,CAAC,YAAY,IAAI,CAAC,KAAK,EAAE,CAAC;wBACxC,OAAO,iCAAiC,CAAC;oBAC3C,CAAC;oBAED,OAAO,MAAM,OAAO,CAClB,KAAK,CAAC,WAAqB,EAC3B,KAAK,CAAC,MAAgB,EACtB,KAAK,CAAC,UAAuB,EAC7B,OAAO,EACP,OAAO,EACP,YAAY,EACZ,KAAK;oBACL,+BAA+B;oBAC/B,iBAAiB,CAAC,MAAM,CAAC,CAC1B,CAAC;gBAEJ;oBACE,OAAO,aAAa,QAAQ,GAAG,CAAC;YACpC,CAAC;QACH,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,OAAO,WAAW,KAAK,CAAC,OAAO,EAAE,CAAC;YACpC,CAAC;YACD,OAAO,WAAW,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,OAAO,EACL,OAAO,EACP,OAAO,EACP,QAAQ,EACR,OAAO,EACP,OAAO,EACP,OAAO,EACP,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,OAAO,EACP,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,YAAY,EACb,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 文件操作工具 - read_file, write_file, edit_file
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* 读取文件
|
|
6
|
+
*/
|
|
7
|
+
export declare function runRead(workdir: string, filePath: string, limit?: number): Promise<string>;
|
|
8
|
+
/**
|
|
9
|
+
* 写入文件
|
|
10
|
+
*/
|
|
11
|
+
export declare function runWrite(workdir: string, filePath: string, content: string): Promise<string>;
|
|
12
|
+
/**
|
|
13
|
+
* 编辑文件
|
|
14
|
+
*/
|
|
15
|
+
export declare function runEdit(workdir: string, filePath: string, oldText: string, newText: string): Promise<string>;
|
|
16
|
+
//# sourceMappingURL=fileOps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileOps.d.ts","sourceRoot":"","sources":["../../src/tools/fileOps.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH;;GAEG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CA+CjB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAsBjB;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CA6CjB"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 文件操作工具 - read_file, write_file, edit_file
|
|
3
|
+
*/
|
|
4
|
+
import fs from 'fs-extra';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { safePath, truncateOutput } from '../utils/security.js';
|
|
7
|
+
const MAX_FILE_SIZE = 50 * 1024; // 50KB 限制(用于读取)
|
|
8
|
+
/**
|
|
9
|
+
* 读取文件
|
|
10
|
+
*/
|
|
11
|
+
export async function runRead(workdir, filePath, limit) {
|
|
12
|
+
try {
|
|
13
|
+
// 安全路径检查
|
|
14
|
+
const fullPath = safePath(workdir, filePath);
|
|
15
|
+
// 检查文件是否存在
|
|
16
|
+
if (!(await fs.pathExists(fullPath))) {
|
|
17
|
+
return `错误: 文件不存在: ${filePath}`;
|
|
18
|
+
}
|
|
19
|
+
// 检查是否为目录
|
|
20
|
+
const stats = await fs.stat(fullPath);
|
|
21
|
+
if (stats.isDirectory()) {
|
|
22
|
+
return `错误: ${filePath} 是一个目录,请使用 bash ls 命令查看目录内容`;
|
|
23
|
+
}
|
|
24
|
+
// 读取文件内容
|
|
25
|
+
const content = await fs.readFile(fullPath, 'utf-8');
|
|
26
|
+
// 按行分割
|
|
27
|
+
const lines = content.split('\n');
|
|
28
|
+
// 如果指定了行数限制
|
|
29
|
+
if (limit && limit > 0) {
|
|
30
|
+
const limitedLines = lines.slice(0, limit);
|
|
31
|
+
const result = limitedLines
|
|
32
|
+
.map((line, index) => `${index + 1}→${line}`)
|
|
33
|
+
.join('\n');
|
|
34
|
+
if (lines.length > limit) {
|
|
35
|
+
return `${result}\n\n[显示前 ${limit} 行,共 ${lines.length} 行]`;
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
// 完整内容(带行号)
|
|
40
|
+
const numbered = lines.map((line, index) => `${index + 1}→${line}`).join('\n');
|
|
41
|
+
// 截断过大的文件
|
|
42
|
+
return truncateOutput(numbered, MAX_FILE_SIZE);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (error instanceof Error) {
|
|
46
|
+
return `错误: ${error.message}`;
|
|
47
|
+
}
|
|
48
|
+
return `错误: ${String(error)}`;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 写入文件
|
|
53
|
+
*/
|
|
54
|
+
export async function runWrite(workdir, filePath, content) {
|
|
55
|
+
try {
|
|
56
|
+
// 安全路径检查
|
|
57
|
+
const fullPath = safePath(workdir, filePath);
|
|
58
|
+
// 确保父目录存在
|
|
59
|
+
await fs.ensureDir(path.dirname(fullPath));
|
|
60
|
+
// 写入文件
|
|
61
|
+
await fs.writeFile(fullPath, content, 'utf-8');
|
|
62
|
+
// 获取文件大小
|
|
63
|
+
const stats = await fs.stat(fullPath);
|
|
64
|
+
const sizeKB = (stats.size / 1024).toFixed(2);
|
|
65
|
+
return `成功写入文件: ${filePath} (${sizeKB} KB, ${content.split('\n').length} 行)`;
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
if (error instanceof Error) {
|
|
69
|
+
return `错误: ${error.message}`;
|
|
70
|
+
}
|
|
71
|
+
return `错误: ${String(error)}`;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 编辑文件
|
|
76
|
+
*/
|
|
77
|
+
export async function runEdit(workdir, filePath, oldText, newText) {
|
|
78
|
+
try {
|
|
79
|
+
// 安全路径检查
|
|
80
|
+
const fullPath = safePath(workdir, filePath);
|
|
81
|
+
// 检查文件是否存在
|
|
82
|
+
if (!(await fs.pathExists(fullPath))) {
|
|
83
|
+
return `错误: 文件不存在: ${filePath}`;
|
|
84
|
+
}
|
|
85
|
+
// 读取文件内容
|
|
86
|
+
const content = await fs.readFile(fullPath, 'utf-8');
|
|
87
|
+
// 检查 old_text 是否存在
|
|
88
|
+
if (!content.includes(oldText)) {
|
|
89
|
+
return `错误: 在文件中未找到要替换的文本。请确保 old_text 精确匹配。\n文件前100字符: ${content.slice(0, 100)}...`;
|
|
90
|
+
}
|
|
91
|
+
// 计算匹配次数
|
|
92
|
+
const matches = content.split(oldText).length - 1;
|
|
93
|
+
if (matches > 1) {
|
|
94
|
+
return `错误: old_text 在文件中出现 ${matches} 次。请提供更具体的文本以确保唯一匹配。`;
|
|
95
|
+
}
|
|
96
|
+
// 替换文本
|
|
97
|
+
const newContent = content.replace(oldText, newText);
|
|
98
|
+
// 写回文件
|
|
99
|
+
await fs.writeFile(fullPath, newContent, 'utf-8');
|
|
100
|
+
// 计算变化
|
|
101
|
+
const oldLines = oldText.split('\n').length;
|
|
102
|
+
const newLines = newText.split('\n').length;
|
|
103
|
+
const lineDiff = newLines - oldLines;
|
|
104
|
+
return `成功编辑文件: ${filePath}
|
|
105
|
+
替换了 ${oldLines} 行,新增 ${lineDiff > 0 ? '+' : ''}${lineDiff} 行
|
|
106
|
+
文件现在共 ${newContent.split('\n').length} 行`;
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
if (error instanceof Error) {
|
|
110
|
+
return `错误: ${error.message}`;
|
|
111
|
+
}
|
|
112
|
+
return `错误: ${String(error)}`;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=fileOps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileOps.js","sourceRoot":"","sources":["../../src/tools/fileOps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bash 命令执行工具
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* 执行 bash 命令
|
|
6
|
+
* @param workdir 工作目录
|
|
7
|
+
* @param command 要执行的命令
|
|
8
|
+
* @param readOnly 是否为只读模式(用于 explore 代理)
|
|
9
|
+
*/
|
|
10
|
+
export declare function runBash(workdir: string, command: string, readOnly?: boolean): Promise<string>;
|
|
11
|
+
//# sourceMappingURL=bash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../../src/tools/filesystem/bash.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,OAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAoD1G"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bash 命令执行工具
|
|
3
|
+
*/
|
|
4
|
+
import { execa } from 'execa';
|
|
5
|
+
import { validateBashCommand, validateReadOnlyCommand, truncateOutput } from '../../services/system/security.js';
|
|
6
|
+
const BASH_TIMEOUT = 60000; // 60 秒
|
|
7
|
+
const MAX_OUTPUT_SIZE = 50 * 1024 * 1024; // 50MB
|
|
8
|
+
/**
|
|
9
|
+
* 执行 bash 命令
|
|
10
|
+
* @param workdir 工作目录
|
|
11
|
+
* @param command 要执行的命令
|
|
12
|
+
* @param readOnly 是否为只读模式(用于 explore 代理)
|
|
13
|
+
*/
|
|
14
|
+
export async function runBash(workdir, command, readOnly = false) {
|
|
15
|
+
try {
|
|
16
|
+
// 基本安全检查
|
|
17
|
+
validateBashCommand(command);
|
|
18
|
+
// 如果是只读模式,额外检查
|
|
19
|
+
if (readOnly) {
|
|
20
|
+
validateReadOnlyCommand(command);
|
|
21
|
+
}
|
|
22
|
+
// 执行命令
|
|
23
|
+
const result = await execa('bash', ['-c', command], {
|
|
24
|
+
cwd: workdir,
|
|
25
|
+
timeout: BASH_TIMEOUT,
|
|
26
|
+
maxBuffer: MAX_OUTPUT_SIZE,
|
|
27
|
+
reject: false, // 不抛出异常,而是返回结果
|
|
28
|
+
all: true, // 合并 stdout 和 stderr
|
|
29
|
+
});
|
|
30
|
+
// 获取输出
|
|
31
|
+
const output = result.all || '';
|
|
32
|
+
// 检查是否有输出
|
|
33
|
+
if (!output.trim()) {
|
|
34
|
+
return `命令执行成功(无输出)\n退出码: ${result.exitCode}`;
|
|
35
|
+
}
|
|
36
|
+
// 截断过长的输出
|
|
37
|
+
const truncated = truncateOutput(output, MAX_OUTPUT_SIZE);
|
|
38
|
+
// 添加退出码信息
|
|
39
|
+
if (result.exitCode !== 0) {
|
|
40
|
+
return `${truncated}\n\n退出码: ${result.exitCode} (命令执行失败)`;
|
|
41
|
+
}
|
|
42
|
+
return truncated;
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
// 处理各种错误
|
|
46
|
+
if (error instanceof Error) {
|
|
47
|
+
if (error.message.includes('timed out')) {
|
|
48
|
+
return `错误: 命令超时(${BASH_TIMEOUT / 1000}秒限制)`;
|
|
49
|
+
}
|
|
50
|
+
if (error.message.includes('ENOENT')) {
|
|
51
|
+
return '错误: bash 命令不可用。请确保系统已安装 bash。';
|
|
52
|
+
}
|
|
53
|
+
return `错误: ${error.message}`;
|
|
54
|
+
}
|
|
55
|
+
return `错误: ${String(error)}`;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=bash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../../src/tools/filesystem/bash.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAEjH,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,OAAO;AACnC,MAAM,eAAe,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO;AAEjD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe,EAAE,OAAe,EAAE,WAAoB,KAAK;IACvF,IAAI,CAAC;QACH,SAAS;QACT,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAE7B,eAAe;QACf,IAAI,QAAQ,EAAE,CAAC;YACb,uBAAuB,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;QAED,OAAO;QACP,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE;YAClD,GAAG,EAAE,OAAO;YACZ,OAAO,EAAE,YAAY;YACrB,SAAS,EAAE,eAAe;YAC1B,MAAM,EAAE,KAAK,EAAE,eAAe;YAC9B,GAAG,EAAE,IAAI,EAAE,qBAAqB;SACjC,CAAC,CAAC;QAEH,OAAO;QACP,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;QAEhC,UAAU;QACV,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACnB,OAAO,qBAAqB,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChD,CAAC;QAED,UAAU;QACV,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QAE1D,UAAU;QACV,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,GAAG,SAAS,YAAY,MAAM,CAAC,QAAQ,WAAW,CAAC;QAC5D,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,SAAS;QACT,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBACxC,OAAO,YAAY,YAAY,GAAG,IAAI,MAAM,CAAC;YAC/C,CAAC;YAED,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrC,OAAO,+BAA+B,CAAC;YACzC,CAAC;YAED,OAAO,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;QAChC,CAAC;QAED,OAAO,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAChC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 文件操作工具 - read_file, write_file, edit_file
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* 读取文件
|
|
6
|
+
*/
|
|
7
|
+
export declare function runRead(workdir: string, filePath: string, limit?: number): Promise<string>;
|
|
8
|
+
/**
|
|
9
|
+
* 写入文件
|
|
10
|
+
*/
|
|
11
|
+
export declare function runWrite(workdir: string, filePath: string, content: string): Promise<string>;
|
|
12
|
+
/**
|
|
13
|
+
* 编辑文件
|
|
14
|
+
*/
|
|
15
|
+
export declare function runEdit(workdir: string, filePath: string, oldText: string, newText: string): Promise<string>;
|
|
16
|
+
//# sourceMappingURL=fileOps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileOps.d.ts","sourceRoot":"","sources":["../../../src/tools/filesystem/fileOps.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH;;GAEG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CA+CjB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAsBjB;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CA6CjB"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 文件操作工具 - read_file, write_file, edit_file
|
|
3
|
+
*/
|
|
4
|
+
import fs from 'fs-extra';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { safePath, truncateOutput } from '../../services/system/security.js';
|
|
7
|
+
const MAX_FILE_SIZE = 50 * 1024; // 50KB 限制(用于读取)
|
|
8
|
+
/**
|
|
9
|
+
* 读取文件
|
|
10
|
+
*/
|
|
11
|
+
export async function runRead(workdir, filePath, limit) {
|
|
12
|
+
try {
|
|
13
|
+
// 安全路径检查
|
|
14
|
+
const fullPath = safePath(workdir, filePath);
|
|
15
|
+
// 检查文件是否存在
|
|
16
|
+
if (!(await fs.pathExists(fullPath))) {
|
|
17
|
+
return `错误: 文件不存在: ${filePath}`;
|
|
18
|
+
}
|
|
19
|
+
// 检查是否为目录
|
|
20
|
+
const stats = await fs.stat(fullPath);
|
|
21
|
+
if (stats.isDirectory()) {
|
|
22
|
+
return `错误: ${filePath} 是一个目录,请使用 bash ls 命令查看目录内容`;
|
|
23
|
+
}
|
|
24
|
+
// 读取文件内容
|
|
25
|
+
const content = await fs.readFile(fullPath, 'utf-8');
|
|
26
|
+
// 按行分割
|
|
27
|
+
const lines = content.split('\n');
|
|
28
|
+
// 如果指定了行数限制
|
|
29
|
+
if (limit && limit > 0) {
|
|
30
|
+
const limitedLines = lines.slice(0, limit);
|
|
31
|
+
const result = limitedLines
|
|
32
|
+
.map((line, index) => `${index + 1}→${line}`)
|
|
33
|
+
.join('\n');
|
|
34
|
+
if (lines.length > limit) {
|
|
35
|
+
return `${result}\n\n[显示前 ${limit} 行,共 ${lines.length} 行]`;
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
// 完整内容(带行号)
|
|
40
|
+
const numbered = lines.map((line, index) => `${index + 1}→${line}`).join('\n');
|
|
41
|
+
// 截断过大的文件
|
|
42
|
+
return truncateOutput(numbered, MAX_FILE_SIZE);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (error instanceof Error) {
|
|
46
|
+
return `错误: ${error.message}`;
|
|
47
|
+
}
|
|
48
|
+
return `错误: ${String(error)}`;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 写入文件
|
|
53
|
+
*/
|
|
54
|
+
export async function runWrite(workdir, filePath, content) {
|
|
55
|
+
try {
|
|
56
|
+
// 安全路径检查
|
|
57
|
+
const fullPath = safePath(workdir, filePath);
|
|
58
|
+
// 确保父目录存在
|
|
59
|
+
await fs.ensureDir(path.dirname(fullPath));
|
|
60
|
+
// 写入文件
|
|
61
|
+
await fs.writeFile(fullPath, content, 'utf-8');
|
|
62
|
+
// 获取文件大小
|
|
63
|
+
const stats = await fs.stat(fullPath);
|
|
64
|
+
const sizeKB = (stats.size / 1024).toFixed(2);
|
|
65
|
+
return `成功写入文件: ${filePath} (${sizeKB} KB, ${content.split('\n').length} 行)`;
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
if (error instanceof Error) {
|
|
69
|
+
return `错误: ${error.message}`;
|
|
70
|
+
}
|
|
71
|
+
return `错误: ${String(error)}`;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 编辑文件
|
|
76
|
+
*/
|
|
77
|
+
export async function runEdit(workdir, filePath, oldText, newText) {
|
|
78
|
+
try {
|
|
79
|
+
// 安全路径检查
|
|
80
|
+
const fullPath = safePath(workdir, filePath);
|
|
81
|
+
// 检查文件是否存在
|
|
82
|
+
if (!(await fs.pathExists(fullPath))) {
|
|
83
|
+
return `错误: 文件不存在: ${filePath}`;
|
|
84
|
+
}
|
|
85
|
+
// 读取文件内容
|
|
86
|
+
const content = await fs.readFile(fullPath, 'utf-8');
|
|
87
|
+
// 检查 old_text 是否存在
|
|
88
|
+
if (!content.includes(oldText)) {
|
|
89
|
+
return `错误: 在文件中未找到要替换的文本。请确保 old_text 精确匹配。\n文件前100字符: ${content.slice(0, 100)}...`;
|
|
90
|
+
}
|
|
91
|
+
// 计算匹配次数
|
|
92
|
+
const matches = content.split(oldText).length - 1;
|
|
93
|
+
if (matches > 1) {
|
|
94
|
+
return `错误: old_text 在文件中出现 ${matches} 次。请提供更具体的文本以确保唯一匹配。`;
|
|
95
|
+
}
|
|
96
|
+
// 替换文本
|
|
97
|
+
const newContent = content.replace(oldText, newText);
|
|
98
|
+
// 写回文件
|
|
99
|
+
await fs.writeFile(fullPath, newContent, 'utf-8');
|
|
100
|
+
// 计算变化
|
|
101
|
+
const oldLines = oldText.split('\n').length;
|
|
102
|
+
const newLines = newText.split('\n').length;
|
|
103
|
+
const lineDiff = newLines - oldLines;
|
|
104
|
+
return `成功编辑文件: ${filePath}
|
|
105
|
+
替换了 ${oldLines} 行,新增 ${lineDiff > 0 ? '+' : ''}${lineDiff} 行
|
|
106
|
+
文件现在共 ${newContent.split('\n').length} 行`;
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
if (error instanceof Error) {
|
|
110
|
+
return `错误: ${error.message}`;
|
|
111
|
+
}
|
|
112
|
+
return `错误: ${String(error)}`;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=fileOps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileOps.js","sourceRoot":"","sources":["../../../src/tools/filesystem/fileOps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/filesystem/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/filesystem/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Glob 工具 - 快速文件模式匹配
|
|
3
|
+
* 使用 fast-glob 库实现高性能文件搜索
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Glob 匹配选项
|
|
7
|
+
*/
|
|
8
|
+
export interface GlobOptions {
|
|
9
|
+
pattern: string;
|
|
10
|
+
path?: string;
|
|
11
|
+
ignore?: string[];
|
|
12
|
+
maxResults?: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 执行 Glob 文件搜索
|
|
16
|
+
*/
|
|
17
|
+
export declare function runGlob(workdir: string, pattern: string, searchPath?: string, ignore?: string[], maxResults?: number): Promise<string>;
|
|
18
|
+
//# sourceMappingURL=glob.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/tools/glob.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,EAAE,EACjB,UAAU,GAAE,MAAoB,GAC/B,OAAO,CAAC,MAAM,CAAC,CA0DjB"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Glob 工具 - 快速文件模式匹配
|
|
3
|
+
* 使用 fast-glob 库实现高性能文件搜索
|
|
4
|
+
*/
|
|
5
|
+
import fg from 'fast-glob';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
const MAX_RESULTS = 10000; // 最大返回文件数
|
|
8
|
+
/**
|
|
9
|
+
* 执行 Glob 文件搜索
|
|
10
|
+
*/
|
|
11
|
+
export async function runGlob(workdir, pattern, searchPath, ignore, maxResults = MAX_RESULTS) {
|
|
12
|
+
try {
|
|
13
|
+
const cwd = searchPath ? path.resolve(workdir, searchPath) : workdir;
|
|
14
|
+
// 默认忽略模式
|
|
15
|
+
const defaultIgnore = [
|
|
16
|
+
'**/node_modules/**',
|
|
17
|
+
'**/.git/**',
|
|
18
|
+
'**/dist/**',
|
|
19
|
+
'**/build/**',
|
|
20
|
+
'**/.next/**',
|
|
21
|
+
'**/.cache/**',
|
|
22
|
+
'**/coverage/**',
|
|
23
|
+
'**/.DS_Store',
|
|
24
|
+
];
|
|
25
|
+
const ignorePatterns = ignore ? [...defaultIgnore, ...ignore] : defaultIgnore;
|
|
26
|
+
// 执行 glob 搜索
|
|
27
|
+
const files = await fg(pattern, {
|
|
28
|
+
cwd,
|
|
29
|
+
ignore: ignorePatterns,
|
|
30
|
+
absolute: false, // 返回相对路径
|
|
31
|
+
onlyFiles: true,
|
|
32
|
+
followSymbolicLinks: false,
|
|
33
|
+
stats: true, // 获取文件状态(用于排序)
|
|
34
|
+
});
|
|
35
|
+
// 按修改时间排序(最近修改的在前)
|
|
36
|
+
const sortedFiles = files
|
|
37
|
+
.sort((a, b) => {
|
|
38
|
+
const aTime = a.stats?.mtime?.getTime() || 0;
|
|
39
|
+
const bTime = b.stats?.mtime?.getTime() || 0;
|
|
40
|
+
return bTime - aTime;
|
|
41
|
+
})
|
|
42
|
+
.map((entry) => entry.path);
|
|
43
|
+
// 限制结果数量
|
|
44
|
+
const limitedFiles = sortedFiles.slice(0, maxResults);
|
|
45
|
+
if (limitedFiles.length === 0) {
|
|
46
|
+
return `未找到匹配 "${pattern}" 的文件`;
|
|
47
|
+
}
|
|
48
|
+
// 格式化输出
|
|
49
|
+
let result = `找到 ${limitedFiles.length} 个匹配文件`;
|
|
50
|
+
if (sortedFiles.length > maxResults) {
|
|
51
|
+
result += ` (显示前 ${maxResults} 个,共 ${sortedFiles.length} 个)`;
|
|
52
|
+
}
|
|
53
|
+
result += `:\n\n${limitedFiles.join('\n')}`;
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (error instanceof Error) {
|
|
58
|
+
return `Glob 错误: ${error.message}`;
|
|
59
|
+
}
|
|
60
|
+
return `Glob 错误: ${String(error)}`;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=glob.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/tools/glob.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,UAAU;AAYrC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,OAAe,EACf,OAAe,EACf,UAAmB,EACnB,MAAiB,EACjB,aAAqB,WAAW;IAEhC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAErE,SAAS;QACT,MAAM,aAAa,GAAG;YACpB,oBAAoB;YACpB,YAAY;YACZ,YAAY;YACZ,aAAa;YACb,aAAa;YACb,cAAc;YACd,gBAAgB;YAChB,cAAc;SACf,CAAC;QAEF,MAAM,cAAc,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;QAE9E,aAAa;QACb,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,EAAE;YAC9B,GAAG;YACH,MAAM,EAAE,cAAc;YACtB,QAAQ,EAAE,KAAK,EAAE,SAAS;YAC1B,SAAS,EAAE,IAAI;YACf,mBAAmB,EAAE,KAAK;YAC1B,KAAK,EAAE,IAAI,EAAE,eAAe;SAC7B,CAAC,CAAC;QAEH,mBAAmB;QACnB,MAAM,WAAW,GAAG,KAAK;aACtB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACb,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YAC7C,OAAO,KAAK,GAAG,KAAK,CAAC;QACvB,CAAC,CAAC;aACD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE9B,SAAS;QACT,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAEtD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,UAAU,OAAO,OAAO,CAAC;QAClC,CAAC;QAED,QAAQ;QACR,IAAI,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,QAAQ,CAAC;QAC/C,IAAI,WAAW,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;YACpC,MAAM,IAAI,SAAS,UAAU,QAAQ,WAAW,CAAC,MAAM,KAAK,CAAC;QAC/D,CAAC;QACD,MAAM,IAAI,QAAQ,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAE5C,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC;QACrC,CAAC;QACD,OAAO,YAAY,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IACrC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grep 工具 - 快速内容搜索
|
|
3
|
+
* 支持正则表达式、文件过滤、多种输出模式
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Grep 输出模式
|
|
7
|
+
*/
|
|
8
|
+
export type GrepOutputMode = 'content' | 'files_with_matches' | 'count';
|
|
9
|
+
/**
|
|
10
|
+
* Grep 选项
|
|
11
|
+
*/
|
|
12
|
+
export interface GrepOptions {
|
|
13
|
+
pattern: string;
|
|
14
|
+
path?: string;
|
|
15
|
+
glob?: string;
|
|
16
|
+
outputMode?: GrepOutputMode;
|
|
17
|
+
caseInsensitive?: boolean;
|
|
18
|
+
contextBefore?: number;
|
|
19
|
+
contextAfter?: number;
|
|
20
|
+
maxResults?: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 执行 Grep 内容搜索
|
|
24
|
+
*/
|
|
25
|
+
export declare function runGrep(workdir: string, pattern: string, searchPath?: string, globPattern?: string, outputMode?: GrepOutputMode, caseInsensitive?: boolean, contextBefore?: number, contextAfter?: number, maxResults?: number): Promise<string>;
|
|
26
|
+
//# sourceMappingURL=grep.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,oBAAoB,GAAG,OAAO,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAaD;;GAEG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,EACpB,UAAU,GAAE,cAAqC,EACjD,eAAe,GAAE,OAAe,EAChC,aAAa,GAAE,MAAU,EACzB,YAAY,GAAE,MAAU,EACxB,UAAU,GAAE,MAAY,GACvB,OAAO,CAAC,MAAM,CAAC,CAoJjB"}
|