@within-7/minto 0.1.6 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli.js +155 -37
- package/dist/Tool.js +38 -0
- package/dist/Tool.js.map +3 -3
- package/dist/commands/agents/AgentsCommand.js +52 -26
- package/dist/commands/agents/AgentsCommand.js.map +2 -2
- package/dist/commands/agents/constants.js +1 -1
- package/dist/commands/agents/constants.js.map +1 -1
- package/dist/commands/agents/index.js +1 -1
- package/dist/commands/bug.js +74 -7
- package/dist/commands/bug.js.map +3 -3
- package/dist/commands/clear.js +3 -0
- package/dist/commands/clear.js.map +2 -2
- package/dist/commands/compact.js +37 -0
- package/dist/commands/compact.js.map +2 -2
- package/dist/commands/context.js +84 -0
- package/dist/commands/context.js.map +7 -0
- package/dist/commands/ctx_viz.js +18 -10
- package/dist/commands/ctx_viz.js.map +2 -2
- package/dist/commands/doctor.js +158 -12
- package/dist/commands/doctor.js.map +2 -2
- package/dist/commands/export.js +156 -0
- package/dist/commands/export.js.map +7 -0
- package/dist/commands/mcp-interactive.js +21 -12
- package/dist/commands/mcp-interactive.js.map +2 -2
- package/dist/commands/model.js +6 -5
- package/dist/commands/model.js.map +2 -2
- package/dist/commands/permissions.js +86 -0
- package/dist/commands/permissions.js.map +7 -0
- package/dist/commands/quit.js +3 -1
- package/dist/commands/quit.js.map +2 -2
- package/dist/commands/sandbox.js +104 -0
- package/dist/commands/sandbox.js.map +7 -0
- package/dist/commands/status.js +58 -0
- package/dist/commands/status.js.map +7 -0
- package/dist/commands/tasks.js +108 -0
- package/dist/commands/tasks.js.map +7 -0
- package/dist/commands/todos.js +123 -0
- package/dist/commands/todos.js.map +7 -0
- package/dist/commands.js +20 -2
- package/dist/commands.js.map +2 -2
- package/dist/components/AgentThinkingBlock.js +10 -18
- package/dist/components/AgentThinkingBlock.js.map +2 -2
- package/dist/components/BackgroundTasksPanel.js +78 -29
- package/dist/components/BackgroundTasksPanel.js.map +2 -2
- package/dist/components/BashStreamingProgress.js +24 -0
- package/dist/components/BashStreamingProgress.js.map +7 -0
- package/dist/components/CollapsibleHint.js +14 -0
- package/dist/components/CollapsibleHint.js.map +7 -0
- package/dist/components/FileEditToolUpdatedMessage.js +1 -1
- package/dist/components/FileEditToolUpdatedMessage.js.map +2 -2
- package/dist/components/HotkeyHelpPanel.js +137 -0
- package/dist/components/HotkeyHelpPanel.js.map +7 -0
- package/dist/components/Logo.js +5 -5
- package/dist/components/Logo.js.map +2 -2
- package/dist/components/Message.js +23 -7
- package/dist/components/Message.js.map +3 -3
- package/dist/components/ModelConfig.js +16 -3
- package/dist/components/ModelConfig.js.map +2 -2
- package/dist/components/ModelListManager.js +3 -3
- package/dist/components/ModelListManager.js.map +2 -2
- package/dist/components/ModelSelector/ModelSelector.js +1 -1
- package/dist/components/Onboarding.js +19 -14
- package/dist/components/Onboarding.js.map +2 -2
- package/dist/components/ProgressBar.js +74 -0
- package/dist/components/ProgressBar.js.map +7 -0
- package/dist/components/PromptInput.js +156 -46
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/RequestStatusIndicator.js +194 -0
- package/dist/components/RequestStatusIndicator.js.map +7 -0
- package/dist/components/Spinner.js +92 -27
- package/dist/components/Spinner.js.map +2 -2
- package/dist/components/SpinnerSymbol.js +21 -27
- package/dist/components/SpinnerSymbol.js.map +2 -2
- package/dist/components/StreamingBashOutput.js +9 -8
- package/dist/components/StreamingBashOutput.js.map +2 -2
- package/dist/components/SubagentBlock.js +1 -1
- package/dist/components/SubagentBlock.js.map +1 -1
- package/dist/components/SubagentProgress.js +10 -11
- package/dist/components/SubagentProgress.js.map +2 -2
- package/dist/components/TaskCard.js +16 -13
- package/dist/components/TaskCard.js.map +2 -2
- package/dist/components/TodoChangeBlock.js +1 -1
- package/dist/components/TodoChangeBlock.js.map +2 -2
- package/dist/components/TodoPanel.js +120 -29
- package/dist/components/TodoPanel.js.map +3 -3
- package/dist/components/TokenCounter.js +74 -0
- package/dist/components/TokenCounter.js.map +7 -0
- package/dist/components/TokenWarning.js +2 -1
- package/dist/components/TokenWarning.js.map +2 -2
- package/dist/components/TreeConnector.js +25 -0
- package/dist/components/TreeConnector.js.map +7 -0
- package/dist/components/TurnCompletionIndicator.js +18 -0
- package/dist/components/TurnCompletionIndicator.js.map +7 -0
- package/dist/components/messages/AssistantTextMessage.js +5 -2
- package/dist/components/messages/AssistantTextMessage.js.map +2 -2
- package/dist/components/messages/AssistantThinkingMessage.js +18 -3
- package/dist/components/messages/AssistantThinkingMessage.js.map +2 -2
- package/dist/components/messages/AssistantToolUseMessage.js +11 -8
- package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
- package/dist/components/messages/GroupRenderer.js +53 -0
- package/dist/components/messages/GroupRenderer.js.map +7 -0
- package/dist/components/messages/NestedTasksPreview.js +12 -0
- package/dist/components/messages/NestedTasksPreview.js.map +7 -0
- package/dist/components/messages/ParallelTasksGroupView.js +92 -0
- package/dist/components/messages/ParallelTasksGroupView.js.map +7 -0
- package/dist/components/messages/TaskInModuleView.js +198 -0
- package/dist/components/messages/TaskInModuleView.js.map +7 -0
- package/dist/components/messages/TaskOutputContent.js +53 -0
- package/dist/components/messages/TaskOutputContent.js.map +7 -0
- package/dist/components/messages/UserPromptMessage.js +1 -1
- package/dist/components/messages/UserPromptMessage.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +2 -3
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
- package/dist/components/permissions/FallbackPermissionRequest.js +4 -4
- package/dist/components/permissions/FallbackPermissionRequest.js.map +2 -2
- package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +4 -4
- package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +2 -2
- package/dist/constants/colors.js +48 -0
- package/dist/constants/colors.js.map +2 -2
- package/dist/constants/formatRules.js +102 -0
- package/dist/constants/formatRules.js.map +7 -0
- package/dist/constants/prompts.js +12 -34
- package/dist/constants/prompts.js.map +2 -2
- package/dist/constants/symbols.js +64 -6
- package/dist/constants/symbols.js.map +2 -2
- package/dist/constants/timing.js +5 -0
- package/dist/constants/timing.js.map +2 -2
- package/dist/core/config/defaults.js +84 -0
- package/dist/core/config/defaults.js.map +7 -0
- package/dist/core/config/index.js +111 -0
- package/dist/core/config/index.js.map +7 -0
- package/dist/core/config/loader.js +221 -0
- package/dist/core/config/loader.js.map +7 -0
- package/dist/core/config/migrations.js +128 -0
- package/dist/core/config/migrations.js.map +7 -0
- package/dist/core/config/schema.js +178 -0
- package/dist/core/config/schema.js.map +7 -0
- package/dist/core/costTracker.js +138 -0
- package/dist/core/costTracker.js.map +7 -0
- package/dist/core/index.js +5 -0
- package/dist/core/index.js.map +7 -0
- package/dist/core/permissions/auditLog.js +204 -0
- package/dist/core/permissions/auditLog.js.map +7 -0
- package/dist/core/permissions/engine/index.js +3 -0
- package/dist/core/permissions/engine/index.js.map +7 -0
- package/dist/core/permissions/engine/permissionEngine.js +106 -0
- package/dist/core/permissions/engine/permissionEngine.js.map +7 -0
- package/dist/core/permissions/engine/types.js +1 -0
- package/dist/core/permissions/engine/types.js.map +7 -0
- package/dist/core/permissions/index.js +84 -0
- package/dist/core/permissions/index.js.map +7 -0
- package/dist/core/permissions/ruleEngine.js +259 -0
- package/dist/core/permissions/ruleEngine.js.map +7 -0
- package/dist/core/permissions/rules/allowedToolsRule.js +62 -0
- package/dist/core/permissions/rules/allowedToolsRule.js.map +7 -0
- package/dist/core/permissions/rules/autoEscalationRule.js +291 -0
- package/dist/core/permissions/rules/autoEscalationRule.js.map +7 -0
- package/dist/core/permissions/rules/index.js +46 -0
- package/dist/core/permissions/rules/index.js.map +7 -0
- package/dist/core/permissions/rules/planModeRule.js +55 -0
- package/dist/core/permissions/rules/planModeRule.js.map +7 -0
- package/dist/core/permissions/rules/projectBoundaryRule.js +168 -0
- package/dist/core/permissions/rules/projectBoundaryRule.js.map +7 -0
- package/dist/core/permissions/rules/safeModeRule.js +65 -0
- package/dist/core/permissions/rules/safeModeRule.js.map +7 -0
- package/dist/core/permissions/rules/sensitivePathsRule.js +340 -0
- package/dist/core/permissions/rules/sensitivePathsRule.js.map +7 -0
- package/dist/core/permissions/types.js +127 -0
- package/dist/core/permissions/types.js.map +7 -0
- package/dist/core/tools/executor.js +143 -0
- package/dist/core/tools/executor.js.map +7 -0
- package/dist/core/tools/index.js +15 -0
- package/dist/core/tools/index.js.map +7 -0
- package/dist/core/tools/registry.js +183 -0
- package/dist/core/tools/registry.js.map +7 -0
- package/dist/core/tools/types.js +1 -0
- package/dist/core/tools/types.js.map +7 -0
- package/dist/cost-tracker.js +23 -15
- package/dist/cost-tracker.js.map +2 -2
- package/dist/entrypoints/cli.js +43 -43
- package/dist/entrypoints/cli.js.map +2 -2
- package/dist/entrypoints/mcp.js +12 -4
- package/dist/entrypoints/mcp.js.map +2 -2
- package/dist/history.js +14 -3
- package/dist/history.js.map +2 -2
- package/dist/hooks/useAgentTranscripts.js +116 -0
- package/dist/hooks/useAgentTranscripts.js.map +7 -0
- package/dist/hooks/useAnimationSync.js +53 -0
- package/dist/hooks/useAnimationSync.js.map +7 -0
- package/dist/hooks/useArrowKeyHistory.js +4 -2
- package/dist/hooks/useArrowKeyHistory.js.map +2 -2
- package/dist/hooks/useCanUseTool.js +3 -1
- package/dist/hooks/useCanUseTool.js.map +2 -2
- package/dist/hooks/useCancelRequest.js +4 -1
- package/dist/hooks/useCancelRequest.js.map +2 -2
- package/dist/hooks/useExitOnCtrlCD.js +9 -5
- package/dist/hooks/useExitOnCtrlCD.js.map +2 -2
- package/dist/hooks/useHookStatus.js +40 -0
- package/dist/hooks/useHookStatus.js.map +7 -0
- package/dist/hooks/useLogMessages.js +17 -1
- package/dist/hooks/useLogMessages.js.map +2 -2
- package/dist/hooks/useMessageGroups.js +43 -0
- package/dist/hooks/useMessageGroups.js.map +7 -0
- package/dist/hooks/useTerminalSize.js +62 -6
- package/dist/hooks/useTerminalSize.js.map +2 -2
- package/dist/hooks/useUnifiedCompletion.js +69 -0
- package/dist/hooks/useUnifiedCompletion.js.map +2 -2
- package/dist/i18n/index.js +109 -0
- package/dist/i18n/index.js.map +7 -0
- package/dist/i18n/locales/en.js +347 -0
- package/dist/i18n/locales/en.js.map +7 -0
- package/dist/i18n/locales/index.js +7 -0
- package/dist/i18n/locales/index.js.map +7 -0
- package/dist/i18n/locales/zh-CN.js +347 -0
- package/dist/i18n/locales/zh-CN.js.map +7 -0
- package/dist/i18n/types.js +8 -0
- package/dist/i18n/types.js.map +7 -0
- package/dist/query.js +175 -17
- package/dist/query.js.map +3 -3
- package/dist/screens/REPL.js +501 -192
- package/dist/screens/REPL.js.map +3 -3
- package/dist/services/adapters/chatCompletions.js +3 -1
- package/dist/services/adapters/chatCompletions.js.map +2 -2
- package/dist/services/adapters/messageNormalizer.js +354 -0
- package/dist/services/adapters/messageNormalizer.js.map +7 -0
- package/dist/services/adapters/responsesAPI.js +6 -3
- package/dist/services/adapters/responsesAPI.js.map +2 -2
- package/dist/services/checkpointManager.js +386 -0
- package/dist/services/checkpointManager.js.map +7 -0
- package/dist/services/claude.js +138 -11
- package/dist/services/claude.js.map +3 -3
- package/dist/services/compressionService.js +50 -1
- package/dist/services/compressionService.js.map +2 -2
- package/dist/services/contextMonitor.js +162 -0
- package/dist/services/contextMonitor.js.map +7 -0
- package/dist/services/customCommands.js +60 -41
- package/dist/services/customCommands.js.map +2 -2
- package/dist/services/hookExecutor.js +173 -1
- package/dist/services/hookExecutor.js.map +2 -2
- package/dist/services/intelligentCompactor.js +281 -0
- package/dist/services/intelligentCompactor.js.map +7 -0
- package/dist/services/lspConfig.js +109 -0
- package/dist/services/lspConfig.js.map +7 -0
- package/dist/services/mcpClient.js +273 -34
- package/dist/services/mcpClient.js.map +2 -2
- package/dist/services/modelOrchestrator.js +310 -0
- package/dist/services/modelOrchestrator.js.map +7 -0
- package/dist/services/openai.js +8 -1
- package/dist/services/openai.js.map +2 -2
- package/dist/services/outputStyles.js +138 -0
- package/dist/services/outputStyles.js.map +7 -0
- package/dist/services/plugins/index.js +5 -0
- package/dist/services/plugins/index.js.map +7 -0
- package/dist/services/plugins/lspServers.js +188 -0
- package/dist/services/plugins/lspServers.js.map +7 -0
- package/dist/services/plugins/pluginRuntime.js +229 -0
- package/dist/services/plugins/pluginRuntime.js.map +7 -0
- package/dist/services/plugins/pluginValidation.js +219 -0
- package/dist/services/plugins/pluginValidation.js.map +7 -0
- package/dist/services/plugins/skillMarketplace.js +556 -0
- package/dist/services/plugins/skillMarketplace.js.map +7 -0
- package/dist/services/responseStateManager.js +37 -3
- package/dist/services/responseStateManager.js.map +2 -2
- package/dist/services/sandbox/filesystemBoundary.js +300 -0
- package/dist/services/sandbox/filesystemBoundary.js.map +7 -0
- package/dist/services/sandbox/index.js +14 -0
- package/dist/services/sandbox/index.js.map +7 -0
- package/dist/services/sandbox/networkProxy.js +293 -0
- package/dist/services/sandbox/networkProxy.js.map +7 -0
- package/dist/services/sandbox/sandboxController.js +574 -0
- package/dist/services/sandbox/sandboxController.js.map +7 -0
- package/dist/services/sandbox/types.js +50 -0
- package/dist/services/sandbox/types.js.map +7 -0
- package/dist/services/sessionMemory.js +266 -0
- package/dist/services/sessionMemory.js.map +7 -0
- package/dist/services/taskRouter.js +324 -0
- package/dist/services/taskRouter.js.map +7 -0
- package/dist/tools/ArchitectTool/ArchitectTool.js +10 -3
- package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +3 -0
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +8 -1
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
- package/dist/tools/BaseTool.js +72 -0
- package/dist/tools/BaseTool.js.map +7 -0
- package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +3 -0
- package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +2 -2
- package/dist/tools/BashTool/BashTool.js +60 -3
- package/dist/tools/BashTool/BashTool.js.map +2 -2
- package/dist/tools/BashTool/BashToolResultMessage.js +3 -0
- package/dist/tools/BashTool/BashToolResultMessage.js.map +2 -2
- package/dist/tools/BashTool/OutputLine.js +54 -0
- package/dist/tools/BashTool/OutputLine.js.map +2 -2
- package/dist/tools/BashTool/prompt.js +192 -3
- package/dist/tools/BashTool/prompt.js.map +2 -2
- package/dist/tools/FileEditTool/FileEditTool.js +29 -4
- package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
- package/dist/tools/FileReadTool/FileReadTool.js +23 -4
- package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
- package/dist/tools/FileWriteTool/FileWriteTool.js +5 -5
- package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
- package/dist/tools/GlobTool/GlobTool.js +14 -3
- package/dist/tools/GlobTool/GlobTool.js.map +2 -2
- package/dist/tools/GrepTool/GrepTool.js +41 -7
- package/dist/tools/GrepTool/GrepTool.js.map +2 -2
- package/dist/tools/KillShellTool/KillShellToolResultMessage.js +3 -0
- package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +2 -2
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +109 -0
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +7 -0
- package/dist/tools/ListMcpResourcesTool/prompt.js +19 -0
- package/dist/tools/ListMcpResourcesTool/prompt.js.map +7 -0
- package/dist/tools/LspTool/LspTool.js +664 -0
- package/dist/tools/LspTool/LspTool.js.map +7 -0
- package/dist/tools/LspTool/prompt.js +27 -0
- package/dist/tools/LspTool/prompt.js.map +7 -0
- package/dist/tools/MCPTool/MCPTool.js +11 -4
- package/dist/tools/MCPTool/MCPTool.js.map +2 -2
- package/dist/tools/MemoryReadTool/MemoryReadTool.js +19 -6
- package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +6 -6
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js +19 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
- package/dist/tools/NotebookEditTool/NotebookEditTool.js +5 -1
- package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
- package/dist/tools/NotebookReadTool/NotebookReadTool.js +8 -4
- package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js +74 -0
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +7 -0
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js +108 -0
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +7 -0
- package/dist/tools/PlanModeTool/prompt.js +94 -0
- package/dist/tools/PlanModeTool/prompt.js.map +7 -0
- package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +130 -0
- package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +7 -0
- package/dist/tools/ReadMcpResourceTool/prompt.js +17 -0
- package/dist/tools/ReadMcpResourceTool/prompt.js.map +7 -0
- package/dist/tools/SkillTool/SkillTool.js +14 -3
- package/dist/tools/SkillTool/SkillTool.js.map +2 -2
- package/dist/tools/SlashCommandTool/SlashCommandTool.js +260 -0
- package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +7 -0
- package/dist/tools/SlashCommandTool/prompt.js +35 -0
- package/dist/tools/SlashCommandTool/prompt.js.map +7 -0
- package/dist/tools/TaskOutputTool/TaskOutputTool.js +189 -0
- package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +7 -0
- package/dist/tools/TaskOutputTool/prompt.js +15 -0
- package/dist/tools/TaskOutputTool/prompt.js.map +7 -0
- package/dist/tools/TaskTool/TaskTool.js +321 -146
- package/dist/tools/TaskTool/TaskTool.js.map +2 -2
- package/dist/tools/TaskTool/prompt.js.map +2 -2
- package/dist/tools/TodoWriteTool/TodoWriteTool.js +42 -73
- package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/URLFetcherTool.js +7 -1
- package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/cache.js +55 -8
- package/dist/tools/URLFetcherTool/cache.js.map +2 -2
- package/dist/tools/WebSearchTool/WebSearchTool.js +6 -1
- package/dist/tools/WebSearchTool/WebSearchTool.js.map +2 -2
- package/dist/tools.js +31 -2
- package/dist/tools.js.map +2 -2
- package/dist/types/hooks.js +4 -0
- package/dist/types/hooks.js.map +2 -2
- package/dist/types/marketplace.js.map +2 -2
- package/dist/types/messageGroup.js +36 -0
- package/dist/types/messageGroup.js.map +7 -0
- package/dist/types/plugin.js.map +2 -2
- package/dist/types/thinking.js +1 -0
- package/dist/types/thinking.js.map +7 -0
- package/dist/utils/BackgroundShellManager.js +136 -39
- package/dist/utils/BackgroundShellManager.js.map +2 -2
- package/dist/utils/MessageBatchBuffer.js +102 -0
- package/dist/utils/MessageBatchBuffer.js.map +7 -0
- package/dist/utils/PersistentShell.js +151 -1
- package/dist/utils/PersistentShell.js.map +2 -2
- package/dist/utils/agentLoader.js +1 -23
- package/dist/utils/agentLoader.js.map +2 -2
- package/dist/utils/agentTranscripts.js +641 -0
- package/dist/utils/agentTranscripts.js.map +7 -0
- package/dist/utils/animationManager.js +213 -0
- package/dist/utils/animationManager.js.map +7 -0
- package/dist/utils/animationSync.js +110 -0
- package/dist/utils/animationSync.js.map +7 -0
- package/dist/utils/asyncFile.js +215 -0
- package/dist/utils/asyncFile.js.map +7 -0
- package/dist/utils/backgroundAgentManager.js +231 -0
- package/dist/utils/backgroundAgentManager.js.map +7 -0
- package/dist/utils/config.js +63 -7
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/conversationRecovery.js +19 -0
- package/dist/utils/conversationRecovery.js.map +2 -2
- package/dist/utils/exit.js +73 -0
- package/dist/utils/exit.js.map +7 -0
- package/dist/utils/format.js +73 -5
- package/dist/utils/format.js.map +2 -2
- package/dist/utils/generators.js +76 -6
- package/dist/utils/generators.js.map +2 -2
- package/dist/utils/globalErrorHandler.js +149 -0
- package/dist/utils/globalErrorHandler.js.map +7 -0
- package/dist/utils/groupHandlers/index.js +8 -0
- package/dist/utils/groupHandlers/index.js.map +7 -0
- package/dist/utils/groupHandlers/parallelTasksHandler.js +140 -0
- package/dist/utils/groupHandlers/parallelTasksHandler.js.map +7 -0
- package/dist/utils/groupHandlers/taskHandler.js +104 -0
- package/dist/utils/groupHandlers/taskHandler.js.map +7 -0
- package/dist/utils/groupHandlers/types.js +1 -0
- package/dist/utils/groupHandlers/types.js.map +7 -0
- package/dist/utils/logRotation.js +224 -0
- package/dist/utils/logRotation.js.map +7 -0
- package/dist/utils/marketplaceManager.js +3 -5
- package/dist/utils/marketplaceManager.js.map +2 -2
- package/dist/utils/memSafety.js +264 -0
- package/dist/utils/memSafety.js.map +7 -0
- package/dist/utils/messageGroupManager.js +274 -0
- package/dist/utils/messageGroupManager.js.map +7 -0
- package/dist/utils/messages.js +13 -4
- package/dist/utils/messages.js.map +2 -2
- package/dist/utils/model.js +119 -15
- package/dist/utils/model.js.map +3 -3
- package/dist/utils/permissions/filesystem.js +157 -5
- package/dist/utils/permissions/filesystem.js.map +2 -2
- package/dist/utils/plan/planMode.js +143 -0
- package/dist/utils/plan/planMode.js.map +7 -0
- package/dist/utils/pluginLoader.js +17 -21
- package/dist/utils/pluginLoader.js.map +2 -2
- package/dist/utils/ripgrep.js +55 -2
- package/dist/utils/ripgrep.js.map +2 -2
- package/dist/utils/sanitizeInput.js +32 -0
- package/dist/utils/sanitizeInput.js.map +7 -0
- package/dist/utils/secureKeyStorage.js +312 -0
- package/dist/utils/secureKeyStorage.js.map +7 -0
- package/dist/utils/session/sessionPlugins.js +67 -0
- package/dist/utils/session/sessionPlugins.js.map +7 -0
- package/dist/utils/taskDisplayUtils.js +257 -0
- package/dist/utils/taskDisplayUtils.js.map +7 -0
- package/dist/utils/teamConfig.js +2 -1
- package/dist/utils/teamConfig.js.map +2 -2
- package/dist/utils/todoStorage.js +92 -2
- package/dist/utils/todoStorage.js.map +2 -2
- package/dist/utils/toolTimeout.js +136 -0
- package/dist/utils/toolTimeout.js.map +7 -0
- package/dist/utils/tooling/safeRender.js +115 -0
- package/dist/utils/tooling/safeRender.js.map +7 -0
- package/dist/utils/userFriendlyError.js +346 -0
- package/dist/utils/userFriendlyError.js.map +7 -0
- package/dist/utils/vendor/ripgrep/arm64-darwin/rg +0 -0
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +14 -4
- package/scripts/postinstall.js +128 -38
- package/dist/commands/agents.js +0 -2086
- package/dist/commands/agents.js.map +0 -7
- package/dist/commands/build.js +0 -74
- package/dist/commands/build.js.map +0 -7
- package/dist/commands/compression.js +0 -57
- package/dist/commands/compression.js.map +0 -7
- package/dist/commands/listen.js +0 -37
- package/dist/commands/listen.js.map +0 -7
- package/dist/commands/login.js +0 -37
- package/dist/commands/login.js.map +0 -7
- package/dist/commands/logout.js +0 -33
- package/dist/commands/logout.js.map +0 -7
- package/dist/commands/mcp.js +0 -40
- package/dist/commands/mcp.js.map +0 -7
- package/dist/commands/mcp_refresh.js +0 -40
- package/dist/commands/mcp_refresh.js.map +0 -7
- package/dist/commands/modelstatus.js +0 -21
- package/dist/commands/modelstatus.js.map +0 -7
- package/dist/commands/onboarding.js +0 -36
- package/dist/commands/onboarding.js.map +0 -7
- package/dist/commands/plugin-interactive.js +0 -446
- package/dist/commands/plugin-interactive.js.map +0 -7
- package/dist/commands/pr_comments.js +0 -61
- package/dist/commands/pr_comments.js.map +0 -7
- package/dist/commands/release-notes.js +0 -30
- package/dist/commands/release-notes.js.map +0 -7
- package/dist/commands/review.js +0 -51
- package/dist/commands/review.js.map +0 -7
- package/dist/components/Bug.js +0 -147
- package/dist/components/Bug.js.map +0 -7
- package/dist/components/ModelSelector.js +0 -2062
- package/dist/components/ModelSelector.js.map +0 -7
- package/dist/components/ModelStatusDisplay.js +0 -87
- package/dist/components/ModelStatusDisplay.js.map +0 -7
- package/dist/entrypoints/cli-wrapper.js +0 -61
- package/dist/entrypoints/cli-wrapper.js.map +0 -7
- package/dist/screens/Doctor.js +0 -22
- package/dist/screens/Doctor.js.map +0 -7
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/services/sandbox/types.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Sandbox System Types\n *\n * Type definitions for the sandbox execution system that provides\n * OS-level isolation for Bash commands.\n */\n\n/**\n * Filesystem access policy\n */\nexport interface FilesystemPolicy {\n /** Directories/files allowed for writing (glob patterns) */\n writeAllowed: string[]\n /** Directories/files allowed for reading (glob patterns) */\n readAllowed: string[]\n /** Directories/files explicitly denied (glob patterns) - highest priority */\n denied: string[]\n}\n\n/**\n * Network access policy\n */\nexport interface NetworkPolicy {\n /** Domains allowed for network access */\n allowedDomains: string[]\n /** Whether to prompt user for new domains */\n promptForNewDomains: boolean\n /** Whether to block all network access */\n blockAll: boolean\n}\n\n/**\n * Process isolation policy\n */\nexport interface ProcessPolicy {\n /** Commands excluded from sandboxing (e.g., 'docker', 'git') */\n excludedCommands: string[]\n /** Maximum execution time in milliseconds */\n maxExecutionTime: number\n /** Maximum memory usage in bytes (0 = unlimited) */\n maxMemory: number\n /** Maximum number of processes (0 = unlimited) */\n maxProcesses: number\n}\n\n/**\n * Complete sandbox configuration\n */\nexport interface SandboxConfig {\n /** Whether sandboxing is enabled */\n enabled: boolean\n /** Filesystem access policy */\n filesystem: FilesystemPolicy\n /** Network access policy */\n network: NetworkPolicy\n /** Process isolation policy */\n process: ProcessPolicy\n}\n\n/**\n * Sandbox execution result\n */\nexport interface SandboxExecutionResult {\n /** Standard output */\n stdout: string\n /** Standard error */\n stderr: string\n /** Exit code */\n exitCode: number\n /** Whether execution was interrupted */\n interrupted: boolean\n /** Whether execution was blocked by sandbox */\n blocked: boolean\n /** Reason for blocking (if blocked) */\n blockReason?: string\n /** Execution duration in milliseconds */\n duration: number\n}\n\n/**\n * Sandbox violation types\n */\nexport type SandboxViolationType =\n | 'filesystem_write_denied'\n | 'filesystem_read_denied'\n | 'filesystem_path_denied'\n | 'network_domain_denied'\n | 'network_blocked'\n | 'process_limit_exceeded'\n | 'memory_limit_exceeded'\n | 'execution_time_exceeded'\n | 'command_excluded'\n\n/**\n * Sandbox violation record\n */\nexport interface SandboxViolation {\n type: SandboxViolationType\n timestamp: number\n command: string\n details: string\n path?: string\n domain?: string\n}\n\n/**\n * OS-specific sandbox implementation type\n */\nexport type SandboxImplementation =\n | 'seatbelt'\n | 'bubblewrap'\n | 'docker'\n | 'none'\n\n/**\n * Sandbox controller interface\n */\nexport interface ISandboxController {\n /** Check if sandbox is available on this system */\n isAvailable(): Promise<boolean>\n\n /** Get the implementation type */\n getImplementationType(): SandboxImplementation\n\n /** Initialize the sandbox */\n initialize(config: SandboxConfig): Promise<void>\n\n /** Execute a command in the sandbox */\n execute(\n command: string,\n workingDir: string,\n signal?: AbortSignal,\n timeout?: number,\n ): Promise<SandboxExecutionResult>\n\n /** Pre-validate a command against policies */\n validateCommand(command: string): Promise<{\n valid: boolean\n violations: SandboxViolation[]\n }>\n\n /** Get current configuration */\n getConfig(): SandboxConfig\n\n /** Update configuration */\n updateConfig(config: Partial<SandboxConfig>): void\n\n /** Get violation history */\n getViolations(): SandboxViolation[]\n\n /** Clear violation history */\n clearViolations(): void\n}\n\n/**\n * Default sandbox configuration\n */\nexport const DEFAULT_SANDBOX_CONFIG: SandboxConfig = {\n enabled: false, // Disabled by default for backward compatibility\n filesystem: {\n writeAllowed: ['./'], // Current working directory\n readAllowed: ['*'], // Allow reading everything by default\n denied: [\n '.env*',\n '.env',\n '.env.local',\n '.env.*.local',\n 'secrets/**',\n '.ssh/**',\n '.gnupg/**',\n '.aws/credentials',\n '.config/gcloud/**',\n '**/*.pem',\n '**/*.key',\n '**/id_rsa',\n '**/id_ed25519',\n ],\n },\n network: {\n allowedDomains: [\n 'api.anthropic.com',\n 'api.openai.com',\n 'github.com',\n 'api.github.com',\n 'registry.npmjs.org',\n 'pypi.org',\n ],\n promptForNewDomains: true,\n blockAll: false,\n },\n process: {\n excludedCommands: ['docker', 'git', 'node', 'npm', 'bun', 'pnpm', 'yarn'],\n maxExecutionTime: 600000, // 10 minutes\n maxMemory: 0, // Unlimited\n maxProcesses: 0, // Unlimited\n },\n}\n"],
|
|
5
|
+
"mappings": "AA6JO,MAAM,yBAAwC;AAAA,EACnD,SAAS;AAAA;AAAA,EACT,YAAY;AAAA,IACV,cAAc,CAAC,IAAI;AAAA;AAAA,IACnB,aAAa,CAAC,GAAG;AAAA;AAAA,IACjB,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP,gBAAgB;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,qBAAqB;AAAA,IACrB,UAAU;AAAA,EACZ;AAAA,EACA,SAAS;AAAA,IACP,kBAAkB,CAAC,UAAU,OAAO,QAAQ,OAAO,OAAO,QAAQ,MAAM;AAAA,IACxE,kBAAkB;AAAA;AAAA,IAClB,WAAW;AAAA;AAAA,IACX,cAAc;AAAA;AAAA,EAChB;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import {
|
|
2
|
+
existsSync,
|
|
3
|
+
mkdirSync,
|
|
4
|
+
readFileSync,
|
|
5
|
+
writeFileSync,
|
|
6
|
+
readdirSync,
|
|
7
|
+
unlinkSync,
|
|
8
|
+
rmdirSync
|
|
9
|
+
} from "fs";
|
|
10
|
+
import { join, resolve } from "path";
|
|
11
|
+
import { homedir } from "os";
|
|
12
|
+
import crypto from "crypto";
|
|
13
|
+
class SessionMemoryManager {
|
|
14
|
+
baseDir;
|
|
15
|
+
projectHash;
|
|
16
|
+
sessionId;
|
|
17
|
+
constructor(projectPath, sessionId) {
|
|
18
|
+
this.baseDir = join(homedir(), ".minto", "projects");
|
|
19
|
+
this.projectHash = this.hashPath(projectPath);
|
|
20
|
+
this.sessionId = sessionId || crypto.randomUUID();
|
|
21
|
+
this.ensureDirectories();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get the session ID
|
|
25
|
+
*/
|
|
26
|
+
getSessionId() {
|
|
27
|
+
return this.sessionId;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get the project hash
|
|
31
|
+
*/
|
|
32
|
+
getProjectHash() {
|
|
33
|
+
return this.projectHash;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Save session memory
|
|
37
|
+
*/
|
|
38
|
+
saveMemory(memory, metadata) {
|
|
39
|
+
const sessionDir = this.getSessionDir();
|
|
40
|
+
const fullMetadata = {
|
|
41
|
+
sessionId: this.sessionId,
|
|
42
|
+
projectPath: "",
|
|
43
|
+
// Will be set by caller
|
|
44
|
+
projectHash: this.projectHash,
|
|
45
|
+
createdAt: Date.now(),
|
|
46
|
+
updatedAt: Date.now(),
|
|
47
|
+
messageCount: 0,
|
|
48
|
+
...this.loadMetadata(),
|
|
49
|
+
...metadata
|
|
50
|
+
};
|
|
51
|
+
writeFileSync(
|
|
52
|
+
join(sessionDir, "session_memory.json"),
|
|
53
|
+
JSON.stringify(memory, null, 2)
|
|
54
|
+
);
|
|
55
|
+
writeFileSync(
|
|
56
|
+
join(sessionDir, "metadata.json"),
|
|
57
|
+
JSON.stringify(fullMetadata, null, 2)
|
|
58
|
+
);
|
|
59
|
+
if (memory.decisions.length > 0) {
|
|
60
|
+
writeFileSync(
|
|
61
|
+
join(sessionDir, "decisions.json"),
|
|
62
|
+
JSON.stringify(memory.decisions, null, 2)
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Save full conversation (optional, for debugging/recovery)
|
|
68
|
+
*/
|
|
69
|
+
saveConversation(messages) {
|
|
70
|
+
const sessionDir = this.getSessionDir();
|
|
71
|
+
writeFileSync(
|
|
72
|
+
join(sessionDir, "conversation.json"),
|
|
73
|
+
JSON.stringify(messages, null, 2)
|
|
74
|
+
);
|
|
75
|
+
const metadata = this.loadMetadata();
|
|
76
|
+
if (metadata) {
|
|
77
|
+
metadata.messageCount = messages.length;
|
|
78
|
+
metadata.updatedAt = Date.now();
|
|
79
|
+
writeFileSync(
|
|
80
|
+
join(sessionDir, "metadata.json"),
|
|
81
|
+
JSON.stringify(metadata, null, 2)
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Load session memory
|
|
87
|
+
*/
|
|
88
|
+
loadMemory() {
|
|
89
|
+
const memoryPath = join(this.getSessionDir(), "session_memory.json");
|
|
90
|
+
if (!existsSync(memoryPath)) return null;
|
|
91
|
+
try {
|
|
92
|
+
const content = readFileSync(memoryPath, "utf-8");
|
|
93
|
+
return JSON.parse(content);
|
|
94
|
+
} catch {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Load session metadata
|
|
100
|
+
*/
|
|
101
|
+
loadMetadata() {
|
|
102
|
+
const metadataPath = join(this.getSessionDir(), "metadata.json");
|
|
103
|
+
if (!existsSync(metadataPath)) return null;
|
|
104
|
+
try {
|
|
105
|
+
const content = readFileSync(metadataPath, "utf-8");
|
|
106
|
+
return JSON.parse(content);
|
|
107
|
+
} catch {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Load conversation history
|
|
113
|
+
*/
|
|
114
|
+
loadConversation() {
|
|
115
|
+
const convoPath = join(this.getSessionDir(), "conversation.json");
|
|
116
|
+
if (!existsSync(convoPath)) return null;
|
|
117
|
+
try {
|
|
118
|
+
const content = readFileSync(convoPath, "utf-8");
|
|
119
|
+
return JSON.parse(content);
|
|
120
|
+
} catch {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Load decisions from current or previous session
|
|
126
|
+
*/
|
|
127
|
+
loadDecisions() {
|
|
128
|
+
const decisionsPath = join(this.getSessionDir(), "decisions.json");
|
|
129
|
+
if (!existsSync(decisionsPath)) return [];
|
|
130
|
+
try {
|
|
131
|
+
const content = readFileSync(decisionsPath, "utf-8");
|
|
132
|
+
return JSON.parse(content);
|
|
133
|
+
} catch {
|
|
134
|
+
return [];
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* List all sessions for current project
|
|
139
|
+
*/
|
|
140
|
+
listSessions() {
|
|
141
|
+
const projectDir = this.getProjectDir();
|
|
142
|
+
if (!existsSync(projectDir)) return [];
|
|
143
|
+
const sessions = [];
|
|
144
|
+
try {
|
|
145
|
+
const entries = readdirSync(projectDir, { withFileTypes: true });
|
|
146
|
+
for (const entry of entries) {
|
|
147
|
+
if (entry.isDirectory() && entry.name.startsWith("session-")) {
|
|
148
|
+
const metadataPath = join(projectDir, entry.name, "metadata.json");
|
|
149
|
+
if (existsSync(metadataPath)) {
|
|
150
|
+
try {
|
|
151
|
+
const content = readFileSync(metadataPath, "utf-8");
|
|
152
|
+
sessions.push(JSON.parse(content));
|
|
153
|
+
} catch {
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
} catch {
|
|
159
|
+
}
|
|
160
|
+
return sessions.sort((a, b) => b.updatedAt - a.updatedAt);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get the most recent session for current project
|
|
164
|
+
*/
|
|
165
|
+
getMostRecentSession() {
|
|
166
|
+
const sessions = this.listSessions();
|
|
167
|
+
if (sessions.length === 0) return null;
|
|
168
|
+
const mostRecent = sessions[0];
|
|
169
|
+
if (!mostRecent) return null;
|
|
170
|
+
const tempManager = new SessionMemoryManager("", mostRecent.sessionId);
|
|
171
|
+
Object.assign(tempManager, { projectHash: this.projectHash });
|
|
172
|
+
return {
|
|
173
|
+
metadata: mostRecent,
|
|
174
|
+
memory: tempManager.loadMemory() || {
|
|
175
|
+
summary: "",
|
|
176
|
+
decisions: [],
|
|
177
|
+
codeChanges: [],
|
|
178
|
+
toolUsageSummary: {},
|
|
179
|
+
focusAreas: [],
|
|
180
|
+
preservedContext: []
|
|
181
|
+
},
|
|
182
|
+
messages: tempManager.loadConversation() || void 0
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Clean up old sessions (keep only N most recent)
|
|
187
|
+
*/
|
|
188
|
+
cleanupOldSessions(keepCount = 5) {
|
|
189
|
+
const sessions = this.listSessions();
|
|
190
|
+
let cleaned = 0;
|
|
191
|
+
if (sessions.length <= keepCount) return 0;
|
|
192
|
+
const toDelete = sessions.slice(keepCount);
|
|
193
|
+
for (const session of toDelete) {
|
|
194
|
+
try {
|
|
195
|
+
const sessionDir = join(
|
|
196
|
+
this.getProjectDir(),
|
|
197
|
+
"session-" + session.sessionId
|
|
198
|
+
);
|
|
199
|
+
if (existsSync(sessionDir)) {
|
|
200
|
+
this.deleteDirectory(sessionDir);
|
|
201
|
+
cleaned++;
|
|
202
|
+
}
|
|
203
|
+
} catch {
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return cleaned;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Check if a session exists
|
|
210
|
+
*/
|
|
211
|
+
sessionExists() {
|
|
212
|
+
return existsSync(this.getSessionDir());
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Get session directory path
|
|
216
|
+
*/
|
|
217
|
+
getSessionDir() {
|
|
218
|
+
return join(this.getProjectDir(), "session-" + this.sessionId);
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Get project directory path
|
|
222
|
+
*/
|
|
223
|
+
getProjectDir() {
|
|
224
|
+
return join(this.baseDir, this.projectHash);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Ensure required directories exist
|
|
228
|
+
*/
|
|
229
|
+
ensureDirectories() {
|
|
230
|
+
const sessionDir = this.getSessionDir();
|
|
231
|
+
if (!existsSync(sessionDir)) {
|
|
232
|
+
mkdirSync(sessionDir, { recursive: true });
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Hash a path to create a safe directory name
|
|
237
|
+
*/
|
|
238
|
+
hashPath(path) {
|
|
239
|
+
const normalized = resolve(path).toLowerCase();
|
|
240
|
+
return crypto.createHash("sha256").update(normalized).digest("hex").slice(0, 16);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Recursively delete a directory
|
|
244
|
+
*/
|
|
245
|
+
deleteDirectory(dirPath) {
|
|
246
|
+
if (!existsSync(dirPath)) return;
|
|
247
|
+
const entries = readdirSync(dirPath, { withFileTypes: true });
|
|
248
|
+
for (const entry of entries) {
|
|
249
|
+
const fullPath = join(dirPath, entry.name);
|
|
250
|
+
if (entry.isDirectory()) {
|
|
251
|
+
this.deleteDirectory(fullPath);
|
|
252
|
+
} else {
|
|
253
|
+
unlinkSync(fullPath);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
rmdirSync(dirPath);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
function createSessionMemory(projectPath, sessionId) {
|
|
260
|
+
return new SessionMemoryManager(projectPath, sessionId);
|
|
261
|
+
}
|
|
262
|
+
export {
|
|
263
|
+
SessionMemoryManager,
|
|
264
|
+
createSessionMemory
|
|
265
|
+
};
|
|
266
|
+
//# sourceMappingURL=sessionMemory.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/services/sessionMemory.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Session Memory Service\n *\n * Provides persistent session memory for context compression.\n * Stores compressed contexts, decisions, and session metadata.\n *\n * Storage structure:\n * ~/.minto/projects/\n * <project-hash>/\n * session-<uuid>/\n * session_memory.json # Compressed context\n * conversation.json # Full conversation (optional)\n * decisions.json # Key decisions\n * metadata.json # Session metadata\n */\n\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n readdirSync,\n unlinkSync,\n rmdirSync,\n} from 'fs'\nimport { join, resolve } from 'path'\nimport { homedir } from 'os'\nimport crypto from 'crypto'\nimport type { Message } from '@query'\nimport type {\n ExtractedDecision,\n ExtractedCodeChange,\n} from './intelligentCompactor'\n\n/**\n * Session metadata\n */\nexport interface SessionMetadata {\n sessionId: string\n projectPath: string\n projectHash: string\n createdAt: number\n updatedAt: number\n messageCount: number\n compressedAt?: number\n compressionRatio?: number\n focusArea?: string\n}\n\n/**\n * Session memory data\n */\nexport interface SessionMemoryData {\n summary: string\n decisions: ExtractedDecision[]\n codeChanges: ExtractedCodeChange[]\n toolUsageSummary: Record<string, number>\n focusAreas: string[]\n preservedContext: string[]\n}\n\n/**\n * Full session record\n */\nexport interface SessionRecord {\n metadata: SessionMetadata\n memory: SessionMemoryData\n messages?: Message[]\n}\n\n/**\n * Session Memory Manager\n */\nexport class SessionMemoryManager {\n private baseDir: string\n private projectHash: string\n private sessionId: string\n\n constructor(projectPath: string, sessionId?: string) {\n this.baseDir = join(homedir(), '.minto', 'projects')\n this.projectHash = this.hashPath(projectPath)\n this.sessionId = sessionId || crypto.randomUUID()\n this.ensureDirectories()\n }\n\n /**\n * Get the session ID\n */\n getSessionId(): string {\n return this.sessionId\n }\n\n /**\n * Get the project hash\n */\n getProjectHash(): string {\n return this.projectHash\n }\n\n /**\n * Save session memory\n */\n saveMemory(\n memory: SessionMemoryData,\n metadata?: Partial<SessionMetadata>,\n ): void {\n const sessionDir = this.getSessionDir()\n\n const fullMetadata: SessionMetadata = {\n sessionId: this.sessionId,\n projectPath: '', // Will be set by caller\n projectHash: this.projectHash,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n messageCount: 0,\n ...this.loadMetadata(),\n ...metadata,\n }\n\n // Save memory\n writeFileSync(\n join(sessionDir, 'session_memory.json'),\n JSON.stringify(memory, null, 2),\n )\n\n // Save metadata\n writeFileSync(\n join(sessionDir, 'metadata.json'),\n JSON.stringify(fullMetadata, null, 2),\n )\n\n // Save decisions separately for quick access\n if (memory.decisions.length > 0) {\n writeFileSync(\n join(sessionDir, 'decisions.json'),\n JSON.stringify(memory.decisions, null, 2),\n )\n }\n }\n\n /**\n * Save full conversation (optional, for debugging/recovery)\n */\n saveConversation(messages: Message[]): void {\n const sessionDir = this.getSessionDir()\n writeFileSync(\n join(sessionDir, 'conversation.json'),\n JSON.stringify(messages, null, 2),\n )\n\n // Update metadata\n const metadata = this.loadMetadata()\n if (metadata) {\n metadata.messageCount = messages.length\n metadata.updatedAt = Date.now()\n writeFileSync(\n join(sessionDir, 'metadata.json'),\n JSON.stringify(metadata, null, 2),\n )\n }\n }\n\n /**\n * Load session memory\n */\n loadMemory(): SessionMemoryData | null {\n const memoryPath = join(this.getSessionDir(), 'session_memory.json')\n if (!existsSync(memoryPath)) return null\n\n try {\n const content = readFileSync(memoryPath, 'utf-8')\n return JSON.parse(content) as SessionMemoryData\n } catch {\n return null\n }\n }\n\n /**\n * Load session metadata\n */\n loadMetadata(): SessionMetadata | null {\n const metadataPath = join(this.getSessionDir(), 'metadata.json')\n if (!existsSync(metadataPath)) return null\n\n try {\n const content = readFileSync(metadataPath, 'utf-8')\n return JSON.parse(content) as SessionMetadata\n } catch {\n return null\n }\n }\n\n /**\n * Load conversation history\n */\n loadConversation(): Message[] | null {\n const convoPath = join(this.getSessionDir(), 'conversation.json')\n if (!existsSync(convoPath)) return null\n\n try {\n const content = readFileSync(convoPath, 'utf-8')\n return JSON.parse(content) as Message[]\n } catch {\n return null\n }\n }\n\n /**\n * Load decisions from current or previous session\n */\n loadDecisions(): ExtractedDecision[] {\n const decisionsPath = join(this.getSessionDir(), 'decisions.json')\n if (!existsSync(decisionsPath)) return []\n\n try {\n const content = readFileSync(decisionsPath, 'utf-8')\n return JSON.parse(content) as ExtractedDecision[]\n } catch {\n return []\n }\n }\n\n /**\n * List all sessions for current project\n */\n listSessions(): SessionMetadata[] {\n const projectDir = this.getProjectDir()\n if (!existsSync(projectDir)) return []\n\n const sessions: SessionMetadata[] = []\n\n try {\n const entries = readdirSync(projectDir, { withFileTypes: true })\n for (const entry of entries) {\n if (entry.isDirectory() && entry.name.startsWith('session-')) {\n const metadataPath = join(projectDir, entry.name, 'metadata.json')\n if (existsSync(metadataPath)) {\n try {\n const content = readFileSync(metadataPath, 'utf-8')\n sessions.push(JSON.parse(content) as SessionMetadata)\n } catch {\n // Skip invalid session\n }\n }\n }\n }\n } catch {\n // Return empty if directory cannot be read\n }\n\n return sessions.sort((a, b) => b.updatedAt - a.updatedAt)\n }\n\n /**\n * Get the most recent session for current project\n */\n getMostRecentSession(): SessionRecord | null {\n const sessions = this.listSessions()\n if (sessions.length === 0) return null\n\n const mostRecent = sessions[0]\n if (!mostRecent) return null\n\n const tempManager = new SessionMemoryManager('', mostRecent.sessionId)\n // Hack to use the same project dir\n Object.assign(tempManager, { projectHash: this.projectHash })\n\n return {\n metadata: mostRecent,\n memory: tempManager.loadMemory() || {\n summary: '',\n decisions: [],\n codeChanges: [],\n toolUsageSummary: {},\n focusAreas: [],\n preservedContext: [],\n },\n messages: tempManager.loadConversation() || undefined,\n }\n }\n\n /**\n * Clean up old sessions (keep only N most recent)\n */\n cleanupOldSessions(keepCount: number = 5): number {\n const sessions = this.listSessions()\n let cleaned = 0\n\n if (sessions.length <= keepCount) return 0\n\n const toDelete = sessions.slice(keepCount)\n for (const session of toDelete) {\n try {\n const sessionDir = join(\n this.getProjectDir(),\n 'session-' + session.sessionId,\n )\n if (existsSync(sessionDir)) {\n // Simple recursive delete using fs\n this.deleteDirectory(sessionDir)\n cleaned++\n }\n } catch {\n // Continue with other sessions\n }\n }\n\n return cleaned\n }\n\n /**\n * Check if a session exists\n */\n sessionExists(): boolean {\n return existsSync(this.getSessionDir())\n }\n\n /**\n * Get session directory path\n */\n private getSessionDir(): string {\n return join(this.getProjectDir(), 'session-' + this.sessionId)\n }\n\n /**\n * Get project directory path\n */\n private getProjectDir(): string {\n return join(this.baseDir, this.projectHash)\n }\n\n /**\n * Ensure required directories exist\n */\n private ensureDirectories(): void {\n const sessionDir = this.getSessionDir()\n if (!existsSync(sessionDir)) {\n mkdirSync(sessionDir, { recursive: true })\n }\n }\n\n /**\n * Hash a path to create a safe directory name\n */\n private hashPath(path: string): string {\n const normalized = resolve(path).toLowerCase()\n return crypto\n .createHash('sha256')\n .update(normalized)\n .digest('hex')\n .slice(0, 16)\n }\n\n /**\n * Recursively delete a directory\n */\n private deleteDirectory(dirPath: string): void {\n if (!existsSync(dirPath)) return\n\n const entries = readdirSync(dirPath, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = join(dirPath, entry.name)\n if (entry.isDirectory()) {\n this.deleteDirectory(fullPath)\n } else {\n unlinkSync(fullPath)\n }\n }\n rmdirSync(dirPath)\n }\n}\n\n/**\n * Create a session memory manager for the current project\n */\nexport function createSessionMemory(\n projectPath: string,\n sessionId?: string,\n): SessionMemoryManager {\n return new SessionMemoryManager(projectPath, sessionId)\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import { getModelManager } from "../utils/model.js";
|
|
2
|
+
const DEFAULT_ROUTING_RULES = [
|
|
3
|
+
// Simple tasks → fast model
|
|
4
|
+
{ pattern: "simple-query", model: "haiku", priority: 1 },
|
|
5
|
+
{ pattern: "simple-generation", model: "haiku", priority: 1 },
|
|
6
|
+
// Moderate tasks → balanced model
|
|
7
|
+
{ pattern: "moderate-query", model: "sonnet", priority: 2 },
|
|
8
|
+
{ pattern: "moderate-generation", model: "sonnet", priority: 2 },
|
|
9
|
+
{ pattern: "moderate-review", model: "sonnet", priority: 2 },
|
|
10
|
+
{ pattern: "moderate-refactor", model: "sonnet", priority: 2 },
|
|
11
|
+
{ pattern: "moderate-debug", model: "sonnet", priority: 2 },
|
|
12
|
+
// Complex tasks → powerful model
|
|
13
|
+
{ pattern: "complex-reasoning", model: "opus", priority: 3 },
|
|
14
|
+
{ pattern: "complex-architecture", model: "opus", priority: 3 },
|
|
15
|
+
{ pattern: "complex-generation", model: "opus", priority: 3 },
|
|
16
|
+
{ pattern: "complex-creative", model: "opus", priority: 3 },
|
|
17
|
+
// Specific task types
|
|
18
|
+
{ pattern: "*-architecture", model: "opus", priority: 0 },
|
|
19
|
+
{ pattern: "*-reasoning", model: "opus", priority: 0 },
|
|
20
|
+
{ pattern: "*-review", model: "sonnet", priority: 1 },
|
|
21
|
+
{ pattern: "*-debug", model: "sonnet", priority: 1 }
|
|
22
|
+
];
|
|
23
|
+
const ANALYSIS_PATTERNS = [
|
|
24
|
+
// Query patterns
|
|
25
|
+
{
|
|
26
|
+
name: "question",
|
|
27
|
+
patterns: [
|
|
28
|
+
/\b(what|how|why|when|where|who|which|can you explain)\b/i,
|
|
29
|
+
/\?$/,
|
|
30
|
+
/\b(tell me|show me|help me understand)\b/i
|
|
31
|
+
],
|
|
32
|
+
type: "query",
|
|
33
|
+
complexityWeight: -0.2
|
|
34
|
+
},
|
|
35
|
+
// Generation patterns
|
|
36
|
+
{
|
|
37
|
+
name: "generation",
|
|
38
|
+
patterns: [
|
|
39
|
+
/\b(create|generate|write|build|implement|add|make)\b/i,
|
|
40
|
+
/\b(new|feature|function|class|component|module)\b/i
|
|
41
|
+
],
|
|
42
|
+
type: "generation",
|
|
43
|
+
complexityWeight: 0.1
|
|
44
|
+
},
|
|
45
|
+
// Review patterns
|
|
46
|
+
{
|
|
47
|
+
name: "review",
|
|
48
|
+
patterns: [
|
|
49
|
+
/\b(review|check|analyze|examine|inspect|audit)\b/i,
|
|
50
|
+
/\b(code review|pull request|pr|merge)\b/i
|
|
51
|
+
],
|
|
52
|
+
type: "review",
|
|
53
|
+
complexityWeight: 0
|
|
54
|
+
},
|
|
55
|
+
// Reasoning patterns
|
|
56
|
+
{
|
|
57
|
+
name: "reasoning",
|
|
58
|
+
patterns: [
|
|
59
|
+
/\b(think|reason|consider|evaluate|compare|decide)\b/i,
|
|
60
|
+
/\b(trade-?off|pros and cons|best approach|optimal)\b/i,
|
|
61
|
+
/\b(algorithm|complexity|performance|efficiency)\b/i
|
|
62
|
+
],
|
|
63
|
+
type: "reasoning",
|
|
64
|
+
complexityWeight: 0.3
|
|
65
|
+
},
|
|
66
|
+
// Creative patterns
|
|
67
|
+
{
|
|
68
|
+
name: "creative",
|
|
69
|
+
patterns: [
|
|
70
|
+
/\b(creative|brainstorm|innovative|design|imagine)\b/i,
|
|
71
|
+
/\b(suggest|propose|come up with|ideas)\b/i
|
|
72
|
+
],
|
|
73
|
+
type: "creative",
|
|
74
|
+
complexityWeight: 0.2
|
|
75
|
+
},
|
|
76
|
+
// Refactoring patterns
|
|
77
|
+
{
|
|
78
|
+
name: "refactor",
|
|
79
|
+
patterns: [
|
|
80
|
+
/\b(refactor|restructure|reorganize|clean up|improve)\b/i,
|
|
81
|
+
/\b(optimize|simplify|modularize|extract)\b/i
|
|
82
|
+
],
|
|
83
|
+
type: "refactor",
|
|
84
|
+
complexityWeight: 0.15
|
|
85
|
+
},
|
|
86
|
+
// Debug patterns
|
|
87
|
+
{
|
|
88
|
+
name: "debug",
|
|
89
|
+
patterns: [
|
|
90
|
+
/\b(debug|fix|error|bug|issue|problem|crash)\b/i,
|
|
91
|
+
/\b(broken|doesn't work|failing|wrong)\b/i,
|
|
92
|
+
/\b(stack trace|exception|undefined|null)\b/i
|
|
93
|
+
],
|
|
94
|
+
type: "debug",
|
|
95
|
+
complexityWeight: 0.1
|
|
96
|
+
},
|
|
97
|
+
// Architecture patterns
|
|
98
|
+
{
|
|
99
|
+
name: "architecture",
|
|
100
|
+
patterns: [
|
|
101
|
+
/\b(architect|design|system|infrastructure|scale)\b/i,
|
|
102
|
+
/\b(microservice|monolith|distributed|database)\b/i,
|
|
103
|
+
/\b(api design|schema|data model|integration)\b/i
|
|
104
|
+
],
|
|
105
|
+
type: "architecture",
|
|
106
|
+
complexityWeight: 0.4
|
|
107
|
+
}
|
|
108
|
+
];
|
|
109
|
+
const COMPLEXITY_INDICATORS = {
|
|
110
|
+
simple: [
|
|
111
|
+
/\b(simple|quick|basic|easy|trivial|small)\b/i,
|
|
112
|
+
/\b(one line|single|just|only)\b/i
|
|
113
|
+
],
|
|
114
|
+
complex: [
|
|
115
|
+
/\b(complex|difficult|challenging|advanced|comprehensive)\b/i,
|
|
116
|
+
/\b(entire|whole|all|complete|full|extensive)\b/i,
|
|
117
|
+
/\b(multiple|several|many|various)\b/i,
|
|
118
|
+
/\b(system|platform|framework|infrastructure)\b/i
|
|
119
|
+
]
|
|
120
|
+
};
|
|
121
|
+
class TaskRouter {
|
|
122
|
+
routingRules = /* @__PURE__ */ new Map();
|
|
123
|
+
modelManager = getModelManager();
|
|
124
|
+
customRules = [];
|
|
125
|
+
constructor(customRules) {
|
|
126
|
+
this.loadRules(DEFAULT_ROUTING_RULES);
|
|
127
|
+
if (customRules) {
|
|
128
|
+
this.customRules = customRules;
|
|
129
|
+
this.loadRules(customRules);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Load routing rules into the map
|
|
134
|
+
*/
|
|
135
|
+
loadRules(rules) {
|
|
136
|
+
const sorted = [...rules].sort((a, b) => a.priority - b.priority);
|
|
137
|
+
for (const rule of sorted) {
|
|
138
|
+
this.routingRules.set(rule.pattern, rule.model);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Analyze a task and return detailed analysis
|
|
143
|
+
*/
|
|
144
|
+
analyzeTask(task) {
|
|
145
|
+
const detectedPatterns = [];
|
|
146
|
+
let complexityScore = 0.5;
|
|
147
|
+
let primaryType = "query";
|
|
148
|
+
let typeMatchCount = 0;
|
|
149
|
+
for (const pattern of ANALYSIS_PATTERNS) {
|
|
150
|
+
let matches = 0;
|
|
151
|
+
for (const regex of pattern.patterns) {
|
|
152
|
+
if (regex.test(task)) {
|
|
153
|
+
matches++;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (matches > 0) {
|
|
157
|
+
detectedPatterns.push(pattern.name);
|
|
158
|
+
complexityScore += pattern.complexityWeight * (matches / pattern.patterns.length);
|
|
159
|
+
if (matches > typeMatchCount) {
|
|
160
|
+
typeMatchCount = matches;
|
|
161
|
+
primaryType = pattern.type;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
for (const regex of COMPLEXITY_INDICATORS.simple) {
|
|
166
|
+
if (regex.test(task)) {
|
|
167
|
+
complexityScore -= 0.2;
|
|
168
|
+
detectedPatterns.push("simple-indicator");
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
for (const regex of COMPLEXITY_INDICATORS.complex) {
|
|
172
|
+
if (regex.test(task)) {
|
|
173
|
+
complexityScore += 0.2;
|
|
174
|
+
detectedPatterns.push("complex-indicator");
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
const wordCount = task.split(/\s+/).length;
|
|
178
|
+
if (wordCount < 10) {
|
|
179
|
+
complexityScore -= 0.1;
|
|
180
|
+
} else if (wordCount > 50) {
|
|
181
|
+
complexityScore += 0.1;
|
|
182
|
+
} else if (wordCount > 100) {
|
|
183
|
+
complexityScore += 0.2;
|
|
184
|
+
}
|
|
185
|
+
complexityScore = Math.max(0, Math.min(1, complexityScore));
|
|
186
|
+
let complexity;
|
|
187
|
+
if (complexityScore < 0.35) {
|
|
188
|
+
complexity = "simple";
|
|
189
|
+
} else if (complexityScore < 0.65) {
|
|
190
|
+
complexity = "moderate";
|
|
191
|
+
} else {
|
|
192
|
+
complexity = "complex";
|
|
193
|
+
}
|
|
194
|
+
const estimatedInputTokens = Math.ceil(task.length / 4);
|
|
195
|
+
const estimatedOutputTokens = this.estimateOutputTokens(
|
|
196
|
+
complexity,
|
|
197
|
+
primaryType
|
|
198
|
+
);
|
|
199
|
+
const suggestedModel = this.route(complexity, primaryType);
|
|
200
|
+
const confidence = typeMatchCount > 0 ? Math.min(
|
|
201
|
+
1,
|
|
202
|
+
0.5 + typeMatchCount * 0.15 + detectedPatterns.length * 0.05
|
|
203
|
+
) : 0.5;
|
|
204
|
+
return {
|
|
205
|
+
complexity,
|
|
206
|
+
type: primaryType,
|
|
207
|
+
estimatedInputTokens,
|
|
208
|
+
estimatedOutputTokens,
|
|
209
|
+
suggestedModel,
|
|
210
|
+
confidence,
|
|
211
|
+
detectedPatterns: [...new Set(detectedPatterns)]
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Route a task to the appropriate model
|
|
216
|
+
*/
|
|
217
|
+
route(complexity, type) {
|
|
218
|
+
const exactKey = `${complexity}-${type}`;
|
|
219
|
+
if (this.routingRules.has(exactKey)) {
|
|
220
|
+
return this.routingRules.get(exactKey);
|
|
221
|
+
}
|
|
222
|
+
const wildcardKey = `*-${type}`;
|
|
223
|
+
if (this.routingRules.has(wildcardKey)) {
|
|
224
|
+
return this.routingRules.get(wildcardKey);
|
|
225
|
+
}
|
|
226
|
+
switch (complexity) {
|
|
227
|
+
case "simple":
|
|
228
|
+
return "haiku";
|
|
229
|
+
case "moderate":
|
|
230
|
+
return "sonnet";
|
|
231
|
+
case "complex":
|
|
232
|
+
return "opus";
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Route a task directly from task text
|
|
237
|
+
*/
|
|
238
|
+
routeTask(task) {
|
|
239
|
+
const analysis = this.analyzeTask(task);
|
|
240
|
+
return analysis.suggestedModel;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Estimate output tokens based on task type and complexity
|
|
244
|
+
*/
|
|
245
|
+
estimateOutputTokens(complexity, type) {
|
|
246
|
+
const baseTokens = {
|
|
247
|
+
query: 200,
|
|
248
|
+
generation: 500,
|
|
249
|
+
review: 400,
|
|
250
|
+
reasoning: 600,
|
|
251
|
+
creative: 400,
|
|
252
|
+
refactor: 800,
|
|
253
|
+
debug: 500,
|
|
254
|
+
architecture: 1e3
|
|
255
|
+
};
|
|
256
|
+
const multipliers = {
|
|
257
|
+
simple: 0.5,
|
|
258
|
+
moderate: 1,
|
|
259
|
+
complex: 2
|
|
260
|
+
};
|
|
261
|
+
return Math.ceil(baseTokens[type] * multipliers[complexity]);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Add a custom routing rule
|
|
265
|
+
*/
|
|
266
|
+
addRule(rule) {
|
|
267
|
+
this.customRules.push(rule);
|
|
268
|
+
this.routingRules.set(rule.pattern, rule.model);
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Remove a routing rule
|
|
272
|
+
*/
|
|
273
|
+
removeRule(pattern) {
|
|
274
|
+
const index = this.customRules.findIndex((r) => r.pattern === pattern);
|
|
275
|
+
if (index >= 0) {
|
|
276
|
+
this.customRules.splice(index, 1);
|
|
277
|
+
this.routingRules.delete(pattern);
|
|
278
|
+
return true;
|
|
279
|
+
}
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Get all current routing rules
|
|
284
|
+
*/
|
|
285
|
+
getRules() {
|
|
286
|
+
return [...DEFAULT_ROUTING_RULES, ...this.customRules];
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Get cost estimate for a task
|
|
290
|
+
*/
|
|
291
|
+
estimateCost(task) {
|
|
292
|
+
const analysis = this.analyzeTask(task);
|
|
293
|
+
return {
|
|
294
|
+
model: analysis.suggestedModel,
|
|
295
|
+
estimatedInputTokens: analysis.estimatedInputTokens,
|
|
296
|
+
estimatedOutputTokens: analysis.estimatedOutputTokens,
|
|
297
|
+
estimatedTotalTokens: analysis.estimatedInputTokens + analysis.estimatedOutputTokens
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
let routerInstance = null;
|
|
302
|
+
function getTaskRouter() {
|
|
303
|
+
if (!routerInstance) {
|
|
304
|
+
routerInstance = new TaskRouter();
|
|
305
|
+
}
|
|
306
|
+
return routerInstance;
|
|
307
|
+
}
|
|
308
|
+
function resetTaskRouter() {
|
|
309
|
+
routerInstance = null;
|
|
310
|
+
}
|
|
311
|
+
function routeTask(task) {
|
|
312
|
+
return getTaskRouter().routeTask(task);
|
|
313
|
+
}
|
|
314
|
+
function analyzeTask(task) {
|
|
315
|
+
return getTaskRouter().analyzeTask(task);
|
|
316
|
+
}
|
|
317
|
+
export {
|
|
318
|
+
TaskRouter,
|
|
319
|
+
analyzeTask,
|
|
320
|
+
getTaskRouter,
|
|
321
|
+
resetTaskRouter,
|
|
322
|
+
routeTask
|
|
323
|
+
};
|
|
324
|
+
//# sourceMappingURL=taskRouter.js.map
|