@within-7/minto 0.1.7 → 0.3.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/cli.js +155 -37
- package/dist/Tool.js +38 -0
- package/dist/Tool.js.map +3 -3
- package/dist/commands/agents/AgentsCommand.js +73 -49
- package/dist/commands/agents/AgentsCommand.js.map +2 -2
- package/dist/commands/agents/constants.js +1 -1
- package/dist/commands/agents/constants.js.map +1 -1
- package/dist/commands/agents/index.js +1 -1
- package/dist/commands/bug.js +74 -7
- package/dist/commands/bug.js.map +3 -3
- package/dist/commands/clear.js +3 -0
- package/dist/commands/clear.js.map +2 -2
- package/dist/commands/compact.js +37 -0
- package/dist/commands/compact.js.map +2 -2
- package/dist/commands/context.js +85 -0
- package/dist/commands/context.js.map +7 -0
- package/dist/commands/ctx_viz.js +18 -10
- package/dist/commands/ctx_viz.js.map +2 -2
- package/dist/commands/doctor.js +158 -12
- package/dist/commands/doctor.js.map +2 -2
- package/dist/commands/export.js +157 -0
- package/dist/commands/export.js.map +7 -0
- package/dist/commands/mcp-interactive.js +28 -18
- package/dist/commands/mcp-interactive.js.map +2 -2
- package/dist/commands/model.js +9 -7
- package/dist/commands/model.js.map +2 -2
- package/dist/commands/permissions.js +87 -0
- package/dist/commands/permissions.js.map +7 -0
- package/dist/commands/plugin/AddMarketplaceForm.js +3 -2
- package/dist/commands/plugin/AddMarketplaceForm.js.map +2 -2
- package/dist/commands/plugin/ConfirmDialog.js +2 -1
- package/dist/commands/plugin/ConfirmDialog.js.map +2 -2
- package/dist/commands/plugin/ErrorView.js +2 -1
- package/dist/commands/plugin/ErrorView.js.map +2 -2
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js +5 -4
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +2 -2
- package/dist/commands/plugin/InstalledPluginsManager.js +5 -4
- package/dist/commands/plugin/InstalledPluginsManager.js.map +2 -2
- package/dist/commands/plugin/MainMenu.js +2 -1
- package/dist/commands/plugin/MainMenu.js.map +2 -2
- package/dist/commands/plugin/MarketplaceManager.js +5 -4
- package/dist/commands/plugin/MarketplaceManager.js.map +2 -2
- package/dist/commands/plugin/MarketplaceSelector.js +4 -3
- package/dist/commands/plugin/MarketplaceSelector.js.map +2 -2
- package/dist/commands/plugin/PlaceholderScreen.js +3 -2
- package/dist/commands/plugin/PlaceholderScreen.js.map +2 -2
- package/dist/commands/plugin/PluginBrowser.js +6 -5
- package/dist/commands/plugin/PluginBrowser.js.map +2 -2
- package/dist/commands/plugin/PluginDetailsInstall.js +5 -4
- package/dist/commands/plugin/PluginDetailsInstall.js.map +2 -2
- package/dist/commands/plugin/PluginDetailsManage.js +4 -3
- package/dist/commands/plugin/PluginDetailsManage.js.map +2 -2
- package/dist/commands/plugin.js +16 -15
- package/dist/commands/plugin.js.map +2 -2
- package/dist/commands/quit.js +3 -1
- package/dist/commands/quit.js.map +2 -2
- package/dist/commands/sandbox.js +105 -0
- package/dist/commands/sandbox.js.map +7 -0
- package/dist/commands/setup.js +2 -1
- package/dist/commands/setup.js.map +2 -2
- package/dist/commands/status.js +59 -0
- package/dist/commands/status.js.map +7 -0
- package/dist/commands/tasks.js +108 -0
- package/dist/commands/tasks.js.map +7 -0
- package/dist/commands/todos.js +123 -0
- package/dist/commands/todos.js.map +7 -0
- package/dist/commands/undo.js +245 -0
- package/dist/commands/undo.js.map +7 -0
- package/dist/commands.js +22 -2
- package/dist/commands.js.map +2 -2
- package/dist/components/AgentThinkingBlock.js +10 -18
- package/dist/components/AgentThinkingBlock.js.map +2 -2
- package/dist/components/AsciiLogo.js +7 -8
- package/dist/components/AsciiLogo.js.map +2 -2
- package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
- package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
- package/dist/components/AskUserQuestionDialog/QuestionView.js +2 -1
- package/dist/components/AskUserQuestionDialog/QuestionView.js.map +2 -2
- package/dist/components/BackgroundTasksPanel.js +78 -29
- package/dist/components/BackgroundTasksPanel.js.map +2 -2
- package/dist/components/BashStreamingProgress.js +24 -0
- package/dist/components/BashStreamingProgress.js.map +7 -0
- package/dist/components/CollapsibleHint.js +15 -0
- package/dist/components/CollapsibleHint.js.map +7 -0
- package/dist/components/Config.js +3 -2
- package/dist/components/Config.js.map +2 -2
- package/dist/components/ConsoleOAuthFlow.js +2 -1
- package/dist/components/ConsoleOAuthFlow.js.map +2 -2
- package/dist/components/Cost.js +2 -1
- package/dist/components/Cost.js.map +2 -2
- package/dist/components/FileEditToolUpdatedMessage.js +1 -1
- package/dist/components/FileEditToolUpdatedMessage.js.map +2 -2
- package/dist/components/HeaderBar.js +13 -8
- package/dist/components/HeaderBar.js.map +2 -2
- package/dist/components/HistorySearchOverlay.js +4 -3
- package/dist/components/HistorySearchOverlay.js.map +2 -2
- package/dist/components/HotkeyHelpPanel.js +134 -0
- package/dist/components/HotkeyHelpPanel.js.map +7 -0
- package/dist/components/InvalidConfigDialog.js +2 -1
- package/dist/components/InvalidConfigDialog.js.map +2 -2
- package/dist/components/Logo.js +24 -68
- package/dist/components/Logo.js.map +2 -2
- package/dist/components/MCPServerApprovalDialog.js +2 -1
- package/dist/components/MCPServerApprovalDialog.js.map +2 -2
- package/dist/components/MCPServerDialogCopy.js +2 -1
- package/dist/components/MCPServerDialogCopy.js.map +2 -2
- package/dist/components/MCPServerMultiselectDialog.js +2 -1
- package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
- package/dist/components/Message.js +23 -7
- package/dist/components/Message.js.map +3 -3
- package/dist/components/MessageSelector.js +4 -3
- package/dist/components/MessageSelector.js.map +2 -2
- package/dist/components/ModeIndicator.js +2 -1
- package/dist/components/ModeIndicator.js.map +2 -2
- package/dist/components/ModelConfig.js +20 -6
- package/dist/components/ModelConfig.js.map +2 -2
- package/dist/components/ModelListManager.js +7 -6
- package/dist/components/ModelListManager.js.map +2 -2
- package/dist/components/ModelSelector/ModelSelector.js +27 -14
- package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
- package/dist/components/Onboarding.js +22 -16
- package/dist/components/Onboarding.js.map +2 -2
- package/dist/components/OperationSummary.js +130 -0
- package/dist/components/OperationSummary.js.map +7 -0
- package/dist/components/ProgressBar.js +74 -0
- package/dist/components/ProgressBar.js.map +7 -0
- package/dist/components/PromptInput.js +210 -87
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/RequestStatusIndicator.js +194 -0
- package/dist/components/RequestStatusIndicator.js.map +7 -0
- package/dist/components/SensitiveFileWarning.js +31 -0
- package/dist/components/SensitiveFileWarning.js.map +7 -0
- package/dist/components/Spinner.js +141 -27
- package/dist/components/Spinner.js.map +2 -2
- package/dist/components/SpinnerSymbol.js +21 -27
- package/dist/components/SpinnerSymbol.js.map +2 -2
- package/dist/components/StreamingBashOutput.js +9 -8
- package/dist/components/StreamingBashOutput.js.map +2 -2
- package/dist/components/StructuredDiff.js +6 -8
- package/dist/components/StructuredDiff.js.map +2 -2
- package/dist/components/SubagentBlock.js +5 -3
- package/dist/components/SubagentBlock.js.map +2 -2
- package/dist/components/SubagentProgress.js +17 -15
- package/dist/components/SubagentProgress.js.map +2 -2
- package/dist/components/TaskCard.js +30 -24
- package/dist/components/TaskCard.js.map +2 -2
- package/dist/components/TextInput.js +9 -1
- package/dist/components/TextInput.js.map +2 -2
- package/dist/components/TodoChangeBlock.js +1 -1
- package/dist/components/TodoChangeBlock.js.map +2 -2
- package/dist/components/TodoPanel.js +140 -31
- package/dist/components/TodoPanel.js.map +3 -3
- package/dist/components/TokenCounter.js +74 -0
- package/dist/components/TokenCounter.js.map +7 -0
- package/dist/components/TokenWarning.js +2 -1
- package/dist/components/TokenWarning.js.map +2 -2
- package/dist/components/ToolUseLoader.js +2 -2
- package/dist/components/ToolUseLoader.js.map +2 -2
- package/dist/components/TreeConnector.js +26 -0
- package/dist/components/TreeConnector.js.map +7 -0
- package/dist/components/TrustDialog.js +2 -1
- package/dist/components/TrustDialog.js.map +2 -2
- package/dist/components/TurnCompletionIndicator.js +18 -0
- package/dist/components/TurnCompletionIndicator.js.map +7 -0
- package/dist/components/binary-feedback/BinaryFeedbackView.js +2 -1
- package/dist/components/binary-feedback/BinaryFeedbackView.js.map +2 -2
- package/dist/components/messages/AssistantTextMessage.js +20 -9
- package/dist/components/messages/AssistantTextMessage.js.map +2 -2
- package/dist/components/messages/AssistantThinkingMessage.js +18 -3
- package/dist/components/messages/AssistantThinkingMessage.js.map +2 -2
- package/dist/components/messages/AssistantToolUseMessage.js +17 -10
- package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
- package/dist/components/messages/GroupRenderer.js +54 -0
- package/dist/components/messages/GroupRenderer.js.map +7 -0
- package/dist/components/messages/NestedTasksPreview.js +24 -0
- package/dist/components/messages/NestedTasksPreview.js.map +7 -0
- package/dist/components/messages/ParallelTasksGroupView.js +93 -0
- package/dist/components/messages/ParallelTasksGroupView.js.map +7 -0
- package/dist/components/messages/TaskInModuleView.js +218 -0
- package/dist/components/messages/TaskInModuleView.js.map +7 -0
- package/dist/components/messages/TaskOutputContent.js +56 -0
- package/dist/components/messages/TaskOutputContent.js.map +7 -0
- package/dist/components/messages/UserPromptMessage.js +2 -2
- package/dist/components/messages/UserPromptMessage.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +2 -3
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
- package/dist/components/permissions/FallbackPermissionRequest.js +4 -4
- package/dist/components/permissions/FallbackPermissionRequest.js.map +2 -2
- package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +4 -4
- package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +2 -2
- package/dist/constants/colors.js +120 -54
- package/dist/constants/colors.js.map +2 -2
- package/dist/constants/formatRules.js +102 -0
- package/dist/constants/formatRules.js.map +7 -0
- package/dist/constants/prompts.js +12 -34
- package/dist/constants/prompts.js.map +2 -2
- package/dist/constants/symbols.js +64 -6
- package/dist/constants/symbols.js.map +2 -2
- package/dist/constants/timing.js +5 -0
- package/dist/constants/timing.js.map +2 -2
- package/dist/constants/toolInputExamples.js +84 -0
- package/dist/constants/toolInputExamples.js.map +7 -0
- package/dist/core/backupManager.js +321 -0
- package/dist/core/backupManager.js.map +7 -0
- package/dist/core/config/defaults.js +84 -0
- package/dist/core/config/defaults.js.map +7 -0
- package/dist/core/config/index.js +111 -0
- package/dist/core/config/index.js.map +7 -0
- package/dist/core/config/loader.js +221 -0
- package/dist/core/config/loader.js.map +7 -0
- package/dist/core/config/migrations.js +128 -0
- package/dist/core/config/migrations.js.map +7 -0
- package/dist/core/config/schema.js +178 -0
- package/dist/core/config/schema.js.map +7 -0
- package/dist/core/costTracker.js +129 -0
- package/dist/core/costTracker.js.map +7 -0
- package/dist/core/gitAutoCommit.js +287 -0
- package/dist/core/gitAutoCommit.js.map +7 -0
- package/dist/core/index.js +8 -0
- package/dist/core/index.js.map +7 -0
- package/dist/core/operationTracker.js +212 -0
- package/dist/core/operationTracker.js.map +7 -0
- package/dist/core/permissions/auditLog.js +204 -0
- package/dist/core/permissions/auditLog.js.map +7 -0
- package/dist/core/permissions/engine/index.js +3 -0
- package/dist/core/permissions/engine/index.js.map +7 -0
- package/dist/core/permissions/engine/permissionEngine.js +106 -0
- package/dist/core/permissions/engine/permissionEngine.js.map +7 -0
- package/dist/core/permissions/engine/types.js +1 -0
- package/dist/core/permissions/engine/types.js.map +7 -0
- package/dist/core/permissions/index.js +84 -0
- package/dist/core/permissions/index.js.map +7 -0
- package/dist/core/permissions/ruleEngine.js +259 -0
- package/dist/core/permissions/ruleEngine.js.map +7 -0
- package/dist/core/permissions/rules/allowedToolsRule.js +62 -0
- package/dist/core/permissions/rules/allowedToolsRule.js.map +7 -0
- package/dist/core/permissions/rules/autoEscalationRule.js +296 -0
- package/dist/core/permissions/rules/autoEscalationRule.js.map +7 -0
- package/dist/core/permissions/rules/index.js +46 -0
- package/dist/core/permissions/rules/index.js.map +7 -0
- package/dist/core/permissions/rules/planModeRule.js +55 -0
- package/dist/core/permissions/rules/planModeRule.js.map +7 -0
- package/dist/core/permissions/rules/projectBoundaryRule.js +173 -0
- package/dist/core/permissions/rules/projectBoundaryRule.js.map +7 -0
- package/dist/core/permissions/rules/safeModeRule.js +65 -0
- package/dist/core/permissions/rules/safeModeRule.js.map +7 -0
- package/dist/core/permissions/rules/sensitivePathsRule.js +345 -0
- package/dist/core/permissions/rules/sensitivePathsRule.js.map +7 -0
- package/dist/core/permissions/types.js +127 -0
- package/dist/core/permissions/types.js.map +7 -0
- package/dist/core/tokenStats.js +9 -0
- package/dist/core/tokenStats.js.map +7 -0
- package/dist/core/tokenStatsManager.js +331 -0
- package/dist/core/tokenStatsManager.js.map +7 -0
- package/dist/core/tools/executor.js +143 -0
- package/dist/core/tools/executor.js.map +7 -0
- package/dist/core/tools/index.js +15 -0
- package/dist/core/tools/index.js.map +7 -0
- package/dist/core/tools/registry.js +183 -0
- package/dist/core/tools/registry.js.map +7 -0
- package/dist/core/tools/types.js +1 -0
- package/dist/core/tools/types.js.map +7 -0
- package/dist/cost-tracker.js +23 -15
- package/dist/cost-tracker.js.map +2 -2
- package/dist/entrypoints/cli.js +158 -130
- package/dist/entrypoints/cli.js.map +2 -2
- package/dist/entrypoints/mcp.js +12 -4
- package/dist/entrypoints/mcp.js.map +2 -2
- package/dist/history.js +14 -3
- package/dist/history.js.map +2 -2
- package/dist/hooks/useAgentTokenStats.js +72 -0
- package/dist/hooks/useAgentTokenStats.js.map +7 -0
- package/dist/hooks/useAgentTranscripts.js +140 -0
- package/dist/hooks/useAgentTranscripts.js.map +7 -0
- package/dist/hooks/useAnimationSync.js +53 -0
- package/dist/hooks/useAnimationSync.js.map +7 -0
- package/dist/hooks/useArrowKeyHistory.js +4 -2
- package/dist/hooks/useArrowKeyHistory.js.map +2 -2
- package/dist/hooks/useCanUseTool.js +3 -1
- package/dist/hooks/useCanUseTool.js.map +2 -2
- package/dist/hooks/useExitOnCtrlCD.js +9 -5
- package/dist/hooks/useExitOnCtrlCD.js.map +2 -2
- package/dist/hooks/useHookStatus.js +40 -0
- package/dist/hooks/useHookStatus.js.map +7 -0
- package/dist/hooks/useLogMessages.js +29 -2
- package/dist/hooks/useLogMessages.js.map +2 -2
- package/dist/hooks/useMessageGroups.js +43 -0
- package/dist/hooks/useMessageGroups.js.map +7 -0
- package/dist/hooks/useTerminalSize.js +62 -6
- package/dist/hooks/useTerminalSize.js.map +2 -2
- package/dist/hooks/useUnifiedCompletion.js +69 -0
- package/dist/hooks/useUnifiedCompletion.js.map +2 -2
- package/dist/i18n/index.js +109 -0
- package/dist/i18n/index.js.map +7 -0
- package/dist/i18n/locales/en.js +348 -0
- package/dist/i18n/locales/en.js.map +7 -0
- package/dist/i18n/locales/index.js +7 -0
- package/dist/i18n/locales/index.js.map +7 -0
- package/dist/i18n/locales/zh-CN.js +348 -0
- package/dist/i18n/locales/zh-CN.js.map +7 -0
- package/dist/i18n/types.js +8 -0
- package/dist/i18n/types.js.map +7 -0
- package/dist/permissions.js +28 -1
- package/dist/permissions.js.map +2 -2
- package/dist/query.js +253 -21
- package/dist/query.js.map +3 -3
- package/dist/screens/REPL.js +523 -194
- package/dist/screens/REPL.js.map +3 -3
- package/dist/services/adapters/chatCompletions.js +3 -1
- package/dist/services/adapters/chatCompletions.js.map +2 -2
- package/dist/services/adapters/messageNormalizer.js +354 -0
- package/dist/services/adapters/messageNormalizer.js.map +7 -0
- package/dist/services/adapters/responsesAPI.js +6 -3
- package/dist/services/adapters/responsesAPI.js.map +2 -2
- package/dist/services/checkpointManager.js +386 -0
- package/dist/services/checkpointManager.js.map +7 -0
- package/dist/services/claude.js +192 -14
- package/dist/services/claude.js.map +3 -3
- package/dist/services/compressionService.js +50 -1
- package/dist/services/compressionService.js.map +2 -2
- package/dist/services/contextMonitor.js +162 -0
- package/dist/services/contextMonitor.js.map +7 -0
- package/dist/services/customCommands.js +60 -41
- package/dist/services/customCommands.js.map +2 -2
- package/dist/services/hookExecutor.js +173 -1
- package/dist/services/hookExecutor.js.map +2 -2
- package/dist/services/intelligentCompactor.js +281 -0
- package/dist/services/intelligentCompactor.js.map +7 -0
- package/dist/services/lspConfig.js +109 -0
- package/dist/services/lspConfig.js.map +7 -0
- package/dist/services/mcpClient.js +338 -43
- package/dist/services/mcpClient.js.map +2 -2
- package/dist/services/modelOrchestrator.js +310 -0
- package/dist/services/modelOrchestrator.js.map +7 -0
- package/dist/services/openai.js +8 -1
- package/dist/services/openai.js.map +2 -2
- package/dist/services/outputStyles.js +138 -0
- package/dist/services/outputStyles.js.map +7 -0
- package/dist/services/plugins/index.js +5 -0
- package/dist/services/plugins/index.js.map +7 -0
- package/dist/services/plugins/lspServers.js +188 -0
- package/dist/services/plugins/lspServers.js.map +7 -0
- package/dist/services/plugins/pluginRuntime.js +229 -0
- package/dist/services/plugins/pluginRuntime.js.map +7 -0
- package/dist/services/plugins/pluginValidation.js +219 -0
- package/dist/services/plugins/pluginValidation.js.map +7 -0
- package/dist/services/plugins/skillMarketplace.js +556 -0
- package/dist/services/plugins/skillMarketplace.js.map +7 -0
- package/dist/services/responseStateManager.js +37 -3
- package/dist/services/responseStateManager.js.map +2 -2
- package/dist/services/sandbox/filesystemBoundary.js +341 -0
- package/dist/services/sandbox/filesystemBoundary.js.map +7 -0
- package/dist/services/sandbox/index.js +14 -0
- package/dist/services/sandbox/index.js.map +7 -0
- package/dist/services/sandbox/networkProxy.js +293 -0
- package/dist/services/sandbox/networkProxy.js.map +7 -0
- package/dist/services/sandbox/sandboxController.js +574 -0
- package/dist/services/sandbox/sandboxController.js.map +7 -0
- package/dist/services/sandbox/types.js +50 -0
- package/dist/services/sandbox/types.js.map +7 -0
- package/dist/services/sessionMemory.js +266 -0
- package/dist/services/sessionMemory.js.map +7 -0
- package/dist/services/taskRouter.js +324 -0
- package/dist/services/taskRouter.js.map +7 -0
- package/dist/tools/ArchitectTool/ArchitectTool.js +7 -1
- package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +6 -2
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +2 -1
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
- package/dist/tools/BaseTool.js +72 -0
- package/dist/tools/BaseTool.js.map +7 -0
- package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +3 -0
- package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +2 -2
- package/dist/tools/BashTool/BashTool.js +79 -3
- package/dist/tools/BashTool/BashTool.js.map +2 -2
- package/dist/tools/BashTool/BashToolResultMessage.js +3 -0
- package/dist/tools/BashTool/BashToolResultMessage.js.map +2 -2
- package/dist/tools/BashTool/OutputLine.js +54 -0
- package/dist/tools/BashTool/OutputLine.js.map +2 -2
- package/dist/tools/BashTool/prompt.js +336 -3
- package/dist/tools/BashTool/prompt.js.map +2 -2
- package/dist/tools/FileEditTool/FileEditTool.js +29 -4
- package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
- package/dist/tools/FileEditTool/prompt.js +6 -3
- package/dist/tools/FileEditTool/prompt.js.map +2 -2
- package/dist/tools/FileWriteTool/FileWriteTool.js +5 -5
- package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
- package/dist/tools/FileWriteTool/prompt.js +4 -2
- package/dist/tools/FileWriteTool/prompt.js.map +2 -2
- package/dist/tools/GlobTool/GlobTool.js +4 -2
- package/dist/tools/GlobTool/GlobTool.js.map +2 -2
- package/dist/tools/GrepTool/GrepTool.js +36 -7
- package/dist/tools/GrepTool/GrepTool.js.map +2 -2
- package/dist/tools/KillShellTool/KillShellToolResultMessage.js +3 -0
- package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +2 -2
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +109 -0
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +7 -0
- package/dist/tools/ListMcpResourcesTool/prompt.js +19 -0
- package/dist/tools/ListMcpResourcesTool/prompt.js.map +7 -0
- package/dist/tools/LspTool/LspTool.js +664 -0
- package/dist/tools/LspTool/LspTool.js.map +7 -0
- package/dist/tools/LspTool/prompt.js +27 -0
- package/dist/tools/LspTool/prompt.js.map +7 -0
- package/dist/tools/MCPTool/MCPTool.js +9 -1
- package/dist/tools/MCPTool/MCPTool.js.map +2 -2
- package/dist/tools/MemoryReadTool/MemoryReadTool.js +19 -6
- package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +6 -6
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js +19 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
- package/dist/tools/MultiEditTool/prompt.js +5 -3
- package/dist/tools/MultiEditTool/prompt.js.map +2 -2
- package/dist/tools/NotebookEditTool/NotebookEditTool.js +7 -2
- package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
- package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js +75 -0
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +7 -0
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js +109 -0
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +7 -0
- package/dist/tools/PlanModeTool/prompt.js +94 -0
- package/dist/tools/PlanModeTool/prompt.js.map +7 -0
- package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +130 -0
- package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +7 -0
- package/dist/tools/ReadMcpResourceTool/prompt.js +17 -0
- package/dist/tools/ReadMcpResourceTool/prompt.js.map +7 -0
- package/dist/tools/SkillTool/SkillTool.js +10 -4
- package/dist/tools/SkillTool/SkillTool.js.map +2 -2
- package/dist/tools/SkillTool/prompt.js +1 -1
- package/dist/tools/SkillTool/prompt.js.map +1 -1
- package/dist/tools/SlashCommandTool/SlashCommandTool.js +260 -0
- package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +7 -0
- package/dist/tools/SlashCommandTool/prompt.js +35 -0
- package/dist/tools/SlashCommandTool/prompt.js.map +7 -0
- package/dist/tools/TaskOutputTool/TaskOutputTool.js +190 -0
- package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +7 -0
- package/dist/tools/TaskOutputTool/prompt.js +15 -0
- package/dist/tools/TaskOutputTool/prompt.js.map +7 -0
- package/dist/tools/TaskTool/TaskTool.js +310 -104
- package/dist/tools/TaskTool/TaskTool.js.map +2 -2
- package/dist/tools/TaskTool/prompt.js.map +2 -2
- package/dist/tools/TodoWriteTool/TodoWriteTool.js +42 -77
- package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/URLFetcherTool.js +4 -1
- package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/cache.js +55 -8
- package/dist/tools/URLFetcherTool/cache.js.map +2 -2
- package/dist/tools.js +31 -2
- package/dist/tools.js.map +2 -2
- package/dist/types/hooks.js +4 -0
- package/dist/types/hooks.js.map +2 -2
- package/dist/types/marketplace.js.map +2 -2
- package/dist/types/messageGroup.js +36 -0
- package/dist/types/messageGroup.js.map +7 -0
- package/dist/types/plugin.js.map +2 -2
- package/dist/types/thinking.js +1 -0
- package/dist/types/thinking.js.map +7 -0
- package/dist/utils/BackgroundShellManager.js +136 -39
- package/dist/utils/BackgroundShellManager.js.map +2 -2
- package/dist/utils/CircuitBreaker.js +242 -0
- package/dist/utils/CircuitBreaker.js.map +7 -0
- package/dist/utils/MessageBatchBuffer.js +102 -0
- package/dist/utils/MessageBatchBuffer.js.map +7 -0
- package/dist/utils/PersistentShell.js +151 -1
- package/dist/utils/PersistentShell.js.map +2 -2
- package/dist/utils/agentLoader.js +1 -23
- package/dist/utils/agentLoader.js.map +2 -2
- package/dist/utils/agentTranscripts.js +641 -0
- package/dist/utils/agentTranscripts.js.map +7 -0
- package/dist/utils/animationManager.js +213 -0
- package/dist/utils/animationManager.js.map +7 -0
- package/dist/utils/animationSync.js +110 -0
- package/dist/utils/animationSync.js.map +7 -0
- package/dist/utils/ask.js +2 -0
- package/dist/utils/ask.js.map +2 -2
- package/dist/utils/asyncFile.js +215 -0
- package/dist/utils/asyncFile.js.map +7 -0
- package/dist/utils/backgroundAgentManager.js +231 -0
- package/dist/utils/backgroundAgentManager.js.map +7 -0
- package/dist/utils/config.js +108 -10
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/conversationRecovery.js +19 -0
- package/dist/utils/conversationRecovery.js.map +2 -2
- package/dist/utils/credentials/CredentialStore.js +1 -0
- package/dist/utils/credentials/CredentialStore.js.map +7 -0
- package/dist/utils/credentials/EncryptedFileStore.js +157 -0
- package/dist/utils/credentials/EncryptedFileStore.js.map +7 -0
- package/dist/utils/credentials/index.js +37 -0
- package/dist/utils/credentials/index.js.map +7 -0
- package/dist/utils/credentials/migration.js +82 -0
- package/dist/utils/credentials/migration.js.map +7 -0
- package/dist/utils/exit.js +73 -0
- package/dist/utils/exit.js.map +7 -0
- package/dist/utils/format.js +73 -5
- package/dist/utils/format.js.map +2 -2
- package/dist/utils/generators.js +76 -6
- package/dist/utils/generators.js.map +2 -2
- package/dist/utils/globalErrorHandler.js +149 -0
- package/dist/utils/globalErrorHandler.js.map +7 -0
- package/dist/utils/groupHandlers/index.js +8 -0
- package/dist/utils/groupHandlers/index.js.map +7 -0
- package/dist/utils/groupHandlers/parallelTasksHandler.js +140 -0
- package/dist/utils/groupHandlers/parallelTasksHandler.js.map +7 -0
- package/dist/utils/groupHandlers/taskHandler.js +104 -0
- package/dist/utils/groupHandlers/taskHandler.js.map +7 -0
- package/dist/utils/groupHandlers/types.js +1 -0
- package/dist/utils/groupHandlers/types.js.map +7 -0
- package/dist/utils/logRotation.js +224 -0
- package/dist/utils/logRotation.js.map +7 -0
- package/dist/utils/markdown.js +13 -1
- package/dist/utils/markdown.js.map +2 -2
- package/dist/utils/marketplaceManager.js +3 -5
- package/dist/utils/marketplaceManager.js.map +2 -2
- package/dist/utils/memSafety.js +264 -0
- package/dist/utils/memSafety.js.map +7 -0
- package/dist/utils/messageGroupManager.js +274 -0
- package/dist/utils/messageGroupManager.js.map +7 -0
- package/dist/utils/messages.js +13 -4
- package/dist/utils/messages.js.map +2 -2
- package/dist/utils/model.js +119 -15
- package/dist/utils/model.js.map +3 -3
- package/dist/utils/permissions/filesystem.js +162 -6
- package/dist/utils/permissions/filesystem.js.map +2 -2
- package/dist/utils/plan/planMode.js +143 -0
- package/dist/utils/plan/planMode.js.map +7 -0
- package/dist/utils/pluginLoader.js +17 -21
- package/dist/utils/pluginLoader.js.map +2 -2
- package/dist/utils/ripgrep.js +55 -2
- package/dist/utils/ripgrep.js.map +2 -2
- package/dist/utils/safePath.js +132 -0
- package/dist/utils/safePath.js.map +7 -0
- package/dist/utils/sanitizeInput.js +32 -0
- package/dist/utils/sanitizeInput.js.map +7 -0
- package/dist/utils/secureKeyStorage.js +312 -0
- package/dist/utils/secureKeyStorage.js.map +7 -0
- package/dist/utils/sensitiveFiles.js +125 -0
- package/dist/utils/sensitiveFiles.js.map +7 -0
- package/dist/utils/session/sessionPlugins.js +67 -0
- package/dist/utils/session/sessionPlugins.js.map +7 -0
- package/dist/utils/taskDisplayUtils.js +257 -0
- package/dist/utils/taskDisplayUtils.js.map +7 -0
- package/dist/utils/teamConfig.js +2 -1
- package/dist/utils/teamConfig.js.map +2 -2
- package/dist/utils/theme.js +6 -6
- package/dist/utils/theme.js.map +1 -1
- package/dist/utils/todoStorage.js +92 -2
- package/dist/utils/todoStorage.js.map +2 -2
- package/dist/utils/toolRiskClassification.js +207 -0
- package/dist/utils/toolRiskClassification.js.map +7 -0
- package/dist/utils/toolTimeout.js +136 -0
- package/dist/utils/toolTimeout.js.map +7 -0
- package/dist/utils/tooling/safeRender.js +116 -0
- package/dist/utils/tooling/safeRender.js.map +7 -0
- package/dist/utils/userFriendlyError.js +346 -0
- package/dist/utils/userFriendlyError.js.map +7 -0
- package/dist/utils/vendor/ripgrep/arm64-darwin/rg +0 -0
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +17 -5
- package/scripts/postinstall.js +128 -38
- package/dist/commands/agents.js +0 -2086
- package/dist/commands/agents.js.map +0 -7
- package/dist/commands/build.js +0 -74
- package/dist/commands/build.js.map +0 -7
- package/dist/commands/compression.js +0 -57
- package/dist/commands/compression.js.map +0 -7
- package/dist/commands/listen.js +0 -37
- package/dist/commands/listen.js.map +0 -7
- package/dist/commands/login.js +0 -37
- package/dist/commands/login.js.map +0 -7
- package/dist/commands/logout.js +0 -33
- package/dist/commands/logout.js.map +0 -7
- package/dist/commands/mcp.js +0 -40
- package/dist/commands/mcp.js.map +0 -7
- package/dist/commands/mcp_refresh.js +0 -40
- package/dist/commands/mcp_refresh.js.map +0 -7
- package/dist/commands/modelstatus.js +0 -21
- package/dist/commands/modelstatus.js.map +0 -7
- package/dist/commands/onboarding.js +0 -36
- package/dist/commands/onboarding.js.map +0 -7
- package/dist/commands/plugin-interactive.js +0 -446
- package/dist/commands/plugin-interactive.js.map +0 -7
- package/dist/commands/pr_comments.js +0 -61
- package/dist/commands/pr_comments.js.map +0 -7
- package/dist/commands/release-notes.js +0 -30
- package/dist/commands/release-notes.js.map +0 -7
- package/dist/commands/review.js +0 -51
- package/dist/commands/review.js.map +0 -7
- package/dist/components/Bug.js +0 -147
- package/dist/components/Bug.js.map +0 -7
- package/dist/components/ModelSelector.js +0 -2062
- package/dist/components/ModelSelector.js.map +0 -7
- package/dist/components/ModelStatusDisplay.js +0 -87
- package/dist/components/ModelStatusDisplay.js.map +0 -7
- package/dist/entrypoints/cli-wrapper.js +0 -61
- package/dist/entrypoints/cli-wrapper.js.map +0 -7
- package/dist/hooks/useCancelRequest.js +0 -28
- package/dist/hooks/useCancelRequest.js.map +0 -7
- package/dist/screens/Doctor.js +0 -22
- package/dist/screens/Doctor.js.map +0 -7
|
@@ -0,0 +1,574 @@
|
|
|
1
|
+
import { spawn } from "child_process";
|
|
2
|
+
import { platform } from "os";
|
|
3
|
+
import { existsSync } from "fs";
|
|
4
|
+
import { resolve } from "path";
|
|
5
|
+
import { DEFAULT_SANDBOX_CONFIG } from "./types.js";
|
|
6
|
+
import { FilesystemBoundary } from "./filesystemBoundary.js";
|
|
7
|
+
import { NetworkProxy } from "./networkProxy.js";
|
|
8
|
+
class SandboxController {
|
|
9
|
+
config;
|
|
10
|
+
implementation;
|
|
11
|
+
filesystemBoundary;
|
|
12
|
+
networkProxy;
|
|
13
|
+
violations = [];
|
|
14
|
+
workingDir;
|
|
15
|
+
constructor(workingDir, config) {
|
|
16
|
+
this.workingDir = resolve(workingDir);
|
|
17
|
+
this.config = { ...DEFAULT_SANDBOX_CONFIG, ...config };
|
|
18
|
+
this.implementation = this.detectImplementation();
|
|
19
|
+
this.filesystemBoundary = new FilesystemBoundary(
|
|
20
|
+
this.config.filesystem,
|
|
21
|
+
this.workingDir
|
|
22
|
+
);
|
|
23
|
+
this.networkProxy = new NetworkProxy(this.config.network);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Check if sandbox is available on this system
|
|
27
|
+
*/
|
|
28
|
+
async isAvailable() {
|
|
29
|
+
if (!this.config.enabled) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
switch (this.implementation) {
|
|
33
|
+
case "seatbelt":
|
|
34
|
+
return this.isSeatbeltAvailable();
|
|
35
|
+
case "bubblewrap":
|
|
36
|
+
return this.isBubblewrapAvailable();
|
|
37
|
+
case "docker":
|
|
38
|
+
return this.isDockerAvailable();
|
|
39
|
+
default:
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get the implementation type
|
|
45
|
+
*/
|
|
46
|
+
getImplementationType() {
|
|
47
|
+
return this.implementation;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Initialize the sandbox
|
|
51
|
+
*/
|
|
52
|
+
async initialize(config) {
|
|
53
|
+
this.config = config;
|
|
54
|
+
this.filesystemBoundary = new FilesystemBoundary(
|
|
55
|
+
config.filesystem,
|
|
56
|
+
this.workingDir
|
|
57
|
+
);
|
|
58
|
+
this.networkProxy = new NetworkProxy(config.network);
|
|
59
|
+
this.violations = [];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Pre-validate a command against policies
|
|
63
|
+
*/
|
|
64
|
+
async validateCommand(command) {
|
|
65
|
+
const violations = [];
|
|
66
|
+
if (this.isExcludedCommand(command)) {
|
|
67
|
+
return { valid: true, violations: [] };
|
|
68
|
+
}
|
|
69
|
+
const fsResult = this.filesystemBoundary.analyzeCommand(command);
|
|
70
|
+
for (const violation of fsResult.violations) {
|
|
71
|
+
violation.command = command;
|
|
72
|
+
violations.push(violation);
|
|
73
|
+
}
|
|
74
|
+
const netResult = this.networkProxy.analyzeCommand(command);
|
|
75
|
+
for (const violation of netResult.violations) {
|
|
76
|
+
violation.command = command;
|
|
77
|
+
violations.push(violation);
|
|
78
|
+
}
|
|
79
|
+
this.violations.push(...violations);
|
|
80
|
+
return {
|
|
81
|
+
valid: violations.length === 0,
|
|
82
|
+
violations
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Execute a command in the sandbox
|
|
87
|
+
*/
|
|
88
|
+
async execute(command, workingDir, signal, timeout) {
|
|
89
|
+
const startTime = Date.now();
|
|
90
|
+
this.workingDir = resolve(workingDir);
|
|
91
|
+
this.filesystemBoundary.setWorkingDir(this.workingDir);
|
|
92
|
+
if (!this.config.enabled) {
|
|
93
|
+
return this.executeDirectly(command, signal, timeout);
|
|
94
|
+
}
|
|
95
|
+
const validation = await this.validateCommand(command);
|
|
96
|
+
if (!validation.valid) {
|
|
97
|
+
return {
|
|
98
|
+
stdout: "",
|
|
99
|
+
stderr: `Sandbox blocked command:
|
|
100
|
+
${validation.violations.map((v) => `- ${v.details}`).join("\n")}`,
|
|
101
|
+
exitCode: 1,
|
|
102
|
+
interrupted: false,
|
|
103
|
+
blocked: true,
|
|
104
|
+
blockReason: validation.violations[0]?.details,
|
|
105
|
+
duration: Date.now() - startTime
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
if (this.isExcludedCommand(command)) {
|
|
109
|
+
return this.executeDirectly(command, signal, timeout);
|
|
110
|
+
}
|
|
111
|
+
switch (this.implementation) {
|
|
112
|
+
case "seatbelt":
|
|
113
|
+
return this.executeWithSeatbelt(command, signal, timeout, startTime);
|
|
114
|
+
case "bubblewrap":
|
|
115
|
+
return this.executeWithBubblewrap(command, signal, timeout, startTime);
|
|
116
|
+
case "docker":
|
|
117
|
+
return this.executeWithDocker(command, signal, timeout, startTime);
|
|
118
|
+
default:
|
|
119
|
+
return this.executeDirectly(command, signal, timeout);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Get current configuration
|
|
124
|
+
*/
|
|
125
|
+
getConfig() {
|
|
126
|
+
return { ...this.config };
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Update configuration
|
|
130
|
+
*/
|
|
131
|
+
updateConfig(config) {
|
|
132
|
+
this.config = { ...this.config, ...config };
|
|
133
|
+
if (config.filesystem) {
|
|
134
|
+
this.filesystemBoundary.updatePolicy(config.filesystem);
|
|
135
|
+
}
|
|
136
|
+
if (config.network) {
|
|
137
|
+
this.networkProxy.updatePolicy(config.network);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get violation history
|
|
142
|
+
*/
|
|
143
|
+
getViolations() {
|
|
144
|
+
return [
|
|
145
|
+
...this.violations,
|
|
146
|
+
...this.filesystemBoundary.getViolations(),
|
|
147
|
+
...this.networkProxy.getViolations()
|
|
148
|
+
];
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Clear violation history
|
|
152
|
+
*/
|
|
153
|
+
clearViolations() {
|
|
154
|
+
this.violations = [];
|
|
155
|
+
this.filesystemBoundary.clearViolations();
|
|
156
|
+
this.networkProxy.clearViolations();
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Get filesystem boundary instance
|
|
160
|
+
*/
|
|
161
|
+
getFilesystemBoundary() {
|
|
162
|
+
return this.filesystemBoundary;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Get network proxy instance
|
|
166
|
+
*/
|
|
167
|
+
getNetworkProxy() {
|
|
168
|
+
return this.networkProxy;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Detect the best available sandbox implementation
|
|
172
|
+
*/
|
|
173
|
+
detectImplementation() {
|
|
174
|
+
const os = platform();
|
|
175
|
+
if (os === "darwin") {
|
|
176
|
+
return "seatbelt";
|
|
177
|
+
} else if (os === "linux") {
|
|
178
|
+
if (this.hasBubblewrap()) {
|
|
179
|
+
return "bubblewrap";
|
|
180
|
+
} else if (this.hasDocker()) {
|
|
181
|
+
return "docker";
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return "none";
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Check if bubblewrap is installed
|
|
188
|
+
*/
|
|
189
|
+
hasBubblewrap() {
|
|
190
|
+
return existsSync("/usr/bin/bwrap") || existsSync("/usr/local/bin/bwrap");
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Check if docker is available
|
|
194
|
+
*/
|
|
195
|
+
hasDocker() {
|
|
196
|
+
return existsSync("/usr/bin/docker") || existsSync("/usr/local/bin/docker");
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Check if seatbelt (macOS sandbox-exec) is available
|
|
200
|
+
*/
|
|
201
|
+
async isSeatbeltAvailable() {
|
|
202
|
+
return platform() === "darwin" && existsSync("/usr/bin/sandbox-exec");
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Check if bubblewrap is available and working
|
|
206
|
+
*/
|
|
207
|
+
async isBubblewrapAvailable() {
|
|
208
|
+
if (!this.hasBubblewrap()) return false;
|
|
209
|
+
try {
|
|
210
|
+
const result = await this.spawnAsync("bwrap", ["--version"]);
|
|
211
|
+
return result.exitCode === 0;
|
|
212
|
+
} catch {
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Check if docker is available and running
|
|
218
|
+
*/
|
|
219
|
+
async isDockerAvailable() {
|
|
220
|
+
if (!this.hasDocker()) return false;
|
|
221
|
+
try {
|
|
222
|
+
const result = await this.spawnAsync("docker", ["info"]);
|
|
223
|
+
return result.exitCode === 0;
|
|
224
|
+
} catch {
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Check if a command is excluded from sandboxing
|
|
230
|
+
*/
|
|
231
|
+
isExcludedCommand(command) {
|
|
232
|
+
const firstWord = command.trim().split(/\s+/)[0]?.toLowerCase();
|
|
233
|
+
if (!firstWord) return false;
|
|
234
|
+
return this.config.process.excludedCommands.some(
|
|
235
|
+
(excluded) => firstWord === excluded.toLowerCase()
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Execute command directly without sandboxing
|
|
240
|
+
*/
|
|
241
|
+
async executeDirectly(command, signal, timeout) {
|
|
242
|
+
const startTime = Date.now();
|
|
243
|
+
const effectiveTimeout = timeout || this.config.process.maxExecutionTime;
|
|
244
|
+
try {
|
|
245
|
+
const result = await this.spawnAsync("sh", ["-c", command], {
|
|
246
|
+
cwd: this.workingDir,
|
|
247
|
+
signal,
|
|
248
|
+
timeout: effectiveTimeout
|
|
249
|
+
});
|
|
250
|
+
return {
|
|
251
|
+
stdout: result.stdout,
|
|
252
|
+
stderr: result.stderr,
|
|
253
|
+
exitCode: result.exitCode,
|
|
254
|
+
interrupted: result.interrupted,
|
|
255
|
+
blocked: false,
|
|
256
|
+
duration: Date.now() - startTime
|
|
257
|
+
};
|
|
258
|
+
} catch (error) {
|
|
259
|
+
const err = error;
|
|
260
|
+
return {
|
|
261
|
+
stdout: "",
|
|
262
|
+
stderr: err.message,
|
|
263
|
+
exitCode: 1,
|
|
264
|
+
interrupted: signal?.aborted || false,
|
|
265
|
+
blocked: false,
|
|
266
|
+
duration: Date.now() - startTime
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Execute command with macOS seatbelt sandbox
|
|
272
|
+
*/
|
|
273
|
+
async executeWithSeatbelt(command, signal, timeout, startTime) {
|
|
274
|
+
const start = startTime || Date.now();
|
|
275
|
+
const effectiveTimeout = timeout || this.config.process.maxExecutionTime;
|
|
276
|
+
const profile = this.generateSeatbeltProfile();
|
|
277
|
+
try {
|
|
278
|
+
const result = await this.spawnAsync(
|
|
279
|
+
"sandbox-exec",
|
|
280
|
+
["-p", profile, "sh", "-c", command],
|
|
281
|
+
{
|
|
282
|
+
cwd: this.workingDir,
|
|
283
|
+
signal,
|
|
284
|
+
timeout: effectiveTimeout
|
|
285
|
+
}
|
|
286
|
+
);
|
|
287
|
+
return {
|
|
288
|
+
stdout: result.stdout,
|
|
289
|
+
stderr: result.stderr,
|
|
290
|
+
exitCode: result.exitCode,
|
|
291
|
+
interrupted: result.interrupted,
|
|
292
|
+
blocked: false,
|
|
293
|
+
duration: Date.now() - start
|
|
294
|
+
};
|
|
295
|
+
} catch (error) {
|
|
296
|
+
const err = error;
|
|
297
|
+
const isBlocked = err.message.includes("sandbox") || err.message.includes("denied");
|
|
298
|
+
return {
|
|
299
|
+
stdout: "",
|
|
300
|
+
stderr: err.message,
|
|
301
|
+
exitCode: 1,
|
|
302
|
+
interrupted: signal?.aborted || false,
|
|
303
|
+
blocked: isBlocked,
|
|
304
|
+
blockReason: isBlocked ? "Sandbox policy violation" : void 0,
|
|
305
|
+
duration: Date.now() - start
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Generate macOS seatbelt profile
|
|
311
|
+
*/
|
|
312
|
+
generateSeatbeltProfile() {
|
|
313
|
+
const writeAllowed = this.config.filesystem.writeAllowed.map((p) => {
|
|
314
|
+
if (p === "./") return `(subpath "${this.workingDir}")`;
|
|
315
|
+
if (p === "*") return '(subpath "/")';
|
|
316
|
+
const absPath = resolve(this.workingDir, p);
|
|
317
|
+
return `(subpath "${absPath}")`;
|
|
318
|
+
}).join("\n ");
|
|
319
|
+
const readAllowed = this.config.filesystem.readAllowed.map((p) => {
|
|
320
|
+
if (p === "*") return '(subpath "/")';
|
|
321
|
+
const absPath = resolve(this.workingDir, p);
|
|
322
|
+
return `(subpath "${absPath}")`;
|
|
323
|
+
}).join("\n ");
|
|
324
|
+
const networkRules = this.config.network.blockAll ? "(deny network*)" : this.config.network.allowedDomains.length > 0 ? `(allow network-outbound
|
|
325
|
+
(remote tcp "${this.config.network.allowedDomains.join('", "')}"))` : "(allow network-outbound)";
|
|
326
|
+
return `
|
|
327
|
+
(version 1)
|
|
328
|
+
(deny default)
|
|
329
|
+
|
|
330
|
+
; Allow basic system operations
|
|
331
|
+
(allow process-exec*)
|
|
332
|
+
(allow process-fork)
|
|
333
|
+
(allow file-read-metadata)
|
|
334
|
+
(allow sysctl-read)
|
|
335
|
+
|
|
336
|
+
; Allow reading system libraries and executables
|
|
337
|
+
(allow file-read*
|
|
338
|
+
(subpath "/usr")
|
|
339
|
+
(subpath "/bin")
|
|
340
|
+
(subpath "/sbin")
|
|
341
|
+
(subpath "/System")
|
|
342
|
+
(subpath "/Library")
|
|
343
|
+
(subpath "/private/var")
|
|
344
|
+
(subpath "/private/tmp")
|
|
345
|
+
(subpath "/dev")
|
|
346
|
+
(subpath "/tmp")
|
|
347
|
+
${readAllowed}
|
|
348
|
+
)
|
|
349
|
+
|
|
350
|
+
; Allow writing to specific paths
|
|
351
|
+
(allow file-write*
|
|
352
|
+
(subpath "/dev")
|
|
353
|
+
(subpath "/private/tmp")
|
|
354
|
+
(subpath "/tmp")
|
|
355
|
+
${writeAllowed}
|
|
356
|
+
)
|
|
357
|
+
|
|
358
|
+
; Network rules
|
|
359
|
+
${networkRules}
|
|
360
|
+
|
|
361
|
+
; Allow stdout/stderr
|
|
362
|
+
(allow file-write-data
|
|
363
|
+
(literal "/dev/null")
|
|
364
|
+
(literal "/dev/zero")
|
|
365
|
+
(literal "/dev/random")
|
|
366
|
+
(literal "/dev/urandom")
|
|
367
|
+
(literal "/dev/tty")
|
|
368
|
+
(literal "/dev/console")
|
|
369
|
+
)
|
|
370
|
+
|
|
371
|
+
; Allow process management
|
|
372
|
+
(allow signal)
|
|
373
|
+
(allow mach-lookup)
|
|
374
|
+
(allow ipc-posix-shm-read-data)
|
|
375
|
+
(allow ipc-posix-shm-write-data)
|
|
376
|
+
`;
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Execute command with Linux bubblewrap sandbox
|
|
380
|
+
*/
|
|
381
|
+
async executeWithBubblewrap(command, signal, timeout, startTime) {
|
|
382
|
+
const start = startTime || Date.now();
|
|
383
|
+
const effectiveTimeout = timeout || this.config.process.maxExecutionTime;
|
|
384
|
+
const bwrapArgs = this.buildBubblewrapArgs();
|
|
385
|
+
try {
|
|
386
|
+
const result = await this.spawnAsync(
|
|
387
|
+
"bwrap",
|
|
388
|
+
[...bwrapArgs, "sh", "-c", command],
|
|
389
|
+
{
|
|
390
|
+
cwd: this.workingDir,
|
|
391
|
+
signal,
|
|
392
|
+
timeout: effectiveTimeout
|
|
393
|
+
}
|
|
394
|
+
);
|
|
395
|
+
return {
|
|
396
|
+
stdout: result.stdout,
|
|
397
|
+
stderr: result.stderr,
|
|
398
|
+
exitCode: result.exitCode,
|
|
399
|
+
interrupted: result.interrupted,
|
|
400
|
+
blocked: false,
|
|
401
|
+
duration: Date.now() - start
|
|
402
|
+
};
|
|
403
|
+
} catch (error) {
|
|
404
|
+
const err = error;
|
|
405
|
+
return {
|
|
406
|
+
stdout: "",
|
|
407
|
+
stderr: err.message,
|
|
408
|
+
exitCode: 1,
|
|
409
|
+
interrupted: signal?.aborted || false,
|
|
410
|
+
blocked: false,
|
|
411
|
+
duration: Date.now() - start
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Build bubblewrap command arguments
|
|
417
|
+
*/
|
|
418
|
+
buildBubblewrapArgs() {
|
|
419
|
+
const args = [];
|
|
420
|
+
args.push("--unshare-all");
|
|
421
|
+
args.push("--die-with-parent");
|
|
422
|
+
args.push("--ro-bind", "/usr", "/usr");
|
|
423
|
+
args.push("--ro-bind", "/bin", "/bin");
|
|
424
|
+
args.push("--ro-bind", "/lib", "/lib");
|
|
425
|
+
if (existsSync("/lib64")) {
|
|
426
|
+
args.push("--ro-bind", "/lib64", "/lib64");
|
|
427
|
+
}
|
|
428
|
+
args.push("--ro-bind", "/etc", "/etc");
|
|
429
|
+
args.push("--tmpfs", "/tmp");
|
|
430
|
+
args.push("--bind", this.workingDir, this.workingDir);
|
|
431
|
+
args.push("--chdir", this.workingDir);
|
|
432
|
+
for (const path of this.config.filesystem.readAllowed) {
|
|
433
|
+
if (path !== "*" && path !== "./" && existsSync(path)) {
|
|
434
|
+
const absPath = resolve(this.workingDir, path);
|
|
435
|
+
if (existsSync(absPath)) {
|
|
436
|
+
args.push("--ro-bind", absPath, absPath);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
for (const path of this.config.filesystem.writeAllowed) {
|
|
441
|
+
if (path !== "./" && path !== "*") {
|
|
442
|
+
const absPath = resolve(this.workingDir, path);
|
|
443
|
+
if (existsSync(absPath)) {
|
|
444
|
+
args.push("--bind", absPath, absPath);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
if (this.config.network.blockAll) {
|
|
449
|
+
args.push("--unshare-net");
|
|
450
|
+
}
|
|
451
|
+
if (this.config.process.maxProcesses > 0) {
|
|
452
|
+
args.push(
|
|
453
|
+
"--setenv",
|
|
454
|
+
"MINTO_MAX_PROCS",
|
|
455
|
+
String(this.config.process.maxProcesses)
|
|
456
|
+
);
|
|
457
|
+
}
|
|
458
|
+
return args;
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Execute command with Docker sandbox
|
|
462
|
+
*/
|
|
463
|
+
async executeWithDocker(command, signal, timeout, startTime) {
|
|
464
|
+
const start = startTime || Date.now();
|
|
465
|
+
const effectiveTimeout = timeout || this.config.process.maxExecutionTime;
|
|
466
|
+
const dockerArgs = [
|
|
467
|
+
"run",
|
|
468
|
+
"--rm",
|
|
469
|
+
"-i",
|
|
470
|
+
"--network",
|
|
471
|
+
this.config.network.blockAll ? "none" : "bridge",
|
|
472
|
+
"-v",
|
|
473
|
+
`${this.workingDir}:/workspace`,
|
|
474
|
+
"-w",
|
|
475
|
+
"/workspace"
|
|
476
|
+
];
|
|
477
|
+
if (this.config.process.maxMemory > 0) {
|
|
478
|
+
dockerArgs.push("--memory", `${this.config.process.maxMemory}`);
|
|
479
|
+
}
|
|
480
|
+
dockerArgs.push("alpine:latest");
|
|
481
|
+
dockerArgs.push("sh", "-c", command);
|
|
482
|
+
try {
|
|
483
|
+
const result = await this.spawnAsync("docker", dockerArgs, {
|
|
484
|
+
cwd: this.workingDir,
|
|
485
|
+
signal,
|
|
486
|
+
timeout: effectiveTimeout
|
|
487
|
+
});
|
|
488
|
+
return {
|
|
489
|
+
stdout: result.stdout,
|
|
490
|
+
stderr: result.stderr,
|
|
491
|
+
exitCode: result.exitCode,
|
|
492
|
+
interrupted: result.interrupted,
|
|
493
|
+
blocked: false,
|
|
494
|
+
duration: Date.now() - start
|
|
495
|
+
};
|
|
496
|
+
} catch (error) {
|
|
497
|
+
const err = error;
|
|
498
|
+
return {
|
|
499
|
+
stdout: "",
|
|
500
|
+
stderr: err.message,
|
|
501
|
+
exitCode: 1,
|
|
502
|
+
interrupted: signal?.aborted || false,
|
|
503
|
+
blocked: false,
|
|
504
|
+
duration: Date.now() - start
|
|
505
|
+
};
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* Spawn a process with promise wrapper
|
|
510
|
+
*/
|
|
511
|
+
spawnAsync(cmd, args, options) {
|
|
512
|
+
return new Promise((resolve2, reject) => {
|
|
513
|
+
let stdout = "";
|
|
514
|
+
let stderr = "";
|
|
515
|
+
let interrupted = false;
|
|
516
|
+
let child = null;
|
|
517
|
+
const timeoutId = options?.timeout ? setTimeout(() => {
|
|
518
|
+
interrupted = true;
|
|
519
|
+
child?.kill("SIGTERM");
|
|
520
|
+
}, options.timeout) : null;
|
|
521
|
+
if (options?.signal) {
|
|
522
|
+
options.signal.addEventListener("abort", () => {
|
|
523
|
+
interrupted = true;
|
|
524
|
+
child?.kill("SIGTERM");
|
|
525
|
+
});
|
|
526
|
+
}
|
|
527
|
+
child = spawn(cmd, args, {
|
|
528
|
+
cwd: options?.cwd || this.workingDir,
|
|
529
|
+
shell: false,
|
|
530
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
531
|
+
});
|
|
532
|
+
child.stdout?.on("data", (data) => {
|
|
533
|
+
stdout += data.toString();
|
|
534
|
+
});
|
|
535
|
+
child.stderr?.on("data", (data) => {
|
|
536
|
+
stderr += data.toString();
|
|
537
|
+
});
|
|
538
|
+
child.on("error", (error) => {
|
|
539
|
+
if (timeoutId) clearTimeout(timeoutId);
|
|
540
|
+
reject(error);
|
|
541
|
+
});
|
|
542
|
+
child.on("close", (code) => {
|
|
543
|
+
if (timeoutId) clearTimeout(timeoutId);
|
|
544
|
+
resolve2({
|
|
545
|
+
stdout,
|
|
546
|
+
stderr,
|
|
547
|
+
exitCode: code ?? 1,
|
|
548
|
+
interrupted
|
|
549
|
+
});
|
|
550
|
+
});
|
|
551
|
+
});
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
let globalSandboxController = null;
|
|
555
|
+
function getSandboxController(workingDir) {
|
|
556
|
+
if (!globalSandboxController) {
|
|
557
|
+
globalSandboxController = new SandboxController(workingDir || process.cwd());
|
|
558
|
+
} else if (workingDir) {
|
|
559
|
+
globalSandboxController = new SandboxController(
|
|
560
|
+
workingDir,
|
|
561
|
+
globalSandboxController.getConfig()
|
|
562
|
+
);
|
|
563
|
+
}
|
|
564
|
+
return globalSandboxController;
|
|
565
|
+
}
|
|
566
|
+
function resetSandboxController() {
|
|
567
|
+
globalSandboxController = null;
|
|
568
|
+
}
|
|
569
|
+
export {
|
|
570
|
+
SandboxController,
|
|
571
|
+
getSandboxController,
|
|
572
|
+
resetSandboxController
|
|
573
|
+
};
|
|
574
|
+
//# sourceMappingURL=sandboxController.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/services/sandbox/sandboxController.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Sandbox Controller\n *\n * Main controller for the sandbox execution system.\n * Coordinates filesystem, network, and process isolation.\n */\n\nimport { spawn, type ChildProcess } from 'child_process'\nimport { platform } from 'os'\nimport { existsSync } from 'fs'\nimport { resolve } from 'path'\nimport type {\n ISandboxController,\n SandboxConfig,\n SandboxExecutionResult,\n SandboxImplementation,\n SandboxViolation,\n} from './types'\nimport { DEFAULT_SANDBOX_CONFIG } from './types'\nimport { FilesystemBoundary } from './filesystemBoundary'\nimport { NetworkProxy } from './networkProxy'\n\n/**\n * Sandbox Controller Implementation\n *\n * Provides unified sandbox management with OS-specific implementations.\n */\nexport class SandboxController implements ISandboxController {\n private config: SandboxConfig\n private implementation: SandboxImplementation\n private filesystemBoundary: FilesystemBoundary\n private networkProxy: NetworkProxy\n private violations: SandboxViolation[] = []\n private workingDir: string\n\n constructor(workingDir: string, config?: Partial<SandboxConfig>) {\n this.workingDir = resolve(workingDir)\n this.config = { ...DEFAULT_SANDBOX_CONFIG, ...config }\n this.implementation = this.detectImplementation()\n this.filesystemBoundary = new FilesystemBoundary(\n this.config.filesystem,\n this.workingDir,\n )\n this.networkProxy = new NetworkProxy(this.config.network)\n }\n\n /**\n * Check if sandbox is available on this system\n */\n async isAvailable(): Promise<boolean> {\n if (!this.config.enabled) {\n return false\n }\n\n switch (this.implementation) {\n case 'seatbelt':\n return this.isSeatbeltAvailable()\n case 'bubblewrap':\n return this.isBubblewrapAvailable()\n case 'docker':\n return this.isDockerAvailable()\n default:\n return false\n }\n }\n\n /**\n * Get the implementation type\n */\n getImplementationType(): SandboxImplementation {\n return this.implementation\n }\n\n /**\n * Initialize the sandbox\n */\n async initialize(config: SandboxConfig): Promise<void> {\n this.config = config\n this.filesystemBoundary = new FilesystemBoundary(\n config.filesystem,\n this.workingDir,\n )\n this.networkProxy = new NetworkProxy(config.network)\n this.violations = []\n }\n\n /**\n * Pre-validate a command against policies\n */\n async validateCommand(command: string): Promise<{\n valid: boolean\n violations: SandboxViolation[]\n }> {\n const violations: SandboxViolation[] = []\n\n // Check if command is excluded from sandboxing\n if (this.isExcludedCommand(command)) {\n return { valid: true, violations: [] }\n }\n\n // Validate filesystem access\n const fsResult = this.filesystemBoundary.analyzeCommand(command)\n for (const violation of fsResult.violations) {\n violation.command = command\n violations.push(violation)\n }\n\n // Validate network access\n const netResult = this.networkProxy.analyzeCommand(command)\n for (const violation of netResult.violations) {\n violation.command = command\n violations.push(violation)\n }\n\n // Store all violations\n this.violations.push(...violations)\n\n return {\n valid: violations.length === 0,\n violations,\n }\n }\n\n /**\n * Execute a command in the sandbox\n */\n async execute(\n command: string,\n workingDir: string,\n signal?: AbortSignal,\n timeout?: number,\n ): Promise<SandboxExecutionResult> {\n const startTime = Date.now()\n this.workingDir = resolve(workingDir)\n this.filesystemBoundary.setWorkingDir(this.workingDir)\n\n // If sandbox is disabled, execute directly\n if (!this.config.enabled) {\n return this.executeDirectly(command, signal, timeout)\n }\n\n // Validate command first\n const validation = await this.validateCommand(command)\n if (!validation.valid) {\n return {\n stdout: '',\n stderr: `Sandbox blocked command:\\n${validation.violations\n .map(v => `- ${v.details}`)\n .join('\\n')}`,\n exitCode: 1,\n interrupted: false,\n blocked: true,\n blockReason: validation.violations[0]?.details,\n duration: Date.now() - startTime,\n }\n }\n\n // Check if command is excluded from sandboxing\n if (this.isExcludedCommand(command)) {\n return this.executeDirectly(command, signal, timeout)\n }\n\n // Execute with appropriate sandbox\n switch (this.implementation) {\n case 'seatbelt':\n return this.executeWithSeatbelt(command, signal, timeout, startTime)\n case 'bubblewrap':\n return this.executeWithBubblewrap(command, signal, timeout, startTime)\n case 'docker':\n return this.executeWithDocker(command, signal, timeout, startTime)\n default:\n // No sandbox available, execute directly with validation only\n return this.executeDirectly(command, signal, timeout)\n }\n }\n\n /**\n * Get current configuration\n */\n getConfig(): SandboxConfig {\n return { ...this.config }\n }\n\n /**\n * Update configuration\n */\n updateConfig(config: Partial<SandboxConfig>): void {\n this.config = { ...this.config, ...config }\n if (config.filesystem) {\n this.filesystemBoundary.updatePolicy(config.filesystem)\n }\n if (config.network) {\n this.networkProxy.updatePolicy(config.network)\n }\n }\n\n /**\n * Get violation history\n */\n getViolations(): SandboxViolation[] {\n return [\n ...this.violations,\n ...this.filesystemBoundary.getViolations(),\n ...this.networkProxy.getViolations(),\n ]\n }\n\n /**\n * Clear violation history\n */\n clearViolations(): void {\n this.violations = []\n this.filesystemBoundary.clearViolations()\n this.networkProxy.clearViolations()\n }\n\n /**\n * Get filesystem boundary instance\n */\n getFilesystemBoundary(): FilesystemBoundary {\n return this.filesystemBoundary\n }\n\n /**\n * Get network proxy instance\n */\n getNetworkProxy(): NetworkProxy {\n return this.networkProxy\n }\n\n /**\n * Detect the best available sandbox implementation\n */\n private detectImplementation(): SandboxImplementation {\n const os = platform()\n\n if (os === 'darwin') {\n // macOS - use seatbelt/sandbox-exec\n return 'seatbelt'\n } else if (os === 'linux') {\n // Linux - prefer bubblewrap, fallback to docker\n if (this.hasBubblewrap()) {\n return 'bubblewrap'\n } else if (this.hasDocker()) {\n return 'docker'\n }\n }\n\n return 'none'\n }\n\n /**\n * Check if bubblewrap is installed\n */\n private hasBubblewrap(): boolean {\n return existsSync('/usr/bin/bwrap') || existsSync('/usr/local/bin/bwrap')\n }\n\n /**\n * Check if docker is available\n */\n private hasDocker(): boolean {\n return existsSync('/usr/bin/docker') || existsSync('/usr/local/bin/docker')\n }\n\n /**\n * Check if seatbelt (macOS sandbox-exec) is available\n */\n private async isSeatbeltAvailable(): Promise<boolean> {\n return platform() === 'darwin' && existsSync('/usr/bin/sandbox-exec')\n }\n\n /**\n * Check if bubblewrap is available and working\n */\n private async isBubblewrapAvailable(): Promise<boolean> {\n if (!this.hasBubblewrap()) return false\n try {\n const result = await this.spawnAsync('bwrap', ['--version'])\n return result.exitCode === 0\n } catch {\n return false\n }\n }\n\n /**\n * Check if docker is available and running\n */\n private async isDockerAvailable(): Promise<boolean> {\n if (!this.hasDocker()) return false\n try {\n const result = await this.spawnAsync('docker', ['info'])\n return result.exitCode === 0\n } catch {\n return false\n }\n }\n\n /**\n * Check if a command is excluded from sandboxing\n */\n private isExcludedCommand(command: string): boolean {\n const firstWord = command.trim().split(/\\s+/)[0]?.toLowerCase()\n if (!firstWord) return false\n return this.config.process.excludedCommands.some(\n excluded => firstWord === excluded.toLowerCase(),\n )\n }\n\n /**\n * Execute command directly without sandboxing\n */\n private async executeDirectly(\n command: string,\n signal?: AbortSignal,\n timeout?: number,\n ): Promise<SandboxExecutionResult> {\n const startTime = Date.now()\n const effectiveTimeout = timeout || this.config.process.maxExecutionTime\n\n try {\n const result = await this.spawnAsync('sh', ['-c', command], {\n cwd: this.workingDir,\n signal,\n timeout: effectiveTimeout,\n })\n\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n interrupted: result.interrupted,\n blocked: false,\n duration: Date.now() - startTime,\n }\n } catch (error) {\n const err = error as Error\n return {\n stdout: '',\n stderr: err.message,\n exitCode: 1,\n interrupted: signal?.aborted || false,\n blocked: false,\n duration: Date.now() - startTime,\n }\n }\n }\n\n /**\n * Execute command with macOS seatbelt sandbox\n */\n private async executeWithSeatbelt(\n command: string,\n signal?: AbortSignal,\n timeout?: number,\n startTime?: number,\n ): Promise<SandboxExecutionResult> {\n const start = startTime || Date.now()\n const effectiveTimeout = timeout || this.config.process.maxExecutionTime\n\n // Generate seatbelt profile\n const profile = this.generateSeatbeltProfile()\n\n try {\n const result = await this.spawnAsync(\n 'sandbox-exec',\n ['-p', profile, 'sh', '-c', command],\n {\n cwd: this.workingDir,\n signal,\n timeout: effectiveTimeout,\n },\n )\n\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n interrupted: result.interrupted,\n blocked: false,\n duration: Date.now() - start,\n }\n } catch (error) {\n const err = error as Error\n const isBlocked =\n err.message.includes('sandbox') || err.message.includes('denied')\n return {\n stdout: '',\n stderr: err.message,\n exitCode: 1,\n interrupted: signal?.aborted || false,\n blocked: isBlocked,\n blockReason: isBlocked ? 'Sandbox policy violation' : undefined,\n duration: Date.now() - start,\n }\n }\n }\n\n /**\n * Generate macOS seatbelt profile\n */\n private generateSeatbeltProfile(): string {\n const writeAllowed = this.config.filesystem.writeAllowed\n .map(p => {\n if (p === './') return `(subpath \"${this.workingDir}\")`\n if (p === '*') return '(subpath \"/\")'\n const absPath = resolve(this.workingDir, p)\n return `(subpath \"${absPath}\")`\n })\n .join('\\n ')\n\n const readAllowed = this.config.filesystem.readAllowed\n .map(p => {\n if (p === '*') return '(subpath \"/\")'\n const absPath = resolve(this.workingDir, p)\n return `(subpath \"${absPath}\")`\n })\n .join('\\n ')\n\n const networkRules = this.config.network.blockAll\n ? '(deny network*)'\n : this.config.network.allowedDomains.length > 0\n ? `(allow network-outbound\n (remote tcp \"${this.config.network.allowedDomains.join('\", \"')}\"))`\n : '(allow network-outbound)'\n\n return `\n(version 1)\n(deny default)\n\n; Allow basic system operations\n(allow process-exec*)\n(allow process-fork)\n(allow file-read-metadata)\n(allow sysctl-read)\n\n; Allow reading system libraries and executables\n(allow file-read*\n (subpath \"/usr\")\n (subpath \"/bin\")\n (subpath \"/sbin\")\n (subpath \"/System\")\n (subpath \"/Library\")\n (subpath \"/private/var\")\n (subpath \"/private/tmp\")\n (subpath \"/dev\")\n (subpath \"/tmp\")\n ${readAllowed}\n)\n\n; Allow writing to specific paths\n(allow file-write*\n (subpath \"/dev\")\n (subpath \"/private/tmp\")\n (subpath \"/tmp\")\n ${writeAllowed}\n)\n\n; Network rules\n${networkRules}\n\n; Allow stdout/stderr\n(allow file-write-data\n (literal \"/dev/null\")\n (literal \"/dev/zero\")\n (literal \"/dev/random\")\n (literal \"/dev/urandom\")\n (literal \"/dev/tty\")\n (literal \"/dev/console\")\n)\n\n; Allow process management\n(allow signal)\n(allow mach-lookup)\n(allow ipc-posix-shm-read-data)\n(allow ipc-posix-shm-write-data)\n`\n }\n\n /**\n * Execute command with Linux bubblewrap sandbox\n */\n private async executeWithBubblewrap(\n command: string,\n signal?: AbortSignal,\n timeout?: number,\n startTime?: number,\n ): Promise<SandboxExecutionResult> {\n const start = startTime || Date.now()\n const effectiveTimeout = timeout || this.config.process.maxExecutionTime\n\n // Build bubblewrap arguments\n const bwrapArgs = this.buildBubblewrapArgs()\n\n try {\n const result = await this.spawnAsync(\n 'bwrap',\n [...bwrapArgs, 'sh', '-c', command],\n {\n cwd: this.workingDir,\n signal,\n timeout: effectiveTimeout,\n },\n )\n\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n interrupted: result.interrupted,\n blocked: false,\n duration: Date.now() - start,\n }\n } catch (error) {\n const err = error as Error\n return {\n stdout: '',\n stderr: err.message,\n exitCode: 1,\n interrupted: signal?.aborted || false,\n blocked: false,\n duration: Date.now() - start,\n }\n }\n }\n\n /**\n * Build bubblewrap command arguments\n */\n private buildBubblewrapArgs(): string[] {\n const args: string[] = []\n\n // Basic sandboxing\n args.push('--unshare-all')\n args.push('--die-with-parent')\n\n // Mount system directories read-only\n args.push('--ro-bind', '/usr', '/usr')\n args.push('--ro-bind', '/bin', '/bin')\n args.push('--ro-bind', '/lib', '/lib')\n if (existsSync('/lib64')) {\n args.push('--ro-bind', '/lib64', '/lib64')\n }\n args.push('--ro-bind', '/etc', '/etc')\n\n // Allow /tmp\n args.push('--tmpfs', '/tmp')\n\n // Set working directory with read-write access\n args.push('--bind', this.workingDir, this.workingDir)\n args.push('--chdir', this.workingDir)\n\n // Add additional read paths\n for (const path of this.config.filesystem.readAllowed) {\n if (path !== '*' && path !== './' && existsSync(path)) {\n const absPath = resolve(this.workingDir, path)\n if (existsSync(absPath)) {\n args.push('--ro-bind', absPath, absPath)\n }\n }\n }\n\n // Add additional write paths\n for (const path of this.config.filesystem.writeAllowed) {\n if (path !== './' && path !== '*') {\n const absPath = resolve(this.workingDir, path)\n if (existsSync(absPath)) {\n args.push('--bind', absPath, absPath)\n }\n }\n }\n\n // Network isolation (if blocking all)\n if (this.config.network.blockAll) {\n args.push('--unshare-net')\n }\n\n // Process limits\n if (this.config.process.maxProcesses > 0) {\n args.push(\n '--setenv',\n 'MINTO_MAX_PROCS',\n String(this.config.process.maxProcesses),\n )\n }\n\n return args\n }\n\n /**\n * Execute command with Docker sandbox\n */\n private async executeWithDocker(\n command: string,\n signal?: AbortSignal,\n timeout?: number,\n startTime?: number,\n ): Promise<SandboxExecutionResult> {\n const start = startTime || Date.now()\n const effectiveTimeout = timeout || this.config.process.maxExecutionTime\n\n // Build docker run arguments\n const dockerArgs = [\n 'run',\n '--rm',\n '-i',\n '--network',\n this.config.network.blockAll ? 'none' : 'bridge',\n '-v',\n `${this.workingDir}:/workspace`,\n '-w',\n '/workspace',\n ]\n\n // Add memory limit\n if (this.config.process.maxMemory > 0) {\n dockerArgs.push('--memory', `${this.config.process.maxMemory}`)\n }\n\n // Use a minimal image\n dockerArgs.push('alpine:latest')\n dockerArgs.push('sh', '-c', command)\n\n try {\n const result = await this.spawnAsync('docker', dockerArgs, {\n cwd: this.workingDir,\n signal,\n timeout: effectiveTimeout,\n })\n\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n interrupted: result.interrupted,\n blocked: false,\n duration: Date.now() - start,\n }\n } catch (error) {\n const err = error as Error\n return {\n stdout: '',\n stderr: err.message,\n exitCode: 1,\n interrupted: signal?.aborted || false,\n blocked: false,\n duration: Date.now() - start,\n }\n }\n }\n\n /**\n * Spawn a process with promise wrapper\n */\n private spawnAsync(\n cmd: string,\n args: string[],\n options?: {\n cwd?: string\n signal?: AbortSignal\n timeout?: number\n },\n ): Promise<{\n stdout: string\n stderr: string\n exitCode: number\n interrupted: boolean\n }> {\n return new Promise((resolve, reject) => {\n let stdout = ''\n let stderr = ''\n let interrupted = false\n let child: ChildProcess | null = null\n\n const timeoutId = options?.timeout\n ? setTimeout(() => {\n interrupted = true\n child?.kill('SIGTERM')\n }, options.timeout)\n : null\n\n // Handle abort signal\n if (options?.signal) {\n options.signal.addEventListener('abort', () => {\n interrupted = true\n child?.kill('SIGTERM')\n })\n }\n\n child = spawn(cmd, args, {\n cwd: options?.cwd || this.workingDir,\n shell: false,\n stdio: ['pipe', 'pipe', 'pipe'],\n })\n\n child.stdout?.on('data', (data: Buffer) => {\n stdout += data.toString()\n })\n\n child.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString()\n })\n\n child.on('error', (error: Error) => {\n if (timeoutId) clearTimeout(timeoutId)\n reject(error)\n })\n\n child.on('close', (code: number | null) => {\n if (timeoutId) clearTimeout(timeoutId)\n resolve({\n stdout,\n stderr,\n exitCode: code ?? 1,\n interrupted,\n })\n })\n })\n }\n}\n\n// Global singleton instance\nlet globalSandboxController: SandboxController | null = null\n\n/**\n * Get the global sandbox controller instance\n */\nexport function getSandboxController(workingDir?: string): SandboxController {\n if (!globalSandboxController) {\n globalSandboxController = new SandboxController(workingDir || process.cwd())\n } else if (workingDir) {\n // Update working directory if provided\n globalSandboxController = new SandboxController(\n workingDir,\n globalSandboxController.getConfig(),\n )\n }\n return globalSandboxController\n}\n\n/**\n * Reset the global sandbox controller (for testing)\n */\nexport function resetSandboxController(): void {\n globalSandboxController = null\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["resolve"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
const DEFAULT_SANDBOX_CONFIG = {
|
|
2
|
+
enabled: false,
|
|
3
|
+
// Disabled by default for backward compatibility
|
|
4
|
+
filesystem: {
|
|
5
|
+
writeAllowed: ["./"],
|
|
6
|
+
// Current working directory
|
|
7
|
+
readAllowed: ["*"],
|
|
8
|
+
// Allow reading everything by default
|
|
9
|
+
denied: [
|
|
10
|
+
".env*",
|
|
11
|
+
".env",
|
|
12
|
+
".env.local",
|
|
13
|
+
".env.*.local",
|
|
14
|
+
"secrets/**",
|
|
15
|
+
".ssh/**",
|
|
16
|
+
".gnupg/**",
|
|
17
|
+
".aws/credentials",
|
|
18
|
+
".config/gcloud/**",
|
|
19
|
+
"**/*.pem",
|
|
20
|
+
"**/*.key",
|
|
21
|
+
"**/id_rsa",
|
|
22
|
+
"**/id_ed25519"
|
|
23
|
+
]
|
|
24
|
+
},
|
|
25
|
+
network: {
|
|
26
|
+
allowedDomains: [
|
|
27
|
+
"api.anthropic.com",
|
|
28
|
+
"api.openai.com",
|
|
29
|
+
"github.com",
|
|
30
|
+
"api.github.com",
|
|
31
|
+
"registry.npmjs.org",
|
|
32
|
+
"pypi.org"
|
|
33
|
+
],
|
|
34
|
+
promptForNewDomains: true,
|
|
35
|
+
blockAll: false
|
|
36
|
+
},
|
|
37
|
+
process: {
|
|
38
|
+
excludedCommands: ["docker", "git", "node", "npm", "bun", "pnpm", "yarn"],
|
|
39
|
+
maxExecutionTime: 6e5,
|
|
40
|
+
// 10 minutes
|
|
41
|
+
maxMemory: 0,
|
|
42
|
+
// Unlimited
|
|
43
|
+
maxProcesses: 0
|
|
44
|
+
// Unlimited
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
export {
|
|
48
|
+
DEFAULT_SANDBOX_CONFIG
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=types.js.map
|