@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,266 @@
|
|
|
1
|
+
import { BaseTool } from '../../base/BaseTool.js';
|
|
2
|
+
import { CreateArtifactToolExecutor } from './CreateArtifactTool.js';
|
|
3
|
+
import { visualBridge } from './VisualFeedbackBridge.js';
|
|
4
|
+
import { broadcaster } from './SandboxEventBroadcaster.js';
|
|
5
|
+
import { rebuildReactBundle } from './ReactArtifactBuilder.js';
|
|
6
|
+
import { promises as fs } from 'fs';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
/**
|
|
9
|
+
* ModifySandboxTool - Edit sandbox code with automatic hot reload and verification
|
|
10
|
+
*
|
|
11
|
+
* This tool provides a higher-level interface than raw Write tool:
|
|
12
|
+
* - Edits files within the sandbox directory
|
|
13
|
+
* - Waits for hot reload to complete
|
|
14
|
+
* - Captures visual snapshot after changes
|
|
15
|
+
* - Verifies changes took effect
|
|
16
|
+
*
|
|
17
|
+
* Advantages over Write tool:
|
|
18
|
+
* 1. Sandbox-aware - knows sandbox directory structure
|
|
19
|
+
* 2. Hot reload integration - waits for restart
|
|
20
|
+
* 3. Automatic verification - captures post-edit snapshot
|
|
21
|
+
* 4. Error detection - checks if reload succeeded
|
|
22
|
+
*
|
|
23
|
+
* Use Cases:
|
|
24
|
+
* 1. Iterative development - Edit → See → Edit again
|
|
25
|
+
* 2. Bug fixing - Modify code, verify fix visually
|
|
26
|
+
* 3. Feature addition - Add code, test immediately
|
|
27
|
+
* 4. Styling - Change CSS, see results instantly
|
|
28
|
+
*
|
|
29
|
+
* Example:
|
|
30
|
+
* ```
|
|
31
|
+
* await modifySandbox({
|
|
32
|
+
* sandboxId: "abc-123",
|
|
33
|
+
* file: "index.js",
|
|
34
|
+
* content: "// fixed code",
|
|
35
|
+
* waitForReload: true,
|
|
36
|
+
* captureAfterReload: true
|
|
37
|
+
* });
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export class ModifySandboxExecutor extends BaseTool {
|
|
41
|
+
sandboxDir;
|
|
42
|
+
constructor(config) {
|
|
43
|
+
const schema = {
|
|
44
|
+
type: 'object',
|
|
45
|
+
properties: {
|
|
46
|
+
sandboxId: {
|
|
47
|
+
type: 'string',
|
|
48
|
+
description: 'Unique ID of the sandbox to modify'
|
|
49
|
+
},
|
|
50
|
+
file: {
|
|
51
|
+
type: 'string',
|
|
52
|
+
description: 'Filename to edit (relative to sandbox directory, e.g., "index.js")'
|
|
53
|
+
},
|
|
54
|
+
content: {
|
|
55
|
+
type: 'string',
|
|
56
|
+
description: 'New file content'
|
|
57
|
+
},
|
|
58
|
+
waitForReload: {
|
|
59
|
+
type: 'boolean',
|
|
60
|
+
description: 'Wait for hot reload to complete (default: true for dev mode)'
|
|
61
|
+
},
|
|
62
|
+
captureAfterReload: {
|
|
63
|
+
type: 'boolean',
|
|
64
|
+
description: 'Capture visual snapshot after reload (default: true)'
|
|
65
|
+
},
|
|
66
|
+
verifyChanges: {
|
|
67
|
+
type: 'boolean',
|
|
68
|
+
description: 'Verify changes via visual diff (default: false, expensive)'
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
required: ['sandboxId', 'file', 'content']
|
|
72
|
+
};
|
|
73
|
+
super('ModifySandbox', 'ModifySandbox', 'Edit sandbox code with automatic hot reload and visual verification', schema);
|
|
74
|
+
this.sandboxDir = join(config.workingDirectory, '.addon-tools');
|
|
75
|
+
}
|
|
76
|
+
validateToolParams(params) {
|
|
77
|
+
if (!params.sandboxId || params.sandboxId.trim().length === 0) {
|
|
78
|
+
return 'sandboxId is required';
|
|
79
|
+
}
|
|
80
|
+
if (!params.file || params.file.trim().length === 0) {
|
|
81
|
+
return 'file is required';
|
|
82
|
+
}
|
|
83
|
+
// Prevent path traversal
|
|
84
|
+
if (params.file.includes('..') || params.file.startsWith('/')) {
|
|
85
|
+
return 'file must be a relative path within the sandbox (no .. or absolute paths)';
|
|
86
|
+
}
|
|
87
|
+
if (params.content === undefined || params.content === null) {
|
|
88
|
+
return 'content is required (can be empty string for clearing file)';
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
async execute(params, signal) {
|
|
93
|
+
const startTime = Date.now();
|
|
94
|
+
const validationError = this.validateToolParams(params);
|
|
95
|
+
if (validationError) {
|
|
96
|
+
return this.createErrorResult(validationError);
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
// Get sandbox session
|
|
100
|
+
const session = CreateArtifactToolExecutor.getActiveSandbox(params.sandboxId);
|
|
101
|
+
if (!session) {
|
|
102
|
+
return this.createErrorResult(`Sandbox not found: ${params.sandboxId}. It may have been stopped or never existed.`);
|
|
103
|
+
}
|
|
104
|
+
// Prefer the session's real served/built directory (the workspace). Fall back to the
|
|
105
|
+
// legacy reconstructed path only if the session didn't record one.
|
|
106
|
+
const sandboxPath = session.path || join(this.sandboxDir, params.sandboxId);
|
|
107
|
+
// Verify sandbox directory exists
|
|
108
|
+
try {
|
|
109
|
+
await fs.access(sandboxPath);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return this.createErrorResult(`Sandbox directory not found: ${sandboxPath}`);
|
|
113
|
+
}
|
|
114
|
+
// Capture snapshot before modification (for comparison)
|
|
115
|
+
let snapshotBefore = session.visualSnapshot;
|
|
116
|
+
if (params.verifyChanges && session.url) {
|
|
117
|
+
try {
|
|
118
|
+
await visualBridge.initialize();
|
|
119
|
+
snapshotBefore = await visualBridge.captureSnapshot(session.url);
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
console.warn('Could not capture before snapshot:', error);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Write new file content
|
|
126
|
+
const filePath = join(sandboxPath, params.file);
|
|
127
|
+
await fs.writeFile(filePath, params.content, 'utf-8');
|
|
128
|
+
// Emit file changed event
|
|
129
|
+
broadcaster.emitFileChange(params.sandboxId, params.file, 'modified');
|
|
130
|
+
// React bundled artifacts: re-run esbuild so the served bundle reflects the edit
|
|
131
|
+
// (the static http-server has no process to hot-reload). No-op for CDN/non-React.
|
|
132
|
+
let reactRebuilt = false;
|
|
133
|
+
const rebuild = await rebuildReactBundle(sandboxPath);
|
|
134
|
+
if (rebuild.rebuilt) {
|
|
135
|
+
reactRebuilt = true;
|
|
136
|
+
broadcaster.emitHotReload(params.sandboxId, params.file);
|
|
137
|
+
}
|
|
138
|
+
else if (rebuild.error) {
|
|
139
|
+
console.warn(`[ModifySandbox] React re-bundle failed: ${rebuild.error}`);
|
|
140
|
+
}
|
|
141
|
+
// Determine if we should wait for reload
|
|
142
|
+
const waitForReload = params.waitForReload ?? (session.mode === 'dev');
|
|
143
|
+
const captureAfterReload = params.captureAfterReload ?? true;
|
|
144
|
+
let snapshotAfter = null;
|
|
145
|
+
let reloadWaitTime = 0;
|
|
146
|
+
if (waitForReload) {
|
|
147
|
+
// Wait for hot reload to complete
|
|
148
|
+
// Hot reload typically takes:
|
|
149
|
+
// - 100-500ms to detect file change
|
|
150
|
+
// - 1-2s to restart process
|
|
151
|
+
// - 500ms for server to be ready
|
|
152
|
+
reloadWaitTime = 3000; // 3 seconds total
|
|
153
|
+
await this.wait(reloadWaitTime);
|
|
154
|
+
// Capture snapshot after reload
|
|
155
|
+
if (captureAfterReload && session.url) {
|
|
156
|
+
try {
|
|
157
|
+
await visualBridge.initialize();
|
|
158
|
+
snapshotAfter = await visualBridge.captureSnapshot(session.url);
|
|
159
|
+
session.visualSnapshot = snapshotAfter;
|
|
160
|
+
session.lastActivity = new Date();
|
|
161
|
+
// Emit screenshot captured event
|
|
162
|
+
broadcaster.emitScreenshot(params.sandboxId, snapshotAfter.screenshot, session.url);
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
console.warn('Could not capture after snapshot:', error);
|
|
166
|
+
broadcaster.emitError(params.sandboxId, error);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Compute visual diff if requested
|
|
171
|
+
let visualDiff = null;
|
|
172
|
+
if (params.verifyChanges && snapshotBefore && snapshotAfter) {
|
|
173
|
+
// TODO: Implement getVisualDiff in VisualFeedbackBridge
|
|
174
|
+
// For now, skip visual diff
|
|
175
|
+
console.warn('Visual diff not yet implemented');
|
|
176
|
+
}
|
|
177
|
+
// Format output
|
|
178
|
+
const output = this.formatModificationOutput(session, params, snapshotAfter, visualDiff, reloadWaitTime, reactRebuilt);
|
|
179
|
+
return {
|
|
180
|
+
...this.createSuccessResult(output),
|
|
181
|
+
metadata: {
|
|
182
|
+
executionTime: Date.now() - startTime,
|
|
183
|
+
sandboxId: params.sandboxId,
|
|
184
|
+
fileModified: params.file,
|
|
185
|
+
bytesWritten: params.content.length,
|
|
186
|
+
waitedForReload: waitForReload,
|
|
187
|
+
reloadWaitTime,
|
|
188
|
+
capturedSnapshot: !!snapshotAfter,
|
|
189
|
+
hasVisualDiff: !!visualDiff,
|
|
190
|
+
reactRebuilt
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
return this.createErrorResult(`Failed to modify sandbox: ${error.message}`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Wait helper
|
|
200
|
+
*/
|
|
201
|
+
wait(ms) {
|
|
202
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Format modification output for model consumption
|
|
206
|
+
*/
|
|
207
|
+
formatModificationOutput(session, params, snapshotAfter, visualDiff, reloadWaitTime, reactRebuilt) {
|
|
208
|
+
const lines = [];
|
|
209
|
+
lines.push(`# ✏ Sandbox Modified: ${session.name}`);
|
|
210
|
+
lines.push('');
|
|
211
|
+
lines.push(`**Sandbox ID**: ${session.id}`);
|
|
212
|
+
lines.push(`**File Modified**: ${params.file}`);
|
|
213
|
+
lines.push(`**Bytes Written**: ${params.content.length}`);
|
|
214
|
+
lines.push('');
|
|
215
|
+
if (reactRebuilt) {
|
|
216
|
+
lines.push('## React Re-bundle');
|
|
217
|
+
lines.push('');
|
|
218
|
+
lines.push('[OK] esbuild re-bundled the React source; the served bundle now reflects your edit.');
|
|
219
|
+
lines.push('');
|
|
220
|
+
}
|
|
221
|
+
if (params.waitForReload) {
|
|
222
|
+
lines.push('## Hot Reload');
|
|
223
|
+
lines.push('');
|
|
224
|
+
lines.push(`[OK] Waited ${reloadWaitTime}ms for hot reload to complete`);
|
|
225
|
+
lines.push('[OK] Process restarted automatically');
|
|
226
|
+
lines.push('');
|
|
227
|
+
}
|
|
228
|
+
if (snapshotAfter) {
|
|
229
|
+
lines.push('---');
|
|
230
|
+
lines.push('');
|
|
231
|
+
lines.push('## Visual State After Modification');
|
|
232
|
+
lines.push('');
|
|
233
|
+
lines.push(visualBridge.formatForModel(snapshotAfter));
|
|
234
|
+
lines.push('');
|
|
235
|
+
}
|
|
236
|
+
if (visualDiff) {
|
|
237
|
+
lines.push('---');
|
|
238
|
+
lines.push('');
|
|
239
|
+
lines.push('## Visual Diff');
|
|
240
|
+
lines.push('');
|
|
241
|
+
lines.push(`**Changes Detected**: ${visualDiff.hasChanges ? 'Yes' : 'No'}`);
|
|
242
|
+
if (visualDiff.hasChanges) {
|
|
243
|
+
lines.push('');
|
|
244
|
+
lines.push('**What Changed**:');
|
|
245
|
+
if (visualDiff.domDiff) {
|
|
246
|
+
lines.push(`- DOM: ${visualDiff.domDiff.added || 0} additions, ${visualDiff.domDiff.removed || 0} removals`);
|
|
247
|
+
}
|
|
248
|
+
if (visualDiff.screenshotDiff) {
|
|
249
|
+
lines.push(`- Visual: ${visualDiff.screenshotDiff.percentDiff}% pixels changed`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
lines.push('');
|
|
253
|
+
}
|
|
254
|
+
lines.push('---');
|
|
255
|
+
lines.push('');
|
|
256
|
+
lines.push('**Status**: File successfully modified');
|
|
257
|
+
lines.push('');
|
|
258
|
+
lines.push('**Next Steps**:');
|
|
259
|
+
lines.push('- Verify changes look correct in visual snapshot above');
|
|
260
|
+
lines.push('- Test functionality (Use InteractWithSandbox)');
|
|
261
|
+
lines.push('- Continue editing if needed (Call ModifySandbox again)');
|
|
262
|
+
lines.push('- Inspect detailed state (Use InspectSandbox)');
|
|
263
|
+
return lines.join('\n');
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=ModifySandboxTool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModifySandboxTool.js","sourceRoot":"","sources":["../../../src/implementations/addon/ModifySandboxTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface ReactBuildOptions {
|
|
2
|
+
/** The user's entry component source. Should define (or default-export) `App`. */
|
|
3
|
+
code: string;
|
|
4
|
+
/** Extra source modules for bundled mode, e.g. { path: 'components/Button.tsx', code }. */
|
|
5
|
+
additionalFiles?: Array<{
|
|
6
|
+
path: string;
|
|
7
|
+
code: string;
|
|
8
|
+
}>;
|
|
9
|
+
/** Force a mode. Default: 'bundled' if esbuild is installed, else 'cdn'. */
|
|
10
|
+
reactMode?: 'cdn' | 'bundled';
|
|
11
|
+
/** Pin the CDN React version (cdn mode). Default 18. */
|
|
12
|
+
cdnReactVersion?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface ReactBuildResult {
|
|
15
|
+
mode: 'cdn' | 'bundled';
|
|
16
|
+
warnings: string[];
|
|
17
|
+
}
|
|
18
|
+
export declare function buildReactArtifact(artifactPath: string, opts: ReactBuildOptions): Promise<ReactBuildResult>;
|
|
19
|
+
/**
|
|
20
|
+
* Re-bundle a bundled React artifact after a source edit (Phase 3). No-op for CDN or
|
|
21
|
+
* non-React artifacts. Returns whether a bundle was produced.
|
|
22
|
+
*/
|
|
23
|
+
export declare function rebuildReactBundle(artifactPath: string): Promise<{
|
|
24
|
+
rebuilt: boolean;
|
|
25
|
+
error?: string;
|
|
26
|
+
}>;
|
|
27
|
+
//# sourceMappingURL=ReactArtifactBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReactArtifactBuilder.d.ts","sourceRoot":"","sources":["../../../src/implementations/addon/ReactArtifactBuilder.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,iBAAiB;IAChC,kFAAkF;IAClF,IAAI,EAAE,MAAM,CAAC;IACb,2FAA2F;IAC3F,eAAe,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,4EAA4E;IAC5E,SAAS,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;IAC9B,wDAAwD;IACxD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,KAAK,GAAG,SAAS,CAAC;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAgCD,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,gBAAgB,CAAC,CAqB3B;AAoFD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAe/C"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React artifact builder — turns a user component into a static directory served by
|
|
3
|
+
* the existing http-server path. Two modes (react_artifact_templates_plan.md):
|
|
4
|
+
*
|
|
5
|
+
* - 'cdn' : single index.html, React dev UMD + @babel/standalone, JSX compiled in the
|
|
6
|
+
* browser with development:true so React records _debugSource (scan/grab see
|
|
7
|
+
* componentName + props + a sourceLocation of `App.tsx:line`). Zero deps.
|
|
8
|
+
* - 'bundled' : esbuild bundles src/* (react/react-dom resolved from THIS package — no
|
|
9
|
+
* per-artifact npm install) with real source maps + jsxDev, so grab's
|
|
10
|
+
* sourceLocation points at real `src/App.tsx:line:col`. Optional dep; falls
|
|
11
|
+
* back to 'cdn' when esbuild is unavailable.
|
|
12
|
+
*
|
|
13
|
+
* Both write index.html and let CreateArtifactTool serve via `npx http-server`.
|
|
14
|
+
*/
|
|
15
|
+
import { promises as fs } from 'fs';
|
|
16
|
+
import { join, dirname } from 'path';
|
|
17
|
+
import { createRequire } from 'module';
|
|
18
|
+
const require_ = createRequire(import.meta.url);
|
|
19
|
+
/** Ensure the entry source default-exports an `App` (idempotent). */
|
|
20
|
+
function ensureDefaultExport(code) {
|
|
21
|
+
if (/export\s+default/.test(code))
|
|
22
|
+
return code;
|
|
23
|
+
if (/(?:function|const|let|class)\s+App\b/.test(code)) {
|
|
24
|
+
return `${code}\nexport default App;\n`;
|
|
25
|
+
}
|
|
26
|
+
return code; // user wrote their own structure; leave as-is
|
|
27
|
+
}
|
|
28
|
+
/** CDN mode: strip module syntax React can't run inline (imports of react / export kw). */
|
|
29
|
+
function stripForInlineScript(code) {
|
|
30
|
+
return code
|
|
31
|
+
.replace(/^\s*import\s+[^;]*?from\s+['"]react(?:-dom)?(?:\/[^'"]*)?['"];?\s*$/gm, '')
|
|
32
|
+
.replace(/^\s*export\s+default\s+function\b/gm, 'function')
|
|
33
|
+
.replace(/^\s*export\s+default\s+class\b/gm, 'class')
|
|
34
|
+
.replace(/^\s*export\s+default\s+/gm, 'const __default = ')
|
|
35
|
+
.replace(/^\s*export\s+/gm, '');
|
|
36
|
+
}
|
|
37
|
+
function isBundledAvailable() {
|
|
38
|
+
try {
|
|
39
|
+
require_.resolve('esbuild');
|
|
40
|
+
require_.resolve('react');
|
|
41
|
+
require_.resolve('react-dom');
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export async function buildReactArtifact(artifactPath, opts) {
|
|
49
|
+
const warnings = [];
|
|
50
|
+
let mode = opts.reactMode ?? (isBundledAvailable() ? 'bundled' : 'cdn');
|
|
51
|
+
if (mode === 'bundled' && !isBundledAvailable()) {
|
|
52
|
+
warnings.push('Bundled mode requested but esbuild/react not installed — falling back to CDN mode.');
|
|
53
|
+
mode = 'cdn';
|
|
54
|
+
}
|
|
55
|
+
if (mode === 'bundled') {
|
|
56
|
+
try {
|
|
57
|
+
await buildBundled(artifactPath, opts);
|
|
58
|
+
return { mode: 'bundled', warnings };
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
warnings.push(`esbuild bundle failed (${err.message}); falling back to CDN mode.`);
|
|
62
|
+
mode = 'cdn';
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
await buildCdn(artifactPath, opts, warnings);
|
|
66
|
+
return { mode: 'cdn', warnings };
|
|
67
|
+
}
|
|
68
|
+
async function buildCdn(artifactPath, opts, warnings) {
|
|
69
|
+
if (opts.additionalFiles?.length) {
|
|
70
|
+
warnings.push('additionalFiles are ignored in CDN mode — use bundled mode for multi-file artifacts.');
|
|
71
|
+
}
|
|
72
|
+
const version = opts.cdnReactVersion ?? '18';
|
|
73
|
+
const userSource = stripForInlineScript(ensureDefaultExport(opts.code));
|
|
74
|
+
// Keep the user source verbatim in a non-executing block; a bootstrap compiles it with
|
|
75
|
+
// @babel/standalone using development:true (records JSX _debugSource), then renders <App/>.
|
|
76
|
+
const html = `<!DOCTYPE html>
|
|
77
|
+
<html lang="en">
|
|
78
|
+
<head>
|
|
79
|
+
<meta charset="UTF-8" />
|
|
80
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
81
|
+
<title>React Artifact</title>
|
|
82
|
+
<script crossorigin src="https://unpkg.com/react@${version}/umd/react.development.js"></script>
|
|
83
|
+
<script crossorigin src="https://unpkg.com/react-dom@${version}/umd/react-dom.development.js"></script>
|
|
84
|
+
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
|
|
85
|
+
</head>
|
|
86
|
+
<body>
|
|
87
|
+
<div id="root"></div>
|
|
88
|
+
<script type="text/plain" id="cortex-app-source">${escapeForScript(userSource)}</script>
|
|
89
|
+
<script>
|
|
90
|
+
(function () {
|
|
91
|
+
try {
|
|
92
|
+
var src = document.getElementById('cortex-app-source').textContent;
|
|
93
|
+
var out = Babel.transform(src, {
|
|
94
|
+
presets: [['react', { development: true }], 'typescript'],
|
|
95
|
+
filename: 'App.tsx'
|
|
96
|
+
}).code;
|
|
97
|
+
// Indirect eval -> global scope, so 'App' is reachable by the render call below.
|
|
98
|
+
(0, eval)(out);
|
|
99
|
+
var Root = (typeof App !== 'undefined') ? App
|
|
100
|
+
: (typeof __default !== 'undefined') ? __default : null;
|
|
101
|
+
if (!Root) throw new Error('No App component found. Name your component "App" or default-export it.');
|
|
102
|
+
ReactDOM.createRoot(document.getElementById('root')).render(React.createElement(Root));
|
|
103
|
+
} catch (e) {
|
|
104
|
+
document.getElementById('root').innerHTML =
|
|
105
|
+
'<pre style="color:#c00;white-space:pre-wrap">React artifact error:\\n' +
|
|
106
|
+
String(e && e.message || e) + '</pre>';
|
|
107
|
+
console.error('[react-artifact]', e);
|
|
108
|
+
}
|
|
109
|
+
})();
|
|
110
|
+
</script>
|
|
111
|
+
</body>
|
|
112
|
+
</html>
|
|
113
|
+
`;
|
|
114
|
+
await fs.writeFile(join(artifactPath, 'index.html'), html);
|
|
115
|
+
}
|
|
116
|
+
/** Re-run esbuild for an already-scaffolded bundled artifact (src/main.tsx present). */
|
|
117
|
+
async function runEsbuild(artifactPath) {
|
|
118
|
+
const esbuild = require_('esbuild');
|
|
119
|
+
// Resolve react/react-dom from THIS package's node_modules — never per-artifact install.
|
|
120
|
+
const reactDir = dirname(require_.resolve('react/package.json'));
|
|
121
|
+
const reactDomDir = dirname(require_.resolve('react-dom/package.json'));
|
|
122
|
+
const reactNodeModules = join(reactDir, '..');
|
|
123
|
+
await esbuild.build({
|
|
124
|
+
entryPoints: [join(artifactPath, 'src', 'main.tsx')],
|
|
125
|
+
bundle: true,
|
|
126
|
+
outfile: join(artifactPath, 'dist', 'bundle.js'),
|
|
127
|
+
sourcemap: true, // dist/bundle.js.map references src/*.tsx
|
|
128
|
+
jsx: 'automatic',
|
|
129
|
+
jsxDev: true, // emit jsxDEV(...) with __source -> grab.sourceLocation
|
|
130
|
+
format: 'iife',
|
|
131
|
+
target: 'es2020',
|
|
132
|
+
define: { 'process.env.NODE_ENV': '"development"' },
|
|
133
|
+
nodePaths: [reactNodeModules], // bare 'react'/'react-dom' resolve here
|
|
134
|
+
// Dedup React: when the artifact builds INSIDE a monorepo, esbuild's upward
|
|
135
|
+
// node_modules walk can resolve the user's `import 'react'` and react-dom's internal
|
|
136
|
+
// `react` to DIFFERENT copies -> "Invalid hook call (more than one copy of React)" ->
|
|
137
|
+
// <App> crashes and #root stays empty (react-dom still registers a renderer, so detect
|
|
138
|
+
// reports react:true). Pin every react/react-dom (and subpaths) to ONE resolved dir.
|
|
139
|
+
alias: { 'react': reactDir, 'react-dom': reactDomDir },
|
|
140
|
+
logLevel: 'silent'
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Re-bundle a bundled React artifact after a source edit (Phase 3). No-op for CDN or
|
|
145
|
+
* non-React artifacts. Returns whether a bundle was produced.
|
|
146
|
+
*/
|
|
147
|
+
export async function rebuildReactBundle(artifactPath) {
|
|
148
|
+
try {
|
|
149
|
+
await fs.access(join(artifactPath, 'src', 'main.tsx'));
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return { rebuilt: false }; // not a bundled React artifact
|
|
153
|
+
}
|
|
154
|
+
if (!isBundledAvailable()) {
|
|
155
|
+
return { rebuilt: false, error: 'esbuild not available' };
|
|
156
|
+
}
|
|
157
|
+
try {
|
|
158
|
+
await runEsbuild(artifactPath);
|
|
159
|
+
return { rebuilt: true };
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
return { rebuilt: false, error: err.message };
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
async function buildBundled(artifactPath, opts) {
|
|
166
|
+
const srcDir = join(artifactPath, 'src');
|
|
167
|
+
await fs.mkdir(srcDir, { recursive: true });
|
|
168
|
+
await fs.writeFile(join(srcDir, 'App.tsx'), ensureDefaultExport(opts.code));
|
|
169
|
+
await fs.writeFile(join(srcDir, 'main.tsx'), `import { createRoot } from 'react-dom/client';\n` +
|
|
170
|
+
`import App from './App';\n` +
|
|
171
|
+
`const el = document.getElementById('root');\n` +
|
|
172
|
+
`if (el) createRoot(el).render(<App />);\n`);
|
|
173
|
+
for (const f of opts.additionalFiles ?? []) {
|
|
174
|
+
const dest = join(srcDir, f.path);
|
|
175
|
+
await fs.mkdir(dirname(dest), { recursive: true });
|
|
176
|
+
await fs.writeFile(dest, f.code);
|
|
177
|
+
}
|
|
178
|
+
await runEsbuild(artifactPath);
|
|
179
|
+
const html = `<!DOCTYPE html>
|
|
180
|
+
<html lang="en">
|
|
181
|
+
<head>
|
|
182
|
+
<meta charset="UTF-8" />
|
|
183
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
184
|
+
<title>React Artifact</title>
|
|
185
|
+
</head>
|
|
186
|
+
<body>
|
|
187
|
+
<div id="root"></div>
|
|
188
|
+
<script src="./dist/bundle.js"></script>
|
|
189
|
+
</body>
|
|
190
|
+
</html>
|
|
191
|
+
`;
|
|
192
|
+
await fs.writeFile(join(artifactPath, 'index.html'), html);
|
|
193
|
+
}
|
|
194
|
+
/** Make user source safe inside a <script> block (only </script> can break out). */
|
|
195
|
+
function escapeForScript(code) {
|
|
196
|
+
return code.replace(/<\/script>/gi, '<\\/script>');
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=ReactArtifactBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReactArtifactBuilder.js","sourceRoot":"","sources":["../../../src/implementations/addon/ReactArtifactBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
/**
|
|
3
|
+
* Event types emitted by sandboxes
|
|
4
|
+
*/
|
|
5
|
+
export type SandboxEventType = 'sandbox-created' | 'sandbox-started' | 'sandbox-stopped' | 'file-changed' | 'console-log' | 'console-error' | 'console-warn' | 'network-request' | 'network-response' | 'screenshot-captured' | 'interaction-executed' | 'hot-reload-triggered' | 'process-restarted' | 'error-occurred';
|
|
6
|
+
/**
|
|
7
|
+
* Base event structure
|
|
8
|
+
*/
|
|
9
|
+
export interface SandboxEvent {
|
|
10
|
+
type: SandboxEventType;
|
|
11
|
+
sandboxId: string;
|
|
12
|
+
timestamp: number;
|
|
13
|
+
data: any;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* SandboxEventBroadcaster - Centralized event system for sandbox operations
|
|
17
|
+
*
|
|
18
|
+
* This singleton class provides real-time event broadcasting for all sandbox operations.
|
|
19
|
+
* It enables:
|
|
20
|
+
* - User real-time monitoring via WebSocket connections
|
|
21
|
+
* - Model observability of sandbox state changes
|
|
22
|
+
* - Debugging and audit trails
|
|
23
|
+
* - Multi-sandbox coordination
|
|
24
|
+
*
|
|
25
|
+
* Event Flow:
|
|
26
|
+
* 1. Tool (CreateAddon, Modify, Interact) emits event → broadcaster.emit()
|
|
27
|
+
* 2. Broadcaster stores event in history
|
|
28
|
+
* 3. Broadcaster notifies all listeners (WebSocket, logs, etc.)
|
|
29
|
+
* 4. User sees update in dashboard
|
|
30
|
+
*
|
|
31
|
+
* Example Usage:
|
|
32
|
+
* ```
|
|
33
|
+
* // In CreateAddonToolEnhanced
|
|
34
|
+
* broadcaster.emit({
|
|
35
|
+
* type: 'sandbox-created',
|
|
36
|
+
* sandboxId: session.id,
|
|
37
|
+
* timestamp: Date.now(),
|
|
38
|
+
* data: { name: session.name, url: session.url }
|
|
39
|
+
* });
|
|
40
|
+
*
|
|
41
|
+
* // In SandboxViewServer
|
|
42
|
+
* broadcaster.on('console-log', (event) => {
|
|
43
|
+
* io.to(event.sandboxId).emit('console-log', event.data);
|
|
44
|
+
* });
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare class SandboxEventBroadcaster extends EventEmitter {
|
|
48
|
+
private static instance;
|
|
49
|
+
/**
|
|
50
|
+
* Event history (last 1000 events per sandbox)
|
|
51
|
+
*/
|
|
52
|
+
private eventHistory;
|
|
53
|
+
/**
|
|
54
|
+
* Maximum events to keep per sandbox
|
|
55
|
+
*/
|
|
56
|
+
private readonly MAX_EVENTS_PER_SANDBOX;
|
|
57
|
+
private constructor();
|
|
58
|
+
/**
|
|
59
|
+
* Get singleton instance
|
|
60
|
+
*/
|
|
61
|
+
static getInstance(): SandboxEventBroadcaster;
|
|
62
|
+
/**
|
|
63
|
+
* Emit a sandbox event
|
|
64
|
+
*/
|
|
65
|
+
emitSandboxEvent(event: SandboxEvent): void;
|
|
66
|
+
/**
|
|
67
|
+
* Add event to history
|
|
68
|
+
*/
|
|
69
|
+
private addToHistory;
|
|
70
|
+
/**
|
|
71
|
+
* Get event history for a sandbox
|
|
72
|
+
*/
|
|
73
|
+
getHistory(sandboxId: string, limit?: number): SandboxEvent[];
|
|
74
|
+
/**
|
|
75
|
+
* Get all sandbox IDs with events
|
|
76
|
+
*/
|
|
77
|
+
getActiveSandboxes(): string[];
|
|
78
|
+
/**
|
|
79
|
+
* Clear history for a sandbox
|
|
80
|
+
*/
|
|
81
|
+
clearHistory(sandboxId: string): void;
|
|
82
|
+
/**
|
|
83
|
+
* Clear all history
|
|
84
|
+
*/
|
|
85
|
+
clearAllHistory(): void;
|
|
86
|
+
/**
|
|
87
|
+
* Helper: Emit console log
|
|
88
|
+
*/
|
|
89
|
+
emitConsoleLog(sandboxId: string, level: 'log' | 'error' | 'warn', message: string): void;
|
|
90
|
+
/**
|
|
91
|
+
* Helper: Emit file change
|
|
92
|
+
*/
|
|
93
|
+
emitFileChange(sandboxId: string, filePath: string, changeType: 'created' | 'modified' | 'deleted'): void;
|
|
94
|
+
/**
|
|
95
|
+
* Helper: Emit screenshot
|
|
96
|
+
*/
|
|
97
|
+
emitScreenshot(sandboxId: string, screenshot: string, url: string): void;
|
|
98
|
+
/**
|
|
99
|
+
* Helper: Emit network request
|
|
100
|
+
*/
|
|
101
|
+
emitNetworkRequest(sandboxId: string, method: string, url: string, status?: number): void;
|
|
102
|
+
/**
|
|
103
|
+
* Helper: Emit interaction
|
|
104
|
+
*/
|
|
105
|
+
emitInteraction(sandboxId: string, actionType: string, selector?: string, success?: boolean): void;
|
|
106
|
+
/**
|
|
107
|
+
* Helper: Emit hot reload
|
|
108
|
+
*/
|
|
109
|
+
emitHotReload(sandboxId: string, fileName: string): void;
|
|
110
|
+
/**
|
|
111
|
+
* Helper: Emit process restart
|
|
112
|
+
*/
|
|
113
|
+
emitProcessRestart(sandboxId: string, reason: string): void;
|
|
114
|
+
/**
|
|
115
|
+
* Helper: Emit error
|
|
116
|
+
*/
|
|
117
|
+
emitError(sandboxId: string, error: Error | string): void;
|
|
118
|
+
/**
|
|
119
|
+
* Subscribe to all events for a specific sandbox
|
|
120
|
+
*/
|
|
121
|
+
subscribeToSandbox(sandboxId: string, callback: (event: SandboxEvent) => void): () => void;
|
|
122
|
+
/**
|
|
123
|
+
* Subscribe to specific event type
|
|
124
|
+
*/
|
|
125
|
+
subscribeToEventType(eventType: SandboxEventType, callback: (event: SandboxEvent) => void): () => void;
|
|
126
|
+
/**
|
|
127
|
+
* Subscribe to all events
|
|
128
|
+
*/
|
|
129
|
+
subscribeToAll(callback: (event: SandboxEvent) => void): () => void;
|
|
130
|
+
/**
|
|
131
|
+
* Get event statistics
|
|
132
|
+
*/
|
|
133
|
+
getStats(): {
|
|
134
|
+
activeSandboxes: number;
|
|
135
|
+
totalEvents: number;
|
|
136
|
+
eventsByType: Record<string, number>;
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Export singleton instance
|
|
141
|
+
*/
|
|
142
|
+
export declare const broadcaster: SandboxEventBroadcaster;
|
|
143
|
+
//# sourceMappingURL=SandboxEventBroadcaster.d.ts.map
|