@within-7/minto 0.1.7 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli.js +155 -37
- package/dist/Tool.js +38 -0
- package/dist/Tool.js.map +3 -3
- package/dist/commands/agents/AgentsCommand.js +73 -49
- package/dist/commands/agents/AgentsCommand.js.map +2 -2
- package/dist/commands/agents/constants.js +1 -1
- package/dist/commands/agents/constants.js.map +1 -1
- package/dist/commands/agents/index.js +1 -1
- package/dist/commands/bug.js +74 -7
- package/dist/commands/bug.js.map +3 -3
- package/dist/commands/clear.js +3 -0
- package/dist/commands/clear.js.map +2 -2
- package/dist/commands/compact.js +37 -0
- package/dist/commands/compact.js.map +2 -2
- package/dist/commands/context.js +85 -0
- package/dist/commands/context.js.map +7 -0
- package/dist/commands/ctx_viz.js +18 -10
- package/dist/commands/ctx_viz.js.map +2 -2
- package/dist/commands/doctor.js +158 -12
- package/dist/commands/doctor.js.map +2 -2
- package/dist/commands/export.js +157 -0
- package/dist/commands/export.js.map +7 -0
- package/dist/commands/mcp-interactive.js +28 -18
- package/dist/commands/mcp-interactive.js.map +2 -2
- package/dist/commands/model.js +9 -7
- package/dist/commands/model.js.map +2 -2
- package/dist/commands/permissions.js +87 -0
- package/dist/commands/permissions.js.map +7 -0
- package/dist/commands/plugin/AddMarketplaceForm.js +3 -2
- package/dist/commands/plugin/AddMarketplaceForm.js.map +2 -2
- package/dist/commands/plugin/ConfirmDialog.js +2 -1
- package/dist/commands/plugin/ConfirmDialog.js.map +2 -2
- package/dist/commands/plugin/ErrorView.js +2 -1
- package/dist/commands/plugin/ErrorView.js.map +2 -2
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js +5 -4
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +2 -2
- package/dist/commands/plugin/InstalledPluginsManager.js +5 -4
- package/dist/commands/plugin/InstalledPluginsManager.js.map +2 -2
- package/dist/commands/plugin/MainMenu.js +2 -1
- package/dist/commands/plugin/MainMenu.js.map +2 -2
- package/dist/commands/plugin/MarketplaceManager.js +5 -4
- package/dist/commands/plugin/MarketplaceManager.js.map +2 -2
- package/dist/commands/plugin/MarketplaceSelector.js +4 -3
- package/dist/commands/plugin/MarketplaceSelector.js.map +2 -2
- package/dist/commands/plugin/PlaceholderScreen.js +3 -2
- package/dist/commands/plugin/PlaceholderScreen.js.map +2 -2
- package/dist/commands/plugin/PluginBrowser.js +6 -5
- package/dist/commands/plugin/PluginBrowser.js.map +2 -2
- package/dist/commands/plugin/PluginDetailsInstall.js +5 -4
- package/dist/commands/plugin/PluginDetailsInstall.js.map +2 -2
- package/dist/commands/plugin/PluginDetailsManage.js +4 -3
- package/dist/commands/plugin/PluginDetailsManage.js.map +2 -2
- package/dist/commands/plugin.js +16 -15
- package/dist/commands/plugin.js.map +2 -2
- package/dist/commands/quit.js +3 -1
- package/dist/commands/quit.js.map +2 -2
- package/dist/commands/sandbox.js +105 -0
- package/dist/commands/sandbox.js.map +7 -0
- package/dist/commands/setup.js +2 -1
- package/dist/commands/setup.js.map +2 -2
- package/dist/commands/status.js +59 -0
- package/dist/commands/status.js.map +7 -0
- package/dist/commands/tasks.js +108 -0
- package/dist/commands/tasks.js.map +7 -0
- package/dist/commands/todos.js +123 -0
- package/dist/commands/todos.js.map +7 -0
- package/dist/commands/undo.js +245 -0
- package/dist/commands/undo.js.map +7 -0
- package/dist/commands.js +22 -2
- package/dist/commands.js.map +2 -2
- package/dist/components/AgentThinkingBlock.js +10 -18
- package/dist/components/AgentThinkingBlock.js.map +2 -2
- package/dist/components/AsciiLogo.js +7 -8
- package/dist/components/AsciiLogo.js.map +2 -2
- package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
- package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
- package/dist/components/AskUserQuestionDialog/QuestionView.js +2 -1
- package/dist/components/AskUserQuestionDialog/QuestionView.js.map +2 -2
- package/dist/components/BackgroundTasksPanel.js +78 -29
- package/dist/components/BackgroundTasksPanel.js.map +2 -2
- package/dist/components/BashStreamingProgress.js +24 -0
- package/dist/components/BashStreamingProgress.js.map +7 -0
- package/dist/components/CollapsibleHint.js +15 -0
- package/dist/components/CollapsibleHint.js.map +7 -0
- package/dist/components/Config.js +3 -2
- package/dist/components/Config.js.map +2 -2
- package/dist/components/ConsoleOAuthFlow.js +2 -1
- package/dist/components/ConsoleOAuthFlow.js.map +2 -2
- package/dist/components/Cost.js +2 -1
- package/dist/components/Cost.js.map +2 -2
- package/dist/components/FileEditToolUpdatedMessage.js +1 -1
- package/dist/components/FileEditToolUpdatedMessage.js.map +2 -2
- package/dist/components/HeaderBar.js +13 -8
- package/dist/components/HeaderBar.js.map +2 -2
- package/dist/components/HistorySearchOverlay.js +4 -3
- package/dist/components/HistorySearchOverlay.js.map +2 -2
- package/dist/components/HotkeyHelpPanel.js +134 -0
- package/dist/components/HotkeyHelpPanel.js.map +7 -0
- package/dist/components/InvalidConfigDialog.js +2 -1
- package/dist/components/InvalidConfigDialog.js.map +2 -2
- package/dist/components/Logo.js +24 -68
- package/dist/components/Logo.js.map +2 -2
- package/dist/components/MCPServerApprovalDialog.js +2 -1
- package/dist/components/MCPServerApprovalDialog.js.map +2 -2
- package/dist/components/MCPServerDialogCopy.js +2 -1
- package/dist/components/MCPServerDialogCopy.js.map +2 -2
- package/dist/components/MCPServerMultiselectDialog.js +2 -1
- package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
- package/dist/components/Message.js +23 -7
- package/dist/components/Message.js.map +3 -3
- package/dist/components/MessageSelector.js +4 -3
- package/dist/components/MessageSelector.js.map +2 -2
- package/dist/components/ModeIndicator.js +2 -1
- package/dist/components/ModeIndicator.js.map +2 -2
- package/dist/components/ModelConfig.js +20 -6
- package/dist/components/ModelConfig.js.map +2 -2
- package/dist/components/ModelListManager.js +7 -6
- package/dist/components/ModelListManager.js.map +2 -2
- package/dist/components/ModelSelector/ModelSelector.js +27 -14
- package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
- package/dist/components/Onboarding.js +22 -16
- package/dist/components/Onboarding.js.map +2 -2
- package/dist/components/OperationSummary.js +130 -0
- package/dist/components/OperationSummary.js.map +7 -0
- package/dist/components/ProgressBar.js +74 -0
- package/dist/components/ProgressBar.js.map +7 -0
- package/dist/components/PromptInput.js +210 -87
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/RequestStatusIndicator.js +194 -0
- package/dist/components/RequestStatusIndicator.js.map +7 -0
- package/dist/components/SensitiveFileWarning.js +31 -0
- package/dist/components/SensitiveFileWarning.js.map +7 -0
- package/dist/components/Spinner.js +141 -27
- package/dist/components/Spinner.js.map +2 -2
- package/dist/components/SpinnerSymbol.js +21 -27
- package/dist/components/SpinnerSymbol.js.map +2 -2
- package/dist/components/StreamingBashOutput.js +9 -8
- package/dist/components/StreamingBashOutput.js.map +2 -2
- package/dist/components/StructuredDiff.js +6 -8
- package/dist/components/StructuredDiff.js.map +2 -2
- package/dist/components/SubagentBlock.js +5 -3
- package/dist/components/SubagentBlock.js.map +2 -2
- package/dist/components/SubagentProgress.js +17 -15
- package/dist/components/SubagentProgress.js.map +2 -2
- package/dist/components/TaskCard.js +30 -24
- package/dist/components/TaskCard.js.map +2 -2
- package/dist/components/TextInput.js +9 -1
- package/dist/components/TextInput.js.map +2 -2
- package/dist/components/TodoChangeBlock.js +1 -1
- package/dist/components/TodoChangeBlock.js.map +2 -2
- package/dist/components/TodoPanel.js +140 -31
- package/dist/components/TodoPanel.js.map +3 -3
- package/dist/components/TokenCounter.js +74 -0
- package/dist/components/TokenCounter.js.map +7 -0
- package/dist/components/TokenWarning.js +2 -1
- package/dist/components/TokenWarning.js.map +2 -2
- package/dist/components/ToolUseLoader.js +2 -2
- package/dist/components/ToolUseLoader.js.map +2 -2
- package/dist/components/TreeConnector.js +26 -0
- package/dist/components/TreeConnector.js.map +7 -0
- package/dist/components/TrustDialog.js +2 -1
- package/dist/components/TrustDialog.js.map +2 -2
- package/dist/components/TurnCompletionIndicator.js +18 -0
- package/dist/components/TurnCompletionIndicator.js.map +7 -0
- package/dist/components/binary-feedback/BinaryFeedbackView.js +2 -1
- package/dist/components/binary-feedback/BinaryFeedbackView.js.map +2 -2
- package/dist/components/messages/AssistantTextMessage.js +20 -9
- package/dist/components/messages/AssistantTextMessage.js.map +2 -2
- package/dist/components/messages/AssistantThinkingMessage.js +18 -3
- package/dist/components/messages/AssistantThinkingMessage.js.map +2 -2
- package/dist/components/messages/AssistantToolUseMessage.js +17 -10
- package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
- package/dist/components/messages/GroupRenderer.js +54 -0
- package/dist/components/messages/GroupRenderer.js.map +7 -0
- package/dist/components/messages/NestedTasksPreview.js +24 -0
- package/dist/components/messages/NestedTasksPreview.js.map +7 -0
- package/dist/components/messages/ParallelTasksGroupView.js +93 -0
- package/dist/components/messages/ParallelTasksGroupView.js.map +7 -0
- package/dist/components/messages/TaskInModuleView.js +218 -0
- package/dist/components/messages/TaskInModuleView.js.map +7 -0
- package/dist/components/messages/TaskOutputContent.js +56 -0
- package/dist/components/messages/TaskOutputContent.js.map +7 -0
- package/dist/components/messages/UserPromptMessage.js +2 -2
- package/dist/components/messages/UserPromptMessage.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +2 -3
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
- package/dist/components/permissions/FallbackPermissionRequest.js +4 -4
- package/dist/components/permissions/FallbackPermissionRequest.js.map +2 -2
- package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +4 -4
- package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +2 -2
- package/dist/constants/colors.js +120 -54
- package/dist/constants/colors.js.map +2 -2
- package/dist/constants/formatRules.js +102 -0
- package/dist/constants/formatRules.js.map +7 -0
- package/dist/constants/prompts.js +12 -34
- package/dist/constants/prompts.js.map +2 -2
- package/dist/constants/symbols.js +64 -6
- package/dist/constants/symbols.js.map +2 -2
- package/dist/constants/timing.js +5 -0
- package/dist/constants/timing.js.map +2 -2
- package/dist/constants/toolInputExamples.js +84 -0
- package/dist/constants/toolInputExamples.js.map +7 -0
- package/dist/core/backupManager.js +321 -0
- package/dist/core/backupManager.js.map +7 -0
- package/dist/core/config/defaults.js +84 -0
- package/dist/core/config/defaults.js.map +7 -0
- package/dist/core/config/index.js +111 -0
- package/dist/core/config/index.js.map +7 -0
- package/dist/core/config/loader.js +221 -0
- package/dist/core/config/loader.js.map +7 -0
- package/dist/core/config/migrations.js +128 -0
- package/dist/core/config/migrations.js.map +7 -0
- package/dist/core/config/schema.js +178 -0
- package/dist/core/config/schema.js.map +7 -0
- package/dist/core/costTracker.js +129 -0
- package/dist/core/costTracker.js.map +7 -0
- package/dist/core/gitAutoCommit.js +287 -0
- package/dist/core/gitAutoCommit.js.map +7 -0
- package/dist/core/index.js +8 -0
- package/dist/core/index.js.map +7 -0
- package/dist/core/operationTracker.js +212 -0
- package/dist/core/operationTracker.js.map +7 -0
- package/dist/core/permissions/auditLog.js +204 -0
- package/dist/core/permissions/auditLog.js.map +7 -0
- package/dist/core/permissions/engine/index.js +3 -0
- package/dist/core/permissions/engine/index.js.map +7 -0
- package/dist/core/permissions/engine/permissionEngine.js +106 -0
- package/dist/core/permissions/engine/permissionEngine.js.map +7 -0
- package/dist/core/permissions/engine/types.js +1 -0
- package/dist/core/permissions/engine/types.js.map +7 -0
- package/dist/core/permissions/index.js +84 -0
- package/dist/core/permissions/index.js.map +7 -0
- package/dist/core/permissions/ruleEngine.js +259 -0
- package/dist/core/permissions/ruleEngine.js.map +7 -0
- package/dist/core/permissions/rules/allowedToolsRule.js +62 -0
- package/dist/core/permissions/rules/allowedToolsRule.js.map +7 -0
- package/dist/core/permissions/rules/autoEscalationRule.js +296 -0
- package/dist/core/permissions/rules/autoEscalationRule.js.map +7 -0
- package/dist/core/permissions/rules/index.js +46 -0
- package/dist/core/permissions/rules/index.js.map +7 -0
- package/dist/core/permissions/rules/planModeRule.js +55 -0
- package/dist/core/permissions/rules/planModeRule.js.map +7 -0
- package/dist/core/permissions/rules/projectBoundaryRule.js +173 -0
- package/dist/core/permissions/rules/projectBoundaryRule.js.map +7 -0
- package/dist/core/permissions/rules/safeModeRule.js +65 -0
- package/dist/core/permissions/rules/safeModeRule.js.map +7 -0
- package/dist/core/permissions/rules/sensitivePathsRule.js +345 -0
- package/dist/core/permissions/rules/sensitivePathsRule.js.map +7 -0
- package/dist/core/permissions/types.js +127 -0
- package/dist/core/permissions/types.js.map +7 -0
- package/dist/core/tokenStats.js +9 -0
- package/dist/core/tokenStats.js.map +7 -0
- package/dist/core/tokenStatsManager.js +331 -0
- package/dist/core/tokenStatsManager.js.map +7 -0
- package/dist/core/tools/executor.js +143 -0
- package/dist/core/tools/executor.js.map +7 -0
- package/dist/core/tools/index.js +15 -0
- package/dist/core/tools/index.js.map +7 -0
- package/dist/core/tools/registry.js +183 -0
- package/dist/core/tools/registry.js.map +7 -0
- package/dist/core/tools/types.js +1 -0
- package/dist/core/tools/types.js.map +7 -0
- package/dist/cost-tracker.js +23 -15
- package/dist/cost-tracker.js.map +2 -2
- package/dist/entrypoints/cli.js +158 -130
- package/dist/entrypoints/cli.js.map +2 -2
- package/dist/entrypoints/mcp.js +12 -4
- package/dist/entrypoints/mcp.js.map +2 -2
- package/dist/history.js +14 -3
- package/dist/history.js.map +2 -2
- package/dist/hooks/useAgentTokenStats.js +72 -0
- package/dist/hooks/useAgentTokenStats.js.map +7 -0
- package/dist/hooks/useAgentTranscripts.js +140 -0
- package/dist/hooks/useAgentTranscripts.js.map +7 -0
- package/dist/hooks/useAnimationSync.js +53 -0
- package/dist/hooks/useAnimationSync.js.map +7 -0
- package/dist/hooks/useArrowKeyHistory.js +4 -2
- package/dist/hooks/useArrowKeyHistory.js.map +2 -2
- package/dist/hooks/useCanUseTool.js +3 -1
- package/dist/hooks/useCanUseTool.js.map +2 -2
- package/dist/hooks/useExitOnCtrlCD.js +9 -5
- package/dist/hooks/useExitOnCtrlCD.js.map +2 -2
- package/dist/hooks/useHookStatus.js +40 -0
- package/dist/hooks/useHookStatus.js.map +7 -0
- package/dist/hooks/useLogMessages.js +29 -2
- package/dist/hooks/useLogMessages.js.map +2 -2
- package/dist/hooks/useMessageGroups.js +43 -0
- package/dist/hooks/useMessageGroups.js.map +7 -0
- package/dist/hooks/useTerminalSize.js +62 -6
- package/dist/hooks/useTerminalSize.js.map +2 -2
- package/dist/hooks/useUnifiedCompletion.js +69 -0
- package/dist/hooks/useUnifiedCompletion.js.map +2 -2
- package/dist/i18n/index.js +109 -0
- package/dist/i18n/index.js.map +7 -0
- package/dist/i18n/locales/en.js +348 -0
- package/dist/i18n/locales/en.js.map +7 -0
- package/dist/i18n/locales/index.js +7 -0
- package/dist/i18n/locales/index.js.map +7 -0
- package/dist/i18n/locales/zh-CN.js +348 -0
- package/dist/i18n/locales/zh-CN.js.map +7 -0
- package/dist/i18n/types.js +8 -0
- package/dist/i18n/types.js.map +7 -0
- package/dist/permissions.js +28 -1
- package/dist/permissions.js.map +2 -2
- package/dist/query.js +253 -21
- package/dist/query.js.map +3 -3
- package/dist/screens/REPL.js +523 -194
- package/dist/screens/REPL.js.map +3 -3
- package/dist/services/adapters/chatCompletions.js +3 -1
- package/dist/services/adapters/chatCompletions.js.map +2 -2
- package/dist/services/adapters/messageNormalizer.js +354 -0
- package/dist/services/adapters/messageNormalizer.js.map +7 -0
- package/dist/services/adapters/responsesAPI.js +6 -3
- package/dist/services/adapters/responsesAPI.js.map +2 -2
- package/dist/services/checkpointManager.js +386 -0
- package/dist/services/checkpointManager.js.map +7 -0
- package/dist/services/claude.js +192 -14
- package/dist/services/claude.js.map +3 -3
- package/dist/services/compressionService.js +50 -1
- package/dist/services/compressionService.js.map +2 -2
- package/dist/services/contextMonitor.js +162 -0
- package/dist/services/contextMonitor.js.map +7 -0
- package/dist/services/customCommands.js +60 -41
- package/dist/services/customCommands.js.map +2 -2
- package/dist/services/hookExecutor.js +173 -1
- package/dist/services/hookExecutor.js.map +2 -2
- package/dist/services/intelligentCompactor.js +281 -0
- package/dist/services/intelligentCompactor.js.map +7 -0
- package/dist/services/lspConfig.js +109 -0
- package/dist/services/lspConfig.js.map +7 -0
- package/dist/services/mcpClient.js +338 -43
- package/dist/services/mcpClient.js.map +2 -2
- package/dist/services/modelOrchestrator.js +310 -0
- package/dist/services/modelOrchestrator.js.map +7 -0
- package/dist/services/openai.js +8 -1
- package/dist/services/openai.js.map +2 -2
- package/dist/services/outputStyles.js +138 -0
- package/dist/services/outputStyles.js.map +7 -0
- package/dist/services/plugins/index.js +5 -0
- package/dist/services/plugins/index.js.map +7 -0
- package/dist/services/plugins/lspServers.js +188 -0
- package/dist/services/plugins/lspServers.js.map +7 -0
- package/dist/services/plugins/pluginRuntime.js +229 -0
- package/dist/services/plugins/pluginRuntime.js.map +7 -0
- package/dist/services/plugins/pluginValidation.js +219 -0
- package/dist/services/plugins/pluginValidation.js.map +7 -0
- package/dist/services/plugins/skillMarketplace.js +556 -0
- package/dist/services/plugins/skillMarketplace.js.map +7 -0
- package/dist/services/responseStateManager.js +37 -3
- package/dist/services/responseStateManager.js.map +2 -2
- package/dist/services/sandbox/filesystemBoundary.js +341 -0
- package/dist/services/sandbox/filesystemBoundary.js.map +7 -0
- package/dist/services/sandbox/index.js +14 -0
- package/dist/services/sandbox/index.js.map +7 -0
- package/dist/services/sandbox/networkProxy.js +293 -0
- package/dist/services/sandbox/networkProxy.js.map +7 -0
- package/dist/services/sandbox/sandboxController.js +574 -0
- package/dist/services/sandbox/sandboxController.js.map +7 -0
- package/dist/services/sandbox/types.js +50 -0
- package/dist/services/sandbox/types.js.map +7 -0
- package/dist/services/sessionMemory.js +266 -0
- package/dist/services/sessionMemory.js.map +7 -0
- package/dist/services/taskRouter.js +324 -0
- package/dist/services/taskRouter.js.map +7 -0
- package/dist/tools/ArchitectTool/ArchitectTool.js +7 -1
- package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +6 -2
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +2 -1
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
- package/dist/tools/BaseTool.js +72 -0
- package/dist/tools/BaseTool.js.map +7 -0
- package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +3 -0
- package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +2 -2
- package/dist/tools/BashTool/BashTool.js +79 -3
- package/dist/tools/BashTool/BashTool.js.map +2 -2
- package/dist/tools/BashTool/BashToolResultMessage.js +3 -0
- package/dist/tools/BashTool/BashToolResultMessage.js.map +2 -2
- package/dist/tools/BashTool/OutputLine.js +54 -0
- package/dist/tools/BashTool/OutputLine.js.map +2 -2
- package/dist/tools/BashTool/prompt.js +336 -3
- package/dist/tools/BashTool/prompt.js.map +2 -2
- package/dist/tools/FileEditTool/FileEditTool.js +29 -4
- package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
- package/dist/tools/FileEditTool/prompt.js +6 -3
- package/dist/tools/FileEditTool/prompt.js.map +2 -2
- package/dist/tools/FileWriteTool/FileWriteTool.js +5 -5
- package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
- package/dist/tools/FileWriteTool/prompt.js +4 -2
- package/dist/tools/FileWriteTool/prompt.js.map +2 -2
- package/dist/tools/GlobTool/GlobTool.js +4 -2
- package/dist/tools/GlobTool/GlobTool.js.map +2 -2
- package/dist/tools/GrepTool/GrepTool.js +36 -7
- package/dist/tools/GrepTool/GrepTool.js.map +2 -2
- package/dist/tools/KillShellTool/KillShellToolResultMessage.js +3 -0
- package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +2 -2
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +109 -0
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +7 -0
- package/dist/tools/ListMcpResourcesTool/prompt.js +19 -0
- package/dist/tools/ListMcpResourcesTool/prompt.js.map +7 -0
- package/dist/tools/LspTool/LspTool.js +664 -0
- package/dist/tools/LspTool/LspTool.js.map +7 -0
- package/dist/tools/LspTool/prompt.js +27 -0
- package/dist/tools/LspTool/prompt.js.map +7 -0
- package/dist/tools/MCPTool/MCPTool.js +9 -1
- package/dist/tools/MCPTool/MCPTool.js.map +2 -2
- package/dist/tools/MemoryReadTool/MemoryReadTool.js +19 -6
- package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +6 -6
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js +19 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
- package/dist/tools/MultiEditTool/prompt.js +5 -3
- package/dist/tools/MultiEditTool/prompt.js.map +2 -2
- package/dist/tools/NotebookEditTool/NotebookEditTool.js +7 -2
- package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
- package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js +75 -0
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +7 -0
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js +109 -0
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +7 -0
- package/dist/tools/PlanModeTool/prompt.js +94 -0
- package/dist/tools/PlanModeTool/prompt.js.map +7 -0
- package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +130 -0
- package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +7 -0
- package/dist/tools/ReadMcpResourceTool/prompt.js +17 -0
- package/dist/tools/ReadMcpResourceTool/prompt.js.map +7 -0
- package/dist/tools/SkillTool/SkillTool.js +10 -4
- package/dist/tools/SkillTool/SkillTool.js.map +2 -2
- package/dist/tools/SkillTool/prompt.js +1 -1
- package/dist/tools/SkillTool/prompt.js.map +1 -1
- package/dist/tools/SlashCommandTool/SlashCommandTool.js +260 -0
- package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +7 -0
- package/dist/tools/SlashCommandTool/prompt.js +35 -0
- package/dist/tools/SlashCommandTool/prompt.js.map +7 -0
- package/dist/tools/TaskOutputTool/TaskOutputTool.js +190 -0
- package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +7 -0
- package/dist/tools/TaskOutputTool/prompt.js +15 -0
- package/dist/tools/TaskOutputTool/prompt.js.map +7 -0
- package/dist/tools/TaskTool/TaskTool.js +310 -104
- package/dist/tools/TaskTool/TaskTool.js.map +2 -2
- package/dist/tools/TaskTool/prompt.js.map +2 -2
- package/dist/tools/TodoWriteTool/TodoWriteTool.js +42 -77
- package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/URLFetcherTool.js +4 -1
- package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/cache.js +55 -8
- package/dist/tools/URLFetcherTool/cache.js.map +2 -2
- package/dist/tools.js +31 -2
- package/dist/tools.js.map +2 -2
- package/dist/types/hooks.js +4 -0
- package/dist/types/hooks.js.map +2 -2
- package/dist/types/marketplace.js.map +2 -2
- package/dist/types/messageGroup.js +36 -0
- package/dist/types/messageGroup.js.map +7 -0
- package/dist/types/plugin.js.map +2 -2
- package/dist/types/thinking.js +1 -0
- package/dist/types/thinking.js.map +7 -0
- package/dist/utils/BackgroundShellManager.js +136 -39
- package/dist/utils/BackgroundShellManager.js.map +2 -2
- package/dist/utils/CircuitBreaker.js +242 -0
- package/dist/utils/CircuitBreaker.js.map +7 -0
- package/dist/utils/MessageBatchBuffer.js +102 -0
- package/dist/utils/MessageBatchBuffer.js.map +7 -0
- package/dist/utils/PersistentShell.js +151 -1
- package/dist/utils/PersistentShell.js.map +2 -2
- package/dist/utils/agentLoader.js +1 -23
- package/dist/utils/agentLoader.js.map +2 -2
- package/dist/utils/agentTranscripts.js +641 -0
- package/dist/utils/agentTranscripts.js.map +7 -0
- package/dist/utils/animationManager.js +213 -0
- package/dist/utils/animationManager.js.map +7 -0
- package/dist/utils/animationSync.js +110 -0
- package/dist/utils/animationSync.js.map +7 -0
- package/dist/utils/ask.js +2 -0
- package/dist/utils/ask.js.map +2 -2
- package/dist/utils/asyncFile.js +215 -0
- package/dist/utils/asyncFile.js.map +7 -0
- package/dist/utils/backgroundAgentManager.js +231 -0
- package/dist/utils/backgroundAgentManager.js.map +7 -0
- package/dist/utils/config.js +108 -10
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/conversationRecovery.js +19 -0
- package/dist/utils/conversationRecovery.js.map +2 -2
- package/dist/utils/credentials/CredentialStore.js +1 -0
- package/dist/utils/credentials/CredentialStore.js.map +7 -0
- package/dist/utils/credentials/EncryptedFileStore.js +157 -0
- package/dist/utils/credentials/EncryptedFileStore.js.map +7 -0
- package/dist/utils/credentials/index.js +37 -0
- package/dist/utils/credentials/index.js.map +7 -0
- package/dist/utils/credentials/migration.js +82 -0
- package/dist/utils/credentials/migration.js.map +7 -0
- package/dist/utils/exit.js +73 -0
- package/dist/utils/exit.js.map +7 -0
- package/dist/utils/format.js +73 -5
- package/dist/utils/format.js.map +2 -2
- package/dist/utils/generators.js +76 -6
- package/dist/utils/generators.js.map +2 -2
- package/dist/utils/globalErrorHandler.js +149 -0
- package/dist/utils/globalErrorHandler.js.map +7 -0
- package/dist/utils/groupHandlers/index.js +8 -0
- package/dist/utils/groupHandlers/index.js.map +7 -0
- package/dist/utils/groupHandlers/parallelTasksHandler.js +140 -0
- package/dist/utils/groupHandlers/parallelTasksHandler.js.map +7 -0
- package/dist/utils/groupHandlers/taskHandler.js +104 -0
- package/dist/utils/groupHandlers/taskHandler.js.map +7 -0
- package/dist/utils/groupHandlers/types.js +1 -0
- package/dist/utils/groupHandlers/types.js.map +7 -0
- package/dist/utils/logRotation.js +224 -0
- package/dist/utils/logRotation.js.map +7 -0
- package/dist/utils/markdown.js +13 -1
- package/dist/utils/markdown.js.map +2 -2
- package/dist/utils/marketplaceManager.js +3 -5
- package/dist/utils/marketplaceManager.js.map +2 -2
- package/dist/utils/memSafety.js +264 -0
- package/dist/utils/memSafety.js.map +7 -0
- package/dist/utils/messageGroupManager.js +274 -0
- package/dist/utils/messageGroupManager.js.map +7 -0
- package/dist/utils/messages.js +13 -4
- package/dist/utils/messages.js.map +2 -2
- package/dist/utils/model.js +119 -15
- package/dist/utils/model.js.map +3 -3
- package/dist/utils/permissions/filesystem.js +162 -6
- package/dist/utils/permissions/filesystem.js.map +2 -2
- package/dist/utils/plan/planMode.js +143 -0
- package/dist/utils/plan/planMode.js.map +7 -0
- package/dist/utils/pluginLoader.js +17 -21
- package/dist/utils/pluginLoader.js.map +2 -2
- package/dist/utils/ripgrep.js +55 -2
- package/dist/utils/ripgrep.js.map +2 -2
- package/dist/utils/safePath.js +132 -0
- package/dist/utils/safePath.js.map +7 -0
- package/dist/utils/sanitizeInput.js +32 -0
- package/dist/utils/sanitizeInput.js.map +7 -0
- package/dist/utils/secureKeyStorage.js +312 -0
- package/dist/utils/secureKeyStorage.js.map +7 -0
- package/dist/utils/sensitiveFiles.js +125 -0
- package/dist/utils/sensitiveFiles.js.map +7 -0
- package/dist/utils/session/sessionPlugins.js +67 -0
- package/dist/utils/session/sessionPlugins.js.map +7 -0
- package/dist/utils/taskDisplayUtils.js +257 -0
- package/dist/utils/taskDisplayUtils.js.map +7 -0
- package/dist/utils/teamConfig.js +2 -1
- package/dist/utils/teamConfig.js.map +2 -2
- package/dist/utils/theme.js +6 -6
- package/dist/utils/theme.js.map +1 -1
- package/dist/utils/todoStorage.js +92 -2
- package/dist/utils/todoStorage.js.map +2 -2
- package/dist/utils/toolRiskClassification.js +207 -0
- package/dist/utils/toolRiskClassification.js.map +7 -0
- package/dist/utils/toolTimeout.js +136 -0
- package/dist/utils/toolTimeout.js.map +7 -0
- package/dist/utils/tooling/safeRender.js +116 -0
- package/dist/utils/tooling/safeRender.js.map +7 -0
- package/dist/utils/userFriendlyError.js +346 -0
- package/dist/utils/userFriendlyError.js.map +7 -0
- package/dist/utils/vendor/ripgrep/arm64-darwin/rg +0 -0
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +17 -5
- package/scripts/postinstall.js +128 -38
- package/dist/commands/agents.js +0 -2086
- package/dist/commands/agents.js.map +0 -7
- package/dist/commands/build.js +0 -74
- package/dist/commands/build.js.map +0 -7
- package/dist/commands/compression.js +0 -57
- package/dist/commands/compression.js.map +0 -7
- package/dist/commands/listen.js +0 -37
- package/dist/commands/listen.js.map +0 -7
- package/dist/commands/login.js +0 -37
- package/dist/commands/login.js.map +0 -7
- package/dist/commands/logout.js +0 -33
- package/dist/commands/logout.js.map +0 -7
- package/dist/commands/mcp.js +0 -40
- package/dist/commands/mcp.js.map +0 -7
- package/dist/commands/mcp_refresh.js +0 -40
- package/dist/commands/mcp_refresh.js.map +0 -7
- package/dist/commands/modelstatus.js +0 -21
- package/dist/commands/modelstatus.js.map +0 -7
- package/dist/commands/onboarding.js +0 -36
- package/dist/commands/onboarding.js.map +0 -7
- package/dist/commands/plugin-interactive.js +0 -446
- package/dist/commands/plugin-interactive.js.map +0 -7
- package/dist/commands/pr_comments.js +0 -61
- package/dist/commands/pr_comments.js.map +0 -7
- package/dist/commands/release-notes.js +0 -30
- package/dist/commands/release-notes.js.map +0 -7
- package/dist/commands/review.js +0 -51
- package/dist/commands/review.js.map +0 -7
- package/dist/components/Bug.js +0 -147
- package/dist/components/Bug.js.map +0 -7
- package/dist/components/ModelSelector.js +0 -2062
- package/dist/components/ModelSelector.js.map +0 -7
- package/dist/components/ModelStatusDisplay.js +0 -87
- package/dist/components/ModelStatusDisplay.js.map +0 -7
- package/dist/entrypoints/cli-wrapper.js +0 -61
- package/dist/entrypoints/cli-wrapper.js.map +0 -7
- package/dist/hooks/useCancelRequest.js +0 -28
- package/dist/hooks/useCancelRequest.js.map +0 -7
- package/dist/screens/Doctor.js +0 -22
- package/dist/screens/Doctor.js.map +0 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/teamConfig.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Team Configuration System\n *\n * Enables teams to share a unified Minto configuration via remote URLs.\n * Supports environment variable interpolation and flexible configuration merging.\n */\n\nimport { existsSync, readFileSync } from 'fs'\nimport {\n getGlobalConfig,\n saveGlobalConfig,\n ModelProfile,\n ModelPointers,\n McpServerConfig,\n ProviderType,\n} from './config'\nimport { debug as debugLogger } from './debugLogger'\nimport { safeParseJSON } from './json'\n\n/**\n * Team configuration schema\n * Represents a shareable configuration template for teams\n */\nexport type TeamConfig = {\n version: '1.0'\n name: string // Configuration name (e.g., \"Acme Inc. Default Config\")\n description?: string // Optional description\n\n // Model Configuration\n models?: {\n profiles?: TeamModelProfile[]\n pointers?: Partial<ModelPointers> // Default model pointers\n defaultModel?: string // Default model name\n }\n\n // MCP Server Configuration\n mcpServers?: Record<string, TeamMcpServerConfig>\n\n // Plugin Marketplace Configuration\n plugins?: {\n // Plugin marketplace URLs (marketplace.json)\n marketplaces?: string[]\n // Specific plugins to install from marketplaces\n install?: string[] // Plugin names to install\n }\n\n // Global Settings\n settings?: {\n theme?: 'dark' | 'light'\n verbose?: boolean\n compressionMode?: 'business' | 'code'\n thinking?: boolean\n proxy?: string\n stream?: boolean\n }\n\n // Instructions for users\n postInstallInstructions?: string\n}\n\n/**\n * Model profile template with environment variable support\n */\nexport type TeamModelProfile = {\n name: string\n provider: ProviderType\n modelName: string\n baseURL?: string\n apiKey: string // Can be env var like \"${ANTHROPIC_API_KEY}\"\n maxTokens: number\n contextLength: number\n reasoningEffort?: 'low' | 'medium' | 'high' | 'minimal'\n isActive?: boolean\n}\n\n/**\n * MCP server config with env var support\n */\nexport type TeamMcpServerConfig = {\n type?: 'stdio' | 'sse'\n command?: string // For stdio\n args?: string[] // For stdio, supports env vars like \"${HOME}/.local/bin/mcp-server\"\n url?: string // For SSE\n env?: Record<string, string> // Env vars, supports interpolation\n enabled?: boolean\n}\n\n/**\n * Interpolate environment variables in a string\n * Supports ${VAR_NAME} syntax\n */\nexport function interpolateEnvVars(value: string): string {\n return value.replace(/\\$\\{([^}]+)\\}/g, (match, varName) => {\n const envValue = process.env[varName.trim()]\n if (envValue === undefined) {\n debugLogger.warn('ENV_VAR_NOT_FOUND', {\n varName,\n original: match,\n })\n // Keep the placeholder if env var not found\n return match\n }\n return envValue\n })\n}\n\n/**\n * Recursively interpolate env vars in an object\n */\nexport function interpolateEnvVarsInObject<T>(obj: T): T {\n if (typeof obj === 'string') {\n return interpolateEnvVars(obj) as T\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => interpolateEnvVarsInObject(item)) as T\n }\n\n if (obj && typeof obj === 'object') {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj)) {\n result[key] = interpolateEnvVarsInObject(value)\n }\n return result as T\n }\n\n return obj\n}\n\n/**\n * Convert team model profile to runtime model profile\n */\nexport function convertTeamModelProfile(\n teamProfile: TeamModelProfile,\n): ModelProfile {\n const now = Date.now()\n\n return {\n name: teamProfile.name,\n provider: teamProfile.provider,\n modelName: teamProfile.modelName,\n baseURL: teamProfile.baseURL,\n apiKey: interpolateEnvVars(teamProfile.apiKey),\n maxTokens: teamProfile.maxTokens,\n contextLength: teamProfile.contextLength,\n reasoningEffort: teamProfile.reasoningEffort,\n isActive: teamProfile.isActive ?? true,\n createdAt: now,\n lastUsed: now,\n }\n}\n\n/**\n * Convert team MCP config to runtime MCP config\n */\nexport function convertTeamMcpConfig(\n teamConfig: TeamMcpServerConfig,\n): McpServerConfig {\n if (teamConfig.type === 'sse') {\n return {\n type: 'sse',\n url: interpolateEnvVars(teamConfig.url || ''),\n enabled: teamConfig.enabled ?? true,\n }\n }\n\n // Default to stdio\n return {\n type: 'stdio',\n command: interpolateEnvVars(teamConfig.command || ''),\n args: (teamConfig.args || []).map(arg => interpolateEnvVars(arg)),\n env: teamConfig.env\n ? interpolateEnvVarsInObject(teamConfig.env)\n : undefined,\n enabled: teamConfig.enabled ?? true,\n }\n}\n\n/**\n * Fetch team configuration from a URL\n */\nexport async function fetchTeamConfig(url: string): Promise<TeamConfig> {\n debugLogger.state('TEAM_CONFIG_FETCH_START', { url })\n\n try {\n const response = await fetch(url)\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch config: ${response.status} ${response.statusText}`,\n )\n }\n\n const configText = await response.text()\n const config = JSON.parse(configText) as TeamConfig\n\n // Validate version\n if (config.version !== '1.0') {\n throw new Error(\n `Unsupported config version: ${config.version}. Expected 1.0`,\n )\n }\n\n debugLogger.state('TEAM_CONFIG_FETCH_SUCCESS', {\n url,\n configName: config.name,\n hasModels: !!config.models,\n hasMcpServers: !!config.mcpServers,\n })\n\n return config\n } catch (error) {\n debugLogger.error('TEAM_CONFIG_FETCH_ERROR', {\n url,\n error: error instanceof Error ? error.message : String(error),\n })\n throw error\n }\n}\n\n/**\n * Load team configuration from a local file\n */\nexport function loadTeamConfigFromFile(filePath: string): TeamConfig {\n debugLogger.state('TEAM_CONFIG_LOAD_FILE', { filePath })\n\n if (!existsSync(filePath)) {\n throw new Error(`Configuration file not found: ${filePath}`)\n }\n\n try {\n const configText = readFileSync(filePath, 'utf-8')\n const config = safeParseJSON(configText) as TeamConfig\n\n if (!config) {\n throw new Error('Invalid JSON in configuration file')\n }\n\n if (config.version !== '1.0') {\n throw new Error(\n `Unsupported config version: ${config.version}. Expected 1.0`,\n )\n }\n\n debugLogger.state('TEAM_CONFIG_LOAD_FILE_SUCCESS', {\n filePath,\n configName: config.name,\n })\n\n return config\n } catch (error) {\n debugLogger.error('TEAM_CONFIG_LOAD_FILE_ERROR', {\n filePath,\n error: error instanceof Error ? error.message : String(error),\n })\n throw error\n }\n}\n\n/**\n * Merge strategy for configuration\n */\nexport type MergeStrategy = 'replace' | 'merge' | 'skip-existing'\n\n/**\n * Apply team configuration to global config\n */\nexport function applyTeamConfig(\n teamConfig: TeamConfig,\n strategy: MergeStrategy = 'merge',\n): {\n applied: boolean\n modelsAdded: number\n mcpServersAdded: number\n settingsUpdated: string[]\n} {\n debugLogger.state('TEAM_CONFIG_APPLY_START', {\n configName: teamConfig.name,\n strategy,\n })\n\n const globalConfig = getGlobalConfig()\n let modelsAdded = 0\n let mcpServersAdded = 0\n const settingsUpdated: string[] = []\n\n // Apply model profiles\n if (teamConfig.models?.profiles) {\n const existingProfiles = globalConfig.modelProfiles || []\n const existingModelNames = new Set(existingProfiles.map(p => p.modelName))\n\n for (const teamProfile of teamConfig.models.profiles) {\n const runtimeProfile = convertTeamModelProfile(teamProfile)\n\n if (\n strategy === 'skip-existing' &&\n existingModelNames.has(runtimeProfile.modelName)\n ) {\n debugLogger.state('TEAM_CONFIG_SKIP_MODEL', {\n modelName: runtimeProfile.modelName,\n reason: 'already_exists',\n })\n continue\n }\n\n if (strategy === 'replace') {\n // Remove existing profile with same modelName\n const index = existingProfiles.findIndex(\n p => p.modelName === runtimeProfile.modelName,\n )\n if (index !== -1) {\n existingProfiles.splice(index, 1)\n }\n }\n\n existingProfiles.push(runtimeProfile)\n modelsAdded++\n\n debugLogger.state('TEAM_CONFIG_ADD_MODEL', {\n modelName: runtimeProfile.modelName,\n provider: runtimeProfile.provider,\n })\n }\n\n globalConfig.modelProfiles = existingProfiles\n }\n\n // Apply model pointers\n if (teamConfig.models?.pointers) {\n globalConfig.modelPointers = {\n ...(globalConfig.modelPointers || {\n main: '',\n task: '',\n reasoning: '',\n quick: '',\n }),\n ...teamConfig.models.pointers,\n }\n settingsUpdated.push('modelPointers')\n }\n\n // Apply default model\n if (teamConfig.models?.defaultModel) {\n globalConfig.defaultModelName = teamConfig.models.defaultModel\n settingsUpdated.push('defaultModelName')\n }\n\n // Apply MCP servers\n if (teamConfig.mcpServers) {\n const existingMcpServers = globalConfig.mcpServers || {}\n const existingServerNames = new Set(Object.keys(existingMcpServers))\n\n for (const [serverName, teamMcpConfig] of Object.entries(\n teamConfig.mcpServers,\n )) {\n if (strategy === 'skip-existing' && existingServerNames.has(serverName)) {\n debugLogger.state('TEAM_CONFIG_SKIP_MCP', {\n serverName,\n reason: 'already_exists',\n })\n continue\n }\n\n const runtimeMcpConfig = convertTeamMcpConfig(teamMcpConfig)\n existingMcpServers[serverName] = runtimeMcpConfig\n mcpServersAdded++\n\n debugLogger.state('TEAM_CONFIG_ADD_MCP', {\n serverName,\n type: runtimeMcpConfig.type || 'stdio',\n })\n }\n\n globalConfig.mcpServers = existingMcpServers\n }\n\n // Apply global settings\n if (teamConfig.settings) {\n const { settings } = teamConfig\n\n if (settings.theme !== undefined) {\n globalConfig.theme = settings.theme\n settingsUpdated.push('theme')\n }\n\n if (settings.verbose !== undefined) {\n globalConfig.verbose = settings.verbose\n settingsUpdated.push('verbose')\n }\n\n if (settings.compressionMode !== undefined) {\n globalConfig.compressionMode = settings.compressionMode\n settingsUpdated.push('compressionMode')\n }\n\n if (settings.thinking !== undefined) {\n globalConfig.thinking = settings.thinking\n settingsUpdated.push('thinking')\n }\n\n if (settings.proxy !== undefined) {\n globalConfig.proxy = settings.proxy\n settingsUpdated.push('proxy')\n }\n\n if (settings.stream !== undefined) {\n globalConfig.stream = settings.stream\n settingsUpdated.push('stream')\n }\n }\n\n // Save updated config\n saveGlobalConfig(globalConfig)\n\n debugLogger.state('TEAM_CONFIG_APPLY_SUCCESS', {\n configName: teamConfig.name,\n modelsAdded,\n mcpServersAdded,\n settingsUpdated: settingsUpdated.join(', '),\n })\n\n return {\n applied: true,\n modelsAdded,\n mcpServersAdded,\n settingsUpdated,\n }\n}\n\n/**\n * Add marketplaces from URLs\n */\nexport async function addMarketplaces(\n marketplaceUrls: string[],\n): Promise<{ added: number; failed: number; errors: string[] }> {\n let added = 0\n let failed = 0\n const errors: string[] = []\n\n // Import marketplace manager\n const { addMarketplace } = await import('./marketplaceManager')\n\n for (const url of marketplaceUrls) {\n try {\n debugLogger.state('TEAM_CONFIG_ADD_MARKETPLACE', { url })\n\n await addMarketplace(url)\n added++\n\n debugLogger.state('TEAM_CONFIG_ADD_MARKETPLACE_SUCCESS', { url })\n } catch (error) {\n failed++\n const errorMsg = error instanceof Error ? error.message : String(error)\n errors.push(`${url}: ${errorMsg}`)\n\n debugLogger.error('TEAM_CONFIG_ADD_MARKETPLACE_ERROR', {\n url,\n error: errorMsg,\n })\n }\n }\n\n return { added, failed, errors }\n}\n\n/**\n * Install plugins from marketplaces\n */\nexport async function installPlugins(\n pluginNames: string[],\n targetDir?: string,\n): Promise<{ installed: number; failed: number; errors: string[] }> {\n let installed = 0\n let failed = 0\n const errors: string[] = []\n\n // Import marketplace manager and path utilities\n const { installPluginFromMarketplace } = await import('./marketplaceManager')\n const { join } = await import('path')\n const { homedir } = await import('os')\n\n // Default target: ~/.minto/plugins\n const installDir = targetDir || join(homedir(), '.minto', 'plugins')\n\n for (const pluginName of pluginNames) {\n try {\n debugLogger.state('TEAM_CONFIG_INSTALL_PLUGIN', {\n pluginName,\n targetDir: installDir,\n })\n\n await installPluginFromMarketplace(\n pluginName,\n undefined, // Search all marketplaces\n join(installDir, pluginName),\n )\n\n installed++\n debugLogger.state('TEAM_CONFIG_INSTALL_PLUGIN_SUCCESS', { pluginName })\n } catch (error) {\n failed++\n const errorMsg = error instanceof Error ? error.message : String(error)\n errors.push(`${pluginName}: ${errorMsg}`)\n\n debugLogger.error('TEAM_CONFIG_INSTALL_PLUGIN_ERROR', {\n pluginName,\n error: errorMsg,\n })\n }\n }\n\n return { installed, failed, errors }\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["/**\n * Team Configuration System\n *\n * Enables teams to share a unified Minto configuration via remote URLs.\n * Supports environment variable interpolation and flexible configuration merging.\n */\n\nimport { existsSync, readFileSync } from 'fs'\nimport {\n getGlobalConfig,\n saveGlobalConfig,\n ModelProfile,\n ModelPointers,\n McpServerConfig,\n ProviderType,\n} from './config'\nimport { debug as debugLogger } from './debugLogger'\nimport { safeParseJSON } from './json'\n\n/**\n * Team configuration schema\n * Represents a shareable configuration template for teams\n */\nexport type TeamConfig = {\n version: '1.0'\n name: string // Configuration name (e.g., \"Acme Inc. Default Config\")\n description?: string // Optional description\n\n // Model Configuration\n models?: {\n profiles?: TeamModelProfile[]\n pointers?: Partial<ModelPointers> // Default model pointers\n defaultModel?: string // Default model name\n }\n\n // MCP Server Configuration\n mcpServers?: Record<string, TeamMcpServerConfig>\n\n // Plugin Marketplace Configuration\n plugins?: {\n // Plugin marketplace URLs (marketplace.json)\n marketplaces?: string[]\n // Specific plugins to install from marketplaces\n install?: string[] // Plugin names to install\n }\n\n // Global Settings\n settings?: {\n theme?: 'dark' | 'light'\n verbose?: boolean\n compressionMode?: 'business' | 'code'\n thinking?: boolean\n proxy?: string\n stream?: boolean\n }\n\n // Instructions for users\n postInstallInstructions?: string\n}\n\n/**\n * Model profile template with environment variable support\n */\nexport type TeamModelProfile = {\n name: string\n provider: ProviderType\n modelName: string\n baseURL?: string\n apiKey: string // Can be env var like \"${ANTHROPIC_API_KEY}\"\n maxTokens: number\n contextLength: number\n reasoningEffort?: 'low' | 'medium' | 'high' | 'minimal'\n isActive?: boolean\n}\n\n/**\n * MCP server config with env var support\n */\nexport type TeamMcpServerConfig = {\n type?: 'stdio' | 'sse'\n command?: string // For stdio\n args?: string[] // For stdio, supports env vars like \"${HOME}/.local/bin/mcp-server\"\n url?: string // For SSE\n env?: Record<string, string> // Env vars, supports interpolation\n enabled?: boolean\n}\n\n/**\n * Interpolate environment variables in a string\n * Supports ${VAR_NAME} syntax\n */\nexport function interpolateEnvVars(value: string): string {\n return value.replace(/\\$\\{([^}]+)\\}/g, (match, varName) => {\n const envValue = process.env[varName.trim()]\n if (envValue === undefined) {\n debugLogger.warn('ENV_VAR_NOT_FOUND', {\n varName,\n original: match,\n })\n // Keep the placeholder if env var not found\n return match\n }\n return envValue\n })\n}\n\n/**\n * Recursively interpolate env vars in an object\n */\nexport function interpolateEnvVarsInObject<T>(obj: T): T {\n if (typeof obj === 'string') {\n return interpolateEnvVars(obj) as T\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => interpolateEnvVarsInObject(item)) as T\n }\n\n if (obj && typeof obj === 'object') {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj)) {\n result[key] = interpolateEnvVarsInObject(value)\n }\n return result as T\n }\n\n return obj\n}\n\n/**\n * Convert team model profile to runtime model profile\n */\nexport function convertTeamModelProfile(\n teamProfile: TeamModelProfile,\n): ModelProfile {\n const now = Date.now()\n\n return {\n name: teamProfile.name,\n provider: teamProfile.provider,\n modelName: teamProfile.modelName,\n baseURL: teamProfile.baseURL,\n apiKey: interpolateEnvVars(teamProfile.apiKey),\n maxTokens: teamProfile.maxTokens,\n contextLength: teamProfile.contextLength,\n reasoningEffort: teamProfile.reasoningEffort,\n isActive: teamProfile.isActive ?? true,\n createdAt: now,\n lastUsed: now,\n }\n}\n\n/**\n * Convert team MCP config to runtime MCP config\n */\nexport function convertTeamMcpConfig(\n teamConfig: TeamMcpServerConfig,\n): McpServerConfig {\n if (teamConfig.type === 'sse') {\n return {\n type: 'sse',\n url: interpolateEnvVars(teamConfig.url || ''),\n enabled: teamConfig.enabled ?? true,\n }\n }\n\n // Default to stdio\n return {\n type: 'stdio',\n command: interpolateEnvVars(teamConfig.command || ''),\n args: (teamConfig.args || []).map(arg => interpolateEnvVars(arg)),\n env: teamConfig.env\n ? interpolateEnvVarsInObject(teamConfig.env)\n : undefined,\n enabled: teamConfig.enabled ?? true,\n }\n}\n\n/**\n * Fetch team configuration from a URL\n */\nexport async function fetchTeamConfig(url: string): Promise<TeamConfig> {\n debugLogger.state('TEAM_CONFIG_FETCH_START', { url })\n\n try {\n const response = await fetch(url)\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch config: ${response.status} ${response.statusText}`,\n )\n }\n\n const configText = await response.text()\n const config = JSON.parse(configText) as TeamConfig\n\n // Validate version\n if (config.version !== '1.0') {\n throw new Error(\n `Unsupported config version: ${config.version}. Expected 1.0`,\n )\n }\n\n debugLogger.state('TEAM_CONFIG_FETCH_SUCCESS', {\n url,\n configName: config.name,\n hasModels: !!config.models,\n hasMcpServers: !!config.mcpServers,\n })\n\n return config\n } catch (error) {\n debugLogger.error('TEAM_CONFIG_FETCH_ERROR', {\n url,\n error: error instanceof Error ? error.message : String(error),\n })\n throw error\n }\n}\n\n/**\n * Load team configuration from a local file\n */\nexport function loadTeamConfigFromFile(filePath: string): TeamConfig {\n debugLogger.state('TEAM_CONFIG_LOAD_FILE', { filePath })\n\n if (!existsSync(filePath)) {\n throw new Error(`Configuration file not found: ${filePath}`)\n }\n\n try {\n const configText = readFileSync(filePath, 'utf-8')\n const config = safeParseJSON(configText) as TeamConfig\n\n if (!config) {\n throw new Error('Invalid JSON in configuration file')\n }\n\n if (config.version !== '1.0') {\n throw new Error(\n `Unsupported config version: ${config.version}. Expected 1.0`,\n )\n }\n\n debugLogger.state('TEAM_CONFIG_LOAD_FILE_SUCCESS', {\n filePath,\n configName: config.name,\n })\n\n return config\n } catch (error) {\n debugLogger.error('TEAM_CONFIG_LOAD_FILE_ERROR', {\n filePath,\n error: error instanceof Error ? error.message : String(error),\n })\n throw error\n }\n}\n\n/**\n * Merge strategy for configuration\n */\nexport type MergeStrategy = 'replace' | 'merge' | 'skip-existing'\n\n/**\n * Apply team configuration to global config\n */\nexport function applyTeamConfig(\n teamConfig: TeamConfig,\n strategy: MergeStrategy = 'merge',\n): {\n applied: boolean\n modelsAdded: number\n mcpServersAdded: number\n settingsUpdated: string[]\n} {\n debugLogger.state('TEAM_CONFIG_APPLY_START', {\n configName: teamConfig.name,\n strategy,\n })\n\n const globalConfig = getGlobalConfig()\n let modelsAdded = 0\n let mcpServersAdded = 0\n const settingsUpdated: string[] = []\n\n // Apply model profiles\n if (teamConfig.models?.profiles) {\n const existingProfiles = globalConfig.modelProfiles || []\n const existingModelNames = new Set(existingProfiles.map(p => p.modelName))\n\n for (const teamProfile of teamConfig.models.profiles) {\n const runtimeProfile = convertTeamModelProfile(teamProfile)\n\n if (\n strategy === 'skip-existing' &&\n existingModelNames.has(runtimeProfile.modelName)\n ) {\n debugLogger.state('TEAM_CONFIG_SKIP_MODEL', {\n modelName: runtimeProfile.modelName,\n reason: 'already_exists',\n })\n continue\n }\n\n if (strategy === 'replace') {\n // Remove existing profile with same modelName\n const index = existingProfiles.findIndex(\n p => p.modelName === runtimeProfile.modelName,\n )\n if (index !== -1) {\n existingProfiles.splice(index, 1)\n }\n }\n\n existingProfiles.push(runtimeProfile)\n modelsAdded++\n\n debugLogger.state('TEAM_CONFIG_ADD_MODEL', {\n modelName: runtimeProfile.modelName,\n provider: runtimeProfile.provider,\n })\n }\n\n globalConfig.modelProfiles = existingProfiles\n }\n\n // Apply model pointers\n if (teamConfig.models?.pointers) {\n globalConfig.modelPointers = {\n ...(globalConfig.modelPointers || {\n main: '',\n task: '',\n reasoning: '',\n quick: '',\n compact: '',\n }),\n ...teamConfig.models.pointers,\n }\n settingsUpdated.push('modelPointers')\n }\n\n // Apply default model\n if (teamConfig.models?.defaultModel) {\n globalConfig.defaultModelName = teamConfig.models.defaultModel\n settingsUpdated.push('defaultModelName')\n }\n\n // Apply MCP servers\n if (teamConfig.mcpServers) {\n const existingMcpServers = globalConfig.mcpServers || {}\n const existingServerNames = new Set(Object.keys(existingMcpServers))\n\n for (const [serverName, teamMcpConfig] of Object.entries(\n teamConfig.mcpServers,\n )) {\n if (strategy === 'skip-existing' && existingServerNames.has(serverName)) {\n debugLogger.state('TEAM_CONFIG_SKIP_MCP', {\n serverName,\n reason: 'already_exists',\n })\n continue\n }\n\n const runtimeMcpConfig = convertTeamMcpConfig(teamMcpConfig)\n existingMcpServers[serverName] = runtimeMcpConfig\n mcpServersAdded++\n\n debugLogger.state('TEAM_CONFIG_ADD_MCP', {\n serverName,\n type: runtimeMcpConfig.type || 'stdio',\n })\n }\n\n globalConfig.mcpServers = existingMcpServers\n }\n\n // Apply global settings\n if (teamConfig.settings) {\n const { settings } = teamConfig\n\n if (settings.theme !== undefined) {\n globalConfig.theme = settings.theme\n settingsUpdated.push('theme')\n }\n\n if (settings.verbose !== undefined) {\n globalConfig.verbose = settings.verbose\n settingsUpdated.push('verbose')\n }\n\n if (settings.compressionMode !== undefined) {\n globalConfig.compressionMode = settings.compressionMode\n settingsUpdated.push('compressionMode')\n }\n\n if (settings.thinking !== undefined) {\n globalConfig.thinking = settings.thinking\n settingsUpdated.push('thinking')\n }\n\n if (settings.proxy !== undefined) {\n globalConfig.proxy = settings.proxy\n settingsUpdated.push('proxy')\n }\n\n if (settings.stream !== undefined) {\n globalConfig.stream = settings.stream\n settingsUpdated.push('stream')\n }\n }\n\n // Save updated config\n saveGlobalConfig(globalConfig)\n\n debugLogger.state('TEAM_CONFIG_APPLY_SUCCESS', {\n configName: teamConfig.name,\n modelsAdded,\n mcpServersAdded,\n settingsUpdated: settingsUpdated.join(', '),\n })\n\n return {\n applied: true,\n modelsAdded,\n mcpServersAdded,\n settingsUpdated,\n }\n}\n\n/**\n * Add marketplaces from URLs\n */\nexport async function addMarketplaces(\n marketplaceUrls: string[],\n): Promise<{ added: number; failed: number; errors: string[] }> {\n let added = 0\n let failed = 0\n const errors: string[] = []\n\n // Import marketplace manager\n const { addMarketplace } = await import('./marketplaceManager')\n\n for (const url of marketplaceUrls) {\n try {\n debugLogger.state('TEAM_CONFIG_ADD_MARKETPLACE', { url })\n\n await addMarketplace(url)\n added++\n\n debugLogger.state('TEAM_CONFIG_ADD_MARKETPLACE_SUCCESS', { url })\n } catch (error) {\n failed++\n const errorMsg = error instanceof Error ? error.message : String(error)\n errors.push(`${url}: ${errorMsg}`)\n\n debugLogger.error('TEAM_CONFIG_ADD_MARKETPLACE_ERROR', {\n url,\n error: errorMsg,\n })\n }\n }\n\n return { added, failed, errors }\n}\n\n/**\n * Install plugins from marketplaces\n */\nexport async function installPlugins(\n pluginNames: string[],\n targetDir?: string,\n): Promise<{ installed: number; failed: number; errors: string[] }> {\n let installed = 0\n let failed = 0\n const errors: string[] = []\n\n // Import marketplace manager and path utilities\n const { installPluginFromMarketplace } = await import('./marketplaceManager')\n const { join } = await import('path')\n const { homedir } = await import('os')\n\n // Default target: ~/.minto/plugins\n const installDir = targetDir || join(homedir(), '.minto', 'plugins')\n\n for (const pluginName of pluginNames) {\n try {\n debugLogger.state('TEAM_CONFIG_INSTALL_PLUGIN', {\n pluginName,\n targetDir: installDir,\n })\n\n await installPluginFromMarketplace(\n pluginName,\n undefined, // Search all marketplaces\n join(installDir, pluginName),\n )\n\n installed++\n debugLogger.state('TEAM_CONFIG_INSTALL_PLUGIN_SUCCESS', { pluginName })\n } catch (error) {\n failed++\n const errorMsg = error instanceof Error ? error.message : String(error)\n errors.push(`${pluginName}: ${errorMsg}`)\n\n debugLogger.error('TEAM_CONFIG_INSTALL_PLUGIN_ERROR', {\n pluginName,\n error: errorMsg,\n })\n }\n }\n\n return { installed, failed, errors }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/utils/theme.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getGlobalConfig } from "./config.js";
|
|
2
2
|
const lightTheme = {
|
|
3
3
|
bashBorder: "#FF6E57",
|
|
4
|
-
minto: "#
|
|
4
|
+
minto: "#B668C8",
|
|
5
5
|
noting: "#222222",
|
|
6
6
|
permission: "#e9c61aff",
|
|
7
7
|
secondaryBorder: "#999",
|
|
@@ -19,7 +19,7 @@ const lightTheme = {
|
|
|
19
19
|
addedDimmed: "#c7e1cb",
|
|
20
20
|
removedDimmed: "#fdd2d8"
|
|
21
21
|
},
|
|
22
|
-
brand: "#
|
|
22
|
+
brand: "#667EEA",
|
|
23
23
|
dimmedText: "#888",
|
|
24
24
|
mutedText: "#999",
|
|
25
25
|
secondaryTextNew: "#666",
|
|
@@ -30,7 +30,7 @@ const lightTheme = {
|
|
|
30
30
|
};
|
|
31
31
|
const lightDaltonizedTheme = {
|
|
32
32
|
bashBorder: "#FF6E57",
|
|
33
|
-
minto: "#
|
|
33
|
+
minto: "#B668C8",
|
|
34
34
|
noting: "#222222",
|
|
35
35
|
permission: "#3366ff",
|
|
36
36
|
secondaryBorder: "#999",
|
|
@@ -59,7 +59,7 @@ const lightDaltonizedTheme = {
|
|
|
59
59
|
};
|
|
60
60
|
const darkTheme = {
|
|
61
61
|
bashBorder: "#FF6E57",
|
|
62
|
-
minto: "#
|
|
62
|
+
minto: "#B668C8",
|
|
63
63
|
noting: "#222222",
|
|
64
64
|
permission: "#b1b9f9",
|
|
65
65
|
secondaryBorder: "#888",
|
|
@@ -77,7 +77,7 @@ const darkTheme = {
|
|
|
77
77
|
addedDimmed: "#47584a",
|
|
78
78
|
removedDimmed: "#69484d"
|
|
79
79
|
},
|
|
80
|
-
brand: "#
|
|
80
|
+
brand: "#667EEA",
|
|
81
81
|
dimmedText: "#666",
|
|
82
82
|
mutedText: "#555",
|
|
83
83
|
secondaryTextNew: "#999",
|
|
@@ -88,7 +88,7 @@ const darkTheme = {
|
|
|
88
88
|
};
|
|
89
89
|
const darkDaltonizedTheme = {
|
|
90
90
|
bashBorder: "#FF6E57",
|
|
91
|
-
minto: "#
|
|
91
|
+
minto: "#B668C8",
|
|
92
92
|
noting: "#222222",
|
|
93
93
|
permission: "#99ccff",
|
|
94
94
|
secondaryBorder: "#888",
|
package/dist/utils/theme.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/theme.ts"],
|
|
4
|
-
"sourcesContent": ["import { getGlobalConfig } from './config'\n\nexport interface Theme {\n bashBorder: string\n minto: string\n noting: string\n permission: string\n secondaryBorder: string\n text: string\n secondaryText: string\n suggestion: string\n success: string\n error: string\n warning: string\n primary: string\n secondary: string\n diff: {\n added: string\n removed: string\n addedDimmed: string\n removedDimmed: string\n }\n // Additional color properties used in components\n brand: string\n dimmedText: string\n mutedText: string\n secondaryTextNew: string\n selectionBg: string\n info: string\n dim: string\n primaryText: string\n}\n\nconst lightTheme: Theme = {\n bashBorder: '#FF6E57',\n minto: '#
|
|
4
|
+
"sourcesContent": ["import { getGlobalConfig } from './config'\n\nexport interface Theme {\n bashBorder: string\n minto: string\n noting: string\n permission: string\n secondaryBorder: string\n text: string\n secondaryText: string\n suggestion: string\n success: string\n error: string\n warning: string\n primary: string\n secondary: string\n diff: {\n added: string\n removed: string\n addedDimmed: string\n removedDimmed: string\n }\n // Additional color properties used in components\n brand: string\n dimmedText: string\n mutedText: string\n secondaryTextNew: string\n selectionBg: string\n info: string\n dim: string\n primaryText: string\n}\n\nconst lightTheme: Theme = {\n bashBorder: '#FF6E57',\n minto: '#B668C8',\n noting: '#222222',\n permission: '#e9c61aff',\n secondaryBorder: '#999',\n text: '#000',\n secondaryText: '#666',\n suggestion: '#32e98aff',\n success: '#2c7a39',\n error: '#ab2b3f',\n warning: '#966c1e',\n primary: '#000',\n secondary: '#666',\n diff: {\n added: '#69db7c',\n removed: '#ffa8b4',\n addedDimmed: '#c7e1cb',\n removedDimmed: '#fdd2d8',\n },\n brand: '#667EEA',\n dimmedText: '#888',\n mutedText: '#999',\n secondaryTextNew: '#666',\n selectionBg: '#3C3C3C',\n info: '#3399ff',\n dim: '#aaa',\n primaryText: '#000',\n}\n\nconst lightDaltonizedTheme: Theme = {\n bashBorder: '#FF6E57',\n minto: '#B668C8',\n noting: '#222222',\n permission: '#3366ff',\n secondaryBorder: '#999',\n text: '#000',\n secondaryText: '#666',\n suggestion: '#3366ff',\n success: '#006699',\n error: '#cc0000',\n warning: '#ff9900',\n primary: '#000',\n secondary: '#666',\n diff: {\n added: '#99ccff',\n removed: '#ffcccc',\n addedDimmed: '#d1e7fd',\n removedDimmed: '#ffe9e9',\n },\n brand: '#3366ff',\n dimmedText: '#888',\n mutedText: '#999',\n secondaryTextNew: '#666',\n selectionBg: '#3C3C3C',\n info: '#3366ff',\n dim: '#aaa',\n primaryText: '#000',\n}\n\nconst darkTheme: Theme = {\n bashBorder: '#FF6E57',\n minto: '#B668C8',\n noting: '#222222',\n permission: '#b1b9f9',\n secondaryBorder: '#888',\n text: '#fff',\n secondaryText: '#999',\n suggestion: '#b1b9f9',\n success: '#4eba65',\n error: '#ff6b80',\n warning: '#ffc107',\n primary: '#fff',\n secondary: '#999',\n diff: {\n added: '#225c2b',\n removed: '#7a2936',\n addedDimmed: '#47584a',\n removedDimmed: '#69484d',\n },\n brand: '#667EEA',\n dimmedText: '#666',\n mutedText: '#555',\n secondaryTextNew: '#999',\n selectionBg: '#3C3C3C',\n info: '#5DADE2',\n dim: '#444',\n primaryText: '#fff',\n}\n\nconst darkDaltonizedTheme: Theme = {\n bashBorder: '#FF6E57',\n minto: '#B668C8',\n noting: '#222222',\n permission: '#99ccff',\n secondaryBorder: '#888',\n text: '#fff',\n secondaryText: '#999',\n suggestion: '#99ccff',\n success: '#3399ff',\n error: '#ff6666',\n warning: '#ffcc00',\n primary: '#fff',\n secondary: '#999',\n diff: {\n added: '#004466',\n removed: '#660000',\n addedDimmed: '#3e515b',\n removedDimmed: '#3e2c2c',\n },\n brand: '#99ccff',\n dimmedText: '#666',\n mutedText: '#555',\n secondaryTextNew: '#999',\n selectionBg: '#3C3C3C',\n info: '#99ccff',\n dim: '#444',\n primaryText: '#fff',\n}\n\nexport type ThemeNames =\n | 'dark'\n | 'light'\n | 'light-daltonized'\n | 'dark-daltonized'\n\nexport function getTheme(overrideTheme?: ThemeNames): Theme {\n const config = getGlobalConfig()\n switch (overrideTheme ?? config.theme) {\n case 'light':\n return lightTheme\n case 'light-daltonized':\n return lightDaltonizedTheme\n case 'dark-daltonized':\n return darkDaltonizedTheme\n default:\n return darkTheme\n }\n}\n"],
|
|
5
5
|
"mappings": "AAAA,SAAS,uBAAuB;AAiChC,MAAM,aAAoB;AAAA,EACxB,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,eAAe;AAAA,EACjB;AAAA,EACA,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,MAAM;AAAA,EACN,KAAK;AAAA,EACL,aAAa;AACf;AAEA,MAAM,uBAA8B;AAAA,EAClC,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,eAAe;AAAA,EACjB;AAAA,EACA,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,MAAM;AAAA,EACN,KAAK;AAAA,EACL,aAAa;AACf;AAEA,MAAM,YAAmB;AAAA,EACvB,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,eAAe;AAAA,EACjB;AAAA,EACA,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,MAAM;AAAA,EACN,KAAK;AAAA,EACL,aAAa;AACf;AAEA,MAAM,sBAA6B;AAAA,EACjC,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,eAAe;AAAA,EACjB;AAAA,EACA,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,MAAM;AAAA,EACN,KAAK;AAAA,EACL,aAAa;AACf;AAQO,SAAS,SAAS,eAAmC;AAC1D,QAAM,SAAS,gBAAgB;AAC/B,UAAQ,iBAAiB,OAAO,OAAO;AAAA,IACrC,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
import { setSessionState, getSessionState } from "./sessionState.js";
|
|
2
2
|
import { readAgentData, writeAgentData, resolveAgentId } from "./agentStorage.js";
|
|
3
|
+
import {
|
|
4
|
+
existsSync,
|
|
5
|
+
readFileSync,
|
|
6
|
+
writeFileSync,
|
|
7
|
+
mkdirSync,
|
|
8
|
+
unlinkSync
|
|
9
|
+
} from "fs";
|
|
10
|
+
import { join } from "path";
|
|
11
|
+
import envPaths from "env-paths";
|
|
12
|
+
import { PRODUCT_COMMAND } from "../constants/product.js";
|
|
3
13
|
const TODO_STORAGE_KEY = "todos";
|
|
4
14
|
const TODO_CONFIG_KEY = "todoConfig";
|
|
5
|
-
const TODO_CACHE_KEY = "todoCache";
|
|
6
15
|
const DEFAULT_CONFIG = {
|
|
7
16
|
maxTodos: 100,
|
|
8
17
|
autoArchiveCompleted: false,
|
|
@@ -13,6 +22,70 @@ const DEFAULT_CONFIG = {
|
|
|
13
22
|
let todoCache = null;
|
|
14
23
|
let cacheTimestamp = 0;
|
|
15
24
|
const CACHE_TTL = 5e3;
|
|
25
|
+
let currentSessionId = null;
|
|
26
|
+
const paths = envPaths(PRODUCT_COMMAND);
|
|
27
|
+
function getProjectDir(cwd) {
|
|
28
|
+
return cwd.replace(/[^a-zA-Z0-9]/g, "-");
|
|
29
|
+
}
|
|
30
|
+
function getSessionTodoPath(sessionId) {
|
|
31
|
+
const projectDir = getProjectDir(process.cwd());
|
|
32
|
+
const todosDir = join(paths.cache, projectDir, "todos");
|
|
33
|
+
return join(todosDir, `${sessionId}.json`);
|
|
34
|
+
}
|
|
35
|
+
function initTodoSession(sessionId) {
|
|
36
|
+
currentSessionId = sessionId;
|
|
37
|
+
invalidateCache();
|
|
38
|
+
}
|
|
39
|
+
function getCurrentTodoSessionId() {
|
|
40
|
+
return currentSessionId;
|
|
41
|
+
}
|
|
42
|
+
function readSessionTodos(sessionId) {
|
|
43
|
+
const filePath = getSessionTodoPath(sessionId);
|
|
44
|
+
if (!existsSync(filePath)) {
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const content = readFileSync(filePath, "utf-8");
|
|
49
|
+
return JSON.parse(content);
|
|
50
|
+
} catch {
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function writeSessionTodos(sessionId, todos) {
|
|
55
|
+
const filePath = getSessionTodoPath(sessionId);
|
|
56
|
+
const todosDir = join(paths.cache, getProjectDir(process.cwd()), "todos");
|
|
57
|
+
try {
|
|
58
|
+
if (!existsSync(todosDir)) {
|
|
59
|
+
mkdirSync(todosDir, { recursive: true });
|
|
60
|
+
}
|
|
61
|
+
if (todos.length === 0) {
|
|
62
|
+
if (existsSync(filePath)) {
|
|
63
|
+
unlinkSync(filePath);
|
|
64
|
+
}
|
|
65
|
+
} else {
|
|
66
|
+
writeFileSync(filePath, JSON.stringify(todos, null, 2), "utf-8");
|
|
67
|
+
}
|
|
68
|
+
} catch (error) {
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function deleteSessionTodos(sessionId) {
|
|
72
|
+
const targetSessionId = sessionId || currentSessionId;
|
|
73
|
+
if (!targetSessionId) return;
|
|
74
|
+
const filePath = getSessionTodoPath(targetSessionId);
|
|
75
|
+
try {
|
|
76
|
+
if (existsSync(filePath)) {
|
|
77
|
+
unlinkSync(filePath);
|
|
78
|
+
}
|
|
79
|
+
} catch {
|
|
80
|
+
}
|
|
81
|
+
if (!sessionId || sessionId === currentSessionId) {
|
|
82
|
+
invalidateCache();
|
|
83
|
+
setSessionState({
|
|
84
|
+
...getSessionState(),
|
|
85
|
+
[TODO_STORAGE_KEY]: []
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
16
89
|
function invalidateCache() {
|
|
17
90
|
todoCache = null;
|
|
18
91
|
cacheTimestamp = 0;
|
|
@@ -52,7 +125,6 @@ function getTodos(agentId) {
|
|
|
52
125
|
if (agentId) {
|
|
53
126
|
updateMetrics("getTodos", false);
|
|
54
127
|
const agentTodos = readAgentData(resolvedAgentId) || [];
|
|
55
|
-
const agentCacheKey = `todoCache_${resolvedAgentId}`;
|
|
56
128
|
return agentTodos;
|
|
57
129
|
}
|
|
58
130
|
if (todoCache && now - cacheTimestamp < CACHE_TTL) {
|
|
@@ -60,6 +132,18 @@ function getTodos(agentId) {
|
|
|
60
132
|
return todoCache;
|
|
61
133
|
}
|
|
62
134
|
updateMetrics("getTodos", false);
|
|
135
|
+
if (currentSessionId) {
|
|
136
|
+
const sessionTodos = readSessionTodos(currentSessionId);
|
|
137
|
+
if (sessionTodos.length > 0) {
|
|
138
|
+
todoCache = [...sessionTodos];
|
|
139
|
+
cacheTimestamp = now;
|
|
140
|
+
setSessionState({
|
|
141
|
+
...getSessionState(),
|
|
142
|
+
[TODO_STORAGE_KEY]: sessionTodos
|
|
143
|
+
});
|
|
144
|
+
return sessionTodos;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
63
147
|
const sessionState = getSessionState();
|
|
64
148
|
const todos = sessionState[TODO_STORAGE_KEY] || [];
|
|
65
149
|
todoCache = [...todos];
|
|
@@ -139,6 +223,9 @@ function setTodos(todos, agentId) {
|
|
|
139
223
|
...getSessionState(),
|
|
140
224
|
[TODO_STORAGE_KEY]: updatedTodos
|
|
141
225
|
});
|
|
226
|
+
if (currentSessionId) {
|
|
227
|
+
writeSessionTodos(currentSessionId, updatedTodos);
|
|
228
|
+
}
|
|
142
229
|
invalidateCache();
|
|
143
230
|
updateMetrics("setTodos");
|
|
144
231
|
}
|
|
@@ -274,7 +361,9 @@ function optimizeTodoStorage() {
|
|
|
274
361
|
export {
|
|
275
362
|
addTodo,
|
|
276
363
|
clearTodos,
|
|
364
|
+
deleteSessionTodos,
|
|
277
365
|
deleteTodo,
|
|
366
|
+
getCurrentTodoSessionId,
|
|
278
367
|
getTodoById,
|
|
279
368
|
getTodoConfig,
|
|
280
369
|
getTodoMetrics,
|
|
@@ -282,6 +371,7 @@ export {
|
|
|
282
371
|
getTodos,
|
|
283
372
|
getTodosByPriority,
|
|
284
373
|
getTodosByStatus,
|
|
374
|
+
initTodoSession,
|
|
285
375
|
optimizeTodoStorage,
|
|
286
376
|
queryTodos,
|
|
287
377
|
setTodoConfig,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/todoStorage.ts"],
|
|
4
|
-
"sourcesContent": ["import { setSessionState, getSessionState } from './sessionState'\nimport { readAgentData, writeAgentData, resolveAgentId } from './agentStorage'\n\nexport interface TodoItem {\n id: string\n content: string\n activeForm?: string // Optional - will be auto-generated if not provided\n status: 'pending' | 'in_progress' | 'completed'\n priority: 'high' | 'medium' | 'low'\n createdAt?: number\n updatedAt?: number\n tags?: string[]\n estimatedHours?: number\n previousStatus?: 'pending' | 'in_progress' | 'completed'\n}\n\nexport interface TodoQuery {\n status?: TodoItem['status'][]\n priority?: TodoItem['priority'][]\n contentMatch?: string\n tags?: string[]\n dateRange?: { from?: Date; to?: Date }\n}\n\nexport interface TodoStorageConfig {\n maxTodos: number\n autoArchiveCompleted: boolean\n sortBy: 'createdAt' | 'updatedAt' | 'priority' | 'status'\n sortOrder: 'asc' | 'desc'\n}\n\nconst TODO_STORAGE_KEY = 'todos'\nconst TODO_CONFIG_KEY = 'todoConfig'\nconst TODO_CACHE_KEY = 'todoCache'\n\n// Default configuration\nconst DEFAULT_CONFIG: TodoStorageConfig = {\n maxTodos: 100,\n autoArchiveCompleted: false,\n sortBy: 'status', // Using smart sorting now\n sortOrder: 'desc',\n}\n\n// In-memory cache for performance\nlet todoCache: TodoItem[] | null = null\nlet cacheTimestamp = 0\nconst CACHE_TTL = 5000 // 5 seconds cache\n\n// Performance metrics\nexport interface TodoMetrics {\n totalOperations: number\n cacheHits: number\n cacheMisses: number\n lastOperation: number\n}\n\nfunction invalidateCache(): void {\n todoCache = null\n cacheTimestamp = 0\n}\n\nfunction updateMetrics(operation: string, cacheHit: boolean = false): void {\n const sessionState = getSessionState() as any\n const metrics = sessionState.todoMetrics || {\n totalOperations: 0,\n cacheHits: 0,\n cacheMisses: 0,\n lastOperation: 0,\n }\n\n metrics.totalOperations++\n metrics.lastOperation = Date.now()\n\n if (cacheHit) {\n metrics.cacheHits++\n } else {\n metrics.cacheMisses++\n }\n\n setSessionState({\n ...sessionState,\n todoMetrics: metrics,\n })\n}\n\nexport function getTodoMetrics(): TodoMetrics {\n const sessionState = getSessionState() as any\n return (\n sessionState.todoMetrics || {\n totalOperations: 0,\n cacheHits: 0,\n cacheMisses: 0,\n lastOperation: 0,\n }\n )\n}\n\nexport function getTodos(agentId?: string): TodoItem[] {\n const resolvedAgentId = resolveAgentId(agentId)\n const now = Date.now()\n\n // For agent-scoped storage, use file-based storage instead of session state\n if (agentId) {\n updateMetrics('getTodos', false)\n const agentTodos = readAgentData<TodoItem[]>(resolvedAgentId) || []\n\n // Update cache with agent-specific cache key\n const agentCacheKey = `todoCache_${resolvedAgentId}`\n // Note: In production, we'd want agent-specific caching\n\n return agentTodos\n }\n\n // Original session-based storage for backward compatibility\n // Check cache first\n if (todoCache && now - cacheTimestamp < CACHE_TTL) {\n updateMetrics('getTodos', true)\n return todoCache\n }\n\n updateMetrics('getTodos', false)\n const sessionState = getSessionState()\n const todos = (sessionState as any)[TODO_STORAGE_KEY] || []\n\n // Update cache\n todoCache = [...todos]\n cacheTimestamp = now\n\n return todos\n}\n\nexport function setTodos(todos: TodoItem[], agentId?: string): void {\n const resolvedAgentId = resolveAgentId(agentId)\n const config = getTodoConfig()\n const existingTodos = getTodos(agentId)\n\n // For agent-scoped storage, use file-based storage\n if (agentId) {\n // Validate todo limit\n if (todos.length > config.maxTodos) {\n throw new Error(\n `Todo limit exceeded. Maximum ${config.maxTodos} todos allowed.`,\n )\n }\n\n // Auto-archive completed todos if enabled\n let processedTodos = todos\n if (config.autoArchiveCompleted) {\n processedTodos = todos.filter(todo => todo.status !== 'completed')\n }\n\n const updatedTodos = processedTodos.map(todo => {\n // Find existing todo to track status changes\n const existingTodo = existingTodos.find(\n existing => existing.id === todo.id,\n )\n\n return {\n ...todo,\n updatedAt: Date.now(),\n createdAt: todo.createdAt || Date.now(),\n previousStatus:\n existingTodo?.status !== todo.status\n ? existingTodo?.status\n : todo.previousStatus,\n }\n })\n\n // Smart sorting for agent todos\n updatedTodos.sort((a, b) => {\n // 1. Status priority: in_progress > pending > completed\n const statusOrder = { in_progress: 3, pending: 2, completed: 1 }\n const statusDiff = statusOrder[b.status] - statusOrder[a.status]\n if (statusDiff !== 0) return statusDiff\n\n // 2. For same status, sort by priority: high > medium > low\n const priorityOrder = { high: 3, medium: 2, low: 1 }\n const priorityDiff = priorityOrder[b.priority] - priorityOrder[a.priority]\n if (priorityDiff !== 0) return priorityDiff\n\n // 3. For same status and priority, sort by updatedAt (newest first)\n const aTime = a.updatedAt || 0\n const bTime = b.updatedAt || 0\n return bTime - aTime\n })\n\n // Write to agent-specific storage\n writeAgentData(resolvedAgentId, updatedTodos)\n updateMetrics('setTodos')\n return\n }\n\n // Original session-based logic for backward compatibility\n // Validate todo limit\n if (todos.length > config.maxTodos) {\n throw new Error(\n `Todo limit exceeded. Maximum ${config.maxTodos} todos allowed.`,\n )\n }\n\n // Auto-archive completed todos if enabled\n let processedTodos = todos\n if (config.autoArchiveCompleted) {\n processedTodos = todos.filter(todo => todo.status !== 'completed')\n }\n\n const updatedTodos = processedTodos.map(todo => {\n // Find existing todo to track status changes\n const existingTodo = existingTodos.find(existing => existing.id === todo.id)\n\n return {\n ...todo,\n updatedAt: Date.now(),\n createdAt: todo.createdAt || Date.now(),\n previousStatus:\n existingTodo?.status !== todo.status\n ? existingTodo?.status\n : todo.previousStatus,\n }\n })\n\n // Smart sorting: status -> priority -> updatedAt\n updatedTodos.sort((a, b) => {\n // 1. Status priority: in_progress > pending > completed\n const statusOrder = { in_progress: 3, pending: 2, completed: 1 }\n const statusDiff = statusOrder[b.status] - statusOrder[a.status]\n if (statusDiff !== 0) return statusDiff\n\n // 2. For same status, sort by priority: high > medium > low\n const priorityOrder = { high: 3, medium: 2, low: 1 }\n const priorityDiff = priorityOrder[b.priority] - priorityOrder[a.priority]\n if (priorityDiff !== 0) return priorityDiff\n\n // 3. For same status and priority, sort by updatedAt (newest first)\n const aTime = a.updatedAt || 0\n const bTime = b.updatedAt || 0\n return bTime - aTime\n })\n\n setSessionState({\n ...getSessionState(),\n [TODO_STORAGE_KEY]: updatedTodos,\n } as any)\n\n // Invalidate cache\n invalidateCache()\n updateMetrics('setTodos')\n}\n\nexport function getTodoConfig(): TodoStorageConfig {\n const sessionState = getSessionState() as any\n return { ...DEFAULT_CONFIG, ...(sessionState[TODO_CONFIG_KEY] || {}) }\n}\n\nexport function setTodoConfig(config: Partial<TodoStorageConfig>): void {\n const currentConfig = getTodoConfig()\n const newConfig = { ...currentConfig, ...config }\n\n setSessionState({\n ...getSessionState(),\n [TODO_CONFIG_KEY]: newConfig,\n } as any)\n\n // Re-sort existing todos if sort order changed\n if (config.sortBy || config.sortOrder) {\n const todos = getTodos()\n setTodos(todos) // This will re-sort according to new config\n }\n}\n\nexport function addTodo(\n todo: Omit<TodoItem, 'createdAt' | 'updatedAt'>,\n): TodoItem[] {\n const todos = getTodos()\n\n // Check for duplicate IDs\n if (todos.some(existing => existing.id === todo.id)) {\n throw new Error(`Todo with ID '${todo.id}' already exists`)\n }\n\n const newTodo: TodoItem = {\n ...todo,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n }\n\n const updatedTodos = [...todos, newTodo]\n setTodos(updatedTodos)\n updateMetrics('addTodo')\n return updatedTodos\n}\n\nexport function updateTodo(id: string, updates: Partial<TodoItem>): TodoItem[] {\n const todos = getTodos()\n const existingTodo = todos.find(todo => todo.id === id)\n\n if (!existingTodo) {\n throw new Error(`Todo with ID '${id}' not found`)\n }\n\n const updatedTodos = todos.map(todo =>\n todo.id === id ? { ...todo, ...updates, updatedAt: Date.now() } : todo,\n )\n\n setTodos(updatedTodos)\n updateMetrics('updateTodo')\n return updatedTodos\n}\n\nexport function deleteTodo(id: string): TodoItem[] {\n const todos = getTodos()\n const todoExists = todos.some(todo => todo.id === id)\n\n if (!todoExists) {\n throw new Error(`Todo with ID '${id}' not found`)\n }\n\n const updatedTodos = todos.filter(todo => todo.id !== id)\n setTodos(updatedTodos)\n updateMetrics('deleteTodo')\n return updatedTodos\n}\n\nexport function clearTodos(): void {\n setTodos([])\n updateMetrics('clearTodos')\n}\n\nexport function getTodoById(id: string): TodoItem | undefined {\n const todos = getTodos()\n updateMetrics('getTodoById')\n return todos.find(todo => todo.id === id)\n}\n\nexport function getTodosByStatus(status: TodoItem['status']): TodoItem[] {\n const todos = getTodos()\n updateMetrics('getTodosByStatus')\n return todos.filter(todo => todo.status === status)\n}\n\nexport function getTodosByPriority(priority: TodoItem['priority']): TodoItem[] {\n const todos = getTodos()\n updateMetrics('getTodosByPriority')\n return todos.filter(todo => todo.priority === priority)\n}\n\n// Advanced query function\nexport function queryTodos(query: TodoQuery): TodoItem[] {\n const todos = getTodos()\n updateMetrics('queryTodos')\n\n return todos.filter(todo => {\n // Status filter\n if (query.status && !query.status.includes(todo.status)) {\n return false\n }\n\n // Priority filter\n if (query.priority && !query.priority.includes(todo.priority)) {\n return false\n }\n\n // Content search\n if (\n query.contentMatch &&\n !todo.content.toLowerCase().includes(query.contentMatch.toLowerCase())\n ) {\n return false\n }\n\n // Tags filter\n if (query.tags && todo.tags) {\n const hasMatchingTag = query.tags.some(tag => todo.tags!.includes(tag))\n if (!hasMatchingTag) return false\n }\n\n // Date range filter\n if (query.dateRange) {\n const todoDate = new Date(todo.createdAt || 0)\n if (query.dateRange.from && todoDate < query.dateRange.from) return false\n if (query.dateRange.to && todoDate > query.dateRange.to) return false\n }\n\n return true\n })\n}\n\n// Utility functions\nexport function getTodoStatistics() {\n const todos = getTodos()\n const metrics = getTodoMetrics()\n\n return {\n total: todos.length,\n byStatus: {\n pending: todos.filter(t => t.status === 'pending').length,\n in_progress: todos.filter(t => t.status === 'in_progress').length,\n completed: todos.filter(t => t.status === 'completed').length,\n },\n byPriority: {\n high: todos.filter(t => t.priority === 'high').length,\n medium: todos.filter(t => t.priority === 'medium').length,\n low: todos.filter(t => t.priority === 'low').length,\n },\n metrics,\n cacheEfficiency:\n metrics.totalOperations > 0\n ? Math.round((metrics.cacheHits / metrics.totalOperations) * 100)\n : 0,\n }\n}\n\nexport function optimizeTodoStorage(): void {\n // Force cache refresh\n invalidateCache()\n\n // Compact storage by removing any invalid entries\n const todos = getTodos()\n const validTodos = todos.filter(\n todo =>\n todo.id &&\n todo.content &&\n ['pending', 'in_progress', 'completed'].includes(todo.status) &&\n ['high', 'medium', 'low'].includes(todo.priority),\n )\n\n if (validTodos.length !== todos.length) {\n setTodos(validTodos)\n }\n\n updateMetrics('optimizeTodoStorage')\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,iBAAiB,uBAAuB;AACjD,SAAS,eAAe,gBAAgB,sBAAsB;
|
|
4
|
+
"sourcesContent": ["import { setSessionState, getSessionState } from './sessionState'\nimport { readAgentData, writeAgentData, resolveAgentId } from './agentStorage'\nimport {\n existsSync,\n readFileSync,\n writeFileSync,\n mkdirSync,\n unlinkSync,\n} from 'fs'\nimport { join } from 'path'\nimport envPaths from 'env-paths'\nimport { PRODUCT_COMMAND } from '@constants/product'\n\nexport interface TodoItem {\n id: string\n content: string\n activeForm?: string // Optional - will be auto-generated if not provided\n status: 'pending' | 'in_progress' | 'completed'\n priority: 'high' | 'medium' | 'low'\n createdAt?: number\n updatedAt?: number\n tags?: string[]\n estimatedHours?: number\n previousStatus?: 'pending' | 'in_progress' | 'completed'\n}\n\nexport interface TodoQuery {\n status?: TodoItem['status'][]\n priority?: TodoItem['priority'][]\n contentMatch?: string\n tags?: string[]\n dateRange?: { from?: Date; to?: Date }\n}\n\nexport interface TodoStorageConfig {\n maxTodos: number\n autoArchiveCompleted: boolean\n sortBy: 'createdAt' | 'updatedAt' | 'priority' | 'status'\n sortOrder: 'asc' | 'desc'\n}\n\nconst TODO_STORAGE_KEY = 'todos'\nconst TODO_CONFIG_KEY = 'todoConfig'\n\n// Default configuration\nconst DEFAULT_CONFIG: TodoStorageConfig = {\n maxTodos: 100,\n autoArchiveCompleted: false,\n sortBy: 'status', // Using smart sorting now\n sortOrder: 'desc',\n}\n\n// In-memory cache for performance\nlet todoCache: TodoItem[] | null = null\nlet cacheTimestamp = 0\nconst CACHE_TTL = 5000 // 5 seconds cache\n\n// Current session ID - set by initTodoSession()\nlet currentSessionId: string | null = null\n\nconst paths = envPaths(PRODUCT_COMMAND)\n\n/**\n * Get project directory hash for organizing todos by project\n */\nfunction getProjectDir(cwd: string): string {\n return cwd.replace(/[^a-zA-Z0-9]/g, '-')\n}\n\n/**\n * Get session-scoped todo file path\n * Todos are now stored per-session to avoid conflicts between multiple conversations\n */\nfunction getSessionTodoPath(sessionId: string): string {\n const projectDir = getProjectDir(process.cwd())\n const todosDir = join(paths.cache, projectDir, 'todos')\n return join(todosDir, `${sessionId}.json`)\n}\n\n/**\n * Initialize todo session with a specific session ID\n * Must be called when starting a new REPL session\n */\nexport function initTodoSession(sessionId: string): void {\n currentSessionId = sessionId\n // Invalidate cache when session changes\n invalidateCache()\n}\n\n/**\n * Get current session ID\n */\nexport function getCurrentTodoSessionId(): string | null {\n return currentSessionId\n}\n\n/**\n * Read todos from session-scoped file\n */\nfunction readSessionTodos(sessionId: string): TodoItem[] {\n const filePath = getSessionTodoPath(sessionId)\n if (!existsSync(filePath)) {\n return []\n }\n try {\n const content = readFileSync(filePath, 'utf-8')\n return JSON.parse(content) as TodoItem[]\n } catch {\n return []\n }\n}\n\n/**\n * Write todos to session-scoped file\n */\nfunction writeSessionTodos(sessionId: string, todos: TodoItem[]): void {\n const filePath = getSessionTodoPath(sessionId)\n const todosDir = join(paths.cache, getProjectDir(process.cwd()), 'todos')\n\n try {\n // Ensure directory exists\n if (!existsSync(todosDir)) {\n mkdirSync(todosDir, { recursive: true })\n }\n\n if (todos.length === 0) {\n // Remove file if no todos (cleanup)\n if (existsSync(filePath)) {\n unlinkSync(filePath)\n }\n } else {\n writeFileSync(filePath, JSON.stringify(todos, null, 2), 'utf-8')\n }\n } catch (error) {\n // Silently fail if we can't write (e.g., no permissions)\n // console.error('Failed to persist todos:', error)\n }\n}\n\n/**\n * Delete session todo file (used when clearing conversation)\n */\nexport function deleteSessionTodos(sessionId?: string): void {\n const targetSessionId = sessionId || currentSessionId\n if (!targetSessionId) return\n\n const filePath = getSessionTodoPath(targetSessionId)\n try {\n if (existsSync(filePath)) {\n unlinkSync(filePath)\n }\n } catch {\n // Silently fail\n }\n\n // Also clear in-memory state\n if (!sessionId || sessionId === currentSessionId) {\n invalidateCache()\n setSessionState({\n ...getSessionState(),\n [TODO_STORAGE_KEY]: [],\n } as any)\n }\n}\n\n// Performance metrics\nexport interface TodoMetrics {\n totalOperations: number\n cacheHits: number\n cacheMisses: number\n lastOperation: number\n}\n\nfunction invalidateCache(): void {\n todoCache = null\n cacheTimestamp = 0\n}\n\nfunction updateMetrics(operation: string, cacheHit: boolean = false): void {\n const sessionState = getSessionState() as any\n const metrics = sessionState.todoMetrics || {\n totalOperations: 0,\n cacheHits: 0,\n cacheMisses: 0,\n lastOperation: 0,\n }\n\n metrics.totalOperations++\n metrics.lastOperation = Date.now()\n\n if (cacheHit) {\n metrics.cacheHits++\n } else {\n metrics.cacheMisses++\n }\n\n setSessionState({\n ...sessionState,\n todoMetrics: metrics,\n })\n}\n\nexport function getTodoMetrics(): TodoMetrics {\n const sessionState = getSessionState() as any\n return (\n sessionState.todoMetrics || {\n totalOperations: 0,\n cacheHits: 0,\n cacheMisses: 0,\n lastOperation: 0,\n }\n )\n}\n\nexport function getTodos(agentId?: string): TodoItem[] {\n const resolvedAgentId = resolveAgentId(agentId)\n const now = Date.now()\n\n // For agent-scoped storage, use file-based storage instead of session state\n if (agentId) {\n updateMetrics('getTodos', false)\n const agentTodos = readAgentData<TodoItem[]>(resolvedAgentId) || []\n return agentTodos\n }\n\n // Check cache first for performance\n if (todoCache && now - cacheTimestamp < CACHE_TTL) {\n updateMetrics('getTodos', true)\n return todoCache\n }\n\n updateMetrics('getTodos', false)\n\n // Try to read from session-scoped file first (persisted todos)\n if (currentSessionId) {\n const sessionTodos = readSessionTodos(currentSessionId)\n if (sessionTodos.length > 0) {\n // Update cache\n todoCache = [...sessionTodos]\n cacheTimestamp = now\n // Also sync to session state\n setSessionState({\n ...getSessionState(),\n [TODO_STORAGE_KEY]: sessionTodos,\n } as any)\n return sessionTodos\n }\n }\n\n // Fall back to session state (in-memory)\n const sessionState = getSessionState()\n const todos = (sessionState as any)[TODO_STORAGE_KEY] || []\n\n // Update cache\n todoCache = [...todos]\n cacheTimestamp = now\n\n return todos\n}\n\nexport function setTodos(todos: TodoItem[], agentId?: string): void {\n const resolvedAgentId = resolveAgentId(agentId)\n const config = getTodoConfig()\n const existingTodos = getTodos(agentId)\n\n // For agent-scoped storage, use file-based storage\n if (agentId) {\n // Validate todo limit\n if (todos.length > config.maxTodos) {\n throw new Error(\n `Todo limit exceeded. Maximum ${config.maxTodos} todos allowed.`,\n )\n }\n\n // Auto-archive completed todos if enabled\n let processedTodos = todos\n if (config.autoArchiveCompleted) {\n processedTodos = todos.filter(todo => todo.status !== 'completed')\n }\n\n const updatedTodos = processedTodos.map(todo => {\n // Find existing todo to track status changes\n const existingTodo = existingTodos.find(\n existing => existing.id === todo.id,\n )\n\n return {\n ...todo,\n updatedAt: Date.now(),\n createdAt: todo.createdAt || Date.now(),\n previousStatus:\n existingTodo?.status !== todo.status\n ? existingTodo?.status\n : todo.previousStatus,\n }\n })\n\n // Smart sorting for agent todos\n updatedTodos.sort((a, b) => {\n // 1. Status priority: in_progress > pending > completed\n const statusOrder = { in_progress: 3, pending: 2, completed: 1 }\n const statusDiff = statusOrder[b.status] - statusOrder[a.status]\n if (statusDiff !== 0) return statusDiff\n\n // 2. For same status, sort by priority: high > medium > low\n const priorityOrder = { high: 3, medium: 2, low: 1 }\n const priorityDiff = priorityOrder[b.priority] - priorityOrder[a.priority]\n if (priorityDiff !== 0) return priorityDiff\n\n // 3. For same status and priority, sort by updatedAt (newest first)\n const aTime = a.updatedAt || 0\n const bTime = b.updatedAt || 0\n return bTime - aTime\n })\n\n // Write to agent-specific storage\n writeAgentData(resolvedAgentId, updatedTodos)\n updateMetrics('setTodos')\n return\n }\n\n // Original session-based logic for backward compatibility\n // Validate todo limit\n if (todos.length > config.maxTodos) {\n throw new Error(\n `Todo limit exceeded. Maximum ${config.maxTodos} todos allowed.`,\n )\n }\n\n // Auto-archive completed todos if enabled\n let processedTodos = todos\n if (config.autoArchiveCompleted) {\n processedTodos = todos.filter(todo => todo.status !== 'completed')\n }\n\n const updatedTodos = processedTodos.map(todo => {\n // Find existing todo to track status changes\n const existingTodo = existingTodos.find(existing => existing.id === todo.id)\n\n return {\n ...todo,\n updatedAt: Date.now(),\n createdAt: todo.createdAt || Date.now(),\n previousStatus:\n existingTodo?.status !== todo.status\n ? existingTodo?.status\n : todo.previousStatus,\n }\n })\n\n // Smart sorting: status -> priority -> updatedAt\n updatedTodos.sort((a, b) => {\n // 1. Status priority: in_progress > pending > completed\n const statusOrder = { in_progress: 3, pending: 2, completed: 1 }\n const statusDiff = statusOrder[b.status] - statusOrder[a.status]\n if (statusDiff !== 0) return statusDiff\n\n // 2. For same status, sort by priority: high > medium > low\n const priorityOrder = { high: 3, medium: 2, low: 1 }\n const priorityDiff = priorityOrder[b.priority] - priorityOrder[a.priority]\n if (priorityDiff !== 0) return priorityDiff\n\n // 3. For same status and priority, sort by updatedAt (newest first)\n const aTime = a.updatedAt || 0\n const bTime = b.updatedAt || 0\n return bTime - aTime\n })\n\n setSessionState({\n ...getSessionState(),\n [TODO_STORAGE_KEY]: updatedTodos,\n } as any)\n\n // Persist to session-scoped file for persistence within this conversation\n if (currentSessionId) {\n writeSessionTodos(currentSessionId, updatedTodos)\n }\n\n // Invalidate cache\n invalidateCache()\n updateMetrics('setTodos')\n}\n\nexport function getTodoConfig(): TodoStorageConfig {\n const sessionState = getSessionState() as any\n return { ...DEFAULT_CONFIG, ...(sessionState[TODO_CONFIG_KEY] || {}) }\n}\n\nexport function setTodoConfig(config: Partial<TodoStorageConfig>): void {\n const currentConfig = getTodoConfig()\n const newConfig = { ...currentConfig, ...config }\n\n setSessionState({\n ...getSessionState(),\n [TODO_CONFIG_KEY]: newConfig,\n } as any)\n\n // Re-sort existing todos if sort order changed\n if (config.sortBy || config.sortOrder) {\n const todos = getTodos()\n setTodos(todos) // This will re-sort according to new config\n }\n}\n\nexport function addTodo(\n todo: Omit<TodoItem, 'createdAt' | 'updatedAt'>,\n): TodoItem[] {\n const todos = getTodos()\n\n // Check for duplicate IDs\n if (todos.some(existing => existing.id === todo.id)) {\n throw new Error(`Todo with ID '${todo.id}' already exists`)\n }\n\n const newTodo: TodoItem = {\n ...todo,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n }\n\n const updatedTodos = [...todos, newTodo]\n setTodos(updatedTodos)\n updateMetrics('addTodo')\n return updatedTodos\n}\n\nexport function updateTodo(id: string, updates: Partial<TodoItem>): TodoItem[] {\n const todos = getTodos()\n const existingTodo = todos.find(todo => todo.id === id)\n\n if (!existingTodo) {\n throw new Error(`Todo with ID '${id}' not found`)\n }\n\n const updatedTodos = todos.map(todo =>\n todo.id === id ? { ...todo, ...updates, updatedAt: Date.now() } : todo,\n )\n\n setTodos(updatedTodos)\n updateMetrics('updateTodo')\n return updatedTodos\n}\n\nexport function deleteTodo(id: string): TodoItem[] {\n const todos = getTodos()\n const todoExists = todos.some(todo => todo.id === id)\n\n if (!todoExists) {\n throw new Error(`Todo with ID '${id}' not found`)\n }\n\n const updatedTodos = todos.filter(todo => todo.id !== id)\n setTodos(updatedTodos)\n updateMetrics('deleteTodo')\n return updatedTodos\n}\n\nexport function clearTodos(): void {\n setTodos([])\n updateMetrics('clearTodos')\n}\n\nexport function getTodoById(id: string): TodoItem | undefined {\n const todos = getTodos()\n updateMetrics('getTodoById')\n return todos.find(todo => todo.id === id)\n}\n\nexport function getTodosByStatus(status: TodoItem['status']): TodoItem[] {\n const todos = getTodos()\n updateMetrics('getTodosByStatus')\n return todos.filter(todo => todo.status === status)\n}\n\nexport function getTodosByPriority(priority: TodoItem['priority']): TodoItem[] {\n const todos = getTodos()\n updateMetrics('getTodosByPriority')\n return todos.filter(todo => todo.priority === priority)\n}\n\n// Advanced query function\nexport function queryTodos(query: TodoQuery): TodoItem[] {\n const todos = getTodos()\n updateMetrics('queryTodos')\n\n return todos.filter(todo => {\n // Status filter\n if (query.status && !query.status.includes(todo.status)) {\n return false\n }\n\n // Priority filter\n if (query.priority && !query.priority.includes(todo.priority)) {\n return false\n }\n\n // Content search\n if (\n query.contentMatch &&\n !todo.content.toLowerCase().includes(query.contentMatch.toLowerCase())\n ) {\n return false\n }\n\n // Tags filter\n if (query.tags && todo.tags) {\n const hasMatchingTag = query.tags.some(tag => todo.tags!.includes(tag))\n if (!hasMatchingTag) return false\n }\n\n // Date range filter\n if (query.dateRange) {\n const todoDate = new Date(todo.createdAt || 0)\n if (query.dateRange.from && todoDate < query.dateRange.from) return false\n if (query.dateRange.to && todoDate > query.dateRange.to) return false\n }\n\n return true\n })\n}\n\n// Utility functions\nexport function getTodoStatistics() {\n const todos = getTodos()\n const metrics = getTodoMetrics()\n\n return {\n total: todos.length,\n byStatus: {\n pending: todos.filter(t => t.status === 'pending').length,\n in_progress: todos.filter(t => t.status === 'in_progress').length,\n completed: todos.filter(t => t.status === 'completed').length,\n },\n byPriority: {\n high: todos.filter(t => t.priority === 'high').length,\n medium: todos.filter(t => t.priority === 'medium').length,\n low: todos.filter(t => t.priority === 'low').length,\n },\n metrics,\n cacheEfficiency:\n metrics.totalOperations > 0\n ? Math.round((metrics.cacheHits / metrics.totalOperations) * 100)\n : 0,\n }\n}\n\nexport function optimizeTodoStorage(): void {\n // Force cache refresh\n invalidateCache()\n\n // Compact storage by removing any invalid entries\n const todos = getTodos()\n const validTodos = todos.filter(\n todo =>\n todo.id &&\n todo.content &&\n ['pending', 'in_progress', 'completed'].includes(todo.status) &&\n ['high', 'medium', 'low'].includes(todo.priority),\n )\n\n if (validTodos.length !== todos.length) {\n setTodos(validTodos)\n }\n\n updateMetrics('optimizeTodoStorage')\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["processedTodos", "updatedTodos"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
const TOOL_RISK_LEVELS = {
|
|
2
|
+
// 🟢 Safe layer: Read-only, no side effects
|
|
3
|
+
Read: "safe",
|
|
4
|
+
Glob: "safe",
|
|
5
|
+
Grep: "safe",
|
|
6
|
+
LS: "safe",
|
|
7
|
+
WebSearch: "safe",
|
|
8
|
+
WebFetch: "safe",
|
|
9
|
+
Think: "safe",
|
|
10
|
+
AskUserQuestion: "safe",
|
|
11
|
+
MemoryRead: "safe",
|
|
12
|
+
NotebookRead: "safe",
|
|
13
|
+
TaskOutput: "safe",
|
|
14
|
+
EnterPlanMode: "safe",
|
|
15
|
+
ExitPlanMode: "safe",
|
|
16
|
+
TaskList: "safe",
|
|
17
|
+
TaskGet: "safe",
|
|
18
|
+
Skill: "safe",
|
|
19
|
+
// 🟡 Monitored layer: Has side effects but reversible/low risk
|
|
20
|
+
Edit: "monitored",
|
|
21
|
+
Write: "monitored",
|
|
22
|
+
NotebookEdit: "monitored",
|
|
23
|
+
MemoryWrite: "monitored",
|
|
24
|
+
TodoWrite: "monitored",
|
|
25
|
+
Task: "monitored",
|
|
26
|
+
TaskCreate: "monitored",
|
|
27
|
+
TaskUpdate: "monitored",
|
|
28
|
+
TaskStop: "monitored",
|
|
29
|
+
// 🔴 Dangerous layer: Requires confirmation (Bash handled separately)
|
|
30
|
+
Bash: "dangerous",
|
|
31
|
+
MCPTool: "dangerous"
|
|
32
|
+
};
|
|
33
|
+
const SAFE_BASH_PATTERNS = [
|
|
34
|
+
// Git - all common operations
|
|
35
|
+
/^git\s+(status|diff|log|branch|show|remote|fetch|pull|push|commit|add|checkout|merge|rebase|stash|tag|clone|init|config|rev-parse|symbolic-ref)/i,
|
|
36
|
+
// File viewing (read-only)
|
|
37
|
+
/^ls(\s|$)/i,
|
|
38
|
+
/^cat\s/i,
|
|
39
|
+
/^head\s/i,
|
|
40
|
+
/^tail\s/i,
|
|
41
|
+
/^pwd$/i,
|
|
42
|
+
/^echo\s/i,
|
|
43
|
+
/^which\s/i,
|
|
44
|
+
/^tree(\s|$)/i,
|
|
45
|
+
/^date$/i,
|
|
46
|
+
/^whoami$/i,
|
|
47
|
+
/^find\s/i,
|
|
48
|
+
/^wc\s/i,
|
|
49
|
+
/^grep\s/i,
|
|
50
|
+
/^rg\s/i,
|
|
51
|
+
/^less\s/i,
|
|
52
|
+
/^more\s/i,
|
|
53
|
+
/^file\s/i,
|
|
54
|
+
/^stat\s/i,
|
|
55
|
+
/^du\s/i,
|
|
56
|
+
/^df\s/i,
|
|
57
|
+
// Package managers - common development operations
|
|
58
|
+
/^npm\s+(install|i|ci|run|test|start|build|list|ls|outdated|view|info|init|publish|pack|version|audit|dedupe)/i,
|
|
59
|
+
/^npx\s/i,
|
|
60
|
+
/^bun\s+(install|i|add|remove|run|test|build|pm|create|init|link|unlink|update|outdated)/i,
|
|
61
|
+
/^bunx\s/i,
|
|
62
|
+
/^yarn\s+(install|add|remove|run|test|build|init|create|link|unlink|upgrade|outdated)/i,
|
|
63
|
+
/^pnpm\s+(install|i|add|remove|run|test|build|init|create|link|unlink|update|outdated)/i,
|
|
64
|
+
/^pip\s+(install|list|show|freeze|check)/i,
|
|
65
|
+
/^pip3\s+(install|list|show|freeze|check)/i,
|
|
66
|
+
/^poetry\s+(install|add|remove|run|build|init|check|show)/i,
|
|
67
|
+
/^cargo\s+(build|run|test|check|clippy|fmt|doc|bench|new|init|add|remove)/i,
|
|
68
|
+
/^go\s+(build|run|test|get|mod|fmt|vet|generate)/i,
|
|
69
|
+
/^composer\s+(install|require|remove|update|dump-autoload)/i,
|
|
70
|
+
/^gem\s+(install|list|update)/i,
|
|
71
|
+
/^bundle\s+(install|exec|update)/i,
|
|
72
|
+
// Version queries
|
|
73
|
+
/^(node|npm|bun|yarn|pnpm|python|python3|pip|pip3|cargo|rustc|go|java|ruby|php)\s+(--version|-v|-V)$/i,
|
|
74
|
+
/^(node|npm|bun|yarn|pnpm|python|python3|pip|pip3|cargo|rustc|go|java|ruby|php)\s+-version$/i,
|
|
75
|
+
// Build and test tools
|
|
76
|
+
/^make(\s|$)/i,
|
|
77
|
+
/^cmake\s/i,
|
|
78
|
+
/^ninja(\s|$)/i,
|
|
79
|
+
/^pytest(\s|$)/i,
|
|
80
|
+
/^jest(\s|$)/i,
|
|
81
|
+
/^vitest(\s|$)/i,
|
|
82
|
+
/^mocha(\s|$)/i,
|
|
83
|
+
/^ava(\s|$)/i,
|
|
84
|
+
/^tape(\s|$)/i,
|
|
85
|
+
/^tap(\s|$)/i,
|
|
86
|
+
/^tsc(\s|$)/i,
|
|
87
|
+
/^eslint(\s|$)/i,
|
|
88
|
+
/^prettier(\s|$)/i,
|
|
89
|
+
/^biome(\s|$)/i,
|
|
90
|
+
// Docker (read-only and common operations)
|
|
91
|
+
/^docker\s+(ps|images|logs|inspect|version|info|stats|top|port|diff)/i,
|
|
92
|
+
/^docker\s+(build|run|exec|pull|push|start|stop|restart)/i,
|
|
93
|
+
/^docker-compose\s+(ps|logs|config|up|down|build|pull|restart)/i,
|
|
94
|
+
// Kubernetes (read-only)
|
|
95
|
+
/^kubectl\s+(get|describe|logs|explain|version|config|cluster-info)/i,
|
|
96
|
+
// Environment and shell
|
|
97
|
+
/^env$/i,
|
|
98
|
+
/^printenv/i,
|
|
99
|
+
/^export\s/i,
|
|
100
|
+
/^source\s/i,
|
|
101
|
+
/^\.\s/i,
|
|
102
|
+
// Process viewing
|
|
103
|
+
/^ps(\s|$)/i,
|
|
104
|
+
/^top$/i,
|
|
105
|
+
/^htop$/i,
|
|
106
|
+
// Network diagnostics (read-only)
|
|
107
|
+
/^ping\s/i,
|
|
108
|
+
/^traceroute\s/i,
|
|
109
|
+
/^dig\s/i,
|
|
110
|
+
/^nslookup\s/i,
|
|
111
|
+
/^host\s/i,
|
|
112
|
+
/^ifconfig$/i,
|
|
113
|
+
/^ip\s+(addr|link|route)/i,
|
|
114
|
+
// Archive viewing
|
|
115
|
+
/^tar\s+(-t|--list)/i,
|
|
116
|
+
/^unzip\s+-l/i,
|
|
117
|
+
/^zipinfo\s/i,
|
|
118
|
+
// Text processing
|
|
119
|
+
/^sort(\s|$)/i,
|
|
120
|
+
/^uniq(\s|$)/i,
|
|
121
|
+
/^cut(\s|$)/i,
|
|
122
|
+
/^awk\s/i,
|
|
123
|
+
/^sed\s/i,
|
|
124
|
+
/^tr\s/i,
|
|
125
|
+
/^diff\s/i,
|
|
126
|
+
/^md5sum\s/i,
|
|
127
|
+
/^sha256sum\s/i,
|
|
128
|
+
// Directory operations (safe)
|
|
129
|
+
/^mkdir\s/i,
|
|
130
|
+
/^touch\s/i,
|
|
131
|
+
/^cp\s/i,
|
|
132
|
+
/^mv\s/i
|
|
133
|
+
];
|
|
134
|
+
const DANGEROUS_BASH_PATTERNS = [
|
|
135
|
+
// File deletion
|
|
136
|
+
/\brm\s/i,
|
|
137
|
+
/\brmdir\s/i,
|
|
138
|
+
/\bunlink\s/i,
|
|
139
|
+
// Privilege escalation
|
|
140
|
+
/\bsudo\s/i,
|
|
141
|
+
/\bsu\s/i,
|
|
142
|
+
/\bdoas\s/i,
|
|
143
|
+
/\bpkexec\s/i,
|
|
144
|
+
// Permission changes
|
|
145
|
+
/\bchmod\s/i,
|
|
146
|
+
/\bchown\s/i,
|
|
147
|
+
/\bchgrp\s/i,
|
|
148
|
+
// Disk operations
|
|
149
|
+
/\bmkfs\b/i,
|
|
150
|
+
/\bfdisk\s/i,
|
|
151
|
+
/\bparted\s/i,
|
|
152
|
+
/\bdd\s+if=/i,
|
|
153
|
+
/\bshred\s/i,
|
|
154
|
+
// System control
|
|
155
|
+
/\bsystemctl\s/i,
|
|
156
|
+
/\bservice\s/i,
|
|
157
|
+
/\breboot\b/i,
|
|
158
|
+
/\bshutdown\s/i,
|
|
159
|
+
/\bhalt\b/i,
|
|
160
|
+
/\bpoweroff\b/i,
|
|
161
|
+
// Dangerous redirections
|
|
162
|
+
/>\s*\/(?!tmp|dev\/null)/i,
|
|
163
|
+
// Redirect to root paths (except /tmp and /dev/null)
|
|
164
|
+
/>\s*~\//i,
|
|
165
|
+
// Redirect to home directory paths
|
|
166
|
+
// Shell execution from network
|
|
167
|
+
/\|\s*(bash|sh|zsh|fish)/i,
|
|
168
|
+
/curl.*\|\s*(bash|sh)/i,
|
|
169
|
+
/wget.*\|\s*(bash|sh)/i,
|
|
170
|
+
// Environment destruction
|
|
171
|
+
/\bkillall\s/i,
|
|
172
|
+
/\bpkill\s/i,
|
|
173
|
+
/kill\s+-9/i,
|
|
174
|
+
// Network dangerous
|
|
175
|
+
/\bnc\s+-l/i,
|
|
176
|
+
// netcat listen mode
|
|
177
|
+
/\biptables\s/i,
|
|
178
|
+
/\bufw\s/i,
|
|
179
|
+
// Crontab
|
|
180
|
+
/\bcrontab\s+-r/i,
|
|
181
|
+
// Git destructive
|
|
182
|
+
/\bgit\s+(reset\s+--hard|clean\s+-f|push\s+--force|push\s+-f)/i
|
|
183
|
+
];
|
|
184
|
+
function classifyBashCommand(command) {
|
|
185
|
+
const normalizedCommand = command.trim().replace(/\s+/g, " ");
|
|
186
|
+
if (DANGEROUS_BASH_PATTERNS.some((p) => p.test(normalizedCommand))) {
|
|
187
|
+
return "dangerous";
|
|
188
|
+
}
|
|
189
|
+
if (SAFE_BASH_PATTERNS.some((p) => p.test(normalizedCommand))) {
|
|
190
|
+
return "safe";
|
|
191
|
+
}
|
|
192
|
+
return "monitored";
|
|
193
|
+
}
|
|
194
|
+
function getToolRiskLevel(toolName, input) {
|
|
195
|
+
if (toolName === "Bash" && input?.command) {
|
|
196
|
+
return classifyBashCommand(input.command);
|
|
197
|
+
}
|
|
198
|
+
return TOOL_RISK_LEVELS[toolName] ?? "dangerous";
|
|
199
|
+
}
|
|
200
|
+
export {
|
|
201
|
+
DANGEROUS_BASH_PATTERNS,
|
|
202
|
+
SAFE_BASH_PATTERNS,
|
|
203
|
+
TOOL_RISK_LEVELS,
|
|
204
|
+
classifyBashCommand,
|
|
205
|
+
getToolRiskLevel
|
|
206
|
+
};
|
|
207
|
+
//# sourceMappingURL=toolRiskClassification.js.map
|