@within-7/minto 0.4.1 → 0.4.2
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/dist/Tool.js +7 -0
- package/dist/Tool.js.map +2 -2
- package/dist/commands/agents/AgentsCommand.js +1 -1
- package/dist/commands/agents/AgentsCommand.js.map +2 -2
- package/dist/commands/agents/constants.js +2 -2
- package/dist/commands/agents/constants.js.map +2 -2
- package/dist/commands/clear.js +4 -3
- package/dist/commands/clear.js.map +2 -2
- package/dist/commands/compact.js +2 -2
- package/dist/commands/compact.js.map +1 -1
- package/dist/commands/context.js +3 -1
- package/dist/commands/context.js.map +2 -2
- package/dist/commands/login.js +128 -0
- package/dist/commands/login.js.map +7 -0
- package/dist/commands/memory.js +33 -82
- package/dist/commands/memory.js.map +2 -2
- package/dist/commands/quit.js +3 -1
- package/dist/commands/quit.js.map +2 -2
- package/dist/commands/resume.js +39 -239
- package/dist/commands/resume.js.map +2 -2
- package/dist/commands/tasks.js +1 -1
- package/dist/commands/tasks.js.map +2 -2
- package/dist/commands/terminalSetup.js +6 -2
- package/dist/commands/terminalSetup.js.map +2 -2
- package/dist/commands.js +2 -0
- package/dist/commands.js.map +2 -2
- package/dist/components/AgentDetailView.js +126 -0
- package/dist/components/AgentDetailView.js.map +7 -0
- package/dist/components/AgentThinkingBlock.js +1 -1
- package/dist/components/AgentThinkingBlock.js.map +2 -2
- package/dist/components/AgentViewBanner.js +22 -0
- package/dist/components/AgentViewBanner.js.map +7 -0
- package/dist/components/HeaderBar.js +1 -1
- package/dist/components/HeaderBar.js.map +2 -2
- package/dist/components/Help.js +8 -1
- package/dist/components/Help.js.map +2 -2
- package/dist/components/HotkeyHelpPanel.js +26 -8
- package/dist/components/HotkeyHelpPanel.js.map +2 -2
- package/dist/components/IdleNotificationBar.js +10 -0
- package/dist/components/IdleNotificationBar.js.map +7 -0
- package/dist/components/ModelSelector/ModelSelector.js +55 -20
- package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
- package/dist/components/PromptInput.js +186 -115
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/RewindPanel.js +272 -0
- package/dist/components/RewindPanel.js.map +7 -0
- package/dist/components/Spinner.js +10 -21
- package/dist/components/Spinner.js.map +2 -2
- package/dist/components/StreamingTextPreview.js +29 -0
- package/dist/components/StreamingTextPreview.js.map +7 -0
- package/dist/components/SubagentBlock.js +3 -2
- package/dist/components/SubagentBlock.js.map +2 -2
- package/dist/components/SubagentProgress.js +4 -4
- package/dist/components/SubagentProgress.js.map +2 -2
- package/dist/components/TabbedListView/SearchInput.js +1 -1
- package/dist/components/TabbedListView/SearchInput.js.map +2 -2
- package/dist/components/TabbedListView/TabbedListView.js +87 -41
- package/dist/components/TabbedListView/TabbedListView.js.map +2 -2
- package/dist/components/TaskCard.js +4 -4
- package/dist/components/TaskCard.js.map +2 -2
- package/dist/components/TeamMemberPanel.js +107 -0
- package/dist/components/TeamMemberPanel.js.map +7 -0
- package/dist/components/ThinkingSelector.js +84 -0
- package/dist/components/ThinkingSelector.js.map +7 -0
- package/dist/components/TitledDivider.js +26 -0
- package/dist/components/TitledDivider.js.map +7 -0
- package/dist/components/TodoPanel.js +31 -30
- package/dist/components/TodoPanel.js.map +2 -2
- package/dist/components/TokenWarning.js +28 -7
- package/dist/components/TokenWarning.js.map +2 -2
- package/dist/components/messages/AssistantTextMessage.js +5 -2
- package/dist/components/messages/AssistantTextMessage.js.map +2 -2
- package/dist/components/messages/AssistantToolUseMessage.js +9 -1
- package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
- package/dist/components/messages/DefaultToolResultFallback.js +11 -0
- package/dist/components/messages/DefaultToolResultFallback.js.map +7 -0
- package/dist/components/messages/ParallelTasksGroupView.js +14 -6
- package/dist/components/messages/ParallelTasksGroupView.js.map +2 -2
- package/dist/components/messages/TaskInModuleView.js +27 -27
- package/dist/components/messages/TaskInModuleView.js.map +2 -2
- package/dist/components/messages/UserGuidanceMessage.js +26 -0
- package/dist/components/messages/UserGuidanceMessage.js.map +7 -0
- package/dist/components/messages/UserPromptMessage.js +2 -1
- package/dist/components/messages/UserPromptMessage.js.map +2 -2
- package/dist/components/messages/UserTeamNotificationMessage.js +91 -0
- package/dist/components/messages/UserTeamNotificationMessage.js.map +7 -0
- package/dist/components/messages/UserTextMessage.js +8 -0
- package/dist/components/messages/UserTextMessage.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js +4 -2
- package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js +18 -1
- package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +12 -1
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
- package/dist/components/permissions/PermissionRequest.js +4 -0
- package/dist/components/permissions/PermissionRequest.js.map +2 -2
- package/dist/components/permissions/PlanApprovalRequest.js +164 -0
- package/dist/components/permissions/PlanApprovalRequest.js.map +7 -0
- package/dist/constants/agentTeams.js +17 -0
- package/dist/constants/agentTeams.js.map +7 -0
- package/dist/constants/macros.js +2 -1
- package/dist/constants/macros.js.map +2 -2
- package/dist/constants/prompts/agentPrompt.js +1 -0
- package/dist/constants/prompts/agentPrompt.js.map +2 -2
- package/dist/constants/prompts/autoMemory.js +39 -0
- package/dist/constants/prompts/autoMemory.js.map +7 -0
- package/dist/constants/prompts/codeConventions.js +1 -13
- package/dist/constants/prompts/codeConventions.js.map +2 -2
- package/dist/constants/prompts/doingTasks.js +21 -2
- package/dist/constants/prompts/doingTasks.js.map +2 -2
- package/dist/constants/prompts/envInfo.js +6 -7
- package/dist/constants/prompts/envInfo.js.map +2 -2
- package/dist/constants/prompts/index.js +27 -5
- package/dist/constants/prompts/index.js.map +2 -2
- package/dist/constants/prompts/taskManagement.js +2 -43
- package/dist/constants/prompts/taskManagement.js.map +2 -2
- package/dist/constants/prompts/teamOverlays.js +50 -0
- package/dist/constants/prompts/teamOverlays.js.map +7 -0
- package/dist/constants/prompts/toneAndStyle.js +4 -29
- package/dist/constants/prompts/toneAndStyle.js.map +2 -2
- package/dist/constants/prompts/toolUsagePolicy.js +7 -22
- package/dist/constants/prompts/toolUsagePolicy.js.map +2 -2
- package/dist/constants/toolInputExamples.js +2 -2
- package/dist/constants/toolInputExamples.js.map +2 -2
- package/dist/context.js +39 -6
- package/dist/context.js.map +2 -2
- package/dist/core/backupManager.js +1 -1
- package/dist/core/backupManager.js.map +2 -2
- package/dist/core/permissions/rules/planModeRule.js +1 -1
- package/dist/core/permissions/rules/planModeRule.js.map +1 -1
- package/dist/core/permissions/rules/safeModeRule.js +1 -1
- package/dist/core/permissions/rules/safeModeRule.js.map +1 -1
- package/dist/engine/AgentEngine.js +902 -0
- package/dist/engine/AgentEngine.js.map +7 -0
- package/dist/engine/EngineRegistry.js +89 -0
- package/dist/engine/EngineRegistry.js.map +7 -0
- package/dist/engine/foregroundAdapter.js +191 -0
- package/dist/engine/foregroundAdapter.js.map +7 -0
- package/dist/engine/index.js +15 -0
- package/dist/engine/index.js.map +7 -0
- package/dist/engine/types.js +1 -0
- package/dist/engine/types.js.map +7 -0
- package/dist/entrypoints/cli.js +410 -79
- package/dist/entrypoints/cli.js.map +3 -3
- package/dist/hooks/useAgentEngine.js +129 -0
- package/dist/hooks/useAgentEngine.js.map +7 -0
- package/dist/hooks/useAgentTokenStats.js +0 -16
- package/dist/hooks/useAgentTokenStats.js.map +2 -2
- package/dist/hooks/useCanUseTool.js +47 -2
- package/dist/hooks/useCanUseTool.js.map +2 -2
- package/dist/hooks/useDeferredLoading.js +4 -1
- package/dist/hooks/useDeferredLoading.js.map +2 -2
- package/dist/hooks/useIdleNotifications.js +66 -0
- package/dist/hooks/useIdleNotifications.js.map +7 -0
- package/dist/hooks/useSessionTracking.js +9 -7
- package/dist/hooks/useSessionTracking.js.map +2 -2
- package/dist/hooks/useTeamMembers.js +51 -0
- package/dist/hooks/useTeamMembers.js.map +7 -0
- package/dist/i18n/locales/en.js +77 -12
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.js +77 -12
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/i18n/types.js.map +1 -1
- package/dist/messages.js.map +2 -2
- package/dist/permissions.js +113 -7
- package/dist/permissions.js.map +2 -2
- package/dist/query.js +135 -37
- package/dist/query.js.map +2 -2
- package/dist/screens/REPL.js +504 -361
- package/dist/screens/REPL.js.map +3 -3
- package/dist/screens/ResumeConversation.js +199 -14
- package/dist/screens/ResumeConversation.js.map +2 -2
- package/dist/services/adapters/base.js.map +1 -1
- package/dist/services/agentTeams/backends/headless.js +108 -0
- package/dist/services/agentTeams/backends/headless.js.map +7 -0
- package/dist/services/agentTeams/backends/inProcess.js +102 -0
- package/dist/services/agentTeams/backends/inProcess.js.map +7 -0
- package/dist/services/agentTeams/backends/resolver.js +18 -0
- package/dist/services/agentTeams/backends/resolver.js.map +7 -0
- package/dist/services/agentTeams/backends/tmux.js +168 -0
- package/dist/services/agentTeams/backends/tmux.js.map +7 -0
- package/dist/services/agentTeams/backends/types.js +1 -0
- package/dist/services/agentTeams/backends/types.js.map +7 -0
- package/dist/services/agentTeams/heartbeat.js +88 -0
- package/dist/services/agentTeams/heartbeat.js.map +7 -0
- package/dist/services/agentTeams/index.js +42 -2
- package/dist/services/agentTeams/index.js.map +2 -2
- package/dist/services/agentTeams/injectionChannel.js +105 -0
- package/dist/services/agentTeams/injectionChannel.js.map +7 -0
- package/dist/services/agentTeams/mailbox.js +410 -30
- package/dist/services/agentTeams/mailbox.js.map +2 -2
- package/dist/services/agentTeams/messageFormatter.js +80 -0
- package/dist/services/agentTeams/messageFormatter.js.map +7 -0
- package/dist/services/agentTeams/permissionDelegation.js +71 -0
- package/dist/services/agentTeams/permissionDelegation.js.map +7 -0
- package/dist/services/agentTeams/teamEvents.js +45 -0
- package/dist/services/agentTeams/teamEvents.js.map +7 -0
- package/dist/services/agentTeams/teamManager.js +251 -34
- package/dist/services/agentTeams/teamManager.js.map +2 -2
- package/dist/services/agentTeams/teamTaskStore.js +290 -61
- package/dist/services/agentTeams/teamTaskStore.js.map +2 -2
- package/dist/services/agentTeams/teammateSpawner.js +99 -18
- package/dist/services/agentTeams/teammateSpawner.js.map +2 -2
- package/dist/services/hookExecutor.js +51 -8
- package/dist/services/hookExecutor.js.map +2 -2
- package/dist/services/llm/anthropicProvider.js +56 -59
- package/dist/services/llm/anthropicProvider.js.map +2 -2
- package/dist/services/llm/dispatch.js +24 -5
- package/dist/services/llm/dispatch.js.map +2 -2
- package/dist/services/llm/openaiProvider.js +115 -136
- package/dist/services/llm/openaiProvider.js.map +3 -3
- package/dist/services/llm/types.js +89 -15
- package/dist/services/llm/types.js.map +2 -2
- package/dist/services/mcpClient.js +80 -4
- package/dist/services/mcpClient.js.map +2 -2
- package/dist/services/mintoAuth.js +299 -0
- package/dist/services/mintoAuth.js.map +7 -0
- package/dist/services/oauth.js +3 -3
- package/dist/services/oauth.js.map +2 -2
- package/dist/services/openai.js +91 -20
- package/dist/services/openai.js.map +2 -2
- package/dist/services/plugins/pluginRuntime.js +11 -5
- package/dist/services/plugins/pluginRuntime.js.map +2 -2
- package/dist/services/plugins/pluginValidation.js +4 -2
- package/dist/services/plugins/pluginValidation.js.map +2 -2
- package/dist/services/sandbox/sandboxController.js +11 -3
- package/dist/services/sandbox/sandboxController.js.map +2 -2
- package/dist/services/sessionMemoryInjector.js +77 -0
- package/dist/services/sessionMemoryInjector.js.map +7 -0
- package/dist/services/systemReminder.js +130 -8
- package/dist/services/systemReminder.js.map +2 -2
- package/dist/services/taskStore.js +199 -8
- package/dist/services/taskStore.js.map +3 -3
- package/dist/services/topicDetector.js +169 -0
- package/dist/services/topicDetector.js.map +7 -0
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +0 -13
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
- package/dist/tools/BashTool/BashTool.js +51 -28
- package/dist/tools/BashTool/BashTool.js.map +2 -2
- package/dist/tools/BashTool/prompt.js +95 -118
- package/dist/tools/BashTool/prompt.js.map +2 -2
- package/dist/tools/BashTool/utils.js +39 -1
- package/dist/tools/BashTool/utils.js.map +2 -2
- package/dist/tools/EnterWorktreeTool/EnterWorktreeTool.js +121 -0
- package/dist/tools/EnterWorktreeTool/EnterWorktreeTool.js.map +7 -0
- package/dist/tools/EnterWorktreeTool/prompt.js +22 -0
- package/dist/tools/EnterWorktreeTool/prompt.js.map +7 -0
- package/dist/tools/FileEditTool/FileEditTool.js +9 -4
- package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
- package/dist/tools/FileEditTool/prompt.js +3 -7
- package/dist/tools/FileEditTool/prompt.js.map +2 -2
- package/dist/tools/FileReadTool/FileReadTool.js +125 -3
- package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
- package/dist/tools/FileReadTool/prompt.js +1 -2
- package/dist/tools/FileReadTool/prompt.js.map +2 -2
- package/dist/tools/FileWriteTool/prompt.js +3 -5
- package/dist/tools/FileWriteTool/prompt.js.map +2 -2
- package/dist/tools/GlobTool/GlobTool.js +3 -2
- package/dist/tools/GlobTool/GlobTool.js.map +2 -2
- package/dist/tools/GrepTool/GrepTool.js +16 -5
- package/dist/tools/GrepTool/GrepTool.js.map +2 -2
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +2 -2
- package/dist/tools/MCPSearchTool/MCPSearchTool.js +172 -0
- package/dist/tools/MCPSearchTool/MCPSearchTool.js.map +7 -0
- package/dist/tools/MCPSearchTool/prompt.js +77 -0
- package/dist/tools/MCPSearchTool/prompt.js.map +7 -0
- package/dist/tools/MultiEditTool/prompt.js +4 -7
- package/dist/tools/MultiEditTool/prompt.js.map +2 -2
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js +12 -8
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js +54 -1
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
- package/dist/tools/PlanModeTool/prompt.js +23 -74
- package/dist/tools/PlanModeTool/prompt.js.map +2 -2
- package/dist/tools/SendMessageTool/SendMessageTool.js +341 -0
- package/dist/tools/SendMessageTool/SendMessageTool.js.map +7 -0
- package/dist/tools/SendMessageTool/prompt.js +44 -0
- package/dist/tools/SendMessageTool/prompt.js.map +7 -0
- package/dist/tools/TaskCreateTool/prompt.js +15 -4
- package/dist/tools/TaskCreateTool/prompt.js.map +2 -2
- package/dist/tools/TaskListTool/prompt.js +18 -3
- package/dist/tools/TaskListTool/prompt.js.map +2 -2
- package/dist/tools/TaskOutputTool/prompt.js +4 -3
- package/dist/tools/TaskOutputTool/prompt.js.map +2 -2
- package/dist/tools/TaskTool/TaskTool.js +762 -98
- package/dist/tools/TaskTool/TaskTool.js.map +3 -3
- package/dist/tools/TaskTool/constants.js +8 -2
- package/dist/tools/TaskTool/constants.js.map +2 -2
- package/dist/tools/TaskTool/prompt.js +74 -70
- package/dist/tools/TaskTool/prompt.js.map +2 -2
- package/dist/tools/TaskUpdateTool/TaskUpdateTool.js +15 -1
- package/dist/tools/TaskUpdateTool/TaskUpdateTool.js.map +2 -2
- package/dist/tools/TeamCreateTool/TeamCreateTool.js +129 -0
- package/dist/tools/TeamCreateTool/TeamCreateTool.js.map +7 -0
- package/dist/tools/TeamCreateTool/prompt.js +58 -0
- package/dist/tools/TeamCreateTool/prompt.js.map +7 -0
- package/dist/tools/TeamDeleteTool/TeamDeleteTool.js +151 -0
- package/dist/tools/TeamDeleteTool/TeamDeleteTool.js.map +7 -0
- package/dist/tools/TeamDeleteTool/prompt.js +16 -0
- package/dist/tools/TeamDeleteTool/prompt.js.map +7 -0
- package/dist/tools/URLFetcherTool/URLFetcherTool.js +106 -15
- package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/prompt.js +3 -2
- package/dist/tools/URLFetcherTool/prompt.js.map +2 -2
- package/dist/tools/WebSearchTool/WebSearchTool.js +2 -1
- package/dist/tools/WebSearchTool/WebSearchTool.js.map +2 -2
- package/dist/tools/WebSearchTool/prompt.js +5 -4
- package/dist/tools/WebSearchTool/prompt.js.map +2 -2
- package/dist/tools.js +100 -20
- package/dist/tools.js.map +2 -2
- package/dist/types/PermissionMode.js +35 -6
- package/dist/types/PermissionMode.js.map +2 -2
- package/dist/types/hooks.js +2 -0
- package/dist/types/hooks.js.map +2 -2
- package/dist/types/plugin.js +2 -0
- package/dist/types/plugin.js.map +3 -3
- package/dist/utils/CircuitBreaker.js +15 -9
- package/dist/utils/CircuitBreaker.js.map +2 -2
- package/dist/utils/agentLoader.js +249 -112
- package/dist/utils/agentLoader.js.map +2 -2
- package/dist/utils/animationManager.js +40 -3
- package/dist/utils/animationManager.js.map +2 -2
- package/dist/utils/ask.js +7 -6
- package/dist/utils/ask.js.map +2 -2
- package/dist/utils/atomicWrite.js +23 -0
- package/dist/utils/atomicWrite.js.map +7 -0
- package/dist/utils/autoCompactCore.js +73 -56
- package/dist/utils/autoCompactCore.js.map +2 -2
- package/dist/utils/autoMemoryPaths.js +89 -0
- package/dist/utils/autoMemoryPaths.js.map +7 -0
- package/dist/utils/config.js +63 -38
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/configSchema.js +13 -8
- package/dist/utils/configSchema.js.map +2 -2
- package/dist/utils/credentials/index.js +14 -0
- package/dist/utils/credentials/index.js.map +2 -2
- package/dist/utils/dualPath.js +24 -0
- package/dist/utils/dualPath.js.map +7 -0
- package/dist/utils/exit.js +66 -7
- package/dist/utils/exit.js.map +2 -2
- package/dist/utils/externalEditor.js +155 -0
- package/dist/utils/externalEditor.js.map +7 -0
- package/dist/utils/fileLock.js +67 -0
- package/dist/utils/fileLock.js.map +7 -0
- package/dist/utils/format.js +24 -14
- package/dist/utils/format.js.map +2 -2
- package/dist/utils/globalErrorHandler.js +5 -96
- package/dist/utils/globalErrorHandler.js.map +3 -3
- package/dist/utils/groupHandlers/parallelTasksHandler.js +5 -3
- package/dist/utils/groupHandlers/parallelTasksHandler.js.map +2 -2
- package/dist/utils/groupHandlers/taskHandler.js +2 -2
- package/dist/utils/groupHandlers/taskHandler.js.map +2 -2
- package/dist/utils/hookManager.js +64 -6
- package/dist/utils/hookManager.js.map +2 -2
- package/dist/utils/log.js +6 -2
- package/dist/utils/log.js.map +2 -2
- package/dist/utils/markdown.js +237 -19
- package/dist/utils/markdown.js.map +2 -2
- package/dist/utils/messageContextManager.js +18 -5
- package/dist/utils/messageContextManager.js.map +2 -2
- package/dist/utils/messageGroupManager.js +1 -1
- package/dist/utils/messageGroupManager.js.map +2 -2
- package/dist/utils/messages.js +104 -46
- package/dist/utils/messages.js.map +2 -2
- package/dist/utils/model.js +2 -2
- package/dist/utils/model.js.map +2 -2
- package/dist/utils/pasteCache.js +8 -4
- package/dist/utils/pasteCache.js.map +2 -2
- package/dist/utils/pluginLoader.js +18 -0
- package/dist/utils/pluginLoader.js.map +2 -2
- package/dist/utils/secureKeyStorage.js +36 -7
- package/dist/utils/secureKeyStorage.js.map +2 -2
- package/dist/utils/simpleMode.js +7 -0
- package/dist/utils/simpleMode.js.map +7 -0
- package/dist/utils/streamingState.js +11 -1
- package/dist/utils/streamingState.js.map +2 -2
- package/dist/utils/taskDisplayUtils.js +2 -1
- package/dist/utils/taskDisplayUtils.js.map +2 -2
- package/dist/utils/teamConfig.js +2 -2
- package/dist/utils/teamConfig.js.map +2 -2
- package/dist/utils/thinking.js +6 -2
- package/dist/utils/thinking.js.map +3 -3
- package/dist/utils/tokenProgress.js +55 -0
- package/dist/utils/tokenProgress.js.map +7 -0
- package/dist/utils/toolRiskClassification.js +26 -17
- package/dist/utils/toolRiskClassification.js.map +2 -2
- package/dist/utils/tooling/toolError.js +12 -0
- package/dist/utils/tooling/toolError.js.map +7 -0
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +10 -8
|
@@ -14,9 +14,9 @@ const FOLDER_CONFIG = {
|
|
|
14
14
|
const TOOL_CATEGORIES = {
|
|
15
15
|
read: ["Read", "Glob", "Grep", "LS"],
|
|
16
16
|
edit: ["Edit", "MultiEdit", "Write", "NotebookEdit"],
|
|
17
|
-
execution: ["Bash", "
|
|
17
|
+
execution: ["Bash", "TaskOutput", "TaskStop"],
|
|
18
18
|
web: ["WebFetch", "WebSearch"],
|
|
19
|
-
other: ["TodoWrite", "ExitPlanMode", "
|
|
19
|
+
other: ["TodoWrite", "ExitPlanMode", "Agent"]
|
|
20
20
|
};
|
|
21
21
|
const AGENT_COLORS = [
|
|
22
22
|
{ name: "Default", value: null, color: void 0 },
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/commands/agents/constants.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Constants for the agents command\n */\nimport { AGENT_LOCATIONS } from './types'\n\n// Re-export for convenience\nexport { AGENT_LOCATIONS }\n\nexport const UI_ICONS = {\n pointer: '\u276F',\n checkboxOn: '\u2611',\n checkboxOff: '\u2610',\n warning: '\u26A0',\n separator: '\u2500',\n loading: '\u25D0\u25D1\u25D2\u25D3',\n} as const\n\nexport const FOLDER_CONFIG = {\n FOLDER_NAME: '.minto',\n AGENTS_DIR: 'agents',\n} as const\n\n// Tool categories for sophisticated selection\nexport const TOOL_CATEGORIES = {\n read: ['Read', 'Glob', 'Grep', 'LS'],\n edit: ['Edit', 'MultiEdit', 'Write', 'NotebookEdit'],\n execution: ['Bash', '
|
|
5
|
-
"mappings": "AAGA,SAAS,uBAAuB;AAKzB,MAAM,WAAW;AAAA,EACtB,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,EACX,SAAS;AACX;AAEO,MAAM,gBAAgB;AAAA,EAC3B,aAAa;AAAA,EACb,YAAY;AACd;AAGO,MAAM,kBAAkB;AAAA,EAC7B,MAAM,CAAC,QAAQ,QAAQ,QAAQ,IAAI;AAAA,EACnC,MAAM,CAAC,QAAQ,aAAa,SAAS,cAAc;AAAA,EACnD,WAAW,CAAC,QAAQ,cAAc,UAAU;AAAA,EAC5C,KAAK,CAAC,YAAY,WAAW;AAAA,EAC7B,OAAO,CAAC,aAAa,gBAAgB,
|
|
4
|
+
"sourcesContent": ["/**\n * Constants for the agents command\n */\nimport { AGENT_LOCATIONS } from './types'\n\n// Re-export for convenience\nexport { AGENT_LOCATIONS }\n\nexport const UI_ICONS = {\n pointer: '\u276F',\n checkboxOn: '\u2611',\n checkboxOff: '\u2610',\n warning: '\u26A0',\n separator: '\u2500',\n loading: '\u25D0\u25D1\u25D2\u25D3',\n} as const\n\nexport const FOLDER_CONFIG = {\n FOLDER_NAME: '.minto',\n AGENTS_DIR: 'agents',\n} as const\n\n// Tool categories for sophisticated selection\nexport const TOOL_CATEGORIES = {\n read: ['Read', 'Glob', 'Grep', 'LS'],\n edit: ['Edit', 'MultiEdit', 'Write', 'NotebookEdit'],\n execution: ['Bash', 'TaskOutput', 'TaskStop'],\n web: ['WebFetch', 'WebSearch'],\n other: ['TodoWrite', 'ExitPlanMode', 'Agent'],\n} as const\n\n// Agent color options\nexport const AGENT_COLORS = [\n { name: 'Default', value: null, color: undefined },\n { name: 'Blue', value: 'blue', color: 'blue' },\n { name: 'Green', value: 'green', color: 'green' },\n { name: 'Yellow', value: 'yellow', color: 'yellow' },\n { name: 'Red', value: 'red', color: 'red' },\n { name: 'Magenta', value: 'magenta', color: 'magenta' },\n { name: 'Cyan', value: 'cyan', color: 'cyan' },\n] as const\n\nexport const INITIAL_CREATE_STATE = {\n location: null,\n agentType: '',\n method: null,\n generationPrompt: '',\n whenToUse: '',\n selectedTools: [],\n selectedModel: null,\n selectedColor: null,\n systemPrompt: '',\n isGenerating: false,\n wasGenerated: false,\n isAIGenerated: false,\n error: null,\n warnings: [],\n agentTypeCursor: 0,\n whenToUseCursor: 0,\n promptCursor: 0,\n generationPromptCursor: 0,\n} as const\n"],
|
|
5
|
+
"mappings": "AAGA,SAAS,uBAAuB;AAKzB,MAAM,WAAW;AAAA,EACtB,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,EACX,SAAS;AACX;AAEO,MAAM,gBAAgB;AAAA,EAC3B,aAAa;AAAA,EACb,YAAY;AACd;AAGO,MAAM,kBAAkB;AAAA,EAC7B,MAAM,CAAC,QAAQ,QAAQ,QAAQ,IAAI;AAAA,EACnC,MAAM,CAAC,QAAQ,aAAa,SAAS,cAAc;AAAA,EACnD,WAAW,CAAC,QAAQ,cAAc,UAAU;AAAA,EAC5C,KAAK,CAAC,YAAY,WAAW;AAAA,EAC7B,OAAO,CAAC,aAAa,gBAAgB,OAAO;AAC9C;AAGO,MAAM,eAAe;AAAA,EAC1B,EAAE,MAAM,WAAW,OAAO,MAAM,OAAO,OAAU;AAAA,EACjD,EAAE,MAAM,QAAQ,OAAO,QAAQ,OAAO,OAAO;AAAA,EAC7C,EAAE,MAAM,SAAS,OAAO,SAAS,OAAO,QAAQ;AAAA,EAChD,EAAE,MAAM,UAAU,OAAO,UAAU,OAAO,SAAS;AAAA,EACnD,EAAE,MAAM,OAAO,OAAO,OAAO,OAAO,MAAM;AAAA,EAC1C,EAAE,MAAM,WAAW,OAAO,WAAW,OAAO,UAAU;AAAA,EACtD,EAAE,MAAM,QAAQ,OAAO,QAAQ,OAAO,OAAO;AAC/C;AAEO,MAAM,uBAAuB;AAAA,EAClC,UAAU;AAAA,EACV,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,eAAe,CAAC;AAAA,EAChB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,eAAe;AAAA,EACf,OAAO;AAAA,EACP,UAAU,CAAC;AAAA,EACX,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,wBAAwB;AAC1B;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/commands/clear.js
CHANGED
|
@@ -6,10 +6,10 @@ import { getOriginalCwd, setCwd } from "../utils/state.js";
|
|
|
6
6
|
import { resetReminderSession } from "../services/systemReminder.js";
|
|
7
7
|
import { resetFileFreshnessSession } from "../services/fileFreshness.js";
|
|
8
8
|
import { clearTodos, deleteSessionTodos } from "../utils/todoStorage.js";
|
|
9
|
+
import { resetStreamingState } from "../utils/streamingState.js";
|
|
9
10
|
async function clearConversation(context) {
|
|
10
11
|
await clearTerminal();
|
|
11
12
|
getMessagesSetter()([]);
|
|
12
|
-
context.setForkConvoWithMessagesOnTheNextRender([]);
|
|
13
13
|
getContext.cache.clear?.();
|
|
14
14
|
getCodeStyle.cache.clear?.();
|
|
15
15
|
await setCwd(getOriginalCwd());
|
|
@@ -17,6 +17,7 @@ async function clearConversation(context) {
|
|
|
17
17
|
resetFileFreshnessSession();
|
|
18
18
|
clearTodos();
|
|
19
19
|
deleteSessionTodos();
|
|
20
|
+
resetStreamingState();
|
|
20
21
|
}
|
|
21
22
|
const clear = {
|
|
22
23
|
type: "local",
|
|
@@ -25,8 +26,8 @@ const clear = {
|
|
|
25
26
|
isEnabled: true,
|
|
26
27
|
isHidden: false,
|
|
27
28
|
async call(_, context) {
|
|
28
|
-
clearConversation(context);
|
|
29
|
-
return
|
|
29
|
+
await clearConversation(context);
|
|
30
|
+
return null;
|
|
30
31
|
},
|
|
31
32
|
userFacingName() {
|
|
32
33
|
return "clear";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/clear.ts"],
|
|
4
|
-
"sourcesContent": ["import { Command } from '@commands'\nimport { getMessagesSetter } from '@messages'\nimport { getContext } from '@context'\nimport { getCodeStyle } from '@utils/style'\nimport { clearTerminal } from '@utils/terminal'\nimport { getOriginalCwd, setCwd } from '@utils/state'\nimport { Message } from '@query'\nimport { resetReminderSession } from '@services/systemReminder'\nimport { resetFileFreshnessSession } from '@services/fileFreshness'\nimport { clearTodos, deleteSessionTodos } from '@utils/todoStorage'\n\nexport async function clearConversation(context: {\n setForkConvoWithMessagesOnTheNextRender: (\n forkConvoWithMessages: Message[],\n ) => void\n}) {\n await clearTerminal()\n getMessagesSetter()([])\n
|
|
5
|
-
"mappings": "AACA,SAAS,yBAAyB;AAClC,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB,cAAc;AAEvC,SAAS,4BAA4B;AACrC,SAAS,iCAAiC;AAC1C,SAAS,YAAY,0BAA0B;
|
|
4
|
+
"sourcesContent": ["import { Command } from '@commands'\nimport { getMessagesSetter } from '@messages'\nimport { getContext } from '@context'\nimport { getCodeStyle } from '@utils/style'\nimport { clearTerminal } from '@utils/terminal'\nimport { getOriginalCwd, setCwd } from '@utils/state'\nimport { Message } from '@query'\nimport { resetReminderSession } from '@services/systemReminder'\nimport { resetFileFreshnessSession } from '@services/fileFreshness'\nimport { clearTodos, deleteSessionTodos } from '@utils/todoStorage'\nimport { resetStreamingState } from '@utils/streamingState'\n\n/**\n * Clear conversation state: terminal, engine messages, caches, sessions.\n * Does NOT set forkConvo \u2014 callers handle Static remount themselves\n * (/clear sets localOnly echo messages, /new unmounts and creates a new REPL).\n */\nexport async function clearConversation(context: {\n setForkConvoWithMessagesOnTheNextRender: (\n forkConvoWithMessages: Message[],\n ) => void\n}) {\n await clearTerminal()\n getMessagesSetter()([])\n getContext.cache.clear?.()\n getCodeStyle.cache.clear?.()\n await setCwd(getOriginalCwd())\n\n // Reset reminder and file freshness sessions to clean up state\n resetReminderSession()\n resetFileFreshnessSession()\n\n // Clear todos when clearing conversation - user is abandoning the current task\n clearTodos()\n deleteSessionTodos()\n\n // Reset streaming state so timer and token counts start fresh\n resetStreamingState()\n}\n\nconst clear = {\n type: 'local',\n name: 'clear',\n description: 'Clear conversation history and free up context',\n isEnabled: true,\n isHidden: false,\n async call(_, context) {\n await clearConversation(context)\n return null // Echo is handled via forkMessages, not command return\n },\n userFacingName() {\n return 'clear'\n },\n} satisfies Command\n\nexport default clear\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,yBAAyB;AAClC,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB,cAAc;AAEvC,SAAS,4BAA4B;AACrC,SAAS,iCAAiC;AAC1C,SAAS,YAAY,0BAA0B;AAC/C,SAAS,2BAA2B;AAOpC,eAAsB,kBAAkB,SAIrC;AACD,QAAM,cAAc;AACpB,oBAAkB,EAAE,CAAC,CAAC;AACtB,aAAW,MAAM,QAAQ;AACzB,eAAa,MAAM,QAAQ;AAC3B,QAAM,OAAO,eAAe,CAAC;AAG7B,uBAAqB;AACrB,4BAA0B;AAG1B,aAAW;AACX,qBAAmB;AAGnB,sBAAoB;AACtB;AAEA,MAAM,QAAQ;AAAA,EACZ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,MAAM,KAAK,GAAG,SAAS;AACrB,UAAM,kBAAkB,OAAO;AAC/B,WAAO;AAAA,EACT;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AACF;AAEA,IAAO,gBAAQ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/commands/compact.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/compact.ts"],
|
|
4
|
-
"sourcesContent": ["import { Command } from '@commands'\nimport { getContext } from '@context'\nimport { getMessagesGetter, getMessagesSetter } from '@messages'\nimport { API_ERROR_MESSAGE_PREFIX, queryLLM } from '@services/claude'\nimport { createUserMessage, normalizeMessagesForAPI } from '@utils/messages'\nimport { getCodeStyle } from '@utils/style'\nimport { clearTerminal } from '@utils/terminal'\nimport { resetReminderSession } from '@services/systemReminder'\nimport { resetFileFreshnessSession } from '@services/fileFreshness'\nimport { getCompressionPrompt } from '@constants/compressionPrompts'\nimport {\n getCompressionMode,\n getCompressionModeDescription,\n} from '@utils/compressionMode'\nimport { getIntelligentCompactor } from '@services/intelligentCompactor'\nimport { createSessionMemory } from '@services/sessionMemory'\nimport { getContextMonitor } from '@services/contextMonitor'\n\nconst compact = {\n type: 'local',\n name: 'compact',\n description: 'Clear conversation history but keep a summary in context',\n isEnabled: true,\n isHidden: false,\n async call(\n _,\n {\n options: { tools },\n abortController,\n setForkConvoWithMessagesOnTheNextRender,\n },\n ) {\n const messages = getMessagesGetter()()\n\n // Get the compression prompt based on current mode (business or code)\n const compressionMode = getCompressionMode()\n const compressionPrompt = getCompressionPrompt(compressionMode)\n const modeDescription = getCompressionModeDescription(compressionMode)\n\n // Use intelligent compactor to extract decisions and code changes\n const compactor = getIntelligentCompactor()\n const compactResult = await compactor.compact(messages, {\n preserveDecisions: true,\n preserveCodeChanges: true,\n summarizeTools: true,\n })\n\n const summaryRequest = createUserMessage(compressionPrompt)\n\n const summaryResponse = await queryLLM(\n normalizeMessagesForAPI([...messages, summaryRequest]),\n [\n 'You are a helpful AI assistant tasked with creating comprehensive conversation summaries that preserve all essential context for continuing development work.',\n ],\n 0,\n tools,\n abortController.signal,\n {\n safeMode: false,\n model: '
|
|
4
|
+
"sourcesContent": ["import { Command } from '@commands'\nimport { getContext } from '@context'\nimport { getMessagesGetter, getMessagesSetter } from '@messages'\nimport { API_ERROR_MESSAGE_PREFIX, queryLLM } from '@services/claude'\nimport { createUserMessage, normalizeMessagesForAPI } from '@utils/messages'\nimport { getCodeStyle } from '@utils/style'\nimport { clearTerminal } from '@utils/terminal'\nimport { resetReminderSession } from '@services/systemReminder'\nimport { resetFileFreshnessSession } from '@services/fileFreshness'\nimport { getCompressionPrompt } from '@constants/compressionPrompts'\nimport {\n getCompressionMode,\n getCompressionModeDescription,\n} from '@utils/compressionMode'\nimport { getIntelligentCompactor } from '@services/intelligentCompactor'\nimport { createSessionMemory } from '@services/sessionMemory'\nimport { getContextMonitor } from '@services/contextMonitor'\n\nconst compact = {\n type: 'local',\n name: 'compact',\n description: 'Clear conversation history but keep a summary in context',\n isEnabled: true,\n isHidden: false,\n async call(\n _,\n {\n options: { tools },\n abortController,\n setForkConvoWithMessagesOnTheNextRender,\n },\n ) {\n const messages = getMessagesGetter()()\n\n // Get the compression prompt based on current mode (business or code)\n const compressionMode = getCompressionMode()\n const compressionPrompt = getCompressionPrompt(compressionMode)\n const modeDescription = getCompressionModeDescription(compressionMode)\n\n // Use intelligent compactor to extract decisions and code changes\n const compactor = getIntelligentCompactor()\n const compactResult = await compactor.compact(messages, {\n preserveDecisions: true,\n preserveCodeChanges: true,\n summarizeTools: true,\n })\n\n const summaryRequest = createUserMessage(compressionPrompt)\n\n const summaryResponse = await queryLLM(\n normalizeMessagesForAPI([...messages, summaryRequest]),\n [\n 'You are a helpful AI assistant tasked with creating comprehensive conversation summaries that preserve all essential context for continuing development work.',\n ],\n 0,\n tools,\n abortController.signal,\n {\n safeMode: false,\n model: 'compact', // Use compact model pointer for cheaper compression\n prependCLISysprompt: true,\n },\n )\n\n const content = summaryResponse.message.content\n const summary =\n typeof content === 'string'\n ? content\n : content.length > 0 && content[0]?.type === 'text'\n ? content[0].text\n : null\n\n if (!summary) {\n throw new Error(\n `Failed to generate conversation summary - response did not contain valid text content - ${summaryResponse}`,\n )\n } else if (summary.startsWith(API_ERROR_MESSAGE_PREFIX)) {\n throw new Error(summary)\n }\n\n summaryResponse.message.usage = {\n input_tokens: 0,\n output_tokens: summaryResponse.message.usage.output_tokens,\n cache_creation_input_tokens: 0,\n cache_read_input_tokens: 0,\n }\n\n // Save session memory for persistence\n try {\n const cwd = process.cwd()\n const sessionMemory = createSessionMemory(cwd)\n sessionMemory.saveMemory(\n {\n summary,\n decisions: compactResult.decisions,\n codeChanges: compactResult.codeChanges,\n toolUsageSummary: compactResult.toolSummaries.reduce(\n (acc, t) => ({ ...acc, [t.toolName]: t.invocationCount }),\n {} as Record<string, number>,\n ),\n focusAreas: compactResult.focusSummary\n ? [compactResult.focusSummary]\n : [],\n preservedContext: [],\n },\n {\n projectPath: cwd,\n messageCount: messages.length,\n compressedAt: Date.now(),\n compressionRatio: compactResult.compressionRatio,\n },\n )\n // Optionally save full conversation for debugging/recovery\n sessionMemory.saveConversation(messages)\n // Cleanup old sessions (keep last 5)\n sessionMemory.cleanupOldSessions(5)\n } catch (e) {\n // Non-critical: session memory save failure should not block compression\n console.error('Failed to save session memory:', e)\n }\n\n await clearTerminal()\n getMessagesSetter()([])\n setForkConvoWithMessagesOnTheNextRender([\n createUserMessage(\n `Context has been compressed using ${compressionMode === 'business' ? '9-section Business Consulting' : '8-section Code Development'} algorithm. Mode: ${modeDescription}. All essential information has been preserved for seamless continuation.`,\n ),\n summaryResponse,\n ])\n getContext.cache.clear?.()\n getCodeStyle.cache.clear?.()\n resetFileFreshnessSession()\n\n // Reset reminder and file freshness sessions to clean up state\n resetReminderSession()\n\n // Reset context monitor cooldown after manual compact\n getContextMonitor().resetCooldown()\n\n return '' // not used, just for typesafety. TODO: avoid this hack\n },\n userFacingName() {\n return 'compact'\n },\n} satisfies Command\n\nexport default compact\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/commands/context.js
CHANGED
|
@@ -15,14 +15,16 @@ function formatTokens(tokens) {
|
|
|
15
15
|
return tokens.toString();
|
|
16
16
|
}
|
|
17
17
|
function estimateRemainingTurns(usedTokens, maxTokens, messageCount) {
|
|
18
|
+
if (maxTokens <= 0) return 0;
|
|
18
19
|
if (messageCount < 2) return Math.floor((maxTokens - usedTokens) / 2e3);
|
|
19
20
|
const avgPerTurn = usedTokens / (messageCount / 2);
|
|
21
|
+
if (avgPerTurn <= 0) return 0;
|
|
20
22
|
const remaining = maxTokens - usedTokens;
|
|
21
23
|
return Math.max(0, Math.floor(remaining / avgPerTurn));
|
|
22
24
|
}
|
|
23
25
|
function buildSections(tokenInfo) {
|
|
24
26
|
const { usedTokens, maxTokens, messageCount, modelName } = tokenInfo;
|
|
25
|
-
const percent = Math.min(100, usedTokens / maxTokens * 100);
|
|
27
|
+
const percent = maxTokens > 0 ? Math.min(100, usedTokens / maxTokens * 100) : 0;
|
|
26
28
|
const remainingTurns = estimateRemainingTurns(
|
|
27
29
|
usedTokens,
|
|
28
30
|
maxTokens,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/context.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * Context Visualization Command\n *\n * Shows a visual representation of current context usage\n * with token counts, progress bars, and estimates.\n * Uses InfoPanel for consistent UI.\n */\n\nimport React from 'react'\nimport type { Command } from '@commands'\nimport type { Tool } from '@tool'\nimport { getMessagesGetter } from '@messages'\nimport { countTokens } from '@utils/tokens'\nimport { getModelManager } from '@utils/model'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport { InfoPanel } from '@components/InfoPanel'\nimport type { InfoSection, InfoItem } from '@components/InfoPanel'\nimport { t } from '@i18n'\n\n/**\n * Format token count with k/M suffix\n */\nfunction formatTokens(tokens: number): string {\n if (tokens >= 1_000_000) {\n return `${(tokens / 1_000_000).toFixed(1)}M`\n }\n if (tokens >= 1000) {\n return `${(tokens / 1000).toFixed(1)}k`\n }\n return tokens.toString()\n}\n\n/**\n * Estimate remaining turns based on average token usage\n */\nfunction estimateRemainingTurns(\n usedTokens: number,\n maxTokens: number,\n messageCount: number,\n): number {\n if (messageCount < 2) return Math.floor((maxTokens - usedTokens) / 2000)\n const avgPerTurn = usedTokens / (messageCount / 2)\n const remaining = maxTokens - usedTokens\n return Math.max(0, Math.floor(remaining / avgPerTurn))\n}\n\nfunction buildSections(tokenInfo: {\n usedTokens: number\n maxTokens: number\n messageCount: number\n modelName: string\n}): InfoSection[] {\n const { usedTokens, maxTokens, messageCount, modelName } = tokenInfo\n const percent
|
|
5
|
-
"mappings": "AAQA,OAAO,WAAW;AAGlB,SAAS,yBAAyB;AAClC,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAChC,SAAS,uBAAuB;AAChC,SAAS,iBAAiB;AAE1B,SAAS,SAAS;AAKlB,SAAS,aAAa,QAAwB;AAC5C,MAAI,UAAU,KAAW;AACvB,WAAO,IAAI,SAAS,KAAW,QAAQ,CAAC,CAAC;AAAA,EAC3C;AACA,MAAI,UAAU,KAAM;AAClB,WAAO,IAAI,SAAS,KAAM,QAAQ,CAAC,CAAC;AAAA,EACtC;AACA,SAAO,OAAO,SAAS;AACzB;AAKA,SAAS,uBACP,YACA,WACA,cACQ;AACR,MAAI,eAAe,EAAG,QAAO,KAAK,OAAO,YAAY,cAAc,GAAI;AACvE,QAAM,aAAa,cAAc,eAAe;AAChD,QAAM,YAAY,YAAY;AAC9B,SAAO,KAAK,IAAI,GAAG,KAAK,MAAM,YAAY,UAAU,CAAC;AACvD;AAEA,SAAS,cAAc,WAKL;AAChB,QAAM,EAAE,YAAY,WAAW,cAAc,UAAU,IAAI;AAC3D,QAAM,
|
|
4
|
+
"sourcesContent": ["/**\n * Context Visualization Command\n *\n * Shows a visual representation of current context usage\n * with token counts, progress bars, and estimates.\n * Uses InfoPanel for consistent UI.\n */\n\nimport React from 'react'\nimport type { Command } from '@commands'\nimport type { Tool } from '@tool'\nimport { getMessagesGetter } from '@messages'\nimport { countTokens } from '@utils/tokens'\nimport { getModelManager } from '@utils/model'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport { InfoPanel } from '@components/InfoPanel'\nimport type { InfoSection, InfoItem } from '@components/InfoPanel'\nimport { t } from '@i18n'\n\n/**\n * Format token count with k/M suffix\n */\nfunction formatTokens(tokens: number): string {\n if (tokens >= 1_000_000) {\n return `${(tokens / 1_000_000).toFixed(1)}M`\n }\n if (tokens >= 1000) {\n return `${(tokens / 1000).toFixed(1)}k`\n }\n return tokens.toString()\n}\n\n/**\n * Estimate remaining turns based on average token usage\n */\nfunction estimateRemainingTurns(\n usedTokens: number,\n maxTokens: number,\n messageCount: number,\n): number {\n if (maxTokens <= 0) return 0\n if (messageCount < 2) return Math.floor((maxTokens - usedTokens) / 2000)\n const avgPerTurn = usedTokens / (messageCount / 2)\n if (avgPerTurn <= 0) return 0\n const remaining = maxTokens - usedTokens\n return Math.max(0, Math.floor(remaining / avgPerTurn))\n}\n\nfunction buildSections(tokenInfo: {\n usedTokens: number\n maxTokens: number\n messageCount: number\n modelName: string\n}): InfoSection[] {\n const { usedTokens, maxTokens, messageCount, modelName } = tokenInfo\n const percent =\n maxTokens > 0 ? Math.min(100, (usedTokens / maxTokens) * 100) : 0\n const remainingTurns = estimateRemainingTurns(\n usedTokens,\n maxTokens,\n messageCount,\n )\n\n const items: InfoItem[] = [\n {\n label: t('commands.context.tokens'),\n value: `${formatTokens(usedTokens)} / ${formatTokens(maxTokens)}`,\n progress: { percent, width: 20 },\n },\n {\n label: t('commands.context.remaining'),\n value: `${formatTokens(maxTokens - usedTokens)} tokens`,\n },\n {\n label: t('commands.context.messages'),\n value: String(messageCount),\n },\n {\n label: t('commands.context.estTurns'),\n value: `~${remainingTurns}`,\n },\n ]\n\n // Warning items\n if (percent >= 95) {\n items.push({\n label: '\\u26A0',\n value: t('commands.context.criticalUsage'),\n valueColor: SEMANTIC_COLORS.error,\n })\n } else if (percent >= 70) {\n items.push({\n label: '\\u26A0',\n value: t('commands.context.highUsage'),\n valueColor: '#FFB86C',\n })\n }\n\n return [\n {\n title: t('commands.context.contextUsage'),\n items,\n },\n ]\n}\n\nconst command: Command = {\n name: 'context',\n description:\n 'Visualize current context usage with token counts and estimates',\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n type: 'local-jsx',\n aliases: ['ctx'],\n\n userFacingName() {\n return this.name\n },\n\n async call(onDone) {\n const messages = getMessagesGetter()()\n const usedTokens = countTokens(messages)\n\n let maxTokens = 200_000\n let modelName = 'unknown'\n\n try {\n const modelManager = getModelManager()\n const profile = modelManager.resolveModel('main')\n if (profile) {\n maxTokens = profile.contextLength || maxTokens\n modelName = profile.name || profile.modelName\n }\n } catch {\n // Use defaults\n }\n\n const sections = buildSections({\n usedTokens,\n maxTokens,\n messageCount: messages.length,\n modelName,\n })\n\n return (\n <InfoPanel\n title={t('commands.context.title')}\n subtitle={modelName}\n sections={sections}\n onClose={onDone}\n />\n )\n },\n}\n\nexport default command\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import React, { useState, useEffect, useCallback } from "react";
|
|
2
|
+
import { Box, Text, useInput } from "ink";
|
|
3
|
+
import TextInput from "ink-text-input";
|
|
4
|
+
import { SEMANTIC_COLORS } from "../constants/colors.js";
|
|
5
|
+
import { SimpleSpinner } from "../components/Spinner.js";
|
|
6
|
+
import { performLogin } from "../services/mintoAuth.js";
|
|
7
|
+
import { t } from "../i18n/index.js";
|
|
8
|
+
function LoginForm({
|
|
9
|
+
onDone,
|
|
10
|
+
initialUser,
|
|
11
|
+
initialPassword
|
|
12
|
+
}) {
|
|
13
|
+
const [phase, setPhase] = useState(
|
|
14
|
+
initialUser && initialPassword ? "loading" : "username"
|
|
15
|
+
);
|
|
16
|
+
const [user, setUser] = useState(initialUser ?? "");
|
|
17
|
+
const [password, setPassword] = useState(initialPassword ?? "");
|
|
18
|
+
const [progressMsg, setProgressMsg] = useState("");
|
|
19
|
+
const [result, setResult] = useState(null);
|
|
20
|
+
const [error, setError] = useState("");
|
|
21
|
+
const doLogin = useCallback(async (u, p) => {
|
|
22
|
+
setPhase("loading");
|
|
23
|
+
try {
|
|
24
|
+
const res = await performLogin(u, p, (phase2) => {
|
|
25
|
+
setProgressMsg(phase2);
|
|
26
|
+
});
|
|
27
|
+
setResult(res);
|
|
28
|
+
setPhase("success");
|
|
29
|
+
} catch (err) {
|
|
30
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
31
|
+
setPhase("error");
|
|
32
|
+
}
|
|
33
|
+
}, []);
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
if (initialUser && initialPassword) {
|
|
36
|
+
doLogin(initialUser, initialPassword);
|
|
37
|
+
}
|
|
38
|
+
}, []);
|
|
39
|
+
useInput((input, key) => {
|
|
40
|
+
if (phase === "success" || phase === "error") {
|
|
41
|
+
if (key.escape || key.return) {
|
|
42
|
+
onDone(
|
|
43
|
+
phase === "success" ? `Logged in as ${result?.user}. ${result?.modelsConfigured} models configured.` : void 0
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (phase === "username" || phase === "password") {
|
|
48
|
+
if (key.escape) {
|
|
49
|
+
onDone();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
if (phase === "username") {
|
|
54
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.info, bold: true }, t("commands.login.description")), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, null, t("commands.login.enterUser"), ": "), /* @__PURE__ */ React.createElement(
|
|
55
|
+
TextInput,
|
|
56
|
+
{
|
|
57
|
+
value: user,
|
|
58
|
+
onChange: setUser,
|
|
59
|
+
onSubmit: (val) => {
|
|
60
|
+
if (val.trim()) {
|
|
61
|
+
setUser(val.trim());
|
|
62
|
+
setPhase("password");
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
)), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Esc ", t("common.cancel")));
|
|
67
|
+
}
|
|
68
|
+
if (phase === "password") {
|
|
69
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.info, bold: true }, t("commands.login.description")), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "User: ", user), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, null, t("commands.login.enterPassword"), ": "), /* @__PURE__ */ React.createElement(
|
|
70
|
+
TextInput,
|
|
71
|
+
{
|
|
72
|
+
value: password,
|
|
73
|
+
onChange: setPassword,
|
|
74
|
+
mask: "*",
|
|
75
|
+
onSubmit: (val) => {
|
|
76
|
+
if (val) {
|
|
77
|
+
setPassword(val);
|
|
78
|
+
doLogin(user, val);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
)), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Esc ", t("common.cancel")));
|
|
83
|
+
}
|
|
84
|
+
if (phase === "loading") {
|
|
85
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(SimpleSpinner, null), /* @__PURE__ */ React.createElement(Text, null, " ", progressMsg || t("commands.login.loggingIn"), "...")));
|
|
86
|
+
}
|
|
87
|
+
if (phase === "success" && result) {
|
|
88
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.success }, "\u2713 ", t("commands.login.success")), /* @__PURE__ */ React.createElement(Text, null, " User: ", result.user), /* @__PURE__ */ React.createElement(Text, null, " ", t("commands.login.modelsConfigured"), ": ", result.modelsConfigured), result.modelNames.length > 0 && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginLeft: 2 }, result.modelNames.map((name, i) => /* @__PURE__ */ React.createElement(Box, { key: i }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u2022 ", name)))), result.aiterVoiceConfigured && /* @__PURE__ */ React.createElement(Text, null, " AiTer voice input: configured"), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Enter/Esc ", t("common.continue"))));
|
|
89
|
+
}
|
|
90
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.error }, "\u2717 ", t("commands.login.failed")), /* @__PURE__ */ React.createElement(Text, null, " ", error), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Enter/Esc ", t("common.continue"))));
|
|
91
|
+
}
|
|
92
|
+
const command = {
|
|
93
|
+
name: "login",
|
|
94
|
+
description: t("commands.login.description"),
|
|
95
|
+
isEnabled: true,
|
|
96
|
+
isHidden: false,
|
|
97
|
+
hidePromptInput: true,
|
|
98
|
+
type: "local-jsx",
|
|
99
|
+
userFacingName() {
|
|
100
|
+
return this.name;
|
|
101
|
+
},
|
|
102
|
+
async call(onDone, _context, args) {
|
|
103
|
+
let initialUser;
|
|
104
|
+
let initialPassword;
|
|
105
|
+
if (args) {
|
|
106
|
+
const parts = args.trim().split(/\s+/);
|
|
107
|
+
if (parts.length >= 2) {
|
|
108
|
+
initialUser = parts[0];
|
|
109
|
+
initialPassword = parts.slice(1).join(" ");
|
|
110
|
+
} else if (parts.length === 1 && parts[0]) {
|
|
111
|
+
initialUser = parts[0];
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return /* @__PURE__ */ React.createElement(
|
|
115
|
+
LoginForm,
|
|
116
|
+
{
|
|
117
|
+
onDone,
|
|
118
|
+
initialUser,
|
|
119
|
+
initialPassword
|
|
120
|
+
}
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
var login_default = command;
|
|
125
|
+
export {
|
|
126
|
+
login_default as default
|
|
127
|
+
};
|
|
128
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/commands/login.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * Login Command\n *\n * Dual-entry login for Minto:\n * - REPL: /login \u2014 Interactive Ink form with password masking\n * - CLI: minto login \u2014 Handled by handleLoginCLI in mintoAuth.ts\n *\n * Flow:\n * 1. Username input (TextInput)\n * 2. Password input (TextInput mask=\"*\")\n * 3. Spinner during login + model configuration\n * 4. Result display (success/failure)\n *\n * Supports direct args: /login <user> <password>\n */\n\nimport React, { useState, useEffect, useCallback } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport TextInput from 'ink-text-input'\nimport type { Command } from '@commands'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport { SimpleSpinner } from '@components/Spinner'\nimport { performLogin } from '@services/mintoAuth'\nimport type { LoginResult } from '@services/mintoAuth'\nimport { t } from '@i18n'\n\ntype Phase = 'username' | 'password' | 'loading' | 'success' | 'error'\n\nfunction LoginForm({\n onDone,\n initialUser,\n initialPassword,\n}: {\n onDone: (result?: string) => void\n initialUser?: string\n initialPassword?: string\n}) {\n const [phase, setPhase] = useState<Phase>(\n initialUser && initialPassword ? 'loading' : 'username',\n )\n const [user, setUser] = useState(initialUser ?? '')\n const [password, setPassword] = useState(initialPassword ?? '')\n const [progressMsg, setProgressMsg] = useState('')\n const [result, setResult] = useState<LoginResult | null>(null)\n const [error, setError] = useState('')\n\n const doLogin = useCallback(async (u: string, p: string) => {\n setPhase('loading')\n try {\n const res = await performLogin(u, p, phase => {\n setProgressMsg(phase)\n })\n setResult(res)\n setPhase('success')\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n setPhase('error')\n }\n }, [])\n\n // Auto-login if both args provided\n useEffect(() => {\n if (initialUser && initialPassword) {\n doLogin(initialUser, initialPassword)\n }\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n // Allow Esc to dismiss on success/error\n useInput((input, key) => {\n if (phase === 'success' || phase === 'error') {\n if (key.escape || key.return) {\n onDone(\n phase === 'success'\n ? `Logged in as ${result?.user}. ${result?.modelsConfigured} models configured.`\n : undefined,\n )\n }\n }\n if (phase === 'username' || phase === 'password') {\n if (key.escape) {\n onDone()\n }\n }\n })\n\n if (phase === 'username') {\n return (\n <Box flexDirection=\"column\">\n <Text color={SEMANTIC_COLORS.info} bold>\n {t('commands.login.description')}\n </Text>\n <Box marginTop={1}>\n <Text>{t('commands.login.enterUser')}: </Text>\n <TextInput\n value={user}\n onChange={setUser}\n onSubmit={val => {\n if (val.trim()) {\n setUser(val.trim())\n setPhase('password')\n }\n }}\n />\n </Box>\n <Text dimColor>Esc {t('common.cancel')}</Text>\n </Box>\n )\n }\n\n if (phase === 'password') {\n return (\n <Box flexDirection=\"column\">\n <Text color={SEMANTIC_COLORS.info} bold>\n {t('commands.login.description')}\n </Text>\n <Text dimColor>User: {user}</Text>\n <Box marginTop={1}>\n <Text>{t('commands.login.enterPassword')}: </Text>\n <TextInput\n value={password}\n onChange={setPassword}\n mask=\"*\"\n onSubmit={val => {\n if (val) {\n setPassword(val)\n doLogin(user, val)\n }\n }}\n />\n </Box>\n <Text dimColor>Esc {t('common.cancel')}</Text>\n </Box>\n )\n }\n\n if (phase === 'loading') {\n return (\n <Box flexDirection=\"column\">\n <Box>\n <SimpleSpinner />\n <Text> {progressMsg || t('commands.login.loggingIn')}...</Text>\n </Box>\n </Box>\n )\n }\n\n if (phase === 'success' && result) {\n return (\n <Box flexDirection=\"column\">\n <Text color={SEMANTIC_COLORS.success}>\n \u2713 {t('commands.login.success')}\n </Text>\n <Text> User: {result.user}</Text>\n <Text>\n {' '}\n {t('commands.login.modelsConfigured')}: {result.modelsConfigured}\n </Text>\n {result.modelNames.length > 0 && (\n <Box flexDirection=\"column\" marginLeft={2}>\n {result.modelNames.map((name, i) => (\n <Box key={i}>\n <Text dimColor>\u2022 {name}</Text>\n </Box>\n ))}\n </Box>\n )}\n {result.aiterVoiceConfigured && (\n <Text> AiTer voice input: configured</Text>\n )}\n <Box marginTop={1}>\n <Text dimColor>Enter/Esc {t('common.continue')}</Text>\n </Box>\n </Box>\n )\n }\n\n // phase === 'error'\n return (\n <Box flexDirection=\"column\">\n <Text color={SEMANTIC_COLORS.error}>\u2717 {t('commands.login.failed')}</Text>\n <Text> {error}</Text>\n <Box marginTop={1}>\n <Text dimColor>Enter/Esc {t('common.continue')}</Text>\n </Box>\n </Box>\n )\n}\n\nconst command: Command = {\n name: 'login',\n description: t('commands.login.description'),\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n type: 'local-jsx',\n\n userFacingName() {\n return this.name\n },\n\n async call(onDone, _context, args) {\n let initialUser: string | undefined\n let initialPassword: string | undefined\n\n // Support /login <user> <password>\n if (args) {\n const parts = args.trim().split(/\\s+/)\n if (parts.length >= 2) {\n initialUser = parts[0]\n initialPassword = parts.slice(1).join(' ')\n } else if (parts.length === 1 && parts[0]) {\n initialUser = parts[0]\n }\n }\n\n return (\n <LoginForm\n onDone={onDone}\n initialUser={initialUser}\n initialPassword={initialPassword}\n />\n )\n },\n}\n\nexport default command\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["phase"]
|
|
7
|
+
}
|
package/dist/commands/memory.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import { existsSync, writeFileSync
|
|
2
|
-
import { join
|
|
3
|
-
import {
|
|
1
|
+
import { existsSync, writeFileSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { spawnSync } from "child_process";
|
|
4
4
|
import { platform as osPlatform, userInfo } from "os";
|
|
5
5
|
import * as net from "net";
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
import {
|
|
7
|
+
ensureAutoMemoryDir,
|
|
8
|
+
isAutoMemoryEnabled
|
|
9
|
+
} from "../utils/autoMemoryPaths.js";
|
|
10
|
+
import {
|
|
11
|
+
resolveEditor,
|
|
12
|
+
isTerminalEditor,
|
|
13
|
+
openFileInTerminalEditor
|
|
14
|
+
} from "../utils/externalEditor.js";
|
|
15
|
+
const MEMORY_TEMPLATE = `# Minto Project Memory
|
|
9
16
|
|
|
10
|
-
<!--
|
|
11
|
-
|
|
12
|
-
## Project Overview
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
## Coding Conventions
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
## Important Notes
|
|
17
|
+
<!-- This file persists across conversations. Keep it concise (under 200 lines). -->
|
|
18
|
+
<!-- Create separate topic files (e.g., patterns.md) for detailed notes. -->
|
|
19
19
|
|
|
20
20
|
`;
|
|
21
21
|
function getAiTerSocketPath() {
|
|
@@ -66,47 +66,9 @@ function openInAiTer(filePath) {
|
|
|
66
66
|
});
|
|
67
67
|
});
|
|
68
68
|
}
|
|
69
|
-
const TERMINAL_EDITORS = /^(vi|vim|nvim|nano|emacs|pico|ed|micro|helix|hx|kak)$/i;
|
|
70
|
-
function openInTerminalEditor(editor, filePath) {
|
|
71
|
-
let ttyFd;
|
|
72
|
-
try {
|
|
73
|
-
ttyFd = openSync("/dev/tty", "r");
|
|
74
|
-
} catch {
|
|
75
|
-
ttyFd = void 0;
|
|
76
|
-
}
|
|
77
|
-
if (typeof process.stdin.setRawMode === "function") {
|
|
78
|
-
process.stdin.setRawMode(false);
|
|
79
|
-
}
|
|
80
|
-
process.stdin.pause();
|
|
81
|
-
try {
|
|
82
|
-
const result = spawnSync(editor, [filePath], {
|
|
83
|
-
stdio: [ttyFd ?? "inherit", "inherit", "inherit"],
|
|
84
|
-
shell: false
|
|
85
|
-
});
|
|
86
|
-
if (result.error) {
|
|
87
|
-
throw new Error(`Failed to open editor: ${result.error.message}`);
|
|
88
|
-
}
|
|
89
|
-
} finally {
|
|
90
|
-
if (ttyFd !== void 0) {
|
|
91
|
-
try {
|
|
92
|
-
closeSync(ttyFd);
|
|
93
|
-
} catch {
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
process.stdin.resume();
|
|
97
|
-
if (typeof process.stdin.setRawMode === "function") {
|
|
98
|
-
process.stdin.setRawMode(true);
|
|
99
|
-
}
|
|
100
|
-
process.stdout.emit("resize");
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
function getPlatformDefaultEditor() {
|
|
104
|
-
if (osPlatform() === "win32") return "notepad";
|
|
105
|
-
return "vi";
|
|
106
|
-
}
|
|
107
69
|
const memory = {
|
|
108
70
|
name: "memory",
|
|
109
|
-
description: "Open
|
|
71
|
+
description: "Open auto memory file (MEMORY.md) in your editor",
|
|
110
72
|
isEnabled: true,
|
|
111
73
|
isHidden: false,
|
|
112
74
|
type: "local",
|
|
@@ -114,48 +76,37 @@ const memory = {
|
|
|
114
76
|
return "memory";
|
|
115
77
|
},
|
|
116
78
|
async call() {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
if (!existsSync(filePath)) {
|
|
120
|
-
const agentsPath = join(cwd, "AGENTS.md");
|
|
121
|
-
if (existsSync(agentsPath)) {
|
|
122
|
-
filePath = agentsPath;
|
|
123
|
-
} else {
|
|
124
|
-
const claudePath = join(cwd, "CLAUDE.md");
|
|
125
|
-
if (existsSync(claudePath)) {
|
|
126
|
-
filePath = claudePath;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
79
|
+
if (!isAutoMemoryEnabled()) {
|
|
80
|
+
return "Auto memory is disabled. Enable it with: minto config set autoMemory true";
|
|
129
81
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
writeFileSync(filePath, TEMPLATE, "utf-8");
|
|
82
|
+
const memoryDir = ensureAutoMemoryDir();
|
|
83
|
+
const memoryFile = join(memoryDir, "MEMORY.md");
|
|
84
|
+
if (!existsSync(memoryFile)) {
|
|
85
|
+
writeFileSync(memoryFile, MEMORY_TEMPLATE, "utf-8");
|
|
136
86
|
}
|
|
137
87
|
if (isAiTerRunning()) {
|
|
138
88
|
try {
|
|
139
|
-
const success = await openInAiTer(
|
|
89
|
+
const success = await openInAiTer(memoryFile);
|
|
140
90
|
if (success) {
|
|
141
|
-
return `Opened ${
|
|
91
|
+
return `Opened ${memoryFile} in AiTer editor. Changes will take effect in the next conversation.`;
|
|
142
92
|
}
|
|
143
93
|
} catch {
|
|
144
94
|
}
|
|
145
95
|
}
|
|
146
|
-
const
|
|
147
|
-
const editor = envEditor || getPlatformDefaultEditor();
|
|
148
|
-
const editorBin = editor.split("/").pop() || editor;
|
|
96
|
+
const { bin: editor, name: editorBin } = resolveEditor();
|
|
149
97
|
try {
|
|
150
|
-
if (
|
|
151
|
-
|
|
98
|
+
if (isTerminalEditor(editorBin)) {
|
|
99
|
+
openFileInTerminalEditor(editor, memoryFile);
|
|
152
100
|
} else {
|
|
153
|
-
|
|
101
|
+
spawnSync(editor, [memoryFile], {
|
|
154
102
|
stdio: "ignore",
|
|
155
|
-
timeout: 5e3
|
|
103
|
+
timeout: 5e3,
|
|
104
|
+
shell: false
|
|
156
105
|
});
|
|
157
106
|
}
|
|
158
|
-
return `Opened ${
|
|
107
|
+
return `Opened ${memoryFile} in ${editorBin}. Changes will take effect in the next conversation.
|
|
108
|
+
|
|
109
|
+
Memory directory: ${memoryDir}`;
|
|
159
110
|
} catch (error) {
|
|
160
111
|
return `Failed to open editor (${editorBin}): ${error instanceof Error ? error.message : String(error)}`;
|
|
161
112
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/memory.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * /memory command\n *\n * Opens
|
|
5
|
-
"mappings": "AAcA,SAAS,YAAY,
|
|
4
|
+
"sourcesContent": ["/**\n * /memory command\n *\n * CC-compatible: Opens the per-project auto memory directory for editing.\n * Memory directory: ~/.minto/projects/<project-slug>/memory/\n *\n * Editor selection priority:\n * 1. AiTer (if running) \u2014 best experience, uses AiTer's built-in editor\n * 2. $VISUAL / $EDITOR (if set) \u2014 respects user preference\n * 3. Platform default \u2014 vi (macOS/Linux), notepad (Windows)\n *\n * TTY management for terminal editors is handled by @utils/externalEditor.\n */\n\nimport { existsSync, writeFileSync } from 'fs'\nimport { join } from 'path'\nimport { spawnSync } from 'child_process'\nimport { platform as osPlatform, userInfo } from 'os'\nimport * as net from 'net'\nimport {\n ensureAutoMemoryDir,\n getAutoMemoryDir,\n isAutoMemoryEnabled,\n} from '@utils/autoMemoryPaths'\nimport {\n resolveEditor,\n isTerminalEditor,\n openFileInTerminalEditor,\n} from '@utils/externalEditor'\nimport type { Command } from '../commands'\n\nconst MEMORY_TEMPLATE = `# Minto Project Memory\n\n<!-- This file persists across conversations. Keep it concise (under 200 lines). -->\n<!-- Create separate topic files (e.g., patterns.md) for detailed notes. -->\n\n`\n\n// \u2500\u2500\u2500 AiTer Integration \u2500\u2500\u2500\n\nfunction getAiTerSocketPath(): string {\n if (osPlatform() === 'win32') {\n const username = userInfo().username\n return `\\\\\\\\.\\\\pipe\\\\aiter-${username}`\n }\n const uid = process.getuid?.() ?? userInfo().uid\n return `/tmp/aiter-${uid}.sock`\n}\n\nfunction isAiTerRunning(): boolean {\n const socketPath = getAiTerSocketPath()\n if (osPlatform() !== 'win32' && !existsSync(socketPath)) {\n return false\n }\n return true\n}\n\nfunction openInAiTer(filePath: string): Promise<boolean> {\n return new Promise(resolve => {\n const socketPath = getAiTerSocketPath()\n const request = JSON.stringify({\n command: 'editor',\n action: 'open',\n params: { filePath, mode: 'edit' },\n })\n\n const socket = net.createConnection(socketPath)\n let buffer = ''\n\n const timeout = setTimeout(() => {\n socket.destroy()\n resolve(false)\n }, 3000)\n\n socket.on('connect', () => {\n socket.write(request + '\\n')\n })\n\n socket.on('data', chunk => {\n buffer += chunk.toString()\n try {\n const response = JSON.parse(buffer)\n clearTimeout(timeout)\n socket.end()\n resolve(response.success === true)\n } catch {\n // Incomplete JSON, wait for more data\n }\n })\n\n socket.on('error', () => {\n clearTimeout(timeout)\n resolve(false)\n })\n })\n}\n\n// \u2500\u2500\u2500 Command Implementation \u2500\u2500\u2500\n\nconst memory: Command = {\n name: 'memory',\n description: 'Open auto memory file (MEMORY.md) in your editor',\n isEnabled: true,\n isHidden: false,\n type: 'local',\n userFacingName() {\n return 'memory'\n },\n async call() {\n if (!isAutoMemoryEnabled()) {\n return 'Auto memory is disabled. Enable it with: minto config set autoMemory true'\n }\n\n // Ensure the per-project memory directory exists\n const memoryDir = ensureAutoMemoryDir()\n const memoryFile = join(memoryDir, 'MEMORY.md')\n\n // Create MEMORY.md with template if it doesn't exist\n if (!existsSync(memoryFile)) {\n writeFileSync(memoryFile, MEMORY_TEMPLATE, 'utf-8')\n }\n\n // Strategy 1: Try AiTer first\n if (isAiTerRunning()) {\n try {\n const success = await openInAiTer(memoryFile)\n if (success) {\n return `Opened ${memoryFile} in AiTer editor. Changes will take effect in the next conversation.`\n }\n } catch {\n // AiTer failed, fall through\n }\n }\n\n // Strategy 2: Use $VISUAL or $EDITOR via shared utility\n const { bin: editor, name: editorBin } = resolveEditor()\n\n try {\n if (isTerminalEditor(editorBin)) {\n openFileInTerminalEditor(editor, memoryFile)\n } else {\n // GUI editor \u2014 non-blocking exec\n spawnSync(editor, [memoryFile], {\n stdio: 'ignore',\n timeout: 5000,\n shell: false,\n })\n }\n return `Opened ${memoryFile} in ${editorBin}. Changes will take effect in the next conversation.\\n\\nMemory directory: ${memoryDir}`\n } catch (error) {\n return `Failed to open editor (${editorBin}): ${error instanceof Error ? error.message : String(error)}`\n }\n },\n}\n\nexport default memory\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/commands/quit.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { setTerminalTitle } from "../utils/terminal.js";
|
|
2
|
+
import { gracefulExit } from "../utils/exit.js";
|
|
2
3
|
const quit = {
|
|
3
4
|
name: "quit",
|
|
4
5
|
description: "Exit Minto",
|
|
@@ -9,7 +10,8 @@ const quit = {
|
|
|
9
10
|
userFacingName: () => "quit",
|
|
10
11
|
async call(args, context) {
|
|
11
12
|
setTerminalTitle("");
|
|
12
|
-
|
|
13
|
+
await gracefulExit(0);
|
|
14
|
+
return "";
|
|
13
15
|
}
|
|
14
16
|
};
|
|
15
17
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/quit.tsx"],
|
|
4
|
-
"sourcesContent": ["import type { Command } from '../commands'\nimport { setTerminalTitle } from '@utils/terminal'\n\n/**\n * /quit slash command\n *\n *
|
|
5
|
-
"mappings": "AACA,SAAS,wBAAwB;
|
|
4
|
+
"sourcesContent": ["import type { Command } from '../commands'\nimport { setTerminalTitle } from '@utils/terminal'\nimport { gracefulExit } from '@utils/exit'\n\n/**\n * /quit slash command\n *\n * Clear terminal title and exit gracefully.\n * gracefulExit() shuts down MCP clients, kills child processes,\n * then calls process.exit(). Cost summary is printed by useCostSummary's\n * signal-exit handler.\n */\nexport const quit: Command = {\n name: 'quit',\n description: 'Exit Minto',\n aliases: ['exit', 'q'],\n isEnabled: true,\n isHidden: false,\n type: 'local',\n userFacingName: () => 'quit',\n async call(args, context) {\n setTerminalTitle('')\n await gracefulExit(0)\n return '' // unreachable \u2014 gracefulExit calls process.exit()\n },\n}\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,wBAAwB;AACjC,SAAS,oBAAoB;AAUtB,MAAM,OAAgB;AAAA,EAC3B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS,CAAC,QAAQ,GAAG;AAAA,EACrB,WAAW;AAAA,EACX,UAAU;AAAA,EACV,MAAM;AAAA,EACN,gBAAgB,MAAM;AAAA,EACtB,MAAM,KAAK,MAAM,SAAS;AACxB,qBAAiB,EAAE;AACnB,UAAM,aAAa,CAAC;AACpB,WAAO;AAAA,EACT;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|