@within-7/minto 0.1.6 → 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 +10 -3
- 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 +8 -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 +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/FileReadTool/FileReadTool.js +23 -4
- package/dist/tools/FileReadTool/FileReadTool.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 +14 -3
- package/dist/tools/GlobTool/GlobTool.js.map +2 -2
- package/dist/tools/GrepTool/GrepTool.js +41 -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 +11 -4
- 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 +8 -4
- 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 +14 -3
- 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 +321 -146
- 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 -73
- package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/URLFetcherTool.js +7 -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/WebSearchTool/WebSearchTool.js +6 -1
- package/dist/tools/WebSearchTool/WebSearchTool.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
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const McpStdioServerConfigSchema = z.object({
|
|
3
|
+
type: z.literal("stdio").optional().default("stdio"),
|
|
4
|
+
command: z.string(),
|
|
5
|
+
args: z.array(z.string()),
|
|
6
|
+
env: z.record(z.string()).optional(),
|
|
7
|
+
enabled: z.boolean().optional()
|
|
8
|
+
});
|
|
9
|
+
const McpSSEServerConfigSchema = z.object({
|
|
10
|
+
type: z.literal("sse"),
|
|
11
|
+
url: z.string(),
|
|
12
|
+
enabled: z.boolean().optional()
|
|
13
|
+
});
|
|
14
|
+
const McpServerConfigSchema = z.union([
|
|
15
|
+
McpStdioServerConfigSchema,
|
|
16
|
+
McpSSEServerConfigSchema
|
|
17
|
+
]);
|
|
18
|
+
const AutoUpdaterStatusSchema = z.enum([
|
|
19
|
+
"disabled",
|
|
20
|
+
"enabled",
|
|
21
|
+
"no_permissions",
|
|
22
|
+
"not_configured"
|
|
23
|
+
]);
|
|
24
|
+
const NotificationChannelSchema = z.enum([
|
|
25
|
+
"iterm2",
|
|
26
|
+
"terminal_bell",
|
|
27
|
+
"iterm2_with_bell",
|
|
28
|
+
"notifications_disabled"
|
|
29
|
+
]);
|
|
30
|
+
const ProviderTypeSchema = z.enum([
|
|
31
|
+
"anthropic",
|
|
32
|
+
"openai",
|
|
33
|
+
"mistral",
|
|
34
|
+
"deepseek",
|
|
35
|
+
"kimi",
|
|
36
|
+
"qwen",
|
|
37
|
+
"glm",
|
|
38
|
+
"minimax",
|
|
39
|
+
"baidu-qianfan",
|
|
40
|
+
"siliconflow",
|
|
41
|
+
"bigdream",
|
|
42
|
+
"opendev",
|
|
43
|
+
"xai",
|
|
44
|
+
"groq",
|
|
45
|
+
"gemini",
|
|
46
|
+
"ollama",
|
|
47
|
+
"azure",
|
|
48
|
+
"custom",
|
|
49
|
+
"custom-openai"
|
|
50
|
+
]);
|
|
51
|
+
const CompressionModeSchema = z.enum(["business", "code"]);
|
|
52
|
+
const ReasoningEffortSchema = z.enum([
|
|
53
|
+
"minimal",
|
|
54
|
+
"low",
|
|
55
|
+
"medium",
|
|
56
|
+
"high"
|
|
57
|
+
]);
|
|
58
|
+
const ModelProfileSchema = z.object({
|
|
59
|
+
name: z.string(),
|
|
60
|
+
provider: ProviderTypeSchema,
|
|
61
|
+
modelName: z.string(),
|
|
62
|
+
baseURL: z.string().optional(),
|
|
63
|
+
apiKey: z.string(),
|
|
64
|
+
maxTokens: z.number(),
|
|
65
|
+
contextLength: z.number(),
|
|
66
|
+
reasoningEffort: ReasoningEffortSchema.optional(),
|
|
67
|
+
isActive: z.boolean(),
|
|
68
|
+
createdAt: z.number(),
|
|
69
|
+
lastUsed: z.number().optional(),
|
|
70
|
+
isGPT5: z.boolean().optional(),
|
|
71
|
+
validationStatus: z.enum(["valid", "needs_repair", "auto_repaired"]).optional(),
|
|
72
|
+
lastValidation: z.number().optional()
|
|
73
|
+
});
|
|
74
|
+
const ModelPointerTypeSchema = z.enum([
|
|
75
|
+
"main",
|
|
76
|
+
"task",
|
|
77
|
+
"reasoning",
|
|
78
|
+
"quick"
|
|
79
|
+
]);
|
|
80
|
+
const ModelPointersSchema = z.object({
|
|
81
|
+
main: z.string(),
|
|
82
|
+
task: z.string(),
|
|
83
|
+
reasoning: z.string(),
|
|
84
|
+
quick: z.string()
|
|
85
|
+
});
|
|
86
|
+
const AccountInfoSchema = z.object({
|
|
87
|
+
accountUuid: z.string(),
|
|
88
|
+
emailAddress: z.string(),
|
|
89
|
+
organizationUuid: z.string().optional()
|
|
90
|
+
});
|
|
91
|
+
const ProjectConfigSchema = z.object({
|
|
92
|
+
allowedTools: z.array(z.string()),
|
|
93
|
+
context: z.record(z.string()),
|
|
94
|
+
contextFiles: z.array(z.string()).optional(),
|
|
95
|
+
history: z.array(z.string()),
|
|
96
|
+
dontCrawlDirectory: z.boolean().optional(),
|
|
97
|
+
enableArchitectTool: z.boolean().optional(),
|
|
98
|
+
mcpContextUris: z.array(z.string()),
|
|
99
|
+
mcpServers: z.record(McpServerConfigSchema).optional(),
|
|
100
|
+
approvedMcprcServers: z.array(z.string()).optional(),
|
|
101
|
+
rejectedMcprcServers: z.array(z.string()).optional(),
|
|
102
|
+
lastAPIDuration: z.number().optional(),
|
|
103
|
+
lastCost: z.number().optional(),
|
|
104
|
+
lastDuration: z.number().optional(),
|
|
105
|
+
lastSessionId: z.string().optional(),
|
|
106
|
+
exampleFiles: z.array(z.string()).optional(),
|
|
107
|
+
exampleFilesGeneratedAt: z.number().optional(),
|
|
108
|
+
hasTrustDialogAccepted: z.boolean().optional(),
|
|
109
|
+
hasCompletedProjectOnboarding: z.boolean().optional()
|
|
110
|
+
});
|
|
111
|
+
const GlobalConfigSchema = z.object({
|
|
112
|
+
projects: z.record(ProjectConfigSchema).optional(),
|
|
113
|
+
numStartups: z.number(),
|
|
114
|
+
autoUpdaterStatus: AutoUpdaterStatusSchema.optional(),
|
|
115
|
+
userID: z.string().optional(),
|
|
116
|
+
theme: z.string(),
|
|
117
|
+
hasCompletedOnboarding: z.boolean().optional(),
|
|
118
|
+
lastOnboardingVersion: z.string().optional(),
|
|
119
|
+
lastReleaseNotesSeen: z.string().optional(),
|
|
120
|
+
mcpServers: z.record(McpServerConfigSchema).optional(),
|
|
121
|
+
preferredNotifChannel: NotificationChannelSchema,
|
|
122
|
+
verbose: z.boolean(),
|
|
123
|
+
customApiKeyResponses: z.object({
|
|
124
|
+
approved: z.array(z.string()).optional(),
|
|
125
|
+
rejected: z.array(z.string()).optional()
|
|
126
|
+
}).optional(),
|
|
127
|
+
primaryProvider: ProviderTypeSchema.optional(),
|
|
128
|
+
maxTokens: z.number().optional(),
|
|
129
|
+
hasAcknowledgedCostThreshold: z.boolean().optional(),
|
|
130
|
+
oauthAccount: AccountInfoSchema.optional(),
|
|
131
|
+
iterm2KeyBindingInstalled: z.boolean().optional(),
|
|
132
|
+
shiftEnterKeyBindingInstalled: z.boolean().optional(),
|
|
133
|
+
proxy: z.string().optional(),
|
|
134
|
+
stream: z.boolean().optional(),
|
|
135
|
+
modelProfiles: z.array(ModelProfileSchema).optional(),
|
|
136
|
+
modelPointers: ModelPointersSchema.optional(),
|
|
137
|
+
defaultModelName: z.string().optional(),
|
|
138
|
+
lastDismissedUpdateVersion: z.string().optional(),
|
|
139
|
+
compressionMode: CompressionModeSchema.optional(),
|
|
140
|
+
thinking: z.boolean().optional(),
|
|
141
|
+
// Config version for migrations
|
|
142
|
+
configVersion: z.number().optional()
|
|
143
|
+
});
|
|
144
|
+
function validateGlobalConfig(config) {
|
|
145
|
+
return GlobalConfigSchema.parse(config);
|
|
146
|
+
}
|
|
147
|
+
function validateProjectConfig(config) {
|
|
148
|
+
return ProjectConfigSchema.parse(config);
|
|
149
|
+
}
|
|
150
|
+
function safeValidateGlobalConfig(config) {
|
|
151
|
+
const result = GlobalConfigSchema.safeParse(config);
|
|
152
|
+
return result.success ? { success: true, data: result.data } : { success: false, error: result.error };
|
|
153
|
+
}
|
|
154
|
+
function safeValidateProjectConfig(config) {
|
|
155
|
+
const result = ProjectConfigSchema.safeParse(config);
|
|
156
|
+
return result.success ? { success: true, data: result.data } : { success: false, error: result.error };
|
|
157
|
+
}
|
|
158
|
+
export {
|
|
159
|
+
AccountInfoSchema,
|
|
160
|
+
AutoUpdaterStatusSchema,
|
|
161
|
+
CompressionModeSchema,
|
|
162
|
+
GlobalConfigSchema,
|
|
163
|
+
McpSSEServerConfigSchema,
|
|
164
|
+
McpServerConfigSchema,
|
|
165
|
+
McpStdioServerConfigSchema,
|
|
166
|
+
ModelPointerTypeSchema,
|
|
167
|
+
ModelPointersSchema,
|
|
168
|
+
ModelProfileSchema,
|
|
169
|
+
NotificationChannelSchema,
|
|
170
|
+
ProjectConfigSchema,
|
|
171
|
+
ProviderTypeSchema,
|
|
172
|
+
ReasoningEffortSchema,
|
|
173
|
+
safeValidateGlobalConfig,
|
|
174
|
+
safeValidateProjectConfig,
|
|
175
|
+
validateGlobalConfig,
|
|
176
|
+
validateProjectConfig
|
|
177
|
+
};
|
|
178
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/core/config/schema.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Configuration Schema Definitions\n *\n * Defines all configuration types for Minto with Zod validation.\n */\n\nimport { z } from 'zod'\n\n// MCP Server Configurations\nexport const McpStdioServerConfigSchema = z.object({\n type: z.literal('stdio').optional().default('stdio'),\n command: z.string(),\n args: z.array(z.string()),\n env: z.record(z.string()).optional(),\n enabled: z.boolean().optional(),\n})\n\nexport const McpSSEServerConfigSchema = z.object({\n type: z.literal('sse'),\n url: z.string(),\n enabled: z.boolean().optional(),\n})\n\nexport const McpServerConfigSchema = z.union([\n McpStdioServerConfigSchema,\n McpSSEServerConfigSchema,\n])\n\n// Auto Updater Status\nexport const AutoUpdaterStatusSchema = z.enum([\n 'disabled',\n 'enabled',\n 'no_permissions',\n 'not_configured',\n])\n\n// Notification Channel\nexport const NotificationChannelSchema = z.enum([\n 'iterm2',\n 'terminal_bell',\n 'iterm2_with_bell',\n 'notifications_disabled',\n])\n\n// Provider Types\nexport const ProviderTypeSchema = z.enum([\n 'anthropic',\n 'openai',\n 'mistral',\n 'deepseek',\n 'kimi',\n 'qwen',\n 'glm',\n 'minimax',\n 'baidu-qianfan',\n 'siliconflow',\n 'bigdream',\n 'opendev',\n 'xai',\n 'groq',\n 'gemini',\n 'ollama',\n 'azure',\n 'custom',\n 'custom-openai',\n])\n\n// Compression Mode\nexport const CompressionModeSchema = z.enum(['business', 'code'])\n\n// Reasoning Effort\nexport const ReasoningEffortSchema = z.enum([\n 'minimal',\n 'low',\n 'medium',\n 'high',\n])\n\n// Model Profile\nexport const ModelProfileSchema = z.object({\n name: z.string(),\n provider: ProviderTypeSchema,\n modelName: z.string(),\n baseURL: z.string().optional(),\n apiKey: z.string(),\n maxTokens: z.number(),\n contextLength: z.number(),\n reasoningEffort: ReasoningEffortSchema.optional(),\n isActive: z.boolean(),\n createdAt: z.number(),\n lastUsed: z.number().optional(),\n isGPT5: z.boolean().optional(),\n validationStatus: z\n .enum(['valid', 'needs_repair', 'auto_repaired'])\n .optional(),\n lastValidation: z.number().optional(),\n})\n\n// Model Pointer Type\nexport const ModelPointerTypeSchema = z.enum([\n 'main',\n 'task',\n 'reasoning',\n 'quick',\n])\n\n// Model Pointers\nexport const ModelPointersSchema = z.object({\n main: z.string(),\n task: z.string(),\n reasoning: z.string(),\n quick: z.string(),\n})\n\n// Account Info\nexport const AccountInfoSchema = z.object({\n accountUuid: z.string(),\n emailAddress: z.string(),\n organizationUuid: z.string().optional(),\n})\n\n// Project Configuration\nexport const ProjectConfigSchema = z.object({\n allowedTools: z.array(z.string()),\n context: z.record(z.string()),\n contextFiles: z.array(z.string()).optional(),\n history: z.array(z.string()),\n dontCrawlDirectory: z.boolean().optional(),\n enableArchitectTool: z.boolean().optional(),\n mcpContextUris: z.array(z.string()),\n mcpServers: z.record(McpServerConfigSchema).optional(),\n approvedMcprcServers: z.array(z.string()).optional(),\n rejectedMcprcServers: z.array(z.string()).optional(),\n lastAPIDuration: z.number().optional(),\n lastCost: z.number().optional(),\n lastDuration: z.number().optional(),\n lastSessionId: z.string().optional(),\n exampleFiles: z.array(z.string()).optional(),\n exampleFilesGeneratedAt: z.number().optional(),\n hasTrustDialogAccepted: z.boolean().optional(),\n hasCompletedProjectOnboarding: z.boolean().optional(),\n})\n\n// Global Configuration\nexport const GlobalConfigSchema = z.object({\n projects: z.record(ProjectConfigSchema).optional(),\n numStartups: z.number(),\n autoUpdaterStatus: AutoUpdaterStatusSchema.optional(),\n userID: z.string().optional(),\n theme: z.string(),\n hasCompletedOnboarding: z.boolean().optional(),\n lastOnboardingVersion: z.string().optional(),\n lastReleaseNotesSeen: z.string().optional(),\n mcpServers: z.record(McpServerConfigSchema).optional(),\n preferredNotifChannel: NotificationChannelSchema,\n verbose: z.boolean(),\n customApiKeyResponses: z\n .object({\n approved: z.array(z.string()).optional(),\n rejected: z.array(z.string()).optional(),\n })\n .optional(),\n primaryProvider: ProviderTypeSchema.optional(),\n maxTokens: z.number().optional(),\n hasAcknowledgedCostThreshold: z.boolean().optional(),\n oauthAccount: AccountInfoSchema.optional(),\n iterm2KeyBindingInstalled: z.boolean().optional(),\n shiftEnterKeyBindingInstalled: z.boolean().optional(),\n proxy: z.string().optional(),\n stream: z.boolean().optional(),\n modelProfiles: z.array(ModelProfileSchema).optional(),\n modelPointers: ModelPointersSchema.optional(),\n defaultModelName: z.string().optional(),\n lastDismissedUpdateVersion: z.string().optional(),\n compressionMode: CompressionModeSchema.optional(),\n thinking: z.boolean().optional(),\n // Config version for migrations\n configVersion: z.number().optional(),\n})\n\n// Type exports for TypeScript usage\nexport type McpStdioServerConfig = z.infer<typeof McpStdioServerConfigSchema>\nexport type McpSSEServerConfig = z.infer<typeof McpSSEServerConfigSchema>\nexport type McpServerConfig = z.infer<typeof McpServerConfigSchema>\nexport type AutoUpdaterStatus = z.infer<typeof AutoUpdaterStatusSchema>\nexport type NotificationChannel = z.infer<typeof NotificationChannelSchema>\nexport type ProviderType = z.infer<typeof ProviderTypeSchema>\nexport type CompressionMode = z.infer<typeof CompressionModeSchema>\nexport type ReasoningEffort = z.infer<typeof ReasoningEffortSchema>\nexport type ModelProfile = z.infer<typeof ModelProfileSchema>\nexport type ModelPointerType = z.infer<typeof ModelPointerTypeSchema>\nexport type ModelPointers = z.infer<typeof ModelPointersSchema>\nexport type AccountInfo = z.infer<typeof AccountInfoSchema>\nexport type ProjectConfig = z.infer<typeof ProjectConfigSchema>\nexport type GlobalConfig = z.infer<typeof GlobalConfigSchema>\n\n// Validation utilities\nexport function validateGlobalConfig(config: unknown): GlobalConfig {\n return GlobalConfigSchema.parse(config)\n}\n\nexport function validateProjectConfig(config: unknown): ProjectConfig {\n return ProjectConfigSchema.parse(config)\n}\n\nexport function safeValidateGlobalConfig(config: unknown): {\n success: boolean\n data?: GlobalConfig\n error?: z.ZodError\n} {\n const result = GlobalConfigSchema.safeParse(config)\n return result.success\n ? { success: true, data: result.data }\n : { success: false, error: result.error }\n}\n\nexport function safeValidateProjectConfig(config: unknown): {\n success: boolean\n data?: ProjectConfig\n error?: z.ZodError\n} {\n const result = ProjectConfigSchema.safeParse(config)\n return result.success\n ? { success: true, data: result.data }\n : { success: false, error: result.error }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
import signalExit from "signal-exit";
|
|
4
|
+
import { formatDuration } from "../utils/format.js";
|
|
5
|
+
import {
|
|
6
|
+
getCurrentProjectConfig,
|
|
7
|
+
saveCurrentProjectConfig
|
|
8
|
+
} from "../utils/config.js";
|
|
9
|
+
import { SESSION_ID } from "../utils/log.js";
|
|
10
|
+
const STATE = {
|
|
11
|
+
totalCost: 0,
|
|
12
|
+
totalAPIDuration: 0,
|
|
13
|
+
startTime: Date.now(),
|
|
14
|
+
inputTokens: 0,
|
|
15
|
+
outputTokens: 0,
|
|
16
|
+
cacheCreationTokens: 0,
|
|
17
|
+
cacheReadTokens: 0,
|
|
18
|
+
requestCount: 0
|
|
19
|
+
};
|
|
20
|
+
function addToTotalCost(cost, duration) {
|
|
21
|
+
STATE.totalCost += cost;
|
|
22
|
+
STATE.totalAPIDuration += duration;
|
|
23
|
+
STATE.requestCount += 1;
|
|
24
|
+
}
|
|
25
|
+
function addTokenUsage(inputTokens, outputTokens, cacheCreationTokens, cacheReadTokens) {
|
|
26
|
+
STATE.inputTokens += inputTokens;
|
|
27
|
+
STATE.outputTokens += outputTokens;
|
|
28
|
+
if (cacheCreationTokens) STATE.cacheCreationTokens += cacheCreationTokens;
|
|
29
|
+
if (cacheReadTokens) STATE.cacheReadTokens += cacheReadTokens;
|
|
30
|
+
}
|
|
31
|
+
function getTotalCost() {
|
|
32
|
+
return STATE.totalCost;
|
|
33
|
+
}
|
|
34
|
+
function getTotalDuration() {
|
|
35
|
+
return Date.now() - STATE.startTime;
|
|
36
|
+
}
|
|
37
|
+
function getTotalAPIDuration() {
|
|
38
|
+
return STATE.totalAPIDuration;
|
|
39
|
+
}
|
|
40
|
+
function getTokenCounts() {
|
|
41
|
+
return {
|
|
42
|
+
input: STATE.inputTokens,
|
|
43
|
+
output: STATE.outputTokens,
|
|
44
|
+
cacheCreation: STATE.cacheCreationTokens,
|
|
45
|
+
cacheRead: STATE.cacheReadTokens,
|
|
46
|
+
total: STATE.inputTokens + STATE.outputTokens
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function getRequestCount() {
|
|
50
|
+
return STATE.requestCount;
|
|
51
|
+
}
|
|
52
|
+
function getCostSummary() {
|
|
53
|
+
return {
|
|
54
|
+
cost: STATE.totalCost,
|
|
55
|
+
apiDuration: STATE.totalAPIDuration,
|
|
56
|
+
wallDuration: getTotalDuration(),
|
|
57
|
+
tokens: getTokenCounts(),
|
|
58
|
+
requests: STATE.requestCount
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function formatCost(cost) {
|
|
62
|
+
return `$${cost > 0.5 ? round(cost, 100).toFixed(2) : cost.toFixed(4)}`;
|
|
63
|
+
}
|
|
64
|
+
function round(number, precision) {
|
|
65
|
+
return Math.round(number * precision) / precision;
|
|
66
|
+
}
|
|
67
|
+
function formatTotalCost() {
|
|
68
|
+
return chalk.grey(
|
|
69
|
+
`Total cost: ${formatCost(STATE.totalCost)}
|
|
70
|
+
Total duration (API): ${formatDuration(STATE.totalAPIDuration)}
|
|
71
|
+
Total duration (wall): ${formatDuration(getTotalDuration())}`
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
function formatDetailedCost() {
|
|
75
|
+
const tokens = getTokenCounts();
|
|
76
|
+
return chalk.grey(
|
|
77
|
+
`Total cost: ${formatCost(STATE.totalCost)}
|
|
78
|
+
Total duration (API): ${formatDuration(STATE.totalAPIDuration)}
|
|
79
|
+
Total duration (wall): ${formatDuration(getTotalDuration())}
|
|
80
|
+
Tokens: ${tokens.input.toLocaleString()} in / ${tokens.output.toLocaleString()} out
|
|
81
|
+
Cache: ${tokens.cacheCreation.toLocaleString()} created / ${tokens.cacheRead.toLocaleString()} read
|
|
82
|
+
Requests: ${STATE.requestCount}`
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
let exitHandlerRegistered = false;
|
|
86
|
+
function useCostSummary() {
|
|
87
|
+
useEffect(() => {
|
|
88
|
+
if (exitHandlerRegistered) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
exitHandlerRegistered = true;
|
|
92
|
+
signalExit(
|
|
93
|
+
() => {
|
|
94
|
+
process.stdout.write("\n" + formatTotalCost() + "\n");
|
|
95
|
+
try {
|
|
96
|
+
const projectConfig = getCurrentProjectConfig();
|
|
97
|
+
saveCurrentProjectConfig({
|
|
98
|
+
...projectConfig,
|
|
99
|
+
lastCost: STATE.totalCost,
|
|
100
|
+
lastAPIDuration: STATE.totalAPIDuration,
|
|
101
|
+
lastDuration: getTotalDuration(),
|
|
102
|
+
lastSessionId: SESSION_ID
|
|
103
|
+
});
|
|
104
|
+
} catch {
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
{ alwaysLast: true }
|
|
108
|
+
);
|
|
109
|
+
}, []);
|
|
110
|
+
}
|
|
111
|
+
function resetStateForTests() {
|
|
112
|
+
if (process.env.NODE_ENV !== "test") {
|
|
113
|
+
throw new Error("resetStateForTests can only be called in tests");
|
|
114
|
+
}
|
|
115
|
+
STATE.startTime = Date.now();
|
|
116
|
+
STATE.totalCost = 0;
|
|
117
|
+
STATE.totalAPIDuration = 0;
|
|
118
|
+
STATE.inputTokens = 0;
|
|
119
|
+
STATE.outputTokens = 0;
|
|
120
|
+
STATE.cacheCreationTokens = 0;
|
|
121
|
+
STATE.cacheReadTokens = 0;
|
|
122
|
+
STATE.requestCount = 0;
|
|
123
|
+
}
|
|
124
|
+
export {
|
|
125
|
+
addToTotalCost,
|
|
126
|
+
addTokenUsage,
|
|
127
|
+
formatDetailedCost,
|
|
128
|
+
formatTotalCost,
|
|
129
|
+
getCostSummary,
|
|
130
|
+
getRequestCount,
|
|
131
|
+
getTokenCounts,
|
|
132
|
+
getTotalAPIDuration,
|
|
133
|
+
getTotalCost,
|
|
134
|
+
getTotalDuration,
|
|
135
|
+
resetStateForTests,
|
|
136
|
+
useCostSummary
|
|
137
|
+
};
|
|
138
|
+
//# sourceMappingURL=costTracker.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/core/costTracker.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Cost Tracker\n *\n * Tracks API costs and usage metrics for the session.\n * This is the core implementation; the original cost-tracker.ts\n * re-exports from this module for backwards compatibility.\n */\n\nimport chalk from 'chalk'\nimport { useEffect } from 'react'\nimport signalExit from 'signal-exit'\nimport { formatDuration } from '../utils/format'\nimport {\n getCurrentProjectConfig,\n saveCurrentProjectConfig,\n} from '../utils/config'\nimport { SESSION_ID } from '../utils/log'\n\n/**\n * Cost tracking state\n */\ninterface CostState {\n /** Total cost in dollars */\n totalCost: number\n\n /** Total API call duration in milliseconds */\n totalAPIDuration: number\n\n /** Session start timestamp */\n startTime: number\n\n /** Token counts */\n inputTokens: number\n outputTokens: number\n\n /** Cache stats */\n cacheCreationTokens: number\n cacheReadTokens: number\n\n /** Request count */\n requestCount: number\n}\n\n// Global state\nconst STATE: CostState = {\n totalCost: 0,\n totalAPIDuration: 0,\n startTime: Date.now(),\n inputTokens: 0,\n outputTokens: 0,\n cacheCreationTokens: 0,\n cacheReadTokens: 0,\n requestCount: 0,\n}\n\n/**\n * Add to total cost\n */\nexport function addToTotalCost(cost: number, duration: number): void {\n STATE.totalCost += cost\n STATE.totalAPIDuration += duration\n STATE.requestCount += 1\n}\n\n/**\n * Add token usage\n */\nexport function addTokenUsage(\n inputTokens: number,\n outputTokens: number,\n cacheCreationTokens?: number,\n cacheReadTokens?: number,\n): void {\n STATE.inputTokens += inputTokens\n STATE.outputTokens += outputTokens\n if (cacheCreationTokens) STATE.cacheCreationTokens += cacheCreationTokens\n if (cacheReadTokens) STATE.cacheReadTokens += cacheReadTokens\n}\n\n/**\n * Get total cost\n */\nexport function getTotalCost(): number {\n return STATE.totalCost\n}\n\n/**\n * Get total duration (wall clock time)\n */\nexport function getTotalDuration(): number {\n return Date.now() - STATE.startTime\n}\n\n/**\n * Get total API duration\n */\nexport function getTotalAPIDuration(): number {\n return STATE.totalAPIDuration\n}\n\n/**\n * Get token counts\n */\nexport function getTokenCounts(): {\n input: number\n output: number\n cacheCreation: number\n cacheRead: number\n total: number\n} {\n return {\n input: STATE.inputTokens,\n output: STATE.outputTokens,\n cacheCreation: STATE.cacheCreationTokens,\n cacheRead: STATE.cacheReadTokens,\n total: STATE.inputTokens + STATE.outputTokens,\n }\n}\n\n/**\n * Get request count\n */\nexport function getRequestCount(): number {\n return STATE.requestCount\n}\n\n/**\n * Get full cost summary\n */\nexport function getCostSummary(): {\n cost: number\n apiDuration: number\n wallDuration: number\n tokens: ReturnType<typeof getTokenCounts>\n requests: number\n} {\n return {\n cost: STATE.totalCost,\n apiDuration: STATE.totalAPIDuration,\n wallDuration: getTotalDuration(),\n tokens: getTokenCounts(),\n requests: STATE.requestCount,\n }\n}\n\n/**\n * Format cost for display\n */\nfunction formatCost(cost: number): string {\n return `$${cost > 0.5 ? round(cost, 100).toFixed(2) : cost.toFixed(4)}`\n}\n\n/**\n * Round to precision\n */\nfunction round(number: number, precision: number): number {\n return Math.round(number * precision) / precision\n}\n\n/**\n * Format total cost for display\n */\nexport function formatTotalCost(): string {\n return chalk.grey(\n `Total cost: ${formatCost(STATE.totalCost)}\nTotal duration (API): ${formatDuration(STATE.totalAPIDuration)}\nTotal duration (wall): ${formatDuration(getTotalDuration())}`,\n )\n}\n\n/**\n * Format detailed cost summary\n */\nexport function formatDetailedCost(): string {\n const tokens = getTokenCounts()\n return chalk.grey(\n `Total cost: ${formatCost(STATE.totalCost)}\nTotal duration (API): ${formatDuration(STATE.totalAPIDuration)}\nTotal duration (wall): ${formatDuration(getTotalDuration())}\nTokens: ${tokens.input.toLocaleString()} in / ${tokens.output.toLocaleString()} out\nCache: ${tokens.cacheCreation.toLocaleString()} created / ${tokens.cacheRead.toLocaleString()} read\nRequests: ${STATE.requestCount}`,\n )\n}\n\n// Flag to ensure we only register once and never unregister\nlet exitHandlerRegistered = false\n\n/**\n * React hook for cost summary on exit\n *\n * CRITICAL FIX: Use signal-exit with alwaysLast: true\n *\n * The problem was that Ink also uses signal-exit (with alwaysLast: false)\n * to clean up on exit. During Ink's cleanup, it may:\n * 1. Call onRender() one last time\n * 2. Use ansiEscapes.eraseLines() to clear previous output\n * 3. Or even call clearTerminal if output height >= terminal rows\n *\n * By using signal-exit with alwaysLast: true, we ensure our handler\n * runs AFTER Ink's cleanup, so our statistics are the last thing printed.\n */\nexport function useCostSummary(): void {\n useEffect(() => {\n // Only register ONCE, and NEVER unregister\n if (exitHandlerRegistered) {\n return\n }\n exitHandlerRegistered = true\n\n // Use signal-exit with alwaysLast: true to run AFTER Ink's cleanup\n signalExit(\n () => {\n // Write statistics to stdout\n process.stdout.write('\\n' + formatTotalCost() + '\\n')\n\n // Save last cost and duration to project config\n try {\n const projectConfig = getCurrentProjectConfig()\n saveCurrentProjectConfig({\n ...projectConfig,\n lastCost: STATE.totalCost,\n lastAPIDuration: STATE.totalAPIDuration,\n lastDuration: getTotalDuration(),\n lastSessionId: SESSION_ID,\n })\n } catch {\n // Ignore errors during exit - config save is best-effort\n }\n },\n { alwaysLast: true },\n )\n\n // NO cleanup - never unregister the exit handler\n }, [])\n}\n\n/**\n * Reset state (for testing only)\n */\nexport function resetStateForTests(): void {\n if (process.env.NODE_ENV !== 'test') {\n throw new Error('resetStateForTests can only be called in tests')\n }\n STATE.startTime = Date.now()\n STATE.totalCost = 0\n STATE.totalAPIDuration = 0\n STATE.inputTokens = 0\n STATE.outputTokens = 0\n STATE.cacheCreationTokens = 0\n STATE.cacheReadTokens = 0\n STATE.requestCount = 0\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/core/index.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Core Module\n *\n * Centralized exports for core system functionality.\n */\n\n// Configuration\nexport * from './config'\n\n// Permissions\nexport * from './permissions'\n\n// Tools\nexport * from './tools'\n\n// Cost Tracking\nexport * from './costTracker'\n"],
|
|
5
|
+
"mappings": "AAOA,cAAc;AAGd,cAAc;AAGd,cAAc;AAGd,cAAc;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { appendFileSync, existsSync, mkdirSync, readFileSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { homedir } from "os";
|
|
4
|
+
import { getOriginalCwd } from "../../utils/state.js";
|
|
5
|
+
let sessionLog = [];
|
|
6
|
+
let sessionId = generateSessionId();
|
|
7
|
+
function generateSessionId() {
|
|
8
|
+
return `session_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;
|
|
9
|
+
}
|
|
10
|
+
function generateEntryId() {
|
|
11
|
+
return `audit_${Date.now()}_${Math.random().toString(36).substring(2, 6)}`;
|
|
12
|
+
}
|
|
13
|
+
function getAuditLogDir() {
|
|
14
|
+
return join(homedir(), ".minto", "audit");
|
|
15
|
+
}
|
|
16
|
+
function getAuditLogFilePath() {
|
|
17
|
+
const dir = getAuditLogDir();
|
|
18
|
+
const date = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
|
|
19
|
+
return join(dir, `audit-${date}.jsonl`);
|
|
20
|
+
}
|
|
21
|
+
function ensureAuditLogDir() {
|
|
22
|
+
const dir = getAuditLogDir();
|
|
23
|
+
if (!existsSync(dir)) {
|
|
24
|
+
mkdirSync(dir, { recursive: true });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function persistEntry(entry) {
|
|
28
|
+
try {
|
|
29
|
+
ensureAuditLogDir();
|
|
30
|
+
const filePath = getAuditLogFilePath();
|
|
31
|
+
const line = JSON.stringify(entry) + "\n";
|
|
32
|
+
appendFileSync(filePath, line, "utf-8");
|
|
33
|
+
} catch (error) {
|
|
34
|
+
console.error("[Audit] Failed to persist log entry:", error);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function logSecurityEvent(params) {
|
|
38
|
+
const entry = {
|
|
39
|
+
id: generateEntryId(),
|
|
40
|
+
timestamp: Date.now(),
|
|
41
|
+
eventType: params.eventType,
|
|
42
|
+
toolName: params.toolName,
|
|
43
|
+
operation: params.operation,
|
|
44
|
+
target: params.target,
|
|
45
|
+
outcome: params.outcome,
|
|
46
|
+
riskLevel: params.riskLevel,
|
|
47
|
+
context: params.context,
|
|
48
|
+
projectDir: getOriginalCwd(),
|
|
49
|
+
userDecision: params.userDecision,
|
|
50
|
+
triggeredRule: params.triggeredRule,
|
|
51
|
+
sessionId
|
|
52
|
+
};
|
|
53
|
+
sessionLog.push(entry);
|
|
54
|
+
persistEntry(entry);
|
|
55
|
+
return entry;
|
|
56
|
+
}
|
|
57
|
+
function logPermissionGranted(toolName, operation, target, userDecision = "approved", context) {
|
|
58
|
+
return logSecurityEvent({
|
|
59
|
+
eventType: "permission_granted",
|
|
60
|
+
toolName,
|
|
61
|
+
operation,
|
|
62
|
+
target,
|
|
63
|
+
outcome: "allowed",
|
|
64
|
+
userDecision,
|
|
65
|
+
context
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
function logPermissionDenied(toolName, operation, target, triggeredRule, context) {
|
|
69
|
+
return logSecurityEvent({
|
|
70
|
+
eventType: "permission_denied",
|
|
71
|
+
toolName,
|
|
72
|
+
operation,
|
|
73
|
+
target,
|
|
74
|
+
outcome: "denied",
|
|
75
|
+
userDecision: "rejected",
|
|
76
|
+
triggeredRule,
|
|
77
|
+
context
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
function logOperationBlocked(toolName, operation, target, triggeredRule, riskLevel, context) {
|
|
81
|
+
return logSecurityEvent({
|
|
82
|
+
eventType: "permission_blocked",
|
|
83
|
+
toolName,
|
|
84
|
+
operation,
|
|
85
|
+
target,
|
|
86
|
+
outcome: "blocked",
|
|
87
|
+
riskLevel,
|
|
88
|
+
triggeredRule,
|
|
89
|
+
context
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
function logSensitivePathAccess(toolName, operation, target, category, outcome, userDecision) {
|
|
93
|
+
return logSecurityEvent({
|
|
94
|
+
eventType: "sensitive_path_access",
|
|
95
|
+
toolName,
|
|
96
|
+
operation,
|
|
97
|
+
target,
|
|
98
|
+
outcome,
|
|
99
|
+
riskLevel: "high",
|
|
100
|
+
userDecision,
|
|
101
|
+
context: { category }
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
function logExternalOperation(toolName, operation, target, riskLevel, outcome, userDecision) {
|
|
105
|
+
return logSecurityEvent({
|
|
106
|
+
eventType: "external_operation",
|
|
107
|
+
toolName,
|
|
108
|
+
operation,
|
|
109
|
+
target,
|
|
110
|
+
outcome,
|
|
111
|
+
riskLevel,
|
|
112
|
+
userDecision
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
function logDangerousCommand(command, outcome, pattern, userDecision) {
|
|
116
|
+
return logSecurityEvent({
|
|
117
|
+
eventType: "dangerous_command",
|
|
118
|
+
toolName: "Bash",
|
|
119
|
+
operation: "execute",
|
|
120
|
+
target: command,
|
|
121
|
+
outcome,
|
|
122
|
+
riskLevel: "high",
|
|
123
|
+
userDecision,
|
|
124
|
+
context: pattern ? { matchedPattern: pattern } : void 0
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
function getSessionLog() {
|
|
128
|
+
return [...sessionLog];
|
|
129
|
+
}
|
|
130
|
+
function getEntriesByType(eventType) {
|
|
131
|
+
return sessionLog.filter((entry) => entry.eventType === eventType);
|
|
132
|
+
}
|
|
133
|
+
function getEntriesByOutcome(outcome) {
|
|
134
|
+
return sessionLog.filter((entry) => entry.outcome === outcome);
|
|
135
|
+
}
|
|
136
|
+
function getSessionSecuritySummary() {
|
|
137
|
+
return {
|
|
138
|
+
totalEvents: sessionLog.length,
|
|
139
|
+
allowed: sessionLog.filter((e) => e.outcome === "allowed").length,
|
|
140
|
+
denied: sessionLog.filter((e) => e.outcome === "denied").length,
|
|
141
|
+
blocked: sessionLog.filter((e) => e.outcome === "blocked").length,
|
|
142
|
+
sensitiveAccesses: sessionLog.filter(
|
|
143
|
+
(e) => e.eventType === "sensitive_path_access"
|
|
144
|
+
).length,
|
|
145
|
+
externalOperations: sessionLog.filter(
|
|
146
|
+
(e) => e.eventType === "external_operation"
|
|
147
|
+
).length,
|
|
148
|
+
dangerousCommands: sessionLog.filter(
|
|
149
|
+
(e) => e.eventType === "dangerous_command"
|
|
150
|
+
).length,
|
|
151
|
+
highRiskEvents: sessionLog.filter(
|
|
152
|
+
(e) => e.riskLevel === "high" || e.riskLevel === "critical"
|
|
153
|
+
).length
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function clearSessionLog() {
|
|
157
|
+
sessionLog = [];
|
|
158
|
+
}
|
|
159
|
+
function resetSession() {
|
|
160
|
+
sessionId = generateSessionId();
|
|
161
|
+
sessionLog = [];
|
|
162
|
+
}
|
|
163
|
+
function readAuditLog(date) {
|
|
164
|
+
const targetDate = date || (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
|
|
165
|
+
const filePath = join(getAuditLogDir(), `audit-${targetDate}.jsonl`);
|
|
166
|
+
if (!existsSync(filePath)) {
|
|
167
|
+
return [];
|
|
168
|
+
}
|
|
169
|
+
try {
|
|
170
|
+
const content = readFileSync(filePath, "utf-8");
|
|
171
|
+
return content.split("\n").filter((line) => line.trim()).map((line) => JSON.parse(line));
|
|
172
|
+
} catch (error) {
|
|
173
|
+
console.error("[Audit] Failed to read audit log:", error);
|
|
174
|
+
return [];
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function getRecentSecurityEvents(count = 10) {
|
|
178
|
+
return sessionLog.slice(-count);
|
|
179
|
+
}
|
|
180
|
+
function formatAuditEntry(entry) {
|
|
181
|
+
const timestamp = new Date(entry.timestamp).toISOString();
|
|
182
|
+
const icon = entry.outcome === "allowed" ? "\u2705" : entry.outcome === "denied" ? "\u274C" : "\u{1F6AB}";
|
|
183
|
+
const risk = entry.riskLevel ? ` [${entry.riskLevel.toUpperCase()}]` : "";
|
|
184
|
+
return `${icon} [${timestamp}]${risk} ${entry.eventType}: ${entry.toolName} ${entry.operation} \u2192 ${entry.target}`;
|
|
185
|
+
}
|
|
186
|
+
export {
|
|
187
|
+
clearSessionLog,
|
|
188
|
+
formatAuditEntry,
|
|
189
|
+
getEntriesByOutcome,
|
|
190
|
+
getEntriesByType,
|
|
191
|
+
getRecentSecurityEvents,
|
|
192
|
+
getSessionLog,
|
|
193
|
+
getSessionSecuritySummary,
|
|
194
|
+
logDangerousCommand,
|
|
195
|
+
logExternalOperation,
|
|
196
|
+
logOperationBlocked,
|
|
197
|
+
logPermissionDenied,
|
|
198
|
+
logPermissionGranted,
|
|
199
|
+
logSecurityEvent,
|
|
200
|
+
logSensitivePathAccess,
|
|
201
|
+
readAuditLog,
|
|
202
|
+
resetSession
|
|
203
|
+
};
|
|
204
|
+
//# sourceMappingURL=auditLog.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/core/permissions/auditLog.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Security Audit Log\n *\n * Records all security-sensitive operations for accountability and debugging.\n * Logs are stored both in memory (for current session) and optionally on disk.\n */\n\nimport { appendFileSync, existsSync, mkdirSync, readFileSync } from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { getOriginalCwd } from '@utils/state'\n\n/**\n * Audit log entry type\n */\nexport type AuditEventType =\n | 'permission_granted' // User granted permission\n | 'permission_denied' // Permission was denied (user or rule)\n | 'permission_blocked' // Operation was blocked by security rule\n | 'sensitive_path_access' // Access to sensitive path\n | 'external_operation' // Operation outside project directory\n | 'dangerous_command' // Dangerous command execution\n | 'security_warning' // Security warning issued\n\n/**\n * Audit log entry\n */\nexport interface AuditLogEntry {\n /** Unique entry ID */\n id: string\n /** Timestamp */\n timestamp: number\n /** Event type */\n eventType: AuditEventType\n /** Tool name */\n toolName: string\n /** Operation details */\n operation: string\n /** Target path or command */\n target: string\n /** Outcome: allowed, denied, blocked */\n outcome: 'allowed' | 'denied' | 'blocked'\n /** Risk level if applicable */\n riskLevel?: 'low' | 'medium' | 'high' | 'critical'\n /** Additional context */\n context?: Record<string, unknown>\n /** Project directory */\n projectDir: string\n /** User decision (if applicable) */\n userDecision?: 'approved' | 'rejected' | 'auto'\n /** Rule that triggered (if applicable) */\n triggeredRule?: string\n /** Session ID */\n sessionId: string\n}\n\n/**\n * In-memory audit log for current session\n */\nlet sessionLog: AuditLogEntry[] = []\nlet sessionId: string = generateSessionId()\n\n/**\n * Generate a unique session ID\n */\nfunction generateSessionId(): string {\n return `session_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`\n}\n\n/**\n * Generate a unique entry ID\n */\nfunction generateEntryId(): string {\n return `audit_${Date.now()}_${Math.random().toString(36).substring(2, 6)}`\n}\n\n/**\n * Get the audit log directory\n */\nfunction getAuditLogDir(): string {\n return join(homedir(), '.minto', 'audit')\n}\n\n/**\n * Get the current day's audit log file path\n */\nfunction getAuditLogFilePath(): string {\n const dir = getAuditLogDir()\n const date = new Date().toISOString().split('T')[0] // YYYY-MM-DD\n return join(dir, `audit-${date}.jsonl`)\n}\n\n/**\n * Ensure audit log directory exists\n */\nfunction ensureAuditLogDir(): void {\n const dir = getAuditLogDir()\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n}\n\n/**\n * Write entry to disk\n */\nfunction persistEntry(entry: AuditLogEntry): void {\n try {\n ensureAuditLogDir()\n const filePath = getAuditLogFilePath()\n const line = JSON.stringify(entry) + '\\n'\n appendFileSync(filePath, line, 'utf-8')\n } catch (error) {\n // Silently fail - audit logging should not break the application\n console.error('[Audit] Failed to persist log entry:', error)\n }\n}\n\n/**\n * Log a security event\n */\nexport function logSecurityEvent(params: {\n eventType: AuditEventType\n toolName: string\n operation: string\n target: string\n outcome: 'allowed' | 'denied' | 'blocked'\n riskLevel?: 'low' | 'medium' | 'high' | 'critical'\n context?: Record<string, unknown>\n userDecision?: 'approved' | 'rejected' | 'auto'\n triggeredRule?: string\n}): AuditLogEntry {\n const entry: AuditLogEntry = {\n id: generateEntryId(),\n timestamp: Date.now(),\n eventType: params.eventType,\n toolName: params.toolName,\n operation: params.operation,\n target: params.target,\n outcome: params.outcome,\n riskLevel: params.riskLevel,\n context: params.context,\n projectDir: getOriginalCwd(),\n userDecision: params.userDecision,\n triggeredRule: params.triggeredRule,\n sessionId,\n }\n\n // Add to in-memory log\n sessionLog.push(entry)\n\n // Persist to disk\n persistEntry(entry)\n\n return entry\n}\n\n/**\n * Log permission granted event\n */\nexport function logPermissionGranted(\n toolName: string,\n operation: string,\n target: string,\n userDecision: 'approved' | 'auto' = 'approved',\n context?: Record<string, unknown>,\n): AuditLogEntry {\n return logSecurityEvent({\n eventType: 'permission_granted',\n toolName,\n operation,\n target,\n outcome: 'allowed',\n userDecision,\n context,\n })\n}\n\n/**\n * Log permission denied event\n */\nexport function logPermissionDenied(\n toolName: string,\n operation: string,\n target: string,\n triggeredRule?: string,\n context?: Record<string, unknown>,\n): AuditLogEntry {\n return logSecurityEvent({\n eventType: 'permission_denied',\n toolName,\n operation,\n target,\n outcome: 'denied',\n userDecision: 'rejected',\n triggeredRule,\n context,\n })\n}\n\n/**\n * Log operation blocked by security rule\n */\nexport function logOperationBlocked(\n toolName: string,\n operation: string,\n target: string,\n triggeredRule: string,\n riskLevel: 'low' | 'medium' | 'high' | 'critical',\n context?: Record<string, unknown>,\n): AuditLogEntry {\n return logSecurityEvent({\n eventType: 'permission_blocked',\n toolName,\n operation,\n target,\n outcome: 'blocked',\n riskLevel,\n triggeredRule,\n context,\n })\n}\n\n/**\n * Log sensitive path access\n */\nexport function logSensitivePathAccess(\n toolName: string,\n operation: string,\n target: string,\n category: string,\n outcome: 'allowed' | 'denied' | 'blocked',\n userDecision?: 'approved' | 'rejected',\n): AuditLogEntry {\n return logSecurityEvent({\n eventType: 'sensitive_path_access',\n toolName,\n operation,\n target,\n outcome,\n riskLevel: 'high',\n userDecision,\n context: { category },\n })\n}\n\n/**\n * Log external operation (outside project directory)\n */\nexport function logExternalOperation(\n toolName: string,\n operation: string,\n target: string,\n riskLevel: 'low' | 'medium' | 'high' | 'critical',\n outcome: 'allowed' | 'denied' | 'blocked',\n userDecision?: 'approved' | 'rejected',\n): AuditLogEntry {\n return logSecurityEvent({\n eventType: 'external_operation',\n toolName,\n operation,\n target,\n outcome,\n riskLevel,\n userDecision,\n })\n}\n\n/**\n * Log dangerous command execution\n */\nexport function logDangerousCommand(\n command: string,\n outcome: 'allowed' | 'denied' | 'blocked',\n pattern?: string,\n userDecision?: 'approved' | 'rejected',\n): AuditLogEntry {\n return logSecurityEvent({\n eventType: 'dangerous_command',\n toolName: 'Bash',\n operation: 'execute',\n target: command,\n outcome,\n riskLevel: 'high',\n userDecision,\n context: pattern ? { matchedPattern: pattern } : undefined,\n })\n}\n\n/**\n * Get all entries from current session\n */\nexport function getSessionLog(): AuditLogEntry[] {\n return [...sessionLog]\n}\n\n/**\n * Get entries filtered by event type\n */\nexport function getEntriesByType(eventType: AuditEventType): AuditLogEntry[] {\n return sessionLog.filter(entry => entry.eventType === eventType)\n}\n\n/**\n * Get entries filtered by outcome\n */\nexport function getEntriesByOutcome(\n outcome: 'allowed' | 'denied' | 'blocked',\n): AuditLogEntry[] {\n return sessionLog.filter(entry => entry.outcome === outcome)\n}\n\n/**\n * Get security summary for current session\n */\nexport function getSessionSecuritySummary(): {\n totalEvents: number\n allowed: number\n denied: number\n blocked: number\n sensitiveAccesses: number\n externalOperations: number\n dangerousCommands: number\n highRiskEvents: number\n} {\n return {\n totalEvents: sessionLog.length,\n allowed: sessionLog.filter(e => e.outcome === 'allowed').length,\n denied: sessionLog.filter(e => e.outcome === 'denied').length,\n blocked: sessionLog.filter(e => e.outcome === 'blocked').length,\n sensitiveAccesses: sessionLog.filter(\n e => e.eventType === 'sensitive_path_access',\n ).length,\n externalOperations: sessionLog.filter(\n e => e.eventType === 'external_operation',\n ).length,\n dangerousCommands: sessionLog.filter(\n e => e.eventType === 'dangerous_command',\n ).length,\n highRiskEvents: sessionLog.filter(\n e => e.riskLevel === 'high' || e.riskLevel === 'critical',\n ).length,\n }\n}\n\n/**\n * Clear session log (for testing)\n */\nexport function clearSessionLog(): void {\n sessionLog = []\n}\n\n/**\n * Reset session (generates new session ID)\n */\nexport function resetSession(): void {\n sessionId = generateSessionId()\n sessionLog = []\n}\n\n/**\n * Read audit log entries from disk for a specific date\n */\nexport function readAuditLog(date?: string): AuditLogEntry[] {\n const targetDate = date || new Date().toISOString().split('T')[0]\n const filePath = join(getAuditLogDir(), `audit-${targetDate}.jsonl`)\n\n if (!existsSync(filePath)) {\n return []\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8')\n return content\n .split('\\n')\n .filter(line => line.trim())\n .map(line => JSON.parse(line) as AuditLogEntry)\n } catch (error) {\n console.error('[Audit] Failed to read audit log:', error)\n return []\n }\n}\n\n/**\n * Get recent security events (last N entries)\n */\nexport function getRecentSecurityEvents(count: number = 10): AuditLogEntry[] {\n return sessionLog.slice(-count)\n}\n\n/**\n * Format audit entry for display\n */\nexport function formatAuditEntry(entry: AuditLogEntry): string {\n const timestamp = new Date(entry.timestamp).toISOString()\n const icon =\n entry.outcome === 'allowed'\n ? '\u2705'\n : entry.outcome === 'denied'\n ? '\u274C'\n : '\uD83D\uDEAB'\n const risk = entry.riskLevel ? ` [${entry.riskLevel.toUpperCase()}]` : ''\n\n return `${icon} [${timestamp}]${risk} ${entry.eventType}: ${entry.toolName} ${entry.operation} \u2192 ${entry.target}`\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|