@nexus-cortex/executors 4.26.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 +202 -0
- package/NOTICE +2 -0
- package/README.md +13 -0
- package/dist/ExecutorRegistry.d.ts +89 -0
- package/dist/ExecutorRegistry.d.ts.map +1 -0
- package/dist/ExecutorRegistry.js +219 -0
- package/dist/ExecutorRegistry.js.map +1 -0
- package/dist/base/BaseTool.d.ts +108 -0
- package/dist/base/BaseTool.d.ts.map +1 -0
- package/dist/base/BaseTool.js +111 -0
- package/dist/base/BaseTool.js.map +1 -0
- package/dist/base/ToolRegistry.d.ts +141 -0
- package/dist/base/ToolRegistry.d.ts.map +1 -0
- package/dist/base/ToolRegistry.js +241 -0
- package/dist/base/ToolRegistry.js.map +1 -0
- package/dist/base/ToolResult.d.ts +63 -0
- package/dist/base/ToolResult.d.ts.map +1 -0
- package/dist/base/ToolResult.js +8 -0
- package/dist/base/ToolResult.js.map +1 -0
- package/dist/base/index.d.ts +10 -0
- package/dist/base/index.d.ts.map +1 -0
- package/dist/base/index.js +8 -0
- package/dist/base/index.js.map +1 -0
- package/dist/implementations/addon/CreateArtifactTool.d.ts +221 -0
- package/dist/implementations/addon/CreateArtifactTool.d.ts.map +1 -0
- package/dist/implementations/addon/CreateArtifactTool.js +1042 -0
- package/dist/implementations/addon/CreateArtifactTool.js.map +1 -0
- package/dist/implementations/addon/FrameDiffCache.d.ts +166 -0
- package/dist/implementations/addon/FrameDiffCache.d.ts.map +1 -0
- package/dist/implementations/addon/FrameDiffCache.js +395 -0
- package/dist/implementations/addon/FrameDiffCache.js.map +1 -0
- package/dist/implementations/addon/H264StreamEncoder.d.ts +84 -0
- package/dist/implementations/addon/H264StreamEncoder.d.ts.map +1 -0
- package/dist/implementations/addon/H264StreamEncoder.js +203 -0
- package/dist/implementations/addon/H264StreamEncoder.js.map +1 -0
- package/dist/implementations/addon/HybridScreenshotManager.d.ts +197 -0
- package/dist/implementations/addon/HybridScreenshotManager.d.ts.map +1 -0
- package/dist/implementations/addon/HybridScreenshotManager.js +415 -0
- package/dist/implementations/addon/HybridScreenshotManager.js.map +1 -0
- package/dist/implementations/addon/InspectSandboxTool.d.ts +54 -0
- package/dist/implementations/addon/InspectSandboxTool.d.ts.map +1 -0
- package/dist/implementations/addon/InspectSandboxTool.js +226 -0
- package/dist/implementations/addon/InspectSandboxTool.js.map +1 -0
- package/dist/implementations/addon/InteractWithSandboxTool.d.ts +90 -0
- package/dist/implementations/addon/InteractWithSandboxTool.d.ts.map +1 -0
- package/dist/implementations/addon/InteractWithSandboxTool.js +367 -0
- package/dist/implementations/addon/InteractWithSandboxTool.js.map +1 -0
- package/dist/implementations/addon/KeyframeDetector.d.ts +140 -0
- package/dist/implementations/addon/KeyframeDetector.d.ts.map +1 -0
- package/dist/implementations/addon/KeyframeDetector.js +390 -0
- package/dist/implementations/addon/KeyframeDetector.js.map +1 -0
- package/dist/implementations/addon/ModifySandboxTool.d.ts +62 -0
- package/dist/implementations/addon/ModifySandboxTool.d.ts.map +1 -0
- package/dist/implementations/addon/ModifySandboxTool.js +266 -0
- package/dist/implementations/addon/ModifySandboxTool.js.map +1 -0
- package/dist/implementations/addon/ReactArtifactBuilder.d.ts +27 -0
- package/dist/implementations/addon/ReactArtifactBuilder.d.ts.map +1 -0
- package/dist/implementations/addon/ReactArtifactBuilder.js +198 -0
- package/dist/implementations/addon/ReactArtifactBuilder.js.map +1 -0
- package/dist/implementations/addon/SandboxEventBroadcaster.d.ts +143 -0
- package/dist/implementations/addon/SandboxEventBroadcaster.d.ts.map +1 -0
- package/dist/implementations/addon/SandboxEventBroadcaster.js +258 -0
- package/dist/implementations/addon/SandboxEventBroadcaster.js.map +1 -0
- package/dist/implementations/addon/SandboxIntrospectionTools.d.ts +77 -0
- package/dist/implementations/addon/SandboxIntrospectionTools.d.ts.map +1 -0
- package/dist/implementations/addon/SandboxIntrospectionTools.js +292 -0
- package/dist/implementations/addon/SandboxIntrospectionTools.js.map +1 -0
- package/dist/implementations/addon/SandboxViewServer.d.ts +127 -0
- package/dist/implementations/addon/SandboxViewServer.d.ts.map +1 -0
- package/dist/implementations/addon/SandboxViewServer.js +775 -0
- package/dist/implementations/addon/SandboxViewServer.js.map +1 -0
- package/dist/implementations/addon/ScreenStream.d.ts +149 -0
- package/dist/implementations/addon/ScreenStream.d.ts.map +1 -0
- package/dist/implementations/addon/ScreenStream.js +306 -0
- package/dist/implementations/addon/ScreenStream.js.map +1 -0
- package/dist/implementations/addon/StopSandboxTool.d.ts +61 -0
- package/dist/implementations/addon/StopSandboxTool.d.ts.map +1 -0
- package/dist/implementations/addon/StopSandboxTool.js +252 -0
- package/dist/implementations/addon/StopSandboxTool.js.map +1 -0
- package/dist/implementations/addon/TerminalSandbox.d.ts +111 -0
- package/dist/implementations/addon/TerminalSandbox.d.ts.map +1 -0
- package/dist/implementations/addon/TerminalSandbox.js +345 -0
- package/dist/implementations/addon/TerminalSandbox.js.map +1 -0
- package/dist/implementations/addon/VisualFeedbackBridge.d.ts +367 -0
- package/dist/implementations/addon/VisualFeedbackBridge.d.ts.map +1 -0
- package/dist/implementations/addon/VisualFeedbackBridge.js +888 -0
- package/dist/implementations/addon/VisualFeedbackBridge.js.map +1 -0
- package/dist/implementations/addon/WindowManager.d.ts +138 -0
- package/dist/implementations/addon/WindowManager.d.ts.map +1 -0
- package/dist/implementations/addon/WindowManager.js +276 -0
- package/dist/implementations/addon/WindowManager.js.map +1 -0
- package/dist/implementations/addon/index.d.ts +29 -0
- package/dist/implementations/addon/index.d.ts.map +1 -0
- package/dist/implementations/addon/index.js +29 -0
- package/dist/implementations/addon/index.js.map +1 -0
- package/dist/implementations/addon/injectables/reactIntrospection.d.ts +57 -0
- package/dist/implementations/addon/injectables/reactIntrospection.d.ts.map +1 -0
- package/dist/implementations/addon/injectables/reactIntrospection.js +480 -0
- package/dist/implementations/addon/injectables/reactIntrospection.js.map +1 -0
- package/dist/implementations/addon/terminal-client.html +253 -0
- package/dist/implementations/agent/PRAgentTool.d.ts +37 -0
- package/dist/implementations/agent/PRAgentTool.d.ts.map +1 -0
- package/dist/implementations/agent/PRAgentTool.js +257 -0
- package/dist/implementations/agent/PRAgentTool.js.map +1 -0
- package/dist/implementations/agent/TaskTool.d.ts +76 -0
- package/dist/implementations/agent/TaskTool.d.ts.map +1 -0
- package/dist/implementations/agent/TaskTool.js +424 -0
- package/dist/implementations/agent/TaskTool.js.map +1 -0
- package/dist/implementations/agent/index.d.ts +5 -0
- package/dist/implementations/agent/index.d.ts.map +1 -0
- package/dist/implementations/agent/index.js +3 -0
- package/dist/implementations/agent/index.js.map +1 -0
- package/dist/implementations/execution/BackgroundProcessRegistry.d.ts +68 -0
- package/dist/implementations/execution/BackgroundProcessRegistry.d.ts.map +1 -0
- package/dist/implementations/execution/BackgroundProcessRegistry.js +146 -0
- package/dist/implementations/execution/BackgroundProcessRegistry.js.map +1 -0
- package/dist/implementations/execution/BashOutputTool.d.ts +42 -0
- package/dist/implementations/execution/BashOutputTool.d.ts.map +1 -0
- package/dist/implementations/execution/BashOutputTool.js +168 -0
- package/dist/implementations/execution/BashOutputTool.js.map +1 -0
- package/dist/implementations/execution/CodeExecuteTool.d.ts +31 -0
- package/dist/implementations/execution/CodeExecuteTool.d.ts.map +1 -0
- package/dist/implementations/execution/CodeExecuteTool.js +127 -0
- package/dist/implementations/execution/CodeExecuteTool.js.map +1 -0
- package/dist/implementations/execution/KillShellTool.d.ts +37 -0
- package/dist/implementations/execution/KillShellTool.d.ts.map +1 -0
- package/dist/implementations/execution/KillShellTool.js +144 -0
- package/dist/implementations/execution/KillShellTool.js.map +1 -0
- package/dist/implementations/execution/SearchToolsTool.d.ts +32 -0
- package/dist/implementations/execution/SearchToolsTool.d.ts.map +1 -0
- package/dist/implementations/execution/SearchToolsTool.js +109 -0
- package/dist/implementations/execution/SearchToolsTool.js.map +1 -0
- package/dist/implementations/execution/ShellTool.d.ts +108 -0
- package/dist/implementations/execution/ShellTool.d.ts.map +1 -0
- package/dist/implementations/execution/ShellTool.js +546 -0
- package/dist/implementations/execution/ShellTool.js.map +1 -0
- package/dist/implementations/execution/WorkspaceManagerTool.d.ts +40 -0
- package/dist/implementations/execution/WorkspaceManagerTool.d.ts.map +1 -0
- package/dist/implementations/execution/WorkspaceManagerTool.js +370 -0
- package/dist/implementations/execution/WorkspaceManagerTool.js.map +1 -0
- package/dist/implementations/execution/index.d.ts +13 -0
- package/dist/implementations/execution/index.d.ts.map +1 -0
- package/dist/implementations/execution/index.js +13 -0
- package/dist/implementations/execution/index.js.map +1 -0
- package/dist/implementations/extensions/EndTurnTool.d.ts +62 -0
- package/dist/implementations/extensions/EndTurnTool.d.ts.map +1 -0
- package/dist/implementations/extensions/EndTurnTool.js +172 -0
- package/dist/implementations/extensions/EndTurnTool.js.map +1 -0
- package/dist/implementations/extensions/ResearchBacklogTool.d.ts +37 -0
- package/dist/implementations/extensions/ResearchBacklogTool.d.ts.map +1 -0
- package/dist/implementations/extensions/ResearchBacklogTool.js +102 -0
- package/dist/implementations/extensions/ResearchBacklogTool.js.map +1 -0
- package/dist/implementations/extensions/SkillTool.d.ts +108 -0
- package/dist/implementations/extensions/SkillTool.d.ts.map +1 -0
- package/dist/implementations/extensions/SkillTool.js +351 -0
- package/dist/implementations/extensions/SkillTool.js.map +1 -0
- package/dist/implementations/extensions/SlashCommandTool.d.ts +112 -0
- package/dist/implementations/extensions/SlashCommandTool.d.ts.map +1 -0
- package/dist/implementations/extensions/SlashCommandTool.js +315 -0
- package/dist/implementations/extensions/SlashCommandTool.js.map +1 -0
- package/dist/implementations/extensions/index.d.ts +14 -0
- package/dist/implementations/extensions/index.d.ts.map +1 -0
- package/dist/implementations/extensions/index.js +10 -0
- package/dist/implementations/extensions/index.js.map +1 -0
- package/dist/implementations/file/EditTool.d.ts +232 -0
- package/dist/implementations/file/EditTool.d.ts.map +1 -0
- package/dist/implementations/file/EditTool.js +707 -0
- package/dist/implementations/file/EditTool.js.map +1 -0
- package/dist/implementations/file/ReadFileTool.d.ts +49 -0
- package/dist/implementations/file/ReadFileTool.d.ts.map +1 -0
- package/dist/implementations/file/ReadFileTool.js +225 -0
- package/dist/implementations/file/ReadFileTool.js.map +1 -0
- package/dist/implementations/file/WriteBinaryTool.d.ts +21 -0
- package/dist/implementations/file/WriteBinaryTool.d.ts.map +1 -0
- package/dist/implementations/file/WriteBinaryTool.js +153 -0
- package/dist/implementations/file/WriteBinaryTool.js.map +1 -0
- package/dist/implementations/file/WriteFileTool.d.ts +41 -0
- package/dist/implementations/file/WriteFileTool.d.ts.map +1 -0
- package/dist/implementations/file/WriteFileTool.js +220 -0
- package/dist/implementations/file/WriteFileTool.js.map +1 -0
- package/dist/implementations/file/index.d.ts +8 -0
- package/dist/implementations/file/index.d.ts.map +1 -0
- package/dist/implementations/file/index.js +8 -0
- package/dist/implementations/file/index.js.map +1 -0
- package/dist/implementations/historical/GetConversationSegmentTool.d.ts +44 -0
- package/dist/implementations/historical/GetConversationSegmentTool.d.ts.map +1 -0
- package/dist/implementations/historical/GetConversationSegmentTool.js +220 -0
- package/dist/implementations/historical/GetConversationSegmentTool.js.map +1 -0
- package/dist/implementations/historical/ListCompactionBoundariesTool.d.ts +36 -0
- package/dist/implementations/historical/ListCompactionBoundariesTool.d.ts.map +1 -0
- package/dist/implementations/historical/ListCompactionBoundariesTool.js +174 -0
- package/dist/implementations/historical/ListCompactionBoundariesTool.js.map +1 -0
- package/dist/implementations/historical/ListSessionsTool.d.ts +38 -0
- package/dist/implementations/historical/ListSessionsTool.d.ts.map +1 -0
- package/dist/implementations/historical/ListSessionsTool.js +140 -0
- package/dist/implementations/historical/ListSessionsTool.js.map +1 -0
- package/dist/implementations/historical/LoadSessionTool.d.ts +39 -0
- package/dist/implementations/historical/LoadSessionTool.d.ts.map +1 -0
- package/dist/implementations/historical/LoadSessionTool.js +171 -0
- package/dist/implementations/historical/LoadSessionTool.js.map +1 -0
- package/dist/implementations/historical/RequestHistoricalContextTool.d.ts +46 -0
- package/dist/implementations/historical/RequestHistoricalContextTool.d.ts.map +1 -0
- package/dist/implementations/historical/RequestHistoricalContextTool.js +224 -0
- package/dist/implementations/historical/RequestHistoricalContextTool.js.map +1 -0
- package/dist/implementations/historical/SearchConversationHistoryTool.d.ts +51 -0
- package/dist/implementations/historical/SearchConversationHistoryTool.d.ts.map +1 -0
- package/dist/implementations/historical/SearchConversationHistoryTool.js +306 -0
- package/dist/implementations/historical/SearchConversationHistoryTool.js.map +1 -0
- package/dist/implementations/historical/index.d.ts +12 -0
- package/dist/implementations/historical/index.d.ts.map +1 -0
- package/dist/implementations/historical/index.js +12 -0
- package/dist/implementations/historical/index.js.map +1 -0
- package/dist/implementations/index.d.ts +16 -0
- package/dist/implementations/index.d.ts.map +1 -0
- package/dist/implementations/index.js +28 -0
- package/dist/implementations/index.js.map +1 -0
- package/dist/implementations/mcp/DiscoveredMcpTool.d.ts +58 -0
- package/dist/implementations/mcp/DiscoveredMcpTool.d.ts.map +1 -0
- package/dist/implementations/mcp/DiscoveredMcpTool.js +269 -0
- package/dist/implementations/mcp/DiscoveredMcpTool.js.map +1 -0
- package/dist/implementations/mcp/index.d.ts +9 -0
- package/dist/implementations/mcp/index.d.ts.map +1 -0
- package/dist/implementations/mcp/index.js +8 -0
- package/dist/implementations/mcp/index.js.map +1 -0
- package/dist/implementations/notebook/NotebookEditTool.d.ts +96 -0
- package/dist/implementations/notebook/NotebookEditTool.d.ts.map +1 -0
- package/dist/implementations/notebook/NotebookEditTool.js +390 -0
- package/dist/implementations/notebook/NotebookEditTool.js.map +1 -0
- package/dist/implementations/notebook/index.d.ts +7 -0
- package/dist/implementations/notebook/index.d.ts.map +1 -0
- package/dist/implementations/notebook/index.js +7 -0
- package/dist/implementations/notebook/index.js.map +1 -0
- package/dist/implementations/search/GlobTool.d.ts +73 -0
- package/dist/implementations/search/GlobTool.d.ts.map +1 -0
- package/dist/implementations/search/GlobTool.js +213 -0
- package/dist/implementations/search/GlobTool.js.map +1 -0
- package/dist/implementations/search/GrepTool.d.ts +102 -0
- package/dist/implementations/search/GrepTool.d.ts.map +1 -0
- package/dist/implementations/search/GrepTool.js +754 -0
- package/dist/implementations/search/GrepTool.js.map +1 -0
- package/dist/implementations/search/index.d.ts +6 -0
- package/dist/implementations/search/index.d.ts.map +1 -0
- package/dist/implementations/search/index.js +6 -0
- package/dist/implementations/search/index.js.map +1 -0
- package/dist/implementations/tmux/TmuxSessionTool.d.ts +82 -0
- package/dist/implementations/tmux/TmuxSessionTool.d.ts.map +1 -0
- package/dist/implementations/tmux/TmuxSessionTool.js +371 -0
- package/dist/implementations/tmux/TmuxSessionTool.js.map +1 -0
- package/dist/implementations/tmux/TmuxViewServer.d.ts +86 -0
- package/dist/implementations/tmux/TmuxViewServer.d.ts.map +1 -0
- package/dist/implementations/tmux/TmuxViewServer.js +480 -0
- package/dist/implementations/tmux/TmuxViewServer.js.map +1 -0
- package/dist/implementations/tmux/index.d.ts +6 -0
- package/dist/implementations/tmux/index.d.ts.map +1 -0
- package/dist/implementations/tmux/index.js +6 -0
- package/dist/implementations/tmux/index.js.map +1 -0
- package/dist/implementations/ui/AskUserQuestionTool.d.ts +77 -0
- package/dist/implementations/ui/AskUserQuestionTool.d.ts.map +1 -0
- package/dist/implementations/ui/AskUserQuestionTool.js +241 -0
- package/dist/implementations/ui/AskUserQuestionTool.js.map +1 -0
- package/dist/implementations/ui/ExitPlanModeTool.d.ts +44 -0
- package/dist/implementations/ui/ExitPlanModeTool.d.ts.map +1 -0
- package/dist/implementations/ui/ExitPlanModeTool.js +150 -0
- package/dist/implementations/ui/ExitPlanModeTool.js.map +1 -0
- package/dist/implementations/ui/TodoWriteTool.d.ts +59 -0
- package/dist/implementations/ui/TodoWriteTool.d.ts.map +1 -0
- package/dist/implementations/ui/TodoWriteTool.js +315 -0
- package/dist/implementations/ui/TodoWriteTool.js.map +1 -0
- package/dist/implementations/ui/index.d.ts +9 -0
- package/dist/implementations/ui/index.d.ts.map +1 -0
- package/dist/implementations/ui/index.js +9 -0
- package/dist/implementations/ui/index.js.map +1 -0
- package/dist/implementations/web/BrowseTool.d.ts +43 -0
- package/dist/implementations/web/BrowseTool.d.ts.map +1 -0
- package/dist/implementations/web/BrowseTool.js +181 -0
- package/dist/implementations/web/BrowseTool.js.map +1 -0
- package/dist/implementations/web/SandboxTransferTool.d.ts +30 -0
- package/dist/implementations/web/SandboxTransferTool.d.ts.map +1 -0
- package/dist/implementations/web/SandboxTransferTool.js +261 -0
- package/dist/implementations/web/SandboxTransferTool.js.map +1 -0
- package/dist/implementations/web/WebFetchTool.d.ts +93 -0
- package/dist/implementations/web/WebFetchTool.d.ts.map +1 -0
- package/dist/implementations/web/WebFetchTool.js +484 -0
- package/dist/implementations/web/WebFetchTool.js.map +1 -0
- package/dist/implementations/web/WebSearchTool.d.ts +53 -0
- package/dist/implementations/web/WebSearchTool.d.ts.map +1 -0
- package/dist/implementations/web/WebSearchTool.js +227 -0
- package/dist/implementations/web/WebSearchTool.js.map +1 -0
- package/dist/implementations/web/escalateDirective.d.ts +11 -0
- package/dist/implementations/web/escalateDirective.d.ts.map +1 -0
- package/dist/implementations/web/escalateDirective.js +20 -0
- package/dist/implementations/web/escalateDirective.js.map +1 -0
- package/dist/implementations/web/index.d.ts +10 -0
- package/dist/implementations/web/index.d.ts.map +1 -0
- package/dist/implementations/web/index.js +10 -0
- package/dist/implementations/web/index.js.map +1 -0
- package/dist/implementations/web/webBackends.d.ts +65 -0
- package/dist/implementations/web/webBackends.d.ts.map +1 -0
- package/dist/implementations/web/webBackends.js +430 -0
- package/dist/implementations/web/webBackends.js.map +1 -0
- package/dist/implementations/web/webFetchRequestInit.d.ts +9 -0
- package/dist/implementations/web/webFetchRequestInit.d.ts.map +1 -0
- package/dist/implementations/web/webFetchRequestInit.js +21 -0
- package/dist/implementations/web/webFetchRequestInit.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/ArtifactRegistry.d.ts +138 -0
- package/dist/utils/ArtifactRegistry.d.ts.map +1 -0
- package/dist/utils/ArtifactRegistry.js +259 -0
- package/dist/utils/ArtifactRegistry.js.map +1 -0
- package/dist/utils/ChromiumBrowserManager.d.ts +56 -0
- package/dist/utils/ChromiumBrowserManager.d.ts.map +1 -0
- package/dist/utils/ChromiumBrowserManager.js +243 -0
- package/dist/utils/ChromiumBrowserManager.js.map +1 -0
- package/dist/utils/FileUtils.d.ts +81 -0
- package/dist/utils/FileUtils.d.ts.map +1 -0
- package/dist/utils/FileUtils.js +148 -0
- package/dist/utils/FileUtils.js.map +1 -0
- package/dist/utils/GitPolicy.d.ts +70 -0
- package/dist/utils/GitPolicy.d.ts.map +1 -0
- package/dist/utils/GitPolicy.js +166 -0
- package/dist/utils/GitPolicy.js.map +1 -0
- package/dist/utils/GitUtils.d.ts +18 -0
- package/dist/utils/GitUtils.d.ts.map +1 -0
- package/dist/utils/GitUtils.js +62 -0
- package/dist/utils/GitUtils.js.map +1 -0
- package/dist/utils/SandboxRegistry.d.ts +110 -0
- package/dist/utils/SandboxRegistry.d.ts.map +1 -0
- package/dist/utils/SandboxRegistry.js +220 -0
- package/dist/utils/SandboxRegistry.js.map +1 -0
- package/dist/utils/SchemaValidator.d.ts +21 -0
- package/dist/utils/SchemaValidator.d.ts.map +1 -0
- package/dist/utils/SchemaValidator.js +67 -0
- package/dist/utils/SchemaValidator.js.map +1 -0
- package/dist/utils/SessionLock.d.ts +96 -0
- package/dist/utils/SessionLock.d.ts.map +1 -0
- package/dist/utils/SessionLock.js +276 -0
- package/dist/utils/SessionLock.js.map +1 -0
- package/dist/utils/SessionPersistence.d.ts +89 -0
- package/dist/utils/SessionPersistence.d.ts.map +1 -0
- package/dist/utils/SessionPersistence.js +244 -0
- package/dist/utils/SessionPersistence.js.map +1 -0
- package/dist/utils/TextUtils.d.ts +77 -0
- package/dist/utils/TextUtils.d.ts.map +1 -0
- package/dist/utils/TextUtils.js +112 -0
- package/dist/utils/TextUtils.js.map +1 -0
- package/dist/utils/TmuxCapture.d.ts +94 -0
- package/dist/utils/TmuxCapture.d.ts.map +1 -0
- package/dist/utils/TmuxCapture.js +131 -0
- package/dist/utils/TmuxCapture.js.map +1 -0
- package/dist/utils/TmuxManager.d.ts +65 -0
- package/dist/utils/TmuxManager.d.ts.map +1 -0
- package/dist/utils/TmuxManager.js +304 -0
- package/dist/utils/TmuxManager.js.map +1 -0
- package/dist/utils/autoResearchPlanGate.d.ts +10 -0
- package/dist/utils/autoResearchPlanGate.d.ts.map +1 -0
- package/dist/utils/autoResearchPlanGate.js +57 -0
- package/dist/utils/autoResearchPlanGate.js.map +1 -0
- package/dist/utils/index.d.ts +19 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +13 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +83 -0
|
@@ -0,0 +1,546 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell Tool Executor
|
|
3
|
+
*
|
|
4
|
+
* Executes shell commands via bash/cmd and captures output.
|
|
5
|
+
* Supports background processes, timeouts, and abort handling.
|
|
6
|
+
*
|
|
7
|
+
* Adapted and simplified from Gemini CLI patterns
|
|
8
|
+
* - Removed: Complex allow/block lists, summarization
|
|
9
|
+
* - Kept: Core execution, background process detection, timeout enforcement
|
|
10
|
+
* - Simplified: Security model (path-based only)
|
|
11
|
+
*/
|
|
12
|
+
import os from 'os';
|
|
13
|
+
import path from 'path';
|
|
14
|
+
import fs from 'fs';
|
|
15
|
+
import crypto from 'crypto';
|
|
16
|
+
import { spawn } from 'child_process';
|
|
17
|
+
import { BaseTool } from '../../base/index.js';
|
|
18
|
+
import { SchemaValidator } from '../../utils/SchemaValidator.js';
|
|
19
|
+
import { TmuxManager, SessionPersistence } from '../../utils/index.js';
|
|
20
|
+
import { BackgroundProcessRegistry } from './BackgroundProcessRegistry.js';
|
|
21
|
+
/**
|
|
22
|
+
* Shell Tool Executor
|
|
23
|
+
*
|
|
24
|
+
* Features:
|
|
25
|
+
* - Executes commands via bash -c (or cmd.exe on Windows)
|
|
26
|
+
* - Captures stdout, stderr, exit code
|
|
27
|
+
* - Background process detection (Unix only)
|
|
28
|
+
* - Timeout enforcement
|
|
29
|
+
* - Abort signal support
|
|
30
|
+
* - Streaming output updates
|
|
31
|
+
*
|
|
32
|
+
* Security:
|
|
33
|
+
* - Commands run in specified working directory
|
|
34
|
+
* - Path traversal prevention for directory parameter
|
|
35
|
+
* - Blocks command substitution with $()
|
|
36
|
+
*/
|
|
37
|
+
export class ShellTool extends BaseTool {
|
|
38
|
+
config;
|
|
39
|
+
static DEFAULT_TIMEOUT_MS = 120000; // 2 minutes
|
|
40
|
+
static OUTPUT_UPDATE_INTERVAL_MS = 1000; // 1 second
|
|
41
|
+
static MAX_OUTPUT_LENGTH = 30000; // ~30KB max to prevent context overflow
|
|
42
|
+
tmux;
|
|
43
|
+
persistence;
|
|
44
|
+
constructor(config) {
|
|
45
|
+
super('Bash', 'Execute', `Executes a shell command via bash (or cmd.exe on Windows). Returns stdout, stderr, exit code, and background process IDs. Commands run in a subprocess that leads its own process group. CRITICAL: Always use literal characters in commands - never HTML-encode special characters (use && not &&, < not <, > not >).`, {
|
|
46
|
+
type: 'object',
|
|
47
|
+
properties: {
|
|
48
|
+
command: {
|
|
49
|
+
type: 'string',
|
|
50
|
+
description: 'The shell command to execute. Can use && to chain commands, & for background processes. IMPORTANT: Use literal characters (&& not &&, < not <, > not >). Never use HTML entities in commands.',
|
|
51
|
+
},
|
|
52
|
+
directory: {
|
|
53
|
+
type: 'string',
|
|
54
|
+
description: 'Optional: Directory to run command in (relative to working directory).',
|
|
55
|
+
},
|
|
56
|
+
timeout: {
|
|
57
|
+
type: 'number',
|
|
58
|
+
description: 'Optional: Timeout in milliseconds (default: 120000ms = 2 minutes).',
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
required: ['command'],
|
|
62
|
+
});
|
|
63
|
+
this.config = config;
|
|
64
|
+
this.tmux = TmuxManager.getInstance();
|
|
65
|
+
this.persistence = new SessionPersistence(config.workingDirectory || process.cwd());
|
|
66
|
+
}
|
|
67
|
+
validateToolParams(params) {
|
|
68
|
+
// Schema validation
|
|
69
|
+
const schemaError = SchemaValidator.validate(this.parameterSchema, params);
|
|
70
|
+
if (schemaError) {
|
|
71
|
+
return schemaError;
|
|
72
|
+
}
|
|
73
|
+
// Validate command is not empty
|
|
74
|
+
if (!params.command || !params.command.trim()) {
|
|
75
|
+
return 'Command cannot be empty.';
|
|
76
|
+
}
|
|
77
|
+
// Security: block command substitution with $()
|
|
78
|
+
if (params.command.includes('$(')) {
|
|
79
|
+
return 'Command substitution using $() is not allowed for security reasons.';
|
|
80
|
+
}
|
|
81
|
+
// Validate directory if provided
|
|
82
|
+
if (params.directory) {
|
|
83
|
+
if (path.isAbsolute(params.directory)) {
|
|
84
|
+
return 'Directory must be relative to working directory, not absolute.';
|
|
85
|
+
}
|
|
86
|
+
// Resolve and check directory exists
|
|
87
|
+
const resolvedDir = path.resolve(this.config.workingDirectory, params.directory);
|
|
88
|
+
// Security: ensure directory is within working directory
|
|
89
|
+
if (!resolvedDir.startsWith(this.config.workingDirectory)) {
|
|
90
|
+
return `Directory must be within working directory.`;
|
|
91
|
+
}
|
|
92
|
+
// Check directory exists
|
|
93
|
+
try {
|
|
94
|
+
if (!fs.existsSync(resolvedDir)) {
|
|
95
|
+
return `Directory does not exist: ${params.directory}`;
|
|
96
|
+
}
|
|
97
|
+
const stats = fs.statSync(resolvedDir);
|
|
98
|
+
if (!stats.isDirectory()) {
|
|
99
|
+
return `Path is not a directory: ${params.directory}`;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
return `Error accessing directory: ${error.message}`;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Validate timeout if provided
|
|
107
|
+
if (params.timeout !== undefined) {
|
|
108
|
+
if (typeof params.timeout !== 'number' || params.timeout <= 0) {
|
|
109
|
+
return 'Timeout must be a positive number.';
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
getDescription(params) {
|
|
115
|
+
if (!params || !params.command) {
|
|
116
|
+
return 'Execute shell command';
|
|
117
|
+
}
|
|
118
|
+
let description = params.command;
|
|
119
|
+
if (params.directory) {
|
|
120
|
+
description += ` [in ${params.directory}]`;
|
|
121
|
+
}
|
|
122
|
+
return description;
|
|
123
|
+
}
|
|
124
|
+
async execute(params, signal, updateOutput) {
|
|
125
|
+
const startTime = Date.now();
|
|
126
|
+
// Validate parameters
|
|
127
|
+
const validationError = this.validateToolParams(params);
|
|
128
|
+
if (validationError) {
|
|
129
|
+
return this.createErrorResult(validationError);
|
|
130
|
+
}
|
|
131
|
+
if (signal.aborted) {
|
|
132
|
+
return this.createErrorResult('Command was cancelled before it could start.');
|
|
133
|
+
}
|
|
134
|
+
// Guard: redirect commands that should use dedicated tools
|
|
135
|
+
const redirectMessage = this.checkToolRedirect(params.command);
|
|
136
|
+
if (redirectMessage) {
|
|
137
|
+
return this.createErrorResult(redirectMessage);
|
|
138
|
+
}
|
|
139
|
+
// Check if background execution requested
|
|
140
|
+
if (params.run_in_background) {
|
|
141
|
+
return this.executeInBackground(params, signal);
|
|
142
|
+
}
|
|
143
|
+
// Check if persistent session requested
|
|
144
|
+
if (params.persistentSession) {
|
|
145
|
+
return this.executeInPersistentSession(params, signal, updateOutput);
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
const result = await this.executeCommand(params, signal, updateOutput);
|
|
149
|
+
// Check if command was aborted during execution
|
|
150
|
+
if (signal.aborted) {
|
|
151
|
+
return this.createErrorResult('Command was cancelled by user.');
|
|
152
|
+
}
|
|
153
|
+
return this.createSuccessResult(result.llmContent, {
|
|
154
|
+
executionTime: Date.now() - startTime,
|
|
155
|
+
exitCode: result.exitCode,
|
|
156
|
+
signal: result.processSignal,
|
|
157
|
+
backgroundPIDs: result.backgroundPIDs,
|
|
158
|
+
processGroupPGID: result.pgid,
|
|
159
|
+
truncated: result.truncated,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
if (error.name === 'AbortError' || signal.aborted) {
|
|
164
|
+
return this.createErrorResult('Command was cancelled by user.');
|
|
165
|
+
}
|
|
166
|
+
return this.createErrorResult(`Failed to execute command: ${error.message}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Executes the shell command and captures output
|
|
171
|
+
* @private
|
|
172
|
+
*/
|
|
173
|
+
async executeCommand(params, signal, updateOutput) {
|
|
174
|
+
const isWindows = os.platform() === 'win32';
|
|
175
|
+
const timeout = params.timeout || ShellTool.DEFAULT_TIMEOUT_MS;
|
|
176
|
+
// Create temp file for background PID detection (Unix only)
|
|
177
|
+
const tempFileName = `shell_pgrep_${crypto.randomBytes(6).toString('hex')}.tmp`;
|
|
178
|
+
const tempFilePath = path.join(os.tmpdir(), tempFileName);
|
|
179
|
+
// Wrap command to capture background PIDs (Unix only)
|
|
180
|
+
const command = isWindows
|
|
181
|
+
? params.command
|
|
182
|
+
: (() => {
|
|
183
|
+
let cmd = params.command.trim();
|
|
184
|
+
if (!cmd.endsWith('&'))
|
|
185
|
+
cmd += ';';
|
|
186
|
+
return `{ ${cmd} }; __code=$?; pgrep -g 0 >${tempFilePath} 2>&1; exit $__code;`;
|
|
187
|
+
})();
|
|
188
|
+
// Determine working directory
|
|
189
|
+
const cwd = params.directory
|
|
190
|
+
? path.resolve(this.config.workingDirectory, params.directory)
|
|
191
|
+
: this.config.workingDirectory;
|
|
192
|
+
// Spawn process
|
|
193
|
+
const shell = isWindows
|
|
194
|
+
? spawn('cmd.exe', ['/c', params.command], {
|
|
195
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
196
|
+
cwd,
|
|
197
|
+
})
|
|
198
|
+
: spawn('bash', ['-c', command], {
|
|
199
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
200
|
+
detached: true, // Create process group
|
|
201
|
+
cwd,
|
|
202
|
+
});
|
|
203
|
+
// Output tracking
|
|
204
|
+
let exited = false;
|
|
205
|
+
let stdout = '';
|
|
206
|
+
let stderr = '';
|
|
207
|
+
let output = '';
|
|
208
|
+
let lastUpdateTime = Date.now();
|
|
209
|
+
const appendOutput = (str) => {
|
|
210
|
+
output += str;
|
|
211
|
+
if (updateOutput &&
|
|
212
|
+
Date.now() - lastUpdateTime > ShellTool.OUTPUT_UPDATE_INTERVAL_MS) {
|
|
213
|
+
updateOutput(output);
|
|
214
|
+
lastUpdateTime = Date.now();
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
// Capture stdout
|
|
218
|
+
shell.stdout?.on('data', (data) => {
|
|
219
|
+
if (!exited) {
|
|
220
|
+
const str = this.stripAnsi(data.toString());
|
|
221
|
+
stdout += str;
|
|
222
|
+
appendOutput(str);
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
// Capture stderr
|
|
226
|
+
shell.stderr?.on('data', (data) => {
|
|
227
|
+
if (!exited) {
|
|
228
|
+
const str = this.stripAnsi(data.toString());
|
|
229
|
+
stderr += str;
|
|
230
|
+
appendOutput(str);
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
// Error handling
|
|
234
|
+
let errorMessage = null;
|
|
235
|
+
shell.on('error', (err) => {
|
|
236
|
+
// Remove wrapper from error message
|
|
237
|
+
errorMessage = err.message.replace(command, params.command);
|
|
238
|
+
});
|
|
239
|
+
// Exit handling
|
|
240
|
+
let exitCode = null;
|
|
241
|
+
let processSignal = null;
|
|
242
|
+
shell.on('exit', (code, sig) => {
|
|
243
|
+
exited = true;
|
|
244
|
+
exitCode = code;
|
|
245
|
+
processSignal = sig;
|
|
246
|
+
});
|
|
247
|
+
// Abort handler
|
|
248
|
+
const abortHandler = async () => {
|
|
249
|
+
if (shell.pid && !exited) {
|
|
250
|
+
await this.killProcess(shell.pid, isWindows);
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
signal.addEventListener('abort', abortHandler);
|
|
254
|
+
// Timeout handler
|
|
255
|
+
const timeoutId = setTimeout(async () => {
|
|
256
|
+
if (!exited && shell.pid) {
|
|
257
|
+
await this.killProcess(shell.pid, isWindows);
|
|
258
|
+
}
|
|
259
|
+
}, timeout);
|
|
260
|
+
try {
|
|
261
|
+
// Wait for process to exit
|
|
262
|
+
await new Promise((resolve) => {
|
|
263
|
+
shell.on('exit', () => resolve());
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
finally {
|
|
267
|
+
clearTimeout(timeoutId);
|
|
268
|
+
signal.removeEventListener('abort', abortHandler);
|
|
269
|
+
}
|
|
270
|
+
// Parse background PIDs (Unix only)
|
|
271
|
+
const backgroundPIDs = [];
|
|
272
|
+
if (!isWindows && fs.existsSync(tempFilePath)) {
|
|
273
|
+
try {
|
|
274
|
+
const pgrepLines = fs
|
|
275
|
+
.readFileSync(tempFilePath, 'utf8')
|
|
276
|
+
.split('\n')
|
|
277
|
+
.filter(Boolean);
|
|
278
|
+
for (const line of pgrepLines) {
|
|
279
|
+
if (/^\d+$/.test(line)) {
|
|
280
|
+
const pid = Number(line);
|
|
281
|
+
if (pid !== shell.pid) {
|
|
282
|
+
backgroundPIDs.push(pid);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
fs.unlinkSync(tempFilePath);
|
|
287
|
+
}
|
|
288
|
+
catch (err) {
|
|
289
|
+
// Ignore errors reading pgrep output
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// Format output with truncation to prevent context overflow
|
|
293
|
+
let llmContent = '';
|
|
294
|
+
let truncated = false;
|
|
295
|
+
const truncateIfNeeded = (content) => {
|
|
296
|
+
if (content.length > ShellTool.MAX_OUTPUT_LENGTH) {
|
|
297
|
+
truncated = true;
|
|
298
|
+
// Keep first part and last part for context
|
|
299
|
+
const halfLimit = Math.floor(ShellTool.MAX_OUTPUT_LENGTH / 2) - 50;
|
|
300
|
+
const firstPart = content.substring(0, halfLimit);
|
|
301
|
+
const lastPart = content.substring(content.length - halfLimit);
|
|
302
|
+
return `${firstPart}\n\n... [${content.length - ShellTool.MAX_OUTPUT_LENGTH} characters truncated for context efficiency] ...\n\n${lastPart}`;
|
|
303
|
+
}
|
|
304
|
+
return content;
|
|
305
|
+
};
|
|
306
|
+
if (signal.aborted) {
|
|
307
|
+
llmContent = 'Command was cancelled by user before it could complete.';
|
|
308
|
+
if (output.trim()) {
|
|
309
|
+
llmContent += `\n\nOutput before cancellation:\n${truncateIfNeeded(output)}`;
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
llmContent += ' No output was produced before cancellation.';
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
// Concise output format
|
|
317
|
+
if (exitCode === 0) {
|
|
318
|
+
// Success: Just show stdout if present, otherwise confirmation
|
|
319
|
+
llmContent = truncateIfNeeded(stdout) || '(command completed successfully)';
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
// Failure: Show error and stderr
|
|
323
|
+
const parts = [];
|
|
324
|
+
if (errorMessage) {
|
|
325
|
+
parts.push(`Error: ${errorMessage}`);
|
|
326
|
+
}
|
|
327
|
+
if (stderr) {
|
|
328
|
+
parts.push(`Stderr: ${truncateIfNeeded(stderr)}`);
|
|
329
|
+
}
|
|
330
|
+
if (parts.length === 0) {
|
|
331
|
+
parts.push(`Command failed with exit code ${exitCode}`);
|
|
332
|
+
}
|
|
333
|
+
llmContent = parts.join('\n');
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
return {
|
|
337
|
+
llmContent,
|
|
338
|
+
exitCode,
|
|
339
|
+
processSignal,
|
|
340
|
+
backgroundPIDs,
|
|
341
|
+
pgid: shell.pid ?? null,
|
|
342
|
+
truncated,
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Kills a process and its children
|
|
347
|
+
* @private
|
|
348
|
+
*/
|
|
349
|
+
async killProcess(pid, isWindows) {
|
|
350
|
+
if (isWindows) {
|
|
351
|
+
// Windows: use taskkill to kill process tree
|
|
352
|
+
spawn('taskkill', ['/pid', pid.toString(), '/f', '/t']);
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
// Unix: kill process group
|
|
356
|
+
try {
|
|
357
|
+
// Try SIGTERM first
|
|
358
|
+
process.kill(-pid, 'SIGTERM');
|
|
359
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
360
|
+
// Fall back to SIGKILL if still running
|
|
361
|
+
try {
|
|
362
|
+
process.kill(-pid, 'SIGKILL');
|
|
363
|
+
}
|
|
364
|
+
catch {
|
|
365
|
+
// Process already exited
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
catch {
|
|
369
|
+
// If group kill fails, try killing just the process
|
|
370
|
+
try {
|
|
371
|
+
process.kill(pid, 'SIGKILL');
|
|
372
|
+
}
|
|
373
|
+
catch {
|
|
374
|
+
// Process already exited
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Execute command in persistent tmux session
|
|
381
|
+
* @private
|
|
382
|
+
*/
|
|
383
|
+
async executeInPersistentSession(params, signal, updateOutput) {
|
|
384
|
+
const startTime = Date.now();
|
|
385
|
+
// Check tmux availability
|
|
386
|
+
if (!(await this.tmux.isAvailable())) {
|
|
387
|
+
return this.createErrorResult('tmux is not available. Persistent sessions require tmux to be installed.\n\n' +
|
|
388
|
+
'Installation:\n' +
|
|
389
|
+
' - Ubuntu/Debian: apt-get install tmux\n' +
|
|
390
|
+
' - macOS: brew install tmux\n' +
|
|
391
|
+
' - Replit: Add tmux in the Packages tab\n\n' +
|
|
392
|
+
'Falling back to standard execution is not automatic. Please either:\n' +
|
|
393
|
+
'1. Install tmux and retry\n' +
|
|
394
|
+
'2. Remove persistentSession=true to use standard execution');
|
|
395
|
+
}
|
|
396
|
+
try {
|
|
397
|
+
// Generate or use provided session ID
|
|
398
|
+
const sessionId = params.sessionId || `bash-${crypto.randomBytes(4).toString('hex')}`;
|
|
399
|
+
updateOutput?.(`Using persistent session: ${sessionId}\n`);
|
|
400
|
+
// Determine working directory
|
|
401
|
+
const cwd = params.directory
|
|
402
|
+
? path.resolve(this.config.workingDirectory, params.directory)
|
|
403
|
+
: this.config.workingDirectory;
|
|
404
|
+
// Create session if doesn't exist
|
|
405
|
+
if (!(await this.tmux.sessionExists(sessionId))) {
|
|
406
|
+
updateOutput?.(`Creating new tmux session...\n`);
|
|
407
|
+
await this.tmux.createSession(sessionId, cwd);
|
|
408
|
+
// Save session metadata
|
|
409
|
+
await this.persistence.saveSession({
|
|
410
|
+
sessionId,
|
|
411
|
+
created: new Date(),
|
|
412
|
+
lastUsed: new Date(),
|
|
413
|
+
cwd
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
else {
|
|
417
|
+
// Touch existing session
|
|
418
|
+
await this.persistence.touchSession(sessionId);
|
|
419
|
+
}
|
|
420
|
+
// Send command to session
|
|
421
|
+
updateOutput?.(`Sending command: ${params.command}\n`);
|
|
422
|
+
await this.tmux.sendKeys(sessionId, params.command);
|
|
423
|
+
// Wait for command to complete (simple delay-based approach)
|
|
424
|
+
const timeout = params.timeout || ShellTool.DEFAULT_TIMEOUT_MS;
|
|
425
|
+
await new Promise((resolve) => setTimeout(resolve, Math.min(timeout, 5000)));
|
|
426
|
+
// Capture output
|
|
427
|
+
updateOutput?.(`Capturing output...\n`);
|
|
428
|
+
const startLine = params.captureHistory ? -3000 : undefined;
|
|
429
|
+
const output = await this.tmux.capturePane(sessionId, startLine);
|
|
430
|
+
const result = `Command executed in persistent tmux session '${sessionId}'.\n\n` +
|
|
431
|
+
`Output:\n${'='.repeat(60)}\n${output}\n${'='.repeat(60)}\n\n` +
|
|
432
|
+
`Session persists after this command completes. You can:\n` +
|
|
433
|
+
`- Send more commands: persistentSession=true, sessionId='${sessionId}'\n` +
|
|
434
|
+
`- Inspect session: TmuxSession tool with action='capture', sessionId='${sessionId}'\n` +
|
|
435
|
+
`- Kill session: TmuxSession tool with action='kill', sessionId='${sessionId}'`;
|
|
436
|
+
return this.createSuccessResult(result, {
|
|
437
|
+
executionTime: Date.now() - startTime,
|
|
438
|
+
sessionId,
|
|
439
|
+
persistent: true,
|
|
440
|
+
sessionCwd: cwd
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
catch (error) {
|
|
444
|
+
if (signal.aborted) {
|
|
445
|
+
return this.createErrorResult('Command was cancelled by user.');
|
|
446
|
+
}
|
|
447
|
+
return this.createErrorResult(`Failed to execute in persistent session: ${error.message}`);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
/**
|
|
451
|
+
* Checks if a command should be routed to a dedicated tool instead of Bash.
|
|
452
|
+
* Returns an error message with guidance if redirected, or null if allowed.
|
|
453
|
+
* @private
|
|
454
|
+
*/
|
|
455
|
+
checkToolRedirect(command) {
|
|
456
|
+
const trimmed = command.trim();
|
|
457
|
+
// File reading: cat, head, tail → Read tool
|
|
458
|
+
if (/^(cat|head|tail)\s+/.test(trimmed) && !trimmed.includes('|') && !trimmed.includes('>')) {
|
|
459
|
+
return `Use the Read tool instead of \`${trimmed.split(/\s+/)[0]}\` for reading files. ` +
|
|
460
|
+
`Example: Read({ file_path: "${trimmed.split(/\s+/).slice(1).join(' ').replace(/["']/g, '')}" })`;
|
|
461
|
+
}
|
|
462
|
+
// File editing: sed -i, awk -i → Edit tool
|
|
463
|
+
if (/^sed\s+(-i|--in-place)\b/.test(trimmed) || /^perl\s+-[pn]?i\b/.test(trimmed)) {
|
|
464
|
+
return `Use the Edit tool instead of \`${trimmed.split(/\s+/)[0]}\` for editing files. ` +
|
|
465
|
+
`Read the file first, then use Edit({ file_path, old_string, new_string }).`;
|
|
466
|
+
}
|
|
467
|
+
// File writing: echo > file, cat > file, tee file → Write tool
|
|
468
|
+
if (/^(echo|printf|cat)\s+.*\s+>\s+\S/.test(trimmed) || /^tee\s+\S/.test(trimmed)) {
|
|
469
|
+
return `Use the Write tool instead of shell redirection for creating/writing files. ` +
|
|
470
|
+
`Example: Write({ file_path: "path", content: "content" })`;
|
|
471
|
+
}
|
|
472
|
+
// File searching: grep, rg, ag → Grep tool
|
|
473
|
+
if (/^(grep|rg|ag|ack)\s+/.test(trimmed) && !trimmed.includes('|')) {
|
|
474
|
+
return `Use the Grep tool instead of \`${trimmed.split(/\s+/)[0]}\` for searching file contents. ` +
|
|
475
|
+
`Example: Grep({ pattern: "search term", path: "directory" })`;
|
|
476
|
+
}
|
|
477
|
+
// File finding: find → Glob tool
|
|
478
|
+
if (/^find\s+/.test(trimmed) && /-name\b/.test(trimmed)) {
|
|
479
|
+
return `Use the Glob tool instead of \`find\` for finding files. ` +
|
|
480
|
+
`Example: Glob({ pattern: "**/*.ts", path: "directory" })`;
|
|
481
|
+
}
|
|
482
|
+
return null;
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
* Execute command in background — returns immediately with bash_id.
|
|
486
|
+
* The process is registered in BackgroundProcessRegistry for polling via BashOutput.
|
|
487
|
+
* @private
|
|
488
|
+
*/
|
|
489
|
+
executeInBackground(params, signal) {
|
|
490
|
+
const startTime = Date.now();
|
|
491
|
+
const isWindows = os.platform() === 'win32';
|
|
492
|
+
// Determine working directory
|
|
493
|
+
const cwd = params.directory
|
|
494
|
+
? path.resolve(this.config.workingDirectory, params.directory)
|
|
495
|
+
: this.config.workingDirectory;
|
|
496
|
+
// Generate a unique shell ID
|
|
497
|
+
const shellId = `bg-${crypto.randomBytes(4).toString('hex')}`;
|
|
498
|
+
try {
|
|
499
|
+
// Spawn process — do NOT wait for completion
|
|
500
|
+
const shell = isWindows
|
|
501
|
+
? spawn('cmd.exe', ['/c', params.command], {
|
|
502
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
503
|
+
cwd,
|
|
504
|
+
})
|
|
505
|
+
: spawn('bash', ['-c', params.command], {
|
|
506
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
507
|
+
detached: true,
|
|
508
|
+
cwd,
|
|
509
|
+
});
|
|
510
|
+
if (!shell.pid) {
|
|
511
|
+
return this.createErrorResult('Failed to spawn background process.');
|
|
512
|
+
}
|
|
513
|
+
// Register in BackgroundProcessRegistry — this sets up output capture and exit monitoring
|
|
514
|
+
const registry = BackgroundProcessRegistry.getInstance();
|
|
515
|
+
registry.registerProcess(shellId, shell.pid, params.command, shell);
|
|
516
|
+
// Unref the process so it doesn't prevent Node.js from exiting
|
|
517
|
+
shell.unref();
|
|
518
|
+
const result = `Background process started with ID: ${shellId}\n` +
|
|
519
|
+
`PID: ${shell.pid}\n` +
|
|
520
|
+
`Command: ${params.command}\n\n` +
|
|
521
|
+
`Use BashOutput({ bash_id: "${shellId}" }) to check output.\n` +
|
|
522
|
+
`Use KillShell({ shell_id: "${shellId}" }) to stop.`;
|
|
523
|
+
return {
|
|
524
|
+
...this.createSuccessResult(result),
|
|
525
|
+
metadata: {
|
|
526
|
+
executionTime: Date.now() - startTime,
|
|
527
|
+
bash_id: shellId,
|
|
528
|
+
pid: shell.pid,
|
|
529
|
+
backgroundProcess: true,
|
|
530
|
+
},
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
catch (error) {
|
|
534
|
+
return this.createErrorResult(`Failed to start background process: ${error.message}`);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
/**
|
|
538
|
+
* Removes ANSI escape codes from string
|
|
539
|
+
* @private
|
|
540
|
+
*/
|
|
541
|
+
stripAnsi(str) {
|
|
542
|
+
// eslint-disable-next-line no-control-regex
|
|
543
|
+
return str.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, '');
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
//# sourceMappingURL=ShellTool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShellTool.js","sourceRoot":"","sources":["../../../src/implementations/execution/ShellTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WorkspaceManager Tool Executor
|
|
3
|
+
*
|
|
4
|
+
* Manages git worktrees for isolated multi-agent parallel development.
|
|
5
|
+
* Supports creating worktrees from local repos, cloning external repos,
|
|
6
|
+
* diffing changes, and cleanup.
|
|
7
|
+
*
|
|
8
|
+
* Security: all git/gh invocations use execFile with an argument array (no shell).
|
|
9
|
+
* Repo/branch inputs are validated through GitPolicy; the auth token rides only in the
|
|
10
|
+
* subprocess environment, never in a clone URL or on argv. See GitPolicy.ts.
|
|
11
|
+
*/
|
|
12
|
+
import { BaseTool, type ToolResult } from '../../base/index.js';
|
|
13
|
+
import type { ExecutorConfig } from '../../base/ToolRegistry.js';
|
|
14
|
+
export interface WorkspaceManagerParams {
|
|
15
|
+
mode: 'create' | 'clone' | 'status' | 'diff' | 'cleanup';
|
|
16
|
+
repo?: string;
|
|
17
|
+
branch?: string;
|
|
18
|
+
baseBranch?: string;
|
|
19
|
+
worktreePath?: string;
|
|
20
|
+
/** For cleanup: also remove this clone directory (returned by clone mode). */
|
|
21
|
+
cloneDir?: string;
|
|
22
|
+
maxDiffLines?: number;
|
|
23
|
+
}
|
|
24
|
+
export declare class WorkspaceManagerTool extends BaseTool<WorkspaceManagerParams, ToolResult> {
|
|
25
|
+
private workingDirectory;
|
|
26
|
+
private readonly policy;
|
|
27
|
+
constructor(config: ExecutorConfig);
|
|
28
|
+
validateToolParams(params: WorkspaceManagerParams): string | null;
|
|
29
|
+
execute(params: WorkspaceManagerParams, signal: AbortSignal): Promise<ToolResult>;
|
|
30
|
+
/** git invocation: execFile (no shell), policy token/host env, AbortSignal. */
|
|
31
|
+
private git;
|
|
32
|
+
private createWorktree;
|
|
33
|
+
private cloneAndWorktree;
|
|
34
|
+
private listWorktrees;
|
|
35
|
+
private diffWorktree;
|
|
36
|
+
private cleanupWorktree;
|
|
37
|
+
/** Best-effort gh availability probe (used to pick the clone path). */
|
|
38
|
+
private ghAvailable;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=WorkspaceManagerTool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkspaceManagerTool.d.ts","sourceRoot":"","sources":["../../../src/implementations/execution/WorkspaceManagerTool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAgBjE,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,oBAAqB,SAAQ,QAAQ,CAAC,sBAAsB,EAAE,UAAU,CAAC;IACpF,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;gBAEvB,MAAM,EAAE,cAAc;IA8BlC,kBAAkB,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,GAAG,IAAI;IA2C3D,OAAO,CAAC,MAAM,EAAE,sBAAsB,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAqBvF,+EAA+E;IAC/E,OAAO,CAAC,GAAG;YAWG,cAAc;YA6Cd,gBAAgB;YA2DhB,aAAa;YAyCb,YAAY;YA+CZ,eAAe;IAkF7B,uEAAuE;YACzD,WAAW;CAQ1B"}
|