@within-7/minto 0.1.7 → 0.2.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 +52 -26
- 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 +84 -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 +156 -0
- package/dist/commands/export.js.map +7 -0
- package/dist/commands/mcp-interactive.js +21 -12
- package/dist/commands/mcp-interactive.js.map +2 -2
- package/dist/commands/model.js +6 -5
- package/dist/commands/model.js.map +2 -2
- package/dist/commands/permissions.js +86 -0
- package/dist/commands/permissions.js.map +7 -0
- package/dist/commands/quit.js +3 -1
- package/dist/commands/quit.js.map +2 -2
- package/dist/commands/sandbox.js +104 -0
- package/dist/commands/sandbox.js.map +7 -0
- package/dist/commands/status.js +58 -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.js +20 -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/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 +14 -0
- package/dist/components/CollapsibleHint.js.map +7 -0
- package/dist/components/FileEditToolUpdatedMessage.js +1 -1
- package/dist/components/FileEditToolUpdatedMessage.js.map +2 -2
- package/dist/components/HotkeyHelpPanel.js +137 -0
- package/dist/components/HotkeyHelpPanel.js.map +7 -0
- package/dist/components/Logo.js +5 -5
- package/dist/components/Logo.js.map +2 -2
- package/dist/components/Message.js +23 -7
- package/dist/components/Message.js.map +3 -3
- package/dist/components/ModelConfig.js +16 -3
- package/dist/components/ModelConfig.js.map +2 -2
- package/dist/components/ModelListManager.js +3 -3
- package/dist/components/ModelListManager.js.map +2 -2
- package/dist/components/ModelSelector/ModelSelector.js +1 -1
- package/dist/components/Onboarding.js +19 -14
- package/dist/components/Onboarding.js.map +2 -2
- package/dist/components/ProgressBar.js +74 -0
- package/dist/components/ProgressBar.js.map +7 -0
- package/dist/components/PromptInput.js +156 -46
- 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/Spinner.js +92 -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/SubagentBlock.js +1 -1
- package/dist/components/SubagentBlock.js.map +1 -1
- package/dist/components/SubagentProgress.js +10 -11
- package/dist/components/SubagentProgress.js.map +2 -2
- package/dist/components/TaskCard.js +16 -13
- package/dist/components/TaskCard.js.map +2 -2
- package/dist/components/TodoChangeBlock.js +1 -1
- package/dist/components/TodoChangeBlock.js.map +2 -2
- package/dist/components/TodoPanel.js +120 -29
- 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/TreeConnector.js +25 -0
- package/dist/components/TreeConnector.js.map +7 -0
- package/dist/components/TurnCompletionIndicator.js +18 -0
- package/dist/components/TurnCompletionIndicator.js.map +7 -0
- package/dist/components/messages/AssistantTextMessage.js +5 -2
- 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 +11 -8
- package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
- package/dist/components/messages/GroupRenderer.js +53 -0
- package/dist/components/messages/GroupRenderer.js.map +7 -0
- package/dist/components/messages/NestedTasksPreview.js +12 -0
- package/dist/components/messages/NestedTasksPreview.js.map +7 -0
- package/dist/components/messages/ParallelTasksGroupView.js +92 -0
- package/dist/components/messages/ParallelTasksGroupView.js.map +7 -0
- package/dist/components/messages/TaskInModuleView.js +198 -0
- package/dist/components/messages/TaskInModuleView.js.map +7 -0
- package/dist/components/messages/TaskOutputContent.js +53 -0
- package/dist/components/messages/TaskOutputContent.js.map +7 -0
- package/dist/components/messages/UserPromptMessage.js +1 -1
- 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 +48 -0
- 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/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 +138 -0
- package/dist/core/costTracker.js.map +7 -0
- package/dist/core/index.js +5 -0
- package/dist/core/index.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 +291 -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 +168 -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 +340 -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/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 +43 -43
- 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/useAgentTranscripts.js +116 -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/useCancelRequest.js +4 -1
- package/dist/hooks/useCancelRequest.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 +17 -1
- 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 +347 -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 +347 -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/query.js +175 -17
- package/dist/query.js.map +3 -3
- package/dist/screens/REPL.js +501 -192
- 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 +138 -11
- 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 +273 -34
- 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 +300 -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 +3 -0
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
- 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 +60 -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 +192 -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/FileWriteTool/FileWriteTool.js +5 -5
- package/dist/tools/FileWriteTool/FileWriteTool.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/NotebookEditTool/NotebookEditTool.js +5 -1
- package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
- package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js +74 -0
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +7 -0
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js +108 -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 +6 -1
- package/dist/tools/SkillTool/SkillTool.js.map +2 -2
- 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 +189 -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 +302 -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/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/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 +63 -7
- 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/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/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 +157 -5
- 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/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/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/todoStorage.js +92 -2
- package/dist/utils/todoStorage.js.map +2 -2
- package/dist/utils/toolTimeout.js +136 -0
- package/dist/utils/toolTimeout.js.map +7 -0
- package/dist/utils/tooling/safeRender.js +115 -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 +14 -4
- 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/screens/Doctor.js +0 -22
- package/dist/screens/Doctor.js.map +0 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/model.tsx"],
|
|
4
|
-
"sourcesContent": ["import React, { useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { ModelConfig } from '@components/ModelConfig'\nimport { enableConfigs } from '@utils/config'\nimport { triggerModelConfigChange } from '@messages'\nimport { getModelManager } from '@utils/model'\nimport { getTheme } from '@utils/theme'\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\nimport type { Command } from '@commands'\n\ntype Props = {\n onClose: () => void\n abortController?: AbortController\n}\n\n/**\n * Combined Model Command - Shows status and provides configuration\n *\n * This merges the functionality of /model and /modelstatus into a single command.\n * First shows current model status, then allows entering configuration mode.\n */\nfunction ModelCommand({ onClose, abortController }: Props): React.ReactNode {\n const [mode, setMode] = useState<'status' | 'config'>('status')\n const theme = getTheme()\n const exitState = useExitOnCtrlCD(onClose)\n\n
|
|
5
|
-
"mappings": "AAAA,OAAO,SAAS,gBAAgB;AAChC,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,mBAAmB;AAC5B,SAAS,qBAAqB;AAC9B,SAAS,gCAAgC;AACzC,SAAS,uBAAuB;AAChC,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAchC,SAAS,aAAa,EAAE,SAAS,gBAAgB,GAA2B;AAC1E,QAAM,CAAC,MAAM,OAAO,IAAI,SAA8B,QAAQ;AAC9D,QAAM,QAAQ,SAAS;AACvB,QAAM,YAAY,gBAAgB,OAAO;
|
|
4
|
+
"sourcesContent": ["import React, { useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { ModelConfig } from '@components/ModelConfig'\nimport { enableConfigs } from '@utils/config'\nimport { triggerModelConfigChange } from '@messages'\nimport { getModelManager } from '@utils/model'\nimport { getTheme } from '@utils/theme'\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\nimport type { Command } from '@commands'\n\ntype Props = {\n onClose: () => void\n abortController?: AbortController\n}\n\n/**\n * Combined Model Command - Shows status and provides configuration\n *\n * This merges the functionality of /model and /modelstatus into a single command.\n * First shows current model status, then allows entering configuration mode.\n */\nfunction ModelCommand({ onClose, abortController }: Props): React.ReactNode {\n const [mode, setMode] = useState<'status' | 'config'>('status')\n const theme = getTheme()\n const exitState = useExitOnCtrlCD(onClose)\n\n // Only listen for input when in status mode\n // When in config mode, ModelConfig handles its own input\n useInput(\n (input, key) => {\n if (key.return || input === 'c' || input === 'C') {\n enableConfigs()\n abortController?.abort?.()\n setMode('config')\n } else if (key.escape) {\n onClose()\n }\n },\n { isActive: mode === 'status' },\n )\n\n if (mode === 'config') {\n return (\n <ModelConfig\n onClose={() => {\n import('@utils/model').then(({ reloadModelManager }) => {\n reloadModelManager()\n triggerModelConfigChange()\n // Return to status mode instead of exiting completely\n setMode('status')\n })\n }}\n />\n )\n }\n\n // Status mode - show current model configuration\n try {\n const modelManager = getModelManager()\n const pointers = ['main', 'task', 'reasoning', 'quick', 'compact'] as const\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n \uD83D\uDCCA Model Status{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Text> </Text>\n\n {pointers.map(pointer => {\n try {\n const model = modelManager.getModel(pointer)\n if (model && model.name && model.provider) {\n return (\n <Box key={pointer}>\n <Text>\n <Text bold color={theme.minto}>\n {pointer.toUpperCase().padEnd(10)}\n </Text>{' '}\n \u2192 {model.name}{' '}\n <Text color={theme.secondaryText}>\n ({model.provider}, {model.modelName || 'unknown'})\n </Text>\n </Text>\n </Box>\n )\n } else {\n return (\n <Box key={pointer}>\n <Text>\n <Text bold color={theme.minto}>\n {pointer.toUpperCase().padEnd(10)}\n </Text>{' '}\n \u2192 <Text color={theme.error}>Not configured</Text>\n </Text>\n </Box>\n )\n }\n } catch {\n return (\n <Box key={pointer}>\n <Text>\n <Text bold color={theme.minto}>\n {pointer.toUpperCase().padEnd(10)}\n </Text>{' '}\n \u2192 <Text color={theme.error}>Error</Text>\n </Text>\n </Box>\n )\n }\n })}\n\n <Text> </Text>\n <Box flexDirection=\"column\">\n <Text dimColor>\n Press <Text bold>Enter</Text> or <Text bold>C</Text> to configure\n models\n </Text>\n <Text dimColor>\n Press <Text bold>Esc</Text> to close\n </Text>\n </Box>\n </Box>\n )\n } catch (error) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.error}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\uD83D\uDCCA Model Status Error</Text>\n <Text color={theme.error}>\n Error reading model status: {String(error)}\n </Text>\n <Text> </Text>\n <Text dimColor>\n Press <Text bold>Enter</Text> to configure models\n </Text>\n </Box>\n )\n }\n}\n\nconst model: Command = {\n name: 'model',\n description: 'View model status and configure AI provider settings',\n aliases: ['ms', 'modelstatus', 'model-status'],\n isEnabled: true,\n isHidden: false,\n type: 'local-jsx',\n userFacingName() {\n return 'model'\n },\n async call(onDone, context) {\n const { abortController } = context || {}\n return <ModelCommand onClose={onDone} abortController={abortController} />\n },\n}\n\nexport default model\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["model"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { Box, Text, useInput } from "ink";
|
|
3
|
+
import {
|
|
4
|
+
getPermissionRuleEngine
|
|
5
|
+
} from "../core/permissions/index.js";
|
|
6
|
+
const PermissionList = ({
|
|
7
|
+
rules,
|
|
8
|
+
defaultDecision,
|
|
9
|
+
onDone
|
|
10
|
+
}) => {
|
|
11
|
+
const [selectedIndex, setSelectedIndex] = useState(0);
|
|
12
|
+
useInput((input, key) => {
|
|
13
|
+
if (key.upArrow) {
|
|
14
|
+
setSelectedIndex(Math.max(0, selectedIndex - 1));
|
|
15
|
+
} else if (key.downArrow) {
|
|
16
|
+
setSelectedIndex(Math.min(rules.length - 1, selectedIndex + 1));
|
|
17
|
+
} else if (input === "q" || key.escape) {
|
|
18
|
+
onDone();
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
const globalRules = rules.filter((r) => r.scope === "global");
|
|
22
|
+
const projectRules = rules.filter((r) => r.scope === "project");
|
|
23
|
+
const getDecisionColor = (decision) => {
|
|
24
|
+
switch (decision) {
|
|
25
|
+
case "allow":
|
|
26
|
+
return "green";
|
|
27
|
+
case "deny":
|
|
28
|
+
return "red";
|
|
29
|
+
case "ask":
|
|
30
|
+
return "yellow";
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const formatDecision = (decision) => {
|
|
34
|
+
switch (decision) {
|
|
35
|
+
case "allow":
|
|
36
|
+
return "\u2713 ALLOW";
|
|
37
|
+
case "deny":
|
|
38
|
+
return "\u2717 DENY";
|
|
39
|
+
case "ask":
|
|
40
|
+
return "? ASK";
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const renderRule = (rule, index) => {
|
|
44
|
+
const isSelected = index === selectedIndex;
|
|
45
|
+
return /* @__PURE__ */ React.createElement(Box, { key: rule.id, paddingLeft: 1 }, /* @__PURE__ */ React.createElement(Text, { color: isSelected ? "cyan" : void 0 }, isSelected ? "\u25B6 " : " ", /* @__PURE__ */ React.createElement(Text, { color: getDecisionColor(rule.decision) }, formatDecision(rule.decision).padEnd(10)), /* @__PURE__ */ React.createElement(Text, { bold: true }, rule.pattern.padEnd(30)), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "P", rule.priority), rule.description && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " - ", rule.description)));
|
|
46
|
+
};
|
|
47
|
+
let displayIndex = 0;
|
|
48
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Permission Rules")), /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Default decision: "), /* @__PURE__ */ React.createElement(Text, { color: getDecisionColor(defaultDecision), bold: true }, formatDecision(defaultDecision)))), projectRules.length > 0 && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: "blue" }, "Project Rules (", projectRules.length, ")")), projectRules.map((rule) => {
|
|
49
|
+
const result = renderRule(rule, displayIndex);
|
|
50
|
+
displayIndex++;
|
|
51
|
+
return result;
|
|
52
|
+
})), globalRules.length > 0 && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: "magenta" }, "Global Rules (", globalRules.length, ")")), globalRules.map((rule) => {
|
|
53
|
+
const result = renderRule(rule, displayIndex);
|
|
54
|
+
displayIndex++;
|
|
55
|
+
return result;
|
|
56
|
+
})), rules.length === 0 && /* @__PURE__ */ React.createElement(Box, { paddingLeft: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "No custom rules defined. Using default rules.")), /* @__PURE__ */ React.createElement(Box, { marginTop: 2 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u2191/\u2193: Navigate | q/Esc: Exit")), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Legend: ", /* @__PURE__ */ React.createElement(Text, { color: "green" }, "ALLOW"), " = auto-approve,", " ", /* @__PURE__ */ React.createElement(Text, { color: "red" }, "DENY"), " = block, ", /* @__PURE__ */ React.createElement(Text, { color: "yellow" }, "ASK"), " ", "= prompt user")));
|
|
57
|
+
};
|
|
58
|
+
const command = {
|
|
59
|
+
name: "permissions",
|
|
60
|
+
description: "View and manage permission rules for tool access",
|
|
61
|
+
isEnabled: true,
|
|
62
|
+
isHidden: false,
|
|
63
|
+
type: "local-jsx",
|
|
64
|
+
aliases: ["perms"],
|
|
65
|
+
userFacingName() {
|
|
66
|
+
return this.name;
|
|
67
|
+
},
|
|
68
|
+
async call(onDone, _context) {
|
|
69
|
+
const engine = getPermissionRuleEngine();
|
|
70
|
+
const rules = engine.getRules();
|
|
71
|
+
const defaultDecision = engine.getDefaultDecision();
|
|
72
|
+
return /* @__PURE__ */ React.createElement(
|
|
73
|
+
PermissionList,
|
|
74
|
+
{
|
|
75
|
+
rules,
|
|
76
|
+
defaultDecision,
|
|
77
|
+
onDone
|
|
78
|
+
}
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
var permissions_default = command;
|
|
83
|
+
export {
|
|
84
|
+
permissions_default as default
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/commands/permissions.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * Permissions Command\n *\n * View and manage permission rules for tool access.\n */\n\nimport React, { useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport type { Command } from '@commands'\nimport {\n getPermissionRuleEngine,\n type PatternPermissionRule,\n type RulePermissionDecision,\n} from '../core/permissions'\n\ninterface PermissionListProps {\n rules: PatternPermissionRule[]\n defaultDecision: RulePermissionDecision\n onDone: (result?: string) => void\n}\n\nconst PermissionList = ({\n rules,\n defaultDecision,\n onDone,\n}: PermissionListProps) => {\n const [selectedIndex, setSelectedIndex] = useState(0)\n\n useInput((input, key) => {\n if (key.upArrow) {\n setSelectedIndex(Math.max(0, selectedIndex - 1))\n } else if (key.downArrow) {\n setSelectedIndex(Math.min(rules.length - 1, selectedIndex + 1))\n } else if (input === 'q' || key.escape) {\n onDone()\n }\n })\n\n // Group rules by scope\n const globalRules = rules.filter(r => r.scope === 'global')\n const projectRules = rules.filter(r => r.scope === 'project')\n\n const getDecisionColor = (decision: RulePermissionDecision) => {\n switch (decision) {\n case 'allow':\n return 'green'\n case 'deny':\n return 'red'\n case 'ask':\n return 'yellow'\n }\n }\n\n const formatDecision = (decision: RulePermissionDecision) => {\n switch (decision) {\n case 'allow':\n return '\u2713 ALLOW'\n case 'deny':\n return '\u2717 DENY'\n case 'ask':\n return '? ASK'\n }\n }\n\n const renderRule = (rule: PatternPermissionRule, index: number) => {\n const isSelected = index === selectedIndex\n return (\n <Box key={rule.id} paddingLeft={1}>\n <Text color={isSelected ? 'cyan' : undefined}>\n {isSelected ? '\u25B6 ' : ' '}\n <Text color={getDecisionColor(rule.decision)}>\n {formatDecision(rule.decision).padEnd(10)}\n </Text>\n <Text bold>{rule.pattern.padEnd(30)}</Text>\n <Text dimColor>P{rule.priority}</Text>\n {rule.description && <Text dimColor> - {rule.description}</Text>}\n </Text>\n </Box>\n )\n }\n\n let displayIndex = 0\n\n return (\n <Box flexDirection=\"column\" marginY={1}>\n <Box marginBottom={1}>\n <Text bold>Permission Rules</Text>\n </Box>\n\n {/* Default decision */}\n <Box marginBottom={1}>\n <Text>\n <Text dimColor>Default decision: </Text>\n <Text color={getDecisionColor(defaultDecision)} bold>\n {formatDecision(defaultDecision)}\n </Text>\n </Text>\n </Box>\n\n {/* Project rules */}\n {projectRules.length > 0 && (\n <>\n <Box marginTop={1}>\n <Text bold color=\"blue\">\n Project Rules ({projectRules.length})\n </Text>\n </Box>\n {projectRules.map(rule => {\n const result = renderRule(rule, displayIndex)\n displayIndex++\n return result\n })}\n </>\n )}\n\n {/* Global rules */}\n {globalRules.length > 0 && (\n <>\n <Box marginTop={1}>\n <Text bold color=\"magenta\">\n Global Rules ({globalRules.length})\n </Text>\n </Box>\n {globalRules.map(rule => {\n const result = renderRule(rule, displayIndex)\n displayIndex++\n return result\n })}\n </>\n )}\n\n {rules.length === 0 && (\n <Box paddingLeft={1}>\n <Text dimColor>No custom rules defined. Using default rules.</Text>\n </Box>\n )}\n\n {/* Help */}\n <Box marginTop={2}>\n <Text dimColor>\u2191/\u2193: Navigate | q/Esc: Exit</Text>\n </Box>\n\n {/* Legend */}\n <Box marginTop={1}>\n <Text dimColor>\n Legend: <Text color=\"green\">ALLOW</Text> = auto-approve,{' '}\n <Text color=\"red\">DENY</Text> = block, <Text color=\"yellow\">ASK</Text>{' '}\n = prompt user\n </Text>\n </Box>\n </Box>\n )\n}\n\nconst command: Command = {\n name: 'permissions',\n description: 'View and manage permission rules for tool access',\n isEnabled: true,\n isHidden: false,\n type: 'local-jsx',\n aliases: ['perms'],\n\n userFacingName() {\n return this.name\n },\n\n async call(onDone, _context) {\n const engine = getPermissionRuleEngine()\n const rules = engine.getRules()\n const defaultDecision = engine.getDefaultDecision()\n\n return (\n <PermissionList\n rules={rules}\n defaultDecision={defaultDecision}\n onDone={onDone}\n />\n )\n },\n}\n\nexport default command\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/commands/quit.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { setTerminalTitle } from "../utils/terminal.js";
|
|
1
2
|
const quit = {
|
|
2
3
|
name: "quit",
|
|
3
4
|
description: "Exit Minto",
|
|
@@ -6,7 +7,8 @@ const quit = {
|
|
|
6
7
|
isHidden: false,
|
|
7
8
|
type: "local",
|
|
8
9
|
userFacingName: () => "quit",
|
|
9
|
-
async call(
|
|
10
|
+
async call(args, context) {
|
|
11
|
+
setTerminalTitle("");
|
|
10
12
|
process.exit(0);
|
|
11
13
|
}
|
|
12
14
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/quit.tsx"],
|
|
4
|
-
"sourcesContent": ["import type { Command } from '../commands'\n\nexport const quit: Command = {\n name: 'quit',\n description: 'Exit Minto',\n aliases: ['exit', 'q'],\n isEnabled: true,\n isHidden: false,\n type: 'local',\n userFacingName: () => 'quit',\n async call(
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["import type { Command } from '../commands'\nimport { setTerminalTitle } from '@utils/terminal'\n\n/**\n * /quit slash command\n *\n * Simple exit: clear terminal title and call process.exit(0)\n * Cost summary is printed by useCostSummary's process.on('exit') handler\n */\nexport const quit: Command = {\n name: 'quit',\n description: 'Exit Minto',\n aliases: ['exit', 'q'],\n isEnabled: true,\n isHidden: false,\n type: 'local',\n userFacingName: () => 'quit',\n async call(args, context) {\n setTerminalTitle('')\n process.exit(0)\n },\n}\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,wBAAwB;AAQ1B,MAAM,OAAgB;AAAA,EAC3B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS,CAAC,QAAQ,GAAG;AAAA,EACrB,WAAW;AAAA,EACX,UAAU;AAAA,EACV,MAAM;AAAA,EACN,gBAAgB,MAAM;AAAA,EACtB,MAAM,KAAK,MAAM,SAAS;AACxB,qBAAiB,EAAE;AACnB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { Box, Text, useInput } from "ink";
|
|
3
|
+
import {
|
|
4
|
+
getSandboxController
|
|
5
|
+
} from "../services/sandbox/index.js";
|
|
6
|
+
import { getCwd } from "../utils/state.js";
|
|
7
|
+
const SandboxStatus = ({
|
|
8
|
+
config,
|
|
9
|
+
implementation,
|
|
10
|
+
isAvailable,
|
|
11
|
+
onToggle,
|
|
12
|
+
onDone
|
|
13
|
+
}) => {
|
|
14
|
+
const [showHelp, setShowHelp] = useState(false);
|
|
15
|
+
useInput((input, key) => {
|
|
16
|
+
if (input === "t" || input === "T") {
|
|
17
|
+
onToggle();
|
|
18
|
+
} else if (input === "h" || input === "H") {
|
|
19
|
+
setShowHelp(!showHelp);
|
|
20
|
+
} else if (input === "q" || key.escape) {
|
|
21
|
+
onDone();
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
const getImplColor = (impl) => {
|
|
25
|
+
switch (impl) {
|
|
26
|
+
case "seatbelt":
|
|
27
|
+
return "green";
|
|
28
|
+
case "bubblewrap":
|
|
29
|
+
return "cyan";
|
|
30
|
+
case "docker":
|
|
31
|
+
return "yellow";
|
|
32
|
+
case "none":
|
|
33
|
+
return "gray";
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
const getImplDescription = (impl) => {
|
|
37
|
+
switch (impl) {
|
|
38
|
+
case "seatbelt":
|
|
39
|
+
return "macOS sandbox-exec (built-in)";
|
|
40
|
+
case "bubblewrap":
|
|
41
|
+
return "Linux bubblewrap container";
|
|
42
|
+
case "docker":
|
|
43
|
+
return "Docker container isolation";
|
|
44
|
+
case "none":
|
|
45
|
+
return "No sandbox available";
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: "cyan" }, "Sandbox Configuration")), /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Status: "), config.enabled && isAvailable ? /* @__PURE__ */ React.createElement(Text, { color: "green" }, "\u25CF ENABLED") : /* @__PURE__ */ React.createElement(Text, { color: "red" }, "\u25CB DISABLED"))), /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Implementation: "), /* @__PURE__ */ React.createElement(Text, { color: getImplColor(implementation) }, implementation.toUpperCase())), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " - ", getImplDescription(implementation))), !isAvailable && /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { color: "yellow" }, "\u26A0 Sandbox not available on this system")), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Filesystem Policy:"), /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Write Allowed: "), config.filesystem.writeAllowed.length > 0 ? /* @__PURE__ */ React.createElement(Text, { color: "green" }, config.filesystem.writeAllowed.slice(0, 3).join(", "), config.filesystem.writeAllowed.length > 3 && " ...") : /* @__PURE__ */ React.createElement(Text, { color: "red" }, "None")), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Denied Paths: "), config.filesystem.denied.length > 0 ? /* @__PURE__ */ React.createElement(Text, { color: "red" }, config.filesystem.denied.length, " paths blocked") : /* @__PURE__ */ React.createElement(Text, { color: "green" }, "None blocked")))), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Network Policy:"), /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Network Access: "), config.network.blockAll ? /* @__PURE__ */ React.createElement(Text, { color: "red" }, "Blocked") : /* @__PURE__ */ React.createElement(Text, { color: "green" }, "Allowed")), !config.network.blockAll && config.network.allowedDomains.length > 0 && /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Allowed Domains: "), /* @__PURE__ */ React.createElement(Text, null, config.network.allowedDomains.slice(0, 3).join(", "), config.network.allowedDomains.length > 3 && " ...")))), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Process Policy:"), /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Max Execution Time: "), /* @__PURE__ */ React.createElement(Text, null, config.process.maxExecutionTime / 1e3, "s")), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Excluded Commands: "), /* @__PURE__ */ React.createElement(Text, null, config.process.excludedCommands.length > 0 ? config.process.excludedCommands.slice(0, 3).join(", ") : "None", config.process.excludedCommands.length > 3 && " ...")))), showHelp && /* @__PURE__ */ React.createElement(
|
|
49
|
+
Box,
|
|
50
|
+
{
|
|
51
|
+
flexDirection: "column",
|
|
52
|
+
marginY: 1,
|
|
53
|
+
borderStyle: "round",
|
|
54
|
+
paddingX: 1
|
|
55
|
+
},
|
|
56
|
+
/* @__PURE__ */ React.createElement(Text, { bold: true }, "Sandbox Implementations:"),
|
|
57
|
+
/* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingLeft: 1 }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: "green" }, "\u2022 seatbelt:"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " macOS built-in sandbox-exec")), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, "\u2022 bubblewrap:"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " Linux container isolation (bwrap)")), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: "yellow" }, "\u2022 docker:"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " Docker container isolation")), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: "gray" }, "\u2022 none:"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " No sandboxing (not recommended)")))
|
|
58
|
+
), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "t: Toggle sandbox | h: Show/hide help | q/Esc: Exit")));
|
|
59
|
+
};
|
|
60
|
+
const command = {
|
|
61
|
+
name: "sandbox",
|
|
62
|
+
description: "View and toggle sandbox mode for command execution",
|
|
63
|
+
isEnabled: true,
|
|
64
|
+
isHidden: false,
|
|
65
|
+
type: "local-jsx",
|
|
66
|
+
userFacingName() {
|
|
67
|
+
return this.name;
|
|
68
|
+
},
|
|
69
|
+
async call(onDone, _context) {
|
|
70
|
+
const cwd = getCwd();
|
|
71
|
+
const controller = getSandboxController(cwd);
|
|
72
|
+
const initialConfig = controller.getConfig();
|
|
73
|
+
const implementation = controller.getImplementationType();
|
|
74
|
+
const initialAvailable = await controller.isAvailable();
|
|
75
|
+
const SandboxWrapper = () => {
|
|
76
|
+
const [config, setConfig] = useState(initialConfig);
|
|
77
|
+
const [isAvailable, setIsAvailable] = useState(initialAvailable);
|
|
78
|
+
const handleToggle = async () => {
|
|
79
|
+
const newEnabled = !config.enabled;
|
|
80
|
+
controller.updateConfig({ enabled: newEnabled });
|
|
81
|
+
const newConfig = controller.getConfig();
|
|
82
|
+
setConfig(newConfig);
|
|
83
|
+
const available = await controller.isAvailable();
|
|
84
|
+
setIsAvailable(available);
|
|
85
|
+
};
|
|
86
|
+
return /* @__PURE__ */ React.createElement(
|
|
87
|
+
SandboxStatus,
|
|
88
|
+
{
|
|
89
|
+
config,
|
|
90
|
+
implementation,
|
|
91
|
+
isAvailable,
|
|
92
|
+
onToggle: handleToggle,
|
|
93
|
+
onDone
|
|
94
|
+
}
|
|
95
|
+
);
|
|
96
|
+
};
|
|
97
|
+
return /* @__PURE__ */ React.createElement(SandboxWrapper, null);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
var sandbox_default = command;
|
|
101
|
+
export {
|
|
102
|
+
sandbox_default as default
|
|
103
|
+
};
|
|
104
|
+
//# sourceMappingURL=sandbox.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/commands/sandbox.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * Sandbox Command\n *\n * Toggle and configure sandbox mode for command execution.\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport type { Command } from '@commands'\nimport {\n getSandboxController,\n type SandboxConfig,\n type SandboxImplementation,\n} from '../services/sandbox'\nimport { getCwd } from '@utils/state'\n\ninterface SandboxStatusProps {\n config: SandboxConfig\n implementation: SandboxImplementation\n isAvailable: boolean\n onToggle: () => void\n onDone: () => void\n}\n\nconst SandboxStatus = ({\n config,\n implementation,\n isAvailable,\n onToggle,\n onDone,\n}: SandboxStatusProps) => {\n const [showHelp, setShowHelp] = useState(false)\n\n useInput((input, key) => {\n if (input === 't' || input === 'T') {\n onToggle()\n } else if (input === 'h' || input === 'H') {\n setShowHelp(!showHelp)\n } else if (input === 'q' || key.escape) {\n onDone()\n }\n })\n\n const getImplColor = (impl: SandboxImplementation) => {\n switch (impl) {\n case 'seatbelt':\n return 'green'\n case 'bubblewrap':\n return 'cyan'\n case 'docker':\n return 'yellow'\n case 'none':\n return 'gray'\n }\n }\n\n const getImplDescription = (impl: SandboxImplementation) => {\n switch (impl) {\n case 'seatbelt':\n return 'macOS sandbox-exec (built-in)'\n case 'bubblewrap':\n return 'Linux bubblewrap container'\n case 'docker':\n return 'Docker container isolation'\n case 'none':\n return 'No sandbox available'\n }\n }\n\n return (\n <Box flexDirection=\"column\" marginY={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n Sandbox Configuration\n </Text>\n </Box>\n\n {/* Status */}\n <Box marginBottom={1}>\n <Text>\n <Text bold>Status: </Text>\n {config.enabled && isAvailable ? (\n <Text color=\"green\">\u25CF ENABLED</Text>\n ) : (\n <Text color=\"red\">\u25CB DISABLED</Text>\n )}\n </Text>\n </Box>\n\n {/* Implementation */}\n <Box marginBottom={1}>\n <Text>\n <Text bold>Implementation: </Text>\n <Text color={getImplColor(implementation)}>\n {implementation.toUpperCase()}\n </Text>\n </Text>\n <Text dimColor> - {getImplDescription(implementation)}</Text>\n </Box>\n\n {/* Availability */}\n {!isAvailable && (\n <Box marginBottom={1}>\n <Text color=\"yellow\">\u26A0 Sandbox not available on this system</Text>\n </Box>\n )}\n\n {/* Configuration details */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold>Filesystem Policy:</Text>\n <Box paddingLeft={2} flexDirection=\"column\">\n <Text>\n <Text dimColor>Write Allowed: </Text>\n {config.filesystem.writeAllowed.length > 0 ? (\n <Text color=\"green\">\n {config.filesystem.writeAllowed.slice(0, 3).join(', ')}\n {config.filesystem.writeAllowed.length > 3 && ' ...'}\n </Text>\n ) : (\n <Text color=\"red\">None</Text>\n )}\n </Text>\n <Text>\n <Text dimColor>Denied Paths: </Text>\n {config.filesystem.denied.length > 0 ? (\n <Text color=\"red\">\n {config.filesystem.denied.length} paths blocked\n </Text>\n ) : (\n <Text color=\"green\">None blocked</Text>\n )}\n </Text>\n </Box>\n </Box>\n\n {/* Network policy */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold>Network Policy:</Text>\n <Box paddingLeft={2} flexDirection=\"column\">\n <Text>\n <Text dimColor>Network Access: </Text>\n {config.network.blockAll ? (\n <Text color=\"red\">Blocked</Text>\n ) : (\n <Text color=\"green\">Allowed</Text>\n )}\n </Text>\n {!config.network.blockAll &&\n config.network.allowedDomains.length > 0 && (\n <Text>\n <Text dimColor>Allowed Domains: </Text>\n <Text>\n {config.network.allowedDomains.slice(0, 3).join(', ')}\n {config.network.allowedDomains.length > 3 && ' ...'}\n </Text>\n </Text>\n )}\n </Box>\n </Box>\n\n {/* Process policy */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold>Process Policy:</Text>\n <Box paddingLeft={2} flexDirection=\"column\">\n <Text>\n <Text dimColor>Max Execution Time: </Text>\n <Text>{config.process.maxExecutionTime / 1000}s</Text>\n </Text>\n <Text>\n <Text dimColor>Excluded Commands: </Text>\n <Text>\n {config.process.excludedCommands.length > 0\n ? config.process.excludedCommands.slice(0, 3).join(', ')\n : 'None'}\n {config.process.excludedCommands.length > 3 && ' ...'}\n </Text>\n </Text>\n </Box>\n </Box>\n\n {/* Help toggle */}\n {showHelp && (\n <Box\n flexDirection=\"column\"\n marginY={1}\n borderStyle=\"round\"\n paddingX={1}\n >\n <Text bold>Sandbox Implementations:</Text>\n <Box flexDirection=\"column\" paddingLeft={1}>\n <Text>\n <Text color=\"green\">\u2022 seatbelt:</Text>\n <Text dimColor> macOS built-in sandbox-exec</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">\u2022 bubblewrap:</Text>\n <Text dimColor> Linux container isolation (bwrap)</Text>\n </Text>\n <Text>\n <Text color=\"yellow\">\u2022 docker:</Text>\n <Text dimColor> Docker container isolation</Text>\n </Text>\n <Text>\n <Text color=\"gray\">\u2022 none:</Text>\n <Text dimColor> No sandboxing (not recommended)</Text>\n </Text>\n </Box>\n </Box>\n )}\n\n {/* Controls */}\n <Box marginTop={1}>\n <Text dimColor>\n t: Toggle sandbox | h: Show/hide help | q/Esc: Exit\n </Text>\n </Box>\n </Box>\n )\n}\n\nconst command: Command = {\n name: 'sandbox',\n description: 'View and toggle sandbox mode for command execution',\n isEnabled: true,\n isHidden: false,\n type: 'local-jsx',\n\n userFacingName() {\n return this.name\n },\n\n async call(onDone, _context) {\n const cwd = getCwd()\n const controller = getSandboxController(cwd)\n const initialConfig = controller.getConfig()\n const implementation = controller.getImplementationType()\n const initialAvailable = await controller.isAvailable()\n\n // Create a wrapper component to manage state\n const SandboxWrapper = () => {\n const [config, setConfig] = useState(initialConfig)\n const [isAvailable, setIsAvailable] = useState(initialAvailable)\n\n const handleToggle = async () => {\n const newEnabled = !config.enabled\n controller.updateConfig({ enabled: newEnabled })\n const newConfig = controller.getConfig()\n setConfig(newConfig)\n const available = await controller.isAvailable()\n setIsAvailable(available)\n }\n\n return (\n <SandboxStatus\n config={config}\n implementation={implementation}\n isAvailable={isAvailable}\n onToggle={handleToggle}\n onDone={onDone}\n />\n )\n }\n\n return <SandboxWrapper />\n },\n}\n\nexport default command\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { getModelManager } from "../utils/model.js";
|
|
4
|
+
import { getCwd } from "../utils/state.js";
|
|
5
|
+
import { MACRO } from "../constants/macros.js";
|
|
6
|
+
const StatusDisplay = ({ status }) => {
|
|
7
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: "cyan" }, "Minto Status")), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Version Info"), /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Minto: "), /* @__PURE__ */ React.createElement(Text, { color: "green" }, "v", status.version)), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Node.js: "), /* @__PURE__ */ React.createElement(Text, null, status.nodeVersion)), status.bunVersion && /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Bun: "), /* @__PURE__ */ React.createElement(Text, null, status.bunVersion)), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Platform: "), /* @__PURE__ */ React.createElement(Text, null, status.platform)))), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Environment"), /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "CWD: "), /* @__PURE__ */ React.createElement(Text, null, status.cwd)))), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Model Configuration"), /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2, flexDirection: "column" }, status.modelInfo ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Model: "), /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, status.modelInfo.name)), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Provider: "), /* @__PURE__ */ React.createElement(Text, null, status.modelInfo.provider)), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Context: "), /* @__PURE__ */ React.createElement(Text, null, (status.modelInfo.contextLength / 1e3).toFixed(0), "k tokens"))) : /* @__PURE__ */ React.createElement(Text, { color: "yellow" }, "No model configured"))), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "API Connection"), /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Status: "), status.apiConnected ? /* @__PURE__ */ React.createElement(Text, { color: "green" }, "\u25CF Connected") : /* @__PURE__ */ React.createElement(Text, { color: "red" }, "\u25CB Not connected")))));
|
|
8
|
+
};
|
|
9
|
+
async function getStatusInfo() {
|
|
10
|
+
let modelInfo = null;
|
|
11
|
+
let apiConnected = false;
|
|
12
|
+
try {
|
|
13
|
+
const modelManager = getModelManager();
|
|
14
|
+
const profile = modelManager.resolveModel("main");
|
|
15
|
+
if (profile) {
|
|
16
|
+
modelInfo = {
|
|
17
|
+
name: profile.name || profile.modelName,
|
|
18
|
+
provider: profile.provider || "anthropic",
|
|
19
|
+
contextLength: profile.contextLength || 2e5
|
|
20
|
+
};
|
|
21
|
+
apiConnected = true;
|
|
22
|
+
}
|
|
23
|
+
} catch {
|
|
24
|
+
}
|
|
25
|
+
let bunVersion = null;
|
|
26
|
+
if (typeof Bun !== "undefined") {
|
|
27
|
+
bunVersion = Bun.version;
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
version: MACRO.VERSION,
|
|
31
|
+
nodeVersion: process.version,
|
|
32
|
+
bunVersion,
|
|
33
|
+
platform: `${process.platform} (${process.arch})`,
|
|
34
|
+
cwd: getCwd(),
|
|
35
|
+
modelInfo,
|
|
36
|
+
apiConnected
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
const command = {
|
|
40
|
+
name: "status",
|
|
41
|
+
description: "Display version and connection information",
|
|
42
|
+
isEnabled: true,
|
|
43
|
+
isHidden: false,
|
|
44
|
+
type: "local-jsx",
|
|
45
|
+
userFacingName() {
|
|
46
|
+
return this.name;
|
|
47
|
+
},
|
|
48
|
+
async call(onDone) {
|
|
49
|
+
const status = await getStatusInfo();
|
|
50
|
+
setTimeout(() => onDone(), 100);
|
|
51
|
+
return /* @__PURE__ */ React.createElement(StatusDisplay, { status });
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
var status_default = command;
|
|
55
|
+
export {
|
|
56
|
+
status_default as default
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/commands/status.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * Status Command\n *\n * Shows version information, connection status, and system health.\n */\n\nimport React from 'react'\nimport { Box, Text } from 'ink'\nimport type { Command } from '@commands'\nimport { getModelManager } from '@utils/model'\nimport { getCwd } from '@utils/state'\nimport { MACRO } from '@constants/macros'\n\ninterface StatusInfo {\n version: string\n nodeVersion: string\n bunVersion: string | null\n platform: string\n cwd: string\n modelInfo: {\n name: string\n provider: string\n contextLength: number\n } | null\n apiConnected: boolean\n}\n\nconst StatusDisplay = ({ status }: { status: StatusInfo }) => {\n return (\n <Box flexDirection=\"column\" marginY={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n Minto Status\n </Text>\n </Box>\n\n {/* Version info */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold>Version Info</Text>\n <Box paddingLeft={2} flexDirection=\"column\">\n <Text>\n <Text dimColor>Minto: </Text>\n <Text color=\"green\">v{status.version}</Text>\n </Text>\n <Text>\n <Text dimColor>Node.js: </Text>\n <Text>{status.nodeVersion}</Text>\n </Text>\n {status.bunVersion && (\n <Text>\n <Text dimColor>Bun: </Text>\n <Text>{status.bunVersion}</Text>\n </Text>\n )}\n <Text>\n <Text dimColor>Platform: </Text>\n <Text>{status.platform}</Text>\n </Text>\n </Box>\n </Box>\n\n {/* Environment */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold>Environment</Text>\n <Box paddingLeft={2} flexDirection=\"column\">\n <Text>\n <Text dimColor>CWD: </Text>\n <Text>{status.cwd}</Text>\n </Text>\n </Box>\n </Box>\n\n {/* Model info */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold>Model Configuration</Text>\n <Box paddingLeft={2} flexDirection=\"column\">\n {status.modelInfo ? (\n <>\n <Text>\n <Text dimColor>Model: </Text>\n <Text color=\"cyan\">{status.modelInfo.name}</Text>\n </Text>\n <Text>\n <Text dimColor>Provider: </Text>\n <Text>{status.modelInfo.provider}</Text>\n </Text>\n <Text>\n <Text dimColor>Context: </Text>\n <Text>\n {(status.modelInfo.contextLength / 1000).toFixed(0)}k tokens\n </Text>\n </Text>\n </>\n ) : (\n <Text color=\"yellow\">No model configured</Text>\n )}\n </Box>\n </Box>\n\n {/* API Status */}\n <Box flexDirection=\"column\">\n <Text bold>API Connection</Text>\n <Box paddingLeft={2}>\n <Text>\n <Text dimColor>Status: </Text>\n {status.apiConnected ? (\n <Text color=\"green\">\u25CF Connected</Text>\n ) : (\n <Text color=\"red\">\u25CB Not connected</Text>\n )}\n </Text>\n </Box>\n </Box>\n </Box>\n )\n}\n\nasync function getStatusInfo(): Promise<StatusInfo> {\n let modelInfo: StatusInfo['modelInfo'] = null\n let apiConnected = false\n\n try {\n const modelManager = getModelManager()\n const profile = modelManager.resolveModel('main')\n if (profile) {\n modelInfo = {\n name: profile.name || profile.modelName,\n provider: profile.provider || 'anthropic',\n contextLength: profile.contextLength || 200_000,\n }\n apiConnected = true // If we can resolve model, API is configured\n }\n } catch {\n // Model not configured\n }\n\n // Check for Bun\n let bunVersion: string | null = null\n if (typeof Bun !== 'undefined') {\n bunVersion = Bun.version\n }\n\n return {\n version: MACRO.VERSION,\n nodeVersion: process.version,\n bunVersion,\n platform: `${process.platform} (${process.arch})`,\n cwd: getCwd(),\n modelInfo,\n apiConnected,\n }\n}\n\nconst command: Command = {\n name: 'status',\n description: 'Display version and connection information',\n isEnabled: true,\n isHidden: false,\n type: 'local-jsx',\n\n userFacingName() {\n return this.name\n },\n\n async call(onDone) {\n const status = await getStatusInfo()\n\n setTimeout(() => onDone(), 100)\n\n return <StatusDisplay status={status} />\n },\n}\n\nexport default command\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { BackgroundShellManager } from "../utils/BackgroundShellManager.js";
|
|
2
|
+
import {
|
|
3
|
+
listAgentTranscripts
|
|
4
|
+
} from "../utils/agentTranscripts.js";
|
|
5
|
+
import { formatDuration } from "../utils/format.js";
|
|
6
|
+
function collectTasks() {
|
|
7
|
+
const tasks2 = [];
|
|
8
|
+
const shellManager = BackgroundShellManager.getInstance();
|
|
9
|
+
const shells = shellManager.list();
|
|
10
|
+
for (const shell of shells) {
|
|
11
|
+
const duration = shell.endTime ? shell.endTime - shell.startTime : Date.now() - shell.startTime;
|
|
12
|
+
tasks2.push({
|
|
13
|
+
id: shell.id,
|
|
14
|
+
type: "shell",
|
|
15
|
+
command: shell.command.length > 50 ? shell.command.slice(0, 47) + "..." : shell.command,
|
|
16
|
+
status: shell.status,
|
|
17
|
+
startTime: shell.startTime,
|
|
18
|
+
endTime: shell.endTime,
|
|
19
|
+
duration
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
const transcripts = listAgentTranscripts({
|
|
23
|
+
limit: 20
|
|
24
|
+
});
|
|
25
|
+
for (const transcript of transcripts) {
|
|
26
|
+
const duration = transcript.endTime ? transcript.endTime - transcript.startTime : Date.now() - transcript.startTime;
|
|
27
|
+
tasks2.push({
|
|
28
|
+
id: transcript.agentId,
|
|
29
|
+
type: "agent",
|
|
30
|
+
command: transcript.description,
|
|
31
|
+
status: transcript.status,
|
|
32
|
+
startTime: transcript.startTime,
|
|
33
|
+
endTime: transcript.endTime,
|
|
34
|
+
duration
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return tasks2.sort((a, b) => b.startTime - a.startTime);
|
|
38
|
+
}
|
|
39
|
+
function formatStatus(status) {
|
|
40
|
+
switch (status) {
|
|
41
|
+
case "running":
|
|
42
|
+
return "\u25B6 running";
|
|
43
|
+
case "done":
|
|
44
|
+
case "completed":
|
|
45
|
+
return "\u2713 done";
|
|
46
|
+
case "killed":
|
|
47
|
+
return "\u2717 killed";
|
|
48
|
+
case "failed":
|
|
49
|
+
return "\u2717 failed";
|
|
50
|
+
case "interrupted":
|
|
51
|
+
return "\u23F8 interrupted";
|
|
52
|
+
default:
|
|
53
|
+
return status;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function formatTasks(tasks2) {
|
|
57
|
+
if (tasks2.length === 0) {
|
|
58
|
+
return "No background tasks";
|
|
59
|
+
}
|
|
60
|
+
const lines = [];
|
|
61
|
+
lines.push("=== Background Tasks ===\n");
|
|
62
|
+
const running = tasks2.filter((t) => t.status === "running");
|
|
63
|
+
const completed = tasks2.filter((t) => t.status !== "running");
|
|
64
|
+
if (running.length > 0) {
|
|
65
|
+
lines.push("## Running");
|
|
66
|
+
for (const task of running) {
|
|
67
|
+
lines.push(
|
|
68
|
+
` [${task.type}] ${task.id} ${formatDuration(task.duration)} ${task.command}`
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
lines.push("");
|
|
72
|
+
}
|
|
73
|
+
if (completed.length > 0) {
|
|
74
|
+
lines.push("## Recent");
|
|
75
|
+
for (const task of completed.slice(0, 10)) {
|
|
76
|
+
lines.push(
|
|
77
|
+
` [${task.type}] ${task.id} ${formatStatus(task.status)} ${formatDuration(task.duration)} ${task.command}`
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
lines.push("");
|
|
81
|
+
}
|
|
82
|
+
lines.push(
|
|
83
|
+
`Total: ${running.length} running, ${completed.length} completed/stopped`
|
|
84
|
+
);
|
|
85
|
+
lines.push("");
|
|
86
|
+
lines.push("Use TaskOutput tool to get output from a specific task.");
|
|
87
|
+
lines.push("Use KillShell tool to terminate a running shell.");
|
|
88
|
+
return lines.join("\n");
|
|
89
|
+
}
|
|
90
|
+
const tasks = {
|
|
91
|
+
type: "local",
|
|
92
|
+
name: "tasks",
|
|
93
|
+
description: "List background tasks (shells and agents)",
|
|
94
|
+
isEnabled: true,
|
|
95
|
+
isHidden: false,
|
|
96
|
+
async call() {
|
|
97
|
+
const taskList = collectTasks();
|
|
98
|
+
return formatTasks(taskList);
|
|
99
|
+
},
|
|
100
|
+
userFacingName() {
|
|
101
|
+
return "tasks";
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
var tasks_default = tasks;
|
|
105
|
+
export {
|
|
106
|
+
tasks_default as default
|
|
107
|
+
};
|
|
108
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/commands/tasks.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Command } from '@commands'\nimport { BackgroundShellManager } from '@utils/BackgroundShellManager'\nimport {\n listAgentTranscripts,\n type AgentTranscriptSummary,\n} from '@utils/agentTranscripts'\nimport { formatDuration } from '@utils/format'\n\n/**\n * List background tasks (shells and agents)\n * Shows running and recently completed tasks\n */\n\ntype TaskType = 'shell' | 'agent'\ntype TaskStatus =\n | 'running'\n | 'done'\n | 'killed'\n | 'completed'\n | 'failed'\n | 'interrupted'\n\ninterface TaskInfo {\n id: string\n type: TaskType\n command: string\n status: TaskStatus\n startTime: number\n endTime?: number\n duration: number\n}\n\nfunction collectTasks(): TaskInfo[] {\n const tasks: TaskInfo[] = []\n\n // Collect background shells\n const shellManager = BackgroundShellManager.getInstance()\n const shells = shellManager.list()\n\n for (const shell of shells) {\n const duration = shell.endTime\n ? shell.endTime - shell.startTime\n : Date.now() - shell.startTime\n\n tasks.push({\n id: shell.id,\n type: 'shell',\n command:\n shell.command.length > 50\n ? shell.command.slice(0, 47) + '...'\n : shell.command,\n status: shell.status,\n startTime: shell.startTime,\n endTime: shell.endTime,\n duration,\n })\n }\n\n // Collect agent transcripts\n const transcripts = listAgentTranscripts({\n limit: 20,\n })\n\n for (const transcript of transcripts) {\n const duration = transcript.endTime\n ? transcript.endTime - transcript.startTime\n : Date.now() - transcript.startTime\n\n tasks.push({\n id: transcript.agentId,\n type: 'agent',\n command: transcript.description,\n status: transcript.status,\n startTime: transcript.startTime,\n endTime: transcript.endTime,\n duration,\n })\n }\n\n // Sort by start time, most recent first\n return tasks.sort((a, b) => b.startTime - a.startTime)\n}\n\nfunction formatStatus(status: TaskStatus): string {\n switch (status) {\n case 'running':\n return '\u25B6 running'\n case 'done':\n case 'completed':\n return '\u2713 done'\n case 'killed':\n return '\u2717 killed'\n case 'failed':\n return '\u2717 failed'\n case 'interrupted':\n return '\u23F8 interrupted'\n default:\n return status\n }\n}\n\nfunction formatTasks(tasks: TaskInfo[]): string {\n if (tasks.length === 0) {\n return 'No background tasks'\n }\n\n const lines: string[] = []\n lines.push('=== Background Tasks ===\\n')\n\n // Group by status\n const running = tasks.filter(t => t.status === 'running')\n const completed = tasks.filter(t => t.status !== 'running')\n\n if (running.length > 0) {\n lines.push('## Running')\n for (const task of running) {\n lines.push(\n ` [${task.type}] ${task.id} ${formatDuration(task.duration)} ${task.command}`,\n )\n }\n lines.push('')\n }\n\n if (completed.length > 0) {\n lines.push('## Recent')\n for (const task of completed.slice(0, 10)) {\n lines.push(\n ` [${task.type}] ${task.id} ${formatStatus(task.status)} ${formatDuration(task.duration)} ${task.command}`,\n )\n }\n lines.push('')\n }\n\n // Summary\n lines.push(\n `Total: ${running.length} running, ${completed.length} completed/stopped`,\n )\n lines.push('')\n lines.push('Use TaskOutput tool to get output from a specific task.')\n lines.push('Use KillShell tool to terminate a running shell.')\n\n return lines.join('\\n')\n}\n\nconst tasks = {\n type: 'local',\n name: 'tasks',\n description: 'List background tasks (shells and agents)',\n isEnabled: true,\n isHidden: false,\n async call() {\n const taskList = collectTasks()\n return formatTasks(taskList)\n },\n userFacingName() {\n return 'tasks'\n },\n} satisfies Command\n\nexport default tasks\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["tasks"]
|
|
7
|
+
}
|